resolve merge conflicts of 8b6704c to stage-aosp-master am: 8ca27b1e87
am: 0d2fe6279a

Change-Id: I921ee6ed6a583c5b0c466f87c848f08f76b4c45f
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..ea72388
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,3 @@
+.cproject
+.project
+.settings
diff --git a/Android.bp b/Android.bp
index 088b1c5..2c0ab27 100644
--- a/Android.bp
+++ b/Android.bp
@@ -1,56 +1,66 @@
 
+
+libpcre2_dist_prefix = "dist2"
+
+libpcre2_src_files = [
+    libpcre2_dist_prefix + "/src/pcre2_auto_possess.c",
+    libpcre2_dist_prefix + "/src/pcre2_compile.c",
+    libpcre2_dist_prefix + "/src/pcre2_config.c",
+    libpcre2_dist_prefix + "/src/pcre2_context.c",
+    libpcre2_dist_prefix + "/src/pcre2_dfa_match.c",
+    libpcre2_dist_prefix + "/src/pcre2_error.c",
+    libpcre2_dist_prefix + "/src/pcre2_find_bracket.c",
+    libpcre2_dist_prefix + "/src/pcre2_maketables.c",
+    libpcre2_dist_prefix + "/src/pcre2_match.c",
+    libpcre2_dist_prefix + "/src/pcre2_match_data.c",
+    libpcre2_dist_prefix + "/src/pcre2_jit_compile.c",
+    libpcre2_dist_prefix + "/src/pcre2_newline.c",
+    libpcre2_dist_prefix + "/src/pcre2_ord2utf.c",
+    libpcre2_dist_prefix + "/src/pcre2_pattern_info.c",
+    libpcre2_dist_prefix + "/src/pcre2_serialize.c",
+    libpcre2_dist_prefix + "/src/pcre2_string_utils.c",
+    libpcre2_dist_prefix + "/src/pcre2_study.c",
+    libpcre2_dist_prefix + "/src/pcre2_substitute.c",
+    libpcre2_dist_prefix + "/src/pcre2_substring.c",
+    libpcre2_dist_prefix + "/src/pcre2_tables.c",
+    libpcre2_dist_prefix + "/src/pcre2_ucd.c",
+    libpcre2_dist_prefix + "/src/pcre2_valid_utf.c",
+    libpcre2_dist_prefix + "/src/pcre2_xclass.c",
+    libpcre2_dist_prefix + "/src/pcre2_chartables.c",
+]
+
 cc_defaults {
     name: "pcre_defaults",
-    cflags: [
-        "-DHAVE_CONFIG_H",
-        "-Wno-self-assign",
-        "-Wno-unused-parameter",
+    cflags: ["-DHAVE_CONFIG_H"],
+    local_include_dirs: [
+        "include_internal",
+        "include",
     ],
-    local_include_dirs: ["dist"],
-    export_include_dirs: ["."],
+    export_include_dirs: ["include"],
 }
 
 // === libpcre targets ===
 
 cc_library {
-    name: "libpcre",
+    name: "libpcre2",
     defaults: ["pcre_defaults"],
     host_supported: true,
-    srcs: [
-        "pcre_chartables.c",
-        "dist/pcre_byte_order.c",
-        "dist/pcre_compile.c",
-        "dist/pcre_config.c",
-        "dist/pcre_dfa_exec.c",
-        "dist/pcre_exec.c",
-        "dist/pcre_fullinfo.c",
-        "dist/pcre_get.c",
-        "dist/pcre_globals.c",
-        "dist/pcre_jit_compile.c",
-        "dist/pcre_maketables.c",
-        "dist/pcre_newline.c",
-        "dist/pcre_ord2utf8.c",
-        "dist/pcre_refcount.c",
-        "dist/pcre_string_utils.c",
-        "dist/pcre_study.c",
-        "dist/pcre_tables.c",
-        "dist/pcre_ucd.c",
-        "dist/pcre_valid_utf8.c",
-        "dist/pcre_version.c",
-        "dist/pcre_xclass.c",
-    ],
+    srcs: libpcre2_src_files,
 }
 
 // === libpcrecpp targets ===
 
 cc_library_shared {
     name: "libpcrecpp",
-    defaults: ["pcre_defaults"],
-
-    srcs: [
-        "dist/pcrecpp.cc",
-        "dist/pcre_scanner.cc",
-        "dist/pcre_stringpiece.cc",
+    local_include_dirs: ["pcrecpp/include"],
+    shared_libs: ["libpcre2"],
+    export_include_dirs: [
+        "pcrecpp/include",
+        "include",
     ],
-    shared_libs: ["libpcre"],
+    srcs: [
+	"pcrecpp/pcrecpp.cc",
+        "pcrecpp/pcre_scanner.cc",
+        "pcrecpp/pcre_stringpiece.cc",
+    ],
 }
diff --git a/README.version b/README.version
index 56adf34..1480eea 100644
--- a/README.version
+++ b/README.version
@@ -1,3 +1,2 @@
-URL: http://sourceforge.net/projects/pcre/files/pcre/8.36/pcre-8.36.tar.bz2/download
-Version: 8.36
-BugComponent: 24950
+URL: ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre2-10.21.tar.gz
+Version: 10.21
diff --git a/config.h b/config.h
deleted file mode 100644
index f7a6817..0000000
--- a/config.h
+++ /dev/null
@@ -1,348 +0,0 @@
-/* config.h.  Generated from config.h.in by configure.  */
-/* config.h.in.  Generated from configure.ac by autoheader.  */
-
-
-/* PCRE is written in Standard C, but there are a few non-standard things it
-can cope with, allowing it to run on SunOS4 and other "close to standard"
-systems.
-
-In environments that support the GNU autotools, config.h.in is converted into
-config.h by the "configure" script. In environments that use CMake,
-config-cmake.in is converted into config.h. If you are going to build PCRE "by
-hand" without using "configure" or CMake, you should copy the distributed
-config.h.generic to config.h, and edit the macro definitions to be the way you
-need them. You must then add -DHAVE_CONFIG_H to all of your compile commands,
-so that config.h is included at the start of every source.
-
-Alternatively, you can avoid editing by using -D on the compiler command line
-to set the macro values. In this case, you do not have to set -DHAVE_CONFIG_H,
-but if you do, default values will be taken from config.h for non-boolean
-macros that are not defined on the command line.
-
-Boolean macros such as HAVE_STDLIB_H and SUPPORT_PCRE8 should either be defined
-(conventionally to 1) for TRUE, and not defined at all for FALSE. All such
-macros are listed as a commented #undef in config.h.generic. Macros such as
-MATCH_LIMIT, whose actual value is relevant, have defaults defined, but are
-surrounded by #ifndef/#endif lines so that the value can be overridden by -D.
-
-PCRE uses memmove() if HAVE_MEMMOVE is defined; otherwise it uses bcopy() if
-HAVE_BCOPY is defined. If your system has neither bcopy() nor memmove(), make
-sure both macros are undefined; an emulation function will then be used. */
-
-/* By default, the \R escape sequence matches any Unicode line ending
-   character or sequence of characters. If BSR_ANYCRLF is defined (to any
-   value), this is changed so that backslash-R matches only CR, LF, or CRLF.
-   The build-time default can be overridden by the user of PCRE at runtime. */
-/* #undef BSR_ANYCRLF */
-
-/* If you are compiling for a system that uses EBCDIC instead of ASCII
-   character codes, define this macro to any value. You must also edit the
-   NEWLINE macro below to set a suitable EBCDIC newline, commonly 21 (0x15).
-   On systems that can use "configure" or CMake to set EBCDIC, NEWLINE is
-   automatically adjusted. When EBCDIC is set, PCRE assumes that all input
-   strings are in EBCDIC. If you do not define this macro, PCRE will assume
-   input strings are ASCII or UTF-8/16/32 Unicode. It is not possible to build
-   a version of PCRE that supports both EBCDIC and UTF-8/16/32. */
-/* #undef EBCDIC */
-
-/* In an EBCDIC environment, define this macro to any value to arrange for the
-   NL character to be 0x25 instead of the default 0x15. NL plays the role that
-   LF does in an ASCII/Unicode environment. The value must also be set in the
-   NEWLINE macro below. On systems that can use "configure" or CMake to set
-   EBCDIC_NL25, the adjustment of NEWLINE is automatic. */
-/* #undef EBCDIC_NL25 */
-
-/* Define to 1 if you have the `bcopy' function. */
-#define HAVE_BCOPY 1
-
-/* Define to 1 if you have the <bits/type_traits.h> header file. */
-/* #undef HAVE_BITS_TYPE_TRAITS_H */
-
-/* Define to 1 if you have the <bzlib.h> header file. */
-/* #undef HAVE_BZLIB_H */
-
-/* Define to 1 if you have the <dirent.h> header file. */
-#define HAVE_DIRENT_H 1
-
-/* Define to 1 if you have the <dlfcn.h> header file. */
-#define HAVE_DLFCN_H 1
-
-/* Define to 1 if you have the <editline/readline.h> header file. */
-/* #undef HAVE_EDITLINE_READLINE_H */
-
-/* Define to 1 if you have the <edit/readline/readline.h> header file. */
-/* #undef HAVE_EDIT_READLINE_READLINE_H */
-
-/* Define to 1 if you have the <inttypes.h> header file. */
-#define HAVE_INTTYPES_H 1
-
-/* Define to 1 if you have the <limits.h> header file. */
-#define HAVE_LIMITS_H 1
-
-/* Define to 1 if the system has the type `long long'. */
-#define HAVE_LONG_LONG 1
-
-/* Define to 1 if you have the `memmove' function. */
-#define HAVE_MEMMOVE 1
-
-/* Define to 1 if you have the <memory.h> header file. */
-#define HAVE_MEMORY_H 1
-
-/* Define if you have POSIX threads libraries and header files. */
-/* #undef HAVE_PTHREAD */
-
-/* Have PTHREAD_PRIO_INHERIT. */
-/* #undef HAVE_PTHREAD_PRIO_INHERIT */
-
-/* Define to 1 if you have the <readline/history.h> header file. */
-/* #undef HAVE_READLINE_HISTORY_H */
-
-/* Define to 1 if you have the <readline/readline.h> header file. */
-/* #undef HAVE_READLINE_READLINE_H */
-
-/* Define to 1 if you have the <stdint.h> header file. */
-#define HAVE_STDINT_H 1
-
-/* Define to 1 if you have the <stdlib.h> header file. */
-#define HAVE_STDLIB_H 1
-
-/* Define to 1 if you have the `strerror' function. */
-#define HAVE_STRERROR 1
-
-/* Define to 1 if you have the <string> header file. */
-#define HAVE_STRING 1
-
-/* Define to 1 if you have the <strings.h> header file. */
-#define HAVE_STRINGS_H 1
-
-/* Define to 1 if you have the <string.h> header file. */
-#define HAVE_STRING_H 1
-
-/* Define to 1 if you have `strtoimax'. */
-/* #undef HAVE_STRTOIMAX */
-
-/* Define to 1 if you have `strtoll'. */
-#define HAVE_STRTOLL 1
-
-/* Define to 1 if you have `strtoq'. */
-/* #undef HAVE_STRTOQ */
-
-/* Define to 1 if you have the <sys/stat.h> header file. */
-#define HAVE_SYS_STAT_H 1
-
-/* Define to 1 if you have the <sys/types.h> header file. */
-#define HAVE_SYS_TYPES_H 1
-
-/* Define to 1 if you have the <type_traits.h> header file. */
-/* #undef HAVE_TYPE_TRAITS_H */
-
-/* Define to 1 if you have the <unistd.h> header file. */
-#define HAVE_UNISTD_H 1
-
-/* Define to 1 if the system has the type `unsigned long long'. */
-#define HAVE_UNSIGNED_LONG_LONG 1
-
-/* Define to 1 if the compiler supports simple visibility declarations. */
-#define HAVE_VISIBILITY 1
-
-/* Define to 1 if you have the <windows.h> header file. */
-/* #undef HAVE_WINDOWS_H */
-
-/* Define to 1 if you have the <zlib.h> header file. */
-#define HAVE_ZLIB_H 1
-
-/* Define to 1 if you have `_strtoi64'. */
-/* #undef HAVE__STRTOI64 */
-
-/* The value of LINK_SIZE determines the number of bytes used to store links
-   as offsets within the compiled regex. The default is 2, which allows for
-   compiled patterns up to 64K long. This covers the vast majority of cases.
-   However, PCRE can also be compiled to use 3 or 4 bytes instead. This allows
-   for longer patterns in extreme cases. */
-#define LINK_SIZE 2
-
-/* Define to the sub-directory where libtool stores uninstalled libraries. */
-#define LT_OBJDIR ".libs/"
-
-/* The value of MATCH_LIMIT determines the default number of times the
-   internal match() function can be called during a single execution of
-   pcre_exec(). There is a runtime interface for setting a different limit.
-   The limit exists in order to catch runaway regular expressions that take
-   for ever to determine that they do not match. The default is set very large
-   so that it does not accidentally catch legitimate cases. */
-#define MATCH_LIMIT 10000000
-
-/* The above limit applies to all calls of match(), whether or not they
-   increase the recursion depth. In some environments it is desirable to limit
-   the depth of recursive calls of match() more strictly, in order to restrict
-   the maximum amount of stack (or heap, if NO_RECURSE is defined) that is
-   used. The value of MATCH_LIMIT_RECURSION applies only to recursive calls of
-   match(). To have any useful effect, it must be less than the value of
-   MATCH_LIMIT. The default is to use the same value as MATCH_LIMIT. There is
-   a runtime method for setting a different limit. */
-#define MATCH_LIMIT_RECURSION MATCH_LIMIT
-
-/* This limit is parameterized just in case anybody ever wants to change it.
-   Care must be taken if it is increased, because it guards against integer
-   overflow caused by enormously large patterns. */
-#define MAX_NAME_COUNT 10000
-
-/* This limit is parameterized just in case anybody ever wants to change it.
-   Care must be taken if it is increased, because it guards against integer
-   overflow caused by enormously large patterns. */
-#define MAX_NAME_SIZE 32
-
-/* The value of NEWLINE determines the default newline character sequence.
-   PCRE client programs can override this by selecting other values at run
-   time. In ASCII environments, the value can be 10 (LF), 13 (CR), or 3338
-   (CRLF); in EBCDIC environments the value can be 21 or 37 (LF), 13 (CR), or
-   3349 or 3365 (CRLF) because there are two alternative codepoints (0x15 and
-   0x25) that are used as the NL line terminator that is equivalent to ASCII
-   LF. In both ASCII and EBCDIC environments the value can also be -1 (ANY),
-   or -2 (ANYCRLF). */
-#define NEWLINE 10
-
-/* PCRE uses recursive function calls to handle backtracking while matching.
-   This can sometimes be a problem on systems that have stacks of limited
-   size. Define NO_RECURSE to any value to get a version that doesn't use
-   recursion in the match() function; instead it creates its own stack by
-   steam using pcre_recurse_malloc() to obtain memory from the heap. For more
-   detail, see the comments and other stuff just above the match() function.
-   */
-/* #undef NO_RECURSE */
-
-/* Name of package */
-#define PACKAGE "pcre"
-
-/* Define to the address where bug reports for this package should be sent. */
-#define PACKAGE_BUGREPORT ""
-
-/* Define to the full name of this package. */
-#define PACKAGE_NAME "PCRE"
-
-/* Define to the full name and version of this package. */
-#define PACKAGE_STRING "PCRE 8.38"
-
-/* Define to the one symbol short name of this package. */
-#define PACKAGE_TARNAME "pcre"
-
-/* Define to the home page for this package. */
-#define PACKAGE_URL ""
-
-/* Define to the version of this package. */
-#define PACKAGE_VERSION "8.38"
-
-/* The value of PARENS_NEST_LIMIT specifies the maximum depth of nested
-   parentheses (of any kind) in a pattern. This limits the amount of system
-   stack that is used while compiling a pattern. */
-#define PARENS_NEST_LIMIT 250
-
-/* to make a symbol visible */
-#define PCRECPP_EXP_DECL extern __attribute__ ((visibility ("default")))
-
-/* to make a symbol visible */
-#define PCRECPP_EXP_DEFN __attribute__ ((visibility ("default")))
-
-/* The value of PCREGREP_BUFSIZE determines the size of buffer used by
-   pcregrep to hold parts of the file it is searching. This is also the
-   minimum value. The actual amount of memory used by pcregrep is three times
-   this number, because it allows for the buffering of "before" and "after"
-   lines. */
-#define PCREGREP_BUFSIZE 20480
-
-/* to make a symbol visible */
-#define PCREPOSIX_EXP_DECL extern __attribute__ ((visibility ("default")))
-
-/* to make a symbol visible */
-#define PCREPOSIX_EXP_DEFN extern __attribute__ ((visibility ("default")))
-
-/* to make a symbol visible */
-#define PCRE_EXP_DATA_DEFN __attribute__ ((visibility ("default")))
-
-/* to make a symbol visible */
-#define PCRE_EXP_DECL extern __attribute__ ((visibility ("default")))
-
-
-/* If you are compiling for a system other than a Unix-like system or
-   Win32, and it needs some magic to be inserted before the definition
-   of a function that is exported by the library, define this macro to
-   contain the relevant magic. If you do not define this macro, a suitable
-    __declspec value is used for Windows systems; in other environments
-   "extern" is used for a C compiler and "extern C" for a C++ compiler.
-   This macro apears at the start of every exported function that is part
-   of the external API. It does not appear on functions that are "external"
-   in the C sense, but which are internal to the library. */
-#define PCRE_EXP_DEFN __attribute__ ((visibility ("default")))
-
-/* Define to any value if linking statically (TODO: make nice with Libtool) */
-/* #undef PCRE_STATIC */
-
-/* When calling PCRE via the POSIX interface, additional working storage is
-   required for holding the pointers to capturing substrings because PCRE
-   requires three integers per substring, whereas the POSIX interface provides
-   only two. If the number of expected substrings is small, the wrapper
-   function uses space on the stack, because this is faster than using
-   malloc() for each call. The threshold above which the stack is no longer
-   used is defined by POSIX_MALLOC_THRESHOLD. */
-#define POSIX_MALLOC_THRESHOLD 10
-
-/* Define to necessary symbol if this constant uses a non-standard name on
-   your system. */
-/* #undef PTHREAD_CREATE_JOINABLE */
-
-/* Define to 1 if you have the ANSI C header files. */
-#define STDC_HEADERS 1
-
-/* Define to any value to enable support for Just-In-Time compiling. */
-/* #undef SUPPORT_JIT */
-
-/* Define to any value to allow pcregrep to be linked with libbz2, so that it
-   is able to handle .bz2 files. */
-/* #undef SUPPORT_LIBBZ2 */
-
-/* Define to any value to allow pcretest to be linked with libedit. */
-/* #undef SUPPORT_LIBEDIT */
-
-/* Define to any value to allow pcretest to be linked with libreadline. */
-/* #undef SUPPORT_LIBREADLINE */
-
-/* Define to any value to allow pcregrep to be linked with libz, so that it is
-   able to handle .gz files. */
-/* #undef SUPPORT_LIBZ */
-
-/* Define to any value to enable the 16 bit PCRE library. */
-/* #undef SUPPORT_PCRE16 */
-
-/* Define to any value to enable the 32 bit PCRE library. */
-/* #undef SUPPORT_PCRE32 */
-
-/* Define to any value to enable the 8 bit PCRE library. */
-#define SUPPORT_PCRE8 /**/
-
-/* Define to any value to enable JIT support in pcregrep. */
-/* #undef SUPPORT_PCREGREP_JIT */
-
-/* Define to any value to enable support for Unicode properties. */
-/* #undef SUPPORT_UCP */
-
-/* Define to any value to enable support for the UTF-8/16/32 Unicode encoding.
-   This will work even in an EBCDIC environment, but it is incompatible with
-   the EBCDIC macro. That is, PCRE can support *either* EBCDIC code *or*
-   ASCII/UTF-8/16/32, but not both at once. */
-/* #undef SUPPORT_UTF */
-
-/* Define to any value for valgrind support to find invalid memory reads. */
-/* #undef SUPPORT_VALGRIND */
-
-/* Version number of package */
-#define VERSION "8.38"
-
-/* Define to empty if `const' does not conform to ANSI C. */
-/* #undef const */
-
-/* Define to the type of a signed integer type of width exactly 64 bits if
-   such a type exists and the standard includes do not define it. */
-/* #undef int64_t */
-
-/* Define to `unsigned int' if <sys/types.h> does not define. */
-/* #undef size_t */
diff --git a/dist/AUTHORS b/dist/AUTHORS
deleted file mode 100644
index d33723f..0000000
--- a/dist/AUTHORS
+++ /dev/null
@@ -1,45 +0,0 @@
-THE MAIN PCRE LIBRARY
----------------------
-
-Written by:       Philip Hazel
-Email local part: ph10
-Email domain:     cam.ac.uk
-
-University of Cambridge Computing Service,
-Cambridge, England.
-
-Copyright (c) 1997-2015 University of Cambridge
-All rights reserved
-
-
-PCRE JUST-IN-TIME COMPILATION SUPPORT
--------------------------------------
-
-Written by:       Zoltan Herczeg
-Email local part: hzmester
-Emain domain:     freemail.hu
-
-Copyright(c) 2010-2015 Zoltan Herczeg
-All rights reserved.
-
-
-STACK-LESS JUST-IN-TIME COMPILER
---------------------------------
-
-Written by:       Zoltan Herczeg
-Email local part: hzmester
-Emain domain:     freemail.hu
-
-Copyright(c) 2009-2015 Zoltan Herczeg
-All rights reserved.
-
-
-THE C++ WRAPPER LIBRARY
------------------------
-
-Written by:       Google Inc.
-
-Copyright (c) 2007-2012 Google Inc
-All rights reserved
-
-####
diff --git a/dist/CMakeLists.txt b/dist/CMakeLists.txt
deleted file mode 100644
index 846241d..0000000
--- a/dist/CMakeLists.txt
+++ /dev/null
@@ -1,991 +0,0 @@
-# CMakeLists.txt
-#
-#
-# This file allows building PCRE with the CMake configuration and build
-# tool. Download CMake in source or binary form from http://www.cmake.org/
-#
-# Original listfile by Christian Ehrlicher <Ch.Ehrlicher@gmx.de>
-# Refined and expanded by Daniel Richard G. <skunk@iSKUNK.ORG>
-# 2007-09-14 mod by Sheri so 7.4 supported configuration options can be entered
-# 2007-09-19 Adjusted by PH to retain previous default settings
-# 2007-12-26 (a) On UNIX, use names libpcre instead of just pcre
-#            (b) Ensure pcretest and pcregrep link with the local library,
-#                not a previously-installed one.
-#            (c) Add PCRE_SUPPORT_LIBREADLINE, PCRE_SUPPORT_LIBZ, and
-#                PCRE_SUPPORT_LIBBZ2.
-# 2008-01-20 Brought up to date to include several new features by Christian
-#            Ehrlicher.
-# 2008-01-22 Sheri added options for backward compatibility of library names
-#            when building with minGW:
-#            if "ON", NON_STANDARD_LIB_PREFIX causes shared libraries to
-#            be built without "lib" as prefix. (The libraries will be named
-#            pcre.dll, pcreposix.dll and pcrecpp.dll).
-#            if "ON", NON_STANDARD_LIB_SUFFIX causes shared libraries to
-#            be built with suffix of "-0.dll". (The libraries will be named
-#            libpcre-0.dll, libpcreposix-0.dll and libpcrecpp-0.dll - same names
-#            built by default with Configure and Make.
-# 2008-01-23 PH removed the automatic build of pcredemo.
-# 2008-04-22 PH modified READLINE support so it finds NCURSES when needed.
-# 2008-07-03 PH updated for revised UCP property support (change of files)
-# 2009-03-23 PH applied Steven Van Ingelgem's patch to change the name
-#            CMAKE_BINARY_DIR to PROJECT_BINARY_DIR so that it works when PCRE
-#            is included within another project.
-# 2009-03-23 PH applied a modified version of Steven Van Ingelgem's patches to
-#            add options to stop the building of pcregrep and the tests, and
-#            to disable the final configuration report.
-# 2009-04-11 PH applied Christian Ehrlicher's patch to show compiler flags that
-#            are set by specifying a release type.
-# 2010-01-02 PH added test for stdint.h
-# 2010-03-02 PH added test for inttypes.h
-# 2011-08-01 PH added PCREGREP_BUFSIZE
-# 2011-08-22 PH added PCRE_SUPPORT_JIT
-# 2011-09-06 PH modified WIN32 ADD_TEST line as suggested by Sergey Cherepanov
-# 2011-09-06 PH added PCRE_SUPPORT_PCREGREP_JIT
-# 2011-10-04 Sheri added support for including coff data in windows shared libraries
-#            compiled with MINGW if pcre.rc and/or pcreposix.rc are placed in
-#            the source dir by the user prior to building
-# 2011-10-04 Sheri changed various add_test's to use exes' location built instead
-#            of DEBUG location only (likely only matters in MSVC)
-# 2011-10-04 Sheri added scripts to provide needed variables to RunTest and
-#            RunGrepTest (used for UNIX and Msys)
-# 2011-10-04 Sheri added scripts to provide needed variables and to execute
-#            RunTest.bat in Win32 (for effortless testing with "make test")
-# 2011-10-04 Sheri Increased minimum required cmake version
-# 2012-01-06 PH removed pcre_info.c and added pcre_string_utils.c
-# 2012-01-10 Zoltan Herczeg added libpcre16 support
-# 2012-01-13 Stephen Kelly added out of source build support
-# 2012-01-17 PH applied Stephen Kelly's patch to parse the version data out
-#            of the configure.ac file
-# 2012-02-26 PH added support for libedit
-# 2012-09-06 PH added support for PCRE_EBCDIC_NL25
-# 2012-09-08 ChPe added PCRE32 support
-# 2012-10-23 PH added support for VALGRIND and GCOV
-# 2012-12-08 PH added patch from Daniel Richard G to quash some MSVC warnings
-# 2013-07-01 PH realized that the "support" for GCOV was a total nonsense and
-#            so it has been removed.
-# 2013-10-08 PH got rid of the "source" command, which is a bash-ism (use ".")
-# 2013-11-05 PH added support for PARENS_NEST_LIMIT
-
-PROJECT(PCRE C CXX)
-
-# Increased minimum to 2.8.0 to support newer add_test features
-
-CMAKE_MINIMUM_REQUIRED(VERSION 2.8.0)
-
-SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake) # for FindReadline.cmake
-
-# external packages
-FIND_PACKAGE( BZip2 )
-FIND_PACKAGE( ZLIB )
-FIND_PACKAGE( Readline )
-FIND_PACKAGE( Editline )
-
-# Configuration checks
-
-INCLUDE(CheckIncludeFile)
-INCLUDE(CheckIncludeFileCXX)
-INCLUDE(CheckFunctionExists)
-INCLUDE(CheckTypeSize)
-
-CHECK_INCLUDE_FILE(dirent.h     HAVE_DIRENT_H)
-CHECK_INCLUDE_FILE(stdint.h     HAVE_STDINT_H)
-CHECK_INCLUDE_FILE(inttypes.h   HAVE_INTTYPES_H)
-CHECK_INCLUDE_FILE(sys/stat.h   HAVE_SYS_STAT_H)
-CHECK_INCLUDE_FILE(sys/types.h  HAVE_SYS_TYPES_H)
-CHECK_INCLUDE_FILE(unistd.h     HAVE_UNISTD_H)
-CHECK_INCLUDE_FILE(windows.h    HAVE_WINDOWS_H)
-
-CHECK_INCLUDE_FILE_CXX(type_traits.h            HAVE_TYPE_TRAITS_H)
-CHECK_INCLUDE_FILE_CXX(bits/type_traits.h       HAVE_BITS_TYPE_TRAITS_H)
-
-CHECK_FUNCTION_EXISTS(bcopy     HAVE_BCOPY)
-CHECK_FUNCTION_EXISTS(memmove   HAVE_MEMMOVE)
-CHECK_FUNCTION_EXISTS(strerror  HAVE_STRERROR)
-CHECK_FUNCTION_EXISTS(strtoll   HAVE_STRTOLL)
-CHECK_FUNCTION_EXISTS(strtoq    HAVE_STRTOQ)
-CHECK_FUNCTION_EXISTS(_strtoi64 HAVE__STRTOI64)
-
-CHECK_TYPE_SIZE("long long"             LONG_LONG)
-CHECK_TYPE_SIZE("unsigned long long"    UNSIGNED_LONG_LONG)
-
-# User-configurable options
-#
-# (Note: CMakeSetup displays these in alphabetical order, regardless of
-# the order we use here)
-
-SET(BUILD_SHARED_LIBS OFF CACHE BOOL
-    "Build shared libraries instead of static ones.")
-
-OPTION(PCRE_BUILD_PCRE8 "Build 8 bit PCRE library" ON)
-
-OPTION(PCRE_BUILD_PCRE16 "Build 16 bit PCRE library" OFF)
-
-OPTION(PCRE_BUILD_PCRE32 "Build 32 bit PCRE library" OFF)
-
-OPTION(PCRE_BUILD_PCRECPP "Build the PCRE C++ library (pcrecpp)." ON)
-
-SET(PCRE_EBCDIC OFF CACHE BOOL
-    "Use EBCDIC coding instead of ASCII. (This is rarely used outside of mainframe systems.)")
-
-SET(PCRE_EBCDIC_NL25 OFF CACHE BOOL
-    "Use 0x25 as EBCDIC NL character instead of 0x15; implies EBCDIC.")
-
-SET(PCRE_LINK_SIZE "2" CACHE STRING
-    "Internal link size (2, 3 or 4 allowed). See LINK_SIZE in config.h.in for details.")
-
-SET(PCRE_PARENS_NEST_LIMIT "250" CACHE STRING
-    "Default nested parentheses limit. See PARENS_NEST_LIMIT in config.h.in for details.")
-
-SET(PCRE_MATCH_LIMIT "10000000" CACHE STRING
-    "Default limit on internal looping. See MATCH_LIMIT in config.h.in for details.")
-
-SET(PCRE_MATCH_LIMIT_RECURSION "MATCH_LIMIT" CACHE STRING
-    "Default limit on internal recursion. See MATCH_LIMIT_RECURSION in config.h.in for details.")
-
-SET(PCREGREP_BUFSIZE "20480" CACHE STRING
-    "Buffer size parameter for pcregrep. See PCREGREP_BUFSIZE in config.h.in for details.")
-
-SET(PCRE_NEWLINE "LF" CACHE STRING
-    "What to recognize as a newline (one of CR, LF, CRLF, ANY, ANYCRLF).")
-
-SET(PCRE_NO_RECURSE OFF CACHE BOOL
-    "If ON, then don't use stack recursion when matching. See NO_RECURSE in config.h.in for details.")
-
-SET(PCRE_POSIX_MALLOC_THRESHOLD "10" CACHE STRING
-    "Threshold for malloc() usage. See POSIX_MALLOC_THRESHOLD in config.h.in for details.")
-
-SET(PCRE_SUPPORT_JIT OFF CACHE BOOL
-    "Enable support for Just-in-time compiling.")
-
-SET(PCRE_SUPPORT_PCREGREP_JIT ON CACHE BOOL
-    "Enable use of Just-in-time compiling in pcregrep.")
-
-SET(PCRE_SUPPORT_UTF OFF CACHE BOOL
-    "Enable support for Unicode Transformation Format (UTF-8/UTF-16/UTF-32) encoding.")
-
-SET(PCRE_SUPPORT_UNICODE_PROPERTIES OFF CACHE BOOL
-    "Enable support for Unicode properties (if set, UTF support will be enabled as well).")
-
-SET(PCRE_SUPPORT_BSR_ANYCRLF OFF CACHE BOOL
-    "ON=Backslash-R matches only LF CR and CRLF, OFF=Backslash-R matches all Unicode Linebreaks")
-
-SET(PCRE_SUPPORT_VALGRIND OFF CACHE BOOL
-    "Enable Valgrind support.")
-
-OPTION(PCRE_SHOW_REPORT    "Show the final configuration report" ON)
-OPTION(PCRE_BUILD_PCREGREP "Build pcregrep" ON)
-OPTION(PCRE_BUILD_TESTS    "Build the tests" ON)
-
-IF (MINGW)
-  OPTION(NON_STANDARD_LIB_PREFIX
-         "ON=Shared libraries built in mingw will be named pcre.dll, etc., instead of libpcre.dll, etc."
-         OFF)
-
-  OPTION(NON_STANDARD_LIB_SUFFIX
-         "ON=Shared libraries built in mingw will be named libpcre-0.dll, etc., instead of libpcre.dll, etc."
-         OFF)
-ENDIF(MINGW)
-
-IF(MSVC)
-  OPTION(INSTALL_MSVC_PDB
-         "ON=Install .pdb files built by MSVC, if generated"
-         OFF)
-ENDIF(MSVC)
-
-# bzip2 lib
-IF(BZIP2_FOUND)
-  OPTION (PCRE_SUPPORT_LIBBZ2 "Enable support for linking pcregrep with libbz2." ON)
-ENDIF(BZIP2_FOUND)
-IF(PCRE_SUPPORT_LIBBZ2)
-  INCLUDE_DIRECTORIES(${BZIP2_INCLUDE_DIR})
-ENDIF(PCRE_SUPPORT_LIBBZ2)
-
-# zlib
-IF(ZLIB_FOUND)
-  OPTION (PCRE_SUPPORT_LIBZ "Enable support for linking pcregrep with libz." ON)
-ENDIF(ZLIB_FOUND)
-IF(PCRE_SUPPORT_LIBZ)
-  INCLUDE_DIRECTORIES(${ZLIB_INCLUDE_DIR})
-ENDIF(PCRE_SUPPORT_LIBZ)
-
-# editline lib
-IF(EDITLINE_FOUND)
-  OPTION (PCRE_SUPPORT_LIBEDIT  "Enable support for linking pcretest with libedit." OFF)
-ENDIF(EDITLINE_FOUND)
-IF(PCRE_SUPPORT_LIBEDIT)
-  INCLUDE_DIRECTORIES(${EDITLINE_INCLUDE_DIR})
-ENDIF(PCRE_SUPPORT_LIBEDIT)
-
-# readline lib
-IF(READLINE_FOUND)
-  OPTION (PCRE_SUPPORT_LIBREADLINE  "Enable support for linking pcretest with libreadline." ON)
-ENDIF(READLINE_FOUND)
-IF(PCRE_SUPPORT_LIBREADLINE)
-  INCLUDE_DIRECTORIES(${READLINE_INCLUDE_DIR})
-ENDIF(PCRE_SUPPORT_LIBREADLINE)
-
-# Prepare build configuration
-
-SET(pcre_have_type_traits 0)
-SET(pcre_have_bits_type_traits 0)
-
-IF(HAVE_TYPE_TRAITS_H)
-        SET(pcre_have_type_traits 1)
-ENDIF(HAVE_TYPE_TRAITS_H)
-
-IF(HAVE_BITS_TYPE_TRAITS_H)
-        SET(pcre_have_bits_type_traits 1)
-ENDIF(HAVE_BITS_TYPE_TRAITS_H)
-
-SET(pcre_have_long_long 0)
-SET(pcre_have_ulong_long 0)
-
-IF(HAVE_LONG_LONG)
-        SET(pcre_have_long_long 1)
-ENDIF(HAVE_LONG_LONG)
-
-IF(HAVE_UNSIGNED_LONG_LONG)
-        SET(pcre_have_ulong_long 1)
-ENDIF(HAVE_UNSIGNED_LONG_LONG)
-
-IF(NOT BUILD_SHARED_LIBS)
-        SET(PCRE_STATIC 1)
-ENDIF(NOT BUILD_SHARED_LIBS)
-
-IF(NOT PCRE_BUILD_PCRE8 AND NOT PCRE_BUILD_PCRE16 AND NOT PCRE_BUILD_PCRE32)
-        MESSAGE(FATAL_ERROR "At least one of PCRE_BUILD_PCRE8, PCRE_BUILD_PCRE16 or PCRE_BUILD_PCRE32 must be enabled")
-ENDIF(NOT PCRE_BUILD_PCRE8 AND NOT PCRE_BUILD_PCRE16 AND NOT PCRE_BUILD_PCRE32)
-
-IF(PCRE_BUILD_PCRE8)
-        SET(SUPPORT_PCRE8 1)
-ENDIF(PCRE_BUILD_PCRE8)
-
-IF(PCRE_BUILD_PCRE16)
-        SET(SUPPORT_PCRE16 1)
-ENDIF(PCRE_BUILD_PCRE16)
-
-IF(PCRE_BUILD_PCRE32)
-        SET(SUPPORT_PCRE32 1)
-ENDIF(PCRE_BUILD_PCRE32)
-
-IF(PCRE_BUILD_PCRECPP AND NOT PCRE_BUILD_PCRE8)
-        MESSAGE(STATUS "** PCRE_BUILD_PCRE8 must be enabled for the C++ library support")
-        SET(PCRE_BUILD_PCRECPP OFF)
-ENDIF(PCRE_BUILD_PCRECPP AND NOT PCRE_BUILD_PCRE8)
-
-IF(PCRE_BUILD_PCREGREP AND NOT PCRE_BUILD_PCRE8)
-        MESSAGE(STATUS "** PCRE_BUILD_PCRE8 must be enabled for the pcregrep program")
-        SET(PCRE_BUILD_PCREGREP OFF)
-ENDIF(PCRE_BUILD_PCREGREP AND NOT PCRE_BUILD_PCRE8)
-
-IF(PCRE_SUPPORT_LIBREADLINE AND PCRE_SUPPORT_LIBEDIT)
-        MESSAGE(FATAL_ERROR "Only one of libreadline or libeditline can be specified")
-ENDIF(PCRE_SUPPORT_LIBREADLINE AND PCRE_SUPPORT_LIBEDIT)
-
-IF(PCRE_SUPPORT_BSR_ANYCRLF)
-        SET(BSR_ANYCRLF 1)
-ENDIF(PCRE_SUPPORT_BSR_ANYCRLF)
-
-IF(PCRE_SUPPORT_UTF OR PCRE_SUPPORT_UNICODE_PROPERTIES)
-        SET(SUPPORT_UTF 1)
-        SET(PCRE_SUPPORT_UTF ON)
-ENDIF(PCRE_SUPPORT_UTF OR PCRE_SUPPORT_UNICODE_PROPERTIES)
-
-IF(PCRE_SUPPORT_UNICODE_PROPERTIES)
-        SET(SUPPORT_UCP 1)
-ENDIF(PCRE_SUPPORT_UNICODE_PROPERTIES)
-
-IF(PCRE_SUPPORT_JIT)
-        SET(SUPPORT_JIT 1)
-ENDIF(PCRE_SUPPORT_JIT)
-
-IF(PCRE_SUPPORT_PCREGREP_JIT)
-        SET(SUPPORT_PCREGREP_JIT 1)
-ENDIF(PCRE_SUPPORT_PCREGREP_JIT)
-
-IF(PCRE_SUPPORT_VALGRIND)
-        SET(SUPPORT_VALGRIND 1)
-ENDIF(PCRE_SUPPORT_VALGRIND)
-
-# This next one used to contain
-#       SET(PCRETEST_LIBS ${READLINE_LIBRARY})
-# but I was advised to add the NCURSES test as well, along with
-# some modifications to cmake/FindReadline.cmake which should
-# make it possible to override the default if necessary. PH
-
-IF(PCRE_SUPPORT_LIBREADLINE)
-        SET(SUPPORT_LIBREADLINE 1)
-        SET(PCRETEST_LIBS ${READLINE_LIBRARY} ${NCURSES_LIBRARY})
-ENDIF(PCRE_SUPPORT_LIBREADLINE)
-
-# libedit is a plug-compatible alternative to libreadline
-
-IF(PCRE_SUPPORT_LIBEDIT)
-        SET(SUPPORT_LIBEDIT 1)
-        SET(PCRETEST_LIBS ${EDITLINE_LIBRARY} ${NCURSES_LIBRARY})
-ENDIF(PCRE_SUPPORT_LIBEDIT)
-
-IF(PCRE_SUPPORT_LIBZ)
-        SET(SUPPORT_LIBZ 1)
-        SET(PCREGREP_LIBS ${PCREGREP_LIBS} ${ZLIB_LIBRARIES})
-ENDIF(PCRE_SUPPORT_LIBZ)
-
-IF(PCRE_SUPPORT_LIBBZ2)
-        SET(SUPPORT_LIBBZ2 1)
-        SET(PCREGREP_LIBS ${PCREGREP_LIBS} ${BZIP2_LIBRARIES})
-ENDIF(PCRE_SUPPORT_LIBBZ2)
-
-SET(NEWLINE "")
-
-IF(PCRE_NEWLINE STREQUAL "LF")
-        SET(NEWLINE "10")
-ENDIF(PCRE_NEWLINE STREQUAL "LF")
-IF(PCRE_NEWLINE STREQUAL "CR")
-        SET(NEWLINE "13")
-ENDIF(PCRE_NEWLINE STREQUAL "CR")
-IF(PCRE_NEWLINE STREQUAL "CRLF")
-        SET(NEWLINE "3338")
-ENDIF(PCRE_NEWLINE STREQUAL "CRLF")
-IF(PCRE_NEWLINE STREQUAL "ANY")
-        SET(NEWLINE "-1")
-ENDIF(PCRE_NEWLINE STREQUAL "ANY")
-IF(PCRE_NEWLINE STREQUAL "ANYCRLF")
-        SET(NEWLINE "-2")
-ENDIF(PCRE_NEWLINE STREQUAL "ANYCRLF")
-
-IF(NEWLINE STREQUAL "")
-        MESSAGE(FATAL_ERROR "The PCRE_NEWLINE variable must be set to one of the following values: \"LF\", \"CR\", \"CRLF\", \"ANY\", \"ANYCRLF\".")
-ENDIF(NEWLINE STREQUAL "")
-
-IF(PCRE_EBCDIC)
-        SET(EBCDIC 1)
-IF(PCRE_NEWLINE STREQUAL "LF")
-        SET(NEWLINE "21")
-ENDIF(PCRE_NEWLINE STREQUAL "LF")
-IF(PCRE_NEWLINE STREQUAL "CRLF")
-        SET(NEWLINE "3349")
-ENDIF(PCRE_NEWLINE STREQUAL "CRLF")
-ENDIF(PCRE_EBCDIC)
-
-IF(PCRE_EBCDIC_NL25)
-        SET(EBCDIC 1)
-        SET(EBCDIC_NL25 1)
-IF(PCRE_NEWLINE STREQUAL "LF")
-        SET(NEWLINE "37")
-ENDIF(PCRE_NEWLINE STREQUAL "LF")
-IF(PCRE_NEWLINE STREQUAL "CRLF")
-        SET(NEWLINE "3365")
-ENDIF(PCRE_NEWLINE STREQUAL "CRLF")
-ENDIF(PCRE_EBCDIC_NL25)
-
-IF(PCRE_NO_RECURSE)
-        SET(NO_RECURSE 1)
-ENDIF(PCRE_NO_RECURSE)
-
-# Output files
-CONFIGURE_FILE(config-cmake.h.in
-               ${PROJECT_BINARY_DIR}/config.h
-               @ONLY)
-
-# Parse version numbers and date out of configure.ac
-
-file(STRINGS ${PROJECT_SOURCE_DIR}/configure.ac
-  configure_lines
-  LIMIT_COUNT 50 # Read only the first 50 lines of the file
-)
-
-set(SEARCHED_VARIABLES "pcre_major" "pcre_minor" "pcre_prerelease" "pcre_date")
-foreach(configure_line ${configure_lines})
-    foreach(_substitution_variable ${SEARCHED_VARIABLES})
-        string(TOUPPER ${_substitution_variable} _substitution_variable_upper)
-        if (NOT ${_substitution_variable_upper})
-            string(REGEX MATCH "m4_define\\(${_substitution_variable}, \\[(.*)\\]" MACTHED_STRING ${configure_line})
-            if (CMAKE_MATCH_1)
-                set(${_substitution_variable_upper} ${CMAKE_MATCH_1})
-            endif()
-        endif()
-    endforeach()
-endforeach()
-
-CONFIGURE_FILE(pcre.h.in
-               ${PROJECT_BINARY_DIR}/pcre.h
-               @ONLY)
-
-# What about pcre-config and libpcre.pc?
-
-IF(PCRE_BUILD_PCRECPP)
-        CONFIGURE_FILE(pcre_stringpiece.h.in
-                       ${PROJECT_BINARY_DIR}/pcre_stringpiece.h
-                       @ONLY)
-
-        CONFIGURE_FILE(pcrecpparg.h.in
-                       ${PROJECT_BINARY_DIR}/pcrecpparg.h
-                       @ONLY)
-ENDIF(PCRE_BUILD_PCRECPP)
-
-# Character table generation
-
-OPTION(PCRE_REBUILD_CHARTABLES "Rebuild char tables" OFF)
-IF(PCRE_REBUILD_CHARTABLES)
-  ADD_EXECUTABLE(dftables dftables.c)
-
-  GET_TARGET_PROPERTY(DFTABLES_EXE dftables LOCATION)
-
-  ADD_CUSTOM_COMMAND(
-    COMMENT "Generating character tables (pcre_chartables.c) for current locale"
-    DEPENDS dftables
-    COMMAND ${DFTABLES_EXE}
-    ARGS        ${PROJECT_BINARY_DIR}/pcre_chartables.c
-    OUTPUT      ${PROJECT_BINARY_DIR}/pcre_chartables.c
-  )
-ELSE(PCRE_REBUILD_CHARTABLES)
-  CONFIGURE_FILE(${PROJECT_SOURCE_DIR}/pcre_chartables.c.dist
-                    ${PROJECT_BINARY_DIR}/pcre_chartables.c
-                    COPYONLY)
-ENDIF(PCRE_REBUILD_CHARTABLES)
-
-# Source code
-
-SET(PCRE_HEADERS ${PROJECT_BINARY_DIR}/pcre.h)
-
-IF(PCRE_BUILD_PCRE8)
-SET(PCRE_SOURCES
-  pcre_byte_order.c
-  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_jit_compile.c
-  pcre_maketables.c
-  pcre_newline.c
-  pcre_ord2utf8.c
-  pcre_refcount.c
-  pcre_string_utils.c
-  pcre_study.c
-  pcre_tables.c
-  pcre_ucd.c
-  pcre_valid_utf8.c
-  pcre_version.c
-  pcre_xclass.c
-)
-
-SET(PCREPOSIX_HEADERS pcreposix.h)
-
-SET(PCREPOSIX_SOURCES pcreposix.c)
-
-ENDIF(PCRE_BUILD_PCRE8)
-
-IF(PCRE_BUILD_PCRE16)
-SET(PCRE16_SOURCES
-  pcre16_byte_order.c
-  pcre16_chartables.c
-  pcre16_compile.c
-  pcre16_config.c
-  pcre16_dfa_exec.c
-  pcre16_exec.c
-  pcre16_fullinfo.c
-  pcre16_get.c
-  pcre16_globals.c
-  pcre16_jit_compile.c
-  pcre16_maketables.c
-  pcre16_newline.c
-  pcre16_ord2utf16.c
-  pcre16_refcount.c
-  pcre16_string_utils.c
-  pcre16_study.c
-  pcre16_tables.c
-  pcre16_ucd.c
-  pcre16_utf16_utils.c
-  pcre16_valid_utf16.c
-  pcre16_version.c
-  pcre16_xclass.c
-)
-ENDIF(PCRE_BUILD_PCRE16)
-
-IF(PCRE_BUILD_PCRE32)
-SET(PCRE32_SOURCES
-  pcre32_byte_order.c
-  pcre32_chartables.c
-  pcre32_compile.c
-  pcre32_config.c
-  pcre32_dfa_exec.c
-  pcre32_exec.c
-  pcre32_fullinfo.c
-  pcre32_get.c
-  pcre32_globals.c
-  pcre32_jit_compile.c
-  pcre32_maketables.c
-  pcre32_newline.c
-  pcre32_ord2utf32.c
-  pcre32_refcount.c
-  pcre32_string_utils.c
-  pcre32_study.c
-  pcre32_tables.c
-  pcre32_ucd.c
-  pcre32_utf32_utils.c
-  pcre32_valid_utf32.c
-  pcre32_version.c
-  pcre32_xclass.c
-)
-ENDIF(PCRE_BUILD_PCRE32)
-
-IF(MINGW AND NOT PCRE_STATIC)
-IF (EXISTS ${PROJECT_SOURCE_DIR}/pcre.rc)
-ADD_CUSTOM_COMMAND(OUTPUT ${PROJECT_SOURCE_DIR}/pcre.o
-PRE-LINK
-COMMAND windres ARGS pcre.rc pcre.o
-WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
-COMMENT Using pcre coff info in mingw build)
-SET(PCRE_SOURCES
-  ${PCRE_SOURCES} ${PROJECT_SOURCE_DIR}/pcre.o
-)
-ENDIF(EXISTS ${PROJECT_SOURCE_DIR}/pcre.rc)
-IF (EXISTS ${PROJECT_SOURCE_DIR}/pcreposix.rc)
-ADD_CUSTOM_COMMAND(OUTPUT ${PROJECT_SOURCE_DIR}/pcreposix.o
-PRE-LINK
-COMMAND windres ARGS pcreposix.rc pcreposix.o
-WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
-COMMENT Using pcreposix coff info in mingw build)
-SET(PCREPOSIX_SOURCES
-  ${PCREPOSIX_SOURCES} ${PROJECT_SOURCE_DIR}/pcreposix.o
-)
-ENDIF(EXISTS ${PROJECT_SOURCE_DIR}/pcreposix.rc)
-ENDIF(MINGW AND NOT PCRE_STATIC)
-
-IF(MSVC AND NOT PCRE_STATIC)
-IF (EXISTS ${PROJECT_SOURCE_DIR}/pcre.rc)
-SET(PCRE_SOURCES
-  ${PCRE_SOURCES} pcre.rc)
-ENDIF(EXISTS ${PROJECT_SOURCE_DIR}/pcre.rc)
-IF (EXISTS ${PROJECT_SOURCE_DIR}/pcreposix.rc)
-SET(PCREPOSIX_SOURCES
-  ${PCREPOSIX_SOURCES} pcreposix.rc)
-ENDIF (EXISTS ${PROJECT_SOURCE_DIR}/pcreposix.rc)
-ENDIF(MSVC AND NOT PCRE_STATIC)
-
-SET(PCRECPP_HEADERS
-  pcrecpp.h
-  pcre_scanner.h
-  ${PROJECT_BINARY_DIR}/pcrecpparg.h
-  ${PROJECT_BINARY_DIR}/pcre_stringpiece.h
-)
-
-SET(PCRECPP_SOURCES
-        pcrecpp.cc
-        pcre_scanner.cc
-        pcre_stringpiece.cc
-)
-
-# Build setup
-
-ADD_DEFINITIONS(-DHAVE_CONFIG_H)
-
-IF(MSVC)
-        ADD_DEFINITIONS(-D_CRT_SECURE_NO_DEPRECATE -D_CRT_SECURE_NO_WARNINGS)
-ENDIF(MSVC)
-
-SET(CMAKE_INCLUDE_CURRENT_DIR 1)
-# needed to make sure to not link debug libs
-# against release libs and vice versa
-IF(WIN32)
-  SET(CMAKE_DEBUG_POSTFIX "d")
-ENDIF(WIN32)
-
-SET(targets)
-
-# Libraries
-# pcre
-IF(PCRE_BUILD_PCRE8)
-ADD_LIBRARY(pcre ${PCRE_HEADERS} ${PCRE_SOURCES} ${PROJECT_BINARY_DIR}/config.h)
-SET(targets ${targets} pcre)
-ADD_LIBRARY(pcreposix ${PCREPOSIX_HEADERS} ${PCREPOSIX_SOURCES})
-SET(targets ${targets} pcreposix)
-TARGET_LINK_LIBRARIES(pcreposix pcre)
-
-IF(MINGW AND NOT PCRE_STATIC)
-  IF(NON_STANDARD_LIB_PREFIX)
-    SET_TARGET_PROPERTIES(pcre pcreposix
-                        PROPERTIES PREFIX ""
-    )
-  ENDIF(NON_STANDARD_LIB_PREFIX)
-
-  IF(NON_STANDARD_LIB_SUFFIX)
-    SET_TARGET_PROPERTIES(pcre pcreposix
-                        PROPERTIES SUFFIX "-0.dll"
-    )
-  ENDIF(NON_STANDARD_LIB_SUFFIX)
-ENDIF(MINGW AND NOT PCRE_STATIC)
-
-ENDIF(PCRE_BUILD_PCRE8)
-
-IF(PCRE_BUILD_PCRE16)
-ADD_LIBRARY(pcre16 ${PCRE_HEADERS} ${PCRE16_SOURCES} ${PROJECT_BINARY_DIR}/config.h)
-SET(targets ${targets} pcre16)
-
-IF(MINGW AND NOT PCRE_STATIC)
-  IF(NON_STANDARD_LIB_PREFIX)
-    SET_TARGET_PROPERTIES(pcre16
-                        PROPERTIES PREFIX ""
-    )
-  ENDIF(NON_STANDARD_LIB_PREFIX)
-
-  IF(NON_STANDARD_LIB_SUFFIX)
-    SET_TARGET_PROPERTIES(pcre16
-                        PROPERTIES SUFFIX "-0.dll"
-    )
-  ENDIF(NON_STANDARD_LIB_SUFFIX)
-ENDIF(MINGW AND NOT PCRE_STATIC)
-
-ENDIF(PCRE_BUILD_PCRE16)
-
-IF(PCRE_BUILD_PCRE32)
-ADD_LIBRARY(pcre32 ${PCRE_HEADERS} ${PCRE32_SOURCES} ${PROJECT_BINARY_DIR}/config.h)
-SET(targets ${targets} pcre32)
-
-IF(MINGW AND NOT PCRE_STATIC)
-  IF(NON_STANDARD_LIB_PREFIX)
-    SET_TARGET_PROPERTIES(pcre32
-                        PROPERTIES PREFIX ""
-    )
-  ENDIF(NON_STANDARD_LIB_PREFIX)
-
-  IF(NON_STANDARD_LIB_SUFFIX)
-    SET_TARGET_PROPERTIES(pcre32
-                        PROPERTIES SUFFIX "-0.dll"
-    )
-  ENDIF(NON_STANDARD_LIB_SUFFIX)
-ENDIF(MINGW AND NOT PCRE_STATIC)
-
-ENDIF(PCRE_BUILD_PCRE32)
-
-# pcrecpp
-IF(PCRE_BUILD_PCRECPP)
-ADD_LIBRARY(pcrecpp ${PCRECPP_HEADERS} ${PCRECPP_SOURCES})
-SET(targets ${targets} pcrecpp)
-TARGET_LINK_LIBRARIES(pcrecpp pcre)
-
-  IF(MINGW AND NOT PCRE_STATIC)
-    IF(NON_STANDARD_LIB_PREFIX)
-      SET_TARGET_PROPERTIES(pcrecpp
-                            PROPERTIES PREFIX ""
-      )
-    ENDIF(NON_STANDARD_LIB_PREFIX)
-
-    IF(NON_STANDARD_LIB_SUFFIX)
-      SET_TARGET_PROPERTIES(pcrecpp
-                          PROPERTIES SUFFIX "-0.dll"
-      )
-    ENDIF(NON_STANDARD_LIB_SUFFIX)
-  ENDIF(MINGW AND NOT PCRE_STATIC)
-ENDIF(PCRE_BUILD_PCRECPP)
-
-
-# Executables
-
-# Removed by PH (2008-01-23) because pcredemo shouldn't really be built
-# automatically, and it gave trouble in some environments anyway.
-# ADD_EXECUTABLE(pcredemo pcredemo.c)
-# TARGET_LINK_LIBRARIES(pcredemo pcreposix)
-# IF(NOT BUILD_SHARED_LIBS)
-#     # make sure to not use declspec(dllimport) in static mode on windows
-#         SET_TARGET_PROPERTIES(pcredemo PROPERTIES COMPILE_FLAGS "-DPCRE_STATIC")
-# ENDIF(NOT BUILD_SHARED_LIBS)
-
-IF(PCRE_BUILD_PCREGREP)
-  ADD_EXECUTABLE(pcregrep pcregrep.c)
-  SET(targets ${targets} pcregrep)
-  TARGET_LINK_LIBRARIES(pcregrep pcreposix ${PCREGREP_LIBS})
-ENDIF(PCRE_BUILD_PCREGREP)
-
-# Testing
-IF(PCRE_BUILD_TESTS)
-  ENABLE_TESTING()
-
-  SET(PCRETEST_SOURCES pcretest.c)
-  IF(PCRE_BUILD_PCRE8)
-    LIST(APPEND PCRETEST_SOURCES pcre_printint.c)
-  ENDIF(PCRE_BUILD_PCRE8)
-  IF(PCRE_BUILD_PCRE16)
-    LIST(APPEND PCRETEST_SOURCES pcre16_printint.c)
-  ENDIF(PCRE_BUILD_PCRE16)
-  IF(PCRE_BUILD_PCRE32)
-    LIST(APPEND PCRETEST_SOURCES pcre32_printint.c)
-  ENDIF(PCRE_BUILD_PCRE32)
-
-  ADD_EXECUTABLE(pcretest ${PCRETEST_SOURCES})
-  SET(targets ${targets} pcretest)
-  IF(PCRE_BUILD_PCRE8)
-    LIST(APPEND PCRETEST_LIBS pcreposix pcre)
-  ENDIF(PCRE_BUILD_PCRE8)
-  IF(PCRE_BUILD_PCRE16)
-    LIST(APPEND PCRETEST_LIBS pcre16)
-  ENDIF(PCRE_BUILD_PCRE16)
-  IF(PCRE_BUILD_PCRE32)
-    LIST(APPEND PCRETEST_LIBS pcre32)
-  ENDIF(PCRE_BUILD_PCRE32)
-  TARGET_LINK_LIBRARIES(pcretest ${PCRETEST_LIBS})
-
-  IF(PCRE_SUPPORT_JIT)
-    ADD_EXECUTABLE(pcre_jit_test pcre_jit_test.c)
-    SET(targets ${targets} pcre_jit_test)
-    SET(PCRE_JIT_TEST_LIBS )
-    IF(PCRE_BUILD_PCRE8)
-      LIST(APPEND PCRE_JIT_TEST_LIBS pcre)
-    ENDIF(PCRE_BUILD_PCRE8)
-    IF(PCRE_BUILD_PCRE16)
-      LIST(APPEND PCRE_JIT_TEST_LIBS pcre16)
-    ENDIF(PCRE_BUILD_PCRE16)
-    IF(PCRE_BUILD_PCRE32)
-      LIST(APPEND PCRE_JIT_TEST_LIBS pcre32)
-    ENDIF(PCRE_BUILD_PCRE32)
-    TARGET_LINK_LIBRARIES(pcre_jit_test ${PCRE_JIT_TEST_LIBS})
-  ENDIF(PCRE_SUPPORT_JIT)
-
-  IF(PCRE_BUILD_PCRECPP)
-    ADD_EXECUTABLE(pcrecpp_unittest pcrecpp_unittest.cc)
-    SET(targets ${targets} pcrecpp_unittest)
-    TARGET_LINK_LIBRARIES(pcrecpp_unittest pcrecpp)
-    IF(MINGW AND NON_STANDARD_LIB_NAMES AND NOT PCRE_STATIC)
-      SET_TARGET_PROPERTIES(pcrecpp
-                        PROPERTIES PREFIX ""
-      )
-    ENDIF(MINGW AND NON_STANDARD_LIB_NAMES AND NOT PCRE_STATIC)
-
-    ADD_EXECUTABLE(pcre_scanner_unittest pcre_scanner_unittest.cc)
-    SET(targets ${targets} pcre_scanner_unittest)
-    TARGET_LINK_LIBRARIES(pcre_scanner_unittest pcrecpp)
-
-    ADD_EXECUTABLE(pcre_stringpiece_unittest pcre_stringpiece_unittest.cc)
-    SET(targets ${targets} pcre_stringpiece_unittest)
-    TARGET_LINK_LIBRARIES(pcre_stringpiece_unittest pcrecpp)
-  ENDIF(PCRE_BUILD_PCRECPP)
-
-  # exes in Debug location tested by the RunTest shell script
-  # via "make test"
-  IF(PCRE_BUILD_PCREGREP)
-    GET_TARGET_PROPERTY(PCREGREP_EXE pcregrep DEBUG_LOCATION)
-  ENDIF(PCRE_BUILD_PCREGREP)
-
-  GET_TARGET_PROPERTY(PCRETEST_EXE pcretest DEBUG_LOCATION)
-
-# =================================================
-  # Write out a CTest configuration file
-  #
-  FILE(WRITE ${PROJECT_BINARY_DIR}/CTestCustom.ctest
-  "# This is a generated file.
-MESSAGE(\"When testing is complete, review test output in the
-\\\"${PROJECT_BINARY_DIR}/Testing/Temporary\\\" folder.\")
-MESSAGE(\" \")
-")
-
-  FILE(WRITE ${PROJECT_BINARY_DIR}/pcre_test.sh
-  "#! /bin/sh
-# This is a generated file.
-srcdir=${PROJECT_SOURCE_DIR}
-pcretest=${PCRETEST_EXE}
-. ${PROJECT_SOURCE_DIR}/RunTest
-if test \"$?\" != \"0\"; then exit 1; fi
-# End
-")
-
-  IF(UNIX)
-    ADD_TEST(pcre_test      sh ${PROJECT_BINARY_DIR}/pcre_test.sh)
-  ENDIF(UNIX)
-
-  IF(PCRE_BUILD_PCREGREP)
-    FILE(WRITE ${PROJECT_BINARY_DIR}/pcre_grep_test.sh
-    "#! /bin/sh
-# This is a generated file.
-srcdir=${PROJECT_SOURCE_DIR}
-pcregrep=${PCREGREP_EXE}
-pcretest=${PCRETEST_EXE}
-. ${PROJECT_SOURCE_DIR}/RunGrepTest
-if test \"$?\" != \"0\"; then exit 1; fi
-# End
-")
-
-    IF(UNIX)
-      ADD_TEST(pcre_grep_test sh ${PROJECT_BINARY_DIR}/pcre_grep_test.sh)
-    ENDIF(UNIX)
-  ENDIF(PCRE_BUILD_PCREGREP)
-
-  IF(WIN32)
-    # Provide environment for executing the bat file version of RunTest
-    FILE(TO_NATIVE_PATH ${PROJECT_SOURCE_DIR} winsrc)
-    FILE(TO_NATIVE_PATH ${PROJECT_BINARY_DIR} winbin)
-    FILE(TO_NATIVE_PATH ${PCRETEST_EXE} winexe)
-
-    FILE(WRITE ${PROJECT_BINARY_DIR}/pcre_test.bat
-    "\@REM This is a generated file.
-\@echo off
-setlocal
-SET srcdir=\"${winsrc}\"
-SET pcretest=\"${winexe}\"
-if not [%CMAKE_CONFIG_TYPE%]==[] SET pcretest=\"${winbin}\\%CMAKE_CONFIG_TYPE%\\pcretest.exe\"
-call %srcdir%\\RunTest.Bat
-if errorlevel 1 exit /b 1
-echo RunTest.bat tests successfully completed
-")
-
-  ADD_TEST(NAME pcre_test_bat
-  COMMAND pcre_test.bat)
-  SET_TESTS_PROPERTIES(pcre_test_bat PROPERTIES
-  PASS_REGULAR_EXPRESSION "RunTest\\.bat tests successfully completed")
-
-    IF("$ENV{OSTYPE}" STREQUAL "msys")
-      # Both the sh and bat file versions of RunTest are run if make test is used
-      # in msys
-      ADD_TEST(pcre_test_sh    sh.exe ${PROJECT_BINARY_DIR}/pcre_test.sh)
-      IF(PCRE_BUILD_PCREGREP)
-        ADD_TEST(pcre_grep_test  sh.exe ${PROJECT_BINARY_DIR}/pcre_grep_test.sh)
-      ENDIF(PCRE_BUILD_PCREGREP)
-    ENDIF("$ENV{OSTYPE}" STREQUAL "msys")
-
-  ENDIF(WIN32)
-
-  # Changed to accommodate testing whichever location was just built
-
-  IF(PCRE_SUPPORT_JIT)
-    ADD_TEST(pcre_jit_test         pcre_jit_test)
-  ENDIF(PCRE_SUPPORT_JIT)
-
-  IF(PCRE_BUILD_PCRECPP)
-    ADD_TEST(pcrecpp_test          pcrecpp_unittest)
-    ADD_TEST(pcre_scanner_test     pcre_scanner_unittest)
-    ADD_TEST(pcre_stringpiece_test pcre_stringpiece_unittest)
-  ENDIF(PCRE_BUILD_PCRECPP)
-
-ENDIF(PCRE_BUILD_TESTS)
-
-# Installation
-SET(CMAKE_INSTALL_ALWAYS 1)
-
-INSTALL(TARGETS ${targets}
-        RUNTIME DESTINATION bin
-        LIBRARY DESTINATION lib
-        ARCHIVE DESTINATION lib)
-
-INSTALL(FILES ${PCRE_HEADERS} ${PCREPOSIX_HEADERS} DESTINATION include)
-
-FILE(GLOB html ${PROJECT_SOURCE_DIR}/doc/html/*.html)
-FILE(GLOB man1 ${PROJECT_SOURCE_DIR}/doc/*.1)
-FILE(GLOB man3 ${PROJECT_SOURCE_DIR}/doc/*.3)
-
-IF(PCRE_BUILD_PCRECPP)
-        INSTALL(FILES ${PCRECPP_HEADERS} DESTINATION include)
-ELSE(PCRE_BUILD_PCRECPP)
-        # Remove pcrecpp.3
-        FOREACH(man ${man3})
-                GET_FILENAME_COMPONENT(man_tmp ${man} NAME)
-                IF(NOT man_tmp STREQUAL "pcrecpp.3")
-                        SET(man3_new ${man3} ${man})
-                ENDIF(NOT man_tmp STREQUAL "pcrecpp.3")
-        ENDFOREACH(man ${man3})
-        SET(man3 ${man3_new})
-ENDIF(PCRE_BUILD_PCRECPP)
-
-INSTALL(FILES ${man1} DESTINATION man/man1)
-INSTALL(FILES ${man3} DESTINATION man/man3)
-INSTALL(FILES ${html} DESTINATION share/doc/pcre/html)
-
-IF(MSVC AND INSTALL_MSVC_PDB)
-    INSTALL(FILES ${PROJECT_BINARY_DIR}/pcre.pdb
-                  ${PROJECT_BINARY_DIR}/pcreposix.pdb
-            DESTINATION bin
-            CONFIGURATIONS RelWithDebInfo)
-    INSTALL(FILES ${PROJECT_BINARY_DIR}/pcred.pdb
-                  ${PROJECT_BINARY_DIR}/pcreposixd.pdb
-            DESTINATION bin
-            CONFIGURATIONS Debug)
-ENDIF(MSVC AND INSTALL_MSVC_PDB)
-
-# help, only for nice output
-IF(BUILD_SHARED_LIBS)
-  SET(BUILD_STATIC_LIBS OFF)
-ELSE(BUILD_SHARED_LIBS)
-  SET(BUILD_STATIC_LIBS ON)
-ENDIF(BUILD_SHARED_LIBS)
-
-IF(PCRE_SHOW_REPORT)
-  STRING(TOUPPER "${CMAKE_BUILD_TYPE}" buildtype)
-  IF (CMAKE_C_FLAGS)
-    SET(cfsp " ")
-  ENDIF(CMAKE_C_FLAGS)
-  IF (CMAKE_CXX_FLAGS)
-    SET(cxxfsp " ")
-  ENDIF(CMAKE_CXX_FLAGS)
-  MESSAGE(STATUS "")
-  MESSAGE(STATUS "")
-  MESSAGE(STATUS "PCRE configuration summary:")
-  MESSAGE(STATUS "")
-  MESSAGE(STATUS "  Install prefix .................. : ${CMAKE_INSTALL_PREFIX}")
-  MESSAGE(STATUS "  C compiler ...................... : ${CMAKE_C_COMPILER}")
-  MESSAGE(STATUS "  C++ compiler .................... : ${CMAKE_CXX_COMPILER}")
-  MESSAGE(STATUS "  C compiler flags ................ : ${CMAKE_C_FLAGS}${cfsp}${CMAKE_C_FLAGS_${buildtype}}")
-  MESSAGE(STATUS "  C++ compiler flags .............. : ${CMAKE_CXX_FLAGS}${cxxfsp}${CMAKE_CXX_FLAGS_${buildtype}}")
-  MESSAGE(STATUS "")
-  MESSAGE(STATUS "  Build 8 bit PCRE library ........ : ${PCRE_BUILD_PCRE8}")
-  MESSAGE(STATUS "  Build 16 bit PCRE library ....... : ${PCRE_BUILD_PCRE16}")
-  MESSAGE(STATUS "  Build 32 bit PCRE library ....... : ${PCRE_BUILD_PCRE32}")
-  MESSAGE(STATUS "  Build C++ library ............... : ${PCRE_BUILD_PCRECPP}")
-  MESSAGE(STATUS "  Enable JIT compiling support .... : ${PCRE_SUPPORT_JIT}")
-  MESSAGE(STATUS "  Enable UTF support .............. : ${PCRE_SUPPORT_UTF}")
-  MESSAGE(STATUS "  Unicode properties .............. : ${PCRE_SUPPORT_UNICODE_PROPERTIES}")
-  MESSAGE(STATUS "  Newline char/sequence ........... : ${PCRE_NEWLINE}")
-  MESSAGE(STATUS "  \\R matches only ANYCRLF ......... : ${PCRE_SUPPORT_BSR_ANYCRLF}")
-  MESSAGE(STATUS "  EBCDIC coding ................... : ${PCRE_EBCDIC}")
-  MESSAGE(STATUS "  EBCDIC coding with NL=0x25 ...... : ${PCRE_EBCDIC_NL25}")
-  MESSAGE(STATUS "  Rebuild char tables ............. : ${PCRE_REBUILD_CHARTABLES}")
-  MESSAGE(STATUS "  No stack recursion .............. : ${PCRE_NO_RECURSE}")
-  MESSAGE(STATUS "  POSIX mem threshold ............. : ${PCRE_POSIX_MALLOC_THRESHOLD}")
-  MESSAGE(STATUS "  Internal link size .............. : ${PCRE_LINK_SIZE}")
-  MESSAGE(STATUS "  Parentheses nest limit .......... : ${PCRE_PARENS_NEST_LIMIT}")
-  MESSAGE(STATUS "  Match limit ..................... : ${PCRE_MATCH_LIMIT}")
-  MESSAGE(STATUS "  Match limit recursion ........... : ${PCRE_MATCH_LIMIT_RECURSION}")
-  MESSAGE(STATUS "  Build shared libs ............... : ${BUILD_SHARED_LIBS}")
-  MESSAGE(STATUS "  Build static libs ............... : ${BUILD_STATIC_LIBS}")
-  MESSAGE(STATUS "  Build pcregrep .................. : ${PCRE_BUILD_PCREGREP}")
-  MESSAGE(STATUS "  Enable JIT in pcregrep .......... : ${PCRE_SUPPORT_PCREGREP_JIT}")
-  MESSAGE(STATUS "  Buffer size for pcregrep ........ : ${PCREGREP_BUFSIZE}")
-  MESSAGE(STATUS "  Build tests (implies pcretest  .. : ${PCRE_BUILD_TESTS}")
-  MESSAGE(STATUS "               and pcregrep)")
-  IF(ZLIB_FOUND)
-    MESSAGE(STATUS "  Link pcregrep with libz ......... : ${PCRE_SUPPORT_LIBZ}")
-  ELSE(ZLIB_FOUND)
-    MESSAGE(STATUS "  Link pcregrep with libz ......... : Library not found" )
-  ENDIF(ZLIB_FOUND)
-  IF(BZIP2_FOUND)
-    MESSAGE(STATUS "  Link pcregrep with libbz2 ....... : ${PCRE_SUPPORT_LIBBZ2}")
-  ELSE(BZIP2_FOUND)
-    MESSAGE(STATUS "  Link pcregrep with libbz2 ....... : Library not found" )
-  ENDIF(BZIP2_FOUND)
-  IF(EDITLINE_FOUND)
-    MESSAGE(STATUS "  Link pcretest with libeditline .. : ${PCRE_SUPPORT_LIBEDIT}")
-  ELSE(EDITLINE_FOUND)
-    MESSAGE(STATUS "  Link pcretest with libeditline .. : Library not found" )
-  ENDIF(EDITLINE_FOUND)
-  IF(READLINE_FOUND)
-    MESSAGE(STATUS "  Link pcretest with libreadline .. : ${PCRE_SUPPORT_LIBREADLINE}")
-  ELSE(READLINE_FOUND)
-    MESSAGE(STATUS "  Link pcretest with libreadline .. : Library not found" )
-  ENDIF(READLINE_FOUND)
-  MESSAGE(STATUS "  Support Valgrind .................: ${PCRE_SUPPORT_VALGRIND}")
-  MESSAGE(STATUS "  Support coverage .................: ${PCRE_SUPPORT_COVERAGE}")
-
-  IF(MINGW AND NOT PCRE_STATIC)
-    MESSAGE(STATUS "  Non-standard dll names (prefix) . : ${NON_STANDARD_LIB_PREFIX}")
-    MESSAGE(STATUS "  Non-standard dll names (suffix) . : ${NON_STANDARD_LIB_SUFFIX}")
-  ENDIF(MINGW AND NOT PCRE_STATIC)
-
-  IF(MSVC)
-    MESSAGE(STATUS "  Install MSVC .pdb files ..........: ${INSTALL_MSVC_PDB}")
-  ENDIF(MSVC)
-
-  MESSAGE(STATUS "")
-ENDIF(PCRE_SHOW_REPORT)
-
-# end CMakeLists.txt
diff --git a/dist/COPYING b/dist/COPYING
deleted file mode 100644
index 58eed01..0000000
--- a/dist/COPYING
+++ /dev/null
@@ -1,5 +0,0 @@
-PCRE LICENCE
-
-Please see the file LICENCE in the PCRE distribution for licensing details.
-
-End
diff --git a/dist/ChangeLog b/dist/ChangeLog
deleted file mode 100644
index 5e5bf18..0000000
--- a/dist/ChangeLog
+++ /dev/null
@@ -1,5918 +0,0 @@
-ChangeLog for PCRE
-------------------
-
-Note that the PCRE 8.xx series (PCRE1) is now in a bugfix-only state. All
-development is happening in the PCRE2 10.xx series.
-
-Version 8.38 23-November-2015
------------------------------
-
-1.  If a group that contained a recursive back reference also contained a
-    forward reference subroutine call followed by a non-forward-reference
-    subroutine call, for example /.((?2)(?R)\1)()/, pcre2_compile() failed to
-    compile correct code, leading to undefined behaviour or an internally
-    detected error. This bug was discovered by the LLVM fuzzer.
-
-2.  Quantification of certain items (e.g. atomic back references) could cause
-    incorrect code to be compiled when recursive forward references were
-    involved. For example, in this pattern: /(?1)()((((((\1++))\x85)+)|))/.
-    This bug was discovered by the LLVM fuzzer.
-
-3.  A repeated conditional group whose condition was a reference by name caused
-    a buffer overflow if there was more than one group with the given name.
-    This bug was discovered by the LLVM fuzzer.
-
-4.  A recursive back reference by name within a group that had the same name as
-    another group caused a buffer overflow. For example:
-    /(?J)(?'d'(?'d'\g{d}))/. This bug was discovered by the LLVM fuzzer.
-
-5.  A forward reference by name to a group whose number is the same as the
-    current group, for example in this pattern: /(?|(\k'Pm')|(?'Pm'))/, caused
-    a buffer overflow at compile time. This bug was discovered by the LLVM
-    fuzzer.
-
-6.  A lookbehind assertion within a set of mutually recursive subpatterns could
-    provoke a buffer overflow. This bug was discovered by the LLVM fuzzer.
-
-7.  Another buffer overflow bug involved duplicate named groups with a
-    reference between their definition, with a group that reset capture
-    numbers, for example: /(?J:(?|(?'R')(\k'R')|((?'R'))))/. This has been
-    fixed by always allowing for more memory, even if not needed. (A proper fix
-    is implemented in PCRE2, but it involves more refactoring.)
-
-8.  There was no check for integer overflow in subroutine calls such as (?123).
-
-9.  The table entry for \l in EBCDIC environments was incorrect, leading to its
-    being treated as a literal 'l' instead of causing an error.
-
-10. There was a buffer overflow if pcre_exec() was called with an ovector of
-    size 1. This bug was found by american fuzzy lop.
-
-11. If a non-capturing group containing a conditional group that could match
-    an empty string was repeated, it was not identified as matching an empty
-    string itself. For example: /^(?:(?(1)x|)+)+$()/.
-
-12. In an EBCDIC environment, pcretest was mishandling the escape sequences
-    \a and \e in test subject lines.
-
-13. In an EBCDIC environment, \a in a pattern was converted to the ASCII
-    instead of the EBCDIC value.
-
-14. The handling of \c in an EBCDIC environment has been revised so that it is
-    now compatible with the specification in Perl's perlebcdic page.
-
-15. The EBCDIC character 0x41 is a non-breaking space, equivalent to 0xa0 in
-    ASCII/Unicode. This has now been added to the list of characters that are
-    recognized as white space in EBCDIC.
-
-16. When PCRE was compiled without UCP support, the use of \p and \P gave an
-    error (correctly) when used outside a class, but did not give an error
-    within a class.
-
-17. \h within a class was incorrectly compiled in EBCDIC environments.
-
-18. A pattern with an unmatched closing parenthesis that contained a backward
-    assertion which itself contained a forward reference caused buffer
-    overflow. And example pattern is: /(?=di(?<=(?1))|(?=(.))))/.
-
-19. JIT should return with error when the compiled pattern requires more stack
-    space than the maximum.
-
-20. A possessively repeated conditional group that could match an empty string,
-    for example, /(?(R))*+/, was incorrectly compiled.
-
-21. Fix infinite recursion in the JIT compiler when certain patterns such as
-    /(?:|a|){100}x/ are analysed.
-
-22. Some patterns with character classes involving [: and \\ were incorrectly
-    compiled and could cause reading from uninitialized memory or an incorrect
-    error diagnosis.
-
-23. Pathological patterns containing many nested occurrences of [: caused
-    pcre_compile() to run for a very long time.
-
-24. A conditional group with only one branch has an implicit empty alternative
-    branch and must therefore be treated as potentially matching an empty
-    string.
-
-25. If (?R was followed by - or + incorrect behaviour happened instead of a
-    diagnostic.
-
-26. Arrange to give up on finding the minimum matching length for overly
-    complex patterns.
-
-27. Similar to (4) above: in a pattern with duplicated named groups and an
-    occurrence of (?| it is possible for an apparently non-recursive back
-    reference to become recursive if a later named group with the relevant
-    number is encountered. This could lead to a buffer overflow. Wen Guanxing
-    from Venustech ADLAB discovered this bug.
-
-28. If pcregrep was given the -q option with -c or -l, or when handling a
-    binary file, it incorrectly wrote output to stdout.
-
-29. The JIT compiler did not restore the control verb head in case of *THEN
-    control verbs. This issue was found by Karl Skomski with a custom LLVM
-    fuzzer.
-
-30. Error messages for syntax errors following \g and \k were giving inaccurate
-    offsets in the pattern.
-
-31. Added a check for integer overflow in conditions (?(<digits>) and
-    (?(R<digits>). This omission was discovered by Karl Skomski with the LLVM
-    fuzzer.
-
-32. Handling recursive references such as (?2) when the reference is to a group
-    later in the pattern uses code that is very hacked about and error-prone.
-    It has been re-written for PCRE2. Here in PCRE1, a check has been added to
-    give an internal error if it is obvious that compiling has gone wrong.
-
-33. The JIT compiler should not check repeats after a {0,1} repeat byte code.
-    This issue was found by Karl Skomski with a custom LLVM fuzzer.
-
-34. The JIT compiler should restore the control chain for empty possessive
-    repeats. This issue was found by Karl Skomski with a custom LLVM fuzzer.
-
-35. Match limit check added to JIT recursion. This issue was found by Karl
-    Skomski with a custom LLVM fuzzer.
-
-36. Yet another case similar to 27 above has been circumvented by an
-    unconditional allocation of extra memory. This issue is fixed "properly" in
-    PCRE2 by refactoring the way references are handled. Wen Guanxing
-    from Venustech ADLAB discovered this bug.
-
-37. Fix two assertion fails in JIT. These issues were found by Karl Skomski
-    with a custom LLVM fuzzer.
-
-38. Fixed a corner case of range optimization in JIT.
-
-39. An incorrect error "overran compiling workspace" was given if there were
-    exactly enough group forward references such that the last one extended
-    into the workspace safety margin. The next one would have expanded the
-    workspace. The test for overflow was not including the safety margin.
-
-40. A match limit issue is fixed in JIT which was found by Karl Skomski
-    with a custom LLVM fuzzer.
-
-41. Remove the use of /dev/null in testdata/testinput2, because it doesn't
-    work under Windows. (Why has it taken so long for anyone to notice?)
-
-42. In a character class such as [\W\p{Any}] where both a negative-type escape
-    ("not a word character") and a property escape were present, the property
-    escape was being ignored.
-
-43. Fix crash caused by very long (*MARK) or (*THEN) names.
-
-44. A sequence such as [[:punct:]b] that is, a POSIX character class followed
-    by a single ASCII character in a class item, was incorrectly compiled in
-    UCP mode. The POSIX class got lost, but only if the single character
-    followed it.
-
-45. [:punct:] in UCP mode was matching some characters in the range 128-255
-    that should not have been matched.
-
-46. If [:^ascii:] or [:^xdigit:] or [:^cntrl:] are present in a non-negated
-    class, all characters with code points greater than 255 are in the class.
-    When a Unicode property was also in the class (if PCRE_UCP is set, escapes
-    such as \w are turned into Unicode properties), wide characters were not
-    correctly handled, and could fail to match.
-
-
-Version 8.37 28-April-2015
---------------------------
-
-1.  When an (*ACCEPT) is triggered inside capturing parentheses, it arranges
-    for those parentheses to be closed with whatever has been captured so far.
-    However, it was failing to mark any other groups between the hightest
-    capture so far and the currrent group as "unset". Thus, the ovector for
-    those groups contained whatever was previously there. An example is the
-    pattern /(x)|((*ACCEPT))/ when matched against "abcd".
-
-2.  If an assertion condition was quantified with a minimum of zero (an odd
-    thing to do, but it happened), SIGSEGV or other misbehaviour could occur.
-
-3.  If a pattern in pcretest input had the P (POSIX) modifier followed by an
-    unrecognized modifier, a crash could occur.
-
-4.  An attempt to do global matching in pcretest with a zero-length ovector
-    caused a crash.
-
-5.  Fixed a memory leak during matching that could occur for a subpattern
-    subroutine call (recursive or otherwise) if the number of captured groups
-    that had to be saved was greater than ten.
-
-6.  Catch a bad opcode during auto-possessification after compiling a bad UTF
-    string with NO_UTF_CHECK. This is a tidyup, not a bug fix, as passing bad
-    UTF with NO_UTF_CHECK is documented as having an undefined outcome.
-
-7.  A UTF pattern containing a "not" match of a non-ASCII character and a
-    subroutine reference could loop at compile time. Example: /[^\xff]((?1))/.
-
-8. When a pattern is compiled, it remembers the highest back reference so that
-   when matching, if the ovector is too small, extra memory can be obtained to
-   use instead. A conditional subpattern whose condition is a check on a
-   capture having happened, such as, for example in the pattern
-   /^(?:(a)|b)(?(1)A|B)/, is another kind of back reference, but it was not
-   setting the highest backreference number. This mattered only if pcre_exec()
-   was called with an ovector that was too small to hold the capture, and there
-   was no other kind of back reference (a situation which is probably quite
-   rare). The effect of the bug was that the condition was always treated as
-   FALSE when the capture could not be consulted, leading to a incorrect
-   behaviour by pcre_exec(). This bug has been fixed.
-
-9. A reference to a duplicated named group (either a back reference or a test
-   for being set in a conditional) that occurred in a part of the pattern where
-   PCRE_DUPNAMES was not set caused the amount of memory needed for the pattern
-   to be incorrectly calculated, leading to overwriting.
-
-10. A mutually recursive set of back references such as (\2)(\1) caused a
-    segfault at study time (while trying to find the minimum matching length).
-    The infinite loop is now broken (with the minimum length unset, that is,
-    zero).
-
-11. If an assertion that was used as a condition was quantified with a minimum
-    of zero, matching went wrong. In particular, if the whole group had
-    unlimited repetition and could match an empty string, a segfault was
-    likely. The pattern (?(?=0)?)+ is an example that caused this. Perl allows
-    assertions to be quantified, but not if they are being used as conditions,
-    so the above pattern is faulted by Perl. PCRE has now been changed so that
-    it also rejects such patterns.
-
-12. A possessive capturing group such as (a)*+ with a minimum repeat of zero
-    failed to allow the zero-repeat case if pcre2_exec() was called with an
-    ovector too small to capture the group.
-
-13. Fixed two bugs in pcretest that were discovered by fuzzing and reported by
-    Red Hat Product Security:
-
-    (a) A crash if /K and /F were both set with the option to save the compiled
-    pattern.
-
-    (b) Another crash if the option to print captured substrings in a callout
-    was combined with setting a null ovector, for example \O\C+ as a subject
-    string.
-
-14. A pattern such as "((?2){0,1999}())?", which has a group containing a
-    forward reference repeated a large (but limited) number of times within a
-    repeated outer group that has a zero minimum quantifier, caused incorrect
-    code to be compiled, leading to the error "internal error:
-    previously-checked referenced subpattern not found" when an incorrect
-    memory address was read. This bug was reported as "heap overflow",
-    discovered by Kai Lu of Fortinet's FortiGuard Labs and given the CVE number
-    CVE-2015-2325.
-
-23. A pattern such as "((?+1)(\1))/" containing a forward reference subroutine
-    call within a group that also contained a recursive back reference caused
-    incorrect code to be compiled. This bug was reported as "heap overflow",
-    discovered by Kai Lu of Fortinet's FortiGuard Labs, and given the CVE
-    number CVE-2015-2326.
-
-24. Computing the size of the JIT read-only data in advance has been a source
-    of various issues, and new ones are still appear unfortunately. To fix
-    existing and future issues, size computation is eliminated from the code,
-    and replaced by on-demand memory allocation.
-
-25. A pattern such as /(?i)[A-`]/, where characters in the other case are
-    adjacent to the end of the range, and the range contained characters with
-    more than one other case, caused incorrect behaviour when compiled in UTF
-    mode. In that example, the range a-j was left out of the class.
-
-26. Fix JIT compilation of conditional blocks, which assertion
-    is converted to (*FAIL). E.g: /(?(?!))/.
-
-27. The pattern /(?(?!)^)/ caused references to random memory. This bug was
-    discovered by the LLVM fuzzer.
-
-28. The assertion (?!) is optimized to (*FAIL). This was not handled correctly
-    when this assertion was used as a condition, for example (?(?!)a|b). In
-    pcre2_match() it worked by luck; in pcre2_dfa_match() it gave an incorrect
-    error about an unsupported item.
-
-29. For some types of pattern, for example /Z*(|d*){216}/, the auto-
-    possessification code could take exponential time to complete. A recursion
-    depth limit of 1000 has been imposed to limit the resources used by this
-    optimization.
-
-30. A pattern such as /(*UTF)[\S\V\H]/, which contains a negated special class
-    such as \S in non-UCP mode, explicit wide characters (> 255) can be ignored
-    because \S ensures they are all in the class. The code for doing this was
-    interacting badly with the code for computing the amount of space needed to
-    compile the pattern, leading to a buffer overflow. This bug was discovered
-    by the LLVM fuzzer.
-
-31. A pattern such as /((?2)+)((?1))/ which has mutual recursion nested inside
-    other kinds of group caused stack overflow at compile time. This bug was
-    discovered by the LLVM fuzzer.
-
-32. A pattern such as /(?1)(?#?'){8}(a)/ which had a parenthesized comment
-    between a subroutine call and its quantifier was incorrectly compiled,
-    leading to buffer overflow or other errors. This bug was discovered by the
-    LLVM fuzzer.
-
-33. The illegal pattern /(?(?<E>.*!.*)?)/ was not being diagnosed as missing an
-    assertion after (?(. The code was failing to check the character after
-    (?(?< for the ! or = that would indicate a lookbehind assertion. This bug
-    was discovered by the LLVM fuzzer.
-
-34. A pattern such as /X((?2)()*+){2}+/ which has a possessive quantifier with
-    a fixed maximum following a group that contains a subroutine reference was
-    incorrectly compiled and could trigger buffer overflow. This bug was
-    discovered by the LLVM fuzzer.
-
-35. A mutual recursion within a lookbehind assertion such as (?<=((?2))((?1)))
-    caused a stack overflow instead of the diagnosis of a non-fixed length
-    lookbehind assertion. This bug was discovered by the LLVM fuzzer.
-
-36. The use of \K in a positive lookbehind assertion in a non-anchored pattern
-    (e.g. /(?<=\Ka)/) could make pcregrep loop.
-
-37. There was a similar problem to 36 in pcretest for global matches.
-
-38. If a greedy quantified \X was preceded by \C in UTF mode (e.g. \C\X*),
-    and a subsequent item in the pattern caused a non-match, backtracking over
-    the repeated \X did not stop, but carried on past the start of the subject,
-    causing reference to random memory and/or a segfault. There were also some
-    other cases where backtracking after \C could crash. This set of bugs was
-    discovered by the LLVM fuzzer.
-
-39. The function for finding the minimum length of a matching string could take
-    a very long time if mutual recursion was present many times in a pattern,
-    for example, /((?2){73}(?2))((?1))/. A better mutual recursion detection
-    method has been implemented. This infelicity was discovered by the LLVM
-    fuzzer.
-
-40. Static linking against the PCRE library using the pkg-config module was
-    failing on missing pthread symbols.
-
-
-Version 8.36 26-September-2014
-------------------------------
-
-1.  Got rid of some compiler warnings in the C++ modules that were shown up by
-    -Wmissing-field-initializers and -Wunused-parameter.
-
-2.  The tests for quantifiers being too big (greater than 65535) were being
-    applied after reading the number, and stupidly assuming that integer
-    overflow would give a negative number. The tests are now applied as the
-    numbers are read.
-
-3.  Tidy code in pcre_exec.c where two branches that used to be different are
-    now the same.
-
-4.  The JIT compiler did not generate match limit checks for certain
-    bracketed expressions with quantifiers. This may lead to exponential
-    backtracking, instead of returning with PCRE_ERROR_MATCHLIMIT. This
-    issue should be resolved now.
-
-5.  Fixed an issue, which occures when nested alternatives are optimized
-    with table jumps.
-
-6.  Inserted two casts and changed some ints to size_t in the light of some
-    reported 64-bit compiler warnings (Bugzilla 1477).
-
-7.  Fixed a bug concerned with zero-minimum possessive groups that could match
-    an empty string, which sometimes were behaving incorrectly in the
-    interpreter (though correctly in the JIT matcher). This pcretest input is
-    an example:
-
-      '\A(?:[^"]++|"(?:[^"]*+|"")*+")++'
-      NON QUOTED "QUOT""ED" AFTER "NOT MATCHED
-
-    the interpreter was reporting a match of 'NON QUOTED ' only, whereas the
-    JIT matcher and Perl both matched 'NON QUOTED "QUOT""ED" AFTER '. The test
-    for an empty string was breaking the inner loop and carrying on at a lower
-    level, when possessive repeated groups should always return to a higher
-    level as they have no backtrack points in them. The empty string test now
-    occurs at the outer level.
-
-8.  Fixed a bug that was incorrectly auto-possessifying \w+ in the pattern
-    ^\w+(?>\s*)(?<=\w) which caused it not to match "test test".
-
-9.  Give a compile-time error for \o{} (as Perl does) and for \x{} (which Perl
-    doesn't).
-
-10. Change 8.34/15 introduced a bug that caused the amount of memory needed
-    to hold a pattern to be incorrectly computed (too small) when there were
-    named back references to duplicated names. This could cause "internal
-    error: code overflow" or "double free or corruption" or other memory
-    handling errors.
-
-11. When named subpatterns had the same prefixes, back references could be
-    confused. For example, in this pattern:
-
-      /(?P<Name>a)?(?P<Name2>b)?(?(<Name>)c|d)*l/
-
-    the reference to 'Name' was incorrectly treated as a reference to a
-    duplicate name.
-
-12. A pattern such as /^s?c/mi8 where the optional character has more than
-    one "other case" was incorrectly compiled such that it would only try to
-    match starting at "c".
-
-13. When a pattern starting with \s was studied, VT was not included in the
-    list of possible starting characters; this should have been part of the
-    8.34/18 patch.
-
-14. If a character class started [\Qx]... where x is any character, the class
-    was incorrectly terminated at the ].
-
-15. If a pattern that started with a caseless match for a character with more
-    than one "other case" was studied, PCRE did not set up the starting code
-    unit bit map for the list of possible characters. Now it does. This is an
-    optimization improvement, not a bug fix.
-
-16. The Unicode data tables have been updated to Unicode 7.0.0.
-
-17. Fixed a number of memory leaks in pcregrep.
-
-18. Avoid a compiler warning (from some compilers) for a function call with
-    a cast that removes "const" from an lvalue by using an intermediate
-    variable (to which the compiler does not object).
-
-19. Incorrect code was compiled if a group that contained an internal recursive
-    back reference was optional (had quantifier with a minimum of zero). This
-    example compiled incorrect code: /(((a\2)|(a*)\g<-1>))*/ and other examples
-    caused segmentation faults because of stack overflows at compile time.
-
-20. A pattern such as /((?(R)a|(?1)))+/, which contains a recursion within a
-    group that is quantified with an indefinite repeat, caused a compile-time
-    loop which used up all the system stack and provoked a segmentation fault.
-    This was not the same bug as 19 above.
-
-21. Add PCRECPP_EXP_DECL declaration to operator<< in pcre_stringpiece.h.
-    Patch by Mike Frysinger.
-
-
-Version 8.35 04-April-2014
---------------------------
-
-1.  A new flag is set, when property checks are present in an XCLASS.
-    When this flag is not set, PCRE can perform certain optimizations
-    such as studying these XCLASS-es.
-
-2.  The auto-possessification of character sets were improved: a normal
-    and an extended character set can be compared now. Furthermore
-    the JIT compiler optimizes more character set checks.
-
-3.  Got rid of some compiler warnings for potentially uninitialized variables
-    that show up only when compiled with -O2.
-
-4.  A pattern such as (?=ab\K) that uses \K in an assertion can set the start
-    of a match later then the end of the match. The pcretest program was not
-    handling the case sensibly - it was outputting from the start to the next
-    binary zero. It now reports this situation in a message, and outputs the
-    text from the end to the start.
-
-5.  Fast forward search is improved in JIT. Instead of the first three
-    characters, any three characters with fixed position can be searched.
-    Search order: first, last, middle.
-
-6.  Improve character range checks in JIT. Characters are read by an inprecise
-    function now, which returns with an unknown value if the character code is
-    above a certain threshold (e.g: 256). The only limitation is that the value
-    must be bigger than the threshold as well. This function is useful when
-    the characters above the threshold are handled in the same way.
-
-7.  The macros whose names start with RAWUCHAR are placeholders for a future
-    mode in which only the bottom 21 bits of 32-bit data items are used. To
-    make this more memorable for those maintaining the code, the names have
-    been changed to start with UCHAR21, and an extensive comment has been added
-    to their definition.
-
-8.  Add missing (new) files sljitNativeTILEGX.c and sljitNativeTILEGX-encoder.c
-    to the export list in Makefile.am (they were accidentally omitted from the
-    8.34 tarball).
-
-9.  The informational output from pcretest used the phrase "starting byte set"
-    which is inappropriate for the 16-bit and 32-bit libraries. As the output
-    for "first char" and "need char" really means "non-UTF-char", I've changed
-    "byte" to "char", and slightly reworded the output. The documentation about
-    these values has also been (I hope) clarified.
-
-10. Another JIT related optimization: use table jumps for selecting the correct
-    backtracking path, when more than four alternatives are present inside a
-    bracket.
-
-11. Empty match is not possible, when the minimum length is greater than zero,
-    and there is no \K in the pattern. JIT should avoid empty match checks in
-    such cases.
-
-12. In a caseless character class with UCP support, when a character with more
-    than one alternative case was not the first character of a range, not all
-    the alternative cases were added to the class. For example, s and \x{17f}
-    are both alternative cases for S: the class [RST] was handled correctly,
-    but [R-T] was not.
-
-13. The configure.ac file always checked for pthread support when JIT was
-    enabled. This is not used in Windows, so I have put this test inside a
-    check for the presence of windows.h (which was already tested for).
-
-14. Improve pattern prefix search by a simplified Boyer-Moore algorithm in JIT.
-    The algorithm provides a way to skip certain starting offsets, and usually
-    faster than linear prefix searches.
-
-15. Change 13 for 8.20 updated RunTest to check for the 'fr' locale as well
-    as for 'fr_FR' and 'french'. For some reason, however, it then used the
-    Windows-specific input and output files, which have 'french' screwed in.
-    So this could never have worked. One of the problems with locales is that
-    they aren't always the same. I have now updated RunTest so that it checks
-    the output of the locale test (test 3) against three different output
-    files, and it allows the test to pass if any one of them matches. With luck
-    this should make the test pass on some versions of Solaris where it was
-    failing. Because of the uncertainty, the script did not used to stop if
-    test 3 failed; it now does. If further versions of a French locale ever
-    come to light, they can now easily be added.
-
-16. If --with-pcregrep-bufsize was given a non-integer value such as "50K",
-    there was a message during ./configure, but it did not stop. This now
-    provokes an error. The invalid example in README has been corrected.
-    If a value less than the minimum is given, the minimum value has always
-    been used, but now a warning is given.
-
-17. If --enable-bsr-anycrlf was set, the special 16/32-bit test failed. This
-    was a bug in the test system, which is now fixed. Also, the list of various
-    configurations that are tested for each release did not have one with both
-    16/32 bits and --enable-bar-anycrlf. It now does.
-
-18. pcretest was missing "-C bsr" for displaying the \R default setting.
-
-19. Little endian PowerPC systems are supported now by the JIT compiler.
-
-20. The fast forward newline mechanism could enter to an infinite loop on
-    certain invalid UTF-8 input. Although we don't support these cases
-    this issue can be fixed by a performance optimization.
-
-21. Change 33 of 8.34 is not sufficient to ensure stack safety because it does
-    not take account if existing stack usage. There is now a new global
-    variable called pcre_stack_guard that can be set to point to an external
-    function to check stack availability. It is called at the start of
-    processing every parenthesized group.
-
-22. A typo in the code meant that in ungreedy mode the max/min qualifier
-    behaved like a min-possessive qualifier, and, for example, /a{1,3}b/U did
-    not match "ab".
-
-23. When UTF was disabled, the JIT program reported some incorrect compile
-    errors. These messages are silenced now.
-
-24. Experimental support for ARM-64 and MIPS-64 has been added to the JIT
-    compiler.
-
-25. Change all the temporary files used in RunGrepTest to be different to those
-    used by RunTest so that the tests can be run simultaneously, for example by
-    "make -j check".
-
-
-Version 8.34 15-December-2013
------------------------------
-
-1.  Add pcre[16|32]_jit_free_unused_memory to forcibly free unused JIT
-    executable memory. Patch inspired by Carsten Klein.
-
-2.  ./configure --enable-coverage defined SUPPORT_GCOV in config.h, although
-    this macro is never tested and has no effect, because the work to support
-    coverage involves only compiling and linking options and special targets in
-    the Makefile. The comment in config.h implied that defining the macro would
-    enable coverage support, which is totally false. There was also support for
-    setting this macro in the CMake files (my fault, I just copied it from
-    configure). SUPPORT_GCOV has now been removed.
-
-3.  Make a small performance improvement in strlen16() and strlen32() in
-    pcretest.
-
-4.  Change 36 for 8.33 left some unreachable statements in pcre_exec.c,
-    detected by the Solaris compiler (gcc doesn't seem to be able to diagnose
-    these cases). There was also one in pcretest.c.
-
-5.  Cleaned up a "may be uninitialized" compiler warning in pcre_exec.c.
-
-6.  In UTF mode, the code for checking whether a group could match an empty
-    string (which is used for indefinitely repeated groups to allow for
-    breaking an infinite loop) was broken when the group contained a repeated
-    negated single-character class with a character that occupied more than one
-    data item and had a minimum repetition of zero (for example, [^\x{100}]* in
-    UTF-8 mode). The effect was undefined: the group might or might not be
-    deemed as matching an empty string, or the program might have crashed.
-
-7.  The code for checking whether a group could match an empty string was not
-    recognizing that \h, \H, \v, \V, and \R must match a character.
-
-8.  Implemented PCRE_INFO_MATCH_EMPTY, which yields 1 if the pattern can match
-    an empty string. If it can, pcretest shows this in its information output.
-
-9.  Fixed two related bugs that applied to Unicode extended grapheme clusters
-    that were repeated with a maximizing qualifier (e.g. \X* or \X{2,5}) when
-    matched by pcre_exec() without using JIT:
-
-    (a) If the rest of the pattern did not match after a maximal run of
-        grapheme clusters, the code for backing up to try with fewer of them
-        did not always back up over a full grapheme when characters that do not
-        have the modifier quality were involved, e.g. Hangul syllables.
-
-    (b) If the match point in a subject started with modifier character, and
-        there was no match, the code could incorrectly back up beyond the match
-        point, and potentially beyond the first character in the subject,
-        leading to a segfault or an incorrect match result.
-
-10. A conditional group with an assertion condition could lead to PCRE
-    recording an incorrect first data item for a match if no other first data
-    item was recorded. For example, the pattern (?(?=ab)ab) recorded "a" as a
-    first data item, and therefore matched "ca" after "c" instead of at the
-    start.
-
-11. Change 40 for 8.33 (allowing pcregrep to find empty strings) showed up a
-    bug that caused the command "echo a | ./pcregrep -M '|a'" to loop.
-
-12. The source of pcregrep now includes z/OS-specific code so that it can be
-    compiled for z/OS as part of the special z/OS distribution.
-
-13. Added the -T and -TM options to pcretest.
-
-14. The code in pcre_compile.c for creating the table of named capturing groups
-    has been refactored. Instead of creating the table dynamically during the
-    actual compiling pass, the information is remembered during the pre-compile
-    pass (on the stack unless there are more than 20 named groups, in which
-    case malloc() is used) and the whole table is created before the actual
-    compile happens. This has simplified the code (it is now nearly 150 lines
-    shorter) and prepared the way for better handling of references to groups
-    with duplicate names.
-
-15. A back reference to a named subpattern when there is more than one of the
-    same name now checks them in the order in which they appear in the pattern.
-    The first one that is set is used for the reference. Previously only the
-    first one was inspected. This change makes PCRE more compatible with Perl.
-
-16. Unicode character properties were updated from Unicode 6.3.0.
-
-17. The compile-time code for auto-possessification has been refactored, based
-    on a patch by Zoltan Herczeg. It now happens after instead of during
-    compilation. The code is cleaner, and more cases are handled. The option
-    PCRE_NO_AUTO_POSSESS is added for testing purposes, and the -O and /O
-    options in pcretest are provided to set it. It can also be set by
-    (*NO_AUTO_POSSESS) at the start of a pattern.
-
-18. The character VT has been added to the default ("C" locale) set of
-    characters that match \s and are generally treated as white space,
-    following this same change in Perl 5.18. There is now no difference between
-    "Perl space" and "POSIX space". Whether VT is treated as white space in
-    other locales depends on the locale.
-
-19. The code for checking named groups as conditions, either for being set or
-    for being recursed, has been refactored (this is related to 14 and 15
-    above). Processing unduplicated named groups should now be as fast at
-    numerical groups, and processing duplicated groups should be faster than
-    before.
-
-20. Two patches to the CMake build system, by Alexander Barkov:
-
-      (1) Replace the "source" command by "." in CMakeLists.txt because
-          "source" is a bash-ism.
-
-      (2) Add missing HAVE_STDINT_H and HAVE_INTTYPES_H to config-cmake.h.in;
-          without these the CMake build does not work on Solaris.
-
-21. Perl has changed its handling of \8 and \9. If there is no previously
-    encountered capturing group of those numbers, they are treated as the
-    literal characters 8 and 9 instead of a binary zero followed by the
-    literals. PCRE now does the same.
-
-22. Following Perl, added \o{} to specify codepoints in octal, making it
-    possible to specify values greater than 0777 and also making them
-    unambiguous.
-
-23. Perl now gives an error for missing closing braces after \x{... instead of
-    treating the string as literal. PCRE now does the same.
-
-24. RunTest used to grumble if an inappropriate test was selected explicitly,
-    but just skip it when running all tests. This make it awkward to run ranges
-    of tests when one of them was inappropriate. Now it just skips any
-    inappropriate tests, as it always did when running all tests.
-
-25. If PCRE_AUTO_CALLOUT and PCRE_UCP were set for a pattern that contained
-    character types such as \d or \w, too many callouts were inserted, and the
-    data that they returned was rubbish.
-
-26. In UCP mode, \s was not matching two of the characters that Perl matches,
-    namely NEL (U+0085) and MONGOLIAN VOWEL SEPARATOR (U+180E), though they
-    were matched by \h. The code has now been refactored so that the lists of
-    the horizontal and vertical whitespace characters used for \h and \v (which
-    are defined only in one place) are now also used for \s.
-
-27. Add JIT support for the 64 bit TileGX architecture.
-    Patch by Jiong Wang (Tilera Corporation).
-
-28. Possessive quantifiers for classes (both explicit and automatically
-    generated) now use special opcodes instead of wrapping in ONCE brackets.
-
-29. Whereas an item such as A{4}+ ignored the possessivenes of the quantifier
-    (because it's meaningless), this was not happening when PCRE_CASELESS was
-    set. Not wrong, but inefficient.
-
-30. Updated perltest.pl to add /u (force Unicode mode) when /W (use Unicode
-    properties for \w, \d, etc) is present in a test regex. Otherwise if the
-    test contains no characters greater than 255, Perl doesn't realise it
-    should be using Unicode semantics.
-
-31. Upgraded the handling of the POSIX classes [:graph:], [:print:], and
-    [:punct:] when PCRE_UCP is set so as to include the same characters as Perl
-    does in Unicode mode.
-
-32. Added the "forbid" facility to pcretest so that putting tests into the
-    wrong test files can sometimes be quickly detected.
-
-33. There is now a limit (default 250) on the depth of nesting of parentheses.
-    This limit is imposed to control the amount of system stack used at compile
-    time. It can be changed at build time by --with-parens-nest-limit=xxx or
-    the equivalent in CMake.
-
-34. Character classes such as [A-\d] or [a-[:digit:]] now cause compile-time
-    errors. Perl warns for these when in warning mode, but PCRE has no facility
-    for giving warnings.
-
-35. Change 34 for 8.13 allowed quantifiers on assertions, because Perl does.
-    However, this was not working for (?!) because it is optimized to (*FAIL),
-    for which PCRE does not allow quantifiers. The optimization is now disabled
-    when a quantifier follows (?!). I can't see any use for this, but it makes
-    things uniform.
-
-36. Perl no longer allows group names to start with digits, so I have made this
-    change also in PCRE. It simplifies the code a bit.
-
-37. In extended mode, Perl ignores spaces before a + that indicates a
-    possessive quantifier. PCRE allowed a space before the quantifier, but not
-    before the possessive +. It now does.
-
-38. The use of \K (reset reported match start) within a repeated possessive
-    group such as (a\Kb)*+ was not working.
-
-40. Document that the same character tables must be used at compile time and
-    run time, and that the facility to pass tables to pcre_exec() and
-    pcre_dfa_exec() is for use only with saved/restored patterns.
-
-41. Applied Jeff Trawick's patch CMakeLists.txt, which "provides two new
-    features for Builds with MSVC:
-
-    1. Support pcre.rc and/or pcreposix.rc (as is already done for MinGW
-       builds). The .rc files can be used to set FileDescription and many other
-       attributes.
-
-    2. Add an option (-DINSTALL_MSVC_PDB) to enable installation of .pdb files.
-       This allows higher-level build scripts which want .pdb files to avoid
-       hard-coding the exact files needed."
-
-42. Added support for [[:<:]] and [[:>:]] as used in the BSD POSIX library to
-    mean "start of word" and "end of word", respectively, as a transition aid.
-
-43. A minimizing repeat of a class containing codepoints greater than 255 in
-    non-UTF 16-bit or 32-bit modes caused an internal error when PCRE was
-    compiled to use the heap for recursion.
-
-44. Got rid of some compiler warnings for unused variables when UTF but not UCP
-    is configured.
-
-
-Version 8.33 28-May-2013
-------------------------
-
-1.  Added 'U' to some constants that are compared to unsigned integers, to
-    avoid compiler signed/unsigned warnings. Added (int) casts to unsigned
-    variables that are added to signed variables, to ensure the result is
-    signed and can be negated.
-
-2.  Applied patch by Daniel Richard G for quashing MSVC warnings to the
-    CMake config files.
-
-3.  Revise the creation of config.h.generic so that all boolean macros are
-    #undefined, whereas non-boolean macros are #ifndef/#endif-ed. This makes
-    overriding via -D on the command line possible.
-
-4.  Changing the definition of the variable "op" in pcre_exec.c from pcre_uchar
-    to unsigned int is reported to make a quite noticeable speed difference in
-    a specific Windows environment. Testing on Linux did also appear to show
-    some benefit (and it is clearly not harmful). Also fixed the definition of
-    Xop which should be unsigned.
-
-5.  Related to (4), changing the definition of the intermediate variable cc
-    in repeated character loops from pcre_uchar to pcre_uint32 also gave speed
-    improvements.
-
-6.  Fix forward search in JIT when link size is 3 or greater. Also removed some
-    unnecessary spaces.
-
-7.  Adjust autogen.sh and configure.ac to lose warnings given by automake 1.12
-    and later.
-
-8.  Fix two buffer over read issues in 16 and 32 bit modes. Affects JIT only.
-
-9.  Optimizing fast_forward_start_bits in JIT.
-
-10. Adding support for callouts in JIT, and fixing some issues revealed
-    during this work. Namely:
-
-    (a) Unoptimized capturing brackets incorrectly reset on backtrack.
-
-    (b) Minimum length was not checked before the matching is started.
-
-11. The value of capture_last that is passed to callouts was incorrect in some
-    cases when there was a capture on one path that was subsequently abandoned
-    after a backtrack. Also, the capture_last value is now reset after a
-    recursion, since all captures are also reset in this case.
-
-12. The interpreter no longer returns the "too many substrings" error in the
-    case when an overflowing capture is in a branch that is subsequently
-    abandoned after a backtrack.
-
-13. In the pathological case when an offset vector of size 2 is used, pcretest
-    now prints out the matched string after a yield of 0 or 1.
-
-14. Inlining subpatterns in recursions, when certain conditions are fulfilled.
-    Only supported by the JIT compiler at the moment.
-
-15. JIT compiler now supports 32 bit Macs thanks to Lawrence Velazquez.
-
-16. Partial matches now set offsets[2] to the "bumpalong" value, that is, the
-    offset of the starting point of the matching process, provided the offsets
-    vector is large enough.
-
-17. The \A escape now records a lookbehind value of 1, though its execution
-    does not actually inspect the previous character. This is to ensure that,
-    in partial multi-segment matching, at least one character from the old
-    segment is retained when a new segment is processed. Otherwise, if there
-    are no lookbehinds in the pattern, \A might match incorrectly at the start
-    of a new segment.
-
-18. Added some #ifdef __VMS code into pcretest.c to help VMS implementations.
-
-19. Redefined some pcre_uchar variables in pcre_exec.c as pcre_uint32; this
-    gives some modest performance improvement in 8-bit mode.
-
-20. Added the PCRE-specific property \p{Xuc} for matching characters that can
-    be expressed in certain programming languages using Universal Character
-    Names.
-
-21. Unicode validation has been updated in the light of Unicode Corrigendum #9,
-    which points out that "non characters" are not "characters that may not
-    appear in Unicode strings" but rather "characters that are reserved for
-    internal use and have only local meaning".
-
-22. When a pattern was compiled with automatic callouts (PCRE_AUTO_CALLOUT) and
-    there was a conditional group that depended on an assertion, if the
-    assertion was false, the callout that immediately followed the alternation
-    in the condition was skipped when pcre_exec() was used for matching.
-
-23. Allow an explicit callout to be inserted before an assertion that is the
-    condition for a conditional group, for compatibility with automatic
-    callouts, which always insert a callout at this point.
-
-24. In 8.31, (*COMMIT) was confined to within a recursive subpattern. Perl also
-    confines (*SKIP) and (*PRUNE) in the same way, and this has now been done.
-
-25. (*PRUNE) is now supported by the JIT compiler.
-
-26. Fix infinite loop when /(?<=(*SKIP)ac)a/ is matched against aa.
-
-27. Fix the case where there are two or more SKIPs with arguments that may be
-    ignored.
-
-28. (*SKIP) is now supported by the JIT compiler.
-
-29. (*THEN) is now supported by the JIT compiler.
-
-30. Update RunTest with additional test selector options.
-
-31. The way PCRE handles backtracking verbs has been changed in two ways.
-
-    (1) Previously, in something like (*COMMIT)(*SKIP), COMMIT would override
-    SKIP. Now, PCRE acts on whichever backtracking verb is reached first by
-    backtracking. In some cases this makes it more Perl-compatible, but Perl's
-    rather obscure rules do not always do the same thing.
-
-    (2) Previously, backtracking verbs were confined within assertions. This is
-    no longer the case for positive assertions, except for (*ACCEPT). Again,
-    this sometimes improves Perl compatibility, and sometimes does not.
-
-32. A number of tests that were in test 2 because Perl did things differently
-    have been moved to test 1, because either Perl or PCRE has changed, and
-    these tests are now compatible.
-
-32. Backtracking control verbs are now handled in the same way in JIT and
-    interpreter.
-
-33. An opening parenthesis in a MARK/PRUNE/SKIP/THEN name in a pattern that
-    contained a forward subroutine reference caused a compile error.
-
-34. Auto-detect and optimize limited repetitions in JIT.
-
-35. Implement PCRE_NEVER_UTF to lock out the use of UTF, in particular,
-    blocking (*UTF) etc.
-
-36. In the interpreter, maximizing pattern repetitions for characters and
-    character types now use tail recursion, which reduces stack usage.
-
-37. The value of the max lookbehind was not correctly preserved if a compiled
-    and saved regex was reloaded on a host of different endianness.
-
-38. Implemented (*LIMIT_MATCH) and (*LIMIT_RECURSION). As part of the extension
-    of the compiled pattern block, expand the flags field from 16 to 32 bits
-    because it was almost full.
-
-39. Try madvise first before posix_madvise.
-
-40. Change 7 for PCRE 7.9 made it impossible for pcregrep to find empty lines
-    with a pattern such as ^$. It has taken 4 years for anybody to notice! The
-    original change locked out all matches of empty strings. This has been
-    changed so that one match of an empty string per line is recognized.
-    Subsequent searches on the same line (for colouring or for --only-matching,
-    for example) do not recognize empty strings.
-
-41. Applied a user patch to fix a number of spelling mistakes in comments.
-
-42. Data lines longer than 65536 caused pcretest to crash.
-
-43. Clarified the data type for length and startoffset arguments for pcre_exec
-    and pcre_dfa_exec in the function-specific man pages, where they were
-    explicitly stated to be in bytes, never having been updated. I also added
-    some clarification to the pcreapi man page.
-
-44. A call to pcre_dfa_exec() with an output vector size less than 2 caused
-    a segmentation fault.
-
-
-Version 8.32 30-November-2012
------------------------------
-
-1.  Improved JIT compiler optimizations for first character search and single
-    character iterators.
-
-2.  Supporting IBM XL C compilers for PPC architectures in the JIT compiler.
-    Patch by Daniel Richard G.
-
-3.  Single character iterator optimizations in the JIT compiler.
-
-4.  Improved JIT compiler optimizations for character ranges.
-
-5.  Rename the "leave" variable names to "quit" to improve WinCE compatibility.
-    Reported by Giuseppe D'Angelo.
-
-6.  The PCRE_STARTLINE bit, indicating that a match can occur only at the start
-    of a line, was being set incorrectly in cases where .* appeared inside
-    atomic brackets at the start of a pattern, or where there was a subsequent
-    *PRUNE or *SKIP.
-
-7.  Improved instruction cache flush for POWER/PowerPC.
-    Patch by Daniel Richard G.
-
-8.  Fixed a number of issues in pcregrep, making it more compatible with GNU
-    grep:
-
-    (a) There is now no limit to the number of patterns to be matched.
-
-    (b) An error is given if a pattern is too long.
-
-    (c) Multiple uses of --exclude, --exclude-dir, --include, and --include-dir
-        are now supported.
-
-    (d) --exclude-from and --include-from (multiple use) have been added.
-
-    (e) Exclusions and inclusions now apply to all files and directories, not
-        just to those obtained from scanning a directory recursively.
-
-    (f) Multiple uses of -f and --file-list are now supported.
-
-    (g) In a Windows environment, the default for -d has been changed from
-        "read" (the GNU grep default) to "skip", because otherwise the presence
-        of a directory in the file list provokes an error.
-
-    (h) The documentation has been revised and clarified in places.
-
-9.  Improve the matching speed of capturing brackets.
-
-10. Changed the meaning of \X so that it now matches a Unicode extended
-    grapheme cluster.
-
-11. Patch by Daniel Richard G to the autoconf files to add a macro for sorting
-    out POSIX threads when JIT support is configured.
-
-12. Added support for PCRE_STUDY_EXTRA_NEEDED.
-
-13. In the POSIX wrapper regcomp() function, setting re_nsub field in the preg
-    structure could go wrong in environments where size_t is not the same size
-    as int.
-
-14. Applied user-supplied patch to pcrecpp.cc to allow PCRE_NO_UTF8_CHECK to be
-    set.
-
-15. The EBCDIC support had decayed; later updates to the code had included
-    explicit references to (e.g.) \x0a instead of CHAR_LF. There has been a
-    general tidy up of EBCDIC-related issues, and the documentation was also
-    not quite right. There is now a test that can be run on ASCII systems to
-    check some of the EBCDIC-related things (but is it not a full test).
-
-16. The new PCRE_STUDY_EXTRA_NEEDED option is now used by pcregrep, resulting
-    in a small tidy to the code.
-
-17. Fix JIT tests when UTF is disabled and both 8 and 16 bit mode are enabled.
-
-18. If the --only-matching (-o) option in pcregrep is specified multiple
-    times, each one causes appropriate output. For example, -o1 -o2 outputs the
-    substrings matched by the 1st and 2nd capturing parentheses. A separating
-    string can be specified by --om-separator (default empty).
-
-19. Improving the first n character searches.
-
-20. Turn case lists for horizontal and vertical white space into macros so that
-    they are defined only once.
-
-21. This set of changes together give more compatible Unicode case-folding
-    behaviour for characters that have more than one other case when UCP
-    support is available.
-
-    (a) The Unicode property table now has offsets into a new table of sets of
-        three or more characters that are case-equivalent. The MultiStage2.py
-        script that generates these tables (the pcre_ucd.c file) now scans
-        CaseFolding.txt instead of UnicodeData.txt for character case
-        information.
-
-    (b) The code for adding characters or ranges of characters to a character
-        class has been abstracted into a generalized function that also handles
-        case-independence. In UTF-mode with UCP support, this uses the new data
-        to handle characters with more than one other case.
-
-    (c) A bug that is fixed as a result of (b) is that codepoints less than 256
-        whose other case is greater than 256 are now correctly matched
-        caselessly. Previously, the high codepoint matched the low one, but not
-        vice versa.
-
-    (d) The processing of \h, \H, \v, and \ in character classes now makes use
-        of the new class addition function, using character lists defined as
-        macros alongside the case definitions of 20 above.
-
-    (e) Caseless back references now work with characters that have more than
-        one other case.
-
-    (f) General caseless matching of characters with more than one other case
-        is supported.
-
-22. Unicode character properties were updated from Unicode 6.2.0
-
-23. Improved CMake support under Windows. Patch by Daniel Richard G.
-
-24. Add support for 32-bit character strings, and UTF-32
-
-25. Major JIT compiler update (code refactoring and bugfixing).
-    Experimental Sparc 32 support is added.
-
-26. Applied a modified version of Daniel Richard G's patch to create
-    pcre.h.generic and config.h.generic by "make" instead of in the
-    PrepareRelease script.
-
-27. Added a definition for CHAR_NULL (helpful for the z/OS port), and use it in
-    pcre_compile.c when checking for a zero character.
-
-28. Introducing a native interface for JIT. Through this interface, the compiled
-    machine code can be directly executed. The purpose of this interface is to
-    provide fast pattern matching, so several sanity checks are not performed.
-    However, feature tests are still performed. The new interface provides
-    1.4x speedup compared to the old one.
-
-29. If pcre_exec() or pcre_dfa_exec() was called with a negative value for
-    the subject string length, the error given was PCRE_ERROR_BADOFFSET, which
-    was confusing. There is now a new error PCRE_ERROR_BADLENGTH for this case.
-
-30. In 8-bit UTF-8 mode, pcretest failed to give an error for data codepoints
-    greater than 0x7fffffff (which cannot be represented in UTF-8, even under
-    the "old" RFC 2279). Instead, it ended up passing a negative length to
-    pcre_exec().
-
-31. Add support for GCC's visibility feature to hide internal functions.
-
-32. Running "pcretest -C pcre8" or "pcretest -C pcre16" gave a spurious error
-    "unknown -C option" after outputting 0 or 1.
-
-33. There is now support for generating a code coverage report for the test
-    suite in environments where gcc is the compiler and lcov is installed. This
-    is mainly for the benefit of the developers.
-
-34. If PCRE is built with --enable-valgrind, certain memory regions are marked
-    unaddressable using valgrind annotations, allowing valgrind to detect
-    invalid memory accesses. This is mainly for the benefit of the developers.
-
-25. (*UTF) can now be used to start a pattern in any of the three libraries.
-
-26. Give configure error if --enable-cpp but no C++ compiler found.
-
-
-Version 8.31 06-July-2012
--------------------------
-
-1.  Fixing a wrong JIT test case and some compiler warnings.
-
-2.  Removed a bashism from the RunTest script.
-
-3.  Add a cast to pcre_exec.c to fix the warning "unary minus operator applied
-    to unsigned type, result still unsigned" that was given by an MS compiler
-    on encountering the code "-sizeof(xxx)".
-
-4.  Partial matching support is added to the JIT compiler.
-
-5.  Fixed several bugs concerned with partial matching of items that consist
-    of more than one character:
-
-    (a) /^(..)\1/ did not partially match "aba" because checking references was
-        done on an "all or nothing" basis. This also applied to repeated
-        references.
-
-    (b) \R did not give a hard partial match if \r was found at the end of the
-        subject.
-
-    (c) \X did not give a hard partial match after matching one or more
-        characters at the end of the subject.
-
-    (d) When newline was set to CRLF, a pattern such as /a$/ did not recognize
-        a partial match for the string "\r".
-
-    (e) When newline was set to CRLF, the metacharacter "." did not recognize
-        a partial match for a CR character at the end of the subject string.
-
-6.  If JIT is requested using /S++ or -s++ (instead of just /S+ or -s+) when
-    running pcretest, the text "(JIT)" added to the output whenever JIT is
-    actually used to run the match.
-
-7.  Individual JIT compile options can be set in pcretest by following -s+[+]
-    or /S+[+] with a digit between 1 and 7.
-
-8.  OP_NOT now supports any UTF character not just single-byte ones.
-
-9.  (*MARK) control verb is now supported by the JIT compiler.
-
-10. The command "./RunTest list" lists the available tests without actually
-    running any of them. (Because I keep forgetting what they all are.)
-
-11. Add PCRE_INFO_MAXLOOKBEHIND.
-
-12. Applied a (slightly modified) user-supplied patch that improves performance
-    when the heap is used for recursion (compiled with --disable-stack-for-
-    recursion). Instead of malloc and free for each heap frame each time a
-    logical recursion happens, frames are retained on a chain and re-used where
-    possible. This sometimes gives as much as 30% improvement.
-
-13. As documented, (*COMMIT) is now confined to within a recursive subpattern
-    call.
-
-14. As documented, (*COMMIT) is now confined to within a positive assertion.
-
-15. It is now possible to link pcretest with libedit as an alternative to
-    libreadline.
-
-16. (*COMMIT) control verb is now supported by the JIT compiler.
-
-17. The Unicode data tables have been updated to Unicode 6.1.0.
-
-18. Added --file-list option to pcregrep.
-
-19. Added binary file support to pcregrep, including the -a, --binary-files,
-    -I, and --text options.
-
-20. The madvise function is renamed for posix_madvise for QNX compatibility
-    reasons. Fixed by Giuseppe D'Angelo.
-
-21. Fixed a bug for backward assertions with REVERSE 0 in the JIT compiler.
-
-22. Changed the option for creating symbolic links for 16-bit man pages from
-    -s to -sf so that re-installing does not cause issues.
-
-23. Support PCRE_NO_START_OPTIMIZE in JIT as (*MARK) support requires it.
-
-24. Fixed a very old bug in pcretest that caused errors with restarted DFA
-    matches in certain environments (the workspace was not being correctly
-    retained). Also added to pcre_dfa_exec() a simple plausibility check on
-    some of the workspace data at the beginning of a restart.
-
-25. \s*\R was auto-possessifying the \s* when it should not, whereas \S*\R
-    was not doing so when it should - probably a typo introduced by SVN 528
-    (change 8.10/14).
-
-26. When PCRE_UCP was not set, \w+\x{c4} was incorrectly auto-possessifying the
-    \w+ when the character tables indicated that \x{c4} was a word character.
-    There were several related cases, all because the tests for doing a table
-    lookup were testing for characters less than 127 instead of 255.
-
-27. If a pattern contains capturing parentheses that are not used in a match,
-    their slots in the ovector are set to -1. For those that are higher than
-    any matched groups, this happens at the end of processing. In the case when
-    there were back references that the ovector was too small to contain
-    (causing temporary malloc'd memory to be used during matching), and the
-    highest capturing number was not used, memory off the end of the ovector
-    was incorrectly being set to -1. (It was using the size of the temporary
-    memory instead of the true size.)
-
-28. To catch bugs like 27 using valgrind, when pcretest is asked to specify an
-    ovector size, it uses memory at the end of the block that it has got.
-
-29. Check for an overlong MARK name and give an error at compile time. The
-    limit is 255 for the 8-bit library and 65535 for the 16-bit library.
-
-30. JIT compiler update.
-
-31. JIT is now supported on jailbroken iOS devices. Thanks for Ruiger
-    Rill for the patch.
-
-32. Put spaces around SLJIT_PRINT_D in the JIT compiler. Required by CXX11.
-
-33. Variable renamings in the PCRE-JIT compiler. No functionality change.
-
-34. Fixed typos in pcregrep: in two places there was SUPPORT_LIBZ2 instead of
-    SUPPORT_LIBBZ2. This caused a build problem when bzip2 but not gzip (zlib)
-    was enabled.
-
-35. Improve JIT code generation for greedy plus quantifier.
-
-36. When /((?:a?)*)*c/ or /((?>a?)*)*c/ was matched against "aac", it set group
-    1 to "aa" instead of to an empty string. The bug affected repeated groups
-    that could potentially match an empty string.
-
-37. Optimizing single character iterators in JIT.
-
-38. Wide characters specified with \uxxxx in JavaScript mode are now subject to
-    the same checks as \x{...} characters in non-JavaScript mode. Specifically,
-    codepoints that are too big for the mode are faulted, and in a UTF mode,
-    disallowed codepoints are also faulted.
-
-39. If PCRE was compiled with UTF support, in three places in the DFA
-    matcher there was code that should only have been obeyed in UTF mode, but
-    was being obeyed unconditionally. In 8-bit mode this could cause incorrect
-    processing when bytes with values greater than 127 were present. In 16-bit
-    mode the bug would be provoked by values in the range 0xfc00 to 0xdc00. In
-    both cases the values are those that cannot be the first data item in a UTF
-    character. The three items that might have provoked this were recursions,
-    possessively repeated groups, and atomic groups.
-
-40. Ensure that libpcre is explicitly listed in the link commands for pcretest
-    and pcregrep, because some OS require shared objects to be explicitly
-    passed to ld, causing the link step to fail if they are not.
-
-41. There were two incorrect #ifdefs in pcre_study.c, meaning that, in 16-bit
-    mode, patterns that started with \h* or \R* might be incorrectly matched.
-
-
-Version 8.30 04-February-2012
------------------------------
-
-1.  Renamed "isnumber" as "is_a_number" because in some Mac environments this
-    name is defined in ctype.h.
-
-2.  Fixed a bug in fixed-length calculation for lookbehinds that would show up
-    only in quite long subpatterns.
-
-3.  Removed the function pcre_info(), which has been obsolete and deprecated
-    since it was replaced by pcre_fullinfo() in February 2000.
-
-4.  For a non-anchored pattern, if (*SKIP) was given with a name that did not
-    match a (*MARK), and the match failed at the start of the subject, a
-    reference to memory before the start of the subject could occur. This bug
-    was introduced by fix 17 of release 8.21.
-
-5.  A reference to an unset group with zero minimum repetition was giving
-    totally wrong answers (in non-JavaScript-compatibility mode). For example,
-    /(another)?(\1?)test/ matched against "hello world test". This bug was
-    introduced in release 8.13.
-
-6.  Add support for 16-bit character strings (a large amount of work involving
-    many changes and refactorings).
-
-7.  RunGrepTest failed on msys because \r\n was replaced by whitespace when the
-    command "pattern=`printf 'xxx\r\njkl'`" was run. The pattern is now taken
-    from a file.
-
-8.  Ovector size of 2 is also supported by JIT based pcre_exec (the ovector size
-    rounding is not applied in this particular case).
-
-9.  The invalid Unicode surrogate codepoints U+D800 to U+DFFF are now rejected
-    if they appear, or are escaped, in patterns.
-
-10. Get rid of a number of -Wunused-but-set-variable warnings.
-
-11. The pattern /(?=(*:x))(q|)/ matches an empty string, and returns the mark
-    "x". The similar pattern /(?=(*:x))((*:y)q|)/ did not return a mark at all.
-    Oddly, Perl behaves the same way. PCRE has been fixed so that this pattern
-    also returns the mark "x". This bug applied to capturing parentheses,
-    non-capturing parentheses, and atomic parentheses. It also applied to some
-    assertions.
-
-12. Stephen Kelly's patch to CMakeLists.txt allows it to parse the version
-    information out of configure.ac instead of relying on pcre.h.generic, which
-    is not stored in the repository.
-
-13. Applied Dmitry V. Levin's patch for a more portable method for linking with
-    -lreadline.
-
-14. ZH added PCRE_CONFIG_JITTARGET; added its output to pcretest -C.
-
-15. Applied Graycode's patch to put the top-level frame on the stack rather
-    than the heap when not using the stack for recursion. This gives a
-    performance improvement in many cases when recursion is not deep.
-
-16. Experimental code added to "pcretest -C" to output the stack frame size.
-
-
-Version 8.21 12-Dec-2011
-------------------------
-
-1.  Updating the JIT compiler.
-
-2.  JIT compiler now supports OP_NCREF, OP_RREF and OP_NRREF. New test cases
-    are added as well.
-
-3.  Fix cache-flush issue on PowerPC (It is still an experimental JIT port).
-    PCRE_EXTRA_TABLES is not suported by JIT, and should be checked before
-    calling _pcre_jit_exec. Some extra comments are added.
-
-4.  (*MARK) settings inside atomic groups that do not contain any capturing
-    parentheses, for example, (?>a(*:m)), were not being passed out. This bug
-    was introduced by change 18 for 8.20.
-
-5.  Supporting of \x, \U and \u in JavaScript compatibility mode based on the
-    ECMA-262 standard.
-
-6.  Lookbehinds such as (?<=a{2}b) that contained a fixed repetition were
-    erroneously being rejected as "not fixed length" if PCRE_CASELESS was set.
-    This bug was probably introduced by change 9 of 8.13.
-
-7.  While fixing 6 above, I noticed that a number of other items were being
-    incorrectly rejected as "not fixed length". This arose partly because newer
-    opcodes had not been added to the fixed-length checking code. I have (a)
-    corrected the bug and added tests for these items, and (b) arranged for an
-    error to occur if an unknown opcode is encountered while checking for fixed
-    length instead of just assuming "not fixed length". The items that were
-    rejected were: (*ACCEPT), (*COMMIT), (*FAIL), (*MARK), (*PRUNE), (*SKIP),
-    (*THEN), \h, \H, \v, \V, and single character negative classes with fixed
-    repetitions, e.g. [^a]{3}, with and without PCRE_CASELESS.
-
-8.  A possessively repeated conditional subpattern such as (?(?=c)c|d)++ was
-    being incorrectly compiled and would have given unpredicatble results.
-
-9.  A possessively repeated subpattern with minimum repeat count greater than
-    one behaved incorrectly. For example, (A){2,}+ behaved as if it was
-    (A)(A)++ which meant that, after a subsequent mismatch, backtracking into
-    the first (A) could occur when it should not.
-
-10. Add a cast and remove a redundant test from the code.
-
-11. JIT should use pcre_malloc/pcre_free for allocation.
-
-12. Updated pcre-config so that it no longer shows -L/usr/lib, which seems
-    best practice nowadays, and helps with cross-compiling. (If the exec_prefix
-    is anything other than /usr, -L is still shown).
-
-13. In non-UTF-8 mode, \C is now supported in lookbehinds and DFA matching.
-
-14. Perl does not support \N without a following name in a [] class; PCRE now
-    also gives an error.
-
-15. If a forward reference was repeated with an upper limit of around 2000,
-    it caused the error "internal error: overran compiling workspace". The
-    maximum number of forward references (including repeats) was limited by the
-    internal workspace, and dependent on the LINK_SIZE. The code has been
-    rewritten so that the workspace expands (via pcre_malloc) if necessary, and
-    the default depends on LINK_SIZE. There is a new upper limit (for safety)
-    of around 200,000 forward references. While doing this, I also speeded up
-    the filling in of repeated forward references.
-
-16. A repeated forward reference in a pattern such as (a)(?2){2}(.) was
-    incorrectly expecting the subject to contain another "a" after the start.
-
-17. When (*SKIP:name) is activated without a corresponding (*MARK:name) earlier
-    in the match, the SKIP should be ignored. This was not happening; instead
-    the SKIP was being treated as NOMATCH. For patterns such as
-    /A(*MARK:A)A+(*SKIP:B)Z|AAC/ this meant that the AAC branch was never
-    tested.
-
-18. The behaviour of (*MARK), (*PRUNE), and (*THEN) has been reworked and is
-    now much more compatible with Perl, in particular in cases where the result
-    is a non-match for a non-anchored pattern. For example, if
-    /b(*:m)f|a(*:n)w/ is matched against "abc", the non-match returns the name
-    "m", where previously it did not return a name. A side effect of this
-    change is that for partial matches, the last encountered mark name is
-    returned, as for non matches. A number of tests that were previously not
-    Perl-compatible have been moved into the Perl-compatible test files. The
-    refactoring has had the pleasing side effect of removing one argument from
-    the match() function, thus reducing its stack requirements.
-
-19. If the /S+ option was used in pcretest to study a pattern using JIT,
-    subsequent uses of /S (without +) incorrectly behaved like /S+.
-
-21. Retrieve executable code size support for the JIT compiler and fixing
-    some warnings.
-
-22. A caseless match of a UTF-8 character whose other case uses fewer bytes did
-    not work when the shorter character appeared right at the end of the
-    subject string.
-
-23. Added some (int) casts to non-JIT modules to reduce warnings on 64-bit
-    systems.
-
-24. Added PCRE_INFO_JITSIZE to pass on the value from (21) above, and also
-    output it when the /M option is used in pcretest.
-
-25. The CheckMan script was not being included in the distribution. Also, added
-    an explicit "perl" to run Perl scripts from the PrepareRelease script
-    because this is reportedly needed in Windows.
-
-26. If study data was being save in a file and studying had not found a set of
-    "starts with" bytes for the pattern, the data written to the file (though
-    never used) was taken from uninitialized memory and so caused valgrind to
-    complain.
-
-27. Updated RunTest.bat as provided by Sheri Pierce.
-
-28. Fixed a possible uninitialized memory bug in pcre_jit_compile.c.
-
-29. Computation of memory usage for the table of capturing group names was
-    giving an unnecessarily large value.
-
-
-Version 8.20 21-Oct-2011
-------------------------
-
-1.  Change 37 of 8.13 broke patterns like [:a]...[b:] because it thought it had
-    a POSIX class. After further experiments with Perl, which convinced me that
-    Perl has bugs and confusions, a closing square bracket is no longer allowed
-    in a POSIX name. This bug also affected patterns with classes that started
-    with full stops.
-
-2.  If a pattern such as /(a)b|ac/ is matched against "ac", there is no
-    captured substring, but while checking the failing first alternative,
-    substring 1 is temporarily captured. If the output vector supplied to
-    pcre_exec() was not big enough for this capture, the yield of the function
-    was still zero ("insufficient space for captured substrings"). This cannot
-    be totally fixed without adding another stack variable, which seems a lot
-    of expense for a edge case. However, I have improved the situation in cases
-    such as /(a)(b)x|abc/ matched against "abc", where the return code
-    indicates that fewer than the maximum number of slots in the ovector have
-    been set.
-
-3.  Related to (2) above: when there are more back references in a pattern than
-    slots in the output vector, pcre_exec() uses temporary memory during
-    matching, and copies in the captures as far as possible afterwards. It was
-    using the entire output vector, but this conflicts with the specification
-    that only 2/3 is used for passing back captured substrings. Now it uses
-    only the first 2/3, for compatibility. This is, of course, another edge
-    case.
-
-4.  Zoltan Herczeg's just-in-time compiler support has been integrated into the
-    main code base, and can be used by building with --enable-jit. When this is
-    done, pcregrep automatically uses it unless --disable-pcregrep-jit or the
-    runtime --no-jit option is given.
-
-5.  When the number of matches in a pcre_dfa_exec() run exactly filled the
-    ovector, the return from the function was zero, implying that there were
-    other matches that did not fit. The correct "exactly full" value is now
-    returned.
-
-6.  If a subpattern that was called recursively or as a subroutine contained
-    (*PRUNE) or any other control that caused it to give a non-standard return,
-    invalid errors such as "Error -26 (nested recursion at the same subject
-    position)" or even infinite loops could occur.
-
-7.  If a pattern such as /a(*SKIP)c|b(*ACCEPT)|/ was studied, it stopped
-    computing the minimum length on reaching *ACCEPT, and so ended up with the
-    wrong value of 1 rather than 0. Further investigation indicates that
-    computing a minimum subject length in the presence of *ACCEPT is difficult
-    (think back references, subroutine calls), and so I have changed the code
-    so that no minimum is registered for a pattern that contains *ACCEPT.
-
-8.  If (*THEN) was present in the first (true) branch of a conditional group,
-    it was not handled as intended. [But see 16 below.]
-
-9.  Replaced RunTest.bat and CMakeLists.txt with improved versions provided by
-    Sheri Pierce.
-
-10. A pathological pattern such as /(*ACCEPT)a/ was miscompiled, thinking that
-    the first byte in a match must be "a".
-
-11. Change 17 for 8.13 increased the recursion depth for patterns like
-    /a(?:.)*?a/ drastically. I've improved things by remembering whether a
-    pattern contains any instances of (*THEN). If it does not, the old
-    optimizations are restored. It would be nice to do this on a per-group
-    basis, but at the moment that is not feasible.
-
-12. In some environments, the output of pcretest -C is CRLF terminated. This
-    broke RunTest's code that checks for the link size. A single white space
-    character after the value is now allowed for.
-
-13. RunTest now checks for the "fr" locale as well as for "fr_FR" and "french".
-    For "fr", it uses the Windows-specific input and output files.
-
-14. If (*THEN) appeared in a group that was called recursively or as a
-    subroutine, it did not work as intended. [But see next item.]
-
-15. Consider the pattern /A (B(*THEN)C) | D/ where A, B, C, and D are complex
-    pattern fragments (but not containing any | characters). If A and B are
-    matched, but there is a failure in C so that it backtracks to (*THEN), PCRE
-    was behaving differently to Perl. PCRE backtracked into A, but Perl goes to
-    D. In other words, Perl considers parentheses that do not contain any |
-    characters to be part of a surrounding alternative, whereas PCRE was
-    treading (B(*THEN)C) the same as (B(*THEN)C|(*FAIL)) -- which Perl handles
-    differently. PCRE now behaves in the same way as Perl, except in the case
-    of subroutine/recursion calls such as (?1) which have in any case always
-    been different (but PCRE had them first :-).
-
-16. Related to 15 above: Perl does not treat the | in a conditional group as
-    creating alternatives. Such a group is treated in the same way as an
-    ordinary group without any | characters when processing (*THEN). PCRE has
-    been changed to match Perl's behaviour.
-
-17. If a user had set PCREGREP_COLO(U)R to something other than 1:31, the
-    RunGrepTest script failed.
-
-18. Change 22 for version 13 caused atomic groups to use more stack. This is
-    inevitable for groups that contain captures, but it can lead to a lot of
-    stack use in large patterns. The old behaviour has been restored for atomic
-    groups that do not contain any capturing parentheses.
-
-19. If the PCRE_NO_START_OPTIMIZE option was set for pcre_compile(), it did not
-    suppress the check for a minimum subject length at run time. (If it was
-    given to pcre_exec() or pcre_dfa_exec() it did work.)
-
-20. Fixed an ASCII-dependent infelicity in pcretest that would have made it
-    fail to work when decoding hex characters in data strings in EBCDIC
-    environments.
-
-21. It appears that in at least one Mac OS environment, the isxdigit() function
-    is implemented as a macro that evaluates to its argument more than once,
-    contravening the C 90 Standard (I haven't checked a later standard). There
-    was an instance in pcretest which caused it to go wrong when processing
-    \x{...} escapes in subject strings. The has been rewritten to avoid using
-    things like p++ in the argument of isxdigit().
-
-
-Version 8.13 16-Aug-2011
-------------------------
-
-1.  The Unicode data tables have been updated to Unicode 6.0.0.
-
-2.  Two minor typos in pcre_internal.h have been fixed.
-
-3.  Added #include <string.h> to pcre_scanner_unittest.cc, pcrecpp.cc, and
-    pcrecpp_unittest.cc. They are needed for strcmp(), memset(), and strchr()
-    in some environments (e.g. Solaris 10/SPARC using Sun Studio 12U2).
-
-4.  There were a number of related bugs in the code for matching backrefences
-    caselessly in UTF-8 mode when codes for the characters concerned were
-    different numbers of bytes. For example, U+023A and U+2C65 are an upper
-    and lower case pair, using 2 and 3 bytes, respectively. The main bugs were:
-    (a) A reference to 3 copies of a 2-byte code matched only 2 of a 3-byte
-    code. (b) A reference to 2 copies of a 3-byte code would not match 2 of a
-    2-byte code at the end of the subject (it thought there wasn't enough data
-    left).
-
-5.  Comprehensive information about what went wrong is now returned by
-    pcre_exec() and pcre_dfa_exec() when the UTF-8 string check fails, as long
-    as the output vector has at least 2 elements. The offset of the start of
-    the failing character and a reason code are placed in the vector.
-
-6.  When the UTF-8 string check fails for pcre_compile(), the offset that is
-    now returned is for the first byte of the failing character, instead of the
-    last byte inspected. This is an incompatible change, but I hope it is small
-    enough not to be a problem. It makes the returned offset consistent with
-    pcre_exec() and pcre_dfa_exec().
-
-7.  pcretest now gives a text phrase as well as the error number when
-    pcre_exec() or pcre_dfa_exec() fails; if the error is a UTF-8 check
-    failure, the offset and reason code are output.
-
-8.  When \R was used with a maximizing quantifier it failed to skip backwards
-    over a \r\n pair if the subsequent match failed. Instead, it just skipped
-    back over a single character (\n). This seems wrong (because it treated the
-    two characters as a single entity when going forwards), conflicts with the
-    documentation that \R is equivalent to (?>\r\n|\n|...etc), and makes the
-    behaviour of \R* different to (\R)*, which also seems wrong. The behaviour
-    has been changed.
-
-9.  Some internal refactoring has changed the processing so that the handling
-    of the PCRE_CASELESS and PCRE_MULTILINE options is done entirely at compile
-    time (the PCRE_DOTALL option was changed this way some time ago: version
-    7.7 change 16). This has made it possible to abolish the OP_OPT op code,
-    which was always a bit of a fudge. It also means that there is one less
-    argument for the match() function, which reduces its stack requirements
-    slightly. This change also fixes an incompatibility with Perl: the pattern
-    (?i:([^b]))(?1) should not match "ab", but previously PCRE gave a match.
-
-10. More internal refactoring has drastically reduced the number of recursive
-    calls to match() for possessively repeated groups such as (abc)++ when
-    using pcre_exec().
-
-11. While implementing 10, a number of bugs in the handling of groups were
-    discovered and fixed:
-
-    (?<=(a)+) was not diagnosed as invalid (non-fixed-length lookbehind).
-    (a|)*(?1) gave a compile-time internal error.
-    ((a|)+)+  did not notice that the outer group could match an empty string.
-    (^a|^)+   was not marked as anchored.
-    (.*a|.*)+ was not marked as matching at start or after a newline.
-
-12. Yet more internal refactoring has removed another argument from the match()
-    function. Special calls to this function are now indicated by setting a
-    value in a variable in the "match data" data block.
-
-13. Be more explicit in pcre_study() instead of relying on "default" for
-    opcodes that mean there is no starting character; this means that when new
-    ones are added and accidentally left out of pcre_study(), testing should
-    pick them up.
-
-14. The -s option of pcretest has been documented for ages as being an old
-    synonym of -m (show memory usage). I have changed it to mean "force study
-    for every regex", that is, assume /S for every regex. This is similar to -i
-    and -d etc. It's slightly incompatible, but I'm hoping nobody is still
-    using it. It makes it easier to run collections of tests with and without
-    study enabled, and thereby test pcre_study() more easily. All the standard
-    tests are now run with and without -s (but some patterns can be marked as
-    "never study" - see 20 below).
-
-15. When (*ACCEPT) was used in a subpattern that was called recursively, the
-    restoration of the capturing data to the outer values was not happening
-    correctly.
-
-16. If a recursively called subpattern ended with (*ACCEPT) and matched an
-    empty string, and PCRE_NOTEMPTY was set, pcre_exec() thought the whole
-    pattern had matched an empty string, and so incorrectly returned a no
-    match.
-
-17. There was optimizing code for the last branch of non-capturing parentheses,
-    and also for the obeyed branch of a conditional subexpression, which used
-    tail recursion to cut down on stack usage. Unfortunately, now that there is
-    the possibility of (*THEN) occurring in these branches, tail recursion is
-    no longer possible because the return has to be checked for (*THEN). These
-    two optimizations have therefore been removed. [But see 8.20/11 above.]
-
-18. If a pattern containing \R was studied, it was assumed that \R always
-    matched two bytes, thus causing the minimum subject length to be
-    incorrectly computed because \R can also match just one byte.
-
-19. If a pattern containing (*ACCEPT) was studied, the minimum subject length
-    was incorrectly computed.
-
-20. If /S is present twice on a test pattern in pcretest input, it now
-    *disables* studying, thereby overriding the use of -s on the command line
-    (see 14 above). This is necessary for one or two tests to keep the output
-    identical in both cases.
-
-21. When (*ACCEPT) was used in an assertion that matched an empty string and
-    PCRE_NOTEMPTY was set, PCRE applied the non-empty test to the assertion.
-
-22. When an atomic group that contained a capturing parenthesis was
-    successfully matched, but the branch in which it appeared failed, the
-    capturing was not being forgotten if a higher numbered group was later
-    captured. For example, /(?>(a))b|(a)c/ when matching "ac" set capturing
-    group 1 to "a", when in fact it should be unset. This applied to multi-
-    branched capturing and non-capturing groups, repeated or not, and also to
-    positive assertions (capturing in negative assertions does not happen
-    in PCRE) and also to nested atomic groups.
-
-23. Add the ++ qualifier feature to pcretest, to show the remainder of the
-    subject after a captured substring, to make it easier to tell which of a
-    number of identical substrings has been captured.
-
-24. The way atomic groups are processed by pcre_exec() has been changed so that
-    if they are repeated, backtracking one repetition now resets captured
-    values correctly. For example, if ((?>(a+)b)+aabab) is matched against
-    "aaaabaaabaabab" the value of captured group 2 is now correctly recorded as
-    "aaa". Previously, it would have been "a". As part of this code
-    refactoring, the way recursive calls are handled has also been changed.
-
-25. If an assertion condition captured any substrings, they were not passed
-    back unless some other capturing happened later. For example, if
-    (?(?=(a))a) was matched against "a", no capturing was returned.
-
-26. When studying a pattern that contained subroutine calls or assertions,
-    the code for finding the minimum length of a possible match was handling
-    direct recursions such as (xxx(?1)|yyy) but not mutual recursions (where
-    group 1 called group 2 while simultaneously a separate group 2 called group
-    1). A stack overflow occurred in this case. I have fixed this by limiting
-    the recursion depth to 10.
-
-27. Updated RunTest.bat in the distribution to the version supplied by Tom
-    Fortmann. This supports explicit test numbers on the command line, and has
-    argument validation and error reporting.
-
-28. An instance of \X with an unlimited repeat could fail if at any point the
-    first character it looked at was a mark character.
-
-29. Some minor code refactoring concerning Unicode properties and scripts
-    should reduce the stack requirement of match() slightly.
-
-30. Added the '=' option to pcretest to check the setting of unused capturing
-    slots at the end of the pattern, which are documented as being -1, but are
-    not included in the return count.
-
-31. If \k was not followed by a braced, angle-bracketed, or quoted name, PCRE
-    compiled something random. Now it gives a compile-time error (as does
-    Perl).
-
-32. A *MARK encountered during the processing of a positive assertion is now
-    recorded and passed back (compatible with Perl).
-
-33. If --only-matching or --colour was set on a pcregrep call whose pattern
-    had alternative anchored branches, the search for a second match in a line
-    was done as if at the line start. Thus, for example, /^01|^02/ incorrectly
-    matched the line "0102" twice. The same bug affected patterns that started
-    with a backwards assertion. For example /\b01|\b02/ also matched "0102"
-    twice.
-
-34. Previously, PCRE did not allow quantification of assertions. However, Perl
-    does, and because of capturing effects, quantifying parenthesized
-    assertions may at times be useful. Quantifiers are now allowed for
-    parenthesized assertions.
-
-35. A minor code tidy in pcre_compile() when checking options for \R usage.
-
-36. \g was being checked for fancy things in a character class, when it should
-    just be a literal "g".
-
-37. PCRE was rejecting [:a[:digit:]] whereas Perl was not. It seems that the
-    appearance of a nested POSIX class supersedes an apparent external class.
-    For example, [:a[:digit:]b:] matches "a", "b", ":", or a digit. Also,
-    unescaped square brackets may also appear as part of class names. For
-    example, [:a[:abc]b:] gives unknown class "[:abc]b:]". PCRE now behaves
-    more like Perl. (But see 8.20/1 above.)
-
-38. PCRE was giving an error for \N with a braced quantifier such as {1,} (this
-    was because it thought it was \N{name}, which is not supported).
-
-39. Add minix to OS list not supporting the -S option in pcretest.
-
-40. PCRE tries to detect cases of infinite recursion at compile time, but it
-    cannot analyze patterns in sufficient detail to catch mutual recursions
-    such as ((?1))((?2)). There is now a runtime test that gives an error if a
-    subgroup is called recursively as a subpattern for a second time at the
-    same position in the subject string. In previous releases this might have
-    been caught by the recursion limit, or it might have run out of stack.
-
-41. A pattern such as /(?(R)a+|(?R)b)/ is quite safe, as the recursion can
-    happen only once. PCRE was, however incorrectly giving a compile time error
-    "recursive call could loop indefinitely" because it cannot analyze the
-    pattern in sufficient detail. The compile time test no longer happens when
-    PCRE is compiling a conditional subpattern, but actual runaway loops are
-    now caught at runtime (see 40 above).
-
-42. It seems that Perl allows any characters other than a closing parenthesis
-    to be part of the NAME in (*MARK:NAME) and other backtracking verbs. PCRE
-    has been changed to be the same.
-
-43. Updated configure.ac to put in more quoting round AC_LANG_PROGRAM etc. so
-    as not to get warnings when autogen.sh is called. Also changed
-    AC_PROG_LIBTOOL (deprecated) to LT_INIT (the current macro).
-
-44. To help people who use pcregrep to scan files containing exceedingly long
-    lines, the following changes have been made:
-
-    (a) The default value of the buffer size parameter has been increased from
-        8K to 20K. (The actual buffer used is three times this size.)
-
-    (b) The default can be changed by ./configure --with-pcregrep-bufsize when
-        PCRE is built.
-
-    (c) A --buffer-size=n option has been added to pcregrep, to allow the size
-        to be set at run time.
-
-    (d) Numerical values in pcregrep options can be followed by K or M, for
-        example --buffer-size=50K.
-
-    (e) If a line being scanned overflows pcregrep's buffer, an error is now
-        given and the return code is set to 2.
-
-45. Add a pointer to the latest mark to the callout data block.
-
-46. The pattern /.(*F)/, when applied to "abc" with PCRE_PARTIAL_HARD, gave a
-    partial match of an empty string instead of no match. This was specific to
-    the use of ".".
-
-47. The pattern /f.*/8s, when applied to "for" with PCRE_PARTIAL_HARD, gave a
-    complete match instead of a partial match. This bug was dependent on both
-    the PCRE_UTF8 and PCRE_DOTALL options being set.
-
-48. For a pattern such as /\babc|\bdef/ pcre_study() was failing to set up the
-    starting byte set, because \b was not being ignored.
-
-
-Version 8.12 15-Jan-2011
-------------------------
-
-1.  Fixed some typos in the markup of the man pages, and wrote a script that
-    checks for such things as part of the documentation building process.
-
-2.  On a big-endian 64-bit system, pcregrep did not correctly process the
-    --match-limit and --recursion-limit options (added for 8.11). In
-    particular, this made one of the standard tests fail. (The integer value
-    went into the wrong half of a long int.)
-
-3.  If the --colour option was given to pcregrep with -v (invert match), it
-    did strange things, either producing crazy output, or crashing. It should,
-    of course, ignore a request for colour when reporting lines that do not
-    match.
-
-4.  Another pcregrep bug caused similar problems if --colour was specified with
-    -M (multiline) and the pattern match finished with a line ending.
-
-5.  In pcregrep, when a pattern that ended with a literal newline sequence was
-    matched in multiline mode, the following line was shown as part of the
-    match. This seems wrong, so I have changed it.
-
-6.  Another pcregrep bug in multiline mode, when --colour was specified, caused
-    the check for further matches in the same line (so they could be coloured)
-    to overrun the end of the current line. If another match was found, it was
-    incorrectly shown (and then shown again when found in the next line).
-
-7.  If pcregrep was compiled under Windows, there was a reference to the
-    function pcregrep_exit() before it was defined. I am assuming this was
-    the cause of the "error C2371: 'pcregrep_exit' : redefinition;" that was
-    reported by a user. I've moved the definition above the reference.
-
-
-Version 8.11 10-Dec-2010
-------------------------
-
-1.  (*THEN) was not working properly if there were untried alternatives prior
-    to it in the current branch. For example, in ((a|b)(*THEN)(*F)|c..) it
-    backtracked to try for "b" instead of moving to the next alternative branch
-    at the same level (in this case, to look for "c"). The Perl documentation
-    is clear that when (*THEN) is backtracked onto, it goes to the "next
-    alternative in the innermost enclosing group".
-
-2.  (*COMMIT) was not overriding (*THEN), as it does in Perl. In a pattern
-    such as   (A(*COMMIT)B(*THEN)C|D)  any failure after matching A should
-    result in overall failure. Similarly, (*COMMIT) now overrides (*PRUNE) and
-    (*SKIP), (*SKIP) overrides (*PRUNE) and (*THEN), and (*PRUNE) overrides
-    (*THEN).
-
-3.  If \s appeared in a character class, it removed the VT character from
-    the class, even if it had been included by some previous item, for example
-    in [\x00-\xff\s]. (This was a bug related to the fact that VT is not part
-    of \s, but is part of the POSIX "space" class.)
-
-4.  A partial match never returns an empty string (because you can always
-    match an empty string at the end of the subject); however the checking for
-    an empty string was starting at the "start of match" point. This has been
-    changed to the "earliest inspected character" point, because the returned
-    data for a partial match starts at this character. This means that, for
-    example, /(?<=abc)def/ gives a partial match for the subject "abc"
-    (previously it gave "no match").
-
-5.  Changes have been made to the way PCRE_PARTIAL_HARD affects the matching
-    of $, \z, \Z, \b, and \B. If the match point is at the end of the string,
-    previously a full match would be given. However, setting PCRE_PARTIAL_HARD
-    has an implication that the given string is incomplete (because a partial
-    match is preferred over a full match). For this reason, these items now
-    give a partial match in this situation. [Aside: previously, the one case
-    /t\b/ matched against "cat" with PCRE_PARTIAL_HARD set did return a partial
-    match rather than a full match, which was wrong by the old rules, but is
-    now correct.]
-
-6.  There was a bug in the handling of #-introduced comments, recognized when
-    PCRE_EXTENDED is set, when PCRE_NEWLINE_ANY and PCRE_UTF8 were also set.
-    If a UTF-8 multi-byte character included the byte 0x85 (e.g. +U0445, whose
-    UTF-8 encoding is 0xd1,0x85), this was misinterpreted as a newline when
-    scanning for the end of the comment. (*Character* 0x85 is an "any" newline,
-    but *byte* 0x85 is not, in UTF-8 mode). This bug was present in several
-    places in pcre_compile().
-
-7.  Related to (6) above, when pcre_compile() was skipping #-introduced
-    comments when looking ahead for named forward references to subpatterns,
-    the only newline sequence it recognized was NL. It now handles newlines
-    according to the set newline convention.
-
-8.  SunOS4 doesn't have strerror() or strtoul(); pcregrep dealt with the
-    former, but used strtoul(), whereas pcretest avoided strtoul() but did not
-    cater for a lack of strerror(). These oversights have been fixed.
-
-9.  Added --match-limit and --recursion-limit to pcregrep.
-
-10. Added two casts needed to build with Visual Studio when NO_RECURSE is set.
-
-11. When the -o option was used, pcregrep was setting a return code of 1, even
-    when matches were found, and --line-buffered was not being honoured.
-
-12. Added an optional parentheses number to the -o and --only-matching options
-    of pcregrep.
-
-13. Imitating Perl's /g action for multiple matches is tricky when the pattern
-    can match an empty string. The code to do it in pcretest and pcredemo
-    needed fixing:
-
-    (a) When the newline convention was "crlf", pcretest got it wrong, skipping
-        only one byte after an empty string match just before CRLF (this case
-        just got forgotten; "any" and "anycrlf" were OK).
-
-    (b) The pcretest code also had a bug, causing it to loop forever in UTF-8
-        mode when an empty string match preceded an ASCII character followed by
-        a non-ASCII character. (The code for advancing by one character rather
-        than one byte was nonsense.)
-
-    (c) The pcredemo.c sample program did not have any code at all to handle
-        the cases when CRLF is a valid newline sequence.
-
-14. Neither pcre_exec() nor pcre_dfa_exec() was checking that the value given
-    as a starting offset was within the subject string. There is now a new
-    error, PCRE_ERROR_BADOFFSET, which is returned if the starting offset is
-    negative or greater than the length of the string. In order to test this,
-    pcretest is extended to allow the setting of negative starting offsets.
-
-15. In both pcre_exec() and pcre_dfa_exec() the code for checking that the
-    starting offset points to the beginning of a UTF-8 character was
-    unnecessarily clumsy. I tidied it up.
-
-16. Added PCRE_ERROR_SHORTUTF8 to make it possible to distinguish between a
-    bad UTF-8 sequence and one that is incomplete when using PCRE_PARTIAL_HARD.
-
-17. Nobody had reported that the --include_dir option, which was added in
-    release 7.7 should have been called --include-dir (hyphen, not underscore)
-    for compatibility with GNU grep. I have changed it to --include-dir, but
-    left --include_dir as an undocumented synonym, and the same for
-    --exclude-dir, though that is not available in GNU grep, at least as of
-    release 2.5.4.
-
-18. At a user's suggestion, the macros GETCHAR and friends (which pick up UTF-8
-    characters from a string of bytes) have been redefined so as not to use
-    loops, in order to improve performance in some environments. At the same
-    time, I abstracted some of the common code into auxiliary macros to save
-    repetition (this should not affect the compiled code).
-
-19. If \c was followed by a multibyte UTF-8 character, bad things happened. A
-    compile-time error is now given if \c is not followed by an ASCII
-    character, that is, a byte less than 128. (In EBCDIC mode, the code is
-    different, and any byte value is allowed.)
-
-20. Recognize (*NO_START_OPT) at the start of a pattern to set the PCRE_NO_
-    START_OPTIMIZE option, which is now allowed at compile time - but just
-    passed through to pcre_exec() or pcre_dfa_exec(). This makes it available
-    to pcregrep and other applications that have no direct access to PCRE
-    options. The new /Y option in pcretest sets this option when calling
-    pcre_compile().
-
-21. Change 18 of release 8.01 broke the use of named subpatterns for recursive
-    back references. Groups containing recursive back references were forced to
-    be atomic by that change, but in the case of named groups, the amount of
-    memory required was incorrectly computed, leading to "Failed: internal
-    error: code overflow". This has been fixed.
-
-22. Some patches to pcre_stringpiece.h, pcre_stringpiece_unittest.cc, and
-    pcretest.c, to avoid build problems in some Borland environments.
-
-
-Version 8.10 25-Jun-2010
-------------------------
-
-1.  Added support for (*MARK:ARG) and for ARG additions to PRUNE, SKIP, and
-    THEN.
-
-2.  (*ACCEPT) was not working when inside an atomic group.
-
-3.  Inside a character class, \B is treated as a literal by default, but
-    faulted if PCRE_EXTRA is set. This mimics Perl's behaviour (the -w option
-    causes the error). The code is unchanged, but I tidied the documentation.
-
-4.  Inside a character class, PCRE always treated \R and \X as literals,
-    whereas Perl faults them if its -w option is set. I have changed PCRE so
-    that it faults them when PCRE_EXTRA is set.
-
-5.  Added support for \N, which always matches any character other than
-    newline. (It is the same as "." when PCRE_DOTALL is not set.)
-
-6.  When compiling pcregrep with newer versions of gcc which may have
-    FORTIFY_SOURCE set, several warnings "ignoring return value of 'fwrite',
-    declared with attribute warn_unused_result" were given. Just casting the
-    result to (void) does not stop the warnings; a more elaborate fudge is
-    needed. I've used a macro to implement this.
-
-7.  Minor change to pcretest.c to avoid a compiler warning.
-
-8.  Added four artifical Unicode properties to help with an option to make
-    \s etc use properties (see next item). The new properties are: Xan
-    (alphanumeric), Xsp (Perl space), Xps (POSIX space), and Xwd (word).
-
-9.  Added PCRE_UCP to make \b, \d, \s, \w, and certain POSIX character classes
-    use Unicode properties. (*UCP) at the start of a pattern can be used to set
-    this option. Modified pcretest to add /W to test this facility. Added
-    REG_UCP to make it available via the POSIX interface.
-
-10. Added --line-buffered to pcregrep.
-
-11. In UTF-8 mode, if a pattern that was compiled with PCRE_CASELESS was
-    studied, and the match started with a letter with a code point greater than
-    127 whose first byte was different to the first byte of the other case of
-    the letter, the other case of this starting letter was not recognized
-    (#976).
-
-12. If a pattern that was studied started with a repeated Unicode property
-    test, for example, \p{Nd}+, there was the theoretical possibility of
-    setting up an incorrect bitmap of starting bytes, but fortunately it could
-    not have actually happened in practice until change 8 above was made (it
-    added property types that matched character-matching opcodes).
-
-13. pcre_study() now recognizes \h, \v, and \R when constructing a bit map of
-    possible starting bytes for non-anchored patterns.
-
-14. Extended the "auto-possessify" feature of pcre_compile(). It now recognizes
-    \R, and also a number of cases that involve Unicode properties, both
-    explicit and implicit when PCRE_UCP is set.
-
-15. If a repeated Unicode property match (e.g. \p{Lu}*) was used with non-UTF-8
-    input, it could crash or give wrong results if characters with values
-    greater than 0xc0 were present in the subject string. (Detail: it assumed
-    UTF-8 input when processing these items.)
-
-16. Added a lot of (int) casts to avoid compiler warnings in systems where
-    size_t is 64-bit (#991).
-
-17. Added a check for running out of memory when PCRE is compiled with
-    --disable-stack-for-recursion (#990).
-
-18. If the last data line in a file for pcretest does not have a newline on
-    the end, a newline was missing in the output.
-
-19. The default pcre_chartables.c file recognizes only ASCII characters (values
-    less than 128) in its various bitmaps. However, there is a facility for
-    generating tables according to the current locale when PCRE is compiled. It
-    turns out that in some environments, 0x85 and 0xa0, which are Unicode space
-    characters, are recognized by isspace() and therefore were getting set in
-    these tables, and indeed these tables seem to approximate to ISO 8859. This
-    caused a problem in UTF-8 mode when pcre_study() was used to create a list
-    of bytes that can start a match. For \s, it was including 0x85 and 0xa0,
-    which of course cannot start UTF-8 characters. I have changed the code so
-    that only real ASCII characters (less than 128) and the correct starting
-    bytes for UTF-8 encodings are set for characters greater than 127 when in
-    UTF-8 mode. (When PCRE_UCP is set - see 9 above - the code is different
-    altogether.)
-
-20. Added the /T option to pcretest so as to be able to run tests with non-
-    standard character tables, thus making it possible to include the tests
-    used for 19 above in the standard set of tests.
-
-21. A pattern such as (?&t)(?#()(?(DEFINE)(?<t>a)) which has a forward
-    reference to a subpattern the other side of a comment that contains an
-    opening parenthesis caused either an internal compiling error, or a
-    reference to the wrong subpattern.
-
-
-Version 8.02 19-Mar-2010
-------------------------
-
-1.  The Unicode data tables have been updated to Unicode 5.2.0.
-
-2.  Added the option --libs-cpp to pcre-config, but only when C++ support is
-    configured.
-
-3.  Updated the licensing terms in the pcregexp.pas file, as agreed with the
-    original author of that file, following a query about its status.
-
-4.  On systems that do not have stdint.h (e.g. Solaris), check for and include
-    inttypes.h instead. This fixes a bug that was introduced by change 8.01/8.
-
-5.  A pattern such as (?&t)*+(?(DEFINE)(?<t>.)) which has a possessive
-    quantifier applied to a forward-referencing subroutine call, could compile
-    incorrect code or give the error "internal error: previously-checked
-    referenced subpattern not found".
-
-6.  Both MS Visual Studio and Symbian OS have problems with initializing
-    variables to point to external functions. For these systems, therefore,
-    pcre_malloc etc. are now initialized to local functions that call the
-    relevant global functions.
-
-7.  There were two entries missing in the vectors called coptable and poptable
-    in pcre_dfa_exec.c. This could lead to memory accesses outsize the vectors.
-    I've fixed the data, and added a kludgy way of testing at compile time that
-    the lengths are correct (equal to the number of opcodes).
-
-8.  Following on from 7, I added a similar kludge to check the length of the
-    eint vector in pcreposix.c.
-
-9.  Error texts for pcre_compile() are held as one long string to avoid too
-    much relocation at load time. To find a text, the string is searched,
-    counting zeros. There was no check for running off the end of the string,
-    which could happen if a new error number was added without updating the
-    string.
-
-10. \K gave a compile-time error if it appeared in a lookbehind assersion.
-
-11. \K was not working if it appeared in an atomic group or in a group that
-    was called as a "subroutine", or in an assertion. Perl 5.11 documents that
-    \K is "not well defined" if used in an assertion. PCRE now accepts it if
-    the assertion is positive, but not if it is negative.
-
-12. Change 11 fortuitously reduced the size of the stack frame used in the
-    "match()" function of pcre_exec.c by one pointer. Forthcoming
-    implementation of support for (*MARK) will need an extra pointer on the
-    stack; I have reserved it now, so that the stack frame size does not
-    decrease.
-
-13. A pattern such as (?P<L1>(?P<L2>0)|(?P>L2)(?P>L1)) in which the only other
-    item in branch that calls a recursion is a subroutine call - as in the
-    second branch in the above example - was incorrectly given the compile-
-    time error "recursive call could loop indefinitely" because pcre_compile()
-    was not correctly checking the subroutine for matching a non-empty string.
-
-14. The checks for overrunning compiling workspace could trigger after an
-    overrun had occurred. This is a "should never occur" error, but it can be
-    triggered by pathological patterns such as hundreds of nested parentheses.
-    The checks now trigger 100 bytes before the end of the workspace.
-
-15. Fix typo in configure.ac: "srtoq" should be "strtoq".
-
-
-Version 8.01 19-Jan-2010
-------------------------
-
-1.  If a pattern contained a conditional subpattern with only one branch (in
-    particular, this includes all (*DEFINE) patterns), a call to pcre_study()
-    computed the wrong minimum data length (which is of course zero for such
-    subpatterns). This could cause incorrect "no match" results.
-
-2.  For patterns such as (?i)a(?-i)b|c where an option setting at the start of
-    the pattern is reset in the first branch, pcre_compile() failed with
-    "internal error: code overflow at offset...". This happened only when
-    the reset was to the original external option setting. (An optimization
-    abstracts leading options settings into an external setting, which was the
-    cause of this.)
-
-3.  A pattern such as ^(?!a(*SKIP)b) where a negative assertion contained one
-    of the verbs SKIP, PRUNE, or COMMIT, did not work correctly. When the
-    assertion pattern did not match (meaning that the assertion was true), it
-    was incorrectly treated as false if the SKIP had been reached during the
-    matching. This also applied to assertions used as conditions.
-
-4.  If an item that is not supported by pcre_dfa_exec() was encountered in an
-    assertion subpattern, including such a pattern used as a condition,
-    unpredictable results occurred, instead of the error return
-    PCRE_ERROR_DFA_UITEM.
-
-5.  The C++ GlobalReplace function was not working like Perl for the special
-    situation when an empty string is matched. It now does the fancy magic
-    stuff that is necessary.
-
-6.  In pcre_internal.h, obsolete includes to setjmp.h and stdarg.h have been
-    removed. (These were left over from very, very early versions of PCRE.)
-
-7.  Some cosmetic changes to the code to make life easier when compiling it
-    as part of something else:
-
-    (a) Change DEBUG to PCRE_DEBUG.
-
-    (b) In pcre_compile(), rename the member of the "branch_chain" structure
-        called "current" as "current_branch", to prevent a collision with the
-        Linux macro when compiled as a kernel module.
-
-    (c) In pcre_study(), rename the function set_bit() as set_table_bit(), to
-        prevent a collision with the Linux macro when compiled as a kernel
-        module.
-
-8.  In pcre_compile() there are some checks for integer overflows that used to
-    cast potentially large values to (double). This has been changed to that
-    when building, a check for int64_t is made, and if it is found, it is used
-    instead, thus avoiding the use of floating point arithmetic. (There is no
-    other use of FP in PCRE.) If int64_t is not found, the fallback is to
-    double.
-
-9.  Added two casts to avoid signed/unsigned warnings from VS Studio Express
-    2005 (difference between two addresses compared to an unsigned value).
-
-10. Change the standard AC_CHECK_LIB test for libbz2 in configure.ac to a
-    custom one, because of the following reported problem in Windows:
-
-      - libbz2 uses the Pascal calling convention (WINAPI) for the functions
-          under Win32.
-      - The standard autoconf AC_CHECK_LIB fails to include "bzlib.h",
-          therefore missing the function definition.
-      - The compiler thus generates a "C" signature for the test function.
-      - The linker fails to find the "C" function.
-      - PCRE fails to configure if asked to do so against libbz2.
-
-11. When running libtoolize from libtool-2.2.6b as part of autogen.sh, these
-    messages were output:
-
-      Consider adding `AC_CONFIG_MACRO_DIR([m4])' to configure.ac and
-      rerunning libtoolize, to keep the correct libtool macros in-tree.
-      Consider adding `-I m4' to ACLOCAL_AMFLAGS in Makefile.am.
-
-    I have done both of these things.
-
-12. Although pcre_dfa_exec() does not use nearly as much stack as pcre_exec()
-    most of the time, it *can* run out if it is given a pattern that contains a
-    runaway infinite recursion. I updated the discussion in the pcrestack man
-    page.
-
-13. Now that we have gone to the x.xx style of version numbers, the minor
-    version may start with zero. Using 08 or 09 is a bad idea because users
-    might check the value of PCRE_MINOR in their code, and 08 or 09 may be
-    interpreted as invalid octal numbers. I've updated the previous comment in
-    configure.ac, and also added a check that gives an error if 08 or 09 are
-    used.
-
-14. Change 8.00/11 was not quite complete: code had been accidentally omitted,
-    causing partial matching to fail when the end of the subject matched \W
-    in a UTF-8 pattern where \W was quantified with a minimum of 3.
-
-15. There were some discrepancies between the declarations in pcre_internal.h
-    of _pcre_is_newline(), _pcre_was_newline(), and _pcre_valid_utf8() and
-    their definitions. The declarations used "const uschar *" and the
-    definitions used USPTR. Even though USPTR is normally defined as "const
-    unsigned char *" (and uschar is typedeffed as "unsigned char"), it was
-    reported that: "This difference in casting confuses some C++ compilers, for
-    example, SunCC recognizes above declarations as different functions and
-    generates broken code for hbpcre." I have changed the declarations to use
-    USPTR.
-
-16. GNU libtool is named differently on some systems. The autogen.sh script now
-    tries several variants such as glibtoolize (MacOSX) and libtoolize1x
-    (FreeBSD).
-
-17. Applied Craig's patch that fixes an HP aCC compile error in pcre 8.00
-    (strtoXX undefined when compiling pcrecpp.cc). The patch contains this
-    comment: "Figure out how to create a longlong from a string: strtoll and
-    equivalent. It's not enough to call AC_CHECK_FUNCS: hpux has a strtoll, for
-    instance, but it only takes 2 args instead of 3!"
-
-18. A subtle bug concerned with back references has been fixed by a change of
-    specification, with a corresponding code fix. A pattern such as
-    ^(xa|=?\1a)+$ which contains a back reference inside the group to which it
-    refers, was giving matches when it shouldn't. For example, xa=xaaa would
-    match that pattern. Interestingly, Perl (at least up to 5.11.3) has the
-    same bug. Such groups have to be quantified to be useful, or contained
-    inside another quantified group. (If there's no repetition, the reference
-    can never match.) The problem arises because, having left the group and
-    moved on to the rest of the pattern, a later failure that backtracks into
-    the group uses the captured value from the final iteration of the group
-    rather than the correct earlier one. I have fixed this in PCRE by forcing
-    any group that contains a reference to itself to be an atomic group; that
-    is, there cannot be any backtracking into it once it has completed. This is
-    similar to recursive and subroutine calls.
-
-
-Version 8.00 19-Oct-09
-----------------------
-
-1.  The table for translating pcre_compile() error codes into POSIX error codes
-    was out-of-date, and there was no check on the pcre_compile() error code
-    being within the table. This could lead to an OK return being given in
-    error.
-
-2.  Changed the call to open a subject file in pcregrep from fopen(pathname,
-    "r") to fopen(pathname, "rb"), which fixed a problem with some of the tests
-    in a Windows environment.
-
-3.  The pcregrep --count option prints the count for each file even when it is
-    zero, as does GNU grep. However, pcregrep was also printing all files when
-    --files-with-matches was added. Now, when both options are given, it prints
-    counts only for those files that have at least one match. (GNU grep just
-    prints the file name in this circumstance, but including the count seems
-    more useful - otherwise, why use --count?) Also ensured that the
-    combination -clh just lists non-zero counts, with no names.
-
-4.  The long form of the pcregrep -F option was incorrectly implemented as
-    --fixed_strings instead of --fixed-strings. This is an incompatible change,
-    but it seems right to fix it, and I didn't think it was worth preserving
-    the old behaviour.
-
-5.  The command line items --regex=pattern and --regexp=pattern were not
-    recognized by pcregrep, which required --regex pattern or --regexp pattern
-    (with a space rather than an '='). The man page documented the '=' forms,
-    which are compatible with GNU grep; these now work.
-
-6.  No libpcreposix.pc file was created for pkg-config; there was just
-    libpcre.pc and libpcrecpp.pc. The omission has been rectified.
-
-7.  Added #ifndef SUPPORT_UCP into the pcre_ucd.c module, to reduce its size
-    when UCP support is not needed, by modifying the Python script that
-    generates it from Unicode data files. This should not matter if the module
-    is correctly used as a library, but I received one complaint about 50K of
-    unwanted data. My guess is that the person linked everything into his
-    program rather than using a library. Anyway, it does no harm.
-
-8.  A pattern such as /\x{123}{2,2}+/8 was incorrectly compiled; the trigger
-    was a minimum greater than 1 for a wide character in a possessive
-    repetition. The same bug could also affect patterns like /(\x{ff}{0,2})*/8
-    which had an unlimited repeat of a nested, fixed maximum repeat of a wide
-    character. Chaos in the form of incorrect output or a compiling loop could
-    result.
-
-9.  The restrictions on what a pattern can contain when partial matching is
-    requested for pcre_exec() have been removed. All patterns can now be
-    partially matched by this function. In addition, if there are at least two
-    slots in the offset vector, the offset of the earliest inspected character
-    for the match and the offset of the end of the subject are set in them when
-    PCRE_ERROR_PARTIAL is returned.
-
-10. Partial matching has been split into two forms: PCRE_PARTIAL_SOFT, which is
-    synonymous with PCRE_PARTIAL, for backwards compatibility, and
-    PCRE_PARTIAL_HARD, which causes a partial match to supersede a full match,
-    and may be more useful for multi-segment matching.
-
-11. Partial matching with pcre_exec() is now more intuitive. A partial match
-    used to be given if ever the end of the subject was reached; now it is
-    given only if matching could not proceed because another character was
-    needed. This makes a difference in some odd cases such as Z(*FAIL) with the
-    string "Z", which now yields "no match" instead of "partial match". In the
-    case of pcre_dfa_exec(), "no match" is given if every matching path for the
-    final character ended with (*FAIL).
-
-12. Restarting a match using pcre_dfa_exec() after a partial match did not work
-    if the pattern had a "must contain" character that was already found in the
-    earlier partial match, unless partial matching was again requested. For
-    example, with the pattern /dog.(body)?/, the "must contain" character is
-    "g". If the first part-match was for the string "dog", restarting with
-    "sbody" failed. This bug has been fixed.
-
-13. The string returned by pcre_dfa_exec() after a partial match has been
-    changed so that it starts at the first inspected character rather than the
-    first character of the match. This makes a difference only if the pattern
-    starts with a lookbehind assertion or \b or \B (\K is not supported by
-    pcre_dfa_exec()). It's an incompatible change, but it makes the two
-    matching functions compatible, and I think it's the right thing to do.
-
-14. Added a pcredemo man page, created automatically from the pcredemo.c file,
-    so that the demonstration program is easily available in environments where
-    PCRE has not been installed from source.
-
-15. Arranged to add -DPCRE_STATIC to cflags in libpcre.pc, libpcreposix.cp,
-    libpcrecpp.pc and pcre-config when PCRE is not compiled as a shared
-    library.
-
-16. Added REG_UNGREEDY to the pcreposix interface, at the request of a user.
-    It maps to PCRE_UNGREEDY. It is not, of course, POSIX-compatible, but it
-    is not the first non-POSIX option to be added. Clearly some people find
-    these options useful.
-
-17. If a caller to the POSIX matching function regexec() passes a non-zero
-    value for nmatch with a NULL value for pmatch, the value of
-    nmatch is forced to zero.
-
-18. RunGrepTest did not have a test for the availability of the -u option of
-    the diff command, as RunTest does. It now checks in the same way as
-    RunTest, and also checks for the -b option.
-
-19. If an odd number of negated classes containing just a single character
-    interposed, within parentheses, between a forward reference to a named
-    subpattern and the definition of the subpattern, compilation crashed with
-    an internal error, complaining that it could not find the referenced
-    subpattern. An example of a crashing pattern is /(?&A)(([^m])(?<A>))/.
-    [The bug was that it was starting one character too far in when skipping
-    over the character class, thus treating the ] as data rather than
-    terminating the class. This meant it could skip too much.]
-
-20. Added PCRE_NOTEMPTY_ATSTART in order to be able to correctly implement the
-    /g option in pcretest when the pattern contains \K, which makes it possible
-    to have an empty string match not at the start, even when the pattern is
-    anchored. Updated pcretest and pcredemo to use this option.
-
-21. If the maximum number of capturing subpatterns in a recursion was greater
-    than the maximum at the outer level, the higher number was returned, but
-    with unset values at the outer level. The correct (outer level) value is
-    now given.
-
-22. If (*ACCEPT) appeared inside capturing parentheses, previous releases of
-    PCRE did not set those parentheses (unlike Perl). I have now found a way to
-    make it do so. The string so far is captured, making this feature
-    compatible with Perl.
-
-23. The tests have been re-organized, adding tests 11 and 12, to make it
-    possible to check the Perl 5.10 features against Perl 5.10.
-
-24. Perl 5.10 allows subroutine calls in lookbehinds, as long as the subroutine
-    pattern matches a fixed length string. PCRE did not allow this; now it
-    does. Neither allows recursion.
-
-25. I finally figured out how to implement a request to provide the minimum
-    length of subject string that was needed in order to match a given pattern.
-    (It was back references and recursion that I had previously got hung up
-    on.) This code has now been added to pcre_study(); it finds a lower bound
-    to the length of subject needed. It is not necessarily the greatest lower
-    bound, but using it to avoid searching strings that are too short does give
-    some useful speed-ups. The value is available to calling programs via
-    pcre_fullinfo().
-
-26. While implementing 25, I discovered to my embarrassment that pcretest had
-    not been passing the result of pcre_study() to pcre_dfa_exec(), so the
-    study optimizations had never been tested with that matching function.
-    Oops. What is worse, even when it was passed study data, there was a bug in
-    pcre_dfa_exec() that meant it never actually used it. Double oops. There
-    were also very few tests of studied patterns with pcre_dfa_exec().
-
-27. If (?| is used to create subpatterns with duplicate numbers, they are now
-    allowed to have the same name, even if PCRE_DUPNAMES is not set. However,
-    on the other side of the coin, they are no longer allowed to have different
-    names, because these cannot be distinguished in PCRE, and this has caused
-    confusion. (This is a difference from Perl.)
-
-28. When duplicate subpattern names are present (necessarily with different
-    numbers, as required by 27 above), and a test is made by name in a
-    conditional pattern, either for a subpattern having been matched, or for
-    recursion in such a pattern, all the associated numbered subpatterns are
-    tested, and the overall condition is true if the condition is true for any
-    one of them. This is the way Perl works, and is also more like the way
-    testing by number works.
-
-
-Version 7.9 11-Apr-09
----------------------
-
-1.  When building with support for bzlib/zlib (pcregrep) and/or readline
-    (pcretest), all targets were linked against these libraries. This included
-    libpcre, libpcreposix, and libpcrecpp, even though they do not use these
-    libraries. This caused unwanted dependencies to be created. This problem
-    has been fixed, and now only pcregrep is linked with bzlib/zlib and only
-    pcretest is linked with readline.
-
-2.  The "typedef int BOOL" in pcre_internal.h that was included inside the
-    "#ifndef FALSE" condition by an earlier change (probably 7.8/18) has been
-    moved outside it again, because FALSE and TRUE are already defined in AIX,
-    but BOOL is not.
-
-3.  The pcre_config() function was treating the PCRE_MATCH_LIMIT and
-    PCRE_MATCH_LIMIT_RECURSION values as ints, when they should be long ints.
-
-4.  The pcregrep documentation said spaces were inserted as well as colons (or
-    hyphens) following file names and line numbers when outputting matching
-    lines. This is not true; no spaces are inserted. I have also clarified the
-    wording for the --colour (or --color) option.
-
-5.  In pcregrep, when --colour was used with -o, the list of matching strings
-    was not coloured; this is different to GNU grep, so I have changed it to be
-    the same.
-
-6.  When --colo(u)r was used in pcregrep, only the first matching substring in
-    each matching line was coloured. Now it goes on to look for further matches
-    of any of the test patterns, which is the same behaviour as GNU grep.
-
-7.  A pattern that could match an empty string could cause pcregrep to loop; it
-    doesn't make sense to accept an empty string match in pcregrep, so I have
-    locked it out (using PCRE's PCRE_NOTEMPTY option). By experiment, this
-    seems to be how GNU grep behaves. [But see later change 40 for release
-    8.33.]
-
-8.  The pattern (?(?=.*b)b|^) was incorrectly compiled as "match must be at
-    start or after a newline", because the conditional assertion was not being
-    correctly handled. The rule now is that both the assertion and what follows
-    in the first alternative must satisfy the test.
-
-9.  If auto-callout was enabled in a pattern with a conditional group whose
-    condition was an assertion, PCRE could crash during matching, both with
-    pcre_exec() and pcre_dfa_exec().
-
-10. The PCRE_DOLLAR_ENDONLY option was not working when pcre_dfa_exec() was
-    used for matching.
-
-11. Unicode property support in character classes was not working for
-    characters (bytes) greater than 127 when not in UTF-8 mode.
-
-12. Added the -M command line option to pcretest.
-
-14. Added the non-standard REG_NOTEMPTY option to the POSIX interface.
-
-15. Added the PCRE_NO_START_OPTIMIZE match-time option.
-
-16. Added comments and documentation about mis-use of no_arg in the C++
-    wrapper.
-
-17. Implemented support for UTF-8 encoding in EBCDIC environments, a patch
-    from Martin Jerabek that uses macro names for all relevant character and
-    string constants.
-
-18. Added to pcre_internal.h two configuration checks: (a) If both EBCDIC and
-    SUPPORT_UTF8 are set, give an error; (b) If SUPPORT_UCP is set without
-    SUPPORT_UTF8, define SUPPORT_UTF8. The "configure" script handles both of
-    these, but not everybody uses configure.
-
-19. A conditional group that had only one branch was not being correctly
-    recognized as an item that could match an empty string. This meant that an
-    enclosing group might also not be so recognized, causing infinite looping
-    (and probably a segfault) for patterns such as ^"((?(?=[a])[^"])|b)*"$
-    with the subject "ab", where knowledge that the repeated group can match
-    nothing is needed in order to break the loop.
-
-20. If a pattern that was compiled with callouts was matched using pcre_dfa_
-    exec(), but without supplying a callout function, matching went wrong.
-
-21. If PCRE_ERROR_MATCHLIMIT occurred during a recursion, there was a memory
-    leak if the size of the offset vector was greater than 30. When the vector
-    is smaller, the saved offsets during recursion go onto a local stack
-    vector, but for larger vectors malloc() is used. It was failing to free
-    when the recursion yielded PCRE_ERROR_MATCH_LIMIT (or any other "abnormal"
-    error, in fact).
-
-22. There was a missing #ifdef SUPPORT_UTF8 round one of the variables in the
-    heapframe that is used only when UTF-8 support is enabled. This caused no
-    problem, but was untidy.
-
-23. Steven Van Ingelgem's patch to CMakeLists.txt to change the name
-    CMAKE_BINARY_DIR to PROJECT_BINARY_DIR so that it works when PCRE is
-    included within another project.
-
-24. Steven Van Ingelgem's patches to add more options to the CMake support,
-    slightly modified by me:
-
-      (a) PCRE_BUILD_TESTS can be set OFF not to build the tests, including
-          not building pcregrep.
-
-      (b) PCRE_BUILD_PCREGREP can be see OFF not to build pcregrep, but only
-          if PCRE_BUILD_TESTS is also set OFF, because the tests use pcregrep.
-
-25. Forward references, both numeric and by name, in patterns that made use of
-    duplicate group numbers, could behave incorrectly or give incorrect errors,
-    because when scanning forward to find the reference group, PCRE was not
-    taking into account the duplicate group numbers. A pattern such as
-    ^X(?3)(a)(?|(b)|(q))(Y) is an example.
-
-26. Changed a few more instances of "const unsigned char *" to USPTR, making
-    the feature of a custom pointer more persuasive (as requested by a user).
-
-27. Wrapped the definitions of fileno and isatty for Windows, which appear in
-    pcretest.c, inside #ifndefs, because it seems they are sometimes already
-    pre-defined.
-
-28. Added support for (*UTF8) at the start of a pattern.
-
-29. Arrange for flags added by the "release type" setting in CMake to be shown
-    in the configuration summary.
-
-
-Version 7.8 05-Sep-08
----------------------
-
-1.  Replaced UCP searching code with optimized version as implemented for Ad
-    Muncher (http://www.admuncher.com/) by Peter Kankowski. This uses a two-
-    stage table and inline lookup instead of a function, giving speed ups of 2
-    to 5 times on some simple patterns that I tested. Permission was given to
-    distribute the MultiStage2.py script that generates the tables (it's not in
-    the tarball, but is in the Subversion repository).
-
-2.  Updated the Unicode datatables to Unicode 5.1.0. This adds yet more
-    scripts.
-
-3.  Change 12 for 7.7 introduced a bug in pcre_study() when a pattern contained
-    a group with a zero qualifier. The result of the study could be incorrect,
-    or the function might crash, depending on the pattern.
-
-4.  Caseless matching was not working for non-ASCII characters in back
-    references. For example, /(\x{de})\1/8i was not matching \x{de}\x{fe}.
-    It now works when Unicode Property Support is available.
-
-5.  In pcretest, an escape such as \x{de} in the data was always generating
-    a UTF-8 string, even in non-UTF-8 mode. Now it generates a single byte in
-    non-UTF-8 mode. If the value is greater than 255, it gives a warning about
-    truncation.
-
-6.  Minor bugfix in pcrecpp.cc (change "" == ... to NULL == ...).
-
-7.  Added two (int) casts to pcregrep when printing the difference of two
-    pointers, in case they are 64-bit values.
-
-8.  Added comments about Mac OS X stack usage to the pcrestack man page and to
-    test 2 if it fails.
-
-9.  Added PCRE_CALL_CONVENTION just before the names of all exported functions,
-    and a #define of that name to empty if it is not externally set. This is to
-    allow users of MSVC to set it if necessary.
-
-10. The PCRE_EXP_DEFN macro which precedes exported functions was missing from
-    the convenience functions in the pcre_get.c source file.
-
-11. An option change at the start of a pattern that had top-level alternatives
-    could cause overwriting and/or a crash. This command provoked a crash in
-    some environments:
-
-      printf "/(?i)[\xc3\xa9\xc3\xbd]|[\xc3\xa9\xc3\xbdA]/8\n" | pcretest
-
-    This potential security problem was recorded as CVE-2008-2371.
-
-12. For a pattern where the match had to start at the beginning or immediately
-    after a newline (e.g /.*anything/ without the DOTALL flag), pcre_exec() and
-    pcre_dfa_exec() could read past the end of the passed subject if there was
-    no match. To help with detecting such bugs (e.g. with valgrind), I modified
-    pcretest so that it places the subject at the end of its malloc-ed buffer.
-
-13. The change to pcretest in 12 above threw up a couple more cases when pcre_
-    exec() might read past the end of the data buffer in UTF-8 mode.
-
-14. A similar bug to 7.3/2 existed when the PCRE_FIRSTLINE option was set and
-    the data contained the byte 0x85 as part of a UTF-8 character within its
-    first line. This applied both to normal and DFA matching.
-
-15. Lazy qualifiers were not working in some cases in UTF-8 mode. For example,
-    /^[^d]*?$/8 failed to match "abc".
-
-16. Added a missing copyright notice to pcrecpp_internal.h.
-
-17. Make it more clear in the documentation that values returned from
-    pcre_exec() in ovector are byte offsets, not character counts.
-
-18. Tidied a few places to stop certain compilers from issuing warnings.
-
-19. Updated the Virtual Pascal + BCC files to compile the latest v7.7, as
-    supplied by Stefan Weber. I made a further small update for 7.8 because
-    there is a change of source arrangements: the pcre_searchfuncs.c module is
-    replaced by pcre_ucd.c.
-
-
-Version 7.7 07-May-08
----------------------
-
-1.  Applied Craig's patch to sort out a long long problem: "If we can't convert
-    a string to a long long, pretend we don't even have a long long." This is
-    done by checking for the strtoq, strtoll, and _strtoi64 functions.
-
-2.  Applied Craig's patch to pcrecpp.cc to restore ABI compatibility with
-    pre-7.6 versions, which defined a global no_arg variable instead of putting
-    it in the RE class. (See also #8 below.)
-
-3.  Remove a line of dead code, identified by coverity and reported by Nuno
-    Lopes.
-
-4.  Fixed two related pcregrep bugs involving -r with --include or --exclude:
-
-    (1) The include/exclude patterns were being applied to the whole pathnames
-        of files, instead of just to the final components.
-
-    (2) If there was more than one level of directory, the subdirectories were
-        skipped unless they satisfied the include/exclude conditions. This is
-        inconsistent with GNU grep (and could even be seen as contrary to the
-        pcregrep specification - which I improved to make it absolutely clear).
-        The action now is always to scan all levels of directory, and just
-        apply the include/exclude patterns to regular files.
-
-5.  Added the --include_dir and --exclude_dir patterns to pcregrep, and used
-    --exclude_dir in the tests to avoid scanning .svn directories.
-
-6.  Applied Craig's patch to the QuoteMeta function so that it escapes the
-    NUL character as backslash + 0 rather than backslash + NUL, because PCRE
-    doesn't support NULs in patterns.
-
-7.  Added some missing "const"s to declarations of static tables in
-    pcre_compile.c and pcre_dfa_exec.c.
-
-8.  Applied Craig's patch to pcrecpp.cc to fix a problem in OS X that was
-    caused by fix #2  above. (Subsequently also a second patch to fix the
-    first patch. And a third patch - this was a messy problem.)
-
-9.  Applied Craig's patch to remove the use of push_back().
-
-10. Applied Alan Lehotsky's patch to add REG_STARTEND support to the POSIX
-    matching function regexec().
-
-11. Added support for the Oniguruma syntax \g<name>, \g<n>, \g'name', \g'n',
-    which, however, unlike Perl's \g{...}, are subroutine calls, not back
-    references. PCRE supports relative numbers with this syntax (I don't think
-    Oniguruma does).
-
-12. Previously, a group with a zero repeat such as (...){0} was completely
-    omitted from the compiled regex. However, this means that if the group
-    was called as a subroutine from elsewhere in the pattern, things went wrong
-    (an internal error was given). Such groups are now left in the compiled
-    pattern, with a new opcode that causes them to be skipped at execution
-    time.
-
-13. Added the PCRE_JAVASCRIPT_COMPAT option. This makes the following changes
-    to the way PCRE behaves:
-
-    (a) A lone ] character is dis-allowed (Perl treats it as data).
-
-    (b) A back reference to an unmatched subpattern matches an empty string
-        (Perl fails the current match path).
-
-    (c) A data ] in a character class must be notated as \] because if the
-        first data character in a class is ], it defines an empty class. (In
-        Perl it is not possible to have an empty class.) The empty class []
-        never matches; it forces failure and is equivalent to (*FAIL) or (?!).
-        The negative empty class [^] matches any one character, independently
-        of the DOTALL setting.
-
-14. A pattern such as /(?2)[]a()b](abc)/ which had a forward reference to a
-    non-existent subpattern following a character class starting with ']' and
-    containing () gave an internal compiling error instead of "reference to
-    non-existent subpattern". Fortunately, when the pattern did exist, the
-    compiled code was correct. (When scanning forwards to check for the
-    existence of the subpattern, it was treating the data ']' as terminating
-    the class, so got the count wrong. When actually compiling, the reference
-    was subsequently set up correctly.)
-
-15. The "always fail" assertion (?!) is optimzed to (*FAIL) by pcre_compile;
-    it was being rejected as not supported by pcre_dfa_exec(), even though
-    other assertions are supported. I have made pcre_dfa_exec() support
-    (*FAIL).
-
-16. The implementation of 13c above involved the invention of a new opcode,
-    OP_ALLANY, which is like OP_ANY but doesn't check the /s flag. Since /s
-    cannot be changed at match time, I realized I could make a small
-    improvement to matching performance by compiling OP_ALLANY instead of
-    OP_ANY for "." when DOTALL was set, and then removing the runtime tests
-    on the OP_ANY path.
-
-17. Compiling pcretest on Windows with readline support failed without the
-    following two fixes: (1) Make the unistd.h include conditional on
-    HAVE_UNISTD_H; (2) #define isatty and fileno as _isatty and _fileno.
-
-18. Changed CMakeLists.txt and cmake/FindReadline.cmake to arrange for the
-    ncurses library to be included for pcretest when ReadLine support is
-    requested, but also to allow for it to be overridden. This patch came from
-    Daniel Bergström.
-
-19. There was a typo in the file ucpinternal.h where f0_rangeflag was defined
-    as 0x00f00000 instead of 0x00800000. Luckily, this would not have caused
-    any errors with the current Unicode tables. Thanks to Peter Kankowski for
-    spotting this.
-
-
-Version 7.6 28-Jan-08
----------------------
-
-1.  A character class containing a very large number of characters with
-    codepoints greater than 255 (in UTF-8 mode, of course) caused a buffer
-    overflow.
-
-2.  Patch to cut out the "long long" test in pcrecpp_unittest when
-    HAVE_LONG_LONG is not defined.
-
-3.  Applied Christian Ehrlicher's patch to update the CMake build files to
-    bring them up to date and include new features. This patch includes:
-
-    - Fixed PH's badly added libz and libbz2 support.
-    - Fixed a problem with static linking.
-    - Added pcredemo. [But later removed - see 7 below.]
-    - Fixed dftables problem and added an option.
-    - Added a number of HAVE_XXX tests, including HAVE_WINDOWS_H and
-        HAVE_LONG_LONG.
-    - Added readline support for pcretest.
-    - Added an listing of the option settings after cmake has run.
-
-4.  A user submitted a patch to Makefile that makes it easy to create
-    "pcre.dll" under mingw when using Configure/Make. I added stuff to
-    Makefile.am that cause it to include this special target, without
-    affecting anything else. Note that the same mingw target plus all
-    the other distribution libraries and programs are now supported
-    when configuring with CMake (see 6 below) instead of with
-    Configure/Make.
-
-5.  Applied Craig's patch that moves no_arg into the RE class in the C++ code.
-    This is an attempt to solve the reported problem "pcrecpp::no_arg is not
-    exported in the Windows port". It has not yet been confirmed that the patch
-    solves the problem, but it does no harm.
-
-6.  Applied Sheri's patch to CMakeLists.txt to add NON_STANDARD_LIB_PREFIX and
-    NON_STANDARD_LIB_SUFFIX for dll names built with mingw when configured
-    with CMake, and also correct the comment about stack recursion.
-
-7.  Remove the automatic building of pcredemo from the ./configure system and
-    from CMakeLists.txt. The whole idea of pcredemo.c is that it is an example
-    of a program that users should build themselves after PCRE is installed, so
-    building it automatically is not really right. What is more, it gave
-    trouble in some build environments.
-
-8.  Further tidies to CMakeLists.txt from Sheri and Christian.
-
-
-Version 7.5 10-Jan-08
----------------------
-
-1.  Applied a patch from Craig: "This patch makes it possible to 'ignore'
-    values in parens when parsing an RE using the C++ wrapper."
-
-2.  Negative specials like \S did not work in character classes in UTF-8 mode.
-    Characters greater than 255 were excluded from the class instead of being
-    included.
-
-3.  The same bug as (2) above applied to negated POSIX classes such as
-    [:^space:].
-
-4.  PCRECPP_STATIC was referenced in pcrecpp_internal.h, but nowhere was it
-    defined or documented. It seems to have been a typo for PCRE_STATIC, so
-    I have changed it.
-
-5.  The construct (?&) was not diagnosed as a syntax error (it referenced the
-    first named subpattern) and a construct such as (?&a) would reference the
-    first named subpattern whose name started with "a" (in other words, the
-    length check was missing). Both these problems are fixed. "Subpattern name
-    expected" is now given for (?&) (a zero-length name), and this patch also
-    makes it give the same error for \k'' (previously it complained that that
-    was a reference to a non-existent subpattern).
-
-6.  The erroneous patterns (?+-a) and (?-+a) give different error messages;
-    this is right because (?- can be followed by option settings as well as by
-    digits. I have, however, made the messages clearer.
-
-7.  Patterns such as (?(1)a|b) (a pattern that contains fewer subpatterns
-    than the number used in the conditional) now cause a compile-time error.
-    This is actually not compatible with Perl, which accepts such patterns, but
-    treats the conditional as always being FALSE (as PCRE used to), but it
-    seems to me that giving a diagnostic is better.
-
-8.  Change "alphameric" to the more common word "alphanumeric" in comments
-    and messages.
-
-9.  Fix two occurrences of "backslash" in comments that should have been
-    "backspace".
-
-10. Remove two redundant lines of code that can never be obeyed (their function
-    was moved elsewhere).
-
-11. The program that makes PCRE's Unicode character property table had a bug
-    which caused it to generate incorrect table entries for sequences of
-    characters that have the same character type, but are in different scripts.
-    It amalgamated them into a single range, with the script of the first of
-    them. In other words, some characters were in the wrong script. There were
-    thirteen such cases, affecting characters in the following ranges:
-
-      U+002b0 - U+002c1
-      U+0060c - U+0060d
-      U+0061e - U+00612
-      U+0064b - U+0065e
-      U+0074d - U+0076d
-      U+01800 - U+01805
-      U+01d00 - U+01d77
-      U+01d9b - U+01dbf
-      U+0200b - U+0200f
-      U+030fc - U+030fe
-      U+03260 - U+0327f
-      U+0fb46 - U+0fbb1
-      U+10450 - U+1049d
-
-12. The -o option (show only the matching part of a line) for pcregrep was not
-    compatible with GNU grep in that, if there was more than one match in a
-    line, it showed only the first of them. It now behaves in the same way as
-    GNU grep.
-
-13. If the -o and -v options were combined for pcregrep, it printed a blank
-    line for every non-matching line. GNU grep prints nothing, and pcregrep now
-    does the same. The return code can be used to tell if there were any
-    non-matching lines.
-
-14. Added --file-offsets and --line-offsets to pcregrep.
-
-15. The pattern (?=something)(?R) was not being diagnosed as a potentially
-    infinitely looping recursion. The bug was that positive lookaheads were not
-    being skipped when checking for a possible empty match (negative lookaheads
-    and both kinds of lookbehind were skipped).
-
-16. Fixed two typos in the Windows-only code in pcregrep.c, and moved the
-    inclusion of <windows.h> to before rather than after the definition of
-    INVALID_FILE_ATTRIBUTES (patch from David Byron).
-
-17. Specifying a possessive quantifier with a specific limit for a Unicode
-    character property caused pcre_compile() to compile bad code, which led at
-    runtime to PCRE_ERROR_INTERNAL (-14). Examples of patterns that caused this
-    are: /\p{Zl}{2,3}+/8 and /\p{Cc}{2}+/8. It was the possessive "+" that
-    caused the error; without that there was no problem.
-
-18. Added --enable-pcregrep-libz and --enable-pcregrep-libbz2.
-
-19. Added --enable-pcretest-libreadline.
-
-20. In pcrecpp.cc, the variable 'count' was incremented twice in
-    RE::GlobalReplace(). As a result, the number of replacements returned was
-    double what it should be. I removed one of the increments, but Craig sent a
-    later patch that removed the other one (the right fix) and added unit tests
-    that check the return values (which was not done before).
-
-21. Several CMake things:
-
-    (1) Arranged that, when cmake is used on Unix, the libraries end up with
-        the names libpcre and libpcreposix, not just pcre and pcreposix.
-
-    (2) The above change means that pcretest and pcregrep are now correctly
-        linked with the newly-built libraries, not previously installed ones.
-
-    (3) Added PCRE_SUPPORT_LIBREADLINE, PCRE_SUPPORT_LIBZ, PCRE_SUPPORT_LIBBZ2.
-
-22. In UTF-8 mode, with newline set to "any", a pattern such as .*a.*=.b.*
-    crashed when matching a string such as a\x{2029}b (note that \x{2029} is a
-    UTF-8 newline character). The key issue is that the pattern starts .*;
-    this means that the match must be either at the beginning, or after a
-    newline. The bug was in the code for advancing after a failed match and
-    checking that the new position followed a newline. It was not taking
-    account of UTF-8 characters correctly.
-
-23. PCRE was behaving differently from Perl in the way it recognized POSIX
-    character classes. PCRE was not treating the sequence [:...:] as a
-    character class unless the ... were all letters. Perl, however, seems to
-    allow any characters between [: and :], though of course it rejects as
-    unknown any "names" that contain non-letters, because all the known class
-    names consist only of letters. Thus, Perl gives an error for [[:1234:]],
-    for example, whereas PCRE did not - it did not recognize a POSIX character
-    class. This seemed a bit dangerous, so the code has been changed to be
-    closer to Perl. The behaviour is not identical to Perl, because PCRE will
-    diagnose an unknown class for, for example, [[:l\ower:]] where Perl will
-    treat it as [[:lower:]]. However, PCRE does now give "unknown" errors where
-    Perl does, and where it didn't before.
-
-24. Rewrite so as to remove the single use of %n from pcregrep because in some
-    Windows environments %n is disabled by default.
-
-
-Version 7.4 21-Sep-07
----------------------
-
-1.  Change 7.3/28 was implemented for classes by looking at the bitmap. This
-    means that a class such as [\s] counted as "explicit reference to CR or
-    LF". That isn't really right - the whole point of the change was to try to
-    help when there was an actual mention of one of the two characters. So now
-    the change happens only if \r or \n (or a literal CR or LF) character is
-    encountered.
-
-2.  The 32-bit options word was also used for 6 internal flags, but the numbers
-    of both had grown to the point where there were only 3 bits left.
-    Fortunately, there was spare space in the data structure, and so I have
-    moved the internal flags into a new 16-bit field to free up more option
-    bits.
-
-3.  The appearance of (?J) at the start of a pattern set the DUPNAMES option,
-    but did not set the internal JCHANGED flag - either of these is enough to
-    control the way the "get" function works - but the PCRE_INFO_JCHANGED
-    facility is supposed to tell if (?J) was ever used, so now (?J) at the
-    start sets both bits.
-
-4.  Added options (at build time, compile time, exec time) to change \R from
-    matching any Unicode line ending sequence to just matching CR, LF, or CRLF.
-
-5.  doc/pcresyntax.html was missing from the distribution.
-
-6.  Put back the definition of PCRE_ERROR_NULLWSLIMIT, for backward
-    compatibility, even though it is no longer used.
-
-7.  Added macro for snprintf to pcrecpp_unittest.cc and also for strtoll and
-    strtoull to pcrecpp.cc to select the available functions in WIN32 when the
-    windows.h file is present (where different names are used). [This was
-    reversed later after testing - see 16 below.]
-
-8.  Changed all #include <config.h> to #include "config.h". There were also
-    some further <pcre.h> cases that I changed to "pcre.h".
-
-9.  When pcregrep was used with the --colour option, it missed the line ending
-    sequence off the lines that it output.
-
-10. It was pointed out to me that arrays of string pointers cause lots of
-    relocations when a shared library is dynamically loaded. A technique of
-    using a single long string with a table of offsets can drastically reduce
-    these. I have refactored PCRE in four places to do this. The result is
-    dramatic:
-
-      Originally:                          290
-      After changing UCP table:            187
-      After changing error message table:   43
-      After changing table of "verbs"       36
-      After changing table of Posix names   22
-
-    Thanks to the folks working on Gregex for glib for this insight.
-
-11. --disable-stack-for-recursion caused compiling to fail unless -enable-
-    unicode-properties was also set.
-
-12. Updated the tests so that they work when \R is defaulted to ANYCRLF.
-
-13. Added checks for ANY and ANYCRLF to pcrecpp.cc where it previously
-    checked only for CRLF.
-
-14. Added casts to pcretest.c to avoid compiler warnings.
-
-15. Added Craig's patch to various pcrecpp modules to avoid compiler warnings.
-
-16. Added Craig's patch to remove the WINDOWS_H tests, that were not working,
-    and instead check for _strtoi64 explicitly, and avoid the use of snprintf()
-    entirely. This removes changes made in 7 above.
-
-17. The CMake files have been updated, and there is now more information about
-    building with CMake in the NON-UNIX-USE document.
-
-
-Version 7.3 28-Aug-07
----------------------
-
- 1. In the rejigging of the build system that eventually resulted in 7.1, the
-    line "#include <pcre.h>" was included in pcre_internal.h. The use of angle
-    brackets there is not right, since it causes compilers to look for an
-    installed pcre.h, not the version that is in the source that is being
-    compiled (which of course may be different). I have changed it back to:
-
-      #include "pcre.h"
-
-    I have a vague recollection that the change was concerned with compiling in
-    different directories, but in the new build system, that is taken care of
-    by the VPATH setting the Makefile.
-
- 2. The pattern .*$ when run in not-DOTALL UTF-8 mode with newline=any failed
-    when the subject happened to end in the byte 0x85 (e.g. if the last
-    character was \x{1ec5}). *Character* 0x85 is one of the "any" newline
-    characters but of course it shouldn't be taken as a newline when it is part
-    of another character. The bug was that, for an unlimited repeat of . in
-    not-DOTALL UTF-8 mode, PCRE was advancing by bytes rather than by
-    characters when looking for a newline.
-
- 3. A small performance improvement in the DOTALL UTF-8 mode .* case.
-
- 4. Debugging: adjusted the names of opcodes for different kinds of parentheses
-    in debug output.
-
- 5. Arrange to use "%I64d" instead of "%lld" and "%I64u" instead of "%llu" for
-    long printing in the pcrecpp unittest when running under MinGW.
-
- 6. ESC_K was left out of the EBCDIC table.
-
- 7. Change 7.0/38 introduced a new limit on the number of nested non-capturing
-    parentheses; I made it 1000, which seemed large enough. Unfortunately, the
-    limit also applies to "virtual nesting" when a pattern is recursive, and in
-    this case 1000 isn't so big. I have been able to remove this limit at the
-    expense of backing off one optimization in certain circumstances. Normally,
-    when pcre_exec() would call its internal match() function recursively and
-    immediately return the result unconditionally, it uses a "tail recursion"
-    feature to save stack. However, when a subpattern that can match an empty
-    string has an unlimited repetition quantifier, it no longer makes this
-    optimization. That gives it a stack frame in which to save the data for
-    checking that an empty string has been matched. Previously this was taken
-    from the 1000-entry workspace that had been reserved. So now there is no
-    explicit limit, but more stack is used.
-
- 8. Applied Daniel's patches to solve problems with the import/export magic
-    syntax that is required for Windows, and which was going wrong for the
-    pcreposix and pcrecpp parts of the library. These were overlooked when this
-    problem was solved for the main library.
-
- 9. There were some crude static tests to avoid integer overflow when computing
-    the size of patterns that contain repeated groups with explicit upper
-    limits. As the maximum quantifier is 65535, the maximum group length was
-    set at 30,000 so that the product of these two numbers did not overflow a
-    32-bit integer. However, it turns out that people want to use groups that
-    are longer than 30,000 bytes (though not repeat them that many times).
-    Change 7.0/17 (the refactoring of the way the pattern size is computed) has
-    made it possible to implement the integer overflow checks in a much more
-    dynamic way, which I have now done. The artificial limitation on group
-    length has been removed - we now have only the limit on the total length of
-    the compiled pattern, which depends on the LINK_SIZE setting.
-
-10. Fixed a bug in the documentation for get/copy named substring when
-    duplicate names are permitted. If none of the named substrings are set, the
-    functions return PCRE_ERROR_NOSUBSTRING (7); the doc said they returned an
-    empty string.
-
-11. Because Perl interprets \Q...\E at a high level, and ignores orphan \E
-    instances, patterns such as [\Q\E] or [\E] or even [^\E] cause an error,
-    because the ] is interpreted as the first data character and the
-    terminating ] is not found. PCRE has been made compatible with Perl in this
-    regard. Previously, it interpreted [\Q\E] as an empty class, and [\E] could
-    cause memory overwriting.
-
-10. Like Perl, PCRE automatically breaks an unlimited repeat after an empty
-    string has been matched (to stop an infinite loop). It was not recognizing
-    a conditional subpattern that could match an empty string if that
-    subpattern was within another subpattern. For example, it looped when
-    trying to match  (((?(1)X|))*)  but it was OK with  ((?(1)X|)*)  where the
-    condition was not nested. This bug has been fixed.
-
-12. A pattern like \X?\d or \P{L}?\d in non-UTF-8 mode could cause a backtrack
-    past the start of the subject in the presence of bytes with the top bit
-    set, for example "\x8aBCD".
-
-13. Added Perl 5.10 experimental backtracking controls (*FAIL), (*F), (*PRUNE),
-    (*SKIP), (*THEN), (*COMMIT), and (*ACCEPT).
-
-14. Optimized (?!) to (*FAIL).
-
-15. Updated the test for a valid UTF-8 string to conform to the later RFC 3629.
-    This restricts code points to be within the range 0 to 0x10FFFF, excluding
-    the "low surrogate" sequence 0xD800 to 0xDFFF. Previously, PCRE allowed the
-    full range 0 to 0x7FFFFFFF, as defined by RFC 2279. Internally, it still
-    does: it's just the validity check that is more restrictive.
-
-16. Inserted checks for integer overflows during escape sequence (backslash)
-    processing, and also fixed erroneous offset values for syntax errors during
-    backslash processing.
-
-17. Fixed another case of looking too far back in non-UTF-8 mode (cf 12 above)
-    for patterns like [\PPP\x8a]{1,}\x80 with the subject "A\x80".
-
-18. An unterminated class in a pattern like (?1)\c[ with a "forward reference"
-    caused an overrun.
-
-19. A pattern like (?:[\PPa*]*){8,} which had an "extended class" (one with
-    something other than just ASCII characters) inside a group that had an
-    unlimited repeat caused a loop at compile time (while checking to see
-    whether the group could match an empty string).
-
-20. Debugging a pattern containing \p or \P could cause a crash. For example,
-    [\P{Any}] did so. (Error in the code for printing property names.)
-
-21. An orphan \E inside a character class could cause a crash.
-
-22. A repeated capturing bracket such as (A)? could cause a wild memory
-    reference during compilation.
-
-23. There are several functions in pcre_compile() that scan along a compiled
-    expression for various reasons (e.g. to see if it's fixed length for look
-    behind). There were bugs in these functions when a repeated \p or \P was
-    present in the pattern. These operators have additional parameters compared
-    with \d, etc, and these were not being taken into account when moving along
-    the compiled data. Specifically:
-
-    (a) A item such as \p{Yi}{3} in a lookbehind was not treated as fixed
-        length.
-
-    (b) An item such as \pL+ within a repeated group could cause crashes or
-        loops.
-
-    (c) A pattern such as \p{Yi}+(\P{Yi}+)(?1) could give an incorrect
-        "reference to non-existent subpattern" error.
-
-    (d) A pattern like (\P{Yi}{2}\277)? could loop at compile time.
-
-24. A repeated \S or \W in UTF-8 mode could give wrong answers when multibyte
-    characters were involved (for example /\S{2}/8g with "A\x{a3}BC").
-
-25. Using pcregrep in multiline, inverted mode (-Mv) caused it to loop.
-
-26. Patterns such as [\P{Yi}A] which include \p or \P and just one other
-    character were causing crashes (broken optimization).
-
-27. Patterns such as (\P{Yi}*\277)* (group with possible zero repeat containing
-    \p or \P) caused a compile-time loop.
-
-28. More problems have arisen in unanchored patterns when CRLF is a valid line
-    break. For example, the unstudied pattern [\r\n]A does not match the string
-    "\r\nA" because change 7.0/46 below moves the current point on by two
-    characters after failing to match at the start. However, the pattern \nA
-    *does* match, because it doesn't start till \n, and if [\r\n]A is studied,
-    the same is true. There doesn't seem any very clean way out of this, but
-    what I have chosen to do makes the common cases work: PCRE now takes note
-    of whether there can be an explicit match for \r or \n anywhere in the
-    pattern, and if so, 7.0/46 no longer applies. As part of this change,
-    there's a new PCRE_INFO_HASCRORLF option for finding out whether a compiled
-    pattern has explicit CR or LF references.
-
-29. Added (*CR) etc for changing newline setting at start of pattern.
-
-
-Version 7.2 19-Jun-07
----------------------
-
- 1. If the fr_FR locale cannot be found for test 3, try the "french" locale,
-    which is apparently normally available under Windows.
-
- 2. Re-jig the pcregrep tests with different newline settings in an attempt
-    to make them independent of the local environment's newline setting.
-
- 3. Add code to configure.ac to remove -g from the CFLAGS default settings.
-
- 4. Some of the "internals" tests were previously cut out when the link size
-    was not 2, because the output contained actual offsets. The recent new
-    "Z" feature of pcretest means that these can be cut out, making the tests
-    usable with all link sizes.
-
- 5. Implemented Stan Switzer's goto replacement for longjmp() when not using
-    stack recursion. This gives a massive performance boost under BSD, but just
-    a small improvement under Linux. However, it saves one field in the frame
-    in all cases.
-
- 6. Added more features from the forthcoming Perl 5.10:
-
-    (a) (?-n) (where n is a string of digits) is a relative subroutine or
-        recursion call. It refers to the nth most recently opened parentheses.
-
-    (b) (?+n) is also a relative subroutine call; it refers to the nth next
-        to be opened parentheses.
-
-    (c) Conditions that refer to capturing parentheses can be specified
-        relatively, for example, (?(-2)... or (?(+3)...
-
-    (d) \K resets the start of the current match so that everything before
-        is not part of it.
-
-    (e) \k{name} is synonymous with \k<name> and \k'name' (.NET compatible).
-
-    (f) \g{name} is another synonym - part of Perl 5.10's unification of
-        reference syntax.
-
-    (g) (?| introduces a group in which the numbering of parentheses in each
-        alternative starts with the same number.
-
-    (h) \h, \H, \v, and \V match horizontal and vertical whitespace.
-
- 7. Added two new calls to pcre_fullinfo(): PCRE_INFO_OKPARTIAL and
-    PCRE_INFO_JCHANGED.
-
- 8. A pattern such as  (.*(.)?)*  caused pcre_exec() to fail by either not
-    terminating or by crashing. Diagnosed by Viktor Griph; it was in the code
-    for detecting groups that can match an empty string.
-
- 9. A pattern with a very large number of alternatives (more than several
-    hundred) was running out of internal workspace during the pre-compile
-    phase, where pcre_compile() figures out how much memory will be needed. A
-    bit of new cunning has reduced the workspace needed for groups with
-    alternatives. The 1000-alternative test pattern now uses 12 bytes of
-    workspace instead of running out of the 4096 that are available.
-
-10. Inserted some missing (unsigned int) casts to get rid of compiler warnings.
-
-11. Applied patch from Google to remove an optimization that didn't quite work.
-    The report of the bug said:
-
-      pcrecpp::RE("a*").FullMatch("aaa") matches, while
-      pcrecpp::RE("a*?").FullMatch("aaa") does not, and
-      pcrecpp::RE("a*?\\z").FullMatch("aaa") does again.
-
-12. If \p or \P was used in non-UTF-8 mode on a character greater than 127
-    it matched the wrong number of bytes.
-
-
-Version 7.1 24-Apr-07
----------------------
-
- 1. Applied Bob Rossi and Daniel G's patches to convert the build system to one
-    that is more "standard", making use of automake and other Autotools. There
-    is some re-arrangement of the files and adjustment of comments consequent
-    on this.
-
- 2. Part of the patch fixed a problem with the pcregrep tests. The test of -r
-    for recursive directory scanning broke on some systems because the files
-    are not scanned in any specific order and on different systems the order
-    was different. A call to "sort" has been inserted into RunGrepTest for the
-    approprate test as a short-term fix. In the longer term there may be an
-    alternative.
-
- 3. I had an email from Eric Raymond about problems translating some of PCRE's
-    man pages to HTML (despite the fact that I distribute HTML pages, some
-    people do their own conversions for various reasons). The problems
-    concerned the use of low-level troff macros .br and .in. I have therefore
-    removed all such uses from the man pages (some were redundant, some could
-    be replaced by .nf/.fi pairs). The 132html script that I use to generate
-    HTML has been updated to handle .nf/.fi and to complain if it encounters
-    .br or .in.
-
- 4. Updated comments in configure.ac that get placed in config.h.in and also
-    arranged for config.h to be included in the distribution, with the name
-    config.h.generic, for the benefit of those who have to compile without
-    Autotools (compare pcre.h, which is now distributed as pcre.h.generic).
-
- 5. Updated the support (such as it is) for Virtual Pascal, thanks to Stefan
-    Weber: (1) pcre_internal.h was missing some function renames; (2) updated
-    makevp.bat for the current PCRE, using the additional files
-    makevp_c.txt, makevp_l.txt, and pcregexp.pas.
-
- 6. A Windows user reported a minor discrepancy with test 2, which turned out
-    to be caused by a trailing space on an input line that had got lost in his
-    copy. The trailing space was an accident, so I've just removed it.
-
- 7. Add -Wl,-R... flags in pcre-config.in for *BSD* systems, as I'm told
-    that is needed.
-
- 8. Mark ucp_table (in ucptable.h) and ucp_gentype (in pcre_ucp_searchfuncs.c)
-    as "const" (a) because they are and (b) because it helps the PHP
-    maintainers who have recently made a script to detect big data structures
-    in the php code that should be moved to the .rodata section. I remembered
-    to update Builducptable as well, so it won't revert if ucptable.h is ever
-    re-created.
-
- 9. Added some extra #ifdef SUPPORT_UTF8 conditionals into pcretest.c,
-    pcre_printint.src, pcre_compile.c, pcre_study.c, and pcre_tables.c, in
-    order to be able to cut out the UTF-8 tables in the latter when UTF-8
-    support is not required. This saves 1.5-2K of code, which is important in
-    some applications.
-
-    Later: more #ifdefs are needed in pcre_ord2utf8.c and pcre_valid_utf8.c
-    so as not to refer to the tables, even though these functions will never be
-    called when UTF-8 support is disabled. Otherwise there are problems with a
-    shared library.
-
-10. Fixed two bugs in the emulated memmove() function in pcre_internal.h:
-
-    (a) It was defining its arguments as char * instead of void *.
-
-    (b) It was assuming that all moves were upwards in memory; this was true
-        a long time ago when I wrote it, but is no longer the case.
-
-    The emulated memove() is provided for those environments that have neither
-    memmove() nor bcopy(). I didn't think anyone used it these days, but that
-    is clearly not the case, as these two bugs were recently reported.
-
-11. The script PrepareRelease is now distributed: it calls 132html, CleanTxt,
-    and Detrail to create the HTML documentation, the .txt form of the man
-    pages, and it removes trailing spaces from listed files. It also creates
-    pcre.h.generic and config.h.generic from pcre.h and config.h. In the latter
-    case, it wraps all the #defines with #ifndefs. This script should be run
-    before "make dist".
-
-12. Fixed two fairly obscure bugs concerned with quantified caseless matching
-    with Unicode property support.
-
-    (a) For a maximizing quantifier, if the two different cases of the
-        character were of different lengths in their UTF-8 codings (there are
-        some cases like this - I found 11), and the matching function had to
-        back up over a mixture of the two cases, it incorrectly assumed they
-        were both the same length.
-
-    (b) When PCRE was configured to use the heap rather than the stack for
-        recursion during matching, it was not correctly preserving the data for
-        the other case of a UTF-8 character when checking ahead for a match
-        while processing a minimizing repeat. If the check also involved
-        matching a wide character, but failed, corruption could cause an
-        erroneous result when trying to check for a repeat of the original
-        character.
-
-13. Some tidying changes to the testing mechanism:
-
-    (a) The RunTest script now detects the internal link size and whether there
-        is UTF-8 and UCP support by running ./pcretest -C instead of relying on
-        values substituted by "configure". (The RunGrepTest script already did
-        this for UTF-8.) The configure.ac script no longer substitutes the
-        relevant variables.
-
-    (b) The debugging options /B and /D in pcretest show the compiled bytecode
-        with length and offset values. This means that the output is different
-        for different internal link sizes. Test 2 is skipped for link sizes
-        other than 2 because of this, bypassing the problem. Unfortunately,
-        there was also a test in test 3 (the locale tests) that used /B and
-        failed for link sizes other than 2. Rather than cut the whole test out,
-        I have added a new /Z option to pcretest that replaces the length and
-        offset values with spaces. This is now used to make test 3 independent
-        of link size. (Test 2 will be tidied up later.)
-
-14. If erroroffset was passed as NULL to pcre_compile, it provoked a
-    segmentation fault instead of returning the appropriate error message.
-
-15. In multiline mode when the newline sequence was set to "any", the pattern
-    ^$ would give a match between the \r and \n of a subject such as "A\r\nB".
-    This doesn't seem right; it now treats the CRLF combination as the line
-    ending, and so does not match in that case. It's only a pattern such as ^$
-    that would hit this one: something like ^ABC$ would have failed after \r
-    and then tried again after \r\n.
-
-16. Changed the comparison command for RunGrepTest from "diff -u" to "diff -ub"
-    in an attempt to make files that differ only in their line terminators
-    compare equal. This works on Linux.
-
-17. Under certain error circumstances pcregrep might try to free random memory
-    as it exited. This is now fixed, thanks to valgrind.
-
-19. In pcretest, if the pattern /(?m)^$/g<any> was matched against the string
-    "abc\r\n\r\n", it found an unwanted second match after the second \r. This
-    was because its rules for how to advance for /g after matching an empty
-    string at the end of a line did not allow for this case. They now check for
-    it specially.
-
-20. pcretest is supposed to handle patterns and data of any length, by
-    extending its buffers when necessary. It was getting this wrong when the
-    buffer for a data line had to be extended.
-
-21. Added PCRE_NEWLINE_ANYCRLF which is like ANY, but matches only CR, LF, or
-    CRLF as a newline sequence.
-
-22. Code for handling Unicode properties in pcre_dfa_exec() wasn't being cut
-    out by #ifdef SUPPORT_UCP. This did no harm, as it could never be used, but
-    I have nevertheless tidied it up.
-
-23. Added some casts to kill warnings from HP-UX ia64 compiler.
-
-24. Added a man page for pcre-config.
-
-
-Version 7.0 19-Dec-06
----------------------
-
- 1. Fixed a signed/unsigned compiler warning in pcre_compile.c, shown up by
-    moving to gcc 4.1.1.
-
- 2. The -S option for pcretest uses setrlimit(); I had omitted to #include
-    sys/time.h, which is documented as needed for this function. It doesn't
-    seem to matter on Linux, but it showed up on some releases of OS X.
-
- 3. It seems that there are systems where bytes whose values are greater than
-    127 match isprint() in the "C" locale. The "C" locale should be the
-    default when a C program starts up. In most systems, only ASCII printing
-    characters match isprint(). This difference caused the output from pcretest
-    to vary, making some of the tests fail. I have changed pcretest so that:
-
-    (a) When it is outputting text in the compiled version of a pattern, bytes
-        other than 32-126 are always shown as hex escapes.
-
-    (b) When it is outputting text that is a matched part of a subject string,
-        it does the same, unless a different locale has been set for the match
-        (using the /L modifier). In this case, it uses isprint() to decide.
-
- 4. Fixed a major bug that caused incorrect computation of the amount of memory
-    required for a compiled pattern when options that changed within the
-    pattern affected the logic of the preliminary scan that determines the
-    length. The relevant options are -x, and -i in UTF-8 mode. The result was
-    that the computed length was too small. The symptoms of this bug were
-    either the PCRE error "internal error: code overflow" from pcre_compile(),
-    or a glibc crash with a message such as "pcretest: free(): invalid next
-    size (fast)". Examples of patterns that provoked this bug (shown in
-    pcretest format) are:
-
-      /(?-x: )/x
-      /(?x)(?-x: \s*#\s*)/
-      /((?i)[\x{c0}])/8
-      /(?i:[\x{c0}])/8
-
-    HOWEVER: Change 17 below makes this fix obsolete as the memory computation
-    is now done differently.
-
- 5. Applied patches from Google to: (a) add a QuoteMeta function to the C++
-    wrapper classes; (b) implement a new function in the C++ scanner that is
-    more efficient than the old way of doing things because it avoids levels of
-    recursion in the regex matching; (c) add a paragraph to the documentation
-    for the FullMatch() function.
-
- 6. The escape sequence \n was being treated as whatever was defined as
-    "newline". Not only was this contrary to the documentation, which states
-    that \n is character 10 (hex 0A), but it also went horribly wrong when
-    "newline" was defined as CRLF. This has been fixed.
-
- 7. In pcre_dfa_exec.c the value of an unsigned integer (the variable called c)
-    was being set to -1 for the "end of line" case (supposedly a value that no
-    character can have). Though this value is never used (the check for end of
-    line is "zero bytes in current character"), it caused compiler complaints.
-    I've changed it to 0xffffffff.
-
- 8. In pcre_version.c, the version string was being built by a sequence of
-    C macros that, in the event of PCRE_PRERELEASE being defined as an empty
-    string (as it is for production releases) called a macro with an empty
-    argument. The C standard says the result of this is undefined. The gcc
-    compiler treats it as an empty string (which was what was wanted) but it is
-    reported that Visual C gives an error. The source has been hacked around to
-    avoid this problem.
-
- 9. On the advice of a Windows user, included <io.h> and <fcntl.h> in Windows
-    builds of pcretest, and changed the call to _setmode() to use _O_BINARY
-    instead of 0x8000. Made all the #ifdefs test both _WIN32 and WIN32 (not all
-    of them did).
-
-10. Originally, pcretest opened its input and output without "b"; then I was
-    told that "b" was needed in some environments, so it was added for release
-    5.0 to both the input and output. (It makes no difference on Unix-like
-    systems.) Later I was told that it is wrong for the input on Windows. I've
-    now abstracted the modes into two macros, to make it easier to fiddle with
-    them, and removed "b" from the input mode under Windows.
-
-11. Added pkgconfig support for the C++ wrapper library, libpcrecpp.
-
-12. Added -help and --help to pcretest as an official way of being reminded
-    of the options.
-
-13. Removed some redundant semicolons after macro calls in pcrecpparg.h.in
-    and pcrecpp.cc because they annoy compilers at high warning levels.
-
-14. A bit of tidying/refactoring in pcre_exec.c in the main bumpalong loop.
-
-15. Fixed an occurrence of == in configure.ac that should have been = (shell
-    scripts are not C programs :-) and which was not noticed because it works
-    on Linux.
-
-16. pcretest is supposed to handle any length of pattern and data line (as one
-    line or as a continued sequence of lines) by extending its input buffer if
-    necessary. This feature was broken for very long pattern lines, leading to
-    a string of junk being passed to pcre_compile() if the pattern was longer
-    than about 50K.
-
-17. I have done a major re-factoring of the way pcre_compile() computes the
-    amount of memory needed for a compiled pattern. Previously, there was code
-    that made a preliminary scan of the pattern in order to do this. That was
-    OK when PCRE was new, but as the facilities have expanded, it has become
-    harder and harder to keep it in step with the real compile phase, and there
-    have been a number of bugs (see for example, 4 above). I have now found a
-    cunning way of running the real compile function in a "fake" mode that
-    enables it to compute how much memory it would need, while actually only
-    ever using a few hundred bytes of working memory and without too many
-    tests of the mode. This should make future maintenance and development
-    easier. A side effect of this work is that the limit of 200 on the nesting
-    depth of parentheses has been removed (though this was never a serious
-    limitation, I suspect). However, there is a downside: pcre_compile() now
-    runs more slowly than before (30% or more, depending on the pattern). I
-    hope this isn't a big issue. There is no effect on runtime performance.
-
-18. Fixed a minor bug in pcretest: if a pattern line was not terminated by a
-    newline (only possible for the last line of a file) and it was a
-    pattern that set a locale (followed by /Lsomething), pcretest crashed.
-
-19. Added additional timing features to pcretest. (1) The -tm option now times
-    matching only, not compiling. (2) Both -t and -tm can be followed, as a
-    separate command line item, by a number that specifies the number of
-    repeats to use when timing. The default is 50000; this gives better
-    precision, but takes uncomfortably long for very large patterns.
-
-20. Extended pcre_study() to be more clever in cases where a branch of a
-    subpattern has no definite first character. For example, (a*|b*)[cd] would
-    previously give no result from pcre_study(). Now it recognizes that the
-    first character must be a, b, c, or d.
-
-21. There was an incorrect error "recursive call could loop indefinitely" if
-    a subpattern (or the entire pattern) that was being tested for matching an
-    empty string contained only one non-empty item after a nested subpattern.
-    For example, the pattern (?>\x{100}*)\d(?R) provoked this error
-    incorrectly, because the \d was being skipped in the check.
-
-22. The pcretest program now has a new pattern option /B and a command line
-    option -b, which is equivalent to adding /B to every pattern. This causes
-    it to show the compiled bytecode, without the additional information that
-    -d shows. The effect of -d is now the same as -b with -i (and similarly, /D
-    is the same as /B/I).
-
-23. A new optimization is now able automatically to treat some sequences such
-    as a*b as a*+b. More specifically, if something simple (such as a character
-    or a simple class like \d) has an unlimited quantifier, and is followed by
-    something that cannot possibly match the quantified thing, the quantifier
-    is automatically "possessified".
-
-24. A recursive reference to a subpattern whose number was greater than 39
-    went wrong under certain circumstances in UTF-8 mode. This bug could also
-    have affected the operation of pcre_study().
-
-25. Realized that a little bit of performance could be had by replacing
-    (c & 0xc0) == 0xc0 with c >= 0xc0 when processing UTF-8 characters.
-
-26. Timing data from pcretest is now shown to 4 decimal places instead of 3.
-
-27. Possessive quantifiers such as a++ were previously implemented by turning
-    them into atomic groups such as ($>a+). Now they have their own opcodes,
-    which improves performance. This includes the automatically created ones
-    from 23 above.
-
-28. A pattern such as (?=(\w+))\1: which simulates an atomic group using a
-    lookahead was broken if it was not anchored. PCRE was mistakenly expecting
-    the first matched character to be a colon. This applied both to named and
-    numbered groups.
-
-29. The ucpinternal.h header file was missing its idempotency #ifdef.
-
-30. I was sent a "project" file called libpcre.a.dev which I understand makes
-    building PCRE on Windows easier, so I have included it in the distribution.
-
-31. There is now a check in pcretest against a ridiculously large number being
-    returned by pcre_exec() or pcre_dfa_exec(). If this happens in a /g or /G
-    loop, the loop is abandoned.
-
-32. Forward references to subpatterns in conditions such as (?(2)...) where
-    subpattern 2 is defined later cause pcre_compile() to search forwards in
-    the pattern for the relevant set of parentheses. This search went wrong
-    when there were unescaped parentheses in a character class, parentheses
-    escaped with \Q...\E, or parentheses in a #-comment in /x mode.
-
-33. "Subroutine" calls and backreferences were previously restricted to
-    referencing subpatterns earlier in the regex. This restriction has now
-    been removed.
-
-34. Added a number of extra features that are going to be in Perl 5.10. On the
-    whole, these are just syntactic alternatives for features that PCRE had
-    previously implemented using the Python syntax or my own invention. The
-    other formats are all retained for compatibility.
-
-    (a) Named groups can now be defined as (?<name>...) or (?'name'...) as well
-        as (?P<name>...). The new forms, as well as being in Perl 5.10, are
-        also .NET compatible.
-
-    (b) A recursion or subroutine call to a named group can now be defined as
-        (?&name) as well as (?P>name).
-
-    (c) A backreference to a named group can now be defined as \k<name> or
-        \k'name' as well as (?P=name). The new forms, as well as being in Perl
-        5.10, are also .NET compatible.
-
-    (d) A conditional reference to a named group can now use the syntax
-        (?(<name>) or (?('name') as well as (?(name).
-
-    (e) A "conditional group" of the form (?(DEFINE)...) can be used to define
-        groups (named and numbered) that are never evaluated inline, but can be
-        called as "subroutines" from elsewhere. In effect, the DEFINE condition
-        is always false. There may be only one alternative in such a group.
-
-    (f) A test for recursion can be given as (?(R1).. or (?(R&name)... as well
-        as the simple (?(R). The condition is true only if the most recent
-        recursion is that of the given number or name. It does not search out
-        through the entire recursion stack.
-
-    (g) The escape \gN or \g{N} has been added, where N is a positive or
-        negative number, specifying an absolute or relative reference.
-
-35. Tidied to get rid of some further signed/unsigned compiler warnings and
-    some "unreachable code" warnings.
-
-36. Updated the Unicode property tables to Unicode version 5.0.0. Amongst other
-    things, this adds five new scripts.
-
-37. Perl ignores orphaned \E escapes completely. PCRE now does the same.
-    There were also incompatibilities regarding the handling of \Q..\E inside
-    character classes, for example with patterns like [\Qa\E-\Qz\E] where the
-    hyphen was adjacent to \Q or \E. I hope I've cleared all this up now.
-
-38. Like Perl, PCRE detects when an indefinitely repeated parenthesized group
-    matches an empty string, and forcibly breaks the loop. There were bugs in
-    this code in non-simple cases. For a pattern such as  ^(a()*)*  matched
-    against  aaaa  the result was just "a" rather than "aaaa", for example. Two
-    separate and independent bugs (that affected different cases) have been
-    fixed.
-
-39. Refactored the code to abolish the use of different opcodes for small
-    capturing bracket numbers. This is a tidy that I avoided doing when I
-    removed the limit on the number of capturing brackets for 3.5 back in 2001.
-    The new approach is not only tidier, it makes it possible to reduce the
-    memory needed to fix the previous bug (38).
-
-40. Implemented PCRE_NEWLINE_ANY to recognize any of the Unicode newline
-    sequences (http://unicode.org/unicode/reports/tr18/) as "newline" when
-    processing dot, circumflex, or dollar metacharacters, or #-comments in /x
-    mode.
-
-41. Add \R to match any Unicode newline sequence, as suggested in the Unicode
-    report.
-
-42. Applied patch, originally from Ari Pollak, modified by Google, to allow
-    copy construction and assignment in the C++ wrapper.
-
-43. Updated pcregrep to support "--newline=any". In the process, I fixed a
-    couple of bugs that could have given wrong results in the "--newline=crlf"
-    case.
-
-44. Added a number of casts and did some reorganization of signed/unsigned int
-    variables following suggestions from Dair Grant. Also renamed the variable
-    "this" as "item" because it is a C++ keyword.
-
-45. Arranged for dftables to add
-
-      #include "pcre_internal.h"
-
-    to pcre_chartables.c because without it, gcc 4.x may remove the array
-    definition from the final binary if PCRE is built into a static library and
-    dead code stripping is activated.
-
-46. For an unanchored pattern, if a match attempt fails at the start of a
-    newline sequence, and the newline setting is CRLF or ANY, and the next two
-    characters are CRLF, advance by two characters instead of one.
-
-
-Version 6.7 04-Jul-06
----------------------
-
- 1. In order to handle tests when input lines are enormously long, pcretest has
-    been re-factored so that it automatically extends its buffers when
-    necessary. The code is crude, but this _is_ just a test program. The
-    default size has been increased from 32K to 50K.
-
- 2. The code in pcre_study() was using the value of the re argument before
-    testing it for NULL. (Of course, in any sensible call of the function, it
-    won't be NULL.)
-
- 3. The memmove() emulation function in pcre_internal.h, which is used on
-    systems that lack both memmove() and bcopy() - that is, hardly ever -
-    was missing a "static" storage class specifier.
-
- 4. When UTF-8 mode was not set, PCRE looped when compiling certain patterns
-    containing an extended class (one that cannot be represented by a bitmap
-    because it contains high-valued characters or Unicode property items, e.g.
-    [\pZ]). Almost always one would set UTF-8 mode when processing such a
-    pattern, but PCRE should not loop if you do not (it no longer does).
-    [Detail: two cases were found: (a) a repeated subpattern containing an
-    extended class; (b) a recursive reference to a subpattern that followed a
-    previous extended class. It wasn't skipping over the extended class
-    correctly when UTF-8 mode was not set.]
-
- 5. A negated single-character class was not being recognized as fixed-length
-    in lookbehind assertions such as (?<=[^f]), leading to an incorrect
-    compile error "lookbehind assertion is not fixed length".
-
- 6. The RunPerlTest auxiliary script was showing an unexpected difference
-    between PCRE and Perl for UTF-8 tests. It turns out that it is hard to
-    write a Perl script that can interpret lines of an input file either as
-    byte characters or as UTF-8, which is what "perltest" was being required to
-    do for the non-UTF-8 and UTF-8 tests, respectively. Essentially what you
-    can't do is switch easily at run time between having the "use utf8;" pragma
-    or not. In the end, I fudged it by using the RunPerlTest script to insert
-    "use utf8;" explicitly for the UTF-8 tests.
-
- 7. In multiline (/m) mode, PCRE was matching ^ after a terminating newline at
-    the end of the subject string, contrary to the documentation and to what
-    Perl does. This was true of both matching functions. Now it matches only at
-    the start of the subject and immediately after *internal* newlines.
-
- 8. A call of pcre_fullinfo() from pcretest to get the option bits was passing
-    a pointer to an int instead of a pointer to an unsigned long int. This
-    caused problems on 64-bit systems.
-
- 9. Applied a patch from the folks at Google to pcrecpp.cc, to fix "another
-    instance of the 'standard' template library not being so standard".
-
-10. There was no check on the number of named subpatterns nor the maximum
-    length of a subpattern name. The product of these values is used to compute
-    the size of the memory block for a compiled pattern. By supplying a very
-    long subpattern name and a large number of named subpatterns, the size
-    computation could be caused to overflow. This is now prevented by limiting
-    the length of names to 32 characters, and the number of named subpatterns
-    to 10,000.
-
-11. Subpatterns that are repeated with specific counts have to be replicated in
-    the compiled pattern. The size of memory for this was computed from the
-    length of the subpattern and the repeat count. The latter is limited to
-    65535, but there was no limit on the former, meaning that integer overflow
-    could in principle occur. The compiled length of a repeated subpattern is
-    now limited to 30,000 bytes in order to prevent this.
-
-12. Added the optional facility to have named substrings with the same name.
-
-13. Added the ability to use a named substring as a condition, using the
-    Python syntax: (?(name)yes|no). This overloads (?(R)... and names that
-    are numbers (not recommended). Forward references are permitted.
-
-14. Added forward references in named backreferences (if you see what I mean).
-
-15. In UTF-8 mode, with the PCRE_DOTALL option set, a quantified dot in the
-    pattern could run off the end of the subject. For example, the pattern
-    "(?s)(.{1,5})"8 did this with the subject "ab".
-
-16. If PCRE_DOTALL or PCRE_MULTILINE were set, pcre_dfa_exec() behaved as if
-    PCRE_CASELESS was set when matching characters that were quantified with ?
-    or *.
-
-17. A character class other than a single negated character that had a minimum
-    but no maximum quantifier - for example [ab]{6,} - was not handled
-    correctly by pce_dfa_exec(). It would match only one character.
-
-18. A valid (though odd) pattern that looked like a POSIX character
-    class but used an invalid character after [ (for example [[,abc,]]) caused
-    pcre_compile() to give the error "Failed: internal error: code overflow" or
-    in some cases to crash with a glibc free() error. This could even happen if
-    the pattern terminated after [[ but there just happened to be a sequence of
-    letters, a binary zero, and a closing ] in the memory that followed.
-
-19. Perl's treatment of octal escapes in the range \400 to \777 has changed
-    over the years. Originally (before any Unicode support), just the bottom 8
-    bits were taken. Thus, for example, \500 really meant \100. Nowadays the
-    output from "man perlunicode" includes this:
-
-      The regular expression compiler produces polymorphic opcodes.  That
-      is, the pattern adapts to the data and automatically switches to
-      the Unicode character scheme when presented with Unicode data--or
-      instead uses a traditional byte scheme when presented with byte
-      data.
-
-    Sadly, a wide octal escape does not cause a switch, and in a string with
-    no other multibyte characters, these octal escapes are treated as before.
-    Thus, in Perl, the pattern  /\500/ actually matches \100 but the pattern
-    /\500|\x{1ff}/ matches \500 or \777 because the whole thing is treated as a
-    Unicode string.
-
-    I have not perpetrated such confusion in PCRE. Up till now, it took just
-    the bottom 8 bits, as in old Perl. I have now made octal escapes with
-    values greater than \377 illegal in non-UTF-8 mode. In UTF-8 mode they
-    translate to the appropriate multibyte character.
-
-29. Applied some refactoring to reduce the number of warnings from Microsoft
-    and Borland compilers. This has included removing the fudge introduced
-    seven years ago for the OS/2 compiler (see 2.02/2 below) because it caused
-    a warning about an unused variable.
-
-21. PCRE has not included VT (character 0x0b) in the set of whitespace
-    characters since release 4.0, because Perl (from release 5.004) does not.
-    [Or at least, is documented not to: some releases seem to be in conflict
-    with the documentation.] However, when a pattern was studied with
-    pcre_study() and all its branches started with \s, PCRE still included VT
-    as a possible starting character. Of course, this did no harm; it just
-    caused an unnecessary match attempt.
-
-22. Removed a now-redundant internal flag bit that recorded the fact that case
-    dependency changed within the pattern. This was once needed for "required
-    byte" processing, but is no longer used. This recovers a now-scarce options
-    bit. Also moved the least significant internal flag bit to the most-
-    significant bit of the word, which was not previously used (hangover from
-    the days when it was an int rather than a uint) to free up another bit for
-    the future.
-
-23. Added support for CRLF line endings as well as CR and LF. As well as the
-    default being selectable at build time, it can now be changed at runtime
-    via the PCRE_NEWLINE_xxx flags. There are now options for pcregrep to
-    specify that it is scanning data with non-default line endings.
-
-24. Changed the definition of CXXLINK to make it agree with the definition of
-    LINK in the Makefile, by replacing LDFLAGS to CXXFLAGS.
-
-25. Applied Ian Taylor's patches to avoid using another stack frame for tail
-    recursions. This makes a big different to stack usage for some patterns.
-
-26. If a subpattern containing a named recursion or subroutine reference such
-    as (?P>B) was quantified, for example (xxx(?P>B)){3}, the calculation of
-    the space required for the compiled pattern went wrong and gave too small a
-    value. Depending on the environment, this could lead to "Failed: internal
-    error: code overflow at offset 49" or "glibc detected double free or
-    corruption" errors.
-
-27. Applied patches from Google (a) to support the new newline modes and (b) to
-    advance over multibyte UTF-8 characters in GlobalReplace.
-
-28. Change free() to pcre_free() in pcredemo.c. Apparently this makes a
-    difference for some implementation of PCRE in some Windows version.
-
-29. Added some extra testing facilities to pcretest:
-
-    \q<number>   in a data line sets the "match limit" value
-    \Q<number>   in a data line sets the "match recursion limt" value
-    -S <number>  sets the stack size, where <number> is in megabytes
-
-    The -S option isn't available for Windows.
-
-
-Version 6.6 06-Feb-06
----------------------
-
- 1. Change 16(a) for 6.5 broke things, because PCRE_DATA_SCOPE was not defined
-    in pcreposix.h. I have copied the definition from pcre.h.
-
- 2. Change 25 for 6.5 broke compilation in a build directory out-of-tree
-    because pcre.h is no longer a built file.
-
- 3. Added Jeff Friedl's additional debugging patches to pcregrep. These are
-    not normally included in the compiled code.
-
-
-Version 6.5 01-Feb-06
----------------------
-
- 1. When using the partial match feature with pcre_dfa_exec(), it was not
-    anchoring the second and subsequent partial matches at the new starting
-    point. This could lead to incorrect results. For example, with the pattern
-    /1234/, partially matching against "123" and then "a4" gave a match.
-
- 2. Changes to pcregrep:
-
-    (a) All non-match returns from pcre_exec() were being treated as failures
-        to match the line. Now, unless the error is PCRE_ERROR_NOMATCH, an
-        error message is output. Some extra information is given for the
-        PCRE_ERROR_MATCHLIMIT and PCRE_ERROR_RECURSIONLIMIT errors, which are
-        probably the only errors that are likely to be caused by users (by
-        specifying a regex that has nested indefinite repeats, for instance).
-        If there are more than 20 of these errors, pcregrep is abandoned.
-
-    (b) A binary zero was treated as data while matching, but terminated the
-        output line if it was written out. This has been fixed: binary zeroes
-        are now no different to any other data bytes.
-
-    (c) Whichever of the LC_ALL or LC_CTYPE environment variables is set is
-        used to set a locale for matching. The --locale=xxxx long option has
-        been added (no short equivalent) to specify a locale explicitly on the
-        pcregrep command, overriding the environment variables.
-
-    (d) When -B was used with -n, some line numbers in the output were one less
-        than they should have been.
-
-    (e) Added the -o (--only-matching) option.
-
-    (f) If -A or -C was used with -c (count only), some lines of context were
-        accidentally printed for the final match.
-
-    (g) Added the -H (--with-filename) option.
-
-    (h) The combination of options -rh failed to suppress file names for files
-        that were found from directory arguments.
-
-    (i) Added the -D (--devices) and -d (--directories) options.
-
-    (j) Added the -F (--fixed-strings) option.
-
-    (k) Allow "-" to be used as a file name for -f as well as for a data file.
-
-    (l) Added the --colo(u)r option.
-
-    (m) Added Jeffrey Friedl's -S testing option, but within #ifdefs so that it
-        is not present by default.
-
- 3. A nasty bug was discovered in the handling of recursive patterns, that is,
-    items such as (?R) or (?1), when the recursion could match a number of
-    alternatives. If it matched one of the alternatives, but subsequently,
-    outside the recursion, there was a failure, the code tried to back up into
-    the recursion. However, because of the way PCRE is implemented, this is not
-    possible, and the result was an incorrect result from the match.
-
-    In order to prevent this happening, the specification of recursion has
-    been changed so that all such subpatterns are automatically treated as
-    atomic groups. Thus, for example, (?R) is treated as if it were (?>(?R)).
-
- 4. I had overlooked the fact that, in some locales, there are characters for
-    which isalpha() is true but neither isupper() nor islower() are true. In
-    the fr_FR locale, for instance, the \xAA and \xBA characters (ordmasculine
-    and ordfeminine) are like this. This affected the treatment of \w and \W
-    when they appeared in character classes, but not when they appeared outside
-    a character class. The bit map for "word" characters is now created
-    separately from the results of isalnum() instead of just taking it from the
-    upper, lower, and digit maps. (Plus the underscore character, of course.)
-
- 5. The above bug also affected the handling of POSIX character classes such as
-    [[:alpha:]] and [[:alnum:]]. These do not have their own bit maps in PCRE's
-    permanent tables. Instead, the bit maps for such a class were previously
-    created as the appropriate unions of the upper, lower, and digit bitmaps.
-    Now they are created by subtraction from the [[:word:]] class, which has
-    its own bitmap.
-
- 6. The [[:blank:]] character class matches horizontal, but not vertical space.
-    It is created by subtracting the vertical space characters (\x09, \x0a,
-    \x0b, \x0c) from the [[:space:]] bitmap. Previously, however, the
-    subtraction was done in the overall bitmap for a character class, meaning
-    that a class such as [\x0c[:blank:]] was incorrect because \x0c would not
-    be recognized. This bug has been fixed.
-
- 7. Patches from the folks at Google:
-
-      (a) pcrecpp.cc: "to handle a corner case that may or may not happen in
-      real life, but is still worth protecting against".
-
-      (b) pcrecpp.cc: "corrects a bug when negative radixes are used with
-      regular expressions".
-
-      (c) pcre_scanner.cc: avoid use of std::count() because not all systems
-      have it.
-
-      (d) Split off pcrecpparg.h from pcrecpp.h and had the former built by
-      "configure" and the latter not, in order to fix a problem somebody had
-      with compiling the Arg class on HP-UX.
-
-      (e) Improve the error-handling of the C++ wrapper a little bit.
-
-      (f) New tests for checking recursion limiting.
-
- 8. The pcre_memmove() function, which is used only if the environment does not
-    have a standard memmove() function (and is therefore rarely compiled),
-    contained two bugs: (a) use of int instead of size_t, and (b) it was not
-    returning a result (though PCRE never actually uses the result).
-
- 9. In the POSIX regexec() interface, if nmatch is specified as a ridiculously
-    large number - greater than INT_MAX/(3*sizeof(int)) - REG_ESPACE is
-    returned instead of calling malloc() with an overflowing number that would
-    most likely cause subsequent chaos.
-
-10. The debugging option of pcretest was not showing the NO_AUTO_CAPTURE flag.
-
-11. The POSIX flag REG_NOSUB is now supported. When a pattern that was compiled
-    with this option is matched, the nmatch and pmatch options of regexec() are
-    ignored.
-
-12. Added REG_UTF8 to the POSIX interface. This is not defined by POSIX, but is
-    provided in case anyone wants to the the POSIX interface with UTF-8
-    strings.
-
-13. Added CXXLDFLAGS to the Makefile parameters to provide settings only on the
-    C++ linking (needed for some HP-UX environments).
-
-14. Avoid compiler warnings in get_ucpname() when compiled without UCP support
-    (unused parameter) and in the pcre_printint() function (omitted "default"
-    switch label when the default is to do nothing).
-
-15. Added some code to make it possible, when PCRE is compiled as a C++
-    library, to replace subject pointers for pcre_exec() with a smart pointer
-    class, thus making it possible to process discontinuous strings.
-
-16. The two macros PCRE_EXPORT and PCRE_DATA_SCOPE are confusing, and perform
-    much the same function. They were added by different people who were trying
-    to make PCRE easy to compile on non-Unix systems. It has been suggested
-    that PCRE_EXPORT be abolished now that there is more automatic apparatus
-    for compiling on Windows systems. I have therefore replaced it with
-    PCRE_DATA_SCOPE. This is set automatically for Windows; if not set it
-    defaults to "extern" for C or "extern C" for C++, which works fine on
-    Unix-like systems. It is now possible to override the value of PCRE_DATA_
-    SCOPE with something explicit in config.h. In addition:
-
-    (a) pcreposix.h still had just "extern" instead of either of these macros;
-        I have replaced it with PCRE_DATA_SCOPE.
-
-    (b) Functions such as _pcre_xclass(), which are internal to the library,
-        but external in the C sense, all had PCRE_EXPORT in their definitions.
-        This is apparently wrong for the Windows case, so I have removed it.
-        (It makes no difference on Unix-like systems.)
-
-17. Added a new limit, MATCH_LIMIT_RECURSION, which limits the depth of nesting
-    of recursive calls to match(). This is different to MATCH_LIMIT because
-    that limits the total number of calls to match(), not all of which increase
-    the depth of recursion. Limiting the recursion depth limits the amount of
-    stack (or heap if NO_RECURSE is set) that is used. The default can be set
-    when PCRE is compiled, and changed at run time. A patch from Google adds
-    this functionality to the C++ interface.
-
-18. Changes to the handling of Unicode character properties:
-
-    (a) Updated the table to Unicode 4.1.0.
-
-    (b) Recognize characters that are not in the table as "Cn" (undefined).
-
-    (c) I revised the way the table is implemented to a much improved format
-        which includes recognition of ranges. It now supports the ranges that
-        are defined in UnicodeData.txt, and it also amalgamates other
-        characters into ranges. This has reduced the number of entries in the
-        table from around 16,000 to around 3,000, thus reducing its size
-        considerably. I realized I did not need to use a tree structure after
-        all - a binary chop search is just as efficient. Having reduced the
-        number of entries, I extended their size from 6 bytes to 8 bytes to
-        allow for more data.
-
-    (d) Added support for Unicode script names via properties such as \p{Han}.
-
-19. In UTF-8 mode, a backslash followed by a non-Ascii character was not
-    matching that character.
-
-20. When matching a repeated Unicode property with a minimum greater than zero,
-    (for example \pL{2,}), PCRE could look past the end of the subject if it
-    reached it while seeking the minimum number of characters. This could
-    happen only if some of the characters were more than one byte long, because
-    there is a check for at least the minimum number of bytes.
-
-21. Refactored the implementation of \p and \P so as to be more general, to
-    allow for more different types of property in future. This has changed the
-    compiled form incompatibly. Anybody with saved compiled patterns that use
-    \p or \P will have to recompile them.
-
-22. Added "Any" and "L&" to the supported property types.
-
-23. Recognize \x{...} as a code point specifier, even when not in UTF-8 mode,
-    but give a compile time error if the value is greater than 0xff.
-
-24. The man pages for pcrepartial, pcreprecompile, and pcre_compile2 were
-    accidentally not being installed or uninstalled.
-
-25. The pcre.h file was built from pcre.h.in, but the only changes that were
-    made were to insert the current release number. This seemed silly, because
-    it made things harder for people building PCRE on systems that don't run
-    "configure". I have turned pcre.h into a distributed file, no longer built
-    by "configure", with the version identification directly included. There is
-    no longer a pcre.h.in file.
-
-    However, this change necessitated a change to the pcre-config script as
-    well. It is built from pcre-config.in, and one of the substitutions was the
-    release number. I have updated configure.ac so that ./configure now finds
-    the release number by grepping pcre.h.
-
-26. Added the ability to run the tests under valgrind.
-
-
-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
----------------------
-
-1. Two instances of @WIN_PREFIX@ omitted from the Windows targets in the
-   Makefile.
-
-2. Some refactoring to improve the quality of the code:
-
-   (i)   The utf8_table... variables are now declared "const".
-
-   (ii)  The code for \cx, which used the "case flipping" table to upper case
-         lower case letters, now just substracts 32. This is ASCII-specific,
-         but the whole concept of \cx is ASCII-specific, so it seems
-         reasonable.
-
-   (iii) PCRE was using its character types table to recognize decimal and
-         hexadecimal digits in the pattern. This is silly, because it handles
-         only 0-9, a-f, and A-F, but the character types table is locale-
-         specific, which means strange things might happen. A private
-         table is now used for this - though it costs 256 bytes, a table is
-         much faster than multiple explicit tests. Of course, the standard
-         character types table is still used for matching digits in subject
-         strings against \d.
-
-   (iv)  Strictly, the identifier ESC_t is reserved by POSIX (all identifiers
-         ending in _t are). So I've renamed it as ESC_tee.
-
-3. The first argument for regexec() in the POSIX wrapper should have been
-   defined as "const".
-
-4. Changed pcretest to use malloc() for its buffers so that they can be
-   Electric Fenced for debugging.
-
-5. There were several places in the code where, in UTF-8 mode, PCRE would try
-   to read one or more bytes before the start of the subject string. Often this
-   had no effect on PCRE's behaviour, but in some circumstances it could
-   provoke a segmentation fault.
-
-6. A lookbehind at the start of a pattern in UTF-8 mode could also cause PCRE
-   to try to read one or more bytes before the start of the subject string.
-
-7. A lookbehind in a pattern matched in non-UTF-8 mode on a PCRE compiled with
-   UTF-8 support could misbehave in various ways if the subject string
-   contained bytes with the 0x80 bit set and the 0x40 bit unset in a lookbehind
-   area. (PCRE was not checking for the UTF-8 mode flag, and trying to move
-   back over UTF-8 characters.)
-
-
-Version 4.2 14-Apr-03
----------------------
-
-1. Typo "#if SUPPORT_UTF8" instead of "#ifdef SUPPORT_UTF8" fixed.
-
-2. Changes to the building process, supplied by Ronald Landheer-Cieslak
-     [ON_WINDOWS]: new variable, "#" on non-Windows platforms
-     [NOT_ON_WINDOWS]: new variable, "#" on Windows platforms
-     [WIN_PREFIX]: new variable, "cyg" for Cygwin
-     * Makefile.in: use autoconf substitution for OBJEXT, EXEEXT, BUILD_OBJEXT
-       and BUILD_EXEEXT
-     Note: automatic setting of the BUILD variables is not yet working
-     set CPPFLAGS and BUILD_CPPFLAGS (but don't use yet) - should be used at
-       compile-time but not at link-time
-     [LINK]: use for linking executables only
-     make different versions for Windows and non-Windows
-     [LINKLIB]: new variable, copy of UNIX-style LINK, used for linking
-       libraries
-     [LINK_FOR_BUILD]: new variable
-     [OBJEXT]: use throughout
-     [EXEEXT]: use throughout
-     <winshared>: new target
-     <wininstall>: new target
-     <dftables.o>: use native compiler
-     <dftables>: use native linker
-     <install>: handle Windows platform correctly
-     <clean>: ditto
-     <check>: ditto
-     copy DLL to top builddir before testing
-
-   As part of these changes, -no-undefined was removed again. This was reported
-   to give trouble on HP-UX 11.0, so getting rid of it seems like a good idea
-   in any case.
-
-3. Some tidies to get rid of compiler warnings:
-
-   . In the match_data structure, match_limit was an unsigned long int, whereas
-     match_call_count was an int. I've made them both unsigned long ints.
-
-   . In pcretest the fact that a const uschar * doesn't automatically cast to
-     a void * provoked a warning.
-
-   . Turning on some more compiler warnings threw up some "shadow" variables
-     and a few more missing casts.
-
-4. If PCRE was complied with UTF-8 support, but called without the PCRE_UTF8
-   option, a class that contained a single character with a value between 128
-   and 255 (e.g. /[\xFF]/) caused PCRE to crash.
-
-5. If PCRE was compiled with UTF-8 support, but called without the PCRE_UTF8
-   option, a class that contained several characters, but with at least one
-   whose value was between 128 and 255 caused PCRE to crash.
-
-
-Version 4.1 12-Mar-03
----------------------
-
-1. Compiling with gcc -pedantic found a couple of places where casts were
-needed, and a string in dftables.c that was longer than standard compilers are
-required to support.
-
-2. Compiling with Sun's compiler found a few more places where the code could
-be tidied up in order to avoid warnings.
-
-3. The variables for cross-compiling were called HOST_CC and HOST_CFLAGS; the
-first of these names is deprecated in the latest Autoconf in favour of the name
-CC_FOR_BUILD, because "host" is typically used to mean the system on which the
-compiled code will be run. I can't find a reference for HOST_CFLAGS, but by
-analogy I have changed it to CFLAGS_FOR_BUILD.
-
-4. Added -no-undefined to the linking command in the Makefile, because this is
-apparently helpful for Windows. To make it work, also added "-L. -lpcre" to the
-linking step for the pcreposix library.
-
-5. PCRE was failing to diagnose the case of two named groups with the same
-name.
-
-6. A problem with one of PCRE's optimizations was discovered. PCRE remembers a
-literal character that is needed in the subject for a match, and scans along to
-ensure that it is present before embarking on the full matching process. This
-saves time in cases of nested unlimited repeats that are never going to match.
-Problem: the scan can take a lot of time if the subject is very long (e.g.
-megabytes), thus penalizing straightforward matches. It is now done only if the
-amount of subject to be scanned is less than 1000 bytes.
-
-7. A lesser problem with the same optimization is that it was recording the
-first character of an anchored pattern as "needed", thus provoking a search
-right along the subject, even when the first match of the pattern was going to
-fail. The "needed" character is now not set for anchored patterns, unless it
-follows something in the pattern that is of non-fixed length. Thus, it still
-fulfils its original purpose of finding quick non-matches in cases of nested
-unlimited repeats, but isn't used for simple anchored patterns such as /^abc/.
-
-
-Version 4.0 17-Feb-03
----------------------
-
-1. If a comment in an extended regex that started immediately after a meta-item
-extended to the end of string, PCRE compiled incorrect data. This could lead to
-all kinds of weird effects. Example: /#/ was bad; /()#/ was bad; /a#/ was not.
-
-2. Moved to autoconf 2.53 and libtool 1.4.2.
-
-3. Perl 5.8 no longer needs "use utf8" for doing UTF-8 things. Consequently,
-the special perltest8 script is no longer needed - all the tests can be run
-from a single perltest script.
-
-4. From 5.004, Perl has not included the VT character (0x0b) in the set defined
-by \s. It has now been removed in PCRE. This means it isn't recognized as
-whitespace in /x regexes too, which is the same as Perl. Note that the POSIX
-class [:space:] *does* include VT, thereby creating a mess.
-
-5. Added the class [:blank:] (a GNU extension from Perl 5.8) to match only
-space and tab.
-
-6. Perl 5.005 was a long time ago. It's time to amalgamate the tests that use
-its new features into the main test script, reducing the number of scripts.
-
-7. Perl 5.8 has changed the meaning of patterns like /a(?i)b/. Earlier versions
-were backward compatible, and made the (?i) apply to the whole pattern, as if
-/i were given. Now it behaves more logically, and applies the option setting
-only to what follows. PCRE has been changed to follow suit. However, if it
-finds options settings right at the start of the pattern, it extracts them into
-the global options, as before. Thus, they show up in the info data.
-
-8. Added support for the \Q...\E escape sequence. Characters in between are
-treated as literals. This is slightly different from Perl in that $ and @ are
-also handled as literals inside the quotes. In Perl, they will cause variable
-interpolation. Note the following examples:
-
-    Pattern            PCRE matches      Perl matches
-
-    \Qabc$xyz\E        abc$xyz           abc followed by the contents of $xyz
-    \Qabc\$xyz\E       abc\$xyz          abc\$xyz
-    \Qabc\E\$\Qxyz\E   abc$xyz           abc$xyz
-
-For compatibility with Perl, \Q...\E sequences are recognized inside character
-classes as well as outside them.
-
-9. Re-organized 3 code statements in pcretest to avoid "overflow in
-floating-point constant arithmetic" warnings from a Microsoft compiler. Added a
-(size_t) cast to one statement in pcretest and one in pcreposix to avoid
-signed/unsigned warnings.
-
-10. SunOS4 doesn't have strtoul(). This was used only for unpicking the -o
-option for pcretest, so I've replaced it by a simple function that does just
-that job.
-
-11. pcregrep was ending with code 0 instead of 2 for the commands "pcregrep" or
-"pcregrep -".
-
-12. Added "possessive quantifiers" ?+, *+, ++, and {,}+ which come from Sun's
-Java package. This provides some syntactic sugar for simple cases of what my
-documentation calls "once-only subpatterns". A pattern such as x*+ is the same
-as (?>x*). In other words, if what is inside (?>...) is just a single repeated
-item, you can use this simplified notation. Note that only makes sense with
-greedy quantifiers. Consequently, the use of the possessive quantifier forces
-greediness, whatever the setting of the PCRE_UNGREEDY option.
-
-13. A change of greediness default within a pattern was not taking effect at
-the current level for patterns like /(b+(?U)a+)/. It did apply to parenthesized
-subpatterns that followed. Patterns like /b+(?U)a+/ worked because the option
-was abstracted outside.
-
-14. PCRE now supports the \G assertion. It is true when the current matching
-position is at the start point of the match. This differs from \A when the
-starting offset is non-zero. Used with the /g option of pcretest (or similar
-code), it works in the same way as it does for Perl's /g option. If all
-alternatives of a regex begin with \G, the expression is anchored to the start
-match position, and the "anchored" flag is set in the compiled expression.
-
-15. Some bugs concerning the handling of certain option changes within patterns
-have been fixed. These applied to options other than (?ims). For example,
-"a(?x: b c )d" did not match "XabcdY" but did match "Xa b c dY". It should have
-been the other way round. Some of this was related to change 7 above.
-
-16. PCRE now gives errors for /[.x.]/ and /[=x=]/ as unsupported POSIX
-features, as Perl does. Previously, PCRE gave the warnings only for /[[.x.]]/
-and /[[=x=]]/. PCRE now also gives an error for /[:name:]/ because it supports
-POSIX classes only within a class (e.g. /[[:alpha:]]/).
-
-17. Added support for Perl's \C escape. This matches one byte, even in UTF8
-mode. Unlike ".", it always matches newline, whatever the setting of
-PCRE_DOTALL. However, PCRE does not permit \C to appear in lookbehind
-assertions. Perl allows it, but it doesn't (in general) work because it can't
-calculate the length of the lookbehind. At least, that's the case for Perl
-5.8.0 - I've been told they are going to document that it doesn't work in
-future.
-
-18. Added an error diagnosis for escapes that PCRE does not support: these are
-\L, \l, \N, \P, \p, \U, \u, and \X.
-
-19. Although correctly diagnosing a missing ']' in a character class, PCRE was
-reading past the end of the pattern in cases such as /[abcd/.
-
-20. PCRE was getting more memory than necessary for patterns with classes that
-contained both POSIX named classes and other characters, e.g. /[[:space:]abc/.
-
-21. Added some code, conditional on #ifdef VPCOMPAT, to make life easier for
-compiling PCRE for use with Virtual Pascal.
-
-22. Small fix to the Makefile to make it work properly if the build is done
-outside the source tree.
-
-23. Added a new extension: a condition to go with recursion. If a conditional
-subpattern starts with (?(R) the "true" branch is used if recursion has
-happened, whereas the "false" branch is used only at the top level.
-
-24. When there was a very long string of literal characters (over 255 bytes
-without UTF support, over 250 bytes with UTF support), the computation of how
-much memory was required could be incorrect, leading to segfaults or other
-strange effects.
-
-25. PCRE was incorrectly assuming anchoring (either to start of subject or to
-start of line for a non-DOTALL pattern) when a pattern started with (.*) and
-there was a subsequent back reference to those brackets. This meant that, for
-example, /(.*)\d+\1/ failed to match "abc123bc". Unfortunately, it isn't
-possible to check for precisely this case. All we can do is abandon the
-optimization if .* occurs inside capturing brackets when there are any back
-references whatsoever. (See below for a better fix that came later.)
-
-26. The handling of the optimization for finding the first character of a
-non-anchored pattern, and for finding a character that is required later in the
-match were failing in some cases. This didn't break the matching; it just
-failed to optimize when it could. The way this is done has been re-implemented.
-
-27. Fixed typo in error message for invalid (?R item (it said "(?p").
-
-28. Added a new feature that provides some of the functionality that Perl
-provides with (?{...}). The facility is termed a "callout". The way it is done
-in PCRE is for the caller to provide an optional function, by setting
-pcre_callout to its entry point. Like pcre_malloc and pcre_free, this is a
-global variable. By default it is unset, which disables all calling out. To get
-the function called, the regex must include (?C) at appropriate points. This
-is, in fact, equivalent to (?C0), and any number <= 255 may be given with (?C).
-This provides a means of identifying different callout points. When PCRE
-reaches such a point in the regex, if pcre_callout has been set, the external
-function is called. It is provided with data in a structure called
-pcre_callout_block, which is defined in pcre.h. If the function returns 0,
-matching continues; if it returns a non-zero value, the match at the current
-point fails. However, backtracking will occur if possible. [This was changed
-later and other features added - see item 49 below.]
-
-29. pcretest is upgraded to test the callout functionality. It provides a
-callout function that displays information. By default, it shows the start of
-the match and the current position in the text. There are some new data escapes
-to vary what happens:
-
-    \C+         in addition, show current contents of captured substrings
-    \C-         do not supply a callout function
-    \C!n        return 1 when callout number n is reached
-    \C!n!m      return 1 when callout number n is reached for the mth time
-
-30. If pcregrep was called with the -l option and just a single file name, it
-output "<stdin>" if a match was found, instead of the file name.
-
-31. Improve the efficiency of the POSIX API to PCRE. If the number of capturing
-slots is less than POSIX_MALLOC_THRESHOLD, use a block on the stack to pass to
-pcre_exec(). This saves a malloc/free per call. The default value of
-POSIX_MALLOC_THRESHOLD is 10; it can be changed by --with-posix-malloc-threshold
-when configuring.
-
-32. The default maximum size of a compiled pattern is 64K. There have been a
-few cases of people hitting this limit. The code now uses macros to handle the
-storing of links as offsets within the compiled pattern. It defaults to 2-byte
-links, but this can be changed to 3 or 4 bytes by --with-link-size when
-configuring. Tests 2 and 5 work only with 2-byte links because they output
-debugging information about compiled patterns.
-
-33. Internal code re-arrangements:
-
-(a) Moved the debugging function for printing out a compiled regex into
-    its own source file (printint.c) and used #include to pull it into
-    pcretest.c and, when DEBUG is defined, into pcre.c, instead of having two
-    separate copies.
-
-(b) Defined the list of op-code names for debugging as a macro in
-    internal.h so that it is next to the definition of the opcodes.
-
-(c) Defined a table of op-code lengths for simpler skipping along compiled
-    code. This is again a macro in internal.h so that it is next to the
-    definition of the opcodes.
-
-34. Added support for recursive calls to individual subpatterns, along the
-lines of Robin Houston's patch (but implemented somewhat differently).
-
-35. Further mods to the Makefile to help Win32. Also, added code to pcregrep to
-allow it to read and process whole directories in Win32. This code was
-contributed by Lionel Fourquaux; it has not been tested by me.
-
-36. Added support for named subpatterns. The Python syntax (?P<name>...) is
-used to name a group. Names consist of alphanumerics and underscores, and must
-be unique. Back references use the syntax (?P=name) and recursive calls use
-(?P>name) which is a PCRE extension to the Python extension. Groups still have
-numbers. The function pcre_fullinfo() can be used after compilation to extract
-a name/number map. There are three relevant calls:
-
-  PCRE_INFO_NAMEENTRYSIZE        yields the size of each entry in the map
-  PCRE_INFO_NAMECOUNT            yields the number of entries
-  PCRE_INFO_NAMETABLE            yields a pointer to the map.
-
-The map is a vector of fixed-size entries. The size of each entry depends on
-the length of the longest name used. The first two bytes of each entry are the
-group number, most significant byte first. There follows the corresponding
-name, zero terminated. The names are in alphabetical order.
-
-37. Make the maximum literal string in the compiled code 250 for the non-UTF-8
-case instead of 255. Making it the same both with and without UTF-8 support
-means that the same test output works with both.
-
-38. There was a case of malloc(0) in the POSIX testing code in pcretest. Avoid
-calling malloc() with a zero argument.
-
-39. Change 25 above had to resort to a heavy-handed test for the .* anchoring
-optimization. I've improved things by keeping a bitmap of backreferences with
-numbers 1-31 so that if .* occurs inside capturing brackets that are not in
-fact referenced, the optimization can be applied. It is unlikely that a
-relevant occurrence of .* (i.e. one which might indicate anchoring or forcing
-the match to follow \n) will appear inside brackets with a number greater than
-31, but if it does, any back reference > 31 suppresses the optimization.
-
-40. Added a new compile-time option PCRE_NO_AUTO_CAPTURE. This has the effect
-of disabling numbered capturing parentheses. Any opening parenthesis that is
-not followed by ? behaves as if it were followed by ?: but named parentheses
-can still be used for capturing (and they will acquire numbers in the usual
-way).
-
-41. Redesigned the return codes from the match() function into yes/no/error so
-that errors can be passed back from deep inside the nested calls. A malloc
-failure while inside a recursive subpattern call now causes the
-PCRE_ERROR_NOMEMORY return instead of quietly going wrong.
-
-42. It is now possible to set a limit on the number of times the match()
-function is called in a call to pcre_exec(). This facility makes it possible to
-limit the amount of recursion and backtracking, though not in a directly
-obvious way, because the match() function is used in a number of different
-circumstances. The count starts from zero for each position in the subject
-string (for non-anchored patterns). The default limit is, for compatibility, a
-large number, namely 10 000 000. You can change this in two ways:
-
-(a) When configuring PCRE before making, you can use --with-match-limit=n
-    to set a default value for the compiled library.
-
-(b) For each call to pcre_exec(), you can pass a pcre_extra block in which
-    a different value is set. See 45 below.
-
-If the limit is exceeded, pcre_exec() returns PCRE_ERROR_MATCHLIMIT.
-
-43. Added a new function pcre_config(int, void *) to enable run-time extraction
-of things that can be changed at compile time. The first argument specifies
-what is wanted and the second points to where the information is to be placed.
-The current list of available information is:
-
-  PCRE_CONFIG_UTF8
-
-The output is an integer that is set to one if UTF-8 support is available;
-otherwise it is set to zero.
-
-  PCRE_CONFIG_NEWLINE
-
-The output is an integer that it set to the value of the code that is used for
-newline. It is either LF (10) or CR (13).
-
-  PCRE_CONFIG_LINK_SIZE
-
-The output is an integer that contains the number of bytes used for internal
-linkage in compiled expressions. The value is 2, 3, or 4. See item 32 above.
-
-  PCRE_CONFIG_POSIX_MALLOC_THRESHOLD
-
-The output is an integer that contains the threshold above which the POSIX
-interface uses malloc() for output vectors. See item 31 above.
-
-  PCRE_CONFIG_MATCH_LIMIT
-
-The output is an unsigned integer that contains the default limit of the number
-of match() calls in a pcre_exec() execution. See 42 above.
-
-44. pcretest has been upgraded by the addition of the -C option. This causes it
-to extract all the available output from the new pcre_config() function, and to
-output it. The program then exits immediately.
-
-45. A need has arisen to pass over additional data with calls to pcre_exec() in
-order to support additional features. One way would have been to define
-pcre_exec2() (for example) with extra arguments, but this would not have been
-extensible, and would also have required all calls to the original function to
-be mapped to the new one. Instead, I have chosen to extend the mechanism that
-is used for passing in "extra" data from pcre_study().
-
-The pcre_extra structure is now exposed and defined in pcre.h. It currently
-contains the following fields:
-
-  flags         a bitmap indicating which of the following fields are set
-  study_data    opaque data from pcre_study()
-  match_limit   a way of specifying a limit on match() calls for a specific
-                  call to pcre_exec()
-  callout_data  data for callouts (see 49 below)
-
-The flag bits are also defined in pcre.h, and are
-
-  PCRE_EXTRA_STUDY_DATA
-  PCRE_EXTRA_MATCH_LIMIT
-  PCRE_EXTRA_CALLOUT_DATA
-
-The pcre_study() function now returns one of these new pcre_extra blocks, with
-the actual study data pointed to by the study_data field, and the
-PCRE_EXTRA_STUDY_DATA flag set. This can be passed directly to pcre_exec() as
-before. That is, this change is entirely upwards-compatible and requires no
-change to existing code.
-
-If you want to pass in additional data to pcre_exec(), you can either place it
-in a pcre_extra block provided by pcre_study(), or create your own pcre_extra
-block.
-
-46. pcretest has been extended to test the PCRE_EXTRA_MATCH_LIMIT feature. If a
-data string contains the escape sequence \M, pcretest calls pcre_exec() several
-times with different match limits, until it finds the minimum value needed for
-pcre_exec() to complete. The value is then output. This can be instructive; for
-most simple matches the number is quite small, but for pathological cases it
-gets very large very quickly.
-
-47. There's a new option for pcre_fullinfo() called PCRE_INFO_STUDYSIZE. It
-returns the size of the data block pointed to by the study_data field in a
-pcre_extra block, that is, the value that was passed as the argument to
-pcre_malloc() when PCRE was getting memory in which to place the information
-created by pcre_study(). The fourth argument should point to a size_t variable.
-pcretest has been extended so that this information is shown after a successful
-pcre_study() call when information about the compiled regex is being displayed.
-
-48. Cosmetic change to Makefile: there's no need to have / after $(DESTDIR)
-because what follows is always an absolute path. (Later: it turns out that this
-is more than cosmetic for MinGW, because it doesn't like empty path
-components.)
-
-49. Some changes have been made to the callout feature (see 28 above):
-
-(i)  A callout function now has three choices for what it returns:
-
-       0  =>  success, carry on matching
-     > 0  =>  failure at this point, but backtrack if possible
-     < 0  =>  serious error, return this value from pcre_exec()
-
-     Negative values should normally be chosen from the set of PCRE_ERROR_xxx
-     values. In particular, returning PCRE_ERROR_NOMATCH forces a standard
-     "match failed" error. The error number PCRE_ERROR_CALLOUT is reserved for
-     use by callout functions. It will never be used by PCRE itself.
-
-(ii) The pcre_extra structure (see 45 above) has a void * field called
-     callout_data, with corresponding flag bit PCRE_EXTRA_CALLOUT_DATA. The
-     pcre_callout_block structure has a field of the same name. The contents of
-     the field passed in the pcre_extra structure are passed to the callout
-     function in the corresponding field in the callout block. This makes it
-     easier to use the same callout-containing regex from multiple threads. For
-     testing, the pcretest program has a new data escape
-
-       \C*n        pass the number n (may be negative) as callout_data
-
-     If the callout function in pcretest receives a non-zero value as
-     callout_data, it returns that value.
-
-50. Makefile wasn't handling CFLAGS properly when compiling dftables. Also,
-there were some redundant $(CFLAGS) in commands that are now specified as
-$(LINK), which already includes $(CFLAGS).
-
-51. Extensions to UTF-8 support are listed below. These all apply when (a) PCRE
-has been compiled with UTF-8 support *and* pcre_compile() has been compiled
-with the PCRE_UTF8 flag. Patterns that are compiled without that flag assume
-one-byte characters throughout. Note that case-insensitive matching applies
-only to characters whose values are less than 256. PCRE doesn't support the
-notion of cases for higher-valued characters.
-
-(i)   A character class whose characters are all within 0-255 is handled as
-      a bit map, and the map is inverted for negative classes. Previously, a
-      character > 255 always failed to match such a class; however it should
-      match if the class was a negative one (e.g. [^ab]). This has been fixed.
-
-(ii)  A negated character class with a single character < 255 is coded as
-      "not this character" (OP_NOT). This wasn't working properly when the test
-      character was multibyte, either singly or repeated.
-
-(iii) Repeats of multibyte characters are now handled correctly in UTF-8
-      mode, for example: \x{100}{2,3}.
-
-(iv)  The character escapes \b, \B, \d, \D, \s, \S, \w, and \W (either
-      singly or repeated) now correctly test multibyte characters. However,
-      PCRE doesn't recognize any characters with values greater than 255 as
-      digits, spaces, or word characters. Such characters always match \D, \S,
-      and \W, and never match \d, \s, or \w.
-
-(v)   Classes may now contain characters and character ranges with values
-      greater than 255. For example: [ab\x{100}-\x{400}].
-
-(vi)  pcregrep now has a --utf-8 option (synonym -u) which makes it call
-      PCRE in UTF-8 mode.
-
-52. The info request value PCRE_INFO_FIRSTCHAR has been renamed
-PCRE_INFO_FIRSTBYTE because it is a byte value. However, the old name is
-retained for backwards compatibility. (Note that LASTLITERAL is also a byte
-value.)
-
-53. The single man page has become too large. I have therefore split it up into
-a number of separate man pages. These also give rise to individual HTML pages;
-these are now put in a separate directory, and there is an index.html page that
-lists them all. Some hyperlinking between the pages has been installed.
-
-54. Added convenience functions for handling named capturing parentheses.
-
-55. Unknown escapes inside character classes (e.g. [\M]) and escapes that
-aren't interpreted therein (e.g. [\C]) are literals in Perl. This is now also
-true in PCRE, except when the PCRE_EXTENDED option is set, in which case they
-are faulted.
-
-56. Introduced HOST_CC and HOST_CFLAGS which can be set in the environment when
-calling configure. These values are used when compiling the dftables.c program
-which is run to generate the source of the default character tables. They
-default to the values of CC and CFLAGS. If you are cross-compiling PCRE,
-you will need to set these values.
-
-57. Updated the building process for Windows DLL, as provided by Fred Cox.
-
-
-Version 3.9 02-Jan-02
----------------------
-
-1. A bit of extraneous text had somehow crept into the pcregrep documentation.
-
-2. If --disable-static was given, the building process failed when trying to
-build pcretest and pcregrep. (For some reason it was using libtool to compile
-them, which is not right, as they aren't part of the library.)
-
-
-Version 3.8 18-Dec-01
----------------------
-
-1. The experimental UTF-8 code was completely screwed up. It was packing the
-bytes in the wrong order. How dumb can you get?
-
-
-Version 3.7 29-Oct-01
----------------------
-
-1. In updating pcretest to check change 1 of version 3.6, I screwed up.
-This caused pcretest, when used on the test data, to segfault. Unfortunately,
-this didn't happen under Solaris 8, where I normally test things.
-
-2. The Makefile had to be changed to make it work on BSD systems, where 'make'
-doesn't seem to recognize that ./xxx and xxx are the same file. (This entry
-isn't in ChangeLog distributed with 3.7 because I forgot when I hastily made
-this fix an hour or so after the initial 3.7 release.)
-
-
-Version 3.6 23-Oct-01
----------------------
-
-1. Crashed with /(sens|respons)e and \1ibility/ and "sense and sensibility" if
-offsets passed as NULL with zero offset count.
-
-2. The config.guess and config.sub files had not been updated when I moved to
-the latest autoconf.
-
-
-Version 3.5 15-Aug-01
----------------------
-
-1. Added some missing #if !defined NOPOSIX conditionals in pcretest.c that
-had been forgotten.
-
-2. By using declared but undefined structures, we can avoid using "void"
-definitions in pcre.h while keeping the internal definitions of the structures
-private.
-
-3. The distribution is now built using autoconf 2.50 and libtool 1.4. From a
-user point of view, this means that both static and shared libraries are built
-by default, but this can be individually controlled. More of the work of
-handling this static/shared cases is now inside libtool instead of PCRE's make
-file.
-
-4. The pcretest utility is now installed along with pcregrep because it is
-useful for users (to test regexs) and by doing this, it automatically gets
-relinked by libtool. The documentation has been turned into a man page, so
-there are now .1, .txt, and .html versions in /doc.
-
-5. Upgrades to pcregrep:
-   (i)   Added long-form option names like gnu grep.
-   (ii)  Added --help to list all options with an explanatory phrase.
-   (iii) Added -r, --recursive to recurse into sub-directories.
-   (iv)  Added -f, --file to read patterns from a file.
-
-6. pcre_exec() was referring to its "code" argument before testing that
-argument for NULL (and giving an error if it was NULL).
-
-7. Upgraded Makefile.in to allow for compiling in a different directory from
-the source directory.
-
-8. Tiny buglet in pcretest: when pcre_fullinfo() was called to retrieve the
-options bits, the pointer it was passed was to an int instead of to an unsigned
-long int. This mattered only on 64-bit systems.
-
-9. Fixed typo (3.4/1) in pcre.h again. Sigh. I had changed pcre.h (which is
-generated) instead of pcre.in, which it its source. Also made the same change
-in several of the .c files.
-
-10. A new release of gcc defines printf() as a macro, which broke pcretest
-because it had an ifdef in the middle of a string argument for printf(). Fixed
-by using separate calls to printf().
-
-11. Added --enable-newline-is-cr and --enable-newline-is-lf to the configure
-script, to force use of CR or LF instead of \n in the source. On non-Unix
-systems, the value can be set in config.h.
-
-12. The limit of 200 on non-capturing parentheses is a _nesting_ limit, not an
-absolute limit. Changed the text of the error message to make this clear, and
-likewise updated the man page.
-
-13. The limit of 99 on the number of capturing subpatterns has been removed.
-The new limit is 65535, which I hope will not be a "real" limit.
-
-
-Version 3.4 22-Aug-00
----------------------
-
-1. Fixed typo in pcre.h: unsigned const char * changed to const unsigned char *.
-
-2. Diagnose condition (?(0) as an error instead of crashing on matching.
-
-
-Version 3.3 01-Aug-00
----------------------
-
-1. If an octal character was given, but the value was greater than \377, it
-was not getting masked to the least significant bits, as documented. This could
-lead to crashes in some systems.
-
-2. Perl 5.6 (if not earlier versions) accepts classes like [a-\d] and treats
-the hyphen as a literal. PCRE used to give an error; it now behaves like Perl.
-
-3. Added the functions pcre_free_substring() and pcre_free_substring_list().
-These just pass their arguments on to (pcre_free)(), but they are provided
-because some uses of PCRE bind it to non-C systems that can call its functions,
-but cannot call free() or pcre_free() directly.
-
-4. Add "make test" as a synonym for "make check". Corrected some comments in
-the Makefile.
-
-5. Add $(DESTDIR)/ in front of all the paths in the "install" target in the
-Makefile.
-
-6. Changed the name of pgrep to pcregrep, because Solaris has introduced a
-command called pgrep for grepping around the active processes.
-
-7. Added the beginnings of support for UTF-8 character strings.
-
-8. Arranged for the Makefile to pass over the settings of CC, CFLAGS, and
-RANLIB to ./ltconfig so that they are used by libtool. I think these are all
-the relevant ones. (AR is not passed because ./ltconfig does its own figuring
-out for the ar command.)
-
-
-Version 3.2 12-May-00
----------------------
-
-This is purely a bug fixing release.
-
-1. If the pattern /((Z)+|A)*/ was matched agained ZABCDEFG it matched Z instead
-of ZA. This was just one example of several cases that could provoke this bug,
-which was introduced by change 9 of version 2.00. The code for breaking
-infinite loops after an iteration that matches an empty string was't working
-correctly.
-
-2. The pcretest program was not imitating Perl correctly for the pattern /a*/g
-when matched against abbab (for example). After matching an empty string, it
-wasn't forcing anchoring when setting PCRE_NOTEMPTY for the next attempt; this
-caused it to match further down the string than it should.
-
-3. The code contained an inclusion of sys/types.h. It isn't clear why this
-was there because it doesn't seem to be needed, and it causes trouble on some
-systems, as it is not a Standard C header. It has been removed.
-
-4. Made 4 silly changes to the source to avoid stupid compiler warnings that
-were reported on the Macintosh. The changes were from
-
-  while ((c = *(++ptr)) != 0 && c != '\n');
-to
-  while ((c = *(++ptr)) != 0 && c != '\n') ;
-
-Totally extraordinary, but if that's what it takes...
-
-5. PCRE is being used in one environment where neither memmove() nor bcopy() is
-available. Added HAVE_BCOPY and an autoconf test for it; if neither
-HAVE_MEMMOVE nor HAVE_BCOPY is set, use a built-in emulation function which
-assumes the way PCRE uses memmove() (always moving upwards).
-
-6. PCRE is being used in one environment where strchr() is not available. There
-was only one use in pcre.c, and writing it out to avoid strchr() probably gives
-faster code anyway.
-
-
-Version 3.1 09-Feb-00
----------------------
-
-The only change in this release is the fixing of some bugs in Makefile.in for
-the "install" target:
-
-(1) It was failing to install pcreposix.h.
-
-(2) It was overwriting the pcre.3 man page with the pcreposix.3 man page.
-
-
-Version 3.0 01-Feb-00
----------------------
-
-1. Add support for the /+ modifier to perltest (to output $` like it does in
-pcretest).
-
-2. Add support for the /g modifier to perltest.
-
-3. Fix pcretest so that it behaves even more like Perl for /g when the pattern
-matches null strings.
-
-4. Fix perltest so that it doesn't do unwanted things when fed an empty
-pattern. Perl treats empty patterns specially - it reuses the most recent
-pattern, which is not what we want. Replace // by /(?#)/ in order to avoid this
-effect.
-
-5. The POSIX interface was broken in that it was just handing over the POSIX
-captured string vector to pcre_exec(), but (since release 2.00) PCRE has
-required a bigger vector, with some working space on the end. This means that
-the POSIX wrapper now has to get and free some memory, and copy the results.
-
-6. Added some simple autoconf support, placing the test data and the
-documentation in separate directories, re-organizing some of the
-information files, and making it build pcre-config (a GNU standard). Also added
-libtool support for building PCRE as a shared library, which is now the
-default.
-
-7. Got rid of the leading zero in the definition of PCRE_MINOR because 08 and
-09 are not valid octal constants. Single digits will be used for minor values
-less than 10.
-
-8. Defined REG_EXTENDED and REG_NOSUB as zero in the POSIX header, so that
-existing programs that set these in the POSIX interface can use PCRE without
-modification.
-
-9. Added a new function, pcre_fullinfo() with an extensible interface. It can
-return all that pcre_info() returns, plus additional data. The pcre_info()
-function is retained for compatibility, but is considered to be obsolete.
-
-10. Added experimental recursion feature (?R) to handle one common case that
-Perl 5.6 will be able to do with (?p{...}).
-
-11. Added support for POSIX character classes like [:alpha:], which Perl is
-adopting.
-
-
-Version 2.08 31-Aug-99
-----------------------
-
-1. When startoffset was not zero and the pattern began with ".*", PCRE was not
-trying to match at the startoffset position, but instead was moving forward to
-the next newline as if a previous match had failed.
-
-2. pcretest was not making use of PCRE_NOTEMPTY when repeating for /g and /G,
-and could get into a loop if a null string was matched other than at the start
-of the subject.
-
-3. Added definitions of PCRE_MAJOR and PCRE_MINOR to pcre.h so the version can
-be distinguished at compile time, and for completeness also added PCRE_DATE.
-
-5. Added Paul Sokolovsky's minor changes to make it easy to compile a Win32 DLL
-in GnuWin32 environments.
-
-
-Version 2.07 29-Jul-99
-----------------------
-
-1. The documentation is now supplied in plain text form and HTML as well as in
-the form of man page sources.
-
-2. C++ compilers don't like assigning (void *) values to other pointer types.
-In particular this affects malloc(). Although there is no problem in Standard
-C, I've put in casts to keep C++ compilers happy.
-
-3. Typo on pcretest.c; a cast of (unsigned char *) in the POSIX regexec() call
-should be (const char *).
-
-4. If NOPOSIX is defined, pcretest.c compiles without POSIX support. This may
-be useful for non-Unix systems who don't want to bother with the POSIX stuff.
-However, I haven't made this a standard facility. The documentation doesn't
-mention it, and the Makefile doesn't support it.
-
-5. The Makefile now contains an "install" target, with editable destinations at
-the top of the file. The pcretest program is not installed.
-
-6. pgrep -V now gives the PCRE version number and date.
-
-7. Fixed bug: a zero repetition after a literal string (e.g. /abcde{0}/) was
-causing the entire string to be ignored, instead of just the last character.
-
-8. If a pattern like /"([^\\"]+|\\.)*"/ is applied in the normal way to a
-non-matching string, it can take a very, very long time, even for strings of
-quite modest length, because of the nested recursion. PCRE now does better in
-some of these cases. It does this by remembering the last required literal
-character in the pattern, and pre-searching the subject to ensure it is present
-before running the real match. In other words, it applies a heuristic to detect
-some types of certain failure quickly, and in the above example, if presented
-with a string that has no trailing " it gives "no match" very quickly.
-
-9. A new runtime option PCRE_NOTEMPTY causes null string matches to be ignored;
-other alternatives are tried instead.
-
-
-Version 2.06 09-Jun-99
-----------------------
-
-1. Change pcretest's output for amount of store used to show just the code
-space, because the remainder (the data block) varies in size between 32-bit and
-64-bit systems.
-
-2. Added an extra argument to pcre_exec() to supply an offset in the subject to
-start matching at. This allows lookbehinds to work when searching for multiple
-occurrences in a string.
-
-3. Added additional options to pcretest for testing multiple occurrences:
-
-   /+   outputs the rest of the string that follows a match
-   /g   loops for multiple occurrences, using the new startoffset argument
-   /G   loops for multiple occurrences by passing an incremented pointer
-
-4. PCRE wasn't doing the "first character" optimization for patterns starting
-with \b or \B, though it was doing it for other lookbehind assertions. That is,
-it wasn't noticing that a match for a pattern such as /\bxyz/ has to start with
-the letter 'x'. On long subject strings, this gives a significant speed-up.
-
-
-Version 2.05 21-Apr-99
-----------------------
-
-1. Changed the type of magic_number from int to long int so that it works
-properly on 16-bit systems.
-
-2. Fixed a bug which caused patterns starting with .* not to work correctly
-when the subject string contained newline characters. PCRE was assuming
-anchoring for such patterns in all cases, which is not correct because .* will
-not pass a newline unless PCRE_DOTALL is set. It now assumes anchoring only if
-DOTALL is set at top level; otherwise it knows that patterns starting with .*
-must be retried after every newline in the subject.
-
-
-Version 2.04 18-Feb-99
-----------------------
-
-1. For parenthesized subpatterns with repeats whose minimum was zero, the
-computation of the store needed to hold the pattern was incorrect (too large).
-If such patterns were nested a few deep, this could multiply and become a real
-problem.
-
-2. Added /M option to pcretest to show the memory requirement of a specific
-pattern. Made -m a synonym of -s (which does this globally) for compatibility.
-
-3. Subpatterns of the form (regex){n,m} (i.e. limited maximum) were being
-compiled in such a way that the backtracking after subsequent failure was
-pessimal. Something like (a){0,3} was compiled as (a)?(a)?(a)? instead of
-((a)((a)(a)?)?)? with disastrous performance if the maximum was of any size.
-
-
-Version 2.03 02-Feb-99
-----------------------
-
-1. Fixed typo and small mistake in man page.
-
-2. Added 4th condition (GPL supersedes if conflict) and created separate
-LICENCE file containing the conditions.
-
-3. Updated pcretest so that patterns such as /abc\/def/ work like they do in
-Perl, that is the internal \ allows the delimiter to be included in the
-pattern. Locked out the use of \ as a delimiter. If \ immediately follows
-the final delimiter, add \ to the end of the pattern (to test the error).
-
-4. Added the convenience functions for extracting substrings after a successful
-match. Updated pcretest to make it able to test these functions.
-
-
-Version 2.02 14-Jan-99
-----------------------
-
-1. Initialized the working variables associated with each extraction so that
-their saving and restoring doesn't refer to uninitialized store.
-
-2. Put dummy code into study.c 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.
-
-3. Pcretest: the timing code wasn't using LOOPREPEAT for timing execution
-calls, and wasn't printing the correct value for compiling calls. Increased the
-default value of LOOPREPEAT, and the number of significant figures in the
-times.
-
-4. Changed "/bin/rm" in the Makefile to "-rm" so it works on Windows NT.
-
-5. Renamed "deftables" as "dftables" to get it down to 8 characters, to avoid
-a building problem on Windows NT with a FAT file system.
-
-
-Version 2.01 21-Oct-98
-----------------------
-
-1. Changed the API for pcre_compile() to allow for the provision of a pointer
-to character tables built by pcre_maketables() in the current locale. If NULL
-is passed, the default tables are used.
-
-
-Version 2.00 24-Sep-98
-----------------------
-
-1. Since the (>?) facility is in Perl 5.005, don't require PCRE_EXTRA to enable
-it any more.
-
-2. Allow quantification of (?>) groups, and make it work correctly.
-
-3. The first character computation wasn't working for (?>) groups.
-
-4. Correct the implementation of \Z (it is permitted to match on the \n at the
-end of the subject) and add 5.005's \z, which really does match only at the
-very end of the subject.
-
-5. Remove the \X "cut" facility; Perl doesn't have it, and (?> is neater.
-
-6. Remove the ability to specify CASELESS, MULTILINE, DOTALL, and
-DOLLAR_END_ONLY at runtime, to make it possible to implement the Perl 5.005
-localized options. All options to pcre_study() were also removed.
-
-7. Add other new features from 5.005:
-
-   $(?<=           positive lookbehind
-   $(?<!           negative lookbehind
-   (?imsx-imsx)    added the unsetting capability
-                   such a setting is global if at outer level; local otherwise
-   (?imsx-imsx:)   non-capturing groups with option setting
-   (?(cond)re|re)  conditional pattern matching
-
-   A backreference to itself in a repeated group matches the previous
-   captured string.
-
-8. General tidying up of studying (both automatic and via "study")
-consequential on the addition of new assertions.
-
-9. As in 5.005, unlimited repeated groups that could match an empty substring
-are no longer faulted at compile time. Instead, the loop is forcibly broken at
-runtime if any iteration does actually match an empty substring.
-
-10. Include the RunTest script in the distribution.
-
-11. Added tests from the Perl 5.005_02 distribution. This showed up a few
-discrepancies, some of which were old and were also with respect to 5.004. They
-have now been fixed.
-
-
-Version 1.09 28-Apr-98
-----------------------
-
-1. A negated single character class followed by a quantifier with a minimum
-value of one (e.g.  [^x]{1,6}  ) was not compiled correctly. This could lead to
-program crashes, or just wrong answers. This did not apply to negated classes
-containing more than one character, or to minima other than one.
-
-
-Version 1.08 27-Mar-98
-----------------------
-
-1. Add PCRE_UNGREEDY to invert the greediness of quantifiers.
-
-2. Add (?U) and (?X) to set PCRE_UNGREEDY and PCRE_EXTRA respectively. The
-latter must appear before anything that relies on it in the pattern.
-
-
-Version 1.07 16-Feb-98
-----------------------
-
-1. A pattern such as /((a)*)*/ was not being diagnosed as in error (unlimited
-repeat of a potentially empty string).
-
-
-Version 1.06 23-Jan-98
-----------------------
-
-1. Added Markus Oberhumer's little patches for C++.
-
-2. Literal strings longer than 255 characters were broken.
-
-
-Version 1.05 23-Dec-97
-----------------------
-
-1. Negated character classes containing more than one character were failing if
-PCRE_CASELESS was set at run time.
-
-
-Version 1.04 19-Dec-97
-----------------------
-
-1. Corrected the man page, where some "const" qualifiers had been omitted.
-
-2. Made debugging output print "{0,xxx}" instead of just "{,xxx}" to agree with
-input syntax.
-
-3. Fixed memory leak which occurred when a regex with back references was
-matched with an offsets vector that wasn't big enough. The temporary memory
-that is used in this case wasn't being freed if the match failed.
-
-4. Tidied pcretest to ensure it frees memory that it gets.
-
-5. Temporary memory was being obtained in the case where the passed offsets
-vector was exactly big enough.
-
-6. Corrected definition of offsetof() from change 5 below.
-
-7. I had screwed up change 6 below and broken the rules for the use of
-setjmp(). Now fixed.
-
-
-Version 1.03 18-Dec-97
-----------------------
-
-1. A erroneous regex with a missing opening parenthesis was correctly
-diagnosed, but PCRE attempted to access brastack[-1], which could cause crashes
-on some systems.
-
-2. Replaced offsetof(real_pcre, code) by offsetof(real_pcre, code[0]) because
-it was reported that one broken compiler failed on the former because "code" is
-also an independent variable.
-
-3. The erroneous regex a[]b caused an array overrun reference.
-
-4. A regex ending with a one-character negative class (e.g. /[^k]$/) did not
-fail on data ending with that character. (It was going on too far, and checking
-the next character, typically a binary zero.) This was specific to the
-optimized code for single-character negative classes.
-
-5. Added a contributed patch from the TIN world which does the following:
-
-  + Add an undef for memmove, in case the the system defines a macro for it.
-
-  + Add a definition of offsetof(), in case there isn't one. (I don't know
-    the reason behind this - offsetof() is part of the ANSI standard - but
-    it does no harm).
-
-  + Reduce the ifdef's in pcre.c using macro DPRINTF, thereby eliminating
-    most of the places where whitespace preceded '#'. I have given up and
-    allowed the remaining 2 cases to be at the margin.
-
-  + Rename some variables in pcre to eliminate shadowing. This seems very
-    pedantic, but does no harm, of course.
-
-6. Moved the call to setjmp() into its own function, to get rid of warnings
-from gcc -Wall, and avoided calling it at all unless PCRE_EXTRA is used.
-
-7. Constructs such as \d{8,} were compiling into the equivalent of
-\d{8}\d{0,65527} instead of \d{8}\d* which didn't make much difference to the
-outcome, but in this particular case used more store than had been allocated,
-which caused the bug to be discovered because it threw up an internal error.
-
-8. The debugging code in both pcre and pcretest for outputting the compiled
-form of a regex was going wrong in the case of back references followed by
-curly-bracketed repeats.
-
-
-Version 1.02 12-Dec-97
-----------------------
-
-1. Typos in pcre.3 and comments in the source fixed.
-
-2. Applied a contributed patch to get rid of places where it used to remove
-'const' from variables, and fixed some signed/unsigned and uninitialized
-variable warnings.
-
-3. Added the "runtest" target to Makefile.
-
-4. Set default compiler flag to -O2 rather than just -O.
-
-
-Version 1.01 19-Nov-97
-----------------------
-
-1. PCRE was failing to diagnose unlimited repeat of empty string for patterns
-like /([ab]*)*/, that is, for classes with more than one character in them.
-
-2. Likewise, it wasn't diagnosing patterns with "once-only" subpatterns, such
-as /((?>a*))*/ (a PCRE_EXTRA facility).
-
-
-Version 1.00 18-Nov-97
-----------------------
-
-1. Added compile-time macros to support systems such as SunOS4 which don't have
-memmove() or strerror() but have other things that can be used instead.
-
-2. Arranged that "make clean" removes the executables.
-
-
-Version 0.99 27-Oct-97
-----------------------
-
-1. Fixed bug in code for optimizing classes with only one character. It was
-initializing a 32-byte map regardless, which could cause it to run off the end
-of the memory it had got.
-
-2. Added, conditional on PCRE_EXTRA, the proposed (?>REGEX) construction.
-
-
-Version 0.98 22-Oct-97
-----------------------
-
-1. Fixed bug in code for handling temporary memory usage when there are more
-back references than supplied space in the ovector. This could cause segfaults.
-
-
-Version 0.97 21-Oct-97
-----------------------
-
-1. Added the \X "cut" facility, conditional on PCRE_EXTRA.
-
-2. Optimized negated single characters not to use a bit map.
-
-3. Brought error texts together as macro definitions; clarified some of them;
-fixed one that was wrong - it said "range out of order" when it meant "invalid
-escape sequence".
-
-4. Changed some char * arguments to const char *.
-
-5. Added PCRE_NOTBOL and PCRE_NOTEOL (from POSIX).
-
-6. Added the POSIX-style API wrapper in pcreposix.a and testing facilities in
-pcretest.
-
-
-Version 0.96 16-Oct-97
-----------------------
-
-1. Added a simple "pgrep" utility to the distribution.
-
-2. Fixed an incompatibility with Perl: "{" is now treated as a normal character
-unless it appears in one of the precise forms "{ddd}", "{ddd,}", or "{ddd,ddd}"
-where "ddd" means "one or more decimal digits".
-
-3. Fixed serious bug. If a pattern had a back reference, but the call to
-pcre_exec() didn't supply a large enough ovector to record the related
-identifying subpattern, the match always failed. PCRE now remembers the number
-of the largest back reference, and gets some temporary memory in which to save
-the offsets during matching if necessary, in order to ensure that
-backreferences always work.
-
-4. Increased the compatibility with Perl in a number of ways:
-
-  (a) . no longer matches \n by default; an option PCRE_DOTALL is provided
-      to request this handling. The option can be set at compile or exec time.
-
-  (b) $ matches before a terminating newline by default; an option
-      PCRE_DOLLAR_ENDONLY is provided to override this (but not in multiline
-      mode). The option can be set at compile or exec time.
-
-  (c) The handling of \ followed by a digit other than 0 is now supposed to be
-      the same as Perl's. If the decimal number it represents is less than 10
-      or there aren't that many previous left capturing parentheses, an octal
-      escape is read. Inside a character class, it's always an octal escape,
-      even if it is a single digit.
-
-  (d) An escaped but undefined alphabetic character is taken as a literal,
-      unless PCRE_EXTRA is set. Currently this just reserves the remaining
-      escapes.
-
-  (e) {0} is now permitted. (The previous item is removed from the compiled
-      pattern).
-
-5. Changed all the names of code files so that the basic parts are no longer
-than 10 characters, and abolished the teeny "globals.c" file.
-
-6. Changed the handling of character classes; they are now done with a 32-byte
-bit map always.
-
-7. Added the -d and /D options to pcretest to make it possible to look at the
-internals of compilation without having to recompile pcre.
-
-
-Version 0.95 23-Sep-97
-----------------------
-
-1. Fixed bug in pre-pass concerning escaped "normal" characters such as \x5c or
-\x20 at the start of a run of normal characters. These were being treated as
-real characters, instead of the source characters being re-checked.
-
-
-Version 0.94 18-Sep-97
-----------------------
-
-1. The functions are now thread-safe, with the caveat that the global variables
-containing pointers to malloc() and free() or alternative functions are the
-same for all threads.
-
-2. Get pcre_study() to generate a bitmap of initial characters for non-
-anchored patterns when this is possible, and use it if passed to pcre_exec().
-
-
-Version 0.93 15-Sep-97
-----------------------
-
-1. /(b)|(:+)/ was computing an incorrect first character.
-
-2. Add pcre_study() to the API and the passing of pcre_extra to pcre_exec(),
-but not actually doing anything yet.
-
-3. Treat "-" characters in classes that cannot be part of ranges as literals,
-as Perl does (e.g. [-az] or [az-]).
-
-4. Set the anchored flag if a branch starts with .* or .*? because that tests
-all possible positions.
-
-5. Split up into different modules to avoid including unneeded functions in a
-compiled binary. However, compile and exec are still in one module. The "study"
-function is split off.
-
-6. The character tables are now in a separate module whose source is generated
-by an auxiliary program - but can then be edited by hand if required. There are
-now no calls to isalnum(), isspace(), isdigit(), isxdigit(), tolower() or
-toupper() in the code.
-
-7. Turn the malloc/free funtions variables into pcre_malloc and pcre_free and
-make them global. Abolish the function for setting them, as the caller can now
-set them directly.
-
-
-Version 0.92 11-Sep-97
-----------------------
-
-1. A repeat with a fixed maximum and a minimum of 1 for an ordinary character
-(e.g. /a{1,3}/) was broken (I mis-optimized it).
-
-2. Caseless matching was not working in character classes if the characters in
-the pattern were in upper case.
-
-3. Make ranges like [W-c] work in the same way as Perl for caseless matching.
-
-4. Make PCRE_ANCHORED public and accept as a compile option.
-
-5. Add an options word to pcre_exec() and accept PCRE_ANCHORED and
-PCRE_CASELESS at run time. Add escapes \A and \I to pcretest to cause it to
-pass them.
-
-6. Give an error if bad option bits passed at compile or run time.
-
-7. Add PCRE_MULTILINE at compile and exec time, and (?m) as well. Add \M to
-pcretest to cause it to pass that flag.
-
-8. Add pcre_info(), to get the number of identifying subpatterns, the stored
-options, and the first character, if set.
-
-9. Recognize C+ or C{n,m} where n >= 1 as providing a fixed starting character.
-
-
-Version 0.91 10-Sep-97
-----------------------
-
-1. PCRE was failing to diagnose unlimited repeats of subpatterns that could
-match the empty string as in /(a*)*/. It was looping and ultimately crashing.
-
-2. PCRE was looping on encountering an indefinitely repeated back reference to
-a subpattern that had matched an empty string, e.g. /(a|)\1*/. It now does what
-Perl does - treats the match as successful.
-
-****
diff --git a/dist/HACKING b/dist/HACKING
deleted file mode 100644
index 691b7a1..0000000
--- a/dist/HACKING
+++ /dev/null
@@ -1,528 +0,0 @@
-Technical Notes about PCRE
---------------------------
-
-These are very rough technical notes that record potentially useful information 
-about PCRE internals. For information about testing PCRE, see the pcretest 
-documentation and the comment at the head of the RunTest file.
-
-
-Historical note 1
------------------
-
-Many years ago I implemented some regular expression functions to an algorithm
-suggested by Martin Richards. These were not Unix-like in form, and were quite
-restricted in what they could do by comparison with Perl. The interesting part
-about the algorithm was that the amount of space required to hold the compiled
-form of an expression was known in advance. The code to apply an expression did
-not operate by backtracking, as the original Henry Spencer code and current
-Perl code does, but instead checked all possibilities simultaneously by keeping
-a list of current states and checking all of them as it advanced through the
-subject string. In the terminology of Jeffrey Friedl's book, it was a "DFA
-algorithm", though it was not a traditional Finite State Machine (FSM). When
-the pattern was all used up, all remaining states were possible matches, and
-the one matching the longest subset of the subject string was chosen. This did
-not necessarily maximize the individual wild portions of the pattern, as is
-expected in Unix and Perl-style regular expressions.
-
-
-Historical note 2
------------------
-
-By contrast, the code originally written by Henry Spencer (which was
-subsequently heavily modified for Perl) compiles the expression twice: once in
-a dummy mode in order to find out how much store will be needed, and then for
-real. (The Perl version probably doesn't do this any more; I'm talking about
-the original library.) The execution function operates by backtracking and
-maximizing (or, optionally, minimizing in Perl) the amount of the subject that
-matches individual wild portions of the pattern. This is an "NFA algorithm" in
-Friedl's terminology.
-
-
-OK, here's the real stuff
--------------------------
-
-For the set of functions that form the "basic" PCRE library (which are
-unrelated to those mentioned above), I tried at first to invent an algorithm
-that used an amount of store bounded by a multiple of the number of characters
-in the pattern, to save on compiling time. However, because of the greater
-complexity in Perl regular expressions, I couldn't do this. In any case, a
-first pass through the pattern is helpful for other reasons. 
-
-
-Support for 16-bit and 32-bit data strings
--------------------------------------------
-
-From release 8.30, PCRE supports 16-bit as well as 8-bit data strings; and from
-release 8.32, PCRE supports 32-bit data strings. The library can be compiled
-in any combination of 8-bit, 16-bit or 32-bit modes, creating up to three
-different libraries. In the description that follows, the word "short" is used
-for a 16-bit data quantity, and the word "unit" is used for a quantity that is
-a byte in 8-bit mode, a short in 16-bit mode and a 32-bit word in 32-bit mode.
-However, so as not to over-complicate the text, the names of PCRE functions are
-given in 8-bit form only.
-
-
-Computing the memory requirement: how it was
---------------------------------------------
-
-Up to and including release 6.7, PCRE worked by running a very degenerate first
-pass to calculate a maximum store size, and then a second pass to do the real
-compile - which might use a bit less than the predicted amount of memory. The
-idea was that this would turn out faster than the Henry Spencer code because
-the first pass is degenerate and the second pass can just store stuff straight
-into the vector, which it knows is big enough.
-
-
-Computing the memory requirement: how it is
--------------------------------------------
-
-By the time I was working on a potential 6.8 release, the degenerate first pass
-had become very complicated and hard to maintain. Indeed one of the early
-things I did for 6.8 was to fix Yet Another Bug in the memory computation. Then
-I had a flash of inspiration as to how I could run the real compile function in
-a "fake" mode that enables it to compute how much memory it would need, while
-actually only ever using a few hundred bytes of working memory, and without too
-many tests of the mode that might slow it down. So I refactored the compiling
-functions to work this way. This got rid of about 600 lines of source. It
-should make future maintenance and development easier. As this was such a major 
-change, I never released 6.8, instead upping the number to 7.0 (other quite 
-major changes were also present in the 7.0 release).
-
-A side effect of this work was that the previous limit of 200 on the nesting
-depth of parentheses was removed. However, there is a downside: pcre_compile()
-runs more slowly than before (30% or more, depending on the pattern) because it
-is doing a full analysis of the pattern. My hope was that this would not be a
-big issue, and in the event, nobody has commented on it.
-
-At release 8.34, a limit on the nesting depth of parentheses was re-introduced
-(default 250, settable at build time) so as to put a limit on the amount of 
-system stack used by pcre_compile(). This is a safety feature for environments 
-with small stacks where the patterns are provided by users.
-
-
-Traditional matching function
------------------------------
-
-The "traditional", and original, matching function is called pcre_exec(), and 
-it implements an NFA algorithm, similar to the original Henry Spencer algorithm 
-and the way that Perl works. This is not surprising, since it is intended to be
-as compatible with Perl as possible. This is the function most users of PCRE
-will use most of the time. From release 8.20, if PCRE is compiled with 
-just-in-time (JIT) support, and studying a compiled pattern with JIT is 
-successful, the JIT code is run instead of the normal pcre_exec() code, but the 
-result is the same.
-
-
-Supplementary matching function
--------------------------------
-
-From PCRE 6.0, there is also a supplementary matching function called 
-pcre_dfa_exec(). This implements a DFA matching algorithm that searches 
-simultaneously for all possible matches that start at one point in the subject 
-string. (Going back to my roots: see Historical Note 1 above.) This function 
-intreprets the same compiled pattern data as pcre_exec(); however, not all the 
-facilities are available, and those that are do not always work in quite the 
-same way. See the user documentation for details.
-
-The algorithm that is used for pcre_dfa_exec() is not a traditional FSM, 
-because it may have a number of states active at one time. More work would be
-needed at compile time to produce a traditional FSM where only one state is
-ever active at once. I believe some other regex matchers work this way. JIT
-support is not available for this kind of matching.
-
-
-Changeable options
-------------------
-
-The /i, /m, or /s options (PCRE_CASELESS, PCRE_MULTILINE, PCRE_DOTALL, and some 
-others) may change in the middle of patterns. From PCRE 8.13, their processing
-is handled entirely at compile time by generating different opcodes for the
-different settings. The runtime functions do not need to keep track of an
-options state any more.
-
-
-Format of compiled patterns
----------------------------
-
-The compiled form of a pattern is a vector of unsigned units (bytes in 8-bit
-mode, shorts in 16-bit mode, 32-bit words in 32-bit mode), containing items of
-variable length. The first unit in an item contains an opcode, and the length
-of the item is either implicit in the opcode or contained in the data that
-follows it.
-
-In many cases listed below, LINK_SIZE data values are specified for offsets
-within the compiled pattern. LINK_SIZE always specifies a number of bytes. The
-default value for LINK_SIZE is 2, but PCRE can be compiled to use 3-byte or
-4-byte values for these offsets, although this impairs the performance. (3-byte
-LINK_SIZE values are available only in 8-bit mode.) Specifing a LINK_SIZE
-larger than 2 is necessary only when patterns whose compiled length is greater
-than 64K are going to be processed. In this description, we assume the "normal"
-compilation options. Data values that are counts (e.g. quantifiers) are two
-bytes long in 8-bit mode (most significant byte first), or one unit in 16-bit
-and 32-bit modes.
-
-
-Opcodes with no following data
-------------------------------
-
-These items are all just one unit long
-
-  OP_END                 end of pattern
-  OP_ANY                 match any one character other than newline
-  OP_ALLANY              match any one character, including newline
-  OP_ANYBYTE             match any single unit, even in UTF-8/16 mode
-  OP_SOD                 match start of data: \A
-  OP_SOM,                start of match (subject + offset): \G
-  OP_SET_SOM,            set start of match (\K) 
-  OP_CIRC                ^ (start of data)
-  OP_CIRCM               ^ multiline mode (start of data or after newline)
-  OP_NOT_WORD_BOUNDARY   \W
-  OP_WORD_BOUNDARY       \w
-  OP_NOT_DIGIT           \D
-  OP_DIGIT               \d
-  OP_NOT_HSPACE          \H
-  OP_HSPACE              \h  
-  OP_NOT_WHITESPACE      \S
-  OP_WHITESPACE          \s
-  OP_NOT_VSPACE          \V
-  OP_VSPACE              \v  
-  OP_NOT_WORDCHAR        \W
-  OP_WORDCHAR            \w
-  OP_EODN                match end of data or newline at end: \Z
-  OP_EOD                 match end of data: \z
-  OP_DOLL                $ (end of data, or before final newline)
-  OP_DOLLM               $ multiline mode (end of data or before newline)
-  OP_EXTUNI              match an extended Unicode grapheme cluster 
-  OP_ANYNL               match any Unicode newline sequence 
-  
-  OP_ASSERT_ACCEPT       )
-  OP_ACCEPT              ) These are Perl 5.10's "backtracking control   
-  OP_COMMIT              ) verbs". If OP_ACCEPT is inside capturing
-  OP_FAIL                ) parentheses, it may be preceded by one or more
-  OP_PRUNE               ) OP_CLOSE, each followed by a count that
-  OP_SKIP                ) indicates which parentheses must be closed.
-  OP_THEN                )
-  
-OP_ASSERT_ACCEPT is used when (*ACCEPT) is encountered within an assertion. 
-This ends the assertion, not the entire pattern match.  
-  
-
-Backtracking control verbs with optional data
----------------------------------------------
-
-(*THEN) without an argument generates the opcode OP_THEN and no following data.
-OP_MARK is followed by the mark name, preceded by a one-unit length, and
-followed by a binary zero. For (*PRUNE), (*SKIP), and (*THEN) with arguments,
-the opcodes OP_PRUNE_ARG, OP_SKIP_ARG, and OP_THEN_ARG are used, with the name
-following in the same format as OP_MARK.
-  
-
-Matching literal characters
----------------------------
-
-The OP_CHAR opcode is followed by a single character that is to be matched 
-casefully. For caseless matching, OP_CHARI is used. In UTF-8 or UTF-16 modes,
-the character may be more than one unit long. In UTF-32 mode, characters
-are always exactly one unit long.
-
-If there is only one character in a character class, OP_CHAR or OP_CHARI is
-used for a positive class, and OP_NOT or OP_NOTI for a negative one (that is,
-for something like [^a]).
-
-
-Repeating single characters
----------------------------
-
-The common repeats (*, +, ?), when applied to a single character, use the
-following opcodes, which come in caseful and caseless versions:
-
-  Caseful         Caseless
-  OP_STAR         OP_STARI      
-  OP_MINSTAR      OP_MINSTARI   
-  OP_POSSTAR      OP_POSSTARI   
-  OP_PLUS         OP_PLUSI      
-  OP_MINPLUS      OP_MINPLUSI   
-  OP_POSPLUS      OP_POSPLUSI   
-  OP_QUERY        OP_QUERYI     
-  OP_MINQUERY     OP_MINQUERYI  
-  OP_POSQUERY     OP_POSQUERYI  
-
-Each opcode is followed by the character that is to be repeated. In ASCII mode,
-these are two-unit items; in UTF-8 or UTF-16 modes, the length is variable; in
-UTF-32 mode these are one-unit items. Those with "MIN" in their names are the
-minimizing versions. Those with "POS" in their names are possessive versions.
-Other repeats make use of these opcodes:
-
-  Caseful         Caseless
-  OP_UPTO         OP_UPTOI    
-  OP_MINUPTO      OP_MINUPTOI 
-  OP_POSUPTO      OP_POSUPTOI 
-  OP_EXACT        OP_EXACTI   
-
-Each of these is followed by a count and then the repeated character. OP_UPTO
-matches from 0 to the given number. A repeat with a non-zero minimum and a
-fixed maximum is coded as an OP_EXACT followed by an OP_UPTO (or OP_MINUPTO or
-OPT_POSUPTO).
-
-Another set of matching repeating opcodes (called OP_NOTSTAR, OP_NOTSTARI,
-etc.) are used for repeated, negated, single-character classes such as [^a]*.
-The normal single-character opcodes (OP_STAR, etc.) are used for repeated
-positive single-character classes.
-
-
-Repeating character types
--------------------------
-
-Repeats of things like \d are done exactly as for single characters, except
-that instead of a character, the opcode for the type is stored in the data
-unit. The opcodes are:
-
-  OP_TYPESTAR
-  OP_TYPEMINSTAR
-  OP_TYPEPOSSTAR 
-  OP_TYPEPLUS
-  OP_TYPEMINPLUS
-  OP_TYPEPOSPLUS 
-  OP_TYPEQUERY
-  OP_TYPEMINQUERY
-  OP_TYPEPOSQUERY 
-  OP_TYPEUPTO
-  OP_TYPEMINUPTO
-  OP_TYPEPOSUPTO 
-  OP_TYPEEXACT
-
-
-Match by Unicode property
--------------------------
-
-OP_PROP and OP_NOTPROP are used for positive and negative matches of a 
-character by testing its Unicode property (the \p and \P escape sequences).
-Each is followed by two units that encode the desired property as a type and a
-value. The types are a set of #defines of the form PT_xxx, and the values are
-enumerations of the form ucp_xx, defined in the ucp.h source file. The value is
-relevant only for PT_GC (General Category), PT_PC (Particular Category), and
-PT_SC (Script).
-
-Repeats of these items use the OP_TYPESTAR etc. set of opcodes, followed by
-three units: OP_PROP or OP_NOTPROP, and then the desired property type and
-value.
-
-
-Character classes
------------------
-
-If there is only one character in a class, OP_CHAR or OP_CHARI is used for a
-positive class, and OP_NOT or OP_NOTI for a negative one (that is, for
-something like [^a]). 
-
-A set of repeating opcodes (called OP_NOTSTAR etc.) are used for repeated,
-negated, single-character classes. The normal single-character opcodes
-(OP_STAR, etc.) are used for repeated positive single-character classes.
-
-When there is more than one character in a class, and all the code points are
-less than 256, OP_CLASS is used for a positive class, and OP_NCLASS for a
-negative one. In either case, the opcode is followed by a 32-byte (16-short, 
-8-word) bit map containing a 1 bit for every character that is acceptable. The
-bits are counted from the least significant end of each unit. In caseless mode,
-bits for both cases are set.
-
-The reason for having both OP_CLASS and OP_NCLASS is so that, in UTF-8/16/32
-mode, subject characters with values greater than 255 can be handled correctly.
-For OP_CLASS they do not match, whereas for OP_NCLASS they do.
-
-For classes containing characters with values greater than 255 or that contain 
-\p or \P, OP_XCLASS is used. It optionally uses a bit map if any code points
-are less than 256, followed by a list of pairs (for a range) and single
-characters. In caseless mode, both cases are explicitly listed.
-
-OP_XCLASS is followed by a unit containing flag bits: XCL_NOT indicates that 
-this is a negative class, and XCL_MAP indicates that a bit map is present.
-There follows the bit map, if XCL_MAP is set, and then a sequence of items
-coded as follows:
-
-  XCL_END      marks the end of the list
-  XCL_SINGLE   one character follows
-  XCL_RANGE    two characters follow
-  XCL_PROP     a Unicode property (type, value) follows   
-  XCL_NOTPROP  a Unicode property (type, value) follows   
-
-If a range starts with a code point less than 256 and ends with one greater 
-than 256, an XCL_RANGE item is used, without setting any bits in the bit map. 
-This means that if no other items in the class set bits in the map, a map is 
-not needed.
-
-
-Back references
----------------
-
-OP_REF (caseful) or OP_REFI (caseless) is followed by a count containing the
-reference number if the reference is to a unique capturing group (either by
-number or by name). When named groups are used, there may be more than one
-group with the same name. In this case, a reference by name generates OP_DNREF
-or OP_DNREFI. These are followed by two counts: the index (not the byte offset) 
-in the group name table of the first entry for the requred name, followed by
-the number of groups with the same name.
-
-
-Repeating character classes and back references
------------------------------------------------
-
-Single-character classes are handled specially (see above). This section
-applies to other classes and also to back references. In both cases, the repeat
-information follows the base item. The matching code looks at the following
-opcode to see if it is one of
-
-  OP_CRSTAR
-  OP_CRMINSTAR
-  OP_CRPOSSTAR 
-  OP_CRPLUS
-  OP_CRMINPLUS
-  OP_CRPOSPLUS 
-  OP_CRQUERY
-  OP_CRMINQUERY
-  OP_CRPOSQUERY 
-  OP_CRRANGE
-  OP_CRMINRANGE
-  OP_CRPOSRANGE 
-
-All but the last three are single-unit items, with no data. The others are
-followed by the minimum and maximum repeat counts.
-
-
-Brackets and alternation
-------------------------
-
-A pair of non-capturing round brackets is wrapped round each expression at
-compile time, so alternation always happens in the context of brackets.
-
-[Note for North Americans: "bracket" to some English speakers, including
-myself, can be round, square, curly, or pointy. Hence this usage rather than 
-"parentheses".]
-
-Non-capturing brackets use the opcode OP_BRA. Originally PCRE was limited to 99
-capturing brackets and it used a different opcode for each one. From release
-3.5, the limit was removed by putting the bracket number into the data for
-higher-numbered brackets. From release 7.0 all capturing brackets are handled
-this way, using the single opcode OP_CBRA.
-
-A bracket opcode is followed by LINK_SIZE bytes which give the offset to the
-next alternative OP_ALT or, if there aren't any branches, to the matching
-OP_KET opcode. Each OP_ALT is followed by LINK_SIZE bytes giving the offset to
-the next one, or to the OP_KET opcode. For capturing brackets, the bracket 
-number is a count that immediately follows the offset.
-
-OP_KET is used for subpatterns that do not repeat indefinitely, and OP_KETRMIN
-and OP_KETRMAX are used for indefinite repetitions, minimally or maximally
-respectively (see below for possessive repetitions). All three are followed by
-LINK_SIZE bytes giving (as a positive number) the offset back to the matching
-bracket opcode.
-
-If a subpattern is quantified such that it is permitted to match zero times, it
-is preceded by one of OP_BRAZERO, OP_BRAMINZERO, or OP_SKIPZERO. These are
-single-unit opcodes that tell the matcher that skipping the following
-subpattern entirely is a valid branch. In the case of the first two, not 
-skipping the pattern is also valid (greedy and non-greedy). The third is used 
-when a pattern has the quantifier {0,0}. It cannot be entirely discarded,
-because it may be called as a subroutine from elsewhere in the regex.
-
-A subpattern with an indefinite maximum repetition is replicated in the
-compiled data its minimum number of times (or once with OP_BRAZERO if the
-minimum is zero), with the final copy terminating with OP_KETRMIN or OP_KETRMAX
-as appropriate.
-
-A subpattern with a bounded maximum repetition is replicated in a nested
-fashion up to the maximum number of times, with OP_BRAZERO or OP_BRAMINZERO
-before each replication after the minimum, so that, for example, (abc){2,5} is
-compiled as (abc)(abc)((abc)((abc)(abc)?)?)?, except that each bracketed group 
-has the same number.
-
-When a repeated subpattern has an unbounded upper limit, it is checked to see 
-whether it could match an empty string. If this is the case, the opcode in the 
-final replication is changed to OP_SBRA or OP_SCBRA. This tells the matcher
-that it needs to check for matching an empty string when it hits OP_KETRMIN or
-OP_KETRMAX, and if so, to break the loop.
-
-
-Possessive brackets
--------------------
-
-When a repeated group (capturing or non-capturing) is marked as possessive by
-the "+" notation, e.g. (abc)++, different opcodes are used. Their names all
-have POS on the end, e.g. OP_BRAPOS instead of OP_BRA and OP_SCPBRPOS instead 
-of OP_SCBRA. The end of such a group is marked by OP_KETRPOS. If the minimum 
-repetition is zero, the group is preceded by OP_BRAPOSZERO.
-
-
-Once-only (atomic) groups
--------------------------
-
-These are just like other subpatterns, but they start with the opcode
-OP_ONCE or OP_ONCE_NC. The former is used when there are no capturing brackets 
-within the atomic group; the latter when there are. The distinction is needed 
-for when there is a backtrack to before the group - any captures within the 
-group must be reset, so it is necessary to retain backtracking points inside
-the group even after it is complete in order to do this. When there are no 
-captures in an atomic group, all the backtracking can be discarded when it is 
-complete. This is more efficient, and also uses less stack.
-
-The check for matching an empty string in an unbounded repeat is handled
-entirely at runtime, so there are just these two opcodes for atomic groups.
-
-
-Assertions
-----------
-
-Forward assertions are also just like other subpatterns, but starting with one
-of the opcodes OP_ASSERT or OP_ASSERT_NOT. Backward assertions use the opcodes
-OP_ASSERTBACK and OP_ASSERTBACK_NOT, and the first opcode inside the assertion
-is OP_REVERSE, followed by a count of the number of characters to move back the
-pointer in the subject string. In ASCII mode, the count is a number of units,
-but in UTF-8/16 mode each character may occupy more than one unit; in UTF-32
-mode each character occupies exactly one unit. A separate count is present in
-each alternative of a lookbehind assertion, allowing them to have different
-fixed lengths.
-
-
-Conditional subpatterns
------------------------
-
-These are like other subpatterns, but they start with the opcode OP_COND, or
-OP_SCOND for one that might match an empty string in an unbounded repeat. If
-the condition is a back reference, this is stored at the start of the
-subpattern using the opcode OP_CREF followed by a count containing the
-reference number, provided that the reference is to a unique capturing group.
-If the reference was by name and there is more than one group with that name, 
-OP_DNCREF is used instead. It is followed by two counts: the index in the group 
-names table, and the number of groups with the same name.
-
-If the condition is "in recursion" (coded as "(?(R)"), or "in recursion of
-group x" (coded as "(?(Rx)"), the group number is stored at the start of the
-subpattern using the opcode OP_RREF (with a value of zero for "the whole
-pattern") or OP_DNRREF (with data as for OP_DNCREF). For a DEFINE condition,
-just the single unit OP_DEF is used (it has no associated data). Otherwise, a
-conditional subpattern always starts with one of the assertions.
-
-
-Recursion
----------
-
-Recursion either matches the current regex, or some subexpression. The opcode
-OP_RECURSE is followed by aLINK_SIZE value that is the offset to the starting
-bracket from the start of the whole pattern. From release 6.5, OP_RECURSE is
-automatically wrapped inside OP_ONCE brackets, because otherwise some patterns
-broke it. OP_RECURSE is also used for "subroutine" calls, even though they are
-not strictly a recursion.
-
-
-Callout
--------
-
-OP_CALLOUT is followed by one unit of data that holds a callout number in the
-range 0 to 254 for manual callouts, or 255 for an automatic callout. In both 
-cases there follows a count giving the offset in the pattern string to the
-start of the following item, and another count giving the length of this item.
-These values make is possible for pcretest to output useful tracing information 
-using automatic callouts.
-
-Philip Hazel
-November 2013
diff --git a/dist/Makefile.am b/dist/Makefile.am
deleted file mode 100644
index 5f640b0..0000000
--- a/dist/Makefile.am
+++ /dev/null
@@ -1,894 +0,0 @@
-## Process this file with automake to produce Makefile.in.
-
-ACLOCAL_AMFLAGS = -I m4
-
-dist_doc_DATA = \
-  doc/pcre.txt \
-  doc/pcre-config.txt \
-  doc/pcregrep.txt \
-  doc/pcretest.txt \
-  AUTHORS \
-  COPYING \
-  ChangeLog \
-  LICENCE \
-  NEWS \
-  README
-
-# Note that pcrecpp.html is not in this list; it is listed separately below.
-
-dist_html_DATA = \
-  doc/html/NON-AUTOTOOLS-BUILD.txt \
-  doc/html/README.txt \
-  doc/html/index.html \
-  doc/html/pcre-config.html \
-  doc/html/pcre.html \
-  doc/html/pcre16.html \
-  doc/html/pcre32.html \
-  doc/html/pcre_assign_jit_stack.html \
-  doc/html/pcre_compile.html \
-  doc/html/pcre_compile2.html \
-  doc/html/pcre_config.html \
-  doc/html/pcre_copy_named_substring.html \
-  doc/html/pcre_copy_substring.html \
-  doc/html/pcre_dfa_exec.html \
-  doc/html/pcre_exec.html \
-  doc/html/pcre_free_study.html \
-  doc/html/pcre_free_substring.html \
-  doc/html/pcre_free_substring_list.html \
-  doc/html/pcre_fullinfo.html \
-  doc/html/pcre_get_named_substring.html \
-  doc/html/pcre_get_stringnumber.html \
-  doc/html/pcre_get_stringtable_entries.html \
-  doc/html/pcre_get_substring.html \
-  doc/html/pcre_get_substring_list.html \
-  doc/html/pcre_jit_exec.html \
-  doc/html/pcre_jit_stack_alloc.html \
-  doc/html/pcre_jit_stack_free.html \
-  doc/html/pcre_maketables.html \
-  doc/html/pcre_pattern_to_host_byte_order.html \
-  doc/html/pcre_refcount.html \
-  doc/html/pcre_study.html \
-  doc/html/pcre_utf16_to_host_byte_order.html \
-  doc/html/pcre_utf32_to_host_byte_order.html \
-  doc/html/pcre_version.html \
-  doc/html/pcreapi.html \
-  doc/html/pcrebuild.html \
-  doc/html/pcrecallout.html \
-  doc/html/pcrecompat.html \
-  doc/html/pcredemo.html \
-  doc/html/pcregrep.html \
-  doc/html/pcrejit.html \
-  doc/html/pcrelimits.html \
-  doc/html/pcrematching.html \
-  doc/html/pcrepartial.html \
-  doc/html/pcrepattern.html \
-  doc/html/pcreperform.html \
-  doc/html/pcreposix.html \
-  doc/html/pcreprecompile.html \
-  doc/html/pcresample.html \
-  doc/html/pcrestack.html \
-  doc/html/pcresyntax.html \
-  doc/html/pcretest.html \
-  doc/html/pcreunicode.html
-
-pcrecpp_html = doc/html/pcrecpp.html
-dist_noinst_DATA = $(pcrecpp_html)
-
-if WITH_PCRE_CPP
-html_DATA = $(pcrecpp_html)
-endif
-
-# The Libtool libraries to install.  We'll add to this later.
-lib_LTLIBRARIES =
-
-# Unit tests you want to run when people type 'make check'.
-# TESTS is for binary unit tests, check_SCRIPTS for script-based tests
-TESTS =
-check_SCRIPTS =
-dist_noinst_SCRIPTS =
-
-# Some of the binaries we make are to be installed, and others are
-# (non-user-visible) helper programs needed to build libpcre, libpcre16
-# or libpcre32.
-bin_PROGRAMS =
-noinst_PROGRAMS =
-
-# Additional files to delete on 'make clean' and 'make maintainer-clean'.
-CLEANFILES =
-MAINTAINERCLEANFILES =
-
-# Additional files to bundle with the distribution, over and above what
-# the Autotools include by default.
-EXTRA_DIST =
-
-# These files contain additional m4 macros that are used by autoconf.
-EXTRA_DIST += \
-  m4/ax_pthread.m4 m4/pcre_visibility.m4
-
-# These files contain maintenance information
-EXTRA_DIST += \
-  doc/perltest.txt \
-  NON-UNIX-USE \
-  NON-AUTOTOOLS-BUILD \
-  HACKING
-
-# These files are used in the preparation of a release
-EXTRA_DIST += \
-  PrepareRelease \
-  CheckMan \
-  CleanTxt \
-  Detrail \
-  132html \
-  doc/index.html.src
-
-# These files are to do with building for Virtual Pascal
-EXTRA_DIST += \
-  makevp.bat \
-  makevp_c.txt \
-  makevp_l.txt \
-  pcregexp.pas
-
-# These files are usable versions of pcre.h and config.h that are distributed
-# for the benefit of people who are building PCRE manually, without the
-# Autotools support.
-EXTRA_DIST += \
-  pcre.h.generic \
-  config.h.generic
-
-# The only difference between pcre.h.in and pcre.h is the setting of the PCRE
-# version number. Therefore, we can create the generic version just by copying.
-pcre.h.generic: pcre.h.in configure.ac
-	rm -f $@
-	cp -p pcre.h $@
-
-# It is more complicated for config.h.generic. We need the version that results
-# from a default configuration so as to get all the default values for PCRE
-# configuration macros such as MATCH_LIMIT and NEWLINE. We can get this by
-# doing a configure in a temporary directory. However, some trickery is needed,
-# because the source directory may already be configured. If you just try
-# running configure in a new directory, it complains. For this reason, we move
-# config.status out of the way while doing the default configuration. The
-# resulting config.h is munged by perl to put #ifdefs round any #defines for
-# macros with values, and to #undef all boolean macros such as HAVE_xxx and
-# SUPPORT_xxx. We also get rid of any gcc-specific visibility settings. Make
-# sure that PCRE_EXP_DEFN is unset (in case it has visibility settings).
-config.h.generic: configure.ac
-	rm -rf $@ _generic
-	mkdir _generic
-	cs=$(srcdir)/config.status; test ! -f $$cs || mv -f $$cs $$cs.aside
-	cd _generic && $(abs_top_srcdir)/configure || :
-	cs=$(srcdir)/config.status; test ! -f $$cs.aside || mv -f $$cs.aside $$cs
-	test -f _generic/config.h
-	perl -n \
-	  -e 'BEGIN{$$blank=0;}' \
-	  -e 'if(/PCRE_EXP_DEFN/){print"/* #undef PCRE_EXP_DEFN */\n";$$blank=0;next;}' \
-	  -e 'if(/to make a symbol visible/){next;}' \
-	  -e 'if(/__attribute__ \(\(visibility/){next;}' \
-	  -e 'if(/LT_OBJDIR/){print"/* This is ignored unless you are using libtool. */\n";}' \
-	  -e 'if(/^#define\s((?:HAVE|SUPPORT|STDC)_\w+)/){print"/* #undef $$1 */\n";$$blank=0;next;}' \
-	  -e 'if(/^#define\s(?!PACKAGE|VERSION)(\w+)/){print"#ifndef $$1\n$$_#endif\n";$$blank=0;next;}' \
-	  -e 'if(/^\s*$$/){print unless $$blank; $$blank=1;} else{print;$$blank=0;}' \
-	  _generic/config.h >$@
-	rm -rf _generic
-
-MAINTAINERCLEANFILES += pcre.h.generic config.h.generic
-
-# These are the header files we'll install. We do not distribute pcre.h because
-# it is generated from pcre.h.in.
-nodist_include_HEADERS = \
-  pcre.h
-include_HEADERS = \
-  pcreposix.h
-
-# These additional headers will be be installed if C++ support is enabled. We
-# do not distribute pcrecpparg.h or pcre_stringpiece.h, as these are generated
-# from corresponding .h.in files (which we do distribute).
-if WITH_PCRE_CPP
-nodist_include_HEADERS += \
-  pcrecpparg.h \
-  pcre_stringpiece.h
-include_HEADERS += \
-  pcrecpp.h \
-  pcre_scanner.h
-endif # WITH_PCRE_CPP
-
-bin_SCRIPTS = pcre-config
-
-## ---------------------------------------------------------------
-## The dftables program is used to rebuild character tables before compiling
-## PCRE, if --enable-rebuild-chartables is specified. It is not a user-visible
-## program. The default (when --enable-rebuild-chartables is not specified) is
-## to copy a distributed set of tables that are defined for ASCII code. In this
-## case, dftables is not needed.
-
-if WITH_REBUILD_CHARTABLES
-
-noinst_PROGRAMS += dftables
-dftables_SOURCES = dftables.c
-
-pcre_chartables.c: dftables$(EXEEXT)
-	./dftables$(EXEEXT) $@
-else
-
-pcre_chartables.c: $(srcdir)/pcre_chartables.c.dist
-	rm -f $@
-	$(LN_S) $(srcdir)/pcre_chartables.c.dist $@
-
-endif # WITH_REBUILD_CHARTABLES
-
-BUILT_SOURCES = pcre_chartables.c
-
-## The main pcre library
-
-# Build the 8 bit library if it is enabled.
-if WITH_PCRE8
-lib_LTLIBRARIES += libpcre.la
-
-libpcre_la_SOURCES = \
-  pcre_byte_order.c \
-  pcre_compile.c \
-  pcre_config.c \
-  pcre_dfa_exec.c \
-  pcre_exec.c \
-  pcre_fullinfo.c \
-  pcre_get.c \
-  pcre_globals.c \
-  pcre_internal.h \
-  pcre_jit_compile.c \
-  pcre_maketables.c \
-  pcre_newline.c \
-  pcre_ord2utf8.c \
-  pcre_refcount.c \
-  pcre_string_utils.c \
-  pcre_study.c \
-  pcre_tables.c \
-  pcre_ucd.c \
-  pcre_valid_utf8.c \
-  pcre_version.c \
-  pcre_xclass.c \
-  ucp.h
-
-libpcre_la_CFLAGS = \
-  $(VISIBILITY_CFLAGS) \
-  $(AM_CFLAGS)
-
-libpcre_la_LIBADD =
-
-## This file is generated as part of the building process, so don't distribute.
-nodist_libpcre_la_SOURCES = \
-  pcre_chartables.c
-
-endif # WITH_PCRE8
-
-# Build the 16 bit library if it is enabled.
-if WITH_PCRE16
-lib_LTLIBRARIES += libpcre16.la
-libpcre16_la_SOURCES = \
-  pcre16_byte_order.c \
-  pcre16_chartables.c \
-  pcre16_compile.c \
-  pcre16_config.c \
-  pcre16_dfa_exec.c \
-  pcre16_exec.c \
-  pcre16_fullinfo.c \
-  pcre16_get.c \
-  pcre16_globals.c \
-  pcre16_jit_compile.c \
-  pcre16_maketables.c \
-  pcre16_newline.c \
-  pcre16_ord2utf16.c \
-  pcre16_refcount.c \
-  pcre16_string_utils.c \
-  pcre16_study.c \
-  pcre16_tables.c \
-  pcre16_ucd.c \
-  pcre16_utf16_utils.c \
-  pcre16_valid_utf16.c \
-  pcre16_version.c \
-  pcre16_xclass.c
-
-libpcre16_la_CFLAGS = \
-  $(VISIBILITY_CFLAGS) \
-  $(AM_CFLAGS)
-
-libpcre16_la_LIBADD =
-
-## This file is generated as part of the building process, so don't distribute.
-nodist_libpcre16_la_SOURCES = \
-  pcre_chartables.c
-
-endif # WITH_PCRE16
-
-# Build the 32 bit library if it is enabled.
-if WITH_PCRE32
-lib_LTLIBRARIES += libpcre32.la
-libpcre32_la_SOURCES = \
-  pcre32_byte_order.c \
-  pcre32_chartables.c \
-  pcre32_compile.c \
-  pcre32_config.c \
-  pcre32_dfa_exec.c \
-  pcre32_exec.c \
-  pcre32_fullinfo.c \
-  pcre32_get.c \
-  pcre32_globals.c \
-  pcre32_jit_compile.c \
-  pcre32_maketables.c \
-  pcre32_newline.c \
-  pcre32_ord2utf32.c \
-  pcre32_refcount.c \
-  pcre32_string_utils.c \
-  pcre32_study.c \
-  pcre32_tables.c \
-  pcre32_ucd.c \
-  pcre32_utf32_utils.c \
-  pcre32_valid_utf32.c \
-  pcre32_version.c \
-  pcre32_xclass.c
-
-libpcre32_la_CFLAGS = \
-  $(VISIBILITY_CFLAGS) \
-  $(AM_CFLAGS)
-
-libpcre32_la_LIBADD =
-
-## This file is generated as part of the building process, so don't distribute.
-nodist_libpcre32_la_SOURCES = \
-  pcre_chartables.c
-
-endif # WITH_PCRE32
-
-# The pcre_chartables.c.dist file is the default version of pcre_chartables.c,
-# used unless --enable-rebuild-chartables is specified.
-EXTRA_DIST += pcre_chartables.c.dist
-
-# The JIT compiler lives in a separate directory, but its files are #included
-# when pcre_jit_compile.c is processed, so they must be distributed.
-EXTRA_DIST += \
-  sljit/sljitConfig.h \
-  sljit/sljitConfigInternal.h \
-  sljit/sljitExecAllocator.c \
-  sljit/sljitLir.c \
-  sljit/sljitLir.h \
-  sljit/sljitNativeARM_32.c \
-  sljit/sljitNativeARM_64.c \
-  sljit/sljitNativeARM_T2_32.c \
-  sljit/sljitNativeMIPS_32.c \
-  sljit/sljitNativeMIPS_64.c \
-  sljit/sljitNativeMIPS_common.c \
-  sljit/sljitNativePPC_32.c \
-  sljit/sljitNativePPC_64.c \
-  sljit/sljitNativePPC_common.c \
-  sljit/sljitNativeSPARC_32.c \
-  sljit/sljitNativeSPARC_common.c \
-  sljit/sljitNativeTILEGX_64.c \
-  sljit/sljitNativeTILEGX-encoder.c \
-  sljit/sljitNativeX86_32.c \
-  sljit/sljitNativeX86_64.c \
-  sljit/sljitNativeX86_common.c \
-  sljit/sljitUtils.c
-
-if WITH_PCRE8
-libpcre_la_LDFLAGS = $(EXTRA_LIBPCRE_LDFLAGS)
-endif # WITH_PCRE8
-if WITH_PCRE16
-libpcre16_la_LDFLAGS = $(EXTRA_LIBPCRE16_LDFLAGS)
-endif # WITH_PCRE16
-if WITH_PCRE32
-libpcre32_la_LDFLAGS = $(EXTRA_LIBPCRE32_LDFLAGS)
-endif # WITH_PCRE32
-
-if WITH_VALGRIND
-if WITH_PCRE8
-libpcre_la_CFLAGS += $(VALGRIND_CFLAGS)
-endif # WITH_PCRE8
-if WITH_PCRE16
-libpcre16_la_CFLAGS += $(VALGRIND_CFLAGS)
-endif # WITH_PCRE16
-if WITH_PCRE32
-libpcre32_la_CFLAGS += $(VALGRIND_CFLAGS)
-endif # WITH_PCRE32
-endif # WITH_VALGRIND
-
-if WITH_GCOV
-if WITH_PCRE8
-libpcre_la_CFLAGS += $(GCOV_CFLAGS)
-endif # WITH_PCRE8
-if WITH_PCRE16
-libpcre16_la_CFLAGS += $(GCOV_CFLAGS)
-endif # WITH_PCRE16
-if WITH_PCRE32
-libpcre32_la_CFLAGS += $(GCOV_CFLAGS)
-endif # WITH_PCRE32
-endif # WITH_GCOV
-
-CLEANFILES += pcre_chartables.c
-
-## If JIT support is enabled, arrange for the JIT test program to run.
-if WITH_JIT
-TESTS += pcre_jit_test
-noinst_PROGRAMS += pcre_jit_test
-pcre_jit_test_SOURCES = pcre_jit_test.c
-pcre_jit_test_CFLAGS = $(AM_CFLAGS)
-pcre_jit_test_LDADD =
-if WITH_PCRE8
-pcre_jit_test_LDADD += libpcre.la
-endif # WITH_PCRE8
-if WITH_PCRE16
-pcre_jit_test_LDADD += libpcre16.la
-endif # WITH_PCRE16
-if WITH_PCRE32
-pcre_jit_test_LDADD += libpcre32.la
-endif # WITH_PCRE32
-if WITH_GCOV
-pcre_jit_test_CFLAGS += $(GCOV_CFLAGS)
-pcre_jit_test_LDADD += $(GCOV_LIBS)
-endif # WITH_GCOV
-endif # WITH_JIT
-
-## A version of the main pcre library that has a posix re API.
-if WITH_PCRE8
-
-lib_LTLIBRARIES += libpcreposix.la
-libpcreposix_la_SOURCES = \
-  pcreposix.c
-libpcreposix_la_CFLAGS = $(VISIBILITY_CFLAGS) $(AM_CFLAGS)
-libpcreposix_la_LDFLAGS = $(EXTRA_LIBPCREPOSIX_LDFLAGS)
-libpcreposix_la_LIBADD = libpcre.la
-
-if WITH_GCOV
-libpcreposix_la_CFLAGS += $(GCOV_CFLAGS)
-endif # WITH_GCOV
-
-endif # WITH_PCRE8
-
-## There's a C++ library as well.
-if WITH_PCRE_CPP
-
-lib_LTLIBRARIES += libpcrecpp.la
-libpcrecpp_la_SOURCES = \
-  pcrecpp_internal.h \
-  pcrecpp.cc \
-  pcre_scanner.cc \
-  pcre_stringpiece.cc
-libpcrecpp_la_CXXFLAGS = $(VISIBILITY_CXXFLAGS) $(AM_CXXFLAGS)
-libpcrecpp_la_LDFLAGS = $(EXTRA_LIBPCRECPP_LDFLAGS)
-libpcrecpp_la_LIBADD = libpcre.la
-
-TESTS += pcrecpp_unittest
-noinst_PROGRAMS += pcrecpp_unittest
-pcrecpp_unittest_SOURCES = pcrecpp_unittest.cc
-pcrecpp_unittest_CXXFLAGS = $(AM_CXXFLAGS)
-pcrecpp_unittest_LDADD = libpcrecpp.la
-
-TESTS += pcre_scanner_unittest
-noinst_PROGRAMS += pcre_scanner_unittest
-pcre_scanner_unittest_SOURCES = pcre_scanner_unittest.cc
-pcre_scanner_unittest_CXXFLAGS = $(AM_CXXFLAGS)
-pcre_scanner_unittest_LDADD = libpcrecpp.la
-
-TESTS += pcre_stringpiece_unittest
-noinst_PROGRAMS += pcre_stringpiece_unittest
-pcre_stringpiece_unittest_SOURCES = pcre_stringpiece_unittest.cc
-pcre_stringpiece_unittest_CXXFLAGS = $(AM_CXXFLAGS)
-pcre_stringpiece_unittest_LDADD = libpcrecpp.la
-
-if WITH_GCOV
-libpcrecpp_la_CXXFLAGS += $(GCOV_CXXFLAGS)
-pcrecpp_unittest_LDADD += $(GCOV_LIBS)
-pcre_scanner_unittest_LDADD += $(GCOV_LIBS)
-pcre_stringpiece_unittest_LDADD += $(GCOV_LIBS)
-endif # WITH_GCOV
-
-endif # WITH_PCRE_CPP
-
-## The main unit tests
-
-# Each unit test is a binary plus a script that runs that binary in various
-# ways. We install these test binaries in case folks find it helpful.
-
-TESTS += RunTest
-dist_noinst_SCRIPTS += RunTest
-EXTRA_DIST += RunTest.bat
-bin_PROGRAMS += pcretest
-pcretest_SOURCES = pcretest.c
-pcretest_CFLAGS = $(AM_CFLAGS)
-pcretest_LDADD = $(LIBREADLINE)
-if WITH_PCRE8
-pcretest_SOURCES += pcre_printint.c
-pcretest_LDADD += libpcre.la libpcreposix.la
-endif # WITH_PCRE8
-if WITH_PCRE16
-pcretest_SOURCES += pcre16_printint.c
-pcretest_LDADD += libpcre16.la
-endif # WITH_PCRE16
-if WITH_PCRE32
-pcretest_SOURCES += pcre32_printint.c
-pcretest_LDADD += libpcre32.la
-endif # WITH_PCRE32
-if WITH_VALGRIND
-pcretest_CFLAGS += $(VALGRIND_CFLAGS)
-endif # WITH_VALGRIND
-if WITH_GCOV
-pcretest_CFLAGS += $(GCOV_CFLAGS)
-pcretest_LDADD += $(GCOV_LIBS)
-endif # WITH_GCOV
-
-if WITH_PCRE8
-TESTS += RunGrepTest
-dist_noinst_SCRIPTS += RunGrepTest
-bin_PROGRAMS += pcregrep
-pcregrep_SOURCES = pcregrep.c
-pcregrep_CFLAGS = $(AM_CFLAGS)
-pcregrep_LDADD = $(LIBZ) $(LIBBZ2)
-pcregrep_LDADD += libpcre.la libpcreposix.la
-if WITH_GCOV
-pcregrep_CFLAGS += $(GCOV_CFLAGS)
-pcregrep_LDADD += $(GCOV_LIBS)
-endif # WITH_GCOV
-endif # WITH_PCRE8
-
-EXTRA_DIST += \
-  testdata/grepbinary \
-  testdata/grepfilelist \
-  testdata/grepinput \
-  testdata/grepinput3 \
-  testdata/grepinput8 \
-  testdata/grepinputv \
-  testdata/grepinputx \
-  testdata/greplist \
-  testdata/grepoutput \
-  testdata/grepoutput8 \
-  testdata/grepoutputN \
-  testdata/greppatN4 \
-  testdata/saved16 \
-  testdata/saved16BE-1 \
-  testdata/saved16BE-2 \
-  testdata/saved16LE-1 \
-  testdata/saved16LE-2 \
-  testdata/saved32 \
-  testdata/saved32BE-1 \
-  testdata/saved32BE-2 \
-  testdata/saved32LE-1 \
-  testdata/saved32LE-2 \
-  testdata/saved8 \
-  testdata/testinput1 \
-  testdata/testinput2 \
-  testdata/testinput3 \
-  testdata/testinput4 \
-  testdata/testinput5 \
-  testdata/testinput6 \
-  testdata/testinput7 \
-  testdata/testinput8 \
-  testdata/testinput9 \
-  testdata/testinput10 \
-  testdata/testinput11 \
-  testdata/testinput12 \
-  testdata/testinput13 \
-  testdata/testinput14 \
-  testdata/testinput15 \
-  testdata/testinput16 \
-  testdata/testinput17 \
-  testdata/testinput18 \
-  testdata/testinput19 \
-  testdata/testinput20 \
-  testdata/testinput21 \
-  testdata/testinput22 \
-  testdata/testinput23 \
-  testdata/testinput24 \
-  testdata/testinput25 \
-  testdata/testinput26 \
-  testdata/testinputEBC \
-  testdata/testoutput1 \
-  testdata/testoutput2 \
-  testdata/testoutput3 \
-  testdata/testoutput3A \
-  testdata/testoutput3B \
-  testdata/testoutput4 \
-  testdata/testoutput5 \
-  testdata/testoutput6 \
-  testdata/testoutput7 \
-  testdata/testoutput8 \
-  testdata/testoutput9 \
-  testdata/testoutput10 \
-  testdata/testoutput11-8 \
-  testdata/testoutput11-16 \
-  testdata/testoutput11-32 \
-  testdata/testoutput12 \
-  testdata/testoutput13 \
-  testdata/testoutput14 \
-  testdata/testoutput15 \
-  testdata/testoutput16 \
-  testdata/testoutput17 \
-  testdata/testoutput18-16 \
-  testdata/testoutput18-32 \
-  testdata/testoutput19 \
-  testdata/testoutput20 \
-  testdata/testoutput21-16 \
-  testdata/testoutput21-32 \
-  testdata/testoutput22-16 \
-  testdata/testoutput22-32 \
-  testdata/testoutput23 \
-  testdata/testoutput24 \
-  testdata/testoutput25 \
-  testdata/testoutput26 \
-  testdata/testoutputEBC \
-  testdata/wintestinput3 \
-  testdata/wintestoutput3 \
-  perltest.pl
-
-CLEANFILES += \
-	testsavedregex \
-	teststderr \
-        testtemp* \
-	testtry \
-        testNinput \
-        testtrygrep \
-        teststderrgrep \
-        testNinputgrep
-
-# PCRE demonstration program. No longer built automatcally. The point is that
-# the users should build it themselves. So just distribute the source.
-# noinst_PROGRAMS += pcredemo
-# pcredemo_SOURCES = pcredemo.c
-# pcredemo_LDADD = libpcre.la
-
-EXTRA_DIST += pcredemo.c
-
-
-## Utility rules, documentation, etc.
-
-# A compatibility line, the old build system worked with 'make test'
-test: check ;
-
-
-# A PCRE user submitted the following addition, saying that it "will allow
-# anyone using the 'mingw32' compiler to simply type 'make pcre.dll' and get a
-# nice DLL for Windows use". (It is used by the pcre.dll target.)
-DLL_OBJS= pcre_byte_order.o pcre_compile.o pcre_config.o \
-	pcre_dfa_exec.o pcre_exec.o pcre_fullinfo.o pcre_get.o \
-	pcre_globals.o pcre_jit_compile.o pcre_maketables.o \
-	pcre_newline.o pcre_ord2utf8.o pcre_refcount.o \
-	pcre_study.o pcre_tables.o pcre_ucd.o \
-	pcre_valid_utf8.o pcre_version.o pcre_chartables.o \
-	pcre_xclass.o
-
-# A PCRE user submitted the following addition, saying that it "will allow
-# anyone using the 'mingw32' compiler to simply type 'make pcre.dll' and get a
-# nice DLL for Windows use".
-pcre.dll: $(DLL_OBJS)
-	$(CC) -shared -o pcre.dll -Wl,"--strip-all" -Wl,"--export-all-symbols" $(DLL_OBJS)
-
-
-# We have .pc files for pkg-config users.
-pkgconfigdir = $(libdir)/pkgconfig
-pkgconfig_DATA = libpcre.pc libpcreposix.pc
-if WITH_PCRE16
-pkgconfig_DATA += libpcre16.pc
-endif
-if WITH_PCRE32
-pkgconfig_DATA += libpcre32.pc
-endif
-if WITH_PCRE_CPP
-pkgconfig_DATA += libpcrecpp.pc
-endif
-
-# Note that pcrecpp.3 is not in this list, but is included separately below.
-
-dist_man_MANS = \
-  doc/pcre-config.1 \
-  doc/pcre.3 \
-  doc/pcre16.3 \
-  doc/pcre32.3 \
-  doc/pcre_assign_jit_stack.3 \
-  doc/pcre_compile.3 \
-  doc/pcre_compile2.3 \
-  doc/pcre_config.3 \
-  doc/pcre_copy_named_substring.3 \
-  doc/pcre_copy_substring.3 \
-  doc/pcre_dfa_exec.3 \
-  doc/pcre_exec.3 \
-  doc/pcre_free_study.3 \
-  doc/pcre_free_substring.3 \
-  doc/pcre_free_substring_list.3 \
-  doc/pcre_fullinfo.3 \
-  doc/pcre_get_named_substring.3 \
-  doc/pcre_get_stringnumber.3 \
-  doc/pcre_get_stringtable_entries.3 \
-  doc/pcre_get_substring.3 \
-  doc/pcre_get_substring_list.3 \
-  doc/pcre_jit_exec.3 \
-  doc/pcre_jit_stack_alloc.3 \
-  doc/pcre_jit_stack_free.3 \
-  doc/pcre_maketables.3 \
-  doc/pcre_pattern_to_host_byte_order.3 \
-  doc/pcre_refcount.3 \
-  doc/pcre_study.3 \
-  doc/pcre_utf16_to_host_byte_order.3 \
-  doc/pcre_utf32_to_host_byte_order.3 \
-  doc/pcre_version.3 \
-  doc/pcreapi.3 \
-  doc/pcrebuild.3 \
-  doc/pcrecallout.3 \
-  doc/pcrecompat.3 \
-  doc/pcredemo.3 \
-  doc/pcregrep.1 \
-  doc/pcrejit.3 \
-  doc/pcrelimits.3 \
-  doc/pcrematching.3 \
-  doc/pcrepartial.3 \
-  doc/pcrepattern.3 \
-  doc/pcreperform.3 \
-  doc/pcreposix.3 \
-  doc/pcreprecompile.3 \
-  doc/pcresample.3 \
-  doc/pcrestack.3 \
-  doc/pcresyntax.3 \
-  doc/pcretest.1 \
-  doc/pcreunicode.3
-
-# Arrange for the per-function man pages to have 16- and 32-bit names as well.
-install-data-hook:
-	ln -sf pcre_assign_jit_stack.3		 $(DESTDIR)$(man3dir)/pcre16_assign_jit_stack.3
-	ln -sf pcre_compile.3			 $(DESTDIR)$(man3dir)/pcre16_compile.3
-	ln -sf pcre_compile2.3			 $(DESTDIR)$(man3dir)/pcre16_compile2.3
-	ln -sf pcre_config.3			 $(DESTDIR)$(man3dir)/pcre16_config.3
-	ln -sf pcre_copy_named_substring.3	 $(DESTDIR)$(man3dir)/pcre16_copy_named_substring.3
-	ln -sf pcre_copy_substring.3		 $(DESTDIR)$(man3dir)/pcre16_copy_substring.3
-	ln -sf pcre_dfa_exec.3			 $(DESTDIR)$(man3dir)/pcre16_dfa_exec.3
-	ln -sf pcre_exec.3			 $(DESTDIR)$(man3dir)/pcre16_exec.3
-	ln -sf pcre_free_study.3		 $(DESTDIR)$(man3dir)/pcre16_free_study.3
-	ln -sf pcre_free_substring.3		 $(DESTDIR)$(man3dir)/pcre16_free_substring.3
-	ln -sf pcre_free_substring_list.3	 $(DESTDIR)$(man3dir)/pcre16_free_substring_list.3
-	ln -sf pcre_fullinfo.3			 $(DESTDIR)$(man3dir)/pcre16_fullinfo.3
-	ln -sf pcre_get_named_substring.3	 $(DESTDIR)$(man3dir)/pcre16_get_named_substring.3
-	ln -sf pcre_get_stringnumber.3		 $(DESTDIR)$(man3dir)/pcre16_get_stringnumber.3
-	ln -sf pcre_get_stringtable_entries.3	 $(DESTDIR)$(man3dir)/pcre16_get_stringtable_entries.3
-	ln -sf pcre_get_substring.3		 $(DESTDIR)$(man3dir)/pcre16_get_substring.3
-	ln -sf pcre_get_substring_list.3	 $(DESTDIR)$(man3dir)/pcre16_get_substring_list.3
-	ln -sf pcre_jit_exec.3			 $(DESTDIR)$(man3dir)/pcre16_jit_exec.3
-	ln -sf pcre_jit_stack_alloc.3		 $(DESTDIR)$(man3dir)/pcre16_jit_stack_alloc.3
-	ln -sf pcre_jit_stack_free.3		 $(DESTDIR)$(man3dir)/pcre16_jit_stack_free.3
-	ln -sf pcre_maketables.3		 $(DESTDIR)$(man3dir)/pcre16_maketables.3
-	ln -sf pcre_pattern_to_host_byte_order.3 $(DESTDIR)$(man3dir)/pcre16_pattern_to_host_byte_order.3
-	ln -sf pcre_refcount.3			 $(DESTDIR)$(man3dir)/pcre16_refcount.3
-	ln -sf pcre_study.3			 $(DESTDIR)$(man3dir)/pcre16_study.3
-	ln -sf pcre_utf16_to_host_byte_order.3	 $(DESTDIR)$(man3dir)/pcre16_utf16_to_host_byte_order.3
-	ln -sf pcre_version.3			 $(DESTDIR)$(man3dir)/pcre16_version.3
-	ln -sf pcre_assign_jit_stack.3		 $(DESTDIR)$(man3dir)/pcre32_assign_jit_stack.3
-	ln -sf pcre_compile.3			 $(DESTDIR)$(man3dir)/pcre32_compile.3
-	ln -sf pcre_compile2.3			 $(DESTDIR)$(man3dir)/pcre32_compile2.3
-	ln -sf pcre_config.3			 $(DESTDIR)$(man3dir)/pcre32_config.3
-	ln -sf pcre_copy_named_substring.3	 $(DESTDIR)$(man3dir)/pcre32_copy_named_substring.3
-	ln -sf pcre_copy_substring.3		 $(DESTDIR)$(man3dir)/pcre32_copy_substring.3
-	ln -sf pcre_dfa_exec.3			 $(DESTDIR)$(man3dir)/pcre32_dfa_exec.3
-	ln -sf pcre_exec.3			 $(DESTDIR)$(man3dir)/pcre32_exec.3
-	ln -sf pcre_free_study.3		 $(DESTDIR)$(man3dir)/pcre32_free_study.3
-	ln -sf pcre_free_substring.3		 $(DESTDIR)$(man3dir)/pcre32_free_substring.3
-	ln -sf pcre_free_substring_list.3	 $(DESTDIR)$(man3dir)/pcre32_free_substring_list.3
-	ln -sf pcre_fullinfo.3			 $(DESTDIR)$(man3dir)/pcre32_fullinfo.3
-	ln -sf pcre_get_named_substring.3	 $(DESTDIR)$(man3dir)/pcre32_get_named_substring.3
-	ln -sf pcre_get_stringnumber.3		 $(DESTDIR)$(man3dir)/pcre32_get_stringnumber.3
-	ln -sf pcre_get_stringtable_entries.3	 $(DESTDIR)$(man3dir)/pcre32_get_stringtable_entries.3
-	ln -sf pcre_get_substring.3		 $(DESTDIR)$(man3dir)/pcre32_get_substring.3
-	ln -sf pcre_get_substring_list.3	 $(DESTDIR)$(man3dir)/pcre32_get_substring_list.3
-	ln -sf pcre_jit_exec.3			 $(DESTDIR)$(man3dir)/pcre32_jit_exec.3
-	ln -sf pcre_jit_stack_alloc.3		 $(DESTDIR)$(man3dir)/pcre32_jit_stack_alloc.3
-	ln -sf pcre_jit_stack_free.3		 $(DESTDIR)$(man3dir)/pcre32_jit_stack_free.3
-	ln -sf pcre_maketables.3		 $(DESTDIR)$(man3dir)/pcre32_maketables.3
-	ln -sf pcre_pattern_to_host_byte_order.3 $(DESTDIR)$(man3dir)/pcre32_pattern_to_host_byte_order.3
-	ln -sf pcre_refcount.3			 $(DESTDIR)$(man3dir)/pcre32_refcount.3
-	ln -sf pcre_study.3			 $(DESTDIR)$(man3dir)/pcre32_study.3
-	ln -sf pcre_utf32_to_host_byte_order.3	 $(DESTDIR)$(man3dir)/pcre32_utf32_to_host_byte_order.3
-	ln -sf pcre_version.3			 $(DESTDIR)$(man3dir)/pcre32_version.3
-
-pcrecpp_man = doc/pcrecpp.3
-EXTRA_DIST += $(pcrecpp_man)
-
-if WITH_PCRE_CPP
-man_MANS = $(pcrecpp_man)
-endif
-
-# gcov/lcov code coverage reporting
-
-if WITH_GCOV
-
-# Coverage reporting targets:
-#
-# coverage: Create a coverage report from 'make check'
-# coverage-baseline: Capture baseline coverage information
-# coverage-reset: This zeros the coverage counters only
-# coverage-report: This creates the coverage report only
-# coverage-clean-report: This removes the generated coverage report
-#   without cleaning the coverage data itself
-# coverage-clean-data: This removes the captured coverage data without
-#   removing the coverage files created at compile time (*.gcno)
-# coverage-clean: This cleans all coverage data including the generated
-#   coverage report.
-
-COVERAGE_TEST_NAME = $(PACKAGE)
-COVERAGE_NAME = $(PACKAGE)-$(VERSION)
-COVERAGE_OUTPUT_FILE = $(COVERAGE_NAME)-coverage.info
-COVERAGE_OUTPUT_DIR = $(COVERAGE_NAME)-coverage
-COVERAGE_LCOV_EXTRA_FLAGS =
-COVERAGE_GENHTML_EXTRA_FLAGS =
-
-coverage_quiet = $(coverage_quiet_$(V))
-coverage_quiet_ = $(coverage_quiet_$(AM_DEFAULT_VERBOSITY))
-coverage_quiet_0 = --quiet
-
-coverage-check: all
-	-$(MAKE) $(AM_MAKEFLAGS) -k check
-
-coverage-baseline:
-	$(LCOV) $(coverage_quiet) \
-		--directory $(top_builddir) \
-		--output-file "$(COVERAGE_OUTPUT_FILE)" \
-		--capture \
-		--initial
-
-coverage-report:
-	$(LCOV) $(coverage_quiet) \
-		--directory $(top_builddir) \
-		--capture \
-		--output-file "$(COVERAGE_OUTPUT_FILE).tmp" \
-		--test-name "$(COVERAGE_TEST_NAME)" \
-		--no-checksum \
-		--compat-libtool \
-		$(COVERAGE_LCOV_EXTRA_FLAGS)
-	$(LCOV) $(coverage_quiet) \
-		--directory $(top_builddir) \
-		--output-file "$(COVERAGE_OUTPUT_FILE)" \
-		--remove "$(COVERAGE_OUTPUT_FILE).tmp" \
-		"/tmp/*" \
-		"/usr/include/*" \
-		"$(includedir)/*"
-	-@rm -f "$(COVERAGE_OUTPUT_FILE).tmp"
-	LANG=C $(GENHTML) $(coverage_quiet) \
-		--prefix $(top_builddir) \
-		--output-directory "$(COVERAGE_OUTPUT_DIR)" \
-		--title "$(PACKAGE) $(VERSION) Code Coverage Report" \
-		--show-details "$(COVERAGE_OUTPUT_FILE)" \
-		--legend \
-		$(COVERAGE_GENHTML_EXTRA_FLAGS)
-	@echo "Code coverage report written to file://$(abs_builddir)/$(COVERAGE_OUTPUT_DIR)/index.html"
-
-coverage-reset:
-	-$(LCOV) $(coverage_quiet) --zerocounters --directory $(top_builddir)
-
-coverage-clean-report:
-	-rm -f "$(COVERAGE_OUTPUT_FILE)" "$(COVERAGE_OUTPUT_FILE).tmp"
-	-rm -rf "$(COVERAGE_OUTPUT_DIR)"
-
-coverage-clean-data:
-	-find $(top_builddir) -name "*.gcda" -delete
-
-coverage-clean: coverage-reset coverage-clean-report coverage-clean-data
-	-find $(top_builddir) -name "*.gcno" -delete
-
-coverage-distclean: coverage-clean
-
-coverage: coverage-reset coverage-baseline coverage-check coverage-report
-clean-local: coverage-clean
-distclean-local: coverage-distclean
-
-.PHONY: coverage coverage-baseline coverage-check coverage-report coverage-reset coverage-clean-report coverage-clean-data coverage-clean coverage-distclean
-
-else
-
-coverage:
-	@echo "Configuring with --enable-coverage required to generate code coverage report."
-
-endif # WITH_GCOV
-
-## CMake support
-
-EXTRA_DIST += \
-  cmake/COPYING-CMAKE-SCRIPTS \
-  cmake/FindPackageHandleStandardArgs.cmake \
-  cmake/FindReadline.cmake \
-  cmake/FindEditline.cmake \
-  CMakeLists.txt \
-  config-cmake.h.in
-
-## end Makefile.am
diff --git a/dist/Makefile.in b/dist/Makefile.in
deleted file mode 100644
index c2a4530..0000000
--- a/dist/Makefile.in
+++ /dev/null
@@ -1,3296 +0,0 @@
-# Makefile.in generated by automake 1.15 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994-2014 Free Software Foundation, Inc.
-
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-@SET_MAKE@
-
-
-
-
-
-VPATH = @srcdir@
-am__is_gnu_make = { \
-  if test -z '$(MAKELEVEL)'; then \
-    false; \
-  elif test -n '$(MAKE_HOST)'; then \
-    true; \
-  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
-    true; \
-  else \
-    false; \
-  fi; \
-}
-am__make_running_with_option = \
-  case $${target_option-} in \
-      ?) ;; \
-      *) echo "am__make_running_with_option: internal error: invalid" \
-              "target option '$${target_option-}' specified" >&2; \
-         exit 1;; \
-  esac; \
-  has_opt=no; \
-  sane_makeflags=$$MAKEFLAGS; \
-  if $(am__is_gnu_make); then \
-    sane_makeflags=$$MFLAGS; \
-  else \
-    case $$MAKEFLAGS in \
-      *\\[\ \	]*) \
-        bs=\\; \
-        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
-          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
-    esac; \
-  fi; \
-  skip_next=no; \
-  strip_trailopt () \
-  { \
-    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
-  }; \
-  for flg in $$sane_makeflags; do \
-    test $$skip_next = yes && { skip_next=no; continue; }; \
-    case $$flg in \
-      *=*|--*) continue;; \
-        -*I) strip_trailopt 'I'; skip_next=yes;; \
-      -*I?*) strip_trailopt 'I';; \
-        -*O) strip_trailopt 'O'; skip_next=yes;; \
-      -*O?*) strip_trailopt 'O';; \
-        -*l) strip_trailopt 'l'; skip_next=yes;; \
-      -*l?*) strip_trailopt 'l';; \
-      -[dEDm]) skip_next=yes;; \
-      -[JT]) skip_next=yes;; \
-    esac; \
-    case $$flg in \
-      *$$target_option*) has_opt=yes; break;; \
-    esac; \
-  done; \
-  test $$has_opt = yes
-am__make_dryrun = (target_option=n; $(am__make_running_with_option))
-am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-TESTS = $(am__EXEEXT_3) $(am__EXEEXT_4) RunTest $(am__append_38)
-bin_PROGRAMS = pcretest$(EXEEXT) $(am__EXEEXT_1)
-noinst_PROGRAMS = $(am__EXEEXT_2) $(am__EXEEXT_3) $(am__EXEEXT_4)
-
-# These additional headers will be be installed if C++ support is enabled. We
-# do not distribute pcrecpparg.h or pcre_stringpiece.h, as these are generated
-# from corresponding .h.in files (which we do distribute).
-@WITH_PCRE_CPP_TRUE@am__append_1 = \
-@WITH_PCRE_CPP_TRUE@  pcrecpparg.h \
-@WITH_PCRE_CPP_TRUE@  pcre_stringpiece.h
-
-@WITH_PCRE_CPP_TRUE@am__append_2 = \
-@WITH_PCRE_CPP_TRUE@  pcrecpp.h \
-@WITH_PCRE_CPP_TRUE@  pcre_scanner.h
-
-@WITH_REBUILD_CHARTABLES_TRUE@am__append_3 = dftables
-
-# Build the 8 bit library if it is enabled.
-@WITH_PCRE8_TRUE@am__append_4 = libpcre.la
-
-# Build the 16 bit library if it is enabled.
-@WITH_PCRE16_TRUE@am__append_5 = libpcre16.la
-
-# Build the 32 bit library if it is enabled.
-@WITH_PCRE32_TRUE@am__append_6 = libpcre32.la
-@WITH_PCRE8_TRUE@@WITH_VALGRIND_TRUE@am__append_7 = $(VALGRIND_CFLAGS)
-@WITH_PCRE16_TRUE@@WITH_VALGRIND_TRUE@am__append_8 = $(VALGRIND_CFLAGS)
-@WITH_PCRE32_TRUE@@WITH_VALGRIND_TRUE@am__append_9 = $(VALGRIND_CFLAGS)
-@WITH_GCOV_TRUE@@WITH_PCRE8_TRUE@am__append_10 = $(GCOV_CFLAGS)
-@WITH_GCOV_TRUE@@WITH_PCRE16_TRUE@am__append_11 = $(GCOV_CFLAGS)
-@WITH_GCOV_TRUE@@WITH_PCRE32_TRUE@am__append_12 = $(GCOV_CFLAGS)
-@WITH_JIT_TRUE@am__append_13 = pcre_jit_test
-@WITH_JIT_TRUE@am__append_14 = pcre_jit_test
-@WITH_JIT_TRUE@@WITH_PCRE8_TRUE@am__append_15 = libpcre.la
-@WITH_JIT_TRUE@@WITH_PCRE16_TRUE@am__append_16 = libpcre16.la
-@WITH_JIT_TRUE@@WITH_PCRE32_TRUE@am__append_17 = libpcre32.la
-@WITH_GCOV_TRUE@@WITH_JIT_TRUE@am__append_18 = $(GCOV_CFLAGS)
-@WITH_GCOV_TRUE@@WITH_JIT_TRUE@am__append_19 = $(GCOV_LIBS)
-@WITH_PCRE8_TRUE@am__append_20 = libpcreposix.la
-@WITH_GCOV_TRUE@@WITH_PCRE8_TRUE@am__append_21 = $(GCOV_CFLAGS)
-@WITH_PCRE_CPP_TRUE@am__append_22 = libpcrecpp.la
-@WITH_PCRE_CPP_TRUE@am__append_23 = pcrecpp_unittest \
-@WITH_PCRE_CPP_TRUE@	pcre_scanner_unittest \
-@WITH_PCRE_CPP_TRUE@	pcre_stringpiece_unittest
-@WITH_PCRE_CPP_TRUE@am__append_24 = pcrecpp_unittest \
-@WITH_PCRE_CPP_TRUE@	pcre_scanner_unittest \
-@WITH_PCRE_CPP_TRUE@	pcre_stringpiece_unittest
-@WITH_GCOV_TRUE@@WITH_PCRE_CPP_TRUE@am__append_25 = $(GCOV_CXXFLAGS)
-@WITH_GCOV_TRUE@@WITH_PCRE_CPP_TRUE@am__append_26 = $(GCOV_LIBS)
-@WITH_GCOV_TRUE@@WITH_PCRE_CPP_TRUE@am__append_27 = $(GCOV_LIBS)
-@WITH_GCOV_TRUE@@WITH_PCRE_CPP_TRUE@am__append_28 = $(GCOV_LIBS)
-@WITH_PCRE8_TRUE@am__append_29 = pcre_printint.c
-@WITH_PCRE8_TRUE@am__append_30 = libpcre.la libpcreposix.la
-@WITH_PCRE16_TRUE@am__append_31 = pcre16_printint.c
-@WITH_PCRE16_TRUE@am__append_32 = libpcre16.la
-@WITH_PCRE32_TRUE@am__append_33 = pcre32_printint.c
-@WITH_PCRE32_TRUE@am__append_34 = libpcre32.la
-@WITH_VALGRIND_TRUE@am__append_35 = $(VALGRIND_CFLAGS)
-@WITH_GCOV_TRUE@am__append_36 = $(GCOV_CFLAGS)
-@WITH_GCOV_TRUE@am__append_37 = $(GCOV_LIBS)
-@WITH_PCRE8_TRUE@am__append_38 = RunGrepTest
-@WITH_PCRE8_TRUE@am__append_39 = RunGrepTest
-@WITH_PCRE8_TRUE@am__append_40 = pcregrep
-@WITH_GCOV_TRUE@@WITH_PCRE8_TRUE@am__append_41 = $(GCOV_CFLAGS)
-@WITH_GCOV_TRUE@@WITH_PCRE8_TRUE@am__append_42 = $(GCOV_LIBS)
-@WITH_PCRE16_TRUE@am__append_43 = libpcre16.pc
-@WITH_PCRE32_TRUE@am__append_44 = libpcre32.pc
-@WITH_PCRE_CPP_TRUE@am__append_45 = libpcrecpp.pc
-subdir = .
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ax_pthread.m4 \
-	$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
-	$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
-	$(top_srcdir)/m4/lt~obsolete.m4 \
-	$(top_srcdir)/m4/pcre_visibility.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \
-	$(am__configure_deps) $(am__dist_noinst_SCRIPTS_DIST) \
-	$(dist_doc_DATA) $(dist_html_DATA) $(dist_noinst_DATA) \
-	$(am__include_HEADERS_DIST) $(am__DIST_COMMON)
-am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
- configure.lineno config.status.lineno
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = config.h
-CONFIG_CLEAN_FILES = libpcre.pc libpcre16.pc libpcre32.pc \
-	libpcreposix.pc libpcrecpp.pc pcre-config pcre.h \
-	pcre_stringpiece.h pcrecpparg.h
-CONFIG_CLEAN_VPATH_FILES =
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
-    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
-    *) f=$$p;; \
-  esac;
-am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
-am__install_max = 40
-am__nobase_strip_setup = \
-  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
-am__nobase_strip = \
-  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
-am__nobase_list = $(am__nobase_strip_setup); \
-  for p in $$list; do echo "$$p $$p"; done | \
-  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
-  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
-    if (++n[$$2] == $(am__install_max)) \
-      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
-    END { for (dir in files) print dir, files[dir] }'
-am__base_list = \
-  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
-  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
-am__uninstall_files_from_dir = { \
-  test -z "$$files" \
-    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
-    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
-         $(am__cd) "$$dir" && rm -f $$files; }; \
-  }
-am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" \
-	"$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" \
-	"$(DESTDIR)$(man3dir)" "$(DESTDIR)$(docdir)" \
-	"$(DESTDIR)$(htmldir)" "$(DESTDIR)$(htmldir)" \
-	"$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(includedir)" \
-	"$(DESTDIR)$(includedir)"
-LTLIBRARIES = $(lib_LTLIBRARIES)
-libpcre_la_DEPENDENCIES =
-am__libpcre_la_SOURCES_DIST = pcre_byte_order.c pcre_compile.c \
-	pcre_config.c pcre_dfa_exec.c pcre_exec.c pcre_fullinfo.c \
-	pcre_get.c pcre_globals.c pcre_internal.h pcre_jit_compile.c \
-	pcre_maketables.c pcre_newline.c pcre_ord2utf8.c \
-	pcre_refcount.c pcre_string_utils.c pcre_study.c pcre_tables.c \
-	pcre_ucd.c pcre_valid_utf8.c pcre_version.c pcre_xclass.c \
-	ucp.h
-@WITH_PCRE8_TRUE@am_libpcre_la_OBJECTS =  \
-@WITH_PCRE8_TRUE@	libpcre_la-pcre_byte_order.lo \
-@WITH_PCRE8_TRUE@	libpcre_la-pcre_compile.lo \
-@WITH_PCRE8_TRUE@	libpcre_la-pcre_config.lo \
-@WITH_PCRE8_TRUE@	libpcre_la-pcre_dfa_exec.lo \
-@WITH_PCRE8_TRUE@	libpcre_la-pcre_exec.lo \
-@WITH_PCRE8_TRUE@	libpcre_la-pcre_fullinfo.lo \
-@WITH_PCRE8_TRUE@	libpcre_la-pcre_get.lo \
-@WITH_PCRE8_TRUE@	libpcre_la-pcre_globals.lo \
-@WITH_PCRE8_TRUE@	libpcre_la-pcre_jit_compile.lo \
-@WITH_PCRE8_TRUE@	libpcre_la-pcre_maketables.lo \
-@WITH_PCRE8_TRUE@	libpcre_la-pcre_newline.lo \
-@WITH_PCRE8_TRUE@	libpcre_la-pcre_ord2utf8.lo \
-@WITH_PCRE8_TRUE@	libpcre_la-pcre_refcount.lo \
-@WITH_PCRE8_TRUE@	libpcre_la-pcre_string_utils.lo \
-@WITH_PCRE8_TRUE@	libpcre_la-pcre_study.lo \
-@WITH_PCRE8_TRUE@	libpcre_la-pcre_tables.lo \
-@WITH_PCRE8_TRUE@	libpcre_la-pcre_ucd.lo \
-@WITH_PCRE8_TRUE@	libpcre_la-pcre_valid_utf8.lo \
-@WITH_PCRE8_TRUE@	libpcre_la-pcre_version.lo \
-@WITH_PCRE8_TRUE@	libpcre_la-pcre_xclass.lo
-@WITH_PCRE8_TRUE@nodist_libpcre_la_OBJECTS =  \
-@WITH_PCRE8_TRUE@	libpcre_la-pcre_chartables.lo
-libpcre_la_OBJECTS = $(am_libpcre_la_OBJECTS) \
-	$(nodist_libpcre_la_OBJECTS)
-AM_V_lt = $(am__v_lt_@AM_V@)
-am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
-am__v_lt_0 = --silent
-am__v_lt_1 =
-libpcre_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(libpcre_la_CFLAGS) \
-	$(CFLAGS) $(libpcre_la_LDFLAGS) $(LDFLAGS) -o $@
-@WITH_PCRE8_TRUE@am_libpcre_la_rpath = -rpath $(libdir)
-libpcre16_la_DEPENDENCIES =
-am__libpcre16_la_SOURCES_DIST = pcre16_byte_order.c \
-	pcre16_chartables.c pcre16_compile.c pcre16_config.c \
-	pcre16_dfa_exec.c pcre16_exec.c pcre16_fullinfo.c pcre16_get.c \
-	pcre16_globals.c pcre16_jit_compile.c pcre16_maketables.c \
-	pcre16_newline.c pcre16_ord2utf16.c pcre16_refcount.c \
-	pcre16_string_utils.c pcre16_study.c pcre16_tables.c \
-	pcre16_ucd.c pcre16_utf16_utils.c pcre16_valid_utf16.c \
-	pcre16_version.c pcre16_xclass.c
-@WITH_PCRE16_TRUE@am_libpcre16_la_OBJECTS =  \
-@WITH_PCRE16_TRUE@	libpcre16_la-pcre16_byte_order.lo \
-@WITH_PCRE16_TRUE@	libpcre16_la-pcre16_chartables.lo \
-@WITH_PCRE16_TRUE@	libpcre16_la-pcre16_compile.lo \
-@WITH_PCRE16_TRUE@	libpcre16_la-pcre16_config.lo \
-@WITH_PCRE16_TRUE@	libpcre16_la-pcre16_dfa_exec.lo \
-@WITH_PCRE16_TRUE@	libpcre16_la-pcre16_exec.lo \
-@WITH_PCRE16_TRUE@	libpcre16_la-pcre16_fullinfo.lo \
-@WITH_PCRE16_TRUE@	libpcre16_la-pcre16_get.lo \
-@WITH_PCRE16_TRUE@	libpcre16_la-pcre16_globals.lo \
-@WITH_PCRE16_TRUE@	libpcre16_la-pcre16_jit_compile.lo \
-@WITH_PCRE16_TRUE@	libpcre16_la-pcre16_maketables.lo \
-@WITH_PCRE16_TRUE@	libpcre16_la-pcre16_newline.lo \
-@WITH_PCRE16_TRUE@	libpcre16_la-pcre16_ord2utf16.lo \
-@WITH_PCRE16_TRUE@	libpcre16_la-pcre16_refcount.lo \
-@WITH_PCRE16_TRUE@	libpcre16_la-pcre16_string_utils.lo \
-@WITH_PCRE16_TRUE@	libpcre16_la-pcre16_study.lo \
-@WITH_PCRE16_TRUE@	libpcre16_la-pcre16_tables.lo \
-@WITH_PCRE16_TRUE@	libpcre16_la-pcre16_ucd.lo \
-@WITH_PCRE16_TRUE@	libpcre16_la-pcre16_utf16_utils.lo \
-@WITH_PCRE16_TRUE@	libpcre16_la-pcre16_valid_utf16.lo \
-@WITH_PCRE16_TRUE@	libpcre16_la-pcre16_version.lo \
-@WITH_PCRE16_TRUE@	libpcre16_la-pcre16_xclass.lo
-@WITH_PCRE16_TRUE@nodist_libpcre16_la_OBJECTS =  \
-@WITH_PCRE16_TRUE@	libpcre16_la-pcre_chartables.lo
-libpcre16_la_OBJECTS = $(am_libpcre16_la_OBJECTS) \
-	$(nodist_libpcre16_la_OBJECTS)
-libpcre16_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(libpcre16_la_CFLAGS) \
-	$(CFLAGS) $(libpcre16_la_LDFLAGS) $(LDFLAGS) -o $@
-@WITH_PCRE16_TRUE@am_libpcre16_la_rpath = -rpath $(libdir)
-libpcre32_la_DEPENDENCIES =
-am__libpcre32_la_SOURCES_DIST = pcre32_byte_order.c \
-	pcre32_chartables.c pcre32_compile.c pcre32_config.c \
-	pcre32_dfa_exec.c pcre32_exec.c pcre32_fullinfo.c pcre32_get.c \
-	pcre32_globals.c pcre32_jit_compile.c pcre32_maketables.c \
-	pcre32_newline.c pcre32_ord2utf32.c pcre32_refcount.c \
-	pcre32_string_utils.c pcre32_study.c pcre32_tables.c \
-	pcre32_ucd.c pcre32_utf32_utils.c pcre32_valid_utf32.c \
-	pcre32_version.c pcre32_xclass.c
-@WITH_PCRE32_TRUE@am_libpcre32_la_OBJECTS =  \
-@WITH_PCRE32_TRUE@	libpcre32_la-pcre32_byte_order.lo \
-@WITH_PCRE32_TRUE@	libpcre32_la-pcre32_chartables.lo \
-@WITH_PCRE32_TRUE@	libpcre32_la-pcre32_compile.lo \
-@WITH_PCRE32_TRUE@	libpcre32_la-pcre32_config.lo \
-@WITH_PCRE32_TRUE@	libpcre32_la-pcre32_dfa_exec.lo \
-@WITH_PCRE32_TRUE@	libpcre32_la-pcre32_exec.lo \
-@WITH_PCRE32_TRUE@	libpcre32_la-pcre32_fullinfo.lo \
-@WITH_PCRE32_TRUE@	libpcre32_la-pcre32_get.lo \
-@WITH_PCRE32_TRUE@	libpcre32_la-pcre32_globals.lo \
-@WITH_PCRE32_TRUE@	libpcre32_la-pcre32_jit_compile.lo \
-@WITH_PCRE32_TRUE@	libpcre32_la-pcre32_maketables.lo \
-@WITH_PCRE32_TRUE@	libpcre32_la-pcre32_newline.lo \
-@WITH_PCRE32_TRUE@	libpcre32_la-pcre32_ord2utf32.lo \
-@WITH_PCRE32_TRUE@	libpcre32_la-pcre32_refcount.lo \
-@WITH_PCRE32_TRUE@	libpcre32_la-pcre32_string_utils.lo \
-@WITH_PCRE32_TRUE@	libpcre32_la-pcre32_study.lo \
-@WITH_PCRE32_TRUE@	libpcre32_la-pcre32_tables.lo \
-@WITH_PCRE32_TRUE@	libpcre32_la-pcre32_ucd.lo \
-@WITH_PCRE32_TRUE@	libpcre32_la-pcre32_utf32_utils.lo \
-@WITH_PCRE32_TRUE@	libpcre32_la-pcre32_valid_utf32.lo \
-@WITH_PCRE32_TRUE@	libpcre32_la-pcre32_version.lo \
-@WITH_PCRE32_TRUE@	libpcre32_la-pcre32_xclass.lo
-@WITH_PCRE32_TRUE@nodist_libpcre32_la_OBJECTS =  \
-@WITH_PCRE32_TRUE@	libpcre32_la-pcre_chartables.lo
-libpcre32_la_OBJECTS = $(am_libpcre32_la_OBJECTS) \
-	$(nodist_libpcre32_la_OBJECTS)
-libpcre32_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(libpcre32_la_CFLAGS) \
-	$(CFLAGS) $(libpcre32_la_LDFLAGS) $(LDFLAGS) -o $@
-@WITH_PCRE32_TRUE@am_libpcre32_la_rpath = -rpath $(libdir)
-@WITH_PCRE_CPP_TRUE@libpcrecpp_la_DEPENDENCIES = libpcre.la
-am__libpcrecpp_la_SOURCES_DIST = pcrecpp_internal.h pcrecpp.cc \
-	pcre_scanner.cc pcre_stringpiece.cc
-@WITH_PCRE_CPP_TRUE@am_libpcrecpp_la_OBJECTS =  \
-@WITH_PCRE_CPP_TRUE@	libpcrecpp_la-pcrecpp.lo \
-@WITH_PCRE_CPP_TRUE@	libpcrecpp_la-pcre_scanner.lo \
-@WITH_PCRE_CPP_TRUE@	libpcrecpp_la-pcre_stringpiece.lo
-libpcrecpp_la_OBJECTS = $(am_libpcrecpp_la_OBJECTS)
-libpcrecpp_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
-	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
-	$(libpcrecpp_la_CXXFLAGS) $(CXXFLAGS) $(libpcrecpp_la_LDFLAGS) \
-	$(LDFLAGS) -o $@
-@WITH_PCRE_CPP_TRUE@am_libpcrecpp_la_rpath = -rpath $(libdir)
-@WITH_PCRE8_TRUE@libpcreposix_la_DEPENDENCIES = libpcre.la
-am__libpcreposix_la_SOURCES_DIST = pcreposix.c
-@WITH_PCRE8_TRUE@am_libpcreposix_la_OBJECTS =  \
-@WITH_PCRE8_TRUE@	libpcreposix_la-pcreposix.lo
-libpcreposix_la_OBJECTS = $(am_libpcreposix_la_OBJECTS)
-libpcreposix_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
-	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
-	$(libpcreposix_la_CFLAGS) $(CFLAGS) $(libpcreposix_la_LDFLAGS) \
-	$(LDFLAGS) -o $@
-@WITH_PCRE8_TRUE@am_libpcreposix_la_rpath = -rpath $(libdir)
-@WITH_PCRE8_TRUE@am__EXEEXT_1 = pcregrep$(EXEEXT)
-@WITH_REBUILD_CHARTABLES_TRUE@am__EXEEXT_2 = dftables$(EXEEXT)
-@WITH_JIT_TRUE@am__EXEEXT_3 = pcre_jit_test$(EXEEXT)
-@WITH_PCRE_CPP_TRUE@am__EXEEXT_4 = pcrecpp_unittest$(EXEEXT) \
-@WITH_PCRE_CPP_TRUE@	pcre_scanner_unittest$(EXEEXT) \
-@WITH_PCRE_CPP_TRUE@	pcre_stringpiece_unittest$(EXEEXT)
-PROGRAMS = $(bin_PROGRAMS) $(noinst_PROGRAMS)
-am__dftables_SOURCES_DIST = dftables.c
-@WITH_REBUILD_CHARTABLES_TRUE@am_dftables_OBJECTS =  \
-@WITH_REBUILD_CHARTABLES_TRUE@	dftables.$(OBJEXT)
-dftables_OBJECTS = $(am_dftables_OBJECTS)
-dftables_LDADD = $(LDADD)
-am__pcre_jit_test_SOURCES_DIST = pcre_jit_test.c
-@WITH_JIT_TRUE@am_pcre_jit_test_OBJECTS =  \
-@WITH_JIT_TRUE@	pcre_jit_test-pcre_jit_test.$(OBJEXT)
-pcre_jit_test_OBJECTS = $(am_pcre_jit_test_OBJECTS)
-am__DEPENDENCIES_1 =
-@WITH_GCOV_TRUE@@WITH_JIT_TRUE@am__DEPENDENCIES_2 =  \
-@WITH_GCOV_TRUE@@WITH_JIT_TRUE@	$(am__DEPENDENCIES_1)
-@WITH_JIT_TRUE@pcre_jit_test_DEPENDENCIES = $(am__append_15) \
-@WITH_JIT_TRUE@	$(am__append_16) $(am__append_17) \
-@WITH_JIT_TRUE@	$(am__DEPENDENCIES_2)
-pcre_jit_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(pcre_jit_test_CFLAGS) \
-	$(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
-am__pcre_scanner_unittest_SOURCES_DIST = pcre_scanner_unittest.cc
-@WITH_PCRE_CPP_TRUE@am_pcre_scanner_unittest_OBJECTS = pcre_scanner_unittest-pcre_scanner_unittest.$(OBJEXT)
-pcre_scanner_unittest_OBJECTS = $(am_pcre_scanner_unittest_OBJECTS)
-@WITH_GCOV_TRUE@@WITH_PCRE_CPP_TRUE@am__DEPENDENCIES_3 =  \
-@WITH_GCOV_TRUE@@WITH_PCRE_CPP_TRUE@	$(am__DEPENDENCIES_1)
-@WITH_PCRE_CPP_TRUE@pcre_scanner_unittest_DEPENDENCIES =  \
-@WITH_PCRE_CPP_TRUE@	libpcrecpp.la $(am__DEPENDENCIES_3)
-pcre_scanner_unittest_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
-	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
-	$(pcre_scanner_unittest_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
-	$(LDFLAGS) -o $@
-am__pcre_stringpiece_unittest_SOURCES_DIST =  \
-	pcre_stringpiece_unittest.cc
-@WITH_PCRE_CPP_TRUE@am_pcre_stringpiece_unittest_OBJECTS = pcre_stringpiece_unittest-pcre_stringpiece_unittest.$(OBJEXT)
-pcre_stringpiece_unittest_OBJECTS =  \
-	$(am_pcre_stringpiece_unittest_OBJECTS)
-@WITH_PCRE_CPP_TRUE@pcre_stringpiece_unittest_DEPENDENCIES =  \
-@WITH_PCRE_CPP_TRUE@	libpcrecpp.la $(am__DEPENDENCIES_3)
-pcre_stringpiece_unittest_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
-	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
-	$(pcre_stringpiece_unittest_CXXFLAGS) $(CXXFLAGS) \
-	$(AM_LDFLAGS) $(LDFLAGS) -o $@
-am__pcrecpp_unittest_SOURCES_DIST = pcrecpp_unittest.cc
-@WITH_PCRE_CPP_TRUE@am_pcrecpp_unittest_OBJECTS = pcrecpp_unittest-pcrecpp_unittest.$(OBJEXT)
-pcrecpp_unittest_OBJECTS = $(am_pcrecpp_unittest_OBJECTS)
-@WITH_PCRE_CPP_TRUE@pcrecpp_unittest_DEPENDENCIES = libpcrecpp.la \
-@WITH_PCRE_CPP_TRUE@	$(am__DEPENDENCIES_3)
-pcrecpp_unittest_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
-	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
-	$(pcrecpp_unittest_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
-	$(LDFLAGS) -o $@
-am__pcregrep_SOURCES_DIST = pcregrep.c
-@WITH_PCRE8_TRUE@am_pcregrep_OBJECTS = pcregrep-pcregrep.$(OBJEXT)
-pcregrep_OBJECTS = $(am_pcregrep_OBJECTS)
-@WITH_GCOV_TRUE@@WITH_PCRE8_TRUE@am__DEPENDENCIES_4 =  \
-@WITH_GCOV_TRUE@@WITH_PCRE8_TRUE@	$(am__DEPENDENCIES_1)
-@WITH_PCRE8_TRUE@pcregrep_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-@WITH_PCRE8_TRUE@	$(am__DEPENDENCIES_1) libpcre.la \
-@WITH_PCRE8_TRUE@	libpcreposix.la $(am__DEPENDENCIES_4)
-pcregrep_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(pcregrep_CFLAGS) \
-	$(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
-am__pcretest_SOURCES_DIST = pcretest.c pcre_printint.c \
-	pcre16_printint.c pcre32_printint.c
-@WITH_PCRE8_TRUE@am__objects_1 = pcretest-pcre_printint.$(OBJEXT)
-@WITH_PCRE16_TRUE@am__objects_2 = pcretest-pcre16_printint.$(OBJEXT)
-@WITH_PCRE32_TRUE@am__objects_3 = pcretest-pcre32_printint.$(OBJEXT)
-am_pcretest_OBJECTS = pcretest-pcretest.$(OBJEXT) $(am__objects_1) \
-	$(am__objects_2) $(am__objects_3)
-pcretest_OBJECTS = $(am_pcretest_OBJECTS)
-@WITH_GCOV_TRUE@am__DEPENDENCIES_5 = $(am__DEPENDENCIES_1)
-pcretest_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__append_30) \
-	$(am__append_32) $(am__append_34) $(am__DEPENDENCIES_5)
-pcretest_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(pcretest_CFLAGS) \
-	$(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
-am__dist_noinst_SCRIPTS_DIST = RunTest RunGrepTest
-SCRIPTS = $(bin_SCRIPTS) $(dist_noinst_SCRIPTS)
-AM_V_P = $(am__v_P_@AM_V@)
-am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
-am__v_P_0 = false
-am__v_P_1 = :
-AM_V_GEN = $(am__v_GEN_@AM_V@)
-am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
-am__v_GEN_0 = @echo "  GEN     " $@;
-am__v_GEN_1 =
-AM_V_at = $(am__v_at_@AM_V@)
-am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
-am__v_at_0 = @
-am__v_at_1 =
-DEFAULT_INCLUDES = -I.@am__isrc@
-depcomp = $(SHELL) $(top_srcdir)/depcomp
-am__depfiles_maybe = depfiles
-am__mv = mv -f
-COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
-	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
-	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
-	$(AM_CFLAGS) $(CFLAGS)
-AM_V_CC = $(am__v_CC_@AM_V@)
-am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
-am__v_CC_0 = @echo "  CC      " $@;
-am__v_CC_1 =
-CCLD = $(CC)
-LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
-	$(AM_LDFLAGS) $(LDFLAGS) -o $@
-AM_V_CCLD = $(am__v_CCLD_@AM_V@)
-am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
-am__v_CCLD_0 = @echo "  CCLD    " $@;
-am__v_CCLD_1 =
-CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
-	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
-	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
-	$(AM_CXXFLAGS) $(CXXFLAGS)
-AM_V_CXX = $(am__v_CXX_@AM_V@)
-am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)
-am__v_CXX_0 = @echo "  CXX     " $@;
-am__v_CXX_1 =
-CXXLD = $(CXX)
-CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
-	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
-AM_V_CXXLD = $(am__v_CXXLD_@AM_V@)
-am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
-am__v_CXXLD_0 = @echo "  CXXLD   " $@;
-am__v_CXXLD_1 =
-SOURCES = $(libpcre_la_SOURCES) $(nodist_libpcre_la_SOURCES) \
-	$(libpcre16_la_SOURCES) $(nodist_libpcre16_la_SOURCES) \
-	$(libpcre32_la_SOURCES) $(nodist_libpcre32_la_SOURCES) \
-	$(libpcrecpp_la_SOURCES) $(libpcreposix_la_SOURCES) \
-	$(dftables_SOURCES) $(pcre_jit_test_SOURCES) \
-	$(pcre_scanner_unittest_SOURCES) \
-	$(pcre_stringpiece_unittest_SOURCES) \
-	$(pcrecpp_unittest_SOURCES) $(pcregrep_SOURCES) \
-	$(pcretest_SOURCES)
-DIST_SOURCES = $(am__libpcre_la_SOURCES_DIST) \
-	$(am__libpcre16_la_SOURCES_DIST) \
-	$(am__libpcre32_la_SOURCES_DIST) \
-	$(am__libpcrecpp_la_SOURCES_DIST) \
-	$(am__libpcreposix_la_SOURCES_DIST) \
-	$(am__dftables_SOURCES_DIST) $(am__pcre_jit_test_SOURCES_DIST) \
-	$(am__pcre_scanner_unittest_SOURCES_DIST) \
-	$(am__pcre_stringpiece_unittest_SOURCES_DIST) \
-	$(am__pcrecpp_unittest_SOURCES_DIST) \
-	$(am__pcregrep_SOURCES_DIST) $(am__pcretest_SOURCES_DIST)
-am__can_run_installinfo = \
-  case $$AM_UPDATE_INFO_DIR in \
-    n|no|NO) false;; \
-    *) (install-info --version) >/dev/null 2>&1;; \
-  esac
-man1dir = $(mandir)/man1
-man3dir = $(mandir)/man3
-NROFF = nroff
-MANS = $(dist_man_MANS) $(man_MANS)
-DATA = $(dist_doc_DATA) $(dist_html_DATA) $(dist_noinst_DATA) \
-	$(html_DATA) $(pkgconfig_DATA)
-am__include_HEADERS_DIST = pcreposix.h pcrecpp.h pcre_scanner.h
-HEADERS = $(include_HEADERS) $(nodist_include_HEADERS)
-am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \
-	$(LISP)config.h.in
-# Read a list of newline-separated strings from the standard input,
-# and print each of them once, without duplicates.  Input order is
-# *not* preserved.
-am__uniquify_input = $(AWK) '\
-  BEGIN { nonempty = 0; } \
-  { items[$$0] = 1; nonempty = 1; } \
-  END { if (nonempty) { for (i in items) print i; }; } \
-'
-# Make sure the list of sources is unique.  This is necessary because,
-# e.g., the same source file might be shared among _SOURCES variables
-# for different programs/libraries.
-am__define_uniq_tagged_files = \
-  list='$(am__tagged_files)'; \
-  unique=`for i in $$list; do \
-    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-  done | $(am__uniquify_input)`
-ETAGS = etags
-CTAGS = ctags
-CSCOPE = cscope
-AM_RECURSIVE_TARGETS = cscope check recheck
-am__tty_colors_dummy = \
-  mgn= red= grn= lgn= blu= brg= std=; \
-  am__color_tests=no
-am__tty_colors = { \
-  $(am__tty_colors_dummy); \
-  if test "X$(AM_COLOR_TESTS)" = Xno; then \
-    am__color_tests=no; \
-  elif test "X$(AM_COLOR_TESTS)" = Xalways; then \
-    am__color_tests=yes; \
-  elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \
-    am__color_tests=yes; \
-  fi; \
-  if test $$am__color_tests = yes; then \
-    red=''; \
-    grn=''; \
-    lgn=''; \
-    blu=''; \
-    mgn=''; \
-    brg=''; \
-    std=''; \
-  fi; \
-}
-am__recheck_rx = ^[ 	]*:recheck:[ 	]*
-am__global_test_result_rx = ^[ 	]*:global-test-result:[ 	]*
-am__copy_in_global_log_rx = ^[ 	]*:copy-in-global-log:[ 	]*
-# A command that, given a newline-separated list of test names on the
-# standard input, print the name of the tests that are to be re-run
-# upon "make recheck".
-am__list_recheck_tests = $(AWK) '{ \
-  recheck = 1; \
-  while ((rc = (getline line < ($$0 ".trs"))) != 0) \
-    { \
-      if (rc < 0) \
-        { \
-          if ((getline line2 < ($$0 ".log")) < 0) \
-	    recheck = 0; \
-          break; \
-        } \
-      else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
-        { \
-          recheck = 0; \
-          break; \
-        } \
-      else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
-        { \
-          break; \
-        } \
-    }; \
-  if (recheck) \
-    print $$0; \
-  close ($$0 ".trs"); \
-  close ($$0 ".log"); \
-}'
-# A command that, given a newline-separated list of test names on the
-# standard input, create the global log from their .trs and .log files.
-am__create_global_log = $(AWK) ' \
-function fatal(msg) \
-{ \
-  print "fatal: making $@: " msg | "cat >&2"; \
-  exit 1; \
-} \
-function rst_section(header) \
-{ \
-  print header; \
-  len = length(header); \
-  for (i = 1; i <= len; i = i + 1) \
-    printf "="; \
-  printf "\n\n"; \
-} \
-{ \
-  copy_in_global_log = 1; \
-  global_test_result = "RUN"; \
-  while ((rc = (getline line < ($$0 ".trs"))) != 0) \
-    { \
-      if (rc < 0) \
-         fatal("failed to read from " $$0 ".trs"); \
-      if (line ~ /$(am__global_test_result_rx)/) \
-        { \
-          sub("$(am__global_test_result_rx)", "", line); \
-          sub("[ 	]*$$", "", line); \
-          global_test_result = line; \
-        } \
-      else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
-        copy_in_global_log = 0; \
-    }; \
-  if (copy_in_global_log) \
-    { \
-      rst_section(global_test_result ": " $$0); \
-      while ((rc = (getline line < ($$0 ".log"))) != 0) \
-      { \
-        if (rc < 0) \
-          fatal("failed to read from " $$0 ".log"); \
-        print line; \
-      }; \
-      printf "\n"; \
-    }; \
-  close ($$0 ".trs"); \
-  close ($$0 ".log"); \
-}'
-# Restructured Text title.
-am__rst_title = { sed 's/.*/   &   /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
-# Solaris 10 'make', and several other traditional 'make' implementations,
-# pass "-e" to $(SHELL), and POSIX 2008 even requires this.  Work around it
-# by disabling -e (using the XSI extension "set +e") if it's set.
-am__sh_e_setup = case $$- in *e*) set +e;; esac
-# Default flags passed to test drivers.
-am__common_driver_flags = \
-  --color-tests "$$am__color_tests" \
-  --enable-hard-errors "$$am__enable_hard_errors" \
-  --expect-failure "$$am__expect_failure"
-# To be inserted before the command running the test.  Creates the
-# directory for the log if needed.  Stores in $dir the directory
-# containing $f, in $tst the test, in $log the log.  Executes the
-# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
-# passes TESTS_ENVIRONMENT.  Set up options for the wrapper that
-# will run the test scripts (or their associated LOG_COMPILER, if
-# thy have one).
-am__check_pre = \
-$(am__sh_e_setup);					\
-$(am__vpath_adj_setup) $(am__vpath_adj)			\
-$(am__tty_colors);					\
-srcdir=$(srcdir); export srcdir;			\
-case "$@" in						\
-  */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;;	\
-    *) am__odir=.;; 					\
-esac;							\
-test "x$$am__odir" = x"." || test -d "$$am__odir" 	\
-  || $(MKDIR_P) "$$am__odir" || exit $$?;		\
-if test -f "./$$f"; then dir=./;			\
-elif test -f "$$f"; then dir=;				\
-else dir="$(srcdir)/"; fi;				\
-tst=$$dir$$f; log='$@'; 				\
-if test -n '$(DISABLE_HARD_ERRORS)'; then		\
-  am__enable_hard_errors=no; 				\
-else							\
-  am__enable_hard_errors=yes; 				\
-fi; 							\
-case " $(XFAIL_TESTS) " in				\
-  *[\ \	]$$f[\ \	]* | *[\ \	]$$dir$$f[\ \	]*) \
-    am__expect_failure=yes;;				\
-  *)							\
-    am__expect_failure=no;;				\
-esac; 							\
-$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
-# A shell command to get the names of the tests scripts with any registered
-# extension removed (i.e., equivalently, the names of the test logs, with
-# the '.log' extension removed).  The result is saved in the shell variable
-# '$bases'.  This honors runtime overriding of TESTS and TEST_LOGS.  Sadly,
-# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
-# since that might cause problem with VPATH rewrites for suffix-less tests.
-# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
-am__set_TESTS_bases = \
-  bases='$(TEST_LOGS)'; \
-  bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
-  bases=`echo $$bases`
-RECHECK_LOGS = $(TEST_LOGS)
-TEST_SUITE_LOG = test-suite.log
-TEST_EXTENSIONS = @EXEEXT@ .test
-LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
-LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS)
-am__set_b = \
-  case '$@' in \
-    */*) \
-      case '$*' in \
-        */*) b='$*';; \
-          *) b=`echo '$@' | sed 's/\.log$$//'`; \
-       esac;; \
-    *) \
-      b='$*';; \
-  esac
-am__test_logs1 = $(TESTS:=.log)
-am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log)
-TEST_LOGS = $(am__test_logs2:.test.log=.log)
-TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
-TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \
-	$(TEST_LOG_FLAGS)
-am__DIST_COMMON = $(dist_man_MANS) $(srcdir)/Makefile.in \
-	$(srcdir)/config.h.in $(srcdir)/libpcre.pc.in \
-	$(srcdir)/libpcre16.pc.in $(srcdir)/libpcre32.pc.in \
-	$(srcdir)/libpcrecpp.pc.in $(srcdir)/libpcreposix.pc.in \
-	$(srcdir)/pcre-config.in $(srcdir)/pcre.h.in \
-	$(srcdir)/pcre_stringpiece.h.in $(srcdir)/pcrecpparg.h.in \
-	AUTHORS COPYING ChangeLog INSTALL NEWS README ar-lib compile \
-	config.guess config.sub depcomp install-sh ltmain.sh missing \
-	test-driver
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-distdir = $(PACKAGE)-$(VERSION)
-top_distdir = $(distdir)
-am__remove_distdir = \
-  if test -d "$(distdir)"; then \
-    find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \
-      && rm -rf "$(distdir)" \
-      || { sleep 5 && rm -rf "$(distdir)"; }; \
-  else :; fi
-am__post_remove_distdir = $(am__remove_distdir)
-DIST_ARCHIVES = $(distdir).tar.gz $(distdir).tar.bz2 $(distdir).zip
-GZIP_ENV = --best
-DIST_TARGETS = dist-bzip2 dist-gzip dist-zip
-distuninstallcheck_listfiles = find . -type f -print
-am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \
-  | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$'
-distcleancheck_listfiles = find . -type f -print
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
-AR = @AR@
-AS = @AS@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-CC = @CC@
-CCDEPMODE = @CCDEPMODE@
-CFLAGS = @CFLAGS@
-CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXDEPMODE = @CXXDEPMODE@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DEFS = @DEFS@
-DEPDIR = @DEPDIR@
-DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@
-DLLTOOL = @DLLTOOL@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-EXTRA_LIBPCRE16_LDFLAGS = @EXTRA_LIBPCRE16_LDFLAGS@
-EXTRA_LIBPCRE32_LDFLAGS = @EXTRA_LIBPCRE32_LDFLAGS@
-EXTRA_LIBPCRECPP_LDFLAGS = @EXTRA_LIBPCRECPP_LDFLAGS@
-EXTRA_LIBPCREPOSIX_LDFLAGS = @EXTRA_LIBPCREPOSIX_LDFLAGS@
-EXTRA_LIBPCRE_LDFLAGS = @EXTRA_LIBPCRE_LDFLAGS@
-FGREP = @FGREP@
-GCOV_CFLAGS = @GCOV_CFLAGS@
-GCOV_CXXFLAGS = @GCOV_CXXFLAGS@
-GCOV_LIBS = @GCOV_LIBS@
-GENHTML = @GENHTML@
-GREP = @GREP@
-HAVE_VISIBILITY = @HAVE_VISIBILITY@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LCOV = @LCOV@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBBZ2 = @LIBBZ2@
-LIBOBJS = @LIBOBJS@
-LIBREADLINE = @LIBREADLINE@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIBZ = @LIBZ@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MKDIR_P = @MKDIR_P@
-NM = @NM@
-NMEDIT = @NMEDIT@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PCRE_DATE = @PCRE_DATE@
-PCRE_MAJOR = @PCRE_MAJOR@
-PCRE_MINOR = @PCRE_MINOR@
-PCRE_PRERELEASE = @PCRE_PRERELEASE@
-PCRE_STATIC_CFLAG = @PCRE_STATIC_CFLAG@
-PKG_CONFIG = @PKG_CONFIG@
-PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
-PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
-PTHREAD_CC = @PTHREAD_CC@
-PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
-PTHREAD_LIBS = @PTHREAD_LIBS@
-RANLIB = @RANLIB@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-SHTOOL = @SHTOOL@
-STRIP = @STRIP@
-VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
-VALGRIND_LIBS = @VALGRIND_LIBS@
-VERSION = @VERSION@
-VISIBILITY_CFLAGS = @VISIBILITY_CFLAGS@
-VISIBILITY_CXXFLAGS = @VISIBILITY_CXXFLAGS@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__include = @am__include@
-am__leading_dot = @am__leading_dot@
-am__quote = @am__quote@
-am__tar = @am__tar@
-am__untar = @am__untar@
-ax_pthread_config = @ax_pthread_config@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-enable_cpp = @enable_cpp@
-enable_pcre16 = @enable_pcre16@
-enable_pcre32 = @enable_pcre32@
-enable_pcre8 = @enable_pcre8@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pcre_have_bits_type_traits = @pcre_have_bits_type_traits@
-pcre_have_long_long = @pcre_have_long_long@
-pcre_have_type_traits = @pcre_have_type_traits@
-pcre_have_ulong_long = @pcre_have_ulong_long@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-ACLOCAL_AMFLAGS = -I m4
-dist_doc_DATA = \
-  doc/pcre.txt \
-  doc/pcre-config.txt \
-  doc/pcregrep.txt \
-  doc/pcretest.txt \
-  AUTHORS \
-  COPYING \
-  ChangeLog \
-  LICENCE \
-  NEWS \
-  README
-
-
-# Note that pcrecpp.html is not in this list; it is listed separately below.
-dist_html_DATA = \
-  doc/html/NON-AUTOTOOLS-BUILD.txt \
-  doc/html/README.txt \
-  doc/html/index.html \
-  doc/html/pcre-config.html \
-  doc/html/pcre.html \
-  doc/html/pcre16.html \
-  doc/html/pcre32.html \
-  doc/html/pcre_assign_jit_stack.html \
-  doc/html/pcre_compile.html \
-  doc/html/pcre_compile2.html \
-  doc/html/pcre_config.html \
-  doc/html/pcre_copy_named_substring.html \
-  doc/html/pcre_copy_substring.html \
-  doc/html/pcre_dfa_exec.html \
-  doc/html/pcre_exec.html \
-  doc/html/pcre_free_study.html \
-  doc/html/pcre_free_substring.html \
-  doc/html/pcre_free_substring_list.html \
-  doc/html/pcre_fullinfo.html \
-  doc/html/pcre_get_named_substring.html \
-  doc/html/pcre_get_stringnumber.html \
-  doc/html/pcre_get_stringtable_entries.html \
-  doc/html/pcre_get_substring.html \
-  doc/html/pcre_get_substring_list.html \
-  doc/html/pcre_jit_exec.html \
-  doc/html/pcre_jit_stack_alloc.html \
-  doc/html/pcre_jit_stack_free.html \
-  doc/html/pcre_maketables.html \
-  doc/html/pcre_pattern_to_host_byte_order.html \
-  doc/html/pcre_refcount.html \
-  doc/html/pcre_study.html \
-  doc/html/pcre_utf16_to_host_byte_order.html \
-  doc/html/pcre_utf32_to_host_byte_order.html \
-  doc/html/pcre_version.html \
-  doc/html/pcreapi.html \
-  doc/html/pcrebuild.html \
-  doc/html/pcrecallout.html \
-  doc/html/pcrecompat.html \
-  doc/html/pcredemo.html \
-  doc/html/pcregrep.html \
-  doc/html/pcrejit.html \
-  doc/html/pcrelimits.html \
-  doc/html/pcrematching.html \
-  doc/html/pcrepartial.html \
-  doc/html/pcrepattern.html \
-  doc/html/pcreperform.html \
-  doc/html/pcreposix.html \
-  doc/html/pcreprecompile.html \
-  doc/html/pcresample.html \
-  doc/html/pcrestack.html \
-  doc/html/pcresyntax.html \
-  doc/html/pcretest.html \
-  doc/html/pcreunicode.html
-
-pcrecpp_html = doc/html/pcrecpp.html
-dist_noinst_DATA = $(pcrecpp_html)
-@WITH_PCRE_CPP_TRUE@html_DATA = $(pcrecpp_html)
-
-# The Libtool libraries to install.  We'll add to this later.
-lib_LTLIBRARIES = $(am__append_4) $(am__append_5) $(am__append_6) \
-	$(am__append_20) $(am__append_22)
-check_SCRIPTS =
-dist_noinst_SCRIPTS = RunTest $(am__append_39)
-
-# Additional files to delete on 'make clean' and 'make maintainer-clean'.
-CLEANFILES = pcre_chartables.c testsavedregex teststderr testtemp* \
-	testtry testNinput testtrygrep teststderrgrep testNinputgrep
-MAINTAINERCLEANFILES = pcre.h.generic config.h.generic
-
-# Additional files to bundle with the distribution, over and above what
-# the Autotools include by default.
-
-# These files contain additional m4 macros that are used by autoconf.
-
-# These files contain maintenance information
-
-# These files are used in the preparation of a release
-
-# These files are to do with building for Virtual Pascal
-
-# These files are usable versions of pcre.h and config.h that are distributed
-# for the benefit of people who are building PCRE manually, without the
-# Autotools support.
-
-# The pcre_chartables.c.dist file is the default version of pcre_chartables.c,
-# used unless --enable-rebuild-chartables is specified.
-
-# The JIT compiler lives in a separate directory, but its files are #included
-# when pcre_jit_compile.c is processed, so they must be distributed.
-
-# PCRE demonstration program. No longer built automatcally. The point is that
-# the users should build it themselves. So just distribute the source.
-# noinst_PROGRAMS += pcredemo
-# pcredemo_SOURCES = pcredemo.c
-# pcredemo_LDADD = libpcre.la
-EXTRA_DIST = m4/ax_pthread.m4 m4/pcre_visibility.m4 doc/perltest.txt \
-	NON-UNIX-USE NON-AUTOTOOLS-BUILD HACKING PrepareRelease \
-	CheckMan CleanTxt Detrail 132html doc/index.html.src \
-	makevp.bat makevp_c.txt makevp_l.txt pcregexp.pas \
-	pcre.h.generic config.h.generic pcre_chartables.c.dist \
-	sljit/sljitConfig.h sljit/sljitConfigInternal.h \
-	sljit/sljitExecAllocator.c sljit/sljitLir.c sljit/sljitLir.h \
-	sljit/sljitNativeARM_32.c sljit/sljitNativeARM_64.c \
-	sljit/sljitNativeARM_T2_32.c sljit/sljitNativeMIPS_32.c \
-	sljit/sljitNativeMIPS_64.c sljit/sljitNativeMIPS_common.c \
-	sljit/sljitNativePPC_32.c sljit/sljitNativePPC_64.c \
-	sljit/sljitNativePPC_common.c sljit/sljitNativeSPARC_32.c \
-	sljit/sljitNativeSPARC_common.c sljit/sljitNativeTILEGX_64.c \
-	sljit/sljitNativeTILEGX-encoder.c sljit/sljitNativeX86_32.c \
-	sljit/sljitNativeX86_64.c sljit/sljitNativeX86_common.c \
-	sljit/sljitUtils.c RunTest.bat testdata/grepbinary \
-	testdata/grepfilelist testdata/grepinput testdata/grepinput3 \
-	testdata/grepinput8 testdata/grepinputv testdata/grepinputx \
-	testdata/greplist testdata/grepoutput testdata/grepoutput8 \
-	testdata/grepoutputN testdata/greppatN4 testdata/saved16 \
-	testdata/saved16BE-1 testdata/saved16BE-2 testdata/saved16LE-1 \
-	testdata/saved16LE-2 testdata/saved32 testdata/saved32BE-1 \
-	testdata/saved32BE-2 testdata/saved32LE-1 testdata/saved32LE-2 \
-	testdata/saved8 testdata/testinput1 testdata/testinput2 \
-	testdata/testinput3 testdata/testinput4 testdata/testinput5 \
-	testdata/testinput6 testdata/testinput7 testdata/testinput8 \
-	testdata/testinput9 testdata/testinput10 testdata/testinput11 \
-	testdata/testinput12 testdata/testinput13 testdata/testinput14 \
-	testdata/testinput15 testdata/testinput16 testdata/testinput17 \
-	testdata/testinput18 testdata/testinput19 testdata/testinput20 \
-	testdata/testinput21 testdata/testinput22 testdata/testinput23 \
-	testdata/testinput24 testdata/testinput25 testdata/testinput26 \
-	testdata/testinputEBC testdata/testoutput1 \
-	testdata/testoutput2 testdata/testoutput3 \
-	testdata/testoutput3A testdata/testoutput3B \
-	testdata/testoutput4 testdata/testoutput5 testdata/testoutput6 \
-	testdata/testoutput7 testdata/testoutput8 testdata/testoutput9 \
-	testdata/testoutput10 testdata/testoutput11-8 \
-	testdata/testoutput11-16 testdata/testoutput11-32 \
-	testdata/testoutput12 testdata/testoutput13 \
-	testdata/testoutput14 testdata/testoutput15 \
-	testdata/testoutput16 testdata/testoutput17 \
-	testdata/testoutput18-16 testdata/testoutput18-32 \
-	testdata/testoutput19 testdata/testoutput20 \
-	testdata/testoutput21-16 testdata/testoutput21-32 \
-	testdata/testoutput22-16 testdata/testoutput22-32 \
-	testdata/testoutput23 testdata/testoutput24 \
-	testdata/testoutput25 testdata/testoutput26 \
-	testdata/testoutputEBC testdata/wintestinput3 \
-	testdata/wintestoutput3 perltest.pl pcredemo.c $(pcrecpp_man) \
-	cmake/COPYING-CMAKE-SCRIPTS \
-	cmake/FindPackageHandleStandardArgs.cmake \
-	cmake/FindReadline.cmake cmake/FindEditline.cmake \
-	CMakeLists.txt config-cmake.h.in
-
-# These are the header files we'll install. We do not distribute pcre.h because
-# it is generated from pcre.h.in.
-nodist_include_HEADERS = pcre.h $(am__append_1)
-include_HEADERS = pcreposix.h $(am__append_2)
-bin_SCRIPTS = pcre-config
-@WITH_REBUILD_CHARTABLES_TRUE@dftables_SOURCES = dftables.c
-BUILT_SOURCES = pcre_chartables.c
-@WITH_PCRE8_TRUE@libpcre_la_SOURCES = \
-@WITH_PCRE8_TRUE@  pcre_byte_order.c \
-@WITH_PCRE8_TRUE@  pcre_compile.c \
-@WITH_PCRE8_TRUE@  pcre_config.c \
-@WITH_PCRE8_TRUE@  pcre_dfa_exec.c \
-@WITH_PCRE8_TRUE@  pcre_exec.c \
-@WITH_PCRE8_TRUE@  pcre_fullinfo.c \
-@WITH_PCRE8_TRUE@  pcre_get.c \
-@WITH_PCRE8_TRUE@  pcre_globals.c \
-@WITH_PCRE8_TRUE@  pcre_internal.h \
-@WITH_PCRE8_TRUE@  pcre_jit_compile.c \
-@WITH_PCRE8_TRUE@  pcre_maketables.c \
-@WITH_PCRE8_TRUE@  pcre_newline.c \
-@WITH_PCRE8_TRUE@  pcre_ord2utf8.c \
-@WITH_PCRE8_TRUE@  pcre_refcount.c \
-@WITH_PCRE8_TRUE@  pcre_string_utils.c \
-@WITH_PCRE8_TRUE@  pcre_study.c \
-@WITH_PCRE8_TRUE@  pcre_tables.c \
-@WITH_PCRE8_TRUE@  pcre_ucd.c \
-@WITH_PCRE8_TRUE@  pcre_valid_utf8.c \
-@WITH_PCRE8_TRUE@  pcre_version.c \
-@WITH_PCRE8_TRUE@  pcre_xclass.c \
-@WITH_PCRE8_TRUE@  ucp.h
-
-@WITH_PCRE8_TRUE@libpcre_la_CFLAGS = $(VISIBILITY_CFLAGS) $(AM_CFLAGS) \
-@WITH_PCRE8_TRUE@	$(am__append_7) $(am__append_10)
-@WITH_PCRE8_TRUE@libpcre_la_LIBADD =
-@WITH_PCRE8_TRUE@nodist_libpcre_la_SOURCES = \
-@WITH_PCRE8_TRUE@  pcre_chartables.c
-
-@WITH_PCRE16_TRUE@libpcre16_la_SOURCES = \
-@WITH_PCRE16_TRUE@  pcre16_byte_order.c \
-@WITH_PCRE16_TRUE@  pcre16_chartables.c \
-@WITH_PCRE16_TRUE@  pcre16_compile.c \
-@WITH_PCRE16_TRUE@  pcre16_config.c \
-@WITH_PCRE16_TRUE@  pcre16_dfa_exec.c \
-@WITH_PCRE16_TRUE@  pcre16_exec.c \
-@WITH_PCRE16_TRUE@  pcre16_fullinfo.c \
-@WITH_PCRE16_TRUE@  pcre16_get.c \
-@WITH_PCRE16_TRUE@  pcre16_globals.c \
-@WITH_PCRE16_TRUE@  pcre16_jit_compile.c \
-@WITH_PCRE16_TRUE@  pcre16_maketables.c \
-@WITH_PCRE16_TRUE@  pcre16_newline.c \
-@WITH_PCRE16_TRUE@  pcre16_ord2utf16.c \
-@WITH_PCRE16_TRUE@  pcre16_refcount.c \
-@WITH_PCRE16_TRUE@  pcre16_string_utils.c \
-@WITH_PCRE16_TRUE@  pcre16_study.c \
-@WITH_PCRE16_TRUE@  pcre16_tables.c \
-@WITH_PCRE16_TRUE@  pcre16_ucd.c \
-@WITH_PCRE16_TRUE@  pcre16_utf16_utils.c \
-@WITH_PCRE16_TRUE@  pcre16_valid_utf16.c \
-@WITH_PCRE16_TRUE@  pcre16_version.c \
-@WITH_PCRE16_TRUE@  pcre16_xclass.c
-
-@WITH_PCRE16_TRUE@libpcre16_la_CFLAGS = $(VISIBILITY_CFLAGS) \
-@WITH_PCRE16_TRUE@	$(AM_CFLAGS) $(am__append_8) \
-@WITH_PCRE16_TRUE@	$(am__append_11)
-@WITH_PCRE16_TRUE@libpcre16_la_LIBADD =
-@WITH_PCRE16_TRUE@nodist_libpcre16_la_SOURCES = \
-@WITH_PCRE16_TRUE@  pcre_chartables.c
-
-@WITH_PCRE32_TRUE@libpcre32_la_SOURCES = \
-@WITH_PCRE32_TRUE@  pcre32_byte_order.c \
-@WITH_PCRE32_TRUE@  pcre32_chartables.c \
-@WITH_PCRE32_TRUE@  pcre32_compile.c \
-@WITH_PCRE32_TRUE@  pcre32_config.c \
-@WITH_PCRE32_TRUE@  pcre32_dfa_exec.c \
-@WITH_PCRE32_TRUE@  pcre32_exec.c \
-@WITH_PCRE32_TRUE@  pcre32_fullinfo.c \
-@WITH_PCRE32_TRUE@  pcre32_get.c \
-@WITH_PCRE32_TRUE@  pcre32_globals.c \
-@WITH_PCRE32_TRUE@  pcre32_jit_compile.c \
-@WITH_PCRE32_TRUE@  pcre32_maketables.c \
-@WITH_PCRE32_TRUE@  pcre32_newline.c \
-@WITH_PCRE32_TRUE@  pcre32_ord2utf32.c \
-@WITH_PCRE32_TRUE@  pcre32_refcount.c \
-@WITH_PCRE32_TRUE@  pcre32_string_utils.c \
-@WITH_PCRE32_TRUE@  pcre32_study.c \
-@WITH_PCRE32_TRUE@  pcre32_tables.c \
-@WITH_PCRE32_TRUE@  pcre32_ucd.c \
-@WITH_PCRE32_TRUE@  pcre32_utf32_utils.c \
-@WITH_PCRE32_TRUE@  pcre32_valid_utf32.c \
-@WITH_PCRE32_TRUE@  pcre32_version.c \
-@WITH_PCRE32_TRUE@  pcre32_xclass.c
-
-@WITH_PCRE32_TRUE@libpcre32_la_CFLAGS = $(VISIBILITY_CFLAGS) \
-@WITH_PCRE32_TRUE@	$(AM_CFLAGS) $(am__append_9) \
-@WITH_PCRE32_TRUE@	$(am__append_12)
-@WITH_PCRE32_TRUE@libpcre32_la_LIBADD =
-@WITH_PCRE32_TRUE@nodist_libpcre32_la_SOURCES = \
-@WITH_PCRE32_TRUE@  pcre_chartables.c
-
-@WITH_PCRE8_TRUE@libpcre_la_LDFLAGS = $(EXTRA_LIBPCRE_LDFLAGS)
-@WITH_PCRE16_TRUE@libpcre16_la_LDFLAGS = $(EXTRA_LIBPCRE16_LDFLAGS)
-@WITH_PCRE32_TRUE@libpcre32_la_LDFLAGS = $(EXTRA_LIBPCRE32_LDFLAGS)
-@WITH_JIT_TRUE@pcre_jit_test_SOURCES = pcre_jit_test.c
-@WITH_JIT_TRUE@pcre_jit_test_CFLAGS = $(AM_CFLAGS) $(am__append_18)
-@WITH_JIT_TRUE@pcre_jit_test_LDADD = $(am__append_15) $(am__append_16) \
-@WITH_JIT_TRUE@	$(am__append_17) $(am__append_19)
-@WITH_PCRE8_TRUE@libpcreposix_la_SOURCES = \
-@WITH_PCRE8_TRUE@  pcreposix.c
-
-@WITH_PCRE8_TRUE@libpcreposix_la_CFLAGS = $(VISIBILITY_CFLAGS) \
-@WITH_PCRE8_TRUE@	$(AM_CFLAGS) $(am__append_21)
-@WITH_PCRE8_TRUE@libpcreposix_la_LDFLAGS = $(EXTRA_LIBPCREPOSIX_LDFLAGS)
-@WITH_PCRE8_TRUE@libpcreposix_la_LIBADD = libpcre.la
-@WITH_PCRE_CPP_TRUE@libpcrecpp_la_SOURCES = \
-@WITH_PCRE_CPP_TRUE@  pcrecpp_internal.h \
-@WITH_PCRE_CPP_TRUE@  pcrecpp.cc \
-@WITH_PCRE_CPP_TRUE@  pcre_scanner.cc \
-@WITH_PCRE_CPP_TRUE@  pcre_stringpiece.cc
-
-@WITH_PCRE_CPP_TRUE@libpcrecpp_la_CXXFLAGS = $(VISIBILITY_CXXFLAGS) \
-@WITH_PCRE_CPP_TRUE@	$(AM_CXXFLAGS) $(am__append_25)
-@WITH_PCRE_CPP_TRUE@libpcrecpp_la_LDFLAGS = $(EXTRA_LIBPCRECPP_LDFLAGS)
-@WITH_PCRE_CPP_TRUE@libpcrecpp_la_LIBADD = libpcre.la
-@WITH_PCRE_CPP_TRUE@pcrecpp_unittest_SOURCES = pcrecpp_unittest.cc
-@WITH_PCRE_CPP_TRUE@pcrecpp_unittest_CXXFLAGS = $(AM_CXXFLAGS)
-@WITH_PCRE_CPP_TRUE@pcrecpp_unittest_LDADD = libpcrecpp.la \
-@WITH_PCRE_CPP_TRUE@	$(am__append_26)
-@WITH_PCRE_CPP_TRUE@pcre_scanner_unittest_SOURCES = pcre_scanner_unittest.cc
-@WITH_PCRE_CPP_TRUE@pcre_scanner_unittest_CXXFLAGS = $(AM_CXXFLAGS)
-@WITH_PCRE_CPP_TRUE@pcre_scanner_unittest_LDADD = libpcrecpp.la \
-@WITH_PCRE_CPP_TRUE@	$(am__append_27)
-@WITH_PCRE_CPP_TRUE@pcre_stringpiece_unittest_SOURCES = pcre_stringpiece_unittest.cc
-@WITH_PCRE_CPP_TRUE@pcre_stringpiece_unittest_CXXFLAGS = $(AM_CXXFLAGS)
-@WITH_PCRE_CPP_TRUE@pcre_stringpiece_unittest_LDADD = libpcrecpp.la \
-@WITH_PCRE_CPP_TRUE@	$(am__append_28)
-pcretest_SOURCES = pcretest.c $(am__append_29) $(am__append_31) \
-	$(am__append_33)
-pcretest_CFLAGS = $(AM_CFLAGS) $(am__append_35) $(am__append_36)
-pcretest_LDADD = $(LIBREADLINE) $(am__append_30) $(am__append_32) \
-	$(am__append_34) $(am__append_37)
-@WITH_PCRE8_TRUE@pcregrep_SOURCES = pcregrep.c
-@WITH_PCRE8_TRUE@pcregrep_CFLAGS = $(AM_CFLAGS) $(am__append_41)
-@WITH_PCRE8_TRUE@pcregrep_LDADD = $(LIBZ) $(LIBBZ2) libpcre.la \
-@WITH_PCRE8_TRUE@	libpcreposix.la $(am__append_42)
-
-# A PCRE user submitted the following addition, saying that it "will allow
-# anyone using the 'mingw32' compiler to simply type 'make pcre.dll' and get a
-# nice DLL for Windows use". (It is used by the pcre.dll target.)
-DLL_OBJS = pcre_byte_order.o pcre_compile.o pcre_config.o \
-	pcre_dfa_exec.o pcre_exec.o pcre_fullinfo.o pcre_get.o \
-	pcre_globals.o pcre_jit_compile.o pcre_maketables.o \
-	pcre_newline.o pcre_ord2utf8.o pcre_refcount.o \
-	pcre_study.o pcre_tables.o pcre_ucd.o \
-	pcre_valid_utf8.o pcre_version.o pcre_chartables.o \
-	pcre_xclass.o
-
-
-# We have .pc files for pkg-config users.
-pkgconfigdir = $(libdir)/pkgconfig
-pkgconfig_DATA = libpcre.pc libpcreposix.pc $(am__append_43) \
-	$(am__append_44) $(am__append_45)
-
-# Note that pcrecpp.3 is not in this list, but is included separately below.
-dist_man_MANS = \
-  doc/pcre-config.1 \
-  doc/pcre.3 \
-  doc/pcre16.3 \
-  doc/pcre32.3 \
-  doc/pcre_assign_jit_stack.3 \
-  doc/pcre_compile.3 \
-  doc/pcre_compile2.3 \
-  doc/pcre_config.3 \
-  doc/pcre_copy_named_substring.3 \
-  doc/pcre_copy_substring.3 \
-  doc/pcre_dfa_exec.3 \
-  doc/pcre_exec.3 \
-  doc/pcre_free_study.3 \
-  doc/pcre_free_substring.3 \
-  doc/pcre_free_substring_list.3 \
-  doc/pcre_fullinfo.3 \
-  doc/pcre_get_named_substring.3 \
-  doc/pcre_get_stringnumber.3 \
-  doc/pcre_get_stringtable_entries.3 \
-  doc/pcre_get_substring.3 \
-  doc/pcre_get_substring_list.3 \
-  doc/pcre_jit_exec.3 \
-  doc/pcre_jit_stack_alloc.3 \
-  doc/pcre_jit_stack_free.3 \
-  doc/pcre_maketables.3 \
-  doc/pcre_pattern_to_host_byte_order.3 \
-  doc/pcre_refcount.3 \
-  doc/pcre_study.3 \
-  doc/pcre_utf16_to_host_byte_order.3 \
-  doc/pcre_utf32_to_host_byte_order.3 \
-  doc/pcre_version.3 \
-  doc/pcreapi.3 \
-  doc/pcrebuild.3 \
-  doc/pcrecallout.3 \
-  doc/pcrecompat.3 \
-  doc/pcredemo.3 \
-  doc/pcregrep.1 \
-  doc/pcrejit.3 \
-  doc/pcrelimits.3 \
-  doc/pcrematching.3 \
-  doc/pcrepartial.3 \
-  doc/pcrepattern.3 \
-  doc/pcreperform.3 \
-  doc/pcreposix.3 \
-  doc/pcreprecompile.3 \
-  doc/pcresample.3 \
-  doc/pcrestack.3 \
-  doc/pcresyntax.3 \
-  doc/pcretest.1 \
-  doc/pcreunicode.3
-
-pcrecpp_man = doc/pcrecpp.3
-@WITH_PCRE_CPP_TRUE@man_MANS = $(pcrecpp_man)
-
-# gcov/lcov code coverage reporting
-
-# Coverage reporting targets:
-#
-# coverage: Create a coverage report from 'make check'
-# coverage-baseline: Capture baseline coverage information
-# coverage-reset: This zeros the coverage counters only
-# coverage-report: This creates the coverage report only
-# coverage-clean-report: This removes the generated coverage report
-#   without cleaning the coverage data itself
-# coverage-clean-data: This removes the captured coverage data without
-#   removing the coverage files created at compile time (*.gcno)
-# coverage-clean: This cleans all coverage data including the generated
-#   coverage report.
-@WITH_GCOV_TRUE@COVERAGE_TEST_NAME = $(PACKAGE)
-@WITH_GCOV_TRUE@COVERAGE_NAME = $(PACKAGE)-$(VERSION)
-@WITH_GCOV_TRUE@COVERAGE_OUTPUT_FILE = $(COVERAGE_NAME)-coverage.info
-@WITH_GCOV_TRUE@COVERAGE_OUTPUT_DIR = $(COVERAGE_NAME)-coverage
-@WITH_GCOV_TRUE@COVERAGE_LCOV_EXTRA_FLAGS =
-@WITH_GCOV_TRUE@COVERAGE_GENHTML_EXTRA_FLAGS =
-@WITH_GCOV_TRUE@coverage_quiet = $(coverage_quiet_$(V))
-@WITH_GCOV_TRUE@coverage_quiet_ = $(coverage_quiet_$(AM_DEFAULT_VERBOSITY))
-@WITH_GCOV_TRUE@coverage_quiet_0 = --quiet
-all: $(BUILT_SOURCES) config.h
-	$(MAKE) $(AM_MAKEFLAGS) all-am
-
-.SUFFIXES:
-.SUFFIXES: .c .cc .lo .log .o .obj .test .test$(EXEEXT) .trs
-am--refresh: Makefile
-	@:
-$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \
-	      $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \
-		&& exit 0; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    echo ' $(SHELL) ./config.status'; \
-	    $(SHELL) ./config.status;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	$(SHELL) ./config.status --recheck
-
-$(top_srcdir)/configure:  $(am__configure_deps)
-	$(am__cd) $(srcdir) && $(AUTOCONF)
-$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
-	$(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
-$(am__aclocal_m4_deps):
-
-config.h: stamp-h1
-	@test -f $@ || rm -f stamp-h1
-	@test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1
-
-stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status
-	@rm -f stamp-h1
-	cd $(top_builddir) && $(SHELL) ./config.status config.h
-$(srcdir)/config.h.in:  $(am__configure_deps)
-	($(am__cd) $(top_srcdir) && $(AUTOHEADER))
-	rm -f stamp-h1
-	touch $@
-
-distclean-hdr:
-	-rm -f config.h stamp-h1
-libpcre.pc: $(top_builddir)/config.status $(srcdir)/libpcre.pc.in
-	cd $(top_builddir) && $(SHELL) ./config.status $@
-libpcre16.pc: $(top_builddir)/config.status $(srcdir)/libpcre16.pc.in
-	cd $(top_builddir) && $(SHELL) ./config.status $@
-libpcre32.pc: $(top_builddir)/config.status $(srcdir)/libpcre32.pc.in
-	cd $(top_builddir) && $(SHELL) ./config.status $@
-libpcreposix.pc: $(top_builddir)/config.status $(srcdir)/libpcreposix.pc.in
-	cd $(top_builddir) && $(SHELL) ./config.status $@
-libpcrecpp.pc: $(top_builddir)/config.status $(srcdir)/libpcrecpp.pc.in
-	cd $(top_builddir) && $(SHELL) ./config.status $@
-pcre-config: $(top_builddir)/config.status $(srcdir)/pcre-config.in
-	cd $(top_builddir) && $(SHELL) ./config.status $@
-pcre.h: $(top_builddir)/config.status $(srcdir)/pcre.h.in
-	cd $(top_builddir) && $(SHELL) ./config.status $@
-pcre_stringpiece.h: $(top_builddir)/config.status $(srcdir)/pcre_stringpiece.h.in
-	cd $(top_builddir) && $(SHELL) ./config.status $@
-pcrecpparg.h: $(top_builddir)/config.status $(srcdir)/pcrecpparg.h.in
-	cd $(top_builddir) && $(SHELL) ./config.status $@
-
-install-libLTLIBRARIES: $(lib_LTLIBRARIES)
-	@$(NORMAL_INSTALL)
-	@list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
-	list2=; for p in $$list; do \
-	  if test -f $$p; then \
-	    list2="$$list2 $$p"; \
-	  else :; fi; \
-	done; \
-	test -z "$$list2" || { \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \
-	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \
-	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
-	}
-
-uninstall-libLTLIBRARIES:
-	@$(NORMAL_UNINSTALL)
-	@list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
-	for p in $$list; do \
-	  $(am__strip_dir) \
-	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
-	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
-	done
-
-clean-libLTLIBRARIES:
-	-test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
-	@list='$(lib_LTLIBRARIES)'; \
-	locs=`for p in $$list; do echo $$p; done | \
-	      sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
-	      sort -u`; \
-	test -z "$$locs" || { \
-	  echo rm -f $${locs}; \
-	  rm -f $${locs}; \
-	}
-
-libpcre.la: $(libpcre_la_OBJECTS) $(libpcre_la_DEPENDENCIES) $(EXTRA_libpcre_la_DEPENDENCIES)
-	$(AM_V_CCLD)$(libpcre_la_LINK) $(am_libpcre_la_rpath) $(libpcre_la_OBJECTS) $(libpcre_la_LIBADD) $(LIBS)
-
-libpcre16.la: $(libpcre16_la_OBJECTS) $(libpcre16_la_DEPENDENCIES) $(EXTRA_libpcre16_la_DEPENDENCIES)
-	$(AM_V_CCLD)$(libpcre16_la_LINK) $(am_libpcre16_la_rpath) $(libpcre16_la_OBJECTS) $(libpcre16_la_LIBADD) $(LIBS)
-
-libpcre32.la: $(libpcre32_la_OBJECTS) $(libpcre32_la_DEPENDENCIES) $(EXTRA_libpcre32_la_DEPENDENCIES)
-	$(AM_V_CCLD)$(libpcre32_la_LINK) $(am_libpcre32_la_rpath) $(libpcre32_la_OBJECTS) $(libpcre32_la_LIBADD) $(LIBS)
-
-libpcrecpp.la: $(libpcrecpp_la_OBJECTS) $(libpcrecpp_la_DEPENDENCIES) $(EXTRA_libpcrecpp_la_DEPENDENCIES)
-	$(AM_V_CXXLD)$(libpcrecpp_la_LINK) $(am_libpcrecpp_la_rpath) $(libpcrecpp_la_OBJECTS) $(libpcrecpp_la_LIBADD) $(LIBS)
-
-libpcreposix.la: $(libpcreposix_la_OBJECTS) $(libpcreposix_la_DEPENDENCIES) $(EXTRA_libpcreposix_la_DEPENDENCIES)
-	$(AM_V_CCLD)$(libpcreposix_la_LINK) $(am_libpcreposix_la_rpath) $(libpcreposix_la_OBJECTS) $(libpcreposix_la_LIBADD) $(LIBS)
-install-binPROGRAMS: $(bin_PROGRAMS)
-	@$(NORMAL_INSTALL)
-	@list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
-	if test -n "$$list"; then \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
-	fi; \
-	for p in $$list; do echo "$$p $$p"; done | \
-	sed 's/$(EXEEXT)$$//' | \
-	while read p p1; do if test -f $$p \
-	 || test -f $$p1 \
-	  ; then echo "$$p"; echo "$$p"; else :; fi; \
-	done | \
-	sed -e 'p;s,.*/,,;n;h' \
-	    -e 's|.*|.|' \
-	    -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
-	sed 'N;N;N;s,\n, ,g' | \
-	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
-	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
-	    if ($$2 == $$4) files[d] = files[d] " " $$1; \
-	    else { print "f", $$3 "/" $$4, $$1; } } \
-	  END { for (d in files) print "f", d, files[d] }' | \
-	while read type dir files; do \
-	    if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
-	    test -z "$$files" || { \
-	    echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \
-	    $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
-	    } \
-	; done
-
-uninstall-binPROGRAMS:
-	@$(NORMAL_UNINSTALL)
-	@list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
-	files=`for p in $$list; do echo "$$p"; done | \
-	  sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
-	      -e 's/$$/$(EXEEXT)/' \
-	`; \
-	test -n "$$list" || exit 0; \
-	echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
-	cd "$(DESTDIR)$(bindir)" && rm -f $$files
-
-clean-binPROGRAMS:
-	@list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \
-	echo " rm -f" $$list; \
-	rm -f $$list || exit $$?; \
-	test -n "$(EXEEXT)" || exit 0; \
-	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
-	echo " rm -f" $$list; \
-	rm -f $$list
-
-clean-noinstPROGRAMS:
-	@list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \
-	echo " rm -f" $$list; \
-	rm -f $$list || exit $$?; \
-	test -n "$(EXEEXT)" || exit 0; \
-	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
-	echo " rm -f" $$list; \
-	rm -f $$list
-
-dftables$(EXEEXT): $(dftables_OBJECTS) $(dftables_DEPENDENCIES) $(EXTRA_dftables_DEPENDENCIES)
-	@rm -f dftables$(EXEEXT)
-	$(AM_V_CCLD)$(LINK) $(dftables_OBJECTS) $(dftables_LDADD) $(LIBS)
-
-pcre_jit_test$(EXEEXT): $(pcre_jit_test_OBJECTS) $(pcre_jit_test_DEPENDENCIES) $(EXTRA_pcre_jit_test_DEPENDENCIES)
-	@rm -f pcre_jit_test$(EXEEXT)
-	$(AM_V_CCLD)$(pcre_jit_test_LINK) $(pcre_jit_test_OBJECTS) $(pcre_jit_test_LDADD) $(LIBS)
-
-pcre_scanner_unittest$(EXEEXT): $(pcre_scanner_unittest_OBJECTS) $(pcre_scanner_unittest_DEPENDENCIES) $(EXTRA_pcre_scanner_unittest_DEPENDENCIES)
-	@rm -f pcre_scanner_unittest$(EXEEXT)
-	$(AM_V_CXXLD)$(pcre_scanner_unittest_LINK) $(pcre_scanner_unittest_OBJECTS) $(pcre_scanner_unittest_LDADD) $(LIBS)
-
-pcre_stringpiece_unittest$(EXEEXT): $(pcre_stringpiece_unittest_OBJECTS) $(pcre_stringpiece_unittest_DEPENDENCIES) $(EXTRA_pcre_stringpiece_unittest_DEPENDENCIES)
-	@rm -f pcre_stringpiece_unittest$(EXEEXT)
-	$(AM_V_CXXLD)$(pcre_stringpiece_unittest_LINK) $(pcre_stringpiece_unittest_OBJECTS) $(pcre_stringpiece_unittest_LDADD) $(LIBS)
-
-pcrecpp_unittest$(EXEEXT): $(pcrecpp_unittest_OBJECTS) $(pcrecpp_unittest_DEPENDENCIES) $(EXTRA_pcrecpp_unittest_DEPENDENCIES)
-	@rm -f pcrecpp_unittest$(EXEEXT)
-	$(AM_V_CXXLD)$(pcrecpp_unittest_LINK) $(pcrecpp_unittest_OBJECTS) $(pcrecpp_unittest_LDADD) $(LIBS)
-
-pcregrep$(EXEEXT): $(pcregrep_OBJECTS) $(pcregrep_DEPENDENCIES) $(EXTRA_pcregrep_DEPENDENCIES)
-	@rm -f pcregrep$(EXEEXT)
-	$(AM_V_CCLD)$(pcregrep_LINK) $(pcregrep_OBJECTS) $(pcregrep_LDADD) $(LIBS)
-
-pcretest$(EXEEXT): $(pcretest_OBJECTS) $(pcretest_DEPENDENCIES) $(EXTRA_pcretest_DEPENDENCIES)
-	@rm -f pcretest$(EXEEXT)
-	$(AM_V_CCLD)$(pcretest_LINK) $(pcretest_OBJECTS) $(pcretest_LDADD) $(LIBS)
-install-binSCRIPTS: $(bin_SCRIPTS)
-	@$(NORMAL_INSTALL)
-	@list='$(bin_SCRIPTS)'; test -n "$(bindir)" || list=; \
-	if test -n "$$list"; then \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
-	fi; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
-	done | \
-	sed -e 'p;s,.*/,,;n' \
-	    -e 'h;s|.*|.|' \
-	    -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
-	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
-	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
-	    if ($$2 == $$4) { files[d] = files[d] " " $$1; \
-	      if (++n[d] == $(am__install_max)) { \
-		print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
-	    else { print "f", d "/" $$4, $$1 } } \
-	  END { for (d in files) print "f", d, files[d] }' | \
-	while read type dir files; do \
-	     if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
-	     test -z "$$files" || { \
-	       echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(bindir)$$dir'"; \
-	       $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
-	     } \
-	; done
-
-uninstall-binSCRIPTS:
-	@$(NORMAL_UNINSTALL)
-	@list='$(bin_SCRIPTS)'; test -n "$(bindir)" || exit 0; \
-	files=`for p in $$list; do echo "$$p"; done | \
-	       sed -e 's,.*/,,;$(transform)'`; \
-	dir='$(DESTDIR)$(bindir)'; $(am__uninstall_files_from_dir)
-
-mostlyclean-compile:
-	-rm -f *.$(OBJEXT)
-
-distclean-compile:
-	-rm -f *.tab.c
-
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dftables.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre16_la-pcre16_byte_order.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre16_la-pcre16_chartables.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre16_la-pcre16_compile.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre16_la-pcre16_config.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre16_la-pcre16_dfa_exec.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre16_la-pcre16_exec.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre16_la-pcre16_fullinfo.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre16_la-pcre16_get.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre16_la-pcre16_globals.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre16_la-pcre16_jit_compile.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre16_la-pcre16_maketables.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre16_la-pcre16_newline.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre16_la-pcre16_ord2utf16.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre16_la-pcre16_refcount.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre16_la-pcre16_string_utils.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre16_la-pcre16_study.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre16_la-pcre16_tables.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre16_la-pcre16_ucd.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre16_la-pcre16_utf16_utils.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre16_la-pcre16_valid_utf16.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre16_la-pcre16_version.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre16_la-pcre16_xclass.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre16_la-pcre_chartables.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre32_la-pcre32_byte_order.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre32_la-pcre32_chartables.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre32_la-pcre32_compile.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre32_la-pcre32_config.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre32_la-pcre32_dfa_exec.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre32_la-pcre32_exec.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre32_la-pcre32_fullinfo.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre32_la-pcre32_get.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre32_la-pcre32_globals.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre32_la-pcre32_jit_compile.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre32_la-pcre32_maketables.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre32_la-pcre32_newline.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre32_la-pcre32_ord2utf32.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre32_la-pcre32_refcount.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre32_la-pcre32_string_utils.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre32_la-pcre32_study.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre32_la-pcre32_tables.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre32_la-pcre32_ucd.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre32_la-pcre32_utf32_utils.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre32_la-pcre32_valid_utf32.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre32_la-pcre32_version.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre32_la-pcre32_xclass.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre32_la-pcre_chartables.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre_la-pcre_byte_order.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre_la-pcre_chartables.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre_la-pcre_compile.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre_la-pcre_config.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre_la-pcre_dfa_exec.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre_la-pcre_exec.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre_la-pcre_fullinfo.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre_la-pcre_get.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre_la-pcre_globals.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre_la-pcre_jit_compile.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre_la-pcre_maketables.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre_la-pcre_newline.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre_la-pcre_ord2utf8.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre_la-pcre_refcount.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre_la-pcre_string_utils.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre_la-pcre_study.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre_la-pcre_tables.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre_la-pcre_ucd.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre_la-pcre_valid_utf8.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre_la-pcre_version.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre_la-pcre_xclass.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcrecpp_la-pcre_scanner.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcrecpp_la-pcre_stringpiece.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcrecpp_la-pcrecpp.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcreposix_la-pcreposix.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcre_jit_test-pcre_jit_test.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcre_scanner_unittest-pcre_scanner_unittest.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcre_stringpiece_unittest-pcre_stringpiece_unittest.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcrecpp_unittest-pcrecpp_unittest.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcregrep-pcregrep.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcretest-pcre16_printint.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcretest-pcre32_printint.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcretest-pcre_printint.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcretest-pcretest.Po@am__quote@
-
-.c.o:
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
-
-.c.obj:
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
-
-.c.lo:
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
-
-libpcre_la-pcre_byte_order.lo: pcre_byte_order.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -MT libpcre_la-pcre_byte_order.lo -MD -MP -MF $(DEPDIR)/libpcre_la-pcre_byte_order.Tpo -c -o libpcre_la-pcre_byte_order.lo `test -f 'pcre_byte_order.c' || echo '$(srcdir)/'`pcre_byte_order.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre_la-pcre_byte_order.Tpo $(DEPDIR)/libpcre_la-pcre_byte_order.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pcre_byte_order.c' object='libpcre_la-pcre_byte_order.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -c -o libpcre_la-pcre_byte_order.lo `test -f 'pcre_byte_order.c' || echo '$(srcdir)/'`pcre_byte_order.c
-
-libpcre_la-pcre_compile.lo: pcre_compile.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -MT libpcre_la-pcre_compile.lo -MD -MP -MF $(DEPDIR)/libpcre_la-pcre_compile.Tpo -c -o libpcre_la-pcre_compile.lo `test -f 'pcre_compile.c' || echo '$(srcdir)/'`pcre_compile.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre_la-pcre_compile.Tpo $(DEPDIR)/libpcre_la-pcre_compile.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pcre_compile.c' object='libpcre_la-pcre_compile.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -c -o libpcre_la-pcre_compile.lo `test -f 'pcre_compile.c' || echo '$(srcdir)/'`pcre_compile.c
-
-libpcre_la-pcre_config.lo: pcre_config.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -MT libpcre_la-pcre_config.lo -MD -MP -MF $(DEPDIR)/libpcre_la-pcre_config.Tpo -c -o libpcre_la-pcre_config.lo `test -f 'pcre_config.c' || echo '$(srcdir)/'`pcre_config.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre_la-pcre_config.Tpo $(DEPDIR)/libpcre_la-pcre_config.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pcre_config.c' object='libpcre_la-pcre_config.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -c -o libpcre_la-pcre_config.lo `test -f 'pcre_config.c' || echo '$(srcdir)/'`pcre_config.c
-
-libpcre_la-pcre_dfa_exec.lo: pcre_dfa_exec.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -MT libpcre_la-pcre_dfa_exec.lo -MD -MP -MF $(DEPDIR)/libpcre_la-pcre_dfa_exec.Tpo -c -o libpcre_la-pcre_dfa_exec.lo `test -f 'pcre_dfa_exec.c' || echo '$(srcdir)/'`pcre_dfa_exec.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre_la-pcre_dfa_exec.Tpo $(DEPDIR)/libpcre_la-pcre_dfa_exec.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pcre_dfa_exec.c' object='libpcre_la-pcre_dfa_exec.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -c -o libpcre_la-pcre_dfa_exec.lo `test -f 'pcre_dfa_exec.c' || echo '$(srcdir)/'`pcre_dfa_exec.c
-
-libpcre_la-pcre_exec.lo: pcre_exec.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -MT libpcre_la-pcre_exec.lo -MD -MP -MF $(DEPDIR)/libpcre_la-pcre_exec.Tpo -c -o libpcre_la-pcre_exec.lo `test -f 'pcre_exec.c' || echo '$(srcdir)/'`pcre_exec.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre_la-pcre_exec.Tpo $(DEPDIR)/libpcre_la-pcre_exec.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pcre_exec.c' object='libpcre_la-pcre_exec.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -c -o libpcre_la-pcre_exec.lo `test -f 'pcre_exec.c' || echo '$(srcdir)/'`pcre_exec.c
-
-libpcre_la-pcre_fullinfo.lo: pcre_fullinfo.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -MT libpcre_la-pcre_fullinfo.lo -MD -MP -MF $(DEPDIR)/libpcre_la-pcre_fullinfo.Tpo -c -o libpcre_la-pcre_fullinfo.lo `test -f 'pcre_fullinfo.c' || echo '$(srcdir)/'`pcre_fullinfo.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre_la-pcre_fullinfo.Tpo $(DEPDIR)/libpcre_la-pcre_fullinfo.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pcre_fullinfo.c' object='libpcre_la-pcre_fullinfo.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -c -o libpcre_la-pcre_fullinfo.lo `test -f 'pcre_fullinfo.c' || echo '$(srcdir)/'`pcre_fullinfo.c
-
-libpcre_la-pcre_get.lo: pcre_get.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -MT libpcre_la-pcre_get.lo -MD -MP -MF $(DEPDIR)/libpcre_la-pcre_get.Tpo -c -o libpcre_la-pcre_get.lo `test -f 'pcre_get.c' || echo '$(srcdir)/'`pcre_get.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre_la-pcre_get.Tpo $(DEPDIR)/libpcre_la-pcre_get.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pcre_get.c' object='libpcre_la-pcre_get.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -c -o libpcre_la-pcre_get.lo `test -f 'pcre_get.c' || echo '$(srcdir)/'`pcre_get.c
-
-libpcre_la-pcre_globals.lo: pcre_globals.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -MT libpcre_la-pcre_globals.lo -MD -MP -MF $(DEPDIR)/libpcre_la-pcre_globals.Tpo -c -o libpcre_la-pcre_globals.lo `test -f 'pcre_globals.c' || echo '$(srcdir)/'`pcre_globals.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre_la-pcre_globals.Tpo $(DEPDIR)/libpcre_la-pcre_globals.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pcre_globals.c' object='libpcre_la-pcre_globals.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -c -o libpcre_la-pcre_globals.lo `test -f 'pcre_globals.c' || echo '$(srcdir)/'`pcre_globals.c
-
-libpcre_la-pcre_jit_compile.lo: pcre_jit_compile.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -MT libpcre_la-pcre_jit_compile.lo -MD -MP -MF $(DEPDIR)/libpcre_la-pcre_jit_compile.Tpo -c -o libpcre_la-pcre_jit_compile.lo `test -f 'pcre_jit_compile.c' || echo '$(srcdir)/'`pcre_jit_compile.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre_la-pcre_jit_compile.Tpo $(DEPDIR)/libpcre_la-pcre_jit_compile.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pcre_jit_compile.c' object='libpcre_la-pcre_jit_compile.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -c -o libpcre_la-pcre_jit_compile.lo `test -f 'pcre_jit_compile.c' || echo '$(srcdir)/'`pcre_jit_compile.c
-
-libpcre_la-pcre_maketables.lo: pcre_maketables.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -MT libpcre_la-pcre_maketables.lo -MD -MP -MF $(DEPDIR)/libpcre_la-pcre_maketables.Tpo -c -o libpcre_la-pcre_maketables.lo `test -f 'pcre_maketables.c' || echo '$(srcdir)/'`pcre_maketables.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre_la-pcre_maketables.Tpo $(DEPDIR)/libpcre_la-pcre_maketables.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pcre_maketables.c' object='libpcre_la-pcre_maketables.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -c -o libpcre_la-pcre_maketables.lo `test -f 'pcre_maketables.c' || echo '$(srcdir)/'`pcre_maketables.c
-
-libpcre_la-pcre_newline.lo: pcre_newline.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -MT libpcre_la-pcre_newline.lo -MD -MP -MF $(DEPDIR)/libpcre_la-pcre_newline.Tpo -c -o libpcre_la-pcre_newline.lo `test -f 'pcre_newline.c' || echo '$(srcdir)/'`pcre_newline.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre_la-pcre_newline.Tpo $(DEPDIR)/libpcre_la-pcre_newline.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pcre_newline.c' object='libpcre_la-pcre_newline.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -c -o libpcre_la-pcre_newline.lo `test -f 'pcre_newline.c' || echo '$(srcdir)/'`pcre_newline.c
-
-libpcre_la-pcre_ord2utf8.lo: pcre_ord2utf8.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -MT libpcre_la-pcre_ord2utf8.lo -MD -MP -MF $(DEPDIR)/libpcre_la-pcre_ord2utf8.Tpo -c -o libpcre_la-pcre_ord2utf8.lo `test -f 'pcre_ord2utf8.c' || echo '$(srcdir)/'`pcre_ord2utf8.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre_la-pcre_ord2utf8.Tpo $(DEPDIR)/libpcre_la-pcre_ord2utf8.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pcre_ord2utf8.c' object='libpcre_la-pcre_ord2utf8.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -c -o libpcre_la-pcre_ord2utf8.lo `test -f 'pcre_ord2utf8.c' || echo '$(srcdir)/'`pcre_ord2utf8.c
-
-libpcre_la-pcre_refcount.lo: pcre_refcount.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -MT libpcre_la-pcre_refcount.lo -MD -MP -MF $(DEPDIR)/libpcre_la-pcre_refcount.Tpo -c -o libpcre_la-pcre_refcount.lo `test -f 'pcre_refcount.c' || echo '$(srcdir)/'`pcre_refcount.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre_la-pcre_refcount.Tpo $(DEPDIR)/libpcre_la-pcre_refcount.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pcre_refcount.c' object='libpcre_la-pcre_refcount.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -c -o libpcre_la-pcre_refcount.lo `test -f 'pcre_refcount.c' || echo '$(srcdir)/'`pcre_refcount.c
-
-libpcre_la-pcre_string_utils.lo: pcre_string_utils.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -MT libpcre_la-pcre_string_utils.lo -MD -MP -MF $(DEPDIR)/libpcre_la-pcre_string_utils.Tpo -c -o libpcre_la-pcre_string_utils.lo `test -f 'pcre_string_utils.c' || echo '$(srcdir)/'`pcre_string_utils.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre_la-pcre_string_utils.Tpo $(DEPDIR)/libpcre_la-pcre_string_utils.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pcre_string_utils.c' object='libpcre_la-pcre_string_utils.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -c -o libpcre_la-pcre_string_utils.lo `test -f 'pcre_string_utils.c' || echo '$(srcdir)/'`pcre_string_utils.c
-
-libpcre_la-pcre_study.lo: pcre_study.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -MT libpcre_la-pcre_study.lo -MD -MP -MF $(DEPDIR)/libpcre_la-pcre_study.Tpo -c -o libpcre_la-pcre_study.lo `test -f 'pcre_study.c' || echo '$(srcdir)/'`pcre_study.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre_la-pcre_study.Tpo $(DEPDIR)/libpcre_la-pcre_study.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pcre_study.c' object='libpcre_la-pcre_study.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -c -o libpcre_la-pcre_study.lo `test -f 'pcre_study.c' || echo '$(srcdir)/'`pcre_study.c
-
-libpcre_la-pcre_tables.lo: pcre_tables.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -MT libpcre_la-pcre_tables.lo -MD -MP -MF $(DEPDIR)/libpcre_la-pcre_tables.Tpo -c -o libpcre_la-pcre_tables.lo `test -f 'pcre_tables.c' || echo '$(srcdir)/'`pcre_tables.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre_la-pcre_tables.Tpo $(DEPDIR)/libpcre_la-pcre_tables.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pcre_tables.c' object='libpcre_la-pcre_tables.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -c -o libpcre_la-pcre_tables.lo `test -f 'pcre_tables.c' || echo '$(srcdir)/'`pcre_tables.c
-
-libpcre_la-pcre_ucd.lo: pcre_ucd.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -MT libpcre_la-pcre_ucd.lo -MD -MP -MF $(DEPDIR)/libpcre_la-pcre_ucd.Tpo -c -o libpcre_la-pcre_ucd.lo `test -f 'pcre_ucd.c' || echo '$(srcdir)/'`pcre_ucd.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre_la-pcre_ucd.Tpo $(DEPDIR)/libpcre_la-pcre_ucd.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pcre_ucd.c' object='libpcre_la-pcre_ucd.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -c -o libpcre_la-pcre_ucd.lo `test -f 'pcre_ucd.c' || echo '$(srcdir)/'`pcre_ucd.c
-
-libpcre_la-pcre_valid_utf8.lo: pcre_valid_utf8.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -MT libpcre_la-pcre_valid_utf8.lo -MD -MP -MF $(DEPDIR)/libpcre_la-pcre_valid_utf8.Tpo -c -o libpcre_la-pcre_valid_utf8.lo `test -f 'pcre_valid_utf8.c' || echo '$(srcdir)/'`pcre_valid_utf8.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre_la-pcre_valid_utf8.Tpo $(DEPDIR)/libpcre_la-pcre_valid_utf8.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pcre_valid_utf8.c' object='libpcre_la-pcre_valid_utf8.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -c -o libpcre_la-pcre_valid_utf8.lo `test -f 'pcre_valid_utf8.c' || echo '$(srcdir)/'`pcre_valid_utf8.c
-
-libpcre_la-pcre_version.lo: pcre_version.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -MT libpcre_la-pcre_version.lo -MD -MP -MF $(DEPDIR)/libpcre_la-pcre_version.Tpo -c -o libpcre_la-pcre_version.lo `test -f 'pcre_version.c' || echo '$(srcdir)/'`pcre_version.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre_la-pcre_version.Tpo $(DEPDIR)/libpcre_la-pcre_version.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pcre_version.c' object='libpcre_la-pcre_version.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -c -o libpcre_la-pcre_version.lo `test -f 'pcre_version.c' || echo '$(srcdir)/'`pcre_version.c
-
-libpcre_la-pcre_xclass.lo: pcre_xclass.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -MT libpcre_la-pcre_xclass.lo -MD -MP -MF $(DEPDIR)/libpcre_la-pcre_xclass.Tpo -c -o libpcre_la-pcre_xclass.lo `test -f 'pcre_xclass.c' || echo '$(srcdir)/'`pcre_xclass.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre_la-pcre_xclass.Tpo $(DEPDIR)/libpcre_la-pcre_xclass.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pcre_xclass.c' object='libpcre_la-pcre_xclass.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -c -o libpcre_la-pcre_xclass.lo `test -f 'pcre_xclass.c' || echo '$(srcdir)/'`pcre_xclass.c
-
-libpcre_la-pcre_chartables.lo: pcre_chartables.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -MT libpcre_la-pcre_chartables.lo -MD -MP -MF $(DEPDIR)/libpcre_la-pcre_chartables.Tpo -c -o libpcre_la-pcre_chartables.lo `test -f 'pcre_chartables.c' || echo '$(srcdir)/'`pcre_chartables.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre_la-pcre_chartables.Tpo $(DEPDIR)/libpcre_la-pcre_chartables.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pcre_chartables.c' object='libpcre_la-pcre_chartables.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -c -o libpcre_la-pcre_chartables.lo `test -f 'pcre_chartables.c' || echo '$(srcdir)/'`pcre_chartables.c
-
-libpcre16_la-pcre16_byte_order.lo: pcre16_byte_order.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -MT libpcre16_la-pcre16_byte_order.lo -MD -MP -MF $(DEPDIR)/libpcre16_la-pcre16_byte_order.Tpo -c -o libpcre16_la-pcre16_byte_order.lo `test -f 'pcre16_byte_order.c' || echo '$(srcdir)/'`pcre16_byte_order.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre16_la-pcre16_byte_order.Tpo $(DEPDIR)/libpcre16_la-pcre16_byte_order.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pcre16_byte_order.c' object='libpcre16_la-pcre16_byte_order.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -c -o libpcre16_la-pcre16_byte_order.lo `test -f 'pcre16_byte_order.c' || echo '$(srcdir)/'`pcre16_byte_order.c
-
-libpcre16_la-pcre16_chartables.lo: pcre16_chartables.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -MT libpcre16_la-pcre16_chartables.lo -MD -MP -MF $(DEPDIR)/libpcre16_la-pcre16_chartables.Tpo -c -o libpcre16_la-pcre16_chartables.lo `test -f 'pcre16_chartables.c' || echo '$(srcdir)/'`pcre16_chartables.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre16_la-pcre16_chartables.Tpo $(DEPDIR)/libpcre16_la-pcre16_chartables.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pcre16_chartables.c' object='libpcre16_la-pcre16_chartables.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -c -o libpcre16_la-pcre16_chartables.lo `test -f 'pcre16_chartables.c' || echo '$(srcdir)/'`pcre16_chartables.c
-
-libpcre16_la-pcre16_compile.lo: pcre16_compile.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -MT libpcre16_la-pcre16_compile.lo -MD -MP -MF $(DEPDIR)/libpcre16_la-pcre16_compile.Tpo -c -o libpcre16_la-pcre16_compile.lo `test -f 'pcre16_compile.c' || echo '$(srcdir)/'`pcre16_compile.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre16_la-pcre16_compile.Tpo $(DEPDIR)/libpcre16_la-pcre16_compile.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pcre16_compile.c' object='libpcre16_la-pcre16_compile.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -c -o libpcre16_la-pcre16_compile.lo `test -f 'pcre16_compile.c' || echo '$(srcdir)/'`pcre16_compile.c
-
-libpcre16_la-pcre16_config.lo: pcre16_config.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -MT libpcre16_la-pcre16_config.lo -MD -MP -MF $(DEPDIR)/libpcre16_la-pcre16_config.Tpo -c -o libpcre16_la-pcre16_config.lo `test -f 'pcre16_config.c' || echo '$(srcdir)/'`pcre16_config.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre16_la-pcre16_config.Tpo $(DEPDIR)/libpcre16_la-pcre16_config.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pcre16_config.c' object='libpcre16_la-pcre16_config.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -c -o libpcre16_la-pcre16_config.lo `test -f 'pcre16_config.c' || echo '$(srcdir)/'`pcre16_config.c
-
-libpcre16_la-pcre16_dfa_exec.lo: pcre16_dfa_exec.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -MT libpcre16_la-pcre16_dfa_exec.lo -MD -MP -MF $(DEPDIR)/libpcre16_la-pcre16_dfa_exec.Tpo -c -o libpcre16_la-pcre16_dfa_exec.lo `test -f 'pcre16_dfa_exec.c' || echo '$(srcdir)/'`pcre16_dfa_exec.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre16_la-pcre16_dfa_exec.Tpo $(DEPDIR)/libpcre16_la-pcre16_dfa_exec.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pcre16_dfa_exec.c' object='libpcre16_la-pcre16_dfa_exec.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -c -o libpcre16_la-pcre16_dfa_exec.lo `test -f 'pcre16_dfa_exec.c' || echo '$(srcdir)/'`pcre16_dfa_exec.c
-
-libpcre16_la-pcre16_exec.lo: pcre16_exec.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -MT libpcre16_la-pcre16_exec.lo -MD -MP -MF $(DEPDIR)/libpcre16_la-pcre16_exec.Tpo -c -o libpcre16_la-pcre16_exec.lo `test -f 'pcre16_exec.c' || echo '$(srcdir)/'`pcre16_exec.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre16_la-pcre16_exec.Tpo $(DEPDIR)/libpcre16_la-pcre16_exec.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pcre16_exec.c' object='libpcre16_la-pcre16_exec.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -c -o libpcre16_la-pcre16_exec.lo `test -f 'pcre16_exec.c' || echo '$(srcdir)/'`pcre16_exec.c
-
-libpcre16_la-pcre16_fullinfo.lo: pcre16_fullinfo.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -MT libpcre16_la-pcre16_fullinfo.lo -MD -MP -MF $(DEPDIR)/libpcre16_la-pcre16_fullinfo.Tpo -c -o libpcre16_la-pcre16_fullinfo.lo `test -f 'pcre16_fullinfo.c' || echo '$(srcdir)/'`pcre16_fullinfo.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre16_la-pcre16_fullinfo.Tpo $(DEPDIR)/libpcre16_la-pcre16_fullinfo.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pcre16_fullinfo.c' object='libpcre16_la-pcre16_fullinfo.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -c -o libpcre16_la-pcre16_fullinfo.lo `test -f 'pcre16_fullinfo.c' || echo '$(srcdir)/'`pcre16_fullinfo.c
-
-libpcre16_la-pcre16_get.lo: pcre16_get.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -MT libpcre16_la-pcre16_get.lo -MD -MP -MF $(DEPDIR)/libpcre16_la-pcre16_get.Tpo -c -o libpcre16_la-pcre16_get.lo `test -f 'pcre16_get.c' || echo '$(srcdir)/'`pcre16_get.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre16_la-pcre16_get.Tpo $(DEPDIR)/libpcre16_la-pcre16_get.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pcre16_get.c' object='libpcre16_la-pcre16_get.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -c -o libpcre16_la-pcre16_get.lo `test -f 'pcre16_get.c' || echo '$(srcdir)/'`pcre16_get.c
-
-libpcre16_la-pcre16_globals.lo: pcre16_globals.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -MT libpcre16_la-pcre16_globals.lo -MD -MP -MF $(DEPDIR)/libpcre16_la-pcre16_globals.Tpo -c -o libpcre16_la-pcre16_globals.lo `test -f 'pcre16_globals.c' || echo '$(srcdir)/'`pcre16_globals.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre16_la-pcre16_globals.Tpo $(DEPDIR)/libpcre16_la-pcre16_globals.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pcre16_globals.c' object='libpcre16_la-pcre16_globals.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -c -o libpcre16_la-pcre16_globals.lo `test -f 'pcre16_globals.c' || echo '$(srcdir)/'`pcre16_globals.c
-
-libpcre16_la-pcre16_jit_compile.lo: pcre16_jit_compile.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -MT libpcre16_la-pcre16_jit_compile.lo -MD -MP -MF $(DEPDIR)/libpcre16_la-pcre16_jit_compile.Tpo -c -o libpcre16_la-pcre16_jit_compile.lo `test -f 'pcre16_jit_compile.c' || echo '$(srcdir)/'`pcre16_jit_compile.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre16_la-pcre16_jit_compile.Tpo $(DEPDIR)/libpcre16_la-pcre16_jit_compile.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pcre16_jit_compile.c' object='libpcre16_la-pcre16_jit_compile.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -c -o libpcre16_la-pcre16_jit_compile.lo `test -f 'pcre16_jit_compile.c' || echo '$(srcdir)/'`pcre16_jit_compile.c
-
-libpcre16_la-pcre16_maketables.lo: pcre16_maketables.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -MT libpcre16_la-pcre16_maketables.lo -MD -MP -MF $(DEPDIR)/libpcre16_la-pcre16_maketables.Tpo -c -o libpcre16_la-pcre16_maketables.lo `test -f 'pcre16_maketables.c' || echo '$(srcdir)/'`pcre16_maketables.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre16_la-pcre16_maketables.Tpo $(DEPDIR)/libpcre16_la-pcre16_maketables.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pcre16_maketables.c' object='libpcre16_la-pcre16_maketables.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -c -o libpcre16_la-pcre16_maketables.lo `test -f 'pcre16_maketables.c' || echo '$(srcdir)/'`pcre16_maketables.c
-
-libpcre16_la-pcre16_newline.lo: pcre16_newline.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -MT libpcre16_la-pcre16_newline.lo -MD -MP -MF $(DEPDIR)/libpcre16_la-pcre16_newline.Tpo -c -o libpcre16_la-pcre16_newline.lo `test -f 'pcre16_newline.c' || echo '$(srcdir)/'`pcre16_newline.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre16_la-pcre16_newline.Tpo $(DEPDIR)/libpcre16_la-pcre16_newline.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pcre16_newline.c' object='libpcre16_la-pcre16_newline.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -c -o libpcre16_la-pcre16_newline.lo `test -f 'pcre16_newline.c' || echo '$(srcdir)/'`pcre16_newline.c
-
-libpcre16_la-pcre16_ord2utf16.lo: pcre16_ord2utf16.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -MT libpcre16_la-pcre16_ord2utf16.lo -MD -MP -MF $(DEPDIR)/libpcre16_la-pcre16_ord2utf16.Tpo -c -o libpcre16_la-pcre16_ord2utf16.lo `test -f 'pcre16_ord2utf16.c' || echo '$(srcdir)/'`pcre16_ord2utf16.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre16_la-pcre16_ord2utf16.Tpo $(DEPDIR)/libpcre16_la-pcre16_ord2utf16.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pcre16_ord2utf16.c' object='libpcre16_la-pcre16_ord2utf16.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -c -o libpcre16_la-pcre16_ord2utf16.lo `test -f 'pcre16_ord2utf16.c' || echo '$(srcdir)/'`pcre16_ord2utf16.c
-
-libpcre16_la-pcre16_refcount.lo: pcre16_refcount.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -MT libpcre16_la-pcre16_refcount.lo -MD -MP -MF $(DEPDIR)/libpcre16_la-pcre16_refcount.Tpo -c -o libpcre16_la-pcre16_refcount.lo `test -f 'pcre16_refcount.c' || echo '$(srcdir)/'`pcre16_refcount.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre16_la-pcre16_refcount.Tpo $(DEPDIR)/libpcre16_la-pcre16_refcount.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pcre16_refcount.c' object='libpcre16_la-pcre16_refcount.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -c -o libpcre16_la-pcre16_refcount.lo `test -f 'pcre16_refcount.c' || echo '$(srcdir)/'`pcre16_refcount.c
-
-libpcre16_la-pcre16_string_utils.lo: pcre16_string_utils.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -MT libpcre16_la-pcre16_string_utils.lo -MD -MP -MF $(DEPDIR)/libpcre16_la-pcre16_string_utils.Tpo -c -o libpcre16_la-pcre16_string_utils.lo `test -f 'pcre16_string_utils.c' || echo '$(srcdir)/'`pcre16_string_utils.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre16_la-pcre16_string_utils.Tpo $(DEPDIR)/libpcre16_la-pcre16_string_utils.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pcre16_string_utils.c' object='libpcre16_la-pcre16_string_utils.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -c -o libpcre16_la-pcre16_string_utils.lo `test -f 'pcre16_string_utils.c' || echo '$(srcdir)/'`pcre16_string_utils.c
-
-libpcre16_la-pcre16_study.lo: pcre16_study.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -MT libpcre16_la-pcre16_study.lo -MD -MP -MF $(DEPDIR)/libpcre16_la-pcre16_study.Tpo -c -o libpcre16_la-pcre16_study.lo `test -f 'pcre16_study.c' || echo '$(srcdir)/'`pcre16_study.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre16_la-pcre16_study.Tpo $(DEPDIR)/libpcre16_la-pcre16_study.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pcre16_study.c' object='libpcre16_la-pcre16_study.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -c -o libpcre16_la-pcre16_study.lo `test -f 'pcre16_study.c' || echo '$(srcdir)/'`pcre16_study.c
-
-libpcre16_la-pcre16_tables.lo: pcre16_tables.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -MT libpcre16_la-pcre16_tables.lo -MD -MP -MF $(DEPDIR)/libpcre16_la-pcre16_tables.Tpo -c -o libpcre16_la-pcre16_tables.lo `test -f 'pcre16_tables.c' || echo '$(srcdir)/'`pcre16_tables.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre16_la-pcre16_tables.Tpo $(DEPDIR)/libpcre16_la-pcre16_tables.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pcre16_tables.c' object='libpcre16_la-pcre16_tables.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -c -o libpcre16_la-pcre16_tables.lo `test -f 'pcre16_tables.c' || echo '$(srcdir)/'`pcre16_tables.c
-
-libpcre16_la-pcre16_ucd.lo: pcre16_ucd.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -MT libpcre16_la-pcre16_ucd.lo -MD -MP -MF $(DEPDIR)/libpcre16_la-pcre16_ucd.Tpo -c -o libpcre16_la-pcre16_ucd.lo `test -f 'pcre16_ucd.c' || echo '$(srcdir)/'`pcre16_ucd.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre16_la-pcre16_ucd.Tpo $(DEPDIR)/libpcre16_la-pcre16_ucd.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pcre16_ucd.c' object='libpcre16_la-pcre16_ucd.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -c -o libpcre16_la-pcre16_ucd.lo `test -f 'pcre16_ucd.c' || echo '$(srcdir)/'`pcre16_ucd.c
-
-libpcre16_la-pcre16_utf16_utils.lo: pcre16_utf16_utils.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -MT libpcre16_la-pcre16_utf16_utils.lo -MD -MP -MF $(DEPDIR)/libpcre16_la-pcre16_utf16_utils.Tpo -c -o libpcre16_la-pcre16_utf16_utils.lo `test -f 'pcre16_utf16_utils.c' || echo '$(srcdir)/'`pcre16_utf16_utils.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre16_la-pcre16_utf16_utils.Tpo $(DEPDIR)/libpcre16_la-pcre16_utf16_utils.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pcre16_utf16_utils.c' object='libpcre16_la-pcre16_utf16_utils.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -c -o libpcre16_la-pcre16_utf16_utils.lo `test -f 'pcre16_utf16_utils.c' || echo '$(srcdir)/'`pcre16_utf16_utils.c
-
-libpcre16_la-pcre16_valid_utf16.lo: pcre16_valid_utf16.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -MT libpcre16_la-pcre16_valid_utf16.lo -MD -MP -MF $(DEPDIR)/libpcre16_la-pcre16_valid_utf16.Tpo -c -o libpcre16_la-pcre16_valid_utf16.lo `test -f 'pcre16_valid_utf16.c' || echo '$(srcdir)/'`pcre16_valid_utf16.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre16_la-pcre16_valid_utf16.Tpo $(DEPDIR)/libpcre16_la-pcre16_valid_utf16.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pcre16_valid_utf16.c' object='libpcre16_la-pcre16_valid_utf16.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -c -o libpcre16_la-pcre16_valid_utf16.lo `test -f 'pcre16_valid_utf16.c' || echo '$(srcdir)/'`pcre16_valid_utf16.c
-
-libpcre16_la-pcre16_version.lo: pcre16_version.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -MT libpcre16_la-pcre16_version.lo -MD -MP -MF $(DEPDIR)/libpcre16_la-pcre16_version.Tpo -c -o libpcre16_la-pcre16_version.lo `test -f 'pcre16_version.c' || echo '$(srcdir)/'`pcre16_version.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre16_la-pcre16_version.Tpo $(DEPDIR)/libpcre16_la-pcre16_version.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pcre16_version.c' object='libpcre16_la-pcre16_version.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -c -o libpcre16_la-pcre16_version.lo `test -f 'pcre16_version.c' || echo '$(srcdir)/'`pcre16_version.c
-
-libpcre16_la-pcre16_xclass.lo: pcre16_xclass.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -MT libpcre16_la-pcre16_xclass.lo -MD -MP -MF $(DEPDIR)/libpcre16_la-pcre16_xclass.Tpo -c -o libpcre16_la-pcre16_xclass.lo `test -f 'pcre16_xclass.c' || echo '$(srcdir)/'`pcre16_xclass.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre16_la-pcre16_xclass.Tpo $(DEPDIR)/libpcre16_la-pcre16_xclass.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pcre16_xclass.c' object='libpcre16_la-pcre16_xclass.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -c -o libpcre16_la-pcre16_xclass.lo `test -f 'pcre16_xclass.c' || echo '$(srcdir)/'`pcre16_xclass.c
-
-libpcre16_la-pcre_chartables.lo: pcre_chartables.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -MT libpcre16_la-pcre_chartables.lo -MD -MP -MF $(DEPDIR)/libpcre16_la-pcre_chartables.Tpo -c -o libpcre16_la-pcre_chartables.lo `test -f 'pcre_chartables.c' || echo '$(srcdir)/'`pcre_chartables.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre16_la-pcre_chartables.Tpo $(DEPDIR)/libpcre16_la-pcre_chartables.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pcre_chartables.c' object='libpcre16_la-pcre_chartables.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -c -o libpcre16_la-pcre_chartables.lo `test -f 'pcre_chartables.c' || echo '$(srcdir)/'`pcre_chartables.c
-
-libpcre32_la-pcre32_byte_order.lo: pcre32_byte_order.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -MT libpcre32_la-pcre32_byte_order.lo -MD -MP -MF $(DEPDIR)/libpcre32_la-pcre32_byte_order.Tpo -c -o libpcre32_la-pcre32_byte_order.lo `test -f 'pcre32_byte_order.c' || echo '$(srcdir)/'`pcre32_byte_order.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre32_la-pcre32_byte_order.Tpo $(DEPDIR)/libpcre32_la-pcre32_byte_order.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pcre32_byte_order.c' object='libpcre32_la-pcre32_byte_order.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -c -o libpcre32_la-pcre32_byte_order.lo `test -f 'pcre32_byte_order.c' || echo '$(srcdir)/'`pcre32_byte_order.c
-
-libpcre32_la-pcre32_chartables.lo: pcre32_chartables.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -MT libpcre32_la-pcre32_chartables.lo -MD -MP -MF $(DEPDIR)/libpcre32_la-pcre32_chartables.Tpo -c -o libpcre32_la-pcre32_chartables.lo `test -f 'pcre32_chartables.c' || echo '$(srcdir)/'`pcre32_chartables.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre32_la-pcre32_chartables.Tpo $(DEPDIR)/libpcre32_la-pcre32_chartables.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pcre32_chartables.c' object='libpcre32_la-pcre32_chartables.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -c -o libpcre32_la-pcre32_chartables.lo `test -f 'pcre32_chartables.c' || echo '$(srcdir)/'`pcre32_chartables.c
-
-libpcre32_la-pcre32_compile.lo: pcre32_compile.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -MT libpcre32_la-pcre32_compile.lo -MD -MP -MF $(DEPDIR)/libpcre32_la-pcre32_compile.Tpo -c -o libpcre32_la-pcre32_compile.lo `test -f 'pcre32_compile.c' || echo '$(srcdir)/'`pcre32_compile.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre32_la-pcre32_compile.Tpo $(DEPDIR)/libpcre32_la-pcre32_compile.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pcre32_compile.c' object='libpcre32_la-pcre32_compile.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -c -o libpcre32_la-pcre32_compile.lo `test -f 'pcre32_compile.c' || echo '$(srcdir)/'`pcre32_compile.c
-
-libpcre32_la-pcre32_config.lo: pcre32_config.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -MT libpcre32_la-pcre32_config.lo -MD -MP -MF $(DEPDIR)/libpcre32_la-pcre32_config.Tpo -c -o libpcre32_la-pcre32_config.lo `test -f 'pcre32_config.c' || echo '$(srcdir)/'`pcre32_config.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre32_la-pcre32_config.Tpo $(DEPDIR)/libpcre32_la-pcre32_config.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pcre32_config.c' object='libpcre32_la-pcre32_config.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -c -o libpcre32_la-pcre32_config.lo `test -f 'pcre32_config.c' || echo '$(srcdir)/'`pcre32_config.c
-
-libpcre32_la-pcre32_dfa_exec.lo: pcre32_dfa_exec.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -MT libpcre32_la-pcre32_dfa_exec.lo -MD -MP -MF $(DEPDIR)/libpcre32_la-pcre32_dfa_exec.Tpo -c -o libpcre32_la-pcre32_dfa_exec.lo `test -f 'pcre32_dfa_exec.c' || echo '$(srcdir)/'`pcre32_dfa_exec.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre32_la-pcre32_dfa_exec.Tpo $(DEPDIR)/libpcre32_la-pcre32_dfa_exec.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pcre32_dfa_exec.c' object='libpcre32_la-pcre32_dfa_exec.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -c -o libpcre32_la-pcre32_dfa_exec.lo `test -f 'pcre32_dfa_exec.c' || echo '$(srcdir)/'`pcre32_dfa_exec.c
-
-libpcre32_la-pcre32_exec.lo: pcre32_exec.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -MT libpcre32_la-pcre32_exec.lo -MD -MP -MF $(DEPDIR)/libpcre32_la-pcre32_exec.Tpo -c -o libpcre32_la-pcre32_exec.lo `test -f 'pcre32_exec.c' || echo '$(srcdir)/'`pcre32_exec.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre32_la-pcre32_exec.Tpo $(DEPDIR)/libpcre32_la-pcre32_exec.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pcre32_exec.c' object='libpcre32_la-pcre32_exec.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -c -o libpcre32_la-pcre32_exec.lo `test -f 'pcre32_exec.c' || echo '$(srcdir)/'`pcre32_exec.c
-
-libpcre32_la-pcre32_fullinfo.lo: pcre32_fullinfo.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -MT libpcre32_la-pcre32_fullinfo.lo -MD -MP -MF $(DEPDIR)/libpcre32_la-pcre32_fullinfo.Tpo -c -o libpcre32_la-pcre32_fullinfo.lo `test -f 'pcre32_fullinfo.c' || echo '$(srcdir)/'`pcre32_fullinfo.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre32_la-pcre32_fullinfo.Tpo $(DEPDIR)/libpcre32_la-pcre32_fullinfo.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pcre32_fullinfo.c' object='libpcre32_la-pcre32_fullinfo.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -c -o libpcre32_la-pcre32_fullinfo.lo `test -f 'pcre32_fullinfo.c' || echo '$(srcdir)/'`pcre32_fullinfo.c
-
-libpcre32_la-pcre32_get.lo: pcre32_get.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -MT libpcre32_la-pcre32_get.lo -MD -MP -MF $(DEPDIR)/libpcre32_la-pcre32_get.Tpo -c -o libpcre32_la-pcre32_get.lo `test -f 'pcre32_get.c' || echo '$(srcdir)/'`pcre32_get.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre32_la-pcre32_get.Tpo $(DEPDIR)/libpcre32_la-pcre32_get.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pcre32_get.c' object='libpcre32_la-pcre32_get.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -c -o libpcre32_la-pcre32_get.lo `test -f 'pcre32_get.c' || echo '$(srcdir)/'`pcre32_get.c
-
-libpcre32_la-pcre32_globals.lo: pcre32_globals.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -MT libpcre32_la-pcre32_globals.lo -MD -MP -MF $(DEPDIR)/libpcre32_la-pcre32_globals.Tpo -c -o libpcre32_la-pcre32_globals.lo `test -f 'pcre32_globals.c' || echo '$(srcdir)/'`pcre32_globals.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre32_la-pcre32_globals.Tpo $(DEPDIR)/libpcre32_la-pcre32_globals.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pcre32_globals.c' object='libpcre32_la-pcre32_globals.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -c -o libpcre32_la-pcre32_globals.lo `test -f 'pcre32_globals.c' || echo '$(srcdir)/'`pcre32_globals.c
-
-libpcre32_la-pcre32_jit_compile.lo: pcre32_jit_compile.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -MT libpcre32_la-pcre32_jit_compile.lo -MD -MP -MF $(DEPDIR)/libpcre32_la-pcre32_jit_compile.Tpo -c -o libpcre32_la-pcre32_jit_compile.lo `test -f 'pcre32_jit_compile.c' || echo '$(srcdir)/'`pcre32_jit_compile.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre32_la-pcre32_jit_compile.Tpo $(DEPDIR)/libpcre32_la-pcre32_jit_compile.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pcre32_jit_compile.c' object='libpcre32_la-pcre32_jit_compile.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -c -o libpcre32_la-pcre32_jit_compile.lo `test -f 'pcre32_jit_compile.c' || echo '$(srcdir)/'`pcre32_jit_compile.c
-
-libpcre32_la-pcre32_maketables.lo: pcre32_maketables.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -MT libpcre32_la-pcre32_maketables.lo -MD -MP -MF $(DEPDIR)/libpcre32_la-pcre32_maketables.Tpo -c -o libpcre32_la-pcre32_maketables.lo `test -f 'pcre32_maketables.c' || echo '$(srcdir)/'`pcre32_maketables.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre32_la-pcre32_maketables.Tpo $(DEPDIR)/libpcre32_la-pcre32_maketables.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pcre32_maketables.c' object='libpcre32_la-pcre32_maketables.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -c -o libpcre32_la-pcre32_maketables.lo `test -f 'pcre32_maketables.c' || echo '$(srcdir)/'`pcre32_maketables.c
-
-libpcre32_la-pcre32_newline.lo: pcre32_newline.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -MT libpcre32_la-pcre32_newline.lo -MD -MP -MF $(DEPDIR)/libpcre32_la-pcre32_newline.Tpo -c -o libpcre32_la-pcre32_newline.lo `test -f 'pcre32_newline.c' || echo '$(srcdir)/'`pcre32_newline.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre32_la-pcre32_newline.Tpo $(DEPDIR)/libpcre32_la-pcre32_newline.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pcre32_newline.c' object='libpcre32_la-pcre32_newline.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -c -o libpcre32_la-pcre32_newline.lo `test -f 'pcre32_newline.c' || echo '$(srcdir)/'`pcre32_newline.c
-
-libpcre32_la-pcre32_ord2utf32.lo: pcre32_ord2utf32.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -MT libpcre32_la-pcre32_ord2utf32.lo -MD -MP -MF $(DEPDIR)/libpcre32_la-pcre32_ord2utf32.Tpo -c -o libpcre32_la-pcre32_ord2utf32.lo `test -f 'pcre32_ord2utf32.c' || echo '$(srcdir)/'`pcre32_ord2utf32.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre32_la-pcre32_ord2utf32.Tpo $(DEPDIR)/libpcre32_la-pcre32_ord2utf32.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pcre32_ord2utf32.c' object='libpcre32_la-pcre32_ord2utf32.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -c -o libpcre32_la-pcre32_ord2utf32.lo `test -f 'pcre32_ord2utf32.c' || echo '$(srcdir)/'`pcre32_ord2utf32.c
-
-libpcre32_la-pcre32_refcount.lo: pcre32_refcount.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -MT libpcre32_la-pcre32_refcount.lo -MD -MP -MF $(DEPDIR)/libpcre32_la-pcre32_refcount.Tpo -c -o libpcre32_la-pcre32_refcount.lo `test -f 'pcre32_refcount.c' || echo '$(srcdir)/'`pcre32_refcount.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre32_la-pcre32_refcount.Tpo $(DEPDIR)/libpcre32_la-pcre32_refcount.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pcre32_refcount.c' object='libpcre32_la-pcre32_refcount.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -c -o libpcre32_la-pcre32_refcount.lo `test -f 'pcre32_refcount.c' || echo '$(srcdir)/'`pcre32_refcount.c
-
-libpcre32_la-pcre32_string_utils.lo: pcre32_string_utils.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -MT libpcre32_la-pcre32_string_utils.lo -MD -MP -MF $(DEPDIR)/libpcre32_la-pcre32_string_utils.Tpo -c -o libpcre32_la-pcre32_string_utils.lo `test -f 'pcre32_string_utils.c' || echo '$(srcdir)/'`pcre32_string_utils.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre32_la-pcre32_string_utils.Tpo $(DEPDIR)/libpcre32_la-pcre32_string_utils.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pcre32_string_utils.c' object='libpcre32_la-pcre32_string_utils.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -c -o libpcre32_la-pcre32_string_utils.lo `test -f 'pcre32_string_utils.c' || echo '$(srcdir)/'`pcre32_string_utils.c
-
-libpcre32_la-pcre32_study.lo: pcre32_study.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -MT libpcre32_la-pcre32_study.lo -MD -MP -MF $(DEPDIR)/libpcre32_la-pcre32_study.Tpo -c -o libpcre32_la-pcre32_study.lo `test -f 'pcre32_study.c' || echo '$(srcdir)/'`pcre32_study.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre32_la-pcre32_study.Tpo $(DEPDIR)/libpcre32_la-pcre32_study.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pcre32_study.c' object='libpcre32_la-pcre32_study.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -c -o libpcre32_la-pcre32_study.lo `test -f 'pcre32_study.c' || echo '$(srcdir)/'`pcre32_study.c
-
-libpcre32_la-pcre32_tables.lo: pcre32_tables.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -MT libpcre32_la-pcre32_tables.lo -MD -MP -MF $(DEPDIR)/libpcre32_la-pcre32_tables.Tpo -c -o libpcre32_la-pcre32_tables.lo `test -f 'pcre32_tables.c' || echo '$(srcdir)/'`pcre32_tables.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre32_la-pcre32_tables.Tpo $(DEPDIR)/libpcre32_la-pcre32_tables.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pcre32_tables.c' object='libpcre32_la-pcre32_tables.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -c -o libpcre32_la-pcre32_tables.lo `test -f 'pcre32_tables.c' || echo '$(srcdir)/'`pcre32_tables.c
-
-libpcre32_la-pcre32_ucd.lo: pcre32_ucd.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -MT libpcre32_la-pcre32_ucd.lo -MD -MP -MF $(DEPDIR)/libpcre32_la-pcre32_ucd.Tpo -c -o libpcre32_la-pcre32_ucd.lo `test -f 'pcre32_ucd.c' || echo '$(srcdir)/'`pcre32_ucd.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre32_la-pcre32_ucd.Tpo $(DEPDIR)/libpcre32_la-pcre32_ucd.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pcre32_ucd.c' object='libpcre32_la-pcre32_ucd.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -c -o libpcre32_la-pcre32_ucd.lo `test -f 'pcre32_ucd.c' || echo '$(srcdir)/'`pcre32_ucd.c
-
-libpcre32_la-pcre32_utf32_utils.lo: pcre32_utf32_utils.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -MT libpcre32_la-pcre32_utf32_utils.lo -MD -MP -MF $(DEPDIR)/libpcre32_la-pcre32_utf32_utils.Tpo -c -o libpcre32_la-pcre32_utf32_utils.lo `test -f 'pcre32_utf32_utils.c' || echo '$(srcdir)/'`pcre32_utf32_utils.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre32_la-pcre32_utf32_utils.Tpo $(DEPDIR)/libpcre32_la-pcre32_utf32_utils.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pcre32_utf32_utils.c' object='libpcre32_la-pcre32_utf32_utils.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -c -o libpcre32_la-pcre32_utf32_utils.lo `test -f 'pcre32_utf32_utils.c' || echo '$(srcdir)/'`pcre32_utf32_utils.c
-
-libpcre32_la-pcre32_valid_utf32.lo: pcre32_valid_utf32.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -MT libpcre32_la-pcre32_valid_utf32.lo -MD -MP -MF $(DEPDIR)/libpcre32_la-pcre32_valid_utf32.Tpo -c -o libpcre32_la-pcre32_valid_utf32.lo `test -f 'pcre32_valid_utf32.c' || echo '$(srcdir)/'`pcre32_valid_utf32.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre32_la-pcre32_valid_utf32.Tpo $(DEPDIR)/libpcre32_la-pcre32_valid_utf32.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pcre32_valid_utf32.c' object='libpcre32_la-pcre32_valid_utf32.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -c -o libpcre32_la-pcre32_valid_utf32.lo `test -f 'pcre32_valid_utf32.c' || echo '$(srcdir)/'`pcre32_valid_utf32.c
-
-libpcre32_la-pcre32_version.lo: pcre32_version.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -MT libpcre32_la-pcre32_version.lo -MD -MP -MF $(DEPDIR)/libpcre32_la-pcre32_version.Tpo -c -o libpcre32_la-pcre32_version.lo `test -f 'pcre32_version.c' || echo '$(srcdir)/'`pcre32_version.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre32_la-pcre32_version.Tpo $(DEPDIR)/libpcre32_la-pcre32_version.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pcre32_version.c' object='libpcre32_la-pcre32_version.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -c -o libpcre32_la-pcre32_version.lo `test -f 'pcre32_version.c' || echo '$(srcdir)/'`pcre32_version.c
-
-libpcre32_la-pcre32_xclass.lo: pcre32_xclass.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -MT libpcre32_la-pcre32_xclass.lo -MD -MP -MF $(DEPDIR)/libpcre32_la-pcre32_xclass.Tpo -c -o libpcre32_la-pcre32_xclass.lo `test -f 'pcre32_xclass.c' || echo '$(srcdir)/'`pcre32_xclass.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre32_la-pcre32_xclass.Tpo $(DEPDIR)/libpcre32_la-pcre32_xclass.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pcre32_xclass.c' object='libpcre32_la-pcre32_xclass.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -c -o libpcre32_la-pcre32_xclass.lo `test -f 'pcre32_xclass.c' || echo '$(srcdir)/'`pcre32_xclass.c
-
-libpcre32_la-pcre_chartables.lo: pcre_chartables.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -MT libpcre32_la-pcre_chartables.lo -MD -MP -MF $(DEPDIR)/libpcre32_la-pcre_chartables.Tpo -c -o libpcre32_la-pcre_chartables.lo `test -f 'pcre_chartables.c' || echo '$(srcdir)/'`pcre_chartables.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre32_la-pcre_chartables.Tpo $(DEPDIR)/libpcre32_la-pcre_chartables.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pcre_chartables.c' object='libpcre32_la-pcre_chartables.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -c -o libpcre32_la-pcre_chartables.lo `test -f 'pcre_chartables.c' || echo '$(srcdir)/'`pcre_chartables.c
-
-libpcreposix_la-pcreposix.lo: pcreposix.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcreposix_la_CFLAGS) $(CFLAGS) -MT libpcreposix_la-pcreposix.lo -MD -MP -MF $(DEPDIR)/libpcreposix_la-pcreposix.Tpo -c -o libpcreposix_la-pcreposix.lo `test -f 'pcreposix.c' || echo '$(srcdir)/'`pcreposix.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libpcreposix_la-pcreposix.Tpo $(DEPDIR)/libpcreposix_la-pcreposix.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pcreposix.c' object='libpcreposix_la-pcreposix.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcreposix_la_CFLAGS) $(CFLAGS) -c -o libpcreposix_la-pcreposix.lo `test -f 'pcreposix.c' || echo '$(srcdir)/'`pcreposix.c
-
-pcre_jit_test-pcre_jit_test.o: pcre_jit_test.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcre_jit_test_CFLAGS) $(CFLAGS) -MT pcre_jit_test-pcre_jit_test.o -MD -MP -MF $(DEPDIR)/pcre_jit_test-pcre_jit_test.Tpo -c -o pcre_jit_test-pcre_jit_test.o `test -f 'pcre_jit_test.c' || echo '$(srcdir)/'`pcre_jit_test.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/pcre_jit_test-pcre_jit_test.Tpo $(DEPDIR)/pcre_jit_test-pcre_jit_test.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pcre_jit_test.c' object='pcre_jit_test-pcre_jit_test.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcre_jit_test_CFLAGS) $(CFLAGS) -c -o pcre_jit_test-pcre_jit_test.o `test -f 'pcre_jit_test.c' || echo '$(srcdir)/'`pcre_jit_test.c
-
-pcre_jit_test-pcre_jit_test.obj: pcre_jit_test.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcre_jit_test_CFLAGS) $(CFLAGS) -MT pcre_jit_test-pcre_jit_test.obj -MD -MP -MF $(DEPDIR)/pcre_jit_test-pcre_jit_test.Tpo -c -o pcre_jit_test-pcre_jit_test.obj `if test -f 'pcre_jit_test.c'; then $(CYGPATH_W) 'pcre_jit_test.c'; else $(CYGPATH_W) '$(srcdir)/pcre_jit_test.c'; fi`
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/pcre_jit_test-pcre_jit_test.Tpo $(DEPDIR)/pcre_jit_test-pcre_jit_test.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pcre_jit_test.c' object='pcre_jit_test-pcre_jit_test.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcre_jit_test_CFLAGS) $(CFLAGS) -c -o pcre_jit_test-pcre_jit_test.obj `if test -f 'pcre_jit_test.c'; then $(CYGPATH_W) 'pcre_jit_test.c'; else $(CYGPATH_W) '$(srcdir)/pcre_jit_test.c'; fi`
-
-pcregrep-pcregrep.o: pcregrep.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcregrep_CFLAGS) $(CFLAGS) -MT pcregrep-pcregrep.o -MD -MP -MF $(DEPDIR)/pcregrep-pcregrep.Tpo -c -o pcregrep-pcregrep.o `test -f 'pcregrep.c' || echo '$(srcdir)/'`pcregrep.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/pcregrep-pcregrep.Tpo $(DEPDIR)/pcregrep-pcregrep.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pcregrep.c' object='pcregrep-pcregrep.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcregrep_CFLAGS) $(CFLAGS) -c -o pcregrep-pcregrep.o `test -f 'pcregrep.c' || echo '$(srcdir)/'`pcregrep.c
-
-pcregrep-pcregrep.obj: pcregrep.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcregrep_CFLAGS) $(CFLAGS) -MT pcregrep-pcregrep.obj -MD -MP -MF $(DEPDIR)/pcregrep-pcregrep.Tpo -c -o pcregrep-pcregrep.obj `if test -f 'pcregrep.c'; then $(CYGPATH_W) 'pcregrep.c'; else $(CYGPATH_W) '$(srcdir)/pcregrep.c'; fi`
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/pcregrep-pcregrep.Tpo $(DEPDIR)/pcregrep-pcregrep.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pcregrep.c' object='pcregrep-pcregrep.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcregrep_CFLAGS) $(CFLAGS) -c -o pcregrep-pcregrep.obj `if test -f 'pcregrep.c'; then $(CYGPATH_W) 'pcregrep.c'; else $(CYGPATH_W) '$(srcdir)/pcregrep.c'; fi`
-
-pcretest-pcretest.o: pcretest.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcretest_CFLAGS) $(CFLAGS) -MT pcretest-pcretest.o -MD -MP -MF $(DEPDIR)/pcretest-pcretest.Tpo -c -o pcretest-pcretest.o `test -f 'pcretest.c' || echo '$(srcdir)/'`pcretest.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/pcretest-pcretest.Tpo $(DEPDIR)/pcretest-pcretest.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pcretest.c' object='pcretest-pcretest.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcretest_CFLAGS) $(CFLAGS) -c -o pcretest-pcretest.o `test -f 'pcretest.c' || echo '$(srcdir)/'`pcretest.c
-
-pcretest-pcretest.obj: pcretest.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcretest_CFLAGS) $(CFLAGS) -MT pcretest-pcretest.obj -MD -MP -MF $(DEPDIR)/pcretest-pcretest.Tpo -c -o pcretest-pcretest.obj `if test -f 'pcretest.c'; then $(CYGPATH_W) 'pcretest.c'; else $(CYGPATH_W) '$(srcdir)/pcretest.c'; fi`
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/pcretest-pcretest.Tpo $(DEPDIR)/pcretest-pcretest.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pcretest.c' object='pcretest-pcretest.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcretest_CFLAGS) $(CFLAGS) -c -o pcretest-pcretest.obj `if test -f 'pcretest.c'; then $(CYGPATH_W) 'pcretest.c'; else $(CYGPATH_W) '$(srcdir)/pcretest.c'; fi`
-
-pcretest-pcre_printint.o: pcre_printint.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcretest_CFLAGS) $(CFLAGS) -MT pcretest-pcre_printint.o -MD -MP -MF $(DEPDIR)/pcretest-pcre_printint.Tpo -c -o pcretest-pcre_printint.o `test -f 'pcre_printint.c' || echo '$(srcdir)/'`pcre_printint.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/pcretest-pcre_printint.Tpo $(DEPDIR)/pcretest-pcre_printint.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pcre_printint.c' object='pcretest-pcre_printint.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcretest_CFLAGS) $(CFLAGS) -c -o pcretest-pcre_printint.o `test -f 'pcre_printint.c' || echo '$(srcdir)/'`pcre_printint.c
-
-pcretest-pcre_printint.obj: pcre_printint.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcretest_CFLAGS) $(CFLAGS) -MT pcretest-pcre_printint.obj -MD -MP -MF $(DEPDIR)/pcretest-pcre_printint.Tpo -c -o pcretest-pcre_printint.obj `if test -f 'pcre_printint.c'; then $(CYGPATH_W) 'pcre_printint.c'; else $(CYGPATH_W) '$(srcdir)/pcre_printint.c'; fi`
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/pcretest-pcre_printint.Tpo $(DEPDIR)/pcretest-pcre_printint.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pcre_printint.c' object='pcretest-pcre_printint.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcretest_CFLAGS) $(CFLAGS) -c -o pcretest-pcre_printint.obj `if test -f 'pcre_printint.c'; then $(CYGPATH_W) 'pcre_printint.c'; else $(CYGPATH_W) '$(srcdir)/pcre_printint.c'; fi`
-
-pcretest-pcre16_printint.o: pcre16_printint.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcretest_CFLAGS) $(CFLAGS) -MT pcretest-pcre16_printint.o -MD -MP -MF $(DEPDIR)/pcretest-pcre16_printint.Tpo -c -o pcretest-pcre16_printint.o `test -f 'pcre16_printint.c' || echo '$(srcdir)/'`pcre16_printint.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/pcretest-pcre16_printint.Tpo $(DEPDIR)/pcretest-pcre16_printint.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pcre16_printint.c' object='pcretest-pcre16_printint.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcretest_CFLAGS) $(CFLAGS) -c -o pcretest-pcre16_printint.o `test -f 'pcre16_printint.c' || echo '$(srcdir)/'`pcre16_printint.c
-
-pcretest-pcre16_printint.obj: pcre16_printint.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcretest_CFLAGS) $(CFLAGS) -MT pcretest-pcre16_printint.obj -MD -MP -MF $(DEPDIR)/pcretest-pcre16_printint.Tpo -c -o pcretest-pcre16_printint.obj `if test -f 'pcre16_printint.c'; then $(CYGPATH_W) 'pcre16_printint.c'; else $(CYGPATH_W) '$(srcdir)/pcre16_printint.c'; fi`
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/pcretest-pcre16_printint.Tpo $(DEPDIR)/pcretest-pcre16_printint.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pcre16_printint.c' object='pcretest-pcre16_printint.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcretest_CFLAGS) $(CFLAGS) -c -o pcretest-pcre16_printint.obj `if test -f 'pcre16_printint.c'; then $(CYGPATH_W) 'pcre16_printint.c'; else $(CYGPATH_W) '$(srcdir)/pcre16_printint.c'; fi`
-
-pcretest-pcre32_printint.o: pcre32_printint.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcretest_CFLAGS) $(CFLAGS) -MT pcretest-pcre32_printint.o -MD -MP -MF $(DEPDIR)/pcretest-pcre32_printint.Tpo -c -o pcretest-pcre32_printint.o `test -f 'pcre32_printint.c' || echo '$(srcdir)/'`pcre32_printint.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/pcretest-pcre32_printint.Tpo $(DEPDIR)/pcretest-pcre32_printint.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pcre32_printint.c' object='pcretest-pcre32_printint.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcretest_CFLAGS) $(CFLAGS) -c -o pcretest-pcre32_printint.o `test -f 'pcre32_printint.c' || echo '$(srcdir)/'`pcre32_printint.c
-
-pcretest-pcre32_printint.obj: pcre32_printint.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcretest_CFLAGS) $(CFLAGS) -MT pcretest-pcre32_printint.obj -MD -MP -MF $(DEPDIR)/pcretest-pcre32_printint.Tpo -c -o pcretest-pcre32_printint.obj `if test -f 'pcre32_printint.c'; then $(CYGPATH_W) 'pcre32_printint.c'; else $(CYGPATH_W) '$(srcdir)/pcre32_printint.c'; fi`
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/pcretest-pcre32_printint.Tpo $(DEPDIR)/pcretest-pcre32_printint.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='pcre32_printint.c' object='pcretest-pcre32_printint.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcretest_CFLAGS) $(CFLAGS) -c -o pcretest-pcre32_printint.obj `if test -f 'pcre32_printint.c'; then $(CYGPATH_W) 'pcre32_printint.c'; else $(CYGPATH_W) '$(srcdir)/pcre32_printint.c'; fi`
-
-.cc.o:
-@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<
-
-.cc.obj:
-@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
-@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
-
-.cc.lo:
-@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
-
-libpcrecpp_la-pcrecpp.lo: pcrecpp.cc
-@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcrecpp_la_CXXFLAGS) $(CXXFLAGS) -MT libpcrecpp_la-pcrecpp.lo -MD -MP -MF $(DEPDIR)/libpcrecpp_la-pcrecpp.Tpo -c -o libpcrecpp_la-pcrecpp.lo `test -f 'pcrecpp.cc' || echo '$(srcdir)/'`pcrecpp.cc
-@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libpcrecpp_la-pcrecpp.Tpo $(DEPDIR)/libpcrecpp_la-pcrecpp.Plo
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='pcrecpp.cc' object='libpcrecpp_la-pcrecpp.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcrecpp_la_CXXFLAGS) $(CXXFLAGS) -c -o libpcrecpp_la-pcrecpp.lo `test -f 'pcrecpp.cc' || echo '$(srcdir)/'`pcrecpp.cc
-
-libpcrecpp_la-pcre_scanner.lo: pcre_scanner.cc
-@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcrecpp_la_CXXFLAGS) $(CXXFLAGS) -MT libpcrecpp_la-pcre_scanner.lo -MD -MP -MF $(DEPDIR)/libpcrecpp_la-pcre_scanner.Tpo -c -o libpcrecpp_la-pcre_scanner.lo `test -f 'pcre_scanner.cc' || echo '$(srcdir)/'`pcre_scanner.cc
-@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libpcrecpp_la-pcre_scanner.Tpo $(DEPDIR)/libpcrecpp_la-pcre_scanner.Plo
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='pcre_scanner.cc' object='libpcrecpp_la-pcre_scanner.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcrecpp_la_CXXFLAGS) $(CXXFLAGS) -c -o libpcrecpp_la-pcre_scanner.lo `test -f 'pcre_scanner.cc' || echo '$(srcdir)/'`pcre_scanner.cc
-
-libpcrecpp_la-pcre_stringpiece.lo: pcre_stringpiece.cc
-@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcrecpp_la_CXXFLAGS) $(CXXFLAGS) -MT libpcrecpp_la-pcre_stringpiece.lo -MD -MP -MF $(DEPDIR)/libpcrecpp_la-pcre_stringpiece.Tpo -c -o libpcrecpp_la-pcre_stringpiece.lo `test -f 'pcre_stringpiece.cc' || echo '$(srcdir)/'`pcre_stringpiece.cc
-@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libpcrecpp_la-pcre_stringpiece.Tpo $(DEPDIR)/libpcrecpp_la-pcre_stringpiece.Plo
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='pcre_stringpiece.cc' object='libpcrecpp_la-pcre_stringpiece.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcrecpp_la_CXXFLAGS) $(CXXFLAGS) -c -o libpcrecpp_la-pcre_stringpiece.lo `test -f 'pcre_stringpiece.cc' || echo '$(srcdir)/'`pcre_stringpiece.cc
-
-pcre_scanner_unittest-pcre_scanner_unittest.o: pcre_scanner_unittest.cc
-@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcre_scanner_unittest_CXXFLAGS) $(CXXFLAGS) -MT pcre_scanner_unittest-pcre_scanner_unittest.o -MD -MP -MF $(DEPDIR)/pcre_scanner_unittest-pcre_scanner_unittest.Tpo -c -o pcre_scanner_unittest-pcre_scanner_unittest.o `test -f 'pcre_scanner_unittest.cc' || echo '$(srcdir)/'`pcre_scanner_unittest.cc
-@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/pcre_scanner_unittest-pcre_scanner_unittest.Tpo $(DEPDIR)/pcre_scanner_unittest-pcre_scanner_unittest.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='pcre_scanner_unittest.cc' object='pcre_scanner_unittest-pcre_scanner_unittest.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcre_scanner_unittest_CXXFLAGS) $(CXXFLAGS) -c -o pcre_scanner_unittest-pcre_scanner_unittest.o `test -f 'pcre_scanner_unittest.cc' || echo '$(srcdir)/'`pcre_scanner_unittest.cc
-
-pcre_scanner_unittest-pcre_scanner_unittest.obj: pcre_scanner_unittest.cc
-@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcre_scanner_unittest_CXXFLAGS) $(CXXFLAGS) -MT pcre_scanner_unittest-pcre_scanner_unittest.obj -MD -MP -MF $(DEPDIR)/pcre_scanner_unittest-pcre_scanner_unittest.Tpo -c -o pcre_scanner_unittest-pcre_scanner_unittest.obj `if test -f 'pcre_scanner_unittest.cc'; then $(CYGPATH_W) 'pcre_scanner_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/pcre_scanner_unittest.cc'; fi`
-@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/pcre_scanner_unittest-pcre_scanner_unittest.Tpo $(DEPDIR)/pcre_scanner_unittest-pcre_scanner_unittest.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='pcre_scanner_unittest.cc' object='pcre_scanner_unittest-pcre_scanner_unittest.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcre_scanner_unittest_CXXFLAGS) $(CXXFLAGS) -c -o pcre_scanner_unittest-pcre_scanner_unittest.obj `if test -f 'pcre_scanner_unittest.cc'; then $(CYGPATH_W) 'pcre_scanner_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/pcre_scanner_unittest.cc'; fi`
-
-pcre_stringpiece_unittest-pcre_stringpiece_unittest.o: pcre_stringpiece_unittest.cc
-@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcre_stringpiece_unittest_CXXFLAGS) $(CXXFLAGS) -MT pcre_stringpiece_unittest-pcre_stringpiece_unittest.o -MD -MP -MF $(DEPDIR)/pcre_stringpiece_unittest-pcre_stringpiece_unittest.Tpo -c -o pcre_stringpiece_unittest-pcre_stringpiece_unittest.o `test -f 'pcre_stringpiece_unittest.cc' || echo '$(srcdir)/'`pcre_stringpiece_unittest.cc
-@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/pcre_stringpiece_unittest-pcre_stringpiece_unittest.Tpo $(DEPDIR)/pcre_stringpiece_unittest-pcre_stringpiece_unittest.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='pcre_stringpiece_unittest.cc' object='pcre_stringpiece_unittest-pcre_stringpiece_unittest.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcre_stringpiece_unittest_CXXFLAGS) $(CXXFLAGS) -c -o pcre_stringpiece_unittest-pcre_stringpiece_unittest.o `test -f 'pcre_stringpiece_unittest.cc' || echo '$(srcdir)/'`pcre_stringpiece_unittest.cc
-
-pcre_stringpiece_unittest-pcre_stringpiece_unittest.obj: pcre_stringpiece_unittest.cc
-@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcre_stringpiece_unittest_CXXFLAGS) $(CXXFLAGS) -MT pcre_stringpiece_unittest-pcre_stringpiece_unittest.obj -MD -MP -MF $(DEPDIR)/pcre_stringpiece_unittest-pcre_stringpiece_unittest.Tpo -c -o pcre_stringpiece_unittest-pcre_stringpiece_unittest.obj `if test -f 'pcre_stringpiece_unittest.cc'; then $(CYGPATH_W) 'pcre_stringpiece_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/pcre_stringpiece_unittest.cc'; fi`
-@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/pcre_stringpiece_unittest-pcre_stringpiece_unittest.Tpo $(DEPDIR)/pcre_stringpiece_unittest-pcre_stringpiece_unittest.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='pcre_stringpiece_unittest.cc' object='pcre_stringpiece_unittest-pcre_stringpiece_unittest.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcre_stringpiece_unittest_CXXFLAGS) $(CXXFLAGS) -c -o pcre_stringpiece_unittest-pcre_stringpiece_unittest.obj `if test -f 'pcre_stringpiece_unittest.cc'; then $(CYGPATH_W) 'pcre_stringpiece_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/pcre_stringpiece_unittest.cc'; fi`
-
-pcrecpp_unittest-pcrecpp_unittest.o: pcrecpp_unittest.cc
-@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcrecpp_unittest_CXXFLAGS) $(CXXFLAGS) -MT pcrecpp_unittest-pcrecpp_unittest.o -MD -MP -MF $(DEPDIR)/pcrecpp_unittest-pcrecpp_unittest.Tpo -c -o pcrecpp_unittest-pcrecpp_unittest.o `test -f 'pcrecpp_unittest.cc' || echo '$(srcdir)/'`pcrecpp_unittest.cc
-@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/pcrecpp_unittest-pcrecpp_unittest.Tpo $(DEPDIR)/pcrecpp_unittest-pcrecpp_unittest.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='pcrecpp_unittest.cc' object='pcrecpp_unittest-pcrecpp_unittest.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcrecpp_unittest_CXXFLAGS) $(CXXFLAGS) -c -o pcrecpp_unittest-pcrecpp_unittest.o `test -f 'pcrecpp_unittest.cc' || echo '$(srcdir)/'`pcrecpp_unittest.cc
-
-pcrecpp_unittest-pcrecpp_unittest.obj: pcrecpp_unittest.cc
-@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcrecpp_unittest_CXXFLAGS) $(CXXFLAGS) -MT pcrecpp_unittest-pcrecpp_unittest.obj -MD -MP -MF $(DEPDIR)/pcrecpp_unittest-pcrecpp_unittest.Tpo -c -o pcrecpp_unittest-pcrecpp_unittest.obj `if test -f 'pcrecpp_unittest.cc'; then $(CYGPATH_W) 'pcrecpp_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/pcrecpp_unittest.cc'; fi`
-@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/pcrecpp_unittest-pcrecpp_unittest.Tpo $(DEPDIR)/pcrecpp_unittest-pcrecpp_unittest.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='pcrecpp_unittest.cc' object='pcrecpp_unittest-pcrecpp_unittest.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcrecpp_unittest_CXXFLAGS) $(CXXFLAGS) -c -o pcrecpp_unittest-pcrecpp_unittest.obj `if test -f 'pcrecpp_unittest.cc'; then $(CYGPATH_W) 'pcrecpp_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/pcrecpp_unittest.cc'; fi`
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-
-distclean-libtool:
-	-rm -f libtool config.lt
-install-man1: $(dist_man_MANS) $(man_MANS)
-	@$(NORMAL_INSTALL)
-	@list1=''; \
-	list2='$(dist_man_MANS) $(man_MANS)'; \
-	test -n "$(man1dir)" \
-	  && test -n "`echo $$list1$$list2`" \
-	  || exit 0; \
-	echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \
-	$(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \
-	{ for i in $$list1; do echo "$$i"; done;  \
-	if test -n "$$list2"; then \
-	  for i in $$list2; do echo "$$i"; done \
-	    | sed -n '/\.1[a-z]*$$/p'; \
-	fi; \
-	} | while read p; do \
-	  if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; echo "$$p"; \
-	done | \
-	sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
-	      -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \
-	sed 'N;N;s,\n, ,g' | { \
-	list=; while read file base inst; do \
-	  if test "$$base" = "$$inst"; then list="$$list $$file"; else \
-	    echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \
-	    $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \
-	  fi; \
-	done; \
-	for i in $$list; do echo "$$i"; done | $(am__base_list) | \
-	while read files; do \
-	  test -z "$$files" || { \
-	    echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \
-	    $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \
-	done; }
-
-uninstall-man1:
-	@$(NORMAL_UNINSTALL)
-	@list=''; test -n "$(man1dir)" || exit 0; \
-	files=`{ for i in $$list; do echo "$$i"; done; \
-	l2='$(dist_man_MANS) $(man_MANS)'; for i in $$l2; do echo "$$i"; done | \
-	  sed -n '/\.1[a-z]*$$/p'; \
-	} | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
-	      -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
-	dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir)
-install-man3: $(dist_man_MANS) $(man_MANS)
-	@$(NORMAL_INSTALL)
-	@list1=''; \
-	list2='$(dist_man_MANS) $(man_MANS)'; \
-	test -n "$(man3dir)" \
-	  && test -n "`echo $$list1$$list2`" \
-	  || exit 0; \
-	echo " $(MKDIR_P) '$(DESTDIR)$(man3dir)'"; \
-	$(MKDIR_P) "$(DESTDIR)$(man3dir)" || exit 1; \
-	{ for i in $$list1; do echo "$$i"; done;  \
-	if test -n "$$list2"; then \
-	  for i in $$list2; do echo "$$i"; done \
-	    | sed -n '/\.3[a-z]*$$/p'; \
-	fi; \
-	} | while read p; do \
-	  if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; echo "$$p"; \
-	done | \
-	sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^3][0-9a-z]*$$,3,;x' \
-	      -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \
-	sed 'N;N;s,\n, ,g' | { \
-	list=; while read file base inst; do \
-	  if test "$$base" = "$$inst"; then list="$$list $$file"; else \
-	    echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man3dir)/$$inst'"; \
-	    $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man3dir)/$$inst" || exit $$?; \
-	  fi; \
-	done; \
-	for i in $$list; do echo "$$i"; done | $(am__base_list) | \
-	while read files; do \
-	  test -z "$$files" || { \
-	    echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man3dir)'"; \
-	    $(INSTALL_DATA) $$files "$(DESTDIR)$(man3dir)" || exit $$?; }; \
-	done; }
-
-uninstall-man3:
-	@$(NORMAL_UNINSTALL)
-	@list=''; test -n "$(man3dir)" || exit 0; \
-	files=`{ for i in $$list; do echo "$$i"; done; \
-	l2='$(dist_man_MANS) $(man_MANS)'; for i in $$l2; do echo "$$i"; done | \
-	  sed -n '/\.3[a-z]*$$/p'; \
-	} | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^3][0-9a-z]*$$,3,;x' \
-	      -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
-	dir='$(DESTDIR)$(man3dir)'; $(am__uninstall_files_from_dir)
-install-dist_docDATA: $(dist_doc_DATA)
-	@$(NORMAL_INSTALL)
-	@list='$(dist_doc_DATA)'; test -n "$(docdir)" || list=; \
-	if test -n "$$list"; then \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(docdir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(docdir)" || exit 1; \
-	fi; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(docdir)'"; \
-	  $(INSTALL_DATA) $$files "$(DESTDIR)$(docdir)" || exit $$?; \
-	done
-
-uninstall-dist_docDATA:
-	@$(NORMAL_UNINSTALL)
-	@list='$(dist_doc_DATA)'; test -n "$(docdir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	dir='$(DESTDIR)$(docdir)'; $(am__uninstall_files_from_dir)
-install-dist_htmlDATA: $(dist_html_DATA)
-	@$(NORMAL_INSTALL)
-	@list='$(dist_html_DATA)'; test -n "$(htmldir)" || list=; \
-	if test -n "$$list"; then \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(htmldir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(htmldir)" || exit 1; \
-	fi; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(htmldir)'"; \
-	  $(INSTALL_DATA) $$files "$(DESTDIR)$(htmldir)" || exit $$?; \
-	done
-
-uninstall-dist_htmlDATA:
-	@$(NORMAL_UNINSTALL)
-	@list='$(dist_html_DATA)'; test -n "$(htmldir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	dir='$(DESTDIR)$(htmldir)'; $(am__uninstall_files_from_dir)
-install-htmlDATA: $(html_DATA)
-	@$(NORMAL_INSTALL)
-	@list='$(html_DATA)'; test -n "$(htmldir)" || list=; \
-	if test -n "$$list"; then \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(htmldir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(htmldir)" || exit 1; \
-	fi; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(htmldir)'"; \
-	  $(INSTALL_DATA) $$files "$(DESTDIR)$(htmldir)" || exit $$?; \
-	done
-
-uninstall-htmlDATA:
-	@$(NORMAL_UNINSTALL)
-	@list='$(html_DATA)'; test -n "$(htmldir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	dir='$(DESTDIR)$(htmldir)'; $(am__uninstall_files_from_dir)
-install-pkgconfigDATA: $(pkgconfig_DATA)
-	@$(NORMAL_INSTALL)
-	@list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \
-	if test -n "$$list"; then \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(pkgconfigdir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" || exit 1; \
-	fi; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \
-	  $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \
-	done
-
-uninstall-pkgconfigDATA:
-	@$(NORMAL_UNINSTALL)
-	@list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	dir='$(DESTDIR)$(pkgconfigdir)'; $(am__uninstall_files_from_dir)
-install-includeHEADERS: $(include_HEADERS)
-	@$(NORMAL_INSTALL)
-	@list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \
-	if test -n "$$list"; then \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(includedir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(includedir)" || exit 1; \
-	fi; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includedir)'"; \
-	  $(INSTALL_HEADER) $$files "$(DESTDIR)$(includedir)" || exit $$?; \
-	done
-
-uninstall-includeHEADERS:
-	@$(NORMAL_UNINSTALL)
-	@list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir)
-install-nodist_includeHEADERS: $(nodist_include_HEADERS)
-	@$(NORMAL_INSTALL)
-	@list='$(nodist_include_HEADERS)'; test -n "$(includedir)" || list=; \
-	if test -n "$$list"; then \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(includedir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(includedir)" || exit 1; \
-	fi; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includedir)'"; \
-	  $(INSTALL_HEADER) $$files "$(DESTDIR)$(includedir)" || exit $$?; \
-	done
-
-uninstall-nodist_includeHEADERS:
-	@$(NORMAL_UNINSTALL)
-	@list='$(nodist_include_HEADERS)'; test -n "$(includedir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir)
-
-ID: $(am__tagged_files)
-	$(am__define_uniq_tagged_files); mkid -fID $$unique
-tags: tags-am
-TAGS: tags
-
-tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
-	set x; \
-	here=`pwd`; \
-	$(am__define_uniq_tagged_files); \
-	shift; \
-	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
-	  test -n "$$unique" || unique=$$empty_fix; \
-	  if test $$# -gt 0; then \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      "$$@" $$unique; \
-	  else \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      $$unique; \
-	  fi; \
-	fi
-ctags: ctags-am
-
-CTAGS: ctags
-ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
-	$(am__define_uniq_tagged_files); \
-	test -z "$(CTAGS_ARGS)$$unique" \
-	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$unique
-
-GTAGS:
-	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && $(am__cd) $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) "$$here"
-cscope: cscope.files
-	test ! -s cscope.files \
-	  || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS)
-clean-cscope:
-	-rm -f cscope.files
-cscope.files: clean-cscope cscopelist
-cscopelist: cscopelist-am
-
-cscopelist-am: $(am__tagged_files)
-	list='$(am__tagged_files)'; \
-	case "$(srcdir)" in \
-	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
-	  *) sdir=$(subdir)/$(srcdir) ;; \
-	esac; \
-	for i in $$list; do \
-	  if test -f "$$i"; then \
-	    echo "$(subdir)/$$i"; \
-	  else \
-	    echo "$$sdir/$$i"; \
-	  fi; \
-	done >> $(top_builddir)/cscope.files
-
-distclean-tags:
-	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-	-rm -f cscope.out cscope.in.out cscope.po.out cscope.files
-
-# Recover from deleted '.trs' file; this should ensure that
-# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
-# both 'foo.log' and 'foo.trs'.  Break the recipe in two subshells
-# to avoid problems with "make -n".
-.log.trs:
-	rm -f $< $@
-	$(MAKE) $(AM_MAKEFLAGS) $<
-
-# Leading 'am--fnord' is there to ensure the list of targets does not
-# expand to empty, as could happen e.g. with make check TESTS=''.
-am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
-am--force-recheck:
-	@:
-
-$(TEST_SUITE_LOG): $(TEST_LOGS)
-	@$(am__set_TESTS_bases); \
-	am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
-	redo_bases=`for i in $$bases; do \
-	              am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
-	            done`; \
-	if test -n "$$redo_bases"; then \
-	  redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
-	  redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
-	  if $(am__make_dryrun); then :; else \
-	    rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
-	  fi; \
-	fi; \
-	if test -n "$$am__remaking_logs"; then \
-	  echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
-	       "recursion detected" >&2; \
-	elif test -n "$$redo_logs"; then \
-	  am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
-	fi; \
-	if $(am__make_dryrun); then :; else \
-	  st=0;  \
-	  errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
-	  for i in $$redo_bases; do \
-	    test -f $$i.trs && test -r $$i.trs \
-	      || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
-	    test -f $$i.log && test -r $$i.log \
-	      || { echo "$$errmsg $$i.log" >&2; st=1; }; \
-	  done; \
-	  test $$st -eq 0 || exit 1; \
-	fi
-	@$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
-	ws='[ 	]'; \
-	results=`for b in $$bases; do echo $$b.trs; done`; \
-	test -n "$$results" || results=/dev/null; \
-	all=`  grep "^$$ws*:test-result:"           $$results | wc -l`; \
-	pass=` grep "^$$ws*:test-result:$$ws*PASS"  $$results | wc -l`; \
-	fail=` grep "^$$ws*:test-result:$$ws*FAIL"  $$results | wc -l`; \
-	skip=` grep "^$$ws*:test-result:$$ws*SKIP"  $$results | wc -l`; \
-	xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
-	xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
-	error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
-	if test `expr $$fail + $$xpass + $$error` -eq 0; then \
-	  success=true; \
-	else \
-	  success=false; \
-	fi; \
-	br='==================='; br=$$br$$br$$br$$br; \
-	result_count () \
-	{ \
-	    if test x"$$1" = x"--maybe-color"; then \
-	      maybe_colorize=yes; \
-	    elif test x"$$1" = x"--no-color"; then \
-	      maybe_colorize=no; \
-	    else \
-	      echo "$@: invalid 'result_count' usage" >&2; exit 4; \
-	    fi; \
-	    shift; \
-	    desc=$$1 count=$$2; \
-	    if test $$maybe_colorize = yes && test $$count -gt 0; then \
-	      color_start=$$3 color_end=$$std; \
-	    else \
-	      color_start= color_end=; \
-	    fi; \
-	    echo "$${color_start}# $$desc $$count$${color_end}"; \
-	}; \
-	create_testsuite_report () \
-	{ \
-	  result_count $$1 "TOTAL:" $$all   "$$brg"; \
-	  result_count $$1 "PASS: " $$pass  "$$grn"; \
-	  result_count $$1 "SKIP: " $$skip  "$$blu"; \
-	  result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
-	  result_count $$1 "FAIL: " $$fail  "$$red"; \
-	  result_count $$1 "XPASS:" $$xpass "$$red"; \
-	  result_count $$1 "ERROR:" $$error "$$mgn"; \
-	}; \
-	{								\
-	  echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" |	\
-	    $(am__rst_title);						\
-	  create_testsuite_report --no-color;				\
-	  echo;								\
-	  echo ".. contents:: :depth: 2";				\
-	  echo;								\
-	  for b in $$bases; do echo $$b; done				\
-	    | $(am__create_global_log);					\
-	} >$(TEST_SUITE_LOG).tmp || exit 1;				\
-	mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG);			\
-	if $$success; then						\
-	  col="$$grn";							\
-	 else								\
-	  col="$$red";							\
-	  test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG);		\
-	fi;								\
-	echo "$${col}$$br$${std}"; 					\
-	echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}";	\
-	echo "$${col}$$br$${std}"; 					\
-	create_testsuite_report --maybe-color;				\
-	echo "$$col$$br$$std";						\
-	if $$success; then :; else					\
-	  echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}";		\
-	  if test -n "$(PACKAGE_BUGREPORT)"; then			\
-	    echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}";	\
-	  fi;								\
-	  echo "$$col$$br$$std";					\
-	fi;								\
-	$$success || exit 1
-
-check-TESTS:
-	@list='$(RECHECK_LOGS)';           test -z "$$list" || rm -f $$list
-	@list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
-	@test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
-	@set +e; $(am__set_TESTS_bases); \
-	log_list=`for i in $$bases; do echo $$i.log; done`; \
-	trs_list=`for i in $$bases; do echo $$i.trs; done`; \
-	log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
-	$(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
-	exit $$?;
-recheck: all $(check_SCRIPTS)
-	@test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
-	@set +e; $(am__set_TESTS_bases); \
-	bases=`for i in $$bases; do echo $$i; done \
-	         | $(am__list_recheck_tests)` || exit 1; \
-	log_list=`for i in $$bases; do echo $$i.log; done`; \
-	log_list=`echo $$log_list`; \
-	$(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
-	        am__force_recheck=am--force-recheck \
-	        TEST_LOGS="$$log_list"; \
-	exit $$?
-pcre_jit_test.log: pcre_jit_test$(EXEEXT)
-	@p='pcre_jit_test$(EXEEXT)'; \
-	b='pcre_jit_test'; \
-	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
-	--log-file $$b.log --trs-file $$b.trs \
-	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
-	"$$tst" $(AM_TESTS_FD_REDIRECT)
-pcrecpp_unittest.log: pcrecpp_unittest$(EXEEXT)
-	@p='pcrecpp_unittest$(EXEEXT)'; \
-	b='pcrecpp_unittest'; \
-	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
-	--log-file $$b.log --trs-file $$b.trs \
-	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
-	"$$tst" $(AM_TESTS_FD_REDIRECT)
-pcre_scanner_unittest.log: pcre_scanner_unittest$(EXEEXT)
-	@p='pcre_scanner_unittest$(EXEEXT)'; \
-	b='pcre_scanner_unittest'; \
-	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
-	--log-file $$b.log --trs-file $$b.trs \
-	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
-	"$$tst" $(AM_TESTS_FD_REDIRECT)
-pcre_stringpiece_unittest.log: pcre_stringpiece_unittest$(EXEEXT)
-	@p='pcre_stringpiece_unittest$(EXEEXT)'; \
-	b='pcre_stringpiece_unittest'; \
-	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
-	--log-file $$b.log --trs-file $$b.trs \
-	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
-	"$$tst" $(AM_TESTS_FD_REDIRECT)
-RunTest.log: RunTest
-	@p='RunTest'; \
-	b='RunTest'; \
-	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
-	--log-file $$b.log --trs-file $$b.trs \
-	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
-	"$$tst" $(AM_TESTS_FD_REDIRECT)
-RunGrepTest.log: RunGrepTest
-	@p='RunGrepTest'; \
-	b='RunGrepTest'; \
-	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
-	--log-file $$b.log --trs-file $$b.trs \
-	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
-	"$$tst" $(AM_TESTS_FD_REDIRECT)
-.test.log:
-	@p='$<'; \
-	$(am__set_b); \
-	$(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
-	--log-file $$b.log --trs-file $$b.trs \
-	$(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
-	"$$tst" $(AM_TESTS_FD_REDIRECT)
-@am__EXEEXT_TRUE@.test$(EXEEXT).log:
-@am__EXEEXT_TRUE@	@p='$<'; \
-@am__EXEEXT_TRUE@	$(am__set_b); \
-@am__EXEEXT_TRUE@	$(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
-@am__EXEEXT_TRUE@	--log-file $$b.log --trs-file $$b.trs \
-@am__EXEEXT_TRUE@	$(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
-@am__EXEEXT_TRUE@	"$$tst" $(AM_TESTS_FD_REDIRECT)
-
-distdir: $(DISTFILES)
-	$(am__remove_distdir)
-	test -d "$(distdir)" || mkdir "$(distdir)"
-	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	list='$(DISTFILES)'; \
-	  dist_files=`for file in $$list; do echo $$file; done | \
-	  sed -e "s|^$$srcdirstrip/||;t" \
-	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-	case $$dist_files in \
-	  */*) $(MKDIR_P) `echo "$$dist_files" | \
-			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-			   sort -u` ;; \
-	esac; \
-	for file in $$dist_files; do \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  if test -d $$d/$$file; then \
-	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-	    if test -d "$(distdir)/$$file"; then \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
-	  else \
-	    test -f "$(distdir)/$$file" \
-	    || cp -p $$d/$$file "$(distdir)/$$file" \
-	    || exit 1; \
-	  fi; \
-	done
-	-test -n "$(am__skip_mode_fix)" \
-	|| find "$(distdir)" -type d ! -perm -755 \
-		-exec chmod u+rwx,go+rx {} \; -o \
-	  ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
-	  ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
-	  ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
-	|| chmod -R a+r "$(distdir)"
-dist-gzip: distdir
-	tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
-	$(am__post_remove_distdir)
-dist-bzip2: distdir
-	tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2
-	$(am__post_remove_distdir)
-
-dist-lzip: distdir
-	tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz
-	$(am__post_remove_distdir)
-
-dist-xz: distdir
-	tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz
-	$(am__post_remove_distdir)
-
-dist-tarZ: distdir
-	@echo WARNING: "Support for distribution archives compressed with" \
-		       "legacy program 'compress' is deprecated." >&2
-	@echo WARNING: "It will be removed altogether in Automake 2.0" >&2
-	tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
-	$(am__post_remove_distdir)
-
-dist-shar: distdir
-	@echo WARNING: "Support for shar distribution archives is" \
-	               "deprecated." >&2
-	@echo WARNING: "It will be removed altogether in Automake 2.0" >&2
-	shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
-	$(am__post_remove_distdir)
-dist-zip: distdir
-	-rm -f $(distdir).zip
-	zip -rq $(distdir).zip $(distdir)
-	$(am__post_remove_distdir)
-
-dist dist-all:
-	$(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:'
-	$(am__post_remove_distdir)
-
-# This target untars the dist file and tries a VPATH configuration.  Then
-# it guarantees that the distribution is self-contained by making another
-# tarfile.
-distcheck: dist
-	case '$(DIST_ARCHIVES)' in \
-	*.tar.gz*) \
-	  GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\
-	*.tar.bz2*) \
-	  bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
-	*.tar.lz*) \
-	  lzip -dc $(distdir).tar.lz | $(am__untar) ;;\
-	*.tar.xz*) \
-	  xz -dc $(distdir).tar.xz | $(am__untar) ;;\
-	*.tar.Z*) \
-	  uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
-	*.shar.gz*) \
-	  GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\
-	*.zip*) \
-	  unzip $(distdir).zip ;;\
-	esac
-	chmod -R a-w $(distdir)
-	chmod u+w $(distdir)
-	mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst
-	chmod a-w $(distdir)
-	test -d $(distdir)/_build || exit 0; \
-	dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
-	  && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
-	  && am__cwd=`pwd` \
-	  && $(am__cd) $(distdir)/_build/sub \
-	  && ../../configure \
-	    $(AM_DISTCHECK_CONFIGURE_FLAGS) \
-	    $(DISTCHECK_CONFIGURE_FLAGS) \
-	    --srcdir=../.. --prefix="$$dc_install_base" \
-	  && $(MAKE) $(AM_MAKEFLAGS) \
-	  && $(MAKE) $(AM_MAKEFLAGS) dvi \
-	  && $(MAKE) $(AM_MAKEFLAGS) check \
-	  && $(MAKE) $(AM_MAKEFLAGS) install \
-	  && $(MAKE) $(AM_MAKEFLAGS) installcheck \
-	  && $(MAKE) $(AM_MAKEFLAGS) uninstall \
-	  && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
-	        distuninstallcheck \
-	  && chmod -R a-w "$$dc_install_base" \
-	  && ({ \
-	       (cd ../.. && umask 077 && mkdir "$$dc_destdir") \
-	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
-	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
-	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
-	            distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
-	      } || { rm -rf "$$dc_destdir"; exit 1; }) \
-	  && rm -rf "$$dc_destdir" \
-	  && $(MAKE) $(AM_MAKEFLAGS) dist \
-	  && rm -rf $(DIST_ARCHIVES) \
-	  && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \
-	  && cd "$$am__cwd" \
-	  || exit 1
-	$(am__post_remove_distdir)
-	@(echo "$(distdir) archives ready for distribution: "; \
-	  list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
-	  sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
-distuninstallcheck:
-	@test -n '$(distuninstallcheck_dir)' || { \
-	  echo 'ERROR: trying to run $@ with an empty' \
-	       '$$(distuninstallcheck_dir)' >&2; \
-	  exit 1; \
-	}; \
-	$(am__cd) '$(distuninstallcheck_dir)' || { \
-	  echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \
-	  exit 1; \
-	}; \
-	test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \
-	   || { echo "ERROR: files left after uninstall:" ; \
-	        if test -n "$(DESTDIR)"; then \
-	          echo "  (check DESTDIR support)"; \
-	        fi ; \
-	        $(distuninstallcheck_listfiles) ; \
-	        exit 1; } >&2
-distcleancheck: distclean
-	@if test '$(srcdir)' = . ; then \
-	  echo "ERROR: distcleancheck can only run from a VPATH build" ; \
-	  exit 1 ; \
-	fi
-	@test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
-	  || { echo "ERROR: files left in build directory after distclean:" ; \
-	       $(distcleancheck_listfiles) ; \
-	       exit 1; } >&2
-check-am: all-am
-	$(MAKE) $(AM_MAKEFLAGS) $(check_SCRIPTS)
-	$(MAKE) $(AM_MAKEFLAGS) check-TESTS
-check: $(BUILT_SOURCES)
-	$(MAKE) $(AM_MAKEFLAGS) check-am
-all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(SCRIPTS) $(MANS) $(DATA) \
-		$(HEADERS) config.h
-install-binPROGRAMS: install-libLTLIBRARIES
-
-installdirs:
-	for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(man3dir)" "$(DESTDIR)$(docdir)" "$(DESTDIR)$(htmldir)" "$(DESTDIR)$(htmldir)" "$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(includedir)" "$(DESTDIR)$(includedir)"; do \
-	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
-	done
-install: $(BUILT_SOURCES)
-	$(MAKE) $(AM_MAKEFLAGS) install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-	if test -z '$(STRIP)'; then \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	      install; \
-	else \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
-	fi
-mostlyclean-generic:
-	-test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
-	-test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
-	-test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
-
-clean-generic:
-	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-	-test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
-	-test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
-@WITH_GCOV_FALSE@distclean-local:
-@WITH_GCOV_FALSE@clean-local:
-clean: clean-am
-
-clean-am: clean-binPROGRAMS clean-generic clean-libLTLIBRARIES \
-	clean-libtool clean-local clean-noinstPROGRAMS mostlyclean-am
-
-distclean: distclean-am
-	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
-	-rm -rf ./$(DEPDIR)
-	-rm -f Makefile
-distclean-am: clean-am distclean-compile distclean-generic \
-	distclean-hdr distclean-libtool distclean-local distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am: install-dist_docDATA install-dist_htmlDATA \
-	install-htmlDATA install-includeHEADERS install-man \
-	install-nodist_includeHEADERS install-pkgconfigDATA
-	@$(NORMAL_INSTALL)
-	$(MAKE) $(AM_MAKEFLAGS) install-data-hook
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am: install-binPROGRAMS install-binSCRIPTS \
-	install-libLTLIBRARIES
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man: install-man1 install-man3
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
-	-rm -rf $(top_srcdir)/autom4te.cache
-	-rm -rf ./$(DEPDIR)
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-compile mostlyclean-generic \
-	mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am: uninstall-binPROGRAMS uninstall-binSCRIPTS \
-	uninstall-dist_docDATA uninstall-dist_htmlDATA \
-	uninstall-htmlDATA uninstall-includeHEADERS \
-	uninstall-libLTLIBRARIES uninstall-man \
-	uninstall-nodist_includeHEADERS uninstall-pkgconfigDATA
-
-uninstall-man: uninstall-man1 uninstall-man3
-
-.MAKE: all check check-am install install-am install-data-am \
-	install-strip
-
-.PHONY: CTAGS GTAGS TAGS all all-am am--refresh check check-TESTS \
-	check-am clean clean-binPROGRAMS clean-cscope clean-generic \
-	clean-libLTLIBRARIES clean-libtool clean-local \
-	clean-noinstPROGRAMS cscope cscopelist-am ctags ctags-am dist \
-	dist-all dist-bzip2 dist-gzip dist-lzip dist-shar dist-tarZ \
-	dist-xz dist-zip distcheck distclean distclean-compile \
-	distclean-generic distclean-hdr distclean-libtool \
-	distclean-local distclean-tags distcleancheck distdir \
-	distuninstallcheck dvi dvi-am html html-am info info-am \
-	install install-am install-binPROGRAMS install-binSCRIPTS \
-	install-data install-data-am install-data-hook \
-	install-dist_docDATA install-dist_htmlDATA install-dvi \
-	install-dvi-am install-exec install-exec-am install-html \
-	install-html-am install-htmlDATA install-includeHEADERS \
-	install-info install-info-am install-libLTLIBRARIES \
-	install-man install-man1 install-man3 \
-	install-nodist_includeHEADERS install-pdf install-pdf-am \
-	install-pkgconfigDATA install-ps install-ps-am install-strip \
-	installcheck installcheck-am installdirs maintainer-clean \
-	maintainer-clean-generic mostlyclean mostlyclean-compile \
-	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
-	recheck tags tags-am uninstall uninstall-am \
-	uninstall-binPROGRAMS uninstall-binSCRIPTS \
-	uninstall-dist_docDATA uninstall-dist_htmlDATA \
-	uninstall-htmlDATA uninstall-includeHEADERS \
-	uninstall-libLTLIBRARIES uninstall-man uninstall-man1 \
-	uninstall-man3 uninstall-nodist_includeHEADERS \
-	uninstall-pkgconfigDATA
-
-.PRECIOUS: Makefile
-
-
-# The only difference between pcre.h.in and pcre.h is the setting of the PCRE
-# version number. Therefore, we can create the generic version just by copying.
-pcre.h.generic: pcre.h.in configure.ac
-	rm -f $@
-	cp -p pcre.h $@
-
-# It is more complicated for config.h.generic. We need the version that results
-# from a default configuration so as to get all the default values for PCRE
-# configuration macros such as MATCH_LIMIT and NEWLINE. We can get this by
-# doing a configure in a temporary directory. However, some trickery is needed,
-# because the source directory may already be configured. If you just try
-# running configure in a new directory, it complains. For this reason, we move
-# config.status out of the way while doing the default configuration. The
-# resulting config.h is munged by perl to put #ifdefs round any #defines for
-# macros with values, and to #undef all boolean macros such as HAVE_xxx and
-# SUPPORT_xxx. We also get rid of any gcc-specific visibility settings. Make
-# sure that PCRE_EXP_DEFN is unset (in case it has visibility settings).
-config.h.generic: configure.ac
-	rm -rf $@ _generic
-	mkdir _generic
-	cs=$(srcdir)/config.status; test ! -f $$cs || mv -f $$cs $$cs.aside
-	cd _generic && $(abs_top_srcdir)/configure || :
-	cs=$(srcdir)/config.status; test ! -f $$cs.aside || mv -f $$cs.aside $$cs
-	test -f _generic/config.h
-	perl -n \
-	  -e 'BEGIN{$$blank=0;}' \
-	  -e 'if(/PCRE_EXP_DEFN/){print"/* #undef PCRE_EXP_DEFN */\n";$$blank=0;next;}' \
-	  -e 'if(/to make a symbol visible/){next;}' \
-	  -e 'if(/__attribute__ \(\(visibility/){next;}' \
-	  -e 'if(/LT_OBJDIR/){print"/* This is ignored unless you are using libtool. */\n";}' \
-	  -e 'if(/^#define\s((?:HAVE|SUPPORT|STDC)_\w+)/){print"/* #undef $$1 */\n";$$blank=0;next;}' \
-	  -e 'if(/^#define\s(?!PACKAGE|VERSION)(\w+)/){print"#ifndef $$1\n$$_#endif\n";$$blank=0;next;}' \
-	  -e 'if(/^\s*$$/){print unless $$blank; $$blank=1;} else{print;$$blank=0;}' \
-	  _generic/config.h >$@
-	rm -rf _generic
-
-@WITH_REBUILD_CHARTABLES_TRUE@pcre_chartables.c: dftables$(EXEEXT)
-@WITH_REBUILD_CHARTABLES_TRUE@	./dftables$(EXEEXT) $@
-
-@WITH_REBUILD_CHARTABLES_FALSE@pcre_chartables.c: $(srcdir)/pcre_chartables.c.dist
-@WITH_REBUILD_CHARTABLES_FALSE@	rm -f $@
-@WITH_REBUILD_CHARTABLES_FALSE@	$(LN_S) $(srcdir)/pcre_chartables.c.dist $@
-
-# A compatibility line, the old build system worked with 'make test'
-test: check ;
-
-# A PCRE user submitted the following addition, saying that it "will allow
-# anyone using the 'mingw32' compiler to simply type 'make pcre.dll' and get a
-# nice DLL for Windows use".
-pcre.dll: $(DLL_OBJS)
-	$(CC) -shared -o pcre.dll -Wl,"--strip-all" -Wl,"--export-all-symbols" $(DLL_OBJS)
-
-# Arrange for the per-function man pages to have 16- and 32-bit names as well.
-install-data-hook:
-	ln -sf pcre_assign_jit_stack.3		 $(DESTDIR)$(man3dir)/pcre16_assign_jit_stack.3
-	ln -sf pcre_compile.3			 $(DESTDIR)$(man3dir)/pcre16_compile.3
-	ln -sf pcre_compile2.3			 $(DESTDIR)$(man3dir)/pcre16_compile2.3
-	ln -sf pcre_config.3			 $(DESTDIR)$(man3dir)/pcre16_config.3
-	ln -sf pcre_copy_named_substring.3	 $(DESTDIR)$(man3dir)/pcre16_copy_named_substring.3
-	ln -sf pcre_copy_substring.3		 $(DESTDIR)$(man3dir)/pcre16_copy_substring.3
-	ln -sf pcre_dfa_exec.3			 $(DESTDIR)$(man3dir)/pcre16_dfa_exec.3
-	ln -sf pcre_exec.3			 $(DESTDIR)$(man3dir)/pcre16_exec.3
-	ln -sf pcre_free_study.3		 $(DESTDIR)$(man3dir)/pcre16_free_study.3
-	ln -sf pcre_free_substring.3		 $(DESTDIR)$(man3dir)/pcre16_free_substring.3
-	ln -sf pcre_free_substring_list.3	 $(DESTDIR)$(man3dir)/pcre16_free_substring_list.3
-	ln -sf pcre_fullinfo.3			 $(DESTDIR)$(man3dir)/pcre16_fullinfo.3
-	ln -sf pcre_get_named_substring.3	 $(DESTDIR)$(man3dir)/pcre16_get_named_substring.3
-	ln -sf pcre_get_stringnumber.3		 $(DESTDIR)$(man3dir)/pcre16_get_stringnumber.3
-	ln -sf pcre_get_stringtable_entries.3	 $(DESTDIR)$(man3dir)/pcre16_get_stringtable_entries.3
-	ln -sf pcre_get_substring.3		 $(DESTDIR)$(man3dir)/pcre16_get_substring.3
-	ln -sf pcre_get_substring_list.3	 $(DESTDIR)$(man3dir)/pcre16_get_substring_list.3
-	ln -sf pcre_jit_exec.3			 $(DESTDIR)$(man3dir)/pcre16_jit_exec.3
-	ln -sf pcre_jit_stack_alloc.3		 $(DESTDIR)$(man3dir)/pcre16_jit_stack_alloc.3
-	ln -sf pcre_jit_stack_free.3		 $(DESTDIR)$(man3dir)/pcre16_jit_stack_free.3
-	ln -sf pcre_maketables.3		 $(DESTDIR)$(man3dir)/pcre16_maketables.3
-	ln -sf pcre_pattern_to_host_byte_order.3 $(DESTDIR)$(man3dir)/pcre16_pattern_to_host_byte_order.3
-	ln -sf pcre_refcount.3			 $(DESTDIR)$(man3dir)/pcre16_refcount.3
-	ln -sf pcre_study.3			 $(DESTDIR)$(man3dir)/pcre16_study.3
-	ln -sf pcre_utf16_to_host_byte_order.3	 $(DESTDIR)$(man3dir)/pcre16_utf16_to_host_byte_order.3
-	ln -sf pcre_version.3			 $(DESTDIR)$(man3dir)/pcre16_version.3
-	ln -sf pcre_assign_jit_stack.3		 $(DESTDIR)$(man3dir)/pcre32_assign_jit_stack.3
-	ln -sf pcre_compile.3			 $(DESTDIR)$(man3dir)/pcre32_compile.3
-	ln -sf pcre_compile2.3			 $(DESTDIR)$(man3dir)/pcre32_compile2.3
-	ln -sf pcre_config.3			 $(DESTDIR)$(man3dir)/pcre32_config.3
-	ln -sf pcre_copy_named_substring.3	 $(DESTDIR)$(man3dir)/pcre32_copy_named_substring.3
-	ln -sf pcre_copy_substring.3		 $(DESTDIR)$(man3dir)/pcre32_copy_substring.3
-	ln -sf pcre_dfa_exec.3			 $(DESTDIR)$(man3dir)/pcre32_dfa_exec.3
-	ln -sf pcre_exec.3			 $(DESTDIR)$(man3dir)/pcre32_exec.3
-	ln -sf pcre_free_study.3		 $(DESTDIR)$(man3dir)/pcre32_free_study.3
-	ln -sf pcre_free_substring.3		 $(DESTDIR)$(man3dir)/pcre32_free_substring.3
-	ln -sf pcre_free_substring_list.3	 $(DESTDIR)$(man3dir)/pcre32_free_substring_list.3
-	ln -sf pcre_fullinfo.3			 $(DESTDIR)$(man3dir)/pcre32_fullinfo.3
-	ln -sf pcre_get_named_substring.3	 $(DESTDIR)$(man3dir)/pcre32_get_named_substring.3
-	ln -sf pcre_get_stringnumber.3		 $(DESTDIR)$(man3dir)/pcre32_get_stringnumber.3
-	ln -sf pcre_get_stringtable_entries.3	 $(DESTDIR)$(man3dir)/pcre32_get_stringtable_entries.3
-	ln -sf pcre_get_substring.3		 $(DESTDIR)$(man3dir)/pcre32_get_substring.3
-	ln -sf pcre_get_substring_list.3	 $(DESTDIR)$(man3dir)/pcre32_get_substring_list.3
-	ln -sf pcre_jit_exec.3			 $(DESTDIR)$(man3dir)/pcre32_jit_exec.3
-	ln -sf pcre_jit_stack_alloc.3		 $(DESTDIR)$(man3dir)/pcre32_jit_stack_alloc.3
-	ln -sf pcre_jit_stack_free.3		 $(DESTDIR)$(man3dir)/pcre32_jit_stack_free.3
-	ln -sf pcre_maketables.3		 $(DESTDIR)$(man3dir)/pcre32_maketables.3
-	ln -sf pcre_pattern_to_host_byte_order.3 $(DESTDIR)$(man3dir)/pcre32_pattern_to_host_byte_order.3
-	ln -sf pcre_refcount.3			 $(DESTDIR)$(man3dir)/pcre32_refcount.3
-	ln -sf pcre_study.3			 $(DESTDIR)$(man3dir)/pcre32_study.3
-	ln -sf pcre_utf32_to_host_byte_order.3	 $(DESTDIR)$(man3dir)/pcre32_utf32_to_host_byte_order.3
-	ln -sf pcre_version.3			 $(DESTDIR)$(man3dir)/pcre32_version.3
-
-@WITH_GCOV_TRUE@coverage-check: all
-@WITH_GCOV_TRUE@	-$(MAKE) $(AM_MAKEFLAGS) -k check
-
-@WITH_GCOV_TRUE@coverage-baseline:
-@WITH_GCOV_TRUE@	$(LCOV) $(coverage_quiet) \
-@WITH_GCOV_TRUE@		--directory $(top_builddir) \
-@WITH_GCOV_TRUE@		--output-file "$(COVERAGE_OUTPUT_FILE)" \
-@WITH_GCOV_TRUE@		--capture \
-@WITH_GCOV_TRUE@		--initial
-
-@WITH_GCOV_TRUE@coverage-report:
-@WITH_GCOV_TRUE@	$(LCOV) $(coverage_quiet) \
-@WITH_GCOV_TRUE@		--directory $(top_builddir) \
-@WITH_GCOV_TRUE@		--capture \
-@WITH_GCOV_TRUE@		--output-file "$(COVERAGE_OUTPUT_FILE).tmp" \
-@WITH_GCOV_TRUE@		--test-name "$(COVERAGE_TEST_NAME)" \
-@WITH_GCOV_TRUE@		--no-checksum \
-@WITH_GCOV_TRUE@		--compat-libtool \
-@WITH_GCOV_TRUE@		$(COVERAGE_LCOV_EXTRA_FLAGS)
-@WITH_GCOV_TRUE@	$(LCOV) $(coverage_quiet) \
-@WITH_GCOV_TRUE@		--directory $(top_builddir) \
-@WITH_GCOV_TRUE@		--output-file "$(COVERAGE_OUTPUT_FILE)" \
-@WITH_GCOV_TRUE@		--remove "$(COVERAGE_OUTPUT_FILE).tmp" \
-@WITH_GCOV_TRUE@		"/tmp/*" \
-@WITH_GCOV_TRUE@		"/usr/include/*" \
-@WITH_GCOV_TRUE@		"$(includedir)/*"
-@WITH_GCOV_TRUE@	-@rm -f "$(COVERAGE_OUTPUT_FILE).tmp"
-@WITH_GCOV_TRUE@	LANG=C $(GENHTML) $(coverage_quiet) \
-@WITH_GCOV_TRUE@		--prefix $(top_builddir) \
-@WITH_GCOV_TRUE@		--output-directory "$(COVERAGE_OUTPUT_DIR)" \
-@WITH_GCOV_TRUE@		--title "$(PACKAGE) $(VERSION) Code Coverage Report" \
-@WITH_GCOV_TRUE@		--show-details "$(COVERAGE_OUTPUT_FILE)" \
-@WITH_GCOV_TRUE@		--legend \
-@WITH_GCOV_TRUE@		$(COVERAGE_GENHTML_EXTRA_FLAGS)
-@WITH_GCOV_TRUE@	@echo "Code coverage report written to file://$(abs_builddir)/$(COVERAGE_OUTPUT_DIR)/index.html"
-
-@WITH_GCOV_TRUE@coverage-reset:
-@WITH_GCOV_TRUE@	-$(LCOV) $(coverage_quiet) --zerocounters --directory $(top_builddir)
-
-@WITH_GCOV_TRUE@coverage-clean-report:
-@WITH_GCOV_TRUE@	-rm -f "$(COVERAGE_OUTPUT_FILE)" "$(COVERAGE_OUTPUT_FILE).tmp"
-@WITH_GCOV_TRUE@	-rm -rf "$(COVERAGE_OUTPUT_DIR)"
-
-@WITH_GCOV_TRUE@coverage-clean-data:
-@WITH_GCOV_TRUE@	-find $(top_builddir) -name "*.gcda" -delete
-
-@WITH_GCOV_TRUE@coverage-clean: coverage-reset coverage-clean-report coverage-clean-data
-@WITH_GCOV_TRUE@	-find $(top_builddir) -name "*.gcno" -delete
-
-@WITH_GCOV_TRUE@coverage-distclean: coverage-clean
-
-@WITH_GCOV_TRUE@coverage: coverage-reset coverage-baseline coverage-check coverage-report
-@WITH_GCOV_TRUE@clean-local: coverage-clean
-@WITH_GCOV_TRUE@distclean-local: coverage-distclean
-
-@WITH_GCOV_TRUE@.PHONY: coverage coverage-baseline coverage-check coverage-report coverage-reset coverage-clean-report coverage-clean-data coverage-clean coverage-distclean
-
-@WITH_GCOV_FALSE@coverage:
-@WITH_GCOV_FALSE@	@echo "Configuring with --enable-coverage required to generate code coverage report."
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/dist/NEWS b/dist/NEWS
deleted file mode 100644
index 7e42dcb..0000000
--- a/dist/NEWS
+++ /dev/null
@@ -1,716 +0,0 @@
-News about PCRE releases
-------------------------
-
-Release 8.38 23-November-2015
------------------------------
-
-This is bug-fix release. Note that this library (now called PCRE1) is now being
-maintained for bug fixes only. New projects are advised to use the new PCRE2
-libraries.
-
-
-Release 8.37 28-April-2015
---------------------------
-
-This is bug-fix release. Note that this library (now called PCRE1) is now being
-maintained for bug fixes only. New projects are advised to use the new PCRE2
-libraries.
-
-
-Release 8.36 26-September-2014
-------------------------------
-
-This is primarily a bug-fix release. However, in addition, the Unicode data
-tables have been updated to Unicode 7.0.0.
-
-
-Release 8.35 04-April-2014
---------------------------
-
-There have been performance improvements for classes containing non-ASCII
-characters and the "auto-possessification" feature has been extended. Other
-minor improvements have been implemented and bugs fixed. There is a new callout
-feature to enable applications to do detailed stack checks at compile time, to
-avoid running out of stack for deeply nested parentheses. The JIT compiler has
-been extended with experimental support for ARM-64, MIPS-64, and PPC-LE.
-
-
-Release 8.34 15-December-2013
------------------------------
-
-As well as fixing the inevitable bugs, performance has been improved by
-refactoring and extending the amount of "auto-possessification" that PCRE does.
-Other notable changes:
-
-.  Implemented PCRE_INFO_MATCH_EMPTY, which yields 1 if the pattern can match
-   an empty string. If it can, pcretest shows this in its information output.
-
-.  A back reference to a named subpattern when there is more than one of the
-   same name now checks them in the order in which they appear in the pattern.
-   The first one that is set is used for the reference. Previously only the
-   first one was inspected. This change makes PCRE more compatible with Perl.
-
-.  Unicode character properties were updated from Unicode 6.3.0.
-
-.  The character VT has been added to the set of characters that match \s and
-   are generally treated as white space, following this same change in Perl
-   5.18. There is now no difference between "Perl space" and "POSIX space".
-
-.  Perl has changed its handling of \8 and \9. If there is no previously
-   encountered capturing group of those numbers, they are treated as the
-   literal characters 8 and 9 instead of a binary zero followed by the
-   literals. PCRE now does the same.
-
-.  Following Perl, added \o{} to specify codepoints in octal, making it
-   possible to specify values greater than 0777 and also making them
-   unambiguous.
-
-.  In UCP mode, \s was not matching two of the characters that Perl matches,
-   namely NEL (U+0085) and MONGOLIAN VOWEL SEPARATOR (U+180E), though they
-   were matched by \h.
-
-.  Add JIT support for the 64 bit TileGX architecture.
-
-.  Upgraded the handling of the POSIX classes [:graph:], [:print:], and
-   [:punct:] when PCRE_UCP is set so as to include the same characters as Perl
-   does in Unicode mode.
-
-.  Perl no longer allows group names to start with digits, so I have made this
-   change also in PCRE.
-
-.  Added support for [[:<:]] and [[:>:]] as used in the BSD POSIX library to
-   mean "start of word" and "end of word", respectively, as a transition aid.
-
-
-Release 8.33 28-May-2013
---------------------------
-
-A number of bugs are fixed, and some performance improvements have been made.
-There are also some new features, of which these are the most important:
-
-.  The behaviour of the backtracking verbs has been rationalized and
-   documented in more detail.
-
-.  JIT now supports callouts and all of the backtracking verbs.
-
-.  Unicode validation has been updated in the light of Unicode Corrigendum #9,
-   which points out that "non characters" are not "characters that may not
-   appear in Unicode strings" but rather "characters that are reserved for
-   internal use and have only local meaning".
-
-.  (*LIMIT_MATCH=d) and (*LIMIT_RECURSION=d) have been added so that the
-   creator of a pattern can specify lower (but not higher) limits for the
-   matching process.
-
-.  The PCRE_NEVER_UTF option is available to prevent pattern-writers from using
-   the (*UTF) feature, as this could be a security issue.
-
-
-Release 8.32 30-November-2012
------------------------------
-
-This release fixes a number of bugs, but also has some new features. These are
-the highlights:
-
-.  There is now support for 32-bit character strings and UTF-32. Like the
-   16-bit support, this is done by compiling a separate 32-bit library.
-
-.  \X now matches a Unicode extended grapheme cluster.
-
-.  Case-independent matching of Unicode characters that have more than one
-   "other case" now makes all three (or more) characters equivalent. This
-   applies, for example, to Greek Sigma, which has two lowercase versions.
-
-.  Unicode character properties are updated to Unicode 6.2.0.
-
-.  The EBCDIC support, which had decayed, has had a spring clean.
-
-.  A number of JIT optimizations have been added, which give faster JIT
-   execution speed. In addition, a new direct interface to JIT execution is
-   available. This bypasses some of the sanity checks of pcre_exec() to give a
-   noticeable speed-up.
-
-.  A number of issues in pcregrep have been fixed, making it more compatible
-   with GNU grep. In particular, --exclude and --include (and variants) apply
-   to all files now, not just those obtained from scanning a directory
-   recursively. In Windows environments, the default action for directories is
-   now "skip" instead of "read" (which provokes an error).
-
-.  If the --only-matching (-o) option in pcregrep is specified multiple
-   times, each one causes appropriate output. For example, -o1 -o2 outputs the
-   substrings matched by the 1st and 2nd capturing parentheses. A separating
-   string can be specified by --om-separator (default empty).
-
-.  When PCRE is built via Autotools using a version of gcc that has the
-   "visibility" feature, it is used to hide internal library functions that are
-   not part of the public API.
-
-
-Release 8.31 06-July-2012
--------------------------
-
-This is mainly a bug-fixing release, with a small number of developments:
-
-. The JIT compiler now supports partial matching and the (*MARK) and
-  (*COMMIT) verbs.
-
-. PCRE_INFO_MAXLOOKBEHIND can be used to find the longest lookbehind in a
-  pattern.
-
-. There should be a performance improvement when using the heap instead of the
-  stack for recursion.
-
-. pcregrep can now be linked with libedit as an alternative to libreadline.
-
-. pcregrep now has a --file-list option where the list of files to scan is
-  given as a file.
-
-. pcregrep now recognizes binary files and there are related options.
-
-. The Unicode tables have been updated to 6.1.0.
-
-As always, the full list of changes is in the ChangeLog file.
-
-
-Release 8.30 04-February-2012
------------------------------
-
-Release 8.30 introduces a major new feature: support for 16-bit character
-strings, compiled as a separate library. There are a few changes to the
-8-bit library, in addition to some bug fixes.
-
-. The pcre_info() function, which has been obsolete for over 10 years, has
-  been removed.
-
-. When a compiled pattern was saved to a file and later reloaded on a host
-  with different endianness, PCRE used automatically to swap the bytes in some
-  of the data fields. With the advent of the 16-bit library, where more of this
-  swapping is needed, it is no longer done automatically. Instead, the bad
-  endianness is detected and a specific error is given. The user can then call
-  a new function called pcre_pattern_to_host_byte_order() (or an equivalent
-  16-bit function) to do the swap.
-
-. In UTF-8 mode, the values 0xd800 to 0xdfff are not legal Unicode
-  code points and are now faulted. (They are the so-called "surrogates"
-  that are reserved for coding high values in UTF-16.)
-
-
-Release 8.21 12-Dec-2011
-------------------------
-
-This is almost entirely a bug-fix release. The only new feature is the ability
-to obtain the size of the memory used by the JIT compiler.
-
-
-Release 8.20 21-Oct-2011
-------------------------
-
-The main change in this release is the inclusion of Zoltan Herczeg's
-just-in-time compiler support, which can be accessed by building PCRE with
---enable-jit. Large performance benefits can be had in many situations. 8.20
-also fixes an unfortunate bug that was introduced in 8.13 as well as tidying up
-a number of infelicities and differences from Perl.
-
-
-Release 8.13 16-Aug-2011
-------------------------
-
-This is mainly a bug-fix release. There has been a lot of internal refactoring.
-The Unicode tables have been updated. The only new feature in the library is
-the passing of *MARK information to callouts. Some additions have been made to
-pcretest to make testing easier and more comprehensive. There is a new option
-for pcregrep to adjust its internal buffer size.
-
-
-Release 8.12 15-Jan-2011
-------------------------
-
-This release fixes some bugs in pcregrep, one of which caused the tests to fail
-on 64-bit big-endian systems. There are no changes to the code of the library.
-
-
-Release 8.11 10-Dec-2010
-------------------------
-
-A number of bugs in the library and in pcregrep have been fixed. As always, see
-ChangeLog for details. The following are the non-bug-fix changes:
-
-. Added --match-limit and --recursion-limit to pcregrep.
-
-. Added an optional parentheses number to the -o and --only-matching options
-  of pcregrep.
-
-. Changed the way PCRE_PARTIAL_HARD affects the matching of $, \z, \Z, \b, and
-  \B.
-
-. Added PCRE_ERROR_SHORTUTF8 to make it possible to distinguish between a
-  bad UTF-8 sequence and one that is incomplete when using PCRE_PARTIAL_HARD.
-
-. Recognize (*NO_START_OPT) at the start of a pattern to set the PCRE_NO_
-  START_OPTIMIZE option, which is now allowed at compile time
-
-
-Release 8.10 25-Jun-2010
-------------------------
-
-There are two major additions: support for (*MARK) and friends, and the option
-PCRE_UCP, which changes the behaviour of \b, \d, \s, and \w (and their
-opposites) so that they make use of Unicode properties. There are also a number
-of lesser new features, and several bugs have been fixed. A new option,
---line-buffered, has been added to pcregrep, for use when it is connected to
-pipes.
-
-
-Release 8.02 19-Mar-2010
-------------------------
-
-Another bug-fix release.
-
-
-Release 8.01 19-Jan-2010
-------------------------
-
-This is a bug-fix release. Several bugs in the code itself and some bugs and
-infelicities in the build system have been fixed.
-
-
-Release 8.00 19-Oct-09
-----------------------
-
-Bugs have been fixed in the library and in pcregrep. There are also some
-enhancements. Restrictions on patterns used for partial matching have been
-removed, extra information is given for partial matches, the partial matching
-process has been improved, and an option to make a partial match override a
-full match is available. The "study" process has been enhanced by finding a
-lower bound matching length. Groups with duplicate numbers may now have
-duplicated names without the use of PCRE_DUPNAMES. However, they may not have
-different names. The documentation has been revised to reflect these changes.
-The version number has been expanded to 3 digits as it is clear that the rate
-of change is not slowing down.
-
-
-Release 7.9 11-Apr-09
----------------------
-
-Mostly bugfixes and tidies with just a couple of minor functional additions.
-
-
-Release 7.8 05-Sep-08
----------------------
-
-More bug fixes, plus a performance improvement in Unicode character property
-lookup.
-
-
-Release 7.7 07-May-08
----------------------
-
-This is once again mainly a bug-fix release, but there are a couple of new
-features.
-
-
-Release 7.6 28-Jan-08
----------------------
-
-The main reason for having this release so soon after 7.5 is because it fixes a
-potential buffer overflow problem in pcre_compile() when run in UTF-8 mode. In
-addition, the CMake configuration files have been brought up to date.
-
-
-Release 7.5 10-Jan-08
----------------------
-
-This is mainly a bug-fix release. However the ability to link pcregrep with
-libz or libbz2 and the ability to link pcretest with libreadline have been
-added. Also the --line-offsets and --file-offsets options were added to
-pcregrep.
-
-
-Release 7.4 21-Sep-07
----------------------
-
-The only change of specification is the addition of options to control whether
-\R matches any Unicode line ending (the default) or just CR, LF, and CRLF.
-Otherwise, the changes are bug fixes and a refactoring to reduce the number of
-relocations needed in a shared library. There have also been some documentation
-updates, in particular, some more information about using CMake to build PCRE
-has been added to the NON-UNIX-USE file.
-
-
-Release 7.3 28-Aug-07
----------------------
-
-Most changes are bug fixes. Some that are not:
-
-1. There is some support for Perl 5.10's experimental "backtracking control
-   verbs" such as (*PRUNE).
-
-2. UTF-8 checking is now as per RFC 3629 instead of RFC 2279; this is more
-   restrictive in the strings it accepts.
-
-3. Checking for potential integer overflow has been made more dynamic, and as a
-   consequence there is no longer a hard limit on the size of a subpattern that
-   has a limited repeat count.
-
-4. When CRLF is a valid line-ending sequence, pcre_exec() and pcre_dfa_exec()
-   no longer advance by two characters instead of one when an unanchored match
-   fails at CRLF if there are explicit CR or LF matches within the pattern.
-   This gets rid of some anomalous effects that previously occurred.
-
-5. Some PCRE-specific settings for varying the newline options at the start of
-   a pattern have been added.
-
-
-Release 7.2 19-Jun-07
----------------------
-
-WARNING: saved patterns that were compiled by earlier versions of PCRE must be
-recompiled for use with 7.2 (necessitated by the addition of \K, \h, \H, \v,
-and \V).
-
-Correction to the notes for 7.1: the note about shared libraries for Windows is
-wrong. Previously, three libraries were built, but each could function
-independently. For example, the pcreposix library also included all the
-functions from the basic pcre library. The change is that the three libraries
-are no longer independent. They are like the Unix libraries. To use the
-pcreposix functions, for example, you need to link with both the pcreposix and
-the basic pcre library.
-
-Some more features from Perl 5.10 have been added:
-
-  (?-n) and (?+n) relative references for recursion and subroutines.
-
-  (?(-n) and (?(+n) relative references as conditions.
-
-  \k{name} and \g{name} are synonyms for \k<name>.
-
-  \K to reset the start of the matched string; for example, (foo)\Kbar
-  matches bar preceded by foo, but only sets bar as the matched string.
-
-  (?| introduces a group where the capturing parentheses in each alternative
-  start from the same number; for example, (?|(abc)|(xyz)) sets capturing
-  parentheses number 1 in both cases.
-
-  \h, \H, \v, \V match horizontal and vertical whitespace, respectively.
-
-
-Release 7.1 24-Apr-07
----------------------
-
-There is only one new feature in this release: a linebreak setting of
-PCRE_NEWLINE_ANYCRLF. It is a cut-down version of PCRE_NEWLINE_ANY, which
-recognizes only CRLF, CR, and LF as linebreaks.
-
-A few bugs are fixed (see ChangeLog for details), but the major change is a
-complete re-implementation of the build system. This now has full Autotools
-support and so is now "standard" in some sense. It should help with compiling
-PCRE in a wide variety of environments.
-
-NOTE: when building shared libraries for Windows, three dlls are now built,
-called libpcre, libpcreposix, and libpcrecpp. Previously, everything was
-included in a single dll.
-
-Another important change is that the dftables auxiliary program is no longer
-compiled and run at "make" time by default. Instead, a default set of character
-tables (assuming ASCII coding) is used. If you want to use dftables to generate
-the character tables as previously, add --enable-rebuild-chartables to the
-"configure" command. You must do this if you are compiling PCRE to run on a
-system that uses EBCDIC code.
-
-There is a discussion about character tables in the README file. The default is
-not to use dftables so that that there is no problem when cross-compiling.
-
-
-Release 7.0 19-Dec-06
----------------------
-
-This release has a new major number because there have been some internal
-upheavals to facilitate the addition of new optimizations and other facilities,
-and to make subsequent maintenance and extension easier. Compilation is likely
-to be a bit slower, but there should be no major effect on runtime performance.
-Previously compiled patterns are NOT upwards compatible with this release. If
-you have saved compiled patterns from a previous release, you will have to
-re-compile them. Important changes that are visible to users are:
-
-1. The Unicode property tables have been updated to Unicode 5.0.0, which adds
-   some more scripts.
-
-2. The option PCRE_NEWLINE_ANY causes PCRE to recognize any Unicode newline
-   sequence as a newline.
-
-3. The \R escape matches a single Unicode newline sequence as a single unit.
-
-4. New features that will appear in Perl 5.10 are now in PCRE. These include
-   alternative Perl syntax for named parentheses, and Perl syntax for
-   recursion.
-
-5. The C++ wrapper interface has been extended by the addition of a
-   QuoteMeta function and the ability to allow copy construction and
-   assignment.
-
-For a complete list of changes, see the ChangeLog file.
-
-
-Release 6.7 04-Jul-06
----------------------
-
-The main additions to this release are the ability to use the same name for
-multiple sets of parentheses, and support for CRLF line endings in both the
-library and pcregrep (and in pcretest for testing).
-
-Thanks to Ian Taylor, the stack usage for many kinds of pattern has been
-significantly reduced for certain subject strings.
-
-
-Release 6.5 01-Feb-06
----------------------
-
-Important changes in this release:
-
-1. A number of new features have been added to pcregrep.
-
-2. The Unicode property tables have been updated to Unicode 4.1.0, and the
-   supported properties have been extended with script names such as "Arabic",
-   and the derived properties "Any" and "L&". This has necessitated a change to
-   the interal format of compiled patterns. Any saved compiled patterns that
-   use \p or \P must be recompiled.
-
-3. The specification of recursion in patterns has been changed so that all
-   recursive subpatterns are automatically treated as atomic groups. Thus, for
-   example, (?R) is treated as if it were (?>(?R)). This is necessary because
-   otherwise there are situations where recursion does not work.
-
-See the ChangeLog for a complete list of changes, which include a number of bug
-fixes and tidies.
-
-
-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
----------------------
-
-There have been a lot of changes for the 4.0 release, adding additional
-functionality and mending bugs. Below is a list of the highlights of the new
-functionality. For full details of these features, please consult the
-documentation. For a complete list of changes, see the ChangeLog file.
-
-1. Support for Perl's \Q...\E escapes.
-
-2. "Possessive quantifiers" ?+, *+, ++, and {,}+ which come from Sun's Java
-package. They provide some syntactic sugar for simple cases of "atomic
-grouping".
-
-3. Support for the \G assertion. It is true when the current matching position
-is at the start point of the match.
-
-4. A new feature that provides some of the functionality that Perl provides
-with (?{...}). The facility is termed a "callout". The way it is done in PCRE
-is for the caller to provide an optional function, by setting pcre_callout to
-its entry point. To get the function called, the regex must include (?C) at
-appropriate points.
-
-5. Support for recursive calls to individual subpatterns. This makes it really
-easy to get totally confused.
-
-6. Support for named subpatterns. The Python syntax (?P<name>...) is used to
-name a group.
-
-7. Several extensions to UTF-8 support; it is now fairly complete. There is an
-option for pcregrep to make it operate in UTF-8 mode.
-
-8. The single man page has been split into a number of separate man pages.
-These also give rise to individual HTML pages which are put in a separate
-directory. There is an index.html page that lists them all. Some hyperlinking
-between the pages has been installed.
-
-
-Release 3.5 15-Aug-01
----------------------
-
-1. The configuring system has been upgraded to use later versions of autoconf
-and libtool. By default it builds both a shared and a static library if the OS
-supports it. You can use --disable-shared or --disable-static on the configure
-command if you want only one of them.
-
-2. The pcretest utility is now installed along with pcregrep because it is
-useful for users (to test regexs) and by doing this, it automatically gets
-relinked by libtool. The documentation has been turned into a man page, so
-there are now .1, .txt, and .html versions in /doc.
-
-3. Upgrades to pcregrep:
-   (i)   Added long-form option names like gnu grep.
-   (ii)  Added --help to list all options with an explanatory phrase.
-   (iii) Added -r, --recursive to recurse into sub-directories.
-   (iv)  Added -f, --file to read patterns from a file.
-
-4. Added --enable-newline-is-cr and --enable-newline-is-lf to the configure
-script, to force use of CR or LF instead of \n in the source. On non-Unix
-systems, the value can be set in config.h.
-
-5. The limit of 200 on non-capturing parentheses is a _nesting_ limit, not an
-absolute limit. Changed the text of the error message to make this clear, and
-likewise updated the man page.
-
-6. The limit of 99 on the number of capturing subpatterns has been removed.
-The new limit is 65535, which I hope will not be a "real" limit.
-
-
-Release 3.3 01-Aug-00
----------------------
-
-There is some support for UTF-8 character strings. This is incomplete and
-experimental. The documentation describes what is and what is not implemented.
-Otherwise, this is just a bug-fixing release.
-
-
-Release 3.0 01-Feb-00
----------------------
-
-1. A "configure" script is now used to configure PCRE for Unix systems. It
-builds a Makefile, a config.h file, and the pcre-config script.
-
-2. PCRE is built as a shared library by default.
-
-3. There is support for POSIX classes such as [:alpha:].
-
-5. There is an experimental recursion feature.
-
-----------------------------------------------------------------------------
-          IMPORTANT FOR THOSE UPGRADING FROM VERSIONS BEFORE 2.00
-
-Please note that there has been a change in the API such that a larger
-ovector is required at matching time, to provide some additional workspace.
-The new man page has details. This change was necessary in order to support
-some of the new functionality in Perl 5.005.
-
-          IMPORTANT FOR THOSE UPGRADING FROM VERSION 2.00
-
-Another (I hope this is the last!) change has been made to the API for the
-pcre_compile() function. An additional argument has been added to make it
-possible to pass over a pointer to character tables built in the current
-locale by pcre_maketables(). To use the default tables, this new argument
-should be passed as NULL.
-
-          IMPORTANT FOR THOSE UPGRADING FROM VERSION 2.05
-
-Yet another (and again I hope this really is the last) change has been made
-to the API for the pcre_exec() function. An additional argument has been
-added to make it possible to start the match other than at the start of the
-subject string. This is important if there are lookbehinds. The new man
-page has the details, but you just want to convert existing programs, all
-you need to do is to stick in a new fifth argument to pcre_exec(), with a
-value of zero. For example, change
-
-  pcre_exec(pattern, extra, subject, length, options, ovec, ovecsize)
-to
-  pcre_exec(pattern, extra, subject, length, 0, options, ovec, ovecsize)
-
-****
diff --git a/dist/NON-AUTOTOOLS-BUILD b/dist/NON-AUTOTOOLS-BUILD
deleted file mode 100644
index 3910059..0000000
--- a/dist/NON-AUTOTOOLS-BUILD
+++ /dev/null
@@ -1,772 +0,0 @@
-Building PCRE without using autotools
--------------------------------------
-
-NOTE: This document relates to PCRE releases that use the original API, with
-library names libpcre, libpcre16, and libpcre32. January 2015 saw the first
-release of a new API, known as PCRE2, with release numbers starting at 10.00
-and library names libpcre2-8, libpcre2-16, and libpcre2-32. The old libraries
-(now called PCRE1) are still being maintained for bug fixes, but there will be
-no new development. New projects are advised to use the new PCRE2 libraries.
-
-
-This document contains the following sections:
-
-  General
-  Generic instructions for the PCRE C library
-  The C++ wrapper functions
-  Building for virtual Pascal
-  Stack size in Windows environments
-  Linking programs in Windows environments
-  Calling conventions in Windows environments
-  Comments about Win32 builds
-  Building PCRE on Windows with CMake
-  Use of relative paths with CMake on Windows
-  Testing with RunTest.bat
-  Building under Windows CE with Visual Studio 200x
-  Building under Windows with BCC5.5
-  Building using Borland C++ Builder 2007 (CB2007) and higher
-  Building PCRE on OpenVMS
-  Building PCRE on Stratus OpenVOS
-  Building PCRE on native z/OS and z/VM
-
-
-GENERAL
-
-I (Philip Hazel) have no experience of Windows or VMS sytems and how their
-libraries work. The items in the PCRE distribution and Makefile that relate to
-anything other than Linux systems are untested by me.
-
-There are some other comments and files (including some documentation in CHM
-format) in the Contrib directory on the FTP site:
-
-  ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/Contrib
-
-The basic PCRE library consists entirely of code written in Standard C, and so
-should compile successfully on any system that has a Standard C compiler and
-library. The C++ wrapper functions are a separate issue (see below).
-
-The PCRE distribution includes a "configure" file for use by the configure/make
-(autotools) build system, as found in many Unix-like environments. The README
-file contains information about the options for "configure".
-
-There is also support for CMake, which some users prefer, especially in Windows
-environments, though it can also be run in Unix-like environments. See the
-section entitled "Building PCRE on Windows with CMake" below.
-
-Versions of config.h and pcre.h are distributed in the PCRE tarballs under the
-names config.h.generic and pcre.h.generic. These are provided for those who
-build PCRE without using "configure" or CMake. If you use "configure" or CMake,
-the .generic versions are not used.
-
-
-GENERIC INSTRUCTIONS FOR THE PCRE C LIBRARY
-
-The following are generic instructions for building the PCRE C library "by
-hand". If you are going to use CMake, this section does not apply to you; you
-can skip ahead to the CMake section.
-
- (1) Copy or rename the file config.h.generic as config.h, and edit the macro
-     settings that it contains to whatever is appropriate for your environment.
-
-     In particular, you can alter the definition of the NEWLINE macro to
-     specify what character(s) you want to be interpreted as line terminators.
-     In an EBCDIC environment, you MUST change NEWLINE, because its default
-     value is 10, an ASCII LF. The usual EBCDIC newline character is 21 (0x15,
-     NL), though in some cases it may be 37 (0x25).
-
-     When you compile any of the PCRE modules, you must specify -DHAVE_CONFIG_H
-     to your compiler so that config.h is included in the sources.
-
-     An alternative approach is not to edit config.h, but to use -D on the
-     compiler command line to make any changes that you need to the
-     configuration options. In this case -DHAVE_CONFIG_H must not be set.
-
-     NOTE: There have been occasions when the way in which certain parameters
-     in config.h are used has changed between releases. (In the configure/make
-     world, this is handled automatically.) When upgrading to a new release,
-     you are strongly advised to review config.h.generic before re-using what
-     you had previously.
-
- (2) Copy or rename the file pcre.h.generic as pcre.h.
-
- (3) EITHER:
-       Copy or rename file pcre_chartables.c.dist as pcre_chartables.c.
-
-     OR:
-       Compile dftables.c as a stand-alone program (using -DHAVE_CONFIG_H if
-       you have set up config.h), 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. The tables are generated using the default
-       C locale for your system. If you want to use a locale that is specified
-       by LC_xxx environment variables, add the -L option to the dftables
-       command. You must use this method if you are building on a system that
-       uses EBCDIC code.
-
-     The tables in pcre_chartables.c are defaults. The caller of PCRE can
-     specify alternative tables at run time.
-
- (4) Ensure that you have the following header files:
-
-       pcre_internal.h
-       ucp.h
-
- (5) For an 8-bit library, compile the following source files, setting
-     -DHAVE_CONFIG_H as a compiler option if you have set up config.h with your
-     configuration, or else use other -D settings to change the configuration
-     as required.
-
-       pcre_byte_order.c
-       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_jit_compile.c
-       pcre_maketables.c
-       pcre_newline.c
-       pcre_ord2utf8.c
-       pcre_refcount.c
-       pcre_string_utils.c
-       pcre_study.c
-       pcre_tables.c
-       pcre_ucd.c
-       pcre_valid_utf8.c
-       pcre_version.c
-       pcre_xclass.c
-
-     Make sure that you include -I. in the compiler command (or equivalent for
-     an unusual compiler) so that all included PCRE header files are first
-     sought in the current directory. Otherwise you run the risk of picking up
-     a previously-installed file from somewhere else.
-
-     Note that you must still compile pcre_jit_compile.c, even if you have not
-     defined SUPPORT_JIT in config.h, because when JIT support is not
-     configured, dummy functions are compiled. When JIT support IS configured,
-     pcre_jit_compile.c #includes sources from the sljit subdirectory, where
-     there should be 16 files, all of whose names begin with "sljit".
-
- (6) Now link all the compiled code into an object library in whichever form
-     your system keeps such libraries. This is the basic PCRE C 8-bit library.
-     If your system has static and shared libraries, you may have to do this
-     once for each type.
-
- (7) If you want to build a 16-bit library (as well as, or instead of the 8-bit
-     or 32-bit libraries) repeat steps 5-6 with the following files:
-
-       pcre16_byte_order.c
-       pcre16_chartables.c
-       pcre16_compile.c
-       pcre16_config.c
-       pcre16_dfa_exec.c
-       pcre16_exec.c
-       pcre16_fullinfo.c
-       pcre16_get.c
-       pcre16_globals.c
-       pcre16_jit_compile.c
-       pcre16_maketables.c
-       pcre16_newline.c
-       pcre16_ord2utf16.c
-       pcre16_refcount.c
-       pcre16_string_utils.c
-       pcre16_study.c
-       pcre16_tables.c
-       pcre16_ucd.c
-       pcre16_utf16_utils.c
-       pcre16_valid_utf16.c
-       pcre16_version.c
-       pcre16_xclass.c
-
- (8) If you want to build a 32-bit library (as well as, or instead of the 8-bit
-     or 16-bit libraries) repeat steps 5-6 with the following files:
-
-       pcre32_byte_order.c
-       pcre32_chartables.c
-       pcre32_compile.c
-       pcre32_config.c
-       pcre32_dfa_exec.c
-       pcre32_exec.c
-       pcre32_fullinfo.c
-       pcre32_get.c
-       pcre32_globals.c
-       pcre32_jit_compile.c
-       pcre32_maketables.c
-       pcre32_newline.c
-       pcre32_ord2utf32.c
-       pcre32_refcount.c
-       pcre32_string_utils.c
-       pcre32_study.c
-       pcre32_tables.c
-       pcre32_ucd.c
-       pcre32_utf32_utils.c
-       pcre32_valid_utf32.c
-       pcre32_version.c
-       pcre32_xclass.c
-
- (9) If you want to build the POSIX wrapper functions (which apply only to the
-     8-bit library), ensure that you have the pcreposix.h file and then compile
-     pcreposix.c (remembering -DHAVE_CONFIG_H if necessary). Link the result
-     (on its own) as the pcreposix library.
-
-(10) The pcretest program can be linked with any combination of the 8-bit,
-     16-bit and 32-bit libraries (depending on what you selected in config.h).
-     Compile pcretest.c and pcre_printint.c (again, don't forget
-     -DHAVE_CONFIG_H) and link them together with the appropriate library/ies.
-     If you compiled an 8-bit library, pcretest also needs the pcreposix
-     wrapper library unless you compiled it with -DNOPOSIX.
-
-(11) Run pcretest on the testinput files in the testdata directory, and check
-     that the output matches the corresponding testoutput files. There are
-     comments about what each test does in the section entitled "Testing PCRE"
-     in the README file. If you compiled more than one of the 8-bit, 16-bit and
-     32-bit libraries, you need to run pcretest with the -16 option to do
-     16-bit tests and with the -32 option to do 32-bit tests.
-
-     Some tests are relevant only when certain build-time options are selected.
-     For example, test 4 is for UTF-8/UTF-16/UTF-32 support, and will not run
-     if you have built PCRE without it. See the comments at the start of each
-     testinput file. If you have a suitable Unix-like shell, the RunTest script
-     will run the appropriate tests for you. The command "RunTest list" will
-     output a list of all the tests.
-
-     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. If you are using Windows, you probably
-     should use the wintestinput3 file instead of testinput3 (and the
-     corresponding output file). This is a locale test; wintestinput3 sets the
-     locale to "french" rather than "fr_FR", and there some minor output
-     differences.
-
-(12) If you have built PCRE with SUPPORT_JIT, the JIT features will be tested
-     by the testdata files. However, you might also like to build and run
-     the freestanding JIT test program, pcre_jit_test.c.
-
-(13) If you want to use the pcregrep command, compile and link pcregrep.c; it
-     uses only the basic 8-bit PCRE library (it does not need the pcreposix
-     library).
-
-
-THE C++ WRAPPER FUNCTIONS
-
-The PCRE distribution also contains some C++ wrapper functions and tests,
-applicable to the 8-bit library, which were 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.
-
-
-BUILDING FOR VIRTUAL PASCAL
-
-A script for building PCRE using Borland's C++ compiler for use with VPASCAL
-was contributed by Alexander Tokarev. Stefan Weber updated the script and added
-additional files. The following files in the distribution are for building PCRE
-for use with VP/Borland: makevp_c.txt, makevp_l.txt, makevp.bat, pcregexp.pas.
-
-
-STACK SIZE IN WINDOWS ENVIRONMENTS
-
-The default processor stack size of 1Mb in some Windows environments is too
-small for matching patterns that need much recursion. In particular, test 2 may
-fail because of this. Normally, running out of stack causes a crash, but there
-have been cases where the test program has just died silently. See your linker
-documentation for how to increase stack size if you experience problems. The
-Linux default of 8Mb is a reasonable choice for the stack, though even that can
-be too small for some pattern/subject combinations.
-
-PCRE has a compile configuration option to disable the use of stack for
-recursion so that heap is used instead. However, pattern matching is
-significantly slower when this is done. There is more about stack usage in the
-"pcrestack" documentation.
-
-
-LINKING PROGRAMS IN WINDOWS ENVIRONMENTS
-
-If you want to statically link a program against a PCRE library in the form of
-a non-dll .a file, you must define PCRE_STATIC before including pcre.h or
-pcrecpp.h, otherwise the pcre_malloc() and pcre_free() exported functions will
-be declared __declspec(dllimport), with unwanted results.
-
-
-CALLING CONVENTIONS IN WINDOWS ENVIRONMENTS
-
-It is possible to compile programs to use different calling conventions using
-MSVC. Search the web for "calling conventions" for more information. To make it
-easier to change the calling convention for the exported functions in the
-PCRE library, the macro PCRE_CALL_CONVENTION is present in all the external
-definitions. It can be set externally when compiling (e.g. in CFLAGS). If it is
-not set, it defaults to empty; the default calling convention is then used
-(which is what is wanted most of the time).
-
-
-COMMENTS ABOUT WIN32 BUILDS (see also "BUILDING PCRE ON WINDOWS WITH CMAKE")
-
-There are two ways of building PCRE using the "configure, make, make install"
-paradigm on Windows systems: using MinGW or using Cygwin. These are not at all
-the same thing; they are completely different from each other. There is also
-support for building using CMake, which some users find a more straightforward
-way of building PCRE under Windows.
-
-The MinGW home page (http://www.mingw.org/) says this:
-
-  MinGW: A collection of freely available and freely distributable Windows
-  specific header files and import libraries combined with GNU toolsets that
-  allow one to produce native Windows programs that do not rely on any
-  3rd-party C runtime DLLs.
-
-The Cygwin home page (http://www.cygwin.com/) says this:
-
-  Cygwin is a Linux-like environment for Windows. It consists of two parts:
-
-  . A DLL (cygwin1.dll) which acts as a Linux API emulation layer providing
-    substantial Linux API functionality
-
-  . A collection of tools which provide Linux look and feel.
-
-  The Cygwin DLL currently works with all recent, commercially released x86 32
-  bit and 64 bit versions of Windows, with the exception of Windows CE.
-
-On both MinGW and Cygwin, PCRE should build correctly using:
-
-  ./configure && make && make install
-
-This should create two libraries called libpcre and libpcreposix, and, if you
-have enabled building the C++ wrapper, a third one called libpcrecpp. These are
-independent libraries: when you link with libpcreposix or libpcrecpp you must
-also link with libpcre, which contains the basic functions. (Some earlier
-releases of PCRE included the basic libpcre functions in libpcreposix. This no
-longer happens.)
-
-A user submitted a special-purpose patch that makes it easy to create
-"pcre.dll" under mingw32 using the "msys" environment. It provides "pcre.dll"
-as a special target. If you use this target, no other files are built, and in
-particular, the pcretest and pcregrep programs are not built. An example of how
-this might be used is:
-
-  ./configure --enable-utf --disable-cpp CFLAGS="-03 -s"; make pcre.dll
-
-Using Cygwin's compiler generates libraries and executables that depend on
-cygwin1.dll. If a library that is generated this way is distributed,
-cygwin1.dll has to be distributed as well. Since cygwin1.dll is under the GPL
-licence, this forces not only PCRE to be under the GPL, but also the entire
-application. A distributor who wants to keep their own code proprietary must
-purchase an appropriate Cygwin licence.
-
-MinGW has no such restrictions. The MinGW compiler generates a library or
-executable that can run standalone on Windows without any third party dll or
-licensing issues.
-
-But there is more complication:
-
-If a Cygwin user uses the -mno-cygwin Cygwin gcc flag, what that really does is
-to tell Cygwin's gcc to use the MinGW gcc. Cygwin's gcc is only acting as a
-front end to MinGW's gcc (if you install Cygwin's gcc, you get both Cygwin's
-gcc and MinGW's gcc). So, a user can:
-
-. Build native binaries by using MinGW or by getting Cygwin and using
-  -mno-cygwin.
-
-. Build binaries that depend on cygwin1.dll by using Cygwin with the normal
-  compiler flags.
-
-The test files that are supplied with PCRE are in UNIX format, with LF
-characters as line terminators. Unless your PCRE library uses a default newline
-option that includes LF as a valid newline, it may be necessary to change the
-line terminators in the test files to get some of the tests to work.
-
-
-BUILDING PCRE ON WINDOWS WITH CMAKE
-
-CMake is an alternative configuration facility that can be used instead of
-"configure". CMake creates project files (make files, solution files, etc.)
-tailored to numerous development environments, including Visual Studio,
-Borland, Msys, MinGW, NMake, and Unix. If possible, use short paths with no
-spaces in the names for your CMake installation and your PCRE source and build
-directories.
-
-The following instructions were contributed by a PCRE user. If they are not
-followed exactly, errors may occur. In the event that errors do occur, it is
-recommended that you delete the CMake cache before attempting to repeat the
-CMake build process. In the CMake GUI, the cache can be deleted by selecting
-"File > Delete Cache".
-
-1.  Install the latest CMake version available from http://www.cmake.org/, and
-    ensure that cmake\bin is on your path.
-
-2.  Unzip (retaining folder structure) the PCRE source tree into a source
-    directory such as C:\pcre. You should ensure your local date and time
-    is not earlier than the file dates in your source dir if the release is
-    very new.
-
-3.  Create a new, empty build directory, preferably a subdirectory of the
-    source dir. For example, C:\pcre\pcre-xx\build.
-
-4.  Run cmake-gui from the Shell envirornment of your build tool, for example,
-    Msys for Msys/MinGW or Visual Studio Command Prompt for VC/VC++. Do not try
-    to start Cmake from the Windows Start menu, as this can lead to errors.
-
-5.  Enter C:\pcre\pcre-xx and C:\pcre\pcre-xx\build for the source and build
-    directories, respectively.
-
-6.  Hit the "Configure" button.
-
-7.  Select the particular IDE / build tool that you are using (Visual
-    Studio, MSYS makefiles, MinGW makefiles, etc.)
-
-8.  The GUI will then list several configuration options. This is where
-    you can enable UTF-8 support or other PCRE optional features.
-
-9.  Hit "Configure" again. The adjacent "Generate" button should now be
-    active.
-
-10. Hit "Generate".
-
-11. The build directory should now contain a usable build system, be it a
-    solution file for Visual Studio, makefiles for MinGW, etc. Exit from
-    cmake-gui and use the generated build system with your compiler or IDE.
-    E.g., for MinGW you can run "make", or for Visual Studio, open the PCRE
-    solution, select the desired configuration (Debug, or Release, etc.) and
-    build the ALL_BUILD project.
-
-12. If during configuration with cmake-gui you've elected to build the test
-    programs, you can execute them by building the test project. E.g., for
-    MinGW: "make test"; for Visual Studio build the RUN_TESTS project. The
-    most recent build configuration is targeted by the tests. A summary of
-    test results is presented. Complete test output is subsequently
-    available for review in Testing\Temporary under your build dir.
-
-
-USE OF RELATIVE PATHS WITH CMAKE ON WINDOWS
-
-A PCRE user comments as follows: I thought that others may want to know the
-current state of CMAKE_USE_RELATIVE_PATHS support on Windows. Here it is:
-
--- AdditionalIncludeDirectories is only partially modified (only the
-   first path - see below)
--- Only some of the contained file paths are modified - shown below for
-   pcre.vcproj
--- It properly modifies
-
-I am sure CMake people can fix that if they want to. Until then one will
-need to replace existing absolute paths in project files with relative
-paths manually (e.g. from VS) - relative to project file location. I did
-just that before being told to try CMAKE_USE_RELATIVE_PATHS. Not a big
-deal.
-
-AdditionalIncludeDirectories="E:\builds\pcre\build;E:\builds\pcre\pcre-7.5;"
-AdditionalIncludeDirectories=".;E:\builds\pcre\pcre-7.5;"
-
-RelativePath="pcre.h"
-RelativePath="pcre_chartables.c"
-RelativePath="pcre_chartables.c.rule"
-
-
-TESTING WITH RUNTEST.BAT
-
-If configured with CMake, building the test project ("make test" or building
-ALL_TESTS in Visual Studio) creates (and runs) pcre_test.bat (and depending
-on your configuration options, possibly other test programs) in the build
-directory. Pcre_test.bat runs RunTest.Bat with correct source and exe paths.
-
-For manual testing with RunTest.bat, provided the build dir is a subdirectory
-of the source directory: Open command shell window. Chdir to the location
-of your pcretest.exe and pcregrep.exe programs. Call RunTest.bat with
-"..\RunTest.Bat" or "..\..\RunTest.bat" as appropriate.
-
-To run only a particular test with RunTest.Bat provide a test number argument.
-
-Otherwise:
-
-1. Copy RunTest.bat into the directory where pcretest.exe and pcregrep.exe
-   have been created.
-
-2. Edit RunTest.bat to indentify the full or relative location of
-   the pcre source (wherein which the testdata folder resides), e.g.:
-
-   set srcdir=C:\pcre\pcre-8.20
-
-3. In a Windows command environment, chdir to the location of your bat and
-   exe programs.
-
-4. Run RunTest.bat. Test outputs will automatically be compared to expected
-   results, and discrepancies will be identified in the console output.
-
-To independently test the just-in-time compiler, run pcre_jit_test.exe.
-To test pcrecpp, run pcrecpp_unittest.exe, pcre_stringpiece_unittest.exe and
-pcre_scanner_unittest.exe.
-
-
-BUILDING UNDER WINDOWS CE WITH VISUAL STUDIO 200x
-
-Vincent Richomme sent a zip archive of files to help with this process. They
-can be found in the file "pcre-vsbuild.zip" in the Contrib directory of the FTP
-site.
-
-
-BUILDING UNDER WINDOWS WITH BCC5.5
-
-Michael Roy sent these comments about building PCRE under Windows with BCC5.5:
-
-Some of the core BCC libraries have a version of PCRE from 1998 built in, which
-can lead to pcre_exec() giving an erroneous PCRE_ERROR_NULL from a version
-mismatch. I'm including an easy workaround below, if you'd like to include it
-in the non-unix instructions:
-
-When linking a project with BCC5.5, pcre.lib must be included before any of the
-libraries cw32.lib, cw32i.lib, cw32mt.lib, and cw32mti.lib on the command line.
-
-
-BUILDING USING BORLAND C++ BUILDER 2007 (CB2007) AND HIGHER
-
-A PCRE user sent these comments about this environment (see also the comment
-from another user that follows them):
-
-The XE versions of C++ Builder come with a RegularExpressionsCore class which
-contain a version of TPerlRegEx. However, direct use of the C PCRE library may
-be desirable.
-
-The default makevp.bat, however, supplied with PCRE builds a version of PCRE
-that is not usable with any version of C++ Builder because the compiler ships
-with an embedded version of PCRE, version 2.01 from 1998! [See also the note
-about BCC5.5 above.] If you want to use PCRE you'll need to rename the
-functions (pcre_compile to pcre_compile_bcc, etc) or do as I have done and just
-use the 16 bit versions. I'm using std::wstring everywhere anyway. Since the
-embedded version of PCRE does not have the 16 bit function names, there is no
-conflict.
-
-Building PCRE using a C++ Builder static library project file (recommended):
-
-1. Rename or remove pcre.h, pcreposi.h, and pcreposix.h from your C++ Builder
-original include path.
-
-2. Download PCRE from pcre.org and extract to a directory.
-
-3. Rename pcre_chartables.c.dist to pcre_chartables.c, pcre.h.generic to
-pcre.h, and config.h.generic to config.h.
-
-4. Edit pcre.h and pcre_config.c so that they include config.h.
-
-5. Edit config.h like so:
-
-Comment out the following lines:
-#define PACKAGE "pcre"
-#define PACKAGE_BUGREPORT ""
-#define PACKAGE_NAME "PCRE"
-#define PACKAGE_STRING "PCRE 8.32"
-#define PACKAGE_TARNAME "pcre"
-#define PACKAGE_URL ""
-#define PACKAGE_VERSION "8.32"
-
-Add the following lines:
-#ifndef SUPPORT_UTF
-#define SUPPORT_UTF 100 // any value is fine
-#endif
-
-#ifndef SUPPORT_UCP
-#define SUPPORT_UCP 101 // any value is fine
-#endif
-
-#ifndef SUPPORT_UCP
-#define SUPPORT_PCRE16 102 // any value is fine
-#endif
-
-#ifndef SUPPORT_UTF8
-#define SUPPORT_UTF8 103 // any value is fine
-#endif
-
-6. Build a C++ Builder project using the IDE. Go to File / New / Other and
-choose Static Library. You can name it pcre.cbproj or whatever. Now set your
-paths by going to Project / Options. Set the Include path. Do this from the
-"Base" option to apply to both Release and Debug builds. Now add the following
-files to the project:
-
-pcre.h
-pcre16_byte_order.c
-pcre16_chartables.c
-pcre16_compile.c
-pcre16_config.c
-pcre16_dfa_exec.c
-pcre16_exec.c
-pcre16_fullinfo.c
-pcre16_get.c
-pcre16_globals.c
-pcre16_maketables.c
-pcre16_newline.c
-pcre16_ord2utf16.c
-pcre16_printint.c
-pcre16_refcount.c
-pcre16_string_utils.c
-pcre16_study.c
-pcre16_tables.c
-pcre16_ucd.c
-pcre16_utf16_utils.c
-pcre16_valid_utf16.c
-pcre16_version.c
-pcre16_xclass.c
-
-//Optional
-pcre_version.c
-
-7. After compiling the .lib file, copy the .lib and header files to a project
-you want to use PCRE with. Enjoy.
-
-Optional ... Building PCRE using the makevp.bat file:
-
-1. Edit makevp_c.txt and makevp_l.txt and change all the names to the 16 bit
-versions.
-
-2. Edit makevp.bat and set the path to C++ Builder. Run makevp.bat.
-
-Another PCRE user added this comment:
-
-Another approach I successfully used for some years with BCB 5 and 6 was to
-make sure that include and library paths of PCRE are configured before the
-default paths of the IDE in the dialogs where one can manage those paths.
-Afterwards one can open the project files using a text editor and manually add
-the self created library for pcre itself, pcrecpp doesn't ship with the IDE, in
-the library nodes where the IDE manages its own libraries to link against in
-front of the IDE-own libraries. This way one can use the default PCRE function
-names without getting access violations on runtime.
-
-  <ALLLIB value="libpcre.lib $(LIBFILES) $(LIBRARIES) import32.lib cp32mt.lib"/>
-
-
-BUILDING PCRE ON OPENVMS
-
-Stephen Hoffman sent the following, in December 2012:
-
-"Here <http://labs.hoffmanlabs.com/node/1847> is a very short write-up on the
-OpenVMS port and here
-
-<http://labs.hoffmanlabs.com/labsnotes/pcre-vms-8_32.zip>
-
-is a zip with the OpenVMS files, and with one modified testing-related PCRE
-file." This is a port of PCRE 8.32.
-
-Earlier, 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
-$!
-=========================
-
-
-BUILDING PCRE ON STRATUS OPENVOS
-
-These notes on the port of PCRE to VOS (lightly edited) were supplied by
-Ashutosh Warikoo, whose email address has the local part awarikoo and the
-domain nse.co.in. The port was for version 7.9 in August 2009.
-
-1.   Building PCRE
-
-I built pcre on OpenVOS Release 17.0.1at using GNU Tools 3.4a without any
-problems. I used the following packages to build PCRE:
-
-  ftp://ftp.stratus.com/pub/vos/posix/ga/posix.save.evf.gz
-
-Please read and follow the instructions that come with these packages. To start
-the build of pcre, from the root of the package type:
-
-  ./build.sh
-
-2. Installing PCRE
-
-Once you have successfully built PCRE, login to the SysAdmin group, switch to
-the root user, and type
-
-  [ !create_dir (master_disk)>usr   --if needed ]
-  [ !create_dir (master_disk)>usr>local   --if needed ]
-    !gmake install
-
-This installs PCRE and its man pages into /usr/local. You can add
-(master_disk)>usr>local>bin to your command search paths, or if you are in
-BASH, add /usr/local/bin to the PATH environment variable.
-
-4. Restrictions
-
-This port requires readline library optionally. However during the build I
-faced some yet unexplored errors while linking with readline. As it was an
-optional component I chose to disable it.
-
-5. Known Problems
-
-I ran the test suite, but you will have to be your own judge of whether this
-command, and this port, suits your purposes. If you find any problems that
-appear to be related to the port itself, please let me know. Please see the
-build.log file in the root of the package also.
-
-
-BUILDING PCRE ON NATIVE Z/OS AND Z/VM
-
-z/OS and z/VM are operating systems for mainframe computers, produced by IBM.
-The character code used is EBCDIC, not ASCII or Unicode. In z/OS, UNIX APIs and
-applications can be supported through UNIX System Services, and in such an
-environment PCRE can be built in the same way as in other systems. However, in
-native z/OS (without UNIX System Services) and in z/VM, special ports are
-required. For details, please see this web site:
-
-  http://www.zaconsultants.net
-
-You may download PCRE from WWW.CBTTAPE.ORG, file 882.  Everything, source and
-executable, is in EBCDIC and native z/OS file formats and this is the
-recommended download site.
-
-==========================
-Last Updated: 25 June 2015
diff --git a/dist/NON-UNIX-USE b/dist/NON-UNIX-USE
deleted file mode 100644
index a25546b..0000000
--- a/dist/NON-UNIX-USE
+++ /dev/null
@@ -1,7 +0,0 @@
-Compiling PCRE on non-Unix systems
-----------------------------------
-
-This has been renamed to better reflect its contents. Please see the file
-NON-AUTOTOOLS-BUILD for details of how to build PCRE without using autotools.
-
-####
diff --git a/dist/README b/dist/README
deleted file mode 100644
index 4887ebf..0000000
--- a/dist/README
+++ /dev/null
@@ -1,1002 +0,0 @@
-README file for PCRE (Perl-compatible regular expression library)
------------------------------------------------------------------
-
-NOTE: This set of files relates to PCRE releases that use the original API,
-with library names libpcre, libpcre16, and libpcre32. January 2015 saw the
-first release of a new API, known as PCRE2, with release numbers starting at
-10.00 and library names libpcre2-8, libpcre2-16, and libpcre2-32. The old
-libraries (now called PCRE1) are still being maintained for bug fixes, but
-there will be no new development. New projects are advised to use the new PCRE2
-libraries.
-
-
-The latest release of PCRE1 is always available in three alternative formats
-from:
-
-  ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-xxx.tar.gz
-  ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-xxx.tar.bz2
-  ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-xxx.zip
-
-There is a mailing list for discussion about the development of PCRE at
-pcre-dev@exim.org. You can access the archives and subscribe or manage your
-subscription here:
-
-   https://lists.exim.org/mailman/listinfo/pcre-dev
-
-Please read the NEWS file if you are upgrading from a previous release.
-The contents of this README file are:
-
-  The PCRE APIs
-  Documentation for PCRE
-  Contributions by users of PCRE
-  Building PCRE on non-Unix-like systems
-  Building PCRE without using autotools
-  Building PCRE using autotools
-  Retrieving configuration information
-  Shared libraries
-  Cross-compiling using autotools
-  Using HP's ANSI C++ compiler (aCC)
-  Compiling in Tru64 using native compilers
-  Using Sun's compilers for Solaris
-  Using PCRE from MySQL
-  Making new tarballs
-  Testing PCRE
-  Character tables
-  File manifest
-
-
-The PCRE APIs
--------------
-
-PCRE is written in C, and it has its own API. There are three sets of
-functions, one for the 8-bit library, which processes strings of bytes, one for
-the 16-bit library, which processes strings of 16-bit values, and one for the
-32-bit library, which processes strings of 32-bit values. The distribution also
-includes a set of C++ wrapper functions (see the pcrecpp man page for details),
-courtesy of Google Inc., which can be used to call the 8-bit PCRE library from
-C++. Other C++ wrappers have been created from time to time. See, for example:
-https://github.com/YasserAsmi/regexp, which aims to be simple and similar in
-style to the C API.
-
-The distribution also contains a set of C wrapper functions (again, just for
-the 8-bit library) that are based on the POSIX regular expression API (see the
-pcreposix man page). 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 POSIX API is restricted,
-and does not give full access to all of PCRE's facilities.
-
-The header file for the POSIX-style functions is called pcreposix.h. The
-official POSIX name is regex.h, but I did not want to risk possible problems
-with existing files of that name by distributing it that way. To use PCRE with
-an existing program that uses the POSIX API, pcreposix.h 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, as well as worrying about the regex.h header
-file (as mentioned above), you must also take care when linking programs to
-ensure that they link with PCRE's libpcreposix library. Otherwise they may pick
-up the POSIX functions of the same name from the other library.
-
-One way of avoiding this confusion is to compile PCRE with the addition of
--Dregcomp=PCREregcomp (and similarly for the other POSIX functions) to the
-compiler flags (CFLAGS if you are using "configure" -- see below). This has the
-effect of renaming the functions so that the names no longer clash. Of course,
-you have to do the same thing for your applications, or write them using the
-new names.
-
-
-Documentation for PCRE
-----------------------
-
-If you install PCRE in the normal way on a Unix-like system, you will end up
-with a set of man pages whose names all start with "pcre". The one that is just
-called "pcre" lists all the others. In addition to these man pages, the PCRE
-documentation is supplied in two other forms:
-
-  1. There are files called doc/pcre.txt, doc/pcregrep.txt, and
-     doc/pcretest.txt in the source distribution. The first of these is a
-     concatenation of the text forms of all the section 3 man pages except
-     the listing of pcredemo.c and those that summarize individual functions.
-     The other two are the text forms of the section 1 man pages for the
-     pcregrep and pcretest commands. These text forms are provided for ease of
-     scanning with text editors or similar tools. They are installed in
-     <prefix>/share/doc/pcre, where <prefix> is the installation prefix
-     (defaulting to /usr/local).
-
-  2. A set of files containing all the documentation in HTML form, hyperlinked
-     in various ways, and rooted in a file called index.html, is distributed in
-     doc/html and installed in <prefix>/share/doc/pcre/html.
-
-Users of PCRE have contributed files containing the documentation for various
-releases in CHM format. These can be found in the Contrib directory of the FTP
-site (see next section).
-
-
-Contributions by users of PCRE
-------------------------------
-
-You can find contributions from PCRE users in the directory
-
-  ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/Contrib
-
-There is a README file giving brief descriptions of what they are. Some are
-complete in themselves; others are pointers to URLs containing relevant files.
-Some of this material is likely to be well out-of-date. Several of the earlier
-contributions provided support for compiling PCRE on various flavours of
-Windows (I myself do not use Windows). Nowadays there is more Windows support
-in the standard distribution, so these contibutions have been archived.
-
-A PCRE user maintains downloadable Windows binaries of the pcregrep and
-pcretest programs here:
-
-  http://www.rexegg.com/pcregrep-pcretest.html
-
-
-Building PCRE on non-Unix-like systems
---------------------------------------
-
-For a non-Unix-like system, please read the comments in the file
-NON-AUTOTOOLS-BUILD, though if your system supports the use of "configure" and
-"make" you may be able to build PCRE using autotools in the same way as for
-many Unix-like systems.
-
-PCRE can also be configured using the GUI facility provided by CMake's
-cmake-gui command. This creates Makefiles, solution files, etc. The file
-NON-AUTOTOOLS-BUILD has information about CMake.
-
-PCRE has been compiled on many different operating systems. It should be
-straightforward to build PCRE on any system that has a Standard C compiler and
-library, because it uses only Standard C functions.
-
-
-Building PCRE without using autotools
--------------------------------------
-
-The use of autotools (in particular, libtool) is problematic in some
-environments, even some that are Unix or Unix-like. See the NON-AUTOTOOLS-BUILD
-file for ways of building PCRE without using autotools.
-
-
-Building PCRE using autotools
------------------------------
-
-If you are using HP's ANSI C++ compiler (aCC), please see the special note
-in the section entitled "Using HP's ANSI C++ compiler (aCC)" below.
-
-The following instructions assume the use of the widely used "configure; make;
-make install" (autotools) process.
-
-To build PCRE on system that supports autotools, first run the "configure"
-command from the PCRE distribution directory, with your current directory set
-to the directory where you want the files to be created. This command is a
-standard GNU "autoconf" configuration script, for which generic instructions
-are supplied in the file INSTALL.
-
-Most commonly, people build PCRE within its own distribution directory, and in
-this case, on many systems, just running "./configure" is sufficient. However,
-the usual methods of changing standard defaults are available. For example:
-
-CFLAGS='-O2 -Wall' ./configure --prefix=/opt/local
-
-This command specifies that the C compiler should be run with the flags '-O2
--Wall' instead of the default, and that "make install" should install PCRE
-under /opt/local instead of the default /usr/local.
-
-If you want to build in a different directory, just run "configure" with that
-directory as current. For example, suppose you have unpacked the PCRE source
-into /source/pcre/pcre-xxx, but you want to build it in /build/pcre/pcre-xxx:
-
-cd /build/pcre/pcre-xxx
-/source/pcre/pcre-xxx/configure
-
-PCRE is written in C and is normally compiled as a C library. However, it is
-possible to build it as a C++ library, though the provided building apparatus
-does not have any features to support this.
-
-There are some optional features that can be included or omitted from the PCRE
-library. They are also documented in the pcrebuild man page.
-
-. By default, both shared and static libraries are built. You can change this
-  by adding one of these options to the "configure" command:
-
-  --disable-shared
-  --disable-static
-
-  (See also "Shared libraries on Unix-like systems" below.)
-
-. By default, only the 8-bit library is built. If you add --enable-pcre16 to
-  the "configure" command, the 16-bit library is also built. If you add
-  --enable-pcre32 to the "configure" command, the 32-bit library is also built.
-  If you want only the 16-bit or 32-bit library, use --disable-pcre8 to disable
-  building the 8-bit library.
-
-. If you are building the 8-bit library and want to suppress the building of
-  the C++ wrapper library, you can add --disable-cpp to the "configure"
-  command. Otherwise, when "configure" is run without --disable-pcre8, it 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 include support for just-in-time compiling, which can give
-  large performance improvements on certain platforms, add --enable-jit to the
-  "configure" command. This support is available only for certain hardware
-  architectures. If you try to enable it on an unsupported architecture, there
-  will be a compile time error.
-
-. When JIT support is enabled, pcregrep automatically makes use of it, unless
-  you add --disable-pcregrep-jit to the "configure" command.
-
-. If you want to make use of the support for UTF-8 Unicode character strings in
-  the 8-bit library, or UTF-16 Unicode character strings in the 16-bit library,
-  or UTF-32 Unicode character strings in the 32-bit library, you must add
-  --enable-utf to the "configure" command. Without it, the code for handling
-  UTF-8, UTF-16 and UTF-8 is not included in the relevant library. Even
-  when --enable-utf is included, the use of a UTF encoding still has to be
-  enabled by an option at run time. When PCRE is compiled with this option, its
-  input can only either be ASCII or UTF-8/16/32, even when running on EBCDIC
-  platforms. It is not possible to use both --enable-utf and --enable-ebcdic at
-  the same time.
-
-. There are no separate options for enabling UTF-8, UTF-16 and UTF-32
-  independently because that would allow ridiculous settings such as requesting
-  UTF-16 support while building only the 8-bit library. However, the option
-  --enable-utf8 is retained for backwards compatibility with earlier releases
-  that did not support 16-bit or 32-bit character strings. It is synonymous with
-  --enable-utf. It is not possible to configure one library with UTF support
-  and the other without in the same configuration.
-
-. If, in addition to support for UTF-8/16/32 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 30K 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 recognize either CR or LF or the sequence CRLF or any
-  of the preceding, or any of the Unicode newline sequences as indicating the
-  end of a line. Whatever you specify at build time is the default; the caller
-  of PCRE can change the selection at run time. The default newline indicator
-  is a single LF character (the Unix standard). You can specify the default
-  newline indicator by adding --enable-newline-is-cr or --enable-newline-is-lf
-  or --enable-newline-is-crlf or --enable-newline-is-anycrlf or
-  --enable-newline-is-any to the "configure" command, respectively.
-
-  If you specify --enable-newline-is-cr or --enable-newline-is-crlf, some of
-  the standard tests will fail, because the lines in the test files end with
-  LF. Even if the files are edited to change the line endings, there are likely
-  to be some failures. With --enable-newline-is-anycrlf or
-  --enable-newline-is-any, many tests should succeed, but there may be some
-  failures.
-
-. By default, the sequence \R in a pattern matches any Unicode line ending
-  sequence. This is independent of the option specifying what PCRE considers to
-  be the end of a line (see above). However, the caller of PCRE can restrict \R
-  to match only CR, LF, or CRLF. You can make this the default by adding
-  --enable-bsr-anycrlf to the "configure" command (bsr = "backslash R").
-
-. When called via the POSIX interface, PCRE uses malloc() to get additional
-  storage for processing capturing parentheses if there are more than 10 of
-  them in a pattern. You can increase this threshold by setting, for example,
-
-  --with-posix-malloc-threshold=20
-
-  on the "configure" command.
-
-. PCRE has a counter that limits the depth of nesting of parentheses in a
-  pattern. This limits the amount of system stack that a pattern uses when it
-  is compiled. The default is 250, but you can change it by setting, for
-  example,
-
-  --with-parens-nest-limit=500
-
-. PCRE has a counter that can be set to limit the amount of resources it uses
-  when matching a pattern. 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,
-
-  --with-match-limit=500000
-
-  on the "configure" command. This is just the default; individual calls to
-  pcre_exec() can supply their own value. There is more discussion on the
-  pcreapi man page.
-
-. There is a separate counter that limits the depth of recursive function calls
-  during a matching process. This also has a default of ten million, which is
-  essentially "unlimited". You can change the default by setting, for example,
-
-  --with-match-limit-recursion=500000
-
-  Recursive function calls use up the runtime stack; running out of stack can
-  cause programs to crash in strange ways. There is a discussion about stack
-  sizes in the pcrestack man page.
-
-. The default maximum compiled pattern size is around 64K. You can increase
-  this by adding --with-link-size=3 to the "configure" command. In the 8-bit
-  library, PCRE then uses three bytes instead of two for offsets to different
-  parts of the compiled pattern. In the 16-bit library, --with-link-size=3 is
-  the same as --with-link-size=4, which (in both libraries) uses four-byte
-  offsets. Increasing the internal link size reduces performance. In the 32-bit
-  library, the only supported link size is 4.
-
-. You can build PCRE so that its internal match() function that is called from
-  pcre_exec() does not call itself recursively. Instead, it uses memory blocks
-  obtained from the heap via the 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
-  normal execution of the pcre_exec() function; if JIT support is being
-  successfully used, it is not relevant. Equally, it does not apply to
-  pcre_dfa_exec(), which does not use deeply nested recursion. There is a
-  discussion about stack sizes in the pcrestack man page.
-
-. For speed, PCRE uses four tables for manipulating and identifying characters
-  whose code point values are less than 256. By default, it uses a set of
-  tables for ASCII encoding that is part of the distribution. If you specify
-
-  --enable-rebuild-chartables
-
-  a program called dftables is compiled and run in the default C locale when
-  you obey "make". It builds a source file called pcre_chartables.c. If you do
-  not specify this option, pcre_chartables.c is created as a copy of
-  pcre_chartables.c.dist. See "Character tables" below for further information.
-
-. It is possible to compile PCRE for use on systems that use EBCDIC as their
-  character code (as opposed to ASCII/Unicode) by specifying
-
-  --enable-ebcdic
-
-  This automatically implies --enable-rebuild-chartables (see above). However,
-  when PCRE is built this way, it always operates in EBCDIC. It cannot support
-  both EBCDIC and UTF-8/16/32. There is a second option, --enable-ebcdic-nl25,
-  which specifies that the code value for the EBCDIC NL character is 0x25
-  instead of the default 0x15.
-
-. In environments where valgrind is installed, if you specify
-
-  --enable-valgrind
-
-  PCRE will use valgrind annotations to mark certain memory regions as
-  unaddressable. This allows it to detect invalid memory accesses, and is
-  mostly useful for debugging PCRE itself.
-
-. In environments where the gcc compiler is used and lcov version 1.6 or above
-  is installed, if you specify
-
-  --enable-coverage
-
-  the build process implements a code coverage report for the test suite. The
-  report is generated by running "make coverage". If ccache is installed on
-  your system, it must be disabled when building PCRE for coverage reporting.
-  You can do this by setting the environment variable CCACHE_DISABLE=1 before
-  running "make" to build PCRE. There is more information about coverage
-  reporting in the "pcrebuild" documentation.
-
-. The pcregrep program currently supports only 8-bit data files, and so
-  requires the 8-bit PCRE library. It is possible to compile pcregrep to use
-  libz and/or libbz2, in order to read .gz and .bz2 files (respectively), by
-  specifying one or both of
-
-  --enable-pcregrep-libz
-  --enable-pcregrep-libbz2
-
-  Of course, the relevant libraries must be installed on your system.
-
-. The default size (in bytes) of the internal buffer used by pcregrep can be
-  set by, for example:
-
-  --with-pcregrep-bufsize=51200
-
-  The value must be a plain integer. The default is 20480.
-
-. It is possible to compile pcretest so that it links with the libreadline
-  or libedit libraries, by specifying, respectively,
-
-  --enable-pcretest-libreadline or --enable-pcretest-libedit
-
-  If this is done, when pcretest's input is from a terminal, it reads it using
-  the readline() function. This provides line-editing and history facilities.
-  Note that libreadline is GPL-licenced, so if you distribute a binary of
-  pcretest linked in this way, there may be licensing issues. These can be
-  avoided by linking with libedit (which has a BSD licence) instead.
-
-  Enabling libreadline causes the -lreadline option to be added to the pcretest
-  build. In many operating environments with a sytem-installed readline
-  library this is sufficient. However, in some environments (e.g. if an
-  unmodified distribution version of readline is in use), it may be necessary
-  to specify something like LIBS="-lncurses" as well. This is because, to quote
-  the readline INSTALL, "Readline uses the termcap functions, but does not link
-  with the termcap or curses library itself, allowing applications which link
-  with readline the to choose an appropriate library." If you get error
-  messages about missing functions tgetstr, tgetent, tputs, tgetflag, or tgoto,
-  this is the problem, and linking with the ncurses library should fix it.
-
-The "configure" script builds the following files for the basic C library:
-
-. Makefile             the makefile that builds the library
-. config.h             build-time configuration options for the library
-. pcre.h               the public PCRE header file
-. pcre-config          script that shows the building settings such as CFLAGS
-                         that were set for "configure"
-. libpcre.pc         ) data for the pkg-config command
-. libpcre16.pc       )
-. libpcre32.pc       )
-. libpcreposix.pc    )
-. libtool              script that builds shared and/or static libraries
-
-Versions of config.h and pcre.h are distributed in the PCRE tarballs under the
-names config.h.generic and pcre.h.generic. These are provided for those who
-have to built PCRE without using "configure" or CMake. If you use "configure"
-or CMake, the .generic versions are not used.
-
-When building the 8-bit library, if a C++ compiler is found, the following
-files are also built:
-
-. libpcrecpp.pc        data for the pkg-config command
-. pcrecpparg.h         header file for calling PCRE via the C++ wrapper
-. pcre_stringpiece.h   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". This builds the the libraries
-libpcre, libpcre16 and/or libpcre32, and a test program called pcretest. If you
-enabled JIT support with --enable-jit, a test program called pcre_jit_test is
-built as well.
-
-If the 8-bit library is built, libpcreposix and the pcregrep command are also
-built, and if a C++ compiler was found on your system, and you did not disable
-it with --disable-cpp, "make" builds the C++ wrapper library, which is called
-libpcrecpp, as well as some test programs called pcrecpp_unittest,
-pcre_scanner_unittest, and pcre_stringpiece_unittest.
-
-The command "make check" runs all the appropriate tests. Details of the PCRE
-tests are given below in a separate section of this document.
-
-You can use "make install" to install PCRE into live directories on your
-system. The following are installed (file names are all relative to the
-<prefix> that is set when "configure" is run):
-
-  Commands (bin):
-    pcretest
-    pcregrep (if 8-bit support is enabled)
-    pcre-config
-
-  Libraries (lib):
-    libpcre16     (if 16-bit support is enabled)
-    libpcre32     (if 32-bit support is enabled)
-    libpcre       (if 8-bit support is enabled)
-    libpcreposix  (if 8-bit support is enabled)
-    libpcrecpp    (if 8-bit and C++ support is enabled)
-
-  Configuration information (lib/pkgconfig):
-    libpcre16.pc
-    libpcre32.pc
-    libpcre.pc
-    libpcreposix.pc
-    libpcrecpp.pc (if C++ support is enabled)
-
-  Header files (include):
-    pcre.h
-    pcreposix.h
-    pcre_scanner.h      )
-    pcre_stringpiece.h  ) if C++ support is enabled
-    pcrecpp.h           )
-    pcrecpparg.h        )
-
-  Man pages (share/man/man{1,3}):
-    pcregrep.1
-    pcretest.1
-    pcre-config.1
-    pcre.3
-    pcre*.3 (lots more pages, all starting "pcre")
-
-  HTML documentation (share/doc/pcre/html):
-    index.html
-    *.html (lots more pages, hyperlinked from index.html)
-
-  Text file documentation (share/doc/pcre):
-    AUTHORS
-    COPYING
-    ChangeLog
-    LICENCE
-    NEWS
-    README
-    pcre.txt         (a concatenation of the man(3) pages)
-    pcretest.txt     the pcretest man page
-    pcregrep.txt     the pcregrep man page
-    pcre-config.txt  the pcre-config man page
-
-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
-------------------------------------
-
-Running "make install" installs the command pcre-config, which can be used to
-recall information about the PCRE configuration and installation. For example:
-
-  pcre-config --version
-
-prints the version number, and
-
-  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:
-
-  pkg-config --cflags pcre
-
-The data is held in *.pc files that are installed in a directory called
-<prefix>/lib/pkgconfig.
-
-
-Shared libraries
-----------------
-
-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
-libraries. They are placed in a subdirectory called .libs when they are newly
-built. The programs pcretest and pcregrep are built to use these uninstalled
-libraries (by means of wrapper scripts in the case of shared libraries). When
-you use "make install" to install shared libraries, pcregrep and pcretest are
-automatically re-built to use the newly installed shared libraries before being
-installed themselves. However, the versions left in the build directory still
-use the uninstalled libraries.
-
-To build PCRE using static libraries only you must use --disable-shared when
-configuring it. For example:
-
-./configure --prefix=/usr/gnu --disable-shared
-
-Then run "make" in the usual way. Similarly, you can use --disable-static to
-build only shared libraries.
-
-
-Cross-compiling using autotools
--------------------------------
-
-You can specify CC and CFLAGS in the normal way to the "configure" command, in
-order to cross-compile PCRE for some other host. However, you should NOT
-specify --enable-rebuild-chartables, because if you do, the dftables.c source
-file is compiled and run on the local host, in order to generate the inbuilt
-character tables (the pcre_chartables.c file). This will probably not work,
-because dftables.c needs to be compiled with the local compiler, not the cross
-compiler.
-
-When --enable-rebuild-chartables is not specified, pcre_chartables.c is created
-by making a copy of pcre_chartables.c.dist, which is a default set of tables
-that assumes ASCII code. Cross-compiling with the default tables should not be
-a problem.
-
-If you need to modify the character tables when cross-compiling, you should
-move pcre_chartables.c.dist out of the way, then compile dftables.c by hand and
-run it on the local host to make a new version of pcre_chartables.c.dist.
-Then when you cross-compile PCRE this new version of the tables will be used.
-
-
-Using HP's ANSI C++ compiler (aCC)
-----------------------------------
-
-Unless C++ support is disabled by specifying the "--disable-cpp" option of the
-"configure" script, you must include the "-AA" option in the CXXFLAGS
-environment variable in order for the C++ components to compile correctly.
-
-Also, note that the aCC compiler on PA-RISC platforms may have a defect whereby
-needed libraries fail to get included when specifying the "-AA" compiler
-option. If you experience unresolved symbols when linking the C++ programs,
-use the workaround of specifying the following environment variable prior to
-running the "configure" script:
-
-  CXXLDFLAGS="-lstd_v2 -lCsup_v2"
-
-
-Compiling in Tru64 using native compilers
------------------------------------------
-
-The following error may occur when compiling with native compilers in the Tru64
-operating system:
-
-  CXX    libpcrecpp_la-pcrecpp.lo
-cxx: Error: /usr/lib/cmplrs/cxx/V7.1-006/include/cxx/iosfwd, line 58: #error
-          directive: "cannot include iosfwd -- define __USE_STD_IOSTREAM to
-          override default - see section 7.1.2 of the C++ Using Guide"
-#error "cannot include iosfwd -- define __USE_STD_IOSTREAM to override default
-- see section 7.1.2 of the C++ Using Guide"
-
-This may be followed by other errors, complaining that 'namespace "std" has no
-member'. The solution to this is to add the line
-
-#define __USE_STD_IOSTREAM 1
-
-to the config.h file.
-
-
-Using Sun's compilers for Solaris
----------------------------------
-
-A user reports that the following configurations work on Solaris 9 sparcv9 and
-Solaris 9 x86 (32-bit):
-
-  Solaris 9 sparcv9: ./configure --disable-cpp CC=/bin/cc CFLAGS="-m64 -g"
-  Solaris 9 x86:     ./configure --disable-cpp CC=/bin/cc CFLAGS="-g"
-
-
-Using PCRE from MySQL
----------------------
-
-On systems where both PCRE and MySQL are installed, it is possible to make use
-of PCRE from within MySQL, as an alternative to the built-in pattern matching.
-There is a web page that tells you how to do this:
-
-  http://www.mysqludf.org/lib_mysqludf_preg/index.php
-
-
-Making new tarballs
--------------------
-
-The command "make dist" creates three PCRE tarballs, in tar.gz, tar.bz2, and
-zip formats. The command "make distcheck" does the same, but then does a trial
-build of the new distribution to ensure that it works.
-
-If you have modified any of the man page sources in the doc directory, you
-should first run the PrepareRelease script before making a distribution. This
-script creates the .txt and HTML forms of the documentation from the man pages.
-
-
-Testing PCRE
-------------
-
-To test the basic PCRE library on a Unix-like system, run the RunTest script.
-There is another script called RunGrepTest that tests the options of the
-pcregrep command. If the C++ wrapper library is built, three test programs
-called pcrecpp_unittest, pcre_scanner_unittest, and pcre_stringpiece_unittest
-are also built. When JIT support is enabled, another test program called
-pcre_jit_test is built.
-
-Both the scripts and all the program tests are run if you obey "make check" or
-"make test". For other environments, see the instructions in
-NON-AUTOTOOLS-BUILD.
-
-The RunTest script runs the pcretest test program (which is documented in its
-own man page) on each of the relevant testinput files in the testdata
-directory, and compares the output with the contents of the corresponding
-testoutput files. RunTest uses a file called testtry to hold the main output
-from pcretest. Other files whose names begin with "test" are used as working
-files in some tests.
-
-Some tests are relevant only when certain build-time options were selected. For
-example, the tests for UTF-8/16/32 support are run only if --enable-utf was
-used. RunTest outputs a comment when it skips a test.
-
-Many of the tests that are not skipped are run up to three times. The second
-run forces pcre_study() to be called for all patterns except for a few in some
-tests that are marked "never study" (see the pcretest program for how this is
-done). If JIT support is available, the non-DFA tests are run a third time,
-this time with a forced pcre_study() with the PCRE_STUDY_JIT_COMPILE option.
-This testing can be suppressed by putting "nojit" on the RunTest command line.
-
-The entire set of tests is run once for each of the 8-bit, 16-bit and 32-bit
-libraries that are enabled. If you want to run just one set of tests, call
-RunTest with either the -8, -16 or -32 option.
-
-If valgrind is installed, you can run the tests under it by putting "valgrind"
-on the RunTest command line. To run pcretest on just one or more specific test
-files, give their numbers as arguments to RunTest, for example:
-
-  RunTest 2 7 11
-
-You can also specify ranges of tests such as 3-6 or 3- (meaning 3 to the
-end), or a number preceded by ~ to exclude a test. For example:
-
-  Runtest 3-15 ~10
-
-This runs tests 3 to 15, excluding test 10, and just ~13 runs all the tests
-except test 13. Whatever order the arguments are in, the tests are always run
-in numerical order.
-
-You can also call RunTest with the single argument "list" to cause it to output
-a list of tests.
-
-The first test file can be fed directly into the perltest.pl script to check
-that Perl gives the same results. The only difference you should see is in the
-first few lines, where the Perl version is given instead of the PCRE version.
-
-The second set of tests check pcre_fullinfo(), pcre_study(),
-pcre_copy_substring(), pcre_get_substring(), pcre_get_substring_list(), error
-detection, and run-time flags that are specific to PCRE, as well as the POSIX
-wrapper API. It also uses the debugging flags to check some of the internals of
-pcre_compile().
-
-If you build PCRE with a locale setting that is not the standard C locale, the
-character tables may be different (see next paragraph). In some cases, this may
-cause failures in the second set of tests. For example, in a locale where the
-isprint() function yields TRUE for characters in the range 128-255, the use of
-[:isascii:] inside a character class defines a different set of characters, and
-this shows up in this test as a difference in the compiled code, which is being
-listed for checking. Where the comparison test output contains [\x00-\x7f] the
-test will contain [\x00-\xff], and similarly in some other cases. This is not a
-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_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_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.
-
-[If you are trying to run this test on Windows, you may be able to get it to
-work by changing "fr_FR" to "french" everywhere it occurs. Alternatively, use
-RunTest.bat. The version of RunTest.bat included with PCRE 7.4 and above uses
-Windows versions of test 2. More info on using RunTest.bat is included in the
-document entitled NON-UNIX-USE.]
-
-The fourth and fifth tests check the UTF-8/16/32 support and error handling and
-internal UTF features of PCRE that are not relevant to Perl, respectively. The
-sixth and seventh tests do the same for Unicode character properties support.
-
-The eighth, ninth, and tenth tests check the pcre_dfa_exec() alternative
-matching function, in non-UTF-8/16/32 mode, UTF-8/16/32 mode, and UTF-8/16/32
-mode with Unicode property support, respectively.
-
-The eleventh test checks some internal offsets and code size features; it is
-run only when the default "link size" of 2 is set (in other cases the sizes
-change) and when Unicode property support is enabled.
-
-The twelfth test is run only when JIT support is available, and the thirteenth
-test is run only when JIT support is not available. They test some JIT-specific
-features such as information output from pcretest about JIT compilation.
-
-The fourteenth, fifteenth, and sixteenth tests are run only in 8-bit mode, and
-the seventeenth, eighteenth, and nineteenth tests are run only in 16/32-bit
-mode. These are tests that generate different output in the two modes. They are
-for general cases, UTF-8/16/32 support, and Unicode property support,
-respectively.
-
-The twentieth test is run only in 16/32-bit mode. It tests some specific
-16/32-bit features of the DFA matching engine.
-
-The twenty-first and twenty-second tests are run only in 16/32-bit mode, when
-the link size is set to 2 for the 16-bit library. They test reloading
-pre-compiled patterns.
-
-The twenty-third and twenty-fourth tests are run only in 16-bit mode. They are
-for general cases, and UTF-16 support, respectively.
-
-The twenty-fifth and twenty-sixth tests are run only in 32-bit mode. They are
-for general cases, and UTF-32 support, respectively.
-
-
-Character tables
-----------------
-
-For speed, PCRE uses four tables for manipulating and identifying characters
-whose code point 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 pcre_chartables.c contains the default set of tables. By
-default, this is created as a copy of pcre_chartables.c.dist, which contains
-tables for ASCII coding. However, if --enable-rebuild-chartables is specified
-for ./configure, a different version of pcre_chartables.c is built by the
-program dftables (compiled from dftables.c), which uses the ANSI C character
-handling functions such as isalnum(), isalpha(), isupper(), islower(), etc. to
-build the table sources. This means that the default C locale which is set for
-your system will control the contents of these default tables. You can change
-the default tables by editing pcre_chartables.c and then re-building PCRE. If
-you do this, you should take care to ensure that the file does not get
-automatically re-generated. The best way to do this is to move
-pcre_chartables.c.dist out of the way and replace it with your customized
-tables.
-
-When the dftables program is run as a result of --enable-rebuild-chartables,
-it uses the default C locale that is set on your system. It does not pay
-attention to the LC_xxx environment variables. In other words, it uses the
-system's default locale rather than whatever the compiling user happens to have
-set. If you really do want to build a source set of character tables in a
-locale that is specified by the LC_xxx variables, you can run the dftables
-program by hand with the -L option. For example:
-
-  ./dftables -L pcre_chartables.c.special
-
-The first two 256-byte tables provide lower casing and case flipping functions,
-respectively. The next table consists of three 32-byte bit maps which identify
-digits, "word" characters, and white space, respectively. These are used when
-building 32-byte bit maps that represent character classes for code points less
-than 256.
-
-The final 256-byte table has bits indicating various character types, as
-follows:
-
-    1   white space character
-    2   letter
-    4   decimal digit
-    8   hexadecimal digit
-   16   alphanumeric or '_'
-  128   regular expression metacharacter or binary zero
-
-You should not alter the set of characters that contain the 128 bit, as that
-will cause PCRE to malfunction.
-
-
-File manifest
--------------
-
-The distribution should contain the files listed below. Where a file name is
-given as pcre[16|32]_xxx it means that there are three files, one with the name
-pcre_xxx, one with the name pcre16_xx, and a third with the name pcre32_xxx.
-
-(A) Source files of the PCRE library functions and their headers:
-
-  dftables.c              auxiliary program for building pcre_chartables.c
-                          when --enable-rebuild-chartables is specified
-
-  pcre_chartables.c.dist  a default set of character tables that assume ASCII
-                          coding; used, unless --enable-rebuild-chartables is
-                          specified, by copying to pcre[16]_chartables.c
-
-  pcreposix.c                )
-  pcre[16|32]_byte_order.c   )
-  pcre[16|32]_compile.c      )
-  pcre[16|32]_config.c       )
-  pcre[16|32]_dfa_exec.c     )
-  pcre[16|32]_exec.c         )
-  pcre[16|32]_fullinfo.c     )
-  pcre[16|32]_get.c          ) sources for the functions in the library,
-  pcre[16|32]_globals.c      )   and some internal functions that they use
-  pcre[16|32]_jit_compile.c  )
-  pcre[16|32]_maketables.c   )
-  pcre[16|32]_newline.c      )
-  pcre[16|32]_refcount.c     )
-  pcre[16|32]_string_utils.c )
-  pcre[16|32]_study.c        )
-  pcre[16|32]_tables.c       )
-  pcre[16|32]_ucd.c          )
-  pcre[16|32]_version.c      )
-  pcre[16|32]_xclass.c       )
-  pcre_ord2utf8.c            )
-  pcre_valid_utf8.c          )
-  pcre16_ord2utf16.c         )
-  pcre16_utf16_utils.c       )
-  pcre16_valid_utf16.c       )
-  pcre32_utf32_utils.c       )
-  pcre32_valid_utf32.c       )
-
-  pcre[16|32]_printint.c     ) debugging function that is used by pcretest,
-                             )   and can also be #included in pcre_compile()
-
-  pcre.h.in               template for pcre.h when built by "configure"
-  pcreposix.h             header for the external POSIX wrapper API
-  pcre_internal.h         header for internal use
-  sljit/*                 16 files that make up the JIT compiler
-  ucp.h                   header for Unicode property handling
-
-  config.h.in             template for config.h, which is built by "configure"
-
-  pcrecpp.h               public header file for the C++ wrapper
-  pcrecpparg.h.in         template for another C++ header file
-  pcre_scanner.h          public header file for C++ scanner functions
-  pcrecpp.cc              )
-  pcre_scanner.cc         ) source for the C++ wrapper library
-
-  pcre_stringpiece.h.in   template for pcre_stringpiece.h, the header for the
-                            C++ stringpiece functions
-  pcre_stringpiece.cc     source for the C++ stringpiece functions
-
-(B) Source files for programs that use PCRE:
-
-  pcredemo.c              simple demonstration of coding calls to PCRE
-  pcregrep.c              source of a grep utility that uses PCRE
-  pcretest.c              comprehensive test program
-
-(C) Auxiliary files:
-
-  132html                 script to turn "man" pages into HTML
-  AUTHORS                 information about the author of PCRE
-  ChangeLog               log of changes to the code
-  CleanTxt                script to clean nroff output for txt man pages
-  Detrail                 script to remove trailing spaces
-  HACKING                 some notes about the internals of PCRE
-  INSTALL                 generic installation instructions
-  LICENCE                 conditions for the use of PCRE
-  COPYING                 the same, using GNU's standard name
-  Makefile.in             ) template for Unix Makefile, which is built by
-                          )   "configure"
-  Makefile.am             ) the automake input that was used to create
-                          )   Makefile.in
-  NEWS                    important changes in this release
-  NON-UNIX-USE            the previous name for NON-AUTOTOOLS-BUILD
-  NON-AUTOTOOLS-BUILD     notes on building PCRE without using autotools
-  PrepareRelease          script to make preparations for "make dist"
-  README                  this file
-  RunTest                 a Unix shell script for running tests
-  RunGrepTest             a Unix shell script for pcregrep tests
-  aclocal.m4              m4 macros (generated by "aclocal")
-  config.guess            ) files used by libtool,
-  config.sub              )   used only when building a shared library
-  configure               a configuring shell script (built by autoconf)
-  configure.ac            ) the autoconf input that was used to build
-                          )   "configure" and config.h
-  depcomp                 ) script to find program dependencies, generated by
-                          )   automake
-  doc/*.3                 man page sources for PCRE
-  doc/*.1                 man page sources for pcregrep and pcretest
-  doc/index.html.src      the base HTML page
-  doc/html/*              HTML documentation
-  doc/pcre.txt            plain text version of the man pages
-  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
-  libpcre16.pc.in         template for libpcre16.pc for pkg-config
-  libpcre32.pc.in         template for libpcre32.pc for pkg-config
-  libpcre.pc.in           template for libpcre.pc for pkg-config
-  libpcreposix.pc.in      template for libpcreposix.pc for pkg-config
-  libpcrecpp.pc.in        template for libpcrecpp.pc for pkg-config
-  ltmain.sh               file used to build a libtool script
-  missing                 ) common stub for a few missing GNU programs while
-                          )   installing, generated by automake
-  mkinstalldirs           script for making install directories
-  perltest.pl             Perl test program
-  pcre-config.in          source of script which retains PCRE information
-  pcre_jit_test.c         test program for the JIT compiler
-  pcrecpp_unittest.cc          )
-  pcre_scanner_unittest.cc     ) test programs for the C++ wrapper
-  pcre_stringpiece_unittest.cc )
-  testdata/testinput*     test data for main library tests
-  testdata/testoutput*    expected test results
-  testdata/grep*          input and output for pcregrep tests
-  testdata/*              other supporting test files
-
-(D) Auxiliary files for cmake support
-
-  cmake/COPYING-CMAKE-SCRIPTS
-  cmake/FindPackageHandleStandardArgs.cmake
-  cmake/FindEditline.cmake
-  cmake/FindReadline.cmake
-  CMakeLists.txt
-  config-cmake.h.in
-
-(E) Auxiliary files for VPASCAL
-
-  makevp.bat
-  makevp_c.txt
-  makevp_l.txt
-  pcregexp.pas
-
-(F) Auxiliary files for building PCRE "by hand"
-
-  pcre.h.generic          ) a version of the public PCRE header file
-                          )   for use in non-"configure" environments
-  config.h.generic        ) a version of config.h for use in non-"configure"
-                          )   environments
-
-(F) Miscellaneous
-
-  RunTest.bat            a script for running tests under Windows
-
-Philip Hazel
-Email local part: ph10
-Email domain: cam.ac.uk
-Last updated: 10 February 2015
diff --git a/dist/RunGrepTest b/dist/RunGrepTest
deleted file mode 100755
index a6e93d3..0000000
--- a/dist/RunGrepTest
+++ /dev/null
@@ -1,584 +0,0 @@
-#! /bin/sh
-
-# Run pcregrep tests. The assumption is that the PCRE tests check the library
-# itself. What we are checking here is the file handling and options that are
-# supported by pcregrep. This script must be run in the build directory.
-
-# Set the C locale, so that sort(1) behaves predictably.
-
-LC_ALL=C
-export LC_ALL
-
-# Remove any non-default colouring and aliases that the caller may have set.
-
-unset PCREGREP_COLOUR PCREGREP_COLOR
-unset cp ls mv rm
-
-# Remember the current (build) directory, set the program to be tested, and
-# valgrind settings when requested.
-
-builddir=`pwd`
-pcregrep=$builddir/pcregrep
-
-valgrind=
-while [ $# -gt 0 ] ; do
-  case $1 in
-    valgrind) valgrind="valgrind -q --leak-check=no --smc-check=all";;
-    *) echo "RunGrepTest: Unknown argument $1"; exit 1;;
-  esac
-  shift
-done
-
-echo " "
-pcregrep_version=`$pcregrep -V`
-if [ "$valgrind" = "" ] ; then
-  echo "Testing $pcregrep_version"
-else
-  echo "Testing $pcregrep_version using valgrind"
-fi
-
-# Set up a suitable "diff" command for comparison. Some systems have a diff
-# that lacks a -u option. Try to deal with this; better do the test for the -b
-# option as well.
-
-cf="diff"
-diff -b  /dev/null /dev/null 2>/dev/null && cf="diff -b"
-diff -u  /dev/null /dev/null 2>/dev/null && cf="diff -u"
-diff -ub /dev/null /dev/null 2>/dev/null && cf="diff -ub"
-
-# If this test is being run from "make check", $srcdir will be set. If not, set
-# it to the current or parent directory, whichever one contains the test data.
-# Subsequently, we run most of the pcregrep tests in the source directory so
-# that the file names in the output are always the same.
-
-if [ -z "$srcdir" -o ! -d "$srcdir/testdata" ] ; then
-  if [ -d "./testdata" ] ; then
-    srcdir=.
-  elif [ -d "../testdata" ] ; then
-    srcdir=..
-  else
-    echo "Cannot find the testdata directory"
-    exit 1
-  fi
-fi
-
-# Check for the availability of UTF-8 support
-
-./pcretest -C utf >/dev/null
-utf8=$?
-
-echo "Testing pcregrep main features"
-
-echo "---------------------------- Test 1 ------------------------------" >testtrygrep
-(cd $srcdir; $valgrind $pcregrep PATTERN ./testdata/grepinput) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 2 ------------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep '^PATTERN' ./testdata/grepinput) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 3 ------------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep -in PATTERN ./testdata/grepinput) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 4 ------------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep -ic PATTERN ./testdata/grepinput) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 5 ------------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep -in PATTERN ./testdata/grepinput ./testdata/grepinputx) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 6 ------------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep -inh PATTERN ./testdata/grepinput ./testdata/grepinputx) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 7 ------------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep -il PATTERN ./testdata/grepinput ./testdata/grepinputx) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 8 ------------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep -l PATTERN ./testdata/grepinput ./testdata/grepinputx) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 9 ------------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep -q PATTERN ./testdata/grepinput ./testdata/grepinputx) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 10 -----------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep -q NEVER-PATTERN ./testdata/grepinput ./testdata/grepinputx) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 11 -----------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep -vn pattern ./testdata/grepinputx) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 12 -----------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep -ix pattern ./testdata/grepinputx) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 13 -----------------------------" >>testtrygrep
-echo seventeen >testtemp1grep
-(cd $srcdir; $valgrind $pcregrep -f./testdata/greplist -f $builddir/testtemp1grep ./testdata/grepinputx) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 14 -----------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep -w pat ./testdata/grepinput ./testdata/grepinputx) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 15 -----------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep 'abc^*' ./testdata/grepinput) 2>>testtrygrep >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 16 -----------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep abc ./testdata/grepinput ./testdata/nonexistfile) 2>>testtrygrep >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 17 -----------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep -M 'the\noutput' ./testdata/grepinput) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 18 -----------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep -Mn '(the\noutput|dog\.\n--)' ./testdata/grepinput) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 19 -----------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep -Mix 'Pattern' ./testdata/grepinputx) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 20 -----------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep -Mixn 'complete pair\nof lines' ./testdata/grepinputx) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 21 -----------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep -nA3 'four' ./testdata/grepinputx) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 22 -----------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep -nB3 'four' ./testdata/grepinputx) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 23 -----------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep -C3 'four' ./testdata/grepinputx) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 24 -----------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep -A9 'four' ./testdata/grepinputx) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 25 -----------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep -nB9 'four' ./testdata/grepinputx) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 26 -----------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep -A9 -B9 'four' ./testdata/grepinputx) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 27 -----------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep -A10 'four' ./testdata/grepinputx) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 28 -----------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep -nB10 'four' ./testdata/grepinputx) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 29 -----------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep -C12 -B10 'four' ./testdata/grepinputx) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 30 -----------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep -inB3 'pattern' ./testdata/grepinput ./testdata/grepinputx) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 31 -----------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep -inA3 'pattern' ./testdata/grepinput ./testdata/grepinputx) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 32 -----------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep -L 'fox' ./testdata/grepinput ./testdata/grepinputx) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 33 -----------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep 'fox' ./testdata/grepnonexist) >>testtrygrep 2>&1
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 34 -----------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep -s 'fox' ./testdata/grepnonexist) >>testtrygrep 2>&1
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 35 -----------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep -L -r --include=grepinputx --include grepinput8 --exclude-dir='^\.' 'fox' ./testdata | sort) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 36 -----------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep -L -r --include=grepinput --exclude 'grepinput$' --exclude=grepinput8 --exclude-dir='^\.' 'fox' ./testdata | sort) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 37 -----------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep  '^(a+)*\d' ./testdata/grepinput) >>testtrygrep 2>teststderrgrep
-echo "RC=$?" >>testtrygrep
-echo "======== STDERR ========" >>testtrygrep
-cat teststderrgrep >>testtrygrep
-
-echo "---------------------------- Test 38 ------------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep '>\x00<' ./testdata/grepinput) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 39 ------------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep -A1 'before the binary zero' ./testdata/grepinput) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 40 ------------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep -B1 'after the binary zero' ./testdata/grepinput) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 41 ------------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep -B1 -o '\w+ the binary zero' ./testdata/grepinput) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 42 ------------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep -B1 -onH '\w+ the binary zero' ./testdata/grepinput) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 43 ------------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep -on 'before|zero|after' ./testdata/grepinput) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 44 ------------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep -on -e before -ezero -e after ./testdata/grepinput) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 45 ------------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep -on -f ./testdata/greplist -e binary ./testdata/grepinput) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 46 ------------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep -eabc -e '(unclosed' ./testdata/grepinput) 2>>testtrygrep >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 47 ------------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep -Fx "AB.VE
-elephant" ./testdata/grepinput) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 48 ------------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep -F "AB.VE
-elephant" ./testdata/grepinput) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 49 ------------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep -F -e DATA -e "AB.VE
-elephant" ./testdata/grepinput) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 50 ------------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep "^(abc|def|ghi|jkl)" ./testdata/grepinputx) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 51 ------------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep -Mv "brown\sfox" ./testdata/grepinputv) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 52 ------------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep --colour=always jumps ./testdata/grepinputv) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 53 ------------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep --file-offsets 'before|zero|after' ./testdata/grepinput) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 54 ------------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep --line-offsets 'before|zero|after' ./testdata/grepinput) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 55 -----------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep -f./testdata/greplist --color=always ./testdata/grepinputx) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 56 -----------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep -c lazy ./testdata/grepinput*) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 57 -----------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep -c -l lazy ./testdata/grepinput*) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 58 -----------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep --regex=PATTERN ./testdata/grepinput) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 59 -----------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep --regexp=PATTERN ./testdata/grepinput) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 60 -----------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep --regex PATTERN ./testdata/grepinput) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 61 -----------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep --regexp PATTERN ./testdata/grepinput) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 62 -----------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep --match-limit=1000 --no-jit -M 'This is a file(.|\R)*file.' ./testdata/grepinput) >>testtrygrep 2>&1
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 63 -----------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep --recursion-limit=1000 --no-jit -M 'This is a file(.|\R)*file.' ./testdata/grepinput) >>testtrygrep 2>&1
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 64 ------------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep -o1 '(?<=PAT)TERN (ap(pear)s)' ./testdata/grepinput) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 65 ------------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep -o2 '(?<=PAT)TERN (ap(pear)s)' ./testdata/grepinput) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 66 ------------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep -o3 '(?<=PAT)TERN (ap(pear)s)' ./testdata/grepinput) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 67 ------------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep -o12 '(?<=PAT)TERN (ap(pear)s)' ./testdata/grepinput) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 68 ------------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep --only-matching=2 '(?<=PAT)TERN (ap(pear)s)' ./testdata/grepinput) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 69 -----------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep -vn --colour=always pattern ./testdata/grepinputx) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 70 -----------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep --color=always -M "triple:\t.*\n\n" ./testdata/grepinput3) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 71 -----------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep -o "^01|^02|^03" ./testdata/grepinput) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 72 -----------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep --color=always "^01|^02|^03" ./testdata/grepinput) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 73 -----------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep -o --colour=always "^01|^02|^03" ./testdata/grepinput) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 74 -----------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep -o "^01|02|^03" ./testdata/grepinput) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 75 -----------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep --color=always "^01|02|^03" ./testdata/grepinput) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 76 -----------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep -o --colour=always "^01|02|^03" ./testdata/grepinput) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 77 -----------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep -o "^01|^02|03" ./testdata/grepinput) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 78 -----------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep --color=always "^01|^02|03" ./testdata/grepinput) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 79 -----------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep -o --colour=always "^01|^02|03" ./testdata/grepinput) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 80 -----------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep -o "\b01|\b02" ./testdata/grepinput) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 81 -----------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep --color=always "\\b01|\\b02" ./testdata/grepinput) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 82 -----------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep -o --colour=always "\\b01|\\b02" ./testdata/grepinput) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 83 -----------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep --buffer-size=100 "^a" ./testdata/grepinput3) >>testtrygrep 2>&1
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 84 -----------------------------" >>testtrygrep
-echo testdata/grepinput3 >testtemp1grep
-(cd $srcdir; $valgrind $pcregrep --file-list ./testdata/grepfilelist --file-list $builddir/testtemp1grep "fox|complete|t7") >>testtrygrep 2>&1
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 85 -----------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep --file-list=./testdata/grepfilelist "dolor" ./testdata/grepinput3) >>testtrygrep 2>&1
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 86 -----------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep "dog" ./testdata/grepbinary) >>testtrygrep 2>&1
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 87 -----------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep "cat" ./testdata/grepbinary) >>testtrygrep 2>&1
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 88 -----------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep -v "cat" ./testdata/grepbinary) >>testtrygrep 2>&1
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 89 -----------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep -I "dog" ./testdata/grepbinary) >>testtrygrep 2>&1
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 90 -----------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep --binary-files=without-match "dog" ./testdata/grepbinary) >>testtrygrep 2>&1
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 91 -----------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep -a "dog" ./testdata/grepbinary) >>testtrygrep 2>&1
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 92 -----------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep --binary-files=text "dog" ./testdata/grepbinary) >>testtrygrep 2>&1
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 93 -----------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep --text "dog" ./testdata/grepbinary) >>testtrygrep 2>&1
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 94 -----------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep -L -r --include=grepinputx --include grepinput8 'fox' ./testdata/grepinput* | sort) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 95 -----------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep --file-list ./testdata/grepfilelist --exclude grepinputv "fox|complete") >>testtrygrep 2>&1
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 96 -----------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep -L -r --include-dir=testdata --exclude '^(?!grepinput)' 'fox' ./test* | sort) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 97 -----------------------------" >>testtrygrep
-echo "grepinput$" >testtemp1grep
-echo "grepinput8" >>testtemp1grep
-(cd $srcdir; $valgrind $pcregrep -L -r --include=grepinput --exclude-from $builddir/testtemp1grep --exclude-dir='^\.' 'fox' ./testdata | sort) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 98 -----------------------------" >>testtrygrep
-echo "grepinput$" >testtemp1grep
-echo "grepinput8" >>testtemp1grep
-(cd $srcdir; $valgrind $pcregrep -L -r --exclude=grepinput3 --include=grepinput --exclude-from $builddir/testtemp1grep --exclude-dir='^\.' 'fox' ./testdata | sort) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 99 -----------------------------" >>testtrygrep
-echo "grepinput$" >testtemp1grep
-echo "grepinput8" >testtemp2grep
-(cd $srcdir; $valgrind $pcregrep -L -r --include grepinput --exclude-from $builddir/testtemp1grep --exclude-from=$builddir/testtemp2grep --exclude-dir='^\.' 'fox' ./testdata | sort) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 100 ------------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep -Ho2 --only-matching=1 -o3 '(\w+) binary (\w+)(\.)?' ./testdata/grepinput) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 101 ------------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep -o3 -Ho2 -o12 --only-matching=1 -o3 --colour=always --om-separator='|' '(\w+) binary (\w+)(\.)?' ./testdata/grepinput) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 102 -----------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep -n "^$" ./testdata/grepinput3) >>testtrygrep 2>&1
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 103 -----------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep --only-matching "^$" ./testdata/grepinput3) >>testtrygrep 2>&1
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 104 -----------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep -n --only-matching "^$" ./testdata/grepinput3) >>testtrygrep 2>&1
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 105 -----------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep --colour=always "ipsum|" ./testdata/grepinput3) >>testtrygrep 2>&1
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 106 -----------------------------" >>testtrygrep
-(cd $srcdir; echo "a" | $valgrind $pcregrep -M "|a" ) >>testtrygrep 2>&1
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 107 -----------------------------" >>testtrygrep
-echo "a" >testtemp1grep
-echo "aaaaa" >>testtemp1grep
-(cd $srcdir; $valgrind $pcregrep  --line-offsets '(?<=\Ka)' $builddir/testtemp1grep) >>testtrygrep 2>&1
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 108 ------------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep -lq PATTERN ./testdata/grepinput ./testdata/grepinputx) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-echo "---------------------------- Test 109 -----------------------------" >>testtrygrep
-(cd $srcdir; $valgrind $pcregrep -cq lazy ./testdata/grepinput*) >>testtrygrep
-echo "RC=$?" >>testtrygrep
-
-# Now compare the results.
-
-$cf $srcdir/testdata/grepoutput testtrygrep
-if [ $? != 0 ] ; then exit 1; fi
-
-
-# These tests require UTF-8 support
-
-if [ $utf8 -ne 0 ] ; then
-  echo "Testing pcregrep UTF-8 features"
-
-  echo "---------------------------- Test U1 ------------------------------" >testtrygrep
-  (cd $srcdir; $valgrind $pcregrep -n -u --newline=any "^X" ./testdata/grepinput8) >>testtrygrep
-  echo "RC=$?" >>testtrygrep
-
-  echo "---------------------------- Test U2 ------------------------------" >>testtrygrep
-  (cd $srcdir; $valgrind $pcregrep -n -u -C 3 --newline=any "Match" ./testdata/grepinput8) >>testtrygrep
-  echo "RC=$?" >>testtrygrep
-
-  $cf $srcdir/testdata/grepoutput8 testtrygrep
-  if [ $? != 0 ] ; then exit 1; fi
-
-else
-  echo "Skipping pcregrep UTF-8 tests: no UTF-8 support in PCRE library"
-fi
-
-
-# We go to some contortions to try to ensure that the tests for the various
-# newline settings will work in environments where the normal newline sequence
-# is not \n. Do not use exported files, whose line endings might be changed.
-# Instead, create an input file using printf so that its contents are exactly
-# what we want. Note the messy fudge to get printf to write a string that
-# starts with a hyphen. These tests are run in the build directory.
-
-echo "Testing pcregrep newline settings"
-printf "abc\rdef\r\nghi\njkl" >testNinputgrep
-
-printf "%c--------------------------- Test N1 ------------------------------\r\n" - >testtrygrep
-$valgrind $pcregrep -n -N CR "^(abc|def|ghi|jkl)" testNinputgrep >>testtrygrep
-
-printf "%c--------------------------- Test N2 ------------------------------\r\n" - >>testtrygrep
-$valgrind $pcregrep -n --newline=crlf "^(abc|def|ghi|jkl)" testNinputgrep >>testtrygrep
-
-printf "%c--------------------------- Test N3 ------------------------------\r\n" - >>testtrygrep
-pattern=`printf 'def\rjkl'`
-$valgrind $pcregrep -n --newline=cr -F "$pattern" testNinputgrep >>testtrygrep
-
-printf "%c--------------------------- Test N4 ------------------------------\r\n" - >>testtrygrep
-$valgrind $pcregrep -n --newline=crlf -F -f $srcdir/testdata/greppatN4 testNinputgrep >>testtrygrep
-
-printf "%c--------------------------- Test N5 ------------------------------\r\n" - >>testtrygrep
-$valgrind $pcregrep -n --newline=any "^(abc|def|ghi|jkl)" testNinputgrep >>testtrygrep
-
-printf "%c--------------------------- Test N6 ------------------------------\r\n" - >>testtrygrep
-$valgrind $pcregrep -n --newline=anycrlf "^(abc|def|ghi|jkl)" testNinputgrep >>testtrygrep
-
-$cf $srcdir/testdata/grepoutputN testtrygrep
-if [ $? != 0 ] ; then exit 1; fi
-
-exit 0
-
-# End
diff --git a/dist/RunTest b/dist/RunTest
deleted file mode 100755
index 67cfbf0..0000000
--- a/dist/RunTest
+++ /dev/null
@@ -1,1010 +0,0 @@
-#! /bin/sh
-
-###############################################################################
-# Run the PCRE tests using the pcretest program. The appropriate tests are
-# selected, depending on which build-time options were used.
-#
-# All tests are now run both with and without -s, to ensure that everything is
-# tested with and without studying. However, there are some tests that produce
-# different output after studying, typically when we are tracing the actual
-# matching process (for example, using auto-callouts). In these few cases, the
-# tests are duplicated in the files, one with /S to force studying always, and
-# one with /SS to force *not* studying always. The use of -s doesn't then make
-# any difference to their output. There is also one test which compiles invalid
-# UTF-8 with the UTF-8 check turned off; for this, studying must also be
-# disabled with /SS.
-#
-# When JIT support is available, all appropriate tests are also run with -s+ to
-# test (again, almost) everything with studying and the JIT option, unless
-# "nojit" is given on the command line. There are also two tests for
-# JIT-specific features, one to be run when JIT support is available (unless
-# "nojit" is specified), and one when it is not.
-#
-# Whichever of the 8-, 16- and 32-bit libraries exist are tested. It is also
-# possible to select which to test by giving "-8", "-16" or "-32" on the
-# command line.
-#
-# As well as "nojit", "-8", "-16", and "-32", arguments for this script are
-# individual test numbers, ranges of tests such as 3-6 or 3- (meaning 3 to the
-# end), or a number preceded by ~ to exclude a test. For example, "3-15 ~10"
-# runs tests 3 to 15, excluding test 10, and just "~10" runs all the tests
-# except test 10. Whatever order the arguments are in, the tests are always run
-# in numerical order.
-#
-# The special argument "3S" runs test 3, stopping if it fails. Test 3 is the
-# locale test, and failure usually means there's an issue with the locale
-# rather than a bug in PCRE, so normally subsequent tests are run. "3S" is
-# useful when you want to debug or update the test.
-#
-# Inappropriate tests are automatically skipped (with a comment to say so): for
-# example, if JIT support is not compiled, test 12 is skipped, whereas if JIT
-# support is compiled, test 13 is skipped.
-#
-# Other arguments can be one of the words "valgrind", "valgrind-log", or "sim"
-# followed by an argument to run cross-compiled executables under a simulator,
-# for example:
-#
-# RunTest 3 sim "qemu-arm -s 8388608"
-#
-# There are two special cases where only one argument is allowed:
-#
-# If the first and only argument is "ebcdic", the script runs the special
-# EBCDIC test that can be useful for checking certain EBCDIC features, even
-# when run in an ASCII environment.
-#
-# If the script is obeyed as "RunTest list", a list of available tests is
-# output, but none of them are run.
-###############################################################################
-
-# Define test titles in variables so that they can be output as a list. Some
-# of them are modified (e.g. with -8 or -16) when used in the actual tests.
-
-title1="Test 1: Main functionality (Compatible with Perl >= 5.10)"
-title2="Test 2: API, errors, internals, and non-Perl stuff"
-title3="Test 3: Locale-specific features"
-title4A="Test 4: UTF"
-title4B=" support (Compatible with Perl >= 5.10)"
-title5="Test 5: API, internals, and non-Perl stuff for UTF"
-title6="Test 6: Unicode property support (Compatible with Perl >= 5.10)"
-title7="Test 7: API, internals, and non-Perl stuff for Unicode property support"
-title8="Test 8: DFA matching main functionality"
-title9="Test 9: DFA matching with UTF"
-title10="Test 10: DFA matching with Unicode properties"
-title11="Test 11: Internal offsets and code size tests"
-title12="Test 12: JIT-specific features (when JIT is available)"
-title13="Test 13: JIT-specific features (when JIT is not available)"
-title14="Test 14: Specials for the basic 8-bit library"
-title15="Test 15: Specials for the 8-bit library with UTF-8 support"
-title16="Test 16: Specials for the 8-bit library with Unicode propery support"
-title17="Test 17: Specials for the basic 16/32-bit library"
-title18="Test 18: Specials for the 16/32-bit library with UTF-16/32 support"
-title19="Test 19: Specials for the 16/32-bit library with Unicode property support"
-title20="Test 20: DFA specials for the basic 16/32-bit library"
-title21="Test 21: Reloads for the basic 16/32-bit library"
-title22="Test 22: Reloads for the 16/32-bit library with UTF-16/32 support"
-title23="Test 23: Specials for the 16-bit library"
-title24="Test 24: Specials for the 16-bit library with UTF-16 support"
-title25="Test 25: Specials for the 32-bit library"
-title26="Test 26: Specials for the 32-bit library with UTF-32 support"
-
-maxtest=26
-
-if [ $# -eq 1 -a "$1" = "list" ]; then
-  echo $title1
-  echo $title2 "(not UTF)"
-  echo $title3
-  echo $title4A $title4B
-  echo $title5 support
-  echo $title6
-  echo $title7
-  echo $title8
-  echo $title9
-  echo $title10
-  echo $title11
-  echo $title12
-  echo $title13
-  echo $title14
-  echo $title15
-  echo $title16
-  echo $title17
-  echo $title18
-  echo $title19
-  echo $title20
-  echo $title21
-  echo $title22
-  echo $title23
-  echo $title24
-  echo $title25
-  echo $title26
-  exit 0
-fi
-
-# Set up a suitable "diff" command for comparison. Some systems
-# have a diff that lacks a -u option. Try to deal with this.
-
-cf="diff"
-diff -u /dev/null /dev/null 2>/dev/null && cf="diff -u"
-
-# Find the test data
-
-if [ -n "$srcdir" -a -d "$srcdir" ] ; then
-  testdata="$srcdir/testdata"
-elif [ -d "./testdata" ] ; then
-  testdata=./testdata
-elif [ -d "../testdata" ] ; then
-  testdata=../testdata
-else
-  echo "Cannot find the testdata directory"
-  exit 1
-fi
-
-
-# ------ Special EBCDIC Test -------
-
-if [ $# -eq 1 -a "$1" = "ebcdic" ]; then
-  ./pcretest -C ebcdic >/dev/null
-  ebcdic=$?
-  if [ $ebcdic -ne 1 ] ; then
-    echo "Cannot run EBCDIC tests: EBCDIC support not compiled"
-    exit 1
-  fi
-
-  for opt in "" "-s" "-dfa" "-s -dfa"; do
-    ./pcretest -q $opt $testdata/testinputEBC >testtry
-    if [ $? = 0 ] ; then
-      $cf $testdata/testoutputEBC testtry
-      if [ $? != 0 ] ; then exit 1; fi
-    else exit 1
-    fi
-    if [ "$opt" = "-s" ] ; then echo "  OK with study"
-    elif [ "$opt" = "-dfa" ] ; then echo "  OK using DFA"
-    elif [ "$opt" = "-s -dfa" ] ; then echo "  OK using DFA with study"
-    else echo "  OK"
-    fi
-  done
-
-exit 0
-fi
-
-
-# ------ Normal Tests ------
-
-# Default values
-
-arg8=
-arg16=
-arg32=
-nojit=
-sim=
-skip=
-valgrind=
-
-# This is in case the caller has set aliases (as I do - PH)
-unset cp ls mv rm
-
-# Process options and select which tests to run; for those that are explicitly
-# requested, check that the necessary optional facilities are available.
-
-do1=no
-do2=no
-do3=no
-do4=no
-do5=no
-do6=no
-do7=no
-do8=no
-do9=no
-do10=no
-do11=no
-do12=no
-do13=no
-do14=no
-do15=no
-do16=no
-do17=no
-do18=no
-do19=no
-do20=no
-do21=no
-do22=no
-do23=no
-do24=no
-do25=no
-do26=no
-
-while [ $# -gt 0 ] ; do
-  case $1 in
-    1) do1=yes;;
-    2) do2=yes;;
-    3) do3=yes;;
-    4) do4=yes;;
-    5) do5=yes;;
-    6) do6=yes;;
-    7) do7=yes;;
-    8) do8=yes;;
-    9) do9=yes;;
-   10) do10=yes;;
-   11) do11=yes;;
-   12) do12=yes;;
-   13) do13=yes;;
-   14) do14=yes;;
-   15) do15=yes;;
-   16) do16=yes;;
-   17) do17=yes;;
-   18) do18=yes;;
-   19) do19=yes;;
-   20) do20=yes;;
-   21) do21=yes;;
-   22) do22=yes;;
-   23) do23=yes;;
-   24) do24=yes;;
-   25) do25=yes;;
-   26) do26=yes;;
-   -8) arg8=yes;;
-  -16) arg16=yes;;
-  -32) arg32=yes;;
-   nojit) nojit=yes;;
-   sim) shift; sim=$1;;
-   valgrind) valgrind="valgrind --tool=memcheck -q --smc-check=all";;
-   valgrind-log) valgrind="valgrind --tool=memcheck --num-callers=30 --leak-check=no --error-limit=no --smc-check=all --log-file=report.%p ";;
-   ~*)
-     if expr "$1" : '~[0-9][0-9]*$' >/dev/null; then
-       skip="$skip `expr "$1" : '~\([0-9]*\)*$'`"
-     else
-       echo "Unknown option or test selector '$1'"; exit 1
-     fi
-   ;;
-   *-*)
-     if expr "$1" : '[0-9][0-9]*-[0-9]*$' >/dev/null; then
-       tf=`expr "$1" : '\([0-9]*\)'`
-       tt=`expr "$1" : '.*-\([0-9]*\)'`
-       if [ "$tt" = "" ] ; then tt=$maxtest; fi
-       if expr \( "$tf" "<" 1 \) \| \( "$tt" ">" "$maxtest" \) >/dev/null; then
-         echo "Invalid test range '$1'"; exit 1
-       fi
-       while expr "$tf" "<=" "$tt" >/dev/null; do
-         eval do${tf}=yes
-         tf=`expr $tf + 1`
-       done
-     else
-       echo "Invalid test range '$1'"; exit 1
-     fi
-   ;;
-   *) echo "Unknown option or test selector '$1'"; exit 1;;
-  esac
-  shift
-done
-
-# Find which optional facilities are available.
-
-$sim ./pcretest -C linksize >/dev/null
-link_size=$?
-if [ $link_size -lt 2 ] ; then
-  echo "Failed to find internal link size"
-  exit 1
-fi
-if [ $link_size -gt 4 ] ; then
-  echo "Failed to find internal link size"
-  exit 1
-fi
-
-# All of 8-bit, 16-bit, and 32-bit character strings may be supported, but only
-# one need be.
-
-$sim ./pcretest -C pcre8 >/dev/null
-support8=$?
-$sim ./pcretest -C pcre16 >/dev/null
-support16=$?
-$sim ./pcretest -C pcre32 >/dev/null
-support32=$?
-
-# Initialize all bitsizes skipped
-
-test8=skip
-test16=skip
-test32=skip
-
-# If no bitsize arguments, select all that are available
-
-if [ "$arg8$arg16$arg32" = "" ] ; then
-  if [ $support8 -ne 0 ] ; then
-    test8=
-  fi
-  if [ $support16 -ne 0 ] ; then
-    test16=-16
-  fi
-  if [ $support32 -ne 0 ] ; then
-    test32=-32
-  fi
-
-# Select requested bit sizes
-
-else
-  if [ "$arg8" = yes ] ; then
-    if [ $support8 -eq 0 ] ; then
-      echo "Cannot run 8-bit library tests: 8-bit library not compiled"
-      exit 1
-    fi
-    test8=
-  fi
-  if [ "$arg16" = yes ] ; then
-    if [ $support16 -eq 0 ] ; then
-      echo "Cannot run 16-bit library tests: 16-bit library not compiled"
-      exit 1
-    fi
-    test16=-16
-  fi
-  if [ "$arg32" = yes ] ; then
-    if [ $support32 -eq 0 ] ; then
-      echo "Cannot run 32-bit library tests: 32-bit library not compiled"
-      exit 1
-    fi
-    test32=-32
-  fi
-fi
-
-# UTF support always applies to all bit sizes if both are supported; we can't
-# have UTF-8 support without UTF-16 support (for example).
-
-$sim ./pcretest -C utf >/dev/null
-utf=$?
-
-$sim ./pcretest -C ucp >/dev/null
-ucp=$?
-
-jitopt=
-$sim ./pcretest -C jit >/dev/null
-jit=$?
-if [ $jit -ne 0 -a "$nojit" != "yes" ] ; then
-  jitopt=-s+
-fi
-
-# If no specific tests were requested, select all. Those that are not
-# relevant will be automatically skipped.
-
-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 -a $do10 = no -a $do11 = no -a $do12 = no -a \
-     $do13 = no -a $do14 = no -a $do15 = no -a $do16 = no -a \
-     $do17 = no -a $do18 = no -a $do19 = no -a $do20 = no -a \
-     $do21 = no -a $do22 = no -a $do23 = no -a $do24 = no -a \
-     $do25 = no -a $do26 = no ] ; then
-  do1=yes
-  do2=yes
-  do3=yes
-  do4=yes
-  do5=yes
-  do6=yes
-  do7=yes
-  do8=yes
-  do9=yes
-  do10=yes
-  do11=yes
-  do12=yes
-  do13=yes
-  do14=yes
-  do15=yes
-  do16=yes
-  do17=yes
-  do18=yes
-  do19=yes
-  do20=yes
-  do21=yes
-  do22=yes
-  do23=yes
-  do24=yes
-  do25=yes
-  do26=yes
-fi
-
-# Handle any explicit skips at this stage, so that an argument list may consist
-# only of explicit skips.
-
-for i in $skip; do eval do$i=no; done
-
-# Show which release and which test data
-
-echo ""
-echo PCRE C library tests using test data from $testdata
-$sim ./pcretest /dev/null
-
-for bmode in "$test8" "$test16" "$test32"; do
-  case "$bmode" in
-    skip) continue;;
-    -16)  if [ "$test8$test32" != "skipskip" ] ; then echo ""; fi
-          bits=16; echo "---- Testing 16-bit library ----"; echo "";;
-    -32)  if [ "$test8$test16" != "skipskip" ] ; then echo ""; fi
-          bits=32; echo "---- Testing 32-bit library ----"; echo "";;
-    *)    bits=8; echo "---- Testing 8-bit library ----"; echo "";;
-  esac
-
-# Primary test, compatible with JIT and all versions of Perl >= 5.8
-
-if [ $do1 = yes ] ; then
-  echo $title1
-  for opt in "" "-s" $jitopt; do
-    $sim $valgrind ./pcretest -q $bmode $opt $testdata/testinput1 testtry
-    if [ $? = 0 ] ; then
-      $cf $testdata/testoutput1 testtry
-      if [ $? != 0 ] ; then exit 1; fi
-    else exit 1
-    fi
-    if [ "$opt" = "-s" ] ; then echo "  OK with study"
-    elif [ "$opt" = "-s+" ] ; then echo "  OK with JIT study"
-    else echo "  OK"
-    fi
-  done
-fi
-
-# PCRE tests that are not JIT or Perl-compatible: API, errors, internals
-
-if [ $do2 = yes ] ; then
-  echo $title2 "(not UTF-$bits)"
-  for opt in "" "-s" $jitopt; do
-    $sim $valgrind ./pcretest -q $bmode $opt $testdata/testinput2 testtry
-    if [ $? = 0 ] ; then
-      $cf $testdata/testoutput2 testtry
-      if [ $? != 0 ] ; then exit 1; fi
-    else
-      echo " "
-      echo "** Test 2 requires a lot of stack. If it has crashed with a"
-      echo "** segmentation fault, it may be that you do not have enough"
-      echo "** stack available by default. Please see the 'pcrestack' man"
-      echo "** page for a discussion of PCRE's stack usage."
-      echo " "
-      exit 1
-    fi
-    if [ "$opt" = "-s" ] ; then echo "  OK with study"
-    elif [ "$opt" = "-s+" ] ; then echo "  OK with JIT study"
-    else echo "  OK"
-    fi
-  done
-fi
-
-# Locale-specific tests, provided that either the "fr_FR" or the "french"
-# locale is available. The former is the Unix-like standard; the latter is
-# for Windows. Another possibility is "fr". Unfortunately, different versions
-# of the French locale give different outputs for some items. This test passes
-# if the output matches any one of the alternative output files.
-
-if [ $do3 = yes ] ; then
-  locale -a | grep '^fr_FR$' >/dev/null
-  if [ $? -eq 0 ] ; then
-    locale=fr_FR
-    infile=$testdata/testinput3
-    outfile=$testdata/testoutput3
-    outfile2=$testdata/testoutput3A
-    outfile3=$testdata/testoutput3B
-  else
-    infile=test3input
-    outfile=test3output
-    outfile2=test3outputA
-    outfile3=test3outputB
-    locale -a | grep '^french$' >/dev/null
-    if [ $? -eq 0 ] ; then
-      locale=french
-      sed 's/fr_FR/french/' $testdata/testinput3 >test3input
-      sed 's/fr_FR/french/' $testdata/testoutput3 >test3output
-      sed 's/fr_FR/french/' $testdata/testoutput3A >test3outputA
-      sed 's/fr_FR/french/' $testdata/testoutput3B >test3outputB
-    else
-      locale -a | grep '^fr$' >/dev/null
-      if [ $? -eq 0 ] ; then
-        locale=fr
-        sed 's/fr_FR/fr/' $testdata/intestinput3 >test3input
-        sed 's/fr_FR/fr/' $testdata/intestoutput3 >test3output
-        sed 's/fr_FR/fr/' $testdata/intestoutput3A >test3outputA
-        sed 's/fr_FR/fr/' $testdata/intestoutput3B >test3outputB
-      else
-        locale=
-      fi
-    fi
-  fi
-
-  if [ "$locale" != "" ] ; then
-    echo $title3 "(using '$locale' locale)"
-    for opt in "" "-s" $jitopt; do
-      $sim $valgrind ./pcretest -q $bmode $opt $infile testtry
-      if [ $? = 0 ] ; then
-        if $cf $outfile testtry >teststdout || \
-           $cf $outfile2 testtry >teststdout || \
-           $cf $outfile3 testtry >teststdout
-        then
-          if [ "$opt" = "-s" ] ; then echo "  OK with study"
-          elif [ "$opt" = "-s+" ] ; then echo "  OK with JIT study"
-          else echo "  OK"
-          fi
-        else
-          echo "** Locale test did not run successfully. The output did not match"
-          echo "   $outfile, $outfile2 or $outfile3."
-          echo "   This may mean that there is a problem with the locale settings rather"
-          echo "   than a bug in PCRE."
-          exit 1
-        fi
-      else exit 1
-      fi
-    done
-  else
-    echo "Cannot test locale-specific features - none of the 'fr_FR', 'fr' or"
-    echo "'french' locales exist, or the \"locale\" command is not available"
-    echo "to check for them."
-    echo " "
-  fi
-fi
-
-# Additional tests for UTF support
-
-if [ $do4 = yes ] ; then
-  echo ${title4A}-${bits}${title4B}
-  if [ $utf -eq 0 ] ; then
-    echo "  Skipped because UTF-$bits support is not available"
-  else
-    for opt in "" "-s" $jitopt; do
-      $sim $valgrind ./pcretest -q $bmode $opt $testdata/testinput4 testtry
-      if [ $? = 0 ] ; then
-        $cf $testdata/testoutput4 testtry
-        if [ $? != 0 ] ; then exit 1; fi
-      else exit 1
-      fi
-      if [ "$opt" = "-s" ] ; then echo "  OK with study"
-      elif [ "$opt" = "-s+" ] ; then echo "  OK with JIT study"
-      else echo "  OK"
-      fi
-    done
-  fi
-fi
-
-if [ $do5 = yes ] ; then
-  echo ${title5}-${bits} support
-  if [ $utf -eq 0 ] ; then
-    echo "  Skipped because UTF-$bits support is not available"
-  else
-    for opt in "" "-s" $jitopt; do
-      $sim $valgrind ./pcretest -q $bmode $opt $testdata/testinput5 testtry
-      if [ $? = 0 ] ; then
-        $cf $testdata/testoutput5 testtry
-        if [ $? != 0 ] ; then exit 1; fi
-      else exit 1
-      fi
-      if [ "$opt" = "-s" ] ; then echo "  OK with study"
-      elif [ "$opt" = "-s+" ] ; then echo "  OK with JIT study"
-      else echo "  OK"
-      fi
-    done
-  fi
-fi
-
-if [ $do6 = yes ] ; then
-  echo $title6
-  if [ $utf -eq 0 -o $ucp -eq 0 ] ; then
-    echo "  Skipped because Unicode property support is not available"
-  else
-    for opt in "" "-s" $jitopt; do
-      $sim $valgrind ./pcretest -q $bmode $opt $testdata/testinput6 testtry
-      if [ $? = 0 ] ; then
-        $cf $testdata/testoutput6 testtry
-        if [ $? != 0 ] ; then exit 1; fi
-      else exit 1
-      fi
-      if [ "$opt" = "-s" ] ; then echo "  OK with study"
-      elif [ "$opt" = "-s+" ] ; then echo "  OK with JIT study"
-      else echo "  OK"
-      fi
-    done
-  fi
-fi
-
-# Test non-Perl-compatible Unicode property support
-
-if [ $do7 = yes ] ; then
-  echo $title7
-  if [ $utf -eq 0 -o $ucp -eq 0 ] ; then
-    echo "  Skipped because Unicode property support is not available"
-  else
-    for opt in "" "-s" $jitopt; do
-      $sim $valgrind ./pcretest -q $bmode $opt $testdata/testinput7 testtry
-      if [ $? = 0 ] ; then
-        $cf $testdata/testoutput7 testtry
-        if [ $? != 0 ] ; then exit 1; fi
-      else exit 1
-      fi
-      if [ "$opt" = "-s" ] ; then echo "  OK with study"
-      elif [ "$opt" = "-s+" ] ; then echo "  OK with JIT study"
-      else echo "  OK"
-      fi
-    done
-  fi
-fi
-
-# Tests for DFA matching support
-
-if [ $do8 = yes ] ; then
-  echo $title8
-  for opt in "" "-s"; do
-    $sim $valgrind ./pcretest -q $bmode $opt -dfa $testdata/testinput8 testtry
-    if [ $? = 0 ] ; then
-      $cf $testdata/testoutput8 testtry
-      if [ $? != 0 ] ; then exit 1; fi
-    else exit 1
-    fi
-    if [ "$opt" = "-s" ] ; then echo "  OK with study" ; else echo "  OK"; fi
-  done
-fi
-
-if [ $do9 = yes ] ; then
-  echo ${title9}-${bits}
-  if [ $utf -eq 0 ] ; then
-    echo "  Skipped because UTF-$bits support is not available"
-  else
-    for opt in "" "-s"; do
-      $sim $valgrind ./pcretest -q $bmode $opt -dfa $testdata/testinput9 testtry
-      if [ $? = 0 ] ; then
-        $cf $testdata/testoutput9 testtry
-        if [ $? != 0 ] ; then exit 1; fi
-      else exit 1
-      fi
-      if [ "$opt" = "-s" ] ; then echo "  OK with study" ; else echo "  OK"; fi
-    done
-  fi
-fi
-
-if [ $do10 = yes ] ; then
-  echo $title10
-  if [ $utf -eq 0 -o $ucp -eq 0 ] ; then
-    echo "  Skipped because Unicode property support is not available"
-  else
-    for opt in "" "-s"; do
-      $sim $valgrind ./pcretest -q $bmode $opt -dfa $testdata/testinput10 testtry
-      if [ $? = 0 ] ; then
-        $cf $testdata/testoutput10 testtry
-        if [ $? != 0 ] ; then exit 1; fi
-      else exit 1
-      fi
-      if [ "$opt" = "-s" ] ; then echo "  OK with study" ; else echo "  OK"; fi
-    done
-  fi
-fi
-
-# Test of internal offsets and code sizes. This test is run only when there
-# is Unicode property support and the link size is 2. The actual tests are
-# mostly the same as in some of the above, but in this test we inspect some
-# offsets and sizes that require a known link size. This is a doublecheck for
-# the maintainer, just in case something changes unexpectely. The output from
-# this test is not the same in 8-bit and 16-bit modes.
-
-if [ $do11 = yes ] ; then
-  echo $title11
-  if [ $link_size -ne 2 ] ; then
-    echo "  Skipped because link size is not 2"
-  elif [ $ucp -eq 0 ] ; then
-    echo "  Skipped because Unicode property support is not available"
-  else
-    for opt in "" "-s"; do
-      $sim $valgrind ./pcretest -q $bmode $opt $testdata/testinput11 testtry
-      if [ $? = 0 ] ; then
-        $cf $testdata/testoutput11-$bits testtry
-        if [ $? != 0 ] ; then exit 1; fi
-      else exit 1
-      fi
-      if [ "$opt" = "-s" ] ; then echo "  OK with study" ; else echo "  OK"; fi
-    done
-  fi
-fi
-
-# Test JIT-specific features when JIT is available
-
-if [ $do12 = yes ] ; then
-  echo $title12
-  if [ $jit -eq 0 -o "$nojit" = "yes" ] ; then
-    echo "  Skipped because JIT is not available or not usable"
-  else
-    $sim $valgrind ./pcretest -q $bmode $testdata/testinput12 testtry
-    if [ $? = 0 ] ; then
-      $cf $testdata/testoutput12 testtry
-      if [ $? != 0 ] ; then exit 1; fi
-    else exit 1
-    fi
-    echo "  OK"
-  fi
-fi
-
-# Test JIT-specific features when JIT is not available
-
-if [ $do13 = yes ] ; then
-  echo $title13
-  if [ $jit -ne 0 ] ; then
-    echo "  Skipped because JIT is available"
-  else
-    $sim $valgrind ./pcretest -q $bmode $testdata/testinput13 testtry
-    if [ $? = 0 ] ; then
-      $cf $testdata/testoutput13 testtry
-      if [ $? != 0 ] ; then exit 1; fi
-    else exit 1
-    fi
-    echo "  OK"
-  fi
-fi
-
-# Tests for 8-bit-specific features
-
-if [ "$do14" = yes ] ; then
-  echo $title14
-  if [ "$bits" = "16" -o "$bits" = "32" ] ; then
-    echo "  Skipped when running 16/32-bit tests"
-  else
-    cp -f $testdata/saved16 testsaved16
-    cp -f $testdata/saved32 testsaved32
-    for opt in "" "-s" $jitopt; do
-      $sim $valgrind ./pcretest -q $bmode $opt $testdata/testinput14 testtry
-      if [ $? = 0 ] ; then
-        $cf $testdata/testoutput14 testtry
-        if [ $? != 0 ] ; then exit 1; fi
-      else exit 1
-      fi
-      if [ "$opt" = "-s" ] ; then echo "  OK with study"
-      elif [ "$opt" = "-s+" ] ; then echo "  OK with JIT study"
-      else echo "  OK"
-      fi
-    done
-  fi
-fi
-
-# Tests for 8-bit-specific features (needs UTF-8 support)
-
-if [ "$do15" = yes ] ; then
-  echo $title15
-  if [ "$bits" = "16" -o "$bits" = "32" ] ; then
-    echo "  Skipped when running 16/32-bit tests"
-  elif [ $utf -eq 0 ] ; then
-    echo "  Skipped because UTF-$bits support is not available"
-  else
-    for opt in "" "-s" $jitopt; do
-      $sim $valgrind ./pcretest -q $bmode $opt $testdata/testinput15 testtry
-      if [ $? = 0 ] ; then
-        $cf $testdata/testoutput15 testtry
-        if [ $? != 0 ] ; then exit 1; fi
-      else exit 1
-      fi
-      if [ "$opt" = "-s" ] ; then echo "  OK with study"
-      elif [ "$opt" = "-s+" ] ; then echo "  OK with JIT study"
-      else echo "  OK"
-      fi
-    done
-  fi
-fi
-
-# Tests for 8-bit-specific features (Unicode property support)
-
-if [ $do16 = yes ] ; then
-  echo $title16
-  if [ "$bits" = "16" -o "$bits" = "32" ] ; then
-    echo "  Skipped when running 16/32-bit tests"
-  elif [ $ucp -eq 0 ] ; then
-    echo "  Skipped because Unicode property support is not available"
-  else
-    for opt in "" "-s" $jitopt; do
-      $sim $valgrind ./pcretest -q $bmode $opt $testdata/testinput16 testtry
-      if [ $? = 0 ] ; then
-        $cf $testdata/testoutput16 testtry
-        if [ $? != 0 ] ; then exit 1; fi
-      else exit 1
-      fi
-      if [ "$opt" = "-s" ] ; then echo "  OK with study"
-      elif [ "$opt" = "-s+" ] ; then echo "  OK with JIT study"
-      else echo "  OK"
-      fi
-    done
-  fi
-fi
-
-# Tests for 16/32-bit-specific features
-
-if [ $do17 = yes ] ; then
-  echo $title17
-  if [ "$bits" = "8" ] ; then
-    echo "  Skipped when running 8-bit tests"
-  else
-    for opt in "" "-s" $jitopt; do
-      $sim $valgrind ./pcretest -q $bmode $opt $testdata/testinput17 testtry
-      if [ $? = 0 ] ; then
-        $cf $testdata/testoutput17 testtry
-        if [ $? != 0 ] ; then exit 1; fi
-      else exit 1
-      fi
-      if [ "$opt" = "-s" ] ; then echo "  OK with study"
-      elif [ "$opt" = "-s+" ] ; then echo "  OK with JIT study"
-      else echo "  OK"
-      fi
-    done
-  fi
-fi
-
-# Tests for 16/32-bit-specific features (UTF-16/32 support)
-
-if [ $do18 = yes ] ; then
-  echo $title18
-  if [ "$bits" = "8" ] ; then
-    echo "  Skipped when running 8-bit tests"
-  elif [ $utf -eq 0 ] ; then
-    echo "  Skipped because UTF-$bits support is not available"
-  else
-    for opt in "" "-s" $jitopt; do
-      $sim $valgrind ./pcretest -q $bmode $opt $testdata/testinput18 testtry
-      if [ $? = 0 ] ; then
-        $cf $testdata/testoutput18-$bits testtry
-        if [ $? != 0 ] ; then exit 1; fi
-      else exit 1
-      fi
-      if [ "$opt" = "-s" ] ; then echo "  OK with study"
-      elif [ "$opt" = "-s+" ] ; then echo "  OK with JIT study"
-      else echo "  OK"
-      fi
-    done
-  fi
-fi
-
-# Tests for 16/32-bit-specific features (Unicode property support)
-
-if [ $do19 = yes ] ; then
-  echo $title19
-  if [ "$bits" = "8" ] ; then
-    echo "  Skipped when running 8-bit tests"
-  elif [ $ucp -eq 0 ] ; then
-    echo "  Skipped because Unicode property support is not available"
-  else
-    for opt in "" "-s" $jitopt; do
-      $sim $valgrind ./pcretest -q $bmode $opt $testdata/testinput19 testtry
-      if [ $? = 0 ] ; then
-        $cf $testdata/testoutput19 testtry
-        if [ $? != 0 ] ; then exit 1; fi
-      else exit 1
-      fi
-      if [ "$opt" = "-s" ] ; then echo "  OK with study"
-      elif [ "$opt" = "-s+" ] ; then echo "  OK with JIT study"
-      else echo "  OK"
-      fi
-    done
-  fi
-fi
-
-# Tests for 16/32-bit-specific features in DFA non-UTF-16/32 mode
-
-if [ $do20 = yes ] ; then
-  echo $title20
-  if [ "$bits" = "8" ] ; then
-    echo "  Skipped when running 8-bit tests"
-  else
-    for opt in "" "-s"; do
-      $sim $valgrind ./pcretest -q $bmode $opt -dfa $testdata/testinput20 testtry
-      if [ $? = 0 ] ; then
-        $cf $testdata/testoutput20 testtry
-        if [ $? != 0 ] ; then exit 1; fi
-      else exit 1
-      fi
-      if [ "$opt" = "-s" ] ; then echo "  OK with study"
-      else echo "  OK"
-      fi
-    done
-  fi
-fi
-
-# Tests for reloads with 16/32-bit library
-
-if [ $do21 = yes ] ; then
-  echo $title21
-  if [ "$bits" = "8" ] ; then
-    echo "  Skipped when running 8-bit tests"
-  elif [ $link_size -ne 2 ] ; then
-    echo "  Skipped because link size is not 2"
-  else
-    cp -f $testdata/saved8 testsaved8
-    cp -f $testdata/saved16LE-1 testsaved16LE-1
-    cp -f $testdata/saved16BE-1 testsaved16BE-1
-    cp -f $testdata/saved32LE-1 testsaved32LE-1
-    cp -f $testdata/saved32BE-1 testsaved32BE-1
-    $sim $valgrind ./pcretest -q $bmode $testdata/testinput21 testtry
-    if [ $? = 0 ] ; then
-      $cf $testdata/testoutput21-$bits testtry
-      if [ $? != 0 ] ; then exit 1; fi
-    else exit 1
-    fi
-    echo "  OK"
-  fi
-fi
-
-# Tests for reloads with 16/32-bit library (UTF-16 support)
-
-if [ $do22 = yes ] ; then
-  echo $title22
-  if [ "$bits" = "8" ] ; then
-    echo "  Skipped when running 8-bit tests"
-  elif [ $utf -eq 0 ] ; then
-    echo "  Skipped because UTF-$bits support is not available"
-  elif [ $link_size -ne 2 ] ; then
-    echo "  Skipped because link size is not 2"
-  else
-    cp -f $testdata/saved16LE-2 testsaved16LE-2
-    cp -f $testdata/saved16BE-2 testsaved16BE-2
-    cp -f $testdata/saved32LE-2 testsaved32LE-2
-    cp -f $testdata/saved32BE-2 testsaved32BE-2
-    $sim $valgrind ./pcretest -q $bmode $testdata/testinput22 testtry
-    if [ $? = 0 ] ; then
-      $cf $testdata/testoutput22-$bits testtry
-      if [ $? != 0 ] ; then exit 1; fi
-    else exit 1
-    fi
-    echo "  OK"
-  fi
-fi
-
-if [ $do23 = yes ] ; then
-  echo $title23
-  if [ "$bits" = "8" -o "$bits" = "32" ] ; then
-    echo "  Skipped when running 8/32-bit tests"
-  else
-    $sim $valgrind ./pcretest -q $bmode $testdata/testinput23 testtry
-    if [ $? = 0 ] ; then
-      $cf $testdata/testoutput23 testtry
-      if [ $? != 0 ] ; then exit 1; fi
-    else exit 1
-    fi
-    echo "  OK"
-  fi
-fi
-
-if [ $do24 = yes ] ; then
-  echo $title24
-  if [ "$bits" = "8" -o "$bits" = "32" ] ; then
-    echo "  Skipped when running 8/32-bit tests"
-  elif [ $utf -eq 0 ] ; then
-    echo "  Skipped because UTF-$bits support is not available"
-  else
-    $sim $valgrind ./pcretest -q $bmode $testdata/testinput24 testtry
-    if [ $? = 0 ] ; then
-      $cf $testdata/testoutput24 testtry
-      if [ $? != 0 ] ; then exit 1; fi
-    else exit 1
-    fi
-    echo "  OK"
-  fi
-fi
-
-if [ $do25 = yes ] ; then
-  echo $title25
-  if [ "$bits" = "8" -o "$bits" = "16" ] ; then
-    echo "  Skipped when running 8/16-bit tests"
-  else
-    $sim $valgrind ./pcretest -q $bmode $testdata/testinput25 testtry
-    if [ $? = 0 ] ; then
-      $cf $testdata/testoutput25 testtry
-      if [ $? != 0 ] ; then exit 1; fi
-    else exit 1
-    fi
-    echo "  OK"
-  fi
-fi
-
-if [ $do26 = yes ] ; then
-  echo $title26
-  if [ "$bits" = "8" -o "$bits" = "16" ] ; then
-    echo "  Skipped when running 8/16-bit tests"
-  elif [ $utf -eq 0 ] ; then
-    echo "  Skipped because UTF-$bits support is not available"
-  else
-    $sim $valgrind ./pcretest -q $bmode $testdata/testinput26 testtry
-    if [ $? = 0 ] ; then
-      $cf $testdata/testoutput26 testtry
-      if [ $? != 0 ] ; then exit 1; fi
-    else exit 1
-    fi
-    echo "  OK"
-  fi
-fi
-
-# End of loop for 8/16/32-bit tests
-done
-
-# Clean up local working files
-rm -f test3input test3output test3outputA testNinput testsaved* teststderr teststdout testtry
-
-# End
diff --git a/dist/RunTest.bat b/dist/RunTest.bat
deleted file mode 100644
index 35d7f71..0000000
--- a/dist/RunTest.bat
+++ /dev/null
@@ -1,616 +0,0 @@
-@echo off

-@rem This file must use CRLF linebreaks to function properly

-@rem and requires both pcretest and pcregrep

-@rem  This file was originally contributed by Ralf Junker, and touched up by

-@rem  Daniel Richard G. Tests 10-12 added by Philip H.

-@rem  Philip H also changed test 3 to use "wintest" files.

-@rem

-@rem  Updated by Tom Fortmann to support explicit test numbers on the command line.

-@rem  Added argument validation and added error reporting.

-@rem

-@rem  MS Windows batch file to run pcretest on testfiles with the correct

-@rem  options.

-@rem

-@rem Sheri Pierce added logic to skip feature dependent tests

-@rem tests 4 5 9 15 and 18 require utf support

-@rem tests 6 7 10 16 and 19 require ucp support

-@rem 11 requires ucp and link size 2

-@rem 12 requires presence of jit support

-@rem 13 requires absence of jit support

-@rem Sheri P also added override tests for study and jit testing

-@rem Zoltan Herczeg added libpcre16 support

-@rem Zoltan Herczeg added libpcre32 support

-

-setlocal enabledelayedexpansion

-if [%srcdir%]==[] (

-if exist testdata\ set srcdir=.)

-if [%srcdir%]==[] (

-if exist ..\testdata\ set srcdir=..)

-if [%srcdir%]==[] (

-if exist ..\..\testdata\ set srcdir=..\..)

-if NOT exist %srcdir%\testdata\ (

-Error: echo distribution testdata folder not found!

-call :conferror

-exit /b 1

-goto :eof

-)

-

-if [%pcretest%]==[] set pcretest=.\pcretest.exe

-

-echo source dir is %srcdir%

-echo pcretest=%pcretest%

-

-if NOT exist %pcretest% (

-echo Error: %pcretest% not found!

-echo.

-call :conferror

-exit /b 1

-)

-

-%pcretest% -C linksize >NUL

-set link_size=%ERRORLEVEL%

-%pcretest% -C pcre8 >NUL

-set support8=%ERRORLEVEL%

-%pcretest% -C pcre16 >NUL

-set support16=%ERRORLEVEL%

-%pcretest% -C pcre32 >NUL

-set support32=%ERRORLEVEL%

-%pcretest% -C utf >NUL

-set utf=%ERRORLEVEL%

-%pcretest% -C ucp >NUL

-set ucp=%ERRORLEVEL%

-%pcretest% -C jit >NUL

-set jit=%ERRORLEVEL%

-

-if %support8% EQU 1 (

-if not exist testout8 md testout8

-if not exist testoutstudy8 md testoutstudy8

-if not exist testoutjit8 md testoutjit8

-)

-

-if %support16% EQU 1 (

-if not exist testout16 md testout16

-if not exist testoutstudy16 md testoutstudy16

-if not exist testoutjit16 md testoutjit16

-)

-

-if %support16% EQU 1 (

-if not exist testout32 md testout32

-if not exist testoutstudy32 md testoutstudy32

-if not exist testoutjit32 md testoutjit32

-)

-

-set do1=no

-set do2=no

-set do3=no

-set do4=no

-set do5=no

-set do6=no

-set do7=no

-set do8=no

-set do9=no

-set do10=no

-set do11=no

-set do12=no

-set do13=no

-set do14=no

-set do15=no

-set do16=no

-set do17=no

-set do18=no

-set do19=no

-set do20=no

-set do21=no

-set do22=no

-set do23=no

-set do24=no

-set do25=no

-set do26=no

-set all=yes

-

-for %%a in (%*) do (

-  set valid=no

-  for %%v in (1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26) do if %%v == %%a set valid=yes

-  if "!valid!" == "yes" (

-    set do%%a=yes

-    set all=no

-) else (

-    echo Invalid test number - %%a!

-        echo Usage %0 [ test_number ] ...

-        echo Where test_number is one or more optional test numbers 1 through 26, default is all tests.

-        exit /b 1

-)

-)

-set failed="no"

-

-if "%all%" == "yes" (

-  set do1=yes

-  set do2=yes

-  set do3=yes

-  set do4=yes

-  set do5=yes

-  set do6=yes

-  set do7=yes

-  set do8=yes

-  set do9=yes

-  set do10=yes

-  set do11=yes

-  set do12=yes

-  set do13=yes

-  set do14=yes

-  set do15=yes

-  set do16=yes

-  set do17=yes

-  set do18=yes

-  set do19=yes

-  set do20=yes

-  set do21=yes

-  set do22=yes

-  set do23=yes

-  set do24=yes

-  set do25=yes

-  set do26=yes

-)

-

-@echo RunTest.bat's pcretest output is written to newly created subfolders named

-@echo testout, testoutstudy and testoutjit.

-@echo.

-

-set mode=

-set bits=8

-

-:nextMode

-if "%mode%" == "" (

-  if %support8% EQU 0 goto modeSkip

-  echo.

-  echo ---- Testing 8-bit library ----

-  echo.

-)

-if "%mode%" == "-16" (

-  if %support16% EQU 0 goto modeSkip

-  echo.

-  echo ---- Testing 16-bit library ----

-  echo.

-)

-if "%mode%" == "-32" (

-  if %support32% EQU 0 goto modeSkip

-  echo.

-  echo ---- Testing 32-bit library ----

-  echo.

-)

-if "%do1%" == "yes" call :do1

-if "%do2%" == "yes" call :do2

-if "%do3%" == "yes" call :do3

-if "%do4%" == "yes" call :do4

-if "%do5%" == "yes" call :do5

-if "%do6%" == "yes" call :do6

-if "%do7%" == "yes" call :do7

-if "%do8%" == "yes" call :do8

-if "%do9%" == "yes" call :do9

-if "%do10%" == "yes" call :do10

-if "%do11%" == "yes" call :do11

-if "%do12%" == "yes" call :do12

-if "%do13%" == "yes" call :do13

-if "%do14%" == "yes" call :do14

-if "%do15%" == "yes" call :do15

-if "%do16%" == "yes" call :do16

-if "%do17%" == "yes" call :do17

-if "%do18%" == "yes" call :do18

-if "%do19%" == "yes" call :do19

-if "%do20%" == "yes" call :do20

-if "%do21%" == "yes" call :do21

-if "%do22%" == "yes" call :do22

-if "%do23%" == "yes" call :do23

-if "%do24%" == "yes" call :do24

-if "%do25%" == "yes" call :do25

-if "%do26%" == "yes" call :do26

-:modeSkip

-if "%mode%" == "" (

-  set mode=-16

-  set bits=16

-  goto nextMode

-)

-if "%mode%" == "-16" (

-  set mode=-32

-  set bits=32

-  goto nextMode

-)

-

-@rem If mode is -32, testing is finished

-if %failed% == "yes" (

-echo In above output, one or more of the various tests failed!

-exit /b 1

-)

-echo All OK

-goto :eof

-

-:runsub

-@rem Function to execute pcretest and compare the output

-@rem Arguments are as follows:

-@rem

-@rem       1 = test number

-@rem       2 = outputdir

-@rem       3 = test name use double quotes

-@rem   4 - 9 = pcretest options

-

-if [%1] == [] (

-  echo Missing test number argument!

-  exit /b 1

-)

-

-if [%2] == [] (

-  echo Missing outputdir!

-  exit /b 1

-)

-

-if [%3] == [] (

-  echo Missing test name argument!

-  exit /b 1

-)

-

-set testinput=testinput%1

-set testoutput=testoutput%1

-if exist %srcdir%\testdata\win%testinput% (

-  set testinput=wintestinput%1

-  set testoutput=wintestoutput%1

-)

-

-echo Test %1: %3

-%pcretest% %mode% %4 %5 %6 %7 %8 %9 %srcdir%\testdata\%testinput% >%2%bits%\%testoutput%

-if errorlevel 1 (

-  echo.          failed executing command-line:

-  echo.            %pcretest% %mode% %4 %5 %6 %7 %8 %9 %srcdir%\testdata\%testinput% ^>%2%bits%\%testoutput%

-  set failed="yes"

-  goto :eof

-)

-

-set type=

-if [%1]==[11] (

-  set type=-%bits%

-)

-if [%1]==[18] (

-  set type=-%bits%

-)

-if [%1]==[21] (

-  set type=-%bits%

-)

-if [%1]==[22] (

-  set type=-%bits%

-)

-

-fc /n %srcdir%\testdata\%testoutput%%type% %2%bits%\%testoutput% >NUL

-

-if errorlevel 1 (

-  echo.          failed comparison: fc /n %srcdir%\testdata\%testoutput% %2%bits%\%testoutput%

-  if [%1]==[2] (

-    echo.

-    echo ** Test 2 requires a lot of stack. PCRE can be configured to

-    echo ** use heap for recursion. Otherwise, to pass Test 2

-    echo ** you generally need to allocate 8 mb stack to PCRE.

-    echo ** See the 'pcrestack' page for a discussion of PCRE's

-    echo ** stack usage.

-    echo.

-)

-  if [%1]==[3] (

-    echo.

-    echo ** Test 3 failure usually means french locale is not

-    echo ** available on the system, rather than a bug or problem with PCRE.

-    echo.

-    goto :eof

-)

-

-  set failed="yes"

-  goto :eof

-)

-

-echo.          Passed.

-goto :eof

-

-:do1

-call :runsub 1 testout "Main functionality (Compatible with Perl >= 5.10)" -q

-call :runsub 1 testoutstudy "Test with Study Override" -q -s

-if %jit% EQU 1 call :runsub 1 testoutjit "Test with JIT Override" -q -s+

-goto :eof

-

-:do2

-  call :runsub 2 testout "API, errors, internals, and non-Perl stuff" -q

-  call :runsub 2 testoutstudy "Test with Study Override" -q -s

-  if %jit% EQU 1 call :runsub 2 testoutjit "Test with JIT Override" -q -s+

-goto :eof

-

-:do3

-  call :runsub 3 testout "Locale-specific features" -q

-  call :runsub 3 testoutstudy "Test with Study Override" -q -s

-  if %jit% EQU 1 call :runsub 3 testoutjit "Test with JIT Override" -q -s+

-goto :eof

-

-:do4

-if %utf% EQU 0 (

-  echo Test 4 Skipped due to absence of UTF-%bits% support.

-  goto :eof

-)

-  call :runsub 4 testout "UTF-%bits% support - (Compatible with Perl >= 5.10)" -q

-  call :runsub 4 testoutstudy "Test with Study Override" -q -s

-  if %jit% EQU 1 call :runsub 4 testoutjit "Test with JIT Override" -q -s+

-goto :eof

-

-:do5

-if %utf% EQU 0 (

-  echo Test 5 Skipped due to absence of UTF-%bits% support.

-  goto :eof

-)

-  call :runsub 5 testout "API, internals, and non-Perl stuff for UTF-%bits%" -q

-  call :runsub 5 testoutstudy "Test with Study Override" -q -s

-  if %jit% EQU 1 call :runsub 5 testoutjit "Test with JIT Override" -q -s+

-goto :eof

-

-:do6

-if %ucp% EQU 0 (

-  echo Test 6 Skipped due to absence of Unicode property support.

-  goto :eof

-)

-  call :runsub 6 testout "Unicode property support (Compatible with Perl >= 5.10)" -q

-  call :runsub 6 testoutstudy "Test with Study Override" -q -s

-  if %jit% EQU 1 call :runsub 6 testoutjit "Test with JIT Override" -q -s+

-goto :eof

-

-:do7

-if %ucp% EQU 0 (

-  echo Test 7 Skipped due to absence of Unicode property support.

-  goto :eof

-)

-  call :runsub 7 testout "API, internals, and non-Perl stuff for Unicode property support" -q

-  call :runsub 7 testoutstudy "Test with Study Override" -q -s

-  if %jit% EQU 1 call :runsub 7 testoutjit "Test with JIT Override" -q -s+

-goto :eof

-

-:do8

-  call :runsub 8 testout "DFA matching main functionality" -q -dfa

-  call :runsub 8 testoutstudy "Test with Study Override" -q -dfa -s

-goto :eof

-

-:do9

-if %utf% EQU 0 (

-  echo Test 9 Skipped due to absence of UTF-%bits% support.

-  goto :eof

-)

-  call :runsub 9 testout "DFA matching with UTF-%bits%" -q -dfa

-  call :runsub 9 testoutstudy "Test with Study Override" -q -dfa -s

-  goto :eof

-

-:do10

-if %ucp% EQU 0 (

-  echo Test 10 Skipped due to absence of Unicode property support.

-  goto :eof

-)

-  call :runsub 10 testout "DFA matching with Unicode properties" -q -dfa

-  call :runsub 10 testoutstudy "Test with Study Override" -q -dfa -s

-goto :eof

-

-:do11

-if NOT %link_size% EQU 2 (

-  echo Test 11 Skipped because link size is not 2.

-  goto :eof

-)

-if %ucp% EQU 0 (

-  echo Test 11 Skipped due to absence of Unicode property support.

-  goto :eof

-)

-  call :runsub 11 testout "Internal offsets and code size tests" -q

-  call :runsub 11 testoutstudy "Test with Study Override" -q -s

-goto :eof

-

-:do12

-if %jit% EQU 0 (

-  echo Test 12 Skipped due to absence of JIT support.

-  goto :eof

-)

-  call :runsub 12 testout "JIT-specific features (JIT available)" -q

-goto :eof

-

-:do13

-if %jit% EQU 1 (

-  echo Test 13 Skipped due to presence of JIT support.

-  goto :eof

-)

-  call :runsub 13 testout "JIT-specific features (JIT not available)" -q

-goto :eof

-

-:do14

-if NOT %bits% EQU 8 (

-  echo Test 14 Skipped when running 16/32-bit tests.

-  goto :eof

-)

-  copy /Y %srcdir%\testdata\saved16 testsaved16

-  copy /Y %srcdir%\testdata\saved32 testsaved32

-  call :runsub 14 testout "Specials for the basic 8-bit library" -q

-  call :runsub 14 testoutstudy "Test with Study Override" -q -s

-  if %jit% EQU 1 call :runsub 14 testoutjit "Test with JIT Override" -q -s+

-goto :eof

-

-:do15

-if NOT %bits% EQU 8 (

-  echo Test 15 Skipped when running 16/32-bit tests.

-  goto :eof

-)

-if %utf% EQU 0 (

-  echo Test 15 Skipped due to absence of UTF-%bits% support.

-  goto :eof

-)

-  call :runsub 15 testout "Specials for the 8-bit library with UTF-%bits% support" -q

-  call :runsub 15 testoutstudy "Test with Study Override" -q -s

-  if %jit% EQU 1 call :runsub 15 testoutjit "Test with JIT Override" -q -s+

-goto :eof

-

-:do16

-if NOT %bits% EQU 8 (

-  echo Test 16 Skipped when running 16/32-bit tests.

-  goto :eof

-)

-if %ucp% EQU 0 (

-  echo Test 16 Skipped due to absence of Unicode property support.

-  goto :eof

-)

-  call :runsub 16 testout "Specials for the 8-bit library with Unicode propery support" -q

-  call :runsub 16 testoutstudy "Test with Study Override" -q -s

-  if %jit% EQU 1 call :runsub 16 testoutjit "Test with JIT Override" -q -s+

-goto :eof

-

-:do17

-if %bits% EQU 8 (

-  echo Test 17 Skipped when running 8-bit tests.

-  goto :eof

-)

-  call :runsub 17 testout "Specials for the basic 16/32-bit library" -q

-  call :runsub 17 testoutstudy "Test with Study Override" -q -s

-  if %jit% EQU 1 call :runsub 17 testoutjit "Test with JIT Override" -q -s+

-goto :eof

-

-:do18

-if %bits% EQU 8 (

-  echo Test 18 Skipped when running 8-bit tests.

-  goto :eof

-)

-if %utf% EQU 0 (

-  echo Test 18 Skipped due to absence of UTF-%bits% support.

-  goto :eof

-)

-  call :runsub 18 testout "Specials for the 16/32-bit library with UTF-%bits% support" -q

-  call :runsub 18 testoutstudy "Test with Study Override" -q -s

-  if %jit% EQU 1 call :runsub 18 testoutjit "Test with JIT Override" -q -s+

-goto :eof

-

-:do19

-if %bits% EQU 8 (

-  echo Test 19 Skipped when running 8-bit tests.

-  goto :eof

-)

-if %ucp% EQU 0 (

-  echo Test 19 Skipped due to absence of Unicode property support.

-  goto :eof

-)

-  call :runsub 19 testout "Specials for the 16/32-bit library with Unicode property support" -q

-  call :runsub 19 testoutstudy "Test with Study Override" -q -s

-  if %jit% EQU 1 call :runsub 19 testoutjit "Test with JIT Override" -q -s+

-goto :eof

-

-:do20

-if %bits% EQU 8 (

-  echo Test 20 Skipped when running 8-bit tests.

-  goto :eof

-)

-  call :runsub 20 testout "DFA specials for the basic 16/32-bit library" -q -dfa

-  call :runsub 20 testoutstudy "Test with Study Override" -q -dfa -s

-goto :eof

-

-:do21

-if %bits% EQU 8 (

-  echo Test 21 Skipped when running 8-bit tests.

-  goto :eof

-)

-if NOT %link_size% EQU 2 (

-  echo Test 21 Skipped because link size is not 2.

-  goto :eof

-)

-copy /Y %srcdir%\testdata\saved8 testsaved8

-copy /Y %srcdir%\testdata\saved16LE-1 testsaved16LE-1

-copy /Y %srcdir%\testdata\saved16BE-1 testsaved16BE-1

-copy /Y %srcdir%\testdata\saved32LE-1 testsaved32LE-1

-copy /Y %srcdir%\testdata\saved32BE-1 testsaved32BE-1

-call :runsub 21 testout "Reloads for the basic 16/32-bit library" -q

-call :runsub 21 testoutstudy "Test with Study Override" -q -s

-if %jit% EQU 1 call :runsub 21 testoutjit "Test with JIT Override" -q -s+

-goto :eof

-

-:do22

-if %bits% EQU 8 (

-  echo Test 22 Skipped when running 8-bit tests.

-  goto :eof

-)

-if %utf% EQU 0 (

-  echo Test 22 Skipped due to absence of UTF-%bits% support.

-  goto :eof

-)

-if NOT %link_size% EQU 2 (

-  echo Test 22 Skipped because link size is not 2.

-  goto :eof

-)

-copy /Y %srcdir%\testdata\saved16LE-2 testsaved16LE-2

-copy /Y %srcdir%\testdata\saved16BE-2 testsaved16BE-2

-copy /Y %srcdir%\testdata\saved32LE-2 testsaved32LE-2

-copy /Y %srcdir%\testdata\saved32BE-2 testsaved32BE-2

-call :runsub 22 testout "Reloads for the 16/32-bit library with UTF-16/32 support" -q

-call :runsub 22 testoutstudy "Test with Study Override" -q -s

-if %jit% EQU 1 call :runsub 22 testoutjit "Test with JIT Override" -q -s+

-goto :eof

-

-:do23

-if NOT %bits% EQU 16 (

-  echo Test 23 Skipped when running 8/32-bit tests.

-  goto :eof

-)

-call :runsub 23 testout "Specials for the 16-bit library" -q

-call :runsub 23 testoutstudy "Test with Study Override" -q -s

-if %jit% EQU 1 call :runsub 23 testoutjit "Test with JIT Override" -q -s+

-goto :eof

-

-:do24

-if NOT %bits% EQU 16 (

-  echo Test 24 Skipped when running 8/32-bit tests.

-  goto :eof

-)

-if %utf% EQU 0 (

-  echo Test 24 Skipped due to absence of UTF-%bits% support.

-  goto :eof

-)

-call :runsub 24 testout "Specials for the 16-bit library with UTF-16 support" -q

-call :runsub 24 testoutstudy "Test with Study Override" -q -s

-if %jit% EQU 1 call :runsub 24 testoutjit "Test with JIT Override" -q -s+

-goto :eof

-

-:do25

-if NOT %bits% EQU 32 (

-  echo Test 25 Skipped when running 8/16-bit tests.

-  goto :eof

-)

-call :runsub 25 testout "Specials for the 32-bit library" -q

-call :runsub 25 testoutstudy "Test with Study Override" -q -s

-if %jit% EQU 1 call :runsub 25 testoutjit "Test with JIT Override" -q -s+

-goto :eof

-

-:do26

-if NOT %bits% EQU 32 (

-  echo Test 26 Skipped when running 8/16-bit tests.

-  goto :eof

-)

-if %utf% EQU 0 (

-  echo Test 26 Skipped due to absence of UTF-%bits% support.

-  goto :eof

-)

-call :runsub 26 testout "Specials for the 32-bit library with UTF-32 support" -q

-call :runsub 26 testoutstudy "Test with Study Override" -q -s

-if %jit% EQU 1 call :runsub 26 testoutjit "Test with JIT Override" -q -s+

-goto :eof

-

-:conferror

-@echo.

-@echo Either your build is incomplete or you have a configuration error.

-@echo.

-@echo If configured with cmake and executed via "make test" or the MSVC "RUN_TESTS"

-@echo project, pcre_test.bat defines variables and automatically calls RunTest.bat.

-@echo For manual testing of all available features, after configuring with cmake

-@echo and building, you can run the built pcre_test.bat. For best results with

-@echo cmake builds and tests avoid directories with full path names that include

-@echo spaces for source or build.

-@echo.

-@echo Otherwise, if the build dir is in a subdir of the source dir, testdata needed

-@echo for input and verification should be found automatically when (from the

-@echo location of the the built exes) you call RunTest.bat. By default RunTest.bat

-@echo runs all tests compatible with the linked pcre library but it can be given

-@echo a test number as an argument.

-@echo.

-@echo If the build dir is not under the source dir you can either copy your exes

-@echo to the source folder or copy RunTest.bat and the testdata folder to the

-@echo location of your built exes and then run RunTest.bat.

-@echo.

-goto :eof

diff --git a/dist/config-cmake.h.in b/dist/config-cmake.h.in
deleted file mode 100644
index 77d9011..0000000
--- a/dist/config-cmake.h.in
+++ /dev/null
@@ -1,57 +0,0 @@
-/* config.h for CMake builds */
-
-#cmakedefine HAVE_DIRENT_H 1
-#cmakedefine HAVE_SYS_STAT_H 1
-#cmakedefine HAVE_SYS_TYPES_H 1
-#cmakedefine HAVE_UNISTD_H 1
-#cmakedefine HAVE_WINDOWS_H 1
-#cmakedefine HAVE_STDINT_H 1                                                   
-#cmakedefine HAVE_INTTYPES_H 1    
-
-#cmakedefine HAVE_TYPE_TRAITS_H 1
-#cmakedefine HAVE_BITS_TYPE_TRAITS_H 1
-
-#cmakedefine HAVE_BCOPY 1
-#cmakedefine HAVE_MEMMOVE 1
-#cmakedefine HAVE_STRERROR 1
-#cmakedefine HAVE_STRTOLL 1
-#cmakedefine HAVE_STRTOQ 1
-#cmakedefine HAVE__STRTOI64 1
-
-#cmakedefine PCRE_STATIC 1
-
-#cmakedefine SUPPORT_PCRE8 1
-#cmakedefine SUPPORT_PCRE16 1
-#cmakedefine SUPPORT_PCRE32 1
-#cmakedefine SUPPORT_JIT 1
-#cmakedefine SUPPORT_PCREGREP_JIT 1
-#cmakedefine SUPPORT_UTF 1
-#cmakedefine SUPPORT_UCP 1
-#cmakedefine EBCDIC 1
-#cmakedefine EBCDIC_NL25 1
-#cmakedefine BSR_ANYCRLF 1
-#cmakedefine NO_RECURSE 1
-
-#cmakedefine HAVE_LONG_LONG 1
-#cmakedefine HAVE_UNSIGNED_LONG_LONG 1
-
-#cmakedefine SUPPORT_LIBBZ2 1
-#cmakedefine SUPPORT_LIBZ 1
-#cmakedefine SUPPORT_LIBEDIT 1
-#cmakedefine SUPPORT_LIBREADLINE 1
-
-#cmakedefine SUPPORT_VALGRIND 1
-#cmakedefine SUPPORT_GCOV 1
-
-#define NEWLINE			@NEWLINE@
-#define POSIX_MALLOC_THRESHOLD	@PCRE_POSIX_MALLOC_THRESHOLD@
-#define LINK_SIZE		@PCRE_LINK_SIZE@
-#define PARENS_NEST_LIMIT       @PCRE_PARENS_NEST_LIMIT@
-#define MATCH_LIMIT		@PCRE_MATCH_LIMIT@
-#define MATCH_LIMIT_RECURSION	@PCRE_MATCH_LIMIT_RECURSION@
-#define PCREGREP_BUFSIZE        @PCREGREP_BUFSIZE@
-
-#define MAX_NAME_SIZE	32
-#define MAX_NAME_COUNT	10000
-
-/* end config.h for CMake builds */
diff --git a/dist/config.h.generic b/dist/config.h.generic
deleted file mode 100644
index 07c12b2..0000000
--- a/dist/config.h.generic
+++ /dev/null
@@ -1,349 +0,0 @@
-/* config.h.  Generated from config.h.in by configure.  */
-/* config.h.in.  Generated from configure.ac by autoheader.  */
-
-/* PCRE is written in Standard C, but there are a few non-standard things it
-can cope with, allowing it to run on SunOS4 and other "close to standard"
-systems.
-
-In environments that support the GNU autotools, config.h.in is converted into
-config.h by the "configure" script. In environments that use CMake,
-config-cmake.in is converted into config.h. If you are going to build PCRE "by
-hand" without using "configure" or CMake, you should copy the distributed
-config.h.generic to config.h, and edit the macro definitions to be the way you
-need them. You must then add -DHAVE_CONFIG_H to all of your compile commands,
-so that config.h is included at the start of every source.
-
-Alternatively, you can avoid editing by using -D on the compiler command line
-to set the macro values. In this case, you do not have to set -DHAVE_CONFIG_H,
-but if you do, default values will be taken from config.h for non-boolean
-macros that are not defined on the command line.
-
-Boolean macros such as HAVE_STDLIB_H and SUPPORT_PCRE8 should either be defined
-(conventionally to 1) for TRUE, and not defined at all for FALSE. All such
-macros are listed as a commented #undef in config.h.generic. Macros such as
-MATCH_LIMIT, whose actual value is relevant, have defaults defined, but are
-surrounded by #ifndef/#endif lines so that the value can be overridden by -D.
-
-PCRE uses memmove() if HAVE_MEMMOVE is defined; otherwise it uses bcopy() if
-HAVE_BCOPY is defined. If your system has neither bcopy() nor memmove(), make
-sure both macros are undefined; an emulation function will then be used. */
-
-/* By default, the \R escape sequence matches any Unicode line ending
-   character or sequence of characters. If BSR_ANYCRLF is defined (to any
-   value), this is changed so that backslash-R matches only CR, LF, or CRLF.
-   The build-time default can be overridden by the user of PCRE at runtime. */
-/* #undef BSR_ANYCRLF */
-
-/* If you are compiling for a system that uses EBCDIC instead of ASCII
-   character codes, define this macro to any value. You must also edit the
-   NEWLINE macro below to set a suitable EBCDIC newline, commonly 21 (0x15).
-   On systems that can use "configure" or CMake to set EBCDIC, NEWLINE is
-   automatically adjusted. When EBCDIC is set, PCRE assumes that all input
-   strings are in EBCDIC. If you do not define this macro, PCRE will assume
-   input strings are ASCII or UTF-8/16/32 Unicode. It is not possible to build
-   a version of PCRE that supports both EBCDIC and UTF-8/16/32. */
-/* #undef EBCDIC */
-
-/* In an EBCDIC environment, define this macro to any value to arrange for the
-   NL character to be 0x25 instead of the default 0x15. NL plays the role that
-   LF does in an ASCII/Unicode environment. The value must also be set in the
-   NEWLINE macro below. On systems that can use "configure" or CMake to set
-   EBCDIC_NL25, the adjustment of NEWLINE is automatic. */
-/* #undef EBCDIC_NL25 */
-
-/* Define to 1 if you have the `bcopy' function. */
-/* #undef HAVE_BCOPY */
-
-/* Define to 1 if you have the <bits/type_traits.h> header file. */
-/* #undef HAVE_BITS_TYPE_TRAITS_H */
-
-/* Define to 1 if you have the <bzlib.h> header file. */
-/* #undef HAVE_BZLIB_H */
-
-/* Define to 1 if you have the <dirent.h> header file. */
-/* #undef HAVE_DIRENT_H */
-
-/* Define to 1 if you have the <dlfcn.h> header file. */
-/* #undef HAVE_DLFCN_H */
-
-/* Define to 1 if you have the <editline/readline.h> header file. */
-/* #undef HAVE_EDITLINE_READLINE_H */
-
-/* Define to 1 if you have the <edit/readline/readline.h> header file. */
-/* #undef HAVE_EDIT_READLINE_READLINE_H */
-
-/* Define to 1 if you have the <inttypes.h> header file. */
-/* #undef HAVE_INTTYPES_H */
-
-/* Define to 1 if you have the <limits.h> header file. */
-/* #undef HAVE_LIMITS_H */
-
-/* Define to 1 if the system has the type `long long'. */
-/* #undef HAVE_LONG_LONG */
-
-/* Define to 1 if you have the `memmove' function. */
-/* #undef HAVE_MEMMOVE */
-
-/* Define to 1 if you have the <memory.h> header file. */
-/* #undef HAVE_MEMORY_H */
-
-/* Define if you have POSIX threads libraries and header files. */
-/* #undef HAVE_PTHREAD */
-
-/* Have PTHREAD_PRIO_INHERIT. */
-/* #undef HAVE_PTHREAD_PRIO_INHERIT */
-
-/* Define to 1 if you have the <readline/history.h> header file. */
-/* #undef HAVE_READLINE_HISTORY_H */
-
-/* Define to 1 if you have the <readline/readline.h> header file. */
-/* #undef HAVE_READLINE_READLINE_H */
-
-/* Define to 1 if you have the <stdint.h> header file. */
-/* #undef HAVE_STDINT_H */
-
-/* Define to 1 if you have the <stdlib.h> header file. */
-/* #undef HAVE_STDLIB_H */
-
-/* Define to 1 if you have the `strerror' function. */
-/* #undef HAVE_STRERROR */
-
-/* Define to 1 if you have the <string> header file. */
-/* #undef HAVE_STRING */
-
-/* Define to 1 if you have the <strings.h> header file. */
-/* #undef HAVE_STRINGS_H */
-
-/* Define to 1 if you have the <string.h> header file. */
-/* #undef HAVE_STRING_H */
-
-/* Define to 1 if you have `strtoimax'. */
-/* #undef HAVE_STRTOIMAX */
-
-/* Define to 1 if you have `strtoll'. */
-/* #undef HAVE_STRTOLL */
-
-/* Define to 1 if you have `strtoq'. */
-/* #undef HAVE_STRTOQ */
-
-/* Define to 1 if you have the <sys/stat.h> header file. */
-/* #undef HAVE_SYS_STAT_H */
-
-/* Define to 1 if you have the <sys/types.h> header file. */
-/* #undef HAVE_SYS_TYPES_H */
-
-/* Define to 1 if you have the <type_traits.h> header file. */
-/* #undef HAVE_TYPE_TRAITS_H */
-
-/* Define to 1 if you have the <unistd.h> header file. */
-/* #undef HAVE_UNISTD_H */
-
-/* Define to 1 if the system has the type `unsigned long long'. */
-/* #undef HAVE_UNSIGNED_LONG_LONG */
-
-/* Define to 1 if the compiler supports simple visibility declarations. */
-/* #undef HAVE_VISIBILITY */
-
-/* Define to 1 if you have the <windows.h> header file. */
-/* #undef HAVE_WINDOWS_H */
-
-/* Define to 1 if you have the <zlib.h> header file. */
-/* #undef HAVE_ZLIB_H */
-
-/* Define to 1 if you have `_strtoi64'. */
-/* #undef HAVE__STRTOI64 */
-
-/* The value of LINK_SIZE determines the number of bytes used to store links
-   as offsets within the compiled regex. The default is 2, which allows for
-   compiled patterns up to 64K long. This covers the vast majority of cases.
-   However, PCRE can also be compiled to use 3 or 4 bytes instead. This allows
-   for longer patterns in extreme cases. */
-#ifndef LINK_SIZE
-#define LINK_SIZE 2
-#endif
-
-/* Define to the sub-directory where libtool stores uninstalled libraries. */
-/* This is ignored unless you are using libtool. */
-#ifndef LT_OBJDIR
-#define LT_OBJDIR ".libs/"
-#endif
-
-/* The value of MATCH_LIMIT determines the default number of times the
-   internal match() function can be called during a single execution of
-   pcre_exec(). There is a runtime interface for setting a different limit.
-   The limit exists in order to catch runaway regular expressions that take
-   for ever to determine that they do not match. The default is set very large
-   so that it does not accidentally catch legitimate cases. */
-#ifndef MATCH_LIMIT
-#define MATCH_LIMIT 10000000
-#endif
-
-/* The above limit applies to all calls of match(), whether or not they
-   increase the recursion depth. In some environments it is desirable to limit
-   the depth of recursive calls of match() more strictly, in order to restrict
-   the maximum amount of stack (or heap, if NO_RECURSE is defined) that is
-   used. The value of MATCH_LIMIT_RECURSION applies only to recursive calls of
-   match(). To have any useful effect, it must be less than the value of
-   MATCH_LIMIT. The default is to use the same value as MATCH_LIMIT. There is
-   a runtime method for setting a different limit. */
-#ifndef MATCH_LIMIT_RECURSION
-#define MATCH_LIMIT_RECURSION MATCH_LIMIT
-#endif
-
-/* This limit is parameterized just in case anybody ever wants to change it.
-   Care must be taken if it is increased, because it guards against integer
-   overflow caused by enormously large patterns. */
-#ifndef MAX_NAME_COUNT
-#define MAX_NAME_COUNT 10000
-#endif
-
-/* This limit is parameterized just in case anybody ever wants to change it.
-   Care must be taken if it is increased, because it guards against integer
-   overflow caused by enormously large patterns. */
-#ifndef MAX_NAME_SIZE
-#define MAX_NAME_SIZE 32
-#endif
-
-/* The value of NEWLINE determines the default newline character sequence.
-   PCRE client programs can override this by selecting other values at run
-   time. In ASCII environments, the value can be 10 (LF), 13 (CR), or 3338
-   (CRLF); in EBCDIC environments the value can be 21 or 37 (LF), 13 (CR), or
-   3349 or 3365 (CRLF) because there are two alternative codepoints (0x15 and
-   0x25) that are used as the NL line terminator that is equivalent to ASCII
-   LF. In both ASCII and EBCDIC environments the value can also be -1 (ANY),
-   or -2 (ANYCRLF). */
-#ifndef NEWLINE
-#define NEWLINE 10
-#endif
-
-/* PCRE uses recursive function calls to handle backtracking while matching.
-   This can sometimes be a problem on systems that have stacks of limited
-   size. Define NO_RECURSE to any value to get a version that doesn't use
-   recursion in the match() function; instead it creates its own stack by
-   steam using pcre_recurse_malloc() to obtain memory from the heap. For more
-   detail, see the comments and other stuff just above the match() function.
-   */
-/* #undef NO_RECURSE */
-
-/* Name of package */
-#define PACKAGE "pcre"
-
-/* Define to the address where bug reports for this package should be sent. */
-#define PACKAGE_BUGREPORT ""
-
-/* Define to the full name of this package. */
-#define PACKAGE_NAME "PCRE"
-
-/* Define to the full name and version of this package. */
-#define PACKAGE_STRING "PCRE 8.38"
-
-/* Define to the one symbol short name of this package. */
-#define PACKAGE_TARNAME "pcre"
-
-/* Define to the home page for this package. */
-#define PACKAGE_URL ""
-
-/* Define to the version of this package. */
-#define PACKAGE_VERSION "8.38"
-
-/* The value of PARENS_NEST_LIMIT specifies the maximum depth of nested
-   parentheses (of any kind) in a pattern. This limits the amount of system
-   stack that is used while compiling a pattern. */
-#ifndef PARENS_NEST_LIMIT
-#define PARENS_NEST_LIMIT 250
-#endif
-
-/* The value of PCREGREP_BUFSIZE determines the size of buffer used by
-   pcregrep to hold parts of the file it is searching. This is also the
-   minimum value. The actual amount of memory used by pcregrep is three times
-   this number, because it allows for the buffering of "before" and "after"
-   lines. */
-#ifndef PCREGREP_BUFSIZE
-#define PCREGREP_BUFSIZE 20480
-#endif
-
-/* If you are compiling for a system other than a Unix-like system or
-   Win32, and it needs some magic to be inserted before the definition
-   of a function that is exported by the library, define this macro to
-   contain the relevant magic. If you do not define this macro, a suitable
-    __declspec value is used for Windows systems; in other environments
-   "extern" is used for a C compiler and "extern C" for a C++ compiler.
-   This macro apears at the start of every exported function that is part
-   of the external API. It does not appear on functions that are "external"
-   in the C sense, but which are internal to the library. */
-/* #undef PCRE_EXP_DEFN */
-
-/* Define to any value if linking statically (TODO: make nice with Libtool) */
-/* #undef PCRE_STATIC */
-
-/* When calling PCRE via the POSIX interface, additional working storage is
-   required for holding the pointers to capturing substrings because PCRE
-   requires three integers per substring, whereas the POSIX interface provides
-   only two. If the number of expected substrings is small, the wrapper
-   function uses space on the stack, because this is faster than using
-   malloc() for each call. The threshold above which the stack is no longer
-   used is defined by POSIX_MALLOC_THRESHOLD. */
-#ifndef POSIX_MALLOC_THRESHOLD
-#define POSIX_MALLOC_THRESHOLD 10
-#endif
-
-/* Define to necessary symbol if this constant uses a non-standard name on
-   your system. */
-/* #undef PTHREAD_CREATE_JOINABLE */
-
-/* Define to 1 if you have the ANSI C header files. */
-/* #undef STDC_HEADERS */
-
-/* Define to any value to enable support for Just-In-Time compiling. */
-/* #undef SUPPORT_JIT */
-
-/* Define to any value to allow pcregrep to be linked with libbz2, so that it
-   is able to handle .bz2 files. */
-/* #undef SUPPORT_LIBBZ2 */
-
-/* Define to any value to allow pcretest to be linked with libedit. */
-/* #undef SUPPORT_LIBEDIT */
-
-/* Define to any value to allow pcretest to be linked with libreadline. */
-/* #undef SUPPORT_LIBREADLINE */
-
-/* Define to any value to allow pcregrep to be linked with libz, so that it is
-   able to handle .gz files. */
-/* #undef SUPPORT_LIBZ */
-
-/* Define to any value to enable the 16 bit PCRE library. */
-/* #undef SUPPORT_PCRE16 */
-
-/* Define to any value to enable the 32 bit PCRE library. */
-/* #undef SUPPORT_PCRE32 */
-
-/* Define to any value to enable the 8 bit PCRE library. */
-/* #undef SUPPORT_PCRE8 */
-
-/* Define to any value to enable JIT support in pcregrep. */
-/* #undef SUPPORT_PCREGREP_JIT */
-
-/* Define to any value to enable support for Unicode properties. */
-/* #undef SUPPORT_UCP */
-
-/* Define to any value to enable support for the UTF-8/16/32 Unicode encoding.
-   This will work even in an EBCDIC environment, but it is incompatible with
-   the EBCDIC macro. That is, PCRE can support *either* EBCDIC code *or*
-   ASCII/UTF-8/16/32, but not both at once. */
-/* #undef SUPPORT_UTF */
-
-/* Define to any value for valgrind support to find invalid memory reads. */
-/* #undef SUPPORT_VALGRIND */
-
-/* Version number of package */
-#define VERSION "8.38"
-
-/* Define to empty if `const' does not conform to ANSI C. */
-/* #undef const */
-
-/* Define to the type of a signed integer type of width exactly 64 bits if
-   such a type exists and the standard includes do not define it. */
-/* #undef int64_t */
-
-/* Define to `unsigned int' if <sys/types.h> does not define. */
-/* #undef size_t */
diff --git a/dist/config.h.in b/dist/config.h.in
deleted file mode 100644
index 0b2f45d..0000000
--- a/dist/config.h.in
+++ /dev/null
@@ -1,347 +0,0 @@
-/* config.h.in.  Generated from configure.ac by autoheader.  */
-
-
-/* PCRE is written in Standard C, but there are a few non-standard things it
-can cope with, allowing it to run on SunOS4 and other "close to standard"
-systems.
-
-In environments that support the GNU autotools, config.h.in is converted into
-config.h by the "configure" script. In environments that use CMake,
-config-cmake.in is converted into config.h. If you are going to build PCRE "by
-hand" without using "configure" or CMake, you should copy the distributed
-config.h.generic to config.h, and edit the macro definitions to be the way you
-need them. You must then add -DHAVE_CONFIG_H to all of your compile commands,
-so that config.h is included at the start of every source.
-
-Alternatively, you can avoid editing by using -D on the compiler command line
-to set the macro values. In this case, you do not have to set -DHAVE_CONFIG_H,
-but if you do, default values will be taken from config.h for non-boolean
-macros that are not defined on the command line.
-
-Boolean macros such as HAVE_STDLIB_H and SUPPORT_PCRE8 should either be defined
-(conventionally to 1) for TRUE, and not defined at all for FALSE. All such
-macros are listed as a commented #undef in config.h.generic. Macros such as
-MATCH_LIMIT, whose actual value is relevant, have defaults defined, but are
-surrounded by #ifndef/#endif lines so that the value can be overridden by -D.
-
-PCRE uses memmove() if HAVE_MEMMOVE is defined; otherwise it uses bcopy() if
-HAVE_BCOPY is defined. If your system has neither bcopy() nor memmove(), make
-sure both macros are undefined; an emulation function will then be used. */
-
-/* By default, the \R escape sequence matches any Unicode line ending
-   character or sequence of characters. If BSR_ANYCRLF is defined (to any
-   value), this is changed so that backslash-R matches only CR, LF, or CRLF.
-   The build-time default can be overridden by the user of PCRE at runtime. */
-#undef BSR_ANYCRLF
-
-/* If you are compiling for a system that uses EBCDIC instead of ASCII
-   character codes, define this macro to any value. You must also edit the
-   NEWLINE macro below to set a suitable EBCDIC newline, commonly 21 (0x15).
-   On systems that can use "configure" or CMake to set EBCDIC, NEWLINE is
-   automatically adjusted. When EBCDIC is set, PCRE assumes that all input
-   strings are in EBCDIC. If you do not define this macro, PCRE will assume
-   input strings are ASCII or UTF-8/16/32 Unicode. It is not possible to build
-   a version of PCRE that supports both EBCDIC and UTF-8/16/32. */
-#undef EBCDIC
-
-/* In an EBCDIC environment, define this macro to any value to arrange for the
-   NL character to be 0x25 instead of the default 0x15. NL plays the role that
-   LF does in an ASCII/Unicode environment. The value must also be set in the
-   NEWLINE macro below. On systems that can use "configure" or CMake to set
-   EBCDIC_NL25, the adjustment of NEWLINE is automatic. */
-#undef EBCDIC_NL25
-
-/* Define to 1 if you have the `bcopy' function. */
-#undef HAVE_BCOPY
-
-/* Define to 1 if you have the <bits/type_traits.h> header file. */
-#undef HAVE_BITS_TYPE_TRAITS_H
-
-/* Define to 1 if you have the <bzlib.h> header file. */
-#undef HAVE_BZLIB_H
-
-/* Define to 1 if you have the <dirent.h> header file. */
-#undef HAVE_DIRENT_H
-
-/* Define to 1 if you have the <dlfcn.h> header file. */
-#undef HAVE_DLFCN_H
-
-/* Define to 1 if you have the <editline/readline.h> header file. */
-#undef HAVE_EDITLINE_READLINE_H
-
-/* Define to 1 if you have the <edit/readline/readline.h> header file. */
-#undef HAVE_EDIT_READLINE_READLINE_H
-
-/* Define to 1 if you have the <inttypes.h> header file. */
-#undef HAVE_INTTYPES_H
-
-/* Define to 1 if you have the <limits.h> header file. */
-#undef HAVE_LIMITS_H
-
-/* Define to 1 if the system has the type `long long'. */
-#undef HAVE_LONG_LONG
-
-/* Define to 1 if you have the `memmove' function. */
-#undef HAVE_MEMMOVE
-
-/* Define to 1 if you have the <memory.h> header file. */
-#undef HAVE_MEMORY_H
-
-/* Define if you have POSIX threads libraries and header files. */
-#undef HAVE_PTHREAD
-
-/* Have PTHREAD_PRIO_INHERIT. */
-#undef HAVE_PTHREAD_PRIO_INHERIT
-
-/* Define to 1 if you have the <readline/history.h> header file. */
-#undef HAVE_READLINE_HISTORY_H
-
-/* Define to 1 if you have the <readline/readline.h> header file. */
-#undef HAVE_READLINE_READLINE_H
-
-/* Define to 1 if you have the <stdint.h> header file. */
-#undef HAVE_STDINT_H
-
-/* Define to 1 if you have the <stdlib.h> header file. */
-#undef HAVE_STDLIB_H
-
-/* Define to 1 if you have the `strerror' function. */
-#undef HAVE_STRERROR
-
-/* Define to 1 if you have the <string> header file. */
-#undef HAVE_STRING
-
-/* Define to 1 if you have the <strings.h> header file. */
-#undef HAVE_STRINGS_H
-
-/* Define to 1 if you have the <string.h> header file. */
-#undef HAVE_STRING_H
-
-/* Define to 1 if you have `strtoimax'. */
-#undef HAVE_STRTOIMAX
-
-/* Define to 1 if you have `strtoll'. */
-#undef HAVE_STRTOLL
-
-/* Define to 1 if you have `strtoq'. */
-#undef HAVE_STRTOQ
-
-/* Define to 1 if you have the <sys/stat.h> header file. */
-#undef HAVE_SYS_STAT_H
-
-/* Define to 1 if you have the <sys/types.h> header file. */
-#undef HAVE_SYS_TYPES_H
-
-/* Define to 1 if you have the <type_traits.h> header file. */
-#undef HAVE_TYPE_TRAITS_H
-
-/* Define to 1 if you have the <unistd.h> header file. */
-#undef HAVE_UNISTD_H
-
-/* Define to 1 if the system has the type `unsigned long long'. */
-#undef HAVE_UNSIGNED_LONG_LONG
-
-/* Define to 1 if the compiler supports simple visibility declarations. */
-#undef HAVE_VISIBILITY
-
-/* Define to 1 if you have the <windows.h> header file. */
-#undef HAVE_WINDOWS_H
-
-/* Define to 1 if you have the <zlib.h> header file. */
-#undef HAVE_ZLIB_H
-
-/* Define to 1 if you have `_strtoi64'. */
-#undef HAVE__STRTOI64
-
-/* The value of LINK_SIZE determines the number of bytes used to store links
-   as offsets within the compiled regex. The default is 2, which allows for
-   compiled patterns up to 64K long. This covers the vast majority of cases.
-   However, PCRE can also be compiled to use 3 or 4 bytes instead. This allows
-   for longer patterns in extreme cases. */
-#undef LINK_SIZE
-
-/* Define to the sub-directory where libtool stores uninstalled libraries. */
-#undef LT_OBJDIR
-
-/* The value of MATCH_LIMIT determines the default number of times the
-   internal match() function can be called during a single execution of
-   pcre_exec(). There is a runtime interface for setting a different limit.
-   The limit exists in order to catch runaway regular expressions that take
-   for ever to determine that they do not match. The default is set very large
-   so that it does not accidentally catch legitimate cases. */
-#undef MATCH_LIMIT
-
-/* The above limit applies to all calls of match(), whether or not they
-   increase the recursion depth. In some environments it is desirable to limit
-   the depth of recursive calls of match() more strictly, in order to restrict
-   the maximum amount of stack (or heap, if NO_RECURSE is defined) that is
-   used. The value of MATCH_LIMIT_RECURSION applies only to recursive calls of
-   match(). To have any useful effect, it must be less than the value of
-   MATCH_LIMIT. The default is to use the same value as MATCH_LIMIT. There is
-   a runtime method for setting a different limit. */
-#undef MATCH_LIMIT_RECURSION
-
-/* This limit is parameterized just in case anybody ever wants to change it.
-   Care must be taken if it is increased, because it guards against integer
-   overflow caused by enormously large patterns. */
-#undef MAX_NAME_COUNT
-
-/* This limit is parameterized just in case anybody ever wants to change it.
-   Care must be taken if it is increased, because it guards against integer
-   overflow caused by enormously large patterns. */
-#undef MAX_NAME_SIZE
-
-/* The value of NEWLINE determines the default newline character sequence.
-   PCRE client programs can override this by selecting other values at run
-   time. In ASCII environments, the value can be 10 (LF), 13 (CR), or 3338
-   (CRLF); in EBCDIC environments the value can be 21 or 37 (LF), 13 (CR), or
-   3349 or 3365 (CRLF) because there are two alternative codepoints (0x15 and
-   0x25) that are used as the NL line terminator that is equivalent to ASCII
-   LF. In both ASCII and EBCDIC environments the value can also be -1 (ANY),
-   or -2 (ANYCRLF). */
-#undef NEWLINE
-
-/* PCRE uses recursive function calls to handle backtracking while matching.
-   This can sometimes be a problem on systems that have stacks of limited
-   size. Define NO_RECURSE to any value to get a version that doesn't use
-   recursion in the match() function; instead it creates its own stack by
-   steam using pcre_recurse_malloc() to obtain memory from the heap. For more
-   detail, see the comments and other stuff just above the match() function.
-   */
-#undef NO_RECURSE
-
-/* Name of package */
-#undef PACKAGE
-
-/* Define to the address where bug reports for this package should be sent. */
-#undef PACKAGE_BUGREPORT
-
-/* Define to the full name of this package. */
-#undef PACKAGE_NAME
-
-/* Define to the full name and version of this package. */
-#undef PACKAGE_STRING
-
-/* Define to the one symbol short name of this package. */
-#undef PACKAGE_TARNAME
-
-/* Define to the home page for this package. */
-#undef PACKAGE_URL
-
-/* Define to the version of this package. */
-#undef PACKAGE_VERSION
-
-/* The value of PARENS_NEST_LIMIT specifies the maximum depth of nested
-   parentheses (of any kind) in a pattern. This limits the amount of system
-   stack that is used while compiling a pattern. */
-#undef PARENS_NEST_LIMIT
-
-/* to make a symbol visible */
-#undef PCRECPP_EXP_DECL
-
-/* to make a symbol visible */
-#undef PCRECPP_EXP_DEFN
-
-/* The value of PCREGREP_BUFSIZE determines the size of buffer used by
-   pcregrep to hold parts of the file it is searching. This is also the
-   minimum value. The actual amount of memory used by pcregrep is three times
-   this number, because it allows for the buffering of "before" and "after"
-   lines. */
-#undef PCREGREP_BUFSIZE
-
-/* to make a symbol visible */
-#undef PCREPOSIX_EXP_DECL
-
-/* to make a symbol visible */
-#undef PCREPOSIX_EXP_DEFN
-
-/* to make a symbol visible */
-#undef PCRE_EXP_DATA_DEFN
-
-/* to make a symbol visible */
-#undef PCRE_EXP_DECL
-
-
-/* If you are compiling for a system other than a Unix-like system or
-   Win32, and it needs some magic to be inserted before the definition
-   of a function that is exported by the library, define this macro to
-   contain the relevant magic. If you do not define this macro, a suitable
-    __declspec value is used for Windows systems; in other environments
-   "extern" is used for a C compiler and "extern C" for a C++ compiler.
-   This macro apears at the start of every exported function that is part
-   of the external API. It does not appear on functions that are "external"
-   in the C sense, but which are internal to the library. */
-#undef PCRE_EXP_DEFN
-
-/* Define to any value if linking statically (TODO: make nice with Libtool) */
-#undef PCRE_STATIC
-
-/* When calling PCRE via the POSIX interface, additional working storage is
-   required for holding the pointers to capturing substrings because PCRE
-   requires three integers per substring, whereas the POSIX interface provides
-   only two. If the number of expected substrings is small, the wrapper
-   function uses space on the stack, because this is faster than using
-   malloc() for each call. The threshold above which the stack is no longer
-   used is defined by POSIX_MALLOC_THRESHOLD. */
-#undef POSIX_MALLOC_THRESHOLD
-
-/* Define to necessary symbol if this constant uses a non-standard name on
-   your system. */
-#undef PTHREAD_CREATE_JOINABLE
-
-/* Define to 1 if you have the ANSI C header files. */
-#undef STDC_HEADERS
-
-/* Define to any value to enable support for Just-In-Time compiling. */
-#undef SUPPORT_JIT
-
-/* Define to any value to allow pcregrep to be linked with libbz2, so that it
-   is able to handle .bz2 files. */
-#undef SUPPORT_LIBBZ2
-
-/* Define to any value to allow pcretest to be linked with libedit. */
-#undef SUPPORT_LIBEDIT
-
-/* Define to any value to allow pcretest to be linked with libreadline. */
-#undef SUPPORT_LIBREADLINE
-
-/* Define to any value to allow pcregrep to be linked with libz, so that it is
-   able to handle .gz files. */
-#undef SUPPORT_LIBZ
-
-/* Define to any value to enable the 16 bit PCRE library. */
-#undef SUPPORT_PCRE16
-
-/* Define to any value to enable the 32 bit PCRE library. */
-#undef SUPPORT_PCRE32
-
-/* Define to any value to enable the 8 bit PCRE library. */
-#undef SUPPORT_PCRE8
-
-/* Define to any value to enable JIT support in pcregrep. */
-#undef SUPPORT_PCREGREP_JIT
-
-/* Define to any value to enable support for Unicode properties. */
-#undef SUPPORT_UCP
-
-/* Define to any value to enable support for the UTF-8/16/32 Unicode encoding.
-   This will work even in an EBCDIC environment, but it is incompatible with
-   the EBCDIC macro. That is, PCRE can support *either* EBCDIC code *or*
-   ASCII/UTF-8/16/32, but not both at once. */
-#undef SUPPORT_UTF
-
-/* Define to any value for valgrind support to find invalid memory reads. */
-#undef SUPPORT_VALGRIND
-
-/* Version number of package */
-#undef VERSION
-
-/* Define to empty if `const' does not conform to ANSI C. */
-#undef const
-
-/* Define to the type of a signed integer type of width exactly 64 bits if
-   such a type exists and the standard includes do not define it. */
-#undef int64_t
-
-/* Define to `unsigned int' if <sys/types.h> does not define. */
-#undef size_t
diff --git a/dist/configure.ac b/dist/configure.ac
deleted file mode 100644
index 9ebe598..0000000
--- a/dist/configure.ac
+++ /dev/null
@@ -1,1111 +0,0 @@
-dnl Process this file with autoconf to produce a configure script.
-
-dnl NOTE FOR MAINTAINERS: Do not use minor version numbers 08 or 09 because
-dnl the leading zeros may cause them to be treated as invalid octal constants
-dnl if a PCRE user writes code that uses PCRE_MINOR as a number. There is now
-dnl a check further down that throws an error if 08 or 09 are used.
-
-dnl The PCRE_PRERELEASE feature is for identifying release candidates. It might
-dnl be defined as -RC2, for example. For real releases, it should be empty.
-
-m4_define(pcre_major, [8])
-m4_define(pcre_minor, [38])
-m4_define(pcre_prerelease, [])
-m4_define(pcre_date, [2015-11-23])
-
-# NOTE: The CMakeLists.txt file searches for the above variables in the first
-# 50 lines of this file. Please update that if the variables above are moved.
-
-# Libtool shared library interface versions (current:revision:age)
-m4_define(libpcre_version, [3:6:2])
-m4_define(libpcre16_version, [2:6:2])
-m4_define(libpcre32_version, [0:6:0])
-m4_define(libpcreposix_version, [0:3:0])
-m4_define(libpcrecpp_version, [0:1:0])
-
-AC_PREREQ(2.57)
-AC_INIT(PCRE, pcre_major.pcre_minor[]pcre_prerelease, , pcre)
-AC_CONFIG_SRCDIR([pcre.h.in])
-AM_INIT_AUTOMAKE([dist-bzip2 dist-zip])
-m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
-AC_CONFIG_HEADERS(config.h)
-
-# This is a new thing required to stop a warning from automake 1.12
-m4_ifdef([AM_PROG_AR], [AM_PROG_AR])
-
-# This was added at the suggestion of libtoolize (03-Jan-10)
-AC_CONFIG_MACRO_DIR([m4])
-
-# The default CFLAGS and CXXFLAGS in Autoconf are "-g -O2" for gcc and just
-# "-g" for any other compiler. There doesn't seem to be a standard way of
-# getting rid of the -g (which I don't think is needed for a production
-# library). This fudge seems to achieve the necessary. First, we remember the
-# externally set values of CFLAGS and CXXFLAGS. Then call the AC_PROG_CC and
-# AC_PROG_CXX macros to find the compilers - if CFLAGS and CXXFLAGS are not
-# set, they will be set to Autoconf's defaults. Afterwards, if the original
-# values were not set, remove the -g from the Autoconf defaults.
-# (PH 02-May-07)
-
-remember_set_CFLAGS="$CFLAGS"
-remember_set_CXXFLAGS="$CXXFLAGS"
-
-AC_PROG_CC
-AC_PROG_CXX
-AM_PROG_CC_C_O
-
-if test "x$remember_set_CFLAGS" = "x"
-then
-  if test "$CFLAGS" = "-g -O2"
-  then
-    CFLAGS="-O2"
-  elif test "$CFLAGS" = "-g"
-  then
-    CFLAGS=""
-  fi
-fi
-
-if test "x$remember_set_CXXFLAGS" = "x"
-then
-  if test "$CXXFLAGS" = "-g -O2"
-  then
-    CXXFLAGS="-O2"
-  elif test "$CXXFLAGS" = "-g"
-  then
-    CXXFLAGS=""
-  fi
-fi
-
-# AC_PROG_CXX will return "g++" even if no c++ compiler is installed.
-# Check for that case, and just disable c++ code if g++ doesn't run.
-AC_LANG_PUSH(C++)
-AC_COMPILE_IFELSE([AC_LANG_PROGRAM([],[])],, CXX=""; CXXCP=""; CXXFLAGS="")
-AC_LANG_POP
-
-# Check for a 64-bit integer type
-AC_TYPE_INT64_T
-
-AC_PROG_INSTALL
-AC_LIBTOOL_WIN32_DLL
-LT_INIT
-AC_PROG_LN_S
-
-# Check for GCC visibility feature
-
-PCRE_VISIBILITY
-
-# Versioning
-
-PCRE_MAJOR="pcre_major"
-PCRE_MINOR="pcre_minor"
-PCRE_PRERELEASE="pcre_prerelease"
-PCRE_DATE="pcre_date"
-
-if test "$PCRE_MINOR" = "08" -o "$PCRE_MINOR" = "09"
-then
-  echo "***"
-  echo "*** Minor version number $PCRE_MINOR must not be used. ***"
-  echo "*** Use only 01 to 07 or 10 onwards, to avoid octal issues. ***"
-  echo "***"
-  exit 1
-fi
-
-AC_SUBST(PCRE_MAJOR)
-AC_SUBST(PCRE_MINOR)
-AC_SUBST(PCRE_PRERELEASE)
-AC_SUBST(PCRE_DATE)
-
-# Set a more sensible default value for $(htmldir).
-if test "x$htmldir" = 'x${docdir}'
-then
-  htmldir='${docdir}/html'
-fi
-
-# Handle --disable-pcre8 (enabled by default)
-AC_ARG_ENABLE(pcre8,
-              AS_HELP_STRING([--disable-pcre8],
-                             [disable 8 bit character support]),
-              , enable_pcre8=unset)
-AC_SUBST(enable_pcre8)
-
-# Handle --enable-pcre16 (disabled by default)
-AC_ARG_ENABLE(pcre16,
-              AS_HELP_STRING([--enable-pcre16],
-                             [enable 16 bit character support]),
-              , enable_pcre16=unset)
-AC_SUBST(enable_pcre16)
-
-# Handle --enable-pcre32 (disabled by default)
-AC_ARG_ENABLE(pcre32,
-              AS_HELP_STRING([--enable-pcre32],
-                             [enable 32 bit character support]),
-              , enable_pcre32=unset)
-AC_SUBST(enable_pcre32)
-
-# Handle --disable-cpp. The substitution of enable_cpp is needed for use in
-# pcre-config.
-AC_ARG_ENABLE(cpp,
-              AS_HELP_STRING([--disable-cpp],
-                             [disable C++ support]),
-              , enable_cpp=unset)
-AC_SUBST(enable_cpp)
-
-# Handle --enable-jit (disabled by default)
-AC_ARG_ENABLE(jit,
-              AS_HELP_STRING([--enable-jit],
-                             [enable Just-In-Time compiling support]),
-              , enable_jit=no)
-
-# Handle --disable-pcregrep-jit (enabled by default)
-AC_ARG_ENABLE(pcregrep-jit,
-              AS_HELP_STRING([--disable-pcregrep-jit],
-                             [disable JIT support in pcregrep]),
-              , enable_pcregrep_jit=yes)
-
-# Handle --enable-rebuild-chartables
-AC_ARG_ENABLE(rebuild-chartables,
-              AS_HELP_STRING([--enable-rebuild-chartables],
-                             [rebuild character tables in current locale]),
-              , enable_rebuild_chartables=no)
-
-# Handle --enable-utf8 (disabled by default)
-AC_ARG_ENABLE(utf8,
-              AS_HELP_STRING([--enable-utf8],
-                             [another name for --enable-utf. Kept only for compatibility reasons]),
-              , enable_utf8=unset)
-
-# Handle --enable-utf (disabled by default)
-AC_ARG_ENABLE(utf,
-              AS_HELP_STRING([--enable-utf],
-                             [enable UTF-8/16/32 support (incompatible with --enable-ebcdic)]),
-              , enable_utf=unset)
-
-# Handle --enable-unicode-properties
-AC_ARG_ENABLE(unicode-properties,
-              AS_HELP_STRING([--enable-unicode-properties],
-                             [enable Unicode properties support (implies --enable-utf)]),
-              , enable_unicode_properties=no)
-
-# Handle newline options
-ac_pcre_newline=lf
-AC_ARG_ENABLE(newline-is-cr,
-              AS_HELP_STRING([--enable-newline-is-cr],
-                             [use CR as newline character]),
-              ac_pcre_newline=cr)
-AC_ARG_ENABLE(newline-is-lf,
-              AS_HELP_STRING([--enable-newline-is-lf],
-                             [use LF as newline character (default)]),
-              ac_pcre_newline=lf)
-AC_ARG_ENABLE(newline-is-crlf,
-              AS_HELP_STRING([--enable-newline-is-crlf],
-                             [use CRLF as newline sequence]),
-              ac_pcre_newline=crlf)
-AC_ARG_ENABLE(newline-is-anycrlf,
-              AS_HELP_STRING([--enable-newline-is-anycrlf],
-                             [use CR, LF, or CRLF as newline sequence]),
-              ac_pcre_newline=anycrlf)
-AC_ARG_ENABLE(newline-is-any,
-              AS_HELP_STRING([--enable-newline-is-any],
-                             [use any valid Unicode newline sequence]),
-              ac_pcre_newline=any)
-enable_newline="$ac_pcre_newline"
-
-# Handle --enable-bsr-anycrlf
-AC_ARG_ENABLE(bsr-anycrlf,
-              AS_HELP_STRING([--enable-bsr-anycrlf],
-                             [\R matches only CR, LF, CRLF by default]),
-              , enable_bsr_anycrlf=no)
-
-# Handle --enable-ebcdic
-AC_ARG_ENABLE(ebcdic,
-              AS_HELP_STRING([--enable-ebcdic],
-                             [assume EBCDIC coding rather than ASCII; incompatible with --enable-utf; use only in (uncommon) EBCDIC environments; it implies --enable-rebuild-chartables]),
-              , enable_ebcdic=no)
-
-# Handle --enable-ebcdic-nl25
-AC_ARG_ENABLE(ebcdic-nl25,
-              AS_HELP_STRING([--enable-ebcdic-nl25],
-                             [set EBCDIC code for NL to 0x25 instead of 0x15; it implies --enable-ebcdic]),
-              , enable_ebcdic_nl25=no)
-
-# Handle --disable-stack-for-recursion
-AC_ARG_ENABLE(stack-for-recursion,
-              AS_HELP_STRING([--disable-stack-for-recursion],
-                             [don't use stack recursion when matching]),
-              , enable_stack_for_recursion=yes)
-
-# Handle --enable-pcregrep-libz
-AC_ARG_ENABLE(pcregrep-libz,
-              AS_HELP_STRING([--enable-pcregrep-libz],
-                             [link pcregrep with libz to handle .gz files]),
-              , enable_pcregrep_libz=no)
-
-# Handle --enable-pcregrep-libbz2
-AC_ARG_ENABLE(pcregrep-libbz2,
-              AS_HELP_STRING([--enable-pcregrep-libbz2],
-                             [link pcregrep with libbz2 to handle .bz2 files]),
-              , enable_pcregrep_libbz2=no)
-
-# Handle --with-pcregrep-bufsize=N
-AC_ARG_WITH(pcregrep-bufsize,
-              AS_HELP_STRING([--with-pcregrep-bufsize=N],
-                             [pcregrep buffer size (default=20480, minimum=8192)]),
-              , with_pcregrep_bufsize=20480)
-
-# Handle --enable-pcretest-libedit
-AC_ARG_ENABLE(pcretest-libedit,
-              AS_HELP_STRING([--enable-pcretest-libedit],
-                             [link pcretest with libedit]),
-              , enable_pcretest_libedit=no)
-
-# Handle --enable-pcretest-libreadline
-AC_ARG_ENABLE(pcretest-libreadline,
-              AS_HELP_STRING([--enable-pcretest-libreadline],
-                             [link pcretest with libreadline]),
-              , enable_pcretest_libreadline=no)
-
-# Handle --with-posix-malloc-threshold=NBYTES
-AC_ARG_WITH(posix-malloc-threshold,
-            AS_HELP_STRING([--with-posix-malloc-threshold=NBYTES],
-                           [threshold for POSIX malloc usage (default=10)]),
-            , with_posix_malloc_threshold=10)
-
-# Handle --with-link-size=N
-AC_ARG_WITH(link-size,
-            AS_HELP_STRING([--with-link-size=N],
-                           [internal link size (2, 3, or 4 allowed; default=2)]),
-            , with_link_size=2)
-
-# Handle --with-parens-nest-limit=N
-AC_ARG_WITH(parens-nest-limit,
-            AS_HELP_STRING([--with-parens-nest-limit=N],
-                           [nested parentheses limit (default=250)]),
-            , with_parens_nest_limit=250)
-
-# Handle --with-match-limit=N
-AC_ARG_WITH(match-limit,
-            AS_HELP_STRING([--with-match-limit=N],
-                           [default limit on internal looping (default=10000000)]),
-            , with_match_limit=10000000)
-
-# Handle --with-match-limit_recursion=N
-#
-# Note: In config.h, the default is to define MATCH_LIMIT_RECURSION
-# symbolically as MATCH_LIMIT, which in turn is defined to be some numeric
-# value (e.g. 10000000). MATCH_LIMIT_RECURSION can otherwise be set to some
-# different numeric value (or even the same numeric value as MATCH_LIMIT,
-# though no longer defined in terms of the latter).
-#
-AC_ARG_WITH(match-limit-recursion,
-            AS_HELP_STRING([--with-match-limit-recursion=N],
-                           [default limit on internal recursion (default=MATCH_LIMIT)]),
-            , with_match_limit_recursion=MATCH_LIMIT)
-
-# Handle --enable-valgrind
-AC_ARG_ENABLE(valgrind,
-              AS_HELP_STRING([--enable-valgrind],
-                             [valgrind support]),
-              , enable_valgrind=no)
-
-# Enable code coverage reports using gcov
-AC_ARG_ENABLE(coverage,
-              AS_HELP_STRING([--enable-coverage],
-                             [enable code coverage reports using gcov]),
-              , enable_coverage=no)
-
-# Copy enable_utf8 value to enable_utf for compatibility reasons
-if test "x$enable_utf8" != "xunset"
-then
-  if test "x$enable_utf" != "xunset"
-  then
-    AC_MSG_ERROR([--enable/disable-utf8 is kept only for compatibility reasons and its value is copied to --enable/disable-utf. Newer code must use --enable/disable-utf alone.])
-  fi
-  enable_utf=$enable_utf8
-fi
-
-# Set the default value for pcre8
-if test "x$enable_pcre8" = "xunset"
-then
-  enable_pcre8=yes
-fi
-
-# Set the default value for pcre16
-if test "x$enable_pcre16" = "xunset"
-then
-  enable_pcre16=no
-fi
-
-# Set the default value for pcre32
-if test "x$enable_pcre32" = "xunset"
-then
-  enable_pcre32=no
-fi
-
-# Make sure enable_pcre8 or enable_pcre16 was set
-if test "x$enable_pcre8$enable_pcre16$enable_pcre32" = "xnonono"
-then
-  AC_MSG_ERROR([At least one of 8, 16 or 32 bit pcre library must be enabled])
-fi
-
-# Make sure that if enable_unicode_properties was set, that UTF support is enabled.
-if test "x$enable_unicode_properties" = "xyes"
-then
-  if test "x$enable_utf" = "xno"
-  then
-    AC_MSG_ERROR([support for Unicode properties requires UTF-8/16/32 support])
-  fi
-  enable_utf=yes
-fi
-
-# enable_utf is disabled by default.
-if test "x$enable_utf" = "xunset"
-then
-  enable_utf=no
-fi
-
-# enable_cpp copies the value of enable_pcre8 by default
-if test "x$enable_cpp" = "xunset"
-then
-  enable_cpp=$enable_pcre8
-fi
-
-# Make sure that if enable_cpp was set, that enable_pcre8 support is enabled
-if test "x$enable_cpp" = "xyes"
-then
-  if test "x$enable_pcre8" = "xno"
-  then
-    AC_MSG_ERROR([C++ library requires pcre library with 8 bit characters])
-  fi
-fi
-
-# Convert the newline identifier into the appropriate integer value. The first
-# three are ASCII values 0x0a, 0x0d, and 0x0d0a, but if EBCDIC is enabled, they
-# are changed below.
-
-case "$enable_newline" in
-  lf)      ac_pcre_newline_value=10   ;;
-  cr)      ac_pcre_newline_value=13   ;;
-  crlf)    ac_pcre_newline_value=3338 ;;
-  anycrlf) ac_pcre_newline_value=-2   ;;
-  any)     ac_pcre_newline_value=-1   ;;
-  *)
-  AC_MSG_ERROR([invalid argument \"$enable_newline\" to --enable-newline option])
-  ;;
-esac
-
-# --enable-ebcdic-nl25 implies --enable-ebcdic
-if test "x$enable_ebcdic_nl25" = "xyes"; then
-  enable_ebcdic=yes
-fi
-
-# Make sure that if enable_ebcdic is set, rebuild_chartables is also enabled,
-# and the newline value is adjusted appropriately (CR is still 13, but LF is
-# 21 or 37). Also check that UTF support is not requested, because PCRE cannot
-# handle EBCDIC and UTF in the same build. To do so it would need to use
-# different character constants depending on the mode.
-#
-if test "x$enable_ebcdic" = "xyes"; then
-  enable_rebuild_chartables=yes
-
-  if test "x$enable_utf" = "xyes"; then
-    AC_MSG_ERROR([support for EBCDIC and UTF-8/16/32 cannot be enabled at the same time])
-  fi
-
-  if test "x$enable_ebcdic_nl25" = "xno"; then
-    case "$ac_pcre_newline_value" in
-      10)   ac_pcre_newline_value=21 ;;
-      3338) ac_pcre_newline_value=3349 ;;
-    esac
-  else
-    case "$ac_pcre_newline_value" in
-      10)   ac_pcre_newline_value=37 ;;
-      3338) ac_pcre_newline_value=3365 ;;
-    esac
-  fi
-fi
-
-# Check argument to --with-link-size
-case "$with_link_size" in
-  2|3|4) ;;
-  *)
-  AC_MSG_ERROR([invalid argument \"$with_link_size\" to --with-link-size option])
-  ;;
-esac
-
-AH_TOP([
-/* PCRE is written in Standard C, but there are a few non-standard things it
-can cope with, allowing it to run on SunOS4 and other "close to standard"
-systems.
-
-In environments that support the GNU autotools, config.h.in is converted into
-config.h by the "configure" script. In environments that use CMake,
-config-cmake.in is converted into config.h. If you are going to build PCRE "by
-hand" without using "configure" or CMake, you should copy the distributed
-config.h.generic to config.h, and edit the macro definitions to be the way you
-need them. You must then add -DHAVE_CONFIG_H to all of your compile commands,
-so that config.h is included at the start of every source.
-
-Alternatively, you can avoid editing by using -D on the compiler command line
-to set the macro values. In this case, you do not have to set -DHAVE_CONFIG_H,
-but if you do, default values will be taken from config.h for non-boolean
-macros that are not defined on the command line.
-
-Boolean macros such as HAVE_STDLIB_H and SUPPORT_PCRE8 should either be defined
-(conventionally to 1) for TRUE, and not defined at all for FALSE. All such
-macros are listed as a commented #undef in config.h.generic. Macros such as
-MATCH_LIMIT, whose actual value is relevant, have defaults defined, but are
-surrounded by #ifndef/#endif lines so that the value can be overridden by -D.
-
-PCRE uses memmove() if HAVE_MEMMOVE is defined; otherwise it uses bcopy() if
-HAVE_BCOPY is defined. If your system has neither bcopy() nor memmove(), make
-sure both macros are undefined; an emulation function will then be used. */])
-
-# Checks for header files.
-AC_HEADER_STDC
-AC_CHECK_HEADERS(limits.h sys/types.h sys/stat.h dirent.h)
-AC_CHECK_HEADERS([windows.h], [HAVE_WINDOWS_H=1])
-
-# The files below are C++ header files.
-pcre_have_type_traits="0"
-pcre_have_bits_type_traits="0"
-
-if test "x$enable_cpp" = "xyes" -a -z "$CXX"; then
-   AC_MSG_ERROR([You need a C++ compiler for C++ support.])
-fi
-
-if test "x$enable_cpp" = "xyes" -a -n "$CXX"
-then
-AC_LANG_PUSH(C++)
-
-# Older versions of pcre defined pcrecpp::no_arg, but in new versions
-# it's called pcrecpp::RE::no_arg.  For backwards ABI compatibility,
-# we want to make one an alias for the other.  Different systems do
-# this in different ways.  Some systems, for instance, can do it via
-# a linker flag: -alias (for os x 10.5) or -i (for os x <=10.4).
-OLD_LDFLAGS="$LDFLAGS"
-for flag in "-alias,__ZN7pcrecpp2RE6no_argE,__ZN7pcrecpp6no_argE" \
-            "-i__ZN7pcrecpp6no_argE:__ZN7pcrecpp2RE6no_argE"; do
-  AC_MSG_CHECKING([for alias support in the linker])
-  LDFLAGS="$OLD_LDFLAGS -Wl,$flag"
-  # We try to run the linker with this new ld flag.  If the link fails,
-  # we give up and remove the new flag from LDFLAGS.
-  AC_LINK_IFELSE([AC_LANG_PROGRAM([namespace pcrecpp {
-                                    class RE { static int no_arg; };
-                                    int RE::no_arg;
-                                  }],
-                                 [])],
-                 [AC_MSG_RESULT([yes]);
-                  EXTRA_LIBPCRECPP_LDFLAGS="$EXTRA_LIBPCRECPP_LDFLAGS -Wl,$flag";
-                  break;],
-                 AC_MSG_RESULT([no]))
-done
-LDFLAGS="$OLD_LDFLAGS"
-
-# We could be more clever here, given we're doing AC_SUBST with this
-# (eg set a var to be the name of the include file we want). But we're not
-# 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"])
-
-# (This isn't c++-specific, but is only used in pcrecpp.cc, so try this
-# in a c++ context.  This matters becuase strtoimax is C99 and may not
-# be supported by the C++ compiler.)
-# Figure out how to create a longlong from a string: strtoll and
-# equiv.  It's not enough to call AC_CHECK_FUNCS: hpux has a
-# strtoll, for instance, but it only takes 2 args instead of 3!
-# We have to call AH_TEMPLATE since AC_DEFINE_UNQUOTED below is complex.
-AH_TEMPLATE(HAVE_STRTOQ, [Define to 1 if you have `strtoq'.])
-AH_TEMPLATE(HAVE_STRTOLL, [Define to 1 if you have `strtoll'.])
-AH_TEMPLATE(HAVE__STRTOI64, [Define to 1 if you have `_strtoi64'.])
-AH_TEMPLATE(HAVE_STRTOIMAX, [Define to 1 if you have `strtoimax'.])
-have_strto_fn=0
-for fn in strtoq strtoll _strtoi64 strtoimax; do
-  AC_MSG_CHECKING([for $fn])
-  if test "$fn" = strtoimax; then
-    include=stdint.h
-  else
-    include=stdlib.h
-  fi
-  AC_COMPILE_IFELSE([AC_LANG_PROGRAM([#include <$include>],
-                                    [char* e; return $fn("100", &e, 10)])],
-                    [AC_MSG_RESULT(yes)
-                     AC_DEFINE_UNQUOTED(HAVE_`echo $fn | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`, 1,
-                                        [Define to 1 if you have `$fn'.])
-                     have_strto_fn=1
-                     break],
-                    [AC_MSG_RESULT(no)])
-done
-
-if test "$have_strto_fn" = 1; then
-  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"])
-else
-  pcre_have_long_long="0"
-  pcre_have_ulong_long="0"
-fi
-AC_SUBST(pcre_have_long_long)
-AC_SUBST(pcre_have_ulong_long)
-
-AC_LANG_POP
-fi
-# Using AC_SUBST eliminates the need to include config.h in a public .h file
-AC_SUBST(pcre_have_type_traits)
-AC_SUBST(pcre_have_bits_type_traits)
-
-# Conditional compilation
-AM_CONDITIONAL(WITH_PCRE8, test "x$enable_pcre8" = "xyes")
-AM_CONDITIONAL(WITH_PCRE16, test "x$enable_pcre16" = "xyes")
-AM_CONDITIONAL(WITH_PCRE32, test "x$enable_pcre32" = "xyes")
-AM_CONDITIONAL(WITH_PCRE_CPP, test "x$enable_cpp" = "xyes")
-AM_CONDITIONAL(WITH_REBUILD_CHARTABLES, test "x$enable_rebuild_chartables" = "xyes")
-AM_CONDITIONAL(WITH_JIT, test "x$enable_jit" = "xyes")
-AM_CONDITIONAL(WITH_UTF, test "x$enable_utf" = "xyes")
-AM_CONDITIONAL(WITH_VALGRIND, test "x$enable_valgrind" = "xyes")
-
-# Checks for typedefs, structures, and compiler characteristics.
-
-AC_C_CONST
-AC_TYPE_SIZE_T
-
-# Checks for library functions.
-
-AC_CHECK_FUNCS(bcopy memmove strerror)
-
-# Check for the availability of libz (aka zlib)
-
-AC_CHECK_HEADERS([zlib.h], [HAVE_ZLIB_H=1])
-AC_CHECK_LIB([z], [gzopen], [HAVE_LIBZ=1])
-
-# Check for the availability of libbz2. Originally we just used AC_CHECK_LIB,
-# as for libz. However, this had the following problem, diagnosed and fixed by
-# a user:
-#
-#   - libbz2 uses the Pascal calling convention (WINAPI) for the functions
-#     under Win32.
-#   - The standard autoconf AC_CHECK_LIB fails to include "bzlib.h",
-#     therefore missing the function definition.
-#   - The compiler thus generates a "C" signature for the test function.
-#   - The linker fails to find the "C" function.
-#   - PCRE fails to configure if asked to do so against libbz2.
-#
-# Solution:
-#
-#   - Replace the AC_CHECK_LIB test with a custom test.
-
-AC_CHECK_HEADERS([bzlib.h], [HAVE_BZLIB_H=1])
-# Original test
-# AC_CHECK_LIB([bz2], [BZ2_bzopen], [HAVE_LIBBZ2=1])
-#
-# Custom test follows
-
-AC_MSG_CHECKING([for libbz2])
-OLD_LIBS="$LIBS"
-LIBS="$LIBS -lbz2"
-AC_LINK_IFELSE([AC_LANG_PROGRAM([[
-#ifdef HAVE_BZLIB_H
-#include <bzlib.h>
-#endif]],
-[[return (int)BZ2_bzopen("conftest", "rb");]])],
-[AC_MSG_RESULT([yes]);HAVE_LIBBZ2=1; break;],
-AC_MSG_RESULT([no]))
-LIBS="$OLD_LIBS"
-
-# Check for the availabiity of libreadline
-
-if test "$enable_pcretest_libreadline" = "yes"; then
- AC_CHECK_HEADERS([readline/readline.h], [HAVE_READLINE_H=1])
- AC_CHECK_HEADERS([readline/history.h], [HAVE_HISTORY_H=1])
- AC_CHECK_LIB([readline], [readline], [LIBREADLINE="-lreadline"],
-   [unset ac_cv_lib_readline_readline;
-    AC_CHECK_LIB([readline], [readline], [LIBREADLINE="-ltinfo"],
-     [unset ac_cv_lib_readline_readline;
-      AC_CHECK_LIB([readline], [readline], [LIBREADLINE="-lcurses"],
-       [unset ac_cv_lib_readline_readline;
-        AC_CHECK_LIB([readline], [readline], [LIBREADLINE="-lncurses"],
-         [unset ac_cv_lib_readline_readline;
-	  AC_CHECK_LIB([readline], [readline], [LIBREADLINE="-lncursesw"],
-           [unset ac_cv_lib_readline_readline;
-	    AC_CHECK_LIB([readline], [readline], [LIBREADLINE="-ltermcap"],
-             [LIBREADLINE=""],
-             [-ltermcap])],
-           [-lncursesw])],
-         [-lncurses])],
-       [-lcurses])],
-     [-ltinfo])])
- AC_SUBST(LIBREADLINE)
- if test -n "$LIBREADLINE"; then
-   if test "$LIBREADLINE" != "-lreadline"; then
-     echo "-lreadline needs $LIBREADLINE"
-     LIBREADLINE="-lreadline $LIBREADLINE"
-   fi
- fi
-fi
-
-
-# Check for the availability of libedit. Different distributions put its
-# headers in different places. Try to cover the most common ones.
-
-if test "$enable_pcretest_libedit" = "yes"; then
-  AC_CHECK_HEADERS([editline/readline.h], [HAVE_EDITLINE_READLINE_H=1],
-    [AC_CHECK_HEADERS([edit/readline/readline.h], [HAVE_READLINE_READLINE_H=1],
-      [AC_CHECK_HEADERS([readline/readline.h], [HAVE_READLINE_READLINE_H=1])])])
-  AC_CHECK_LIB([edit], [readline], [LIBEDIT="-ledit"])
-fi
-
-# This facilitates -ansi builds under Linux
-dnl AC_DEFINE([_GNU_SOURCE], [], [Enable GNU extensions in glibc])
-
-PCRE_STATIC_CFLAG=""
-if test "x$enable_shared" = "xno" ; then
-  AC_DEFINE([PCRE_STATIC], [1], [
-    Define to any value if linking statically (TODO: make nice with Libtool)])
-  PCRE_STATIC_CFLAG="-DPCRE_STATIC"
-fi
-AC_SUBST(PCRE_STATIC_CFLAG)
-
-# Here is where pcre specific defines are handled
-
-if test "$enable_pcre8" = "yes"; then
-  AC_DEFINE([SUPPORT_PCRE8], [], [
-    Define to any value to enable the 8 bit PCRE library.])
-fi
-
-if test "$enable_pcre16" = "yes"; then
-  AC_DEFINE([SUPPORT_PCRE16], [], [
-    Define to any value to enable the 16 bit PCRE library.])
-fi
-
-if test "$enable_pcre32" = "yes"; then
-  AC_DEFINE([SUPPORT_PCRE32], [], [
-    Define to any value to enable the 32 bit PCRE library.])
-fi
-
-# Unless running under Windows, JIT support requires pthreads.
-
-if test "$enable_jit" = "yes"; then
-  if test "$HAVE_WINDOWS_H" != "1"; then
-    AX_PTHREAD([], [AC_MSG_ERROR([JIT support requires pthreads])])
-    CC="$PTHREAD_CC"
-    CFLAGS="$PTHREAD_CFLAGS $CFLAGS"
-    LIBS="$PTHREAD_LIBS $LIBS"
-  fi
-  AC_DEFINE([SUPPORT_JIT], [], [
-    Define to any value to enable support for Just-In-Time compiling.])
-else
-  enable_pcregrep_jit="no"
-fi
-
-if test "$enable_pcregrep_jit" = "yes"; then
-  AC_DEFINE([SUPPORT_PCREGREP_JIT], [], [
-    Define to any value to enable JIT support in pcregrep.])
-fi
-
-if test "$enable_utf" = "yes"; then
-  AC_DEFINE([SUPPORT_UTF], [], [
-    Define to any value to enable support for the UTF-8/16/32 Unicode encoding.
-    This will work even in an EBCDIC environment, but it is incompatible
-    with the EBCDIC macro. That is, PCRE can support *either* EBCDIC
-    code *or* ASCII/UTF-8/16/32, but not both at once.])
-fi
-
-if test "$enable_unicode_properties" = "yes"; then
-  AC_DEFINE([SUPPORT_UCP], [], [
-    Define to any value to enable support for Unicode properties.])
-fi
-
-if test "$enable_stack_for_recursion" = "no"; then
-  AC_DEFINE([NO_RECURSE], [], [
-    PCRE uses recursive function calls to handle backtracking while
-    matching. This can sometimes be a problem on systems that have
-    stacks of limited size. Define NO_RECURSE to any value to get a
-    version that doesn't use recursion in the match() function; instead
-    it creates its own stack by steam using pcre_recurse_malloc() to obtain
-    memory from the heap. For more detail, see the comments and other stuff
-    just above the match() function.])
-fi
-
-if test "$enable_pcregrep_libz" = "yes"; then
-  AC_DEFINE([SUPPORT_LIBZ], [], [
-    Define to any value to allow pcregrep to be linked with libz, so that it is
-    able to handle .gz files.])
-fi
-
-if test "$enable_pcregrep_libbz2" = "yes"; then
-  AC_DEFINE([SUPPORT_LIBBZ2], [], [
-    Define to any value to allow pcregrep to be linked with libbz2, so that it
-    is able to handle .bz2 files.])
-fi
-
-if test $with_pcregrep_bufsize -lt 8192 ; then
-  AC_MSG_WARN([$with_pcregrep_bufsize is too small for --with-pcregrep-bufsize; using 8192])
-  with_pcregrep_bufsize="8192"
-else
-  if test $? -gt 1 ; then
-  AC_MSG_ERROR([Bad value for  --with-pcregrep-bufsize])
-  fi
-fi
-
-AC_DEFINE_UNQUOTED([PCREGREP_BUFSIZE], [$with_pcregrep_bufsize], [
-  The value of PCREGREP_BUFSIZE determines the size of buffer used by pcregrep
-  to hold parts of the file it is searching. This is also the minimum value.
-  The actual amount of memory used by pcregrep is three times this number,
-  because it allows for the buffering of "before" and "after" lines.])
-
-if test "$enable_pcretest_libedit" = "yes"; then
-  AC_DEFINE([SUPPORT_LIBEDIT], [], [
-    Define to any value to allow pcretest to be linked with libedit.])
-  LIBREADLINE="$LIBEDIT"
-elif test "$enable_pcretest_libreadline" = "yes"; then
-  AC_DEFINE([SUPPORT_LIBREADLINE], [], [
-    Define to any value to allow pcretest to be linked with libreadline.])
-fi
-
-AC_DEFINE_UNQUOTED([NEWLINE], [$ac_pcre_newline_value], [
-  The value of NEWLINE determines the default newline character sequence. PCRE
-  client programs can override this by selecting other values at run time. In
-  ASCII environments, the value can be 10 (LF), 13 (CR), or 3338 (CRLF); in
-  EBCDIC environments the value can be 21 or 37 (LF), 13 (CR), or 3349 or 3365
-  (CRLF) because there are two alternative codepoints (0x15 and 0x25) that are
-  used as the NL line terminator that is equivalent to ASCII LF. In both ASCII
-  and EBCDIC environments the value can also be -1 (ANY), or -2 (ANYCRLF).])
-
-if test "$enable_bsr_anycrlf" = "yes"; then
-  AC_DEFINE([BSR_ANYCRLF], [], [
-    By default, the \R escape sequence matches any Unicode line ending
-    character or sequence of characters. If BSR_ANYCRLF is defined (to any
-    value), this is changed so that backslash-R matches only CR, LF, or CRLF.
-    The build-time default can be overridden by the user of PCRE at runtime.])
-fi
-
-AC_DEFINE_UNQUOTED([LINK_SIZE], [$with_link_size], [
-  The value of LINK_SIZE determines the number of bytes used to store
-  links as offsets within the compiled regex. The default is 2, which
-  allows for compiled patterns up to 64K long. This covers the vast
-  majority of cases. However, PCRE can also be compiled to use 3 or 4
-  bytes instead. This allows for longer patterns in extreme cases.])
-
-AC_DEFINE_UNQUOTED([POSIX_MALLOC_THRESHOLD], [$with_posix_malloc_threshold], [
-  When calling PCRE via the POSIX interface, additional working storage
-  is required for holding the pointers to capturing substrings because
-  PCRE requires three integers per substring, whereas the POSIX
-  interface provides only two. If the number of expected substrings is
-  small, the wrapper function uses space on the stack, because this is
-  faster than using malloc() for each call. The threshold above which
-  the stack is no longer used is defined by POSIX_MALLOC_THRESHOLD.])
-
-AC_DEFINE_UNQUOTED([PARENS_NEST_LIMIT], [$with_parens_nest_limit], [
-  The value of PARENS_NEST_LIMIT specifies the maximum depth of nested
-  parentheses (of any kind) in a pattern. This limits the amount of system
-  stack that is used while compiling a pattern.])
-
-AC_DEFINE_UNQUOTED([MATCH_LIMIT], [$with_match_limit], [
-  The value of MATCH_LIMIT determines the default number of times the
-  internal match() function can be called during a single execution of
-  pcre_exec(). There is a runtime interface for setting a different
-  limit. The limit exists in order to catch runaway regular
-  expressions that take for ever to determine that they do not match.
-  The default is set very large so that it does not accidentally catch
-  legitimate cases.])
-
-AC_DEFINE_UNQUOTED([MATCH_LIMIT_RECURSION], [$with_match_limit_recursion], [
-  The above limit applies to all calls of match(), whether or not they
-  increase the recursion depth. In some environments it is desirable
-  to limit the depth of recursive calls of match() more strictly, in
-  order to restrict the maximum amount of stack (or heap, if
-  NO_RECURSE is defined) that is used. The value of
-  MATCH_LIMIT_RECURSION applies only to recursive calls of match(). To
-  have any useful effect, it must be less than the value of
-  MATCH_LIMIT. The default is to use the same value as MATCH_LIMIT.
-  There is a runtime method for setting a different limit.])
-
-AC_DEFINE([MAX_NAME_SIZE], [32], [
-  This limit is parameterized just in case anybody ever wants to
-  change it. Care must be taken if it is increased, because it guards
-  against integer overflow caused by enormously large patterns.])
-
-AC_DEFINE([MAX_NAME_COUNT], [10000], [
-  This limit is parameterized just in case anybody ever wants to
-  change it. Care must be taken if it is increased, because it guards
-  against integer overflow caused by enormously large patterns.])
-
-AH_VERBATIM([PCRE_EXP_DEFN], [
-/* If you are compiling for a system other than a Unix-like system or
-   Win32, and it needs some magic to be inserted before the definition
-   of a function that is exported by the library, define this macro to
-   contain the relevant magic. If you do not define this macro, a suitable
-    __declspec value is used for Windows systems; in other environments
-   "extern" is used for a C compiler and "extern C" for a C++ compiler.
-   This macro apears at the start of every exported function that is part
-   of the external API. It does not appear on functions that are "external"
-   in the C sense, but which are internal to the library. */
-#undef PCRE_EXP_DEFN])
-
-if test "$enable_ebcdic" = "yes"; then
-  AC_DEFINE_UNQUOTED([EBCDIC], [], [
-    If you are compiling for a system that uses EBCDIC instead of ASCII
-    character codes, define this macro to any value. You must also edit the
-    NEWLINE macro below to set a suitable EBCDIC newline, commonly 21 (0x15).
-    On systems that can use "configure" or CMake to set EBCDIC, NEWLINE is
-    automatically adjusted. When EBCDIC is set, PCRE assumes that all input
-    strings are in EBCDIC. If you do not define this macro, PCRE will assume
-    input strings are ASCII or UTF-8/16/32 Unicode. It is not possible to build
-    a version of PCRE that supports both EBCDIC and UTF-8/16/32.])
-fi
-
-if test "$enable_ebcdic_nl25" = "yes"; then
-  AC_DEFINE_UNQUOTED([EBCDIC_NL25], [], [
-    In an EBCDIC environment, define this macro to any value to arrange for
-    the NL character to be 0x25 instead of the default 0x15. NL plays the role
-    that LF does in an ASCII/Unicode environment. The value must also be set in
-    the NEWLINE macro below. On systems that can use "configure" or CMake to
-    set EBCDIC_NL25, the adjustment of NEWLINE is automatic.])
-fi
-
-if test "$enable_valgrind" = "yes"; then
-  AC_DEFINE_UNQUOTED([SUPPORT_VALGRIND], [], [
-     Define to any value for valgrind support to find invalid memory reads.])
-fi
-
-# Platform specific issues
-NO_UNDEFINED=
-EXPORT_ALL_SYMBOLS=
-case $host_os in
-  cygwin* | mingw* )
-    if test X"$enable_shared" = Xyes; then
-      NO_UNDEFINED="-no-undefined"
-      EXPORT_ALL_SYMBOLS="-Wl,--export-all-symbols"
-    fi
-    ;;
-esac
-
-# The extra LDFLAGS for each particular library
-# (Note: The libpcre*_version bits are m4 variables, assigned above)
-
-EXTRA_LIBPCRE_LDFLAGS="$EXTRA_LIBPCRE_LDFLAGS \
-                       $NO_UNDEFINED -version-info libpcre_version"
-
-EXTRA_LIBPCRE16_LDFLAGS="$EXTRA_LIBPCRE16_LDFLAGS \
-                       $NO_UNDEFINED -version-info libpcre16_version"
-
-EXTRA_LIBPCRE32_LDFLAGS="$EXTRA_LIBPCRE32_LDFLAGS \
-                       $NO_UNDEFINED -version-info libpcre32_version"
-
-EXTRA_LIBPCREPOSIX_LDFLAGS="$EXTRA_LIBPCREPOSIX_LDFLAGS \
-                            $NO_UNDEFINED -version-info libpcreposix_version"
-
-EXTRA_LIBPCRECPP_LDFLAGS="$EXTRA_LIBPCRECPP_LDFLAGS \
-                          $NO_UNDEFINED -version-info libpcrecpp_version \
-                          $EXPORT_ALL_SYMBOLS"
-
-AC_SUBST(EXTRA_LIBPCRE_LDFLAGS)
-AC_SUBST(EXTRA_LIBPCRE16_LDFLAGS)
-AC_SUBST(EXTRA_LIBPCRE32_LDFLAGS)
-AC_SUBST(EXTRA_LIBPCREPOSIX_LDFLAGS)
-AC_SUBST(EXTRA_LIBPCRECPP_LDFLAGS)
-
-# When we run 'make distcheck', use these arguments. Turning off compiler
-# optimization makes it run faster.
-DISTCHECK_CONFIGURE_FLAGS="CFLAGS='' CXXFLAGS='' --enable-pcre16 --enable-pcre32 --enable-jit --enable-cpp --enable-unicode-properties"
-AC_SUBST(DISTCHECK_CONFIGURE_FLAGS)
-
-# Check that, if --enable-pcregrep-libz or --enable-pcregrep-libbz2 is
-# specified, the relevant library is available.
-
-if test "$enable_pcregrep_libz" = "yes"; then
-  if test "$HAVE_ZLIB_H" != "1"; then
-    echo "** Cannot --enable-pcregrep-libz because zlib.h was not found"
-    exit 1
-  fi
-  if test "$HAVE_LIBZ" != "1"; then
-    echo "** Cannot --enable-pcregrep-libz because libz was not found"
-    exit 1
-  fi
-  LIBZ="-lz"
-fi
-AC_SUBST(LIBZ)
-
-if test "$enable_pcregrep_libbz2" = "yes"; then
-  if test "$HAVE_BZLIB_H" != "1"; then
-    echo "** Cannot --enable-pcregrep-libbz2 because bzlib.h was not found"
-    exit 1
-  fi
-  if test "$HAVE_LIBBZ2" != "1"; then
-    echo "** Cannot --enable-pcregrep-libbz2 because libbz2 was not found"
-    exit 1
-  fi
-  LIBBZ2="-lbz2"
-fi
-AC_SUBST(LIBBZ2)
-
-# Similarly for --enable-pcretest-readline
-
-if test "$enable_pcretest_libedit" = "yes"; then
-  if test "$enable_pcretest_libreadline" = "yes"; then
-    echo "** Cannot use both --enable-pcretest-libedit and --enable-pcretest-readline"
-    exit 1
-  fi
-  if test "$HAVE_EDITLINE_READLINE_H" != "1" -a \
-          "$HAVE_READLINE_READLINE_H" != "1"; then
-    echo "** Cannot --enable-pcretest-libedit because neither editline/readline.h"
-    echo "** nor readline/readline.h was found."
-    exit 1
-  fi
-  if test -z "$LIBEDIT"; then
-    echo "** Cannot --enable-pcretest-libedit because libedit library was not found."
-    exit 1
-  fi
-fi
-
-if test "$enable_pcretest_libreadline" = "yes"; then
-  if test "$HAVE_READLINE_H" != "1"; then
-    echo "** Cannot --enable-pcretest-readline because readline/readline.h was not found."
-    exit 1
-  fi
-  if test "$HAVE_HISTORY_H" != "1"; then
-    echo "** Cannot --enable-pcretest-readline because readline/history.h was not found."
-    exit 1
-  fi
-  if test -z "$LIBREADLINE"; then
-    echo "** Cannot --enable-pcretest-readline because readline library was not found."
-    exit 1
-  fi
-fi
-
-# Handle valgrind support
-
-if test "$enable_valgrind" = "yes"; then
-  m4_ifdef([PKG_CHECK_MODULES],
-           [PKG_CHECK_MODULES([VALGRIND],[valgrind])],
-           [AC_MSG_ERROR([pkg-config not supported])])
-fi
-
-# Handle code coverage reporting support
-if test "$enable_coverage" = "yes"; then
-  if test "x$GCC" != "xyes"; then
-    AC_MSG_ERROR([Code coverage reports can only be generated when using GCC])
-  fi
-
-  # ccache is incompatible with gcov
-  AC_PATH_PROG([SHTOOL],[shtool],[false])
-  case `$SHTOOL path $CC` in
-    *ccache*) cc_ccache=yes;;
-    *) cc_ccache=no;;
-  esac
-
-  if test "$cc_ccache" = "yes"; then
-    if test -z "$CCACHE_DISABLE" -o "$CCACHE_DISABLE" != "1"; then
-      AC_MSG_ERROR([must export CCACHE_DISABLE=1 to disable ccache for code coverage])
-    fi
-  fi
-
-  AC_ARG_VAR([LCOV],[the ltp lcov program])
-  AC_PATH_PROG([LCOV],[lcov],[false])
-  if test "x$LCOV" = "xfalse"; then
-    AC_MSG_ERROR([lcov not found])
-  fi
-
-  AC_ARG_VAR([GENHTML],[the ltp genhtml program])
-  AC_PATH_PROG([GENHTML],[genhtml],[false])
-  if test "x$GENHTML" = "xfalse"; then
-    AC_MSG_ERROR([genhtml not found])
-  fi
-
-  # Set flags needed for gcov
-  GCOV_CFLAGS="-O0 -ggdb3 -fprofile-arcs -ftest-coverage"
-  GCOV_CXXFLAGS="-O0 -ggdb3 -fprofile-arcs -ftest-coverage"
-  GCOV_LIBS="-lgcov"
-  AC_SUBST([GCOV_CFLAGS])
-  AC_SUBST([GCOV_CXXFLAGS])
-  AC_SUBST([GCOV_LIBS])
-fi # enable_coverage
-
-AM_CONDITIONAL([WITH_GCOV],[test "x$enable_coverage" = "xyes"])
-
-# Produce these files, in addition to config.h.
-AC_CONFIG_FILES(
-	Makefile
-	libpcre.pc
-	libpcre16.pc
-	libpcre32.pc
-	libpcreposix.pc
-	libpcrecpp.pc
-	pcre-config
-	pcre.h
-	pcre_stringpiece.h
-	pcrecpparg.h
-)
-
-# Make the generated script files executable.
-AC_CONFIG_COMMANDS([script-chmod], [chmod a+x pcre-config])
-
-# Make sure that pcre_chartables.c is removed in case the method for
-# creating it was changed by reconfiguration.
-AC_CONFIG_COMMANDS([delete-old-chartables], [rm -f pcre_chartables.c])
-
-AC_OUTPUT
-
-# Print out a nice little message after configure is run displaying the
-# chosen options.
-
-ebcdic_nl_code=n/a
-if test "$enable_ebcdic_nl25" = "yes"; then
-  ebcdic_nl_code=0x25
-elif test "$enable_ebcdic" = "yes"; then
-  ebcdic_nl_code=0x15
-fi
-
-cat <<EOF
-
-$PACKAGE-$VERSION configuration summary:
-
-    Install prefix .................. : ${prefix}
-    C preprocessor .................. : ${CPP}
-    C compiler ...................... : ${CC}
-    C++ preprocessor ................ : ${CXXCPP}
-    C++ compiler .................... : ${CXX}
-    Linker .......................... : ${LD}
-    C preprocessor flags ............ : ${CPPFLAGS}
-    C compiler flags ................ : ${CFLAGS} ${VISIBILITY_CFLAGS}
-    C++ compiler flags .............. : ${CXXFLAGS} ${VISIBILITY_CXXFLAGS}
-    Linker flags .................... : ${LDFLAGS}
-    Extra libraries ................. : ${LIBS}
-
-    Build 8 bit pcre library ........ : ${enable_pcre8}
-    Build 16 bit pcre library ....... : ${enable_pcre16}
-    Build 32 bit pcre library ....... : ${enable_pcre32}
-    Build C++ library ............... : ${enable_cpp}
-    Enable JIT compiling support .... : ${enable_jit}
-    Enable UTF-8/16/32 support ...... : ${enable_utf}
-    Unicode properties .............. : ${enable_unicode_properties}
-    Newline char/sequence ........... : ${enable_newline}
-    \R matches only ANYCRLF ......... : ${enable_bsr_anycrlf}
-    EBCDIC coding ................... : ${enable_ebcdic}
-    EBCDIC code for NL .............. : ${ebcdic_nl_code}
-    Rebuild char tables ............. : ${enable_rebuild_chartables}
-    Use stack recursion ............. : ${enable_stack_for_recursion}
-    POSIX mem threshold ............. : ${with_posix_malloc_threshold}
-    Internal link size .............. : ${with_link_size}
-    Nested parentheses limit ........ : ${with_parens_nest_limit}
-    Match limit ..................... : ${with_match_limit}
-    Match limit recursion ........... : ${with_match_limit_recursion}
-    Build shared libs ............... : ${enable_shared}
-    Build static libs ............... : ${enable_static}
-    Use JIT in pcregrep ............. : ${enable_pcregrep_jit}
-    Buffer size for pcregrep ........ : ${with_pcregrep_bufsize}
-    Link pcregrep with libz ......... : ${enable_pcregrep_libz}
-    Link pcregrep with libbz2 ....... : ${enable_pcregrep_libbz2}
-    Link pcretest with libedit ...... : ${enable_pcretest_libedit}
-    Link pcretest with libreadline .. : ${enable_pcretest_libreadline}
-    Valgrind support ................ : ${enable_valgrind}
-    Code coverage ................... : ${enable_coverage}
-
-EOF
-
-dnl end configure.ac
diff --git a/dist/doc/html/NON-AUTOTOOLS-BUILD.txt b/dist/doc/html/NON-AUTOTOOLS-BUILD.txt
deleted file mode 100644
index 3910059..0000000
--- a/dist/doc/html/NON-AUTOTOOLS-BUILD.txt
+++ /dev/null
@@ -1,772 +0,0 @@
-Building PCRE without using autotools
--------------------------------------
-
-NOTE: This document relates to PCRE releases that use the original API, with
-library names libpcre, libpcre16, and libpcre32. January 2015 saw the first
-release of a new API, known as PCRE2, with release numbers starting at 10.00
-and library names libpcre2-8, libpcre2-16, and libpcre2-32. The old libraries
-(now called PCRE1) are still being maintained for bug fixes, but there will be
-no new development. New projects are advised to use the new PCRE2 libraries.
-
-
-This document contains the following sections:
-
-  General
-  Generic instructions for the PCRE C library
-  The C++ wrapper functions
-  Building for virtual Pascal
-  Stack size in Windows environments
-  Linking programs in Windows environments
-  Calling conventions in Windows environments
-  Comments about Win32 builds
-  Building PCRE on Windows with CMake
-  Use of relative paths with CMake on Windows
-  Testing with RunTest.bat
-  Building under Windows CE with Visual Studio 200x
-  Building under Windows with BCC5.5
-  Building using Borland C++ Builder 2007 (CB2007) and higher
-  Building PCRE on OpenVMS
-  Building PCRE on Stratus OpenVOS
-  Building PCRE on native z/OS and z/VM
-
-
-GENERAL
-
-I (Philip Hazel) have no experience of Windows or VMS sytems and how their
-libraries work. The items in the PCRE distribution and Makefile that relate to
-anything other than Linux systems are untested by me.
-
-There are some other comments and files (including some documentation in CHM
-format) in the Contrib directory on the FTP site:
-
-  ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/Contrib
-
-The basic PCRE library consists entirely of code written in Standard C, and so
-should compile successfully on any system that has a Standard C compiler and
-library. The C++ wrapper functions are a separate issue (see below).
-
-The PCRE distribution includes a "configure" file for use by the configure/make
-(autotools) build system, as found in many Unix-like environments. The README
-file contains information about the options for "configure".
-
-There is also support for CMake, which some users prefer, especially in Windows
-environments, though it can also be run in Unix-like environments. See the
-section entitled "Building PCRE on Windows with CMake" below.
-
-Versions of config.h and pcre.h are distributed in the PCRE tarballs under the
-names config.h.generic and pcre.h.generic. These are provided for those who
-build PCRE without using "configure" or CMake. If you use "configure" or CMake,
-the .generic versions are not used.
-
-
-GENERIC INSTRUCTIONS FOR THE PCRE C LIBRARY
-
-The following are generic instructions for building the PCRE C library "by
-hand". If you are going to use CMake, this section does not apply to you; you
-can skip ahead to the CMake section.
-
- (1) Copy or rename the file config.h.generic as config.h, and edit the macro
-     settings that it contains to whatever is appropriate for your environment.
-
-     In particular, you can alter the definition of the NEWLINE macro to
-     specify what character(s) you want to be interpreted as line terminators.
-     In an EBCDIC environment, you MUST change NEWLINE, because its default
-     value is 10, an ASCII LF. The usual EBCDIC newline character is 21 (0x15,
-     NL), though in some cases it may be 37 (0x25).
-
-     When you compile any of the PCRE modules, you must specify -DHAVE_CONFIG_H
-     to your compiler so that config.h is included in the sources.
-
-     An alternative approach is not to edit config.h, but to use -D on the
-     compiler command line to make any changes that you need to the
-     configuration options. In this case -DHAVE_CONFIG_H must not be set.
-
-     NOTE: There have been occasions when the way in which certain parameters
-     in config.h are used has changed between releases. (In the configure/make
-     world, this is handled automatically.) When upgrading to a new release,
-     you are strongly advised to review config.h.generic before re-using what
-     you had previously.
-
- (2) Copy or rename the file pcre.h.generic as pcre.h.
-
- (3) EITHER:
-       Copy or rename file pcre_chartables.c.dist as pcre_chartables.c.
-
-     OR:
-       Compile dftables.c as a stand-alone program (using -DHAVE_CONFIG_H if
-       you have set up config.h), 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. The tables are generated using the default
-       C locale for your system. If you want to use a locale that is specified
-       by LC_xxx environment variables, add the -L option to the dftables
-       command. You must use this method if you are building on a system that
-       uses EBCDIC code.
-
-     The tables in pcre_chartables.c are defaults. The caller of PCRE can
-     specify alternative tables at run time.
-
- (4) Ensure that you have the following header files:
-
-       pcre_internal.h
-       ucp.h
-
- (5) For an 8-bit library, compile the following source files, setting
-     -DHAVE_CONFIG_H as a compiler option if you have set up config.h with your
-     configuration, or else use other -D settings to change the configuration
-     as required.
-
-       pcre_byte_order.c
-       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_jit_compile.c
-       pcre_maketables.c
-       pcre_newline.c
-       pcre_ord2utf8.c
-       pcre_refcount.c
-       pcre_string_utils.c
-       pcre_study.c
-       pcre_tables.c
-       pcre_ucd.c
-       pcre_valid_utf8.c
-       pcre_version.c
-       pcre_xclass.c
-
-     Make sure that you include -I. in the compiler command (or equivalent for
-     an unusual compiler) so that all included PCRE header files are first
-     sought in the current directory. Otherwise you run the risk of picking up
-     a previously-installed file from somewhere else.
-
-     Note that you must still compile pcre_jit_compile.c, even if you have not
-     defined SUPPORT_JIT in config.h, because when JIT support is not
-     configured, dummy functions are compiled. When JIT support IS configured,
-     pcre_jit_compile.c #includes sources from the sljit subdirectory, where
-     there should be 16 files, all of whose names begin with "sljit".
-
- (6) Now link all the compiled code into an object library in whichever form
-     your system keeps such libraries. This is the basic PCRE C 8-bit library.
-     If your system has static and shared libraries, you may have to do this
-     once for each type.
-
- (7) If you want to build a 16-bit library (as well as, or instead of the 8-bit
-     or 32-bit libraries) repeat steps 5-6 with the following files:
-
-       pcre16_byte_order.c
-       pcre16_chartables.c
-       pcre16_compile.c
-       pcre16_config.c
-       pcre16_dfa_exec.c
-       pcre16_exec.c
-       pcre16_fullinfo.c
-       pcre16_get.c
-       pcre16_globals.c
-       pcre16_jit_compile.c
-       pcre16_maketables.c
-       pcre16_newline.c
-       pcre16_ord2utf16.c
-       pcre16_refcount.c
-       pcre16_string_utils.c
-       pcre16_study.c
-       pcre16_tables.c
-       pcre16_ucd.c
-       pcre16_utf16_utils.c
-       pcre16_valid_utf16.c
-       pcre16_version.c
-       pcre16_xclass.c
-
- (8) If you want to build a 32-bit library (as well as, or instead of the 8-bit
-     or 16-bit libraries) repeat steps 5-6 with the following files:
-
-       pcre32_byte_order.c
-       pcre32_chartables.c
-       pcre32_compile.c
-       pcre32_config.c
-       pcre32_dfa_exec.c
-       pcre32_exec.c
-       pcre32_fullinfo.c
-       pcre32_get.c
-       pcre32_globals.c
-       pcre32_jit_compile.c
-       pcre32_maketables.c
-       pcre32_newline.c
-       pcre32_ord2utf32.c
-       pcre32_refcount.c
-       pcre32_string_utils.c
-       pcre32_study.c
-       pcre32_tables.c
-       pcre32_ucd.c
-       pcre32_utf32_utils.c
-       pcre32_valid_utf32.c
-       pcre32_version.c
-       pcre32_xclass.c
-
- (9) If you want to build the POSIX wrapper functions (which apply only to the
-     8-bit library), ensure that you have the pcreposix.h file and then compile
-     pcreposix.c (remembering -DHAVE_CONFIG_H if necessary). Link the result
-     (on its own) as the pcreposix library.
-
-(10) The pcretest program can be linked with any combination of the 8-bit,
-     16-bit and 32-bit libraries (depending on what you selected in config.h).
-     Compile pcretest.c and pcre_printint.c (again, don't forget
-     -DHAVE_CONFIG_H) and link them together with the appropriate library/ies.
-     If you compiled an 8-bit library, pcretest also needs the pcreposix
-     wrapper library unless you compiled it with -DNOPOSIX.
-
-(11) Run pcretest on the testinput files in the testdata directory, and check
-     that the output matches the corresponding testoutput files. There are
-     comments about what each test does in the section entitled "Testing PCRE"
-     in the README file. If you compiled more than one of the 8-bit, 16-bit and
-     32-bit libraries, you need to run pcretest with the -16 option to do
-     16-bit tests and with the -32 option to do 32-bit tests.
-
-     Some tests are relevant only when certain build-time options are selected.
-     For example, test 4 is for UTF-8/UTF-16/UTF-32 support, and will not run
-     if you have built PCRE without it. See the comments at the start of each
-     testinput file. If you have a suitable Unix-like shell, the RunTest script
-     will run the appropriate tests for you. The command "RunTest list" will
-     output a list of all the tests.
-
-     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. If you are using Windows, you probably
-     should use the wintestinput3 file instead of testinput3 (and the
-     corresponding output file). This is a locale test; wintestinput3 sets the
-     locale to "french" rather than "fr_FR", and there some minor output
-     differences.
-
-(12) If you have built PCRE with SUPPORT_JIT, the JIT features will be tested
-     by the testdata files. However, you might also like to build and run
-     the freestanding JIT test program, pcre_jit_test.c.
-
-(13) If you want to use the pcregrep command, compile and link pcregrep.c; it
-     uses only the basic 8-bit PCRE library (it does not need the pcreposix
-     library).
-
-
-THE C++ WRAPPER FUNCTIONS
-
-The PCRE distribution also contains some C++ wrapper functions and tests,
-applicable to the 8-bit library, which were 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.
-
-
-BUILDING FOR VIRTUAL PASCAL
-
-A script for building PCRE using Borland's C++ compiler for use with VPASCAL
-was contributed by Alexander Tokarev. Stefan Weber updated the script and added
-additional files. The following files in the distribution are for building PCRE
-for use with VP/Borland: makevp_c.txt, makevp_l.txt, makevp.bat, pcregexp.pas.
-
-
-STACK SIZE IN WINDOWS ENVIRONMENTS
-
-The default processor stack size of 1Mb in some Windows environments is too
-small for matching patterns that need much recursion. In particular, test 2 may
-fail because of this. Normally, running out of stack causes a crash, but there
-have been cases where the test program has just died silently. See your linker
-documentation for how to increase stack size if you experience problems. The
-Linux default of 8Mb is a reasonable choice for the stack, though even that can
-be too small for some pattern/subject combinations.
-
-PCRE has a compile configuration option to disable the use of stack for
-recursion so that heap is used instead. However, pattern matching is
-significantly slower when this is done. There is more about stack usage in the
-"pcrestack" documentation.
-
-
-LINKING PROGRAMS IN WINDOWS ENVIRONMENTS
-
-If you want to statically link a program against a PCRE library in the form of
-a non-dll .a file, you must define PCRE_STATIC before including pcre.h or
-pcrecpp.h, otherwise the pcre_malloc() and pcre_free() exported functions will
-be declared __declspec(dllimport), with unwanted results.
-
-
-CALLING CONVENTIONS IN WINDOWS ENVIRONMENTS
-
-It is possible to compile programs to use different calling conventions using
-MSVC. Search the web for "calling conventions" for more information. To make it
-easier to change the calling convention for the exported functions in the
-PCRE library, the macro PCRE_CALL_CONVENTION is present in all the external
-definitions. It can be set externally when compiling (e.g. in CFLAGS). If it is
-not set, it defaults to empty; the default calling convention is then used
-(which is what is wanted most of the time).
-
-
-COMMENTS ABOUT WIN32 BUILDS (see also "BUILDING PCRE ON WINDOWS WITH CMAKE")
-
-There are two ways of building PCRE using the "configure, make, make install"
-paradigm on Windows systems: using MinGW or using Cygwin. These are not at all
-the same thing; they are completely different from each other. There is also
-support for building using CMake, which some users find a more straightforward
-way of building PCRE under Windows.
-
-The MinGW home page (http://www.mingw.org/) says this:
-
-  MinGW: A collection of freely available and freely distributable Windows
-  specific header files and import libraries combined with GNU toolsets that
-  allow one to produce native Windows programs that do not rely on any
-  3rd-party C runtime DLLs.
-
-The Cygwin home page (http://www.cygwin.com/) says this:
-
-  Cygwin is a Linux-like environment for Windows. It consists of two parts:
-
-  . A DLL (cygwin1.dll) which acts as a Linux API emulation layer providing
-    substantial Linux API functionality
-
-  . A collection of tools which provide Linux look and feel.
-
-  The Cygwin DLL currently works with all recent, commercially released x86 32
-  bit and 64 bit versions of Windows, with the exception of Windows CE.
-
-On both MinGW and Cygwin, PCRE should build correctly using:
-
-  ./configure && make && make install
-
-This should create two libraries called libpcre and libpcreposix, and, if you
-have enabled building the C++ wrapper, a third one called libpcrecpp. These are
-independent libraries: when you link with libpcreposix or libpcrecpp you must
-also link with libpcre, which contains the basic functions. (Some earlier
-releases of PCRE included the basic libpcre functions in libpcreposix. This no
-longer happens.)
-
-A user submitted a special-purpose patch that makes it easy to create
-"pcre.dll" under mingw32 using the "msys" environment. It provides "pcre.dll"
-as a special target. If you use this target, no other files are built, and in
-particular, the pcretest and pcregrep programs are not built. An example of how
-this might be used is:
-
-  ./configure --enable-utf --disable-cpp CFLAGS="-03 -s"; make pcre.dll
-
-Using Cygwin's compiler generates libraries and executables that depend on
-cygwin1.dll. If a library that is generated this way is distributed,
-cygwin1.dll has to be distributed as well. Since cygwin1.dll is under the GPL
-licence, this forces not only PCRE to be under the GPL, but also the entire
-application. A distributor who wants to keep their own code proprietary must
-purchase an appropriate Cygwin licence.
-
-MinGW has no such restrictions. The MinGW compiler generates a library or
-executable that can run standalone on Windows without any third party dll or
-licensing issues.
-
-But there is more complication:
-
-If a Cygwin user uses the -mno-cygwin Cygwin gcc flag, what that really does is
-to tell Cygwin's gcc to use the MinGW gcc. Cygwin's gcc is only acting as a
-front end to MinGW's gcc (if you install Cygwin's gcc, you get both Cygwin's
-gcc and MinGW's gcc). So, a user can:
-
-. Build native binaries by using MinGW or by getting Cygwin and using
-  -mno-cygwin.
-
-. Build binaries that depend on cygwin1.dll by using Cygwin with the normal
-  compiler flags.
-
-The test files that are supplied with PCRE are in UNIX format, with LF
-characters as line terminators. Unless your PCRE library uses a default newline
-option that includes LF as a valid newline, it may be necessary to change the
-line terminators in the test files to get some of the tests to work.
-
-
-BUILDING PCRE ON WINDOWS WITH CMAKE
-
-CMake is an alternative configuration facility that can be used instead of
-"configure". CMake creates project files (make files, solution files, etc.)
-tailored to numerous development environments, including Visual Studio,
-Borland, Msys, MinGW, NMake, and Unix. If possible, use short paths with no
-spaces in the names for your CMake installation and your PCRE source and build
-directories.
-
-The following instructions were contributed by a PCRE user. If they are not
-followed exactly, errors may occur. In the event that errors do occur, it is
-recommended that you delete the CMake cache before attempting to repeat the
-CMake build process. In the CMake GUI, the cache can be deleted by selecting
-"File > Delete Cache".
-
-1.  Install the latest CMake version available from http://www.cmake.org/, and
-    ensure that cmake\bin is on your path.
-
-2.  Unzip (retaining folder structure) the PCRE source tree into a source
-    directory such as C:\pcre. You should ensure your local date and time
-    is not earlier than the file dates in your source dir if the release is
-    very new.
-
-3.  Create a new, empty build directory, preferably a subdirectory of the
-    source dir. For example, C:\pcre\pcre-xx\build.
-
-4.  Run cmake-gui from the Shell envirornment of your build tool, for example,
-    Msys for Msys/MinGW or Visual Studio Command Prompt for VC/VC++. Do not try
-    to start Cmake from the Windows Start menu, as this can lead to errors.
-
-5.  Enter C:\pcre\pcre-xx and C:\pcre\pcre-xx\build for the source and build
-    directories, respectively.
-
-6.  Hit the "Configure" button.
-
-7.  Select the particular IDE / build tool that you are using (Visual
-    Studio, MSYS makefiles, MinGW makefiles, etc.)
-
-8.  The GUI will then list several configuration options. This is where
-    you can enable UTF-8 support or other PCRE optional features.
-
-9.  Hit "Configure" again. The adjacent "Generate" button should now be
-    active.
-
-10. Hit "Generate".
-
-11. The build directory should now contain a usable build system, be it a
-    solution file for Visual Studio, makefiles for MinGW, etc. Exit from
-    cmake-gui and use the generated build system with your compiler or IDE.
-    E.g., for MinGW you can run "make", or for Visual Studio, open the PCRE
-    solution, select the desired configuration (Debug, or Release, etc.) and
-    build the ALL_BUILD project.
-
-12. If during configuration with cmake-gui you've elected to build the test
-    programs, you can execute them by building the test project. E.g., for
-    MinGW: "make test"; for Visual Studio build the RUN_TESTS project. The
-    most recent build configuration is targeted by the tests. A summary of
-    test results is presented. Complete test output is subsequently
-    available for review in Testing\Temporary under your build dir.
-
-
-USE OF RELATIVE PATHS WITH CMAKE ON WINDOWS
-
-A PCRE user comments as follows: I thought that others may want to know the
-current state of CMAKE_USE_RELATIVE_PATHS support on Windows. Here it is:
-
--- AdditionalIncludeDirectories is only partially modified (only the
-   first path - see below)
--- Only some of the contained file paths are modified - shown below for
-   pcre.vcproj
--- It properly modifies
-
-I am sure CMake people can fix that if they want to. Until then one will
-need to replace existing absolute paths in project files with relative
-paths manually (e.g. from VS) - relative to project file location. I did
-just that before being told to try CMAKE_USE_RELATIVE_PATHS. Not a big
-deal.
-
-AdditionalIncludeDirectories="E:\builds\pcre\build;E:\builds\pcre\pcre-7.5;"
-AdditionalIncludeDirectories=".;E:\builds\pcre\pcre-7.5;"
-
-RelativePath="pcre.h"
-RelativePath="pcre_chartables.c"
-RelativePath="pcre_chartables.c.rule"
-
-
-TESTING WITH RUNTEST.BAT
-
-If configured with CMake, building the test project ("make test" or building
-ALL_TESTS in Visual Studio) creates (and runs) pcre_test.bat (and depending
-on your configuration options, possibly other test programs) in the build
-directory. Pcre_test.bat runs RunTest.Bat with correct source and exe paths.
-
-For manual testing with RunTest.bat, provided the build dir is a subdirectory
-of the source directory: Open command shell window. Chdir to the location
-of your pcretest.exe and pcregrep.exe programs. Call RunTest.bat with
-"..\RunTest.Bat" or "..\..\RunTest.bat" as appropriate.
-
-To run only a particular test with RunTest.Bat provide a test number argument.
-
-Otherwise:
-
-1. Copy RunTest.bat into the directory where pcretest.exe and pcregrep.exe
-   have been created.
-
-2. Edit RunTest.bat to indentify the full or relative location of
-   the pcre source (wherein which the testdata folder resides), e.g.:
-
-   set srcdir=C:\pcre\pcre-8.20
-
-3. In a Windows command environment, chdir to the location of your bat and
-   exe programs.
-
-4. Run RunTest.bat. Test outputs will automatically be compared to expected
-   results, and discrepancies will be identified in the console output.
-
-To independently test the just-in-time compiler, run pcre_jit_test.exe.
-To test pcrecpp, run pcrecpp_unittest.exe, pcre_stringpiece_unittest.exe and
-pcre_scanner_unittest.exe.
-
-
-BUILDING UNDER WINDOWS CE WITH VISUAL STUDIO 200x
-
-Vincent Richomme sent a zip archive of files to help with this process. They
-can be found in the file "pcre-vsbuild.zip" in the Contrib directory of the FTP
-site.
-
-
-BUILDING UNDER WINDOWS WITH BCC5.5
-
-Michael Roy sent these comments about building PCRE under Windows with BCC5.5:
-
-Some of the core BCC libraries have a version of PCRE from 1998 built in, which
-can lead to pcre_exec() giving an erroneous PCRE_ERROR_NULL from a version
-mismatch. I'm including an easy workaround below, if you'd like to include it
-in the non-unix instructions:
-
-When linking a project with BCC5.5, pcre.lib must be included before any of the
-libraries cw32.lib, cw32i.lib, cw32mt.lib, and cw32mti.lib on the command line.
-
-
-BUILDING USING BORLAND C++ BUILDER 2007 (CB2007) AND HIGHER
-
-A PCRE user sent these comments about this environment (see also the comment
-from another user that follows them):
-
-The XE versions of C++ Builder come with a RegularExpressionsCore class which
-contain a version of TPerlRegEx. However, direct use of the C PCRE library may
-be desirable.
-
-The default makevp.bat, however, supplied with PCRE builds a version of PCRE
-that is not usable with any version of C++ Builder because the compiler ships
-with an embedded version of PCRE, version 2.01 from 1998! [See also the note
-about BCC5.5 above.] If you want to use PCRE you'll need to rename the
-functions (pcre_compile to pcre_compile_bcc, etc) or do as I have done and just
-use the 16 bit versions. I'm using std::wstring everywhere anyway. Since the
-embedded version of PCRE does not have the 16 bit function names, there is no
-conflict.
-
-Building PCRE using a C++ Builder static library project file (recommended):
-
-1. Rename or remove pcre.h, pcreposi.h, and pcreposix.h from your C++ Builder
-original include path.
-
-2. Download PCRE from pcre.org and extract to a directory.
-
-3. Rename pcre_chartables.c.dist to pcre_chartables.c, pcre.h.generic to
-pcre.h, and config.h.generic to config.h.
-
-4. Edit pcre.h and pcre_config.c so that they include config.h.
-
-5. Edit config.h like so:
-
-Comment out the following lines:
-#define PACKAGE "pcre"
-#define PACKAGE_BUGREPORT ""
-#define PACKAGE_NAME "PCRE"
-#define PACKAGE_STRING "PCRE 8.32"
-#define PACKAGE_TARNAME "pcre"
-#define PACKAGE_URL ""
-#define PACKAGE_VERSION "8.32"
-
-Add the following lines:
-#ifndef SUPPORT_UTF
-#define SUPPORT_UTF 100 // any value is fine
-#endif
-
-#ifndef SUPPORT_UCP
-#define SUPPORT_UCP 101 // any value is fine
-#endif
-
-#ifndef SUPPORT_UCP
-#define SUPPORT_PCRE16 102 // any value is fine
-#endif
-
-#ifndef SUPPORT_UTF8
-#define SUPPORT_UTF8 103 // any value is fine
-#endif
-
-6. Build a C++ Builder project using the IDE. Go to File / New / Other and
-choose Static Library. You can name it pcre.cbproj or whatever. Now set your
-paths by going to Project / Options. Set the Include path. Do this from the
-"Base" option to apply to both Release and Debug builds. Now add the following
-files to the project:
-
-pcre.h
-pcre16_byte_order.c
-pcre16_chartables.c
-pcre16_compile.c
-pcre16_config.c
-pcre16_dfa_exec.c
-pcre16_exec.c
-pcre16_fullinfo.c
-pcre16_get.c
-pcre16_globals.c
-pcre16_maketables.c
-pcre16_newline.c
-pcre16_ord2utf16.c
-pcre16_printint.c
-pcre16_refcount.c
-pcre16_string_utils.c
-pcre16_study.c
-pcre16_tables.c
-pcre16_ucd.c
-pcre16_utf16_utils.c
-pcre16_valid_utf16.c
-pcre16_version.c
-pcre16_xclass.c
-
-//Optional
-pcre_version.c
-
-7. After compiling the .lib file, copy the .lib and header files to a project
-you want to use PCRE with. Enjoy.
-
-Optional ... Building PCRE using the makevp.bat file:
-
-1. Edit makevp_c.txt and makevp_l.txt and change all the names to the 16 bit
-versions.
-
-2. Edit makevp.bat and set the path to C++ Builder. Run makevp.bat.
-
-Another PCRE user added this comment:
-
-Another approach I successfully used for some years with BCB 5 and 6 was to
-make sure that include and library paths of PCRE are configured before the
-default paths of the IDE in the dialogs where one can manage those paths.
-Afterwards one can open the project files using a text editor and manually add
-the self created library for pcre itself, pcrecpp doesn't ship with the IDE, in
-the library nodes where the IDE manages its own libraries to link against in
-front of the IDE-own libraries. This way one can use the default PCRE function
-names without getting access violations on runtime.
-
-  <ALLLIB value="libpcre.lib $(LIBFILES) $(LIBRARIES) import32.lib cp32mt.lib"/>
-
-
-BUILDING PCRE ON OPENVMS
-
-Stephen Hoffman sent the following, in December 2012:
-
-"Here <http://labs.hoffmanlabs.com/node/1847> is a very short write-up on the
-OpenVMS port and here
-
-<http://labs.hoffmanlabs.com/labsnotes/pcre-vms-8_32.zip>
-
-is a zip with the OpenVMS files, and with one modified testing-related PCRE
-file." This is a port of PCRE 8.32.
-
-Earlier, 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
-$!
-=========================
-
-
-BUILDING PCRE ON STRATUS OPENVOS
-
-These notes on the port of PCRE to VOS (lightly edited) were supplied by
-Ashutosh Warikoo, whose email address has the local part awarikoo and the
-domain nse.co.in. The port was for version 7.9 in August 2009.
-
-1.   Building PCRE
-
-I built pcre on OpenVOS Release 17.0.1at using GNU Tools 3.4a without any
-problems. I used the following packages to build PCRE:
-
-  ftp://ftp.stratus.com/pub/vos/posix/ga/posix.save.evf.gz
-
-Please read and follow the instructions that come with these packages. To start
-the build of pcre, from the root of the package type:
-
-  ./build.sh
-
-2. Installing PCRE
-
-Once you have successfully built PCRE, login to the SysAdmin group, switch to
-the root user, and type
-
-  [ !create_dir (master_disk)>usr   --if needed ]
-  [ !create_dir (master_disk)>usr>local   --if needed ]
-    !gmake install
-
-This installs PCRE and its man pages into /usr/local. You can add
-(master_disk)>usr>local>bin to your command search paths, or if you are in
-BASH, add /usr/local/bin to the PATH environment variable.
-
-4. Restrictions
-
-This port requires readline library optionally. However during the build I
-faced some yet unexplored errors while linking with readline. As it was an
-optional component I chose to disable it.
-
-5. Known Problems
-
-I ran the test suite, but you will have to be your own judge of whether this
-command, and this port, suits your purposes. If you find any problems that
-appear to be related to the port itself, please let me know. Please see the
-build.log file in the root of the package also.
-
-
-BUILDING PCRE ON NATIVE Z/OS AND Z/VM
-
-z/OS and z/VM are operating systems for mainframe computers, produced by IBM.
-The character code used is EBCDIC, not ASCII or Unicode. In z/OS, UNIX APIs and
-applications can be supported through UNIX System Services, and in such an
-environment PCRE can be built in the same way as in other systems. However, in
-native z/OS (without UNIX System Services) and in z/VM, special ports are
-required. For details, please see this web site:
-
-  http://www.zaconsultants.net
-
-You may download PCRE from WWW.CBTTAPE.ORG, file 882.  Everything, source and
-executable, is in EBCDIC and native z/OS file formats and this is the
-recommended download site.
-
-==========================
-Last Updated: 25 June 2015
diff --git a/dist/doc/html/README.txt b/dist/doc/html/README.txt
deleted file mode 100644
index 4887ebf..0000000
--- a/dist/doc/html/README.txt
+++ /dev/null
@@ -1,1002 +0,0 @@
-README file for PCRE (Perl-compatible regular expression library)
------------------------------------------------------------------
-
-NOTE: This set of files relates to PCRE releases that use the original API,
-with library names libpcre, libpcre16, and libpcre32. January 2015 saw the
-first release of a new API, known as PCRE2, with release numbers starting at
-10.00 and library names libpcre2-8, libpcre2-16, and libpcre2-32. The old
-libraries (now called PCRE1) are still being maintained for bug fixes, but
-there will be no new development. New projects are advised to use the new PCRE2
-libraries.
-
-
-The latest release of PCRE1 is always available in three alternative formats
-from:
-
-  ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-xxx.tar.gz
-  ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-xxx.tar.bz2
-  ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-xxx.zip
-
-There is a mailing list for discussion about the development of PCRE at
-pcre-dev@exim.org. You can access the archives and subscribe or manage your
-subscription here:
-
-   https://lists.exim.org/mailman/listinfo/pcre-dev
-
-Please read the NEWS file if you are upgrading from a previous release.
-The contents of this README file are:
-
-  The PCRE APIs
-  Documentation for PCRE
-  Contributions by users of PCRE
-  Building PCRE on non-Unix-like systems
-  Building PCRE without using autotools
-  Building PCRE using autotools
-  Retrieving configuration information
-  Shared libraries
-  Cross-compiling using autotools
-  Using HP's ANSI C++ compiler (aCC)
-  Compiling in Tru64 using native compilers
-  Using Sun's compilers for Solaris
-  Using PCRE from MySQL
-  Making new tarballs
-  Testing PCRE
-  Character tables
-  File manifest
-
-
-The PCRE APIs
--------------
-
-PCRE is written in C, and it has its own API. There are three sets of
-functions, one for the 8-bit library, which processes strings of bytes, one for
-the 16-bit library, which processes strings of 16-bit values, and one for the
-32-bit library, which processes strings of 32-bit values. The distribution also
-includes a set of C++ wrapper functions (see the pcrecpp man page for details),
-courtesy of Google Inc., which can be used to call the 8-bit PCRE library from
-C++. Other C++ wrappers have been created from time to time. See, for example:
-https://github.com/YasserAsmi/regexp, which aims to be simple and similar in
-style to the C API.
-
-The distribution also contains a set of C wrapper functions (again, just for
-the 8-bit library) that are based on the POSIX regular expression API (see the
-pcreposix man page). 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 POSIX API is restricted,
-and does not give full access to all of PCRE's facilities.
-
-The header file for the POSIX-style functions is called pcreposix.h. The
-official POSIX name is regex.h, but I did not want to risk possible problems
-with existing files of that name by distributing it that way. To use PCRE with
-an existing program that uses the POSIX API, pcreposix.h 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, as well as worrying about the regex.h header
-file (as mentioned above), you must also take care when linking programs to
-ensure that they link with PCRE's libpcreposix library. Otherwise they may pick
-up the POSIX functions of the same name from the other library.
-
-One way of avoiding this confusion is to compile PCRE with the addition of
--Dregcomp=PCREregcomp (and similarly for the other POSIX functions) to the
-compiler flags (CFLAGS if you are using "configure" -- see below). This has the
-effect of renaming the functions so that the names no longer clash. Of course,
-you have to do the same thing for your applications, or write them using the
-new names.
-
-
-Documentation for PCRE
-----------------------
-
-If you install PCRE in the normal way on a Unix-like system, you will end up
-with a set of man pages whose names all start with "pcre". The one that is just
-called "pcre" lists all the others. In addition to these man pages, the PCRE
-documentation is supplied in two other forms:
-
-  1. There are files called doc/pcre.txt, doc/pcregrep.txt, and
-     doc/pcretest.txt in the source distribution. The first of these is a
-     concatenation of the text forms of all the section 3 man pages except
-     the listing of pcredemo.c and those that summarize individual functions.
-     The other two are the text forms of the section 1 man pages for the
-     pcregrep and pcretest commands. These text forms are provided for ease of
-     scanning with text editors or similar tools. They are installed in
-     <prefix>/share/doc/pcre, where <prefix> is the installation prefix
-     (defaulting to /usr/local).
-
-  2. A set of files containing all the documentation in HTML form, hyperlinked
-     in various ways, and rooted in a file called index.html, is distributed in
-     doc/html and installed in <prefix>/share/doc/pcre/html.
-
-Users of PCRE have contributed files containing the documentation for various
-releases in CHM format. These can be found in the Contrib directory of the FTP
-site (see next section).
-
-
-Contributions by users of PCRE
-------------------------------
-
-You can find contributions from PCRE users in the directory
-
-  ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/Contrib
-
-There is a README file giving brief descriptions of what they are. Some are
-complete in themselves; others are pointers to URLs containing relevant files.
-Some of this material is likely to be well out-of-date. Several of the earlier
-contributions provided support for compiling PCRE on various flavours of
-Windows (I myself do not use Windows). Nowadays there is more Windows support
-in the standard distribution, so these contibutions have been archived.
-
-A PCRE user maintains downloadable Windows binaries of the pcregrep and
-pcretest programs here:
-
-  http://www.rexegg.com/pcregrep-pcretest.html
-
-
-Building PCRE on non-Unix-like systems
---------------------------------------
-
-For a non-Unix-like system, please read the comments in the file
-NON-AUTOTOOLS-BUILD, though if your system supports the use of "configure" and
-"make" you may be able to build PCRE using autotools in the same way as for
-many Unix-like systems.
-
-PCRE can also be configured using the GUI facility provided by CMake's
-cmake-gui command. This creates Makefiles, solution files, etc. The file
-NON-AUTOTOOLS-BUILD has information about CMake.
-
-PCRE has been compiled on many different operating systems. It should be
-straightforward to build PCRE on any system that has a Standard C compiler and
-library, because it uses only Standard C functions.
-
-
-Building PCRE without using autotools
--------------------------------------
-
-The use of autotools (in particular, libtool) is problematic in some
-environments, even some that are Unix or Unix-like. See the NON-AUTOTOOLS-BUILD
-file for ways of building PCRE without using autotools.
-
-
-Building PCRE using autotools
------------------------------
-
-If you are using HP's ANSI C++ compiler (aCC), please see the special note
-in the section entitled "Using HP's ANSI C++ compiler (aCC)" below.
-
-The following instructions assume the use of the widely used "configure; make;
-make install" (autotools) process.
-
-To build PCRE on system that supports autotools, first run the "configure"
-command from the PCRE distribution directory, with your current directory set
-to the directory where you want the files to be created. This command is a
-standard GNU "autoconf" configuration script, for which generic instructions
-are supplied in the file INSTALL.
-
-Most commonly, people build PCRE within its own distribution directory, and in
-this case, on many systems, just running "./configure" is sufficient. However,
-the usual methods of changing standard defaults are available. For example:
-
-CFLAGS='-O2 -Wall' ./configure --prefix=/opt/local
-
-This command specifies that the C compiler should be run with the flags '-O2
--Wall' instead of the default, and that "make install" should install PCRE
-under /opt/local instead of the default /usr/local.
-
-If you want to build in a different directory, just run "configure" with that
-directory as current. For example, suppose you have unpacked the PCRE source
-into /source/pcre/pcre-xxx, but you want to build it in /build/pcre/pcre-xxx:
-
-cd /build/pcre/pcre-xxx
-/source/pcre/pcre-xxx/configure
-
-PCRE is written in C and is normally compiled as a C library. However, it is
-possible to build it as a C++ library, though the provided building apparatus
-does not have any features to support this.
-
-There are some optional features that can be included or omitted from the PCRE
-library. They are also documented in the pcrebuild man page.
-
-. By default, both shared and static libraries are built. You can change this
-  by adding one of these options to the "configure" command:
-
-  --disable-shared
-  --disable-static
-
-  (See also "Shared libraries on Unix-like systems" below.)
-
-. By default, only the 8-bit library is built. If you add --enable-pcre16 to
-  the "configure" command, the 16-bit library is also built. If you add
-  --enable-pcre32 to the "configure" command, the 32-bit library is also built.
-  If you want only the 16-bit or 32-bit library, use --disable-pcre8 to disable
-  building the 8-bit library.
-
-. If you are building the 8-bit library and want to suppress the building of
-  the C++ wrapper library, you can add --disable-cpp to the "configure"
-  command. Otherwise, when "configure" is run without --disable-pcre8, it 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 include support for just-in-time compiling, which can give
-  large performance improvements on certain platforms, add --enable-jit to the
-  "configure" command. This support is available only for certain hardware
-  architectures. If you try to enable it on an unsupported architecture, there
-  will be a compile time error.
-
-. When JIT support is enabled, pcregrep automatically makes use of it, unless
-  you add --disable-pcregrep-jit to the "configure" command.
-
-. If you want to make use of the support for UTF-8 Unicode character strings in
-  the 8-bit library, or UTF-16 Unicode character strings in the 16-bit library,
-  or UTF-32 Unicode character strings in the 32-bit library, you must add
-  --enable-utf to the "configure" command. Without it, the code for handling
-  UTF-8, UTF-16 and UTF-8 is not included in the relevant library. Even
-  when --enable-utf is included, the use of a UTF encoding still has to be
-  enabled by an option at run time. When PCRE is compiled with this option, its
-  input can only either be ASCII or UTF-8/16/32, even when running on EBCDIC
-  platforms. It is not possible to use both --enable-utf and --enable-ebcdic at
-  the same time.
-
-. There are no separate options for enabling UTF-8, UTF-16 and UTF-32
-  independently because that would allow ridiculous settings such as requesting
-  UTF-16 support while building only the 8-bit library. However, the option
-  --enable-utf8 is retained for backwards compatibility with earlier releases
-  that did not support 16-bit or 32-bit character strings. It is synonymous with
-  --enable-utf. It is not possible to configure one library with UTF support
-  and the other without in the same configuration.
-
-. If, in addition to support for UTF-8/16/32 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 30K 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 recognize either CR or LF or the sequence CRLF or any
-  of the preceding, or any of the Unicode newline sequences as indicating the
-  end of a line. Whatever you specify at build time is the default; the caller
-  of PCRE can change the selection at run time. The default newline indicator
-  is a single LF character (the Unix standard). You can specify the default
-  newline indicator by adding --enable-newline-is-cr or --enable-newline-is-lf
-  or --enable-newline-is-crlf or --enable-newline-is-anycrlf or
-  --enable-newline-is-any to the "configure" command, respectively.
-
-  If you specify --enable-newline-is-cr or --enable-newline-is-crlf, some of
-  the standard tests will fail, because the lines in the test files end with
-  LF. Even if the files are edited to change the line endings, there are likely
-  to be some failures. With --enable-newline-is-anycrlf or
-  --enable-newline-is-any, many tests should succeed, but there may be some
-  failures.
-
-. By default, the sequence \R in a pattern matches any Unicode line ending
-  sequence. This is independent of the option specifying what PCRE considers to
-  be the end of a line (see above). However, the caller of PCRE can restrict \R
-  to match only CR, LF, or CRLF. You can make this the default by adding
-  --enable-bsr-anycrlf to the "configure" command (bsr = "backslash R").
-
-. When called via the POSIX interface, PCRE uses malloc() to get additional
-  storage for processing capturing parentheses if there are more than 10 of
-  them in a pattern. You can increase this threshold by setting, for example,
-
-  --with-posix-malloc-threshold=20
-
-  on the "configure" command.
-
-. PCRE has a counter that limits the depth of nesting of parentheses in a
-  pattern. This limits the amount of system stack that a pattern uses when it
-  is compiled. The default is 250, but you can change it by setting, for
-  example,
-
-  --with-parens-nest-limit=500
-
-. PCRE has a counter that can be set to limit the amount of resources it uses
-  when matching a pattern. 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,
-
-  --with-match-limit=500000
-
-  on the "configure" command. This is just the default; individual calls to
-  pcre_exec() can supply their own value. There is more discussion on the
-  pcreapi man page.
-
-. There is a separate counter that limits the depth of recursive function calls
-  during a matching process. This also has a default of ten million, which is
-  essentially "unlimited". You can change the default by setting, for example,
-
-  --with-match-limit-recursion=500000
-
-  Recursive function calls use up the runtime stack; running out of stack can
-  cause programs to crash in strange ways. There is a discussion about stack
-  sizes in the pcrestack man page.
-
-. The default maximum compiled pattern size is around 64K. You can increase
-  this by adding --with-link-size=3 to the "configure" command. In the 8-bit
-  library, PCRE then uses three bytes instead of two for offsets to different
-  parts of the compiled pattern. In the 16-bit library, --with-link-size=3 is
-  the same as --with-link-size=4, which (in both libraries) uses four-byte
-  offsets. Increasing the internal link size reduces performance. In the 32-bit
-  library, the only supported link size is 4.
-
-. You can build PCRE so that its internal match() function that is called from
-  pcre_exec() does not call itself recursively. Instead, it uses memory blocks
-  obtained from the heap via the 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
-  normal execution of the pcre_exec() function; if JIT support is being
-  successfully used, it is not relevant. Equally, it does not apply to
-  pcre_dfa_exec(), which does not use deeply nested recursion. There is a
-  discussion about stack sizes in the pcrestack man page.
-
-. For speed, PCRE uses four tables for manipulating and identifying characters
-  whose code point values are less than 256. By default, it uses a set of
-  tables for ASCII encoding that is part of the distribution. If you specify
-
-  --enable-rebuild-chartables
-
-  a program called dftables is compiled and run in the default C locale when
-  you obey "make". It builds a source file called pcre_chartables.c. If you do
-  not specify this option, pcre_chartables.c is created as a copy of
-  pcre_chartables.c.dist. See "Character tables" below for further information.
-
-. It is possible to compile PCRE for use on systems that use EBCDIC as their
-  character code (as opposed to ASCII/Unicode) by specifying
-
-  --enable-ebcdic
-
-  This automatically implies --enable-rebuild-chartables (see above). However,
-  when PCRE is built this way, it always operates in EBCDIC. It cannot support
-  both EBCDIC and UTF-8/16/32. There is a second option, --enable-ebcdic-nl25,
-  which specifies that the code value for the EBCDIC NL character is 0x25
-  instead of the default 0x15.
-
-. In environments where valgrind is installed, if you specify
-
-  --enable-valgrind
-
-  PCRE will use valgrind annotations to mark certain memory regions as
-  unaddressable. This allows it to detect invalid memory accesses, and is
-  mostly useful for debugging PCRE itself.
-
-. In environments where the gcc compiler is used and lcov version 1.6 or above
-  is installed, if you specify
-
-  --enable-coverage
-
-  the build process implements a code coverage report for the test suite. The
-  report is generated by running "make coverage". If ccache is installed on
-  your system, it must be disabled when building PCRE for coverage reporting.
-  You can do this by setting the environment variable CCACHE_DISABLE=1 before
-  running "make" to build PCRE. There is more information about coverage
-  reporting in the "pcrebuild" documentation.
-
-. The pcregrep program currently supports only 8-bit data files, and so
-  requires the 8-bit PCRE library. It is possible to compile pcregrep to use
-  libz and/or libbz2, in order to read .gz and .bz2 files (respectively), by
-  specifying one or both of
-
-  --enable-pcregrep-libz
-  --enable-pcregrep-libbz2
-
-  Of course, the relevant libraries must be installed on your system.
-
-. The default size (in bytes) of the internal buffer used by pcregrep can be
-  set by, for example:
-
-  --with-pcregrep-bufsize=51200
-
-  The value must be a plain integer. The default is 20480.
-
-. It is possible to compile pcretest so that it links with the libreadline
-  or libedit libraries, by specifying, respectively,
-
-  --enable-pcretest-libreadline or --enable-pcretest-libedit
-
-  If this is done, when pcretest's input is from a terminal, it reads it using
-  the readline() function. This provides line-editing and history facilities.
-  Note that libreadline is GPL-licenced, so if you distribute a binary of
-  pcretest linked in this way, there may be licensing issues. These can be
-  avoided by linking with libedit (which has a BSD licence) instead.
-
-  Enabling libreadline causes the -lreadline option to be added to the pcretest
-  build. In many operating environments with a sytem-installed readline
-  library this is sufficient. However, in some environments (e.g. if an
-  unmodified distribution version of readline is in use), it may be necessary
-  to specify something like LIBS="-lncurses" as well. This is because, to quote
-  the readline INSTALL, "Readline uses the termcap functions, but does not link
-  with the termcap or curses library itself, allowing applications which link
-  with readline the to choose an appropriate library." If you get error
-  messages about missing functions tgetstr, tgetent, tputs, tgetflag, or tgoto,
-  this is the problem, and linking with the ncurses library should fix it.
-
-The "configure" script builds the following files for the basic C library:
-
-. Makefile             the makefile that builds the library
-. config.h             build-time configuration options for the library
-. pcre.h               the public PCRE header file
-. pcre-config          script that shows the building settings such as CFLAGS
-                         that were set for "configure"
-. libpcre.pc         ) data for the pkg-config command
-. libpcre16.pc       )
-. libpcre32.pc       )
-. libpcreposix.pc    )
-. libtool              script that builds shared and/or static libraries
-
-Versions of config.h and pcre.h are distributed in the PCRE tarballs under the
-names config.h.generic and pcre.h.generic. These are provided for those who
-have to built PCRE without using "configure" or CMake. If you use "configure"
-or CMake, the .generic versions are not used.
-
-When building the 8-bit library, if a C++ compiler is found, the following
-files are also built:
-
-. libpcrecpp.pc        data for the pkg-config command
-. pcrecpparg.h         header file for calling PCRE via the C++ wrapper
-. pcre_stringpiece.h   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". This builds the the libraries
-libpcre, libpcre16 and/or libpcre32, and a test program called pcretest. If you
-enabled JIT support with --enable-jit, a test program called pcre_jit_test is
-built as well.
-
-If the 8-bit library is built, libpcreposix and the pcregrep command are also
-built, and if a C++ compiler was found on your system, and you did not disable
-it with --disable-cpp, "make" builds the C++ wrapper library, which is called
-libpcrecpp, as well as some test programs called pcrecpp_unittest,
-pcre_scanner_unittest, and pcre_stringpiece_unittest.
-
-The command "make check" runs all the appropriate tests. Details of the PCRE
-tests are given below in a separate section of this document.
-
-You can use "make install" to install PCRE into live directories on your
-system. The following are installed (file names are all relative to the
-<prefix> that is set when "configure" is run):
-
-  Commands (bin):
-    pcretest
-    pcregrep (if 8-bit support is enabled)
-    pcre-config
-
-  Libraries (lib):
-    libpcre16     (if 16-bit support is enabled)
-    libpcre32     (if 32-bit support is enabled)
-    libpcre       (if 8-bit support is enabled)
-    libpcreposix  (if 8-bit support is enabled)
-    libpcrecpp    (if 8-bit and C++ support is enabled)
-
-  Configuration information (lib/pkgconfig):
-    libpcre16.pc
-    libpcre32.pc
-    libpcre.pc
-    libpcreposix.pc
-    libpcrecpp.pc (if C++ support is enabled)
-
-  Header files (include):
-    pcre.h
-    pcreposix.h
-    pcre_scanner.h      )
-    pcre_stringpiece.h  ) if C++ support is enabled
-    pcrecpp.h           )
-    pcrecpparg.h        )
-
-  Man pages (share/man/man{1,3}):
-    pcregrep.1
-    pcretest.1
-    pcre-config.1
-    pcre.3
-    pcre*.3 (lots more pages, all starting "pcre")
-
-  HTML documentation (share/doc/pcre/html):
-    index.html
-    *.html (lots more pages, hyperlinked from index.html)
-
-  Text file documentation (share/doc/pcre):
-    AUTHORS
-    COPYING
-    ChangeLog
-    LICENCE
-    NEWS
-    README
-    pcre.txt         (a concatenation of the man(3) pages)
-    pcretest.txt     the pcretest man page
-    pcregrep.txt     the pcregrep man page
-    pcre-config.txt  the pcre-config man page
-
-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
-------------------------------------
-
-Running "make install" installs the command pcre-config, which can be used to
-recall information about the PCRE configuration and installation. For example:
-
-  pcre-config --version
-
-prints the version number, and
-
-  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:
-
-  pkg-config --cflags pcre
-
-The data is held in *.pc files that are installed in a directory called
-<prefix>/lib/pkgconfig.
-
-
-Shared libraries
-----------------
-
-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
-libraries. They are placed in a subdirectory called .libs when they are newly
-built. The programs pcretest and pcregrep are built to use these uninstalled
-libraries (by means of wrapper scripts in the case of shared libraries). When
-you use "make install" to install shared libraries, pcregrep and pcretest are
-automatically re-built to use the newly installed shared libraries before being
-installed themselves. However, the versions left in the build directory still
-use the uninstalled libraries.
-
-To build PCRE using static libraries only you must use --disable-shared when
-configuring it. For example:
-
-./configure --prefix=/usr/gnu --disable-shared
-
-Then run "make" in the usual way. Similarly, you can use --disable-static to
-build only shared libraries.
-
-
-Cross-compiling using autotools
--------------------------------
-
-You can specify CC and CFLAGS in the normal way to the "configure" command, in
-order to cross-compile PCRE for some other host. However, you should NOT
-specify --enable-rebuild-chartables, because if you do, the dftables.c source
-file is compiled and run on the local host, in order to generate the inbuilt
-character tables (the pcre_chartables.c file). This will probably not work,
-because dftables.c needs to be compiled with the local compiler, not the cross
-compiler.
-
-When --enable-rebuild-chartables is not specified, pcre_chartables.c is created
-by making a copy of pcre_chartables.c.dist, which is a default set of tables
-that assumes ASCII code. Cross-compiling with the default tables should not be
-a problem.
-
-If you need to modify the character tables when cross-compiling, you should
-move pcre_chartables.c.dist out of the way, then compile dftables.c by hand and
-run it on the local host to make a new version of pcre_chartables.c.dist.
-Then when you cross-compile PCRE this new version of the tables will be used.
-
-
-Using HP's ANSI C++ compiler (aCC)
-----------------------------------
-
-Unless C++ support is disabled by specifying the "--disable-cpp" option of the
-"configure" script, you must include the "-AA" option in the CXXFLAGS
-environment variable in order for the C++ components to compile correctly.
-
-Also, note that the aCC compiler on PA-RISC platforms may have a defect whereby
-needed libraries fail to get included when specifying the "-AA" compiler
-option. If you experience unresolved symbols when linking the C++ programs,
-use the workaround of specifying the following environment variable prior to
-running the "configure" script:
-
-  CXXLDFLAGS="-lstd_v2 -lCsup_v2"
-
-
-Compiling in Tru64 using native compilers
------------------------------------------
-
-The following error may occur when compiling with native compilers in the Tru64
-operating system:
-
-  CXX    libpcrecpp_la-pcrecpp.lo
-cxx: Error: /usr/lib/cmplrs/cxx/V7.1-006/include/cxx/iosfwd, line 58: #error
-          directive: "cannot include iosfwd -- define __USE_STD_IOSTREAM to
-          override default - see section 7.1.2 of the C++ Using Guide"
-#error "cannot include iosfwd -- define __USE_STD_IOSTREAM to override default
-- see section 7.1.2 of the C++ Using Guide"
-
-This may be followed by other errors, complaining that 'namespace "std" has no
-member'. The solution to this is to add the line
-
-#define __USE_STD_IOSTREAM 1
-
-to the config.h file.
-
-
-Using Sun's compilers for Solaris
----------------------------------
-
-A user reports that the following configurations work on Solaris 9 sparcv9 and
-Solaris 9 x86 (32-bit):
-
-  Solaris 9 sparcv9: ./configure --disable-cpp CC=/bin/cc CFLAGS="-m64 -g"
-  Solaris 9 x86:     ./configure --disable-cpp CC=/bin/cc CFLAGS="-g"
-
-
-Using PCRE from MySQL
----------------------
-
-On systems where both PCRE and MySQL are installed, it is possible to make use
-of PCRE from within MySQL, as an alternative to the built-in pattern matching.
-There is a web page that tells you how to do this:
-
-  http://www.mysqludf.org/lib_mysqludf_preg/index.php
-
-
-Making new tarballs
--------------------
-
-The command "make dist" creates three PCRE tarballs, in tar.gz, tar.bz2, and
-zip formats. The command "make distcheck" does the same, but then does a trial
-build of the new distribution to ensure that it works.
-
-If you have modified any of the man page sources in the doc directory, you
-should first run the PrepareRelease script before making a distribution. This
-script creates the .txt and HTML forms of the documentation from the man pages.
-
-
-Testing PCRE
-------------
-
-To test the basic PCRE library on a Unix-like system, run the RunTest script.
-There is another script called RunGrepTest that tests the options of the
-pcregrep command. If the C++ wrapper library is built, three test programs
-called pcrecpp_unittest, pcre_scanner_unittest, and pcre_stringpiece_unittest
-are also built. When JIT support is enabled, another test program called
-pcre_jit_test is built.
-
-Both the scripts and all the program tests are run if you obey "make check" or
-"make test". For other environments, see the instructions in
-NON-AUTOTOOLS-BUILD.
-
-The RunTest script runs the pcretest test program (which is documented in its
-own man page) on each of the relevant testinput files in the testdata
-directory, and compares the output with the contents of the corresponding
-testoutput files. RunTest uses a file called testtry to hold the main output
-from pcretest. Other files whose names begin with "test" are used as working
-files in some tests.
-
-Some tests are relevant only when certain build-time options were selected. For
-example, the tests for UTF-8/16/32 support are run only if --enable-utf was
-used. RunTest outputs a comment when it skips a test.
-
-Many of the tests that are not skipped are run up to three times. The second
-run forces pcre_study() to be called for all patterns except for a few in some
-tests that are marked "never study" (see the pcretest program for how this is
-done). If JIT support is available, the non-DFA tests are run a third time,
-this time with a forced pcre_study() with the PCRE_STUDY_JIT_COMPILE option.
-This testing can be suppressed by putting "nojit" on the RunTest command line.
-
-The entire set of tests is run once for each of the 8-bit, 16-bit and 32-bit
-libraries that are enabled. If you want to run just one set of tests, call
-RunTest with either the -8, -16 or -32 option.
-
-If valgrind is installed, you can run the tests under it by putting "valgrind"
-on the RunTest command line. To run pcretest on just one or more specific test
-files, give their numbers as arguments to RunTest, for example:
-
-  RunTest 2 7 11
-
-You can also specify ranges of tests such as 3-6 or 3- (meaning 3 to the
-end), or a number preceded by ~ to exclude a test. For example:
-
-  Runtest 3-15 ~10
-
-This runs tests 3 to 15, excluding test 10, and just ~13 runs all the tests
-except test 13. Whatever order the arguments are in, the tests are always run
-in numerical order.
-
-You can also call RunTest with the single argument "list" to cause it to output
-a list of tests.
-
-The first test file can be fed directly into the perltest.pl script to check
-that Perl gives the same results. The only difference you should see is in the
-first few lines, where the Perl version is given instead of the PCRE version.
-
-The second set of tests check pcre_fullinfo(), pcre_study(),
-pcre_copy_substring(), pcre_get_substring(), pcre_get_substring_list(), error
-detection, and run-time flags that are specific to PCRE, as well as the POSIX
-wrapper API. It also uses the debugging flags to check some of the internals of
-pcre_compile().
-
-If you build PCRE with a locale setting that is not the standard C locale, the
-character tables may be different (see next paragraph). In some cases, this may
-cause failures in the second set of tests. For example, in a locale where the
-isprint() function yields TRUE for characters in the range 128-255, the use of
-[:isascii:] inside a character class defines a different set of characters, and
-this shows up in this test as a difference in the compiled code, which is being
-listed for checking. Where the comparison test output contains [\x00-\x7f] the
-test will contain [\x00-\xff], and similarly in some other cases. This is not a
-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_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_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.
-
-[If you are trying to run this test on Windows, you may be able to get it to
-work by changing "fr_FR" to "french" everywhere it occurs. Alternatively, use
-RunTest.bat. The version of RunTest.bat included with PCRE 7.4 and above uses
-Windows versions of test 2. More info on using RunTest.bat is included in the
-document entitled NON-UNIX-USE.]
-
-The fourth and fifth tests check the UTF-8/16/32 support and error handling and
-internal UTF features of PCRE that are not relevant to Perl, respectively. The
-sixth and seventh tests do the same for Unicode character properties support.
-
-The eighth, ninth, and tenth tests check the pcre_dfa_exec() alternative
-matching function, in non-UTF-8/16/32 mode, UTF-8/16/32 mode, and UTF-8/16/32
-mode with Unicode property support, respectively.
-
-The eleventh test checks some internal offsets and code size features; it is
-run only when the default "link size" of 2 is set (in other cases the sizes
-change) and when Unicode property support is enabled.
-
-The twelfth test is run only when JIT support is available, and the thirteenth
-test is run only when JIT support is not available. They test some JIT-specific
-features such as information output from pcretest about JIT compilation.
-
-The fourteenth, fifteenth, and sixteenth tests are run only in 8-bit mode, and
-the seventeenth, eighteenth, and nineteenth tests are run only in 16/32-bit
-mode. These are tests that generate different output in the two modes. They are
-for general cases, UTF-8/16/32 support, and Unicode property support,
-respectively.
-
-The twentieth test is run only in 16/32-bit mode. It tests some specific
-16/32-bit features of the DFA matching engine.
-
-The twenty-first and twenty-second tests are run only in 16/32-bit mode, when
-the link size is set to 2 for the 16-bit library. They test reloading
-pre-compiled patterns.
-
-The twenty-third and twenty-fourth tests are run only in 16-bit mode. They are
-for general cases, and UTF-16 support, respectively.
-
-The twenty-fifth and twenty-sixth tests are run only in 32-bit mode. They are
-for general cases, and UTF-32 support, respectively.
-
-
-Character tables
-----------------
-
-For speed, PCRE uses four tables for manipulating and identifying characters
-whose code point 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 pcre_chartables.c contains the default set of tables. By
-default, this is created as a copy of pcre_chartables.c.dist, which contains
-tables for ASCII coding. However, if --enable-rebuild-chartables is specified
-for ./configure, a different version of pcre_chartables.c is built by the
-program dftables (compiled from dftables.c), which uses the ANSI C character
-handling functions such as isalnum(), isalpha(), isupper(), islower(), etc. to
-build the table sources. This means that the default C locale which is set for
-your system will control the contents of these default tables. You can change
-the default tables by editing pcre_chartables.c and then re-building PCRE. If
-you do this, you should take care to ensure that the file does not get
-automatically re-generated. The best way to do this is to move
-pcre_chartables.c.dist out of the way and replace it with your customized
-tables.
-
-When the dftables program is run as a result of --enable-rebuild-chartables,
-it uses the default C locale that is set on your system. It does not pay
-attention to the LC_xxx environment variables. In other words, it uses the
-system's default locale rather than whatever the compiling user happens to have
-set. If you really do want to build a source set of character tables in a
-locale that is specified by the LC_xxx variables, you can run the dftables
-program by hand with the -L option. For example:
-
-  ./dftables -L pcre_chartables.c.special
-
-The first two 256-byte tables provide lower casing and case flipping functions,
-respectively. The next table consists of three 32-byte bit maps which identify
-digits, "word" characters, and white space, respectively. These are used when
-building 32-byte bit maps that represent character classes for code points less
-than 256.
-
-The final 256-byte table has bits indicating various character types, as
-follows:
-
-    1   white space character
-    2   letter
-    4   decimal digit
-    8   hexadecimal digit
-   16   alphanumeric or '_'
-  128   regular expression metacharacter or binary zero
-
-You should not alter the set of characters that contain the 128 bit, as that
-will cause PCRE to malfunction.
-
-
-File manifest
--------------
-
-The distribution should contain the files listed below. Where a file name is
-given as pcre[16|32]_xxx it means that there are three files, one with the name
-pcre_xxx, one with the name pcre16_xx, and a third with the name pcre32_xxx.
-
-(A) Source files of the PCRE library functions and their headers:
-
-  dftables.c              auxiliary program for building pcre_chartables.c
-                          when --enable-rebuild-chartables is specified
-
-  pcre_chartables.c.dist  a default set of character tables that assume ASCII
-                          coding; used, unless --enable-rebuild-chartables is
-                          specified, by copying to pcre[16]_chartables.c
-
-  pcreposix.c                )
-  pcre[16|32]_byte_order.c   )
-  pcre[16|32]_compile.c      )
-  pcre[16|32]_config.c       )
-  pcre[16|32]_dfa_exec.c     )
-  pcre[16|32]_exec.c         )
-  pcre[16|32]_fullinfo.c     )
-  pcre[16|32]_get.c          ) sources for the functions in the library,
-  pcre[16|32]_globals.c      )   and some internal functions that they use
-  pcre[16|32]_jit_compile.c  )
-  pcre[16|32]_maketables.c   )
-  pcre[16|32]_newline.c      )
-  pcre[16|32]_refcount.c     )
-  pcre[16|32]_string_utils.c )
-  pcre[16|32]_study.c        )
-  pcre[16|32]_tables.c       )
-  pcre[16|32]_ucd.c          )
-  pcre[16|32]_version.c      )
-  pcre[16|32]_xclass.c       )
-  pcre_ord2utf8.c            )
-  pcre_valid_utf8.c          )
-  pcre16_ord2utf16.c         )
-  pcre16_utf16_utils.c       )
-  pcre16_valid_utf16.c       )
-  pcre32_utf32_utils.c       )
-  pcre32_valid_utf32.c       )
-
-  pcre[16|32]_printint.c     ) debugging function that is used by pcretest,
-                             )   and can also be #included in pcre_compile()
-
-  pcre.h.in               template for pcre.h when built by "configure"
-  pcreposix.h             header for the external POSIX wrapper API
-  pcre_internal.h         header for internal use
-  sljit/*                 16 files that make up the JIT compiler
-  ucp.h                   header for Unicode property handling
-
-  config.h.in             template for config.h, which is built by "configure"
-
-  pcrecpp.h               public header file for the C++ wrapper
-  pcrecpparg.h.in         template for another C++ header file
-  pcre_scanner.h          public header file for C++ scanner functions
-  pcrecpp.cc              )
-  pcre_scanner.cc         ) source for the C++ wrapper library
-
-  pcre_stringpiece.h.in   template for pcre_stringpiece.h, the header for the
-                            C++ stringpiece functions
-  pcre_stringpiece.cc     source for the C++ stringpiece functions
-
-(B) Source files for programs that use PCRE:
-
-  pcredemo.c              simple demonstration of coding calls to PCRE
-  pcregrep.c              source of a grep utility that uses PCRE
-  pcretest.c              comprehensive test program
-
-(C) Auxiliary files:
-
-  132html                 script to turn "man" pages into HTML
-  AUTHORS                 information about the author of PCRE
-  ChangeLog               log of changes to the code
-  CleanTxt                script to clean nroff output for txt man pages
-  Detrail                 script to remove trailing spaces
-  HACKING                 some notes about the internals of PCRE
-  INSTALL                 generic installation instructions
-  LICENCE                 conditions for the use of PCRE
-  COPYING                 the same, using GNU's standard name
-  Makefile.in             ) template for Unix Makefile, which is built by
-                          )   "configure"
-  Makefile.am             ) the automake input that was used to create
-                          )   Makefile.in
-  NEWS                    important changes in this release
-  NON-UNIX-USE            the previous name for NON-AUTOTOOLS-BUILD
-  NON-AUTOTOOLS-BUILD     notes on building PCRE without using autotools
-  PrepareRelease          script to make preparations for "make dist"
-  README                  this file
-  RunTest                 a Unix shell script for running tests
-  RunGrepTest             a Unix shell script for pcregrep tests
-  aclocal.m4              m4 macros (generated by "aclocal")
-  config.guess            ) files used by libtool,
-  config.sub              )   used only when building a shared library
-  configure               a configuring shell script (built by autoconf)
-  configure.ac            ) the autoconf input that was used to build
-                          )   "configure" and config.h
-  depcomp                 ) script to find program dependencies, generated by
-                          )   automake
-  doc/*.3                 man page sources for PCRE
-  doc/*.1                 man page sources for pcregrep and pcretest
-  doc/index.html.src      the base HTML page
-  doc/html/*              HTML documentation
-  doc/pcre.txt            plain text version of the man pages
-  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
-  libpcre16.pc.in         template for libpcre16.pc for pkg-config
-  libpcre32.pc.in         template for libpcre32.pc for pkg-config
-  libpcre.pc.in           template for libpcre.pc for pkg-config
-  libpcreposix.pc.in      template for libpcreposix.pc for pkg-config
-  libpcrecpp.pc.in        template for libpcrecpp.pc for pkg-config
-  ltmain.sh               file used to build a libtool script
-  missing                 ) common stub for a few missing GNU programs while
-                          )   installing, generated by automake
-  mkinstalldirs           script for making install directories
-  perltest.pl             Perl test program
-  pcre-config.in          source of script which retains PCRE information
-  pcre_jit_test.c         test program for the JIT compiler
-  pcrecpp_unittest.cc          )
-  pcre_scanner_unittest.cc     ) test programs for the C++ wrapper
-  pcre_stringpiece_unittest.cc )
-  testdata/testinput*     test data for main library tests
-  testdata/testoutput*    expected test results
-  testdata/grep*          input and output for pcregrep tests
-  testdata/*              other supporting test files
-
-(D) Auxiliary files for cmake support
-
-  cmake/COPYING-CMAKE-SCRIPTS
-  cmake/FindPackageHandleStandardArgs.cmake
-  cmake/FindEditline.cmake
-  cmake/FindReadline.cmake
-  CMakeLists.txt
-  config-cmake.h.in
-
-(E) Auxiliary files for VPASCAL
-
-  makevp.bat
-  makevp_c.txt
-  makevp_l.txt
-  pcregexp.pas
-
-(F) Auxiliary files for building PCRE "by hand"
-
-  pcre.h.generic          ) a version of the public PCRE header file
-                          )   for use in non-"configure" environments
-  config.h.generic        ) a version of config.h for use in non-"configure"
-                          )   environments
-
-(F) Miscellaneous
-
-  RunTest.bat            a script for running tests under Windows
-
-Philip Hazel
-Email local part: ph10
-Email domain: cam.ac.uk
-Last updated: 10 February 2015
diff --git a/dist/doc/html/index.html b/dist/doc/html/index.html
deleted file mode 100644
index 352c55d..0000000
--- a/dist/doc/html/index.html
+++ /dev/null
@@ -1,185 +0,0 @@
-<html>
-<!-- This is a manually maintained file that is the root of the HTML version of
-     the PCRE documentation. When the HTML documents are built from the man
-     page versions, the entire doc/html directory is emptied, this file is then
-     copied into doc/html/index.html, and the remaining files therein are
-     created by the 132html script.
--->
-<head>
-<title>PCRE specification</title>
-</head>
-<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
-<h1>Perl-compatible Regular Expressions (PCRE)</h1>
-<p>
-The HTML documentation for PCRE consists of a number of pages that are listed
-below in alphabetical order. If you are new to PCRE, please read the first one
-first.
-</p>
-
-<table>
-<tr><td><a href="pcre.html">pcre</a></td>
-    <td>&nbsp;&nbsp;Introductory page</td></tr>
-
-<tr><td><a href="pcre-config.html">pcre-config</a></td>
-    <td>&nbsp;&nbsp;Information about the installation configuration</td></tr>
-
-<tr><td><a href="pcre16.html">pcre16</a></td>
-    <td>&nbsp;&nbsp;Discussion of the 16-bit PCRE library</td></tr>
-
-<tr><td><a href="pcre32.html">pcre32</a></td>
-    <td>&nbsp;&nbsp;Discussion of the 32-bit PCRE library</td></tr>
-
-<tr><td><a href="pcreapi.html">pcreapi</a></td>
-    <td>&nbsp;&nbsp;PCRE's native API</td></tr>
-
-<tr><td><a href="pcrebuild.html">pcrebuild</a></td>
-    <td>&nbsp;&nbsp;Building PCRE</td></tr>
-
-<tr><td><a href="pcrecallout.html">pcrecallout</a></td>
-    <td>&nbsp;&nbsp;The <i>callout</i> facility</td></tr>
-
-<tr><td><a href="pcrecompat.html">pcrecompat</a></td>
-    <td>&nbsp;&nbsp;Compability with Perl</td></tr>
-
-<tr><td><a href="pcrecpp.html">pcrecpp</a></td>
-    <td>&nbsp;&nbsp;The C++ wrapper for the PCRE library</td></tr>
-
-<tr><td><a href="pcredemo.html">pcredemo</a></td>
-    <td>&nbsp;&nbsp;A demonstration C program that uses the PCRE library</td></tr>
-
-<tr><td><a href="pcregrep.html">pcregrep</a></td>
-    <td>&nbsp;&nbsp;The <b>pcregrep</b> command</td></tr>
-
-<tr><td><a href="pcrejit.html">pcrejit</a></td>
-    <td>&nbsp;&nbsp;Discussion of the just-in-time optimization support</td></tr>
-
-<tr><td><a href="pcrelimits.html">pcrelimits</a></td>
-    <td>&nbsp;&nbsp;Details of size and other limits</td></tr>
-
-<tr><td><a href="pcrematching.html">pcrematching</a></td>
-    <td>&nbsp;&nbsp;Discussion of the two matching algorithms</td></tr>
-
-<tr><td><a href="pcrepartial.html">pcrepartial</a></td>
-    <td>&nbsp;&nbsp;Using PCRE for partial matching</td></tr>
-
-<tr><td><a href="pcrepattern.html">pcrepattern</a></td>
-    <td>&nbsp;&nbsp;Specification of the regular expressions supported by PCRE</td></tr>
-
-<tr><td><a href="pcreperform.html">pcreperform</a></td>
-    <td>&nbsp;&nbsp;Some comments on performance</td></tr>
-
-<tr><td><a href="pcreposix.html">pcreposix</a></td>
-    <td>&nbsp;&nbsp;The POSIX API to the PCRE 8-bit library</td></tr>
-
-<tr><td><a href="pcreprecompile.html">pcreprecompile</a></td>
-    <td>&nbsp;&nbsp;How to save and re-use compiled patterns</td></tr>
-
-<tr><td><a href="pcresample.html">pcresample</a></td>
-    <td>&nbsp;&nbsp;Discussion of the pcredemo program</td></tr>
-
-<tr><td><a href="pcrestack.html">pcrestack</a></td>
-    <td>&nbsp;&nbsp;Discussion of PCRE's stack usage</td></tr>
-
-<tr><td><a href="pcresyntax.html">pcresyntax</a></td>
-    <td>&nbsp;&nbsp;Syntax quick-reference summary</td></tr>
-
-<tr><td><a href="pcretest.html">pcretest</a></td>
-    <td>&nbsp;&nbsp;The <b>pcretest</b> command for testing PCRE</td></tr>
-
-<tr><td><a href="pcreunicode.html">pcreunicode</a></td>
-    <td>&nbsp;&nbsp;Discussion of Unicode and UTF-8/UTF-16/UTF-32 support</td></tr>
-</table>
-
-<p>
-There are also individual pages that summarize the interface for each function
-in the library. There is a single page for each triple of 8-bit/16-bit/32-bit
-functions.
-</p>
-
-<table>
-
-<tr><td><a href="pcre_assign_jit_stack.html">pcre_assign_jit_stack</a></td>
-    <td>&nbsp;&nbsp;Assign stack for JIT matching</td></tr>
-
-<tr><td><a href="pcre_compile.html">pcre_compile</a></td>
-    <td>&nbsp;&nbsp;Compile a regular expression</td></tr>
-
-<tr><td><a href="pcre_compile2.html">pcre_compile2</a></td>
-    <td>&nbsp;&nbsp;Compile a regular expression (alternate interface)</td></tr>
-
-<tr><td><a href="pcre_config.html">pcre_config</a></td>
-    <td>&nbsp;&nbsp;Show build-time configuration options</td></tr>
-
-<tr><td><a href="pcre_copy_named_substring.html">pcre_copy_named_substring</a></td>
-    <td>&nbsp;&nbsp;Extract named substring into given buffer</td></tr>
-
-<tr><td><a href="pcre_copy_substring.html">pcre_copy_substring</a></td>
-    <td>&nbsp;&nbsp;Extract numbered substring into given buffer</td></tr>
-
-<tr><td><a href="pcre_dfa_exec.html">pcre_dfa_exec</a></td>
-    <td>&nbsp;&nbsp;Match a compiled pattern to a subject string
-    (DFA algorithm; <i>not</i> Perl compatible)</td></tr>
-
-<tr><td><a href="pcre_exec.html">pcre_exec</a></td>
-    <td>&nbsp;&nbsp;Match a compiled pattern to a subject string
-    (Perl compatible)</td></tr>
-
-<tr><td><a href="pcre_free_study.html">pcre_free_study</a></td>
-    <td>&nbsp;&nbsp;Free study data</td></tr>
-
-<tr><td><a href="pcre_free_substring.html">pcre_free_substring</a></td>
-    <td>&nbsp;&nbsp;Free extracted substring</td></tr>
-
-<tr><td><a href="pcre_free_substring_list.html">pcre_free_substring_list</a></td>
-    <td>&nbsp;&nbsp;Free list of extracted substrings</td></tr>
-
-<tr><td><a href="pcre_fullinfo.html">pcre_fullinfo</a></td>
-    <td>&nbsp;&nbsp;Extract information about a pattern</td></tr>
-
-<tr><td><a href="pcre_get_named_substring.html">pcre_get_named_substring</a></td>
-    <td>&nbsp;&nbsp;Extract named substring into new memory</td></tr>
-
-<tr><td><a href="pcre_get_stringnumber.html">pcre_get_stringnumber</a></td>
-    <td>&nbsp;&nbsp;Convert captured string name to number</td></tr>
-
-<tr><td><a href="pcre_get_stringtable_entries.html">pcre_get_stringtable_entries</a></td>
-    <td>&nbsp;&nbsp;Find table entries for given string name</td></tr>
-
-<tr><td><a href="pcre_get_substring.html">pcre_get_substring</a></td>
-    <td>&nbsp;&nbsp;Extract numbered substring into new memory</td></tr>
-
-<tr><td><a href="pcre_get_substring_list.html">pcre_get_substring_list</a></td>
-    <td>&nbsp;&nbsp;Extract all substrings into new memory</td></tr>
-
-<tr><td><a href="pcre_jit_exec.html">pcre_jit_exec</a></td>
-    <td>&nbsp;&nbsp;Fast path interface to JIT matching</td></tr>
-
-<tr><td><a href="pcre_jit_stack_alloc.html">pcre_jit_stack_alloc</a></td>
-    <td>&nbsp;&nbsp;Create a stack for JIT matching</td></tr>
-
-<tr><td><a href="pcre_jit_stack_free.html">pcre_jit_stack_free</a></td>
-    <td>&nbsp;&nbsp;Free a JIT matching stack</td></tr>
-
-<tr><td><a href="pcre_maketables.html">pcre_maketables</a></td>
-    <td>&nbsp;&nbsp;Build character tables in current locale</td></tr>
-
-<tr><td><a href="pcre_pattern_to_host_byte_order.html">pcre_pattern_to_host_byte_order</a></td>
-    <td>&nbsp;&nbsp;Convert compiled pattern to host byte order if necessary</td></tr>
-
-<tr><td><a href="pcre_refcount.html">pcre_refcount</a></td>
-    <td>&nbsp;&nbsp;Maintain reference count in compiled pattern</td></tr>
-
-<tr><td><a href="pcre_study.html">pcre_study</a></td>
-    <td>&nbsp;&nbsp;Study a compiled pattern</td></tr>
-
-<tr><td><a href="pcre_utf16_to_host_byte_order.html">pcre_utf16_to_host_byte_order</a></td>
-    <td>&nbsp;&nbsp;Convert UTF-16 string to host byte order if necessary</td></tr>
-
-<tr><td><a href="pcre_utf32_to_host_byte_order.html">pcre_utf32_to_host_byte_order</a></td>
-    <td>&nbsp;&nbsp;Convert UTF-32 string to host byte order if necessary</td></tr>
-
-<tr><td><a href="pcre_version.html">pcre_version</a></td>
-    <td>&nbsp;&nbsp;Return PCRE version and release date</td></tr>
-</table>
-
-</html>
diff --git a/dist/doc/html/pcre-config.html b/dist/doc/html/pcre-config.html
deleted file mode 100644
index 56a8060..0000000
--- a/dist/doc/html/pcre-config.html
+++ /dev/null
@@ -1,109 +0,0 @@
-<html>
-<head>
-<title>pcre-config specification</title>
-</head>
-<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
-<h1>pcre-config man page</h1>
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
-<p>
-This page is part of the PCRE HTML documentation. It was generated automatically
-from the original man page. If there is any nonsense in it, please consult the
-man page, in case the conversion went wrong.
-<br>
-<ul>
-<li><a name="TOC1" href="#SEC1">SYNOPSIS</a>
-<li><a name="TOC2" href="#SEC2">DESCRIPTION</a>
-<li><a name="TOC3" href="#SEC3">OPTIONS</a>
-<li><a name="TOC4" href="#SEC4">SEE ALSO</a>
-<li><a name="TOC5" href="#SEC5">AUTHOR</a>
-<li><a name="TOC6" href="#SEC6">REVISION</a>
-</ul>
-<br><a name="SEC1" href="#TOC1">SYNOPSIS</a><br>
-<P>
-<b>pcre-config  [--prefix] [--exec-prefix] [--version] [--libs]</b>
-<b>            [--libs16] [--libs32] [--libs-cpp] [--libs-posix]</b>
-<b>            [--cflags] [--cflags-posix]</b>
-</P>
-<br><a name="SEC2" href="#TOC1">DESCRIPTION</a><br>
-<P>
-<b>pcre-config</b> returns the configuration of the installed PCRE
-libraries and the options required to compile a program to use them. Some of
-the options apply only to the 8-bit, or 16-bit, or 32-bit libraries,
-respectively, and are
-not available if only one of those libraries has been built. If an unavailable
-option is encountered, the "usage" information is output.
-</P>
-<br><a name="SEC3" href="#TOC1">OPTIONS</a><br>
-<P>
-<b>--prefix</b>
-Writes the directory prefix used in the PCRE installation for architecture
-independent files (<i>/usr</i> on many systems, <i>/usr/local</i> on some
-systems) to the standard output.
-</P>
-<P>
-<b>--exec-prefix</b>
-Writes the directory prefix used in the PCRE installation for architecture
-dependent files (normally the same as <b>--prefix</b>) to the standard output.
-</P>
-<P>
-<b>--version</b>
-Writes the version number of the installed PCRE libraries to the standard
-output.
-</P>
-<P>
-<b>--libs</b>
-Writes to the standard output the command line options required to link
-with the 8-bit PCRE library (<b>-lpcre</b> on many systems).
-</P>
-<P>
-<b>--libs16</b>
-Writes to the standard output the command line options required to link
-with the 16-bit PCRE library (<b>-lpcre16</b> on many systems).
-</P>
-<P>
-<b>--libs32</b>
-Writes to the standard output the command line options required to link
-with the 32-bit PCRE library (<b>-lpcre32</b> on many systems).
-</P>
-<P>
-<b>--libs-cpp</b>
-Writes to the standard output the command line options required to link with
-PCRE's C++ wrapper library (<b>-lpcrecpp</b> <b>-lpcre</b> on many
-systems).
-</P>
-<P>
-<b>--libs-posix</b>
-Writes to the standard output the command line options required to link with
-PCRE's POSIX API wrapper library (<b>-lpcreposix</b> <b>-lpcre</b> on many
-systems).
-</P>
-<P>
-<b>--cflags</b>
-Writes to the standard output the command line options required to compile
-files that use PCRE (this may include some <b>-I</b> options, but is blank on
-many systems).
-</P>
-<P>
-<b>--cflags-posix</b>
-Writes to the standard output the command line options required to compile
-files that use PCRE's POSIX API wrapper library (this may include some <b>-I</b>
-options, but is blank on many systems).
-</P>
-<br><a name="SEC4" href="#TOC1">SEE ALSO</a><br>
-<P>
-<b>pcre(3)</b>
-</P>
-<br><a name="SEC5" href="#TOC1">AUTHOR</a><br>
-<P>
-This manual page was originally written by Mark Baker for the Debian GNU/Linux
-system. It has been subsequently revised as a generic PCRE man page.
-</P>
-<br><a name="SEC6" href="#TOC1">REVISION</a><br>
-<P>
-Last updated: 24 June 2012
-<br>
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
diff --git a/dist/doc/html/pcre.html b/dist/doc/html/pcre.html
deleted file mode 100644
index c87b106..0000000
--- a/dist/doc/html/pcre.html
+++ /dev/null
@@ -1,224 +0,0 @@
-<html>
-<head>
-<title>pcre specification</title>
-</head>
-<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
-<h1>pcre man page</h1>
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
-<p>
-This page is part of the PCRE HTML documentation. It was generated automatically
-from the original man page. If there is any nonsense in it, please consult the
-man page, in case the conversion went wrong.
-<br>
-<ul>
-<li><a name="TOC1" href="#SEC1">PLEASE TAKE NOTE</a>
-<li><a name="TOC2" href="#SEC2">INTRODUCTION</a>
-<li><a name="TOC3" href="#SEC3">SECURITY CONSIDERATIONS</a>
-<li><a name="TOC4" href="#SEC4">USER DOCUMENTATION</a>
-<li><a name="TOC5" href="#SEC5">AUTHOR</a>
-<li><a name="TOC6" href="#SEC6">REVISION</a>
-</ul>
-<br><a name="SEC1" href="#TOC1">PLEASE TAKE NOTE</a><br>
-<P>
-This document relates to PCRE releases that use the original API,
-with library names libpcre, libpcre16, and libpcre32. January 2015 saw the
-first release of a new API, known as PCRE2, with release numbers starting at
-10.00 and library names libpcre2-8, libpcre2-16, and libpcre2-32. The old
-libraries (now called PCRE1) are still being maintained for bug fixes, but
-there will be no new development. New projects are advised to use the new PCRE2
-libraries.
-</P>
-<br><a name="SEC2" href="#TOC1">INTRODUCTION</a><br>
-<P>
-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. Some features that appeared in Python and PCRE before they
-appeared in Perl are also available using the Python syntax, there is some
-support for one or two .NET and Oniguruma syntax items, and there is an option
-for requesting some minor changes that give better JavaScript compatibility.
-</P>
-<P>
-Starting with release 8.30, it is possible to compile two separate PCRE
-libraries: the original, which supports 8-bit character strings (including
-UTF-8 strings), and a second library that supports 16-bit character strings
-(including UTF-16 strings). The build process allows either one or both to be
-built. The majority of the work to make this possible was done by Zoltan
-Herczeg.
-</P>
-<P>
-Starting with release 8.32 it is possible to compile a third separate PCRE
-library that supports 32-bit character strings (including UTF-32 strings). The
-build process allows any combination of the 8-, 16- and 32-bit libraries. The
-work to make this possible was done by Christian Persch.
-</P>
-<P>
-The three libraries contain identical sets of functions, except that the names
-in the 16-bit library start with <b>pcre16_</b> instead of <b>pcre_</b>, and the
-names in the 32-bit library start with <b>pcre32_</b> instead of <b>pcre_</b>. To
-avoid over-complication and reduce the documentation maintenance load, most of
-the documentation describes the 8-bit library, with the differences for the
-16-bit and 32-bit libraries described separately in the
-<a href="pcre16.html"><b>pcre16</b></a>
-and
-<a href="pcre32.html"><b>pcre32</b></a>
-pages. References to functions or structures of the form <i>pcre[16|32]_xxx</i>
-should be read as meaning "<i>pcre_xxx</i> when using the 8-bit library,
-<i>pcre16_xxx</i> when using the 16-bit library, or <i>pcre32_xxx</i> when using
-the 32-bit library".
-</P>
-<P>
-The current implementation of PCRE corresponds approximately with Perl 5.12,
-including support for UTF-8/16/32 encoded strings and Unicode general category
-properties. However, UTF-8/16/32 and Unicode support has to be explicitly
-enabled; it is not the default. The Unicode tables correspond to Unicode
-release 6.3.0.
-</P>
-<P>
-In addition to the Perl-compatible matching function, PCRE contains an
-alternative 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
-<a href="pcrematching.html"><b>pcrematching</b></a>
-page.
-</P>
-<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 for the 8-bit library. This is now
-included as part of the PCRE distribution. The
-<a href="pcrecpp.html"><b>pcrecpp</b></a>
-page has details of this interface. Other people's contributions can be found
-in the <i>Contrib</i> directory at the primary FTP site, which is:
-<a href="ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre">ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre</a>
-</P>
-<P>
-Details of exactly which Perl regular expression features are and are not
-supported by PCRE are given in separate documents. See the
-<a href="pcrepattern.html"><b>pcrepattern</b></a>
-and
-<a href="pcrecompat.html"><b>pcrecompat</b></a>
-pages. There is a syntax summary in the
-<a href="pcresyntax.html"><b>pcresyntax</b></a>
-page.
-</P>
-<P>
-Some features of PCRE can be included, excluded, or changed when the library is
-built. The
-<a href="pcre_config.html"><b>pcre_config()</b></a>
-function makes it possible for a client to discover which features are
-available. The features themselves are described in the
-<a href="pcrebuild.html"><b>pcrebuild</b></a>
-page. Documentation about building PCRE for various operating systems can be
-found in the
-<a href="README.txt"><b>README</b></a>
-and
-<a href="NON-AUTOTOOLS-BUILD.txt"><b>NON-AUTOTOOLS_BUILD</b></a>
-files in the source distribution.
-</P>
-<P>
-The libraries 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_" or "_pcre16_" or "_pcre32_", 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.
-</P>
-<br><a name="SEC3" href="#TOC1">SECURITY CONSIDERATIONS</a><br>
-<P>
-If you are using PCRE in a non-UTF application that permits users to supply
-arbitrary patterns for compilation, you should be aware of a feature that
-allows users to turn on UTF support from within a pattern, provided that PCRE
-was built with UTF support. For example, an 8-bit pattern that begins with
-"(*UTF8)" or "(*UTF)" turns on UTF-8 mode, which interprets patterns and
-subjects as strings of UTF-8 characters instead of individual 8-bit characters.
-This causes both the pattern and any data against which it is matched to be
-checked for UTF-8 validity. If the data string is very long, such a check might
-use sufficiently many resources as to cause your application to lose
-performance.
-</P>
-<P>
-One way of guarding against this possibility is to use the
-<b>pcre_fullinfo()</b> function to check the compiled pattern's options for UTF.
-Alternatively, from release 8.33, you can set the PCRE_NEVER_UTF option at
-compile time. This causes an compile time error if a pattern contains a
-UTF-setting sequence.
-</P>
-<P>
-If your application is one that supports UTF, be aware that validity checking
-can take time. If the same data string is to be matched many times, you can use
-the PCRE_NO_UTF[8|16|32]_CHECK option for the second and subsequent matches to
-save redundant checks.
-</P>
-<P>
-Another way that performance can be hit is by running a pattern that has a very
-large search tree against a string that will never match. Nested unlimited
-repeats in a pattern are a common example. PCRE provides some protection
-against this: see the PCRE_EXTRA_MATCH_LIMIT feature in the
-<a href="pcreapi.html"><b>pcreapi</b></a>
-page.
-</P>
-<br><a name="SEC4" href="#TOC1">USER DOCUMENTATION</a><br>
-<P>
-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,
-the descriptions of the <b>pcregrep</b> and <b>pcretest</b> programs are in files
-called <b>pcregrep.txt</b> and <b>pcretest.txt</b>, respectively. The remaining
-sections, except for the <b>pcredemo</b> section (which is a program listing),
-are concatenated in <b>pcre.txt</b>, for ease of searching. The sections are as
-follows:
-<pre>
-  pcre              this document
-  pcre-config       show PCRE installation configuration information
-  pcre16            details of the 16-bit library
-  pcre32            details of the 32-bit library
-  pcreapi           details of PCRE's native C API
-  pcrebuild         building PCRE
-  pcrecallout       details of the callout feature
-  pcrecompat        discussion of Perl compatibility
-  pcrecpp           details of the C++ wrapper for the 8-bit library
-  pcredemo          a demonstration C program that uses PCRE
-  pcregrep          description of the <b>pcregrep</b> command (8-bit only)
-  pcrejit           discussion of the just-in-time optimization support
-  pcrelimits        details of size and other limits
-  pcrematching      discussion of the two matching algorithms
-  pcrepartial       details of the partial matching facility
-  pcrepattern       syntax and semantics of supported regular expressions
-  pcreperform       discussion of performance issues
-  pcreposix         the POSIX-compatible C API for the 8-bit library
-  pcreprecompile    details of saving and re-using precompiled patterns
-  pcresample        discussion of the pcredemo program
-  pcrestack         discussion of stack usage
-  pcresyntax        quick syntax reference
-  pcretest          description of the <b>pcretest</b> testing command
-  pcreunicode       discussion of Unicode and UTF-8/16/32 support
-</pre>
-In the "man" and HTML formats, there is also a short page for each C library
-function, listing its arguments and results.
-</P>
-<br><a name="SEC5" href="#TOC1">AUTHOR</a><br>
-<P>
-Philip Hazel
-<br>
-University Computing Service
-<br>
-Cambridge CB2 3QH, England.
-<br>
-</P>
-<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 two initials, followed by the
-two digits 10, at the domain cam.ac.uk.
-</P>
-<br><a name="SEC6" href="#TOC1">REVISION</a><br>
-<P>
-Last updated: 10 February 2015
-<br>
-Copyright &copy; 1997-2015 University of Cambridge.
-<br>
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
diff --git a/dist/doc/html/pcre16.html b/dist/doc/html/pcre16.html
deleted file mode 100644
index f00859f..0000000
--- a/dist/doc/html/pcre16.html
+++ /dev/null
@@ -1,384 +0,0 @@
-<html>
-<head>
-<title>pcre16 specification</title>
-</head>
-<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
-<h1>pcre16 man page</h1>
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
-<p>
-This page is part of the PCRE HTML documentation. It was generated automatically
-from the original man page. If there is any nonsense in it, please consult the
-man page, in case the conversion went wrong.
-<br>
-<ul>
-<li><a name="TOC1" href="#SEC1">PCRE 16-BIT API BASIC FUNCTIONS</a>
-<li><a name="TOC2" href="#SEC2">PCRE 16-BIT API STRING EXTRACTION FUNCTIONS</a>
-<li><a name="TOC3" href="#SEC3">PCRE 16-BIT API AUXILIARY FUNCTIONS</a>
-<li><a name="TOC4" href="#SEC4">PCRE 16-BIT API INDIRECTED FUNCTIONS</a>
-<li><a name="TOC5" href="#SEC5">PCRE 16-BIT API 16-BIT-ONLY FUNCTION</a>
-<li><a name="TOC6" href="#SEC6">THE PCRE 16-BIT LIBRARY</a>
-<li><a name="TOC7" href="#SEC7">THE HEADER FILE</a>
-<li><a name="TOC8" href="#SEC8">THE LIBRARY NAME</a>
-<li><a name="TOC9" href="#SEC9">STRING TYPES</a>
-<li><a name="TOC10" href="#SEC10">STRUCTURE TYPES</a>
-<li><a name="TOC11" href="#SEC11">16-BIT FUNCTIONS</a>
-<li><a name="TOC12" href="#SEC12">SUBJECT STRING OFFSETS</a>
-<li><a name="TOC13" href="#SEC13">NAMED SUBPATTERNS</a>
-<li><a name="TOC14" href="#SEC14">OPTION NAMES</a>
-<li><a name="TOC15" href="#SEC15">CHARACTER CODES</a>
-<li><a name="TOC16" href="#SEC16">ERROR NAMES</a>
-<li><a name="TOC17" href="#SEC17">ERROR TEXTS</a>
-<li><a name="TOC18" href="#SEC18">CALLOUTS</a>
-<li><a name="TOC19" href="#SEC19">TESTING</a>
-<li><a name="TOC20" href="#SEC20">NOT SUPPORTED IN 16-BIT MODE</a>
-<li><a name="TOC21" href="#SEC21">AUTHOR</a>
-<li><a name="TOC22" href="#SEC22">REVISION</a>
-</ul>
-<P>
-<b>#include &#60;pcre.h&#62;</b>
-</P>
-<br><a name="SEC1" href="#TOC1">PCRE 16-BIT API BASIC FUNCTIONS</a><br>
-<P>
-<b>pcre16 *pcre16_compile(PCRE_SPTR16 <i>pattern</i>, int <i>options</i>,</b>
-<b>     const char **<i>errptr</i>, int *<i>erroffset</i>,</b>
-<b>     const unsigned char *<i>tableptr</i>);</b>
-<br>
-<br>
-<b>pcre16 *pcre16_compile2(PCRE_SPTR16 <i>pattern</i>, int <i>options</i>,</b>
-<b>     int *<i>errorcodeptr</i>,</b>
-<b>     const char **<i>errptr</i>, int *<i>erroffset</i>,</b>
-<b>     const unsigned char *<i>tableptr</i>);</b>
-<br>
-<br>
-<b>pcre16_extra *pcre16_study(const pcre16 *<i>code</i>, int <i>options</i>,</b>
-<b>     const char **<i>errptr</i>);</b>
-<br>
-<br>
-<b>void pcre16_free_study(pcre16_extra *<i>extra</i>);</b>
-<br>
-<br>
-<b>int pcre16_exec(const pcre16 *<i>code</i>, const pcre16_extra *<i>extra</i>,</b>
-<b>     PCRE_SPTR16 <i>subject</i>, int <i>length</i>, int <i>startoffset</i>,</b>
-<b>     int <i>options</i>, int *<i>ovector</i>, int <i>ovecsize</i>);</b>
-<br>
-<br>
-<b>int pcre16_dfa_exec(const pcre16 *<i>code</i>, const pcre16_extra *<i>extra</i>,</b>
-<b>     PCRE_SPTR16 <i>subject</i>, int <i>length</i>, int <i>startoffset</i>,</b>
-<b>     int <i>options</i>, int *<i>ovector</i>, int <i>ovecsize</i>,</b>
-<b>     int *<i>workspace</i>, int <i>wscount</i>);</b>
-</P>
-<br><a name="SEC2" href="#TOC1">PCRE 16-BIT API STRING EXTRACTION FUNCTIONS</a><br>
-<P>
-<b>int pcre16_copy_named_substring(const pcre16 *<i>code</i>,</b>
-<b>     PCRE_SPTR16 <i>subject</i>, int *<i>ovector</i>,</b>
-<b>     int <i>stringcount</i>, PCRE_SPTR16 <i>stringname</i>,</b>
-<b>     PCRE_UCHAR16 *<i>buffer</i>, int <i>buffersize</i>);</b>
-<br>
-<br>
-<b>int pcre16_copy_substring(PCRE_SPTR16 <i>subject</i>, int *<i>ovector</i>,</b>
-<b>     int <i>stringcount</i>, int <i>stringnumber</i>, PCRE_UCHAR16 *<i>buffer</i>,</b>
-<b>     int <i>buffersize</i>);</b>
-<br>
-<br>
-<b>int pcre16_get_named_substring(const pcre16 *<i>code</i>,</b>
-<b>     PCRE_SPTR16 <i>subject</i>, int *<i>ovector</i>,</b>
-<b>     int <i>stringcount</i>, PCRE_SPTR16 <i>stringname</i>,</b>
-<b>     PCRE_SPTR16 *<i>stringptr</i>);</b>
-<br>
-<br>
-<b>int pcre16_get_stringnumber(const pcre16 *<i>code</i>,</b>
-<b>"     PCRE_SPTR16 <i>name</i>);</b>
-<br>
-<br>
-<b>int pcre16_get_stringtable_entries(const pcre16 *<i>code</i>,</b>
-<b>     PCRE_SPTR16 <i>name</i>, PCRE_UCHAR16 **<i>first</i>, PCRE_UCHAR16 **<i>last</i>);</b>
-<br>
-<br>
-<b>int pcre16_get_substring(PCRE_SPTR16 <i>subject</i>, int *<i>ovector</i>,</b>
-<b>     int <i>stringcount</i>, int <i>stringnumber</i>,</b>
-<b>     PCRE_SPTR16 *<i>stringptr</i>);</b>
-<br>
-<br>
-<b>int pcre16_get_substring_list(PCRE_SPTR16 <i>subject</i>,</b>
-<b>     int *<i>ovector</i>, int <i>stringcount</i>, PCRE_SPTR16 **<i>listptr</i>);</b>
-<br>
-<br>
-<b>void pcre16_free_substring(PCRE_SPTR16 <i>stringptr</i>);</b>
-<br>
-<br>
-<b>void pcre16_free_substring_list(PCRE_SPTR16 *<i>stringptr</i>);</b>
-</P>
-<br><a name="SEC3" href="#TOC1">PCRE 16-BIT API AUXILIARY FUNCTIONS</a><br>
-<P>
-<b>pcre16_jit_stack *pcre16_jit_stack_alloc(int <i>startsize</i>, int <i>maxsize</i>);</b>
-<br>
-<br>
-<b>void pcre16_jit_stack_free(pcre16_jit_stack *<i>stack</i>);</b>
-<br>
-<br>
-<b>void pcre16_assign_jit_stack(pcre16_extra *<i>extra</i>,</b>
-<b>     pcre16_jit_callback <i>callback</i>, void *<i>data</i>);</b>
-<br>
-<br>
-<b>const unsigned char *pcre16_maketables(void);</b>
-<br>
-<br>
-<b>int pcre16_fullinfo(const pcre16 *<i>code</i>, const pcre16_extra *<i>extra</i>,</b>
-<b>     int <i>what</i>, void *<i>where</i>);</b>
-<br>
-<br>
-<b>int pcre16_refcount(pcre16 *<i>code</i>, int <i>adjust</i>);</b>
-<br>
-<br>
-<b>int pcre16_config(int <i>what</i>, void *<i>where</i>);</b>
-<br>
-<br>
-<b>const char *pcre16_version(void);</b>
-<br>
-<br>
-<b>int pcre16_pattern_to_host_byte_order(pcre16 *<i>code</i>,</b>
-<b>     pcre16_extra *<i>extra</i>, const unsigned char *<i>tables</i>);</b>
-</P>
-<br><a name="SEC4" href="#TOC1">PCRE 16-BIT API INDIRECTED FUNCTIONS</a><br>
-<P>
-<b>void *(*pcre16_malloc)(size_t);</b>
-<br>
-<br>
-<b>void (*pcre16_free)(void *);</b>
-<br>
-<br>
-<b>void *(*pcre16_stack_malloc)(size_t);</b>
-<br>
-<br>
-<b>void (*pcre16_stack_free)(void *);</b>
-<br>
-<br>
-<b>int (*pcre16_callout)(pcre16_callout_block *);</b>
-</P>
-<br><a name="SEC5" href="#TOC1">PCRE 16-BIT API 16-BIT-ONLY FUNCTION</a><br>
-<P>
-<b>int pcre16_utf16_to_host_byte_order(PCRE_UCHAR16 *<i>output</i>,</b>
-<b>     PCRE_SPTR16 <i>input</i>, int <i>length</i>, int *<i>byte_order</i>,</b>
-<b>     int <i>keep_boms</i>);</b>
-</P>
-<br><a name="SEC6" href="#TOC1">THE PCRE 16-BIT LIBRARY</a><br>
-<P>
-Starting with release 8.30, it is possible to compile a PCRE library that
-supports 16-bit character strings, including UTF-16 strings, as well as or
-instead of the original 8-bit library. The majority of the work to make this
-possible was done by Zoltan Herczeg. The two libraries contain identical sets
-of functions, used in exactly the same way. Only the names of the functions and
-the data types of their arguments and results are different. To avoid
-over-complication and reduce the documentation maintenance load, most of the
-PCRE documentation describes the 8-bit library, with only occasional references
-to the 16-bit library. This page describes what is different when you use the
-16-bit library.
-</P>
-<P>
-WARNING: A single application can be linked with both libraries, but you must
-take care when processing any particular pattern to use functions from just one
-library. For example, if you want to study a pattern that was compiled with
-<b>pcre16_compile()</b>, you must do so with <b>pcre16_study()</b>, not
-<b>pcre_study()</b>, and you must free the study data with
-<b>pcre16_free_study()</b>.
-</P>
-<br><a name="SEC7" href="#TOC1">THE HEADER FILE</a><br>
-<P>
-There is only one header file, <b>pcre.h</b>. It contains prototypes for all the
-functions in all libraries, as well as definitions of flags, structures, error
-codes, etc.
-</P>
-<br><a name="SEC8" href="#TOC1">THE LIBRARY NAME</a><br>
-<P>
-In Unix-like systems, the 16-bit library is called <b>libpcre16</b>, and can
-normally be accesss by adding <b>-lpcre16</b> to the command for linking an
-application that uses PCRE.
-</P>
-<br><a name="SEC9" href="#TOC1">STRING TYPES</a><br>
-<P>
-In the 8-bit library, strings are passed to PCRE library functions as vectors
-of bytes with the C type "char *". In the 16-bit library, strings are passed as
-vectors of unsigned 16-bit quantities. The macro PCRE_UCHAR16 specifies an
-appropriate data type, and PCRE_SPTR16 is defined as "const PCRE_UCHAR16 *". In
-very many environments, "short int" is a 16-bit data type. When PCRE is built,
-it defines PCRE_UCHAR16 as "unsigned short int", but checks that it really is a
-16-bit data type. If it is not, the build fails with an error message telling
-the maintainer to modify the definition appropriately.
-</P>
-<br><a name="SEC10" href="#TOC1">STRUCTURE TYPES</a><br>
-<P>
-The types of the opaque structures that are used for compiled 16-bit patterns
-and JIT stacks are <b>pcre16</b> and <b>pcre16_jit_stack</b> respectively. The
-type of the user-accessible structure that is returned by <b>pcre16_study()</b>
-is <b>pcre16_extra</b>, and the type of the structure that is used for passing
-data to a callout function is <b>pcre16_callout_block</b>. These structures
-contain the same fields, with the same names, as their 8-bit counterparts. The
-only difference is that pointers to character strings are 16-bit instead of
-8-bit types.
-</P>
-<br><a name="SEC11" href="#TOC1">16-BIT FUNCTIONS</a><br>
-<P>
-For every function in the 8-bit library there is a corresponding function in
-the 16-bit library with a name that starts with <b>pcre16_</b> instead of
-<b>pcre_</b>. The prototypes are listed above. In addition, there is one extra
-function, <b>pcre16_utf16_to_host_byte_order()</b>. This is a utility function
-that converts a UTF-16 character string to host byte order if necessary. The
-other 16-bit functions expect the strings they are passed to be in host byte
-order.
-</P>
-<P>
-The <i>input</i> and <i>output</i> arguments of
-<b>pcre16_utf16_to_host_byte_order()</b> may point to the same address, that is,
-conversion in place is supported. The output buffer must be at least as long as
-the input.
-</P>
-<P>
-The <i>length</i> argument specifies the number of 16-bit data units in the
-input string; a negative value specifies a zero-terminated string.
-</P>
-<P>
-If <i>byte_order</i> is NULL, it is assumed that the string starts off in host
-byte order. This may be changed by byte-order marks (BOMs) anywhere in the
-string (commonly as the first character).
-</P>
-<P>
-If <i>byte_order</i> is not NULL, a non-zero value of the integer to which it
-points means that the input starts off in host byte order, otherwise the
-opposite order is assumed. Again, BOMs in the string can change this. The final
-byte order is passed back at the end of processing.
-</P>
-<P>
-If <i>keep_boms</i> is not zero, byte-order mark characters (0xfeff) are copied
-into the output string. Otherwise they are discarded.
-</P>
-<P>
-The result of the function is the number of 16-bit units placed into the output
-buffer, including the zero terminator if the string was zero-terminated.
-</P>
-<br><a name="SEC12" href="#TOC1">SUBJECT STRING OFFSETS</a><br>
-<P>
-The lengths and starting offsets of subject strings must be specified in 16-bit
-data units, and the offsets within subject strings that are returned by the
-matching functions are in also 16-bit units rather than bytes.
-</P>
-<br><a name="SEC13" href="#TOC1">NAMED SUBPATTERNS</a><br>
-<P>
-The name-to-number translation table that is maintained for named subpatterns
-uses 16-bit characters. The <b>pcre16_get_stringtable_entries()</b> function
-returns the length of each entry in the table as the number of 16-bit data
-units.
-</P>
-<br><a name="SEC14" href="#TOC1">OPTION NAMES</a><br>
-<P>
-There are two new general option names, PCRE_UTF16 and PCRE_NO_UTF16_CHECK,
-which correspond to PCRE_UTF8 and PCRE_NO_UTF8_CHECK in the 8-bit library. In
-fact, these new options define the same bits in the options word. There is a
-discussion about the
-<a href="pcreunicode.html#utf16strings">validity of UTF-16 strings</a>
-in the
-<a href="pcreunicode.html"><b>pcreunicode</b></a>
-page.
-</P>
-<P>
-For the <b>pcre16_config()</b> function there is an option PCRE_CONFIG_UTF16
-that returns 1 if UTF-16 support is configured, otherwise 0. If this option is
-given to <b>pcre_config()</b> or <b>pcre32_config()</b>, or if the
-PCRE_CONFIG_UTF8 or PCRE_CONFIG_UTF32 option is given to <b>pcre16_config()</b>,
-the result is the PCRE_ERROR_BADOPTION error.
-</P>
-<br><a name="SEC15" href="#TOC1">CHARACTER CODES</a><br>
-<P>
-In 16-bit mode, when PCRE_UTF16 is not set, character values are treated in the
-same way as in 8-bit, non UTF-8 mode, except, of course, that they can range
-from 0 to 0xffff instead of 0 to 0xff. Character types for characters less than
-0xff can therefore be influenced by the locale in the same way as before.
-Characters greater than 0xff have only one case, and no "type" (such as letter
-or digit).
-</P>
-<P>
-In UTF-16 mode, the character code is Unicode, in the range 0 to 0x10ffff, with
-the exception of values in the range 0xd800 to 0xdfff because those are
-"surrogate" values that are used in pairs to encode values greater than 0xffff.
-</P>
-<P>
-A UTF-16 string can indicate its endianness by special code knows as a
-byte-order mark (BOM). The PCRE functions do not handle this, expecting strings
-to be in host byte order. A utility function called
-<b>pcre16_utf16_to_host_byte_order()</b> is provided to help with this (see
-above).
-</P>
-<br><a name="SEC16" href="#TOC1">ERROR NAMES</a><br>
-<P>
-The errors PCRE_ERROR_BADUTF16_OFFSET and PCRE_ERROR_SHORTUTF16 correspond to
-their 8-bit counterparts. The error PCRE_ERROR_BADMODE is given when a compiled
-pattern is passed to a function that processes patterns in the other
-mode, for example, if a pattern compiled with <b>pcre_compile()</b> is passed to
-<b>pcre16_exec()</b>.
-</P>
-<P>
-There are new error codes whose names begin with PCRE_UTF16_ERR for invalid
-UTF-16 strings, corresponding to the PCRE_UTF8_ERR codes for UTF-8 strings that
-are described in the section entitled
-<a href="pcreapi.html#badutf8reasons">"Reason codes for invalid UTF-8 strings"</a>
-in the main
-<a href="pcreapi.html"><b>pcreapi</b></a>
-page. The UTF-16 errors are:
-<pre>
-  PCRE_UTF16_ERR1  Missing low surrogate at end of string
-  PCRE_UTF16_ERR2  Invalid low surrogate follows high surrogate
-  PCRE_UTF16_ERR3  Isolated low surrogate
-  PCRE_UTF16_ERR4  Non-character
-</PRE>
-</P>
-<br><a name="SEC17" href="#TOC1">ERROR TEXTS</a><br>
-<P>
-If there is an error while compiling a pattern, the error text that is passed
-back by <b>pcre16_compile()</b> or <b>pcre16_compile2()</b> is still an 8-bit
-character string, zero-terminated.
-</P>
-<br><a name="SEC18" href="#TOC1">CALLOUTS</a><br>
-<P>
-The <i>subject</i> and <i>mark</i> fields in the callout block that is passed to
-a callout function point to 16-bit vectors.
-</P>
-<br><a name="SEC19" href="#TOC1">TESTING</a><br>
-<P>
-The <b>pcretest</b> program continues to operate with 8-bit input and output
-files, but it can be used for testing the 16-bit library. If it is run with the
-command line option <b>-16</b>, patterns and subject strings are converted from
-8-bit to 16-bit before being passed to PCRE, and the 16-bit library functions
-are used instead of the 8-bit ones. Returned 16-bit strings are converted to
-8-bit for output. If both the 8-bit and the 32-bit libraries were not compiled,
-<b>pcretest</b> defaults to 16-bit and the <b>-16</b> option is ignored.
-</P>
-<P>
-When PCRE is being built, the <b>RunTest</b> script that is called by "make
-check" uses the <b>pcretest</b> <b>-C</b> option to discover which of the 8-bit,
-16-bit and 32-bit libraries has been built, and runs the tests appropriately.
-</P>
-<br><a name="SEC20" href="#TOC1">NOT SUPPORTED IN 16-BIT MODE</a><br>
-<P>
-Not all the features of the 8-bit library are available with the 16-bit
-library. The C++ and POSIX wrapper functions support only the 8-bit library,
-and the <b>pcregrep</b> program is at present 8-bit only.
-</P>
-<br><a name="SEC21" href="#TOC1">AUTHOR</a><br>
-<P>
-Philip Hazel
-<br>
-University Computing Service
-<br>
-Cambridge CB2 3QH, England.
-<br>
-</P>
-<br><a name="SEC22" href="#TOC1">REVISION</a><br>
-<P>
-Last updated: 12 May 2013
-<br>
-Copyright &copy; 1997-2013 University of Cambridge.
-<br>
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
diff --git a/dist/doc/html/pcre32.html b/dist/doc/html/pcre32.html
deleted file mode 100644
index f96876e..0000000
--- a/dist/doc/html/pcre32.html
+++ /dev/null
@@ -1,382 +0,0 @@
-<html>
-<head>
-<title>pcre32 specification</title>
-</head>
-<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
-<h1>pcre32 man page</h1>
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
-<p>
-This page is part of the PCRE HTML documentation. It was generated automatically
-from the original man page. If there is any nonsense in it, please consult the
-man page, in case the conversion went wrong.
-<br>
-<ul>
-<li><a name="TOC1" href="#SEC1">PCRE 32-BIT API BASIC FUNCTIONS</a>
-<li><a name="TOC2" href="#SEC2">PCRE 32-BIT API STRING EXTRACTION FUNCTIONS</a>
-<li><a name="TOC3" href="#SEC3">PCRE 32-BIT API AUXILIARY FUNCTIONS</a>
-<li><a name="TOC4" href="#SEC4">PCRE 32-BIT API INDIRECTED FUNCTIONS</a>
-<li><a name="TOC5" href="#SEC5">PCRE 32-BIT API 32-BIT-ONLY FUNCTION</a>
-<li><a name="TOC6" href="#SEC6">THE PCRE 32-BIT LIBRARY</a>
-<li><a name="TOC7" href="#SEC7">THE HEADER FILE</a>
-<li><a name="TOC8" href="#SEC8">THE LIBRARY NAME</a>
-<li><a name="TOC9" href="#SEC9">STRING TYPES</a>
-<li><a name="TOC10" href="#SEC10">STRUCTURE TYPES</a>
-<li><a name="TOC11" href="#SEC11">32-BIT FUNCTIONS</a>
-<li><a name="TOC12" href="#SEC12">SUBJECT STRING OFFSETS</a>
-<li><a name="TOC13" href="#SEC13">NAMED SUBPATTERNS</a>
-<li><a name="TOC14" href="#SEC14">OPTION NAMES</a>
-<li><a name="TOC15" href="#SEC15">CHARACTER CODES</a>
-<li><a name="TOC16" href="#SEC16">ERROR NAMES</a>
-<li><a name="TOC17" href="#SEC17">ERROR TEXTS</a>
-<li><a name="TOC18" href="#SEC18">CALLOUTS</a>
-<li><a name="TOC19" href="#SEC19">TESTING</a>
-<li><a name="TOC20" href="#SEC20">NOT SUPPORTED IN 32-BIT MODE</a>
-<li><a name="TOC21" href="#SEC21">AUTHOR</a>
-<li><a name="TOC22" href="#SEC22">REVISION</a>
-</ul>
-<P>
-<b>#include &#60;pcre.h&#62;</b>
-</P>
-<br><a name="SEC1" href="#TOC1">PCRE 32-BIT API BASIC FUNCTIONS</a><br>
-<P>
-<b>pcre32 *pcre32_compile(PCRE_SPTR32 <i>pattern</i>, int <i>options</i>,</b>
-<b>     const char **<i>errptr</i>, int *<i>erroffset</i>,</b>
-<b>     const unsigned char *<i>tableptr</i>);</b>
-<br>
-<br>
-<b>pcre32 *pcre32_compile2(PCRE_SPTR32 <i>pattern</i>, int <i>options</i>,</b>
-<b>     int *<i>errorcodeptr</i>,</b>
-<b>     const unsigned char *<i>tableptr</i>);</b>
-<br>
-<br>
-<b>pcre32_extra *pcre32_study(const pcre32 *<i>code</i>, int <i>options</i>,</b>
-<b>     const char **<i>errptr</i>);</b>
-<br>
-<br>
-<b>void pcre32_free_study(pcre32_extra *<i>extra</i>);</b>
-<br>
-<br>
-<b>int pcre32_exec(const pcre32 *<i>code</i>, const pcre32_extra *<i>extra</i>,</b>
-<b>     PCRE_SPTR32 <i>subject</i>, int <i>length</i>, int <i>startoffset</i>,</b>
-<b>     int <i>options</i>, int *<i>ovector</i>, int <i>ovecsize</i>);</b>
-<br>
-<br>
-<b>int pcre32_dfa_exec(const pcre32 *<i>code</i>, const pcre32_extra *<i>extra</i>,</b>
-<b>     PCRE_SPTR32 <i>subject</i>, int <i>length</i>, int <i>startoffset</i>,</b>
-<b>     int <i>options</i>, int *<i>ovector</i>, int <i>ovecsize</i>,</b>
-<b>     int *<i>workspace</i>, int <i>wscount</i>);</b>
-</P>
-<br><a name="SEC2" href="#TOC1">PCRE 32-BIT API STRING EXTRACTION FUNCTIONS</a><br>
-<P>
-<b>int pcre32_copy_named_substring(const pcre32 *<i>code</i>,</b>
-<b>     PCRE_SPTR32 <i>subject</i>, int *<i>ovector</i>,</b>
-<b>     int <i>stringcount</i>, PCRE_SPTR32 <i>stringname</i>,</b>
-<b>     PCRE_UCHAR32 *<i>buffer</i>, int <i>buffersize</i>);</b>
-<br>
-<br>
-<b>int pcre32_copy_substring(PCRE_SPTR32 <i>subject</i>, int *<i>ovector</i>,</b>
-<b>     int <i>stringcount</i>, int <i>stringnumber</i>, PCRE_UCHAR32 *<i>buffer</i>,</b>
-<b>     int <i>buffersize</i>);</b>
-<br>
-<br>
-<b>int pcre32_get_named_substring(const pcre32 *<i>code</i>,</b>
-<b>     PCRE_SPTR32 <i>subject</i>, int *<i>ovector</i>,</b>
-<b>     int <i>stringcount</i>, PCRE_SPTR32 <i>stringname</i>,</b>
-<b>     PCRE_SPTR32 *<i>stringptr</i>);</b>
-<br>
-<br>
-<b>int pcre32_get_stringnumber(const pcre32 *<i>code</i>,</b>
-<b>     PCRE_SPTR32 <i>name</i>);</b>
-<br>
-<br>
-<b>int pcre32_get_stringtable_entries(const pcre32 *<i>code</i>,</b>
-<b>     PCRE_SPTR32 <i>name</i>, PCRE_UCHAR32 **<i>first</i>, PCRE_UCHAR32 **<i>last</i>);</b>
-<br>
-<br>
-<b>int pcre32_get_substring(PCRE_SPTR32 <i>subject</i>, int *<i>ovector</i>,</b>
-<b>     int <i>stringcount</i>, int <i>stringnumber</i>,</b>
-<b>     PCRE_SPTR32 *<i>stringptr</i>);</b>
-<br>
-<br>
-<b>int pcre32_get_substring_list(PCRE_SPTR32 <i>subject</i>,</b>
-<b>     int *<i>ovector</i>, int <i>stringcount</i>, PCRE_SPTR32 **<i>listptr</i>);</b>
-<br>
-<br>
-<b>void pcre32_free_substring(PCRE_SPTR32 <i>stringptr</i>);</b>
-<br>
-<br>
-<b>void pcre32_free_substring_list(PCRE_SPTR32 *<i>stringptr</i>);</b>
-</P>
-<br><a name="SEC3" href="#TOC1">PCRE 32-BIT API AUXILIARY FUNCTIONS</a><br>
-<P>
-<b>pcre32_jit_stack *pcre32_jit_stack_alloc(int <i>startsize</i>, int <i>maxsize</i>);</b>
-<br>
-<br>
-<b>void pcre32_jit_stack_free(pcre32_jit_stack *<i>stack</i>);</b>
-<br>
-<br>
-<b>void pcre32_assign_jit_stack(pcre32_extra *<i>extra</i>,</b>
-<b>     pcre32_jit_callback <i>callback</i>, void *<i>data</i>);</b>
-<br>
-<br>
-<b>const unsigned char *pcre32_maketables(void);</b>
-<br>
-<br>
-<b>int pcre32_fullinfo(const pcre32 *<i>code</i>, const pcre32_extra *<i>extra</i>,</b>
-<b>     int <i>what</i>, void *<i>where</i>);</b>
-<br>
-<br>
-<b>int pcre32_refcount(pcre32 *<i>code</i>, int <i>adjust</i>);</b>
-<br>
-<br>
-<b>int pcre32_config(int <i>what</i>, void *<i>where</i>);</b>
-<br>
-<br>
-<b>const char *pcre32_version(void);</b>
-<br>
-<br>
-<b>int pcre32_pattern_to_host_byte_order(pcre32 *<i>code</i>,</b>
-<b>     pcre32_extra *<i>extra</i>, const unsigned char *<i>tables</i>);</b>
-</P>
-<br><a name="SEC4" href="#TOC1">PCRE 32-BIT API INDIRECTED FUNCTIONS</a><br>
-<P>
-<b>void *(*pcre32_malloc)(size_t);</b>
-<br>
-<br>
-<b>void (*pcre32_free)(void *);</b>
-<br>
-<br>
-<b>void *(*pcre32_stack_malloc)(size_t);</b>
-<br>
-<br>
-<b>void (*pcre32_stack_free)(void *);</b>
-<br>
-<br>
-<b>int (*pcre32_callout)(pcre32_callout_block *);</b>
-</P>
-<br><a name="SEC5" href="#TOC1">PCRE 32-BIT API 32-BIT-ONLY FUNCTION</a><br>
-<P>
-<b>int pcre32_utf32_to_host_byte_order(PCRE_UCHAR32 *<i>output</i>,</b>
-<b>     PCRE_SPTR32 <i>input</i>, int <i>length</i>, int *<i>byte_order</i>,</b>
-<b>     int <i>keep_boms</i>);</b>
-</P>
-<br><a name="SEC6" href="#TOC1">THE PCRE 32-BIT LIBRARY</a><br>
-<P>
-Starting with release 8.32, it is possible to compile a PCRE library that
-supports 32-bit character strings, including UTF-32 strings, as well as or
-instead of the original 8-bit library. This work was done by Christian Persch,
-based on the work done by Zoltan Herczeg for the 16-bit library. All three
-libraries contain identical sets of functions, used in exactly the same way.
-Only the names of the functions and the data types of their arguments and
-results are different. To avoid over-complication and reduce the documentation
-maintenance load, most of the PCRE documentation describes the 8-bit library,
-with only occasional references to the 16-bit and 32-bit libraries. This page
-describes what is different when you use the 32-bit library.
-</P>
-<P>
-WARNING: A single application can be linked with all or any of the three
-libraries, but you must take care when processing any particular pattern
-to use functions from just one library. For example, if you want to study
-a pattern that was compiled with <b>pcre32_compile()</b>, you must do so
-with <b>pcre32_study()</b>, not <b>pcre_study()</b>, and you must free the
-study data with <b>pcre32_free_study()</b>.
-</P>
-<br><a name="SEC7" href="#TOC1">THE HEADER FILE</a><br>
-<P>
-There is only one header file, <b>pcre.h</b>. It contains prototypes for all the
-functions in all libraries, as well as definitions of flags, structures, error
-codes, etc.
-</P>
-<br><a name="SEC8" href="#TOC1">THE LIBRARY NAME</a><br>
-<P>
-In Unix-like systems, the 32-bit library is called <b>libpcre32</b>, and can
-normally be accesss by adding <b>-lpcre32</b> to the command for linking an
-application that uses PCRE.
-</P>
-<br><a name="SEC9" href="#TOC1">STRING TYPES</a><br>
-<P>
-In the 8-bit library, strings are passed to PCRE library functions as vectors
-of bytes with the C type "char *". In the 32-bit library, strings are passed as
-vectors of unsigned 32-bit quantities. The macro PCRE_UCHAR32 specifies an
-appropriate data type, and PCRE_SPTR32 is defined as "const PCRE_UCHAR32 *". In
-very many environments, "unsigned int" is a 32-bit data type. When PCRE is
-built, it defines PCRE_UCHAR32 as "unsigned int", but checks that it really is
-a 32-bit data type. If it is not, the build fails with an error message telling
-the maintainer to modify the definition appropriately.
-</P>
-<br><a name="SEC10" href="#TOC1">STRUCTURE TYPES</a><br>
-<P>
-The types of the opaque structures that are used for compiled 32-bit patterns
-and JIT stacks are <b>pcre32</b> and <b>pcre32_jit_stack</b> respectively. The
-type of the user-accessible structure that is returned by <b>pcre32_study()</b>
-is <b>pcre32_extra</b>, and the type of the structure that is used for passing
-data to a callout function is <b>pcre32_callout_block</b>. These structures
-contain the same fields, with the same names, as their 8-bit counterparts. The
-only difference is that pointers to character strings are 32-bit instead of
-8-bit types.
-</P>
-<br><a name="SEC11" href="#TOC1">32-BIT FUNCTIONS</a><br>
-<P>
-For every function in the 8-bit library there is a corresponding function in
-the 32-bit library with a name that starts with <b>pcre32_</b> instead of
-<b>pcre_</b>. The prototypes are listed above. In addition, there is one extra
-function, <b>pcre32_utf32_to_host_byte_order()</b>. This is a utility function
-that converts a UTF-32 character string to host byte order if necessary. The
-other 32-bit functions expect the strings they are passed to be in host byte
-order.
-</P>
-<P>
-The <i>input</i> and <i>output</i> arguments of
-<b>pcre32_utf32_to_host_byte_order()</b> may point to the same address, that is,
-conversion in place is supported. The output buffer must be at least as long as
-the input.
-</P>
-<P>
-The <i>length</i> argument specifies the number of 32-bit data units in the
-input string; a negative value specifies a zero-terminated string.
-</P>
-<P>
-If <i>byte_order</i> is NULL, it is assumed that the string starts off in host
-byte order. This may be changed by byte-order marks (BOMs) anywhere in the
-string (commonly as the first character).
-</P>
-<P>
-If <i>byte_order</i> is not NULL, a non-zero value of the integer to which it
-points means that the input starts off in host byte order, otherwise the
-opposite order is assumed. Again, BOMs in the string can change this. The final
-byte order is passed back at the end of processing.
-</P>
-<P>
-If <i>keep_boms</i> is not zero, byte-order mark characters (0xfeff) are copied
-into the output string. Otherwise they are discarded.
-</P>
-<P>
-The result of the function is the number of 32-bit units placed into the output
-buffer, including the zero terminator if the string was zero-terminated.
-</P>
-<br><a name="SEC12" href="#TOC1">SUBJECT STRING OFFSETS</a><br>
-<P>
-The lengths and starting offsets of subject strings must be specified in 32-bit
-data units, and the offsets within subject strings that are returned by the
-matching functions are in also 32-bit units rather than bytes.
-</P>
-<br><a name="SEC13" href="#TOC1">NAMED SUBPATTERNS</a><br>
-<P>
-The name-to-number translation table that is maintained for named subpatterns
-uses 32-bit characters. The <b>pcre32_get_stringtable_entries()</b> function
-returns the length of each entry in the table as the number of 32-bit data
-units.
-</P>
-<br><a name="SEC14" href="#TOC1">OPTION NAMES</a><br>
-<P>
-There are two new general option names, PCRE_UTF32 and PCRE_NO_UTF32_CHECK,
-which correspond to PCRE_UTF8 and PCRE_NO_UTF8_CHECK in the 8-bit library. In
-fact, these new options define the same bits in the options word. There is a
-discussion about the
-<a href="pcreunicode.html#utf32strings">validity of UTF-32 strings</a>
-in the
-<a href="pcreunicode.html"><b>pcreunicode</b></a>
-page.
-</P>
-<P>
-For the <b>pcre32_config()</b> function there is an option PCRE_CONFIG_UTF32
-that returns 1 if UTF-32 support is configured, otherwise 0. If this option is
-given to <b>pcre_config()</b> or <b>pcre16_config()</b>, or if the
-PCRE_CONFIG_UTF8 or PCRE_CONFIG_UTF16 option is given to <b>pcre32_config()</b>,
-the result is the PCRE_ERROR_BADOPTION error.
-</P>
-<br><a name="SEC15" href="#TOC1">CHARACTER CODES</a><br>
-<P>
-In 32-bit mode, when PCRE_UTF32 is not set, character values are treated in the
-same way as in 8-bit, non UTF-8 mode, except, of course, that they can range
-from 0 to 0x7fffffff instead of 0 to 0xff. Character types for characters less
-than 0xff can therefore be influenced by the locale in the same way as before.
-Characters greater than 0xff have only one case, and no "type" (such as letter
-or digit).
-</P>
-<P>
-In UTF-32 mode, the character code is Unicode, in the range 0 to 0x10ffff, with
-the exception of values in the range 0xd800 to 0xdfff because those are
-"surrogate" values that are ill-formed in UTF-32.
-</P>
-<P>
-A UTF-32 string can indicate its endianness by special code knows as a
-byte-order mark (BOM). The PCRE functions do not handle this, expecting strings
-to be in host byte order. A utility function called
-<b>pcre32_utf32_to_host_byte_order()</b> is provided to help with this (see
-above).
-</P>
-<br><a name="SEC16" href="#TOC1">ERROR NAMES</a><br>
-<P>
-The error PCRE_ERROR_BADUTF32 corresponds to its 8-bit counterpart.
-The error PCRE_ERROR_BADMODE is given when a compiled
-pattern is passed to a function that processes patterns in the other
-mode, for example, if a pattern compiled with <b>pcre_compile()</b> is passed to
-<b>pcre32_exec()</b>.
-</P>
-<P>
-There are new error codes whose names begin with PCRE_UTF32_ERR for invalid
-UTF-32 strings, corresponding to the PCRE_UTF8_ERR codes for UTF-8 strings that
-are described in the section entitled
-<a href="pcreapi.html#badutf8reasons">"Reason codes for invalid UTF-8 strings"</a>
-in the main
-<a href="pcreapi.html"><b>pcreapi</b></a>
-page. The UTF-32 errors are:
-<pre>
-  PCRE_UTF32_ERR1  Surrogate character (range from 0xd800 to 0xdfff)
-  PCRE_UTF32_ERR2  Non-character
-  PCRE_UTF32_ERR3  Character &#62; 0x10ffff
-</PRE>
-</P>
-<br><a name="SEC17" href="#TOC1">ERROR TEXTS</a><br>
-<P>
-If there is an error while compiling a pattern, the error text that is passed
-back by <b>pcre32_compile()</b> or <b>pcre32_compile2()</b> is still an 8-bit
-character string, zero-terminated.
-</P>
-<br><a name="SEC18" href="#TOC1">CALLOUTS</a><br>
-<P>
-The <i>subject</i> and <i>mark</i> fields in the callout block that is passed to
-a callout function point to 32-bit vectors.
-</P>
-<br><a name="SEC19" href="#TOC1">TESTING</a><br>
-<P>
-The <b>pcretest</b> program continues to operate with 8-bit input and output
-files, but it can be used for testing the 32-bit library. If it is run with the
-command line option <b>-32</b>, patterns and subject strings are converted from
-8-bit to 32-bit before being passed to PCRE, and the 32-bit library functions
-are used instead of the 8-bit ones. Returned 32-bit strings are converted to
-8-bit for output. If both the 8-bit and the 16-bit libraries were not compiled,
-<b>pcretest</b> defaults to 32-bit and the <b>-32</b> option is ignored.
-</P>
-<P>
-When PCRE is being built, the <b>RunTest</b> script that is called by "make
-check" uses the <b>pcretest</b> <b>-C</b> option to discover which of the 8-bit,
-16-bit and 32-bit libraries has been built, and runs the tests appropriately.
-</P>
-<br><a name="SEC20" href="#TOC1">NOT SUPPORTED IN 32-BIT MODE</a><br>
-<P>
-Not all the features of the 8-bit library are available with the 32-bit
-library. The C++ and POSIX wrapper functions support only the 8-bit library,
-and the <b>pcregrep</b> program is at present 8-bit only.
-</P>
-<br><a name="SEC21" href="#TOC1">AUTHOR</a><br>
-<P>
-Philip Hazel
-<br>
-University Computing Service
-<br>
-Cambridge CB2 3QH, England.
-<br>
-</P>
-<br><a name="SEC22" href="#TOC1">REVISION</a><br>
-<P>
-Last updated: 12 May 2013
-<br>
-Copyright &copy; 1997-2013 University of Cambridge.
-<br>
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
diff --git a/dist/doc/html/pcre_assign_jit_stack.html b/dist/doc/html/pcre_assign_jit_stack.html
deleted file mode 100644
index b2eef70..0000000
--- a/dist/doc/html/pcre_assign_jit_stack.html
+++ /dev/null
@@ -1,76 +0,0 @@
-<html>
-<head>
-<title>pcre_assign_jit_stack specification</title>
-</head>
-<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
-<h1>pcre_assign_jit_stack man page</h1>
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
-<p>
-This page is part of the PCRE HTML documentation. It was generated automatically
-from the original man page. If there is any nonsense in it, please consult the
-man page, in case the conversion went wrong.
-<br>
-<br><b>
-SYNOPSIS
-</b><br>
-<P>
-<b>#include &#60;pcre.h&#62;</b>
-</P>
-<P>
-<b>void pcre_assign_jit_stack(pcre_extra *<i>extra</i>,</b>
-<b>     pcre_jit_callback <i>callback</i>, void *<i>data</i>);</b>
-<br>
-<br>
-<b>void pcre16_assign_jit_stack(pcre16_extra *<i>extra</i>,</b>
-<b>     pcre16_jit_callback <i>callback</i>, void *<i>data</i>);</b>
-<br>
-<br>
-<b>void pcre32_assign_jit_stack(pcre32_extra *<i>extra</i>,</b>
-<b>     pcre32_jit_callback <i>callback</i>, void *<i>data</i>);</b>
-</P>
-<br><b>
-DESCRIPTION
-</b><br>
-<P>
-This function provides control over the memory used as a stack at run-time by a
-call to <b>pcre[16|32]_exec()</b> with a pattern that has been successfully
-compiled with JIT optimization. The arguments are:
-<pre>
-  extra     the data pointer returned by <b>pcre[16|32]_study()</b>
-  callback  a callback function
-  data      a JIT stack or a value to be passed to the callback
-              function
-</PRE>
-</P>
-<P>
-If <i>callback</i> is NULL and <i>data</i> is NULL, an internal 32K block on
-the machine stack is used.
-</P>
-<P>
-If <i>callback</i> is NULL and <i>data</i> is not NULL, <i>data</i> must
-be a valid JIT stack, the result of calling <b>pcre[16|32]_jit_stack_alloc()</b>.
-</P>
-<P>
-If <i>callback</i> not NULL, it is called with <i>data</i> as an argument at
-the start of matching, in order to set up a JIT stack. If the result is NULL,
-the internal 32K stack is used; otherwise the return value must be a valid JIT
-stack, the result of calling <b>pcre[16|32]_jit_stack_alloc()</b>.
-</P>
-<P>
-You may safely assign the same JIT stack to multiple patterns, as long as they
-are all matched in the same thread. In a multithread application, each thread
-must use its own JIT stack. For more details, see the
-<a href="pcrejit.html"><b>pcrejit</b></a>
-page.
-</P>
-<P>
-There is a complete description of the PCRE native API in the
-<a href="pcreapi.html"><b>pcreapi</b></a>
-page and a description of the POSIX API in the
-<a href="pcreposix.html"><b>pcreposix</b></a>
-page.
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
diff --git a/dist/doc/html/pcre_compile.html b/dist/doc/html/pcre_compile.html
deleted file mode 100644
index 95b4bec..0000000
--- a/dist/doc/html/pcre_compile.html
+++ /dev/null
@@ -1,111 +0,0 @@
-<html>
-<head>
-<title>pcre_compile specification</title>
-</head>
-<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
-<h1>pcre_compile man page</h1>
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
-<p>
-This page is part of the PCRE HTML documentation. It was generated automatically
-from the original man page. If there is any nonsense in it, please consult the
-man page, in case the conversion went wrong.
-<br>
-<br><b>
-SYNOPSIS
-</b><br>
-<P>
-<b>#include &#60;pcre.h&#62;</b>
-</P>
-<P>
-<b>pcre *pcre_compile(const char *<i>pattern</i>, int <i>options</i>,</b>
-<b>     const char **<i>errptr</i>, int *<i>erroffset</i>,</b>
-<b>     const unsigned char *<i>tableptr</i>);</b>
-<br>
-<br>
-<b>pcre16 *pcre16_compile(PCRE_SPTR16 <i>pattern</i>, int <i>options</i>,</b>
-<b>     const char **<i>errptr</i>, int *<i>erroffset</i>,</b>
-<b>     const unsigned char *<i>tableptr</i>);</b>
-<br>
-<br>
-<b>pcre32 *pcre32_compile(PCRE_SPTR32 <i>pattern</i>, int <i>options</i>,</b>
-<b>     const char **<i>errptr</i>, int *<i>erroffset</i>,</b>
-<b>     const unsigned char *<i>tableptr</i>);</b>
-</P>
-<br><b>
-DESCRIPTION
-</b><br>
-<P>
-This function compiles a regular expression into an internal form. It is the
-same as <b>pcre[16|32]_compile2()</b>, except for the absence of the
-<i>errorcodeptr</i> argument. Its arguments are:
-<pre>
-  <i>pattern</i>       A zero-terminated string containing the
-                  regular expression to be compiled
-  <i>options</i>       Zero or more option bits
-  <i>errptr</i>        Where to put an error message
-  <i>erroffset</i>     Offset in pattern where error was found
-  <i>tableptr</i>      Pointer to character tables, or NULL to
-                  use the built-in default
-</pre>
-The option bits are:
-<pre>
-  PCRE_ANCHORED           Force pattern anchoring
-  PCRE_AUTO_CALLOUT       Compile automatic callouts
-  PCRE_BSR_ANYCRLF        \R matches only CR, LF, or CRLF
-  PCRE_BSR_UNICODE        \R matches all Unicode line endings
-  PCRE_CASELESS           Do caseless matching
-  PCRE_DOLLAR_ENDONLY     $ not to match newline at end
-  PCRE_DOTALL             . matches anything including NL
-  PCRE_DUPNAMES           Allow duplicate names for subpatterns
-  PCRE_EXTENDED           Ignore white space and # comments
-  PCRE_EXTRA              PCRE extra features
-                            (not much use currently)
-  PCRE_FIRSTLINE          Force matching to be before newline
-  PCRE_JAVASCRIPT_COMPAT  JavaScript compatibility
-  PCRE_MULTILINE          ^ and $ match newlines within data
-  PCRE_NEVER_UTF          Lock out UTF, e.g. via (*UTF)
-  PCRE_NEWLINE_ANY        Recognize any Unicode newline sequence
-  PCRE_NEWLINE_ANYCRLF    Recognize CR, LF, and CRLF as newline
-                            sequences
-  PCRE_NEWLINE_CR         Set CR as the newline sequence
-  PCRE_NEWLINE_CRLF       Set CRLF as the newline sequence
-  PCRE_NEWLINE_LF         Set LF as the newline sequence
-  PCRE_NO_AUTO_CAPTURE    Disable numbered capturing paren-
-                            theses (named ones available)
-  PCRE_NO_AUTO_POSSESS    Disable auto-possessification
-  PCRE_NO_START_OPTIMIZE  Disable match-time start optimizations
-  PCRE_NO_UTF16_CHECK     Do not check the pattern for UTF-16
-                            validity (only relevant if
-                            PCRE_UTF16 is set)
-  PCRE_NO_UTF32_CHECK     Do not check the pattern for UTF-32
-                            validity (only relevant if
-                            PCRE_UTF32 is set)
-  PCRE_NO_UTF8_CHECK      Do not check the pattern for UTF-8
-                            validity (only relevant if
-                            PCRE_UTF8 is set)
-  PCRE_UCP                Use Unicode properties for \d, \w, etc.
-  PCRE_UNGREEDY           Invert greediness of quantifiers
-  PCRE_UTF16              Run in <b>pcre16_compile()</b> UTF-16 mode
-  PCRE_UTF32              Run in <b>pcre32_compile()</b> UTF-32 mode
-  PCRE_UTF8               Run in <b>pcre_compile()</b> UTF-8 mode
-</pre>
-PCRE must be built with UTF support in order to use PCRE_UTF8/16/32 and
-PCRE_NO_UTF8/16/32_CHECK, and with UCP support if PCRE_UCP is used.
-</P>
-<P>
-The yield of the function is a pointer to a private data structure that
-contains the compiled pattern, or NULL if an error was detected. Note that
-compiling regular expressions with one version of PCRE for use with a different
-version is not guaranteed to work and may cause crashes.
-</P>
-<P>
-There is a complete description of the PCRE native API in the
-<a href="pcreapi.html"><b>pcreapi</b></a>
-page and a description of the POSIX API in the
-<a href="pcreposix.html"><b>pcreposix</b></a>
-page.
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
diff --git a/dist/doc/html/pcre_compile2.html b/dist/doc/html/pcre_compile2.html
deleted file mode 100644
index 9cd56a2..0000000
--- a/dist/doc/html/pcre_compile2.html
+++ /dev/null
@@ -1,115 +0,0 @@
-<html>
-<head>
-<title>pcre_compile2 specification</title>
-</head>
-<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
-<h1>pcre_compile2 man page</h1>
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
-<p>
-This page is part of the PCRE HTML documentation. It was generated automatically
-from the original man page. If there is any nonsense in it, please consult the
-man page, in case the conversion went wrong.
-<br>
-<br><b>
-SYNOPSIS
-</b><br>
-<P>
-<b>#include &#60;pcre.h&#62;</b>
-</P>
-<P>
-<b>pcre *pcre_compile2(const char *<i>pattern</i>, int <i>options</i>,</b>
-<b>     int *<i>errorcodeptr</i>,</b>
-<b>     const char **<i>errptr</i>, int *<i>erroffset</i>,</b>
-<b>     const unsigned char *<i>tableptr</i>);</b>
-<br>
-<br>
-<b>pcre16 *pcre16_compile2(PCRE_SPTR16 <i>pattern</i>, int <i>options</i>,</b>
-<b>     int *<i>errorcodeptr</i>,</b>
-<b>     const char **<i>errptr</i>, int *<i>erroffset</i>,</b>
-<b>     const unsigned char *<i>tableptr</i>);</b>
-<br>
-<br>
-<b>pcre32 *pcre32_compile2(PCRE_SPTR32 <i>pattern</i>, int <i>options</i>,</b>
-<b>"     int *<i>errorcodeptr</i>,£</b>
-<b>     const char **<i>errptr</i>, int *<i>erroffset</i>,</b>
-<b>     const unsigned char *<i>tableptr</i>);</b>
-</P>
-<br><b>
-DESCRIPTION
-</b><br>
-<P>
-This function compiles a regular expression into an internal form. It is the
-same as <b>pcre[16|32]_compile()</b>, except for the addition of the
-<i>errorcodeptr</i> argument. The arguments are:
-<pre>
-  <i>pattern</i>       A zero-terminated string containing the
-                  regular expression to be compiled
-  <i>options</i>       Zero or more option bits
-  <i>errorcodeptr</i>  Where to put an error code
-  <i>errptr</i>        Where to put an error message
-  <i>erroffset</i>     Offset in pattern where error was found
-  <i>tableptr</i>      Pointer to character tables, or NULL to
-                  use the built-in default
-</pre>
-The option bits are:
-<pre>
-  PCRE_ANCHORED           Force pattern anchoring
-  PCRE_AUTO_CALLOUT       Compile automatic callouts
-  PCRE_BSR_ANYCRLF        \R matches only CR, LF, or CRLF
-  PCRE_BSR_UNICODE        \R matches all Unicode line endings
-  PCRE_CASELESS           Do caseless matching
-  PCRE_DOLLAR_ENDONLY     $ not to match newline at end
-  PCRE_DOTALL             . matches anything including NL
-  PCRE_DUPNAMES           Allow duplicate names for subpatterns
-  PCRE_EXTENDED           Ignore white space and # comments
-  PCRE_EXTRA              PCRE extra features
-                            (not much use currently)
-  PCRE_FIRSTLINE          Force matching to be before newline
-  PCRE_JAVASCRIPT_COMPAT  JavaScript compatibility
-  PCRE_MULTILINE          ^ and $ match newlines within data
-  PCRE_NEVER_UTF          Lock out UTF, e.g. via (*UTF)
-  PCRE_NEWLINE_ANY        Recognize any Unicode newline sequence
-  PCRE_NEWLINE_ANYCRLF    Recognize CR, LF, and CRLF as newline
-                            sequences
-  PCRE_NEWLINE_CR         Set CR as the newline sequence
-  PCRE_NEWLINE_CRLF       Set CRLF as the newline sequence
-  PCRE_NEWLINE_LF         Set LF as the newline sequence
-  PCRE_NO_AUTO_CAPTURE    Disable numbered capturing paren-
-                            theses (named ones available)
-  PCRE_NO_AUTO_POSSESS    Disable auto-possessification
-  PCRE_NO_START_OPTIMIZE  Disable match-time start optimizations
-  PCRE_NO_UTF16_CHECK     Do not check the pattern for UTF-16
-                            validity (only relevant if
-                            PCRE_UTF16 is set)
-  PCRE_NO_UTF32_CHECK     Do not check the pattern for UTF-32
-                            validity (only relevant if
-                            PCRE_UTF32 is set)
-  PCRE_NO_UTF8_CHECK      Do not check the pattern for UTF-8
-                            validity (only relevant if
-                            PCRE_UTF8 is set)
-  PCRE_UCP                Use Unicode properties for \d, \w, etc.
-  PCRE_UNGREEDY           Invert greediness of quantifiers
-  PCRE_UTF16              Run <b>pcre16_compile()</b> in UTF-16 mode
-  PCRE_UTF32              Run <b>pcre32_compile()</b> in UTF-32 mode
-  PCRE_UTF8               Run <b>pcre_compile()</b> in UTF-8 mode
-</pre>
-PCRE must be built with UTF support in order to use PCRE_UTF8/16/32 and
-PCRE_NO_UTF8/16/32_CHECK, and with UCP support if PCRE_UCP is used.
-</P>
-<P>
-The yield of the function is a pointer to a private data structure that
-contains the compiled pattern, or NULL if an error was detected. Note that
-compiling regular expressions with one version of PCRE for use with a different
-version is not guaranteed to work and may cause crashes.
-</P>
-<P>
-There is a complete description of the PCRE native API in the
-<a href="pcreapi.html"><b>pcreapi</b></a>
-page and a description of the POSIX API in the
-<a href="pcreposix.html"><b>pcreposix</b></a>
-page.
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
diff --git a/dist/doc/html/pcre_config.html b/dist/doc/html/pcre_config.html
deleted file mode 100644
index 72fb9ca..0000000
--- a/dist/doc/html/pcre_config.html
+++ /dev/null
@@ -1,94 +0,0 @@
-<html>
-<head>
-<title>pcre_config specification</title>
-</head>
-<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
-<h1>pcre_config man page</h1>
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
-<p>
-This page is part of the PCRE HTML documentation. It was generated automatically
-from the original man page. If there is any nonsense in it, please consult the
-man page, in case the conversion went wrong.
-<br>
-<br><b>
-SYNOPSIS
-</b><br>
-<P>
-<b>#include &#60;pcre.h&#62;</b>
-</P>
-<P>
-<b>int pcre_config(int <i>what</i>, void *<i>where</i>);</b>
-</P>
-<P>
-<b>int pcre16_config(int <i>what</i>, void *<i>where</i>);</b>
-</P>
-<P>
-<b>int pcre32_config(int <i>what</i>, void *<i>where</i>);</b>
-</P>
-<br><b>
-DESCRIPTION
-</b><br>
-<P>
-This function makes it possible for a client program to find out which optional
-features are available in the version of the PCRE library it is using. The
-arguments are as follows:
-<pre>
-  <i>what</i>     A code specifying what information is required
-  <i>where</i>    Points to where to put the data
-</pre>
-The <i>where</i> argument must point to an integer variable, except for
-PCRE_CONFIG_MATCH_LIMIT, PCRE_CONFIG_MATCH_LIMIT_RECURSION, and
-PCRE_CONFIG_PARENS_LIMIT, when it must point to an unsigned long integer,
-and for PCRE_CONFIG_JITTARGET, when it must point to a const char*.
-The available codes are:
-<pre>
-  PCRE_CONFIG_JIT           Availability of just-in-time compiler
-                              support (1=yes 0=no)
-  PCRE_CONFIG_JITTARGET     String containing information about the
-                              target architecture for the JIT compiler,
-                              or NULL if there is no JIT support
-  PCRE_CONFIG_LINK_SIZE     Internal link size: 2, 3, or 4
-  PCRE_CONFIG_PARENS_LIMIT  Parentheses nesting limit
-  PCRE_CONFIG_MATCH_LIMIT   Internal resource limit
-  PCRE_CONFIG_MATCH_LIMIT_RECURSION
-                            Internal recursion depth limit
-  PCRE_CONFIG_NEWLINE       Value of the default newline sequence:
-                                13 (0x000d)    for CR
-                                10 (0x000a)    for LF
-                              3338 (0x0d0a)    for CRLF
-                                -2             for ANYCRLF
-                                -1             for ANY
-  PCRE_CONFIG_BSR           Indicates what \R matches by default:
-                                 0             all Unicode line endings
-                                 1             CR, LF, or CRLF only
-  PCRE_CONFIG_POSIX_MALLOC_THRESHOLD
-                            Threshold of return slots, above which
-                              <b>malloc()</b> is used by the POSIX API
-  PCRE_CONFIG_STACKRECURSE  Recursion implementation (1=stack 0=heap)
-  PCRE_CONFIG_UTF16         Availability of UTF-16 support (1=yes
-                               0=no); option for <b>pcre16_config()</b>
-  PCRE_CONFIG_UTF32         Availability of UTF-32 support (1=yes
-                               0=no); option for <b>pcre32_config()</b>
-  PCRE_CONFIG_UTF8          Availability of UTF-8 support (1=yes 0=no);
-                              option for <b>pcre_config()</b>
-  PCRE_CONFIG_UNICODE_PROPERTIES
-                            Availability of Unicode property support
-                              (1=yes 0=no)
-</pre>
-The function yields 0 on success or PCRE_ERROR_BADOPTION otherwise. That error
-is also given if PCRE_CONFIG_UTF16 or PCRE_CONFIG_UTF32 is passed to
-<b>pcre_config()</b>, if PCRE_CONFIG_UTF8 or PCRE_CONFIG_UTF32 is passed to
-<b>pcre16_config()</b>, or if PCRE_CONFIG_UTF8 or PCRE_CONFIG_UTF16 is passed to
-<b>pcre32_config()</b>.
-</P>
-<P>
-There is a complete description of the PCRE native API in the
-<a href="pcreapi.html"><b>pcreapi</b></a>
-page and a description of the POSIX API in the
-<a href="pcreposix.html"><b>pcreposix</b></a>
-page.
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
diff --git a/dist/doc/html/pcre_copy_named_substring.html b/dist/doc/html/pcre_copy_named_substring.html
deleted file mode 100644
index 77b4804..0000000
--- a/dist/doc/html/pcre_copy_named_substring.html
+++ /dev/null
@@ -1,65 +0,0 @@
-<html>
-<head>
-<title>pcre_copy_named_substring specification</title>
-</head>
-<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
-<h1>pcre_copy_named_substring man page</h1>
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
-<p>
-This page is part of the PCRE HTML documentation. It was generated automatically
-from the original man page. If there is any nonsense in it, please consult the
-man page, in case the conversion went wrong.
-<br>
-<br><b>
-SYNOPSIS
-</b><br>
-<P>
-<b>#include &#60;pcre.h&#62;</b>
-</P>
-<P>
-<b>int pcre_copy_named_substring(const pcre *<i>code</i>,</b>
-<b>     const char *<i>subject</i>, int *<i>ovector</i>,</b>
-<b>     int <i>stringcount</i>, const char *<i>stringname</i>,</b>
-<b>     char *<i>buffer</i>, int <i>buffersize</i>);</b>
-<br>
-<br>
-<b>int pcre16_copy_named_substring(const pcre16 *<i>code</i>,</b>
-<b>     PCRE_SPTR16 <i>subject</i>, int *<i>ovector</i>,</b>
-<b>     int <i>stringcount</i>, PCRE_SPTR16 <i>stringname</i>,</b>
-<b>     PCRE_UCHAR16 *<i>buffer</i>, int <i>buffersize</i>);</b>
-<br>
-<br>
-<b>int pcre32_copy_named_substring(const pcre32 *<i>code</i>,</b>
-<b>     PCRE_SPTR32 <i>subject</i>, int *<i>ovector</i>,</b>
-<b>     int <i>stringcount</i>, PCRE_SPTR32 <i>stringname</i>,</b>
-<b>     PCRE_UCHAR32 *<i>buffer</i>, int <i>buffersize</i>);</b>
-</P>
-<br><b>
-DESCRIPTION
-</b><br>
-<P>
-This is a convenience function for extracting a captured substring, identified
-by name, into a given buffer. The arguments are:
-<pre>
-  <i>code</i>          Pattern that was successfully matched
-  <i>subject</i>       Subject that has been successfully matched
-  <i>ovector</i>       Offset vector that <b>pcre[16|32]_exec()</b> used
-  <i>stringcount</i>   Value returned by <b>pcre[16|32]_exec()</b>
-  <i>stringname</i>    Name of the required substring
-  <i>buffer</i>        Buffer to receive the string
-  <i>buffersize</i>    Size of buffer
-</pre>
-The yield is the length of the substring, PCRE_ERROR_NOMEMORY if the buffer was
-too small, or PCRE_ERROR_NOSUBSTRING if the string name is invalid.
-</P>
-<P>
-There is a complete description of the PCRE native API in the
-<a href="pcreapi.html"><b>pcreapi</b></a>
-page and a description of the POSIX API in the
-<a href="pcreposix.html"><b>pcreposix</b></a>
-page.
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
diff --git a/dist/doc/html/pcre_copy_substring.html b/dist/doc/html/pcre_copy_substring.html
deleted file mode 100644
index ecaebe8..0000000
--- a/dist/doc/html/pcre_copy_substring.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<html>
-<head>
-<title>pcre_copy_substring specification</title>
-</head>
-<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
-<h1>pcre_copy_substring man page</h1>
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
-<p>
-This page is part of the PCRE HTML documentation. It was generated automatically
-from the original man page. If there is any nonsense in it, please consult the
-man page, in case the conversion went wrong.
-<br>
-<br><b>
-SYNOPSIS
-</b><br>
-<P>
-<b>#include &#60;pcre.h&#62;</b>
-</P>
-<P>
-<b>int pcre_copy_substring(const char *<i>subject</i>, int *<i>ovector</i>,</b>
-<b>     int <i>stringcount</i>, int <i>stringnumber</i>, char *<i>buffer</i>,</b>
-<b>     int <i>buffersize</i>);</b>
-<br>
-<br>
-<b>int pcre16_copy_substring(PCRE_SPTR16 <i>subject</i>, int *<i>ovector</i>,</b>
-<b>     int <i>stringcount</i>, int <i>stringnumber</i>, PCRE_UCHAR16 *<i>buffer</i>,</b>
-<b>     int <i>buffersize</i>);</b>
-<br>
-<br>
-<b>int pcre32_copy_substring(PCRE_SPTR32 <i>subject</i>, int *<i>ovector</i>,</b>
-<b>     int <i>stringcount</i>, int <i>stringnumber</i>, PCRE_UCHAR32 *<i>buffer</i>,</b>
-<b>     int <i>buffersize</i>);</b>
-</P>
-<br><b>
-DESCRIPTION
-</b><br>
-<P>
-This is a convenience function for extracting a captured substring into a given
-buffer. The arguments are:
-<pre>
-  <i>subject</i>       Subject that has been successfully matched
-  <i>ovector</i>       Offset vector that <b>pcre[16|32]_exec()</b> used
-  <i>stringcount</i>   Value returned by <b>pcre[16|32]_exec()</b>
-  <i>stringnumber</i>  Number of the required substring
-  <i>buffer</i>        Buffer to receive the string
-  <i>buffersize</i>    Size of buffer
-</pre>
-The yield is the length of the string, PCRE_ERROR_NOMEMORY if the buffer was
-too small, or PCRE_ERROR_NOSUBSTRING if the string number is invalid.
-</P>
-<P>
-There is a complete description of the PCRE native API in the
-<a href="pcreapi.html"><b>pcreapi</b></a>
-page and a description of the POSIX API in the
-<a href="pcreposix.html"><b>pcreposix</b></a>
-page.
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
diff --git a/dist/doc/html/pcre_dfa_exec.html b/dist/doc/html/pcre_dfa_exec.html
deleted file mode 100644
index 5fff6a7..0000000
--- a/dist/doc/html/pcre_dfa_exec.html
+++ /dev/null
@@ -1,129 +0,0 @@
-<html>
-<head>
-<title>pcre_dfa_exec specification</title>
-</head>
-<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
-<h1>pcre_dfa_exec man page</h1>
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
-<p>
-This page is part of the PCRE HTML documentation. It was generated automatically
-from the original man page. If there is any nonsense in it, please consult the
-man page, in case the conversion went wrong.
-<br>
-<br><b>
-SYNOPSIS
-</b><br>
-<P>
-<b>#include &#60;pcre.h&#62;</b>
-</P>
-<P>
-<b>int pcre_dfa_exec(const pcre *<i>code</i>, const pcre_extra *<i>extra</i>,</b>
-<b>     const char *<i>subject</i>, int <i>length</i>, int <i>startoffset</i>,</b>
-<b>     int <i>options</i>, int *<i>ovector</i>, int <i>ovecsize</i>,</b>
-<b>     int *<i>workspace</i>, int <i>wscount</i>);</b>
-<br>
-<br>
-<b>int pcre16_dfa_exec(const pcre16 *<i>code</i>, const pcre16_extra *<i>extra</i>,</b>
-<b>     PCRE_SPTR16 <i>subject</i>, int <i>length</i>, int <i>startoffset</i>,</b>
-<b>     int <i>options</i>, int *<i>ovector</i>, int <i>ovecsize</i>,</b>
-<b>     int *<i>workspace</i>, int <i>wscount</i>);</b>
-<br>
-<br>
-<b>int pcre32_dfa_exec(const pcre32 *<i>code</i>, const pcre32_extra *<i>extra</i>,</b>
-<b>     PCRE_SPTR32 <i>subject</i>, int <i>length</i>, int <i>startoffset</i>,</b>
-<b>     int <i>options</i>, int *<i>ovector</i>, int <i>ovecsize</i>,</b>
-<b>     int *<i>workspace</i>, int <i>wscount</i>);</b>
-</P>
-<br><b>
-DESCRIPTION
-</b><br>
-<P>
-This function matches a compiled regular expression against a given subject
-string, using an alternative matching algorithm that scans the subject string
-just once (<i>not</i> Perl-compatible). Note that the main, Perl-compatible,
-matching function is <b>pcre[16|32]_exec()</b>. The arguments for this function
-are:
-<pre>
-  <i>code</i>         Points to the compiled pattern
-  <i>extra</i>        Points to an associated <b>pcre[16|32]_extra</b> structure,
-                 or is NULL
-  <i>subject</i>      Points to the subject string
-  <i>length</i>       Length of the subject string
-  <i>startoffset</i>  Offset in the subject at which to start matching
-  <i>options</i>      Option bits
-  <i>ovector</i>      Points to a vector of ints for result offsets
-  <i>ovecsize</i>     Number of elements in the vector
-  <i>workspace</i>    Points to a vector of ints used as working space
-  <i>wscount</i>      Number of elements in the vector
-</pre>
-The units for <i>length</i> and <i>startoffset</i> are bytes for
-<b>pcre_exec()</b>, 16-bit data items for <b>pcre16_exec()</b>, and 32-bit items
-for <b>pcre32_exec()</b>. The options are:
-<pre>
-  PCRE_ANCHORED          Match only at the first position
-  PCRE_BSR_ANYCRLF       \R matches only CR, LF, or CRLF
-  PCRE_BSR_UNICODE       \R matches all Unicode line endings
-  PCRE_NEWLINE_ANY       Recognize any Unicode newline sequence
-  PCRE_NEWLINE_ANYCRLF   Recognize CR, LF, & CRLF as newline sequences
-  PCRE_NEWLINE_CR        Recognize CR as the only newline sequence
-  PCRE_NEWLINE_CRLF      Recognize CRLF as the only newline sequence
-  PCRE_NEWLINE_LF        Recognize LF as the only newline sequence
-  PCRE_NOTBOL            Subject is not the beginning of a line
-  PCRE_NOTEOL            Subject is not the end of a line
-  PCRE_NOTEMPTY          An empty string is not a valid match
-  PCRE_NOTEMPTY_ATSTART  An empty string at the start of the subject
-                           is not a valid match
-  PCRE_NO_START_OPTIMIZE Do not do "start-match" optimizations
-  PCRE_NO_UTF16_CHECK    Do not check the subject for UTF-16
-                           validity (only relevant if PCRE_UTF16
-                           was set at compile time)
-  PCRE_NO_UTF32_CHECK    Do not check the subject for UTF-32
-                           validity (only relevant if PCRE_UTF32
-                           was set at compile time)
-  PCRE_NO_UTF8_CHECK     Do not check the subject for UTF-8
-                           validity (only relevant if PCRE_UTF8
-                           was set at compile time)
-  PCRE_PARTIAL           ) Return PCRE_ERROR_PARTIAL for a partial
-  PCRE_PARTIAL_SOFT      )   match if no full matches are found
-  PCRE_PARTIAL_HARD      Return PCRE_ERROR_PARTIAL for a partial match
-                           even if there is a full match as well
-  PCRE_DFA_SHORTEST      Return only the shortest match
-  PCRE_DFA_RESTART       Restart after a partial match
-</pre>
-There are restrictions on what may appear in a pattern when using this matching
-function. Details are given in the
-<a href="pcrematching.html"><b>pcrematching</b></a>
-documentation. For details of partial matching, see the
-<a href="pcrepartial.html"><b>pcrepartial</b></a>
-page.
-</P>
-<P>
-A <b>pcre[16|32]_extra</b> structure contains the following fields:
-<pre>
-  <i>flags</i>            Bits indicating which fields are set
-  <i>study_data</i>       Opaque data from <b>pcre[16|32]_study()</b>
-  <i>match_limit</i>      Limit on internal resource use
-  <i>match_limit_recursion</i>  Limit on internal recursion depth
-  <i>callout_data</i>     Opaque data passed back to callouts
-  <i>tables</i>           Points to character tables or is NULL
-  <i>mark</i>             For passing back a *MARK pointer
-  <i>executable_jit</i>   Opaque data from JIT compilation
-</pre>
-The flag bits are PCRE_EXTRA_STUDY_DATA, PCRE_EXTRA_MATCH_LIMIT,
-PCRE_EXTRA_MATCH_LIMIT_RECURSION, PCRE_EXTRA_CALLOUT_DATA,
-PCRE_EXTRA_TABLES, PCRE_EXTRA_MARK and PCRE_EXTRA_EXECUTABLE_JIT. For this
-matching function, the <i>match_limit</i> and <i>match_limit_recursion</i> fields
-are not used, and must not be set. The PCRE_EXTRA_EXECUTABLE_JIT flag and
-the corresponding variable are ignored.
-</P>
-<P>
-There is a complete description of the PCRE native API in the
-<a href="pcreapi.html"><b>pcreapi</b></a>
-page and a description of the POSIX API in the
-<a href="pcreposix.html"><b>pcreposix</b></a>
-page.
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
diff --git a/dist/doc/html/pcre_exec.html b/dist/doc/html/pcre_exec.html
deleted file mode 100644
index 18e1a13..0000000
--- a/dist/doc/html/pcre_exec.html
+++ /dev/null
@@ -1,111 +0,0 @@
-<html>
-<head>
-<title>pcre_exec specification</title>
-</head>
-<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
-<h1>pcre_exec man page</h1>
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
-<p>
-This page is part of the PCRE HTML documentation. It was generated automatically
-from the original man page. If there is any nonsense in it, please consult the
-man page, in case the conversion went wrong.
-<br>
-<br><b>
-SYNOPSIS
-</b><br>
-<P>
-<b>#include &#60;pcre.h&#62;</b>
-</P>
-<P>
-<b>int pcre_exec(const pcre *<i>code</i>, const pcre_extra *<i>extra</i>,</b>
-<b>     const char *<i>subject</i>, int <i>length</i>, int <i>startoffset</i>,</b>
-<b>     int <i>options</i>, int *<i>ovector</i>, int <i>ovecsize</i>);</b>
-<br>
-<br>
-<b>int pcre16_exec(const pcre16 *<i>code</i>, const pcre16_extra *<i>extra</i>,</b>
-<b>     PCRE_SPTR16 <i>subject</i>, int <i>length</i>, int <i>startoffset</i>,</b>
-<b>     int <i>options</i>, int *<i>ovector</i>, int <i>ovecsize</i>);</b>
-<br>
-<br>
-<b>int pcre32_exec(const pcre32 *<i>code</i>, const pcre32_extra *<i>extra</i>,</b>
-<b>     PCRE_SPTR32 <i>subject</i>, int <i>length</i>, int <i>startoffset</i>,</b>
-<b>     int <i>options</i>, int *<i>ovector</i>, int <i>ovecsize</i>);</b>
-</P>
-<br><b>
-DESCRIPTION
-</b><br>
-<P>
-This function matches a compiled regular expression against a given subject
-string, using a matching algorithm that is similar to Perl's. It returns
-offsets to captured substrings. Its arguments are:
-<pre>
-  <i>code</i>         Points to the compiled pattern
-  <i>extra</i>        Points to an associated <b>pcre[16|32]_extra</b> structure,
-                 or is NULL
-  <i>subject</i>      Points to the subject string
-  <i>length</i>       Length of the subject string
-  <i>startoffset</i>  Offset in the subject at which to start matching
-  <i>options</i>      Option bits
-  <i>ovector</i>      Points to a vector of ints for result offsets
-  <i>ovecsize</i>     Number of elements in the vector (a multiple of 3)
-</pre>
-The units for <i>length</i> and <i>startoffset</i> are bytes for
-<b>pcre_exec()</b>, 16-bit data items for <b>pcre16_exec()</b>, and 32-bit items
-for <b>pcre32_exec()</b>. The options are:
-<pre>
-  PCRE_ANCHORED          Match only at the first position
-  PCRE_BSR_ANYCRLF       \R matches only CR, LF, or CRLF
-  PCRE_BSR_UNICODE       \R matches all Unicode line endings
-  PCRE_NEWLINE_ANY       Recognize any Unicode newline sequence
-  PCRE_NEWLINE_ANYCRLF   Recognize CR, LF, & CRLF as newline sequences
-  PCRE_NEWLINE_CR        Recognize CR as the only newline sequence
-  PCRE_NEWLINE_CRLF      Recognize CRLF as the only newline sequence
-  PCRE_NEWLINE_LF        Recognize LF as the only newline sequence
-  PCRE_NOTBOL            Subject string is not the beginning of a line
-  PCRE_NOTEOL            Subject string is not the end of a line
-  PCRE_NOTEMPTY          An empty string is not a valid match
-  PCRE_NOTEMPTY_ATSTART  An empty string at the start of the subject
-                           is not a valid match
-  PCRE_NO_START_OPTIMIZE Do not do "start-match" optimizations
-  PCRE_NO_UTF16_CHECK    Do not check the subject for UTF-16
-                           validity (only relevant if PCRE_UTF16
-                           was set at compile time)
-  PCRE_NO_UTF32_CHECK    Do not check the subject for UTF-32
-                           validity (only relevant if PCRE_UTF32
-                           was set at compile time)
-  PCRE_NO_UTF8_CHECK     Do not check the subject for UTF-8
-                           validity (only relevant if PCRE_UTF8
-                           was set at compile time)
-  PCRE_PARTIAL           ) Return PCRE_ERROR_PARTIAL for a partial
-  PCRE_PARTIAL_SOFT      )   match if no full matches are found
-  PCRE_PARTIAL_HARD      Return PCRE_ERROR_PARTIAL for a partial match
-                           if that is found before a full match
-</pre>
-For details of partial matching, see the
-<a href="pcrepartial.html"><b>pcrepartial</b></a>
-page. A <b>pcre_extra</b> structure contains the following fields:
-<pre>
-  <i>flags</i>            Bits indicating which fields are set
-  <i>study_data</i>       Opaque data from <b>pcre[16|32]_study()</b>
-  <i>match_limit</i>      Limit on internal resource use
-  <i>match_limit_recursion</i>  Limit on internal recursion depth
-  <i>callout_data</i>     Opaque data passed back to callouts
-  <i>tables</i>           Points to character tables or is NULL
-  <i>mark</i>             For passing back a *MARK pointer
-  <i>executable_jit</i>   Opaque data from JIT compilation
-</pre>
-The flag bits are PCRE_EXTRA_STUDY_DATA, PCRE_EXTRA_MATCH_LIMIT,
-PCRE_EXTRA_MATCH_LIMIT_RECURSION, PCRE_EXTRA_CALLOUT_DATA,
-PCRE_EXTRA_TABLES, PCRE_EXTRA_MARK and PCRE_EXTRA_EXECUTABLE_JIT.
-</P>
-<P>
-There is a complete description of the PCRE native API in the
-<a href="pcreapi.html"><b>pcreapi</b></a>
-page and a description of the POSIX API in the
-<a href="pcreposix.html"><b>pcreposix</b></a>
-page.
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
diff --git a/dist/doc/html/pcre_free_study.html b/dist/doc/html/pcre_free_study.html
deleted file mode 100644
index 7f9e10e..0000000
--- a/dist/doc/html/pcre_free_study.html
+++ /dev/null
@@ -1,46 +0,0 @@
-<html>
-<head>
-<title>pcre_free_study specification</title>
-</head>
-<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
-<h1>pcre_free_study man page</h1>
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
-<p>
-This page is part of the PCRE HTML documentation. It was generated automatically
-from the original man page. If there is any nonsense in it, please consult the
-man page, in case the conversion went wrong.
-<br>
-<br><b>
-SYNOPSIS
-</b><br>
-<P>
-<b>#include &#60;pcre.h&#62;</b>
-</P>
-<P>
-<b>void pcre_free_study(pcre_extra *<i>extra</i>);</b>
-</P>
-<P>
-<b>void pcre16_free_study(pcre16_extra *<i>extra</i>);</b>
-</P>
-<P>
-<b>void pcre32_free_study(pcre32_extra *<i>extra</i>);</b>
-</P>
-<br><b>
-DESCRIPTION
-</b><br>
-<P>
-This function is used to free the memory used for the data generated by a call
-to <b>pcre[16|32]_study()</b> when it is no longer needed. The argument must be the
-result of such a call.
-</P>
-<P>
-There is a complete description of the PCRE native API in the
-<a href="pcreapi.html"><b>pcreapi</b></a>
-page and a description of the POSIX API in the
-<a href="pcreposix.html"><b>pcreposix</b></a>
-page.
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
diff --git a/dist/doc/html/pcre_free_substring.html b/dist/doc/html/pcre_free_substring.html
deleted file mode 100644
index 1fe6610..0000000
--- a/dist/doc/html/pcre_free_substring.html
+++ /dev/null
@@ -1,46 +0,0 @@
-<html>
-<head>
-<title>pcre_free_substring specification</title>
-</head>
-<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
-<h1>pcre_free_substring man page</h1>
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
-<p>
-This page is part of the PCRE HTML documentation. It was generated automatically
-from the original man page. If there is any nonsense in it, please consult the
-man page, in case the conversion went wrong.
-<br>
-<br><b>
-SYNOPSIS
-</b><br>
-<P>
-<b>#include &#60;pcre.h&#62;</b>
-</P>
-<P>
-<b>void pcre_free_substring(const char *<i>stringptr</i>);</b>
-</P>
-<P>
-<b>void pcre16_free_substring(PCRE_SPTR16 <i>stringptr</i>);</b>
-</P>
-<P>
-<b>void pcre32_free_substring(PCRE_SPTR32 <i>stringptr</i>);</b>
-</P>
-<br><b>
-DESCRIPTION
-</b><br>
-<P>
-This is a convenience function for freeing the store obtained by a previous
-call to <b>pcre[16|32]_get_substring()</b> or <b>pcre[16|32]_get_named_substring()</b>.
-Its only argument is a pointer to the string.
-</P>
-<P>
-There is a complete description of the PCRE native API in the
-<a href="pcreapi.html"><b>pcreapi</b></a>
-page and a description of the POSIX API in the
-<a href="pcreposix.html"><b>pcreposix</b></a>
-page.
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
diff --git a/dist/doc/html/pcre_free_substring_list.html b/dist/doc/html/pcre_free_substring_list.html
deleted file mode 100644
index c086178..0000000
--- a/dist/doc/html/pcre_free_substring_list.html
+++ /dev/null
@@ -1,46 +0,0 @@
-<html>
-<head>
-<title>pcre_free_substring_list specification</title>
-</head>
-<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
-<h1>pcre_free_substring_list man page</h1>
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
-<p>
-This page is part of the PCRE HTML documentation. It was generated automatically
-from the original man page. If there is any nonsense in it, please consult the
-man page, in case the conversion went wrong.
-<br>
-<br><b>
-SYNOPSIS
-</b><br>
-<P>
-<b>#include &#60;pcre.h&#62;</b>
-</P>
-<P>
-<b>void pcre_free_substring_list(const char **<i>stringptr</i>);</b>
-</P>
-<P>
-<b>void pcre16_free_substring_list(PCRE_SPTR16 *<i>stringptr</i>);</b>
-</P>
-<P>
-<b>void pcre32_free_substring_list(PCRE_SPTR32 *<i>stringptr</i>);</b>
-</P>
-<br><b>
-DESCRIPTION
-</b><br>
-<P>
-This is a convenience function for freeing the store obtained by a previous
-call to <b>pcre[16|32]_get_substring_list()</b>. Its only argument is a pointer to
-the list of string pointers.
-</P>
-<P>
-There is a complete description of the PCRE native API in the
-<a href="pcreapi.html"><b>pcreapi</b></a>
-page and a description of the POSIX API in the
-<a href="pcreposix.html"><b>pcreposix</b></a>
-page.
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
diff --git a/dist/doc/html/pcre_fullinfo.html b/dist/doc/html/pcre_fullinfo.html
deleted file mode 100644
index 2b7c72b..0000000
--- a/dist/doc/html/pcre_fullinfo.html
+++ /dev/null
@@ -1,118 +0,0 @@
-<html>
-<head>
-<title>pcre_fullinfo specification</title>
-</head>
-<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
-<h1>pcre_fullinfo man page</h1>
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
-<p>
-This page is part of the PCRE HTML documentation. It was generated automatically
-from the original man page. If there is any nonsense in it, please consult the
-man page, in case the conversion went wrong.
-<br>
-<br><b>
-SYNOPSIS
-</b><br>
-<P>
-<b>#include &#60;pcre.h&#62;</b>
-</P>
-<P>
-<b>int pcre_fullinfo(const pcre *<i>code</i>, const pcre_extra *<i>extra</i>,</b>
-<b>     int <i>what</i>, void *<i>where</i>);</b>
-<br>
-<br>
-<b>int pcre16_fullinfo(const pcre16 *<i>code</i>, const pcre16_extra *<i>extra</i>,</b>
-<b>     int <i>what</i>, void *<i>where</i>);</b>
-<br>
-<br>
-<b>int pcre32_fullinfo(const pcre32 *<i>code</i>, const pcre32_extra *<i>extra</i>,</b>
-<b>     int <i>what</i>, void *<i>where</i>);</b>
-</P>
-<br><b>
-DESCRIPTION
-</b><br>
-<P>
-This function returns information about a compiled pattern. Its arguments are:
-<pre>
-  <i>code</i>                      Compiled regular expression
-  <i>extra</i>                     Result of <b>pcre[16|32]_study()</b> or NULL
-  <i>what</i>                      What information is required
-  <i>where</i>                     Where to put the information
-</pre>
-The following information is available:
-<pre>
-  PCRE_INFO_BACKREFMAX      Number of highest back reference
-  PCRE_INFO_CAPTURECOUNT    Number of capturing subpatterns
-  PCRE_INFO_DEFAULT_TABLES  Pointer to default tables
-  PCRE_INFO_FIRSTBYTE       Fixed first data unit for a match, or
-                              -1 for start of string
-                                 or after newline, or
-                              -2 otherwise
-  PCRE_INFO_FIRSTTABLE      Table of first data units (after studying)
-  PCRE_INFO_HASCRORLF       Return 1 if explicit CR or LF matches exist
-  PCRE_INFO_JCHANGED        Return 1 if (?J) or (?-J) was used
-  PCRE_INFO_JIT             Return 1 after successful JIT compilation
-  PCRE_INFO_JITSIZE         Size of JIT compiled code
-  PCRE_INFO_LASTLITERAL     Literal last data unit required
-  PCRE_INFO_MINLENGTH       Lower bound length of matching strings
-  PCRE_INFO_MATCHEMPTY      Return 1 if the pattern can match an empty string,
-                               0 otherwise
-  PCRE_INFO_MATCHLIMIT      Match limit if set, otherwise PCRE_RROR_UNSET
-  PCRE_INFO_MAXLOOKBEHIND   Length (in characters) of the longest lookbehind assertion
-  PCRE_INFO_NAMECOUNT       Number of named subpatterns
-  PCRE_INFO_NAMEENTRYSIZE   Size of name table entry
-  PCRE_INFO_NAMETABLE       Pointer to name table
-  PCRE_INFO_OKPARTIAL       Return 1 if partial matching can be tried
-                              (always returns 1 after release 8.00)
-  PCRE_INFO_OPTIONS         Option bits used for compilation
-  PCRE_INFO_SIZE            Size of compiled pattern
-  PCRE_INFO_STUDYSIZE       Size of study data
-  PCRE_INFO_FIRSTCHARACTER      Fixed first data unit for a match
-  PCRE_INFO_FIRSTCHARACTERFLAGS Returns
-                                  1 if there is a first data character set, which can
-                                    then be retrieved using PCRE_INFO_FIRSTCHARACTER,
-                                  2 if the first character is at the start of the data
-                                    string or after a newline, and
-                                  0 otherwise
-  PCRE_INFO_RECURSIONLIMIT    Recursion limit if set, otherwise PCRE_ERROR_UNSET
-  PCRE_INFO_REQUIREDCHAR      Literal last data unit required
-  PCRE_INFO_REQUIREDCHARFLAGS Returns 1 if the last data character is set (which can then
-                              be retrieved using PCRE_INFO_REQUIREDCHAR); 0 otherwise
-</pre>
-The <i>where</i> argument must point to an integer variable, except for the
-following <i>what</i> values:
-<pre>
-  PCRE_INFO_DEFAULT_TABLES  const uint8_t *
-  PCRE_INFO_FIRSTCHARACTER  uint32_t
-  PCRE_INFO_FIRSTTABLE      const uint8_t *
-  PCRE_INFO_JITSIZE         size_t
-  PCRE_INFO_MATCHLIMIT      uint32_t
-  PCRE_INFO_NAMETABLE       PCRE_SPTR16           (16-bit library)
-  PCRE_INFO_NAMETABLE       PCRE_SPTR32           (32-bit library)
-  PCRE_INFO_NAMETABLE       const unsigned char * (8-bit library)
-  PCRE_INFO_OPTIONS         unsigned long int
-  PCRE_INFO_SIZE            size_t
-  PCRE_INFO_STUDYSIZE       size_t
-  PCRE_INFO_RECURSIONLIMIT  uint32_t
-  PCRE_INFO_REQUIREDCHAR    uint32_t
-</pre>
-The yield of the function is zero on success or:
-<pre>
-  PCRE_ERROR_NULL           the argument <i>code</i> was NULL
-                            the argument <i>where</i> was NULL
-  PCRE_ERROR_BADMAGIC       the "magic number" was not found
-  PCRE_ERROR_BADOPTION      the value of <i>what</i> was invalid
-  PCRE_ERROR_UNSET          the option was not set
-</PRE>
-</P>
-<P>
-There is a complete description of the PCRE native API in the
-<a href="pcreapi.html"><b>pcreapi</b></a>
-page and a description of the POSIX API in the
-<a href="pcreposix.html"><b>pcreposix</b></a>
-page.
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
diff --git a/dist/doc/html/pcre_get_named_substring.html b/dist/doc/html/pcre_get_named_substring.html
deleted file mode 100644
index 72924d9..0000000
--- a/dist/doc/html/pcre_get_named_substring.html
+++ /dev/null
@@ -1,68 +0,0 @@
-<html>
-<head>
-<title>pcre_get_named_substring specification</title>
-</head>
-<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
-<h1>pcre_get_named_substring man page</h1>
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
-<p>
-This page is part of the PCRE HTML documentation. It was generated automatically
-from the original man page. If there is any nonsense in it, please consult the
-man page, in case the conversion went wrong.
-<br>
-<br><b>
-SYNOPSIS
-</b><br>
-<P>
-<b>#include &#60;pcre.h&#62;</b>
-</P>
-<P>
-<b>int pcre_get_named_substring(const pcre *<i>code</i>,</b>
-<b>     const char *<i>subject</i>, int *<i>ovector</i>,</b>
-<b>     int <i>stringcount</i>, const char *<i>stringname</i>,</b>
-<b>     const char **<i>stringptr</i>);</b>
-<br>
-<br>
-<b>int pcre16_get_named_substring(const pcre16 *<i>code</i>,</b>
-<b>     PCRE_SPTR16 <i>subject</i>, int *<i>ovector</i>,</b>
-<b>     int <i>stringcount</i>, PCRE_SPTR16 <i>stringname</i>,</b>
-<b>     PCRE_SPTR16 *<i>stringptr</i>);</b>
-<br>
-<br>
-<b>int pcre32_get_named_substring(const pcre32 *<i>code</i>,</b>
-<b>     PCRE_SPTR32 <i>subject</i>, int *<i>ovector</i>,</b>
-<b>     int <i>stringcount</i>, PCRE_SPTR32 <i>stringname</i>,</b>
-<b>     PCRE_SPTR32 *<i>stringptr</i>);</b>
-</P>
-<br><b>
-DESCRIPTION
-</b><br>
-<P>
-This is a convenience function for extracting a captured substring by name. The
-arguments are:
-<pre>
-  <i>code</i>          Compiled pattern
-  <i>subject</i>       Subject that has been successfully matched
-  <i>ovector</i>       Offset vector that <b>pcre[16|32]_exec()</b> used
-  <i>stringcount</i>   Value returned by <b>pcre[16|32]_exec()</b>
-  <i>stringname</i>    Name of the required substring
-  <i>stringptr</i>     Where to put the string pointer
-</pre>
-The memory in which the substring is placed is obtained by calling
-<b>pcre[16|32]_malloc()</b>. The convenience function
-<b>pcre[16|32]_free_substring()</b> can be used to free it when it is no longer
-needed. The yield of the function is the length of the extracted substring,
-PCRE_ERROR_NOMEMORY if sufficient memory could not be obtained, or
-PCRE_ERROR_NOSUBSTRING if the string name is invalid.
-</P>
-<P>
-There is a complete description of the PCRE native API in the
-<a href="pcreapi.html"><b>pcreapi</b></a>
-page and a description of the POSIX API in the
-<a href="pcreposix.html"><b>pcreposix</b></a>
-page.
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
diff --git a/dist/doc/html/pcre_get_stringnumber.html b/dist/doc/html/pcre_get_stringnumber.html
deleted file mode 100644
index 7324d78..0000000
--- a/dist/doc/html/pcre_get_stringnumber.html
+++ /dev/null
@@ -1,57 +0,0 @@
-<html>
-<head>
-<title>pcre_get_stringnumber specification</title>
-</head>
-<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
-<h1>pcre_get_stringnumber man page</h1>
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
-<p>
-This page is part of the PCRE HTML documentation. It was generated automatically
-from the original man page. If there is any nonsense in it, please consult the
-man page, in case the conversion went wrong.
-<br>
-<br><b>
-SYNOPSIS
-</b><br>
-<P>
-<b>#include &#60;pcre.h&#62;</b>
-</P>
-<P>
-<b>int pcre_get_stringnumber(const pcre *<i>code</i>,</b>
-<b>     const char *<i>name</i>);</b>
-<br>
-<br>
-<b>int pcre16_get_stringnumber(const pcre16 *<i>code</i>,</b>
-<b>     PCRE_SPTR16 <i>name</i>);</b>
-<br>
-<br>
-<b>int pcre32_get_stringnumber(const pcre32 *<i>code</i>,</b>
-<b>     PCRE_SPTR32 <i>name</i>);</b>
-</P>
-<br><b>
-DESCRIPTION
-</b><br>
-<P>
-This convenience function finds the number of a named substring capturing
-parenthesis in a compiled pattern. Its arguments are:
-<pre>
-  <i>code</i>    Compiled regular expression
-  <i>name</i>    Name whose number is required
-</pre>
-The yield of the function is the number of the parenthesis if the name is
-found, or PCRE_ERROR_NOSUBSTRING otherwise. When duplicate names are allowed
-(PCRE_DUPNAMES is set), it is not defined which of the numbers is returned by
-<b>pcre[16|32]_get_stringnumber()</b>. You can obtain the complete list by calling
-<b>pcre[16|32]_get_stringtable_entries()</b>.
-</P>
-<P>
-There is a complete description of the PCRE native API in the
-<a href="pcreapi.html"><b>pcreapi</b></a>
-page and a description of the POSIX API in the
-<a href="pcreposix.html"><b>pcreposix</b></a>
-page.
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
diff --git a/dist/doc/html/pcre_get_stringtable_entries.html b/dist/doc/html/pcre_get_stringtable_entries.html
deleted file mode 100644
index 7990679..0000000
--- a/dist/doc/html/pcre_get_stringtable_entries.html
+++ /dev/null
@@ -1,60 +0,0 @@
-<html>
-<head>
-<title>pcre_get_stringtable_entries specification</title>
-</head>
-<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
-<h1>pcre_get_stringtable_entries man page</h1>
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
-<p>
-This page is part of the PCRE HTML documentation. It was generated automatically
-from the original man page. If there is any nonsense in it, please consult the
-man page, in case the conversion went wrong.
-<br>
-<br><b>
-SYNOPSIS
-</b><br>
-<P>
-<b>#include &#60;pcre.h&#62;</b>
-</P>
-<P>
-<b>int pcre_get_stringtable_entries(const pcre *<i>code</i>,</b>
-<b>     const char *<i>name</i>, char **<i>first</i>, char **<i>last</i>);</b>
-<br>
-<br>
-<b>int pcre16_get_stringtable_entries(const pcre16 *<i>code</i>,</b>
-<b>     PCRE_SPTR16 <i>name</i>, PCRE_UCHAR16 **<i>first</i>, PCRE_UCHAR16 **<i>last</i>);</b>
-<br>
-<br>
-<b>int pcre32_get_stringtable_entries(const pcre32 *<i>code</i>,</b>
-<b>     PCRE_SPTR32 <i>name</i>, PCRE_UCHAR32 **<i>first</i>, PCRE_UCHAR32 **<i>last</i>);</b>
-</P>
-<br><b>
-DESCRIPTION
-</b><br>
-<P>
-This convenience function finds, for a compiled pattern, the first and last
-entries for a given name in the table that translates capturing parenthesis
-names into numbers. When names are required to be unique (PCRE_DUPNAMES is
-<i>not</i> set), it is usually easier to use <b>pcre[16|32]_get_stringnumber()</b>
-instead.
-<pre>
-  <i>code</i>    Compiled regular expression
-  <i>name</i>    Name whose entries required
-  <i>first</i>   Where to return a pointer to the first entry
-  <i>last</i>    Where to return a pointer to the last entry
-</pre>
-The yield of the function is the length of each entry, or
-PCRE_ERROR_NOSUBSTRING if none are found.
-</P>
-<P>
-There is a complete description of the PCRE native API, including the format of
-the table entries, in the
-<a href="pcreapi.html"><b>pcreapi</b></a>
-page, and a description of the POSIX API in the
-<a href="pcreposix.html"><b>pcreposix</b></a>
-page.
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
diff --git a/dist/doc/html/pcre_get_substring.html b/dist/doc/html/pcre_get_substring.html
deleted file mode 100644
index 1a8e4f5..0000000
--- a/dist/doc/html/pcre_get_substring.html
+++ /dev/null
@@ -1,64 +0,0 @@
-<html>
-<head>
-<title>pcre_get_substring specification</title>
-</head>
-<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
-<h1>pcre_get_substring man page</h1>
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
-<p>
-This page is part of the PCRE HTML documentation. It was generated automatically
-from the original man page. If there is any nonsense in it, please consult the
-man page, in case the conversion went wrong.
-<br>
-<br><b>
-SYNOPSIS
-</b><br>
-<P>
-<b>#include &#60;pcre.h&#62;</b>
-</P>
-<P>
-<b>int pcre_get_substring(const char *<i>subject</i>, int *<i>ovector</i>,</b>
-<b>     int <i>stringcount</i>, int <i>stringnumber</i>,</b>
-<b>     const char **<i>stringptr</i>);</b>
-<br>
-<br>
-<b>int pcre16_get_substring(PCRE_SPTR16 <i>subject</i>, int *<i>ovector</i>,</b>
-<b>     int <i>stringcount</i>, int <i>stringnumber</i>,</b>
-<b>     PCRE_SPTR16 *<i>stringptr</i>);</b>
-<br>
-<br>
-<b>int pcre32_get_substring(PCRE_SPTR32 <i>subject</i>, int *<i>ovector</i>,</b>
-<b>     int <i>stringcount</i>, int <i>stringnumber</i>,</b>
-<b>     PCRE_SPTR32 *<i>stringptr</i>);</b>
-</P>
-<br><b>
-DESCRIPTION
-</b><br>
-<P>
-This is a convenience function for extracting a captured substring. The
-arguments are:
-<pre>
-  <i>subject</i>       Subject that has been successfully matched
-  <i>ovector</i>       Offset vector that <b>pcre[16|32]_exec()</b> used
-  <i>stringcount</i>   Value returned by <b>pcre[16|32]_exec()</b>
-  <i>stringnumber</i>  Number of the required substring
-  <i>stringptr</i>     Where to put the string pointer
-</pre>
-The memory in which the substring is placed is obtained by calling
-<b>pcre[16|32]_malloc()</b>. The convenience function
-<b>pcre[16|32]_free_substring()</b> can be used to free it when it is no longer
-needed. The yield of the function is the length of the substring,
-PCRE_ERROR_NOMEMORY if sufficient memory could not be obtained, or
-PCRE_ERROR_NOSUBSTRING if the string number is invalid.
-</P>
-<P>
-There is a complete description of the PCRE native API in the
-<a href="pcreapi.html"><b>pcreapi</b></a>
-page and a description of the POSIX API in the
-<a href="pcreposix.html"><b>pcreposix</b></a>
-page.
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
diff --git a/dist/doc/html/pcre_get_substring_list.html b/dist/doc/html/pcre_get_substring_list.html
deleted file mode 100644
index 7e8c6bc..0000000
--- a/dist/doc/html/pcre_get_substring_list.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<html>
-<head>
-<title>pcre_get_substring_list specification</title>
-</head>
-<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
-<h1>pcre_get_substring_list man page</h1>
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
-<p>
-This page is part of the PCRE HTML documentation. It was generated automatically
-from the original man page. If there is any nonsense in it, please consult the
-man page, in case the conversion went wrong.
-<br>
-<br><b>
-SYNOPSIS
-</b><br>
-<P>
-<b>#include &#60;pcre.h&#62;</b>
-</P>
-<P>
-<b>int pcre_get_substring_list(const char *<i>subject</i>,</b>
-<b>     int *<i>ovector</i>, int <i>stringcount</i>, const char ***<i>listptr</i>);</b>
-<br>
-<br>
-<b>int pcre16_get_substring_list(PCRE_SPTR16 <i>subject</i>,</b>
-<b>     int *<i>ovector</i>, int <i>stringcount</i>, PCRE_SPTR16 **<i>listptr</i>);</b>
-<br>
-<br>
-<b>int pcre32_get_substring_list(PCRE_SPTR32 <i>subject</i>,</b>
-<b>     int *<i>ovector</i>, int <i>stringcount</i>, PCRE_SPTR32 **<i>listptr</i>);</b>
-</P>
-<br><b>
-DESCRIPTION
-</b><br>
-<P>
-This is a convenience function for extracting a list of all the captured
-substrings. The arguments are:
-<pre>
-  <i>subject</i>       Subject that has been successfully matched
-  <i>ovector</i>       Offset vector that <b>pcre[16|32]_exec</b> used
-  <i>stringcount</i>   Value returned by <b>pcre[16|32]_exec</b>
-  <i>listptr</i>       Where to put a pointer to the list
-</pre>
-The memory in which the substrings and the list are placed is obtained by
-calling <b>pcre[16|32]_malloc()</b>. The convenience function
-<b>pcre[16|32]_free_substring_list()</b> can be used to free it when it is no
-longer needed. A pointer to a list of pointers is put in the variable whose
-address is in <i>listptr</i>. The list is terminated by a NULL pointer. The
-yield of the function is zero on success or PCRE_ERROR_NOMEMORY if sufficient
-memory could not be obtained.
-</P>
-<P>
-There is a complete description of the PCRE native API in the
-<a href="pcreapi.html"><b>pcreapi</b></a>
-page and a description of the POSIX API in the
-<a href="pcreposix.html"><b>pcreposix</b></a>
-page.
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
diff --git a/dist/doc/html/pcre_jit_exec.html b/dist/doc/html/pcre_jit_exec.html
deleted file mode 100644
index 4ebb0cb..0000000
--- a/dist/doc/html/pcre_jit_exec.html
+++ /dev/null
@@ -1,108 +0,0 @@
-<html>
-<head>
-<title>pcre_jit_exec specification</title>
-</head>
-<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
-<h1>pcre_jit_exec man page</h1>
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
-<p>
-This page is part of the PCRE HTML documentation. It was generated automatically
-from the original man page. If there is any nonsense in it, please consult the
-man page, in case the conversion went wrong.
-<br>
-<br><b>
-SYNOPSIS
-</b><br>
-<P>
-<b>#include &#60;pcre.h&#62;</b>
-</P>
-<P>
-<b>int pcre_jit_exec(const pcre *<i>code</i>, const pcre_extra *<i>extra</i>,</b>
-<b>     const char *<i>subject</i>, int <i>length</i>, int <i>startoffset</i>,</b>
-<b>     int <i>options</i>, int *<i>ovector</i>, int <i>ovecsize</i>,</b>
-<b>     pcre_jit_stack *<i>jstack</i>);</b>
-<br>
-<br>
-<b>int pcre16_jit_exec(const pcre16 *<i>code</i>, const pcre16_extra *<i>extra</i>,</b>
-<b>     PCRE_SPTR16 <i>subject</i>, int <i>length</i>, int <i>startoffset</i>,</b>
-<b>     int <i>options</i>, int *<i>ovector</i>, int <i>ovecsize</i>,</b>
-<b>     pcre_jit_stack *<i>jstack</i>);</b>
-<br>
-<br>
-<b>int pcre32_jit_exec(const pcre32 *<i>code</i>, const pcre32_extra *<i>extra</i>,</b>
-<b>     PCRE_SPTR32 <i>subject</i>, int <i>length</i>, int <i>startoffset</i>,</b>
-<b>     int <i>options</i>, int *<i>ovector</i>, int <i>ovecsize</i>,</b>
-<b>     pcre_jit_stack *<i>jstack</i>);</b>
-</P>
-<br><b>
-DESCRIPTION
-</b><br>
-<P>
-This function matches a compiled regular expression that has been successfully
-studied with one of the JIT options against a given subject string, using a
-matching algorithm that is similar to Perl's. It is a "fast path" interface to
-JIT, and it bypasses some of the sanity checks that <b>pcre_exec()</b> applies.
-It returns offsets to captured substrings. Its arguments are:
-<pre>
-  <i>code</i>         Points to the compiled pattern
-  <i>extra</i>        Points to an associated <b>pcre[16|32]_extra</b> structure,
-                 or is NULL
-  <i>subject</i>      Points to the subject string
-  <i>length</i>       Length of the subject string, in bytes
-  <i>startoffset</i>  Offset in bytes in the subject at which to
-                 start matching
-  <i>options</i>      Option bits
-  <i>ovector</i>      Points to a vector of ints for result offsets
-  <i>ovecsize</i>     Number of elements in the vector (a multiple of 3)
-  <i>jstack</i>       Pointer to a JIT stack
-</pre>
-The allowed options are:
-<pre>
-  PCRE_NOTBOL            Subject string is not the beginning of a line
-  PCRE_NOTEOL            Subject string is not the end of a line
-  PCRE_NOTEMPTY          An empty string is not a valid match
-  PCRE_NOTEMPTY_ATSTART  An empty string at the start of the subject
-                           is not a valid match
-  PCRE_NO_UTF16_CHECK    Do not check the subject for UTF-16
-                           validity (only relevant if PCRE_UTF16
-                           was set at compile time)
-  PCRE_NO_UTF32_CHECK    Do not check the subject for UTF-32
-                           validity (only relevant if PCRE_UTF32
-                           was set at compile time)
-  PCRE_NO_UTF8_CHECK     Do not check the subject for UTF-8
-                           validity (only relevant if PCRE_UTF8
-                           was set at compile time)
-  PCRE_PARTIAL           ) Return PCRE_ERROR_PARTIAL for a partial
-  PCRE_PARTIAL_SOFT      )   match if no full matches are found
-  PCRE_PARTIAL_HARD      Return PCRE_ERROR_PARTIAL for a partial match
-                           if that is found before a full match
-</pre>
-However, the PCRE_NO_UTF[8|16|32]_CHECK options have no effect, as this check
-is never applied. For details of partial matching, see the
-<a href="pcrepartial.html"><b>pcrepartial</b></a>
-page. A <b>pcre_extra</b> structure contains the following fields:
-<pre>
-  <i>flags</i>            Bits indicating which fields are set
-  <i>study_data</i>       Opaque data from <b>pcre[16|32]_study()</b>
-  <i>match_limit</i>      Limit on internal resource use
-  <i>match_limit_recursion</i>  Limit on internal recursion depth
-  <i>callout_data</i>     Opaque data passed back to callouts
-  <i>tables</i>           Points to character tables or is NULL
-  <i>mark</i>             For passing back a *MARK pointer
-  <i>executable_jit</i>   Opaque data from JIT compilation
-</pre>
-The flag bits are PCRE_EXTRA_STUDY_DATA, PCRE_EXTRA_MATCH_LIMIT,
-PCRE_EXTRA_MATCH_LIMIT_RECURSION, PCRE_EXTRA_CALLOUT_DATA,
-PCRE_EXTRA_TABLES, PCRE_EXTRA_MARK and PCRE_EXTRA_EXECUTABLE_JIT.
-</P>
-<P>
-There is a complete description of the PCRE native API in the
-<a href="pcreapi.html"><b>pcreapi</b></a>
-page and a description of the JIT API in the
-<a href="pcrejit.html"><b>pcrejit</b></a>
-page.
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
diff --git a/dist/doc/html/pcre_jit_stack_alloc.html b/dist/doc/html/pcre_jit_stack_alloc.html
deleted file mode 100644
index 23ba450..0000000
--- a/dist/doc/html/pcre_jit_stack_alloc.html
+++ /dev/null
@@ -1,55 +0,0 @@
-<html>
-<head>
-<title>pcre_jit_stack_alloc specification</title>
-</head>
-<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
-<h1>pcre_jit_stack_alloc man page</h1>
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
-<p>
-This page is part of the PCRE HTML documentation. It was generated automatically
-from the original man page. If there is any nonsense in it, please consult the
-man page, in case the conversion went wrong.
-<br>
-<br><b>
-SYNOPSIS
-</b><br>
-<P>
-<b>#include &#60;pcre.h&#62;</b>
-</P>
-<P>
-<b>pcre_jit_stack *pcre_jit_stack_alloc(int <i>startsize</i>,</b>
-<b>     int <i>maxsize</i>);</b>
-<br>
-<br>
-<b>pcre16_jit_stack *pcre16_jit_stack_alloc(int <i>startsize</i>,</b>
-<b>     int <i>maxsize</i>);</b>
-<br>
-<br>
-<b>pcre32_jit_stack *pcre32_jit_stack_alloc(int <i>startsize</i>,</b>
-<b>     int <i>maxsize</i>);</b>
-</P>
-<br><b>
-DESCRIPTION
-</b><br>
-<P>
-This function is used to create a stack for use by the code compiled by the JIT
-optimization of <b>pcre[16|32]_study()</b>. The arguments are a starting size for
-the stack, and a maximum size to which it is allowed to grow. The result can be
-passed to the JIT run-time code by <b>pcre[16|32]_assign_jit_stack()</b>, or that
-function can set up a callback for obtaining a stack. A maximum stack size of
-512K to 1M should be more than enough for any pattern. For more details, see
-the
-<a href="pcrejit.html"><b>pcrejit</b></a>
-page.
-</P>
-<P>
-There is a complete description of the PCRE native API in the
-<a href="pcreapi.html"><b>pcreapi</b></a>
-page and a description of the POSIX API in the
-<a href="pcreposix.html"><b>pcreposix</b></a>
-page.
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
diff --git a/dist/doc/html/pcre_jit_stack_free.html b/dist/doc/html/pcre_jit_stack_free.html
deleted file mode 100644
index 8bd06e4..0000000
--- a/dist/doc/html/pcre_jit_stack_free.html
+++ /dev/null
@@ -1,48 +0,0 @@
-<html>
-<head>
-<title>pcre_jit_stack_free specification</title>
-</head>
-<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
-<h1>pcre_jit_stack_free man page</h1>
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
-<p>
-This page is part of the PCRE HTML documentation. It was generated automatically
-from the original man page. If there is any nonsense in it, please consult the
-man page, in case the conversion went wrong.
-<br>
-<br><b>
-SYNOPSIS
-</b><br>
-<P>
-<b>#include &#60;pcre.h&#62;</b>
-</P>
-<P>
-<b>void pcre_jit_stack_free(pcre_jit_stack *<i>stack</i>);</b>
-</P>
-<P>
-<b>void pcre16_jit_stack_free(pcre16_jit_stack *<i>stack</i>);</b>
-</P>
-<P>
-<b>void pcre32_jit_stack_free(pcre32_jit_stack *<i>stack</i>);</b>
-</P>
-<br><b>
-DESCRIPTION
-</b><br>
-<P>
-This function is used to free a JIT stack that was created by
-<b>pcre[16|32]_jit_stack_alloc()</b> when it is no longer needed. For more details,
-see the
-<a href="pcrejit.html"><b>pcrejit</b></a>
-page.
-</P>
-<P>
-There is a complete description of the PCRE native API in the
-<a href="pcreapi.html"><b>pcreapi</b></a>
-page and a description of the POSIX API in the
-<a href="pcreposix.html"><b>pcreposix</b></a>
-page.
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
diff --git a/dist/doc/html/pcre_maketables.html b/dist/doc/html/pcre_maketables.html
deleted file mode 100644
index 3a7b5eb..0000000
--- a/dist/doc/html/pcre_maketables.html
+++ /dev/null
@@ -1,48 +0,0 @@
-<html>
-<head>
-<title>pcre_maketables specification</title>
-</head>
-<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
-<h1>pcre_maketables man page</h1>
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
-<p>
-This page is part of the PCRE HTML documentation. It was generated automatically
-from the original man page. If there is any nonsense in it, please consult the
-man page, in case the conversion went wrong.
-<br>
-<br><b>
-SYNOPSIS
-</b><br>
-<P>
-<b>#include &#60;pcre.h&#62;</b>
-</P>
-<P>
-<b>const unsigned char *pcre_maketables(void);</b>
-</P>
-<P>
-<b>const unsigned char *pcre16_maketables(void);</b>
-</P>
-<P>
-<b>const unsigned char *pcre32_maketables(void);</b>
-</P>
-<br><b>
-DESCRIPTION
-</b><br>
-<P>
-This function builds a set of character tables for character values less than
-256. These can be passed to <b>pcre[16|32]_compile()</b> to override PCRE's
-internal, built-in tables (which were made by <b>pcre[16|32]_maketables()</b> when
-PCRE was compiled). You might want to do this if you are using a non-standard
-locale. The function yields a pointer to the tables.
-</P>
-<P>
-There is a complete description of the PCRE native API in the
-<a href="pcreapi.html"><b>pcreapi</b></a>
-page and a description of the POSIX API in the
-<a href="pcreposix.html"><b>pcreposix</b></a>
-page.
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
diff --git a/dist/doc/html/pcre_pattern_to_host_byte_order.html b/dist/doc/html/pcre_pattern_to_host_byte_order.html
deleted file mode 100644
index 1b1c803..0000000
--- a/dist/doc/html/pcre_pattern_to_host_byte_order.html
+++ /dev/null
@@ -1,58 +0,0 @@
-<html>
-<head>
-<title>pcre_pattern_to_host_byte_order specification</title>
-</head>
-<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
-<h1>pcre_pattern_to_host_byte_order man page</h1>
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
-<p>
-This page is part of the PCRE HTML documentation. It was generated automatically
-from the original man page. If there is any nonsense in it, please consult the
-man page, in case the conversion went wrong.
-<br>
-<br><b>
-SYNOPSIS
-</b><br>
-<P>
-<b>#include &#60;pcre.h&#62;</b>
-</P>
-<P>
-<b>int pcre_pattern_to_host_byte_order(pcre *<i>code</i>,</b>
-<b>     pcre_extra *<i>extra</i>, const unsigned char *<i>tables</i>);</b>
-<br>
-<br>
-<b>int pcre16_pattern_to_host_byte_order(pcre16 *<i>code</i>,</b>
-<b>     pcre16_extra *<i>extra</i>, const unsigned char *<i>tables</i>);</b>
-<br>
-<br>
-<b>int pcre32_pattern_to_host_byte_order(pcre32 *<i>code</i>,</b>
-<b>     pcre32_extra *<i>extra</i>, const unsigned char *<i>tables</i>);</b>
-</P>
-<br><b>
-DESCRIPTION
-</b><br>
-<P>
-This function ensures that the bytes in 2-byte and 4-byte values in a compiled
-pattern are in the correct order for the current host. It is useful when a
-pattern that has been compiled on one host is transferred to another that might
-have different endianness. The arguments are:
-<pre>
-  <i>code</i>         A compiled regular expression
-  <i>extra</i>        Points to an associated <b>pcre[16|32]_extra</b> structure,
-                 or is NULL
-  <i>tables</i>       Pointer to character tables, or NULL to
-                 set the built-in default
-</pre>
-The result is 0 for success, a negative PCRE_ERROR_xxx value otherwise.
-</P>
-<P>
-There is a complete description of the PCRE native API in the
-<a href="pcreapi.html"><b>pcreapi</b></a>
-page and a description of the POSIX API in the
-<a href="pcreposix.html"><b>pcreposix</b></a>
-page.
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
diff --git a/dist/doc/html/pcre_refcount.html b/dist/doc/html/pcre_refcount.html
deleted file mode 100644
index bfb92e6..0000000
--- a/dist/doc/html/pcre_refcount.html
+++ /dev/null
@@ -1,51 +0,0 @@
-<html>
-<head>
-<title>pcre_refcount specification</title>
-</head>
-<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
-<h1>pcre_refcount man page</h1>
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
-<p>
-This page is part of the PCRE HTML documentation. It was generated automatically
-from the original man page. If there is any nonsense in it, please consult the
-man page, in case the conversion went wrong.
-<br>
-<br><b>
-SYNOPSIS
-</b><br>
-<P>
-<b>#include &#60;pcre.h&#62;</b>
-</P>
-<P>
-<b>int pcre_refcount(pcre *<i>code</i>, int <i>adjust</i>);</b>
-</P>
-<P>
-<b>int pcre16_refcount(pcre16 *<i>code</i>, int <i>adjust</i>);</b>
-</P>
-<P>
-<b>int pcre32_refcount(pcre32 *<i>code</i>, int <i>adjust</i>);</b>
-</P>
-<br><b>
-DESCRIPTION
-</b><br>
-<P>
-This function is used to maintain a reference count inside a data block that
-contains a compiled pattern. Its arguments are:
-<pre>
-  <i>code</i>                      Compiled regular expression
-  <i>adjust</i>                    Adjustment to reference value
-</pre>
-The yield of the function is the adjusted reference value, which is constrained
-to lie between 0 and 65535.
-</P>
-<P>
-There is a complete description of the PCRE native API in the
-<a href="pcreapi.html"><b>pcreapi</b></a>
-page and a description of the POSIX API in the
-<a href="pcreposix.html"><b>pcreposix</b></a>
-page.
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
diff --git a/dist/doc/html/pcre_study.html b/dist/doc/html/pcre_study.html
deleted file mode 100644
index af82f11..0000000
--- a/dist/doc/html/pcre_study.html
+++ /dev/null
@@ -1,68 +0,0 @@
-<html>
-<head>
-<title>pcre_study specification</title>
-</head>
-<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
-<h1>pcre_study man page</h1>
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
-<p>
-This page is part of the PCRE HTML documentation. It was generated automatically
-from the original man page. If there is any nonsense in it, please consult the
-man page, in case the conversion went wrong.
-<br>
-<br><b>
-SYNOPSIS
-</b><br>
-<P>
-<b>#include &#60;pcre.h&#62;</b>
-</P>
-<P>
-<b>pcre_extra *pcre_study(const pcre *<i>code</i>, int <i>options</i>,</b>
-<b>     const char **<i>errptr</i>);</b>
-<br>
-<br>
-<b>pcre16_extra *pcre16_study(const pcre16 *<i>code</i>, int <i>options</i>,</b>
-<b>     const char **<i>errptr</i>);</b>
-<br>
-<br>
-<b>pcre32_extra *pcre32_study(const pcre32 *<i>code</i>, int <i>options</i>,</b>
-<b>     const char **<i>errptr</i>);</b>
-</P>
-<br><b>
-DESCRIPTION
-</b><br>
-<P>
-This function studies a compiled pattern, to see if additional information can
-be extracted that might speed up matching. Its arguments are:
-<pre>
-  <i>code</i>       A compiled regular expression
-  <i>options</i>    Options for <b>pcre[16|32]_study()</b>
-  <i>errptr</i>     Where to put an error message
-</pre>
-If the function succeeds, it returns a value that can be passed to
-<b>pcre[16|32]_exec()</b> or <b>pcre[16|32]_dfa_exec()</b> via their <i>extra</i>
-arguments.
-</P>
-<P>
-If the function returns NULL, either it could not find any additional
-information, or there was an error. You can tell the difference by looking at
-the error value. It is NULL in first case.
-</P>
-<P>
-The only option is PCRE_STUDY_JIT_COMPILE. It requests just-in-time compilation
-if possible. If PCRE has been compiled without JIT support, this option is
-ignored. See the
-<a href="pcrejit.html"><b>pcrejit</b></a>
-page for further details.
-</P>
-<P>
-There is a complete description of the PCRE native API in the
-<a href="pcreapi.html"><b>pcreapi</b></a>
-page and a description of the POSIX API in the
-<a href="pcreposix.html"><b>pcreposix</b></a>
-page.
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
diff --git a/dist/doc/html/pcre_utf16_to_host_byte_order.html b/dist/doc/html/pcre_utf16_to_host_byte_order.html
deleted file mode 100644
index 18e7788..0000000
--- a/dist/doc/html/pcre_utf16_to_host_byte_order.html
+++ /dev/null
@@ -1,57 +0,0 @@
-<html>
-<head>
-<title>pcre_utf16_to_host_byte_order specification</title>
-</head>
-<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
-<h1>pcre_utf16_to_host_byte_order man page</h1>
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
-<p>
-This page is part of the PCRE HTML documentation. It was generated automatically
-from the original man page. If there is any nonsense in it, please consult the
-man page, in case the conversion went wrong.
-<br>
-<br><b>
-SYNOPSIS
-</b><br>
-<P>
-<b>#include &#60;pcre.h&#62;</b>
-</P>
-<P>
-<b>int pcre16_utf16_to_host_byte_order(PCRE_UCHAR16 *<i>output</i>,</b>
-<b>     PCRE_SPTR16 <i>input</i>, int <i>length</i>, int *<i>host_byte_order</i>,</b>
-<b>     int <i>keep_boms</i>);</b>
-</P>
-<br><b>
-DESCRIPTION
-</b><br>
-<P>
-This function, which exists only in the 16-bit library, converts a UTF-16
-string to the correct order for the current host, taking account of any byte
-order marks (BOMs) within the string. Its arguments are:
-<pre>
-  <i>output</i>           pointer to output buffer, may be the same as <i>input</i>
-  <i>input</i>            pointer to input buffer
-  <i>length</i>           number of 16-bit units in the input, or negative for
-                     a zero-terminated string
-  <i>host_byte_order</i>  a NULL value or a non-zero value pointed to means
-                     start in host byte order
-  <i>keep_boms</i>        if non-zero, BOMs are copied to the output string
-</pre>
-The result of the function is the number of 16-bit units placed into the output
-buffer, including the zero terminator if the string was zero-terminated.
-</P>
-<P>
-If <i>host_byte_order</i> is not NULL, it is set to indicate the byte order that
-is current at the end of the string.
-</P>
-<P>
-There is a complete description of the PCRE native API in the
-<a href="pcreapi.html"><b>pcreapi</b></a>
-page and a description of the POSIX API in the
-<a href="pcreposix.html"><b>pcreposix</b></a>
-page.
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
diff --git a/dist/doc/html/pcre_utf32_to_host_byte_order.html b/dist/doc/html/pcre_utf32_to_host_byte_order.html
deleted file mode 100644
index 772ae40..0000000
--- a/dist/doc/html/pcre_utf32_to_host_byte_order.html
+++ /dev/null
@@ -1,57 +0,0 @@
-<html>
-<head>
-<title>pcre_utf32_to_host_byte_order specification</title>
-</head>
-<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
-<h1>pcre_utf32_to_host_byte_order man page</h1>
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
-<p>
-This page is part of the PCRE HTML documentation. It was generated automatically
-from the original man page. If there is any nonsense in it, please consult the
-man page, in case the conversion went wrong.
-<br>
-<br><b>
-SYNOPSIS
-</b><br>
-<P>
-<b>#include &#60;pcre.h&#62;</b>
-</P>
-<P>
-<b>int pcre32_utf32_to_host_byte_order(PCRE_UCHAR32 *<i>output</i>,</b>
-<b>     PCRE_SPTR32 <i>input</i>, int <i>length</i>, int *<i>host_byte_order</i>,</b>
-<b>     int <i>keep_boms</i>);</b>
-</P>
-<br><b>
-DESCRIPTION
-</b><br>
-<P>
-This function, which exists only in the 32-bit library, converts a UTF-32
-string to the correct order for the current host, taking account of any byte
-order marks (BOMs) within the string. Its arguments are:
-<pre>
-  <i>output</i>           pointer to output buffer, may be the same as <i>input</i>
-  <i>input</i>            pointer to input buffer
-  <i>length</i>           number of 32-bit units in the input, or negative for
-                     a zero-terminated string
-  <i>host_byte_order</i>  a NULL value or a non-zero value pointed to means
-                     start in host byte order
-  <i>keep_boms</i>        if non-zero, BOMs are copied to the output string
-</pre>
-The result of the function is the number of 32-bit units placed into the output
-buffer, including the zero terminator if the string was zero-terminated.
-</P>
-<P>
-If <i>host_byte_order</i> is not NULL, it is set to indicate the byte order that
-is current at the end of the string.
-</P>
-<P>
-There is a complete description of the PCRE native API in the
-<a href="pcreapi.html"><b>pcreapi</b></a>
-page and a description of the POSIX API in the
-<a href="pcreposix.html"><b>pcreposix</b></a>
-page.
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
diff --git a/dist/doc/html/pcre_version.html b/dist/doc/html/pcre_version.html
deleted file mode 100644
index d33e718..0000000
--- a/dist/doc/html/pcre_version.html
+++ /dev/null
@@ -1,46 +0,0 @@
-<html>
-<head>
-<title>pcre_version specification</title>
-</head>
-<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
-<h1>pcre_version man page</h1>
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
-<p>
-This page is part of the PCRE HTML documentation. It was generated automatically
-from the original man page. If there is any nonsense in it, please consult the
-man page, in case the conversion went wrong.
-<br>
-<br><b>
-SYNOPSIS
-</b><br>
-<P>
-<b>#include &#60;pcre.h&#62;</b>
-</P>
-<P>
-<b>const char *pcre_version(void);</b>
-</P>
-<P>
-<b>const char *pcre16_version(void);</b>
-</P>
-<P>
-<b>const char *pcre32_version(void);</b>
-</P>
-<br><b>
-DESCRIPTION
-</b><br>
-<P>
-This function (even in the 16-bit and 32-bit libraries) returns a
-zero-terminated, 8-bit character string that gives the version number of the
-PCRE library and the date of its release.
-</P>
-<P>
-There is a complete description of the PCRE native API in the
-<a href="pcreapi.html"><b>pcreapi</b></a>
-page and a description of the POSIX API in the
-<a href="pcreposix.html"><b>pcreposix</b></a>
-page.
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
diff --git a/dist/doc/html/pcreapi.html b/dist/doc/html/pcreapi.html
deleted file mode 100644
index b401ecc..0000000
--- a/dist/doc/html/pcreapi.html
+++ /dev/null
@@ -1,2922 +0,0 @@
-<html>
-<head>
-<title>pcreapi specification</title>
-</head>
-<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
-<h1>pcreapi man page</h1>
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
-<p>
-This page is part of the PCRE HTML documentation. It was generated automatically
-from the original man page. If there is any nonsense in it, please consult the
-man page, in case the conversion went wrong.
-<br>
-<ul>
-<li><a name="TOC1" href="#SEC1">PCRE NATIVE API BASIC FUNCTIONS</a>
-<li><a name="TOC2" href="#SEC2">PCRE NATIVE API STRING EXTRACTION FUNCTIONS</a>
-<li><a name="TOC3" href="#SEC3">PCRE NATIVE API AUXILIARY FUNCTIONS</a>
-<li><a name="TOC4" href="#SEC4">PCRE NATIVE API INDIRECTED FUNCTIONS</a>
-<li><a name="TOC5" href="#SEC5">PCRE 8-BIT, 16-BIT, AND 32-BIT LIBRARIES</a>
-<li><a name="TOC6" href="#SEC6">PCRE API OVERVIEW</a>
-<li><a name="TOC7" href="#SEC7">NEWLINES</a>
-<li><a name="TOC8" href="#SEC8">MULTITHREADING</a>
-<li><a name="TOC9" href="#SEC9">SAVING PRECOMPILED PATTERNS FOR LATER USE</a>
-<li><a name="TOC10" href="#SEC10">CHECKING BUILD-TIME OPTIONS</a>
-<li><a name="TOC11" href="#SEC11">COMPILING A PATTERN</a>
-<li><a name="TOC12" href="#SEC12">COMPILATION ERROR CODES</a>
-<li><a name="TOC13" href="#SEC13">STUDYING A PATTERN</a>
-<li><a name="TOC14" href="#SEC14">LOCALE SUPPORT</a>
-<li><a name="TOC15" href="#SEC15">INFORMATION ABOUT A PATTERN</a>
-<li><a name="TOC16" href="#SEC16">REFERENCE COUNTS</a>
-<li><a name="TOC17" href="#SEC17">MATCHING A PATTERN: THE TRADITIONAL FUNCTION</a>
-<li><a name="TOC18" href="#SEC18">EXTRACTING CAPTURED SUBSTRINGS BY NUMBER</a>
-<li><a name="TOC19" href="#SEC19">EXTRACTING CAPTURED SUBSTRINGS BY NAME</a>
-<li><a name="TOC20" href="#SEC20">DUPLICATE SUBPATTERN NAMES</a>
-<li><a name="TOC21" href="#SEC21">FINDING ALL POSSIBLE MATCHES</a>
-<li><a name="TOC22" href="#SEC22">OBTAINING AN ESTIMATE OF STACK USAGE</a>
-<li><a name="TOC23" href="#SEC23">MATCHING A PATTERN: THE ALTERNATIVE FUNCTION</a>
-<li><a name="TOC24" href="#SEC24">SEE ALSO</a>
-<li><a name="TOC25" href="#SEC25">AUTHOR</a>
-<li><a name="TOC26" href="#SEC26">REVISION</a>
-</ul>
-<P>
-<b>#include &#60;pcre.h&#62;</b>
-</P>
-<br><a name="SEC1" href="#TOC1">PCRE NATIVE API BASIC FUNCTIONS</a><br>
-<P>
-<b>pcre *pcre_compile(const char *<i>pattern</i>, int <i>options</i>,</b>
-<b>     const char **<i>errptr</i>, int *<i>erroffset</i>,</b>
-<b>     const unsigned char *<i>tableptr</i>);</b>
-<br>
-<br>
-<b>pcre *pcre_compile2(const char *<i>pattern</i>, int <i>options</i>,</b>
-<b>     int *<i>errorcodeptr</i>,</b>
-<b>     const char **<i>errptr</i>, int *<i>erroffset</i>,</b>
-<b>     const unsigned char *<i>tableptr</i>);</b>
-<br>
-<br>
-<b>pcre_extra *pcre_study(const pcre *<i>code</i>, int <i>options</i>,</b>
-<b>     const char **<i>errptr</i>);</b>
-<br>
-<br>
-<b>void pcre_free_study(pcre_extra *<i>extra</i>);</b>
-<br>
-<br>
-<b>int pcre_exec(const pcre *<i>code</i>, const pcre_extra *<i>extra</i>,</b>
-<b>     const char *<i>subject</i>, int <i>length</i>, int <i>startoffset</i>,</b>
-<b>     int <i>options</i>, int *<i>ovector</i>, int <i>ovecsize</i>);</b>
-<br>
-<br>
-<b>int pcre_dfa_exec(const pcre *<i>code</i>, const pcre_extra *<i>extra</i>,</b>
-<b>     const char *<i>subject</i>, int <i>length</i>, int <i>startoffset</i>,</b>
-<b>     int <i>options</i>, int *<i>ovector</i>, int <i>ovecsize</i>,</b>
-<b>     int *<i>workspace</i>, int <i>wscount</i>);</b>
-</P>
-<br><a name="SEC2" href="#TOC1">PCRE NATIVE API STRING EXTRACTION FUNCTIONS</a><br>
-<P>
-<b>int pcre_copy_named_substring(const pcre *<i>code</i>,</b>
-<b>     const char *<i>subject</i>, int *<i>ovector</i>,</b>
-<b>     int <i>stringcount</i>, const char *<i>stringname</i>,</b>
-<b>     char *<i>buffer</i>, int <i>buffersize</i>);</b>
-<br>
-<br>
-<b>int pcre_copy_substring(const char *<i>subject</i>, int *<i>ovector</i>,</b>
-<b>     int <i>stringcount</i>, int <i>stringnumber</i>, char *<i>buffer</i>,</b>
-<b>     int <i>buffersize</i>);</b>
-<br>
-<br>
-<b>int pcre_get_named_substring(const pcre *<i>code</i>,</b>
-<b>     const char *<i>subject</i>, int *<i>ovector</i>,</b>
-<b>     int <i>stringcount</i>, const char *<i>stringname</i>,</b>
-<b>     const char **<i>stringptr</i>);</b>
-<br>
-<br>
-<b>int pcre_get_stringnumber(const pcre *<i>code</i>,</b>
-<b>     const char *<i>name</i>);</b>
-<br>
-<br>
-<b>int pcre_get_stringtable_entries(const pcre *<i>code</i>,</b>
-<b>     const char *<i>name</i>, char **<i>first</i>, char **<i>last</i>);</b>
-<br>
-<br>
-<b>int pcre_get_substring(const char *<i>subject</i>, int *<i>ovector</i>,</b>
-<b>     int <i>stringcount</i>, int <i>stringnumber</i>,</b>
-<b>     const char **<i>stringptr</i>);</b>
-<br>
-<br>
-<b>int pcre_get_substring_list(const char *<i>subject</i>,</b>
-<b>     int *<i>ovector</i>, int <i>stringcount</i>, const char ***<i>listptr</i>);</b>
-<br>
-<br>
-<b>void pcre_free_substring(const char *<i>stringptr</i>);</b>
-<br>
-<br>
-<b>void pcre_free_substring_list(const char **<i>stringptr</i>);</b>
-</P>
-<br><a name="SEC3" href="#TOC1">PCRE NATIVE API AUXILIARY FUNCTIONS</a><br>
-<P>
-<b>int pcre_jit_exec(const pcre *<i>code</i>, const pcre_extra *<i>extra</i>,</b>
-<b>     const char *<i>subject</i>, int <i>length</i>, int <i>startoffset</i>,</b>
-<b>     int <i>options</i>, int *<i>ovector</i>, int <i>ovecsize</i>,</b>
-<b>     pcre_jit_stack *<i>jstack</i>);</b>
-<br>
-<br>
-<b>pcre_jit_stack *pcre_jit_stack_alloc(int <i>startsize</i>, int <i>maxsize</i>);</b>
-<br>
-<br>
-<b>void pcre_jit_stack_free(pcre_jit_stack *<i>stack</i>);</b>
-<br>
-<br>
-<b>void pcre_assign_jit_stack(pcre_extra *<i>extra</i>,</b>
-<b>     pcre_jit_callback <i>callback</i>, void *<i>data</i>);</b>
-<br>
-<br>
-<b>const unsigned char *pcre_maketables(void);</b>
-<br>
-<br>
-<b>int pcre_fullinfo(const pcre *<i>code</i>, const pcre_extra *<i>extra</i>,</b>
-<b>     int <i>what</i>, void *<i>where</i>);</b>
-<br>
-<br>
-<b>int pcre_refcount(pcre *<i>code</i>, int <i>adjust</i>);</b>
-<br>
-<br>
-<b>int pcre_config(int <i>what</i>, void *<i>where</i>);</b>
-<br>
-<br>
-<b>const char *pcre_version(void);</b>
-<br>
-<br>
-<b>int pcre_pattern_to_host_byte_order(pcre *<i>code</i>,</b>
-<b>     pcre_extra *<i>extra</i>, const unsigned char *<i>tables</i>);</b>
-</P>
-<br><a name="SEC4" href="#TOC1">PCRE NATIVE API INDIRECTED FUNCTIONS</a><br>
-<P>
-<b>void *(*pcre_malloc)(size_t);</b>
-<br>
-<br>
-<b>void (*pcre_free)(void *);</b>
-<br>
-<br>
-<b>void *(*pcre_stack_malloc)(size_t);</b>
-<br>
-<br>
-<b>void (*pcre_stack_free)(void *);</b>
-<br>
-<br>
-<b>int (*pcre_callout)(pcre_callout_block *);</b>
-<br>
-<br>
-<b>int (*pcre_stack_guard)(void);</b>
-</P>
-<br><a name="SEC5" href="#TOC1">PCRE 8-BIT, 16-BIT, AND 32-BIT LIBRARIES</a><br>
-<P>
-As well as support for 8-bit character strings, PCRE also supports 16-bit
-strings (from release 8.30) and 32-bit strings (from release 8.32), by means of
-two additional libraries. They can be built as well as, or instead of, the
-8-bit library. To avoid too much complication, this document describes the
-8-bit versions of the functions, with only occasional references to the 16-bit
-and 32-bit libraries.
-</P>
-<P>
-The 16-bit and 32-bit functions operate in the same way as their 8-bit
-counterparts; they just use different data types for their arguments and
-results, and their names start with <b>pcre16_</b> or <b>pcre32_</b> instead of
-<b>pcre_</b>. For every option that has UTF8 in its name (for example,
-PCRE_UTF8), there are corresponding 16-bit and 32-bit names with UTF8 replaced
-by UTF16 or UTF32, respectively. This facility is in fact just cosmetic; the
-16-bit and 32-bit option names define the same bit values.
-</P>
-<P>
-References to bytes and UTF-8 in this document should be read as references to
-16-bit data units and UTF-16 when using the 16-bit library, or 32-bit data
-units and UTF-32 when using the 32-bit library, unless specified otherwise.
-More details of the specific differences for the 16-bit and 32-bit libraries
-are given in the
-<a href="pcre16.html"><b>pcre16</b></a>
-and
-<a href="pcre32.html"><b>pcre32</b></a>
-pages.
-</P>
-<br><a name="SEC6" href="#TOC1">PCRE API OVERVIEW</a><br>
-<P>
-PCRE has its own native API, which is described in this document. There are
-also some wrapper functions (for the 8-bit library only) that correspond to the
-POSIX regular expression API, but they do not give access to all the
-functionality. They are described in the
-<a href="pcreposix.html"><b>pcreposix</b></a>
-documentation. Both of these APIs define a set of C function calls. A C++
-wrapper (again for the 8-bit library only) is also distributed with PCRE. It is
-documented in the
-<a href="pcrecpp.html"><b>pcrecpp</b></a>
-page.
-</P>
-<P>
-The native API C function prototypes are defined in the header file
-<b>pcre.h</b>, and on Unix-like systems the (8-bit) library itself is called
-<b>libpcre</b>. It can normally be accessed by adding <b>-lpcre</b> to the
-command for linking an application that uses PCRE. The header file defines the
-macros PCRE_MAJOR and PCRE_MINOR to contain the major and minor release numbers
-for the library. Applications can use these to include support for different
-releases of PCRE.
-</P>
-<P>
-In a Windows environment, if you want to statically link an application program
-against a non-dll <b>pcre.a</b> file, you must define PCRE_STATIC before
-including <b>pcre.h</b> or <b>pcrecpp.h</b>, because otherwise the
-<b>pcre_malloc()</b> and <b>pcre_free()</b> exported functions will be declared
-<b>__declspec(dllimport)</b>, with unwanted results.
-</P>
-<P>
-The functions <b>pcre_compile()</b>, <b>pcre_compile2()</b>, <b>pcre_study()</b>,
-and <b>pcre_exec()</b> are used for compiling and matching regular expressions
-in a Perl-compatible manner. A sample program that demonstrates the simplest
-way of using them is provided in the file called <i>pcredemo.c</i> in the PCRE
-source distribution. A listing of this program is given in the
-<a href="pcredemo.html"><b>pcredemo</b></a>
-documentation, and the
-<a href="pcresample.html"><b>pcresample</b></a>
-documentation describes how to compile and run it.
-</P>
-<P>
-Just-in-time compiler support is an optional feature of PCRE that can be built
-in appropriate hardware environments. It greatly speeds up the matching
-performance of many patterns. Simple programs can easily request that it be
-used if available, by setting an option that is ignored when it is not
-relevant. More complicated programs might need to make use of the functions
-<b>pcre_jit_stack_alloc()</b>, <b>pcre_jit_stack_free()</b>, and
-<b>pcre_assign_jit_stack()</b> in order to control the JIT code's memory usage.
-</P>
-<P>
-From release 8.32 there is also a direct interface for JIT execution, which
-gives improved performance. The JIT-specific functions are discussed in the
-<a href="pcrejit.html"><b>pcrejit</b></a>
-documentation.
-</P>
-<P>
-A second matching function, <b>pcre_dfa_exec()</b>, which is not
-Perl-compatible, is also provided. This uses a different algorithm for the
-matching. The alternative algorithm finds all possible matches (at a given
-point in the subject), and scans the subject just once (unless there are
-lookbehind assertions). However, this algorithm does not return captured
-substrings. A description of the two matching algorithms and their advantages
-and disadvantages is given in the
-<a href="pcrematching.html"><b>pcrematching</b></a>
-documentation.
-</P>
-<P>
-In addition to the main compiling and matching functions, there are convenience
-functions for extracting captured substrings from a subject string that is
-matched by <b>pcre_exec()</b>. They are:
-<pre>
-  <b>pcre_copy_substring()</b>
-  <b>pcre_copy_named_substring()</b>
-  <b>pcre_get_substring()</b>
-  <b>pcre_get_named_substring()</b>
-  <b>pcre_get_substring_list()</b>
-  <b>pcre_get_stringnumber()</b>
-  <b>pcre_get_stringtable_entries()</b>
-</pre>
-<b>pcre_free_substring()</b> and <b>pcre_free_substring_list()</b> are also
-provided, to free the memory used for extracted strings.
-</P>
-<P>
-The function <b>pcre_maketables()</b> is used to build a set of character tables
-in the current locale for passing to <b>pcre_compile()</b>, <b>pcre_exec()</b>,
-or <b>pcre_dfa_exec()</b>. This is an optional facility that is provided for
-specialist use. Most commonly, no special tables are passed, in which case
-internal tables that are generated when PCRE is built are used.
-</P>
-<P>
-The function <b>pcre_fullinfo()</b> is used to find out information about a
-compiled pattern. The function <b>pcre_version()</b> returns a pointer to a
-string containing the version of PCRE and its date of release.
-</P>
-<P>
-The function <b>pcre_refcount()</b> maintains a reference count in a data block
-containing a compiled pattern. This is provided for the benefit of
-object-oriented applications.
-</P>
-<P>
-The global variables <b>pcre_malloc</b> and <b>pcre_free</b> initially contain
-the entry points of the standard <b>malloc()</b> and <b>free()</b> functions,
-respectively. PCRE calls the memory management functions via these variables,
-so a calling program can replace them if it wishes to intercept the calls. This
-should be done before calling any PCRE functions.
-</P>
-<P>
-The global variables <b>pcre_stack_malloc</b> and <b>pcre_stack_free</b> are also
-indirections to memory management functions. These special functions are used
-only when PCRE is compiled to use the heap for remembering data, instead of
-recursive function calls, when running the <b>pcre_exec()</b> function. See the
-<a href="pcrebuild.html"><b>pcrebuild</b></a>
-documentation for details of how to do this. It is a non-standard way of
-building PCRE, for use in environments that have limited stacks. Because of the
-greater use of memory management, it runs more slowly. Separate functions are
-provided so that special-purpose external code can be used for this case. When
-used, these functions are always called in a stack-like manner (last obtained,
-first freed), and always for memory blocks of the same size. There is a
-discussion about PCRE's stack usage in the
-<a href="pcrestack.html"><b>pcrestack</b></a>
-documentation.
-</P>
-<P>
-The global variable <b>pcre_callout</b> initially contains NULL. It can be set
-by the caller to a "callout" function, which PCRE will then call at specified
-points during a matching operation. Details are given in the
-<a href="pcrecallout.html"><b>pcrecallout</b></a>
-documentation.
-</P>
-<P>
-The global variable <b>pcre_stack_guard</b> initially contains NULL. It can be
-set by the caller to a function that is called by PCRE whenever it starts
-to compile a parenthesized part of a pattern. When parentheses are nested, PCRE
-uses recursive function calls, which use up the system stack. This function is
-provided so that applications with restricted stacks can force a compilation
-error if the stack runs out. The function should return zero if all is well, or
-non-zero to force an error.
-<a name="newlines"></a></P>
-<br><a name="SEC7" href="#TOC1">NEWLINES</a><br>
-<P>
-PCRE supports five different conventions for indicating line breaks in
-strings: a single CR (carriage return) character, a single LF (linefeed)
-character, the two-character sequence CRLF, any of the three preceding, or any
-Unicode newline sequence. The Unicode newline sequences are the three just
-mentioned, plus the single characters VT (vertical tab, U+000B), FF (form feed,
-U+000C), NEL (next line, U+0085), LS (line separator, U+2028), and PS
-(paragraph separator, U+2029).
-</P>
-<P>
-Each of the first three conventions is used by at least one operating system as
-its standard newline sequence. When PCRE is built, a default can be specified.
-The default default is LF, which is the Unix standard. When PCRE is run, the
-default can be overridden, either when a pattern is compiled, or when it is
-matched.
-</P>
-<P>
-At compile time, the newline convention can be specified by the <i>options</i>
-argument of <b>pcre_compile()</b>, or it can be specified by special text at the
-start of the pattern itself; this overrides any other settings. See the
-<a href="pcrepattern.html"><b>pcrepattern</b></a>
-page for details of the special character sequences.
-</P>
-<P>
-In the PCRE documentation the word "newline" is used to mean "the character or
-pair of characters that indicate a line break". The choice of newline
-convention affects the handling of the dot, circumflex, and dollar
-metacharacters, the handling of #-comments in /x mode, and, when CRLF is a
-recognized line ending sequence, the match position advancement for a
-non-anchored pattern. There is more detail about this in the
-<a href="#execoptions">section on <b>pcre_exec()</b> options</a>
-below.
-</P>
-<P>
-The choice of newline convention does not affect the interpretation of
-the \n or \r escape sequences, nor does it affect what \R matches, which is
-controlled in a similar way, but by separate options.
-</P>
-<br><a name="SEC8" href="#TOC1">MULTITHREADING</a><br>
-<P>
-The PCRE functions can be used in multi-threading applications, with the
-proviso that the memory management functions pointed to by <b>pcre_malloc</b>,
-<b>pcre_free</b>, <b>pcre_stack_malloc</b>, and <b>pcre_stack_free</b>, and the
-callout and stack-checking functions pointed to by <b>pcre_callout</b> and
-<b>pcre_stack_guard</b>, are shared by all threads.
-</P>
-<P>
-The compiled form of a regular expression is not altered during matching, so
-the same compiled pattern can safely be used by several threads at once.
-</P>
-<P>
-If the just-in-time optimization feature is being used, it needs separate
-memory stack areas for each thread. See the
-<a href="pcrejit.html"><b>pcrejit</b></a>
-documentation for more details.
-</P>
-<br><a name="SEC9" href="#TOC1">SAVING PRECOMPILED PATTERNS FOR LATER USE</a><br>
-<P>
-The compiled form of a regular expression can be saved and re-used at a later
-time, possibly by a different program, and even on a host other than the one on
-which it was compiled. Details are given in the
-<a href="pcreprecompile.html"><b>pcreprecompile</b></a>
-documentation, which includes a description of the
-<b>pcre_pattern_to_host_byte_order()</b> function. However, compiling a regular
-expression with one version of PCRE for use with a different version is not
-guaranteed to work and may cause crashes.
-</P>
-<br><a name="SEC10" href="#TOC1">CHECKING BUILD-TIME OPTIONS</a><br>
-<P>
-<b>int pcre_config(int <i>what</i>, void *<i>where</i>);</b>
-</P>
-<P>
-The function <b>pcre_config()</b> makes it possible for a PCRE client to
-discover which optional features have been compiled into the PCRE library. The
-<a href="pcrebuild.html"><b>pcrebuild</b></a>
-documentation has more details about these optional features.
-</P>
-<P>
-The first argument for <b>pcre_config()</b> is an integer, specifying which
-information is required; the second argument is a pointer to a variable into
-which the information is placed. The returned value is zero on success, or the
-negative error code PCRE_ERROR_BADOPTION if the value in the first argument is
-not recognized. The following information is available:
-<pre>
-  PCRE_CONFIG_UTF8
-</pre>
-The output is an integer that is set to one if UTF-8 support is available;
-otherwise it is set to zero. This value should normally be given to the 8-bit
-version of this function, <b>pcre_config()</b>. If it is given to the 16-bit
-or 32-bit version of this function, the result is PCRE_ERROR_BADOPTION.
-<pre>
-  PCRE_CONFIG_UTF16
-</pre>
-The output is an integer that is set to one if UTF-16 support is available;
-otherwise it is set to zero. This value should normally be given to the 16-bit
-version of this function, <b>pcre16_config()</b>. If it is given to the 8-bit
-or 32-bit version of this function, the result is PCRE_ERROR_BADOPTION.
-<pre>
-  PCRE_CONFIG_UTF32
-</pre>
-The output is an integer that is set to one if UTF-32 support is available;
-otherwise it is set to zero. This value should normally be given to the 32-bit
-version of this function, <b>pcre32_config()</b>. If it is given to the 8-bit
-or 16-bit version of this function, the result is PCRE_ERROR_BADOPTION.
-<pre>
-  PCRE_CONFIG_UNICODE_PROPERTIES
-</pre>
-The output is an integer that is set to one if support for Unicode character
-properties is available; otherwise it is set to zero.
-<pre>
-  PCRE_CONFIG_JIT
-</pre>
-The output is an integer that is set to one if support for just-in-time
-compiling is available; otherwise it is set to zero.
-<pre>
-  PCRE_CONFIG_JITTARGET
-</pre>
-The output is a pointer to a zero-terminated "const char *" string. If JIT
-support is available, the string contains the name of the architecture for
-which the JIT compiler is configured, for example "x86 32bit (little endian +
-unaligned)". If JIT support is not available, the result is NULL.
-<pre>
-  PCRE_CONFIG_NEWLINE
-</pre>
-The output is an integer whose value specifies the default character sequence
-that is recognized as meaning "newline". The values that are supported in
-ASCII/Unicode environments are: 10 for LF, 13 for CR, 3338 for CRLF, -2 for
-ANYCRLF, and -1 for ANY. In EBCDIC environments, CR, ANYCRLF, and ANY yield the
-same values. However, the value for LF is normally 21, though some EBCDIC
-environments use 37. The corresponding values for CRLF are 3349 and 3365. The
-default should normally correspond to the standard sequence for your operating
-system.
-<pre>
-  PCRE_CONFIG_BSR
-</pre>
-The output is an integer whose value indicates what character sequences the \R
-escape sequence matches by default. A value of 0 means that \R matches any
-Unicode line ending sequence; a value of 1 means that \R matches only CR, LF,
-or CRLF. The default can be overridden when a pattern is compiled or matched.
-<pre>
-  PCRE_CONFIG_LINK_SIZE
-</pre>
-The output is an integer that contains the number of bytes used for internal
-linkage in compiled regular expressions. For the 8-bit library, the value can
-be 2, 3, or 4. For the 16-bit library, the value is either 2 or 4 and is still
-a number of bytes. For the 32-bit library, the value is either 2 or 4 and is
-still a number of bytes. The default value of 2 is sufficient for all but the
-most massive patterns, since it allows the compiled pattern to be up to 64K in
-size. Larger values allow larger regular expressions to be compiled, at the
-expense of slower matching.
-<pre>
-  PCRE_CONFIG_POSIX_MALLOC_THRESHOLD
-</pre>
-The output is an integer that contains the threshold above which the POSIX
-interface uses <b>malloc()</b> for output vectors. Further details are given in
-the
-<a href="pcreposix.html"><b>pcreposix</b></a>
-documentation.
-<pre>
-  PCRE_CONFIG_PARENS_LIMIT
-</pre>
-The output is a long integer that gives the maximum depth of nesting of
-parentheses (of any kind) in a pattern. This limit is imposed to cap the amount
-of system stack used when a pattern is compiled. It is specified when PCRE is
-built; the default is 250. This limit does not take into account the stack that
-may already be used by the calling application. For finer control over
-compilation stack usage, you can set a pointer to an external checking function
-in <b>pcre_stack_guard</b>.
-<pre>
-  PCRE_CONFIG_MATCH_LIMIT
-</pre>
-The output is a long integer that gives the default limit for the number of
-internal matching function calls in a <b>pcre_exec()</b> execution. Further
-details are given with <b>pcre_exec()</b> below.
-<pre>
-  PCRE_CONFIG_MATCH_LIMIT_RECURSION
-</pre>
-The output is a long integer that gives the default limit for the depth of
-recursion when calling the internal matching function in a <b>pcre_exec()</b>
-execution. Further details are given with <b>pcre_exec()</b> below.
-<pre>
-  PCRE_CONFIG_STACKRECURSE
-</pre>
-The output is an integer that is set to one if internal recursion when running
-<b>pcre_exec()</b> is implemented by recursive function calls that use the stack
-to remember their state. This is the usual way that PCRE is compiled. The
-output is zero if PCRE was compiled to use blocks of data on the heap instead
-of recursive function calls. In this case, <b>pcre_stack_malloc</b> and
-<b>pcre_stack_free</b> are called to manage memory blocks on the heap, thus
-avoiding the use of the stack.
-</P>
-<br><a name="SEC11" href="#TOC1">COMPILING A PATTERN</a><br>
-<P>
-<b>pcre *pcre_compile(const char *<i>pattern</i>, int <i>options</i>,</b>
-<b>     const char **<i>errptr</i>, int *<i>erroffset</i>,</b>
-<b>     const unsigned char *<i>tableptr</i>);</b>
-<br>
-<br>
-<b>pcre *pcre_compile2(const char *<i>pattern</i>, int <i>options</i>,</b>
-<b>     int *<i>errorcodeptr</i>,</b>
-<b>     const char **<i>errptr</i>, int *<i>erroffset</i>,</b>
-<b>     const unsigned char *<i>tableptr</i>);</b>
-</P>
-<P>
-Either of the functions <b>pcre_compile()</b> or <b>pcre_compile2()</b> can be
-called to compile a pattern into an internal form. The only difference between
-the two interfaces is that <b>pcre_compile2()</b> has an additional argument,
-<i>errorcodeptr</i>, via which a numerical error code can be returned. To avoid
-too much repetition, we refer just to <b>pcre_compile()</b> below, but the
-information applies equally to <b>pcre_compile2()</b>.
-</P>
-<P>
-The pattern is a C string terminated by a binary zero, and is passed in the
-<i>pattern</i> argument. A pointer to a single block of memory that is obtained
-via <b>pcre_malloc</b> is returned. This contains the compiled code and related
-data. The <b>pcre</b> type is defined for the returned block; this is a typedef
-for a structure whose contents are not externally defined. It is up to the
-caller to free the memory (via <b>pcre_free</b>) when it is no longer required.
-</P>
-<P>
-Although the compiled code of a PCRE regex is relocatable, that is, it does not
-depend on memory location, the complete <b>pcre</b> data block is not
-fully relocatable, because it may contain a copy of the <i>tableptr</i>
-argument, which is an address (see below).
-</P>
-<P>
-The <i>options</i> argument contains various bit settings that affect the
-compilation. It should be zero if no options are required. The available
-options are described below. Some of them (in particular, those that are
-compatible with Perl, but some others as well) can also be set and unset from
-within the pattern (see the detailed description in the
-<a href="pcrepattern.html"><b>pcrepattern</b></a>
-documentation). For those options that can be different in different parts of
-the pattern, the contents of the <i>options</i> argument specifies their
-settings at the start of compilation and execution. The PCRE_ANCHORED,
-PCRE_BSR_<i>xxx</i>, PCRE_NEWLINE_<i>xxx</i>, PCRE_NO_UTF8_CHECK, and
-PCRE_NO_START_OPTIMIZE options can be set at the time of matching as well as at
-compile time.
-</P>
-<P>
-If <i>errptr</i> is NULL, <b>pcre_compile()</b> returns NULL immediately.
-Otherwise, if compilation of a pattern fails, <b>pcre_compile()</b> returns
-NULL, and sets the variable pointed to by <i>errptr</i> to point to a textual
-error message. This is a static string that is part of the library. You must
-not try to free it. Normally, the offset from the start of the pattern to the
-data unit that was being processed when the error was discovered is placed in
-the variable pointed to by <i>erroffset</i>, which must not be NULL (if it is,
-an immediate error is given). However, for an invalid UTF-8 or UTF-16 string,
-the offset is that of the first data unit of the failing character.
-</P>
-<P>
-Some errors are not detected until the whole pattern has been scanned; in these
-cases, the offset passed back is the length of the pattern. Note that the
-offset is in data units, not characters, even in a UTF mode. It may sometimes
-point into the middle of a UTF-8 or UTF-16 character.
-</P>
-<P>
-If <b>pcre_compile2()</b> is used instead of <b>pcre_compile()</b>, and the
-<i>errorcodeptr</i> argument is not NULL, a non-zero error code number is
-returned via this argument in the event of an error. This is in addition to the
-textual error message. Error codes and messages are listed below.
-</P>
-<P>
-If the final argument, <i>tableptr</i>, is NULL, PCRE uses a default set of
-character tables that are built when PCRE is compiled, using the default C
-locale. Otherwise, <i>tableptr</i> must be an address that is the result of a
-call to <b>pcre_maketables()</b>. This value is stored with the compiled
-pattern, and used again by <b>pcre_exec()</b> and <b>pcre_dfa_exec()</b> when the
-pattern is matched. For more discussion, see the section on locale support
-below.
-</P>
-<P>
-This code fragment shows a typical straightforward call to <b>pcre_compile()</b>:
-<pre>
-  pcre *re;
-  const char *error;
-  int erroffset;
-  re = pcre_compile(
-    "^A.*Z",          /* the pattern */
-    0,                /* default options */
-    &error,           /* for error message */
-    &erroffset,       /* for error offset */
-    NULL);            /* use default character tables */
-</pre>
-The following names for option bits are defined in the <b>pcre.h</b> header
-file:
-<pre>
-  PCRE_ANCHORED
-</pre>
-If this bit is set, the pattern is forced to be "anchored", that is, it is
-constrained to match only at the first matching point in the string that is
-being searched (the "subject string"). This effect can also be achieved by
-appropriate constructs in the pattern itself, which is the only way to do it in
-Perl.
-<pre>
-  PCRE_AUTO_CALLOUT
-</pre>
-If this bit is set, <b>pcre_compile()</b> automatically inserts callout items,
-all with number 255, before each pattern item. For discussion of the callout
-facility, see the
-<a href="pcrecallout.html"><b>pcrecallout</b></a>
-documentation.
-<pre>
-  PCRE_BSR_ANYCRLF
-  PCRE_BSR_UNICODE
-</pre>
-These options (which are mutually exclusive) control what the \R escape
-sequence matches. The choice is either to match only CR, LF, or CRLF, or to
-match any Unicode newline sequence. The default is specified when PCRE is
-built. It can be overridden from within the pattern, or by setting an option
-when a compiled pattern is matched.
-<pre>
-  PCRE_CASELESS
-</pre>
-If this bit is set, letters in the pattern match both upper and lower case
-letters. It is equivalent to Perl's /i option, and it can be changed within a
-pattern by a (?i) option setting. 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.
-<pre>
-  PCRE_DOLLAR_ENDONLY
-</pre>
-If this bit is set, a dollar metacharacter in the pattern matches only at the
-end of the subject string. Without this option, a dollar also matches
-immediately before a newline at the end of the string (but not before any other
-newlines). The PCRE_DOLLAR_ENDONLY option is ignored if PCRE_MULTILINE is set.
-There is no equivalent to this option in Perl, and no way to set it within a
-pattern.
-<pre>
-  PCRE_DOTALL
-</pre>
-If this bit is set, a dot metacharacter in the pattern matches a character of
-any value, including one that indicates a newline. However, it only ever
-matches one character, even if newlines are coded as CRLF. Without this option,
-a dot does not match when the current position is at a newline. This option is
-equivalent to Perl's /s option, and it can be changed within a pattern by a
-(?s) option setting. A negative class such as [^a] always matches newline
-characters, independent of the setting of this option.
-<pre>
-  PCRE_DUPNAMES
-</pre>
-If this bit is set, names used to identify capturing subpatterns need not be
-unique. This can be helpful for certain types of pattern when it is known that
-only one instance of the named subpattern can ever be matched. There are more
-details of named subpatterns below; see also the
-<a href="pcrepattern.html"><b>pcrepattern</b></a>
-documentation.
-<pre>
-  PCRE_EXTENDED
-</pre>
-If this bit is set, most white space characters in the pattern are totally
-ignored except when escaped or inside a character class. However, white space
-is not allowed within sequences such as (?&#62; that introduce various
-parenthesized subpatterns, nor within a numerical quantifier such as {1,3}.
-However, ignorable white space is permitted between an item and a following
-quantifier and between a quantifier and a following + that indicates
-possessiveness.
-</P>
-<P>
-White space did not used to include the VT character (code 11), because Perl
-did not treat this character as white space. However, Perl changed at release
-5.18, so PCRE followed at release 8.34, and VT is now treated as white space.
-</P>
-<P>
-PCRE_EXTENDED also causes characters between an unescaped # outside a character
-class and the next newline, inclusive, to be ignored. PCRE_EXTENDED is
-equivalent to Perl's /x option, and it can be changed within a pattern by a
-(?x) option setting.
-</P>
-<P>
-Which characters are interpreted as newlines is controlled by the options
-passed to <b>pcre_compile()</b> or by a special sequence at the start of the
-pattern, as described in the section entitled
-<a href="pcrepattern.html#newlines">"Newline conventions"</a>
-in the <b>pcrepattern</b> documentation. Note that the end of this type of
-comment is a literal newline sequence in the pattern; escape sequences that
-happen to represent a newline do not count.
-</P>
-<P>
-This option makes it possible to include comments inside complicated patterns.
-Note, however, that this applies only to data characters. White space characters
-may never appear within special character sequences in a pattern, for example
-within the sequence (?( that introduces a conditional subpattern.
-<pre>
-  PCRE_EXTRA
-</pre>
-This option was invented in order to turn on additional functionality of PCRE
-that is incompatible with Perl, but it is currently of very little use. When
-set, any backslash in a pattern that is followed by a letter that has no
-special meaning causes an error, thus reserving these combinations for future
-expansion. By default, as in Perl, a backslash followed by a letter with no
-special meaning is treated as a literal. (Perl can, however, be persuaded to
-give an error for this, by running it with the -w option.) There are at present
-no other features controlled by this option. It can also be set by a (?X)
-option setting within a pattern.
-<pre>
-  PCRE_FIRSTLINE
-</pre>
-If this option is set, an unanchored pattern is required to match before or at
-the first newline in the subject string, though the matched text may continue
-over the newline.
-<pre>
-  PCRE_JAVASCRIPT_COMPAT
-</pre>
-If this option is set, PCRE's behaviour is changed in some ways so that it is
-compatible with JavaScript rather than Perl. The changes are as follows:
-</P>
-<P>
-(1) A lone closing square bracket in a pattern causes a compile-time error,
-because this is illegal in JavaScript (by default it is treated as a data
-character). Thus, the pattern AB]CD becomes illegal when this option is set.
-</P>
-<P>
-(2) At run time, a back reference to an unset subpattern group matches an empty
-string (by default this causes the current matching alternative to fail). A
-pattern such as (\1)(a) succeeds when this option is set (assuming it can find
-an "a" in the subject), whereas it fails by default, for Perl compatibility.
-</P>
-<P>
-(3) \U matches an upper case "U" character; by default \U causes a compile
-time error (Perl uses \U to upper case subsequent characters).
-</P>
-<P>
-(4) \u matches a lower case "u" character unless it is followed by four
-hexadecimal digits, in which case the hexadecimal number defines the code point
-to match. By default, \u causes a compile time error (Perl uses it to upper
-case the following character).
-</P>
-<P>
-(5) \x matches a lower case "x" character unless it is followed by two
-hexadecimal digits, in which case the hexadecimal number defines the code point
-to match. By default, as in Perl, a hexadecimal number is always expected after
-\x, but it may have zero, one, or two digits (so, for example, \xz matches a
-binary zero character followed by z).
-<pre>
-  PCRE_MULTILINE
-</pre>
-By default, for the purposes of matching "start of line" and "end of line",
-PCRE treats the subject string as consisting of a single line of characters,
-even if it actually contains newlines. The "start of line" metacharacter (^)
-matches only at the start of the string, and the "end of line" metacharacter
-($) matches only at the end of the string, or before a terminating newline
-(except when PCRE_DOLLAR_ENDONLY is set). Note, however, that unless
-PCRE_DOTALL is set, the "any character" metacharacter (.) does not match at a
-newline. This behaviour (for ^, $, and dot) is the same as Perl.
-</P>
-<P>
-When PCRE_MULTILINE it is set, the "start of line" and "end of line" constructs
-match immediately following or immediately before internal newlines in the
-subject string, respectively, as well as at the very start and end. This is
-equivalent to Perl's /m option, and it can be changed within a pattern by a
-(?m) option setting. If there are no newlines in a subject string, or no
-occurrences of ^ or $ in a pattern, setting PCRE_MULTILINE has no effect.
-<pre>
-  PCRE_NEVER_UTF
-</pre>
-This option locks out interpretation of the pattern as UTF-8 (or UTF-16 or
-UTF-32 in the 16-bit and 32-bit libraries). In particular, it prevents the
-creator of the pattern from switching to UTF interpretation by starting the
-pattern with (*UTF). This may be useful in applications that process patterns
-from external sources. The combination of PCRE_UTF8 and PCRE_NEVER_UTF also
-causes an error.
-<pre>
-  PCRE_NEWLINE_CR
-  PCRE_NEWLINE_LF
-  PCRE_NEWLINE_CRLF
-  PCRE_NEWLINE_ANYCRLF
-  PCRE_NEWLINE_ANY
-</pre>
-These options override the default newline definition that was chosen when PCRE
-was built. Setting the first or the second specifies that a newline is
-indicated by a single character (CR or LF, respectively). Setting
-PCRE_NEWLINE_CRLF specifies that a newline is indicated by the two-character
-CRLF sequence. Setting PCRE_NEWLINE_ANYCRLF specifies that any of the three
-preceding sequences should be recognized. Setting PCRE_NEWLINE_ANY specifies
-that any Unicode newline sequence should be recognized.
-</P>
-<P>
-In an ASCII/Unicode environment, the Unicode newline sequences are the three
-just mentioned, plus the single characters VT (vertical tab, U+000B), FF (form
-feed, U+000C), NEL (next line, U+0085), LS (line separator, U+2028), and PS
-(paragraph separator, U+2029). For the 8-bit library, the last two are
-recognized only in UTF-8 mode.
-</P>
-<P>
-When PCRE is compiled to run in an EBCDIC (mainframe) environment, the code for
-CR is 0x0d, the same as ASCII. However, the character code for LF is normally
-0x15, though in some EBCDIC environments 0x25 is used. Whichever of these is
-not LF is made to correspond to Unicode's NEL character. EBCDIC codes are all
-less than 256. For more details, see the
-<a href="pcrebuild.html"><b>pcrebuild</b></a>
-documentation.
-</P>
-<P>
-The newline setting in the options word uses three bits that are treated
-as a number, giving eight possibilities. Currently only six are used (default
-plus the five values above). This means that if you set more than one newline
-option, the combination may or may not be sensible. For example,
-PCRE_NEWLINE_CR with PCRE_NEWLINE_LF is equivalent to PCRE_NEWLINE_CRLF, but
-other combinations may yield unused numbers and cause an error.
-</P>
-<P>
-The only time that a line break in a pattern is specially recognized when
-compiling is when PCRE_EXTENDED is set. CR and LF are white space characters,
-and so are ignored in this mode. Also, an unescaped # outside a character class
-indicates a comment that lasts until after the next line break sequence. In
-other circumstances, line break sequences in patterns are treated as literal
-data.
-</P>
-<P>
-The newline option that is set at compile time becomes the default that is used
-for <b>pcre_exec()</b> and <b>pcre_dfa_exec()</b>, but it can be overridden.
-<pre>
-  PCRE_NO_AUTO_CAPTURE
-</pre>
-If this option is set, it disables the use of numbered capturing parentheses in
-the pattern. Any opening parenthesis that is not followed by ? behaves as if it
-were followed by ?: but named parentheses can still be used for capturing (and
-they acquire numbers in the usual way). There is no equivalent of this option
-in Perl.
-<pre>
-  PCRE_NO_AUTO_POSSESS
-</pre>
-If this option is set, it disables "auto-possessification". This is an
-optimization that, for example, turns a+b into a++b in order to avoid
-backtracks into a+ that can never be successful. However, if callouts are in
-use, auto-possessification means that some of them are never taken. You can set
-this option if you want the matching functions to do a full unoptimized search
-and run all the callouts, but it is mainly provided for testing purposes.
-<pre>
-  PCRE_NO_START_OPTIMIZE
-</pre>
-This is an option that acts at matching time; that is, it is really an option
-for <b>pcre_exec()</b> or <b>pcre_dfa_exec()</b>. If it is set at compile time,
-it is remembered with the compiled pattern and assumed at matching time. This
-is necessary if you want to use JIT execution, because the JIT compiler needs
-to know whether or not this option is set. For details see the discussion of
-PCRE_NO_START_OPTIMIZE
-<a href="#execoptions">below.</a>
-<pre>
-  PCRE_UCP
-</pre>
-This option changes the way PCRE processes \B, \b, \D, \d, \S, \s, \W,
-\w, and some of the POSIX character classes. By default, only ASCII characters
-are recognized, but if PCRE_UCP is set, Unicode properties are used instead to
-classify characters. More details are given in the section on
-<a href="pcre.html#genericchartypes">generic character types</a>
-in the
-<a href="pcrepattern.html"><b>pcrepattern</b></a>
-page. If you set PCRE_UCP, matching one of the items it affects takes much
-longer. The option is available only if PCRE has been compiled with Unicode
-property support.
-<pre>
-  PCRE_UNGREEDY
-</pre>
-This option inverts the "greediness" of the quantifiers so that they are not
-greedy by default, but become greedy if followed by "?". It is not compatible
-with Perl. It can also be set by a (?U) option setting within the pattern.
-<pre>
-  PCRE_UTF8
-</pre>
-This option causes PCRE to regard both the pattern and the subject as strings
-of UTF-8 characters instead of single-byte strings. However, it is available
-only when PCRE is built to include UTF support. If not, the use of this option
-provokes an error. Details of how this option changes the behaviour of PCRE are
-given in the
-<a href="pcreunicode.html"><b>pcreunicode</b></a>
-page.
-<pre>
-  PCRE_NO_UTF8_CHECK
-</pre>
-When PCRE_UTF8 is set, the validity of the pattern as a UTF-8 string is
-automatically checked. There is a discussion about the
-<a href="pcreunicode.html#utf8strings">validity of UTF-8 strings</a>
-in the
-<a href="pcreunicode.html"><b>pcreunicode</b></a>
-page. If an invalid UTF-8 sequence is found, <b>pcre_compile()</b> returns an
-error. If you already know that your pattern is valid, and you want to skip
-this check for performance reasons, you can set the PCRE_NO_UTF8_CHECK option.
-When it is set, the effect of passing an invalid UTF-8 string as a pattern is
-undefined. It may cause your program to crash or loop. Note that this option
-can also be passed to <b>pcre_exec()</b> and <b>pcre_dfa_exec()</b>, to suppress
-the validity checking of subject strings only. If the same string is being
-matched many times, the option can be safely set for the second and subsequent
-matchings to improve performance.
-</P>
-<br><a name="SEC12" href="#TOC1">COMPILATION ERROR CODES</a><br>
-<P>
-The following table lists the error codes than may be returned by
-<b>pcre_compile2()</b>, along with the error messages that may be returned by
-both compiling functions. Note that error messages are always 8-bit ASCII
-strings, even in 16-bit or 32-bit mode. As PCRE has developed, some error codes
-have fallen out of use. To avoid confusion, they have not been re-used.
-<pre>
-   0  no error
-   1  \ at end of pattern
-   2  \c at end of pattern
-   3  unrecognized character follows \
-   4  numbers out of order in {} quantifier
-   5  number too big in {} quantifier
-   6  missing terminating ] for character class
-   7  invalid escape sequence in character class
-   8  range out of order in character class
-   9  nothing to repeat
-  10  [this code is not in use]
-  11  internal error: unexpected repeat
-  12  unrecognized character after (? or (?-
-  13  POSIX named classes are supported only within a class
-  14  missing )
-  15  reference to non-existent subpattern
-  16  erroffset passed as NULL
-  17  unknown option bit(s) set
-  18  missing ) after comment
-  19  [this code is not in use]
-  20  regular expression is too large
-  21  failed to get memory
-  22  unmatched parentheses
-  23  internal error: code overflow
-  24  unrecognized character after (?&#60;
-  25  lookbehind assertion is not fixed length
-  26  malformed number or name after (?(
-  27  conditional group contains more than two branches
-  28  assertion expected after (?(
-  29  (?R or (?[+-]digits must be followed by )
-  30  unknown POSIX class name
-  31  POSIX collating elements are not supported
-  32  this version of PCRE is compiled without UTF support
-  33  [this code is not in use]
-  34  character value in \x{} or \o{} is too large
-  35  invalid condition (?(0)
-  36  \C not allowed in lookbehind assertion
-  37  PCRE does not support \L, \l, \N{name}, \U, or \u
-  38  number after (?C is &#62; 255
-  39  closing ) for (?C expected
-  40  recursive call could loop indefinitely
-  41  unrecognized character after (?P
-  42  syntax error in subpattern name (missing terminator)
-  43  two named subpatterns have the same name
-  44  invalid UTF-8 string (specifically UTF-8)
-  45  support for \P, \p, and \X has not been compiled
-  46  malformed \P or \p sequence
-  47  unknown property name after \P or \p
-  48  subpattern name is too long (maximum 32 characters)
-  49  too many named subpatterns (maximum 10000)
-  50  [this code is not in use]
-  51  octal value is greater than \377 in 8-bit non-UTF-8 mode
-  52  internal error: overran compiling workspace
-  53  internal error: previously-checked referenced subpattern
-        not found
-  54  DEFINE group contains more than one branch
-  55  repeating a DEFINE group is not allowed
-  56  inconsistent NEWLINE options
-  57  \g is not followed by a braced, angle-bracketed, or quoted
-        name/number or by a plain number
-  58  a numbered reference must not be zero
-  59  an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)
-  60  (*VERB) not recognized or malformed
-  61  number is too big
-  62  subpattern name expected
-  63  digit expected after (?+
-  64  ] is an invalid data character in JavaScript compatibility mode
-  65  different names for subpatterns of the same number are
-        not allowed
-  66  (*MARK) must have an argument
-  67  this version of PCRE is not compiled with Unicode property
-        support
-  68  \c must be followed by an ASCII character
-  69  \k is not followed by a braced, angle-bracketed, or quoted name
-  70  internal error: unknown opcode in find_fixedlength()
-  71  \N is not supported in a class
-  72  too many forward references
-  73  disallowed Unicode code point (&#62;= 0xd800 && &#60;= 0xdfff)
-  74  invalid UTF-16 string (specifically UTF-16)
-  75  name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)
-  76  character value in \u.... sequence is too large
-  77  invalid UTF-32 string (specifically UTF-32)
-  78  setting UTF is disabled by the application
-  79  non-hex character in \x{} (closing brace missing?)
-  80  non-octal character in \o{} (closing brace missing?)
-  81  missing opening brace after \o
-  82  parentheses are too deeply nested
-  83  invalid range in character class
-  84  group name must start with a non-digit
-  85  parentheses are too deeply nested (stack check)
-</pre>
-The numbers 32 and 10000 in errors 48 and 49 are defaults; different values may
-be used if the limits were changed when PCRE was built.
-<a name="studyingapattern"></a></P>
-<br><a name="SEC13" href="#TOC1">STUDYING A PATTERN</a><br>
-<P>
-<b>pcre_extra *pcre_study(const pcre *<i>code</i>, int <i>options</i>,</b>
-<b>     const char **<i>errptr</i>);</b>
-</P>
-<P>
-If a compiled pattern is going to be used several times, it is worth spending
-more time analyzing it in order to speed up the time taken for matching. The
-function <b>pcre_study()</b> takes a pointer to a compiled pattern as its first
-argument. If studying the pattern produces additional information that will
-help speed up matching, <b>pcre_study()</b> returns a pointer to a
-<b>pcre_extra</b> block, in which the <i>study_data</i> field points to the
-results of the study.
-</P>
-<P>
-The returned value from <b>pcre_study()</b> can be passed directly to
-<b>pcre_exec()</b> or <b>pcre_dfa_exec()</b>. However, a <b>pcre_extra</b> block
-also contains other fields that can be set by the caller before the block is
-passed; these are described
-<a href="#extradata">below</a>
-in the section on matching a pattern.
-</P>
-<P>
-If studying the pattern does not produce any useful information,
-<b>pcre_study()</b> returns NULL by default. In that circumstance, if the
-calling program wants to pass any of the other fields to <b>pcre_exec()</b> or
-<b>pcre_dfa_exec()</b>, it must set up its own <b>pcre_extra</b> block. However,
-if <b>pcre_study()</b> is called with the PCRE_STUDY_EXTRA_NEEDED option, it
-returns a <b>pcre_extra</b> block even if studying did not find any additional
-information. It may still return NULL, however, if an error occurs in
-<b>pcre_study()</b>.
-</P>
-<P>
-The second argument of <b>pcre_study()</b> contains option bits. There are three
-further options in addition to PCRE_STUDY_EXTRA_NEEDED:
-<pre>
-  PCRE_STUDY_JIT_COMPILE
-  PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE
-  PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE
-</pre>
-If any of these are set, and the just-in-time compiler is available, the
-pattern is further compiled into machine code that executes much faster than
-the <b>pcre_exec()</b> interpretive matching function. If the just-in-time
-compiler is not available, these options are ignored. All undefined bits in the
-<i>options</i> argument must be zero.
-</P>
-<P>
-JIT compilation is a heavyweight optimization. It can take some time for
-patterns to be analyzed, and for one-off matches and simple patterns the
-benefit of faster execution might be offset by a much slower study time.
-Not all patterns can be optimized by the JIT compiler. For those that cannot be
-handled, matching automatically falls back to the <b>pcre_exec()</b>
-interpreter. For more details, see the
-<a href="pcrejit.html"><b>pcrejit</b></a>
-documentation.
-</P>
-<P>
-The third argument for <b>pcre_study()</b> is a pointer for an error message. If
-studying succeeds (even if no data is returned), the variable it points to is
-set to NULL. Otherwise it is set to point to a textual error message. This is a
-static string that is part of the library. You must not try to free it. You
-should test the error pointer for NULL after calling <b>pcre_study()</b>, to be
-sure that it has run successfully.
-</P>
-<P>
-When you are finished with a pattern, you can free the memory used for the
-study data by calling <b>pcre_free_study()</b>. This function was added to the
-API for release 8.20. For earlier versions, the memory could be freed with
-<b>pcre_free()</b>, just like the pattern itself. This will still work in cases
-where JIT optimization is not used, but it is advisable to change to the new
-function when convenient.
-</P>
-<P>
-This is a typical way in which <b>pcre_study</b>() is used (except that in a
-real application there should be tests for errors):
-<pre>
-  int rc;
-  pcre *re;
-  pcre_extra *sd;
-  re = pcre_compile("pattern", 0, &error, &erroroffset, NULL);
-  sd = pcre_study(
-    re,             /* result of pcre_compile() */
-    0,              /* no options */
-    &error);        /* set to NULL or points to a message */
-  rc = pcre_exec(   /* see below for details of pcre_exec() options */
-    re, sd, "subject", 7, 0, 0, ovector, 30);
-  ...
-  pcre_free_study(sd);
-  pcre_free(re);
-</pre>
-Studying a pattern does two things: first, a lower bound for the length of
-subject string that is needed to match the pattern is computed. This does not
-mean that there are any strings of that length that match, but it does
-guarantee that no shorter strings match. The value is used to avoid wasting
-time by trying to match strings that are shorter than the lower bound. You can
-find out the value in a calling program via the <b>pcre_fullinfo()</b> function.
-</P>
-<P>
-Studying a pattern is also useful for non-anchored patterns that do not have a
-single fixed starting character. A bitmap of possible starting bytes is
-created. This speeds up finding a position in the subject at which to start
-matching. (In 16-bit mode, the bitmap is used for 16-bit values less than 256.
-In 32-bit mode, the bitmap is used for 32-bit values less than 256.)
-</P>
-<P>
-These two optimizations apply to both <b>pcre_exec()</b> and
-<b>pcre_dfa_exec()</b>, and the information is also used by the JIT compiler.
-The optimizations can be disabled by setting the PCRE_NO_START_OPTIMIZE option.
-You might want to do this if your pattern contains callouts or (*MARK) and you
-want to make use of these facilities in cases where matching fails.
-</P>
-<P>
-PCRE_NO_START_OPTIMIZE can be specified at either compile time or execution
-time. However, if PCRE_NO_START_OPTIMIZE is passed to <b>pcre_exec()</b>, (that
-is, after any JIT compilation has happened) JIT execution is disabled. For JIT
-execution to work with PCRE_NO_START_OPTIMIZE, the option must be set at
-compile time.
-</P>
-<P>
-There is a longer discussion of PCRE_NO_START_OPTIMIZE
-<a href="#execoptions">below.</a>
-<a name="localesupport"></a></P>
-<br><a name="SEC14" href="#TOC1">LOCALE SUPPORT</a><br>
-<P>
-PCRE handles caseless matching, and determines whether characters are letters,
-digits, or whatever, by reference to a set of tables, indexed by character
-code point. When running in UTF-8 mode, or in the 16- or 32-bit libraries, this
-applies only to characters with code points less than 256. By default,
-higher-valued code points never match escapes such as \w or \d. However, if
-PCRE is built with Unicode property support, all characters can be tested with
-\p and \P, or, alternatively, the PCRE_UCP option can be set when a pattern
-is compiled; this causes \w and friends to use Unicode property support
-instead of the built-in tables.
-</P>
-<P>
-The use of locales with Unicode is discouraged. If you are handling characters
-with code points greater than 128, you should either use Unicode support, or
-use locales, but not try to mix the two.
-</P>
-<P>
-PCRE contains an internal set of tables that are used when the final argument
-of <b>pcre_compile()</b> is NULL. These are sufficient for many applications.
-Normally, the internal tables recognize only ASCII characters. However, when
-PCRE is built, it is possible to cause the internal tables to be rebuilt in the
-default "C" locale of the local system, which may cause them to be different.
-</P>
-<P>
-The internal tables can always be overridden by tables supplied by the
-application that calls PCRE. These may be created in a different locale from
-the default. As more and more applications change to using Unicode, the need
-for this locale support is expected to die away.
-</P>
-<P>
-External tables are built by calling the <b>pcre_maketables()</b> function,
-which has no arguments, in the relevant locale. The result can then be passed
-to <b>pcre_compile()</b> as often as necessary. For example, to build and use
-tables that are appropriate for the French locale (where accented characters
-with values greater than 128 are treated as letters), the following code could
-be used:
-<pre>
-  setlocale(LC_CTYPE, "fr_FR");
-  tables = pcre_maketables();
-  re = pcre_compile(..., tables);
-</pre>
-The locale name "fr_FR" is used on Linux and other Unix-like systems; if you
-are using Windows, the name for the French locale is "french".
-</P>
-<P>
-When <b>pcre_maketables()</b> runs, the tables are built in memory that is
-obtained via <b>pcre_malloc</b>. It is the caller's responsibility to ensure
-that the memory containing the tables remains available for as long as it is
-needed.
-</P>
-<P>
-The pointer that is passed to <b>pcre_compile()</b> is saved with the compiled
-pattern, and the same tables are used via this pointer by <b>pcre_study()</b>
-and also by <b>pcre_exec()</b> and <b>pcre_dfa_exec()</b>. Thus, for any single
-pattern, compilation, studying and matching all happen in the same locale, but
-different patterns can be processed in different locales.
-</P>
-<P>
-It is possible to pass a table pointer or NULL (indicating the use of the
-internal tables) to <b>pcre_exec()</b> or <b>pcre_dfa_exec()</b> (see the
-discussion below in the section on matching a pattern). This facility is
-provided for use with pre-compiled patterns that have been saved and reloaded.
-Character tables are not saved with patterns, so if a non-standard table was
-used at compile time, it must be provided again when the reloaded pattern is
-matched. Attempting to use this facility to match a pattern in a different
-locale from the one in which it was compiled is likely to lead to anomalous
-(usually incorrect) results.
-<a name="infoaboutpattern"></a></P>
-<br><a name="SEC15" href="#TOC1">INFORMATION ABOUT A PATTERN</a><br>
-<P>
-<b>int pcre_fullinfo(const pcre *<i>code</i>, const pcre_extra *<i>extra</i>,</b>
-<b>     int <i>what</i>, void *<i>where</i>);</b>
-</P>
-<P>
-The <b>pcre_fullinfo()</b> function returns information about a compiled
-pattern. It replaces the <b>pcre_info()</b> function, which was removed from the
-library at version 8.30, after more than 10 years of obsolescence.
-</P>
-<P>
-The first argument for <b>pcre_fullinfo()</b> is a pointer to the compiled
-pattern. The second argument is the result of <b>pcre_study()</b>, or NULL if
-the pattern was not studied. The third argument specifies which piece of
-information is required, and the fourth argument is a pointer to a variable
-to receive the data. The yield of the function is zero for success, or one of
-the following negative numbers:
-<pre>
-  PCRE_ERROR_NULL           the argument <i>code</i> was NULL
-                            the argument <i>where</i> was NULL
-  PCRE_ERROR_BADMAGIC       the "magic number" was not found
-  PCRE_ERROR_BADENDIANNESS  the pattern was compiled with different
-                            endianness
-  PCRE_ERROR_BADOPTION      the value of <i>what</i> was invalid
-  PCRE_ERROR_UNSET          the requested field is not set
-</pre>
-The "magic number" is placed at the start of each compiled pattern as an simple
-check against passing an arbitrary memory pointer. The endianness error can
-occur if a compiled pattern is saved and reloaded on a different host. Here is
-a typical call of <b>pcre_fullinfo()</b>, to obtain the length of the compiled
-pattern:
-<pre>
-  int rc;
-  size_t length;
-  rc = pcre_fullinfo(
-    re,               /* result of pcre_compile() */
-    sd,               /* result of pcre_study(), or NULL */
-    PCRE_INFO_SIZE,   /* what is required */
-    &length);         /* where to put the data */
-</pre>
-The possible values for the third argument are defined in <b>pcre.h</b>, and are
-as follows:
-<pre>
-  PCRE_INFO_BACKREFMAX
-</pre>
-Return the number of the highest back reference in the pattern. The fourth
-argument should point to an <b>int</b> variable. Zero is returned if there are
-no back references.
-<pre>
-  PCRE_INFO_CAPTURECOUNT
-</pre>
-Return the number of capturing subpatterns in the pattern. The fourth argument
-should point to an <b>int</b> variable.
-<pre>
-  PCRE_INFO_DEFAULT_TABLES
-</pre>
-Return a pointer to the internal default character tables within PCRE. The
-fourth argument should point to an <b>unsigned char *</b> variable. This
-information call is provided for internal use by the <b>pcre_study()</b>
-function. External callers can cause PCRE to use its internal tables by passing
-a NULL table pointer.
-<pre>
-  PCRE_INFO_FIRSTBYTE (deprecated)
-</pre>
-Return information about the first data unit of any matched string, for a
-non-anchored pattern. The name of this option refers to the 8-bit library,
-where data units are bytes. The fourth argument should point to an <b>int</b>
-variable. Negative values are used for special cases. However, this means that
-when the 32-bit library is in non-UTF-32 mode, the full 32-bit range of
-characters cannot be returned. For this reason, this value is deprecated; use
-PCRE_INFO_FIRSTCHARACTERFLAGS and PCRE_INFO_FIRSTCHARACTER instead.
-</P>
-<P>
-If there is a fixed first value, for example, the letter "c" from a pattern
-such as (cat|cow|coyote), its value is returned. In the 8-bit library, the
-value is always less than 256. In the 16-bit library the value can be up to
-0xffff. In the 32-bit library the value can be up to 0x10ffff.
-</P>
-<P>
-If there is no fixed first value, and if either
-<br>
-<br>
-(a) the pattern was compiled with the PCRE_MULTILINE option, and every branch
-starts with "^", or
-<br>
-<br>
-(b) every branch of the pattern starts with ".*" and PCRE_DOTALL is not set
-(if it were set, the pattern would be anchored),
-<br>
-<br>
--1 is returned, indicating that the pattern matches only at the start of a
-subject string or after any newline within the string. Otherwise -2 is
-returned. For anchored patterns, -2 is returned.
-<pre>
-  PCRE_INFO_FIRSTCHARACTER
-</pre>
-Return the value of the first data unit (non-UTF character) of any matched
-string in the situation where PCRE_INFO_FIRSTCHARACTERFLAGS returns 1;
-otherwise return 0. The fourth argument should point to an <b>uint_t</b>
-variable.
-</P>
-<P>
-In the 8-bit library, the value is always less than 256. In the 16-bit library
-the value can be up to 0xffff. In the 32-bit library in UTF-32 mode the value
-can be up to 0x10ffff, and up to 0xffffffff when not using UTF-32 mode.
-<pre>
-  PCRE_INFO_FIRSTCHARACTERFLAGS
-</pre>
-Return information about the first data unit of any matched string, for a
-non-anchored pattern. The fourth argument should point to an <b>int</b>
-variable.
-</P>
-<P>
-If there is a fixed first value, for example, the letter "c" from a pattern
-such as (cat|cow|coyote), 1 is returned, and the character value can be
-retrieved using PCRE_INFO_FIRSTCHARACTER. If there is no fixed first value, and
-if either
-<br>
-<br>
-(a) the pattern was compiled with the PCRE_MULTILINE option, and every branch
-starts with "^", or
-<br>
-<br>
-(b) every branch of the pattern starts with ".*" and PCRE_DOTALL is not set
-(if it were set, the pattern would be anchored),
-<br>
-<br>
-2 is returned, indicating that the pattern matches only at the start of a
-subject string or after any newline within the string. Otherwise 0 is
-returned. For anchored patterns, 0 is returned.
-<pre>
-  PCRE_INFO_FIRSTTABLE
-</pre>
-If the pattern was studied, and this resulted in the construction of a 256-bit
-table indicating a fixed set of values for the first data unit in any matching
-string, a pointer to the table is returned. Otherwise NULL is returned. The
-fourth argument should point to an <b>unsigned char *</b> variable.
-<pre>
-  PCRE_INFO_HASCRORLF
-</pre>
-Return 1 if the pattern contains any explicit matches for CR or LF characters,
-otherwise 0. The fourth argument should point to an <b>int</b> variable. An
-explicit match is either a literal CR or LF character, or \r or \n.
-<pre>
-  PCRE_INFO_JCHANGED
-</pre>
-Return 1 if the (?J) or (?-J) option setting is used in the pattern, otherwise
-0. The fourth argument should point to an <b>int</b> variable. (?J) and
-(?-J) set and unset the local PCRE_DUPNAMES option, respectively.
-<pre>
-  PCRE_INFO_JIT
-</pre>
-Return 1 if the pattern was studied with one of the JIT options, and
-just-in-time compiling was successful. The fourth argument should point to an
-<b>int</b> variable. A return value of 0 means that JIT support is not available
-in this version of PCRE, or that the pattern was not studied with a JIT option,
-or that the JIT compiler could not handle this particular pattern. See the
-<a href="pcrejit.html"><b>pcrejit</b></a>
-documentation for details of what can and cannot be handled.
-<pre>
-  PCRE_INFO_JITSIZE
-</pre>
-If the pattern was successfully studied with a JIT option, return the size of
-the JIT compiled code, otherwise return zero. The fourth argument should point
-to a <b>size_t</b> variable.
-<pre>
-  PCRE_INFO_LASTLITERAL
-</pre>
-Return the value of the rightmost literal data unit that must exist in any
-matched string, other than at its start, if such a value has been recorded. The
-fourth argument should point to an <b>int</b> variable. If there is no such
-value, -1 is returned. For anchored patterns, a last literal value is recorded
-only if it follows something of variable length. For example, for the pattern
-/^a\d+z\d+/ the returned value is "z", but for /^a\dz\d/ the returned value
-is -1.
-</P>
-<P>
-Since for the 32-bit library using the non-UTF-32 mode, this function is unable
-to return the full 32-bit range of characters, this value is deprecated;
-instead the PCRE_INFO_REQUIREDCHARFLAGS and PCRE_INFO_REQUIREDCHAR values should
-be used.
-<pre>
-  PCRE_INFO_MATCH_EMPTY
-</pre>
-Return 1 if the pattern can match an empty string, otherwise 0. The fourth
-argument should point to an <b>int</b> variable.
-<pre>
-  PCRE_INFO_MATCHLIMIT
-</pre>
-If the pattern set a match limit by including an item of the form
-(*LIMIT_MATCH=nnnn) at the start, the value is returned. The fourth argument
-should point to an unsigned 32-bit integer. If no such value has been set, the
-call to <b>pcre_fullinfo()</b> returns the error PCRE_ERROR_UNSET.
-<pre>
-  PCRE_INFO_MAXLOOKBEHIND
-</pre>
-Return the number of characters (NB not data units) in the longest lookbehind
-assertion in the pattern. This information is useful when doing multi-segment
-matching using the partial matching facilities. Note that the simple assertions
-\b and \B require a one-character lookbehind. \A also registers a
-one-character lookbehind, though it does not actually inspect the previous
-character. This is to ensure that at least one character from the old segment
-is retained when a new segment is processed. Otherwise, if there are no
-lookbehinds in the pattern, \A might match incorrectly at the start of a new
-segment.
-<pre>
-  PCRE_INFO_MINLENGTH
-</pre>
-If the pattern was studied and a minimum length for matching subject strings
-was computed, its value is returned. Otherwise the returned value is -1. The
-value is a number of characters, which in UTF mode may be different from the
-number of data units. The fourth argument should point to an <b>int</b>
-variable. A non-negative value is a lower bound to the length of any matching
-string. There may not be any strings of that length that do actually match, but
-every string that does match is at least that long.
-<pre>
-  PCRE_INFO_NAMECOUNT
-  PCRE_INFO_NAMEENTRYSIZE
-  PCRE_INFO_NAMETABLE
-</pre>
-PCRE supports the use of named as well as numbered capturing parentheses. The
-names are just an additional way of identifying the parentheses, which still
-acquire numbers. Several convenience functions such as
-<b>pcre_get_named_substring()</b> are provided for extracting captured
-substrings by name. It is also possible to extract the data directly, by first
-converting the name to a number in order to access the correct pointers in the
-output vector (described with <b>pcre_exec()</b> below). To do the conversion,
-you need to use the name-to-number map, which is described by these three
-values.
-</P>
-<P>
-The map consists of a number of fixed-size entries. PCRE_INFO_NAMECOUNT gives
-the number of entries, and PCRE_INFO_NAMEENTRYSIZE gives the size of each
-entry; both of these return an <b>int</b> value. The entry size depends on the
-length of the longest name. PCRE_INFO_NAMETABLE returns a pointer to the first
-entry of the table. This is a pointer to <b>char</b> in the 8-bit library, where
-the first two bytes of each entry are the number of the capturing parenthesis,
-most significant byte first. In the 16-bit library, the pointer points to
-16-bit data units, the first of which contains the parenthesis number. In the
-32-bit library, the pointer points to 32-bit data units, the first of which
-contains the parenthesis number. The rest of the entry is the corresponding
-name, zero terminated.
-</P>
-<P>
-The names are in alphabetical order. If (?| is used to create multiple groups
-with the same number, as described in the
-<a href="pcrepattern.html#dupsubpatternnumber">section on duplicate subpattern numbers</a>
-in the
-<a href="pcrepattern.html"><b>pcrepattern</b></a>
-page, the groups may be given the same name, but there is only one entry in the
-table. Different names for groups of the same number are not permitted.
-Duplicate names for subpatterns with different numbers are permitted,
-but only if PCRE_DUPNAMES is set. They appear in the table in the order in
-which they were found in the pattern. In the absence of (?| this is the order
-of increasing number; when (?| is used this is not necessarily the case because
-later subpatterns may have lower numbers.
-</P>
-<P>
-As a simple example of the name/number table, consider the following pattern
-after compilation by the 8-bit library (assume PCRE_EXTENDED is set, so white
-space - including newlines - is ignored):
-<pre>
-  (?&#60;date&#62; (?&#60;year&#62;(\d\d)?\d\d) - (?&#60;month&#62;\d\d) - (?&#60;day&#62;\d\d) )
-</pre>
-There are four named subpatterns, so the table has four entries, and each entry
-in the table is eight bytes long. The table is as follows, with non-printing
-bytes shows in hexadecimal, and undefined bytes shown as ??:
-<pre>
-  00 01 d  a  t  e  00 ??
-  00 05 d  a  y  00 ?? ??
-  00 04 m  o  n  t  h  00
-  00 02 y  e  a  r  00 ??
-</pre>
-When writing code to extract data from named subpatterns using the
-name-to-number map, remember that the length of the entries is likely to be
-different for each compiled pattern.
-<pre>
-  PCRE_INFO_OKPARTIAL
-</pre>
-Return 1 if the pattern can be used for partial matching with
-<b>pcre_exec()</b>, otherwise 0. The fourth argument should point to an
-<b>int</b> variable. From release 8.00, this always returns 1, because the
-restrictions that previously applied to partial matching have been lifted. The
-<a href="pcrepartial.html"><b>pcrepartial</b></a>
-documentation gives details of partial matching.
-<pre>
-  PCRE_INFO_OPTIONS
-</pre>
-Return a copy of the options with which the pattern was compiled. The fourth
-argument should point to an <b>unsigned long int</b> variable. These option bits
-are those specified in the call to <b>pcre_compile()</b>, modified by any
-top-level option settings at the start of the pattern itself. In other words,
-they are the options that will be in force when matching starts. For example,
-if the pattern /(?im)abc(?-i)d/ is compiled with the PCRE_EXTENDED option, the
-result is PCRE_CASELESS, PCRE_MULTILINE, and PCRE_EXTENDED.
-</P>
-<P>
-A pattern is automatically anchored by PCRE if all of its top-level
-alternatives begin with one of the following:
-<pre>
-  ^     unless PCRE_MULTILINE is set
-  \A    always
-  \G    always
-  .*    if PCRE_DOTALL is set and there are no back references to the subpattern in which .* appears
-</pre>
-For such patterns, the PCRE_ANCHORED bit is set in the options returned by
-<b>pcre_fullinfo()</b>.
-<pre>
-  PCRE_INFO_RECURSIONLIMIT
-</pre>
-If the pattern set a recursion limit by including an item of the form
-(*LIMIT_RECURSION=nnnn) at the start, the value is returned. The fourth
-argument should point to an unsigned 32-bit integer. If no such value has been
-set, the call to <b>pcre_fullinfo()</b> returns the error PCRE_ERROR_UNSET.
-<pre>
-  PCRE_INFO_SIZE
-</pre>
-Return the size of the compiled pattern in bytes (for all three libraries). The
-fourth argument should point to a <b>size_t</b> variable. This value does not
-include the size of the <b>pcre</b> structure that is returned by
-<b>pcre_compile()</b>. The value that is passed as the argument to
-<b>pcre_malloc()</b> when <b>pcre_compile()</b> is getting memory in which to
-place the compiled data is the value returned by this option plus the size of
-the <b>pcre</b> structure. Studying a compiled pattern, with or without JIT,
-does not alter the value returned by this option.
-<pre>
-  PCRE_INFO_STUDYSIZE
-</pre>
-Return the size in bytes (for all three libraries) of the data block pointed to
-by the <i>study_data</i> field in a <b>pcre_extra</b> block. If <b>pcre_extra</b>
-is NULL, or there is no study data, zero is returned. The fourth argument
-should point to a <b>size_t</b> variable. The <i>study_data</i> field is set by
-<b>pcre_study()</b> to record information that will speed up matching (see the
-section entitled
-<a href="#studyingapattern">"Studying a pattern"</a>
-above). The format of the <i>study_data</i> block is private, but its length
-is made available via this option so that it can be saved and restored (see the
-<a href="pcreprecompile.html"><b>pcreprecompile</b></a>
-documentation for details).
-<pre>
-  PCRE_INFO_REQUIREDCHARFLAGS
-</pre>
-Returns 1 if there is a rightmost literal data unit that must exist in any
-matched string, other than at its start. The fourth argument should  point to
-an <b>int</b> variable. If there is no such value, 0 is returned. If returning
-1, the character value itself can be retrieved using PCRE_INFO_REQUIREDCHAR.
-</P>
-<P>
-For anchored patterns, a last literal value is recorded only if it follows
-something of variable length. For example, for the pattern /^a\d+z\d+/ the
-returned value 1 (with "z" returned from PCRE_INFO_REQUIREDCHAR), but for
-/^a\dz\d/ the returned value is 0.
-<pre>
-  PCRE_INFO_REQUIREDCHAR
-</pre>
-Return the value of the rightmost literal data unit that must exist in any
-matched string, other than at its start, if such a value has been recorded. The
-fourth argument should point to an <b>uint32_t</b> variable. If there is no such
-value, 0 is returned.
-</P>
-<br><a name="SEC16" href="#TOC1">REFERENCE COUNTS</a><br>
-<P>
-<b>int pcre_refcount(pcre *<i>code</i>, int <i>adjust</i>);</b>
-</P>
-<P>
-The <b>pcre_refcount()</b> function is used to maintain a reference count in the
-data block that contains a compiled pattern. It is provided for the benefit of
-applications that operate in an object-oriented manner, where different parts
-of the application may be using the same compiled pattern, but you want to free
-the block when they are all done.
-</P>
-<P>
-When a pattern is compiled, the reference count field is initialized to zero.
-It is changed only by calling this function, whose action is to add the
-<i>adjust</i> value (which may be positive or negative) to it. The yield of the
-function is the new value. However, the value of the count is constrained to
-lie between 0 and 65535, inclusive. If the new value is outside these limits,
-it is forced to the appropriate limit value.
-</P>
-<P>
-Except when it is zero, the reference count is not correctly preserved if a
-pattern is compiled on one host and then transferred to a host whose byte-order
-is different. (This seems a highly unlikely scenario.)
-</P>
-<br><a name="SEC17" href="#TOC1">MATCHING A PATTERN: THE TRADITIONAL FUNCTION</a><br>
-<P>
-<b>int pcre_exec(const pcre *<i>code</i>, const pcre_extra *<i>extra</i>,</b>
-<b>     const char *<i>subject</i>, int <i>length</i>, int <i>startoffset</i>,</b>
-<b>     int <i>options</i>, int *<i>ovector</i>, int <i>ovecsize</i>);</b>
-</P>
-<P>
-The function <b>pcre_exec()</b> is called to match a subject string against a
-compiled pattern, which is passed in the <i>code</i> argument. If the
-pattern was studied, the result of the study should be passed in the
-<i>extra</i> argument. You can call <b>pcre_exec()</b> with the same <i>code</i>
-and <i>extra</i> arguments as many times as you like, in order to match
-different subject strings with the same pattern.
-</P>
-<P>
-This function is the main matching facility of the library, and it operates in
-a Perl-like manner. For specialist use there is also an alternative matching
-function, which is described
-<a href="#dfamatch">below</a>
-in the section about the <b>pcre_dfa_exec()</b> function.
-</P>
-<P>
-In most applications, the pattern will have been compiled (and optionally
-studied) in the same process that calls <b>pcre_exec()</b>. However, it is
-possible to save compiled patterns and study data, and then use them later
-in different processes, possibly even on different hosts. For a discussion
-about this, see the
-<a href="pcreprecompile.html"><b>pcreprecompile</b></a>
-documentation.
-</P>
-<P>
-Here is an example of a simple call to <b>pcre_exec()</b>:
-<pre>
-  int rc;
-  int ovector[30];
-  rc = pcre_exec(
-    re,             /* result of pcre_compile() */
-    NULL,           /* we didn't study the pattern */
-    "some string",  /* the subject string */
-    11,             /* the length of the subject string */
-    0,              /* start at offset 0 in the subject */
-    0,              /* default options */
-    ovector,        /* vector of integers for substring information */
-    30);            /* number of elements (NOT size in bytes) */
-<a name="extradata"></a></PRE>
-</P>
-<br><b>
-Extra data for <b>pcre_exec()</b>
-</b><br>
-<P>
-If the <i>extra</i> argument is not NULL, it must point to a <b>pcre_extra</b>
-data block. The <b>pcre_study()</b> function returns such a block (when it
-doesn't return NULL), but you can also create one for yourself, and pass
-additional information in it. The <b>pcre_extra</b> block contains the following
-fields (not necessarily in this order):
-<pre>
-  unsigned long int <i>flags</i>;
-  void *<i>study_data</i>;
-  void *<i>executable_jit</i>;
-  unsigned long int <i>match_limit</i>;
-  unsigned long int <i>match_limit_recursion</i>;
-  void *<i>callout_data</i>;
-  const unsigned char *<i>tables</i>;
-  unsigned char **<i>mark</i>;
-</pre>
-In the 16-bit version of this structure, the <i>mark</i> field has type
-"PCRE_UCHAR16 **".
-<br>
-<br>
-In the 32-bit version of this structure, the <i>mark</i> field has type
-"PCRE_UCHAR32 **".
-</P>
-<P>
-The <i>flags</i> field is used to specify which of the other fields are set. The
-flag bits are:
-<pre>
-  PCRE_EXTRA_CALLOUT_DATA
-  PCRE_EXTRA_EXECUTABLE_JIT
-  PCRE_EXTRA_MARK
-  PCRE_EXTRA_MATCH_LIMIT
-  PCRE_EXTRA_MATCH_LIMIT_RECURSION
-  PCRE_EXTRA_STUDY_DATA
-  PCRE_EXTRA_TABLES
-</pre>
-Other flag bits should be set to zero. The <i>study_data</i> field and sometimes
-the <i>executable_jit</i> field are set in the <b>pcre_extra</b> block that is
-returned by <b>pcre_study()</b>, together with the appropriate flag bits. You
-should not set these yourself, but you may add to the block by setting other
-fields and their corresponding flag bits.
-</P>
-<P>
-The <i>match_limit</i> field provides a means of preventing PCRE from using up a
-vast amount of resources when running patterns that are not going to match,
-but which have a very large number of possibilities in their search trees. The
-classic example is a pattern that uses nested unlimited repeats.
-</P>
-<P>
-Internally, <b>pcre_exec()</b> uses a function called <b>match()</b>, which it
-calls repeatedly (sometimes recursively). The limit set by <i>match_limit</i> is
-imposed on the number of times this function is called during a match, which
-has the effect of limiting the amount of backtracking that can take place. For
-patterns that are not anchored, the count restarts from zero for each position
-in the subject string.
-</P>
-<P>
-When <b>pcre_exec()</b> is called with a pattern that was successfully studied
-with a JIT option, the way that the matching is executed is entirely different.
-However, there is still the possibility of runaway matching that goes on for a
-very long time, and so the <i>match_limit</i> value is also used in this case
-(but in a different way) to limit how long the matching can continue.
-</P>
-<P>
-The default value for the limit can be set when PCRE is built; the default
-default is 10 million, which handles all but the most extreme cases. You can
-override the default by suppling <b>pcre_exec()</b> with a <b>pcre_extra</b>
-block in which <i>match_limit</i> is set, and PCRE_EXTRA_MATCH_LIMIT is set in
-the <i>flags</i> field. If the limit is exceeded, <b>pcre_exec()</b> returns
-PCRE_ERROR_MATCHLIMIT.
-</P>
-<P>
-A value for the match limit may also be supplied by an item at the start of a
-pattern of the form
-<pre>
-  (*LIMIT_MATCH=d)
-</pre>
-where d is a decimal number. However, such a setting is ignored unless d is
-less than the limit set by the caller of <b>pcre_exec()</b> or, if no such limit
-is set, less than the default.
-</P>
-<P>
-The <i>match_limit_recursion</i> field is similar to <i>match_limit</i>, but
-instead of limiting the total number of times that <b>match()</b> is called, it
-limits the depth of recursion. The recursion depth is a smaller number than the
-total number of calls, because not all calls to <b>match()</b> are recursive.
-This limit is of use only if it is set smaller than <i>match_limit</i>.
-</P>
-<P>
-Limiting the recursion depth limits the amount of machine stack that can be
-used, or, when PCRE has been compiled to use memory on the heap instead of the
-stack, the amount of heap memory that can be used. This limit is not relevant,
-and is ignored, when matching is done using JIT compiled code.
-</P>
-<P>
-The default value for <i>match_limit_recursion</i> can be set when PCRE is
-built; the default default is the same value as the default for
-<i>match_limit</i>. You can override the default by suppling <b>pcre_exec()</b>
-with a <b>pcre_extra</b> block in which <i>match_limit_recursion</i> is set, and
-PCRE_EXTRA_MATCH_LIMIT_RECURSION is set in the <i>flags</i> field. If the limit
-is exceeded, <b>pcre_exec()</b> returns PCRE_ERROR_RECURSIONLIMIT.
-</P>
-<P>
-A value for the recursion limit may also be supplied by an item at the start of
-a pattern of the form
-<pre>
-  (*LIMIT_RECURSION=d)
-</pre>
-where d is a decimal number. However, such a setting is ignored unless d is
-less than the limit set by the caller of <b>pcre_exec()</b> or, if no such limit
-is set, less than the default.
-</P>
-<P>
-The <i>callout_data</i> field is used in conjunction with the "callout" feature,
-and is described in the
-<a href="pcrecallout.html"><b>pcrecallout</b></a>
-documentation.
-</P>
-<P>
-The <i>tables</i> field is provided for use with patterns that have been
-pre-compiled using custom character tables, saved to disc or elsewhere, and
-then reloaded, because the tables that were used to compile a pattern are not
-saved with it. See the
-<a href="pcreprecompile.html"><b>pcreprecompile</b></a>
-documentation for a discussion of saving compiled patterns for later use. If
-NULL is passed using this mechanism, it forces PCRE's internal tables to be
-used.
-</P>
-<P>
-<b>Warning:</b> The tables that <b>pcre_exec()</b> uses must be the same as those
-that were used when the pattern was compiled. If this is not the case, the
-behaviour of <b>pcre_exec()</b> is undefined. Therefore, when a pattern is
-compiled and matched in the same process, this field should never be set. In
-this (the most common) case, the correct table pointer is automatically passed
-with the compiled pattern from <b>pcre_compile()</b> to <b>pcre_exec()</b>.
-</P>
-<P>
-If PCRE_EXTRA_MARK is set in the <i>flags</i> field, the <i>mark</i> field must
-be set to point to a suitable variable. If the pattern contains any
-backtracking control verbs such as (*MARK:NAME), and the execution ends up with
-a name to pass back, a pointer to the name string (zero terminated) is placed
-in the variable pointed to by the <i>mark</i> field. The names are within the
-compiled pattern; if you wish to retain such a name you must copy it before
-freeing the memory of a compiled pattern. If there is no name to pass back, the
-variable pointed to by the <i>mark</i> field is set to NULL. For details of the
-backtracking control verbs, see the section entitled
-<a href="pcrepattern#backtrackcontrol">"Backtracking control"</a>
-in the
-<a href="pcrepattern.html"><b>pcrepattern</b></a>
-documentation.
-<a name="execoptions"></a></P>
-<br><b>
-Option bits for <b>pcre_exec()</b>
-</b><br>
-<P>
-The unused bits of the <i>options</i> argument for <b>pcre_exec()</b> must be
-zero. The only bits that may be set are PCRE_ANCHORED, PCRE_NEWLINE_<i>xxx</i>,
-PCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY, PCRE_NOTEMPTY_ATSTART,
-PCRE_NO_START_OPTIMIZE, PCRE_NO_UTF8_CHECK, PCRE_PARTIAL_HARD, and
-PCRE_PARTIAL_SOFT.
-</P>
-<P>
-If the pattern was successfully studied with one of the just-in-time (JIT)
-compile options, the only supported options for JIT execution are
-PCRE_NO_UTF8_CHECK, PCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY,
-PCRE_NOTEMPTY_ATSTART, PCRE_PARTIAL_HARD, and PCRE_PARTIAL_SOFT. If an
-unsupported option is used, JIT execution is disabled and the normal
-interpretive code in <b>pcre_exec()</b> is run.
-<pre>
-  PCRE_ANCHORED
-</pre>
-The PCRE_ANCHORED option limits <b>pcre_exec()</b> to matching at the first
-matching position. If a pattern was compiled with PCRE_ANCHORED, or turned out
-to be anchored by virtue of its contents, it cannot be made unachored at
-matching time.
-<pre>
-  PCRE_BSR_ANYCRLF
-  PCRE_BSR_UNICODE
-</pre>
-These options (which are mutually exclusive) control what the \R escape
-sequence matches. The choice is either to match only CR, LF, or CRLF, or to
-match any Unicode newline sequence. These options override the choice that was
-made or defaulted when the pattern was compiled.
-<pre>
-  PCRE_NEWLINE_CR
-  PCRE_NEWLINE_LF
-  PCRE_NEWLINE_CRLF
-  PCRE_NEWLINE_ANYCRLF
-  PCRE_NEWLINE_ANY
-</pre>
-These options override the newline definition that was chosen or defaulted when
-the pattern was compiled. For details, see the description of
-<b>pcre_compile()</b> above. During matching, the newline choice affects the
-behaviour of the dot, circumflex, and dollar metacharacters. It may also alter
-the way the match position is advanced after a match failure for an unanchored
-pattern.
-</P>
-<P>
-When PCRE_NEWLINE_CRLF, PCRE_NEWLINE_ANYCRLF, or PCRE_NEWLINE_ANY is set, and a
-match attempt for an unanchored pattern fails when the current position is at a
-CRLF sequence, and the pattern contains no explicit matches for CR or LF
-characters, the match position is advanced by two characters instead of one, in
-other words, to after the CRLF.
-</P>
-<P>
-The above rule is a compromise that makes the most common cases work as
-expected. For example, if the pattern is .+A (and the PCRE_DOTALL option is not
-set), it does not match the string "\r\nA" because, after failing at the
-start, it skips both the CR and the LF before retrying. However, the pattern
-[\r\n]A does match that string, because it contains an explicit CR or LF
-reference, and so advances only by one character after the first failure.
-</P>
-<P>
-An explicit match for CR of LF is either a literal appearance of one of those
-characters, or one of the \r or \n escape sequences. Implicit matches such as
-[^X] do not count, nor does \s (which includes CR and LF in the characters
-that it matches).
-</P>
-<P>
-Notwithstanding the above, anomalous effects may still occur when CRLF is a
-valid newline sequence and explicit \r or \n escapes appear in the pattern.
-<pre>
-  PCRE_NOTBOL
-</pre>
-This option specifies that first character of the subject string is not the
-beginning of a line, so the circumflex metacharacter should not match before
-it. Setting this without PCRE_MULTILINE (at compile time) causes circumflex
-never to match. This option affects only the behaviour of the circumflex
-metacharacter. It does not affect \A.
-<pre>
-  PCRE_NOTEOL
-</pre>
-This option specifies that the end of the subject string is not the end of a
-line, so the dollar metacharacter should not match it nor (except in multiline
-mode) a newline immediately before it. Setting this without PCRE_MULTILINE (at
-compile time) causes dollar never to match. This option affects only the
-behaviour of the dollar metacharacter. It does not affect \Z or \z.
-<pre>
-  PCRE_NOTEMPTY
-</pre>
-An empty string is not considered to be a valid match if this option is set. If
-there are alternatives in the pattern, they are tried. If all the alternatives
-match the empty string, the entire match fails. For example, if the pattern
-<pre>
-  a?b?
-</pre>
-is applied to a string not beginning with "a" or "b", it matches an empty
-string at the start of the subject. With PCRE_NOTEMPTY set, this match is not
-valid, so PCRE searches further into the string for occurrences of "a" or "b".
-<pre>
-  PCRE_NOTEMPTY_ATSTART
-</pre>
-This is like PCRE_NOTEMPTY, except that an empty string match that is not at
-the start of the subject is permitted. If the pattern is anchored, such a match
-can occur only if the pattern contains \K.
-</P>
-<P>
-Perl has no direct equivalent of PCRE_NOTEMPTY or PCRE_NOTEMPTY_ATSTART, but it
-does make a special case of a pattern match of the empty string within its
-<b>split()</b> function, and when using the /g modifier. It is possible to
-emulate Perl's behaviour after matching a null string by first trying the match
-again at the same offset with PCRE_NOTEMPTY_ATSTART and PCRE_ANCHORED, and then
-if that fails, by advancing the starting offset (see below) and trying an
-ordinary match again. There is some code that demonstrates how to do this in
-the
-<a href="pcredemo.html"><b>pcredemo</b></a>
-sample program. In the most general case, you have to check to see if the
-newline convention recognizes CRLF as a newline, and if so, and the current
-character is CR followed by LF, advance the starting offset by two characters
-instead of one.
-<pre>
-  PCRE_NO_START_OPTIMIZE
-</pre>
-There are a number of optimizations that <b>pcre_exec()</b> uses at the start of
-a match, in order to speed up the process. For example, if it is known that an
-unanchored match must start with a specific character, it searches the subject
-for that character, and fails immediately if it cannot find it, without
-actually running the main matching function. This means that a special item
-such as (*COMMIT) at the start of a pattern is not considered until after a
-suitable starting point for the match has been found. Also, when callouts or
-(*MARK) items are in use, these "start-up" optimizations can cause them to be
-skipped if the pattern is never actually used. The start-up optimizations are
-in effect a pre-scan of the subject that takes place before the pattern is run.
-</P>
-<P>
-The PCRE_NO_START_OPTIMIZE option disables the start-up optimizations, possibly
-causing performance to suffer, but ensuring that in cases where the result is
-"no match", the callouts do occur, and that items such as (*COMMIT) and (*MARK)
-are considered at every possible starting position in the subject string. If
-PCRE_NO_START_OPTIMIZE is set at compile time, it cannot be unset at matching
-time. The use of PCRE_NO_START_OPTIMIZE at matching time (that is, passing it
-to <b>pcre_exec()</b>) disables JIT execution; in this situation, matching is
-always done using interpretively.
-</P>
-<P>
-Setting PCRE_NO_START_OPTIMIZE can change the outcome of a matching operation.
-Consider the pattern
-<pre>
-  (*COMMIT)ABC
-</pre>
-When this is compiled, PCRE records the fact that a match must start with the
-character "A". Suppose the subject string is "DEFABC". The start-up
-optimization scans along the subject, finds "A" and runs the first match
-attempt from there. The (*COMMIT) item means that the pattern must match the
-current starting position, which in this case, it does. However, if the same
-match is run with PCRE_NO_START_OPTIMIZE set, the initial scan along the
-subject string does not happen. The first match attempt is run starting from
-"D" and when this fails, (*COMMIT) prevents any further matches being tried, so
-the overall result is "no match". If the pattern is studied, more start-up
-optimizations may be used. For example, a minimum length for the subject may be
-recorded. Consider the pattern
-<pre>
-  (*MARK:A)(X|Y)
-</pre>
-The minimum length for a match is one character. If the subject is "ABC", there
-will be attempts to match "ABC", "BC", "C", and then finally an empty string.
-If the pattern is studied, the final attempt does not take place, because PCRE
-knows that the subject is too short, and so the (*MARK) is never encountered.
-In this case, studying the pattern does not affect the overall match result,
-which is still "no match", but it does affect the auxiliary information that is
-returned.
-<pre>
-  PCRE_NO_UTF8_CHECK
-</pre>
-When PCRE_UTF8 is set at compile time, the validity of the subject as a UTF-8
-string is automatically checked when <b>pcre_exec()</b> is subsequently called.
-The entire string is checked before any other processing takes place. The value
-of <i>startoffset</i> is also checked to ensure that it points to the start of a
-UTF-8 character. There is a discussion about the
-<a href="pcreunicode.html#utf8strings">validity of UTF-8 strings</a>
-in the
-<a href="pcreunicode.html"><b>pcreunicode</b></a>
-page. If an invalid sequence of bytes is found, <b>pcre_exec()</b> returns the
-error PCRE_ERROR_BADUTF8 or, if PCRE_PARTIAL_HARD is set and the problem is a
-truncated character at the end of the subject, PCRE_ERROR_SHORTUTF8. In both
-cases, information about the precise nature of the error may also be returned
-(see the descriptions of these errors in the section entitled \fIError return
-values from\fP <b>pcre_exec()</b>
-<a href="#errorlist">below).</a>
-If <i>startoffset</i> contains a value that does not point to the start of a
-UTF-8 character (or to the end of the subject), PCRE_ERROR_BADUTF8_OFFSET is
-returned.
-</P>
-<P>
-If you already know that your subject is valid, and you want to skip these
-checks for performance reasons, you can set the PCRE_NO_UTF8_CHECK option when
-calling <b>pcre_exec()</b>. You might want to do this for the second and
-subsequent calls to <b>pcre_exec()</b> if you are making repeated calls to find
-all the matches in a single subject string. However, you should be sure that
-the value of <i>startoffset</i> points to the start of a character (or the end
-of the subject). When PCRE_NO_UTF8_CHECK is set, the effect of passing an
-invalid string as a subject or an invalid value of <i>startoffset</i> is
-undefined. Your program may crash or loop.
-<pre>
-  PCRE_PARTIAL_HARD
-  PCRE_PARTIAL_SOFT
-</pre>
-These options turn on the partial matching feature. For backwards
-compatibility, PCRE_PARTIAL is a synonym for PCRE_PARTIAL_SOFT. A partial match
-occurs if the end of the subject string is reached successfully, but there are
-not enough subject characters to complete the match. If this happens when
-PCRE_PARTIAL_SOFT (but not PCRE_PARTIAL_HARD) is set, matching continues by
-testing any remaining alternatives. Only if no complete match can be found is
-PCRE_ERROR_PARTIAL returned instead of PCRE_ERROR_NOMATCH. In other words,
-PCRE_PARTIAL_SOFT says that the caller is prepared to handle a partial match,
-but only if no complete match can be found.
-</P>
-<P>
-If PCRE_PARTIAL_HARD is set, it overrides PCRE_PARTIAL_SOFT. In this case, if a
-partial match is found, <b>pcre_exec()</b> immediately returns
-PCRE_ERROR_PARTIAL, without considering any other alternatives. In other words,
-when PCRE_PARTIAL_HARD is set, a partial match is considered to be more
-important that an alternative complete match.
-</P>
-<P>
-In both cases, the portion of the string that was inspected when the partial
-match was found is set as the first matching string. There is a more detailed
-discussion of partial and multi-segment matching, with examples, in the
-<a href="pcrepartial.html"><b>pcrepartial</b></a>
-documentation.
-</P>
-<br><b>
-The string to be matched by <b>pcre_exec()</b>
-</b><br>
-<P>
-The subject string is passed to <b>pcre_exec()</b> as a pointer in
-<i>subject</i>, a length in <i>length</i>, and a starting offset in
-<i>startoffset</i>. The units for <i>length</i> and <i>startoffset</i> are bytes
-for the 8-bit library, 16-bit data items for the 16-bit library, and 32-bit
-data items for the 32-bit library.
-</P>
-<P>
-If <i>startoffset</i> is negative or greater than the length of the subject,
-<b>pcre_exec()</b> returns PCRE_ERROR_BADOFFSET. When the starting offset is
-zero, the search for a match starts at the beginning of the subject, and this
-is by far the most common case. In UTF-8 or UTF-16 mode, the offset must point
-to the start of a character, or the end of the subject (in UTF-32 mode, one
-data unit equals one character, so all offsets are valid). Unlike the pattern
-string, the subject may contain binary zeroes.
-</P>
-<P>
-A non-zero starting offset is useful when searching for another match in the
-same subject by calling <b>pcre_exec()</b> again after a previous success.
-Setting <i>startoffset</i> differs from just passing over a shortened string and
-setting PCRE_NOTBOL in the case of a pattern that begins with any kind of
-lookbehind. For example, consider the pattern
-<pre>
-  \Biss\B
-</pre>
-which finds occurrences of "iss" in the middle of words. (\B matches only if
-the current position in the subject is not a word boundary.) When applied to
-the string "Mississipi" the first call to <b>pcre_exec()</b> finds the first
-occurrence. If <b>pcre_exec()</b> is called again with just the remainder of the
-subject, namely "issipi", it does not match, because \B is always false at the
-start of the subject, which is deemed to be a word boundary. However, if
-<b>pcre_exec()</b> is passed the entire string again, but with <i>startoffset</i>
-set to 4, it finds the second occurrence of "iss" because it is able to look
-behind the starting point to discover that it is preceded by a letter.
-</P>
-<P>
-Finding all the matches in a subject is tricky when the pattern can match an
-empty string. It is possible to emulate Perl's /g behaviour by first trying the
-match again at the same offset, with the PCRE_NOTEMPTY_ATSTART and
-PCRE_ANCHORED options, and then if that fails, advancing the starting offset
-and trying an ordinary match again. There is some code that demonstrates how to
-do this in the
-<a href="pcredemo.html"><b>pcredemo</b></a>
-sample program. In the most general case, you have to check to see if the
-newline convention recognizes CRLF as a newline, and if so, and the current
-character is CR followed by LF, advance the starting offset by two characters
-instead of one.
-</P>
-<P>
-If a non-zero starting offset is passed when the pattern is anchored, one
-attempt to match at the given offset is made. This can only succeed if the
-pattern does not require the match to be at the start of the subject.
-</P>
-<br><b>
-How <b>pcre_exec()</b> returns captured substrings
-</b><br>
-<P>
-In general, a pattern matches a certain portion of the subject, and in
-addition, further substrings from the subject may be picked out by parts of the
-pattern. Following the usage in Jeffrey Friedl's book, this is called
-"capturing" in what follows, and the phrase "capturing subpattern" is used for
-a fragment of a pattern that picks out a substring. PCRE supports several other
-kinds of parenthesized subpattern that do not cause substrings to be captured.
-</P>
-<P>
-Captured substrings are returned to the caller via a vector of integers whose
-address is passed in <i>ovector</i>. The number of elements in the vector is
-passed in <i>ovecsize</i>, which must be a non-negative number. <b>Note</b>: this
-argument is NOT the size of <i>ovector</i> in bytes.
-</P>
-<P>
-The first two-thirds of the vector is used to pass back captured substrings,
-each substring using a pair of integers. The remaining third of the vector is
-used as workspace by <b>pcre_exec()</b> while matching capturing subpatterns,
-and is not available for passing back information. The number passed in
-<i>ovecsize</i> should always be a multiple of three. If it is not, it is
-rounded down.
-</P>
-<P>
-When a match is successful, information about captured substrings is returned
-in pairs of integers, starting at the beginning of <i>ovector</i>, and
-continuing up to two-thirds of its length at the most. The first element of
-each pair is set to the offset of the first character in a substring, and the
-second is set to the offset of the first character after the end of a
-substring. These values are always data unit offsets, even in UTF mode. They
-are byte offsets in the 8-bit library, 16-bit data item offsets in the 16-bit
-library, and 32-bit data item offsets in the 32-bit library. <b>Note</b>: they
-are not character counts.
-</P>
-<P>
-The first pair of integers, <i>ovector[0]</i> and <i>ovector[1]</i>, identify the
-portion of the subject string matched by the entire pattern. The next pair is
-used for the first capturing subpattern, and so on. The value returned by
-<b>pcre_exec()</b> is one more than the highest numbered pair that has been set.
-For example, if two substrings have been captured, the returned value is 3. If
-there are no capturing subpatterns, the return value from a successful match is
-1, indicating that just the first pair of offsets has been set.
-</P>
-<P>
-If a capturing subpattern is matched repeatedly, it is the last portion of the
-string that it matched that is returned.
-</P>
-<P>
-If the vector is too small to hold all the captured substring offsets, it is
-used as far as possible (up to two-thirds of its length), and the function
-returns a value of zero. If neither the actual string matched nor any captured
-substrings are of interest, <b>pcre_exec()</b> may be called with <i>ovector</i>
-passed as NULL and <i>ovecsize</i> as zero. However, if the pattern contains
-back references and the <i>ovector</i> is not big enough to remember the related
-substrings, PCRE has to get additional memory for use during matching. Thus it
-is usually advisable to supply an <i>ovector</i> of reasonable size.
-</P>
-<P>
-There are some cases where zero is returned (indicating vector overflow) when
-in fact the vector is exactly the right size for the final match. For example,
-consider the pattern
-<pre>
-  (a)(?:(b)c|bd)
-</pre>
-If a vector of 6 elements (allowing for only 1 captured substring) is given
-with subject string "abd", <b>pcre_exec()</b> will try to set the second
-captured string, thereby recording a vector overflow, before failing to match
-"c" and backing up to try the second alternative. The zero return, however,
-does correctly indicate that the maximum number of slots (namely 2) have been
-filled. In similar cases where there is temporary overflow, but the final
-number of used slots is actually less than the maximum, a non-zero value is
-returned.
-</P>
-<P>
-The <b>pcre_fullinfo()</b> function can be used to find out how many capturing
-subpatterns there are in a compiled pattern. The smallest size for
-<i>ovector</i> that will allow for <i>n</i> captured substrings, in addition to
-the offsets of the substring matched by the whole pattern, is (<i>n</i>+1)*3.
-</P>
-<P>
-It is possible for capturing subpattern number <i>n+1</i> to match some part of
-the subject when subpattern <i>n</i> has not been used at all. For example, if
-the string "abc" is matched against the pattern (a|(z))(bc) the return from the
-function is 4, and subpatterns 1 and 3 are matched, but 2 is not. When this
-happens, both values in the offset pairs corresponding to unused subpatterns
-are set to -1.
-</P>
-<P>
-Offset values that correspond to unused subpatterns at the end of the
-expression are also set to -1. For example, if the string "abc" is matched
-against the pattern (abc)(x(yz)?)? subpatterns 2 and 3 are not matched. The
-return from the function is 2, because the highest used capturing subpattern
-number is 1, and the offsets for for the second and third capturing subpatterns
-(assuming the vector is large enough, of course) are set to -1.
-</P>
-<P>
-<b>Note</b>: Elements in the first two-thirds of <i>ovector</i> that do not
-correspond to capturing parentheses in the pattern are never changed. That is,
-if a pattern contains <i>n</i> capturing parentheses, no more than
-<i>ovector[0]</i> to <i>ovector[2n+1]</i> are set by <b>pcre_exec()</b>. The other
-elements (in the first two-thirds) retain whatever values they previously had.
-</P>
-<P>
-Some convenience functions are provided for extracting the captured substrings
-as separate strings. These are described below.
-<a name="errorlist"></a></P>
-<br><b>
-Error return values from <b>pcre_exec()</b>
-</b><br>
-<P>
-If <b>pcre_exec()</b> fails, it returns a negative number. The following are
-defined in the header file:
-<pre>
-  PCRE_ERROR_NOMATCH        (-1)
-</pre>
-The subject string did not match the pattern.
-<pre>
-  PCRE_ERROR_NULL           (-2)
-</pre>
-Either <i>code</i> or <i>subject</i> was passed as NULL, or <i>ovector</i> was
-NULL and <i>ovecsize</i> was not zero.
-<pre>
-  PCRE_ERROR_BADOPTION      (-3)
-</pre>
-An unrecognized bit was set in the <i>options</i> argument.
-<pre>
-  PCRE_ERROR_BADMAGIC       (-4)
-</pre>
-PCRE stores a 4-byte "magic number" at the start of the compiled code, to catch
-the case when it is passed a junk pointer and to detect when a pattern that was
-compiled in an environment of one endianness is run in an environment with the
-other endianness. This is the error that PCRE gives when the magic number is
-not present.
-<pre>
-  PCRE_ERROR_UNKNOWN_OPCODE (-5)
-</pre>
-While running the pattern match, an unknown item was encountered in the
-compiled pattern. This error could be caused by a bug in PCRE or by overwriting
-of the compiled pattern.
-<pre>
-  PCRE_ERROR_NOMEMORY       (-6)
-</pre>
-If a pattern contains back references, but the <i>ovector</i> that is passed to
-<b>pcre_exec()</b> is not big enough to remember the referenced substrings, PCRE
-gets a block of memory at the start of matching to use for this purpose. If the
-call via <b>pcre_malloc()</b> fails, this error is given. The memory is
-automatically freed at the end of matching.
-</P>
-<P>
-This error is also given if <b>pcre_stack_malloc()</b> fails in
-<b>pcre_exec()</b>. This can happen only when PCRE has been compiled with
-<b>--disable-stack-for-recursion</b>.
-<pre>
-  PCRE_ERROR_NOSUBSTRING    (-7)
-</pre>
-This error is used by the <b>pcre_copy_substring()</b>,
-<b>pcre_get_substring()</b>, and <b>pcre_get_substring_list()</b> functions (see
-below). It is never returned by <b>pcre_exec()</b>.
-<pre>
-  PCRE_ERROR_MATCHLIMIT     (-8)
-</pre>
-The backtracking limit, as specified by the <i>match_limit</i> field in a
-<b>pcre_extra</b> structure (or defaulted) was reached. See the description
-above.
-<pre>
-  PCRE_ERROR_CALLOUT        (-9)
-</pre>
-This error is never generated by <b>pcre_exec()</b> itself. It is provided for
-use by callout functions that want to yield a distinctive error code. See the
-<a href="pcrecallout.html"><b>pcrecallout</b></a>
-documentation for details.
-<pre>
-  PCRE_ERROR_BADUTF8        (-10)
-</pre>
-A string that contains an invalid UTF-8 byte sequence was passed as a subject,
-and the PCRE_NO_UTF8_CHECK option was not set. If the size of the output vector
-(<i>ovecsize</i>) is at least 2, the byte offset to the start of the the invalid
-UTF-8 character is placed in the first element, and a reason code is placed in
-the second element. The reason codes are listed in the
-<a href="#badutf8reasons">following section.</a>
-For backward compatibility, if PCRE_PARTIAL_HARD is set and the problem is a
-truncated UTF-8 character at the end of the subject (reason codes 1 to 5),
-PCRE_ERROR_SHORTUTF8 is returned instead of PCRE_ERROR_BADUTF8.
-<pre>
-  PCRE_ERROR_BADUTF8_OFFSET (-11)
-</pre>
-The UTF-8 byte sequence that was passed as a subject was checked and found to
-be valid (the PCRE_NO_UTF8_CHECK option was not set), but the value of
-<i>startoffset</i> did not point to the beginning of a UTF-8 character or the
-end of the subject.
-<pre>
-  PCRE_ERROR_PARTIAL        (-12)
-</pre>
-The subject string did not match, but it did match partially. See the
-<a href="pcrepartial.html"><b>pcrepartial</b></a>
-documentation for details of partial matching.
-<pre>
-  PCRE_ERROR_BADPARTIAL     (-13)
-</pre>
-This code is no longer in use. It was formerly returned when the PCRE_PARTIAL
-option was used with a compiled pattern containing items that were not
-supported for partial matching. From release 8.00 onwards, there are no
-restrictions on partial matching.
-<pre>
-  PCRE_ERROR_INTERNAL       (-14)
-</pre>
-An unexpected internal error has occurred. This error could be caused by a bug
-in PCRE or by overwriting of the compiled pattern.
-<pre>
-  PCRE_ERROR_BADCOUNT       (-15)
-</pre>
-This error is given if the value of the <i>ovecsize</i> argument is negative.
-<pre>
-  PCRE_ERROR_RECURSIONLIMIT (-21)
-</pre>
-The internal recursion limit, as specified by the <i>match_limit_recursion</i>
-field in a <b>pcre_extra</b> structure (or defaulted) was reached. See the
-description above.
-<pre>
-  PCRE_ERROR_BADNEWLINE     (-23)
-</pre>
-An invalid combination of PCRE_NEWLINE_<i>xxx</i> options was given.
-<pre>
-  PCRE_ERROR_BADOFFSET      (-24)
-</pre>
-The value of <i>startoffset</i> was negative or greater than the length of the
-subject, that is, the value in <i>length</i>.
-<pre>
-  PCRE_ERROR_SHORTUTF8      (-25)
-</pre>
-This error is returned instead of PCRE_ERROR_BADUTF8 when the subject string
-ends with a truncated UTF-8 character and the PCRE_PARTIAL_HARD option is set.
-Information about the failure is returned as for PCRE_ERROR_BADUTF8. It is in
-fact sufficient to detect this case, but this special error code for
-PCRE_PARTIAL_HARD precedes the implementation of returned information; it is
-retained for backwards compatibility.
-<pre>
-  PCRE_ERROR_RECURSELOOP    (-26)
-</pre>
-This error is returned when <b>pcre_exec()</b> detects a recursion loop within
-the pattern. Specifically, it means that either the whole pattern or a
-subpattern has been called recursively for the second time at the same position
-in the subject string. Some simple patterns that might do this are detected and
-faulted at compile time, but more complicated cases, in particular mutual
-recursions between two different subpatterns, cannot be detected until run
-time.
-<pre>
-  PCRE_ERROR_JIT_STACKLIMIT (-27)
-</pre>
-This error is returned when a pattern that was successfully studied using a
-JIT compile option is being matched, but the memory available for the
-just-in-time processing stack is not large enough. See the
-<a href="pcrejit.html"><b>pcrejit</b></a>
-documentation for more details.
-<pre>
-  PCRE_ERROR_BADMODE        (-28)
-</pre>
-This error is given if a pattern that was compiled by the 8-bit library is
-passed to a 16-bit or 32-bit library function, or vice versa.
-<pre>
-  PCRE_ERROR_BADENDIANNESS  (-29)
-</pre>
-This error is given if a pattern that was compiled and saved is reloaded on a
-host with different endianness. The utility function
-<b>pcre_pattern_to_host_byte_order()</b> can be used to convert such a pattern
-so that it runs on the new host.
-<pre>
-  PCRE_ERROR_JIT_BADOPTION
-</pre>
-This error is returned when a pattern that was successfully studied using a JIT
-compile option is being matched, but the matching mode (partial or complete
-match) does not correspond to any JIT compilation mode. When the JIT fast path
-function is used, this error may be also given for invalid options. See the
-<a href="pcrejit.html"><b>pcrejit</b></a>
-documentation for more details.
-<pre>
-  PCRE_ERROR_BADLENGTH      (-32)
-</pre>
-This error is given if <b>pcre_exec()</b> is called with a negative value for
-the <i>length</i> argument.
-</P>
-<P>
-Error numbers -16 to -20, -22, and 30 are not used by <b>pcre_exec()</b>.
-<a name="badutf8reasons"></a></P>
-<br><b>
-Reason codes for invalid UTF-8 strings
-</b><br>
-<P>
-This section applies only to the 8-bit library. The corresponding information
-for the 16-bit and 32-bit libraries is given in the
-<a href="pcre16.html"><b>pcre16</b></a>
-and
-<a href="pcre32.html"><b>pcre32</b></a>
-pages.
-</P>
-<P>
-When <b>pcre_exec()</b> returns either PCRE_ERROR_BADUTF8 or
-PCRE_ERROR_SHORTUTF8, and the size of the output vector (<i>ovecsize</i>) is at
-least 2, the offset of the start of the invalid UTF-8 character is placed in
-the first output vector element (<i>ovector[0]</i>) and a reason code is placed
-in the second element (<i>ovector[1]</i>). The reason codes are given names in
-the <b>pcre.h</b> header file:
-<pre>
-  PCRE_UTF8_ERR1
-  PCRE_UTF8_ERR2
-  PCRE_UTF8_ERR3
-  PCRE_UTF8_ERR4
-  PCRE_UTF8_ERR5
-</pre>
-The string ends with a truncated UTF-8 character; the code specifies how many
-bytes are missing (1 to 5). Although RFC 3629 restricts UTF-8 characters to be
-no longer than 4 bytes, the encoding scheme (originally defined by RFC 2279)
-allows for up to 6 bytes, and this is checked first; hence the possibility of
-4 or 5 missing bytes.
-<pre>
-  PCRE_UTF8_ERR6
-  PCRE_UTF8_ERR7
-  PCRE_UTF8_ERR8
-  PCRE_UTF8_ERR9
-  PCRE_UTF8_ERR10
-</pre>
-The two most significant bits of the 2nd, 3rd, 4th, 5th, or 6th byte of the
-character do not have the binary value 0b10 (that is, either the most
-significant bit is 0, or the next bit is 1).
-<pre>
-  PCRE_UTF8_ERR11
-  PCRE_UTF8_ERR12
-</pre>
-A character that is valid by the RFC 2279 rules is either 5 or 6 bytes long;
-these code points are excluded by RFC 3629.
-<pre>
-  PCRE_UTF8_ERR13
-</pre>
-A 4-byte character has a value greater than 0x10fff; these code points are
-excluded by RFC 3629.
-<pre>
-  PCRE_UTF8_ERR14
-</pre>
-A 3-byte character has a value in the range 0xd800 to 0xdfff; this range of
-code points are reserved by RFC 3629 for use with UTF-16, and so are excluded
-from UTF-8.
-<pre>
-  PCRE_UTF8_ERR15
-  PCRE_UTF8_ERR16
-  PCRE_UTF8_ERR17
-  PCRE_UTF8_ERR18
-  PCRE_UTF8_ERR19
-</pre>
-A 2-, 3-, 4-, 5-, or 6-byte character is "overlong", that is, it codes for a
-value that can be represented by fewer bytes, which is invalid. For example,
-the two bytes 0xc0, 0xae give the value 0x2e, whose correct coding uses just
-one byte.
-<pre>
-  PCRE_UTF8_ERR20
-</pre>
-The two most significant bits of the first byte of a character have the binary
-value 0b10 (that is, the most significant bit is 1 and the second is 0). Such a
-byte can only validly occur as the second or subsequent byte of a multi-byte
-character.
-<pre>
-  PCRE_UTF8_ERR21
-</pre>
-The first byte of a character has the value 0xfe or 0xff. These values can
-never occur in a valid UTF-8 string.
-<pre>
-  PCRE_UTF8_ERR22
-</pre>
-This error code was formerly used when the presence of a so-called
-"non-character" caused an error. Unicode corrigendum #9 makes it clear that
-such characters should not cause a string to be rejected, and so this code is
-no longer in use and is never returned.
-</P>
-<br><a name="SEC18" href="#TOC1">EXTRACTING CAPTURED SUBSTRINGS BY NUMBER</a><br>
-<P>
-<b>int pcre_copy_substring(const char *<i>subject</i>, int *<i>ovector</i>,</b>
-<b>     int <i>stringcount</i>, int <i>stringnumber</i>, char *<i>buffer</i>,</b>
-<b>     int <i>buffersize</i>);</b>
-<br>
-<br>
-<b>int pcre_get_substring(const char *<i>subject</i>, int *<i>ovector</i>,</b>
-<b>     int <i>stringcount</i>, int <i>stringnumber</i>,</b>
-<b>     const char **<i>stringptr</i>);</b>
-<br>
-<br>
-<b>int pcre_get_substring_list(const char *<i>subject</i>,</b>
-<b>     int *<i>ovector</i>, int <i>stringcount</i>, const char ***<i>listptr</i>);</b>
-</P>
-<P>
-Captured substrings can be accessed directly by using the offsets returned by
-<b>pcre_exec()</b> in <i>ovector</i>. For convenience, the functions
-<b>pcre_copy_substring()</b>, <b>pcre_get_substring()</b>, and
-<b>pcre_get_substring_list()</b> are provided for extracting captured substrings
-as new, separate, zero-terminated strings. These functions identify substrings
-by number. The next section describes functions for extracting named
-substrings.
-</P>
-<P>
-A substring that contains a binary zero is correctly extracted and has a
-further zero added on the end, but the result is not, of course, a C string.
-However, you can process such a string by referring to the length that is
-returned by <b>pcre_copy_substring()</b> and <b>pcre_get_substring()</b>.
-Unfortunately, the interface to <b>pcre_get_substring_list()</b> is not adequate
-for handling strings containing binary zeros, because the end of the final
-string is not independently indicated.
-</P>
-<P>
-The first three arguments are the same for all three of these functions:
-<i>subject</i> is the subject string that has just been successfully matched,
-<i>ovector</i> is a pointer to the vector of integer offsets that was passed to
-<b>pcre_exec()</b>, and <i>stringcount</i> is the number of substrings that were
-captured by the match, including the substring that matched the entire regular
-expression. This is the value returned by <b>pcre_exec()</b> if it is greater
-than zero. If <b>pcre_exec()</b> returned zero, indicating that it ran out of
-space in <i>ovector</i>, the value passed as <i>stringcount</i> should be the
-number of elements in the vector divided by three.
-</P>
-<P>
-The functions <b>pcre_copy_substring()</b> and <b>pcre_get_substring()</b>
-extract a single substring, whose number is given as <i>stringnumber</i>. A
-value of zero extracts the substring that matched the entire pattern, whereas
-higher values extract the captured substrings. For <b>pcre_copy_substring()</b>,
-the string is placed in <i>buffer</i>, whose length is given by
-<i>buffersize</i>, while for <b>pcre_get_substring()</b> a new block of memory is
-obtained via <b>pcre_malloc</b>, and its address is returned via
-<i>stringptr</i>. The yield of the function is the length of the string, not
-including the terminating zero, or one of these error codes:
-<pre>
-  PCRE_ERROR_NOMEMORY       (-6)
-</pre>
-The buffer was too small for <b>pcre_copy_substring()</b>, or the attempt to get
-memory failed for <b>pcre_get_substring()</b>.
-<pre>
-  PCRE_ERROR_NOSUBSTRING    (-7)
-</pre>
-There is no substring whose number is <i>stringnumber</i>.
-</P>
-<P>
-The <b>pcre_get_substring_list()</b> function extracts all available substrings
-and builds a list of pointers to them. All this is done in a single block of
-memory that is obtained via <b>pcre_malloc</b>. The address of the memory block
-is returned via <i>listptr</i>, which is also the start of the list of string
-pointers. The end of the list is marked by a NULL pointer. The yield of the
-function is zero if all went well, or the error code
-<pre>
-  PCRE_ERROR_NOMEMORY       (-6)
-</pre>
-if the attempt to get the memory block failed.
-</P>
-<P>
-When any of these functions encounter a substring that is unset, which can
-happen when capturing subpattern number <i>n+1</i> matches some part of the
-subject, but subpattern <i>n</i> has not been used at all, they return an empty
-string. This can be distinguished from a genuine zero-length substring by
-inspecting the appropriate offset in <i>ovector</i>, which is negative for unset
-substrings.
-</P>
-<P>
-The two convenience functions <b>pcre_free_substring()</b> and
-<b>pcre_free_substring_list()</b> can be used to free the memory returned by
-a previous call of <b>pcre_get_substring()</b> or
-<b>pcre_get_substring_list()</b>, respectively. They do nothing more than call
-the function pointed to by <b>pcre_free</b>, which of course could be called
-directly from a C program. However, PCRE is used in some situations where it is
-linked via a special interface to another programming language that cannot use
-<b>pcre_free</b> directly; it is for these cases that the functions are
-provided.
-</P>
-<br><a name="SEC19" href="#TOC1">EXTRACTING CAPTURED SUBSTRINGS BY NAME</a><br>
-<P>
-<b>int pcre_get_stringnumber(const pcre *<i>code</i>,</b>
-<b>     const char *<i>name</i>);</b>
-<br>
-<br>
-<b>int pcre_copy_named_substring(const pcre *<i>code</i>,</b>
-<b>     const char *<i>subject</i>, int *<i>ovector</i>,</b>
-<b>     int <i>stringcount</i>, const char *<i>stringname</i>,</b>
-<b>     char *<i>buffer</i>, int <i>buffersize</i>);</b>
-<br>
-<br>
-<b>int pcre_get_named_substring(const pcre *<i>code</i>,</b>
-<b>     const char *<i>subject</i>, int *<i>ovector</i>,</b>
-<b>     int <i>stringcount</i>, const char *<i>stringname</i>,</b>
-<b>     const char **<i>stringptr</i>);</b>
-</P>
-<P>
-To extract a substring by name, you first have to find associated number.
-For example, for this pattern
-<pre>
-  (a+)b(?&#60;xxx&#62;\d+)...
-</pre>
-the number of the subpattern called "xxx" is 2. If the name is known to be
-unique (PCRE_DUPNAMES was not set), you can find the number from the name by
-calling <b>pcre_get_stringnumber()</b>. The first argument is the compiled
-pattern, and the second is the name. The yield of the function is the
-subpattern number, or PCRE_ERROR_NOSUBSTRING (-7) if there is no subpattern of
-that name.
-</P>
-<P>
-Given the number, you can extract the substring directly, or use one of the
-functions described in the previous section. For convenience, there are also
-two functions that do the whole job.
-</P>
-<P>
-Most of the arguments of <b>pcre_copy_named_substring()</b> and
-<b>pcre_get_named_substring()</b> are the same as those for the similarly named
-functions that extract by number. As these are described in the previous
-section, they are not re-described here. There are just two differences:
-</P>
-<P>
-First, instead of a substring number, a substring name is given. Second, there
-is an extra argument, given at the start, which is a pointer to the compiled
-pattern. This is needed in order to gain access to the name-to-number
-translation table.
-</P>
-<P>
-These functions call <b>pcre_get_stringnumber()</b>, and if it succeeds, they
-then call <b>pcre_copy_substring()</b> or <b>pcre_get_substring()</b>, as
-appropriate. <b>NOTE:</b> If PCRE_DUPNAMES is set and there are duplicate names,
-the behaviour may not be what you want (see the next section).
-</P>
-<P>
-<b>Warning:</b> If the pattern uses the (?| feature to set up multiple
-subpatterns with the same number, as described in the
-<a href="pcrepattern.html#dupsubpatternnumber">section on duplicate subpattern numbers</a>
-in the
-<a href="pcrepattern.html"><b>pcrepattern</b></a>
-page, you cannot use names to distinguish the different subpatterns, because
-names are not included in the compiled code. The matching process uses only
-numbers. For this reason, the use of different names for subpatterns of the
-same number causes an error at compile time.
-</P>
-<br><a name="SEC20" href="#TOC1">DUPLICATE SUBPATTERN NAMES</a><br>
-<P>
-<b>int pcre_get_stringtable_entries(const pcre *<i>code</i>,</b>
-<b>     const char *<i>name</i>, char **<i>first</i>, char **<i>last</i>);</b>
-</P>
-<P>
-When a pattern is compiled with the PCRE_DUPNAMES option, names for subpatterns
-are not required to be unique. (Duplicate names are always allowed for
-subpatterns with the same number, created by using the (?| feature. Indeed, if
-such subpatterns are named, they are required to use the same names.)
-</P>
-<P>
-Normally, patterns with duplicate names are such that in any one match, only
-one of the named subpatterns participates. An example is shown in the
-<a href="pcrepattern.html"><b>pcrepattern</b></a>
-documentation.
-</P>
-<P>
-When duplicates are present, <b>pcre_copy_named_substring()</b> and
-<b>pcre_get_named_substring()</b> return the first substring corresponding to
-the given name that is set. If none are set, PCRE_ERROR_NOSUBSTRING (-7) is
-returned; no data is returned. The <b>pcre_get_stringnumber()</b> function
-returns one of the numbers that are associated with the name, but it is not
-defined which it is.
-</P>
-<P>
-If you want to get full details of all captured substrings for a given name,
-you must use the <b>pcre_get_stringtable_entries()</b> function. The first
-argument is the compiled pattern, and the second is the name. The third and
-fourth are pointers to variables which are updated by the function. After it
-has run, they point to the first and last entries in the name-to-number table
-for the given name. The function itself returns the length of each entry, or
-PCRE_ERROR_NOSUBSTRING (-7) if there are none. The format of the table is
-described above in the section entitled <i>Information about a pattern</i>
-<a href="#infoaboutpattern">above.</a>
-Given all the relevant entries for the name, you can extract each of their
-numbers, and hence the captured data, if any.
-</P>
-<br><a name="SEC21" href="#TOC1">FINDING ALL POSSIBLE MATCHES</a><br>
-<P>
-The traditional matching function uses a similar algorithm to Perl, which stops
-when it finds the first match, starting at a given point in the subject. If you
-want to find all possible matches, or the longest possible match, consider
-using the alternative matching function (see below) instead. If you cannot use
-the alternative function, but still need to find all possible matches, you
-can kludge it up by making use of the callout facility, which is described in
-the
-<a href="pcrecallout.html"><b>pcrecallout</b></a>
-documentation.
-</P>
-<P>
-What you have to do is to insert a callout right at the end of the pattern.
-When your callout function is called, extract and save the current matched
-substring. Then return 1, which forces <b>pcre_exec()</b> to backtrack and try
-other alternatives. Ultimately, when it runs out of matches, <b>pcre_exec()</b>
-will yield PCRE_ERROR_NOMATCH.
-</P>
-<br><a name="SEC22" href="#TOC1">OBTAINING AN ESTIMATE OF STACK USAGE</a><br>
-<P>
-Matching certain patterns using <b>pcre_exec()</b> can use a lot of process
-stack, which in certain environments can be rather limited in size. Some users
-find it helpful to have an estimate of the amount of stack that is used by
-<b>pcre_exec()</b>, to help them set recursion limits, as described in the
-<a href="pcrestack.html"><b>pcrestack</b></a>
-documentation. The estimate that is output by <b>pcretest</b> when called with
-the <b>-m</b> and <b>-C</b> options is obtained by calling <b>pcre_exec</b> with
-the values NULL, NULL, NULL, -999, and -999 for its first five arguments.
-</P>
-<P>
-Normally, if its first argument is NULL, <b>pcre_exec()</b> immediately returns
-the negative error code PCRE_ERROR_NULL, but with this special combination of
-arguments, it returns instead a negative number whose absolute value is the
-approximate stack frame size in bytes. (A negative number is used so that it is
-clear that no match has happened.) The value is approximate because in some
-cases, recursive calls to <b>pcre_exec()</b> occur when there are one or two
-additional variables on the stack.
-</P>
-<P>
-If PCRE has been compiled to use the heap instead of the stack for recursion,
-the value returned is the size of each block that is obtained from the heap.
-<a name="dfamatch"></a></P>
-<br><a name="SEC23" href="#TOC1">MATCHING A PATTERN: THE ALTERNATIVE FUNCTION</a><br>
-<P>
-<b>int pcre_dfa_exec(const pcre *<i>code</i>, const pcre_extra *<i>extra</i>,</b>
-<b>     const char *<i>subject</i>, int <i>length</i>, int <i>startoffset</i>,</b>
-<b>     int <i>options</i>, int *<i>ovector</i>, int <i>ovecsize</i>,</b>
-<b>     int *<i>workspace</i>, int <i>wscount</i>);</b>
-</P>
-<P>
-The function <b>pcre_dfa_exec()</b> is called to match a subject string against
-a compiled pattern, using a matching algorithm that scans the subject string
-just once, and does not backtrack. This has different characteristics to the
-normal algorithm, and is not compatible with Perl. Some of the features of PCRE
-patterns are not supported. Nevertheless, there are times when this kind of
-matching can be useful. For a discussion of the two matching algorithms, and a
-list of features that <b>pcre_dfa_exec()</b> does not support, see the
-<a href="pcrematching.html"><b>pcrematching</b></a>
-documentation.
-</P>
-<P>
-The arguments for the <b>pcre_dfa_exec()</b> function are the same as for
-<b>pcre_exec()</b>, plus two extras. The <i>ovector</i> argument is used in a
-different way, and this is described below. The other common arguments are used
-in the same way as for <b>pcre_exec()</b>, so their description is not repeated
-here.
-</P>
-<P>
-The two additional arguments provide workspace for the function. The workspace
-vector should contain at least 20 elements. It is used for keeping track of
-multiple paths through the pattern tree. More workspace will be needed for
-patterns and subjects where there are a lot of potential matches.
-</P>
-<P>
-Here is an example of a simple call to <b>pcre_dfa_exec()</b>:
-<pre>
-  int rc;
-  int ovector[10];
-  int wspace[20];
-  rc = pcre_dfa_exec(
-    re,             /* result of pcre_compile() */
-    NULL,           /* we didn't study the pattern */
-    "some string",  /* the subject string */
-    11,             /* the length of the subject string */
-    0,              /* start at offset 0 in the subject */
-    0,              /* default options */
-    ovector,        /* vector of integers for substring information */
-    10,             /* number of elements (NOT size in bytes) */
-    wspace,         /* working space vector */
-    20);            /* number of elements (NOT size in bytes) */
-</PRE>
-</P>
-<br><b>
-Option bits for <b>pcre_dfa_exec()</b>
-</b><br>
-<P>
-The unused bits of the <i>options</i> argument for <b>pcre_dfa_exec()</b> must be
-zero. The only bits that may be set are PCRE_ANCHORED, PCRE_NEWLINE_<i>xxx</i>,
-PCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY, PCRE_NOTEMPTY_ATSTART,
-PCRE_NO_UTF8_CHECK, PCRE_BSR_ANYCRLF, PCRE_BSR_UNICODE, PCRE_NO_START_OPTIMIZE,
-PCRE_PARTIAL_HARD, PCRE_PARTIAL_SOFT, PCRE_DFA_SHORTEST, and PCRE_DFA_RESTART.
-All but the last four of these are exactly the same as for <b>pcre_exec()</b>,
-so their description is not repeated here.
-<pre>
-  PCRE_PARTIAL_HARD
-  PCRE_PARTIAL_SOFT
-</pre>
-These have the same general effect as they do for <b>pcre_exec()</b>, but the
-details are slightly different. When PCRE_PARTIAL_HARD is set for
-<b>pcre_dfa_exec()</b>, it returns PCRE_ERROR_PARTIAL if the end of the subject
-is reached and there is still at least one matching possibility that requires
-additional characters. This happens even if some complete matches have also
-been found. When PCRE_PARTIAL_SOFT is set, the return code PCRE_ERROR_NOMATCH
-is converted into PCRE_ERROR_PARTIAL if the end of the subject is reached,
-there have been no complete matches, but there is still at least one matching
-possibility. The portion of the string that was inspected when the longest
-partial match was found is set as the first matching string in both cases.
-There is a more detailed discussion of partial and multi-segment matching, with
-examples, in the
-<a href="pcrepartial.html"><b>pcrepartial</b></a>
-documentation.
-<pre>
-  PCRE_DFA_SHORTEST
-</pre>
-Setting the PCRE_DFA_SHORTEST option causes the matching algorithm to stop as
-soon as it has found one match. Because of the way the alternative algorithm
-works, this is necessarily the shortest possible match at the first possible
-matching point in the subject string.
-<pre>
-  PCRE_DFA_RESTART
-</pre>
-When <b>pcre_dfa_exec()</b> returns a partial match, it is possible to call it
-again, with additional subject characters, and have it continue with the same
-match. The PCRE_DFA_RESTART option requests this action; when it is set, the
-<i>workspace</i> and <i>wscount</i> options must reference the same vector as
-before because data about the match so far is left in them after a partial
-match. There is more discussion of this facility in the
-<a href="pcrepartial.html"><b>pcrepartial</b></a>
-documentation.
-</P>
-<br><b>
-Successful returns from <b>pcre_dfa_exec()</b>
-</b><br>
-<P>
-When <b>pcre_dfa_exec()</b> succeeds, it may have matched more than one
-substring in the subject. Note, however, that all the matches from one run of
-the function start at the same point in the subject. The shorter matches are
-all initial substrings of the longer matches. For example, if the pattern
-<pre>
-  &#60;.*&#62;
-</pre>
-is matched against the string
-<pre>
-  This is &#60;something&#62; &#60;something else&#62; &#60;something further&#62; no more
-</pre>
-the three matched strings are
-<pre>
-  &#60;something&#62;
-  &#60;something&#62; &#60;something else&#62;
-  &#60;something&#62; &#60;something else&#62; &#60;something further&#62;
-</pre>
-On success, the yield of the function is a number greater than zero, which is
-the number of matched substrings. The substrings themselves are returned in
-<i>ovector</i>. Each string uses two elements; the first is the offset to the
-start, and the second is the offset to the end. In fact, all the strings have
-the same start offset. (Space could have been saved by giving this only once,
-but it was decided to retain some compatibility with the way <b>pcre_exec()</b>
-returns data, even though the meaning of the strings is different.)
-</P>
-<P>
-The strings are returned in reverse order of length; that is, the longest
-matching string is given first. If there were too many matches to fit into
-<i>ovector</i>, the yield of the function is zero, and the vector is filled with
-the longest matches. Unlike <b>pcre_exec()</b>, <b>pcre_dfa_exec()</b> can use
-the entire <i>ovector</i> for returning matched strings.
-</P>
-<P>
-NOTE: PCRE's "auto-possessification" optimization usually applies to character
-repeats at the end of a pattern (as well as internally). For example, the
-pattern "a\d+" is compiled as if it were "a\d++" because there is no point
-even considering the possibility of backtracking into the repeated digits. For
-DFA matching, this means that only one possible match is found. If you really
-do want multiple matches in such cases, either use an ungreedy repeat
-("a\d+?") or set the PCRE_NO_AUTO_POSSESS option when compiling.
-</P>
-<br><b>
-Error returns from <b>pcre_dfa_exec()</b>
-</b><br>
-<P>
-The <b>pcre_dfa_exec()</b> function returns a negative number when it fails.
-Many of the errors are the same as for <b>pcre_exec()</b>, and these are
-described
-<a href="#errorlist">above.</a>
-There are in addition the following errors that are specific to
-<b>pcre_dfa_exec()</b>:
-<pre>
-  PCRE_ERROR_DFA_UITEM      (-16)
-</pre>
-This return is given if <b>pcre_dfa_exec()</b> encounters an item in the pattern
-that it does not support, for instance, the use of \C or a back reference.
-<pre>
-  PCRE_ERROR_DFA_UCOND      (-17)
-</pre>
-This return is given if <b>pcre_dfa_exec()</b> encounters a condition item that
-uses a back reference for the condition, or a test for recursion in a specific
-group. These are not supported.
-<pre>
-  PCRE_ERROR_DFA_UMLIMIT    (-18)
-</pre>
-This return is given if <b>pcre_dfa_exec()</b> is called with an <i>extra</i>
-block that contains a setting of the <i>match_limit</i> or
-<i>match_limit_recursion</i> fields. This is not supported (these fields are
-meaningless for DFA matching).
-<pre>
-  PCRE_ERROR_DFA_WSSIZE     (-19)
-</pre>
-This return is given if <b>pcre_dfa_exec()</b> runs out of space in the
-<i>workspace</i> vector.
-<pre>
-  PCRE_ERROR_DFA_RECURSE    (-20)
-</pre>
-When a recursive subpattern is processed, the matching function calls itself
-recursively, using private vectors for <i>ovector</i> and <i>workspace</i>. This
-error is given if the output vector is not large enough. This should be
-extremely rare, as a vector of size 1000 is used.
-<pre>
-  PCRE_ERROR_DFA_BADRESTART (-30)
-</pre>
-When <b>pcre_dfa_exec()</b> is called with the <b>PCRE_DFA_RESTART</b> option,
-some plausibility checks are made on the contents of the workspace, which
-should contain data about the previous partial match. If any of these checks
-fail, this error is given.
-</P>
-<br><a name="SEC24" href="#TOC1">SEE ALSO</a><br>
-<P>
-<b>pcre16</b>(3), <b>pcre32</b>(3), <b>pcrebuild</b>(3), <b>pcrecallout</b>(3),
-<b>pcrecpp(3)</b>(3), <b>pcrematching</b>(3), <b>pcrepartial</b>(3),
-<b>pcreposix</b>(3), <b>pcreprecompile</b>(3), <b>pcresample</b>(3),
-<b>pcrestack</b>(3).
-</P>
-<br><a name="SEC25" href="#TOC1">AUTHOR</a><br>
-<P>
-Philip Hazel
-<br>
-University Computing Service
-<br>
-Cambridge CB2 3QH, England.
-<br>
-</P>
-<br><a name="SEC26" href="#TOC1">REVISION</a><br>
-<P>
-Last updated: 09 February 2014
-<br>
-Copyright &copy; 1997-2014 University of Cambridge.
-<br>
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
diff --git a/dist/doc/html/pcrebuild.html b/dist/doc/html/pcrebuild.html
deleted file mode 100644
index 03c8cbe..0000000
--- a/dist/doc/html/pcrebuild.html
+++ /dev/null
@@ -1,534 +0,0 @@
-<html>
-<head>
-<title>pcrebuild specification</title>
-</head>
-<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
-<h1>pcrebuild man page</h1>
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
-<p>
-This page is part of the PCRE HTML documentation. It was generated automatically
-from the original man page. If there is any nonsense in it, please consult the
-man page, in case the conversion went wrong.
-<br>
-<ul>
-<li><a name="TOC1" href="#SEC1">BUILDING PCRE</a>
-<li><a name="TOC2" href="#SEC2">PCRE BUILD-TIME OPTIONS</a>
-<li><a name="TOC3" href="#SEC3">BUILDING 8-BIT, 16-BIT AND 32-BIT LIBRARIES</a>
-<li><a name="TOC4" href="#SEC4">BUILDING SHARED AND STATIC LIBRARIES</a>
-<li><a name="TOC5" href="#SEC5">C++ SUPPORT</a>
-<li><a name="TOC6" href="#SEC6">UTF-8, UTF-16 AND UTF-32 SUPPORT</a>
-<li><a name="TOC7" href="#SEC7">UNICODE CHARACTER PROPERTY SUPPORT</a>
-<li><a name="TOC8" href="#SEC8">JUST-IN-TIME COMPILER SUPPORT</a>
-<li><a name="TOC9" href="#SEC9">CODE VALUE OF NEWLINE</a>
-<li><a name="TOC10" href="#SEC10">WHAT \R MATCHES</a>
-<li><a name="TOC11" href="#SEC11">POSIX MALLOC USAGE</a>
-<li><a name="TOC12" href="#SEC12">HANDLING VERY LARGE PATTERNS</a>
-<li><a name="TOC13" href="#SEC13">AVOIDING EXCESSIVE STACK USAGE</a>
-<li><a name="TOC14" href="#SEC14">LIMITING PCRE RESOURCE USAGE</a>
-<li><a name="TOC15" href="#SEC15">CREATING CHARACTER TABLES AT BUILD TIME</a>
-<li><a name="TOC16" href="#SEC16">USING EBCDIC CODE</a>
-<li><a name="TOC17" href="#SEC17">PCREGREP OPTIONS FOR COMPRESSED FILE SUPPORT</a>
-<li><a name="TOC18" href="#SEC18">PCREGREP BUFFER SIZE</a>
-<li><a name="TOC19" href="#SEC19">PCRETEST OPTION FOR LIBREADLINE SUPPORT</a>
-<li><a name="TOC20" href="#SEC20">DEBUGGING WITH VALGRIND SUPPORT</a>
-<li><a name="TOC21" href="#SEC21">CODE COVERAGE REPORTING</a>
-<li><a name="TOC22" href="#SEC22">SEE ALSO</a>
-<li><a name="TOC23" href="#SEC23">AUTHOR</a>
-<li><a name="TOC24" href="#SEC24">REVISION</a>
-</ul>
-<br><a name="SEC1" href="#TOC1">BUILDING PCRE</a><br>
-<P>
-PCRE is distributed with a <b>configure</b> script that can be used to build the
-library in Unix-like environments using the applications known as Autotools.
-Also in the distribution are files to support building using <b>CMake</b>
-instead of <b>configure</b>. The text file
-<a href="README.txt"><b>README</b></a>
-contains general information about building with Autotools (some of which is
-repeated below), and also has some comments about building on various operating
-systems. There is a lot more information about building PCRE without using
-Autotools (including information about using <b>CMake</b> and building "by
-hand") in the text file called
-<a href="NON-AUTOTOOLS-BUILD.txt"><b>NON-AUTOTOOLS-BUILD</b>.</a>
-You should consult this file as well as the
-<a href="README.txt"><b>README</b></a>
-file if you are building in a non-Unix-like environment.
-</P>
-<br><a name="SEC2" href="#TOC1">PCRE BUILD-TIME OPTIONS</a><br>
-<P>
-The rest of this document describes the optional features of PCRE that can be
-selected when the library is compiled. It assumes use of the <b>configure</b>
-script, where the optional features are selected or deselected by providing
-options to <b>configure</b> before running the <b>make</b> command. However, the
-same options can be selected in both Unix-like and non-Unix-like environments
-using the GUI facility of <b>cmake-gui</b> if you are using <b>CMake</b> instead
-of <b>configure</b> to build PCRE.
-</P>
-<P>
-If you are not using Autotools or <b>CMake</b>, option selection can be done by
-editing the <b>config.h</b> file, or by passing parameter settings to the
-compiler, as described in
-<a href="NON-AUTOTOOLS-BUILD.txt"><b>NON-AUTOTOOLS-BUILD</b>.</a>
-</P>
-<P>
-The complete list of options for <b>configure</b> (which includes the standard
-ones such as the selection of the installation directory) can be obtained by
-running
-<pre>
-  ./configure --help
-</pre>
-The following sections include descriptions of options whose names begin with
---enable or --disable. These settings specify changes to the defaults for the
-<b>configure</b> command. Because of the way that <b>configure</b> works,
---enable and --disable always come in pairs, so the complementary option always
-exists as well, but as it specifies the default, it is not described.
-</P>
-<br><a name="SEC3" href="#TOC1">BUILDING 8-BIT, 16-BIT AND 32-BIT LIBRARIES</a><br>
-<P>
-By default, a library called <b>libpcre</b> is built, containing functions that
-take string arguments contained in vectors of bytes, either as single-byte
-characters, or interpreted as UTF-8 strings. You can also build a separate
-library, called <b>libpcre16</b>, in which strings are contained in vectors of
-16-bit data units and interpreted either as single-unit characters or UTF-16
-strings, by adding
-<pre>
-  --enable-pcre16
-</pre>
-to the <b>configure</b> command. You can also build yet another separate
-library, called <b>libpcre32</b>, in which strings are contained in vectors of
-32-bit data units and interpreted either as single-unit characters or UTF-32
-strings, by adding
-<pre>
-  --enable-pcre32
-</pre>
-to the <b>configure</b> command. If you do not want the 8-bit library, add
-<pre>
-  --disable-pcre8
-</pre>
-as well. At least one of the three libraries must be built. Note that the C++
-and POSIX wrappers are for the 8-bit library only, and that <b>pcregrep</b> is
-an 8-bit program. None of these are built if you select only the 16-bit or
-32-bit libraries.
-</P>
-<br><a name="SEC4" href="#TOC1">BUILDING SHARED AND STATIC LIBRARIES</a><br>
-<P>
-The Autotools PCRE building process uses <b>libtool</b> to build both shared and
-static libraries by default. You can suppress one of these by adding one of
-<pre>
-  --disable-shared
-  --disable-static
-</pre>
-to the <b>configure</b> command, as required.
-</P>
-<br><a name="SEC5" href="#TOC1">C++ SUPPORT</a><br>
-<P>
-By default, if the 8-bit library is being built, the <b>configure</b> script
-will search for a C++ compiler and C++ header files. If it finds them, it
-automatically builds the C++ wrapper library (which supports only 8-bit
-strings). You can disable this by adding
-<pre>
-  --disable-cpp
-</pre>
-to the <b>configure</b> command.
-</P>
-<br><a name="SEC6" href="#TOC1">UTF-8, UTF-16 AND UTF-32 SUPPORT</a><br>
-<P>
-To build PCRE with support for UTF Unicode character strings, add
-<pre>
-  --enable-utf
-</pre>
-to the <b>configure</b> command. This setting applies to all three libraries,
-adding support for UTF-8 to the 8-bit library, support for UTF-16 to the 16-bit
-library, and support for UTF-32 to the to the 32-bit library. There are no
-separate options for enabling UTF-8, UTF-16 and UTF-32 independently because
-that would allow ridiculous settings such as requesting UTF-16 support while
-building only the 8-bit library. It is not possible to build one library with
-UTF support and another without in the same configuration. (For backwards
-compatibility, --enable-utf8 is a synonym of --enable-utf.)
-</P>
-<P>
-Of itself, this setting does not make PCRE treat strings as UTF-8, UTF-16 or
-UTF-32. As well as compiling PCRE with this option, you also have have to set
-the PCRE_UTF8, PCRE_UTF16 or PCRE_UTF32 option (as appropriate) when you call
-one of the pattern compiling functions.
-</P>
-<P>
-If you set --enable-utf when compiling in an EBCDIC environment, PCRE expects
-its input to be either ASCII or UTF-8 (depending on the run-time option). It is
-not possible to support both EBCDIC and UTF-8 codes in the same version of the
-library. Consequently, --enable-utf and --enable-ebcdic are mutually
-exclusive.
-</P>
-<br><a name="SEC7" href="#TOC1">UNICODE CHARACTER PROPERTY SUPPORT</a><br>
-<P>
-UTF support allows the libraries to process character codepoints up to 0x10ffff
-in the strings that they handle. On its own, however, it does not provide any
-facilities for accessing the properties of such characters. If you want to be
-able to use the pattern escapes \P, \p, and \X, which refer to Unicode
-character properties, you must add
-<pre>
-  --enable-unicode-properties
-</pre>
-to the <b>configure</b> command. This implies UTF support, even if you have
-not explicitly requested it.
-</P>
-<P>
-Including Unicode property support adds around 30K of tables to the PCRE
-library. Only the general category properties such as <i>Lu</i> and <i>Nd</i> are
-supported. Details are given in the
-<a href="pcrepattern.html"><b>pcrepattern</b></a>
-documentation.
-</P>
-<br><a name="SEC8" href="#TOC1">JUST-IN-TIME COMPILER SUPPORT</a><br>
-<P>
-Just-in-time compiler support is included in the build by specifying
-<pre>
-  --enable-jit
-</pre>
-This support is available only for certain hardware architectures. If this
-option is set for an unsupported architecture, a compile time error occurs.
-See the
-<a href="pcrejit.html"><b>pcrejit</b></a>
-documentation for a discussion of JIT usage. When JIT support is enabled,
-pcregrep automatically makes use of it, unless you add
-<pre>
-  --disable-pcregrep-jit
-</pre>
-to the "configure" command.
-</P>
-<br><a name="SEC9" href="#TOC1">CODE VALUE OF NEWLINE</a><br>
-<P>
-By default, PCRE interprets the linefeed (LF) character as indicating the end
-of a line. This is the normal newline character on Unix-like systems. You can
-compile PCRE to use carriage return (CR) instead, by adding
-<pre>
-  --enable-newline-is-cr
-</pre>
-to the <b>configure</b> command. There is also a --enable-newline-is-lf option,
-which explicitly specifies linefeed as the newline character.
-<br>
-<br>
-Alternatively, you can specify that line endings are to be indicated by the two
-character sequence CRLF. If you want this, add
-<pre>
-  --enable-newline-is-crlf
-</pre>
-to the <b>configure</b> command. There is a fourth option, specified by
-<pre>
-  --enable-newline-is-anycrlf
-</pre>
-which causes PCRE to recognize any of the three sequences CR, LF, or CRLF as
-indicating a line ending. Finally, a fifth option, specified by
-<pre>
-  --enable-newline-is-any
-</pre>
-causes PCRE to recognize any Unicode newline sequence.
-</P>
-<P>
-Whatever line ending convention is selected when PCRE is built can be
-overridden when the library functions are called. At build time it is
-conventional to use the standard for your operating system.
-</P>
-<br><a name="SEC10" href="#TOC1">WHAT \R MATCHES</a><br>
-<P>
-By default, the sequence \R in a pattern matches any Unicode newline sequence,
-whatever has been selected as the line ending sequence. If you specify
-<pre>
-  --enable-bsr-anycrlf
-</pre>
-the default is changed so that \R matches only CR, LF, or CRLF. Whatever is
-selected when PCRE is built can be overridden when the library functions are
-called.
-</P>
-<br><a name="SEC11" href="#TOC1">POSIX MALLOC USAGE</a><br>
-<P>
-When the 8-bit library is called through the POSIX interface (see the
-<a href="pcreposix.html"><b>pcreposix</b></a>
-documentation), additional working storage is required for holding the pointers
-to capturing substrings, because PCRE requires three integers per substring,
-whereas the POSIX interface provides only two. If the number of expected
-substrings is small, the wrapper function uses space on the stack, because this
-is faster than using <b>malloc()</b> for each call. The default threshold above
-which the stack is no longer used is 10; it can be changed by adding a setting
-such as
-<pre>
-  --with-posix-malloc-threshold=20
-</pre>
-to the <b>configure</b> command.
-</P>
-<br><a name="SEC12" href="#TOC1">HANDLING VERY LARGE PATTERNS</a><br>
-<P>
-Within a compiled pattern, offset values are used to point from one part to
-another (for example, from an opening parenthesis to an alternation
-metacharacter). By default, in the 8-bit and 16-bit libraries, two-byte values
-are used for these offsets, leading to a maximum size for a compiled pattern of
-around 64K. This is sufficient to handle all but the most gigantic patterns.
-Nevertheless, some people do want to process truly enormous patterns, so it is
-possible to compile PCRE to use three-byte or four-byte offsets by adding a
-setting such as
-<pre>
-  --with-link-size=3
-</pre>
-to the <b>configure</b> command. The value given must be 2, 3, or 4. For the
-16-bit library, a value of 3 is rounded up to 4. In these libraries, using
-longer offsets slows down the operation of PCRE because it has to load
-additional data when handling them. For the 32-bit library the value is always
-4 and cannot be overridden; the value of --with-link-size is ignored.
-</P>
-<br><a name="SEC13" href="#TOC1">AVOIDING EXCESSIVE STACK USAGE</a><br>
-<P>
-When matching with the <b>pcre_exec()</b> function, PCRE implements backtracking
-by making recursive calls to an internal function called <b>match()</b>. In
-environments where the size of the stack is limited, this can severely limit
-PCRE's operation. (The Unix environment does not usually suffer from this
-problem, but it may sometimes be necessary to increase the maximum stack size.
-There is a discussion in the
-<a href="pcrestack.html"><b>pcrestack</b></a>
-documentation.) An alternative approach to recursion that uses memory from the
-heap to remember data, instead of using recursive function calls, has been
-implemented to work round the problem of limited stack size. If you want to
-build a version of PCRE that works this way, add
-<pre>
-  --disable-stack-for-recursion
-</pre>
-to the <b>configure</b> command. With this configuration, PCRE will use the
-<b>pcre_stack_malloc</b> and <b>pcre_stack_free</b> variables to call memory
-management functions. By default these point to <b>malloc()</b> and
-<b>free()</b>, but you can replace the pointers so that your own functions are
-used instead.
-</P>
-<P>
-Separate functions are provided rather than using <b>pcre_malloc</b> and
-<b>pcre_free</b> because the usage is very predictable: the block sizes
-requested are always the same, and the blocks are always freed in reverse
-order. A calling program might be able to implement optimized functions that
-perform better than <b>malloc()</b> and <b>free()</b>. PCRE runs noticeably more
-slowly when built in this way. This option affects only the <b>pcre_exec()</b>
-function; it is not relevant for <b>pcre_dfa_exec()</b>.
-</P>
-<br><a name="SEC14" href="#TOC1">LIMITING PCRE RESOURCE USAGE</a><br>
-<P>
-Internally, PCRE has a function called <b>match()</b>, which it calls repeatedly
-(sometimes recursively) when matching a pattern with the <b>pcre_exec()</b>
-function. By controlling the maximum number of times this function may be
-called during a single matching operation, a limit can be placed on the
-resources used by a single call to <b>pcre_exec()</b>. The limit can be changed
-at run time, as described in the
-<a href="pcreapi.html"><b>pcreapi</b></a>
-documentation. The default is 10 million, but this can be changed by adding a
-setting such as
-<pre>
-  --with-match-limit=500000
-</pre>
-to the <b>configure</b> command. This setting has no effect on the
-<b>pcre_dfa_exec()</b> matching function.
-</P>
-<P>
-In some environments it is desirable to limit the depth of recursive calls of
-<b>match()</b> more strictly than the total number of calls, in order to
-restrict the maximum amount of stack (or heap, if --disable-stack-for-recursion
-is specified) that is used. A second limit controls this; it defaults to the
-value that is set for --with-match-limit, which imposes no additional
-constraints. However, you can set a lower limit by adding, for example,
-<pre>
-  --with-match-limit-recursion=10000
-</pre>
-to the <b>configure</b> command. This value can also be overridden at run time.
-</P>
-<br><a name="SEC15" href="#TOC1">CREATING CHARACTER TABLES AT BUILD TIME</a><br>
-<P>
-PCRE uses fixed tables for processing characters whose code values are less
-than 256. By default, PCRE is built with a set of tables that are distributed
-in the file <i>pcre_chartables.c.dist</i>. These tables are for ASCII codes
-only. If you add
-<pre>
-  --enable-rebuild-chartables
-</pre>
-to the <b>configure</b> command, the distributed tables are no longer used.
-Instead, a program called <b>dftables</b> is compiled and run. This outputs the
-source for new set of tables, created in the default locale of your C run-time
-system. (This method of replacing the tables does not work if you are cross
-compiling, because <b>dftables</b> is run on the local host. If you need to
-create alternative tables when cross compiling, you will have to do so "by
-hand".)
-</P>
-<br><a name="SEC16" href="#TOC1">USING EBCDIC CODE</a><br>
-<P>
-PCRE assumes by default that it will run in an environment where the character
-code is ASCII (or Unicode, which is a superset of ASCII). This is the case for
-most computer operating systems. PCRE can, however, be compiled to run in an
-EBCDIC environment by adding
-<pre>
-  --enable-ebcdic
-</pre>
-to the <b>configure</b> command. This setting implies
---enable-rebuild-chartables. You should only use it if you know that you are in
-an EBCDIC environment (for example, an IBM mainframe operating system). The
---enable-ebcdic option is incompatible with --enable-utf.
-</P>
-<P>
-The EBCDIC character that corresponds to an ASCII LF is assumed to have the
-value 0x15 by default. However, in some EBCDIC environments, 0x25 is used. In
-such an environment you should use
-<pre>
-  --enable-ebcdic-nl25
-</pre>
-as well as, or instead of, --enable-ebcdic. The EBCDIC character for CR has the
-same value as in ASCII, namely, 0x0d. Whichever of 0x15 and 0x25 is <i>not</i>
-chosen as LF is made to correspond to the Unicode NEL character (which, in
-Unicode, is 0x85).
-</P>
-<P>
-The options that select newline behaviour, such as --enable-newline-is-cr,
-and equivalent run-time options, refer to these character values in an EBCDIC
-environment.
-</P>
-<br><a name="SEC17" href="#TOC1">PCREGREP OPTIONS FOR COMPRESSED FILE SUPPORT</a><br>
-<P>
-By default, <b>pcregrep</b> reads all files as plain text. You can build it so
-that it recognizes files whose names end in <b>.gz</b> or <b>.bz2</b>, and reads
-them with <b>libz</b> or <b>libbz2</b>, respectively, by adding one or both of
-<pre>
-  --enable-pcregrep-libz
-  --enable-pcregrep-libbz2
-</pre>
-to the <b>configure</b> command. These options naturally require that the
-relevant libraries are installed on your system. Configuration will fail if
-they are not.
-</P>
-<br><a name="SEC18" href="#TOC1">PCREGREP BUFFER SIZE</a><br>
-<P>
-<b>pcregrep</b> uses an internal buffer to hold a "window" on the file it is
-scanning, in order to be able to output "before" and "after" lines when it
-finds a match. The size of the buffer is controlled by a parameter whose
-default value is 20K. The buffer itself is three times this size, but because
-of the way it is used for holding "before" lines, the longest line that is
-guaranteed to be processable is the parameter size. You can change the default
-parameter value by adding, for example,
-<pre>
-  --with-pcregrep-bufsize=50K
-</pre>
-to the <b>configure</b> command. The caller of \fPpcregrep\fP can, however,
-override this value by specifying a run-time option.
-</P>
-<br><a name="SEC19" href="#TOC1">PCRETEST OPTION FOR LIBREADLINE SUPPORT</a><br>
-<P>
-If you add
-<pre>
-  --enable-pcretest-libreadline
-</pre>
-to the <b>configure</b> command, <b>pcretest</b> is linked with the
-<b>libreadline</b> library, and when its input is from a terminal, it reads it
-using the <b>readline()</b> function. This provides line-editing and history
-facilities. Note that <b>libreadline</b> is GPL-licensed, so if you distribute a
-binary of <b>pcretest</b> linked in this way, there may be licensing issues.
-</P>
-<P>
-Setting this option causes the <b>-lreadline</b> option to be added to the
-<b>pcretest</b> build. In many operating environments with a sytem-installed
-<b>libreadline</b> this is sufficient. However, in some environments (e.g.
-if an unmodified distribution version of readline is in use), some extra
-configuration may be necessary. The INSTALL file for <b>libreadline</b> says
-this:
-<pre>
-  "Readline uses the termcap functions, but does not link with the
-  termcap or curses library itself, allowing applications which link
-  with readline the to choose an appropriate library."
-</pre>
-If your environment has not been set up so that an appropriate library is
-automatically included, you may need to add something like
-<pre>
-  LIBS="-ncurses"
-</pre>
-immediately before the <b>configure</b> command.
-</P>
-<br><a name="SEC20" href="#TOC1">DEBUGGING WITH VALGRIND SUPPORT</a><br>
-<P>
-By adding the
-<pre>
-  --enable-valgrind
-</pre>
-option to to the <b>configure</b> command, PCRE will use valgrind annotations
-to mark certain memory regions as unaddressable. This allows it to detect
-invalid memory accesses, and is mostly useful for debugging PCRE itself.
-</P>
-<br><a name="SEC21" href="#TOC1">CODE COVERAGE REPORTING</a><br>
-<P>
-If your C compiler is gcc, you can build a version of PCRE that can generate a
-code coverage report for its test suite. To enable this, you must install
-<b>lcov</b> version 1.6 or above. Then specify
-<pre>
-  --enable-coverage
-</pre>
-to the <b>configure</b> command and build PCRE in the usual way.
-</P>
-<P>
-Note that using <b>ccache</b> (a caching C compiler) is incompatible with code
-coverage reporting. If you have configured <b>ccache</b> to run automatically
-on your system, you must set the environment variable
-<pre>
-  CCACHE_DISABLE=1
-</pre>
-before running <b>make</b> to build PCRE, so that <b>ccache</b> is not used.
-</P>
-<P>
-When --enable-coverage is used, the following addition targets are added to the
-<i>Makefile</i>:
-<pre>
-  make coverage
-</pre>
-This creates a fresh coverage report for the PCRE test suite. It is equivalent
-to running "make coverage-reset", "make coverage-baseline", "make check", and
-then "make coverage-report".
-<pre>
-  make coverage-reset
-</pre>
-This zeroes the coverage counters, but does nothing else.
-<pre>
-  make coverage-baseline
-</pre>
-This captures baseline coverage information.
-<pre>
-  make coverage-report
-</pre>
-This creates the coverage report.
-<pre>
-  make coverage-clean-report
-</pre>
-This removes the generated coverage report without cleaning the coverage data
-itself.
-<pre>
-  make coverage-clean-data
-</pre>
-This removes the captured coverage data without removing the coverage files
-created at compile time (*.gcno).
-<pre>
-  make coverage-clean
-</pre>
-This cleans all coverage data including the generated coverage report. For more
-information about code coverage, see the <b>gcov</b> and <b>lcov</b>
-documentation.
-</P>
-<br><a name="SEC22" href="#TOC1">SEE ALSO</a><br>
-<P>
-<b>pcreapi</b>(3), <b>pcre16</b>, <b>pcre32</b>, <b>pcre_config</b>(3).
-</P>
-<br><a name="SEC23" href="#TOC1">AUTHOR</a><br>
-<P>
-Philip Hazel
-<br>
-University Computing Service
-<br>
-Cambridge CB2 3QH, England.
-<br>
-</P>
-<br><a name="SEC24" href="#TOC1">REVISION</a><br>
-<P>
-Last updated: 12 May 2013
-<br>
-Copyright &copy; 1997-2013 University of Cambridge.
-<br>
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
diff --git a/dist/doc/html/pcrecallout.html b/dist/doc/html/pcrecallout.html
deleted file mode 100644
index 53a937f..0000000
--- a/dist/doc/html/pcrecallout.html
+++ /dev/null
@@ -1,286 +0,0 @@
-<html>
-<head>
-<title>pcrecallout specification</title>
-</head>
-<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
-<h1>pcrecallout man page</h1>
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
-<p>
-This page is part of the PCRE HTML documentation. It was generated automatically
-from the original man page. If there is any nonsense in it, please consult the
-man page, in case the conversion went wrong.
-<br>
-<ul>
-<li><a name="TOC1" href="#SEC1">SYNOPSIS</a>
-<li><a name="TOC2" href="#SEC2">DESCRIPTION</a>
-<li><a name="TOC3" href="#SEC3">MISSING CALLOUTS</a>
-<li><a name="TOC4" href="#SEC4">THE CALLOUT INTERFACE</a>
-<li><a name="TOC5" href="#SEC5">RETURN VALUES</a>
-<li><a name="TOC6" href="#SEC6">AUTHOR</a>
-<li><a name="TOC7" href="#SEC7">REVISION</a>
-</ul>
-<br><a name="SEC1" href="#TOC1">SYNOPSIS</a><br>
-<P>
-<b>#include &#60;pcre.h&#62;</b>
-</P>
-<P>
-<b>int (*pcre_callout)(pcre_callout_block *);</b>
-</P>
-<P>
-<b>int (*pcre16_callout)(pcre16_callout_block *);</b>
-</P>
-<P>
-<b>int (*pcre32_callout)(pcre32_callout_block *);</b>
-</P>
-<br><a name="SEC2" href="#TOC1">DESCRIPTION</a><br>
-<P>
-PCRE provides a feature called "callout", which is a means of temporarily
-passing control to the caller of PCRE in the middle of pattern matching. The
-caller of PCRE provides an external function by putting its entry point in the
-global variable <i>pcre_callout</i> (<i>pcre16_callout</i> for the 16-bit
-library, <i>pcre32_callout</i> for the 32-bit library). By default, this
-variable contains NULL, which disables all calling out.
-</P>
-<P>
-Within a regular expression, (?C) indicates the points at which the external
-function is to be called. Different callout points can be identified by putting
-a number less than 256 after the letter C. The default value is zero.
-For example, this pattern has two callout points:
-<pre>
-  (?C1)abc(?C2)def
-</pre>
-If the PCRE_AUTO_CALLOUT option bit is set when a pattern is compiled, PCRE
-automatically inserts callouts, all with number 255, before each item in the
-pattern. For example, if PCRE_AUTO_CALLOUT is used with the pattern
-<pre>
-  A(\d{2}|--)
-</pre>
-it is processed as if it were
-<br>
-<br>
-(?C255)A(?C255)((?C255)\d{2}(?C255)|(?C255)-(?C255)-(?C255))(?C255)
-<br>
-<br>
-Notice that there is a callout before and after each parenthesis and
-alternation bar. If the pattern contains a conditional group whose condition is
-an assertion, an automatic callout is inserted immediately before the
-condition. Such a callout may also be inserted explicitly, for example:
-<pre>
-  (?(?C9)(?=a)ab|de)
-</pre>
-This applies only to assertion conditions (because they are themselves
-independent groups).
-</P>
-<P>
-Automatic callouts can be used for tracking the progress of pattern matching.
-The
-<a href="pcretest.html"><b>pcretest</b></a>
-program has a pattern qualifier (/C) that sets automatic callouts; when it is
-used, the output indicates how the pattern is being matched. This is useful
-information when you are trying to optimize the performance of a particular
-pattern.
-</P>
-<br><a name="SEC3" href="#TOC1">MISSING CALLOUTS</a><br>
-<P>
-You should be aware that, because of optimizations in the way PCRE compiles and
-matches patterns, callouts sometimes do not happen exactly as you might expect.
-</P>
-<P>
-At compile time, PCRE "auto-possessifies" repeated items when it knows that
-what follows cannot be part of the repeat. For example, a+[bc] is compiled as
-if it were a++[bc]. The <b>pcretest</b> output when this pattern is anchored and
-then applied with automatic callouts to the string "aaaa" is:
-<pre>
-  ---&#62;aaaa
-   +0 ^        ^
-   +1 ^        a+
-   +3 ^   ^    [bc]
-  No match
-</pre>
-This indicates that when matching [bc] fails, there is no backtracking into a+
-and therefore the callouts that would be taken for the backtracks do not occur.
-You can disable the auto-possessify feature by passing PCRE_NO_AUTO_POSSESS
-to <b>pcre_compile()</b>, or starting the pattern with (*NO_AUTO_POSSESS). If
-this is done in <b>pcretest</b> (using the /O qualifier), the output changes to
-this:
-<pre>
-  ---&#62;aaaa
-   +0 ^        ^
-   +1 ^        a+
-   +3 ^   ^    [bc]
-   +3 ^  ^     [bc]
-   +3 ^ ^      [bc]
-   +3 ^^       [bc]
-  No match
-</pre>
-This time, when matching [bc] fails, the matcher backtracks into a+ and tries
-again, repeatedly, until a+ itself fails.
-</P>
-<P>
-Other optimizations that provide fast "no match" results also affect callouts.
-For example, if the pattern is
-<pre>
-  ab(?C4)cd
-</pre>
-PCRE knows that any matching string must contain the letter "d". If the subject
-string is "abyz", the lack of "d" means that matching doesn't ever start, and
-the callout is never reached. However, with "abyd", though the result is still
-no match, the callout is obeyed.
-</P>
-<P>
-If the pattern is studied, PCRE knows the minimum length of a matching string,
-and will immediately give a "no match" return without actually running a match
-if the subject is not long enough, or, for unanchored patterns, if it has
-been scanned far enough.
-</P>
-<P>
-You can disable these optimizations by passing the PCRE_NO_START_OPTIMIZE
-option to the matching function, or by starting the pattern with
-(*NO_START_OPT). This slows down the matching process, but does ensure that
-callouts such as the example above are obeyed.
-</P>
-<br><a name="SEC4" href="#TOC1">THE CALLOUT INTERFACE</a><br>
-<P>
-During matching, when PCRE reaches a callout point, the external function
-defined by <i>pcre_callout</i> or <i>pcre[16|32]_callout</i> is called (if it is
-set). This applies to both normal and DFA matching. The only argument to the
-callout function is a pointer to a <b>pcre_callout</b> or
-<b>pcre[16|32]_callout</b> block. These structures contains the following
-fields:
-<pre>
-  int           <i>version</i>;
-  int           <i>callout_number</i>;
-  int          *<i>offset_vector</i>;
-  const char   *<i>subject</i>;           (8-bit version)
-  PCRE_SPTR16   <i>subject</i>;           (16-bit version)
-  PCRE_SPTR32   <i>subject</i>;           (32-bit version)
-  int           <i>subject_length</i>;
-  int           <i>start_match</i>;
-  int           <i>current_position</i>;
-  int           <i>capture_top</i>;
-  int           <i>capture_last</i>;
-  void         *<i>callout_data</i>;
-  int           <i>pattern_position</i>;
-  int           <i>next_item_length</i>;
-  const unsigned char *<i>mark</i>;       (8-bit version)
-  const PCRE_UCHAR16  *<i>mark</i>;       (16-bit version)
-  const PCRE_UCHAR32  *<i>mark</i>;       (32-bit version)
-</pre>
-The <i>version</i> field is an integer containing the version number of the
-block format. The initial version was 0; the current version is 2. The version
-number will change again in future if additional fields are added, but the
-intention is never to remove any of the existing fields.
-</P>
-<P>
-The <i>callout_number</i> field contains the number of the callout, as compiled
-into the pattern (that is, the number after ?C for manual callouts, and 255 for
-automatically generated callouts).
-</P>
-<P>
-The <i>offset_vector</i> field is a pointer to the vector of offsets that was
-passed by the caller to the matching function. When <b>pcre_exec()</b> or
-<b>pcre[16|32]_exec()</b> is used, the contents can be inspected, in order to
-extract substrings that have been matched so far, in the same way as for
-extracting substrings after a match has completed. For the DFA matching
-functions, this field is not useful.
-</P>
-<P>
-The <i>subject</i> and <i>subject_length</i> fields contain copies of the values
-that were passed to the matching function.
-</P>
-<P>
-The <i>start_match</i> field normally contains the offset within the subject at
-which the current match attempt started. However, if the escape sequence \K
-has been encountered, this value is changed to reflect the modified starting
-point. If the pattern is not anchored, the callout function may be called
-several times from the same point in the pattern for different starting points
-in the subject.
-</P>
-<P>
-The <i>current_position</i> field contains the offset within the subject of the
-current match pointer.
-</P>
-<P>
-When the <b>pcre_exec()</b> or <b>pcre[16|32]_exec()</b> is used, the
-<i>capture_top</i> field contains one more than the number of the highest
-numbered captured substring so far. If no substrings have been captured, the
-value of <i>capture_top</i> is one. This is always the case when the DFA
-functions are used, because they do not support captured substrings.
-</P>
-<P>
-The <i>capture_last</i> field contains the number of the most recently captured
-substring. However, when a recursion exits, the value reverts to what it was
-outside the recursion, as do the values of all captured substrings. If no
-substrings have been captured, the value of <i>capture_last</i> is -1. This is
-always the case for the DFA matching functions.
-</P>
-<P>
-The <i>callout_data</i> field contains a value that is passed to a matching
-function specifically so that it can be passed back in callouts. It is passed
-in the <i>callout_data</i> field of a <b>pcre_extra</b> or <b>pcre[16|32]_extra</b>
-data structure. If no such data was passed, the value of <i>callout_data</i> in
-a callout block is NULL. There is a description of the <b>pcre_extra</b>
-structure in the
-<a href="pcreapi.html"><b>pcreapi</b></a>
-documentation.
-</P>
-<P>
-The <i>pattern_position</i> field is present from version 1 of the callout
-structure. It contains the offset to the next item to be matched in the pattern
-string.
-</P>
-<P>
-The <i>next_item_length</i> field is present from version 1 of the callout
-structure. It contains the length of the next item to be matched in the pattern
-string. When the callout immediately precedes an alternation bar, a closing
-parenthesis, or the end of the pattern, the length is zero. When the callout
-precedes an opening parenthesis, the length is that of the entire subpattern.
-</P>
-<P>
-The <i>pattern_position</i> and <i>next_item_length</i> fields are intended to
-help in distinguishing between different automatic callouts, which all have the
-same callout number. However, they are set for all callouts.
-</P>
-<P>
-The <i>mark</i> field is present from version 2 of the callout structure. In
-callouts from <b>pcre_exec()</b> or <b>pcre[16|32]_exec()</b> it contains a
-pointer to the zero-terminated name of the most recently passed (*MARK),
-(*PRUNE), or (*THEN) item in the match, or NULL if no such items have been
-passed. Instances of (*PRUNE) or (*THEN) without a name do not obliterate a
-previous (*MARK). In callouts from the DFA matching functions this field always
-contains NULL.
-</P>
-<br><a name="SEC5" href="#TOC1">RETURN VALUES</a><br>
-<P>
-The external callout function returns an integer to PCRE. If the value is zero,
-matching proceeds as normal. If the value is greater than zero, matching fails
-at the current point, but the testing of other matching possibilities goes
-ahead, just as if a lookahead assertion had failed. If the value is less than
-zero, the match is abandoned, the matching function returns the negative value.
-</P>
-<P>
-Negative values should normally be chosen from the set of PCRE_ERROR_xxx
-values. In particular, PCRE_ERROR_NOMATCH forces a standard "no match" failure.
-The error number PCRE_ERROR_CALLOUT is reserved for use by callout functions;
-it will never be used by PCRE itself.
-</P>
-<br><a name="SEC6" href="#TOC1">AUTHOR</a><br>
-<P>
-Philip Hazel
-<br>
-University Computing Service
-<br>
-Cambridge CB2 3QH, England.
-<br>
-</P>
-<br><a name="SEC7" href="#TOC1">REVISION</a><br>
-<P>
-Last updated: 12 November 2013
-<br>
-Copyright &copy; 1997-2013 University of Cambridge.
-<br>
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
diff --git a/dist/doc/html/pcrecompat.html b/dist/doc/html/pcrecompat.html
deleted file mode 100644
index 3e62266..0000000
--- a/dist/doc/html/pcrecompat.html
+++ /dev/null
@@ -1,235 +0,0 @@
-<html>
-<head>
-<title>pcrecompat specification</title>
-</head>
-<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
-<h1>pcrecompat man page</h1>
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
-<p>
-This page is part of the PCRE HTML documentation. It was generated automatically
-from the original man page. If there is any nonsense in it, please consult the
-man page, in case the conversion went wrong.
-<br>
-<br><b>
-DIFFERENCES BETWEEN PCRE AND PERL
-</b><br>
-<P>
-This document describes the differences in the ways that PCRE and Perl handle
-regular expressions. The differences described here are with respect to Perl
-versions 5.10 and above.
-</P>
-<P>
-1. PCRE has only a subset of Perl's Unicode support. Details of what it does
-have are given in the
-<a href="pcreunicode.html"><b>pcreunicode</b></a>
-page.
-</P>
-<P>
-2. PCRE allows repeat quantifiers only on parenthesized assertions, but they do
-not mean what you might think. For example, (?!a){3} does not assert that the
-next three characters are not "a". It just asserts that the next character is
-not "a" three times (in principle: PCRE optimizes this to run the assertion
-just once). Perl allows repeat quantifiers on other assertions such as \b, but
-these do not seem to have any use.
-</P>
-<P>
-3. Capturing subpatterns that occur inside negative lookahead assertions are
-counted, but their entries in the offsets vector are never set. Perl sometimes
-(but not always) sets its numerical variables from inside negative assertions.
-</P>
-<P>
-4. Though binary zero characters are supported in the subject string, they are
-not allowed in a pattern string because it is passed as a normal C string,
-terminated by zero. The escape sequence \0 can be used in the pattern to
-represent a binary zero.
-</P>
-<P>
-5. The following Perl escape sequences are not supported: \l, \u, \L,
-\U, and \N when followed by a character name or Unicode value. (\N on its
-own, matching a non-newline character, is supported.) In fact these are
-implemented by Perl's general string-handling and are not part of its pattern
-matching engine. If any of these are encountered by PCRE, an error is
-generated by default. However, if the PCRE_JAVASCRIPT_COMPAT option is set,
-\U and \u are interpreted as JavaScript interprets them.
-</P>
-<P>
-6. The Perl escape sequences \p, \P, and \X are supported only if PCRE is
-built with Unicode character property support. The properties that can be
-tested with \p and \P are limited to the general category properties such as
-Lu and Nd, script names such as Greek or Han, and the derived properties Any
-and L&. PCRE does support the Cs (surrogate) property, which Perl does not; the
-Perl documentation says "Because Perl hides the need for the user to understand
-the internal representation of Unicode characters, there is no need to
-implement the somewhat messy concept of surrogates."
-</P>
-<P>
-7. PCRE does support the \Q...\E escape for quoting substrings. Characters in
-between are treated as literals. This is slightly different from Perl in that $
-and @ are also handled as literals inside the quotes. In Perl, they cause
-variable interpolation (but of course PCRE does not have variables). Note the
-following examples:
-<pre>
-    Pattern            PCRE matches      Perl matches
-
-    \Qabc$xyz\E        abc$xyz           abc followed by the contents of $xyz
-    \Qabc\$xyz\E       abc\$xyz          abc\$xyz
-    \Qabc\E\$\Qxyz\E   abc$xyz           abc$xyz
-</pre>
-The \Q...\E sequence is recognized both inside and outside character classes.
-</P>
-<P>
-8. Fairly obviously, PCRE does not support the (?{code}) and (??{code})
-constructions. However, there is support for recursive patterns. This is not
-available in Perl 5.8, but it is in Perl 5.10. Also, the PCRE "callout"
-feature allows an external function to be called during pattern matching. See
-the
-<a href="pcrecallout.html"><b>pcrecallout</b></a>
-documentation for details.
-</P>
-<P>
-9. Subpatterns that are called as subroutines (whether or not recursively) are
-always treated as atomic groups in PCRE. This is like Python, but unlike Perl.
-Captured values that are set outside a subroutine call can be reference from
-inside in PCRE, but not in Perl. There is a discussion that explains these
-differences in more detail in the
-<a href="pcrepattern.html#recursiondifference">section on recursion differences from Perl</a>
-in the
-<a href="pcrepattern.html"><b>pcrepattern</b></a>
-page.
-</P>
-<P>
-10. If any of the backtracking control verbs are used in a subpattern that is
-called as a subroutine (whether or not recursively), their effect is confined
-to that subpattern; it does not extend to the surrounding pattern. This is not
-always the case in Perl. In particular, if (*THEN) is present in a group that
-is called as a subroutine, its action is limited to that group, even if the
-group does not contain any | characters. Note that such subpatterns are
-processed as anchored at the point where they are tested.
-</P>
-<P>
-11. If a pattern contains more than one backtracking control verb, the first
-one that is backtracked onto acts. For example, in the pattern
-A(*COMMIT)B(*PRUNE)C a failure in B triggers (*COMMIT), but a failure in C
-triggers (*PRUNE). Perl's behaviour is more complex; in many cases it is the
-same as PCRE, but there are examples where it differs.
-</P>
-<P>
-12. Most backtracking verbs in assertions have their normal actions. They are
-not confined to the assertion.
-</P>
-<P>
-13. There are some differences that are concerned with the settings of captured
-strings when part of a pattern is repeated. For example, matching "aba" against
-the pattern /^(a(b)?)+$/ in Perl leaves $2 unset, but in PCRE it is set to "b".
-</P>
-<P>
-14. PCRE's handling of duplicate subpattern numbers and duplicate subpattern
-names is not as general as Perl's. This is a consequence of the fact the PCRE
-works internally just with numbers, using an external table to translate
-between numbers and names. In particular, a pattern such as (?|(?&#60;a&#62;A)|(?&#60;b)B),
-where the two capturing parentheses have the same number but different names,
-is not supported, and causes an error at compile time. If it were allowed, it
-would not be possible to distinguish which parentheses matched, because both
-names map to capturing subpattern number 1. To avoid this confusing situation,
-an error is given at compile time.
-</P>
-<P>
-15. Perl recognizes comments in some places that PCRE does not, for example,
-between the ( and ? at the start of a subpattern. If the /x modifier is set,
-Perl allows white space between ( and ? (though current Perls warn that this is
-deprecated) but PCRE never does, even if the PCRE_EXTENDED option is set.
-</P>
-<P>
-16. Perl, when in warning mode, gives warnings for character classes such as
-[A-\d] or [a-[:digit:]]. It then treats the hyphens as literals. PCRE has no
-warning features, so it gives an error in these cases because they are almost
-certainly user mistakes.
-</P>
-<P>
-17. In PCRE, the upper/lower case character properties Lu and Ll are not
-affected when case-independent matching is specified. For example, \p{Lu}
-always matches an upper case letter. I think Perl has changed in this respect;
-in the release at the time of writing (5.16), \p{Lu} and \p{Ll} match all
-letters, regardless of case, when case independence is specified.
-</P>
-<P>
-18. PCRE provides some extensions to the Perl regular expression facilities.
-Perl 5.10 includes new features that are not in earlier versions of Perl, some
-of which (such as named parentheses) have been in PCRE for some time. This list
-is with respect to Perl 5.10:
-<br>
-<br>
-(a) Although lookbehind assertions in PCRE must match fixed length strings,
-each alternative branch of a lookbehind assertion can match a different length
-of string. Perl requires them all to have the same length.
-<br>
-<br>
-(b) If PCRE_DOLLAR_ENDONLY is set and PCRE_MULTILINE is not set, the $
-meta-character matches only at the very end of the string.
-<br>
-<br>
-(c) If PCRE_EXTRA is set, a backslash followed by a letter with no special
-meaning is faulted. Otherwise, like Perl, the backslash is quietly ignored.
-(Perl can be made to issue a warning.)
-<br>
-<br>
-(d) If PCRE_UNGREEDY is set, the greediness of the repetition quantifiers is
-inverted, that is, by default they are not greedy, but if followed by a
-question mark they are.
-<br>
-<br>
-(e) PCRE_ANCHORED can be used at matching time to force a pattern to be tried
-only at the first matching position in the subject string.
-<br>
-<br>
-(f) The PCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY, PCRE_NOTEMPTY_ATSTART, and
-PCRE_NO_AUTO_CAPTURE options for <b>pcre_exec()</b> have no Perl equivalents.
-<br>
-<br>
-(g) The \R escape sequence can be restricted to match only CR, LF, or CRLF
-by the PCRE_BSR_ANYCRLF option.
-<br>
-<br>
-(h) The callout facility is PCRE-specific.
-<br>
-<br>
-(i) The partial matching facility is PCRE-specific.
-<br>
-<br>
-(j) Patterns compiled by PCRE can be saved and re-used at a later time, even on
-different hosts that have the other endianness. However, this does not apply to
-optimized data created by the just-in-time compiler.
-<br>
-<br>
-(k) The alternative matching functions (<b>pcre_dfa_exec()</b>,
-<b>pcre16_dfa_exec()</b> and <b>pcre32_dfa_exec()</b>,) match in a different way
-and are not Perl-compatible.
-<br>
-<br>
-(l) PCRE recognizes some special sequences such as (*CR) at the start of
-a pattern that set overall options that cannot be changed within the pattern.
-</P>
-<br><b>
-AUTHOR
-</b><br>
-<P>
-Philip Hazel
-<br>
-University Computing Service
-<br>
-Cambridge CB2 3QH, England.
-<br>
-</P>
-<br><b>
-REVISION
-</b><br>
-<P>
-Last updated: 10 November 2013
-<br>
-Copyright &copy; 1997-2013 University of Cambridge.
-<br>
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
diff --git a/dist/doc/html/pcrecpp.html b/dist/doc/html/pcrecpp.html
deleted file mode 100644
index b7eac3a..0000000
--- a/dist/doc/html/pcrecpp.html
+++ /dev/null
@@ -1,368 +0,0 @@
-<html>
-<head>
-<title>pcrecpp specification</title>
-</head>
-<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
-<h1>pcrecpp man page</h1>
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
-<p>
-This page is part of the PCRE HTML documentation. It was generated automatically
-from the original man page. If there is any nonsense in it, please consult the
-man page, in case the conversion went wrong.
-<br>
-<ul>
-<li><a name="TOC1" href="#SEC1">SYNOPSIS OF C++ WRAPPER</a>
-<li><a name="TOC2" href="#SEC2">DESCRIPTION</a>
-<li><a name="TOC3" href="#SEC3">MATCHING INTERFACE</a>
-<li><a name="TOC4" href="#SEC4">QUOTING METACHARACTERS</a>
-<li><a name="TOC5" href="#SEC5">PARTIAL MATCHES</a>
-<li><a name="TOC6" href="#SEC6">UTF-8 AND THE MATCHING INTERFACE</a>
-<li><a name="TOC7" href="#SEC7">PASSING MODIFIERS TO THE REGULAR EXPRESSION ENGINE</a>
-<li><a name="TOC8" href="#SEC8">SCANNING TEXT INCREMENTALLY</a>
-<li><a name="TOC9" href="#SEC9">PARSING HEX/OCTAL/C-RADIX NUMBERS</a>
-<li><a name="TOC10" href="#SEC10">REPLACING PARTS OF STRINGS</a>
-<li><a name="TOC11" href="#SEC11">AUTHOR</a>
-<li><a name="TOC12" href="#SEC12">REVISION</a>
-</ul>
-<br><a name="SEC1" href="#TOC1">SYNOPSIS OF C++ WRAPPER</a><br>
-<P>
-<b>#include &#60;pcrecpp.h&#62;</b>
-</P>
-<br><a name="SEC2" href="#TOC1">DESCRIPTION</a><br>
-<P>
-The C++ wrapper for PCRE was provided by Google Inc. Some additional
-functionality was added by Giuseppe Maxia. This brief man page was constructed
-from the notes in the <i>pcrecpp.h</i> file, which should be consulted for
-further details. Note that the C++ wrapper supports only the original 8-bit
-PCRE library. There is no 16-bit or 32-bit support at present.
-</P>
-<br><a name="SEC3" href="#TOC1">MATCHING INTERFACE</a><br>
-<P>
-The "FullMatch" operation checks that supplied text matches a supplied pattern
-exactly. If pointer arguments are supplied, it copies matched sub-strings that
-match sub-patterns into them.
-<pre>
-  Example: successful match
-     pcrecpp::RE re("h.*o");
-     re.FullMatch("hello");
-
-  Example: unsuccessful match (requires full match):
-     pcrecpp::RE re("e");
-     !re.FullMatch("hello");
-
-  Example: creating a temporary RE object:
-     pcrecpp::RE("h.*o").FullMatch("hello");
-</pre>
-You can pass in a "const char*" or a "string" for "text". The examples below
-tend to use a const char*. You can, as in the different examples above, store
-the RE object explicitly in a variable or use a temporary RE object. The
-examples below use one mode or the other arbitrarily. Either could correctly be
-used for any of these examples.
-</P>
-<P>
-You must supply extra pointer arguments to extract matched subpieces.
-<pre>
-  Example: extracts "ruby" into "s" and 1234 into "i"
-     int i;
-     string s;
-     pcrecpp::RE re("(\\w+):(\\d+)");
-     re.FullMatch("ruby:1234", &s, &i);
-
-  Example: does not try to extract any extra sub-patterns
-     re.FullMatch("ruby:1234", &s);
-
-  Example: does not try to extract into NULL
-     re.FullMatch("ruby:1234", NULL, &i);
-
-  Example: integer overflow causes failure
-     !re.FullMatch("ruby:1234567891234", NULL, &i);
-
-  Example: fails because there aren't enough sub-patterns:
-     !pcrecpp::RE("\\w+:\\d+").FullMatch("ruby:1234", &s);
-
-  Example: fails because string cannot be stored in integer
-     !pcrecpp::RE("(.*)").FullMatch("ruby", &i);
-</pre>
-The provided pointer arguments can be pointers to any scalar numeric
-type, or one of:
-<pre>
-   string        (matched piece is copied to string)
-   StringPiece   (StringPiece is mutated to point to matched piece)
-   T             (where "bool T::ParseFrom(const char*, int)" exists)
-   NULL          (the corresponding matched sub-pattern is not copied)
-</pre>
-The function returns true iff all of the following conditions are satisfied:
-<pre>
-  a. "text" matches "pattern" exactly;
-
-  b. The number of matched sub-patterns is &#62;= number of supplied
-     pointers;
-
-  c. The "i"th argument has a suitable type for holding the
-     string captured as the "i"th sub-pattern. If you pass in
-     void * NULL for the "i"th argument, or a non-void * NULL
-     of the correct type, or pass fewer arguments than the
-     number of sub-patterns, "i"th captured sub-pattern is
-     ignored.
-</pre>
-CAVEAT: An optional sub-pattern that does not exist in the matched
-string is assigned the empty string. Therefore, the following will
-return false (because the empty string is not a valid number):
-<pre>
-   int number;
-   pcrecpp::RE::FullMatch("abc", "[a-z]+(\\d+)?", &number);
-</pre>
-The matching interface supports at most 16 arguments per call.
-If you need more, consider using the more general interface
-<b>pcrecpp::RE::DoMatch</b>. See <b>pcrecpp.h</b> for the signature for
-<b>DoMatch</b>.
-</P>
-<P>
-NOTE: Do not use <b>no_arg</b>, which is used internally to mark the end of a
-list of optional arguments, as a placeholder for missing arguments, as this can
-lead to segfaults.
-</P>
-<br><a name="SEC4" href="#TOC1">QUOTING METACHARACTERS</a><br>
-<P>
-You can use the "QuoteMeta" operation to insert backslashes before all
-potentially meaningful characters in a string. The returned string, used as a
-regular expression, will exactly match the original string.
-<pre>
-  Example:
-     string quoted = RE::QuoteMeta(unquoted);
-</pre>
-Note that it's legal to escape a character even if it has no special meaning in
-a regular expression -- so this function does that. (This also makes it
-identical to the perl function of the same name; see "perldoc -f quotemeta".)
-For example, "1.5-2.0?" becomes "1\.5\-2\.0\?".
-</P>
-<br><a name="SEC5" href="#TOC1">PARTIAL MATCHES</a><br>
-<P>
-You can use the "PartialMatch" operation when you want the pattern
-to match any substring of the text.
-<pre>
-  Example: simple search for a string:
-     pcrecpp::RE("ell").PartialMatch("hello");
-
-  Example: find first number in a string:
-     int number;
-     pcrecpp::RE re("(\\d+)");
-     re.PartialMatch("x*100 + 20", &number);
-     assert(number == 100);
-</PRE>
-</P>
-<br><a name="SEC6" href="#TOC1">UTF-8 AND THE MATCHING INTERFACE</a><br>
-<P>
-By default, pattern and text are plain text, one byte per character. The UTF8
-flag, passed to the constructor, causes both pattern and string to be treated
-as UTF-8 text, still a byte stream but potentially multiple bytes per
-character. In practice, the text is likelier to be UTF-8 than the pattern, but
-the match returned may depend on the UTF8 flag, so always use it when matching
-UTF8 text. For example, "." will match one byte normally but with UTF8 set may
-match up to three bytes of a multi-byte character.
-<pre>
-  Example:
-     pcrecpp::RE_Options options;
-     options.set_utf8();
-     pcrecpp::RE re(utf8_pattern, options);
-     re.FullMatch(utf8_string);
-
-  Example: using the convenience function UTF8():
-     pcrecpp::RE re(utf8_pattern, pcrecpp::UTF8());
-     re.FullMatch(utf8_string);
-</pre>
-NOTE: The UTF8 flag is ignored if pcre was not configured with the
-<pre>
-      --enable-utf8 flag.
-</PRE>
-</P>
-<br><a name="SEC7" href="#TOC1">PASSING MODIFIERS TO THE REGULAR EXPRESSION ENGINE</a><br>
-<P>
-PCRE defines some modifiers to change the behavior of the regular expression
-engine. The C++ wrapper defines an auxiliary class, RE_Options, as a vehicle to
-pass such modifiers to a RE class. Currently, the following modifiers are
-supported:
-<pre>
-   modifier              description               Perl corresponding
-
-   PCRE_CASELESS         case insensitive match      /i
-   PCRE_MULTILINE        multiple lines match        /m
-   PCRE_DOTALL           dot matches newlines        /s
-   PCRE_DOLLAR_ENDONLY   $ matches only at end       N/A
-   PCRE_EXTRA            strict escape parsing       N/A
-   PCRE_EXTENDED         ignore white spaces         /x
-   PCRE_UTF8             handles UTF8 chars          built-in
-   PCRE_UNGREEDY         reverses * and *?           N/A
-   PCRE_NO_AUTO_CAPTURE  disables capturing parens   N/A (*)
-</pre>
-(*) Both Perl and PCRE allow non capturing parentheses by means of the
-"?:" modifier within the pattern itself. e.g. (?:ab|cd) does not
-capture, while (ab|cd) does.
-</P>
-<P>
-For a full account on how each modifier works, please check the
-PCRE API reference page.
-</P>
-<P>
-For each modifier, there are two member functions whose name is made
-out of the modifier in lowercase, without the "PCRE_" prefix. For
-instance, PCRE_CASELESS is handled by
-<pre>
-  bool caseless()
-</pre>
-which returns true if the modifier is set, and
-<pre>
-  RE_Options & set_caseless(bool)
-</pre>
-which sets or unsets the modifier. Moreover, PCRE_EXTRA_MATCH_LIMIT can be
-accessed through the <b>set_match_limit()</b> and <b>match_limit()</b> member
-functions. Setting <i>match_limit</i> to a non-zero value will limit the
-execution of pcre to keep it from doing bad things like blowing the stack or
-taking an eternity to return a result. A value of 5000 is good enough to stop
-stack blowup in a 2MB thread stack. Setting <i>match_limit</i> to zero disables
-match limiting. Alternatively, you can call <b>match_limit_recursion()</b>
-which uses PCRE_EXTRA_MATCH_LIMIT_RECURSION to limit how much PCRE
-recurses. <b>match_limit()</b> limits the number of matches PCRE does;
-<b>match_limit_recursion()</b> limits the depth of internal recursion, and
-therefore the amount of stack that is used.
-</P>
-<P>
-Normally, to pass one or more modifiers to a RE class, you declare
-a <i>RE_Options</i> object, set the appropriate options, and pass this
-object to a RE constructor. Example:
-<pre>
-   RE_Options opt;
-   opt.set_caseless(true);
-   if (RE("HELLO", opt).PartialMatch("hello world")) ...
-</pre>
-RE_options has two constructors. The default constructor takes no arguments and
-creates a set of flags that are off by default. The optional parameter
-<i>option_flags</i> is to facilitate transfer of legacy code from C programs.
-This lets you do
-<pre>
-   RE(pattern,
-     RE_Options(PCRE_CASELESS|PCRE_MULTILINE)).PartialMatch(str);
-</pre>
-However, new code is better off doing
-<pre>
-   RE(pattern,
-     RE_Options().set_caseless(true).set_multiline(true))
-       .PartialMatch(str);
-</pre>
-If you are going to pass one of the most used modifiers, there are some
-convenience functions that return a RE_Options class with the
-appropriate modifier already set: <b>CASELESS()</b>, <b>UTF8()</b>,
-<b>MULTILINE()</b>, <b>DOTALL</b>(), and <b>EXTENDED()</b>.
-</P>
-<P>
-If you need to set several options at once, and you don't want to go through
-the pains of declaring a RE_Options object and setting several options, there
-is a parallel method that give you such ability on the fly. You can concatenate
-several <b>set_xxxxx()</b> member functions, since each of them returns a
-reference to its class object. For example, to pass PCRE_CASELESS,
-PCRE_EXTENDED, and PCRE_MULTILINE to a RE with one statement, you may write:
-<pre>
-   RE(" ^ xyz \\s+ .* blah$",
-     RE_Options()
-       .set_caseless(true)
-       .set_extended(true)
-       .set_multiline(true)).PartialMatch(sometext);
-
-</PRE>
-</P>
-<br><a name="SEC8" href="#TOC1">SCANNING TEXT INCREMENTALLY</a><br>
-<P>
-The "Consume" operation may be useful if you want to repeatedly
-match regular expressions at the front of a string and skip over
-them as they match. This requires use of the "StringPiece" type,
-which represents a sub-range of a real string. Like RE, StringPiece
-is defined in the pcrecpp namespace.
-<pre>
-  Example: read lines of the form "var = value" from a string.
-     string contents = ...;                 // Fill string somehow
-     pcrecpp::StringPiece input(contents);  // Wrap in a StringPiece
-
-     string var;
-     int value;
-     pcrecpp::RE re("(\\w+) = (\\d+)\n");
-     while (re.Consume(&input, &var, &value)) {
-       ...;
-     }
-</pre>
-Each successful call to "Consume" will set "var/value", and also
-advance "input" so it points past the matched text.
-</P>
-<P>
-The "FindAndConsume" operation is similar to "Consume" but does not
-anchor your match at the beginning of the string. For example, you
-could extract all words from a string by repeatedly calling
-<pre>
-  pcrecpp::RE("(\\w+)").FindAndConsume(&input, &word)
-</PRE>
-</P>
-<br><a name="SEC9" href="#TOC1">PARSING HEX/OCTAL/C-RADIX NUMBERS</a><br>
-<P>
-By default, if you pass a pointer to a numeric value, the
-corresponding text is interpreted as a base-10 number. You can
-instead wrap the pointer with a call to one of the operators Hex(),
-Octal(), or CRadix() to interpret the text in another base. The
-CRadix operator interprets C-style "0" (base-8) and "0x" (base-16)
-prefixes, but defaults to base-10.
-<pre>
-  Example:
-    int a, b, c, d;
-    pcrecpp::RE re("(.*) (.*) (.*) (.*)");
-    re.FullMatch("100 40 0100 0x40",
-                 pcrecpp::Octal(&a), pcrecpp::Hex(&b),
-                 pcrecpp::CRadix(&c), pcrecpp::CRadix(&d));
-</pre>
-will leave 64 in a, b, c, and d.
-</P>
-<br><a name="SEC10" href="#TOC1">REPLACING PARTS OF STRINGS</a><br>
-<P>
-You can replace the first match of "pattern" in "str" with "rewrite".
-Within "rewrite", backslash-escaped digits (\1 to \9) can be
-used to insert text matching corresponding parenthesized group
-from the pattern. \0 in "rewrite" refers to the entire matching
-text. For example:
-<pre>
-  string s = "yabba dabba doo";
-  pcrecpp::RE("b+").Replace("d", &s);
-</pre>
-will leave "s" containing "yada dabba doo". The result is true if the pattern
-matches and a replacement occurs, false otherwise.
-</P>
-<P>
-<b>GlobalReplace</b> is like <b>Replace</b> except that it replaces all
-occurrences of the pattern in the string with the rewrite. Replacements are
-not subject to re-matching. For example:
-<pre>
-  string s = "yabba dabba doo";
-  pcrecpp::RE("b+").GlobalReplace("d", &s);
-</pre>
-will leave "s" containing "yada dada doo". It returns the number of
-replacements made.
-</P>
-<P>
-<b>Extract</b> is like <b>Replace</b>, except that if the pattern matches,
-"rewrite" is copied into "out" (an additional argument) with substitutions.
-The non-matching portions of "text" are ignored. Returns true iff a match
-occurred and the extraction happened successfully;  if no match occurs, the
-string is left unaffected.
-</P>
-<br><a name="SEC11" href="#TOC1">AUTHOR</a><br>
-<P>
-The C++ wrapper was contributed by Google Inc.
-<br>
-Copyright &copy; 2007 Google Inc.
-<br>
-</P>
-<br><a name="SEC12" href="#TOC1">REVISION</a><br>
-<P>
-Last updated: 08 January 2012
-<br>
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
diff --git a/dist/doc/html/pcredemo.html b/dist/doc/html/pcredemo.html
deleted file mode 100644
index 894a930..0000000
--- a/dist/doc/html/pcredemo.html
+++ /dev/null
@@ -1,426 +0,0 @@
-<html>
-<head>
-<title>pcredemo specification</title>
-</head>
-<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
-<h1>pcredemo man page</h1>
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
-<p>
-This page is part of the PCRE HTML documentation. It was generated automatically
-from the original man page. If there is any nonsense in it, please consult the
-man page, in case the conversion went wrong.
-<br>
-<ul>
-</ul>
-<PRE>
-/*************************************************
-*           PCRE DEMONSTRATION PROGRAM           *
-*************************************************/
-
-/* This is a demonstration program to illustrate the most straightforward ways
-of calling the PCRE regular expression library from a C program. See the
-pcresample documentation for a short discussion ("man pcresample" if you have
-the PCRE man pages installed).
-
-In Unix-like environments, if PCRE is installed in your standard system
-libraries, you should be able to compile this program using this command:
-
-gcc -Wall pcredemo.c -lpcre -o pcredemo
-
-If PCRE is not installed in a standard place, it is likely to be installed with
-support for the pkg-config mechanism. If you have pkg-config, you can compile
-this program using this command:
-
-gcc -Wall pcredemo.c `pkg-config --cflags --libs libpcre` -o pcredemo
-
-If you do not have pkg-config, you may have to use this:
-
-gcc -Wall pcredemo.c -I/usr/local/include -L/usr/local/lib \
-  -R/usr/local/lib -lpcre -o pcredemo
-
-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.
-
-Building under Windows:
-
-If you want to statically link this program against a non-dll .a file, you must
-define PCRE_STATIC before including pcre.h, otherwise the pcre_malloc() and
-pcre_free() exported functions will be declared __declspec(dllimport), with
-unwanted results. So in this environment, uncomment the following line. */
-
-/* #define PCRE_STATIC */
-
-#include &lt;stdio.h&gt;
-#include &lt;string.h&gt;
-#include &lt;pcre.h&gt;
-
-#define OVECCOUNT 30    /* should be a multiple of 3 */
-
-
-int main(int argc, char **argv)
-{
-pcre *re;
-const char *error;
-char *pattern;
-char *subject;
-unsigned char *name_table;
-unsigned int option_bits;
-int erroffset;
-int find_all;
-int crlf_is_newline;
-int namecount;
-int name_entry_size;
-int ovector[OVECCOUNT];
-int subject_length;
-int rc, i;
-int utf8;
-
-
-/**************************************************************************
-* 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 &lt; argc; i++)
-  {
-  if (strcmp(argv[i], "-g") == 0) find_all = 1;
-    else break;
-  }
-
-/* After the options, we require exactly two arguments, which are the pattern,
-and the subject string. */
-
-if (argc - i != 2)
-  {
-  printf("Two arguments required: a regex and a subject string\n");
-  return 1;
-  }
-
-pattern = argv[i];
-subject = argv[i+1];
-subject_length = (int)strlen(subject);
-
-
-/*************************************************************************
-* Now we are going to compile the regular expression pattern, and handle *
-* and errors that are detected.                                          *
-*************************************************************************/
-
-re = pcre_compile(
-  pattern,              /* the pattern */
-  0,                    /* default options */
-  &amp;error,               /* for error message */
-  &amp;erroffset,           /* for error offset */
-  NULL);                /* use default character tables */
-
-/* Compilation failed: print the error message and exit */
-
-if (re == NULL)
-  {
-  printf("PCRE compilation failed at offset %d: %s\n", erroffset, error);
-  return 1;
-  }
-
-
-/*************************************************************************
-* If the compilation succeeded, we call PCRE again, in order to do a     *
-* pattern match against the subject string. This does just ONE match. If *
-* further matching is needed, it will be done below.                     *
-*************************************************************************/
-
-rc = pcre_exec(
-  re,                   /* the compiled pattern */
-  NULL,                 /* no extra data - we didn't study the pattern */
-  subject,              /* the subject string */
-  subject_length,       /* the length of the subject */
-  0,                    /* start at offset 0 in the subject */
-  0,                    /* default options */
-  ovector,              /* output vector for substring information */
-  OVECCOUNT);           /* number of elements in the output vector */
-
-/* Matching failed: handle error cases */
-
-if (rc &lt; 0)
-  {
-  switch(rc)
-    {
-    case PCRE_ERROR_NOMATCH: printf("No match\n"); break;
-    /*
-    Handle other special cases if you like
-    */
-    default: printf("Matching error %d\n", rc); break;
-    }
-  pcre_free(re);     /* Release memory used for the compiled pattern */
-  return 1;
-  }
-
-/* Match succeded */
-
-printf("\nMatch succeeded at offset %d\n", ovector[0]);
-
-
-/*************************************************************************
-* We have found the first match within the subject string. If the output *
-* vector wasn't big enough, say so. Then output any substrings that were *
-* captured.                                                              *
-*************************************************************************/
-
-/* The output vector wasn't big enough */
-
-if (rc == 0)
-  {
-  rc = OVECCOUNT/3;
-  printf("ovector only has room for %d captured substrings\n", rc - 1);
-  }
-
-/* Show substrings stored in the output vector by number. Obviously, in a real
-application you might want to do things other than print them. */
-
-for (i = 0; i &lt; rc; i++)
-  {
-  char *substring_start = subject + ovector[2*i];
-  int substring_length = ovector[2*i+1] - ovector[2*i];
-  printf("%2d: %.*s\n", i, substring_length, substring_start);
-  }
-
-
-/**************************************************************************
-* That concludes the basic part of this demonstration program. We have    *
-* compiled a pattern, and performed a single match. The code that follows *
-* shows first 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. */
-
-(void)pcre_fullinfo(
-  re,                   /* the compiled pattern */
-  NULL,                 /* no extra data - we didn't study the pattern */
-  PCRE_INFO_NAMECOUNT,  /* number of named substrings */
-  &amp;namecount);          /* where to put the answer */
-
-if (namecount &lt;= 0) printf("No named substrings\n"); else
-  {
-  unsigned char *tabptr;
-  printf("Named substrings\n");
-
-  /* Before we can access the substrings, we must extract the table for
-  translating names to numbers, and the size of each entry in the table. */
-
-  (void)pcre_fullinfo(
-    re,                       /* the compiled pattern */
-    NULL,                     /* no extra data - we didn't study the pattern */
-    PCRE_INFO_NAMETABLE,      /* address of the table */
-    &amp;name_table);             /* where to put the answer */
-
-  (void)pcre_fullinfo(
-    re,                       /* the compiled pattern */
-    NULL,                     /* no extra data - we didn't study the pattern */
-    PCRE_INFO_NAMEENTRYSIZE,  /* size of each entry in the table */
-    &amp;name_entry_size);        /* where to put the answer */
-
-  /* Now we can scan the table and, for each entry, print the number, the name,
-  and the substring itself. */
-
-  tabptr = name_table;
-  for (i = 0; i &lt; namecount; i++)
-    {
-    int n = (tabptr[0] &lt;&lt; 8) | tabptr[1];
-    printf("(%d) %*s: %.*s\n", n, name_entry_size - 3, tabptr + 2,
-      ovector[2*n+1] - ovector[2*n], subject + ovector[2*n]);
-    tabptr += name_entry_size;
-    }
-  }
-
-
-/*************************************************************************
-* If the "-g" option was given on the command line, we want to continue  *
-* to search for additional matches in the subject string, in a similar   *
-* way to the /g option in Perl. This turns out to be trickier than you   *
-* might think because of the possibility of matching an empty string.    *
-* What happens is as follows:                                            *
-*                                                                        *
-* If the previous match was NOT for an empty string, we can just start   *
-* the next match at the end of the previous one.                         *
-*                                                                        *
-* If the previous match WAS for an empty string, we can't do that, as it *
-* would lead to an infinite loop. Instead, a special call of pcre_exec() *
-* is made with the PCRE_NOTEMPTY_ATSTART and PCRE_ANCHORED flags set.    *
-* The first of these tells PCRE that an empty string at the start of the *
-* subject is not a valid match; other possibilities must be tried. The   *
-* second flag restricts PCRE to one match attempt at the initial string  *
-* position. If this match succeeds, an alternative to the empty string   *
-* match has been found, and we can print it and proceed round the loop,  *
-* advancing by the length of whatever was found. If this match does not  *
-* succeed, we still stay in the loop, advancing by just one character.   *
-* In UTF-8 mode, which can be set by (*UTF8) in the pattern, this may be *
-* more than one byte.                                                    *
-*                                                                        *
-* However, there is a complication concerned with newlines. When the     *
-* newline convention is such that CRLF is a valid newline, we must       *
-* advance by two characters rather than one. The newline convention can  *
-* be set in the regex by (*CR), etc.; if not, we must find the default.  *
-*************************************************************************/
-
-if (!find_all)     /* Check for -g */
-  {
-  pcre_free(re);   /* Release the memory used for the compiled pattern */
-  return 0;        /* Finish unless -g was given */
-  }
-
-/* Before running the loop, check for UTF-8 and whether CRLF is a valid newline
-sequence. First, find the options with which the regex was compiled; extract
-the UTF-8 state, and mask off all but the newline options. */
-
-(void)pcre_fullinfo(re, NULL, PCRE_INFO_OPTIONS, &amp;option_bits);
-utf8 = option_bits &amp; PCRE_UTF8;
-option_bits &amp;= PCRE_NEWLINE_CR|PCRE_NEWLINE_LF|PCRE_NEWLINE_CRLF|
-               PCRE_NEWLINE_ANY|PCRE_NEWLINE_ANYCRLF;
-
-/* If no newline options were set, find the default newline convention from the
-build configuration. */
-
-if (option_bits == 0)
-  {
-  int d;
-  (void)pcre_config(PCRE_CONFIG_NEWLINE, &amp;d);
-  /* Note that these values are always the ASCII ones, even in
-  EBCDIC environments. CR = 13, NL = 10. */
-  option_bits = (d == 13)? PCRE_NEWLINE_CR :
-          (d == 10)? PCRE_NEWLINE_LF :
-          (d == (13&lt;&lt;8 | 10))? PCRE_NEWLINE_CRLF :
-          (d == -2)? PCRE_NEWLINE_ANYCRLF :
-          (d == -1)? PCRE_NEWLINE_ANY : 0;
-  }
-
-/* See if CRLF is a valid newline sequence. */
-
-crlf_is_newline =
-     option_bits == PCRE_NEWLINE_ANY ||
-     option_bits == PCRE_NEWLINE_CRLF ||
-     option_bits == PCRE_NEWLINE_ANYCRLF;
-
-/* Loop for second and subsequent matches */
-
-for (;;)
-  {
-  int options = 0;                 /* Normally no options */
-  int start_offset = ovector[1];   /* Start at end of previous match */
-
-  /* If the previous match was for an empty string, we are finished if we are
-  at the end of the subject. Otherwise, arrange to run another match at the
-  same point to see if a non-empty match can be found. */
-
-  if (ovector[0] == ovector[1])
-    {
-    if (ovector[0] == subject_length) break;
-    options = PCRE_NOTEMPTY_ATSTART | PCRE_ANCHORED;
-    }
-
-  /* Run the next matching operation */
-
-  rc = pcre_exec(
-    re,                   /* the compiled pattern */
-    NULL,                 /* no extra data - we didn't study the pattern */
-    subject,              /* the subject string */
-    subject_length,       /* the length of the subject */
-    start_offset,         /* starting offset in the subject */
-    options,              /* options */
-    ovector,              /* output vector for substring information */
-    OVECCOUNT);           /* number of elements in the output vector */
-
-  /* This time, a result of NOMATCH isn't an error. If the value in "options"
-  is zero, it just means we have found all possible matches, so the loop ends.
-  Otherwise, it means we have failed to find a non-empty-string match at a
-  point where there was a previous empty-string match. In this case, we do what
-  Perl does: advance the matching position by one character, and continue. We
-  do this by setting the "end of previous match" offset, because that is picked
-  up at the top of the loop as the point at which to start again.
-
-  There are two complications: (a) When CRLF is a valid newline sequence, and
-  the current position is just before it, advance by an extra byte. (b)
-  Otherwise we must ensure that we skip an entire UTF-8 character if we are in
-  UTF-8 mode. */
-
-  if (rc == PCRE_ERROR_NOMATCH)
-    {
-    if (options == 0) break;                    /* All matches found */
-    ovector[1] = start_offset + 1;              /* Advance one byte */
-    if (crlf_is_newline &amp;&amp;                      /* If CRLF is newline &amp; */
-        start_offset &lt; subject_length - 1 &amp;&amp;    /* we are at CRLF, */
-        subject[start_offset] == '\r' &amp;&amp;
-        subject[start_offset + 1] == '\n')
-      ovector[1] += 1;                          /* Advance by one more. */
-    else if (utf8)                              /* Otherwise, ensure we */
-      {                                         /* advance a whole UTF-8 */
-      while (ovector[1] &lt; subject_length)       /* character. */
-        {
-        if ((subject[ovector[1]] &amp; 0xc0) != 0x80) break;
-        ovector[1] += 1;
-        }
-      }
-    continue;    /* Go round the loop again */
-    }
-
-  /* Other matching errors are not recoverable. */
-
-  if (rc &lt; 0)
-    {
-    printf("Matching error %d\n", rc);
-    pcre_free(re);    /* Release memory used for the compiled pattern */
-    return 1;
-    }
-
-  /* Match succeded */
-
-  printf("\nMatch succeeded again at offset %d\n", ovector[0]);
-
-  /* The match succeeded, but the output vector wasn't big enough. */
-
-  if (rc == 0)
-    {
-    rc = OVECCOUNT/3;
-    printf("ovector only has room for %d captured substrings\n", rc - 1);
-    }
-
-  /* As before, show substrings stored in the output vector by number, and then
-  also any named substrings. */
-
-  for (i = 0; i &lt; rc; i++)
-    {
-    char *substring_start = subject + ovector[2*i];
-    int substring_length = ovector[2*i+1] - ovector[2*i];
-    printf("%2d: %.*s\n", i, substring_length, substring_start);
-    }
-
-  if (namecount &lt;= 0) printf("No named substrings\n"); else
-    {
-    unsigned char *tabptr = name_table;
-    printf("Named substrings\n");
-    for (i = 0; i &lt; namecount; i++)
-      {
-      int n = (tabptr[0] &lt;&lt; 8) | tabptr[1];
-      printf("(%d) %*s: %.*s\n", n, name_entry_size - 3, tabptr + 2,
-        ovector[2*n+1] - ovector[2*n], subject + ovector[2*n]);
-      tabptr += name_entry_size;
-      }
-    }
-  }      /* End of loop to find second and subsequent matches */
-
-printf("\n");
-pcre_free(re);       /* Release memory used for the compiled pattern */
-return 0;
-}
-
-/* End of pcredemo.c */
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
diff --git a/dist/doc/html/pcrejit.html b/dist/doc/html/pcrejit.html
deleted file mode 100644
index 210f1da..0000000
--- a/dist/doc/html/pcrejit.html
+++ /dev/null
@@ -1,452 +0,0 @@
-<html>
-<head>
-<title>pcrejit specification</title>
-</head>
-<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
-<h1>pcrejit man page</h1>
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
-<p>
-This page is part of the PCRE HTML documentation. It was generated automatically
-from the original man page. If there is any nonsense in it, please consult the
-man page, in case the conversion went wrong.
-<br>
-<ul>
-<li><a name="TOC1" href="#SEC1">PCRE JUST-IN-TIME COMPILER SUPPORT</a>
-<li><a name="TOC2" href="#SEC2">8-BIT, 16-BIT AND 32-BIT SUPPORT</a>
-<li><a name="TOC3" href="#SEC3">AVAILABILITY OF JIT SUPPORT</a>
-<li><a name="TOC4" href="#SEC4">SIMPLE USE OF JIT</a>
-<li><a name="TOC5" href="#SEC5">UNSUPPORTED OPTIONS AND PATTERN ITEMS</a>
-<li><a name="TOC6" href="#SEC6">RETURN VALUES FROM JIT EXECUTION</a>
-<li><a name="TOC7" href="#SEC7">SAVING AND RESTORING COMPILED PATTERNS</a>
-<li><a name="TOC8" href="#SEC8">CONTROLLING THE JIT STACK</a>
-<li><a name="TOC9" href="#SEC9">JIT STACK FAQ</a>
-<li><a name="TOC10" href="#SEC10">EXAMPLE CODE</a>
-<li><a name="TOC11" href="#SEC11">JIT FAST PATH API</a>
-<li><a name="TOC12" href="#SEC12">SEE ALSO</a>
-<li><a name="TOC13" href="#SEC13">AUTHOR</a>
-<li><a name="TOC14" href="#SEC14">REVISION</a>
-</ul>
-<br><a name="SEC1" href="#TOC1">PCRE JUST-IN-TIME COMPILER SUPPORT</a><br>
-<P>
-Just-in-time compiling is a heavyweight optimization that can greatly speed up
-pattern matching. However, it comes at the cost of extra processing before the
-match is performed. Therefore, it is of most benefit when the same pattern is
-going to be matched many times. This does not necessarily mean many calls of a
-matching function; if the pattern is not anchored, matching attempts may take
-place many times at various positions in the subject, even for a single call.
-Therefore, if the subject string is very long, it may still pay to use JIT for
-one-off matches.
-</P>
-<P>
-JIT support applies only to the traditional Perl-compatible matching function.
-It does not apply when the DFA matching function is being used. The code for
-this support was written by Zoltan Herczeg.
-</P>
-<br><a name="SEC2" href="#TOC1">8-BIT, 16-BIT AND 32-BIT SUPPORT</a><br>
-<P>
-JIT support is available for all of the 8-bit, 16-bit and 32-bit PCRE
-libraries. To keep this documentation simple, only the 8-bit interface is
-described in what follows. If you are using the 16-bit library, substitute the
-16-bit functions and 16-bit structures (for example, <i>pcre16_jit_stack</i>
-instead of <i>pcre_jit_stack</i>). If you are using the 32-bit library,
-substitute the 32-bit functions and 32-bit structures (for example,
-<i>pcre32_jit_stack</i> instead of <i>pcre_jit_stack</i>).
-</P>
-<br><a name="SEC3" href="#TOC1">AVAILABILITY OF JIT SUPPORT</a><br>
-<P>
-JIT support is an optional feature of PCRE. The "configure" option --enable-jit
-(or equivalent CMake option) must be set when PCRE is built if you want to use
-JIT. The support is limited to the following hardware platforms:
-<pre>
-  ARM v5, v7, and Thumb2
-  Intel x86 32-bit and 64-bit
-  MIPS 32-bit
-  Power PC 32-bit and 64-bit
-  SPARC 32-bit (experimental)
-</pre>
-If --enable-jit is set on an unsupported platform, compilation fails.
-</P>
-<P>
-A program that is linked with PCRE 8.20 or later can tell if JIT support is
-available by calling <b>pcre_config()</b> with the PCRE_CONFIG_JIT option. The
-result is 1 when JIT is available, and 0 otherwise. However, a simple program
-does not need to check this in order to use JIT. The normal API is implemented
-in a way that falls back to the interpretive code if JIT is not available. For
-programs that need the best possible performance, there is also a "fast path"
-API that is JIT-specific.
-</P>
-<P>
-If your program may sometimes be linked with versions of PCRE that are older
-than 8.20, but you want to use JIT when it is available, you can test
-the values of PCRE_MAJOR and PCRE_MINOR, or the existence of a JIT macro such
-as PCRE_CONFIG_JIT, for compile-time control of your code.
-</P>
-<br><a name="SEC4" href="#TOC1">SIMPLE USE OF JIT</a><br>
-<P>
-You have to do two things to make use of the JIT support in the simplest way:
-<pre>
-  (1) Call <b>pcre_study()</b> with the PCRE_STUDY_JIT_COMPILE option for
-      each compiled pattern, and pass the resulting <b>pcre_extra</b> block to
-      <b>pcre_exec()</b>.
-
-  (2) Use <b>pcre_free_study()</b> to free the <b>pcre_extra</b> block when it is
-      no longer needed, instead of just freeing it yourself. This ensures that
-      any JIT data is also freed.
-</pre>
-For a program that may be linked with pre-8.20 versions of PCRE, you can insert
-<pre>
-  #ifndef PCRE_STUDY_JIT_COMPILE
-  #define PCRE_STUDY_JIT_COMPILE 0
-  #endif
-</pre>
-so that no option is passed to <b>pcre_study()</b>, and then use something like
-this to free the study data:
-<pre>
-  #ifdef PCRE_CONFIG_JIT
-      pcre_free_study(study_ptr);
-  #else
-      pcre_free(study_ptr);
-  #endif
-</pre>
-PCRE_STUDY_JIT_COMPILE requests the JIT compiler to generate code for complete
-matches. If you want to run partial matches using the PCRE_PARTIAL_HARD or
-PCRE_PARTIAL_SOFT options of <b>pcre_exec()</b>, you should set one or both of
-the following options in addition to, or instead of, PCRE_STUDY_JIT_COMPILE
-when you call <b>pcre_study()</b>:
-<pre>
-  PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE
-  PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE
-</pre>
-The JIT compiler generates different optimized code for each of the three
-modes (normal, soft partial, hard partial). When <b>pcre_exec()</b> is called,
-the appropriate code is run if it is available. Otherwise, the pattern is
-matched using interpretive code.
-</P>
-<P>
-In some circumstances you may need to call additional functions. These are
-described in the section entitled
-<a href="#stackcontrol">"Controlling the JIT stack"</a>
-below.
-</P>
-<P>
-If JIT support is not available, PCRE_STUDY_JIT_COMPILE etc. are ignored, and
-no JIT data is created. Otherwise, the compiled pattern is passed to the JIT
-compiler, which turns it into machine code that executes much faster than the
-normal interpretive code. When <b>pcre_exec()</b> is passed a <b>pcre_extra</b>
-block containing a pointer to JIT code of the appropriate mode (normal or
-hard/soft partial), it obeys that code instead of running the interpreter. The
-result is identical, but the compiled JIT code runs much faster.
-</P>
-<P>
-There are some <b>pcre_exec()</b> options that are not supported for JIT
-execution. There are also some pattern items that JIT cannot handle. Details
-are given below. In both cases, execution automatically falls back to the
-interpretive code. If you want to know whether JIT was actually used for a
-particular match, you should arrange for a JIT callback function to be set up
-as described in the section entitled
-<a href="#stackcontrol">"Controlling the JIT stack"</a>
-below, even if you do not need to supply a non-default JIT stack. Such a
-callback function is called whenever JIT code is about to be obeyed. If the
-execution options are not right for JIT execution, the callback function is not
-obeyed.
-</P>
-<P>
-If the JIT compiler finds an unsupported item, no JIT data is generated. You
-can find out if JIT execution is available after studying a pattern by calling
-<b>pcre_fullinfo()</b> with the PCRE_INFO_JIT option. A result of 1 means that
-JIT compilation was successful. A result of 0 means that JIT support is not
-available, or the pattern was not studied with PCRE_STUDY_JIT_COMPILE etc., or
-the JIT compiler was not able to handle the pattern.
-</P>
-<P>
-Once a pattern has been studied, with or without JIT, it can be used as many
-times as you like for matching different subject strings.
-</P>
-<br><a name="SEC5" href="#TOC1">UNSUPPORTED OPTIONS AND PATTERN ITEMS</a><br>
-<P>
-The only <b>pcre_exec()</b> options that are supported for JIT execution are
-PCRE_NO_UTF8_CHECK, PCRE_NO_UTF16_CHECK, PCRE_NO_UTF32_CHECK, PCRE_NOTBOL,
-PCRE_NOTEOL, PCRE_NOTEMPTY, PCRE_NOTEMPTY_ATSTART, PCRE_PARTIAL_HARD, and
-PCRE_PARTIAL_SOFT.
-</P>
-<P>
-The only unsupported pattern items are \C (match a single data unit) when
-running in a UTF mode, and a callout immediately before an assertion condition
-in a conditional group.
-</P>
-<br><a name="SEC6" href="#TOC1">RETURN VALUES FROM JIT EXECUTION</a><br>
-<P>
-When a pattern is matched using JIT execution, the return values are the same
-as those given by the interpretive <b>pcre_exec()</b> code, with the addition of
-one new error code: PCRE_ERROR_JIT_STACKLIMIT. This means that the memory used
-for the JIT stack was insufficient. See
-<a href="#stackcontrol">"Controlling the JIT stack"</a>
-below for a discussion of JIT stack usage. For compatibility with the
-interpretive <b>pcre_exec()</b> code, no more than two-thirds of the
-<i>ovector</i> argument is used for passing back captured substrings.
-</P>
-<P>
-The error code PCRE_ERROR_MATCHLIMIT is returned by the JIT code if searching a
-very large pattern tree goes on for too long, as it is in the same circumstance
-when JIT is not used, but the details of exactly what is counted are not the
-same. The PCRE_ERROR_RECURSIONLIMIT error code is never returned by JIT
-execution.
-</P>
-<br><a name="SEC7" href="#TOC1">SAVING AND RESTORING COMPILED PATTERNS</a><br>
-<P>
-The code that is generated by the JIT compiler is architecture-specific, and is
-also position dependent. For those reasons it cannot be saved (in a file or
-database) and restored later like the bytecode and other data of a compiled
-pattern. Saving and restoring compiled patterns is not something many people
-do. More detail about this facility is given in the
-<a href="pcreprecompile.html"><b>pcreprecompile</b></a>
-documentation. It should be possible to run <b>pcre_study()</b> on a saved and
-restored pattern, and thereby recreate the JIT data, but because JIT
-compilation uses significant resources, it is probably not worth doing this;
-you might as well recompile the original pattern.
-<a name="stackcontrol"></a></P>
-<br><a name="SEC8" href="#TOC1">CONTROLLING THE JIT STACK</a><br>
-<P>
-When the compiled JIT code runs, it needs a block of memory to use as a stack.
-By default, it uses 32K on the machine stack. However, some large or
-complicated patterns need more than this. The error PCRE_ERROR_JIT_STACKLIMIT
-is given when there is not enough stack. Three functions are provided for
-managing blocks of memory for use as JIT stacks. There is further discussion
-about the use of JIT stacks in the section entitled
-<a href="#stackcontrol">"JIT stack FAQ"</a>
-below.
-</P>
-<P>
-The <b>pcre_jit_stack_alloc()</b> function creates a JIT stack. Its arguments
-are a starting size and a maximum size, and it returns a pointer to an opaque
-structure of type <b>pcre_jit_stack</b>, or NULL if there is an error. The
-<b>pcre_jit_stack_free()</b> function can be used to free a stack that is no
-longer needed. (For the technically minded: the address space is allocated by
-mmap or VirtualAlloc.)
-</P>
-<P>
-JIT uses far less memory for recursion than the interpretive code,
-and a maximum stack size of 512K to 1M should be more than enough for any
-pattern.
-</P>
-<P>
-The <b>pcre_assign_jit_stack()</b> function specifies which stack JIT code
-should use. Its arguments are as follows:
-<pre>
-  pcre_extra         *extra
-  pcre_jit_callback  callback
-  void               *data
-</pre>
-The <i>extra</i> argument must be the result of studying a pattern with
-PCRE_STUDY_JIT_COMPILE etc. There are three cases for the values of the other
-two options:
-<pre>
-  (1) If <i>callback</i> is NULL and <i>data</i> is NULL, an internal 32K block
-      on the machine stack is used.
-
-  (2) If <i>callback</i> is NULL and <i>data</i> is not NULL, <i>data</i> must be
-      a valid JIT stack, the result of calling <b>pcre_jit_stack_alloc()</b>.
-
-  (3) If <i>callback</i> is not NULL, it must point to a function that is
-      called with <i>data</i> as an argument at the start of matching, in
-      order to set up a JIT stack. If the return from the callback
-      function is NULL, the internal 32K stack is used; otherwise the
-      return value must be a valid JIT stack, the result of calling
-      <b>pcre_jit_stack_alloc()</b>.
-</pre>
-A callback function is obeyed whenever JIT code is about to be run; it is not
-obeyed when <b>pcre_exec()</b> is called with options that are incompatible for
-JIT execution. A callback function can therefore be used to determine whether a
-match operation was executed by JIT or by the interpreter.
-</P>
-<P>
-You may safely use the same JIT stack for more than one pattern (either by
-assigning directly or by callback), as long as the patterns are all matched
-sequentially in the same thread. In a multithread application, if you do not
-specify a JIT stack, or if you assign or pass back NULL from a callback, that
-is thread-safe, because each thread has its own machine stack. However, if you
-assign or pass back a non-NULL JIT stack, this must be a different stack for
-each thread so that the application is thread-safe.
-</P>
-<P>
-Strictly speaking, even more is allowed. You can assign the same non-NULL stack
-to any number of patterns as long as they are not used for matching by multiple
-threads at the same time. For example, you can assign the same stack to all
-compiled patterns, and use a global mutex in the callback to wait until the
-stack is available for use. However, this is an inefficient solution, and not
-recommended.
-</P>
-<P>
-This is a suggestion for how a multithreaded program that needs to set up
-non-default JIT stacks might operate:
-<pre>
-  During thread initalization
-    thread_local_var = pcre_jit_stack_alloc(...)
-
-  During thread exit
-    pcre_jit_stack_free(thread_local_var)
-
-  Use a one-line callback function
-    return thread_local_var
-</pre>
-All the functions described in this section do nothing if JIT is not available,
-and <b>pcre_assign_jit_stack()</b> does nothing unless the <b>extra</b> argument
-is non-NULL and points to a <b>pcre_extra</b> block that is the result of a
-successful study with PCRE_STUDY_JIT_COMPILE etc.
-<a name="stackfaq"></a></P>
-<br><a name="SEC9" href="#TOC1">JIT STACK FAQ</a><br>
-<P>
-(1) Why do we need JIT stacks?
-<br>
-<br>
-PCRE (and JIT) is a recursive, depth-first engine, so it needs a stack where
-the local data of the current node is pushed before checking its child nodes.
-Allocating real machine stack on some platforms is difficult. For example, the
-stack chain needs to be updated every time if we extend the stack on PowerPC.
-Although it is possible, its updating time overhead decreases performance. So
-we do the recursion in memory.
-</P>
-<P>
-(2) Why don't we simply allocate blocks of memory with <b>malloc()</b>?
-<br>
-<br>
-Modern operating systems have a nice feature: they can reserve an address space
-instead of allocating memory. We can safely allocate memory pages inside this
-address space, so the stack could grow without moving memory data (this is
-important because of pointers). Thus we can allocate 1M address space, and use
-only a single memory page (usually 4K) if that is enough. However, we can still
-grow up to 1M anytime if needed.
-</P>
-<P>
-(3) Who "owns" a JIT stack?
-<br>
-<br>
-The owner of the stack is the user program, not the JIT studied pattern or
-anything else. The user program must ensure that if a stack is used by
-<b>pcre_exec()</b>, (that is, it is assigned to the pattern currently running),
-that stack must not be used by any other threads (to avoid overwriting the same
-memory area). The best practice for multithreaded programs is to allocate a
-stack for each thread, and return this stack through the JIT callback function.
-</P>
-<P>
-(4) When should a JIT stack be freed?
-<br>
-<br>
-You can free a JIT stack at any time, as long as it will not be used by
-<b>pcre_exec()</b> again. When you assign the stack to a pattern, only a pointer
-is set. There is no reference counting or any other magic. You can free the
-patterns and stacks in any order, anytime. Just <i>do not</i> call
-<b>pcre_exec()</b> with a pattern pointing to an already freed stack, as that
-will cause SEGFAULT. (Also, do not free a stack currently used by
-<b>pcre_exec()</b> in another thread). You can also replace the stack for a
-pattern at any time. You can even free the previous stack before assigning a
-replacement.
-</P>
-<P>
-(5) Should I allocate/free a stack every time before/after calling
-<b>pcre_exec()</b>?
-<br>
-<br>
-No, because this is too costly in terms of resources. However, you could
-implement some clever idea which release the stack if it is not used in let's
-say two minutes. The JIT callback can help to achieve this without keeping a
-list of the currently JIT studied patterns.
-</P>
-<P>
-(6) OK, the stack is for long term memory allocation. But what happens if a
-pattern causes stack overflow with a stack of 1M? Is that 1M kept until the
-stack is freed?
-<br>
-<br>
-Especially on embedded sytems, it might be a good idea to release memory
-sometimes without freeing the stack. There is no API for this at the moment.
-Probably a function call which returns with the currently allocated memory for
-any stack and another which allows releasing memory (shrinking the stack) would
-be a good idea if someone needs this.
-</P>
-<P>
-(7) This is too much of a headache. Isn't there any better solution for JIT
-stack handling?
-<br>
-<br>
-No, thanks to Windows. If POSIX threads were used everywhere, we could throw
-out this complicated API.
-</P>
-<br><a name="SEC10" href="#TOC1">EXAMPLE CODE</a><br>
-<P>
-This is a single-threaded example that specifies a JIT stack without using a
-callback.
-<pre>
-  int rc;
-  int ovector[30];
-  pcre *re;
-  pcre_extra *extra;
-  pcre_jit_stack *jit_stack;
-
-  re = pcre_compile(pattern, 0, &error, &erroffset, NULL);
-  /* Check for errors */
-  extra = pcre_study(re, PCRE_STUDY_JIT_COMPILE, &error);
-  jit_stack = pcre_jit_stack_alloc(32*1024, 512*1024);
-  /* Check for error (NULL) */
-  pcre_assign_jit_stack(extra, NULL, jit_stack);
-  rc = pcre_exec(re, extra, subject, length, 0, 0, ovector, 30);
-  /* Check results */
-  pcre_free(re);
-  pcre_free_study(extra);
-  pcre_jit_stack_free(jit_stack);
-
-</PRE>
-</P>
-<br><a name="SEC11" href="#TOC1">JIT FAST PATH API</a><br>
-<P>
-Because the API described above falls back to interpreted execution when JIT is
-not available, it is convenient for programs that are written for general use
-in many environments. However, calling JIT via <b>pcre_exec()</b> does have a
-performance impact. Programs that are written for use where JIT is known to be
-available, and which need the best possible performance, can instead use a
-"fast path" API to call JIT execution directly instead of calling
-<b>pcre_exec()</b> (obviously only for patterns that have been successfully
-studied by JIT).
-</P>
-<P>
-The fast path function is called <b>pcre_jit_exec()</b>, and it takes exactly
-the same arguments as <b>pcre_exec()</b>, plus one additional argument that
-must point to a JIT stack. The JIT stack arrangements described above do not
-apply. The return values are the same as for <b>pcre_exec()</b>.
-</P>
-<P>
-When you call <b>pcre_exec()</b>, as well as testing for invalid options, a
-number of other sanity checks are performed on the arguments. For example, if
-the subject pointer is NULL, or its length is negative, an immediate error is
-given. Also, unless PCRE_NO_UTF[8|16|32] is set, a UTF subject string is tested
-for validity. In the interests of speed, these checks do not happen on the JIT
-fast path, and if invalid data is passed, the result is undefined.
-</P>
-<P>
-Bypassing the sanity checks and the <b>pcre_exec()</b> wrapping can give
-speedups of more than 10%.
-</P>
-<br><a name="SEC12" href="#TOC1">SEE ALSO</a><br>
-<P>
-<b>pcreapi</b>(3)
-</P>
-<br><a name="SEC13" href="#TOC1">AUTHOR</a><br>
-<P>
-Philip Hazel (FAQ by Zoltan Herczeg)
-<br>
-University Computing Service
-<br>
-Cambridge CB2 3QH, England.
-<br>
-</P>
-<br><a name="SEC14" href="#TOC1">REVISION</a><br>
-<P>
-Last updated: 17 March 2013
-<br>
-Copyright &copy; 1997-2013 University of Cambridge.
-<br>
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
diff --git a/dist/doc/html/pcrelimits.html b/dist/doc/html/pcrelimits.html
deleted file mode 100644
index ee5ebf0..0000000
--- a/dist/doc/html/pcrelimits.html
+++ /dev/null
@@ -1,90 +0,0 @@
-<html>
-<head>
-<title>pcrelimits specification</title>
-</head>
-<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
-<h1>pcrelimits man page</h1>
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
-<p>
-This page is part of the PCRE HTML documentation. It was generated automatically
-from the original man page. If there is any nonsense in it, please consult the
-man page, in case the conversion went wrong.
-<br>
-<br><b>
-SIZE AND OTHER LIMITATIONS
-</b><br>
-<P>
-There are some size limitations in PCRE but it is hoped that they will never in
-practice be relevant.
-</P>
-<P>
-The maximum length of a compiled pattern is approximately 64K data units (bytes
-for the 8-bit library, 16-bit units for the 16-bit library, and 32-bit units for
-the 32-bit library) if PCRE is compiled with the default internal linkage size,
-which is 2 bytes for the 8-bit and 16-bit libraries, and 4 bytes for the 32-bit
-library. If you want to process regular expressions that are truly enormous,
-you can compile PCRE with an internal linkage size of 3 or 4 (when building the
-16-bit or 32-bit library, 3 is rounded up to 4). See the <b>README</b> file in
-the source distribution and the
-<a href="pcrebuild.html"><b>pcrebuild</b></a>
-documentation for details. In these cases the limit is substantially larger.
-However, the speed of execution is slower.
-</P>
-<P>
-All values in repeating quantifiers must be less than 65536.
-</P>
-<P>
-There is no limit to the number of parenthesized subpatterns, but there can be
-no more than 65535 capturing subpatterns. There is, however, a limit to the
-depth of nesting of parenthesized subpatterns of all kinds. This is imposed in
-order to limit the amount of system stack used at compile time. The limit can
-be specified when PCRE is built; the default is 250.
-</P>
-<P>
-There is a limit to the number of forward references to subsequent subpatterns
-of around 200,000. Repeated forward references with fixed upper limits, for
-example, (?2){0,100} when subpattern number 2 is to the right, are included in
-the count. There is no limit to the number of backward references.
-</P>
-<P>
-The maximum length of name for a named subpattern is 32 characters, and the
-maximum number of named subpatterns is 10000.
-</P>
-<P>
-The maximum length of a name in a (*MARK), (*PRUNE), (*SKIP), or (*THEN) verb
-is 255 for the 8-bit library and 65535 for the 16-bit and 32-bit libraries.
-</P>
-<P>
-The maximum length of a subject string is the largest positive number that an
-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. For a discussion of stack
-issues, see the
-<a href="pcrestack.html"><b>pcrestack</b></a>
-documentation.
-</P>
-<br><b>
-AUTHOR
-</b><br>
-<P>
-Philip Hazel
-<br>
-University Computing Service
-<br>
-Cambridge CB2 3QH, England.
-<br>
-</P>
-<br><b>
-REVISION
-</b><br>
-<P>
-Last updated: 05 November 2013
-<br>
-Copyright &copy; 1997-2013 University of Cambridge.
-<br>
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
diff --git a/dist/doc/html/pcrepartial.html b/dist/doc/html/pcrepartial.html
deleted file mode 100644
index 4faeafc..0000000
--- a/dist/doc/html/pcrepartial.html
+++ /dev/null
@@ -1,509 +0,0 @@
-<html>
-<head>
-<title>pcrepartial specification</title>
-</head>
-<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
-<h1>pcrepartial man page</h1>
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
-<p>
-This page is part of the PCRE HTML documentation. It was generated automatically
-from the original man page. If there is any nonsense in it, please consult the
-man page, in case the conversion went wrong.
-<br>
-<ul>
-<li><a name="TOC1" href="#SEC1">PARTIAL MATCHING IN PCRE</a>
-<li><a name="TOC2" href="#SEC2">PARTIAL MATCHING USING pcre_exec() OR pcre[16|32]_exec()</a>
-<li><a name="TOC3" href="#SEC3">PARTIAL MATCHING USING pcre_dfa_exec() OR pcre[16|32]_dfa_exec()</a>
-<li><a name="TOC4" href="#SEC4">PARTIAL MATCHING AND WORD BOUNDARIES</a>
-<li><a name="TOC5" href="#SEC5">FORMERLY RESTRICTED PATTERNS</a>
-<li><a name="TOC6" href="#SEC6">EXAMPLE OF PARTIAL MATCHING USING PCRETEST</a>
-<li><a name="TOC7" href="#SEC7">MULTI-SEGMENT MATCHING WITH pcre_dfa_exec() OR pcre[16|32]_dfa_exec()</a>
-<li><a name="TOC8" href="#SEC8">MULTI-SEGMENT MATCHING WITH pcre_exec() OR pcre[16|32]_exec()</a>
-<li><a name="TOC9" href="#SEC9">ISSUES WITH MULTI-SEGMENT MATCHING</a>
-<li><a name="TOC10" href="#SEC10">AUTHOR</a>
-<li><a name="TOC11" href="#SEC11">REVISION</a>
-</ul>
-<br><a name="SEC1" href="#TOC1">PARTIAL MATCHING IN PCRE</a><br>
-<P>
-In normal use of PCRE, if the subject string that is passed to a matching
-function matches as far as it goes, but is too short to match the entire
-pattern, PCRE_ERROR_NOMATCH is returned. There are circumstances where it might
-be helpful to distinguish this case from other cases in which there is no
-match.
-</P>
-<P>
-Consider, for example, an application where a human is required to type in data
-for a field with specific formatting requirements. An example might be a date
-in the form <i>ddmmmyy</i>, defined by this pattern:
-<pre>
-  ^\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d$
-</pre>
-If the application sees the user's keystrokes one by one, and can check that
-what has been typed so far is potentially valid, it is able to raise an error
-as soon as a mistake is made, by beeping and not reflecting the character that
-has been typed, for example. This immediate feedback is likely to be a better
-user interface than a check that is delayed until the entire string has been
-entered. Partial matching can also be useful when the subject string is very
-long and is not all available at once.
-</P>
-<P>
-PCRE supports partial matching by means of the PCRE_PARTIAL_SOFT and
-PCRE_PARTIAL_HARD options, which can be set when calling any of the matching
-functions. For backwards compatibility, PCRE_PARTIAL is a synonym for
-PCRE_PARTIAL_SOFT. The essential difference between the two options is whether
-or not a partial match is preferred to an alternative complete match, though
-the details differ between the two types of matching function. If both options
-are set, PCRE_PARTIAL_HARD takes precedence.
-</P>
-<P>
-If you want to use partial matching with just-in-time optimized code, you must
-call <b>pcre_study()</b>, <b>pcre16_study()</b> or  <b>pcre32_study()</b> with one
-or both of these options:
-<pre>
-  PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE
-  PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE
-</pre>
-PCRE_STUDY_JIT_COMPILE should also be set if you are going to run non-partial
-matches on the same pattern. If the appropriate JIT study mode has not been set
-for a match, the interpretive matching code is used.
-</P>
-<P>
-Setting a partial matching option disables two of PCRE's standard
-optimizations. PCRE remembers the last literal data unit in a pattern, and
-abandons matching immediately if it is not present in the subject string. This
-optimization cannot be used for a subject string that might match only
-partially. If the pattern was studied, PCRE knows the minimum length of a
-matching string, and does not bother to run the matching function on shorter
-strings. This optimization is also disabled for partial matching.
-</P>
-<br><a name="SEC2" href="#TOC1">PARTIAL MATCHING USING pcre_exec() OR pcre[16|32]_exec()</a><br>
-<P>
-A partial match occurs during a call to <b>pcre_exec()</b> or
-<b>pcre[16|32]_exec()</b> when the end of the subject string is reached
-successfully, but matching cannot continue because more characters are needed.
-However, at least one character in the subject must have been inspected. This
-character need not form part of the final matched string; lookbehind assertions
-and the \K escape sequence provide ways of inspecting characters before the
-start of a matched substring. The requirement for inspecting at least one
-character exists because an empty string can always be matched; without such a
-restriction there would always be a partial match of an empty string at the end
-of the subject.
-</P>
-<P>
-If there are at least two slots in the offsets vector when a partial match is
-returned, the first slot is set to the offset of the earliest character that
-was inspected. For convenience, the second offset points to the end of the
-subject so that a substring can easily be identified. If there are at least
-three slots in the offsets vector, the third slot is set to the offset of the
-character where matching started.
-</P>
-<P>
-For the majority of patterns, the contents of the first and third slots will be
-the same. However, for patterns that contain lookbehind assertions, or begin
-with \b or \B, characters before the one where matching started may have been
-inspected while carrying out the match. For example, consider this pattern:
-<pre>
-  /(?&#60;=abc)123/
-</pre>
-This pattern matches "123", but only if it is preceded by "abc". If the subject
-string is "xyzabc12", the first two offsets after a partial match are for the
-substring "abc12", because all these characters were inspected. However, the
-third offset is set to 6, because that is the offset where matching began.
-</P>
-<P>
-What happens when a partial match is identified depends on which of the two
-partial matching options are set.
-</P>
-<br><b>
-PCRE_PARTIAL_SOFT WITH pcre_exec() OR pcre[16|32]_exec()
-</b><br>
-<P>
-If PCRE_PARTIAL_SOFT is set when <b>pcre_exec()</b> or <b>pcre[16|32]_exec()</b>
-identifies a partial match, the partial match is remembered, but matching
-continues as normal, and other alternatives in the pattern are tried. If no
-complete match can be found, PCRE_ERROR_PARTIAL is returned instead of
-PCRE_ERROR_NOMATCH.
-</P>
-<P>
-This option is "soft" because it prefers a complete match over a partial match.
-All the various matching items in a pattern behave as if the subject string is
-potentially complete. For example, \z, \Z, and $ match at the end of the
-subject, as normal, and for \b and \B the end of the subject is treated as a
-non-alphanumeric.
-</P>
-<P>
-If there is more than one partial match, the first one that was found provides
-the data that is returned. Consider this pattern:
-<pre>
-  /123\w+X|dogY/
-</pre>
-If this is matched against the subject string "abc123dog", both
-alternatives fail to match, but the end of the subject is reached during
-matching, so PCRE_ERROR_PARTIAL is returned. The offsets are set to 3 and 9,
-identifying "123dog" as the first partial match that was found. (In this
-example, there are two partial matches, because "dog" on its own partially
-matches the second alternative.)
-</P>
-<br><b>
-PCRE_PARTIAL_HARD WITH pcre_exec() OR pcre[16|32]_exec()
-</b><br>
-<P>
-If PCRE_PARTIAL_HARD is set for <b>pcre_exec()</b> or <b>pcre[16|32]_exec()</b>,
-PCRE_ERROR_PARTIAL is returned as soon as a partial match is found, without
-continuing to search for possible complete matches. This option is "hard"
-because it prefers an earlier partial match over a later complete match. For
-this reason, the assumption is made that the end of the supplied subject string
-may not be the true end of the available data, and so, if \z, \Z, \b, \B,
-or $ are encountered at the end of the subject, the result is
-PCRE_ERROR_PARTIAL, provided that at least one character in the subject has
-been inspected.
-</P>
-<P>
-Setting PCRE_PARTIAL_HARD also affects the way UTF-8 and UTF-16
-subject strings are checked for validity. Normally, an invalid sequence
-causes the error PCRE_ERROR_BADUTF8 or PCRE_ERROR_BADUTF16. However, in the
-special case of a truncated character at the end of the subject,
-PCRE_ERROR_SHORTUTF8 or PCRE_ERROR_SHORTUTF16 is returned when
-PCRE_PARTIAL_HARD is set.
-</P>
-<br><b>
-Comparing hard and soft partial matching
-</b><br>
-<P>
-The difference between the two partial matching options can be illustrated by a
-pattern such as:
-<pre>
-  /dog(sbody)?/
-</pre>
-This matches either "dog" or "dogsbody", greedily (that is, it prefers the
-longer string if possible). If it is matched against the string "dog" with
-PCRE_PARTIAL_SOFT, it yields a complete match for "dog". However, if
-PCRE_PARTIAL_HARD is set, the result is PCRE_ERROR_PARTIAL. On the other hand,
-if the pattern is made ungreedy the result is different:
-<pre>
-  /dog(sbody)??/
-</pre>
-In this case the result is always a complete match because that is found first,
-and matching never continues after finding a complete match. It might be easier
-to follow this explanation by thinking of the two patterns like this:
-<pre>
-  /dog(sbody)?/    is the same as  /dogsbody|dog/
-  /dog(sbody)??/   is the same as  /dog|dogsbody/
-</pre>
-The second pattern will never match "dogsbody", because it will always find the
-shorter match first.
-</P>
-<br><a name="SEC3" href="#TOC1">PARTIAL MATCHING USING pcre_dfa_exec() OR pcre[16|32]_dfa_exec()</a><br>
-<P>
-The DFA functions move along the subject string character by character, without
-backtracking, searching for all possible matches simultaneously. If the end of
-the subject is reached before the end of the pattern, there is the possibility
-of a partial match, again provided that at least one character has been
-inspected.
-</P>
-<P>
-When PCRE_PARTIAL_SOFT is set, PCRE_ERROR_PARTIAL is returned only if there
-have been no complete matches. Otherwise, the complete matches are returned.
-However, if PCRE_PARTIAL_HARD is set, a partial match takes precedence over any
-complete matches. The portion of the string that was inspected when the longest
-partial match was found is set as the first matching string, provided there are
-at least two slots in the offsets vector.
-</P>
-<P>
-Because the DFA functions always search for all possible matches, and there is
-no difference between greedy and ungreedy repetition, their behaviour is
-different from the standard functions when PCRE_PARTIAL_HARD is set. Consider
-the string "dog" matched against the ungreedy pattern shown above:
-<pre>
-  /dog(sbody)??/
-</pre>
-Whereas the standard functions stop as soon as they find the complete match for
-"dog", the DFA functions also find the partial match for "dogsbody", and so
-return that when PCRE_PARTIAL_HARD is set.
-</P>
-<br><a name="SEC4" href="#TOC1">PARTIAL MATCHING AND WORD BOUNDARIES</a><br>
-<P>
-If a pattern ends with one of sequences \b or \B, which test for word
-boundaries, partial matching with PCRE_PARTIAL_SOFT can give counter-intuitive
-results. Consider this pattern:
-<pre>
-  /\bcat\b/
-</pre>
-This matches "cat", provided there is a word boundary at either end. If the
-subject string is "the cat", the comparison of the final "t" with a following
-character cannot take place, so a partial match is found. However, normal
-matching carries on, and \b matches at the end of the subject when the last
-character is a letter, so a complete match is found. The result, therefore, is
-<i>not</i> PCRE_ERROR_PARTIAL. Using PCRE_PARTIAL_HARD in this case does yield
-PCRE_ERROR_PARTIAL, because then the partial match takes precedence.
-</P>
-<br><a name="SEC5" href="#TOC1">FORMERLY RESTRICTED PATTERNS</a><br>
-<P>
-For releases of PCRE prior to 8.00, because of the way certain internal
-optimizations were implemented in the <b>pcre_exec()</b> function, the
-PCRE_PARTIAL option (predecessor of PCRE_PARTIAL_SOFT) could not be used with
-all patterns. From release 8.00 onwards, the restrictions no longer apply, and
-partial matching with can be requested for any pattern.
-</P>
-<P>
-Items that were formerly restricted were repeated single characters and
-repeated metasequences. If PCRE_PARTIAL was set for a pattern that did not
-conform to the restrictions, <b>pcre_exec()</b> returned the error code
-PCRE_ERROR_BADPARTIAL (-13). This error code is no longer in use. The
-PCRE_INFO_OKPARTIAL call to <b>pcre_fullinfo()</b> to find out if a compiled
-pattern can be used for partial matching now always returns 1.
-</P>
-<br><a name="SEC6" href="#TOC1">EXAMPLE OF PARTIAL MATCHING USING PCRETEST</a><br>
-<P>
-If the escape sequence \P is present in a <b>pcretest</b> data line, the
-PCRE_PARTIAL_SOFT option is used for the match. Here is a run of <b>pcretest</b>
-that uses the date example quoted above:
-<pre>
-    re&#62; /^\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d$/
-  data&#62; 25jun04\P
-   0: 25jun04
-   1: jun
-  data&#62; 25dec3\P
-  Partial match: 23dec3
-  data&#62; 3ju\P
-  Partial match: 3ju
-  data&#62; 3juj\P
-  No match
-  data&#62; j\P
-  No match
-</pre>
-The first data string is matched completely, so <b>pcretest</b> shows the
-matched substrings. The remaining four strings do not match the complete
-pattern, but the first two are partial matches. Similar output is obtained
-if DFA matching is used.
-</P>
-<P>
-If the escape sequence \P is present more than once in a <b>pcretest</b> data
-line, the PCRE_PARTIAL_HARD option is set for the match.
-</P>
-<br><a name="SEC7" href="#TOC1">MULTI-SEGMENT MATCHING WITH pcre_dfa_exec() OR pcre[16|32]_dfa_exec()</a><br>
-<P>
-When a partial match has been found using a DFA matching function, it is
-possible to continue the match by providing additional subject data and calling
-the function again with the same compiled regular expression, this time setting
-the PCRE_DFA_RESTART option. You must pass the same working space as before,
-because this is where details of the previous partial match are stored. Here is
-an example using <b>pcretest</b>, using the \R escape sequence to set the
-PCRE_DFA_RESTART option (\D specifies the use of the DFA matching function):
-<pre>
-    re&#62; /^\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d$/
-  data&#62; 23ja\P\D
-  Partial match: 23ja
-  data&#62; n05\R\D
-   0: n05
-</pre>
-The first call has "23ja" as the subject, and requests partial matching; the
-second call has "n05" as the subject for the continued (restarted) match.
-Notice that when the match is complete, only the last part is shown; PCRE does
-not retain the previously partially-matched string. It is up to the calling
-program to do that if it needs to.
-</P>
-<P>
-That means that, for an unanchored pattern, if a continued match fails, it is
-not possible to try again at a new starting point. All this facility is capable
-of doing is continuing with the previous match attempt. In the previous
-example, if the second set of data is "ug23" the result is no match, even
-though there would be a match for "aug23" if the entire string were given at
-once. Depending on the application, this may or may not be what you want.
-The only way to allow for starting again at the next character is to retain the
-matched part of the subject and try a new complete match.
-</P>
-<P>
-You can set the PCRE_PARTIAL_SOFT or PCRE_PARTIAL_HARD options with
-PCRE_DFA_RESTART to continue partial matching over multiple segments. This
-facility can be used to pass very long subject strings to the DFA matching
-functions.
-</P>
-<br><a name="SEC8" href="#TOC1">MULTI-SEGMENT MATCHING WITH pcre_exec() OR pcre[16|32]_exec()</a><br>
-<P>
-From release 8.00, the standard matching functions can also be used to do
-multi-segment matching. Unlike the DFA functions, it is not possible to
-restart the previous match with a new segment of data. Instead, new data must
-be added to the previous subject string, and the entire match re-run, starting
-from the point where the partial match occurred. Earlier data can be discarded.
-</P>
-<P>
-It is best to use PCRE_PARTIAL_HARD in this situation, because it does not
-treat the end of a segment as the end of the subject when matching \z, \Z,
-\b, \B, and $. Consider an unanchored pattern that matches dates:
-<pre>
-    re&#62; /\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d/
-  data&#62; The date is 23ja\P\P
-  Partial match: 23ja
-</pre>
-At this stage, an application could discard the text preceding "23ja", add on
-text from the next segment, and call the matching function again. Unlike the
-DFA matching functions, the entire matching string must always be available,
-and the complete matching process occurs for each call, so more memory and more
-processing time is needed.
-</P>
-<P>
-<b>Note:</b> If the pattern contains lookbehind assertions, or \K, or starts
-with \b or \B, the string that is returned for a partial match includes
-characters that precede the start of what would be returned for a complete
-match, because it contains all the characters that were inspected during the
-partial match.
-</P>
-<br><a name="SEC9" href="#TOC1">ISSUES WITH MULTI-SEGMENT MATCHING</a><br>
-<P>
-Certain types of pattern may give problems with multi-segment matching,
-whichever matching function is used.
-</P>
-<P>
-1. If the pattern contains a test for the beginning of a line, you need to pass
-the PCRE_NOTBOL option when the subject string for any call does start at the
-beginning of a line. There is also a PCRE_NOTEOL option, but in practice when
-doing multi-segment matching you should be using PCRE_PARTIAL_HARD, which
-includes the effect of PCRE_NOTEOL.
-</P>
-<P>
-2. Lookbehind assertions that have already been obeyed are catered for in the
-offsets that are returned for a partial match. However a lookbehind assertion
-later in the pattern could require even earlier characters to be inspected. You
-can handle this case by using the PCRE_INFO_MAXLOOKBEHIND option of the
-<b>pcre_fullinfo()</b> or <b>pcre[16|32]_fullinfo()</b> functions to obtain the
-length of the longest lookbehind in the pattern. This length is given in
-characters, not bytes. If you always retain at least that many characters
-before the partially matched string, all should be well. (Of course, near the
-start of the subject, fewer characters may be present; in that case all
-characters should be retained.)
-</P>
-<P>
-From release 8.33, there is a more accurate way of deciding which characters to
-retain. Instead of subtracting the length of the longest lookbehind from the
-earliest inspected character (<i>offsets[0]</i>), the match start position
-(<i>offsets[2]</i>) should be used, and the next match attempt started at the
-<i>offsets[2]</i> character by setting the <i>startoffset</i> argument of
-<b>pcre_exec()</b> or <b>pcre_dfa_exec()</b>.
-</P>
-<P>
-For example, if the pattern "(?&#60;=123)abc" is partially
-matched against the string "xx123a", the three offset values returned are 2, 6,
-and 5. This indicates that the matching process that gave a partial match
-started at offset 5, but the characters "123a" were all inspected. The maximum
-lookbehind for that pattern is 3, so taking that away from 5 shows that we need
-only keep "123a", and the next match attempt can be started at offset 3 (that
-is, at "a") when further characters have been added. When the match start is
-not the earliest inspected character, <b>pcretest</b> shows it explicitly:
-<pre>
-    re&#62; "(?&#60;=123)abc"
-  data&#62; xx123a\P\P
-  Partial match at offset 5: 123a
-</PRE>
-</P>
-<P>
-3. Because a partial match must always contain at least one character, what
-might be considered a partial match of an empty string actually gives a "no
-match" result. For example:
-<pre>
-    re&#62; /c(?&#60;=abc)x/
-  data&#62; ab\P
-  No match
-</pre>
-If the next segment begins "cx", a match should be found, but this will only
-happen if characters from the previous segment are retained. For this reason, a
-"no match" result should be interpreted as "partial match of an empty string"
-when the pattern contains lookbehinds.
-</P>
-<P>
-4. Matching a subject string that is split into multiple segments may not
-always produce exactly the same result as matching over one single long string,
-especially when PCRE_PARTIAL_SOFT is used. The section "Partial Matching and
-Word Boundaries" above describes an issue that arises if the pattern ends with
-\b or \B. Another kind of difference may occur when there are multiple
-matching possibilities, because (for PCRE_PARTIAL_SOFT) a partial match result
-is given only when there are no completed matches. This means that as soon as
-the shortest match has been found, continuation to a new subject segment is no
-longer possible. Consider again this <b>pcretest</b> example:
-<pre>
-    re&#62; /dog(sbody)?/
-  data&#62; dogsb\P
-   0: dog
-  data&#62; do\P\D
-  Partial match: do
-  data&#62; gsb\R\P\D
-   0: g
-  data&#62; dogsbody\D
-   0: dogsbody
-   1: dog
-</pre>
-The first data line passes the string "dogsb" to a standard matching function,
-setting the PCRE_PARTIAL_SOFT option. Although the string is a partial match
-for "dogsbody", the result is not PCRE_ERROR_PARTIAL, because the shorter
-string "dog" is a complete match. Similarly, when the subject is presented to
-a DFA matching function in several parts ("do" and "gsb" being the first two)
-the match stops when "dog" has been found, and it is not possible to continue.
-On the other hand, if "dogsbody" is presented as a single string, a DFA
-matching function finds both matches.
-</P>
-<P>
-Because of these problems, it is best to use PCRE_PARTIAL_HARD when matching
-multi-segment data. The example above then behaves differently:
-<pre>
-    re&#62; /dog(sbody)?/
-  data&#62; dogsb\P\P
-  Partial match: dogsb
-  data&#62; do\P\D
-  Partial match: do
-  data&#62; gsb\R\P\P\D
-  Partial match: gsb
-</pre>
-5. Patterns that contain alternatives at the top level which do not all start
-with the same pattern item may not work as expected when PCRE_DFA_RESTART is
-used. For example, consider this pattern:
-<pre>
-  1234|3789
-</pre>
-If the first part of the subject is "ABC123", a partial match of the first
-alternative is found at offset 3. There is no partial match for the second
-alternative, because such a match does not start at the same point in the
-subject string. Attempting to continue with the string "7890" does not yield a
-match because only those alternatives that match at one point in the subject
-are remembered. The problem arises because the start of the second alternative
-matches within the first alternative. There is no problem with anchored
-patterns or patterns such as:
-<pre>
-  1234|ABCD
-</pre>
-where no string can be a partial match for both alternatives. This is not a
-problem if a standard matching function is used, because the entire match has
-to be rerun each time:
-<pre>
-    re&#62; /1234|3789/
-  data&#62; ABC123\P\P
-  Partial match: 123
-  data&#62; 1237890
-   0: 3789
-</pre>
-Of course, instead of using PCRE_DFA_RESTART, the same technique of re-running
-the entire match can also be used with the DFA matching functions. Another
-possibility is to work with two buffers. If a partial match at offset <i>n</i>
-in the first buffer is followed by "no match" when PCRE_DFA_RESTART is used on
-the second buffer, you can then try a new match starting at offset <i>n+1</i> in
-the first buffer.
-</P>
-<br><a name="SEC10" href="#TOC1">AUTHOR</a><br>
-<P>
-Philip Hazel
-<br>
-University Computing Service
-<br>
-Cambridge CB2 3QH, England.
-<br>
-</P>
-<br><a name="SEC11" href="#TOC1">REVISION</a><br>
-<P>
-Last updated: 02 July 2013
-<br>
-Copyright &copy; 1997-2013 University of Cambridge.
-<br>
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
diff --git a/dist/doc/html/pcreperform.html b/dist/doc/html/pcreperform.html
deleted file mode 100644
index dda207f..0000000
--- a/dist/doc/html/pcreperform.html
+++ /dev/null
@@ -1,195 +0,0 @@
-<html>
-<head>
-<title>pcreperform specification</title>
-</head>
-<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
-<h1>pcreperform man page</h1>
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
-<p>
-This page is part of the PCRE HTML documentation. It was generated automatically
-from the original man page. If there is any nonsense in it, please consult the
-man page, in case the conversion went wrong.
-<br>
-<br><b>
-PCRE PERFORMANCE
-</b><br>
-<P>
-Two aspects of performance are discussed below: memory usage and processing
-time. The way you express your pattern as a regular expression can affect both
-of them.
-</P>
-<br><b>
-COMPILED PATTERN MEMORY USAGE
-</b><br>
-<P>
-Patterns are compiled by PCRE into a reasonably efficient interpretive code, so
-that most simple patterns do not use much memory. However, there is one case
-where the memory usage of a compiled pattern can be unexpectedly large. If a
-parenthesized subpattern has a quantifier with a minimum greater than 1 and/or
-a limited maximum, the whole subpattern is repeated in the compiled code. For
-example, the pattern
-<pre>
-  (abc|def){2,4}
-</pre>
-is compiled as if it were
-<pre>
-  (abc|def)(abc|def)((abc|def)(abc|def)?)?
-</pre>
-(Technical aside: It is done this way so that backtrack points within each of
-the repetitions can be independently maintained.)
-</P>
-<P>
-For regular expressions whose quantifiers use only small numbers, this is not
-usually a problem. However, if the numbers are large, and particularly if such
-repetitions are nested, the memory usage can become an embarrassment. For
-example, the very simple pattern
-<pre>
-  ((ab){1,1000}c){1,3}
-</pre>
-uses 51K bytes when compiled using the 8-bit library. When PCRE is compiled
-with its default internal pointer size of two bytes, the size limit on a
-compiled pattern is 64K data units, and this is reached with the above pattern
-if the outer repetition is increased from 3 to 4. PCRE can be compiled to use
-larger internal pointers and thus handle larger compiled patterns, but it is
-better to try to rewrite your pattern to use less memory if you can.
-</P>
-<P>
-One way of reducing the memory usage for such patterns is to make use of PCRE's
-<a href="pcrepattern.html#subpatternsassubroutines">"subroutine"</a>
-facility. Re-writing the above pattern as
-<pre>
-  ((ab)(?2){0,999}c)(?1){0,2}
-</pre>
-reduces the memory requirements to 18K, and indeed it remains under 20K even
-with the outer repetition increased to 100. However, this pattern is not
-exactly equivalent, because the "subroutine" calls are treated as
-<a href="pcrepattern.html#atomicgroup">atomic groups</a>
-into which there can be no backtracking if there is a subsequent matching
-failure. Therefore, PCRE cannot do this kind of rewriting automatically.
-Furthermore, there is a noticeable loss of speed when executing the modified
-pattern. Nevertheless, if the atomic grouping is not a problem and the loss of
-speed is acceptable, this kind of rewriting will allow you to process patterns
-that PCRE cannot otherwise handle.
-</P>
-<br><b>
-STACK USAGE AT RUN TIME
-</b><br>
-<P>
-When <b>pcre_exec()</b> or <b>pcre[16|32]_exec()</b> is used for matching, certain
-kinds of pattern can cause it to use large amounts of the process stack. In
-some environments the default process stack is quite small, and if it runs out
-the result is often SIGSEGV. This issue is probably the most frequently raised
-problem with PCRE. Rewriting your pattern can often help. The
-<a href="pcrestack.html"><b>pcrestack</b></a>
-documentation discusses this issue in detail.
-</P>
-<br><b>
-PROCESSING TIME
-</b><br>
-<P>
-Certain items in regular expression patterns are processed more efficiently
-than others. It is more efficient to use a character class like [aeiou] than a
-set of single-character alternatives such as (a|e|i|o|u). In general, the
-simplest construction that provides the required behaviour is usually the most
-efficient. Jeffrey Friedl's book contains a lot of useful general discussion
-about optimizing regular expressions for efficient performance. This document
-contains a few observations about PCRE.
-</P>
-<P>
-Using Unicode character properties (the \p, \P, and \X escapes) is slow,
-because PCRE has to use a multi-stage table lookup whenever it needs a
-character's property. If you can find an alternative pattern that does not use
-character properties, it will probably be faster.
-</P>
-<P>
-By default, the escape sequences \b, \d, \s, and \w, and the POSIX
-character classes such as [:alpha:] do not use Unicode properties, partly for
-backwards compatibility, and partly for performance reasons. However, you can
-set PCRE_UCP if you want Unicode character properties to be used. This can
-double the matching time for items such as \d, when matched with
-a traditional matching function; the performance loss is less with
-a DFA matching function, and in both cases there is not much difference for
-\b.
-</P>
-<P>
-When a pattern begins with .* not in parentheses, or in parentheses that are
-not the subject of a backreference, and the PCRE_DOTALL option is set, the
-pattern is implicitly anchored by PCRE, since it can match only at the start of
-a subject string. However, if PCRE_DOTALL is not set, PCRE cannot make this
-optimization, because the . metacharacter does not then match a newline, and if
-the subject string contains newlines, the pattern may match from the character
-immediately following one of them instead of from the very start. For example,
-the pattern
-<pre>
-  .*second
-</pre>
-matches the subject "first\nand second" (where \n stands for a newline
-character), with the match starting at the seventh character. In order to do
-this, PCRE has to retry the match starting after every newline in the subject.
-</P>
-<P>
-If you are using such a pattern with subject strings that do not contain
-newlines, the best performance is obtained by setting PCRE_DOTALL, or starting
-the pattern with ^.* or ^.*? to indicate explicit anchoring. That saves PCRE
-from having to scan along the subject looking for a newline to restart at.
-</P>
-<P>
-Beware of patterns that contain nested indefinite repeats. These can take a
-long time to run when applied to a string that does not match. Consider the
-pattern fragment
-<pre>
-  ^(a+)*
-</pre>
-This can match "aaaa" in 16 different ways, and this number increases very
-rapidly as the string gets longer. (The * repeat can match 0, 1, 2, 3, or 4
-times, and for each of those cases other than 0 or 4, the + repeats can match
-different numbers of times.) When the remainder of the pattern is such that the
-entire match is going to fail, PCRE has in principle to try every possible
-variation, and this can take an extremely long time, even for relatively short
-strings.
-</P>
-<P>
-An optimization catches some of the more simple cases such as
-<pre>
-  (a+)*b
-</pre>
-where a literal character follows. Before embarking on the standard matching
-procedure, PCRE checks that there is a "b" later in the subject string, and if
-there is not, it fails the match immediately. However, when there is no
-following literal this optimization cannot be used. You can see the difference
-by comparing the behaviour of
-<pre>
-  (a+)*\d
-</pre>
-with the pattern above. The former gives a failure almost instantly when
-applied to a whole line of "a" characters, whereas the latter takes an
-appreciable time with strings longer than about 20 characters.
-</P>
-<P>
-In many cases, the solution to this kind of performance issue is to use an
-atomic group or a possessive quantifier.
-</P>
-<br><b>
-AUTHOR
-</b><br>
-<P>
-Philip Hazel
-<br>
-University Computing Service
-<br>
-Cambridge CB2 3QH, England.
-<br>
-</P>
-<br><b>
-REVISION
-</b><br>
-<P>
-Last updated: 25 August 2012
-<br>
-Copyright &copy; 1997-2012 University of Cambridge.
-<br>
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
diff --git a/dist/doc/html/pcreprecompile.html b/dist/doc/html/pcreprecompile.html
deleted file mode 100644
index decb1d6..0000000
--- a/dist/doc/html/pcreprecompile.html
+++ /dev/null
@@ -1,163 +0,0 @@
-<html>
-<head>
-<title>pcreprecompile specification</title>
-</head>
-<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
-<h1>pcreprecompile man page</h1>
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
-<p>
-This page is part of the PCRE HTML documentation. It was generated automatically
-from the original man page. If there is any nonsense in it, please consult the
-man page, in case the conversion went wrong.
-<br>
-<ul>
-<li><a name="TOC1" href="#SEC1">SAVING AND RE-USING PRECOMPILED PCRE PATTERNS</a>
-<li><a name="TOC2" href="#SEC2">SAVING A COMPILED PATTERN</a>
-<li><a name="TOC3" href="#SEC3">RE-USING A PRECOMPILED PATTERN</a>
-<li><a name="TOC4" href="#SEC4">COMPATIBILITY WITH DIFFERENT PCRE RELEASES</a>
-<li><a name="TOC5" href="#SEC5">AUTHOR</a>
-<li><a name="TOC6" href="#SEC6">REVISION</a>
-</ul>
-<br><a name="SEC1" href="#TOC1">SAVING AND RE-USING PRECOMPILED PCRE PATTERNS</a><br>
-<P>
-If you are running an application that uses a large number of regular
-expression patterns, it may be useful to store them in a precompiled form
-instead of having to compile them every time the application is run.
-If you are not using any private character tables (see the
-<a href="pcre_maketables.html"><b>pcre_maketables()</b></a>
-documentation), this is relatively straightforward. If you are using private
-tables, it is a little bit more complicated. However, if you are using the
-just-in-time optimization feature, it is not possible to save and reload the
-JIT data.
-</P>
-<P>
-If you save compiled patterns to a file, you can copy them to a different host
-and run them there. If the two hosts have different endianness (byte order),
-you should run the <b>pcre[16|32]_pattern_to_host_byte_order()</b> function on the
-new host before trying to match the pattern. The matching functions return
-PCRE_ERROR_BADENDIANNESS if they detect a pattern with the wrong endianness.
-</P>
-<P>
-Compiling regular expressions with one version of PCRE for use with a different
-version is not guaranteed to work and may cause crashes, and saving and
-restoring a compiled pattern loses any JIT optimization data.
-</P>
-<br><a name="SEC2" href="#TOC1">SAVING A COMPILED PATTERN</a><br>
-<P>
-The value returned by <b>pcre[16|32]_compile()</b> points to a single block of
-memory that holds the compiled pattern and associated data. You can find the
-length of this block in bytes by calling <b>pcre[16|32]_fullinfo()</b> with an
-argument of PCRE_INFO_SIZE. You can then save the data in any appropriate
-manner. Here is sample code for the 8-bit library that compiles a pattern and
-writes it to a file. It assumes that the variable <i>fd</i> refers to a file
-that is open for output:
-<pre>
-  int erroroffset, rc, size;
-  char *error;
-  pcre *re;
-
-  re = pcre_compile("my pattern", 0, &error, &erroroffset, NULL);
-  if (re == NULL) { ... handle errors ... }
-  rc = pcre_fullinfo(re, NULL, PCRE_INFO_SIZE, &size);
-  if (rc &#60; 0) { ... handle errors ... }
-  rc = fwrite(re, 1, size, fd);
-  if (rc != size) { ... handle errors ... }
-</pre>
-In this example, the bytes that comprise the compiled pattern are copied
-exactly. Note that this is binary data that may contain any of the 256 possible
-byte values. On systems that make a distinction between binary and non-binary
-data, be sure that the file is opened for binary output.
-</P>
-<P>
-If you want to write more than one pattern to a file, you will have to devise a
-way of separating them. For binary data, preceding each pattern with its length
-is probably the most straightforward approach. Another possibility is to write
-out the data in hexadecimal instead of binary, one pattern to a line.
-</P>
-<P>
-Saving compiled patterns in a file is only one possible way of storing them for
-later use. They could equally well be saved in a database, or in the memory of
-some daemon process that passes them via sockets to the processes that want
-them.
-</P>
-<P>
-If the pattern has been studied, it is also possible to save the normal study
-data in a similar way to the compiled pattern itself. However, if the
-PCRE_STUDY_JIT_COMPILE was used, the just-in-time data that is created cannot
-be saved because it is too dependent on the current environment. When studying
-generates additional information, <b>pcre[16|32]_study()</b> returns a pointer to a
-<b>pcre[16|32]_extra</b> data block. Its format is defined in the
-<a href="pcreapi.html#extradata">section on matching a pattern</a>
-in the
-<a href="pcreapi.html"><b>pcreapi</b></a>
-documentation. The <i>study_data</i> field points to the binary study data, and
-this is what you must save (not the <b>pcre[16|32]_extra</b> block itself). The
-length of the study data can be obtained by calling <b>pcre[16|32]_fullinfo()</b>
-with an argument of PCRE_INFO_STUDYSIZE. Remember to check that
-<b>pcre[16|32]_study()</b> did return a non-NULL value before trying to save the
-study data.
-</P>
-<br><a name="SEC3" href="#TOC1">RE-USING A PRECOMPILED PATTERN</a><br>
-<P>
-Re-using a precompiled pattern is straightforward. Having reloaded it into main
-memory, called <b>pcre[16|32]_pattern_to_host_byte_order()</b> if necessary, you
-pass its pointer to <b>pcre[16|32]_exec()</b> or <b>pcre[16|32]_dfa_exec()</b> in
-the usual way.
-</P>
-<P>
-However, if you passed a pointer to custom character tables when the pattern
-was compiled (the <i>tableptr</i> argument of <b>pcre[16|32]_compile()</b>), you
-must now pass a similar pointer to <b>pcre[16|32]_exec()</b> or
-<b>pcre[16|32]_dfa_exec()</b>, because the value saved with the compiled pattern
-will obviously be nonsense. A field in a <b>pcre[16|32]_extra()</b> block is used
-to pass this data, as described in the
-<a href="pcreapi.html#extradata">section on matching a pattern</a>
-in the
-<a href="pcreapi.html"><b>pcreapi</b></a>
-documentation.
-</P>
-<P>
-<b>Warning:</b> The tables that <b>pcre_exec()</b> and <b>pcre_dfa_exec()</b> use
-must be the same as those that were used when the pattern was compiled. If this
-is not the case, the behaviour is undefined.
-</P>
-<P>
-If you did not provide custom character tables when the pattern was compiled,
-the pointer in the compiled pattern is NULL, which causes the matching
-functions to use PCRE's internal tables. Thus, you do not need to take any
-special action at run time in this case.
-</P>
-<P>
-If you saved study data with the compiled pattern, you need to create your own
-<b>pcre[16|32]_extra</b> data block and set the <i>study_data</i> field to point
-to the reloaded study data. You must also set the PCRE_EXTRA_STUDY_DATA bit in
-the <i>flags</i> field to indicate that study data is present. Then pass the
-<b>pcre[16|32]_extra</b> block to the matching function in the usual way. If the
-pattern was studied for just-in-time optimization, that data cannot be saved,
-and so is lost by a save/restore cycle.
-</P>
-<br><a name="SEC4" href="#TOC1">COMPATIBILITY WITH DIFFERENT PCRE RELEASES</a><br>
-<P>
-In general, it is safest to recompile all saved patterns when you update to a
-new PCRE release, though not all updates actually require this.
-</P>
-<br><a name="SEC5" href="#TOC1">AUTHOR</a><br>
-<P>
-Philip Hazel
-<br>
-University Computing Service
-<br>
-Cambridge CB2 3QH, England.
-<br>
-</P>
-<br><a name="SEC6" href="#TOC1">REVISION</a><br>
-<P>
-Last updated: 12 November 2013
-<br>
-Copyright &copy; 1997-2013 University of Cambridge.
-<br>
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
diff --git a/dist/doc/html/pcresample.html b/dist/doc/html/pcresample.html
deleted file mode 100644
index aca9184..0000000
--- a/dist/doc/html/pcresample.html
+++ /dev/null
@@ -1,110 +0,0 @@
-<html>
-<head>
-<title>pcresample specification</title>
-</head>
-<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
-<h1>pcresample man page</h1>
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
-<p>
-This page is part of the PCRE HTML documentation. It was generated automatically
-from the original man page. If there is any nonsense in it, please consult the
-man page, in case the conversion went wrong.
-<br>
-<br><b>
-PCRE SAMPLE PROGRAM
-</b><br>
-<P>
-A simple, complete demonstration program, to get you started with using PCRE,
-is supplied in the file <i>pcredemo.c</i> in the PCRE distribution. A listing of
-this program is given in the
-<a href="pcredemo.html"><b>pcredemo</b></a>
-documentation. If you do not have a copy of the PCRE distribution, you can save
-this listing to re-create <i>pcredemo.c</i>.
-</P>
-<P>
-The demonstration program, which uses the original PCRE 8-bit library, compiles
-the regular expression that is its first argument, and matches it against the
-subject string in its second argument. No PCRE options are set, and default
-character tables are used. If matching succeeds, the program outputs the
-portion of the subject that matched, together with the contents of any captured
-substrings.
-</P>
-<P>
-If the -g option is given on the command line, the program then goes on to
-check for further matches of the same regular expression in the same subject
-string. The logic is a little bit tricky because of the possibility of matching
-an empty string. Comments in the code explain what is going on.
-</P>
-<P>
-If PCRE is installed in the standard include and library directories for your
-operating system, you should be able to compile the demonstration program using
-this command:
-<pre>
-  gcc -o pcredemo pcredemo.c -lpcre
-</pre>
-If PCRE is installed elsewhere, you may need to add additional options to the
-command line. For example, on a Unix-like system that has PCRE installed in
-<i>/usr/local</i>, you can compile the demonstration program using a command
-like this:
-<pre>
-  gcc -o pcredemo -I/usr/local/include pcredemo.c -L/usr/local/lib -lpcre
-</pre>
-In a Windows environment, if you want to statically link the program against a
-non-dll <b>pcre.a</b> file, you must uncomment the line that defines PCRE_STATIC
-before including <b>pcre.h</b>, because otherwise the <b>pcre_malloc()</b> and
-<b>pcre_free()</b> exported functions will be declared
-<b>__declspec(dllimport)</b>, with unwanted results.
-</P>
-<P>
-Once you have compiled and linked the demonstration program, you can run simple
-tests like this:
-<pre>
-  ./pcredemo 'cat|dog' 'the cat sat on the mat'
-  ./pcredemo -g 'cat|dog' 'the dog sat on the cat'
-</pre>
-Note that there is a much more comprehensive test program, called
-<a href="pcretest.html"><b>pcretest</b>,</a>
-which supports many more facilities for testing regular expressions and both
-PCRE libraries. The
-<a href="pcredemo.html"><b>pcredemo</b></a>
-program is provided as a simple coding example.
-</P>
-<P>
-If you try to run
-<a href="pcredemo.html"><b>pcredemo</b></a>
-when PCRE is not installed in the standard library directory, you may get an
-error like this on some operating systems (e.g. Solaris):
-<pre>
-  ld.so.1: a.out: fatal: libpcre.so.0: open failed: No such file or directory
-</pre>
-This is caused by the way shared library support works on those systems. You
-need to add
-<pre>
-  -R/usr/local/lib
-</pre>
-(for example) to the compile command to get round this problem.
-</P>
-<br><b>
-AUTHOR
-</b><br>
-<P>
-Philip Hazel
-<br>
-University Computing Service
-<br>
-Cambridge CB2 3QH, England.
-<br>
-</P>
-<br><b>
-REVISION
-</b><br>
-<P>
-Last updated: 10 January 2012
-<br>
-Copyright &copy; 1997-2012 University of Cambridge.
-<br>
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
diff --git a/dist/doc/html/pcrestack.html b/dist/doc/html/pcrestack.html
deleted file mode 100644
index af6406d..0000000
--- a/dist/doc/html/pcrestack.html
+++ /dev/null
@@ -1,225 +0,0 @@
-<html>
-<head>
-<title>pcrestack specification</title>
-</head>
-<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
-<h1>pcrestack man page</h1>
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
-<p>
-This page is part of the PCRE HTML documentation. It was generated automatically
-from the original man page. If there is any nonsense in it, please consult the
-man page, in case the conversion went wrong.
-<br>
-<br><b>
-PCRE DISCUSSION OF STACK USAGE
-</b><br>
-<P>
-When you call <b>pcre[16|32]_exec()</b>, it makes use of an internal function
-called <b>match()</b>. This calls itself recursively at branch points in the
-pattern, in order to remember the state of the match so that it can back up and
-try a different alternative if the first one fails. As matching proceeds deeper
-and deeper into the tree of possibilities, the recursion depth increases. The
-<b>match()</b> function is also called in other circumstances, for example,
-whenever a parenthesized sub-pattern is entered, and in certain cases of
-repetition.
-</P>
-<P>
-Not all calls of <b>match()</b> increase the recursion depth; for an item such
-as a* it may be called several times at the same level, after matching
-different numbers of a's. Furthermore, in a number of cases where the result of
-the recursive call would immediately be passed back as the result of the
-current call (a "tail recursion"), the function is just restarted instead.
-</P>
-<P>
-The above comments apply when <b>pcre[16|32]_exec()</b> is run in its normal
-interpretive manner. If the pattern was studied with the
-PCRE_STUDY_JIT_COMPILE option, and just-in-time compiling was successful, and
-the options passed to <b>pcre[16|32]_exec()</b> were not incompatible, the matching
-process uses the JIT-compiled code instead of the <b>match()</b> function. In
-this case, the memory requirements are handled entirely differently. See the
-<a href="pcrejit.html"><b>pcrejit</b></a>
-documentation for details.
-</P>
-<P>
-The <b>pcre[16|32]_dfa_exec()</b> function operates in an entirely different way,
-and uses recursion only when there is a regular expression recursion or
-subroutine call in the pattern. This includes the processing of assertion and
-"once-only" subpatterns, which are handled like subroutine calls. Normally,
-these are never very deep, and the limit on the complexity of
-<b>pcre[16|32]_dfa_exec()</b> is controlled by the amount of workspace it is given.
-However, it is possible to write patterns with runaway infinite recursions;
-such patterns will cause <b>pcre[16|32]_dfa_exec()</b> to run out of stack. At
-present, there is no protection against this.
-</P>
-<P>
-The comments that follow do NOT apply to <b>pcre[16|32]_dfa_exec()</b>; they are
-relevant only for <b>pcre[16|32]_exec()</b> without the JIT optimization.
-</P>
-<br><b>
-Reducing <b>pcre[16|32]_exec()</b>'s stack usage
-</b><br>
-<P>
-Each time that <b>match()</b> is actually called recursively, it uses memory
-from the process stack. For certain kinds of pattern and data, very large
-amounts of stack may be needed, despite the recognition of "tail recursion".
-You can often reduce the amount of recursion, and therefore the amount of stack
-used, by modifying the pattern that is being matched. Consider, for example,
-this pattern:
-<pre>
-  ([^&#60;]|&#60;(?!inet))+
-</pre>
-It matches from wherever it starts until it encounters "&#60;inet" or the end of
-the data, and is the kind of pattern that might be used when processing an XML
-file. Each iteration of the outer parentheses matches either one character that
-is not "&#60;" or a "&#60;" that is not followed by "inet". However, each time a
-parenthesis is processed, a recursion occurs, so this formulation uses a stack
-frame for each matched character. For a long string, a lot of stack is
-required. Consider now this rewritten pattern, which matches exactly the same
-strings:
-<pre>
-  ([^&#60;]++|&#60;(?!inet))+
-</pre>
-This uses very much less stack, because runs of characters that do not contain
-"&#60;" are "swallowed" in one item inside the parentheses. Recursion happens only
-when a "&#60;" character that is not followed by "inet" is encountered (and we
-assume this is relatively rare). A possessive quantifier is used to stop any
-backtracking into the runs of non-"&#60;" characters, but that is not related to
-stack usage.
-</P>
-<P>
-This example shows that one way of avoiding stack problems when matching long
-subject strings is to write repeated parenthesized subpatterns to match more
-than one character whenever possible.
-</P>
-<br><b>
-Compiling PCRE to use heap instead of stack for <b>pcre[16|32]_exec()</b>
-</b><br>
-<P>
-In environments where stack memory is constrained, you might want to compile
-PCRE to use heap memory instead of stack for remembering back-up points when
-<b>pcre[16|32]_exec()</b> is running. This makes it run a lot more slowly, however.
-Details of how to do this are given in the
-<a href="pcrebuild.html"><b>pcrebuild</b></a>
-documentation. When built in this way, instead of using the stack, PCRE obtains
-and frees memory by calling the functions that are pointed to by the
-<b>pcre[16|32]_stack_malloc</b> and <b>pcre[16|32]_stack_free</b> variables. By
-default, these point to <b>malloc()</b> and <b>free()</b>, but you can replace
-the pointers to cause PCRE to use your own functions. Since the block sizes are
-always the same, and are always freed in reverse order, it may be possible to
-implement customized memory handlers that are more efficient than the standard
-functions.
-</P>
-<br><b>
-Limiting <b>pcre[16|32]_exec()</b>'s stack usage
-</b><br>
-<P>
-You can set limits on the number of times that <b>match()</b> is called, both in
-total and recursively. If a limit is exceeded, <b>pcre[16|32]_exec()</b> returns an
-error code. Setting suitable limits should prevent it from running out of
-stack. The default values of the limits are very large, and unlikely ever to
-operate. They can be changed when PCRE is built, and they can also be set when
-<b>pcre[16|32]_exec()</b> is called. For details of these interfaces, see the
-<a href="pcrebuild.html"><b>pcrebuild</b></a>
-documentation and the
-<a href="pcreapi.html#extradata">section on extra data for <b>pcre[16|32]_exec()</b></a>
-in the
-<a href="pcreapi.html"><b>pcreapi</b></a>
-documentation.
-</P>
-<P>
-As a very rough rule of thumb, you should reckon on about 500 bytes per
-recursion. Thus, if you want to limit your stack usage to 8Mb, you should set
-the limit at 16000 recursions. A 64Mb stack, on the other hand, can support
-around 128000 recursions.
-</P>
-<P>
-In Unix-like environments, the <b>pcretest</b> test program has a command line
-option (<b>-S</b>) that can be used to increase the size of its stack. As long
-as the stack is large enough, another option (<b>-M</b>) can be used to find the
-smallest limits that allow a particular pattern to match a given subject
-string. This is done by calling <b>pcre[16|32]_exec()</b> repeatedly with different
-limits.
-</P>
-<br><b>
-Obtaining an estimate of stack usage
-</b><br>
-<P>
-The actual amount of stack used per recursion can vary quite a lot, depending
-on the compiler that was used to build PCRE and the optimization or debugging
-options that were set for it. The rule of thumb value of 500 bytes mentioned
-above may be larger or smaller than what is actually needed. A better
-approximation can be obtained by running this command:
-<pre>
-  pcretest -m -C
-</pre>
-The <b>-C</b> option causes <b>pcretest</b> to output information about the
-options with which PCRE was compiled. When <b>-m</b> is also given (before
-<b>-C</b>), information about stack use is given in a line like this:
-<pre>
-  Match recursion uses stack: approximate frame size = 640 bytes
-</pre>
-The value is approximate because some recursions need a bit more (up to perhaps
-16 more bytes).
-</P>
-<P>
-If the above command is given when PCRE is compiled to use the heap instead of
-the stack for recursion, the value that is output is the size of each block
-that is obtained from the heap.
-</P>
-<br><b>
-Changing stack size in Unix-like systems
-</b><br>
-<P>
-In Unix-like environments, there is not often a problem with the stack unless
-very long strings are involved, though the default limit on stack size varies
-from system to system. Values from 8Mb to 64Mb are common. You can find your
-default limit by running the command:
-<pre>
-  ulimit -s
-</pre>
-Unfortunately, the effect of running out of stack is often SIGSEGV, though
-sometimes a more explicit error message is given. You can normally increase the
-limit on stack size by code such as this:
-<pre>
-  struct rlimit rlim;
-  getrlimit(RLIMIT_STACK, &rlim);
-  rlim.rlim_cur = 100*1024*1024;
-  setrlimit(RLIMIT_STACK, &rlim);
-</pre>
-This reads the current limits (soft and hard) using <b>getrlimit()</b>, then
-attempts to increase the soft limit to 100Mb using <b>setrlimit()</b>. You must
-do this before calling <b>pcre[16|32]_exec()</b>.
-</P>
-<br><b>
-Changing stack size in Mac OS X
-</b><br>
-<P>
-Using <b>setrlimit()</b>, as described above, should also work on Mac OS X. It
-is also possible to set a stack size when linking a program. There is a
-discussion about stack sizes in Mac OS X at this web site:
-<a href="http://developer.apple.com/qa/qa2005/qa1419.html">http://developer.apple.com/qa/qa2005/qa1419.html.</a>
-</P>
-<br><b>
-AUTHOR
-</b><br>
-<P>
-Philip Hazel
-<br>
-University Computing Service
-<br>
-Cambridge CB2 3QH, England.
-<br>
-</P>
-<br><b>
-REVISION
-</b><br>
-<P>
-Last updated: 24 June 2012
-<br>
-Copyright &copy; 1997-2012 University of Cambridge.
-<br>
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
diff --git a/dist/doc/html/pcretest.html b/dist/doc/html/pcretest.html
deleted file mode 100644
index 839fabf..0000000
--- a/dist/doc/html/pcretest.html
+++ /dev/null
@@ -1,1158 +0,0 @@
-<html>
-<head>
-<title>pcretest specification</title>
-</head>
-<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
-<h1>pcretest man page</h1>
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
-<p>
-This page is part of the PCRE HTML documentation. It was generated automatically
-from the original man page. If there is any nonsense in it, please consult the
-man page, in case the conversion went wrong.
-<br>
-<ul>
-<li><a name="TOC1" href="#SEC1">SYNOPSIS</a>
-<li><a name="TOC2" href="#SEC2">INPUT DATA FORMAT</a>
-<li><a name="TOC3" href="#SEC3">PCRE's 8-BIT, 16-BIT AND 32-BIT LIBRARIES</a>
-<li><a name="TOC4" href="#SEC4">COMMAND LINE OPTIONS</a>
-<li><a name="TOC5" href="#SEC5">DESCRIPTION</a>
-<li><a name="TOC6" href="#SEC6">PATTERN MODIFIERS</a>
-<li><a name="TOC7" href="#SEC7">DATA LINES</a>
-<li><a name="TOC8" href="#SEC8">THE ALTERNATIVE MATCHING FUNCTION</a>
-<li><a name="TOC9" href="#SEC9">DEFAULT OUTPUT FROM PCRETEST</a>
-<li><a name="TOC10" href="#SEC10">OUTPUT FROM THE ALTERNATIVE MATCHING FUNCTION</a>
-<li><a name="TOC11" href="#SEC11">RESTARTING AFTER A PARTIAL MATCH</a>
-<li><a name="TOC12" href="#SEC12">CALLOUTS</a>
-<li><a name="TOC13" href="#SEC13">NON-PRINTING CHARACTERS</a>
-<li><a name="TOC14" href="#SEC14">SAVING AND RELOADING COMPILED PATTERNS</a>
-<li><a name="TOC15" href="#SEC15">SEE ALSO</a>
-<li><a name="TOC16" href="#SEC16">AUTHOR</a>
-<li><a name="TOC17" href="#SEC17">REVISION</a>
-</ul>
-<br><a name="SEC1" href="#TOC1">SYNOPSIS</a><br>
-<P>
-<b>pcretest [options] [input file [output file]]</b>
-<br>
-<br>
-<b>pcretest</b> was written as a test program for the PCRE regular expression
-library itself, but it can also be used for experimenting with regular
-expressions. This document describes the features of the test program; for
-details of the regular expressions themselves, see the
-<a href="pcrepattern.html"><b>pcrepattern</b></a>
-documentation. For details of the PCRE library function calls and their
-options, see the
-<a href="pcreapi.html"><b>pcreapi</b></a>
-,
-<a href="pcre16.html"><b>pcre16</b></a>
-and
-<a href="pcre32.html"><b>pcre32</b></a>
-documentation.
-</P>
-<P>
-The input for <b>pcretest</b> is a sequence of regular expression patterns and
-strings to be matched, as described below. The output shows the result of each
-match. Options on the command line and the patterns control PCRE options and
-exactly what is output.
-</P>
-<P>
-As PCRE has evolved, it has acquired many different features, and as a result,
-<b>pcretest</b> now has rather a lot of obscure options for testing every
-possible feature. Some of these options are specifically designed for use in
-conjunction with the test script and data files that are distributed as part of
-PCRE, and are unlikely to be of use otherwise. They are all documented here,
-but without much justification.
-</P>
-<br><a name="SEC2" href="#TOC1">INPUT DATA FORMAT</a><br>
-<P>
-Input to <b>pcretest</b> is processed line by line, either by calling the C
-library's <b>fgets()</b> function, or via the <b>libreadline</b> library (see
-below). In Unix-like environments, <b>fgets()</b> treats any bytes other than
-newline as data characters. However, in some Windows environments character 26
-(hex 1A) causes an immediate end of file, and no further data is read. For
-maximum portability, therefore, it is safest to use only ASCII characters in
-<b>pcretest</b> input files.
-</P>
-<br><a name="SEC3" href="#TOC1">PCRE's 8-BIT, 16-BIT AND 32-BIT LIBRARIES</a><br>
-<P>
-From release 8.30, two separate PCRE libraries can be built. The original one
-supports 8-bit character strings, whereas the newer 16-bit library supports
-character strings encoded in 16-bit units. From release 8.32, a third library
-can be built, supporting character strings encoded in 32-bit units. The
-<b>pcretest</b> program can be used to test all three libraries. However, it is
-itself still an 8-bit program, reading 8-bit input and writing 8-bit output.
-When testing the 16-bit or 32-bit library, the patterns and data strings are
-converted to 16- or 32-bit format before being passed to the PCRE library
-functions. Results are converted to 8-bit for output.
-</P>
-<P>
-References to functions and structures of the form <b>pcre[16|32]_xx</b> below
-mean "<b>pcre_xx</b> when using the 8-bit library, <b>pcre16_xx</b> when using
-the 16-bit library, or <b>pcre32_xx</b> when using the 32-bit library".
-</P>
-<br><a name="SEC4" href="#TOC1">COMMAND LINE OPTIONS</a><br>
-<P>
-<b>-8</b>
-If both the 8-bit library has been built, this option causes the 8-bit library
-to be used (which is the default); if the 8-bit library has not been built,
-this option causes an error.
-</P>
-<P>
-<b>-16</b>
-If both the 8-bit or the 32-bit, and the 16-bit libraries have been built, this
-option causes the 16-bit library to be used. If only the 16-bit library has been
-built, this is the default (so has no effect). If only the 8-bit or the 32-bit
-library has been built, this option causes an error.
-</P>
-<P>
-<b>-32</b>
-If both the 8-bit or the 16-bit, and the 32-bit libraries have been built, this
-option causes the 32-bit library to be used. If only the 32-bit library has been
-built, this is the default (so has no effect). If only the 8-bit or the 16-bit
-library has been built, this option causes an error.
-</P>
-<P>
-<b>-b</b>
-Behave as if each pattern has the <b>/B</b> (show byte code) modifier; the
-internal form is output after compilation.
-</P>
-<P>
-<b>-C</b>
-Output the version number of the PCRE library, and all available information
-about the optional features that are included, and then exit with zero exit
-code. All other options are ignored.
-</P>
-<P>
-<b>-C</b> <i>option</i>
-Output information about a specific build-time option, then exit. This
-functionality is intended for use in scripts such as <b>RunTest</b>. The
-following options output the value and set the exit code as indicated:
-<pre>
-  ebcdic-nl  the code for LF (= NL) in an EBCDIC environment:
-               0x15 or 0x25
-               0 if used in an ASCII environment
-               exit code is always 0
-  linksize   the configured internal link size (2, 3, or 4)
-               exit code is set to the link size
-  newline    the default newline setting:
-               CR, LF, CRLF, ANYCRLF, or ANY
-               exit code is always 0
-  bsr        the default setting for what \R matches:
-               ANYCRLF or ANY
-               exit code is always 0
-</pre>
-The following options output 1 for true or 0 for false, and set the exit code
-to the same value:
-<pre>
-  ebcdic     compiled for an EBCDIC environment
-  jit        just-in-time support is available
-  pcre16     the 16-bit library was built
-  pcre32     the 32-bit library was built
-  pcre8      the 8-bit library was built
-  ucp        Unicode property support is available
-  utf        UTF-8 and/or UTF-16 and/or UTF-32 support
-               is available
-</pre>
-If an unknown option is given, an error message is output; the exit code is 0.
-</P>
-<P>
-<b>-d</b>
-Behave as if each pattern has the <b>/D</b> (debug) modifier; the internal
-form and information about the compiled pattern is output after compilation;
-<b>-d</b> is equivalent to <b>-b -i</b>.
-</P>
-<P>
-<b>-dfa</b>
-Behave as if each data line contains the \D escape sequence; this causes the
-alternative matching function, <b>pcre[16|32]_dfa_exec()</b>, to be used instead
-of the standard <b>pcre[16|32]_exec()</b> function (more detail is given below).
-</P>
-<P>
-<b>-help</b>
-Output a brief summary these options and then exit.
-</P>
-<P>
-<b>-i</b>
-Behave as if each pattern has the <b>/I</b> modifier; information about the
-compiled pattern is given after compilation.
-</P>
-<P>
-<b>-M</b>
-Behave as if each data line contains the \M escape sequence; this causes
-PCRE to discover the minimum MATCH_LIMIT and MATCH_LIMIT_RECURSION settings by
-calling <b>pcre[16|32]_exec()</b> repeatedly with different limits.
-</P>
-<P>
-<b>-m</b>
-Output the size of each compiled pattern after it has been compiled. This is
-equivalent to adding <b>/M</b> to each regular expression. The size is given in
-bytes for both libraries.
-</P>
-<P>
-<b>-O</b>
-Behave as if each pattern has the <b>/O</b> modifier, that is disable
-auto-possessification for all patterns.
-</P>
-<P>
-<b>-o</b> <i>osize</i>
-Set the number of elements in the output vector that is used when calling
-<b>pcre[16|32]_exec()</b> or <b>pcre[16|32]_dfa_exec()</b> to be <i>osize</i>. The
-default value is 45, which is enough for 14 capturing subexpressions for
-<b>pcre[16|32]_exec()</b> or 22 different matches for
-<b>pcre[16|32]_dfa_exec()</b>.
-The vector size can be changed for individual matching calls by including \O
-in the data line (see below).
-</P>
-<P>
-<b>-p</b>
-Behave as if each pattern has the <b>/P</b> modifier; the POSIX wrapper API is
-used to call PCRE. None of the other options has any effect when <b>-p</b> is
-set. This option can be used only with the 8-bit library.
-</P>
-<P>
-<b>-q</b>
-Do not output the version number of <b>pcretest</b> at the start of execution.
-</P>
-<P>
-<b>-S</b> <i>size</i>
-On Unix-like systems, set the size of the run-time stack to <i>size</i>
-megabytes.
-</P>
-<P>
-<b>-s</b> or <b>-s+</b>
-Behave as if each pattern has the <b>/S</b> modifier; in other words, force each
-pattern to be studied. If <b>-s+</b> is used, all the JIT compile options are
-passed to <b>pcre[16|32]_study()</b>, causing just-in-time optimization to be set
-up if it is available, for both full and partial matching. Specific JIT compile
-options can be selected by following <b>-s+</b> with a digit in the range 1 to
-7, which selects the JIT compile modes as follows:
-<pre>
-  1  normal match only
-  2  soft partial match only
-  3  normal match and soft partial match
-  4  hard partial match only
-  6  soft and hard partial match
-  7  all three modes (default)
-</pre>
-If <b>-s++</b> is used instead of <b>-s+</b> (with or without a following digit),
-the text "(JIT)" is added to the first output line after a match or no match
-when JIT-compiled code was actually used.
-<br>
-<br>
-Note that there are pattern options that can override <b>-s</b>, either
-specifying no studying at all, or suppressing JIT compilation.
-<br>
-<br>
-If the <b>/I</b> or <b>/D</b> option is present on a pattern (requesting output
-about the compiled pattern), information about the result of studying is not
-included when studying is caused only by <b>-s</b> and neither <b>-i</b> nor
-<b>-d</b> is present on the command line. This behaviour means that the output
-from tests that are run with and without <b>-s</b> should be identical, except
-when options that output information about the actual running of a match are
-set.
-<br>
-<br>
-The <b>-M</b>, <b>-t</b>, and <b>-tm</b> options, which give information about
-resources used, are likely to produce different output with and without
-<b>-s</b>. Output may also differ if the <b>/C</b> option is present on an
-individual pattern. This uses callouts to trace the the matching process, and
-this may be different between studied and non-studied patterns. If the pattern
-contains (*MARK) items there may also be differences, for the same reason. The
-<b>-s</b> command line option can be overridden for specific patterns that
-should never be studied (see the <b>/S</b> pattern modifier below).
-</P>
-<P>
-<b>-t</b>
-Run each compile, study, and match many times with a timer, and output the
-resulting times per compile, study, or match (in milliseconds). Do not set
-<b>-m</b> with <b>-t</b>, because you will then get the size output a zillion
-times, and the timing will be distorted. You can control the number of
-iterations that are used for timing by following <b>-t</b> with a number (as a
-separate item on the command line). For example, "-t 1000" iterates 1000 times.
-The default is to iterate 500000 times.
-</P>
-<P>
-<b>-tm</b>
-This is like <b>-t</b> except that it times only the matching phase, not the
-compile or study phases.
-</P>
-<P>
-<b>-T</b> <b>-TM</b>
-These behave like <b>-t</b> and <b>-tm</b>, but in addition, at the end of a run,
-the total times for all compiles, studies, and matches are output.
-</P>
-<br><a name="SEC5" href="#TOC1">DESCRIPTION</a><br>
-<P>
-If <b>pcretest</b> is given two filename arguments, it reads from the first and
-writes to the second. If it is given only one filename argument, it reads from
-that file and writes to stdout. Otherwise, it reads from stdin and writes to
-stdout, and prompts for each line of input, using "re&#62;" to prompt for regular
-expressions, and "data&#62;" to prompt for data lines.
-</P>
-<P>
-When <b>pcretest</b> is built, a configuration option can specify that it should
-be linked with the <b>libreadline</b> library. When this is done, if the input
-is from a terminal, it is read using the <b>readline()</b> function. This
-provides line-editing and history facilities. The output from the <b>-help</b>
-option states whether or not <b>readline()</b> will be used.
-</P>
-<P>
-The program handles any number of sets of input on a single input file. Each
-set starts with a regular expression, and continues with any number of data
-lines to be matched against that pattern.
-</P>
-<P>
-Each data line is matched separately and independently. If you want to do
-multi-line matches, you have to use the \n escape sequence (or \r or \r\n,
-etc., depending on the newline setting) in a single line of input to encode the
-newline sequences. There is no limit on the length of data lines; the input
-buffer is automatically extended if it is too small.
-</P>
-<P>
-An empty line signals the end of the data lines, at which point a new regular
-expression is read. The regular expressions are given enclosed in any
-non-alphanumeric delimiters other than backslash, for example:
-<pre>
-  /(a|bc)x+yz/
-</pre>
-White space before the initial delimiter is ignored. A regular expression may
-be continued over several input lines, in which case the newline characters are
-included within it. It is possible to include the delimiter within the pattern
-by escaping it, for example
-<pre>
-  /abc\/def/
-</pre>
-If you do so, the escape and the delimiter form part of the pattern, but since
-delimiters are always non-alphanumeric, this does not affect its interpretation.
-If the terminating delimiter is immediately followed by a backslash, for
-example,
-<pre>
-  /abc/\
-</pre>
-then a backslash is added to the end of the pattern. This is done to provide a
-way of testing the error condition that arises if a pattern finishes with a
-backslash, because
-<pre>
-  /abc\/
-</pre>
-is interpreted as the first line of a pattern that starts with "abc/", causing
-pcretest to read the next line as a continuation of the regular expression.
-</P>
-<br><a name="SEC6" href="#TOC1">PATTERN MODIFIERS</a><br>
-<P>
-A pattern may be followed by any number of modifiers, which are mostly single
-characters, though some of these can be qualified by further characters.
-Following Perl usage, these are referred to below as, for example, "the
-<b>/i</b> modifier", even though the delimiter of the pattern need not always be
-a slash, and no slash is used when writing modifiers. White space may appear
-between the final pattern delimiter and the first modifier, and between the
-modifiers themselves. For reference, here is a complete list of modifiers. They
-fall into several groups that are described in detail in the following
-sections.
-<pre>
-  <b>/8</b>              set UTF mode
-  <b>/9</b>              set PCRE_NEVER_UTF (locks out UTF mode)
-  <b>/?</b>              disable UTF validity check
-  <b>/+</b>              show remainder of subject after match
-  <b>/=</b>              show all captures (not just those that are set)
-
-  <b>/A</b>              set PCRE_ANCHORED
-  <b>/B</b>              show compiled code
-  <b>/C</b>              set PCRE_AUTO_CALLOUT
-  <b>/D</b>              same as <b>/B</b> plus <b>/I</b>
-  <b>/E</b>              set PCRE_DOLLAR_ENDONLY
-  <b>/F</b>              flip byte order in compiled pattern
-  <b>/f</b>              set PCRE_FIRSTLINE
-  <b>/G</b>              find all matches (shorten string)
-  <b>/g</b>              find all matches (use startoffset)
-  <b>/I</b>              show information about pattern
-  <b>/i</b>              set PCRE_CASELESS
-  <b>/J</b>              set PCRE_DUPNAMES
-  <b>/K</b>              show backtracking control names
-  <b>/L</b>              set locale
-  <b>/M</b>              show compiled memory size
-  <b>/m</b>              set PCRE_MULTILINE
-  <b>/N</b>              set PCRE_NO_AUTO_CAPTURE
-  <b>/O</b>              set PCRE_NO_AUTO_POSSESS
-  <b>/P</b>              use the POSIX wrapper
-  <b>/Q</b>              test external stack check function
-  <b>/S</b>              study the pattern after compilation
-  <b>/s</b>              set PCRE_DOTALL
-  <b>/T</b>              select character tables
-  <b>/U</b>              set PCRE_UNGREEDY
-  <b>/W</b>              set PCRE_UCP
-  <b>/X</b>              set PCRE_EXTRA
-  <b>/x</b>              set PCRE_EXTENDED
-  <b>/Y</b>              set PCRE_NO_START_OPTIMIZE
-  <b>/Z</b>              don't show lengths in <b>/B</b> output
-
-  <b>/&#60;any&#62;</b>          set PCRE_NEWLINE_ANY
-  <b>/&#60;anycrlf&#62;</b>      set PCRE_NEWLINE_ANYCRLF
-  <b>/&#60;cr&#62;</b>           set PCRE_NEWLINE_CR
-  <b>/&#60;crlf&#62;</b>         set PCRE_NEWLINE_CRLF
-  <b>/&#60;lf&#62;</b>           set PCRE_NEWLINE_LF
-  <b>/&#60;bsr_anycrlf&#62;</b>  set PCRE_BSR_ANYCRLF
-  <b>/&#60;bsr_unicode&#62;</b>  set PCRE_BSR_UNICODE
-  <b>/&#60;JS&#62;</b>           set PCRE_JAVASCRIPT_COMPAT
-
-</PRE>
-</P>
-<br><b>
-Perl-compatible modifiers
-</b><br>
-<P>
-The <b>/i</b>, <b>/m</b>, <b>/s</b>, and <b>/x</b> modifiers set the PCRE_CASELESS,
-PCRE_MULTILINE, PCRE_DOTALL, or PCRE_EXTENDED options, respectively, when
-<b>pcre[16|32]_compile()</b> is called. These four modifier letters have the same
-effect as they do in Perl. For example:
-<pre>
-  /caseless/i
-
-</PRE>
-</P>
-<br><b>
-Modifiers for other PCRE options
-</b><br>
-<P>
-The following table shows additional modifiers for setting PCRE compile-time
-options that do not correspond to anything in Perl:
-<pre>
-  <b>/8</b>              PCRE_UTF8           ) when using the 8-bit
-  <b>/?</b>              PCRE_NO_UTF8_CHECK  )   library
-
-  <b>/8</b>              PCRE_UTF16          ) when using the 16-bit
-  <b>/?</b>              PCRE_NO_UTF16_CHECK )   library
-
-  <b>/8</b>              PCRE_UTF32          ) when using the 32-bit
-  <b>/?</b>              PCRE_NO_UTF32_CHECK )   library
-
-  <b>/9</b>              PCRE_NEVER_UTF
-  <b>/A</b>              PCRE_ANCHORED
-  <b>/C</b>              PCRE_AUTO_CALLOUT
-  <b>/E</b>              PCRE_DOLLAR_ENDONLY
-  <b>/f</b>              PCRE_FIRSTLINE
-  <b>/J</b>              PCRE_DUPNAMES
-  <b>/N</b>              PCRE_NO_AUTO_CAPTURE
-  <b>/O</b>              PCRE_NO_AUTO_POSSESS
-  <b>/U</b>              PCRE_UNGREEDY
-  <b>/W</b>              PCRE_UCP
-  <b>/X</b>              PCRE_EXTRA
-  <b>/Y</b>              PCRE_NO_START_OPTIMIZE
-  <b>/&#60;any&#62;</b>          PCRE_NEWLINE_ANY
-  <b>/&#60;anycrlf&#62;</b>      PCRE_NEWLINE_ANYCRLF
-  <b>/&#60;cr&#62;</b>           PCRE_NEWLINE_CR
-  <b>/&#60;crlf&#62;</b>         PCRE_NEWLINE_CRLF
-  <b>/&#60;lf&#62;</b>           PCRE_NEWLINE_LF
-  <b>/&#60;bsr_anycrlf&#62;</b>  PCRE_BSR_ANYCRLF
-  <b>/&#60;bsr_unicode&#62;</b>  PCRE_BSR_UNICODE
-  <b>/&#60;JS&#62;</b>           PCRE_JAVASCRIPT_COMPAT
-</pre>
-The modifiers that are enclosed in angle brackets are literal strings as shown,
-including the angle brackets, but the letters within can be in either case.
-This example sets multiline matching with CRLF as the line ending sequence:
-<pre>
-  /^abc/m&#60;CRLF&#62;
-</pre>
-As well as turning on the PCRE_UTF8/16/32 option, the <b>/8</b> modifier causes
-all non-printing characters in output strings to be printed using the
-\x{hh...} notation. Otherwise, those less than 0x100 are output in hex without
-the curly brackets.
-</P>
-<P>
-Full details of the PCRE options are given in the
-<a href="pcreapi.html"><b>pcreapi</b></a>
-documentation.
-</P>
-<br><b>
-Finding all matches in a string
-</b><br>
-<P>
-Searching for all possible matches within each subject string can be requested
-by the <b>/g</b> or <b>/G</b> modifier. After finding a match, PCRE is called
-again to search the remainder of the subject string. The difference between
-<b>/g</b> and <b>/G</b> is that the former uses the <i>startoffset</i> argument to
-<b>pcre[16|32]_exec()</b> to start searching at a new point within the entire
-string (which is in effect what Perl does), whereas the latter passes over a
-shortened substring. This makes a difference to the matching process if the
-pattern begins with a lookbehind assertion (including \b or \B).
-</P>
-<P>
-If any call to <b>pcre[16|32]_exec()</b> in a <b>/g</b> or <b>/G</b> sequence matches
-an empty string, the next call is done with the PCRE_NOTEMPTY_ATSTART and
-PCRE_ANCHORED flags set in order to search for another, non-empty, match at the
-same point. If this second match fails, the start offset is advanced, and the
-normal match is retried. This imitates the way Perl handles such cases when
-using the <b>/g</b> modifier or the <b>split()</b> function. Normally, the start
-offset is advanced by one character, but if the newline convention recognizes
-CRLF as a newline, and the current character is CR followed by LF, an advance
-of two is used.
-</P>
-<br><b>
-Other modifiers
-</b><br>
-<P>
-There are yet more modifiers for controlling the way <b>pcretest</b>
-operates.
-</P>
-<P>
-The <b>/+</b> modifier requests that as well as outputting the substring that
-matched the entire pattern, <b>pcretest</b> should in addition output the
-remainder of the subject string. This is useful for tests where the subject
-contains multiple copies of the same substring. If the <b>+</b> modifier appears
-twice, the same action is taken for captured substrings. In each case the
-remainder is output on the following line with a plus character following the
-capture number. Note that this modifier must not immediately follow the /S
-modifier because /S+ and /S++ have other meanings.
-</P>
-<P>
-The <b>/=</b> modifier requests that the values of all potential captured
-parentheses be output after a match. By default, only those up to the highest
-one actually used in the match are output (corresponding to the return code
-from <b>pcre[16|32]_exec()</b>). Values in the offsets vector corresponding to
-higher numbers should be set to -1, and these are output as "&#60;unset&#62;". This
-modifier gives a way of checking that this is happening.
-</P>
-<P>
-The <b>/B</b> modifier is a debugging feature. It requests that <b>pcretest</b>
-output a representation of the compiled code after compilation. Normally this
-information contains length and offset values; however, if <b>/Z</b> is also
-present, this data is replaced by spaces. This is a special feature for use in
-the automatic test scripts; it ensures that the same output is generated for
-different internal link sizes.
-</P>
-<P>
-The <b>/D</b> modifier is a PCRE debugging feature, and is equivalent to
-<b>/BI</b>, that is, both the <b>/B</b> and the <b>/I</b> modifiers.
-</P>
-<P>
-The <b>/F</b> modifier causes <b>pcretest</b> to flip the byte order of the
-2-byte and 4-byte fields in the compiled pattern. This facility is for testing
-the feature in PCRE that allows it to execute patterns that were compiled on a
-host with a different endianness. This feature is not available when the POSIX
-interface to PCRE is being used, that is, when the <b>/P</b> pattern modifier is
-specified. See also the section about saving and reloading compiled patterns
-below.
-</P>
-<P>
-The <b>/I</b> modifier requests that <b>pcretest</b> output information about the
-compiled pattern (whether it is anchored, has a fixed first character, and
-so on). It does this by calling <b>pcre[16|32]_fullinfo()</b> after compiling a
-pattern. If the pattern is studied, the results of that are also output. In
-this output, the word "char" means a non-UTF character, that is, the value of a
-single data item (8-bit, 16-bit, or 32-bit, depending on the library that is
-being tested).
-</P>
-<P>
-The <b>/K</b> modifier requests <b>pcretest</b> to show names from backtracking
-control verbs that are returned from calls to <b>pcre[16|32]_exec()</b>. It causes
-<b>pcretest</b> to create a <b>pcre[16|32]_extra</b> block if one has not already
-been created by a call to <b>pcre[16|32]_study()</b>, and to set the
-PCRE_EXTRA_MARK flag and the <b>mark</b> field within it, every time that
-<b>pcre[16|32]_exec()</b> is called. If the variable that the <b>mark</b> field
-points to is non-NULL for a match, non-match, or partial match, <b>pcretest</b>
-prints the string to which it points. For a match, this is shown on a line by
-itself, tagged with "MK:". For a non-match it is added to the message.
-</P>
-<P>
-The <b>/L</b> modifier must be followed directly by the name of a locale, for
-example,
-<pre>
-  /pattern/Lfr_FR
-</pre>
-For this reason, it must be the last modifier. The given locale is set,
-<b>pcre[16|32]_maketables()</b> is called to build a set of character tables for
-the locale, and this is then passed to <b>pcre[16|32]_compile()</b> when compiling
-the regular expression. Without an <b>/L</b> (or <b>/T</b>) modifier, NULL is
-passed as the tables pointer; that is, <b>/L</b> applies only to the expression
-on which it appears.
-</P>
-<P>
-The <b>/M</b> modifier causes the size in bytes of the memory block used to hold
-the compiled pattern to be output. This does not include the size of the
-<b>pcre[16|32]</b> block; it is just the actual compiled data. If the pattern is
-successfully studied with the PCRE_STUDY_JIT_COMPILE option, the size of the
-JIT compiled code is also output.
-</P>
-<P>
-The <b>/Q</b> modifier is used to test the use of <b>pcre_stack_guard</b>. It
-must be followed by '0' or '1', specifying the return code to be given from an
-external function that is passed to PCRE and used for stack checking during
-compilation (see the
-<a href="pcreapi.html"><b>pcreapi</b></a>
-documentation for details).
-</P>
-<P>
-The <b>/S</b> modifier causes <b>pcre[16|32]_study()</b> to be called after the
-expression has been compiled, and the results used when the expression is
-matched. There are a number of qualifying characters that may follow <b>/S</b>.
-They may appear in any order.
-</P>
-<P>
-If <b>/S</b> is followed by an exclamation mark, <b>pcre[16|32]_study()</b> is
-called with the PCRE_STUDY_EXTRA_NEEDED option, causing it always to return a
-<b>pcre_extra</b> block, even when studying discovers no useful information.
-</P>
-<P>
-If <b>/S</b> is followed by a second S character, it suppresses studying, even
-if it was requested externally by the <b>-s</b> command line option. This makes
-it possible to specify that certain patterns are always studied, and others are
-never studied, independently of <b>-s</b>. This feature is used in the test
-files in a few cases where the output is different when the pattern is studied.
-</P>
-<P>
-If the <b>/S</b> modifier is followed by a + character, the call to
-<b>pcre[16|32]_study()</b> is made with all the JIT study options, requesting
-just-in-time optimization support if it is available, for both normal and
-partial matching. If you want to restrict the JIT compiling modes, you can
-follow <b>/S+</b> with a digit in the range 1 to 7:
-<pre>
-  1  normal match only
-  2  soft partial match only
-  3  normal match and soft partial match
-  4  hard partial match only
-  6  soft and hard partial match
-  7  all three modes (default)
-</pre>
-If <b>/S++</b> is used instead of <b>/S+</b> (with or without a following digit),
-the text "(JIT)" is added to the first output line after a match or no match
-when JIT-compiled code was actually used.
-</P>
-<P>
-Note that there is also an independent <b>/+</b> modifier; it must not be given
-immediately after <b>/S</b> or <b>/S+</b> because this will be misinterpreted.
-</P>
-<P>
-If JIT studying is successful, the compiled JIT code will automatically be used
-when <b>pcre[16|32]_exec()</b> is run, except when incompatible run-time options
-are specified. For more details, see the
-<a href="pcrejit.html"><b>pcrejit</b></a>
-documentation. See also the <b>\J</b> escape sequence below for a way of
-setting the size of the JIT stack.
-</P>
-<P>
-Finally, if <b>/S</b> is followed by a minus character, JIT compilation is
-suppressed, even if it was requested externally by the <b>-s</b> command line
-option. This makes it possible to specify that JIT is never to be used for
-certain patterns.
-</P>
-<P>
-The <b>/T</b> modifier must be followed by a single digit. It causes a specific
-set of built-in character tables to be passed to <b>pcre[16|32]_compile()</b>. It
-is used in the standard PCRE tests to check behaviour with different character
-tables. The digit specifies the tables as follows:
-<pre>
-  0   the default ASCII tables, as distributed in
-        pcre_chartables.c.dist
-  1   a set of tables defining ISO 8859 characters
-</pre>
-In table 1, some characters whose codes are greater than 128 are identified as
-letters, digits, spaces, etc.
-</P>
-<br><b>
-Using the POSIX wrapper API
-</b><br>
-<P>
-The <b>/P</b> modifier causes <b>pcretest</b> to call PCRE via the POSIX wrapper
-API rather than its native API. This supports only the 8-bit library. When
-<b>/P</b> is set, the following modifiers set options for the <b>regcomp()</b>
-function:
-<pre>
-  /i    REG_ICASE
-  /m    REG_NEWLINE
-  /N    REG_NOSUB
-  /s    REG_DOTALL     )
-  /U    REG_UNGREEDY   ) These options are not part of
-  /W    REG_UCP        )   the POSIX standard
-  /8    REG_UTF8       )
-</pre>
-The <b>/+</b> modifier works as described above. All other modifiers are
-ignored.
-</P>
-<br><b>
-Locking out certain modifiers
-</b><br>
-<P>
-PCRE can be compiled with or without support for certain features such as
-UTF-8/16/32 or Unicode properties. Accordingly, the standard tests are split up
-into a number of different files that are selected for running depending on
-which features are available. When updating the tests, it is all too easy to
-put a new test into the wrong file by mistake; for example, to put a test that
-requires UTF support into a file that is used when it is not available. To help
-detect such mistakes as early as possible, there is a facility for locking out
-specific modifiers. If an input line for <b>pcretest</b> starts with the string
-"&#60; forbid " the following sequence of characters is taken as a list of
-forbidden modifiers. For example, in the test files that must not use UTF or
-Unicode property support, this line appears:
-<pre>
-  &#60; forbid 8W
-</pre>
-This locks out the /8 and /W modifiers. An immediate error is given if they are
-subsequently encountered. If the character string contains &#60; but not &#62;, all the
-multi-character modifiers that begin with &#60; are locked out. Otherwise, such
-modifiers must be explicitly listed, for example:
-<pre>
-  &#60; forbid &#60;JS&#62;&#60;cr&#62;
-</pre>
-There must be a single space between &#60; and "forbid" for this feature to be
-recognised. If there is not, the line is interpreted either as a request to
-re-load a pre-compiled pattern (see "SAVING AND RELOADING COMPILED PATTERNS"
-below) or, if there is a another &#60; character, as a pattern that uses &#60; as its
-delimiter.
-</P>
-<br><a name="SEC7" href="#TOC1">DATA LINES</a><br>
-<P>
-Before each data line is passed to <b>pcre[16|32]_exec()</b>, leading and trailing
-white space is removed, and it is then scanned for \ escapes. Some of these
-are pretty esoteric features, intended for checking out some of the more
-complicated features of PCRE. If you are just testing "ordinary" regular
-expressions, you probably don't need any of these. The following escapes are
-recognized:
-<pre>
-  \a         alarm (BEL, \x07)
-  \b         backspace (\x08)
-  \e         escape (\x27)
-  \f         form feed (\x0c)
-  \n         newline (\x0a)
-  \qdd       set the PCRE_MATCH_LIMIT limit to dd (any number of digits)
-  \r         carriage return (\x0d)
-  \t         tab (\x09)
-  \v         vertical tab (\x0b)
-  \nnn       octal character (up to 3 octal digits); always
-               a byte unless &#62; 255 in UTF-8 or 16-bit or 32-bit mode
-  \o{dd...}  octal character (any number of octal digits}
-  \xhh       hexadecimal byte (up to 2 hex digits)
-  \x{hh...}  hexadecimal character (any number of hex digits)
-  \A         pass the PCRE_ANCHORED option to <b>pcre[16|32]_exec()</b> or <b>pcre[16|32]_dfa_exec()</b>
-  \B         pass the PCRE_NOTBOL option to <b>pcre[16|32]_exec()</b> or <b>pcre[16|32]_dfa_exec()</b>
-  \Cdd       call pcre[16|32]_copy_substring() for substring dd after a successful match (number less than 32)
-  \Cname     call pcre[16|32]_copy_named_substring() for substring "name" after a successful match (name termin-
-               ated by next non alphanumeric character)
-  \C+        show the current captured substrings at callout time
-  \C-        do not supply a callout function
-  \C!n       return 1 instead of 0 when callout number n is reached
-  \C!n!m     return 1 instead of 0 when callout number n is reached for the nth time
-  \C*n       pass the number n (may be negative) as callout data; this is used as the callout return value
-  \D         use the <b>pcre[16|32]_dfa_exec()</b> match function
-  \F         only shortest match for <b>pcre[16|32]_dfa_exec()</b>
-  \Gdd       call pcre[16|32]_get_substring() for substring dd after a successful match (number less than 32)
-  \Gname     call pcre[16|32]_get_named_substring() for substring "name" after a successful match (name termin-
-               ated by next non-alphanumeric character)
-  \Jdd       set up a JIT stack of dd kilobytes maximum (any number of digits)
-  \L         call pcre[16|32]_get_substringlist() after a successful match
-  \M         discover the minimum MATCH_LIMIT and MATCH_LIMIT_RECURSION settings
-  \N         pass the PCRE_NOTEMPTY option to <b>pcre[16|32]_exec()</b> or <b>pcre[16|32]_dfa_exec()</b>; if used twice, pass the
-               PCRE_NOTEMPTY_ATSTART option
-  \Odd       set the size of the output vector passed to <b>pcre[16|32]_exec()</b> to dd (any number of digits)
-  \P         pass the PCRE_PARTIAL_SOFT option to <b>pcre[16|32]_exec()</b> or <b>pcre[16|32]_dfa_exec()</b>; if used twice, pass the
-               PCRE_PARTIAL_HARD option
-  \Qdd       set the PCRE_MATCH_LIMIT_RECURSION limit to dd (any number of digits)
-  \R         pass the PCRE_DFA_RESTART option to <b>pcre[16|32]_dfa_exec()</b>
-  \S         output details of memory get/free calls during matching
-  \Y         pass the PCRE_NO_START_OPTIMIZE option to <b>pcre[16|32]_exec()</b> or <b>pcre[16|32]_dfa_exec()</b>
-  \Z         pass the PCRE_NOTEOL option to <b>pcre[16|32]_exec()</b> or <b>pcre[16|32]_dfa_exec()</b>
-  \?         pass the PCRE_NO_UTF[8|16|32]_CHECK option to <b>pcre[16|32]_exec()</b> or <b>pcre[16|32]_dfa_exec()</b>
-  \&#62;dd       start the match at offset dd (optional "-"; then any number of digits); this sets the <i>startoffset</i>
-               argument for <b>pcre[16|32]_exec()</b> or <b>pcre[16|32]_dfa_exec()</b>
-  \&#60;cr&#62;      pass the PCRE_NEWLINE_CR option to <b>pcre[16|32]_exec()</b> or <b>pcre[16|32]_dfa_exec()</b>
-  \&#60;lf&#62;      pass the PCRE_NEWLINE_LF option to <b>pcre[16|32]_exec()</b> or <b>pcre[16|32]_dfa_exec()</b>
-  \&#60;crlf&#62;    pass the PCRE_NEWLINE_CRLF option to <b>pcre[16|32]_exec()</b> or <b>pcre[16|32]_dfa_exec()</b>
-  \&#60;anycrlf&#62; pass the PCRE_NEWLINE_ANYCRLF option to <b>pcre[16|32]_exec()</b> or <b>pcre[16|32]_dfa_exec()</b>
-  \&#60;any&#62;     pass the PCRE_NEWLINE_ANY option to <b>pcre[16|32]_exec()</b> or <b>pcre[16|32]_dfa_exec()</b>
-</pre>
-The use of \x{hh...} is not dependent on the use of the <b>/8</b> modifier on
-the pattern. It is recognized always. There may be any number of hexadecimal
-digits inside the braces; invalid values provoke error messages.
-</P>
-<P>
-Note that \xhh specifies one byte rather than one character in UTF-8 mode;
-this makes it possible to construct invalid UTF-8 sequences for testing
-purposes. On the other hand, \x{hh} is interpreted as a UTF-8 character in
-UTF-8 mode, generating more than one byte if the value is greater than 127.
-When testing the 8-bit library not in UTF-8 mode, \x{hh} generates one byte
-for values less than 256, and causes an error for greater values.
-</P>
-<P>
-In UTF-16 mode, all 4-digit \x{hhhh} values are accepted. This makes it
-possible to construct invalid UTF-16 sequences for testing purposes.
-</P>
-<P>
-In UTF-32 mode, all 4- to 8-digit \x{...} values are accepted. This makes it
-possible to construct invalid UTF-32 sequences for testing purposes.
-</P>
-<P>
-The escapes that specify line ending sequences are literal strings, exactly as
-shown. No more than one newline setting should be present in any data line.
-</P>
-<P>
-A backslash followed by anything else just escapes the anything else. If
-the very last character is a backslash, it is ignored. This gives a way of
-passing an empty line as data, since a real empty line terminates the data
-input.
-</P>
-<P>
-The <b>\J</b> escape provides a way of setting the maximum stack size that is
-used by the just-in-time optimization code. It is ignored if JIT optimization
-is not being used. Providing a stack that is larger than the default 32K is
-necessary only for very complicated patterns.
-</P>
-<P>
-If \M is present, <b>pcretest</b> calls <b>pcre[16|32]_exec()</b> several times,
-with different values in the <i>match_limit</i> and <i>match_limit_recursion</i>
-fields of the <b>pcre[16|32]_extra</b> data structure, until it finds the minimum
-numbers for each parameter that allow <b>pcre[16|32]_exec()</b> to complete without
-error. Because this is testing a specific feature of the normal interpretive
-<b>pcre[16|32]_exec()</b> execution, the use of any JIT optimization that might
-have been set up by the <b>/S+</b> qualifier of <b>-s+</b> option is disabled.
-</P>
-<P>
-The <i>match_limit</i> number is a measure of the amount of backtracking
-that takes place, and checking it out can be instructive. For most simple
-matches, the number is quite small, but for patterns with very large numbers of
-matching possibilities, it can become large very quickly with increasing length
-of subject string. The <i>match_limit_recursion</i> number is a measure of how
-much stack (or, if PCRE is compiled with NO_RECURSE, how much heap) memory is
-needed to complete the match attempt.
-</P>
-<P>
-When \O is used, the value specified may be higher or lower than the size set
-by the <b>-O</b> command line option (or defaulted to 45); \O applies only to
-the call of <b>pcre[16|32]_exec()</b> for the line in which it appears.
-</P>
-<P>
-If the <b>/P</b> modifier was present on the pattern, causing the POSIX wrapper
-API to be used, the only option-setting sequences that have any effect are \B,
-\N, and \Z, causing REG_NOTBOL, REG_NOTEMPTY, and REG_NOTEOL, respectively,
-to be passed to <b>regexec()</b>.
-</P>
-<br><a name="SEC8" href="#TOC1">THE ALTERNATIVE MATCHING FUNCTION</a><br>
-<P>
-By default, <b>pcretest</b> uses the standard PCRE matching function,
-<b>pcre[16|32]_exec()</b> to match each data line. PCRE also supports an
-alternative matching function, <b>pcre[16|32]_dfa_test()</b>, which operates in a
-different way, and has some restrictions. The differences between the two
-functions are described in the
-<a href="pcrematching.html"><b>pcrematching</b></a>
-documentation.
-</P>
-<P>
-If a data line contains the \D escape sequence, or if the command line
-contains the <b>-dfa</b> option, the alternative matching function is used.
-This function finds all possible matches at a given point. If, however, the \F
-escape sequence is present in the data line, it stops after the first match is
-found. This is always the shortest possible match.
-</P>
-<br><a name="SEC9" href="#TOC1">DEFAULT OUTPUT FROM PCRETEST</a><br>
-<P>
-This section describes the output when the normal matching function,
-<b>pcre[16|32]_exec()</b>, is being used.
-</P>
-<P>
-When a match succeeds, <b>pcretest</b> outputs the list of captured substrings
-that <b>pcre[16|32]_exec()</b> returns, starting with number 0 for the string that
-matched the whole pattern. Otherwise, it outputs "No match" when the return is
-PCRE_ERROR_NOMATCH, and "Partial match:" followed by the partially matching
-substring when <b>pcre[16|32]_exec()</b> returns PCRE_ERROR_PARTIAL. (Note that
-this is the entire substring that was inspected during the partial match; it
-may include characters before the actual match start if a lookbehind assertion,
-\K, \b, or \B was involved.) For any other return, <b>pcretest</b> outputs
-the PCRE negative error number and a short descriptive phrase. If the error is
-a failed UTF string check, the offset of the start of the failing character and
-the reason code are also output, provided that the size of the output vector is
-at least two. Here is an example of an interactive <b>pcretest</b> run.
-<pre>
-  $ pcretest
-  PCRE version 8.13 2011-04-30
-
-    re&#62; /^abc(\d+)/
-  data&#62; abc123
-   0: abc123
-   1: 123
-  data&#62; xyz
-  No match
-</pre>
-Unset capturing substrings that are not followed by one that is set are not
-returned by <b>pcre[16|32]_exec()</b>, and are not shown by <b>pcretest</b>. In the
-following example, there are two capturing substrings, but when the first data
-line is matched, the second, unset substring is not shown. An "internal" unset
-substring is shown as "&#60;unset&#62;", as for the second data line.
-<pre>
-    re&#62; /(a)|(b)/
-  data&#62; a
-   0: a
-   1: a
-  data&#62; b
-   0: b
-   1: &#60;unset&#62;
-   2: b
-</pre>
-If the strings contain any non-printing characters, they are output as \xhh
-escapes if the value is less than 256 and UTF mode is not set. Otherwise they
-are output as \x{hh...} escapes. See below for the definition of non-printing
-characters. If the pattern has the <b>/+</b> modifier, the output for substring
-0 is followed by the the rest of the subject string, identified by "0+" like
-this:
-<pre>
-    re&#62; /cat/+
-  data&#62; cataract
-   0: cat
-   0+ aract
-</pre>
-If the pattern has the <b>/g</b> or <b>/G</b> modifier, the results of successive
-matching attempts are output in sequence, like this:
-<pre>
-    re&#62; /\Bi(\w\w)/g
-  data&#62; Mississippi
-   0: iss
-   1: ss
-   0: iss
-   1: ss
-   0: ipp
-   1: pp
-</pre>
-"No match" is output only if the first match attempt fails. Here is an example
-of a failure message (the offset 4 that is specified by \&#62;4 is past the end of
-the subject string):
-<pre>
-    re&#62; /xyz/
-  data&#62; xyz\&#62;4
-  Error -24 (bad offset value)
-</PRE>
-</P>
-<P>
-If any of the sequences <b>\C</b>, <b>\G</b>, or <b>\L</b> are present in a
-data line that is successfully matched, the substrings extracted by the
-convenience functions are output with C, G, or L after the string number
-instead of a colon. This is in addition to the normal full list. The string
-length (that is, the return from the extraction function) is given in
-parentheses after each string for <b>\C</b> and <b>\G</b>.
-</P>
-<P>
-Note that whereas patterns can be continued over several lines (a plain "&#62;"
-prompt is used for continuations), data lines may not. However newlines can be
-included in data by means of the \n escape (or \r, \r\n, etc., depending on
-the newline sequence setting).
-</P>
-<br><a name="SEC10" href="#TOC1">OUTPUT FROM THE ALTERNATIVE MATCHING FUNCTION</a><br>
-<P>
-When the alternative matching function, <b>pcre[16|32]_dfa_exec()</b>, is used (by
-means of the \D escape sequence or the <b>-dfa</b> command line option), the
-output consists of a list of all the matches that start at the first point in
-the subject where there is at least one match. For example:
-<pre>
-    re&#62; /(tang|tangerine|tan)/
-  data&#62; yellow tangerine\D
-   0: tangerine
-   1: tang
-   2: tan
-</pre>
-(Using the normal matching function on this data finds only "tang".) The
-longest matching string is always given first (and numbered zero). After a
-PCRE_ERROR_PARTIAL return, the output is "Partial match:", followed by the
-partially matching substring. (Note that this is the entire substring that was
-inspected during the partial match; it may include characters before the actual
-match start if a lookbehind assertion, \K, \b, or \B was involved.)
-</P>
-<P>
-If <b>/g</b> is present on the pattern, the search for further matches resumes
-at the end of the longest match. For example:
-<pre>
-    re&#62; /(tang|tangerine|tan)/g
-  data&#62; yellow tangerine and tangy sultana\D
-   0: tangerine
-   1: tang
-   2: tan
-   0: tang
-   1: tan
-   0: tan
-</pre>
-Since the matching function does not support substring capture, the escape
-sequences that are concerned with captured substrings are not relevant.
-</P>
-<br><a name="SEC11" href="#TOC1">RESTARTING AFTER A PARTIAL MATCH</a><br>
-<P>
-When the alternative matching function has given the PCRE_ERROR_PARTIAL return,
-indicating that the subject partially matched the pattern, you can restart the
-match with additional subject data by means of the \R escape sequence. For
-example:
-<pre>
-    re&#62; /^\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d$/
-  data&#62; 23ja\P\D
-  Partial match: 23ja
-  data&#62; n05\R\D
-   0: n05
-</pre>
-For further information about partial matching, see the
-<a href="pcrepartial.html"><b>pcrepartial</b></a>
-documentation.
-</P>
-<br><a name="SEC12" href="#TOC1">CALLOUTS</a><br>
-<P>
-If the pattern contains any callout requests, <b>pcretest</b>'s callout function
-is called during matching. This works with both matching functions. By default,
-the called function displays the callout number, the start and current
-positions in the text at the callout time, and the next pattern item to be
-tested. For example:
-<pre>
-  ---&#62;pqrabcdef
-    0    ^  ^     \d
-</pre>
-This output indicates that callout number 0 occurred for a match attempt
-starting at the fourth character of the subject string, when the pointer was at
-the seventh character of the data, and when the next pattern item was \d. Just
-one circumflex is output if the start and current positions are the same.
-</P>
-<P>
-Callouts numbered 255 are assumed to be automatic callouts, inserted as a
-result of the <b>/C</b> pattern modifier. In this case, instead of showing the
-callout number, the offset in the pattern, preceded by a plus, is output. For
-example:
-<pre>
-    re&#62; /\d?[A-E]\*/C
-  data&#62; E*
-  ---&#62;E*
-   +0 ^      \d?
-   +3 ^      [A-E]
-   +8 ^^     \*
-  +10 ^ ^
-   0: E*
-</pre>
-If a pattern contains (*MARK) items, an additional line is output whenever
-a change of latest mark is passed to the callout function. For example:
-<pre>
-    re&#62; /a(*MARK:X)bc/C
-  data&#62; abc
-  ---&#62;abc
-   +0 ^       a
-   +1 ^^      (*MARK:X)
-  +10 ^^      b
-  Latest Mark: X
-  +11 ^ ^     c
-  +12 ^  ^
-   0: abc
-</pre>
-The mark changes between matching "a" and "b", but stays the same for the rest
-of the match, so nothing more is output. If, as a result of backtracking, the
-mark reverts to being unset, the text "&#60;unset&#62;" is output.
-</P>
-<P>
-The callout function in <b>pcretest</b> returns zero (carry on matching) by
-default, but you can use a \C item in a data line (as described above) to
-change this and other parameters of the callout.
-</P>
-<P>
-Inserting callouts can be helpful when using <b>pcretest</b> to check
-complicated regular expressions. For further information about callouts, see
-the
-<a href="pcrecallout.html"><b>pcrecallout</b></a>
-documentation.
-</P>
-<br><a name="SEC13" href="#TOC1">NON-PRINTING CHARACTERS</a><br>
-<P>
-When <b>pcretest</b> is outputting text in the compiled version of a pattern,
-bytes other than 32-126 are always treated as non-printing characters are are
-therefore shown as hex escapes.
-</P>
-<P>
-When <b>pcretest</b> is outputting text that is a matched part of a subject
-string, it behaves in the same way, unless a different locale has been set for
-the pattern (using the <b>/L</b> modifier). In this case, the <b>isprint()</b>
-function to distinguish printing and non-printing characters.
-</P>
-<br><a name="SEC14" href="#TOC1">SAVING AND RELOADING COMPILED PATTERNS</a><br>
-<P>
-The facilities described in this section are not available when the POSIX
-interface to PCRE is being used, that is, when the <b>/P</b> pattern modifier is
-specified.
-</P>
-<P>
-When the POSIX interface is not in use, you can cause <b>pcretest</b> to write a
-compiled pattern to a file, by following the modifiers with &#62; and a file name.
-For example:
-<pre>
-  /pattern/im &#62;/some/file
-</pre>
-See the
-<a href="pcreprecompile.html"><b>pcreprecompile</b></a>
-documentation for a discussion about saving and re-using compiled patterns.
-Note that if the pattern was successfully studied with JIT optimization, the
-JIT data cannot be saved.
-</P>
-<P>
-The data that is written is binary. The first eight bytes are the length of the
-compiled pattern data followed by the length of the optional study data, each
-written as four bytes in big-endian order (most significant byte first). If
-there is no study data (either the pattern was not studied, or studying did not
-return any data), the second length is zero. The lengths are followed by an
-exact copy of the compiled pattern. If there is additional study data, this
-(excluding any JIT data) follows immediately after the compiled pattern. After
-writing the file, <b>pcretest</b> expects to read a new pattern.
-</P>
-<P>
-A saved pattern can be reloaded into <b>pcretest</b> by specifying &#60; and a file
-name instead of a pattern. There must be no space between &#60; and the file name,
-which must not contain a &#60; character, as otherwise <b>pcretest</b> will
-interpret the line as a pattern delimited by &#60; characters. For example:
-<pre>
-   re&#62; &#60;/some/file
-  Compiled pattern loaded from /some/file
-  No study data
-</pre>
-If the pattern was previously studied with the JIT optimization, the JIT
-information cannot be saved and restored, and so is lost. When the pattern has
-been loaded, <b>pcretest</b> proceeds to read data lines in the usual way.
-</P>
-<P>
-You can copy a file written by <b>pcretest</b> to a different host and reload it
-there, even if the new host has opposite endianness to the one on which the
-pattern was compiled. For example, you can compile on an i86 machine and run on
-a SPARC machine. When a pattern is reloaded on a host with different
-endianness, the confirmation message is changed to:
-<pre>
-  Compiled pattern (byte-inverted) loaded from /some/file
-</pre>
-The test suite contains some saved pre-compiled patterns with different
-endianness. These are reloaded using "&#60;!" instead of just "&#60;". This suppresses
-the "(byte-inverted)" text so that the output is the same on all hosts. It also
-forces debugging output once the pattern has been reloaded.
-</P>
-<P>
-File names for saving and reloading can be absolute or relative, but note that
-the shell facility of expanding a file name that starts with a tilde (~) is not
-available.
-</P>
-<P>
-The ability to save and reload files in <b>pcretest</b> is intended for testing
-and experimentation. It is not intended for production use because only a
-single pattern can be written to a file. Furthermore, there is no facility for
-supplying custom character tables for use with a reloaded pattern. If the
-original pattern was compiled with custom tables, an attempt to match a subject
-string using a reloaded pattern is likely to cause <b>pcretest</b> to crash.
-Finally, if you attempt to load a file that is not in the correct format, the
-result is undefined.
-</P>
-<br><a name="SEC15" href="#TOC1">SEE ALSO</a><br>
-<P>
-<b>pcre</b>(3), <b>pcre16</b>(3), <b>pcre32</b>(3), <b>pcreapi</b>(3),
-<b>pcrecallout</b>(3),
-<b>pcrejit</b>, <b>pcrematching</b>(3), <b>pcrepartial</b>(d),
-<b>pcrepattern</b>(3), <b>pcreprecompile</b>(3).
-</P>
-<br><a name="SEC16" href="#TOC1">AUTHOR</a><br>
-<P>
-Philip Hazel
-<br>
-University Computing Service
-<br>
-Cambridge CB2 3QH, England.
-<br>
-</P>
-<br><a name="SEC17" href="#TOC1">REVISION</a><br>
-<P>
-Last updated: 09 February 2014
-<br>
-Copyright &copy; 1997-2014 University of Cambridge.
-<br>
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
diff --git a/dist/doc/html/pcreunicode.html b/dist/doc/html/pcreunicode.html
deleted file mode 100644
index ab36bc6..0000000
--- a/dist/doc/html/pcreunicode.html
+++ /dev/null
@@ -1,262 +0,0 @@
-<html>
-<head>
-<title>pcreunicode specification</title>
-</head>
-<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
-<h1>pcreunicode man page</h1>
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
-<p>
-This page is part of the PCRE HTML documentation. It was generated automatically
-from the original man page. If there is any nonsense in it, please consult the
-man page, in case the conversion went wrong.
-<br>
-<br><b>
-UTF-8, UTF-16, UTF-32, AND UNICODE PROPERTY SUPPORT
-</b><br>
-<P>
-As well as UTF-8 support, PCRE also supports UTF-16 (from release 8.30) and
-UTF-32 (from release 8.32), by means of two additional libraries. They can be
-built as well as, or instead of, the 8-bit library.
-</P>
-<br><b>
-UTF-8 SUPPORT
-</b><br>
-<P>
-In order process UTF-8 strings, you must build PCRE's 8-bit library with UTF
-support, and, in addition, you must call
-<a href="pcre_compile.html"><b>pcre_compile()</b></a>
-with the PCRE_UTF8 option flag, or the pattern must start with the sequence
-(*UTF8) or (*UTF). When either of these is the case, both the pattern and any
-subject strings that are matched against it are treated as UTF-8 strings
-instead of strings of individual 1-byte characters.
-</P>
-<br><b>
-UTF-16 AND UTF-32 SUPPORT
-</b><br>
-<P>
-In order process UTF-16 or UTF-32 strings, you must build PCRE's 16-bit or
-32-bit library with UTF support, and, in addition, you must call
-<a href="pcre16_compile.html"><b>pcre16_compile()</b></a>
-or
-<a href="pcre32_compile.html"><b>pcre32_compile()</b></a>
-with the PCRE_UTF16 or PCRE_UTF32 option flag, as appropriate. Alternatively,
-the pattern must start with the sequence (*UTF16), (*UTF32), as appropriate, or
-(*UTF), which can be used with either library. When UTF mode is set, both the
-pattern and any subject strings that are matched against it are treated as
-UTF-16 or UTF-32 strings instead of strings of individual 16-bit or 32-bit
-characters.
-</P>
-<br><b>
-UTF SUPPORT OVERHEAD
-</b><br>
-<P>
-If you compile PCRE with UTF 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_UTF[8|16|32] flag occasionally, so should not be very big.
-</P>
-<br><b>
-UNICODE PROPERTY SUPPORT
-</b><br>
-<P>
-If PCRE is built with Unicode character property support (which implies UTF
-support), the escape sequences \p{..}, \P{..}, and \X can be used.
-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, the Unicode script names such as Arabic or Han, and the derived
-properties Any and L&. Full lists is given in the
-<a href="pcrepattern.html"><b>pcrepattern</b></a>
-and
-<a href="pcresyntax.html"><b>pcresyntax</b></a>
-documentation. Only the short names for properties are supported. For example,
-\p{L} matches a letter. Its Perl synonym, \p{Letter}, is not supported.
-Furthermore, in Perl, many properties may optionally be prefixed by "Is", for
-compatibility with Perl 5.6. PCRE does not support this.
-<a name="utf8strings"></a></P>
-<br><b>
-Validity of UTF-8 strings
-</b><br>
-<P>
-When you set the PCRE_UTF8 flag, the byte strings passed as patterns and
-subjects are (by default) checked for validity on entry to the relevant
-functions. The entire string is checked before any other processing takes
-place. From release 7.3 of PCRE, the check is according the rules of RFC 3629,
-which are themselves derived from the Unicode specification. Earlier releases
-of PCRE followed the rules of RFC 2279, which allows the full range of 31-bit
-values (0 to 0x7FFFFFFF). The current check allows only values in the range U+0
-to U+10FFFF, excluding the surrogate area. (From release 8.33 the so-called
-"non-character" code points are no longer excluded because Unicode corrigendum
-#9 makes it clear that they should not be.)
-</P>
-<P>
-Characters in the "Surrogate Area" of Unicode are reserved for use by UTF-16,
-where they are used in pairs to encode codepoints with values greater than
-0xFFFF. The code points that are encoded by UTF-16 pairs are available
-independently in the UTF-8 and UTF-32 encodings. (In other words, the whole
-surrogate thing is a fudge for UTF-16 which unfortunately messes up UTF-8 and
-UTF-32.)
-</P>
-<P>
-If an invalid UTF-8 string is passed to PCRE, an error return is given. At
-compile time, the only additional information is the offset to the first byte
-of the failing character. The run-time functions <b>pcre_exec()</b> and
-<b>pcre_dfa_exec()</b> also pass back this information, as well as a more
-detailed reason code if the caller has provided memory in which to do this.
-</P>
-<P>
-In some situations, you may already know that your strings are valid, and
-therefore want to skip these checks in order to improve performance, for
-example in the case of a long subject string that is being scanned repeatedly.
-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.
-</P>
-<P>
-Note that passing PCRE_NO_UTF8_CHECK to <b>pcre_compile()</b> just disables the
-check for the pattern; it does not also apply to subject strings. If you want
-to disable the check for a subject string you must pass this option to
-<b>pcre_exec()</b> or <b>pcre_dfa_exec()</b>.
-</P>
-<P>
-If you pass an invalid UTF-8 string when PCRE_NO_UTF8_CHECK is set, the result
-is undefined and your program may crash.
-<a name="utf16strings"></a></P>
-<br><b>
-Validity of UTF-16 strings
-</b><br>
-<P>
-When you set the PCRE_UTF16 flag, the strings of 16-bit data units that are
-passed as patterns and subjects are (by default) checked for validity on entry
-to the relevant functions. Values other than those in the surrogate range
-U+D800 to U+DFFF are independent code points. Values in the surrogate range
-must be used in pairs in the correct manner.
-</P>
-<P>
-If an invalid UTF-16 string is passed to PCRE, an error return is given. At
-compile time, the only additional information is the offset to the first data
-unit of the failing character. The run-time functions <b>pcre16_exec()</b> and
-<b>pcre16_dfa_exec()</b> also pass back this information, as well as a more
-detailed reason code if the caller has provided memory in which to do this.
-</P>
-<P>
-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_UTF16_CHECK flag at compile time or at run time, PCRE assumes that
-the pattern or subject it is given (respectively) contains only valid UTF-16
-sequences. In this case, it does not diagnose an invalid UTF-16 string.
-However, if an invalid string is passed, the result is undefined.
-<a name="utf32strings"></a></P>
-<br><b>
-Validity of UTF-32 strings
-</b><br>
-<P>
-When you set the PCRE_UTF32 flag, the strings of 32-bit data units that are
-passed as patterns and subjects are (by default) checked for validity on entry
-to the relevant functions.  This check allows only values in the range U+0
-to U+10FFFF, excluding the surrogate area U+D800 to U+DFFF.
-</P>
-<P>
-If an invalid UTF-32 string is passed to PCRE, an error return is given. At
-compile time, the only additional information is the offset to the first data
-unit of the failing character. The run-time functions <b>pcre32_exec()</b> and
-<b>pcre32_dfa_exec()</b> also pass back this information, as well as a more
-detailed reason code if the caller has provided memory in which to do this.
-</P>
-<P>
-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_UTF32_CHECK flag at compile time or at run time, PCRE assumes that
-the pattern or subject it is given (respectively) contains only valid UTF-32
-sequences. In this case, it does not diagnose an invalid UTF-32 string.
-However, if an invalid string is passed, the result is undefined.
-</P>
-<br><b>
-General comments about UTF modes
-</b><br>
-<P>
-1. Codepoints less than 256 can be specified in patterns by either braced or
-unbraced hexadecimal escape sequences (for example, \x{b3} or \xb3). Larger
-values have to use braced sequences.
-</P>
-<P>
-2. Octal numbers up to \777 are recognized, and in UTF-8 mode they match
-two-byte characters for values greater than \177.
-</P>
-<P>
-3. Repeat quantifiers apply to complete UTF characters, not to individual
-data units, for example: \x{100}{3}.
-</P>
-<P>
-4. The dot metacharacter matches one UTF character instead of a single data
-unit.
-</P>
-<P>
-5. The escape sequence \C can be used to match a single byte in UTF-8 mode, or
-a single 16-bit data unit in UTF-16 mode, or a single 32-bit data unit in
-UTF-32 mode, but its use can lead to some strange effects because it breaks up
-multi-unit characters (see the description of \C in the
-<a href="pcrepattern.html"><b>pcrepattern</b></a>
-documentation). The use of \C is not supported in the alternative matching
-function <b>pcre[16|32]_dfa_exec()</b>, nor is it supported in UTF mode by the
-JIT optimization of <b>pcre[16|32]_exec()</b>. If JIT optimization is requested
-for a UTF pattern that contains \C, it will not succeed, and so the matching
-will be carried out by the normal interpretive function.
-</P>
-<P>
-6. The character escapes \b, \B, \d, \D, \s, \S, \w, and \W correctly
-test characters of any code value, but, by default, the characters that PCRE
-recognizes as digits, spaces, or word characters remain the same set as in
-non-UTF mode, all with values less than 256. This remains true even when PCRE
-is built to include Unicode property support, because to do otherwise would
-slow down PCRE in many common cases. Note in particular that this applies to
-\b and \B, because they are defined in terms of \w and \W. If you really
-want to test for a wider sense of, say, "digit", you can use explicit Unicode
-property tests such as \p{Nd}. Alternatively, if you set the PCRE_UCP option,
-the way that the character escapes work is changed so that Unicode properties
-are used to determine which characters match. There are more details in the
-section on
-<a href="pcrepattern.html#genericchartypes">generic character types</a>
-in the
-<a href="pcrepattern.html"><b>pcrepattern</b></a>
-documentation.
-</P>
-<P>
-7. Similarly, characters that match the POSIX named character classes are all
-low-valued characters, unless the PCRE_UCP option is set.
-</P>
-<P>
-8. However, the horizontal and vertical white space matching escapes (\h, \H,
-\v, and \V) do match all the appropriate Unicode characters, whether or not
-PCRE_UCP is set.
-</P>
-<P>
-9. Case-insensitive matching applies only to characters whose values are less
-than 128, unless PCRE is built with Unicode property support. A few Unicode
-characters such as Greek sigma have more than two codepoints that are
-case-equivalent. Up to and including PCRE release 8.31, only one-to-one case
-mappings were supported, but later releases (with Unicode property support) do
-treat as case-equivalent all versions of characters such as Greek sigma.
-</P>
-<br><b>
-AUTHOR
-</b><br>
-<P>
-Philip Hazel
-<br>
-University Computing Service
-<br>
-Cambridge CB2 3QH, England.
-<br>
-</P>
-<br><b>
-REVISION
-</b><br>
-<P>
-Last updated: 27 February 2013
-<br>
-Copyright &copy; 1997-2013 University of Cambridge.
-<br>
-<p>
-Return to the <a href="index.html">PCRE index page</a>.
-</p>
diff --git a/dist/doc/index.html.src b/dist/doc/index.html.src
deleted file mode 100644
index 887f4d7..0000000
--- a/dist/doc/index.html.src
+++ /dev/null
@@ -1,185 +0,0 @@
-<html>
-<!-- This is a manually maintained file that is the root of the HTML version of 
-     the PCRE documentation. When the HTML documents are built from the man 
-     page versions, the entire doc/html directory is emptied, this file is then 
-     copied into doc/html/index.html, and the remaining files therein are 
-     created by the 132html script.
--->      
-<head>
-<title>PCRE specification</title>
-</head>
-<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
-<h1>Perl-compatible Regular Expressions (PCRE)</h1>
-<p>
-The HTML documentation for PCRE consists of a number of pages that are listed
-below in alphabetical order. If you are new to PCRE, please read the first one
-first.
-</p>
-
-<table>
-<tr><td><a href="pcre.html">pcre</a></td>
-    <td>&nbsp;&nbsp;Introductory page</td></tr>
-
-<tr><td><a href="pcre-config.html">pcre-config</a></td>
-    <td>&nbsp;&nbsp;Information about the installation configuration</td></tr>
-
-<tr><td><a href="pcre16.html">pcre16</a></td>
-    <td>&nbsp;&nbsp;Discussion of the 16-bit PCRE library</td></tr>
-
-<tr><td><a href="pcre32.html">pcre32</a></td>
-    <td>&nbsp;&nbsp;Discussion of the 32-bit PCRE library</td></tr>
-
-<tr><td><a href="pcreapi.html">pcreapi</a></td>
-    <td>&nbsp;&nbsp;PCRE's native API</td></tr>
-
-<tr><td><a href="pcrebuild.html">pcrebuild</a></td>
-    <td>&nbsp;&nbsp;Building PCRE</td></tr>
-
-<tr><td><a href="pcrecallout.html">pcrecallout</a></td>
-    <td>&nbsp;&nbsp;The <i>callout</i> facility</td></tr>
-
-<tr><td><a href="pcrecompat.html">pcrecompat</a></td>
-    <td>&nbsp;&nbsp;Compability with Perl</td></tr>
-
-<tr><td><a href="pcrecpp.html">pcrecpp</a></td>
-    <td>&nbsp;&nbsp;The C++ wrapper for the PCRE library</td></tr>
-
-<tr><td><a href="pcredemo.html">pcredemo</a></td>
-    <td>&nbsp;&nbsp;A demonstration C program that uses the PCRE library</td></tr>
-
-<tr><td><a href="pcregrep.html">pcregrep</a></td>
-    <td>&nbsp;&nbsp;The <b>pcregrep</b> command</td></tr>
-
-<tr><td><a href="pcrejit.html">pcrejit</a></td>
-    <td>&nbsp;&nbsp;Discussion of the just-in-time optimization support</td></tr>
-
-<tr><td><a href="pcrelimits.html">pcrelimits</a></td>
-    <td>&nbsp;&nbsp;Details of size and other limits</td></tr>
-
-<tr><td><a href="pcrematching.html">pcrematching</a></td>
-    <td>&nbsp;&nbsp;Discussion of the two matching algorithms</td></tr>
-
-<tr><td><a href="pcrepartial.html">pcrepartial</a></td>
-    <td>&nbsp;&nbsp;Using PCRE for partial matching</td></tr>
-
-<tr><td><a href="pcrepattern.html">pcrepattern</a></td>
-    <td>&nbsp;&nbsp;Specification of the regular expressions supported by PCRE</td></tr>
-
-<tr><td><a href="pcreperform.html">pcreperform</a></td>
-    <td>&nbsp;&nbsp;Some comments on performance</td></tr>
-
-<tr><td><a href="pcreposix.html">pcreposix</a></td>
-    <td>&nbsp;&nbsp;The POSIX API to the PCRE 8-bit library</td></tr>
-
-<tr><td><a href="pcreprecompile.html">pcreprecompile</a></td>
-    <td>&nbsp;&nbsp;How to save and re-use compiled patterns</td></tr>
-
-<tr><td><a href="pcresample.html">pcresample</a></td>
-    <td>&nbsp;&nbsp;Discussion of the pcredemo program</td></tr>
-
-<tr><td><a href="pcrestack.html">pcrestack</a></td>
-    <td>&nbsp;&nbsp;Discussion of PCRE's stack usage</td></tr>
-
-<tr><td><a href="pcresyntax.html">pcresyntax</a></td>
-    <td>&nbsp;&nbsp;Syntax quick-reference summary</td></tr>
-
-<tr><td><a href="pcretest.html">pcretest</a></td>
-    <td>&nbsp;&nbsp;The <b>pcretest</b> command for testing PCRE</td></tr>
-
-<tr><td><a href="pcreunicode.html">pcreunicode</a></td>
-    <td>&nbsp;&nbsp;Discussion of Unicode and UTF-8/UTF-16/UTF-32 support</td></tr>
-</table>
-
-<p>
-There are also individual pages that summarize the interface for each function
-in the library. There is a single page for each triple of 8-bit/16-bit/32-bit
-functions.
-</p>
-
-<table>    
-
-<tr><td><a href="pcre_assign_jit_stack.html">pcre_assign_jit_stack</a></td>
-    <td>&nbsp;&nbsp;Assign stack for JIT matching</td></tr>
-
-<tr><td><a href="pcre_compile.html">pcre_compile</a></td>
-    <td>&nbsp;&nbsp;Compile a regular expression</td></tr>
-
-<tr><td><a href="pcre_compile2.html">pcre_compile2</a></td>
-    <td>&nbsp;&nbsp;Compile a regular expression (alternate interface)</td></tr>
-
-<tr><td><a href="pcre_config.html">pcre_config</a></td>
-    <td>&nbsp;&nbsp;Show build-time configuration options</td></tr>
-
-<tr><td><a href="pcre_copy_named_substring.html">pcre_copy_named_substring</a></td>
-    <td>&nbsp;&nbsp;Extract named substring into given buffer</td></tr>
-
-<tr><td><a href="pcre_copy_substring.html">pcre_copy_substring</a></td>
-    <td>&nbsp;&nbsp;Extract numbered substring into given buffer</td></tr>
-
-<tr><td><a href="pcre_dfa_exec.html">pcre_dfa_exec</a></td>
-    <td>&nbsp;&nbsp;Match a compiled pattern to a subject string
-    (DFA algorithm; <i>not</i> Perl compatible)</td></tr>
-
-<tr><td><a href="pcre_exec.html">pcre_exec</a></td>
-    <td>&nbsp;&nbsp;Match a compiled pattern to a subject string
-    (Perl compatible)</td></tr>
-
-<tr><td><a href="pcre_free_study.html">pcre_free_study</a></td>
-    <td>&nbsp;&nbsp;Free study data</td></tr>
-
-<tr><td><a href="pcre_free_substring.html">pcre_free_substring</a></td>
-    <td>&nbsp;&nbsp;Free extracted substring</td></tr>
-
-<tr><td><a href="pcre_free_substring_list.html">pcre_free_substring_list</a></td>
-    <td>&nbsp;&nbsp;Free list of extracted substrings</td></tr>
-
-<tr><td><a href="pcre_fullinfo.html">pcre_fullinfo</a></td>
-    <td>&nbsp;&nbsp;Extract information about a pattern</td></tr>
-
-<tr><td><a href="pcre_get_named_substring.html">pcre_get_named_substring</a></td>
-    <td>&nbsp;&nbsp;Extract named substring into new memory</td></tr>
-
-<tr><td><a href="pcre_get_stringnumber.html">pcre_get_stringnumber</a></td>
-    <td>&nbsp;&nbsp;Convert captured string name to number</td></tr>
-
-<tr><td><a href="pcre_get_stringtable_entries.html">pcre_get_stringtable_entries</a></td>
-    <td>&nbsp;&nbsp;Find table entries for given string name</td></tr>
-
-<tr><td><a href="pcre_get_substring.html">pcre_get_substring</a></td>
-    <td>&nbsp;&nbsp;Extract numbered substring into new memory</td></tr>
-
-<tr><td><a href="pcre_get_substring_list.html">pcre_get_substring_list</a></td>
-    <td>&nbsp;&nbsp;Extract all substrings into new memory</td></tr>
-
-<tr><td><a href="pcre_jit_exec.html">pcre_jit_exec</a></td>
-    <td>&nbsp;&nbsp;Fast path interface to JIT matching</td></tr>
-
-<tr><td><a href="pcre_jit_stack_alloc.html">pcre_jit_stack_alloc</a></td>
-    <td>&nbsp;&nbsp;Create a stack for JIT matching</td></tr>
-
-<tr><td><a href="pcre_jit_stack_free.html">pcre_jit_stack_free</a></td>
-    <td>&nbsp;&nbsp;Free a JIT matching stack</td></tr>
-
-<tr><td><a href="pcre_maketables.html">pcre_maketables</a></td>
-    <td>&nbsp;&nbsp;Build character tables in current locale</td></tr>
-    
-<tr><td><a href="pcre_pattern_to_host_byte_order.html">pcre_pattern_to_host_byte_order</a></td>
-    <td>&nbsp;&nbsp;Convert compiled pattern to host byte order if necessary</td></tr>
-
-<tr><td><a href="pcre_refcount.html">pcre_refcount</a></td>
-    <td>&nbsp;&nbsp;Maintain reference count in compiled pattern</td></tr>
-
-<tr><td><a href="pcre_study.html">pcre_study</a></td>
-    <td>&nbsp;&nbsp;Study a compiled pattern</td></tr>
-
-<tr><td><a href="pcre_utf16_to_host_byte_order.html">pcre_utf16_to_host_byte_order</a></td>
-    <td>&nbsp;&nbsp;Convert UTF-16 string to host byte order if necessary</td></tr>
-
-<tr><td><a href="pcre_utf32_to_host_byte_order.html">pcre_utf32_to_host_byte_order</a></td>
-    <td>&nbsp;&nbsp;Convert UTF-32 string to host byte order if necessary</td></tr>
-
-<tr><td><a href="pcre_version.html">pcre_version</a></td>
-    <td>&nbsp;&nbsp;Return PCRE version and release date</td></tr>
-</table>
-
-</html>
diff --git a/dist/doc/pcre-config.1 b/dist/doc/pcre-config.1
deleted file mode 100644
index 52eb4fb..0000000
--- a/dist/doc/pcre-config.1
+++ /dev/null
@@ -1,92 +0,0 @@
-.TH PCRE-CONFIG 1 "01 January 2012" "PCRE 8.30"
-.SH NAME
-pcre-config - program to return PCRE configuration
-.SH SYNOPSIS
-.rs
-.sp
-.nf
-.B pcre-config  [--prefix] [--exec-prefix] [--version] [--libs]
-.B "            [--libs16] [--libs32] [--libs-cpp] [--libs-posix]"
-.B "            [--cflags] [--cflags-posix]"
-.fi
-.
-.
-.SH DESCRIPTION
-.rs
-.sp
-\fBpcre-config\fP returns the configuration of the installed PCRE
-libraries and the options required to compile a program to use them. Some of
-the options apply only to the 8-bit, or 16-bit, or 32-bit libraries,
-respectively, and are
-not available if only one of those libraries has been built. If an unavailable
-option is encountered, the "usage" information is output.
-.
-.
-.SH OPTIONS
-.rs
-.TP 10
-\fB--prefix\fP
-Writes the directory prefix used in the PCRE installation for architecture
-independent files (\fI/usr\fP on many systems, \fI/usr/local\fP on some
-systems) to the standard output.
-.TP 10
-\fB--exec-prefix\fP
-Writes the directory prefix used in the PCRE installation for architecture
-dependent files (normally the same as \fB--prefix\fP) to the standard output.
-.TP 10
-\fB--version\fP
-Writes the version number of the installed PCRE libraries to the standard
-output.
-.TP 10
-\fB--libs\fP
-Writes to the standard output the command line options required to link
-with the 8-bit PCRE library (\fB-lpcre\fP on many systems).
-.TP 10
-\fB--libs16\fP
-Writes to the standard output the command line options required to link
-with the 16-bit PCRE library (\fB-lpcre16\fP on many systems).
-.TP 10
-\fB--libs32\fP
-Writes to the standard output the command line options required to link
-with the 32-bit PCRE library (\fB-lpcre32\fP on many systems).
-.TP 10
-\fB--libs-cpp\fP
-Writes to the standard output the command line options required to link with
-PCRE's C++ wrapper library (\fB-lpcrecpp\fP \fB-lpcre\fP on many
-systems).
-.TP 10
-\fB--libs-posix\fP
-Writes to the standard output the command line options required to link with
-PCRE's POSIX API wrapper library (\fB-lpcreposix\fP \fB-lpcre\fP on many
-systems).
-.TP 10
-\fB--cflags\fP
-Writes to the standard output the command line options required to compile
-files that use PCRE (this may include some \fB-I\fP options, but is blank on
-many systems).
-.TP 10
-\fB--cflags-posix\fP
-Writes to the standard output the command line options required to compile
-files that use PCRE's POSIX API wrapper library (this may include some \fB-I\fP
-options, but is blank on many systems).
-.
-.
-.SH "SEE ALSO"
-.rs
-.sp
-\fBpcre(3)\fP
-.
-.
-.SH AUTHOR
-.rs
-.sp
-This manual page was originally written by Mark Baker for the Debian GNU/Linux
-system. It has been subsequently revised as a generic PCRE man page.
-.
-.
-.SH REVISION
-.rs
-.sp
-.nf
-Last updated: 24 June 2012
-.fi
diff --git a/dist/doc/pcre-config.txt b/dist/doc/pcre-config.txt
deleted file mode 100644
index 8503ab0..0000000
--- a/dist/doc/pcre-config.txt
+++ /dev/null
@@ -1,86 +0,0 @@
-PCRE-CONFIG(1)              General Commands Manual             PCRE-CONFIG(1)
-
-
-
-NAME
-       pcre-config - program to return PCRE configuration
-
-SYNOPSIS
-
-       pcre-config [--prefix] [--exec-prefix] [--version] [--libs]
-                   [--libs16] [--libs32] [--libs-cpp] [--libs-posix]
-                   [--cflags] [--cflags-posix]
-
-
-DESCRIPTION
-
-       pcre-config  returns  the configuration of the installed PCRE libraries
-       and the options required to compile a program to use them. Some of  the
-       options  apply  only  to  the  8-bit,  or  16-bit, or 32-bit libraries,
-       respectively, and are not available if only one of those libraries  has
-       been built. If an unavailable option is encountered, the "usage" infor-
-       mation is output.
-
-
-OPTIONS
-
-       --prefix  Writes the directory prefix used in the PCRE installation for
-                 architecture   independent   files  (/usr  on  many  systems,
-                 /usr/local on some systems) to the standard output.
-
-       --exec-prefix
-                 Writes the directory prefix used in the PCRE installation for
-                 architecture  dependent files (normally the same as --prefix)
-                 to the standard output.
-
-       --version Writes the version number of the installed PCRE libraries  to
-                 the standard output.
-
-       --libs    Writes  to  the  standard  output  the  command  line options
-                 required to link with the 8-bit PCRE library (-lpcre on  many
-                 systems).
-
-       --libs16  Writes  to  the  standard  output  the  command  line options
-                 required to link with the 16-bit PCRE  library  (-lpcre16  on
-                 many systems).
-
-       --libs32  Writes  to  the  standard  output  the  command  line options
-                 required to link with the 32-bit PCRE  library  (-lpcre32  on
-                 many systems).
-
-       --libs-cpp
-                 Writes  to  the  standard  output  the  command  line options
-                 required to link with PCRE's C++ wrapper  library  (-lpcrecpp
-                 -lpcre on many systems).
-
-       --libs-posix
-                 Writes  to  the  standard  output  the  command  line options
-                 required to  link  with  PCRE's  POSIX  API  wrapper  library
-                 (-lpcreposix -lpcre on many systems).
-
-       --cflags  Writes  to  the  standard  output  the  command  line options
-                 required to compile files that use  PCRE  (this  may  include
-                 some -I options, but is blank on many systems).
-
-       --cflags-posix
-                 Writes  to  the  standard  output  the  command  line options
-                 required to compile files that use PCRE's POSIX  API  wrapper
-                 library  (this  may  include some -I options, but is blank on
-                 many systems).
-
-
-SEE ALSO
-
-       pcre(3)
-
-
-AUTHOR
-
-       This manual page was originally written by Mark Baker  for  the  Debian
-       GNU/Linux  system.  It  has been subsequently revised as a generic PCRE
-       man page.
-
-
-REVISION
-
-       Last updated: 24 June 2012
diff --git a/dist/doc/pcre.3 b/dist/doc/pcre.3
deleted file mode 100644
index 0f2837e..0000000
--- a/dist/doc/pcre.3
+++ /dev/null
@@ -1,230 +0,0 @@
-.TH PCRE 3 "10 February 2015" "PCRE 8.37"
-.SH NAME
-PCRE - Perl-compatible regular expressions (original API)
-.SH "PLEASE TAKE NOTE"
-.rs
-.sp
-This document relates to PCRE releases that use the original API,
-with library names libpcre, libpcre16, and libpcre32. January 2015 saw the
-first release of a new API, known as PCRE2, with release numbers starting at
-10.00 and library names libpcre2-8, libpcre2-16, and libpcre2-32. The old
-libraries (now called PCRE1) are still being maintained for bug fixes, but
-there will be no new development. New projects are advised to use the new PCRE2
-libraries.
-.
-.
-.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. Some features that appeared in Python and PCRE before they
-appeared in Perl are also available using the Python syntax, there is some
-support for one or two .NET and Oniguruma syntax items, and there is an option
-for requesting some minor changes that give better JavaScript compatibility.
-.P
-Starting with release 8.30, it is possible to compile two separate PCRE
-libraries: the original, which supports 8-bit character strings (including
-UTF-8 strings), and a second library that supports 16-bit character strings
-(including UTF-16 strings). The build process allows either one or both to be
-built. The majority of the work to make this possible was done by Zoltan
-Herczeg.
-.P
-Starting with release 8.32 it is possible to compile a third separate PCRE
-library that supports 32-bit character strings (including UTF-32 strings). The
-build process allows any combination of the 8-, 16- and 32-bit libraries. The
-work to make this possible was done by Christian Persch.
-.P
-The three libraries contain identical sets of functions, except that the names
-in the 16-bit library start with \fBpcre16_\fP instead of \fBpcre_\fP, and the
-names in the 32-bit library start with \fBpcre32_\fP instead of \fBpcre_\fP. To
-avoid over-complication and reduce the documentation maintenance load, most of
-the documentation describes the 8-bit library, with the differences for the
-16-bit and 32-bit libraries described separately in the
-.\" HREF
-\fBpcre16\fP
-and
-.\" HREF
-\fBpcre32\fP
-.\"
-pages. References to functions or structures of the form \fIpcre[16|32]_xxx\fP
-should be read as meaning "\fIpcre_xxx\fP when using the 8-bit library,
-\fIpcre16_xxx\fP when using the 16-bit library, or \fIpcre32_xxx\fP when using
-the 32-bit library".
-.P
-The current implementation of PCRE corresponds approximately with Perl 5.12,
-including support for UTF-8/16/32 encoded strings and Unicode general category
-properties. However, UTF-8/16/32 and Unicode support has to be explicitly
-enabled; it is not the default. The Unicode tables correspond to Unicode
-release 6.3.0.
-.P
-In addition to the Perl-compatible matching function, PCRE contains an
-alternative 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 for the 8-bit library. 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\fP 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
-\fBpcrepattern\fP
-.\"
-and
-.\" HREF
-\fBpcrecompat\fP
-.\"
-pages. There is a syntax summary in the
-.\" HREF
-\fBpcresyntax\fP
-.\"
-page.
-.P
-Some features of PCRE can be included, excluded, or changed when the library is
-built. The
-.\" HREF
-\fBpcre_config()\fP
-.\"
-function makes it possible for a client to discover which features are
-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
-.\" HTML <a href="README.txt">
-.\" </a>
-\fBREADME\fP
-.\"
-and
-.\" HTML <a href="NON-AUTOTOOLS-BUILD.txt">
-.\" </a>
-\fBNON-AUTOTOOLS_BUILD\fP
-.\"
-files in the source distribution.
-.P
-The libraries 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_" or "_pcre16_" or "_pcre32_", 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 "SECURITY CONSIDERATIONS"
-.rs
-.sp
-If you are using PCRE in a non-UTF application that permits users to supply
-arbitrary patterns for compilation, you should be aware of a feature that
-allows users to turn on UTF support from within a pattern, provided that PCRE
-was built with UTF support. For example, an 8-bit pattern that begins with
-"(*UTF8)" or "(*UTF)" turns on UTF-8 mode, which interprets patterns and
-subjects as strings of UTF-8 characters instead of individual 8-bit characters.
-This causes both the pattern and any data against which it is matched to be
-checked for UTF-8 validity. If the data string is very long, such a check might
-use sufficiently many resources as to cause your application to lose
-performance.
-.P
-One way of guarding against this possibility is to use the
-\fBpcre_fullinfo()\fP function to check the compiled pattern's options for UTF.
-Alternatively, from release 8.33, you can set the PCRE_NEVER_UTF option at
-compile time. This causes an compile time error if a pattern contains a
-UTF-setting sequence.
-.P
-If your application is one that supports UTF, be aware that validity checking
-can take time. If the same data string is to be matched many times, you can use
-the PCRE_NO_UTF[8|16|32]_CHECK option for the second and subsequent matches to
-save redundant checks.
-.P
-Another way that performance can be hit is by running a pattern that has a very
-large search tree against a string that will never match. Nested unlimited
-repeats in a pattern are a common example. PCRE provides some protection
-against this: see the PCRE_EXTRA_MATCH_LIMIT feature in the
-.\" HREF
-\fBpcreapi\fP
-.\"
-page.
-.
-.
-.SH "USER DOCUMENTATION"
-.rs
-.sp
-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,
-the descriptions of the \fBpcregrep\fP and \fBpcretest\fP programs are in files
-called \fBpcregrep.txt\fP and \fBpcretest.txt\fP, respectively. The remaining
-sections, except for the \fBpcredemo\fP section (which is a program listing),
-are concatenated in \fBpcre.txt\fP, for ease of searching. The sections are as
-follows:
-.sp
-  pcre              this document
-  pcre-config       show PCRE installation configuration information
-  pcre16            details of the 16-bit library
-  pcre32            details of the 32-bit library
-  pcreapi           details of PCRE's native C API
-  pcrebuild         building PCRE
-  pcrecallout       details of the callout feature
-  pcrecompat        discussion of Perl compatibility
-  pcrecpp           details of the C++ wrapper for the 8-bit library
-  pcredemo          a demonstration C program that uses PCRE
-  pcregrep          description of the \fBpcregrep\fP command (8-bit only)
-  pcrejit           discussion of the just-in-time optimization support
-  pcrelimits        details of size and other limits
-  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 C API for the 8-bit library
-  pcreprecompile    details of saving and re-using precompiled patterns
-  pcresample        discussion of the pcredemo program
-  pcrestack         discussion of stack usage
-  pcresyntax        quick syntax reference
-  pcretest          description of the \fBpcretest\fP testing command
-  pcreunicode       discussion of Unicode and UTF-8/16/32 support
-.sp
-In the "man" and HTML formats, there is also a short page for each C library
-function, listing its arguments and results.
-.
-.
-.SH AUTHOR
-.rs
-.sp
-.nf
-Philip Hazel
-University Computing Service
-Cambridge CB2 3QH, England.
-.fi
-.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 two initials, followed by the
-two digits 10, at the domain cam.ac.uk.
-.
-.
-.SH REVISION
-.rs
-.sp
-.nf
-Last updated: 10 February 2015
-Copyright (c) 1997-2015 University of Cambridge.
-.fi
diff --git a/dist/doc/pcre.txt b/dist/doc/pcre.txt
deleted file mode 100644
index 76a47c7..0000000
--- a/dist/doc/pcre.txt
+++ /dev/null
@@ -1,10455 +0,0 @@
------------------------------------------------------------------------------
-This file contains a concatenation of the PCRE man pages, converted to plain
-text format for ease of searching with a text editor, or for use on systems
-that do not have a man page processor. The small individual files that give
-synopses of each function in the library have not been included. Neither has
-the pcredemo program. There are separate text files for the pcregrep and
-pcretest commands.
------------------------------------------------------------------------------
-
-
-PCRE(3)                    Library Functions Manual                    PCRE(3)
-
-
-
-NAME
-       PCRE - Perl-compatible regular expressions (original API)
-
-PLEASE TAKE NOTE
-
-       This  document relates to PCRE releases that use the original API, with
-       library names libpcre, libpcre16, and libpcre32. January 2015  saw  the
-       first release of a new API, known as PCRE2, with release numbers start-
-       ing  at  10.00  and  library   names   libpcre2-8,   libpcre2-16,   and
-       libpcre2-32. The old libraries (now called PCRE1) are still being main-
-       tained for bug fixes,  but  there  will  be  no  new  development.  New
-       projects are advised to use the new PCRE2 libraries.
-
-
-INTRODUCTION
-
-       The  PCRE  library is a set of functions that implement regular expres-
-       sion pattern matching using the same syntax and semantics as Perl, with
-       just  a few differences. Some features that appeared in Python and PCRE
-       before they appeared in Perl are also available using the  Python  syn-
-       tax,  there  is  some  support for one or two .NET and Oniguruma syntax
-       items, and there is an option for requesting some  minor  changes  that
-       give better JavaScript compatibility.
-
-       Starting with release 8.30, it is possible to compile two separate PCRE
-       libraries:  the  original,  which  supports  8-bit  character   strings
-       (including  UTF-8  strings),  and a second library that supports 16-bit
-       character strings (including UTF-16 strings). The build process  allows
-       either  one  or both to be built. The majority of the work to make this
-       possible was done by Zoltan Herczeg.
-
-       Starting with release 8.32 it is possible to compile a  third  separate
-       PCRE  library  that supports 32-bit character strings (including UTF-32
-       strings). The build process allows any combination of the 8-,  16-  and
-       32-bit  libraries. The work to make this possible was done by Christian
-       Persch.
-
-       The three libraries contain identical sets of  functions,  except  that
-       the  names  in  the 16-bit library start with pcre16_ instead of pcre_,
-       and the names in the 32-bit  library  start  with  pcre32_  instead  of
-       pcre_.  To avoid over-complication and reduce the documentation mainte-
-       nance load, most of the documentation describes the 8-bit library, with
-       the  differences  for  the  16-bit and 32-bit libraries described sepa-
-       rately in the pcre16 and  pcre32  pages.  References  to  functions  or
-       structures  of  the  form  pcre[16|32]_xxx  should  be  read as meaning
-       "pcre_xxx when using the  8-bit  library,  pcre16_xxx  when  using  the
-       16-bit library, or pcre32_xxx when using the 32-bit library".
-
-       The  current implementation of PCRE corresponds approximately with Perl
-       5.12, including support for UTF-8/16/32  encoded  strings  and  Unicode
-       general  category  properties. However, UTF-8/16/32 and Unicode support
-       has to be explicitly enabled; it is not the default. The Unicode tables
-       correspond to Unicode release 6.3.0.
-
-       In  addition to the Perl-compatible matching function, PCRE contains an
-       alternative function that matches the same compiled patterns in a  dif-
-       ferent way. In certain circumstances, the alternative function has some
-       advantages.  For a discussion of the two matching algorithms,  see  the
-       pcrematching page.
-
-       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 for the 8-bit
-       library. This is now included as part of  the  PCRE  distribution.  The
-       pcrecpp  page  has  details of this interface. Other people's contribu-
-       tions can be found in the Contrib directory at the  primary  FTP  site,
-       which is:
-
-       ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre
-
-       Details  of  exactly which Perl regular expression features are and are
-       not supported by PCRE are given in separate documents. See the pcrepat-
-       tern  and pcrecompat pages. There is a syntax summary in the pcresyntax
-       page.
-
-       Some features of PCRE can be included, excluded, or  changed  when  the
-       library  is  built.  The pcre_config() function makes it possible for a
-       client to discover which features are  available.  The  features  them-
-       selves  are described in the pcrebuild page. Documentation about build-
-       ing PCRE for various operating systems can be found in the  README  and
-       NON-AUTOTOOLS_BUILD files in the source distribution.
-
-       The  libraries 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_" or "_pcre16_" or "_pcre32_",  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.
-
-
-SECURITY CONSIDERATIONS
-
-       If you are using PCRE in a non-UTF application that  permits  users  to
-       supply  arbitrary  patterns  for  compilation, you should be aware of a
-       feature that allows users to turn on UTF support from within a pattern,
-       provided  that  PCRE  was built with UTF support. For example, an 8-bit
-       pattern that begins with "(*UTF8)" or "(*UTF)"  turns  on  UTF-8  mode,
-       which  interprets  patterns and subjects as strings of UTF-8 characters
-       instead of individual 8-bit characters.  This causes both  the  pattern
-       and any data against which it is matched to be checked for UTF-8 valid-
-       ity. If the data string is very long, such a  check  might  use  suffi-
-       ciently  many  resources  as  to cause your application to lose perfor-
-       mance.
-
-       One  way  of  guarding  against  this  possibility  is   to   use   the
-       pcre_fullinfo()  function  to  check the compiled pattern's options for
-       UTF.  Alternatively, from release 8.33, you can set the  PCRE_NEVER_UTF
-       option  at compile time. This causes an compile time error if a pattern
-       contains a UTF-setting sequence.
-
-       If your application is one that supports UTF, be  aware  that  validity
-       checking  can  take time. If the same data string is to be matched many
-       times, you can use the PCRE_NO_UTF[8|16|32]_CHECK option for the second
-       and subsequent matches to save redundant checks.
-
-       Another  way  that  performance can be hit is by running a pattern that
-       has a very large search tree against a string that  will  never  match.
-       Nested  unlimited  repeats in a pattern are a common example. PCRE pro-
-       vides some protection against this: see the PCRE_EXTRA_MATCH_LIMIT fea-
-       ture in the pcreapi page.
-
-
-USER DOCUMENTATION
-
-       The  user  documentation  for PCRE comprises a number of different sec-
-       tions. 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, the descriptions of the pcregrep and pcretest
-       programs  are  in  files  called pcregrep.txt and pcretest.txt, respec-
-       tively. The remaining sections, except for the pcredemo section  (which
-       is  a  program  listing),  are  concatenated  in  pcre.txt, for ease of
-       searching. The sections are as follows:
-
-         pcre              this document
-         pcre-config       show PCRE installation configuration information
-         pcre16            details of the 16-bit library
-         pcre32            details of the 32-bit library
-         pcreapi           details of PCRE's native C API
-         pcrebuild         building PCRE
-         pcrecallout       details of the callout feature
-         pcrecompat        discussion of Perl compatibility
-         pcrecpp           details of the C++ wrapper for the 8-bit library
-         pcredemo          a demonstration C program that uses PCRE
-         pcregrep          description of the pcregrep command (8-bit only)
-         pcrejit           discussion of the just-in-time optimization support
-         pcrelimits        details of size and other limits
-         pcrematching      discussion of the two matching algorithms
-         pcrepartial       details of the partial matching facility
-         pcrepattern       syntax and semantics of supported
-                             regular expressions
-         pcreperform       discussion of performance issues
-         pcreposix         the POSIX-compatible C API for the 8-bit library
-         pcreprecompile    details of saving and re-using precompiled patterns
-         pcresample        discussion of the pcredemo program
-         pcrestack         discussion of stack usage
-         pcresyntax        quick syntax reference
-         pcretest          description of the pcretest testing command
-         pcreunicode       discussion of Unicode and UTF-8/16/32 support
-
-       In the "man" and HTML formats, there is also a short page  for  each  C
-       library function, listing its arguments and results.
-
-
-AUTHOR
-
-       Philip Hazel
-       University Computing Service
-       Cambridge CB2 3QH, England.
-
-       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  two  initials,
-       followed by the two digits 10, at the domain cam.ac.uk.
-
-
-REVISION
-
-       Last updated: 10 February 2015
-       Copyright (c) 1997-2015 University of Cambridge.
-------------------------------------------------------------------------------
-
-
-PCRE(3)                    Library Functions Manual                    PCRE(3)
-
-
-
-NAME
-       PCRE - Perl-compatible regular expressions
-
-       #include <pcre.h>
-
-
-PCRE 16-BIT API BASIC FUNCTIONS
-
-       pcre16 *pcre16_compile(PCRE_SPTR16 pattern, int options,
-            const char **errptr, int *erroffset,
-            const unsigned char *tableptr);
-
-       pcre16 *pcre16_compile2(PCRE_SPTR16 pattern, int options,
-            int *errorcodeptr,
-            const char **errptr, int *erroffset,
-            const unsigned char *tableptr);
-
-       pcre16_extra *pcre16_study(const pcre16 *code, int options,
-            const char **errptr);
-
-       void pcre16_free_study(pcre16_extra *extra);
-
-       int pcre16_exec(const pcre16 *code, const pcre16_extra *extra,
-            PCRE_SPTR16 subject, int length, int startoffset,
-            int options, int *ovector, int ovecsize);
-
-       int pcre16_dfa_exec(const pcre16 *code, const pcre16_extra *extra,
-            PCRE_SPTR16 subject, int length, int startoffset,
-            int options, int *ovector, int ovecsize,
-            int *workspace, int wscount);
-
-
-PCRE 16-BIT API STRING EXTRACTION FUNCTIONS
-
-       int pcre16_copy_named_substring(const pcre16 *code,
-            PCRE_SPTR16 subject, int *ovector,
-            int stringcount, PCRE_SPTR16 stringname,
-            PCRE_UCHAR16 *buffer, int buffersize);
-
-       int pcre16_copy_substring(PCRE_SPTR16 subject, int *ovector,
-            int stringcount, int stringnumber, PCRE_UCHAR16 *buffer,
-            int buffersize);
-
-       int pcre16_get_named_substring(const pcre16 *code,
-            PCRE_SPTR16 subject, int *ovector,
-            int stringcount, PCRE_SPTR16 stringname,
-            PCRE_SPTR16 *stringptr);
-
-       int pcre16_get_stringnumber(const pcre16 *code,
-            PCRE_SPTR16 name);
-
-       int pcre16_get_stringtable_entries(const pcre16 *code,
-            PCRE_SPTR16 name, PCRE_UCHAR16 **first, PCRE_UCHAR16 **last);
-
-       int pcre16_get_substring(PCRE_SPTR16 subject, int *ovector,
-            int stringcount, int stringnumber,
-            PCRE_SPTR16 *stringptr);
-
-       int pcre16_get_substring_list(PCRE_SPTR16 subject,
-            int *ovector, int stringcount, PCRE_SPTR16 **listptr);
-
-       void pcre16_free_substring(PCRE_SPTR16 stringptr);
-
-       void pcre16_free_substring_list(PCRE_SPTR16 *stringptr);
-
-
-PCRE 16-BIT API AUXILIARY FUNCTIONS
-
-       pcre16_jit_stack *pcre16_jit_stack_alloc(int startsize, int maxsize);
-
-       void pcre16_jit_stack_free(pcre16_jit_stack *stack);
-
-       void pcre16_assign_jit_stack(pcre16_extra *extra,
-            pcre16_jit_callback callback, void *data);
-
-       const unsigned char *pcre16_maketables(void);
-
-       int pcre16_fullinfo(const pcre16 *code, const pcre16_extra *extra,
-            int what, void *where);
-
-       int pcre16_refcount(pcre16 *code, int adjust);
-
-       int pcre16_config(int what, void *where);
-
-       const char *pcre16_version(void);
-
-       int pcre16_pattern_to_host_byte_order(pcre16 *code,
-            pcre16_extra *extra, const unsigned char *tables);
-
-
-PCRE 16-BIT API INDIRECTED FUNCTIONS
-
-       void *(*pcre16_malloc)(size_t);
-
-       void (*pcre16_free)(void *);
-
-       void *(*pcre16_stack_malloc)(size_t);
-
-       void (*pcre16_stack_free)(void *);
-
-       int (*pcre16_callout)(pcre16_callout_block *);
-
-
-PCRE 16-BIT API 16-BIT-ONLY FUNCTION
-
-       int pcre16_utf16_to_host_byte_order(PCRE_UCHAR16 *output,
-            PCRE_SPTR16 input, int length, int *byte_order,
-            int keep_boms);
-
-
-THE PCRE 16-BIT LIBRARY
-
-       Starting  with  release  8.30, it is possible to compile a PCRE library
-       that supports 16-bit character strings, including  UTF-16  strings,  as
-       well  as  or instead of the original 8-bit library. The majority of the
-       work to make  this  possible  was  done  by  Zoltan  Herczeg.  The  two
-       libraries contain identical sets of functions, used in exactly the same
-       way. Only the names of the functions and the data types of their  argu-
-       ments  and results are different. To avoid over-complication and reduce
-       the documentation maintenance load,  most  of  the  PCRE  documentation
-       describes  the  8-bit  library,  with only occasional references to the
-       16-bit library. This page describes what is different when you use  the
-       16-bit library.
-
-       WARNING:  A  single  application can be linked with both libraries, but
-       you must take care when processing any particular pattern to use  func-
-       tions  from  just one library. For example, if you want to study a pat-
-       tern that was compiled with  pcre16_compile(),  you  must  do  so  with
-       pcre16_study(), not pcre_study(), and you must free the study data with
-       pcre16_free_study().
-
-
-THE HEADER FILE
-
-       There is only one header file, pcre.h. It contains prototypes  for  all
-       the functions in all libraries, as well as definitions of flags, struc-
-       tures, error codes, etc.
-
-
-THE LIBRARY NAME
-
-       In Unix-like systems, the 16-bit library is called libpcre16,  and  can
-       normally  be  accesss  by adding -lpcre16 to the command for linking an
-       application that uses PCRE.
-
-
-STRING TYPES
-
-       In the 8-bit library, strings are passed to PCRE library  functions  as
-       vectors  of  bytes  with  the  C  type "char *". In the 16-bit library,
-       strings are passed as vectors of unsigned 16-bit quantities. The  macro
-       PCRE_UCHAR16  specifies  an  appropriate  data type, and PCRE_SPTR16 is
-       defined as "const PCRE_UCHAR16 *". In very  many  environments,  "short
-       int" is a 16-bit data type. When PCRE is built, it defines PCRE_UCHAR16
-       as "unsigned short int", but checks that it really  is  a  16-bit  data
-       type.  If  it is not, the build fails with an error message telling the
-       maintainer to modify the definition appropriately.
-
-
-STRUCTURE TYPES
-
-       The types of the opaque structures that are used  for  compiled  16-bit
-       patterns  and  JIT stacks are pcre16 and pcre16_jit_stack respectively.
-       The  type  of  the  user-accessible  structure  that  is  returned   by
-       pcre16_study()  is  pcre16_extra, and the type of the structure that is
-       used for passing data to a callout  function  is  pcre16_callout_block.
-       These structures contain the same fields, with the same names, as their
-       8-bit counterparts. The only difference is that pointers  to  character
-       strings are 16-bit instead of 8-bit types.
-
-
-16-BIT FUNCTIONS
-
-       For  every function in the 8-bit library there is a corresponding func-
-       tion in the 16-bit library with a name that starts with pcre16_ instead
-       of  pcre_.  The  prototypes are listed above. In addition, there is one
-       extra function, pcre16_utf16_to_host_byte_order(). This  is  a  utility
-       function  that converts a UTF-16 character string to host byte order if
-       necessary. The other 16-bit  functions  expect  the  strings  they  are
-       passed to be in host byte order.
-
-       The input and output arguments of pcre16_utf16_to_host_byte_order() may
-       point to the same address, that is, conversion in place  is  supported.
-       The output buffer must be at least as long as the input.
-
-       The  length  argument  specifies the number of 16-bit data units in the
-       input string; a negative value specifies a zero-terminated string.
-
-       If byte_order is NULL, it is assumed that the string starts off in host
-       byte  order. This may be changed by byte-order marks (BOMs) anywhere in
-       the string (commonly as the first character).
-
-       If byte_order is not NULL, a non-zero value of the integer to which  it
-       points  means  that  the input starts off in host byte order, otherwise
-       the opposite order is assumed. Again, BOMs in  the  string  can  change
-       this. The final byte order is passed back at the end of processing.
-
-       If  keep_boms  is  not  zero,  byte-order  mark characters (0xfeff) are
-       copied into the output string. Otherwise they are discarded.
-
-       The result of the function is the number of 16-bit  units  placed  into
-       the  output  buffer,  including  the  zero terminator if the string was
-       zero-terminated.
-
-
-SUBJECT STRING OFFSETS
-
-       The lengths and starting offsets of subject strings must  be  specified
-       in  16-bit  data units, and the offsets within subject strings that are
-       returned by the matching functions are in also 16-bit units rather than
-       bytes.
-
-
-NAMED SUBPATTERNS
-
-       The  name-to-number translation table that is maintained for named sub-
-       patterns uses 16-bit characters.  The  pcre16_get_stringtable_entries()
-       function returns the length of each entry in the table as the number of
-       16-bit data units.
-
-
-OPTION NAMES
-
-       There   are   two   new   general   option   names,   PCRE_UTF16    and
-       PCRE_NO_UTF16_CHECK,     which     correspond    to    PCRE_UTF8    and
-       PCRE_NO_UTF8_CHECK in the 8-bit library. In  fact,  these  new  options
-       define  the  same bits in the options word. There is a discussion about
-       the validity of UTF-16 strings in the pcreunicode page.
-
-       For the pcre16_config() function there is an  option  PCRE_CONFIG_UTF16
-       that  returns  1  if UTF-16 support is configured, otherwise 0. If this
-       option  is  given  to  pcre_config()  or  pcre32_config(),  or  if  the
-       PCRE_CONFIG_UTF8  or  PCRE_CONFIG_UTF32  option is given to pcre16_con-
-       fig(), the result is the PCRE_ERROR_BADOPTION error.
-
-
-CHARACTER CODES
-
-       In 16-bit mode, when  PCRE_UTF16  is  not  set,  character  values  are
-       treated in the same way as in 8-bit, non UTF-8 mode, except, of course,
-       that they can range from 0 to 0xffff instead of 0  to  0xff.  Character
-       types  for characters less than 0xff can therefore be influenced by the
-       locale in the same way as before.  Characters greater  than  0xff  have
-       only one case, and no "type" (such as letter or digit).
-
-       In  UTF-16  mode,  the  character  code  is  Unicode, in the range 0 to
-       0x10ffff, with the exception of values in the range  0xd800  to  0xdfff
-       because  those  are "surrogate" values that are used in pairs to encode
-       values greater than 0xffff.
-
-       A UTF-16 string can indicate its endianness by special code knows as  a
-       byte-order mark (BOM). The PCRE functions do not handle this, expecting
-       strings  to  be  in  host  byte  order.  A  utility   function   called
-       pcre16_utf16_to_host_byte_order()  is  provided  to help with this (see
-       above).
-
-
-ERROR NAMES
-
-       The errors PCRE_ERROR_BADUTF16_OFFSET and PCRE_ERROR_SHORTUTF16  corre-
-       spond  to  their  8-bit  counterparts.  The error PCRE_ERROR_BADMODE is
-       given when a compiled pattern is passed to a  function  that  processes
-       patterns  in  the  other  mode, for example, if a pattern compiled with
-       pcre_compile() is passed to pcre16_exec().
-
-       There are new error codes whose names  begin  with  PCRE_UTF16_ERR  for
-       invalid  UTF-16  strings,  corresponding to the PCRE_UTF8_ERR codes for
-       UTF-8 strings that are described in the section entitled "Reason  codes
-       for  invalid UTF-8 strings" in the main pcreapi page. The UTF-16 errors
-       are:
-
-         PCRE_UTF16_ERR1  Missing low surrogate at end of string
-         PCRE_UTF16_ERR2  Invalid low surrogate follows high surrogate
-         PCRE_UTF16_ERR3  Isolated low surrogate
-         PCRE_UTF16_ERR4  Non-character
-
-
-ERROR TEXTS
-
-       If there is an error while compiling a pattern, the error text that  is
-       passed  back by pcre16_compile() or pcre16_compile2() is still an 8-bit
-       character string, zero-terminated.
-
-
-CALLOUTS
-
-       The subject and mark fields in the callout block that is  passed  to  a
-       callout function point to 16-bit vectors.
-
-
-TESTING
-
-       The  pcretest  program continues to operate with 8-bit input and output
-       files, but it can be used for testing the 16-bit library. If it is  run
-       with the command line option -16, patterns and subject strings are con-
-       verted from 8-bit to 16-bit before being passed to PCRE, and the 16-bit
-       library  functions  are used instead of the 8-bit ones. Returned 16-bit
-       strings are converted to 8-bit for output. If both the  8-bit  and  the
-       32-bit libraries were not compiled, pcretest defaults to 16-bit and the
-       -16 option is ignored.
-
-       When PCRE is being built, the RunTest script that is  called  by  "make
-       check"  uses  the  pcretest  -C  option to discover which of the 8-bit,
-       16-bit and 32-bit libraries has been built, and runs the  tests  appro-
-       priately.
-
-
-NOT SUPPORTED IN 16-BIT MODE
-
-       Not all the features of the 8-bit library are available with the 16-bit
-       library. The C++ and POSIX wrapper functions  support  only  the  8-bit
-       library, and the pcregrep program is at present 8-bit only.
-
-
-AUTHOR
-
-       Philip Hazel
-       University Computing Service
-       Cambridge CB2 3QH, England.
-
-
-REVISION
-
-       Last updated: 12 May 2013
-       Copyright (c) 1997-2013 University of Cambridge.
-------------------------------------------------------------------------------
-
-
-PCRE(3)                    Library Functions Manual                    PCRE(3)
-
-
-
-NAME
-       PCRE - Perl-compatible regular expressions
-
-       #include <pcre.h>
-
-
-PCRE 32-BIT API BASIC FUNCTIONS
-
-       pcre32 *pcre32_compile(PCRE_SPTR32 pattern, int options,
-            const char **errptr, int *erroffset,
-            const unsigned char *tableptr);
-
-       pcre32 *pcre32_compile2(PCRE_SPTR32 pattern, int options,
-            int *errorcodeptr,
-            const unsigned char *tableptr);
-
-       pcre32_extra *pcre32_study(const pcre32 *code, int options,
-            const char **errptr);
-
-       void pcre32_free_study(pcre32_extra *extra);
-
-       int pcre32_exec(const pcre32 *code, const pcre32_extra *extra,
-            PCRE_SPTR32 subject, int length, int startoffset,
-            int options, int *ovector, int ovecsize);
-
-       int pcre32_dfa_exec(const pcre32 *code, const pcre32_extra *extra,
-            PCRE_SPTR32 subject, int length, int startoffset,
-            int options, int *ovector, int ovecsize,
-            int *workspace, int wscount);
-
-
-PCRE 32-BIT API STRING EXTRACTION FUNCTIONS
-
-       int pcre32_copy_named_substring(const pcre32 *code,
-            PCRE_SPTR32 subject, int *ovector,
-            int stringcount, PCRE_SPTR32 stringname,
-            PCRE_UCHAR32 *buffer, int buffersize);
-
-       int pcre32_copy_substring(PCRE_SPTR32 subject, int *ovector,
-            int stringcount, int stringnumber, PCRE_UCHAR32 *buffer,
-            int buffersize);
-
-       int pcre32_get_named_substring(const pcre32 *code,
-            PCRE_SPTR32 subject, int *ovector,
-            int stringcount, PCRE_SPTR32 stringname,
-            PCRE_SPTR32 *stringptr);
-
-       int pcre32_get_stringnumber(const pcre32 *code,
-            PCRE_SPTR32 name);
-
-       int pcre32_get_stringtable_entries(const pcre32 *code,
-            PCRE_SPTR32 name, PCRE_UCHAR32 **first, PCRE_UCHAR32 **last);
-
-       int pcre32_get_substring(PCRE_SPTR32 subject, int *ovector,
-            int stringcount, int stringnumber,
-            PCRE_SPTR32 *stringptr);
-
-       int pcre32_get_substring_list(PCRE_SPTR32 subject,
-            int *ovector, int stringcount, PCRE_SPTR32 **listptr);
-
-       void pcre32_free_substring(PCRE_SPTR32 stringptr);
-
-       void pcre32_free_substring_list(PCRE_SPTR32 *stringptr);
-
-
-PCRE 32-BIT API AUXILIARY FUNCTIONS
-
-       pcre32_jit_stack *pcre32_jit_stack_alloc(int startsize, int maxsize);
-
-       void pcre32_jit_stack_free(pcre32_jit_stack *stack);
-
-       void pcre32_assign_jit_stack(pcre32_extra *extra,
-            pcre32_jit_callback callback, void *data);
-
-       const unsigned char *pcre32_maketables(void);
-
-       int pcre32_fullinfo(const pcre32 *code, const pcre32_extra *extra,
-            int what, void *where);
-
-       int pcre32_refcount(pcre32 *code, int adjust);
-
-       int pcre32_config(int what, void *where);
-
-       const char *pcre32_version(void);
-
-       int pcre32_pattern_to_host_byte_order(pcre32 *code,
-            pcre32_extra *extra, const unsigned char *tables);
-
-
-PCRE 32-BIT API INDIRECTED FUNCTIONS
-
-       void *(*pcre32_malloc)(size_t);
-
-       void (*pcre32_free)(void *);
-
-       void *(*pcre32_stack_malloc)(size_t);
-
-       void (*pcre32_stack_free)(void *);
-
-       int (*pcre32_callout)(pcre32_callout_block *);
-
-
-PCRE 32-BIT API 32-BIT-ONLY FUNCTION
-
-       int pcre32_utf32_to_host_byte_order(PCRE_UCHAR32 *output,
-            PCRE_SPTR32 input, int length, int *byte_order,
-            int keep_boms);
-
-
-THE PCRE 32-BIT LIBRARY
-
-       Starting  with  release  8.32, it is possible to compile a PCRE library
-       that supports 32-bit character strings, including  UTF-32  strings,  as
-       well as or instead of the original 8-bit library. This work was done by
-       Christian Persch, based on the work done  by  Zoltan  Herczeg  for  the
-       16-bit  library.  All  three  libraries contain identical sets of func-
-       tions, used in exactly the same way.  Only the names of  the  functions
-       and  the  data  types  of their arguments and results are different. To
-       avoid over-complication and reduce the documentation maintenance  load,
-       most  of  the PCRE documentation describes the 8-bit library, with only
-       occasional references to the 16-bit and  32-bit  libraries.  This  page
-       describes what is different when you use the 32-bit library.
-
-       WARNING:  A  single  application  can  be linked with all or any of the
-       three libraries, but you must take care when processing any  particular
-       pattern  to  use  functions  from just one library. For example, if you
-       want to study a pattern that was compiled  with  pcre32_compile(),  you
-       must do so with pcre32_study(), not pcre_study(), and you must free the
-       study data with pcre32_free_study().
-
-
-THE HEADER FILE
-
-       There is only one header file, pcre.h. It contains prototypes  for  all
-       the functions in all libraries, as well as definitions of flags, struc-
-       tures, error codes, etc.
-
-
-THE LIBRARY NAME
-
-       In Unix-like systems, the 32-bit library is called libpcre32,  and  can
-       normally  be  accesss  by adding -lpcre32 to the command for linking an
-       application that uses PCRE.
-
-
-STRING TYPES
-
-       In the 8-bit library, strings are passed to PCRE library  functions  as
-       vectors  of  bytes  with  the  C  type "char *". In the 32-bit library,
-       strings are passed as vectors of unsigned 32-bit quantities. The  macro
-       PCRE_UCHAR32  specifies  an  appropriate  data type, and PCRE_SPTR32 is
-       defined as "const PCRE_UCHAR32 *". In very many environments, "unsigned
-       int" is a 32-bit data type. When PCRE is built, it defines PCRE_UCHAR32
-       as "unsigned int", but checks that it really is a 32-bit data type.  If
-       it is not, the build fails with an error message telling the maintainer
-       to modify the definition appropriately.
-
-
-STRUCTURE TYPES
-
-       The types of the opaque structures that are used  for  compiled  32-bit
-       patterns  and  JIT stacks are pcre32 and pcre32_jit_stack respectively.
-       The  type  of  the  user-accessible  structure  that  is  returned   by
-       pcre32_study()  is  pcre32_extra, and the type of the structure that is
-       used for passing data to a callout  function  is  pcre32_callout_block.
-       These structures contain the same fields, with the same names, as their
-       8-bit counterparts. The only difference is that pointers  to  character
-       strings are 32-bit instead of 8-bit types.
-
-
-32-BIT FUNCTIONS
-
-       For  every function in the 8-bit library there is a corresponding func-
-       tion in the 32-bit library with a name that starts with pcre32_ instead
-       of  pcre_.  The  prototypes are listed above. In addition, there is one
-       extra function, pcre32_utf32_to_host_byte_order(). This  is  a  utility
-       function  that converts a UTF-32 character string to host byte order if
-       necessary. The other 32-bit  functions  expect  the  strings  they  are
-       passed to be in host byte order.
-
-       The input and output arguments of pcre32_utf32_to_host_byte_order() may
-       point to the same address, that is, conversion in place  is  supported.
-       The output buffer must be at least as long as the input.
-
-       The  length  argument  specifies the number of 32-bit data units in the
-       input string; a negative value specifies a zero-terminated string.
-
-       If byte_order is NULL, it is assumed that the string starts off in host
-       byte  order. This may be changed by byte-order marks (BOMs) anywhere in
-       the string (commonly as the first character).
-
-       If byte_order is not NULL, a non-zero value of the integer to which  it
-       points  means  that  the input starts off in host byte order, otherwise
-       the opposite order is assumed. Again, BOMs in  the  string  can  change
-       this. The final byte order is passed back at the end of processing.
-
-       If  keep_boms  is  not  zero,  byte-order  mark characters (0xfeff) are
-       copied into the output string. Otherwise they are discarded.
-
-       The result of the function is the number of 32-bit  units  placed  into
-       the  output  buffer,  including  the  zero terminator if the string was
-       zero-terminated.
-
-
-SUBJECT STRING OFFSETS
-
-       The lengths and starting offsets of subject strings must  be  specified
-       in  32-bit  data units, and the offsets within subject strings that are
-       returned by the matching functions are in also 32-bit units rather than
-       bytes.
-
-
-NAMED SUBPATTERNS
-
-       The  name-to-number translation table that is maintained for named sub-
-       patterns uses 32-bit characters.  The  pcre32_get_stringtable_entries()
-       function returns the length of each entry in the table as the number of
-       32-bit data units.
-
-
-OPTION NAMES
-
-       There   are   two   new   general   option   names,   PCRE_UTF32    and
-       PCRE_NO_UTF32_CHECK,     which     correspond    to    PCRE_UTF8    and
-       PCRE_NO_UTF8_CHECK in the 8-bit library. In  fact,  these  new  options
-       define  the  same bits in the options word. There is a discussion about
-       the validity of UTF-32 strings in the pcreunicode page.
-
-       For the pcre32_config() function there is an  option  PCRE_CONFIG_UTF32
-       that  returns  1  if UTF-32 support is configured, otherwise 0. If this
-       option  is  given  to  pcre_config()  or  pcre16_config(),  or  if  the
-       PCRE_CONFIG_UTF8  or  PCRE_CONFIG_UTF16  option is given to pcre32_con-
-       fig(), the result is the PCRE_ERROR_BADOPTION error.
-
-
-CHARACTER CODES
-
-       In 32-bit mode, when  PCRE_UTF32  is  not  set,  character  values  are
-       treated in the same way as in 8-bit, non UTF-8 mode, except, of course,
-       that they can range from 0 to 0x7fffffff instead of 0 to 0xff.  Charac-
-       ter  types for characters less than 0xff can therefore be influenced by
-       the locale in the same way as before.   Characters  greater  than  0xff
-       have only one case, and no "type" (such as letter or digit).
-
-       In  UTF-32  mode,  the  character  code  is  Unicode, in the range 0 to
-       0x10ffff, with the exception of values in the range  0xd800  to  0xdfff
-       because those are "surrogate" values that are ill-formed in UTF-32.
-
-       A  UTF-32 string can indicate its endianness by special code knows as a
-       byte-order mark (BOM). The PCRE functions do not handle this, expecting
-       strings   to   be  in  host  byte  order.  A  utility  function  called
-       pcre32_utf32_to_host_byte_order() is provided to help  with  this  (see
-       above).
-
-
-ERROR NAMES
-
-       The  error  PCRE_ERROR_BADUTF32  corresponds  to its 8-bit counterpart.
-       The error PCRE_ERROR_BADMODE is given when a compiled pattern is passed
-       to  a  function that processes patterns in the other mode, for example,
-       if a pattern compiled with pcre_compile() is passed to pcre32_exec().
-
-       There are new error codes whose names  begin  with  PCRE_UTF32_ERR  for
-       invalid  UTF-32  strings,  corresponding to the PCRE_UTF8_ERR codes for
-       UTF-8 strings that are described in the section entitled "Reason  codes
-       for  invalid UTF-8 strings" in the main pcreapi page. The UTF-32 errors
-       are:
-
-         PCRE_UTF32_ERR1  Surrogate character (range from 0xd800 to 0xdfff)
-         PCRE_UTF32_ERR2  Non-character
-         PCRE_UTF32_ERR3  Character > 0x10ffff
-
-
-ERROR TEXTS
-
-       If there is an error while compiling a pattern, the error text that  is
-       passed  back by pcre32_compile() or pcre32_compile2() is still an 8-bit
-       character string, zero-terminated.
-
-
-CALLOUTS
-
-       The subject and mark fields in the callout block that is  passed  to  a
-       callout function point to 32-bit vectors.
-
-
-TESTING
-
-       The  pcretest  program continues to operate with 8-bit input and output
-       files, but it can be used for testing the 32-bit library. If it is  run
-       with the command line option -32, patterns and subject strings are con-
-       verted from 8-bit to 32-bit before being passed to PCRE, and the 32-bit
-       library  functions  are used instead of the 8-bit ones. Returned 32-bit
-       strings are converted to 8-bit for output. If both the  8-bit  and  the
-       16-bit libraries were not compiled, pcretest defaults to 32-bit and the
-       -32 option is ignored.
-
-       When PCRE is being built, the RunTest script that is  called  by  "make
-       check"  uses  the  pcretest  -C  option to discover which of the 8-bit,
-       16-bit and 32-bit libraries has been built, and runs the  tests  appro-
-       priately.
-
-
-NOT SUPPORTED IN 32-BIT MODE
-
-       Not all the features of the 8-bit library are available with the 32-bit
-       library. The C++ and POSIX wrapper functions  support  only  the  8-bit
-       library, and the pcregrep program is at present 8-bit only.
-
-
-AUTHOR
-
-       Philip Hazel
-       University Computing Service
-       Cambridge CB2 3QH, England.
-
-
-REVISION
-
-       Last updated: 12 May 2013
-       Copyright (c) 1997-2013 University of Cambridge.
-------------------------------------------------------------------------------
-
-
-PCREBUILD(3)               Library Functions Manual               PCREBUILD(3)
-
-
-
-NAME
-       PCRE - Perl-compatible regular expressions
-
-BUILDING PCRE
-
-       PCRE  is  distributed with a configure script that can be used to build
-       the library in Unix-like environments using the applications  known  as
-       Autotools.   Also  in  the  distribution  are files to support building
-       using CMake instead of configure. The text file README contains general
-       information  about  building  with Autotools (some of which is repeated
-       below), and also has some comments about building on various  operating
-       systems.  There  is  a lot more information about building PCRE without
-       using Autotools (including information about using CMake  and  building
-       "by  hand")  in  the  text file called NON-AUTOTOOLS-BUILD.  You should
-       consult this file as well as the README file if you are building  in  a
-       non-Unix-like environment.
-
-
-PCRE BUILD-TIME OPTIONS
-
-       The  rest of this document describes the optional features of PCRE that
-       can be selected when the library is compiled. It  assumes  use  of  the
-       configure  script,  where  the  optional features are selected or dese-
-       lected by providing options to configure before running the  make  com-
-       mand.  However,  the same options can be selected in both Unix-like and
-       non-Unix-like environments using the GUI facility of cmake-gui  if  you
-       are using CMake instead of configure to build PCRE.
-
-       If  you  are not using Autotools or CMake, option selection can be done
-       by editing the config.h file, or by passing parameter settings  to  the
-       compiler, as described in NON-AUTOTOOLS-BUILD.
-
-       The complete list of options for configure (which includes the standard
-       ones such as the  selection  of  the  installation  directory)  can  be
-       obtained by running
-
-         ./configure --help
-
-       The  following  sections  include  descriptions  of options whose names
-       begin with --enable or --disable. These settings specify changes to the
-       defaults  for  the configure command. Because of the way that configure
-       works, --enable and --disable always come in pairs, so  the  complemen-
-       tary  option always exists as well, but as it specifies the default, it
-       is not described.
-
-
-BUILDING 8-BIT, 16-BIT AND 32-BIT LIBRARIES
-
-       By default, a library called libpcre  is  built,  containing  functions
-       that  take  string  arguments  contained in vectors of bytes, either as
-       single-byte characters, or interpreted as UTF-8 strings. You  can  also
-       build  a  separate library, called libpcre16, in which strings are con-
-       tained in vectors of 16-bit data units and interpreted either  as  sin-
-       gle-unit characters or UTF-16 strings, by adding
-
-         --enable-pcre16
-
-       to  the  configure  command.  You  can  also build yet another separate
-       library, called libpcre32, in which strings are contained in vectors of
-       32-bit  data  units and interpreted either as single-unit characters or
-       UTF-32 strings, by adding
-
-         --enable-pcre32
-
-       to the configure command. If you do not want the 8-bit library, add
-
-         --disable-pcre8
-
-       as well. At least one of the three libraries must be built.  Note  that
-       the  C++  and  POSIX  wrappers are for the 8-bit library only, and that
-       pcregrep is an 8-bit program. None of these are  built  if  you  select
-       only the 16-bit or 32-bit libraries.
-
-
-BUILDING SHARED AND STATIC LIBRARIES
-
-       The  Autotools  PCRE building process uses libtool to build both shared
-       and static libraries by default. You  can  suppress  one  of  these  by
-       adding one of
-
-         --disable-shared
-         --disable-static
-
-       to the configure command, as required.
-
-
-C++ SUPPORT
-
-       By  default,  if the 8-bit library is being built, the configure script
-       will search for a C++ compiler and C++ header files. If it finds  them,
-       it  automatically  builds  the C++ wrapper library (which supports only
-       8-bit strings). You can disable this by adding
-
-         --disable-cpp
-
-       to the configure command.
-
-
-UTF-8, UTF-16 AND UTF-32 SUPPORT
-
-       To build PCRE with support for UTF Unicode character strings, add
-
-         --enable-utf
-
-       to the configure command. This setting applies to all three  libraries,
-       adding  support  for  UTF-8 to the 8-bit library, support for UTF-16 to
-       the 16-bit library, and  support  for  UTF-32  to  the  to  the  32-bit
-       library.  There  are no separate options for enabling UTF-8, UTF-16 and
-       UTF-32 independently because that would allow ridiculous settings  such
-       as  requesting UTF-16 support while building only the 8-bit library. It
-       is not possible to build one library with UTF support and another with-
-       out  in the same configuration. (For backwards compatibility, --enable-
-       utf8 is a synonym of --enable-utf.)
-
-       Of itself, this setting does not make  PCRE  treat  strings  as  UTF-8,
-       UTF-16  or UTF-32. As well as compiling PCRE with this option, you also
-       have have to set the PCRE_UTF8, PCRE_UTF16  or  PCRE_UTF32  option  (as
-       appropriate) when you call one of the pattern compiling functions.
-
-       If  you  set --enable-utf when compiling in an EBCDIC environment, PCRE
-       expects its input to be either ASCII or UTF-8 (depending  on  the  run-
-       time option). It is not possible to support both EBCDIC and UTF-8 codes
-       in the same version of  the  library.  Consequently,  --enable-utf  and
-       --enable-ebcdic are mutually exclusive.
-
-
-UNICODE CHARACTER PROPERTY SUPPORT
-
-       UTF  support allows the libraries to process character codepoints up to
-       0x10ffff in the strings that they handle. On its own, however, it  does
-       not provide any facilities for accessing the properties of such charac-
-       ters. If you want to be able to use the pattern escapes \P, \p, and \X,
-       which refer to Unicode character properties, you must add
-
-         --enable-unicode-properties
-
-       to  the  configure  command. This implies UTF support, even if you have
-       not explicitly requested it.
-
-       Including Unicode property support adds around 30K  of  tables  to  the
-       PCRE  library.  Only  the general category properties such as Lu and Nd
-       are supported. Details are given in the pcrepattern documentation.
-
-
-JUST-IN-TIME COMPILER SUPPORT
-
-       Just-in-time compiler support is included in the build by specifying
-
-         --enable-jit
-
-       This support is available only for certain hardware  architectures.  If
-       this  option  is  set  for  an unsupported architecture, a compile time
-       error occurs.  See the pcrejit documentation for a  discussion  of  JIT
-       usage. When JIT support is enabled, pcregrep automatically makes use of
-       it, unless you add
-
-         --disable-pcregrep-jit
-
-       to the "configure" command.
-
-
-CODE VALUE OF NEWLINE
-
-       By default, PCRE interprets the linefeed (LF) character  as  indicating
-       the  end  of  a line. This is the normal newline character on Unix-like
-       systems. You can compile PCRE to use carriage return (CR)  instead,  by
-       adding
-
-         --enable-newline-is-cr
-
-       to  the  configure  command.  There  is  also  a --enable-newline-is-lf
-       option, which explicitly specifies linefeed as the newline character.
-
-       Alternatively, you can specify that line endings are to be indicated by
-       the two character sequence CRLF. If you want this, add
-
-         --enable-newline-is-crlf
-
-       to the configure command. There is a fourth option, specified by
-
-         --enable-newline-is-anycrlf
-
-       which  causes  PCRE  to recognize any of the three sequences CR, LF, or
-       CRLF as indicating a line ending. Finally, a fifth option, specified by
-
-         --enable-newline-is-any
-
-       causes PCRE to recognize any Unicode newline sequence.
-
-       Whatever line ending convention is selected when PCRE is built  can  be
-       overridden  when  the library functions are called. At build time it is
-       conventional to use the standard for your operating system.
-
-
-WHAT \R MATCHES
-
-       By default, the sequence \R in a pattern matches  any  Unicode  newline
-       sequence,  whatever  has  been selected as the line ending sequence. If
-       you specify
-
-         --enable-bsr-anycrlf
-
-       the default is changed so that \R matches only CR, LF, or  CRLF.  What-
-       ever  is selected when PCRE is built can be overridden when the library
-       functions are called.
-
-
-POSIX MALLOC USAGE
-
-       When the 8-bit library is called through the POSIX interface  (see  the
-       pcreposix  documentation),  additional  working storage is required for
-       holding the pointers to capturing  substrings,  because  PCRE  requires
-       three integers per substring, whereas the POSIX interface provides only
-       two. If the number of expected substrings is small, the  wrapper  func-
-       tion  uses  space  on the stack, because this is faster than using mal-
-       loc() for each call. The default threshold above which the stack is  no
-       longer used is 10; it can be changed by adding a setting such as
-
-         --with-posix-malloc-threshold=20
-
-       to the configure command.
-
-
-HANDLING VERY LARGE PATTERNS
-
-       Within  a  compiled  pattern,  offset values are used to point from one
-       part to another (for example, from an opening parenthesis to an  alter-
-       nation  metacharacter).  By default, in the 8-bit and 16-bit libraries,
-       two-byte values are used for these offsets, leading to a  maximum  size
-       for  a compiled pattern of around 64K. This is sufficient to handle all
-       but the most gigantic patterns.  Nevertheless, some people do  want  to
-       process  truly  enormous patterns, so it is possible to compile PCRE to
-       use three-byte or four-byte offsets by adding a setting such as
-
-         --with-link-size=3
-
-       to the configure command. The value given must be 2, 3, or 4.  For  the
-       16-bit  library,  a  value of 3 is rounded up to 4. In these libraries,
-       using longer offsets slows down the operation of PCRE because it has to
-       load  additional  data  when  handling them. For the 32-bit library the
-       value is always 4 and cannot be overridden; the value  of  --with-link-
-       size is ignored.
-
-
-AVOIDING EXCESSIVE STACK USAGE
-
-       When matching with the pcre_exec() function, PCRE implements backtrack-
-       ing by making recursive calls to an internal function  called  match().
-       In  environments  where  the size of the stack is limited, this can se-
-       verely limit PCRE's operation. (The Unix environment does  not  usually
-       suffer from this problem, but it may sometimes be necessary to increase
-       the maximum stack size.  There is a discussion in the  pcrestack  docu-
-       mentation.)  An alternative approach to recursion that uses memory from
-       the heap to remember data, instead of using recursive  function  calls,
-       has  been  implemented to work round the problem of limited stack size.
-       If you want to build a version of PCRE that works this way, add
-
-         --disable-stack-for-recursion
-
-       to the configure command. With this configuration, PCRE  will  use  the
-       pcre_stack_malloc  and pcre_stack_free variables to call memory manage-
-       ment functions. By default these point to malloc() and free(), but  you
-       can replace the pointers so that your own functions are used instead.
-
-       Separate  functions  are  provided  rather  than  using pcre_malloc and
-       pcre_free because the  usage  is  very  predictable:  the  block  sizes
-       requested  are  always  the  same,  and  the blocks are always freed in
-       reverse order. A calling program might be able to  implement  optimized
-       functions  that  perform  better  than  malloc()  and free(). PCRE runs
-       noticeably more slowly when built in this way. This option affects only
-       the pcre_exec() function; it is not relevant for pcre_dfa_exec().
-
-
-LIMITING PCRE RESOURCE USAGE
-
-       Internally,  PCRE has a function called match(), which it calls repeat-
-       edly  (sometimes  recursively)  when  matching  a  pattern   with   the
-       pcre_exec()  function.  By controlling the maximum number of times this
-       function may be called during a single matching operation, a limit  can
-       be  placed  on  the resources used by a single call to pcre_exec(). The
-       limit can be changed at run time, as described in the pcreapi  documen-
-       tation.  The default is 10 million, but this can be changed by adding a
-       setting such as
-
-         --with-match-limit=500000
-
-       to  the  configure  command.  This  setting  has  no  effect   on   the
-       pcre_dfa_exec() matching function.
-
-       In  some  environments  it is desirable to limit the depth of recursive
-       calls of match() more strictly than the total number of calls, in order
-       to  restrict  the maximum amount of stack (or heap, if --disable-stack-
-       for-recursion is specified) that is used. A second limit controls this;
-       it  defaults  to  the  value  that is set for --with-match-limit, which
-       imposes no additional constraints. However, you can set a  lower  limit
-       by adding, for example,
-
-         --with-match-limit-recursion=10000
-
-       to  the  configure  command.  This  value can also be overridden at run
-       time.
-
-
-CREATING CHARACTER TABLES AT BUILD TIME
-
-       PCRE uses fixed tables for processing characters whose code values  are
-       less  than 256. By default, PCRE is built with a set of tables that are
-       distributed in the file pcre_chartables.c.dist. These  tables  are  for
-       ASCII codes only. If you add
-
-         --enable-rebuild-chartables
-
-       to  the  configure  command, the distributed tables are no longer used.
-       Instead, a program called dftables is compiled and  run.  This  outputs
-       the source for new set of tables, created in the default locale of your
-       C run-time system. (This method of replacing the tables does  not  work
-       if  you are cross compiling, because dftables is run on the local host.
-       If you need to create alternative tables when cross compiling, you will
-       have to do so "by hand".)
-
-
-USING EBCDIC CODE
-
-       PCRE  assumes  by  default that it will run in an environment where the
-       character code is ASCII (or Unicode, which is  a  superset  of  ASCII).
-       This  is  the  case for most computer operating systems. PCRE can, how-
-       ever, be compiled to run in an EBCDIC environment by adding
-
-         --enable-ebcdic
-
-       to the configure command. This setting implies --enable-rebuild-charta-
-       bles.  You  should  only  use  it if you know that you are in an EBCDIC
-       environment (for example,  an  IBM  mainframe  operating  system).  The
-       --enable-ebcdic option is incompatible with --enable-utf.
-
-       The EBCDIC character that corresponds to an ASCII LF is assumed to have
-       the value 0x15 by default. However, in some EBCDIC  environments,  0x25
-       is used. In such an environment you should use
-
-         --enable-ebcdic-nl25
-
-       as well as, or instead of, --enable-ebcdic. The EBCDIC character for CR
-       has the same value as in ASCII, namely, 0x0d.  Whichever  of  0x15  and
-       0x25 is not chosen as LF is made to correspond to the Unicode NEL char-
-       acter (which, in Unicode, is 0x85).
-
-       The options that select newline behaviour, such as --enable-newline-is-
-       cr, and equivalent run-time options, refer to these character values in
-       an EBCDIC environment.
-
-
-PCREGREP OPTIONS FOR COMPRESSED FILE SUPPORT
-
-       By default, pcregrep reads all files as plain text. You can build it so
-       that it recognizes files whose names end in .gz or .bz2, and reads them
-       with libz or libbz2, respectively, by adding one or both of
-
-         --enable-pcregrep-libz
-         --enable-pcregrep-libbz2
-
-       to the configure command. These options naturally require that the rel-
-       evant  libraries  are installed on your system. Configuration will fail
-       if they are not.
-
-
-PCREGREP BUFFER SIZE
-
-       pcregrep uses an internal buffer to hold a "window" on the file  it  is
-       scanning, in order to be able to output "before" and "after" lines when
-       it finds a match. The size of the buffer is controlled by  a  parameter
-       whose default value is 20K. The buffer itself is three times this size,
-       but because of the way it is used for holding "before" lines, the long-
-       est  line  that  is guaranteed to be processable is the parameter size.
-       You can change the default parameter value by adding, for example,
-
-         --with-pcregrep-bufsize=50K
-
-       to the configure command. The caller of pcregrep can, however, override
-       this value by specifying a run-time option.
-
-
-PCRETEST OPTION FOR LIBREADLINE SUPPORT
-
-       If you add
-
-         --enable-pcretest-libreadline
-
-       to  the  configure  command,  pcretest  is  linked with the libreadline
-       library, and when its input is from a terminal, it reads it  using  the
-       readline() function. This provides line-editing and history facilities.
-       Note that libreadline is GPL-licensed, so if you distribute a binary of
-       pcretest linked in this way, there may be licensing issues.
-
-       Setting  this  option  causes  the -lreadline option to be added to the
-       pcretest build. In many operating environments with  a  sytem-installed
-       libreadline this is sufficient. However, in some environments (e.g.  if
-       an unmodified distribution version of readline is in use),  some  extra
-       configuration  may  be necessary. The INSTALL file for libreadline says
-       this:
-
-         "Readline uses the termcap functions, but does not link with the
-         termcap or curses library itself, allowing applications which link
-         with readline the to choose an appropriate library."
-
-       If your environment has not been set up so that an appropriate  library
-       is automatically included, you may need to add something like
-
-         LIBS="-ncurses"
-
-       immediately before the configure command.
-
-
-DEBUGGING WITH VALGRIND SUPPORT
-
-       By adding the
-
-         --enable-valgrind
-
-       option  to to the configure command, PCRE will use valgrind annotations
-       to mark certain memory regions as  unaddressable.  This  allows  it  to
-       detect invalid memory accesses, and is mostly useful for debugging PCRE
-       itself.
-
-
-CODE COVERAGE REPORTING
-
-       If your C compiler is gcc, you can build a version  of  PCRE  that  can
-       generate a code coverage report for its test suite. To enable this, you
-       must install lcov version 1.6 or above. Then specify
-
-         --enable-coverage
-
-       to the configure command and build PCRE in the usual way.
-
-       Note that using ccache (a caching C compiler) is incompatible with code
-       coverage  reporting. If you have configured ccache to run automatically
-       on your system, you must set the environment variable
-
-         CCACHE_DISABLE=1
-
-       before running make to build PCRE, so that ccache is not used.
-
-       When --enable-coverage is used,  the  following  addition  targets  are
-       added to the Makefile:
-
-         make coverage
-
-       This  creates  a  fresh  coverage report for the PCRE test suite. It is
-       equivalent to running "make coverage-reset", "make  coverage-baseline",
-       "make check", and then "make coverage-report".
-
-         make coverage-reset
-
-       This zeroes the coverage counters, but does nothing else.
-
-         make coverage-baseline
-
-       This captures baseline coverage information.
-
-         make coverage-report
-
-       This creates the coverage report.
-
-         make coverage-clean-report
-
-       This  removes the generated coverage report without cleaning the cover-
-       age data itself.
-
-         make coverage-clean-data
-
-       This removes the captured coverage data without removing  the  coverage
-       files created at compile time (*.gcno).
-
-         make coverage-clean
-
-       This  cleans all coverage data including the generated coverage report.
-       For more information about code coverage, see the gcov and  lcov  docu-
-       mentation.
-
-
-SEE ALSO
-
-       pcreapi(3), pcre16, pcre32, pcre_config(3).
-
-
-AUTHOR
-
-       Philip Hazel
-       University Computing Service
-       Cambridge CB2 3QH, England.
-
-
-REVISION
-
-       Last updated: 12 May 2013
-       Copyright (c) 1997-2013 University of Cambridge.
-------------------------------------------------------------------------------
-
-
-PCREMATCHING(3)            Library Functions Manual            PCREMATCHING(3)
-
-
-
-NAME
-       PCRE - Perl-compatible regular expressions
-
-PCRE MATCHING ALGORITHMS
-
-       This document describes the two different algorithms that are available
-       in PCRE for matching a compiled regular expression against a given sub-
-       ject  string.  The  "standard"  algorithm  is  the  one provided by the
-       pcre_exec(), pcre16_exec() and pcre32_exec() functions. These  work  in
-       the  same as as Perl's matching function, and provide a Perl-compatible
-       matching  operation.   The  just-in-time  (JIT)  optimization  that  is
-       described  in  the pcrejit documentation is compatible with these func-
-       tions.
-
-       An  alternative  algorithm  is   provided   by   the   pcre_dfa_exec(),
-       pcre16_dfa_exec()  and  pcre32_dfa_exec()  functions; they operate in a
-       different way, and are not Perl-compatible. This alternative has advan-
-       tages and disadvantages compared with the standard algorithm, and these
-       are described below.
-
-       When there is only one possible way in which a given subject string can
-       match  a pattern, the two algorithms give the same answer. A difference
-       arises, however, when there are multiple possibilities. For example, if
-       the pattern
-
-         ^<.*>
-
-       is matched against the string
-
-         <something> <something else> <something further>
-
-       there are three possible answers. The standard algorithm finds only one
-       of them, whereas the alternative algorithm finds all three.
-
-
-REGULAR EXPRESSIONS AS TREES
-
-       The set of strings that are matched by a regular expression can be rep-
-       resented  as  a  tree structure. An unlimited repetition in the pattern
-       makes the tree of infinite size, but it is still a tree.  Matching  the
-       pattern  to a given subject string (from a given starting point) can be
-       thought of as a search of the tree.  There are two  ways  to  search  a
-       tree:  depth-first  and  breadth-first, and these correspond to the two
-       matching algorithms provided by PCRE.
-
-
-THE STANDARD MATCHING ALGORITHM
-
-       In the terminology of Jeffrey Friedl's book "Mastering Regular  Expres-
-       sions",  the  standard  algorithm  is an "NFA algorithm". It conducts a
-       depth-first search of the pattern tree. That is, it  proceeds  along  a
-       single path through the tree, checking that the subject matches what is
-       required. When there is a mismatch, the algorithm  tries  any  alterna-
-       tives  at  the  current point, and if they all fail, it backs up to the
-       previous branch point in the  tree,  and  tries  the  next  alternative
-       branch  at  that  level.  This often involves backing up (moving to the
-       left) in the subject string as well.  The  order  in  which  repetition
-       branches  are  tried  is controlled by the greedy or ungreedy nature of
-       the quantifier.
-
-       If a leaf node is reached, a matching string has  been  found,  and  at
-       that  point the algorithm stops. Thus, if there is more than one possi-
-       ble match, this algorithm returns the first one that it finds.  Whether
-       this  is the shortest, the longest, or some intermediate length depends
-       on the way the greedy and ungreedy repetition quantifiers are specified
-       in the pattern.
-
-       Because  it  ends  up  with a single path through the tree, it is rela-
-       tively straightforward for this algorithm to keep  track  of  the  sub-
-       strings  that  are  matched  by portions of the pattern in parentheses.
-       This provides support for capturing parentheses and back references.
-
-
-THE ALTERNATIVE MATCHING ALGORITHM
-
-       This algorithm conducts a breadth-first search of  the  tree.  Starting
-       from  the  first  matching  point  in the subject, it scans the subject
-       string from left to right, once, character by character, and as it does
-       this,  it remembers all the paths through the tree that represent valid
-       matches. In Friedl's terminology, this is a kind  of  "DFA  algorithm",
-       though  it is not implemented as a traditional finite state machine (it
-       keeps multiple states active simultaneously).
-
-       Although the general principle of this matching algorithm  is  that  it
-       scans  the subject string only once, without backtracking, there is one
-       exception: when a lookaround assertion is encountered,  the  characters
-       following  or  preceding  the  current  point  have to be independently
-       inspected.
-
-       The scan continues until either the end of the subject is  reached,  or
-       there  are  no more unterminated paths. At this point, terminated paths
-       represent the different matching possibilities (if there are none,  the
-       match  has  failed).   Thus,  if there is more than one possible match,
-       this algorithm finds all of them, and in particular, it finds the long-
-       est.  The  matches are returned in decreasing order of length. There is
-       an option to stop the algorithm after the first match (which is  neces-
-       sarily the shortest) is found.
-
-       Note that all the matches that are found start at the same point in the
-       subject. If the pattern
-
-         cat(er(pillar)?)?
-
-       is matched against the string "the caterpillar catchment",  the  result
-       will  be the three strings "caterpillar", "cater", and "cat" that start
-       at the fifth character of the subject. The algorithm does not automati-
-       cally move on to find matches that start at later positions.
-
-       PCRE's  "auto-possessification" optimization usually applies to charac-
-       ter repeats at the end of a pattern (as well as internally). For  exam-
-       ple, the pattern "a\d+" is compiled as if it were "a\d++" because there
-       is no point even considering the possibility of backtracking  into  the
-       repeated  digits.  For  DFA matching, this means that only one possible
-       match is found. If you really do want multiple matches in  such  cases,
-       either use an ungreedy repeat ("a\d+?") or set the PCRE_NO_AUTO_POSSESS
-       option when compiling.
-
-       There are a number of features of PCRE regular expressions that are not
-       supported by the alternative matching algorithm. They are as follows:
-
-       1.  Because  the  algorithm  finds  all possible matches, the greedy or
-       ungreedy nature of repetition quantifiers is not relevant.  Greedy  and
-       ungreedy quantifiers are treated in exactly the same way. However, pos-
-       sessive quantifiers can make a difference when what follows could  also
-       match what is quantified, for example in a pattern like this:
-
-         ^a++\w!
-
-       This  pattern matches "aaab!" but not "aaa!", which would be matched by
-       a non-possessive quantifier. Similarly, if an atomic group is  present,
-       it  is matched as if it were a standalone pattern at the current point,
-       and the longest match is then "locked in" for the rest of  the  overall
-       pattern.
-
-       2. When dealing with multiple paths through the tree simultaneously, it
-       is not straightforward to keep track of  captured  substrings  for  the
-       different  matching  possibilities,  and  PCRE's implementation of this
-       algorithm does not attempt to do this. This means that no captured sub-
-       strings are available.
-
-       3.  Because no substrings are captured, back references within the pat-
-       tern are not supported, and cause errors if encountered.
-
-       4. For the same reason, conditional expressions that use  a  backrefer-
-       ence  as  the  condition or test for a specific group recursion are not
-       supported.
-
-       5. Because many paths through the tree may be  active,  the  \K  escape
-       sequence, which resets the start of the match when encountered (but may
-       be on some paths and not on others), is not  supported.  It  causes  an
-       error if encountered.
-
-       6.  Callouts  are  supported, but the value of the capture_top field is
-       always 1, and the value of the capture_last field is always -1.
-
-       7. The \C escape sequence, which (in  the  standard  algorithm)  always
-       matches  a  single data unit, even in UTF-8, UTF-16 or UTF-32 modes, is
-       not supported in these modes, because the alternative  algorithm  moves
-       through the subject string one character (not data unit) at a time, for
-       all active paths through the tree.
-
-       8. Except for (*FAIL), the backtracking control verbs such as  (*PRUNE)
-       are  not  supported.  (*FAIL)  is supported, and behaves like a failing
-       negative assertion.
-
-
-ADVANTAGES OF THE ALTERNATIVE ALGORITHM
-
-       Using the alternative matching algorithm provides the following  advan-
-       tages:
-
-       1. All possible matches (at a single point in the subject) are automat-
-       ically found, and in particular, the longest match is  found.  To  find
-       more than one match using the standard algorithm, you have to do kludgy
-       things with callouts.
-
-       2. Because the alternative algorithm  scans  the  subject  string  just
-       once, and never needs to backtrack (except for lookbehinds), it is pos-
-       sible to pass very long subject strings to  the  matching  function  in
-       several pieces, checking for partial matching each time. Although it is
-       possible to do multi-segment matching using the standard  algorithm  by
-       retaining  partially  matched  substrings,  it is more complicated. The
-       pcrepartial documentation gives details of partial  matching  and  dis-
-       cusses multi-segment matching.
-
-
-DISADVANTAGES OF THE ALTERNATIVE ALGORITHM
-
-       The alternative algorithm suffers from a number of disadvantages:
-
-       1.  It  is  substantially  slower  than the standard algorithm. This is
-       partly because it has to search for all possible matches, but  is  also
-       because it is less susceptible to optimization.
-
-       2. Capturing parentheses and back references are not supported.
-
-       3. Although atomic groups are supported, their use does not provide the
-       performance advantage that it does for the standard algorithm.
-
-
-AUTHOR
-
-       Philip Hazel
-       University Computing Service
-       Cambridge CB2 3QH, England.
-
-
-REVISION
-
-       Last updated: 12 November 2013
-       Copyright (c) 1997-2012 University of Cambridge.
-------------------------------------------------------------------------------
-
-
-PCREAPI(3)                 Library Functions Manual                 PCREAPI(3)
-
-
-
-NAME
-       PCRE - Perl-compatible regular expressions
-
-       #include <pcre.h>
-
-
-PCRE NATIVE API BASIC FUNCTIONS
-
-       pcre *pcre_compile(const char *pattern, int options,
-            const char **errptr, int *erroffset,
-            const unsigned char *tableptr);
-
-       pcre *pcre_compile2(const char *pattern, int options,
-            int *errorcodeptr,
-            const char **errptr, int *erroffset,
-            const unsigned char *tableptr);
-
-       pcre_extra *pcre_study(const pcre *code, int options,
-            const char **errptr);
-
-       void pcre_free_study(pcre_extra *extra);
-
-       int pcre_exec(const pcre *code, const pcre_extra *extra,
-            const char *subject, int length, int startoffset,
-            int options, int *ovector, int ovecsize);
-
-       int pcre_dfa_exec(const pcre *code, const pcre_extra *extra,
-            const char *subject, int length, int startoffset,
-            int options, int *ovector, int ovecsize,
-            int *workspace, int wscount);
-
-
-PCRE NATIVE API STRING EXTRACTION FUNCTIONS
-
-       int pcre_copy_named_substring(const pcre *code,
-            const char *subject, int *ovector,
-            int stringcount, const char *stringname,
-            char *buffer, int buffersize);
-
-       int pcre_copy_substring(const char *subject, int *ovector,
-            int stringcount, int stringnumber, char *buffer,
-            int buffersize);
-
-       int pcre_get_named_substring(const pcre *code,
-            const char *subject, int *ovector,
-            int stringcount, const char *stringname,
-            const char **stringptr);
-
-       int pcre_get_stringnumber(const pcre *code,
-            const char *name);
-
-       int pcre_get_stringtable_entries(const pcre *code,
-            const char *name, char **first, char **last);
-
-       int pcre_get_substring(const char *subject, int *ovector,
-            int stringcount, int stringnumber,
-            const char **stringptr);
-
-       int pcre_get_substring_list(const char *subject,
-            int *ovector, int stringcount, const char ***listptr);
-
-       void pcre_free_substring(const char *stringptr);
-
-       void pcre_free_substring_list(const char **stringptr);
-
-
-PCRE NATIVE API AUXILIARY FUNCTIONS
-
-       int pcre_jit_exec(const pcre *code, const pcre_extra *extra,
-            const char *subject, int length, int startoffset,
-            int options, int *ovector, int ovecsize,
-            pcre_jit_stack *jstack);
-
-       pcre_jit_stack *pcre_jit_stack_alloc(int startsize, int maxsize);
-
-       void pcre_jit_stack_free(pcre_jit_stack *stack);
-
-       void pcre_assign_jit_stack(pcre_extra *extra,
-            pcre_jit_callback callback, void *data);
-
-       const unsigned char *pcre_maketables(void);
-
-       int pcre_fullinfo(const pcre *code, const pcre_extra *extra,
-            int what, void *where);
-
-       int pcre_refcount(pcre *code, int adjust);
-
-       int pcre_config(int what, void *where);
-
-       const char *pcre_version(void);
-
-       int pcre_pattern_to_host_byte_order(pcre *code,
-            pcre_extra *extra, const unsigned char *tables);
-
-
-PCRE NATIVE API INDIRECTED FUNCTIONS
-
-       void *(*pcre_malloc)(size_t);
-
-       void (*pcre_free)(void *);
-
-       void *(*pcre_stack_malloc)(size_t);
-
-       void (*pcre_stack_free)(void *);
-
-       int (*pcre_callout)(pcre_callout_block *);
-
-       int (*pcre_stack_guard)(void);
-
-
-PCRE 8-BIT, 16-BIT, AND 32-BIT LIBRARIES
-
-       As  well  as  support  for  8-bit character strings, PCRE also supports
-       16-bit strings (from release 8.30) and  32-bit  strings  (from  release
-       8.32),  by means of two additional libraries. They can be built as well
-       as, or instead of, the 8-bit library. To avoid too  much  complication,
-       this  document describes the 8-bit versions of the functions, with only
-       occasional references to the 16-bit and 32-bit libraries.
-
-       The 16-bit and 32-bit functions operate in the same way as their  8-bit
-       counterparts;  they  just  use different data types for their arguments
-       and results, and their names start with pcre16_ or pcre32_  instead  of
-       pcre_.  For  every  option  that  has  UTF8  in  its name (for example,
-       PCRE_UTF8), there are corresponding 16-bit and 32-bit names  with  UTF8
-       replaced by UTF16 or UTF32, respectively. This facility is in fact just
-       cosmetic; the 16-bit and 32-bit option names define the same  bit  val-
-       ues.
-
-       References to bytes and UTF-8 in this document should be read as refer-
-       ences to 16-bit data units and UTF-16 when using the 16-bit library, or
-       32-bit  data  units  and  UTF-32  when using the 32-bit library, unless
-       specified otherwise.  More details of the specific differences for  the
-       16-bit and 32-bit libraries are given in the pcre16 and pcre32 pages.
-
-
-PCRE API OVERVIEW
-
-       PCRE has its own native API, which is described in this document. There
-       are also some wrapper functions (for the 8-bit library only) that  cor-
-       respond  to  the  POSIX  regular  expression  API, but they do not give
-       access to all the functionality. They are described  in  the  pcreposix
-       documentation.  Both  of these APIs define a set of C function calls. A
-       C++ wrapper (again for the 8-bit library only) is also distributed with
-       PCRE. It is documented in the pcrecpp page.
-
-       The  native  API  C  function prototypes are defined in the header file
-       pcre.h, and on Unix-like systems the (8-bit) library itself  is  called
-       libpcre.  It  can  normally be accessed by adding -lpcre to the command
-       for linking an application that uses PCRE. The header file defines  the
-       macros PCRE_MAJOR and PCRE_MINOR to contain the major and minor release
-       numbers for the library. Applications can use these to include  support
-       for different releases of PCRE.
-
-       In a Windows environment, if you want to statically link an application
-       program against a non-dll pcre.a  file,  you  must  define  PCRE_STATIC
-       before  including  pcre.h or pcrecpp.h, because otherwise the pcre_mal-
-       loc()   and   pcre_free()   exported   functions   will   be   declared
-       __declspec(dllimport), with unwanted results.
-
-       The   functions   pcre_compile(),  pcre_compile2(),  pcre_study(),  and
-       pcre_exec() are used for compiling and matching regular expressions  in
-       a  Perl-compatible  manner. A sample program that demonstrates the sim-
-       plest way of using them is provided in the file  called  pcredemo.c  in
-       the PCRE source distribution. A listing of this program is given in the
-       pcredemo documentation, and the pcresample documentation describes  how
-       to compile and run it.
-
-       Just-in-time  compiler  support is an optional feature of PCRE that can
-       be built in appropriate hardware environments. It greatly speeds up the
-       matching  performance  of  many  patterns.  Simple  programs can easily
-       request that it be used if available, by  setting  an  option  that  is
-       ignored  when  it is not relevant. More complicated programs might need
-       to    make    use    of    the    functions     pcre_jit_stack_alloc(),
-       pcre_jit_stack_free(),  and pcre_assign_jit_stack() in order to control
-       the JIT code's memory usage.
-
-       From release 8.32 there is also a direct interface for  JIT  execution,
-       which  gives  improved performance. The JIT-specific functions are dis-
-       cussed in the pcrejit documentation.
-
-       A second matching function, pcre_dfa_exec(), which is not Perl-compati-
-       ble,  is  also provided. This uses a different algorithm for the match-
-       ing. The alternative algorithm finds all possible matches (at  a  given
-       point  in  the  subject), and scans the subject just once (unless there
-       are lookbehind assertions). However, this  algorithm  does  not  return
-       captured  substrings.  A description of the two matching algorithms and
-       their advantages and disadvantages is given in the  pcrematching  docu-
-       mentation.
-
-       In  addition  to  the  main compiling and matching functions, there are
-       convenience functions for extracting captured substrings from a subject
-       string that is matched by pcre_exec(). They are:
-
-         pcre_copy_substring()
-         pcre_copy_named_substring()
-         pcre_get_substring()
-         pcre_get_named_substring()
-         pcre_get_substring_list()
-         pcre_get_stringnumber()
-         pcre_get_stringtable_entries()
-
-       pcre_free_substring() and pcre_free_substring_list() are also provided,
-       to free the memory used for extracted strings.
-
-       The function pcre_maketables() is used to  build  a  set  of  character
-       tables   in   the   current   locale  for  passing  to  pcre_compile(),
-       pcre_exec(), or pcre_dfa_exec(). This is an optional facility  that  is
-       provided  for  specialist  use.  Most  commonly,  no special tables are
-       passed, in which case internal tables that are generated when  PCRE  is
-       built are used.
-
-       The  function  pcre_fullinfo()  is used to find out information about a
-       compiled pattern. The function pcre_version() returns a  pointer  to  a
-       string containing the version of PCRE and its date of release.
-
-       The  function  pcre_refcount()  maintains  a  reference count in a data
-       block containing a compiled pattern. This is provided for  the  benefit
-       of object-oriented applications.
-
-       The  global  variables  pcre_malloc and pcre_free initially contain the
-       entry points of the standard malloc()  and  free()  functions,  respec-
-       tively. PCRE calls the memory management functions via these variables,
-       so a calling program can replace them if it  wishes  to  intercept  the
-       calls. This should be done before calling any PCRE functions.
-
-       The  global  variables  pcre_stack_malloc  and pcre_stack_free are also
-       indirections to memory management functions.  These  special  functions
-       are  used  only  when  PCRE is compiled to use the heap for remembering
-       data, instead of recursive function calls, when running the pcre_exec()
-       function.  See  the  pcrebuild  documentation  for details of how to do
-       this. It is a non-standard way of building PCRE, for  use  in  environ-
-       ments  that  have  limited stacks. Because of the greater use of memory
-       management, it runs more slowly. Separate  functions  are  provided  so
-       that  special-purpose  external  code  can  be used for this case. When
-       used, these functions are always called in a  stack-like  manner  (last
-       obtained,  first freed), and always for memory blocks of the same size.
-       There is a discussion about PCRE's stack usage in the  pcrestack  docu-
-       mentation.
-
-       The global variable pcre_callout initially contains NULL. It can be set
-       by the caller to a "callout" function, which PCRE  will  then  call  at
-       specified  points during a matching operation. Details are given in the
-       pcrecallout documentation.
-
-       The global variable pcre_stack_guard initially contains NULL. It can be
-       set  by  the  caller  to  a function that is called by PCRE whenever it
-       starts to compile a parenthesized part of a pattern.  When  parentheses
-       are nested, PCRE uses recursive function calls, which use up the system
-       stack. This function is provided so that applications  with  restricted
-       stacks  can  force a compilation error if the stack runs out. The func-
-       tion should return zero if all is well, or non-zero to force an error.
-
-
-NEWLINES
-
-       PCRE supports five different conventions for indicating line breaks  in
-       strings:  a  single  CR (carriage return) character, a single LF (line-
-       feed) character, the two-character sequence CRLF, any of the three pre-
-       ceding,  or any Unicode newline sequence. The Unicode newline sequences
-       are the three just mentioned, plus the single characters  VT  (vertical
-       tab, U+000B), FF (form feed, U+000C), NEL (next line, U+0085), LS (line
-       separator, U+2028), and PS (paragraph separator, U+2029).
-
-       Each of the first three conventions is used by at least  one  operating
-       system  as its standard newline sequence. When PCRE is built, a default
-       can be specified.  The default default is LF, which is the  Unix  stan-
-       dard.  When  PCRE  is run, the default can be overridden, either when a
-       pattern is compiled, or when it is matched.
-
-       At compile time, the newline convention can be specified by the options
-       argument  of  pcre_compile(), or it can be specified by special text at
-       the start of the pattern itself; this overrides any other settings. See
-       the pcrepattern page for details of the special character sequences.
-
-       In the PCRE documentation the word "newline" is used to mean "the char-
-       acter or pair of characters that indicate a line break". The choice  of
-       newline  convention  affects  the  handling of the dot, circumflex, and
-       dollar metacharacters, the handling of #-comments in /x mode, and, when
-       CRLF  is a recognized line ending sequence, the match position advance-
-       ment for a non-anchored pattern. There is more detail about this in the
-       section on pcre_exec() options below.
-
-       The  choice of newline convention does not affect the interpretation of
-       the \n or \r escape sequences, nor does  it  affect  what  \R  matches,
-       which is controlled in a similar way, but by separate options.
-
-
-MULTITHREADING
-
-       The  PCRE  functions  can be used in multi-threading applications, with
-       the  proviso  that  the  memory  management  functions  pointed  to  by
-       pcre_malloc, pcre_free, pcre_stack_malloc, and pcre_stack_free, and the
-       callout and stack-checking functions pointed  to  by  pcre_callout  and
-       pcre_stack_guard, are shared by all threads.
-
-       The  compiled form of a regular expression is not altered during match-
-       ing, so the same compiled pattern can safely be used by several threads
-       at once.
-
-       If  the just-in-time optimization feature is being used, it needs sepa-
-       rate memory stack areas for each thread. See the pcrejit  documentation
-       for more details.
-
-
-SAVING PRECOMPILED PATTERNS FOR LATER USE
-
-       The compiled form of a regular expression can be saved and re-used at a
-       later time, possibly by a different program, and even on a  host  other
-       than  the  one  on  which  it  was  compiled.  Details are given in the
-       pcreprecompile documentation,  which  includes  a  description  of  the
-       pcre_pattern_to_host_byte_order()  function. However, compiling a regu-
-       lar expression with one version of PCRE for use with a  different  ver-
-       sion is not guaranteed to work and may cause crashes.
-
-
-CHECKING BUILD-TIME OPTIONS
-
-       int pcre_config(int what, void *where);
-
-       The  function pcre_config() makes it possible for a PCRE client to dis-
-       cover which optional features have been compiled into the PCRE library.
-       The  pcrebuild documentation has more details about these optional fea-
-       tures.
-
-       The first argument for pcre_config() is an  integer,  specifying  which
-       information is required; the second argument is a pointer to a variable
-       into which the information is placed. The returned  value  is  zero  on
-       success,  or  the negative error code PCRE_ERROR_BADOPTION if the value
-       in the first argument is not recognized. The following  information  is
-       available:
-
-         PCRE_CONFIG_UTF8
-
-       The  output is an integer that is set to one if UTF-8 support is avail-
-       able; otherwise it is set to zero. This value should normally be  given
-       to the 8-bit version of this function, pcre_config(). If it is given to
-       the  16-bit  or  32-bit  version  of  this  function,  the  result   is
-       PCRE_ERROR_BADOPTION.
-
-         PCRE_CONFIG_UTF16
-
-       The output is an integer that is set to one if UTF-16 support is avail-
-       able; otherwise it is set to zero. This value should normally be  given
-       to the 16-bit version of this function, pcre16_config(). If it is given
-       to the 8-bit  or  32-bit  version  of  this  function,  the  result  is
-       PCRE_ERROR_BADOPTION.
-
-         PCRE_CONFIG_UTF32
-
-       The output is an integer that is set to one if UTF-32 support is avail-
-       able; otherwise it is set to zero. This value should normally be  given
-       to the 32-bit version of this function, pcre32_config(). If it is given
-       to the 8-bit  or  16-bit  version  of  this  function,  the  result  is
-       PCRE_ERROR_BADOPTION.
-
-         PCRE_CONFIG_UNICODE_PROPERTIES
-
-       The  output  is  an  integer  that is set to one if support for Unicode
-       character properties is available; otherwise it is set to zero.
-
-         PCRE_CONFIG_JIT
-
-       The output is an integer that is set to one if support for just-in-time
-       compiling is available; otherwise it is set to zero.
-
-         PCRE_CONFIG_JITTARGET
-
-       The  output is a pointer to a zero-terminated "const char *" string. If
-       JIT support is available, the string contains the name of the architec-
-       ture  for  which the JIT compiler is configured, for example "x86 32bit
-       (little endian + unaligned)". If JIT  support  is  not  available,  the
-       result is NULL.
-
-         PCRE_CONFIG_NEWLINE
-
-       The  output  is  an integer whose value specifies the default character
-       sequence that is recognized as meaning "newline". The values  that  are
-       supported in ASCII/Unicode environments are: 10 for LF, 13 for CR, 3338
-       for CRLF, -2 for ANYCRLF, and -1 for ANY. In EBCDIC  environments,  CR,
-       ANYCRLF,  and  ANY  yield the same values. However, the value for LF is
-       normally 21, though some EBCDIC environments use 37. The  corresponding
-       values  for  CRLF are 3349 and 3365. The default should normally corre-
-       spond to the standard sequence for your operating system.
-
-         PCRE_CONFIG_BSR
-
-       The output is an integer whose value indicates what character sequences
-       the  \R  escape sequence matches by default. A value of 0 means that \R
-       matches any Unicode line ending sequence; a value of 1  means  that  \R
-       matches only CR, LF, or CRLF. The default can be overridden when a pat-
-       tern is compiled or matched.
-
-         PCRE_CONFIG_LINK_SIZE
-
-       The output is an integer that contains the number  of  bytes  used  for
-       internal  linkage  in  compiled  regular  expressions.  For  the  8-bit
-       library, the value can be 2, 3, or 4. For the 16-bit library, the value
-       is  either  2  or  4  and  is  still  a number of bytes. For the 32-bit
-       library, the value is either 2 or 4 and is still a number of bytes. The
-       default value of 2 is sufficient for all but the most massive patterns,
-       since it allows the compiled pattern to be up to 64K  in  size.  Larger
-       values  allow larger regular expressions to be compiled, at the expense
-       of slower matching.
-
-         PCRE_CONFIG_POSIX_MALLOC_THRESHOLD
-
-       The output is an integer that contains the threshold  above  which  the
-       POSIX  interface  uses malloc() for output vectors. Further details are
-       given in the pcreposix documentation.
-
-         PCRE_CONFIG_PARENS_LIMIT
-
-       The output is a long integer that gives the maximum depth of nesting of
-       parentheses  (of  any  kind) in a pattern. This limit is imposed to cap
-       the amount of system stack used when a pattern is compiled. It is spec-
-       ified  when PCRE is built; the default is 250. This limit does not take
-       into account the stack that may already be used by the calling applica-
-       tion.  For  finer  control  over compilation stack usage, you can set a
-       pointer to an external checking function in pcre_stack_guard.
-
-         PCRE_CONFIG_MATCH_LIMIT
-
-       The output is a long integer that gives the default limit for the  num-
-       ber  of  internal  matching  function calls in a pcre_exec() execution.
-       Further details are given with pcre_exec() below.
-
-         PCRE_CONFIG_MATCH_LIMIT_RECURSION
-
-       The output is a long integer that gives the default limit for the depth
-       of   recursion  when  calling  the  internal  matching  function  in  a
-       pcre_exec() execution.  Further  details  are  given  with  pcre_exec()
-       below.
-
-         PCRE_CONFIG_STACKRECURSE
-
-       The  output is an integer that is set to one if internal recursion when
-       running pcre_exec() is implemented by recursive function calls that use
-       the  stack  to remember their state. This is the usual way that PCRE is
-       compiled. The output is zero if PCRE was compiled to use blocks of data
-       on  the  heap  instead  of  recursive  function  calls.  In  this case,
-       pcre_stack_malloc and  pcre_stack_free  are  called  to  manage  memory
-       blocks on the heap, thus avoiding the use of the stack.
-
-
-COMPILING A PATTERN
-
-       pcre *pcre_compile(const char *pattern, int options,
-            const char **errptr, int *erroffset,
-            const unsigned char *tableptr);
-
-       pcre *pcre_compile2(const char *pattern, int options,
-            int *errorcodeptr,
-            const char **errptr, int *erroffset,
-            const unsigned char *tableptr);
-
-       Either of the functions pcre_compile() or pcre_compile2() can be called
-       to compile a pattern into an internal form. The only difference between
-       the  two interfaces is that pcre_compile2() has an additional argument,
-       errorcodeptr, via which a numerical error  code  can  be  returned.  To
-       avoid  too  much repetition, we refer just to pcre_compile() below, but
-       the information applies equally to pcre_compile2().
-
-       The pattern is a C string terminated by a binary zero, and is passed in
-       the  pattern  argument.  A  pointer to a single block of memory that is
-       obtained via pcre_malloc is returned. This contains the  compiled  code
-       and related data. The pcre type is defined for the returned block; this
-       is a typedef for a structure whose contents are not externally defined.
-       It is up to the caller to free the memory (via pcre_free) when it is no
-       longer required.
-
-       Although the compiled code of a PCRE regex is relocatable, that is,  it
-       does not depend on memory location, the complete pcre data block is not
-       fully relocatable, because it may contain a copy of the tableptr  argu-
-       ment, which is an address (see below).
-
-       The options argument contains various bit settings that affect the com-
-       pilation. It should be zero if no options are required.  The  available
-       options  are  described  below. Some of them (in particular, those that
-       are compatible with Perl, but some others as well) can also be set  and
-       unset  from  within  the  pattern  (see the detailed description in the
-       pcrepattern documentation). For those options that can be different  in
-       different  parts  of  the pattern, the contents of the options argument
-       specifies their settings at the start of compilation and execution. The
-       PCRE_ANCHORED,  PCRE_BSR_xxx, PCRE_NEWLINE_xxx, PCRE_NO_UTF8_CHECK, and
-       PCRE_NO_START_OPTIMIZE options can be set at the time  of  matching  as
-       well as at compile time.
-
-       If errptr is NULL, pcre_compile() returns NULL immediately.  Otherwise,
-       if compilation of a pattern fails,  pcre_compile()  returns  NULL,  and
-       sets the variable pointed to by errptr to point to a textual error mes-
-       sage. This is a static string that is part of the library. You must not
-       try  to  free it. Normally, the offset from the start of the pattern to
-       the data unit that was being processed when the error was discovered is
-       placed  in the variable pointed to by erroffset, which must not be NULL
-       (if it is, an immediate error is given). However, for an invalid  UTF-8
-       or  UTF-16  string,  the  offset  is that of the first data unit of the
-       failing character.
-
-       Some errors are not detected until the whole pattern has been  scanned;
-       in  these  cases,  the offset passed back is the length of the pattern.
-       Note that the offset is in data units, not characters, even  in  a  UTF
-       mode. It may sometimes point into the middle of a UTF-8 or UTF-16 char-
-       acter.
-
-       If pcre_compile2() is used instead of pcre_compile(),  and  the  error-
-       codeptr  argument is not NULL, a non-zero error code number is returned
-       via this argument in the event of an error. This is in addition to  the
-       textual error message. Error codes and messages are listed below.
-
-       If  the  final  argument, tableptr, is NULL, PCRE uses a default set of
-       character tables that are  built  when  PCRE  is  compiled,  using  the
-       default  C  locale.  Otherwise, tableptr must be an address that is the
-       result of a call to pcre_maketables(). This value is  stored  with  the
-       compiled  pattern,  and  used  again by pcre_exec() and pcre_dfa_exec()
-       when the pattern is matched. For more discussion, see  the  section  on
-       locale support below.
-
-       This  code  fragment  shows a typical straightforward call to pcre_com-
-       pile():
-
-         pcre *re;
-         const char *error;
-         int erroffset;
-         re = pcre_compile(
-           "^A.*Z",          /* the pattern */
-           0,                /* default options */
-           &error,           /* for error message */
-           &erroffset,       /* for error offset */
-           NULL);            /* use default character tables */
-
-       The following names for option bits are defined in  the  pcre.h  header
-       file:
-
-         PCRE_ANCHORED
-
-       If this bit is set, the pattern is forced to be "anchored", that is, it
-       is constrained to match only at the first matching point in the  string
-       that  is being searched (the "subject string"). This effect can also be
-       achieved by appropriate constructs in the pattern itself, which is  the
-       only way to do it in Perl.
-
-         PCRE_AUTO_CALLOUT
-
-       If this bit is set, pcre_compile() automatically inserts callout items,
-       all with number 255, before each pattern item. For  discussion  of  the
-       callout facility, see the pcrecallout documentation.
-
-         PCRE_BSR_ANYCRLF
-         PCRE_BSR_UNICODE
-
-       These options (which are mutually exclusive) control what the \R escape
-       sequence matches. The choice is either to match only CR, LF,  or  CRLF,
-       or to match any Unicode newline sequence. The default is specified when
-       PCRE is built. It can be overridden from within the pattern, or by set-
-       ting an option when a compiled pattern is matched.
-
-         PCRE_CASELESS
-
-       If  this  bit is set, letters in the pattern match both upper and lower
-       case letters. It is equivalent to Perl's  /i  option,  and  it  can  be
-       changed  within a pattern by a (?i) option setting. 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  com-
-       piled  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.
-
-         PCRE_DOLLAR_ENDONLY
-
-       If this bit is set, a dollar metacharacter in the pattern matches  only
-       at  the  end  of the subject string. Without this option, a dollar also
-       matches immediately before a newline at the end of the string (but  not
-       before  any  other newlines). The PCRE_DOLLAR_ENDONLY option is ignored
-       if PCRE_MULTILINE is set.  There is no equivalent  to  this  option  in
-       Perl, and no way to set it within a pattern.
-
-         PCRE_DOTALL
-
-       If  this bit is set, a dot metacharacter in the pattern matches a char-
-       acter of any value, including one that indicates a newline. However, it
-       only  ever  matches  one character, even if newlines are coded as CRLF.
-       Without this option, a dot does not match when the current position  is
-       at a newline. This option is equivalent to Perl's /s option, and it can
-       be changed within a pattern by a (?s) option setting. A negative  class
-       such as [^a] always matches newline characters, independent of the set-
-       ting of this option.
-
-         PCRE_DUPNAMES
-
-       If this bit is set, names used to identify capturing  subpatterns  need
-       not be unique. This can be helpful for certain types of pattern when it
-       is known that only one instance of the named  subpattern  can  ever  be
-       matched.  There  are  more details of named subpatterns below; see also
-       the pcrepattern documentation.
-
-         PCRE_EXTENDED
-
-       If this bit is set, most white space  characters  in  the  pattern  are
-       totally  ignored  except when escaped or inside a character class. How-
-       ever, white space is not allowed within  sequences  such  as  (?>  that
-       introduce  various  parenthesized  subpatterns,  nor within a numerical
-       quantifier such as {1,3}.  However, ignorable white space is  permitted
-       between an item and a following quantifier and between a quantifier and
-       a following + that indicates possessiveness.
-
-       White space did not used to include the VT character (code 11), because
-       Perl did not treat this character as white space. However, Perl changed
-       at release 5.18, so PCRE followed  at  release  8.34,  and  VT  is  now
-       treated as white space.
-
-       PCRE_EXTENDED  also  causes characters between an unescaped # outside a
-       character class  and  the  next  newline,  inclusive,  to  be  ignored.
-       PCRE_EXTENDED  is equivalent to Perl's /x option, and it can be changed
-       within a pattern by a (?x) option setting.
-
-       Which characters are interpreted  as  newlines  is  controlled  by  the
-       options  passed to pcre_compile() or by a special sequence at the start
-       of the pattern, as described in the section entitled  "Newline  conven-
-       tions" in the pcrepattern documentation. Note that the end of this type
-       of comment is  a  literal  newline  sequence  in  the  pattern;  escape
-       sequences that happen to represent a newline do not count.
-
-       This  option  makes  it possible to include comments inside complicated
-       patterns.  Note, however, that this applies only  to  data  characters.
-       White  space  characters  may  never  appear  within  special character
-       sequences in a pattern, for example within the sequence (?( that intro-
-       duces a conditional subpattern.
-
-         PCRE_EXTRA
-
-       This  option  was invented in order to turn on additional functionality
-       of PCRE that is incompatible with Perl, but it  is  currently  of  very
-       little  use. When set, any backslash in a pattern that is followed by a
-       letter that has no special meaning  causes  an  error,  thus  reserving
-       these  combinations  for  future  expansion.  By default, as in Perl, a
-       backslash followed by a letter with no special meaning is treated as  a
-       literal. (Perl can, however, be persuaded to give an error for this, by
-       running it with the -w option.) There are at present no other  features
-       controlled  by this option. It can also be set by a (?X) option setting
-       within a pattern.
-
-         PCRE_FIRSTLINE
-
-       If this option is set, an  unanchored  pattern  is  required  to  match
-       before  or  at  the  first  newline  in  the subject string, though the
-       matched text may continue over the newline.
-
-         PCRE_JAVASCRIPT_COMPAT
-
-       If this option is set, PCRE's behaviour is changed in some ways so that
-       it  is  compatible with JavaScript rather than Perl. The changes are as
-       follows:
-
-       (1) A lone closing square bracket in a pattern  causes  a  compile-time
-       error,  because this is illegal in JavaScript (by default it is treated
-       as a data character). Thus, the pattern AB]CD becomes illegal when this
-       option is set.
-
-       (2)  At run time, a back reference to an unset subpattern group matches
-       an empty string (by default this causes the current  matching  alterna-
-       tive  to  fail). A pattern such as (\1)(a) succeeds when this option is
-       set (assuming it can find an "a" in the subject), whereas it  fails  by
-       default, for Perl compatibility.
-
-       (3) \U matches an upper case "U" character; by default \U causes a com-
-       pile time error (Perl uses \U to upper case subsequent characters).
-
-       (4) \u matches a lower case "u" character unless it is followed by four
-       hexadecimal  digits,  in  which case the hexadecimal number defines the
-       code point to match. By default, \u causes a compile time  error  (Perl
-       uses it to upper case the following character).
-
-       (5)  \x matches a lower case "x" character unless it is followed by two
-       hexadecimal digits, in which case the hexadecimal  number  defines  the
-       code  point  to  match. By default, as in Perl, a hexadecimal number is
-       always expected after \x, but it may have zero, one, or two digits (so,
-       for example, \xz matches a binary zero character followed by z).
-
-         PCRE_MULTILINE
-
-       By  default,  for  the purposes of matching "start of line" and "end of
-       line", PCRE treats the subject string as consisting of a single line of
-       characters,  even if it actually contains newlines. The "start of line"
-       metacharacter (^) matches only at the start of the string, and the "end
-       of  line"  metacharacter  ($) matches only at the end of the string, or
-       before a terminating newline (except when PCRE_DOLLAR_ENDONLY is  set).
-       Note,  however,  that  unless  PCRE_DOTALL  is set, the "any character"
-       metacharacter (.) does not match at a newline. This behaviour  (for  ^,
-       $, and dot) is the same as Perl.
-
-       When  PCRE_MULTILINE  it  is set, the "start of line" and "end of line"
-       constructs match immediately following or immediately  before  internal
-       newlines  in  the  subject string, respectively, as well as at the very
-       start and end. This is equivalent to Perl's /m option, and  it  can  be
-       changed within a pattern by a (?m) option setting. If there are no new-
-       lines in a subject string, or no occurrences of ^ or $  in  a  pattern,
-       setting PCRE_MULTILINE has no effect.
-
-         PCRE_NEVER_UTF
-
-       This option locks out interpretation of the pattern as UTF-8 (or UTF-16
-       or UTF-32 in the 16-bit and 32-bit libraries). In particular,  it  pre-
-       vents  the  creator of the pattern from switching to UTF interpretation
-       by starting the pattern with (*UTF). This may be useful in applications
-       that  process  patterns  from  external  sources.  The  combination  of
-       PCRE_UTF8 and PCRE_NEVER_UTF also causes an error.
-
-         PCRE_NEWLINE_CR
-         PCRE_NEWLINE_LF
-         PCRE_NEWLINE_CRLF
-         PCRE_NEWLINE_ANYCRLF
-         PCRE_NEWLINE_ANY
-
-       These options override the default newline definition that  was  chosen
-       when  PCRE  was built. Setting the first or the second specifies that a
-       newline is indicated by a single character (CR  or  LF,  respectively).
-       Setting  PCRE_NEWLINE_CRLF specifies that a newline is indicated by the
-       two-character CRLF  sequence.  Setting  PCRE_NEWLINE_ANYCRLF  specifies
-       that any of the three preceding sequences should be recognized. Setting
-       PCRE_NEWLINE_ANY specifies that any Unicode newline sequence should  be
-       recognized.
-
-       In  an ASCII/Unicode environment, the Unicode newline sequences are the
-       three just mentioned, plus the  single  characters  VT  (vertical  tab,
-       U+000B), FF (form feed, U+000C), NEL (next line, U+0085), LS (line sep-
-       arator, U+2028), and PS (paragraph separator, U+2029).  For  the  8-bit
-       library, the last two are recognized only in UTF-8 mode.
-
-       When  PCRE is compiled to run in an EBCDIC (mainframe) environment, the
-       code for CR is 0x0d, the same as ASCII. However, the character code for
-       LF  is  normally 0x15, though in some EBCDIC environments 0x25 is used.
-       Whichever of these is not LF is made to  correspond  to  Unicode's  NEL
-       character.  EBCDIC  codes  are all less than 256. For more details, see
-       the pcrebuild documentation.
-
-       The newline setting in the  options  word  uses  three  bits  that  are
-       treated as a number, giving eight possibilities. Currently only six are
-       used (default plus the five values above). This means that if  you  set
-       more  than one newline option, the combination may or may not be sensi-
-       ble. For example, PCRE_NEWLINE_CR with PCRE_NEWLINE_LF is equivalent to
-       PCRE_NEWLINE_CRLF,  but other combinations may yield unused numbers and
-       cause an error.
-
-       The only time that a line break in a pattern  is  specially  recognized
-       when  compiling is when PCRE_EXTENDED is set. CR and LF are white space
-       characters, and so are ignored in this mode. Also, an unescaped #  out-
-       side  a  character class indicates a comment that lasts until after the
-       next line break sequence. In other circumstances, line break  sequences
-       in patterns are treated as literal data.
-
-       The newline option that is set at compile time becomes the default that
-       is used for pcre_exec() and pcre_dfa_exec(), but it can be overridden.
-
-         PCRE_NO_AUTO_CAPTURE
-
-       If this option is set, it disables the use of numbered capturing paren-
-       theses  in the pattern. Any opening parenthesis that is not followed by
-       ? behaves as if it were followed by ?: but named parentheses can  still
-       be  used  for  capturing  (and  they acquire numbers in the usual way).
-       There is no equivalent of this option in Perl.
-
-         PCRE_NO_AUTO_POSSESS
-
-       If this option is set, it disables "auto-possessification". This is  an
-       optimization  that,  for example, turns a+b into a++b in order to avoid
-       backtracks into a+ that can never be successful. However,  if  callouts
-       are  in  use,  auto-possessification  means that some of them are never
-       taken. You can set this option if you want the matching functions to do
-       a  full  unoptimized  search and run all the callouts, but it is mainly
-       provided for testing purposes.
-
-         PCRE_NO_START_OPTIMIZE
-
-       This is an option that acts at matching time; that is, it is really  an
-       option  for  pcre_exec()  or  pcre_dfa_exec().  If it is set at compile
-       time, it is remembered with the compiled pattern and assumed at  match-
-       ing  time.  This is necessary if you want to use JIT execution, because
-       the JIT compiler needs to know whether or not this option is  set.  For
-       details see the discussion of PCRE_NO_START_OPTIMIZE below.
-
-         PCRE_UCP
-
-       This  option changes the way PCRE processes \B, \b, \D, \d, \S, \s, \W,
-       \w, and some of the POSIX character classes.  By  default,  only  ASCII
-       characters  are  recognized, but if PCRE_UCP is set, Unicode properties
-       are used instead to classify characters. More details are given in  the
-       section  on generic character types in the pcrepattern page. If you set
-       PCRE_UCP, matching one of the items it affects takes much  longer.  The
-       option  is  available only if PCRE has been compiled with Unicode prop-
-       erty support.
-
-         PCRE_UNGREEDY
-
-       This option inverts the "greediness" of the quantifiers  so  that  they
-       are  not greedy by default, but become greedy if followed by "?". It is
-       not compatible with Perl. It can also be set by a (?U)  option  setting
-       within the pattern.
-
-         PCRE_UTF8
-
-       This  option  causes PCRE to regard both the pattern and the subject as
-       strings of UTF-8 characters instead of single-byte strings. However, it
-       is  available  only  when PCRE is built to include UTF support. If not,
-       the use of this option provokes an error. Details of  how  this  option
-       changes the behaviour of PCRE are given in the pcreunicode page.
-
-         PCRE_NO_UTF8_CHECK
-
-       When PCRE_UTF8 is set, the validity of the pattern as a UTF-8 string is
-       automatically checked. There is a  discussion  about  the  validity  of
-       UTF-8  strings in the pcreunicode page. If an invalid UTF-8 sequence is
-       found, pcre_compile() returns an error. If you already know  that  your
-       pattern  is valid, and you want to skip this check for performance rea-
-       sons, you can set the PCRE_NO_UTF8_CHECK option.  When it is  set,  the
-       effect of passing an invalid UTF-8 string as a pattern is undefined. It
-       may cause your program to crash or loop. Note that this option can also
-       be  passed to pcre_exec() and pcre_dfa_exec(), to suppress the validity
-       checking of subject strings only. If the same string is  being  matched
-       many  times, the option can be safely set for the second and subsequent
-       matchings to improve performance.
-
-
-COMPILATION ERROR CODES
-
-       The following table lists the error  codes  than  may  be  returned  by
-       pcre_compile2(),  along with the error messages that may be returned by
-       both compiling functions. Note that error  messages  are  always  8-bit
-       ASCII  strings,  even  in 16-bit or 32-bit mode. As PCRE has developed,
-       some error codes have fallen out of use. To avoid confusion, they  have
-       not been re-used.
-
-          0  no error
-          1  \ at end of pattern
-          2  \c at end of pattern
-          3  unrecognized character follows \
-          4  numbers out of order in {} quantifier
-          5  number too big in {} quantifier
-          6  missing terminating ] for character class
-          7  invalid escape sequence in character class
-          8  range out of order in character class
-          9  nothing to repeat
-         10  [this code is not in use]
-         11  internal error: unexpected repeat
-         12  unrecognized character after (? or (?-
-         13  POSIX named classes are supported only within a class
-         14  missing )
-         15  reference to non-existent subpattern
-         16  erroffset passed as NULL
-         17  unknown option bit(s) set
-         18  missing ) after comment
-         19  [this code is not in use]
-         20  regular expression is too large
-         21  failed to get memory
-         22  unmatched parentheses
-         23  internal error: code overflow
-         24  unrecognized character after (?<
-         25  lookbehind assertion is not fixed length
-         26  malformed number or name after (?(
-         27  conditional group contains more than two branches
-         28  assertion expected after (?(
-         29  (?R or (?[+-]digits must be followed by )
-         30  unknown POSIX class name
-         31  POSIX collating elements are not supported
-         32  this version of PCRE is compiled without UTF support
-         33  [this code is not in use]
-         34  character value in \x{} or \o{} is too large
-         35  invalid condition (?(0)
-         36  \C not allowed in lookbehind assertion
-         37  PCRE does not support \L, \l, \N{name}, \U, or \u
-         38  number after (?C is > 255
-         39  closing ) for (?C expected
-         40  recursive call could loop indefinitely
-         41  unrecognized character after (?P
-         42  syntax error in subpattern name (missing terminator)
-         43  two named subpatterns have the same name
-         44  invalid UTF-8 string (specifically UTF-8)
-         45  support for \P, \p, and \X has not been compiled
-         46  malformed \P or \p sequence
-         47  unknown property name after \P or \p
-         48  subpattern name is too long (maximum 32 characters)
-         49  too many named subpatterns (maximum 10000)
-         50  [this code is not in use]
-         51  octal value is greater than \377 in 8-bit non-UTF-8 mode
-         52  internal error: overran compiling workspace
-         53  internal error: previously-checked referenced subpattern
-               not found
-         54  DEFINE group contains more than one branch
-         55  repeating a DEFINE group is not allowed
-         56  inconsistent NEWLINE options
-         57  \g is not followed by a braced, angle-bracketed, or quoted
-               name/number or by a plain number
-         58  a numbered reference must not be zero
-         59  an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)
-         60  (*VERB) not recognized or malformed
-         61  number is too big
-         62  subpattern name expected
-         63  digit expected after (?+
-         64  ] is an invalid data character in JavaScript compatibility mode
-         65  different names for subpatterns of the same number are
-               not allowed
-         66  (*MARK) must have an argument
-         67  this version of PCRE is not compiled with Unicode property
-               support
-         68  \c must be followed by an ASCII character
-         69  \k is not followed by a braced, angle-bracketed, or quoted name
-         70  internal error: unknown opcode in find_fixedlength()
-         71  \N is not supported in a class
-         72  too many forward references
-         73  disallowed Unicode code point (>= 0xd800 && <= 0xdfff)
-         74  invalid UTF-16 string (specifically UTF-16)
-         75  name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)
-         76  character value in \u.... sequence is too large
-         77  invalid UTF-32 string (specifically UTF-32)
-         78  setting UTF is disabled by the application
-         79  non-hex character in \x{} (closing brace missing?)
-         80  non-octal character in \o{} (closing brace missing?)
-         81  missing opening brace after \o
-         82  parentheses are too deeply nested
-         83  invalid range in character class
-         84  group name must start with a non-digit
-         85  parentheses are too deeply nested (stack check)
-
-       The  numbers  32  and 10000 in errors 48 and 49 are defaults; different
-       values may be used if the limits were changed when PCRE was built.
-
-
-STUDYING A PATTERN
-
-       pcre_extra *pcre_study(const pcre *code, int options,
-            const char **errptr);
-
-       If a compiled pattern is going to be used several times,  it  is  worth
-       spending more time analyzing it in order to speed up the time taken for
-       matching. The function pcre_study() takes a pointer to a compiled  pat-
-       tern as its first argument. If studying the pattern produces additional
-       information that will help speed up matching,  pcre_study()  returns  a
-       pointer  to a pcre_extra block, in which the study_data field points to
-       the results of the study.
-
-       The  returned  value  from  pcre_study()  can  be  passed  directly  to
-       pcre_exec()  or  pcre_dfa_exec(). However, a pcre_extra block also con-
-       tains other fields that can be set by the caller before  the  block  is
-       passed; these are described below in the section on matching a pattern.
-
-       If  studying  the  pattern  does  not  produce  any useful information,
-       pcre_study() returns NULL by default.  In  that  circumstance,  if  the
-       calling program wants to pass any of the other fields to pcre_exec() or
-       pcre_dfa_exec(), it must set up its own pcre_extra block.  However,  if
-       pcre_study()  is  called  with  the  PCRE_STUDY_EXTRA_NEEDED option, it
-       returns a pcre_extra block even if studying did not find any additional
-       information.  It  may still return NULL, however, if an error occurs in
-       pcre_study().
-
-       The second argument of pcre_study() contains  option  bits.  There  are
-       three further options in addition to PCRE_STUDY_EXTRA_NEEDED:
-
-         PCRE_STUDY_JIT_COMPILE
-         PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE
-         PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE
-
-       If  any  of  these are set, and the just-in-time compiler is available,
-       the pattern is further compiled into machine code  that  executes  much
-       faster  than  the  pcre_exec()  interpretive  matching function. If the
-       just-in-time compiler is not available, these options are ignored.  All
-       undefined bits in the options argument must be zero.
-
-       JIT  compilation  is  a heavyweight optimization. It can take some time
-       for patterns to be analyzed, and for one-off matches  and  simple  pat-
-       terns  the benefit of faster execution might be offset by a much slower
-       study time.  Not all patterns can be optimized by the JIT compiler. For
-       those  that cannot be handled, matching automatically falls back to the
-       pcre_exec() interpreter. For more details, see the  pcrejit  documenta-
-       tion.
-
-       The  third argument for pcre_study() is a pointer for an error message.
-       If studying succeeds (even if no data is  returned),  the  variable  it
-       points  to  is  set  to NULL. Otherwise it is set to point to a textual
-       error message. This is a static string that is part of the library. You
-       must  not  try  to  free it. You should test the error pointer for NULL
-       after calling pcre_study(), to be sure that it has run successfully.
-
-       When you are finished with a pattern, you can free the memory used  for
-       the study data by calling pcre_free_study(). This function was added to
-       the API for release 8.20. For earlier versions,  the  memory  could  be
-       freed  with  pcre_free(), just like the pattern itself. This will still
-       work in cases where JIT optimization is not used, but it  is  advisable
-       to change to the new function when convenient.
-
-       This  is  a typical way in which pcre_study() is used (except that in a
-       real application there should be tests for errors):
-
-         int rc;
-         pcre *re;
-         pcre_extra *sd;
-         re = pcre_compile("pattern", 0, &error, &erroroffset, NULL);
-         sd = pcre_study(
-           re,             /* result of pcre_compile() */
-           0,              /* no options */
-           &error);        /* set to NULL or points to a message */
-         rc = pcre_exec(   /* see below for details of pcre_exec() options */
-           re, sd, "subject", 7, 0, 0, ovector, 30);
-         ...
-         pcre_free_study(sd);
-         pcre_free(re);
-
-       Studying a pattern does two things: first, a lower bound for the length
-       of subject string that is needed to match the pattern is computed. This
-       does not mean that there are any strings of that length that match, but
-       it  does  guarantee that no shorter strings match. The value is used to
-       avoid wasting time by trying to match strings that are shorter than the
-       lower  bound.  You  can find out the value in a calling program via the
-       pcre_fullinfo() function.
-
-       Studying a pattern is also useful for non-anchored patterns that do not
-       have  a  single fixed starting character. A bitmap of possible starting
-       bytes is created. This speeds up finding a position in the  subject  at
-       which to start matching. (In 16-bit mode, the bitmap is used for 16-bit
-       values less than 256.  In 32-bit mode, the bitmap is  used  for  32-bit
-       values less than 256.)
-
-       These  two optimizations apply to both pcre_exec() and pcre_dfa_exec(),
-       and the information is also used by the JIT  compiler.   The  optimiza-
-       tions  can  be  disabled  by setting the PCRE_NO_START_OPTIMIZE option.
-       You might want to do this if your pattern contains callouts or  (*MARK)
-       and  you  want  to make use of these facilities in cases where matching
-       fails.
-
-       PCRE_NO_START_OPTIMIZE can be specified at either compile time or  exe-
-       cution   time.   However,   if   PCRE_NO_START_OPTIMIZE  is  passed  to
-       pcre_exec(), (that is, after any JIT compilation has happened) JIT exe-
-       cution  is disabled. For JIT execution to work with PCRE_NO_START_OPTI-
-       MIZE, the option must be set at compile time.
-
-       There is a longer discussion of PCRE_NO_START_OPTIMIZE below.
-
-
-LOCALE SUPPORT
-
-       PCRE handles caseless matching, and determines whether  characters  are
-       letters,  digits, or whatever, by reference to a set of tables, indexed
-       by character code point. When running in UTF-8 mode, or in the  16-  or
-       32-bit libraries, this applies only to characters with code points less
-       than 256. By default, higher-valued code  points  never  match  escapes
-       such  as \w or \d. However, if PCRE is built with Unicode property sup-
-       port, all characters can be tested with \p and \P,  or,  alternatively,
-       the  PCRE_UCP option can be set when a pattern is compiled; this causes
-       \w and friends to use Unicode property support instead of the  built-in
-       tables.
-
-       The  use  of  locales  with Unicode is discouraged. If you are handling
-       characters with code points greater than 128,  you  should  either  use
-       Unicode support, or use locales, but not try to mix the two.
-
-       PCRE  contains  an  internal set of tables that are used when the final
-       argument of pcre_compile() is  NULL.  These  are  sufficient  for  many
-       applications.  Normally, the internal tables recognize only ASCII char-
-       acters. However, when PCRE is built, it is possible to cause the inter-
-       nal tables to be rebuilt in the default "C" locale of the local system,
-       which may cause them to be different.
-
-       The internal tables can always be overridden by tables supplied by  the
-       application that calls PCRE. These may be created in a different locale
-       from the default. As more and more applications change  to  using  Uni-
-       code, the need for this locale support is expected to die away.
-
-       External  tables  are  built by calling the pcre_maketables() function,
-       which has no arguments, in the relevant locale. The result can then  be
-       passed  to  pcre_compile() as often as necessary. For example, to build
-       and use tables that  are  appropriate  for  the  French  locale  (where
-       accented  characters  with  values greater than 128 are treated as let-
-       ters), the following code could be used:
-
-         setlocale(LC_CTYPE, "fr_FR");
-         tables = pcre_maketables();
-         re = pcre_compile(..., tables);
-
-       The locale name "fr_FR" is used on Linux and other  Unix-like  systems;
-       if you are using Windows, the name for the French locale is "french".
-
-       When  pcre_maketables()  runs,  the  tables are built in memory that is
-       obtained via pcre_malloc. It is the caller's responsibility  to  ensure
-       that  the memory containing the tables remains available for as long as
-       it is needed.
-
-       The pointer that is passed to pcre_compile() is saved with the compiled
-       pattern,  and the same tables are used via this pointer by pcre_study()
-       and also by pcre_exec() and pcre_dfa_exec(). Thus, for any single  pat-
-       tern, compilation, studying and matching all happen in the same locale,
-       but different patterns can be processed in different locales.
-
-       It is possible to pass a table pointer or NULL (indicating the  use  of
-       the internal tables) to pcre_exec() or pcre_dfa_exec() (see the discus-
-       sion below in the section on matching a pattern). This facility is pro-
-       vided  for  use  with  pre-compiled  patterns  that have been saved and
-       reloaded.  Character tables are not saved with patterns, so if  a  non-
-       standard table was used at compile time, it must be provided again when
-       the reloaded pattern is matched. Attempting to  use  this  facility  to
-       match a pattern in a different locale from the one in which it was com-
-       piled is likely to lead to anomalous (usually incorrect) results.
-
-
-INFORMATION ABOUT A PATTERN
-
-       int pcre_fullinfo(const pcre *code, const pcre_extra *extra,
-            int what, void *where);
-
-       The pcre_fullinfo() function returns information about a compiled  pat-
-       tern.  It replaces the pcre_info() function, which was removed from the
-       library at version 8.30, after more than 10 years of obsolescence.
-
-       The first argument for pcre_fullinfo() is a  pointer  to  the  compiled
-       pattern.  The second argument is the result of pcre_study(), or NULL if
-       the pattern was not studied. The third argument specifies  which  piece
-       of  information  is required, and the fourth argument is a pointer to a
-       variable to receive the data. The yield of the  function  is  zero  for
-       success, or one of the following negative numbers:
-
-         PCRE_ERROR_NULL           the argument code was NULL
-                                   the argument where was NULL
-         PCRE_ERROR_BADMAGIC       the "magic number" was not found
-         PCRE_ERROR_BADENDIANNESS  the pattern was compiled with different
-                                   endianness
-         PCRE_ERROR_BADOPTION      the value of what was invalid
-         PCRE_ERROR_UNSET          the requested field is not set
-
-       The  "magic  number" is placed at the start of each compiled pattern as
-       an simple check against passing an arbitrary memory pointer. The  endi-
-       anness error can occur if a compiled pattern is saved and reloaded on a
-       different host. Here is a typical call of  pcre_fullinfo(),  to  obtain
-       the length of the compiled pattern:
-
-         int rc;
-         size_t length;
-         rc = pcre_fullinfo(
-           re,               /* result of pcre_compile() */
-           sd,               /* result of pcre_study(), or NULL */
-           PCRE_INFO_SIZE,   /* what is required */
-           &length);         /* where to put the data */
-
-       The  possible  values for the third argument are defined in pcre.h, and
-       are as follows:
-
-         PCRE_INFO_BACKREFMAX
-
-       Return the number of the highest back reference  in  the  pattern.  The
-       fourth  argument  should  point to an int variable. Zero is returned if
-       there are no back references.
-
-         PCRE_INFO_CAPTURECOUNT
-
-       Return the number of capturing subpatterns in the pattern.  The  fourth
-       argument should point to an int variable.
-
-         PCRE_INFO_DEFAULT_TABLES
-
-       Return  a pointer to the internal default character tables within PCRE.
-       The fourth argument should point to an unsigned char *  variable.  This
-       information call is provided for internal use by the pcre_study() func-
-       tion. External callers can cause PCRE to use  its  internal  tables  by
-       passing a NULL table pointer.
-
-         PCRE_INFO_FIRSTBYTE (deprecated)
-
-       Return information about the first data unit of any matched string, for
-       a non-anchored pattern. The name of this option  refers  to  the  8-bit
-       library,  where  data units are bytes. The fourth argument should point
-       to an int variable. Negative values are used for  special  cases.  How-
-       ever,  this  means  that when the 32-bit library is in non-UTF-32 mode,
-       the full 32-bit range of characters cannot be returned. For  this  rea-
-       son,  this  value  is deprecated; use PCRE_INFO_FIRSTCHARACTERFLAGS and
-       PCRE_INFO_FIRSTCHARACTER instead.
-
-       If there is a fixed first value, for example, the  letter  "c"  from  a
-       pattern  such  as (cat|cow|coyote), its value is returned. In the 8-bit
-       library, the value is always less than 256. In the 16-bit  library  the
-       value can be up to 0xffff. In the 32-bit library the value can be up to
-       0x10ffff.
-
-       If there is no fixed first value, and if either
-
-       (a) the pattern was compiled with the PCRE_MULTILINE option, and  every
-       branch starts with "^", or
-
-       (b) every branch of the pattern starts with ".*" and PCRE_DOTALL is not
-       set (if it were set, the pattern would be anchored),
-
-       -1 is returned, indicating that the pattern matches only at  the  start
-       of  a  subject string or after any newline within the string. Otherwise
-       -2 is returned. For anchored patterns, -2 is returned.
-
-         PCRE_INFO_FIRSTCHARACTER
-
-       Return the value of the first data  unit  (non-UTF  character)  of  any
-       matched  string  in  the  situation where PCRE_INFO_FIRSTCHARACTERFLAGS
-       returns 1; otherwise return 0. The fourth argument should point  to  an
-       uint_t variable.
-
-       In  the 8-bit library, the value is always less than 256. In the 16-bit
-       library the value can be up to 0xffff. In the 32-bit library in  UTF-32
-       mode  the  value  can  be up to 0x10ffff, and up to 0xffffffff when not
-       using UTF-32 mode.
-
-         PCRE_INFO_FIRSTCHARACTERFLAGS
-
-       Return information about the first data unit of any matched string, for
-       a  non-anchored  pattern.  The  fourth  argument should point to an int
-       variable.
-
-       If there is a fixed first value, for example, the  letter  "c"  from  a
-       pattern  such  as  (cat|cow|coyote),  1  is returned, and the character
-       value can be retrieved using PCRE_INFO_FIRSTCHARACTER. If there  is  no
-       fixed first value, and if either
-
-       (a)  the pattern was compiled with the PCRE_MULTILINE option, and every
-       branch starts with "^", or
-
-       (b) every branch of the pattern starts with ".*" and PCRE_DOTALL is not
-       set (if it were set, the pattern would be anchored),
-
-       2 is returned, indicating that the pattern matches only at the start of
-       a subject string or after any newline within the string. Otherwise 0 is
-       returned. For anchored patterns, 0 is returned.
-
-         PCRE_INFO_FIRSTTABLE
-
-       If  the pattern was studied, and this resulted in the construction of a
-       256-bit table indicating a fixed set of values for the first data  unit
-       in  any  matching string, a pointer to the table is returned. Otherwise
-       NULL is returned. The fourth argument should point to an unsigned  char
-       * variable.
-
-         PCRE_INFO_HASCRORLF
-
-       Return  1  if  the  pattern  contains any explicit matches for CR or LF
-       characters, otherwise 0. The fourth argument should  point  to  an  int
-       variable.  An explicit match is either a literal CR or LF character, or
-       \r or \n.
-
-         PCRE_INFO_JCHANGED
-
-       Return 1 if the (?J) or (?-J) option setting is used  in  the  pattern,
-       otherwise  0. The fourth argument should point to an int variable. (?J)
-       and (?-J) set and unset the local PCRE_DUPNAMES option, respectively.
-
-         PCRE_INFO_JIT
-
-       Return 1 if the pattern was studied with one of the  JIT  options,  and
-       just-in-time compiling was successful. The fourth argument should point
-       to an int variable. A return value of 0 means that JIT support  is  not
-       available  in this version of PCRE, or that the pattern was not studied
-       with a JIT option, or that the JIT compiler could not handle this  par-
-       ticular  pattern. See the pcrejit documentation for details of what can
-       and cannot be handled.
-
-         PCRE_INFO_JITSIZE
-
-       If the pattern was successfully studied with a JIT option,  return  the
-       size  of the JIT compiled code, otherwise return zero. The fourth argu-
-       ment should point to a size_t variable.
-
-         PCRE_INFO_LASTLITERAL
-
-       Return the value of the rightmost literal data unit that must exist  in
-       any  matched  string, other than at its start, if such a value has been
-       recorded. The fourth argument should point to an int variable. If there
-       is no such value, -1 is returned. For anchored patterns, a last literal
-       value is recorded only if it follows something of variable length.  For
-       example, for the pattern /^a\d+z\d+/ the returned value is "z", but for
-       /^a\dz\d/ the returned value is -1.
-
-       Since for the 32-bit library using the non-UTF-32 mode,  this  function
-       is  unable to return the full 32-bit range of characters, this value is
-       deprecated;     instead     the     PCRE_INFO_REQUIREDCHARFLAGS     and
-       PCRE_INFO_REQUIREDCHAR values should be used.
-
-         PCRE_INFO_MATCH_EMPTY
-
-       Return  1  if  the  pattern can match an empty string, otherwise 0. The
-       fourth argument should point to an int variable.
-
-         PCRE_INFO_MATCHLIMIT
-
-       If the pattern set a match limit by  including  an  item  of  the  form
-       (*LIMIT_MATCH=nnnn)  at  the  start,  the value is returned. The fourth
-       argument should point to an unsigned 32-bit integer. If no  such  value
-       has   been   set,   the  call  to  pcre_fullinfo()  returns  the  error
-       PCRE_ERROR_UNSET.
-
-         PCRE_INFO_MAXLOOKBEHIND
-
-       Return the number of characters (NB not  data  units)  in  the  longest
-       lookbehind  assertion  in  the pattern. This information is useful when
-       doing multi-segment matching using  the  partial  matching  facilities.
-       Note that the simple assertions \b and \B require a one-character look-
-       behind. \A also registers a one-character lookbehind,  though  it  does
-       not  actually inspect the previous character. This is to ensure that at
-       least one character from the old segment is retained when a new segment
-       is processed. Otherwise, if there are no lookbehinds in the pattern, \A
-       might match incorrectly at the start of a new segment.
-
-         PCRE_INFO_MINLENGTH
-
-       If the pattern was studied and a minimum length  for  matching  subject
-       strings  was  computed,  its  value is returned. Otherwise the returned
-       value is -1. The value is a number of characters, which in UTF mode may
-       be  different from the number of data units. The fourth argument should
-       point to an int variable. A non-negative value is a lower bound to  the
-       length  of  any  matching  string. There may not be any strings of that
-       length that do actually match, but every string that does match  is  at
-       least that long.
-
-         PCRE_INFO_NAMECOUNT
-         PCRE_INFO_NAMEENTRYSIZE
-         PCRE_INFO_NAMETABLE
-
-       PCRE  supports the use of named as well as numbered capturing parenthe-
-       ses. The names are just an additional way of identifying the  parenthe-
-       ses, which still acquire numbers. Several convenience functions such as
-       pcre_get_named_substring() are provided for  extracting  captured  sub-
-       strings  by  name. It is also possible to extract the data directly, by
-       first converting the name to a number in order to  access  the  correct
-       pointers in the output vector (described with pcre_exec() below). To do
-       the conversion, you need  to  use  the  name-to-number  map,  which  is
-       described by these three values.
-
-       The map consists of a number of fixed-size entries. PCRE_INFO_NAMECOUNT
-       gives the number of entries, and PCRE_INFO_NAMEENTRYSIZE gives the size
-       of  each  entry;  both  of  these  return  an int value. The entry size
-       depends on the length of the longest name. PCRE_INFO_NAMETABLE  returns
-       a pointer to the first entry of the table. This is a pointer to char in
-       the 8-bit library, where the first two bytes of each entry are the num-
-       ber  of  the capturing parenthesis, most significant byte first. In the
-       16-bit library, the pointer points to 16-bit data units, the  first  of
-       which  contains  the  parenthesis  number.  In  the 32-bit library, the
-       pointer points to 32-bit data units, the first of  which  contains  the
-       parenthesis  number.  The  rest of the entry is the corresponding name,
-       zero terminated.
-
-       The names are in alphabetical order. If (?| is used to create  multiple
-       groups  with  the same number, as described in the section on duplicate
-       subpattern numbers in the pcrepattern page, the groups may be given the
-       same  name,  but  there is only one entry in the table. Different names
-       for groups of the same number are not permitted.  Duplicate  names  for
-       subpatterns with different numbers are permitted, but only if PCRE_DUP-
-       NAMES is set. They appear in the table in the order in which they  were
-       found  in  the  pattern.  In  the  absence  of (?| this is the order of
-       increasing number; when (?| is used this is not  necessarily  the  case
-       because later subpatterns may have lower numbers.
-
-       As  a  simple  example of the name/number table, consider the following
-       pattern after compilation by the 8-bit library (assume PCRE_EXTENDED is
-       set, so white space - including newlines - is ignored):
-
-         (?<date> (?<year>(\d\d)?\d\d) -
-         (?<month>\d\d) - (?<day>\d\d) )
-
-       There  are  four  named subpatterns, so the table has four entries, and
-       each entry in the table is eight bytes long. The table is  as  follows,
-       with non-printing bytes shows in hexadecimal, and undefined bytes shown
-       as ??:
-
-         00 01 d  a  t  e  00 ??
-         00 05 d  a  y  00 ?? ??
-         00 04 m  o  n  t  h  00
-         00 02 y  e  a  r  00 ??
-
-       When writing code to extract data  from  named  subpatterns  using  the
-       name-to-number  map,  remember that the length of the entries is likely
-       to be different for each compiled pattern.
-
-         PCRE_INFO_OKPARTIAL
-
-       Return 1  if  the  pattern  can  be  used  for  partial  matching  with
-       pcre_exec(),  otherwise  0.  The fourth argument should point to an int
-       variable. From  release  8.00,  this  always  returns  1,  because  the
-       restrictions  that  previously  applied  to  partial matching have been
-       lifted. The pcrepartial documentation gives details of  partial  match-
-       ing.
-
-         PCRE_INFO_OPTIONS
-
-       Return  a  copy of the options with which the pattern was compiled. The
-       fourth argument should point to an unsigned long  int  variable.  These
-       option bits are those specified in the call to pcre_compile(), modified
-       by any top-level option settings at the start of the pattern itself. In
-       other  words,  they are the options that will be in force when matching
-       starts. For example, if the pattern /(?im)abc(?-i)d/ is  compiled  with
-       the  PCRE_EXTENDED option, the result is PCRE_CASELESS, PCRE_MULTILINE,
-       and PCRE_EXTENDED.
-
-       A pattern is automatically anchored by PCRE if  all  of  its  top-level
-       alternatives begin with one of the following:
-
-         ^     unless PCRE_MULTILINE is set
-         \A    always
-         \G    always
-         .*    if PCRE_DOTALL is set and there are no back
-                 references to the subpattern in which .* appears
-
-       For such patterns, the PCRE_ANCHORED bit is set in the options returned
-       by pcre_fullinfo().
-
-         PCRE_INFO_RECURSIONLIMIT
-
-       If the pattern set a recursion limit by including an item of  the  form
-       (*LIMIT_RECURSION=nnnn) at the start, the value is returned. The fourth
-       argument should point to an unsigned 32-bit integer. If no  such  value
-       has   been   set,   the  call  to  pcre_fullinfo()  returns  the  error
-       PCRE_ERROR_UNSET.
-
-         PCRE_INFO_SIZE
-
-       Return the size of  the  compiled  pattern  in  bytes  (for  all  three
-       libraries). The fourth argument should point to a size_t variable. This
-       value does not include the size of the pcre structure that is  returned
-       by  pcre_compile().  The  value  that  is  passed  as  the  argument to
-       pcre_malloc() when pcre_compile() is getting memory in which  to  place
-       the compiled data is the value returned by this option plus the size of
-       the pcre structure. Studying a compiled pattern, with or  without  JIT,
-       does not alter the value returned by this option.
-
-         PCRE_INFO_STUDYSIZE
-
-       Return  the  size  in bytes (for all three libraries) of the data block
-       pointed to by the study_data field in a pcre_extra block. If pcre_extra
-       is  NULL, or there is no study data, zero is returned. The fourth argu-
-       ment should point to a size_t variable. The study_data field is set  by
-       pcre_study() to record information that will speed up matching (see the
-       section entitled  "Studying  a  pattern"  above).  The  format  of  the
-       study_data  block is private, but its length is made available via this
-       option so that it can be saved and  restored  (see  the  pcreprecompile
-       documentation for details).
-
-         PCRE_INFO_REQUIREDCHARFLAGS
-
-       Returns  1 if there is a rightmost literal data unit that must exist in
-       any matched string, other than at its start. The fourth argument should
-       point  to an int variable. If there is no such value, 0 is returned. If
-       returning  1,  the  character  value  itself  can  be  retrieved  using
-       PCRE_INFO_REQUIREDCHAR.
-
-       For anchored patterns, a last literal value is recorded only if it fol-
-       lows something  of  variable  length.  For  example,  for  the  pattern
-       /^a\d+z\d+/   the   returned   value   1   (with   "z"   returned  from
-       PCRE_INFO_REQUIREDCHAR), but for /^a\dz\d/ the returned value is 0.
-
-         PCRE_INFO_REQUIREDCHAR
-
-       Return the value of the rightmost literal data unit that must exist  in
-       any  matched  string, other than at its start, if such a value has been
-       recorded. The fourth argument should point to an uint32_t variable.  If
-       there is no such value, 0 is returned.
-
-
-REFERENCE COUNTS
-
-       int pcre_refcount(pcre *code, int adjust);
-
-       The  pcre_refcount()  function is used to maintain a reference count in
-       the data block that contains a compiled pattern. It is provided for the
-       benefit  of  applications  that  operate  in an object-oriented manner,
-       where different parts of the application may be using the same compiled
-       pattern, but you want to free the block when they are all done.
-
-       When a pattern is compiled, the reference count field is initialized to
-       zero.  It is changed only by calling this function, whose action is  to
-       add  the  adjust  value  (which may be positive or negative) to it. The
-       yield of the function is the new value. However, the value of the count
-       is  constrained to lie between 0 and 65535, inclusive. If the new value
-       is outside these limits, it is forced to the appropriate limit value.
-
-       Except when it is zero, the reference count is not correctly  preserved
-       if  a  pattern  is  compiled on one host and then transferred to a host
-       whose byte-order is different. (This seems a highly unlikely scenario.)
-
-
-MATCHING A PATTERN: THE TRADITIONAL FUNCTION
-
-       int pcre_exec(const pcre *code, const pcre_extra *extra,
-            const char *subject, int length, int startoffset,
-            int options, int *ovector, int ovecsize);
-
-       The function pcre_exec() is called to match a subject string against  a
-       compiled  pattern, which is passed in the code argument. If the pattern
-       was studied, the result of the study should  be  passed  in  the  extra
-       argument.  You  can call pcre_exec() with the same code and extra argu-
-       ments as many times as you like, in order to  match  different  subject
-       strings with the same pattern.
-
-       This  function  is  the  main  matching facility of the library, and it
-       operates in a Perl-like manner. For specialist use  there  is  also  an
-       alternative  matching function, which is described below in the section
-       about the pcre_dfa_exec() function.
-
-       In most applications, the pattern will have been compiled (and  option-
-       ally  studied)  in the same process that calls pcre_exec(). However, it
-       is possible to save compiled patterns and study data, and then use them
-       later  in  different processes, possibly even on different hosts. For a
-       discussion about this, see the pcreprecompile documentation.
-
-       Here is an example of a simple call to pcre_exec():
-
-         int rc;
-         int ovector[30];
-         rc = pcre_exec(
-           re,             /* result of pcre_compile() */
-           NULL,           /* we didn't study the pattern */
-           "some string",  /* the subject string */
-           11,             /* the length of the subject string */
-           0,              /* start at offset 0 in the subject */
-           0,              /* default options */
-           ovector,        /* vector of integers for substring information */
-           30);            /* number of elements (NOT size in bytes) */
-
-   Extra data for pcre_exec()
-
-       If the extra argument is not NULL, it must point to a  pcre_extra  data
-       block.  The pcre_study() function returns such a block (when it doesn't
-       return NULL), but you can also create one for yourself, and pass  addi-
-       tional  information  in it. The pcre_extra block contains the following
-       fields (not necessarily in this order):
-
-         unsigned long int flags;
-         void *study_data;
-         void *executable_jit;
-         unsigned long int match_limit;
-         unsigned long int match_limit_recursion;
-         void *callout_data;
-         const unsigned char *tables;
-         unsigned char **mark;
-
-       In the 16-bit version of  this  structure,  the  mark  field  has  type
-       "PCRE_UCHAR16 **".
-
-       In  the  32-bit  version  of  this  structure,  the mark field has type
-       "PCRE_UCHAR32 **".
-
-       The flags field is used to specify which of the other fields  are  set.
-       The flag bits are:
-
-         PCRE_EXTRA_CALLOUT_DATA
-         PCRE_EXTRA_EXECUTABLE_JIT
-         PCRE_EXTRA_MARK
-         PCRE_EXTRA_MATCH_LIMIT
-         PCRE_EXTRA_MATCH_LIMIT_RECURSION
-         PCRE_EXTRA_STUDY_DATA
-         PCRE_EXTRA_TABLES
-
-       Other  flag  bits should be set to zero. The study_data field and some-
-       times the executable_jit field are set in the pcre_extra block that  is
-       returned  by pcre_study(), together with the appropriate flag bits. You
-       should not set these yourself, but you may add to the block by  setting
-       other fields and their corresponding flag bits.
-
-       The match_limit field provides a means of preventing PCRE from using up
-       a vast amount of resources when running patterns that are not going  to
-       match,  but  which  have  a very large number of possibilities in their
-       search trees. The classic example is a pattern that uses nested  unlim-
-       ited repeats.
-
-       Internally,  pcre_exec() uses a function called match(), which it calls
-       repeatedly (sometimes recursively). The limit  set  by  match_limit  is
-       imposed  on the number of times this function is called during a match,
-       which has the effect of limiting the amount of  backtracking  that  can
-       take place. For patterns that are not anchored, the count restarts from
-       zero for each position in the subject string.
-
-       When pcre_exec() is called with a pattern that was successfully studied
-       with  a  JIT  option, the way that the matching is executed is entirely
-       different.  However, there is still the possibility of runaway matching
-       that goes on for a very long time, and so the match_limit value is also
-       used in this case (but in a different way) to limit how long the match-
-       ing can continue.
-
-       The  default  value  for  the  limit can be set when PCRE is built; the
-       default default is 10 million, which handles all but the  most  extreme
-       cases.  You  can  override  the  default by suppling pcre_exec() with a
-       pcre_extra    block    in    which    match_limit    is    set,     and
-       PCRE_EXTRA_MATCH_LIMIT  is  set  in  the  flags  field. If the limit is
-       exceeded, pcre_exec() returns PCRE_ERROR_MATCHLIMIT.
-
-       A value for the match limit may also be supplied  by  an  item  at  the
-       start of a pattern of the form
-
-         (*LIMIT_MATCH=d)
-
-       where  d is a decimal number. However, such a setting is ignored unless
-       d is less than the limit set by the caller of  pcre_exec()  or,  if  no
-       such limit is set, less than the default.
-
-       The  match_limit_recursion field is similar to match_limit, but instead
-       of limiting the total number of times that match() is called, it limits
-       the  depth  of  recursion. The recursion depth is a smaller number than
-       the total number of calls, because not all calls to match() are  recur-
-       sive.  This limit is of use only if it is set smaller than match_limit.
-
-       Limiting  the  recursion  depth limits the amount of machine stack that
-       can be used, or, when PCRE has been compiled to use memory on the  heap
-       instead  of the stack, the amount of heap memory that can be used. This
-       limit is not relevant, and is ignored, when matching is done using  JIT
-       compiled code.
-
-       The  default  value  for  match_limit_recursion can be set when PCRE is
-       built; the default default  is  the  same  value  as  the  default  for
-       match_limit.  You can override the default by suppling pcre_exec() with
-       a  pcre_extra  block  in  which  match_limit_recursion  is   set,   and
-       PCRE_EXTRA_MATCH_LIMIT_RECURSION  is  set  in  the  flags field. If the
-       limit is exceeded, pcre_exec() returns PCRE_ERROR_RECURSIONLIMIT.
-
-       A value for the recursion limit may also be supplied by an item at  the
-       start of a pattern of the form
-
-         (*LIMIT_RECURSION=d)
-
-       where  d is a decimal number. However, such a setting is ignored unless
-       d is less than the limit set by the caller of  pcre_exec()  or,  if  no
-       such limit is set, less than the default.
-
-       The  callout_data  field is used in conjunction with the "callout" fea-
-       ture, and is described in the pcrecallout documentation.
-
-       The tables field is provided for use with patterns that have been  pre-
-       compiled using custom character tables, saved to disc or elsewhere, and
-       then reloaded, because the tables that were used to compile  a  pattern
-       are  not saved with it. See the pcreprecompile documentation for a dis-
-       cussion of saving compiled patterns for later use. If  NULL  is  passed
-       using this mechanism, it forces PCRE's internal tables to be used.
-
-       Warning:  The  tables  that  pcre_exec() uses must be the same as those
-       that were used when the pattern was compiled. If this is not the  case,
-       the behaviour of pcre_exec() is undefined. Therefore, when a pattern is
-       compiled and matched in the same process, this field  should  never  be
-       set. In this (the most common) case, the correct table pointer is auto-
-       matically passed with  the  compiled  pattern  from  pcre_compile()  to
-       pcre_exec().
-
-       If  PCRE_EXTRA_MARK  is  set in the flags field, the mark field must be
-       set to point to a suitable variable. If the pattern contains any  back-
-       tracking  control verbs such as (*MARK:NAME), and the execution ends up
-       with a name to pass back, a pointer to the  name  string  (zero  termi-
-       nated)  is  placed  in  the  variable pointed to by the mark field. The
-       names are within the compiled pattern; if you wish  to  retain  such  a
-       name  you must copy it before freeing the memory of a compiled pattern.
-       If there is no name to pass back, the variable pointed to by  the  mark
-       field  is  set  to NULL. For details of the backtracking control verbs,
-       see the section entitled "Backtracking control" in the pcrepattern doc-
-       umentation.
-
-   Option bits for pcre_exec()
-
-       The  unused  bits of the options argument for pcre_exec() must be zero.
-       The only bits that may  be  set  are  PCRE_ANCHORED,  PCRE_NEWLINE_xxx,
-       PCRE_NOTBOL,    PCRE_NOTEOL,    PCRE_NOTEMPTY,   PCRE_NOTEMPTY_ATSTART,
-       PCRE_NO_START_OPTIMIZE,  PCRE_NO_UTF8_CHECK,   PCRE_PARTIAL_HARD,   and
-       PCRE_PARTIAL_SOFT.
-
-       If  the  pattern  was successfully studied with one of the just-in-time
-       (JIT) compile options, the only supported options for JIT execution are
-       PCRE_NO_UTF8_CHECK,     PCRE_NOTBOL,     PCRE_NOTEOL,    PCRE_NOTEMPTY,
-       PCRE_NOTEMPTY_ATSTART, PCRE_PARTIAL_HARD, and PCRE_PARTIAL_SOFT. If  an
-       unsupported  option  is  used, JIT execution is disabled and the normal
-       interpretive code in pcre_exec() is run.
-
-         PCRE_ANCHORED
-
-       The PCRE_ANCHORED option limits pcre_exec() to matching  at  the  first
-       matching  position.  If  a  pattern was compiled with PCRE_ANCHORED, or
-       turned out to be anchored by virtue of its contents, it cannot be  made
-       unachored at matching time.
-
-         PCRE_BSR_ANYCRLF
-         PCRE_BSR_UNICODE
-
-       These options (which are mutually exclusive) control what the \R escape
-       sequence matches. The choice is either to match only CR, LF,  or  CRLF,
-       or  to  match  any Unicode newline sequence. These options override the
-       choice that was made or defaulted when the pattern was compiled.
-
-         PCRE_NEWLINE_CR
-         PCRE_NEWLINE_LF
-         PCRE_NEWLINE_CRLF
-         PCRE_NEWLINE_ANYCRLF
-         PCRE_NEWLINE_ANY
-
-       These options override  the  newline  definition  that  was  chosen  or
-       defaulted  when the pattern was compiled. For details, see the descrip-
-       tion of pcre_compile()  above.  During  matching,  the  newline  choice
-       affects  the  behaviour  of the dot, circumflex, and dollar metacharac-
-       ters. It may also alter the way the match position is advanced after  a
-       match failure for an unanchored pattern.
-
-       When  PCRE_NEWLINE_CRLF,  PCRE_NEWLINE_ANYCRLF,  or PCRE_NEWLINE_ANY is
-       set, and a match attempt for an unanchored pattern fails when the  cur-
-       rent  position  is  at  a  CRLF  sequence,  and the pattern contains no
-       explicit matches for  CR  or  LF  characters,  the  match  position  is
-       advanced by two characters instead of one, in other words, to after the
-       CRLF.
-
-       The above rule is a compromise that makes the most common cases work as
-       expected.  For  example,  if  the  pattern  is .+A (and the PCRE_DOTALL
-       option is not set), it does not match the string "\r\nA" because, after
-       failing  at the start, it skips both the CR and the LF before retrying.
-       However, the pattern [\r\n]A does match that string,  because  it  con-
-       tains an explicit CR or LF reference, and so advances only by one char-
-       acter after the first failure.
-
-       An explicit match for CR of LF is either a literal appearance of one of
-       those  characters,  or  one  of the \r or \n escape sequences. Implicit
-       matches such as [^X] do not count, nor does \s (which includes  CR  and
-       LF in the characters that it matches).
-
-       Notwithstanding  the above, anomalous effects may still occur when CRLF
-       is a valid newline sequence and explicit \r or \n escapes appear in the
-       pattern.
-
-         PCRE_NOTBOL
-
-       This option specifies that first character of the subject string is not
-       the beginning of a line, so the  circumflex  metacharacter  should  not
-       match  before it. Setting this without PCRE_MULTILINE (at compile time)
-       causes circumflex never to match. This option affects only  the  behav-
-       iour of the circumflex metacharacter. It does not affect \A.
-
-         PCRE_NOTEOL
-
-       This option specifies that the end of the subject string is not the end
-       of a line, so the dollar metacharacter should not match it nor  (except
-       in  multiline mode) a newline immediately before it. Setting this with-
-       out PCRE_MULTILINE (at compile time) causes dollar never to match. This
-       option  affects only the behaviour of the dollar metacharacter. It does
-       not affect \Z or \z.
-
-         PCRE_NOTEMPTY
-
-       An empty string is not considered to be a valid match if this option is
-       set.  If  there are alternatives in the pattern, they are tried. If all
-       the alternatives match the empty string, the entire  match  fails.  For
-       example, if the pattern
-
-         a?b?
-
-       is  applied  to  a  string not beginning with "a" or "b", it matches an
-       empty string at the start of the subject. With PCRE_NOTEMPTY set,  this
-       match is not valid, so PCRE searches further into the string for occur-
-       rences of "a" or "b".
-
-         PCRE_NOTEMPTY_ATSTART
-
-       This is like PCRE_NOTEMPTY, except that an empty string match  that  is
-       not  at  the  start  of  the  subject  is  permitted. If the pattern is
-       anchored, such a match can occur only if the pattern contains \K.
-
-       Perl    has    no    direct    equivalent    of    PCRE_NOTEMPTY     or
-       PCRE_NOTEMPTY_ATSTART,  but  it  does  make a special case of a pattern
-       match of the empty string within its split() function, and  when  using
-       the  /g  modifier.  It  is  possible  to emulate Perl's behaviour after
-       matching a null string by first trying the match again at the same off-
-       set  with  PCRE_NOTEMPTY_ATSTART  and  PCRE_ANCHORED,  and then if that
-       fails, by advancing the starting offset (see below) and trying an ordi-
-       nary  match  again. There is some code that demonstrates how to do this
-       in the pcredemo sample program. In the most general case, you  have  to
-       check  to  see  if the newline convention recognizes CRLF as a newline,
-       and if so, and the current character is CR followed by LF, advance  the
-       starting offset by two characters instead of one.
-
-         PCRE_NO_START_OPTIMIZE
-
-       There  are a number of optimizations that pcre_exec() uses at the start
-       of a match, in order to speed up the process. For  example,  if  it  is
-       known that an unanchored match must start with a specific character, it
-       searches the subject for that character, and fails  immediately  if  it
-       cannot  find  it,  without actually running the main matching function.
-       This means that a special item such as (*COMMIT) at the start of a pat-
-       tern  is  not  considered until after a suitable starting point for the
-       match has been found. Also, when callouts or (*MARK) items are in  use,
-       these "start-up" optimizations can cause them to be skipped if the pat-
-       tern is never actually used. The start-up optimizations are in effect a
-       pre-scan of the subject that takes place before the pattern is run.
-
-       The  PCRE_NO_START_OPTIMIZE option disables the start-up optimizations,
-       possibly causing performance to suffer,  but  ensuring  that  in  cases
-       where  the  result is "no match", the callouts do occur, and that items
-       such as (*COMMIT) and (*MARK) are considered at every possible starting
-       position  in  the  subject  string. If PCRE_NO_START_OPTIMIZE is set at
-       compile time,  it  cannot  be  unset  at  matching  time.  The  use  of
-       PCRE_NO_START_OPTIMIZE  at  matching  time  (that  is,  passing  it  to
-       pcre_exec()) disables JIT execution; in  this  situation,  matching  is
-       always done using interpretively.
-
-       Setting  PCRE_NO_START_OPTIMIZE  can  change  the outcome of a matching
-       operation.  Consider the pattern
-
-         (*COMMIT)ABC
-
-       When this is compiled, PCRE records the fact that a  match  must  start
-       with  the  character  "A".  Suppose the subject string is "DEFABC". The
-       start-up optimization scans along the subject, finds "A" and  runs  the
-       first  match attempt from there. The (*COMMIT) item means that the pat-
-       tern must match the current starting position, which in this  case,  it
-       does.  However,  if  the  same match is run with PCRE_NO_START_OPTIMIZE
-       set, the initial scan along the subject string  does  not  happen.  The
-       first  match  attempt  is  run  starting  from "D" and when this fails,
-       (*COMMIT) prevents any further matches  being  tried,  so  the  overall
-       result  is  "no  match". If the pattern is studied, more start-up opti-
-       mizations may be used. For example, a minimum length  for  the  subject
-       may be recorded. Consider the pattern
-
-         (*MARK:A)(X|Y)
-
-       The  minimum  length  for  a  match is one character. If the subject is
-       "ABC", there will be attempts to  match  "ABC",  "BC",  "C",  and  then
-       finally  an empty string.  If the pattern is studied, the final attempt
-       does not take place, because PCRE knows that the subject is too  short,
-       and  so  the  (*MARK) is never encountered.  In this case, studying the
-       pattern does not affect the overall match result, which  is  still  "no
-       match", but it does affect the auxiliary information that is returned.
-
-         PCRE_NO_UTF8_CHECK
-
-       When PCRE_UTF8 is set at compile time, the validity of the subject as a
-       UTF-8 string is automatically checked when pcre_exec() is  subsequently
-       called.  The entire string is checked before any other processing takes
-       place. The value of startoffset is  also  checked  to  ensure  that  it
-       points  to  the start of a UTF-8 character. There is a discussion about
-       the validity of UTF-8 strings in the pcreunicode page.  If  an  invalid
-       sequence   of   bytes   is   found,   pcre_exec()   returns  the  error
-       PCRE_ERROR_BADUTF8 or, if PCRE_PARTIAL_HARD is set and the problem is a
-       truncated character at the end of the subject, PCRE_ERROR_SHORTUTF8. In
-       both cases, information about the precise nature of the error may  also
-       be  returned (see the descriptions of these errors in the section enti-
-       tled Error return values from pcre_exec() below).  If startoffset  con-
-       tains a value that does not point to the start of a UTF-8 character (or
-       to the end of the subject), PCRE_ERROR_BADUTF8_OFFSET is returned.
-
-       If you already know that your subject is valid, and you  want  to  skip
-       these    checks    for   performance   reasons,   you   can   set   the
-       PCRE_NO_UTF8_CHECK option when calling pcre_exec(). You might  want  to
-       do  this  for the second and subsequent calls to pcre_exec() if you are
-       making repeated calls to find all  the  matches  in  a  single  subject
-       string.  However,  you  should  be  sure  that the value of startoffset
-       points to the start of a character (or the end of  the  subject).  When
-       PCRE_NO_UTF8_CHECK is set, the effect of passing an invalid string as a
-       subject or an invalid value of startoffset is undefined.  Your  program
-       may crash or loop.
-
-         PCRE_PARTIAL_HARD
-         PCRE_PARTIAL_SOFT
-
-       These  options turn on the partial matching feature. For backwards com-
-       patibility, PCRE_PARTIAL is a synonym for PCRE_PARTIAL_SOFT. A  partial
-       match  occurs if the end of the subject string is reached successfully,
-       but there are not enough subject characters to complete the  match.  If
-       this happens when PCRE_PARTIAL_SOFT (but not PCRE_PARTIAL_HARD) is set,
-       matching continues by testing any remaining alternatives.  Only  if  no
-       complete  match  can be found is PCRE_ERROR_PARTIAL returned instead of
-       PCRE_ERROR_NOMATCH. In other words,  PCRE_PARTIAL_SOFT  says  that  the
-       caller  is  prepared to handle a partial match, but only if no complete
-       match can be found.
-
-       If PCRE_PARTIAL_HARD is set, it overrides  PCRE_PARTIAL_SOFT.  In  this
-       case,  if  a  partial  match  is found, pcre_exec() immediately returns
-       PCRE_ERROR_PARTIAL, without  considering  any  other  alternatives.  In
-       other  words, when PCRE_PARTIAL_HARD is set, a partial match is consid-
-       ered to be more important that an alternative complete match.
-
-       In both cases, the portion of the string that was  inspected  when  the
-       partial match was found is set as the first matching string. There is a
-       more detailed discussion of partial and  multi-segment  matching,  with
-       examples, in the pcrepartial documentation.
-
-   The string to be matched by pcre_exec()
-
-       The  subject string is passed to pcre_exec() as a pointer in subject, a
-       length in length, and a starting offset in startoffset. The  units  for
-       length  and  startoffset  are  bytes for the 8-bit library, 16-bit data
-       items for the 16-bit library, and 32-bit  data  items  for  the  32-bit
-       library.
-
-       If  startoffset  is negative or greater than the length of the subject,
-       pcre_exec() returns PCRE_ERROR_BADOFFSET. When the starting  offset  is
-       zero,  the  search  for a match starts at the beginning of the subject,
-       and this is by far the most common case. In UTF-8 or UTF-16  mode,  the
-       offset  must  point to the start of a character, or the end of the sub-
-       ject (in UTF-32 mode, one data unit equals one character, so  all  off-
-       sets  are  valid).  Unlike  the pattern string, the subject may contain
-       binary zeroes.
-
-       A non-zero starting offset is useful when searching for  another  match
-       in  the same subject by calling pcre_exec() again after a previous suc-
-       cess.  Setting startoffset differs from just passing over  a  shortened
-       string  and  setting  PCRE_NOTBOL  in the case of a pattern that begins
-       with any kind of lookbehind. For example, consider the pattern
-
-         \Biss\B
-
-       which finds occurrences of "iss" in the middle of  words.  (\B  matches
-       only  if  the  current position in the subject is not a word boundary.)
-       When applied to the string "Mississipi" the first call  to  pcre_exec()
-       finds  the  first  occurrence. If pcre_exec() is called again with just
-       the remainder of the subject,  namely  "issipi",  it  does  not  match,
-       because \B is always false at the start of the subject, which is deemed
-       to be a word boundary. However, if pcre_exec()  is  passed  the  entire
-       string again, but with startoffset set to 4, it finds the second occur-
-       rence of "iss" because it is able to look behind the starting point  to
-       discover that it is preceded by a letter.
-
-       Finding  all  the  matches  in a subject is tricky when the pattern can
-       match an empty string. It is possible to emulate Perl's /g behaviour by
-       first   trying   the   match   again  at  the  same  offset,  with  the
-       PCRE_NOTEMPTY_ATSTART and  PCRE_ANCHORED  options,  and  then  if  that
-       fails,  advancing  the  starting  offset  and  trying an ordinary match
-       again. There is some code that demonstrates how to do this in the pcre-
-       demo sample program. In the most general case, you have to check to see
-       if the newline convention recognizes CRLF as a newline, and if so,  and
-       the current character is CR followed by LF, advance the starting offset
-       by two characters instead of one.
-
-       If a non-zero starting offset is passed when the pattern  is  anchored,
-       one attempt to match at the given offset is made. This can only succeed
-       if the pattern does not require the match to be at  the  start  of  the
-       subject.
-
-   How pcre_exec() returns captured substrings
-
-       In  general, a pattern matches a certain portion of the subject, and in
-       addition, further substrings from the subject  may  be  picked  out  by
-       parts  of  the  pattern.  Following the usage in Jeffrey Friedl's book,
-       this is called "capturing" in what follows, and the  phrase  "capturing
-       subpattern"  is  used for a fragment of a pattern that picks out a sub-
-       string. PCRE supports several other kinds of  parenthesized  subpattern
-       that do not cause substrings to be captured.
-
-       Captured substrings are returned to the caller via a vector of integers
-       whose address is passed in ovector. The number of elements in the  vec-
-       tor  is  passed in ovecsize, which must be a non-negative number. Note:
-       this argument is NOT the size of ovector in bytes.
-
-       The first two-thirds of the vector is used to pass back  captured  sub-
-       strings,  each  substring using a pair of integers. The remaining third
-       of the vector is used as workspace by pcre_exec() while  matching  cap-
-       turing  subpatterns, and is not available for passing back information.
-       The number passed in ovecsize should always be a multiple of three.  If
-       it is not, it is rounded down.
-
-       When  a  match  is successful, information about captured substrings is
-       returned in pairs of integers, starting at the  beginning  of  ovector,
-       and  continuing  up  to two-thirds of its length at the most. The first
-       element of each pair is set to the offset of the first character  in  a
-       substring,  and  the second is set to the offset of the first character
-       after the end of a substring. These values are always  data  unit  off-
-       sets,  even  in  UTF  mode. They are byte offsets in the 8-bit library,
-       16-bit data item offsets in the 16-bit library, and  32-bit  data  item
-       offsets in the 32-bit library. Note: they are not character counts.
-
-       The  first  pair  of  integers, ovector[0] and ovector[1], identify the
-       portion of the subject string matched by the entire pattern.  The  next
-       pair  is  used for the first capturing subpattern, and so on. The value
-       returned by pcre_exec() is one more than the highest numbered pair that
-       has  been  set.  For example, if two substrings have been captured, the
-       returned value is 3. If there are no capturing subpatterns, the  return
-       value from a successful match is 1, indicating that just the first pair
-       of offsets has been set.
-
-       If a capturing subpattern is matched repeatedly, it is the last portion
-       of the string that it matched that is returned.
-
-       If  the vector is too small to hold all the captured substring offsets,
-       it is used as far as possible (up to two-thirds of its length), and the
-       function  returns a value of zero. If neither the actual string matched
-       nor any captured substrings are of interest, pcre_exec() may be  called
-       with  ovector passed as NULL and ovecsize as zero. However, if the pat-
-       tern contains back references and the ovector  is  not  big  enough  to
-       remember  the related substrings, PCRE has to get additional memory for
-       use during matching. Thus it is usually advisable to supply an  ovector
-       of reasonable size.
-
-       There  are  some  cases where zero is returned (indicating vector over-
-       flow) when in fact the vector is exactly the right size for  the  final
-       match. For example, consider the pattern
-
-         (a)(?:(b)c|bd)
-
-       If  a  vector of 6 elements (allowing for only 1 captured substring) is
-       given with subject string "abd", pcre_exec() will try to set the second
-       captured string, thereby recording a vector overflow, before failing to
-       match "c" and backing up  to  try  the  second  alternative.  The  zero
-       return,  however,  does  correctly  indicate that the maximum number of
-       slots (namely 2) have been filled. In similar cases where there is tem-
-       porary  overflow,  but  the final number of used slots is actually less
-       than the maximum, a non-zero value is returned.
-
-       The pcre_fullinfo() function can be used to find out how many capturing
-       subpatterns  there  are  in  a  compiled pattern. The smallest size for
-       ovector that will allow for n captured substrings, in addition  to  the
-       offsets of the substring matched by the whole pattern, is (n+1)*3.
-
-       It  is  possible for capturing subpattern number n+1 to match some part
-       of the subject when subpattern n has not been used at all. For example,
-       if  the  string  "abc"  is  matched against the pattern (a|(z))(bc) the
-       return from the function is 4, and subpatterns 1 and 3 are matched, but
-       2  is  not.  When  this happens, both values in the offset pairs corre-
-       sponding to unused subpatterns are set to -1.
-
-       Offset values that correspond to unused subpatterns at the end  of  the
-       expression  are  also  set  to  -1. For example, if the string "abc" is
-       matched against the pattern (abc)(x(yz)?)? subpatterns 2 and 3 are  not
-       matched.  The  return  from the function is 2, because the highest used
-       capturing subpattern number is 1, and the offsets for  for  the  second
-       and  third  capturing subpatterns (assuming the vector is large enough,
-       of course) are set to -1.
-
-       Note: Elements in the first two-thirds of ovector that  do  not  corre-
-       spond  to  capturing parentheses in the pattern are never changed. That
-       is, if a pattern contains n capturing parentheses, no more  than  ovec-
-       tor[0]  to ovector[2n+1] are set by pcre_exec(). The other elements (in
-       the first two-thirds) retain whatever values they previously had.
-
-       Some convenience functions are provided  for  extracting  the  captured
-       substrings as separate strings. These are described below.
-
-   Error return values from pcre_exec()
-
-       If  pcre_exec()  fails, it returns a negative number. The following are
-       defined in the header file:
-
-         PCRE_ERROR_NOMATCH        (-1)
-
-       The subject string did not match the pattern.
-
-         PCRE_ERROR_NULL           (-2)
-
-       Either code or subject was passed as NULL,  or  ovector  was  NULL  and
-       ovecsize was not zero.
-
-         PCRE_ERROR_BADOPTION      (-3)
-
-       An unrecognized bit was set in the options argument.
-
-         PCRE_ERROR_BADMAGIC       (-4)
-
-       PCRE  stores a 4-byte "magic number" at the start of the compiled code,
-       to catch the case when it is passed a junk pointer and to detect when a
-       pattern that was compiled in an environment of one endianness is run in
-       an environment with the other endianness. This is the error  that  PCRE
-       gives when the magic number is not present.
-
-         PCRE_ERROR_UNKNOWN_OPCODE (-5)
-
-       While running the pattern match, an unknown item was encountered in the
-       compiled pattern. This error could be caused by a bug  in  PCRE  or  by
-       overwriting of the compiled pattern.
-
-         PCRE_ERROR_NOMEMORY       (-6)
-
-       If  a  pattern contains back references, but the ovector that is passed
-       to pcre_exec() is not big enough to remember the referenced substrings,
-       PCRE  gets  a  block of memory at the start of matching to use for this
-       purpose. If the call via pcre_malloc() fails, this error is given.  The
-       memory is automatically freed at the end of matching.
-
-       This  error  is also given if pcre_stack_malloc() fails in pcre_exec().
-       This can happen only when PCRE has been compiled with  --disable-stack-
-       for-recursion.
-
-         PCRE_ERROR_NOSUBSTRING    (-7)
-
-       This  error is used by the pcre_copy_substring(), pcre_get_substring(),
-       and  pcre_get_substring_list()  functions  (see  below).  It  is  never
-       returned by pcre_exec().
-
-         PCRE_ERROR_MATCHLIMIT     (-8)
-
-       The  backtracking  limit,  as  specified  by the match_limit field in a
-       pcre_extra structure (or defaulted) was reached.  See  the  description
-       above.
-
-         PCRE_ERROR_CALLOUT        (-9)
-
-       This error is never generated by pcre_exec() itself. It is provided for
-       use by callout functions that want to yield a distinctive  error  code.
-       See the pcrecallout documentation for details.
-
-         PCRE_ERROR_BADUTF8        (-10)
-
-       A  string  that contains an invalid UTF-8 byte sequence was passed as a
-       subject, and the PCRE_NO_UTF8_CHECK option was not set. If the size  of
-       the  output  vector  (ovecsize)  is  at least 2, the byte offset to the
-       start of the the invalid UTF-8 character is placed in  the  first  ele-
-       ment,  and  a  reason  code is placed in the second element. The reason
-       codes are listed in the following section.  For backward compatibility,
-       if  PCRE_PARTIAL_HARD is set and the problem is a truncated UTF-8 char-
-       acter  at  the  end  of  the   subject   (reason   codes   1   to   5),
-       PCRE_ERROR_SHORTUTF8 is returned instead of PCRE_ERROR_BADUTF8.
-
-         PCRE_ERROR_BADUTF8_OFFSET (-11)
-
-       The  UTF-8  byte  sequence that was passed as a subject was checked and
-       found to be valid (the PCRE_NO_UTF8_CHECK option was not set), but  the
-       value  of startoffset did not point to the beginning of a UTF-8 charac-
-       ter or the end of the subject.
-
-         PCRE_ERROR_PARTIAL        (-12)
-
-       The subject string did not match, but it did match partially.  See  the
-       pcrepartial documentation for details of partial matching.
-
-         PCRE_ERROR_BADPARTIAL     (-13)
-
-       This  code  is  no  longer  in  use.  It was formerly returned when the
-       PCRE_PARTIAL option was used with a compiled pattern  containing  items
-       that  were  not  supported  for  partial  matching.  From  release 8.00
-       onwards, there are no restrictions on partial matching.
-
-         PCRE_ERROR_INTERNAL       (-14)
-
-       An unexpected internal error has occurred. This error could  be  caused
-       by a bug in PCRE or by overwriting of the compiled pattern.
-
-         PCRE_ERROR_BADCOUNT       (-15)
-
-       This error is given if the value of the ovecsize argument is negative.
-
-         PCRE_ERROR_RECURSIONLIMIT (-21)
-
-       The internal recursion limit, as specified by the match_limit_recursion
-       field in a pcre_extra structure (or defaulted)  was  reached.  See  the
-       description above.
-
-         PCRE_ERROR_BADNEWLINE     (-23)
-
-       An invalid combination of PCRE_NEWLINE_xxx options was given.
-
-         PCRE_ERROR_BADOFFSET      (-24)
-
-       The value of startoffset was negative or greater than the length of the
-       subject, that is, the value in length.
-
-         PCRE_ERROR_SHORTUTF8      (-25)
-
-       This error is returned instead of PCRE_ERROR_BADUTF8 when  the  subject
-       string  ends with a truncated UTF-8 character and the PCRE_PARTIAL_HARD
-       option is set.  Information  about  the  failure  is  returned  as  for
-       PCRE_ERROR_BADUTF8.  It  is in fact sufficient to detect this case, but
-       this special error code for PCRE_PARTIAL_HARD precedes the  implementa-
-       tion  of returned information; it is retained for backwards compatibil-
-       ity.
-
-         PCRE_ERROR_RECURSELOOP    (-26)
-
-       This error is returned when pcre_exec() detects a recursion loop within
-       the  pattern. Specifically, it means that either the whole pattern or a
-       subpattern has been called recursively for the second time at the  same
-       position in the subject string. Some simple patterns that might do this
-       are detected and faulted at compile time, but more  complicated  cases,
-       in particular mutual recursions between two different subpatterns, can-
-       not be detected until run time.
-
-         PCRE_ERROR_JIT_STACKLIMIT (-27)
-
-       This error is returned when a pattern  that  was  successfully  studied
-       using  a  JIT compile option is being matched, but the memory available
-       for the just-in-time processing stack is  not  large  enough.  See  the
-       pcrejit documentation for more details.
-
-         PCRE_ERROR_BADMODE        (-28)
-
-       This error is given if a pattern that was compiled by the 8-bit library
-       is passed to a 16-bit or 32-bit library function, or vice versa.
-
-         PCRE_ERROR_BADENDIANNESS  (-29)
-
-       This error is given if  a  pattern  that  was  compiled  and  saved  is
-       reloaded  on  a  host  with  different endianness. The utility function
-       pcre_pattern_to_host_byte_order() can be used to convert such a pattern
-       so that it runs on the new host.
-
-         PCRE_ERROR_JIT_BADOPTION
-
-       This  error  is  returned  when a pattern that was successfully studied
-       using a JIT compile option is being  matched,  but  the  matching  mode
-       (partial  or complete match) does not correspond to any JIT compilation
-       mode. When the JIT fast path function is used, this error may  be  also
-       given  for  invalid  options.  See  the  pcrejit documentation for more
-       details.
-
-         PCRE_ERROR_BADLENGTH      (-32)
-
-       This error is given if pcre_exec() is called with a negative value  for
-       the length argument.
-
-       Error numbers -16 to -20, -22, and 30 are not used by pcre_exec().
-
-   Reason codes for invalid UTF-8 strings
-
-       This  section  applies  only  to  the  8-bit library. The corresponding
-       information for the 16-bit and 32-bit libraries is given in the  pcre16
-       and pcre32 pages.
-
-       When pcre_exec() returns either PCRE_ERROR_BADUTF8 or PCRE_ERROR_SHORT-
-       UTF8, and the size of the output vector (ovecsize) is at least  2,  the
-       offset  of  the  start  of the invalid UTF-8 character is placed in the
-       first output vector element (ovector[0]) and a reason code is placed in
-       the  second  element  (ovector[1]). The reason codes are given names in
-       the pcre.h header file:
-
-         PCRE_UTF8_ERR1
-         PCRE_UTF8_ERR2
-         PCRE_UTF8_ERR3
-         PCRE_UTF8_ERR4
-         PCRE_UTF8_ERR5
-
-       The string ends with a truncated UTF-8 character;  the  code  specifies
-       how  many bytes are missing (1 to 5). Although RFC 3629 restricts UTF-8
-       characters to be no longer than 4 bytes, the  encoding  scheme  (origi-
-       nally  defined  by  RFC  2279)  allows  for  up to 6 bytes, and this is
-       checked first; hence the possibility of 4 or 5 missing bytes.
-
-         PCRE_UTF8_ERR6
-         PCRE_UTF8_ERR7
-         PCRE_UTF8_ERR8
-         PCRE_UTF8_ERR9
-         PCRE_UTF8_ERR10
-
-       The two most significant bits of the 2nd, 3rd, 4th, 5th, or 6th byte of
-       the  character  do  not have the binary value 0b10 (that is, either the
-       most significant bit is 0, or the next bit is 1).
-
-         PCRE_UTF8_ERR11
-         PCRE_UTF8_ERR12
-
-       A character that is valid by the RFC 2279 rules is either 5 or 6  bytes
-       long; these code points are excluded by RFC 3629.
-
-         PCRE_UTF8_ERR13
-
-       A  4-byte character has a value greater than 0x10fff; these code points
-       are excluded by RFC 3629.
-
-         PCRE_UTF8_ERR14
-
-       A 3-byte character has a value in the  range  0xd800  to  0xdfff;  this
-       range  of code points are reserved by RFC 3629 for use with UTF-16, and
-       so are excluded from UTF-8.
-
-         PCRE_UTF8_ERR15
-         PCRE_UTF8_ERR16
-         PCRE_UTF8_ERR17
-         PCRE_UTF8_ERR18
-         PCRE_UTF8_ERR19
-
-       A 2-, 3-, 4-, 5-, or 6-byte character is "overlong", that is, it  codes
-       for  a  value that can be represented by fewer bytes, which is invalid.
-       For example, the two bytes 0xc0, 0xae give the value 0x2e,  whose  cor-
-       rect coding uses just one byte.
-
-         PCRE_UTF8_ERR20
-
-       The two most significant bits of the first byte of a character have the
-       binary value 0b10 (that is, the most significant bit is 1 and the  sec-
-       ond  is  0). Such a byte can only validly occur as the second or subse-
-       quent byte of a multi-byte character.
-
-         PCRE_UTF8_ERR21
-
-       The first byte of a character has the value 0xfe or 0xff. These  values
-       can never occur in a valid UTF-8 string.
-
-         PCRE_UTF8_ERR22
-
-       This  error  code  was  formerly  used when the presence of a so-called
-       "non-character" caused an error. Unicode corrigendum #9 makes it  clear
-       that  such  characters should not cause a string to be rejected, and so
-       this code is no longer in use and is never returned.
-
-
-EXTRACTING CAPTURED SUBSTRINGS BY NUMBER
-
-       int pcre_copy_substring(const char *subject, int *ovector,
-            int stringcount, int stringnumber, char *buffer,
-            int buffersize);
-
-       int pcre_get_substring(const char *subject, int *ovector,
-            int stringcount, int stringnumber,
-            const char **stringptr);
-
-       int pcre_get_substring_list(const char *subject,
-            int *ovector, int stringcount, const char ***listptr);
-
-       Captured substrings can be  accessed  directly  by  using  the  offsets
-       returned  by  pcre_exec()  in  ovector.  For convenience, the functions
-       pcre_copy_substring(),    pcre_get_substring(),    and    pcre_get_sub-
-       string_list()  are  provided for extracting captured substrings as new,
-       separate, zero-terminated strings. These functions identify  substrings
-       by  number.  The  next section describes functions for extracting named
-       substrings.
-
-       A substring that contains a binary zero is correctly extracted and  has
-       a  further zero added on the end, but the result is not, of course, a C
-       string.  However, you can process such a string  by  referring  to  the
-       length  that  is  returned  by  pcre_copy_substring() and pcre_get_sub-
-       string().  Unfortunately, the interface to pcre_get_substring_list() is
-       not  adequate for handling strings containing binary zeros, because the
-       end of the final string is not independently indicated.
-
-       The first three arguments are the same for all  three  of  these  func-
-       tions:  subject  is  the subject string that has just been successfully
-       matched, ovector is a pointer to the vector of integer offsets that was
-       passed to pcre_exec(), and stringcount is the number of substrings that
-       were captured by the match, including the substring  that  matched  the
-       entire regular expression. This is the value returned by pcre_exec() if
-       it is greater than zero. If pcre_exec() returned zero, indicating  that
-       it  ran out of space in ovector, the value passed as stringcount should
-       be the number of elements in the vector divided by three.
-
-       The functions pcre_copy_substring() and pcre_get_substring() extract  a
-       single  substring,  whose  number  is given as stringnumber. A value of
-       zero extracts the substring that matched the  entire  pattern,  whereas
-       higher  values  extract  the  captured  substrings.  For pcre_copy_sub-
-       string(), the string is placed in buffer,  whose  length  is  given  by
-       buffersize,  while  for  pcre_get_substring()  a new block of memory is
-       obtained via pcre_malloc, and its address is  returned  via  stringptr.
-       The  yield  of  the function is the length of the string, not including
-       the terminating zero, or one of these error codes:
-
-         PCRE_ERROR_NOMEMORY       (-6)
-
-       The buffer was too small for pcre_copy_substring(), or the  attempt  to
-       get memory failed for pcre_get_substring().
-
-         PCRE_ERROR_NOSUBSTRING    (-7)
-
-       There is no substring whose number is stringnumber.
-
-       The  pcre_get_substring_list()  function  extracts  all  available sub-
-       strings and builds a list of pointers to them. All this is  done  in  a
-       single block of memory that is obtained via pcre_malloc. The address of
-       the memory block is returned via listptr, which is also  the  start  of
-       the  list  of  string pointers. The end of the list is marked by a NULL
-       pointer. The yield of the function is zero if all  went  well,  or  the
-       error code
-
-         PCRE_ERROR_NOMEMORY       (-6)
-
-       if the attempt to get the memory block failed.
-
-       When  any of these functions encounter a substring that is unset, which
-       can happen when capturing subpattern number n+1 matches  some  part  of
-       the  subject, but subpattern n has not been used at all, they return an
-       empty string. This can be distinguished from a genuine zero-length sub-
-       string  by inspecting the appropriate offset in ovector, which is nega-
-       tive for unset substrings.
-
-       The two convenience functions pcre_free_substring() and  pcre_free_sub-
-       string_list()  can  be  used  to free the memory returned by a previous
-       call  of  pcre_get_substring()  or  pcre_get_substring_list(),  respec-
-       tively.  They  do  nothing  more  than  call the function pointed to by
-       pcre_free, which of course could be called directly from a  C  program.
-       However,  PCRE is used in some situations where it is linked via a spe-
-       cial  interface  to  another  programming  language  that  cannot   use
-       pcre_free  directly;  it is for these cases that the functions are pro-
-       vided.
-
-
-EXTRACTING CAPTURED SUBSTRINGS BY NAME
-
-       int pcre_get_stringnumber(const pcre *code,
-            const char *name);
-
-       int pcre_copy_named_substring(const pcre *code,
-            const char *subject, int *ovector,
-            int stringcount, const char *stringname,
-            char *buffer, int buffersize);
-
-       int pcre_get_named_substring(const pcre *code,
-            const char *subject, int *ovector,
-            int stringcount, const char *stringname,
-            const char **stringptr);
-
-       To extract a substring by name, you first have to find associated  num-
-       ber.  For example, for this pattern
-
-         (a+)b(?<xxx>\d+)...
-
-       the number of the subpattern called "xxx" is 2. If the name is known to
-       be unique (PCRE_DUPNAMES was not set), you can find the number from the
-       name by calling pcre_get_stringnumber(). The first argument is the com-
-       piled pattern, and the second is the name. The yield of the function is
-       the  subpattern  number,  or PCRE_ERROR_NOSUBSTRING (-7) if there is no
-       subpattern of that name.
-
-       Given the number, you can extract the substring directly, or use one of
-       the functions described in the previous section. For convenience, there
-       are also two functions that do the whole job.
-
-       Most   of   the   arguments    of    pcre_copy_named_substring()    and
-       pcre_get_named_substring()  are  the  same  as  those for the similarly
-       named functions that extract by number. As these are described  in  the
-       previous  section,  they  are not re-described here. There are just two
-       differences:
-
-       First, instead of a substring number, a substring name is  given.  Sec-
-       ond, there is an extra argument, given at the start, which is a pointer
-       to the compiled pattern. This is needed in order to gain access to  the
-       name-to-number translation table.
-
-       These  functions call pcre_get_stringnumber(), and if it succeeds, they
-       then call pcre_copy_substring() or pcre_get_substring(),  as  appropri-
-       ate.  NOTE:  If PCRE_DUPNAMES is set and there are duplicate names, the
-       behaviour may not be what you want (see the next section).
-
-       Warning: If the pattern uses the (?| feature to set up multiple subpat-
-       terns  with  the  same number, as described in the section on duplicate
-       subpattern numbers in the pcrepattern page, you  cannot  use  names  to
-       distinguish  the  different subpatterns, because names are not included
-       in the compiled code. The matching process uses only numbers. For  this
-       reason,  the  use of different names for subpatterns of the same number
-       causes an error at compile time.
-
-
-DUPLICATE SUBPATTERN NAMES
-
-       int pcre_get_stringtable_entries(const pcre *code,
-            const char *name, char **first, char **last);
-
-       When a pattern is compiled with the  PCRE_DUPNAMES  option,  names  for
-       subpatterns  are not required to be unique. (Duplicate names are always
-       allowed for subpatterns with the same number, created by using the  (?|
-       feature.  Indeed,  if  such subpatterns are named, they are required to
-       use the same names.)
-
-       Normally, patterns with duplicate names are such that in any one match,
-       only  one of the named subpatterns participates. An example is shown in
-       the pcrepattern documentation.
-
-       When   duplicates   are   present,   pcre_copy_named_substring()    and
-       pcre_get_named_substring()  return the first substring corresponding to
-       the given name that is set. If  none  are  set,  PCRE_ERROR_NOSUBSTRING
-       (-7)  is  returned;  no  data  is returned. The pcre_get_stringnumber()
-       function returns one of the numbers that are associated with the  name,
-       but it is not defined which it is.
-
-       If  you want to get full details of all captured substrings for a given
-       name, you must use  the  pcre_get_stringtable_entries()  function.  The
-       first argument is the compiled pattern, and the second is the name. The
-       third and fourth are pointers to variables which  are  updated  by  the
-       function. After it has run, they point to the first and last entries in
-       the name-to-number table  for  the  given  name.  The  function  itself
-       returns  the  length  of  each entry, or PCRE_ERROR_NOSUBSTRING (-7) if
-       there are none. The format of the table is described above in the  sec-
-       tion  entitled  Information about a pattern above.  Given all the rele-
-       vant entries for the name, you can extract each of their  numbers,  and
-       hence the captured data, if any.
-
-
-FINDING ALL POSSIBLE MATCHES
-
-       The  traditional  matching  function  uses a similar algorithm to Perl,
-       which stops when it finds the first match, starting at a given point in
-       the  subject.  If you want to find all possible matches, or the longest
-       possible match, consider using the alternative matching  function  (see
-       below)  instead.  If you cannot use the alternative function, but still
-       need to find all possible matches, you can kludge it up by  making  use
-       of the callout facility, which is described in the pcrecallout documen-
-       tation.
-
-       What you have to do is to insert a callout right at the end of the pat-
-       tern.   When your callout function is called, extract and save the cur-
-       rent matched substring. Then return  1,  which  forces  pcre_exec()  to
-       backtrack  and  try other alternatives. Ultimately, when it runs out of
-       matches, pcre_exec() will yield PCRE_ERROR_NOMATCH.
-
-
-OBTAINING AN ESTIMATE OF STACK USAGE
-
-       Matching certain patterns using pcre_exec() can use a  lot  of  process
-       stack,  which  in  certain  environments can be rather limited in size.
-       Some users find it helpful to have an estimate of the amount  of  stack
-       that  is  used  by  pcre_exec(),  to help them set recursion limits, as
-       described in the pcrestack documentation. The estimate that  is  output
-       by pcretest when called with the -m and -C options is obtained by call-
-       ing pcre_exec with the values NULL, NULL, NULL, -999, and -999 for  its
-       first five arguments.
-
-       Normally,  if  its  first  argument  is  NULL,  pcre_exec() immediately
-       returns the negative error code PCRE_ERROR_NULL, but with this  special
-       combination  of  arguments,  it returns instead a negative number whose
-       absolute value is the approximate stack frame size in bytes.  (A  nega-
-       tive  number  is  used so that it is clear that no match has happened.)
-       The value is approximate because in  some  cases,  recursive  calls  to
-       pcre_exec() occur when there are one or two additional variables on the
-       stack.
-
-       If PCRE has been compiled to use the heap  instead  of  the  stack  for
-       recursion,  the  value  returned  is  the  size  of  each block that is
-       obtained from the heap.
-
-
-MATCHING A PATTERN: THE ALTERNATIVE FUNCTION
-
-       int pcre_dfa_exec(const pcre *code, const pcre_extra *extra,
-            const char *subject, int length, int startoffset,
-            int options, int *ovector, int ovecsize,
-            int *workspace, int wscount);
-
-       The function pcre_dfa_exec()  is  called  to  match  a  subject  string
-       against  a  compiled pattern, using a matching algorithm that scans the
-       subject string just once, and does not backtrack.  This  has  different
-       characteristics  to  the  normal  algorithm, and is not compatible with
-       Perl. Some of the features of PCRE patterns are not  supported.  Never-
-       theless,  there are times when this kind of matching can be useful. For
-       a discussion of the two matching algorithms, and  a  list  of  features
-       that  pcre_dfa_exec() does not support, see the pcrematching documenta-
-       tion.
-
-       The arguments for the pcre_dfa_exec() function  are  the  same  as  for
-       pcre_exec(), plus two extras. The ovector argument is used in a differ-
-       ent way, and this is described below. The other  common  arguments  are
-       used  in  the  same way as for pcre_exec(), so their description is not
-       repeated here.
-
-       The two additional arguments provide workspace for  the  function.  The
-       workspace  vector  should  contain at least 20 elements. It is used for
-       keeping  track  of  multiple  paths  through  the  pattern  tree.  More
-       workspace  will  be  needed for patterns and subjects where there are a
-       lot of potential matches.
-
-       Here is an example of a simple call to pcre_dfa_exec():
-
-         int rc;
-         int ovector[10];
-         int wspace[20];
-         rc = pcre_dfa_exec(
-           re,             /* result of pcre_compile() */
-           NULL,           /* we didn't study the pattern */
-           "some string",  /* the subject string */
-           11,             /* the length of the subject string */
-           0,              /* start at offset 0 in the subject */
-           0,              /* default options */
-           ovector,        /* vector of integers for substring information */
-           10,             /* number of elements (NOT size in bytes) */
-           wspace,         /* working space vector */
-           20);            /* number of elements (NOT size in bytes) */
-
-   Option bits for pcre_dfa_exec()
-
-       The unused bits of the options argument  for  pcre_dfa_exec()  must  be
-       zero.  The  only  bits  that  may  be  set are PCRE_ANCHORED, PCRE_NEW-
-       LINE_xxx,        PCRE_NOTBOL,        PCRE_NOTEOL,        PCRE_NOTEMPTY,
-       PCRE_NOTEMPTY_ATSTART,       PCRE_NO_UTF8_CHECK,      PCRE_BSR_ANYCRLF,
-       PCRE_BSR_UNICODE, PCRE_NO_START_OPTIMIZE, PCRE_PARTIAL_HARD,  PCRE_PAR-
-       TIAL_SOFT,  PCRE_DFA_SHORTEST,  and PCRE_DFA_RESTART.  All but the last
-       four of these are  exactly  the  same  as  for  pcre_exec(),  so  their
-       description is not repeated here.
-
-         PCRE_PARTIAL_HARD
-         PCRE_PARTIAL_SOFT
-
-       These  have the same general effect as they do for pcre_exec(), but the
-       details are slightly  different.  When  PCRE_PARTIAL_HARD  is  set  for
-       pcre_dfa_exec(),  it  returns PCRE_ERROR_PARTIAL if the end of the sub-
-       ject is reached and there is still at least  one  matching  possibility
-       that requires additional characters. This happens even if some complete
-       matches have also been found. When PCRE_PARTIAL_SOFT is set, the return
-       code PCRE_ERROR_NOMATCH is converted into PCRE_ERROR_PARTIAL if the end
-       of the subject is reached, there have been  no  complete  matches,  but
-       there  is  still  at least one matching possibility. The portion of the
-       string that was inspected when the longest partial match was  found  is
-       set  as  the  first  matching  string  in  both cases.  There is a more
-       detailed discussion of partial and multi-segment matching,  with  exam-
-       ples, in the pcrepartial documentation.
-
-         PCRE_DFA_SHORTEST
-
-       Setting  the  PCRE_DFA_SHORTEST option causes the matching algorithm to
-       stop as soon as it has found one match. Because of the way the alterna-
-       tive  algorithm  works, this is necessarily the shortest possible match
-       at the first possible matching point in the subject string.
-
-         PCRE_DFA_RESTART
-
-       When pcre_dfa_exec() returns a partial match, it is possible to call it
-       again,  with  additional  subject characters, and have it continue with
-       the same match. The PCRE_DFA_RESTART option requests this action;  when
-       it  is  set,  the workspace and wscount options must reference the same
-       vector as before because data about the match so far is  left  in  them
-       after a partial match. There is more discussion of this facility in the
-       pcrepartial documentation.
-
-   Successful returns from pcre_dfa_exec()
-
-       When pcre_dfa_exec() succeeds, it may have matched more than  one  sub-
-       string in the subject. Note, however, that all the matches from one run
-       of the function start at the same point in  the  subject.  The  shorter
-       matches  are all initial substrings of the longer matches. For example,
-       if the pattern
-
-         <.*>
-
-       is matched against the string
-
-         This is <something> <something else> <something further> no more
-
-       the three matched strings are
-
-         <something>
-         <something> <something else>
-         <something> <something else> <something further>
-
-       On success, the yield of the function is a number  greater  than  zero,
-       which  is  the  number of matched substrings. The substrings themselves
-       are returned in ovector. Each string uses two elements;  the  first  is
-       the  offset  to  the start, and the second is the offset to the end. In
-       fact, all the strings have the same start  offset.  (Space  could  have
-       been  saved by giving this only once, but it was decided to retain some
-       compatibility with the way pcre_exec() returns data,  even  though  the
-       meaning of the strings is different.)
-
-       The strings are returned in reverse order of length; that is, the long-
-       est matching string is given first. If there were too many  matches  to
-       fit  into ovector, the yield of the function is zero, and the vector is
-       filled with the longest matches.  Unlike  pcre_exec(),  pcre_dfa_exec()
-       can use the entire ovector for returning matched strings.
-
-       NOTE:  PCRE's  "auto-possessification"  optimization usually applies to
-       character repeats at the end of a pattern (as well as internally).  For
-       example,  the  pattern "a\d+" is compiled as if it were "a\d++" because
-       there is no point even considering the possibility of backtracking into
-       the  repeated digits. For DFA matching, this means that only one possi-
-       ble match is found. If you really do  want  multiple  matches  in  such
-       cases,   either   use   an   ungreedy   repeat  ("a\d+?")  or  set  the
-       PCRE_NO_AUTO_POSSESS option when compiling.
-
-   Error returns from pcre_dfa_exec()
-
-       The pcre_dfa_exec() function returns a negative number when  it  fails.
-       Many  of  the  errors  are  the  same as for pcre_exec(), and these are
-       described above.  There are in addition the following errors  that  are
-       specific to pcre_dfa_exec():
-
-         PCRE_ERROR_DFA_UITEM      (-16)
-
-       This  return is given if pcre_dfa_exec() encounters an item in the pat-
-       tern that it does not support, for instance, the use of \C  or  a  back
-       reference.
-
-         PCRE_ERROR_DFA_UCOND      (-17)
-
-       This  return  is  given  if pcre_dfa_exec() encounters a condition item
-       that uses a back reference for the condition, or a test  for  recursion
-       in a specific group. These are not supported.
-
-         PCRE_ERROR_DFA_UMLIMIT    (-18)
-
-       This  return  is given if pcre_dfa_exec() is called with an extra block
-       that contains a setting of  the  match_limit  or  match_limit_recursion
-       fields.  This  is  not  supported (these fields are meaningless for DFA
-       matching).
-
-         PCRE_ERROR_DFA_WSSIZE     (-19)
-
-       This return is given if  pcre_dfa_exec()  runs  out  of  space  in  the
-       workspace vector.
-
-         PCRE_ERROR_DFA_RECURSE    (-20)
-
-       When  a  recursive subpattern is processed, the matching function calls
-       itself recursively, using private vectors for  ovector  and  workspace.
-       This  error  is  given  if  the output vector is not large enough. This
-       should be extremely rare, as a vector of size 1000 is used.
-
-         PCRE_ERROR_DFA_BADRESTART (-30)
-
-       When pcre_dfa_exec() is called with the PCRE_DFA_RESTART  option,  some
-       plausibility  checks  are  made on the contents of the workspace, which
-       should contain data about the previous partial match. If any  of  these
-       checks fail, this error is given.
-
-
-SEE ALSO
-
-       pcre16(3),   pcre32(3),  pcrebuild(3),  pcrecallout(3),  pcrecpp(3)(3),
-       pcrematching(3), pcrepartial(3), pcreposix(3), pcreprecompile(3), pcre-
-       sample(3), pcrestack(3).
-
-
-AUTHOR
-
-       Philip Hazel
-       University Computing Service
-       Cambridge CB2 3QH, England.
-
-
-REVISION
-
-       Last updated: 09 February 2014
-       Copyright (c) 1997-2014 University of Cambridge.
-------------------------------------------------------------------------------
-
-
-PCRECALLOUT(3)             Library Functions Manual             PCRECALLOUT(3)
-
-
-
-NAME
-       PCRE - Perl-compatible regular expressions
-
-SYNOPSIS
-
-       #include <pcre.h>
-
-       int (*pcre_callout)(pcre_callout_block *);
-
-       int (*pcre16_callout)(pcre16_callout_block *);
-
-       int (*pcre32_callout)(pcre32_callout_block *);
-
-
-DESCRIPTION
-
-       PCRE provides a feature called "callout", which is a means of temporar-
-       ily passing control to the caller of PCRE  in  the  middle  of  pattern
-       matching.  The  caller of PCRE provides an external function by putting
-       its entry point in the global variable pcre_callout (pcre16_callout for
-       the 16-bit library, pcre32_callout for the 32-bit library). By default,
-       this variable contains NULL, which disables all calling out.
-
-       Within a regular expression, (?C) indicates the  points  at  which  the
-       external  function  is  to  be  called. Different callout points can be
-       identified by putting a number less than 256 after the  letter  C.  The
-       default  value  is  zero.   For  example,  this pattern has two callout
-       points:
-
-         (?C1)abc(?C2)def
-
-       If the PCRE_AUTO_CALLOUT option bit is set when a pattern is  compiled,
-       PCRE  automatically  inserts callouts, all with number 255, before each
-       item in the pattern. For example, if PCRE_AUTO_CALLOUT is used with the
-       pattern
-
-         A(\d{2}|--)
-
-       it is processed as if it were
-
-       (?C255)A(?C255)((?C255)\d{2}(?C255)|(?C255)-(?C255)-(?C255))(?C255)
-
-       Notice  that  there  is a callout before and after each parenthesis and
-       alternation bar. If the pattern contains a conditional group whose con-
-       dition  is  an  assertion, an automatic callout is inserted immediately
-       before the condition. Such a callout may also be  inserted  explicitly,
-       for example:
-
-         (?(?C9)(?=a)ab|de)
-
-       This  applies only to assertion conditions (because they are themselves
-       independent groups).
-
-       Automatic callouts can be used for tracking  the  progress  of  pattern
-       matching.   The pcretest program has a pattern qualifier (/C) that sets
-       automatic callouts; when it is used, the output indicates how the  pat-
-       tern  is  being matched. This is useful information when you are trying
-       to optimize the performance of a particular pattern.
-
-
-MISSING CALLOUTS
-
-       You should be aware that, because of optimizations in the way PCRE com-
-       piles and matches patterns, callouts sometimes do not happen exactly as
-       you might expect.
-
-       At compile time, PCRE "auto-possessifies" repeated items when it  knows
-       that  what follows cannot be part of the repeat. For example, a+[bc] is
-       compiled as if it were a++[bc]. The pcretest output when  this  pattern
-       is  anchored  and  then  applied  with automatic callouts to the string
-       "aaaa" is:
-
-         --->aaaa
-          +0 ^        ^
-          +1 ^        a+
-          +3 ^   ^    [bc]
-         No match
-
-       This indicates that when matching [bc] fails, there is no  backtracking
-       into  a+  and  therefore the callouts that would be taken for the back-
-       tracks do not occur.  You can disable the  auto-possessify  feature  by
-       passing PCRE_NO_AUTO_POSSESS to pcre_compile(), or starting the pattern
-       with (*NO_AUTO_POSSESS). If this is done  in  pcretest  (using  the  /O
-       qualifier), the output changes to this:
-
-         --->aaaa
-          +0 ^        ^
-          +1 ^        a+
-          +3 ^   ^    [bc]
-          +3 ^  ^     [bc]
-          +3 ^ ^      [bc]
-          +3 ^^       [bc]
-         No match
-
-       This time, when matching [bc] fails, the matcher backtracks into a+ and
-       tries again, repeatedly, until a+ itself fails.
-
-       Other optimizations that provide fast "no match"  results  also  affect
-       callouts.  For example, if the pattern is
-
-         ab(?C4)cd
-
-       PCRE knows that any matching string must contain the letter "d". If the
-       subject string is "abyz", the lack of "d" means that  matching  doesn't
-       ever  start,  and  the  callout is never reached. However, with "abyd",
-       though the result is still no match, the callout is obeyed.
-
-       If the pattern is studied, PCRE knows the minimum length of a  matching
-       string,  and will immediately give a "no match" return without actually
-       running a match if the subject is not long enough, or,  for  unanchored
-       patterns, if it has been scanned far enough.
-
-       You  can disable these optimizations by passing the PCRE_NO_START_OPTI-
-       MIZE option to the matching function, or by starting the  pattern  with
-       (*NO_START_OPT).  This slows down the matching process, but does ensure
-       that callouts such as the example above are obeyed.
-
-
-THE CALLOUT INTERFACE
-
-       During matching, when PCRE reaches a callout point, the external  func-
-       tion defined by pcre_callout or pcre[16|32]_callout is called (if it is
-       set). This applies to both normal and DFA matching. The  only  argument
-       to   the   callout   function   is  a  pointer  to  a  pcre_callout  or
-       pcre[16|32]_callout block.  These  structures  contains  the  following
-       fields:
-
-         int           version;
-         int           callout_number;
-         int          *offset_vector;
-         const char   *subject;           (8-bit version)
-         PCRE_SPTR16   subject;           (16-bit version)
-         PCRE_SPTR32   subject;           (32-bit version)
-         int           subject_length;
-         int           start_match;
-         int           current_position;
-         int           capture_top;
-         int           capture_last;
-         void         *callout_data;
-         int           pattern_position;
-         int           next_item_length;
-         const unsigned char *mark;       (8-bit version)
-         const PCRE_UCHAR16  *mark;       (16-bit version)
-         const PCRE_UCHAR32  *mark;       (32-bit version)
-
-       The  version  field  is an integer containing the version number of the
-       block format. The initial version was 0; the current version is 2.  The
-       version  number  will  change  again in future if additional fields are
-       added, but the intention is never to remove any of the existing fields.
-
-       The callout_number field contains the number of the  callout,  as  com-
-       piled  into  the pattern (that is, the number after ?C for manual call-
-       outs, and 255 for automatically generated callouts).
-
-       The offset_vector field is a pointer to the vector of offsets that  was
-       passed  by  the  caller  to  the matching function. When pcre_exec() or
-       pcre[16|32]_exec() is used, the contents can be inspected, in order  to
-       extract  substrings  that  have been matched so far, in the same way as
-       for extracting substrings after a match  has  completed.  For  the  DFA
-       matching functions, this field is not useful.
-
-       The subject and subject_length fields contain copies of the values that
-       were passed to the matching function.
-
-       The start_match field normally contains the offset within  the  subject
-       at  which  the  current  match  attempt started. However, if the escape
-       sequence \K has been encountered, this value is changed to reflect  the
-       modified  starting  point.  If the pattern is not anchored, the callout
-       function may be called several times from the same point in the pattern
-       for different starting points in the subject.
-
-       The  current_position  field  contains the offset within the subject of
-       the current match pointer.
-
-       When the pcre_exec() or pcre[16|32]_exec()  is  used,  the  capture_top
-       field  contains  one  more than the number of the highest numbered cap-
-       tured substring so far. If no substrings have been captured, the  value
-       of  capture_top  is one. This is always the case when the DFA functions
-       are used, because they do not support captured substrings.
-
-       The capture_last field contains the number of the  most  recently  cap-
-       tured  substring. However, when a recursion exits, the value reverts to
-       what it was outside the recursion, as do the  values  of  all  captured
-       substrings.  If  no  substrings  have  been captured, the value of cap-
-       ture_last is -1. This is always the case for  the  DFA  matching  func-
-       tions.
-
-       The  callout_data  field  contains a value that is passed to a matching
-       function specifically so that it can be passed back in callouts. It  is
-       passed  in  the callout_data field of a pcre_extra or pcre[16|32]_extra
-       data structure. If no such data was passed, the value  of  callout_data
-       in  a  callout  block is NULL. There is a description of the pcre_extra
-       structure in the pcreapi documentation.
-
-       The pattern_position field is present from version  1  of  the  callout
-       structure. It contains the offset to the next item to be matched in the
-       pattern string.
-
-       The next_item_length field is present from version  1  of  the  callout
-       structure. It contains the length of the next item to be matched in the
-       pattern string. When the callout immediately  precedes  an  alternation
-       bar,  a  closing  parenthesis, or the end of the pattern, the length is
-       zero. When the callout precedes an opening parenthesis, the  length  is
-       that of the entire subpattern.
-
-       The  pattern_position  and next_item_length fields are intended to help
-       in distinguishing between different automatic callouts, which all  have
-       the same callout number. However, they are set for all callouts.
-
-       The  mark  field is present from version 2 of the callout structure. In
-       callouts from pcre_exec() or pcre[16|32]_exec() it contains  a  pointer
-       to  the  zero-terminated  name  of  the  most  recently passed (*MARK),
-       (*PRUNE), or (*THEN) item in the match, or NULL if no such  items  have
-       been  passed.  Instances  of  (*PRUNE) or (*THEN) without a name do not
-       obliterate a previous (*MARK). In callouts from the DFA matching  func-
-       tions this field always contains NULL.
-
-
-RETURN VALUES
-
-       The  external callout function returns an integer to PCRE. If the value
-       is zero, matching proceeds as normal. If  the  value  is  greater  than
-       zero,  matching  fails  at  the current point, but the testing of other
-       matching possibilities goes ahead, just as if a lookahead assertion had
-       failed.  If  the  value  is less than zero, the match is abandoned, the
-       matching function returns the negative value.
-
-       Negative  values  should  normally  be   chosen   from   the   set   of
-       PCRE_ERROR_xxx values. In particular, PCRE_ERROR_NOMATCH forces a stan-
-       dard "no  match"  failure.   The  error  number  PCRE_ERROR_CALLOUT  is
-       reserved  for  use  by callout functions; it will never be used by PCRE
-       itself.
-
-
-AUTHOR
-
-       Philip Hazel
-       University Computing Service
-       Cambridge CB2 3QH, England.
-
-
-REVISION
-
-       Last updated: 12 November 2013
-       Copyright (c) 1997-2013 University of Cambridge.
-------------------------------------------------------------------------------
-
-
-PCRECOMPAT(3)              Library Functions Manual              PCRECOMPAT(3)
-
-
-
-NAME
-       PCRE - Perl-compatible regular expressions
-
-DIFFERENCES BETWEEN PCRE AND PERL
-
-       This  document describes the differences in the ways that PCRE and Perl
-       handle regular expressions. The differences  described  here  are  with
-       respect to Perl versions 5.10 and above.
-
-       1. PCRE has only a subset of Perl's Unicode support. Details of what it
-       does have are given in the pcreunicode page.
-
-       2. PCRE allows repeat quantifiers only on parenthesized assertions, but
-       they  do  not mean what you might think. For example, (?!a){3} does not
-       assert that the next three characters are not "a". It just asserts that
-       the next character is not "a" three times (in principle: PCRE optimizes
-       this to run the assertion just once). Perl allows repeat quantifiers on
-       other assertions such as \b, but these do not seem to have any use.
-
-       3.  Capturing  subpatterns  that occur inside negative lookahead asser-
-       tions are counted, but their entries in the offsets  vector  are  never
-       set.  Perl sometimes (but not always) sets its numerical variables from
-       inside negative assertions.
-
-       4. Though binary zero characters are supported in the  subject  string,
-       they are not allowed in a pattern string because it is passed as a nor-
-       mal C string, terminated by zero. The escape sequence \0 can be used in
-       the pattern to represent a binary zero.
-
-       5.  The  following Perl escape sequences are not supported: \l, \u, \L,
-       \U, and \N when followed by a character name or Unicode value.  (\N  on
-       its own, matching a non-newline character, is supported.) In fact these
-       are implemented by Perl's general string-handling and are not  part  of
-       its  pattern  matching engine. If any of these are encountered by PCRE,
-       an error is generated by default. However, if the  PCRE_JAVASCRIPT_COM-
-       PAT  option  is set, \U and \u are interpreted as JavaScript interprets
-       them.
-
-       6. The Perl escape sequences \p, \P, and \X are supported only if  PCRE
-       is  built  with Unicode character property support. The properties that
-       can be tested with \p and \P are limited to the general category  prop-
-       erties  such  as  Lu and Nd, script names such as Greek or Han, and the
-       derived properties Any and L&. PCRE does  support  the  Cs  (surrogate)
-       property,  which  Perl  does  not; the Perl documentation says "Because
-       Perl hides the need for the user to understand the internal representa-
-       tion  of Unicode characters, there is no need to implement the somewhat
-       messy concept of surrogates."
-
-       7. PCRE does support the \Q...\E escape for quoting substrings. Charac-
-       ters  in  between  are  treated as literals. This is slightly different
-       from Perl in that $ and @ are  also  handled  as  literals  inside  the
-       quotes.  In Perl, they cause variable interpolation (but of course PCRE
-       does not have variables). Note the following examples:
-
-           Pattern            PCRE matches      Perl matches
-
-           \Qabc$xyz\E        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.
-
-       8. Fairly obviously, PCRE does not support the (?{code}) and (??{code})
-       constructions. However, there is support for recursive  patterns.  This
-       is  not  available  in Perl 5.8, but it is in Perl 5.10. Also, the PCRE
-       "callout" feature allows an external function to be called during  pat-
-       tern matching. See the pcrecallout documentation for details.
-
-       9.  Subpatterns  that  are called as subroutines (whether or not recur-
-       sively) are always treated as atomic  groups  in  PCRE.  This  is  like
-       Python,  but  unlike Perl.  Captured values that are set outside a sub-
-       routine call can be reference from inside in PCRE,  but  not  in  Perl.
-       There is a discussion that explains these differences in more detail in
-       the section on recursion differences from Perl in the pcrepattern page.
-
-       10. If any of the backtracking control verbs are used in  a  subpattern
-       that  is  called  as  a  subroutine (whether or not recursively), their
-       effect is confined to that subpattern; it does not extend to  the  sur-
-       rounding  pattern.  This is not always the case in Perl. In particular,
-       if (*THEN) is present in a group that is called as  a  subroutine,  its
-       action is limited to that group, even if the group does not contain any
-       | characters. Note that such subpatterns are processed as  anchored  at
-       the point where they are tested.
-
-       11.  If a pattern contains more than one backtracking control verb, the
-       first one that is backtracked onto acts. For example,  in  the  pattern
-       A(*COMMIT)B(*PRUNE)C  a  failure in B triggers (*COMMIT), but a failure
-       in C triggers (*PRUNE). Perl's behaviour is more complex; in many cases
-       it is the same as PCRE, but there are examples where it differs.
-
-       12.  Most  backtracking  verbs in assertions have their normal actions.
-       They are not confined to the assertion.
-
-       13. There are some differences that are concerned with the settings  of
-       captured  strings  when  part  of  a  pattern is repeated. For example,
-       matching "aba" against the  pattern  /^(a(b)?)+$/  in  Perl  leaves  $2
-       unset, but in PCRE it is set to "b".
-
-       14.  PCRE's handling of duplicate subpattern numbers and duplicate sub-
-       pattern names is not as general as Perl's. This is a consequence of the
-       fact the PCRE works internally just with numbers, using an external ta-
-       ble to translate between numbers and names. In  particular,  a  pattern
-       such  as  (?|(?<a>A)|(?<b)B),  where the two capturing parentheses have
-       the same number but different names, is not supported,  and  causes  an
-       error  at compile time. If it were allowed, it would not be possible to
-       distinguish which parentheses matched, because both names map  to  cap-
-       turing subpattern number 1. To avoid this confusing situation, an error
-       is given at compile time.
-
-       15. Perl recognizes comments in some places that  PCRE  does  not,  for
-       example,  between  the  ( and ? at the start of a subpattern. If the /x
-       modifier is set, Perl allows white space between ( and ?  (though  cur-
-       rent  Perls  warn that this is deprecated) but PCRE never does, even if
-       the PCRE_EXTENDED option is set.
-
-       16. Perl, when in warning mode, gives warnings  for  character  classes
-       such  as  [A-\d] or [a-[:digit:]]. It then treats the hyphens as liter-
-       als. PCRE has no warning features, so it gives an error in these  cases
-       because they are almost certainly user mistakes.
-
-       17.  In  PCRE,  the upper/lower case character properties Lu and Ll are
-       not affected when case-independent matching is specified. For  example,
-       \p{Lu} always matches an upper case letter. I think Perl has changed in
-       this respect; in the release at the time of writing (5.16), \p{Lu}  and
-       \p{Ll} match all letters, regardless of case, when case independence is
-       specified.
-
-       18. PCRE provides some extensions to the Perl regular expression facil-
-       ities.   Perl  5.10  includes new features that are not in earlier ver-
-       sions of Perl, some of which (such as named parentheses) have  been  in
-       PCRE for some time. This list is with respect to Perl 5.10:
-
-       (a)  Although  lookbehind  assertions  in  PCRE must match fixed length
-       strings, each alternative branch of a lookbehind assertion can match  a
-       different  length  of  string.  Perl requires them all to have the same
-       length.
-
-       (b) If PCRE_DOLLAR_ENDONLY is set and PCRE_MULTILINE is not set, the  $
-       meta-character matches only at the very end of the string.
-
-       (c) If PCRE_EXTRA is set, a backslash followed by a letter with no spe-
-       cial meaning is faulted. Otherwise, like Perl, the backslash is quietly
-       ignored.  (Perl can be made to issue a warning.)
-
-       (d)  If  PCRE_UNGREEDY is set, the greediness of the repetition quanti-
-       fiers is inverted, that is, by default they are not greedy, but if fol-
-       lowed by a question mark they are.
-
-       (e) PCRE_ANCHORED can be used at matching time to force a pattern to be
-       tried only at the first matching position in the subject string.
-
-       (f) The PCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY, PCRE_NOTEMPTY_ATSTART,
-       and  PCRE_NO_AUTO_CAPTURE  options for pcre_exec() have no Perl equiva-
-       lents.
-
-       (g) The \R escape sequence can be restricted to match only CR,  LF,  or
-       CRLF by the PCRE_BSR_ANYCRLF option.
-
-       (h) The callout facility is PCRE-specific.
-
-       (i) The partial matching facility is PCRE-specific.
-
-       (j) Patterns compiled by PCRE can be saved and re-used at a later time,
-       even on different hosts that have the other endianness.  However,  this
-       does not apply to optimized data created by the just-in-time compiler.
-
-       (k)    The    alternative    matching    functions    (pcre_dfa_exec(),
-       pcre16_dfa_exec() and pcre32_dfa_exec(),) match in a different way  and
-       are not Perl-compatible.
-
-       (l)  PCRE  recognizes some special sequences such as (*CR) at the start
-       of a pattern that set overall options that cannot be changed within the
-       pattern.
-
-
-AUTHOR
-
-       Philip Hazel
-       University Computing Service
-       Cambridge CB2 3QH, England.
-
-
-REVISION
-
-       Last updated: 10 November 2013
-       Copyright (c) 1997-2013 University of Cambridge.
-------------------------------------------------------------------------------
-
-
-PCREPATTERN(3)             Library Functions Manual             PCREPATTERN(3)
-
-
-
-NAME
-       PCRE - Perl-compatible regular expressions
-
-PCRE REGULAR EXPRESSION DETAILS
-
-       The  syntax and semantics of the regular expressions that are supported
-       by PCRE are described in detail below. There is a quick-reference  syn-
-       tax summary in the pcresyntax page. PCRE tries to match Perl syntax and
-       semantics as closely as it can. PCRE  also  supports  some  alternative
-       regular  expression  syntax (which does not conflict with the Perl syn-
-       tax) in order to provide some compatibility with regular expressions in
-       Python, .NET, and Oniguruma.
-
-       Perl's  regular expressions are described in its own documentation, and
-       regular expressions in general are covered 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.
-
-       This document discusses the patterns that are supported  by  PCRE  when
-       one    its    main   matching   functions,   pcre_exec()   (8-bit)   or
-       pcre[16|32]_exec() (16- or 32-bit), is used. PCRE also has  alternative
-       matching  functions,  pcre_dfa_exec()  and pcre[16|32_dfa_exec(), which
-       match using a different algorithm that is not Perl-compatible. Some  of
-       the  features  discussed  below  are not available when DFA matching is
-       used. The advantages and disadvantages of  the  alternative  functions,
-       and  how  they  differ  from the normal functions, are discussed in the
-       pcrematching page.
-
-
-SPECIAL START-OF-PATTERN ITEMS
-
-       A number of options that can be passed to pcre_compile()  can  also  be
-       set by special items at the start of a pattern. These are not Perl-com-
-       patible, but are provided to make these options accessible  to  pattern
-       writers  who are not able to change the program that processes the pat-
-       tern. Any number of these items  may  appear,  but  they  must  all  be
-       together right at the start of the pattern string, and the letters must
-       be in upper case.
-
-   UTF support
-
-       The original operation of PCRE was on strings of  one-byte  characters.
-       However,  there  is  now also support for UTF-8 strings in the original
-       library, an extra library that supports  16-bit  and  UTF-16  character
-       strings,  and a third library that supports 32-bit and UTF-32 character
-       strings. To use these features, PCRE must be built to include appropri-
-       ate  support. When using UTF strings you must either call the compiling
-       function with the PCRE_UTF8, PCRE_UTF16, or PCRE_UTF32 option,  or  the
-       pattern must start with one of these special sequences:
-
-         (*UTF8)
-         (*UTF16)
-         (*UTF32)
-         (*UTF)
-
-       (*UTF)  is  a  generic  sequence  that  can  be  used  with  any of the
-       libraries.  Starting a pattern with such a sequence  is  equivalent  to
-       setting  the  relevant  option.  How setting a UTF mode affects pattern
-       matching is mentioned in several places below. There is also a  summary
-       of features in the pcreunicode page.
-
-       Some applications that allow their users to supply patterns may wish to
-       restrict  them  to  non-UTF  data  for   security   reasons.   If   the
-       PCRE_NEVER_UTF  option  is  set  at  compile  time, (*UTF) etc. are not
-       allowed, and their appearance causes an error.
-
-   Unicode property support
-
-       Another special sequence that may appear at the start of a  pattern  is
-       (*UCP).   This  has  the same effect as setting the PCRE_UCP option: it
-       causes sequences such as \d and \w to use Unicode properties to  deter-
-       mine character types, instead of recognizing only characters with codes
-       less than 128 via a lookup table.
-
-   Disabling auto-possessification
-
-       If a pattern starts with (*NO_AUTO_POSSESS), it has the same effect  as
-       setting  the  PCRE_NO_AUTO_POSSESS  option  at compile time. This stops
-       PCRE from making quantifiers possessive when what follows cannot  match
-       the  repeated item. For example, by default a+b is treated as a++b. For
-       more details, see the pcreapi documentation.
-
-   Disabling start-up optimizations
-
-       If a pattern starts with (*NO_START_OPT), it has  the  same  effect  as
-       setting the PCRE_NO_START_OPTIMIZE option either at compile or matching
-       time. This disables several  optimizations  for  quickly  reaching  "no
-       match" results. For more details, see the pcreapi documentation.
-
-   Newline conventions
-
-       PCRE  supports five different conventions for indicating line breaks in
-       strings: a single CR (carriage return) character, a  single  LF  (line-
-       feed) character, the two-character sequence CRLF, any of the three pre-
-       ceding, or any Unicode newline sequence. The pcreapi page  has  further
-       discussion  about newlines, and shows how to set the newline convention
-       in the options arguments for the compiling and matching functions.
-
-       It is also possible to specify a newline convention by starting a  pat-
-       tern string with one of the following five sequences:
-
-         (*CR)        carriage return
-         (*LF)        linefeed
-         (*CRLF)      carriage return, followed by linefeed
-         (*ANYCRLF)   any of the three above
-         (*ANY)       all Unicode newline sequences
-
-       These override the default and the options given to the compiling func-
-       tion. For example, on a Unix system where LF  is  the  default  newline
-       sequence, the pattern
-
-         (*CR)a.b
-
-       changes the convention to CR. That pattern matches "a\nb" because LF is
-       no longer a newline. If more than one of these settings is present, the
-       last one is used.
-
-       The  newline  convention affects where the circumflex and dollar asser-
-       tions are true. It also affects the interpretation of the dot metachar-
-       acter when PCRE_DOTALL is not set, and the behaviour of \N. However, it
-       does not affect what the \R escape sequence matches. By  default,  this
-       is  any Unicode newline sequence, for Perl compatibility. However, this
-       can be changed; see the description of \R in the section entitled "New-
-       line  sequences"  below.  A change of \R setting can be combined with a
-       change of newline convention.
-
-   Setting match and recursion limits
-
-       The caller of pcre_exec() can set a limit on the number  of  times  the
-       internal  match() function is called and on the maximum depth of recur-
-       sive calls. These facilities are provided to catch runaway matches that
-       are provoked by patterns with huge matching trees (a typical example is
-       a pattern with nested unlimited repeats) and to avoid  running  out  of
-       system  stack  by  too  much  recursion.  When  one  of these limits is
-       reached, pcre_exec() gives an error return. The limits can also be  set
-       by items at the start of the pattern of the form
-
-         (*LIMIT_MATCH=d)
-         (*LIMIT_RECURSION=d)
-
-       where d is any number of decimal digits. However, the value of the set-
-       ting must be less than the value set (or defaulted) by  the  caller  of
-       pcre_exec()  for  it  to  have  any effect. In other words, the pattern
-       writer can lower the limits set by the programmer, but not raise  them.
-       If  there  is  more  than one setting of one of these limits, the lower
-       value is used.
-
-
-EBCDIC CHARACTER CODES
-
-       PCRE can be compiled to run in an environment that uses EBCDIC  as  its
-       character code rather than ASCII or Unicode (typically a mainframe sys-
-       tem). In the sections below, character code values are  ASCII  or  Uni-
-       code; in an EBCDIC environment these characters may have different code
-       values, and there are no code points greater than 255.
-
-
-CHARACTERS AND METACHARACTERS
-
-       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
-
-         The quick brown fox
-
-       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 a UTF 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 val-
-       ues, 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 support.
-
-       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 metacharacters, which do not stand for themselves
-       but instead are interpreted in some special way.
-
-       There are two different sets of metacharacters: those that  are  recog-
-       nized  anywhere in the pattern except within square brackets, and those
-       that are recognized within square brackets.  Outside  square  brackets,
-       the metacharacters are as follows:
-
-         \      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)
-         [      start character class definition
-         |      start of alternative branch
-         (      start subpattern
-         )      end subpattern
-         ?      extends the meaning of (
-                also 0 or 1 quantifier
-                also quantifier minimizer
-         *      0 or more quantifier
-         +      1 or more quantifier
-                also "possessive quantifier"
-         {      start min/max quantifier
-
-       Part  of  a  pattern  that is in square brackets is called a "character
-       class". In a character class the only metacharacters are:
-
-         \      general escape character
-         ^      negate the class, but only if the first character
-         -      indicates character range
-         [      POSIX character class (only if followed by POSIX
-                  syntax)
-         ]      terminates the character class
-
-       The following sections describe the use of each of the metacharacters.
-
-
-BACKSLASH
-
-       The backslash character has several uses. Firstly, if it is followed by
-       a character that is not a number or a letter, 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.  This escaping action applies whether  or  not  the  following
-       character  would  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 back-
-       slash, you write \\.
-
-       In a UTF mode, only ASCII numbers and letters have any special  meaning
-       after  a  backslash.  All  other characters (in particular, those whose
-       codepoints are greater than 127) are treated as literals.
-
-       If a pattern is compiled with  the  PCRE_EXTENDED  option,  most  white
-       space  in the pattern (other than in a character class), and characters
-       between a # outside a character class and the next newline,  inclusive,
-       are ignored. An escaping backslash can be used to include a white space
-       or # character as part of the pattern.
-
-       If you want to remove the special meaning from a  sequence  of  charac-
-       ters,  you can do so by putting them between \Q and \E. This is differ-
-       ent from Perl in that $ and  @  are  handled  as  literals  in  \Q...\E
-       sequences  in  PCRE, whereas in Perl, $ and @ cause variable interpola-
-       tion. Note the following examples:
-
-         Pattern            PCRE matches   Perl matches
-
-         \Qabc$xyz\E        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.   An  isolated \E that is not preceded by \Q is ignored. If \Q
-       is not followed by \E later in the pattern, the literal  interpretation
-       continues  to  the  end  of  the pattern (that is, \E is assumed at the
-       end). If the isolated \Q is inside a character class,  this  causes  an
-       error, because the character class is not terminated.
-
-   Non-printing characters
-
-       A second use of backslash provides a way of encoding non-printing char-
-       acters 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  often  easier  to  use  one  of  the following escape
-       sequences than the binary character it represents.  In an ASCII or Uni-
-       code environment, these escapes are as follows:
-
-         \a        alarm, that is, the BEL character (hex 07)
-         \cx       "control-x", where x is any ASCII character
-         \e        escape (hex 1B)
-         \f        form feed (hex 0C)
-         \n        linefeed (hex 0A)
-         \r        carriage return (hex 0D)
-         \t        tab (hex 09)
-         \0dd      character with octal code 0dd
-         \ddd      character with octal code ddd, or back reference
-         \o{ddd..} character with octal code ddd..
-         \xhh      character with hex code hh
-         \x{hhh..} character with hex code hhh.. (non-JavaScript mode)
-         \uhhhh    character with hex code hhhh (JavaScript mode only)
-
-       The  precise effect of \cx on ASCII characters 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 \cA to \cZ become hex 01 to hex 1A
-       (A is 41, Z is 5A), but \c{ becomes hex 3B ({ is 7B), and  \c;  becomes
-       hex  7B (; is 3B). If the data item (byte or 16-bit value) following \c
-       has a value greater than 127, a compile-time error occurs.  This  locks
-       out non-ASCII characters in all modes.
-
-       When PCRE is compiled in EBCDIC mode, \a, \e, \f, \n, \r, and \t gener-
-       ate the appropriate EBCDIC code values. The \c escape is  processed  as
-       specified for Perl in the perlebcdic document. The only characters that
-       are allowed after \c are A-Z, a-z, or one of @, [, \, ], ^,  _,  or  ?.
-       Any  other  character  provokes  a  compile-time error. The sequence \@
-       encodes character code 0; the letters (in either case)  encode  charac-
-       ters 1-26 (hex 01 to hex 1A); [, \, ], ^, and _ encode characters 27-31
-       (hex 1B to hex 1F), and \? becomes either 255 (hex FF) or 95 (hex 5F).
-
-       Thus, apart from \?, these escapes generate  the  same  character  code
-       values  as  they do in an ASCII environment, though the meanings of the
-       values mostly differ. For example, \G always generates  code  value  7,
-       which is BEL in ASCII but DEL in EBCDIC.
-
-       The  sequence  \?  generates DEL (127, hex 7F) in an ASCII environment,
-       but because 127 is not a control character in  EBCDIC,  Perl  makes  it
-       generate  the  APC character. Unfortunately, there are several variants
-       of EBCDIC. In most of them the APC character has  the  value  255  (hex
-       FF),  but  in  the one Perl calls POSIX-BC its value is 95 (hex 5F). If
-       certain other characters have POSIX-BC values, PCRE makes  \?  generate
-       95; otherwise it generates 255.
-
-       After  \0  up  to two further octal digits are read. If there are fewer
-       than two digits, just  those  that  are  present  are  used.  Thus  the
-       sequence \0\x\015 specifies two binary zeros followed by a CR character
-       (code value 13). Make sure you supply two digits after the initial zero
-       if the pattern character that follows is itself an octal digit.
-
-       The  escape \o must be followed by a sequence of octal digits, enclosed
-       in braces. An error occurs if this is not the case. This  escape  is  a
-       recent  addition  to Perl; it provides way of specifying character code
-       points as octal numbers greater than 0777, and  it  also  allows  octal
-       numbers and back references to be unambiguously specified.
-
-       For greater clarity and unambiguity, it is best to avoid following \ by
-       a digit greater than zero. Instead, use \o{} or \x{} to specify charac-
-       ter  numbers,  and \g{} to specify back references. The following para-
-       graphs describe the old, ambiguous syntax.
-
-       The handling of a backslash followed by a digit other than 0 is compli-
-       cated,  and  Perl  has changed in recent releases, causing PCRE also to
-       change. Outside a character class, PCRE reads the digit and any follow-
-       ing  digits  as  a  decimal number. If the number is less than 8, or if
-       there have been at least that many previous capturing left  parentheses
-       in  the expression, the entire sequence is taken as a back reference. A
-       description of how this works is given later, following the  discussion
-       of parenthesized subpatterns.
-
-       Inside  a  character  class,  or  if  the decimal number following \ is
-       greater than 7 and there have not been that many capturing subpatterns,
-       PCRE  handles \8 and \9 as the literal characters "8" and "9", and oth-
-       erwise re-reads up to three octal digits following the backslash, using
-       them  to  generate  a  data character.  Any subsequent digits stand for
-       themselves. For example:
-
-         \040   is another way of writing an ASCII space
-         \40    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
-                   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
-                   character with octal code 113
-         \377   might be a back reference, otherwise
-                   the value 255 (decimal)
-         \81    is either a back reference, or the two
-                   characters "8" and "1"
-
-       Note that octal values of 100 or greater that are specified using  this
-       syntax  must  not be introduced by a leading zero, because no more than
-       three octal digits are ever read.
-
-       By default, after \x that is not followed by {, from zero to two  hexa-
-       decimal  digits  are  read (letters can be in upper or lower case). Any
-       number of hexadecimal digits may appear between \x{ and }. If a charac-
-       ter  other  than  a  hexadecimal digit appears between \x{ and }, or if
-       there is no terminating }, an error occurs.
-
-       If the PCRE_JAVASCRIPT_COMPAT option is set, the interpretation  of  \x
-       is  as  just described only when it is followed by two hexadecimal dig-
-       its.  Otherwise, it matches a  literal  "x"  character.  In  JavaScript
-       mode, support for code points greater than 256 is provided by \u, which
-       must be followed by four hexadecimal digits;  otherwise  it  matches  a
-       literal "u" character.
-
-       Characters whose value is less than 256 can be defined by either of the
-       two syntaxes for \x (or by \u in JavaScript mode). There is no  differ-
-       ence in the way they are handled. For example, \xdc is exactly the same
-       as \x{dc} (or \u00dc in JavaScript mode).
-
-   Constraints on character values
-
-       Characters that are specified using octal or  hexadecimal  numbers  are
-       limited to certain values, as follows:
-
-         8-bit non-UTF mode    less than 0x100
-         8-bit UTF-8 mode      less than 0x10ffff and a valid codepoint
-         16-bit non-UTF mode   less than 0x10000
-         16-bit UTF-16 mode    less than 0x10ffff and a valid codepoint
-         32-bit non-UTF mode   less than 0x100000000
-         32-bit UTF-32 mode    less than 0x10ffff and a valid codepoint
-
-       Invalid  Unicode  codepoints  are  the  range 0xd800 to 0xdfff (the so-
-       called "surrogate" codepoints), and 0xffef.
-
-   Escape sequences in character classes
-
-       All the sequences that define a single character value can be used both
-       inside  and  outside character classes. In addition, inside a character
-       class, \b is interpreted as the backspace character (hex 08).
-
-       \N is not allowed in a character class. \B, \R, and \X are not  special
-       inside  a  character  class.  Like other unrecognized escape sequences,
-       they are treated as  the  literal  characters  "B",  "R",  and  "X"  by
-       default,  but cause an error if the PCRE_EXTRA option is set. Outside a
-       character class, these sequences have different meanings.
-
-   Unsupported escape sequences
-
-       In Perl, the sequences \l, \L, \u, and \U are recognized by its  string
-       handler  and  used  to  modify  the  case  of  following characters. By
-       default, PCRE does not support these escape sequences. However, if  the
-       PCRE_JAVASCRIPT_COMPAT  option  is set, \U matches a "U" character, and
-       \u can be used to define a character by code point, as described in the
-       previous section.
-
-   Absolute and relative back references
-
-       The  sequence  \g followed by an unsigned or a negative number, option-
-       ally enclosed in braces, is an absolute or relative back  reference.  A
-       named back reference can be coded as \g{name}. Back references are dis-
-       cussed later, following the discussion of parenthesized subpatterns.
-
-   Absolute and relative subroutine calls
-
-       For compatibility with Oniguruma, the non-Perl syntax \g followed by  a
-       name or a number enclosed either in angle brackets or single quotes, is
-       an alternative syntax for referencing a subpattern as  a  "subroutine".
-       Details  are  discussed  later.   Note  that  \g{...} (Perl syntax) and
-       \g<...> (Oniguruma syntax) are not synonymous. The  former  is  a  back
-       reference; the latter is a subroutine call.
-
-   Generic character types
-
-       Another use of backslash is for specifying generic character types:
-
-         \d     any decimal digit
-         \D     any character that is not a decimal digit
-         \h     any horizontal white space character
-         \H     any character that is not a horizontal white space character
-         \s     any white space character
-         \S     any character that is not a white space character
-         \v     any vertical white space character
-         \V     any character that is not a vertical white space character
-         \w     any "word" character
-         \W     any "non-word" character
-
-       There is also the single sequence \N, which matches a non-newline char-
-       acter.  This is the same as the "." metacharacter when  PCRE_DOTALL  is
-       not  set.  Perl also uses \N to match characters by name; PCRE does not
-       support this.
-
-       Each pair of lower and upper case escape sequences partitions the  com-
-       plete  set  of  characters  into two disjoint sets. Any given character
-       matches one, and only one, of each pair. The 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, because there is no character to
-       match.
-
-       For compatibility with Perl, \s did not used to match the VT  character
-       (code  11),  which  made it different from the the POSIX "space" class.
-       However, Perl added VT at release  5.18,  and  PCRE  followed  suit  at
-       release  8.34.  The  default  \s characters are now HT (9), LF (10), VT
-       (11), FF (12), CR (13), and space (32),  which  are  defined  as  white
-       space in the "C" locale. This list may vary if locale-specific matching
-       is taking place. For example, in some locales the "non-breaking  space"
-       character  (\xA0)  is  recognized  as white space, and in others the VT
-       character is not.
-
-       A "word" character is an underscore or any character that is  a  letter
-       or  digit.   By  default,  the definition of letters and digits is con-
-       trolled by PCRE's low-valued character tables, and may vary if  locale-
-       specific  matching is taking place (see "Locale support" in the pcreapi
-       page). For example, in a French locale such  as  "fr_FR"  in  Unix-like
-       systems,  or "french" in Windows, some character codes greater than 127
-       are used for accented letters, and these are then matched  by  \w.  The
-       use of locales with Unicode is discouraged.
-
-       By  default,  characters  whose  code points are greater than 127 never
-       match \d, \s, or \w, and always match \D, \S, and \W, although this may
-       vary  for characters in the range 128-255 when locale-specific matching
-       is happening.  These escape sequences retain  their  original  meanings
-       from  before  Unicode support was available, mainly for efficiency rea-
-       sons. If PCRE is  compiled  with  Unicode  property  support,  and  the
-       PCRE_UCP  option is set, the behaviour is changed so that Unicode prop-
-       erties are used to determine character types, as follows:
-
-         \d  any character that matches \p{Nd} (decimal digit)
-         \s  any character that matches \p{Z} or \h or \v
-         \w  any character that matches \p{L} or \p{N}, plus underscore
-
-       The upper case escapes match the inverse sets of characters. Note  that
-       \d  matches  only decimal digits, whereas \w matches any Unicode digit,
-       as well as any Unicode letter, and underscore. Note also that  PCRE_UCP
-       affects  \b,  and  \B  because  they are defined in terms of \w and \W.
-       Matching these sequences is noticeably slower when PCRE_UCP is set.
-
-       The sequences \h, \H, \v, and \V are features that were added  to  Perl
-       at  release  5.10. In contrast to the other sequences, which match only
-       ASCII characters by default, these  always  match  certain  high-valued
-       code points, whether or not PCRE_UCP is set. The horizontal space char-
-       acters are:
-
-         U+0009     Horizontal tab (HT)
-         U+0020     Space
-         U+00A0     Non-break space
-         U+1680     Ogham space mark
-         U+180E     Mongolian vowel separator
-         U+2000     En quad
-         U+2001     Em quad
-         U+2002     En space
-         U+2003     Em space
-         U+2004     Three-per-em space
-         U+2005     Four-per-em space
-         U+2006     Six-per-em space
-         U+2007     Figure space
-         U+2008     Punctuation space
-         U+2009     Thin space
-         U+200A     Hair space
-         U+202F     Narrow no-break space
-         U+205F     Medium mathematical space
-         U+3000     Ideographic space
-
-       The vertical space characters are:
-
-         U+000A     Linefeed (LF)
-         U+000B     Vertical tab (VT)
-         U+000C     Form feed (FF)
-         U+000D     Carriage return (CR)
-         U+0085     Next line (NEL)
-         U+2028     Line separator
-         U+2029     Paragraph separator
-
-       In 8-bit, non-UTF-8 mode, only the characters with codepoints less than
-       256 are relevant.
-
-   Newline sequences
-
-       Outside  a  character class, by default, the escape sequence \R matches
-       any Unicode newline sequence. In 8-bit non-UTF-8 mode \R is  equivalent
-       to the following:
-
-         (?>\r\n|\n|\x0b|\f|\r|\x85)
-
-       This  is  an  example  of an "atomic group", details of which are given
-       below.  This particular group matches either the two-character sequence
-       CR  followed  by  LF,  or  one  of  the single characters LF (linefeed,
-       U+000A), VT (vertical tab, U+000B), FF (form feed,  U+000C),  CR  (car-
-       riage  return,  U+000D),  or NEL (next line, U+0085). The two-character
-       sequence is treated as a single unit that cannot be split.
-
-       In other modes, two additional characters whose codepoints are  greater
-       than 255 are added: LS (line separator, U+2028) and PS (paragraph sepa-
-       rator, U+2029).  Unicode character property support is not  needed  for
-       these characters to be recognized.
-
-       It is possible to restrict \R to match only CR, LF, or CRLF (instead of
-       the complete set  of  Unicode  line  endings)  by  setting  the  option
-       PCRE_BSR_ANYCRLF either at compile time or when the pattern is matched.
-       (BSR is an abbrevation for "backslash R".) This can be made the default
-       when  PCRE  is  built;  if this is the case, the other behaviour can be
-       requested via the PCRE_BSR_UNICODE option.   It  is  also  possible  to
-       specify  these  settings  by  starting a pattern string with one of the
-       following sequences:
-
-         (*BSR_ANYCRLF)   CR, LF, or CRLF only
-         (*BSR_UNICODE)   any Unicode newline sequence
-
-       These override the default and the options given to the compiling func-
-       tion,  but  they  can  themselves  be  overridden by options given to a
-       matching function. Note that these  special  settings,  which  are  not
-       Perl-compatible,  are  recognized  only at the very start of a pattern,
-       and that they must be in upper case.  If  more  than  one  of  them  is
-       present,  the  last  one is used. They can be combined with a change of
-       newline convention; for example, a pattern can start with:
-
-         (*ANY)(*BSR_ANYCRLF)
-
-       They can also be combined with the (*UTF8), (*UTF16), (*UTF32),  (*UTF)
-       or (*UCP) special sequences. Inside a character class, \R is treated as
-       an unrecognized escape sequence, and  so  matches  the  letter  "R"  by
-       default, but causes an error if PCRE_EXTRA is set.
-
-   Unicode character properties
-
-       When PCRE is built with Unicode character property support, three addi-
-       tional escape sequences that match characters with specific  properties
-       are  available.   When  in 8-bit non-UTF-8 mode, these sequences are of
-       course limited to testing characters whose  codepoints  are  less  than
-       256, but they do work in this mode.  The extra escape sequences are:
-
-         \p{xx}   a character with the xx property
-         \P{xx}   a character without the xx property
-         \X       a Unicode extended grapheme cluster
-
-       The  property  names represented by xx above are limited to the Unicode
-       script names, the general category properties, "Any", which matches any
-       character   (including  newline),  and  some  special  PCRE  properties
-       (described in the next section).  Other Perl properties such as  "InMu-
-       sicalSymbols"  are  not  currently supported by PCRE. Note that \P{Any}
-       does not match any characters, so always causes a match failure.
-
-       Sets of Unicode characters are defined as belonging to certain scripts.
-       A  character from one of these sets can be matched using a script name.
-       For example:
-
-         \p{Greek}
-         \P{Han}
-
-       Those that are not part of an identified script are lumped together  as
-       "Common". The current list of scripts is:
-
-       Arabic,  Armenian, Avestan, Balinese, Bamum, Bassa_Vah, Batak, Bengali,
-       Bopomofo, Brahmi, Braille, Buginese, Buhid,  Canadian_Aboriginal,  Car-
-       ian, Caucasian_Albanian, Chakma, Cham, Cherokee, Common, Coptic, Cunei-
-       form, Cypriot, Cyrillic, Deseret, Devanagari, Duployan, Egyptian_Hiero-
-       glyphs,  Elbasan,  Ethiopic,  Georgian,  Glagolitic,  Gothic,  Grantha,
-       Greek, Gujarati, Gurmukhi,  Han,  Hangul,  Hanunoo,  Hebrew,  Hiragana,
-       Imperial_Aramaic,     Inherited,     Inscriptional_Pahlavi,    Inscrip-
-       tional_Parthian,  Javanese,  Kaithi,   Kannada,   Katakana,   Kayah_Li,
-       Kharoshthi,  Khmer,  Khojki, Khudawadi, Lao, Latin, Lepcha, Limbu, Lin-
-       ear_A, Linear_B, Lisu, Lycian, Lydian,  Mahajani,  Malayalam,  Mandaic,
-       Manichaean,      Meetei_Mayek,     Mende_Kikakui,     Meroitic_Cursive,
-       Meroitic_Hieroglyphs, Miao, Modi, Mongolian, Mro,  Myanmar,  Nabataean,
-       New_Tai_Lue,   Nko,  Ogham,  Ol_Chiki,  Old_Italic,  Old_North_Arabian,
-       Old_Permic, Old_Persian, Old_South_Arabian, Old_Turkic, Oriya, Osmanya,
-       Pahawh_Hmong,    Palmyrene,    Pau_Cin_Hau,    Phags_Pa,    Phoenician,
-       Psalter_Pahlavi, Rejang, Runic, Samaritan,  Saurashtra,  Sharada,  Sha-
-       vian,  Siddham, Sinhala, Sora_Sompeng, Sundanese, Syloti_Nagri, Syriac,
-       Tagalog, Tagbanwa, Tai_Le, Tai_Tham, Tai_Viet,  Takri,  Tamil,  Telugu,
-       Thaana,  Thai,  Tibetan, Tifinagh, Tirhuta, Ugaritic, Vai, Warang_Citi,
-       Yi.
-
-       Each character has exactly one Unicode general category property, spec-
-       ified  by a two-letter abbreviation. For compatibility with Perl, nega-
-       tion can be specified by including a  circumflex  between  the  opening
-       brace  and  the  property  name.  For  example,  \p{^Lu} is the same as
-       \P{Lu}.
-
-       If only one letter is specified with \p or \P, it includes all the gen-
-       eral  category 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:
-
-         \p{L}
-         \pL
-
-       The following general category property codes are supported:
-
-         C     Other
-         Cc    Control
-         Cf    Format
-         Cn    Unassigned
-         Co    Private use
-         Cs    Surrogate
-
-         L     Letter
-         Ll    Lower case letter
-         Lm    Modifier letter
-         Lo    Other letter
-         Lt    Title case letter
-         Lu    Upper case letter
-
-         M     Mark
-         Mc    Spacing mark
-         Me    Enclosing mark
-         Mn    Non-spacing mark
-
-         N     Number
-         Nd    Decimal number
-         Nl    Letter number
-         No    Other number
-
-         P     Punctuation
-         Pc    Connector punctuation
-         Pd    Dash punctuation
-         Pe    Close punctuation
-         Pf    Final punctuation
-         Pi    Initial punctuation
-         Po    Other punctuation
-         Ps    Open punctuation
-
-         S     Symbol
-         Sc    Currency symbol
-         Sk    Modifier symbol
-         Sm    Mathematical symbol
-         So    Other symbol
-
-         Z     Separator
-         Zl    Line separator
-         Zp    Paragraph separator
-         Zs    Space separator
-
-       The  special property L& is also supported: it matches a character that
-       has the Lu, Ll, or Lt property, in other words, a letter  that  is  not
-       classified as a modifier or "other".
-
-       The  Cs  (Surrogate)  property  applies only to characters in the range
-       U+D800 to U+DFFF. Such characters are not valid in Unicode strings  and
-       so  cannot  be  tested  by  PCRE, unless UTF validity checking has been
-       turned    off    (see    the    discussion    of    PCRE_NO_UTF8_CHECK,
-       PCRE_NO_UTF16_CHECK  and PCRE_NO_UTF32_CHECK in the pcreapi page). Perl
-       does not support the Cs property.
-
-       The long synonyms for  property  names  that  Perl  supports  (such  as
-       \p{Letter})  are  not  supported by PCRE, nor is it permitted to prefix
-       any of these properties with "Is".
-
-       No character that is in the Unicode table has the Cn (unassigned) prop-
-       erty.  Instead, this property is assumed for any code point that is not
-       in the Unicode table.
-
-       Specifying caseless matching does not affect  these  escape  sequences.
-       For  example,  \p{Lu}  always  matches only upper case letters. This is
-       different from the behaviour of current versions of Perl.
-
-       Matching characters by Unicode property is not fast, because  PCRE  has
-       to  do  a  multistage table lookup in order to find a character's prop-
-       erty. That is why the traditional escape sequences such as \d and \w do
-       not use Unicode properties in PCRE by default, though you can make them
-       do so by setting the PCRE_UCP option or by starting  the  pattern  with
-       (*UCP).
-
-   Extended grapheme clusters
-
-       The  \X  escape  matches  any number of Unicode characters that form an
-       "extended grapheme cluster", and treats the sequence as an atomic group
-       (see  below).   Up  to and including release 8.31, PCRE matched an ear-
-       lier, simpler definition that was equivalent to
-
-         (?>\PM\pM*)
-
-       That is, it matched a character without the "mark"  property,  followed
-       by  zero  or  more characters with the "mark" property. Characters with
-       the "mark" property are typically non-spacing accents that  affect  the
-       preceding character.
-
-       This  simple definition was extended in Unicode to include more compli-
-       cated kinds of composite character by giving each character a  grapheme
-       breaking  property,  and  creating  rules  that use these properties to
-       define the boundaries of extended grapheme  clusters.  In  releases  of
-       PCRE later than 8.31, \X matches one of these clusters.
-
-       \X  always  matches  at least one character. Then it decides whether to
-       add additional characters according to the following rules for ending a
-       cluster:
-
-       1. End at the end of the subject string.
-
-       2.  Do not end between CR and LF; otherwise end after any control char-
-       acter.
-
-       3. Do not break Hangul (a Korean  script)  syllable  sequences.  Hangul
-       characters  are of five types: L, V, T, LV, and LVT. An L character may
-       be followed by an L, V, LV, or LVT character; an LV or V character  may
-       be followed by a V or T character; an LVT or T character may be follwed
-       only by a T character.
-
-       4. Do not end before extending characters or spacing marks.  Characters
-       with  the  "mark"  property  always have the "extend" grapheme breaking
-       property.
-
-       5. Do not end after prepend characters.
-
-       6. Otherwise, end the cluster.
-
-   PCRE's additional properties
-
-       As well as the standard Unicode properties described above,  PCRE  sup-
-       ports  four  more  that  make it possible to convert traditional escape
-       sequences such as \w and \s to use Unicode properties. PCRE uses  these
-       non-standard, non-Perl properties internally when PCRE_UCP is set. How-
-       ever, they may also be used explicitly. These properties are:
-
-         Xan   Any alphanumeric character
-         Xps   Any POSIX space character
-         Xsp   Any Perl space character
-         Xwd   Any Perl "word" character
-
-       Xan matches characters that have either the L (letter) or the  N  (num-
-       ber)  property. Xps matches the characters tab, linefeed, vertical tab,
-       form feed, or carriage return, and any other character that has  the  Z
-       (separator)  property.  Xsp is the same as Xps; it used to exclude ver-
-       tical tab, for Perl compatibility, but Perl changed, and so  PCRE  fol-
-       lowed  at  release  8.34.  Xwd matches the same characters as Xan, plus
-       underscore.
-
-       There is another non-standard property, Xuc, which matches any  charac-
-       ter  that  can  be represented by a Universal Character Name in C++ and
-       other programming languages. These are the characters $,  @,  `  (grave
-       accent),  and  all  characters with Unicode code points greater than or
-       equal to U+00A0, except for the surrogates U+D800 to U+DFFF. Note  that
-       most  base  (ASCII) characters are excluded. (Universal Character Names
-       are of the form \uHHHH or \UHHHHHHHH where H is  a  hexadecimal  digit.
-       Note that the Xuc property does not match these sequences but the char-
-       acters that they represent.)
-
-   Resetting the match start
-
-       The escape sequence \K causes any previously matched characters not  to
-       be included in the final matched sequence. For example, the pattern:
-
-         foo\Kbar
-
-       matches  "foobar",  but reports that it has matched "bar". This feature
-       is similar to a lookbehind assertion (described  below).   However,  in
-       this  case, the part of the subject before the real match does not have
-       to be of fixed length, as lookbehind assertions do. The use of \K  does
-       not  interfere  with  the setting of captured substrings.  For example,
-       when the pattern
-
-         (foo)\Kbar
-
-       matches "foobar", the first substring is still set to "foo".
-
-       Perl documents that the use  of  \K  within  assertions  is  "not  well
-       defined".  In  PCRE,  \K  is  acted upon when it occurs inside positive
-       assertions, but is ignored in negative assertions.  Note  that  when  a
-       pattern  such  as (?=ab\K) matches, the reported start of the match can
-       be greater than the end of the match.
-
-   Simple assertions
-
-       The final use of backslash is for certain simple assertions. An  asser-
-       tion  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 the start of the subject
-         \Z     matches at the end of the subject
-                 also matches before a newline at the end of the subject
-         \z     matches only at the end of the subject
-         \G     matches at the first matching position in the subject
-
-       Inside a character class, \b has a different meaning;  it  matches  the
-       backspace  character.  If  any  other  of these assertions appears in a
-       character class, by default it matches the corresponding literal  char-
-       acter  (for  example,  \B  matches  the  letter  B).  However,  if  the
-       PCRE_EXTRA option is set, an "invalid escape sequence" error is  gener-
-       ated instead.
-
-       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.  In  a
-       UTF  mode,  the  meanings  of  \w  and \W can be changed by setting the
-       PCRE_UCP option. When this is done, it also affects \b and \B.  Neither
-       PCRE  nor  Perl has a separate "start of word" or "end of word" metase-
-       quence. However, whatever follows \b normally determines which  it  is.
-       For example, the fragment \ba matches "a" at the start of a word.
-
-       The  \A,  \Z,  and \z 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  asser-
-       tions 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 startoffset argument of pcre_exec() is non-zero, indi-
-       cating 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 at the end of the string as well as at
-       the very end, 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 startoffset  argument
-       of  pcre_exec().  It  differs  from \A when the value of startoffset is
-       non-zero. By calling pcre_exec() multiple times with appropriate  argu-
-       ments, you can mimic Perl's /g option, and it is in this kind of imple-
-       mentation where \G can be useful.
-
-       Note, however, that PCRE's interpretation of \G, 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 to the starting match position, and the "anchored" flag is set
-       in the compiled regular expression.
-
-
-CIRCUMFLEX AND DOLLAR
-
-       The circumflex and dollar  metacharacters  are  zero-width  assertions.
-       That  is,  they test for a particular condition being true without con-
-       suming any characters from the subject string.
-
-       Outside a character class, in the default matching mode, the circumflex
-       character  is  an  assertion  that is true only if the current matching
-       point is at the start of the subject string. If the  startoffset  argu-
-       ment  of  pcre_exec()  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).
-
-       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 possible alternatives start with a circumflex, that  is,
-       if  the  pattern  is constrained to match only at the start of the sub-
-       ject, it is said to be an "anchored" pattern.  (There  are  also  other
-       constructs that can cause a pattern to be anchored.)
-
-       The  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 at the end of the string (by default). Note, however,
-       that it does not actually match the newline. 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.  Dol-
-       lar has no special meaning in a character class.
-
-       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.
-
-       The meanings of the circumflex and dollar characters are changed if the
-       PCRE_MULTILINE option is set. When  this  is  the  case,  a  circumflex
-       matches  immediately after internal newlines as well as at the start of
-       the subject string. It does not match after a  newline  that  ends  the
-       string.  A dollar matches before any newlines in the string, as well as
-       at the very end, when PCRE_MULTILINE is set. When newline is  specified
-       as  the  two-character  sequence CRLF, isolated CR and LF characters do
-       not indicate newlines.
-
-       For example, the pattern /^abc$/ matches the subject string  "def\nabc"
-       (where  \n  represents a newline) 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  startoffset  argument  of
-       pcre_exec()  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  end of the subject in both modes, and if all branches of a pattern
-       start with \A it is always anchored, whether or not  PCRE_MULTILINE  is
-       set.
-
-
-FULL STOP (PERIOD, DOT) AND \N
-
-       Outside a character class, a dot in the pattern matches any one charac-
-       ter in the subject string except (by default) a character  that  signi-
-       fies the end of a line.
-
-       When  a line ending is defined as a single character, dot never matches
-       that character; when the two-character sequence CRLF is used, dot  does
-       not  match  CR  if  it  is immediately followed by LF, but otherwise it
-       matches all characters (including isolated CRs and LFs). When any  Uni-
-       code  line endings are being recognized, dot does not match CR or LF or
-       any of the other line ending characters.
-
-       The behaviour of dot with regard to newlines can  be  changed.  If  the
-       PCRE_DOTALL  option  is  set,  a dot matches any one character, without
-       exception. If the two-character sequence CRLF is present in the subject
-       string, it takes two dots to match it.
-
-       The  handling of dot is entirely independent of the handling of circum-
-       flex and dollar, the only relationship being  that  they  both  involve
-       newlines. Dot has no special meaning in a character class.
-
-       The  escape  sequence  \N  behaves  like  a  dot, except that it is not
-       affected by the PCRE_DOTALL option. In  other  words,  it  matches  any
-       character  except  one that signifies the end of a line. Perl also uses
-       \N to match characters by name; PCRE does not support this.
-
-
-MATCHING A SINGLE DATA UNIT
-
-       Outside a character class, the escape sequence \C matches any one  data
-       unit,  whether or not a UTF mode is set. In the 8-bit library, one data
-       unit is one byte; in the 16-bit library it is a  16-bit  unit;  in  the
-       32-bit  library  it  is  a 32-bit unit. Unlike a dot, \C always matches
-       line-ending characters. The feature is provided in  Perl  in  order  to
-       match individual bytes in UTF-8 mode, but it is unclear how it can use-
-       fully be used. Because \C breaks up  characters  into  individual  data
-       units,  matching  one unit with \C in a UTF mode means that the rest of
-       the string may start with a malformed UTF character. This has undefined
-       results, because PCRE assumes that it is dealing with valid UTF strings
-       (and by default it checks this at the start of  processing  unless  the
-       PCRE_NO_UTF8_CHECK,  PCRE_NO_UTF16_CHECK  or PCRE_NO_UTF32_CHECK option
-       is used).
-
-       PCRE does not allow \C to appear in  lookbehind  assertions  (described
-       below)  in  a UTF mode, because this would make it impossible to calcu-
-       late the length of the lookbehind.
-
-       In general, the \C escape sequence is best avoided. However, one way of
-       using  it that avoids the problem of malformed UTF characters is to use
-       a lookahead to check the length of the next character, as in this  pat-
-       tern,  which  could be used with a UTF-8 string (ignore white space and
-       line breaks):
-
-         (?| (?=[\x00-\x7f])(\C) |
-             (?=[\x80-\x{7ff}])(\C)(\C) |
-             (?=[\x{800}-\x{ffff}])(\C)(\C)(\C) |
-             (?=[\x{10000}-\x{1fffff}])(\C)(\C)(\C)(\C))
-
-       A group that starts with (?| resets the capturing  parentheses  numbers
-       in  each  alternative  (see  "Duplicate Subpattern Numbers" below). The
-       assertions at the start of each branch check the next  UTF-8  character
-       for  values  whose encoding uses 1, 2, 3, or 4 bytes, respectively. The
-       character's individual bytes are then captured by the appropriate  num-
-       ber of groups.
-
-
-SQUARE BRACKETS AND CHARACTER CLASSES
-
-       An opening square bracket introduces a character class, terminated by a
-       closing square bracket. A closing square bracket on its own is not spe-
-       cial by default.  However, if the PCRE_JAVASCRIPT_COMPAT option is set,
-       a lone closing square bracket causes a compile-time error. If a 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.
-
-       A  character  class matches a single character in the subject. In a UTF
-       mode, the character may be more than one  data  unit  long.  A  matched
-       character must be in the set of characters defined by the class, unless
-       the first character in the class definition is a circumflex,  in  which
-       case the subject character must not be in 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.
-
-       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 that are in the class by enumerating those that are  not.  A
-       class  that starts with a circumflex is not an assertion; it still con-
-       sumes a character from the subject string, and therefore  it  fails  if
-       the current pointer is at the end of the string.
-
-       In UTF-8 (UTF-16, UTF-32) mode, characters with values greater than 255
-       (0xffff) can be included in a class as a literal string of data  units,
-       or by using the \x{ escaping mechanism.
-
-       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. In a UTF 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 in a UTF mode for characters 128 and above, you must
-       ensure that PCRE is compiled with Unicode property support as  well  as
-       with UTF support.
-
-       Characters  that  might  indicate  line breaks are never treated in any
-       special way  when  matching  character  classes,  whatever  line-ending
-       sequence  is  in  use,  and  whatever  setting  of  the PCRE_DOTALL and
-       PCRE_MULTILINE options is used. A class such as [^a] always matches one
-       of these characters.
-
-       The  minus (hyphen) character can be used to specify a range of charac-
-       ters 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, or immediately after a range. For
-       example,  [b-d-z] matches letters in the range b to d, a hyphen charac-
-       ter, or z.
-
-       It is not possible to have the literal character "]" as the end charac-
-       ter  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  inter-
-       preted  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.
-
-       An  error  is  generated  if  a POSIX character class (see below) or an
-       escape sequence other than one that defines a single character  appears
-       at  a  point  where  a range ending character is expected. For example,
-       [z-\xff] is valid, but [A-\d] and [A-[:digit:]] are not.
-
-       Ranges operate in the collating sequence of character values. They  can
-       also   be  used  for  characters  specified  numerically,  for  example
-       [\000-\037]. Ranges can include any characters that are valid  for  the
-       current mode.
-
-       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  in a non-UTF mode, if
-       character tables for a French locale are in  use,  [\xc8-\xcb]  matches
-       accented  E  characters  in both cases. In UTF modes, PCRE supports the
-       concept of case for characters with values greater than 128  only  when
-       it is compiled with Unicode property support.
-
-       The  character escape sequences \d, \D, \h, \H, \p, \P, \s, \S, \v, \V,
-       \w, and \W may appear in a character class, and add the characters that
-       they  match to the class. For example, [\dABCDEF] matches any hexadeci-
-       mal digit. In UTF modes, the PCRE_UCP option affects  the  meanings  of
-       \d,  \s,  \w  and  their upper case partners, just as it does when they
-       appear outside a character class, as described in the section  entitled
-       "Generic character types" above. The escape sequence \b has a different
-       meaning inside a character class; it matches the  backspace  character.
-       The  sequences  \B,  \N,  \R, and \X are not special inside a character
-       class. Like any other unrecognized escape sequences, they  are  treated
-       as  the literal characters "B", "N", "R", and "X" by default, but cause
-       an error if the PCRE_EXTRA option is set.
-
-       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, whereas [\w] includes underscore. A positive
-       character class should be read as "something OR something OR ..." and a
-       negative class as "NOT something AND NOT something AND NOT ...".
-
-       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, or for  a
-       special  compatibility  feature  -  see the next two sections), and the
-       terminating  closing  square  bracket.  However,  escaping  other  non-
-       alphanumeric characters does no harm.
-
-
-POSIX CHARACTER CLASSES
-
-       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,
-
-         [01[:alpha:]%]
-
-       matches "0", "1", any alphabetic character, or "%". The supported class
-       names are:
-
-         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)
-         graph    printing characters, excluding space
-         lower    lower case letters
-         print    printing characters, including space
-         punct    printing characters, excluding letters and digits and space
-         space    white space (the same as \s from PCRE 8.34)
-         upper    upper case letters
-         word     "word" characters (same as \w)
-         xdigit   hexadecimal digits
-
-       The default "space" characters are HT (9), LF (10), VT (11),  FF  (12),
-       CR  (13),  and space (32). If locale-specific matching is taking place,
-       the list of space characters may be different; there may  be  fewer  or
-       more of them. "Space" used to be different to \s, which did not include
-       VT, for Perl compatibility.  However, Perl changed at release 5.18, and
-       PCRE  followed  at release 8.34.  "Space" and \s now match the same set
-       of characters.
-
-       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,
-
-         [12[:^digit:]]
-
-       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.
-
-       By default, characters with values greater than 128 do not match any of
-       the  POSIX character classes. However, if the PCRE_UCP option is passed
-       to pcre_compile(), some of the classes  are  changed  so  that  Unicode
-       character  properties  are  used. This is achieved by replacing certain
-       POSIX classes by other sequences, as follows:
-
-         [:alnum:]  becomes  \p{Xan}
-         [:alpha:]  becomes  \p{L}
-         [:blank:]  becomes  \h
-         [:digit:]  becomes  \p{Nd}
-         [:lower:]  becomes  \p{Ll}
-         [:space:]  becomes  \p{Xps}
-         [:upper:]  becomes  \p{Lu}
-         [:word:]   becomes  \p{Xwd}
-
-       Negated versions, such as [:^alpha:] use \P instead of \p. Three  other
-       POSIX classes are handled specially in UCP mode:
-
-       [:graph:] This  matches  characters that have glyphs that mark the page
-                 when printed. In Unicode property terms, it matches all char-
-                 acters with the L, M, N, P, S, or Cf properties, except for:
-
-                   U+061C           Arabic Letter Mark
-                   U+180E           Mongolian Vowel Separator
-                   U+2066 - U+2069  Various "isolate"s
-
-
-       [:print:] This  matches  the  same  characters  as [:graph:] plus space
-                 characters that are not controls, that  is,  characters  with
-                 the Zs property.
-
-       [:punct:] This matches all characters that have the Unicode P (punctua-
-                 tion) property, plus those characters whose code  points  are
-                 less than 128 that have the S (Symbol) property.
-
-       The  other  POSIX classes are unchanged, and match only characters with
-       code points less than 128.
-
-
-COMPATIBILITY FEATURE FOR WORD BOUNDARIES
-
-       In the POSIX.2 compliant library that was included in 4.4BSD Unix,  the
-       ugly  syntax  [[:<:]]  and [[:>:]] is used for matching "start of word"
-       and "end of word". PCRE treats these items as follows:
-
-         [[:<:]]  is converted to  \b(?=\w)
-         [[:>:]]  is converted to  \b(?<=\w)
-
-       Only these exact character sequences are recognized. A sequence such as
-       [a[:<:]b]  provokes  error  for  an unrecognized POSIX class name. This
-       support is not compatible with Perl. It is provided to help  migrations
-       from other environments, and is best not used in any new patterns. Note
-       that \b matches at the start and the end of a word (see "Simple  asser-
-       tions"  above),  and in a Perl-style pattern the preceding or following
-       character normally shows which is wanted,  without  the  need  for  the
-       assertions  that  are used above in order to give exactly the POSIX be-
-       haviour.
-
-
-VERTICAL BAR
-
-       Vertical bar characters are used to separate alternative patterns.  For
-       example, the pattern
-
-         gilbert|sullivan
-
-       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.
-
-
-INTERNAL OPTION SETTING
-
-       The settings of the  PCRE_CASELESS,  PCRE_MULTILINE,  PCRE_DOTALL,  and
-       PCRE_EXTENDED  options  (which are Perl-compatible) can be changed from
-       within the pattern by  a  sequence  of  Perl  option  letters  enclosed
-       between "(?" and ")".  The option letters are
-
-         i  for PCRE_CASELESS
-         m  for PCRE_MULTILINE
-         s  for PCRE_DOTALL
-         x  for PCRE_EXTENDED
-
-       For example, (?im) sets caseless, multiline matching. It is also possi-
-       ble to unset these options by preceding the letter with a hyphen, and a
-       combined  setting and unsetting such as (?im-sx), which sets PCRE_CASE-
-       LESS 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.
-
-       The PCRE-specific options PCRE_DUPNAMES, PCRE_UNGREEDY, and  PCRE_EXTRA
-       can  be changed in the same way as the Perl-compatible options by using
-       the characters J, U and X respectively.
-
-       When one of these option changes 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 there-
-       fore show up in data extracted by the pcre_fullinfo() function).
-
-       An option change within a subpattern (see below for  a  description  of
-       subpatterns)  affects only that part of the subpattern that follows it,
-       so
-
-         (a(?i)b)c
-
-       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,
-
-         (a(?i)b|c)
-
-       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.
-
-       Note:  There  are  other  PCRE-specific  options that can be set by the
-       application when the compiling or matching  functions  are  called.  In
-       some  cases  the  pattern can contain special leading sequences such as
-       (*CRLF) to override what the application  has  set  or  what  has  been
-       defaulted.   Details   are  given  in  the  section  entitled  "Newline
-       sequences" above. There are also the  (*UTF8),  (*UTF16),(*UTF32),  and
-       (*UCP)  leading sequences that can be used to set UTF and Unicode prop-
-       erty modes; they are equivalent to setting the  PCRE_UTF8,  PCRE_UTF16,
-       PCRE_UTF32  and the PCRE_UCP options, respectively. The (*UTF) sequence
-       is a generic version that can be used with any of the  libraries.  How-
-       ever,  the  application  can set the PCRE_NEVER_UTF option, which locks
-       out the use of the (*UTF) sequences.
-
-
-SUBPATTERNS
-
-       Subpatterns are delimited by parentheses (round brackets), which can be
-       nested.  Turning part of a pattern into a subpattern does two things:
-
-       1. It localizes a set of alternatives. For example, the pattern
-
-         cat(aract|erpillar|)
-
-       matches  "cataract",  "caterpillar", or "cat". Without the parentheses,
-       it would match "cataract", "erpillar" or an empty string.
-
-       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
-       ovector  argument  of  the matching function. (This applies only to the
-       traditional matching functions; the DFA matching functions do not  sup-
-       port capturing.)
-
-       Opening parentheses are counted from left to right (starting from 1) to
-       obtain numbers for the  capturing  subpatterns.  For  example,  if  the
-       string "the red king" is matched against the pattern
-
-         the ((red|white) (king|queen))
-
-       the captured substrings are "red king", "red", and "king", and are num-
-       bered 1, 2, and 3, respectively.
-
-       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 captur-
-       ing, 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
-
-         the ((?:red|white) (king|queen))
-
-       the captured substrings are "white queen" and "queen", and are numbered
-       1 and 2. The maximum number of capturing subpatterns is 65535.
-
-       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
-
-         (?i:saturday|sunday)
-         (?:(?i)saturday|sunday)
-
-       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".
-
-
-DUPLICATE SUBPATTERN NUMBERS
-
-       Perl 5.10 introduced a feature whereby each alternative in a subpattern
-       uses the same numbers for its capturing parentheses. Such a  subpattern
-       starts  with (?| and is itself a non-capturing subpattern. For example,
-       consider this pattern:
-
-         (?|(Sat)ur|(Sun))day
-
-       Because the two alternatives are inside a (?| group, both sets of  cap-
-       turing  parentheses  are  numbered one. Thus, when the pattern matches,
-       you can look at captured substring number  one,  whichever  alternative
-       matched.  This  construct  is useful when you want to capture part, but
-       not all, of one of a number of alternatives. Inside a (?| group, paren-
-       theses  are  numbered as usual, but the number is reset at the start of
-       each branch. The numbers of any capturing parentheses that  follow  the
-       subpattern  start after the highest number used in any branch. The fol-
-       lowing example is taken from the Perl documentation. The numbers under-
-       neath show in which buffer the captured content will be stored.
-
-         # before  ---------------branch-reset----------- after
-         / ( a )  (?| x ( y ) z | (p (q) r) | (t) u (v) ) ( z ) /x
-         # 1            2         2  3        2     3     4
-
-       A  back  reference  to a numbered subpattern uses the most recent value
-       that is set for that number by any subpattern.  The  following  pattern
-       matches "abcabc" or "defdef":
-
-         /(?|(abc)|(def))\1/
-
-       In  contrast,  a subroutine call to a numbered subpattern always refers
-       to the first one in the pattern with the given  number.  The  following
-       pattern matches "abcabc" or "defabc":
-
-         /(?|(abc)|(def))(?1)/
-
-       If  a condition test for a subpattern's having matched refers to a non-
-       unique number, the test is true if any of the subpatterns of that  num-
-       ber have matched.
-
-       An  alternative approach to using this "branch reset" feature is to use
-       duplicate named subpatterns, as described in the next section.
-
-
-NAMED SUBPATTERNS
-
-       Identifying capturing parentheses by number is simple, but  it  can  be
-       very  hard  to keep track of the numbers in complicated regular expres-
-       sions. Furthermore, if an  expression  is  modified,  the  numbers  may
-       change.  To help with this difficulty, PCRE supports the naming of sub-
-       patterns. This feature was not added to Perl until release 5.10. Python
-       had  the  feature earlier, and PCRE introduced it at release 4.0, using
-       the Python syntax. PCRE now supports both the Perl and the Python  syn-
-       tax.  Perl  allows  identically  numbered subpatterns to have different
-       names, but PCRE does not.
-
-       In PCRE, a subpattern can be named in one of three  ways:  (?<name>...)
-       or  (?'name'...)  as in Perl, or (?P<name>...) as in Python. References
-       to capturing parentheses from other parts of the pattern, such as  back
-       references,  recursion,  and conditions, can be made by name as well as
-       by number.
-
-       Names consist of up to 32 alphanumeric characters and underscores,  but
-       must  start  with  a  non-digit.  Named capturing parentheses are still
-       allocated numbers as well as names, exactly as if the  names  were  not
-       present.  The PCRE API provides function calls for extracting the name-
-       to-number translation table from a compiled pattern. There  is  also  a
-       convenience function for extracting a captured substring by name.
-
-       By  default, a name must be unique within a pattern, but it is possible
-       to relax this constraint by setting the PCRE_DUPNAMES option at compile
-       time.  (Duplicate  names are also always permitted for subpatterns with
-       the same number, set up as described in the previous  section.)  Dupli-
-       cate  names  can  be useful for patterns where only one instance of the
-       named parentheses can match. Suppose you want to match the  name  of  a
-       weekday,  either as a 3-letter abbreviation or as the full name, and in
-       both cases you want to extract the abbreviation. This pattern (ignoring
-       the line breaks) does the job:
-
-         (?<DN>Mon|Fri|Sun)(?:day)?|
-         (?<DN>Tue)(?:sday)?|
-         (?<DN>Wed)(?:nesday)?|
-         (?<DN>Thu)(?:rsday)?|
-         (?<DN>Sat)(?:urday)?
-
-       There  are  five capturing substrings, but only one is ever set after a
-       match.  (An alternative way of solving this problem is to use a "branch
-       reset" subpattern, as described in the previous section.)
-
-       The  convenience  function  for extracting the data by name returns the
-       substring for the first (and in this example, the only)  subpattern  of
-       that  name  that  matched.  This saves searching to find which numbered
-       subpattern it was.
-
-       If you make a back reference to  a  non-unique  named  subpattern  from
-       elsewhere  in the pattern, the subpatterns to which the name refers are
-       checked in the order in which they appear in the overall  pattern.  The
-       first one that is set is used for the reference. For example, this pat-
-       tern matches both "foofoo" and "barbar" but not "foobar" or "barfoo":
-
-         (?:(?<n>foo)|(?<n>bar))\k<n>
-
-
-       If you make a subroutine call to a non-unique named subpattern, the one
-       that  corresponds  to  the first occurrence of the name is used. In the
-       absence of duplicate numbers (see the previous section) this is the one
-       with the lowest number.
-
-       If you use a named reference in a condition test (see the section about
-       conditions below), either to check whether a subpattern has matched, or
-       to  check for recursion, all subpatterns with the same name are tested.
-       If the condition is true for any one of them, the overall condition  is
-       true.  This  is  the  same  behaviour as testing by number. For further
-       details of the interfaces  for  handling  named  subpatterns,  see  the
-       pcreapi documentation.
-
-       Warning: You cannot use different names to distinguish between two sub-
-       patterns with the same number because PCRE uses only the  numbers  when
-       matching. For this reason, an error is given at compile time if differ-
-       ent names are given to subpatterns with the same number.  However,  you
-       can always give the same name to subpatterns with the same number, even
-       when PCRE_DUPNAMES is not set.
-
-
-REPETITION
-
-       Repetition is specified by quantifiers, which can  follow  any  of  the
-       following items:
-
-         a literal data character
-         the dot metacharacter
-         the \C escape sequence
-         the \X escape sequence
-         the \R escape sequence
-         an escape such as \d or \pL that matches a single character
-         a character class
-         a back reference (see next section)
-         a parenthesized subpattern (including assertions)
-         a subroutine call to a subpattern (recursive or otherwise)
-
-       The  general repetition quantifier specifies a minimum and maximum num-
-       ber 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:
-
-         z{2,4}
-
-       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
-
-         [aeiou]{3,}
-
-       matches at least 3 successive vowels, but may match many more, while
-
-         \d{8}
-
-       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  exam-
-       ple, {,6} is not a quantifier, but a literal string of four characters.
-
-       In UTF modes, quantifiers apply to characters rather than to individual
-       data units. Thus, for example, \x{100}{2} matches two characters,  each
-       of which is represented by a two-byte sequence in a UTF-8 string. Simi-
-       larly, \X{3} matches three Unicode extended grapheme clusters, each  of
-       which  may  be  several  data  units long (and they may be of different
-       lengths).
-
-       The quantifier {0} is permitted, causing the expression to behave as if
-       the previous item and the quantifier were not present. This may be use-
-       ful for subpatterns that are referenced as subroutines  from  elsewhere
-       in the pattern (but see also the section entitled "Defining subpatterns
-       for use by reference only" below). Items other  than  subpatterns  that
-       have a {0} quantifier are omitted from the compiled pattern.
-
-       For  convenience, the three most common quantifiers have single-charac-
-       ter abbreviations:
-
-         *    is equivalent to {0,}
-         +    is equivalent to {1,}
-         ?    is equivalent to {0,1}
-
-       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:
-
-         (a?)*
-
-       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 bro-
-       ken.
-
-       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 /* and */ and within the comment,  individual  *  and  /
-       characters  may  appear. An attempt to match C comments by applying the
-       pattern
-
-         /\*.*\*/
-
-       to the string
-
-         /* first comment */  not comment  /* second comment */
-
-       fails, because it matches the entire string owing to the greediness  of
-       the .*  item.
-
-       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
-
-         /\*.*?\*/
-
-       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
-
-       which matches one digit by preference, but can match two if that is the
-       only way the rest of the pattern matches.
-
-       If the PCRE_UNGREEDY option is set (an option that 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.
-
-       When  a  parenthesized  subpattern  is quantified with a minimum repeat
-       count that 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.
-
-       If a pattern starts with .* or .{0,} and the PCRE_DOTALL option (equiv-
-       alent  to  Perl's  /s) is set, thus allowing the dot 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.
-
-       In cases where it is known that the subject  string  contains  no  new-
-       lines,  it  is  worth setting PCRE_DOTALL in order to obtain this opti-
-       mization, or alternatively using ^ to indicate anchoring explicitly.
-
-       However, there are some cases where the optimization  cannot  be  used.
-       When .*  is inside capturing parentheses that are the subject of a back
-       reference elsewhere in the pattern, a match at the start may fail where
-       a later one succeeds. Consider, for example:
-
-         (.*)abc\1
-
-       If  the subject is "xyz123abc123" the match point is the fourth charac-
-       ter. For this reason, such a pattern is not implicitly anchored.
-
-       Another case where implicit anchoring is not applied is when the  lead-
-       ing  .* is inside an atomic group. Once again, a match at the start may
-       fail where a later one succeeds. Consider this pattern:
-
-         (?>.*?a)b
-
-       It matches "ab" in the subject "aab". The use of the backtracking  con-
-       trol verbs (*PRUNE) and (*SKIP) also disable this optimization.
-
-       When a capturing subpattern is repeated, the value captured is the sub-
-       string that matched the final iteration. For example, after
-
-         (tweedle[dume]{3}\s*)+
-
-       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  itera-
-       tions. For example, after
-
-         /(a|(b))+/
-
-       matches "aba" the value of the second captured substring is "b".
-
-
-ATOMIC GROUPING AND POSSESSIVE QUANTIFIERS
-
-       With  both  maximizing ("greedy") and minimizing ("ungreedy" or "lazy")
-       repetition, failure of what follows normally causes the  repeated  item
-       to  be  re-evaluated to see if a different number of repeats allows the
-       rest of the pattern to match. Sometimes it is 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
-
-         123456bar
-
-       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+ 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.
-
-       If  we  use atomic grouping for the previous example, the matcher gives
-       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+)foo
-
-       This  kind  of  parenthesis "locks up" the  part of the pattern it con-
-       tains 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.
-
-       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.
-
-       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  pre-
-       pared  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.
-
-       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++foo
-
-       Note that a possessive quantifier can be used with an entire group, for
-       example:
-
-         (abc|xyz){2,3}+
-
-       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 of a possessive quantifier and  the  equivalent  atomic  group,
-       though  there  may  be a performance difference; possessive quantifiers
-       should be slightly faster.
-
-       The possessive quantifier syntax is an extension to the Perl  5.8  syn-
-       tax.   Jeffrey  Friedl  originated the idea (and the name) in the first
-       edition of his book. Mike McCloskey liked it, so implemented it when he
-       built  Sun's Java package, and PCRE copied it from there. It ultimately
-       found its way into Perl at release 5.10.
-
-       PCRE has an optimization that automatically "possessifies" certain sim-
-       ple  pattern  constructs.  For  example, the sequence A+B is treated as
-       A++B because there is no point in backtracking into a sequence  of  A's
-       when B must follow.
-
-       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+>)*[!?]
-
-       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
-
-         aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-
-       it takes a long time before reporting  failure.  This  is  because  the
-       string  can be divided between the internal \D+ 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 charac-
-       ter 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:
-
-         ((?>\D+)|<\d+>)*[!?]
-
-       sequences of non-digits cannot be broken, and failure happens quickly.
-
-
-BACK REFERENCES
-
-       Outside a character class, a backslash followed by a digit greater than
-       0 (and possibly further digits) is a back reference to a capturing sub-
-       pattern earlier (that is, to its left) in the pattern,  provided  there
-       have been that many previous capturing left parentheses.
-
-       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 pat-
-       tern. In other words, the parentheses that are referenced need  not  be
-       to  the left of the reference for numbers less than 10. A "forward back
-       reference" of this type can make sense when a  repetition  is  involved
-       and  the  subpattern to the right has participated in an earlier itera-
-       tion.
-
-       It is not possible to have a numerical "forward back  reference"  to  a
-       subpattern  whose  number  is  10  or  more using this syntax because a
-       sequence such as \50 is interpreted as a character  defined  in  octal.
-       See the subsection entitled "Non-printing characters" above for further
-       details of the handling of digits following a backslash.  There  is  no
-       such  problem  when named parentheses are used. A back reference to any
-       subpattern is possible using named parentheses (see below).
-
-       Another way of avoiding the ambiguity inherent in  the  use  of  digits
-       following  a  backslash  is  to use the \g escape sequence. This escape
-       must be followed by an unsigned number or a negative number, optionally
-       enclosed in braces. These examples are all identical:
-
-         (ring), \1
-         (ring), \g1
-         (ring), \g{1}
-
-       An  unsigned number specifies an absolute reference without the ambigu-
-       ity that is present in the older syntax. It is also useful when literal
-       digits follow the reference. A negative number is a relative reference.
-       Consider this example:
-
-         (abc(def)ghi)\g{-1}
-
-       The sequence \g{-1} is a reference to the most recently started captur-
-       ing subpattern before \g, that is, is it equivalent to \2 in this exam-
-       ple.  Similarly, \g{-2} would be equivalent to \1. The use of  relative
-       references  can  be helpful in long patterns, and also in patterns that
-       are created by  joining  together  fragments  that  contain  references
-       within themselves.
-
-       A  back  reference matches whatever actually matched the capturing sub-
-       pattern in the current subject string, rather  than  anything  matching
-       the subpattern itself (see "Subpatterns as subroutines" below for a way
-       of doing that). So the pattern
-
-         (sens|respons)e and \1ibility
-
-       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  exam-
-       ple,
-
-         ((?i)rah)\s+\1
-
-       matches  "rah  rah"  and  "RAH RAH", but not "RAH rah", even though the
-       original capturing subpattern is matched caselessly.
-
-       There are several different ways of writing back  references  to  named
-       subpatterns.  The  .NET syntax \k{name} and the Perl syntax \k<name> or
-       \k'name' are supported, as is the Python syntax (?P=name). Perl  5.10's
-       unified back reference syntax, in which \g can be used for both numeric
-       and named references, is also supported. We  could  rewrite  the  above
-       example in any of the following ways:
-
-         (?<p1>(?i)rah)\s+\k<p1>
-         (?'p1'(?i)rah)\s+\k{p1}
-         (?P<p1>(?i)rah)\s+(?P=p1)
-         (?<p1>(?i)rah)\s+\g{p1}
-
-       A  subpattern  that  is  referenced  by  name may appear in the pattern
-       before or after the reference.
-
-       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 by default. For example, the pattern
-
-         (a|(bc))\2
-
-       always fails if it starts to match "a" rather than  "bc".  However,  if
-       the PCRE_JAVASCRIPT_COMPAT option is set at compile time, a back refer-
-       ence to an unset value matches an empty string.
-
-       Because there may be many capturing parentheses in a pattern, all  dig-
-       its  following a backslash are taken as part of a potential back refer-
-       ence 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 white  space.  Otherwise,  the
-       \g{ syntax or an empty comment (see "Comments" below) can be used.
-
-   Recursive back references
-
-       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.   However,  such references can be useful inside repeated sub-
-       patterns. For example, the pattern
-
-         (a|b\1)+
-
-       matches any number of "a"s and also "aba", "ababbaa" etc. At each iter-
-       ation  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.
-
-       Back  references of this type cause the group that they reference to be
-       treated as an atomic group.  Once the whole group has been  matched,  a
-       subsequent  matching  failure cannot cause backtracking into the middle
-       of the group.
-
-
-ASSERTIONS
-
-       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.
-
-       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.
-
-       Assertion  subpatterns are not capturing subpatterns. If such an asser-
-       tion contains capturing subpatterns within it, these  are  counted  for
-       the  purposes  of numbering the capturing subpatterns in the whole pat-
-       tern. However, substring capturing is carried  out  only  for  positive
-       assertions. (Perl sometimes, but not always, does do capturing in nega-
-       tive assertions.)
-
-       For compatibility with Perl, assertion  subpatterns  may  be  repeated;
-       though  it  makes  no sense to assert the same thing several times, the
-       side effect of capturing parentheses may  occasionally  be  useful.  In
-       practice, there only three cases:
-
-       (1)  If  the  quantifier  is  {0}, the assertion is never obeyed during
-       matching.  However, it may  contain  internal  capturing  parenthesized
-       groups that are called from elsewhere via the subroutine mechanism.
-
-       (2)  If quantifier is {0,n} where n is greater than zero, it is treated
-       as if it were {0,1}. At run time, the rest  of  the  pattern  match  is
-       tried with and without the assertion, the order depending on the greed-
-       iness of the quantifier.
-
-       (3) If the minimum repetition is greater than zero, the  quantifier  is
-       ignored.   The  assertion  is  obeyed just once when encountered during
-       matching.
-
-   Lookahead assertions
-
-       Lookahead assertions start with (?= for positive assertions and (?! for
-       negative assertions. For example,
-
-         \w+(?=;)
-
-       matches  a word followed by a semicolon, but does not include the semi-
-       colon in the match, and
-
-         foo(?!bar)
-
-       matches any occurrence of "foo" that is not  followed  by  "bar".  Note
-       that the apparently similar pattern
-
-         (?!foo)bar
-
-       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 the other effect.
-
-       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.  The backtracking control verb (*FAIL) or (*F)
-       is a synonym for (?!).
-
-   Lookbehind assertions
-
-       Lookbehind assertions start with (?<= for positive assertions and  (?<!
-       for negative assertions. For example,
-
-         (?<!foo)bar
-
-       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 sev-
-       eral top-level alternatives, they do not all  have  to  have  the  same
-       fixed length. Thus
-
-         (?<=bullock|donkey)
-
-       is permitted, but
-
-         (?<!dogs?|cats?)
-
-       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, which requires all branches to
-       match the same length of string. An assertion such as
-
-         (?<=ab(c|de))
-
-       is not permitted, because its single top-level  branch  can  match  two
-       different lengths, but it is acceptable to PCRE if rewritten to use two
-       top-level branches:
-
-         (?<=abc|abde)
-
-       In some cases, the escape sequence \K (see above) can be  used  instead
-       of a lookbehind assertion to get round the fixed-length restriction.
-
-       The  implementation  of lookbehind assertions is, for each alternative,
-       to temporarily move the current position back by the fixed  length  and
-       then try to match. If there are insufficient characters before the cur-
-       rent position, the assertion fails.
-
-       In a UTF mode, PCRE does not allow the \C escape (which matches a  sin-
-       gle  data  unit even in a UTF mode) to appear in lookbehind assertions,
-       because it makes it impossible to calculate the length of  the  lookbe-
-       hind.  The \X and \R escapes, which can match different numbers of data
-       units, are also not permitted.
-
-       "Subroutine" calls (see below) such as (?2) or (?&X) are  permitted  in
-       lookbehinds,  as  long as the subpattern matches a fixed-length string.
-       Recursion, however, is not supported.
-
-       Possessive quantifiers can  be  used  in  conjunction  with  lookbehind
-       assertions to specify efficient matching of fixed-length strings at the
-       end of subject strings. Consider a simple pattern such as
-
-         abcd$
-
-       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
-
-         ^.*abcd$
-
-       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
-
-         ^.*+(?<=abcd)
-
-       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.
-
-   Using multiple assertions
-
-       Several assertions (of any sort) may occur in succession. For example,
-
-         (?<=\d{3})(?<!999)foo
-
-       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 not match "foo" pre-
-       ceded by six characters, the first of which are  digits  and  the  last
-       three  of  which  are not "999". For example, it doesn't match "123abc-
-       foo". A pattern to do that is
-
-         (?<=\d{3}...)(?<!999)foo
-
-       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".
-
-       Assertions can be nested in any combination. For example,
-
-         (?<=(?<!foo)bar)baz
-
-       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 that matches "foo" preceded by three digits and any
-       three characters that are not "999".
-
-
-CONDITIONAL SUBPATTERNS
-
-       It is possible to cause the matching process to obey a subpattern  con-
-       ditionally  or to choose between two alternative subpatterns, depending
-       on the result of an assertion, or whether a specific capturing  subpat-
-       tern  has  already  been matched. The two possible forms of conditional
-       subpattern are:
-
-         (?(condition)yes-pattern)
-         (?(condition)yes-pattern|no-pattern)
-
-       If the condition is satisfied, the yes-pattern is used;  otherwise  the
-       no-pattern  (if  present)  is used. If there are more than two alterna-
-       tives in the subpattern, a compile-time error occurs. Each of  the  two
-       alternatives may itself contain nested subpatterns of any form, includ-
-       ing  conditional  subpatterns;  the  restriction  to  two  alternatives
-       applies only at the level of the condition. This pattern fragment is an
-       example where the alternatives are complex:
-
-         (?(1) (A|B|C) | (D | (?(2)E|F) | E) )
-
-
-       There are four kinds of condition: references  to  subpatterns,  refer-
-       ences to recursion, a pseudo-condition called DEFINE, and assertions.
-
-   Checking for a used subpattern by number
-
-       If  the  text between the parentheses consists of a sequence of digits,
-       the condition is true if a capturing subpattern of that number has pre-
-       viously  matched.  If  there is more than one capturing subpattern with
-       the same number (see the earlier  section  about  duplicate  subpattern
-       numbers),  the condition is true if any of them have matched. An alter-
-       native notation is to precede the digits with a plus or minus sign.  In
-       this  case, the subpattern number is relative rather than absolute. The
-       most recently opened parentheses can be referenced by (?(-1), the  next
-       most  recent  by (?(-2), and so on. Inside loops it can also make sense
-       to refer to subsequent groups. The next parentheses to be opened can be
-       referenced  as (?(+1), and so on. (The value zero in any of these forms
-       is not used; it provokes a compile-time error.)
-
-       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) \) )
-
-       The first part matches an optional opening  parenthesis,  and  if  that
-       character is present, sets it as the first captured substring. The sec-
-       ond part matches one or more characters that are not  parentheses.  The
-       third  part  is  a conditional subpattern that tests whether or not the
-       first set of parentheses matched. If they  did,  that  is,  if  subject
-       started  with an opening parenthesis, the condition is true, and so the
-       yes-pattern is executed and a closing parenthesis is  required.  Other-
-       wise,  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.
-
-       If  you  were  embedding  this pattern in a larger one, you could use a
-       relative reference:
-
-         ...other stuff... ( \( )?    [^()]+    (?(-1) \) ) ...
-
-       This makes the fragment independent of the parentheses  in  the  larger
-       pattern.
-
-   Checking for a used subpattern by name
-
-       Perl  uses  the  syntax  (?(<name>)...) or (?('name')...) to test for a
-       used subpattern by name. For compatibility  with  earlier  versions  of
-       PCRE,  which  had this facility before Perl, the syntax (?(name)...) is
-       also recognized.
-
-       Rewriting the above example to use a named subpattern gives this:
-
-         (?<OPEN> \( )?    [^()]+    (?(<OPEN>) \) )
-
-       If the name used in a condition of this kind is a duplicate,  the  test
-       is  applied to all subpatterns of the same name, and is true if any one
-       of them has matched.
-
-   Checking for pattern recursion
-
-       If the condition is the string (R), and there is no subpattern with the
-       name  R, the condition is true if a recursive call to the whole pattern
-       or any subpattern has been made. If digits or a name preceded by amper-
-       sand follow the letter R, for example:
-
-         (?(R3)...) or (?(R&name)...)
-
-       the condition is true if the most recent recursion is into a subpattern
-       whose number or name is given. This condition does not check the entire
-       recursion  stack.  If  the  name  used in a condition of this kind is a
-       duplicate, the test is applied to all subpatterns of the same name, and
-       is true if any one of them is the most recent recursion.
-
-       At  "top  level",  all  these recursion test conditions are false.  The
-       syntax for recursive patterns is described below.
-
-   Defining subpatterns for use by reference only
-
-       If the condition is the string (DEFINE), and  there  is  no  subpattern
-       with  the  name  DEFINE,  the  condition is always false. In this case,
-       there may be only one alternative  in  the  subpattern.  It  is  always
-       skipped  if  control  reaches  this  point  in the pattern; the idea of
-       DEFINE is that it can be used to define subroutines that can be  refer-
-       enced  from elsewhere. (The use of subroutines is described below.) For
-       example, a pattern to match an IPv4 address  such  as  "192.168.23.245"
-       could be written like this (ignore white space and line breaks):
-
-         (?(DEFINE) (?<byte> 2[0-4]\d | 25[0-5] | 1\d\d | [1-9]?\d) )
-         \b (?&byte) (\.(?&byte)){3} \b
-
-       The  first part of the pattern is a DEFINE group inside which a another
-       group named "byte" is defined. This matches an individual component  of
-       an  IPv4  address  (a number less than 256). When matching takes place,
-       this part of the pattern is skipped because DEFINE acts  like  a  false
-       condition.  The  rest of the pattern uses references to the named group
-       to match the four dot-separated components of an IPv4 address,  insist-
-       ing on a word boundary at each end.
-
-   Assertion conditions
-
-       If  the  condition  is  not  in any of the above formats, 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:
-
-         (?(?=[^a-z]*[a-z])
-         \d{2}-[a-z]{3}-\d{2}  |  \d{2}-\d{2}-\d{2} )
-
-       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.
-
-
-COMMENTS
-
-       There are two ways of including comments in patterns that are processed
-       by PCRE. In both cases, the start of the comment must not be in a char-
-       acter class, nor in the middle of any other sequence of related charac-
-       ters  such  as  (?: or a subpattern name or number. The characters that
-       make up a comment play no part in the pattern matching.
-
-       The sequence (?# marks the start of a comment that continues up to  the
-       next  closing parenthesis. Nested parentheses are not permitted. If the
-       PCRE_EXTENDED option is set, an unescaped # character also introduces a
-       comment,  which  in  this  case continues to immediately after the next
-       newline character or character sequence in the pattern.  Which  charac-
-       ters are interpreted as newlines is controlled by the options passed to
-       a compiling function or by a special sequence at the start of the  pat-
-       tern, as described in the section entitled "Newline conventions" above.
-       Note that the end of this type of comment is a literal newline sequence
-       in  the pattern; escape sequences that happen to represent a newline do
-       not count. For example, consider this  pattern  when  PCRE_EXTENDED  is
-       set, and the default newline convention is in force:
-
-         abc #comment \n still comment
-
-       On  encountering  the  # character, pcre_compile() skips along, looking
-       for a newline in the pattern. The sequence \n is still literal at  this
-       stage,  so  it does not terminate the comment. Only an actual character
-       with the code value 0x0a (the default newline) does so.
-
-
-RECURSIVE PATTERNS
-
-       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.
-
-       For some time, Perl has provided a facility that allows regular expres-
-       sions  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 using code interpolation to solve the
-       parentheses problem can be created like this:
-
-         $re = qr{\( (?: (?>[^()]+) | (?p{$re}) )* \)}x;
-
-       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 special syntax for recursion of  the  entire  pattern,  and
-       also  for  individual  subpattern  recursion. After its introduction in
-       PCRE and Python, this kind of  recursion  was  subsequently  introduced
-       into Perl at release 5.10.
-
-       A  special  item  that consists of (? followed by a number greater than
-       zero and a closing parenthesis is a recursive subroutine  call  of  the
-       subpattern  of  the  given  number, provided that it occurs inside that
-       subpattern. (If not, it is a non-recursive subroutine  call,  which  is
-       described  in  the  next  section.)  The special item (?R) or (?0) is a
-       recursive call of the entire regular expression.
-
-       This PCRE pattern solves the nested  parentheses  problem  (assume  the
-       PCRE_EXTENDED option is set so that white space is ignored):
-
-         \( ( [^()]++ | (?R) )* \)
-
-       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 parenthe-
-       sized substring).  Finally there is a closing parenthesis. Note the use
-       of a possessive quantifier to avoid backtracking into sequences of non-
-       parentheses.
-
-       If this were part of a larger pattern, you would not  want  to  recurse
-       the entire pattern, so instead you could use this:
-
-         ( \( ( [^()]++ | (?1) )* \) )
-
-       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.  This is made easier by the use of relative references. Instead
-       of (?1) in the pattern above you can write (?-2) to refer to the second
-       most  recently  opened  parentheses  preceding  the recursion. In other
-       words, a negative number counts capturing  parentheses  leftwards  from
-       the point at which it is encountered.
-
-       It  is  also  possible  to refer to subsequently opened parentheses, by
-       writing references such as (?+2). However, these  cannot  be  recursive
-       because  the  reference  is  not inside the parentheses that are refer-
-       enced. They are always non-recursive subroutine calls, as described  in
-       the next section.
-
-       An  alternative  approach is to use named parentheses instead. The Perl
-       syntax for this is (?&name); PCRE's earlier syntax  (?P>name)  is  also
-       supported. We could rewrite the above example as follows:
-
-         (?<pn> \( ( [^()]++ | (?&pn) )* \) )
-
-       If  there  is more than one subpattern with the same name, the earliest
-       one is used.
-
-       This particular example pattern that we have been looking  at  contains
-       nested unlimited repeats, and so the use of a possessive quantifier for
-       matching strings of non-parentheses is important when applying the pat-
-       tern  to  strings  that do not match. For example, when this pattern is
-       applied to
-
-         (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()
-
-       it yields "no match" quickly. However, if a  possessive  quantifier  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.
-
-       At  the  end  of a match, the values of capturing parentheses are those
-       from the outermost level. If you want to obtain intermediate values,  a
-       callout  function can be used (see below and the pcrecallout documenta-
-       tion). If the pattern above is matched against
-
-         (ab(cd)ef)
-
-       the value for the inner capturing parentheses  (numbered  2)  is  "ef",
-       which  is the last value taken on at the top level. If a capturing sub-
-       pattern is not matched at the top level, its final  captured  value  is
-       unset,  even  if  it was (temporarily) set at a deeper level during the
-       matching process.
-
-       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 pcre_malloc, freeing it via pcre_free afterwards. If no memory
-       can be obtained, the match fails with the PCRE_ERROR_NOMEMORY error.
-
-       Do  not  confuse  the (?R) item with the condition (R), which tests for
-       recursion.  Consider this pattern, which matches text in  angle  brack-
-       ets,  allowing for arbitrary nesting. Only digits are allowed in nested
-       brackets (that is, when recursing), whereas any characters are  permit-
-       ted at the outer level.
-
-         < (?: (?(R) \d++  | [^<>]*+) | (?R)) * >
-
-       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.
-
-   Differences in recursion processing between PCRE and Perl
-
-       Recursion  processing  in PCRE differs from Perl in two important ways.
-       In PCRE (like Python, but unlike Perl), a recursive subpattern call  is
-       always treated as an atomic group. That is, once it has matched some of
-       the subject string, it is never re-entered, even if it contains untried
-       alternatives  and  there  is a subsequent matching failure. This can be
-       illustrated by the following pattern, which purports to match a  palin-
-       dromic  string  that contains an odd number of characters (for example,
-       "a", "aba", "abcba", "abcdcba"):
-
-         ^(.|(.)(?1)\2)$
-
-       The idea is that it either matches a single character, or two identical
-       characters  surrounding  a sub-palindrome. In Perl, this pattern works;
-       in PCRE it does not if the pattern is  longer  than  three  characters.
-       Consider the subject string "abcba":
-
-       At  the  top level, the first character is matched, but as it is not at
-       the end of the string, the first alternative fails; the second alterna-
-       tive is taken and the recursion kicks in. The recursive call to subpat-
-       tern 1 successfully matches the next character ("b").  (Note  that  the
-       beginning and end of line tests are not part of the recursion).
-
-       Back  at  the top level, the next character ("c") is compared with what
-       subpattern 2 matched, which was "a". This fails. Because the  recursion
-       is  treated  as  an atomic group, there are now no backtracking points,
-       and so the entire match fails. (Perl is able, at  this  point,  to  re-
-       enter  the  recursion  and try the second alternative.) However, if the
-       pattern is written with the alternatives in the other order, things are
-       different:
-
-         ^((.)(?1)\2|.)$
-
-       This  time,  the recursing alternative is tried first, and continues to
-       recurse until it runs out of characters, at which point  the  recursion
-       fails.  But  this  time  we  do  have another alternative to try at the
-       higher level. That is the big difference:  in  the  previous  case  the
-       remaining alternative is at a deeper recursion level, which PCRE cannot
-       use.
-
-       To change the pattern so that it matches all palindromic  strings,  not
-       just  those  with an odd number of characters, it is tempting to change
-       the pattern to this:
-
-         ^((.)(?1)\2|.?)$
-
-       Again, this works in Perl, but not in PCRE, and for  the  same  reason.
-       When  a  deeper  recursion has matched a single character, it cannot be
-       entered again in order to match an empty string.  The  solution  is  to
-       separate  the two cases, and write out the odd and even cases as alter-
-       natives at the higher level:
-
-         ^(?:((.)(?1)\2|)|((.)(?3)\4|.))
-
-       If you want to match typical palindromic phrases, the  pattern  has  to
-       ignore all non-word characters, which can be done like this:
-
-         ^\W*+(?:((.)\W*+(?1)\W*+\2|)|((.)\W*+(?3)\W*+\4|\W*+.\W*+))\W*+$
-
-       If run with the PCRE_CASELESS option, this pattern matches phrases such
-       as "A man, a plan, a canal: Panama!" and it works well in both PCRE and
-       Perl.  Note the use of the possessive quantifier *+ to avoid backtrack-
-       ing into sequences of non-word characters. Without this, PCRE  takes  a
-       great  deal  longer  (ten  times or more) to match typical phrases, and
-       Perl takes so long that you think it has gone into a loop.
-
-       WARNING: The palindrome-matching patterns above work only if  the  sub-
-       ject  string  does not start with a palindrome that is shorter than the
-       entire string.  For example, although "abcba" is correctly matched,  if
-       the  subject  is "ababa", PCRE finds the palindrome "aba" at the start,
-       then fails at top level because the end of the string does not  follow.
-       Once  again, it cannot jump back into the recursion to try other alter-
-       natives, so the entire match fails.
-
-       The second way in which PCRE and Perl differ in  their  recursion  pro-
-       cessing  is in the handling of captured values. In Perl, when a subpat-
-       tern is called recursively or as a subpattern (see the  next  section),
-       it  has  no  access to any values that were captured outside the recur-
-       sion, whereas in PCRE these values can  be  referenced.  Consider  this
-       pattern:
-
-         ^(.)(\1|a(?2))
-
-       In  PCRE,  this  pattern matches "bab". The first capturing parentheses
-       match "b", then in the second group, when the back reference  \1  fails
-       to  match "b", the second alternative matches "a" and then recurses. In
-       the recursion, \1 does now match "b" and so the whole  match  succeeds.
-       In  Perl,  the pattern fails to match because inside the recursive call
-       \1 cannot access the externally set value.
-
-
-SUBPATTERNS AS SUBROUTINES
-
-       If the syntax for a recursive subpattern call (either by number  or  by
-       name)  is  used outside the parentheses to which it refers, it operates
-       like a subroutine in a programming language. The called subpattern  may
-       be  defined  before or after the reference. A numbered reference can be
-       absolute or relative, as in these examples:
-
-         (...(absolute)...)...(?2)...
-         (...(relative)...)...(?-1)...
-         (...(?+1)...(relative)...
-
-       An earlier example pointed out that the pattern
-
-         (sens|respons)e and \1ibility
-
-       matches "sense and sensibility" and "response and responsibility",  but
-       not "sense and responsibility". If instead the pattern
-
-         (sens|respons)e and (?1)ibility
-
-       is  used, it does match "sense and responsibility" as well as the other
-       two strings. Another example is  given  in  the  discussion  of  DEFINE
-       above.
-
-       All  subroutine  calls, whether recursive or not, are always treated as
-       atomic groups. That is, once a subroutine has matched some of the  sub-
-       ject string, it is never re-entered, even if it contains untried alter-
-       natives and there is  a  subsequent  matching  failure.  Any  capturing
-       parentheses  that  are  set  during the subroutine call revert to their
-       previous values afterwards.
-
-       Processing options such as case-independence are fixed when  a  subpat-
-       tern  is defined, so if it is used as a subroutine, such options cannot
-       be changed for different calls. For example, consider this pattern:
-
-         (abc)(?i:(?-1))
-
-       It matches "abcabc". It does not match "abcABC" because the  change  of
-       processing option does not affect the called subpattern.
-
-
-ONIGURUMA SUBROUTINE SYNTAX
-
-       For  compatibility with Oniguruma, the non-Perl syntax \g followed by a
-       name or a number enclosed either in angle brackets or single quotes, is
-       an  alternative  syntax  for  referencing a subpattern as a subroutine,
-       possibly recursively. Here are two of the examples used above,  rewrit-
-       ten using this syntax:
-
-         (?<pn> \( ( (?>[^()]+) | \g<pn> )* \) )
-         (sens|respons)e and \g'1'ibility
-
-       PCRE  supports  an extension to Oniguruma: if a number is preceded by a
-       plus or a minus sign it is taken as a relative reference. For example:
-
-         (abc)(?i:\g<-1>)
-
-       Note that \g{...} (Perl syntax) and \g<...> (Oniguruma syntax) are  not
-       synonymous.  The former is a back reference; the latter is a subroutine
-       call.
-
-
-CALLOUTS
-
-       Perl has a feature whereby using the sequence (?{...}) causes arbitrary
-       Perl  code to be obeyed in the middle of matching a regular expression.
-       This makes it possible, amongst other things, to extract different sub-
-       strings that match the same pair of parentheses when there is a repeti-
-       tion.
-
-       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
-       pcre_callout  (8-bit  library) or pcre[16|32]_callout (16-bit or 32-bit
-       library).  By default, this variable contains NULL, which disables  all
-       calling out.
-
-       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:
-
-         (?C1)abc(?C2)def
-
-       If  the PCRE_AUTO_CALLOUT flag is passed to a compiling function, call-
-       outs are automatically installed before each item in the pattern.  They
-       are  all  numbered  255. If there is a conditional group in the pattern
-       whose condition is an assertion, an additional callout is inserted just
-       before the condition. An explicit callout may also be set at this posi-
-       tion, as in this example:
-
-         (?(?C9)(?=a)abc|def)
-
-       Note that this applies only to assertion conditions, not to other types
-       of condition.
-
-       During  matching, when PCRE reaches a callout point, the external func-
-       tion is called. It is provided with the  number  of  the  callout,  the
-       position  in  the pattern, and, optionally, one item of data originally
-       supplied by the caller of the matching function. The  callout  function
-       may cause matching to proceed, to backtrack, or to fail altogether.
-
-       By  default,  PCRE implements a number of optimizations at compile time
-       and matching time, and one side-effect is that sometimes  callouts  are
-       skipped.  If  you need all possible callouts to happen, you need to set
-       options that disable the relevant optimizations. More  details,  and  a
-       complete  description  of  the  interface  to the callout function, are
-       given in the pcrecallout documentation.
-
-
-BACKTRACKING CONTROL
-
-       Perl 5.10 introduced a number of "Special Backtracking Control  Verbs",
-       which  are  still  described in the Perl documentation as "experimental
-       and subject to change or removal in a future version of Perl". It  goes
-       on  to  say:  "Their  usage in production code should be noted to avoid
-       problems during upgrades." The same remarks apply to the PCRE  features
-       described in this section.
-
-       The  new verbs make use of what was previously invalid syntax: an open-
-       ing parenthesis followed by an asterisk. They are generally of the form
-       (*VERB)  or  (*VERB:NAME). Some may take either form, possibly behaving
-       differently depending on whether or not a name is present.  A  name  is
-       any sequence of characters that does not include a closing parenthesis.
-       The maximum length of name is 255 in the 8-bit library and 65535 in the
-       16-bit  and  32-bit  libraries.  If  the name is empty, that is, if the
-       closing parenthesis immediately follows the colon, the effect is as  if
-       the  colon  were  not  there.  Any number of these verbs may occur in a
-       pattern.
-
-       Since these verbs are specifically related  to  backtracking,  most  of
-       them  can  be  used only when the pattern is to be matched using one of
-       the traditional matching functions, because these  use  a  backtracking
-       algorithm.  With the exception of (*FAIL), which behaves like a failing
-       negative assertion, the backtracking control verbs cause  an  error  if
-       encountered by a DFA matching function.
-
-       The  behaviour  of  these  verbs in repeated groups, assertions, and in
-       subpatterns called as subroutines (whether or not recursively) is docu-
-       mented below.
-
-   Optimizations that affect backtracking verbs
-
-       PCRE  contains some optimizations that are used to speed up matching by
-       running some checks at the start of each match attempt. For example, it
-       may  know  the minimum length of matching subject, or that a particular
-       character must be present. When one of these optimizations bypasses the
-       running  of  a  match,  any  included  backtracking  verbs will not, of
-       course, be processed. You can suppress the start-of-match optimizations
-       by  setting  the  PCRE_NO_START_OPTIMIZE  option when calling pcre_com-
-       pile() or pcre_exec(), or by starting the pattern with (*NO_START_OPT).
-       There is more discussion of this option in the section entitled "Option
-       bits for pcre_exec()" in the pcreapi documentation.
-
-       Experiments with Perl suggest that it too  has  similar  optimizations,
-       sometimes leading to anomalous results.
-
-   Verbs that act immediately
-
-       The  following  verbs act as soon as they are encountered. They may not
-       be followed by a name.
-
-          (*ACCEPT)
-
-       This verb causes the match to end successfully, skipping the  remainder
-       of  the pattern. However, when it is inside a subpattern that is called
-       as a subroutine, only that subpattern is ended  successfully.  Matching
-       then continues at the outer level. If (*ACCEPT) in triggered in a posi-
-       tive assertion, the assertion succeeds; in a  negative  assertion,  the
-       assertion fails.
-
-       If  (*ACCEPT)  is inside capturing parentheses, the data so far is cap-
-       tured. For example:
-
-         A((?:A|B(*ACCEPT)|C)D)
-
-       This matches "AB", "AAD", or "ACD"; when it matches "AB", "B"  is  cap-
-       tured by the outer parentheses.
-
-         (*FAIL) or (*F)
-
-       This  verb causes a matching failure, forcing backtracking to occur. It
-       is equivalent to (?!) but easier to read. The Perl documentation  notes
-       that  it  is  probably  useful only when combined with (?{}) or (??{}).
-       Those are, of course, Perl features that are not present in  PCRE.  The
-       nearest  equivalent is the callout feature, as for example in this pat-
-       tern:
-
-         a+(?C)(*FAIL)
-
-       A match with the string "aaaa" always fails, but the callout  is  taken
-       before each backtrack happens (in this example, 10 times).
-
-   Recording which path was taken
-
-       There  is  one  verb  whose  main  purpose  is to track how a match was
-       arrived at, though it also has a  secondary  use  in  conjunction  with
-       advancing the match starting point (see (*SKIP) below).
-
-         (*MARK:NAME) or (*:NAME)
-
-       A  name  is  always  required  with  this  verb.  There  may be as many
-       instances of (*MARK) as you like in a pattern, and their names  do  not
-       have to be unique.
-
-       When  a  match succeeds, the name of the last-encountered (*MARK:NAME),
-       (*PRUNE:NAME), or (*THEN:NAME) on the matching path is passed  back  to
-       the  caller  as  described  in  the  section  entitled  "Extra data for
-       pcre_exec()" in the  pcreapi  documentation.  Here  is  an  example  of
-       pcretest  output, where the /K modifier requests the retrieval and out-
-       putting of (*MARK) data:
-
-           re> /X(*MARK:A)Y|X(*MARK:B)Z/K
-         data> XY
-          0: XY
-         MK: A
-         XZ
-          0: XZ
-         MK: B
-
-       The (*MARK) name is tagged with "MK:" in this output, and in this exam-
-       ple  it indicates which of the two alternatives matched. This is a more
-       efficient way of obtaining this information than putting each  alterna-
-       tive in its own capturing parentheses.
-
-       If  a  verb  with a name is encountered in a positive assertion that is
-       true, the name is recorded and passed back if it  is  the  last-encoun-
-       tered. This does not happen for negative assertions or failing positive
-       assertions.
-
-       After a partial match or a failed match, the last encountered  name  in
-       the entire match process is returned. For example:
-
-           re> /X(*MARK:A)Y|X(*MARK:B)Z/K
-         data> XP
-         No match, mark = B
-
-       Note  that  in  this  unanchored  example the mark is retained from the
-       match attempt that started at the letter "X" in the subject. Subsequent
-       match attempts starting at "P" and then with an empty string do not get
-       as far as the (*MARK) item, but nevertheless do not reset it.
-
-       If you are interested in  (*MARK)  values  after  failed  matches,  you
-       should  probably  set  the PCRE_NO_START_OPTIMIZE option (see above) to
-       ensure that the match is always attempted.
-
-   Verbs that act after backtracking
-
-       The following verbs do nothing when they are encountered. Matching con-
-       tinues  with what follows, but if there is no subsequent match, causing
-       a backtrack to the verb, a failure is  forced.  That  is,  backtracking
-       cannot  pass  to the left of the verb. However, when one of these verbs
-       appears inside an atomic group or an assertion that is true, its effect
-       is  confined  to  that  group, because once the group has been matched,
-       there is never any backtracking into it. In this situation,  backtrack-
-       ing  can  "jump  back" to the left of the entire atomic group or asser-
-       tion. (Remember also, as stated  above,  that  this  localization  also
-       applies in subroutine calls.)
-
-       These  verbs  differ  in exactly what kind of failure occurs when back-
-       tracking reaches them. The behaviour described below  is  what  happens
-       when  the  verb is not in a subroutine or an assertion. Subsequent sec-
-       tions cover these special cases.
-
-         (*COMMIT)
-
-       This verb, which may not be followed by a name, causes the whole  match
-       to fail outright if there is a later matching failure that causes back-
-       tracking to reach it. Even if the pattern  is  unanchored,  no  further
-       attempts to find a match by advancing the starting point take place. If
-       (*COMMIT) is the only backtracking verb that is  encountered,  once  it
-       has been passed pcre_exec() is committed to finding a match at the cur-
-       rent starting point, or not at all. For example:
-
-         a+(*COMMIT)b
-
-       This matches "xxaab" but not "aacaab". It can be thought of as  a  kind
-       of dynamic anchor, or "I've started, so I must finish." The name of the
-       most recently passed (*MARK) in the path is passed back when  (*COMMIT)
-       forces a match failure.
-
-       If  there  is more than one backtracking verb in a pattern, a different
-       one that follows (*COMMIT) may be triggered first,  so  merely  passing
-       (*COMMIT) during a match does not always guarantee that a match must be
-       at this starting point.
-
-       Note that (*COMMIT) at the start of a pattern is not  the  same  as  an
-       anchor,  unless  PCRE's start-of-match optimizations are turned off, as
-       shown in this output from pcretest:
-
-           re> /(*COMMIT)abc/
-         data> xyzabc
-          0: abc
-         data> xyzabc\Y
-         No match
-
-       For this pattern, PCRE knows that any match must start with "a", so the
-       optimization skips along the subject to "a" before applying the pattern
-       to the first set of data. The match attempt then succeeds. In the  sec-
-       ond  set of data, the escape sequence \Y is interpreted by the pcretest
-       program. It causes the PCRE_NO_START_OPTIMIZE option  to  be  set  when
-       pcre_exec() is called.  This disables the optimization that skips along
-       to the first character. The pattern is now applied starting at "x", and
-       so  the  (*COMMIT)  causes  the  match to fail without trying any other
-       starting points.
-
-         (*PRUNE) or (*PRUNE:NAME)
-
-       This verb causes the match to fail at the current starting position  in
-       the subject if there is a later matching failure that causes backtrack-
-       ing to reach it. If the pattern is unanchored, the  normal  "bumpalong"
-       advance  to  the next starting character then happens. Backtracking can
-       occur as usual to the left of (*PRUNE), before it is reached,  or  when
-       matching  to  the  right  of  (*PRUNE), but if there is no match to the
-       right, backtracking cannot cross (*PRUNE). In simple cases, the use  of
-       (*PRUNE)  is just an alternative to an atomic group or possessive quan-
-       tifier, but there are some uses of (*PRUNE) that cannot be expressed in
-       any  other  way. In an anchored pattern (*PRUNE) has the same effect as
-       (*COMMIT).
-
-       The   behaviour   of   (*PRUNE:NAME)   is   the   not   the   same   as
-       (*MARK:NAME)(*PRUNE).   It  is  like  (*MARK:NAME)  in that the name is
-       remembered for  passing  back  to  the  caller.  However,  (*SKIP:NAME)
-       searches only for names set with (*MARK).
-
-         (*SKIP)
-
-       This  verb, when given without a name, is like (*PRUNE), except that if
-       the pattern is unanchored, the "bumpalong" advance is not to  the  next
-       character, but to the position in the subject where (*SKIP) was encoun-
-       tered. (*SKIP) signifies that whatever text was matched leading  up  to
-       it cannot be part of a successful match. Consider:
-
-         a+(*SKIP)b
-
-       If  the  subject  is  "aaaac...",  after  the first match attempt fails
-       (starting at the first character in the  string),  the  starting  point
-       skips on to start the next attempt at "c". Note that a possessive quan-
-       tifer does not have the same effect as this example; although it  would
-       suppress  backtracking  during  the  first  match  attempt,  the second
-       attempt would start at the second character instead of skipping  on  to
-       "c".
-
-         (*SKIP:NAME)
-
-       When (*SKIP) has an associated name, its behaviour is modified. When it
-       is triggered, the previous path through the pattern is searched for the
-       most  recent  (*MARK)  that  has  the  same  name. If one is found, the
-       "bumpalong" advance is to the subject position that corresponds to that
-       (*MARK) instead of to where (*SKIP) was encountered. If no (*MARK) with
-       a matching name is found, the (*SKIP) is ignored.
-
-       Note that (*SKIP:NAME) searches only for names set by (*MARK:NAME).  It
-       ignores names that are set by (*PRUNE:NAME) or (*THEN:NAME).
-
-         (*THEN) or (*THEN:NAME)
-
-       This  verb  causes  a skip to the next innermost alternative when back-
-       tracking reaches it. That  is,  it  cancels  any  further  backtracking
-       within  the  current  alternative.  Its name comes from the observation
-       that it can be used for a pattern-based if-then-else block:
-
-         ( COND1 (*THEN) FOO | COND2 (*THEN) BAR | COND3 (*THEN) BAZ ) ...
-
-       If the COND1 pattern matches, FOO is tried (and possibly further  items
-       after  the  end  of the group if FOO succeeds); on failure, the matcher
-       skips to the second alternative and tries COND2,  without  backtracking
-       into  COND1.  If that succeeds and BAR fails, COND3 is tried. If subse-
-       quently BAZ fails, there are no more alternatives, so there is a  back-
-       track  to  whatever  came  before  the  entire group. If (*THEN) is not
-       inside an alternation, it acts like (*PRUNE).
-
-       The   behaviour   of   (*THEN:NAME)   is   the   not   the   same    as
-       (*MARK:NAME)(*THEN).   It  is  like  (*MARK:NAME)  in  that the name is
-       remembered for  passing  back  to  the  caller.  However,  (*SKIP:NAME)
-       searches only for names set with (*MARK).
-
-       A  subpattern that does not contain a | character is just a part of the
-       enclosing alternative; it is not a nested  alternation  with  only  one
-       alternative.  The effect of (*THEN) extends beyond such a subpattern to
-       the enclosing alternative. Consider this pattern, where A, B, etc.  are
-       complex  pattern fragments that do not contain any | characters at this
-       level:
-
-         A (B(*THEN)C) | D
-
-       If A and B are matched, but there is a failure in C, matching does  not
-       backtrack into A; instead it moves to the next alternative, that is, D.
-       However, if the subpattern containing (*THEN) is given an  alternative,
-       it behaves differently:
-
-         A (B(*THEN)C | (*FAIL)) | D
-
-       The  effect of (*THEN) is now confined to the inner subpattern. After a
-       failure in C, matching moves to (*FAIL), which causes the whole subpat-
-       tern  to  fail  because  there are no more alternatives to try. In this
-       case, matching does now backtrack into A.
-
-       Note that a conditional subpattern is  not  considered  as  having  two
-       alternatives,  because  only  one  is  ever used. In other words, the |
-       character in a conditional subpattern has a different meaning. Ignoring
-       white space, consider:
-
-         ^.*? (?(?=a) a | b(*THEN)c )
-
-       If  the  subject  is  "ba", this pattern does not match. Because .*? is
-       ungreedy, it initially matches zero  characters.  The  condition  (?=a)
-       then  fails,  the  character  "b"  is  matched, but "c" is not. At this
-       point, matching does not backtrack to .*? as might perhaps be  expected
-       from  the  presence  of  the | character. The conditional subpattern is
-       part of the single alternative that comprises the whole pattern, and so
-       the  match  fails.  (If  there was a backtrack into .*?, allowing it to
-       match "b", the match would succeed.)
-
-       The verbs just described provide four different "strengths" of  control
-       when subsequent matching fails. (*THEN) is the weakest, carrying on the
-       match at the next alternative. (*PRUNE) comes next, failing  the  match
-       at  the  current starting position, but allowing an advance to the next
-       character (for an unanchored pattern). (*SKIP) is similar, except  that
-       the advance may be more than one character. (*COMMIT) is the strongest,
-       causing the entire match to fail.
-
-   More than one backtracking verb
-
-       If more than one backtracking verb is present in  a  pattern,  the  one
-       that  is  backtracked  onto first acts. For example, consider this pat-
-       tern, where A, B, etc. are complex pattern fragments:
-
-         (A(*COMMIT)B(*THEN)C|ABD)
-
-       If A matches but B fails, the backtrack to (*COMMIT) causes the  entire
-       match to fail. However, if A and B match, but C fails, the backtrack to
-       (*THEN) causes the next alternative (ABD) to be tried.  This  behaviour
-       is  consistent,  but is not always the same as Perl's. It means that if
-       two or more backtracking verbs appear in succession, all the  the  last
-       of them has no effect. Consider this example:
-
-         ...(*COMMIT)(*PRUNE)...
-
-       If there is a matching failure to the right, backtracking onto (*PRUNE)
-       causes it to be triggered, and its action is taken. There can never  be
-       a backtrack onto (*COMMIT).
-
-   Backtracking verbs in repeated groups
-
-       PCRE  differs  from  Perl  in  its  handling  of  backtracking verbs in
-       repeated groups. For example, consider:
-
-         /(a(*COMMIT)b)+ac/
-
-       If the subject is "abac", Perl matches,  but  PCRE  fails  because  the
-       (*COMMIT) in the second repeat of the group acts.
-
-   Backtracking verbs in assertions
-
-       (*FAIL)  in  an assertion has its normal effect: it forces an immediate
-       backtrack.
-
-       (*ACCEPT) in a positive assertion causes the assertion to succeed with-
-       out  any  further processing. In a negative assertion, (*ACCEPT) causes
-       the assertion to fail without any further processing.
-
-       The other backtracking verbs are not treated specially if  they  appear
-       in  a  positive  assertion.  In  particular,  (*THEN) skips to the next
-       alternative in the innermost enclosing  group  that  has  alternations,
-       whether or not this is within the assertion.
-
-       Negative  assertions  are,  however, different, in order to ensure that
-       changing a positive assertion into a  negative  assertion  changes  its
-       result. Backtracking into (*COMMIT), (*SKIP), or (*PRUNE) causes a neg-
-       ative assertion to be true, without considering any further alternative
-       branches in the assertion.  Backtracking into (*THEN) causes it to skip
-       to the next enclosing alternative within the assertion (the normal  be-
-       haviour),  but  if  the  assertion  does  not have such an alternative,
-       (*THEN) behaves like (*PRUNE).
-
-   Backtracking verbs in subroutines
-
-       These behaviours occur whether or not the subpattern is  called  recur-
-       sively.  Perl's treatment of subroutines is different in some cases.
-
-       (*FAIL)  in  a subpattern called as a subroutine has its normal effect:
-       it forces an immediate backtrack.
-
-       (*ACCEPT) in a subpattern called as a subroutine causes the  subroutine
-       match  to succeed without any further processing. Matching then contin-
-       ues after the subroutine call.
-
-       (*COMMIT), (*SKIP), and (*PRUNE) in a subpattern called as a subroutine
-       cause the subroutine match to fail.
-
-       (*THEN)  skips to the next alternative in the innermost enclosing group
-       within the subpattern that has alternatives. If there is no such  group
-       within the subpattern, (*THEN) causes the subroutine match to fail.
-
-
-SEE ALSO
-
-       pcreapi(3),  pcrecallout(3),  pcrematching(3),  pcresyntax(3), pcre(3),
-       pcre16(3), pcre32(3).
-
-
-AUTHOR
-
-       Philip Hazel
-       University Computing Service
-       Cambridge CB2 3QH, England.
-
-
-REVISION
-
-       Last updated: 14 June 2015
-       Copyright (c) 1997-2015 University of Cambridge.
-------------------------------------------------------------------------------
-
-
-PCRESYNTAX(3)              Library Functions Manual              PCRESYNTAX(3)
-
-
-
-NAME
-       PCRE - Perl-compatible regular expressions
-
-PCRE REGULAR EXPRESSION SYNTAX SUMMARY
-
-       The  full syntax and semantics of the regular expressions that are sup-
-       ported by PCRE are described in  the  pcrepattern  documentation.  This
-       document contains a quick-reference summary of the syntax.
-
-
-QUOTING
-
-         \x         where x is non-alphanumeric is a literal x
-         \Q...\E    treat enclosed characters as literal
-
-
-CHARACTERS
-
-         \a         alarm, that is, the BEL character (hex 07)
-         \cx        "control-x", where x is any ASCII character
-         \e         escape (hex 1B)
-         \f         form feed (hex 0C)
-         \n         newline (hex 0A)
-         \r         carriage return (hex 0D)
-         \t         tab (hex 09)
-         \0dd       character with octal code 0dd
-         \ddd       character with octal code ddd, or backreference
-         \o{ddd..}  character with octal code ddd..
-         \xhh       character with hex code hh
-         \x{hhh..}  character with hex code hhh..
-
-       Note that \0dd is always an octal code, and that \8 and \9 are the lit-
-       eral characters "8" and "9".
-
-
-CHARACTER TYPES
-
-         .          any character except newline;
-                      in dotall mode, any character whatsoever
-         \C         one data unit, even in UTF mode (best avoided)
-         \d         a decimal digit
-         \D         a character that is not a decimal digit
-         \h         a horizontal white space character
-         \H         a character that is not a horizontal white space character
-         \N         a character that is not a newline
-         \p{xx}     a character with the xx property
-         \P{xx}     a character without the xx property
-         \R         a newline sequence
-         \s         a white space character
-         \S         a character that is not a white space character
-         \v         a vertical white space character
-         \V         a character that is not a vertical white space character
-         \w         a "word" character
-         \W         a "non-word" character
-         \X         a Unicode extended grapheme cluster
-
-       By default, \d, \s, and \w match only ASCII characters, even  in  UTF-8
-       mode  or  in  the 16- bit and 32-bit libraries. However, if locale-spe-
-       cific matching is happening, \s and \w may also match  characters  with
-       code  points  in  the range 128-255. If the PCRE_UCP option is set, the
-       behaviour of these escape sequences is changed to use  Unicode  proper-
-       ties and they match many more characters.
-
-
-GENERAL CATEGORY PROPERTIES FOR \p and \P
-
-         C          Other
-         Cc         Control
-         Cf         Format
-         Cn         Unassigned
-         Co         Private use
-         Cs         Surrogate
-
-         L          Letter
-         Ll         Lower case letter
-         Lm         Modifier letter
-         Lo         Other letter
-         Lt         Title case letter
-         Lu         Upper case letter
-         L&         Ll, Lu, or Lt
-
-         M          Mark
-         Mc         Spacing mark
-         Me         Enclosing mark
-         Mn         Non-spacing mark
-
-         N          Number
-         Nd         Decimal number
-         Nl         Letter number
-         No         Other number
-
-         P          Punctuation
-         Pc         Connector punctuation
-         Pd         Dash punctuation
-         Pe         Close punctuation
-         Pf         Final punctuation
-         Pi         Initial punctuation
-         Po         Other punctuation
-         Ps         Open punctuation
-
-         S          Symbol
-         Sc         Currency symbol
-         Sk         Modifier symbol
-         Sm         Mathematical symbol
-         So         Other symbol
-
-         Z          Separator
-         Zl         Line separator
-         Zp         Paragraph separator
-         Zs         Space separator
-
-
-PCRE SPECIAL CATEGORY PROPERTIES FOR \p and \P
-
-         Xan        Alphanumeric: union of properties L and N
-         Xps        POSIX space: property Z or tab, NL, VT, FF, CR
-         Xsp        Perl space: property Z or tab, NL, VT, FF, CR
-         Xuc        Univerally-named character: one that can be
-                      represented by a Universal Character Name
-         Xwd        Perl word: property Xan or underscore
-
-       Perl and POSIX space are now the same. Perl added VT to its space char-
-       acter set at release 5.18 and PCRE changed at release 8.34.
-
-
-SCRIPT NAMES FOR \p AND \P
-
-       Arabic, Armenian, Avestan, Balinese, Bamum, Bassa_Vah, Batak,  Bengali,
-       Bopomofo,  Brahmi,  Braille, Buginese, Buhid, Canadian_Aboriginal, Car-
-       ian, Caucasian_Albanian, Chakma, Cham, Cherokee, Common, Coptic, Cunei-
-       form, Cypriot, Cyrillic, Deseret, Devanagari, Duployan, Egyptian_Hiero-
-       glyphs,  Elbasan,  Ethiopic,  Georgian,  Glagolitic,  Gothic,  Grantha,
-       Greek,  Gujarati,  Gurmukhi,  Han,  Hangul,  Hanunoo, Hebrew, Hiragana,
-       Imperial_Aramaic,    Inherited,     Inscriptional_Pahlavi,     Inscrip-
-       tional_Parthian,   Javanese,   Kaithi,   Kannada,  Katakana,  Kayah_Li,
-       Kharoshthi, Khmer, Khojki, Khudawadi, Lao, Latin, Lepcha,  Limbu,  Lin-
-       ear_A,  Linear_B,  Lisu,  Lycian, Lydian, Mahajani, Malayalam, Mandaic,
-       Manichaean,     Meetei_Mayek,     Mende_Kikakui,      Meroitic_Cursive,
-       Meroitic_Hieroglyphs,  Miao,  Modi, Mongolian, Mro, Myanmar, Nabataean,
-       New_Tai_Lue,  Nko,  Ogham,  Ol_Chiki,  Old_Italic,   Old_North_Arabian,
-       Old_Permic, Old_Persian, Old_South_Arabian, Old_Turkic, Oriya, Osmanya,
-       Pahawh_Hmong,    Palmyrene,    Pau_Cin_Hau,    Phags_Pa,    Phoenician,
-       Psalter_Pahlavi,  Rejang,  Runic,  Samaritan, Saurashtra, Sharada, Sha-
-       vian, Siddham, Sinhala, Sora_Sompeng, Sundanese, Syloti_Nagri,  Syriac,
-       Tagalog,  Tagbanwa,  Tai_Le,  Tai_Tham, Tai_Viet, Takri, Tamil, Telugu,
-       Thaana, Thai, Tibetan, Tifinagh, Tirhuta, Ugaritic,  Vai,  Warang_Citi,
-       Yi.
-
-
-CHARACTER CLASSES
-
-         [...]       positive character class
-         [^...]      negative character class
-         [x-y]       range (can be used for hex characters)
-         [[:xxx:]]   positive POSIX named set
-         [[:^xxx:]]  negative POSIX named set
-
-         alnum       alphanumeric
-         alpha       alphabetic
-         ascii       0-127
-         blank       space or tab
-         cntrl       control character
-         digit       decimal digit
-         graph       printing, excluding space
-         lower       lower case letter
-         print       printing, including space
-         punct       printing, excluding alphanumeric
-         space       white space
-         upper       upper case letter
-         word        same as \w
-         xdigit      hexadecimal digit
-
-       In  PCRE,  POSIX character set names recognize only ASCII characters by
-       default, but some of them use Unicode properties if  PCRE_UCP  is  set.
-       You can use \Q...\E inside a character class.
-
-
-QUANTIFIERS
-
-         ?           0 or 1, greedy
-         ?+          0 or 1, possessive
-         ??          0 or 1, lazy
-         *           0 or more, greedy
-         *+          0 or more, possessive
-         *?          0 or more, lazy
-         +           1 or more, greedy
-         ++          1 or more, possessive
-         +?          1 or more, lazy
-         {n}         exactly n
-         {n,m}       at least n, no more than m, greedy
-         {n,m}+      at least n, no more than m, possessive
-         {n,m}?      at least n, no more than m, lazy
-         {n,}        n or more, greedy
-         {n,}+       n or more, possessive
-         {n,}?       n or more, lazy
-
-
-ANCHORS AND SIMPLE ASSERTIONS
-
-         \b          word boundary
-         \B          not a word boundary
-         ^           start of subject
-                      also after internal newline in multiline mode
-         \A          start of subject
-         $           end of subject
-                      also before newline at end of subject
-                      also before internal newline in multiline mode
-         \Z          end of subject
-                      also before newline at end of subject
-         \z          end of subject
-         \G          first matching position in subject
-
-
-MATCH POINT RESET
-
-         \K          reset start of match
-
-       \K is honoured in positive assertions, but ignored in negative ones.
-
-
-ALTERNATION
-
-         expr|expr|expr...
-
-
-CAPTURING
-
-         (...)           capturing group
-         (?<name>...)    named capturing group (Perl)
-         (?'name'...)    named capturing group (Perl)
-         (?P<name>...)   named capturing group (Python)
-         (?:...)         non-capturing group
-         (?|...)         non-capturing group; reset group numbers for
-                          capturing groups in each alternative
-
-
-ATOMIC GROUPS
-
-         (?>...)         atomic, non-capturing group
-
-
-COMMENT
-
-         (?#....)        comment (not nestable)
-
-
-OPTION SETTING
-
-         (?i)            caseless
-         (?J)            allow duplicate names
-         (?m)            multiline
-         (?s)            single line (dotall)
-         (?U)            default ungreedy (lazy)
-         (?x)            extended (ignore white space)
-         (?-...)         unset option(s)
-
-       The  following  are  recognized  only at the very start of a pattern or
-       after one of the newline or \R options with similar syntax.  More  than
-       one of them may appear.
-
-         (*LIMIT_MATCH=d) set the match limit to d (decimal number)
-         (*LIMIT_RECURSION=d) set the recursion limit to d (decimal number)
-         (*NO_AUTO_POSSESS) no auto-possessification (PCRE_NO_AUTO_POSSESS)
-         (*NO_START_OPT) no start-match optimization (PCRE_NO_START_OPTIMIZE)
-         (*UTF8)         set UTF-8 mode: 8-bit library (PCRE_UTF8)
-         (*UTF16)        set UTF-16 mode: 16-bit library (PCRE_UTF16)
-         (*UTF32)        set UTF-32 mode: 32-bit library (PCRE_UTF32)
-         (*UTF)          set appropriate UTF mode for the library in use
-         (*UCP)          set PCRE_UCP (use Unicode properties for \d etc)
-
-       Note  that LIMIT_MATCH and LIMIT_RECURSION can only reduce the value of
-       the limits set by the caller of pcre_exec(), not increase them.
-
-
-NEWLINE CONVENTION
-
-       These are recognized only at the very start of  the  pattern  or  after
-       option settings with a similar syntax.
-
-         (*CR)           carriage return only
-         (*LF)           linefeed only
-         (*CRLF)         carriage return followed by linefeed
-         (*ANYCRLF)      all three of the above
-         (*ANY)          any Unicode newline sequence
-
-
-WHAT \R MATCHES
-
-       These  are  recognized  only  at the very start of the pattern or after
-       option setting with a similar syntax.
-
-         (*BSR_ANYCRLF)  CR, LF, or CRLF
-         (*BSR_UNICODE)  any Unicode newline sequence
-
-
-LOOKAHEAD AND LOOKBEHIND ASSERTIONS
-
-         (?=...)         positive look ahead
-         (?!...)         negative look ahead
-         (?<=...)        positive look behind
-         (?<!...)        negative look behind
-
-       Each top-level branch of a look behind must be of a fixed length.
-
-
-BACKREFERENCES
-
-         \n              reference by number (can be ambiguous)
-         \gn             reference by number
-         \g{n}           reference by number
-         \g{-n}          relative reference by number
-         \k<name>        reference by name (Perl)
-         \k'name'        reference by name (Perl)
-         \g{name}        reference by name (Perl)
-         \k{name}        reference by name (.NET)
-         (?P=name)       reference by name (Python)
-
-
-SUBROUTINE REFERENCES (POSSIBLY RECURSIVE)
-
-         (?R)            recurse whole pattern
-         (?n)            call subpattern by absolute number
-         (?+n)           call subpattern by relative number
-         (?-n)           call subpattern by relative number
-         (?&name)        call subpattern by name (Perl)
-         (?P>name)       call subpattern by name (Python)
-         \g<name>        call subpattern by name (Oniguruma)
-         \g'name'        call subpattern by name (Oniguruma)
-         \g<n>           call subpattern by absolute number (Oniguruma)
-         \g'n'           call subpattern by absolute number (Oniguruma)
-         \g<+n>          call subpattern by relative number (PCRE extension)
-         \g'+n'          call subpattern by relative number (PCRE extension)
-         \g<-n>          call subpattern by relative number (PCRE extension)
-         \g'-n'          call subpattern by relative number (PCRE extension)
-
-
-CONDITIONAL PATTERNS
-
-         (?(condition)yes-pattern)
-         (?(condition)yes-pattern|no-pattern)
-
-         (?(n)...        absolute reference condition
-         (?(+n)...       relative reference condition
-         (?(-n)...       relative reference condition
-         (?(<name>)...   named reference condition (Perl)
-         (?('name')...   named reference condition (Perl)
-         (?(name)...     named reference condition (PCRE)
-         (?(R)...        overall recursion condition
-         (?(Rn)...       specific group recursion condition
-         (?(R&name)...   specific recursion condition
-         (?(DEFINE)...   define subpattern for reference
-         (?(assert)...   assertion condition
-
-
-BACKTRACKING CONTROL
-
-       The following act immediately they are reached:
-
-         (*ACCEPT)       force successful match
-         (*FAIL)         force backtrack; synonym (*F)
-         (*MARK:NAME)    set name to be passed back; synonym (*:NAME)
-
-       The following act only when a subsequent match failure causes  a  back-
-       track to reach them. They all force a match failure, but they differ in
-       what happens afterwards. Those that advance the start-of-match point do
-       so only if the pattern is not anchored.
-
-         (*COMMIT)       overall failure, no advance of starting point
-         (*PRUNE)        advance to next starting character
-         (*PRUNE:NAME)   equivalent to (*MARK:NAME)(*PRUNE)
-         (*SKIP)         advance to current matching position
-         (*SKIP:NAME)    advance to position corresponding to an earlier
-                         (*MARK:NAME); if not found, the (*SKIP) is ignored
-         (*THEN)         local failure, backtrack to next alternation
-         (*THEN:NAME)    equivalent to (*MARK:NAME)(*THEN)
-
-
-CALLOUTS
-
-         (?C)      callout
-         (?Cn)     callout with data n
-
-
-SEE ALSO
-
-       pcrepattern(3), pcreapi(3), pcrecallout(3), pcrematching(3), pcre(3).
-
-
-AUTHOR
-
-       Philip Hazel
-       University Computing Service
-       Cambridge CB2 3QH, England.
-
-
-REVISION
-
-       Last updated: 08 January 2014
-       Copyright (c) 1997-2014 University of Cambridge.
-------------------------------------------------------------------------------
-
-
-PCREUNICODE(3)             Library Functions Manual             PCREUNICODE(3)
-
-
-
-NAME
-       PCRE - Perl-compatible regular expressions
-
-UTF-8, UTF-16, UTF-32, AND UNICODE PROPERTY SUPPORT
-
-       As well as UTF-8 support, PCRE also supports UTF-16 (from release 8.30)
-       and UTF-32 (from release 8.32), by means of two  additional  libraries.
-       They can be built as well as, or instead of, the 8-bit library.
-
-
-UTF-8 SUPPORT
-
-       In  order  process  UTF-8  strings, you must build PCRE's 8-bit library
-       with UTF support, and, in addition, you must call  pcre_compile()  with
-       the  PCRE_UTF8 option flag, or the pattern must start with the sequence
-       (*UTF8) or (*UTF). When either of these is the case, both  the  pattern
-       and  any  subject  strings  that  are matched against it are treated as
-       UTF-8 strings instead of strings of individual 1-byte characters.
-
-
-UTF-16 AND UTF-32 SUPPORT
-
-       In order process UTF-16 or UTF-32 strings, you must build PCRE's 16-bit
-       or  32-bit  library  with  UTF support, and, in addition, you must call
-       pcre16_compile() or pcre32_compile() with the PCRE_UTF16 or  PCRE_UTF32
-       option flag, as appropriate. Alternatively, the pattern must start with
-       the sequence (*UTF16), (*UTF32), as appropriate, or (*UTF),  which  can
-       be used with either library. When UTF mode is set, both the pattern and
-       any subject strings that are matched against it are treated  as  UTF-16
-       or  UTF-32  strings  instead  of strings of individual 16-bit or 32-bit
-       characters.
-
-
-UTF SUPPORT OVERHEAD
-
-       If you compile PCRE with UTF 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_UTF[8|16|32]  flag  occasionally,  so
-       should not be very big.
-
-
-UNICODE PROPERTY SUPPORT
-
-       If PCRE is built with Unicode character property support (which implies
-       UTF support), the escape sequences \p{..}, \P{..}, and \X can be  used.
-       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, the Unicode script names such as Arabic or Han, and the
-       derived properties Any and L&. Full lists is given in  the  pcrepattern
-       and  pcresyntax  documentation. Only the short names for properties are
-       supported. For example, \p{L}  matches  a  letter.  Its  Perl  synonym,
-       \p{Letter},  is  not  supported.  Furthermore, in Perl, many properties
-       may optionally be prefixed by "Is", for compatibility  with  Perl  5.6.
-       PCRE does not support this.
-
-   Validity of UTF-8 strings
-
-       When  you  set  the PCRE_UTF8 flag, the byte strings passed as patterns
-       and subjects are (by default) checked for validity on entry to the rel-
-       evant functions. The entire string is checked before any other process-
-       ing takes place. From release 7.3 of PCRE, the check is  according  the
-       rules of RFC 3629, which are themselves derived from the Unicode speci-
-       fication. Earlier releases of PCRE followed  the  rules  of  RFC  2279,
-       which  allows  the  full  range of 31-bit values (0 to 0x7FFFFFFF). The
-       current check allows only values in the range U+0 to U+10FFFF,  exclud-
-       ing  the  surrogate area. (From release 8.33 the so-called "non-charac-
-       ter" code points are no longer excluded because Unicode corrigendum  #9
-       makes it clear that they should not be.)
-
-       Characters  in  the "Surrogate Area" of Unicode are reserved for use by
-       UTF-16, where they are used in pairs to encode codepoints  with  values
-       greater  than  0xFFFF. The code points that are encoded by UTF-16 pairs
-       are available independently in the  UTF-8  and  UTF-32  encodings.  (In
-       other  words,  the  whole  surrogate  thing is a fudge for UTF-16 which
-       unfortunately messes up UTF-8 and UTF-32.)
-
-       If an invalid UTF-8 string is passed to PCRE, an error return is given.
-       At  compile  time, the only additional information is the offset to the
-       first byte of the failing character. The run-time functions pcre_exec()
-       and  pcre_dfa_exec() also pass back this information, as well as a more
-       detailed reason code if the caller has provided memory in which  to  do
-       this.
-
-       In  some  situations, you may already know that your strings are valid,
-       and therefore want to skip these checks in  order  to  improve  perfor-
-       mance,  for  example in the case of a long subject string that is being
-       scanned repeatedly.  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.
-
-       Note  that  passing  PCRE_NO_UTF8_CHECK to pcre_compile() just disables
-       the check for the pattern; it does not also apply to  subject  strings.
-       If  you  want  to  disable the check for a subject string you must pass
-       this option to pcre_exec() or pcre_dfa_exec().
-
-       If you pass an invalid UTF-8 string when PCRE_NO_UTF8_CHECK is set, the
-       result is undefined and your program may crash.
-
-   Validity of UTF-16 strings
-
-       When you set the PCRE_UTF16 flag, the strings of 16-bit data units that
-       are passed as patterns and subjects are (by default) checked for valid-
-       ity  on entry to the relevant functions. Values other than those in the
-       surrogate range U+D800 to U+DFFF are independent code points. Values in
-       the surrogate range must be used in pairs in the correct manner.
-
-       If  an  invalid  UTF-16  string  is  passed to PCRE, an error return is
-       given. At compile time, the only additional information is  the  offset
-       to the first data unit of the failing character. The run-time functions
-       pcre16_exec() and pcre16_dfa_exec() also pass back this information, as
-       well  as  a more detailed reason code if the caller has provided memory
-       in which to do this.
-
-       In some situations, you may already know that your strings  are  valid,
-       and  therefore  want  to  skip these checks in order to improve perfor-
-       mance. If you set the PCRE_NO_UTF16_CHECK flag at compile  time  or  at
-       run time, PCRE assumes that the pattern or subject it is given (respec-
-       tively) contains only valid UTF-16 sequences. In this case, it does not
-       diagnose  an  invalid  UTF-16 string.  However, if an invalid string is
-       passed, the result is undefined.
-
-   Validity of UTF-32 strings
-
-       When you set the PCRE_UTF32 flag, the strings of 32-bit data units that
-       are passed as patterns and subjects are (by default) checked for valid-
-       ity on entry to the relevant functions.  This check allows only  values
-       in  the  range  U+0 to U+10FFFF, excluding the surrogate area U+D800 to
-       U+DFFF.
-
-       If an invalid UTF-32 string is passed  to  PCRE,  an  error  return  is
-       given.  At  compile time, the only additional information is the offset
-       to the first data unit of the failing character. The run-time functions
-       pcre32_exec() and pcre32_dfa_exec() also pass back this information, as
-       well as a more detailed reason code if the caller has  provided  memory
-       in which to do this.
-
-       In  some  situations, you may already know that your strings are valid,
-       and therefore want to skip these checks in  order  to  improve  perfor-
-       mance.  If  you  set the PCRE_NO_UTF32_CHECK flag at compile time or at
-       run time, PCRE assumes that the pattern or subject it is given (respec-
-       tively) contains only valid UTF-32 sequences. In this case, it does not
-       diagnose an invalid UTF-32 string.  However, if an  invalid  string  is
-       passed, the result is undefined.
-
-   General comments about UTF modes
-
-       1.  Codepoints  less  than  256  can be specified in patterns by either
-       braced or unbraced hexadecimal escape sequences (for example, \x{b3} or
-       \xb3). Larger values have to use braced sequences.
-
-       2.  Octal  numbers  up  to  \777 are recognized, and in UTF-8 mode they
-       match two-byte characters for values greater than \177.
-
-       3. Repeat quantifiers apply to complete UTF characters, not to individ-
-       ual data units, for example: \x{100}{3}.
-
-       4.  The dot metacharacter matches one UTF character instead of a single
-       data unit.
-
-       5. The escape sequence \C can be used to match a single byte  in  UTF-8
-       mode,  or  a single 16-bit data unit in UTF-16 mode, or a single 32-bit
-       data unit in UTF-32 mode, but its use can lead to some strange  effects
-       because  it  breaks up multi-unit characters (see the description of \C
-       in the pcrepattern documentation). The use of \C is  not  supported  in
-       the  alternative  matching  function  pcre[16|32]_dfa_exec(), nor is it
-       supported in UTF mode by the JIT optimization of pcre[16|32]_exec(). If
-       JIT  optimization  is  requested for a UTF pattern that contains \C, it
-       will not succeed, and so the matching will be carried out by the normal
-       interpretive function.
-
-       6.  The  character escapes \b, \B, \d, \D, \s, \S, \w, and \W correctly
-       test characters of any code value, but, by default, the characters that
-       PCRE  recognizes  as digits, spaces, or word characters remain the same
-       set as in non-UTF mode, all with values less  than  256.  This  remains
-       true  even  when  PCRE  is  built  to include Unicode property support,
-       because to do otherwise would slow down PCRE in many common cases. Note
-       in  particular that this applies to \b and \B, because they are defined
-       in terms of \w and \W. If you really want to test for a wider sense of,
-       say,  "digit",  you  can  use  explicit  Unicode property tests such as
-       \p{Nd}. Alternatively, if you set the PCRE_UCP option, the way that the
-       character  escapes  work is changed so that Unicode properties are used
-       to determine which characters match. There are more details in the sec-
-       tion on generic character types in the pcrepattern documentation.
-
-       7.  Similarly,  characters that match the POSIX named character classes
-       are all low-valued characters, unless the PCRE_UCP option is set.
-
-       8. However, the horizontal and vertical white  space  matching  escapes
-       (\h,  \H,  \v, and \V) do match all the appropriate Unicode characters,
-       whether or not PCRE_UCP is set.
-
-       9. Case-insensitive matching applies only to  characters  whose  values
-       are  less than 128, unless PCRE is built with Unicode property support.
-       A few Unicode characters such as Greek sigma have more than  two  code-
-       points that are case-equivalent. Up to and including PCRE release 8.31,
-       only one-to-one case mappings were supported, but later releases  (with
-       Unicode  property  support) do treat as case-equivalent all versions of
-       characters such as Greek sigma.
-
-
-AUTHOR
-
-       Philip Hazel
-       University Computing Service
-       Cambridge CB2 3QH, England.
-
-
-REVISION
-
-       Last updated: 27 February 2013
-       Copyright (c) 1997-2013 University of Cambridge.
-------------------------------------------------------------------------------
-
-
-PCREJIT(3)                 Library Functions Manual                 PCREJIT(3)
-
-
-
-NAME
-       PCRE - Perl-compatible regular expressions
-
-PCRE JUST-IN-TIME COMPILER SUPPORT
-
-       Just-in-time  compiling  is a heavyweight optimization that can greatly
-       speed up pattern matching. However, it comes at the cost of extra  pro-
-       cessing before the match is performed. Therefore, it is of most benefit
-       when the same pattern is going to be matched many times. This does  not
-       necessarily  mean  many calls of a matching function; if the pattern is
-       not anchored, matching attempts may take place many  times  at  various
-       positions  in  the  subject, even for a single call.  Therefore, if the
-       subject string is very long, it may still pay to use  JIT  for  one-off
-       matches.
-
-       JIT  support  applies  only to the traditional Perl-compatible matching
-       function.  It does not apply when the DFA matching  function  is  being
-       used. The code for this support was written by Zoltan Herczeg.
-
-
-8-BIT, 16-BIT AND 32-BIT SUPPORT
-
-       JIT  support  is available for all of the 8-bit, 16-bit and 32-bit PCRE
-       libraries. To keep this documentation simple, only the 8-bit  interface
-       is described in what follows. If you are using the 16-bit library, sub-
-       stitute the  16-bit  functions  and  16-bit  structures  (for  example,
-       pcre16_jit_stack  instead  of  pcre_jit_stack).  If  you  are using the
-       32-bit library, substitute the 32-bit functions and  32-bit  structures
-       (for example, pcre32_jit_stack instead of pcre_jit_stack).
-
-
-AVAILABILITY OF JIT SUPPORT
-
-       JIT  support  is  an  optional  feature of PCRE. The "configure" option
-       --enable-jit (or equivalent CMake option) must  be  set  when  PCRE  is
-       built  if  you want to use JIT. The support is limited to the following
-       hardware platforms:
-
-         ARM v5, v7, and Thumb2
-         Intel x86 32-bit and 64-bit
-         MIPS 32-bit
-         Power PC 32-bit and 64-bit
-         SPARC 32-bit (experimental)
-
-       If --enable-jit is set on an unsupported platform, compilation fails.
-
-       A program that is linked with PCRE 8.20 or later can tell if  JIT  sup-
-       port  is  available  by  calling pcre_config() with the PCRE_CONFIG_JIT
-       option. The result is 1 when JIT is available, and  0  otherwise.  How-
-       ever, a simple program does not need to check this in order to use JIT.
-       The normal API is implemented in a way that falls back to the interpre-
-       tive code if JIT is not available. For programs that need the best pos-
-       sible performance, there is also a "fast path"  API  that  is  JIT-spe-
-       cific.
-
-       If  your program may sometimes be linked with versions of PCRE that are
-       older than 8.20, but you want to use JIT when it is available, you  can
-       test the values of PCRE_MAJOR and PCRE_MINOR, or the existence of a JIT
-       macro such as PCRE_CONFIG_JIT, for compile-time control of your code.
-
-
-SIMPLE USE OF JIT
-
-       You have to do two things to make use of the JIT support  in  the  sim-
-       plest way:
-
-         (1) Call pcre_study() with the PCRE_STUDY_JIT_COMPILE option for
-             each compiled pattern, and pass the resulting pcre_extra block to
-             pcre_exec().
-
-         (2) Use pcre_free_study() to free the pcre_extra block when it is
-             no  longer  needed,  instead  of  just  freeing it yourself. This
-       ensures that
-             any JIT data is also freed.
-
-       For a program that may be linked with pre-8.20 versions  of  PCRE,  you
-       can insert
-
-         #ifndef PCRE_STUDY_JIT_COMPILE
-         #define PCRE_STUDY_JIT_COMPILE 0
-         #endif
-
-       so  that  no  option  is passed to pcre_study(), and then use something
-       like this to free the study data:
-
-         #ifdef PCRE_CONFIG_JIT
-             pcre_free_study(study_ptr);
-         #else
-             pcre_free(study_ptr);
-         #endif
-
-       PCRE_STUDY_JIT_COMPILE requests the JIT compiler to generate  code  for
-       complete  matches.  If  you  want  to  run  partial  matches  using the
-       PCRE_PARTIAL_HARD or  PCRE_PARTIAL_SOFT  options  of  pcre_exec(),  you
-       should  set  one  or  both  of the following options in addition to, or
-       instead of, PCRE_STUDY_JIT_COMPILE when you call pcre_study():
-
-         PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE
-         PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE
-
-       The JIT compiler generates different optimized code  for  each  of  the
-       three  modes  (normal, soft partial, hard partial). When pcre_exec() is
-       called, the appropriate code is run if it is available. Otherwise,  the
-       pattern is matched using interpretive code.
-
-       In  some circumstances you may need to call additional functions. These
-       are described in the  section  entitled  "Controlling  the  JIT  stack"
-       below.
-
-       If  JIT  support  is  not  available,  PCRE_STUDY_JIT_COMPILE  etc. are
-       ignored, and no JIT data is created. Otherwise, the compiled pattern is
-       passed  to the JIT compiler, which turns it into machine code that exe-
-       cutes much faster than the normal interpretive code.  When  pcre_exec()
-       is  passed  a  pcre_extra block containing a pointer to JIT code of the
-       appropriate mode (normal or hard/soft  partial),  it  obeys  that  code
-       instead  of  running  the interpreter. The result is identical, but the
-       compiled JIT code runs much faster.
-
-       There are some pcre_exec() options that are not supported for JIT  exe-
-       cution.  There  are  also  some  pattern  items that JIT cannot handle.
-       Details are given below. In both cases, execution  automatically  falls
-       back  to  the  interpretive  code.  If you want to know whether JIT was
-       actually used for a particular match, you  should  arrange  for  a  JIT
-       callback  function  to  be  set up as described in the section entitled
-       "Controlling the JIT stack" below, even if you do not need to supply  a
-       non-default  JIT stack. Such a callback function is called whenever JIT
-       code is about to be obeyed. If the execution options are not right  for
-       JIT execution, the callback function is not obeyed.
-
-       If  the  JIT  compiler finds an unsupported item, no JIT data is gener-
-       ated. You can find out if JIT execution is available after  studying  a
-       pattern  by  calling  pcre_fullinfo()  with the PCRE_INFO_JIT option. A
-       result of 1 means that JIT compilation was successful. A  result  of  0
-       means that JIT support is not available, or the pattern was not studied
-       with PCRE_STUDY_JIT_COMPILE etc., or the JIT compiler was not  able  to
-       handle the pattern.
-
-       Once a pattern has been studied, with or without JIT, it can be used as
-       many times as you like for matching different subject strings.
-
-
-UNSUPPORTED OPTIONS AND PATTERN ITEMS
-
-       The only pcre_exec() options that are supported for JIT  execution  are
-       PCRE_NO_UTF8_CHECK, PCRE_NO_UTF16_CHECK, PCRE_NO_UTF32_CHECK, PCRE_NOT-
-       BOL,  PCRE_NOTEOL,  PCRE_NOTEMPTY,   PCRE_NOTEMPTY_ATSTART,   PCRE_PAR-
-       TIAL_HARD, and PCRE_PARTIAL_SOFT.
-
-       The  only  unsupported  pattern items are \C (match a single data unit)
-       when running in a UTF mode, and a callout immediately before an  asser-
-       tion condition in a conditional group.
-
-
-RETURN VALUES FROM JIT EXECUTION
-
-       When  a  pattern  is matched using JIT execution, the return values are
-       the same as those given by the interpretive pcre_exec() code, with  the
-       addition  of  one new error code: PCRE_ERROR_JIT_STACKLIMIT. This means
-       that the memory used for the JIT stack was insufficient. See  "Control-
-       ling the JIT stack" below for a discussion of JIT stack usage. For com-
-       patibility with the interpretive pcre_exec() code, no  more  than  two-
-       thirds  of  the ovector argument is used for passing back captured sub-
-       strings.
-
-       The error code PCRE_ERROR_MATCHLIMIT is returned by  the  JIT  code  if
-       searching  a  very large pattern tree goes on for too long, as it is in
-       the same circumstance when JIT is not used, but the details of  exactly
-       what  is  counted are not the same. The PCRE_ERROR_RECURSIONLIMIT error
-       code is never returned by JIT execution.
-
-
-SAVING AND RESTORING COMPILED PATTERNS
-
-       The code that is generated by the  JIT  compiler  is  architecture-spe-
-       cific,  and  is also position dependent. For those reasons it cannot be
-       saved (in a file or database) and restored later like the bytecode  and
-       other  data  of  a compiled pattern. Saving and restoring compiled pat-
-       terns is not something many people do. More detail about this  facility
-       is  given in the pcreprecompile documentation. It should be possible to
-       run pcre_study() on a saved and restored pattern, and thereby  recreate
-       the  JIT  data, but because JIT compilation uses significant resources,
-       it is probably not worth doing this; you might as  well  recompile  the
-       original pattern.
-
-
-CONTROLLING THE JIT STACK
-
-       When the compiled JIT code runs, it needs a block of memory to use as a
-       stack.  By default, it uses 32K on the  machine  stack.  However,  some
-       large   or   complicated  patterns  need  more  than  this.  The  error
-       PCRE_ERROR_JIT_STACKLIMIT is given when  there  is  not  enough  stack.
-       Three  functions  are provided for managing blocks of memory for use as
-       JIT stacks. There is further discussion about the use of JIT stacks  in
-       the section entitled "JIT stack FAQ" below.
-
-       The  pcre_jit_stack_alloc() function creates a JIT stack. Its arguments
-       are a starting size and a maximum size, and it returns a pointer to  an
-       opaque  structure of type pcre_jit_stack, or NULL if there is an error.
-       The pcre_jit_stack_free() function can be used to free a stack that  is
-       no  longer  needed.  (For  the technically minded: the address space is
-       allocated by mmap or VirtualAlloc.)
-
-       JIT uses far less memory for recursion than the interpretive code,  and
-       a  maximum  stack size of 512K to 1M should be more than enough for any
-       pattern.
-
-       The pcre_assign_jit_stack() function specifies  which  stack  JIT  code
-       should use. Its arguments are as follows:
-
-         pcre_extra         *extra
-         pcre_jit_callback  callback
-         void               *data
-
-       The  extra  argument  must  be  the  result  of studying a pattern with
-       PCRE_STUDY_JIT_COMPILE etc. There are three cases for the values of the
-       other two options:
-
-         (1) If callback is NULL and data is NULL, an internal 32K block
-             on the machine stack is used.
-
-         (2) If callback is NULL and data is not NULL, data must be
-             a valid JIT stack, the result of calling pcre_jit_stack_alloc().
-
-         (3) If callback is not NULL, it must point to a function that is
-             called with data as an argument at the start of matching, in
-             order to set up a JIT stack. If the return from the callback
-             function is NULL, the internal 32K stack is used; otherwise the
-             return value must be a valid JIT stack, the result of calling
-             pcre_jit_stack_alloc().
-
-       A  callback function is obeyed whenever JIT code is about to be run; it
-       is not obeyed when pcre_exec() is called with options that  are  incom-
-       patible for JIT execution. A callback function can therefore be used to
-       determine whether a match operation was  executed  by  JIT  or  by  the
-       interpreter.
-
-       You may safely use the same JIT stack for more than one pattern (either
-       by assigning directly or by callback), as long as the patterns are  all
-       matched  sequentially in the same thread. In a multithread application,
-       if you do not specify a JIT stack, or if you assign or pass  back  NULL
-       from  a  callback, that is thread-safe, because each thread has its own
-       machine stack. However, if you assign  or  pass  back  a  non-NULL  JIT
-       stack,  this  must  be  a  different  stack for each thread so that the
-       application is thread-safe.
-
-       Strictly speaking, even more is allowed. You can assign the  same  non-
-       NULL  stack  to any number of patterns as long as they are not used for
-       matching by multiple threads at the same time.  For  example,  you  can
-       assign  the same stack to all compiled patterns, and use a global mutex
-       in the callback to wait until the stack is available for use.  However,
-       this is an inefficient solution, and not recommended.
-
-       This  is a suggestion for how a multithreaded program that needs to set
-       up non-default JIT stacks might operate:
-
-         During thread initalization
-           thread_local_var = pcre_jit_stack_alloc(...)
-
-         During thread exit
-           pcre_jit_stack_free(thread_local_var)
-
-         Use a one-line callback function
-           return thread_local_var
-
-       All the functions described in this section do nothing if  JIT  is  not
-       available,  and  pcre_assign_jit_stack()  does nothing unless the extra
-       argument is non-NULL and points to  a  pcre_extra  block  that  is  the
-       result of a successful study with PCRE_STUDY_JIT_COMPILE etc.
-
-
-JIT STACK FAQ
-
-       (1) Why do we need JIT stacks?
-
-       PCRE  (and JIT) is a recursive, depth-first engine, so it needs a stack
-       where the local data of the current node is pushed before checking  its
-       child nodes.  Allocating real machine stack on some platforms is diffi-
-       cult. For example, the stack chain needs to be updated every time if we
-       extend  the  stack  on  PowerPC.  Although it is possible, its updating
-       time overhead decreases performance. So we do the recursion in memory.
-
-       (2) Why don't we simply allocate blocks of memory with malloc()?
-
-       Modern operating systems have a  nice  feature:  they  can  reserve  an
-       address space instead of allocating memory. We can safely allocate mem-
-       ory pages inside this address space, so the stack  could  grow  without
-       moving memory data (this is important because of pointers). Thus we can
-       allocate 1M address space, and use only a single memory  page  (usually
-       4K)  if  that is enough. However, we can still grow up to 1M anytime if
-       needed.
-
-       (3) Who "owns" a JIT stack?
-
-       The owner of the stack is the user program, not the JIT studied pattern
-       or  anything else. The user program must ensure that if a stack is used
-       by pcre_exec(), (that is, it is assigned to the pattern currently  run-
-       ning), that stack must not be used by any other threads (to avoid over-
-       writing the same memory area). The best practice for multithreaded pro-
-       grams  is  to  allocate  a stack for each thread, and return this stack
-       through the JIT callback function.
-
-       (4) When should a JIT stack be freed?
-
-       You can free a JIT stack at any time, as long as it will not be used by
-       pcre_exec()  again.  When  you  assign  the  stack to a pattern, only a
-       pointer is set. There is no reference counting or any other magic.  You
-       can  free  the  patterns  and stacks in any order, anytime. Just do not
-       call pcre_exec() with a pattern pointing to an already freed stack,  as
-       that  will cause SEGFAULT. (Also, do not free a stack currently used by
-       pcre_exec() in another thread). You can also replace the  stack  for  a
-       pattern  at  any  time.  You  can  even  free the previous stack before
-       assigning a replacement.
-
-       (5) Should I allocate/free a  stack  every  time  before/after  calling
-       pcre_exec()?
-
-       No,  because  this  is  too  costly in terms of resources. However, you
-       could implement some clever idea which release the stack if it  is  not
-       used  in  let's  say  two minutes. The JIT callback can help to achieve
-       this without keeping a list of the currently JIT studied patterns.
-
-       (6) OK, the stack is for long term memory allocation. But what  happens
-       if  a pattern causes stack overflow with a stack of 1M? Is that 1M kept
-       until the stack is freed?
-
-       Especially on embedded sytems, it might be a good idea to release  mem-
-       ory  sometimes  without  freeing the stack. There is no API for this at
-       the moment.  Probably a function call which returns with the  currently
-       allocated  memory for any stack and another which allows releasing mem-
-       ory (shrinking the stack) would be a good idea if someone needs this.
-
-       (7) This is too much of a headache. Isn't there any better solution for
-       JIT stack handling?
-
-       No,  thanks to Windows. If POSIX threads were used everywhere, we could
-       throw out this complicated API.
-
-
-EXAMPLE CODE
-
-       This is a single-threaded example that specifies a  JIT  stack  without
-       using a callback.
-
-         int rc;
-         int ovector[30];
-         pcre *re;
-         pcre_extra *extra;
-         pcre_jit_stack *jit_stack;
-
-         re = pcre_compile(pattern, 0, &error, &erroffset, NULL);
-         /* Check for errors */
-         extra = pcre_study(re, PCRE_STUDY_JIT_COMPILE, &error);
-         jit_stack = pcre_jit_stack_alloc(32*1024, 512*1024);
-         /* Check for error (NULL) */
-         pcre_assign_jit_stack(extra, NULL, jit_stack);
-         rc = pcre_exec(re, extra, subject, length, 0, 0, ovector, 30);
-         /* Check results */
-         pcre_free(re);
-         pcre_free_study(extra);
-         pcre_jit_stack_free(jit_stack);
-
-
-JIT FAST PATH API
-
-       Because  the  API  described  above falls back to interpreted execution
-       when JIT is not available, it is convenient for programs that are writ-
-       ten  for  general  use  in  many environments. However, calling JIT via
-       pcre_exec() does have a performance impact. Programs that  are  written
-       for  use  where  JIT  is known to be available, and which need the best
-       possible performance, can instead use a "fast path"  API  to  call  JIT
-       execution  directly  instead of calling pcre_exec() (obviously only for
-       patterns that have been successfully studied by JIT).
-
-       The fast path function is called pcre_jit_exec(), and it takes  exactly
-       the  same  arguments  as pcre_exec(), plus one additional argument that
-       must point to a JIT stack. The JIT stack arrangements  described  above
-       do not apply. The return values are the same as for pcre_exec().
-
-       When  you  call  pcre_exec(), as well as testing for invalid options, a
-       number of other sanity checks are performed on the arguments. For exam-
-       ple,  if  the  subject  pointer  is NULL, or its length is negative, an
-       immediate error is given. Also, unless PCRE_NO_UTF[8|16|32] is  set,  a
-       UTF  subject  string is tested for validity. In the interests of speed,
-       these checks do not happen on the JIT fast path, and if invalid data is
-       passed, the result is undefined.
-
-       Bypassing  the  sanity  checks  and  the  pcre_exec() wrapping can give
-       speedups of more than 10%.
-
-
-SEE ALSO
-
-       pcreapi(3)
-
-
-AUTHOR
-
-       Philip Hazel (FAQ by Zoltan Herczeg)
-       University Computing Service
-       Cambridge CB2 3QH, England.
-
-
-REVISION
-
-       Last updated: 17 March 2013
-       Copyright (c) 1997-2013 University of Cambridge.
-------------------------------------------------------------------------------
-
-
-PCREPARTIAL(3)             Library Functions Manual             PCREPARTIAL(3)
-
-
-
-NAME
-       PCRE - Perl-compatible regular expressions
-
-PARTIAL MATCHING IN PCRE
-
-       In normal use of PCRE, if the subject string that is passed to a match-
-       ing function matches as far as it goes, but is too short to  match  the
-       entire pattern, PCRE_ERROR_NOMATCH is returned. There are circumstances
-       where it might be helpful to distinguish this case from other cases  in
-       which there is no match.
-
-       Consider, for example, an application where a human is required to type
-       in data for a field with specific formatting requirements.  An  example
-       might be a date in the form ddmmmyy, defined by this pattern:
-
-         ^\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d$
-
-       If the application sees the user's keystrokes one by one, and can check
-       that what has been typed so far is potentially valid,  it  is  able  to
-       raise  an  error  as  soon  as  a  mistake  is made, by beeping and not
-       reflecting the character that has been typed, for example. This immedi-
-       ate  feedback is likely to be a better user interface than a check that
-       is delayed until the entire string has been entered.  Partial  matching
-       can  also be useful when the subject string is very long and is not all
-       available at once.
-
-       PCRE supports partial matching by means of  the  PCRE_PARTIAL_SOFT  and
-       PCRE_PARTIAL_HARD  options,  which  can  be set when calling any of the
-       matching functions. For backwards compatibility, PCRE_PARTIAL is a syn-
-       onym  for  PCRE_PARTIAL_SOFT.  The essential difference between the two
-       options is whether or not a partial match is preferred to  an  alterna-
-       tive complete match, though the details differ between the two types of
-       matching function. If both options  are  set,  PCRE_PARTIAL_HARD  takes
-       precedence.
-
-       If  you  want to use partial matching with just-in-time optimized code,
-       you must call pcre_study(), pcre16_study() or  pcre32_study() with  one
-       or both of these options:
-
-         PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE
-         PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE
-
-       PCRE_STUDY_JIT_COMPILE  should also be set if you are going to run non-
-       partial matches on the same pattern. If the appropriate JIT study  mode
-       has not been set for a match, the interpretive matching code is used.
-
-       Setting a partial matching option disables two of PCRE's standard opti-
-       mizations. PCRE remembers the last literal data unit in a pattern,  and
-       abandons  matching  immediately  if  it  is  not present in the subject
-       string. This optimization cannot be used  for  a  subject  string  that
-       might  match only partially. If the pattern was studied, PCRE knows the
-       minimum length of a matching string, and does not  bother  to  run  the
-       matching  function  on  shorter strings. This optimization is also dis-
-       abled for partial matching.
-
-
-PARTIAL MATCHING USING pcre_exec() OR pcre[16|32]_exec()
-
-       A  partial   match   occurs   during   a   call   to   pcre_exec()   or
-       pcre[16|32]_exec()  when  the end of the subject string is reached suc-
-       cessfully, but matching cannot continue  because  more  characters  are
-       needed.   However, at least one character in the subject must have been
-       inspected. This character need not  form  part  of  the  final  matched
-       string;  lookbehind  assertions and the \K escape sequence provide ways
-       of inspecting characters before the start of a matched  substring.  The
-       requirement  for  inspecting  at  least one character exists because an
-       empty string can always be matched; without such  a  restriction  there
-       would  always  be  a partial match of an empty string at the end of the
-       subject.
-
-       If there are at least two slots in the offsets vector  when  a  partial
-       match  is returned, the first slot is set to the offset of the earliest
-       character that was inspected. For convenience, the second offset points
-       to the end of the subject so that a substring can easily be identified.
-       If there are at least three slots in the offsets vector, the third slot
-       is set to the offset of the character where matching started.
-
-       For the majority of patterns, the contents of the first and third slots
-       will be the same. However, for patterns that contain lookbehind  asser-
-       tions, or begin with \b or \B, characters before the one where matching
-       started may have been inspected while carrying out the match. For exam-
-       ple, consider this pattern:
-
-         /(?<=abc)123/
-
-       This pattern matches "123", but only if it is preceded by "abc". If the
-       subject string is "xyzabc12", the first two  offsets  after  a  partial
-       match  are for the substring "abc12", because all these characters were
-       inspected. However, the third offset is set to 6, because that  is  the
-       offset where matching began.
-
-       What happens when a partial match is identified depends on which of the
-       two partial matching options are set.
-
-   PCRE_PARTIAL_SOFT WITH pcre_exec() OR pcre[16|32]_exec()
-
-       If PCRE_PARTIAL_SOFT is  set  when  pcre_exec()  or  pcre[16|32]_exec()
-       identifies a partial match, the partial match is remembered, but match-
-       ing continues as normal, and other  alternatives  in  the  pattern  are
-       tried.  If  no  complete  match  can  be  found,  PCRE_ERROR_PARTIAL is
-       returned instead of PCRE_ERROR_NOMATCH.
-
-       This option is "soft" because it prefers a complete match over  a  par-
-       tial  match.   All the various matching items in a pattern behave as if
-       the subject string is potentially complete. For example, \z, \Z, and  $
-       match  at  the end of the subject, as normal, and for \b and \B the end
-       of the subject is treated as a non-alphanumeric.
-
-       If there is more than one partial match, the first one that  was  found
-       provides the data that is returned. Consider this pattern:
-
-         /123\w+X|dogY/
-
-       If  this is matched against the subject string "abc123dog", both alter-
-       natives fail to match, but the end of the  subject  is  reached  during
-       matching,  so  PCRE_ERROR_PARTIAL is returned. The offsets are set to 3
-       and 9, identifying "123dog" as the first partial match that was  found.
-       (In  this  example, there are two partial matches, because "dog" on its
-       own partially matches the second alternative.)
-
-   PCRE_PARTIAL_HARD WITH pcre_exec() OR pcre[16|32]_exec()
-
-       If PCRE_PARTIAL_HARD is  set  for  pcre_exec()  or  pcre[16|32]_exec(),
-       PCRE_ERROR_PARTIAL  is  returned  as  soon as a partial match is found,
-       without continuing to search for possible complete matches. This option
-       is "hard" because it prefers an earlier partial match over a later com-
-       plete match. For this reason, the assumption is made that  the  end  of
-       the  supplied  subject  string may not be the true end of the available
-       data, and so, if \z, \Z, \b, \B, or $ are encountered at the end of the
-       subject,  the  result is PCRE_ERROR_PARTIAL, provided that at least one
-       character in the subject has been inspected.
-
-       Setting PCRE_PARTIAL_HARD also affects the way UTF-8 and UTF-16 subject
-       strings  are checked for validity. Normally, an invalid sequence causes
-       the error PCRE_ERROR_BADUTF8 or PCRE_ERROR_BADUTF16.  However,  in  the
-       special  case  of  a  truncated  character  at  the end of the subject,
-       PCRE_ERROR_SHORTUTF8  or   PCRE_ERROR_SHORTUTF16   is   returned   when
-       PCRE_PARTIAL_HARD is set.
-
-   Comparing hard and soft partial matching
-
-       The  difference  between the two partial matching options can be illus-
-       trated by a pattern such as:
-
-         /dog(sbody)?/
-
-       This matches either "dog" or "dogsbody", greedily (that is, it  prefers
-       the  longer  string  if  possible). If it is matched against the string
-       "dog" with PCRE_PARTIAL_SOFT, it yields a  complete  match  for  "dog".
-       However, if PCRE_PARTIAL_HARD is set, the result is PCRE_ERROR_PARTIAL.
-       On the other hand, if the pattern is made ungreedy the result  is  dif-
-       ferent:
-
-         /dog(sbody)??/
-
-       In  this  case  the  result  is always a complete match because that is
-       found first, and matching never  continues  after  finding  a  complete
-       match. It might be easier to follow this explanation by thinking of the
-       two patterns like this:
-
-         /dog(sbody)?/    is the same as  /dogsbody|dog/
-         /dog(sbody)??/   is the same as  /dog|dogsbody/
-
-       The second pattern will never match "dogsbody", because it will  always
-       find the shorter match first.
-
-
-PARTIAL MATCHING USING pcre_dfa_exec() OR pcre[16|32]_dfa_exec()
-
-       The DFA functions move along the subject string character by character,
-       without backtracking, searching for  all  possible  matches  simultane-
-       ously.  If the end of the subject is reached before the end of the pat-
-       tern, there is the possibility of a partial match, again provided  that
-       at least one character has been inspected.
-
-       When  PCRE_PARTIAL_SOFT  is set, PCRE_ERROR_PARTIAL is returned only if
-       there have been no complete matches. Otherwise,  the  complete  matches
-       are  returned.   However,  if PCRE_PARTIAL_HARD is set, a partial match
-       takes precedence over any complete matches. The portion of  the  string
-       that  was  inspected when the longest partial match was found is set as
-       the first matching string, provided there are at least two slots in the
-       offsets vector.
-
-       Because  the  DFA functions always search for all possible matches, and
-       there is no difference between greedy and  ungreedy  repetition,  their
-       behaviour  is  different  from  the  standard  functions when PCRE_PAR-
-       TIAL_HARD is  set.  Consider  the  string  "dog"  matched  against  the
-       ungreedy pattern shown above:
-
-         /dog(sbody)??/
-
-       Whereas  the  standard functions stop as soon as they find the complete
-       match for "dog", the DFA functions also  find  the  partial  match  for
-       "dogsbody", and so return that when PCRE_PARTIAL_HARD is set.
-
-
-PARTIAL MATCHING AND WORD BOUNDARIES
-
-       If  a  pattern ends with one of sequences \b or \B, which test for word
-       boundaries, partial matching with PCRE_PARTIAL_SOFT can  give  counter-
-       intuitive results. Consider this pattern:
-
-         /\bcat\b/
-
-       This matches "cat", provided there is a word boundary at either end. If
-       the subject string is "the cat", the comparison of the final "t" with a
-       following  character  cannot  take  place, so a partial match is found.
-       However, normal matching carries on, and \b matches at the end  of  the
-       subject  when  the  last  character is a letter, so a complete match is
-       found.  The  result,  therefore,  is  not   PCRE_ERROR_PARTIAL.   Using
-       PCRE_PARTIAL_HARD  in  this case does yield PCRE_ERROR_PARTIAL, because
-       then the partial match takes precedence.
-
-
-FORMERLY RESTRICTED PATTERNS
-
-       For releases of PCRE prior to 8.00, because of the way certain internal
-       optimizations   were  implemented  in  the  pcre_exec()  function,  the
-       PCRE_PARTIAL option (predecessor of  PCRE_PARTIAL_SOFT)  could  not  be
-       used  with all patterns. From release 8.00 onwards, the restrictions no
-       longer apply, and partial matching with can be requested for  any  pat-
-       tern.
-
-       Items that were formerly restricted were repeated single characters and
-       repeated metasequences. If PCRE_PARTIAL was set for a pattern that  did
-       not  conform  to  the restrictions, pcre_exec() returned the error code
-       PCRE_ERROR_BADPARTIAL (-13). This error code is no longer in  use.  The
-       PCRE_INFO_OKPARTIAL  call  to pcre_fullinfo() to find out if a compiled
-       pattern can be used for partial matching now always returns 1.
-
-
-EXAMPLE OF PARTIAL MATCHING USING PCRETEST
-
-       If the escape sequence \P is present  in  a  pcretest  data  line,  the
-       PCRE_PARTIAL_SOFT  option  is  used  for  the  match.  Here is a run of
-       pcretest that uses the date example quoted above:
-
-           re> /^\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d$/
-         data> 25jun04\P
-          0: 25jun04
-          1: jun
-         data> 25dec3\P
-         Partial match: 23dec3
-         data> 3ju\P
-         Partial match: 3ju
-         data> 3juj\P
-         No match
-         data> j\P
-         No match
-
-       The first data string is matched  completely,  so  pcretest  shows  the
-       matched  substrings.  The  remaining four strings do not match the com-
-       plete pattern, but the first two are partial matches. Similar output is
-       obtained if DFA matching is used.
-
-       If  the escape sequence \P is present more than once in a pcretest data
-       line, the PCRE_PARTIAL_HARD option is set for the match.
-
-
-MULTI-SEGMENT MATCHING WITH pcre_dfa_exec() OR pcre[16|32]_dfa_exec()
-
-       When a partial match has been found using a DFA matching  function,  it
-       is  possible to continue the match by providing additional subject data
-       and calling the function again with the same compiled  regular  expres-
-       sion,  this time setting the PCRE_DFA_RESTART option. You must pass the
-       same working space as before, because this is where details of the pre-
-       vious  partial  match  are  stored.  Here is an example using pcretest,
-       using the \R escape sequence to set  the  PCRE_DFA_RESTART  option  (\D
-       specifies the use of the DFA matching function):
-
-           re> /^\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d$/
-         data> 23ja\P\D
-         Partial match: 23ja
-         data> n05\R\D
-          0: n05
-
-       The  first  call has "23ja" as the subject, and requests partial match-
-       ing; the second call  has  "n05"  as  the  subject  for  the  continued
-       (restarted)  match.   Notice  that when the match is complete, only the
-       last part is shown; PCRE does  not  retain  the  previously  partially-
-       matched  string. It is up to the calling program to do that if it needs
-       to.
-
-       That means that, for an unanchored pattern, if a continued match fails,
-       it  is  not  possible  to  try  again at a new starting point. All this
-       facility is capable of doing is  continuing  with  the  previous  match
-       attempt.  In  the previous example, if the second set of data is "ug23"
-       the result is no match, even though there would be a match for  "aug23"
-       if  the entire string were given at once. Depending on the application,
-       this may or may not be what you want.  The only way to allow for start-
-       ing  again  at  the next character is to retain the matched part of the
-       subject and try a new complete match.
-
-       You can set the PCRE_PARTIAL_SOFT  or  PCRE_PARTIAL_HARD  options  with
-       PCRE_DFA_RESTART  to  continue partial matching over multiple segments.
-       This facility can be used to pass very long subject strings to the  DFA
-       matching functions.
-
-
-MULTI-SEGMENT MATCHING WITH pcre_exec() OR pcre[16|32]_exec()
-
-       From  release 8.00, the standard matching functions can also be used to
-       do multi-segment matching. Unlike the DFA functions, it is not possible
-       to  restart the previous match with a new segment of data. Instead, new
-       data must be added to the previous subject string, and the entire match
-       re-run,  starting from the point where the partial match occurred. Ear-
-       lier data can be discarded.
-
-       It is best to use PCRE_PARTIAL_HARD in this situation, because it  does
-       not  treat the end of a segment as the end of the subject when matching
-       \z, \Z, \b, \B, and $. Consider  an  unanchored  pattern  that  matches
-       dates:
-
-           re> /\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d/
-         data> The date is 23ja\P\P
-         Partial match: 23ja
-
-       At  this stage, an application could discard the text preceding "23ja",
-       add on text from the next  segment,  and  call  the  matching  function
-       again.  Unlike  the  DFA matching functions, the entire matching string
-       must always be available, and the complete matching process occurs  for
-       each call, so more memory and more processing time is needed.
-
-       Note:  If  the pattern contains lookbehind assertions, or \K, or starts
-       with \b or \B, the string that is returned for a partial match includes
-       characters  that precede the start of what would be returned for a com-
-       plete match, because it contains all the characters that were inspected
-       during the partial match.
-
-
-ISSUES WITH MULTI-SEGMENT MATCHING
-
-       Certain types of pattern may give problems with multi-segment matching,
-       whichever matching function is used.
-
-       1. If the pattern contains a test for the beginning of a line, you need
-       to  pass  the  PCRE_NOTBOL  option when the subject string for any call
-       does start at the beginning of a line.  There  is  also  a  PCRE_NOTEOL
-       option, but in practice when doing multi-segment matching you should be
-       using PCRE_PARTIAL_HARD, which includes the effect of PCRE_NOTEOL.
-
-       2. Lookbehind assertions that have already been obeyed are catered  for
-       in the offsets that are returned for a partial match. However a lookbe-
-       hind assertion later in the pattern could require even earlier  charac-
-       ters   to  be  inspected.  You  can  handle  this  case  by  using  the
-       PCRE_INFO_MAXLOOKBEHIND    option    of    the    pcre_fullinfo()    or
-       pcre[16|32]_fullinfo()  functions  to  obtain the length of the longest
-       lookbehind in the pattern. This length  is  given  in  characters,  not
-       bytes.  If  you  always retain at least that many characters before the
-       partially matched string, all should be  well.  (Of  course,  near  the
-       start of the subject, fewer characters may be present; in that case all
-       characters should be retained.)
-
-       From release 8.33, there is a more accurate way of deciding which char-
-       acters  to  retain.  Instead  of  subtracting the length of the longest
-       lookbehind from the  earliest  inspected  character  (offsets[0]),  the
-       match  start  position  (offsets[2]) should be used, and the next match
-       attempt started at the offsets[2] character by setting the  startoffset
-       argument of pcre_exec() or pcre_dfa_exec().
-
-       For  example, if the pattern "(?<=123)abc" is partially matched against
-       the string "xx123a", the three offset values returned are 2, 6, and  5.
-       This  indicates  that  the  matching  process that gave a partial match
-       started at offset 5, but the characters "123a" were all inspected.  The
-       maximum  lookbehind  for  that pattern is 3, so taking that away from 5
-       shows that we need only keep "123a", and the next match attempt can  be
-       started at offset 3 (that is, at "a") when further characters have been
-       added. When the match start is not the  earliest  inspected  character,
-       pcretest shows it explicitly:
-
-           re> "(?<=123)abc"
-         data> xx123a\P\P
-         Partial match at offset 5: 123a
-
-       3.  Because a partial match must always contain at least one character,
-       what might be considered a partial match of an  empty  string  actually
-       gives a "no match" result. For example:
-
-           re> /c(?<=abc)x/
-         data> ab\P
-         No match
-
-       If the next segment begins "cx", a match should be found, but this will
-       only happen if characters from the previous segment are  retained.  For
-       this  reason,  a  "no  match"  result should be interpreted as "partial
-       match of an empty string" when the pattern contains lookbehinds.
-
-       4. Matching a subject string that is split into multiple  segments  may
-       not  always produce exactly the same result as matching over one single
-       long string, especially when PCRE_PARTIAL_SOFT  is  used.  The  section
-       "Partial  Matching  and  Word Boundaries" above describes an issue that
-       arises if the pattern ends with \b or \B. Another  kind  of  difference
-       may  occur when there are multiple matching possibilities, because (for
-       PCRE_PARTIAL_SOFT) a partial match result is given only when there  are
-       no completed matches. This means that as soon as the shortest match has
-       been found, continuation to a new subject segment is no  longer  possi-
-       ble. Consider again this pcretest example:
-
-           re> /dog(sbody)?/
-         data> dogsb\P
-          0: dog
-         data> do\P\D
-         Partial match: do
-         data> gsb\R\P\D
-          0: g
-         data> dogsbody\D
-          0: dogsbody
-          1: dog
-
-       The  first  data  line passes the string "dogsb" to a standard matching
-       function, setting the PCRE_PARTIAL_SOFT option. Although the string  is
-       a  partial  match for "dogsbody", the result is not PCRE_ERROR_PARTIAL,
-       because the shorter string "dog" is a complete match.  Similarly,  when
-       the  subject  is  presented to a DFA matching function in several parts
-       ("do" and "gsb" being the first two) the match  stops  when  "dog"  has
-       been  found, and it is not possible to continue.  On the other hand, if
-       "dogsbody" is presented as a single string,  a  DFA  matching  function
-       finds both matches.
-
-       Because  of  these  problems,  it is best to use PCRE_PARTIAL_HARD when
-       matching multi-segment data. The example  above  then  behaves  differ-
-       ently:
-
-           re> /dog(sbody)?/
-         data> dogsb\P\P
-         Partial match: dogsb
-         data> do\P\D
-         Partial match: do
-         data> gsb\R\P\P\D
-         Partial match: gsb
-
-       5. Patterns that contain alternatives at the top level which do not all
-       start with the  same  pattern  item  may  not  work  as  expected  when
-       PCRE_DFA_RESTART is used. For example, consider this pattern:
-
-         1234|3789
-
-       If  the  first  part of the subject is "ABC123", a partial match of the
-       first alternative is found at offset 3. There is no partial  match  for
-       the second alternative, because such a match does not start at the same
-       point in the subject string. Attempting to  continue  with  the  string
-       "7890"  does  not  yield  a  match because only those alternatives that
-       match at one point in the subject are remembered.  The  problem  arises
-       because  the  start  of the second alternative matches within the first
-       alternative. There is no problem with  anchored  patterns  or  patterns
-       such as:
-
-         1234|ABCD
-
-       where  no  string can be a partial match for both alternatives. This is
-       not a problem if a standard matching  function  is  used,  because  the
-       entire match has to be rerun each time:
-
-           re> /1234|3789/
-         data> ABC123\P\P
-         Partial match: 123
-         data> 1237890
-          0: 3789
-
-       Of course, instead of using PCRE_DFA_RESTART, the same technique of re-
-       running the entire match can also be used with the DFA  matching  func-
-       tions.  Another  possibility  is to work with two buffers. If a partial
-       match at offset n in the first buffer is followed by  "no  match"  when
-       PCRE_DFA_RESTART  is  used on the second buffer, you can then try a new
-       match starting at offset n+1 in the first buffer.
-
-
-AUTHOR
-
-       Philip Hazel
-       University Computing Service
-       Cambridge CB2 3QH, England.
-
-
-REVISION
-
-       Last updated: 02 July 2013
-       Copyright (c) 1997-2013 University of Cambridge.
-------------------------------------------------------------------------------
-
-
-PCREPRECOMPILE(3)          Library Functions Manual          PCREPRECOMPILE(3)
-
-
-
-NAME
-       PCRE - Perl-compatible regular expressions
-
-SAVING AND RE-USING PRECOMPILED PCRE PATTERNS
-
-       If  you  are running an application that uses a large number of regular
-       expression patterns, it may be useful to store them  in  a  precompiled
-       form  instead  of  having to compile them every time the application is
-       run.  If you are not  using  any  private  character  tables  (see  the
-       pcre_maketables()  documentation),  this is relatively straightforward.
-       If you are using private tables, it is a little bit  more  complicated.
-       However,  if you are using the just-in-time optimization feature, it is
-       not possible to save and reload the JIT data.
-
-       If you save compiled patterns to a file, you can copy them to a differ-
-       ent host and run them there. If the two hosts have different endianness
-       (byte    order),    you     should     run     the     pcre[16|32]_pat-
-       tern_to_host_byte_order()  function  on  the  new host before trying to
-       match the pattern. The matching functions return  PCRE_ERROR_BADENDIAN-
-       NESS if they detect a pattern with the wrong endianness.
-
-       Compiling  regular  expressions with one version of PCRE for use with a
-       different version is not guaranteed to work and may cause crashes,  and
-       saving  and  restoring  a  compiled  pattern loses any JIT optimization
-       data.
-
-
-SAVING A COMPILED PATTERN
-
-       The value returned by pcre[16|32]_compile() points to a single block of
-       memory  that  holds  the  compiled pattern and associated data. You can
-       find   the   length   of   this   block    in    bytes    by    calling
-       pcre[16|32]_fullinfo() with an argument of PCRE_INFO_SIZE. You can then
-       save the data in any appropriate manner. Here is sample  code  for  the
-       8-bit  library  that  compiles  a  pattern  and writes it to a file. It
-       assumes that the variable fd refers to a file that is open for output:
-
-         int erroroffset, rc, size;
-         char *error;
-         pcre *re;
-
-         re = pcre_compile("my pattern", 0, &error, &erroroffset, NULL);
-         if (re == NULL) { ... handle errors ... }
-         rc = pcre_fullinfo(re, NULL, PCRE_INFO_SIZE, &size);
-         if (rc < 0) { ... handle errors ... }
-         rc = fwrite(re, 1, size, fd);
-         if (rc != size) { ... handle errors ... }
-
-       In this example, the bytes  that  comprise  the  compiled  pattern  are
-       copied  exactly.  Note that this is binary data that may contain any of
-       the 256 possible byte  values.  On  systems  that  make  a  distinction
-       between binary and non-binary data, be sure that the file is opened for
-       binary output.
-
-       If you want to write more than one pattern to a file, you will have  to
-       devise  a  way of separating them. For binary data, preceding each pat-
-       tern with its length is probably  the  most  straightforward  approach.
-       Another  possibility is to write out the data in hexadecimal instead of
-       binary, one pattern to a line.
-
-       Saving compiled patterns in a file is only one possible way of  storing
-       them  for later use. They could equally well be saved in a database, or
-       in the memory of some daemon process that passes them  via  sockets  to
-       the processes that want them.
-
-       If the pattern has been studied, it is also possible to save the normal
-       study data in a similar way to the compiled pattern itself. However, if
-       the PCRE_STUDY_JIT_COMPILE was used, the just-in-time data that is cre-
-       ated cannot be saved because it is too dependent on the  current  envi-
-       ronment.    When    studying    generates    additional    information,
-       pcre[16|32]_study() returns  a  pointer  to  a  pcre[16|32]_extra  data
-       block.  Its  format  is defined in the section on matching a pattern in
-       the pcreapi documentation. The study_data field points  to  the  binary
-       study  data,  and this is what you must save (not the pcre[16|32]_extra
-       block itself). The length of the study data can be obtained by  calling
-       pcre[16|32]_fullinfo()  with an argument of PCRE_INFO_STUDYSIZE. Remem-
-       ber to check that  pcre[16|32]_study()  did  return  a  non-NULL  value
-       before trying to save the study data.
-
-
-RE-USING A PRECOMPILED PATTERN
-
-       Re-using  a  precompiled pattern is straightforward. Having reloaded it
-       into main memory,  called  pcre[16|32]_pattern_to_host_byte_order()  if
-       necessary,    you   pass   its   pointer   to   pcre[16|32]_exec()   or
-       pcre[16|32]_dfa_exec() in the usual way.
-
-       However, if you passed a pointer to custom character  tables  when  the
-       pattern  was compiled (the tableptr argument of pcre[16|32]_compile()),
-       you  must  now  pass  a  similar  pointer  to   pcre[16|32]_exec()   or
-       pcre[16|32]_dfa_exec(),  because the value saved with the compiled pat-
-       tern will obviously be nonsense. A field in a pcre[16|32]_extra() block
-       is  used  to  pass this data, as described in the section on matching a
-       pattern in the pcreapi documentation.
-
-       Warning: The tables that pcre_exec() and pcre_dfa_exec()  use  must  be
-       the same as those that were used when the pattern was compiled. If this
-       is not the case, the behaviour is undefined.
-
-       If you did not provide custom character tables  when  the  pattern  was
-       compiled, the pointer in the compiled pattern is NULL, which causes the
-       matching functions to use PCRE's internal tables. Thus, you do not need
-       to take any special action at run time in this case.
-
-       If  you  saved study data with the compiled pattern, you need to create
-       your own pcre[16|32]_extra data block and set the study_data  field  to
-       point   to   the   reloaded   study   data.   You  must  also  set  the
-       PCRE_EXTRA_STUDY_DATA bit in the flags field  to  indicate  that  study
-       data  is present. Then pass the pcre[16|32]_extra block to the matching
-       function in the usual way. If the pattern was studied for  just-in-time
-       optimization,  that  data  cannot  be  saved,  and  so  is  lost  by  a
-       save/restore cycle.
-
-
-COMPATIBILITY WITH DIFFERENT PCRE RELEASES
-
-       In general, it is safest to  recompile  all  saved  patterns  when  you
-       update  to  a new PCRE release, though not all updates actually require
-       this.
-
-
-AUTHOR
-
-       Philip Hazel
-       University Computing Service
-       Cambridge CB2 3QH, England.
-
-
-REVISION
-
-       Last updated: 12 November 2013
-       Copyright (c) 1997-2013 University of Cambridge.
-------------------------------------------------------------------------------
-
-
-PCREPERFORM(3)             Library Functions Manual             PCREPERFORM(3)
-
-
-
-NAME
-       PCRE - Perl-compatible regular expressions
-
-PCRE PERFORMANCE
-
-       Two  aspects  of performance are discussed below: memory usage and pro-
-       cessing time. The way you express your pattern as a regular  expression
-       can affect both of them.
-
-
-COMPILED PATTERN MEMORY USAGE
-
-       Patterns  are compiled by PCRE into a reasonably efficient interpretive
-       code, so that most simple patterns do not  use  much  memory.  However,
-       there  is  one case where the memory usage of a compiled pattern can be
-       unexpectedly large. If a parenthesized subpattern has a quantifier with
-       a minimum greater than 1 and/or a limited maximum, the whole subpattern
-       is repeated in the compiled code. For example, the pattern
-
-         (abc|def){2,4}
-
-       is compiled as if it were
-
-         (abc|def)(abc|def)((abc|def)(abc|def)?)?
-
-       (Technical aside: It is done this way so that backtrack  points  within
-       each of the repetitions can be independently maintained.)
-
-       For  regular expressions whose quantifiers use only small numbers, this
-       is not usually a problem. However, if the numbers are large,  and  par-
-       ticularly  if  such repetitions are nested, the memory usage can become
-       an embarrassment. For example, the very simple pattern
-
-         ((ab){1,1000}c){1,3}
-
-       uses 51K bytes when compiled using the 8-bit library. When PCRE is com-
-       piled  with  its  default  internal pointer size of two bytes, the size
-       limit on a compiled pattern is 64K data units, and this is reached with
-       the  above  pattern  if  the outer repetition is increased from 3 to 4.
-       PCRE can be compiled to use larger internal pointers  and  thus  handle
-       larger  compiled patterns, but it is better to try to rewrite your pat-
-       tern to use less memory if you can.
-
-       One way of reducing the memory usage for such patterns is to  make  use
-       of PCRE's "subroutine" facility. Re-writing the above pattern as
-
-         ((ab)(?2){0,999}c)(?1){0,2}
-
-       reduces the memory requirements to 18K, and indeed it remains under 20K
-       even with the outer repetition increased to 100. However, this  pattern
-       is  not  exactly equivalent, because the "subroutine" calls are treated
-       as atomic groups into which there can be no backtracking if there is  a
-       subsequent  matching  failure.  Therefore,  PCRE cannot do this kind of
-       rewriting automatically.  Furthermore, there is a  noticeable  loss  of
-       speed  when executing the modified pattern. Nevertheless, if the atomic
-       grouping is not a problem and the loss of  speed  is  acceptable,  this
-       kind  of  rewriting will allow you to process patterns that PCRE cannot
-       otherwise handle.
-
-
-STACK USAGE AT RUN TIME
-
-       When pcre_exec() or pcre[16|32]_exec() is used  for  matching,  certain
-       kinds  of  pattern  can  cause  it  to use large amounts of the process
-       stack. In some environments the default process stack is  quite  small,
-       and  if it runs out the result is often SIGSEGV. This issue is probably
-       the most frequently raised problem with PCRE.  Rewriting  your  pattern
-       can  often  help.  The  pcrestack documentation discusses this issue in
-       detail.
-
-
-PROCESSING TIME
-
-       Certain items in regular expression patterns are processed  more  effi-
-       ciently than others. It is more efficient to use a character class like
-       [aeiou]  than  a  set  of   single-character   alternatives   such   as
-       (a|e|i|o|u).  In  general,  the simplest construction that provides the
-       required behaviour is usually the most efficient. Jeffrey Friedl's book
-       contains  a  lot  of useful general discussion about optimizing regular
-       expressions for efficient performance. This  document  contains  a  few
-       observations about PCRE.
-
-       Using  Unicode  character  properties  (the  \p, \P, and \X escapes) is
-       slow, because PCRE has to use a multi-stage table  lookup  whenever  it
-       needs  a  character's  property. If you can find an alternative pattern
-       that does not use character properties, it will probably be faster.
-
-       By default, the escape sequences \b, \d, \s,  and  \w,  and  the  POSIX
-       character  classes  such  as  [:alpha:]  do not use Unicode properties,
-       partly for backwards compatibility, and partly for performance reasons.
-       However,  you can set PCRE_UCP if you want Unicode character properties
-       to be used. This can double the matching time for  items  such  as  \d,
-       when matched with a traditional matching function; the performance loss
-       is less with a DFA matching function, and in both cases  there  is  not
-       much difference for \b.
-
-       When  a  pattern  begins  with .* not in parentheses, or in parentheses
-       that are not the subject of a backreference, and the PCRE_DOTALL option
-       is  set, the pattern is implicitly anchored by PCRE, since it can match
-       only at the start of a subject string. However, if PCRE_DOTALL  is  not
-       set,  PCRE  cannot  make this optimization, because the . metacharacter
-       does not then match a newline, and if the subject string contains  new-
-       lines,  the  pattern may match from the character immediately following
-       one of them instead of from the very start. For example, the pattern
-
-         .*second
-
-       matches the subject "first\nand second" (where \n stands for a  newline
-       character),  with the match starting at the seventh character. In order
-       to do this, PCRE has to retry the match starting after every newline in
-       the subject.
-
-       If  you  are using such a pattern with subject strings that do not con-
-       tain newlines, the best performance is obtained by setting PCRE_DOTALL,
-       or  starting  the pattern with ^.* or ^.*? to indicate explicit anchor-
-       ing. That saves PCRE from having to scan along the subject looking  for
-       a newline to restart at.
-
-       Beware  of  patterns  that contain nested indefinite repeats. These can
-       take a long time to run when applied to a string that does  not  match.
-       Consider the pattern fragment
-
-         ^(a+)*
-
-       This  can  match "aaaa" in 16 different ways, and this number increases
-       very rapidly as the string gets longer. (The * repeat can match  0,  1,
-       2,  3, or 4 times, and for each of those cases other than 0 or 4, the +
-       repeats can match different numbers of times.) When  the  remainder  of
-       the pattern is such that the entire match is going to fail, PCRE has in
-       principle to try  every  possible  variation,  and  this  can  take  an
-       extremely long time, even for relatively short strings.
-
-       An optimization catches some of the more simple cases such as
-
-         (a+)*b
-
-       where  a  literal  character  follows. Before embarking on the standard
-       matching procedure, PCRE checks that there is a "b" later in  the  sub-
-       ject  string, and if there is not, it fails the match immediately. How-
-       ever, when there is no following literal this  optimization  cannot  be
-       used. You can see the difference by comparing the behaviour of
-
-         (a+)*\d
-
-       with  the  pattern  above.  The former gives a failure almost instantly
-       when applied to a whole line of  "a"  characters,  whereas  the  latter
-       takes an appreciable time with strings longer than about 20 characters.
-
-       In many cases, the solution to this kind of performance issue is to use
-       an atomic group or a possessive quantifier.
-
-
-AUTHOR
-
-       Philip Hazel
-       University Computing Service
-       Cambridge CB2 3QH, England.
-
-
-REVISION
-
-       Last updated: 25 August 2012
-       Copyright (c) 1997-2012 University of Cambridge.
-------------------------------------------------------------------------------
-
-
-PCREPOSIX(3)               Library Functions Manual               PCREPOSIX(3)
-
-
-
-NAME
-       PCRE - Perl-compatible regular expressions.
-
-SYNOPSIS
-
-       #include <pcreposix.h>
-
-       int regcomp(regex_t *preg, const char *pattern,
-            int cflags);
-
-       int regexec(regex_t *preg, const char *string,
-            size_t nmatch, regmatch_t pmatch[], int eflags);
-            size_t regerror(int errcode, const regex_t *preg,
-            char *errbuf, size_t errbuf_size);
-
-       void regfree(regex_t *preg);
-
-
-DESCRIPTION
-
-       This  set  of functions provides a POSIX-style API for the PCRE regular
-       expression 8-bit library. See the pcreapi documentation for a  descrip-
-       tion  of  PCRE's native API, which contains much additional functional-
-       ity. There is no POSIX-style  wrapper  for  PCRE's  16-bit  and  32-bit
-       library.
-
-       The functions described here are just wrapper functions that ultimately
-       call  the  PCRE  native  API.  Their  prototypes  are  defined  in  the
-       pcreposix.h  header  file,  and  on  Unix systems the library itself is
-       called pcreposix.a, so can be accessed by  adding  -lpcreposix  to  the
-       command  for  linking  an application that uses them. Because the POSIX
-       functions call the native ones, it is also necessary to add -lpcre.
-
-       I have implemented only those POSIX option bits that can be  reasonably
-       mapped  to PCRE native options. In addition, the option REG_EXTENDED is
-       defined with the value zero. This has no  effect,  but  since  programs
-       that  are  written  to  the POSIX interface often use it, this makes it
-       easier to slot in PCRE as a replacement library.  Other  POSIX  options
-       are not even defined.
-
-       There  are also some other options that are not defined by POSIX. These
-       have been added at the request of users who want to make use of certain
-       PCRE-specific features via the POSIX calling interface.
-
-       When  PCRE  is  called  via these functions, it is only the API that is
-       POSIX-like in style. The syntax and semantics of  the  regular  expres-
-       sions  themselves  are  still  those of Perl, subject to the setting of
-       various PCRE options, as described below. "POSIX-like in  style"  means
-       that  the  API  approximates  to  the POSIX definition; it is not fully
-       POSIX-compatible, and in multi-byte encoding  domains  it  is  probably
-       even less compatible.
-
-       The  header for these functions is supplied as pcreposix.h to avoid any
-       potential clash with other POSIX  libraries.  It  can,  of  course,  be
-       renamed or aliased as regex.h, which is the "correct" name. It provides
-       two structure types, regex_t for  compiled  internal  forms,  and  reg-
-       match_t  for  returning  captured substrings. It also defines some con-
-       stants whose names start  with  "REG_";  these  are  used  for  setting
-       options and identifying error codes.
-
-
-COMPILING A PATTERN
-
-       The  function regcomp() is called to compile a pattern into an internal
-       form. The pattern is a C string terminated by a  binary  zero,  and  is
-       passed  in  the  argument  pattern. The preg argument is a pointer to a
-       regex_t structure that is used as a base for storing information  about
-       the compiled regular expression.
-
-       The argument cflags is either zero, or contains one or more of the bits
-       defined by the following macros:
-
-         REG_DOTALL
-
-       The PCRE_DOTALL option is set when the regular expression is passed for
-       compilation to the native function. Note that REG_DOTALL is not part of
-       the POSIX standard.
-
-         REG_ICASE
-
-       The PCRE_CASELESS option is set when the regular expression  is  passed
-       for compilation to the native function.
-
-         REG_NEWLINE
-
-       The  PCRE_MULTILINE option is set when the regular expression is passed
-       for compilation to the native function. Note that this does  not  mimic
-       the  defined  POSIX  behaviour  for REG_NEWLINE (see the following sec-
-       tion).
-
-         REG_NOSUB
-
-       The PCRE_NO_AUTO_CAPTURE option is set when the regular  expression  is
-       passed for compilation to the native function. In addition, when a pat-
-       tern that is compiled with this flag is passed to regexec() for  match-
-       ing,  the  nmatch  and  pmatch  arguments  are ignored, and no captured
-       strings are returned.
-
-         REG_UCP
-
-       The PCRE_UCP option is set when the regular expression  is  passed  for
-       compilation  to  the  native  function. This causes PCRE to use Unicode
-       properties when matchine \d, \w,  etc.,  instead  of  just  recognizing
-       ASCII values. Note that REG_UTF8 is not part of the POSIX standard.
-
-         REG_UNGREEDY
-
-       The  PCRE_UNGREEDY  option is set when the regular expression is passed
-       for compilation to the native function. Note that REG_UNGREEDY  is  not
-       part of the POSIX standard.
-
-         REG_UTF8
-
-       The  PCRE_UTF8  option is set when the regular expression is passed for
-       compilation to the native function. This causes the pattern itself  and
-       all  data  strings used for matching it to be treated as UTF-8 strings.
-       Note that REG_UTF8 is not part of the POSIX standard.
-
-       In the absence of these flags, no options  are  passed  to  the  native
-       function.   This  means  the  the  regex  is compiled with PCRE default
-       semantics. In particular, the way it handles newline characters in  the
-       subject  string  is  the Perl way, not the POSIX way. Note that setting
-       PCRE_MULTILINE has only some of the effects specified for  REG_NEWLINE.
-       It  does not affect the way newlines are matched by . (they are not) or
-       by a negative class such as [^a] (they are).
-
-       The yield of regcomp() is zero on success, and non-zero otherwise.  The
-       preg structure is filled in on success, and one member of the structure
-       is public: re_nsub contains the number of capturing subpatterns in  the
-       regular expression. Various error codes are defined in the header file.
-
-       NOTE:  If  the  yield of regcomp() is non-zero, you must not attempt to
-       use the contents of the preg structure. If, for example, you pass it to
-       regexec(), the result is undefined and your program is likely to crash.
-
-
-MATCHING NEWLINE CHARACTERS
-
-       This area is not simple, because POSIX and Perl take different views of
-       things.  It is not possible to get PCRE to obey  POSIX  semantics,  but
-       then  PCRE was never intended to be a POSIX engine. The following table
-       lists the different possibilities for matching  newline  characters  in
-       PCRE:
-
-                                 Default   Change with
-
-         . matches newline          no     PCRE_DOTALL
-         newline matches [^a]       yes    not changeable
-         $ matches \n at end        yes    PCRE_DOLLARENDONLY
-         $ matches \n in middle     no     PCRE_MULTILINE
-         ^ matches \n in middle     no     PCRE_MULTILINE
-
-       This is the equivalent table for POSIX:
-
-                                 Default   Change with
-
-         . matches newline          yes    REG_NEWLINE
-         newline matches [^a]       yes    REG_NEWLINE
-         $ matches \n at end        no     REG_NEWLINE
-         $ matches \n in middle     no     REG_NEWLINE
-         ^ matches \n in middle     no     REG_NEWLINE
-
-       PCRE's behaviour is the same as Perl's, except that there is no equiva-
-       lent for PCRE_DOLLAR_ENDONLY in Perl. In both PCRE and Perl,  there  is
-       no way to stop newline from matching [^a].
-
-       The   default  POSIX  newline  handling  can  be  obtained  by  setting
-       PCRE_DOTALL and PCRE_DOLLAR_ENDONLY, but there is no way to  make  PCRE
-       behave exactly as for the REG_NEWLINE action.
-
-
-MATCHING A PATTERN
-
-       The  function  regexec()  is  called  to  match a compiled pattern preg
-       against a given string, which is by default terminated by a  zero  byte
-       (but  see  REG_STARTEND below), subject to the options in eflags. These
-       can be:
-
-         REG_NOTBOL
-
-       The PCRE_NOTBOL option is set when calling the underlying PCRE matching
-       function.
-
-         REG_NOTEMPTY
-
-       The PCRE_NOTEMPTY option is set when calling the underlying PCRE match-
-       ing function. Note that REG_NOTEMPTY is not part of the POSIX standard.
-       However, setting this option can give more POSIX-like behaviour in some
-       situations.
-
-         REG_NOTEOL
-
-       The PCRE_NOTEOL option is set when calling the underlying PCRE matching
-       function.
-
-         REG_STARTEND
-
-       The  string  is  considered to start at string + pmatch[0].rm_so and to
-       have a terminating NUL located at string + pmatch[0].rm_eo (there  need
-       not  actually  be  a  NUL at that location), regardless of the value of
-       nmatch. This is a BSD extension, compatible with but not  specified  by
-       IEEE  Standard  1003.2  (POSIX.2),  and  should be used with caution in
-       software intended to be portable to other systems. Note that a non-zero
-       rm_so does not imply REG_NOTBOL; REG_STARTEND affects only the location
-       of the string, not how it is matched.
-
-       If the pattern was compiled with the REG_NOSUB flag, no data about  any
-       matched  strings  is  returned.  The  nmatch  and  pmatch  arguments of
-       regexec() are ignored.
-
-       If the value of nmatch is zero, or if the value pmatch is NULL, no data
-       about any matched strings is returned.
-
-       Otherwise,the portion of the string that was matched, and also any cap-
-       tured substrings, are returned via the pmatch argument, which points to
-       an  array  of nmatch structures of type regmatch_t, containing the mem-
-       bers rm_so and rm_eo. These contain the offset to the  first  character
-       of  each  substring and the offset to the first character after the end
-       of each substring, respectively. The 0th element of the vector  relates
-       to  the  entire portion of string that was matched; subsequent elements
-       relate to the capturing subpatterns of the regular  expression.  Unused
-       entries in the array have both structure members set to -1.
-
-       A  successful  match  yields  a  zero  return;  various error codes are
-       defined in the header file, of  which  REG_NOMATCH  is  the  "expected"
-       failure code.
-
-
-ERROR MESSAGES
-
-       The regerror() function maps a non-zero errorcode from either regcomp()
-       or regexec() to a printable message. If preg is  not  NULL,  the  error
-       should have arisen from the use of that structure. A message terminated
-       by a binary zero is placed  in  errbuf.  The  length  of  the  message,
-       including  the  zero, is limited to errbuf_size. The yield of the func-
-       tion is the size of buffer needed to hold the whole message.
-
-
-MEMORY USAGE
-
-       Compiling a regular expression causes memory to be allocated and  asso-
-       ciated  with  the preg structure. The function regfree() frees all such
-       memory, after which preg may no longer be used as  a  compiled  expres-
-       sion.
-
-
-AUTHOR
-
-       Philip Hazel
-       University Computing Service
-       Cambridge CB2 3QH, England.
-
-
-REVISION
-
-       Last updated: 09 January 2012
-       Copyright (c) 1997-2012 University of Cambridge.
-------------------------------------------------------------------------------
-
-
-PCRECPP(3)                 Library Functions Manual                 PCRECPP(3)
-
-
-
-NAME
-       PCRE - Perl-compatible regular expressions.
-
-SYNOPSIS OF C++ WRAPPER
-
-       #include <pcrecpp.h>
-
-
-DESCRIPTION
-
-       The  C++  wrapper  for PCRE was provided by Google Inc. Some additional
-       functionality was added by Giuseppe Maxia. This brief man page was con-
-       structed  from  the  notes  in the pcrecpp.h file, which should be con-
-       sulted for further details. Note that the C++ wrapper supports only the
-       original  8-bit  PCRE  library. There is no 16-bit or 32-bit support at
-       present.
-
-
-MATCHING INTERFACE
-
-       The "FullMatch" operation checks that supplied text matches a  supplied
-       pattern  exactly.  If pointer arguments are supplied, it copies matched
-       sub-strings that match sub-patterns into them.
-
-         Example: successful match
-            pcrecpp::RE re("h.*o");
-            re.FullMatch("hello");
-
-         Example: unsuccessful match (requires full match):
-            pcrecpp::RE re("e");
-            !re.FullMatch("hello");
-
-         Example: creating a temporary RE object:
-            pcrecpp::RE("h.*o").FullMatch("hello");
-
-       You can pass in a "const char*" or a "string" for "text". The  examples
-       below  tend to use a const char*. You can, as in the different examples
-       above, store the RE object explicitly in a variable or use a  temporary
-       RE  object.  The  examples below use one mode or the other arbitrarily.
-       Either could correctly be used for any of these examples.
-
-       You must supply extra pointer arguments to extract matched subpieces.
-
-         Example: extracts "ruby" into "s" and 1234 into "i"
-            int i;
-            string s;
-            pcrecpp::RE re("(\\w+):(\\d+)");
-            re.FullMatch("ruby:1234", &s, &i);
-
-         Example: does not try to extract any extra sub-patterns
-            re.FullMatch("ruby:1234", &s);
-
-         Example: does not try to extract into NULL
-            re.FullMatch("ruby:1234", NULL, &i);
-
-         Example: integer overflow causes failure
-            !re.FullMatch("ruby:1234567891234", NULL, &i);
-
-         Example: fails because there aren't enough sub-patterns:
-            !pcrecpp::RE("\\w+:\\d+").FullMatch("ruby:1234", &s);
-
-         Example: fails because string cannot be stored in integer
-            !pcrecpp::RE("(.*)").FullMatch("ruby", &i);
-
-       The provided pointer arguments can be pointers to  any  scalar  numeric
-       type, or one of:
-
-          string        (matched piece is copied to string)
-          StringPiece   (StringPiece is mutated to point to matched piece)
-          T             (where "bool T::ParseFrom(const char*, int)" exists)
-          NULL          (the corresponding matched sub-pattern is not copied)
-
-       The  function returns true iff all of the following conditions are sat-
-       isfied:
-
-         a. "text" matches "pattern" exactly;
-
-         b. The number of matched sub-patterns is >= number of supplied
-            pointers;
-
-         c. The "i"th argument has a suitable type for holding the
-            string captured as the "i"th sub-pattern. If you pass in
-            void * NULL for the "i"th argument, or a non-void * NULL
-            of the correct type, or pass fewer arguments than the
-            number of sub-patterns, "i"th captured sub-pattern is
-            ignored.
-
-       CAVEAT: An optional sub-pattern that does  not  exist  in  the  matched
-       string  is  assigned  the  empty  string. Therefore, the following will
-       return false (because the empty string is not a valid number):
-
-          int number;
-          pcrecpp::RE::FullMatch("abc", "[a-z]+(\\d+)?", &number);
-
-       The matching interface supports at most 16 arguments per call.  If  you
-       need    more,    consider    using    the    more   general   interface
-       pcrecpp::RE::DoMatch. See pcrecpp.h for the signature for DoMatch.
-
-       NOTE: Do not use no_arg, which is used internally to mark the end of  a
-       list  of optional arguments, as a placeholder for missing arguments, as
-       this can lead to segfaults.
-
-
-QUOTING METACHARACTERS
-
-       You can use the "QuoteMeta" operation to insert backslashes before  all
-       potentially  meaningful  characters  in  a string. The returned string,
-       used as a regular expression, will exactly match the original string.
-
-         Example:
-            string quoted = RE::QuoteMeta(unquoted);
-
-       Note that it's legal to escape a character even if it  has  no  special
-       meaning  in  a  regular expression -- so this function does that. (This
-       also makes it identical to the perl function  of  the  same  name;  see
-       "perldoc    -f    quotemeta".)    For   example,   "1.5-2.0?"   becomes
-       "1\.5\-2\.0\?".
-
-
-PARTIAL MATCHES
-
-       You can use the "PartialMatch" operation when you want the  pattern  to
-       match any substring of the text.
-
-         Example: simple search for a string:
-            pcrecpp::RE("ell").PartialMatch("hello");
-
-         Example: find first number in a string:
-            int number;
-            pcrecpp::RE re("(\\d+)");
-            re.PartialMatch("x*100 + 20", &number);
-            assert(number == 100);
-
-
-UTF-8 AND THE MATCHING INTERFACE
-
-       By  default,  pattern  and text are plain text, one byte per character.
-       The UTF8 flag, passed to  the  constructor,  causes  both  pattern  and
-       string to be treated as UTF-8 text, still a byte stream but potentially
-       multiple bytes per character. In practice, the text is likelier  to  be
-       UTF-8  than  the pattern, but the match returned may depend on the UTF8
-       flag, so always use it when matching UTF8 text. For example,  "."  will
-       match  one  byte normally but with UTF8 set may match up to three bytes
-       of a multi-byte character.
-
-         Example:
-            pcrecpp::RE_Options options;
-            options.set_utf8();
-            pcrecpp::RE re(utf8_pattern, options);
-            re.FullMatch(utf8_string);
-
-         Example: using the convenience function UTF8():
-            pcrecpp::RE re(utf8_pattern, pcrecpp::UTF8());
-            re.FullMatch(utf8_string);
-
-       NOTE: The UTF8 flag is ignored if pcre was not configured with the
-             --enable-utf8 flag.
-
-
-PASSING MODIFIERS TO THE REGULAR EXPRESSION ENGINE
-
-       PCRE defines some modifiers to  change  the  behavior  of  the  regular
-       expression   engine.  The  C++  wrapper  defines  an  auxiliary  class,
-       RE_Options, as a vehicle to pass such modifiers to  a  RE  class.  Cur-
-       rently, the following modifiers are supported:
-
-          modifier              description               Perl corresponding
-
-          PCRE_CASELESS         case insensitive match      /i
-          PCRE_MULTILINE        multiple lines match        /m
-          PCRE_DOTALL           dot matches newlines        /s
-          PCRE_DOLLAR_ENDONLY   $ matches only at end       N/A
-          PCRE_EXTRA            strict escape parsing       N/A
-          PCRE_EXTENDED         ignore white spaces         /x
-          PCRE_UTF8             handles UTF8 chars          built-in
-          PCRE_UNGREEDY         reverses * and *?           N/A
-          PCRE_NO_AUTO_CAPTURE  disables capturing parens   N/A (*)
-
-       (*)  Both Perl and PCRE allow non capturing parentheses by means of the
-       "?:" modifier within the pattern itself. e.g. (?:ab|cd) does  not  cap-
-       ture, while (ab|cd) does.
-
-       For  a  full  account on how each modifier works, please check the PCRE
-       API reference page.
-
-       For each modifier, there are two member functions whose  name  is  made
-       out  of  the  modifier  in  lowercase,  without the "PCRE_" prefix. For
-       instance, PCRE_CASELESS is handled by
-
-         bool caseless()
-
-       which returns true if the modifier is set, and
-
-         RE_Options & set_caseless(bool)
-
-       which sets or unsets the modifier. Moreover, PCRE_EXTRA_MATCH_LIMIT can
-       be  accessed  through  the  set_match_limit()  and match_limit() member
-       functions. Setting match_limit to a non-zero value will limit the  exe-
-       cution  of pcre to keep it from doing bad things like blowing the stack
-       or taking an eternity to return a result.  A  value  of  5000  is  good
-       enough  to stop stack blowup in a 2MB thread stack. Setting match_limit
-       to  zero  disables  match  limiting.  Alternatively,   you   can   call
-       match_limit_recursion()  which uses PCRE_EXTRA_MATCH_LIMIT_RECURSION to
-       limit how much  PCRE  recurses.  match_limit()  limits  the  number  of
-       matches PCRE does; match_limit_recursion() limits the depth of internal
-       recursion, and therefore the amount of stack that is used.
-
-       Normally, to pass one or more modifiers to a RE class,  you  declare  a
-       RE_Options object, set the appropriate options, and pass this object to
-       a RE constructor. Example:
-
-          RE_Options opt;
-          opt.set_caseless(true);
-          if (RE("HELLO", opt).PartialMatch("hello world")) ...
-
-       RE_options has two constructors. The default constructor takes no argu-
-       ments  and creates a set of flags that are off by default. The optional
-       parameter option_flags is to facilitate transfer of legacy code from  C
-       programs.  This lets you do
-
-          RE(pattern,
-            RE_Options(PCRE_CASELESS|PCRE_MULTILINE)).PartialMatch(str);
-
-       However, new code is better off doing
-
-          RE(pattern,
-            RE_Options().set_caseless(true).set_multiline(true))
-              .PartialMatch(str);
-
-       If you are going to pass one of the most used modifiers, there are some
-       convenience functions that return a RE_Options class with the appropri-
-       ate  modifier  already  set: CASELESS(), UTF8(), MULTILINE(), DOTALL(),
-       and EXTENDED().
-
-       If you need to set several options at once, and you don't  want  to  go
-       through  the pains of declaring a RE_Options object and setting several
-       options, there is a parallel method that give you such ability  on  the
-       fly.  You  can  concatenate several set_xxxxx() member functions, since
-       each of them returns a reference to its class object. For  example,  to
-       pass  PCRE_CASELESS, PCRE_EXTENDED, and PCRE_MULTILINE to a RE with one
-       statement, you may write:
-
-          RE(" ^ xyz \\s+ .* blah$",
-            RE_Options()
-              .set_caseless(true)
-              .set_extended(true)
-              .set_multiline(true)).PartialMatch(sometext);
-
-
-SCANNING TEXT INCREMENTALLY
-
-       The "Consume" operation may be useful if you want to  repeatedly  match
-       regular expressions at the front of a string and skip over them as they
-       match. This requires use of the "StringPiece" type, which represents  a
-       sub-range  of  a  real  string.  Like RE, StringPiece is defined in the
-       pcrecpp namespace.
-
-         Example: read lines of the form "var = value" from a string.
-            string contents = ...;                 // Fill string somehow
-            pcrecpp::StringPiece input(contents);  // Wrap in a StringPiece
-
-            string var;
-            int value;
-            pcrecpp::RE re("(\\w+) = (\\d+)\n");
-            while (re.Consume(&input, &var, &value)) {
-              ...;
-            }
-
-       Each successful call  to  "Consume"  will  set  "var/value",  and  also
-       advance "input" so it points past the matched text.
-
-       The  "FindAndConsume"  operation  is  similar to "Consume" but does not
-       anchor your match at the beginning of  the  string.  For  example,  you
-       could extract all words from a string by repeatedly calling
-
-         pcrecpp::RE("(\\w+)").FindAndConsume(&input, &word)
-
-
-PARSING HEX/OCTAL/C-RADIX NUMBERS
-
-       By default, if you pass a pointer to a numeric value, the corresponding
-       text is interpreted as a base-10  number.  You  can  instead  wrap  the
-       pointer with a call to one of the operators Hex(), Octal(), or CRadix()
-       to interpret the text in another base. The CRadix  operator  interprets
-       C-style  "0"  (base-8)  and  "0x"  (base-16)  prefixes, but defaults to
-       base-10.
-
-         Example:
-           int a, b, c, d;
-           pcrecpp::RE re("(.*) (.*) (.*) (.*)");
-           re.FullMatch("100 40 0100 0x40",
-                        pcrecpp::Octal(&a), pcrecpp::Hex(&b),
-                        pcrecpp::CRadix(&c), pcrecpp::CRadix(&d));
-
-       will leave 64 in a, b, c, and d.
-
-
-REPLACING PARTS OF STRINGS
-
-       You can replace the first match of "pattern" in "str"  with  "rewrite".
-       Within  "rewrite",  backslash-escaped  digits (\1 to \9) can be used to
-       insert text matching corresponding parenthesized group  from  the  pat-
-       tern. \0 in "rewrite" refers to the entire matching text. For example:
-
-         string s = "yabba dabba doo";
-         pcrecpp::RE("b+").Replace("d", &s);
-
-       will  leave  "s" containing "yada dabba doo". The result is true if the
-       pattern matches and a replacement occurs, false otherwise.
-
-       GlobalReplace is like Replace except that it replaces  all  occurrences
-       of  the  pattern  in  the string with the rewrite. Replacements are not
-       subject to re-matching. For example:
-
-         string s = "yabba dabba doo";
-         pcrecpp::RE("b+").GlobalReplace("d", &s);
-
-       will leave "s" containing "yada dada doo". It  returns  the  number  of
-       replacements made.
-
-       Extract  is like Replace, except that if the pattern matches, "rewrite"
-       is copied into "out" (an additional argument) with substitutions.   The
-       non-matching  portions  of "text" are ignored. Returns true iff a match
-       occurred and the extraction happened successfully;  if no match occurs,
-       the string is left unaffected.
-
-
-AUTHOR
-
-       The C++ wrapper was contributed by Google Inc.
-       Copyright (c) 2007 Google Inc.
-
-
-REVISION
-
-       Last updated: 08 January 2012
-------------------------------------------------------------------------------
-
-
-PCRESAMPLE(3)              Library Functions Manual              PCRESAMPLE(3)
-
-
-
-NAME
-       PCRE - Perl-compatible regular expressions
-
-PCRE SAMPLE PROGRAM
-
-       A simple, complete demonstration program, to get you started with using
-       PCRE, is supplied in the file pcredemo.c in the  PCRE  distribution.  A
-       listing  of this program is given in the pcredemo documentation. If you
-       do not have a copy of the PCRE distribution, you can save this  listing
-       to re-create pcredemo.c.
-
-       The  demonstration program, which uses the original PCRE 8-bit library,
-       compiles the regular expression that is its first argument, and matches
-       it  against  the subject string in its second argument. No PCRE options
-       are set, and default character tables are used. If  matching  succeeds,
-       the  program  outputs the portion of the subject that matched, together
-       with the contents of any captured substrings.
-
-       If the -g option is given on the command line, the program then goes on
-       to check for further matches of the same regular expression in the same
-       subject string. The logic is a little bit tricky because of the  possi-
-       bility  of  matching an empty string. Comments in the code explain what
-       is going on.
-
-       If PCRE is installed in the standard include  and  library  directories
-       for your operating system, you should be able to compile the demonstra-
-       tion program using this command:
-
-         gcc -o pcredemo pcredemo.c -lpcre
-
-       If PCRE is installed elsewhere, you may need to add additional  options
-       to  the  command line. For example, on a Unix-like system that has PCRE
-       installed in /usr/local, you  can  compile  the  demonstration  program
-       using a command like this:
-
-         gcc -o pcredemo -I/usr/local/include pcredemo.c \
-             -L/usr/local/lib -lpcre
-
-       In  a  Windows  environment, if you want to statically link the program
-       against a non-dll pcre.a file, you must uncomment the line that defines
-       PCRE_STATIC  before  including  pcre.h, because otherwise the pcre_mal-
-       loc()   and   pcre_free()   exported   functions   will   be   declared
-       __declspec(dllimport), with unwanted results.
-
-       Once  you  have  compiled and linked the demonstration program, you can
-       run simple tests like this:
-
-         ./pcredemo 'cat|dog' 'the cat sat on the mat'
-         ./pcredemo -g 'cat|dog' 'the dog sat on the cat'
-
-       Note that there is a  much  more  comprehensive  test  program,  called
-       pcretest,  which  supports  many  more  facilities  for testing regular
-       expressions and both PCRE libraries. The pcredemo program  is  provided
-       as a simple coding example.
-
-       If  you  try to run pcredemo when PCRE is not installed in the standard
-       library directory, you may get an error like  this  on  some  operating
-       systems (e.g. Solaris):
-
-         ld.so.1:  a.out:  fatal:  libpcre.so.0:  open failed: No such file or
-       directory
-
-       This is caused by the way shared library support works  on  those  sys-
-       tems. You need to add
-
-         -R/usr/local/lib
-
-       (for example) to the compile command to get round this problem.
-
-
-AUTHOR
-
-       Philip Hazel
-       University Computing Service
-       Cambridge CB2 3QH, England.
-
-
-REVISION
-
-       Last updated: 10 January 2012
-       Copyright (c) 1997-2012 University of Cambridge.
-------------------------------------------------------------------------------
-PCRELIMITS(3)              Library Functions Manual              PCRELIMITS(3)
-
-
-
-NAME
-       PCRE - Perl-compatible regular expressions
-
-SIZE AND OTHER LIMITATIONS
-
-       There  are some size limitations in PCRE but it is hoped that they will
-       never in practice be relevant.
-
-       The maximum length of a compiled  pattern  is  approximately  64K  data
-       units  (bytes  for  the  8-bit  library,  16-bit  units  for the 16-bit
-       library, and 32-bit units for the 32-bit library) if PCRE  is  compiled
-       with  the default internal linkage size, which is 2 bytes for the 8-bit
-       and 16-bit libraries, and 4 bytes for the 32-bit library. If  you  want
-       to process regular expressions that are truly enormous, you can compile
-       PCRE with an internal linkage size of 3 or 4 (when building the  16-bit
-       or  32-bit  library,  3 is rounded up to 4). See the README file in the
-       source distribution and the pcrebuild  documentation  for  details.  In
-       these  cases  the limit is substantially larger.  However, the speed of
-       execution is slower.
-
-       All values in repeating quantifiers must be less than 65536.
-
-       There is no limit to the number of parenthesized subpatterns, but there
-       can  be  no more than 65535 capturing subpatterns. There is, however, a
-       limit to the depth of  nesting  of  parenthesized  subpatterns  of  all
-       kinds.  This  is  imposed  in order to limit the amount of system stack
-       used at compile time. The limit can be specified when  PCRE  is  built;
-       the default is 250.
-
-       There is a limit to the number of forward references to subsequent sub-
-       patterns of around 200,000.  Repeated  forward  references  with  fixed
-       upper  limits,  for example, (?2){0,100} when subpattern number 2 is to
-       the right, are included in the count. There is no limit to  the  number
-       of backward references.
-
-       The maximum length of name for a named subpattern is 32 characters, and
-       the maximum number of named subpatterns is 10000.
-
-       The maximum length of a  name  in  a  (*MARK),  (*PRUNE),  (*SKIP),  or
-       (*THEN)  verb is 255 for the 8-bit library and 65535 for the 16-bit and
-       32-bit libraries.
-
-       The maximum length of a subject string is the largest  positive  number
-       that  an integer variable can hold. However, when using the traditional
-       matching function, PCRE uses recursion to handle subpatterns and indef-
-       inite  repetition.  This means that the available stack space may limit
-       the size of a subject string that can be processed by certain patterns.
-       For a discussion of stack issues, see the pcrestack documentation.
-
-
-AUTHOR
-
-       Philip Hazel
-       University Computing Service
-       Cambridge CB2 3QH, England.
-
-
-REVISION
-
-       Last updated: 05 November 2013
-       Copyright (c) 1997-2013 University of Cambridge.
-------------------------------------------------------------------------------
-
-
-PCRESTACK(3)               Library Functions Manual               PCRESTACK(3)
-
-
-
-NAME
-       PCRE - Perl-compatible regular expressions
-
-PCRE DISCUSSION OF STACK USAGE
-
-       When  you call pcre[16|32]_exec(), it makes use of an internal function
-       called match(). This calls itself recursively at branch points  in  the
-       pattern,  in  order  to  remember the state of the match so that it can
-       back up and try a different alternative if  the  first  one  fails.  As
-       matching proceeds deeper and deeper into the tree of possibilities, the
-       recursion depth increases. The match() function is also called in other
-       circumstances,  for  example,  whenever  a parenthesized sub-pattern is
-       entered, and in certain cases of repetition.
-
-       Not all calls of match() increase the recursion depth; for an item such
-       as  a* it may be called several times at the same level, after matching
-       different numbers of a's. Furthermore, in a number of cases  where  the
-       result  of  the  recursive call would immediately be passed back as the
-       result of the current call (a "tail recursion"), the function  is  just
-       restarted instead.
-
-       The  above  comments apply when pcre[16|32]_exec() is run in its normal
-       interpretive  manner.   If   the   pattern   was   studied   with   the
-       PCRE_STUDY_JIT_COMPILE  option, and just-in-time compiling was success-
-       ful, and the options passed to pcre[16|32]_exec() were  not  incompati-
-       ble,  the  matching  process  uses the JIT-compiled code instead of the
-       match() function. In this case, the  memory  requirements  are  handled
-       entirely differently. See the pcrejit documentation for details.
-
-       The  pcre[16|32]_dfa_exec()  function operates in an entirely different
-       way, and uses recursion only when there is a regular expression  recur-
-       sion or subroutine call in the pattern. This includes the processing of
-       assertion and "once-only" subpatterns, which are handled  like  subrou-
-       tine  calls.  Normally, these are never very deep, and the limit on the
-       complexity of pcre[16|32]_dfa_exec() is controlled  by  the  amount  of
-       workspace  it is given.  However, it is possible to write patterns with
-       runaway    infinite    recursions;    such    patterns    will    cause
-       pcre[16|32]_dfa_exec()  to  run  out  of stack. At present, there is no
-       protection against this.
-
-       The comments that follow do NOT apply to  pcre[16|32]_dfa_exec();  they
-       are relevant only for pcre[16|32]_exec() without the JIT optimization.
-
-   Reducing pcre[16|32]_exec()'s stack usage
-
-       Each  time  that match() is actually called recursively, it uses memory
-       from the process stack. For certain kinds of  pattern  and  data,  very
-       large  amounts of stack may be needed, despite the recognition of "tail
-       recursion".  You can often reduce the amount of recursion,  and  there-
-       fore  the  amount of stack used, by modifying the pattern that is being
-       matched. Consider, for example, this pattern:
-
-         ([^<]|<(?!inet))+
-
-       It matches from wherever it starts until it encounters "<inet"  or  the
-       end  of  the  data,  and is the kind of pattern that might be used when
-       processing an XML file. Each iteration of the outer parentheses matches
-       either  one  character that is not "<" or a "<" that is not followed by
-       "inet". However, each time a  parenthesis  is  processed,  a  recursion
-       occurs, so this formulation uses a stack frame for each matched charac-
-       ter. For a long string, a lot of stack is required. Consider  now  this
-       rewritten pattern, which matches exactly the same strings:
-
-         ([^<]++|<(?!inet))+
-
-       This  uses very much less stack, because runs of characters that do not
-       contain "<" are "swallowed" in one item inside the parentheses.  Recur-
-       sion  happens  only when a "<" character that is not followed by "inet"
-       is encountered (and we assume this is relatively  rare).  A  possessive
-       quantifier  is  used  to stop any backtracking into the runs of non-"<"
-       characters, but that is not related to stack usage.
-
-       This example shows that one way of avoiding stack problems when  match-
-       ing long subject strings is to write repeated parenthesized subpatterns
-       to match more than one character whenever possible.
-
-   Compiling PCRE to use heap instead of stack for pcre[16|32]_exec()
-
-       In environments where stack memory is constrained, you  might  want  to
-       compile  PCRE to use heap memory instead of stack for remembering back-
-       up points when pcre[16|32]_exec() is running. This makes it run  a  lot
-       more slowly, however.  Details of how to do this are given in the pcre-
-       build documentation. When built in  this  way,  instead  of  using  the
-       stack,  PCRE obtains and frees memory by calling the functions that are
-       pointed to by the pcre[16|32]_stack_malloc  and  pcre[16|32]_stack_free
-       variables.  By default, these point to malloc() and free(), but you can
-       replace the pointers to cause PCRE to use your own functions. Since the
-       block sizes are always the same, and are always freed in reverse order,
-       it may be possible to implement customized  memory  handlers  that  are
-       more efficient than the standard functions.
-
-   Limiting pcre[16|32]_exec()'s stack usage
-
-       You  can set limits on the number of times that match() is called, both
-       in total and recursively. If a limit  is  exceeded,  pcre[16|32]_exec()
-       returns  an  error code. Setting suitable limits should prevent it from
-       running out of stack. The default values of the limits are very  large,
-       and  unlikely  ever to operate. They can be changed when PCRE is built,
-       and they can also be set when pcre[16|32]_exec() is called. For details
-       of these interfaces, see the pcrebuild documentation and the section on
-       extra data for pcre[16|32]_exec() in the pcreapi documentation.
-
-       As a very rough rule of thumb, you should reckon on about 500 bytes per
-       recursion.  Thus,  if  you  want  to limit your stack usage to 8Mb, you
-       should set the limit at 16000 recursions. A 64Mb stack,  on  the  other
-       hand, can support around 128000 recursions.
-
-       In Unix-like environments, the pcretest test program has a command line
-       option (-S) that can be used to increase the size of its stack. As long
-       as  the  stack is large enough, another option (-M) can be used to find
-       the smallest limits that allow a particular pattern to  match  a  given
-       subject  string.  This is done by calling pcre[16|32]_exec() repeatedly
-       with different limits.
-
-   Obtaining an estimate of stack usage
-
-       The actual amount of stack used per recursion can  vary  quite  a  lot,
-       depending on the compiler that was used to build PCRE and the optimiza-
-       tion or debugging options that were set for it. The rule of thumb value
-       of  500  bytes  mentioned  above  may be larger or smaller than what is
-       actually needed. A better approximation can be obtained by running this
-       command:
-
-         pcretest -m -C
-
-       The  -C  option causes pcretest to output information about the options
-       with which PCRE was compiled. When -m is also given (before -C), infor-
-       mation about stack use is given in a line like this:
-
-         Match recursion uses stack: approximate frame size = 640 bytes
-
-       The value is approximate because some recursions need a bit more (up to
-       perhaps 16 more bytes).
-
-       If the above command is given when PCRE is compiled  to  use  the  heap
-       instead  of  the  stack  for recursion, the value that is output is the
-       size of each block that is obtained from the heap.
-
-   Changing stack size in Unix-like systems
-
-       In Unix-like environments, there is not often a problem with the  stack
-       unless  very  long  strings  are  involved, though the default limit on
-       stack size varies from system to system. Values from 8Mb  to  64Mb  are
-       common. You can find your default limit by running the command:
-
-         ulimit -s
-
-       Unfortunately,  the  effect  of  running out of stack is often SIGSEGV,
-       though sometimes a more explicit error message is given. You  can  nor-
-       mally increase the limit on stack size by code such as this:
-
-         struct rlimit rlim;
-         getrlimit(RLIMIT_STACK, &rlim);
-         rlim.rlim_cur = 100*1024*1024;
-         setrlimit(RLIMIT_STACK, &rlim);
-
-       This  reads  the current limits (soft and hard) using getrlimit(), then
-       attempts to increase the soft limit to  100Mb  using  setrlimit().  You
-       must do this before calling pcre[16|32]_exec().
-
-   Changing stack size in Mac OS X
-
-       Using setrlimit(), as described above, should also work on Mac OS X. It
-       is also possible to set a stack size when linking a program. There is a
-       discussion   about   stack  sizes  in  Mac  OS  X  at  this  web  site:
-       http://developer.apple.com/qa/qa2005/qa1419.html.
-
-
-AUTHOR
-
-       Philip Hazel
-       University Computing Service
-       Cambridge CB2 3QH, England.
-
-
-REVISION
-
-       Last updated: 24 June 2012
-       Copyright (c) 1997-2012 University of Cambridge.
-------------------------------------------------------------------------------
-
-
diff --git a/dist/doc/pcre16.3 b/dist/doc/pcre16.3
deleted file mode 100644
index 85126a6..0000000
--- a/dist/doc/pcre16.3
+++ /dev/null
@@ -1,371 +0,0 @@
-.TH PCRE 3 "12 May 2013" "PCRE 8.33"
-.SH NAME
-PCRE - Perl-compatible regular expressions
-.sp
-.B #include <pcre.h>
-.
-.
-.SH "PCRE 16-BIT API BASIC FUNCTIONS"
-.rs
-.sp
-.nf
-.B pcre16 *pcre16_compile(PCRE_SPTR16 \fIpattern\fP, int \fIoptions\fP,
-.B "     const char **\fIerrptr\fP, int *\fIerroffset\fP,"
-.B "     const unsigned char *\fItableptr\fP);"
-.sp
-.B pcre16 *pcre16_compile2(PCRE_SPTR16 \fIpattern\fP, int \fIoptions\fP,
-.B "     int *\fIerrorcodeptr\fP,"
-.B "     const char **\fIerrptr\fP, int *\fIerroffset\fP,"
-.B "     const unsigned char *\fItableptr\fP);"
-.sp
-.B pcre16_extra *pcre16_study(const pcre16 *\fIcode\fP, int \fIoptions\fP,
-.B "     const char **\fIerrptr\fP);"
-.sp
-.B void pcre16_free_study(pcre16_extra *\fIextra\fP);
-.sp
-.B int pcre16_exec(const pcre16 *\fIcode\fP, "const pcre16_extra *\fIextra\fP,"
-.B "     PCRE_SPTR16 \fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP,"
-.B "     int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP);"
-.sp
-.B int pcre16_dfa_exec(const pcre16 *\fIcode\fP, "const pcre16_extra *\fIextra\fP,"
-.B "     PCRE_SPTR16 \fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP,"
-.B "     int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP,"
-.B "     int *\fIworkspace\fP, int \fIwscount\fP);"
-.fi
-.
-.
-.SH "PCRE 16-BIT API STRING EXTRACTION FUNCTIONS"
-.rs
-.sp
-.nf
-.B int pcre16_copy_named_substring(const pcre16 *\fIcode\fP,
-.B "     PCRE_SPTR16 \fIsubject\fP, int *\fIovector\fP,"
-.B "     int \fIstringcount\fP, PCRE_SPTR16 \fIstringname\fP,"
-.B "     PCRE_UCHAR16 *\fIbuffer\fP, int \fIbuffersize\fP);"
-.sp
-.B int pcre16_copy_substring(PCRE_SPTR16 \fIsubject\fP, int *\fIovector\fP,
-.B "     int \fIstringcount\fP, int \fIstringnumber\fP, PCRE_UCHAR16 *\fIbuffer\fP,"
-.B "     int \fIbuffersize\fP);"
-.sp
-.B int pcre16_get_named_substring(const pcre16 *\fIcode\fP,
-.B "     PCRE_SPTR16 \fIsubject\fP, int *\fIovector\fP,"
-.B "     int \fIstringcount\fP, PCRE_SPTR16 \fIstringname\fP,"
-.B "     PCRE_SPTR16 *\fIstringptr\fP);"
-.sp
-.B int pcre16_get_stringnumber(const pcre16 *\fIcode\fP,
-.B "     PCRE_SPTR16 \fIname\fP);
-.sp
-.B int pcre16_get_stringtable_entries(const pcre16 *\fIcode\fP,
-.B "     PCRE_SPTR16 \fIname\fP, PCRE_UCHAR16 **\fIfirst\fP, PCRE_UCHAR16 **\fIlast\fP);"
-.sp
-.B int pcre16_get_substring(PCRE_SPTR16 \fIsubject\fP, int *\fIovector\fP,
-.B "     int \fIstringcount\fP, int \fIstringnumber\fP,"
-.B "     PCRE_SPTR16 *\fIstringptr\fP);"
-.sp
-.B int pcre16_get_substring_list(PCRE_SPTR16 \fIsubject\fP,
-.B "     int *\fIovector\fP, int \fIstringcount\fP, PCRE_SPTR16 **\fIlistptr\fP);"
-.sp
-.B void pcre16_free_substring(PCRE_SPTR16 \fIstringptr\fP);
-.sp
-.B void pcre16_free_substring_list(PCRE_SPTR16 *\fIstringptr\fP);
-.fi
-.
-.
-.SH "PCRE 16-BIT API AUXILIARY FUNCTIONS"
-.rs
-.sp
-.nf
-.B pcre16_jit_stack *pcre16_jit_stack_alloc(int \fIstartsize\fP, int \fImaxsize\fP);
-.sp
-.B void pcre16_jit_stack_free(pcre16_jit_stack *\fIstack\fP);
-.sp
-.B void pcre16_assign_jit_stack(pcre16_extra *\fIextra\fP,
-.B "     pcre16_jit_callback \fIcallback\fP, void *\fIdata\fP);"
-.sp
-.B const unsigned char *pcre16_maketables(void);
-.sp
-.B int pcre16_fullinfo(const pcre16 *\fIcode\fP, "const pcre16_extra *\fIextra\fP,"
-.B "     int \fIwhat\fP, void *\fIwhere\fP);"
-.sp
-.B int pcre16_refcount(pcre16 *\fIcode\fP, int \fIadjust\fP);
-.sp
-.B int pcre16_config(int \fIwhat\fP, void *\fIwhere\fP);
-.sp
-.B const char *pcre16_version(void);
-.sp
-.B int pcre16_pattern_to_host_byte_order(pcre16 *\fIcode\fP,
-.B "     pcre16_extra *\fIextra\fP, const unsigned char *\fItables\fP);"
-.fi
-.
-.
-.SH "PCRE 16-BIT API INDIRECTED FUNCTIONS"
-.rs
-.sp
-.nf
-.B void *(*pcre16_malloc)(size_t);
-.sp
-.B void (*pcre16_free)(void *);
-.sp
-.B void *(*pcre16_stack_malloc)(size_t);
-.sp
-.B void (*pcre16_stack_free)(void *);
-.sp
-.B int (*pcre16_callout)(pcre16_callout_block *);
-.fi
-.
-.
-.SH "PCRE 16-BIT API 16-BIT-ONLY FUNCTION"
-.rs
-.sp
-.nf
-.B int pcre16_utf16_to_host_byte_order(PCRE_UCHAR16 *\fIoutput\fP,
-.B "     PCRE_SPTR16 \fIinput\fP, int \fIlength\fP, int *\fIbyte_order\fP,"
-.B "     int \fIkeep_boms\fP);"
-.fi
-.
-.
-.SH "THE PCRE 16-BIT LIBRARY"
-.rs
-.sp
-Starting with release 8.30, it is possible to compile a PCRE library that
-supports 16-bit character strings, including UTF-16 strings, as well as or
-instead of the original 8-bit library. The majority of the work to make this
-possible was done by Zoltan Herczeg. The two libraries contain identical sets
-of functions, used in exactly the same way. Only the names of the functions and
-the data types of their arguments and results are different. To avoid
-over-complication and reduce the documentation maintenance load, most of the
-PCRE documentation describes the 8-bit library, with only occasional references
-to the 16-bit library. This page describes what is different when you use the
-16-bit library.
-.P
-WARNING: A single application can be linked with both libraries, but you must
-take care when processing any particular pattern to use functions from just one
-library. For example, if you want to study a pattern that was compiled with
-\fBpcre16_compile()\fP, you must do so with \fBpcre16_study()\fP, not
-\fBpcre_study()\fP, and you must free the study data with
-\fBpcre16_free_study()\fP.
-.
-.
-.SH "THE HEADER FILE"
-.rs
-.sp
-There is only one header file, \fBpcre.h\fP. It contains prototypes for all the
-functions in all libraries, as well as definitions of flags, structures, error
-codes, etc.
-.
-.
-.SH "THE LIBRARY NAME"
-.rs
-.sp
-In Unix-like systems, the 16-bit library is called \fBlibpcre16\fP, and can
-normally be accesss by adding \fB-lpcre16\fP to the command for linking an
-application that uses PCRE.
-.
-.
-.SH "STRING TYPES"
-.rs
-.sp
-In the 8-bit library, strings are passed to PCRE library functions as vectors
-of bytes with the C type "char *". In the 16-bit library, strings are passed as
-vectors of unsigned 16-bit quantities. The macro PCRE_UCHAR16 specifies an
-appropriate data type, and PCRE_SPTR16 is defined as "const PCRE_UCHAR16 *". In
-very many environments, "short int" is a 16-bit data type. When PCRE is built,
-it defines PCRE_UCHAR16 as "unsigned short int", but checks that it really is a
-16-bit data type. If it is not, the build fails with an error message telling
-the maintainer to modify the definition appropriately.
-.
-.
-.SH "STRUCTURE TYPES"
-.rs
-.sp
-The types of the opaque structures that are used for compiled 16-bit patterns
-and JIT stacks are \fBpcre16\fP and \fBpcre16_jit_stack\fP respectively. The
-type of the user-accessible structure that is returned by \fBpcre16_study()\fP
-is \fBpcre16_extra\fP, and the type of the structure that is used for passing
-data to a callout function is \fBpcre16_callout_block\fP. These structures
-contain the same fields, with the same names, as their 8-bit counterparts. The
-only difference is that pointers to character strings are 16-bit instead of
-8-bit types.
-.
-.
-.SH "16-BIT FUNCTIONS"
-.rs
-.sp
-For every function in the 8-bit library there is a corresponding function in
-the 16-bit library with a name that starts with \fBpcre16_\fP instead of
-\fBpcre_\fP. The prototypes are listed above. In addition, there is one extra
-function, \fBpcre16_utf16_to_host_byte_order()\fP. This is a utility function
-that converts a UTF-16 character string to host byte order if necessary. The
-other 16-bit functions expect the strings they are passed to be in host byte
-order.
-.P
-The \fIinput\fP and \fIoutput\fP arguments of
-\fBpcre16_utf16_to_host_byte_order()\fP may point to the same address, that is,
-conversion in place is supported. The output buffer must be at least as long as
-the input.
-.P
-The \fIlength\fP argument specifies the number of 16-bit data units in the
-input string; a negative value specifies a zero-terminated string.
-.P
-If \fIbyte_order\fP is NULL, it is assumed that the string starts off in host
-byte order. This may be changed by byte-order marks (BOMs) anywhere in the
-string (commonly as the first character).
-.P
-If \fIbyte_order\fP is not NULL, a non-zero value of the integer to which it
-points means that the input starts off in host byte order, otherwise the
-opposite order is assumed. Again, BOMs in the string can change this. The final
-byte order is passed back at the end of processing.
-.P
-If \fIkeep_boms\fP is not zero, byte-order mark characters (0xfeff) are copied
-into the output string. Otherwise they are discarded.
-.P
-The result of the function is the number of 16-bit units placed into the output
-buffer, including the zero terminator if the string was zero-terminated.
-.
-.
-.SH "SUBJECT STRING OFFSETS"
-.rs
-.sp
-The lengths and starting offsets of subject strings must be specified in 16-bit
-data units, and the offsets within subject strings that are returned by the
-matching functions are in also 16-bit units rather than bytes.
-.
-.
-.SH "NAMED SUBPATTERNS"
-.rs
-.sp
-The name-to-number translation table that is maintained for named subpatterns
-uses 16-bit characters. The \fBpcre16_get_stringtable_entries()\fP function
-returns the length of each entry in the table as the number of 16-bit data
-units.
-.
-.
-.SH "OPTION NAMES"
-.rs
-.sp
-There are two new general option names, PCRE_UTF16 and PCRE_NO_UTF16_CHECK,
-which correspond to PCRE_UTF8 and PCRE_NO_UTF8_CHECK in the 8-bit library. In
-fact, these new options define the same bits in the options word. There is a
-discussion about the
-.\" HTML <a href="pcreunicode.html#utf16strings">
-.\" </a>
-validity of UTF-16 strings
-.\"
-in the
-.\" HREF
-\fBpcreunicode\fP
-.\"
-page.
-.P
-For the \fBpcre16_config()\fP function there is an option PCRE_CONFIG_UTF16
-that returns 1 if UTF-16 support is configured, otherwise 0. If this option is
-given to \fBpcre_config()\fP or \fBpcre32_config()\fP, or if the
-PCRE_CONFIG_UTF8 or PCRE_CONFIG_UTF32 option is given to \fBpcre16_config()\fP,
-the result is the PCRE_ERROR_BADOPTION error.
-.
-.
-.SH "CHARACTER CODES"
-.rs
-.sp
-In 16-bit mode, when PCRE_UTF16 is not set, character values are treated in the
-same way as in 8-bit, non UTF-8 mode, except, of course, that they can range
-from 0 to 0xffff instead of 0 to 0xff. Character types for characters less than
-0xff can therefore be influenced by the locale in the same way as before.
-Characters greater than 0xff have only one case, and no "type" (such as letter
-or digit).
-.P
-In UTF-16 mode, the character code is Unicode, in the range 0 to 0x10ffff, with
-the exception of values in the range 0xd800 to 0xdfff because those are
-"surrogate" values that are used in pairs to encode values greater than 0xffff.
-.P
-A UTF-16 string can indicate its endianness by special code knows as a
-byte-order mark (BOM). The PCRE functions do not handle this, expecting strings
-to be in host byte order. A utility function called
-\fBpcre16_utf16_to_host_byte_order()\fP is provided to help with this (see
-above).
-.
-.
-.SH "ERROR NAMES"
-.rs
-.sp
-The errors PCRE_ERROR_BADUTF16_OFFSET and PCRE_ERROR_SHORTUTF16 correspond to
-their 8-bit counterparts. The error PCRE_ERROR_BADMODE is given when a compiled
-pattern is passed to a function that processes patterns in the other
-mode, for example, if a pattern compiled with \fBpcre_compile()\fP is passed to
-\fBpcre16_exec()\fP.
-.P
-There are new error codes whose names begin with PCRE_UTF16_ERR for invalid
-UTF-16 strings, corresponding to the PCRE_UTF8_ERR codes for UTF-8 strings that
-are described in the section entitled
-.\" HTML <a href="pcreapi.html#badutf8reasons">
-.\" </a>
-"Reason codes for invalid UTF-8 strings"
-.\"
-in the main
-.\" HREF
-\fBpcreapi\fP
-.\"
-page. The UTF-16 errors are:
-.sp
-  PCRE_UTF16_ERR1  Missing low surrogate at end of string
-  PCRE_UTF16_ERR2  Invalid low surrogate follows high surrogate
-  PCRE_UTF16_ERR3  Isolated low surrogate
-  PCRE_UTF16_ERR4  Non-character
-.
-.
-.SH "ERROR TEXTS"
-.rs
-.sp
-If there is an error while compiling a pattern, the error text that is passed
-back by \fBpcre16_compile()\fP or \fBpcre16_compile2()\fP is still an 8-bit
-character string, zero-terminated.
-.
-.
-.SH "CALLOUTS"
-.rs
-.sp
-The \fIsubject\fP and \fImark\fP fields in the callout block that is passed to
-a callout function point to 16-bit vectors.
-.
-.
-.SH "TESTING"
-.rs
-.sp
-The \fBpcretest\fP program continues to operate with 8-bit input and output
-files, but it can be used for testing the 16-bit library. If it is run with the
-command line option \fB-16\fP, patterns and subject strings are converted from
-8-bit to 16-bit before being passed to PCRE, and the 16-bit library functions
-are used instead of the 8-bit ones. Returned 16-bit strings are converted to
-8-bit for output. If both the 8-bit and the 32-bit libraries were not compiled,
-\fBpcretest\fP defaults to 16-bit and the \fB-16\fP option is ignored.
-.P
-When PCRE is being built, the \fBRunTest\fP script that is called by "make
-check" uses the \fBpcretest\fP \fB-C\fP option to discover which of the 8-bit,
-16-bit and 32-bit libraries has been built, and runs the tests appropriately.
-.
-.
-.SH "NOT SUPPORTED IN 16-BIT MODE"
-.rs
-.sp
-Not all the features of the 8-bit library are available with the 16-bit
-library. The C++ and POSIX wrapper functions support only the 8-bit library,
-and the \fBpcregrep\fP program is at present 8-bit only.
-.
-.
-.SH AUTHOR
-.rs
-.sp
-.nf
-Philip Hazel
-University Computing Service
-Cambridge CB2 3QH, England.
-.fi
-.
-.
-.SH REVISION
-.rs
-.sp
-.nf
-Last updated: 12 May 2013
-Copyright (c) 1997-2013 University of Cambridge.
-.fi
diff --git a/dist/doc/pcre32.3 b/dist/doc/pcre32.3
deleted file mode 100644
index 7cde8c0..0000000
--- a/dist/doc/pcre32.3
+++ /dev/null
@@ -1,369 +0,0 @@
-.TH PCRE 3 "12 May 2013" "PCRE 8.33"
-.SH NAME
-PCRE - Perl-compatible regular expressions
-.sp
-.B #include <pcre.h>
-.
-.
-.SH "PCRE 32-BIT API BASIC FUNCTIONS"
-.rs
-.sp
-.nf
-.B pcre32 *pcre32_compile(PCRE_SPTR32 \fIpattern\fP, int \fIoptions\fP,
-.B "     const char **\fIerrptr\fP, int *\fIerroffset\fP,"
-.B "     const unsigned char *\fItableptr\fP);"
-.sp
-.B pcre32 *pcre32_compile2(PCRE_SPTR32 \fIpattern\fP, int \fIoptions\fP,
-.B "     int *\fIerrorcodeptr\fP,"
-.B "     const unsigned char *\fItableptr\fP);"
-.sp
-.B pcre32_extra *pcre32_study(const pcre32 *\fIcode\fP, int \fIoptions\fP,
-.B "     const char **\fIerrptr\fP);"
-.sp
-.B void pcre32_free_study(pcre32_extra *\fIextra\fP);
-.sp
-.B int pcre32_exec(const pcre32 *\fIcode\fP, "const pcre32_extra *\fIextra\fP,"
-.B "     PCRE_SPTR32 \fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP,"
-.B "     int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP);"
-.sp
-.B int pcre32_dfa_exec(const pcre32 *\fIcode\fP, "const pcre32_extra *\fIextra\fP,"
-.B "     PCRE_SPTR32 \fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP,"
-.B "     int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP,"
-.B "     int *\fIworkspace\fP, int \fIwscount\fP);"
-.fi
-.
-.
-.SH "PCRE 32-BIT API STRING EXTRACTION FUNCTIONS"
-.rs
-.sp
-.nf
-.B int pcre32_copy_named_substring(const pcre32 *\fIcode\fP,
-.B "     PCRE_SPTR32 \fIsubject\fP, int *\fIovector\fP,"
-.B "     int \fIstringcount\fP, PCRE_SPTR32 \fIstringname\fP,"
-.B "     PCRE_UCHAR32 *\fIbuffer\fP, int \fIbuffersize\fP);"
-.sp
-.B int pcre32_copy_substring(PCRE_SPTR32 \fIsubject\fP, int *\fIovector\fP,
-.B "     int \fIstringcount\fP, int \fIstringnumber\fP, PCRE_UCHAR32 *\fIbuffer\fP,"
-.B "     int \fIbuffersize\fP);"
-.sp
-.B int pcre32_get_named_substring(const pcre32 *\fIcode\fP,
-.B "     PCRE_SPTR32 \fIsubject\fP, int *\fIovector\fP,"
-.B "     int \fIstringcount\fP, PCRE_SPTR32 \fIstringname\fP,"
-.B "     PCRE_SPTR32 *\fIstringptr\fP);"
-.sp
-.B int pcre32_get_stringnumber(const pcre32 *\fIcode\fP,
-.B "     PCRE_SPTR32 \fIname\fP);"
-.sp
-.B int pcre32_get_stringtable_entries(const pcre32 *\fIcode\fP,
-.B "     PCRE_SPTR32 \fIname\fP, PCRE_UCHAR32 **\fIfirst\fP, PCRE_UCHAR32 **\fIlast\fP);"
-.sp
-.B int pcre32_get_substring(PCRE_SPTR32 \fIsubject\fP, int *\fIovector\fP,
-.B "     int \fIstringcount\fP, int \fIstringnumber\fP,"
-.B "     PCRE_SPTR32 *\fIstringptr\fP);"
-.sp
-.B int pcre32_get_substring_list(PCRE_SPTR32 \fIsubject\fP,
-.B "     int *\fIovector\fP, int \fIstringcount\fP, PCRE_SPTR32 **\fIlistptr\fP);"
-.sp
-.B void pcre32_free_substring(PCRE_SPTR32 \fIstringptr\fP);
-.sp
-.B void pcre32_free_substring_list(PCRE_SPTR32 *\fIstringptr\fP);
-.fi
-.
-.
-.SH "PCRE 32-BIT API AUXILIARY FUNCTIONS"
-.rs
-.sp
-.nf
-.B pcre32_jit_stack *pcre32_jit_stack_alloc(int \fIstartsize\fP, int \fImaxsize\fP);
-.sp
-.B void pcre32_jit_stack_free(pcre32_jit_stack *\fIstack\fP);
-.sp
-.B void pcre32_assign_jit_stack(pcre32_extra *\fIextra\fP,
-.B "     pcre32_jit_callback \fIcallback\fP, void *\fIdata\fP);"
-.sp
-.B const unsigned char *pcre32_maketables(void);
-.sp
-.B int pcre32_fullinfo(const pcre32 *\fIcode\fP, "const pcre32_extra *\fIextra\fP,"
-.B "     int \fIwhat\fP, void *\fIwhere\fP);"
-.sp
-.B int pcre32_refcount(pcre32 *\fIcode\fP, int \fIadjust\fP);
-.sp
-.B int pcre32_config(int \fIwhat\fP, void *\fIwhere\fP);
-.sp
-.B const char *pcre32_version(void);
-.sp
-.B int pcre32_pattern_to_host_byte_order(pcre32 *\fIcode\fP,
-.B "     pcre32_extra *\fIextra\fP, const unsigned char *\fItables\fP);"
-.fi
-.
-.
-.SH "PCRE 32-BIT API INDIRECTED FUNCTIONS"
-.rs
-.sp
-.nf
-.B void *(*pcre32_malloc)(size_t);
-.sp
-.B void (*pcre32_free)(void *);
-.sp
-.B void *(*pcre32_stack_malloc)(size_t);
-.sp
-.B void (*pcre32_stack_free)(void *);
-.sp
-.B int (*pcre32_callout)(pcre32_callout_block *);
-.fi
-.
-.
-.SH "PCRE 32-BIT API 32-BIT-ONLY FUNCTION"
-.rs
-.sp
-.nf
-.B int pcre32_utf32_to_host_byte_order(PCRE_UCHAR32 *\fIoutput\fP,
-.B "     PCRE_SPTR32 \fIinput\fP, int \fIlength\fP, int *\fIbyte_order\fP,"
-.B "     int \fIkeep_boms\fP);"
-.fi
-.
-.
-.SH "THE PCRE 32-BIT LIBRARY"
-.rs
-.sp
-Starting with release 8.32, it is possible to compile a PCRE library that
-supports 32-bit character strings, including UTF-32 strings, as well as or
-instead of the original 8-bit library. This work was done by Christian Persch,
-based on the work done by Zoltan Herczeg for the 16-bit library. All three
-libraries contain identical sets of functions, used in exactly the same way.
-Only the names of the functions and the data types of their arguments and
-results are different. To avoid over-complication and reduce the documentation
-maintenance load, most of the PCRE documentation describes the 8-bit library,
-with only occasional references to the 16-bit and 32-bit libraries. This page
-describes what is different when you use the 32-bit library.
-.P
-WARNING: A single application can be linked with all or any of the three
-libraries, but you must take care when processing any particular pattern
-to use functions from just one library. For example, if you want to study
-a pattern that was compiled with \fBpcre32_compile()\fP, you must do so
-with \fBpcre32_study()\fP, not \fBpcre_study()\fP, and you must free the
-study data with \fBpcre32_free_study()\fP.
-.
-.
-.SH "THE HEADER FILE"
-.rs
-.sp
-There is only one header file, \fBpcre.h\fP. It contains prototypes for all the
-functions in all libraries, as well as definitions of flags, structures, error
-codes, etc.
-.
-.
-.SH "THE LIBRARY NAME"
-.rs
-.sp
-In Unix-like systems, the 32-bit library is called \fBlibpcre32\fP, and can
-normally be accesss by adding \fB-lpcre32\fP to the command for linking an
-application that uses PCRE.
-.
-.
-.SH "STRING TYPES"
-.rs
-.sp
-In the 8-bit library, strings are passed to PCRE library functions as vectors
-of bytes with the C type "char *". In the 32-bit library, strings are passed as
-vectors of unsigned 32-bit quantities. The macro PCRE_UCHAR32 specifies an
-appropriate data type, and PCRE_SPTR32 is defined as "const PCRE_UCHAR32 *". In
-very many environments, "unsigned int" is a 32-bit data type. When PCRE is
-built, it defines PCRE_UCHAR32 as "unsigned int", but checks that it really is
-a 32-bit data type. If it is not, the build fails with an error message telling
-the maintainer to modify the definition appropriately.
-.
-.
-.SH "STRUCTURE TYPES"
-.rs
-.sp
-The types of the opaque structures that are used for compiled 32-bit patterns
-and JIT stacks are \fBpcre32\fP and \fBpcre32_jit_stack\fP respectively. The
-type of the user-accessible structure that is returned by \fBpcre32_study()\fP
-is \fBpcre32_extra\fP, and the type of the structure that is used for passing
-data to a callout function is \fBpcre32_callout_block\fP. These structures
-contain the same fields, with the same names, as their 8-bit counterparts. The
-only difference is that pointers to character strings are 32-bit instead of
-8-bit types.
-.
-.
-.SH "32-BIT FUNCTIONS"
-.rs
-.sp
-For every function in the 8-bit library there is a corresponding function in
-the 32-bit library with a name that starts with \fBpcre32_\fP instead of
-\fBpcre_\fP. The prototypes are listed above. In addition, there is one extra
-function, \fBpcre32_utf32_to_host_byte_order()\fP. This is a utility function
-that converts a UTF-32 character string to host byte order if necessary. The
-other 32-bit functions expect the strings they are passed to be in host byte
-order.
-.P
-The \fIinput\fP and \fIoutput\fP arguments of
-\fBpcre32_utf32_to_host_byte_order()\fP may point to the same address, that is,
-conversion in place is supported. The output buffer must be at least as long as
-the input.
-.P
-The \fIlength\fP argument specifies the number of 32-bit data units in the
-input string; a negative value specifies a zero-terminated string.
-.P
-If \fIbyte_order\fP is NULL, it is assumed that the string starts off in host
-byte order. This may be changed by byte-order marks (BOMs) anywhere in the
-string (commonly as the first character).
-.P
-If \fIbyte_order\fP is not NULL, a non-zero value of the integer to which it
-points means that the input starts off in host byte order, otherwise the
-opposite order is assumed. Again, BOMs in the string can change this. The final
-byte order is passed back at the end of processing.
-.P
-If \fIkeep_boms\fP is not zero, byte-order mark characters (0xfeff) are copied
-into the output string. Otherwise they are discarded.
-.P
-The result of the function is the number of 32-bit units placed into the output
-buffer, including the zero terminator if the string was zero-terminated.
-.
-.
-.SH "SUBJECT STRING OFFSETS"
-.rs
-.sp
-The lengths and starting offsets of subject strings must be specified in 32-bit
-data units, and the offsets within subject strings that are returned by the
-matching functions are in also 32-bit units rather than bytes.
-.
-.
-.SH "NAMED SUBPATTERNS"
-.rs
-.sp
-The name-to-number translation table that is maintained for named subpatterns
-uses 32-bit characters. The \fBpcre32_get_stringtable_entries()\fP function
-returns the length of each entry in the table as the number of 32-bit data
-units.
-.
-.
-.SH "OPTION NAMES"
-.rs
-.sp
-There are two new general option names, PCRE_UTF32 and PCRE_NO_UTF32_CHECK,
-which correspond to PCRE_UTF8 and PCRE_NO_UTF8_CHECK in the 8-bit library. In
-fact, these new options define the same bits in the options word. There is a
-discussion about the
-.\" HTML <a href="pcreunicode.html#utf32strings">
-.\" </a>
-validity of UTF-32 strings
-.\"
-in the
-.\" HREF
-\fBpcreunicode\fP
-.\"
-page.
-.P
-For the \fBpcre32_config()\fP function there is an option PCRE_CONFIG_UTF32
-that returns 1 if UTF-32 support is configured, otherwise 0. If this option is
-given to \fBpcre_config()\fP or \fBpcre16_config()\fP, or if the
-PCRE_CONFIG_UTF8 or PCRE_CONFIG_UTF16 option is given to \fBpcre32_config()\fP,
-the result is the PCRE_ERROR_BADOPTION error.
-.
-.
-.SH "CHARACTER CODES"
-.rs
-.sp
-In 32-bit mode, when PCRE_UTF32 is not set, character values are treated in the
-same way as in 8-bit, non UTF-8 mode, except, of course, that they can range
-from 0 to 0x7fffffff instead of 0 to 0xff. Character types for characters less
-than 0xff can therefore be influenced by the locale in the same way as before.
-Characters greater than 0xff have only one case, and no "type" (such as letter
-or digit).
-.P
-In UTF-32 mode, the character code is Unicode, in the range 0 to 0x10ffff, with
-the exception of values in the range 0xd800 to 0xdfff because those are
-"surrogate" values that are ill-formed in UTF-32.
-.P
-A UTF-32 string can indicate its endianness by special code knows as a
-byte-order mark (BOM). The PCRE functions do not handle this, expecting strings
-to be in host byte order. A utility function called
-\fBpcre32_utf32_to_host_byte_order()\fP is provided to help with this (see
-above).
-.
-.
-.SH "ERROR NAMES"
-.rs
-.sp
-The error PCRE_ERROR_BADUTF32 corresponds to its 8-bit counterpart.
-The error PCRE_ERROR_BADMODE is given when a compiled
-pattern is passed to a function that processes patterns in the other
-mode, for example, if a pattern compiled with \fBpcre_compile()\fP is passed to
-\fBpcre32_exec()\fP.
-.P
-There are new error codes whose names begin with PCRE_UTF32_ERR for invalid
-UTF-32 strings, corresponding to the PCRE_UTF8_ERR codes for UTF-8 strings that
-are described in the section entitled
-.\" HTML <a href="pcreapi.html#badutf8reasons">
-.\" </a>
-"Reason codes for invalid UTF-8 strings"
-.\"
-in the main
-.\" HREF
-\fBpcreapi\fP
-.\"
-page. The UTF-32 errors are:
-.sp
-  PCRE_UTF32_ERR1  Surrogate character (range from 0xd800 to 0xdfff)
-  PCRE_UTF32_ERR2  Non-character
-  PCRE_UTF32_ERR3  Character > 0x10ffff
-.
-.
-.SH "ERROR TEXTS"
-.rs
-.sp
-If there is an error while compiling a pattern, the error text that is passed
-back by \fBpcre32_compile()\fP or \fBpcre32_compile2()\fP is still an 8-bit
-character string, zero-terminated.
-.
-.
-.SH "CALLOUTS"
-.rs
-.sp
-The \fIsubject\fP and \fImark\fP fields in the callout block that is passed to
-a callout function point to 32-bit vectors.
-.
-.
-.SH "TESTING"
-.rs
-.sp
-The \fBpcretest\fP program continues to operate with 8-bit input and output
-files, but it can be used for testing the 32-bit library. If it is run with the
-command line option \fB-32\fP, patterns and subject strings are converted from
-8-bit to 32-bit before being passed to PCRE, and the 32-bit library functions
-are used instead of the 8-bit ones. Returned 32-bit strings are converted to
-8-bit for output. If both the 8-bit and the 16-bit libraries were not compiled,
-\fBpcretest\fP defaults to 32-bit and the \fB-32\fP option is ignored.
-.P
-When PCRE is being built, the \fBRunTest\fP script that is called by "make
-check" uses the \fBpcretest\fP \fB-C\fP option to discover which of the 8-bit,
-16-bit and 32-bit libraries has been built, and runs the tests appropriately.
-.
-.
-.SH "NOT SUPPORTED IN 32-BIT MODE"
-.rs
-.sp
-Not all the features of the 8-bit library are available with the 32-bit
-library. The C++ and POSIX wrapper functions support only the 8-bit library,
-and the \fBpcregrep\fP program is at present 8-bit only.
-.
-.
-.SH AUTHOR
-.rs
-.sp
-.nf
-Philip Hazel
-University Computing Service
-Cambridge CB2 3QH, England.
-.fi
-.
-.
-.SH REVISION
-.rs
-.sp
-.nf
-Last updated: 12 May 2013
-Copyright (c) 1997-2013 University of Cambridge.
-.fi
diff --git a/dist/doc/pcre_assign_jit_stack.3 b/dist/doc/pcre_assign_jit_stack.3
deleted file mode 100644
index 0ecf6f2..0000000
--- a/dist/doc/pcre_assign_jit_stack.3
+++ /dev/null
@@ -1,59 +0,0 @@
-.TH PCRE_ASSIGN_JIT_STACK 3 "24 June 2012" "PCRE 8.30"
-.SH NAME
-PCRE - Perl-compatible regular expressions
-.SH SYNOPSIS
-.rs
-.sp
-.B #include <pcre.h>
-.PP
-.nf
-.B void pcre_assign_jit_stack(pcre_extra *\fIextra\fP,
-.B "     pcre_jit_callback \fIcallback\fP, void *\fIdata\fP);"
-.sp
-.B void pcre16_assign_jit_stack(pcre16_extra *\fIextra\fP,
-.B "     pcre16_jit_callback \fIcallback\fP, void *\fIdata\fP);"
-.sp
-.B void pcre32_assign_jit_stack(pcre32_extra *\fIextra\fP,
-.B "     pcre32_jit_callback \fIcallback\fP, void *\fIdata\fP);"
-.fi
-.
-.SH DESCRIPTION
-.rs
-.sp
-This function provides control over the memory used as a stack at run-time by a
-call to \fBpcre[16|32]_exec()\fP with a pattern that has been successfully
-compiled with JIT optimization. The arguments are:
-.sp
-  extra     the data pointer returned by \fBpcre[16|32]_study()\fP
-  callback  a callback function
-  data      a JIT stack or a value to be passed to the callback
-              function
-.P
-If \fIcallback\fP is NULL and \fIdata\fP is NULL, an internal 32K block on
-the machine stack is used.
-.P
-If \fIcallback\fP is NULL and \fIdata\fP is not NULL, \fIdata\fP must
-be a valid JIT stack, the result of calling \fBpcre[16|32]_jit_stack_alloc()\fP.
-.P
-If \fIcallback\fP not NULL, it is called with \fIdata\fP as an argument at
-the start of matching, in order to set up a JIT stack. If the result is NULL,
-the internal 32K stack is used; otherwise the return value must be a valid JIT
-stack, the result of calling \fBpcre[16|32]_jit_stack_alloc()\fP.
-.P
-You may safely assign the same JIT stack to multiple patterns, as long as they
-are all matched in the same thread. In a multithread application, each thread
-must use its own JIT stack. For more details, see the
-.\" HREF
-\fBpcrejit\fP
-.\"
-page.
-.P
-There is a complete description of the PCRE native API in the
-.\" HREF
-\fBpcreapi\fP
-.\"
-page and a description of the POSIX API in the
-.\" HREF
-\fBpcreposix\fP
-.\"
-page.
diff --git a/dist/doc/pcre_compile.3 b/dist/doc/pcre_compile.3
deleted file mode 100644
index 5c16ebe..0000000
--- a/dist/doc/pcre_compile.3
+++ /dev/null
@@ -1,96 +0,0 @@
-.TH PCRE_COMPILE 3 "01 October 2013" "PCRE 8.34"
-.SH NAME
-PCRE - Perl-compatible regular expressions
-.SH SYNOPSIS
-.rs
-.sp
-.B #include <pcre.h>
-.PP
-.nf
-.B pcre *pcre_compile(const char *\fIpattern\fP, int \fIoptions\fP,
-.B "     const char **\fIerrptr\fP, int *\fIerroffset\fP,"
-.B "     const unsigned char *\fItableptr\fP);"
-.sp
-.B pcre16 *pcre16_compile(PCRE_SPTR16 \fIpattern\fP, int \fIoptions\fP,
-.B "     const char **\fIerrptr\fP, int *\fIerroffset\fP,"
-.B "     const unsigned char *\fItableptr\fP);"
-.sp
-.B pcre32 *pcre32_compile(PCRE_SPTR32 \fIpattern\fP, int \fIoptions\fP,
-.B "     const char **\fIerrptr\fP, int *\fIerroffset\fP,"
-.B "     const unsigned char *\fItableptr\fP);"
-.fi
-.
-.SH DESCRIPTION
-.rs
-.sp
-This function compiles a regular expression into an internal form. It is the
-same as \fBpcre[16|32]_compile2()\fP, except for the absence of the
-\fIerrorcodeptr\fP argument. Its arguments are:
-.sp
-  \fIpattern\fP       A zero-terminated string containing the
-                  regular expression to be compiled
-  \fIoptions\fP       Zero or more option bits
-  \fIerrptr\fP        Where to put an error message
-  \fIerroffset\fP     Offset in pattern where error was found
-  \fItableptr\fP      Pointer to character tables, or NULL to
-                  use the built-in default
-.sp
-The option bits are:
-.sp
-  PCRE_ANCHORED           Force pattern anchoring
-  PCRE_AUTO_CALLOUT       Compile automatic callouts
-  PCRE_BSR_ANYCRLF        \eR matches only CR, LF, or CRLF
-  PCRE_BSR_UNICODE        \eR matches all Unicode line endings
-  PCRE_CASELESS           Do caseless matching
-  PCRE_DOLLAR_ENDONLY     $ not to match newline at end
-  PCRE_DOTALL             . matches anything including NL
-  PCRE_DUPNAMES           Allow duplicate names for subpatterns
-  PCRE_EXTENDED           Ignore white space and # comments
-  PCRE_EXTRA              PCRE extra features
-                            (not much use currently)
-  PCRE_FIRSTLINE          Force matching to be before newline
-  PCRE_JAVASCRIPT_COMPAT  JavaScript compatibility
-  PCRE_MULTILINE          ^ and $ match newlines within data
-  PCRE_NEVER_UTF          Lock out UTF, e.g. via (*UTF)
-  PCRE_NEWLINE_ANY        Recognize any Unicode newline sequence
-  PCRE_NEWLINE_ANYCRLF    Recognize CR, LF, and CRLF as newline
-                            sequences
-  PCRE_NEWLINE_CR         Set CR as the newline sequence
-  PCRE_NEWLINE_CRLF       Set CRLF as the newline sequence
-  PCRE_NEWLINE_LF         Set LF as the newline sequence
-  PCRE_NO_AUTO_CAPTURE    Disable numbered capturing paren-
-                            theses (named ones available)
-  PCRE_NO_AUTO_POSSESS    Disable auto-possessification
-  PCRE_NO_START_OPTIMIZE  Disable match-time start optimizations
-  PCRE_NO_UTF16_CHECK     Do not check the pattern for UTF-16
-                            validity (only relevant if
-                            PCRE_UTF16 is set)
-  PCRE_NO_UTF32_CHECK     Do not check the pattern for UTF-32
-                            validity (only relevant if
-                            PCRE_UTF32 is set)
-  PCRE_NO_UTF8_CHECK      Do not check the pattern for UTF-8
-                            validity (only relevant if
-                            PCRE_UTF8 is set)
-  PCRE_UCP                Use Unicode properties for \ed, \ew, etc.
-  PCRE_UNGREEDY           Invert greediness of quantifiers
-  PCRE_UTF16              Run in \fBpcre16_compile()\fP UTF-16 mode
-  PCRE_UTF32              Run in \fBpcre32_compile()\fP UTF-32 mode
-  PCRE_UTF8               Run in \fBpcre_compile()\fP UTF-8 mode
-.sp
-PCRE must be built with UTF support in order to use PCRE_UTF8/16/32 and
-PCRE_NO_UTF8/16/32_CHECK, and with UCP support if PCRE_UCP is used.
-.P
-The yield of the function is a pointer to a private data structure that
-contains the compiled pattern, or NULL if an error was detected. Note that
-compiling regular expressions with one version of PCRE for use with a different
-version is not guaranteed to work and may cause crashes.
-.P
-There is a complete description of the PCRE native API in the
-.\" HREF
-\fBpcreapi\fP
-.\"
-page and a description of the POSIX API in the
-.\" HREF
-\fBpcreposix\fP
-.\"
-page.
diff --git a/dist/doc/pcre_compile2.3 b/dist/doc/pcre_compile2.3
deleted file mode 100644
index 3774201..0000000
--- a/dist/doc/pcre_compile2.3
+++ /dev/null
@@ -1,101 +0,0 @@
-.TH PCRE_COMPILE2 3 "01 October 2013" "PCRE 8.34"
-.SH NAME
-PCRE - Perl-compatible regular expressions
-.SH SYNOPSIS
-.rs
-.sp
-.B #include <pcre.h>
-.PP
-.nf
-.B pcre *pcre_compile2(const char *\fIpattern\fP, int \fIoptions\fP,
-.B "     int *\fIerrorcodeptr\fP,"
-.B "     const char **\fIerrptr\fP, int *\fIerroffset\fP,"
-.B "     const unsigned char *\fItableptr\fP);"
-.sp
-.B pcre16 *pcre16_compile2(PCRE_SPTR16 \fIpattern\fP, int \fIoptions\fP,
-.B "     int *\fIerrorcodeptr\fP,"
-.B "     const char **\fIerrptr\fP, int *\fIerroffset\fP,"
-.B "     const unsigned char *\fItableptr\fP);"
-.sp
-.B pcre32 *pcre32_compile2(PCRE_SPTR32 \fIpattern\fP, int \fIoptions\fP,
-.B "     int *\fIerrorcodeptr\fP,£
-.B "     const char **\fIerrptr\fP, int *\fIerroffset\fP,"
-.B "     const unsigned char *\fItableptr\fP);"
-.fi
-.
-.SH DESCRIPTION
-.rs
-.sp
-This function compiles a regular expression into an internal form. It is the
-same as \fBpcre[16|32]_compile()\fP, except for the addition of the
-\fIerrorcodeptr\fP argument. The arguments are:
-.
-.sp
-  \fIpattern\fP       A zero-terminated string containing the
-                  regular expression to be compiled
-  \fIoptions\fP       Zero or more option bits
-  \fIerrorcodeptr\fP  Where to put an error code
-  \fIerrptr\fP        Where to put an error message
-  \fIerroffset\fP     Offset in pattern where error was found
-  \fItableptr\fP      Pointer to character tables, or NULL to
-                  use the built-in default
-.sp
-The option bits are:
-.sp
-  PCRE_ANCHORED           Force pattern anchoring
-  PCRE_AUTO_CALLOUT       Compile automatic callouts
-  PCRE_BSR_ANYCRLF        \eR matches only CR, LF, or CRLF
-  PCRE_BSR_UNICODE        \eR matches all Unicode line endings
-  PCRE_CASELESS           Do caseless matching
-  PCRE_DOLLAR_ENDONLY     $ not to match newline at end
-  PCRE_DOTALL             . matches anything including NL
-  PCRE_DUPNAMES           Allow duplicate names for subpatterns
-  PCRE_EXTENDED           Ignore white space and # comments
-  PCRE_EXTRA              PCRE extra features
-                            (not much use currently)
-  PCRE_FIRSTLINE          Force matching to be before newline
-  PCRE_JAVASCRIPT_COMPAT  JavaScript compatibility
-  PCRE_MULTILINE          ^ and $ match newlines within data
-  PCRE_NEVER_UTF          Lock out UTF, e.g. via (*UTF)
-  PCRE_NEWLINE_ANY        Recognize any Unicode newline sequence
-  PCRE_NEWLINE_ANYCRLF    Recognize CR, LF, and CRLF as newline
-                            sequences
-  PCRE_NEWLINE_CR         Set CR as the newline sequence
-  PCRE_NEWLINE_CRLF       Set CRLF as the newline sequence
-  PCRE_NEWLINE_LF         Set LF as the newline sequence
-  PCRE_NO_AUTO_CAPTURE    Disable numbered capturing paren-
-                            theses (named ones available)
-  PCRE_NO_AUTO_POSSESS    Disable auto-possessification
-  PCRE_NO_START_OPTIMIZE  Disable match-time start optimizations
-  PCRE_NO_UTF16_CHECK     Do not check the pattern for UTF-16
-                            validity (only relevant if
-                            PCRE_UTF16 is set)
-  PCRE_NO_UTF32_CHECK     Do not check the pattern for UTF-32
-                            validity (only relevant if
-                            PCRE_UTF32 is set)
-  PCRE_NO_UTF8_CHECK      Do not check the pattern for UTF-8
-                            validity (only relevant if
-                            PCRE_UTF8 is set)
-  PCRE_UCP                Use Unicode properties for \ed, \ew, etc.
-  PCRE_UNGREEDY           Invert greediness of quantifiers
-  PCRE_UTF16              Run \fBpcre16_compile()\fP in UTF-16 mode
-  PCRE_UTF32              Run \fBpcre32_compile()\fP in UTF-32 mode
-  PCRE_UTF8               Run \fBpcre_compile()\fP in UTF-8 mode
-.sp
-PCRE must be built with UTF support in order to use PCRE_UTF8/16/32 and
-PCRE_NO_UTF8/16/32_CHECK, and with UCP support if PCRE_UCP is used.
-.P
-The yield of the function is a pointer to a private data structure that
-contains the compiled pattern, or NULL if an error was detected. Note that
-compiling regular expressions with one version of PCRE for use with a different
-version is not guaranteed to work and may cause crashes.
-.P
-There is a complete description of the PCRE native API in the
-.\" HREF
-\fBpcreapi\fP
-.\"
-page and a description of the POSIX API in the
-.\" HREF
-\fBpcreposix\fP
-.\"
-page.
diff --git a/dist/doc/pcre_config.3 b/dist/doc/pcre_config.3
deleted file mode 100644
index d14ffda..0000000
--- a/dist/doc/pcre_config.3
+++ /dev/null
@@ -1,79 +0,0 @@
-.TH PCRE_CONFIG 3 "20 April 2014" "PCRE 8.36"
-.SH NAME
-PCRE - Perl-compatible regular expressions
-.SH SYNOPSIS
-.rs
-.sp
-.B #include <pcre.h>
-.PP
-.SM
-.B int pcre_config(int \fIwhat\fP, void *\fIwhere\fP);
-.PP
-.B int pcre16_config(int \fIwhat\fP, void *\fIwhere\fP);
-.PP
-.B int pcre32_config(int \fIwhat\fP, void *\fIwhere\fP);
-.
-.SH DESCRIPTION
-.rs
-.sp
-This function makes it possible for a client program to find out which optional
-features are available in the version of the PCRE library it is using. The
-arguments are as follows:
-.sp
-  \fIwhat\fP     A code specifying what information is required
-  \fIwhere\fP    Points to where to put the data
-.sp
-The \fIwhere\fP argument must point to an integer variable, except for
-PCRE_CONFIG_MATCH_LIMIT, PCRE_CONFIG_MATCH_LIMIT_RECURSION, and
-PCRE_CONFIG_PARENS_LIMIT, when it must point to an unsigned long integer,
-and for PCRE_CONFIG_JITTARGET, when it must point to a const char*.
-The available codes are:
-.sp
-  PCRE_CONFIG_JIT           Availability of just-in-time compiler
-                              support (1=yes 0=no)
-  PCRE_CONFIG_JITTARGET     String containing information about the
-                              target architecture for the JIT compiler,
-                              or NULL if there is no JIT support
-  PCRE_CONFIG_LINK_SIZE     Internal link size: 2, 3, or 4
-  PCRE_CONFIG_PARENS_LIMIT  Parentheses nesting limit
-  PCRE_CONFIG_MATCH_LIMIT   Internal resource limit
-  PCRE_CONFIG_MATCH_LIMIT_RECURSION
-                            Internal recursion depth limit
-  PCRE_CONFIG_NEWLINE       Value of the default newline sequence:
-                                13 (0x000d)    for CR
-                                10 (0x000a)    for LF
-                              3338 (0x0d0a)    for CRLF
-                                -2             for ANYCRLF
-                                -1             for ANY
-  PCRE_CONFIG_BSR           Indicates what \eR matches by default:
-                                 0             all Unicode line endings
-                                 1             CR, LF, or CRLF only
-  PCRE_CONFIG_POSIX_MALLOC_THRESHOLD
-                            Threshold of return slots, above which
-                              \fBmalloc()\fP is used by the POSIX API
-  PCRE_CONFIG_STACKRECURSE  Recursion implementation (1=stack 0=heap)
-  PCRE_CONFIG_UTF16         Availability of UTF-16 support (1=yes
-                               0=no); option for \fBpcre16_config()\fP
-  PCRE_CONFIG_UTF32         Availability of UTF-32 support (1=yes
-                               0=no); option for \fBpcre32_config()\fP
-  PCRE_CONFIG_UTF8          Availability of UTF-8 support (1=yes 0=no);
-                              option for \fBpcre_config()\fP
-  PCRE_CONFIG_UNICODE_PROPERTIES
-                            Availability of Unicode property support
-                              (1=yes 0=no)
-.sp
-The function yields 0 on success or PCRE_ERROR_BADOPTION otherwise. That error
-is also given if PCRE_CONFIG_UTF16 or PCRE_CONFIG_UTF32 is passed to
-\fBpcre_config()\fP, if PCRE_CONFIG_UTF8 or PCRE_CONFIG_UTF32 is passed to
-\fBpcre16_config()\fP, or if PCRE_CONFIG_UTF8 or PCRE_CONFIG_UTF16 is passed to
-\fBpcre32_config()\fP.
-.P
-There is a complete description of the PCRE native API in the
-.\" HREF
-\fBpcreapi\fP
-.\"
-page and a description of the POSIX API in the
-.\" HREF
-\fBpcreposix\fP
-.\"
-page.
diff --git a/dist/doc/pcre_copy_named_substring.3 b/dist/doc/pcre_copy_named_substring.3
deleted file mode 100644
index 52582ae..0000000
--- a/dist/doc/pcre_copy_named_substring.3
+++ /dev/null
@@ -1,51 +0,0 @@
-.TH PCRE_COPY_NAMED_SUBSTRING 3 "24 June 2012" "PCRE 8.30"
-.SH NAME
-PCRE - Perl-compatible regular expressions
-.SH SYNOPSIS
-.rs
-.sp
-.B #include <pcre.h>
-.PP
-.nf
-.B int pcre_copy_named_substring(const pcre *\fIcode\fP,
-.B "     const char *\fIsubject\fP, int *\fIovector\fP,"
-.B "     int \fIstringcount\fP, const char *\fIstringname\fP,"
-.B "     char *\fIbuffer\fP, int \fIbuffersize\fP);"
-.sp
-.B int pcre16_copy_named_substring(const pcre16 *\fIcode\fP,
-.B "     PCRE_SPTR16 \fIsubject\fP, int *\fIovector\fP,"
-.B "     int \fIstringcount\fP, PCRE_SPTR16 \fIstringname\fP,"
-.B "     PCRE_UCHAR16 *\fIbuffer\fP, int \fIbuffersize\fP);"
-.sp
-.B int pcre32_copy_named_substring(const pcre32 *\fIcode\fP,
-.B "     PCRE_SPTR32 \fIsubject\fP, int *\fIovector\fP,"
-.B "     int \fIstringcount\fP, PCRE_SPTR32 \fIstringname\fP,"
-.B "     PCRE_UCHAR32 *\fIbuffer\fP, int \fIbuffersize\fP);"
-.fi
-.
-.SH DESCRIPTION
-.rs
-.sp
-This is a convenience function for extracting a captured substring, identified
-by name, into a given buffer. The arguments are:
-.sp
-  \fIcode\fP          Pattern that was successfully matched
-  \fIsubject\fP       Subject that has been successfully matched
-  \fIovector\fP       Offset vector that \fBpcre[16|32]_exec()\fP used
-  \fIstringcount\fP   Value returned by \fBpcre[16|32]_exec()\fP
-  \fIstringname\fP    Name of the required substring
-  \fIbuffer\fP        Buffer to receive the string
-  \fIbuffersize\fP    Size of buffer
-.sp
-The yield is the length of the substring, PCRE_ERROR_NOMEMORY if the buffer was
-too small, or PCRE_ERROR_NOSUBSTRING if the string name is invalid.
-.P
-There is a complete description of the PCRE native API in the
-.\" HREF
-\fBpcreapi\fP
-.\"
-page and a description of the POSIX API in the
-.\" HREF
-\fBpcreposix\fP
-.\"
-page.
diff --git a/dist/doc/pcre_copy_substring.3 b/dist/doc/pcre_copy_substring.3
deleted file mode 100644
index 83af6e8..0000000
--- a/dist/doc/pcre_copy_substring.3
+++ /dev/null
@@ -1,47 +0,0 @@
-.TH PCRE_COPY_SUBSTRING 3 "24 June 2012" "PCRE 8.30"
-.SH NAME
-PCRE - Perl-compatible regular expressions
-.SH SYNOPSIS
-.rs
-.sp
-.B #include <pcre.h>
-.PP
-.nf
-.B int pcre_copy_substring(const char *\fIsubject\fP, int *\fIovector\fP,
-.B "     int \fIstringcount\fP, int \fIstringnumber\fP, char *\fIbuffer\fP,"
-.B "     int \fIbuffersize\fP);"
-.sp
-.B int pcre16_copy_substring(PCRE_SPTR16 \fIsubject\fP, int *\fIovector\fP,
-.B "     int \fIstringcount\fP, int \fIstringnumber\fP, PCRE_UCHAR16 *\fIbuffer\fP,"
-.B "     int \fIbuffersize\fP);"
-.sp
-.B int pcre32_copy_substring(PCRE_SPTR32 \fIsubject\fP, int *\fIovector\fP,
-.B "     int \fIstringcount\fP, int \fIstringnumber\fP, PCRE_UCHAR32 *\fIbuffer\fP,"
-.B "     int \fIbuffersize\fP);"
-.fi
-.
-.SH DESCRIPTION
-.rs
-.sp
-This is a convenience function for extracting a captured substring into a given
-buffer. The arguments are:
-.sp
-  \fIsubject\fP       Subject that has been successfully matched
-  \fIovector\fP       Offset vector that \fBpcre[16|32]_exec()\fP used
-  \fIstringcount\fP   Value returned by \fBpcre[16|32]_exec()\fP
-  \fIstringnumber\fP  Number of the required substring
-  \fIbuffer\fP        Buffer to receive the string
-  \fIbuffersize\fP    Size of buffer
-.sp
-The yield is the length of the string, PCRE_ERROR_NOMEMORY if the buffer was
-too small, or PCRE_ERROR_NOSUBSTRING if the string number is invalid.
-.P
-There is a complete description of the PCRE native API in the
-.\" HREF
-\fBpcreapi\fP
-.\"
-page and a description of the POSIX API in the
-.\" HREF
-\fBpcreposix\fP
-.\"
-page.
diff --git a/dist/doc/pcre_dfa_exec.3 b/dist/doc/pcre_dfa_exec.3
deleted file mode 100644
index 39c2e83..0000000
--- a/dist/doc/pcre_dfa_exec.3
+++ /dev/null
@@ -1,118 +0,0 @@
-.TH PCRE_DFA_EXEC 3 "12 May 2013" "PCRE 8.33"
-.SH NAME
-PCRE - Perl-compatible regular expressions
-.SH SYNOPSIS
-.rs
-.sp
-.B #include <pcre.h>
-.PP
-.nf
-.B int pcre_dfa_exec(const pcre *\fIcode\fP, "const pcre_extra *\fIextra\fP,"
-.B "     const char *\fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP,"
-.B "     int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP,"
-.B "     int *\fIworkspace\fP, int \fIwscount\fP);"
-.sp
-.B int pcre16_dfa_exec(const pcre16 *\fIcode\fP, "const pcre16_extra *\fIextra\fP,"
-.B "     PCRE_SPTR16 \fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP,"
-.B "     int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP,"
-.B "     int *\fIworkspace\fP, int \fIwscount\fP);"
-.sp
-.B int pcre32_dfa_exec(const pcre32 *\fIcode\fP, "const pcre32_extra *\fIextra\fP,"
-.B "     PCRE_SPTR32 \fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP,"
-.B "     int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP,"
-.B "     int *\fIworkspace\fP, int \fIwscount\fP);"
-.fi
-.
-.SH DESCRIPTION
-.rs
-.sp
-This function matches a compiled regular expression against a given subject
-string, using an alternative matching algorithm that scans the subject string
-just once (\fInot\fP Perl-compatible). Note that the main, Perl-compatible,
-matching function is \fBpcre[16|32]_exec()\fP. The arguments for this function
-are:
-.sp
-  \fIcode\fP         Points to the compiled pattern
-  \fIextra\fP        Points to an associated \fBpcre[16|32]_extra\fP structure,
-                 or is NULL
-  \fIsubject\fP      Points to the subject string
-  \fIlength\fP       Length of the subject string
-  \fIstartoffset\fP  Offset in the subject at which to start matching
-  \fIoptions\fP      Option bits
-  \fIovector\fP      Points to a vector of ints for result offsets
-  \fIovecsize\fP     Number of elements in the vector
-  \fIworkspace\fP    Points to a vector of ints used as working space
-  \fIwscount\fP      Number of elements in the vector
-.sp
-The units for \fIlength\fP and \fIstartoffset\fP are bytes for
-\fBpcre_exec()\fP, 16-bit data items for \fBpcre16_exec()\fP, and 32-bit items
-for \fBpcre32_exec()\fP. The options are:
-.sp
-  PCRE_ANCHORED          Match only at the first position
-  PCRE_BSR_ANYCRLF       \eR matches only CR, LF, or CRLF
-  PCRE_BSR_UNICODE       \eR matches all Unicode line endings
-  PCRE_NEWLINE_ANY       Recognize any Unicode newline sequence
-  PCRE_NEWLINE_ANYCRLF   Recognize CR, LF, & CRLF as newline sequences
-  PCRE_NEWLINE_CR        Recognize CR as the only newline sequence
-  PCRE_NEWLINE_CRLF      Recognize CRLF as the only newline sequence
-  PCRE_NEWLINE_LF        Recognize LF as the only newline sequence
-  PCRE_NOTBOL            Subject is not the beginning of a line
-  PCRE_NOTEOL            Subject is not the end of a line
-  PCRE_NOTEMPTY          An empty string is not a valid match
-  PCRE_NOTEMPTY_ATSTART  An empty string at the start of the subject
-                           is not a valid match
-  PCRE_NO_START_OPTIMIZE Do not do "start-match" optimizations
-  PCRE_NO_UTF16_CHECK    Do not check the subject for UTF-16
-                           validity (only relevant if PCRE_UTF16
-                           was set at compile time)
-  PCRE_NO_UTF32_CHECK    Do not check the subject for UTF-32
-                           validity (only relevant if PCRE_UTF32
-                           was set at compile time)
-  PCRE_NO_UTF8_CHECK     Do not check the subject for UTF-8
-                           validity (only relevant if PCRE_UTF8
-                           was set at compile time)
-  PCRE_PARTIAL           ) Return PCRE_ERROR_PARTIAL for a partial
-  PCRE_PARTIAL_SOFT      )   match if no full matches are found
-  PCRE_PARTIAL_HARD      Return PCRE_ERROR_PARTIAL for a partial match
-                           even if there is a full match as well
-  PCRE_DFA_SHORTEST      Return only the shortest match
-  PCRE_DFA_RESTART       Restart after a partial match
-.sp
-There are restrictions on what may appear in a pattern when using this matching
-function. Details are given in the
-.\" HREF
-\fBpcrematching\fP
-.\"
-documentation. For details of partial matching, see the
-.\" HREF
-\fBpcrepartial\fP
-.\"
-page.
-.P
-A \fBpcre[16|32]_extra\fP structure contains the following fields:
-.sp
-  \fIflags\fP            Bits indicating which fields are set
-  \fIstudy_data\fP       Opaque data from \fBpcre[16|32]_study()\fP
-  \fImatch_limit\fP      Limit on internal resource use
-  \fImatch_limit_recursion\fP  Limit on internal recursion depth
-  \fIcallout_data\fP     Opaque data passed back to callouts
-  \fItables\fP           Points to character tables or is NULL
-  \fImark\fP             For passing back a *MARK pointer
-  \fIexecutable_jit\fP   Opaque data from JIT compilation
-.sp
-The flag bits are PCRE_EXTRA_STUDY_DATA, PCRE_EXTRA_MATCH_LIMIT,
-PCRE_EXTRA_MATCH_LIMIT_RECURSION, PCRE_EXTRA_CALLOUT_DATA,
-PCRE_EXTRA_TABLES, PCRE_EXTRA_MARK and PCRE_EXTRA_EXECUTABLE_JIT. For this
-matching function, the \fImatch_limit\fP and \fImatch_limit_recursion\fP fields
-are not used, and must not be set. The PCRE_EXTRA_EXECUTABLE_JIT flag and
-the corresponding variable are ignored.
-.P
-There is a complete description of the PCRE native API in the
-.\" HREF
-\fBpcreapi\fP
-.\"
-page and a description of the POSIX API in the
-.\" HREF
-\fBpcreposix\fP
-.\"
-page.
diff --git a/dist/doc/pcre_exec.3 b/dist/doc/pcre_exec.3
deleted file mode 100644
index 4686bd6..0000000
--- a/dist/doc/pcre_exec.3
+++ /dev/null
@@ -1,99 +0,0 @@
-.TH PCRE_EXEC 3 "12 May 2013" "PCRE 8.33"
-.SH NAME
-PCRE - Perl-compatible regular expressions
-.SH SYNOPSIS
-.rs
-.sp
-.B #include <pcre.h>
-.PP
-.nf
-.B int pcre_exec(const pcre *\fIcode\fP, "const pcre_extra *\fIextra\fP,"
-.B "     const char *\fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP,"
-.B "     int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP);"
-.sp
-.B int pcre16_exec(const pcre16 *\fIcode\fP, "const pcre16_extra *\fIextra\fP,"
-.B "     PCRE_SPTR16 \fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP,"
-.B "     int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP);"
-.sp
-.B int pcre32_exec(const pcre32 *\fIcode\fP, "const pcre32_extra *\fIextra\fP,"
-.B "     PCRE_SPTR32 \fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP,"
-.B "     int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP);"
-.fi
-.
-.SH DESCRIPTION
-.rs
-.sp
-This function matches a compiled regular expression against a given subject
-string, using a matching algorithm that is similar to Perl's. It returns
-offsets to captured substrings. Its arguments are:
-.sp
-  \fIcode\fP         Points to the compiled pattern
-  \fIextra\fP        Points to an associated \fBpcre[16|32]_extra\fP structure,
-                 or is NULL
-  \fIsubject\fP      Points to the subject string
-  \fIlength\fP       Length of the subject string
-  \fIstartoffset\fP  Offset in the subject at which to start matching
-  \fIoptions\fP      Option bits
-  \fIovector\fP      Points to a vector of ints for result offsets
-  \fIovecsize\fP     Number of elements in the vector (a multiple of 3)
-.sp
-The units for \fIlength\fP and \fIstartoffset\fP are bytes for
-\fBpcre_exec()\fP, 16-bit data items for \fBpcre16_exec()\fP, and 32-bit items
-for \fBpcre32_exec()\fP. The options are:
-.sp
-  PCRE_ANCHORED          Match only at the first position
-  PCRE_BSR_ANYCRLF       \eR matches only CR, LF, or CRLF
-  PCRE_BSR_UNICODE       \eR matches all Unicode line endings
-  PCRE_NEWLINE_ANY       Recognize any Unicode newline sequence
-  PCRE_NEWLINE_ANYCRLF   Recognize CR, LF, & CRLF as newline sequences
-  PCRE_NEWLINE_CR        Recognize CR as the only newline sequence
-  PCRE_NEWLINE_CRLF      Recognize CRLF as the only newline sequence
-  PCRE_NEWLINE_LF        Recognize LF as the only newline sequence
-  PCRE_NOTBOL            Subject string is not the beginning of a line
-  PCRE_NOTEOL            Subject string is not the end of a line
-  PCRE_NOTEMPTY          An empty string is not a valid match
-  PCRE_NOTEMPTY_ATSTART  An empty string at the start of the subject
-                           is not a valid match
-  PCRE_NO_START_OPTIMIZE Do not do "start-match" optimizations
-  PCRE_NO_UTF16_CHECK    Do not check the subject for UTF-16
-                           validity (only relevant if PCRE_UTF16
-                           was set at compile time)
-  PCRE_NO_UTF32_CHECK    Do not check the subject for UTF-32
-                           validity (only relevant if PCRE_UTF32
-                           was set at compile time)
-  PCRE_NO_UTF8_CHECK     Do not check the subject for UTF-8
-                           validity (only relevant if PCRE_UTF8
-                           was set at compile time)
-  PCRE_PARTIAL           ) Return PCRE_ERROR_PARTIAL for a partial
-  PCRE_PARTIAL_SOFT      )   match if no full matches are found
-  PCRE_PARTIAL_HARD      Return PCRE_ERROR_PARTIAL for a partial match
-                           if that is found before a full match
-.sp
-For details of partial matching, see the
-.\" HREF
-\fBpcrepartial\fP
-.\"
-page. A \fBpcre_extra\fP structure contains the following fields:
-.sp
-  \fIflags\fP            Bits indicating which fields are set
-  \fIstudy_data\fP       Opaque data from \fBpcre[16|32]_study()\fP
-  \fImatch_limit\fP      Limit on internal resource use
-  \fImatch_limit_recursion\fP  Limit on internal recursion depth
-  \fIcallout_data\fP     Opaque data passed back to callouts
-  \fItables\fP           Points to character tables or is NULL
-  \fImark\fP             For passing back a *MARK pointer
-  \fIexecutable_jit\fP   Opaque data from JIT compilation
-.sp
-The flag bits are PCRE_EXTRA_STUDY_DATA, PCRE_EXTRA_MATCH_LIMIT,
-PCRE_EXTRA_MATCH_LIMIT_RECURSION, PCRE_EXTRA_CALLOUT_DATA,
-PCRE_EXTRA_TABLES, PCRE_EXTRA_MARK and PCRE_EXTRA_EXECUTABLE_JIT.
-.P
-There is a complete description of the PCRE native API in the
-.\" HREF
-\fBpcreapi\fP
-.\"
-page and a description of the POSIX API in the
-.\" HREF
-\fBpcreposix\fP
-.\"
-page.
diff --git a/dist/doc/pcre_free_study.3 b/dist/doc/pcre_free_study.3
deleted file mode 100644
index 8826b73..0000000
--- a/dist/doc/pcre_free_study.3
+++ /dev/null
@@ -1,31 +0,0 @@
-.TH PCRE_FREE_STUDY 3 "24 June 2012" "PCRE 8.30"
-.SH NAME
-PCRE - Perl-compatible regular expressions
-.SH SYNOPSIS
-.rs
-.sp
-.B #include <pcre.h>
-.PP
-.SM
-.B void pcre_free_study(pcre_extra *\fIextra\fP);
-.PP
-.B void pcre16_free_study(pcre16_extra *\fIextra\fP);
-.PP
-.B void pcre32_free_study(pcre32_extra *\fIextra\fP);
-.
-.SH DESCRIPTION
-.rs
-.sp
-This function is used to free the memory used for the data generated by a call
-to \fBpcre[16|32]_study()\fP when it is no longer needed. The argument must be the
-result of such a call.
-.P
-There is a complete description of the PCRE native API in the
-.\" HREF
-\fBpcreapi\fP
-.\"
-page and a description of the POSIX API in the
-.\" HREF
-\fBpcreposix\fP
-.\"
-page.
diff --git a/dist/doc/pcre_free_substring.3 b/dist/doc/pcre_free_substring.3
deleted file mode 100644
index 88c0401..0000000
--- a/dist/doc/pcre_free_substring.3
+++ /dev/null
@@ -1,31 +0,0 @@
-.TH PCRE_FREE_SUBSTRING 3 "24 June 2012" "PCRE 8.30"
-.SH NAME
-PCRE - Perl-compatible regular expressions
-.SH SYNOPSIS
-.rs
-.sp
-.B #include <pcre.h>
-.PP
-.SM
-.B void pcre_free_substring(const char *\fIstringptr\fP);
-.PP
-.B void pcre16_free_substring(PCRE_SPTR16 \fIstringptr\fP);
-.PP
-.B void pcre32_free_substring(PCRE_SPTR32 \fIstringptr\fP);
-.
-.SH DESCRIPTION
-.rs
-.sp
-This is a convenience function for freeing the store obtained by a previous
-call to \fBpcre[16|32]_get_substring()\fP or \fBpcre[16|32]_get_named_substring()\fP.
-Its only argument is a pointer to the string.
-.P
-There is a complete description of the PCRE native API in the
-.\" HREF
-\fBpcreapi\fP
-.\"
-page and a description of the POSIX API in the
-.\" HREF
-\fBpcreposix\fP
-.\"
-page.
diff --git a/dist/doc/pcre_free_substring_list.3 b/dist/doc/pcre_free_substring_list.3
deleted file mode 100644
index 248b4bd..0000000
--- a/dist/doc/pcre_free_substring_list.3
+++ /dev/null
@@ -1,31 +0,0 @@
-.TH PCRE_FREE_SUBSTRING_LIST 3 "24 June 2012" "PCRE 8.30"
-.SH NAME
-PCRE - Perl-compatible regular expressions
-.SH SYNOPSIS
-.rs
-.sp
-.B #include <pcre.h>
-.PP
-.SM
-.B void pcre_free_substring_list(const char **\fIstringptr\fP);
-.PP
-.B void pcre16_free_substring_list(PCRE_SPTR16 *\fIstringptr\fP);
-.PP
-.B void pcre32_free_substring_list(PCRE_SPTR32 *\fIstringptr\fP);
-.
-.SH DESCRIPTION
-.rs
-.sp
-This is a convenience function for freeing the store obtained by a previous
-call to \fBpcre[16|32]_get_substring_list()\fP. Its only argument is a pointer to
-the list of string pointers.
-.P
-There is a complete description of the PCRE native API in the
-.\" HREF
-\fBpcreapi\fP
-.\"
-page and a description of the POSIX API in the
-.\" HREF
-\fBpcreposix\fP
-.\"
-page.
diff --git a/dist/doc/pcre_fullinfo.3 b/dist/doc/pcre_fullinfo.3
deleted file mode 100644
index c9b2c65..0000000
--- a/dist/doc/pcre_fullinfo.3
+++ /dev/null
@@ -1,103 +0,0 @@
-.TH PCRE_FULLINFO 3 "21 April 2014" "PCRE 8.36"
-.SH NAME
-PCRE - Perl-compatible regular expressions
-.SH SYNOPSIS
-.rs
-.sp
-.B #include <pcre.h>
-.PP
-.nf
-.B int pcre_fullinfo(const pcre *\fIcode\fP, "const pcre_extra *\fIextra\fP,"
-.B "     int \fIwhat\fP, void *\fIwhere\fP);"
-.sp
-.B int pcre16_fullinfo(const pcre16 *\fIcode\fP, "const pcre16_extra *\fIextra\fP,"
-.B "     int \fIwhat\fP, void *\fIwhere\fP);"
-.sp
-.B int pcre32_fullinfo(const pcre32 *\fIcode\fP, "const pcre32_extra *\fIextra\fP,"
-.B "     int \fIwhat\fP, void *\fIwhere\fP);"
-.fi
-.
-.SH DESCRIPTION
-.rs
-.sp
-This function returns information about a compiled pattern. Its arguments are:
-.sp
-  \fIcode\fP                      Compiled regular expression
-  \fIextra\fP                     Result of \fBpcre[16|32]_study()\fP or NULL
-  \fIwhat\fP                      What information is required
-  \fIwhere\fP                     Where to put the information
-.sp
-The following information is available:
-.sp
-  PCRE_INFO_BACKREFMAX      Number of highest back reference
-  PCRE_INFO_CAPTURECOUNT    Number of capturing subpatterns
-  PCRE_INFO_DEFAULT_TABLES  Pointer to default tables
-  PCRE_INFO_FIRSTBYTE       Fixed first data unit for a match, or
-                              -1 for start of string
-                                 or after newline, or
-                              -2 otherwise
-  PCRE_INFO_FIRSTTABLE      Table of first data units (after studying)
-  PCRE_INFO_HASCRORLF       Return 1 if explicit CR or LF matches exist
-  PCRE_INFO_JCHANGED        Return 1 if (?J) or (?-J) was used
-  PCRE_INFO_JIT             Return 1 after successful JIT compilation
-  PCRE_INFO_JITSIZE         Size of JIT compiled code
-  PCRE_INFO_LASTLITERAL     Literal last data unit required
-  PCRE_INFO_MINLENGTH       Lower bound length of matching strings
-  PCRE_INFO_MATCHEMPTY      Return 1 if the pattern can match an empty string,
-                               0 otherwise
-  PCRE_INFO_MATCHLIMIT      Match limit if set, otherwise PCRE_RROR_UNSET
-  PCRE_INFO_MAXLOOKBEHIND   Length (in characters) of the longest lookbehind assertion
-  PCRE_INFO_NAMECOUNT       Number of named subpatterns
-  PCRE_INFO_NAMEENTRYSIZE   Size of name table entry
-  PCRE_INFO_NAMETABLE       Pointer to name table
-  PCRE_INFO_OKPARTIAL       Return 1 if partial matching can be tried
-                              (always returns 1 after release 8.00)
-  PCRE_INFO_OPTIONS         Option bits used for compilation
-  PCRE_INFO_SIZE            Size of compiled pattern
-  PCRE_INFO_STUDYSIZE       Size of study data
-  PCRE_INFO_FIRSTCHARACTER      Fixed first data unit for a match
-  PCRE_INFO_FIRSTCHARACTERFLAGS Returns
-                                  1 if there is a first data character set, which can
-                                    then be retrieved using PCRE_INFO_FIRSTCHARACTER,
-                                  2 if the first character is at the start of the data
-                                    string or after a newline, and
-                                  0 otherwise
-  PCRE_INFO_RECURSIONLIMIT    Recursion limit if set, otherwise PCRE_ERROR_UNSET
-  PCRE_INFO_REQUIREDCHAR      Literal last data unit required
-  PCRE_INFO_REQUIREDCHARFLAGS Returns 1 if the last data character is set (which can then
-                              be retrieved using PCRE_INFO_REQUIREDCHAR); 0 otherwise
-.sp
-The \fIwhere\fP argument must point to an integer variable, except for the
-following \fIwhat\fP values:
-.sp
-  PCRE_INFO_DEFAULT_TABLES  const uint8_t *
-  PCRE_INFO_FIRSTCHARACTER  uint32_t
-  PCRE_INFO_FIRSTTABLE      const uint8_t *
-  PCRE_INFO_JITSIZE         size_t
-  PCRE_INFO_MATCHLIMIT      uint32_t
-  PCRE_INFO_NAMETABLE       PCRE_SPTR16           (16-bit library)
-  PCRE_INFO_NAMETABLE       PCRE_SPTR32           (32-bit library)
-  PCRE_INFO_NAMETABLE       const unsigned char * (8-bit library)
-  PCRE_INFO_OPTIONS         unsigned long int
-  PCRE_INFO_SIZE            size_t
-  PCRE_INFO_STUDYSIZE       size_t
-  PCRE_INFO_RECURSIONLIMIT  uint32_t
-  PCRE_INFO_REQUIREDCHAR    uint32_t
-.sp
-The yield of the function is zero on success or:
-.sp
-  PCRE_ERROR_NULL           the argument \fIcode\fP was NULL
-                            the argument \fIwhere\fP was NULL
-  PCRE_ERROR_BADMAGIC       the "magic number" was not found
-  PCRE_ERROR_BADOPTION      the value of \fIwhat\fP was invalid
-  PCRE_ERROR_UNSET          the option was not set
-.P
-There is a complete description of the PCRE native API in the
-.\" HREF
-\fBpcreapi\fP
-.\"
-page and a description of the POSIX API in the
-.\" HREF
-\fBpcreposix\fP
-.\"
-page.
diff --git a/dist/doc/pcre_get_named_substring.3 b/dist/doc/pcre_get_named_substring.3
deleted file mode 100644
index 84d4ee7..0000000
--- a/dist/doc/pcre_get_named_substring.3
+++ /dev/null
@@ -1,54 +0,0 @@
-.TH PCRE_GET_NAMED_SUBSTRING 3 "24 June 2012" "PCRE 8.30"
-.SH NAME
-PCRE - Perl-compatible regular expressions
-.SH SYNOPSIS
-.rs
-.sp
-.B #include <pcre.h>
-.PP
-.nf
-.B int pcre_get_named_substring(const pcre *\fIcode\fP,
-.B "     const char *\fIsubject\fP, int *\fIovector\fP,"
-.B "     int \fIstringcount\fP, const char *\fIstringname\fP,"
-.B "     const char **\fIstringptr\fP);"
-.sp
-.B int pcre16_get_named_substring(const pcre16 *\fIcode\fP,
-.B "     PCRE_SPTR16 \fIsubject\fP, int *\fIovector\fP,"
-.B "     int \fIstringcount\fP, PCRE_SPTR16 \fIstringname\fP,"
-.B "     PCRE_SPTR16 *\fIstringptr\fP);"
-.sp
-.B int pcre32_get_named_substring(const pcre32 *\fIcode\fP,
-.B "     PCRE_SPTR32 \fIsubject\fP, int *\fIovector\fP,"
-.B "     int \fIstringcount\fP, PCRE_SPTR32 \fIstringname\fP,"
-.B "     PCRE_SPTR32 *\fIstringptr\fP);"
-.fi
-.
-.SH DESCRIPTION
-.rs
-.sp
-This is a convenience function for extracting a captured substring by name. The
-arguments are:
-.sp
-  \fIcode\fP          Compiled pattern
-  \fIsubject\fP       Subject that has been successfully matched
-  \fIovector\fP       Offset vector that \fBpcre[16|32]_exec()\fP used
-  \fIstringcount\fP   Value returned by \fBpcre[16|32]_exec()\fP
-  \fIstringname\fP    Name of the required substring
-  \fIstringptr\fP     Where to put the string pointer
-.sp
-The memory in which the substring is placed is obtained by calling
-\fBpcre[16|32]_malloc()\fP. The convenience function
-\fBpcre[16|32]_free_substring()\fP can be used to free it when it is no longer
-needed. The yield of the function is the length of the extracted substring,
-PCRE_ERROR_NOMEMORY if sufficient memory could not be obtained, or
-PCRE_ERROR_NOSUBSTRING if the string name is invalid.
-.P
-There is a complete description of the PCRE native API in the
-.\" HREF
-\fBpcreapi\fP
-.\"
-page and a description of the POSIX API in the
-.\" HREF
-\fBpcreposix\fP
-.\"
-page.
diff --git a/dist/doc/pcre_get_stringnumber.3 b/dist/doc/pcre_get_stringnumber.3
deleted file mode 100644
index 9fc5291..0000000
--- a/dist/doc/pcre_get_stringnumber.3
+++ /dev/null
@@ -1,43 +0,0 @@
-.TH PCRE_GET_STRINGNUMBER 3 "24 June 2012" "PCRE 8.30"
-.SH NAME
-PCRE - Perl-compatible regular expressions
-.SH SYNOPSIS
-.rs
-.sp
-.B #include <pcre.h>
-.PP
-.nf
-.B int pcre_get_stringnumber(const pcre *\fIcode\fP,
-.B "     const char *\fIname\fP);"
-.sp
-.B int pcre16_get_stringnumber(const pcre16 *\fIcode\fP,
-.B "     PCRE_SPTR16 \fIname\fP);"
-.sp
-.B int pcre32_get_stringnumber(const pcre32 *\fIcode\fP,
-.B "     PCRE_SPTR32 \fIname\fP);"
-.fi
-.
-.SH DESCRIPTION
-.rs
-.sp
-This convenience function finds the number of a named substring capturing
-parenthesis in a compiled pattern. Its arguments are:
-.sp
-  \fIcode\fP    Compiled regular expression
-  \fIname\fP    Name whose number is required
-.sp
-The yield of the function is the number of the parenthesis if the name is
-found, or PCRE_ERROR_NOSUBSTRING otherwise. When duplicate names are allowed
-(PCRE_DUPNAMES is set), it is not defined which of the numbers is returned by
-\fBpcre[16|32]_get_stringnumber()\fP. You can obtain the complete list by calling
-\fBpcre[16|32]_get_stringtable_entries()\fP.
-.P
-There is a complete description of the PCRE native API in the
-.\" HREF
-\fBpcreapi\fP
-.\"
-page and a description of the POSIX API in the
-.\" HREF
-\fBpcreposix\fP
-.\"
-page.
diff --git a/dist/doc/pcre_get_stringtable_entries.3 b/dist/doc/pcre_get_stringtable_entries.3
deleted file mode 100644
index 5c58c90..0000000
--- a/dist/doc/pcre_get_stringtable_entries.3
+++ /dev/null
@@ -1,46 +0,0 @@
-.TH PCRE_GET_STRINGTABLE_ENTRIES 3 "24 June 2012" "PCRE 8.30"
-.SH NAME
-PCRE - Perl-compatible regular expressions
-.SH SYNOPSIS
-.rs
-.sp
-.B #include <pcre.h>
-.PP
-.nf
-.B int pcre_get_stringtable_entries(const pcre *\fIcode\fP,
-.B "     const char *\fIname\fP, char **\fIfirst\fP, char **\fIlast\fP);"
-.sp
-.B int pcre16_get_stringtable_entries(const pcre16 *\fIcode\fP,
-.B "     PCRE_SPTR16 \fIname\fP, PCRE_UCHAR16 **\fIfirst\fP, PCRE_UCHAR16 **\fIlast\fP);"
-.sp
-.B int pcre32_get_stringtable_entries(const pcre32 *\fIcode\fP,
-.B "     PCRE_SPTR32 \fIname\fP, PCRE_UCHAR32 **\fIfirst\fP, PCRE_UCHAR32 **\fIlast\fP);"
-.fi
-.
-.SH DESCRIPTION
-.rs
-.sp
-This convenience function finds, for a compiled pattern, the first and last
-entries for a given name in the table that translates capturing parenthesis
-names into numbers. When names are required to be unique (PCRE_DUPNAMES is
-\fInot\fP set), it is usually easier to use \fBpcre[16|32]_get_stringnumber()\fP
-instead.
-.sp
-  \fIcode\fP    Compiled regular expression
-  \fIname\fP    Name whose entries required
-  \fIfirst\fP   Where to return a pointer to the first entry
-  \fIlast\fP    Where to return a pointer to the last entry
-.sp
-The yield of the function is the length of each entry, or
-PCRE_ERROR_NOSUBSTRING if none are found.
-.P
-There is a complete description of the PCRE native API, including the format of
-the table entries, in the
-.\" HREF
-\fBpcreapi\fP
-.\"
-page, and a description of the POSIX API in the
-.\" HREF
-\fBpcreposix\fP
-.\"
-page.
diff --git a/dist/doc/pcre_get_substring.3 b/dist/doc/pcre_get_substring.3
deleted file mode 100644
index 1e62b2c..0000000
--- a/dist/doc/pcre_get_substring.3
+++ /dev/null
@@ -1,50 +0,0 @@
-.TH PCRE_GET_SUBSTRING 3 "24 June 2012" "PCRE 8.30"
-.SH NAME
-PCRE - Perl-compatible regular expressions
-.SH SYNOPSIS
-.rs
-.sp
-.B #include <pcre.h>
-.PP
-.nf
-.B int pcre_get_substring(const char *\fIsubject\fP, int *\fIovector\fP,
-.B "     int \fIstringcount\fP, int \fIstringnumber\fP,"
-.B "     const char **\fIstringptr\fP);"
-.sp
-.B int pcre16_get_substring(PCRE_SPTR16 \fIsubject\fP, int *\fIovector\fP,
-.B "     int \fIstringcount\fP, int \fIstringnumber\fP,"
-.B "     PCRE_SPTR16 *\fIstringptr\fP);"
-.sp
-.B int pcre32_get_substring(PCRE_SPTR32 \fIsubject\fP, int *\fIovector\fP,
-.B "     int \fIstringcount\fP, int \fIstringnumber\fP,"
-.B "     PCRE_SPTR32 *\fIstringptr\fP);"
-.fi
-.
-.SH DESCRIPTION
-.rs
-.sp
-This is a convenience function for extracting a captured substring. The
-arguments are:
-.sp
-  \fIsubject\fP       Subject that has been successfully matched
-  \fIovector\fP       Offset vector that \fBpcre[16|32]_exec()\fP used
-  \fIstringcount\fP   Value returned by \fBpcre[16|32]_exec()\fP
-  \fIstringnumber\fP  Number of the required substring
-  \fIstringptr\fP     Where to put the string pointer
-.sp
-The memory in which the substring is placed is obtained by calling
-\fBpcre[16|32]_malloc()\fP. The convenience function
-\fBpcre[16|32]_free_substring()\fP can be used to free it when it is no longer
-needed. The yield of the function is the length of the substring,
-PCRE_ERROR_NOMEMORY if sufficient memory could not be obtained, or
-PCRE_ERROR_NOSUBSTRING if the string number is invalid.
-.P
-There is a complete description of the PCRE native API in the
-.\" HREF
-\fBpcreapi\fP
-.\"
-page and a description of the POSIX API in the
-.\" HREF
-\fBpcreposix\fP
-.\"
-page.
diff --git a/dist/doc/pcre_get_substring_list.3 b/dist/doc/pcre_get_substring_list.3
deleted file mode 100644
index 511a4a3..0000000
--- a/dist/doc/pcre_get_substring_list.3
+++ /dev/null
@@ -1,47 +0,0 @@
-.TH PCRE_GET_SUBSTRING_LIST 3 "24 June 2012" "PCRE 8.30"
-.SH NAME
-PCRE - Perl-compatible regular expressions
-.SH SYNOPSIS
-.rs
-.sp
-.B #include <pcre.h>
-.PP
-.nf
-.B int pcre_get_substring_list(const char *\fIsubject\fP,
-.B "     int *\fIovector\fP, int \fIstringcount\fP, const char ***\fIlistptr\fP);"
-.sp
-.B int pcre16_get_substring_list(PCRE_SPTR16 \fIsubject\fP,
-.B "     int *\fIovector\fP, int \fIstringcount\fP, PCRE_SPTR16 **\fIlistptr\fP);"
-.sp
-.B int pcre32_get_substring_list(PCRE_SPTR32 \fIsubject\fP,
-.B "     int *\fIovector\fP, int \fIstringcount\fP, PCRE_SPTR32 **\fIlistptr\fP);"
-.fi
-.
-.SH DESCRIPTION
-.rs
-.sp
-This is a convenience function for extracting a list of all the captured
-substrings. The arguments are:
-.sp
-  \fIsubject\fP       Subject that has been successfully matched
-  \fIovector\fP       Offset vector that \fBpcre[16|32]_exec\fP used
-  \fIstringcount\fP   Value returned by \fBpcre[16|32]_exec\fP
-  \fIlistptr\fP       Where to put a pointer to the list
-.sp
-The memory in which the substrings and the list are placed is obtained by
-calling \fBpcre[16|32]_malloc()\fP. The convenience function
-\fBpcre[16|32]_free_substring_list()\fP can be used to free it when it is no
-longer needed. A pointer to a list of pointers is put in the variable whose
-address is in \fIlistptr\fP. The list is terminated by a NULL pointer. The
-yield of the function is zero on success or PCRE_ERROR_NOMEMORY if sufficient
-memory could not be obtained.
-.P
-There is a complete description of the PCRE native API in the
-.\" HREF
-\fBpcreapi\fP
-.\"
-page and a description of the POSIX API in the
-.\" HREF
-\fBpcreposix\fP
-.\"
-page.
diff --git a/dist/doc/pcre_jit_exec.3 b/dist/doc/pcre_jit_exec.3
deleted file mode 100644
index ba85168..0000000
--- a/dist/doc/pcre_jit_exec.3
+++ /dev/null
@@ -1,96 +0,0 @@
-.TH PCRE_EXEC 3 "31 October 2012" "PCRE 8.30"
-.SH NAME
-PCRE - Perl-compatible regular expressions
-.SH SYNOPSIS
-.rs
-.sp
-.B #include <pcre.h>
-.PP
-.nf
-.B int pcre_jit_exec(const pcre *\fIcode\fP, "const pcre_extra *\fIextra\fP,"
-.B "     const char *\fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP,"
-.B "     int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP,"
-.B "     pcre_jit_stack *\fIjstack\fP);"
-.sp
-.B int pcre16_jit_exec(const pcre16 *\fIcode\fP, "const pcre16_extra *\fIextra\fP,"
-.B "     PCRE_SPTR16 \fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP,"
-.B "     int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP,"
-.B "     pcre_jit_stack *\fIjstack\fP);"
-.sp
-.B int pcre32_jit_exec(const pcre32 *\fIcode\fP, "const pcre32_extra *\fIextra\fP,"
-.B "     PCRE_SPTR32 \fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP,"
-.B "     int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP,"
-.B "     pcre_jit_stack *\fIjstack\fP);"
-.fi
-.
-.SH DESCRIPTION
-.rs
-.sp
-This function matches a compiled regular expression that has been successfully
-studied with one of the JIT options against a given subject string, using a
-matching algorithm that is similar to Perl's. It is a "fast path" interface to
-JIT, and it bypasses some of the sanity checks that \fBpcre_exec()\fP applies.
-It returns offsets to captured substrings. Its arguments are:
-.sp
-  \fIcode\fP         Points to the compiled pattern
-  \fIextra\fP        Points to an associated \fBpcre[16|32]_extra\fP structure,
-                 or is NULL
-  \fIsubject\fP      Points to the subject string
-  \fIlength\fP       Length of the subject string, in bytes
-  \fIstartoffset\fP  Offset in bytes in the subject at which to
-                 start matching
-  \fIoptions\fP      Option bits
-  \fIovector\fP      Points to a vector of ints for result offsets
-  \fIovecsize\fP     Number of elements in the vector (a multiple of 3)
-  \fIjstack\fP       Pointer to a JIT stack
-.sp
-The allowed options are:
-.sp
-  PCRE_NOTBOL            Subject string is not the beginning of a line
-  PCRE_NOTEOL            Subject string is not the end of a line
-  PCRE_NOTEMPTY          An empty string is not a valid match
-  PCRE_NOTEMPTY_ATSTART  An empty string at the start of the subject
-                           is not a valid match
-  PCRE_NO_UTF16_CHECK    Do not check the subject for UTF-16
-                           validity (only relevant if PCRE_UTF16
-                           was set at compile time)
-  PCRE_NO_UTF32_CHECK    Do not check the subject for UTF-32
-                           validity (only relevant if PCRE_UTF32
-                           was set at compile time)
-  PCRE_NO_UTF8_CHECK     Do not check the subject for UTF-8
-                           validity (only relevant if PCRE_UTF8
-                           was set at compile time)
-  PCRE_PARTIAL           ) Return PCRE_ERROR_PARTIAL for a partial
-  PCRE_PARTIAL_SOFT      )   match if no full matches are found
-  PCRE_PARTIAL_HARD      Return PCRE_ERROR_PARTIAL for a partial match
-                           if that is found before a full match
-.sp
-However, the PCRE_NO_UTF[8|16|32]_CHECK options have no effect, as this check
-is never applied. For details of partial matching, see the
-.\" HREF
-\fBpcrepartial\fP
-.\"
-page. A \fBpcre_extra\fP structure contains the following fields:
-.sp
-  \fIflags\fP            Bits indicating which fields are set
-  \fIstudy_data\fP       Opaque data from \fBpcre[16|32]_study()\fP
-  \fImatch_limit\fP      Limit on internal resource use
-  \fImatch_limit_recursion\fP  Limit on internal recursion depth
-  \fIcallout_data\fP     Opaque data passed back to callouts
-  \fItables\fP           Points to character tables or is NULL
-  \fImark\fP             For passing back a *MARK pointer
-  \fIexecutable_jit\fP   Opaque data from JIT compilation
-.sp
-The flag bits are PCRE_EXTRA_STUDY_DATA, PCRE_EXTRA_MATCH_LIMIT,
-PCRE_EXTRA_MATCH_LIMIT_RECURSION, PCRE_EXTRA_CALLOUT_DATA,
-PCRE_EXTRA_TABLES, PCRE_EXTRA_MARK and PCRE_EXTRA_EXECUTABLE_JIT.
-.P
-There is a complete description of the PCRE native API in the
-.\" HREF
-\fBpcreapi\fP
-.\"
-page and a description of the JIT API in the
-.\" HREF
-\fBpcrejit\fP
-.\"
-page.
diff --git a/dist/doc/pcre_jit_stack_alloc.3 b/dist/doc/pcre_jit_stack_alloc.3
deleted file mode 100644
index 11c97a0..0000000
--- a/dist/doc/pcre_jit_stack_alloc.3
+++ /dev/null
@@ -1,43 +0,0 @@
-.TH PCRE_JIT_STACK_ALLOC 3 "24 June 2012" "PCRE 8.30"
-.SH NAME
-PCRE - Perl-compatible regular expressions
-.SH SYNOPSIS
-.rs
-.sp
-.B #include <pcre.h>
-.PP
-.nf
-.B pcre_jit_stack *pcre_jit_stack_alloc(int \fIstartsize\fP,
-.B "     int \fImaxsize\fP);"
-.sp
-.B pcre16_jit_stack *pcre16_jit_stack_alloc(int \fIstartsize\fP,
-.B "     int \fImaxsize\fP);"
-.sp
-.B pcre32_jit_stack *pcre32_jit_stack_alloc(int \fIstartsize\fP,
-.B "     int \fImaxsize\fP);"
-.fi
-.
-.SH DESCRIPTION
-.rs
-.sp
-This function is used to create a stack for use by the code compiled by the JIT
-optimization of \fBpcre[16|32]_study()\fP. The arguments are a starting size for
-the stack, and a maximum size to which it is allowed to grow. The result can be
-passed to the JIT run-time code by \fBpcre[16|32]_assign_jit_stack()\fP, or that
-function can set up a callback for obtaining a stack. A maximum stack size of
-512K to 1M should be more than enough for any pattern. For more details, see
-the
-.\" HREF
-\fBpcrejit\fP
-.\"
-page.
-.P
-There is a complete description of the PCRE native API in the
-.\" HREF
-\fBpcreapi\fP
-.\"
-page and a description of the POSIX API in the
-.\" HREF
-\fBpcreposix\fP
-.\"
-page.
diff --git a/dist/doc/pcre_jit_stack_free.3 b/dist/doc/pcre_jit_stack_free.3
deleted file mode 100644
index 494724e..0000000
--- a/dist/doc/pcre_jit_stack_free.3
+++ /dev/null
@@ -1,35 +0,0 @@
-.TH PCRE_JIT_STACK_FREE 3 "24 June 2012" "PCRE 8.30"
-.SH NAME
-PCRE - Perl-compatible regular expressions
-.SH SYNOPSIS
-.rs
-.sp
-.B #include <pcre.h>
-.PP
-.SM
-.B void pcre_jit_stack_free(pcre_jit_stack *\fIstack\fP);
-.PP
-.B void pcre16_jit_stack_free(pcre16_jit_stack *\fIstack\fP);
-.PP
-.B void pcre32_jit_stack_free(pcre32_jit_stack *\fIstack\fP);
-.
-.SH DESCRIPTION
-.rs
-.sp
-This function is used to free a JIT stack that was created by
-\fBpcre[16|32]_jit_stack_alloc()\fP when it is no longer needed. For more details,
-see the
-.\" HREF
-\fBpcrejit\fP
-.\"
-page.
-.P
-There is a complete description of the PCRE native API in the
-.\" HREF
-\fBpcreapi\fP
-.\"
-page and a description of the POSIX API in the
-.\" HREF
-\fBpcreposix\fP
-.\"
-page.
diff --git a/dist/doc/pcre_maketables.3 b/dist/doc/pcre_maketables.3
deleted file mode 100644
index b2c3d23..0000000
--- a/dist/doc/pcre_maketables.3
+++ /dev/null
@@ -1,33 +0,0 @@
-.TH PCRE_MAKETABLES 3 "24 June 2012" "PCRE 8.30"
-.SH NAME
-PCRE - Perl-compatible regular expressions
-.SH SYNOPSIS
-.rs
-.sp
-.B #include <pcre.h>
-.PP
-.SM
-.B const unsigned char *pcre_maketables(void);
-.PP
-.B const unsigned char *pcre16_maketables(void);
-.PP
-.B const unsigned char *pcre32_maketables(void);
-.
-.SH DESCRIPTION
-.rs
-.sp
-This function builds a set of character tables for character values less than
-256. These can be passed to \fBpcre[16|32]_compile()\fP to override PCRE's
-internal, built-in tables (which were made by \fBpcre[16|32]_maketables()\fP when
-PCRE was compiled). You might want to do this if you are using a non-standard
-locale. The function yields a pointer to the tables.
-.P
-There is a complete description of the PCRE native API in the
-.\" HREF
-\fBpcreapi\fP
-.\"
-page and a description of the POSIX API in the
-.\" HREF
-\fBpcreposix\fP
-.\"
-page.
diff --git a/dist/doc/pcre_pattern_to_host_byte_order.3 b/dist/doc/pcre_pattern_to_host_byte_order.3
deleted file mode 100644
index b0c41c3..0000000
--- a/dist/doc/pcre_pattern_to_host_byte_order.3
+++ /dev/null
@@ -1,44 +0,0 @@
-.TH PCRE_PATTERN_TO_HOST_BYTE_ORDER 3 "24 June 2012" "PCRE 8.30"
-.SH NAME
-PCRE - Perl-compatible regular expressions
-.SH SYNOPSIS
-.rs
-.sp
-.B #include <pcre.h>
-.PP
-.nf
-.B int pcre_pattern_to_host_byte_order(pcre *\fIcode\fP,
-.B "     pcre_extra *\fIextra\fP, const unsigned char *\fItables\fP);"
-.sp
-.B int pcre16_pattern_to_host_byte_order(pcre16 *\fIcode\fP,
-.B "     pcre16_extra *\fIextra\fP, const unsigned char *\fItables\fP);"
-.sp
-.B int pcre32_pattern_to_host_byte_order(pcre32 *\fIcode\fP,
-.B "     pcre32_extra *\fIextra\fP, const unsigned char *\fItables\fP);"
-.fi
-.
-.SH DESCRIPTION
-.rs
-.sp
-This function ensures that the bytes in 2-byte and 4-byte values in a compiled
-pattern are in the correct order for the current host. It is useful when a
-pattern that has been compiled on one host is transferred to another that might
-have different endianness. The arguments are:
-.sp
-  \fIcode\fP         A compiled regular expression
-  \fIextra\fP        Points to an associated \fBpcre[16|32]_extra\fP structure,
-                 or is NULL
-  \fItables\fP       Pointer to character tables, or NULL to
-                 set the built-in default
-.sp
-The result is 0 for success, a negative PCRE_ERROR_xxx value otherwise.
-.P
-There is a complete description of the PCRE native API in the
-.\" HREF
-\fBpcreapi\fP
-.\"
-page and a description of the POSIX API in the
-.\" HREF
-\fBpcreposix\fP
-.\"
-page.
diff --git a/dist/doc/pcre_refcount.3 b/dist/doc/pcre_refcount.3
deleted file mode 100644
index 45a41fe..0000000
--- a/dist/doc/pcre_refcount.3
+++ /dev/null
@@ -1,36 +0,0 @@
-.TH PCRE_REFCOUNT 3 "24 June 2012" "PCRE 8.30"
-.SH NAME
-PCRE - Perl-compatible regular expressions
-.SH SYNOPSIS
-.rs
-.sp
-.B #include <pcre.h>
-.PP
-.SM
-.B int pcre_refcount(pcre *\fIcode\fP, int \fIadjust\fP);
-.PP
-.B int pcre16_refcount(pcre16 *\fIcode\fP, int \fIadjust\fP);
-.PP
-.B int pcre32_refcount(pcre32 *\fIcode\fP, int \fIadjust\fP);
-.
-.SH DESCRIPTION
-.rs
-.sp
-This function is used to maintain a reference count inside a data block that
-contains a compiled pattern. Its arguments are:
-.sp
-  \fIcode\fP                      Compiled regular expression
-  \fIadjust\fP                    Adjustment to reference value
-.sp
-The yield of the function is the adjusted reference value, which is constrained
-to lie between 0 and 65535.
-.P
-There is a complete description of the PCRE native API in the
-.\" HREF
-\fBpcreapi\fP
-.\"
-page and a description of the POSIX API in the
-.\" HREF
-\fBpcreposix\fP
-.\"
-page.
diff --git a/dist/doc/pcre_study.3 b/dist/doc/pcre_study.3
deleted file mode 100644
index 1200e0a..0000000
--- a/dist/doc/pcre_study.3
+++ /dev/null
@@ -1,54 +0,0 @@
-.TH PCRE_STUDY 3 " 24 June 2012" "PCRE 8.30"
-.SH NAME
-PCRE - Perl-compatible regular expressions
-.SH SYNOPSIS
-.rs
-.sp
-.B #include <pcre.h>
-.PP
-.nf
-.B pcre_extra *pcre_study(const pcre *\fIcode\fP, int \fIoptions\fP,
-.B "     const char **\fIerrptr\fP);"
-.sp
-.B pcre16_extra *pcre16_study(const pcre16 *\fIcode\fP, int \fIoptions\fP,
-.B "     const char **\fIerrptr\fP);"
-.sp
-.B pcre32_extra *pcre32_study(const pcre32 *\fIcode\fP, int \fIoptions\fP,
-.B "     const char **\fIerrptr\fP);"
-.fi
-.
-.SH DESCRIPTION
-.rs
-.sp
-This function studies a compiled pattern, to see if additional information can
-be extracted that might speed up matching. Its arguments are:
-.sp
-  \fIcode\fP       A compiled regular expression
-  \fIoptions\fP    Options for \fBpcre[16|32]_study()\fP
-  \fIerrptr\fP     Where to put an error message
-.sp
-If the function succeeds, it returns a value that can be passed to
-\fBpcre[16|32]_exec()\fP or \fBpcre[16|32]_dfa_exec()\fP via their \fIextra\fP
-arguments.
-.P
-If the function returns NULL, either it could not find any additional
-information, or there was an error. You can tell the difference by looking at
-the error value. It is NULL in first case.
-.P
-The only option is PCRE_STUDY_JIT_COMPILE. It requests just-in-time compilation
-if possible. If PCRE has been compiled without JIT support, this option is
-ignored. See the
-.\" HREF
-\fBpcrejit\fP
-.\"
-page for further details.
-.P
-There is a complete description of the PCRE native API in the
-.\" HREF
-\fBpcreapi\fP
-.\"
-page and a description of the POSIX API in the
-.\" HREF
-\fBpcreposix\fP
-.\"
-page.
diff --git a/dist/doc/pcre_utf16_to_host_byte_order.3 b/dist/doc/pcre_utf16_to_host_byte_order.3
deleted file mode 100644
index 1851b61..0000000
--- a/dist/doc/pcre_utf16_to_host_byte_order.3
+++ /dev/null
@@ -1,45 +0,0 @@
-.TH PCRE_UTF16_TO_HOST_BYTE_ORDER 3 "21 January 2012" "PCRE 8.30"
-.SH NAME
-PCRE - Perl-compatible regular expressions
-.SH SYNOPSIS
-.rs
-.sp
-.B #include <pcre.h>
-.PP
-.nf
-.B int pcre16_utf16_to_host_byte_order(PCRE_UCHAR16 *\fIoutput\fP,
-.B "     PCRE_SPTR16 \fIinput\fP, int \fIlength\fP, int *\fIhost_byte_order\fP,"
-.B "     int \fIkeep_boms\fP);"
-.fi
-.
-.
-.SH DESCRIPTION
-.rs
-.sp
-This function, which exists only in the 16-bit library, converts a UTF-16
-string to the correct order for the current host, taking account of any byte
-order marks (BOMs) within the string. Its arguments are:
-.sp
-  \fIoutput\fP           pointer to output buffer, may be the same as \fIinput\fP
-  \fIinput\fP            pointer to input buffer
-  \fIlength\fP           number of 16-bit units in the input, or negative for
-                     a zero-terminated string
-  \fIhost_byte_order\fP  a NULL value or a non-zero value pointed to means
-                     start in host byte order
-  \fIkeep_boms\fP        if non-zero, BOMs are copied to the output string
-.sp
-The result of the function is the number of 16-bit units placed into the output
-buffer, including the zero terminator if the string was zero-terminated.
-.P
-If \fIhost_byte_order\fP is not NULL, it is set to indicate the byte order that
-is current at the end of the string.
-.P
-There is a complete description of the PCRE native API in the
-.\" HREF
-\fBpcreapi\fP
-.\"
-page and a description of the POSIX API in the
-.\" HREF
-\fBpcreposix\fP
-.\"
-page.
diff --git a/dist/doc/pcre_utf32_to_host_byte_order.3 b/dist/doc/pcre_utf32_to_host_byte_order.3
deleted file mode 100644
index a415dcf..0000000
--- a/dist/doc/pcre_utf32_to_host_byte_order.3
+++ /dev/null
@@ -1,45 +0,0 @@
-.TH PCRE_UTF32_TO_HOST_BYTE_ORDER 3 "24 June 2012" "PCRE 8.30"
-.SH NAME
-PCRE - Perl-compatible regular expressions
-.SH SYNOPSIS
-.rs
-.sp
-.B #include <pcre.h>
-.PP
-.nf
-.B int pcre32_utf32_to_host_byte_order(PCRE_UCHAR32 *\fIoutput\fP,
-.B "     PCRE_SPTR32 \fIinput\fP, int \fIlength\fP, int *\fIhost_byte_order\fP,"
-.B "     int \fIkeep_boms\fP);"
-.fi
-.
-.
-.SH DESCRIPTION
-.rs
-.sp
-This function, which exists only in the 32-bit library, converts a UTF-32
-string to the correct order for the current host, taking account of any byte
-order marks (BOMs) within the string. Its arguments are:
-.sp
-  \fIoutput\fP           pointer to output buffer, may be the same as \fIinput\fP
-  \fIinput\fP            pointer to input buffer
-  \fIlength\fP           number of 32-bit units in the input, or negative for
-                     a zero-terminated string
-  \fIhost_byte_order\fP  a NULL value or a non-zero value pointed to means
-                     start in host byte order
-  \fIkeep_boms\fP        if non-zero, BOMs are copied to the output string
-.sp
-The result of the function is the number of 32-bit units placed into the output
-buffer, including the zero terminator if the string was zero-terminated.
-.P
-If \fIhost_byte_order\fP is not NULL, it is set to indicate the byte order that
-is current at the end of the string.
-.P
-There is a complete description of the PCRE native API in the
-.\" HREF
-\fBpcreapi\fP
-.\"
-page and a description of the POSIX API in the
-.\" HREF
-\fBpcreposix\fP
-.\"
-page.
diff --git a/dist/doc/pcre_version.3 b/dist/doc/pcre_version.3
deleted file mode 100644
index 0f4973f..0000000
--- a/dist/doc/pcre_version.3
+++ /dev/null
@@ -1,31 +0,0 @@
-.TH PCRE_VERSION 3 "24 June 2012" "PCRE 8.30"
-.SH NAME
-PCRE - Perl-compatible regular expressions
-.SH SYNOPSIS
-.rs
-.sp
-.B #include <pcre.h>
-.PP
-.SM
-.B const char *pcre_version(void);
-.PP
-.B const char *pcre16_version(void);
-.PP
-.B const char *pcre32_version(void);
-.
-.SH DESCRIPTION
-.rs
-.sp
-This function (even in the 16-bit and 32-bit libraries) returns a
-zero-terminated, 8-bit character string that gives the version number of the
-PCRE library and the date of its release.
-.P
-There is a complete description of the PCRE native API in the
-.\" HREF
-\fBpcreapi\fP
-.\"
-page and a description of the POSIX API in the
-.\" HREF
-\fBpcreposix\fP
-.\"
-page.
diff --git a/dist/doc/pcreapi.3 b/dist/doc/pcreapi.3
deleted file mode 100644
index ab3eaa0..0000000
--- a/dist/doc/pcreapi.3
+++ /dev/null
@@ -1,2919 +0,0 @@
-.TH PCREAPI 3 "09 February 2014" "PCRE 8.35"
-.SH NAME
-PCRE - Perl-compatible regular expressions
-.sp
-.B #include <pcre.h>
-.
-.
-.SH "PCRE NATIVE API BASIC FUNCTIONS"
-.rs
-.sp
-.nf
-.B pcre *pcre_compile(const char *\fIpattern\fP, int \fIoptions\fP,
-.B "     const char **\fIerrptr\fP, int *\fIerroffset\fP,"
-.B "     const unsigned char *\fItableptr\fP);"
-.sp
-.B pcre *pcre_compile2(const char *\fIpattern\fP, int \fIoptions\fP,
-.B "     int *\fIerrorcodeptr\fP,"
-.B "     const char **\fIerrptr\fP, int *\fIerroffset\fP,"
-.B "     const unsigned char *\fItableptr\fP);"
-.sp
-.B pcre_extra *pcre_study(const pcre *\fIcode\fP, int \fIoptions\fP,
-.B "     const char **\fIerrptr\fP);"
-.sp
-.B void pcre_free_study(pcre_extra *\fIextra\fP);
-.sp
-.B int pcre_exec(const pcre *\fIcode\fP, "const pcre_extra *\fIextra\fP,"
-.B "     const char *\fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP,"
-.B "     int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP);"
-.sp
-.B int pcre_dfa_exec(const pcre *\fIcode\fP, "const pcre_extra *\fIextra\fP,"
-.B "     const char *\fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP,"
-.B "     int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP,"
-.B "     int *\fIworkspace\fP, int \fIwscount\fP);"
-.fi
-.
-.
-.SH "PCRE NATIVE API STRING EXTRACTION FUNCTIONS"
-.rs
-.sp
-.nf
-.B int pcre_copy_named_substring(const pcre *\fIcode\fP,
-.B "     const char *\fIsubject\fP, int *\fIovector\fP,"
-.B "     int \fIstringcount\fP, const char *\fIstringname\fP,"
-.B "     char *\fIbuffer\fP, int \fIbuffersize\fP);"
-.sp
-.B int pcre_copy_substring(const char *\fIsubject\fP, int *\fIovector\fP,
-.B "     int \fIstringcount\fP, int \fIstringnumber\fP, char *\fIbuffer\fP,"
-.B "     int \fIbuffersize\fP);"
-.sp
-.B int pcre_get_named_substring(const pcre *\fIcode\fP,
-.B "     const char *\fIsubject\fP, int *\fIovector\fP,"
-.B "     int \fIstringcount\fP, const char *\fIstringname\fP,"
-.B "     const char **\fIstringptr\fP);"
-.sp
-.B int pcre_get_stringnumber(const pcre *\fIcode\fP,
-.B "     const char *\fIname\fP);"
-.sp
-.B int pcre_get_stringtable_entries(const pcre *\fIcode\fP,
-.B "     const char *\fIname\fP, char **\fIfirst\fP, char **\fIlast\fP);"
-.sp
-.B int pcre_get_substring(const char *\fIsubject\fP, int *\fIovector\fP,
-.B "     int \fIstringcount\fP, int \fIstringnumber\fP,"
-.B "     const char **\fIstringptr\fP);"
-.sp
-.B int pcre_get_substring_list(const char *\fIsubject\fP,
-.B "     int *\fIovector\fP, int \fIstringcount\fP, const char ***\fIlistptr\fP);"
-.sp
-.B void pcre_free_substring(const char *\fIstringptr\fP);
-.sp
-.B void pcre_free_substring_list(const char **\fIstringptr\fP);
-.fi
-.
-.
-.SH "PCRE NATIVE API AUXILIARY FUNCTIONS"
-.rs
-.sp
-.nf
-.B int pcre_jit_exec(const pcre *\fIcode\fP, "const pcre_extra *\fIextra\fP,"
-.B "     const char *\fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP,"
-.B "     int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP,"
-.B "     pcre_jit_stack *\fIjstack\fP);"
-.sp
-.B pcre_jit_stack *pcre_jit_stack_alloc(int \fIstartsize\fP, int \fImaxsize\fP);
-.sp
-.B void pcre_jit_stack_free(pcre_jit_stack *\fIstack\fP);
-.sp
-.B void pcre_assign_jit_stack(pcre_extra *\fIextra\fP,
-.B "     pcre_jit_callback \fIcallback\fP, void *\fIdata\fP);"
-.sp
-.B const unsigned char *pcre_maketables(void);
-.sp
-.B int pcre_fullinfo(const pcre *\fIcode\fP, "const pcre_extra *\fIextra\fP,"
-.B "     int \fIwhat\fP, void *\fIwhere\fP);"
-.sp
-.B int pcre_refcount(pcre *\fIcode\fP, int \fIadjust\fP);
-.sp
-.B int pcre_config(int \fIwhat\fP, void *\fIwhere\fP);
-.sp
-.B const char *pcre_version(void);
-.sp
-.B int pcre_pattern_to_host_byte_order(pcre *\fIcode\fP,
-.B "     pcre_extra *\fIextra\fP, const unsigned char *\fItables\fP);"
-.fi
-.
-.
-.SH "PCRE NATIVE API INDIRECTED FUNCTIONS"
-.rs
-.sp
-.nf
-.B void *(*pcre_malloc)(size_t);
-.sp
-.B void (*pcre_free)(void *);
-.sp
-.B void *(*pcre_stack_malloc)(size_t);
-.sp
-.B void (*pcre_stack_free)(void *);
-.sp
-.B int (*pcre_callout)(pcre_callout_block *);
-.sp
-.B int (*pcre_stack_guard)(void);
-.fi
-.
-.
-.SH "PCRE 8-BIT, 16-BIT, AND 32-BIT LIBRARIES"
-.rs
-.sp
-As well as support for 8-bit character strings, PCRE also supports 16-bit
-strings (from release 8.30) and 32-bit strings (from release 8.32), by means of
-two additional libraries. They can be built as well as, or instead of, the
-8-bit library. To avoid too much complication, this document describes the
-8-bit versions of the functions, with only occasional references to the 16-bit
-and 32-bit libraries.
-.P
-The 16-bit and 32-bit functions operate in the same way as their 8-bit
-counterparts; they just use different data types for their arguments and
-results, and their names start with \fBpcre16_\fP or \fBpcre32_\fP instead of
-\fBpcre_\fP. For every option that has UTF8 in its name (for example,
-PCRE_UTF8), there are corresponding 16-bit and 32-bit names with UTF8 replaced
-by UTF16 or UTF32, respectively. This facility is in fact just cosmetic; the
-16-bit and 32-bit option names define the same bit values.
-.P
-References to bytes and UTF-8 in this document should be read as references to
-16-bit data units and UTF-16 when using the 16-bit library, or 32-bit data
-units and UTF-32 when using the 32-bit library, unless specified otherwise.
-More details of the specific differences for the 16-bit and 32-bit libraries
-are given in the
-.\" HREF
-\fBpcre16\fP
-.\"
-and
-.\" HREF
-\fBpcre32\fP
-.\"
-pages.
-.
-.
-.SH "PCRE API OVERVIEW"
-.rs
-.sp
-PCRE has its own native API, which is described in this document. There are
-also some wrapper functions (for the 8-bit library only) that correspond to the
-POSIX regular expression API, but they do not give access to all the
-functionality. They are described in the
-.\" HREF
-\fBpcreposix\fP
-.\"
-documentation. Both of these APIs define a set of C function calls. A C++
-wrapper (again for the 8-bit library only) is also distributed with PCRE. It is
-documented in the
-.\" HREF
-\fBpcrecpp\fP
-.\"
-page.
-.P
-The native API C function prototypes are defined in the header file
-\fBpcre.h\fP, and on Unix-like systems the (8-bit) library itself is called
-\fBlibpcre\fP. It can normally be accessed by adding \fB-lpcre\fP to the
-command for linking an application that uses PCRE. The header file defines the
-macros PCRE_MAJOR and PCRE_MINOR to contain the major and minor release numbers
-for the library. Applications can use these to include support for different
-releases of PCRE.
-.P
-In a Windows environment, if you want to statically link an application program
-against a non-dll \fBpcre.a\fP file, you must define PCRE_STATIC before
-including \fBpcre.h\fP or \fBpcrecpp.h\fP, because otherwise the
-\fBpcre_malloc()\fP and \fBpcre_free()\fP exported functions will be declared
-\fB__declspec(dllimport)\fP, with unwanted results.
-.P
-The functions \fBpcre_compile()\fP, \fBpcre_compile2()\fP, \fBpcre_study()\fP,
-and \fBpcre_exec()\fP are used for compiling and matching regular expressions
-in a Perl-compatible manner. A sample program that demonstrates the simplest
-way of using them is provided in the file called \fIpcredemo.c\fP in the PCRE
-source distribution. A listing of this program is given in the
-.\" HREF
-\fBpcredemo\fP
-.\"
-documentation, and the
-.\" HREF
-\fBpcresample\fP
-.\"
-documentation describes how to compile and run it.
-.P
-Just-in-time compiler support is an optional feature of PCRE that can be built
-in appropriate hardware environments. It greatly speeds up the matching
-performance of many patterns. Simple programs can easily request that it be
-used if available, by setting an option that is ignored when it is not
-relevant. More complicated programs might need to make use of the functions
-\fBpcre_jit_stack_alloc()\fP, \fBpcre_jit_stack_free()\fP, and
-\fBpcre_assign_jit_stack()\fP in order to control the JIT code's memory usage.
-.P
-From release 8.32 there is also a direct interface for JIT execution, which
-gives improved performance. The JIT-specific functions are discussed in the
-.\" HREF
-\fBpcrejit\fP
-.\"
-documentation.
-.P
-A second matching function, \fBpcre_dfa_exec()\fP, which is not
-Perl-compatible, is also provided. This uses a different algorithm for the
-matching. The alternative algorithm finds all possible matches (at a given
-point in the subject), and scans the subject just once (unless there are
-lookbehind assertions). However, this algorithm does not return captured
-substrings. A description of the two matching algorithms and their advantages
-and disadvantages is given in the
-.\" HREF
-\fBpcrematching\fP
-.\"
-documentation.
-.P
-In addition to the main compiling and matching functions, there are convenience
-functions for extracting captured substrings from a subject string that is
-matched by \fBpcre_exec()\fP. They are:
-.sp
-  \fBpcre_copy_substring()\fP
-  \fBpcre_copy_named_substring()\fP
-  \fBpcre_get_substring()\fP
-  \fBpcre_get_named_substring()\fP
-  \fBpcre_get_substring_list()\fP
-  \fBpcre_get_stringnumber()\fP
-  \fBpcre_get_stringtable_entries()\fP
-.sp
-\fBpcre_free_substring()\fP and \fBpcre_free_substring_list()\fP are also
-provided, to free the memory used for extracted strings.
-.P
-The function \fBpcre_maketables()\fP is used to build a set of character tables
-in the current locale for passing to \fBpcre_compile()\fP, \fBpcre_exec()\fP,
-or \fBpcre_dfa_exec()\fP. This is an optional facility that is provided for
-specialist use. Most commonly, no special tables are passed, in which case
-internal tables that are generated when PCRE is built are used.
-.P
-The function \fBpcre_fullinfo()\fP is used to find out information about a
-compiled pattern. The function \fBpcre_version()\fP returns a pointer to a
-string containing the version of PCRE and its date of release.
-.P
-The function \fBpcre_refcount()\fP maintains a reference count in a data block
-containing a compiled pattern. This is provided for the benefit of
-object-oriented applications.
-.P
-The global variables \fBpcre_malloc\fP and \fBpcre_free\fP initially contain
-the entry points of the standard \fBmalloc()\fP and \fBfree()\fP functions,
-respectively. PCRE calls the memory management functions via these variables,
-so a calling program can replace them if it wishes to intercept the calls. This
-should be done before calling any PCRE functions.
-.P
-The global variables \fBpcre_stack_malloc\fP and \fBpcre_stack_free\fP are also
-indirections to memory management functions. These special functions are used
-only when PCRE is compiled to use the heap for remembering data, instead of
-recursive function calls, when running the \fBpcre_exec()\fP function. See the
-.\" HREF
-\fBpcrebuild\fP
-.\"
-documentation for details of how to do this. It is a non-standard way of
-building PCRE, for use in environments that have limited stacks. Because of the
-greater use of memory management, it runs more slowly. Separate functions are
-provided so that special-purpose external code can be used for this case. When
-used, these functions are always called in a stack-like manner (last obtained,
-first freed), and always for memory blocks of the same size. There is a
-discussion about PCRE's stack usage in the
-.\" HREF
-\fBpcrestack\fP
-.\"
-documentation.
-.P
-The global variable \fBpcre_callout\fP initially contains NULL. It can be set
-by the caller to a "callout" function, which PCRE will then call at specified
-points during a matching operation. Details are given in the
-.\" HREF
-\fBpcrecallout\fP
-.\"
-documentation.
-.P
-The global variable \fBpcre_stack_guard\fP initially contains NULL. It can be
-set by the caller to a function that is called by PCRE whenever it starts
-to compile a parenthesized part of a pattern. When parentheses are nested, PCRE
-uses recursive function calls, which use up the system stack. This function is
-provided so that applications with restricted stacks can force a compilation
-error if the stack runs out. The function should return zero if all is well, or
-non-zero to force an error.
-.
-.
-.\" HTML <a name="newlines"></a>
-.SH NEWLINES
-.rs
-.sp
-PCRE supports five different conventions for indicating line breaks in
-strings: a single CR (carriage return) character, a single LF (linefeed)
-character, the two-character sequence CRLF, any of the three preceding, or any
-Unicode newline sequence. The Unicode newline sequences are the three just
-mentioned, plus the single characters VT (vertical tab, U+000B), FF (form feed,
-U+000C), NEL (next line, U+0085), LS (line separator, U+2028), and PS
-(paragraph separator, U+2029).
-.P
-Each of the first three conventions is used by at least one operating system as
-its standard newline sequence. When PCRE is built, a default can be specified.
-The default default is LF, which is the Unix standard. When PCRE is run, the
-default can be overridden, either when a pattern is compiled, or when it is
-matched.
-.P
-At compile time, the newline convention can be specified by the \fIoptions\fP
-argument of \fBpcre_compile()\fP, or it can be specified by special text at the
-start of the pattern itself; this overrides any other settings. See the
-.\" HREF
-\fBpcrepattern\fP
-.\"
-page for details of the special character sequences.
-.P
-In the PCRE documentation the word "newline" is used to mean "the character or
-pair of characters that indicate a line break". The choice of newline
-convention affects the handling of the dot, circumflex, and dollar
-metacharacters, the handling of #-comments in /x mode, and, when CRLF is a
-recognized line ending sequence, the match position advancement for a
-non-anchored pattern. There is more detail about this in the
-.\" HTML <a href="#execoptions">
-.\" </a>
-section on \fBpcre_exec()\fP options
-.\"
-below.
-.P
-The choice of newline convention does not affect the interpretation of
-the \en or \er escape sequences, nor does it affect what \eR matches, which is
-controlled in a similar way, but by separate options.
-.
-.
-.SH MULTITHREADING
-.rs
-.sp
-The PCRE functions can be used in multi-threading applications, with the
-proviso that the memory management functions pointed to by \fBpcre_malloc\fP,
-\fBpcre_free\fP, \fBpcre_stack_malloc\fP, and \fBpcre_stack_free\fP, and the
-callout and stack-checking functions pointed to by \fBpcre_callout\fP and
-\fBpcre_stack_guard\fP, are shared by all threads.
-.P
-The compiled form of a regular expression is not altered during matching, so
-the same compiled pattern can safely be used by several threads at once.
-.P
-If the just-in-time optimization feature is being used, it needs separate
-memory stack areas for each thread. See the
-.\" HREF
-\fBpcrejit\fP
-.\"
-documentation for more details.
-.
-.
-.SH "SAVING PRECOMPILED PATTERNS FOR LATER USE"
-.rs
-.sp
-The compiled form of a regular expression can be saved and re-used at a later
-time, possibly by a different program, and even on a host other than the one on
-which it was compiled. Details are given in the
-.\" HREF
-\fBpcreprecompile\fP
-.\"
-documentation, which includes a description of the
-\fBpcre_pattern_to_host_byte_order()\fP function. However, compiling a regular
-expression with one version of PCRE for use with a different version is not
-guaranteed to work and may cause crashes.
-.
-.
-.SH "CHECKING BUILD-TIME OPTIONS"
-.rs
-.sp
-.B int pcre_config(int \fIwhat\fP, void *\fIwhere\fP);
-.PP
-The function \fBpcre_config()\fP makes it possible for a PCRE client to
-discover which optional features have been compiled into the PCRE library. The
-.\" HREF
-\fBpcrebuild\fP
-.\"
-documentation has more details about these optional features.
-.P
-The first argument for \fBpcre_config()\fP is an integer, specifying which
-information is required; the second argument is a pointer to a variable into
-which the information is placed. The returned value is zero on success, or the
-negative error code PCRE_ERROR_BADOPTION if the value in the first argument is
-not recognized. The following information is available:
-.sp
-  PCRE_CONFIG_UTF8
-.sp
-The output is an integer that is set to one if UTF-8 support is available;
-otherwise it is set to zero. This value should normally be given to the 8-bit
-version of this function, \fBpcre_config()\fP. If it is given to the 16-bit
-or 32-bit version of this function, the result is PCRE_ERROR_BADOPTION.
-.sp
-  PCRE_CONFIG_UTF16
-.sp
-The output is an integer that is set to one if UTF-16 support is available;
-otherwise it is set to zero. This value should normally be given to the 16-bit
-version of this function, \fBpcre16_config()\fP. If it is given to the 8-bit
-or 32-bit version of this function, the result is PCRE_ERROR_BADOPTION.
-.sp
-  PCRE_CONFIG_UTF32
-.sp
-The output is an integer that is set to one if UTF-32 support is available;
-otherwise it is set to zero. This value should normally be given to the 32-bit
-version of this function, \fBpcre32_config()\fP. If it is given to the 8-bit
-or 16-bit version of this function, the result is PCRE_ERROR_BADOPTION.
-.sp
-  PCRE_CONFIG_UNICODE_PROPERTIES
-.sp
-The output is an integer that is set to one if support for Unicode character
-properties is available; otherwise it is set to zero.
-.sp
-  PCRE_CONFIG_JIT
-.sp
-The output is an integer that is set to one if support for just-in-time
-compiling is available; otherwise it is set to zero.
-.sp
-  PCRE_CONFIG_JITTARGET
-.sp
-The output is a pointer to a zero-terminated "const char *" string. If JIT
-support is available, the string contains the name of the architecture for
-which the JIT compiler is configured, for example "x86 32bit (little endian +
-unaligned)". If JIT support is not available, the result is NULL.
-.sp
-  PCRE_CONFIG_NEWLINE
-.sp
-The output is an integer whose value specifies the default character sequence
-that is recognized as meaning "newline". The values that are supported in
-ASCII/Unicode environments are: 10 for LF, 13 for CR, 3338 for CRLF, -2 for
-ANYCRLF, and -1 for ANY. In EBCDIC environments, CR, ANYCRLF, and ANY yield the
-same values. However, the value for LF is normally 21, though some EBCDIC
-environments use 37. The corresponding values for CRLF are 3349 and 3365. The
-default should normally correspond to the standard sequence for your operating
-system.
-.sp
-  PCRE_CONFIG_BSR
-.sp
-The output is an integer whose value indicates what character sequences the \eR
-escape sequence matches by default. A value of 0 means that \eR matches any
-Unicode line ending sequence; a value of 1 means that \eR matches only CR, LF,
-or CRLF. The default can be overridden when a pattern is compiled or matched.
-.sp
-  PCRE_CONFIG_LINK_SIZE
-.sp
-The output is an integer that contains the number of bytes used for internal
-linkage in compiled regular expressions. For the 8-bit library, the value can
-be 2, 3, or 4. For the 16-bit library, the value is either 2 or 4 and is still
-a number of bytes. For the 32-bit library, the value is either 2 or 4 and is
-still a number of bytes. The default value of 2 is sufficient for all but the
-most massive patterns, since it allows the compiled pattern to be up to 64K in
-size. Larger values allow larger regular expressions to be compiled, at the
-expense of slower matching.
-.sp
-  PCRE_CONFIG_POSIX_MALLOC_THRESHOLD
-.sp
-The output is an integer that contains the threshold above which the POSIX
-interface uses \fBmalloc()\fP for output vectors. Further details are given in
-the
-.\" HREF
-\fBpcreposix\fP
-.\"
-documentation.
-.sp
-  PCRE_CONFIG_PARENS_LIMIT
-.sp
-The output is a long integer that gives the maximum depth of nesting of
-parentheses (of any kind) in a pattern. This limit is imposed to cap the amount
-of system stack used when a pattern is compiled. It is specified when PCRE is
-built; the default is 250. This limit does not take into account the stack that
-may already be used by the calling application. For finer control over
-compilation stack usage, you can set a pointer to an external checking function
-in \fBpcre_stack_guard\fP.
-.sp
-  PCRE_CONFIG_MATCH_LIMIT
-.sp
-The output is a long integer that gives the default limit for the number of
-internal matching function calls in a \fBpcre_exec()\fP execution. Further
-details are given with \fBpcre_exec()\fP below.
-.sp
-  PCRE_CONFIG_MATCH_LIMIT_RECURSION
-.sp
-The output is a long integer that gives the default limit for the depth of
-recursion when calling the internal matching function in a \fBpcre_exec()\fP
-execution. Further details are given with \fBpcre_exec()\fP below.
-.sp
-  PCRE_CONFIG_STACKRECURSE
-.sp
-The output is an integer that is set to one if internal recursion when running
-\fBpcre_exec()\fP is implemented by recursive function calls that use the stack
-to remember their state. This is the usual way that PCRE is compiled. The
-output is zero if PCRE was compiled to use blocks of data on the heap instead
-of recursive function calls. In this case, \fBpcre_stack_malloc\fP and
-\fBpcre_stack_free\fP are called to manage memory blocks on the heap, thus
-avoiding the use of the stack.
-.
-.
-.SH "COMPILING A PATTERN"
-.rs
-.sp
-.nf
-.B pcre *pcre_compile(const char *\fIpattern\fP, int \fIoptions\fP,
-.B "     const char **\fIerrptr\fP, int *\fIerroffset\fP,"
-.B "     const unsigned char *\fItableptr\fP);"
-.sp
-.B pcre *pcre_compile2(const char *\fIpattern\fP, int \fIoptions\fP,
-.B "     int *\fIerrorcodeptr\fP,"
-.B "     const char **\fIerrptr\fP, int *\fIerroffset\fP,"
-.B "     const unsigned char *\fItableptr\fP);"
-.fi
-.P
-Either of the functions \fBpcre_compile()\fP or \fBpcre_compile2()\fP can be
-called to compile a pattern into an internal form. The only difference between
-the two interfaces is that \fBpcre_compile2()\fP has an additional argument,
-\fIerrorcodeptr\fP, via which a numerical error code can be returned. To avoid
-too much repetition, we refer just to \fBpcre_compile()\fP below, but the
-information applies equally to \fBpcre_compile2()\fP.
-.P
-The pattern is a C string terminated by a binary zero, and is passed in the
-\fIpattern\fP argument. A pointer to a single block of memory that is obtained
-via \fBpcre_malloc\fP is returned. This contains the compiled code and related
-data. The \fBpcre\fP type is defined for the returned block; this is a typedef
-for a structure whose contents are not externally defined. It is up to the
-caller to free the memory (via \fBpcre_free\fP) when it is no longer required.
-.P
-Although the compiled code of a PCRE regex is relocatable, that is, it does not
-depend on memory location, the complete \fBpcre\fP data block is not
-fully relocatable, because it may contain a copy of the \fItableptr\fP
-argument, which is an address (see below).
-.P
-The \fIoptions\fP argument contains various bit settings that affect the
-compilation. It should be zero if no options are required. The available
-options are described below. Some of them (in particular, those that are
-compatible with Perl, but some others as well) can also be set and unset from
-within the pattern (see the detailed description in the
-.\" HREF
-\fBpcrepattern\fP
-.\"
-documentation). For those options that can be different in different parts of
-the pattern, the contents of the \fIoptions\fP argument specifies their
-settings at the start of compilation and execution. The PCRE_ANCHORED,
-PCRE_BSR_\fIxxx\fP, PCRE_NEWLINE_\fIxxx\fP, PCRE_NO_UTF8_CHECK, and
-PCRE_NO_START_OPTIMIZE options can be set at the time of matching as well as at
-compile time.
-.P
-If \fIerrptr\fP is NULL, \fBpcre_compile()\fP returns NULL immediately.
-Otherwise, if compilation of a pattern fails, \fBpcre_compile()\fP returns
-NULL, and sets the variable pointed to by \fIerrptr\fP to point to a textual
-error message. This is a static string that is part of the library. You must
-not try to free it. Normally, the offset from the start of the pattern to the
-data unit that was being processed when the error was discovered is placed in
-the variable pointed to by \fIerroffset\fP, which must not be NULL (if it is,
-an immediate error is given). However, for an invalid UTF-8 or UTF-16 string,
-the offset is that of the first data unit of the failing character.
-.P
-Some errors are not detected until the whole pattern has been scanned; in these
-cases, the offset passed back is the length of the pattern. Note that the
-offset is in data units, not characters, even in a UTF mode. It may sometimes
-point into the middle of a UTF-8 or UTF-16 character.
-.P
-If \fBpcre_compile2()\fP is used instead of \fBpcre_compile()\fP, and the
-\fIerrorcodeptr\fP argument is not NULL, a non-zero error code number is
-returned via this argument in the event of an error. This is in addition to the
-textual error message. Error codes and messages are listed below.
-.P
-If the final argument, \fItableptr\fP, is NULL, PCRE uses a default set of
-character tables that are built when PCRE is compiled, using the default C
-locale. Otherwise, \fItableptr\fP must be an address that is the result of a
-call to \fBpcre_maketables()\fP. This value is stored with the compiled
-pattern, and used again by \fBpcre_exec()\fP and \fBpcre_dfa_exec()\fP when the
-pattern is matched. For more discussion, see the section on locale support
-below.
-.P
-This code fragment shows a typical straightforward call to \fBpcre_compile()\fP:
-.sp
-  pcre *re;
-  const char *error;
-  int erroffset;
-  re = pcre_compile(
-    "^A.*Z",          /* the pattern */
-    0,                /* default options */
-    &error,           /* for error message */
-    &erroffset,       /* for error offset */
-    NULL);            /* use default character tables */
-.sp
-The following names for option bits are defined in the \fBpcre.h\fP header
-file:
-.sp
-  PCRE_ANCHORED
-.sp
-If this bit is set, the pattern is forced to be "anchored", that is, it is
-constrained to match only at the first matching point in the string that is
-being searched (the "subject string"). This effect can also be achieved by
-appropriate constructs in the pattern itself, which is the only way to do it in
-Perl.
-.sp
-  PCRE_AUTO_CALLOUT
-.sp
-If this bit is set, \fBpcre_compile()\fP automatically inserts callout items,
-all with number 255, before each pattern item. For discussion of the callout
-facility, see the
-.\" HREF
-\fBpcrecallout\fP
-.\"
-documentation.
-.sp
-  PCRE_BSR_ANYCRLF
-  PCRE_BSR_UNICODE
-.sp
-These options (which are mutually exclusive) control what the \eR escape
-sequence matches. The choice is either to match only CR, LF, or CRLF, or to
-match any Unicode newline sequence. The default is specified when PCRE is
-built. It can be overridden from within the pattern, or by setting an option
-when a compiled pattern is matched.
-.sp
-  PCRE_CASELESS
-.sp
-If this bit is set, letters in the pattern match both upper and lower case
-letters. It is equivalent to Perl's /i option, and it can be changed within a
-pattern by a (?i) option setting. 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.
-.sp
-  PCRE_DOLLAR_ENDONLY
-.sp
-If this bit is set, a dollar metacharacter in the pattern matches only at the
-end of the subject string. Without this option, a dollar also matches
-immediately before a newline at the end of the string (but not before any other
-newlines). The PCRE_DOLLAR_ENDONLY option is ignored if PCRE_MULTILINE is set.
-There is no equivalent to this option in Perl, and no way to set it within a
-pattern.
-.sp
-  PCRE_DOTALL
-.sp
-If this bit is set, a dot metacharacter in the pattern matches a character of
-any value, including one that indicates a newline. However, it only ever
-matches one character, even if newlines are coded as CRLF. Without this option,
-a dot does not match when the current position is at a newline. This option is
-equivalent to Perl's /s option, and it can be changed within a pattern by a
-(?s) option setting. A negative class such as [^a] always matches newline
-characters, independent of the setting of this option.
-.sp
-  PCRE_DUPNAMES
-.sp
-If this bit is set, names used to identify capturing subpatterns need not be
-unique. This can be helpful for certain types of pattern when it is known that
-only one instance of the named subpattern can ever be matched. There are more
-details of named subpatterns below; see also the
-.\" HREF
-\fBpcrepattern\fP
-.\"
-documentation.
-.sp
-  PCRE_EXTENDED
-.sp
-If this bit is set, most white space characters in the pattern are totally
-ignored except when escaped or inside a character class. However, white space
-is not allowed within sequences such as (?> that introduce various
-parenthesized subpatterns, nor within a numerical quantifier such as {1,3}.
-However, ignorable white space is permitted between an item and a following
-quantifier and between a quantifier and a following + that indicates
-possessiveness.
-.P
-White space did not used to include the VT character (code 11), because Perl
-did not treat this character as white space. However, Perl changed at release
-5.18, so PCRE followed at release 8.34, and VT is now treated as white space.
-.P
-PCRE_EXTENDED also causes characters between an unescaped # outside a character
-class and the next newline, inclusive, to be ignored. PCRE_EXTENDED is
-equivalent to Perl's /x option, and it can be changed within a pattern by a
-(?x) option setting.
-.P
-Which characters are interpreted as newlines is controlled by the options
-passed to \fBpcre_compile()\fP or by a special sequence at the start of the
-pattern, as described in the section entitled
-.\" HTML <a href="pcrepattern.html#newlines">
-.\" </a>
-"Newline conventions"
-.\"
-in the \fBpcrepattern\fP documentation. Note that the end of this type of
-comment is a literal newline sequence in the pattern; escape sequences that
-happen to represent a newline do not count.
-.P
-This option makes it possible to include comments inside complicated patterns.
-Note, however, that this applies only to data characters. White space characters
-may never appear within special character sequences in a pattern, for example
-within the sequence (?( that introduces a conditional subpattern.
-.sp
-  PCRE_EXTRA
-.sp
-This option was invented in order to turn on additional functionality of PCRE
-that is incompatible with Perl, but it is currently of very little use. When
-set, any backslash in a pattern that is followed by a letter that has no
-special meaning causes an error, thus reserving these combinations for future
-expansion. By default, as in Perl, a backslash followed by a letter with no
-special meaning is treated as a literal. (Perl can, however, be persuaded to
-give an error for this, by running it with the -w option.) There are at present
-no other features controlled by this option. It can also be set by a (?X)
-option setting within a pattern.
-.sp
-  PCRE_FIRSTLINE
-.sp
-If this option is set, an unanchored pattern is required to match before or at
-the first newline in the subject string, though the matched text may continue
-over the newline.
-.sp
-  PCRE_JAVASCRIPT_COMPAT
-.sp
-If this option is set, PCRE's behaviour is changed in some ways so that it is
-compatible with JavaScript rather than Perl. The changes are as follows:
-.P
-(1) A lone closing square bracket in a pattern causes a compile-time error,
-because this is illegal in JavaScript (by default it is treated as a data
-character). Thus, the pattern AB]CD becomes illegal when this option is set.
-.P
-(2) At run time, a back reference to an unset subpattern group matches an empty
-string (by default this causes the current matching alternative to fail). A
-pattern such as (\e1)(a) succeeds when this option is set (assuming it can find
-an "a" in the subject), whereas it fails by default, for Perl compatibility.
-.P
-(3) \eU matches an upper case "U" character; by default \eU causes a compile
-time error (Perl uses \eU to upper case subsequent characters).
-.P
-(4) \eu matches a lower case "u" character unless it is followed by four
-hexadecimal digits, in which case the hexadecimal number defines the code point
-to match. By default, \eu causes a compile time error (Perl uses it to upper
-case the following character).
-.P
-(5) \ex matches a lower case "x" character unless it is followed by two
-hexadecimal digits, in which case the hexadecimal number defines the code point
-to match. By default, as in Perl, a hexadecimal number is always expected after
-\ex, but it may have zero, one, or two digits (so, for example, \exz matches a
-binary zero character followed by z).
-.sp
-  PCRE_MULTILINE
-.sp
-By default, for the purposes of matching "start of line" and "end of line",
-PCRE treats the subject string as consisting of a single line of characters,
-even if it actually contains newlines. The "start of line" metacharacter (^)
-matches only at the start of the string, and the "end of line" metacharacter
-($) matches only at the end of the string, or before a terminating newline
-(except when PCRE_DOLLAR_ENDONLY is set). Note, however, that unless
-PCRE_DOTALL is set, the "any character" metacharacter (.) does not match at a
-newline. This behaviour (for ^, $, and dot) is the same as Perl.
-.P
-When PCRE_MULTILINE it is set, the "start of line" and "end of line" constructs
-match immediately following or immediately before internal newlines in the
-subject string, respectively, as well as at the very start and end. This is
-equivalent to Perl's /m option, and it can be changed within a pattern by a
-(?m) option setting. If there are no newlines in a subject string, or no
-occurrences of ^ or $ in a pattern, setting PCRE_MULTILINE has no effect.
-.sp
-  PCRE_NEVER_UTF
-.sp
-This option locks out interpretation of the pattern as UTF-8 (or UTF-16 or
-UTF-32 in the 16-bit and 32-bit libraries). In particular, it prevents the
-creator of the pattern from switching to UTF interpretation by starting the
-pattern with (*UTF). This may be useful in applications that process patterns
-from external sources. The combination of PCRE_UTF8 and PCRE_NEVER_UTF also
-causes an error.
-.sp
-  PCRE_NEWLINE_CR
-  PCRE_NEWLINE_LF
-  PCRE_NEWLINE_CRLF
-  PCRE_NEWLINE_ANYCRLF
-  PCRE_NEWLINE_ANY
-.sp
-These options override the default newline definition that was chosen when PCRE
-was built. Setting the first or the second specifies that a newline is
-indicated by a single character (CR or LF, respectively). Setting
-PCRE_NEWLINE_CRLF specifies that a newline is indicated by the two-character
-CRLF sequence. Setting PCRE_NEWLINE_ANYCRLF specifies that any of the three
-preceding sequences should be recognized. Setting PCRE_NEWLINE_ANY specifies
-that any Unicode newline sequence should be recognized.
-.P
-In an ASCII/Unicode environment, the Unicode newline sequences are the three
-just mentioned, plus the single characters VT (vertical tab, U+000B), FF (form
-feed, U+000C), NEL (next line, U+0085), LS (line separator, U+2028), and PS
-(paragraph separator, U+2029). For the 8-bit library, the last two are
-recognized only in UTF-8 mode.
-.P
-When PCRE is compiled to run in an EBCDIC (mainframe) environment, the code for
-CR is 0x0d, the same as ASCII. However, the character code for LF is normally
-0x15, though in some EBCDIC environments 0x25 is used. Whichever of these is
-not LF is made to correspond to Unicode's NEL character. EBCDIC codes are all
-less than 256. For more details, see the
-.\" HREF
-\fBpcrebuild\fP
-.\"
-documentation.
-.P
-The newline setting in the options word uses three bits that are treated
-as a number, giving eight possibilities. Currently only six are used (default
-plus the five values above). This means that if you set more than one newline
-option, the combination may or may not be sensible. For example,
-PCRE_NEWLINE_CR with PCRE_NEWLINE_LF is equivalent to PCRE_NEWLINE_CRLF, but
-other combinations may yield unused numbers and cause an error.
-.P
-The only time that a line break in a pattern is specially recognized when
-compiling is when PCRE_EXTENDED is set. CR and LF are white space characters,
-and so are ignored in this mode. Also, an unescaped # outside a character class
-indicates a comment that lasts until after the next line break sequence. In
-other circumstances, line break sequences in patterns are treated as literal
-data.
-.P
-The newline option that is set at compile time becomes the default that is used
-for \fBpcre_exec()\fP and \fBpcre_dfa_exec()\fP, but it can be overridden.
-.sp
-  PCRE_NO_AUTO_CAPTURE
-.sp
-If this option is set, it disables the use of numbered capturing parentheses in
-the pattern. Any opening parenthesis that is not followed by ? behaves as if it
-were followed by ?: but named parentheses can still be used for capturing (and
-they acquire numbers in the usual way). There is no equivalent of this option
-in Perl.
-.sp
-  PCRE_NO_AUTO_POSSESS
-.sp
-If this option is set, it disables "auto-possessification". This is an
-optimization that, for example, turns a+b into a++b in order to avoid
-backtracks into a+ that can never be successful. However, if callouts are in
-use, auto-possessification means that some of them are never taken. You can set
-this option if you want the matching functions to do a full unoptimized search
-and run all the callouts, but it is mainly provided for testing purposes.
-.sp
-  PCRE_NO_START_OPTIMIZE
-.sp
-This is an option that acts at matching time; that is, it is really an option
-for \fBpcre_exec()\fP or \fBpcre_dfa_exec()\fP. If it is set at compile time,
-it is remembered with the compiled pattern and assumed at matching time. This
-is necessary if you want to use JIT execution, because the JIT compiler needs
-to know whether or not this option is set. For details see the discussion of
-PCRE_NO_START_OPTIMIZE
-.\" HTML <a href="#execoptions">
-.\" </a>
-below.
-.\"
-.sp
-  PCRE_UCP
-.sp
-This option changes the way PCRE processes \eB, \eb, \eD, \ed, \eS, \es, \eW,
-\ew, and some of the POSIX character classes. By default, only ASCII characters
-are recognized, but if PCRE_UCP is set, Unicode properties are used instead to
-classify characters. More details are given in the section on
-.\" HTML <a href="pcre.html#genericchartypes">
-.\" </a>
-generic character types
-.\"
-in the
-.\" HREF
-\fBpcrepattern\fP
-.\"
-page. If you set PCRE_UCP, matching one of the items it affects takes much
-longer. The option is available only if PCRE has been compiled with Unicode
-property support.
-.sp
-  PCRE_UNGREEDY
-.sp
-This option inverts the "greediness" of the quantifiers so that they are not
-greedy by default, but become greedy if followed by "?". It is not compatible
-with Perl. It can also be set by a (?U) option setting within the pattern.
-.sp
-  PCRE_UTF8
-.sp
-This option causes PCRE to regard both the pattern and the subject as strings
-of UTF-8 characters instead of single-byte strings. However, it is available
-only when PCRE is built to include UTF support. If not, the use of this option
-provokes an error. Details of how this option changes the behaviour of PCRE are
-given in the
-.\" HREF
-\fBpcreunicode\fP
-.\"
-page.
-.sp
-  PCRE_NO_UTF8_CHECK
-.sp
-When PCRE_UTF8 is set, the validity of the pattern as a UTF-8 string is
-automatically checked. There is a discussion about the
-.\" HTML <a href="pcreunicode.html#utf8strings">
-.\" </a>
-validity of UTF-8 strings
-.\"
-in the
-.\" HREF
-\fBpcreunicode\fP
-.\"
-page. If an invalid UTF-8 sequence is found, \fBpcre_compile()\fP returns an
-error. If you already know that your pattern is valid, and you want to skip
-this check for performance reasons, you can set the PCRE_NO_UTF8_CHECK option.
-When it is set, the effect of passing an invalid UTF-8 string as a pattern is
-undefined. It may cause your program to crash or loop. Note that this option
-can also be passed to \fBpcre_exec()\fP and \fBpcre_dfa_exec()\fP, to suppress
-the validity checking of subject strings only. If the same string is being
-matched many times, the option can be safely set for the second and subsequent
-matchings to improve performance.
-.
-.
-.SH "COMPILATION ERROR CODES"
-.rs
-.sp
-The following table lists the error codes than may be returned by
-\fBpcre_compile2()\fP, along with the error messages that may be returned by
-both compiling functions. Note that error messages are always 8-bit ASCII
-strings, even in 16-bit or 32-bit mode. As PCRE has developed, some error codes
-have fallen out of use. To avoid confusion, they have not been re-used.
-.sp
-   0  no error
-   1  \e at end of pattern
-   2  \ec at end of pattern
-   3  unrecognized character follows \e
-   4  numbers out of order in {} quantifier
-   5  number too big in {} quantifier
-   6  missing terminating ] for character class
-   7  invalid escape sequence in character class
-   8  range out of order in character class
-   9  nothing to repeat
-  10  [this code is not in use]
-  11  internal error: unexpected repeat
-  12  unrecognized character after (? or (?-
-  13  POSIX named classes are supported only within a class
-  14  missing )
-  15  reference to non-existent subpattern
-  16  erroffset passed as NULL
-  17  unknown option bit(s) set
-  18  missing ) after comment
-  19  [this code is not in use]
-  20  regular expression is too large
-  21  failed to get memory
-  22  unmatched parentheses
-  23  internal error: code overflow
-  24  unrecognized character after (?<
-  25  lookbehind assertion is not fixed length
-  26  malformed number or name after (?(
-  27  conditional group contains more than two branches
-  28  assertion expected after (?(
-  29  (?R or (?[+-]digits must be followed by )
-  30  unknown POSIX class name
-  31  POSIX collating elements are not supported
-  32  this version of PCRE is compiled without UTF support
-  33  [this code is not in use]
-  34  character value in \ex{} or \eo{} is too large
-  35  invalid condition (?(0)
-  36  \eC not allowed in lookbehind assertion
-  37  PCRE does not support \eL, \el, \eN{name}, \eU, or \eu
-  38  number after (?C is > 255
-  39  closing ) for (?C expected
-  40  recursive call could loop indefinitely
-  41  unrecognized character after (?P
-  42  syntax error in subpattern name (missing terminator)
-  43  two named subpatterns have the same name
-  44  invalid UTF-8 string (specifically UTF-8)
-  45  support for \eP, \ep, and \eX has not been compiled
-  46  malformed \eP or \ep sequence
-  47  unknown property name after \eP or \ep
-  48  subpattern name is too long (maximum 32 characters)
-  49  too many named subpatterns (maximum 10000)
-  50  [this code is not in use]
-  51  octal value is greater than \e377 in 8-bit non-UTF-8 mode
-  52  internal error: overran compiling workspace
-  53  internal error: previously-checked referenced subpattern
-        not found
-  54  DEFINE group contains more than one branch
-  55  repeating a DEFINE group is not allowed
-  56  inconsistent NEWLINE options
-  57  \eg is not followed by a braced, angle-bracketed, or quoted
-        name/number or by a plain number
-  58  a numbered reference must not be zero
-  59  an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)
-  60  (*VERB) not recognized or malformed
-  61  number is too big
-  62  subpattern name expected
-  63  digit expected after (?+
-  64  ] is an invalid data character in JavaScript compatibility mode
-  65  different names for subpatterns of the same number are
-        not allowed
-  66  (*MARK) must have an argument
-  67  this version of PCRE is not compiled with Unicode property
-        support
-  68  \ec must be followed by an ASCII character
-  69  \ek is not followed by a braced, angle-bracketed, or quoted name
-  70  internal error: unknown opcode in find_fixedlength()
-  71  \eN is not supported in a class
-  72  too many forward references
-  73  disallowed Unicode code point (>= 0xd800 && <= 0xdfff)
-  74  invalid UTF-16 string (specifically UTF-16)
-  75  name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)
-  76  character value in \eu.... sequence is too large
-  77  invalid UTF-32 string (specifically UTF-32)
-  78  setting UTF is disabled by the application
-  79  non-hex character in \ex{} (closing brace missing?)
-  80  non-octal character in \eo{} (closing brace missing?)
-  81  missing opening brace after \eo
-  82  parentheses are too deeply nested
-  83  invalid range in character class
-  84  group name must start with a non-digit
-  85  parentheses are too deeply nested (stack check)
-.sp
-The numbers 32 and 10000 in errors 48 and 49 are defaults; different values may
-be used if the limits were changed when PCRE was built.
-.
-.
-.\" HTML <a name="studyingapattern"></a>
-.SH "STUDYING A PATTERN"
-.rs
-.sp
-.nf
-.B pcre_extra *pcre_study(const pcre *\fIcode\fP, int \fIoptions\fP,
-.B "     const char **\fIerrptr\fP);"
-.fi
-.PP
-If a compiled pattern is going to be used several times, it is worth spending
-more time analyzing it in order to speed up the time taken for matching. The
-function \fBpcre_study()\fP takes a pointer to a compiled pattern as its first
-argument. If studying the pattern produces additional information that will
-help speed up matching, \fBpcre_study()\fP returns a pointer to a
-\fBpcre_extra\fP block, in which the \fIstudy_data\fP field points to the
-results of the study.
-.P
-The returned value from \fBpcre_study()\fP can be passed directly to
-\fBpcre_exec()\fP or \fBpcre_dfa_exec()\fP. However, a \fBpcre_extra\fP block
-also contains other fields that can be set by the caller before the block is
-passed; these are described
-.\" HTML <a href="#extradata">
-.\" </a>
-below
-.\"
-in the section on matching a pattern.
-.P
-If studying the pattern does not produce any useful information,
-\fBpcre_study()\fP returns NULL by default. In that circumstance, if the
-calling program wants to pass any of the other fields to \fBpcre_exec()\fP or
-\fBpcre_dfa_exec()\fP, it must set up its own \fBpcre_extra\fP block. However,
-if \fBpcre_study()\fP is called with the PCRE_STUDY_EXTRA_NEEDED option, it
-returns a \fBpcre_extra\fP block even if studying did not find any additional
-information. It may still return NULL, however, if an error occurs in
-\fBpcre_study()\fP.
-.P
-The second argument of \fBpcre_study()\fP contains option bits. There are three
-further options in addition to PCRE_STUDY_EXTRA_NEEDED:
-.sp
-  PCRE_STUDY_JIT_COMPILE
-  PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE
-  PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE
-.sp
-If any of these are set, and the just-in-time compiler is available, the
-pattern is further compiled into machine code that executes much faster than
-the \fBpcre_exec()\fP interpretive matching function. If the just-in-time
-compiler is not available, these options are ignored. All undefined bits in the
-\fIoptions\fP argument must be zero.
-.P
-JIT compilation is a heavyweight optimization. It can take some time for
-patterns to be analyzed, and for one-off matches and simple patterns the
-benefit of faster execution might be offset by a much slower study time.
-Not all patterns can be optimized by the JIT compiler. For those that cannot be
-handled, matching automatically falls back to the \fBpcre_exec()\fP
-interpreter. For more details, see the
-.\" HREF
-\fBpcrejit\fP
-.\"
-documentation.
-.P
-The third argument for \fBpcre_study()\fP is a pointer for an error message. If
-studying succeeds (even if no data is returned), the variable it points to is
-set to NULL. Otherwise it is set to point to a textual error message. This is a
-static string that is part of the library. You must not try to free it. You
-should test the error pointer for NULL after calling \fBpcre_study()\fP, to be
-sure that it has run successfully.
-.P
-When you are finished with a pattern, you can free the memory used for the
-study data by calling \fBpcre_free_study()\fP. This function was added to the
-API for release 8.20. For earlier versions, the memory could be freed with
-\fBpcre_free()\fP, just like the pattern itself. This will still work in cases
-where JIT optimization is not used, but it is advisable to change to the new
-function when convenient.
-.P
-This is a typical way in which \fBpcre_study\fP() is used (except that in a
-real application there should be tests for errors):
-.sp
-  int rc;
-  pcre *re;
-  pcre_extra *sd;
-  re = pcre_compile("pattern", 0, &error, &erroroffset, NULL);
-  sd = pcre_study(
-    re,             /* result of pcre_compile() */
-    0,              /* no options */
-    &error);        /* set to NULL or points to a message */
-  rc = pcre_exec(   /* see below for details of pcre_exec() options */
-    re, sd, "subject", 7, 0, 0, ovector, 30);
-  ...
-  pcre_free_study(sd);
-  pcre_free(re);
-.sp
-Studying a pattern does two things: first, a lower bound for the length of
-subject string that is needed to match the pattern is computed. This does not
-mean that there are any strings of that length that match, but it does
-guarantee that no shorter strings match. The value is used to avoid wasting
-time by trying to match strings that are shorter than the lower bound. You can
-find out the value in a calling program via the \fBpcre_fullinfo()\fP function.
-.P
-Studying a pattern is also useful for non-anchored patterns that do not have a
-single fixed starting character. A bitmap of possible starting bytes is
-created. This speeds up finding a position in the subject at which to start
-matching. (In 16-bit mode, the bitmap is used for 16-bit values less than 256.
-In 32-bit mode, the bitmap is used for 32-bit values less than 256.)
-.P
-These two optimizations apply to both \fBpcre_exec()\fP and
-\fBpcre_dfa_exec()\fP, and the information is also used by the JIT compiler.
-The optimizations can be disabled by setting the PCRE_NO_START_OPTIMIZE option.
-You might want to do this if your pattern contains callouts or (*MARK) and you
-want to make use of these facilities in cases where matching fails.
-.P
-PCRE_NO_START_OPTIMIZE can be specified at either compile time or execution
-time. However, if PCRE_NO_START_OPTIMIZE is passed to \fBpcre_exec()\fP, (that
-is, after any JIT compilation has happened) JIT execution is disabled. For JIT
-execution to work with PCRE_NO_START_OPTIMIZE, the option must be set at
-compile time.
-.P
-There is a longer discussion of PCRE_NO_START_OPTIMIZE
-.\" HTML <a href="#execoptions">
-.\" </a>
-below.
-.\"
-.
-.
-.\" HTML <a name="localesupport"></a>
-.SH "LOCALE SUPPORT"
-.rs
-.sp
-PCRE handles caseless matching, and determines whether characters are letters,
-digits, or whatever, by reference to a set of tables, indexed by character
-code point. When running in UTF-8 mode, or in the 16- or 32-bit libraries, this
-applies only to characters with code points less than 256. By default,
-higher-valued code points never match escapes such as \ew or \ed. However, if
-PCRE is built with Unicode property support, all characters can be tested with
-\ep and \eP, or, alternatively, the PCRE_UCP option can be set when a pattern
-is compiled; this causes \ew and friends to use Unicode property support
-instead of the built-in tables.
-.P
-The use of locales with Unicode is discouraged. If you are handling characters
-with code points greater than 128, you should either use Unicode support, or
-use locales, but not try to mix the two.
-.P
-PCRE contains an internal set of tables that are used when the final argument
-of \fBpcre_compile()\fP is NULL. These are sufficient for many applications.
-Normally, the internal tables recognize only ASCII characters. However, when
-PCRE is built, it is possible to cause the internal tables to be rebuilt in the
-default "C" locale of the local system, which may cause them to be different.
-.P
-The internal tables can always be overridden by tables supplied by the
-application that calls PCRE. These may be created in a different locale from
-the default. As more and more applications change to using Unicode, the need
-for this locale support is expected to die away.
-.P
-External tables are built by calling the \fBpcre_maketables()\fP function,
-which has no arguments, in the relevant locale. The result can then be passed
-to \fBpcre_compile()\fP as often as necessary. For example, to build and use
-tables that are appropriate for the French locale (where accented characters
-with values greater than 128 are treated as letters), the following code could
-be used:
-.sp
-  setlocale(LC_CTYPE, "fr_FR");
-  tables = pcre_maketables();
-  re = pcre_compile(..., tables);
-.sp
-The locale name "fr_FR" is used on Linux and other Unix-like systems; if you
-are using Windows, the name for the French locale is "french".
-.P
-When \fBpcre_maketables()\fP runs, the tables are built in memory that is
-obtained via \fBpcre_malloc\fP. It is the caller's responsibility to ensure
-that the memory containing the tables remains available for as long as it is
-needed.
-.P
-The pointer that is passed to \fBpcre_compile()\fP is saved with the compiled
-pattern, and the same tables are used via this pointer by \fBpcre_study()\fP
-and also by \fBpcre_exec()\fP and \fBpcre_dfa_exec()\fP. Thus, for any single
-pattern, compilation, studying and matching all happen in the same locale, but
-different patterns can be processed in different locales.
-.P
-It is possible to pass a table pointer or NULL (indicating the use of the
-internal tables) to \fBpcre_exec()\fP or \fBpcre_dfa_exec()\fP (see the
-discussion below in the section on matching a pattern). This facility is
-provided for use with pre-compiled patterns that have been saved and reloaded.
-Character tables are not saved with patterns, so if a non-standard table was
-used at compile time, it must be provided again when the reloaded pattern is
-matched. Attempting to use this facility to match a pattern in a different
-locale from the one in which it was compiled is likely to lead to anomalous
-(usually incorrect) results.
-.
-.
-.\" HTML <a name="infoaboutpattern"></a>
-.SH "INFORMATION ABOUT A PATTERN"
-.rs
-.sp
-.nf
-.B int pcre_fullinfo(const pcre *\fIcode\fP, "const pcre_extra *\fIextra\fP,"
-.B "     int \fIwhat\fP, void *\fIwhere\fP);"
-.fi
-.PP
-The \fBpcre_fullinfo()\fP function returns information about a compiled
-pattern. It replaces the \fBpcre_info()\fP function, which was removed from the
-library at version 8.30, after more than 10 years of obsolescence.
-.P
-The first argument for \fBpcre_fullinfo()\fP is a pointer to the compiled
-pattern. The second argument is the result of \fBpcre_study()\fP, or NULL if
-the pattern was not studied. The third argument specifies which piece of
-information is required, and the fourth argument is a pointer to a variable
-to receive the data. The yield of the function is zero for success, or one of
-the following negative numbers:
-.sp
-  PCRE_ERROR_NULL           the argument \fIcode\fP was NULL
-                            the argument \fIwhere\fP was NULL
-  PCRE_ERROR_BADMAGIC       the "magic number" was not found
-  PCRE_ERROR_BADENDIANNESS  the pattern was compiled with different
-                            endianness
-  PCRE_ERROR_BADOPTION      the value of \fIwhat\fP was invalid
-  PCRE_ERROR_UNSET          the requested field is not set
-.sp
-The "magic number" is placed at the start of each compiled pattern as an simple
-check against passing an arbitrary memory pointer. The endianness error can
-occur if a compiled pattern is saved and reloaded on a different host. Here is
-a typical call of \fBpcre_fullinfo()\fP, to obtain the length of the compiled
-pattern:
-.sp
-  int rc;
-  size_t length;
-  rc = pcre_fullinfo(
-    re,               /* result of pcre_compile() */
-    sd,               /* result of pcre_study(), or NULL */
-    PCRE_INFO_SIZE,   /* what is required */
-    &length);         /* where to put the data */
-.sp
-The possible values for the third argument are defined in \fBpcre.h\fP, and are
-as follows:
-.sp
-  PCRE_INFO_BACKREFMAX
-.sp
-Return the number of the highest back reference in the pattern. The fourth
-argument should point to an \fBint\fP variable. Zero is returned if there are
-no back references.
-.sp
-  PCRE_INFO_CAPTURECOUNT
-.sp
-Return the number of capturing subpatterns in the pattern. The fourth argument
-should point to an \fBint\fP variable.
-.sp
-  PCRE_INFO_DEFAULT_TABLES
-.sp
-Return a pointer to the internal default character tables within PCRE. The
-fourth argument should point to an \fBunsigned char *\fP variable. This
-information call is provided for internal use by the \fBpcre_study()\fP
-function. External callers can cause PCRE to use its internal tables by passing
-a NULL table pointer.
-.sp
-  PCRE_INFO_FIRSTBYTE (deprecated)
-.sp
-Return information about the first data unit of any matched string, for a
-non-anchored pattern. The name of this option refers to the 8-bit library,
-where data units are bytes. The fourth argument should point to an \fBint\fP
-variable. Negative values are used for special cases. However, this means that
-when the 32-bit library is in non-UTF-32 mode, the full 32-bit range of
-characters cannot be returned. For this reason, this value is deprecated; use
-PCRE_INFO_FIRSTCHARACTERFLAGS and PCRE_INFO_FIRSTCHARACTER instead.
-.P
-If there is a fixed first value, for example, the letter "c" from a pattern
-such as (cat|cow|coyote), its value is returned. In the 8-bit library, the
-value is always less than 256. In the 16-bit library the value can be up to
-0xffff. In the 32-bit library the value can be up to 0x10ffff.
-.P
-If there is no fixed first value, and if either
-.sp
-(a) the pattern was compiled with the PCRE_MULTILINE option, and every branch
-starts with "^", or
-.sp
-(b) every branch of the pattern starts with ".*" and PCRE_DOTALL is not set
-(if it were set, the pattern would be anchored),
-.sp
--1 is returned, indicating that the pattern matches only at the start of a
-subject string or after any newline within the string. Otherwise -2 is
-returned. For anchored patterns, -2 is returned.
-.sp
-  PCRE_INFO_FIRSTCHARACTER
-.sp
-Return the value of the first data unit (non-UTF character) of any matched
-string in the situation where PCRE_INFO_FIRSTCHARACTERFLAGS returns 1;
-otherwise return 0. The fourth argument should point to an \fBuint_t\fP
-variable.
-.P
-In the 8-bit library, the value is always less than 256. In the 16-bit library
-the value can be up to 0xffff. In the 32-bit library in UTF-32 mode the value
-can be up to 0x10ffff, and up to 0xffffffff when not using UTF-32 mode.
-.sp
-  PCRE_INFO_FIRSTCHARACTERFLAGS
-.sp
-Return information about the first data unit of any matched string, for a
-non-anchored pattern. The fourth argument should point to an \fBint\fP
-variable.
-.P
-If there is a fixed first value, for example, the letter "c" from a pattern
-such as (cat|cow|coyote), 1 is returned, and the character value can be
-retrieved using PCRE_INFO_FIRSTCHARACTER. If there is no fixed first value, and
-if either
-.sp
-(a) the pattern was compiled with the PCRE_MULTILINE option, and every branch
-starts with "^", or
-.sp
-(b) every branch of the pattern starts with ".*" and PCRE_DOTALL is not set
-(if it were set, the pattern would be anchored),
-.sp
-2 is returned, indicating that the pattern matches only at the start of a
-subject string or after any newline within the string. Otherwise 0 is
-returned. For anchored patterns, 0 is returned.
-.sp
-  PCRE_INFO_FIRSTTABLE
-.sp
-If the pattern was studied, and this resulted in the construction of a 256-bit
-table indicating a fixed set of values for the first data unit in any matching
-string, a pointer to the table is returned. Otherwise NULL is returned. The
-fourth argument should point to an \fBunsigned char *\fP variable.
-.sp
-  PCRE_INFO_HASCRORLF
-.sp
-Return 1 if the pattern contains any explicit matches for CR or LF characters,
-otherwise 0. The fourth argument should point to an \fBint\fP variable. An
-explicit match is either a literal CR or LF character, or \er or \en.
-.sp
-  PCRE_INFO_JCHANGED
-.sp
-Return 1 if the (?J) or (?-J) option setting is used in the pattern, otherwise
-0. The fourth argument should point to an \fBint\fP variable. (?J) and
-(?-J) set and unset the local PCRE_DUPNAMES option, respectively.
-.sp
-  PCRE_INFO_JIT
-.sp
-Return 1 if the pattern was studied with one of the JIT options, and
-just-in-time compiling was successful. The fourth argument should point to an
-\fBint\fP variable. A return value of 0 means that JIT support is not available
-in this version of PCRE, or that the pattern was not studied with a JIT option,
-or that the JIT compiler could not handle this particular pattern. See the
-.\" HREF
-\fBpcrejit\fP
-.\"
-documentation for details of what can and cannot be handled.
-.sp
-  PCRE_INFO_JITSIZE
-.sp
-If the pattern was successfully studied with a JIT option, return the size of
-the JIT compiled code, otherwise return zero. The fourth argument should point
-to a \fBsize_t\fP variable.
-.sp
-  PCRE_INFO_LASTLITERAL
-.sp
-Return the value of the rightmost literal data unit that must exist in any
-matched string, other than at its start, if such a value has been recorded. The
-fourth argument should point to an \fBint\fP variable. If there is no such
-value, -1 is returned. For anchored patterns, a last literal value is recorded
-only if it follows something of variable length. For example, for the pattern
-/^a\ed+z\ed+/ the returned value is "z", but for /^a\edz\ed/ the returned value
-is -1.
-.P
-Since for the 32-bit library using the non-UTF-32 mode, this function is unable
-to return the full 32-bit range of characters, this value is deprecated;
-instead the PCRE_INFO_REQUIREDCHARFLAGS and PCRE_INFO_REQUIREDCHAR values should
-be used.
-.sp
-  PCRE_INFO_MATCH_EMPTY
-.sp
-Return 1 if the pattern can match an empty string, otherwise 0. The fourth
-argument should point to an \fBint\fP variable.
-.sp
-  PCRE_INFO_MATCHLIMIT
-.sp
-If the pattern set a match limit by including an item of the form
-(*LIMIT_MATCH=nnnn) at the start, the value is returned. The fourth argument
-should point to an unsigned 32-bit integer. If no such value has been set, the
-call to \fBpcre_fullinfo()\fP returns the error PCRE_ERROR_UNSET.
-.sp
-  PCRE_INFO_MAXLOOKBEHIND
-.sp
-Return the number of characters (NB not data units) in the longest lookbehind
-assertion in the pattern. This information is useful when doing multi-segment
-matching using the partial matching facilities. Note that the simple assertions
-\eb and \eB require a one-character lookbehind. \eA also registers a
-one-character lookbehind, though it does not actually inspect the previous
-character. This is to ensure that at least one character from the old segment
-is retained when a new segment is processed. Otherwise, if there are no
-lookbehinds in the pattern, \eA might match incorrectly at the start of a new
-segment.
-.sp
-  PCRE_INFO_MINLENGTH
-.sp
-If the pattern was studied and a minimum length for matching subject strings
-was computed, its value is returned. Otherwise the returned value is -1. The
-value is a number of characters, which in UTF mode may be different from the
-number of data units. The fourth argument should point to an \fBint\fP
-variable. A non-negative value is a lower bound to the length of any matching
-string. There may not be any strings of that length that do actually match, but
-every string that does match is at least that long.
-.sp
-  PCRE_INFO_NAMECOUNT
-  PCRE_INFO_NAMEENTRYSIZE
-  PCRE_INFO_NAMETABLE
-.sp
-PCRE supports the use of named as well as numbered capturing parentheses. The
-names are just an additional way of identifying the parentheses, which still
-acquire numbers. Several convenience functions such as
-\fBpcre_get_named_substring()\fP are provided for extracting captured
-substrings by name. It is also possible to extract the data directly, by first
-converting the name to a number in order to access the correct pointers in the
-output vector (described with \fBpcre_exec()\fP below). To do the conversion,
-you need to use the name-to-number map, which is described by these three
-values.
-.P
-The map consists of a number of fixed-size entries. PCRE_INFO_NAMECOUNT gives
-the number of entries, and PCRE_INFO_NAMEENTRYSIZE gives the size of each
-entry; both of these return an \fBint\fP value. The entry size depends on the
-length of the longest name. PCRE_INFO_NAMETABLE returns a pointer to the first
-entry of the table. This is a pointer to \fBchar\fP in the 8-bit library, where
-the first two bytes of each entry are the number of the capturing parenthesis,
-most significant byte first. In the 16-bit library, the pointer points to
-16-bit data units, the first of which contains the parenthesis number. In the
-32-bit library, the pointer points to 32-bit data units, the first of which
-contains the parenthesis number. The rest of the entry is the corresponding
-name, zero terminated.
-.P
-The names are in alphabetical order. If (?| is used to create multiple groups
-with the same number, as described in the
-.\" HTML <a href="pcrepattern.html#dupsubpatternnumber">
-.\" </a>
-section on duplicate subpattern numbers
-.\"
-in the
-.\" HREF
-\fBpcrepattern\fP
-.\"
-page, the groups may be given the same name, but there is only one entry in the
-table. Different names for groups of the same number are not permitted.
-Duplicate names for subpatterns with different numbers are permitted,
-but only if PCRE_DUPNAMES is set. They appear in the table in the order in
-which they were found in the pattern. In the absence of (?| this is the order
-of increasing number; when (?| is used this is not necessarily the case because
-later subpatterns may have lower numbers.
-.P
-As a simple example of the name/number table, consider the following pattern
-after compilation by the 8-bit library (assume PCRE_EXTENDED is set, so white
-space - including newlines - is ignored):
-.sp
-.\" JOIN
-  (?<date> (?<year>(\ed\ed)?\ed\ed) -
-  (?<month>\ed\ed) - (?<day>\ed\ed) )
-.sp
-There are four named subpatterns, so the table has four entries, and each entry
-in the table is eight bytes long. The table is as follows, with non-printing
-bytes shows in hexadecimal, and undefined bytes shown as ??:
-.sp
-  00 01 d  a  t  e  00 ??
-  00 05 d  a  y  00 ?? ??
-  00 04 m  o  n  t  h  00
-  00 02 y  e  a  r  00 ??
-.sp
-When writing code to extract data from named subpatterns using the
-name-to-number map, remember that the length of the entries is likely to be
-different for each compiled pattern.
-.sp
-  PCRE_INFO_OKPARTIAL
-.sp
-Return 1 if the pattern can be used for partial matching with
-\fBpcre_exec()\fP, otherwise 0. The fourth argument should point to an
-\fBint\fP variable. From release 8.00, this always returns 1, because the
-restrictions that previously applied to partial matching have been lifted. The
-.\" HREF
-\fBpcrepartial\fP
-.\"
-documentation gives details of partial matching.
-.sp
-  PCRE_INFO_OPTIONS
-.sp
-Return a copy of the options with which the pattern was compiled. The fourth
-argument should point to an \fBunsigned long int\fP variable. These option bits
-are those specified in the call to \fBpcre_compile()\fP, modified by any
-top-level option settings at the start of the pattern itself. In other words,
-they are the options that will be in force when matching starts. For example,
-if the pattern /(?im)abc(?-i)d/ is compiled with the PCRE_EXTENDED option, the
-result is PCRE_CASELESS, PCRE_MULTILINE, and PCRE_EXTENDED.
-.P
-A pattern is automatically anchored by PCRE if all of its top-level
-alternatives begin with one of the following:
-.sp
-  ^     unless PCRE_MULTILINE is set
-  \eA    always
-  \eG    always
-.\" JOIN
-  .*    if PCRE_DOTALL is set and there are no back
-          references to the subpattern in which .* appears
-.sp
-For such patterns, the PCRE_ANCHORED bit is set in the options returned by
-\fBpcre_fullinfo()\fP.
-.sp
-  PCRE_INFO_RECURSIONLIMIT
-.sp
-If the pattern set a recursion limit by including an item of the form
-(*LIMIT_RECURSION=nnnn) at the start, the value is returned. The fourth
-argument should point to an unsigned 32-bit integer. If no such value has been
-set, the call to \fBpcre_fullinfo()\fP returns the error PCRE_ERROR_UNSET.
-.sp
-  PCRE_INFO_SIZE
-.sp
-Return the size of the compiled pattern in bytes (for all three libraries). The
-fourth argument should point to a \fBsize_t\fP variable. This value does not
-include the size of the \fBpcre\fP structure that is returned by
-\fBpcre_compile()\fP. The value that is passed as the argument to
-\fBpcre_malloc()\fP when \fBpcre_compile()\fP is getting memory in which to
-place the compiled data is the value returned by this option plus the size of
-the \fBpcre\fP structure. Studying a compiled pattern, with or without JIT,
-does not alter the value returned by this option.
-.sp
-  PCRE_INFO_STUDYSIZE
-.sp
-Return the size in bytes (for all three libraries) of the data block pointed to
-by the \fIstudy_data\fP field in a \fBpcre_extra\fP block. If \fBpcre_extra\fP
-is NULL, or there is no study data, zero is returned. The fourth argument
-should point to a \fBsize_t\fP variable. The \fIstudy_data\fP field is set by
-\fBpcre_study()\fP to record information that will speed up matching (see the
-section entitled
-.\" HTML <a href="#studyingapattern">
-.\" </a>
-"Studying a pattern"
-.\"
-above). The format of the \fIstudy_data\fP block is private, but its length
-is made available via this option so that it can be saved and restored (see the
-.\" HREF
-\fBpcreprecompile\fP
-.\"
-documentation for details).
-.sp
-  PCRE_INFO_REQUIREDCHARFLAGS
-.sp
-Returns 1 if there is a rightmost literal data unit that must exist in any
-matched string, other than at its start. The fourth argument should  point to
-an \fBint\fP variable. If there is no such value, 0 is returned. If returning
-1, the character value itself can be retrieved using PCRE_INFO_REQUIREDCHAR.
-.P
-For anchored patterns, a last literal value is recorded only if it follows
-something of variable length. For example, for the pattern /^a\ed+z\ed+/ the
-returned value 1 (with "z" returned from PCRE_INFO_REQUIREDCHAR), but for
-/^a\edz\ed/ the returned value is 0.
-.sp
-  PCRE_INFO_REQUIREDCHAR
-.sp
-Return the value of the rightmost literal data unit that must exist in any
-matched string, other than at its start, if such a value has been recorded. The
-fourth argument should point to an \fBuint32_t\fP variable. If there is no such
-value, 0 is returned.
-.
-.
-.SH "REFERENCE COUNTS"
-.rs
-.sp
-.B int pcre_refcount(pcre *\fIcode\fP, int \fIadjust\fP);
-.PP
-The \fBpcre_refcount()\fP function is used to maintain a reference count in the
-data block that contains a compiled pattern. It is provided for the benefit of
-applications that operate in an object-oriented manner, where different parts
-of the application may be using the same compiled pattern, but you want to free
-the block when they are all done.
-.P
-When a pattern is compiled, the reference count field is initialized to zero.
-It is changed only by calling this function, whose action is to add the
-\fIadjust\fP value (which may be positive or negative) to it. The yield of the
-function is the new value. However, the value of the count is constrained to
-lie between 0 and 65535, inclusive. If the new value is outside these limits,
-it is forced to the appropriate limit value.
-.P
-Except when it is zero, the reference count is not correctly preserved if a
-pattern is compiled on one host and then transferred to a host whose byte-order
-is different. (This seems a highly unlikely scenario.)
-.
-.
-.SH "MATCHING A PATTERN: THE TRADITIONAL FUNCTION"
-.rs
-.sp
-.nf
-.B int pcre_exec(const pcre *\fIcode\fP, "const pcre_extra *\fIextra\fP,"
-.B "     const char *\fIsubject\fP," int \fIlength\fP, int \fIstartoffset\fP,
-.B "     int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP);"
-.fi
-.P
-The function \fBpcre_exec()\fP is called to match a subject string against a
-compiled pattern, which is passed in the \fIcode\fP argument. If the
-pattern was studied, the result of the study should be passed in the
-\fIextra\fP argument. You can call \fBpcre_exec()\fP with the same \fIcode\fP
-and \fIextra\fP arguments as many times as you like, in order to match
-different subject strings with the same pattern.
-.P
-This function is the main matching facility of the library, and it operates in
-a Perl-like manner. For specialist use there is also an alternative matching
-function, which is described
-.\" HTML <a href="#dfamatch">
-.\" </a>
-below
-.\"
-in the section about the \fBpcre_dfa_exec()\fP function.
-.P
-In most applications, the pattern will have been compiled (and optionally
-studied) in the same process that calls \fBpcre_exec()\fP. However, it is
-possible to save compiled patterns and study data, and then use them later
-in different processes, possibly even on different hosts. For a discussion
-about this, see the
-.\" HREF
-\fBpcreprecompile\fP
-.\"
-documentation.
-.P
-Here is an example of a simple call to \fBpcre_exec()\fP:
-.sp
-  int rc;
-  int ovector[30];
-  rc = pcre_exec(
-    re,             /* result of pcre_compile() */
-    NULL,           /* we didn't study the pattern */
-    "some string",  /* the subject string */
-    11,             /* the length of the subject string */
-    0,              /* start at offset 0 in the subject */
-    0,              /* default options */
-    ovector,        /* vector of integers for substring information */
-    30);            /* number of elements (NOT size in bytes) */
-.
-.
-.\" HTML <a name="extradata"></a>
-.SS "Extra data for \fBpcre_exec()\fR"
-.rs
-.sp
-If the \fIextra\fP argument is not NULL, it must point to a \fBpcre_extra\fP
-data block. The \fBpcre_study()\fP function returns such a block (when it
-doesn't return NULL), but you can also create one for yourself, and pass
-additional information in it. The \fBpcre_extra\fP block contains the following
-fields (not necessarily in this order):
-.sp
-  unsigned long int \fIflags\fP;
-  void *\fIstudy_data\fP;
-  void *\fIexecutable_jit\fP;
-  unsigned long int \fImatch_limit\fP;
-  unsigned long int \fImatch_limit_recursion\fP;
-  void *\fIcallout_data\fP;
-  const unsigned char *\fItables\fP;
-  unsigned char **\fImark\fP;
-.sp
-In the 16-bit version of this structure, the \fImark\fP field has type
-"PCRE_UCHAR16 **".
-.sp
-In the 32-bit version of this structure, the \fImark\fP field has type
-"PCRE_UCHAR32 **".
-.P
-The \fIflags\fP field is used to specify which of the other fields are set. The
-flag bits are:
-.sp
-  PCRE_EXTRA_CALLOUT_DATA
-  PCRE_EXTRA_EXECUTABLE_JIT
-  PCRE_EXTRA_MARK
-  PCRE_EXTRA_MATCH_LIMIT
-  PCRE_EXTRA_MATCH_LIMIT_RECURSION
-  PCRE_EXTRA_STUDY_DATA
-  PCRE_EXTRA_TABLES
-.sp
-Other flag bits should be set to zero. The \fIstudy_data\fP field and sometimes
-the \fIexecutable_jit\fP field are set in the \fBpcre_extra\fP block that is
-returned by \fBpcre_study()\fP, together with the appropriate flag bits. You
-should not set these yourself, but you may add to the block by setting other
-fields and their corresponding flag bits.
-.P
-The \fImatch_limit\fP field provides a means of preventing PCRE from using up a
-vast amount of resources when running patterns that are not going to match,
-but which have a very large number of possibilities in their search trees. The
-classic example is a pattern that uses nested unlimited repeats.
-.P
-Internally, \fBpcre_exec()\fP uses a function called \fBmatch()\fP, which it
-calls repeatedly (sometimes recursively). The limit set by \fImatch_limit\fP is
-imposed on the number of times this function is called during a match, which
-has the effect of limiting the amount of backtracking that can take place. For
-patterns that are not anchored, the count restarts from zero for each position
-in the subject string.
-.P
-When \fBpcre_exec()\fP is called with a pattern that was successfully studied
-with a JIT option, the way that the matching is executed is entirely different.
-However, there is still the possibility of runaway matching that goes on for a
-very long time, and so the \fImatch_limit\fP value is also used in this case
-(but in a different way) to limit how long the matching can continue.
-.P
-The default value for the limit can be set when PCRE is built; the default
-default is 10 million, which handles all but the most extreme cases. You can
-override the default by suppling \fBpcre_exec()\fP with a \fBpcre_extra\fP
-block in which \fImatch_limit\fP is set, and PCRE_EXTRA_MATCH_LIMIT is set in
-the \fIflags\fP field. If the limit is exceeded, \fBpcre_exec()\fP returns
-PCRE_ERROR_MATCHLIMIT.
-.P
-A value for the match limit may also be supplied by an item at the start of a
-pattern of the form
-.sp
-  (*LIMIT_MATCH=d)
-.sp
-where d is a decimal number. However, such a setting is ignored unless d is
-less than the limit set by the caller of \fBpcre_exec()\fP or, if no such limit
-is set, less than the default.
-.P
-The \fImatch_limit_recursion\fP field is similar to \fImatch_limit\fP, but
-instead of limiting the total number of times that \fBmatch()\fP is called, it
-limits the depth of recursion. The recursion depth is a smaller number than the
-total number of calls, because not all calls to \fBmatch()\fP are recursive.
-This limit is of use only if it is set smaller than \fImatch_limit\fP.
-.P
-Limiting the recursion depth limits the amount of machine stack that can be
-used, or, when PCRE has been compiled to use memory on the heap instead of the
-stack, the amount of heap memory that can be used. This limit is not relevant,
-and is ignored, when matching is done using JIT compiled code.
-.P
-The default value for \fImatch_limit_recursion\fP can be set when PCRE is
-built; the default default is the same value as the default for
-\fImatch_limit\fP. You can override the default by suppling \fBpcre_exec()\fP
-with a \fBpcre_extra\fP block in which \fImatch_limit_recursion\fP is set, and
-PCRE_EXTRA_MATCH_LIMIT_RECURSION is set in the \fIflags\fP field. If the limit
-is exceeded, \fBpcre_exec()\fP returns PCRE_ERROR_RECURSIONLIMIT.
-.P
-A value for the recursion limit may also be supplied by an item at the start of
-a pattern of the form
-.sp
-  (*LIMIT_RECURSION=d)
-.sp
-where d is a decimal number. However, such a setting is ignored unless d is
-less than the limit set by the caller of \fBpcre_exec()\fP or, if no such limit
-is set, less than the default.
-.P
-The \fIcallout_data\fP field is used in conjunction with the "callout" feature,
-and is described in the
-.\" HREF
-\fBpcrecallout\fP
-.\"
-documentation.
-.P
-The \fItables\fP field is provided for use with patterns that have been
-pre-compiled using custom character tables, saved to disc or elsewhere, and
-then reloaded, because the tables that were used to compile a pattern are not
-saved with it. See the
-.\" HREF
-\fBpcreprecompile\fP
-.\"
-documentation for a discussion of saving compiled patterns for later use. If
-NULL is passed using this mechanism, it forces PCRE's internal tables to be
-used.
-.P
-\fBWarning:\fP The tables that \fBpcre_exec()\fP uses must be the same as those
-that were used when the pattern was compiled. If this is not the case, the
-behaviour of \fBpcre_exec()\fP is undefined. Therefore, when a pattern is
-compiled and matched in the same process, this field should never be set. In
-this (the most common) case, the correct table pointer is automatically passed
-with the compiled pattern from \fBpcre_compile()\fP to \fBpcre_exec()\fP.
-.P
-If PCRE_EXTRA_MARK is set in the \fIflags\fP field, the \fImark\fP field must
-be set to point to a suitable variable. If the pattern contains any
-backtracking control verbs such as (*MARK:NAME), and the execution ends up with
-a name to pass back, a pointer to the name string (zero terminated) is placed
-in the variable pointed to by the \fImark\fP field. The names are within the
-compiled pattern; if you wish to retain such a name you must copy it before
-freeing the memory of a compiled pattern. If there is no name to pass back, the
-variable pointed to by the \fImark\fP field is set to NULL. For details of the
-backtracking control verbs, see the section entitled
-.\" HTML <a href="pcrepattern#backtrackcontrol">
-.\" </a>
-"Backtracking control"
-.\"
-in the
-.\" HREF
-\fBpcrepattern\fP
-.\"
-documentation.
-.
-.
-.\" HTML <a name="execoptions"></a>
-.SS "Option bits for \fBpcre_exec()\fP"
-.rs
-.sp
-The unused bits of the \fIoptions\fP argument for \fBpcre_exec()\fP must be
-zero. The only bits that may be set are PCRE_ANCHORED, PCRE_NEWLINE_\fIxxx\fP,
-PCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY, PCRE_NOTEMPTY_ATSTART,
-PCRE_NO_START_OPTIMIZE, PCRE_NO_UTF8_CHECK, PCRE_PARTIAL_HARD, and
-PCRE_PARTIAL_SOFT.
-.P
-If the pattern was successfully studied with one of the just-in-time (JIT)
-compile options, the only supported options for JIT execution are
-PCRE_NO_UTF8_CHECK, PCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY,
-PCRE_NOTEMPTY_ATSTART, PCRE_PARTIAL_HARD, and PCRE_PARTIAL_SOFT. If an
-unsupported option is used, JIT execution is disabled and the normal
-interpretive code in \fBpcre_exec()\fP is run.
-.sp
-  PCRE_ANCHORED
-.sp
-The PCRE_ANCHORED option limits \fBpcre_exec()\fP to matching at the first
-matching position. If a pattern was compiled with PCRE_ANCHORED, or turned out
-to be anchored by virtue of its contents, it cannot be made unachored at
-matching time.
-.sp
-  PCRE_BSR_ANYCRLF
-  PCRE_BSR_UNICODE
-.sp
-These options (which are mutually exclusive) control what the \eR escape
-sequence matches. The choice is either to match only CR, LF, or CRLF, or to
-match any Unicode newline sequence. These options override the choice that was
-made or defaulted when the pattern was compiled.
-.sp
-  PCRE_NEWLINE_CR
-  PCRE_NEWLINE_LF
-  PCRE_NEWLINE_CRLF
-  PCRE_NEWLINE_ANYCRLF
-  PCRE_NEWLINE_ANY
-.sp
-These options override the newline definition that was chosen or defaulted when
-the pattern was compiled. For details, see the description of
-\fBpcre_compile()\fP above. During matching, the newline choice affects the
-behaviour of the dot, circumflex, and dollar metacharacters. It may also alter
-the way the match position is advanced after a match failure for an unanchored
-pattern.
-.P
-When PCRE_NEWLINE_CRLF, PCRE_NEWLINE_ANYCRLF, or PCRE_NEWLINE_ANY is set, and a
-match attempt for an unanchored pattern fails when the current position is at a
-CRLF sequence, and the pattern contains no explicit matches for CR or LF
-characters, the match position is advanced by two characters instead of one, in
-other words, to after the CRLF.
-.P
-The above rule is a compromise that makes the most common cases work as
-expected. For example, if the pattern is .+A (and the PCRE_DOTALL option is not
-set), it does not match the string "\er\enA" because, after failing at the
-start, it skips both the CR and the LF before retrying. However, the pattern
-[\er\en]A does match that string, because it contains an explicit CR or LF
-reference, and so advances only by one character after the first failure.
-.P
-An explicit match for CR of LF is either a literal appearance of one of those
-characters, or one of the \er or \en escape sequences. Implicit matches such as
-[^X] do not count, nor does \es (which includes CR and LF in the characters
-that it matches).
-.P
-Notwithstanding the above, anomalous effects may still occur when CRLF is a
-valid newline sequence and explicit \er or \en escapes appear in the pattern.
-.sp
-  PCRE_NOTBOL
-.sp
-This option specifies that first character of the subject string is not the
-beginning of a line, so the circumflex metacharacter should not match before
-it. Setting this without PCRE_MULTILINE (at compile time) causes circumflex
-never to match. This option affects only the behaviour of the circumflex
-metacharacter. It does not affect \eA.
-.sp
-  PCRE_NOTEOL
-.sp
-This option specifies that the end of the subject string is not the end of a
-line, so the dollar metacharacter should not match it nor (except in multiline
-mode) a newline immediately before it. Setting this without PCRE_MULTILINE (at
-compile time) causes dollar never to match. This option affects only the
-behaviour of the dollar metacharacter. It does not affect \eZ or \ez.
-.sp
-  PCRE_NOTEMPTY
-.sp
-An empty string is not considered to be a valid match if this option is set. If
-there are alternatives in the pattern, they are tried. If all the alternatives
-match the empty string, the entire match fails. For example, if the pattern
-.sp
-  a?b?
-.sp
-is applied to a string not beginning with "a" or "b", it matches an empty
-string at the start of the subject. With PCRE_NOTEMPTY set, this match is not
-valid, so PCRE searches further into the string for occurrences of "a" or "b".
-.sp
-  PCRE_NOTEMPTY_ATSTART
-.sp
-This is like PCRE_NOTEMPTY, except that an empty string match that is not at
-the start of the subject is permitted. If the pattern is anchored, such a match
-can occur only if the pattern contains \eK.
-.P
-Perl has no direct equivalent of PCRE_NOTEMPTY or PCRE_NOTEMPTY_ATSTART, but it
-does make a special case of a pattern match of the empty string within its
-\fBsplit()\fP function, and when using the /g modifier. It is possible to
-emulate Perl's behaviour after matching a null string by first trying the match
-again at the same offset with PCRE_NOTEMPTY_ATSTART and PCRE_ANCHORED, and then
-if that fails, by advancing the starting offset (see below) and trying an
-ordinary match again. There is some code that demonstrates how to do this in
-the
-.\" HREF
-\fBpcredemo\fP
-.\"
-sample program. In the most general case, you have to check to see if the
-newline convention recognizes CRLF as a newline, and if so, and the current
-character is CR followed by LF, advance the starting offset by two characters
-instead of one.
-.sp
-  PCRE_NO_START_OPTIMIZE
-.sp
-There are a number of optimizations that \fBpcre_exec()\fP uses at the start of
-a match, in order to speed up the process. For example, if it is known that an
-unanchored match must start with a specific character, it searches the subject
-for that character, and fails immediately if it cannot find it, without
-actually running the main matching function. This means that a special item
-such as (*COMMIT) at the start of a pattern is not considered until after a
-suitable starting point for the match has been found. Also, when callouts or
-(*MARK) items are in use, these "start-up" optimizations can cause them to be
-skipped if the pattern is never actually used. The start-up optimizations are
-in effect a pre-scan of the subject that takes place before the pattern is run.
-.P
-The PCRE_NO_START_OPTIMIZE option disables the start-up optimizations, possibly
-causing performance to suffer, but ensuring that in cases where the result is
-"no match", the callouts do occur, and that items such as (*COMMIT) and (*MARK)
-are considered at every possible starting position in the subject string. If
-PCRE_NO_START_OPTIMIZE is set at compile time, it cannot be unset at matching
-time. The use of PCRE_NO_START_OPTIMIZE at matching time (that is, passing it
-to \fBpcre_exec()\fP) disables JIT execution; in this situation, matching is
-always done using interpretively.
-.P
-Setting PCRE_NO_START_OPTIMIZE can change the outcome of a matching operation.
-Consider the pattern
-.sp
-  (*COMMIT)ABC
-.sp
-When this is compiled, PCRE records the fact that a match must start with the
-character "A". Suppose the subject string is "DEFABC". The start-up
-optimization scans along the subject, finds "A" and runs the first match
-attempt from there. The (*COMMIT) item means that the pattern must match the
-current starting position, which in this case, it does. However, if the same
-match is run with PCRE_NO_START_OPTIMIZE set, the initial scan along the
-subject string does not happen. The first match attempt is run starting from
-"D" and when this fails, (*COMMIT) prevents any further matches being tried, so
-the overall result is "no match". If the pattern is studied, more start-up
-optimizations may be used. For example, a minimum length for the subject may be
-recorded. Consider the pattern
-.sp
-  (*MARK:A)(X|Y)
-.sp
-The minimum length for a match is one character. If the subject is "ABC", there
-will be attempts to match "ABC", "BC", "C", and then finally an empty string.
-If the pattern is studied, the final attempt does not take place, because PCRE
-knows that the subject is too short, and so the (*MARK) is never encountered.
-In this case, studying the pattern does not affect the overall match result,
-which is still "no match", but it does affect the auxiliary information that is
-returned.
-.sp
-  PCRE_NO_UTF8_CHECK
-.sp
-When PCRE_UTF8 is set at compile time, the validity of the subject as a UTF-8
-string is automatically checked when \fBpcre_exec()\fP is subsequently called.
-The entire string is checked before any other processing takes place. The value
-of \fIstartoffset\fP is also checked to ensure that it points to the start of a
-UTF-8 character. There is a discussion about the
-.\" HTML <a href="pcreunicode.html#utf8strings">
-.\" </a>
-validity of UTF-8 strings
-.\"
-in the
-.\" HREF
-\fBpcreunicode\fP
-.\"
-page. If an invalid sequence of bytes is found, \fBpcre_exec()\fP returns the
-error PCRE_ERROR_BADUTF8 or, if PCRE_PARTIAL_HARD is set and the problem is a
-truncated character at the end of the subject, PCRE_ERROR_SHORTUTF8. In both
-cases, information about the precise nature of the error may also be returned
-(see the descriptions of these errors in the section entitled \fIError return
-values from\fP \fBpcre_exec()\fP
-.\" HTML <a href="#errorlist">
-.\" </a>
-below).
-.\"
-If \fIstartoffset\fP contains a value that does not point to the start of a
-UTF-8 character (or to the end of the subject), PCRE_ERROR_BADUTF8_OFFSET is
-returned.
-.P
-If you already know that your subject is valid, and you want to skip these
-checks for performance reasons, you can set the PCRE_NO_UTF8_CHECK option when
-calling \fBpcre_exec()\fP. You might want to do this for the second and
-subsequent calls to \fBpcre_exec()\fP if you are making repeated calls to find
-all the matches in a single subject string. However, you should be sure that
-the value of \fIstartoffset\fP points to the start of a character (or the end
-of the subject). When PCRE_NO_UTF8_CHECK is set, the effect of passing an
-invalid string as a subject or an invalid value of \fIstartoffset\fP is
-undefined. Your program may crash or loop.
-.sp
-  PCRE_PARTIAL_HARD
-  PCRE_PARTIAL_SOFT
-.sp
-These options turn on the partial matching feature. For backwards
-compatibility, PCRE_PARTIAL is a synonym for PCRE_PARTIAL_SOFT. A partial match
-occurs if the end of the subject string is reached successfully, but there are
-not enough subject characters to complete the match. If this happens when
-PCRE_PARTIAL_SOFT (but not PCRE_PARTIAL_HARD) is set, matching continues by
-testing any remaining alternatives. Only if no complete match can be found is
-PCRE_ERROR_PARTIAL returned instead of PCRE_ERROR_NOMATCH. In other words,
-PCRE_PARTIAL_SOFT says that the caller is prepared to handle a partial match,
-but only if no complete match can be found.
-.P
-If PCRE_PARTIAL_HARD is set, it overrides PCRE_PARTIAL_SOFT. In this case, if a
-partial match is found, \fBpcre_exec()\fP immediately returns
-PCRE_ERROR_PARTIAL, without considering any other alternatives. In other words,
-when PCRE_PARTIAL_HARD is set, a partial match is considered to be more
-important that an alternative complete match.
-.P
-In both cases, the portion of the string that was inspected when the partial
-match was found is set as the first matching string. There is a more detailed
-discussion of partial and multi-segment matching, with examples, in the
-.\" HREF
-\fBpcrepartial\fP
-.\"
-documentation.
-.
-.
-.SS "The string to be matched by \fBpcre_exec()\fP"
-.rs
-.sp
-The subject string is passed to \fBpcre_exec()\fP as a pointer in
-\fIsubject\fP, a length in \fIlength\fP, and a starting offset in
-\fIstartoffset\fP. The units for \fIlength\fP and \fIstartoffset\fP are bytes
-for the 8-bit library, 16-bit data items for the 16-bit library, and 32-bit
-data items for the 32-bit library.
-.P
-If \fIstartoffset\fP is negative or greater than the length of the subject,
-\fBpcre_exec()\fP returns PCRE_ERROR_BADOFFSET. When the starting offset is
-zero, the search for a match starts at the beginning of the subject, and this
-is by far the most common case. In UTF-8 or UTF-16 mode, the offset must point
-to the start of a character, or the end of the subject (in UTF-32 mode, one
-data unit equals one character, so all offsets are valid). Unlike the pattern
-string, the subject may contain binary zeroes.
-.P
-A non-zero starting offset is useful when searching for another match in the
-same subject by calling \fBpcre_exec()\fP again after a previous success.
-Setting \fIstartoffset\fP differs from just passing over a shortened string and
-setting PCRE_NOTBOL in the case of a pattern that begins with any kind of
-lookbehind. For example, consider the pattern
-.sp
-  \eBiss\eB
-.sp
-which finds occurrences of "iss" in the middle of words. (\eB matches only if
-the current position in the subject is not a word boundary.) When applied to
-the string "Mississipi" the first call to \fBpcre_exec()\fP finds the first
-occurrence. If \fBpcre_exec()\fP is called again with just the remainder of the
-subject, namely "issipi", it does not match, because \eB is always false at the
-start of the subject, which is deemed to be a word boundary. However, if
-\fBpcre_exec()\fP is passed the entire string again, but with \fIstartoffset\fP
-set to 4, it finds the second occurrence of "iss" because it is able to look
-behind the starting point to discover that it is preceded by a letter.
-.P
-Finding all the matches in a subject is tricky when the pattern can match an
-empty string. It is possible to emulate Perl's /g behaviour by first trying the
-match again at the same offset, with the PCRE_NOTEMPTY_ATSTART and
-PCRE_ANCHORED options, and then if that fails, advancing the starting offset
-and trying an ordinary match again. There is some code that demonstrates how to
-do this in the
-.\" HREF
-\fBpcredemo\fP
-.\"
-sample program. In the most general case, you have to check to see if the
-newline convention recognizes CRLF as a newline, and if so, and the current
-character is CR followed by LF, advance the starting offset by two characters
-instead of one.
-.P
-If a non-zero starting offset is passed when the pattern is anchored, one
-attempt to match at the given offset is made. This can only succeed if the
-pattern does not require the match to be at the start of the subject.
-.
-.
-.SS "How \fBpcre_exec()\fP returns captured substrings"
-.rs
-.sp
-In general, a pattern matches a certain portion of the subject, and in
-addition, further substrings from the subject may be picked out by parts of the
-pattern. Following the usage in Jeffrey Friedl's book, this is called
-"capturing" in what follows, and the phrase "capturing subpattern" is used for
-a fragment of a pattern that picks out a substring. PCRE supports several other
-kinds of parenthesized subpattern that do not cause substrings to be captured.
-.P
-Captured substrings are returned to the caller via a vector of integers whose
-address is passed in \fIovector\fP. The number of elements in the vector is
-passed in \fIovecsize\fP, which must be a non-negative number. \fBNote\fP: this
-argument is NOT the size of \fIovector\fP in bytes.
-.P
-The first two-thirds of the vector is used to pass back captured substrings,
-each substring using a pair of integers. The remaining third of the vector is
-used as workspace by \fBpcre_exec()\fP while matching capturing subpatterns,
-and is not available for passing back information. The number passed in
-\fIovecsize\fP should always be a multiple of three. If it is not, it is
-rounded down.
-.P
-When a match is successful, information about captured substrings is returned
-in pairs of integers, starting at the beginning of \fIovector\fP, and
-continuing up to two-thirds of its length at the most. The first element of
-each pair is set to the offset of the first character in a substring, and the
-second is set to the offset of the first character after the end of a
-substring. These values are always data unit offsets, even in UTF mode. They
-are byte offsets in the 8-bit library, 16-bit data item offsets in the 16-bit
-library, and 32-bit data item offsets in the 32-bit library. \fBNote\fP: they
-are not character counts.
-.P
-The first pair of integers, \fIovector[0]\fP and \fIovector[1]\fP, identify the
-portion of the subject string matched by the entire pattern. The next pair is
-used for the first capturing subpattern, and so on. The value returned by
-\fBpcre_exec()\fP is one more than the highest numbered pair that has been set.
-For example, if two substrings have been captured, the returned value is 3. If
-there are no capturing subpatterns, the return value from a successful match is
-1, indicating that just the first pair of offsets has been set.
-.P
-If a capturing subpattern is matched repeatedly, it is the last portion of the
-string that it matched that is returned.
-.P
-If the vector is too small to hold all the captured substring offsets, it is
-used as far as possible (up to two-thirds of its length), and the function
-returns a value of zero. If neither the actual string matched nor any captured
-substrings are of interest, \fBpcre_exec()\fP may be called with \fIovector\fP
-passed as NULL and \fIovecsize\fP as zero. However, if the pattern contains
-back references and the \fIovector\fP is not big enough to remember the related
-substrings, PCRE has to get additional memory for use during matching. Thus it
-is usually advisable to supply an \fIovector\fP of reasonable size.
-.P
-There are some cases where zero is returned (indicating vector overflow) when
-in fact the vector is exactly the right size for the final match. For example,
-consider the pattern
-.sp
-  (a)(?:(b)c|bd)
-.sp
-If a vector of 6 elements (allowing for only 1 captured substring) is given
-with subject string "abd", \fBpcre_exec()\fP will try to set the second
-captured string, thereby recording a vector overflow, before failing to match
-"c" and backing up to try the second alternative. The zero return, however,
-does correctly indicate that the maximum number of slots (namely 2) have been
-filled. In similar cases where there is temporary overflow, but the final
-number of used slots is actually less than the maximum, a non-zero value is
-returned.
-.P
-The \fBpcre_fullinfo()\fP function can be used to find out how many capturing
-subpatterns there are in a compiled pattern. The smallest size for
-\fIovector\fP that will allow for \fIn\fP captured substrings, in addition to
-the offsets of the substring matched by the whole pattern, is (\fIn\fP+1)*3.
-.P
-It is possible for capturing subpattern number \fIn+1\fP to match some part of
-the subject when subpattern \fIn\fP has not been used at all. For example, if
-the string "abc" is matched against the pattern (a|(z))(bc) the return from the
-function is 4, and subpatterns 1 and 3 are matched, but 2 is not. When this
-happens, both values in the offset pairs corresponding to unused subpatterns
-are set to -1.
-.P
-Offset values that correspond to unused subpatterns at the end of the
-expression are also set to -1. For example, if the string "abc" is matched
-against the pattern (abc)(x(yz)?)? subpatterns 2 and 3 are not matched. The
-return from the function is 2, because the highest used capturing subpattern
-number is 1, and the offsets for for the second and third capturing subpatterns
-(assuming the vector is large enough, of course) are set to -1.
-.P
-\fBNote\fP: Elements in the first two-thirds of \fIovector\fP that do not
-correspond to capturing parentheses in the pattern are never changed. That is,
-if a pattern contains \fIn\fP capturing parentheses, no more than
-\fIovector[0]\fP to \fIovector[2n+1]\fP are set by \fBpcre_exec()\fP. The other
-elements (in the first two-thirds) retain whatever values they previously had.
-.P
-Some convenience functions are provided for extracting the captured substrings
-as separate strings. These are described below.
-.
-.
-.\" HTML <a name="errorlist"></a>
-.SS "Error return values from \fBpcre_exec()\fP"
-.rs
-.sp
-If \fBpcre_exec()\fP fails, it returns a negative number. The following are
-defined in the header file:
-.sp
-  PCRE_ERROR_NOMATCH        (-1)
-.sp
-The subject string did not match the pattern.
-.sp
-  PCRE_ERROR_NULL           (-2)
-.sp
-Either \fIcode\fP or \fIsubject\fP was passed as NULL, or \fIovector\fP was
-NULL and \fIovecsize\fP was not zero.
-.sp
-  PCRE_ERROR_BADOPTION      (-3)
-.sp
-An unrecognized bit was set in the \fIoptions\fP argument.
-.sp
-  PCRE_ERROR_BADMAGIC       (-4)
-.sp
-PCRE stores a 4-byte "magic number" at the start of the compiled code, to catch
-the case when it is passed a junk pointer and to detect when a pattern that was
-compiled in an environment of one endianness is run in an environment with the
-other endianness. This is the error that PCRE gives when the magic number is
-not present.
-.sp
-  PCRE_ERROR_UNKNOWN_OPCODE (-5)
-.sp
-While running the pattern match, an unknown item was encountered in the
-compiled pattern. This error could be caused by a bug in PCRE or by overwriting
-of the compiled pattern.
-.sp
-  PCRE_ERROR_NOMEMORY       (-6)
-.sp
-If a pattern contains back references, but the \fIovector\fP that is passed to
-\fBpcre_exec()\fP is not big enough to remember the referenced substrings, PCRE
-gets a block of memory at the start of matching to use for this purpose. If the
-call via \fBpcre_malloc()\fP fails, this error is given. The memory is
-automatically freed at the end of matching.
-.P
-This error is also given if \fBpcre_stack_malloc()\fP fails in
-\fBpcre_exec()\fP. This can happen only when PCRE has been compiled with
-\fB--disable-stack-for-recursion\fP.
-.sp
-  PCRE_ERROR_NOSUBSTRING    (-7)
-.sp
-This error is used by the \fBpcre_copy_substring()\fP,
-\fBpcre_get_substring()\fP, and \fBpcre_get_substring_list()\fP functions (see
-below). It is never returned by \fBpcre_exec()\fP.
-.sp
-  PCRE_ERROR_MATCHLIMIT     (-8)
-.sp
-The backtracking limit, as specified by the \fImatch_limit\fP field in a
-\fBpcre_extra\fP structure (or defaulted) was reached. See the description
-above.
-.sp
-  PCRE_ERROR_CALLOUT        (-9)
-.sp
-This error is never generated by \fBpcre_exec()\fP itself. It is provided for
-use by callout functions that want to yield a distinctive error code. See the
-.\" HREF
-\fBpcrecallout\fP
-.\"
-documentation for details.
-.sp
-  PCRE_ERROR_BADUTF8        (-10)
-.sp
-A string that contains an invalid UTF-8 byte sequence was passed as a subject,
-and the PCRE_NO_UTF8_CHECK option was not set. If the size of the output vector
-(\fIovecsize\fP) is at least 2, the byte offset to the start of the the invalid
-UTF-8 character is placed in the first element, and a reason code is placed in
-the second element. The reason codes are listed in the
-.\" HTML <a href="#badutf8reasons">
-.\" </a>
-following section.
-.\"
-For backward compatibility, if PCRE_PARTIAL_HARD is set and the problem is a
-truncated UTF-8 character at the end of the subject (reason codes 1 to 5),
-PCRE_ERROR_SHORTUTF8 is returned instead of PCRE_ERROR_BADUTF8.
-.sp
-  PCRE_ERROR_BADUTF8_OFFSET (-11)
-.sp
-The UTF-8 byte sequence that was passed as a subject was checked and found to
-be valid (the PCRE_NO_UTF8_CHECK option was not set), but the value of
-\fIstartoffset\fP did not point to the beginning of a UTF-8 character or the
-end of the subject.
-.sp
-  PCRE_ERROR_PARTIAL        (-12)
-.sp
-The subject string did not match, but it did match partially. See the
-.\" HREF
-\fBpcrepartial\fP
-.\"
-documentation for details of partial matching.
-.sp
-  PCRE_ERROR_BADPARTIAL     (-13)
-.sp
-This code is no longer in use. It was formerly returned when the PCRE_PARTIAL
-option was used with a compiled pattern containing items that were not
-supported for partial matching. From release 8.00 onwards, there are no
-restrictions on partial matching.
-.sp
-  PCRE_ERROR_INTERNAL       (-14)
-.sp
-An unexpected internal error has occurred. This error could be caused by a bug
-in PCRE or by overwriting of the compiled pattern.
-.sp
-  PCRE_ERROR_BADCOUNT       (-15)
-.sp
-This error is given if the value of the \fIovecsize\fP argument is negative.
-.sp
-  PCRE_ERROR_RECURSIONLIMIT (-21)
-.sp
-The internal recursion limit, as specified by the \fImatch_limit_recursion\fP
-field in a \fBpcre_extra\fP structure (or defaulted) was reached. See the
-description above.
-.sp
-  PCRE_ERROR_BADNEWLINE     (-23)
-.sp
-An invalid combination of PCRE_NEWLINE_\fIxxx\fP options was given.
-.sp
-  PCRE_ERROR_BADOFFSET      (-24)
-.sp
-The value of \fIstartoffset\fP was negative or greater than the length of the
-subject, that is, the value in \fIlength\fP.
-.sp
-  PCRE_ERROR_SHORTUTF8      (-25)
-.sp
-This error is returned instead of PCRE_ERROR_BADUTF8 when the subject string
-ends with a truncated UTF-8 character and the PCRE_PARTIAL_HARD option is set.
-Information about the failure is returned as for PCRE_ERROR_BADUTF8. It is in
-fact sufficient to detect this case, but this special error code for
-PCRE_PARTIAL_HARD precedes the implementation of returned information; it is
-retained for backwards compatibility.
-.sp
-  PCRE_ERROR_RECURSELOOP    (-26)
-.sp
-This error is returned when \fBpcre_exec()\fP detects a recursion loop within
-the pattern. Specifically, it means that either the whole pattern or a
-subpattern has been called recursively for the second time at the same position
-in the subject string. Some simple patterns that might do this are detected and
-faulted at compile time, but more complicated cases, in particular mutual
-recursions between two different subpatterns, cannot be detected until run
-time.
-.sp
-  PCRE_ERROR_JIT_STACKLIMIT (-27)
-.sp
-This error is returned when a pattern that was successfully studied using a
-JIT compile option is being matched, but the memory available for the
-just-in-time processing stack is not large enough. See the
-.\" HREF
-\fBpcrejit\fP
-.\"
-documentation for more details.
-.sp
-  PCRE_ERROR_BADMODE        (-28)
-.sp
-This error is given if a pattern that was compiled by the 8-bit library is
-passed to a 16-bit or 32-bit library function, or vice versa.
-.sp
-  PCRE_ERROR_BADENDIANNESS  (-29)
-.sp
-This error is given if a pattern that was compiled and saved is reloaded on a
-host with different endianness. The utility function
-\fBpcre_pattern_to_host_byte_order()\fP can be used to convert such a pattern
-so that it runs on the new host.
-.sp
-  PCRE_ERROR_JIT_BADOPTION
-.sp
-This error is returned when a pattern that was successfully studied using a JIT
-compile option is being matched, but the matching mode (partial or complete
-match) does not correspond to any JIT compilation mode. When the JIT fast path
-function is used, this error may be also given for invalid options. See the
-.\" HREF
-\fBpcrejit\fP
-.\"
-documentation for more details.
-.sp
-  PCRE_ERROR_BADLENGTH      (-32)
-.sp
-This error is given if \fBpcre_exec()\fP is called with a negative value for
-the \fIlength\fP argument.
-.P
-Error numbers -16 to -20, -22, and 30 are not used by \fBpcre_exec()\fP.
-.
-.
-.\" HTML <a name="badutf8reasons"></a>
-.SS "Reason codes for invalid UTF-8 strings"
-.rs
-.sp
-This section applies only to the 8-bit library. The corresponding information
-for the 16-bit and 32-bit libraries is given in the
-.\" HREF
-\fBpcre16\fP
-.\"
-and
-.\" HREF
-\fBpcre32\fP
-.\"
-pages.
-.P
-When \fBpcre_exec()\fP returns either PCRE_ERROR_BADUTF8 or
-PCRE_ERROR_SHORTUTF8, and the size of the output vector (\fIovecsize\fP) is at
-least 2, the offset of the start of the invalid UTF-8 character is placed in
-the first output vector element (\fIovector[0]\fP) and a reason code is placed
-in the second element (\fIovector[1]\fP). The reason codes are given names in
-the \fBpcre.h\fP header file:
-.sp
-  PCRE_UTF8_ERR1
-  PCRE_UTF8_ERR2
-  PCRE_UTF8_ERR3
-  PCRE_UTF8_ERR4
-  PCRE_UTF8_ERR5
-.sp
-The string ends with a truncated UTF-8 character; the code specifies how many
-bytes are missing (1 to 5). Although RFC 3629 restricts UTF-8 characters to be
-no longer than 4 bytes, the encoding scheme (originally defined by RFC 2279)
-allows for up to 6 bytes, and this is checked first; hence the possibility of
-4 or 5 missing bytes.
-.sp
-  PCRE_UTF8_ERR6
-  PCRE_UTF8_ERR7
-  PCRE_UTF8_ERR8
-  PCRE_UTF8_ERR9
-  PCRE_UTF8_ERR10
-.sp
-The two most significant bits of the 2nd, 3rd, 4th, 5th, or 6th byte of the
-character do not have the binary value 0b10 (that is, either the most
-significant bit is 0, or the next bit is 1).
-.sp
-  PCRE_UTF8_ERR11
-  PCRE_UTF8_ERR12
-.sp
-A character that is valid by the RFC 2279 rules is either 5 or 6 bytes long;
-these code points are excluded by RFC 3629.
-.sp
-  PCRE_UTF8_ERR13
-.sp
-A 4-byte character has a value greater than 0x10fff; these code points are
-excluded by RFC 3629.
-.sp
-  PCRE_UTF8_ERR14
-.sp
-A 3-byte character has a value in the range 0xd800 to 0xdfff; this range of
-code points are reserved by RFC 3629 for use with UTF-16, and so are excluded
-from UTF-8.
-.sp
-  PCRE_UTF8_ERR15
-  PCRE_UTF8_ERR16
-  PCRE_UTF8_ERR17
-  PCRE_UTF8_ERR18
-  PCRE_UTF8_ERR19
-.sp
-A 2-, 3-, 4-, 5-, or 6-byte character is "overlong", that is, it codes for a
-value that can be represented by fewer bytes, which is invalid. For example,
-the two bytes 0xc0, 0xae give the value 0x2e, whose correct coding uses just
-one byte.
-.sp
-  PCRE_UTF8_ERR20
-.sp
-The two most significant bits of the first byte of a character have the binary
-value 0b10 (that is, the most significant bit is 1 and the second is 0). Such a
-byte can only validly occur as the second or subsequent byte of a multi-byte
-character.
-.sp
-  PCRE_UTF8_ERR21
-.sp
-The first byte of a character has the value 0xfe or 0xff. These values can
-never occur in a valid UTF-8 string.
-.sp
-  PCRE_UTF8_ERR22
-.sp
-This error code was formerly used when the presence of a so-called
-"non-character" caused an error. Unicode corrigendum #9 makes it clear that
-such characters should not cause a string to be rejected, and so this code is
-no longer in use and is never returned.
-.
-.
-.SH "EXTRACTING CAPTURED SUBSTRINGS BY NUMBER"
-.rs
-.sp
-.nf
-.B int pcre_copy_substring(const char *\fIsubject\fP, int *\fIovector\fP,
-.B "     int \fIstringcount\fP, int \fIstringnumber\fP, char *\fIbuffer\fP,"
-.B "     int \fIbuffersize\fP);"
-.sp
-.B int pcre_get_substring(const char *\fIsubject\fP, int *\fIovector\fP,
-.B "     int \fIstringcount\fP, int \fIstringnumber\fP,"
-.B "     const char **\fIstringptr\fP);"
-.sp
-.B int pcre_get_substring_list(const char *\fIsubject\fP,
-.B "     int *\fIovector\fP, int \fIstringcount\fP, const char ***\fIlistptr\fP);"
-.fi
-.PP
-Captured substrings can be accessed directly by using the offsets returned by
-\fBpcre_exec()\fP in \fIovector\fP. For convenience, the functions
-\fBpcre_copy_substring()\fP, \fBpcre_get_substring()\fP, and
-\fBpcre_get_substring_list()\fP are provided for extracting captured substrings
-as new, separate, zero-terminated strings. These functions identify substrings
-by number. The next section describes functions for extracting named
-substrings.
-.P
-A substring that contains a binary zero is correctly extracted and has a
-further zero added on the end, but the result is not, of course, a C string.
-However, you can process such a string by referring to the length that is
-returned by \fBpcre_copy_substring()\fP and \fBpcre_get_substring()\fP.
-Unfortunately, the interface to \fBpcre_get_substring_list()\fP is not adequate
-for handling strings containing binary zeros, because the end of the final
-string is not independently indicated.
-.P
-The first three arguments are the same for all three of these functions:
-\fIsubject\fP is the subject string that has just been successfully matched,
-\fIovector\fP is a pointer to the vector of integer offsets that was passed to
-\fBpcre_exec()\fP, and \fIstringcount\fP is the number of substrings that were
-captured by the match, including the substring that matched the entire regular
-expression. This is the value returned by \fBpcre_exec()\fP if it is greater
-than zero. If \fBpcre_exec()\fP returned zero, indicating that it ran out of
-space in \fIovector\fP, the value passed as \fIstringcount\fP should be the
-number of elements in the vector divided by three.
-.P
-The functions \fBpcre_copy_substring()\fP and \fBpcre_get_substring()\fP
-extract a single substring, whose number is given as \fIstringnumber\fP. A
-value of zero extracts the substring that matched the entire pattern, whereas
-higher values extract the captured substrings. For \fBpcre_copy_substring()\fP,
-the string is placed in \fIbuffer\fP, whose length is given by
-\fIbuffersize\fP, while for \fBpcre_get_substring()\fP a new block of memory is
-obtained via \fBpcre_malloc\fP, and its address is returned via
-\fIstringptr\fP. The yield of the function is the length of the string, not
-including the terminating zero, or one of these error codes:
-.sp
-  PCRE_ERROR_NOMEMORY       (-6)
-.sp
-The buffer was too small for \fBpcre_copy_substring()\fP, or the attempt to get
-memory failed for \fBpcre_get_substring()\fP.
-.sp
-  PCRE_ERROR_NOSUBSTRING    (-7)
-.sp
-There is no substring whose number is \fIstringnumber\fP.
-.P
-The \fBpcre_get_substring_list()\fP function extracts all available substrings
-and builds a list of pointers to them. All this is done in a single block of
-memory that is obtained via \fBpcre_malloc\fP. The address of the memory block
-is returned via \fIlistptr\fP, which is also the start of the list of string
-pointers. The end of the list is marked by a NULL pointer. The yield of the
-function is zero if all went well, or the error code
-.sp
-  PCRE_ERROR_NOMEMORY       (-6)
-.sp
-if the attempt to get the memory block failed.
-.P
-When any of these functions encounter a substring that is unset, which can
-happen when capturing subpattern number \fIn+1\fP matches some part of the
-subject, but subpattern \fIn\fP has not been used at all, they return an empty
-string. This can be distinguished from a genuine zero-length substring by
-inspecting the appropriate offset in \fIovector\fP, which is negative for unset
-substrings.
-.P
-The two convenience functions \fBpcre_free_substring()\fP and
-\fBpcre_free_substring_list()\fP can be used to free the memory returned by
-a previous call of \fBpcre_get_substring()\fP or
-\fBpcre_get_substring_list()\fP, respectively. They do nothing more than call
-the function pointed to by \fBpcre_free\fP, which of course could be called
-directly from a C program. However, PCRE is used in some situations where it is
-linked via a special interface to another programming language that cannot use
-\fBpcre_free\fP directly; it is for these cases that the functions are
-provided.
-.
-.
-.SH "EXTRACTING CAPTURED SUBSTRINGS BY NAME"
-.rs
-.sp
-.nf
-.B int pcre_get_stringnumber(const pcre *\fIcode\fP,
-.B "     const char *\fIname\fP);"
-.sp
-.B int pcre_copy_named_substring(const pcre *\fIcode\fP,
-.B "     const char *\fIsubject\fP, int *\fIovector\fP,"
-.B "     int \fIstringcount\fP, const char *\fIstringname\fP,"
-.B "     char *\fIbuffer\fP, int \fIbuffersize\fP);"
-.sp
-.B int pcre_get_named_substring(const pcre *\fIcode\fP,
-.B "     const char *\fIsubject\fP, int *\fIovector\fP,"
-.B "     int \fIstringcount\fP, const char *\fIstringname\fP,"
-.B "     const char **\fIstringptr\fP);"
-.fi
-.PP
-To extract a substring by name, you first have to find associated number.
-For example, for this pattern
-.sp
-  (a+)b(?<xxx>\ed+)...
-.sp
-the number of the subpattern called "xxx" is 2. If the name is known to be
-unique (PCRE_DUPNAMES was not set), you can find the number from the name by
-calling \fBpcre_get_stringnumber()\fP. The first argument is the compiled
-pattern, and the second is the name. The yield of the function is the
-subpattern number, or PCRE_ERROR_NOSUBSTRING (-7) if there is no subpattern of
-that name.
-.P
-Given the number, you can extract the substring directly, or use one of the
-functions described in the previous section. For convenience, there are also
-two functions that do the whole job.
-.P
-Most of the arguments of \fBpcre_copy_named_substring()\fP and
-\fBpcre_get_named_substring()\fP are the same as those for the similarly named
-functions that extract by number. As these are described in the previous
-section, they are not re-described here. There are just two differences:
-.P
-First, instead of a substring number, a substring name is given. Second, there
-is an extra argument, given at the start, which is a pointer to the compiled
-pattern. This is needed in order to gain access to the name-to-number
-translation table.
-.P
-These functions call \fBpcre_get_stringnumber()\fP, and if it succeeds, they
-then call \fBpcre_copy_substring()\fP or \fBpcre_get_substring()\fP, as
-appropriate. \fBNOTE:\fP If PCRE_DUPNAMES is set and there are duplicate names,
-the behaviour may not be what you want (see the next section).
-.P
-\fBWarning:\fP If the pattern uses the (?| feature to set up multiple
-subpatterns with the same number, as described in the
-.\" HTML <a href="pcrepattern.html#dupsubpatternnumber">
-.\" </a>
-section on duplicate subpattern numbers
-.\"
-in the
-.\" HREF
-\fBpcrepattern\fP
-.\"
-page, you cannot use names to distinguish the different subpatterns, because
-names are not included in the compiled code. The matching process uses only
-numbers. For this reason, the use of different names for subpatterns of the
-same number causes an error at compile time.
-.
-.
-.SH "DUPLICATE SUBPATTERN NAMES"
-.rs
-.sp
-.nf
-.B int pcre_get_stringtable_entries(const pcre *\fIcode\fP,
-.B "     const char *\fIname\fP, char **\fIfirst\fP, char **\fIlast\fP);"
-.fi
-.PP
-When a pattern is compiled with the PCRE_DUPNAMES option, names for subpatterns
-are not required to be unique. (Duplicate names are always allowed for
-subpatterns with the same number, created by using the (?| feature. Indeed, if
-such subpatterns are named, they are required to use the same names.)
-.P
-Normally, patterns with duplicate names are such that in any one match, only
-one of the named subpatterns participates. An example is shown in the
-.\" HREF
-\fBpcrepattern\fP
-.\"
-documentation.
-.P
-When duplicates are present, \fBpcre_copy_named_substring()\fP and
-\fBpcre_get_named_substring()\fP return the first substring corresponding to
-the given name that is set. If none are set, PCRE_ERROR_NOSUBSTRING (-7) is
-returned; no data is returned. The \fBpcre_get_stringnumber()\fP function
-returns one of the numbers that are associated with the name, but it is not
-defined which it is.
-.P
-If you want to get full details of all captured substrings for a given name,
-you must use the \fBpcre_get_stringtable_entries()\fP function. The first
-argument is the compiled pattern, and the second is the name. The third and
-fourth are pointers to variables which are updated by the function. After it
-has run, they point to the first and last entries in the name-to-number table
-for the given name. The function itself returns the length of each entry, or
-PCRE_ERROR_NOSUBSTRING (-7) if there are none. The format of the table is
-described above in the section entitled \fIInformation about a pattern\fP
-.\" HTML <a href="#infoaboutpattern">
-.\" </a>
-above.
-.\"
-Given all the relevant entries for the name, you can extract each of their
-numbers, and hence the captured data, if any.
-.
-.
-.SH "FINDING ALL POSSIBLE MATCHES"
-.rs
-.sp
-The traditional matching function uses a similar algorithm to Perl, which stops
-when it finds the first match, starting at a given point in the subject. If you
-want to find all possible matches, or the longest possible match, consider
-using the alternative matching function (see below) instead. If you cannot use
-the alternative function, but still need to find all possible matches, you
-can kludge it up by making use of the callout facility, which is described in
-the
-.\" HREF
-\fBpcrecallout\fP
-.\"
-documentation.
-.P
-What you have to do is to insert a callout right at the end of the pattern.
-When your callout function is called, extract and save the current matched
-substring. Then return 1, which forces \fBpcre_exec()\fP to backtrack and try
-other alternatives. Ultimately, when it runs out of matches, \fBpcre_exec()\fP
-will yield PCRE_ERROR_NOMATCH.
-.
-.
-.SH "OBTAINING AN ESTIMATE OF STACK USAGE"
-.rs
-.sp
-Matching certain patterns using \fBpcre_exec()\fP can use a lot of process
-stack, which in certain environments can be rather limited in size. Some users
-find it helpful to have an estimate of the amount of stack that is used by
-\fBpcre_exec()\fP, to help them set recursion limits, as described in the
-.\" HREF
-\fBpcrestack\fP
-.\"
-documentation. The estimate that is output by \fBpcretest\fP when called with
-the \fB-m\fP and \fB-C\fP options is obtained by calling \fBpcre_exec\fP with
-the values NULL, NULL, NULL, -999, and -999 for its first five arguments.
-.P
-Normally, if its first argument is NULL, \fBpcre_exec()\fP immediately returns
-the negative error code PCRE_ERROR_NULL, but with this special combination of
-arguments, it returns instead a negative number whose absolute value is the
-approximate stack frame size in bytes. (A negative number is used so that it is
-clear that no match has happened.) The value is approximate because in some
-cases, recursive calls to \fBpcre_exec()\fP occur when there are one or two
-additional variables on the stack.
-.P
-If PCRE has been compiled to use the heap instead of the stack for recursion,
-the value returned is the size of each block that is obtained from the heap.
-.
-.
-.\" HTML <a name="dfamatch"></a>
-.SH "MATCHING A PATTERN: THE ALTERNATIVE FUNCTION"
-.rs
-.sp
-.nf
-.B int pcre_dfa_exec(const pcre *\fIcode\fP, "const pcre_extra *\fIextra\fP,"
-.B "     const char *\fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP,"
-.B "     int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP,"
-.B "     int *\fIworkspace\fP, int \fIwscount\fP);"
-.fi
-.P
-The function \fBpcre_dfa_exec()\fP is called to match a subject string against
-a compiled pattern, using a matching algorithm that scans the subject string
-just once, and does not backtrack. This has different characteristics to the
-normal algorithm, and is not compatible with Perl. Some of the features of PCRE
-patterns are not supported. Nevertheless, there are times when this kind of
-matching can be useful. For a discussion of the two matching algorithms, and a
-list of features that \fBpcre_dfa_exec()\fP does not support, see the
-.\" HREF
-\fBpcrematching\fP
-.\"
-documentation.
-.P
-The arguments for the \fBpcre_dfa_exec()\fP function are the same as for
-\fBpcre_exec()\fP, plus two extras. The \fIovector\fP argument is used in a
-different way, and this is described below. The other common arguments are used
-in the same way as for \fBpcre_exec()\fP, so their description is not repeated
-here.
-.P
-The two additional arguments provide workspace for the function. The workspace
-vector should contain at least 20 elements. It is used for keeping track of
-multiple paths through the pattern tree. More workspace will be needed for
-patterns and subjects where there are a lot of potential matches.
-.P
-Here is an example of a simple call to \fBpcre_dfa_exec()\fP:
-.sp
-  int rc;
-  int ovector[10];
-  int wspace[20];
-  rc = pcre_dfa_exec(
-    re,             /* result of pcre_compile() */
-    NULL,           /* we didn't study the pattern */
-    "some string",  /* the subject string */
-    11,             /* the length of the subject string */
-    0,              /* start at offset 0 in the subject */
-    0,              /* default options */
-    ovector,        /* vector of integers for substring information */
-    10,             /* number of elements (NOT size in bytes) */
-    wspace,         /* working space vector */
-    20);            /* number of elements (NOT size in bytes) */
-.
-.SS "Option bits for \fBpcre_dfa_exec()\fP"
-.rs
-.sp
-The unused bits of the \fIoptions\fP argument for \fBpcre_dfa_exec()\fP must be
-zero. The only bits that may be set are PCRE_ANCHORED, PCRE_NEWLINE_\fIxxx\fP,
-PCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY, PCRE_NOTEMPTY_ATSTART,
-PCRE_NO_UTF8_CHECK, PCRE_BSR_ANYCRLF, PCRE_BSR_UNICODE, PCRE_NO_START_OPTIMIZE,
-PCRE_PARTIAL_HARD, PCRE_PARTIAL_SOFT, PCRE_DFA_SHORTEST, and PCRE_DFA_RESTART.
-All but the last four of these are exactly the same as for \fBpcre_exec()\fP,
-so their description is not repeated here.
-.sp
-  PCRE_PARTIAL_HARD
-  PCRE_PARTIAL_SOFT
-.sp
-These have the same general effect as they do for \fBpcre_exec()\fP, but the
-details are slightly different. When PCRE_PARTIAL_HARD is set for
-\fBpcre_dfa_exec()\fP, it returns PCRE_ERROR_PARTIAL if the end of the subject
-is reached and there is still at least one matching possibility that requires
-additional characters. This happens even if some complete matches have also
-been found. When PCRE_PARTIAL_SOFT is set, the return code PCRE_ERROR_NOMATCH
-is converted into PCRE_ERROR_PARTIAL if the end of the subject is reached,
-there have been no complete matches, but there is still at least one matching
-possibility. The portion of the string that was inspected when the longest
-partial match was found is set as the first matching string in both cases.
-There is a more detailed discussion of partial and multi-segment matching, with
-examples, in the
-.\" HREF
-\fBpcrepartial\fP
-.\"
-documentation.
-.sp
-  PCRE_DFA_SHORTEST
-.sp
-Setting the PCRE_DFA_SHORTEST option causes the matching algorithm to stop as
-soon as it has found one match. Because of the way the alternative algorithm
-works, this is necessarily the shortest possible match at the first possible
-matching point in the subject string.
-.sp
-  PCRE_DFA_RESTART
-.sp
-When \fBpcre_dfa_exec()\fP returns a partial match, it is possible to call it
-again, with additional subject characters, and have it continue with the same
-match. The PCRE_DFA_RESTART option requests this action; when it is set, the
-\fIworkspace\fP and \fIwscount\fP options must reference the same vector as
-before because data about the match so far is left in them after a partial
-match. There is more discussion of this facility in the
-.\" HREF
-\fBpcrepartial\fP
-.\"
-documentation.
-.
-.
-.SS "Successful returns from \fBpcre_dfa_exec()\fP"
-.rs
-.sp
-When \fBpcre_dfa_exec()\fP succeeds, it may have matched more than one
-substring in the subject. Note, however, that all the matches from one run of
-the function start at the same point in the subject. The shorter matches are
-all initial substrings of the longer matches. For example, if the pattern
-.sp
-  <.*>
-.sp
-is matched against the string
-.sp
-  This is <something> <something else> <something further> no more
-.sp
-the three matched strings are
-.sp
-  <something>
-  <something> <something else>
-  <something> <something else> <something further>
-.sp
-On success, the yield of the function is a number greater than zero, which is
-the number of matched substrings. The substrings themselves are returned in
-\fIovector\fP. Each string uses two elements; the first is the offset to the
-start, and the second is the offset to the end. In fact, all the strings have
-the same start offset. (Space could have been saved by giving this only once,
-but it was decided to retain some compatibility with the way \fBpcre_exec()\fP
-returns data, even though the meaning of the strings is different.)
-.P
-The strings are returned in reverse order of length; that is, the longest
-matching string is given first. If there were too many matches to fit into
-\fIovector\fP, the yield of the function is zero, and the vector is filled with
-the longest matches. Unlike \fBpcre_exec()\fP, \fBpcre_dfa_exec()\fP can use
-the entire \fIovector\fP for returning matched strings.
-.P
-NOTE: PCRE's "auto-possessification" optimization usually applies to character
-repeats at the end of a pattern (as well as internally). For example, the
-pattern "a\ed+" is compiled as if it were "a\ed++" because there is no point
-even considering the possibility of backtracking into the repeated digits. For
-DFA matching, this means that only one possible match is found. If you really
-do want multiple matches in such cases, either use an ungreedy repeat
-("a\ed+?") or set the PCRE_NO_AUTO_POSSESS option when compiling.
-.
-.
-.SS "Error returns from \fBpcre_dfa_exec()\fP"
-.rs
-.sp
-The \fBpcre_dfa_exec()\fP function returns a negative number when it fails.
-Many of the errors are the same as for \fBpcre_exec()\fP, and these are
-described
-.\" HTML <a href="#errorlist">
-.\" </a>
-above.
-.\"
-There are in addition the following errors that are specific to
-\fBpcre_dfa_exec()\fP:
-.sp
-  PCRE_ERROR_DFA_UITEM      (-16)
-.sp
-This return is given if \fBpcre_dfa_exec()\fP encounters an item in the pattern
-that it does not support, for instance, the use of \eC or a back reference.
-.sp
-  PCRE_ERROR_DFA_UCOND      (-17)
-.sp
-This return is given if \fBpcre_dfa_exec()\fP encounters a condition item that
-uses a back reference for the condition, or a test for recursion in a specific
-group. These are not supported.
-.sp
-  PCRE_ERROR_DFA_UMLIMIT    (-18)
-.sp
-This return is given if \fBpcre_dfa_exec()\fP is called with an \fIextra\fP
-block that contains a setting of the \fImatch_limit\fP or
-\fImatch_limit_recursion\fP fields. This is not supported (these fields are
-meaningless for DFA matching).
-.sp
-  PCRE_ERROR_DFA_WSSIZE     (-19)
-.sp
-This return is given if \fBpcre_dfa_exec()\fP runs out of space in the
-\fIworkspace\fP vector.
-.sp
-  PCRE_ERROR_DFA_RECURSE    (-20)
-.sp
-When a recursive subpattern is processed, the matching function calls itself
-recursively, using private vectors for \fIovector\fP and \fIworkspace\fP. This
-error is given if the output vector is not large enough. This should be
-extremely rare, as a vector of size 1000 is used.
-.sp
-  PCRE_ERROR_DFA_BADRESTART (-30)
-.sp
-When \fBpcre_dfa_exec()\fP is called with the \fBPCRE_DFA_RESTART\fP option,
-some plausibility checks are made on the contents of the workspace, which
-should contain data about the previous partial match. If any of these checks
-fail, this error is given.
-.
-.
-.SH "SEE ALSO"
-.rs
-.sp
-\fBpcre16\fP(3), \fBpcre32\fP(3), \fBpcrebuild\fP(3), \fBpcrecallout\fP(3),
-\fBpcrecpp(3)\fP(3), \fBpcrematching\fP(3), \fBpcrepartial\fP(3),
-\fBpcreposix\fP(3), \fBpcreprecompile\fP(3), \fBpcresample\fP(3),
-\fBpcrestack\fP(3).
-.
-.
-.SH AUTHOR
-.rs
-.sp
-.nf
-Philip Hazel
-University Computing Service
-Cambridge CB2 3QH, England.
-.fi
-.
-.
-.SH REVISION
-.rs
-.sp
-.nf
-Last updated: 09 February 2014
-Copyright (c) 1997-2014 University of Cambridge.
-.fi
diff --git a/dist/doc/pcrebuild.3 b/dist/doc/pcrebuild.3
deleted file mode 100644
index 403f2ae..0000000
--- a/dist/doc/pcrebuild.3
+++ /dev/null
@@ -1,550 +0,0 @@
-.TH PCREBUILD 3 "12 May 2013" "PCRE 8.33"
-.SH NAME
-PCRE - Perl-compatible regular expressions
-.
-.
-.SH "BUILDING PCRE"
-.rs
-.sp
-PCRE is distributed with a \fBconfigure\fP script that can be used to build the
-library in Unix-like environments using the applications known as Autotools.
-Also in the distribution are files to support building using \fBCMake\fP
-instead of \fBconfigure\fP. The text file
-.\" HTML <a href="README.txt">
-.\" </a>
-\fBREADME\fP
-.\"
-contains general information about building with Autotools (some of which is
-repeated below), and also has some comments about building on various operating
-systems. There is a lot more information about building PCRE without using
-Autotools (including information about using \fBCMake\fP and building "by
-hand") in the text file called
-.\" HTML <a href="NON-AUTOTOOLS-BUILD.txt">
-.\" </a>
-\fBNON-AUTOTOOLS-BUILD\fP.
-.\"
-You should consult this file as well as the
-.\" HTML <a href="README.txt">
-.\" </a>
-\fBREADME\fP
-.\"
-file if you are building in a non-Unix-like environment.
-.
-.
-.SH "PCRE BUILD-TIME OPTIONS"
-.rs
-.sp
-The rest of this document describes the optional features of PCRE that can be
-selected when the library is compiled. It assumes use of the \fBconfigure\fP
-script, where the optional features are selected or deselected by providing
-options to \fBconfigure\fP before running the \fBmake\fP command. However, the
-same options can be selected in both Unix-like and non-Unix-like environments
-using the GUI facility of \fBcmake-gui\fP if you are using \fBCMake\fP instead
-of \fBconfigure\fP to build PCRE.
-.P
-If you are not using Autotools or \fBCMake\fP, option selection can be done by
-editing the \fBconfig.h\fP file, or by passing parameter settings to the
-compiler, as described in
-.\" HTML <a href="NON-AUTOTOOLS-BUILD.txt">
-.\" </a>
-\fBNON-AUTOTOOLS-BUILD\fP.
-.\"
-.P
-The complete list of options for \fBconfigure\fP (which includes the standard
-ones such as the selection of the installation directory) can be obtained by
-running
-.sp
-  ./configure --help
-.sp
-The following sections include descriptions of options whose names begin with
---enable or --disable. These settings specify changes to the defaults for the
-\fBconfigure\fP command. Because of the way that \fBconfigure\fP works,
---enable and --disable always come in pairs, so the complementary option always
-exists as well, but as it specifies the default, it is not described.
-.
-.
-.SH "BUILDING 8-BIT, 16-BIT AND 32-BIT LIBRARIES"
-.rs
-.sp
-By default, a library called \fBlibpcre\fP is built, containing functions that
-take string arguments contained in vectors of bytes, either as single-byte
-characters, or interpreted as UTF-8 strings. You can also build a separate
-library, called \fBlibpcre16\fP, in which strings are contained in vectors of
-16-bit data units and interpreted either as single-unit characters or UTF-16
-strings, by adding
-.sp
-  --enable-pcre16
-.sp
-to the \fBconfigure\fP command. You can also build yet another separate
-library, called \fBlibpcre32\fP, in which strings are contained in vectors of
-32-bit data units and interpreted either as single-unit characters or UTF-32
-strings, by adding
-.sp
-  --enable-pcre32
-.sp
-to the \fBconfigure\fP command. If you do not want the 8-bit library, add
-.sp
-  --disable-pcre8
-.sp
-as well. At least one of the three libraries must be built. Note that the C++
-and POSIX wrappers are for the 8-bit library only, and that \fBpcregrep\fP is
-an 8-bit program. None of these are built if you select only the 16-bit or
-32-bit libraries.
-.
-.
-.SH "BUILDING SHARED AND STATIC LIBRARIES"
-.rs
-.sp
-The Autotools PCRE building process uses \fBlibtool\fP to build both shared and
-static libraries by default. You can suppress one of these by adding one of
-.sp
-  --disable-shared
-  --disable-static
-.sp
-to the \fBconfigure\fP command, as required.
-.
-.
-.SH "C++ SUPPORT"
-.rs
-.sp
-By default, if the 8-bit library is being built, the \fBconfigure\fP script
-will search for a C++ compiler and C++ header files. If it finds them, it
-automatically builds the C++ wrapper library (which supports only 8-bit
-strings). You can disable this by adding
-.sp
-  --disable-cpp
-.sp
-to the \fBconfigure\fP command.
-.
-.
-.SH "UTF-8, UTF-16 AND UTF-32 SUPPORT"
-.rs
-.sp
-To build PCRE with support for UTF Unicode character strings, add
-.sp
-  --enable-utf
-.sp
-to the \fBconfigure\fP command. This setting applies to all three libraries,
-adding support for UTF-8 to the 8-bit library, support for UTF-16 to the 16-bit
-library, and support for UTF-32 to the to the 32-bit library. There are no
-separate options for enabling UTF-8, UTF-16 and UTF-32 independently because
-that would allow ridiculous settings such as requesting UTF-16 support while
-building only the 8-bit library. It is not possible to build one library with
-UTF support and another without in the same configuration. (For backwards
-compatibility, --enable-utf8 is a synonym of --enable-utf.)
-.P
-Of itself, this setting does not make PCRE treat strings as UTF-8, UTF-16 or
-UTF-32. As well as compiling PCRE with this option, you also have have to set
-the PCRE_UTF8, PCRE_UTF16 or PCRE_UTF32 option (as appropriate) when you call
-one of the pattern compiling functions.
-.P
-If you set --enable-utf when compiling in an EBCDIC environment, PCRE expects
-its input to be either ASCII or UTF-8 (depending on the run-time option). It is
-not possible to support both EBCDIC and UTF-8 codes in the same version of the
-library. Consequently, --enable-utf and --enable-ebcdic are mutually
-exclusive.
-.
-.
-.SH "UNICODE CHARACTER PROPERTY SUPPORT"
-.rs
-.sp
-UTF support allows the libraries to process character codepoints up to 0x10ffff
-in the strings that they handle. On its own, however, it does not provide any
-facilities for accessing the properties of such characters. If you want to be
-able to use the pattern escapes \eP, \ep, and \eX, which refer to Unicode
-character properties, you must add
-.sp
-  --enable-unicode-properties
-.sp
-to the \fBconfigure\fP command. This implies UTF support, even if you have
-not explicitly requested it.
-.P
-Including Unicode property support adds around 30K of tables to the PCRE
-library. Only the general category properties such as \fILu\fP and \fINd\fP are
-supported. Details are given in the
-.\" HREF
-\fBpcrepattern\fP
-.\"
-documentation.
-.
-.
-.SH "JUST-IN-TIME COMPILER SUPPORT"
-.rs
-.sp
-Just-in-time compiler support is included in the build by specifying
-.sp
-  --enable-jit
-.sp
-This support is available only for certain hardware architectures. If this
-option is set for an unsupported architecture, a compile time error occurs.
-See the
-.\" HREF
-\fBpcrejit\fP
-.\"
-documentation for a discussion of JIT usage. When JIT support is enabled,
-pcregrep automatically makes use of it, unless you add
-.sp
-  --disable-pcregrep-jit
-.sp
-to the "configure" command.
-.
-.
-.SH "CODE VALUE OF NEWLINE"
-.rs
-.sp
-By default, PCRE interprets the linefeed (LF) character as indicating the end
-of a line. This is the normal newline character on Unix-like systems. You can
-compile PCRE to use carriage return (CR) instead, by adding
-.sp
-  --enable-newline-is-cr
-.sp
-to the \fBconfigure\fP command. There is also a --enable-newline-is-lf option,
-which explicitly specifies linefeed as the newline character.
-.sp
-Alternatively, you can specify that line endings are to be indicated by the two
-character sequence CRLF. If you want this, add
-.sp
-  --enable-newline-is-crlf
-.sp
-to the \fBconfigure\fP command. There is a fourth option, specified by
-.sp
-  --enable-newline-is-anycrlf
-.sp
-which causes PCRE to recognize any of the three sequences CR, LF, or CRLF as
-indicating a line ending. Finally, a fifth option, specified by
-.sp
-  --enable-newline-is-any
-.sp
-causes PCRE to recognize any Unicode newline sequence.
-.P
-Whatever line ending convention is selected when PCRE is built can be
-overridden when the library functions are called. At build time it is
-conventional to use the standard for your operating system.
-.
-.
-.SH "WHAT \eR MATCHES"
-.rs
-.sp
-By default, the sequence \eR in a pattern matches any Unicode newline sequence,
-whatever has been selected as the line ending sequence. If you specify
-.sp
-  --enable-bsr-anycrlf
-.sp
-the default is changed so that \eR matches only CR, LF, or CRLF. Whatever is
-selected when PCRE is built can be overridden when the library functions are
-called.
-.
-.
-.SH "POSIX MALLOC USAGE"
-.rs
-.sp
-When the 8-bit library is called through the POSIX interface (see the
-.\" HREF
-\fBpcreposix\fP
-.\"
-documentation), additional working storage is required for holding the pointers
-to capturing substrings, because PCRE requires three integers per substring,
-whereas the POSIX interface provides only two. If the number of expected
-substrings is small, the wrapper function uses space on the stack, because this
-is faster than using \fBmalloc()\fP for each call. The default threshold above
-which the stack is no longer used is 10; it can be changed by adding a setting
-such as
-.sp
-  --with-posix-malloc-threshold=20
-.sp
-to the \fBconfigure\fP command.
-.
-.
-.SH "HANDLING VERY LARGE PATTERNS"
-.rs
-.sp
-Within a compiled pattern, offset values are used to point from one part to
-another (for example, from an opening parenthesis to an alternation
-metacharacter). By default, in the 8-bit and 16-bit libraries, two-byte values
-are used for these offsets, leading to a maximum size for a compiled pattern of
-around 64K. This is sufficient to handle all but the most gigantic patterns.
-Nevertheless, some people do want to process truly enormous patterns, so it is
-possible to compile PCRE to use three-byte or four-byte offsets by adding a
-setting such as
-.sp
-  --with-link-size=3
-.sp
-to the \fBconfigure\fP command. The value given must be 2, 3, or 4. For the
-16-bit library, a value of 3 is rounded up to 4. In these libraries, using
-longer offsets slows down the operation of PCRE because it has to load
-additional data when handling them. For the 32-bit library the value is always
-4 and cannot be overridden; the value of --with-link-size is ignored.
-.
-.
-.SH "AVOIDING EXCESSIVE STACK USAGE"
-.rs
-.sp
-When matching with the \fBpcre_exec()\fP function, PCRE implements backtracking
-by making recursive calls to an internal function called \fBmatch()\fP. In
-environments where the size of the stack is limited, this can severely limit
-PCRE's operation. (The Unix environment does not usually suffer from this
-problem, but it may sometimes be necessary to increase the maximum stack size.
-There is a discussion in the
-.\" HREF
-\fBpcrestack\fP
-.\"
-documentation.) An alternative approach to recursion that uses memory from the
-heap to remember data, instead of using recursive function calls, has been
-implemented to work round the problem of limited stack size. If you want to
-build a version of PCRE that works this way, add
-.sp
-  --disable-stack-for-recursion
-.sp
-to the \fBconfigure\fP command. With this configuration, PCRE will use the
-\fBpcre_stack_malloc\fP and \fBpcre_stack_free\fP variables to call memory
-management functions. By default these point to \fBmalloc()\fP and
-\fBfree()\fP, but you can replace the pointers so that your own functions are
-used instead.
-.P
-Separate functions are provided rather than using \fBpcre_malloc\fP and
-\fBpcre_free\fP because the usage is very predictable: the block sizes
-requested are always the same, and the blocks are always freed in reverse
-order. A calling program might be able to implement optimized functions that
-perform better than \fBmalloc()\fP and \fBfree()\fP. PCRE runs noticeably more
-slowly when built in this way. This option affects only the \fBpcre_exec()\fP
-function; it is not relevant for \fBpcre_dfa_exec()\fP.
-.
-.
-.SH "LIMITING PCRE RESOURCE USAGE"
-.rs
-.sp
-Internally, PCRE has a function called \fBmatch()\fP, which it calls repeatedly
-(sometimes recursively) when matching a pattern with the \fBpcre_exec()\fP
-function. By controlling the maximum number of times this function may be
-called during a single matching operation, a limit can be placed on the
-resources used by a single call to \fBpcre_exec()\fP. The limit can be changed
-at run time, as described in the
-.\" HREF
-\fBpcreapi\fP
-.\"
-documentation. The default is 10 million, but this can be changed by adding a
-setting such as
-.sp
-  --with-match-limit=500000
-.sp
-to the \fBconfigure\fP command. This setting has no effect on the
-\fBpcre_dfa_exec()\fP matching function.
-.P
-In some environments it is desirable to limit the depth of recursive calls of
-\fBmatch()\fP more strictly than the total number of calls, in order to
-restrict the maximum amount of stack (or heap, if --disable-stack-for-recursion
-is specified) that is used. A second limit controls this; it defaults to the
-value that is set for --with-match-limit, which imposes no additional
-constraints. However, you can set a lower limit by adding, for example,
-.sp
-  --with-match-limit-recursion=10000
-.sp
-to the \fBconfigure\fP command. This value can also be overridden at run time.
-.
-.
-.SH "CREATING CHARACTER TABLES AT BUILD TIME"
-.rs
-.sp
-PCRE uses fixed tables for processing characters whose code values are less
-than 256. By default, PCRE is built with a set of tables that are distributed
-in the file \fIpcre_chartables.c.dist\fP. These tables are for ASCII codes
-only. If you add
-.sp
-  --enable-rebuild-chartables
-.sp
-to the \fBconfigure\fP command, the distributed tables are no longer used.
-Instead, a program called \fBdftables\fP is compiled and run. This outputs the
-source for new set of tables, created in the default locale of your C run-time
-system. (This method of replacing the tables does not work if you are cross
-compiling, because \fBdftables\fP is run on the local host. If you need to
-create alternative tables when cross compiling, you will have to do so "by
-hand".)
-.
-.
-.SH "USING EBCDIC CODE"
-.rs
-.sp
-PCRE assumes by default that it will run in an environment where the character
-code is ASCII (or Unicode, which is a superset of ASCII). This is the case for
-most computer operating systems. PCRE can, however, be compiled to run in an
-EBCDIC environment by adding
-.sp
-  --enable-ebcdic
-.sp
-to the \fBconfigure\fP command. This setting implies
---enable-rebuild-chartables. You should only use it if you know that you are in
-an EBCDIC environment (for example, an IBM mainframe operating system). The
---enable-ebcdic option is incompatible with --enable-utf.
-.P
-The EBCDIC character that corresponds to an ASCII LF is assumed to have the
-value 0x15 by default. However, in some EBCDIC environments, 0x25 is used. In
-such an environment you should use
-.sp
-  --enable-ebcdic-nl25
-.sp
-as well as, or instead of, --enable-ebcdic. The EBCDIC character for CR has the
-same value as in ASCII, namely, 0x0d. Whichever of 0x15 and 0x25 is \fInot\fP
-chosen as LF is made to correspond to the Unicode NEL character (which, in
-Unicode, is 0x85).
-.P
-The options that select newline behaviour, such as --enable-newline-is-cr,
-and equivalent run-time options, refer to these character values in an EBCDIC
-environment.
-.
-.
-.SH "PCREGREP OPTIONS FOR COMPRESSED FILE SUPPORT"
-.rs
-.sp
-By default, \fBpcregrep\fP reads all files as plain text. You can build it so
-that it recognizes files whose names end in \fB.gz\fP or \fB.bz2\fP, and reads
-them with \fBlibz\fP or \fBlibbz2\fP, respectively, by adding one or both of
-.sp
-  --enable-pcregrep-libz
-  --enable-pcregrep-libbz2
-.sp
-to the \fBconfigure\fP command. These options naturally require that the
-relevant libraries are installed on your system. Configuration will fail if
-they are not.
-.
-.
-.SH "PCREGREP BUFFER SIZE"
-.rs
-.sp
-\fBpcregrep\fP uses an internal buffer to hold a "window" on the file it is
-scanning, in order to be able to output "before" and "after" lines when it
-finds a match. The size of the buffer is controlled by a parameter whose
-default value is 20K. The buffer itself is three times this size, but because
-of the way it is used for holding "before" lines, the longest line that is
-guaranteed to be processable is the parameter size. You can change the default
-parameter value by adding, for example,
-.sp
-  --with-pcregrep-bufsize=50K
-.sp
-to the \fBconfigure\fP command. The caller of \fPpcregrep\fP can, however,
-override this value by specifying a run-time option.
-.
-.
-.SH "PCRETEST OPTION FOR LIBREADLINE SUPPORT"
-.rs
-.sp
-If you add
-.sp
-  --enable-pcretest-libreadline
-.sp
-to the \fBconfigure\fP command, \fBpcretest\fP is linked with the
-\fBlibreadline\fP library, and when its input is from a terminal, it reads it
-using the \fBreadline()\fP function. This provides line-editing and history
-facilities. Note that \fBlibreadline\fP is GPL-licensed, so if you distribute a
-binary of \fBpcretest\fP linked in this way, there may be licensing issues.
-.P
-Setting this option causes the \fB-lreadline\fP option to be added to the
-\fBpcretest\fP build. In many operating environments with a sytem-installed
-\fBlibreadline\fP this is sufficient. However, in some environments (e.g.
-if an unmodified distribution version of readline is in use), some extra
-configuration may be necessary. The INSTALL file for \fBlibreadline\fP says
-this:
-.sp
-  "Readline uses the termcap functions, but does not link with the
-  termcap or curses library itself, allowing applications which link
-  with readline the to choose an appropriate library."
-.sp
-If your environment has not been set up so that an appropriate library is
-automatically included, you may need to add something like
-.sp
-  LIBS="-ncurses"
-.sp
-immediately before the \fBconfigure\fP command.
-.
-.
-.SH "DEBUGGING WITH VALGRIND SUPPORT"
-.rs
-.sp
-By adding the
-.sp
-  --enable-valgrind
-.sp
-option to to the \fBconfigure\fP command, PCRE will use valgrind annotations
-to mark certain memory regions as unaddressable. This allows it to detect
-invalid memory accesses, and is mostly useful for debugging PCRE itself.
-.
-.
-.SH "CODE COVERAGE REPORTING"
-.rs
-.sp
-If your C compiler is gcc, you can build a version of PCRE that can generate a
-code coverage report for its test suite. To enable this, you must install
-\fBlcov\fP version 1.6 or above. Then specify
-.sp
-  --enable-coverage
-.sp
-to the \fBconfigure\fP command and build PCRE in the usual way.
-.P
-Note that using \fBccache\fP (a caching C compiler) is incompatible with code
-coverage reporting. If you have configured \fBccache\fP to run automatically
-on your system, you must set the environment variable
-.sp
-  CCACHE_DISABLE=1
-.sp
-before running \fBmake\fP to build PCRE, so that \fBccache\fP is not used.
-.P
-When --enable-coverage is used, the following addition targets are added to the
-\fIMakefile\fP:
-.sp
-  make coverage
-.sp
-This creates a fresh coverage report for the PCRE test suite. It is equivalent
-to running "make coverage-reset", "make coverage-baseline", "make check", and
-then "make coverage-report".
-.sp
-  make coverage-reset
-.sp
-This zeroes the coverage counters, but does nothing else.
-.sp
-  make coverage-baseline
-.sp
-This captures baseline coverage information.
-.sp
-  make coverage-report
-.sp
-This creates the coverage report.
-.sp
-  make coverage-clean-report
-.sp
-This removes the generated coverage report without cleaning the coverage data
-itself.
-.sp
-  make coverage-clean-data
-.sp
-This removes the captured coverage data without removing the coverage files
-created at compile time (*.gcno).
-.sp
-  make coverage-clean
-.sp
-This cleans all coverage data including the generated coverage report. For more
-information about code coverage, see the \fBgcov\fP and \fBlcov\fP
-documentation.
-.
-.
-.SH "SEE ALSO"
-.rs
-.sp
-\fBpcreapi\fP(3), \fBpcre16\fP, \fBpcre32\fP, \fBpcre_config\fP(3).
-.
-.
-.SH AUTHOR
-.rs
-.sp
-.nf
-Philip Hazel
-University Computing Service
-Cambridge CB2 3QH, England.
-.fi
-.
-.
-.SH REVISION
-.rs
-.sp
-.nf
-Last updated: 12 May 2013
-Copyright (c) 1997-2013 University of Cambridge.
-.fi
diff --git a/dist/doc/pcrecallout.3 b/dist/doc/pcrecallout.3
deleted file mode 100644
index 8ebc995..0000000
--- a/dist/doc/pcrecallout.3
+++ /dev/null
@@ -1,255 +0,0 @@
-.TH PCRECALLOUT 3 "12 November 2013" "PCRE 8.34"
-.SH NAME
-PCRE - Perl-compatible regular expressions
-.SH SYNOPSIS
-.rs
-.sp
-.B #include <pcre.h>
-.PP
-.SM
-.B int (*pcre_callout)(pcre_callout_block *);
-.PP
-.B int (*pcre16_callout)(pcre16_callout_block *);
-.PP
-.B int (*pcre32_callout)(pcre32_callout_block *);
-.
-.SH DESCRIPTION
-.rs
-.sp
-PCRE provides a feature called "callout", which is a means of temporarily
-passing control to the caller of PCRE in the middle of pattern matching. The
-caller of PCRE provides an external function by putting its entry point in the
-global variable \fIpcre_callout\fP (\fIpcre16_callout\fP for the 16-bit
-library, \fIpcre32_callout\fP for the 32-bit library). 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. Different callout points can be identified by putting
-a number less than 256 after the letter C. The default value is zero.
-For example, this pattern has two callout points:
-.sp
-  (?C1)abc(?C2)def
-.sp
-If the PCRE_AUTO_CALLOUT option bit is set when a pattern is compiled, PCRE
-automatically inserts callouts, all with number 255, before each item in the
-pattern. For example, if PCRE_AUTO_CALLOUT is used with the pattern
-.sp
-  A(\ed{2}|--)
-.sp
-it is processed as if it were
-.sp
-(?C255)A(?C255)((?C255)\ed{2}(?C255)|(?C255)-(?C255)-(?C255))(?C255)
-.sp
-Notice that there is a callout before and after each parenthesis and
-alternation bar. If the pattern contains a conditional group whose condition is
-an assertion, an automatic callout is inserted immediately before the
-condition. Such a callout may also be inserted explicitly, for example:
-.sp
-  (?(?C9)(?=a)ab|de)
-.sp
-This applies only to assertion conditions (because they are themselves
-independent groups).
-.P
-Automatic callouts can be used for tracking the progress of pattern matching.
-The
-.\" HREF
-\fBpcretest\fP
-.\"
-program has a pattern qualifier (/C) that sets automatic callouts; when it is
-used, the output indicates how the pattern is being matched. This is useful
-information when you are trying to optimize the performance of a particular
-pattern.
-.
-.
-.SH "MISSING CALLOUTS"
-.rs
-.sp
-You should be aware that, because of optimizations in the way PCRE compiles and
-matches patterns, callouts sometimes do not happen exactly as you might expect.
-.P
-At compile time, PCRE "auto-possessifies" repeated items when it knows that
-what follows cannot be part of the repeat. For example, a+[bc] is compiled as
-if it were a++[bc]. The \fBpcretest\fP output when this pattern is anchored and
-then applied with automatic callouts to the string "aaaa" is:
-.sp
-  --->aaaa
-   +0 ^        ^
-   +1 ^        a+
-   +3 ^   ^    [bc]
-  No match
-.sp
-This indicates that when matching [bc] fails, there is no backtracking into a+
-and therefore the callouts that would be taken for the backtracks do not occur.
-You can disable the auto-possessify feature by passing PCRE_NO_AUTO_POSSESS
-to \fBpcre_compile()\fP, or starting the pattern with (*NO_AUTO_POSSESS). If
-this is done in \fBpcretest\fP (using the /O qualifier), the output changes to
-this:
-.sp
-  --->aaaa
-   +0 ^        ^
-   +1 ^        a+
-   +3 ^   ^    [bc]
-   +3 ^  ^     [bc]
-   +3 ^ ^      [bc]
-   +3 ^^       [bc]
-  No match
-.sp
-This time, when matching [bc] fails, the matcher backtracks into a+ and tries
-again, repeatedly, until a+ itself fails.
-.P
-Other optimizations that provide fast "no match" results also affect callouts.
-For example, if the pattern is
-.sp
-  ab(?C4)cd
-.sp
-PCRE knows that any matching string must contain the letter "d". If the subject
-string is "abyz", the lack of "d" means that matching doesn't ever start, and
-the callout is never reached. However, with "abyd", though the result is still
-no match, the callout is obeyed.
-.P
-If the pattern is studied, PCRE knows the minimum length of a matching string,
-and will immediately give a "no match" return without actually running a match
-if the subject is not long enough, or, for unanchored patterns, if it has
-been scanned far enough.
-.P
-You can disable these optimizations by passing the PCRE_NO_START_OPTIMIZE
-option to the matching function, or by starting the pattern with
-(*NO_START_OPT). This slows down the matching process, but does ensure that
-callouts such as the example above are obeyed.
-.
-.
-.SH "THE CALLOUT INTERFACE"
-.rs
-.sp
-During matching, when PCRE reaches a callout point, the external function
-defined by \fIpcre_callout\fP or \fIpcre[16|32]_callout\fP is called (if it is
-set). This applies to both normal and DFA matching. The only argument to the
-callout function is a pointer to a \fBpcre_callout\fP or
-\fBpcre[16|32]_callout\fP block. These structures contains the following
-fields:
-.sp
-  int           \fIversion\fP;
-  int           \fIcallout_number\fP;
-  int          *\fIoffset_vector\fP;
-  const char   *\fIsubject\fP;           (8-bit version)
-  PCRE_SPTR16   \fIsubject\fP;           (16-bit version)
-  PCRE_SPTR32   \fIsubject\fP;           (32-bit version)
-  int           \fIsubject_length\fP;
-  int           \fIstart_match\fP;
-  int           \fIcurrent_position\fP;
-  int           \fIcapture_top\fP;
-  int           \fIcapture_last\fP;
-  void         *\fIcallout_data\fP;
-  int           \fIpattern_position\fP;
-  int           \fInext_item_length\fP;
-  const unsigned char *\fImark\fP;       (8-bit version)
-  const PCRE_UCHAR16  *\fImark\fP;       (16-bit version)
-  const PCRE_UCHAR32  *\fImark\fP;       (32-bit version)
-.sp
-The \fIversion\fP field is an integer containing the version number of the
-block format. The initial version was 0; the current version is 2. The version
-number will change again in future if additional fields are added, but the
-intention is never to remove any of the existing fields.
-.P
-The \fIcallout_number\fP field contains the number of the callout, as compiled
-into the pattern (that is, the number after ?C for manual callouts, and 255 for
-automatically generated callouts).
-.P
-The \fIoffset_vector\fP field is a pointer to the vector of offsets that was
-passed by the caller to the matching function. When \fBpcre_exec()\fP or
-\fBpcre[16|32]_exec()\fP is used, the contents can be inspected, in order to
-extract substrings that have been matched so far, in the same way as for
-extracting substrings after a match has completed. For the DFA matching
-functions, this field is not useful.
-.P
-The \fIsubject\fP and \fIsubject_length\fP fields contain copies of the values
-that were passed to the matching function.
-.P
-The \fIstart_match\fP field normally contains the offset within the subject at
-which the current match attempt started. However, if the escape sequence \eK
-has been encountered, this value is changed to reflect the modified starting
-point. If the pattern is not anchored, the callout function may be called
-several times from the same point in the pattern for different starting points
-in the subject.
-.P
-The \fIcurrent_position\fP field contains the offset within the subject of the
-current match pointer.
-.P
-When the \fBpcre_exec()\fP or \fBpcre[16|32]_exec()\fP is used, the
-\fIcapture_top\fP field contains one more than the number of the highest
-numbered captured substring so far. If no substrings have been captured, the
-value of \fIcapture_top\fP is one. This is always the case when the DFA
-functions are used, because they do not support captured substrings.
-.P
-The \fIcapture_last\fP field contains the number of the most recently captured
-substring. However, when a recursion exits, the value reverts to what it was
-outside the recursion, as do the values of all captured substrings. If no
-substrings have been captured, the value of \fIcapture_last\fP is -1. This is
-always the case for the DFA matching functions.
-.P
-The \fIcallout_data\fP field contains a value that is passed to a matching
-function specifically so that it can be passed back in callouts. It is passed
-in the \fIcallout_data\fP field of a \fBpcre_extra\fP or \fBpcre[16|32]_extra\fP
-data structure. If no such data was passed, the value of \fIcallout_data\fP in
-a callout block is NULL. There is a description of the \fBpcre_extra\fP
-structure in the
-.\" HREF
-\fBpcreapi\fP
-.\"
-documentation.
-.P
-The \fIpattern_position\fP field is present from version 1 of the callout
-structure. It contains the offset to the next item to be matched in the pattern
-string.
-.P
-The \fInext_item_length\fP field is present from version 1 of the callout
-structure. It contains the length of the next item to be matched in the pattern
-string. When the callout immediately precedes an alternation bar, a closing
-parenthesis, or the end of the pattern, the length is zero. When the callout
-precedes an opening parenthesis, the length is that of the entire subpattern.
-.P
-The \fIpattern_position\fP and \fInext_item_length\fP fields are intended to
-help in distinguishing between different automatic callouts, which all have the
-same callout number. However, they are set for all callouts.
-.P
-The \fImark\fP field is present from version 2 of the callout structure. In
-callouts from \fBpcre_exec()\fP or \fBpcre[16|32]_exec()\fP it contains a
-pointer to the zero-terminated name of the most recently passed (*MARK),
-(*PRUNE), or (*THEN) item in the match, or NULL if no such items have been
-passed. Instances of (*PRUNE) or (*THEN) without a name do not obliterate a
-previous (*MARK). In callouts from the DFA matching functions this field always
-contains NULL.
-.
-.
-.SH "RETURN VALUES"
-.rs
-.sp
-The external callout function returns an integer to PCRE. If the value is zero,
-matching proceeds as normal. If the value is greater than zero, matching fails
-at the current point, but the testing of other matching possibilities goes
-ahead, just as if a lookahead assertion had failed. If the value is less than
-zero, the match is abandoned, the matching function returns the negative value.
-.P
-Negative values should normally be chosen from the set of PCRE_ERROR_xxx
-values. In particular, PCRE_ERROR_NOMATCH forces a standard "no match" failure.
-The error number PCRE_ERROR_CALLOUT is reserved for use by callout functions;
-it will never be used by PCRE itself.
-.
-.
-.SH AUTHOR
-.rs
-.sp
-.nf
-Philip Hazel
-University Computing Service
-Cambridge CB2 3QH, England.
-.fi
-.
-.
-.SH REVISION
-.rs
-.sp
-.nf
-Last updated: 12 November 2013
-Copyright (c) 1997-2013 University of Cambridge.
-.fi
diff --git a/dist/doc/pcrecompat.3 b/dist/doc/pcrecompat.3
deleted file mode 100644
index 0cc4019..0000000
--- a/dist/doc/pcrecompat.3
+++ /dev/null
@@ -1,200 +0,0 @@
-.TH PCRECOMPAT 3 "10 November 2013" "PCRE 8.34"
-.SH NAME
-PCRE - Perl-compatible regular expressions
-.SH "DIFFERENCES BETWEEN PCRE AND PERL"
-.rs
-.sp
-This document describes the differences in the ways that PCRE and Perl handle
-regular expressions. The differences described here are with respect to Perl
-versions 5.10 and above.
-.P
-1. PCRE has only a subset of Perl's Unicode support. Details of what it does
-have are given in the
-.\" HREF
-\fBpcreunicode\fP
-.\"
-page.
-.P
-2. PCRE allows repeat quantifiers only on parenthesized assertions, but they do
-not mean what you might think. For example, (?!a){3} does not assert that the
-next three characters are not "a". It just asserts that the next character is
-not "a" three times (in principle: PCRE optimizes this to run the assertion
-just once). Perl allows repeat quantifiers on other assertions such as \eb, but
-these do not seem to have any use.
-.P
-3. Capturing subpatterns that occur inside negative lookahead assertions are
-counted, but their entries in the offsets vector are never set. Perl sometimes
-(but not always) sets its numerical variables from inside negative assertions.
-.P
-4. Though binary zero characters are supported in the subject string, they are
-not allowed in a pattern string because it is passed as a normal C string,
-terminated by zero. The escape sequence \e0 can be used in the pattern to
-represent a binary zero.
-.P
-5. The following Perl escape sequences are not supported: \el, \eu, \eL,
-\eU, and \eN when followed by a character name or Unicode value. (\eN on its
-own, matching a non-newline character, is supported.) In fact these are
-implemented by Perl's general string-handling and are not part of its pattern
-matching engine. If any of these are encountered by PCRE, an error is
-generated by default. However, if the PCRE_JAVASCRIPT_COMPAT option is set,
-\eU and \eu are interpreted as JavaScript interprets them.
-.P
-6. The Perl escape sequences \ep, \eP, and \eX are supported only if PCRE is
-built with Unicode character property support. The properties that can be
-tested with \ep and \eP are limited to the general category properties such as
-Lu and Nd, script names such as Greek or Han, and the derived properties Any
-and L&. PCRE does support the Cs (surrogate) property, which Perl does not; the
-Perl documentation says "Because Perl hides the need for the user to understand
-the internal representation of Unicode characters, there is no need to
-implement the somewhat messy concept of surrogates."
-.P
-7. PCRE does support the \eQ...\eE escape for quoting substrings. Characters in
-between are treated as literals. This is slightly different from Perl in that $
-and @ are also handled as literals inside the quotes. In Perl, they cause
-variable interpolation (but of course PCRE does not have variables). Note the
-following examples:
-.sp
-    Pattern            PCRE matches      Perl matches
-.sp
-.\" JOIN
-    \eQabc$xyz\eE        abc$xyz           abc followed by the
-                                           contents of $xyz
-    \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.
-.P
-8. Fairly obviously, PCRE does not support the (?{code}) and (??{code})
-constructions. However, there is support for recursive patterns. This is not
-available in Perl 5.8, but it is in Perl 5.10. Also, the PCRE "callout"
-feature allows an external function to be called during pattern matching. See
-the
-.\" HREF
-\fBpcrecallout\fP
-.\"
-documentation for details.
-.P
-9. Subpatterns that are called as subroutines (whether or not recursively) are
-always treated as atomic groups in PCRE. This is like Python, but unlike Perl.
-Captured values that are set outside a subroutine call can be reference from
-inside in PCRE, but not in Perl. There is a discussion that explains these
-differences in more detail in the
-.\" HTML <a href="pcrepattern.html#recursiondifference">
-.\" </a>
-section on recursion differences from Perl
-.\"
-in the
-.\" HREF
-\fBpcrepattern\fP
-.\"
-page.
-.P
-10. If any of the backtracking control verbs are used in a subpattern that is
-called as a subroutine (whether or not recursively), their effect is confined
-to that subpattern; it does not extend to the surrounding pattern. This is not
-always the case in Perl. In particular, if (*THEN) is present in a group that
-is called as a subroutine, its action is limited to that group, even if the
-group does not contain any | characters. Note that such subpatterns are
-processed as anchored at the point where they are tested.
-.P
-11. If a pattern contains more than one backtracking control verb, the first
-one that is backtracked onto acts. For example, in the pattern
-A(*COMMIT)B(*PRUNE)C a failure in B triggers (*COMMIT), but a failure in C
-triggers (*PRUNE). Perl's behaviour is more complex; in many cases it is the
-same as PCRE, but there are examples where it differs.
-.P
-12. Most backtracking verbs in assertions have their normal actions. They are
-not confined to the assertion.
-.P
-13. There are some differences that are concerned with the settings of captured
-strings when part of a pattern is repeated. For example, matching "aba" against
-the pattern /^(a(b)?)+$/ in Perl leaves $2 unset, but in PCRE it is set to "b".
-.P
-14. PCRE's handling of duplicate subpattern numbers and duplicate subpattern
-names is not as general as Perl's. This is a consequence of the fact the PCRE
-works internally just with numbers, using an external table to translate
-between numbers and names. In particular, a pattern such as (?|(?<a>A)|(?<b)B),
-where the two capturing parentheses have the same number but different names,
-is not supported, and causes an error at compile time. If it were allowed, it
-would not be possible to distinguish which parentheses matched, because both
-names map to capturing subpattern number 1. To avoid this confusing situation,
-an error is given at compile time.
-.P
-15. Perl recognizes comments in some places that PCRE does not, for example,
-between the ( and ? at the start of a subpattern. If the /x modifier is set,
-Perl allows white space between ( and ? (though current Perls warn that this is
-deprecated) but PCRE never does, even if the PCRE_EXTENDED option is set.
-.P
-16. Perl, when in warning mode, gives warnings for character classes such as
-[A-\ed] or [a-[:digit:]]. It then treats the hyphens as literals. PCRE has no
-warning features, so it gives an error in these cases because they are almost
-certainly user mistakes.
-.P
-17. In PCRE, the upper/lower case character properties Lu and Ll are not
-affected when case-independent matching is specified. For example, \ep{Lu}
-always matches an upper case letter. I think Perl has changed in this respect;
-in the release at the time of writing (5.16), \ep{Lu} and \ep{Ll} match all
-letters, regardless of case, when case independence is specified.
-.P
-18. PCRE provides some extensions to the Perl regular expression facilities.
-Perl 5.10 includes new features that are not in earlier versions of Perl, some
-of which (such as named parentheses) have been in PCRE for some time. This list
-is with respect to Perl 5.10:
-.sp
-(a) Although lookbehind assertions in PCRE must match fixed length strings,
-each alternative branch of a lookbehind assertion can match a different length
-of string. Perl requires them all to have the same length.
-.sp
-(b) If PCRE_DOLLAR_ENDONLY is set and PCRE_MULTILINE is not set, the $
-meta-character matches only at the very end of the string.
-.sp
-(c) If PCRE_EXTRA is set, a backslash followed by a letter with no special
-meaning is faulted. Otherwise, like Perl, the backslash is quietly ignored.
-(Perl can be made to issue a warning.)
-.sp
-(d) If PCRE_UNGREEDY is set, the greediness of the repetition quantifiers is
-inverted, that is, by default they are not greedy, but if followed by a
-question mark they are.
-.sp
-(e) PCRE_ANCHORED can be used at matching time to force a pattern to be tried
-only at the first matching position in the subject string.
-.sp
-(f) The PCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY, PCRE_NOTEMPTY_ATSTART, and
-PCRE_NO_AUTO_CAPTURE options for \fBpcre_exec()\fP have no Perl equivalents.
-.sp
-(g) The \eR escape sequence can be restricted to match only CR, LF, or CRLF
-by the PCRE_BSR_ANYCRLF option.
-.sp
-(h) The callout facility is PCRE-specific.
-.sp
-(i) The partial matching facility is PCRE-specific.
-.sp
-(j) Patterns compiled by PCRE can be saved and re-used at a later time, even on
-different hosts that have the other endianness. However, this does not apply to
-optimized data created by the just-in-time compiler.
-.sp
-(k) The alternative matching functions (\fBpcre_dfa_exec()\fP,
-\fBpcre16_dfa_exec()\fP and \fBpcre32_dfa_exec()\fP,) match in a different way
-and are not Perl-compatible.
-.sp
-(l) PCRE recognizes some special sequences such as (*CR) at the start of
-a pattern that set overall options that cannot be changed within the pattern.
-.
-.
-.SH AUTHOR
-.rs
-.sp
-.nf
-Philip Hazel
-University Computing Service
-Cambridge CB2 3QH, England.
-.fi
-.
-.
-.SH REVISION
-.rs
-.sp
-.nf
-Last updated: 10 November 2013
-Copyright (c) 1997-2013 University of Cambridge.
-.fi
diff --git a/dist/doc/pcrecpp.3 b/dist/doc/pcrecpp.3
deleted file mode 100644
index fbddd86..0000000
--- a/dist/doc/pcrecpp.3
+++ /dev/null
@@ -1,348 +0,0 @@
-.TH PCRECPP 3 "08 January 2012" "PCRE 8.30"
-.SH NAME
-PCRE - Perl-compatible regular expressions.
-.SH "SYNOPSIS OF C++ WRAPPER"
-.rs
-.sp
-.B #include <pcrecpp.h>
-.
-.SH DESCRIPTION
-.rs
-.sp
-The C++ wrapper for PCRE was provided by Google Inc. Some additional
-functionality was added by Giuseppe Maxia. This brief man page was constructed
-from the notes in the \fIpcrecpp.h\fP file, which should be consulted for
-further details. Note that the C++ wrapper supports only the original 8-bit
-PCRE library. There is no 16-bit or 32-bit support at present.
-.
-.
-.SH "MATCHING INTERFACE"
-.rs
-.sp
-The "FullMatch" operation checks that supplied text matches a supplied pattern
-exactly. If pointer arguments are supplied, it copies matched sub-strings that
-match sub-patterns into them.
-.sp
-  Example: successful match
-     pcrecpp::RE re("h.*o");
-     re.FullMatch("hello");
-.sp
-  Example: unsuccessful match (requires full match):
-     pcrecpp::RE re("e");
-     !re.FullMatch("hello");
-.sp
-  Example: creating a temporary RE object:
-     pcrecpp::RE("h.*o").FullMatch("hello");
-.sp
-You can pass in a "const char*" or a "string" for "text". The examples below
-tend to use a const char*. You can, as in the different examples above, store
-the RE object explicitly in a variable or use a temporary RE object. The
-examples below use one mode or the other arbitrarily. Either could correctly be
-used for any of these examples.
-.P
-You must supply extra pointer arguments to extract matched subpieces.
-.sp
-  Example: extracts "ruby" into "s" and 1234 into "i"
-     int i;
-     string s;
-     pcrecpp::RE re("(\e\ew+):(\e\ed+)");
-     re.FullMatch("ruby:1234", &s, &i);
-.sp
-  Example: does not try to extract any extra sub-patterns
-     re.FullMatch("ruby:1234", &s);
-.sp
-  Example: does not try to extract into NULL
-     re.FullMatch("ruby:1234", NULL, &i);
-.sp
-  Example: integer overflow causes failure
-     !re.FullMatch("ruby:1234567891234", NULL, &i);
-.sp
-  Example: fails because there aren't enough sub-patterns:
-     !pcrecpp::RE("\e\ew+:\e\ed+").FullMatch("ruby:1234", &s);
-.sp
-  Example: fails because string cannot be stored in integer
-     !pcrecpp::RE("(.*)").FullMatch("ruby", &i);
-.sp
-The provided pointer arguments can be pointers to any scalar numeric
-type, or one of:
-.sp
-   string        (matched piece is copied to string)
-   StringPiece   (StringPiece is mutated to point to matched piece)
-   T             (where "bool T::ParseFrom(const char*, int)" exists)
-   NULL          (the corresponding matched sub-pattern is not copied)
-.sp
-The function returns true iff all of the following conditions are satisfied:
-.sp
-  a. "text" matches "pattern" exactly;
-.sp
-  b. The number of matched sub-patterns is >= number of supplied
-     pointers;
-.sp
-  c. The "i"th argument has a suitable type for holding the
-     string captured as the "i"th sub-pattern. If you pass in
-     void * NULL for the "i"th argument, or a non-void * NULL
-     of the correct type, or pass fewer arguments than the
-     number of sub-patterns, "i"th captured sub-pattern is
-     ignored.
-.sp
-CAVEAT: An optional sub-pattern that does not exist in the matched
-string is assigned the empty string. Therefore, the following will
-return false (because the empty string is not a valid number):
-.sp
-   int number;
-   pcrecpp::RE::FullMatch("abc", "[a-z]+(\e\ed+)?", &number);
-.sp
-The matching interface supports at most 16 arguments per call.
-If you need more, consider using the more general interface
-\fBpcrecpp::RE::DoMatch\fP. See \fBpcrecpp.h\fP for the signature for
-\fBDoMatch\fP.
-.P
-NOTE: Do not use \fBno_arg\fP, which is used internally to mark the end of a
-list of optional arguments, as a placeholder for missing arguments, as this can
-lead to segfaults.
-.
-.
-.SH "QUOTING METACHARACTERS"
-.rs
-.sp
-You can use the "QuoteMeta" operation to insert backslashes before all
-potentially meaningful characters in a string. The returned string, used as a
-regular expression, will exactly match the original string.
-.sp
-  Example:
-     string quoted = RE::QuoteMeta(unquoted);
-.sp
-Note that it's legal to escape a character even if it has no special meaning in
-a regular expression -- so this function does that. (This also makes it
-identical to the perl function of the same name; see "perldoc -f quotemeta".)
-For example, "1.5-2.0?" becomes "1\e.5\e-2\e.0\e?".
-.
-.SH "PARTIAL MATCHES"
-.rs
-.sp
-You can use the "PartialMatch" operation when you want the pattern
-to match any substring of the text.
-.sp
-  Example: simple search for a string:
-     pcrecpp::RE("ell").PartialMatch("hello");
-.sp
-  Example: find first number in a string:
-     int number;
-     pcrecpp::RE re("(\e\ed+)");
-     re.PartialMatch("x*100 + 20", &number);
-     assert(number == 100);
-.
-.
-.SH "UTF-8 AND THE MATCHING INTERFACE"
-.rs
-.sp
-By default, pattern and text are plain text, one byte per character. The UTF8
-flag, passed to the constructor, causes both pattern and string to be treated
-as UTF-8 text, still a byte stream but potentially multiple bytes per
-character. In practice, the text is likelier to be UTF-8 than the pattern, but
-the match returned may depend on the UTF8 flag, so always use it when matching
-UTF8 text. For example, "." will match one byte normally but with UTF8 set may
-match up to three bytes of a multi-byte character.
-.sp
-  Example:
-     pcrecpp::RE_Options options;
-     options.set_utf8();
-     pcrecpp::RE re(utf8_pattern, options);
-     re.FullMatch(utf8_string);
-.sp
-  Example: using the convenience function UTF8():
-     pcrecpp::RE re(utf8_pattern, pcrecpp::UTF8());
-     re.FullMatch(utf8_string);
-.sp
-NOTE: The UTF8 flag is ignored if pcre was not configured with the
-      --enable-utf8 flag.
-.
-.
-.SH "PASSING MODIFIERS TO THE REGULAR EXPRESSION ENGINE"
-.rs
-.sp
-PCRE defines some modifiers to change the behavior of the regular expression
-engine. The C++ wrapper defines an auxiliary class, RE_Options, as a vehicle to
-pass such modifiers to a RE class. Currently, the following modifiers are
-supported:
-.sp
-   modifier              description               Perl corresponding
-.sp
-   PCRE_CASELESS         case insensitive match      /i
-   PCRE_MULTILINE        multiple lines match        /m
-   PCRE_DOTALL           dot matches newlines        /s
-   PCRE_DOLLAR_ENDONLY   $ matches only at end       N/A
-   PCRE_EXTRA            strict escape parsing       N/A
-   PCRE_EXTENDED         ignore white spaces         /x
-   PCRE_UTF8             handles UTF8 chars          built-in
-   PCRE_UNGREEDY         reverses * and *?           N/A
-   PCRE_NO_AUTO_CAPTURE  disables capturing parens   N/A (*)
-.sp
-(*) Both Perl and PCRE allow non capturing parentheses by means of the
-"?:" modifier within the pattern itself. e.g. (?:ab|cd) does not
-capture, while (ab|cd) does.
-.P
-For a full account on how each modifier works, please check the
-PCRE API reference page.
-.P
-For each modifier, there are two member functions whose name is made
-out of the modifier in lowercase, without the "PCRE_" prefix. For
-instance, PCRE_CASELESS is handled by
-.sp
-  bool caseless()
-.sp
-which returns true if the modifier is set, and
-.sp
-  RE_Options & set_caseless(bool)
-.sp
-which sets or unsets the modifier. Moreover, PCRE_EXTRA_MATCH_LIMIT can be
-accessed through the \fBset_match_limit()\fP and \fBmatch_limit()\fP member
-functions. Setting \fImatch_limit\fP to a non-zero value will limit the
-execution of pcre to keep it from doing bad things like blowing the stack or
-taking an eternity to return a result. A value of 5000 is good enough to stop
-stack blowup in a 2MB thread stack. Setting \fImatch_limit\fP to zero disables
-match limiting. Alternatively, you can call \fBmatch_limit_recursion()\fP
-which uses PCRE_EXTRA_MATCH_LIMIT_RECURSION to limit how much PCRE
-recurses. \fBmatch_limit()\fP limits the number of matches PCRE does;
-\fBmatch_limit_recursion()\fP limits the depth of internal recursion, and
-therefore the amount of stack that is used.
-.P
-Normally, to pass one or more modifiers to a RE class, you declare
-a \fIRE_Options\fP object, set the appropriate options, and pass this
-object to a RE constructor. Example:
-.sp
-   RE_Options opt;
-   opt.set_caseless(true);
-   if (RE("HELLO", opt).PartialMatch("hello world")) ...
-.sp
-RE_options has two constructors. The default constructor takes no arguments and
-creates a set of flags that are off by default. The optional parameter
-\fIoption_flags\fP is to facilitate transfer of legacy code from C programs.
-This lets you do
-.sp
-   RE(pattern,
-     RE_Options(PCRE_CASELESS|PCRE_MULTILINE)).PartialMatch(str);
-.sp
-However, new code is better off doing
-.sp
-   RE(pattern,
-     RE_Options().set_caseless(true).set_multiline(true))
-       .PartialMatch(str);
-.sp
-If you are going to pass one of the most used modifiers, there are some
-convenience functions that return a RE_Options class with the
-appropriate modifier already set: \fBCASELESS()\fP, \fBUTF8()\fP,
-\fBMULTILINE()\fP, \fBDOTALL\fP(), and \fBEXTENDED()\fP.
-.P
-If you need to set several options at once, and you don't want to go through
-the pains of declaring a RE_Options object and setting several options, there
-is a parallel method that give you such ability on the fly. You can concatenate
-several \fBset_xxxxx()\fP member functions, since each of them returns a
-reference to its class object. For example, to pass PCRE_CASELESS,
-PCRE_EXTENDED, and PCRE_MULTILINE to a RE with one statement, you may write:
-.sp
-   RE(" ^ xyz \e\es+ .* blah$",
-     RE_Options()
-       .set_caseless(true)
-       .set_extended(true)
-       .set_multiline(true)).PartialMatch(sometext);
-.sp
-.
-.
-.SH "SCANNING TEXT INCREMENTALLY"
-.rs
-.sp
-The "Consume" operation may be useful if you want to repeatedly
-match regular expressions at the front of a string and skip over
-them as they match. This requires use of the "StringPiece" type,
-which represents a sub-range of a real string. Like RE, StringPiece
-is defined in the pcrecpp namespace.
-.sp
-  Example: read lines of the form "var = value" from a string.
-     string contents = ...;                 // Fill string somehow
-     pcrecpp::StringPiece input(contents);  // Wrap in a StringPiece
-.sp
-     string var;
-     int value;
-     pcrecpp::RE re("(\e\ew+) = (\e\ed+)\en");
-     while (re.Consume(&input, &var, &value)) {
-       ...;
-     }
-.sp
-Each successful call to "Consume" will set "var/value", and also
-advance "input" so it points past the matched text.
-.P
-The "FindAndConsume" operation is similar to "Consume" but does not
-anchor your match at the beginning of the string. For example, you
-could extract all words from a string by repeatedly calling
-.sp
-  pcrecpp::RE("(\e\ew+)").FindAndConsume(&input, &word)
-.
-.
-.SH "PARSING HEX/OCTAL/C-RADIX NUMBERS"
-.rs
-.sp
-By default, if you pass a pointer to a numeric value, the
-corresponding text is interpreted as a base-10 number. You can
-instead wrap the pointer with a call to one of the operators Hex(),
-Octal(), or CRadix() to interpret the text in another base. The
-CRadix operator interprets C-style "0" (base-8) and "0x" (base-16)
-prefixes, but defaults to base-10.
-.sp
-  Example:
-    int a, b, c, d;
-    pcrecpp::RE re("(.*) (.*) (.*) (.*)");
-    re.FullMatch("100 40 0100 0x40",
-                 pcrecpp::Octal(&a), pcrecpp::Hex(&b),
-                 pcrecpp::CRadix(&c), pcrecpp::CRadix(&d));
-.sp
-will leave 64 in a, b, c, and d.
-.
-.
-.SH "REPLACING PARTS OF STRINGS"
-.rs
-.sp
-You can replace the first match of "pattern" in "str" with "rewrite".
-Within "rewrite", backslash-escaped digits (\e1 to \e9) can be
-used to insert text matching corresponding parenthesized group
-from the pattern. \e0 in "rewrite" refers to the entire matching
-text. For example:
-.sp
-  string s = "yabba dabba doo";
-  pcrecpp::RE("b+").Replace("d", &s);
-.sp
-will leave "s" containing "yada dabba doo". The result is true if the pattern
-matches and a replacement occurs, false otherwise.
-.P
-\fBGlobalReplace\fP is like \fBReplace\fP except that it replaces all
-occurrences of the pattern in the string with the rewrite. Replacements are
-not subject to re-matching. For example:
-.sp
-  string s = "yabba dabba doo";
-  pcrecpp::RE("b+").GlobalReplace("d", &s);
-.sp
-will leave "s" containing "yada dada doo". It returns the number of
-replacements made.
-.P
-\fBExtract\fP is like \fBReplace\fP, except that if the pattern matches,
-"rewrite" is copied into "out" (an additional argument) with substitutions.
-The non-matching portions of "text" are ignored. Returns true iff a match
-occurred and the extraction happened successfully;  if no match occurs, the
-string is left unaffected.
-.
-.
-.SH AUTHOR
-.rs
-.sp
-.nf
-The C++ wrapper was contributed by Google Inc.
-Copyright (c) 2007 Google Inc.
-.fi
-.
-.
-.SH REVISION
-.rs
-.sp
-.nf
-Last updated: 08 January 2012
-.fi
diff --git a/dist/doc/pcredemo.3 b/dist/doc/pcredemo.3
deleted file mode 100644
index 194629b..0000000
--- a/dist/doc/pcredemo.3
+++ /dev/null
@@ -1,424 +0,0 @@
-.\" Start example.
-.de EX
-.  nr mE \\n(.f
-.  nf
-.  nh
-.  ft CW
-..
-.
-.
-.\" End example.
-.de EE
-.  ft \\n(mE
-.  fi
-.  hy \\n(HY
-..
-.
-.EX
-/*************************************************
-*           PCRE DEMONSTRATION PROGRAM           *
-*************************************************/
-
-/* This is a demonstration program to illustrate the most straightforward ways
-of calling the PCRE regular expression library from a C program. See the
-pcresample documentation for a short discussion ("man pcresample" if you have
-the PCRE man pages installed).
-
-In Unix-like environments, if PCRE is installed in your standard system
-libraries, you should be able to compile this program using this command:
-
-gcc -Wall pcredemo.c -lpcre -o pcredemo
-
-If PCRE is not installed in a standard place, it is likely to be installed with
-support for the pkg-config mechanism. If you have pkg-config, you can compile
-this program using this command:
-
-gcc -Wall pcredemo.c `pkg-config --cflags --libs libpcre` -o pcredemo
-
-If you do not have pkg-config, you may have to use this:
-
-gcc -Wall pcredemo.c -I/usr/local/include -L/usr/local/lib \e
-  -R/usr/local/lib -lpcre -o pcredemo
-
-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.
-
-Building under Windows:
-
-If you want to statically link this program against a non-dll .a file, you must
-define PCRE_STATIC before including pcre.h, otherwise the pcre_malloc() and
-pcre_free() exported functions will be declared __declspec(dllimport), with
-unwanted results. So in this environment, uncomment the following line. */
-
-/* #define PCRE_STATIC */
-
-#include <stdio.h>
-#include <string.h>
-#include <pcre.h>
-
-#define OVECCOUNT 30    /* should be a multiple of 3 */
-
-
-int main(int argc, char **argv)
-{
-pcre *re;
-const char *error;
-char *pattern;
-char *subject;
-unsigned char *name_table;
-unsigned int option_bits;
-int erroffset;
-int find_all;
-int crlf_is_newline;
-int namecount;
-int name_entry_size;
-int ovector[OVECCOUNT];
-int subject_length;
-int rc, i;
-int utf8;
-
-
-/**************************************************************************
-* 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++)
-  {
-  if (strcmp(argv[i], "-g") == 0) find_all = 1;
-    else break;
-  }
-
-/* After the options, we require exactly two arguments, which are the pattern,
-and the subject string. */
-
-if (argc - i != 2)
-  {
-  printf("Two arguments required: a regex and a subject string\en");
-  return 1;
-  }
-
-pattern = argv[i];
-subject = argv[i+1];
-subject_length = (int)strlen(subject);
-
-
-/*************************************************************************
-* Now we are going to compile the regular expression pattern, and handle *
-* and errors that are detected.                                          *
-*************************************************************************/
-
-re = pcre_compile(
-  pattern,              /* the pattern */
-  0,                    /* default options */
-  &error,               /* for error message */
-  &erroffset,           /* for error offset */
-  NULL);                /* use default character tables */
-
-/* Compilation failed: print the error message and exit */
-
-if (re == NULL)
-  {
-  printf("PCRE compilation failed at offset %d: %s\en", erroffset, error);
-  return 1;
-  }
-
-
-/*************************************************************************
-* If the compilation succeeded, we call PCRE again, in order to do a     *
-* pattern match against the subject string. This does just ONE match. If *
-* further matching is needed, it will be done below.                     *
-*************************************************************************/
-
-rc = pcre_exec(
-  re,                   /* the compiled pattern */
-  NULL,                 /* no extra data - we didn't study the pattern */
-  subject,              /* the subject string */
-  subject_length,       /* the length of the subject */
-  0,                    /* start at offset 0 in the subject */
-  0,                    /* default options */
-  ovector,              /* output vector for substring information */
-  OVECCOUNT);           /* number of elements in the output vector */
-
-/* Matching failed: handle error cases */
-
-if (rc < 0)
-  {
-  switch(rc)
-    {
-    case PCRE_ERROR_NOMATCH: printf("No match\en"); break;
-    /*
-    Handle other special cases if you like
-    */
-    default: printf("Matching error %d\en", rc); break;
-    }
-  pcre_free(re);     /* Release memory used for the compiled pattern */
-  return 1;
-  }
-
-/* Match succeded */
-
-printf("\enMatch succeeded at offset %d\en", ovector[0]);
-
-
-/*************************************************************************
-* We have found the first match within the subject string. If the output *
-* vector wasn't big enough, say so. Then output any substrings that were *
-* captured.                                                              *
-*************************************************************************/
-
-/* The output vector wasn't big enough */
-
-if (rc == 0)
-  {
-  rc = OVECCOUNT/3;
-  printf("ovector only has room for %d captured substrings\en", rc - 1);
-  }
-
-/* Show substrings stored in the output vector by number. Obviously, in a real
-application you might want to do things other than print them. */
-
-for (i = 0; i < rc; i++)
-  {
-  char *substring_start = subject + ovector[2*i];
-  int substring_length = ovector[2*i+1] - ovector[2*i];
-  printf("%2d: %.*s\en", i, substring_length, substring_start);
-  }
-
-
-/**************************************************************************
-* That concludes the basic part of this demonstration program. We have    *
-* compiled a pattern, and performed a single match. The code that follows *
-* shows first 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. */
-
-(void)pcre_fullinfo(
-  re,                   /* the compiled pattern */
-  NULL,                 /* no extra data - we didn't study the pattern */
-  PCRE_INFO_NAMECOUNT,  /* number of named substrings */
-  &namecount);          /* where to put the answer */
-
-if (namecount <= 0) printf("No named substrings\en"); else
-  {
-  unsigned char *tabptr;
-  printf("Named substrings\en");
-
-  /* Before we can access the substrings, we must extract the table for
-  translating names to numbers, and the size of each entry in the table. */
-
-  (void)pcre_fullinfo(
-    re,                       /* the compiled pattern */
-    NULL,                     /* no extra data - we didn't study the pattern */
-    PCRE_INFO_NAMETABLE,      /* address of the table */
-    &name_table);             /* where to put the answer */
-
-  (void)pcre_fullinfo(
-    re,                       /* the compiled pattern */
-    NULL,                     /* no extra data - we didn't study the pattern */
-    PCRE_INFO_NAMEENTRYSIZE,  /* size of each entry in the table */
-    &name_entry_size);        /* where to put the answer */
-
-  /* Now we can scan the table and, for each entry, print the number, the name,
-  and the substring itself. */
-
-  tabptr = name_table;
-  for (i = 0; i < namecount; i++)
-    {
-    int n = (tabptr[0] << 8) | tabptr[1];
-    printf("(%d) %*s: %.*s\en", n, name_entry_size - 3, tabptr + 2,
-      ovector[2*n+1] - ovector[2*n], subject + ovector[2*n]);
-    tabptr += name_entry_size;
-    }
-  }
-
-
-/*************************************************************************
-* If the "-g" option was given on the command line, we want to continue  *
-* to search for additional matches in the subject string, in a similar   *
-* way to the /g option in Perl. This turns out to be trickier than you   *
-* might think because of the possibility of matching an empty string.    *
-* What happens is as follows:                                            *
-*                                                                        *
-* If the previous match was NOT for an empty string, we can just start   *
-* the next match at the end of the previous one.                         *
-*                                                                        *
-* If the previous match WAS for an empty string, we can't do that, as it *
-* would lead to an infinite loop. Instead, a special call of pcre_exec() *
-* is made with the PCRE_NOTEMPTY_ATSTART and PCRE_ANCHORED flags set.    *
-* The first of these tells PCRE that an empty string at the start of the *
-* subject is not a valid match; other possibilities must be tried. The   *
-* second flag restricts PCRE to one match attempt at the initial string  *
-* position. If this match succeeds, an alternative to the empty string   *
-* match has been found, and we can print it and proceed round the loop,  *
-* advancing by the length of whatever was found. If this match does not  *
-* succeed, we still stay in the loop, advancing by just one character.   *
-* In UTF-8 mode, which can be set by (*UTF8) in the pattern, this may be *
-* more than one byte.                                                    *
-*                                                                        *
-* However, there is a complication concerned with newlines. When the     *
-* newline convention is such that CRLF is a valid newline, we must       *
-* advance by two characters rather than one. The newline convention can  *
-* be set in the regex by (*CR), etc.; if not, we must find the default.  *
-*************************************************************************/
-
-if (!find_all)     /* Check for -g */
-  {
-  pcre_free(re);   /* Release the memory used for the compiled pattern */
-  return 0;        /* Finish unless -g was given */
-  }
-
-/* Before running the loop, check for UTF-8 and whether CRLF is a valid newline
-sequence. First, find the options with which the regex was compiled; extract
-the UTF-8 state, and mask off all but the newline options. */
-
-(void)pcre_fullinfo(re, NULL, PCRE_INFO_OPTIONS, &option_bits);
-utf8 = option_bits & PCRE_UTF8;
-option_bits &= PCRE_NEWLINE_CR|PCRE_NEWLINE_LF|PCRE_NEWLINE_CRLF|
-               PCRE_NEWLINE_ANY|PCRE_NEWLINE_ANYCRLF;
-
-/* If no newline options were set, find the default newline convention from the
-build configuration. */
-
-if (option_bits == 0)
-  {
-  int d;
-  (void)pcre_config(PCRE_CONFIG_NEWLINE, &d);
-  /* Note that these values are always the ASCII ones, even in
-  EBCDIC environments. CR = 13, NL = 10. */
-  option_bits = (d == 13)? PCRE_NEWLINE_CR :
-          (d == 10)? PCRE_NEWLINE_LF :
-          (d == (13<<8 | 10))? PCRE_NEWLINE_CRLF :
-          (d == -2)? PCRE_NEWLINE_ANYCRLF :
-          (d == -1)? PCRE_NEWLINE_ANY : 0;
-  }
-
-/* See if CRLF is a valid newline sequence. */
-
-crlf_is_newline =
-     option_bits == PCRE_NEWLINE_ANY ||
-     option_bits == PCRE_NEWLINE_CRLF ||
-     option_bits == PCRE_NEWLINE_ANYCRLF;
-
-/* Loop for second and subsequent matches */
-
-for (;;)
-  {
-  int options = 0;                 /* Normally no options */
-  int start_offset = ovector[1];   /* Start at end of previous match */
-
-  /* If the previous match was for an empty string, we are finished if we are
-  at the end of the subject. Otherwise, arrange to run another match at the
-  same point to see if a non-empty match can be found. */
-
-  if (ovector[0] == ovector[1])
-    {
-    if (ovector[0] == subject_length) break;
-    options = PCRE_NOTEMPTY_ATSTART | PCRE_ANCHORED;
-    }
-
-  /* Run the next matching operation */
-
-  rc = pcre_exec(
-    re,                   /* the compiled pattern */
-    NULL,                 /* no extra data - we didn't study the pattern */
-    subject,              /* the subject string */
-    subject_length,       /* the length of the subject */
-    start_offset,         /* starting offset in the subject */
-    options,              /* options */
-    ovector,              /* output vector for substring information */
-    OVECCOUNT);           /* number of elements in the output vector */
-
-  /* This time, a result of NOMATCH isn't an error. If the value in "options"
-  is zero, it just means we have found all possible matches, so the loop ends.
-  Otherwise, it means we have failed to find a non-empty-string match at a
-  point where there was a previous empty-string match. In this case, we do what
-  Perl does: advance the matching position by one character, and continue. We
-  do this by setting the "end of previous match" offset, because that is picked
-  up at the top of the loop as the point at which to start again.
-
-  There are two complications: (a) When CRLF is a valid newline sequence, and
-  the current position is just before it, advance by an extra byte. (b)
-  Otherwise we must ensure that we skip an entire UTF-8 character if we are in
-  UTF-8 mode. */
-
-  if (rc == PCRE_ERROR_NOMATCH)
-    {
-    if (options == 0) break;                    /* All matches found */
-    ovector[1] = start_offset + 1;              /* Advance one byte */
-    if (crlf_is_newline &&                      /* If CRLF is newline & */
-        start_offset < subject_length - 1 &&    /* we are at CRLF, */
-        subject[start_offset] == '\er' &&
-        subject[start_offset + 1] == '\en')
-      ovector[1] += 1;                          /* Advance by one more. */
-    else if (utf8)                              /* Otherwise, ensure we */
-      {                                         /* advance a whole UTF-8 */
-      while (ovector[1] < subject_length)       /* character. */
-        {
-        if ((subject[ovector[1]] & 0xc0) != 0x80) break;
-        ovector[1] += 1;
-        }
-      }
-    continue;    /* Go round the loop again */
-    }
-
-  /* Other matching errors are not recoverable. */
-
-  if (rc < 0)
-    {
-    printf("Matching error %d\en", rc);
-    pcre_free(re);    /* Release memory used for the compiled pattern */
-    return 1;
-    }
-
-  /* Match succeded */
-
-  printf("\enMatch succeeded again at offset %d\en", ovector[0]);
-
-  /* The match succeeded, but the output vector wasn't big enough. */
-
-  if (rc == 0)
-    {
-    rc = OVECCOUNT/3;
-    printf("ovector only has room for %d captured substrings\en", rc - 1);
-    }
-
-  /* As before, show substrings stored in the output vector by number, and then
-  also any named substrings. */
-
-  for (i = 0; i < rc; i++)
-    {
-    char *substring_start = subject + ovector[2*i];
-    int substring_length = ovector[2*i+1] - ovector[2*i];
-    printf("%2d: %.*s\en", i, substring_length, substring_start);
-    }
-
-  if (namecount <= 0) printf("No named substrings\en"); else
-    {
-    unsigned char *tabptr = name_table;
-    printf("Named substrings\en");
-    for (i = 0; i < namecount; i++)
-      {
-      int n = (tabptr[0] << 8) | tabptr[1];
-      printf("(%d) %*s: %.*s\en", n, name_entry_size - 3, tabptr + 2,
-        ovector[2*n+1] - ovector[2*n], subject + ovector[2*n]);
-      tabptr += name_entry_size;
-      }
-    }
-  }      /* End of loop to find second and subsequent matches */
-
-printf("\en");
-pcre_free(re);       /* Release memory used for the compiled pattern */
-return 0;
-}
-
-/* End of pcredemo.c */
-.EE
diff --git a/dist/doc/pcregrep.txt b/dist/doc/pcregrep.txt
deleted file mode 100644
index 97d9a7b..0000000
--- a/dist/doc/pcregrep.txt
+++ /dev/null
@@ -1,741 +0,0 @@
-PCREGREP(1)                 General Commands Manual                PCREGREP(1)
-
-
-
-NAME
-       pcregrep - a grep with Perl-compatible regular expressions.
-
-SYNOPSIS
-       pcregrep [options] [long options] [pattern] [path1 path2 ...]
-
-
-DESCRIPTION
-
-       pcregrep  searches  files  for  character  patterns, in the same way as
-       other grep commands do, but it uses the PCRE regular expression library
-       to support patterns that are compatible with the regular expressions of
-       Perl 5. See pcresyntax(3) for a quick-reference summary of pattern syn-
-       tax,  or pcrepattern(3) for a full description of the syntax and seman-
-       tics of the regular expressions that PCRE supports.
-
-       Patterns, whether supplied on the command line or in a  separate  file,
-       are given without delimiters. For example:
-
-         pcregrep Thursday /etc/motd
-
-       If you attempt to use delimiters (for example, by surrounding a pattern
-       with slashes, as is common in Perl scripts), they  are  interpreted  as
-       part  of  the pattern. Quotes can of course be used to delimit patterns
-       on the command line because they are  interpreted  by  the  shell,  and
-       indeed  quotes  are required if a pattern contains white space or shell
-       metacharacters.
-
-       The first argument that follows any option settings is treated  as  the
-       single  pattern  to be matched when neither -e nor -f is present.  Con-
-       versely, when one or both of these options are  used  to  specify  pat-
-       terns, all arguments are treated as path names. At least one of -e, -f,
-       or an argument pattern must be provided.
-
-       If no files are specified, pcregrep reads the standard input. The stan-
-       dard  input  can  also  be  referenced by a name consisting of a single
-       hyphen.  For example:
-
-         pcregrep some-pattern /file1 - /file3
-
-       By default, each line that matches a pattern is copied to the  standard
-       output,  and if there is more than one file, the file name is output at
-       the start of each line, followed by a colon. However, there are options
-       that  can  change  how  pcregrep  behaves. In particular, the -M option
-       makes it possible to search for patterns  that  span  line  boundaries.
-       What  defines  a  line  boundary  is  controlled  by the -N (--newline)
-       option.
-
-       The amount of memory used for buffering files that are being scanned is
-       controlled  by a parameter that can be set by the --buffer-size option.
-       The default value for this parameter  is  specified  when  pcregrep  is
-       built,  with  the  default  default  being 20K. A block of memory three
-       times this size is used (to allow for buffering  "before"  and  "after"
-       lines). An error occurs if a line overflows the buffer.
-
-       Patterns  can  be  no  longer than 8K or BUFSIZ bytes, whichever is the
-       greater.  BUFSIZ is defined in <stdio.h>. When there is more  than  one
-       pattern (specified by the use of -e and/or -f), each pattern is applied
-       to each line in the order in which they are defined,  except  that  all
-       the -e patterns are tried before the -f patterns.
-
-       By  default, as soon as one pattern matches a line, no further patterns
-       are considered. However, if --colour (or --color) is used to colour the
-       matching  substrings, or if --only-matching, --file-offsets, or --line-
-       offsets is used to output only  the  part  of  the  line  that  matched
-       (either shown literally, or as an offset), scanning resumes immediately
-       following the match, so that further matches on the same  line  can  be
-       found.  If  there  are  multiple  patterns,  they  are all tried on the
-       remainder of the line, but patterns that follow the  one  that  matched
-       are not tried on the earlier part of the line.
-
-       This  behaviour  means  that  the  order in which multiple patterns are
-       specified can affect the output when one of the above options is  used.
-       This  is no longer the same behaviour as GNU grep, which now manages to
-       display earlier matches for later patterns (as  long  as  there  is  no
-       overlap).
-
-       Patterns  that can match an empty string are accepted, but empty string
-       matches   are   never   recognized.   An   example   is   the   pattern
-       "(super)?(man)?",  in  which  all components are optional. This pattern
-       finds all occurrences of both "super" and  "man";  the  output  differs
-       from  matching  with  "super|man" when only the matching substrings are
-       being shown.
-
-       If the LC_ALL or LC_CTYPE environment variable is  set,  pcregrep  uses
-       the  value to set a locale when calling the PCRE library.  The --locale
-       option can be used to override this.
-
-
-SUPPORT FOR COMPRESSED FILES
-
-       It is possible to compile pcregrep so that it uses libz  or  libbz2  to
-       read  files  whose names end in .gz or .bz2, respectively. You can find
-       out whether your binary has support for one or both of these file types
-       by running it with the --help option. If the appropriate support is not
-       present, files are treated as plain text. The standard input is  always
-       so treated.
-
-
-BINARY FILES
-
-       By  default,  a  file that contains a binary zero byte within the first
-       1024 bytes is identified as a binary file, and is processed  specially.
-       (GNU  grep  also  identifies  binary  files  in  this  manner.) See the
-       --binary-files option for a means of changing the way binary files  are
-       handled.
-
-
-OPTIONS
-
-       The  order  in  which some of the options appear can affect the output.
-       For example, both the -h and -l options affect  the  printing  of  file
-       names.  Whichever  comes later in the command line will be the one that
-       takes effect. Similarly, except where noted  below,  if  an  option  is
-       given  twice,  the  later setting is used. Numerical values for options
-       may be followed by K  or  M,  to  signify  multiplication  by  1024  or
-       1024*1024 respectively.
-
-       --        This terminates the list of options. It is useful if the next
-                 item on the command line starts with a hyphen but is  not  an
-                 option.  This allows for the processing of patterns and file-
-                 names that start with hyphens.
-
-       -A number, --after-context=number
-                 Output number lines of context after each matching  line.  If
-                 filenames and/or line numbers are being output, a hyphen sep-
-                 arator is used instead of a colon for the  context  lines.  A
-                 line  containing  "--" is output between each group of lines,
-                 unless they are in fact contiguous in  the  input  file.  The
-                 value  of number is expected to be relatively small. However,
-                 pcregrep guarantees to have up to 8K of following text avail-
-                 able for context output.
-
-       -a, --text
-                 Treat  binary  files as text. This is equivalent to --binary-
-                 files=text.
-
-       -B number, --before-context=number
-                 Output number lines of context before each matching line.  If
-                 filenames and/or line numbers are being output, a hyphen sep-
-                 arator is used instead of a colon for the  context  lines.  A
-                 line  containing  "--" is output between each group of lines,
-                 unless they are in fact contiguous in  the  input  file.  The
-                 value  of number is expected to be relatively small. However,
-                 pcregrep guarantees to have up to 8K of preceding text avail-
-                 able for context output.
-
-       --binary-files=word
-                 Specify  how binary files are to be processed. If the word is
-                 "binary" (the default),  pattern  matching  is  performed  on
-                 binary  files,  but  the  only  output is "Binary file <name>
-                 matches" when a match succeeds. If the word is "text",  which
-                 is  equivalent  to  the -a or --text option, binary files are
-                 processed in the same way as any other file.  In  this  case,
-                 when  a  match  succeeds,  the  output may be binary garbage,
-                 which can have nasty effects if sent to a  terminal.  If  the
-                 word  is  "without-match",  which  is  equivalent  to  the -I
-                 option, binary files are  not  processed  at  all;  they  are
-                 assumed not to be of interest.
-
-       --buffer-size=number
-                 Set  the  parameter that controls how much memory is used for
-                 buffering files that are being scanned.
-
-       -C number, --context=number
-                 Output number lines of context both  before  and  after  each
-                 matching  line.  This is equivalent to setting both -A and -B
-                 to the same value.
-
-       -c, --count
-                 Do not output individual lines from the files that are  being
-                 scanned; instead output the number of lines that would other-
-                 wise have been shown. If no lines are  selected,  the  number
-                 zero  is  output.  If  several files are are being scanned, a
-                 count is output for each of them. However,  if  the  --files-
-                 with-matches  option  is  also  used,  only those files whose
-                 counts are greater than zero are listed. When -c is used, the
-                 -A, -B, and -C options are ignored.
-
-       --colour, --color
-                 If this option is given without any data, it is equivalent to
-                 "--colour=auto".  If data is required, it must  be  given  in
-                 the same shell item, separated by an equals sign.
-
-       --colour=value, --color=value
-                 This option specifies under what circumstances the parts of a
-                 line that matched a pattern should be coloured in the output.
-                 By  default,  the output is not coloured. The value (which is
-                 optional, see above) may be "never", "always", or "auto".  In
-                 the  latter case, colouring happens only if the standard out-
-                 put is connected to a terminal. More resources are used  when
-                 colouring  is enabled, because pcregrep has to search for all
-                 possible matches in a line, not just one, in order to  colour
-                 them all.
-
-                 The colour that is used can be specified by setting the envi-
-                 ronment variable PCREGREP_COLOUR or PCREGREP_COLOR. The value
-                 of this variable should be a string of two numbers, separated
-                 by a semicolon. They are copied  directly  into  the  control
-                 string  for  setting  colour  on  a  terminal,  so it is your
-                 responsibility to ensure that they make sense. If neither  of
-                 the  environment  variables  is  set,  the default is "1;31",
-                 which gives red.
-
-       -D action, --devices=action
-                 If an input path is  not  a  regular  file  or  a  directory,
-                 "action"  specifies  how  it is to be processed. Valid values
-                 are "read" (the default) or "skip" (silently skip the path).
-
-       -d action, --directories=action
-                 If an input path is a directory, "action" specifies how it is
-                 to  be  processed.   Valid  values are "read" (the default in
-                 non-Windows environments, for compatibility with  GNU  grep),
-                 "recurse"  (equivalent to the -r option), or "skip" (silently
-                 skip the path, the default in Windows environments).  In  the
-                 "read"  case,  directories  are read as if they were ordinary
-                 files. In some operating systems  the  effect  of  reading  a
-                 directory like this is an immediate end-of-file; in others it
-                 may provoke an error.
-
-       -e pattern, --regex=pattern, --regexp=pattern
-                 Specify a pattern to be matched. This option can be used mul-
-                 tiple times in order to specify several patterns. It can also
-                 be used as a way of specifying a single pattern  that  starts
-                 with  a hyphen. When -e is used, no argument pattern is taken
-                 from the command line; all  arguments  are  treated  as  file
-                 names.  There is no limit to the number of patterns. They are
-                 applied to each line in the order in which they  are  defined
-                 until one matches.
-
-                 If  -f is used with -e, the command line patterns are matched
-                 first, followed by the patterns from the file(s), independent
-                 of  the order in which these options are specified. Note that
-                 multiple use of -e is not the same as a single  pattern  with
-                 alternatives. For example, X|Y finds the first character in a
-                 line that is X or Y, whereas if the two  patterns  are  given
-                 separately,  with X first, pcregrep finds X if it is present,
-                 even if it follows Y in the line. It finds Y only if there is
-                 no  X  in  the line. This matters only if you are using -o or
-                 --colo(u)r to show the part(s) of the line that matched.
-
-       --exclude=pattern
-                 Files (but not directories) whose names match the pattern are
-                 skipped  without  being processed. This applies to all files,
-                 whether listed on the command  line,  obtained  from  --file-
-                 list, or by scanning a directory. The pattern is a PCRE regu-
-                 lar expression, and is matched against the final component of
-                 the  file  name,  not  the  entire  path.  The -F, -w, and -x
-                 options do not apply to this pattern. The option may be given
-                 any number of times in order to specify multiple patterns. If
-                 a file name matches both an --include and an  --exclude  pat-
-                 tern, it is excluded. There is no short form for this option.
-
-       --exclude-from=filename
-                 Treat  each  non-empty  line  of  the file as the data for an
-                 --exclude option. What constitutes a newline when reading the
-                 file  is the operating system's default. The --newline option
-                 has no effect on this option. This option may be  given  more
-                 than once in order to specify a number of files to read.
-
-       --exclude-dir=pattern
-                 Directories whose names match the pattern are skipped without
-                 being processed, whatever  the  setting  of  the  --recursive
-                 option.  This  applies  to all directories, whether listed on
-                 the command line, obtained from --file-list, or by scanning a
-                 parent  directory.  The pattern is a PCRE regular expression,
-                 and is matched against the final component of  the  directory
-                 name,  not the entire path. The -F, -w, and -x options do not
-                 apply to this pattern. The option may be given any number  of
-                 times  in order to specify more than one pattern. If a direc-
-                 tory matches both  --include-dir  and  --exclude-dir,  it  is
-                 excluded. There is no short form for this option.
-
-       -F, --fixed-strings
-                 Interpret  each  data-matching  pattern  as  a  list of fixed
-                 strings, separated by  newlines,  instead  of  as  a  regular
-                 expression.  What  constitutes  a newline for this purpose is
-                 controlled by the --newline option. The -w (match as a  word)
-                 and  -x (match whole line) options can be used with -F.  They
-                 apply to each of the fixed strings. A line is selected if any
-                 of the fixed strings are found in it (subject to -w or -x, if
-                 present). This option applies only to the patterns  that  are
-                 matched  against  the contents of files; it does not apply to
-                 patterns specified by  any  of  the  --include  or  --exclude
-                 options.
-
-       -f filename, --file=filename
-                 Read  patterns  from  the  file, one per line, and match them
-                 against each line of input. What constitutes a  newline  when
-                 reading  the  file  is  the  operating  system's default. The
-                 --newline option has no effect on this option. Trailing white
-                 space is removed from each line, and blank lines are ignored.
-                 An empty file contains  no  patterns  and  therefore  matches
-                 nothing. See also the comments about multiple patterns versus
-                 a single pattern with alternatives in the description  of  -e
-                 above.
-
-                 If  this  option  is  given more than once, all the specified
-                 files are read. A data line is output if any of the  patterns
-                 match  it.  A  filename  can  be given as "-" to refer to the
-                 standard input. When -f is used, patterns  specified  on  the
-                 command  line  using  -e may also be present; they are tested
-                 before the file's patterns.  However,  no  other  pattern  is
-                 taken from the command line; all arguments are treated as the
-                 names of paths to be searched.
-
-       --file-list=filename
-                 Read a list of  files  and/or  directories  that  are  to  be
-                 scanned  from  the  given  file, one per line. Trailing white
-                 space is removed from each line, and blank lines are ignored.
-                 These  paths  are processed before any that are listed on the
-                 command line. The filename can be given as "-"  to  refer  to
-                 the standard input.  If --file and --file-list are both spec-
-                 ified as "-", patterns are read first. This  is  useful  only
-                 when  the  standard  input  is a terminal, from which further
-                 lines (the list of files) can be read  after  an  end-of-file
-                 indication.  If  this option is given more than once, all the
-                 specified files are read.
-
-       --file-offsets
-                 Instead of showing lines or parts of lines that  match,  show
-                 each  match  as  an  offset  from the start of the file and a
-                 length, separated by a comma. In this  mode,  no  context  is
-                 shown.  That  is,  the -A, -B, and -C options are ignored. If
-                 there is more than one match in a line, each of them is shown
-                 separately.  This  option  is mutually exclusive with --line-
-                 offsets and --only-matching.
-
-       -H, --with-filename
-                 Force the inclusion of the filename at the  start  of  output
-                 lines  when searching a single file. By default, the filename
-                 is not shown in this case. For matching lines,  the  filename
-                 is followed by a colon; for context lines, a hyphen separator
-                 is used. If a line number is also being  output,  it  follows
-                 the file name.
-
-       -h, --no-filename
-                 Suppress  the output filenames when searching multiple files.
-                 By default, filenames  are  shown  when  multiple  files  are
-                 searched.  For  matching lines, the filename is followed by a
-                 colon; for context lines, a hyphen separator is used.   If  a
-                 line number is also being output, it follows the file name.
-
-       --help    Output  a  help  message, giving brief details of the command
-                 options and file type support, and then exit.  Anything  else
-                 on the command line is ignored.
-
-       -I        Treat  binary  files as never matching. This is equivalent to
-                 --binary-files=without-match.
-
-       -i, --ignore-case
-                 Ignore upper/lower case distinctions during comparisons.
-
-       --include=pattern
-                 If any --include patterns are specified, the only files  that
-                 are  processed  are those that match one of the patterns (and
-                 do not match an --exclude  pattern).  This  option  does  not
-                 affect  directories,  but  it  applies  to all files, whether
-                 listed on the command line, obtained from --file-list, or  by
-                 scanning  a  directory. The pattern is a PCRE regular expres-
-                 sion, and is matched against the final component of the  file
-                 name,  not the entire path. The -F, -w, and -x options do not
-                 apply to this pattern. The option may be given any number  of
-                 times.  If  a  file  name  matches  both  an --include and an
-                 --exclude pattern, it is excluded.  There is  no  short  form
-                 for this option.
-
-       --include-from=filename
-                 Treat  each  non-empty  line  of  the file as the data for an
-                 --include option. What constitutes a newline for this purpose
-                 is  the  operating system's default. The --newline option has
-                 no effect on this option. This option may be given any number
-                 of times; all the files are read.
-
-       --include-dir=pattern
-                 If  any --include-dir patterns are specified, the only direc-
-                 tories that are processed are those that  match  one  of  the
-                 patterns  (and  do  not match an --exclude-dir pattern). This
-                 applies to all directories, whether  listed  on  the  command
-                 line,  obtained  from  --file-list,  or  by scanning a parent
-                 directory. The pattern is a PCRE regular expression,  and  is
-                 matched  against  the  final component of the directory name,
-                 not the entire path. The -F, -w, and -x options do not  apply
-                 to this pattern. The option may be given any number of times.
-                 If a directory matches both --include-dir and  --exclude-dir,
-                 it is excluded. There is no short form for this option.
-
-       -L, --files-without-match
-                 Instead  of  outputting lines from the files, just output the
-                 names of the files that do not contain any lines  that  would
-                 have  been  output. Each file name is output once, on a sepa-
-                 rate line.
-
-       -l, --files-with-matches
-                 Instead of outputting lines from the files, just  output  the
-                 names of the files containing lines that would have been out-
-                 put. Each file name is  output  once,  on  a  separate  line.
-                 Searching  normally stops as soon as a matching line is found
-                 in a file. However, if the -c (count) option  is  also  used,
-                 matching  continues in order to obtain the correct count, and
-                 those files that have at least one  match  are  listed  along
-                 with their counts. Using this option with -c is a way of sup-
-                 pressing the listing of files with no matches.
-
-       --label=name
-                 This option supplies a name to be used for the standard input
-                 when file names are being output. If not supplied, "(standard
-                 input)" is used. There is no short form for this option.
-
-       --line-buffered
-                 When this option is given, input is read and  processed  line
-                 by  line,  and  the  output  is  flushed after each write. By
-                 default, input is read in large chunks, unless  pcregrep  can
-                 determine  that  it is reading from a terminal (which is cur-
-                 rently possible only in Unix-like  environments).  Output  to
-                 terminal  is  normally automatically flushed by the operating
-                 system. This option can be useful when the input or output is
-                 attached  to a pipe and you do not want pcregrep to buffer up
-                 large amounts of data. However, its use will  affect  perfor-
-                 mance, and the -M (multiline) option ceases to work.
-
-       --line-offsets
-                 Instead  of  showing lines or parts of lines that match, show
-                 each match as a line number, the offset from the start of the
-                 line,  and a length. The line number is terminated by a colon
-                 (as usual; see the -n option), and the offset and length  are
-                 separated  by  a  comma.  In  this mode, no context is shown.
-                 That is, the -A, -B, and -C options are ignored. If there  is
-                 more  than  one  match in a line, each of them is shown sepa-
-                 rately. This option is mutually exclusive with --file-offsets
-                 and --only-matching.
-
-       --locale=locale-name
-                 This  option specifies a locale to be used for pattern match-
-                 ing. It overrides the value in the LC_ALL or  LC_CTYPE  envi-
-                 ronment  variables.  If  no  locale  is  specified,  the PCRE
-                 library's default (usually the "C" locale) is used. There  is
-                 no short form for this option.
-
-       --match-limit=number
-                 Processing  some  regular  expression  patterns can require a
-                 very large amount of memory, leading in some cases to a  pro-
-                 gram  crash  if  not enough is available.  Other patterns may
-                 take a very long time to search  for  all  possible  matching
-                 strings.  The pcre_exec() function that is called by pcregrep
-                 to do the matching has two  parameters  that  can  limit  the
-                 resources that it uses.
-
-                 The   --match-limit  option  provides  a  means  of  limiting
-                 resource usage when processing patterns that are not going to
-                 match, but which have a very large number of possibilities in
-                 their search trees. The classic example  is  a  pattern  that
-                 uses  nested unlimited repeats. Internally, PCRE uses a func-
-                 tion called match()  which  it  calls  repeatedly  (sometimes
-                 recursively).  The  limit  set by --match-limit is imposed on
-                 the number of times this function is called during  a  match,
-                 which  has  the effect of limiting the amount of backtracking
-                 that can take place.
-
-                 The --recursion-limit option is similar to --match-limit, but
-                 instead of limiting the total number of times that match() is
-                 called, it limits the depth of recursive calls, which in turn
-                 limits  the  amount of memory that can be used. The recursion
-                 depth is a smaller number than the  total  number  of  calls,
-                 because not all calls to match() are recursive. This limit is
-                 of use only if it is set smaller than --match-limit.
-
-                 There are no short forms for these options. The default  set-
-                 tings  are  specified when the PCRE library is compiled, with
-                 the default default being 10 million.
-
-       -M, --multiline
-                 Allow patterns to match more than one line. When this  option
-                 is given, patterns may usefully contain literal newline char-
-                 acters and internal occurrences of ^ and  $  characters.  The
-                 output  for  a  successful match may consist of more than one
-                 line, the last of which is the one in which the match  ended.
-                 If the matched string ends with a newline sequence the output
-                 ends at the end of that line.
-
-                 When this option is set, the PCRE library is called in  "mul-
-                 tiline"  mode.   There is a limit to the number of lines that
-                 can be matched, imposed by the way that pcregrep buffers  the
-                 input  file as it scans it. However, pcregrep ensures that at
-                 least 8K characters or the rest of the document (whichever is
-                 the  shorter)  are  available for forward matching, and simi-
-                 larly the previous 8K characters (or all the previous charac-
-                 ters,  if  fewer  than 8K) are guaranteed to be available for
-                 lookbehind assertions. This option does not work  when  input
-                 is read line by line (see --line-buffered.)
-
-       -N newline-type, --newline=newline-type
-                 The  PCRE  library  supports  five  different conventions for
-                 indicating the ends of lines. They are  the  single-character
-                 sequences  CR  (carriage  return) and LF (linefeed), the two-
-                 character sequence CRLF, an "anycrlf" convention, which  rec-
-                 ognizes  any  of the preceding three types, and an "any" con-
-                 vention, in which any Unicode line ending sequence is assumed
-                 to  end a line. The Unicode sequences are the three just men-
-                 tioned, plus  VT  (vertical  tab,  U+000B),  FF  (form  feed,
-                 U+000C),   NEL  (next  line,  U+0085),  LS  (line  separator,
-                 U+2028), and PS (paragraph separator, U+2029).
-
-                 When  the  PCRE  library  is  built,  a  default  line-ending
-                 sequence   is  specified.   This  is  normally  the  standard
-                 sequence for the operating system. Unless otherwise specified
-                 by  this  option,  pcregrep  uses the library's default.  The
-                 possible values for this option are CR, LF, CRLF, ANYCRLF, or
-                 ANY.  This  makes  it  possible to use pcregrep to scan files
-                 that have come from other environments without having to mod-
-                 ify  their  line  endings.  If the data that is being scanned
-                 does not agree with the convention set by this option,  pcre-
-                 grep  may  behave in strange ways. Note that this option does
-                 not apply to files specified by the  -f,  --exclude-from,  or
-                 --include-from options, which are expected to use the operat-
-                 ing system's standard newline sequence.
-
-       -n, --line-number
-                 Precede each output line by its line number in the file, fol-
-                 lowed  by  a colon for matching lines or a hyphen for context
-                 lines. If the filename is also being output, it precedes  the
-                 line number. This option is forced if --line-offsets is used.
-
-       --no-jit  If  the  PCRE  library is built with support for just-in-time
-                 compiling (which speeds up matching), pcregrep  automatically
-                 makes use of this, unless it was explicitly disabled at build
-                 time. This option can be used to disable the use  of  JIT  at
-                 run  time. It is provided for testing and working round prob-
-                 lems.  It should never be needed in normal use.
-
-       -o, --only-matching
-                 Show only the part of the line that matched a pattern instead
-                 of  the  whole  line. In this mode, no context is shown. That
-                 is, the -A, -B, and -C options are ignored. If there is  more
-                 than  one  match in a line, each of them is shown separately.
-                 If -o is combined with -v (invert the sense of the  match  to
-                 find  non-matching  lines),  no  output is generated, but the
-                 return code is set appropriately. If the matched  portion  of
-                 the  line is empty, nothing is output unless the file name or
-                 line number are being printed, in which case they  are  shown
-                 on an otherwise empty line. This option is mutually exclusive
-                 with --file-offsets and --line-offsets.
-
-       -onumber, --only-matching=number
-                 Show only the part of the line  that  matched  the  capturing
-                 parentheses of the given number. Up to 32 capturing parenthe-
-                 ses are supported, and -o0 is equivalent to -o without a num-
-                 ber.  Because  these options can be given without an argument
-                 (see above), if an argument is present, it must be  given  in
-                 the  same  shell item, for example, -o3 or --only-matching=2.
-                 The comments given for the non-argument case above also apply
-                 to  this  case. If the specified capturing parentheses do not
-                 exist in the pattern, or were not set in the  match,  nothing
-                 is  output  unless  the  file  name  or line number are being
-                 printed.
-
-                 If this option is given multiple times,  multiple  substrings
-                 are  output, in the order the options are given. For example,
-                 -o3 -o1 -o3 causes the substrings matched by capturing paren-
-                 theses  3  and  1  and then 3 again to be output. By default,
-                 there is no separator (but see the next option).
-
-       --om-separator=text
-                 Specify a separating string for multiple occurrences  of  -o.
-                 The  default is an empty string. Separating strings are never
-                 coloured.
-
-       -q, --quiet
-                 Work quietly, that is, display nothing except error messages.
-                 The  exit  status  indicates  whether or not any matches were
-                 found.
-
-       -r, --recursive
-                 If any given path is a directory, recursively scan the  files
-                 it  contains, taking note of any --include and --exclude set-
-                 tings. By default, a directory is read as a normal  file;  in
-                 some  operating  systems this gives an immediate end-of-file.
-                 This option is a shorthand  for  setting  the  -d  option  to
-                 "recurse".
-
-       --recursion-limit=number
-                 See --match-limit above.
-
-       -s, --no-messages
-                 Suppress  error  messages  about  non-existent  or unreadable
-                 files. Such files are quietly skipped.  However,  the  return
-                 code is still 2, even if matches were found in other files.
-
-       -u, --utf-8
-                 Operate  in UTF-8 mode. This option is available only if PCRE
-                 has been compiled with UTF-8 support. All patterns (including
-                 those  for  any --exclude and --include options) and all sub-
-                 ject lines that are scanned must be valid  strings  of  UTF-8
-                 characters.
-
-       -V, --version
-                 Write the version numbers of pcregrep and the PCRE library to
-                 the standard output and then exit. Anything else on the  com-
-                 mand line is ignored.
-
-       -v, --invert-match
-                 Invert  the  sense  of  the match, so that lines which do not
-                 match any of the patterns are the ones that are found.
-
-       -w, --word-regex, --word-regexp
-                 Force the patterns to match only whole words. This is equiva-
-                 lent  to  having \b at the start and end of the pattern. This
-                 option applies only to the patterns that are matched  against
-                 the  contents  of files; it does not apply to patterns speci-
-                 fied by any of the --include or --exclude options.
-
-       -x, --line-regex, --line-regexp
-                 Force the patterns to be anchored (each must  start  matching
-                 at  the beginning of a line) and in addition, require them to
-                 match entire lines. This is equivalent  to  having  ^  and  $
-                 characters at the start and end of each alternative branch in
-                 every pattern. This option applies only to the patterns  that
-                 are  matched against the contents of files; it does not apply
-                 to patterns specified by any of the  --include  or  --exclude
-                 options.
-
-
-ENVIRONMENT VARIABLES
-
-       The  environment  variables  LC_ALL  and LC_CTYPE are examined, in that
-       order, for a locale. The first one that is set is  used.  This  can  be
-       overridden  by  the  --locale  option.  If  no  locale is set, the PCRE
-       library's default (usually the "C" locale) is used.
-
-
-NEWLINES
-
-       The -N (--newline) option allows pcregrep to scan files with  different
-       newline conventions from the default. Any parts of the input files that
-       are written to the standard output are copied identically,  with  what-
-       ever  newline sequences they have in the input. However, the setting of
-       this option does not affect the interpretation of  files  specified  by
-       the -f, --exclude-from, or --include-from options, which are assumed to
-       use the operating system's  standard  newline  sequence,  nor  does  it
-       affect  the  way in which pcregrep writes informational messages to the
-       standard error and output streams. For these it uses the string "\n" to
-       indicate  newlines,  relying on the C I/O library to convert this to an
-       appropriate sequence.
-
-
-OPTIONS COMPATIBILITY
-
-       Many of the short and long forms of pcregrep's options are the same  as
-       in  the GNU grep program. Any long option of the form --xxx-regexp (GNU
-       terminology) is also available as --xxx-regex (PCRE terminology).  How-
-       ever,  the  --file-list, --file-offsets, --include-dir, --line-offsets,
-       --locale, --match-limit, -M, --multiline, -N,  --newline,  --om-separa-
-       tor,  --recursion-limit,  -u, and --utf-8 options are specific to pcre-
-       grep, as is the use of the  --only-matching  option  with  a  capturing
-       parentheses number.
-
-       Although  most  of the common options work the same way, a few are dif-
-       ferent in pcregrep. For example, the --include option's argument  is  a
-       glob  for  GNU grep, but a regular expression for pcregrep. If both the
-       -c and -l options are given, GNU grep lists only  file  names,  without
-       counts, but pcregrep gives the counts.
-
-
-OPTIONS WITH DATA
-
-       There are four different ways in which an option with data can be spec-
-       ified.  If a short form option is used, the  data  may  follow  immedi-
-       ately, or (with one exception) in the next command line item. For exam-
-       ple:
-
-         -f/some/file
-         -f /some/file
-
-       The exception is the -o option, which may appear with or without  data.
-       Because  of this, if data is present, it must follow immediately in the
-       same item, for example -o3.
-
-       If a long form option is used, the data may appear in the same  command
-       line  item,  separated by an equals character, or (with two exceptions)
-       it may appear in the next command line item. For example:
-
-         --file=/some/file
-         --file /some/file
-
-       Note, however, that if you want to supply a file name beginning with  ~
-       as  data  in  a  shell  command,  and have the shell expand ~ to a home
-       directory, you must separate the file name from the option, because the
-       shell does not treat ~ specially unless it is at the start of an item.
-
-       The  exceptions  to the above are the --colour (or --color) and --only-
-       matching options, for which the data  is  optional.  If  one  of  these
-       options  does  have  data, it must be given in the first form, using an
-       equals character. Otherwise pcregrep will assume that it has no data.
-
-
-MATCHING ERRORS
-
-       It is possible to supply a regular expression that takes  a  very  long
-       time  to  fail  to  match certain lines. Such patterns normally involve
-       nested indefinite repeats, for example: (a+)*\d when matched against  a
-       line  of  a's  with  no  final  digit. The PCRE matching function has a
-       resource limit that causes it to abort in these circumstances. If  this
-       happens, pcregrep outputs an error message and the line that caused the
-       problem to the standard error stream. If there are more  than  20  such
-       errors, pcregrep gives up.
-
-       The  --match-limit  option  of  pcregrep can be used to set the overall
-       resource limit; there is a second option called --recursion-limit  that
-       sets  a limit on the amount of memory (usually stack) that is used (see
-       the discussion of these options above).
-
-
-DIAGNOSTICS
-
-       Exit status is 0 if any matches were found, 1 if no matches were found,
-       and  2  for syntax errors, overlong lines, non-existent or inaccessible
-       files (even if matches were found in other files) or too many  matching
-       errors. Using the -s option to suppress error messages about inaccessi-
-       ble files does not affect the return code.
-
-
-SEE ALSO
-
-       pcrepattern(3), pcresyntax(3), pcretest(1).
-
-
-AUTHOR
-
-       Philip Hazel
-       University Computing Service
-       Cambridge CB2 3QH, England.
-
-
-REVISION
-
-       Last updated: 03 April 2014
-       Copyright (c) 1997-2014 University of Cambridge.
diff --git a/dist/doc/pcrejit.3 b/dist/doc/pcrejit.3
deleted file mode 100644
index 341403f..0000000
--- a/dist/doc/pcrejit.3
+++ /dev/null
@@ -1,431 +0,0 @@
-.TH PCREJIT 3 "17 March 2013" "PCRE 8.33"
-.SH NAME
-PCRE - Perl-compatible regular expressions
-.SH "PCRE JUST-IN-TIME COMPILER SUPPORT"
-.rs
-.sp
-Just-in-time compiling is a heavyweight optimization that can greatly speed up
-pattern matching. However, it comes at the cost of extra processing before the
-match is performed. Therefore, it is of most benefit when the same pattern is
-going to be matched many times. This does not necessarily mean many calls of a
-matching function; if the pattern is not anchored, matching attempts may take
-place many times at various positions in the subject, even for a single call.
-Therefore, if the subject string is very long, it may still pay to use JIT for
-one-off matches.
-.P
-JIT support applies only to the traditional Perl-compatible matching function.
-It does not apply when the DFA matching function is being used. The code for
-this support was written by Zoltan Herczeg.
-.
-.
-.SH "8-BIT, 16-BIT AND 32-BIT SUPPORT"
-.rs
-.sp
-JIT support is available for all of the 8-bit, 16-bit and 32-bit PCRE
-libraries. To keep this documentation simple, only the 8-bit interface is
-described in what follows. If you are using the 16-bit library, substitute the
-16-bit functions and 16-bit structures (for example, \fIpcre16_jit_stack\fP
-instead of \fIpcre_jit_stack\fP). If you are using the 32-bit library,
-substitute the 32-bit functions and 32-bit structures (for example,
-\fIpcre32_jit_stack\fP instead of \fIpcre_jit_stack\fP).
-.
-.
-.SH "AVAILABILITY OF JIT SUPPORT"
-.rs
-.sp
-JIT support is an optional feature of PCRE. The "configure" option --enable-jit
-(or equivalent CMake option) must be set when PCRE is built if you want to use
-JIT. The support is limited to the following hardware platforms:
-.sp
-  ARM v5, v7, and Thumb2
-  Intel x86 32-bit and 64-bit
-  MIPS 32-bit
-  Power PC 32-bit and 64-bit
-  SPARC 32-bit (experimental)
-.sp
-If --enable-jit is set on an unsupported platform, compilation fails.
-.P
-A program that is linked with PCRE 8.20 or later can tell if JIT support is
-available by calling \fBpcre_config()\fP with the PCRE_CONFIG_JIT option. The
-result is 1 when JIT is available, and 0 otherwise. However, a simple program
-does not need to check this in order to use JIT. The normal API is implemented
-in a way that falls back to the interpretive code if JIT is not available. For
-programs that need the best possible performance, there is also a "fast path"
-API that is JIT-specific.
-.P
-If your program may sometimes be linked with versions of PCRE that are older
-than 8.20, but you want to use JIT when it is available, you can test
-the values of PCRE_MAJOR and PCRE_MINOR, or the existence of a JIT macro such
-as PCRE_CONFIG_JIT, for compile-time control of your code.
-.
-.
-.SH "SIMPLE USE OF JIT"
-.rs
-.sp
-You have to do two things to make use of the JIT support in the simplest way:
-.sp
-  (1) Call \fBpcre_study()\fP with the PCRE_STUDY_JIT_COMPILE option for
-      each compiled pattern, and pass the resulting \fBpcre_extra\fP block to
-      \fBpcre_exec()\fP.
-.sp
-  (2) Use \fBpcre_free_study()\fP to free the \fBpcre_extra\fP block when it is
-      no longer needed, instead of just freeing it yourself. This ensures that
-      any JIT data is also freed.
-.sp
-For a program that may be linked with pre-8.20 versions of PCRE, you can insert
-.sp
-  #ifndef PCRE_STUDY_JIT_COMPILE
-  #define PCRE_STUDY_JIT_COMPILE 0
-  #endif
-.sp
-so that no option is passed to \fBpcre_study()\fP, and then use something like
-this to free the study data:
-.sp
-  #ifdef PCRE_CONFIG_JIT
-      pcre_free_study(study_ptr);
-  #else
-      pcre_free(study_ptr);
-  #endif
-.sp
-PCRE_STUDY_JIT_COMPILE requests the JIT compiler to generate code for complete
-matches. If you want to run partial matches using the PCRE_PARTIAL_HARD or
-PCRE_PARTIAL_SOFT options of \fBpcre_exec()\fP, you should set one or both of
-the following options in addition to, or instead of, PCRE_STUDY_JIT_COMPILE
-when you call \fBpcre_study()\fP:
-.sp
-  PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE
-  PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE
-.sp
-The JIT compiler generates different optimized code for each of the three
-modes (normal, soft partial, hard partial). When \fBpcre_exec()\fP is called,
-the appropriate code is run if it is available. Otherwise, the pattern is
-matched using interpretive code.
-.P
-In some circumstances you may need to call additional functions. These are
-described in the section entitled
-.\" HTML <a href="#stackcontrol">
-.\" </a>
-"Controlling the JIT stack"
-.\"
-below.
-.P
-If JIT support is not available, PCRE_STUDY_JIT_COMPILE etc. are ignored, and
-no JIT data is created. Otherwise, the compiled pattern is passed to the JIT
-compiler, which turns it into machine code that executes much faster than the
-normal interpretive code. When \fBpcre_exec()\fP is passed a \fBpcre_extra\fP
-block containing a pointer to JIT code of the appropriate mode (normal or
-hard/soft partial), it obeys that code instead of running the interpreter. The
-result is identical, but the compiled JIT code runs much faster.
-.P
-There are some \fBpcre_exec()\fP options that are not supported for JIT
-execution. There are also some pattern items that JIT cannot handle. Details
-are given below. In both cases, execution automatically falls back to the
-interpretive code. If you want to know whether JIT was actually used for a
-particular match, you should arrange for a JIT callback function to be set up
-as described in the section entitled
-.\" HTML <a href="#stackcontrol">
-.\" </a>
-"Controlling the JIT stack"
-.\"
-below, even if you do not need to supply a non-default JIT stack. Such a
-callback function is called whenever JIT code is about to be obeyed. If the
-execution options are not right for JIT execution, the callback function is not
-obeyed.
-.P
-If the JIT compiler finds an unsupported item, no JIT data is generated. You
-can find out if JIT execution is available after studying a pattern by calling
-\fBpcre_fullinfo()\fP with the PCRE_INFO_JIT option. A result of 1 means that
-JIT compilation was successful. A result of 0 means that JIT support is not
-available, or the pattern was not studied with PCRE_STUDY_JIT_COMPILE etc., or
-the JIT compiler was not able to handle the pattern.
-.P
-Once a pattern has been studied, with or without JIT, it can be used as many
-times as you like for matching different subject strings.
-.
-.
-.SH "UNSUPPORTED OPTIONS AND PATTERN ITEMS"
-.rs
-.sp
-The only \fBpcre_exec()\fP options that are supported for JIT execution are
-PCRE_NO_UTF8_CHECK, PCRE_NO_UTF16_CHECK, PCRE_NO_UTF32_CHECK, PCRE_NOTBOL,
-PCRE_NOTEOL, PCRE_NOTEMPTY, PCRE_NOTEMPTY_ATSTART, PCRE_PARTIAL_HARD, and
-PCRE_PARTIAL_SOFT.
-.P
-The only unsupported pattern items are \eC (match a single data unit) when
-running in a UTF mode, and a callout immediately before an assertion condition
-in a conditional group.
-.
-.
-.SH "RETURN VALUES FROM JIT EXECUTION"
-.rs
-.sp
-When a pattern is matched using JIT execution, the return values are the same
-as those given by the interpretive \fBpcre_exec()\fP code, with the addition of
-one new error code: PCRE_ERROR_JIT_STACKLIMIT. This means that the memory used
-for the JIT stack was insufficient. See
-.\" HTML <a href="#stackcontrol">
-.\" </a>
-"Controlling the JIT stack"
-.\"
-below for a discussion of JIT stack usage. For compatibility with the
-interpretive \fBpcre_exec()\fP code, no more than two-thirds of the
-\fIovector\fP argument is used for passing back captured substrings.
-.P
-The error code PCRE_ERROR_MATCHLIMIT is returned by the JIT code if searching a
-very large pattern tree goes on for too long, as it is in the same circumstance
-when JIT is not used, but the details of exactly what is counted are not the
-same. The PCRE_ERROR_RECURSIONLIMIT error code is never returned by JIT
-execution.
-.
-.
-.SH "SAVING AND RESTORING COMPILED PATTERNS"
-.rs
-.sp
-The code that is generated by the JIT compiler is architecture-specific, and is
-also position dependent. For those reasons it cannot be saved (in a file or
-database) and restored later like the bytecode and other data of a compiled
-pattern. Saving and restoring compiled patterns is not something many people
-do. More detail about this facility is given in the
-.\" HREF
-\fBpcreprecompile\fP
-.\"
-documentation. It should be possible to run \fBpcre_study()\fP on a saved and
-restored pattern, and thereby recreate the JIT data, but because JIT
-compilation uses significant resources, it is probably not worth doing this;
-you might as well recompile the original pattern.
-.
-.
-.\" HTML <a name="stackcontrol"></a>
-.SH "CONTROLLING THE JIT STACK"
-.rs
-.sp
-When the compiled JIT code runs, it needs a block of memory to use as a stack.
-By default, it uses 32K on the machine stack. However, some large or
-complicated patterns need more than this. The error PCRE_ERROR_JIT_STACKLIMIT
-is given when there is not enough stack. Three functions are provided for
-managing blocks of memory for use as JIT stacks. There is further discussion
-about the use of JIT stacks in the section entitled
-.\" HTML <a href="#stackcontrol">
-.\" </a>
-"JIT stack FAQ"
-.\"
-below.
-.P
-The \fBpcre_jit_stack_alloc()\fP function creates a JIT stack. Its arguments
-are a starting size and a maximum size, and it returns a pointer to an opaque
-structure of type \fBpcre_jit_stack\fP, or NULL if there is an error. The
-\fBpcre_jit_stack_free()\fP function can be used to free a stack that is no
-longer needed. (For the technically minded: the address space is allocated by
-mmap or VirtualAlloc.)
-.P
-JIT uses far less memory for recursion than the interpretive code,
-and a maximum stack size of 512K to 1M should be more than enough for any
-pattern.
-.P
-The \fBpcre_assign_jit_stack()\fP function specifies which stack JIT code
-should use. Its arguments are as follows:
-.sp
-  pcre_extra         *extra
-  pcre_jit_callback  callback
-  void               *data
-.sp
-The \fIextra\fP argument must be the result of studying a pattern with
-PCRE_STUDY_JIT_COMPILE etc. There are three cases for the values of the other
-two options:
-.sp
-  (1) If \fIcallback\fP is NULL and \fIdata\fP is NULL, an internal 32K block
-      on the machine stack is used.
-.sp
-  (2) If \fIcallback\fP is NULL and \fIdata\fP is not NULL, \fIdata\fP must be
-      a valid JIT stack, the result of calling \fBpcre_jit_stack_alloc()\fP.
-.sp
-  (3) If \fIcallback\fP is not NULL, it must point to a function that is
-      called with \fIdata\fP as an argument at the start of matching, in
-      order to set up a JIT stack. If the return from the callback
-      function is NULL, the internal 32K stack is used; otherwise the
-      return value must be a valid JIT stack, the result of calling
-      \fBpcre_jit_stack_alloc()\fP.
-.sp
-A callback function is obeyed whenever JIT code is about to be run; it is not
-obeyed when \fBpcre_exec()\fP is called with options that are incompatible for
-JIT execution. A callback function can therefore be used to determine whether a
-match operation was executed by JIT or by the interpreter.
-.P
-You may safely use the same JIT stack for more than one pattern (either by
-assigning directly or by callback), as long as the patterns are all matched
-sequentially in the same thread. In a multithread application, if you do not
-specify a JIT stack, or if you assign or pass back NULL from a callback, that
-is thread-safe, because each thread has its own machine stack. However, if you
-assign or pass back a non-NULL JIT stack, this must be a different stack for
-each thread so that the application is thread-safe.
-.P
-Strictly speaking, even more is allowed. You can assign the same non-NULL stack
-to any number of patterns as long as they are not used for matching by multiple
-threads at the same time. For example, you can assign the same stack to all
-compiled patterns, and use a global mutex in the callback to wait until the
-stack is available for use. However, this is an inefficient solution, and not
-recommended.
-.P
-This is a suggestion for how a multithreaded program that needs to set up
-non-default JIT stacks might operate:
-.sp
-  During thread initalization
-    thread_local_var = pcre_jit_stack_alloc(...)
-.sp
-  During thread exit
-    pcre_jit_stack_free(thread_local_var)
-.sp
-  Use a one-line callback function
-    return thread_local_var
-.sp
-All the functions described in this section do nothing if JIT is not available,
-and \fBpcre_assign_jit_stack()\fP does nothing unless the \fBextra\fP argument
-is non-NULL and points to a \fBpcre_extra\fP block that is the result of a
-successful study with PCRE_STUDY_JIT_COMPILE etc.
-.
-.
-.\" HTML <a name="stackfaq"></a>
-.SH "JIT STACK FAQ"
-.rs
-.sp
-(1) Why do we need JIT stacks?
-.sp
-PCRE (and JIT) is a recursive, depth-first engine, so it needs a stack where
-the local data of the current node is pushed before checking its child nodes.
-Allocating real machine stack on some platforms is difficult. For example, the
-stack chain needs to be updated every time if we extend the stack on PowerPC.
-Although it is possible, its updating time overhead decreases performance. So
-we do the recursion in memory.
-.P
-(2) Why don't we simply allocate blocks of memory with \fBmalloc()\fP?
-.sp
-Modern operating systems have a nice feature: they can reserve an address space
-instead of allocating memory. We can safely allocate memory pages inside this
-address space, so the stack could grow without moving memory data (this is
-important because of pointers). Thus we can allocate 1M address space, and use
-only a single memory page (usually 4K) if that is enough. However, we can still
-grow up to 1M anytime if needed.
-.P
-(3) Who "owns" a JIT stack?
-.sp
-The owner of the stack is the user program, not the JIT studied pattern or
-anything else. The user program must ensure that if a stack is used by
-\fBpcre_exec()\fP, (that is, it is assigned to the pattern currently running),
-that stack must not be used by any other threads (to avoid overwriting the same
-memory area). The best practice for multithreaded programs is to allocate a
-stack for each thread, and return this stack through the JIT callback function.
-.P
-(4) When should a JIT stack be freed?
-.sp
-You can free a JIT stack at any time, as long as it will not be used by
-\fBpcre_exec()\fP again. When you assign the stack to a pattern, only a pointer
-is set. There is no reference counting or any other magic. You can free the
-patterns and stacks in any order, anytime. Just \fIdo not\fP call
-\fBpcre_exec()\fP with a pattern pointing to an already freed stack, as that
-will cause SEGFAULT. (Also, do not free a stack currently used by
-\fBpcre_exec()\fP in another thread). You can also replace the stack for a
-pattern at any time. You can even free the previous stack before assigning a
-replacement.
-.P
-(5) Should I allocate/free a stack every time before/after calling
-\fBpcre_exec()\fP?
-.sp
-No, because this is too costly in terms of resources. However, you could
-implement some clever idea which release the stack if it is not used in let's
-say two minutes. The JIT callback can help to achieve this without keeping a
-list of the currently JIT studied patterns.
-.P
-(6) OK, the stack is for long term memory allocation. But what happens if a
-pattern causes stack overflow with a stack of 1M? Is that 1M kept until the
-stack is freed?
-.sp
-Especially on embedded sytems, it might be a good idea to release memory
-sometimes without freeing the stack. There is no API for this at the moment.
-Probably a function call which returns with the currently allocated memory for
-any stack and another which allows releasing memory (shrinking the stack) would
-be a good idea if someone needs this.
-.P
-(7) This is too much of a headache. Isn't there any better solution for JIT
-stack handling?
-.sp
-No, thanks to Windows. If POSIX threads were used everywhere, we could throw
-out this complicated API.
-.
-.
-.SH "EXAMPLE CODE"
-.rs
-.sp
-This is a single-threaded example that specifies a JIT stack without using a
-callback.
-.sp
-  int rc;
-  int ovector[30];
-  pcre *re;
-  pcre_extra *extra;
-  pcre_jit_stack *jit_stack;
-.sp
-  re = pcre_compile(pattern, 0, &error, &erroffset, NULL);
-  /* Check for errors */
-  extra = pcre_study(re, PCRE_STUDY_JIT_COMPILE, &error);
-  jit_stack = pcre_jit_stack_alloc(32*1024, 512*1024);
-  /* Check for error (NULL) */
-  pcre_assign_jit_stack(extra, NULL, jit_stack);
-  rc = pcre_exec(re, extra, subject, length, 0, 0, ovector, 30);
-  /* Check results */
-  pcre_free(re);
-  pcre_free_study(extra);
-  pcre_jit_stack_free(jit_stack);
-.sp
-.
-.
-.SH "JIT FAST PATH API"
-.rs
-.sp
-Because the API described above falls back to interpreted execution when JIT is
-not available, it is convenient for programs that are written for general use
-in many environments. However, calling JIT via \fBpcre_exec()\fP does have a
-performance impact. Programs that are written for use where JIT is known to be
-available, and which need the best possible performance, can instead use a
-"fast path" API to call JIT execution directly instead of calling
-\fBpcre_exec()\fP (obviously only for patterns that have been successfully
-studied by JIT).
-.P
-The fast path function is called \fBpcre_jit_exec()\fP, and it takes exactly
-the same arguments as \fBpcre_exec()\fP, plus one additional argument that
-must point to a JIT stack. The JIT stack arrangements described above do not
-apply. The return values are the same as for \fBpcre_exec()\fP.
-.P
-When you call \fBpcre_exec()\fP, as well as testing for invalid options, a
-number of other sanity checks are performed on the arguments. For example, if
-the subject pointer is NULL, or its length is negative, an immediate error is
-given. Also, unless PCRE_NO_UTF[8|16|32] is set, a UTF subject string is tested
-for validity. In the interests of speed, these checks do not happen on the JIT
-fast path, and if invalid data is passed, the result is undefined.
-.P
-Bypassing the sanity checks and the \fBpcre_exec()\fP wrapping can give
-speedups of more than 10%.
-.
-.
-.SH "SEE ALSO"
-.rs
-.sp
-\fBpcreapi\fP(3)
-.
-.
-.SH AUTHOR
-.rs
-.sp
-.nf
-Philip Hazel (FAQ by Zoltan Herczeg)
-University Computing Service
-Cambridge CB2 3QH, England.
-.fi
-.
-.
-.SH REVISION
-.rs
-.sp
-.nf
-Last updated: 17 March 2013
-Copyright (c) 1997-2013 University of Cambridge.
-.fi
diff --git a/dist/doc/pcrelimits.3 b/dist/doc/pcrelimits.3
deleted file mode 100644
index 423d6a2..0000000
--- a/dist/doc/pcrelimits.3
+++ /dev/null
@@ -1,71 +0,0 @@
-.TH PCRELIMITS 3 "05 November 2013" "PCRE 8.34"
-.SH NAME
-PCRE - Perl-compatible regular expressions
-.SH "SIZE AND OTHER 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 approximately 64K data units (bytes
-for the 8-bit library, 16-bit units for the 16-bit library, and 32-bit units for
-the 32-bit library) if PCRE is compiled with the default internal linkage size,
-which is 2 bytes for the 8-bit and 16-bit libraries, and 4 bytes for the 32-bit
-library. If you want to process regular expressions that are truly enormous,
-you can compile PCRE with an internal linkage size of 3 or 4 (when building the
-16-bit or 32-bit library, 3 is rounded up to 4). See the \fBREADME\fP file in
-the source distribution and the
-.\" HREF
-\fBpcrebuild\fP
-.\"
-documentation for details. In these cases the limit is substantially larger.
-However, the speed of execution is slower.
-.P
-All values in repeating quantifiers must be less than 65536.
-.P
-There is no limit to the number of parenthesized subpatterns, but there can be
-no more than 65535 capturing subpatterns. There is, however, a limit to the
-depth of nesting of parenthesized subpatterns of all kinds. This is imposed in
-order to limit the amount of system stack used at compile time. The limit can
-be specified when PCRE is built; the default is 250.
-.P
-There is a limit to the number of forward references to subsequent subpatterns
-of around 200,000. Repeated forward references with fixed upper limits, for
-example, (?2){0,100} when subpattern number 2 is to the right, are included in
-the count. There is no limit to the number of backward references.
-.P
-The maximum length of name for a named subpattern is 32 characters, and the
-maximum number of named subpatterns is 10000.
-.P
-The maximum length of a name in a (*MARK), (*PRUNE), (*SKIP), or (*THEN) verb
-is 255 for the 8-bit library and 65535 for the 16-bit and 32-bit libraries.
-.P
-The maximum length of a subject string is the largest positive number that an
-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. For a discussion of stack
-issues, see the
-.\" HREF
-\fBpcrestack\fP
-.\"
-documentation.
-.
-.
-.SH AUTHOR
-.rs
-.sp
-.nf
-Philip Hazel
-University Computing Service
-Cambridge CB2 3QH, England.
-.fi
-.
-.
-.SH REVISION
-.rs
-.sp
-.nf
-Last updated: 05 November 2013
-Copyright (c) 1997-2013 University of Cambridge.
-.fi
diff --git a/dist/doc/pcrepartial.3 b/dist/doc/pcrepartial.3
deleted file mode 100644
index 14d0124..0000000
--- a/dist/doc/pcrepartial.3
+++ /dev/null
@@ -1,476 +0,0 @@
-.TH PCREPARTIAL 3 "02 July 2013" "PCRE 8.34"
-.SH NAME
-PCRE - Perl-compatible regular expressions
-.SH "PARTIAL MATCHING IN PCRE"
-.rs
-.sp
-In normal use of PCRE, if the subject string that is passed to a matching
-function matches as far as it goes, but is too short to match the entire
-pattern, PCRE_ERROR_NOMATCH is returned. There are circumstances where it might
-be helpful to distinguish this case from other cases in which there is no
-match.
-.P
-Consider, for example, an application where a human is required to type in data
-for a field with specific formatting requirements. An example might be a date
-in the form \fIddmmmyy\fP, defined by this pattern:
-.sp
-  ^\ed?\ed(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\ed\ed$
-.sp
-If the application sees the user's keystrokes one by one, and can check that
-what has been typed so far is potentially valid, it is able to raise an error
-as soon as a mistake is made, by beeping and not reflecting the character that
-has been typed, for example. This immediate feedback is likely to be a better
-user interface than a check that is delayed until the entire string has been
-entered. Partial matching can also be useful when the subject string is very
-long and is not all available at once.
-.P
-PCRE supports partial matching by means of the PCRE_PARTIAL_SOFT and
-PCRE_PARTIAL_HARD options, which can be set when calling any of the matching
-functions. For backwards compatibility, PCRE_PARTIAL is a synonym for
-PCRE_PARTIAL_SOFT. The essential difference between the two options is whether
-or not a partial match is preferred to an alternative complete match, though
-the details differ between the two types of matching function. If both options
-are set, PCRE_PARTIAL_HARD takes precedence.
-.P
-If you want to use partial matching with just-in-time optimized code, you must
-call \fBpcre_study()\fP, \fBpcre16_study()\fP or  \fBpcre32_study()\fP with one
-or both of these options:
-.sp
-  PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE
-  PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE
-.sp
-PCRE_STUDY_JIT_COMPILE should also be set if you are going to run non-partial
-matches on the same pattern. If the appropriate JIT study mode has not been set
-for a match, the interpretive matching code is used.
-.P
-Setting a partial matching option disables two of PCRE's standard
-optimizations. PCRE remembers the last literal data unit in a pattern, and
-abandons matching immediately if it is not present in the subject string. This
-optimization cannot be used for a subject string that might match only
-partially. If the pattern was studied, PCRE knows the minimum length of a
-matching string, and does not bother to run the matching function on shorter
-strings. This optimization is also disabled for partial matching.
-.
-.
-.SH "PARTIAL MATCHING USING pcre_exec() OR pcre[16|32]_exec()"
-.rs
-.sp
-A partial match occurs during a call to \fBpcre_exec()\fP or
-\fBpcre[16|32]_exec()\fP when the end of the subject string is reached
-successfully, but matching cannot continue because more characters are needed.
-However, at least one character in the subject must have been inspected. This
-character need not form part of the final matched string; lookbehind assertions
-and the \eK escape sequence provide ways of inspecting characters before the
-start of a matched substring. The requirement for inspecting at least one
-character exists because an empty string can always be matched; without such a
-restriction there would always be a partial match of an empty string at the end
-of the subject.
-.P
-If there are at least two slots in the offsets vector when a partial match is
-returned, the first slot is set to the offset of the earliest character that
-was inspected. For convenience, the second offset points to the end of the
-subject so that a substring can easily be identified. If there are at least
-three slots in the offsets vector, the third slot is set to the offset of the
-character where matching started.
-.P
-For the majority of patterns, the contents of the first and third slots will be
-the same. However, for patterns that contain lookbehind assertions, or begin
-with \eb or \eB, characters before the one where matching started may have been
-inspected while carrying out the match. For example, consider this pattern:
-.sp
-  /(?<=abc)123/
-.sp
-This pattern matches "123", but only if it is preceded by "abc". If the subject
-string is "xyzabc12", the first two offsets after a partial match are for the
-substring "abc12", because all these characters were inspected. However, the
-third offset is set to 6, because that is the offset where matching began.
-.P
-What happens when a partial match is identified depends on which of the two
-partial matching options are set.
-.
-.
-.SS "PCRE_PARTIAL_SOFT WITH pcre_exec() OR pcre[16|32]_exec()"
-.rs
-.sp
-If PCRE_PARTIAL_SOFT is set when \fBpcre_exec()\fP or \fBpcre[16|32]_exec()\fP
-identifies a partial match, the partial match is remembered, but matching
-continues as normal, and other alternatives in the pattern are tried. If no
-complete match can be found, PCRE_ERROR_PARTIAL is returned instead of
-PCRE_ERROR_NOMATCH.
-.P
-This option is "soft" because it prefers a complete match over a partial match.
-All the various matching items in a pattern behave as if the subject string is
-potentially complete. For example, \ez, \eZ, and $ match at the end of the
-subject, as normal, and for \eb and \eB the end of the subject is treated as a
-non-alphanumeric.
-.P
-If there is more than one partial match, the first one that was found provides
-the data that is returned. Consider this pattern:
-.sp
-  /123\ew+X|dogY/
-.sp
-If this is matched against the subject string "abc123dog", both
-alternatives fail to match, but the end of the subject is reached during
-matching, so PCRE_ERROR_PARTIAL is returned. The offsets are set to 3 and 9,
-identifying "123dog" as the first partial match that was found. (In this
-example, there are two partial matches, because "dog" on its own partially
-matches the second alternative.)
-.
-.
-.SS "PCRE_PARTIAL_HARD WITH pcre_exec() OR pcre[16|32]_exec()"
-.rs
-.sp
-If PCRE_PARTIAL_HARD is set for \fBpcre_exec()\fP or \fBpcre[16|32]_exec()\fP,
-PCRE_ERROR_PARTIAL is returned as soon as a partial match is found, without
-continuing to search for possible complete matches. This option is "hard"
-because it prefers an earlier partial match over a later complete match. For
-this reason, the assumption is made that the end of the supplied subject string
-may not be the true end of the available data, and so, if \ez, \eZ, \eb, \eB,
-or $ are encountered at the end of the subject, the result is
-PCRE_ERROR_PARTIAL, provided that at least one character in the subject has
-been inspected.
-.P
-Setting PCRE_PARTIAL_HARD also affects the way UTF-8 and UTF-16
-subject strings are checked for validity. Normally, an invalid sequence
-causes the error PCRE_ERROR_BADUTF8 or PCRE_ERROR_BADUTF16. However, in the
-special case of a truncated character at the end of the subject,
-PCRE_ERROR_SHORTUTF8 or PCRE_ERROR_SHORTUTF16 is returned when
-PCRE_PARTIAL_HARD is set.
-.
-.
-.SS "Comparing hard and soft partial matching"
-.rs
-.sp
-The difference between the two partial matching options can be illustrated by a
-pattern such as:
-.sp
-  /dog(sbody)?/
-.sp
-This matches either "dog" or "dogsbody", greedily (that is, it prefers the
-longer string if possible). If it is matched against the string "dog" with
-PCRE_PARTIAL_SOFT, it yields a complete match for "dog". However, if
-PCRE_PARTIAL_HARD is set, the result is PCRE_ERROR_PARTIAL. On the other hand,
-if the pattern is made ungreedy the result is different:
-.sp
-  /dog(sbody)??/
-.sp
-In this case the result is always a complete match because that is found first,
-and matching never continues after finding a complete match. It might be easier
-to follow this explanation by thinking of the two patterns like this:
-.sp
-  /dog(sbody)?/    is the same as  /dogsbody|dog/
-  /dog(sbody)??/   is the same as  /dog|dogsbody/
-.sp
-The second pattern will never match "dogsbody", because it will always find the
-shorter match first.
-.
-.
-.SH "PARTIAL MATCHING USING pcre_dfa_exec() OR pcre[16|32]_dfa_exec()"
-.rs
-.sp
-The DFA functions move along the subject string character by character, without
-backtracking, searching for all possible matches simultaneously. If the end of
-the subject is reached before the end of the pattern, there is the possibility
-of a partial match, again provided that at least one character has been
-inspected.
-.P
-When PCRE_PARTIAL_SOFT is set, PCRE_ERROR_PARTIAL is returned only if there
-have been no complete matches. Otherwise, the complete matches are returned.
-However, if PCRE_PARTIAL_HARD is set, a partial match takes precedence over any
-complete matches. The portion of the string that was inspected when the longest
-partial match was found is set as the first matching string, provided there are
-at least two slots in the offsets vector.
-.P
-Because the DFA functions always search for all possible matches, and there is
-no difference between greedy and ungreedy repetition, their behaviour is
-different from the standard functions when PCRE_PARTIAL_HARD is set. Consider
-the string "dog" matched against the ungreedy pattern shown above:
-.sp
-  /dog(sbody)??/
-.sp
-Whereas the standard functions stop as soon as they find the complete match for
-"dog", the DFA functions also find the partial match for "dogsbody", and so
-return that when PCRE_PARTIAL_HARD is set.
-.
-.
-.SH "PARTIAL MATCHING AND WORD BOUNDARIES"
-.rs
-.sp
-If a pattern ends with one of sequences \eb or \eB, which test for word
-boundaries, partial matching with PCRE_PARTIAL_SOFT can give counter-intuitive
-results. Consider this pattern:
-.sp
-  /\ebcat\eb/
-.sp
-This matches "cat", provided there is a word boundary at either end. If the
-subject string is "the cat", the comparison of the final "t" with a following
-character cannot take place, so a partial match is found. However, normal
-matching carries on, and \eb matches at the end of the subject when the last
-character is a letter, so a complete match is found. The result, therefore, is
-\fInot\fP PCRE_ERROR_PARTIAL. Using PCRE_PARTIAL_HARD in this case does yield
-PCRE_ERROR_PARTIAL, because then the partial match takes precedence.
-.
-.
-.SH "FORMERLY RESTRICTED PATTERNS"
-.rs
-.sp
-For releases of PCRE prior to 8.00, because of the way certain internal
-optimizations were implemented in the \fBpcre_exec()\fP function, the
-PCRE_PARTIAL option (predecessor of PCRE_PARTIAL_SOFT) could not be used with
-all patterns. From release 8.00 onwards, the restrictions no longer apply, and
-partial matching with can be requested for any pattern.
-.P
-Items that were formerly restricted were repeated single characters and
-repeated metasequences. If PCRE_PARTIAL was set for a pattern that did not
-conform to the restrictions, \fBpcre_exec()\fP returned the error code
-PCRE_ERROR_BADPARTIAL (-13). This error code is no longer in use. The
-PCRE_INFO_OKPARTIAL call to \fBpcre_fullinfo()\fP to find out if a compiled
-pattern can be used for partial matching now always returns 1.
-.
-.
-.SH "EXAMPLE OF PARTIAL MATCHING USING PCRETEST"
-.rs
-.sp
-If the escape sequence \eP is present in a \fBpcretest\fP data line, the
-PCRE_PARTIAL_SOFT option is used for the match. Here is a run of \fBpcretest\fP
-that uses the date example quoted above:
-.sp
-    re> /^\ed?\ed(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\ed\ed$/
-  data> 25jun04\eP
-   0: 25jun04
-   1: jun
-  data> 25dec3\eP
-  Partial match: 23dec3
-  data> 3ju\eP
-  Partial match: 3ju
-  data> 3juj\eP
-  No match
-  data> j\eP
-  No match
-.sp
-The first data string is matched completely, so \fBpcretest\fP shows the
-matched substrings. The remaining four strings do not match the complete
-pattern, but the first two are partial matches. Similar output is obtained
-if DFA matching is used.
-.P
-If the escape sequence \eP is present more than once in a \fBpcretest\fP data
-line, the PCRE_PARTIAL_HARD option is set for the match.
-.
-.
-.SH "MULTI-SEGMENT MATCHING WITH pcre_dfa_exec() OR pcre[16|32]_dfa_exec()"
-.rs
-.sp
-When a partial match has been found using a DFA matching function, it is
-possible to continue the match by providing additional subject data and calling
-the function again with the same compiled regular expression, this time setting
-the PCRE_DFA_RESTART option. You must pass the same working space as before,
-because this is where details of the previous partial match are stored. Here is
-an example using \fBpcretest\fP, using the \eR escape sequence to set the
-PCRE_DFA_RESTART option (\eD specifies the use of the DFA matching function):
-.sp
-    re> /^\ed?\ed(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\ed\ed$/
-  data> 23ja\eP\eD
-  Partial match: 23ja
-  data> n05\eR\eD
-   0: n05
-.sp
-The first call has "23ja" as the subject, and requests partial matching; the
-second call has "n05" as the subject for the continued (restarted) match.
-Notice that when the match is complete, only the last part is shown; PCRE does
-not retain the previously partially-matched string. It is up to the calling
-program to do that if it needs to.
-.P
-That means that, for an unanchored pattern, if a continued match fails, it is
-not possible to try again at a new starting point. All this facility is capable
-of doing is continuing with the previous match attempt. In the previous
-example, if the second set of data is "ug23" the result is no match, even
-though there would be a match for "aug23" if the entire string were given at
-once. Depending on the application, this may or may not be what you want.
-The only way to allow for starting again at the next character is to retain the
-matched part of the subject and try a new complete match.
-.P
-You can set the PCRE_PARTIAL_SOFT or PCRE_PARTIAL_HARD options with
-PCRE_DFA_RESTART to continue partial matching over multiple segments. This
-facility can be used to pass very long subject strings to the DFA matching
-functions.
-.
-.
-.SH "MULTI-SEGMENT MATCHING WITH pcre_exec() OR pcre[16|32]_exec()"
-.rs
-.sp
-From release 8.00, the standard matching functions can also be used to do
-multi-segment matching. Unlike the DFA functions, it is not possible to
-restart the previous match with a new segment of data. Instead, new data must
-be added to the previous subject string, and the entire match re-run, starting
-from the point where the partial match occurred. Earlier data can be discarded.
-.P
-It is best to use PCRE_PARTIAL_HARD in this situation, because it does not
-treat the end of a segment as the end of the subject when matching \ez, \eZ,
-\eb, \eB, and $. Consider an unanchored pattern that matches dates:
-.sp
-    re> /\ed?\ed(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\ed\ed/
-  data> The date is 23ja\eP\eP
-  Partial match: 23ja
-.sp
-At this stage, an application could discard the text preceding "23ja", add on
-text from the next segment, and call the matching function again. Unlike the
-DFA matching functions, the entire matching string must always be available,
-and the complete matching process occurs for each call, so more memory and more
-processing time is needed.
-.P
-\fBNote:\fP If the pattern contains lookbehind assertions, or \eK, or starts
-with \eb or \eB, the string that is returned for a partial match includes
-characters that precede the start of what would be returned for a complete
-match, because it contains all the characters that were inspected during the
-partial match.
-.
-.
-.SH "ISSUES WITH MULTI-SEGMENT MATCHING"
-.rs
-.sp
-Certain types of pattern may give problems with multi-segment matching,
-whichever matching function is used.
-.P
-1. If the pattern contains a test for the beginning of a line, you need to pass
-the PCRE_NOTBOL option when the subject string for any call does start at the
-beginning of a line. There is also a PCRE_NOTEOL option, but in practice when
-doing multi-segment matching you should be using PCRE_PARTIAL_HARD, which
-includes the effect of PCRE_NOTEOL.
-.P
-2. Lookbehind assertions that have already been obeyed are catered for in the
-offsets that are returned for a partial match. However a lookbehind assertion
-later in the pattern could require even earlier characters to be inspected. You
-can handle this case by using the PCRE_INFO_MAXLOOKBEHIND option of the
-\fBpcre_fullinfo()\fP or \fBpcre[16|32]_fullinfo()\fP functions to obtain the
-length of the longest lookbehind in the pattern. This length is given in
-characters, not bytes. If you always retain at least that many characters
-before the partially matched string, all should be well. (Of course, near the
-start of the subject, fewer characters may be present; in that case all
-characters should be retained.)
-.P
-From release 8.33, there is a more accurate way of deciding which characters to
-retain. Instead of subtracting the length of the longest lookbehind from the
-earliest inspected character (\fIoffsets[0]\fP), the match start position
-(\fIoffsets[2]\fP) should be used, and the next match attempt started at the
-\fIoffsets[2]\fP character by setting the \fIstartoffset\fP argument of
-\fBpcre_exec()\fP or \fBpcre_dfa_exec()\fP.
-.P
-For example, if the pattern "(?<=123)abc" is partially
-matched against the string "xx123a", the three offset values returned are 2, 6,
-and 5. This indicates that the matching process that gave a partial match
-started at offset 5, but the characters "123a" were all inspected. The maximum
-lookbehind for that pattern is 3, so taking that away from 5 shows that we need
-only keep "123a", and the next match attempt can be started at offset 3 (that
-is, at "a") when further characters have been added. When the match start is
-not the earliest inspected character, \fBpcretest\fP shows it explicitly:
-.sp
-    re> "(?<=123)abc"
-  data> xx123a\eP\eP
-  Partial match at offset 5: 123a
-.P
-3. Because a partial match must always contain at least one character, what
-might be considered a partial match of an empty string actually gives a "no
-match" result. For example:
-.sp
-    re> /c(?<=abc)x/
-  data> ab\eP
-  No match
-.sp
-If the next segment begins "cx", a match should be found, but this will only
-happen if characters from the previous segment are retained. For this reason, a
-"no match" result should be interpreted as "partial match of an empty string"
-when the pattern contains lookbehinds.
-.P
-4. Matching a subject string that is split into multiple segments may not
-always produce exactly the same result as matching over one single long string,
-especially when PCRE_PARTIAL_SOFT is used. The section "Partial Matching and
-Word Boundaries" above describes an issue that arises if the pattern ends with
-\eb or \eB. Another kind of difference may occur when there are multiple
-matching possibilities, because (for PCRE_PARTIAL_SOFT) a partial match result
-is given only when there are no completed matches. This means that as soon as
-the shortest match has been found, continuation to a new subject segment is no
-longer possible. Consider again this \fBpcretest\fP example:
-.sp
-    re> /dog(sbody)?/
-  data> dogsb\eP
-   0: dog
-  data> do\eP\eD
-  Partial match: do
-  data> gsb\eR\eP\eD
-   0: g
-  data> dogsbody\eD
-   0: dogsbody
-   1: dog
-.sp
-The first data line passes the string "dogsb" to a standard matching function,
-setting the PCRE_PARTIAL_SOFT option. Although the string is a partial match
-for "dogsbody", the result is not PCRE_ERROR_PARTIAL, because the shorter
-string "dog" is a complete match. Similarly, when the subject is presented to
-a DFA matching function in several parts ("do" and "gsb" being the first two)
-the match stops when "dog" has been found, and it is not possible to continue.
-On the other hand, if "dogsbody" is presented as a single string, a DFA
-matching function finds both matches.
-.P
-Because of these problems, it is best to use PCRE_PARTIAL_HARD when matching
-multi-segment data. The example above then behaves differently:
-.sp
-    re> /dog(sbody)?/
-  data> dogsb\eP\eP
-  Partial match: dogsb
-  data> do\eP\eD
-  Partial match: do
-  data> gsb\eR\eP\eP\eD
-  Partial match: gsb
-.sp
-5. Patterns that contain alternatives at the top level which do not all start
-with the same pattern item may not work as expected when PCRE_DFA_RESTART is
-used. For example, consider this pattern:
-.sp
-  1234|3789
-.sp
-If the first part of the subject is "ABC123", a partial match of the first
-alternative is found at offset 3. There is no partial match for the second
-alternative, because such a match does not start at the same point in the
-subject string. Attempting to continue with the string "7890" does not yield a
-match because only those alternatives that match at one point in the subject
-are remembered. The problem arises because the start of the second alternative
-matches within the first alternative. There is no problem with anchored
-patterns or patterns such as:
-.sp
-  1234|ABCD
-.sp
-where no string can be a partial match for both alternatives. This is not a
-problem if a standard matching function is used, because the entire match has
-to be rerun each time:
-.sp
-    re> /1234|3789/
-  data> ABC123\eP\eP
-  Partial match: 123
-  data> 1237890
-   0: 3789
-.sp
-Of course, instead of using PCRE_DFA_RESTART, the same technique of re-running
-the entire match can also be used with the DFA matching functions. Another
-possibility is to work with two buffers. If a partial match at offset \fIn\fP
-in the first buffer is followed by "no match" when PCRE_DFA_RESTART is used on
-the second buffer, you can then try a new match starting at offset \fIn+1\fP in
-the first buffer.
-.
-.
-.SH AUTHOR
-.rs
-.sp
-.nf
-Philip Hazel
-University Computing Service
-Cambridge CB2 3QH, England.
-.fi
-.
-.
-.SH REVISION
-.rs
-.sp
-.nf
-Last updated: 02 July 2013
-Copyright (c) 1997-2013 University of Cambridge.
-.fi
diff --git a/dist/doc/pcreprecompile.3 b/dist/doc/pcreprecompile.3
deleted file mode 100644
index 40f257a..0000000
--- a/dist/doc/pcreprecompile.3
+++ /dev/null
@@ -1,155 +0,0 @@
-.TH PCREPRECOMPILE 3 "12 November 2013" "PCRE 8.34"
-.SH NAME
-PCRE - Perl-compatible regular expressions
-.SH "SAVING AND RE-USING PRECOMPILED PCRE PATTERNS"
-.rs
-.sp
-If you are running an application that uses a large number of regular
-expression patterns, it may be useful to store them in a precompiled form
-instead of having to compile them every time the application is run.
-If you are not using any private character tables (see the
-.\" HREF
-\fBpcre_maketables()\fP
-.\"
-documentation), this is relatively straightforward. If you are using private
-tables, it is a little bit more complicated. However, if you are using the
-just-in-time optimization feature, it is not possible to save and reload the
-JIT data.
-.P
-If you save compiled patterns to a file, you can copy them to a different host
-and run them there. If the two hosts have different endianness (byte order),
-you should run the \fBpcre[16|32]_pattern_to_host_byte_order()\fP function on the
-new host before trying to match the pattern. The matching functions return
-PCRE_ERROR_BADENDIANNESS if they detect a pattern with the wrong endianness.
-.P
-Compiling regular expressions with one version of PCRE for use with a different
-version is not guaranteed to work and may cause crashes, and saving and
-restoring a compiled pattern loses any JIT optimization data.
-.
-.
-.SH "SAVING A COMPILED PATTERN"
-.rs
-.sp
-The value returned by \fBpcre[16|32]_compile()\fP points to a single block of
-memory that holds the compiled pattern and associated data. You can find the
-length of this block in bytes by calling \fBpcre[16|32]_fullinfo()\fP with an
-argument of PCRE_INFO_SIZE. You can then save the data in any appropriate
-manner. Here is sample code for the 8-bit library that compiles a pattern and
-writes it to a file. It assumes that the variable \fIfd\fP refers to a file
-that is open for output:
-.sp
-  int erroroffset, rc, size;
-  char *error;
-  pcre *re;
-.sp
-  re = pcre_compile("my pattern", 0, &error, &erroroffset, NULL);
-  if (re == NULL) { ... handle errors ... }
-  rc = pcre_fullinfo(re, NULL, PCRE_INFO_SIZE, &size);
-  if (rc < 0) { ... handle errors ... }
-  rc = fwrite(re, 1, size, fd);
-  if (rc != size) { ... handle errors ... }
-.sp
-In this example, the bytes that comprise the compiled pattern are copied
-exactly. Note that this is binary data that may contain any of the 256 possible
-byte values. On systems that make a distinction between binary and non-binary
-data, be sure that the file is opened for binary output.
-.P
-If you want to write more than one pattern to a file, you will have to devise a
-way of separating them. For binary data, preceding each pattern with its length
-is probably the most straightforward approach. Another possibility is to write
-out the data in hexadecimal instead of binary, one pattern to a line.
-.P
-Saving compiled patterns in a file is only one possible way of storing them for
-later use. They could equally well be saved in a database, or in the memory of
-some daemon process that passes them via sockets to the processes that want
-them.
-.P
-If the pattern has been studied, it is also possible to save the normal study
-data in a similar way to the compiled pattern itself. However, if the
-PCRE_STUDY_JIT_COMPILE was used, the just-in-time data that is created cannot
-be saved because it is too dependent on the current environment. When studying
-generates additional information, \fBpcre[16|32]_study()\fP returns a pointer to a
-\fBpcre[16|32]_extra\fP data block. Its format is defined in the
-.\" HTML <a href="pcreapi.html#extradata">
-.\" </a>
-section on matching a pattern
-.\"
-in the
-.\" HREF
-\fBpcreapi\fP
-.\"
-documentation. The \fIstudy_data\fP field points to the binary study data, and
-this is what you must save (not the \fBpcre[16|32]_extra\fP block itself). The
-length of the study data can be obtained by calling \fBpcre[16|32]_fullinfo()\fP
-with an argument of PCRE_INFO_STUDYSIZE. Remember to check that
-\fBpcre[16|32]_study()\fP did return a non-NULL value before trying to save the
-study data.
-.
-.
-.SH "RE-USING A PRECOMPILED PATTERN"
-.rs
-.sp
-Re-using a precompiled pattern is straightforward. Having reloaded it into main
-memory, called \fBpcre[16|32]_pattern_to_host_byte_order()\fP if necessary, you
-pass its pointer to \fBpcre[16|32]_exec()\fP or \fBpcre[16|32]_dfa_exec()\fP in
-the usual way.
-.P
-However, if you passed a pointer to custom character tables when the pattern
-was compiled (the \fItableptr\fP argument of \fBpcre[16|32]_compile()\fP), you
-must now pass a similar pointer to \fBpcre[16|32]_exec()\fP or
-\fBpcre[16|32]_dfa_exec()\fP, because the value saved with the compiled pattern
-will obviously be nonsense. A field in a \fBpcre[16|32]_extra()\fP block is used
-to pass this data, as described in the
-.\" HTML <a href="pcreapi.html#extradata">
-.\" </a>
-section on matching a pattern
-.\"
-in the
-.\" HREF
-\fBpcreapi\fP
-.\"
-documentation.
-.P
-\fBWarning:\fP The tables that \fBpcre_exec()\fP and \fBpcre_dfa_exec()\fP use
-must be the same as those that were used when the pattern was compiled. If this
-is not the case, the behaviour is undefined.
-.P
-If you did not provide custom character tables when the pattern was compiled,
-the pointer in the compiled pattern is NULL, which causes the matching
-functions to use PCRE's internal tables. Thus, you do not need to take any
-special action at run time in this case.
-.P
-If you saved study data with the compiled pattern, you need to create your own
-\fBpcre[16|32]_extra\fP data block and set the \fIstudy_data\fP field to point
-to the reloaded study data. You must also set the PCRE_EXTRA_STUDY_DATA bit in
-the \fIflags\fP field to indicate that study data is present. Then pass the
-\fBpcre[16|32]_extra\fP block to the matching function in the usual way. If the
-pattern was studied for just-in-time optimization, that data cannot be saved,
-and so is lost by a save/restore cycle.
-.
-.
-.SH "COMPATIBILITY WITH DIFFERENT PCRE RELEASES"
-.rs
-.sp
-In general, it is safest to recompile all saved patterns when you update to a
-new PCRE release, though not all updates actually require this.
-.
-.
-.
-.SH AUTHOR
-.rs
-.sp
-.nf
-Philip Hazel
-University Computing Service
-Cambridge CB2 3QH, England.
-.fi
-.
-.
-.SH REVISION
-.rs
-.sp
-.nf
-Last updated: 12 November 2013
-Copyright (c) 1997-2013 University of Cambridge.
-.fi
diff --git a/dist/doc/pcresample.3 b/dist/doc/pcresample.3
deleted file mode 100644
index d7fe7ec..0000000
--- a/dist/doc/pcresample.3
+++ /dev/null
@@ -1,99 +0,0 @@
-.TH PCRESAMPLE 3 "10 January 2012" "PCRE 8.30"
-.SH NAME
-PCRE - Perl-compatible regular expressions
-.SH "PCRE SAMPLE PROGRAM"
-.rs
-.sp
-A simple, complete demonstration program, to get you started with using PCRE,
-is supplied in the file \fIpcredemo.c\fP in the PCRE distribution. A listing of
-this program is given in the
-.\" HREF
-\fBpcredemo\fP
-.\"
-documentation. If you do not have a copy of the PCRE distribution, you can save
-this listing to re-create \fIpcredemo.c\fP.
-.P
-The demonstration program, which uses the original PCRE 8-bit library, compiles
-the regular expression that is its first argument, and matches it against the
-subject string in its second argument. No PCRE options are set, and default
-character tables are used. If matching succeeds, the program outputs the
-portion of the subject that matched, together with the contents of any captured
-substrings.
-.P
-If the -g option is given on the command line, the program then goes on to
-check for further matches of the same regular expression in the same subject
-string. The logic is a little bit tricky because of the possibility of matching
-an empty string. Comments in the code explain what is going on.
-.P
-If PCRE is installed in the standard include and library directories for your
-operating system, you should be able to compile the demonstration program using
-this command:
-.sp
-  gcc -o pcredemo pcredemo.c -lpcre
-.sp
-If PCRE is installed elsewhere, you may need to add additional options to the
-command line. For example, on a Unix-like system that has PCRE installed in
-\fI/usr/local\fP, you can compile the demonstration program using a command
-like this:
-.sp
-.\" JOINSH
-  gcc -o pcredemo -I/usr/local/include pcredemo.c \e
-      -L/usr/local/lib -lpcre
-.sp
-In a Windows environment, if you want to statically link the program against a
-non-dll \fBpcre.a\fP file, you must uncomment the line that defines PCRE_STATIC
-before including \fBpcre.h\fP, because otherwise the \fBpcre_malloc()\fP and
-\fBpcre_free()\fP exported functions will be declared
-\fB__declspec(dllimport)\fP, with unwanted results.
-.P
-Once you have compiled and linked the demonstration program, you can run simple
-tests like this:
-.sp
-  ./pcredemo 'cat|dog' 'the cat sat on the mat'
-  ./pcredemo -g 'cat|dog' 'the dog sat on the cat'
-.sp
-Note that there is a much more comprehensive test program, called
-.\" HREF
-\fBpcretest\fP,
-.\"
-which supports many more facilities for testing regular expressions and both
-PCRE libraries. The
-.\" HREF
-\fBpcredemo\fP
-.\"
-program is provided as a simple coding example.
-.P
-If you try to run
-.\" HREF
-\fBpcredemo\fP
-.\"
-when PCRE is not installed in the standard library directory, you may get an
-error like this on some operating systems (e.g. Solaris):
-.sp
-  ld.so.1: a.out: fatal: libpcre.so.0: open failed: No such file or directory
-.sp
-This is caused by the way shared library support works on those systems. You
-need to add
-.sp
-  -R/usr/local/lib
-.sp
-(for example) to the compile command to get round this problem.
-.
-.
-.SH AUTHOR
-.rs
-.sp
-.nf
-Philip Hazel
-University Computing Service
-Cambridge CB2 3QH, England.
-.fi
-.
-.
-.SH REVISION
-.rs
-.sp
-.nf
-Last updated: 10 January 2012
-Copyright (c) 1997-2012 University of Cambridge.
-.fi
diff --git a/dist/doc/pcrestack.3 b/dist/doc/pcrestack.3
deleted file mode 100644
index 798f0bc..0000000
--- a/dist/doc/pcrestack.3
+++ /dev/null
@@ -1,215 +0,0 @@
-.TH PCRESTACK 3 "24 June 2012" "PCRE 8.30"
-.SH NAME
-PCRE - Perl-compatible regular expressions
-.SH "PCRE DISCUSSION OF STACK USAGE"
-.rs
-.sp
-When you call \fBpcre[16|32]_exec()\fP, it makes use of an internal function
-called \fBmatch()\fP. This calls itself recursively at branch points in the
-pattern, in order to remember the state of the match so that it can back up and
-try a different alternative if the first one fails. As matching proceeds deeper
-and deeper into the tree of possibilities, the recursion depth increases. The
-\fBmatch()\fP function is also called in other circumstances, for example,
-whenever a parenthesized sub-pattern is entered, and in certain cases of
-repetition.
-.P
-Not all calls of \fBmatch()\fP increase the recursion depth; for an item such
-as a* it may be called several times at the same level, after matching
-different numbers of a's. Furthermore, in a number of cases where the result of
-the recursive call would immediately be passed back as the result of the
-current call (a "tail recursion"), the function is just restarted instead.
-.P
-The above comments apply when \fBpcre[16|32]_exec()\fP is run in its normal
-interpretive manner. If the pattern was studied with the
-PCRE_STUDY_JIT_COMPILE option, and just-in-time compiling was successful, and
-the options passed to \fBpcre[16|32]_exec()\fP were not incompatible, the matching
-process uses the JIT-compiled code instead of the \fBmatch()\fP function. In
-this case, the memory requirements are handled entirely differently. See the
-.\" HREF
-\fBpcrejit\fP
-.\"
-documentation for details.
-.P
-The \fBpcre[16|32]_dfa_exec()\fP function operates in an entirely different way,
-and uses recursion only when there is a regular expression recursion or
-subroutine call in the pattern. This includes the processing of assertion and
-"once-only" subpatterns, which are handled like subroutine calls. Normally,
-these are never very deep, and the limit on the complexity of
-\fBpcre[16|32]_dfa_exec()\fP is controlled by the amount of workspace it is given.
-However, it is possible to write patterns with runaway infinite recursions;
-such patterns will cause \fBpcre[16|32]_dfa_exec()\fP to run out of stack. At
-present, there is no protection against this.
-.P
-The comments that follow do NOT apply to \fBpcre[16|32]_dfa_exec()\fP; they are
-relevant only for \fBpcre[16|32]_exec()\fP without the JIT optimization.
-.
-.
-.SS "Reducing \fBpcre[16|32]_exec()\fP's stack usage"
-.rs
-.sp
-Each time that \fBmatch()\fP is actually called recursively, it uses memory
-from the process stack. For certain kinds of pattern and data, very large
-amounts of stack may be needed, despite the recognition of "tail recursion".
-You can often reduce the amount of recursion, and therefore the amount of stack
-used, by modifying the pattern that is being matched. Consider, for example,
-this pattern:
-.sp
-  ([^<]|<(?!inet))+
-.sp
-It matches from wherever it starts until it encounters "<inet" or the end of
-the data, and is the kind of pattern that might be used when processing an XML
-file. Each iteration of the outer parentheses matches either one character that
-is not "<" or a "<" that is not followed by "inet". However, each time a
-parenthesis is processed, a recursion occurs, so this formulation uses a stack
-frame for each matched character. For a long string, a lot of stack is
-required. Consider now this rewritten pattern, which matches exactly the same
-strings:
-.sp
-  ([^<]++|<(?!inet))+
-.sp
-This uses very much less stack, because runs of characters that do not contain
-"<" are "swallowed" in one item inside the parentheses. Recursion happens only
-when a "<" character that is not followed by "inet" is encountered (and we
-assume this is relatively rare). A possessive quantifier is used to stop any
-backtracking into the runs of non-"<" characters, but that is not related to
-stack usage.
-.P
-This example shows that one way of avoiding stack problems when matching long
-subject strings is to write repeated parenthesized subpatterns to match more
-than one character whenever possible.
-.
-.
-.SS "Compiling PCRE to use heap instead of stack for \fBpcre[16|32]_exec()\fP"
-.rs
-.sp
-In environments where stack memory is constrained, you might want to compile
-PCRE to use heap memory instead of stack for remembering back-up points when
-\fBpcre[16|32]_exec()\fP is running. This makes it run a lot more slowly, however.
-Details of how to do this are given in the
-.\" HREF
-\fBpcrebuild\fP
-.\"
-documentation. When built in this way, instead of using the stack, PCRE obtains
-and frees memory by calling the functions that are pointed to by the
-\fBpcre[16|32]_stack_malloc\fP and \fBpcre[16|32]_stack_free\fP variables. By
-default, these point to \fBmalloc()\fP and \fBfree()\fP, but you can replace
-the pointers to cause PCRE to use your own functions. Since the block sizes are
-always the same, and are always freed in reverse order, it may be possible to
-implement customized memory handlers that are more efficient than the standard
-functions.
-.
-.
-.SS "Limiting \fBpcre[16|32]_exec()\fP's stack usage"
-.rs
-.sp
-You can set limits on the number of times that \fBmatch()\fP is called, both in
-total and recursively. If a limit is exceeded, \fBpcre[16|32]_exec()\fP returns an
-error code. Setting suitable limits should prevent it from running out of
-stack. The default values of the limits are very large, and unlikely ever to
-operate. They can be changed when PCRE is built, and they can also be set when
-\fBpcre[16|32]_exec()\fP is called. For details of these interfaces, see the
-.\" HREF
-\fBpcrebuild\fP
-.\"
-documentation and the
-.\" HTML <a href="pcreapi.html#extradata">
-.\" </a>
-section on extra data for \fBpcre[16|32]_exec()\fP
-.\"
-in the
-.\" HREF
-\fBpcreapi\fP
-.\"
-documentation.
-.P
-As a very rough rule of thumb, you should reckon on about 500 bytes per
-recursion. Thus, if you want to limit your stack usage to 8Mb, you should set
-the limit at 16000 recursions. A 64Mb stack, on the other hand, can support
-around 128000 recursions.
-.P
-In Unix-like environments, the \fBpcretest\fP test program has a command line
-option (\fB-S\fP) that can be used to increase the size of its stack. As long
-as the stack is large enough, another option (\fB-M\fP) can be used to find the
-smallest limits that allow a particular pattern to match a given subject
-string. This is done by calling \fBpcre[16|32]_exec()\fP repeatedly with different
-limits.
-.
-.
-.SS "Obtaining an estimate of stack usage"
-.rs
-.sp
-The actual amount of stack used per recursion can vary quite a lot, depending
-on the compiler that was used to build PCRE and the optimization or debugging
-options that were set for it. The rule of thumb value of 500 bytes mentioned
-above may be larger or smaller than what is actually needed. A better
-approximation can be obtained by running this command:
-.sp
-  pcretest -m -C
-.sp
-The \fB-C\fP option causes \fBpcretest\fP to output information about the
-options with which PCRE was compiled. When \fB-m\fP is also given (before
-\fB-C\fP), information about stack use is given in a line like this:
-.sp
-  Match recursion uses stack: approximate frame size = 640 bytes
-.sp
-The value is approximate because some recursions need a bit more (up to perhaps
-16 more bytes).
-.P
-If the above command is given when PCRE is compiled to use the heap instead of
-the stack for recursion, the value that is output is the size of each block
-that is obtained from the heap.
-.
-.
-.SS "Changing stack size in Unix-like systems"
-.rs
-.sp
-In Unix-like environments, there is not often a problem with the stack unless
-very long strings are involved, though the default limit on stack size varies
-from system to system. Values from 8Mb to 64Mb are common. You can find your
-default limit by running the command:
-.sp
-  ulimit -s
-.sp
-Unfortunately, the effect of running out of stack is often SIGSEGV, though
-sometimes a more explicit error message is given. You can normally increase the
-limit on stack size by code such as this:
-.sp
-  struct rlimit rlim;
-  getrlimit(RLIMIT_STACK, &rlim);
-  rlim.rlim_cur = 100*1024*1024;
-  setrlimit(RLIMIT_STACK, &rlim);
-.sp
-This reads the current limits (soft and hard) using \fBgetrlimit()\fP, then
-attempts to increase the soft limit to 100Mb using \fBsetrlimit()\fP. You must
-do this before calling \fBpcre[16|32]_exec()\fP.
-.
-.
-.SS "Changing stack size in Mac OS X"
-.rs
-.sp
-Using \fBsetrlimit()\fP, as described above, should also work on Mac OS X. It
-is also possible to set a stack size when linking a program. There is a
-discussion about stack sizes in Mac OS X at this web site:
-.\" HTML <a href="http://developer.apple.com/qa/qa2005/qa1419.html">
-.\" </a>
-http://developer.apple.com/qa/qa2005/qa1419.html.
-.\"
-.
-.
-.SH AUTHOR
-.rs
-.sp
-.nf
-Philip Hazel
-University Computing Service
-Cambridge CB2 3QH, England.
-.fi
-.
-.
-.SH REVISION
-.rs
-.sp
-.nf
-Last updated: 24 June 2012
-Copyright (c) 1997-2012 University of Cambridge.
-.fi
diff --git a/dist/doc/pcretest.1 b/dist/doc/pcretest.1
deleted file mode 100644
index 92640da..0000000
--- a/dist/doc/pcretest.1
+++ /dev/null
@@ -1,1156 +0,0 @@
-.TH PCRETEST 1 "09 February 2014" "PCRE 8.35"
-.SH NAME
-pcretest - a program for testing Perl-compatible regular expressions.
-.SH SYNOPSIS
-.rs
-.sp
-.B pcretest "[options] [input file [output file]]"
-.sp
-\fBpcretest\fP was written as a test program for the PCRE regular expression
-library itself, but it can also be used for experimenting with regular
-expressions. This document describes the features of the test program; for
-details of the regular expressions themselves, see the
-.\" HREF
-\fBpcrepattern\fP
-.\"
-documentation. For details of the PCRE library function calls and their
-options, see the
-.\" HREF
-\fBpcreapi\fP
-.\"
-,
-.\" HREF
-\fBpcre16\fP
-and
-.\" HREF
-\fBpcre32\fP
-.\"
-documentation.
-.P
-The input for \fBpcretest\fP is a sequence of regular expression patterns and
-strings to be matched, as described below. The output shows the result of each
-match. Options on the command line and the patterns control PCRE options and
-exactly what is output.
-.P
-As PCRE has evolved, it has acquired many different features, and as a result,
-\fBpcretest\fP now has rather a lot of obscure options for testing every
-possible feature. Some of these options are specifically designed for use in
-conjunction with the test script and data files that are distributed as part of
-PCRE, and are unlikely to be of use otherwise. They are all documented here,
-but without much justification.
-.
-.
-.SH "INPUT DATA FORMAT"
-.rs
-.sp
-Input to \fBpcretest\fP is processed line by line, either by calling the C
-library's \fBfgets()\fP function, or via the \fBlibreadline\fP library (see
-below). In Unix-like environments, \fBfgets()\fP treats any bytes other than
-newline as data characters. However, in some Windows environments character 26
-(hex 1A) causes an immediate end of file, and no further data is read. For
-maximum portability, therefore, it is safest to use only ASCII characters in
-\fBpcretest\fP input files.
-.
-.
-.SH "PCRE's 8-BIT, 16-BIT AND 32-BIT LIBRARIES"
-.rs
-.sp
-From release 8.30, two separate PCRE libraries can be built. The original one
-supports 8-bit character strings, whereas the newer 16-bit library supports
-character strings encoded in 16-bit units. From release 8.32, a third library
-can be built, supporting character strings encoded in 32-bit units. The
-\fBpcretest\fP program can be used to test all three libraries. However, it is
-itself still an 8-bit program, reading 8-bit input and writing 8-bit output.
-When testing the 16-bit or 32-bit library, the patterns and data strings are
-converted to 16- or 32-bit format before being passed to the PCRE library
-functions. Results are converted to 8-bit for output.
-.P
-References to functions and structures of the form \fBpcre[16|32]_xx\fP below
-mean "\fBpcre_xx\fP when using the 8-bit library, \fBpcre16_xx\fP when using
-the 16-bit library, or \fBpcre32_xx\fP when using the 32-bit library".
-.
-.
-.SH "COMMAND LINE OPTIONS"
-.rs
-.TP 10
-\fB-8\fP
-If both the 8-bit library has been built, this option causes the 8-bit library
-to be used (which is the default); if the 8-bit library has not been built,
-this option causes an error.
-.TP 10
-\fB-16\fP
-If both the 8-bit or the 32-bit, and the 16-bit libraries have been built, this
-option causes the 16-bit library to be used. If only the 16-bit library has been
-built, this is the default (so has no effect). If only the 8-bit or the 32-bit
-library has been built, this option causes an error.
-.TP 10
-\fB-32\fP
-If both the 8-bit or the 16-bit, and the 32-bit libraries have been built, this
-option causes the 32-bit library to be used. If only the 32-bit library has been
-built, this is the default (so has no effect). If only the 8-bit or the 16-bit
-library has been built, this option causes an error.
-.TP 10
-\fB-b\fP
-Behave as if each pattern has the \fB/B\fP (show byte code) modifier; the
-internal form is output after compilation.
-.TP 10
-\fB-C\fP
-Output the version number of the PCRE library, and all available information
-about the optional features that are included, and then exit with zero exit
-code. All other options are ignored.
-.TP 10
-\fB-C\fP \fIoption\fP
-Output information about a specific build-time option, then exit. This
-functionality is intended for use in scripts such as \fBRunTest\fP. The
-following options output the value and set the exit code as indicated:
-.sp
-  ebcdic-nl  the code for LF (= NL) in an EBCDIC environment:
-               0x15 or 0x25
-               0 if used in an ASCII environment
-               exit code is always 0
-  linksize   the configured internal link size (2, 3, or 4)
-               exit code is set to the link size
-  newline    the default newline setting:
-               CR, LF, CRLF, ANYCRLF, or ANY
-               exit code is always 0
-  bsr        the default setting for what \eR matches:
-               ANYCRLF or ANY
-               exit code is always 0
-.sp
-The following options output 1 for true or 0 for false, and set the exit code
-to the same value:
-.sp
-  ebcdic     compiled for an EBCDIC environment
-  jit        just-in-time support is available
-  pcre16     the 16-bit library was built
-  pcre32     the 32-bit library was built
-  pcre8      the 8-bit library was built
-  ucp        Unicode property support is available
-  utf        UTF-8 and/or UTF-16 and/or UTF-32 support
-               is available
-.sp
-If an unknown option is given, an error message is output; the exit code is 0.
-.TP 10
-\fB-d\fP
-Behave as if each pattern has the \fB/D\fP (debug) modifier; the internal
-form and information about the compiled pattern is output after compilation;
-\fB-d\fP is equivalent to \fB-b -i\fP.
-.TP 10
-\fB-dfa\fP
-Behave as if each data line contains the \eD escape sequence; this causes the
-alternative matching function, \fBpcre[16|32]_dfa_exec()\fP, to be used instead
-of the standard \fBpcre[16|32]_exec()\fP function (more detail is given below).
-.TP 10
-\fB-help\fP
-Output a brief summary these options and then exit.
-.TP 10
-\fB-i\fP
-Behave as if each pattern has the \fB/I\fP modifier; information about the
-compiled pattern is given after compilation.
-.TP 10
-\fB-M\fP
-Behave as if each data line contains the \eM escape sequence; this causes
-PCRE to discover the minimum MATCH_LIMIT and MATCH_LIMIT_RECURSION settings by
-calling \fBpcre[16|32]_exec()\fP repeatedly with different limits.
-.TP 10
-\fB-m\fP
-Output the size of each compiled pattern after it has been compiled. This is
-equivalent to adding \fB/M\fP to each regular expression. The size is given in
-bytes for both libraries.
-.TP 10
-\fB-O\fP
-Behave as if each pattern has the \fB/O\fP modifier, that is disable
-auto-possessification for all patterns.
-.TP 10
-\fB-o\fP \fIosize\fP
-Set the number of elements in the output vector that is used when calling
-\fBpcre[16|32]_exec()\fP or \fBpcre[16|32]_dfa_exec()\fP to be \fIosize\fP. The
-default value is 45, which is enough for 14 capturing subexpressions for
-\fBpcre[16|32]_exec()\fP or 22 different matches for
-\fBpcre[16|32]_dfa_exec()\fP.
-The vector size can be changed for individual matching calls by including \eO
-in the data line (see below).
-.TP 10
-\fB-p\fP
-Behave as if each pattern has the \fB/P\fP modifier; the POSIX wrapper API is
-used to call PCRE. None of the other options has any effect when \fB-p\fP is
-set. This option can be used only with the 8-bit library.
-.TP 10
-\fB-q\fP
-Do not output the version number of \fBpcretest\fP at the start of execution.
-.TP 10
-\fB-S\fP \fIsize\fP
-On Unix-like systems, set the size of the run-time stack to \fIsize\fP
-megabytes.
-.TP 10
-\fB-s\fP or \fB-s+\fP
-Behave as if each pattern has the \fB/S\fP modifier; in other words, force each
-pattern to be studied. If \fB-s+\fP is used, all the JIT compile options are
-passed to \fBpcre[16|32]_study()\fP, causing just-in-time optimization to be set
-up if it is available, for both full and partial matching. Specific JIT compile
-options can be selected by following \fB-s+\fP with a digit in the range 1 to
-7, which selects the JIT compile modes as follows:
-.sp
-  1  normal match only
-  2  soft partial match only
-  3  normal match and soft partial match
-  4  hard partial match only
-  6  soft and hard partial match
-  7  all three modes (default)
-.sp
-If \fB-s++\fP is used instead of \fB-s+\fP (with or without a following digit),
-the text "(JIT)" is added to the first output line after a match or no match
-when JIT-compiled code was actually used.
-.sp
-Note that there are pattern options that can override \fB-s\fP, either
-specifying no studying at all, or suppressing JIT compilation.
-.sp
-If the \fB/I\fP or \fB/D\fP option is present on a pattern (requesting output
-about the compiled pattern), information about the result of studying is not
-included when studying is caused only by \fB-s\fP and neither \fB-i\fP nor
-\fB-d\fP is present on the command line. This behaviour means that the output
-from tests that are run with and without \fB-s\fP should be identical, except
-when options that output information about the actual running of a match are
-set.
-.sp
-The \fB-M\fP, \fB-t\fP, and \fB-tm\fP options, which give information about
-resources used, are likely to produce different output with and without
-\fB-s\fP. Output may also differ if the \fB/C\fP option is present on an
-individual pattern. This uses callouts to trace the the matching process, and
-this may be different between studied and non-studied patterns. If the pattern
-contains (*MARK) items there may also be differences, for the same reason. The
-\fB-s\fP command line option can be overridden for specific patterns that
-should never be studied (see the \fB/S\fP pattern modifier below).
-.TP 10
-\fB-t\fP
-Run each compile, study, and match many times with a timer, and output the
-resulting times per compile, study, or match (in milliseconds). Do not set
-\fB-m\fP with \fB-t\fP, because you will then get the size output a zillion
-times, and the timing will be distorted. You can control the number of
-iterations that are used for timing by following \fB-t\fP with a number (as a
-separate item on the command line). For example, "-t 1000" iterates 1000 times.
-The default is to iterate 500000 times.
-.TP 10
-\fB-tm\fP
-This is like \fB-t\fP except that it times only the matching phase, not the
-compile or study phases.
-.TP 10
-\fB-T\fP \fB-TM\fP
-These behave like \fB-t\fP and \fB-tm\fP, but in addition, at the end of a run,
-the total times for all compiles, studies, and matches are output.
-.
-.
-.SH DESCRIPTION
-.rs
-.sp
-If \fBpcretest\fP is given two filename arguments, it reads from the first and
-writes to the second. If it is given only one filename argument, it reads from
-that file and writes to stdout. Otherwise, it reads from stdin and writes to
-stdout, and prompts for each line of input, using "re>" to prompt for regular
-expressions, and "data>" to prompt for data lines.
-.P
-When \fBpcretest\fP is built, a configuration option can specify that it should
-be linked with the \fBlibreadline\fP library. When this is done, if the input
-is from a terminal, it is read using the \fBreadline()\fP function. This
-provides line-editing and history facilities. The output from the \fB-help\fP
-option states whether or not \fBreadline()\fP will be used.
-.P
-The program handles any number of sets of input on a single input file. Each
-set starts with a regular expression, and continues with any number of data
-lines to be matched against that pattern.
-.P
-Each data line is matched separately and independently. If you want to do
-multi-line matches, you have to use the \en escape sequence (or \er or \er\en,
-etc., depending on the newline setting) in a single line of input to encode the
-newline sequences. There is no limit on the length of data lines; the input
-buffer is automatically extended if it is too small.
-.P
-An empty line signals the end of the data lines, at which point a new regular
-expression is read. The regular expressions are given enclosed in any
-non-alphanumeric delimiters other than backslash, for example:
-.sp
-  /(a|bc)x+yz/
-.sp
-White space before the initial delimiter is ignored. A regular expression may
-be continued over several input lines, in which case the newline characters are
-included within it. It is possible to include the delimiter within the pattern
-by escaping it, for example
-.sp
-  /abc\e/def/
-.sp
-If you do so, the escape and the delimiter form part of the pattern, but since
-delimiters are always non-alphanumeric, this does not affect its interpretation.
-If the terminating delimiter is immediately followed by a backslash, for
-example,
-.sp
-  /abc/\e
-.sp
-then a backslash is added to the end of the pattern. This is done to provide a
-way of testing the error condition that arises if a pattern finishes with a
-backslash, because
-.sp
-  /abc\e/
-.sp
-is interpreted as the first line of a pattern that starts with "abc/", causing
-pcretest to read the next line as a continuation of the regular expression.
-.
-.
-.SH "PATTERN MODIFIERS"
-.rs
-.sp
-A pattern may be followed by any number of modifiers, which are mostly single
-characters, though some of these can be qualified by further characters.
-Following Perl usage, these are referred to below as, for example, "the
-\fB/i\fP modifier", even though the delimiter of the pattern need not always be
-a slash, and no slash is used when writing modifiers. White space may appear
-between the final pattern delimiter and the first modifier, and between the
-modifiers themselves. For reference, here is a complete list of modifiers. They
-fall into several groups that are described in detail in the following
-sections.
-.sp
-  \fB/8\fP              set UTF mode
-  \fB/9\fP              set PCRE_NEVER_UTF (locks out UTF mode)
-  \fB/?\fP              disable UTF validity check
-  \fB/+\fP              show remainder of subject after match
-  \fB/=\fP              show all captures (not just those that are set)
-.sp
-  \fB/A\fP              set PCRE_ANCHORED
-  \fB/B\fP              show compiled code
-  \fB/C\fP              set PCRE_AUTO_CALLOUT
-  \fB/D\fP              same as \fB/B\fP plus \fB/I\fP
-  \fB/E\fP              set PCRE_DOLLAR_ENDONLY
-  \fB/F\fP              flip byte order in compiled pattern
-  \fB/f\fP              set PCRE_FIRSTLINE
-  \fB/G\fP              find all matches (shorten string)
-  \fB/g\fP              find all matches (use startoffset)
-  \fB/I\fP              show information about pattern
-  \fB/i\fP              set PCRE_CASELESS
-  \fB/J\fP              set PCRE_DUPNAMES
-  \fB/K\fP              show backtracking control names
-  \fB/L\fP              set locale
-  \fB/M\fP              show compiled memory size
-  \fB/m\fP              set PCRE_MULTILINE
-  \fB/N\fP              set PCRE_NO_AUTO_CAPTURE
-  \fB/O\fP              set PCRE_NO_AUTO_POSSESS
-  \fB/P\fP              use the POSIX wrapper
-  \fB/Q\fP              test external stack check function
-  \fB/S\fP              study the pattern after compilation
-  \fB/s\fP              set PCRE_DOTALL
-  \fB/T\fP              select character tables
-  \fB/U\fP              set PCRE_UNGREEDY
-  \fB/W\fP              set PCRE_UCP
-  \fB/X\fP              set PCRE_EXTRA
-  \fB/x\fP              set PCRE_EXTENDED
-  \fB/Y\fP              set PCRE_NO_START_OPTIMIZE
-  \fB/Z\fP              don't show lengths in \fB/B\fP output
-.sp
-  \fB/<any>\fP          set PCRE_NEWLINE_ANY
-  \fB/<anycrlf>\fP      set PCRE_NEWLINE_ANYCRLF
-  \fB/<cr>\fP           set PCRE_NEWLINE_CR
-  \fB/<crlf>\fP         set PCRE_NEWLINE_CRLF
-  \fB/<lf>\fP           set PCRE_NEWLINE_LF
-  \fB/<bsr_anycrlf>\fP  set PCRE_BSR_ANYCRLF
-  \fB/<bsr_unicode>\fP  set PCRE_BSR_UNICODE
-  \fB/<JS>\fP           set PCRE_JAVASCRIPT_COMPAT
-.sp
-.
-.
-.SS "Perl-compatible modifiers"
-.rs
-.sp
-The \fB/i\fP, \fB/m\fP, \fB/s\fP, and \fB/x\fP modifiers set the PCRE_CASELESS,
-PCRE_MULTILINE, PCRE_DOTALL, or PCRE_EXTENDED options, respectively, when
-\fBpcre[16|32]_compile()\fP is called. These four modifier letters have the same
-effect as they do in Perl. For example:
-.sp
-  /caseless/i
-.sp
-.
-.
-.SS "Modifiers for other PCRE options"
-.rs
-.sp
-The following table shows additional modifiers for setting PCRE compile-time
-options that do not correspond to anything in Perl:
-.sp
-  \fB/8\fP              PCRE_UTF8           ) when using the 8-bit
-  \fB/?\fP              PCRE_NO_UTF8_CHECK  )   library
-.sp
-  \fB/8\fP              PCRE_UTF16          ) when using the 16-bit
-  \fB/?\fP              PCRE_NO_UTF16_CHECK )   library
-.sp
-  \fB/8\fP              PCRE_UTF32          ) when using the 32-bit
-  \fB/?\fP              PCRE_NO_UTF32_CHECK )   library
-.sp
-  \fB/9\fP              PCRE_NEVER_UTF
-  \fB/A\fP              PCRE_ANCHORED
-  \fB/C\fP              PCRE_AUTO_CALLOUT
-  \fB/E\fP              PCRE_DOLLAR_ENDONLY
-  \fB/f\fP              PCRE_FIRSTLINE
-  \fB/J\fP              PCRE_DUPNAMES
-  \fB/N\fP              PCRE_NO_AUTO_CAPTURE
-  \fB/O\fP              PCRE_NO_AUTO_POSSESS
-  \fB/U\fP              PCRE_UNGREEDY
-  \fB/W\fP              PCRE_UCP
-  \fB/X\fP              PCRE_EXTRA
-  \fB/Y\fP              PCRE_NO_START_OPTIMIZE
-  \fB/<any>\fP          PCRE_NEWLINE_ANY
-  \fB/<anycrlf>\fP      PCRE_NEWLINE_ANYCRLF
-  \fB/<cr>\fP           PCRE_NEWLINE_CR
-  \fB/<crlf>\fP         PCRE_NEWLINE_CRLF
-  \fB/<lf>\fP           PCRE_NEWLINE_LF
-  \fB/<bsr_anycrlf>\fP  PCRE_BSR_ANYCRLF
-  \fB/<bsr_unicode>\fP  PCRE_BSR_UNICODE
-  \fB/<JS>\fP           PCRE_JAVASCRIPT_COMPAT
-.sp
-The modifiers that are enclosed in angle brackets are literal strings as shown,
-including the angle brackets, but the letters within can be in either case.
-This example sets multiline matching with CRLF as the line ending sequence:
-.sp
-  /^abc/m<CRLF>
-.sp
-As well as turning on the PCRE_UTF8/16/32 option, the \fB/8\fP modifier causes
-all non-printing characters in output strings to be printed using the
-\ex{hh...} notation. Otherwise, those less than 0x100 are output in hex without
-the curly brackets.
-.P
-Full details of the PCRE options are given in the
-.\" HREF
-\fBpcreapi\fP
-.\"
-documentation.
-.
-.
-.SS "Finding all matches in a string"
-.rs
-.sp
-Searching for all possible matches within each subject string can be requested
-by the \fB/g\fP or \fB/G\fP modifier. After finding a match, PCRE is called
-again to search the remainder of the subject string. The difference between
-\fB/g\fP and \fB/G\fP is that the former uses the \fIstartoffset\fP argument to
-\fBpcre[16|32]_exec()\fP to start searching at a new point within the entire
-string (which is in effect what Perl does), whereas the latter passes over a
-shortened substring. This makes a difference to the matching process if the
-pattern begins with a lookbehind assertion (including \eb or \eB).
-.P
-If any call to \fBpcre[16|32]_exec()\fP in a \fB/g\fP or \fB/G\fP sequence matches
-an empty string, the next call is done with the PCRE_NOTEMPTY_ATSTART and
-PCRE_ANCHORED flags set in order to search for another, non-empty, match at the
-same point. If this second match fails, the start offset is advanced, and the
-normal match is retried. This imitates the way Perl handles such cases when
-using the \fB/g\fP modifier or the \fBsplit()\fP function. Normally, the start
-offset is advanced by one character, but if the newline convention recognizes
-CRLF as a newline, and the current character is CR followed by LF, an advance
-of two is used.
-.
-.
-.SS "Other modifiers"
-.rs
-.sp
-There are yet more modifiers for controlling the way \fBpcretest\fP
-operates.
-.P
-The \fB/+\fP modifier requests that as well as outputting the substring that
-matched the entire pattern, \fBpcretest\fP should in addition output the
-remainder of the subject string. This is useful for tests where the subject
-contains multiple copies of the same substring. If the \fB+\fP modifier appears
-twice, the same action is taken for captured substrings. In each case the
-remainder is output on the following line with a plus character following the
-capture number. Note that this modifier must not immediately follow the /S
-modifier because /S+ and /S++ have other meanings.
-.P
-The \fB/=\fP modifier requests that the values of all potential captured
-parentheses be output after a match. By default, only those up to the highest
-one actually used in the match are output (corresponding to the return code
-from \fBpcre[16|32]_exec()\fP). Values in the offsets vector corresponding to
-higher numbers should be set to -1, and these are output as "<unset>". This
-modifier gives a way of checking that this is happening.
-.P
-The \fB/B\fP modifier is a debugging feature. It requests that \fBpcretest\fP
-output a representation of the compiled code after compilation. Normally this
-information contains length and offset values; however, if \fB/Z\fP is also
-present, this data is replaced by spaces. This is a special feature for use in
-the automatic test scripts; it ensures that the same output is generated for
-different internal link sizes.
-.P
-The \fB/D\fP modifier is a PCRE debugging feature, and is equivalent to
-\fB/BI\fP, that is, both the \fB/B\fP and the \fB/I\fP modifiers.
-.P
-The \fB/F\fP modifier causes \fBpcretest\fP to flip the byte order of the
-2-byte and 4-byte fields in the compiled pattern. This facility is for testing
-the feature in PCRE that allows it to execute patterns that were compiled on a
-host with a different endianness. This feature is not available when the POSIX
-interface to PCRE is being used, that is, when the \fB/P\fP pattern modifier is
-specified. See also the section about saving and reloading compiled patterns
-below.
-.P
-The \fB/I\fP modifier requests that \fBpcretest\fP output information about the
-compiled pattern (whether it is anchored, has a fixed first character, and
-so on). It does this by calling \fBpcre[16|32]_fullinfo()\fP after compiling a
-pattern. If the pattern is studied, the results of that are also output. In
-this output, the word "char" means a non-UTF character, that is, the value of a
-single data item (8-bit, 16-bit, or 32-bit, depending on the library that is
-being tested).
-.P
-The \fB/K\fP modifier requests \fBpcretest\fP to show names from backtracking
-control verbs that are returned from calls to \fBpcre[16|32]_exec()\fP. It causes
-\fBpcretest\fP to create a \fBpcre[16|32]_extra\fP block if one has not already
-been created by a call to \fBpcre[16|32]_study()\fP, and to set the
-PCRE_EXTRA_MARK flag and the \fBmark\fP field within it, every time that
-\fBpcre[16|32]_exec()\fP is called. If the variable that the \fBmark\fP field
-points to is non-NULL for a match, non-match, or partial match, \fBpcretest\fP
-prints the string to which it points. For a match, this is shown on a line by
-itself, tagged with "MK:". For a non-match it is added to the message.
-.P
-The \fB/L\fP modifier must be followed directly by the name of a locale, for
-example,
-.sp
-  /pattern/Lfr_FR
-.sp
-For this reason, it must be the last modifier. The given locale is set,
-\fBpcre[16|32]_maketables()\fP is called to build a set of character tables for
-the locale, and this is then passed to \fBpcre[16|32]_compile()\fP when compiling
-the regular expression. Without an \fB/L\fP (or \fB/T\fP) modifier, NULL is
-passed as the tables pointer; that is, \fB/L\fP applies only to the expression
-on which it appears.
-.P
-The \fB/M\fP modifier causes the size in bytes of the memory block used to hold
-the compiled pattern to be output. This does not include the size of the
-\fBpcre[16|32]\fP block; it is just the actual compiled data. If the pattern is
-successfully studied with the PCRE_STUDY_JIT_COMPILE option, the size of the
-JIT compiled code is also output.
-.P
-The \fB/Q\fP modifier is used to test the use of \fBpcre_stack_guard\fP. It
-must be followed by '0' or '1', specifying the return code to be given from an
-external function that is passed to PCRE and used for stack checking during
-compilation (see the
-.\" HREF
-\fBpcreapi\fP
-.\"
-documentation for details).
-.P
-The \fB/S\fP modifier causes \fBpcre[16|32]_study()\fP to be called after the
-expression has been compiled, and the results used when the expression is
-matched. There are a number of qualifying characters that may follow \fB/S\fP.
-They may appear in any order.
-.P
-If \fB/S\fP is followed by an exclamation mark, \fBpcre[16|32]_study()\fP is
-called with the PCRE_STUDY_EXTRA_NEEDED option, causing it always to return a
-\fBpcre_extra\fP block, even when studying discovers no useful information.
-.P
-If \fB/S\fP is followed by a second S character, it suppresses studying, even
-if it was requested externally by the \fB-s\fP command line option. This makes
-it possible to specify that certain patterns are always studied, and others are
-never studied, independently of \fB-s\fP. This feature is used in the test
-files in a few cases where the output is different when the pattern is studied.
-.P
-If the \fB/S\fP modifier is followed by a + character, the call to
-\fBpcre[16|32]_study()\fP is made with all the JIT study options, requesting
-just-in-time optimization support if it is available, for both normal and
-partial matching. If you want to restrict the JIT compiling modes, you can
-follow \fB/S+\fP with a digit in the range 1 to 7:
-.sp
-  1  normal match only
-  2  soft partial match only
-  3  normal match and soft partial match
-  4  hard partial match only
-  6  soft and hard partial match
-  7  all three modes (default)
-.sp
-If \fB/S++\fP is used instead of \fB/S+\fP (with or without a following digit),
-the text "(JIT)" is added to the first output line after a match or no match
-when JIT-compiled code was actually used.
-.P
-Note that there is also an independent \fB/+\fP modifier; it must not be given
-immediately after \fB/S\fP or \fB/S+\fP because this will be misinterpreted.
-.P
-If JIT studying is successful, the compiled JIT code will automatically be used
-when \fBpcre[16|32]_exec()\fP is run, except when incompatible run-time options
-are specified. For more details, see the
-.\" HREF
-\fBpcrejit\fP
-.\"
-documentation. See also the \fB\eJ\fP escape sequence below for a way of
-setting the size of the JIT stack.
-.P
-Finally, if \fB/S\fP is followed by a minus character, JIT compilation is
-suppressed, even if it was requested externally by the \fB-s\fP command line
-option. This makes it possible to specify that JIT is never to be used for
-certain patterns.
-.P
-The \fB/T\fP modifier must be followed by a single digit. It causes a specific
-set of built-in character tables to be passed to \fBpcre[16|32]_compile()\fP. It
-is used in the standard PCRE tests to check behaviour with different character
-tables. The digit specifies the tables as follows:
-.sp
-  0   the default ASCII tables, as distributed in
-        pcre_chartables.c.dist
-  1   a set of tables defining ISO 8859 characters
-.sp
-In table 1, some characters whose codes are greater than 128 are identified as
-letters, digits, spaces, etc.
-.
-.
-.SS "Using the POSIX wrapper API"
-.rs
-.sp
-The \fB/P\fP modifier causes \fBpcretest\fP to call PCRE via the POSIX wrapper
-API rather than its native API. This supports only the 8-bit library. When
-\fB/P\fP is set, the following modifiers set options for the \fBregcomp()\fP
-function:
-.sp
-  /i    REG_ICASE
-  /m    REG_NEWLINE
-  /N    REG_NOSUB
-  /s    REG_DOTALL     )
-  /U    REG_UNGREEDY   ) These options are not part of
-  /W    REG_UCP        )   the POSIX standard
-  /8    REG_UTF8       )
-.sp
-The \fB/+\fP modifier works as described above. All other modifiers are
-ignored.
-.
-.
-.SS "Locking out certain modifiers"
-.rs
-.sp
-PCRE can be compiled with or without support for certain features such as
-UTF-8/16/32 or Unicode properties. Accordingly, the standard tests are split up
-into a number of different files that are selected for running depending on
-which features are available. When updating the tests, it is all too easy to
-put a new test into the wrong file by mistake; for example, to put a test that
-requires UTF support into a file that is used when it is not available. To help
-detect such mistakes as early as possible, there is a facility for locking out
-specific modifiers. If an input line for \fBpcretest\fP starts with the string
-"< forbid " the following sequence of characters is taken as a list of
-forbidden modifiers. For example, in the test files that must not use UTF or
-Unicode property support, this line appears:
-.sp
-  < forbid 8W
-.sp
-This locks out the /8 and /W modifiers. An immediate error is given if they are
-subsequently encountered. If the character string contains < but not >, all the
-multi-character modifiers that begin with < are locked out. Otherwise, such
-modifiers must be explicitly listed, for example:
-.sp
-  < forbid <JS><cr>
-.sp
-There must be a single space between < and "forbid" for this feature to be
-recognised. If there is not, the line is interpreted either as a request to
-re-load a pre-compiled pattern (see "SAVING AND RELOADING COMPILED PATTERNS"
-below) or, if there is a another < character, as a pattern that uses < as its
-delimiter.
-.
-.
-.SH "DATA LINES"
-.rs
-.sp
-Before each data line is passed to \fBpcre[16|32]_exec()\fP, leading and trailing
-white space is removed, and it is then scanned for \e escapes. Some of these
-are pretty esoteric features, intended for checking out some of the more
-complicated features of PCRE. If you are just testing "ordinary" regular
-expressions, you probably don't need any of these. The following escapes are
-recognized:
-.sp
-  \ea         alarm (BEL, \ex07)
-  \eb         backspace (\ex08)
-  \ee         escape (\ex27)
-  \ef         form feed (\ex0c)
-  \en         newline (\ex0a)
-.\" JOIN
-  \eqdd       set the PCRE_MATCH_LIMIT limit to dd
-               (any number of digits)
-  \er         carriage return (\ex0d)
-  \et         tab (\ex09)
-  \ev         vertical tab (\ex0b)
-  \ennn       octal character (up to 3 octal digits); always
-               a byte unless > 255 in UTF-8 or 16-bit or 32-bit mode
-  \eo{dd...}  octal character (any number of octal digits}
-  \exhh       hexadecimal byte (up to 2 hex digits)
-  \ex{hh...}  hexadecimal character (any number of hex digits)
-.\" JOIN
-  \eA         pass the PCRE_ANCHORED option to \fBpcre[16|32]_exec()\fP
-               or \fBpcre[16|32]_dfa_exec()\fP
-.\" JOIN
-  \eB         pass the PCRE_NOTBOL option to \fBpcre[16|32]_exec()\fP
-               or \fBpcre[16|32]_dfa_exec()\fP
-.\" JOIN
-  \eCdd       call pcre[16|32]_copy_substring() for substring dd
-               after a successful match (number less than 32)
-.\" JOIN
-  \eCname     call pcre[16|32]_copy_named_substring() for substring
-               "name" after a successful match (name termin-
-               ated by next non alphanumeric character)
-.\" JOIN
-  \eC+        show the current captured substrings at callout
-               time
-  \eC-        do not supply a callout function
-.\" JOIN
-  \eC!n       return 1 instead of 0 when callout number n is
-               reached
-.\" JOIN
-  \eC!n!m     return 1 instead of 0 when callout number n is
-               reached for the nth time
-.\" JOIN
-  \eC*n       pass the number n (may be negative) as callout
-               data; this is used as the callout return value
-  \eD         use the \fBpcre[16|32]_dfa_exec()\fP match function
-  \eF         only shortest match for \fBpcre[16|32]_dfa_exec()\fP
-.\" JOIN
-  \eGdd       call pcre[16|32]_get_substring() for substring dd
-               after a successful match (number less than 32)
-.\" JOIN
-  \eGname     call pcre[16|32]_get_named_substring() for substring
-               "name" after a successful match (name termin-
-               ated by next non-alphanumeric character)
-.\" JOIN
-  \eJdd       set up a JIT stack of dd kilobytes maximum (any
-               number of digits)
-.\" JOIN
-  \eL         call pcre[16|32]_get_substringlist() after a
-               successful match
-.\" JOIN
-  \eM         discover the minimum MATCH_LIMIT and
-               MATCH_LIMIT_RECURSION settings
-.\" JOIN
-  \eN         pass the PCRE_NOTEMPTY option to \fBpcre[16|32]_exec()\fP
-               or \fBpcre[16|32]_dfa_exec()\fP; if used twice, pass the
-               PCRE_NOTEMPTY_ATSTART option
-.\" JOIN
-  \eOdd       set the size of the output vector passed to
-               \fBpcre[16|32]_exec()\fP to dd (any number of digits)
-.\" JOIN
-  \eP         pass the PCRE_PARTIAL_SOFT option to \fBpcre[16|32]_exec()\fP
-               or \fBpcre[16|32]_dfa_exec()\fP; if used twice, pass the
-               PCRE_PARTIAL_HARD option
-.\" JOIN
-  \eQdd       set the PCRE_MATCH_LIMIT_RECURSION limit to dd
-               (any number of digits)
-  \eR         pass the PCRE_DFA_RESTART option to \fBpcre[16|32]_dfa_exec()\fP
-  \eS         output details of memory get/free calls during matching
-.\" JOIN
-  \eY         pass the PCRE_NO_START_OPTIMIZE option to \fBpcre[16|32]_exec()\fP
-               or \fBpcre[16|32]_dfa_exec()\fP
-.\" JOIN
-  \eZ         pass the PCRE_NOTEOL option to \fBpcre[16|32]_exec()\fP
-               or \fBpcre[16|32]_dfa_exec()\fP
-.\" JOIN
-  \e?         pass the PCRE_NO_UTF[8|16|32]_CHECK option to
-               \fBpcre[16|32]_exec()\fP or \fBpcre[16|32]_dfa_exec()\fP
-.\" JOIN
-  \e>dd       start the match at offset dd (optional "-"; then
-               any number of digits); this sets the \fIstartoffset\fP
-               argument for \fBpcre[16|32]_exec()\fP or \fBpcre[16|32]_dfa_exec()\fP
-.\" JOIN
-  \e<cr>      pass the PCRE_NEWLINE_CR option to \fBpcre[16|32]_exec()\fP
-               or \fBpcre[16|32]_dfa_exec()\fP
-.\" JOIN
-  \e<lf>      pass the PCRE_NEWLINE_LF option to \fBpcre[16|32]_exec()\fP
-               or \fBpcre[16|32]_dfa_exec()\fP
-.\" JOIN
-  \e<crlf>    pass the PCRE_NEWLINE_CRLF option to \fBpcre[16|32]_exec()\fP
-               or \fBpcre[16|32]_dfa_exec()\fP
-.\" JOIN
-  \e<anycrlf> pass the PCRE_NEWLINE_ANYCRLF option to \fBpcre[16|32]_exec()\fP
-               or \fBpcre[16|32]_dfa_exec()\fP
-.\" JOIN
-  \e<any>     pass the PCRE_NEWLINE_ANY option to \fBpcre[16|32]_exec()\fP
-               or \fBpcre[16|32]_dfa_exec()\fP
-.sp
-The use of \ex{hh...} is not dependent on the use of the \fB/8\fP modifier on
-the pattern. It is recognized always. There may be any number of hexadecimal
-digits inside the braces; invalid values provoke error messages.
-.P
-Note that \exhh specifies one byte rather than one character in UTF-8 mode;
-this makes it possible to construct invalid UTF-8 sequences for testing
-purposes. On the other hand, \ex{hh} is interpreted as a UTF-8 character in
-UTF-8 mode, generating more than one byte if the value is greater than 127.
-When testing the 8-bit library not in UTF-8 mode, \ex{hh} generates one byte
-for values less than 256, and causes an error for greater values.
-.P
-In UTF-16 mode, all 4-digit \ex{hhhh} values are accepted. This makes it
-possible to construct invalid UTF-16 sequences for testing purposes.
-.P
-In UTF-32 mode, all 4- to 8-digit \ex{...} values are accepted. This makes it
-possible to construct invalid UTF-32 sequences for testing purposes.
-.P
-The escapes that specify line ending sequences are literal strings, exactly as
-shown. No more than one newline setting should be present in any data line.
-.P
-A backslash followed by anything else just escapes the anything else. If
-the very last character is a backslash, it is ignored. This gives a way of
-passing an empty line as data, since a real empty line terminates the data
-input.
-.P
-The \fB\eJ\fP escape provides a way of setting the maximum stack size that is
-used by the just-in-time optimization code. It is ignored if JIT optimization
-is not being used. Providing a stack that is larger than the default 32K is
-necessary only for very complicated patterns.
-.P
-If \eM is present, \fBpcretest\fP calls \fBpcre[16|32]_exec()\fP several times,
-with different values in the \fImatch_limit\fP and \fImatch_limit_recursion\fP
-fields of the \fBpcre[16|32]_extra\fP data structure, until it finds the minimum
-numbers for each parameter that allow \fBpcre[16|32]_exec()\fP to complete without
-error. Because this is testing a specific feature of the normal interpretive
-\fBpcre[16|32]_exec()\fP execution, the use of any JIT optimization that might
-have been set up by the \fB/S+\fP qualifier of \fB-s+\fP option is disabled.
-.P
-The \fImatch_limit\fP number is a measure of the amount of backtracking
-that takes place, and checking it out can be instructive. For most simple
-matches, the number is quite small, but for patterns with very large numbers of
-matching possibilities, it can become large very quickly with increasing length
-of subject string. The \fImatch_limit_recursion\fP number is a measure of how
-much stack (or, if PCRE is compiled with NO_RECURSE, how much heap) memory is
-needed to complete the match attempt.
-.P
-When \eO is used, the value specified may be higher or lower than the size set
-by the \fB-O\fP command line option (or defaulted to 45); \eO applies only to
-the call of \fBpcre[16|32]_exec()\fP for the line in which it appears.
-.P
-If the \fB/P\fP modifier was present on the pattern, causing the POSIX wrapper
-API to be used, the only option-setting sequences that have any effect are \eB,
-\eN, and \eZ, causing REG_NOTBOL, REG_NOTEMPTY, and REG_NOTEOL, respectively,
-to be passed to \fBregexec()\fP.
-.
-.
-.SH "THE ALTERNATIVE MATCHING FUNCTION"
-.rs
-.sp
-By default, \fBpcretest\fP uses the standard PCRE matching function,
-\fBpcre[16|32]_exec()\fP to match each data line. PCRE also supports an
-alternative matching function, \fBpcre[16|32]_dfa_test()\fP, which operates in a
-different way, and has some restrictions. The differences between the two
-functions are described in the
-.\" HREF
-\fBpcrematching\fP
-.\"
-documentation.
-.P
-If a data line contains the \eD escape sequence, or if the command line
-contains the \fB-dfa\fP option, the alternative matching function is used.
-This function finds all possible matches at a given point. If, however, the \eF
-escape sequence is present in the data line, it stops after the first match is
-found. This is always the shortest possible match.
-.
-.
-.SH "DEFAULT OUTPUT FROM PCRETEST"
-.rs
-.sp
-This section describes the output when the normal matching function,
-\fBpcre[16|32]_exec()\fP, is being used.
-.P
-When a match succeeds, \fBpcretest\fP outputs the list of captured substrings
-that \fBpcre[16|32]_exec()\fP returns, starting with number 0 for the string that
-matched the whole pattern. Otherwise, it outputs "No match" when the return is
-PCRE_ERROR_NOMATCH, and "Partial match:" followed by the partially matching
-substring when \fBpcre[16|32]_exec()\fP returns PCRE_ERROR_PARTIAL. (Note that
-this is the entire substring that was inspected during the partial match; it
-may include characters before the actual match start if a lookbehind assertion,
-\eK, \eb, or \eB was involved.) For any other return, \fBpcretest\fP outputs
-the PCRE negative error number and a short descriptive phrase. If the error is
-a failed UTF string check, the offset of the start of the failing character and
-the reason code are also output, provided that the size of the output vector is
-at least two. Here is an example of an interactive \fBpcretest\fP run.
-.sp
-  $ pcretest
-  PCRE version 8.13 2011-04-30
-.sp
-    re> /^abc(\ed+)/
-  data> abc123
-   0: abc123
-   1: 123
-  data> xyz
-  No match
-.sp
-Unset capturing substrings that are not followed by one that is set are not
-returned by \fBpcre[16|32]_exec()\fP, and are not shown by \fBpcretest\fP. In the
-following example, there are two capturing substrings, but when the first data
-line is matched, the second, unset substring is not shown. An "internal" unset
-substring is shown as "<unset>", as for the second data line.
-.sp
-    re> /(a)|(b)/
-  data> a
-   0: a
-   1: a
-  data> b
-   0: b
-   1: <unset>
-   2: b
-.sp
-If the strings contain any non-printing characters, they are output as \exhh
-escapes if the value is less than 256 and UTF mode is not set. Otherwise they
-are output as \ex{hh...} escapes. See below for the definition of non-printing
-characters. If the pattern has the \fB/+\fP modifier, the output for substring
-0 is followed by the the rest of the subject string, identified by "0+" like
-this:
-.sp
-    re> /cat/+
-  data> cataract
-   0: cat
-   0+ aract
-.sp
-If the pattern has the \fB/g\fP or \fB/G\fP modifier, the results of successive
-matching attempts are output in sequence, like this:
-.sp
-    re> /\eBi(\ew\ew)/g
-  data> Mississippi
-   0: iss
-   1: ss
-   0: iss
-   1: ss
-   0: ipp
-   1: pp
-.sp
-"No match" is output only if the first match attempt fails. Here is an example
-of a failure message (the offset 4 that is specified by \e>4 is past the end of
-the subject string):
-.sp
-    re> /xyz/
-  data> xyz\e>4
-  Error -24 (bad offset value)
-.P
-If any of the sequences \fB\eC\fP, \fB\eG\fP, or \fB\eL\fP are present in a
-data line that is successfully matched, the substrings extracted by the
-convenience functions are output with C, G, or L after the string number
-instead of a colon. This is in addition to the normal full list. The string
-length (that is, the return from the extraction function) is given in
-parentheses after each string for \fB\eC\fP and \fB\eG\fP.
-.P
-Note that whereas patterns can be continued over several lines (a plain ">"
-prompt is used for continuations), data lines may not. However newlines can be
-included in data by means of the \en escape (or \er, \er\en, etc., depending on
-the newline sequence setting).
-.
-.
-.
-.SH "OUTPUT FROM THE ALTERNATIVE MATCHING FUNCTION"
-.rs
-.sp
-When the alternative matching function, \fBpcre[16|32]_dfa_exec()\fP, is used (by
-means of the \eD escape sequence or the \fB-dfa\fP command line option), the
-output consists of a list of all the matches that start at the first point in
-the subject where there is at least one match. For example:
-.sp
-    re> /(tang|tangerine|tan)/
-  data> yellow tangerine\eD
-   0: tangerine
-   1: tang
-   2: tan
-.sp
-(Using the normal matching function on this data finds only "tang".) The
-longest matching string is always given first (and numbered zero). After a
-PCRE_ERROR_PARTIAL return, the output is "Partial match:", followed by the
-partially matching substring. (Note that this is the entire substring that was
-inspected during the partial match; it may include characters before the actual
-match start if a lookbehind assertion, \eK, \eb, or \eB was involved.)
-.P
-If \fB/g\fP is present on the pattern, the search for further matches resumes
-at the end of the longest match. For example:
-.sp
-    re> /(tang|tangerine|tan)/g
-  data> yellow tangerine and tangy sultana\eD
-   0: tangerine
-   1: tang
-   2: tan
-   0: tang
-   1: tan
-   0: tan
-.sp
-Since the matching function does not support substring capture, the escape
-sequences that are concerned with captured substrings are not relevant.
-.
-.
-.SH "RESTARTING AFTER A PARTIAL MATCH"
-.rs
-.sp
-When the alternative matching function has given the PCRE_ERROR_PARTIAL return,
-indicating that the subject partially matched the pattern, you can restart the
-match with additional subject data by means of the \eR escape sequence. For
-example:
-.sp
-    re> /^\ed?\ed(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\ed\ed$/
-  data> 23ja\eP\eD
-  Partial match: 23ja
-  data> n05\eR\eD
-   0: n05
-.sp
-For further information about partial matching, see the
-.\" HREF
-\fBpcrepartial\fP
-.\"
-documentation.
-.
-.
-.SH CALLOUTS
-.rs
-.sp
-If the pattern contains any callout requests, \fBpcretest\fP's callout function
-is called during matching. This works with both matching functions. By default,
-the called function displays the callout number, the start and current
-positions in the text at the callout time, and the next pattern item to be
-tested. For example:
-.sp
-  --->pqrabcdef
-    0    ^  ^     \ed
-.sp
-This output indicates that callout number 0 occurred for a match attempt
-starting at the fourth character of the subject string, when the pointer was at
-the seventh character of the data, and when the next pattern item was \ed. Just
-one circumflex is output if the start and current positions are the same.
-.P
-Callouts numbered 255 are assumed to be automatic callouts, inserted as a
-result of the \fB/C\fP pattern modifier. In this case, instead of showing the
-callout number, the offset in the pattern, preceded by a plus, is output. For
-example:
-.sp
-    re> /\ed?[A-E]\e*/C
-  data> E*
-  --->E*
-   +0 ^      \ed?
-   +3 ^      [A-E]
-   +8 ^^     \e*
-  +10 ^ ^
-   0: E*
-.sp
-If a pattern contains (*MARK) items, an additional line is output whenever
-a change of latest mark is passed to the callout function. For example:
-.sp
-    re> /a(*MARK:X)bc/C
-  data> abc
-  --->abc
-   +0 ^       a
-   +1 ^^      (*MARK:X)
-  +10 ^^      b
-  Latest Mark: X
-  +11 ^ ^     c
-  +12 ^  ^
-   0: abc
-.sp
-The mark changes between matching "a" and "b", but stays the same for the rest
-of the match, so nothing more is output. If, as a result of backtracking, the
-mark reverts to being unset, the text "<unset>" is output.
-.P
-The callout function in \fBpcretest\fP returns zero (carry on matching) by
-default, but you can use a \eC item in a data line (as described above) to
-change this and other parameters of the callout.
-.P
-Inserting callouts can be helpful when using \fBpcretest\fP to check
-complicated regular expressions. For further information about callouts, see
-the
-.\" HREF
-\fBpcrecallout\fP
-.\"
-documentation.
-.
-.
-.
-.SH "NON-PRINTING CHARACTERS"
-.rs
-.sp
-When \fBpcretest\fP is outputting text in the compiled version of a pattern,
-bytes other than 32-126 are always treated as non-printing characters are are
-therefore shown as hex escapes.
-.P
-When \fBpcretest\fP is outputting text that is a matched part of a subject
-string, it behaves in the same way, unless a different locale has been set for
-the pattern (using the \fB/L\fP modifier). In this case, the \fBisprint()\fP
-function to distinguish printing and non-printing characters.
-.
-.
-.
-.SH "SAVING AND RELOADING COMPILED PATTERNS"
-.rs
-.sp
-The facilities described in this section are not available when the POSIX
-interface to PCRE is being used, that is, when the \fB/P\fP pattern modifier is
-specified.
-.P
-When the POSIX interface is not in use, you can cause \fBpcretest\fP to write a
-compiled pattern to a file, by following the modifiers with > and a file name.
-For example:
-.sp
-  /pattern/im >/some/file
-.sp
-See the
-.\" HREF
-\fBpcreprecompile\fP
-.\"
-documentation for a discussion about saving and re-using compiled patterns.
-Note that if the pattern was successfully studied with JIT optimization, the
-JIT data cannot be saved.
-.P
-The data that is written is binary. The first eight bytes are the length of the
-compiled pattern data followed by the length of the optional study data, each
-written as four bytes in big-endian order (most significant byte first). If
-there is no study data (either the pattern was not studied, or studying did not
-return any data), the second length is zero. The lengths are followed by an
-exact copy of the compiled pattern. If there is additional study data, this
-(excluding any JIT data) follows immediately after the compiled pattern. After
-writing the file, \fBpcretest\fP expects to read a new pattern.
-.P
-A saved pattern can be reloaded into \fBpcretest\fP by specifying < and a file
-name instead of a pattern. There must be no space between < and the file name,
-which must not contain a < character, as otherwise \fBpcretest\fP will
-interpret the line as a pattern delimited by < characters. For example:
-.sp
-   re> </some/file
-  Compiled pattern loaded from /some/file
-  No study data
-.sp
-If the pattern was previously studied with the JIT optimization, the JIT
-information cannot be saved and restored, and so is lost. When the pattern has
-been loaded, \fBpcretest\fP proceeds to read data lines in the usual way.
-.P
-You can copy a file written by \fBpcretest\fP to a different host and reload it
-there, even if the new host has opposite endianness to the one on which the
-pattern was compiled. For example, you can compile on an i86 machine and run on
-a SPARC machine. When a pattern is reloaded on a host with different
-endianness, the confirmation message is changed to:
-.sp
-  Compiled pattern (byte-inverted) loaded from /some/file
-.sp
-The test suite contains some saved pre-compiled patterns with different
-endianness. These are reloaded using "<!" instead of just "<". This suppresses
-the "(byte-inverted)" text so that the output is the same on all hosts. It also
-forces debugging output once the pattern has been reloaded.
-.P
-File names for saving and reloading can be absolute or relative, but note that
-the shell facility of expanding a file name that starts with a tilde (~) is not
-available.
-.P
-The ability to save and reload files in \fBpcretest\fP is intended for testing
-and experimentation. It is not intended for production use because only a
-single pattern can be written to a file. Furthermore, there is no facility for
-supplying custom character tables for use with a reloaded pattern. If the
-original pattern was compiled with custom tables, an attempt to match a subject
-string using a reloaded pattern is likely to cause \fBpcretest\fP to crash.
-Finally, if you attempt to load a file that is not in the correct format, the
-result is undefined.
-.
-.
-.SH "SEE ALSO"
-.rs
-.sp
-\fBpcre\fP(3), \fBpcre16\fP(3), \fBpcre32\fP(3), \fBpcreapi\fP(3),
-\fBpcrecallout\fP(3),
-\fBpcrejit\fP, \fBpcrematching\fP(3), \fBpcrepartial\fP(d),
-\fBpcrepattern\fP(3), \fBpcreprecompile\fP(3).
-.
-.
-.SH AUTHOR
-.rs
-.sp
-.nf
-Philip Hazel
-University Computing Service
-Cambridge CB2 3QH, England.
-.fi
-.
-.
-.SH REVISION
-.rs
-.sp
-.nf
-Last updated: 09 February 2014
-Copyright (c) 1997-2014 University of Cambridge.
-.fi
diff --git a/dist/doc/pcretest.txt b/dist/doc/pcretest.txt
deleted file mode 100644
index 55de502..0000000
--- a/dist/doc/pcretest.txt
+++ /dev/null
@@ -1,1087 +0,0 @@
-PCRETEST(1)                 General Commands Manual                PCRETEST(1)
-
-
-
-NAME
-       pcretest - a program for testing Perl-compatible regular expressions.
-
-SYNOPSIS
-
-       pcretest [options] [input file [output file]]
-
-       pcretest  was written as a test program for the PCRE regular expression
-       library itself, but it can also be used for experimenting with  regular
-       expressions.  This document describes the features of the test program;
-       for details of the regular expressions themselves, see the  pcrepattern
-       documentation. For details of the PCRE library function calls and their
-       options, see the pcreapi , pcre16 and pcre32 documentation.
-
-       The input for pcretest is a sequence of regular expression patterns and
-       strings  to be matched, as described below. The output shows the result
-       of each match. Options on the command line  and  the  patterns  control
-       PCRE options and exactly what is output.
-
-       As  PCRE has evolved, it has acquired many different features, and as a
-       result, pcretest now has rather a lot of obscure  options  for  testing
-       every possible feature. Some of these options are specifically designed
-       for use in conjunction with the test script and  data  files  that  are
-       distributed  as  part of PCRE, and are unlikely to be of use otherwise.
-       They are all documented here, but without much justification.
-
-
-INPUT DATA FORMAT
-
-       Input to pcretest is processed line by line, either by  calling  the  C
-       library's fgets() function, or via the libreadline library (see below).
-       In Unix-like environments, fgets() treats any bytes other than  newline
-       as  data characters. However, in some Windows environments character 26
-       (hex 1A) causes an immediate end of file, and no further data is  read.
-       For  maximum  portability,  therefore,  it  is safest to use only ASCII
-       characters in pcretest input files.
-
-
-PCRE's 8-BIT, 16-BIT AND 32-BIT LIBRARIES
-
-       From release 8.30, two separate PCRE libraries can be built. The origi-
-       nal  one  supports  8-bit  character  strings, whereas the newer 16-bit
-       library supports  character  strings  encoded  in  16-bit  units.  From
-       release  8.32,  a  third  library  can  be  built, supporting character
-       strings encoded in 32-bit units. The pcretest program can  be  used  to
-       test all three libraries. However, it is itself still an 8-bit program,
-       reading 8-bit input and writing 8-bit output.  When testing the  16-bit
-       or  32-bit  library, the patterns and data strings are converted to 16-
-       or 32-bit format before being passed to  the  PCRE  library  functions.
-       Results are converted to 8-bit for output.
-
-       References to functions and structures of the form pcre[16|32]_xx below
-       mean "pcre_xx when using the 8-bit library, pcre16_xx  when  using  the
-       16-bit library, or pcre32_xx when using the 32-bit library".
-
-
-COMMAND LINE OPTIONS
-
-       -8        If  both the 8-bit library has been built, this option causes
-                 the 8-bit library to be used (which is the default);  if  the
-                 8-bit  library  has  not  been  built,  this option causes an
-                 error.
-
-       -16       If both the 8-bit or the 32-bit,  and  the  16-bit  libraries
-                 have  been built, this option causes the 16-bit library to be
-                 used. If only the 16-bit library has been built, this is  the
-                 default  (so  has no effect). If only the 8-bit or the 32-bit
-                 library has been built, this option causes an error.
-
-       -32       If both the 8-bit or the 16-bit,  and  the  32-bit  libraries
-                 have  been built, this option causes the 32-bit library to be
-                 used. If only the 32-bit library has been built, this is  the
-                 default  (so  has no effect). If only the 8-bit or the 16-bit
-                 library has been built, this option causes an error.
-
-       -b        Behave as if each pattern has the /B (show byte  code)  modi-
-                 fier; the internal form is output after compilation.
-
-       -C        Output the version number of the PCRE library, and all avail-
-                 able  information  about  the  optional  features  that   are
-                 included,  and  then  exit  with  zero  exit  code. All other
-                 options are ignored.
-
-       -C option Output information about a specific build-time  option,  then
-                 exit.  This functionality is intended for use in scripts such
-                 as RunTest. The following options output the  value  and  set
-                 the exit code as indicated:
-
-                   ebcdic-nl  the code for LF (= NL) in an EBCDIC environment:
-                                0x15 or 0x25
-                                0 if used in an ASCII environment
-                                exit code is always 0
-                   linksize   the configured internal link size (2, 3, or 4)
-                                exit code is set to the link size
-                   newline    the default newline setting:
-                                CR, LF, CRLF, ANYCRLF, or ANY
-                                exit code is always 0
-                   bsr        the default setting for what \R matches:
-                                ANYCRLF or ANY
-                                exit code is always 0
-
-                 The  following  options output 1 for true or 0 for false, and
-                 set the exit code to the same value:
-
-                   ebcdic     compiled for an EBCDIC environment
-                   jit        just-in-time support is available
-                   pcre16     the 16-bit library was built
-                   pcre32     the 32-bit library was built
-                   pcre8      the 8-bit library was built
-                   ucp        Unicode property support is available
-                   utf        UTF-8 and/or UTF-16 and/or UTF-32 support
-                                is available
-
-                 If an unknown option is given, an error  message  is  output;
-                 the exit code is 0.
-
-       -d        Behave  as  if  each pattern has the /D (debug) modifier; the
-                 internal form and information about the compiled  pattern  is
-                 output after compilation; -d is equivalent to -b -i.
-
-       -dfa      Behave  as if each data line contains the \D escape sequence;
-                 this    causes    the    alternative    matching    function,
-                 pcre[16|32]_dfa_exec(),  to  be  used instead of the standard
-                 pcre[16|32]_exec() function (more detail is given below).
-
-       -help     Output a brief summary these options and then exit.
-
-       -i        Behave as if each pattern has the  /I  modifier;  information
-                 about the compiled pattern is given after compilation.
-
-       -M        Behave  as if each data line contains the \M escape sequence;
-                 this causes PCRE to  discover  the  minimum  MATCH_LIMIT  and
-                 MATCH_LIMIT_RECURSION  settings by calling pcre[16|32]_exec()
-                 repeatedly with different limits.
-
-       -m        Output the size of each compiled pattern after  it  has  been
-                 compiled.  This  is  equivalent  to adding /M to each regular
-                 expression. The size is given in bytes for both libraries.
-
-       -O        Behave as if each pattern has the /O modifier, that  is  dis-
-                 able auto-possessification for all patterns.
-
-       -o osize  Set  the number of elements in the output vector that is used
-                 when calling pcre[16|32]_exec() or pcre[16|32]_dfa_exec()  to
-                 be  osize.  The  default  value is 45, which is enough for 14
-                 capturing subexpressions for pcre[16|32]_exec() or 22 differ-
-                 ent  matches for pcre[16|32]_dfa_exec().  The vector size can
-                 be changed for individual matching calls by including  \O  in
-                 the data line (see below).
-
-       -p        Behave  as  if  each  pattern  has the /P modifier; the POSIX
-                 wrapper API is used to call PCRE. None of the  other  options
-                 has  any  effect when -p is set. This option can be used only
-                 with the 8-bit library.
-
-       -q        Do not output the version number of pcretest at the start  of
-                 execution.
-
-       -S size   On  Unix-like  systems, set the size of the run-time stack to
-                 size megabytes.
-
-       -s or -s+ Behave as if each pattern  has  the  /S  modifier;  in  other
-                 words,  force each pattern to be studied. If -s+ is used, all
-                 the JIT compile options are  passed  to  pcre[16|32]_study(),
-                 causing  just-in-time  optimization  to  be  set  up if it is
-                 available, for both full and partial matching.  Specific  JIT
-                 compile options can be selected by following -s+ with a digit
-                 in the range 1 to 7, which selects the JIT compile  modes  as
-                 follows:
-
-                   1  normal match only
-                   2  soft partial match only
-                   3  normal match and soft partial match
-                   4  hard partial match only
-                   6  soft and hard partial match
-                   7  all three modes (default)
-
-                 If  -s++  is used instead of -s+ (with or without a following
-                 digit), the text "(JIT)" is added to the  first  output  line
-                 after a match or no match when JIT-compiled code was actually
-                 used.
-
-                 Note that there are pattern options  that  can  override  -s,
-                 either specifying no studying at all, or suppressing JIT com-
-                 pilation.
-
-                 If the /I or /D option is present on  a  pattern  (requesting
-                 output  about  the  compiled  pattern), information about the
-                 result of studying is not included when  studying  is  caused
-                 only  by  -s  and neither -i nor -d is present on the command
-                 line. This behaviour means that the output  from  tests  that
-                 are  run with and without -s should be identical, except when
-                 options that output information about the actual running of a
-                 match are set.
-
-                 The  -M,  -t,  and  -tm options, which give information about
-                 resources used, are likely to produce different  output  with
-                 and  without  -s.  Output may also differ if the /C option is
-                 present on an individual pattern. This uses callouts to trace
-                 the  the  matching process, and this may be different between
-                 studied and non-studied patterns.  If  the  pattern  contains
-                 (*MARK)  items  there  may  also be differences, for the same
-                 reason. The -s command line option can be overridden for spe-
-                 cific  patterns that should never be studied (see the /S pat-
-                 tern modifier below).
-
-       -t        Run each compile, study, and match many times with  a  timer,
-                 and  output  the resulting times per compile, study, or match
-                 (in milliseconds). Do not set -m with -t,  because  you  will
-                 then get the size output a zillion times, and the timing will
-                 be distorted. You can control the number of  iterations  that
-                 are used for timing by following -t with a number (as a sepa-
-                 rate item on the command line). For example, "-t 1000"  iter-
-                 ates 1000 times.  The default is to iterate 500000 times.
-
-       -tm       This is like -t except that it times only the matching phase,
-                 not the compile or study phases.
-
-       -T -TM    These behave like -t and -tm, but in addition, at the end  of
-                 a run, the total times for all compiles, studies, and matches
-                 are output.
-
-
-DESCRIPTION
-
-       If pcretest is given two filename arguments, it reads  from  the  first
-       and writes to the second. If it is given only one filename argument, it
-       reads from that file and writes to stdout.  Otherwise,  it  reads  from
-       stdin  and  writes to stdout, and prompts for each line of input, using
-       "re>" to prompt for regular expressions, and "data>" to prompt for data
-       lines.
-
-       When  pcretest  is  built,  a  configuration option can specify that it
-       should be linked with the libreadline library. When this  is  done,  if
-       the input is from a terminal, it is read using the readline() function.
-       This provides line-editing and history facilities. The output from  the
-       -help option states whether or not readline() will be used.
-
-       The program handles any number of sets of input on a single input file.
-       Each set starts with a regular expression, and continues with any  num-
-       ber of data lines to be matched against that pattern.
-
-       Each  data line is matched separately and independently. If you want to
-       do multi-line matches, you have to use the \n escape sequence (or \r or
-       \r\n, etc., depending on the newline setting) in a single line of input
-       to encode the newline sequences. There is no limit  on  the  length  of
-       data  lines;  the  input  buffer is automatically extended if it is too
-       small.
-
-       An empty line signals the end of the data lines, at which point  a  new
-       regular  expression is read. The regular expressions are given enclosed
-       in any non-alphanumeric delimiters other than backslash, for example:
-
-         /(a|bc)x+yz/
-
-       White space before the initial delimiter is ignored. A regular  expres-
-       sion  may be continued over several input lines, in which case the new-
-       line characters are included within it. It is possible to  include  the
-       delimiter within the pattern by escaping it, for example
-
-         /abc\/def/
-
-       If  you  do  so, the escape and the delimiter form part of the pattern,
-       but since delimiters are always non-alphanumeric, this does not  affect
-       its  interpretation.   If the terminating delimiter is immediately fol-
-       lowed by a backslash, for example,
-
-         /abc/\
-
-       then a backslash is added to the end of the pattern. This  is  done  to
-       provide  a  way of testing the error condition that arises if a pattern
-       finishes with a backslash, because
-
-         /abc\/
-
-       is interpreted as the first line of a pattern that starts with  "abc/",
-       causing pcretest to read the next line as a continuation of the regular
-       expression.
-
-
-PATTERN MODIFIERS
-
-       A pattern may be followed by any number of modifiers, which are  mostly
-       single  characters,  though  some  of these can be qualified by further
-       characters.  Following Perl usage, these are referred to below as,  for
-       example,  "the  /i  modifier", even though the delimiter of the pattern
-       need not always be a slash, and no slash is  used  when  writing  modi-
-       fiers.  White  space may appear between the final pattern delimiter and
-       the first modifier, and between the modifiers  themselves.  For  refer-
-       ence,  here  is  a  complete  list of modifiers. They fall into several
-       groups that are described in detail in the following sections.
-
-         /8              set UTF mode
-         /9              set PCRE_NEVER_UTF (locks out UTF mode)
-         /?              disable UTF validity check
-         /+              show remainder of subject after match
-         /=              show all captures (not just those that are set)
-
-         /A              set PCRE_ANCHORED
-         /B              show compiled code
-         /C              set PCRE_AUTO_CALLOUT
-         /D              same as /B plus /I
-         /E              set PCRE_DOLLAR_ENDONLY
-         /F              flip byte order in compiled pattern
-         /f              set PCRE_FIRSTLINE
-         /G              find all matches (shorten string)
-         /g              find all matches (use startoffset)
-         /I              show information about pattern
-         /i              set PCRE_CASELESS
-         /J              set PCRE_DUPNAMES
-         /K              show backtracking control names
-         /L              set locale
-         /M              show compiled memory size
-         /m              set PCRE_MULTILINE
-         /N              set PCRE_NO_AUTO_CAPTURE
-         /O              set PCRE_NO_AUTO_POSSESS
-         /P              use the POSIX wrapper
-         /Q              test external stack check function
-         /S              study the pattern after compilation
-         /s              set PCRE_DOTALL
-         /T              select character tables
-         /U              set PCRE_UNGREEDY
-         /W              set PCRE_UCP
-         /X              set PCRE_EXTRA
-         /x              set PCRE_EXTENDED
-         /Y              set PCRE_NO_START_OPTIMIZE
-         /Z              don't show lengths in /B output
-
-         /<any>          set PCRE_NEWLINE_ANY
-         /<anycrlf>      set PCRE_NEWLINE_ANYCRLF
-         /<cr>           set PCRE_NEWLINE_CR
-         /<crlf>         set PCRE_NEWLINE_CRLF
-         /<lf>           set PCRE_NEWLINE_LF
-         /<bsr_anycrlf>  set PCRE_BSR_ANYCRLF
-         /<bsr_unicode>  set PCRE_BSR_UNICODE
-         /<JS>           set PCRE_JAVASCRIPT_COMPAT
-
-
-   Perl-compatible modifiers
-
-       The /i, /m, /s, and /x modifiers set the PCRE_CASELESS, PCRE_MULTILINE,
-       PCRE_DOTALL,    or    PCRE_EXTENDED    options,    respectively,   when
-       pcre[16|32]_compile() is called. These four modifier letters  have  the
-       same effect as they do in Perl. For example:
-
-         /caseless/i
-
-
-   Modifiers for other PCRE options
-
-       The  following  table  shows additional modifiers for setting PCRE com-
-       pile-time options that do not correspond to anything in Perl:
-
-         /8              PCRE_UTF8           ) when using the 8-bit
-         /?              PCRE_NO_UTF8_CHECK  )   library
-
-         /8              PCRE_UTF16          ) when using the 16-bit
-         /?              PCRE_NO_UTF16_CHECK )   library
-
-         /8              PCRE_UTF32          ) when using the 32-bit
-         /?              PCRE_NO_UTF32_CHECK )   library
-
-         /9              PCRE_NEVER_UTF
-         /A              PCRE_ANCHORED
-         /C              PCRE_AUTO_CALLOUT
-         /E              PCRE_DOLLAR_ENDONLY
-         /f              PCRE_FIRSTLINE
-         /J              PCRE_DUPNAMES
-         /N              PCRE_NO_AUTO_CAPTURE
-         /O              PCRE_NO_AUTO_POSSESS
-         /U              PCRE_UNGREEDY
-         /W              PCRE_UCP
-         /X              PCRE_EXTRA
-         /Y              PCRE_NO_START_OPTIMIZE
-         /<any>          PCRE_NEWLINE_ANY
-         /<anycrlf>      PCRE_NEWLINE_ANYCRLF
-         /<cr>           PCRE_NEWLINE_CR
-         /<crlf>         PCRE_NEWLINE_CRLF
-         /<lf>           PCRE_NEWLINE_LF
-         /<bsr_anycrlf>  PCRE_BSR_ANYCRLF
-         /<bsr_unicode>  PCRE_BSR_UNICODE
-         /<JS>           PCRE_JAVASCRIPT_COMPAT
-
-       The modifiers that are enclosed in angle brackets are  literal  strings
-       as  shown,  including the angle brackets, but the letters within can be
-       in either case.  This example sets multiline matching with CRLF as  the
-       line ending sequence:
-
-         /^abc/m<CRLF>
-
-       As  well  as  turning  on  the  PCRE_UTF8/16/32 option, the /8 modifier
-       causes all non-printing characters in  output  strings  to  be  printed
-       using the \x{hh...} notation. Otherwise, those less than 0x100 are out-
-       put in hex without the curly brackets.
-
-       Full details of the PCRE options are given in  the  pcreapi  documenta-
-       tion.
-
-   Finding all matches in a string
-
-       Searching  for  all  possible matches within each subject string can be
-       requested by the /g or /G modifier. After  finding  a  match,  PCRE  is
-       called again to search the remainder of the subject string. The differ-
-       ence between /g and /G is that the former uses the startoffset argument
-       to  pcre[16|32]_exec()  to  start  searching  at a new point within the
-       entire string (which is in effect what Perl does), whereas  the  latter
-       passes  over  a  shortened  substring.  This  makes a difference to the
-       matching process if the pattern  begins  with  a  lookbehind  assertion
-       (including \b or \B).
-
-       If  any  call  to  pcre[16|32]_exec() in a /g or /G sequence matches an
-       empty string, the next call is done with the PCRE_NOTEMPTY_ATSTART  and
-       PCRE_ANCHORED  flags  set  in  order  to search for another, non-empty,
-       match at the same point. If this second match fails, the  start  offset
-       is  advanced,  and  the  normal match is retried. This imitates the way
-       Perl handles such cases when using the /g modifier or the split() func-
-       tion.  Normally,  the start offset is advanced by one character, but if
-       the newline convention recognizes CRLF as a newline,  and  the  current
-       character is CR followed by LF, an advance of two is used.
-
-   Other modifiers
-
-       There are yet more modifiers for controlling the way pcretest operates.
-
-       The  /+ modifier requests that as well as outputting the substring that
-       matched the entire pattern, pcretest  should  in  addition  output  the
-       remainder  of  the  subject  string. This is useful for tests where the
-       subject contains multiple copies of the same substring. If the +  modi-
-       fier  appears  twice, the same action is taken for captured substrings.
-       In each case the remainder is output on the following line with a  plus
-       character  following  the  capture number. Note that this modifier must
-       not immediately follow the /S modifier because /S+ and /S++ have  other
-       meanings.
-
-       The  /=  modifier  requests  that  the values of all potential captured
-       parentheses be output after a match. By default, only those up  to  the
-       highest one actually used in the match are output (corresponding to the
-       return code from pcre[16|32]_exec()). Values in the offsets vector cor-
-       responding  to higher numbers should be set to -1, and these are output
-       as "<unset>". This modifier gives a way of checking that this  is  hap-
-       pening.
-
-       The  /B modifier is a debugging feature. It requests that pcretest out-
-       put a representation of the compiled code after  compilation.  Normally
-       this  information  contains length and offset values; however, if /Z is
-       also present, this data is replaced by spaces. This is a  special  fea-
-       ture  for  use  in the automatic test scripts; it ensures that the same
-       output is generated for different internal link sizes.
-
-       The /D modifier is a PCRE debugging feature, and is equivalent to  /BI,
-       that is, both the /B and the /I modifiers.
-
-       The  /F  modifier  causes pcretest to flip the byte order of the 2-byte
-       and 4-byte fields in the compiled pattern. This facility is for testing
-       the  feature  in PCRE that allows it to execute patterns that were com-
-       piled on a host with a different endianness. This feature is not avail-
-       able  when the POSIX interface to PCRE is being used, that is, when the
-       /P pattern modifier is specified. See also the section about saving and
-       reloading compiled patterns below.
-
-       The  /I  modifier  requests  that pcretest output information about the
-       compiled pattern (whether it is anchored, has a fixed first  character,
-       and  so  on). It does this by calling pcre[16|32]_fullinfo() after com-
-       piling a pattern. If the pattern is studied, the results  of  that  are
-       also output. In this output, the word "char" means a non-UTF character,
-       that is, the value of a single data item  (8-bit,  16-bit,  or  32-bit,
-       depending on the library that is being tested).
-
-       The  /K modifier requests pcretest to show names from backtracking con-
-       trol verbs that are  returned  from  calls  to  pcre[16|32]_exec().  It
-       causes  pcretest  to  create  a  pcre[16|32]_extra block if one has not
-       already been created by a call to pcre[16|32]_study(), and to  set  the
-       PCRE_EXTRA_MARK  flag  and  the  mark  field within it, every time that
-       pcre[16|32]_exec() is called. If  the  variable  that  the  mark  field
-       points  to  is  non-NULL  for  a  match,  non-match,  or partial match,
-       pcretest prints the string to which it points. For  a  match,  this  is
-       shown  on  a  line  by itself, tagged with "MK:". For a non-match it is
-       added to the message.
-
-       The /L modifier must be followed directly by the name of a locale,  for
-       example,
-
-         /pattern/Lfr_FR
-
-       For this reason, it must be the last modifier. The given locale is set,
-       pcre[16|32]_maketables() is called to build a set of  character  tables
-       for  the  locale, and this is then passed to pcre[16|32]_compile() when
-       compiling the regular expression. Without an /L (or /T) modifier,  NULL
-       is  passed  as  the  tables  pointer;  that  is, /L applies only to the
-       expression on which it appears.
-
-       The /M modifier causes the size in bytes of the memory  block  used  to
-       hold  the compiled pattern to be output. This does not include the size
-       of the pcre[16|32] block; it is just the actual compiled data.  If  the
-       pattern is successfully studied with the PCRE_STUDY_JIT_COMPILE option,
-       the size of the JIT compiled code is also output.
-
-       The /Q modifier is used to test the use of pcre_stack_guard. It must be
-       followed  by '0' or '1', specifying the return code to be given from an
-       external function that is passed to PCRE and used  for  stack  checking
-       during compilation (see the pcreapi documentation for details).
-
-       The  /S  modifier  causes  pcre[16|32]_study()  to  be called after the
-       expression has been compiled, and the results used when the  expression
-       is matched. There are a number of qualifying characters that may follow
-       /S.  They may appear in any order.
-
-       If /S is followed by an exclamation mark, pcre[16|32]_study() is called
-       with  the PCRE_STUDY_EXTRA_NEEDED option, causing it always to return a
-       pcre_extra block, even when studying discovers no useful information.
-
-       If /S is followed by a second S character, it suppresses studying, even
-       if  it  was  requested  externally  by the -s command line option. This
-       makes it possible to specify that certain patterns are always  studied,
-       and others are never studied, independently of -s. This feature is used
-       in the test files in a few cases where the output is different when the
-       pattern is studied.
-
-       If  the  /S  modifier  is  followed  by  a  +  character,  the  call to
-       pcre[16|32]_study() is made with all the JIT study options,  requesting
-       just-in-time  optimization  support if it is available, for both normal
-       and partial matching. If you want to restrict the JIT compiling  modes,
-       you can follow /S+ with a digit in the range 1 to 7:
-
-         1  normal match only
-         2  soft partial match only
-         3  normal match and soft partial match
-         4  hard partial match only
-         6  soft and hard partial match
-         7  all three modes (default)
-
-       If /S++ is used instead of /S+ (with or without a following digit), the
-       text "(JIT)" is added to the first output line  after  a  match  or  no
-       match when JIT-compiled code was actually used.
-
-       Note  that  there  is  also  an independent /+ modifier; it must not be
-       given immediately after /S or /S+ because this will be misinterpreted.
-
-       If JIT studying is successful, the compiled JIT code will automatically
-       be  used  when pcre[16|32]_exec() is run, except when incompatible run-
-       time options are specified. For more details, see the pcrejit  documen-
-       tation.  See also the \J escape sequence below for a way of setting the
-       size of the JIT stack.
-
-       Finally, if /S is followed by a minus  character,  JIT  compilation  is
-       suppressed,  even if it was requested externally by the -s command line
-       option. This makes it possible to specify that JIT is never to be  used
-       for certain patterns.
-
-       The  /T  modifier  must be followed by a single digit. It causes a spe-
-       cific set of built-in character tables to be passed to pcre[16|32]_com-
-       pile().  It  is used in the standard PCRE tests to check behaviour with
-       different character tables. The digit specifies the tables as follows:
-
-         0   the default ASCII tables, as distributed in
-               pcre_chartables.c.dist
-         1   a set of tables defining ISO 8859 characters
-
-       In table 1, some characters whose codes are greater than 128 are  iden-
-       tified as letters, digits, spaces, etc.
-
-   Using the POSIX wrapper API
-
-       The  /P modifier causes pcretest to call PCRE via the POSIX wrapper API
-       rather than its native API. This supports only the 8-bit library.  When
-       /P  is set, the following modifiers set options for the regcomp() func-
-       tion:
-
-         /i    REG_ICASE
-         /m    REG_NEWLINE
-         /N    REG_NOSUB
-         /s    REG_DOTALL     )
-         /U    REG_UNGREEDY   ) These options are not part of
-         /W    REG_UCP        )   the POSIX standard
-         /8    REG_UTF8       )
-
-       The /+ modifier works as  described  above.  All  other  modifiers  are
-       ignored.
-
-   Locking out certain modifiers
-
-       PCRE  can be compiled with or without support for certain features such
-       as UTF-8/16/32 or Unicode properties. Accordingly, the  standard  tests
-       are  split  up  into  a number of different files that are selected for
-       running depending on which features are available.  When  updating  the
-       tests, it is all too easy to put a new test into the wrong file by mis-
-       take; for example, to put a test that requires UTF support into a  file
-       that  is used when it is not available. To help detect such mistakes as
-       early as possible, there is a facility for locking out  specific  modi-
-       fiers. If an input line for pcretest starts with the string "< forbid "
-       the following sequence of characters is taken as a  list  of  forbidden
-       modifiers. For example, in the test files that must not use UTF or Uni-
-       code property support, this line appears:
-
-         < forbid 8W
-
-       This locks out the /8 and /W modifiers. An immediate error is given  if
-       they  are  subsequently encountered. If the character string contains <
-       but not >, all the multi-character modifiers  that  begin  with  <  are
-       locked  out.  Otherwise,  such modifiers must be explicitly listed, for
-       example:
-
-         < forbid <JS><cr>
-
-       There must be a single space between < and "forbid" for this feature to
-       be  recognised.  If  there  is not, the line is interpreted either as a
-       request to re-load a pre-compiled pattern (see  "SAVING  AND  RELOADING
-       COMPILED  PATTERNS"  below) or, if there is a another < character, as a
-       pattern that uses < as its delimiter.
-
-
-DATA LINES
-
-       Before each data line is  passed  to  pcre[16|32]_exec(),  leading  and
-       trailing  white space is removed, and it is then scanned for \ escapes.
-       Some of these are pretty esoteric features, intended for  checking  out
-       some  of the more complicated features of PCRE. If you are just testing
-       "ordinary" regular expressions, you probably don't need any  of  these.
-       The following escapes are recognized:
-
-         \a         alarm (BEL, \x07)
-         \b         backspace (\x08)
-         \e         escape (\x27)
-         \f         form feed (\x0c)
-         \n         newline (\x0a)
-         \qdd       set the PCRE_MATCH_LIMIT limit to dd
-                      (any number of digits)
-         \r         carriage return (\x0d)
-         \t         tab (\x09)
-         \v         vertical tab (\x0b)
-         \nnn       octal character (up to 3 octal digits); always
-                      a byte unless > 255 in UTF-8 or 16-bit or 32-bit mode
-         \o{dd...}  octal character (any number of octal digits}
-         \xhh       hexadecimal byte (up to 2 hex digits)
-         \x{hh...}  hexadecimal character (any number of hex digits)
-         \A         pass the PCRE_ANCHORED option to pcre[16|32]_exec()
-                      or pcre[16|32]_dfa_exec()
-         \B         pass the PCRE_NOTBOL option to pcre[16|32]_exec()
-                      or pcre[16|32]_dfa_exec()
-         \Cdd       call pcre[16|32]_copy_substring() for substring dd
-                      after a successful match (number less than 32)
-         \Cname     call pcre[16|32]_copy_named_substring() for substring
-                      "name" after a successful match (name termin-
-                      ated by next non alphanumeric character)
-         \C+        show the current captured substrings at callout
-                      time
-         \C-        do not supply a callout function
-         \C!n       return 1 instead of 0 when callout number n is
-                      reached
-         \C!n!m     return 1 instead of 0 when callout number n is
-                      reached for the nth time
-         \C*n       pass the number n (may be negative) as callout
-                      data; this is used as the callout return value
-         \D         use the pcre[16|32]_dfa_exec() match function
-         \F         only shortest match for pcre[16|32]_dfa_exec()
-         \Gdd       call pcre[16|32]_get_substring() for substring dd
-                      after a successful match (number less than 32)
-         \Gname     call pcre[16|32]_get_named_substring() for substring
-                      "name" after a successful match (name termin-
-                      ated by next non-alphanumeric character)
-         \Jdd       set up a JIT stack of dd kilobytes maximum (any
-                      number of digits)
-         \L         call pcre[16|32]_get_substringlist() after a
-                      successful match
-         \M         discover the minimum MATCH_LIMIT and
-                      MATCH_LIMIT_RECURSION settings
-         \N         pass the PCRE_NOTEMPTY option to pcre[16|32]_exec()
-                      or pcre[16|32]_dfa_exec(); if used twice, pass the
-                      PCRE_NOTEMPTY_ATSTART option
-         \Odd       set the size of the output vector passed to
-                      pcre[16|32]_exec() to dd (any number of digits)
-         \P         pass the PCRE_PARTIAL_SOFT option to pcre[16|32]_exec()
-                      or pcre[16|32]_dfa_exec(); if used twice, pass the
-                      PCRE_PARTIAL_HARD option
-         \Qdd       set the PCRE_MATCH_LIMIT_RECURSION limit to dd
-                      (any number of digits)
-         \R         pass the PCRE_DFA_RESTART option to pcre[16|32]_dfa_exec()
-         \S         output details of memory get/free calls during matching
-         \Y             pass     the    PCRE_NO_START_OPTIMIZE    option    to
-       pcre[16|32]_exec()
-                      or pcre[16|32]_dfa_exec()
-         \Z         pass the PCRE_NOTEOL option to pcre[16|32]_exec()
-                      or pcre[16|32]_dfa_exec()
-         \?         pass the PCRE_NO_UTF[8|16|32]_CHECK option to
-                      pcre[16|32]_exec() or pcre[16|32]_dfa_exec()
-         \>dd       start the match at offset dd (optional "-"; then
-                      any number of digits); this sets the startoffset
-                      argument        for        pcre[16|32]_exec()         or
-       pcre[16|32]_dfa_exec()
-         \<cr>      pass the PCRE_NEWLINE_CR option to pcre[16|32]_exec()
-                      or pcre[16|32]_dfa_exec()
-         \<lf>      pass the PCRE_NEWLINE_LF option to pcre[16|32]_exec()
-                      or pcre[16|32]_dfa_exec()
-         \<crlf>    pass the PCRE_NEWLINE_CRLF option to pcre[16|32]_exec()
-                      or pcre[16|32]_dfa_exec()
-         \<anycrlf> pass the PCRE_NEWLINE_ANYCRLF option to pcre[16|32]_exec()
-                      or pcre[16|32]_dfa_exec()
-         \<any>     pass the PCRE_NEWLINE_ANY option to pcre[16|32]_exec()
-                      or pcre[16|32]_dfa_exec()
-
-       The  use of \x{hh...} is not dependent on the use of the /8 modifier on
-       the pattern. It is recognized always. There may be any number of  hexa-
-       decimal  digits  inside  the  braces; invalid values provoke error mes-
-       sages.
-
-       Note that \xhh specifies one byte rather than one  character  in  UTF-8
-       mode;  this  makes it possible to construct invalid UTF-8 sequences for
-       testing purposes. On the other hand, \x{hh} is interpreted as  a  UTF-8
-       character  in UTF-8 mode, generating more than one byte if the value is
-       greater than 127.  When testing the 8-bit library not  in  UTF-8  mode,
-       \x{hh} generates one byte for values less than 256, and causes an error
-       for greater values.
-
-       In UTF-16 mode, all 4-digit \x{hhhh} values are accepted. This makes it
-       possible to construct invalid UTF-16 sequences for testing purposes.
-
-       In  UTF-32  mode,  all  4- to 8-digit \x{...} values are accepted. This
-       makes it possible to construct invalid  UTF-32  sequences  for  testing
-       purposes.
-
-       The  escapes  that  specify  line ending sequences are literal strings,
-       exactly as shown. No more than one newline setting should be present in
-       any data line.
-
-       A  backslash  followed by anything else just escapes the anything else.
-       If the very last character is a backslash, it is ignored. This gives  a
-       way  of  passing  an empty line as data, since a real empty line termi-
-       nates the data input.
-
-       The \J escape provides a way of setting the maximum stack size that  is
-       used  by the just-in-time optimization code. It is ignored if JIT opti-
-       mization is not being used. Providing a stack that is larger  than  the
-       default 32K is necessary only for very complicated patterns.
-
-       If \M is present, pcretest calls pcre[16|32]_exec() several times, with
-       different values in the match_limit and match_limit_recursion fields of
-       the  pcre[16|32]_extra  data structure, until it finds the minimum num-
-       bers for each parameter that allow pcre[16|32]_exec() to complete with-
-       out  error.  Because  this  is testing a specific feature of the normal
-       interpretive pcre[16|32]_exec() execution, the use of any JIT optimiza-
-       tion  that might have been set up by the /S+ qualifier of -s+ option is
-       disabled.
-
-       The match_limit number is a measure of the amount of backtracking  that
-       takes  place,  and  checking it out can be instructive. For most simple
-       matches, the number is quite small, but for patterns  with  very  large
-       numbers  of  matching  possibilities,  it can become large very quickly
-       with increasing length of  subject  string.  The  match_limit_recursion
-       number  is  a  measure  of how much stack (or, if PCRE is compiled with
-       NO_RECURSE, how much heap) memory  is  needed  to  complete  the  match
-       attempt.
-
-       When  \O  is  used, the value specified may be higher or lower than the
-       size set by the -O command line option (or defaulted to 45); \O applies
-       only  to  the  call  of  pcre[16|32]_exec()  for  the  line in which it
-       appears.
-
-       If the /P modifier was present on the pattern, causing the POSIX  wrap-
-       per  API  to  be  used, the only option-setting sequences that have any
-       effect are \B,  \N,  and  \Z,  causing  REG_NOTBOL,  REG_NOTEMPTY,  and
-       REG_NOTEOL, respectively, to be passed to regexec().
-
-
-THE ALTERNATIVE MATCHING FUNCTION
-
-       By   default,  pcretest  uses  the  standard  PCRE  matching  function,
-       pcre[16|32]_exec() to match each  data  line.  PCRE  also  supports  an
-       alternative  matching  function, pcre[16|32]_dfa_test(), which operates
-       in a different way, and has some restrictions. The differences  between
-       the two functions are described in the pcrematching documentation.
-
-       If  a data line contains the \D escape sequence, or if the command line
-       contains the -dfa option, the alternative matching  function  is  used.
-       This function finds all possible matches at a given point. If, however,
-       the \F escape sequence is present in the data line, it stops after  the
-       first match is found. This is always the shortest possible match.
-
-
-DEFAULT OUTPUT FROM PCRETEST
-
-       This  section  describes  the output when the normal matching function,
-       pcre[16|32]_exec(), is being used.
-
-       When a match succeeds, pcretest outputs the list of captured substrings
-       that  pcre[16|32]_exec() returns, starting with number 0 for the string
-       that matched the whole pattern. Otherwise, it outputs "No  match"  when
-       the  return is PCRE_ERROR_NOMATCH, and "Partial match:" followed by the
-       partially   matching   substring   when   pcre[16|32]_exec()    returns
-       PCRE_ERROR_PARTIAL.  (Note  that  this is the entire substring that was
-       inspected during the partial match; it may  include  characters  before
-       the  actual  match  start  if a lookbehind assertion, \K, \b, or \B was
-       involved.) For any other return, pcretest  outputs  the  PCRE  negative
-       error  number  and a short descriptive phrase. If the error is a failed
-       UTF string check, the offset of the start of the failing character  and
-       the  reason  code are also output, provided that the size of the output
-       vector is at least two. Here is an example of an  interactive  pcretest
-       run.
-
-         $ pcretest
-         PCRE version 8.13 2011-04-30
-
-           re> /^abc(\d+)/
-         data> abc123
-          0: abc123
-          1: 123
-         data> xyz
-         No match
-
-       Unset capturing substrings that are not followed by one that is set are
-       not returned by pcre[16|32]_exec(), and are not shown by  pcretest.  In
-       the following example, there are two capturing substrings, but when the
-       first data line is matched, the second, unset substring is  not  shown.
-       An  "internal" unset substring is shown as "<unset>", as for the second
-       data line.
-
-           re> /(a)|(b)/
-         data> a
-          0: a
-          1: a
-         data> b
-          0: b
-          1: <unset>
-          2: b
-
-       If the strings contain any non-printing characters, they are output  as
-       \xhh  escapes  if  the  value is less than 256 and UTF mode is not set.
-       Otherwise they are output as \x{hh...} escapes. See below for the defi-
-       nition  of non-printing characters. If the pattern has the /+ modifier,
-       the output for substring 0 is followed by the the rest of  the  subject
-       string, identified by "0+" like this:
-
-           re> /cat/+
-         data> cataract
-          0: cat
-          0+ aract
-
-       If  the  pattern  has  the /g or /G modifier, the results of successive
-       matching attempts are output in sequence, like this:
-
-           re> /\Bi(\w\w)/g
-         data> Mississippi
-          0: iss
-          1: ss
-          0: iss
-          1: ss
-          0: ipp
-          1: pp
-
-       "No match" is output only if the first match attempt fails. Here is  an
-       example  of a failure message (the offset 4 that is specified by \>4 is
-       past the end of the subject string):
-
-           re> /xyz/
-         data> xyz\>4
-         Error -24 (bad offset value)
-
-       If any of the sequences \C, \G, or \L are present in a data  line  that
-       is  successfully  matched,  the substrings extracted by the convenience
-       functions are output with C, G, or L after the string number instead of
-       a colon. This is in addition to the normal full list. The string length
-       (that is, the return from the extraction function) is given  in  paren-
-       theses after each string for \C and \G.
-
-       Note that whereas patterns can be continued over several lines (a plain
-       ">" prompt is used for continuations), data lines may not. However new-
-       lines  can  be included in data by means of the \n escape (or \r, \r\n,
-       etc., depending on the newline sequence setting).
-
-
-OUTPUT FROM THE ALTERNATIVE MATCHING FUNCTION
-
-       When the alternative matching function, pcre[16|32]_dfa_exec(), is used
-       (by  means  of the \D escape sequence or the -dfa command line option),
-       the output consists of a list of all the  matches  that  start  at  the
-       first point in the subject where there is at least one match. For exam-
-       ple:
-
-           re> /(tang|tangerine|tan)/
-         data> yellow tangerine\D
-          0: tangerine
-          1: tang
-          2: tan
-
-       (Using the normal matching function on this data  finds  only  "tang".)
-       The  longest matching string is always given first (and numbered zero).
-       After a PCRE_ERROR_PARTIAL return, the output is "Partial match:", fol-
-       lowed  by  the  partially  matching  substring.  (Note that this is the
-       entire substring that was inspected during the partial  match;  it  may
-       include characters before the actual match start if a lookbehind asser-
-       tion, \K, \b, or \B was involved.)
-
-       If /g is present on the pattern, the search for further matches resumes
-       at the end of the longest match. For example:
-
-           re> /(tang|tangerine|tan)/g
-         data> yellow tangerine and tangy sultana\D
-          0: tangerine
-          1: tang
-          2: tan
-          0: tang
-          1: tan
-          0: tan
-
-       Since  the  matching  function  does not support substring capture, the
-       escape sequences that are concerned with captured  substrings  are  not
-       relevant.
-
-
-RESTARTING AFTER A PARTIAL MATCH
-
-       When the alternative matching function has given the PCRE_ERROR_PARTIAL
-       return, indicating that the subject partially matched the pattern,  you
-       can  restart  the match with additional subject data by means of the \R
-       escape sequence. For example:
-
-           re> /^\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d$/
-         data> 23ja\P\D
-         Partial match: 23ja
-         data> n05\R\D
-          0: n05
-
-       For further information about partial  matching,  see  the  pcrepartial
-       documentation.
-
-
-CALLOUTS
-
-       If  the pattern contains any callout requests, pcretest's callout func-
-       tion is called during matching. This works  with  both  matching  func-
-       tions. By default, the called function displays the callout number, the
-       start and current positions in the text at the callout  time,  and  the
-       next pattern item to be tested. For example:
-
-         --->pqrabcdef
-           0    ^  ^     \d
-
-       This  output  indicates  that  callout  number  0  occurred for a match
-       attempt starting at the fourth character of the  subject  string,  when
-       the pointer was at the seventh character of the data, and when the next
-       pattern item was \d. Just one circumflex is output  if  the  start  and
-       current positions are the same.
-
-       Callouts numbered 255 are assumed to be automatic callouts, inserted as
-       a result of the /C pattern modifier. In this case, instead  of  showing
-       the  callout  number, the offset in the pattern, preceded by a plus, is
-       output. For example:
-
-           re> /\d?[A-E]\*/C
-         data> E*
-         --->E*
-          +0 ^      \d?
-          +3 ^      [A-E]
-          +8 ^^     \*
-         +10 ^ ^
-          0: E*
-
-       If a pattern contains (*MARK) items, an additional line is output when-
-       ever  a  change  of  latest mark is passed to the callout function. For
-       example:
-
-           re> /a(*MARK:X)bc/C
-         data> abc
-         --->abc
-          +0 ^       a
-          +1 ^^      (*MARK:X)
-         +10 ^^      b
-         Latest Mark: X
-         +11 ^ ^     c
-         +12 ^  ^
-          0: abc
-
-       The mark changes between matching "a" and "b", but stays the  same  for
-       the  rest  of  the match, so nothing more is output. If, as a result of
-       backtracking, the mark reverts to being unset, the  text  "<unset>"  is
-       output.
-
-       The  callout  function  in pcretest returns zero (carry on matching) by
-       default, but you can use a \C item in a data line (as described  above)
-       to change this and other parameters of the callout.
-
-       Inserting  callouts can be helpful when using pcretest to check compli-
-       cated regular expressions. For further information about callouts,  see
-       the pcrecallout documentation.
-
-
-NON-PRINTING CHARACTERS
-
-       When  pcretest is outputting text in the compiled version of a pattern,
-       bytes other than 32-126 are always treated as  non-printing  characters
-       are are therefore shown as hex escapes.
-
-       When  pcretest  is  outputting text that is a matched part of a subject
-       string, it behaves in the same way, unless a different locale has  been
-       set  for  the  pattern  (using  the  /L  modifier).  In  this case, the
-       isprint() function to distinguish printing and non-printing characters.
-
-
-SAVING AND RELOADING COMPILED PATTERNS
-
-       The facilities described in this section are  not  available  when  the
-       POSIX  interface  to  PCRE  is being used, that is, when the /P pattern
-       modifier is specified.
-
-       When the POSIX interface is not in use, you can cause pcretest to write
-       a  compiled  pattern to a file, by following the modifiers with > and a
-       file name.  For example:
-
-         /pattern/im >/some/file
-
-       See the pcreprecompile documentation for a discussion about saving  and
-       re-using  compiled patterns.  Note that if the pattern was successfully
-       studied with JIT optimization, the JIT data cannot be saved.
-
-       The data that is written is binary.  The  first  eight  bytes  are  the
-       length  of  the  compiled  pattern  data  followed by the length of the
-       optional study data, each written as four  bytes  in  big-endian  order
-       (most  significant  byte  first). If there is no study data (either the
-       pattern was not studied, or studying did not return any data), the sec-
-       ond  length  is  zero. The lengths are followed by an exact copy of the
-       compiled pattern. If there is additional study  data,  this  (excluding
-       any  JIT  data)  follows  immediately after the compiled pattern. After
-       writing the file, pcretest expects to read a new pattern.
-
-       A saved pattern can be reloaded into pcretest by  specifying  <  and  a
-       file  name  instead  of a pattern. There must be no space between < and
-       the file name, which must not  contain  a  <  character,  as  otherwise
-       pcretest  will  interpret  the line as a pattern delimited by < charac-
-       ters. For example:
-
-          re> </some/file
-         Compiled pattern loaded from /some/file
-         No study data
-
-       If the pattern was previously studied with the  JIT  optimization,  the
-       JIT  information cannot be saved and restored, and so is lost. When the
-       pattern has been loaded, pcretest proceeds to read data  lines  in  the
-       usual way.
-
-       You  can copy a file written by pcretest to a different host and reload
-       it there, even if the new host has opposite endianness to  the  one  on
-       which  the pattern was compiled. For example, you can compile on an i86
-       machine and run on a SPARC machine. When a pattern  is  reloaded  on  a
-       host with different endianness, the confirmation message is changed to:
-
-         Compiled pattern (byte-inverted) loaded from /some/file
-
-       The test suite contains some saved pre-compiled patterns with different
-       endianness. These are reloaded using "<!" instead  of  just  "<".  This
-       suppresses the "(byte-inverted)" text so that the output is the same on
-       all hosts. It also forces debugging output once the  pattern  has  been
-       reloaded.
-
-       File  names  for  saving and reloading can be absolute or relative, but
-       note that the shell facility of expanding a file name that starts  with
-       a tilde (~) is not available.
-
-       The  ability to save and reload files in pcretest is intended for test-
-       ing and experimentation. It is not intended for production use  because
-       only  a  single pattern can be written to a file. Furthermore, there is
-       no facility for supplying  custom  character  tables  for  use  with  a
-       reloaded  pattern.  If  the  original  pattern was compiled with custom
-       tables, an attempt to match a subject string using a  reloaded  pattern
-       is  likely to cause pcretest to crash.  Finally, if you attempt to load
-       a file that is not in the correct format, the result is undefined.
-
-
-SEE ALSO
-
-       pcre(3), pcre16(3),  pcre32(3),  pcreapi(3),  pcrecallout(3),  pcrejit,
-       pcrematching(3), pcrepartial(d), pcrepattern(3), pcreprecompile(3).
-
-
-AUTHOR
-
-       Philip Hazel
-       University Computing Service
-       Cambridge CB2 3QH, England.
-
-
-REVISION
-
-       Last updated: 09 February 2014
-       Copyright (c) 1997-2014 University of Cambridge.
diff --git a/dist/doc/pcreunicode.3 b/dist/doc/pcreunicode.3
deleted file mode 100644
index cb5e526..0000000
--- a/dist/doc/pcreunicode.3
+++ /dev/null
@@ -1,249 +0,0 @@
-.TH PCREUNICODE 3 "27 February 2013" "PCRE 8.33"
-.SH NAME
-PCRE - Perl-compatible regular expressions
-.SH "UTF-8, UTF-16, UTF-32, AND UNICODE PROPERTY SUPPORT"
-.rs
-.sp
-As well as UTF-8 support, PCRE also supports UTF-16 (from release 8.30) and
-UTF-32 (from release 8.32), by means of two additional libraries. They can be
-built as well as, or instead of, the 8-bit library.
-.
-.
-.SH "UTF-8 SUPPORT"
-.rs
-.sp
-In order process UTF-8 strings, you must build PCRE's 8-bit library with UTF
-support, and, in addition, you must call
-.\" HREF
-\fBpcre_compile()\fP
-.\"
-with the PCRE_UTF8 option flag, or the pattern must start with the sequence
-(*UTF8) or (*UTF). When either of these is the case, both the pattern and any
-subject strings that are matched against it are treated as UTF-8 strings
-instead of strings of individual 1-byte characters.
-.
-.
-.SH "UTF-16 AND UTF-32 SUPPORT"
-.rs
-.sp
-In order process UTF-16 or UTF-32 strings, you must build PCRE's 16-bit or
-32-bit library with UTF support, and, in addition, you must call
-.\" HREF
-\fBpcre16_compile()\fP
-.\"
-or
-.\" HREF
-\fBpcre32_compile()\fP
-.\"
-with the PCRE_UTF16 or PCRE_UTF32 option flag, as appropriate. Alternatively,
-the pattern must start with the sequence (*UTF16), (*UTF32), as appropriate, or
-(*UTF), which can be used with either library. When UTF mode is set, both the
-pattern and any subject strings that are matched against it are treated as
-UTF-16 or UTF-32 strings instead of strings of individual 16-bit or 32-bit
-characters.
-.
-.
-.SH "UTF SUPPORT OVERHEAD"
-.rs
-.sp
-If you compile PCRE with UTF 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_UTF[8|16|32] flag occasionally, so should not be very big.
-.
-.
-.SH "UNICODE PROPERTY SUPPORT"
-.rs
-.sp
-If PCRE is built with Unicode character property support (which implies UTF
-support), the escape sequences \ep{..}, \eP{..}, and \eX can be used.
-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, the Unicode script names such as Arabic or Han, and the derived
-properties Any and L&. Full lists is given in the
-.\" HREF
-\fBpcrepattern\fP
-.\"
-and
-.\" HREF
-\fBpcresyntax\fP
-.\"
-documentation. Only the short names for properties are supported. For example,
-\ep{L} matches a letter. Its Perl synonym, \ep{Letter}, is not supported.
-Furthermore, in Perl, many properties may optionally be prefixed by "Is", for
-compatibility with Perl 5.6. PCRE does not support this.
-.
-.
-.\" HTML <a name="utf8strings"></a>
-.SS "Validity of UTF-8 strings"
-.rs
-.sp
-When you set the PCRE_UTF8 flag, the byte strings passed as patterns and
-subjects are (by default) checked for validity on entry to the relevant
-functions. The entire string is checked before any other processing takes
-place. From release 7.3 of PCRE, the check is according the rules of RFC 3629,
-which are themselves derived from the Unicode specification. Earlier releases
-of PCRE followed the rules of RFC 2279, which allows the full range of 31-bit
-values (0 to 0x7FFFFFFF). The current check allows only values in the range U+0
-to U+10FFFF, excluding the surrogate area. (From release 8.33 the so-called
-"non-character" code points are no longer excluded because Unicode corrigendum
-#9 makes it clear that they should not be.)
-.P
-Characters in the "Surrogate Area" of Unicode are reserved for use by UTF-16,
-where they are used in pairs to encode codepoints with values greater than
-0xFFFF. The code points that are encoded by UTF-16 pairs are available
-independently in the UTF-8 and UTF-32 encodings. (In other words, the whole
-surrogate thing is a fudge for UTF-16 which unfortunately messes up UTF-8 and
-UTF-32.)
-.P
-If an invalid UTF-8 string is passed to PCRE, an error return is given. At
-compile time, the only additional information is the offset to the first byte
-of the failing character. The run-time functions \fBpcre_exec()\fP and
-\fBpcre_dfa_exec()\fP also pass back this information, as well as a more
-detailed reason code if the caller has provided memory in which to do this.
-.P
-In some situations, you may already know that your strings are valid, and
-therefore want to skip these checks in order to improve performance, for
-example in the case of a long subject string that is being scanned repeatedly.
-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.
-.P
-Note that passing PCRE_NO_UTF8_CHECK to \fBpcre_compile()\fP just disables the
-check for the pattern; it does not also apply to subject strings. If you want
-to disable the check for a subject string you must pass this option to
-\fBpcre_exec()\fP or \fBpcre_dfa_exec()\fP.
-.P
-If you pass an invalid UTF-8 string when PCRE_NO_UTF8_CHECK is set, the result
-is undefined and your program may crash.
-.
-.
-.\" HTML <a name="utf16strings"></a>
-.SS "Validity of UTF-16 strings"
-.rs
-.sp
-When you set the PCRE_UTF16 flag, the strings of 16-bit data units that are
-passed as patterns and subjects are (by default) checked for validity on entry
-to the relevant functions. Values other than those in the surrogate range
-U+D800 to U+DFFF are independent code points. Values in the surrogate range
-must be used in pairs in the correct manner.
-.P
-If an invalid UTF-16 string is passed to PCRE, an error return is given. At
-compile time, the only additional information is the offset to the first data
-unit of the failing character. The run-time functions \fBpcre16_exec()\fP and
-\fBpcre16_dfa_exec()\fP also pass back this information, as well as a more
-detailed reason code if the caller has provided memory in which to do this.
-.P
-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_UTF16_CHECK flag at compile time or at run time, PCRE assumes that
-the pattern or subject it is given (respectively) contains only valid UTF-16
-sequences. In this case, it does not diagnose an invalid UTF-16 string.
-However, if an invalid string is passed, the result is undefined.
-.
-.
-.\" HTML <a name="utf32strings"></a>
-.SS "Validity of UTF-32 strings"
-.rs
-.sp
-When you set the PCRE_UTF32 flag, the strings of 32-bit data units that are
-passed as patterns and subjects are (by default) checked for validity on entry
-to the relevant functions.  This check allows only values in the range U+0
-to U+10FFFF, excluding the surrogate area U+D800 to U+DFFF.
-.P
-If an invalid UTF-32 string is passed to PCRE, an error return is given. At
-compile time, the only additional information is the offset to the first data
-unit of the failing character. The run-time functions \fBpcre32_exec()\fP and
-\fBpcre32_dfa_exec()\fP also pass back this information, as well as a more
-detailed reason code if the caller has provided memory in which to do this.
-.P
-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_UTF32_CHECK flag at compile time or at run time, PCRE assumes that
-the pattern or subject it is given (respectively) contains only valid UTF-32
-sequences. In this case, it does not diagnose an invalid UTF-32 string.
-However, if an invalid string is passed, the result is undefined.
-.
-.
-.SS "General comments about UTF modes"
-.rs
-.sp
-1. Codepoints less than 256 can be specified in patterns by either braced or
-unbraced hexadecimal escape sequences (for example, \ex{b3} or \exb3). Larger
-values have to use braced sequences.
-.P
-2. Octal numbers up to \e777 are recognized, and in UTF-8 mode they match
-two-byte characters for values greater than \e177.
-.P
-3. Repeat quantifiers apply to complete UTF characters, not to individual
-data units, for example: \ex{100}{3}.
-.P
-4. The dot metacharacter matches one UTF character instead of a single data
-unit.
-.P
-5. The escape sequence \eC can be used to match a single byte in UTF-8 mode, or
-a single 16-bit data unit in UTF-16 mode, or a single 32-bit data unit in
-UTF-32 mode, but its use can lead to some strange effects because it breaks up
-multi-unit characters (see the description of \eC in the
-.\" HREF
-\fBpcrepattern\fP
-.\"
-documentation). The use of \eC is not supported in the alternative matching
-function \fBpcre[16|32]_dfa_exec()\fP, nor is it supported in UTF mode by the
-JIT optimization of \fBpcre[16|32]_exec()\fP. If JIT optimization is requested
-for a UTF pattern that contains \eC, it will not succeed, and so the matching
-will be carried out by the normal interpretive function.
-.P
-6. The character escapes \eb, \eB, \ed, \eD, \es, \eS, \ew, and \eW correctly
-test characters of any code value, but, by default, the characters that PCRE
-recognizes as digits, spaces, or word characters remain the same set as in
-non-UTF mode, all with values less than 256. This remains true even when PCRE
-is built to include Unicode property support, because to do otherwise would
-slow down PCRE in many common cases. Note in particular that this applies to
-\eb and \eB, because they are defined in terms of \ew and \eW. If you really
-want to test for a wider sense of, say, "digit", you can use explicit Unicode
-property tests such as \ep{Nd}. Alternatively, if you set the PCRE_UCP option,
-the way that the character escapes work is changed so that Unicode properties
-are used to determine which characters match. There are more details in the
-section on
-.\" HTML <a href="pcrepattern.html#genericchartypes">
-.\" </a>
-generic character types
-.\"
-in the
-.\" HREF
-\fBpcrepattern\fP
-.\"
-documentation.
-.P
-7. Similarly, characters that match the POSIX named character classes are all
-low-valued characters, unless the PCRE_UCP option is set.
-.P
-8. However, the horizontal and vertical white space matching escapes (\eh, \eH,
-\ev, and \eV) do match all the appropriate Unicode characters, whether or not
-PCRE_UCP is set.
-.P
-9. Case-insensitive matching applies only to characters whose values are less
-than 128, unless PCRE is built with Unicode property support. A few Unicode
-characters such as Greek sigma have more than two codepoints that are
-case-equivalent. Up to and including PCRE release 8.31, only one-to-one case
-mappings were supported, but later releases (with Unicode property support) do
-treat as case-equivalent all versions of characters such as Greek sigma.
-.
-.
-.SH AUTHOR
-.rs
-.sp
-.nf
-Philip Hazel
-University Computing Service
-Cambridge CB2 3QH, England.
-.fi
-.
-.
-.SH REVISION
-.rs
-.sp
-.nf
-Last updated: 27 February 2013
-Copyright (c) 1997-2013 University of Cambridge.
-.fi
diff --git a/dist/doc/perltest.txt b/dist/doc/perltest.txt
deleted file mode 100644
index bb1a52a..0000000
--- a/dist/doc/perltest.txt
+++ /dev/null
@@ -1,42 +0,0 @@
-The perltest program
---------------------
-
-The perltest.pl script tests Perl's regular expressions; it has the same
-specification as pcretest, and so can be given identical input, except that
-input patterns can be followed only by Perl's lower case modifiers and certain
-other pcretest modifiers that are either handled or ignored:
-
-  /+   recognized and handled by perltest
-  /++  the second + is ignored
-  /8   recognized and handled by perltest
-  /J   ignored
-  /K   ignored
-  /W   ignored
-  /S   ignored
-  /SS  ignored
-  /Y   ignored
-
-The pcretest \Y escape in data lines is removed before matching. The data lines
-are processed as Perl double-quoted strings, so if they contain " $ or @
-characters, these have to be escaped. For this reason, all such characters in
-the Perl-compatible testinput1 file are escaped so that they can be used for
-perltest as well as for pcretest. The special upper case pattern modifiers such
-as /A that pcretest recognizes, and its special data line escapes, are not used
-in the Perl-compatible test file. The output should be identical, apart from
-the initial identifying banner.
-
-The perltest.pl script can also test UTF-8 features. It recognizes the special
-modifier /8 that pcretest uses to invoke UTF-8 functionality. The testinput4
-and testinput6 files can be fed to perltest to run compatible UTF-8 tests.
-However, it is necessary to add "use utf8; require Encode" to the script to
-make this work correctly. I have not managed to find a way to handle this
-automatically.
-
-The other testinput files are not suitable for feeding to perltest.pl, since
-they make use of the special upper case modifiers and escapes that pcretest
-uses to test certain features of PCRE. Some of these files also contain
-malformed regular expressions, in order to check that PCRE diagnoses them
-correctly.
-
-Philip Hazel
-January 2012
diff --git a/dist/libpcre.pc.in b/dist/libpcre.pc.in
deleted file mode 100644
index 0a35da8..0000000
--- a/dist/libpcre.pc.in
+++ /dev/null
@@ -1,13 +0,0 @@
-# Package Information for pkg-config
-
-prefix=@prefix@
-exec_prefix=@exec_prefix@
-libdir=@libdir@
-includedir=@includedir@
-
-Name: libpcre
-Description: PCRE - Perl compatible regular expressions C library with 8 bit character support
-Version: @PACKAGE_VERSION@
-Libs: -L${libdir} -lpcre
-Libs.private: @PTHREAD_CFLAGS@ @PTHREAD_LIBS@
-Cflags: -I${includedir} @PCRE_STATIC_CFLAG@
diff --git a/dist/libpcre16.pc.in b/dist/libpcre16.pc.in
deleted file mode 100644
index 080c9dc..0000000
--- a/dist/libpcre16.pc.in
+++ /dev/null
@@ -1,13 +0,0 @@
-# Package Information for pkg-config
-
-prefix=@prefix@
-exec_prefix=@exec_prefix@
-libdir=@libdir@
-includedir=@includedir@
-
-Name: libpcre16
-Description: PCRE - Perl compatible regular expressions C library with 16 bit character support
-Version: @PACKAGE_VERSION@
-Libs: -L${libdir} -lpcre16
-Libs.private: @PTHREAD_CFLAGS@ @PTHREAD_LIBS@
-Cflags: -I${includedir} @PCRE_STATIC_CFLAG@
diff --git a/dist/libpcre32.pc.in b/dist/libpcre32.pc.in
deleted file mode 100644
index a3ae0e1..0000000
--- a/dist/libpcre32.pc.in
+++ /dev/null
@@ -1,13 +0,0 @@
-# Package Information for pkg-config
-
-prefix=@prefix@
-exec_prefix=@exec_prefix@
-libdir=@libdir@
-includedir=@includedir@
-
-Name: libpcre32
-Description: PCRE - Perl compatible regular expressions C library with 32 bit character support
-Version: @PACKAGE_VERSION@
-Libs: -L${libdir} -lpcre32
-Libs.private: @PTHREAD_CFLAGS@ @PTHREAD_LIBS@
-Cflags: -I${includedir} @PCRE_STATIC_CFLAG@
diff --git a/dist/libpcrecpp.pc.in b/dist/libpcrecpp.pc.in
deleted file mode 100644
index ef006fe..0000000
--- a/dist/libpcrecpp.pc.in
+++ /dev/null
@@ -1,12 +0,0 @@
-# Package Information for pkg-config
-
-prefix=@prefix@
-exec_prefix=@exec_prefix@
-libdir=@libdir@
-includedir=@includedir@
-
-Name: libpcrecpp
-Description: PCRECPP - C++ wrapper for PCRE
-Version: @PACKAGE_VERSION@
-Libs: -L${libdir} -lpcre -lpcrecpp
-Cflags: -I${includedir} @PCRE_STATIC_CFLAG@
diff --git a/dist/libpcreposix.pc.in b/dist/libpcreposix.pc.in
deleted file mode 100644
index c6c0b0c..0000000
--- a/dist/libpcreposix.pc.in
+++ /dev/null
@@ -1,13 +0,0 @@
-# Package Information for pkg-config
-
-prefix=@prefix@
-exec_prefix=@exec_prefix@
-libdir=@libdir@
-includedir=@includedir@
-
-Name: libpcreposix
-Description: PCREPosix - Posix compatible interface to libpcre
-Version: @PACKAGE_VERSION@
-Libs: -L${libdir} -lpcreposix
-Cflags: -I${includedir} @PCRE_STATIC_CFLAG@
-Requires.private: libpcre
diff --git a/dist/makevp.bat b/dist/makevp.bat
deleted file mode 100644
index 5f79548..0000000
--- a/dist/makevp.bat
+++ /dev/null
@@ -1,66 +0,0 @@
-:: AH 20-12-06 modified for new PCRE-7.0 and VP/BCC
-:: PH 19-03-07 renamed !compile.txt and !linklib.txt as makevp-compile.txt and
-::             makevp-linklib.txt
-:: PH 26-03-07 re-renamed !compile.txt and !linklib.txt as makevp-c.txt and
-::             makevp-l.txt
-:: PH 29-03-07 hopefully the final rename to makevp_c and makevp_l
-:: AH 27.08.08 updated for new PCRE-7.7
-::             required PCRE.H and CONFIG.H will be generated if not existing
-
-@echo off
-echo.
-echo Compiling PCRE with BORLAND C++ for VIRTUAL PASCAL
-echo.
-
-REM This file was contributed by Alexander Tokarev for building PCRE for use
-REM with Virtual Pascal. It has not been tested with the latest PCRE release.
-
-REM This file has been modified and extended to compile with newer PCRE releases
-REM by Stefan Weber (Angels Holocaust).
-
-REM CHANGE THIS FOR YOUR BORLAND C++ COMPILER PATH
-SET BORLAND=f:\bcc
-REM location of the TASM binaries, if compiling with the -B BCC switch
-SET TASM=f:\tasm
-
-SET PATH=%PATH%;%BORLAND%\bin;%TASM%\bin
-SET PCRE_VER=77
-SET COMPILE_DEFAULTS=-DHAVE_CONFIG_H -DPCRE_STATIC -I%BORLAND%\include
-
-del pcre%PCRE_VER%.lib >nul 2>nul
-
-:: sh configure
-
-:: check for needed header files
-if not exist pcre.h copy pcre.h.generic pcre.h
-if not exist config.h copy config.h.generic config.h
-
-bcc32 -DDFTABLES %COMPILE_DEFAULTS% -L%BORLAND%\lib dftables.c
-IF ERRORLEVEL 1 GOTO ERROR
-
-:: dftables > chartables.c
-dftables pcre_chartables.c
-
-REM compile and link the PCRE library into lib: option -B for ASM compile works too
-bcc32 -a4 -c -RT- -y- -v- -u- -R- -Q- -X -d -fp -ff -P- -O2 -Oc -Ov -3 -w-8004 -w-8064 -w-8065 -w-8012 -UDFTABLES -DVPCOMPAT %COMPILE_DEFAULTS% @makevp_c.txt
-IF ERRORLEVEL 1 GOTO ERROR
-
-tlib %BORLAND%\lib\cw32.lib *calloc *del *strncmp *memcpy *memmove *memset *memcmp *strlen
-IF ERRORLEVEL 1 GOTO ERROR
-tlib pcre%PCRE_VER%.lib @makevp_l.txt +calloc.obj +del.obj +strncmp.obj +memcpy.obj +memmove.obj +memset.obj +memcmp.obj +strlen.obj
-IF ERRORLEVEL 1 GOTO ERROR
-
-del *.obj *.tds *.bak >nul 2>nul
-
-echo ---
-echo Now the library should be complete. Please check all messages above.
-echo Don't care for warnings, it's OK.
-goto END
-
-:ERROR
-echo ---
-echo Error while compiling PCRE. Aborting...
-pause
-goto END
-
-:END
diff --git a/dist/makevp_c.txt b/dist/makevp_c.txt
deleted file mode 100644
index 5648115..0000000
--- a/dist/makevp_c.txt
+++ /dev/null
@@ -1,21 +0,0 @@
-pcre_byte_order.c

-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_jit_compile.c

-pcre_maketables.c

-pcre_newline.c

-pcre_ord2utf8.c

-pcre_refcount.c

-pcre_string_utils.c

-pcre_study.c

-pcre_tables.c

-pcre_ucd.c

-pcre_valid_utf8.c

-pcre_version.c

-pcre_xclass.c

diff --git a/dist/makevp_l.txt b/dist/makevp_l.txt
deleted file mode 100644
index 9b071e0..0000000
--- a/dist/makevp_l.txt
+++ /dev/null
@@ -1,21 +0,0 @@
-+pcre_byte_order.obj        &

-+pcre_chartables.obj        &

-+pcre_compile.obj           &

-+pcre_config.obj	    &

-+pcre_dfa_exec.obj          &

-+pcre_exec.obj		    &

-+pcre_fullinfo.obj          &

-+pcre_get.obj		    &

-+pcre_globals.obj           &

-+pcre_jit_compile.obj	    &

-+pcre_maketables.obj        &

-+pcre_newline.obj           &

-+pcre_ord2utf8.obj          &

-+pcre_refcount.obj          &

-+pcre_string_utils.obj      &

-+pcre_study.obj		    &

-+pcre_tables.obj	    &

-+pcre_ucd.obj               &

-+pcre_valid_utf8.obj        &

-+pcre_version.obj           &

-+pcre_xclass.obj

diff --git a/dist/pcre.h.generic b/dist/pcre.h.generic
deleted file mode 100644
index bf6351f..0000000
--- a/dist/pcre.h.generic
+++ /dev/null
@@ -1,677 +0,0 @@
-/*************************************************
-*       Perl-Compatible Regular Expressions      *
-*************************************************/
-
-/* This is the public header file for the PCRE library, to be #included by
-applications that call the PCRE functions.
-
-           Copyright (c) 1997-2014 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 current PCRE version information. */
-
-#define PCRE_MAJOR          8
-#define PCRE_MINOR          38
-#define PCRE_PRERELEASE     
-#define PCRE_DATE           2015-11-23
-
-/* When an application links to a PCRE DLL in Windows, the symbols that are
-imported have to be identified as such. When building PCRE, the appropriate
-export setting is defined in pcre_internal.h, which includes this file. So we
-don't change existing definitions of PCRE_EXP_DECL and PCRECPP_EXP_DECL. */
-
-#if defined(_WIN32) && !defined(PCRE_STATIC)
-#  ifndef PCRE_EXP_DECL
-#    define PCRE_EXP_DECL  extern __declspec(dllimport)
-#  endif
-#  ifdef __cplusplus
-#    ifndef PCRECPP_EXP_DECL
-#      define PCRECPP_EXP_DECL  extern __declspec(dllimport)
-#    endif
-#    ifndef PCRECPP_EXP_DEFN
-#      define PCRECPP_EXP_DEFN  __declspec(dllimport)
-#    endif
-#  endif
-#endif
-
-/* By default, we use the standard "extern" declarations. */
-
-#ifndef PCRE_EXP_DECL
-#  ifdef __cplusplus
-#    define PCRE_EXP_DECL  extern "C"
-#  else
-#    define PCRE_EXP_DECL  extern
-#  endif
-#endif
-
-#ifdef __cplusplus
-#  ifndef PCRECPP_EXP_DECL
-#    define PCRECPP_EXP_DECL  extern
-#  endif
-#  ifndef PCRECPP_EXP_DEFN
-#    define PCRECPP_EXP_DEFN
-#  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
-
-/* Public options. Some are compile-time only, some are run-time only, and some
-are both. Most of the compile-time options are saved with the compiled regex so
-that they can be inspected during studying (and therefore JIT compiling). Note
-that pcre_study() has its own set of options. Originally, all the options
-defined here used distinct bits. However, almost all the bits in a 32-bit word
-are now used, so in order to conserve them, option bits that were previously
-only recognized at matching time (i.e. by pcre_exec() or pcre_dfa_exec()) may
-also be used for compile-time options that affect only compiling and are not
-relevant for studying or JIT compiling.
-
-Some options for pcre_compile() change its behaviour but do not affect the
-behaviour of the execution functions. Other options are passed through to the
-execution functions and affect their behaviour, with or without affecting the
-behaviour of pcre_compile().
-
-Options that can be passed to pcre_compile() are tagged Cx below, with these
-variants:
-
-C1   Affects compile only
-C2   Does not affect compile; affects exec, dfa_exec
-C3   Affects compile, exec, dfa_exec
-C4   Affects compile, exec, dfa_exec, study
-C5   Affects compile, exec, study
-
-Options that can be set for pcre_exec() and/or pcre_dfa_exec() are flagged with
-E and D, respectively. They take precedence over C3, C4, and C5 settings passed
-from pcre_compile(). Those that are compatible with JIT execution are flagged
-with J. */
-
-#define PCRE_CASELESS           0x00000001  /* C1       */
-#define PCRE_MULTILINE          0x00000002  /* C1       */
-#define PCRE_DOTALL             0x00000004  /* C1       */
-#define PCRE_EXTENDED           0x00000008  /* C1       */
-#define PCRE_ANCHORED           0x00000010  /* C4 E D   */
-#define PCRE_DOLLAR_ENDONLY     0x00000020  /* C2       */
-#define PCRE_EXTRA              0x00000040  /* C1       */
-#define PCRE_NOTBOL             0x00000080  /*    E D J */
-#define PCRE_NOTEOL             0x00000100  /*    E D J */
-#define PCRE_UNGREEDY           0x00000200  /* C1       */
-#define PCRE_NOTEMPTY           0x00000400  /*    E D J */
-#define PCRE_UTF8               0x00000800  /* C4        )          */
-#define PCRE_UTF16              0x00000800  /* C4        ) Synonyms */
-#define PCRE_UTF32              0x00000800  /* C4        )          */
-#define PCRE_NO_AUTO_CAPTURE    0x00001000  /* C1       */
-#define PCRE_NO_UTF8_CHECK      0x00002000  /* C1 E D J  )          */
-#define PCRE_NO_UTF16_CHECK     0x00002000  /* C1 E D J  ) Synonyms */
-#define PCRE_NO_UTF32_CHECK     0x00002000  /* C1 E D J  )          */
-#define PCRE_AUTO_CALLOUT       0x00004000  /* C1       */
-#define PCRE_PARTIAL_SOFT       0x00008000  /*    E D J  ) Synonyms */
-#define PCRE_PARTIAL            0x00008000  /*    E D J  )          */
-
-/* This pair use the same bit. */
-#define PCRE_NEVER_UTF          0x00010000  /* C1        ) Overlaid */
-#define PCRE_DFA_SHORTEST       0x00010000  /*      D    ) Overlaid */
-
-/* This pair use the same bit. */
-#define PCRE_NO_AUTO_POSSESS    0x00020000  /* C1        ) Overlaid */
-#define PCRE_DFA_RESTART        0x00020000  /*      D    ) Overlaid */
-
-#define PCRE_FIRSTLINE          0x00040000  /* C3       */
-#define PCRE_DUPNAMES           0x00080000  /* C1       */
-#define PCRE_NEWLINE_CR         0x00100000  /* C3 E D   */
-#define PCRE_NEWLINE_LF         0x00200000  /* C3 E D   */
-#define PCRE_NEWLINE_CRLF       0x00300000  /* C3 E D   */
-#define PCRE_NEWLINE_ANY        0x00400000  /* C3 E D   */
-#define PCRE_NEWLINE_ANYCRLF    0x00500000  /* C3 E D   */
-#define PCRE_BSR_ANYCRLF        0x00800000  /* C3 E D   */
-#define PCRE_BSR_UNICODE        0x01000000  /* C3 E D   */
-#define PCRE_JAVASCRIPT_COMPAT  0x02000000  /* C5       */
-#define PCRE_NO_START_OPTIMIZE  0x04000000  /* C2 E D    ) Synonyms */
-#define PCRE_NO_START_OPTIMISE  0x04000000  /* C2 E D    )          */
-#define PCRE_PARTIAL_HARD       0x08000000  /*    E D J */
-#define PCRE_NOTEMPTY_ATSTART   0x10000000  /*    E D J */
-#define PCRE_UCP                0x20000000  /* C3       */
-
-/* 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_OPCODE   (-5)
-#define PCRE_ERROR_UNKNOWN_NODE     (-5)  /* For backward compatibility */
-#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)  /* Same for 8/16/32 */
-#define PCRE_ERROR_BADUTF16        (-10)  /* Same for 8/16/32 */
-#define PCRE_ERROR_BADUTF32        (-10)  /* Same for 8/16/32 */
-#define PCRE_ERROR_BADUTF8_OFFSET  (-11)  /* Same for 8/16 */
-#define PCRE_ERROR_BADUTF16_OFFSET (-11)  /* Same for 8/16 */
-#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)
-#define PCRE_ERROR_RECURSIONLIMIT  (-21)
-#define PCRE_ERROR_NULLWSLIMIT     (-22)  /* No longer actually used */
-#define PCRE_ERROR_BADNEWLINE      (-23)
-#define PCRE_ERROR_BADOFFSET       (-24)
-#define PCRE_ERROR_SHORTUTF8       (-25)
-#define PCRE_ERROR_SHORTUTF16      (-25)  /* Same for 8/16 */
-#define PCRE_ERROR_RECURSELOOP     (-26)
-#define PCRE_ERROR_JIT_STACKLIMIT  (-27)
-#define PCRE_ERROR_BADMODE         (-28)
-#define PCRE_ERROR_BADENDIANNESS   (-29)
-#define PCRE_ERROR_DFA_BADRESTART  (-30)
-#define PCRE_ERROR_JIT_BADOPTION   (-31)
-#define PCRE_ERROR_BADLENGTH       (-32)
-#define PCRE_ERROR_UNSET           (-33)
-
-/* Specific error codes for UTF-8 validity checks */
-
-#define PCRE_UTF8_ERR0               0
-#define PCRE_UTF8_ERR1               1
-#define PCRE_UTF8_ERR2               2
-#define PCRE_UTF8_ERR3               3
-#define PCRE_UTF8_ERR4               4
-#define PCRE_UTF8_ERR5               5
-#define PCRE_UTF8_ERR6               6
-#define PCRE_UTF8_ERR7               7
-#define PCRE_UTF8_ERR8               8
-#define PCRE_UTF8_ERR9               9
-#define PCRE_UTF8_ERR10             10
-#define PCRE_UTF8_ERR11             11
-#define PCRE_UTF8_ERR12             12
-#define PCRE_UTF8_ERR13             13
-#define PCRE_UTF8_ERR14             14
-#define PCRE_UTF8_ERR15             15
-#define PCRE_UTF8_ERR16             16
-#define PCRE_UTF8_ERR17             17
-#define PCRE_UTF8_ERR18             18
-#define PCRE_UTF8_ERR19             19
-#define PCRE_UTF8_ERR20             20
-#define PCRE_UTF8_ERR21             21
-#define PCRE_UTF8_ERR22             22  /* Unused (was non-character) */
-
-/* Specific error codes for UTF-16 validity checks */
-
-#define PCRE_UTF16_ERR0              0
-#define PCRE_UTF16_ERR1              1
-#define PCRE_UTF16_ERR2              2
-#define PCRE_UTF16_ERR3              3
-#define PCRE_UTF16_ERR4              4  /* Unused (was non-character) */
-
-/* Specific error codes for UTF-32 validity checks */
-
-#define PCRE_UTF32_ERR0              0
-#define PCRE_UTF32_ERR1              1
-#define PCRE_UTF32_ERR2              2  /* Unused (was non-character) */
-#define PCRE_UTF32_ERR3              3
-
-/* 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
-#define PCRE_INFO_OKPARTIAL         12
-#define PCRE_INFO_JCHANGED          13
-#define PCRE_INFO_HASCRORLF         14
-#define PCRE_INFO_MINLENGTH         15
-#define PCRE_INFO_JIT               16
-#define PCRE_INFO_JITSIZE           17
-#define PCRE_INFO_MAXLOOKBEHIND     18
-#define PCRE_INFO_FIRSTCHARACTER    19
-#define PCRE_INFO_FIRSTCHARACTERFLAGS 20
-#define PCRE_INFO_REQUIREDCHAR      21
-#define PCRE_INFO_REQUIREDCHARFLAGS 22
-#define PCRE_INFO_MATCHLIMIT        23
-#define PCRE_INFO_RECURSIONLIMIT    24
-#define PCRE_INFO_MATCH_EMPTY       25
-
-/* Request types for pcre_config(). Do not re-arrange, in order to remain
-compatible. */
-
-#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
-#define PCRE_CONFIG_MATCH_LIMIT_RECURSION   7
-#define PCRE_CONFIG_BSR                     8
-#define PCRE_CONFIG_JIT                     9
-#define PCRE_CONFIG_UTF16                  10
-#define PCRE_CONFIG_JITTARGET              11
-#define PCRE_CONFIG_UTF32                  12
-#define PCRE_CONFIG_PARENS_LIMIT           13
-
-/* Request types for pcre_study(). Do not re-arrange, in order to remain
-compatible. */
-
-#define PCRE_STUDY_JIT_COMPILE                0x0001
-#define PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE   0x0002
-#define PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE   0x0004
-#define PCRE_STUDY_EXTRA_NEEDED               0x0008
-
-/* Bit flags for the pcre[16|32]_extra structure. Do not re-arrange or redefine
-these bits, just add new ones on the end, in order to remain compatible. */
-
-#define PCRE_EXTRA_STUDY_DATA             0x0001
-#define PCRE_EXTRA_MATCH_LIMIT            0x0002
-#define PCRE_EXTRA_CALLOUT_DATA           0x0004
-#define PCRE_EXTRA_TABLES                 0x0008
-#define PCRE_EXTRA_MATCH_LIMIT_RECURSION  0x0010
-#define PCRE_EXTRA_MARK                   0x0020
-#define PCRE_EXTRA_EXECUTABLE_JIT         0x0040
-
-/* Types */
-
-struct real_pcre;                 /* declaration; the definition is private  */
-typedef struct real_pcre pcre;
-
-struct real_pcre16;               /* declaration; the definition is private  */
-typedef struct real_pcre16 pcre16;
-
-struct real_pcre32;               /* declaration; the definition is private  */
-typedef struct real_pcre32 pcre32;
-
-struct real_pcre_jit_stack;       /* declaration; the definition is private  */
-typedef struct real_pcre_jit_stack pcre_jit_stack;
-
-struct real_pcre16_jit_stack;     /* declaration; the definition is private  */
-typedef struct real_pcre16_jit_stack pcre16_jit_stack;
-
-struct real_pcre32_jit_stack;     /* declaration; the definition is private  */
-typedef struct real_pcre32_jit_stack pcre32_jit_stack;
-
-/* If PCRE is compiled with 16 bit character support, PCRE_UCHAR16 must contain
-a 16 bit wide signed data type. Otherwise it can be a dummy data type since
-pcre16 functions are not implemented. There is a check for this in pcre_internal.h. */
-#ifndef PCRE_UCHAR16
-#define PCRE_UCHAR16 unsigned short
-#endif
-
-#ifndef PCRE_SPTR16
-#define PCRE_SPTR16 const PCRE_UCHAR16 *
-#endif
-
-/* If PCRE is compiled with 32 bit character support, PCRE_UCHAR32 must contain
-a 32 bit wide signed data type. Otherwise it can be a dummy data type since
-pcre32 functions are not implemented. There is a check for this in pcre_internal.h. */
-#ifndef PCRE_UCHAR32
-#define PCRE_UCHAR32 unsigned int
-#endif
-
-#ifndef PCRE_SPTR32
-#define PCRE_SPTR32 const PCRE_UCHAR32 *
-#endif
-
-/* When PCRE is compiled as a C++ library, the subject pointer type can be
-replaced with a custom type. For conventional use, the public interface is a
-const char *. */
-
-#ifndef PCRE_SPTR
-#define PCRE_SPTR const char *
-#endif
-
-/* 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 */
-  unsigned long int match_limit_recursion; /* Max recursive calls to match() */
-  unsigned char **mark;           /* For passing back a mark pointer */
-  void *executable_jit;           /* Contains a pointer to a compiled jit code */
-} pcre_extra;
-
-/* Same structure as above, but with 16 bit char pointers. */
-
-typedef struct pcre16_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 */
-  unsigned long int match_limit_recursion; /* Max recursive calls to match() */
-  PCRE_UCHAR16 **mark;            /* For passing back a mark pointer */
-  void *executable_jit;           /* Contains a pointer to a compiled jit code */
-} pcre16_extra;
-
-/* Same structure as above, but with 32 bit char pointers. */
-
-typedef struct pcre32_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 */
-  unsigned long int match_limit_recursion; /* Max recursive calls to match() */
-  PCRE_UCHAR32 **mark;            /* For passing back a mark pointer */
-  void *executable_jit;           /* Contains a pointer to a compiled jit code */
-} pcre32_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 */
-  PCRE_SPTR    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 */
-  /* ------------------- Added for Version 2 -------------------------- */
-  const unsigned char *mark;      /* Pointer to current mark or NULL    */
-  /* ------------------------------------------------------------------ */
-} pcre_callout_block;
-
-/* Same structure as above, but with 16 bit char pointers. */
-
-typedef struct pcre16_callout_block {
-  int          version;           /* Identifies version of block */
-  /* ------------------------ Version 0 ------------------------------- */
-  int          callout_number;    /* Number compiled into pattern */
-  int         *offset_vector;     /* The offset vector */
-  PCRE_SPTR16  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 */
-  /* ------------------- Added for Version 2 -------------------------- */
-  const PCRE_UCHAR16 *mark;       /* Pointer to current mark or NULL    */
-  /* ------------------------------------------------------------------ */
-} pcre16_callout_block;
-
-/* Same structure as above, but with 32 bit char pointers. */
-
-typedef struct pcre32_callout_block {
-  int          version;           /* Identifies version of block */
-  /* ------------------------ Version 0 ------------------------------- */
-  int          callout_number;    /* Number compiled into pattern */
-  int         *offset_vector;     /* The offset vector */
-  PCRE_SPTR32  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 */
-  /* ------------------- Added for Version 2 -------------------------- */
-  const PCRE_UCHAR32 *mark;       /* Pointer to current mark or NULL    */
-  /* ------------------------------------------------------------------ */
-} pcre32_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_EXP_DECL void *(*pcre_malloc)(size_t);
-PCRE_EXP_DECL void  (*pcre_free)(void *);
-PCRE_EXP_DECL void *(*pcre_stack_malloc)(size_t);
-PCRE_EXP_DECL void  (*pcre_stack_free)(void *);
-PCRE_EXP_DECL int   (*pcre_callout)(pcre_callout_block *);
-PCRE_EXP_DECL int   (*pcre_stack_guard)(void);
-
-PCRE_EXP_DECL void *(*pcre16_malloc)(size_t);
-PCRE_EXP_DECL void  (*pcre16_free)(void *);
-PCRE_EXP_DECL void *(*pcre16_stack_malloc)(size_t);
-PCRE_EXP_DECL void  (*pcre16_stack_free)(void *);
-PCRE_EXP_DECL int   (*pcre16_callout)(pcre16_callout_block *);
-PCRE_EXP_DECL int   (*pcre16_stack_guard)(void);
-
-PCRE_EXP_DECL void *(*pcre32_malloc)(size_t);
-PCRE_EXP_DECL void  (*pcre32_free)(void *);
-PCRE_EXP_DECL void *(*pcre32_stack_malloc)(size_t);
-PCRE_EXP_DECL void  (*pcre32_stack_free)(void *);
-PCRE_EXP_DECL int   (*pcre32_callout)(pcre32_callout_block *);
-PCRE_EXP_DECL int   (*pcre32_stack_guard)(void);
-#else   /* VPCOMPAT */
-PCRE_EXP_DECL void *pcre_malloc(size_t);
-PCRE_EXP_DECL void  pcre_free(void *);
-PCRE_EXP_DECL void *pcre_stack_malloc(size_t);
-PCRE_EXP_DECL void  pcre_stack_free(void *);
-PCRE_EXP_DECL int   pcre_callout(pcre_callout_block *);
-PCRE_EXP_DECL int   pcre_stack_guard(void);
-
-PCRE_EXP_DECL void *pcre16_malloc(size_t);
-PCRE_EXP_DECL void  pcre16_free(void *);
-PCRE_EXP_DECL void *pcre16_stack_malloc(size_t);
-PCRE_EXP_DECL void  pcre16_stack_free(void *);
-PCRE_EXP_DECL int   pcre16_callout(pcre16_callout_block *);
-PCRE_EXP_DECL int   pcre16_stack_guard(void);
-
-PCRE_EXP_DECL void *pcre32_malloc(size_t);
-PCRE_EXP_DECL void  pcre32_free(void *);
-PCRE_EXP_DECL void *pcre32_stack_malloc(size_t);
-PCRE_EXP_DECL void  pcre32_stack_free(void *);
-PCRE_EXP_DECL int   pcre32_callout(pcre32_callout_block *);
-PCRE_EXP_DECL int   pcre32_stack_guard(void);
-#endif  /* VPCOMPAT */
-
-/* User defined callback which provides a stack just before the match starts. */
-
-typedef pcre_jit_stack *(*pcre_jit_callback)(void *);
-typedef pcre16_jit_stack *(*pcre16_jit_callback)(void *);
-typedef pcre32_jit_stack *(*pcre32_jit_callback)(void *);
-
-/* Exported PCRE functions */
-
-PCRE_EXP_DECL pcre *pcre_compile(const char *, int, const char **, int *,
-                  const unsigned char *);
-PCRE_EXP_DECL pcre16 *pcre16_compile(PCRE_SPTR16, int, const char **, int *,
-                  const unsigned char *);
-PCRE_EXP_DECL pcre32 *pcre32_compile(PCRE_SPTR32, int, const char **, int *,
-                  const unsigned char *);
-PCRE_EXP_DECL pcre *pcre_compile2(const char *, int, int *, const char **,
-                  int *, const unsigned char *);
-PCRE_EXP_DECL pcre16 *pcre16_compile2(PCRE_SPTR16, int, int *, const char **,
-                  int *, const unsigned char *);
-PCRE_EXP_DECL pcre32 *pcre32_compile2(PCRE_SPTR32, int, int *, const char **,
-                  int *, const unsigned char *);
-PCRE_EXP_DECL int  pcre_config(int, void *);
-PCRE_EXP_DECL int  pcre16_config(int, void *);
-PCRE_EXP_DECL int  pcre32_config(int, void *);
-PCRE_EXP_DECL int  pcre_copy_named_substring(const pcre *, const char *,
-                  int *, int, const char *, char *, int);
-PCRE_EXP_DECL int  pcre16_copy_named_substring(const pcre16 *, PCRE_SPTR16,
-                  int *, int, PCRE_SPTR16, PCRE_UCHAR16 *, int);
-PCRE_EXP_DECL int  pcre32_copy_named_substring(const pcre32 *, PCRE_SPTR32,
-                  int *, int, PCRE_SPTR32, PCRE_UCHAR32 *, int);
-PCRE_EXP_DECL int  pcre_copy_substring(const char *, int *, int, int,
-                  char *, int);
-PCRE_EXP_DECL int  pcre16_copy_substring(PCRE_SPTR16, int *, int, int,
-                  PCRE_UCHAR16 *, int);
-PCRE_EXP_DECL int  pcre32_copy_substring(PCRE_SPTR32, int *, int, int,
-                  PCRE_UCHAR32 *, int);
-PCRE_EXP_DECL int  pcre_dfa_exec(const pcre *, const pcre_extra *,
-                  const char *, int, int, int, int *, int , int *, int);
-PCRE_EXP_DECL int  pcre16_dfa_exec(const pcre16 *, const pcre16_extra *,
-                  PCRE_SPTR16, int, int, int, int *, int , int *, int);
-PCRE_EXP_DECL int  pcre32_dfa_exec(const pcre32 *, const pcre32_extra *,
-                  PCRE_SPTR32, int, int, int, int *, int , int *, int);
-PCRE_EXP_DECL int  pcre_exec(const pcre *, const pcre_extra *, PCRE_SPTR,
-                   int, int, int, int *, int);
-PCRE_EXP_DECL int  pcre16_exec(const pcre16 *, const pcre16_extra *,
-                   PCRE_SPTR16, int, int, int, int *, int);
-PCRE_EXP_DECL int  pcre32_exec(const pcre32 *, const pcre32_extra *,
-                   PCRE_SPTR32, int, int, int, int *, int);
-PCRE_EXP_DECL int  pcre_jit_exec(const pcre *, const pcre_extra *,
-                   PCRE_SPTR, int, int, int, int *, int,
-                   pcre_jit_stack *);
-PCRE_EXP_DECL int  pcre16_jit_exec(const pcre16 *, const pcre16_extra *,
-                   PCRE_SPTR16, int, int, int, int *, int,
-                   pcre16_jit_stack *);
-PCRE_EXP_DECL int  pcre32_jit_exec(const pcre32 *, const pcre32_extra *,
-                   PCRE_SPTR32, int, int, int, int *, int,
-                   pcre32_jit_stack *);
-PCRE_EXP_DECL void pcre_free_substring(const char *);
-PCRE_EXP_DECL void pcre16_free_substring(PCRE_SPTR16);
-PCRE_EXP_DECL void pcre32_free_substring(PCRE_SPTR32);
-PCRE_EXP_DECL void pcre_free_substring_list(const char **);
-PCRE_EXP_DECL void pcre16_free_substring_list(PCRE_SPTR16 *);
-PCRE_EXP_DECL void pcre32_free_substring_list(PCRE_SPTR32 *);
-PCRE_EXP_DECL int  pcre_fullinfo(const pcre *, const pcre_extra *, int,
-                  void *);
-PCRE_EXP_DECL int  pcre16_fullinfo(const pcre16 *, const pcre16_extra *, int,
-                  void *);
-PCRE_EXP_DECL int  pcre32_fullinfo(const pcre32 *, const pcre32_extra *, int,
-                  void *);
-PCRE_EXP_DECL int  pcre_get_named_substring(const pcre *, const char *,
-                  int *, int, const char *, const char **);
-PCRE_EXP_DECL int  pcre16_get_named_substring(const pcre16 *, PCRE_SPTR16,
-                  int *, int, PCRE_SPTR16, PCRE_SPTR16 *);
-PCRE_EXP_DECL int  pcre32_get_named_substring(const pcre32 *, PCRE_SPTR32,
-                  int *, int, PCRE_SPTR32, PCRE_SPTR32 *);
-PCRE_EXP_DECL int  pcre_get_stringnumber(const pcre *, const char *);
-PCRE_EXP_DECL int  pcre16_get_stringnumber(const pcre16 *, PCRE_SPTR16);
-PCRE_EXP_DECL int  pcre32_get_stringnumber(const pcre32 *, PCRE_SPTR32);
-PCRE_EXP_DECL int  pcre_get_stringtable_entries(const pcre *, const char *,
-                  char **, char **);
-PCRE_EXP_DECL int  pcre16_get_stringtable_entries(const pcre16 *, PCRE_SPTR16,
-                  PCRE_UCHAR16 **, PCRE_UCHAR16 **);
-PCRE_EXP_DECL int  pcre32_get_stringtable_entries(const pcre32 *, PCRE_SPTR32,
-                  PCRE_UCHAR32 **, PCRE_UCHAR32 **);
-PCRE_EXP_DECL int  pcre_get_substring(const char *, int *, int, int,
-                  const char **);
-PCRE_EXP_DECL int  pcre16_get_substring(PCRE_SPTR16, int *, int, int,
-                  PCRE_SPTR16 *);
-PCRE_EXP_DECL int  pcre32_get_substring(PCRE_SPTR32, int *, int, int,
-                  PCRE_SPTR32 *);
-PCRE_EXP_DECL int  pcre_get_substring_list(const char *, int *, int,
-                  const char ***);
-PCRE_EXP_DECL int  pcre16_get_substring_list(PCRE_SPTR16, int *, int,
-                  PCRE_SPTR16 **);
-PCRE_EXP_DECL int  pcre32_get_substring_list(PCRE_SPTR32, int *, int,
-                  PCRE_SPTR32 **);
-PCRE_EXP_DECL const unsigned char *pcre_maketables(void);
-PCRE_EXP_DECL const unsigned char *pcre16_maketables(void);
-PCRE_EXP_DECL const unsigned char *pcre32_maketables(void);
-PCRE_EXP_DECL int  pcre_refcount(pcre *, int);
-PCRE_EXP_DECL int  pcre16_refcount(pcre16 *, int);
-PCRE_EXP_DECL int  pcre32_refcount(pcre32 *, int);
-PCRE_EXP_DECL pcre_extra *pcre_study(const pcre *, int, const char **);
-PCRE_EXP_DECL pcre16_extra *pcre16_study(const pcre16 *, int, const char **);
-PCRE_EXP_DECL pcre32_extra *pcre32_study(const pcre32 *, int, const char **);
-PCRE_EXP_DECL void pcre_free_study(pcre_extra *);
-PCRE_EXP_DECL void pcre16_free_study(pcre16_extra *);
-PCRE_EXP_DECL void pcre32_free_study(pcre32_extra *);
-PCRE_EXP_DECL const char *pcre_version(void);
-PCRE_EXP_DECL const char *pcre16_version(void);
-PCRE_EXP_DECL const char *pcre32_version(void);
-
-/* Utility functions for byte order swaps. */
-PCRE_EXP_DECL int  pcre_pattern_to_host_byte_order(pcre *, pcre_extra *,
-                  const unsigned char *);
-PCRE_EXP_DECL int  pcre16_pattern_to_host_byte_order(pcre16 *, pcre16_extra *,
-                  const unsigned char *);
-PCRE_EXP_DECL int  pcre32_pattern_to_host_byte_order(pcre32 *, pcre32_extra *,
-                  const unsigned char *);
-PCRE_EXP_DECL int  pcre16_utf16_to_host_byte_order(PCRE_UCHAR16 *,
-                  PCRE_SPTR16, int, int *, int);
-PCRE_EXP_DECL int  pcre32_utf32_to_host_byte_order(PCRE_UCHAR32 *,
-                  PCRE_SPTR32, int, int *, int);
-
-/* JIT compiler related functions. */
-
-PCRE_EXP_DECL pcre_jit_stack *pcre_jit_stack_alloc(int, int);
-PCRE_EXP_DECL pcre16_jit_stack *pcre16_jit_stack_alloc(int, int);
-PCRE_EXP_DECL pcre32_jit_stack *pcre32_jit_stack_alloc(int, int);
-PCRE_EXP_DECL void pcre_jit_stack_free(pcre_jit_stack *);
-PCRE_EXP_DECL void pcre16_jit_stack_free(pcre16_jit_stack *);
-PCRE_EXP_DECL void pcre32_jit_stack_free(pcre32_jit_stack *);
-PCRE_EXP_DECL void pcre_assign_jit_stack(pcre_extra *,
-                  pcre_jit_callback, void *);
-PCRE_EXP_DECL void pcre16_assign_jit_stack(pcre16_extra *,
-                  pcre16_jit_callback, void *);
-PCRE_EXP_DECL void pcre32_assign_jit_stack(pcre32_extra *,
-                  pcre32_jit_callback, void *);
-PCRE_EXP_DECL void pcre_jit_free_unused_memory(void);
-PCRE_EXP_DECL void pcre16_jit_free_unused_memory(void);
-PCRE_EXP_DECL void pcre32_jit_free_unused_memory(void);
-
-#ifdef __cplusplus
-}  /* extern "C" */
-#endif
-
-#endif /* End of pcre.h */
diff --git a/dist/pcre.h.in b/dist/pcre.h.in
deleted file mode 100644
index 667a45e..0000000
--- a/dist/pcre.h.in
+++ /dev/null
@@ -1,677 +0,0 @@
-/*************************************************
-*       Perl-Compatible Regular Expressions      *
-*************************************************/
-
-/* This is the public header file for the PCRE library, to be #included by
-applications that call the PCRE functions.
-
-           Copyright (c) 1997-2014 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 current PCRE version information. */
-
-#define PCRE_MAJOR          @PCRE_MAJOR@
-#define PCRE_MINOR          @PCRE_MINOR@
-#define PCRE_PRERELEASE     @PCRE_PRERELEASE@
-#define PCRE_DATE           @PCRE_DATE@
-
-/* When an application links to a PCRE DLL in Windows, the symbols that are
-imported have to be identified as such. When building PCRE, the appropriate
-export setting is defined in pcre_internal.h, which includes this file. So we
-don't change existing definitions of PCRE_EXP_DECL and PCRECPP_EXP_DECL. */
-
-#if defined(_WIN32) && !defined(PCRE_STATIC)
-#  ifndef PCRE_EXP_DECL
-#    define PCRE_EXP_DECL  extern __declspec(dllimport)
-#  endif
-#  ifdef __cplusplus
-#    ifndef PCRECPP_EXP_DECL
-#      define PCRECPP_EXP_DECL  extern __declspec(dllimport)
-#    endif
-#    ifndef PCRECPP_EXP_DEFN
-#      define PCRECPP_EXP_DEFN  __declspec(dllimport)
-#    endif
-#  endif
-#endif
-
-/* By default, we use the standard "extern" declarations. */
-
-#ifndef PCRE_EXP_DECL
-#  ifdef __cplusplus
-#    define PCRE_EXP_DECL  extern "C"
-#  else
-#    define PCRE_EXP_DECL  extern
-#  endif
-#endif
-
-#ifdef __cplusplus
-#  ifndef PCRECPP_EXP_DECL
-#    define PCRECPP_EXP_DECL  extern
-#  endif
-#  ifndef PCRECPP_EXP_DEFN
-#    define PCRECPP_EXP_DEFN
-#  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
-
-/* Public options. Some are compile-time only, some are run-time only, and some
-are both. Most of the compile-time options are saved with the compiled regex so
-that they can be inspected during studying (and therefore JIT compiling). Note
-that pcre_study() has its own set of options. Originally, all the options
-defined here used distinct bits. However, almost all the bits in a 32-bit word
-are now used, so in order to conserve them, option bits that were previously
-only recognized at matching time (i.e. by pcre_exec() or pcre_dfa_exec()) may
-also be used for compile-time options that affect only compiling and are not
-relevant for studying or JIT compiling.
-
-Some options for pcre_compile() change its behaviour but do not affect the
-behaviour of the execution functions. Other options are passed through to the
-execution functions and affect their behaviour, with or without affecting the
-behaviour of pcre_compile().
-
-Options that can be passed to pcre_compile() are tagged Cx below, with these
-variants:
-
-C1   Affects compile only
-C2   Does not affect compile; affects exec, dfa_exec
-C3   Affects compile, exec, dfa_exec
-C4   Affects compile, exec, dfa_exec, study
-C5   Affects compile, exec, study
-
-Options that can be set for pcre_exec() and/or pcre_dfa_exec() are flagged with
-E and D, respectively. They take precedence over C3, C4, and C5 settings passed
-from pcre_compile(). Those that are compatible with JIT execution are flagged
-with J. */
-
-#define PCRE_CASELESS           0x00000001  /* C1       */
-#define PCRE_MULTILINE          0x00000002  /* C1       */
-#define PCRE_DOTALL             0x00000004  /* C1       */
-#define PCRE_EXTENDED           0x00000008  /* C1       */
-#define PCRE_ANCHORED           0x00000010  /* C4 E D   */
-#define PCRE_DOLLAR_ENDONLY     0x00000020  /* C2       */
-#define PCRE_EXTRA              0x00000040  /* C1       */
-#define PCRE_NOTBOL             0x00000080  /*    E D J */
-#define PCRE_NOTEOL             0x00000100  /*    E D J */
-#define PCRE_UNGREEDY           0x00000200  /* C1       */
-#define PCRE_NOTEMPTY           0x00000400  /*    E D J */
-#define PCRE_UTF8               0x00000800  /* C4        )          */
-#define PCRE_UTF16              0x00000800  /* C4        ) Synonyms */
-#define PCRE_UTF32              0x00000800  /* C4        )          */
-#define PCRE_NO_AUTO_CAPTURE    0x00001000  /* C1       */
-#define PCRE_NO_UTF8_CHECK      0x00002000  /* C1 E D J  )          */
-#define PCRE_NO_UTF16_CHECK     0x00002000  /* C1 E D J  ) Synonyms */
-#define PCRE_NO_UTF32_CHECK     0x00002000  /* C1 E D J  )          */
-#define PCRE_AUTO_CALLOUT       0x00004000  /* C1       */
-#define PCRE_PARTIAL_SOFT       0x00008000  /*    E D J  ) Synonyms */
-#define PCRE_PARTIAL            0x00008000  /*    E D J  )          */
-
-/* This pair use the same bit. */
-#define PCRE_NEVER_UTF          0x00010000  /* C1        ) Overlaid */
-#define PCRE_DFA_SHORTEST       0x00010000  /*      D    ) Overlaid */
-
-/* This pair use the same bit. */
-#define PCRE_NO_AUTO_POSSESS    0x00020000  /* C1        ) Overlaid */
-#define PCRE_DFA_RESTART        0x00020000  /*      D    ) Overlaid */
-
-#define PCRE_FIRSTLINE          0x00040000  /* C3       */
-#define PCRE_DUPNAMES           0x00080000  /* C1       */
-#define PCRE_NEWLINE_CR         0x00100000  /* C3 E D   */
-#define PCRE_NEWLINE_LF         0x00200000  /* C3 E D   */
-#define PCRE_NEWLINE_CRLF       0x00300000  /* C3 E D   */
-#define PCRE_NEWLINE_ANY        0x00400000  /* C3 E D   */
-#define PCRE_NEWLINE_ANYCRLF    0x00500000  /* C3 E D   */
-#define PCRE_BSR_ANYCRLF        0x00800000  /* C3 E D   */
-#define PCRE_BSR_UNICODE        0x01000000  /* C3 E D   */
-#define PCRE_JAVASCRIPT_COMPAT  0x02000000  /* C5       */
-#define PCRE_NO_START_OPTIMIZE  0x04000000  /* C2 E D    ) Synonyms */
-#define PCRE_NO_START_OPTIMISE  0x04000000  /* C2 E D    )          */
-#define PCRE_PARTIAL_HARD       0x08000000  /*    E D J */
-#define PCRE_NOTEMPTY_ATSTART   0x10000000  /*    E D J */
-#define PCRE_UCP                0x20000000  /* C3       */
-
-/* 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_OPCODE   (-5)
-#define PCRE_ERROR_UNKNOWN_NODE     (-5)  /* For backward compatibility */
-#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)  /* Same for 8/16/32 */
-#define PCRE_ERROR_BADUTF16        (-10)  /* Same for 8/16/32 */
-#define PCRE_ERROR_BADUTF32        (-10)  /* Same for 8/16/32 */
-#define PCRE_ERROR_BADUTF8_OFFSET  (-11)  /* Same for 8/16 */
-#define PCRE_ERROR_BADUTF16_OFFSET (-11)  /* Same for 8/16 */
-#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)
-#define PCRE_ERROR_RECURSIONLIMIT  (-21)
-#define PCRE_ERROR_NULLWSLIMIT     (-22)  /* No longer actually used */
-#define PCRE_ERROR_BADNEWLINE      (-23)
-#define PCRE_ERROR_BADOFFSET       (-24)
-#define PCRE_ERROR_SHORTUTF8       (-25)
-#define PCRE_ERROR_SHORTUTF16      (-25)  /* Same for 8/16 */
-#define PCRE_ERROR_RECURSELOOP     (-26)
-#define PCRE_ERROR_JIT_STACKLIMIT  (-27)
-#define PCRE_ERROR_BADMODE         (-28)
-#define PCRE_ERROR_BADENDIANNESS   (-29)
-#define PCRE_ERROR_DFA_BADRESTART  (-30)
-#define PCRE_ERROR_JIT_BADOPTION   (-31)
-#define PCRE_ERROR_BADLENGTH       (-32)
-#define PCRE_ERROR_UNSET           (-33)
-
-/* Specific error codes for UTF-8 validity checks */
-
-#define PCRE_UTF8_ERR0               0
-#define PCRE_UTF8_ERR1               1
-#define PCRE_UTF8_ERR2               2
-#define PCRE_UTF8_ERR3               3
-#define PCRE_UTF8_ERR4               4
-#define PCRE_UTF8_ERR5               5
-#define PCRE_UTF8_ERR6               6
-#define PCRE_UTF8_ERR7               7
-#define PCRE_UTF8_ERR8               8
-#define PCRE_UTF8_ERR9               9
-#define PCRE_UTF8_ERR10             10
-#define PCRE_UTF8_ERR11             11
-#define PCRE_UTF8_ERR12             12
-#define PCRE_UTF8_ERR13             13
-#define PCRE_UTF8_ERR14             14
-#define PCRE_UTF8_ERR15             15
-#define PCRE_UTF8_ERR16             16
-#define PCRE_UTF8_ERR17             17
-#define PCRE_UTF8_ERR18             18
-#define PCRE_UTF8_ERR19             19
-#define PCRE_UTF8_ERR20             20
-#define PCRE_UTF8_ERR21             21
-#define PCRE_UTF8_ERR22             22  /* Unused (was non-character) */
-
-/* Specific error codes for UTF-16 validity checks */
-
-#define PCRE_UTF16_ERR0              0
-#define PCRE_UTF16_ERR1              1
-#define PCRE_UTF16_ERR2              2
-#define PCRE_UTF16_ERR3              3
-#define PCRE_UTF16_ERR4              4  /* Unused (was non-character) */
-
-/* Specific error codes for UTF-32 validity checks */
-
-#define PCRE_UTF32_ERR0              0
-#define PCRE_UTF32_ERR1              1
-#define PCRE_UTF32_ERR2              2  /* Unused (was non-character) */
-#define PCRE_UTF32_ERR3              3
-
-/* 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
-#define PCRE_INFO_OKPARTIAL         12
-#define PCRE_INFO_JCHANGED          13
-#define PCRE_INFO_HASCRORLF         14
-#define PCRE_INFO_MINLENGTH         15
-#define PCRE_INFO_JIT               16
-#define PCRE_INFO_JITSIZE           17
-#define PCRE_INFO_MAXLOOKBEHIND     18
-#define PCRE_INFO_FIRSTCHARACTER    19
-#define PCRE_INFO_FIRSTCHARACTERFLAGS 20
-#define PCRE_INFO_REQUIREDCHAR      21
-#define PCRE_INFO_REQUIREDCHARFLAGS 22
-#define PCRE_INFO_MATCHLIMIT        23
-#define PCRE_INFO_RECURSIONLIMIT    24
-#define PCRE_INFO_MATCH_EMPTY       25
-
-/* Request types for pcre_config(). Do not re-arrange, in order to remain
-compatible. */
-
-#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
-#define PCRE_CONFIG_MATCH_LIMIT_RECURSION   7
-#define PCRE_CONFIG_BSR                     8
-#define PCRE_CONFIG_JIT                     9
-#define PCRE_CONFIG_UTF16                  10
-#define PCRE_CONFIG_JITTARGET              11
-#define PCRE_CONFIG_UTF32                  12
-#define PCRE_CONFIG_PARENS_LIMIT           13
-
-/* Request types for pcre_study(). Do not re-arrange, in order to remain
-compatible. */
-
-#define PCRE_STUDY_JIT_COMPILE                0x0001
-#define PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE   0x0002
-#define PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE   0x0004
-#define PCRE_STUDY_EXTRA_NEEDED               0x0008
-
-/* Bit flags for the pcre[16|32]_extra structure. Do not re-arrange or redefine
-these bits, just add new ones on the end, in order to remain compatible. */
-
-#define PCRE_EXTRA_STUDY_DATA             0x0001
-#define PCRE_EXTRA_MATCH_LIMIT            0x0002
-#define PCRE_EXTRA_CALLOUT_DATA           0x0004
-#define PCRE_EXTRA_TABLES                 0x0008
-#define PCRE_EXTRA_MATCH_LIMIT_RECURSION  0x0010
-#define PCRE_EXTRA_MARK                   0x0020
-#define PCRE_EXTRA_EXECUTABLE_JIT         0x0040
-
-/* Types */
-
-struct real_pcre;                 /* declaration; the definition is private  */
-typedef struct real_pcre pcre;
-
-struct real_pcre16;               /* declaration; the definition is private  */
-typedef struct real_pcre16 pcre16;
-
-struct real_pcre32;               /* declaration; the definition is private  */
-typedef struct real_pcre32 pcre32;
-
-struct real_pcre_jit_stack;       /* declaration; the definition is private  */
-typedef struct real_pcre_jit_stack pcre_jit_stack;
-
-struct real_pcre16_jit_stack;     /* declaration; the definition is private  */
-typedef struct real_pcre16_jit_stack pcre16_jit_stack;
-
-struct real_pcre32_jit_stack;     /* declaration; the definition is private  */
-typedef struct real_pcre32_jit_stack pcre32_jit_stack;
-
-/* If PCRE is compiled with 16 bit character support, PCRE_UCHAR16 must contain
-a 16 bit wide signed data type. Otherwise it can be a dummy data type since
-pcre16 functions are not implemented. There is a check for this in pcre_internal.h. */
-#ifndef PCRE_UCHAR16
-#define PCRE_UCHAR16 unsigned short
-#endif
-
-#ifndef PCRE_SPTR16
-#define PCRE_SPTR16 const PCRE_UCHAR16 *
-#endif
-
-/* If PCRE is compiled with 32 bit character support, PCRE_UCHAR32 must contain
-a 32 bit wide signed data type. Otherwise it can be a dummy data type since
-pcre32 functions are not implemented. There is a check for this in pcre_internal.h. */
-#ifndef PCRE_UCHAR32
-#define PCRE_UCHAR32 unsigned int
-#endif
-
-#ifndef PCRE_SPTR32
-#define PCRE_SPTR32 const PCRE_UCHAR32 *
-#endif
-
-/* When PCRE is compiled as a C++ library, the subject pointer type can be
-replaced with a custom type. For conventional use, the public interface is a
-const char *. */
-
-#ifndef PCRE_SPTR
-#define PCRE_SPTR const char *
-#endif
-
-/* 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 */
-  unsigned long int match_limit_recursion; /* Max recursive calls to match() */
-  unsigned char **mark;           /* For passing back a mark pointer */
-  void *executable_jit;           /* Contains a pointer to a compiled jit code */
-} pcre_extra;
-
-/* Same structure as above, but with 16 bit char pointers. */
-
-typedef struct pcre16_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 */
-  unsigned long int match_limit_recursion; /* Max recursive calls to match() */
-  PCRE_UCHAR16 **mark;            /* For passing back a mark pointer */
-  void *executable_jit;           /* Contains a pointer to a compiled jit code */
-} pcre16_extra;
-
-/* Same structure as above, but with 32 bit char pointers. */
-
-typedef struct pcre32_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 */
-  unsigned long int match_limit_recursion; /* Max recursive calls to match() */
-  PCRE_UCHAR32 **mark;            /* For passing back a mark pointer */
-  void *executable_jit;           /* Contains a pointer to a compiled jit code */
-} pcre32_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 */
-  PCRE_SPTR    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 */
-  /* ------------------- Added for Version 2 -------------------------- */
-  const unsigned char *mark;      /* Pointer to current mark or NULL    */
-  /* ------------------------------------------------------------------ */
-} pcre_callout_block;
-
-/* Same structure as above, but with 16 bit char pointers. */
-
-typedef struct pcre16_callout_block {
-  int          version;           /* Identifies version of block */
-  /* ------------------------ Version 0 ------------------------------- */
-  int          callout_number;    /* Number compiled into pattern */
-  int         *offset_vector;     /* The offset vector */
-  PCRE_SPTR16  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 */
-  /* ------------------- Added for Version 2 -------------------------- */
-  const PCRE_UCHAR16 *mark;       /* Pointer to current mark or NULL    */
-  /* ------------------------------------------------------------------ */
-} pcre16_callout_block;
-
-/* Same structure as above, but with 32 bit char pointers. */
-
-typedef struct pcre32_callout_block {
-  int          version;           /* Identifies version of block */
-  /* ------------------------ Version 0 ------------------------------- */
-  int          callout_number;    /* Number compiled into pattern */
-  int         *offset_vector;     /* The offset vector */
-  PCRE_SPTR32  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 */
-  /* ------------------- Added for Version 2 -------------------------- */
-  const PCRE_UCHAR32 *mark;       /* Pointer to current mark or NULL    */
-  /* ------------------------------------------------------------------ */
-} pcre32_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_EXP_DECL void *(*pcre_malloc)(size_t);
-PCRE_EXP_DECL void  (*pcre_free)(void *);
-PCRE_EXP_DECL void *(*pcre_stack_malloc)(size_t);
-PCRE_EXP_DECL void  (*pcre_stack_free)(void *);
-PCRE_EXP_DECL int   (*pcre_callout)(pcre_callout_block *);
-PCRE_EXP_DECL int   (*pcre_stack_guard)(void);
-
-PCRE_EXP_DECL void *(*pcre16_malloc)(size_t);
-PCRE_EXP_DECL void  (*pcre16_free)(void *);
-PCRE_EXP_DECL void *(*pcre16_stack_malloc)(size_t);
-PCRE_EXP_DECL void  (*pcre16_stack_free)(void *);
-PCRE_EXP_DECL int   (*pcre16_callout)(pcre16_callout_block *);
-PCRE_EXP_DECL int   (*pcre16_stack_guard)(void);
-
-PCRE_EXP_DECL void *(*pcre32_malloc)(size_t);
-PCRE_EXP_DECL void  (*pcre32_free)(void *);
-PCRE_EXP_DECL void *(*pcre32_stack_malloc)(size_t);
-PCRE_EXP_DECL void  (*pcre32_stack_free)(void *);
-PCRE_EXP_DECL int   (*pcre32_callout)(pcre32_callout_block *);
-PCRE_EXP_DECL int   (*pcre32_stack_guard)(void);
-#else   /* VPCOMPAT */
-PCRE_EXP_DECL void *pcre_malloc(size_t);
-PCRE_EXP_DECL void  pcre_free(void *);
-PCRE_EXP_DECL void *pcre_stack_malloc(size_t);
-PCRE_EXP_DECL void  pcre_stack_free(void *);
-PCRE_EXP_DECL int   pcre_callout(pcre_callout_block *);
-PCRE_EXP_DECL int   pcre_stack_guard(void);
-
-PCRE_EXP_DECL void *pcre16_malloc(size_t);
-PCRE_EXP_DECL void  pcre16_free(void *);
-PCRE_EXP_DECL void *pcre16_stack_malloc(size_t);
-PCRE_EXP_DECL void  pcre16_stack_free(void *);
-PCRE_EXP_DECL int   pcre16_callout(pcre16_callout_block *);
-PCRE_EXP_DECL int   pcre16_stack_guard(void);
-
-PCRE_EXP_DECL void *pcre32_malloc(size_t);
-PCRE_EXP_DECL void  pcre32_free(void *);
-PCRE_EXP_DECL void *pcre32_stack_malloc(size_t);
-PCRE_EXP_DECL void  pcre32_stack_free(void *);
-PCRE_EXP_DECL int   pcre32_callout(pcre32_callout_block *);
-PCRE_EXP_DECL int   pcre32_stack_guard(void);
-#endif  /* VPCOMPAT */
-
-/* User defined callback which provides a stack just before the match starts. */
-
-typedef pcre_jit_stack *(*pcre_jit_callback)(void *);
-typedef pcre16_jit_stack *(*pcre16_jit_callback)(void *);
-typedef pcre32_jit_stack *(*pcre32_jit_callback)(void *);
-
-/* Exported PCRE functions */
-
-PCRE_EXP_DECL pcre *pcre_compile(const char *, int, const char **, int *,
-                  const unsigned char *);
-PCRE_EXP_DECL pcre16 *pcre16_compile(PCRE_SPTR16, int, const char **, int *,
-                  const unsigned char *);
-PCRE_EXP_DECL pcre32 *pcre32_compile(PCRE_SPTR32, int, const char **, int *,
-                  const unsigned char *);
-PCRE_EXP_DECL pcre *pcre_compile2(const char *, int, int *, const char **,
-                  int *, const unsigned char *);
-PCRE_EXP_DECL pcre16 *pcre16_compile2(PCRE_SPTR16, int, int *, const char **,
-                  int *, const unsigned char *);
-PCRE_EXP_DECL pcre32 *pcre32_compile2(PCRE_SPTR32, int, int *, const char **,
-                  int *, const unsigned char *);
-PCRE_EXP_DECL int  pcre_config(int, void *);
-PCRE_EXP_DECL int  pcre16_config(int, void *);
-PCRE_EXP_DECL int  pcre32_config(int, void *);
-PCRE_EXP_DECL int  pcre_copy_named_substring(const pcre *, const char *,
-                  int *, int, const char *, char *, int);
-PCRE_EXP_DECL int  pcre16_copy_named_substring(const pcre16 *, PCRE_SPTR16,
-                  int *, int, PCRE_SPTR16, PCRE_UCHAR16 *, int);
-PCRE_EXP_DECL int  pcre32_copy_named_substring(const pcre32 *, PCRE_SPTR32,
-                  int *, int, PCRE_SPTR32, PCRE_UCHAR32 *, int);
-PCRE_EXP_DECL int  pcre_copy_substring(const char *, int *, int, int,
-                  char *, int);
-PCRE_EXP_DECL int  pcre16_copy_substring(PCRE_SPTR16, int *, int, int,
-                  PCRE_UCHAR16 *, int);
-PCRE_EXP_DECL int  pcre32_copy_substring(PCRE_SPTR32, int *, int, int,
-                  PCRE_UCHAR32 *, int);
-PCRE_EXP_DECL int  pcre_dfa_exec(const pcre *, const pcre_extra *,
-                  const char *, int, int, int, int *, int , int *, int);
-PCRE_EXP_DECL int  pcre16_dfa_exec(const pcre16 *, const pcre16_extra *,
-                  PCRE_SPTR16, int, int, int, int *, int , int *, int);
-PCRE_EXP_DECL int  pcre32_dfa_exec(const pcre32 *, const pcre32_extra *,
-                  PCRE_SPTR32, int, int, int, int *, int , int *, int);
-PCRE_EXP_DECL int  pcre_exec(const pcre *, const pcre_extra *, PCRE_SPTR,
-                   int, int, int, int *, int);
-PCRE_EXP_DECL int  pcre16_exec(const pcre16 *, const pcre16_extra *,
-                   PCRE_SPTR16, int, int, int, int *, int);
-PCRE_EXP_DECL int  pcre32_exec(const pcre32 *, const pcre32_extra *,
-                   PCRE_SPTR32, int, int, int, int *, int);
-PCRE_EXP_DECL int  pcre_jit_exec(const pcre *, const pcre_extra *,
-                   PCRE_SPTR, int, int, int, int *, int,
-                   pcre_jit_stack *);
-PCRE_EXP_DECL int  pcre16_jit_exec(const pcre16 *, const pcre16_extra *,
-                   PCRE_SPTR16, int, int, int, int *, int,
-                   pcre16_jit_stack *);
-PCRE_EXP_DECL int  pcre32_jit_exec(const pcre32 *, const pcre32_extra *,
-                   PCRE_SPTR32, int, int, int, int *, int,
-                   pcre32_jit_stack *);
-PCRE_EXP_DECL void pcre_free_substring(const char *);
-PCRE_EXP_DECL void pcre16_free_substring(PCRE_SPTR16);
-PCRE_EXP_DECL void pcre32_free_substring(PCRE_SPTR32);
-PCRE_EXP_DECL void pcre_free_substring_list(const char **);
-PCRE_EXP_DECL void pcre16_free_substring_list(PCRE_SPTR16 *);
-PCRE_EXP_DECL void pcre32_free_substring_list(PCRE_SPTR32 *);
-PCRE_EXP_DECL int  pcre_fullinfo(const pcre *, const pcre_extra *, int,
-                  void *);
-PCRE_EXP_DECL int  pcre16_fullinfo(const pcre16 *, const pcre16_extra *, int,
-                  void *);
-PCRE_EXP_DECL int  pcre32_fullinfo(const pcre32 *, const pcre32_extra *, int,
-                  void *);
-PCRE_EXP_DECL int  pcre_get_named_substring(const pcre *, const char *,
-                  int *, int, const char *, const char **);
-PCRE_EXP_DECL int  pcre16_get_named_substring(const pcre16 *, PCRE_SPTR16,
-                  int *, int, PCRE_SPTR16, PCRE_SPTR16 *);
-PCRE_EXP_DECL int  pcre32_get_named_substring(const pcre32 *, PCRE_SPTR32,
-                  int *, int, PCRE_SPTR32, PCRE_SPTR32 *);
-PCRE_EXP_DECL int  pcre_get_stringnumber(const pcre *, const char *);
-PCRE_EXP_DECL int  pcre16_get_stringnumber(const pcre16 *, PCRE_SPTR16);
-PCRE_EXP_DECL int  pcre32_get_stringnumber(const pcre32 *, PCRE_SPTR32);
-PCRE_EXP_DECL int  pcre_get_stringtable_entries(const pcre *, const char *,
-                  char **, char **);
-PCRE_EXP_DECL int  pcre16_get_stringtable_entries(const pcre16 *, PCRE_SPTR16,
-                  PCRE_UCHAR16 **, PCRE_UCHAR16 **);
-PCRE_EXP_DECL int  pcre32_get_stringtable_entries(const pcre32 *, PCRE_SPTR32,
-                  PCRE_UCHAR32 **, PCRE_UCHAR32 **);
-PCRE_EXP_DECL int  pcre_get_substring(const char *, int *, int, int,
-                  const char **);
-PCRE_EXP_DECL int  pcre16_get_substring(PCRE_SPTR16, int *, int, int,
-                  PCRE_SPTR16 *);
-PCRE_EXP_DECL int  pcre32_get_substring(PCRE_SPTR32, int *, int, int,
-                  PCRE_SPTR32 *);
-PCRE_EXP_DECL int  pcre_get_substring_list(const char *, int *, int,
-                  const char ***);
-PCRE_EXP_DECL int  pcre16_get_substring_list(PCRE_SPTR16, int *, int,
-                  PCRE_SPTR16 **);
-PCRE_EXP_DECL int  pcre32_get_substring_list(PCRE_SPTR32, int *, int,
-                  PCRE_SPTR32 **);
-PCRE_EXP_DECL const unsigned char *pcre_maketables(void);
-PCRE_EXP_DECL const unsigned char *pcre16_maketables(void);
-PCRE_EXP_DECL const unsigned char *pcre32_maketables(void);
-PCRE_EXP_DECL int  pcre_refcount(pcre *, int);
-PCRE_EXP_DECL int  pcre16_refcount(pcre16 *, int);
-PCRE_EXP_DECL int  pcre32_refcount(pcre32 *, int);
-PCRE_EXP_DECL pcre_extra *pcre_study(const pcre *, int, const char **);
-PCRE_EXP_DECL pcre16_extra *pcre16_study(const pcre16 *, int, const char **);
-PCRE_EXP_DECL pcre32_extra *pcre32_study(const pcre32 *, int, const char **);
-PCRE_EXP_DECL void pcre_free_study(pcre_extra *);
-PCRE_EXP_DECL void pcre16_free_study(pcre16_extra *);
-PCRE_EXP_DECL void pcre32_free_study(pcre32_extra *);
-PCRE_EXP_DECL const char *pcre_version(void);
-PCRE_EXP_DECL const char *pcre16_version(void);
-PCRE_EXP_DECL const char *pcre32_version(void);
-
-/* Utility functions for byte order swaps. */
-PCRE_EXP_DECL int  pcre_pattern_to_host_byte_order(pcre *, pcre_extra *,
-                  const unsigned char *);
-PCRE_EXP_DECL int  pcre16_pattern_to_host_byte_order(pcre16 *, pcre16_extra *,
-                  const unsigned char *);
-PCRE_EXP_DECL int  pcre32_pattern_to_host_byte_order(pcre32 *, pcre32_extra *,
-                  const unsigned char *);
-PCRE_EXP_DECL int  pcre16_utf16_to_host_byte_order(PCRE_UCHAR16 *,
-                  PCRE_SPTR16, int, int *, int);
-PCRE_EXP_DECL int  pcre32_utf32_to_host_byte_order(PCRE_UCHAR32 *,
-                  PCRE_SPTR32, int, int *, int);
-
-/* JIT compiler related functions. */
-
-PCRE_EXP_DECL pcre_jit_stack *pcre_jit_stack_alloc(int, int);
-PCRE_EXP_DECL pcre16_jit_stack *pcre16_jit_stack_alloc(int, int);
-PCRE_EXP_DECL pcre32_jit_stack *pcre32_jit_stack_alloc(int, int);
-PCRE_EXP_DECL void pcre_jit_stack_free(pcre_jit_stack *);
-PCRE_EXP_DECL void pcre16_jit_stack_free(pcre16_jit_stack *);
-PCRE_EXP_DECL void pcre32_jit_stack_free(pcre32_jit_stack *);
-PCRE_EXP_DECL void pcre_assign_jit_stack(pcre_extra *,
-                  pcre_jit_callback, void *);
-PCRE_EXP_DECL void pcre16_assign_jit_stack(pcre16_extra *,
-                  pcre16_jit_callback, void *);
-PCRE_EXP_DECL void pcre32_assign_jit_stack(pcre32_extra *,
-                  pcre32_jit_callback, void *);
-PCRE_EXP_DECL void pcre_jit_free_unused_memory(void);
-PCRE_EXP_DECL void pcre16_jit_free_unused_memory(void);
-PCRE_EXP_DECL void pcre32_jit_free_unused_memory(void);
-
-#ifdef __cplusplus
-}  /* extern "C" */
-#endif
-
-#endif /* End of pcre.h */
diff --git a/dist/pcre16_byte_order.c b/dist/pcre16_byte_order.c
deleted file mode 100644
index 11d2973..0000000
--- a/dist/pcre16_byte_order.c
+++ /dev/null
@@ -1,45 +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
-           Copyright (c) 1997-2012 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.
------------------------------------------------------------------------------
-*/
-
-/* Generate code with 16 bit character support. */
-#define COMPILE_PCRE16
-
-#include "pcre_byte_order.c"
-
-/* End of pcre16_byte_order.c */
diff --git a/dist/pcre16_chartables.c b/dist/pcre16_chartables.c
deleted file mode 100644
index 7c0ff35..0000000
--- a/dist/pcre16_chartables.c
+++ /dev/null
@@ -1,45 +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
-           Copyright (c) 1997-2012 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.
------------------------------------------------------------------------------
-*/
-
-/* Generate code with 16 bit character support. */
-#define COMPILE_PCRE16
-
-#include "pcre_chartables.c"
-
-/* End of pcre16_chartables.c */
diff --git a/dist/pcre16_compile.c b/dist/pcre16_compile.c
deleted file mode 100644
index e499b67..0000000
--- a/dist/pcre16_compile.c
+++ /dev/null
@@ -1,45 +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
-           Copyright (c) 1997-2012 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.
------------------------------------------------------------------------------
-*/
-
-/* Generate code with 16 bit character support. */
-#define COMPILE_PCRE16
-
-#include "pcre_compile.c"
-
-/* End of pcre16_compile.c */
diff --git a/dist/pcre16_config.c b/dist/pcre16_config.c
deleted file mode 100644
index b521387..0000000
--- a/dist/pcre16_config.c
+++ /dev/null
@@ -1,45 +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
-           Copyright (c) 1997-2012 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.
------------------------------------------------------------------------------
-*/
-
-/* Generate code with 16 bit character support. */
-#define COMPILE_PCRE16
-
-#include "pcre_config.c"
-
-/* End of pcre16_config.c */
diff --git a/dist/pcre16_dfa_exec.c b/dist/pcre16_dfa_exec.c
deleted file mode 100644
index 2ba740e..0000000
--- a/dist/pcre16_dfa_exec.c
+++ /dev/null
@@ -1,45 +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
-           Copyright (c) 1997-2012 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.
------------------------------------------------------------------------------
-*/
-
-/* Generate code with 16 bit character support. */
-#define COMPILE_PCRE16
-
-#include "pcre_dfa_exec.c"
-
-/* End of pcre16_dfa_exec.c */
diff --git a/dist/pcre16_exec.c b/dist/pcre16_exec.c
deleted file mode 100644
index 7417b17..0000000
--- a/dist/pcre16_exec.c
+++ /dev/null
@@ -1,45 +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
-           Copyright (c) 1997-2012 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.
------------------------------------------------------------------------------
-*/
-
-/* Generate code with 16 bit character support. */
-#define COMPILE_PCRE16
-
-#include "pcre_exec.c"
-
-/* End of pcre16_exec.c */
diff --git a/dist/pcre16_fullinfo.c b/dist/pcre16_fullinfo.c
deleted file mode 100644
index 544dca6..0000000
--- a/dist/pcre16_fullinfo.c
+++ /dev/null
@@ -1,45 +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
-           Copyright (c) 1997-2012 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.
------------------------------------------------------------------------------
-*/
-
-/* Generate code with 16 bit character support. */
-#define COMPILE_PCRE16
-
-#include "pcre_fullinfo.c"
-
-/* End of pcre16_fullinfo.c */
diff --git a/dist/pcre16_get.c b/dist/pcre16_get.c
deleted file mode 100644
index 3ded08c..0000000
--- a/dist/pcre16_get.c
+++ /dev/null
@@ -1,45 +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
-           Copyright (c) 1997-2012 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.
------------------------------------------------------------------------------
-*/
-
-/* Generate code with 16 bit character support. */
-#define COMPILE_PCRE16
-
-#include "pcre_get.c"
-
-/* End of pcre16_get.c */
diff --git a/dist/pcre16_globals.c b/dist/pcre16_globals.c
deleted file mode 100644
index a136b3d..0000000
--- a/dist/pcre16_globals.c
+++ /dev/null
@@ -1,45 +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
-           Copyright (c) 1997-2012 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.
------------------------------------------------------------------------------
-*/
-
-/* Generate code with 16 bit character support. */
-#define COMPILE_PCRE16
-
-#include "pcre_globals.c"
-
-/* End of pcre16_globals.c */
diff --git a/dist/pcre16_jit_compile.c b/dist/pcre16_jit_compile.c
deleted file mode 100644
index ab0cacd..0000000
--- a/dist/pcre16_jit_compile.c
+++ /dev/null
@@ -1,45 +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
-           Copyright (c) 1997-2012 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.
------------------------------------------------------------------------------
-*/
-
-/* Generate code with 16 bit character support. */
-#define COMPILE_PCRE16
-
-#include "pcre_jit_compile.c"
-
-/* End of pcre16_jit_compile.c */
diff --git a/dist/pcre16_maketables.c b/dist/pcre16_maketables.c
deleted file mode 100644
index b1cd1c5..0000000
--- a/dist/pcre16_maketables.c
+++ /dev/null
@@ -1,45 +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
-           Copyright (c) 1997-2012 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.
------------------------------------------------------------------------------
-*/
-
-/* Generate code with 16 bit character support. */
-#define COMPILE_PCRE16
-
-#include "pcre_maketables.c"
-
-/* End of pcre16_maketables.c */
diff --git a/dist/pcre16_newline.c b/dist/pcre16_newline.c
deleted file mode 100644
index 7fe2014..0000000
--- a/dist/pcre16_newline.c
+++ /dev/null
@@ -1,45 +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
-           Copyright (c) 1997-2012 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.
------------------------------------------------------------------------------
-*/
-
-/* Generate code with 16 bit character support. */
-#define COMPILE_PCRE16
-
-#include "pcre_newline.c"
-
-/* End of pcre16_newline.c */
diff --git a/dist/pcre16_ord2utf16.c b/dist/pcre16_ord2utf16.c
deleted file mode 100644
index 8e2ce5e..0000000
--- a/dist/pcre16_ord2utf16.c
+++ /dev/null
@@ -1,90 +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
-           Copyright (c) 1997-2012 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 UTF16 string. */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-/* Generate code with 16 bit character support. */
-#define COMPILE_PCRE16
-
-#include "pcre_internal.h"
-
-/*************************************************
-*       Convert character value to UTF-16         *
-*************************************************/
-
-/* This function takes an integer value in the range 0 - 0x10ffff
-and encodes it as a UTF-16 character in 1 to 2 pcre_uchars.
-
-Arguments:
-  cvalue     the character value
-  buffer     pointer to buffer for result - at least 2 pcre_uchars long
-
-Returns:     number of characters placed in the buffer
-*/
-
-unsigned int
-PRIV(ord2utf)(pcre_uint32 cvalue, pcre_uchar *buffer)
-{
-#ifdef SUPPORT_UTF
-
-if (cvalue <= 0xffff)
-  {
-  *buffer = (pcre_uchar)cvalue;
-  return 1;
-  }
-
-cvalue -= 0x10000;
-*buffer++ = 0xd800 | (cvalue >> 10);
-*buffer = 0xdc00 | (cvalue & 0x3ff);
-return 2;
-
-#else /* SUPPORT_UTF */
-(void)(cvalue);  /* Keep compiler happy; this function won't ever be */
-(void)(buffer);  /* called when SUPPORT_UTF is not defined. */
-return 0;
-#endif /* SUPPORT_UTF */
-}
-
-/* End of pcre16_ord2utf16.c */
diff --git a/dist/pcre16_printint.c b/dist/pcre16_printint.c
deleted file mode 100644
index 33d8c34..0000000
--- a/dist/pcre16_printint.c
+++ /dev/null
@@ -1,45 +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
-           Copyright (c) 1997-2012 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.
------------------------------------------------------------------------------
-*/
-
-/* Generate code with 16 bit character support. */
-#define COMPILE_PCRE16
-
-#include "pcre_printint.c"
-
-/* End of pcre16_printint.c */
diff --git a/dist/pcre16_refcount.c b/dist/pcre16_refcount.c
deleted file mode 100644
index d3d1543..0000000
--- a/dist/pcre16_refcount.c
+++ /dev/null
@@ -1,45 +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
-           Copyright (c) 1997-2012 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.
------------------------------------------------------------------------------
-*/
-
-/* Generate code with 16 bit character support. */
-#define COMPILE_PCRE16
-
-#include "pcre_refcount.c"
-
-/* End of pcre16_refcount.c */
diff --git a/dist/pcre16_string_utils.c b/dist/pcre16_string_utils.c
deleted file mode 100644
index 382c407..0000000
--- a/dist/pcre16_string_utils.c
+++ /dev/null
@@ -1,45 +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
-           Copyright (c) 1997-2012 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.
------------------------------------------------------------------------------
-*/
-
-/* Generate code with 16 bit character support. */
-#define COMPILE_PCRE16
-
-#include "pcre_string_utils.c"
-
-/* End of pcre16_string_utils.c */
diff --git a/dist/pcre16_study.c b/dist/pcre16_study.c
deleted file mode 100644
index f87de08..0000000
--- a/dist/pcre16_study.c
+++ /dev/null
@@ -1,45 +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
-           Copyright (c) 1997-2012 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.
------------------------------------------------------------------------------
-*/
-
-/* Generate code with 16 bit character support. */
-#define COMPILE_PCRE16
-
-#include "pcre_study.c"
-
-/* End of pcre16_study.c */
diff --git a/dist/pcre16_tables.c b/dist/pcre16_tables.c
deleted file mode 100644
index d842970..0000000
--- a/dist/pcre16_tables.c
+++ /dev/null
@@ -1,45 +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
-           Copyright (c) 1997-2012 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.
------------------------------------------------------------------------------
-*/
-
-/* Generate code with 16 bit character support. */
-#define COMPILE_PCRE16
-
-#include "pcre_tables.c"
-
-/* End of pcre16_tables.c */
diff --git a/dist/pcre16_ucd.c b/dist/pcre16_ucd.c
deleted file mode 100644
index ee23439..0000000
--- a/dist/pcre16_ucd.c
+++ /dev/null
@@ -1,45 +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
-           Copyright (c) 1997-2012 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.
------------------------------------------------------------------------------
-*/
-
-/* Generate code with 16 bit character support. */
-#define COMPILE_PCRE16
-
-#include "pcre_ucd.c"
-
-/* End of pcre16_ucd.c */
diff --git a/dist/pcre16_utf16_utils.c b/dist/pcre16_utf16_utils.c
deleted file mode 100644
index 49ced0c..0000000
--- a/dist/pcre16_utf16_utils.c
+++ /dev/null
@@ -1,130 +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
-           Copyright (c) 1997-2012 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 function for converting any UTF-16 character
-strings to host byte order. */
-
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-/* Generate code with 16 bit character support. */
-#define COMPILE_PCRE16
-
-#include "pcre_internal.h"
-
-/*************************************************
-*  Convert any UTF-16 string to host byte order  *
-*************************************************/
-
-/* This function takes an UTF-16 string and converts
-it to host byte order. The length can be explicitly set,
-or automatically detected for zero terminated strings.
-BOMs can be kept or discarded during the conversion.
-Conversion can be done in place (output == input).
-
-Arguments:
-  output     the output buffer, its size must be greater
-             or equal than the input string
-  input      any UTF-16 string
-  length     the number of 16-bit units in the input string
-             can be less than zero for zero terminated strings
-  host_byte_order
-             A non-zero value means the input is in host byte
-             order, which can be dynamically changed by BOMs later.
-             Initially it contains the starting byte order and returns
-             with the last byte order so it can be used for stream
-             processing. It can be NULL, which set the host byte
-             order mode by default.
-  keep_boms  for a non-zero value, the BOM (0xfeff) characters
-             are copied as well
-
-Returns:     the number of 16-bit units placed into the output buffer,
-             including the zero-terminator
-*/
-
-int
-pcre16_utf16_to_host_byte_order(PCRE_UCHAR16 *output, PCRE_SPTR16 input,
-  int length, int *host_byte_order, int keep_boms)
-{
-#ifdef SUPPORT_UTF
-/* This function converts any UTF-16 string to host byte order and optionally
-removes any Byte Order Marks (BOMS). Returns with the remainig length. */
-int host_bo = host_byte_order != NULL ? *host_byte_order : 1;
-pcre_uchar *optr = (pcre_uchar *)output;
-const pcre_uchar *iptr = (const pcre_uchar *)input;
-const pcre_uchar *end;
-/* The c variable must be unsigned. */
-register pcre_uchar c;
-
-if (length < 0)
-  length = STRLEN_UC(iptr) + 1;
-end = iptr + length;
-
-while (iptr < end)
-  {
-  c = *iptr++;
-  if (c == 0xfeff || c == 0xfffe)
-    {
-    /* Detecting the byte order of the machine is unnecessary, it is
-    enough to know that the UTF-16 string has the same byte order or not. */
-    host_bo = c == 0xfeff;
-    if (keep_boms != 0)
-      *optr++ = 0xfeff;
-    else
-      length--;
-    }
-  else
-    *optr++ = host_bo ? c : ((c >> 8) | (c << 8)); /* Flip bytes if needed. */
-  }
-if (host_byte_order != NULL)
-  *host_byte_order = host_bo;
-
-#else /* Not SUPPORT_UTF */
-(void)(output);  /* Keep picky compilers happy */
-(void)(input);
-(void)(keep_boms);
-(void)(host_byte_order);
-#endif /* SUPPORT_UTF */
-return length;
-}
-
-/* End of pcre16_utf16_utils.c */
diff --git a/dist/pcre16_valid_utf16.c b/dist/pcre16_valid_utf16.c
deleted file mode 100644
index 0907653..0000000
--- a/dist/pcre16_valid_utf16.c
+++ /dev/null
@@ -1,137 +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
-           Copyright (c) 1997-2013 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-16 character
-strings. */
-
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-/* Generate code with 16 bit character support. */
-#define COMPILE_PCRE16
-
-#include "pcre_internal.h"
-
-
-/*************************************************
-*         Validate a UTF-16 string                *
-*************************************************/
-
-/* This function is called (optionally) at the start of compile or match, to
-check that a supposed UTF-16 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.
-
-From release 8.21 more information about the details of the error are passed
-back in the returned value:
-
-PCRE_UTF16_ERR0  No error
-PCRE_UTF16_ERR1  Missing low surrogate at the end of the string
-PCRE_UTF16_ERR2  Invalid low surrogate
-PCRE_UTF16_ERR3  Isolated low surrogate
-PCRE_UTF16_ERR4  Unused (was non-character)
-
-Arguments:
-  string       points to the string
-  length       length of string, or -1 if the string is zero-terminated
-  errp         pointer to an error position offset variable
-
-Returns:       = 0    if the string is a valid UTF-16 string
-               > 0    otherwise, setting the offset of the bad character
-*/
-
-int
-PRIV(valid_utf)(PCRE_PUCHAR string, int length, int *erroroffset)
-{
-#ifdef SUPPORT_UTF
-register PCRE_PUCHAR p;
-register pcre_uint32 c;
-
-if (length < 0)
-  {
-  for (p = string; *p != 0; p++);
-  length = p - string;
-  }
-
-for (p = string; length-- > 0; p++)
-  {
-  c = *p;
-
-  if ((c & 0xf800) != 0xd800)
-    {
-    /* Normal UTF-16 code point. Neither high nor low surrogate. */
-    }
-  else if ((c & 0x0400) == 0)
-    {
-    /* High surrogate. Must be a followed by a low surrogate. */
-    if (length == 0)
-      {
-      *erroroffset = p - string;
-      return PCRE_UTF16_ERR1;
-      }
-    p++;
-    length--;
-    if ((*p & 0xfc00) != 0xdc00)
-      {
-      *erroroffset = p - string;
-      return PCRE_UTF16_ERR2;
-      }
-    }
-  else
-    {
-    /* Isolated low surrogate. Always an error. */
-    *erroroffset = p - string;
-    return PCRE_UTF16_ERR3;
-    }
-  }
-
-#else  /* SUPPORT_UTF */
-(void)(string);  /* Keep picky compilers happy */
-(void)(length);
-(void)(erroroffset);
-#endif /* SUPPORT_UTF */
-
-return PCRE_UTF16_ERR0;   /* This indicates success */
-}
-
-/* End of pcre16_valid_utf16.c */
diff --git a/dist/pcre16_version.c b/dist/pcre16_version.c
deleted file mode 100644
index e991b1a..0000000
--- a/dist/pcre16_version.c
+++ /dev/null
@@ -1,45 +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
-           Copyright (c) 1997-2012 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.
------------------------------------------------------------------------------
-*/
-
-/* Generate code with 16 bit character support. */
-#define COMPILE_PCRE16
-
-#include "pcre_version.c"
-
-/* End of pcre16_version.c */
diff --git a/dist/pcre16_xclass.c b/dist/pcre16_xclass.c
deleted file mode 100644
index 5aac2a3..0000000
--- a/dist/pcre16_xclass.c
+++ /dev/null
@@ -1,45 +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
-           Copyright (c) 1997-2012 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.
------------------------------------------------------------------------------
-*/
-
-/* Generate code with 16 bit character support. */
-#define COMPILE_PCRE16
-
-#include "pcre_xclass.c"
-
-/* End of pcre16_xclass.c */
diff --git a/dist/pcre32_byte_order.c b/dist/pcre32_byte_order.c
deleted file mode 100644
index 9cf5362..0000000
--- a/dist/pcre32_byte_order.c
+++ /dev/null
@@ -1,45 +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
-           Copyright (c) 1997-2012 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.
------------------------------------------------------------------------------
-*/
-
-/* Generate code with 32 bit character support. */
-#define COMPILE_PCRE32
-
-#include "pcre_byte_order.c"
-
-/* End of pcre32_byte_order.c */
diff --git a/dist/pcre32_chartables.c b/dist/pcre32_chartables.c
deleted file mode 100644
index b5d8c23..0000000
--- a/dist/pcre32_chartables.c
+++ /dev/null
@@ -1,45 +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
-           Copyright (c) 1997-2012 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.
------------------------------------------------------------------------------
-*/
-
-/* Generate code with 32 bit character support. */
-#define COMPILE_PCRE32
-
-#include "pcre_chartables.c"
-
-/* End of pcre32_chartables.c */
diff --git a/dist/pcre32_compile.c b/dist/pcre32_compile.c
deleted file mode 100644
index d781eb3..0000000
--- a/dist/pcre32_compile.c
+++ /dev/null
@@ -1,45 +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
-           Copyright (c) 1997-2012 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.
------------------------------------------------------------------------------
-*/
-
-/* Generate code with 32 bit character support. */
-#define COMPILE_PCRE32
-
-#include "pcre_compile.c"
-
-/* End of pcre32_compile.c */
diff --git a/dist/pcre32_config.c b/dist/pcre32_config.c
deleted file mode 100644
index d63f3e9..0000000
--- a/dist/pcre32_config.c
+++ /dev/null
@@ -1,45 +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
-           Copyright (c) 1997-2012 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.
------------------------------------------------------------------------------
-*/
-
-/* Generate code with 32 bit character support. */
-#define COMPILE_PCRE32
-
-#include "pcre_config.c"
-
-/* End of pcre32_config.c */
diff --git a/dist/pcre32_dfa_exec.c b/dist/pcre32_dfa_exec.c
deleted file mode 100644
index b0bfd34..0000000
--- a/dist/pcre32_dfa_exec.c
+++ /dev/null
@@ -1,45 +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
-           Copyright (c) 1997-2012 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.
------------------------------------------------------------------------------
-*/
-
-/* Generate code with 32 bit character support. */
-#define COMPILE_PCRE32
-
-#include "pcre_dfa_exec.c"
-
-/* End of pcre32_dfa_exec.c */
diff --git a/dist/pcre32_exec.c b/dist/pcre32_exec.c
deleted file mode 100644
index 8170ed7..0000000
--- a/dist/pcre32_exec.c
+++ /dev/null
@@ -1,45 +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
-           Copyright (c) 1997-2012 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.
------------------------------------------------------------------------------
-*/
-
-/* Generate code with 32 bit character support. */
-#define COMPILE_PCRE32
-
-#include "pcre_exec.c"
-
-/* End of pcre32_exec.c */
diff --git a/dist/pcre32_fullinfo.c b/dist/pcre32_fullinfo.c
deleted file mode 100644
index 6ecc520..0000000
--- a/dist/pcre32_fullinfo.c
+++ /dev/null
@@ -1,45 +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
-           Copyright (c) 1997-2012 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.
------------------------------------------------------------------------------
-*/
-
-/* Generate code with 32 bit character support. */
-#define COMPILE_PCRE32
-
-#include "pcre_fullinfo.c"
-
-/* End of pcre32_fullinfo.c */
diff --git a/dist/pcre32_get.c b/dist/pcre32_get.c
deleted file mode 100644
index d35deee..0000000
--- a/dist/pcre32_get.c
+++ /dev/null
@@ -1,45 +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
-           Copyright (c) 1997-2012 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.
------------------------------------------------------------------------------
-*/
-
-/* Generate code with 32 bit character support. */
-#define COMPILE_PCRE32
-
-#include "pcre_get.c"
-
-/* End of pcre32_get.c */
diff --git a/dist/pcre32_globals.c b/dist/pcre32_globals.c
deleted file mode 100644
index 32e0914..0000000
--- a/dist/pcre32_globals.c
+++ /dev/null
@@ -1,45 +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
-           Copyright (c) 1997-2012 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.
------------------------------------------------------------------------------
-*/
-
-/* Generate code with 32 bit character support. */
-#define COMPILE_PCRE32
-
-#include "pcre_globals.c"
-
-/* End of pcre32_globals.c */
diff --git a/dist/pcre32_jit_compile.c b/dist/pcre32_jit_compile.c
deleted file mode 100644
index 2e7c6f9..0000000
--- a/dist/pcre32_jit_compile.c
+++ /dev/null
@@ -1,45 +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
-           Copyright (c) 1997-2012 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.
------------------------------------------------------------------------------
-*/
-
-/* Generate code with 32 bit character support. */
-#define COMPILE_PCRE32
-
-#include "pcre_jit_compile.c"
-
-/* End of pcre32_jit_compile.c */
diff --git a/dist/pcre32_maketables.c b/dist/pcre32_maketables.c
deleted file mode 100644
index 5d1b1c6..0000000
--- a/dist/pcre32_maketables.c
+++ /dev/null
@@ -1,45 +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
-           Copyright (c) 1997-2012 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.
------------------------------------------------------------------------------
-*/
-
-/* Generate code with 32 bit character support. */
-#define COMPILE_PCRE32
-
-#include "pcre_maketables.c"
-
-/* End of pcre32_maketables.c */
diff --git a/dist/pcre32_newline.c b/dist/pcre32_newline.c
deleted file mode 100644
index 7f8d536..0000000
--- a/dist/pcre32_newline.c
+++ /dev/null
@@ -1,45 +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
-           Copyright (c) 1997-2012 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.
------------------------------------------------------------------------------
-*/
-
-/* Generate code with 32 bit character support. */
-#define COMPILE_PCRE32
-
-#include "pcre_newline.c"
-
-/* End of pcre32_newline.c */
diff --git a/dist/pcre32_ord2utf32.c b/dist/pcre32_ord2utf32.c
deleted file mode 100644
index 606bcb3..0000000
--- a/dist/pcre32_ord2utf32.c
+++ /dev/null
@@ -1,82 +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
-           Copyright (c) 1997-2012 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 UTF32 string. */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-/* Generate code with 32 bit character support. */
-#define COMPILE_PCRE32
-
-#include "pcre_internal.h"
-
-/*************************************************
-*       Convert character value to UTF-32         *
-*************************************************/
-
-/* This function takes an integer value in the range 0 - 0x10ffff
-and encodes it as a UTF-32 character in 1 pcre_uchars.
-
-Arguments:
-  cvalue     the character value
-  buffer     pointer to buffer for result - at least 1 pcre_uchars long
-
-Returns:     number of characters placed in the buffer
-*/
-
-unsigned int
-PRIV(ord2utf)(pcre_uint32 cvalue, pcre_uchar *buffer)
-{
-#ifdef SUPPORT_UTF
-
-*buffer = (pcre_uchar)cvalue;
-return 1;
-
-#else /* SUPPORT_UTF */
-(void)(cvalue);  /* Keep compiler happy; this function won't ever be */
-(void)(buffer);  /* called when SUPPORT_UTF is not defined. */
-return 0;
-#endif /* SUPPORT_UTF */
-}
-
-/* End of pcre32_ord2utf32.c */
diff --git a/dist/pcre32_printint.c b/dist/pcre32_printint.c
deleted file mode 100644
index f3fd7b2..0000000
--- a/dist/pcre32_printint.c
+++ /dev/null
@@ -1,45 +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
-           Copyright (c) 1997-2012 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.
------------------------------------------------------------------------------
-*/
-
-/* Generate code with 32 bit character support. */
-#define COMPILE_PCRE32
-
-#include "pcre_printint.c"
-
-/* End of pcre32_printint.c */
diff --git a/dist/pcre32_refcount.c b/dist/pcre32_refcount.c
deleted file mode 100644
index dbdf432..0000000
--- a/dist/pcre32_refcount.c
+++ /dev/null
@@ -1,45 +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
-           Copyright (c) 1997-2012 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.
------------------------------------------------------------------------------
-*/
-
-/* Generate code with 32 bit character support. */
-#define COMPILE_PCRE32
-
-#include "pcre_refcount.c"
-
-/* End of pcre32_refcount.c */
diff --git a/dist/pcre32_string_utils.c b/dist/pcre32_string_utils.c
deleted file mode 100644
index e37b3d4..0000000
--- a/dist/pcre32_string_utils.c
+++ /dev/null
@@ -1,45 +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
-           Copyright (c) 1997-2012 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.
------------------------------------------------------------------------------
-*/
-
-/* Generate code with 32 bit character support. */
-#define COMPILE_PCRE32
-
-#include "pcre_string_utils.c"
-
-/* End of pcre32_string_utils.c */
diff --git a/dist/pcre32_study.c b/dist/pcre32_study.c
deleted file mode 100644
index d3a3afe..0000000
--- a/dist/pcre32_study.c
+++ /dev/null
@@ -1,45 +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
-           Copyright (c) 1997-2012 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.
------------------------------------------------------------------------------
-*/
-
-/* Generate code with 32 bit character support. */
-#define COMPILE_PCRE32
-
-#include "pcre_study.c"
-
-/* End of pcre32_study.c */
diff --git a/dist/pcre32_tables.c b/dist/pcre32_tables.c
deleted file mode 100644
index 3d94cca..0000000
--- a/dist/pcre32_tables.c
+++ /dev/null
@@ -1,45 +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
-           Copyright (c) 1997-2012 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.
------------------------------------------------------------------------------
-*/
-
-/* Generate code with 32 bit character support. */
-#define COMPILE_PCRE32
-
-#include "pcre_tables.c"
-
-/* End of pcre32_tables.c */
diff --git a/dist/pcre32_ucd.c b/dist/pcre32_ucd.c
deleted file mode 100644
index befe22d..0000000
--- a/dist/pcre32_ucd.c
+++ /dev/null
@@ -1,45 +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
-           Copyright (c) 1997-2012 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.
------------------------------------------------------------------------------
-*/
-
-/* Generate code with 32 bit character support. */
-#define COMPILE_PCRE32
-
-#include "pcre_ucd.c"
-
-/* End of pcre32_ucd.c */
diff --git a/dist/pcre32_utf32_utils.c b/dist/pcre32_utf32_utils.c
deleted file mode 100644
index f844e23..0000000
--- a/dist/pcre32_utf32_utils.c
+++ /dev/null
@@ -1,141 +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
-           Copyright (c) 1997-2012 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 function for converting any UTF-32 character
-strings to host byte order. */
-
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-/* Generate code with 32 bit character support. */
-#define COMPILE_PCRE32
-
-#include "pcre_internal.h"
-
-#ifdef SUPPORT_UTF
-static pcre_uint32
-swap_uint32(pcre_uint32 value)
-{
-return ((value & 0x000000ff) << 24) |
-       ((value & 0x0000ff00) <<  8) |
-       ((value & 0x00ff0000) >>  8) |
-       (value >> 24);
-}
-#endif
-
-
-/*************************************************
-*  Convert any UTF-32 string to host byte order  *
-*************************************************/
-
-/* This function takes an UTF-32 string and converts
-it to host byte order. The length can be explicitly set,
-or automatically detected for zero terminated strings.
-BOMs can be kept or discarded during the conversion.
-Conversion can be done in place (output == input).
-
-Arguments:
-  output     the output buffer, its size must be greater
-             or equal than the input string
-  input      any UTF-32 string
-  length     the number of 32-bit units in the input string
-             can be less than zero for zero terminated strings
-  host_byte_order
-             A non-zero value means the input is in host byte
-             order, which can be dynamically changed by BOMs later.
-             Initially it contains the starting byte order and returns
-             with the last byte order so it can be used for stream
-             processing. It can be NULL, which set the host byte
-             order mode by default.
-  keep_boms  for a non-zero value, the BOM (0xfeff) characters
-             are copied as well
-
-Returns:     the number of 32-bit units placed into the output buffer,
-             including the zero-terminator
-*/
-
-int
-pcre32_utf32_to_host_byte_order(PCRE_UCHAR32 *output, PCRE_SPTR32 input,
-  int length, int *host_byte_order, int keep_boms)
-{
-#ifdef SUPPORT_UTF
-/* This function converts any UTF-32 string to host byte order and optionally
-removes any Byte Order Marks (BOMS). Returns with the remainig length. */
-int host_bo = host_byte_order != NULL ? *host_byte_order : 1;
-pcre_uchar *optr = (pcre_uchar *)output;
-const pcre_uchar *iptr = (const pcre_uchar *)input;
-const pcre_uchar *end;
-/* The c variable must be unsigned. */
-register pcre_uchar c;
-
-if (length < 0)
-  end = iptr + STRLEN_UC(iptr) + 1;
-else
-  end = iptr + length;
-
-while (iptr < end)
-  {
-  c = *iptr++;
-  if (c == 0x0000feffu || c == 0xfffe0000u)
-    {
-    /* Detecting the byte order of the machine is unnecessary, it is
-    enough to know that the UTF-32 string has the same byte order or not. */
-    host_bo = c == 0x0000feffu;
-    if (keep_boms != 0)
-      *optr++ = 0x0000feffu;
-    }
-  else
-    *optr++ = host_bo ? c : swap_uint32(c);
-  }
-if (host_byte_order != NULL)
-  *host_byte_order = host_bo;
-
-#else /* SUPPORT_UTF */
-(void)(output);  /* Keep picky compilers happy */
-(void)(input);
-(void)(keep_boms);
-(void)(host_byte_order);
-#endif /* SUPPORT_UTF */
-return length;
-}
-
-/* End of pcre32_utf32_utils.c */
diff --git a/dist/pcre32_valid_utf32.c b/dist/pcre32_valid_utf32.c
deleted file mode 100644
index 94cda1a..0000000
--- a/dist/pcre32_valid_utf32.c
+++ /dev/null
@@ -1,124 +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
-           Copyright (c) 1997-2013 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-32 character
-strings. */
-
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-/* Generate code with 32 bit character support. */
-#define COMPILE_PCRE32
-
-#include "pcre_internal.h"
-
-/*************************************************
-*         Validate a UTF-32 string                *
-*************************************************/
-
-/* This function is called (optionally) at the start of compile or match, to
-check that a supposed UTF-32 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.
-
-More information about the details of the error are passed
-back in the returned value:
-
-PCRE_UTF32_ERR0  No error
-PCRE_UTF32_ERR1  Surrogate character
-PCRE_UTF32_ERR2  Unused (was non-character)
-PCRE_UTF32_ERR3  Character > 0x10ffff
-
-Arguments:
-  string       points to the string
-  length       length of string, or -1 if the string is zero-terminated
-  errp         pointer to an error position offset variable
-
-Returns:       = 0    if the string is a valid UTF-32 string
-               > 0    otherwise, setting the offset of the bad character
-*/
-
-int
-PRIV(valid_utf)(PCRE_PUCHAR string, int length, int *erroroffset)
-{
-#ifdef SUPPORT_UTF
-register PCRE_PUCHAR p;
-register pcre_uchar c;
-
-if (length < 0)
-  {
-  for (p = string; *p != 0; p++);
-  length = p - string;
-  }
-
-for (p = string; length-- > 0; p++)
-  {
-  c = *p;
-
-  if ((c & 0xfffff800u) != 0xd800u)
-    {
-    /* Normal UTF-32 code point. Neither high nor low surrogate. */
-    if (c > 0x10ffffu)
-      {
-      *erroroffset = p - string;
-      return PCRE_UTF32_ERR3;
-      }
-    }
-  else
-    {
-    /* A surrogate */
-    *erroroffset = p - string;
-    return PCRE_UTF32_ERR1;
-    }
-  }
-
-#else  /* SUPPORT_UTF */
-(void)(string);  /* Keep picky compilers happy */
-(void)(length);
-(void)(erroroffset);
-#endif /* SUPPORT_UTF */
-
-return PCRE_UTF32_ERR0;   /* This indicates success */
-}
-
-/* End of pcre32_valid_utf32.c */
diff --git a/dist/pcre32_version.c b/dist/pcre32_version.c
deleted file mode 100644
index fdaad9b..0000000
--- a/dist/pcre32_version.c
+++ /dev/null
@@ -1,45 +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
-           Copyright (c) 1997-2012 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.
------------------------------------------------------------------------------
-*/
-
-/* Generate code with 32 bit character support. */
-#define COMPILE_PCRE32
-
-#include "pcre_version.c"
-
-/* End of pcre32_version.c */
diff --git a/dist/pcre32_xclass.c b/dist/pcre32_xclass.c
deleted file mode 100644
index 5662408..0000000
--- a/dist/pcre32_xclass.c
+++ /dev/null
@@ -1,45 +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
-           Copyright (c) 1997-2012 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.
------------------------------------------------------------------------------
-*/
-
-/* Generate code with 32 bit character support. */
-#define COMPILE_PCRE32
-
-#include "pcre_xclass.c"
-
-/* End of pcre32_xclass.c */
diff --git a/dist/pcre_byte_order.c b/dist/pcre_byte_order.c
deleted file mode 100644
index cf5f12b..0000000
--- a/dist/pcre_byte_order.c
+++ /dev/null
@@ -1,319 +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
-           Copyright (c) 1997-2014 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. */
-
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include "pcre_internal.h"
-
-
-/*************************************************
-*             Swap byte functions                *
-*************************************************/
-
-/* The following functions swap the bytes of a pcre_uint16
-and pcre_uint32 value.
-
-Arguments:
-  value        any number
-
-Returns:       the byte swapped value
-*/
-
-static pcre_uint32
-swap_uint32(pcre_uint32 value)
-{
-return ((value & 0x000000ff) << 24) |
-       ((value & 0x0000ff00) <<  8) |
-       ((value & 0x00ff0000) >>  8) |
-       (value >> 24);
-}
-
-static pcre_uint16
-swap_uint16(pcre_uint16 value)
-{
-return (value >> 8) | (value << 8);
-}
-
-
-/*************************************************
-*       Test for a byte-flipped compiled regex   *
-*************************************************/
-
-/* This function swaps the bytes of a compiled pattern usually
-loaded form the disk. It also sets the tables pointer, which
-is likely an invalid pointer after reload.
-
-Arguments:
-  argument_re     points to the compiled expression
-  extra_data      points to extra data or is NULL
-  tables          points to the character tables or NULL
-
-Returns:          0 if the swap is successful, negative on error
-*/
-
-#if defined COMPILE_PCRE8
-PCRE_EXP_DECL int pcre_pattern_to_host_byte_order(pcre *argument_re,
-  pcre_extra *extra_data, const unsigned char *tables)
-#elif defined COMPILE_PCRE16
-PCRE_EXP_DECL int pcre16_pattern_to_host_byte_order(pcre16 *argument_re,
-  pcre16_extra *extra_data, const unsigned char *tables)
-#elif defined COMPILE_PCRE32
-PCRE_EXP_DECL int pcre32_pattern_to_host_byte_order(pcre32 *argument_re,
-  pcre32_extra *extra_data, const unsigned char *tables)
-#endif
-{
-REAL_PCRE *re = (REAL_PCRE *)argument_re;
-pcre_study_data *study;
-#ifndef COMPILE_PCRE8
-pcre_uchar *ptr;
-int length;
-#if defined SUPPORT_UTF && defined COMPILE_PCRE16
-BOOL utf;
-BOOL utf16_char;
-#endif /* SUPPORT_UTF && COMPILE_PCRE16 */
-#endif /* !COMPILE_PCRE8 */
-
-if (re == NULL) return PCRE_ERROR_NULL;
-if (re->magic_number == MAGIC_NUMBER)
-  {
-  if ((re->flags & PCRE_MODE) == 0) return PCRE_ERROR_BADMODE;
-  re->tables = tables;
-  return 0;
-  }
-
-if (re->magic_number != REVERSED_MAGIC_NUMBER) return PCRE_ERROR_BADMAGIC;
-if ((swap_uint32(re->flags) & PCRE_MODE) == 0) return PCRE_ERROR_BADMODE;
-
-re->magic_number = MAGIC_NUMBER;
-re->size = swap_uint32(re->size);
-re->options = swap_uint32(re->options);
-re->flags = swap_uint32(re->flags);
-re->limit_match = swap_uint32(re->limit_match);
-re->limit_recursion = swap_uint32(re->limit_recursion);
-
-#if defined COMPILE_PCRE8 || defined COMPILE_PCRE16
-re->first_char = swap_uint16(re->first_char);
-re->req_char = swap_uint16(re->req_char);
-#elif defined COMPILE_PCRE32
-re->first_char = swap_uint32(re->first_char);
-re->req_char = swap_uint32(re->req_char);
-#endif
-
-re->max_lookbehind = swap_uint16(re->max_lookbehind);
-re->top_bracket = swap_uint16(re->top_bracket);
-re->top_backref = swap_uint16(re->top_backref);
-re->name_table_offset = swap_uint16(re->name_table_offset);
-re->name_entry_size = swap_uint16(re->name_entry_size);
-re->name_count = swap_uint16(re->name_count);
-re->ref_count = swap_uint16(re->ref_count);
-re->tables = tables;
-
-if (extra_data != NULL && (extra_data->flags & PCRE_EXTRA_STUDY_DATA) != 0)
-  {
-  study = (pcre_study_data *)extra_data->study_data;
-  study->size = swap_uint32(study->size);
-  study->flags = swap_uint32(study->flags);
-  study->minlength = swap_uint32(study->minlength);
-  }
-
-#ifndef COMPILE_PCRE8
-ptr = (pcre_uchar *)re + re->name_table_offset;
-length = re->name_count * re->name_entry_size;
-#if defined SUPPORT_UTF && defined COMPILE_PCRE16
-utf = (re->options & PCRE_UTF16) != 0;
-utf16_char = FALSE;
-#endif /* SUPPORT_UTF && COMPILE_PCRE16 */
-
-while(TRUE)
-  {
-  /* Swap previous characters. */
-  while (length-- > 0)
-    {
-#if defined COMPILE_PCRE16
-    *ptr = swap_uint16(*ptr);
-#elif defined COMPILE_PCRE32
-    *ptr = swap_uint32(*ptr);
-#endif
-    ptr++;
-    }
-#if defined SUPPORT_UTF && defined COMPILE_PCRE16
-  if (utf16_char)
-    {
-    if (HAS_EXTRALEN(ptr[-1]))
-      {
-      /* We know that there is only one extra character in UTF-16. */
-      *ptr = swap_uint16(*ptr);
-      ptr++;
-      }
-    }
-  utf16_char = FALSE;
-#endif /* SUPPORT_UTF */
-
-  /* Get next opcode. */
-  length = 0;
-#if defined COMPILE_PCRE16
-  *ptr = swap_uint16(*ptr);
-#elif defined COMPILE_PCRE32
-  *ptr = swap_uint32(*ptr);
-#endif
-  switch (*ptr)
-    {
-    case OP_END:
-    return 0;
-
-#if defined SUPPORT_UTF && defined COMPILE_PCRE16
-    case OP_CHAR:
-    case OP_CHARI:
-    case OP_NOT:
-    case OP_NOTI:
-    case OP_STAR:
-    case OP_MINSTAR:
-    case OP_PLUS:
-    case OP_MINPLUS:
-    case OP_QUERY:
-    case OP_MINQUERY:
-    case OP_UPTO:
-    case OP_MINUPTO:
-    case OP_EXACT:
-    case OP_POSSTAR:
-    case OP_POSPLUS:
-    case OP_POSQUERY:
-    case OP_POSUPTO:
-    case OP_STARI:
-    case OP_MINSTARI:
-    case OP_PLUSI:
-    case OP_MINPLUSI:
-    case OP_QUERYI:
-    case OP_MINQUERYI:
-    case OP_UPTOI:
-    case OP_MINUPTOI:
-    case OP_EXACTI:
-    case OP_POSSTARI:
-    case OP_POSPLUSI:
-    case OP_POSQUERYI:
-    case OP_POSUPTOI:
-    case OP_NOTSTAR:
-    case OP_NOTMINSTAR:
-    case OP_NOTPLUS:
-    case OP_NOTMINPLUS:
-    case OP_NOTQUERY:
-    case OP_NOTMINQUERY:
-    case OP_NOTUPTO:
-    case OP_NOTMINUPTO:
-    case OP_NOTEXACT:
-    case OP_NOTPOSSTAR:
-    case OP_NOTPOSPLUS:
-    case OP_NOTPOSQUERY:
-    case OP_NOTPOSUPTO:
-    case OP_NOTSTARI:
-    case OP_NOTMINSTARI:
-    case OP_NOTPLUSI:
-    case OP_NOTMINPLUSI:
-    case OP_NOTQUERYI:
-    case OP_NOTMINQUERYI:
-    case OP_NOTUPTOI:
-    case OP_NOTMINUPTOI:
-    case OP_NOTEXACTI:
-    case OP_NOTPOSSTARI:
-    case OP_NOTPOSPLUSI:
-    case OP_NOTPOSQUERYI:
-    case OP_NOTPOSUPTOI:
-    if (utf) utf16_char = TRUE;
-#endif
-    /* Fall through. */
-
-    default:
-    length = PRIV(OP_lengths)[*ptr] - 1;
-    break;
-
-    case OP_CLASS:
-    case OP_NCLASS:
-    /* Skip the character bit map. */
-    ptr += 32/sizeof(pcre_uchar);
-    length = 0;
-    break;
-
-    case OP_XCLASS:
-    /* Reverse the size of the XCLASS instance. */
-    ptr++;
-#if defined COMPILE_PCRE16
-    *ptr = swap_uint16(*ptr);
-#elif defined COMPILE_PCRE32
-    *ptr = swap_uint32(*ptr);
-#endif
-#ifndef COMPILE_PCRE32
-    if (LINK_SIZE > 1)
-      {
-      /* LINK_SIZE can be 1 or 2 in 16 bit mode. */
-      ptr++;
-      *ptr = swap_uint16(*ptr);
-      }
-#endif
-    ptr++;
-    length = (GET(ptr, -LINK_SIZE)) - (1 + LINK_SIZE + 1);
-#if defined COMPILE_PCRE16
-    *ptr = swap_uint16(*ptr);
-#elif defined COMPILE_PCRE32
-    *ptr = swap_uint32(*ptr);
-#endif
-    if ((*ptr & XCL_MAP) != 0)
-      {
-      /* Skip the character bit map. */
-      ptr += 32/sizeof(pcre_uchar);
-      length -= 32/sizeof(pcre_uchar);
-      }
-    break;
-    }
-  ptr++;
-  }
-/* Control should never reach here in 16/32 bit mode. */
-#else  /* In 8-bit mode, the pattern does not need to be processed. */
-return 0;
-#endif /* !COMPILE_PCRE8 */
-}
-
-/* End of pcre_byte_order.c */
diff --git a/dist/pcre_compile.c b/dist/pcre_compile.c
deleted file mode 100644
index 4d3b313..0000000
--- a/dist/pcre_compile.c
+++ /dev/null
@@ -1,9732 +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
-           Copyright (c) 1997-2014 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. */
-
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#define NLBLOCK cd             /* Block containing newline information */
-#define PSSTART start_pattern  /* Field containing pattern start */
-#define PSEND   end_pattern    /* Field containing pattern end */
-
-#include "pcre_internal.h"
-
-
-/* When PCRE_DEBUG is defined, we need the pcre(16|32)_printint() function, which
-is also used by pcretest. PCRE_DEBUG is not defined when building a production
-library. We do not need to select pcre16_printint.c specially, because the
-COMPILE_PCREx macro will already be appropriately set. */
-
-#ifdef PCRE_DEBUG
-/* pcre_printint.c should not include any headers */
-#define PCRE_INCLUDED
-#include "pcre_printint.c"
-#undef PCRE_INCLUDED
-#endif
-
-
-/* Macro for setting individual bits in class bitmaps. */
-
-#define SETBIT(a,b) a[(b)/8] |= (1 << ((b)&7))
-
-/* Maximum length value to check against when making sure that the integer that
-holds the compiled pattern length does not overflow. We make it a bit less than
-INT_MAX to allow for adding in group terminating bytes, so that we don't have
-to check them every time. */
-
-#define OFLOW_MAX (INT_MAX - 20)
-
-/* Definitions to allow mutual recursion */
-
-static int
-  add_list_to_class(pcre_uint8 *, pcre_uchar **, int, compile_data *,
-    const pcre_uint32 *, unsigned int);
-
-static BOOL
-  compile_regex(int, pcre_uchar **, const pcre_uchar **, int *, BOOL, BOOL, int, int,
-    pcre_uint32 *, pcre_int32 *, pcre_uint32 *, pcre_int32 *, branch_chain *,
-    compile_data *, int *);
-
-
-
-/*************************************************
-*      Code parameters and static tables         *
-*************************************************/
-
-/* This value specifies the size of stack workspace that is used during the
-first pre-compile phase that determines how much memory is required. The regex
-is partly compiled into this space, but the compiled parts are discarded as
-soon as they can be, so that hopefully there will never be an overrun. The code
-does, however, check for an overrun. The largest amount I've seen used is 218,
-so this number is very generous.
-
-The same workspace is used during the second, actual compile phase for
-remembering forward references to groups so that they can be filled in at the
-end. Each entry in this list occupies LINK_SIZE bytes, so even when LINK_SIZE
-is 4 there is plenty of room for most patterns. However, the memory can get
-filled up by repetitions of forward references, for example patterns like
-/(?1){0,1999}(b)/, and one user did hit the limit. The code has been changed so
-that the workspace is expanded using malloc() in this situation. The value
-below is therefore a minimum, and we put a maximum on it for safety. The
-minimum is now also defined in terms of LINK_SIZE so that the use of malloc()
-kicks in at the same number of forward references in all cases. */
-
-#define COMPILE_WORK_SIZE (2048*LINK_SIZE)
-#define COMPILE_WORK_SIZE_MAX (100*COMPILE_WORK_SIZE)
-
-/* This value determines the size of the initial vector that is used for
-remembering named groups during the pre-compile. It is allocated on the stack,
-but if it is too small, it is expanded using malloc(), in a similar way to the
-workspace. The value is the number of slots in the list. */
-
-#define NAMED_GROUP_LIST_SIZE  20
-
-/* The overrun tests check for a slightly smaller size so that they detect the
-overrun before it actually does run off the end of the data block. */
-
-#define WORK_SIZE_SAFETY_MARGIN (100)
-
-/* Private flags added to firstchar and reqchar. */
-
-#define REQ_CASELESS    (1 << 0)        /* Indicates caselessness */
-#define REQ_VARY        (1 << 1)        /* Reqchar followed non-literal item */
-/* Negative values for the firstchar and reqchar flags */
-#define REQ_UNSET       (-2)
-#define REQ_NONE        (-1)
-
-/* Repeated character flags. */
-
-#define UTF_LENGTH     0x10000000l      /* The char contains its length. */
-
-/* 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. */
-
-#ifndef EBCDIC
-
-/* This is the "normal" table for ASCII systems or for EBCDIC systems running
-in UTF-8 mode. */
-
-static const short int escapes[] = {
-     0,                       0,
-     0,                       0,
-     0,                       0,
-     0,                       0,
-     0,                       0,
-     CHAR_COLON,              CHAR_SEMICOLON,
-     CHAR_LESS_THAN_SIGN,     CHAR_EQUALS_SIGN,
-     CHAR_GREATER_THAN_SIGN,  CHAR_QUESTION_MARK,
-     CHAR_COMMERCIAL_AT,      -ESC_A,
-     -ESC_B,                  -ESC_C,
-     -ESC_D,                  -ESC_E,
-     0,                       -ESC_G,
-     -ESC_H,                  0,
-     0,                       -ESC_K,
-     0,                       0,
-     -ESC_N,                  0,
-     -ESC_P,                  -ESC_Q,
-     -ESC_R,                  -ESC_S,
-     0,                       0,
-     -ESC_V,                  -ESC_W,
-     -ESC_X,                  0,
-     -ESC_Z,                  CHAR_LEFT_SQUARE_BRACKET,
-     CHAR_BACKSLASH,          CHAR_RIGHT_SQUARE_BRACKET,
-     CHAR_CIRCUMFLEX_ACCENT,  CHAR_UNDERSCORE,
-     CHAR_GRAVE_ACCENT,       ESC_a,
-     -ESC_b,                  0,
-     -ESC_d,                  ESC_e,
-     ESC_f,                   0,
-     -ESC_h,                  0,
-     0,                       -ESC_k,
-     0,                       0,
-     ESC_n,                   0,
-     -ESC_p,                  0,
-     ESC_r,                   -ESC_s,
-     ESC_tee,                 0,
-     -ESC_v,                  -ESC_w,
-     0,                       0,
-     -ESC_z
-};
-
-#else
-
-/* This is the "abnormal" table for EBCDIC systems without UTF-8 support. */
-
-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, ESC_a, -ESC_b,       0, -ESC_d, ESC_e,  ESC_f,      0,
-/*  88 */-ESC_h,     0,      0,     '{',      0,     0,      0,      0,
-/*  90 */     0,     0, -ESC_k,       0,      0, ESC_n,      0, -ESC_p,
-/*  98 */     0, ESC_r,      0,     '}',      0,     0,      0,      0,
-/*  A0 */     0,   '~', -ESC_s, ESC_tee,      0,-ESC_v, -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 */-ESC_H,     0,      0,       0,      0,     0,      0,      0,
-/*  D0 */   '}',     0, -ESC_K,       0,      0,-ESC_N,      0, -ESC_P,
-/*  D8 */-ESC_Q,-ESC_R,      0,       0,      0,     0,      0,      0,
-/*  E0 */  '\\',     0, -ESC_S,       0,      0,-ESC_V, -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
-};
-
-/* We also need a table of characters that may follow \c in an EBCDIC
-environment for characters 0-31. */
-
-static unsigned char ebcdic_escape_c[] = "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_";
-
-#endif
-
-
-/* Table of special "verbs" like (*PRUNE). This is a short table, so it is
-searched linearly. Put all the names into a single string, in order to reduce
-the number of relocations when a shared library is dynamically linked. The
-string is built from string macros so that it works in UTF-8 mode on EBCDIC
-platforms. */
-
-typedef struct verbitem {
-  int   len;                 /* Length of verb name */
-  int   op;                  /* Op when no arg, or -1 if arg mandatory */
-  int   op_arg;              /* Op when arg present, or -1 if not allowed */
-} verbitem;
-
-static const char verbnames[] =
-  "\0"                       /* Empty name is a shorthand for MARK */
-  STRING_MARK0
-  STRING_ACCEPT0
-  STRING_COMMIT0
-  STRING_F0
-  STRING_FAIL0
-  STRING_PRUNE0
-  STRING_SKIP0
-  STRING_THEN;
-
-static const verbitem verbs[] = {
-  { 0, -1,        OP_MARK },
-  { 4, -1,        OP_MARK },
-  { 6, OP_ACCEPT, -1 },
-  { 6, OP_COMMIT, -1 },
-  { 1, OP_FAIL,   -1 },
-  { 4, OP_FAIL,   -1 },
-  { 5, OP_PRUNE,  OP_PRUNE_ARG },
-  { 4, OP_SKIP,   OP_SKIP_ARG  },
-  { 4, OP_THEN,   OP_THEN_ARG  }
-};
-
-static const int verbcount = sizeof(verbs)/sizeof(verbitem);
-
-
-/* Substitutes for [[:<:]] and [[:>:]], which mean start and end of word in
-another regex library. */
-
-static const pcre_uchar sub_start_of_word[] = {
-  CHAR_BACKSLASH, CHAR_b, CHAR_LEFT_PARENTHESIS, CHAR_QUESTION_MARK,
-  CHAR_EQUALS_SIGN, CHAR_BACKSLASH, CHAR_w, CHAR_RIGHT_PARENTHESIS, '\0' };
-
-static const pcre_uchar sub_end_of_word[] = {
-  CHAR_BACKSLASH, CHAR_b, CHAR_LEFT_PARENTHESIS, CHAR_QUESTION_MARK,
-  CHAR_LESS_THAN_SIGN, CHAR_EQUALS_SIGN, CHAR_BACKSLASH, CHAR_w,
-  CHAR_RIGHT_PARENTHESIS, '\0' };
-
-
-/* Tables of names of POSIX character classes and their lengths. The names are
-now all in a single string, to reduce the number of relocations when a shared
-library is dynamically loaded. The list of lengths is terminated by a zero
-length entry. The first three must be alpha, lower, upper, as this is assumed
-for handling case independence. The indices for graph, print, and punct are
-needed, so identify them. */
-
-static const char posix_names[] =
-  STRING_alpha0 STRING_lower0 STRING_upper0 STRING_alnum0
-  STRING_ascii0 STRING_blank0 STRING_cntrl0 STRING_digit0
-  STRING_graph0 STRING_print0 STRING_punct0 STRING_space0
-  STRING_word0  STRING_xdigit;
-
-static const pcre_uint8 posix_name_lengths[] = {
-  5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 6, 0 };
-
-#define PC_GRAPH  8
-#define PC_PRINT  9
-#define PC_PUNCT 10
-
-
-/* Table of class bit maps for each POSIX class. Each class is formed from a
-base map, with an optional addition or removal of another map. Then, for some
-classes, there is some additional tweaking: for [:blank:] the vertical space
-characters are removed, and for [:alpha:] and [:alnum:] the underscore
-character is removed. The triples in the table consist of the base map offset,
-second map offset or -1 if no second map, and a non-negative value for map
-addition or a negative value for map subtraction (if there are two maps). The
-absolute value of the third field has these meanings: 0 => no tweaking, 1 =>
-remove vertical space characters, 2 => remove underscore. */
-
-static const int posix_class_maps[] = {
-  cbit_word,  cbit_digit, -2,             /* alpha */
-  cbit_lower, -1,          0,             /* lower */
-  cbit_upper, -1,          0,             /* upper */
-  cbit_word,  -1,          2,             /* alnum - word without underscore */
-  cbit_print, cbit_cntrl,  0,             /* ascii */
-  cbit_space, -1,          1,             /* blank - a GNU extension */
-  cbit_cntrl, -1,          0,             /* cntrl */
-  cbit_digit, -1,          0,             /* digit */
-  cbit_graph, -1,          0,             /* graph */
-  cbit_print, -1,          0,             /* print */
-  cbit_punct, -1,          0,             /* punct */
-  cbit_space, -1,          0,             /* space */
-  cbit_word,  -1,          0,             /* word - a Perl extension */
-  cbit_xdigit,-1,          0              /* xdigit */
-};
-
-/* Table of substitutes for \d etc when PCRE_UCP is set. They are replaced by
-Unicode property escapes. */
-
-#ifdef SUPPORT_UCP
-static const pcre_uchar string_PNd[]  = {
-  CHAR_BACKSLASH, CHAR_P, CHAR_LEFT_CURLY_BRACKET,
-  CHAR_N, CHAR_d, CHAR_RIGHT_CURLY_BRACKET, '\0' };
-static const pcre_uchar string_pNd[]  = {
-  CHAR_BACKSLASH, CHAR_p, CHAR_LEFT_CURLY_BRACKET,
-  CHAR_N, CHAR_d, CHAR_RIGHT_CURLY_BRACKET, '\0' };
-static const pcre_uchar string_PXsp[] = {
-  CHAR_BACKSLASH, CHAR_P, CHAR_LEFT_CURLY_BRACKET,
-  CHAR_X, CHAR_s, CHAR_p, CHAR_RIGHT_CURLY_BRACKET, '\0' };
-static const pcre_uchar string_pXsp[] = {
-  CHAR_BACKSLASH, CHAR_p, CHAR_LEFT_CURLY_BRACKET,
-  CHAR_X, CHAR_s, CHAR_p, CHAR_RIGHT_CURLY_BRACKET, '\0' };
-static const pcre_uchar string_PXwd[] = {
-  CHAR_BACKSLASH, CHAR_P, CHAR_LEFT_CURLY_BRACKET,
-  CHAR_X, CHAR_w, CHAR_d, CHAR_RIGHT_CURLY_BRACKET, '\0' };
-static const pcre_uchar string_pXwd[] = {
-  CHAR_BACKSLASH, CHAR_p, CHAR_LEFT_CURLY_BRACKET,
-  CHAR_X, CHAR_w, CHAR_d, CHAR_RIGHT_CURLY_BRACKET, '\0' };
-
-static const pcre_uchar *substitutes[] = {
-  string_PNd,           /* \D */
-  string_pNd,           /* \d */
-  string_PXsp,          /* \S */   /* Xsp is Perl space, but from 8.34, Perl */
-  string_pXsp,          /* \s */   /* space and POSIX space are the same. */
-  string_PXwd,          /* \W */
-  string_pXwd           /* \w */
-};
-
-/* The POSIX class substitutes must be in the order of the POSIX class names,
-defined above, and there are both positive and negative cases. NULL means no
-general substitute of a Unicode property escape (\p or \P). However, for some
-POSIX classes (e.g. graph, print, punct) a special property code is compiled
-directly. */
-
-static const pcre_uchar string_pL[] =   {
-  CHAR_BACKSLASH, CHAR_p, CHAR_LEFT_CURLY_BRACKET,
-  CHAR_L, CHAR_RIGHT_CURLY_BRACKET, '\0' };
-static const pcre_uchar string_pLl[] =  {
-  CHAR_BACKSLASH, CHAR_p, CHAR_LEFT_CURLY_BRACKET,
-  CHAR_L, CHAR_l, CHAR_RIGHT_CURLY_BRACKET, '\0' };
-static const pcre_uchar string_pLu[] =  {
-  CHAR_BACKSLASH, CHAR_p, CHAR_LEFT_CURLY_BRACKET,
-  CHAR_L, CHAR_u, CHAR_RIGHT_CURLY_BRACKET, '\0' };
-static const pcre_uchar string_pXan[] = {
-  CHAR_BACKSLASH, CHAR_p, CHAR_LEFT_CURLY_BRACKET,
-  CHAR_X, CHAR_a, CHAR_n, CHAR_RIGHT_CURLY_BRACKET, '\0' };
-static const pcre_uchar string_h[] =    {
-  CHAR_BACKSLASH, CHAR_h, '\0' };
-static const pcre_uchar string_pXps[] = {
-  CHAR_BACKSLASH, CHAR_p, CHAR_LEFT_CURLY_BRACKET,
-  CHAR_X, CHAR_p, CHAR_s, CHAR_RIGHT_CURLY_BRACKET, '\0' };
-static const pcre_uchar string_PL[] =   {
-  CHAR_BACKSLASH, CHAR_P, CHAR_LEFT_CURLY_BRACKET,
-  CHAR_L, CHAR_RIGHT_CURLY_BRACKET, '\0' };
-static const pcre_uchar string_PLl[] =  {
-  CHAR_BACKSLASH, CHAR_P, CHAR_LEFT_CURLY_BRACKET,
-  CHAR_L, CHAR_l, CHAR_RIGHT_CURLY_BRACKET, '\0' };
-static const pcre_uchar string_PLu[] =  {
-  CHAR_BACKSLASH, CHAR_P, CHAR_LEFT_CURLY_BRACKET,
-  CHAR_L, CHAR_u, CHAR_RIGHT_CURLY_BRACKET, '\0' };
-static const pcre_uchar string_PXan[] = {
-  CHAR_BACKSLASH, CHAR_P, CHAR_LEFT_CURLY_BRACKET,
-  CHAR_X, CHAR_a, CHAR_n, CHAR_RIGHT_CURLY_BRACKET, '\0' };
-static const pcre_uchar string_H[] =    {
-  CHAR_BACKSLASH, CHAR_H, '\0' };
-static const pcre_uchar string_PXps[] = {
-  CHAR_BACKSLASH, CHAR_P, CHAR_LEFT_CURLY_BRACKET,
-  CHAR_X, CHAR_p, CHAR_s, CHAR_RIGHT_CURLY_BRACKET, '\0' };
-
-static const pcre_uchar *posix_substitutes[] = {
-  string_pL,            /* alpha */
-  string_pLl,           /* lower */
-  string_pLu,           /* upper */
-  string_pXan,          /* alnum */
-  NULL,                 /* ascii */
-  string_h,             /* blank */
-  NULL,                 /* cntrl */
-  string_pNd,           /* digit */
-  NULL,                 /* graph */
-  NULL,                 /* print */
-  NULL,                 /* punct */
-  string_pXps,          /* space */   /* Xps is POSIX space, but from 8.34 */
-  string_pXwd,          /* word  */   /* Perl and POSIX space are the same */
-  NULL,                 /* xdigit */
-  /* Negated cases */
-  string_PL,            /* ^alpha */
-  string_PLl,           /* ^lower */
-  string_PLu,           /* ^upper */
-  string_PXan,          /* ^alnum */
-  NULL,                 /* ^ascii */
-  string_H,             /* ^blank */
-  NULL,                 /* ^cntrl */
-  string_PNd,           /* ^digit */
-  NULL,                 /* ^graph */
-  NULL,                 /* ^print */
-  NULL,                 /* ^punct */
-  string_PXps,          /* ^space */  /* Xps is POSIX space, but from 8.34 */
-  string_PXwd,          /* ^word */   /* Perl and POSIX space are the same */
-  NULL                  /* ^xdigit */
-};
-#define POSIX_SUBSIZE (sizeof(posix_substitutes) / sizeof(pcre_uchar *))
-#endif
-
-#define STRING(a)  # a
-#define XSTRING(s) STRING(s)
-
-/* The texts of compile-time error messages. These are "char *" because they
-are passed to the outside world. Do not ever re-use any error number, because
-they are documented. Always add a new error instead. Messages marked DEAD below
-are no longer used. This used to be a table of strings, but in order to reduce
-the number of relocations needed when a shared library is loaded dynamically,
-it is now one long string. We cannot use a table of offsets, because the
-lengths of inserts such as XSTRING(MAX_NAME_SIZE) are not known. Instead, we
-simply count through to the one we want - this isn't a performance issue
-because these strings are used only when there is a compilation error.
-
-Each substring ends with \0 to insert a null character. This includes the final
-substring, so that the whole string ends with \0\0, which can be detected when
-counting through. */
-
-static const char error_texts[] =
-  "no error\0"
-  "\\ at end of pattern\0"
-  "\\c at end of pattern\0"
-  "unrecognized character follows \\\0"
-  "numbers out of order in {} quantifier\0"
-  /* 5 */
-  "number too big in {} quantifier\0"
-  "missing terminating ] for character class\0"
-  "invalid escape sequence in character class\0"
-  "range out of order in character class\0"
-  "nothing to repeat\0"
-  /* 10 */
-  "internal error: invalid forward reference offset\0"
-  "internal error: unexpected repeat\0"
-  "unrecognized character after (? or (?-\0"
-  "POSIX named classes are supported only within a class\0"
-  "missing )\0"
-  /* 15 */
-  "reference to non-existent subpattern\0"
-  "erroffset passed as NULL\0"
-  "unknown option bit(s) set\0"
-  "missing ) after comment\0"
-  "parentheses nested too deeply\0"  /** DEAD **/
-  /* 20 */
-  "regular expression is too large\0"
-  "failed to get memory\0"
-  "unmatched parentheses\0"
-  "internal error: code overflow\0"
-  "unrecognized character after (?<\0"
-  /* 25 */
-  "lookbehind assertion is not fixed length\0"
-  "malformed number or name after (?(\0"
-  "conditional group contains more than two branches\0"
-  "assertion expected after (?(\0"
-  "(?R or (?[+-]digits must be followed by )\0"
-  /* 30 */
-  "unknown POSIX class name\0"
-  "POSIX collating elements are not supported\0"
-  "this version of PCRE is compiled without UTF support\0"
-  "spare error\0"  /** DEAD **/
-  "character value in \\x{} or \\o{} is too large\0"
-  /* 35 */
-  "invalid condition (?(0)\0"
-  "\\C not allowed in lookbehind assertion\0"
-  "PCRE does not support \\L, \\l, \\N{name}, \\U, or \\u\0"
-  "number after (?C is > 255\0"
-  "closing ) for (?C expected\0"
-  /* 40 */
-  "recursive call could loop indefinitely\0"
-  "unrecognized character after (?P\0"
-  "syntax error in subpattern name (missing terminator)\0"
-  "two named subpatterns have the same name\0"
-  "invalid UTF-8 string\0"
-  /* 45 */
-  "support for \\P, \\p, and \\X has not been compiled\0"
-  "malformed \\P or \\p sequence\0"
-  "unknown property name after \\P or \\p\0"
-  "subpattern name is too long (maximum " XSTRING(MAX_NAME_SIZE) " characters)\0"
-  "too many named subpatterns (maximum " XSTRING(MAX_NAME_COUNT) ")\0"
-  /* 50 */
-  "repeated subpattern is too long\0"    /** DEAD **/
-  "octal value is greater than \\377 in 8-bit non-UTF-8 mode\0"
-  "internal error: overran compiling workspace\0"
-  "internal error: previously-checked referenced subpattern not found\0"
-  "DEFINE group contains more than one branch\0"
-  /* 55 */
-  "repeating a DEFINE group is not allowed\0"  /** DEAD **/
-  "inconsistent NEWLINE options\0"
-  "\\g is not followed by a braced, angle-bracketed, or quoted name/number or by a plain number\0"
-  "a numbered reference must not be zero\0"
-  "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)\0"
-  /* 60 */
-  "(*VERB) not recognized or malformed\0"
-  "number is too big\0"
-  "subpattern name expected\0"
-  "digit expected after (?+\0"
-  "] is an invalid data character in JavaScript compatibility mode\0"
-  /* 65 */
-  "different names for subpatterns of the same number are not allowed\0"
-  "(*MARK) must have an argument\0"
-  "this version of PCRE is not compiled with Unicode property support\0"
-#ifndef EBCDIC
-  "\\c must be followed by an ASCII character\0"
-#else
-  "\\c must be followed by a letter or one of [\\]^_?\0"
-#endif
-  "\\k is not followed by a braced, angle-bracketed, or quoted name\0"
-  /* 70 */
-  "internal error: unknown opcode in find_fixedlength()\0"
-  "\\N is not supported in a class\0"
-  "too many forward references\0"
-  "disallowed Unicode code point (>= 0xd800 && <= 0xdfff)\0"
-  "invalid UTF-16 string\0"
-  /* 75 */
-  "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)\0"
-  "character value in \\u.... sequence is too large\0"
-  "invalid UTF-32 string\0"
-  "setting UTF is disabled by the application\0"
-  "non-hex character in \\x{} (closing brace missing?)\0"
-  /* 80 */
-  "non-octal character in \\o{} (closing brace missing?)\0"
-  "missing opening brace after \\o\0"
-  "parentheses are too deeply nested\0"
-  "invalid range in character class\0"
-  "group name must start with a non-digit\0"
-  /* 85 */
-  "parentheses are too deeply nested (stack check)\0"
-  "digits missing in \\x{} or \\o{}\0"
-  ;
-
-/* 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. */
-
-/* Using a simple comparison for decimal numbers rather than a memory read
-is much faster, and the resulting code is simpler (the compiler turns it
-into a subtraction and unsigned comparison). */
-
-#define IS_DIGIT(x) ((x) >= CHAR_0 && (x) <= CHAR_9)
-
-#ifndef EBCDIC
-
-/* This is the "normal" case, for ASCII systems, and EBCDIC systems running in
-UTF-8 mode. */
-
-static const pcre_uint8 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 not running in UTF-8 mode. */
-
-static const pcre_uint8 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- 95    */
-  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 pcre_uint8 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- 95 */
-  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
-
-
-/* This table is used to check whether auto-possessification is possible
-between adjacent character-type opcodes. The left-hand (repeated) opcode is
-used to select the row, and the right-hand opcode is use to select the column.
-A value of 1 means that auto-possessification is OK. For example, the second
-value in the first row means that \D+\d can be turned into \D++\d.
-
-The Unicode property types (\P and \p) have to be present to fill out the table
-because of what their opcode values are, but the table values should always be
-zero because property types are handled separately in the code. The last four
-columns apply to items that cannot be repeated, so there is no need to have
-rows for them. Note that OP_DIGIT etc. are generated only when PCRE_UCP is
-*not* set. When it is set, \d etc. are converted into OP_(NOT_)PROP codes. */
-
-#define APTROWS (LAST_AUTOTAB_LEFT_OP - FIRST_AUTOTAB_OP + 1)
-#define APTCOLS (LAST_AUTOTAB_RIGHT_OP - FIRST_AUTOTAB_OP + 1)
-
-static const pcre_uint8 autoposstab[APTROWS][APTCOLS] = {
-/* \D \d \S \s \W \w  . .+ \C \P \p \R \H \h \V \v \X \Z \z  $ $M */
-  { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 },  /* \D */
-  { 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1 },  /* \d */
-  { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1 },  /* \S */
-  { 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 },  /* \s */
-  { 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 },  /* \W */
-  { 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1 },  /* \w */
-  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0 },  /* .  */
-  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 },  /* .+ */
-  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 },  /* \C */
-  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },  /* \P */
-  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },  /* \p */
-  { 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0 },  /* \R */
-  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0 },  /* \H */
-  { 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0 },  /* \h */
-  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0 },  /* \V */
-  { 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0 },  /* \v */
-  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 }   /* \X */
-};
-
-
-/* This table is used to check whether auto-possessification is possible
-between adjacent Unicode property opcodes (OP_PROP and OP_NOTPROP). The
-left-hand (repeated) opcode is used to select the row, and the right-hand
-opcode is used to select the column. The values are as follows:
-
-  0   Always return FALSE (never auto-possessify)
-  1   Character groups are distinct (possessify if both are OP_PROP)
-  2   Check character categories in the same group (general or particular)
-  3   TRUE if the two opcodes are not the same (PROP vs NOTPROP)
-
-  4   Check left general category vs right particular category
-  5   Check right general category vs left particular category
-
-  6   Left alphanum vs right general category
-  7   Left space vs right general category
-  8   Left word vs right general category
-
-  9   Right alphanum vs left general category
- 10   Right space vs left general category
- 11   Right word vs left general category
-
- 12   Left alphanum vs right particular category
- 13   Left space vs right particular category
- 14   Left word vs right particular category
-
- 15   Right alphanum vs left particular category
- 16   Right space vs left particular category
- 17   Right word vs left particular category
-*/
-
-static const pcre_uint8 propposstab[PT_TABSIZE][PT_TABSIZE] = {
-/* ANY LAMP GC  PC  SC ALNUM SPACE PXSPACE WORD CLIST UCNC */
-  { 0,  0,  0,  0,  0,    0,    0,      0,   0,    0,   0 },  /* PT_ANY */
-  { 0,  3,  0,  0,  0,    3,    1,      1,   0,    0,   0 },  /* PT_LAMP */
-  { 0,  0,  2,  4,  0,    9,   10,     10,  11,    0,   0 },  /* PT_GC */
-  { 0,  0,  5,  2,  0,   15,   16,     16,  17,    0,   0 },  /* PT_PC */
-  { 0,  0,  0,  0,  2,    0,    0,      0,   0,    0,   0 },  /* PT_SC */
-  { 0,  3,  6, 12,  0,    3,    1,      1,   0,    0,   0 },  /* PT_ALNUM */
-  { 0,  1,  7, 13,  0,    1,    3,      3,   1,    0,   0 },  /* PT_SPACE */
-  { 0,  1,  7, 13,  0,    1,    3,      3,   1,    0,   0 },  /* PT_PXSPACE */
-  { 0,  0,  8, 14,  0,    0,    1,      1,   3,    0,   0 },  /* PT_WORD */
-  { 0,  0,  0,  0,  0,    0,    0,      0,   0,    0,   0 },  /* PT_CLIST */
-  { 0,  0,  0,  0,  0,    0,    0,      0,   0,    0,   3 }   /* PT_UCNC */
-};
-
-/* This table is used to check whether auto-possessification is possible
-between adjacent Unicode property opcodes (OP_PROP and OP_NOTPROP) when one
-specifies a general category and the other specifies a particular category. The
-row is selected by the general category and the column by the particular
-category. The value is 1 if the particular category is not part of the general
-category. */
-
-static const pcre_uint8 catposstab[7][30] = {
-/* Cc Cf Cn Co Cs Ll Lm Lo Lt Lu Mc Me Mn Nd Nl No Pc Pd Pe Pf Pi Po Ps Sc Sk Sm So Zl Zp Zs */
-  { 0, 0, 0, 0, 0, 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 },  /* C */
-  { 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },  /* L */
-  { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },  /* M */
-  { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },  /* N */
-  { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1 },  /* P */
-  { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1 },  /* S */
-  { 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, 0, 0, 0 }   /* Z */
-};
-
-/* This table is used when checking ALNUM, (PX)SPACE, SPACE, and WORD against
-a general or particular category. The properties in each row are those
-that apply to the character set in question. Duplication means that a little
-unnecessary work is done when checking, but this keeps things much simpler
-because they can all use the same code. For more details see the comment where
-this table is used.
-
-Note: SPACE and PXSPACE used to be different because Perl excluded VT from
-"space", but from Perl 5.18 it's included, so both categories are treated the
-same here. */
-
-static const pcre_uint8 posspropstab[3][4] = {
-  { ucp_L, ucp_N, ucp_N, ucp_Nl },  /* ALNUM, 3rd and 4th values redundant */
-  { ucp_Z, ucp_Z, ucp_C, ucp_Cc },  /* SPACE and PXSPACE, 2nd value redundant */
-  { ucp_L, ucp_N, ucp_P, ucp_Po }   /* WORD */
-};
-
-/* This table is used when converting repeating opcodes into possessified
-versions as a result of an explicit possessive quantifier such as ++. A zero
-value means there is no possessified version - in those cases the item in
-question must be wrapped in ONCE brackets. The table is truncated at OP_CALLOUT
-because all relevant opcodes are less than that. */
-
-static const pcre_uint8 opcode_possessify[] = {
-  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   /* 0 - 15  */
-  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   /* 16 - 31 */
-
-  0,                       /* NOTI */
-  OP_POSSTAR, 0,           /* STAR, MINSTAR */
-  OP_POSPLUS, 0,           /* PLUS, MINPLUS */
-  OP_POSQUERY, 0,          /* QUERY, MINQUERY */
-  OP_POSUPTO, 0,           /* UPTO, MINUPTO */
-  0,                       /* EXACT */
-  0, 0, 0, 0,              /* POS{STAR,PLUS,QUERY,UPTO} */
-
-  OP_POSSTARI, 0,          /* STARI, MINSTARI */
-  OP_POSPLUSI, 0,          /* PLUSI, MINPLUSI */
-  OP_POSQUERYI, 0,         /* QUERYI, MINQUERYI */
-  OP_POSUPTOI, 0,          /* UPTOI, MINUPTOI */
-  0,                       /* EXACTI */
-  0, 0, 0, 0,              /* POS{STARI,PLUSI,QUERYI,UPTOI} */
-
-  OP_NOTPOSSTAR, 0,        /* NOTSTAR, NOTMINSTAR */
-  OP_NOTPOSPLUS, 0,        /* NOTPLUS, NOTMINPLUS */
-  OP_NOTPOSQUERY, 0,       /* NOTQUERY, NOTMINQUERY */
-  OP_NOTPOSUPTO, 0,        /* NOTUPTO, NOTMINUPTO */
-  0,                       /* NOTEXACT */
-  0, 0, 0, 0,              /* NOTPOS{STAR,PLUS,QUERY,UPTO} */
-
-  OP_NOTPOSSTARI, 0,       /* NOTSTARI, NOTMINSTARI */
-  OP_NOTPOSPLUSI, 0,       /* NOTPLUSI, NOTMINPLUSI */
-  OP_NOTPOSQUERYI, 0,      /* NOTQUERYI, NOTMINQUERYI */
-  OP_NOTPOSUPTOI, 0,       /* NOTUPTOI, NOTMINUPTOI */
-  0,                       /* NOTEXACTI */
-  0, 0, 0, 0,              /* NOTPOS{STARI,PLUSI,QUERYI,UPTOI} */
-
-  OP_TYPEPOSSTAR, 0,       /* TYPESTAR, TYPEMINSTAR */
-  OP_TYPEPOSPLUS, 0,       /* TYPEPLUS, TYPEMINPLUS */
-  OP_TYPEPOSQUERY, 0,      /* TYPEQUERY, TYPEMINQUERY */
-  OP_TYPEPOSUPTO, 0,       /* TYPEUPTO, TYPEMINUPTO */
-  0,                       /* TYPEEXACT */
-  0, 0, 0, 0,              /* TYPEPOS{STAR,PLUS,QUERY,UPTO} */
-
-  OP_CRPOSSTAR, 0,         /* CRSTAR, CRMINSTAR */
-  OP_CRPOSPLUS, 0,         /* CRPLUS, CRMINPLUS */
-  OP_CRPOSQUERY, 0,        /* CRQUERY, CRMINQUERY */
-  OP_CRPOSRANGE, 0,        /* CRRANGE, CRMINRANGE */
-  0, 0, 0, 0,              /* CRPOS{STAR,PLUS,QUERY,RANGE} */
-
-  0, 0, 0,                 /* CLASS, NCLASS, XCLASS */
-  0, 0,                    /* REF, REFI */
-  0, 0,                    /* DNREF, DNREFI */
-  0, 0                     /* RECURSE, CALLOUT */
-};
-
-
-
-/*************************************************
-*            Find an error text                  *
-*************************************************/
-
-/* The error texts are now all in one long string, to save on relocations. As
-some of the text is of unknown length, we can't use a table of offsets.
-Instead, just count through the strings. This is not a performance issue
-because it happens only when there has been a compilation error.
-
-Argument:   the error number
-Returns:    pointer to the error string
-*/
-
-static const char *
-find_error_text(int n)
-{
-const char *s = error_texts;
-for (; n > 0; n--)
-  {
-  while (*s++ != CHAR_NULL) {};
-  if (*s == CHAR_NULL) return "Error text not found (please report)";
-  }
-return s;
-}
-
-
-
-/*************************************************
-*           Expand the workspace                 *
-*************************************************/
-
-/* This function is called during the second compiling phase, if the number of
-forward references fills the existing workspace, which is originally a block on
-the stack. A larger block is obtained from malloc() unless the ultimate limit
-has been reached or the increase will be rather small.
-
-Argument: pointer to the compile data block
-Returns:  0 if all went well, else an error number
-*/
-
-static int
-expand_workspace(compile_data *cd)
-{
-pcre_uchar *newspace;
-int newsize = cd->workspace_size * 2;
-
-if (newsize > COMPILE_WORK_SIZE_MAX) newsize = COMPILE_WORK_SIZE_MAX;
-if (cd->workspace_size >= COMPILE_WORK_SIZE_MAX ||
-    newsize - cd->workspace_size < WORK_SIZE_SAFETY_MARGIN)
- return ERR72;
-
-newspace = (PUBL(malloc))(IN_UCHARS(newsize));
-if (newspace == NULL) return ERR21;
-memcpy(newspace, cd->start_workspace, cd->workspace_size * sizeof(pcre_uchar));
-cd->hwm = (pcre_uchar *)newspace + (cd->hwm - cd->start_workspace);
-if (cd->workspace_size > COMPILE_WORK_SIZE)
-  (PUBL(free))((void *)cd->start_workspace);
-cd->start_workspace = newspace;
-cd->workspace_size = newsize;
-return 0;
-}
-
-
-
-/*************************************************
-*            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 pcre_uchar *p)
-{
-if (!IS_DIGIT(*p)) return FALSE;
-p++;
-while (IS_DIGIT(*p)) p++;
-if (*p == CHAR_RIGHT_CURLY_BRACKET) return TRUE;
-
-if (*p++ != CHAR_COMMA) return FALSE;
-if (*p == CHAR_RIGHT_CURLY_BRACKET) return TRUE;
-
-if (!IS_DIGIT(*p)) return FALSE;
-p++;
-while (IS_DIGIT(*p)) p++;
-
-return (*p == CHAR_RIGHT_CURLY_BRACKET);
-}
-
-
-
-/*************************************************
-*            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 0 for a data character which
-will be placed in chptr. A backreference to group n is returned as negative n.
-When UTF-8 is enabled, a positive value greater than 255 may be returned in
-chptr. 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
-  chptr          points to a returned data character
-  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 => a data character
-                 positive => a special escape sequence
-                 negative => a back reference
-                 on error, errorcodeptr is set
-*/
-
-static int
-check_escape(const pcre_uchar **ptrptr, pcre_uint32 *chptr, int *errorcodeptr,
-  int bracount, int options, BOOL isclass)
-{
-/* PCRE_UTF16 has the same value as PCRE_UTF8. */
-BOOL utf = (options & PCRE_UTF8) != 0;
-const pcre_uchar *ptr = *ptrptr + 1;
-pcre_uint32 c;
-int escape = 0;
-int i;
-
-GETCHARINCTEST(c, ptr);           /* Get character value, increment pointer */
-ptr--;                            /* Set pointer back to the last byte */
-
-/* If backslash is at the end of the pattern, it's an error. */
-
-if (c == CHAR_NULL) *errorcodeptr = ERR1;
-
-/* Non-alphanumerics 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. */
-
-#ifndef EBCDIC  /* ASCII/UTF-8 coding */
-/* Not alphanumeric */
-else if (c < CHAR_0 || c > CHAR_z) {}
-else if ((i = escapes[c - CHAR_0]) != 0)
-  { if (i > 0) c = (pcre_uint32)i; else escape = -i; }
-
-#else           /* EBCDIC coding */
-/* Not alphanumeric */
-else if (c < CHAR_a || (!MAX_255(c) || (ebcdic_chartab[c] & 0x0E) == 0)) {}
-else if ((i = escapes[c - 0x48]) != 0)  { if (i > 0) c = (pcre_uint32)i; else escape = -i; }
-#endif
-
-/* Escapes that need further processing, or are illegal. */
-
-else
-  {
-  const pcre_uchar *oldptr;
-  BOOL braced, negated, overflow;
-  int s;
-
-  switch (c)
-    {
-    /* A number of Perl escapes are not handled by PCRE. We give an explicit
-    error. */
-
-    case CHAR_l:
-    case CHAR_L:
-    *errorcodeptr = ERR37;
-    break;
-
-    case CHAR_u:
-    if ((options & PCRE_JAVASCRIPT_COMPAT) != 0)
-      {
-      /* In JavaScript, \u must be followed by four hexadecimal numbers.
-      Otherwise it is a lowercase u letter. */
-      if (MAX_255(ptr[1]) && (digitab[ptr[1]] & ctype_xdigit) != 0
-        && MAX_255(ptr[2]) && (digitab[ptr[2]] & ctype_xdigit) != 0
-        && MAX_255(ptr[3]) && (digitab[ptr[3]] & ctype_xdigit) != 0
-        && MAX_255(ptr[4]) && (digitab[ptr[4]] & ctype_xdigit) != 0)
-        {
-        c = 0;
-        for (i = 0; i < 4; ++i)
-          {
-          register pcre_uint32 cc = *(++ptr);
-#ifndef EBCDIC  /* ASCII/UTF-8 coding */
-          if (cc >= CHAR_a) cc -= 32;               /* Convert to upper case */
-          c = (c << 4) + cc - ((cc < CHAR_A)? CHAR_0 : (CHAR_A - 10));
-#else           /* EBCDIC coding */
-          if (cc >= CHAR_a && cc <= CHAR_z) cc += 64;  /* Convert to upper case */
-          c = (c << 4) + cc - ((cc >= CHAR_0)? CHAR_0 : (CHAR_A - 10));
-#endif
-          }
-
-#if defined COMPILE_PCRE8
-        if (c > (utf ? 0x10ffffU : 0xffU))
-#elif defined COMPILE_PCRE16
-        if (c > (utf ? 0x10ffffU : 0xffffU))
-#elif defined COMPILE_PCRE32
-        if (utf && c > 0x10ffffU)
-#endif
-          {
-          *errorcodeptr = ERR76;
-          }
-        else if (utf && c >= 0xd800 && c <= 0xdfff) *errorcodeptr = ERR73;
-        }
-      }
-    else
-      *errorcodeptr = ERR37;
-    break;
-
-    case CHAR_U:
-    /* In JavaScript, \U is an uppercase U letter. */
-    if ((options & PCRE_JAVASCRIPT_COMPAT) == 0) *errorcodeptr = ERR37;
-    break;
-
-    /* In a character class, \g is just a literal "g". Outside a character
-    class, \g must be followed by one of a number of specific things:
-
-    (1) A number, either plain or braced. If positive, it is an absolute
-    backreference. If negative, it is a relative backreference. This is a Perl
-    5.10 feature.
-
-    (2) Perl 5.10 also supports \g{name} as a reference to a named group. This
-    is part of Perl's movement towards a unified syntax for back references. As
-    this is synonymous with \k{name}, we fudge it up by pretending it really
-    was \k.
-
-    (3) For Oniguruma compatibility we also support \g followed by a name or a
-    number either in angle brackets or in single quotes. However, these are
-    (possibly recursive) subroutine calls, _not_ backreferences. Just return
-    the ESC_g code (cf \k). */
-
-    case CHAR_g:
-    if (isclass) break;
-    if (ptr[1] == CHAR_LESS_THAN_SIGN || ptr[1] == CHAR_APOSTROPHE)
-      {
-      escape = ESC_g;
-      break;
-      }
-
-    /* Handle the Perl-compatible cases */
-
-    if (ptr[1] == CHAR_LEFT_CURLY_BRACKET)
-      {
-      const pcre_uchar *p;
-      for (p = ptr+2; *p != CHAR_NULL && *p != CHAR_RIGHT_CURLY_BRACKET; p++)
-        if (*p != CHAR_MINUS && !IS_DIGIT(*p)) break;
-      if (*p != CHAR_NULL && *p != CHAR_RIGHT_CURLY_BRACKET)
-        {
-        escape = ESC_k;
-        break;
-        }
-      braced = TRUE;
-      ptr++;
-      }
-    else braced = FALSE;
-
-    if (ptr[1] == CHAR_MINUS)
-      {
-      negated = TRUE;
-      ptr++;
-      }
-    else negated = FALSE;
-
-    /* The integer range is limited by the machine's int representation. */
-    s = 0;
-    overflow = FALSE;
-    while (IS_DIGIT(ptr[1]))
-      {
-      if (s > INT_MAX / 10 - 1) /* Integer overflow */
-        {
-        overflow = TRUE;
-        break;
-        }
-      s = s * 10 + (int)(*(++ptr) - CHAR_0);
-      }
-    if (overflow) /* Integer overflow */
-      {
-      while (IS_DIGIT(ptr[1]))
-        ptr++;
-      *errorcodeptr = ERR61;
-      break;
-      }
-
-    if (braced && *(++ptr) != CHAR_RIGHT_CURLY_BRACKET)
-      {
-      *errorcodeptr = ERR57;
-      break;
-      }
-
-    if (s == 0)
-      {
-      *errorcodeptr = ERR58;
-      break;
-      }
-
-    if (negated)
-      {
-      if (s > bracount)
-        {
-        *errorcodeptr = ERR15;
-        break;
-        }
-      s = bracount - (s - 1);
-      }
-
-    escape = -s;
-    break;
-
-    /* The handling of escape sequences consisting of a string of digits
-    starting with one that is not zero is not straightforward. Perl has changed
-    over the years. Nowadays \g{} for backreferences and \o{} for octal are
-    recommended to avoid the ambiguities in the old syntax.
-
-    Outside a character class, the digits are read as a decimal number. If the
-    number is less than 8 (used to be 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. \8 and \9 are treated as the literal characters 8 and 9.
-
-    Inside a character class, \ followed by a digit is always either a literal
-    8 or 9 or an octal number. */
-
-    case CHAR_1: case CHAR_2: case CHAR_3: case CHAR_4: case CHAR_5:
-    case CHAR_6: case CHAR_7: case CHAR_8: case CHAR_9:
-
-    if (!isclass)
-      {
-      oldptr = ptr;
-      /* The integer range is limited by the machine's int representation. */
-      s = (int)(c -CHAR_0);
-      overflow = FALSE;
-      while (IS_DIGIT(ptr[1]))
-        {
-        if (s > INT_MAX / 10 - 1) /* Integer overflow */
-          {
-          overflow = TRUE;
-          break;
-          }
-        s = s * 10 + (int)(*(++ptr) - CHAR_0);
-        }
-      if (overflow) /* Integer overflow */
-        {
-        while (IS_DIGIT(ptr[1]))
-          ptr++;
-        *errorcodeptr = ERR61;
-        break;
-        }
-      if (s < 8 || s <= bracount)  /* Check for back reference */
-        {
-        escape = -s;
-        break;
-        }
-      ptr = oldptr;      /* Put the pointer back and fall through */
-      }
-
-    /* Handle a digit following \ when the number is not a back reference. If
-    the first digit is 8 or 9, Perl used to generate a binary zero byte and
-    then treat the digit as a following literal. At least by Perl 5.18 this
-    changed so as not to insert the binary zero. */
-
-    if ((c = *ptr) >= CHAR_8) break;
-
-    /* Fall through with a digit less than 8 */
-
-    /* \0 always starts an octal number, but we may drop through to here with a
-    larger first octal digit. The original code used just to take the least
-    significant 8 bits of octal numbers (I think this is what early Perls used
-    to do). Nowadays we allow for larger numbers in UTF-8 mode and 16-bit mode,
-    but no more than 3 octal digits. */
-
-    case CHAR_0:
-    c -= CHAR_0;
-    while(i++ < 2 && ptr[1] >= CHAR_0 && ptr[1] <= CHAR_7)
-        c = c * 8 + *(++ptr) - CHAR_0;
-#ifdef COMPILE_PCRE8
-    if (!utf && c > 0xff) *errorcodeptr = ERR51;
-#endif
-    break;
-
-    /* \o is a relatively new Perl feature, supporting a more general way of
-    specifying character codes in octal. The only supported form is \o{ddd}. */
-
-    case CHAR_o:
-    if (ptr[1] != CHAR_LEFT_CURLY_BRACKET) *errorcodeptr = ERR81; else
-    if (ptr[2] == CHAR_RIGHT_CURLY_BRACKET) *errorcodeptr = ERR86; else
-      {
-      ptr += 2;
-      c = 0;
-      overflow = FALSE;
-      while (*ptr >= CHAR_0 && *ptr <= CHAR_7)
-        {
-        register pcre_uint32 cc = *ptr++;
-        if (c == 0 && cc == CHAR_0) continue;     /* Leading zeroes */
-#ifdef COMPILE_PCRE32
-        if (c >= 0x20000000l) { overflow = TRUE; break; }
-#endif
-        c = (c << 3) + cc - CHAR_0 ;
-#if defined COMPILE_PCRE8
-        if (c > (utf ? 0x10ffffU : 0xffU)) { overflow = TRUE; break; }
-#elif defined COMPILE_PCRE16
-        if (c > (utf ? 0x10ffffU : 0xffffU)) { overflow = TRUE; break; }
-#elif defined COMPILE_PCRE32
-        if (utf && c > 0x10ffffU) { overflow = TRUE; break; }
-#endif
-        }
-      if (overflow)
-        {
-        while (*ptr >= CHAR_0 && *ptr <= CHAR_7) ptr++;
-        *errorcodeptr = ERR34;
-        }
-      else if (*ptr == CHAR_RIGHT_CURLY_BRACKET)
-        {
-        if (utf && c >= 0xd800 && c <= 0xdfff) *errorcodeptr = ERR73;
-        }
-      else *errorcodeptr = ERR80;
-      }
-    break;
-
-    /* \x is complicated. In JavaScript, \x must be followed by two hexadecimal
-    numbers. Otherwise it is a lowercase x letter. */
-
-    case CHAR_x:
-    if ((options & PCRE_JAVASCRIPT_COMPAT) != 0)
-      {
-      if (MAX_255(ptr[1]) && (digitab[ptr[1]] & ctype_xdigit) != 0
-        && MAX_255(ptr[2]) && (digitab[ptr[2]] & ctype_xdigit) != 0)
-        {
-        c = 0;
-        for (i = 0; i < 2; ++i)
-          {
-          register pcre_uint32 cc = *(++ptr);
-#ifndef EBCDIC  /* ASCII/UTF-8 coding */
-          if (cc >= CHAR_a) cc -= 32;               /* Convert to upper case */
-          c = (c << 4) + cc - ((cc < CHAR_A)? CHAR_0 : (CHAR_A - 10));
-#else           /* EBCDIC coding */
-          if (cc >= CHAR_a && cc <= CHAR_z) cc += 64;  /* Convert to upper case */
-          c = (c << 4) + cc - ((cc >= CHAR_0)? CHAR_0 : (CHAR_A - 10));
-#endif
-          }
-        }
-      }    /* End JavaScript handling */
-
-    /* Handle \x in Perl's style. \x{ddd} is a character number which can be
-    greater than 0xff in utf or non-8bit mode, but only if the ddd are hex
-    digits. If not, { used to be treated as a data character. However, Perl
-    seems to read hex digits up to the first non-such, and ignore the rest, so
-    that, for example \x{zz} matches a binary zero. This seems crazy, so PCRE
-    now gives an error. */
-
-    else
-      {
-      if (ptr[1] == CHAR_LEFT_CURLY_BRACKET)
-        {
-        ptr += 2;
-        if (*ptr == CHAR_RIGHT_CURLY_BRACKET)
-          {
-          *errorcodeptr = ERR86;
-          break;
-          }
-        c = 0;
-        overflow = FALSE;
-        while (MAX_255(*ptr) && (digitab[*ptr] & ctype_xdigit) != 0)
-          {
-          register pcre_uint32 cc = *ptr++;
-          if (c == 0 && cc == CHAR_0) continue;     /* Leading zeroes */
-
-#ifdef COMPILE_PCRE32
-          if (c >= 0x10000000l) { overflow = TRUE; break; }
-#endif
-
-#ifndef EBCDIC  /* ASCII/UTF-8 coding */
-          if (cc >= CHAR_a) cc -= 32;               /* Convert to upper case */
-          c = (c << 4) + cc - ((cc < CHAR_A)? CHAR_0 : (CHAR_A - 10));
-#else           /* EBCDIC coding */
-          if (cc >= CHAR_a && cc <= CHAR_z) cc += 64;  /* Convert to upper case */
-          c = (c << 4) + cc - ((cc >= CHAR_0)? CHAR_0 : (CHAR_A - 10));
-#endif
-
-#if defined COMPILE_PCRE8
-          if (c > (utf ? 0x10ffffU : 0xffU)) { overflow = TRUE; break; }
-#elif defined COMPILE_PCRE16
-          if (c > (utf ? 0x10ffffU : 0xffffU)) { overflow = TRUE; break; }
-#elif defined COMPILE_PCRE32
-          if (utf && c > 0x10ffffU) { overflow = TRUE; break; }
-#endif
-          }
-
-        if (overflow)
-          {
-          while (MAX_255(*ptr) && (digitab[*ptr] & ctype_xdigit) != 0) ptr++;
-          *errorcodeptr = ERR34;
-          }
-
-        else if (*ptr == CHAR_RIGHT_CURLY_BRACKET)
-          {
-          if (utf && c >= 0xd800 && c <= 0xdfff) *errorcodeptr = ERR73;
-          }
-
-        /* If the sequence of hex digits does not end with '}', give an error.
-        We used just to recognize this construct and fall through to the normal
-        \x handling, but nowadays Perl gives an error, which seems much more
-        sensible, so we do too. */
-
-        else *errorcodeptr = ERR79;
-        }   /* End of \x{} processing */
-
-      /* Read a single-byte hex-defined char (up to two hex digits after \x) */
-
-      else
-        {
-        c = 0;
-        while (i++ < 2 && MAX_255(ptr[1]) && (digitab[ptr[1]] & ctype_xdigit) != 0)
-          {
-          pcre_uint32 cc;                          /* Some compilers don't like */
-          cc = *(++ptr);                           /* ++ in initializers */
-#ifndef EBCDIC  /* ASCII/UTF-8 coding */
-          if (cc >= CHAR_a) cc -= 32;              /* Convert to upper case */
-          c = c * 16 + cc - ((cc < CHAR_A)? CHAR_0 : (CHAR_A - 10));
-#else           /* EBCDIC coding */
-          if (cc <= CHAR_z) cc += 64;              /* Convert to upper case */
-          c = c * 16 + cc - ((cc >= CHAR_0)? CHAR_0 : (CHAR_A - 10));
-#endif
-          }
-        }     /* End of \xdd handling */
-      }       /* End of Perl-style \x handling */
-    break;
-
-    /* For \c, a following letter is upper-cased; then the 0x40 bit is flipped.
-    An error is given if the byte following \c is not an ASCII character. This
-    coding is ASCII-specific, but then the whole concept of \cx is
-    ASCII-specific. (However, an EBCDIC equivalent has now been added.) */
-
-    case CHAR_c:
-    c = *(++ptr);
-    if (c == CHAR_NULL)
-      {
-      *errorcodeptr = ERR2;
-      break;
-      }
-#ifndef EBCDIC    /* ASCII/UTF-8 coding */
-    if (c > 127)  /* Excludes all non-ASCII in either mode */
-      {
-      *errorcodeptr = ERR68;
-      break;
-      }
-    if (c >= CHAR_a && c <= CHAR_z) c -= 32;
-    c ^= 0x40;
-#else             /* EBCDIC coding */
-    if (c >= CHAR_a && c <= CHAR_z) c += 64;
-    if (c == CHAR_QUESTION_MARK)
-      c = ('\\' == 188 && '`' == 74)? 0x5f : 0xff;
-    else
-      {
-      for (i = 0; i < 32; i++)
-        {
-        if (c == ebcdic_escape_c[i]) break;
-        }
-      if (i < 32) c = i; else *errorcodeptr = ERR68;
-      }
-#endif
-    break;
-
-    /* PCRE_EXTRA enables extensions to Perl in the matter of escapes. Any
-    other alphanumeric 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;
-    }
-  }
-
-/* Perl supports \N{name} for character names, as well as plain \N for "not
-newline". PCRE does not support \N{name}. However, it does support
-quantification such as \N{2,3}. */
-
-if (escape == ESC_N && ptr[1] == CHAR_LEFT_CURLY_BRACKET &&
-     !is_counted_repeat(ptr+2))
-  *errorcodeptr = ERR37;
-
-/* If PCRE_UCP is set, we change the values for \d etc. */
-
-if ((options & PCRE_UCP) != 0 && escape >= ESC_D && escape <= ESC_w)
-  escape += (ESC_DU - ESC_D);
-
-/* Set the pointer to the final character before returning. */
-
-*ptrptr = ptr;
-*chptr = c;
-return escape;
-}
-
-
-
-#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
-  ptypeptr       points to an unsigned int that is set to the type value
-  pdataptr       points to an unsigned int that is set to the detailed property value
-  errorcodeptr   points to the error code variable
-
-Returns:         TRUE if the type value was found, or FALSE for an invalid type
-*/
-
-static BOOL
-get_ucp(const pcre_uchar **ptrptr, BOOL *negptr, unsigned int *ptypeptr,
-  unsigned int *pdataptr, int *errorcodeptr)
-{
-pcre_uchar c;
-int i, bot, top;
-const pcre_uchar *ptr = *ptrptr;
-pcre_uchar name[32];
-
-c = *(++ptr);
-if (c == CHAR_NULL) goto ERROR_RETURN;
-
-*negptr = FALSE;
-
-/* \P or \p can be followed by a name in {}, optionally preceded by ^ for
-negation. */
-
-if (c == CHAR_LEFT_CURLY_BRACKET)
-  {
-  if (ptr[1] == CHAR_CIRCUMFLEX_ACCENT)
-    {
-    *negptr = TRUE;
-    ptr++;
-    }
-  for (i = 0; i < (int)(sizeof(name) / sizeof(pcre_uchar)) - 1; i++)
-    {
-    c = *(++ptr);
-    if (c == CHAR_NULL) goto ERROR_RETURN;
-    if (c == CHAR_RIGHT_CURLY_BRACKET) break;
-    name[i] = c;
-    }
-  if (c != CHAR_RIGHT_CURLY_BRACKET) 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 = PRIV(utt_size);
-
-while (bot < top)
-  {
-  int r;
-  i = (bot + top) >> 1;
-  r = STRCMP_UC_C8(name, PRIV(utt_names) + PRIV(utt)[i].name_offset);
-  if (r == 0)
-    {
-    *ptypeptr = PRIV(utt)[i].type;
-    *pdataptr = PRIV(utt)[i].value;
-    return TRUE;
-    }
-  if (r > 0) bot = i + 1; else top = i;
-  }
-
-*errorcodeptr = ERR47;
-*ptrptr = ptr;
-return FALSE;
-
-ERROR_RETURN:
-*errorcodeptr = ERR46;
-*ptrptr = ptr;
-return FALSE;
-}
-#endif
-
-
-
-/*************************************************
-*         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 pcre_uchar *
-read_repeat_counts(const pcre_uchar *p, int *minp, int *maxp, int *errorcodeptr)
-{
-int min = 0;
-int max = -1;
-
-while (IS_DIGIT(*p))
-  {
-  min = min * 10 + (int)(*p++ - CHAR_0);
-  if (min > 65535)
-    {
-    *errorcodeptr = ERR5;
-    return p;
-    }
-  }
-
-if (*p == CHAR_RIGHT_CURLY_BRACKET) max = min; else
-  {
-  if (*(++p) != CHAR_RIGHT_CURLY_BRACKET)
-    {
-    max = 0;
-    while(IS_DIGIT(*p))
-      {
-      max = max * 10 + (int)(*p++ - CHAR_0);
-      if (max > 65535)
-        {
-        *errorcodeptr = ERR5;
-        return p;
-        }
-      }
-    if (max < min)
-      {
-      *errorcodeptr = ERR4;
-      return p;
-      }
-    }
-  }
-
-*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, 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
-  skipassert   TRUE if certain assertions are to be skipped
-
-Returns:       pointer to the first significant opcode
-*/
-
-static const pcre_uchar*
-first_significant_code(const pcre_uchar *code, BOOL skipassert)
-{
-for (;;)
-  {
-  switch ((int)*code)
-    {
-    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 += PRIV(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_DNCREF:
-    case OP_RREF:
-    case OP_DNRREF:
-    case OP_DEF:
-    code += PRIV(OP_lengths)[*code];
-    break;
-
-    default:
-    return code;
-    }
-  }
-/* Control never reaches here */
-}
-
-
-
-/*************************************************
-*        Find the fixed length of a branch       *
-*************************************************/
-
-/* Scan a branch 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. The branch is
-temporarily terminated with OP_END when this function is called.
-
-This function is called when a backward assertion is encountered, so that if it
-fails, the error message can point to the correct place in the pattern.
-However, we cannot do this when the assertion contains subroutine calls,
-because they can be forward references. We solve this by remembering this case
-and doing the check at the end; a flag specifies which mode we are running in.
-
-Arguments:
-  code     points to the start of the pattern (the bracket)
-  utf      TRUE in UTF-8 / UTF-16 / UTF-32 mode
-  atend    TRUE if called when the pattern is complete
-  cd       the "compile data" structure
-  recurses    chain of recurse_check to catch mutual recursion
-
-Returns:   the fixed length,
-             or -1 if there is no fixed length,
-             or -2 if \C was encountered (in UTF-8 mode only)
-             or -3 if an OP_RECURSE item was encountered and atend is FALSE
-             or -4 if an unknown opcode was encountered (internal error)
-*/
-
-static int
-find_fixedlength(pcre_uchar *code, BOOL utf, BOOL atend, compile_data *cd,
-  recurse_check *recurses)
-{
-int length = -1;
-recurse_check this_recurse;
-register int branchlength = 0;
-register pcre_uchar *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;
-  pcre_uchar *ce, *cs;
-  register pcre_uchar op = *cc;
-
-  switch (op)
-    {
-    /* We only need to continue for OP_CBRA (normal capturing bracket) and
-    OP_BRA (normal non-capturing bracket) because the other variants of these
-    opcodes are all concerned with unlimited repeated groups, which of course
-    are not of fixed length. */
-
-    case OP_CBRA:
-    case OP_BRA:
-    case OP_ONCE:
-    case OP_ONCE_NC:
-    case OP_COND:
-    d = find_fixedlength(cc + ((op == OP_CBRA)? IMM2_SIZE : 0), utf, atend, cd,
-      recurses);
-    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. An ACCEPT is effectively
-    an ALT. If it is END it's the end of the outer call. All can be handled by
-    the same code. Note that we must not include the OP_KETRxxx opcodes here,
-    because they all imply an unlimited repeat. */
-
-    case OP_ALT:
-    case OP_KET:
-    case OP_END:
-    case OP_ACCEPT:
-    case OP_ASSERT_ACCEPT:
-    if (length < 0) length = branchlength;
-      else if (length != branchlength) return -1;
-    if (*cc != OP_ALT) return length;
-    cc += 1 + LINK_SIZE;
-    branchlength = 0;
-    break;
-
-    /* A true recursion implies not fixed length, but a subroutine call may
-    be OK. If the subroutine is a forward reference, we can't deal with
-    it until the end of the pattern, so return -3. */
-
-    case OP_RECURSE:
-    if (!atend) return -3;
-    cs = ce = (pcre_uchar *)cd->start_code + GET(cc, 1);  /* Start subpattern */
-    do ce += GET(ce, 1); while (*ce == OP_ALT);           /* End subpattern */
-    if (cc > cs && cc < ce) return -1;                    /* Recursion */
-    else   /* Check for mutual recursion */
-      {
-      recurse_check *r = recurses;
-      for (r = recurses; r != NULL; r = r->prev) if (r->group == cs) break;
-      if (r != NULL) return -1;   /* Mutual recursion */
-      }
-    this_recurse.prev = recurses;
-    this_recurse.group = cs;
-    d = find_fixedlength(cs + IMM2_SIZE, utf, atend, cd, &this_recurse);
-    if (d < 0) return d;
-    branchlength += d;
-    cc += 1 + LINK_SIZE;
-    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);
-    cc += 1 + LINK_SIZE;
-    break;
-
-    /* Skip over things that don't match chars */
-
-    case OP_MARK:
-    case OP_PRUNE_ARG:
-    case OP_SKIP_ARG:
-    case OP_THEN_ARG:
-    cc += cc[1] + PRIV(OP_lengths)[*cc];
-    break;
-
-    case OP_CALLOUT:
-    case OP_CIRC:
-    case OP_CIRCM:
-    case OP_CLOSE:
-    case OP_COMMIT:
-    case OP_CREF:
-    case OP_DEF:
-    case OP_DNCREF:
-    case OP_DNRREF:
-    case OP_DOLL:
-    case OP_DOLLM:
-    case OP_EOD:
-    case OP_EODN:
-    case OP_FAIL:
-    case OP_NOT_WORD_BOUNDARY:
-    case OP_PRUNE:
-    case OP_REVERSE:
-    case OP_RREF:
-    case OP_SET_SOM:
-    case OP_SKIP:
-    case OP_SOD:
-    case OP_SOM:
-    case OP_THEN:
-    case OP_WORD_BOUNDARY:
-    cc += PRIV(OP_lengths)[*cc];
-    break;
-
-    /* Handle literal characters */
-
-    case OP_CHAR:
-    case OP_CHARI:
-    case OP_NOT:
-    case OP_NOTI:
-    branchlength++;
-    cc += 2;
-#ifdef SUPPORT_UTF
-    if (utf && HAS_EXTRALEN(cc[-1])) cc += GET_EXTRALEN(cc[-1]);
-#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:
-    case OP_EXACTI:
-    case OP_NOTEXACT:
-    case OP_NOTEXACTI:
-    branchlength += (int)GET2(cc,1);
-    cc += 2 + IMM2_SIZE;
-#ifdef SUPPORT_UTF
-    if (utf && HAS_EXTRALEN(cc[-1])) cc += GET_EXTRALEN(cc[-1]);
-#endif
-    break;
-
-    case OP_TYPEEXACT:
-    branchlength += GET2(cc,1);
-    if (cc[1 + IMM2_SIZE] == OP_PROP || cc[1 + IMM2_SIZE] == OP_NOTPROP)
-      cc += 2;
-    cc += 1 + IMM2_SIZE + 1;
-    break;
-
-    /* Handle single-char matchers */
-
-    case OP_PROP:
-    case OP_NOTPROP:
-    cc += 2;
-    /* Fall through */
-
-    case OP_HSPACE:
-    case OP_VSPACE:
-    case OP_NOT_HSPACE:
-    case OP_NOT_VSPACE:
-    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_ALLANY:
-    branchlength++;
-    cc++;
-    break;
-
-    /* The single-byte matcher isn't allowed. This only happens in UTF-8 mode;
-    otherwise \C is coded as OP_ALLANY. */
-
-    case OP_ANYBYTE:
-    return -2;
-
-    /* Check a class for variable quantification */
-
-    case OP_CLASS:
-    case OP_NCLASS:
-#if defined SUPPORT_UTF || defined COMPILE_PCRE16 || defined COMPILE_PCRE32
-    case OP_XCLASS:
-    /* The original code caused an unsigned overflow in 64 bit systems,
-    so now we use a conditional statement. */
-    if (op == OP_XCLASS)
-      cc += GET(cc, 1);
-    else
-      cc += PRIV(OP_lengths)[OP_CLASS];
-#else
-    cc += PRIV(OP_lengths)[OP_CLASS];
-#endif
-
-    switch (*cc)
-      {
-      case OP_CRSTAR:
-      case OP_CRMINSTAR:
-      case OP_CRPLUS:
-      case OP_CRMINPLUS:
-      case OP_CRQUERY:
-      case OP_CRMINQUERY:
-      case OP_CRPOSSTAR:
-      case OP_CRPOSPLUS:
-      case OP_CRPOSQUERY:
-      return -1;
-
-      case OP_CRRANGE:
-      case OP_CRMINRANGE:
-      case OP_CRPOSRANGE:
-      if (GET2(cc,1) != GET2(cc,1+IMM2_SIZE)) return -1;
-      branchlength += (int)GET2(cc,1);
-      cc += 1 + 2 * IMM2_SIZE;
-      break;
-
-      default:
-      branchlength++;
-      }
-    break;
-
-    /* Anything else is variable length */
-
-    case OP_ANYNL:
-    case OP_BRAMINZERO:
-    case OP_BRAPOS:
-    case OP_BRAPOSZERO:
-    case OP_BRAZERO:
-    case OP_CBRAPOS:
-    case OP_EXTUNI:
-    case OP_KETRMAX:
-    case OP_KETRMIN:
-    case OP_KETRPOS:
-    case OP_MINPLUS:
-    case OP_MINPLUSI:
-    case OP_MINQUERY:
-    case OP_MINQUERYI:
-    case OP_MINSTAR:
-    case OP_MINSTARI:
-    case OP_MINUPTO:
-    case OP_MINUPTOI:
-    case OP_NOTMINPLUS:
-    case OP_NOTMINPLUSI:
-    case OP_NOTMINQUERY:
-    case OP_NOTMINQUERYI:
-    case OP_NOTMINSTAR:
-    case OP_NOTMINSTARI:
-    case OP_NOTMINUPTO:
-    case OP_NOTMINUPTOI:
-    case OP_NOTPLUS:
-    case OP_NOTPLUSI:
-    case OP_NOTPOSPLUS:
-    case OP_NOTPOSPLUSI:
-    case OP_NOTPOSQUERY:
-    case OP_NOTPOSQUERYI:
-    case OP_NOTPOSSTAR:
-    case OP_NOTPOSSTARI:
-    case OP_NOTPOSUPTO:
-    case OP_NOTPOSUPTOI:
-    case OP_NOTQUERY:
-    case OP_NOTQUERYI:
-    case OP_NOTSTAR:
-    case OP_NOTSTARI:
-    case OP_NOTUPTO:
-    case OP_NOTUPTOI:
-    case OP_PLUS:
-    case OP_PLUSI:
-    case OP_POSPLUS:
-    case OP_POSPLUSI:
-    case OP_POSQUERY:
-    case OP_POSQUERYI:
-    case OP_POSSTAR:
-    case OP_POSSTARI:
-    case OP_POSUPTO:
-    case OP_POSUPTOI:
-    case OP_QUERY:
-    case OP_QUERYI:
-    case OP_REF:
-    case OP_REFI:
-    case OP_DNREF:
-    case OP_DNREFI:
-    case OP_SBRA:
-    case OP_SBRAPOS:
-    case OP_SCBRA:
-    case OP_SCBRAPOS:
-    case OP_SCOND:
-    case OP_SKIPZERO:
-    case OP_STAR:
-    case OP_STARI:
-    case OP_TYPEMINPLUS:
-    case OP_TYPEMINQUERY:
-    case OP_TYPEMINSTAR:
-    case OP_TYPEMINUPTO:
-    case OP_TYPEPLUS:
-    case OP_TYPEPOSPLUS:
-    case OP_TYPEPOSQUERY:
-    case OP_TYPEPOSSTAR:
-    case OP_TYPEPOSUPTO:
-    case OP_TYPEQUERY:
-    case OP_TYPESTAR:
-    case OP_TYPEUPTO:
-    case OP_UPTO:
-    case OP_UPTOI:
-    return -1;
-
-    /* Catch unrecognized opcodes so that when new ones are added they
-    are not forgotten, as has happened in the past. */
-
-    default:
-    return -4;
-    }
-  }
-/* Control never gets here */
-}
-
-
-
-/*************************************************
-*    Scan compiled regex for specific bracket    *
-*************************************************/
-
-/* This little function scans through a compiled pattern until it finds a
-capturing bracket with the given number, or, if the number is negative, an
-instance of OP_REVERSE for a lookbehind. The function is global in the C sense
-so that it can be called from pcre_study() when finding the minimum matching
-length.
-
-Arguments:
-  code        points to start of expression
-  utf         TRUE in UTF-8 / UTF-16 / UTF-32 mode
-  number      the required bracket number or negative to find a lookbehind
-
-Returns:      pointer to the opcode for the bracket, or NULL if not found
-*/
-
-const pcre_uchar *
-PRIV(find_bracket)(const pcre_uchar *code, BOOL utf, int number)
-{
-for (;;)
-  {
-  register pcre_uchar c = *code;
-
-  if (c == OP_END) return NULL;
-
-  /* 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. */
-
-  if (c == OP_XCLASS) code += GET(code, 1);
-
-  /* Handle recursion */
-
-  else if (c == OP_REVERSE)
-    {
-    if (number < 0) return (pcre_uchar *)code;
-    code += PRIV(OP_lengths)[c];
-    }
-
-  /* Handle capturing bracket */
-
-  else if (c == OP_CBRA || c == OP_SCBRA ||
-           c == OP_CBRAPOS || c == OP_SCBRAPOS)
-    {
-    int n = (int)GET2(code, 1+LINK_SIZE);
-    if (n == number) return (pcre_uchar *)code;
-    code += PRIV(OP_lengths)[c];
-    }
-
-  /* Otherwise, we can get the item's length from the table, except that for
-  repeated character types, we have to test for \p and \P, which have an extra
-  two bytes of parameters, and for MARK/PRUNE/SKIP/THEN with an argument, we
-  must add in its length. */
-
-  else
-    {
-    switch(c)
-      {
-      case OP_TYPESTAR:
-      case OP_TYPEMINSTAR:
-      case OP_TYPEPLUS:
-      case OP_TYPEMINPLUS:
-      case OP_TYPEQUERY:
-      case OP_TYPEMINQUERY:
-      case OP_TYPEPOSSTAR:
-      case OP_TYPEPOSPLUS:
-      case OP_TYPEPOSQUERY:
-      if (code[1] == OP_PROP || code[1] == OP_NOTPROP) code += 2;
-      break;
-
-      case OP_TYPEUPTO:
-      case OP_TYPEMINUPTO:
-      case OP_TYPEEXACT:
-      case OP_TYPEPOSUPTO:
-      if (code[1 + IMM2_SIZE] == OP_PROP || code[1 + IMM2_SIZE] == OP_NOTPROP)
-        code += 2;
-      break;
-
-      case OP_MARK:
-      case OP_PRUNE_ARG:
-      case OP_SKIP_ARG:
-      case OP_THEN_ARG:
-      code += code[1];
-      break;
-      }
-
-    /* Add in the fixed length from the table */
-
-    code += PRIV(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
-  arrange to skip the extra bytes. */
-
-#if defined SUPPORT_UTF && !defined COMPILE_PCRE32
-    if (utf) switch(c)
-      {
-      case OP_CHAR:
-      case OP_CHARI:
-      case OP_NOT:
-      case OP_NOTI:
-      case OP_EXACT:
-      case OP_EXACTI:
-      case OP_NOTEXACT:
-      case OP_NOTEXACTI:
-      case OP_UPTO:
-      case OP_UPTOI:
-      case OP_NOTUPTO:
-      case OP_NOTUPTOI:
-      case OP_MINUPTO:
-      case OP_MINUPTOI:
-      case OP_NOTMINUPTO:
-      case OP_NOTMINUPTOI:
-      case OP_POSUPTO:
-      case OP_POSUPTOI:
-      case OP_NOTPOSUPTO:
-      case OP_NOTPOSUPTOI:
-      case OP_STAR:
-      case OP_STARI:
-      case OP_NOTSTAR:
-      case OP_NOTSTARI:
-      case OP_MINSTAR:
-      case OP_MINSTARI:
-      case OP_NOTMINSTAR:
-      case OP_NOTMINSTARI:
-      case OP_POSSTAR:
-      case OP_POSSTARI:
-      case OP_NOTPOSSTAR:
-      case OP_NOTPOSSTARI:
-      case OP_PLUS:
-      case OP_PLUSI:
-      case OP_NOTPLUS:
-      case OP_NOTPLUSI:
-      case OP_MINPLUS:
-      case OP_MINPLUSI:
-      case OP_NOTMINPLUS:
-      case OP_NOTMINPLUSI:
-      case OP_POSPLUS:
-      case OP_POSPLUSI:
-      case OP_NOTPOSPLUS:
-      case OP_NOTPOSPLUSI:
-      case OP_QUERY:
-      case OP_QUERYI:
-      case OP_NOTQUERY:
-      case OP_NOTQUERYI:
-      case OP_MINQUERY:
-      case OP_MINQUERYI:
-      case OP_NOTMINQUERY:
-      case OP_NOTMINQUERYI:
-      case OP_POSQUERY:
-      case OP_POSQUERYI:
-      case OP_NOTPOSQUERY:
-      case OP_NOTPOSQUERYI:
-      if (HAS_EXTRALEN(code[-1])) code += GET_EXTRALEN(code[-1]);
-      break;
-      }
-#else
-    (void)(utf);  /* Keep compiler happy by referencing function argument */
-#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
-  utf         TRUE in UTF-8 / UTF-16 / UTF-32 mode
-
-Returns:      pointer to the opcode for OP_RECURSE, or NULL if not found
-*/
-
-static const pcre_uchar *
-find_recurse(const pcre_uchar *code, BOOL utf)
-{
-for (;;)
-  {
-  register pcre_uchar c = *code;
-  if (c == OP_END) return NULL;
-  if (c == OP_RECURSE) return code;
-
-  /* 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. */
-
-  if (c == OP_XCLASS) code += GET(code, 1);
-
-  /* Otherwise, we can get the item's length from the table, except that for
-  repeated character types, we have to test for \p and \P, which have an extra
-  two bytes of parameters, and for MARK/PRUNE/SKIP/THEN with an argument, we
-  must add in its length. */
-
-  else
-    {
-    switch(c)
-      {
-      case OP_TYPESTAR:
-      case OP_TYPEMINSTAR:
-      case OP_TYPEPLUS:
-      case OP_TYPEMINPLUS:
-      case OP_TYPEQUERY:
-      case OP_TYPEMINQUERY:
-      case OP_TYPEPOSSTAR:
-      case OP_TYPEPOSPLUS:
-      case OP_TYPEPOSQUERY:
-      if (code[1] == OP_PROP || code[1] == OP_NOTPROP) code += 2;
-      break;
-
-      case OP_TYPEPOSUPTO:
-      case OP_TYPEUPTO:
-      case OP_TYPEMINUPTO:
-      case OP_TYPEEXACT:
-      if (code[1 + IMM2_SIZE] == OP_PROP || code[1 + IMM2_SIZE] == OP_NOTPROP)
-        code += 2;
-      break;
-
-      case OP_MARK:
-      case OP_PRUNE_ARG:
-      case OP_SKIP_ARG:
-      case OP_THEN_ARG:
-      code += code[1];
-      break;
-      }
-
-    /* Add in the fixed length from the table */
-
-    code += PRIV(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 arrange to skip the extra bytes. */
-
-#if defined SUPPORT_UTF && !defined COMPILE_PCRE32
-    if (utf) switch(c)
-      {
-      case OP_CHAR:
-      case OP_CHARI:
-      case OP_NOT:
-      case OP_NOTI:
-      case OP_EXACT:
-      case OP_EXACTI:
-      case OP_NOTEXACT:
-      case OP_NOTEXACTI:
-      case OP_UPTO:
-      case OP_UPTOI:
-      case OP_NOTUPTO:
-      case OP_NOTUPTOI:
-      case OP_MINUPTO:
-      case OP_MINUPTOI:
-      case OP_NOTMINUPTO:
-      case OP_NOTMINUPTOI:
-      case OP_POSUPTO:
-      case OP_POSUPTOI:
-      case OP_NOTPOSUPTO:
-      case OP_NOTPOSUPTOI:
-      case OP_STAR:
-      case OP_STARI:
-      case OP_NOTSTAR:
-      case OP_NOTSTARI:
-      case OP_MINSTAR:
-      case OP_MINSTARI:
-      case OP_NOTMINSTAR:
-      case OP_NOTMINSTARI:
-      case OP_POSSTAR:
-      case OP_POSSTARI:
-      case OP_NOTPOSSTAR:
-      case OP_NOTPOSSTARI:
-      case OP_PLUS:
-      case OP_PLUSI:
-      case OP_NOTPLUS:
-      case OP_NOTPLUSI:
-      case OP_MINPLUS:
-      case OP_MINPLUSI:
-      case OP_NOTMINPLUS:
-      case OP_NOTMINPLUSI:
-      case OP_POSPLUS:
-      case OP_POSPLUSI:
-      case OP_NOTPOSPLUS:
-      case OP_NOTPOSPLUSI:
-      case OP_QUERY:
-      case OP_QUERYI:
-      case OP_NOTQUERY:
-      case OP_NOTQUERYI:
-      case OP_MINQUERY:
-      case OP_MINQUERYI:
-      case OP_NOTMINQUERY:
-      case OP_NOTMINQUERYI:
-      case OP_POSQUERY:
-      case OP_POSQUERYI:
-      case OP_NOTPOSQUERY:
-      case OP_NOTPOSQUERYI:
-      if (HAS_EXTRALEN(code[-1])) code += GET_EXTRALEN(code[-1]);
-      break;
-      }
-#else
-    (void)(utf);  /* Keep compiler happy by referencing function argument */
-#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 from could_be_empty()
-below and from compile_branch() when checking for an unlimited repeat of a
-group that can match nothing. Note that first_significant_code() skips over
-backward and negative forward assertions when its final argument is TRUE. 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
-  utf         TRUE if in UTF-8 / UTF-16 / UTF-32 mode
-  cd          contains pointers to tables etc.
-  recurses    chain of recurse_check to catch mutual recursion
-
-Returns:      TRUE if what is matched could be empty
-*/
-
-static BOOL
-could_be_empty_branch(const pcre_uchar *code, const pcre_uchar *endcode,
-  BOOL utf, compile_data *cd, recurse_check *recurses)
-{
-register pcre_uchar c;
-recurse_check this_recurse;
-
-for (code = first_significant_code(code + PRIV(OP_lengths)[*code], TRUE);
-     code < endcode;
-     code = first_significant_code(code + PRIV(OP_lengths)[c], TRUE))
-  {
-  const pcre_uchar *ccode;
-
-  c = *code;
-
-  /* Skip over forward assertions; the other assertions are skipped by
-  first_significant_code() with a TRUE final argument. */
-
-  if (c == OP_ASSERT)
-    {
-    do code += GET(code, 1); while (*code == OP_ALT);
-    c = *code;
-    continue;
-    }
-
-  /* For a recursion/subroutine call, if its end has been reached, which
-  implies a backward reference subroutine call, we can scan it. If it's a
-  forward reference subroutine call, we can't. To detect forward reference
-  we have to scan up the list that is kept in the workspace. This function is
-  called only when doing the real compile, not during the pre-compile that
-  measures the size of the compiled pattern. */
-
-  if (c == OP_RECURSE)
-    {
-    const pcre_uchar *scode = cd->start_code + GET(code, 1);
-    const pcre_uchar *endgroup = scode;
-    BOOL empty_branch;
-
-    /* Test for forward reference or uncompleted reference. This is disabled
-    when called to scan a completed pattern by setting cd->start_workspace to
-    NULL. */
-
-    if (cd->start_workspace != NULL)
-      {
-      const pcre_uchar *tcode;
-      for (tcode = cd->start_workspace; tcode < cd->hwm; tcode += LINK_SIZE)
-        if ((int)GET(tcode, 0) == (int)(code + 1 - cd->start_code)) return TRUE;
-      if (GET(scode, 1) == 0) return TRUE;    /* Unclosed */
-      }
-
-    /* If the reference is to a completed group, we need to detect whether this
-    is a recursive call, as otherwise there will be an infinite loop. If it is
-    a recursion, just skip over it. Simple recursions are easily detected. For
-    mutual recursions we keep a chain on the stack. */
-
-    do endgroup += GET(endgroup, 1); while (*endgroup == OP_ALT);
-    if (code >= scode && code <= endgroup) continue;  /* Simple recursion */
-    else
-      {
-      recurse_check *r = recurses;
-      for (r = recurses; r != NULL; r = r->prev)
-        if (r->group == scode) break;
-      if (r != NULL) continue;   /* Mutual recursion */
-      }
-
-    /* Completed reference; scan the referenced group, remembering it on the
-    stack chain to detect mutual recursions. */
-
-    empty_branch = FALSE;
-    this_recurse.prev = recurses;
-    this_recurse.group = scode;
-
-    do
-      {
-      if (could_be_empty_branch(scode, endcode, utf, cd, &this_recurse))
-        {
-        empty_branch = TRUE;
-        break;
-        }
-      scode += GET(scode, 1);
-      }
-    while (*scode == OP_ALT);
-
-    if (!empty_branch) return FALSE;  /* All branches are non-empty */
-    continue;
-    }
-
-  /* Groups with zero repeats can of course be empty; skip them. */
-
-  if (c == OP_BRAZERO || c == OP_BRAMINZERO || c == OP_SKIPZERO ||
-      c == OP_BRAPOSZERO)
-    {
-    code += PRIV(OP_lengths)[c];
-    do code += GET(code, 1); while (*code == OP_ALT);
-    c = *code;
-    continue;
-    }
-
-  /* A nested group that is already marked as "could be empty" can just be
-  skipped. */
-
-  if (c == OP_SBRA  || c == OP_SBRAPOS ||
-      c == OP_SCBRA || c == OP_SCBRAPOS)
-    {
-    do code += GET(code, 1); while (*code == OP_ALT);
-    c = *code;
-    continue;
-    }
-
-  /* For other groups, scan the branches. */
-
-  if (c == OP_BRA  || c == OP_BRAPOS ||
-      c == OP_CBRA || c == OP_CBRAPOS ||
-      c == OP_ONCE || c == OP_ONCE_NC ||
-      c == OP_COND || c == OP_SCOND)
-    {
-    BOOL empty_branch;
-    if (GET(code, 1) == 0) return TRUE;    /* Hit unclosed bracket */
-
-    /* If a conditional group has only one branch, there is a second, implied,
-    empty branch, so just skip over the conditional, because it could be empty.
-    Otherwise, scan the individual branches of the group. */
-
-    if (c == OP_COND && code[GET(code, 1)] != OP_ALT)
-      code += GET(code, 1);
-    else
-      {
-      empty_branch = FALSE;
-      do
-        {
-        if (!empty_branch && could_be_empty_branch(code, endcode, utf, cd,
-          recurses)) empty_branch = TRUE;
-        code += GET(code, 1);
-        }
-      while (*code == OP_ALT);
-      if (!empty_branch) return FALSE;   /* All branches are non-empty */
-      }
-
-    c = *code;
-    continue;
-    }
-
-  /* Handle the other opcodes */
-
-  switch (c)
-    {
-    /* Check for quantifiers after a class. XCLASS is used for classes that
-    cannot be represented just by a bit map. This includes negated single
-    high-valued characters. The length in PRIV(OP_lengths)[] is zero; the
-    actual length is stored in the compiled code, so we must update "code"
-    here. */
-
-#if defined SUPPORT_UTF || !defined COMPILE_PCRE8
-    case OP_XCLASS:
-    ccode = code += GET(code, 1);
-    goto CHECK_CLASS_REPEAT;
-#endif
-
-    case OP_CLASS:
-    case OP_NCLASS:
-    ccode = code + PRIV(OP_lengths)[OP_CLASS];
-
-#if defined SUPPORT_UTF || !defined COMPILE_PCRE8
-    CHECK_CLASS_REPEAT:
-#endif
-
-    switch (*ccode)
-      {
-      case OP_CRSTAR:            /* These could be empty; continue */
-      case OP_CRMINSTAR:
-      case OP_CRQUERY:
-      case OP_CRMINQUERY:
-      case OP_CRPOSSTAR:
-      case OP_CRPOSQUERY:
-      break;
-
-      default:                   /* Non-repeat => class must match */
-      case OP_CRPLUS:            /* These repeats aren't empty */
-      case OP_CRMINPLUS:
-      case OP_CRPOSPLUS:
-      return FALSE;
-
-      case OP_CRRANGE:
-      case OP_CRMINRANGE:
-      case OP_CRPOSRANGE:
-      if (GET2(ccode, 1) > 0) return FALSE;  /* Minimum > 0 */
-      break;
-      }
-    break;
-
-    /* Opcodes that must match a character */
-
-    case OP_ANY:
-    case OP_ALLANY:
-    case OP_ANYBYTE:
-
-    case OP_PROP:
-    case OP_NOTPROP:
-    case OP_ANYNL:
-
-    case OP_NOT_HSPACE:
-    case OP_HSPACE:
-    case OP_NOT_VSPACE:
-    case OP_VSPACE:
-    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_CHAR:
-    case OP_CHARI:
-    case OP_NOT:
-    case OP_NOTI:
-
-    case OP_PLUS:
-    case OP_PLUSI:
-    case OP_MINPLUS:
-    case OP_MINPLUSI:
-
-    case OP_NOTPLUS:
-    case OP_NOTPLUSI:
-    case OP_NOTMINPLUS:
-    case OP_NOTMINPLUSI:
-
-    case OP_POSPLUS:
-    case OP_POSPLUSI:
-    case OP_NOTPOSPLUS:
-    case OP_NOTPOSPLUSI:
-
-    case OP_EXACT:
-    case OP_EXACTI:
-    case OP_NOTEXACT:
-    case OP_NOTEXACTI:
-
-    case OP_TYPEPLUS:
-    case OP_TYPEMINPLUS:
-    case OP_TYPEPOSPLUS:
-    case OP_TYPEEXACT:
-
-    return FALSE;
-
-    /* These are going to continue, as they may be empty, but we have to
-    fudge the length for the \p and \P cases. */
-
-    case OP_TYPESTAR:
-    case OP_TYPEMINSTAR:
-    case OP_TYPEPOSSTAR:
-    case OP_TYPEQUERY:
-    case OP_TYPEMINQUERY:
-    case OP_TYPEPOSQUERY:
-    if (code[1] == OP_PROP || code[1] == OP_NOTPROP) code += 2;
-    break;
-
-    /* Same for these */
-
-    case OP_TYPEUPTO:
-    case OP_TYPEMINUPTO:
-    case OP_TYPEPOSUPTO:
-    if (code[1 + IMM2_SIZE] == OP_PROP || code[1 + IMM2_SIZE] == OP_NOTPROP)
-      code += 2;
-    break;
-
-    /* End of branch */
-
-    case OP_KET:
-    case OP_KETRMAX:
-    case OP_KETRMIN:
-    case OP_KETRPOS:
-    case OP_ALT:
-    return TRUE;
-
-    /* In UTF-8 mode, STAR, MINSTAR, POSSTAR, QUERY, MINQUERY, POSQUERY, UPTO,
-    MINUPTO, and POSUPTO and their caseless and negative versions may be
-    followed by a multibyte character. */
-
-#if defined SUPPORT_UTF && !defined COMPILE_PCRE32
-    case OP_STAR:
-    case OP_STARI:
-    case OP_NOTSTAR:
-    case OP_NOTSTARI:
-
-    case OP_MINSTAR:
-    case OP_MINSTARI:
-    case OP_NOTMINSTAR:
-    case OP_NOTMINSTARI:
-
-    case OP_POSSTAR:
-    case OP_POSSTARI:
-    case OP_NOTPOSSTAR:
-    case OP_NOTPOSSTARI:
-
-    case OP_QUERY:
-    case OP_QUERYI:
-    case OP_NOTQUERY:
-    case OP_NOTQUERYI:
-
-    case OP_MINQUERY:
-    case OP_MINQUERYI:
-    case OP_NOTMINQUERY:
-    case OP_NOTMINQUERYI:
-
-    case OP_POSQUERY:
-    case OP_POSQUERYI:
-    case OP_NOTPOSQUERY:
-    case OP_NOTPOSQUERYI:
-
-    if (utf && HAS_EXTRALEN(code[1])) code += GET_EXTRALEN(code[1]);
-    break;
-
-    case OP_UPTO:
-    case OP_UPTOI:
-    case OP_NOTUPTO:
-    case OP_NOTUPTOI:
-
-    case OP_MINUPTO:
-    case OP_MINUPTOI:
-    case OP_NOTMINUPTO:
-    case OP_NOTMINUPTOI:
-
-    case OP_POSUPTO:
-    case OP_POSUPTOI:
-    case OP_NOTPOSUPTO:
-    case OP_NOTPOSUPTOI:
-
-    if (utf && HAS_EXTRALEN(code[1 + IMM2_SIZE])) code += GET_EXTRALEN(code[1 + IMM2_SIZE]);
-    break;
-#endif
-
-    /* MARK, and PRUNE/SKIP/THEN with an argument must skip over the argument
-    string. */
-
-    case OP_MARK:
-    case OP_PRUNE_ARG:
-    case OP_SKIP_ARG:
-    case OP_THEN_ARG:
-    code += code[1];
-    break;
-
-    /* None of the remaining opcodes are required to match a character. */
-
-    default:
-    break;
-    }
-  }
-
-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.
-This function is called only during the real compile, not during the
-pre-compile.
-
-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
-  utf         TRUE if in UTF-8 / UTF-16 / UTF-32 mode
-  cd          pointers to tables etc
-
-Returns:      TRUE if what is matched could be empty
-*/
-
-static BOOL
-could_be_empty(const pcre_uchar *code, const pcre_uchar *endcode,
-  branch_chain *bcptr, BOOL utf, compile_data *cd)
-{
-while (bcptr != NULL && bcptr->current_branch >= code)
-  {
-  if (!could_be_empty_branch(bcptr->current_branch, endcode, utf, cd, NULL))
-    return FALSE;
-  bcptr = bcptr->outer;
-  }
-return TRUE;
-}
-
-
-
-/*************************************************
-*        Base opcode of repeated opcodes         *
-*************************************************/
-
-/* Returns the base opcode for repeated single character type opcodes. If the
-opcode is not a repeated character type, it returns with the original value.
-
-Arguments:  c opcode
-Returns:    base opcode for the type
-*/
-
-static pcre_uchar
-get_repeat_base(pcre_uchar c)
-{
-return (c > OP_TYPEPOSUPTO)? c :
-       (c >= OP_TYPESTAR)?   OP_TYPESTAR :
-       (c >= OP_NOTSTARI)?   OP_NOTSTARI :
-       (c >= OP_NOTSTAR)?    OP_NOTSTAR :
-       (c >= OP_STARI)?      OP_STARI :
-                             OP_STAR;
-}
-
-
-
-#ifdef SUPPORT_UCP
-/*************************************************
-*        Check a character and a property        *
-*************************************************/
-
-/* This function is called by check_auto_possessive() when a property item
-is adjacent to a fixed character.
-
-Arguments:
-  c            the character
-  ptype        the property type
-  pdata        the data for the type
-  negated      TRUE if it's a negated property (\P or \p{^)
-
-Returns:       TRUE if auto-possessifying is OK
-*/
-
-static BOOL
-check_char_prop(pcre_uint32 c, unsigned int ptype, unsigned int pdata,
-  BOOL negated)
-{
-const pcre_uint32 *p;
-const ucd_record *prop = GET_UCD(c);
-
-switch(ptype)
-  {
-  case PT_LAMP:
-  return (prop->chartype == ucp_Lu ||
-          prop->chartype == ucp_Ll ||
-          prop->chartype == ucp_Lt) == negated;
-
-  case PT_GC:
-  return (pdata == PRIV(ucp_gentype)[prop->chartype]) == negated;
-
-  case PT_PC:
-  return (pdata == prop->chartype) == negated;
-
-  case PT_SC:
-  return (pdata == prop->script) == negated;
-
-  /* These are specials */
-
-  case PT_ALNUM:
-  return (PRIV(ucp_gentype)[prop->chartype] == ucp_L ||
-          PRIV(ucp_gentype)[prop->chartype] == ucp_N) == negated;
-
-  /* Perl space used to exclude VT, but from Perl 5.18 it is included, which
-  means that Perl space and POSIX space are now identical. PCRE was changed
-  at release 8.34. */
-
-  case PT_SPACE:    /* Perl space */
-  case PT_PXSPACE:  /* POSIX space */
-  switch(c)
-    {
-    HSPACE_CASES:
-    VSPACE_CASES:
-    return negated;
-
-    default:
-    return (PRIV(ucp_gentype)[prop->chartype] == ucp_Z) == negated;
-    }
-  break;  /* Control never reaches here */
-
-  case PT_WORD:
-  return (PRIV(ucp_gentype)[prop->chartype] == ucp_L ||
-          PRIV(ucp_gentype)[prop->chartype] == ucp_N ||
-          c == CHAR_UNDERSCORE) == negated;
-
-  case PT_CLIST:
-  p = PRIV(ucd_caseless_sets) + prop->caseset;
-  for (;;)
-    {
-    if (c < *p) return !negated;
-    if (c == *p++) return negated;
-    }
-  break;  /* Control never reaches here */
-  }
-
-return FALSE;
-}
-#endif  /* SUPPORT_UCP */
-
-
-
-/*************************************************
-*        Fill the character property list        *
-*************************************************/
-
-/* Checks whether the code points to an opcode that can take part in auto-
-possessification, and if so, fills a list with its properties.
-
-Arguments:
-  code        points to start of expression
-  utf         TRUE if in UTF-8 / UTF-16 / UTF-32 mode
-  fcc         points to case-flipping table
-  list        points to output list
-              list[0] will be filled with the opcode
-              list[1] will be non-zero if this opcode
-                can match an empty character string
-              list[2..7] depends on the opcode
-
-Returns:      points to the start of the next opcode if *code is accepted
-              NULL if *code is not accepted
-*/
-
-static const pcre_uchar *
-get_chr_property_list(const pcre_uchar *code, BOOL utf,
-  const pcre_uint8 *fcc, pcre_uint32 *list)
-{
-pcre_uchar c = *code;
-pcre_uchar base;
-const pcre_uchar *end;
-pcre_uint32 chr;
-
-#ifdef SUPPORT_UCP
-pcre_uint32 *clist_dest;
-const pcre_uint32 *clist_src;
-#else
-utf = utf;  /* Suppress "unused parameter" compiler warning */
-#endif
-
-list[0] = c;
-list[1] = FALSE;
-code++;
-
-if (c >= OP_STAR && c <= OP_TYPEPOSUPTO)
-  {
-  base = get_repeat_base(c);
-  c -= (base - OP_STAR);
-
-  if (c == OP_UPTO || c == OP_MINUPTO || c == OP_EXACT || c == OP_POSUPTO)
-    code += IMM2_SIZE;
-
-  list[1] = (c != OP_PLUS && c != OP_MINPLUS && c != OP_EXACT && c != OP_POSPLUS);
-
-  switch(base)
-    {
-    case OP_STAR:
-    list[0] = OP_CHAR;
-    break;
-
-    case OP_STARI:
-    list[0] = OP_CHARI;
-    break;
-
-    case OP_NOTSTAR:
-    list[0] = OP_NOT;
-    break;
-
-    case OP_NOTSTARI:
-    list[0] = OP_NOTI;
-    break;
-
-    case OP_TYPESTAR:
-    list[0] = *code;
-    code++;
-    break;
-    }
-  c = list[0];
-  }
-
-switch(c)
-  {
-  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_ALLANY:
-  case OP_ANYNL:
-  case OP_NOT_HSPACE:
-  case OP_HSPACE:
-  case OP_NOT_VSPACE:
-  case OP_VSPACE:
-  case OP_EXTUNI:
-  case OP_EODN:
-  case OP_EOD:
-  case OP_DOLL:
-  case OP_DOLLM:
-  return code;
-
-  case OP_CHAR:
-  case OP_NOT:
-  GETCHARINCTEST(chr, code);
-  list[2] = chr;
-  list[3] = NOTACHAR;
-  return code;
-
-  case OP_CHARI:
-  case OP_NOTI:
-  list[0] = (c == OP_CHARI) ? OP_CHAR : OP_NOT;
-  GETCHARINCTEST(chr, code);
-  list[2] = chr;
-
-#ifdef SUPPORT_UCP
-  if (chr < 128 || (chr < 256 && !utf))
-    list[3] = fcc[chr];
-  else
-    list[3] = UCD_OTHERCASE(chr);
-#elif defined SUPPORT_UTF || !defined COMPILE_PCRE8
-  list[3] = (chr < 256) ? fcc[chr] : chr;
-#else
-  list[3] = fcc[chr];
-#endif
-
-  /* The othercase might be the same value. */
-
-  if (chr == list[3])
-    list[3] = NOTACHAR;
-  else
-    list[4] = NOTACHAR;
-  return code;
-
-#ifdef SUPPORT_UCP
-  case OP_PROP:
-  case OP_NOTPROP:
-  if (code[0] != PT_CLIST)
-    {
-    list[2] = code[0];
-    list[3] = code[1];
-    return code + 2;
-    }
-
-  /* Convert only if we have enough space. */
-
-  clist_src = PRIV(ucd_caseless_sets) + code[1];
-  clist_dest = list + 2;
-  code += 2;
-
-  do {
-     if (clist_dest >= list + 8)
-       {
-       /* Early return if there is not enough space. This should never
-       happen, since all clists are shorter than 5 character now. */
-       list[2] = code[0];
-       list[3] = code[1];
-       return code;
-       }
-     *clist_dest++ = *clist_src;
-     }
-  while(*clist_src++ != NOTACHAR);
-
-  /* All characters are stored. The terminating NOTACHAR
-  is copied form the clist itself. */
-
-  list[0] = (c == OP_PROP) ? OP_CHAR : OP_NOT;
-  return code;
-#endif
-
-  case OP_NCLASS:
-  case OP_CLASS:
-#if defined SUPPORT_UTF || !defined COMPILE_PCRE8
-  case OP_XCLASS:
-  if (c == OP_XCLASS)
-    end = code + GET(code, 0) - 1;
-  else
-#endif
-    end = code + 32 / sizeof(pcre_uchar);
-
-  switch(*end)
-    {
-    case OP_CRSTAR:
-    case OP_CRMINSTAR:
-    case OP_CRQUERY:
-    case OP_CRMINQUERY:
-    case OP_CRPOSSTAR:
-    case OP_CRPOSQUERY:
-    list[1] = TRUE;
-    end++;
-    break;
-
-    case OP_CRPLUS:
-    case OP_CRMINPLUS:
-    case OP_CRPOSPLUS:
-    end++;
-    break;
-
-    case OP_CRRANGE:
-    case OP_CRMINRANGE:
-    case OP_CRPOSRANGE:
-    list[1] = (GET2(end, 1) == 0);
-    end += 1 + 2 * IMM2_SIZE;
-    break;
-    }
-  list[2] = (pcre_uint32)(end - code);
-  return end;
-  }
-return NULL;    /* Opcode not accepted */
-}
-
-
-
-/*************************************************
-*    Scan further character sets for match       *
-*************************************************/
-
-/* Checks whether the base and the current opcode have a common character, in
-which case the base cannot be possessified.
-
-Arguments:
-  code        points to the byte code
-  utf         TRUE in UTF-8 / UTF-16 / UTF-32 mode
-  cd          static compile data
-  base_list   the data list of the base opcode
-
-Returns:      TRUE if the auto-possessification is possible
-*/
-
-static BOOL
-compare_opcodes(const pcre_uchar *code, BOOL utf, const compile_data *cd,
-  const pcre_uint32 *base_list, const pcre_uchar *base_end, int *rec_limit)
-{
-pcre_uchar c;
-pcre_uint32 list[8];
-const pcre_uint32 *chr_ptr;
-const pcre_uint32 *ochr_ptr;
-const pcre_uint32 *list_ptr;
-const pcre_uchar *next_code;
-#if defined SUPPORT_UTF || !defined COMPILE_PCRE8
-const pcre_uchar *xclass_flags;
-#endif
-const pcre_uint8 *class_bitset;
-const pcre_uint8 *set1, *set2, *set_end;
-pcre_uint32 chr;
-BOOL accepted, invert_bits;
-BOOL entered_a_group = FALSE;
-
-if (*rec_limit == 0) return FALSE;
---(*rec_limit);
-
-/* Note: the base_list[1] contains whether the current opcode has greedy
-(represented by a non-zero value) quantifier. This is a different from
-other character type lists, which stores here that the character iterator
-matches to an empty string (also represented by a non-zero value). */
-
-for(;;)
-  {
-  /* All operations move the code pointer forward.
-  Therefore infinite recursions are not possible. */
-
-  c = *code;
-
-  /* Skip over callouts */
-
-  if (c == OP_CALLOUT)
-    {
-    code += PRIV(OP_lengths)[c];
-    continue;
-    }
-
-  if (c == OP_ALT)
-    {
-    do code += GET(code, 1); while (*code == OP_ALT);
-    c = *code;
-    }
-
-  switch(c)
-    {
-    case OP_END:
-    case OP_KETRPOS:
-    /* TRUE only in greedy case. The non-greedy case could be replaced by
-    an OP_EXACT, but it is probably not worth it. (And note that OP_EXACT
-    uses more memory, which we cannot get at this stage.) */
-
-    return base_list[1] != 0;
-
-    case OP_KET:
-    /* If the bracket is capturing, and referenced by an OP_RECURSE, or
-    it is an atomic sub-pattern (assert, once, etc.) the non-greedy case
-    cannot be converted to a possessive form. */
-
-    if (base_list[1] == 0) return FALSE;
-
-    switch(*(code - GET(code, 1)))
-      {
-      case OP_ASSERT:
-      case OP_ASSERT_NOT:
-      case OP_ASSERTBACK:
-      case OP_ASSERTBACK_NOT:
-      case OP_ONCE:
-      case OP_ONCE_NC:
-      /* Atomic sub-patterns and assertions can always auto-possessify their
-      last iterator. However, if the group was entered as a result of checking
-      a previous iterator, this is not possible. */
-
-      return !entered_a_group;
-      }
-
-    code += PRIV(OP_lengths)[c];
-    continue;
-
-    case OP_ONCE:
-    case OP_ONCE_NC:
-    case OP_BRA:
-    case OP_CBRA:
-    next_code = code + GET(code, 1);
-    code += PRIV(OP_lengths)[c];
-
-    while (*next_code == OP_ALT)
-      {
-      if (!compare_opcodes(code, utf, cd, base_list, base_end, rec_limit))
-        return FALSE;
-      code = next_code + 1 + LINK_SIZE;
-      next_code += GET(next_code, 1);
-      }
-
-    entered_a_group = TRUE;
-    continue;
-
-    case OP_BRAZERO:
-    case OP_BRAMINZERO:
-
-    next_code = code + 1;
-    if (*next_code != OP_BRA && *next_code != OP_CBRA
-        && *next_code != OP_ONCE && *next_code != OP_ONCE_NC) return FALSE;
-
-    do next_code += GET(next_code, 1); while (*next_code == OP_ALT);
-
-    /* The bracket content will be checked by the
-    OP_BRA/OP_CBRA case above. */
-    next_code += 1 + LINK_SIZE;
-    if (!compare_opcodes(next_code, utf, cd, base_list, base_end, rec_limit))
-      return FALSE;
-
-    code += PRIV(OP_lengths)[c];
-    continue;
-
-    default:
-    break;
-    }
-
-  /* Check for a supported opcode, and load its properties. */
-
-  code = get_chr_property_list(code, utf, cd->fcc, list);
-  if (code == NULL) return FALSE;    /* Unsupported */
-
-  /* If either opcode is a small character list, set pointers for comparing
-  characters from that list with another list, or with a property. */
-
-  if (base_list[0] == OP_CHAR)
-    {
-    chr_ptr = base_list + 2;
-    list_ptr = list;
-    }
-  else if (list[0] == OP_CHAR)
-    {
-    chr_ptr = list + 2;
-    list_ptr = base_list;
-    }
-
-  /* Character bitsets can also be compared to certain opcodes. */
-
-  else if (base_list[0] == OP_CLASS || list[0] == OP_CLASS
-#ifdef COMPILE_PCRE8
-      /* In 8 bit, non-UTF mode, OP_CLASS and OP_NCLASS are the same. */
-      || (!utf && (base_list[0] == OP_NCLASS || list[0] == OP_NCLASS))
-#endif
-      )
-    {
-#ifdef COMPILE_PCRE8
-    if (base_list[0] == OP_CLASS || (!utf && base_list[0] == OP_NCLASS))
-#else
-    if (base_list[0] == OP_CLASS)
-#endif
-      {
-      set1 = (pcre_uint8 *)(base_end - base_list[2]);
-      list_ptr = list;
-      }
-    else
-      {
-      set1 = (pcre_uint8 *)(code - list[2]);
-      list_ptr = base_list;
-      }
-
-    invert_bits = FALSE;
-    switch(list_ptr[0])
-      {
-      case OP_CLASS:
-      case OP_NCLASS:
-      set2 = (pcre_uint8 *)
-        ((list_ptr == list ? code : base_end) - list_ptr[2]);
-      break;
-
-#if defined SUPPORT_UTF || !defined COMPILE_PCRE8
-      case OP_XCLASS:
-      xclass_flags = (list_ptr == list ? code : base_end) - list_ptr[2] + LINK_SIZE;
-      if ((*xclass_flags & XCL_HASPROP) != 0) return FALSE;
-      if ((*xclass_flags & XCL_MAP) == 0)
-        {
-        /* No bits are set for characters < 256. */
-        if (list[1] == 0) return TRUE;
-        /* Might be an empty repeat. */
-        continue;
-        }
-      set2 = (pcre_uint8 *)(xclass_flags + 1);
-      break;
-#endif
-
-      case OP_NOT_DIGIT:
-      invert_bits = TRUE;
-      /* Fall through */
-      case OP_DIGIT:
-      set2 = (pcre_uint8 *)(cd->cbits + cbit_digit);
-      break;
-
-      case OP_NOT_WHITESPACE:
-      invert_bits = TRUE;
-      /* Fall through */
-      case OP_WHITESPACE:
-      set2 = (pcre_uint8 *)(cd->cbits + cbit_space);
-      break;
-
-      case OP_NOT_WORDCHAR:
-      invert_bits = TRUE;
-      /* Fall through */
-      case OP_WORDCHAR:
-      set2 = (pcre_uint8 *)(cd->cbits + cbit_word);
-      break;
-
-      default:
-      return FALSE;
-      }
-
-    /* Because the sets are unaligned, we need
-    to perform byte comparison here. */
-    set_end = set1 + 32;
-    if (invert_bits)
-      {
-      do
-        {
-        if ((*set1++ & ~(*set2++)) != 0) return FALSE;
-        }
-      while (set1 < set_end);
-      }
-    else
-      {
-      do
-        {
-        if ((*set1++ & *set2++) != 0) return FALSE;
-        }
-      while (set1 < set_end);
-      }
-
-    if (list[1] == 0) return TRUE;
-    /* Might be an empty repeat. */
-    continue;
-    }
-
-  /* Some property combinations also acceptable. Unicode property opcodes are
-  processed specially; the rest can be handled with a lookup table. */
-
-  else
-    {
-    pcre_uint32 leftop, rightop;
-
-    leftop = base_list[0];
-    rightop = list[0];
-
-#ifdef SUPPORT_UCP
-    accepted = FALSE; /* Always set in non-unicode case. */
-    if (leftop == OP_PROP || leftop == OP_NOTPROP)
-      {
-      if (rightop == OP_EOD)
-        accepted = TRUE;
-      else if (rightop == OP_PROP || rightop == OP_NOTPROP)
-        {
-        int n;
-        const pcre_uint8 *p;
-        BOOL same = leftop == rightop;
-        BOOL lisprop = leftop == OP_PROP;
-        BOOL risprop = rightop == OP_PROP;
-        BOOL bothprop = lisprop && risprop;
-
-        /* There's a table that specifies how each combination is to be
-        processed:
-          0   Always return FALSE (never auto-possessify)
-          1   Character groups are distinct (possessify if both are OP_PROP)
-          2   Check character categories in the same group (general or particular)
-          3   Return TRUE if the two opcodes are not the same
-          ... see comments below
-        */
-
-        n = propposstab[base_list[2]][list[2]];
-        switch(n)
-          {
-          case 0: break;
-          case 1: accepted = bothprop; break;
-          case 2: accepted = (base_list[3] == list[3]) != same; break;
-          case 3: accepted = !same; break;
-
-          case 4:  /* Left general category, right particular category */
-          accepted = risprop && catposstab[base_list[3]][list[3]] == same;
-          break;
-
-          case 5:  /* Right general category, left particular category */
-          accepted = lisprop && catposstab[list[3]][base_list[3]] == same;
-          break;
-
-          /* This code is logically tricky. Think hard before fiddling with it.
-          The posspropstab table has four entries per row. Each row relates to
-          one of PCRE's special properties such as ALNUM or SPACE or WORD.
-          Only WORD actually needs all four entries, but using repeats for the
-          others means they can all use the same code below.
-
-          The first two entries in each row are Unicode general categories, and
-          apply always, because all the characters they include are part of the
-          PCRE character set. The third and fourth entries are a general and a
-          particular category, respectively, that include one or more relevant
-          characters. One or the other is used, depending on whether the check
-          is for a general or a particular category. However, in both cases the
-          category contains more characters than the specials that are defined
-          for the property being tested against. Therefore, it cannot be used
-          in a NOTPROP case.
-
-          Example: the row for WORD contains ucp_L, ucp_N, ucp_P, ucp_Po.
-          Underscore is covered by ucp_P or ucp_Po. */
-
-          case 6:  /* Left alphanum vs right general category */
-          case 7:  /* Left space vs right general category */
-          case 8:  /* Left word vs right general category */
-          p = posspropstab[n-6];
-          accepted = risprop && lisprop ==
-            (list[3] != p[0] &&
-             list[3] != p[1] &&
-            (list[3] != p[2] || !lisprop));
-          break;
-
-          case 9:   /* Right alphanum vs left general category */
-          case 10:  /* Right space vs left general category */
-          case 11:  /* Right word vs left general category */
-          p = posspropstab[n-9];
-          accepted = lisprop && risprop ==
-            (base_list[3] != p[0] &&
-             base_list[3] != p[1] &&
-            (base_list[3] != p[2] || !risprop));
-          break;
-
-          case 12:  /* Left alphanum vs right particular category */
-          case 13:  /* Left space vs right particular category */
-          case 14:  /* Left word vs right particular category */
-          p = posspropstab[n-12];
-          accepted = risprop && lisprop ==
-            (catposstab[p[0]][list[3]] &&
-             catposstab[p[1]][list[3]] &&
-            (list[3] != p[3] || !lisprop));
-          break;
-
-          case 15:  /* Right alphanum vs left particular category */
-          case 16:  /* Right space vs left particular category */
-          case 17:  /* Right word vs left particular category */
-          p = posspropstab[n-15];
-          accepted = lisprop && risprop ==
-            (catposstab[p[0]][base_list[3]] &&
-             catposstab[p[1]][base_list[3]] &&
-            (base_list[3] != p[3] || !risprop));
-          break;
-          }
-        }
-      }
-
-    else
-#endif  /* SUPPORT_UCP */
-
-    accepted = leftop >= FIRST_AUTOTAB_OP && leftop <= LAST_AUTOTAB_LEFT_OP &&
-           rightop >= FIRST_AUTOTAB_OP && rightop <= LAST_AUTOTAB_RIGHT_OP &&
-           autoposstab[leftop - FIRST_AUTOTAB_OP][rightop - FIRST_AUTOTAB_OP];
-
-    if (!accepted) return FALSE;
-
-    if (list[1] == 0) return TRUE;
-    /* Might be an empty repeat. */
-    continue;
-    }
-
-  /* Control reaches here only if one of the items is a small character list.
-  All characters are checked against the other side. */
-
-  do
-    {
-    chr = *chr_ptr;
-
-    switch(list_ptr[0])
-      {
-      case OP_CHAR:
-      ochr_ptr = list_ptr + 2;
-      do
-        {
-        if (chr == *ochr_ptr) return FALSE;
-        ochr_ptr++;
-        }
-      while(*ochr_ptr != NOTACHAR);
-      break;
-
-      case OP_NOT:
-      ochr_ptr = list_ptr + 2;
-      do
-        {
-        if (chr == *ochr_ptr)
-          break;
-        ochr_ptr++;
-        }
-      while(*ochr_ptr != NOTACHAR);
-      if (*ochr_ptr == NOTACHAR) return FALSE;   /* Not found */
-      break;
-
-      /* Note that OP_DIGIT etc. are generated only when PCRE_UCP is *not*
-      set. When it is set, \d etc. are converted into OP_(NOT_)PROP codes. */
-
-      case OP_DIGIT:
-      if (chr < 256 && (cd->ctypes[chr] & ctype_digit) != 0) return FALSE;
-      break;
-
-      case OP_NOT_DIGIT:
-      if (chr > 255 || (cd->ctypes[chr] & ctype_digit) == 0) return FALSE;
-      break;
-
-      case OP_WHITESPACE:
-      if (chr < 256 && (cd->ctypes[chr] & ctype_space) != 0) return FALSE;
-      break;
-
-      case OP_NOT_WHITESPACE:
-      if (chr > 255 || (cd->ctypes[chr] & ctype_space) == 0) return FALSE;
-      break;
-
-      case OP_WORDCHAR:
-      if (chr < 255 && (cd->ctypes[chr] & ctype_word) != 0) return FALSE;
-      break;
-
-      case OP_NOT_WORDCHAR:
-      if (chr > 255 || (cd->ctypes[chr] & ctype_word) == 0) return FALSE;
-      break;
-
-      case OP_HSPACE:
-      switch(chr)
-        {
-        HSPACE_CASES: return FALSE;
-        default: break;
-        }
-      break;
-
-      case OP_NOT_HSPACE:
-      switch(chr)
-        {
-        HSPACE_CASES: break;
-        default: return FALSE;
-        }
-      break;
-
-      case OP_ANYNL:
-      case OP_VSPACE:
-      switch(chr)
-        {
-        VSPACE_CASES: return FALSE;
-        default: break;
-        }
-      break;
-
-      case OP_NOT_VSPACE:
-      switch(chr)
-        {
-        VSPACE_CASES: break;
-        default: return FALSE;
-        }
-      break;
-
-      case OP_DOLL:
-      case OP_EODN:
-      switch (chr)
-        {
-        case CHAR_CR:
-        case CHAR_LF:
-        case CHAR_VT:
-        case CHAR_FF:
-        case CHAR_NEL:
-#ifndef EBCDIC
-        case 0x2028:
-        case 0x2029:
-#endif  /* Not EBCDIC */
-        return FALSE;
-        }
-      break;
-
-      case OP_EOD:    /* Can always possessify before \z */
-      break;
-
-#ifdef SUPPORT_UCP
-      case OP_PROP:
-      case OP_NOTPROP:
-      if (!check_char_prop(chr, list_ptr[2], list_ptr[3],
-            list_ptr[0] == OP_NOTPROP))
-        return FALSE;
-      break;
-#endif
-
-      case OP_NCLASS:
-      if (chr > 255) return FALSE;
-      /* Fall through */
-
-      case OP_CLASS:
-      if (chr > 255) break;
-      class_bitset = (pcre_uint8 *)
-        ((list_ptr == list ? code : base_end) - list_ptr[2]);
-      if ((class_bitset[chr >> 3] & (1 << (chr & 7))) != 0) return FALSE;
-      break;
-
-#if defined SUPPORT_UTF || !defined COMPILE_PCRE8
-      case OP_XCLASS:
-      if (PRIV(xclass)(chr, (list_ptr == list ? code : base_end) -
-          list_ptr[2] + LINK_SIZE, utf)) return FALSE;
-      break;
-#endif
-
-      default:
-      return FALSE;
-      }
-
-    chr_ptr++;
-    }
-  while(*chr_ptr != NOTACHAR);
-
-  /* At least one character must be matched from this opcode. */
-
-  if (list[1] == 0) return TRUE;
-  }
-
-/* Control never reaches here. There used to be a fail-save return FALSE; here,
-but some compilers complain about an unreachable statement. */
-
-}
-
-
-
-/*************************************************
-*    Scan compiled regex for auto-possession     *
-*************************************************/
-
-/* Replaces single character iterations with their possessive alternatives
-if appropriate. This function modifies the compiled opcode!
-
-Arguments:
-  code        points to start of the byte code
-  utf         TRUE in UTF-8 / UTF-16 / UTF-32 mode
-  cd          static compile data
-
-Returns:      nothing
-*/
-
-static void
-auto_possessify(pcre_uchar *code, BOOL utf, const compile_data *cd)
-{
-register pcre_uchar c;
-const pcre_uchar *end;
-pcre_uchar *repeat_opcode;
-pcre_uint32 list[8];
-int rec_limit;
-
-for (;;)
-  {
-  c = *code;
-
-  /* When a pattern with bad UTF-8 encoding is compiled with NO_UTF_CHECK,
-  it may compile without complaining, but may get into a loop here if the code
-  pointer points to a bad value. This is, of course a documentated possibility,
-  when NO_UTF_CHECK is set, so it isn't a bug, but we can detect this case and
-  just give up on this optimization. */
-
-  if (c >= OP_TABLE_LENGTH) return;
-
-  if (c >= OP_STAR && c <= OP_TYPEPOSUPTO)
-    {
-    c -= get_repeat_base(c) - OP_STAR;
-    end = (c <= OP_MINUPTO) ?
-      get_chr_property_list(code, utf, cd->fcc, list) : NULL;
-    list[1] = c == OP_STAR || c == OP_PLUS || c == OP_QUERY || c == OP_UPTO;
-
-    rec_limit = 1000;
-    if (end != NULL && compare_opcodes(end, utf, cd, list, end, &rec_limit))
-      {
-      switch(c)
-        {
-        case OP_STAR:
-        *code += OP_POSSTAR - OP_STAR;
-        break;
-
-        case OP_MINSTAR:
-        *code += OP_POSSTAR - OP_MINSTAR;
-        break;
-
-        case OP_PLUS:
-        *code += OP_POSPLUS - OP_PLUS;
-        break;
-
-        case OP_MINPLUS:
-        *code += OP_POSPLUS - OP_MINPLUS;
-        break;
-
-        case OP_QUERY:
-        *code += OP_POSQUERY - OP_QUERY;
-        break;
-
-        case OP_MINQUERY:
-        *code += OP_POSQUERY - OP_MINQUERY;
-        break;
-
-        case OP_UPTO:
-        *code += OP_POSUPTO - OP_UPTO;
-        break;
-
-        case OP_MINUPTO:
-        *code += OP_POSUPTO - OP_MINUPTO;
-        break;
-        }
-      }
-    c = *code;
-    }
-  else if (c == OP_CLASS || c == OP_NCLASS || c == OP_XCLASS)
-    {
-#if defined SUPPORT_UTF || !defined COMPILE_PCRE8
-    if (c == OP_XCLASS)
-      repeat_opcode = code + GET(code, 1);
-    else
-#endif
-      repeat_opcode = code + 1 + (32 / sizeof(pcre_uchar));
-
-    c = *repeat_opcode;
-    if (c >= OP_CRSTAR && c <= OP_CRMINRANGE)
-      {
-      /* end must not be NULL. */
-      end = get_chr_property_list(code, utf, cd->fcc, list);
-
-      list[1] = (c & 1) == 0;
-
-      rec_limit = 1000;
-      if (compare_opcodes(end, utf, cd, list, end, &rec_limit))
-        {
-        switch (c)
-          {
-          case OP_CRSTAR:
-          case OP_CRMINSTAR:
-          *repeat_opcode = OP_CRPOSSTAR;
-          break;
-
-          case OP_CRPLUS:
-          case OP_CRMINPLUS:
-          *repeat_opcode = OP_CRPOSPLUS;
-          break;
-
-          case OP_CRQUERY:
-          case OP_CRMINQUERY:
-          *repeat_opcode = OP_CRPOSQUERY;
-          break;
-
-          case OP_CRRANGE:
-          case OP_CRMINRANGE:
-          *repeat_opcode = OP_CRPOSRANGE;
-          break;
-          }
-        }
-      }
-    c = *code;
-    }
-
-  switch(c)
-    {
-    case OP_END:
-    return;
-
-    case OP_TYPESTAR:
-    case OP_TYPEMINSTAR:
-    case OP_TYPEPLUS:
-    case OP_TYPEMINPLUS:
-    case OP_TYPEQUERY:
-    case OP_TYPEMINQUERY:
-    case OP_TYPEPOSSTAR:
-    case OP_TYPEPOSPLUS:
-    case OP_TYPEPOSQUERY:
-    if (code[1] == OP_PROP || code[1] == OP_NOTPROP) code += 2;
-    break;
-
-    case OP_TYPEUPTO:
-    case OP_TYPEMINUPTO:
-    case OP_TYPEEXACT:
-    case OP_TYPEPOSUPTO:
-    if (code[1 + IMM2_SIZE] == OP_PROP || code[1 + IMM2_SIZE] == OP_NOTPROP)
-      code += 2;
-    break;
-
-#if defined SUPPORT_UTF || !defined COMPILE_PCRE8
-    case OP_XCLASS:
-    code += GET(code, 1);
-    break;
-#endif
-
-    case OP_MARK:
-    case OP_PRUNE_ARG:
-    case OP_SKIP_ARG:
-    case OP_THEN_ARG:
-    code += code[1];
-    break;
-    }
-
-  /* Add in the fixed length from the table */
-
-  code += PRIV(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
-  arrange to skip the extra bytes. */
-
-#if defined SUPPORT_UTF && !defined COMPILE_PCRE32
-  if (utf) switch(c)
-    {
-    case OP_CHAR:
-    case OP_CHARI:
-    case OP_NOT:
-    case OP_NOTI:
-    case OP_STAR:
-    case OP_MINSTAR:
-    case OP_PLUS:
-    case OP_MINPLUS:
-    case OP_QUERY:
-    case OP_MINQUERY:
-    case OP_UPTO:
-    case OP_MINUPTO:
-    case OP_EXACT:
-    case OP_POSSTAR:
-    case OP_POSPLUS:
-    case OP_POSQUERY:
-    case OP_POSUPTO:
-    case OP_STARI:
-    case OP_MINSTARI:
-    case OP_PLUSI:
-    case OP_MINPLUSI:
-    case OP_QUERYI:
-    case OP_MINQUERYI:
-    case OP_UPTOI:
-    case OP_MINUPTOI:
-    case OP_EXACTI:
-    case OP_POSSTARI:
-    case OP_POSPLUSI:
-    case OP_POSQUERYI:
-    case OP_POSUPTOI:
-    case OP_NOTSTAR:
-    case OP_NOTMINSTAR:
-    case OP_NOTPLUS:
-    case OP_NOTMINPLUS:
-    case OP_NOTQUERY:
-    case OP_NOTMINQUERY:
-    case OP_NOTUPTO:
-    case OP_NOTMINUPTO:
-    case OP_NOTEXACT:
-    case OP_NOTPOSSTAR:
-    case OP_NOTPOSPLUS:
-    case OP_NOTPOSQUERY:
-    case OP_NOTPOSUPTO:
-    case OP_NOTSTARI:
-    case OP_NOTMINSTARI:
-    case OP_NOTPLUSI:
-    case OP_NOTMINPLUSI:
-    case OP_NOTQUERYI:
-    case OP_NOTMINQUERYI:
-    case OP_NOTUPTOI:
-    case OP_NOTMINUPTOI:
-    case OP_NOTEXACTI:
-    case OP_NOTPOSSTARI:
-    case OP_NOTPOSPLUSI:
-    case OP_NOTPOSQUERYI:
-    case OP_NOTPOSUPTOI:
-    if (HAS_EXTRALEN(code[-1])) code += GET_EXTRALEN(code[-1]);
-    break;
-    }
-#else
-  (void)(utf);  /* Keep compiler happy by referencing function argument */
-#endif
-  }
-}
-
-
-
-/*************************************************
-*           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 a
-sequence of characters terminated by a matching ":]" or ".]" or "=]". If we
-reach an unescaped ']' without the special preceding character, return FALSE.
-
-Originally, this function only recognized a sequence of letters between the
-terminators, but it seems that Perl recognizes any sequence of characters,
-though of course unknown POSIX names are subsequently rejected. Perl gives an
-"Unknown POSIX class" error for [:f\oo:] for example, where previously PCRE
-didn't consider this to be a POSIX class. Likewise for [:1234:].
-
-The problem in trying to be exactly like Perl is in the handling of escapes. We
-have to be sure that [abc[:x\]pqr] is *not* treated as containing a POSIX
-class, but [abc[:x\]pqr:]] is (so that an error can be generated). The code
-below handles the special cases \\ and \], but does not try to do any other
-escape processing. This makes it different from Perl for cases such as
-[:l\ower:] where Perl recognizes it as the POSIX class "lower" but PCRE does
-not recognize "l\ower". This is a lesser evil than not diagnosing bad classes
-when Perl does, I think.
-
-A user pointed out that PCRE was rejecting [:a[:digit:]] whereas Perl was not.
-It seems that the appearance of a nested POSIX class supersedes an apparent
-external class. For example, [:a[:digit:]b:] matches "a", "b", ":", or
-a digit.
-
-In Perl, unescaped square brackets may also appear as part of class names. For
-example, [:a[:abc]b:] gives unknown POSIX class "[:abc]b:]". However, for
-[:a[:abc]b][b:] it gives unknown POSIX class "[:abc]b][b:]", which does not
-seem right at all. PCRE does not allow closing square brackets in POSIX class
-names.
-
-Arguments:
-  ptr      pointer to the initial [
-  endptr   where to return the end pointer
-
-Returns:   TRUE or FALSE
-*/
-
-static BOOL
-check_posix_syntax(const pcre_uchar *ptr, const pcre_uchar **endptr)
-{
-pcre_uchar terminator;          /* Don't combine these lines; the Solaris cc */
-terminator = *(++ptr);   /* compiler warns about "non-constant" initializer. */
-for (++ptr; *ptr != CHAR_NULL; ptr++)
-  {
-  if (*ptr == CHAR_BACKSLASH &&
-      (ptr[1] == CHAR_RIGHT_SQUARE_BRACKET ||
-       ptr[1] == CHAR_BACKSLASH))
-    ptr++;
-  else if ((*ptr == CHAR_LEFT_SQUARE_BRACKET && ptr[1] == terminator) ||
-            *ptr == CHAR_RIGHT_SQUARE_BRACKET) return FALSE;
-  else if (*ptr == terminator && ptr[1] == CHAR_RIGHT_SQUARE_BRACKET)
-    {
-    *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 pcre_uchar *ptr, int len)
-{
-const char *pn = posix_names;
-register int yield = 0;
-while (posix_name_lengths[yield] != 0)
-  {
-  if (len == posix_name_lengths[yield] &&
-    STRNCMP_UC_C8(ptr, pn, (unsigned int)len) == 0) return yield;
-  pn += posix_name_lengths[yield] + 1;
-  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 or OP_SKIPZERO 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 one of the jobs of this function. Before it
-is called, the partially compiled regex must be temporarily terminated with
-OP_END.
-
-This function has been extended to cope with forward references for recursions
-and subroutine calls. It must check the list of such references for the
-group we are dealing with. If it finds that one of the recursions in the
-current group is on this list, it does not adjust the value in the reference
-(which is a group number). After the group has been scanned, all the offsets in
-the forward reference list for the group are adjusted.
-
-Arguments:
-  group      points to the start of the group
-  adjust     the amount by which the group is to be moved
-  utf        TRUE in UTF-8 / UTF-16 / UTF-32 mode
-  cd         contains pointers to tables etc.
-  save_hwm_offset   the hwm forward reference offset at the start of the group
-
-Returns:     nothing
-*/
-
-static void
-adjust_recurse(pcre_uchar *group, int adjust, BOOL utf, compile_data *cd,
-  size_t save_hwm_offset)
-{
-int offset;
-pcre_uchar *hc;
-pcre_uchar *ptr = group;
-
-while ((ptr = (pcre_uchar *)find_recurse(ptr, utf)) != NULL)
-  {
-  for (hc = (pcre_uchar *)cd->start_workspace + save_hwm_offset; hc < cd->hwm;
-       hc += LINK_SIZE)
-    {
-    offset = (int)GET(hc, 0);
-    if (cd->start_code + offset == ptr + 1) break;
-    }
-
-  /* If we have not found this recursion on the forward reference list, adjust
-  the recursion's offset if it's after the start of this group. */
-
-  if (hc >= cd->hwm)
-    {
-    offset = (int)GET(ptr, 1);
-    if (cd->start_code + offset >= group) PUT(ptr, 1, offset + adjust);
-    }
-
-  ptr += 1 + LINK_SIZE;
-  }
-
-/* Now adjust all forward reference offsets for the group. */
-
-for (hc = (pcre_uchar *)cd->start_workspace + save_hwm_offset; hc < cd->hwm;
-     hc += LINK_SIZE)
-  {
-  offset = (int)GET(hc, 0);
-  PUT(hc, 0, offset + adjust);
-  }
-}
-
-
-
-/*************************************************
-*        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 pcre_uchar *
-auto_callout(pcre_uchar *code, const pcre_uchar *ptr, compile_data *cd)
-{
-*code++ = OP_CALLOUT;
-*code++ = 255;
-PUT(code, 0, (int)(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(pcre_uchar *previous_callout, const pcre_uchar *ptr, compile_data *cd)
-{
-int length = (int)(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 ranges of
-characters in the "other" case. Each call returns the next one, updating the
-start address. A character with multiple other cases is returned on its own
-with a special return value.
-
-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:        -1 when no more
-               0 when a range is returned
-              >0 the CASESET offset for char with multiple other cases
-                in this case, ocptr contains the original
-*/
-
-static int
-get_othercase_range(pcre_uint32 *cptr, pcre_uint32 d, pcre_uint32 *ocptr,
-  pcre_uint32 *odptr)
-{
-pcre_uint32 c, othercase, next;
-unsigned int co;
-
-/* Find the first character that has an other case. If it has multiple other
-cases, return its case offset value. */
-
-for (c = *cptr; c <= d; c++)
-  {
-  if ((co = UCD_CASESET(c)) != 0)
-    {
-    *ocptr = c++;   /* Character that has the set */
-    *cptr = c;      /* Rest of input range */
-    return (int)co;
-    }
-  if ((othercase = UCD_OTHERCASE(c)) != c) break;
-  }
-
-if (c > d) return -1;  /* Reached end of range */
-
-/* Found a character that has a single other case. Search for the end of the
-range, which is either the end of the input range, or a character that has zero
-or more than one other cases. */
-
-*ocptr = othercase;
-next = othercase + 1;
-
-for (++c; c <= d; c++)
-  {
-  if ((co = UCD_CASESET(c)) != 0 || UCD_OTHERCASE(c) != next) break;
-  next++;
-  }
-
-*odptr = next - 1;     /* End of othercase range */
-*cptr = c;             /* Rest of input range */
-return 0;
-}
-#endif  /* SUPPORT_UCP */
-
-
-
-/*************************************************
-*        Add a character or range to a class     *
-*************************************************/
-
-/* This function packages up the logic of adding a character or range of
-characters to a class. The character values in the arguments will be within the
-valid values for the current mode (8-bit, 16-bit, UTF, etc). This function is
-mutually recursive with the function immediately below.
-
-Arguments:
-  classbits     the bit map for characters < 256
-  uchardptr     points to the pointer for extra data
-  options       the options word
-  cd            contains pointers to tables etc.
-  start         start of range character
-  end           end of range character
-
-Returns:        the number of < 256 characters added
-                the pointer to extra data is updated
-*/
-
-static int
-add_to_class(pcre_uint8 *classbits, pcre_uchar **uchardptr, int options,
-  compile_data *cd, pcre_uint32 start, pcre_uint32 end)
-{
-pcre_uint32 c;
-pcre_uint32 classbits_end = (end <= 0xff ? end : 0xff);
-int n8 = 0;
-
-/* If caseless matching is required, scan the range and process alternate
-cases. In Unicode, there are 8-bit characters that have alternate cases that
-are greater than 255 and vice-versa. Sometimes we can just extend the original
-range. */
-
-if ((options & PCRE_CASELESS) != 0)
-  {
-#ifdef SUPPORT_UCP
-  if ((options & PCRE_UTF8) != 0)
-    {
-    int rc;
-    pcre_uint32 oc, od;
-
-    options &= ~PCRE_CASELESS;   /* Remove for recursive calls */
-    c = start;
-
-    while ((rc = get_othercase_range(&c, end, &oc, &od)) >= 0)
-      {
-      /* Handle a single character that has more than one other case. */
-
-      if (rc > 0) n8 += add_list_to_class(classbits, uchardptr, options, cd,
-        PRIV(ucd_caseless_sets) + rc, oc);
-
-      /* Do nothing if the other case range is within the original range. */
-
-      else if (oc >= start && od <= end) continue;
-
-      /* Extend the original range if there is overlap, noting that if oc < c, we
-      can't have od > end because a subrange is always shorter than the basic
-      range. Otherwise, use a recursive call to add the additional range. */
-
-      else if (oc < start && od >= start - 1) start = oc; /* Extend downwards */
-      else if (od > end && oc <= end + 1)
-        {
-        end = od;       /* Extend upwards */
-        if (end > classbits_end) classbits_end = (end <= 0xff ? end : 0xff);
-        }
-      else n8 += add_to_class(classbits, uchardptr, options, cd, oc, od);
-      }
-    }
-  else
-#endif  /* SUPPORT_UCP */
-
-  /* Not UTF-mode, or no UCP */
-
-  for (c = start; c <= classbits_end; c++)
-    {
-    SETBIT(classbits, cd->fcc[c]);
-    n8++;
-    }
-  }
-
-/* Now handle the original range. Adjust the final value according to the bit
-length - this means that the same lists of (e.g.) horizontal spaces can be used
-in all cases. */
-
-#if defined COMPILE_PCRE8
-#ifdef SUPPORT_UTF
-  if ((options & PCRE_UTF8) == 0)
-#endif
-  if (end > 0xff) end = 0xff;
-
-#elif defined COMPILE_PCRE16
-#ifdef SUPPORT_UTF
-  if ((options & PCRE_UTF16) == 0)
-#endif
-  if (end > 0xffff) end = 0xffff;
-
-#endif /* COMPILE_PCRE[8|16] */
-
-/* Use the bitmap for characters < 256. Otherwise use extra data.*/
-
-for (c = start; c <= classbits_end; c++)
-  {
-  /* Regardless of start, c will always be <= 255. */
-  SETBIT(classbits, c);
-  n8++;
-  }
-
-#if defined SUPPORT_UTF || !defined COMPILE_PCRE8
-if (start <= 0xff) start = 0xff + 1;
-
-if (end >= start)
-  {
-  pcre_uchar *uchardata = *uchardptr;
-#ifdef SUPPORT_UTF
-  if ((options & PCRE_UTF8) != 0)  /* All UTFs use the same flag bit */
-    {
-    if (start < end)
-      {
-      *uchardata++ = XCL_RANGE;
-      uchardata += PRIV(ord2utf)(start, uchardata);
-      uchardata += PRIV(ord2utf)(end, uchardata);
-      }
-    else if (start == end)
-      {
-      *uchardata++ = XCL_SINGLE;
-      uchardata += PRIV(ord2utf)(start, uchardata);
-      }
-    }
-  else
-#endif  /* SUPPORT_UTF */
-
-  /* Without UTF support, character values are constrained by the bit length,
-  and can only be > 256 for 16-bit and 32-bit libraries. */
-
-#ifdef COMPILE_PCRE8
-    {}
-#else
-  if (start < end)
-    {
-    *uchardata++ = XCL_RANGE;
-    *uchardata++ = start;
-    *uchardata++ = end;
-    }
-  else if (start == end)
-    {
-    *uchardata++ = XCL_SINGLE;
-    *uchardata++ = start;
-    }
-#endif
-
-  *uchardptr = uchardata;   /* Updata extra data pointer */
-  }
-#endif /* SUPPORT_UTF || !COMPILE_PCRE8 */
-
-return n8;    /* Number of 8-bit characters */
-}
-
-
-
-
-/*************************************************
-*        Add a list of characters to a class     *
-*************************************************/
-
-/* This function is used for adding a list of case-equivalent characters to a
-class, and also for adding a list of horizontal or vertical whitespace. If the
-list is in order (which it should be), ranges of characters are detected and
-handled appropriately. This function is mutually recursive with the function
-above.
-
-Arguments:
-  classbits     the bit map for characters < 256
-  uchardptr     points to the pointer for extra data
-  options       the options word
-  cd            contains pointers to tables etc.
-  p             points to row of 32-bit values, terminated by NOTACHAR
-  except        character to omit; this is used when adding lists of
-                  case-equivalent characters to avoid including the one we
-                  already know about
-
-Returns:        the number of < 256 characters added
-                the pointer to extra data is updated
-*/
-
-static int
-add_list_to_class(pcre_uint8 *classbits, pcre_uchar **uchardptr, int options,
-  compile_data *cd, const pcre_uint32 *p, unsigned int except)
-{
-int n8 = 0;
-while (p[0] < NOTACHAR)
-  {
-  int n = 0;
-  if (p[0] != except)
-    {
-    while(p[n+1] == p[0] + n + 1) n++;
-    n8 += add_to_class(classbits, uchardptr, options, cd, p[0], p[n]);
-    }
-  p += n + 1;
-  }
-return n8;
-}
-
-
-
-/*************************************************
-*    Add characters not in a list to a class     *
-*************************************************/
-
-/* This function is used for adding the complement of a list of horizontal or
-vertical whitespace to a class. The list must be in order.
-
-Arguments:
-  classbits     the bit map for characters < 256
-  uchardptr     points to the pointer for extra data
-  options       the options word
-  cd            contains pointers to tables etc.
-  p             points to row of 32-bit values, terminated by NOTACHAR
-
-Returns:        the number of < 256 characters added
-                the pointer to extra data is updated
-*/
-
-static int
-add_not_list_to_class(pcre_uint8 *classbits, pcre_uchar **uchardptr,
-  int options, compile_data *cd, const pcre_uint32 *p)
-{
-BOOL utf = (options & PCRE_UTF8) != 0;
-int n8 = 0;
-if (p[0] > 0)
-  n8 += add_to_class(classbits, uchardptr, options, cd, 0, p[0] - 1);
-while (p[0] < NOTACHAR)
-  {
-  while (p[1] == p[0] + 1) p++;
-  n8 += add_to_class(classbits, uchardptr, options, cd, p[0] + 1,
-    (p[1] == NOTACHAR) ? (utf ? 0x10ffffu : 0xffffffffu) : p[1] - 1);
-  p++;
-  }
-return n8;
-}
-
-
-
-/*************************************************
-*           Compile one branch                   *
-*************************************************/
-
-/* Scan the pattern, compiling it into the a vector. If the options are
-changed during the branch, the pointer is used to change the external options
-bits. This function is used during the pre-compile phase when we are trying
-to find out the amount of memory needed, as well as during the real compile
-phase. The value of lengthptr distinguishes the two phases.
-
-Arguments:
-  optionsptr        pointer to the option bits
-  codeptr           points to the pointer to the current code point
-  ptrptr            points to the current pattern pointer
-  errorcodeptr      points to error code variable
-  firstcharptr      place to put the first required character
-  firstcharflagsptr place to put the first character flags, or a negative number
-  reqcharptr        place to put the last required character
-  reqcharflagsptr   place to put the last required character flags, or a negative number
-  bcptr             points to current branch chain
-  cond_depth        conditional nesting depth
-  cd                contains pointers to tables etc.
-  lengthptr         NULL during the real compile phase
-                    points to length accumulator during pre-compile phase
-
-Returns:            TRUE on success
-                    FALSE, with *errorcodeptr set non-zero on error
-*/
-
-static BOOL
-compile_branch(int *optionsptr, pcre_uchar **codeptr,
-  const pcre_uchar **ptrptr, int *errorcodeptr,
-  pcre_uint32 *firstcharptr, pcre_int32 *firstcharflagsptr,
-  pcre_uint32 *reqcharptr, pcre_int32 *reqcharflagsptr,
-  branch_chain *bcptr, int cond_depth,
-  compile_data *cd, int *lengthptr)
-{
-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;
-pcre_uint32 firstchar, reqchar;
-pcre_int32 firstcharflags, reqcharflags;
-pcre_uint32 zeroreqchar, zerofirstchar;
-pcre_int32 zeroreqcharflags, zerofirstcharflags;
-pcre_int32 req_caseopt, reqvary, tempreqvary;
-int options = *optionsptr;               /* May change dynamically */
-int after_manual_callout = 0;
-int length_prevgroup = 0;
-register pcre_uint32 c;
-int escape;
-register pcre_uchar *code = *codeptr;
-pcre_uchar *last_code = code;
-pcre_uchar *orig_code = code;
-pcre_uchar *tempcode;
-BOOL inescq = FALSE;
-BOOL groupsetfirstchar = FALSE;
-const pcre_uchar *ptr = *ptrptr;
-const pcre_uchar *tempptr;
-const pcre_uchar *nestptr = NULL;
-pcre_uchar *previous = NULL;
-pcre_uchar *previous_callout = NULL;
-size_t item_hwm_offset = 0;
-pcre_uint8 classbits[32];
-
-/* We can fish out the UTF-8 setting once and for all into a BOOL, but we
-must not do this for other options (e.g. PCRE_EXTENDED) because they may change
-dynamically as we process the pattern. */
-
-#ifdef SUPPORT_UTF
-/* PCRE_UTF[16|32] have the same value as PCRE_UTF8. */
-BOOL utf = (options & PCRE_UTF8) != 0;
-#ifndef COMPILE_PCRE32
-pcre_uchar utf_chars[6];
-#endif
-#else
-BOOL utf = FALSE;
-#endif
-
-/* Helper variables for OP_XCLASS opcode (for characters > 255). We define
-class_uchardata always so that it can be passed to add_to_class() always,
-though it will not be used in non-UTF 8-bit cases. This avoids having to supply
-alternative calls for the different cases. */
-
-pcre_uchar *class_uchardata;
-#if defined SUPPORT_UTF || !defined COMPILE_PCRE8
-BOOL xclass;
-pcre_uchar *class_uchardata_base;
-#endif
-
-#ifdef PCRE_DEBUG
-if (lengthptr != NULL) DPRINTF((">> start branch\n"));
-#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; reqchar 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 zeroreqchar when such a repeat is encountered. The individual
-item types that can be repeated set these backoff variables appropriately. */
-
-firstchar = reqchar = zerofirstchar = zeroreqchar = 0;
-firstcharflags = reqcharflags = zerofirstcharflags = zeroreqcharflags = REQ_UNSET;
-
-/* The variable req_caseopt contains either the REQ_CASELESS value
-or zero, according to the current setting of the caseless flag. The
-REQ_CASELESS leaves the lower 28 bit empty. It is added into the
-firstchar or reqchar 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 should_flip_negation;
-  BOOL possessive_quantifier;
-  BOOL is_quantifier;
-  BOOL is_recurse;
-  BOOL reset_bracount;
-  int class_has_8bitchar;
-  int class_one_char;
-#if defined SUPPORT_UTF || !defined COMPILE_PCRE8
-  BOOL xclass_has_prop;
-#endif
-  int newoptions;
-  int recno;
-  int refsign;
-  int skipbytes;
-  pcre_uint32 subreqchar, subfirstchar;
-  pcre_int32 subreqcharflags, subfirstcharflags;
-  int terminator;
-  unsigned int mclength;
-  unsigned int tempbracount;
-  pcre_uint32 ec;
-  pcre_uchar mcbuffer[8];
-
-  /* Get next character in the pattern */
-
-  c = *ptr;
-
-  /* If we are at the end of a nested substitution, revert to the outer level
-  string. Nesting only happens one level deep. */
-
-  if (c == CHAR_NULL && nestptr != NULL)
-    {
-    ptr = nestptr;
-    nestptr = NULL;
-    c = *ptr;
-    }
-
-  /* If we are in the pre-compile phase, accumulate the length used for the
-  previous cycle of this loop. */
-
-  if (lengthptr != NULL)
-    {
-#ifdef PCRE_DEBUG
-    if (code > cd->hwm) cd->hwm = code;                 /* High water info */
-#endif
-    if (code > cd->start_workspace + cd->workspace_size -
-        WORK_SIZE_SAFETY_MARGIN)                       /* Check for overrun */
-      {
-      *errorcodeptr = ERR52;
-      goto FAILED;
-      }
-
-    /* There is at least one situation where code goes backwards: this is the
-    case of a zero quantifier after a class (e.g. [ab]{0}). At compile time,
-    the class is simply eliminated. However, it is created first, so we have to
-    allow memory for it. Therefore, don't ever reduce the length at this point.
-    */
-
-    if (code < last_code) code = last_code;
-
-    /* Paranoid check for integer overflow */
-
-    if (OFLOW_MAX - *lengthptr < code - last_code)
-      {
-      *errorcodeptr = ERR20;
-      goto FAILED;
-      }
-
-    *lengthptr += (int)(code - last_code);
-    DPRINTF(("length=%d added %d c=%c (0x%x)\n", *lengthptr,
-      (int)(code - last_code), c, c));
-
-    /* If "previous" is set and it is not at the start of the work space, move
-    it back to there, in order to avoid filling up the work space. Otherwise,
-    if "previous" is NULL, reset the current code pointer to the start. */
-
-    if (previous != NULL)
-      {
-      if (previous > orig_code)
-        {
-        memmove(orig_code, previous, IN_UCHARS(code - previous));
-        code -= previous - orig_code;
-        previous = orig_code;
-        }
-      }
-    else code = orig_code;
-
-    /* Remember where this code item starts so we can pick up the length
-    next time round. */
-
-    last_code = code;
-    }
-
-  /* In the real compile phase, just check the workspace used by the forward
-  reference list. */
-
-  else if (cd->hwm > cd->start_workspace + cd->workspace_size)
-    {
-    *errorcodeptr = ERR52;
-    goto FAILED;
-    }
-
-  /* If in \Q...\E, check for the end; if not, we have a literal */
-
-  if (inescq && c != CHAR_NULL)
-    {
-    if (c == CHAR_BACKSLASH && ptr[1] == CHAR_E)
-      {
-      inescq = FALSE;
-      ptr++;
-      continue;
-      }
-    else
-      {
-      if (previous_callout != NULL)
-        {
-        if (lengthptr == NULL)  /* Don't attempt in pre-compile phase */
-          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;
-      }
-    /* Control does not reach here. */
-    }
-
-  /* In extended mode, skip white space and comments. We need a loop in order
-  to check for more white space and more comments after a comment. */
-
-  if ((options & PCRE_EXTENDED) != 0)
-    {
-    for (;;)
-      {
-      while (MAX_255(c) && (cd->ctypes[c] & ctype_space) != 0) c = *(++ptr);
-      if (c != CHAR_NUMBER_SIGN) break;
-      ptr++;
-      while (*ptr != CHAR_NULL)
-        {
-        if (IS_NEWLINE(ptr))         /* For non-fixed-length newline cases, */
-          {                          /* IS_NEWLINE sets cd->nllen. */
-          ptr += cd->nllen;
-          break;
-          }
-        ptr++;
-#ifdef SUPPORT_UTF
-        if (utf) FORWARDCHAR(ptr);
-#endif
-        }
-      c = *ptr;     /* Either NULL or the char after a newline */
-      }
-    }
-
-  /* See if the next thing is a quantifier. */
-
-  is_quantifier =
-    c == CHAR_ASTERISK || c == CHAR_PLUS || c == CHAR_QUESTION_MARK ||
-    (c == CHAR_LEFT_CURLY_BRACKET && is_counted_repeat(ptr+1));
-
-  /* Fill in length of a previous callout, except when the next thing is a
-  quantifier or when processing a property substitution string in UCP mode. */
-
-  if (!is_quantifier && previous_callout != NULL && nestptr == NULL &&
-       after_manual_callout-- <= 0)
-    {
-    if (lengthptr == NULL)      /* Don't attempt in pre-compile phase */
-      complete_callout(previous_callout, ptr, cd);
-    previous_callout = NULL;
-    }
-
-  /* Create auto callout, except for quantifiers, or while processing property
-  strings that are substituted for \w etc in UCP mode. */
-
-  if ((options & PCRE_AUTO_CALLOUT) != 0 && !is_quantifier && nestptr == NULL)
-    {
-    previous_callout = code;
-    code = auto_callout(code, ptr, cd);
-    }
-
-  /* Process the next pattern item. */
-
-  switch(c)
-    {
-    /* ===================================================================*/
-    case CHAR_NULL:                /* The branch terminates at string end */
-    case CHAR_VERTICAL_LINE:       /* or | or ) */
-    case CHAR_RIGHT_PARENTHESIS:
-    *firstcharptr = firstchar;
-    *firstcharflagsptr = firstcharflags;
-    *reqcharptr = reqchar;
-    *reqcharflagsptr = reqcharflags;
-    *codeptr = code;
-    *ptrptr = ptr;
-    if (lengthptr != NULL)
-      {
-      if (OFLOW_MAX - *lengthptr < code - last_code)
-        {
-        *errorcodeptr = ERR20;
-        goto FAILED;
-        }
-      *lengthptr += (int)(code - last_code);   /* To include callout length */
-      DPRINTF((">> end branch\n"));
-      }
-    return TRUE;
-
-
-    /* ===================================================================*/
-    /* Handle single-character metacharacters. In multiline mode, ^ disables
-    the setting of any following char as a first character. */
-
-    case CHAR_CIRCUMFLEX_ACCENT:
-    previous = NULL;
-    if ((options & PCRE_MULTILINE) != 0)
-      {
-      if (firstcharflags == REQ_UNSET)
-        zerofirstcharflags = firstcharflags = REQ_NONE;
-      *code++ = OP_CIRCM;
-      }
-    else *code++ = OP_CIRC;
-    break;
-
-    case CHAR_DOLLAR_SIGN:
-    previous = NULL;
-    *code++ = ((options & PCRE_MULTILINE) != 0)? OP_DOLLM : OP_DOLL;
-    break;
-
-    /* There can never be a first char if '.' is first, whatever happens about
-    repeats. The value of reqchar doesn't change either. */
-
-    case CHAR_DOT:
-    if (firstcharflags == REQ_UNSET) firstcharflags = REQ_NONE;
-    zerofirstchar = firstchar;
-    zerofirstcharflags = firstcharflags;
-    zeroreqchar = reqchar;
-    zeroreqcharflags = reqcharflags;
-    previous = code;
-    item_hwm_offset = cd->hwm - cd->start_workspace;
-    *code++ = ((options & PCRE_DOTALL) != 0)? OP_ALLANY: OP_ANY;
-    break;
-
-
-    /* ===================================================================*/
-    /* Character classes. If the included characters are all < 256, 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.
-
-    In JavaScript compatibility mode, an isolated ']' causes an error. In
-    default (Perl) mode, it is treated as a data character. */
-
-    case CHAR_RIGHT_SQUARE_BRACKET:
-    if ((cd->external_options & PCRE_JAVASCRIPT_COMPAT) != 0)
-      {
-      *errorcodeptr = ERR64;
-      goto FAILED;
-      }
-    goto NORMAL_CHAR;
-
-    /* In another (POSIX) regex library, the ugly syntax [[:<:]] and [[:>:]] is
-    used for "start of word" and "end of word". As these are otherwise illegal
-    sequences, we don't break anything by recognizing them. They are replaced
-    by \b(?=\w) and \b(?<=\w) respectively. Sequences like [a[:<:]] are
-    erroneous and are handled by the normal code below. */
-
-    case CHAR_LEFT_SQUARE_BRACKET:
-    if (STRNCMP_UC_C8(ptr+1, STRING_WEIRD_STARTWORD, 6) == 0)
-      {
-      nestptr = ptr + 7;
-      ptr = sub_start_of_word - 1;
-      continue;
-      }
-
-    if (STRNCMP_UC_C8(ptr+1, STRING_WEIRD_ENDWORD, 6) == 0)
-      {
-      nestptr = ptr + 7;
-      ptr = sub_end_of_word - 1;
-      continue;
-      }
-
-    /* Handle a real character class. */
-
-    previous = code;
-    item_hwm_offset = cd->hwm - cd->start_workspace;
-
-    /* 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] == CHAR_COLON || ptr[1] == CHAR_DOT ||
-         ptr[1] == CHAR_EQUALS_SIGN) &&
-        check_posix_syntax(ptr, &tempptr))
-      {
-      *errorcodeptr = (ptr[1] == CHAR_COLON)? ERR13 : ERR31;
-      goto FAILED;
-      }
-
-    /* If the first character is '^', set the negation flag and skip it. Also,
-    if the first few characters (either before or after ^) are \Q\E or \E we
-    skip them too. This makes for compatibility with Perl. */
-
-    negate_class = FALSE;
-    for (;;)
-      {
-      c = *(++ptr);
-      if (c == CHAR_BACKSLASH)
-        {
-        if (ptr[1] == CHAR_E)
-          ptr++;
-        else if (STRNCMP_UC_C8(ptr + 1, STR_Q STR_BACKSLASH STR_E, 3) == 0)
-          ptr += 3;
-        else
-          break;
-        }
-      else if (!negate_class && c == CHAR_CIRCUMFLEX_ACCENT)
-        negate_class = TRUE;
-      else break;
-      }
-
-    /* Empty classes are allowed in JavaScript compatibility mode. Otherwise,
-    an initial ']' is taken as a data character -- the code below handles
-    that. In JS mode, [] must always fail, so generate OP_FAIL, whereas
-    [^] must match any character, so generate OP_ALLANY. */
-
-    if (c == CHAR_RIGHT_SQUARE_BRACKET &&
-        (cd->external_options & PCRE_JAVASCRIPT_COMPAT) != 0)
-      {
-      *code++ = negate_class? OP_ALLANY : OP_FAIL;
-      if (firstcharflags == REQ_UNSET) firstcharflags = REQ_NONE;
-      zerofirstchar = firstchar;
-      zerofirstcharflags = firstcharflags;
-      break;
-      }
-
-    /* If a class contains a negative special such as \S, we need to flip the
-    negation flag at the end, so that support for characters > 255 works
-    correctly (they are all included in the class). */
-
-    should_flip_negation = FALSE;
-
-    /* Extended class (xclass) will be used when characters > 255
-    might match. */
-
-#if defined SUPPORT_UTF || !defined COMPILE_PCRE8
-    xclass = FALSE;
-    class_uchardata = code + LINK_SIZE + 2;   /* For XCLASS items */
-    class_uchardata_base = class_uchardata;   /* Save the start */
-#endif
-
-    /* For optimization purposes, we track some properties of the class:
-    class_has_8bitchar will be non-zero if the class contains at least one <
-    256 character; class_one_char will be 1 if the class contains just one
-    character; xclass_has_prop will be TRUE if unicode property checks
-    are present in the class. */
-
-    class_has_8bitchar = 0;
-    class_one_char = 0;
-#if defined SUPPORT_UTF || !defined COMPILE_PCRE8
-    xclass_has_prop = FALSE;
-#endif
-
-    /* Initialize the 32-char bit map to all zeros. We build the map in a
-    temporary bit of memory, in case the class contains fewer than two
-    8-bit characters because in that case the compiled code doesn't use the bit
-    map. */
-
-    memset(classbits, 0, 32 * sizeof(pcre_uint8));
-
-    /* Process characters until ] is reached. By writing this as a "do" it
-    means that an initial ] is taken as a data character. At the start of the
-    loop, c contains the first byte of the character. */
-
-    if (c != CHAR_NULL) do
-      {
-      const pcre_uchar *oldptr;
-
-#ifdef SUPPORT_UTF
-      if (utf && HAS_EXTRALEN(c))
-        {                           /* Braces are required because the */
-        GETCHARLEN(c, ptr, ptr);    /* macro generates multiple statements */
-        }
-#endif
-
-#if defined SUPPORT_UTF || !defined COMPILE_PCRE8
-      /* In the pre-compile phase, accumulate the length of any extra
-      data and reset the pointer. This is so that very large classes that
-      contain a zillion > 255 characters no longer overwrite the work space
-      (which is on the stack). We have to remember that there was XCLASS data,
-      however. */
-
-      if (class_uchardata > class_uchardata_base) xclass = TRUE;
-
-      if (lengthptr != NULL && class_uchardata > class_uchardata_base)
-        {
-        *lengthptr += (int)(class_uchardata - class_uchardata_base);
-        class_uchardata = class_uchardata_base;
-        }
-#endif
-
-      /* Inside \Q...\E everything is literal except \E */
-
-      if (inescq)
-        {
-        if (c == CHAR_BACKSLASH && ptr[1] == CHAR_E)  /* If we are at \E */
-          {
-          inescq = FALSE;                   /* Reset literal state */
-          ptr++;                            /* Skip the 'E' */
-          continue;                         /* Carry on with next */
-          }
-        goto CHECK_RANGE;                   /* Could be range if \E follows */
-        }
-
-      /* 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 == CHAR_LEFT_SQUARE_BRACKET &&
-          (ptr[1] == CHAR_COLON || ptr[1] == CHAR_DOT ||
-           ptr[1] == CHAR_EQUALS_SIGN) && check_posix_syntax(ptr, &tempptr))
-        {
-        BOOL local_negate = FALSE;
-        int posix_class, taboffset, tabopt;
-        register const pcre_uint8 *cbits = cd->cbits;
-        pcre_uint8 pbits[32];
-
-        if (ptr[1] != CHAR_COLON)
-          {
-          *errorcodeptr = ERR31;
-          goto FAILED;
-          }
-
-        ptr += 2;
-        if (*ptr == CHAR_CIRCUMFLEX_ACCENT)
-          {
-          local_negate = TRUE;
-          should_flip_negation = TRUE;  /* Note negative special */
-          ptr++;
-          }
-
-        posix_class = check_posix_name(ptr, (int)(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;
-
-        /* When PCRE_UCP is set, some of the POSIX classes are converted to
-        different escape sequences that use Unicode properties \p or \P. Others
-        that are not available via \p or \P generate XCL_PROP/XCL_NOTPROP
-        directly. */
-
-#ifdef SUPPORT_UCP
-        if ((options & PCRE_UCP) != 0)
-          {
-          unsigned int ptype = 0;
-          int pc = posix_class + ((local_negate)? POSIX_SUBSIZE/2 : 0);
-
-          /* The posix_substitutes table specifies which POSIX classes can be
-          converted to \p or \P items. */
-
-          if (posix_substitutes[pc] != NULL)
-            {
-            nestptr = tempptr + 1;
-            ptr = posix_substitutes[pc] - 1;
-            continue;
-            }
-
-          /* There are three other classes that generate special property calls
-          that are recognized only in an XCLASS. */
-
-          else switch(posix_class)
-            {
-            case PC_GRAPH:
-            ptype = PT_PXGRAPH;
-            /* Fall through */
-            case PC_PRINT:
-            if (ptype == 0) ptype = PT_PXPRINT;
-            /* Fall through */
-            case PC_PUNCT:
-            if (ptype == 0) ptype = PT_PXPUNCT;
-            *class_uchardata++ = local_negate? XCL_NOTPROP : XCL_PROP;
-            *class_uchardata++ = ptype;
-            *class_uchardata++ = 0;
-            xclass_has_prop = TRUE;
-            ptr = tempptr + 1;
-            continue;
-
-            /* For the other POSIX classes (ascii, xdigit) we are going to fall
-            through to the non-UCP case and build a bit map for characters with
-            code points less than 256. If we are in a negated POSIX class
-            within a non-negated overall class, characters with code points
-            greater than 255 must all match. In the special case where we have
-            not yet generated any xclass data, and this is the final item in
-            the overall class, we need do nothing: later on, the opcode
-            OP_NCLASS will be used to indicate that characters greater than 255
-            are acceptable. If we have already seen an xclass item or one may
-            follow (we have to assume that it might if this is not the end of
-            the class), explicitly match all wide codepoints. */
-
-            default:
-            if (!negate_class && local_negate &&
-                (xclass || tempptr[2] != CHAR_RIGHT_SQUARE_BRACKET))
-              {
-              *class_uchardata++ = XCL_RANGE;
-              class_uchardata += PRIV(ord2utf)(0x100, class_uchardata);
-              class_uchardata += PRIV(ord2utf)(0x10ffff, class_uchardata);
-              }
-            break;
-            }
-          }
-#endif
-        /* In the non-UCP case, or when UCP makes no difference, we build the
-        bit map for the POSIX class in a chunk of local store because we may be
-        adding and subtracting from it, and we don't want to subtract bits that
-        may be in the main map already. At the end we or the result into the
-        bit map that is being built. */
-
-        posix_class *= 3;
-
-        /* Copy in the first table (always present) */
-
-        memcpy(pbits, cbits + posix_class_maps[posix_class],
-          32 * sizeof(pcre_uint8));
-
-        /* If there is a second table, add or remove it as required. */
-
-        taboffset = posix_class_maps[posix_class + 1];
-        tabopt = posix_class_maps[posix_class + 2];
-
-        if (taboffset >= 0)
-          {
-          if (tabopt >= 0)
-            for (c = 0; c < 32; c++) pbits[c] |= cbits[c + taboffset];
-          else
-            for (c = 0; c < 32; c++) pbits[c] &= ~cbits[c + taboffset];
-          }
-
-        /* Now see if we need to remove any special characters. An option
-        value of 1 removes vertical space and 2 removes underscore. */
-
-        if (tabopt < 0) tabopt = -tabopt;
-        if (tabopt == 1) pbits[1] &= ~0x3c;
-          else if (tabopt == 2) pbits[11] &= 0x7f;
-
-        /* Add the POSIX table or its complement into the main table that is
-        being built and we are done. */
-
-        if (local_negate)
-          for (c = 0; c < 32; c++) classbits[c] |= ~pbits[c];
-        else
-          for (c = 0; c < 32; c++) classbits[c] |= pbits[c];
-
-        ptr = tempptr + 1;
-        /* Every class contains at least one < 256 character. */
-        class_has_8bitchar = 1;
-        /* Every class contains at least two characters. */
-        class_one_char = 2;
-        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. The sequence \b is a special
-      case. Inside a class (and only there) it is treated as backspace. We
-      assume that other escapes have more than one character in them, so
-      speculatively set both class_has_8bitchar and class_one_char bigger
-      than one. Unrecognized escapes fall through and are either treated
-      as literal characters (by default), or are faulted if
-      PCRE_EXTRA is set. */
-
-      if (c == CHAR_BACKSLASH)
-        {
-        escape = check_escape(&ptr, &ec, errorcodeptr, cd->bracount, options,
-          TRUE);
-        if (*errorcodeptr != 0) goto FAILED;
-        if (escape == 0) c = ec;
-        else if (escape == ESC_b) c = CHAR_BS; /* \b is backspace in a class */
-        else if (escape == ESC_N)          /* \N is not supported in a class */
-          {
-          *errorcodeptr = ERR71;
-          goto FAILED;
-          }
-        else if (escape == ESC_Q)            /* Handle start of quoted string */
-          {
-          if (ptr[1] == CHAR_BACKSLASH && ptr[2] == CHAR_E)
-            {
-            ptr += 2; /* avoid empty string */
-            }
-          else inescq = TRUE;
-          continue;
-          }
-        else if (escape == ESC_E) continue;  /* Ignore orphan \E */
-
-        else
-          {
-          register const pcre_uint8 *cbits = cd->cbits;
-          /* Every class contains at least two < 256 characters. */
-          class_has_8bitchar++;
-          /* Every class contains at least two characters. */
-          class_one_char += 2;
-
-          switch (escape)
-            {
-#ifdef SUPPORT_UCP
-            case ESC_du:     /* These are the values given for \d etc */
-            case ESC_DU:     /* when PCRE_UCP is set. We replace the */
-            case ESC_wu:     /* escape sequence with an appropriate \p */
-            case ESC_WU:     /* or \P to test Unicode properties instead */
-            case ESC_su:     /* of the default ASCII testing. */
-            case ESC_SU:
-            nestptr = ptr;
-            ptr = substitutes[escape - ESC_DU] - 1;  /* Just before substitute */
-            class_has_8bitchar--;                /* Undo! */
-            continue;
-#endif
-            case ESC_d:
-            for (c = 0; c < 32; c++) classbits[c] |= cbits[c+cbit_digit];
-            continue;
-
-            case ESC_D:
-            should_flip_negation = TRUE;
-            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:
-            should_flip_negation = TRUE;
-            for (c = 0; c < 32; c++) classbits[c] |= ~cbits[c+cbit_word];
-            continue;
-
-            /* Perl 5.004 onwards omitted VT from \s, but restored it at Perl
-            5.18. Before PCRE 8.34, we had to preserve the VT bit if it was
-            previously set by something earlier in the character class.
-            Luckily, the value of CHAR_VT is 0x0b in both ASCII and EBCDIC, so
-            we could just adjust the appropriate bit. From PCRE 8.34 we no
-            longer treat \s and \S specially. */
-
-            case ESC_s:
-            for (c = 0; c < 32; c++) classbits[c] |= cbits[c+cbit_space];
-            continue;
-
-            case ESC_S:
-            should_flip_negation = TRUE;
-            for (c = 0; c < 32; c++) classbits[c] |= ~cbits[c+cbit_space];
-            continue;
-
-            /* The rest apply in both UCP and non-UCP cases. */
-
-            case ESC_h:
-            (void)add_list_to_class(classbits, &class_uchardata, options, cd,
-              PRIV(hspace_list), NOTACHAR);
-            continue;
-
-            case ESC_H:
-            (void)add_not_list_to_class(classbits, &class_uchardata, options,
-              cd, PRIV(hspace_list));
-            continue;
-
-            case ESC_v:
-            (void)add_list_to_class(classbits, &class_uchardata, options, cd,
-              PRIV(vspace_list), NOTACHAR);
-            continue;
-
-            case ESC_V:
-            (void)add_not_list_to_class(classbits, &class_uchardata, options,
-              cd, PRIV(vspace_list));
-            continue;
-
-            case ESC_p:
-            case ESC_P:
-#ifdef SUPPORT_UCP
-              {
-              BOOL negated;
-              unsigned int ptype = 0, pdata = 0;
-              if (!get_ucp(&ptr, &negated, &ptype, &pdata, errorcodeptr))
-                goto FAILED;
-              *class_uchardata++ = ((escape == ESC_p) != negated)?
-                XCL_PROP : XCL_NOTPROP;
-              *class_uchardata++ = ptype;
-              *class_uchardata++ = pdata;
-              xclass_has_prop = TRUE;
-              class_has_8bitchar--;                /* Undo! */
-              continue;
-              }
-#else
-            *errorcodeptr = ERR45;
-            goto FAILED;
-#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;
-              }
-            class_has_8bitchar--;    /* Undo the speculative increase. */
-            class_one_char -= 2;     /* Undo the speculative increase. */
-            c = *ptr;                /* Get the final character and fall through */
-            break;
-            }
-          }
-
-        /* Fall through if the escape just defined a single character (c >= 0).
-        This may be greater than 256. */
-
-        escape = 0;
-
-        }   /* End of backslash handling */
-
-      /* A character may be followed by '-' to form a range. However, Perl does
-      not permit ']' to be the end of the range. A '-' character at the end is
-      treated as a literal. Perl ignores orphaned \E sequences entirely. The
-      code for handling \Q and \E is messy. */
-
-      CHECK_RANGE:
-      while (ptr[1] == CHAR_BACKSLASH && ptr[2] == CHAR_E)
-        {
-        inescq = FALSE;
-        ptr += 2;
-        }
-      oldptr = ptr;
-
-      /* Remember if \r or \n were explicitly used */
-
-      if (c == CHAR_CR || c == CHAR_NL) cd->external_flags |= PCRE_HASCRORLF;
-
-      /* Check for range */
-
-      if (!inescq && ptr[1] == CHAR_MINUS)
-        {
-        pcre_uint32 d;
-        ptr += 2;
-        while (*ptr == CHAR_BACKSLASH && ptr[1] == CHAR_E) ptr += 2;
-
-        /* If we hit \Q (not followed by \E) at this point, go into escaped
-        mode. */
-
-        while (*ptr == CHAR_BACKSLASH && ptr[1] == CHAR_Q)
-          {
-          ptr += 2;
-          if (*ptr == CHAR_BACKSLASH && ptr[1] == CHAR_E)
-            { ptr += 2; continue; }
-          inescq = TRUE;
-          break;
-          }
-
-        /* Minus (hyphen) at the end of a class is treated as a literal, so put
-        back the pointer and jump to handle the character that preceded it. */
-
-        if (*ptr == CHAR_NULL || (!inescq && *ptr == CHAR_RIGHT_SQUARE_BRACKET))
-          {
-          ptr = oldptr;
-          goto CLASS_SINGLE_CHARACTER;
-          }
-
-        /* Otherwise, we have a potential range; pick up the next character */
-
-#ifdef SUPPORT_UTF
-        if (utf)
-          {                           /* 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
-        sequence, but not any of the other escapes. Perl treats a hyphen as a
-        literal in such circumstances. However, in Perl's warning mode, a
-        warning is given, so PCRE now faults it as it is almost certainly a
-        mistake on the user's part. */
-
-        if (!inescq)
-          {
-          if (d == CHAR_BACKSLASH)
-            {
-            int descape;
-            descape = check_escape(&ptr, &d, errorcodeptr, cd->bracount, options, TRUE);
-            if (*errorcodeptr != 0) goto FAILED;
-
-            /* 0 means a character was put into d; \b is backspace; any other
-            special causes an error. */
-
-            if (descape != 0)
-              {
-              if (descape == ESC_b) d = CHAR_BS; else
-                {
-                *errorcodeptr = ERR83;
-                goto FAILED;
-                }
-              }
-            }
-
-          /* A hyphen followed by a POSIX class is treated in the same way. */
-
-          else if (d == CHAR_LEFT_SQUARE_BRACKET &&
-                   (ptr[1] == CHAR_COLON || ptr[1] == CHAR_DOT ||
-                    ptr[1] == CHAR_EQUALS_SIGN) &&
-                   check_posix_syntax(ptr, &tempptr))
-            {
-            *errorcodeptr = ERR83;
-            goto FAILED;
-            }
-          }
-
-        /* Check that the two values are in the correct order. Optimize
-        one-character ranges. */
-
-        if (d < c)
-          {
-          *errorcodeptr = ERR8;
-          goto FAILED;
-          }
-        if (d == c) goto CLASS_SINGLE_CHARACTER;  /* A few lines below */
-
-        /* We have found a character range, so single character optimizations
-        cannot be done anymore. Any value greater than 1 indicates that there
-        is more than one character. */
-
-        class_one_char = 2;
-
-        /* Remember an explicit \r or \n, and add the range to the class. */
-
-        if (d == CHAR_CR || d == CHAR_NL) cd->external_flags |= PCRE_HASCRORLF;
-
-        class_has_8bitchar +=
-          add_to_class(classbits, &class_uchardata, options, cd, c, d);
-
-        continue;   /* Go get the next char in the class */
-        }
-
-      /* Handle a 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. Only the value 1 matters for class_one_char, so don't
-      increase it if it is already 2 or more ... just in case there's a class
-      with a zillion characters in it. */
-
-      CLASS_SINGLE_CHARACTER:
-      if (class_one_char < 2) class_one_char++;
-
-      /* If xclass_has_prop is false and class_one_char is 1, we have the first
-      single character in the class, and there have been no prior ranges, or
-      XCLASS items generated by escapes. If this is the final character in the
-      class, we can optimize by turning the item into a 1-character OP_CHAR[I]
-      if it's positive, or OP_NOT[I] if it's negative. In the positive case, it
-      can cause firstchar to be set. Otherwise, there can be no first char if
-      this item is first, whatever repeat count may follow. In the case of
-      reqchar, save the previous value for reinstating. */
-
-      if (!inescq &&
-#ifdef SUPPORT_UCP
-          !xclass_has_prop &&
-#endif
-          class_one_char == 1 && ptr[1] == CHAR_RIGHT_SQUARE_BRACKET)
-        {
-        ptr++;
-        zeroreqchar = reqchar;
-        zeroreqcharflags = reqcharflags;
-
-        if (negate_class)
-          {
-#ifdef SUPPORT_UCP
-          int d;
-#endif
-          if (firstcharflags == REQ_UNSET) firstcharflags = REQ_NONE;
-          zerofirstchar = firstchar;
-          zerofirstcharflags = firstcharflags;
-
-          /* For caseless UTF-8 mode when UCP support is available, check
-          whether this character has more than one other case. If so, generate
-          a special OP_NOTPROP item instead of OP_NOTI. */
-
-#ifdef SUPPORT_UCP
-          if (utf && (options & PCRE_CASELESS) != 0 &&
-              (d = UCD_CASESET(c)) != 0)
-            {
-            *code++ = OP_NOTPROP;
-            *code++ = PT_CLIST;
-            *code++ = d;
-            }
-          else
-#endif
-          /* Char has only one other case, or UCP not available */
-
-            {
-            *code++ = ((options & PCRE_CASELESS) != 0)? OP_NOTI: OP_NOT;
-#if defined SUPPORT_UTF && !defined COMPILE_PCRE32
-            if (utf && c > MAX_VALUE_FOR_SINGLE_CHAR)
-              code += PRIV(ord2utf)(c, code);
-            else
-#endif
-              *code++ = c;
-            }
-
-          /* We are finished with this character class */
-
-          goto END_CLASS;
-          }
-
-        /* For a single, positive character, get the value into mcbuffer, and
-        then we can handle this with the normal one-character code. */
-
-#if defined SUPPORT_UTF && !defined COMPILE_PCRE32
-        if (utf && c > MAX_VALUE_FOR_SINGLE_CHAR)
-          mclength = PRIV(ord2utf)(c, mcbuffer);
-        else
-#endif
-          {
-          mcbuffer[0] = c;
-          mclength = 1;
-          }
-        goto ONE_CHAR;
-        }       /* End of 1-char optimization */
-
-      /* There is more than one character in the class, or an XCLASS item
-      has been generated. Add this character to the class. */
-
-      class_has_8bitchar +=
-        add_to_class(classbits, &class_uchardata, options, cd, c, c);
-      }
-
-    /* Loop until ']' reached. This "while" is the end of the "do" far above.
-    If we are at the end of an internal nested string, revert to the outer
-    string. */
-
-    while (((c = *(++ptr)) != CHAR_NULL ||
-           (nestptr != NULL &&
-             (ptr = nestptr, nestptr = NULL, c = *(++ptr)) != CHAR_NULL)) &&
-           (c != CHAR_RIGHT_SQUARE_BRACKET || inescq));
-
-    /* Check for missing terminating ']' */
-
-    if (c == CHAR_NULL)
-      {
-      *errorcodeptr = ERR6;
-      goto FAILED;
-      }
-
-    /* We will need an XCLASS if data has been placed in class_uchardata. In
-    the second phase this is a sufficient test. However, in the pre-compile
-    phase, class_uchardata gets emptied to prevent workspace overflow, so it
-    only if the very last character in the class needs XCLASS will it contain
-    anything at this point. For this reason, xclass gets set TRUE above when
-    uchar_classdata is emptied, and that's why this code is the way it is here
-    instead of just doing a test on class_uchardata below. */
-
-#if defined SUPPORT_UTF || !defined COMPILE_PCRE8
-    if (class_uchardata > class_uchardata_base) xclass = TRUE;
-#endif
-
-    /* If this is the first thing in the branch, there can be no first char
-    setting, whatever the repeat count. Any reqchar setting must remain
-    unchanged after any kind of repeat. */
-
-    if (firstcharflags == REQ_UNSET) firstcharflags = REQ_NONE;
-    zerofirstchar = firstchar;
-    zerofirstcharflags = firstcharflags;
-    zeroreqchar = reqchar;
-    zeroreqcharflags = reqcharflags;
-
-    /* If there are characters with values > 255, we have to compile an
-    extended class, with its own opcode, unless there was a negated special
-    such as \S in the class, and PCRE_UCP is not set, because in that case all
-    characters > 255 are in the class, so any that were explicitly given as
-    well can be ignored. If (when there are explicit characters > 255 that must
-    be listed) there are no characters < 256, we can omit the bitmap in the
-    actual compiled code. */
-
-#ifdef SUPPORT_UTF
-    if (xclass && (xclass_has_prop || !should_flip_negation ||
-        (options & PCRE_UCP) != 0))
-#elif !defined COMPILE_PCRE8
-    if (xclass && (xclass_has_prop || !should_flip_negation))
-#endif
-#if defined SUPPORT_UTF || !defined COMPILE_PCRE8
-      {
-      *class_uchardata++ = XCL_END;    /* Marks the end of extra data */
-      *code++ = OP_XCLASS;
-      code += LINK_SIZE;
-      *code = negate_class? XCL_NOT:0;
-      if (xclass_has_prop) *code |= XCL_HASPROP;
-
-      /* If the map is required, move up the extra data to make room for it;
-      otherwise just move the code pointer to the end of the extra data. */
-
-      if (class_has_8bitchar > 0)
-        {
-        *code++ |= XCL_MAP;
-        memmove(code + (32 / sizeof(pcre_uchar)), code,
-          IN_UCHARS(class_uchardata - code));
-        if (negate_class && !xclass_has_prop)
-          for (c = 0; c < 32; c++) classbits[c] = ~classbits[c];
-        memcpy(code, classbits, 32);
-        code = class_uchardata + (32 / sizeof(pcre_uchar));
-        }
-      else code = class_uchardata;
-
-      /* Now fill in the complete length of the item */
-
-      PUT(previous, 1, (int)(code - previous));
-      break;   /* End of class handling */
-      }
-
-    /* Even though any XCLASS list is now discarded, we must allow for
-    its memory. */
-
-    if (lengthptr != NULL)
-      *lengthptr += (int)(class_uchardata - class_uchardata_base);
-#endif
-
-    /* If there are no characters > 255, or they are all to be included or
-    excluded, set the opcode to OP_CLASS or OP_NCLASS, depending on whether the
-    whole class was negated and whether there were negative specials such as \S
-    (non-UCP) in the class. Then copy the 32-byte map into the code vector,
-    negating it if necessary. */
-
-    *code++ = (negate_class == should_flip_negation) ? OP_CLASS : OP_NCLASS;
-    if (lengthptr == NULL)    /* Save time in the pre-compile phase */
-      {
-      if (negate_class)
-        for (c = 0; c < 32; c++) classbits[c] = ~classbits[c];
-      memcpy(code, classbits, 32);
-      }
-    code += 32 / sizeof(pcre_uchar);
-
-    END_CLASS:
-    break;
-
-
-    /* ===================================================================*/
-    /* Various kinds of repeat; '{' is not necessarily a quantifier, but this
-    has been tested above. */
-
-    case CHAR_LEFT_CURLY_BRACKET:
-    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 CHAR_ASTERISK:
-    repeat_min = 0;
-    repeat_max = -1;
-    goto REPEAT;
-
-    case CHAR_PLUS:
-    repeat_min = 1;
-    repeat_max = -1;
-    goto REPEAT;
-
-    case CHAR_QUESTION_MARK:
-    repeat_min = 0;
-    repeat_max = 1;
-
-    REPEAT:
-    if (previous == NULL)
-      {
-      *errorcodeptr = ERR9;
-      goto FAILED;
-      }
-
-    if (repeat_min == 0)
-      {
-      firstchar = zerofirstchar;    /* Adjust for zero repeat */
-      firstcharflags = zerofirstcharflags;
-      reqchar = zeroreqchar;        /* Ditto */
-      reqcharflags = zeroreqcharflags;
-      }
-
-    /* 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 in order to
-    insert something before it. */
-
-    tempcode = previous;
-
-    /* Before checking for a possessive quantifier, we must skip over
-    whitespace and comments in extended mode because Perl allows white space at
-    this point. */
-
-    if ((options & PCRE_EXTENDED) != 0)
-      {
-      const pcre_uchar *p = ptr + 1;
-      for (;;)
-        {
-        while (MAX_255(*p) && (cd->ctypes[*p] & ctype_space) != 0) p++;
-        if (*p != CHAR_NUMBER_SIGN) break;
-        p++;
-        while (*p != CHAR_NULL)
-          {
-          if (IS_NEWLINE(p))         /* For non-fixed-length newline cases, */
-            {                        /* IS_NEWLINE sets cd->nllen. */
-            p += cd->nllen;
-            break;
-            }
-          p++;
-#ifdef SUPPORT_UTF
-          if (utf) FORWARDCHAR(p);
-#endif
-          }           /* Loop for comment characters */
-        }             /* Loop for multiple comments */
-      ptr = p - 1;    /* Character before the next significant one. */
-      }
-
-    /* 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] == CHAR_PLUS)
-      {
-      repeat_type = 0;                  /* Force greedy */
-      possessive_quantifier = TRUE;
-      ptr++;
-      }
-    else if (ptr[1] == CHAR_QUESTION_MARK)
-      {
-      repeat_type = greedy_non_default;
-      ptr++;
-      }
-    else repeat_type = greedy_default;
-
-    /* If previous was a recursion call, wrap it in atomic brackets so that
-    previous becomes the atomic group. All recursions were so wrapped in the
-    past, but it no longer happens for non-repeated recursions. In fact, the
-    repeated ones could be re-implemented independently so as not to need this,
-    but for the moment we rely on the code for repeating groups. */
-
-    if (*previous == OP_RECURSE)
-      {
-      memmove(previous + 1 + LINK_SIZE, previous, IN_UCHARS(1 + LINK_SIZE));
-      *previous = OP_ONCE;
-      PUT(previous, 1, 2 + 2*LINK_SIZE);
-      previous[2 + 2*LINK_SIZE] = OP_KET;
-      PUT(previous, 3 + 2*LINK_SIZE, 2 + 2*LINK_SIZE);
-      code += 2 + 2 * LINK_SIZE;
-      length_prevgroup = 3 + 3*LINK_SIZE;
-
-      /* When actually compiling, we need to check whether this was a forward
-      reference, and if so, adjust the offset. */
-
-      if (lengthptr == NULL && cd->hwm >= cd->start_workspace + LINK_SIZE)
-        {
-        int offset = GET(cd->hwm, -LINK_SIZE);
-        if (offset == previous + 1 - cd->start_code)
-          PUT(cd->hwm, -LINK_SIZE, offset + 1 + LINK_SIZE);
-        }
-      }
-
-    /* Now handle repetition for the different types of item. */
-
-    /* If previous was a character or negated character match, abolish the item
-    and generate a repeat item instead. If a char item has a minimum of more
-    than one, ensure that it is set in reqchar - 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 firstchar instead.  */
-
-    if (*previous == OP_CHAR || *previous == OP_CHARI
-        || *previous == OP_NOT || *previous == OP_NOTI)
-      {
-      switch (*previous)
-        {
-        default: /* Make compiler happy. */
-        case OP_CHAR:  op_type = OP_STAR - OP_STAR; break;
-        case OP_CHARI: op_type = OP_STARI - OP_STAR; break;
-        case OP_NOT:   op_type = OP_NOTSTAR - OP_STAR; break;
-        case OP_NOTI:  op_type = OP_NOTSTARI - OP_STAR; break;
-        }
-
-      /* Deal with UTF characters that take up more than one character. 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 UTF_LENGTH to flag that
-      it's a length rather than a small character. */
-
-#if defined SUPPORT_UTF && !defined COMPILE_PCRE32
-      if (utf && NOT_FIRSTCHAR(code[-1]))
-        {
-        pcre_uchar *lastchar = code - 1;
-        BACKCHAR(lastchar);
-        c = (int)(code - lastchar);     /* Length of UTF-8 character */
-        memcpy(utf_chars, lastchar, IN_UCHARS(c)); /* Save the char */
-        c |= UTF_LENGTH;                /* Flag c as a length */
-        }
-      else
-#endif /* SUPPORT_UTF */
-
-      /* Handle the case of a single charater - either with no UTF support, or
-      with UTF disabled, or for a single character UTF character. */
-        {
-        c = code[-1];
-        if (*previous <= OP_CHARI && repeat_min > 1)
-          {
-          reqchar = c;
-          reqcharflags = req_caseopt | cd->req_varyopt;
-          }
-        }
-
-      goto OUTPUT_SINGLE_REPEAT;   /* Code shared with single character types */
-      }
-
-    /* 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)
-      {
-      pcre_uchar *oldcode;
-      int prop_type, prop_value;
-      op_type = OP_TYPESTAR - OP_STAR;  /* Use type opcodes */
-      c = *previous;
-
-      OUTPUT_SINGLE_REPEAT:
-      if (*previous == OP_PROP || *previous == OP_NOTPROP)
-        {
-        prop_type = previous[1];
-        prop_value = previous[2];
-        }
-      else prop_type = prop_value = -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;
-
-      /* 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 is
-      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 are two extra bytes that define the
-        required property. In UTF-8 mode, long characters have their length in
-        c, with the UTF_LENGTH bit as a flag. */
-
-        if (repeat_max < 0)
-          {
-#if defined SUPPORT_UTF && !defined COMPILE_PCRE32
-          if (utf && (c & UTF_LENGTH) != 0)
-            {
-            memcpy(code, utf_chars, IN_UCHARS(c & 7));
-            code += c & 7;
-            }
-          else
-#endif
-            {
-            *code++ = c;
-            if (prop_type >= 0)
-              {
-              *code++ = prop_type;
-              *code++ = prop_value;
-              }
-            }
-          *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. If the
-        UPTO is just for 1 instance, we can use QUERY instead. */
-
-        else if (repeat_max != repeat_min)
-          {
-#if defined SUPPORT_UTF && !defined COMPILE_PCRE32
-          if (utf && (c & UTF_LENGTH) != 0)
-            {
-            memcpy(code, utf_chars, IN_UCHARS(c & 7));
-            code += c & 7;
-            }
-          else
-#endif
-          *code++ = c;
-          if (prop_type >= 0)
-            {
-            *code++ = prop_type;
-            *code++ = prop_value;
-            }
-          repeat_max -= repeat_min;
-
-          if (repeat_max == 1)
-            {
-            *code++ = OP_QUERY + repeat_type;
-            }
-          else
-            {
-            *code++ = OP_UPTO + repeat_type;
-            PUT2INC(code, 0, repeat_max);
-            }
-          }
-        }
-
-      /* The character or character type itself comes last in all cases. */
-
-#if defined SUPPORT_UTF && !defined COMPILE_PCRE32
-      if (utf && (c & UTF_LENGTH) != 0)
-        {
-        memcpy(code, utf_chars, IN_UCHARS(c & 7));
-        code += c & 7;
-        }
-      else
-#endif
-      *code++ = c;
-
-      /* For a repeated Unicode property match, there are two extra bytes that
-      define the required property. */
-
-#ifdef SUPPORT_UCP
-      if (prop_type >= 0)
-        {
-        *code++ = prop_type;
-        *code++ = prop_value;
-        }
-#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 ||
-#if defined SUPPORT_UTF || !defined COMPILE_PCRE8
-             *previous == OP_XCLASS ||
-#endif
-             *previous == OP_REF   || *previous == OP_REFI ||
-             *previous == OP_DNREF || *previous == OP_DNREFI)
-      {
-      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. Note that at this point we can encounter only the "basic" bracket
-    opcodes such as BRA and CBRA, as this is the place where they get converted
-    into the more special varieties such as BRAPOS and SBRA. A test for >=
-    OP_ASSERT and <= OP_COND includes ASSERT, ASSERT_NOT, ASSERTBACK,
-    ASSERTBACK_NOT, ONCE, ONCE_NC, BRA, BRAPOS, CBRA, CBRAPOS, and COND.
-    Originally, PCRE did not allow repetition of assertions, but now it does,
-    for Perl compatibility. */
-
-    else if (*previous >= OP_ASSERT && *previous <= OP_COND)
-      {
-      register int i;
-      int len = (int)(code - previous);
-      size_t base_hwm_offset = item_hwm_offset;
-      pcre_uchar *bralink = NULL;
-      pcre_uchar *brazeroptr = NULL;
-
-      /* Repeating a DEFINE group is pointless, but Perl allows the syntax, so
-      we just ignore the repeat. */
-
-      if (*previous == OP_COND && previous[LINK_SIZE+1] == OP_DEF)
-        goto END_REPEAT;
-
-      /* There is no sense in actually repeating assertions. The only potential
-      use of repetition is in cases when the assertion is optional. Therefore,
-      if the minimum is greater than zero, just ignore the repeat. If the
-      maximum is not zero or one, set it to 1. */
-
-      if (*previous < OP_ONCE)    /* Assertion */
-        {
-        if (repeat_min > 0) goto END_REPEAT;
-        if (repeat_max < 0 || repeat_max > 1) repeat_max = 1;
-        }
-
-      /* 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 used to just omit the group from the
-        output altogether, like this:
-
-        ** if (repeat_max == 0)
-        **   {
-        **   code = previous;
-        **   goto END_REPEAT;
-        **   }
-
-        However, that fails when a group or a subgroup within it is referenced
-        as a subroutine from elsewhere in the pattern, so now we stick in
-        OP_SKIPZERO in front of it so that it is skipped on execution. As we
-        don't have a list of which groups are referenced, we cannot do this
-        selectively.
-
-        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 or forward referenced group, because the offset is from the
-        start of the whole regex. Temporarily terminate the pattern while doing
-        this. */
-
-        if (repeat_max <= 1)    /* Covers 0, 1, and unlimited */
-          {
-          *code = OP_END;
-          adjust_recurse(previous, 1, utf, cd, item_hwm_offset);
-          memmove(previous + 1, previous, IN_UCHARS(len));
-          code++;
-          if (repeat_max == 0)
-            {
-            *previous++ = OP_SKIPZERO;
-            goto END_REPEAT;
-            }
-          brazeroptr = previous;    /* Save for possessive optimizing */
-          *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, utf, cd, item_hwm_offset);
-          memmove(previous + 2 + LINK_SIZE, previous, IN_UCHARS(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 : (int)(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. If there are any
-      forward reference subroutine calls in the group, there will be entries on
-      the workspace list; replicate these with an appropriate increment. */
-
-      else
-        {
-        if (repeat_min > 1)
-          {
-          /* In the pre-compile phase, we don't actually do the replication. We
-          just adjust the length as if we had. Do some paranoid checks for
-          potential integer overflow. The INT64_OR_DOUBLE type is a 64-bit
-          integer type when available, otherwise double. */
-
-          if (lengthptr != NULL)
-            {
-            int delta = (repeat_min - 1)*length_prevgroup;
-            if ((INT64_OR_DOUBLE)(repeat_min - 1)*
-                  (INT64_OR_DOUBLE)length_prevgroup >
-                    (INT64_OR_DOUBLE)INT_MAX ||
-                OFLOW_MAX - *lengthptr < delta)
-              {
-              *errorcodeptr = ERR20;
-              goto FAILED;
-              }
-            *lengthptr += delta;
-            }
-
-          /* This is compiling for real. If there is a set first byte for
-          the group, and we have not yet set a "required byte", set it. Make
-          sure there is enough workspace for copying forward references before
-          doing the copy. */
-
-          else
-            {
-            if (groupsetfirstchar && reqcharflags < 0)
-              {
-              reqchar = firstchar;
-              reqcharflags = firstcharflags;
-              }
-
-            for (i = 1; i < repeat_min; i++)
-              {
-              pcre_uchar *hc;
-              size_t this_hwm_offset = cd->hwm - cd->start_workspace;
-              memcpy(code, previous, IN_UCHARS(len));
-
-              while (cd->hwm > cd->start_workspace + cd->workspace_size -
-                     WORK_SIZE_SAFETY_MARGIN -
-                     (this_hwm_offset - base_hwm_offset))
-                {
-                *errorcodeptr = expand_workspace(cd);
-                if (*errorcodeptr != 0) goto FAILED;
-                }
-
-              for (hc = (pcre_uchar *)cd->start_workspace + base_hwm_offset;
-                   hc < (pcre_uchar *)cd->start_workspace + this_hwm_offset;
-                   hc += LINK_SIZE)
-                {
-                PUT(cd->hwm, 0, GET(hc, 0) + len);
-                cd->hwm += LINK_SIZE;
-                }
-              base_hwm_offset = this_hwm_offset;
-              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. Again, we must remember to
-      replicate entries on the forward reference list. */
-
-      if (repeat_max >= 0)
-        {
-        /* In the pre-compile phase, we don't actually do the replication. We
-        just adjust the length as if we had. For each repetition we must add 1
-        to the length for BRAZERO and for all but the last repetition we must
-        add 2 + 2*LINKSIZE to allow for the nesting that occurs. Do some
-        paranoid checks to avoid integer overflow. The INT64_OR_DOUBLE type is
-        a 64-bit integer type when available, otherwise double. */
-
-        if (lengthptr != NULL && repeat_max > 0)
-          {
-          int delta = repeat_max * (length_prevgroup + 1 + 2 + 2*LINK_SIZE) -
-                      2 - 2*LINK_SIZE;   /* Last one doesn't nest */
-          if ((INT64_OR_DOUBLE)repeat_max *
-                (INT64_OR_DOUBLE)(length_prevgroup + 1 + 2 + 2*LINK_SIZE)
-                  > (INT64_OR_DOUBLE)INT_MAX ||
-              OFLOW_MAX - *lengthptr < delta)
-            {
-            *errorcodeptr = ERR20;
-            goto FAILED;
-            }
-          *lengthptr += delta;
-          }
-
-        /* This is compiling for real */
-
-        else for (i = repeat_max - 1; i >= 0; i--)
-          {
-          pcre_uchar *hc;
-          size_t this_hwm_offset = cd->hwm - cd->start_workspace;
-
-          *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 : (int)(code - bralink);
-            bralink = code;
-            PUTINC(code, 0, offset);
-            }
-
-          memcpy(code, previous, IN_UCHARS(len));
-
-          /* Ensure there is enough workspace for forward references before
-          copying them. */
-
-          while (cd->hwm > cd->start_workspace + cd->workspace_size -
-                 WORK_SIZE_SAFETY_MARGIN -
-                 (this_hwm_offset - base_hwm_offset))
-            {
-            *errorcodeptr = expand_workspace(cd);
-            if (*errorcodeptr != 0) goto FAILED;
-            }
-
-          for (hc = (pcre_uchar *)cd->start_workspace + base_hwm_offset;
-               hc < (pcre_uchar *)cd->start_workspace + this_hwm_offset;
-               hc += LINK_SIZE)
-            {
-            PUT(cd->hwm, 0, GET(hc, 0) + len + ((i != 0)? 2+LINK_SIZE : 1));
-            cd->hwm += LINK_SIZE;
-            }
-          base_hwm_offset = this_hwm_offset;
-          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 = (int)(code - bralink + 1);
-          pcre_uchar *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. For
-      ONCE brackets, that's all we need to do. However, possessively repeated
-      ONCE brackets can be converted into non-capturing brackets, as the
-      behaviour of (?:xx)++ is the same as (?>xx)++ and this saves having to
-      deal with possessive ONCEs specially.
-
-      Otherwise, when we are doing the actual compile phase, check to see
-      whether this group is one that could match an empty string. If so,
-      convert the initial operator to the S form (e.g. OP_BRA -> OP_SBRA) so
-      that runtime checking can be done. [This check is also applied to ONCE
-      groups at runtime, but in a different way.]
-
-      Then, if the quantifier was possessive and the bracket is not a
-      conditional, we convert the BRA code to the POS form, and the KET code to
-      KETRPOS. (It turns out to be convenient at runtime to detect this kind of
-      subpattern at both the start and at the end.) The use of special opcodes
-      makes it possible to reduce greatly the stack usage in pcre_exec(). If
-      the group is preceded by OP_BRAZERO, convert this to OP_BRAPOSZERO.
-
-      Then, if the minimum number of matches is 1 or 0, cancel the possessive
-      flag so that the default action below, of wrapping everything inside
-      atomic brackets, does not happen. When the minimum is greater than 1,
-      there will be earlier copies of the group, and so we still have to wrap
-      the whole thing. */
-
-      else
-        {
-        pcre_uchar *ketcode = code - 1 - LINK_SIZE;
-        pcre_uchar *bracode = ketcode - GET(ketcode, 1);
-
-        /* Convert possessive ONCE brackets to non-capturing */
-
-        if ((*bracode == OP_ONCE || *bracode == OP_ONCE_NC) &&
-            possessive_quantifier) *bracode = OP_BRA;
-
-        /* For non-possessive ONCE brackets, all we need to do is to
-        set the KET. */
-
-        if (*bracode == OP_ONCE || *bracode == OP_ONCE_NC)
-          *ketcode = OP_KETRMAX + repeat_type;
-
-        /* Handle non-ONCE brackets and possessive ONCEs (which have been
-        converted to non-capturing above). */
-
-        else
-          {
-          /* In the compile phase, check for empty string matching. */
-
-          if (lengthptr == NULL)
-            {
-            pcre_uchar *scode = bracode;
-            do
-              {
-              if (could_be_empty_branch(scode, ketcode, utf, cd, NULL))
-                {
-                *bracode += OP_SBRA - OP_BRA;
-                break;
-                }
-              scode += GET(scode, 1);
-              }
-            while (*scode == OP_ALT);
-            }
-
-          /* A conditional group with only one branch has an implicit empty
-          alternative branch. */
-
-          if (*bracode == OP_COND && bracode[GET(bracode,1)] != OP_ALT)
-            *bracode = OP_SCOND;
-
-          /* Handle possessive quantifiers. */
-
-          if (possessive_quantifier)
-            {
-            /* For COND brackets, we wrap the whole thing in a possessively
-            repeated non-capturing bracket, because we have not invented POS
-            versions of the COND opcodes. Because we are moving code along, we
-            must ensure that any pending recursive references are updated. */
-
-            if (*bracode == OP_COND || *bracode == OP_SCOND)
-              {
-              int nlen = (int)(code - bracode);
-              *code = OP_END;
-              adjust_recurse(bracode, 1 + LINK_SIZE, utf, cd, item_hwm_offset);
-              memmove(bracode + 1 + LINK_SIZE, bracode, IN_UCHARS(nlen));
-              code += 1 + LINK_SIZE;
-              nlen += 1 + LINK_SIZE;
-              *bracode = (*bracode == OP_COND)? OP_BRAPOS : OP_SBRAPOS;
-              *code++ = OP_KETRPOS;
-              PUTINC(code, 0, nlen);
-              PUT(bracode, 1, nlen);
-              }
-
-            /* For non-COND brackets, we modify the BRA code and use KETRPOS. */
-
-            else
-              {
-              *bracode += 1;              /* Switch to xxxPOS opcodes */
-              *ketcode = OP_KETRPOS;
-              }
-
-            /* If the minimum is zero, mark it as possessive, then unset the
-            possessive flag when the minimum is 0 or 1. */
-
-            if (brazeroptr != NULL) *brazeroptr = OP_BRAPOSZERO;
-            if (repeat_min < 2) possessive_quantifier = FALSE;
-            }
-
-          /* Non-possessive quantifier */
-
-          else *ketcode = OP_KETRMAX + repeat_type;
-          }
-        }
-      }
-
-    /* If previous is OP_FAIL, it was generated by an empty class [] in
-    JavaScript mode. The other ways in which OP_FAIL can be generated, that is
-    by (*FAIL) or (?!) set previous to NULL, which gives a "nothing to repeat"
-    error above. We can just ignore the repeat in JS case. */
-
-    else if (*previous == OP_FAIL) goto END_REPEAT;
-
-    /* Else there's some kind of shambles */
-
-    else
-      {
-      *errorcodeptr = ERR11;
-      goto FAILED;
-      }
-
-    /* If the character following a repeat is '+', possessive_quantifier is
-    TRUE. For some opcodes, there are special alternative opcodes for this
-    case. For anything else, we wrap the entire repeated item inside OP_ONCE
-    brackets. Logically, the '+' notation is just syntactic sugar, taken from
-    Sun's Java package, but the special opcodes can optimize it.
-
-    Some (but not all) possessively repeated subpatterns have already been
-    completely handled in the code just above. For them, possessive_quantifier
-    is always FALSE at this stage. Note that the repeated item starts at
-    tempcode, not at previous, which might be the first part of a string whose
-    (former) last char we repeated. */
-
-    if (possessive_quantifier)
-      {
-      int len;
-
-      /* Possessifying an EXACT quantifier has no effect, so we can ignore it.
-      However, QUERY, STAR, or UPTO may follow (for quantifiers such as {5,6},
-      {5,}, or {5,10}). We skip over an EXACT item; if the length of what
-      remains is greater than zero, there's a further opcode that can be
-      handled. If not, do nothing, leaving the EXACT alone. */
-
-      switch(*tempcode)
-        {
-        case OP_TYPEEXACT:
-        tempcode += PRIV(OP_lengths)[*tempcode] +
-          ((tempcode[1 + IMM2_SIZE] == OP_PROP
-          || tempcode[1 + IMM2_SIZE] == OP_NOTPROP)? 2 : 0);
-        break;
-
-        /* CHAR opcodes are used for exacts whose count is 1. */
-
-        case OP_CHAR:
-        case OP_CHARI:
-        case OP_NOT:
-        case OP_NOTI:
-        case OP_EXACT:
-        case OP_EXACTI:
-        case OP_NOTEXACT:
-        case OP_NOTEXACTI:
-        tempcode += PRIV(OP_lengths)[*tempcode];
-#ifdef SUPPORT_UTF
-        if (utf && HAS_EXTRALEN(tempcode[-1]))
-          tempcode += GET_EXTRALEN(tempcode[-1]);
-#endif
-        break;
-
-        /* For the class opcodes, the repeat operator appears at the end;
-        adjust tempcode to point to it. */
-
-        case OP_CLASS:
-        case OP_NCLASS:
-        tempcode += 1 + 32/sizeof(pcre_uchar);
-        break;
-
-#if defined SUPPORT_UTF || !defined COMPILE_PCRE8
-        case OP_XCLASS:
-        tempcode += GET(tempcode, 1);
-        break;
-#endif
-        }
-
-      /* If tempcode is equal to code (which points to the end of the repeated
-      item), it means we have skipped an EXACT item but there is no following
-      QUERY, STAR, or UPTO; the value of len will be 0, and we do nothing. In
-      all other cases, tempcode will be pointing to the repeat opcode, and will
-      be less than code, so the value of len will be greater than 0. */
-
-      len = (int)(code - tempcode);
-      if (len > 0)
-        {
-        unsigned int repcode = *tempcode;
-
-        /* There is a table for possessifying opcodes, all of which are less
-        than OP_CALLOUT. A zero entry means there is no possessified version.
-        */
-
-        if (repcode < OP_CALLOUT && opcode_possessify[repcode] > 0)
-          *tempcode = opcode_possessify[repcode];
-
-        /* For opcode without a special possessified version, wrap the item in
-        ONCE brackets. Because we are moving code along, we must ensure that any
-        pending recursive references are updated. */
-
-        else
-          {
-          *code = OP_END;
-          adjust_recurse(tempcode, 1 + LINK_SIZE, utf, cd, item_hwm_offset);
-          memmove(tempcode + 1 + LINK_SIZE, tempcode, IN_UCHARS(len));
-          code += 1 + LINK_SIZE;
-          len += 1 + LINK_SIZE;
-          tempcode[0] = OP_ONCE;
-          *code++ = OP_KET;
-          PUTINC(code, 0, len);
-          PUT(tempcode, 1, len);
-          }
-        }
-
-#ifdef NEVER
-      if (len > 0) switch (*tempcode)
-        {
-        case OP_STAR:  *tempcode = OP_POSSTAR; break;
-        case OP_PLUS:  *tempcode = OP_POSPLUS; break;
-        case OP_QUERY: *tempcode = OP_POSQUERY; break;
-        case OP_UPTO:  *tempcode = OP_POSUPTO; break;
-
-        case OP_STARI:  *tempcode = OP_POSSTARI; break;
-        case OP_PLUSI:  *tempcode = OP_POSPLUSI; break;
-        case OP_QUERYI: *tempcode = OP_POSQUERYI; break;
-        case OP_UPTOI:  *tempcode = OP_POSUPTOI; break;
-
-        case OP_NOTSTAR:  *tempcode = OP_NOTPOSSTAR; break;
-        case OP_NOTPLUS:  *tempcode = OP_NOTPOSPLUS; break;
-        case OP_NOTQUERY: *tempcode = OP_NOTPOSQUERY; break;
-        case OP_NOTUPTO:  *tempcode = OP_NOTPOSUPTO; break;
-
-        case OP_NOTSTARI:  *tempcode = OP_NOTPOSSTARI; break;
-        case OP_NOTPLUSI:  *tempcode = OP_NOTPOSPLUSI; break;
-        case OP_NOTQUERYI: *tempcode = OP_NOTPOSQUERYI; break;
-        case OP_NOTUPTOI:  *tempcode = OP_NOTPOSUPTOI; break;
-
-        case OP_TYPESTAR:  *tempcode = OP_TYPEPOSSTAR; break;
-        case OP_TYPEPLUS:  *tempcode = OP_TYPEPOSPLUS; break;
-        case OP_TYPEQUERY: *tempcode = OP_TYPEPOSQUERY; break;
-        case OP_TYPEUPTO:  *tempcode = OP_TYPEPOSUPTO; break;
-
-        case OP_CRSTAR:   *tempcode = OP_CRPOSSTAR; break;
-        case OP_CRPLUS:   *tempcode = OP_CRPOSPLUS; break;
-        case OP_CRQUERY:  *tempcode = OP_CRPOSQUERY; break;
-        case OP_CRRANGE:  *tempcode = OP_CRPOSRANGE; break;
-
-        /* Because we are moving code along, we must ensure that any
-        pending recursive references are updated. */
-
-        default:
-        *code = OP_END;
-        adjust_recurse(tempcode, 1 + LINK_SIZE, utf, cd, item_hwm_offset);
-        memmove(tempcode + 1 + LINK_SIZE, tempcode, IN_UCHARS(len));
-        code += 1 + LINK_SIZE;
-        len += 1 + LINK_SIZE;
-        tempcode[0] = OP_ONCE;
-        *code++ = OP_KET;
-        PUTINC(code, 0, len);
-        PUT(tempcode, 1, len);
-        break;
-        }
-#endif
-      }
-
-    /* In all case we no longer have a previous item. We also set the
-    "follows varying string" flag for subsequently encountered reqchars 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 parenthesized sub-expression, or comment or lookahead or
-    lookbehind or option setting or condition or all the other extended
-    parenthesis forms.  */
-
-    case CHAR_LEFT_PARENTHESIS:
-    ptr++;
-
-    /* First deal with comments. Putting this code right at the start ensures
-    that comments have no bad side effects. */
-
-    if (ptr[0] == CHAR_QUESTION_MARK && ptr[1] == CHAR_NUMBER_SIGN)
-      {
-      ptr += 2;
-      while (*ptr != CHAR_NULL && *ptr != CHAR_RIGHT_PARENTHESIS) ptr++;
-      if (*ptr == CHAR_NULL)
-        {
-        *errorcodeptr = ERR18;
-        goto FAILED;
-        }
-      continue;
-      }
-
-    /* Now deal with various "verbs" that can be introduced by '*'. */
-
-    if (ptr[0] == CHAR_ASTERISK && (ptr[1] == ':'
-         || (MAX_255(ptr[1]) && ((cd->ctypes[ptr[1]] & ctype_letter) != 0))))
-      {
-      int i, namelen;
-      int arglen = 0;
-      const char *vn = verbnames;
-      const pcre_uchar *name = ptr + 1;
-      const pcre_uchar *arg = NULL;
-      previous = NULL;
-      ptr++;
-      while (MAX_255(*ptr) && (cd->ctypes[*ptr] & ctype_letter) != 0) ptr++;
-      namelen = (int)(ptr - name);
-
-      /* It appears that Perl allows any characters whatsoever, other than
-      a closing parenthesis, to appear in arguments, so we no longer insist on
-      letters, digits, and underscores. */
-
-      if (*ptr == CHAR_COLON)
-        {
-        arg = ++ptr;
-        while (*ptr != CHAR_NULL && *ptr != CHAR_RIGHT_PARENTHESIS) ptr++;
-        arglen = (int)(ptr - arg);
-        if ((unsigned int)arglen > MAX_MARK)
-          {
-          *errorcodeptr = ERR75;
-          goto FAILED;
-          }
-        }
-
-      if (*ptr != CHAR_RIGHT_PARENTHESIS)
-        {
-        *errorcodeptr = ERR60;
-        goto FAILED;
-        }
-
-      /* Scan the table of verb names */
-
-      for (i = 0; i < verbcount; i++)
-        {
-        if (namelen == verbs[i].len &&
-            STRNCMP_UC_C8(name, vn, namelen) == 0)
-          {
-          int setverb;
-
-          /* Check for open captures before ACCEPT and convert it to
-          ASSERT_ACCEPT if in an assertion. */
-
-          if (verbs[i].op == OP_ACCEPT)
-            {
-            open_capitem *oc;
-            if (arglen != 0)
-              {
-              *errorcodeptr = ERR59;
-              goto FAILED;
-              }
-            cd->had_accept = TRUE;
-            for (oc = cd->open_caps; oc != NULL; oc = oc->next)
-              {
-              *code++ = OP_CLOSE;
-              PUT2INC(code, 0, oc->number);
-              }
-            setverb = *code++ =
-              (cd->assert_depth > 0)? OP_ASSERT_ACCEPT : OP_ACCEPT;
-
-            /* Do not set firstchar after *ACCEPT */
-            if (firstcharflags == REQ_UNSET) firstcharflags = REQ_NONE;
-            }
-
-          /* Handle other cases with/without an argument */
-
-          else if (arglen == 0)
-            {
-            if (verbs[i].op < 0)   /* Argument is mandatory */
-              {
-              *errorcodeptr = ERR66;
-              goto FAILED;
-              }
-            setverb = *code++ = verbs[i].op;
-            }
-
-          else
-            {
-            if (verbs[i].op_arg < 0)   /* Argument is forbidden */
-              {
-              *errorcodeptr = ERR59;
-              goto FAILED;
-              }
-            setverb = *code++ = verbs[i].op_arg;
-            if (lengthptr != NULL)    /* In pass 1 just add in the length */
-              {                       /* to avoid potential workspace */
-              *lengthptr += arglen;   /* overflow. */
-              *code++ = 0;
-              }
-            else
-              {
-              *code++ = arglen;
-              memcpy(code, arg, IN_UCHARS(arglen));
-              code += arglen;
-              }
-            *code++ = 0;
-            }
-
-          switch (setverb)
-            {
-            case OP_THEN:
-            case OP_THEN_ARG:
-            cd->external_flags |= PCRE_HASTHEN;
-            break;
-
-            case OP_PRUNE:
-            case OP_PRUNE_ARG:
-            case OP_SKIP:
-            case OP_SKIP_ARG:
-            cd->had_pruneorskip = TRUE;
-            break;
-            }
-
-          break;  /* Found verb, exit loop */
-          }
-
-        vn += verbs[i].len + 1;
-        }
-
-      if (i < verbcount) continue;    /* Successfully handled a verb */
-      *errorcodeptr = ERR60;          /* Verb not recognized */
-      goto FAILED;
-      }
-
-    /* Initialize for "real" parentheses */
-
-    newoptions = options;
-    skipbytes = 0;
-    bravalue = OP_CBRA;
-    item_hwm_offset = cd->hwm - cd->start_workspace;
-    reset_bracount = FALSE;
-
-    /* Deal with the extended parentheses; all are introduced by '?', and the
-    appearance of any of them means that this is not a capturing group. */
-
-    if (*ptr == CHAR_QUESTION_MARK)
-      {
-      int i, set, unset, namelen;
-      int *optset;
-      const pcre_uchar *name;
-      pcre_uchar *slot;
-
-      switch (*(++ptr))
-        {
-        /* ------------------------------------------------------------ */
-        case CHAR_VERTICAL_LINE:  /* Reset capture count for each branch */
-        reset_bracount = TRUE;
-        cd->dupgroups = TRUE;     /* Record (?| encountered */
-        /* Fall through */
-
-        /* ------------------------------------------------------------ */
-        case CHAR_COLON:          /* Non-capturing bracket */
-        bravalue = OP_BRA;
-        ptr++;
-        break;
-
-
-        /* ------------------------------------------------------------ */
-        case CHAR_LEFT_PARENTHESIS:
-        bravalue = OP_COND;       /* Conditional group */
-        tempptr = ptr;
-
-        /* A condition can be an assertion, a number (referring to a numbered
-        group's having been set), a name (referring to a named group), or 'R',
-        referring to recursion. R<digits> and R&name are also permitted for
-        recursion tests.
-
-        There are ways of testing a named group: (?(name)) is used by Python;
-        Perl 5.10 onwards uses (?(<name>) or (?('name')).
-
-        There is one unfortunate ambiguity, caused by history. 'R' can be the
-        recursive thing or the name 'R' (and similarly for 'R' followed by
-        digits). We look for a name first; if not found, we try the other case.
-
-        For compatibility with auto-callouts, we allow a callout to be
-        specified before a condition that is an assertion. First, check for the
-        syntax of a callout; if found, adjust the temporary pointer that is
-        used to check for an assertion condition. That's all that is needed! */
-
-        if (ptr[1] == CHAR_QUESTION_MARK && ptr[2] == CHAR_C)
-          {
-          for (i = 3;; i++) if (!IS_DIGIT(ptr[i])) break;
-          if (ptr[i] == CHAR_RIGHT_PARENTHESIS)
-            tempptr += i + 1;
-          }
-
-        /* For conditions that are assertions, check the syntax, and then exit
-        the switch. This will take control down to where bracketed groups,
-        including assertions, are processed. */
-
-        if (tempptr[1] == CHAR_QUESTION_MARK &&
-              (tempptr[2] == CHAR_EQUALS_SIGN ||
-               tempptr[2] == CHAR_EXCLAMATION_MARK ||
-                 (tempptr[2] == CHAR_LESS_THAN_SIGN &&
-                   (tempptr[3] == CHAR_EQUALS_SIGN ||
-                    tempptr[3] == CHAR_EXCLAMATION_MARK))))
-          {
-          cd->iscondassert = TRUE;
-          break;
-          }
-
-        /* Other conditions use OP_CREF/OP_DNCREF/OP_RREF/OP_DNRREF, and all
-        need to skip at least 1+IMM2_SIZE bytes at the start of the group. */
-
-        code[1+LINK_SIZE] = OP_CREF;
-        skipbytes = 1+IMM2_SIZE;
-        refsign = -1;     /* => not a number */
-        namelen = -1;     /* => not a name; must set to avoid warning */
-        name = NULL;      /* Always set to avoid warning */
-        recno = 0;        /* Always set to avoid warning */
-
-        /* Check for a test for recursion in a named group. */
-
-        ptr++;
-        if (*ptr == CHAR_R && ptr[1] == CHAR_AMPERSAND)
-          {
-          terminator = -1;
-          ptr += 2;
-          code[1+LINK_SIZE] = OP_RREF;    /* Change the type of test */
-          }
-
-        /* Check for a test for a named group's having been set, using the Perl
-        syntax (?(<name>) or (?('name'), and also allow for the original PCRE
-        syntax of (?(name) or for (?(+n), (?(-n), and just (?(n). */
-
-        else if (*ptr == CHAR_LESS_THAN_SIGN)
-          {
-          terminator = CHAR_GREATER_THAN_SIGN;
-          ptr++;
-          }
-        else if (*ptr == CHAR_APOSTROPHE)
-          {
-          terminator = CHAR_APOSTROPHE;
-          ptr++;
-          }
-        else
-          {
-          terminator = CHAR_NULL;
-          if (*ptr == CHAR_MINUS || *ptr == CHAR_PLUS) refsign = *ptr++;
-            else if (IS_DIGIT(*ptr)) refsign = 0;
-          }
-
-        /* Handle a number */
-
-        if (refsign >= 0)
-          {
-          while (IS_DIGIT(*ptr))
-            {
-            if (recno > INT_MAX / 10 - 1)  /* Integer overflow */
-              {
-              while (IS_DIGIT(*ptr)) ptr++;
-              *errorcodeptr = ERR61;
-              goto FAILED;
-              }
-            recno = recno * 10 + (int)(*ptr - CHAR_0);
-            ptr++;
-            }
-          }
-
-        /* Otherwise we expect to read a name; anything else is an error. When
-        a name is one of a number of duplicates, a different opcode is used and
-        it needs more memory. Unfortunately we cannot tell whether a name is a
-        duplicate in the first pass, so we have to allow for more memory. */
-
-        else
-          {
-          if (IS_DIGIT(*ptr))
-            {
-            *errorcodeptr = ERR84;
-            goto FAILED;
-            }
-          if (!MAX_255(*ptr) || (cd->ctypes[*ptr] & ctype_word) == 0)
-            {
-            *errorcodeptr = ERR28;   /* Assertion expected */
-            goto FAILED;
-            }
-          name = ptr++;
-          while (MAX_255(*ptr) && (cd->ctypes[*ptr] & ctype_word) != 0)
-            {
-            ptr++;
-            }
-          namelen = (int)(ptr - name);
-          if (lengthptr != NULL) skipbytes += IMM2_SIZE;
-          }
-
-        /* Check the terminator */
-
-        if ((terminator > 0 && *ptr++ != (pcre_uchar)terminator) ||
-            *ptr++ != CHAR_RIGHT_PARENTHESIS)
-          {
-          ptr--;                  /* Error offset */
-          *errorcodeptr = ERR26;  /* Malformed number or name */
-          goto FAILED;
-          }
-
-        /* Do no further checking in the pre-compile phase. */
-
-        if (lengthptr != NULL) break;
-
-        /* In the real compile we do the work of looking for the actual
-        reference. If refsign is not negative, it means we have a number in
-        recno. */
-
-        if (refsign >= 0)
-          {
-          if (recno <= 0)
-            {
-            *errorcodeptr = ERR35;
-            goto FAILED;
-            }
-          if (refsign != 0) recno = (refsign == CHAR_MINUS)?
-            cd->bracount - recno + 1 : recno + cd->bracount;
-          if (recno <= 0 || recno > cd->final_bracount)
-            {
-            *errorcodeptr = ERR15;
-            goto FAILED;
-            }
-          PUT2(code, 2+LINK_SIZE, recno);
-          if (recno > cd->top_backref) cd->top_backref = recno;
-          break;
-          }
-
-        /* Otherwise look for the name. */
-
-        slot = cd->name_table;
-        for (i = 0; i < cd->names_found; i++)
-          {
-          if (STRNCMP_UC_UC(name, slot+IMM2_SIZE, namelen) == 0) break;
-          slot += cd->name_entry_size;
-          }
-
-        /* Found the named subpattern. If the name is duplicated, add one to
-        the opcode to change CREF/RREF into DNCREF/DNRREF and insert
-        appropriate data values. Otherwise, just insert the unique subpattern
-        number. */
-
-        if (i < cd->names_found)
-          {
-          int offset = i++;
-          int count = 1;
-          recno = GET2(slot, 0);   /* Number from first found */
-          if (recno > cd->top_backref) cd->top_backref = recno;
-          for (; i < cd->names_found; i++)
-            {
-            slot += cd->name_entry_size;
-            if (STRNCMP_UC_UC(name, slot+IMM2_SIZE, namelen) != 0 ||
-              (slot+IMM2_SIZE)[namelen] != 0) break;
-            count++;
-            }
-
-          if (count > 1)
-            {
-            PUT2(code, 2+LINK_SIZE, offset);
-            PUT2(code, 2+LINK_SIZE+IMM2_SIZE, count);
-            skipbytes += IMM2_SIZE;
-            code[1+LINK_SIZE]++;
-            }
-          else  /* Not a duplicated name */
-            {
-            PUT2(code, 2+LINK_SIZE, recno);
-            }
-          }
-
-        /* If terminator == CHAR_NULL it means that the name followed directly
-        after the opening parenthesis [e.g. (?(abc)...] and in this case there
-        are some further alternatives to try. For the cases where terminator !=
-        CHAR_NULL [things like (?(<name>... or (?('name')... or (?(R&name)... ]
-        we have now checked all the possibilities, so give an error. */
-
-        else if (terminator != CHAR_NULL)
-          {
-          *errorcodeptr = ERR15;
-          goto FAILED;
-          }
-
-        /* Check for (?(R) for recursion. Allow digits after R to specify a
-        specific group number. */
-
-        else if (*name == CHAR_R)
-          {
-          recno = 0;
-          for (i = 1; i < namelen; i++)
-            {
-            if (!IS_DIGIT(name[i]))
-              {
-              *errorcodeptr = ERR15;
-              goto FAILED;
-              }
-            if (recno > INT_MAX / 10 - 1)   /* Integer overflow */
-              {
-              *errorcodeptr = ERR61;
-              goto FAILED;
-              }
-            recno = recno * 10 + name[i] - CHAR_0;
-            }
-          if (recno == 0) recno = RREF_ANY;
-          code[1+LINK_SIZE] = OP_RREF;      /* Change test type */
-          PUT2(code, 2+LINK_SIZE, recno);
-          }
-
-        /* Similarly, check for the (?(DEFINE) "condition", which is always
-        false. */
-
-        else if (namelen == 6 && STRNCMP_UC_C8(name, STRING_DEFINE, 6) == 0)
-          {
-          code[1+LINK_SIZE] = OP_DEF;
-          skipbytes = 1;
-          }
-
-        /* Reference to an unidentified subpattern. */
-
-        else
-          {
-          *errorcodeptr = ERR15;
-          goto FAILED;
-          }
-        break;
-
-
-        /* ------------------------------------------------------------ */
-        case CHAR_EQUALS_SIGN:                 /* Positive lookahead */
-        bravalue = OP_ASSERT;
-        cd->assert_depth += 1;
-        ptr++;
-        break;
-
-        /* Optimize (?!) to (*FAIL) unless it is quantified - which is a weird
-        thing to do, but Perl allows all assertions to be quantified, and when
-        they contain capturing parentheses there may be a potential use for
-        this feature. Not that that applies to a quantified (?!) but we allow
-        it for uniformity. */
-
-        /* ------------------------------------------------------------ */
-        case CHAR_EXCLAMATION_MARK:            /* Negative lookahead */
-        ptr++;
-        if (*ptr == CHAR_RIGHT_PARENTHESIS && ptr[1] != CHAR_ASTERISK &&
-             ptr[1] != CHAR_PLUS && ptr[1] != CHAR_QUESTION_MARK &&
-            (ptr[1] != CHAR_LEFT_CURLY_BRACKET || !is_counted_repeat(ptr+2)))
-          {
-          *code++ = OP_FAIL;
-          previous = NULL;
-          continue;
-          }
-        bravalue = OP_ASSERT_NOT;
-        cd->assert_depth += 1;
-        break;
-
-
-        /* ------------------------------------------------------------ */
-        case CHAR_LESS_THAN_SIGN:              /* Lookbehind or named define */
-        switch (ptr[1])
-          {
-          case CHAR_EQUALS_SIGN:               /* Positive lookbehind */
-          bravalue = OP_ASSERTBACK;
-          cd->assert_depth += 1;
-          ptr += 2;
-          break;
-
-          case CHAR_EXCLAMATION_MARK:          /* Negative lookbehind */
-          bravalue = OP_ASSERTBACK_NOT;
-          cd->assert_depth += 1;
-          ptr += 2;
-          break;
-
-          default:                /* Could be name define, else bad */
-          if (MAX_255(ptr[1]) && (cd->ctypes[ptr[1]] & ctype_word) != 0)
-            goto DEFINE_NAME;
-          ptr++;                  /* Correct offset for error */
-          *errorcodeptr = ERR24;
-          goto FAILED;
-          }
-        break;
-
-
-        /* ------------------------------------------------------------ */
-        case CHAR_GREATER_THAN_SIGN:           /* One-time brackets */
-        bravalue = OP_ONCE;
-        ptr++;
-        break;
-
-
-        /* ------------------------------------------------------------ */
-        case CHAR_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;
-          {
-          int n = 0;
-          ptr++;
-          while(IS_DIGIT(*ptr))
-            n = n * 10 + *ptr++ - CHAR_0;
-          if (*ptr != CHAR_RIGHT_PARENTHESIS)
-            {
-            *errorcodeptr = ERR39;
-            goto FAILED;
-            }
-          if (n > 255)
-            {
-            *errorcodeptr = ERR38;
-            goto FAILED;
-            }
-          *code++ = n;
-          PUT(code, 0, (int)(ptr - cd->start_pattern + 1)); /* Pattern offset */
-          PUT(code, LINK_SIZE, 0);                          /* Default length */
-          code += 2 * LINK_SIZE;
-          }
-        previous = NULL;
-        continue;
-
-
-        /* ------------------------------------------------------------ */
-        case CHAR_P:              /* Python-style named subpattern handling */
-        if (*(++ptr) == CHAR_EQUALS_SIGN ||
-            *ptr == CHAR_GREATER_THAN_SIGN)  /* Reference or recursion */
-          {
-          is_recurse = *ptr == CHAR_GREATER_THAN_SIGN;
-          terminator = CHAR_RIGHT_PARENTHESIS;
-          goto NAMED_REF_OR_RECURSE;
-          }
-        else if (*ptr != CHAR_LESS_THAN_SIGN)  /* Test for Python-style defn */
-          {
-          *errorcodeptr = ERR41;
-          goto FAILED;
-          }
-        /* Fall through to handle (?P< as (?< is handled */
-
-
-        /* ------------------------------------------------------------ */
-        DEFINE_NAME:    /* Come here from (?< handling */
-        case CHAR_APOSTROPHE:
-        terminator = (*ptr == CHAR_LESS_THAN_SIGN)?
-          CHAR_GREATER_THAN_SIGN : CHAR_APOSTROPHE;
-        name = ++ptr;
-        if (IS_DIGIT(*ptr))
-          {
-          *errorcodeptr = ERR84;   /* Group name must start with non-digit */
-          goto FAILED;
-          }
-        while (MAX_255(*ptr) && (cd->ctypes[*ptr] & ctype_word) != 0) ptr++;
-        namelen = (int)(ptr - name);
-
-        /* In the pre-compile phase, do a syntax check, remember the longest
-        name, and then remember the group in a vector, expanding it if
-        necessary. Duplicates for the same number are skipped; other duplicates
-        are checked for validity. In the actual compile, there is nothing to
-        do. */
-
-        if (lengthptr != NULL)
-          {
-          named_group *ng;
-          pcre_uint32 number = cd->bracount + 1;
-
-          if (*ptr != (pcre_uchar)terminator)
-            {
-            *errorcodeptr = ERR42;
-            goto FAILED;
-            }
-
-          if (cd->names_found >= MAX_NAME_COUNT)
-            {
-            *errorcodeptr = ERR49;
-            goto FAILED;
-            }
-
-          if (namelen + IMM2_SIZE + 1 > cd->name_entry_size)
-            {
-            cd->name_entry_size = namelen + IMM2_SIZE + 1;
-            if (namelen > MAX_NAME_SIZE)
-              {
-              *errorcodeptr = ERR48;
-              goto FAILED;
-              }
-            }
-
-          /* Scan the list to check for duplicates. For duplicate names, if the
-          number is the same, break the loop, which causes the name to be
-          discarded; otherwise, if DUPNAMES is not set, give an error.
-          If it is set, allow the name with a different number, but continue
-          scanning in case this is a duplicate with the same number. For
-          non-duplicate names, give an error if the number is duplicated. */
-
-          ng = cd->named_groups;
-          for (i = 0; i < cd->names_found; i++, ng++)
-            {
-            if (namelen == ng->length &&
-                STRNCMP_UC_UC(name, ng->name, namelen) == 0)
-              {
-              if (ng->number == number) break;
-              if ((options & PCRE_DUPNAMES) == 0)
-                {
-                *errorcodeptr = ERR43;
-                goto FAILED;
-                }
-              cd->dupnames = TRUE;  /* Duplicate names exist */
-              }
-            else if (ng->number == number)
-              {
-              *errorcodeptr = ERR65;
-              goto FAILED;
-              }
-            }
-
-          if (i >= cd->names_found)     /* Not a duplicate with same number */
-            {
-            /* Increase the list size if necessary */
-
-            if (cd->names_found >= cd->named_group_list_size)
-              {
-              int newsize = cd->named_group_list_size * 2;
-              named_group *newspace = (PUBL(malloc))
-                (newsize * sizeof(named_group));
-
-              if (newspace == NULL)
-                {
-                *errorcodeptr = ERR21;
-                goto FAILED;
-                }
-
-              memcpy(newspace, cd->named_groups,
-                cd->named_group_list_size * sizeof(named_group));
-              if (cd->named_group_list_size > NAMED_GROUP_LIST_SIZE)
-                (PUBL(free))((void *)cd->named_groups);
-              cd->named_groups = newspace;
-              cd->named_group_list_size = newsize;
-              }
-
-            cd->named_groups[cd->names_found].name = name;
-            cd->named_groups[cd->names_found].length = namelen;
-            cd->named_groups[cd->names_found].number = number;
-            cd->names_found++;
-            }
-          }
-
-        ptr++;                    /* Move past > or ' in both passes. */
-        goto NUMBERED_GROUP;
-
-
-        /* ------------------------------------------------------------ */
-        case CHAR_AMPERSAND:            /* Perl recursion/subroutine syntax */
-        terminator = CHAR_RIGHT_PARENTHESIS;
-        is_recurse = TRUE;
-        /* Fall through */
-
-        /* We come here from the Python syntax above that handles both
-        references (?P=name) and recursion (?P>name), as well as falling
-        through from the Perl recursion syntax (?&name). We also come here from
-        the Perl \k<name> or \k'name' back reference syntax and the \k{name}
-        .NET syntax, and the Oniguruma \g<...> and \g'...' subroutine syntax. */
-
-        NAMED_REF_OR_RECURSE:
-        name = ++ptr;
-        if (IS_DIGIT(*ptr))
-          {
-          *errorcodeptr = ERR84;   /* Group name must start with non-digit */
-          goto FAILED;
-          }
-        while (MAX_255(*ptr) && (cd->ctypes[*ptr] & ctype_word) != 0) ptr++;
-        namelen = (int)(ptr - name);
-
-        /* In the pre-compile phase, do a syntax check. We used to just set
-        a dummy reference number, because it was not used in the first pass.
-        However, with the change of recursive back references to be atomic,
-        we have to look for the number so that this state can be identified, as
-        otherwise the incorrect length is computed. If it's not a backwards
-        reference, the dummy number will do. */
-
-        if (lengthptr != NULL)
-          {
-          named_group *ng;
-          recno = 0;
-
-          if (namelen == 0)
-            {
-            *errorcodeptr = ERR62;
-            goto FAILED;
-            }
-          if (*ptr != (pcre_uchar)terminator)
-            {
-            *errorcodeptr = ERR42;
-            goto FAILED;
-            }
-          if (namelen > MAX_NAME_SIZE)
-            {
-            *errorcodeptr = ERR48;
-            goto FAILED;
-            }
-
-          /* Count named back references. */
-
-          if (!is_recurse) cd->namedrefcount++;
-
-          /* We have to allow for a named reference to a duplicated name (this
-          cannot be determined until the second pass). This needs an extra
-          16-bit data item. */
-
-          *lengthptr += IMM2_SIZE;
-
-          /* If this is a forward reference and we are within a (?|...) group,
-          the reference may end up as the number of a group which we are
-          currently inside, that is, it could be a recursive reference. In the
-          real compile this will be picked up and the reference wrapped with
-          OP_ONCE to make it atomic, so we must space in case this occurs. */
-
-          /* In fact, this can happen for a non-forward reference because
-          another group with the same number might be created later. This
-          issue is fixed "properly" in PCRE2. As PCRE1 is now in maintenance
-          only mode, we finesse the bug by allowing more memory always. */
-
-          *lengthptr += 2 + 2*LINK_SIZE;
-
-          /* It is even worse than that. The current reference may be to an
-          existing named group with a different number (so apparently not
-          recursive) but which later on is also attached to a group with the
-          current number. This can only happen if $(| has been previous
-          encountered. In that case, we allow yet more memory, just in case.
-          (Again, this is fixed "properly" in PCRE2. */
-
-          if (cd->dupgroups) *lengthptr += 4 + 4*LINK_SIZE;
-
-          /* Otherwise, check for recursion here. The name table does not exist
-          in the first pass; instead we must scan the list of names encountered
-          so far in order to get the number. If the name is not found, leave
-          the value of recno as 0 for a forward reference. */
-
-          else
-            {
-            ng = cd->named_groups;
-            for (i = 0; i < cd->names_found; i++, ng++)
-              {
-              if (namelen == ng->length &&
-                  STRNCMP_UC_UC(name, ng->name, namelen) == 0)
-                {
-                open_capitem *oc;
-                recno = ng->number;
-                if (is_recurse) break;
-                for (oc = cd->open_caps; oc != NULL; oc = oc->next)
-                  {
-                  if (oc->number == recno)
-                    {
-                    oc->flag = TRUE;
-                    break;
-                    }
-                  }
-                }
-              }
-            }
-          }
-
-        /* In the real compile, search the name table. We check the name
-        first, and then check that we have reached the end of the name in the
-        table. That way, if the name is longer than any in the table, the
-        comparison will fail without reading beyond the table entry. */
-
-        else
-          {
-          slot = cd->name_table;
-          for (i = 0; i < cd->names_found; i++)
-            {
-            if (STRNCMP_UC_UC(name, slot+IMM2_SIZE, namelen) == 0 &&
-                slot[IMM2_SIZE+namelen] == 0)
-              break;
-            slot += cd->name_entry_size;
-            }
-
-          if (i < cd->names_found)
-            {
-            recno = GET2(slot, 0);
-            }
-          else
-            {
-            *errorcodeptr = ERR15;
-            goto FAILED;
-            }
-          }
-
-        /* In both phases, for recursions, we can now go to the code than
-        handles numerical recursion. */
-
-        if (is_recurse) goto HANDLE_RECURSION;
-
-        /* In the second pass we must see if the name is duplicated. If so, we
-        generate a different opcode. */
-
-        if (lengthptr == NULL && cd->dupnames)
-          {
-          int count = 1;
-          unsigned int index = i;
-          pcre_uchar *cslot = slot + cd->name_entry_size;
-
-          for (i++; i < cd->names_found; i++)
-            {
-            if (STRCMP_UC_UC(slot + IMM2_SIZE, cslot + IMM2_SIZE) != 0) break;
-            count++;
-            cslot += cd->name_entry_size;
-            }
-
-          if (count > 1)
-            {
-            if (firstcharflags == REQ_UNSET) firstcharflags = REQ_NONE;
-            previous = code;
-            item_hwm_offset = cd->hwm - cd->start_workspace;
-            *code++ = ((options & PCRE_CASELESS) != 0)? OP_DNREFI : OP_DNREF;
-            PUT2INC(code, 0, index);
-            PUT2INC(code, 0, count);
-
-            /* Process each potentially referenced group. */
-
-            for (; slot < cslot; slot += cd->name_entry_size)
-              {
-              open_capitem *oc;
-              recno = GET2(slot, 0);
-              cd->backref_map |= (recno < 32)? (1 << recno) : 1;
-              if (recno > cd->top_backref) cd->top_backref = recno;
-
-              /* Check to see if this back reference is recursive, that it, it
-              is inside the group that it references. A flag is set so that the
-              group can be made atomic. */
-
-              for (oc = cd->open_caps; oc != NULL; oc = oc->next)
-                {
-                if (oc->number == recno)
-                  {
-                  oc->flag = TRUE;
-                  break;
-                  }
-                }
-              }
-
-            continue;  /* End of back ref handling */
-            }
-          }
-
-        /* First pass, or a non-duplicated name. */
-
-        goto HANDLE_REFERENCE;
-
-
-        /* ------------------------------------------------------------ */
-        case CHAR_R:              /* Recursion, same as (?0) */
-        recno = 0;
-        if (*(++ptr) != CHAR_RIGHT_PARENTHESIS)
-          {
-          *errorcodeptr = ERR29;
-          goto FAILED;
-          }
-        goto HANDLE_RECURSION;
-
-
-        /* ------------------------------------------------------------ */
-        case CHAR_MINUS: case CHAR_PLUS:  /* Recursion or subroutine */
-        case CHAR_0: case CHAR_1: case CHAR_2: case CHAR_3: case CHAR_4:
-        case CHAR_5: case CHAR_6: case CHAR_7: case CHAR_8: case CHAR_9:
-          {
-          const pcre_uchar *called;
-          terminator = CHAR_RIGHT_PARENTHESIS;
-
-          /* Come here from the \g<...> and \g'...' code (Oniguruma
-          compatibility). However, the syntax has been checked to ensure that
-          the ... are a (signed) number, so that neither ERR63 nor ERR29 will
-          be called on this path, nor with the jump to OTHER_CHAR_AFTER_QUERY
-          ever be taken. */
-
-          HANDLE_NUMERICAL_RECURSION:
-
-          if ((refsign = *ptr) == CHAR_PLUS)
-            {
-            ptr++;
-            if (!IS_DIGIT(*ptr))
-              {
-              *errorcodeptr = ERR63;
-              goto FAILED;
-              }
-            }
-          else if (refsign == CHAR_MINUS)
-            {
-            if (!IS_DIGIT(ptr[1]))
-              goto OTHER_CHAR_AFTER_QUERY;
-            ptr++;
-            }
-
-          recno = 0;
-          while(IS_DIGIT(*ptr))
-            {
-            if (recno > INT_MAX / 10 - 1) /* Integer overflow */
-              {
-              while (IS_DIGIT(*ptr)) ptr++;
-              *errorcodeptr = ERR61;
-              goto FAILED;
-              }
-            recno = recno * 10 + *ptr++ - CHAR_0;
-            }
-
-          if (*ptr != (pcre_uchar)terminator)
-            {
-            *errorcodeptr = ERR29;
-            goto FAILED;
-            }
-
-          if (refsign == CHAR_MINUS)
-            {
-            if (recno == 0)
-              {
-              *errorcodeptr = ERR58;
-              goto FAILED;
-              }
-            recno = cd->bracount - recno + 1;
-            if (recno <= 0)
-              {
-              *errorcodeptr = ERR15;
-              goto FAILED;
-              }
-            }
-          else if (refsign == CHAR_PLUS)
-            {
-            if (recno == 0)
-              {
-              *errorcodeptr = ERR58;
-              goto FAILED;
-              }
-            recno += cd->bracount;
-            }
-
-          /* Come here from code above that handles a named recursion */
-
-          HANDLE_RECURSION:
-
-          previous = code;
-          item_hwm_offset = cd->hwm - cd->start_workspace;
-          called = cd->start_code;
-
-          /* When we are actually compiling, find the bracket that is being
-          referenced. Temporarily end the regex in case it doesn't exist before
-          this point. If we end up with a forward reference, first check that
-          the bracket does occur later so we can give the error (and position)
-          now. Then remember this forward reference in the workspace so it can
-          be filled in at the end. */
-
-          if (lengthptr == NULL)
-            {
-            *code = OP_END;
-            if (recno != 0)
-              called = PRIV(find_bracket)(cd->start_code, utf, recno);
-
-            /* Forward reference */
-
-            if (called == NULL)
-              {
-              if (recno > cd->final_bracount)
-                {
-                *errorcodeptr = ERR15;
-                goto FAILED;
-                }
-
-              /* Fudge the value of "called" so that when it is inserted as an
-              offset below, what it actually inserted is the reference number
-              of the group. Then remember the forward reference. */
-
-              called = cd->start_code + recno;
-              if (cd->hwm >= cd->start_workspace + cd->workspace_size -
-                  WORK_SIZE_SAFETY_MARGIN)
-                {
-                *errorcodeptr = expand_workspace(cd);
-                if (*errorcodeptr != 0) goto FAILED;
-                }
-              PUTINC(cd->hwm, 0, (int)(code + 1 - cd->start_code));
-              }
-
-            /* If not a forward reference, and 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. We
-            must not, however, do this check if we are in a conditional
-            subpattern because the condition might be testing for recursion in
-            a pattern such as /(?(R)a+|(?R)b)/, which is perfectly valid.
-            Forever loops are also detected at runtime, so those that occur in
-            conditional subpatterns will be picked up then. */
-
-            else if (GET(called, 1) == 0 && cond_depth <= 0 &&
-                     could_be_empty(called, code, bcptr, utf, cd))
-              {
-              *errorcodeptr = ERR40;
-              goto FAILED;
-              }
-            }
-
-          /* Insert the recursion/subroutine item. It does not have a set first
-          character (relevant if it is repeated, because it will then be
-          wrapped with ONCE brackets). */
-
-          *code = OP_RECURSE;
-          PUT(code, 1, (int)(called - cd->start_code));
-          code += 1 + LINK_SIZE;
-          groupsetfirstchar = FALSE;
-          }
-
-        /* Can't determine a first byte now */
-
-        if (firstcharflags == REQ_UNSET) firstcharflags = REQ_NONE;
-        continue;
-
-
-        /* ------------------------------------------------------------ */
-        default:              /* Other characters: check option setting */
-        OTHER_CHAR_AFTER_QUERY:
-        set = unset = 0;
-        optset = &set;
-
-        while (*ptr != CHAR_RIGHT_PARENTHESIS && *ptr != CHAR_COLON)
-          {
-          switch (*ptr++)
-            {
-            case CHAR_MINUS: optset = &unset; break;
-
-            case CHAR_J:    /* Record that it changed in the external options */
-            *optset |= PCRE_DUPNAMES;
-            cd->external_flags |= PCRE_JCHANGED;
-            break;
-
-            case CHAR_i: *optset |= PCRE_CASELESS; break;
-            case CHAR_m: *optset |= PCRE_MULTILINE; break;
-            case CHAR_s: *optset |= PCRE_DOTALL; break;
-            case CHAR_x: *optset |= PCRE_EXTENDED; break;
-            case CHAR_U: *optset |= PCRE_UNGREEDY; break;
-            case CHAR_X: *optset |= PCRE_EXTRA; break;
-
-            default:  *errorcodeptr = ERR12;
-                      ptr--;    /* Correct the offset */
-                      goto FAILED;
-            }
-          }
-
-        /* 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. If this
-        item is right at the start of the pattern, the options can be
-        abstracted and made external in the pre-compile phase, and ignored in
-        the compile phase. This can be helpful when matching -- for instance in
-        caseless checking of required bytes.
-
-        If the code pointer is not (cd->start_code + 1 + LINK_SIZE), we are
-        definitely *not* at the start of the pattern because something has been
-        compiled. In the pre-compile phase, however, the code pointer can have
-        that value after the start, because it gets reset as code is discarded
-        during the pre-compile. However, this can happen only at top level - if
-        we are within parentheses, the starting BRA will still be present. At
-        any parenthesis level, the length value can be used to test if anything
-        has been compiled at that level. Thus, a test for both these conditions
-        is necessary to ensure we correctly detect the start of the pattern in
-        both phases.
-
-        If we are not at the pattern start, reset the greedy defaults and the
-        case value for firstchar and reqchar. */
-
-        if (*ptr == CHAR_RIGHT_PARENTHESIS)
-          {
-          if (code == cd->start_code + 1 + LINK_SIZE &&
-               (lengthptr == NULL || *lengthptr == 2 + 2*LINK_SIZE))
-            {
-            cd->external_options = newoptions;
-            }
-          else
-            {
-            greedy_default = ((newoptions & PCRE_UNGREEDY) != 0);
-            greedy_non_default = greedy_default ^ 1;
-            req_caseopt = ((newoptions & PCRE_CASELESS) != 0)? REQ_CASELESS:0;
-            }
-
-          /* Change options at this level, and pass them back for use
-          in subsequent branches. */
-
-          *optionsptr = options = newoptions;
-          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++;
-        }     /* End of switch for character following (? */
-      }       /* End of (? handling */
-
-    /* Opening parenthesis not followed by '*' or '?'. 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 capturing group. */
-
-    else
-      {
-      NUMBERED_GROUP:
-      cd->bracount += 1;
-      PUT2(code, 1+LINK_SIZE, cd->bracount);
-      skipbytes = IMM2_SIZE;
-      }
-
-    /* Process nested bracketed regex. First check for parentheses nested too
-    deeply. */
-
-    if ((cd->parens_depth += 1) > PARENS_NEST_LIMIT)
-      {
-      *errorcodeptr = ERR82;
-      goto FAILED;
-      }
-
-    /* All assertions used not to be repeatable, but this was changed for Perl
-    compatibility. All kinds can now be repeated except for assertions that are
-    conditions (Perl also forbids these to be repeated). We copy code into a
-    non-register variable (tempcode) in order to be able to pass its address
-    because some compilers complain otherwise. At the start of a conditional
-    group whose condition is an assertion, cd->iscondassert is set. We unset it
-    here so as to allow assertions later in the group to be quantified. */
-
-    if (bravalue >= OP_ASSERT && bravalue <= OP_ASSERTBACK_NOT &&
-        cd->iscondassert)
-      {
-      previous = NULL;
-      cd->iscondassert = FALSE;
-      }
-    else
-      {
-      previous = code;
-      item_hwm_offset = cd->hwm - cd->start_workspace;
-      }
-
-    *code = bravalue;
-    tempcode = code;
-    tempreqvary = cd->req_varyopt;        /* Save value before bracket */
-    tempbracount = cd->bracount;          /* Save value before bracket */
-    length_prevgroup = 0;                 /* Initialize for pre-compile phase */
-
-    if (!compile_regex(
-         newoptions,                      /* The complete new option state */
-         &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 */
-         reset_bracount,                  /* True if (?| group */
-         skipbytes,                       /* Skip over bracket number */
-         cond_depth +
-           ((bravalue == OP_COND)?1:0),   /* Depth of condition subpatterns */
-         &subfirstchar,                   /* For possible first char */
-         &subfirstcharflags,
-         &subreqchar,                     /* For possible last char */
-         &subreqcharflags,
-         bcptr,                           /* Current branch chain */
-         cd,                              /* Tables block */
-         (lengthptr == NULL)? NULL :      /* Actual compile phase */
-           &length_prevgroup              /* Pre-compile phase */
-         ))
-      goto FAILED;
-
-    cd->parens_depth -= 1;
-
-    /* If this was an atomic group and there are no capturing groups within it,
-    generate OP_ONCE_NC instead of OP_ONCE. */
-
-    if (bravalue == OP_ONCE && cd->bracount <= tempbracount)
-      *code = OP_ONCE_NC;
-
-    if (bravalue >= OP_ASSERT && bravalue <= OP_ASSERTBACK_NOT)
-      cd->assert_depth -= 1;
-
-    /* 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.
-    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, or just one if it's a DEFINE group. We do this
-    in the real compile phase, not in the pre-pass, where the whole group may
-    not be available. */
-
-    if (bravalue == OP_COND && lengthptr == NULL)
-      {
-      pcre_uchar *tc = code;
-      int condcount = 0;
-
-      do {
-         condcount++;
-         tc += GET(tc,1);
-         }
-      while (*tc != OP_KET);
-
-      /* A DEFINE group is never obeyed inline (the "condition" is always
-      false). It must have only one branch. */
-
-      if (code[LINK_SIZE+1] == OP_DEF)
-        {
-        if (condcount > 1)
-          {
-          *errorcodeptr = ERR54;
-          goto FAILED;
-          }
-        bravalue = OP_DEF;   /* Just a flag to suppress char handling below */
-        }
-
-      /* A "normal" conditional group. If there is just one branch, we must not
-      make use of its firstchar or reqchar, because this is equivalent to an
-      empty second branch. */
-
-      else
-        {
-        if (condcount > 2)
-          {
-          *errorcodeptr = ERR27;
-          goto FAILED;
-          }
-        if (condcount == 1) subfirstcharflags = subreqcharflags = REQ_NONE;
-        }
-      }
-
-    /* Error if hit end of pattern */
-
-    if (*ptr != CHAR_RIGHT_PARENTHESIS)
-      {
-      *errorcodeptr = ERR14;
-      goto FAILED;
-      }
-
-    /* In the pre-compile phase, update the length by the length of the group,
-    less the brackets at either end. Then reduce the compiled code to just a
-    set of non-capturing brackets so that it doesn't use much memory if it is
-    duplicated by a quantifier.*/
-
-    if (lengthptr != NULL)
-      {
-      if (OFLOW_MAX - *lengthptr < length_prevgroup - 2 - 2*LINK_SIZE)
-        {
-        *errorcodeptr = ERR20;
-        goto FAILED;
-        }
-      *lengthptr += length_prevgroup - 2 - 2*LINK_SIZE;
-      code++;   /* This already contains bravalue */
-      PUTINC(code, 0, 1 + LINK_SIZE);
-      *code++ = OP_KET;
-      PUTINC(code, 0, 1 + LINK_SIZE);
-      break;    /* No need to waste time with special character handling */
-      }
-
-    /* Otherwise update the main code pointer to the end of the group. */
-
-    code = tempcode;
-
-    /* For a DEFINE group, required and first character settings are not
-    relevant. */
-
-    if (bravalue == OP_DEF) break;
-
-    /* Handle updating of the required and first characters for other types of
-    group. 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 zeroreqchar and
-    zerofirstchar outside the main loop so that they can be accessed for the
-    back off. */
-
-    zeroreqchar = reqchar;
-    zeroreqcharflags = reqcharflags;
-    zerofirstchar = firstchar;
-    zerofirstcharflags = firstcharflags;
-    groupsetfirstchar = FALSE;
-
-    if (bravalue >= OP_ONCE)
-      {
-      /* If we have not yet set a firstchar 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 reqchar if necessary. If the subpattern has
-      no firstchar, set "none" for the whole branch. In both cases, a zero
-      repeat forces firstchar to "none". */
-
-      if (firstcharflags == REQ_UNSET)
-        {
-        if (subfirstcharflags >= 0)
-          {
-          firstchar = subfirstchar;
-          firstcharflags = subfirstcharflags;
-          groupsetfirstchar = TRUE;
-          }
-        else firstcharflags = REQ_NONE;
-        zerofirstcharflags = REQ_NONE;
-        }
-
-      /* If firstchar was previously set, convert the subpattern's firstchar
-      into reqchar if there wasn't one, using the vary flag that was in
-      existence beforehand. */
-
-      else if (subfirstcharflags >= 0 && subreqcharflags < 0)
-        {
-        subreqchar = subfirstchar;
-        subreqcharflags = subfirstcharflags | 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 (subreqcharflags >= 0)
-        {
-        reqchar = subreqchar;
-        reqcharflags = subreqcharflags;
-        }
-      }
-
-    /* For a forward assertion, we take the reqchar, 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 firstchar
-    for an assertion, however because it leads to incorrect effect for patterns
-    such as /(?=a)a.+/ when the "real" "a" would then become a reqchar instead
-    of a firstchar. This is overcome by a scan at the end if there's no
-    firstchar, looking for an asserted first char. */
-
-    else if (bravalue == OP_ASSERT && subreqcharflags >= 0)
-      {
-      reqchar = subreqchar;
-      reqcharflags = subreqcharflags;
-      }
-    break;     /* End of processing '(' */
-
-
-    /* ===================================================================*/
-    /* Handle metasequences introduced by \. For ones like \d, the ESC_ values
-    are arranged to be the negation of the corresponding OP_values in the
-    default case when PCRE_UCP is not set. For the back references, the values
-    are negative 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. */
-
-    case CHAR_BACKSLASH:
-    tempptr = ptr;
-    escape = check_escape(&ptr, &ec, errorcodeptr, cd->bracount, options, FALSE);
-    if (*errorcodeptr != 0) goto FAILED;
-
-    if (escape == 0)                  /* The escape coded a single character */
-      c = ec;
-    else
-      {
-      if (escape == ESC_Q)            /* Handle start of quoted string */
-        {
-        if (ptr[1] == CHAR_BACKSLASH && ptr[2] == CHAR_E)
-          ptr += 2;               /* avoid empty string */
-            else inescq = TRUE;
-        continue;
-        }
-
-      if (escape == ESC_E) continue;  /* Perl ignores an orphan \E */
-
-      /* For metasequences that actually match a character, we disable the
-      setting of a first character if it hasn't already been set. */
-
-      if (firstcharflags == REQ_UNSET && escape > ESC_b && escape < ESC_Z)
-        firstcharflags = REQ_NONE;
-
-      /* Set values to reset to if this is followed by a zero repeat. */
-
-      zerofirstchar = firstchar;
-      zerofirstcharflags = firstcharflags;
-      zeroreqchar = reqchar;
-      zeroreqcharflags = reqcharflags;
-
-      /* \g<name> or \g'name' is a subroutine call by name and \g<n> or \g'n'
-      is a subroutine call by number (Oniguruma syntax). In fact, the value
-      ESC_g is returned only for these cases. So we don't need to check for <
-      or ' if the value is ESC_g. For the Perl syntax \g{n} the value is
-      -n, and for the Perl syntax \g{name} the result is ESC_k (as
-      that is a synonym for a named back reference). */
-
-      if (escape == ESC_g)
-        {
-        const pcre_uchar *p;
-        pcre_uint32 cf;
-
-        item_hwm_offset = cd->hwm - cd->start_workspace;   /* Normally this is set when '(' is read */
-        terminator = (*(++ptr) == CHAR_LESS_THAN_SIGN)?
-          CHAR_GREATER_THAN_SIGN : CHAR_APOSTROPHE;
-
-        /* These two statements stop the compiler for warning about possibly
-        unset variables caused by the jump to HANDLE_NUMERICAL_RECURSION. In
-        fact, because we do the check for a number below, the paths that
-        would actually be in error are never taken. */
-
-        skipbytes = 0;
-        reset_bracount = FALSE;
-
-        /* If it's not a signed or unsigned number, treat it as a name. */
-
-        cf = ptr[1];
-        if (cf != CHAR_PLUS && cf != CHAR_MINUS && !IS_DIGIT(cf))
-          {
-          is_recurse = TRUE;
-          goto NAMED_REF_OR_RECURSE;
-          }
-
-        /* Signed or unsigned number (cf = ptr[1]) is known to be plus or minus
-        or a digit. */
-
-        p = ptr + 2;
-        while (IS_DIGIT(*p)) p++;
-        if (*p != (pcre_uchar)terminator)
-          {
-          *errorcodeptr = ERR57;
-          goto FAILED;
-          }
-        ptr++;
-        goto HANDLE_NUMERICAL_RECURSION;
-        }
-
-      /* \k<name> or \k'name' is a back reference by name (Perl syntax).
-      We also support \k{name} (.NET syntax).  */
-
-      if (escape == ESC_k)
-        {
-        if ((ptr[1] != CHAR_LESS_THAN_SIGN &&
-          ptr[1] != CHAR_APOSTROPHE && ptr[1] != CHAR_LEFT_CURLY_BRACKET))
-          {
-          *errorcodeptr = ERR69;
-          goto FAILED;
-          }
-        is_recurse = FALSE;
-        terminator = (*(++ptr) == CHAR_LESS_THAN_SIGN)?
-          CHAR_GREATER_THAN_SIGN : (*ptr == CHAR_APOSTROPHE)?
-          CHAR_APOSTROPHE : CHAR_RIGHT_CURLY_BRACKET;
-        goto NAMED_REF_OR_RECURSE;
-        }
-
-      /* Back references are handled specially; must disable firstchar if
-      not set to cope with cases like (?=(\w+))\1: which would otherwise set
-      ':' later. */
-
-      if (escape < 0)
-        {
-        open_capitem *oc;
-        recno = -escape;
-
-        /* Come here from named backref handling when the reference is to a
-        single group (i.e. not to a duplicated name. */
-
-        HANDLE_REFERENCE:
-        if (firstcharflags == REQ_UNSET) firstcharflags = REQ_NONE;
-        previous = code;
-        item_hwm_offset = cd->hwm - cd->start_workspace;
-        *code++ = ((options & PCRE_CASELESS) != 0)? OP_REFI : OP_REF;
-        PUT2INC(code, 0, recno);
-        cd->backref_map |= (recno < 32)? (1 << recno) : 1;
-        if (recno > cd->top_backref) cd->top_backref = recno;
-
-        /* Check to see if this back reference is recursive, that it, it
-        is inside the group that it references. A flag is set so that the
-        group can be made atomic. */
-
-        for (oc = cd->open_caps; oc != NULL; oc = oc->next)
-          {
-          if (oc->number == recno)
-            {
-            oc->flag = TRUE;
-            break;
-            }
-          }
-        }
-
-      /* So are Unicode property matches, if supported. */
-
-#ifdef SUPPORT_UCP
-      else if (escape == ESC_P || escape == ESC_p)
-        {
-        BOOL negated;
-        unsigned int ptype = 0, pdata = 0;
-        if (!get_ucp(&ptr, &negated, &ptype, &pdata, errorcodeptr))
-          goto FAILED;
-        previous = code;
-        item_hwm_offset = cd->hwm - cd->start_workspace;
-        *code++ = ((escape == ESC_p) != negated)? OP_PROP : OP_NOTPROP;
-        *code++ = ptype;
-        *code++ = pdata;
-        }
-#else
-
-      /* If Unicode properties are not supported, \X, \P, and \p are not
-      allowed. */
-
-      else if (escape == ESC_X || escape == ESC_P || escape == ESC_p)
-        {
-        *errorcodeptr = ERR45;
-        goto FAILED;
-        }
-#endif
-
-      /* For the rest (including \X when Unicode properties are supported), we
-      can obtain the OP value by negating the escape value in the default
-      situation when PCRE_UCP is not set. When it *is* set, we substitute
-      Unicode property tests. Note that \b and \B do a one-character
-      lookbehind, and \A also behaves as if it does. */
-
-      else
-        {
-        if ((escape == ESC_b || escape == ESC_B || escape == ESC_A) &&
-             cd->max_lookbehind == 0)
-          cd->max_lookbehind = 1;
-#ifdef SUPPORT_UCP
-        if (escape >= ESC_DU && escape <= ESC_wu)
-          {
-          nestptr = ptr + 1;                   /* Where to resume */
-          ptr = substitutes[escape - ESC_DU] - 1;  /* Just before substitute */
-          }
-        else
-#endif
-        /* In non-UTF-8 mode, we turn \C into OP_ALLANY instead of OP_ANYBYTE
-        so that it works in DFA mode and in lookbehinds. */
-
-          {
-          previous = (escape > ESC_b && escape < ESC_Z)? code : NULL;
-          item_hwm_offset = cd->hwm - cd->start_workspace;
-          *code++ = (!utf && escape == ESC_C)? OP_ALLANY : escape;
-          }
-        }
-      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. */
-
-#if defined SUPPORT_UTF && !defined COMPILE_PCRE32
-    if (utf && c > MAX_VALUE_FOR_SINGLE_CHAR)
-      mclength = PRIV(ord2utf)(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 a UTF mode, it may be a
-    multi-unit literal character. */
-
-    default:
-    NORMAL_CHAR:
-    mclength = 1;
-    mcbuffer[0] = c;
-
-#ifdef SUPPORT_UTF
-    if (utf && HAS_EXTRALEN(c))
-      ACROSSCHAR(TRUE, ptr[1], 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;
-    item_hwm_offset = cd->hwm - cd->start_workspace;
-
-    /* For caseless UTF-8 mode when UCP support is available, check whether
-    this character has more than one other case. If so, generate a special
-    OP_PROP item instead of OP_CHARI. */
-
-#ifdef SUPPORT_UCP
-    if (utf && (options & PCRE_CASELESS) != 0)
-      {
-      GETCHAR(c, mcbuffer);
-      if ((c = UCD_CASESET(c)) != 0)
-        {
-        *code++ = OP_PROP;
-        *code++ = PT_CLIST;
-        *code++ = c;
-        if (firstcharflags == REQ_UNSET)
-          firstcharflags = zerofirstcharflags = REQ_NONE;
-        break;
-        }
-      }
-#endif
-
-    /* Caseful matches, or not one of the multicase characters. */
-
-    *code++ = ((options & PCRE_CASELESS) != 0)? OP_CHARI : OP_CHAR;
-    for (c = 0; c < mclength; c++) *code++ = mcbuffer[c];
-
-    /* Remember if \r or \n were seen */
-
-    if (mcbuffer[0] == CHAR_CR || mcbuffer[0] == CHAR_NL)
-      cd->external_flags |= PCRE_HASCRORLF;
-
-    /* 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 firstchar value alone, and don't change it on a zero
-    repeat. */
-
-    if (firstcharflags == REQ_UNSET)
-      {
-      zerofirstcharflags = REQ_NONE;
-      zeroreqchar = reqchar;
-      zeroreqcharflags = reqcharflags;
-
-      /* If the character is more than one byte long, we can set firstchar
-      only if it is not to be matched caselessly. */
-
-      if (mclength == 1 || req_caseopt == 0)
-        {
-        firstchar = mcbuffer[0] | req_caseopt;
-        firstchar = mcbuffer[0];
-        firstcharflags = req_caseopt;
-
-        if (mclength != 1)
-          {
-          reqchar = code[-1];
-          reqcharflags = cd->req_varyopt;
-          }
-        }
-      else firstcharflags = reqcharflags = REQ_NONE;
-      }
-
-    /* firstchar was previously set; we can set reqchar only if the length is
-    1 or the matching is caseful. */
-
-    else
-      {
-      zerofirstchar = firstchar;
-      zerofirstcharflags = firstcharflags;
-      zeroreqchar = reqchar;
-      zeroreqcharflags = reqcharflags;
-      if (mclength == 1 || req_caseopt == 0)
-        {
-        reqchar = code[-1];
-        reqcharflags = 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.
-This function is used during the pre-compile phase when we are trying to find
-out the amount of memory needed, as well as during the real compile phase. The
-value of lengthptr distinguishes the two phases.
-
-Arguments:
-  options           option bits, including any changes for this subpattern
-  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
-  reset_bracount    TRUE to reset the count for each branch
-  skipbytes         skip this many bytes at start (for brackets and OP_COND)
-  cond_depth        depth of nesting for conditional subpatterns
-  firstcharptr      place to put the first required character
-  firstcharflagsptr place to put the first character flags, or a negative number
-  reqcharptr        place to put the last required character
-  reqcharflagsptr   place to put the last required character flags, or a negative number
-  bcptr             pointer to the chain of currently open branches
-  cd                points to the data block with tables pointers etc.
-  lengthptr         NULL during the real compile phase
-                    points to length accumulator during pre-compile phase
-
-Returns:            TRUE on success
-*/
-
-static BOOL
-compile_regex(int options, pcre_uchar **codeptr, const pcre_uchar **ptrptr,
-  int *errorcodeptr, BOOL lookbehind, BOOL reset_bracount, int skipbytes,
-  int cond_depth,
-  pcre_uint32 *firstcharptr, pcre_int32 *firstcharflagsptr,
-  pcre_uint32 *reqcharptr, pcre_int32 *reqcharflagsptr,
-  branch_chain *bcptr, compile_data *cd, int *lengthptr)
-{
-const pcre_uchar *ptr = *ptrptr;
-pcre_uchar *code = *codeptr;
-pcre_uchar *last_branch = code;
-pcre_uchar *start_bracket = code;
-pcre_uchar *reverse_count = NULL;
-open_capitem capitem;
-int capnumber = 0;
-pcre_uint32 firstchar, reqchar;
-pcre_int32 firstcharflags, reqcharflags;
-pcre_uint32 branchfirstchar, branchreqchar;
-pcre_int32 branchfirstcharflags, branchreqcharflags;
-int length;
-unsigned int orig_bracount;
-unsigned int max_bracount;
-branch_chain bc;
-size_t save_hwm_offset;
-
-/* If set, call the external function that checks for stack availability. */
-
-if (PUBL(stack_guard) != NULL && PUBL(stack_guard)())
-  {
-  *errorcodeptr= ERR85;
-  return FALSE;
-  }
-
-/* Miscellaneous initialization */
-
-bc.outer = bcptr;
-bc.current_branch = code;
-
-firstchar = reqchar = 0;
-firstcharflags = reqcharflags = REQ_UNSET;
-
-save_hwm_offset = cd->hwm - cd->start_workspace;
-
-/* Accumulate the length for use in the pre-compile phase. Start with the
-length of the BRA and KET and any extra bytes that are required at the
-beginning. We accumulate in a local variable to save frequent testing of
-lenthptr for NULL. We cannot do this by looking at the value of code at the
-start and end of each alternative, because compiled items are discarded during
-the pre-compile phase so that the work space is not exceeded. */
-
-length = 2 + 2*LINK_SIZE + skipbytes;
-
-/* WARNING: If the above line is changed for any reason, you must also change
-the code that abstracts option settings at the start of the pattern and makes
-them global. It tests the value of length for (2 + 2*LINK_SIZE) in the
-pre-compile phase to find out whether anything has yet been compiled or not. */
-
-/* If this is a capturing subpattern, add to the chain of open capturing items
-so that we can detect them if (*ACCEPT) is encountered. This is also used to
-detect groups that contain recursive back references to themselves. Note that
-only OP_CBRA need be tested here; changing this opcode to one of its variants,
-e.g. OP_SCBRAPOS, happens later, after the group has been compiled. */
-
-if (*code == OP_CBRA)
-  {
-  capnumber = GET2(code, 1 + LINK_SIZE);
-  capitem.number = capnumber;
-  capitem.next = cd->open_caps;
-  capitem.flag = FALSE;
-  cd->open_caps = &capitem;
-  }
-
-/* 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 */
-
-orig_bracount = max_bracount = cd->bracount;
-for (;;)
-  {
-  /* For a (?| group, reset the capturing bracket count so that each branch
-  uses the same numbers. */
-
-  if (reset_bracount) cd->bracount = orig_bracount;
-
-  /* Set up dummy OP_REVERSE if lookbehind assertion */
-
-  if (lookbehind)
-    {
-    *code++ = OP_REVERSE;
-    reverse_count = code;
-    PUTINC(code, 0, 0);
-    length += 1 + LINK_SIZE;
-    }
-
-  /* Now compile the branch; in the pre-compile phase its length gets added
-  into the length. */
-
-  if (!compile_branch(&options, &code, &ptr, errorcodeptr, &branchfirstchar,
-        &branchfirstcharflags, &branchreqchar, &branchreqcharflags, &bc,
-        cond_depth, cd, (lengthptr == NULL)? NULL : &length))
-    {
-    *ptrptr = ptr;
-    return FALSE;
-    }
-
-  /* Keep the highest bracket count in case (?| was used and some branch
-  has fewer than the rest. */
-
-  if (cd->bracount > max_bracount) max_bracount = cd->bracount;
-
-  /* In the real compile phase, there is some post-processing to be done. */
-
-  if (lengthptr == NULL)
-    {
-    /* If this is the first branch, the firstchar and reqchar values for the
-    branch become the values for the regex. */
-
-    if (*last_branch != OP_ALT)
-      {
-      firstchar = branchfirstchar;
-      firstcharflags = branchfirstcharflags;
-      reqchar = branchreqchar;
-      reqcharflags = branchreqcharflags;
-      }
-
-    /* If this is not the first branch, the first char and reqchar have to
-    match the values from all the previous branches, except that if the
-    previous value for reqchar didn't have REQ_VARY set, it can still match,
-    and we set REQ_VARY for the regex. */
-
-    else
-      {
-      /* If we previously had a firstchar, but it doesn't match the new branch,
-      we have to abandon the firstchar for the regex, but if there was
-      previously no reqchar, it takes on the value of the old firstchar. */
-
-      if (firstcharflags >= 0 &&
-          (firstcharflags != branchfirstcharflags || firstchar != branchfirstchar))
-        {
-        if (reqcharflags < 0)
-          {
-          reqchar = firstchar;
-          reqcharflags = firstcharflags;
-          }
-        firstcharflags = REQ_NONE;
-        }
-
-      /* If we (now or from before) have no firstchar, a firstchar from the
-      branch becomes a reqchar if there isn't a branch reqchar. */
-
-      if (firstcharflags < 0 && branchfirstcharflags >= 0 && branchreqcharflags < 0)
-        {
-        branchreqchar = branchfirstchar;
-        branchreqcharflags = branchfirstcharflags;
-        }
-
-      /* Now ensure that the reqchars match */
-
-      if (((reqcharflags & ~REQ_VARY) != (branchreqcharflags & ~REQ_VARY)) ||
-          reqchar != branchreqchar)
-        reqcharflags = REQ_NONE;
-      else
-        {
-        reqchar = branchreqchar;
-        reqcharflags |= branchreqcharflags; /* 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 the branch contains OP_RECURSE, the result is -3
-    because there may be forward references that we can't check here. Set a
-    flag to cause another lookbehind check at the end. Why not do it all at the
-    end? Because common, erroneous checks are picked up here and the offset of
-    the problem can be shown. */
-
-    if (lookbehind)
-      {
-      int fixed_length;
-      *code = OP_END;
-      fixed_length = find_fixedlength(last_branch,  (options & PCRE_UTF8) != 0,
-        FALSE, cd, NULL);
-      DPRINTF(("fixed length = %d\n", fixed_length));
-      if (fixed_length == -3)
-        {
-        cd->check_lookbehind = TRUE;
-        }
-      else if (fixed_length < 0)
-        {
-        *errorcodeptr = (fixed_length == -2)? ERR36 :
-                        (fixed_length == -4)? ERR70: ERR25;
-        *ptrptr = ptr;
-        return FALSE;
-        }
-      else
-        {
-        if (fixed_length > cd->max_lookbehind)
-          cd->max_lookbehind = fixed_length;
-        PUT(reverse_count, 0, fixed_length);
-        }
-      }
-    }
-
-  /* Reached end of expression, either ')' or end of pattern. In the real
-  compile phase, 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. Return leaving the pointer at the terminating char. */
-
-  if (*ptr != CHAR_VERTICAL_LINE)
-    {
-    if (lengthptr == NULL)
-      {
-      int branch_length = (int)(code - last_branch);
-      do
-        {
-        int prev_length = GET(last_branch, 1);
-        PUT(last_branch, 1, branch_length);
-        branch_length = prev_length;
-        last_branch -= branch_length;
-        }
-      while (branch_length > 0);
-      }
-
-    /* Fill in the ket */
-
-    *code = OP_KET;
-    PUT(code, 1, (int)(code - start_bracket));
-    code += 1 + LINK_SIZE;
-
-    /* If it was a capturing subpattern, check to see if it contained any
-    recursive back references. If so, we must wrap it in atomic brackets.
-    Because we are moving code along, we must ensure that any pending recursive
-    references are updated. In any event, remove the block from the chain. */
-
-    if (capnumber > 0)
-      {
-      if (cd->open_caps->flag)
-        {
-        *code = OP_END;
-        adjust_recurse(start_bracket, 1 + LINK_SIZE,
-          (options & PCRE_UTF8) != 0, cd, save_hwm_offset);
-        memmove(start_bracket + 1 + LINK_SIZE, start_bracket,
-          IN_UCHARS(code - start_bracket));
-        *start_bracket = OP_ONCE;
-        code += 1 + LINK_SIZE;
-        PUT(start_bracket, 1, (int)(code - start_bracket));
-        *code = OP_KET;
-        PUT(code, 1, (int)(code - start_bracket));
-        code += 1 + LINK_SIZE;
-        length += 2 + 2*LINK_SIZE;
-        }
-      cd->open_caps = cd->open_caps->next;
-      }
-
-    /* Retain the highest bracket number, in case resetting was used. */
-
-    cd->bracount = max_bracount;
-
-    /* Set values to pass back */
-
-    *codeptr = code;
-    *ptrptr = ptr;
-    *firstcharptr = firstchar;
-    *firstcharflagsptr = firstcharflags;
-    *reqcharptr = reqchar;
-    *reqcharflagsptr = reqcharflags;
-    if (lengthptr != NULL)
-      {
-      if (OFLOW_MAX - *lengthptr < length)
-        {
-        *errorcodeptr = ERR20;
-        return FALSE;
-        }
-      *lengthptr += length;
-      }
-    return TRUE;
-    }
-
-  /* Another branch follows. In the pre-compile phase, we can move the code
-  pointer back to where it was for the start of the first branch. (That is,
-  pretend that each branch is the only one.)
-
-  In the real compile phase, insert an ALT 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. */
-
-  if (lengthptr != NULL)
-    {
-    code = *codeptr + 1 + LINK_SIZE + skipbytes;
-    length += 1 + LINK_SIZE;
-    }
-  else
-    {
-    *code = OP_ALT;
-    PUT(code, 1, (int)(code - last_branch));
-    bc.current_branch = 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 will
-be found, because ^ generates OP_CIRCM in that mode.
-
-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.
-
-... A second exception is when the .* appears inside an atomic group, because
-this prevents the number of characters it matches from being adjusted.
-
-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
-  cd             points to the compile data block
-  atomcount      atomic group level
-
-Returns:     TRUE or FALSE
-*/
-
-static BOOL
-is_anchored(register const pcre_uchar *code, unsigned int bracket_map,
-  compile_data *cd, int atomcount)
-{
-do {
-   const pcre_uchar *scode = first_significant_code(
-     code + PRIV(OP_lengths)[*code], FALSE);
-   register int op = *scode;
-
-   /* Non-capturing brackets */
-
-   if (op == OP_BRA  || op == OP_BRAPOS ||
-       op == OP_SBRA || op == OP_SBRAPOS)
-     {
-     if (!is_anchored(scode, bracket_map, cd, atomcount)) return FALSE;
-     }
-
-   /* Capturing brackets */
-
-   else if (op == OP_CBRA  || op == OP_CBRAPOS ||
-            op == OP_SCBRA || op == OP_SCBRAPOS)
-     {
-     int n = GET2(scode, 1+LINK_SIZE);
-     int new_map = bracket_map | ((n < 32)? (1 << n) : 1);
-     if (!is_anchored(scode, new_map, cd, atomcount)) return FALSE;
-     }
-
-   /* Positive forward assertions and conditions */
-
-   else if (op == OP_ASSERT || op == OP_COND)
-     {
-     if (!is_anchored(scode, bracket_map, cd, atomcount)) return FALSE;
-     }
-
-   /* Atomic groups */
-
-   else if (op == OP_ONCE || op == OP_ONCE_NC)
-     {
-     if (!is_anchored(scode, bracket_map, cd, atomcount + 1))
-       return FALSE;
-     }
-
-   /* .* is not anchored unless DOTALL is set (which generates OP_ALLANY) and
-   it isn't in brackets that are or may be referenced or inside an atomic
-   group. */
-
-   else if ((op == OP_TYPESTAR || op == OP_TYPEMINSTAR ||
-             op == OP_TYPEPOSSTAR))
-     {
-     if (scode[1] != OP_ALLANY || (bracket_map & cd->backref_map) != 0 ||
-         atomcount > 0 || cd->had_pruneorskip)
-       return FALSE;
-     }
-
-   /* Check for explicit anchoring */
-
-   else if (op != OP_SOD && op != OP_SOM && 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. Also, the appearance of .*
-inside atomic brackets or in a pattern that contains *PRUNE or *SKIP does not
-count, because once again the assumption no longer holds.
-
-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
-  cd             points to the compile data
-  atomcount      atomic group level
-
-Returns:         TRUE or FALSE
-*/
-
-static BOOL
-is_startline(const pcre_uchar *code, unsigned int bracket_map,
-  compile_data *cd, int atomcount)
-{
-do {
-   const pcre_uchar *scode = first_significant_code(
-     code + PRIV(OP_lengths)[*code], FALSE);
-   register int op = *scode;
-
-   /* If we are at the start of a conditional assertion group, *both* the
-   conditional assertion *and* what follows the condition must satisfy the test
-   for start of line. Other kinds of condition fail. Note that there may be an
-   auto-callout at the start of a condition. */
-
-   if (op == OP_COND)
-     {
-     scode += 1 + LINK_SIZE;
-     if (*scode == OP_CALLOUT) scode += PRIV(OP_lengths)[OP_CALLOUT];
-     switch (*scode)
-       {
-       case OP_CREF:
-       case OP_DNCREF:
-       case OP_RREF:
-       case OP_DNRREF:
-       case OP_DEF:
-       case OP_FAIL:
-       return FALSE;
-
-       default:     /* Assertion */
-       if (!is_startline(scode, bracket_map, cd, atomcount)) return FALSE;
-       do scode += GET(scode, 1); while (*scode == OP_ALT);
-       scode += 1 + LINK_SIZE;
-       break;
-       }
-     scode = first_significant_code(scode, FALSE);
-     op = *scode;
-     }
-
-   /* Non-capturing brackets */
-
-   if (op == OP_BRA  || op == OP_BRAPOS ||
-       op == OP_SBRA || op == OP_SBRAPOS)
-     {
-     if (!is_startline(scode, bracket_map, cd, atomcount)) return FALSE;
-     }
-
-   /* Capturing brackets */
-
-   else if (op == OP_CBRA  || op == OP_CBRAPOS ||
-            op == OP_SCBRA || op == OP_SCBRAPOS)
-     {
-     int n = GET2(scode, 1+LINK_SIZE);
-     int new_map = bracket_map | ((n < 32)? (1 << n) : 1);
-     if (!is_startline(scode, new_map, cd, atomcount)) return FALSE;
-     }
-
-   /* Positive forward assertions */
-
-   else if (op == OP_ASSERT)
-     {
-     if (!is_startline(scode, bracket_map, cd, atomcount)) return FALSE;
-     }
-
-   /* Atomic brackets */
-
-   else if (op == OP_ONCE || op == OP_ONCE_NC)
-     {
-     if (!is_startline(scode, bracket_map, cd, atomcount + 1)) return FALSE;
-     }
-
-   /* .* means "start at start or after \n" if it isn't in atomic brackets or
-   brackets that may be referenced, as long as the pattern does not contain
-   *PRUNE or *SKIP, because these break the feature. Consider, for example,
-   /.*?a(*PRUNE)b/ with the subject "aab", which matches "ab", i.e. not at the
-   start of a line. */
-
-   else if (op == OP_TYPESTAR || op == OP_TYPEMINSTAR || op == OP_TYPEPOSSTAR)
-     {
-     if (scode[1] != OP_ANY || (bracket_map & cd->backref_map) != 0 ||
-         atomcount > 0 || cd->had_pruneorskip)
-       return FALSE;
-     }
-
-   /* Check for explicit circumflex; anything else gives a FALSE result. Note
-   in particular that this includes atomic brackets OP_ONCE and OP_ONCE_NC
-   because the number of characters matched by .* cannot be adjusted inside
-   them. */
-
-   else if (op != OP_CIRC && op != OP_CIRCM) 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
-non-conditional bracket all of whose alternatives start with the same asserted
-char (recurse ad lib), then we return that char, with the flags set to zero or
-REQ_CASELESS; otherwise return zero with REQ_NONE in the flags.
-
-Arguments:
-  code       points to start of expression (the bracket)
-  flags      points to the first char flags, or to REQ_NONE
-  inassert   TRUE if in an assertion
-
-Returns:     the fixed first char, or 0 with REQ_NONE in flags
-*/
-
-static pcre_uint32
-find_firstassertedchar(const pcre_uchar *code, pcre_int32 *flags,
-  BOOL inassert)
-{
-register pcre_uint32 c = 0;
-int cflags = REQ_NONE;
-
-*flags = REQ_NONE;
-do {
-   pcre_uint32 d;
-   int dflags;
-   int xl = (*code == OP_CBRA || *code == OP_SCBRA ||
-             *code == OP_CBRAPOS || *code == OP_SCBRAPOS)? IMM2_SIZE:0;
-   const pcre_uchar *scode = first_significant_code(code + 1+LINK_SIZE + xl,
-     TRUE);
-   register pcre_uchar op = *scode;
-
-   switch(op)
-     {
-     default:
-     return 0;
-
-     case OP_BRA:
-     case OP_BRAPOS:
-     case OP_CBRA:
-     case OP_SCBRA:
-     case OP_CBRAPOS:
-     case OP_SCBRAPOS:
-     case OP_ASSERT:
-     case OP_ONCE:
-     case OP_ONCE_NC:
-     d = find_firstassertedchar(scode, &dflags, op == OP_ASSERT);
-     if (dflags < 0)
-       return 0;
-     if (cflags < 0) { c = d; cflags = dflags; } else if (c != d || cflags != dflags) return 0;
-     break;
-
-     case OP_EXACT:
-     scode += IMM2_SIZE;
-     /* Fall through */
-
-     case OP_CHAR:
-     case OP_PLUS:
-     case OP_MINPLUS:
-     case OP_POSPLUS:
-     if (!inassert) return 0;
-     if (cflags < 0) { c = scode[1]; cflags = 0; }
-       else if (c != scode[1]) return 0;
-     break;
-
-     case OP_EXACTI:
-     scode += IMM2_SIZE;
-     /* Fall through */
-
-     case OP_CHARI:
-     case OP_PLUSI:
-     case OP_MINPLUSI:
-     case OP_POSPLUSI:
-     if (!inassert) return 0;
-     if (cflags < 0) { c = scode[1]; cflags = REQ_CASELESS; }
-       else if (c != scode[1]) return 0;
-     break;
-     }
-
-   code += GET(code, 1);
-   }
-while (*code == OP_ALT);
-
-*flags = cflags;
-return c;
-}
-
-
-
-/*************************************************
-*     Add an entry to the name/number table      *
-*************************************************/
-
-/* This function is called between compiling passes to add an entry to the
-name/number table, maintaining alphabetical order. Checking for permitted
-and forbidden duplicates has already been done.
-
-Arguments:
-  cd           the compile data block
-  name         the name to add
-  length       the length of the name
-  groupno      the group number
-
-Returns:       nothing
-*/
-
-static void
-add_name(compile_data *cd, const pcre_uchar *name, int length,
-  unsigned int groupno)
-{
-int i;
-pcre_uchar *slot = cd->name_table;
-
-for (i = 0; i < cd->names_found; i++)
-  {
-  int crc = memcmp(name, slot+IMM2_SIZE, IN_UCHARS(length));
-  if (crc == 0 && slot[IMM2_SIZE+length] != 0)
-    crc = -1; /* Current name is a substring */
-
-  /* Make space in the table and break the loop for an earlier name. For a
-  duplicate or later name, carry on. We do this for duplicates so that in the
-  simple case (when ?(| is not used) they are in order of their numbers. In all
-  cases they are in the order in which they appear in the pattern. */
-
-  if (crc < 0)
-    {
-    memmove(slot + cd->name_entry_size, slot,
-      IN_UCHARS((cd->names_found - i) * cd->name_entry_size));
-    break;
-    }
-
-  /* Continue the loop for a later or duplicate name */
-
-  slot += cd->name_entry_size;
-  }
-
-PUT2(slot, 0, groupno);
-memcpy(slot + IMM2_SIZE, name, IN_UCHARS(length));
-slot[IMM2_SIZE + length] = 0;
-cd->names_found++;
-}
-
-
-
-/*************************************************
-*        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
-*/
-
-#if defined COMPILE_PCRE8
-PCRE_EXP_DEFN pcre * PCRE_CALL_CONVENTION
-pcre_compile(const char *pattern, int options, const char **errorptr,
-  int *erroroffset, const unsigned char *tables)
-#elif defined COMPILE_PCRE16
-PCRE_EXP_DEFN pcre16 * PCRE_CALL_CONVENTION
-pcre16_compile(PCRE_SPTR16 pattern, int options, const char **errorptr,
-  int *erroroffset, const unsigned char *tables)
-#elif defined COMPILE_PCRE32
-PCRE_EXP_DEFN pcre32 * PCRE_CALL_CONVENTION
-pcre32_compile(PCRE_SPTR32 pattern, int options, const char **errorptr,
-  int *erroroffset, const unsigned char *tables)
-#endif
-{
-#if defined COMPILE_PCRE8
-return pcre_compile2(pattern, options, NULL, errorptr, erroroffset, tables);
-#elif defined COMPILE_PCRE16
-return pcre16_compile2(pattern, options, NULL, errorptr, erroroffset, tables);
-#elif defined COMPILE_PCRE32
-return pcre32_compile2(pattern, options, NULL, errorptr, erroroffset, tables);
-#endif
-}
-
-
-#if defined COMPILE_PCRE8
-PCRE_EXP_DEFN pcre * PCRE_CALL_CONVENTION
-pcre_compile2(const char *pattern, int options, int *errorcodeptr,
-  const char **errorptr, int *erroroffset, const unsigned char *tables)
-#elif defined COMPILE_PCRE16
-PCRE_EXP_DEFN pcre16 * PCRE_CALL_CONVENTION
-pcre16_compile2(PCRE_SPTR16 pattern, int options, int *errorcodeptr,
-  const char **errorptr, int *erroroffset, const unsigned char *tables)
-#elif defined COMPILE_PCRE32
-PCRE_EXP_DEFN pcre32 * PCRE_CALL_CONVENTION
-pcre32_compile2(PCRE_SPTR32 pattern, int options, int *errorcodeptr,
-  const char **errorptr, int *erroroffset, const unsigned char *tables)
-#endif
-{
-REAL_PCRE *re;
-int length = 1;  /* For final END opcode */
-pcre_int32 firstcharflags, reqcharflags;
-pcre_uint32 firstchar, reqchar;
-pcre_uint32 limit_match = PCRE_UINT32_MAX;
-pcre_uint32 limit_recursion = PCRE_UINT32_MAX;
-int newline;
-int errorcode = 0;
-int skipatstart = 0;
-BOOL utf;
-BOOL never_utf = FALSE;
-size_t size;
-pcre_uchar *code;
-const pcre_uchar *codestart;
-const pcre_uchar *ptr;
-compile_data compile_block;
-compile_data *cd = &compile_block;
-
-/* This space is used for "compiling" into during the first phase, when we are
-computing the amount of memory that is needed. Compiled items are thrown away
-as soon as possible, so that a fairly large buffer should be sufficient for
-this purpose. The same space is used in the second phase for remembering where
-to fill in forward references to subpatterns. That may overflow, in which case
-new memory is obtained from malloc(). */
-
-pcre_uchar cworkspace[COMPILE_WORK_SIZE];
-
-/* This vector is used for remembering name groups during the pre-compile. In a
-similar way to cworkspace, it can be expanded using malloc() if necessary. */
-
-named_group named_groups[NAMED_GROUP_LIST_SIZE];
-
-/* Set this early so that early errors get offset 0. */
-
-ptr = (const pcre_uchar *)pattern;
-
-/* 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_RETURN2;
-  }
-
-*erroroffset = 0;
-
-/* Set up pointers to the individual character tables */
-
-if (tables == NULL) tables = PRIV(default_tables);
-cd->lcc = tables + lcc_offset;
-cd->fcc = tables + fcc_offset;
-cd->cbits = tables + cbits_offset;
-cd->ctypes = tables + ctypes_offset;
-
-/* Check that all undefined public option bits are zero */
-
-if ((options & ~PUBLIC_COMPILE_OPTIONS) != 0)
-  {
-  errorcode = ERR17;
-  goto PCRE_EARLY_ERROR_RETURN;
-  }
-
-/* If PCRE_NEVER_UTF is set, remember it. */
-
-if ((options & PCRE_NEVER_UTF) != 0) never_utf = TRUE;
-
-/* Check for global one-time settings at the start of the pattern, and remember
-the offset for later. */
-
-cd->external_flags = 0;   /* Initialize here for LIMIT_MATCH/RECURSION */
-
-while (ptr[skipatstart] == CHAR_LEFT_PARENTHESIS &&
-       ptr[skipatstart+1] == CHAR_ASTERISK)
-  {
-  int newnl = 0;
-  int newbsr = 0;
-
-/* For completeness and backward compatibility, (*UTFn) is supported in the
-relevant libraries, but (*UTF) is generic and always supported. Note that
-PCRE_UTF8 == PCRE_UTF16 == PCRE_UTF32. */
-
-#ifdef COMPILE_PCRE8
-  if (STRNCMP_UC_C8(ptr+skipatstart+2, STRING_UTF8_RIGHTPAR, 5) == 0)
-    { skipatstart += 7; options |= PCRE_UTF8; continue; }
-#endif
-#ifdef COMPILE_PCRE16
-  if (STRNCMP_UC_C8(ptr+skipatstart+2, STRING_UTF16_RIGHTPAR, 6) == 0)
-    { skipatstart += 8; options |= PCRE_UTF16; continue; }
-#endif
-#ifdef COMPILE_PCRE32
-  if (STRNCMP_UC_C8(ptr+skipatstart+2, STRING_UTF32_RIGHTPAR, 6) == 0)
-    { skipatstart += 8; options |= PCRE_UTF32; continue; }
-#endif
-
-  else if (STRNCMP_UC_C8(ptr+skipatstart+2, STRING_UTF_RIGHTPAR, 4) == 0)
-    { skipatstart += 6; options |= PCRE_UTF8; continue; }
-  else if (STRNCMP_UC_C8(ptr+skipatstart+2, STRING_UCP_RIGHTPAR, 4) == 0)
-    { skipatstart += 6; options |= PCRE_UCP; continue; }
-  else if (STRNCMP_UC_C8(ptr+skipatstart+2, STRING_NO_AUTO_POSSESS_RIGHTPAR, 16) == 0)
-    { skipatstart += 18; options |= PCRE_NO_AUTO_POSSESS; continue; }
-  else if (STRNCMP_UC_C8(ptr+skipatstart+2, STRING_NO_START_OPT_RIGHTPAR, 13) == 0)
-    { skipatstart += 15; options |= PCRE_NO_START_OPTIMIZE; continue; }
-
-  else if (STRNCMP_UC_C8(ptr+skipatstart+2, STRING_LIMIT_MATCH_EQ, 12) == 0)
-    {
-    pcre_uint32 c = 0;
-    int p = skipatstart + 14;
-    while (isdigit(ptr[p]))
-      {
-      if (c > PCRE_UINT32_MAX / 10 - 1) break;   /* Integer overflow */
-      c = c*10 + ptr[p++] - CHAR_0;
-      }
-    if (ptr[p++] != CHAR_RIGHT_PARENTHESIS) break;
-    if (c < limit_match)
-      {
-      limit_match = c;
-      cd->external_flags |= PCRE_MLSET;
-      }
-    skipatstart = p;
-    continue;
-    }
-
-  else if (STRNCMP_UC_C8(ptr+skipatstart+2, STRING_LIMIT_RECURSION_EQ, 16) == 0)
-    {
-    pcre_uint32 c = 0;
-    int p = skipatstart + 18;
-    while (isdigit(ptr[p]))
-      {
-      if (c > PCRE_UINT32_MAX / 10 - 1) break;   /* Integer overflow check */
-      c = c*10 + ptr[p++] - CHAR_0;
-      }
-    if (ptr[p++] != CHAR_RIGHT_PARENTHESIS) break;
-    if (c < limit_recursion)
-      {
-      limit_recursion = c;
-      cd->external_flags |= PCRE_RLSET;
-      }
-    skipatstart = p;
-    continue;
-    }
-
-  if (STRNCMP_UC_C8(ptr+skipatstart+2, STRING_CR_RIGHTPAR, 3) == 0)
-    { skipatstart += 5; newnl = PCRE_NEWLINE_CR; }
-  else if (STRNCMP_UC_C8(ptr+skipatstart+2, STRING_LF_RIGHTPAR, 3)  == 0)
-    { skipatstart += 5; newnl = PCRE_NEWLINE_LF; }
-  else if (STRNCMP_UC_C8(ptr+skipatstart+2, STRING_CRLF_RIGHTPAR, 5)  == 0)
-    { skipatstart += 7; newnl = PCRE_NEWLINE_CR + PCRE_NEWLINE_LF; }
-  else if (STRNCMP_UC_C8(ptr+skipatstart+2, STRING_ANY_RIGHTPAR, 4) == 0)
-    { skipatstart += 6; newnl = PCRE_NEWLINE_ANY; }
-  else if (STRNCMP_UC_C8(ptr+skipatstart+2, STRING_ANYCRLF_RIGHTPAR, 8) == 0)
-    { skipatstart += 10; newnl = PCRE_NEWLINE_ANYCRLF; }
-
-  else if (STRNCMP_UC_C8(ptr+skipatstart+2, STRING_BSR_ANYCRLF_RIGHTPAR, 12) == 0)
-    { skipatstart += 14; newbsr = PCRE_BSR_ANYCRLF; }
-  else if (STRNCMP_UC_C8(ptr+skipatstart+2, STRING_BSR_UNICODE_RIGHTPAR, 12) == 0)
-    { skipatstart += 14; newbsr = PCRE_BSR_UNICODE; }
-
-  if (newnl != 0)
-    options = (options & ~PCRE_NEWLINE_BITS) | newnl;
-  else if (newbsr != 0)
-    options = (options & ~(PCRE_BSR_ANYCRLF|PCRE_BSR_UNICODE)) | newbsr;
-  else break;
-  }
-
-/* PCRE_UTF(16|32) have the same value as PCRE_UTF8. */
-utf = (options & PCRE_UTF8) != 0;
-if (utf && never_utf)
-  {
-  errorcode = ERR78;
-  goto PCRE_EARLY_ERROR_RETURN2;
-  }
-
-/* Can't support UTF unless PCRE has been compiled to include the code. The
-return of an error code from PRIV(valid_utf)() is a new feature, introduced in
-release 8.13. It is passed back from pcre_[dfa_]exec(), but at the moment is
-not used here. */
-
-#ifdef SUPPORT_UTF
-if (utf && (options & PCRE_NO_UTF8_CHECK) == 0 &&
-     (errorcode = PRIV(valid_utf)((PCRE_PUCHAR)pattern, -1, erroroffset)) != 0)
-  {
-#if defined COMPILE_PCRE8
-  errorcode = ERR44;
-#elif defined COMPILE_PCRE16
-  errorcode = ERR74;
-#elif defined COMPILE_PCRE32
-  errorcode = ERR77;
-#endif
-  goto PCRE_EARLY_ERROR_RETURN2;
-  }
-#else
-if (utf)
-  {
-  errorcode = ERR32;
-  goto PCRE_EARLY_ERROR_RETURN;
-  }
-#endif
-
-/* Can't support UCP unless PCRE has been compiled to include the code. */
-
-#ifndef SUPPORT_UCP
-if ((options & PCRE_UCP) != 0)
-  {
-  errorcode = ERR67;
-  goto PCRE_EARLY_ERROR_RETURN;
-  }
-#endif
-
-/* Check validity of \R options. */
-
-if ((options & (PCRE_BSR_ANYCRLF|PCRE_BSR_UNICODE)) ==
-     (PCRE_BSR_ANYCRLF|PCRE_BSR_UNICODE))
-  {
-  errorcode = ERR56;
-  goto PCRE_EARLY_ERROR_RETURN;
-  }
-
-/* Handle different types of newline. The three bits give seven cases. The
-current code allows for fixed one- or two-byte sequences, plus "any" and
-"anycrlf". */
-
-switch (options & PCRE_NEWLINE_BITS)
-  {
-  case 0: newline = NEWLINE; break;   /* Build-time default */
-  case PCRE_NEWLINE_CR: newline = CHAR_CR; break;
-  case PCRE_NEWLINE_LF: newline = CHAR_NL; break;
-  case PCRE_NEWLINE_CR+
-       PCRE_NEWLINE_LF: newline = (CHAR_CR << 8) | CHAR_NL; break;
-  case PCRE_NEWLINE_ANY: newline = -1; break;
-  case PCRE_NEWLINE_ANYCRLF: newline = -2; break;
-  default: errorcode = ERR56; goto PCRE_EARLY_ERROR_RETURN;
-  }
-
-if (newline == -2)
-  {
-  cd->nltype = NLTYPE_ANYCRLF;
-  }
-else if (newline < 0)
-  {
-  cd->nltype = NLTYPE_ANY;
-  }
-else
-  {
-  cd->nltype = NLTYPE_FIXED;
-  if (newline > 255)
-    {
-    cd->nllen = 2;
-    cd->nl[0] = (newline >> 8) & 255;
-    cd->nl[1] = newline & 255;
-    }
-  else
-    {
-    cd->nllen = 1;
-    cd->nl[0] = newline;
-    }
-  }
-
-/* Maximum back reference and backref bitmap. The bitmap records up to 31 back
-references to help in deciding whether (.*) can be treated as anchored or not.
-*/
-
-cd->top_backref = 0;
-cd->backref_map = 0;
-
-/* Reflect pattern for debugging output */
-
-DPRINTF(("------------------------------------------------------------------\n"));
-#ifdef PCRE_DEBUG
-print_puchar(stdout, (PCRE_PUCHAR)pattern);
-#endif
-DPRINTF(("\n"));
-
-/* Pretend to compile the pattern while actually just accumulating the length
-of memory required. This behaviour is triggered by passing a non-NULL final
-argument to compile_regex(). We pass a block of workspace (cworkspace) for it
-to compile parts of the pattern into; the compiled code is discarded when it is
-no longer needed, so hopefully this workspace will never overflow, though there
-is a test for its doing so. */
-
-cd->bracount = cd->final_bracount = 0;
-cd->names_found = 0;
-cd->name_entry_size = 0;
-cd->name_table = NULL;
-cd->dupnames = FALSE;
-cd->dupgroups = FALSE;
-cd->namedrefcount = 0;
-cd->start_code = cworkspace;
-cd->hwm = cworkspace;
-cd->iscondassert = FALSE;
-cd->start_workspace = cworkspace;
-cd->workspace_size = COMPILE_WORK_SIZE;
-cd->named_groups = named_groups;
-cd->named_group_list_size = NAMED_GROUP_LIST_SIZE;
-cd->start_pattern = (const pcre_uchar *)pattern;
-cd->end_pattern = (const pcre_uchar *)(pattern + STRLEN_UC((const pcre_uchar *)pattern));
-cd->req_varyopt = 0;
-cd->parens_depth = 0;
-cd->assert_depth = 0;
-cd->max_lookbehind = 0;
-cd->external_options = options;
-cd->open_caps = NULL;
-
-/* Now do the pre-compile. On error, errorcode will be set non-zero, so we
-don't need to look at the result of the function here. The initial options have
-been put into the cd block so that they can be changed if an option setting is
-found within the regex right at the beginning. Bringing initial option settings
-outside can help speed up starting point checks. */
-
-ptr += skipatstart;
-code = cworkspace;
-*code = OP_BRA;
-
-(void)compile_regex(cd->external_options, &code, &ptr, &errorcode, FALSE,
-  FALSE, 0, 0, &firstchar, &firstcharflags, &reqchar, &reqcharflags, NULL,
-  cd, &length);
-if (errorcode != 0) goto PCRE_EARLY_ERROR_RETURN;
-
-DPRINTF(("end pre-compile: length=%d workspace=%d\n", length,
-  (int)(cd->hwm - cworkspace)));
-
-if (length > MAX_PATTERN_SIZE)
-  {
-  errorcode = ERR20;
-  goto PCRE_EARLY_ERROR_RETURN;
-  }
-
-/* Compute the size of the data block for storing the compiled pattern. Integer
-overflow should no longer be possible because nowadays we limit the maximum
-value of cd->names_found and cd->name_entry_size. */
-
-size = sizeof(REAL_PCRE) +
-  (length + cd->names_found * cd->name_entry_size) * sizeof(pcre_uchar);
-
-/* Get the memory. */
-
-re = (REAL_PCRE *)(PUBL(malloc))(size);
-if (re == NULL)
-  {
-  errorcode = ERR21;
-  goto PCRE_EARLY_ERROR_RETURN;
-  }
-
-/* Put in the magic number, and save the sizes, initial options, internal
-flags, 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 = (int)size;
-re->options = cd->external_options;
-re->flags = cd->external_flags;
-re->limit_match = limit_match;
-re->limit_recursion = limit_recursion;
-re->first_char = 0;
-re->req_char = 0;
-re->name_table_offset = sizeof(REAL_PCRE) / sizeof(pcre_uchar);
-re->name_entry_size = cd->name_entry_size;
-re->name_count = cd->names_found;
-re->ref_count = 0;
-re->tables = (tables == PRIV(default_tables))? NULL : tables;
-re->nullpad = NULL;
-#ifdef COMPILE_PCRE32
-re->dummy = 0;
-#else
-re->dummy1 = re->dummy2 = re->dummy3 = 0;
-#endif
-
-/* The starting points of the name/number translation table and of the code are
-passed around in the compile data block. The start/end pattern and initial
-options are already set from the pre-compile phase, as is the name_entry_size
-field. Reset the bracket count and the names_found field. Also reset the hwm
-field; this time it's used for remembering forward references to subpatterns.
-*/
-
-cd->final_bracount = cd->bracount;  /* Save for checking forward references */
-cd->parens_depth = 0;
-cd->assert_depth = 0;
-cd->bracount = 0;
-cd->max_lookbehind = 0;
-cd->name_table = (pcre_uchar *)re + re->name_table_offset;
-codestart = cd->name_table + re->name_entry_size * re->name_count;
-cd->start_code = codestart;
-cd->hwm = (pcre_uchar *)(cd->start_workspace);
-cd->iscondassert = FALSE;
-cd->req_varyopt = 0;
-cd->had_accept = FALSE;
-cd->had_pruneorskip = FALSE;
-cd->check_lookbehind = FALSE;
-cd->open_caps = NULL;
-
-/* If any named groups were found, create the name/number table from the list
-created in the first pass. */
-
-if (cd->names_found > 0)
-  {
-  int i = cd->names_found;
-  named_group *ng = cd->named_groups;
-  cd->names_found = 0;
-  for (; i > 0; i--, ng++)
-    add_name(cd, ng->name, ng->length, ng->number);
-  if (cd->named_group_list_size > NAMED_GROUP_LIST_SIZE)
-    (PUBL(free))((void *)cd->named_groups);
-  }
-
-/* 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 pcre_uchar *)pattern + skipatstart;
-code = (pcre_uchar *)codestart;
-*code = OP_BRA;
-(void)compile_regex(re->options, &code, &ptr, &errorcode, FALSE, FALSE, 0, 0,
-  &firstchar, &firstcharflags, &reqchar, &reqcharflags, NULL, cd, NULL);
-re->top_bracket = cd->bracount;
-re->top_backref = cd->top_backref;
-re->max_lookbehind = cd->max_lookbehind;
-re->flags = cd->external_flags | PCRE_MODE;
-
-if (cd->had_accept)
-  {
-  reqchar = 0;              /* Must disable after (*ACCEPT) */
-  reqcharflags = REQ_NONE;
-  }
-
-/* If not reached end of pattern on success, there's an excess bracket. */
-
-if (errorcode == 0 && *ptr != CHAR_NULL) 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 PCRE_DEBUG
-if (code - codestart > length) errorcode = ERR23;
-#endif
-
-#ifdef SUPPORT_VALGRIND
-/* If the estimated length exceeds the really used length, mark the extra
-allocated memory as unaddressable, so that any out-of-bound reads can be
-detected. */
-VALGRIND_MAKE_MEM_NOACCESS(code, (length - (code - codestart)) * sizeof(pcre_uchar));
-#endif
-
-/* Fill in any forward references that are required. There may be repeated
-references; optimize for them, as searching a large regex takes time. */
-
-if (cd->hwm > cd->start_workspace)
-  {
-  int prev_recno = -1;
-  const pcre_uchar *groupptr = NULL;
-  while (errorcode == 0 && cd->hwm > cd->start_workspace)
-    {
-    int offset, recno;
-    cd->hwm -= LINK_SIZE;
-    offset = GET(cd->hwm, 0);
-
-    /* Check that the hwm handling hasn't gone wrong. This whole area is
-    rewritten in PCRE2 because there are some obscure cases. */
-
-    if (offset == 0 || codestart[offset-1] != OP_RECURSE)
-      {
-      errorcode = ERR10;
-      break;
-      }
-
-    recno = GET(codestart, offset);
-    if (recno != prev_recno)
-      {
-      groupptr = PRIV(find_bracket)(codestart, utf, recno);
-      prev_recno = recno;
-      }
-    if (groupptr == NULL) errorcode = ERR53;
-      else PUT(((pcre_uchar *)codestart), offset, (int)(groupptr - codestart));
-    }
-  }
-
-/* If the workspace had to be expanded, free the new memory. Set the pointer to
-NULL to indicate that forward references have been filled in. */
-
-if (cd->workspace_size > COMPILE_WORK_SIZE)
-  (PUBL(free))((void *)cd->start_workspace);
-cd->start_workspace = NULL;
-
-/* Give an error if there's back reference to a non-existent capturing
-subpattern. */
-
-if (errorcode == 0 && re->top_backref > re->top_bracket) errorcode = ERR15;
-
-/* Unless disabled, check whether any single character iterators can be
-auto-possessified. The function overwrites the appropriate opcode values, so
-the type of the pointer must be cast. NOTE: the intermediate variable "temp" is
-used in this code because at least one compiler gives a warning about loss of
-"const" attribute if the cast (pcre_uchar *)codestart is used directly in the
-function call. */
-
-if (errorcode == 0 && (options & PCRE_NO_AUTO_POSSESS) == 0)
-  {
-  pcre_uchar *temp = (pcre_uchar *)codestart;
-  auto_possessify(temp, utf, cd);
-  }
-
-/* If there were any lookbehind assertions that contained OP_RECURSE
-(recursions or subroutine calls), a flag is set for them to be checked here,
-because they may contain forward references. Actual recursions cannot be fixed
-length, but subroutine calls can. It is done like this so that those without
-OP_RECURSE that are not fixed length get a diagnosic with a useful offset. The
-exceptional ones forgo this. We scan the pattern to check that they are fixed
-length, and set their lengths. */
-
-if (errorcode == 0 && cd->check_lookbehind)
-  {
-  pcre_uchar *cc = (pcre_uchar *)codestart;
-
-  /* Loop, searching for OP_REVERSE items, and process those that do not have
-  their length set. (Actually, it will also re-process any that have a length
-  of zero, but that is a pathological case, and it does no harm.) When we find
-  one, we temporarily terminate the branch it is in while we scan it. */
-
-  for (cc = (pcre_uchar *)PRIV(find_bracket)(codestart, utf, -1);
-       cc != NULL;
-       cc = (pcre_uchar *)PRIV(find_bracket)(cc, utf, -1))
-    {
-    if (GET(cc, 1) == 0)
-      {
-      int fixed_length;
-      pcre_uchar *be = cc - 1 - LINK_SIZE + GET(cc, -LINK_SIZE);
-      int end_op = *be;
-      *be = OP_END;
-      fixed_length = find_fixedlength(cc, (re->options & PCRE_UTF8) != 0, TRUE,
-        cd, NULL);
-      *be = end_op;
-      DPRINTF(("fixed length = %d\n", fixed_length));
-      if (fixed_length < 0)
-        {
-        errorcode = (fixed_length == -2)? ERR36 :
-                    (fixed_length == -4)? ERR70 : ERR25;
-        break;
-        }
-      if (fixed_length > cd->max_lookbehind) cd->max_lookbehind = fixed_length;
-      PUT(cc, 1, fixed_length);
-      }
-    cc += 1 + LINK_SIZE;
-    }
-  }
-
-/* Failed to compile, or error while post-processing */
-
-if (errorcode != 0)
-  {
-  (PUBL(free))(re);
-  PCRE_EARLY_ERROR_RETURN:
-  *erroroffset = (int)(ptr - (const pcre_uchar *)pattern);
-  PCRE_EARLY_ERROR_RETURN2:
-  *errorptr = find_error_text(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 non-atomic .* when DOTALL is set and there are no occurrences
-of *PRUNE or *SKIP.
-
-Otherwise, if we know what the first byte 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 non-atomic .* for
-non-DOTALL matches when *PRUNE and SKIP are not present. */
-
-if ((re->options & PCRE_ANCHORED) == 0)
-  {
-  if (is_anchored(codestart, 0, cd, 0)) re->options |= PCRE_ANCHORED;
-  else
-    {
-    if (firstcharflags < 0)
-      firstchar = find_firstassertedchar(codestart, &firstcharflags, FALSE);
-    if (firstcharflags >= 0)   /* Remove caseless flag for non-caseable chars */
-      {
-#if defined COMPILE_PCRE8
-      re->first_char = firstchar & 0xff;
-#elif defined COMPILE_PCRE16
-      re->first_char = firstchar & 0xffff;
-#elif defined COMPILE_PCRE32
-      re->first_char = firstchar;
-#endif
-      if ((firstcharflags & REQ_CASELESS) != 0)
-        {
-#if defined SUPPORT_UCP && !(defined COMPILE_PCRE8)
-        /* We ignore non-ASCII first chars in 8 bit mode. */
-        if (utf)
-          {
-          if (re->first_char < 128)
-            {
-            if (cd->fcc[re->first_char] != re->first_char)
-              re->flags |= PCRE_FCH_CASELESS;
-            }
-          else if (UCD_OTHERCASE(re->first_char) != re->first_char)
-            re->flags |= PCRE_FCH_CASELESS;
-          }
-        else
-#endif
-        if (MAX_255(re->first_char)
-            && cd->fcc[re->first_char] != re->first_char)
-          re->flags |= PCRE_FCH_CASELESS;
-        }
-
-      re->flags |= PCRE_FIRSTSET;
-      }
-
-    else if (is_startline(codestart, 0, cd, 0)) re->flags |= 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 (reqcharflags >= 0 &&
-     ((re->options & PCRE_ANCHORED) == 0 || (reqcharflags & REQ_VARY) != 0))
-  {
-#if defined COMPILE_PCRE8
-  re->req_char = reqchar & 0xff;
-#elif defined COMPILE_PCRE16
-  re->req_char = reqchar & 0xffff;
-#elif defined COMPILE_PCRE32
-  re->req_char = reqchar;
-#endif
-  if ((reqcharflags & REQ_CASELESS) != 0)
-    {
-#if defined SUPPORT_UCP && !(defined COMPILE_PCRE8)
-    /* We ignore non-ASCII first chars in 8 bit mode. */
-    if (utf)
-      {
-      if (re->req_char < 128)
-        {
-        if (cd->fcc[re->req_char] != re->req_char)
-          re->flags |= PCRE_RCH_CASELESS;
-        }
-      else if (UCD_OTHERCASE(re->req_char) != re->req_char)
-        re->flags |= PCRE_RCH_CASELESS;
-      }
-    else
-#endif
-    if (MAX_255(re->req_char) && cd->fcc[re->req_char] != re->req_char)
-      re->flags |= PCRE_RCH_CASELESS;
-    }
-
-  re->flags |= PCRE_REQCHSET;
-  }
-
-/* Print out the compiled data if debugging is enabled. This is never the
-case when building a production library. */
-
-#ifdef PCRE_DEBUG
-printf("Length = %d top_bracket = %d top_backref = %d\n",
-  length, re->top_bracket, re->top_backref);
-
-printf("Options=%08x\n", re->options);
-
-if ((re->flags & PCRE_FIRSTSET) != 0)
-  {
-  pcre_uchar ch = re->first_char;
-  const char *caseless =
-    ((re->flags & PCRE_FCH_CASELESS) == 0)? "" : " (caseless)";
-  if (PRINTABLE(ch)) printf("First char = %c%s\n", ch, caseless);
-    else printf("First char = \\x%02x%s\n", ch, caseless);
-  }
-
-if ((re->flags & PCRE_REQCHSET) != 0)
-  {
-  pcre_uchar ch = re->req_char;
-  const char *caseless =
-    ((re->flags & PCRE_RCH_CASELESS) == 0)? "" : " (caseless)";
-  if (PRINTABLE(ch)) printf("Req char = %c%s\n", ch, caseless);
-    else printf("Req char = \\x%02x%s\n", ch, caseless);
-  }
-
-#if defined COMPILE_PCRE8
-pcre_printint((pcre *)re, stdout, TRUE);
-#elif defined COMPILE_PCRE16
-pcre16_printint((pcre *)re, stdout, TRUE);
-#elif defined COMPILE_PCRE32
-pcre32_printint((pcre *)re, stdout, TRUE);
-#endif
-
-/* This check is done here in the debugging case so that the code that
-was compiled can be seen. */
-
-if (code - codestart > length)
-  {
-  (PUBL(free))(re);
-  *errorptr = find_error_text(ERR23);
-  *erroroffset = ptr - (pcre_uchar *)pattern;
-  if (errorcodeptr != NULL) *errorcodeptr = ERR23;
-  return NULL;
-  }
-#endif   /* PCRE_DEBUG */
-
-/* Check for a pattern than can match an empty string, so that this information
-can be provided to applications. */
-
-do
-  {
-  if (could_be_empty_branch(codestart, code, utf, cd, NULL))
-    {
-    re->flags |= PCRE_MATCH_EMPTY;
-    break;
-    }
-  codestart += GET(codestart, 1);
-  }
-while (*codestart == OP_ALT);
-
-#if defined COMPILE_PCRE8
-return (pcre *)re;
-#elif defined COMPILE_PCRE16
-return (pcre16 *)re;
-#elif defined COMPILE_PCRE32
-return (pcre32 *)re;
-#endif
-}
-
-/* End of pcre_compile.c */
diff --git a/dist/pcre_config.c b/dist/pcre_config.c
deleted file mode 100644
index 1cbdd9c..0000000
--- a/dist/pcre_config.c
+++ /dev/null
@@ -1,190 +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
-           Copyright (c) 1997-2012 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(). */
-
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-/* Keep the original link size. */
-static int real_link_size = LINK_SIZE;
-
-#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
-*/
-
-#if defined COMPILE_PCRE8
-PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
-pcre_config(int what, void *where)
-#elif defined COMPILE_PCRE16
-PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
-pcre16_config(int what, void *where)
-#elif defined COMPILE_PCRE32
-PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
-pcre32_config(int what, void *where)
-#endif
-{
-switch (what)
-  {
-  case PCRE_CONFIG_UTF8:
-#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32
-  *((int *)where) = 0;
-  return PCRE_ERROR_BADOPTION;
-#else
-#if defined SUPPORT_UTF
-  *((int *)where) = 1;
-#else
-  *((int *)where) = 0;
-#endif
-  break;
-#endif
-
-  case PCRE_CONFIG_UTF16:
-#if defined COMPILE_PCRE8 || defined COMPILE_PCRE32
-  *((int *)where) = 0;
-  return PCRE_ERROR_BADOPTION;
-#else
-#if defined SUPPORT_UTF
-  *((int *)where) = 1;
-#else
-  *((int *)where) = 0;
-#endif
-  break;
-#endif
-
-  case PCRE_CONFIG_UTF32:
-#if defined COMPILE_PCRE8 || defined COMPILE_PCRE16
-  *((int *)where) = 0;
-  return PCRE_ERROR_BADOPTION;
-#else
-#if defined SUPPORT_UTF
-  *((int *)where) = 1;
-#else
-  *((int *)where) = 0;
-#endif
-  break;
-#endif
-
-  case PCRE_CONFIG_UNICODE_PROPERTIES:
-#ifdef SUPPORT_UCP
-  *((int *)where) = 1;
-#else
-  *((int *)where) = 0;
-#endif
-  break;
-
-  case PCRE_CONFIG_JIT:
-#ifdef SUPPORT_JIT
-  *((int *)where) = 1;
-#else
-  *((int *)where) = 0;
-#endif
-  break;
-
-  case PCRE_CONFIG_JITTARGET:
-#ifdef SUPPORT_JIT
-  *((const char **)where) = PRIV(jit_get_target)();
-#else
-  *((const char **)where) = NULL;
-#endif
-  break;
-
-  case PCRE_CONFIG_NEWLINE:
-  *((int *)where) = NEWLINE;
-  break;
-
-  case PCRE_CONFIG_BSR:
-#ifdef BSR_ANYCRLF
-  *((int *)where) = 1;
-#else
-  *((int *)where) = 0;
-#endif
-  break;
-
-  case PCRE_CONFIG_LINK_SIZE:
-  *((int *)where) = real_link_size;
-  break;
-
-  case PCRE_CONFIG_POSIX_MALLOC_THRESHOLD:
-  *((int *)where) = POSIX_MALLOC_THRESHOLD;
-  break;
-
-  case PCRE_CONFIG_PARENS_LIMIT:
-  *((unsigned long int *)where) = PARENS_NEST_LIMIT;
-  break;
-
-  case PCRE_CONFIG_MATCH_LIMIT:
-  *((unsigned long int *)where) = MATCH_LIMIT;
-  break;
-
-  case PCRE_CONFIG_MATCH_LIMIT_RECURSION:
-  *((unsigned long int *)where) = MATCH_LIMIT_RECURSION;
-  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 --git a/dist/pcre_fullinfo.c b/dist/pcre_fullinfo.c
deleted file mode 100644
index a6c2ece..0000000
--- a/dist/pcre_fullinfo.c
+++ /dev/null
@@ -1,245 +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
-           Copyright (c) 1997-2013 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. */
-
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#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
-*/
-
-#if defined COMPILE_PCRE8
-PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
-pcre_fullinfo(const pcre *argument_re, const pcre_extra *extra_data,
-  int what, void *where)
-#elif defined COMPILE_PCRE16
-PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
-pcre16_fullinfo(const pcre16 *argument_re, const pcre16_extra *extra_data,
-  int what, void *where)
-#elif defined COMPILE_PCRE32
-PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
-pcre32_fullinfo(const pcre32 *argument_re, const pcre32_extra *extra_data,
-  int what, void *where)
-#endif
-{
-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;
-
-/* Check that the first field in the block is the magic number. If it is not,
-return with PCRE_ERROR_BADMAGIC. However, if the magic number is equal to
-REVERSED_MAGIC_NUMBER we return with PCRE_ERROR_BADENDIANNESS, which
-means that the pattern is likely compiled with different endianness. */
-
-if (re->magic_number != MAGIC_NUMBER)
-  return re->magic_number == REVERSED_MAGIC_NUMBER?
-    PCRE_ERROR_BADENDIANNESS:PCRE_ERROR_BADMAGIC;
-
-/* Check that this pattern was compiled in the correct bit mode */
-
-if ((re->flags & PCRE_MODE) == 0) return PCRE_ERROR_BADMODE;
-
-switch (what)
-  {
-  case PCRE_INFO_OPTIONS:
-  *((unsigned long int *)where) = re->options & PUBLIC_COMPILE_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_JITSIZE:
-#ifdef SUPPORT_JIT
-  *((size_t *)where) =
-      (extra_data != NULL &&
-      (extra_data->flags & PCRE_EXTRA_EXECUTABLE_JIT) != 0 &&
-      extra_data->executable_jit != NULL)?
-    PRIV(jit_get_size)(extra_data->executable_jit) : 0;
-#else
-  *((size_t *)where) = 0;
-#endif
-  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->flags & PCRE_FIRSTSET) != 0)? (int)re->first_char :
-    ((re->flags & PCRE_STARTLINE) != 0)? -1 : -2;
-  break;
-
-  case PCRE_INFO_FIRSTCHARACTER:
-    *((pcre_uint32 *)where) =
-      (re->flags & PCRE_FIRSTSET) != 0 ? re->first_char : 0;
-    break;
-
-  case PCRE_INFO_FIRSTCHARACTERFLAGS:
-    *((int *)where) =
-      ((re->flags & PCRE_FIRSTSET) != 0) ? 1 :
-      ((re->flags & PCRE_STARTLINE) != 0) ? 2 : 0;
-    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 pcre_uint8 **)where) =
-    (study != NULL && (study->flags & PCRE_STUDY_MAPPED) != 0)?
-      ((const pcre_study_data *)extra_data->study_data)->start_bits : NULL;
-  break;
-
-  case PCRE_INFO_MINLENGTH:
-  *((int *)where) =
-    (study != NULL && (study->flags & PCRE_STUDY_MINLEN) != 0)?
-      (int)(study->minlength) : -1;
-  break;
-
-  case PCRE_INFO_JIT:
-  *((int *)where) = extra_data != NULL &&
-                    (extra_data->flags & PCRE_EXTRA_EXECUTABLE_JIT) != 0 &&
-                    extra_data->executable_jit != NULL;
-  break;
-
-  case PCRE_INFO_LASTLITERAL:
-  *((int *)where) =
-    ((re->flags & PCRE_REQCHSET) != 0)? (int)re->req_char : -1;
-  break;
-
-  case PCRE_INFO_REQUIREDCHAR:
-    *((pcre_uint32 *)where) =
-      ((re->flags & PCRE_REQCHSET) != 0) ? re->req_char : 0;
-    break;
-
-  case PCRE_INFO_REQUIREDCHARFLAGS:
-    *((int *)where) =
-      ((re->flags & PCRE_REQCHSET) != 0);
-    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 pcre_uchar **)where) = (const pcre_uchar *)re + re->name_table_offset;
-  break;
-
-  case PCRE_INFO_DEFAULT_TABLES:
-  *((const pcre_uint8 **)where) = (const pcre_uint8 *)(PRIV(default_tables));
-  break;
-
-  /* From release 8.00 this will always return TRUE because NOPARTIAL is
-  no longer ever set (the restrictions have been removed). */
-
-  case PCRE_INFO_OKPARTIAL:
-  *((int *)where) = (re->flags & PCRE_NOPARTIAL) == 0;
-  break;
-
-  case PCRE_INFO_JCHANGED:
-  *((int *)where) = (re->flags & PCRE_JCHANGED) != 0;
-  break;
-
-  case PCRE_INFO_HASCRORLF:
-  *((int *)where) = (re->flags & PCRE_HASCRORLF) != 0;
-  break;
-
-  case PCRE_INFO_MAXLOOKBEHIND:
-  *((int *)where) = re->max_lookbehind;
-  break;
-
-  case PCRE_INFO_MATCHLIMIT:
-  if ((re->flags & PCRE_MLSET) == 0) return PCRE_ERROR_UNSET;
-  *((pcre_uint32 *)where) = re->limit_match;
-  break;
-
-  case PCRE_INFO_RECURSIONLIMIT:
-  if ((re->flags & PCRE_RLSET) == 0) return PCRE_ERROR_UNSET;
-  *((pcre_uint32 *)where) = re->limit_recursion;
-  break;
-
-  case PCRE_INFO_MATCH_EMPTY:
-  *((int *)where) = (re->flags & PCRE_MATCH_EMPTY) != 0;
-  break;
-
-  default: return PCRE_ERROR_BADOPTION;
-  }
-
-return 0;
-}
-
-/* End of pcre_fullinfo.c */
diff --git a/dist/pcre_get.c b/dist/pcre_get.c
deleted file mode 100644
index 8094b34..0000000
--- a/dist/pcre_get.c
+++ /dev/null
@@ -1,662 +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
-           Copyright (c) 1997-2012 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. */
-
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include "pcre_internal.h"
-
-
-/*************************************************
-*           Find number for named string         *
-*************************************************/
-
-/* This function is used by the get_first_set() function below, as well
-as being generally available. It assumes that names are unique.
-
-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
-*/
-
-#if defined COMPILE_PCRE8
-PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
-pcre_get_stringnumber(const pcre *code, const char *stringname)
-#elif defined COMPILE_PCRE16
-PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
-pcre16_get_stringnumber(const pcre16 *code, PCRE_SPTR16 stringname)
-#elif defined COMPILE_PCRE32
-PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
-pcre32_get_stringnumber(const pcre32 *code, PCRE_SPTR32 stringname)
-#endif
-{
-int rc;
-int entrysize;
-int top, bot;
-pcre_uchar *nametable;
-
-#ifdef COMPILE_PCRE8
-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;
-#endif
-#ifdef COMPILE_PCRE16
-if ((rc = pcre16_fullinfo(code, NULL, PCRE_INFO_NAMECOUNT, &top)) != 0)
-  return rc;
-if (top <= 0) return PCRE_ERROR_NOSUBSTRING;
-
-if ((rc = pcre16_fullinfo(code, NULL, PCRE_INFO_NAMEENTRYSIZE, &entrysize)) != 0)
-  return rc;
-if ((rc = pcre16_fullinfo(code, NULL, PCRE_INFO_NAMETABLE, &nametable)) != 0)
-  return rc;
-#endif
-#ifdef COMPILE_PCRE32
-if ((rc = pcre32_fullinfo(code, NULL, PCRE_INFO_NAMECOUNT, &top)) != 0)
-  return rc;
-if (top <= 0) return PCRE_ERROR_NOSUBSTRING;
-
-if ((rc = pcre32_fullinfo(code, NULL, PCRE_INFO_NAMEENTRYSIZE, &entrysize)) != 0)
-  return rc;
-if ((rc = pcre32_fullinfo(code, NULL, PCRE_INFO_NAMETABLE, &nametable)) != 0)
-  return rc;
-#endif
-
-bot = 0;
-while (top > bot)
-  {
-  int mid = (top + bot) / 2;
-  pcre_uchar *entry = nametable + entrysize*mid;
-  int c = STRCMP_UC_UC((pcre_uchar *)stringname,
-    (pcre_uchar *)(entry + IMM2_SIZE));
-  if (c == 0) return GET2(entry, 0);
-  if (c > 0) bot = mid + 1; else top = mid;
-  }
-
-return PCRE_ERROR_NOSUBSTRING;
-}
-
-
-
-/*************************************************
-*     Find (multiple) entries for named string   *
-*************************************************/
-
-/* This is used by the get_first_set() function below, as well as being
-generally available. It is used when duplicated names are permitted.
-
-Arguments:
-  code        the compiled regex
-  stringname  the name whose entries required
-  firstptr    where to put the pointer to the first entry
-  lastptr     where to put the pointer to the last entry
-
-Returns:      the length of each entry, or a negative number
-                (PCRE_ERROR_NOSUBSTRING) if not found
-*/
-
-#if defined COMPILE_PCRE8
-PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
-pcre_get_stringtable_entries(const pcre *code, const char *stringname,
-  char **firstptr, char **lastptr)
-#elif defined COMPILE_PCRE16
-PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
-pcre16_get_stringtable_entries(const pcre16 *code, PCRE_SPTR16 stringname,
-  PCRE_UCHAR16 **firstptr, PCRE_UCHAR16 **lastptr)
-#elif defined COMPILE_PCRE32
-PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
-pcre32_get_stringtable_entries(const pcre32 *code, PCRE_SPTR32 stringname,
-  PCRE_UCHAR32 **firstptr, PCRE_UCHAR32 **lastptr)
-#endif
-{
-int rc;
-int entrysize;
-int top, bot;
-pcre_uchar *nametable, *lastentry;
-
-#ifdef COMPILE_PCRE8
-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;
-#endif
-#ifdef COMPILE_PCRE16
-if ((rc = pcre16_fullinfo(code, NULL, PCRE_INFO_NAMECOUNT, &top)) != 0)
-  return rc;
-if (top <= 0) return PCRE_ERROR_NOSUBSTRING;
-
-if ((rc = pcre16_fullinfo(code, NULL, PCRE_INFO_NAMEENTRYSIZE, &entrysize)) != 0)
-  return rc;
-if ((rc = pcre16_fullinfo(code, NULL, PCRE_INFO_NAMETABLE, &nametable)) != 0)
-  return rc;
-#endif
-#ifdef COMPILE_PCRE32
-if ((rc = pcre32_fullinfo(code, NULL, PCRE_INFO_NAMECOUNT, &top)) != 0)
-  return rc;
-if (top <= 0) return PCRE_ERROR_NOSUBSTRING;
-
-if ((rc = pcre32_fullinfo(code, NULL, PCRE_INFO_NAMEENTRYSIZE, &entrysize)) != 0)
-  return rc;
-if ((rc = pcre32_fullinfo(code, NULL, PCRE_INFO_NAMETABLE, &nametable)) != 0)
-  return rc;
-#endif
-
-lastentry = nametable + entrysize * (top - 1);
-bot = 0;
-while (top > bot)
-  {
-  int mid = (top + bot) / 2;
-  pcre_uchar *entry = nametable + entrysize*mid;
-  int c = STRCMP_UC_UC((pcre_uchar *)stringname,
-    (pcre_uchar *)(entry + IMM2_SIZE));
-  if (c == 0)
-    {
-    pcre_uchar *first = entry;
-    pcre_uchar *last = entry;
-    while (first > nametable)
-      {
-      if (STRCMP_UC_UC((pcre_uchar *)stringname,
-        (pcre_uchar *)(first - entrysize + IMM2_SIZE)) != 0) break;
-      first -= entrysize;
-      }
-    while (last < lastentry)
-      {
-      if (STRCMP_UC_UC((pcre_uchar *)stringname,
-        (pcre_uchar *)(last + entrysize + IMM2_SIZE)) != 0) break;
-      last += entrysize;
-      }
-#if defined COMPILE_PCRE8
-    *firstptr = (char *)first;
-    *lastptr = (char *)last;
-#elif defined COMPILE_PCRE16
-    *firstptr = (PCRE_UCHAR16 *)first;
-    *lastptr = (PCRE_UCHAR16 *)last;
-#elif defined COMPILE_PCRE32
-    *firstptr = (PCRE_UCHAR32 *)first;
-    *lastptr = (PCRE_UCHAR32 *)last;
-#endif
-    return entrysize;
-    }
-  if (c > 0) bot = mid + 1; else top = mid;
-  }
-
-return PCRE_ERROR_NOSUBSTRING;
-}
-
-
-
-/*************************************************
-*    Find first set of multiple named strings    *
-*************************************************/
-
-/* This function allows for duplicate names in the table of named substrings.
-It returns the number of the first one that was set in a pattern match.
-
-Arguments:
-  code         the compiled regex
-  stringname   the name of the capturing substring
-  ovector      the vector of matched substrings
-
-Returns:       the number of the first that is set,
-               or the number of the last one if none are set,
-               or a negative number on error
-*/
-
-#if defined COMPILE_PCRE8
-static int
-get_first_set(const pcre *code, const char *stringname, int *ovector)
-#elif defined COMPILE_PCRE16
-static int
-get_first_set(const pcre16 *code, PCRE_SPTR16 stringname, int *ovector)
-#elif defined COMPILE_PCRE32
-static int
-get_first_set(const pcre32 *code, PCRE_SPTR32 stringname, int *ovector)
-#endif
-{
-const REAL_PCRE *re = (const REAL_PCRE *)code;
-int entrysize;
-pcre_uchar *entry;
-#if defined COMPILE_PCRE8
-char *first, *last;
-#elif defined COMPILE_PCRE16
-PCRE_UCHAR16 *first, *last;
-#elif defined COMPILE_PCRE32
-PCRE_UCHAR32 *first, *last;
-#endif
-
-#if defined COMPILE_PCRE8
-if ((re->options & PCRE_DUPNAMES) == 0 && (re->flags & PCRE_JCHANGED) == 0)
-  return pcre_get_stringnumber(code, stringname);
-entrysize = pcre_get_stringtable_entries(code, stringname, &first, &last);
-#elif defined COMPILE_PCRE16
-if ((re->options & PCRE_DUPNAMES) == 0 && (re->flags & PCRE_JCHANGED) == 0)
-  return pcre16_get_stringnumber(code, stringname);
-entrysize = pcre16_get_stringtable_entries(code, stringname, &first, &last);
-#elif defined COMPILE_PCRE32
-if ((re->options & PCRE_DUPNAMES) == 0 && (re->flags & PCRE_JCHANGED) == 0)
-  return pcre32_get_stringnumber(code, stringname);
-entrysize = pcre32_get_stringtable_entries(code, stringname, &first, &last);
-#endif
-if (entrysize <= 0) return entrysize;
-for (entry = (pcre_uchar *)first; entry <= (pcre_uchar *)last; entry += entrysize)
-  {
-  int n = GET2(entry, 0);
-  if (ovector[n*2] >= 0) return n;
-  }
-return GET2(entry, 0);
-}
-
-
-
-
-/*************************************************
-*      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
-*/
-
-#if defined COMPILE_PCRE8
-PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
-pcre_copy_substring(const char *subject, int *ovector, int stringcount,
-  int stringnumber, char *buffer, int size)
-#elif defined COMPILE_PCRE16
-PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
-pcre16_copy_substring(PCRE_SPTR16 subject, int *ovector, int stringcount,
-  int stringnumber, PCRE_UCHAR16 *buffer, int size)
-#elif defined COMPILE_PCRE32
-PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
-pcre32_copy_substring(PCRE_SPTR32 subject, int *ovector, int stringcount,
-  int stringnumber, PCRE_UCHAR32 *buffer, int size)
-#endif
-{
-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], IN_UCHARS(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. If the regex permits duplicate names, the first
-substring that is set is chosen.
-
-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
-*/
-
-#if defined COMPILE_PCRE8
-PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
-pcre_copy_named_substring(const pcre *code, const char *subject,
-  int *ovector, int stringcount, const char *stringname,
-  char *buffer, int size)
-#elif defined COMPILE_PCRE16
-PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
-pcre16_copy_named_substring(const pcre16 *code, PCRE_SPTR16 subject,
-  int *ovector, int stringcount, PCRE_SPTR16 stringname,
-  PCRE_UCHAR16 *buffer, int size)
-#elif defined COMPILE_PCRE32
-PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
-pcre32_copy_named_substring(const pcre32 *code, PCRE_SPTR32 subject,
-  int *ovector, int stringcount, PCRE_SPTR32 stringname,
-  PCRE_UCHAR32 *buffer, int size)
-#endif
-{
-int n = get_first_set(code, stringname, ovector);
-if (n <= 0) return n;
-#if defined COMPILE_PCRE8
-return pcre_copy_substring(subject, ovector, stringcount, n, buffer, size);
-#elif defined COMPILE_PCRE16
-return pcre16_copy_substring(subject, ovector, stringcount, n, buffer, size);
-#elif defined COMPILE_PCRE32
-return pcre32_copy_substring(subject, ovector, stringcount, n, buffer, size);
-#endif
-}
-
-
-
-/*************************************************
-*      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
-*/
-
-#if defined COMPILE_PCRE8
-PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
-pcre_get_substring_list(const char *subject, int *ovector, int stringcount,
-  const char ***listptr)
-#elif defined COMPILE_PCRE16
-PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
-pcre16_get_substring_list(PCRE_SPTR16 subject, int *ovector, int stringcount,
-  PCRE_SPTR16 **listptr)
-#elif defined COMPILE_PCRE32
-PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
-pcre32_get_substring_list(PCRE_SPTR32 subject, int *ovector, int stringcount,
-  PCRE_SPTR32 **listptr)
-#endif
-{
-int i;
-int size = sizeof(pcre_uchar *);
-int double_count = stringcount * 2;
-pcre_uchar **stringlist;
-pcre_uchar *p;
-
-for (i = 0; i < double_count; i += 2)
-  size += sizeof(pcre_uchar *) + IN_UCHARS(ovector[i+1] - ovector[i] + 1);
-
-stringlist = (pcre_uchar **)(PUBL(malloc))(size);
-if (stringlist == NULL) return PCRE_ERROR_NOMEMORY;
-
-#if defined COMPILE_PCRE8
-*listptr = (const char **)stringlist;
-#elif defined COMPILE_PCRE16
-*listptr = (PCRE_SPTR16 *)stringlist;
-#elif defined COMPILE_PCRE32
-*listptr = (PCRE_SPTR32 *)stringlist;
-#endif
-p = (pcre_uchar *)(stringlist + stringcount + 1);
-
-for (i = 0; i < double_count; i += 2)
-  {
-  int len = ovector[i+1] - ovector[i];
-  memcpy(p, subject + ovector[i], IN_UCHARS(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 (PUBL(free))()
-directly.
-
-Argument:   the result of a previous pcre_get_substring_list()
-Returns:    nothing
-*/
-
-#if defined COMPILE_PCRE8
-PCRE_EXP_DEFN void PCRE_CALL_CONVENTION
-pcre_free_substring_list(const char **pointer)
-#elif defined COMPILE_PCRE16
-PCRE_EXP_DEFN void PCRE_CALL_CONVENTION
-pcre16_free_substring_list(PCRE_SPTR16 *pointer)
-#elif defined COMPILE_PCRE32
-PCRE_EXP_DEFN void PCRE_CALL_CONVENTION
-pcre32_free_substring_list(PCRE_SPTR32 *pointer)
-#endif
-{
-(PUBL(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
-*/
-
-#if defined COMPILE_PCRE8
-PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
-pcre_get_substring(const char *subject, int *ovector, int stringcount,
-  int stringnumber, const char **stringptr)
-#elif defined COMPILE_PCRE16
-PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
-pcre16_get_substring(PCRE_SPTR16 subject, int *ovector, int stringcount,
-  int stringnumber, PCRE_SPTR16 *stringptr)
-#elif defined COMPILE_PCRE32
-PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
-pcre32_get_substring(PCRE_SPTR32 subject, int *ovector, int stringcount,
-  int stringnumber, PCRE_SPTR32 *stringptr)
-#endif
-{
-int yield;
-pcre_uchar *substring;
-if (stringnumber < 0 || stringnumber >= stringcount)
-  return PCRE_ERROR_NOSUBSTRING;
-stringnumber *= 2;
-yield = ovector[stringnumber+1] - ovector[stringnumber];
-substring = (pcre_uchar *)(PUBL(malloc))(IN_UCHARS(yield + 1));
-if (substring == NULL) return PCRE_ERROR_NOMEMORY;
-memcpy(substring, subject + ovector[stringnumber], IN_UCHARS(yield));
-substring[yield] = 0;
-#if defined COMPILE_PCRE8
-*stringptr = (const char *)substring;
-#elif defined COMPILE_PCRE16
-*stringptr = (PCRE_SPTR16)substring;
-#elif defined COMPILE_PCRE32
-*stringptr = (PCRE_SPTR32)substring;
-#endif
-return yield;
-}
-
-
-
-/*************************************************
-*   Copy named captured string to new store      *
-*************************************************/
-
-/* This function copies a single captured substring, identified by name, into
-new store. If the regex permits duplicate names, the first substring that is
-set is chosen.
-
-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
-*/
-
-#if defined COMPILE_PCRE8
-PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
-pcre_get_named_substring(const pcre *code, const char *subject,
-  int *ovector, int stringcount, const char *stringname,
-  const char **stringptr)
-#elif defined COMPILE_PCRE16
-PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
-pcre16_get_named_substring(const pcre16 *code, PCRE_SPTR16 subject,
-  int *ovector, int stringcount, PCRE_SPTR16 stringname,
-  PCRE_SPTR16 *stringptr)
-#elif defined COMPILE_PCRE32
-PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
-pcre32_get_named_substring(const pcre32 *code, PCRE_SPTR32 subject,
-  int *ovector, int stringcount, PCRE_SPTR32 stringname,
-  PCRE_SPTR32 *stringptr)
-#endif
-{
-int n = get_first_set(code, stringname, ovector);
-if (n <= 0) return n;
-#if defined COMPILE_PCRE8
-return pcre_get_substring(subject, ovector, stringcount, n, stringptr);
-#elif defined COMPILE_PCRE16
-return pcre16_get_substring(subject, ovector, stringcount, n, stringptr);
-#elif defined COMPILE_PCRE32
-return pcre32_get_substring(subject, ovector, stringcount, n, stringptr);
-#endif
-}
-
-
-
-
-/*************************************************
-*       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 (PUBL(free))()
-directly.
-
-Argument:   the result of a previous pcre_get_substring()
-Returns:    nothing
-*/
-
-#if defined COMPILE_PCRE8
-PCRE_EXP_DEFN void PCRE_CALL_CONVENTION
-pcre_free_substring(const char *pointer)
-#elif defined COMPILE_PCRE16
-PCRE_EXP_DEFN void PCRE_CALL_CONVENTION
-pcre16_free_substring(PCRE_SPTR16 pointer)
-#elif defined COMPILE_PCRE32
-PCRE_EXP_DEFN void PCRE_CALL_CONVENTION
-pcre32_free_substring(PCRE_SPTR32 pointer)
-#endif
-{
-(PUBL(free))((void *)pointer);
-}
-
-/* End of pcre_get.c */
diff --git a/dist/pcre_globals.c b/dist/pcre_globals.c
deleted file mode 100644
index 0f106aa..0000000
--- a/dist/pcre_globals.c
+++ /dev/null
@@ -1,86 +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
-           Copyright (c) 1997-2014 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.
-
-For MS Visual Studio and Symbian OS, there are problems in initializing these
-variables to non-local functions. In these cases, therefore, an indirection via
-a local function is used.
-
-Also, when compiling for Virtual Pascal, things are done differently, and
-global variables are not used. */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include "pcre_internal.h"
-
-#if defined _MSC_VER || defined  __SYMBIAN32__
-static void* LocalPcreMalloc(size_t aSize)
-  {
-  return malloc(aSize);
-  }
-static void LocalPcreFree(void* aPtr)
-  {
-  free(aPtr);
-  }
-PCRE_EXP_DATA_DEFN void *(*PUBL(malloc))(size_t) = LocalPcreMalloc;
-PCRE_EXP_DATA_DEFN void  (*PUBL(free))(void *) = LocalPcreFree;
-PCRE_EXP_DATA_DEFN void *(*PUBL(stack_malloc))(size_t) = LocalPcreMalloc;
-PCRE_EXP_DATA_DEFN void  (*PUBL(stack_free))(void *) = LocalPcreFree;
-PCRE_EXP_DATA_DEFN int   (*PUBL(callout))(PUBL(callout_block) *) = NULL;
-PCRE_EXP_DATA_DEFN int   (*PUBL(stack_guard))(void) = NULL;
-
-#elif !defined VPCOMPAT
-PCRE_EXP_DATA_DEFN void *(*PUBL(malloc))(size_t) = malloc;
-PCRE_EXP_DATA_DEFN void  (*PUBL(free))(void *) = free;
-PCRE_EXP_DATA_DEFN void *(*PUBL(stack_malloc))(size_t) = malloc;
-PCRE_EXP_DATA_DEFN void  (*PUBL(stack_free))(void *) = free;
-PCRE_EXP_DATA_DEFN int   (*PUBL(callout))(PUBL(callout_block) *) = NULL;
-PCRE_EXP_DATA_DEFN int   (*PUBL(stack_guard))(void) = NULL;
-#endif
-
-/* End of pcre_globals.c */
diff --git a/dist/pcre_internal.h b/dist/pcre_internal.h
deleted file mode 100644
index f7a5ee7..0000000
--- a/dist/pcre_internal.h
+++ /dev/null
@@ -1,2798 +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
-           Copyright (c) 1997-2014 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_", "_pcre16_" or "_pcre32_"
-depending on the PRIV macro. */
-
-#ifndef PCRE_INTERNAL_H
-#define PCRE_INTERNAL_H
-
-/* Define PCRE_DEBUG to get debugging output on stdout. */
-
-#if 0
-#define PCRE_DEBUG
-#endif
-
-/* PCRE is compiled as an 8 bit library if it is not requested otherwise. */
-
-#if !defined COMPILE_PCRE16 && !defined COMPILE_PCRE32
-#define COMPILE_PCRE8
-#endif
-
-/* If SUPPORT_UCP is defined, SUPPORT_UTF must also be defined. The
-"configure" script ensures this, but not everybody uses "configure". */
-
-#if defined SUPPORT_UCP && !(defined SUPPORT_UTF)
-#define SUPPORT_UTF 1
-#endif
-
-/* We define SUPPORT_UTF if SUPPORT_UTF8 is enabled for compatibility
-reasons with existing code. */
-
-#if defined SUPPORT_UTF8 && !(defined SUPPORT_UTF)
-#define SUPPORT_UTF 1
-#endif
-
-/* Fixme: SUPPORT_UTF8 should be eventually disappear from the code.
-Until then we define it if SUPPORT_UTF is defined. */
-
-#if defined SUPPORT_UTF && !(defined SUPPORT_UTF8)
-#define SUPPORT_UTF8 1
-#endif
-
-/* We do not support both EBCDIC and UTF-8/16/32 at the same time. The "configure"
-script prevents both being selected, but not everybody uses "configure". */
-
-#if defined EBCDIC && defined SUPPORT_UTF
-#error The use of both EBCDIC and SUPPORT_UTF is not supported.
-#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...
-
-It turns out that the Mac Debugging.h header also defines the macro DPRINTF, so
-be absolutely sure we get our version. */
-
-#undef DPRINTF
-#ifdef PCRE_DEBUG
-#define DPRINTF(p) printf p
-#else
-#define DPRINTF(p) /* Nothing */
-#endif
-
-
-/* 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 <stddef.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-/* Valgrind (memcheck) support */
-
-#ifdef SUPPORT_VALGRIND
-#include <valgrind/memcheck.h>
-#endif
-
-/* When compiling a DLL for Windows, the exported symbols have to be declared
-using some MS magic. I found some useful information on this web page:
-http://msdn2.microsoft.com/en-us/library/y4h7bcy6(VS.80).aspx. According to the
-information there, using __declspec(dllexport) without "extern" we have a
-definition; with "extern" we have a declaration. The settings here override the
-setting in pcre.h (which is included below); it defines only PCRE_EXP_DECL,
-which is all that is needed for applications (they just import the symbols). We
-use:
-
-  PCRE_EXP_DECL       for declarations
-  PCRE_EXP_DEFN       for definitions of exported functions
-  PCRE_EXP_DATA_DEFN  for definitions of exported variables
-
-The reason for the two DEFN macros is that in non-Windows environments, one
-does not want to have "extern" before variable definitions because it leads to
-compiler warnings. So we distinguish between functions and variables. In
-Windows, the two should always be the same.
-
-The reason for wrapping this in #ifndef PCRE_EXP_DECL is so that pcretest,
-which is an application, but needs to import this file in order to "peek" at
-internals, can #include pcre.h first to get an application's-eye view.
-
-In principle, people compiling for non-Windows, non-Unix-like (i.e. uncommon,
-special-purpose environments) might want to stick other stuff in front of
-exported symbols. That's why, in the non-Windows case, we set PCRE_EXP_DEFN and
-PCRE_EXP_DATA_DEFN only if they are not already set. */
-
-#ifndef PCRE_EXP_DECL
-#  ifdef _WIN32
-#    ifndef PCRE_STATIC
-#      define PCRE_EXP_DECL       extern __declspec(dllexport)
-#      define PCRE_EXP_DEFN       __declspec(dllexport)
-#      define PCRE_EXP_DATA_DEFN  __declspec(dllexport)
-#    else
-#      define PCRE_EXP_DECL       extern
-#      define PCRE_EXP_DEFN
-#      define PCRE_EXP_DATA_DEFN
-#    endif
-#  else
-#    ifdef __cplusplus
-#      define PCRE_EXP_DECL       extern "C"
-#    else
-#      define PCRE_EXP_DECL       extern
-#    endif
-#    ifndef PCRE_EXP_DEFN
-#      define PCRE_EXP_DEFN       PCRE_EXP_DECL
-#    endif
-#    ifndef PCRE_EXP_DATA_DEFN
-#      define PCRE_EXP_DATA_DEFN
-#    endif
-#  endif
-#endif
-
-/* When compiling with the MSVC compiler, it is sometimes necessary to include
-a "calling convention" before exported function names. (This is secondhand
-information; I know nothing about MSVC myself). For example, something like
-
-  void __cdecl function(....)
-
-might be needed. In order so make this easy, all the exported functions have
-PCRE_CALL_CONVENTION just before their names. It is rarely needed; if not
-set, we ensure here that it has no effect. */
-
-#ifndef PCRE_CALL_CONVENTION
-#define PCRE_CALL_CONVENTION
-#endif
-
-/* We need to have types that specify unsigned 8, 16 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. */
-
-typedef unsigned char pcre_uint8;
-
-#if USHRT_MAX == 65535
-typedef unsigned short pcre_uint16;
-typedef short pcre_int16;
-#define PCRE_UINT16_MAX USHRT_MAX
-#define PCRE_INT16_MAX SHRT_MAX
-#elif UINT_MAX == 65535
-typedef unsigned int pcre_uint16;
-typedef int pcre_int16;
-#define PCRE_UINT16_MAX UINT_MAX
-#define PCRE_INT16_MAX INT_MAX
-#else
-#error Cannot determine a type for 16-bit integers
-#endif
-
-#if UINT_MAX == 4294967295U
-typedef unsigned int pcre_uint32;
-typedef int pcre_int32;
-#define PCRE_UINT32_MAX UINT_MAX
-#define PCRE_INT32_MAX INT_MAX
-#elif ULONG_MAX == 4294967295UL
-typedef unsigned long int pcre_uint32;
-typedef long int pcre_int32;
-#define PCRE_UINT32_MAX ULONG_MAX
-#define PCRE_INT32_MAX LONG_MAX
-#else
-#error Cannot determine a type for 32-bit integers
-#endif
-
-/* When checking for integer overflow in pcre_compile(), we need to handle
-large integers. If a 64-bit integer type is available, we can use that.
-Otherwise we have to cast to double, which of course requires floating point
-arithmetic. Handle this by defining a macro for the appropriate type. If
-stdint.h is available, include it; it may define INT64_MAX. Systems that do not
-have stdint.h (e.g. Solaris) may have inttypes.h. The macro int64_t may be set
-by "configure". */
-
-#if defined HAVE_STDINT_H
-#include <stdint.h>
-#elif defined HAVE_INTTYPES_H
-#include <inttypes.h>
-#endif
-
-#if defined INT64_MAX || defined int64_t
-#define INT64_OR_DOUBLE int64_t
-#else
-#define INT64_OR_DOUBLE double
-#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 * or short *,
-because that should make things easier for callers. This character type is
-called pcre_uchar.
-
-The IN_UCHARS macro multiply its argument with the byte size of the current
-pcre_uchar type. Useful for memcpy and such operations, whose require the
-byte size of their input/output buffers.
-
-The MAX_255 macro checks whether its pcre_uchar input is less than 256.
-
-The TABLE_GET macro is designed for accessing elements of tables whose contain
-exactly 256 items. When the character is able to contain more than 256
-items, some check is needed before accessing these tables.
-*/
-
-#if defined COMPILE_PCRE8
-
-typedef unsigned char pcre_uchar;
-#define IN_UCHARS(x) (x)
-#define MAX_255(c) 1
-#define TABLE_GET(c, table, default) ((table)[c])
-
-#elif defined COMPILE_PCRE16
-
-#if USHRT_MAX != 65535
-/* This is a warning message. Change PCRE_UCHAR16 to a 16 bit data type in
-pcre.h(.in) and disable (comment out) this message. */
-#error Warning: PCRE_UCHAR16 is not a 16 bit data type.
-#endif
-
-typedef pcre_uint16 pcre_uchar;
-#define UCHAR_SHIFT (1)
-#define IN_UCHARS(x) ((x) << UCHAR_SHIFT)
-#define MAX_255(c) ((c) <= 255u)
-#define TABLE_GET(c, table, default) (MAX_255(c)? ((table)[c]):(default))
-
-#elif defined COMPILE_PCRE32
-
-typedef pcre_uint32 pcre_uchar;
-#define UCHAR_SHIFT (2)
-#define IN_UCHARS(x) ((x) << UCHAR_SHIFT)
-#define MAX_255(c) ((c) <= 255u)
-#define TABLE_GET(c, table, default) (MAX_255(c)? ((table)[c]):(default))
-
-#else
-#error Unsupported compiling mode
-#endif /* COMPILE_PCRE[8|16|32] */
-
-/* This is an unsigned int value that no character can ever have. UTF-8
-characters only go up to 0x7fffffff (though Unicode doesn't go beyond
-0x0010ffff). */
-
-#define NOTACHAR 0xffffffff
-
-/* PCRE is able to support several different kinds of newline (CR, LF, CRLF,
-"any" and "anycrlf" at present). The following macros are used to package up
-testing for newlines. NLBLOCK, PSSTART, and PSEND are defined in the various
-modules to indicate in which datablock the parameters exist, and what the
-start/end of string field names are. */
-
-#define NLTYPE_FIXED    0     /* Newline is a fixed length string */
-#define NLTYPE_ANY      1     /* Newline is any Unicode line ending */
-#define NLTYPE_ANYCRLF  2     /* Newline is CR, LF, or CRLF */
-
-/* This macro checks for a newline at the given position */
-
-#define IS_NEWLINE(p) \
-  ((NLBLOCK->nltype != NLTYPE_FIXED)? \
-    ((p) < NLBLOCK->PSEND && \
-     PRIV(is_newline)((p), NLBLOCK->nltype, NLBLOCK->PSEND, \
-       &(NLBLOCK->nllen), utf)) \
-    : \
-    ((p) <= NLBLOCK->PSEND - NLBLOCK->nllen && \
-     UCHAR21TEST(p) == NLBLOCK->nl[0] && \
-     (NLBLOCK->nllen == 1 || UCHAR21TEST(p+1) == NLBLOCK->nl[1])       \
-    ) \
-  )
-
-/* This macro checks for a newline immediately preceding the given position */
-
-#define WAS_NEWLINE(p) \
-  ((NLBLOCK->nltype != NLTYPE_FIXED)? \
-    ((p) > NLBLOCK->PSSTART && \
-     PRIV(was_newline)((p), NLBLOCK->nltype, NLBLOCK->PSSTART, \
-       &(NLBLOCK->nllen), utf)) \
-    : \
-    ((p) >= NLBLOCK->PSSTART + NLBLOCK->nllen && \
-     UCHAR21TEST(p - NLBLOCK->nllen) == NLBLOCK->nl[0] &&              \
-     (NLBLOCK->nllen == 1 || UCHAR21TEST(p - NLBLOCK->nllen + 1) == NLBLOCK->nl[1]) \
-    ) \
-  )
-
-/* When PCRE is compiled as a C++ library, the subject pointer can be replaced
-with a custom type. This makes it possible, for example, to allow pcre_exec()
-to process subject strings that are discontinuous by using a smart pointer
-class. It must always be possible to inspect all of the subject string in
-pcre_exec() because of the way it backtracks. Two macros are required in the
-normal case, for sign-unspecified and unsigned char pointers. The former is
-used for the external interface and appears in pcre.h, which is why its name
-must begin with PCRE_. */
-
-#ifdef CUSTOM_SUBJECT_PTR
-#define PCRE_PUCHAR CUSTOM_SUBJECT_PTR
-#else
-#define PCRE_PUCHAR const pcre_uchar *
-#endif
-
-/* Include the public PCRE header and the definitions of UCP character property
-values. */
-
-#include "pcre.h"
-#include "ucp.h"
-
-#ifdef COMPILE_PCRE32
-/* Assert that the public PCRE_UCHAR32 is a 32-bit type */
-typedef int __assert_pcre_uchar32_size[sizeof(PCRE_UCHAR32) == 4 ? 1 : -1];
-#endif
-
-/* 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 strlen(s)        _strlen(s)
-#define strncmp(s1,s2,m) _strncmp(s1,s2,m)
-#define memcmp(s,c,n)    _memcmp(s,c,n)
-#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). */
-
-#ifndef HAVE_MEMMOVE
-#undef  memmove        /* some systems may have a macro */
-#ifdef HAVE_BCOPY
-#define memmove(a, b, c) bcopy(b, a, c)
-#else  /* HAVE_BCOPY */
-static void *
-pcre_memmove(void *d, const void *s, size_t n)
-{
-size_t i;
-unsigned char *dest = (unsigned char *)d;
-const unsigned char *src = (const unsigned char *)s;
-if (dest > src)
-  {
-  dest += n;
-  src += n;
-  for (i = 0; i < n; ++i) *(--dest) = *(--src);
-  return (void *)dest;
-  }
-else
-  {
-  for (i = 0; i < n; ++i) *dest++ = *src++;
-  return (void *)(dest - n);
-  }
-}
-#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 defined COMPILE_PCRE8
-
-#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])
-
-/* Keep it positive */
-#define MAX_PATTERN_SIZE (1 << 30)
-
-#else
-#error LINK_SIZE must be either 2, 3, or 4
-#endif
-
-#elif defined COMPILE_PCRE16
-
-#if LINK_SIZE == 2
-
-/* Redefine LINK_SIZE as a multiple of sizeof(pcre_uchar) */
-#undef LINK_SIZE
-#define LINK_SIZE 1
-
-#define PUT(a,n,d)   \
-  (a[n] = (d))
-
-#define GET(a,n) \
-  (a[n])
-
-#define MAX_PATTERN_SIZE (1 << 16)
-
-#elif LINK_SIZE == 3 || LINK_SIZE == 4
-
-/* Redefine LINK_SIZE as a multiple of sizeof(pcre_uchar) */
-#undef LINK_SIZE
-#define LINK_SIZE 2
-
-#define PUT(a,n,d)   \
-  (a[n] = (d) >> 16), \
-  (a[(n)+1] = (d) & 65535)
-
-#define GET(a,n) \
-  (((a)[n] << 16) | (a)[(n)+1])
-
-/* Keep it positive */
-#define MAX_PATTERN_SIZE (1 << 30)
-
-#else
-#error LINK_SIZE must be either 2, 3, or 4
-#endif
-
-#elif defined COMPILE_PCRE32
-
-/* Only supported LINK_SIZE is 4 */
-/* Redefine LINK_SIZE as a multiple of sizeof(pcre_uchar) */
-#undef LINK_SIZE
-#define LINK_SIZE 1
-
-#define PUT(a,n,d)   \
-  (a[n] = (d))
-
-#define GET(a,n) \
-  (a[n])
-
-/* Keep it positive */
-#define MAX_PATTERN_SIZE (1 << 30)
-
-#else
-#error Unsupported compiling mode
-#endif /* COMPILE_PCRE[8|16|32] */
-
-/* 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. */
-
-#if defined COMPILE_PCRE8
-
-#define IMM2_SIZE 2
-
-#define PUT2(a,n,d)   \
-  a[n] = (d) >> 8; \
-  a[(n)+1] = (d) & 255
-
-/* For reasons that I do not understand, the expression in this GET2 macro is
-treated by gcc as a signed expression, even when a is declared as unsigned. It
-seems that any kind of arithmetic results in a signed value. */
-
-#define GET2(a,n) \
-  (unsigned int)(((a)[n] << 8) | (a)[(n)+1])
-
-#elif defined COMPILE_PCRE16
-
-#define IMM2_SIZE 1
-
-#define PUT2(a,n,d)   \
-   a[n] = d
-
-#define GET2(a,n) \
-   a[n]
-
-#elif defined COMPILE_PCRE32
-
-#define IMM2_SIZE 1
-
-#define PUT2(a,n,d)   \
-   a[n] = d
-
-#define GET2(a,n) \
-   a[n]
-
-#else
-#error Unsupported compiling mode
-#endif /* COMPILE_PCRE[8|16|32] */
-
-#define PUT2INC(a,n,d)  PUT2(a,n,d), a += IMM2_SIZE
-
-/* The maximum length of a MARK name is currently one data unit; it may be
-changed in future to be a fixed number of bytes or to depend on LINK_SIZE. */
-
-#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32
-#define MAX_MARK ((1u << 16) - 1)
-#else
-#define MAX_MARK ((1u << 8) - 1)
-#endif
-
-/* There is a proposed future special "UTF-21" mode, in which only the lowest
-21 bits of a 32-bit character are interpreted as UTF, with the remaining 11
-high-order bits available to the application for other uses. In preparation for
-the future implementation of this mode, there are macros that load a data item
-and, if in this special mode, mask it to 21 bits. These macros all have names
-starting with UCHAR21. In all other modes, including the normal 32-bit
-library, the macros all have the same simple definitions. When the new mode is
-implemented, it is expected that these definitions will be varied appropriately
-using #ifdef when compiling the library that supports the special mode. */
-
-#define UCHAR21(eptr)        (*(eptr))
-#define UCHAR21TEST(eptr)    (*(eptr))
-#define UCHAR21INC(eptr)     (*(eptr)++)
-#define UCHAR21INCTEST(eptr) (*(eptr)++)
-
-/* When UTF encoding is being used, a character is no longer just a single
-byte in 8-bit mode or a single short in 16-bit mode. The macros for character
-handling generate simple sequences when used in the basic mode, and more
-complicated ones for UTF characters. GETCHARLENTEST and other macros are not
-used when UTF is not supported. To make sure they can never even appear when
-UTF support is omitted, we don't even define them. */
-
-#ifndef SUPPORT_UTF
-
-/* #define MAX_VALUE_FOR_SINGLE_CHAR */
-/* #define HAS_EXTRALEN(c) */
-/* #define GET_EXTRALEN(c) */
-/* #define NOT_FIRSTCHAR(c) */
-#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 GETCHARLENTEST(c, eptr, len) */
-/* #define BACKCHAR(eptr) */
-/* #define FORWARDCHAR(eptr) */
-/* #define ACROSSCHAR(condition, eptr, action) */
-
-#else   /* SUPPORT_UTF */
-
-/* Tests whether the code point needs extra characters to decode. */
-
-#define HASUTF8EXTRALEN(c) ((c) >= 0xc0)
-
-/* Base macro to pick up the remaining bytes of a UTF-8 character, not
-advancing the pointer. */
-
-#define GETUTF8(c, eptr) \
-    { \
-    if ((c & 0x20) == 0) \
-      c = ((c & 0x1f) << 6) | (eptr[1] & 0x3f); \
-    else if ((c & 0x10) == 0) \
-      c = ((c & 0x0f) << 12) | ((eptr[1] & 0x3f) << 6) | (eptr[2] & 0x3f); \
-    else if ((c & 0x08) == 0) \
-      c = ((c & 0x07) << 18) | ((eptr[1] & 0x3f) << 12) | \
-      ((eptr[2] & 0x3f) << 6) | (eptr[3] & 0x3f); \
-    else if ((c & 0x04) == 0) \
-      c = ((c & 0x03) << 24) | ((eptr[1] & 0x3f) << 18) | \
-          ((eptr[2] & 0x3f) << 12) | ((eptr[3] & 0x3f) << 6) | \
-          (eptr[4] & 0x3f); \
-    else \
-      c = ((c & 0x01) << 30) | ((eptr[1] & 0x3f) << 24) | \
-          ((eptr[2] & 0x3f) << 18) | ((eptr[3] & 0x3f) << 12) | \
-          ((eptr[4] & 0x3f) << 6) | (eptr[5] & 0x3f); \
-    }
-
-/* Base macro to pick up the remaining bytes of a UTF-8 character, advancing
-the pointer. */
-
-#define GETUTF8INC(c, eptr) \
-    { \
-    if ((c & 0x20) == 0) \
-      c = ((c & 0x1f) << 6) | (*eptr++ & 0x3f); \
-    else if ((c & 0x10) == 0) \
-      { \
-      c = ((c & 0x0f) << 12) | ((*eptr & 0x3f) << 6) | (eptr[1] & 0x3f); \
-      eptr += 2; \
-      } \
-    else if ((c & 0x08) == 0) \
-      { \
-      c = ((c & 0x07) << 18) | ((*eptr & 0x3f) << 12) | \
-          ((eptr[1] & 0x3f) << 6) | (eptr[2] & 0x3f); \
-      eptr += 3; \
-      } \
-    else if ((c & 0x04) == 0) \
-      { \
-      c = ((c & 0x03) << 24) | ((*eptr & 0x3f) << 18) | \
-          ((eptr[1] & 0x3f) << 12) | ((eptr[2] & 0x3f) << 6) | \
-          (eptr[3] & 0x3f); \
-      eptr += 4; \
-      } \
-    else \
-      { \
-      c = ((c & 0x01) << 30) | ((*eptr & 0x3f) << 24) | \
-          ((eptr[1] & 0x3f) << 18) | ((eptr[2] & 0x3f) << 12) | \
-          ((eptr[3] & 0x3f) << 6) | (eptr[4] & 0x3f); \
-      eptr += 5; \
-      } \
-    }
-
-#if defined COMPILE_PCRE8
-
-/* These macros were originally written in the form of loops that used data
-from the tables whose names start with PRIV(utf8_table). They were rewritten by
-a user so as not to use loops, because in some environments this gives a
-significant performance advantage, and it seems never to do any harm. */
-
-/* Tells the biggest code point which can be encoded as a single character. */
-
-#define MAX_VALUE_FOR_SINGLE_CHAR 127
-
-/* Tests whether the code point needs extra characters to decode. */
-
-#define HAS_EXTRALEN(c) ((c) >= 0xc0)
-
-/* Returns with the additional number of characters if IS_MULTICHAR(c) is TRUE.
-Otherwise it has an undefined behaviour. */
-
-#define GET_EXTRALEN(c) (PRIV(utf8_table4)[(c) & 0x3f])
-
-/* Returns TRUE, if the given character is not the first character
-of a UTF sequence. */
-
-#define NOT_FIRSTCHAR(c) (((c) & 0xc0) == 0x80)
-
-/* 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) GETUTF8(c, eptr);
-
-/* Get the next UTF-8 character, testing for UTF-8 mode, and not advancing the
-pointer. */
-
-#define GETCHARTEST(c, eptr) \
-  c = *eptr; \
-  if (utf && c >= 0xc0) GETUTF8(c, eptr);
-
-/* 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) GETUTF8INC(c, eptr);
-
-/* Get the next character, testing for UTF-8 mode, and advancing the pointer.
-This is called when we don't know if we are in UTF-8 mode. */
-
-#define GETCHARINCTEST(c, eptr) \
-  c = *eptr++; \
-  if (utf && c >= 0xc0) GETUTF8INC(c, eptr);
-
-/* Base macro to pick up the remaining bytes of a UTF-8 character, not
-advancing the pointer, incrementing the length. */
-
-#define GETUTF8LEN(c, eptr, len) \
-    { \
-    if ((c & 0x20) == 0) \
-      { \
-      c = ((c & 0x1f) << 6) | (eptr[1] & 0x3f); \
-      len++; \
-      } \
-    else if ((c & 0x10)  == 0) \
-      { \
-      c = ((c & 0x0f) << 12) | ((eptr[1] & 0x3f) << 6) | (eptr[2] & 0x3f); \
-      len += 2; \
-      } \
-    else if ((c & 0x08)  == 0) \
-      {\
-      c = ((c & 0x07) << 18) | ((eptr[1] & 0x3f) << 12) | \
-          ((eptr[2] & 0x3f) << 6) | (eptr[3] & 0x3f); \
-      len += 3; \
-      } \
-    else if ((c & 0x04)  == 0) \
-      { \
-      c = ((c & 0x03) << 24) | ((eptr[1] & 0x3f) << 18) | \
-          ((eptr[2] & 0x3f) << 12) | ((eptr[3] & 0x3f) << 6) | \
-          (eptr[4] & 0x3f); \
-      len += 4; \
-      } \
-    else \
-      {\
-      c = ((c & 0x01) << 30) | ((eptr[1] & 0x3f) << 24) | \
-          ((eptr[2] & 0x3f) << 18) | ((eptr[3] & 0x3f) << 12) | \
-          ((eptr[4] & 0x3f) << 6) | (eptr[5] & 0x3f); \
-      len += 5; \
-      } \
-    }
-
-/* 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) GETUTF8LEN(c, eptr, len);
-
-/* Get the next UTF-8 character, testing for UTF-8 mode, not advancing the
-pointer, incrementing length if there are extra bytes. This is called when we
-do not know if we are in UTF-8 mode. */
-
-#define GETCHARLENTEST(c, eptr, len) \
-  c = *eptr; \
-  if (utf && c >= 0xc0) GETUTF8LEN(c, eptr, len);
-
-/* If the pointer is not at the start of a character, move it back until
-it is. This is called only in UTF-8 mode - we don't put a test within the macro
-because almost all calls are already within a block of UTF-8 only code. */
-
-#define BACKCHAR(eptr) while((*eptr & 0xc0) == 0x80) eptr--
-
-/* Same as above, just in the other direction. */
-#define FORWARDCHAR(eptr) while((*eptr & 0xc0) == 0x80) eptr++
-
-/* Same as above, but it allows a fully customizable form. */
-#define ACROSSCHAR(condition, eptr, action) \
-  while((condition) && ((eptr) & 0xc0) == 0x80) action
-
-#elif defined COMPILE_PCRE16
-
-/* Tells the biggest code point which can be encoded as a single character. */
-
-#define MAX_VALUE_FOR_SINGLE_CHAR 65535
-
-/* Tests whether the code point needs extra characters to decode. */
-
-#define HAS_EXTRALEN(c) (((c) & 0xfc00) == 0xd800)
-
-/* Returns with the additional number of characters if IS_MULTICHAR(c) is TRUE.
-Otherwise it has an undefined behaviour. */
-
-#define GET_EXTRALEN(c) 1
-
-/* Returns TRUE, if the given character is not the first character
-of a UTF sequence. */
-
-#define NOT_FIRSTCHAR(c) (((c) & 0xfc00) == 0xdc00)
-
-/* Base macro to pick up the low surrogate of a UTF-16 character, not
-advancing the pointer. */
-
-#define GETUTF16(c, eptr) \
-   { c = (((c & 0x3ff) << 10) | (eptr[1] & 0x3ff)) + 0x10000; }
-
-/* Get the next UTF-16 character, not advancing the pointer. This is called when
-we know we are in UTF-16 mode. */
-
-#define GETCHAR(c, eptr) \
-  c = *eptr; \
-  if ((c & 0xfc00) == 0xd800) GETUTF16(c, eptr);
-
-/* Get the next UTF-16 character, testing for UTF-16 mode, and not advancing the
-pointer. */
-
-#define GETCHARTEST(c, eptr) \
-  c = *eptr; \
-  if (utf && (c & 0xfc00) == 0xd800) GETUTF16(c, eptr);
-
-/* Base macro to pick up the low surrogate of a UTF-16 character, advancing
-the pointer. */
-
-#define GETUTF16INC(c, eptr) \
-   { c = (((c & 0x3ff) << 10) | (*eptr++ & 0x3ff)) + 0x10000; }
-
-/* Get the next UTF-16 character, advancing the pointer. This is called when we
-know we are in UTF-16 mode. */
-
-#define GETCHARINC(c, eptr) \
-  c = *eptr++; \
-  if ((c & 0xfc00) == 0xd800) GETUTF16INC(c, eptr);
-
-/* Get the next character, testing for UTF-16 mode, and advancing the pointer.
-This is called when we don't know if we are in UTF-16 mode. */
-
-#define GETCHARINCTEST(c, eptr) \
-  c = *eptr++; \
-  if (utf && (c & 0xfc00) == 0xd800) GETUTF16INC(c, eptr);
-
-/* Base macro to pick up the low surrogate of a UTF-16 character, not
-advancing the pointer, incrementing the length. */
-
-#define GETUTF16LEN(c, eptr, len) \
-   { c = (((c & 0x3ff) << 10) | (eptr[1] & 0x3ff)) + 0x10000; len++; }
-
-/* Get the next UTF-16 character, not advancing the pointer, incrementing
-length if there is a low surrogate. This is called when we know we are in
-UTF-16 mode. */
-
-#define GETCHARLEN(c, eptr, len) \
-  c = *eptr; \
-  if ((c & 0xfc00) == 0xd800) GETUTF16LEN(c, eptr, len);
-
-/* Get the next UTF-816character, testing for UTF-16 mode, not advancing the
-pointer, incrementing length if there is a low surrogate. This is called when
-we do not know if we are in UTF-16 mode. */
-
-#define GETCHARLENTEST(c, eptr, len) \
-  c = *eptr; \
-  if (utf && (c & 0xfc00) == 0xd800) GETUTF16LEN(c, eptr, len);
-
-/* If the pointer is not at the start of a character, move it back until
-it is. This is called only in UTF-16 mode - we don't put a test within the
-macro because almost all calls are already within a block of UTF-16 only
-code. */
-
-#define BACKCHAR(eptr) if ((*eptr & 0xfc00) == 0xdc00) eptr--
-
-/* Same as above, just in the other direction. */
-#define FORWARDCHAR(eptr) if ((*eptr & 0xfc00) == 0xdc00) eptr++
-
-/* Same as above, but it allows a fully customizable form. */
-#define ACROSSCHAR(condition, eptr, action) \
-  if ((condition) && ((eptr) & 0xfc00) == 0xdc00) action
-
-#elif defined COMPILE_PCRE32
-
-/* These are trivial for the 32-bit library, since all UTF-32 characters fit
-into one pcre_uchar unit. */
-#define MAX_VALUE_FOR_SINGLE_CHAR (0x10ffffu)
-#define HAS_EXTRALEN(c) (0)
-#define GET_EXTRALEN(c) (0)
-#define NOT_FIRSTCHAR(c) (0)
-
-/* Get the next UTF-32 character, not advancing the pointer. This is called when
-we know we are in UTF-32 mode. */
-
-#define GETCHAR(c, eptr) \
-  c = *(eptr);
-
-/* Get the next UTF-32 character, testing for UTF-32 mode, and not advancing the
-pointer. */
-
-#define GETCHARTEST(c, eptr) \
-  c = *(eptr);
-
-/* Get the next UTF-32 character, advancing the pointer. This is called when we
-know we are in UTF-32 mode. */
-
-#define GETCHARINC(c, eptr) \
-  c = *((eptr)++);
-
-/* Get the next character, testing for UTF-32 mode, and advancing the pointer.
-This is called when we don't know if we are in UTF-32 mode. */
-
-#define GETCHARINCTEST(c, eptr) \
-  c = *((eptr)++);
-
-/* Get the next UTF-32 character, not advancing the pointer, not incrementing
-length (since all UTF-32 is of length 1). This is called when we know we are in
-UTF-32 mode. */
-
-#define GETCHARLEN(c, eptr, len) \
-  GETCHAR(c, eptr)
-
-/* Get the next UTF-32character, testing for UTF-32 mode, not advancing the
-pointer, not incrementing the length (since all UTF-32 is of length 1).
-This is called when we do not know if we are in UTF-32 mode. */
-
-#define GETCHARLENTEST(c, eptr, len) \
-  GETCHARTEST(c, eptr)
-
-/* If the pointer is not at the start of a character, move it back until
-it is. This is called only in UTF-32 mode - we don't put a test within the
-macro because almost all calls are already within a block of UTF-32 only
-code.
-These are all no-ops since all UTF-32 characters fit into one pcre_uchar. */
-
-#define BACKCHAR(eptr) do { } while (0)
-
-/* Same as above, just in the other direction. */
-#define FORWARDCHAR(eptr) do { } while (0)
-
-/* Same as above, but it allows a fully customizable form. */
-#define ACROSSCHAR(condition, eptr, action) do { } while (0)
-
-#else
-#error Unsupported compiling mode
-#endif /* COMPILE_PCRE[8|16|32] */
-
-#endif  /* SUPPORT_UTF */
-
-/* Tests for Unicode horizontal and vertical whitespace characters must check a
-number of different values. Using a switch statement for this generates the
-fastest code (no loop, no memory access), and there are several places in the
-interpreter code where this happens. In order to ensure that all the case lists
-remain in step, we use macros so that there is only one place where the lists
-are defined.
-
-These values are also required as lists in pcre_compile.c when processing \h,
-\H, \v and \V in a character class. The lists are defined in pcre_tables.c, but
-macros that define the values are here so that all the definitions are
-together. The lists must be in ascending character order, terminated by
-NOTACHAR (which is 0xffffffff).
-
-Any changes should ensure that the various macros are kept in step with each
-other. NOTE: The values also appear in pcre_jit_compile.c. */
-
-/* ------ ASCII/Unicode environments ------ */
-
-#ifndef EBCDIC
-
-#define HSPACE_LIST \
-  CHAR_HT, CHAR_SPACE, CHAR_NBSP, \
-  0x1680, 0x180e, 0x2000, 0x2001, 0x2002, 0x2003, 0x2004, 0x2005, \
-  0x2006, 0x2007, 0x2008, 0x2009, 0x200A, 0x202f, 0x205f, 0x3000, \
-  NOTACHAR
-
-#define HSPACE_MULTIBYTE_CASES \
-  case 0x1680:  /* OGHAM SPACE MARK */ \
-  case 0x180e:  /* MONGOLIAN VOWEL SEPARATOR */ \
-  case 0x2000:  /* EN QUAD */ \
-  case 0x2001:  /* EM QUAD */ \
-  case 0x2002:  /* EN SPACE */ \
-  case 0x2003:  /* EM SPACE */ \
-  case 0x2004:  /* THREE-PER-EM SPACE */ \
-  case 0x2005:  /* FOUR-PER-EM SPACE */ \
-  case 0x2006:  /* SIX-PER-EM SPACE */ \
-  case 0x2007:  /* FIGURE SPACE */ \
-  case 0x2008:  /* PUNCTUATION SPACE */ \
-  case 0x2009:  /* THIN SPACE */ \
-  case 0x200A:  /* HAIR SPACE */ \
-  case 0x202f:  /* NARROW NO-BREAK SPACE */ \
-  case 0x205f:  /* MEDIUM MATHEMATICAL SPACE */ \
-  case 0x3000   /* IDEOGRAPHIC SPACE */
-
-#define HSPACE_BYTE_CASES \
-  case CHAR_HT: \
-  case CHAR_SPACE: \
-  case CHAR_NBSP
-
-#define HSPACE_CASES \
-  HSPACE_BYTE_CASES: \
-  HSPACE_MULTIBYTE_CASES
-
-#define VSPACE_LIST \
-  CHAR_LF, CHAR_VT, CHAR_FF, CHAR_CR, CHAR_NEL, 0x2028, 0x2029, NOTACHAR
-
-#define VSPACE_MULTIBYTE_CASES \
-  case 0x2028:    /* LINE SEPARATOR */ \
-  case 0x2029     /* PARAGRAPH SEPARATOR */
-
-#define VSPACE_BYTE_CASES \
-  case CHAR_LF: \
-  case CHAR_VT: \
-  case CHAR_FF: \
-  case CHAR_CR: \
-  case CHAR_NEL
-
-#define VSPACE_CASES \
-  VSPACE_BYTE_CASES: \
-  VSPACE_MULTIBYTE_CASES
-
-/* ------ EBCDIC environments ------ */
-
-#else
-#define HSPACE_LIST CHAR_HT, CHAR_SPACE, CHAR_NBSP, NOTACHAR
-
-#define HSPACE_BYTE_CASES \
-  case CHAR_HT: \
-  case CHAR_SPACE: \
-  case CHAR_NBSP
-
-#define HSPACE_CASES HSPACE_BYTE_CASES
-
-#ifdef EBCDIC_NL25
-#define VSPACE_LIST \
-  CHAR_VT, CHAR_FF, CHAR_CR, CHAR_NEL, CHAR_LF, NOTACHAR
-#else
-#define VSPACE_LIST \
-  CHAR_VT, CHAR_FF, CHAR_CR, CHAR_LF, CHAR_NEL, NOTACHAR
-#endif
-
-#define VSPACE_BYTE_CASES \
-  case CHAR_LF: \
-  case CHAR_VT: \
-  case CHAR_FF: \
-  case CHAR_CR: \
-  case CHAR_NEL
-
-#define VSPACE_CASES VSPACE_BYTE_CASES
-#endif  /* EBCDIC */
-
-/* ------ End of whitespace macros ------ */
-
-
-
-/* Private flags containing information about the compiled regex. They used to
-live at the top end of the options word, but that got almost full, so they were
-moved to a 16-bit flags word - which got almost full, so now they are in a
-32-bit flags word. From release 8.00, PCRE_NOPARTIAL is unused, as the
-restrictions on partial matching have been lifted. It remains for backwards
-compatibility. */
-
-#define PCRE_MODE8         0x00000001  /* compiled in 8 bit mode */
-#define PCRE_MODE16        0x00000002  /* compiled in 16 bit mode */
-#define PCRE_MODE32        0x00000004  /* compiled in 32 bit mode */
-#define PCRE_FIRSTSET      0x00000010  /* first_char is set */
-#define PCRE_FCH_CASELESS  0x00000020  /* caseless first char */
-#define PCRE_REQCHSET      0x00000040  /* req_byte is set */
-#define PCRE_RCH_CASELESS  0x00000080  /* caseless requested char */
-#define PCRE_STARTLINE     0x00000100  /* start after \n for multiline */
-#define PCRE_NOPARTIAL     0x00000200  /* can't use partial with this regex */
-#define PCRE_JCHANGED      0x00000400  /* j option used in regex */
-#define PCRE_HASCRORLF     0x00000800  /* explicit \r or \n in pattern */
-#define PCRE_HASTHEN       0x00001000  /* pattern contains (*THEN) */
-#define PCRE_MLSET         0x00002000  /* match limit set by regex */
-#define PCRE_RLSET         0x00004000  /* recursion limit set by regex */
-#define PCRE_MATCH_EMPTY   0x00008000  /* pattern can match empty string */
-
-#if defined COMPILE_PCRE8
-#define PCRE_MODE          PCRE_MODE8
-#elif defined COMPILE_PCRE16
-#define PCRE_MODE          PCRE_MODE16
-#elif defined COMPILE_PCRE32
-#define PCRE_MODE          PCRE_MODE32
-#endif
-#define PCRE_MODE_MASK     (PCRE_MODE8 | PCRE_MODE16 | PCRE_MODE32)
-
-/* Flags for the "extra" block produced by pcre_study(). */
-
-#define PCRE_STUDY_MAPPED  0x0001  /* a map of starting chars exists */
-#define PCRE_STUDY_MINLEN  0x0002  /* a minimum length field exists */
-
-/* Masks for identifying the public options that are permitted at compile
-time, run time, or study time, respectively. */
-
-#define PCRE_NEWLINE_BITS (PCRE_NEWLINE_CR|PCRE_NEWLINE_LF|PCRE_NEWLINE_ANY| \
-                           PCRE_NEWLINE_ANYCRLF)
-
-#define PUBLIC_COMPILE_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_AUTO_POSSESS| \
-   PCRE_NO_UTF8_CHECK|PCRE_AUTO_CALLOUT|PCRE_FIRSTLINE| \
-   PCRE_DUPNAMES|PCRE_NEWLINE_BITS|PCRE_BSR_ANYCRLF|PCRE_BSR_UNICODE| \
-   PCRE_JAVASCRIPT_COMPAT|PCRE_UCP|PCRE_NO_START_OPTIMIZE|PCRE_NEVER_UTF)
-
-#define PUBLIC_EXEC_OPTIONS \
-  (PCRE_ANCHORED|PCRE_NOTBOL|PCRE_NOTEOL|PCRE_NOTEMPTY|PCRE_NOTEMPTY_ATSTART| \
-   PCRE_NO_UTF8_CHECK|PCRE_PARTIAL_HARD|PCRE_PARTIAL_SOFT|PCRE_NEWLINE_BITS| \
-   PCRE_BSR_ANYCRLF|PCRE_BSR_UNICODE|PCRE_NO_START_OPTIMIZE)
-
-#define PUBLIC_DFA_EXEC_OPTIONS \
-  (PCRE_ANCHORED|PCRE_NOTBOL|PCRE_NOTEOL|PCRE_NOTEMPTY|PCRE_NOTEMPTY_ATSTART| \
-   PCRE_NO_UTF8_CHECK|PCRE_PARTIAL_HARD|PCRE_PARTIAL_SOFT|PCRE_DFA_SHORTEST| \
-   PCRE_DFA_RESTART|PCRE_NEWLINE_BITS|PCRE_BSR_ANYCRLF|PCRE_BSR_UNICODE| \
-   PCRE_NO_START_OPTIMIZE)
-
-#define PUBLIC_STUDY_OPTIONS \
-   (PCRE_STUDY_JIT_COMPILE|PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE| \
-    PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE|PCRE_STUDY_EXTRA_NEEDED)
-
-#define PUBLIC_JIT_EXEC_OPTIONS \
-   (PCRE_NO_UTF8_CHECK|PCRE_NOTBOL|PCRE_NOTEOL|PCRE_NOTEMPTY|\
-    PCRE_NOTEMPTY_ATSTART|PCRE_PARTIAL_SOFT|PCRE_PARTIAL_HARD)
-
-/* Magic number to provide a small check against being handed junk. */
-
-#define MAGIC_NUMBER  0x50435245UL   /* 'PCRE' */
-
-/* This variable is used to detect a loaded regular expression
-in different endianness. */
-
-#define REVERSED_MAGIC_NUMBER  0x45524350UL   /* 'ERCP' */
-
-/* The maximum remaining length of subject we are prepared to search for a
-req_byte match. */
-
-#define REQ_BYTE_MAX 1000
-
-/* Miscellaneous definitions. The #ifndef is to pacify compiler warnings in
-environments where these macros are defined elsewhere. Unfortunately, there
-is no way to do the same for the typedef. */
-
-typedef int BOOL;
-
-#ifndef FALSE
-#define FALSE   0
-#define TRUE    1
-#endif
-
-/* If PCRE is to support UTF-8 on EBCDIC platforms, we cannot use normal
-character constants like '*' because the compiler would emit their EBCDIC code,
-which is different from their ASCII/UTF-8 code. Instead we define macros for
-the characters so that they always use the ASCII/UTF-8 code when UTF-8 support
-is enabled. When UTF-8 support is not enabled, the definitions use character
-literals. Both character and string versions of each character are needed, and
-there are some longer strings as well.
-
-This means that, on EBCDIC platforms, the PCRE library can handle either
-EBCDIC, or UTF-8, but not both. To support both in the same compiled library
-would need different lookups depending on whether PCRE_UTF8 was set or not.
-This would make it impossible to use characters in switch/case statements,
-which would reduce performance. For a theoretical use (which nobody has asked
-for) in a minority area (EBCDIC platforms), this is not sensible. Any
-application that did need both could compile two versions of the library, using
-macros to give the functions distinct names. */
-
-#ifndef SUPPORT_UTF
-
-/* UTF-8 support is not enabled; use the platform-dependent character literals
-so that PCRE works in both ASCII and EBCDIC environments, but only in non-UTF
-mode. Newline characters are problematic in EBCDIC. Though it has CR and LF
-characters, a common practice has been to use its NL (0x15) character as the
-line terminator in C-like processing environments. However, sometimes the LF
-(0x25) character is used instead, according to this Unicode document:
-
-http://unicode.org/standard/reports/tr13/tr13-5.html
-
-PCRE defaults EBCDIC NL to 0x15, but has a build-time option to select 0x25
-instead. Whichever is *not* chosen is defined as NEL.
-
-In both ASCII and EBCDIC environments, CHAR_NL and CHAR_LF are synonyms for the
-same code point. */
-
-#ifdef EBCDIC
-
-#ifndef EBCDIC_NL25
-#define CHAR_NL                     '\x15'
-#define CHAR_NEL                    '\x25'
-#define STR_NL                      "\x15"
-#define STR_NEL                     "\x25"
-#else
-#define CHAR_NL                     '\x25'
-#define CHAR_NEL                    '\x15'
-#define STR_NL                      "\x25"
-#define STR_NEL                     "\x15"
-#endif
-
-#define CHAR_LF                     CHAR_NL
-#define STR_LF                      STR_NL
-
-#define CHAR_ESC                    '\047'
-#define CHAR_DEL                    '\007'
-#define CHAR_NBSP                   '\x41'
-#define STR_ESC                     "\047"
-#define STR_DEL                     "\007"
-
-#else  /* Not EBCDIC */
-
-/* In ASCII/Unicode, linefeed is '\n' and we equate this to NL for
-compatibility. NEL is the Unicode newline character; make sure it is
-a positive value. */
-
-#define CHAR_LF                     '\n'
-#define CHAR_NL                     CHAR_LF
-#define CHAR_NEL                    ((unsigned char)'\x85')
-#define CHAR_ESC                    '\033'
-#define CHAR_DEL                    '\177'
-#define CHAR_NBSP                   ((unsigned char)'\xa0')
-
-#define STR_LF                      "\n"
-#define STR_NL                      STR_LF
-#define STR_NEL                     "\x85"
-#define STR_ESC                     "\033"
-#define STR_DEL                     "\177"
-
-#endif  /* EBCDIC */
-
-/* The remaining definitions work in both environments. */
-
-#define CHAR_NULL                   '\0'
-#define CHAR_HT                     '\t'
-#define CHAR_VT                     '\v'
-#define CHAR_FF                     '\f'
-#define CHAR_CR                     '\r'
-#define CHAR_BS                     '\b'
-#define CHAR_BEL                    '\a'
-
-#define CHAR_SPACE                  ' '
-#define CHAR_EXCLAMATION_MARK       '!'
-#define CHAR_QUOTATION_MARK         '"'
-#define CHAR_NUMBER_SIGN            '#'
-#define CHAR_DOLLAR_SIGN            '$'
-#define CHAR_PERCENT_SIGN           '%'
-#define CHAR_AMPERSAND              '&'
-#define CHAR_APOSTROPHE             '\''
-#define CHAR_LEFT_PARENTHESIS       '('
-#define CHAR_RIGHT_PARENTHESIS      ')'
-#define CHAR_ASTERISK               '*'
-#define CHAR_PLUS                   '+'
-#define CHAR_COMMA                  ','
-#define CHAR_MINUS                  '-'
-#define CHAR_DOT                    '.'
-#define CHAR_SLASH                  '/'
-#define CHAR_0                      '0'
-#define CHAR_1                      '1'
-#define CHAR_2                      '2'
-#define CHAR_3                      '3'
-#define CHAR_4                      '4'
-#define CHAR_5                      '5'
-#define CHAR_6                      '6'
-#define CHAR_7                      '7'
-#define CHAR_8                      '8'
-#define CHAR_9                      '9'
-#define CHAR_COLON                  ':'
-#define CHAR_SEMICOLON              ';'
-#define CHAR_LESS_THAN_SIGN         '<'
-#define CHAR_EQUALS_SIGN            '='
-#define CHAR_GREATER_THAN_SIGN      '>'
-#define CHAR_QUESTION_MARK          '?'
-#define CHAR_COMMERCIAL_AT          '@'
-#define CHAR_A                      'A'
-#define CHAR_B                      'B'
-#define CHAR_C                      'C'
-#define CHAR_D                      'D'
-#define CHAR_E                      'E'
-#define CHAR_F                      'F'
-#define CHAR_G                      'G'
-#define CHAR_H                      'H'
-#define CHAR_I                      'I'
-#define CHAR_J                      'J'
-#define CHAR_K                      'K'
-#define CHAR_L                      'L'
-#define CHAR_M                      'M'
-#define CHAR_N                      'N'
-#define CHAR_O                      'O'
-#define CHAR_P                      'P'
-#define CHAR_Q                      'Q'
-#define CHAR_R                      'R'
-#define CHAR_S                      'S'
-#define CHAR_T                      'T'
-#define CHAR_U                      'U'
-#define CHAR_V                      'V'
-#define CHAR_W                      'W'
-#define CHAR_X                      'X'
-#define CHAR_Y                      'Y'
-#define CHAR_Z                      'Z'
-#define CHAR_LEFT_SQUARE_BRACKET    '['
-#define CHAR_BACKSLASH              '\\'
-#define CHAR_RIGHT_SQUARE_BRACKET   ']'
-#define CHAR_CIRCUMFLEX_ACCENT      '^'
-#define CHAR_UNDERSCORE             '_'
-#define CHAR_GRAVE_ACCENT           '`'
-#define CHAR_a                      'a'
-#define CHAR_b                      'b'
-#define CHAR_c                      'c'
-#define CHAR_d                      'd'
-#define CHAR_e                      'e'
-#define CHAR_f                      'f'
-#define CHAR_g                      'g'
-#define CHAR_h                      'h'
-#define CHAR_i                      'i'
-#define CHAR_j                      'j'
-#define CHAR_k                      'k'
-#define CHAR_l                      'l'
-#define CHAR_m                      'm'
-#define CHAR_n                      'n'
-#define CHAR_o                      'o'
-#define CHAR_p                      'p'
-#define CHAR_q                      'q'
-#define CHAR_r                      'r'
-#define CHAR_s                      's'
-#define CHAR_t                      't'
-#define CHAR_u                      'u'
-#define CHAR_v                      'v'
-#define CHAR_w                      'w'
-#define CHAR_x                      'x'
-#define CHAR_y                      'y'
-#define CHAR_z                      'z'
-#define CHAR_LEFT_CURLY_BRACKET     '{'
-#define CHAR_VERTICAL_LINE          '|'
-#define CHAR_RIGHT_CURLY_BRACKET    '}'
-#define CHAR_TILDE                  '~'
-
-#define STR_HT                      "\t"
-#define STR_VT                      "\v"
-#define STR_FF                      "\f"
-#define STR_CR                      "\r"
-#define STR_BS                      "\b"
-#define STR_BEL                     "\a"
-
-#define STR_SPACE                   " "
-#define STR_EXCLAMATION_MARK        "!"
-#define STR_QUOTATION_MARK          "\""
-#define STR_NUMBER_SIGN             "#"
-#define STR_DOLLAR_SIGN             "$"
-#define STR_PERCENT_SIGN            "%"
-#define STR_AMPERSAND               "&"
-#define STR_APOSTROPHE              "'"
-#define STR_LEFT_PARENTHESIS        "("
-#define STR_RIGHT_PARENTHESIS       ")"
-#define STR_ASTERISK                "*"
-#define STR_PLUS                    "+"
-#define STR_COMMA                   ","
-#define STR_MINUS                   "-"
-#define STR_DOT                     "."
-#define STR_SLASH                   "/"
-#define STR_0                       "0"
-#define STR_1                       "1"
-#define STR_2                       "2"
-#define STR_3                       "3"
-#define STR_4                       "4"
-#define STR_5                       "5"
-#define STR_6                       "6"
-#define STR_7                       "7"
-#define STR_8                       "8"
-#define STR_9                       "9"
-#define STR_COLON                   ":"
-#define STR_SEMICOLON               ";"
-#define STR_LESS_THAN_SIGN          "<"
-#define STR_EQUALS_SIGN             "="
-#define STR_GREATER_THAN_SIGN       ">"
-#define STR_QUESTION_MARK           "?"
-#define STR_COMMERCIAL_AT           "@"
-#define STR_A                       "A"
-#define STR_B                       "B"
-#define STR_C                       "C"
-#define STR_D                       "D"
-#define STR_E                       "E"
-#define STR_F                       "F"
-#define STR_G                       "G"
-#define STR_H                       "H"
-#define STR_I                       "I"
-#define STR_J                       "J"
-#define STR_K                       "K"
-#define STR_L                       "L"
-#define STR_M                       "M"
-#define STR_N                       "N"
-#define STR_O                       "O"
-#define STR_P                       "P"
-#define STR_Q                       "Q"
-#define STR_R                       "R"
-#define STR_S                       "S"
-#define STR_T                       "T"
-#define STR_U                       "U"
-#define STR_V                       "V"
-#define STR_W                       "W"
-#define STR_X                       "X"
-#define STR_Y                       "Y"
-#define STR_Z                       "Z"
-#define STR_LEFT_SQUARE_BRACKET     "["
-#define STR_BACKSLASH               "\\"
-#define STR_RIGHT_SQUARE_BRACKET    "]"
-#define STR_CIRCUMFLEX_ACCENT       "^"
-#define STR_UNDERSCORE              "_"
-#define STR_GRAVE_ACCENT            "`"
-#define STR_a                       "a"
-#define STR_b                       "b"
-#define STR_c                       "c"
-#define STR_d                       "d"
-#define STR_e                       "e"
-#define STR_f                       "f"
-#define STR_g                       "g"
-#define STR_h                       "h"
-#define STR_i                       "i"
-#define STR_j                       "j"
-#define STR_k                       "k"
-#define STR_l                       "l"
-#define STR_m                       "m"
-#define STR_n                       "n"
-#define STR_o                       "o"
-#define STR_p                       "p"
-#define STR_q                       "q"
-#define STR_r                       "r"
-#define STR_s                       "s"
-#define STR_t                       "t"
-#define STR_u                       "u"
-#define STR_v                       "v"
-#define STR_w                       "w"
-#define STR_x                       "x"
-#define STR_y                       "y"
-#define STR_z                       "z"
-#define STR_LEFT_CURLY_BRACKET      "{"
-#define STR_VERTICAL_LINE           "|"
-#define STR_RIGHT_CURLY_BRACKET     "}"
-#define STR_TILDE                   "~"
-
-#define STRING_ACCEPT0              "ACCEPT\0"
-#define STRING_COMMIT0              "COMMIT\0"
-#define STRING_F0                   "F\0"
-#define STRING_FAIL0                "FAIL\0"
-#define STRING_MARK0                "MARK\0"
-#define STRING_PRUNE0               "PRUNE\0"
-#define STRING_SKIP0                "SKIP\0"
-#define STRING_THEN                 "THEN"
-
-#define STRING_alpha0               "alpha\0"
-#define STRING_lower0               "lower\0"
-#define STRING_upper0               "upper\0"
-#define STRING_alnum0               "alnum\0"
-#define STRING_ascii0               "ascii\0"
-#define STRING_blank0               "blank\0"
-#define STRING_cntrl0               "cntrl\0"
-#define STRING_digit0               "digit\0"
-#define STRING_graph0               "graph\0"
-#define STRING_print0               "print\0"
-#define STRING_punct0               "punct\0"
-#define STRING_space0               "space\0"
-#define STRING_word0                "word\0"
-#define STRING_xdigit               "xdigit"
-
-#define STRING_DEFINE               "DEFINE"
-#define STRING_WEIRD_STARTWORD      "[:<:]]"
-#define STRING_WEIRD_ENDWORD        "[:>:]]"
-
-#define STRING_CR_RIGHTPAR              "CR)"
-#define STRING_LF_RIGHTPAR              "LF)"
-#define STRING_CRLF_RIGHTPAR            "CRLF)"
-#define STRING_ANY_RIGHTPAR             "ANY)"
-#define STRING_ANYCRLF_RIGHTPAR         "ANYCRLF)"
-#define STRING_BSR_ANYCRLF_RIGHTPAR     "BSR_ANYCRLF)"
-#define STRING_BSR_UNICODE_RIGHTPAR     "BSR_UNICODE)"
-#define STRING_UTF8_RIGHTPAR            "UTF8)"
-#define STRING_UTF16_RIGHTPAR           "UTF16)"
-#define STRING_UTF32_RIGHTPAR           "UTF32)"
-#define STRING_UTF_RIGHTPAR             "UTF)"
-#define STRING_UCP_RIGHTPAR             "UCP)"
-#define STRING_NO_AUTO_POSSESS_RIGHTPAR "NO_AUTO_POSSESS)"
-#define STRING_NO_START_OPT_RIGHTPAR    "NO_START_OPT)"
-#define STRING_LIMIT_MATCH_EQ           "LIMIT_MATCH="
-#define STRING_LIMIT_RECURSION_EQ       "LIMIT_RECURSION="
-
-#else  /* SUPPORT_UTF */
-
-/* UTF-8 support is enabled; always use UTF-8 (=ASCII) character codes. This
-works in both modes non-EBCDIC platforms, and on EBCDIC platforms in UTF-8 mode
-only. */
-
-#define CHAR_HT                     '\011'
-#define CHAR_VT                     '\013'
-#define CHAR_FF                     '\014'
-#define CHAR_CR                     '\015'
-#define CHAR_LF                     '\012'
-#define CHAR_NL                     CHAR_LF
-#define CHAR_NEL                    ((unsigned char)'\x85')
-#define CHAR_BS                     '\010'
-#define CHAR_BEL                    '\007'
-#define CHAR_ESC                    '\033'
-#define CHAR_DEL                    '\177'
-
-#define CHAR_NULL                   '\0'
-#define CHAR_SPACE                  '\040'
-#define CHAR_EXCLAMATION_MARK       '\041'
-#define CHAR_QUOTATION_MARK         '\042'
-#define CHAR_NUMBER_SIGN            '\043'
-#define CHAR_DOLLAR_SIGN            '\044'
-#define CHAR_PERCENT_SIGN           '\045'
-#define CHAR_AMPERSAND              '\046'
-#define CHAR_APOSTROPHE             '\047'
-#define CHAR_LEFT_PARENTHESIS       '\050'
-#define CHAR_RIGHT_PARENTHESIS      '\051'
-#define CHAR_ASTERISK               '\052'
-#define CHAR_PLUS                   '\053'
-#define CHAR_COMMA                  '\054'
-#define CHAR_MINUS                  '\055'
-#define CHAR_DOT                    '\056'
-#define CHAR_SLASH                  '\057'
-#define CHAR_0                      '\060'
-#define CHAR_1                      '\061'
-#define CHAR_2                      '\062'
-#define CHAR_3                      '\063'
-#define CHAR_4                      '\064'
-#define CHAR_5                      '\065'
-#define CHAR_6                      '\066'
-#define CHAR_7                      '\067'
-#define CHAR_8                      '\070'
-#define CHAR_9                      '\071'
-#define CHAR_COLON                  '\072'
-#define CHAR_SEMICOLON              '\073'
-#define CHAR_LESS_THAN_SIGN         '\074'
-#define CHAR_EQUALS_SIGN            '\075'
-#define CHAR_GREATER_THAN_SIGN      '\076'
-#define CHAR_QUESTION_MARK          '\077'
-#define CHAR_COMMERCIAL_AT          '\100'
-#define CHAR_A                      '\101'
-#define CHAR_B                      '\102'
-#define CHAR_C                      '\103'
-#define CHAR_D                      '\104'
-#define CHAR_E                      '\105'
-#define CHAR_F                      '\106'
-#define CHAR_G                      '\107'
-#define CHAR_H                      '\110'
-#define CHAR_I                      '\111'
-#define CHAR_J                      '\112'
-#define CHAR_K                      '\113'
-#define CHAR_L                      '\114'
-#define CHAR_M                      '\115'
-#define CHAR_N                      '\116'
-#define CHAR_O                      '\117'
-#define CHAR_P                      '\120'
-#define CHAR_Q                      '\121'
-#define CHAR_R                      '\122'
-#define CHAR_S                      '\123'
-#define CHAR_T                      '\124'
-#define CHAR_U                      '\125'
-#define CHAR_V                      '\126'
-#define CHAR_W                      '\127'
-#define CHAR_X                      '\130'
-#define CHAR_Y                      '\131'
-#define CHAR_Z                      '\132'
-#define CHAR_LEFT_SQUARE_BRACKET    '\133'
-#define CHAR_BACKSLASH              '\134'
-#define CHAR_RIGHT_SQUARE_BRACKET   '\135'
-#define CHAR_CIRCUMFLEX_ACCENT      '\136'
-#define CHAR_UNDERSCORE             '\137'
-#define CHAR_GRAVE_ACCENT           '\140'
-#define CHAR_a                      '\141'
-#define CHAR_b                      '\142'
-#define CHAR_c                      '\143'
-#define CHAR_d                      '\144'
-#define CHAR_e                      '\145'
-#define CHAR_f                      '\146'
-#define CHAR_g                      '\147'
-#define CHAR_h                      '\150'
-#define CHAR_i                      '\151'
-#define CHAR_j                      '\152'
-#define CHAR_k                      '\153'
-#define CHAR_l                      '\154'
-#define CHAR_m                      '\155'
-#define CHAR_n                      '\156'
-#define CHAR_o                      '\157'
-#define CHAR_p                      '\160'
-#define CHAR_q                      '\161'
-#define CHAR_r                      '\162'
-#define CHAR_s                      '\163'
-#define CHAR_t                      '\164'
-#define CHAR_u                      '\165'
-#define CHAR_v                      '\166'
-#define CHAR_w                      '\167'
-#define CHAR_x                      '\170'
-#define CHAR_y                      '\171'
-#define CHAR_z                      '\172'
-#define CHAR_LEFT_CURLY_BRACKET     '\173'
-#define CHAR_VERTICAL_LINE          '\174'
-#define CHAR_RIGHT_CURLY_BRACKET    '\175'
-#define CHAR_TILDE                  '\176'
-#define CHAR_NBSP                   ((unsigned char)'\xa0')
-
-#define STR_HT                      "\011"
-#define STR_VT                      "\013"
-#define STR_FF                      "\014"
-#define STR_CR                      "\015"
-#define STR_NL                      "\012"
-#define STR_BS                      "\010"
-#define STR_BEL                     "\007"
-#define STR_ESC                     "\033"
-#define STR_DEL                     "\177"
-
-#define STR_SPACE                   "\040"
-#define STR_EXCLAMATION_MARK        "\041"
-#define STR_QUOTATION_MARK          "\042"
-#define STR_NUMBER_SIGN             "\043"
-#define STR_DOLLAR_SIGN             "\044"
-#define STR_PERCENT_SIGN            "\045"
-#define STR_AMPERSAND               "\046"
-#define STR_APOSTROPHE              "\047"
-#define STR_LEFT_PARENTHESIS        "\050"
-#define STR_RIGHT_PARENTHESIS       "\051"
-#define STR_ASTERISK                "\052"
-#define STR_PLUS                    "\053"
-#define STR_COMMA                   "\054"
-#define STR_MINUS                   "\055"
-#define STR_DOT                     "\056"
-#define STR_SLASH                   "\057"
-#define STR_0                       "\060"
-#define STR_1                       "\061"
-#define STR_2                       "\062"
-#define STR_3                       "\063"
-#define STR_4                       "\064"
-#define STR_5                       "\065"
-#define STR_6                       "\066"
-#define STR_7                       "\067"
-#define STR_8                       "\070"
-#define STR_9                       "\071"
-#define STR_COLON                   "\072"
-#define STR_SEMICOLON               "\073"
-#define STR_LESS_THAN_SIGN          "\074"
-#define STR_EQUALS_SIGN             "\075"
-#define STR_GREATER_THAN_SIGN       "\076"
-#define STR_QUESTION_MARK           "\077"
-#define STR_COMMERCIAL_AT           "\100"
-#define STR_A                       "\101"
-#define STR_B                       "\102"
-#define STR_C                       "\103"
-#define STR_D                       "\104"
-#define STR_E                       "\105"
-#define STR_F                       "\106"
-#define STR_G                       "\107"
-#define STR_H                       "\110"
-#define STR_I                       "\111"
-#define STR_J                       "\112"
-#define STR_K                       "\113"
-#define STR_L                       "\114"
-#define STR_M                       "\115"
-#define STR_N                       "\116"
-#define STR_O                       "\117"
-#define STR_P                       "\120"
-#define STR_Q                       "\121"
-#define STR_R                       "\122"
-#define STR_S                       "\123"
-#define STR_T                       "\124"
-#define STR_U                       "\125"
-#define STR_V                       "\126"
-#define STR_W                       "\127"
-#define STR_X                       "\130"
-#define STR_Y                       "\131"
-#define STR_Z                       "\132"
-#define STR_LEFT_SQUARE_BRACKET     "\133"
-#define STR_BACKSLASH               "\134"
-#define STR_RIGHT_SQUARE_BRACKET    "\135"
-#define STR_CIRCUMFLEX_ACCENT       "\136"
-#define STR_UNDERSCORE              "\137"
-#define STR_GRAVE_ACCENT            "\140"
-#define STR_a                       "\141"
-#define STR_b                       "\142"
-#define STR_c                       "\143"
-#define STR_d                       "\144"
-#define STR_e                       "\145"
-#define STR_f                       "\146"
-#define STR_g                       "\147"
-#define STR_h                       "\150"
-#define STR_i                       "\151"
-#define STR_j                       "\152"
-#define STR_k                       "\153"
-#define STR_l                       "\154"
-#define STR_m                       "\155"
-#define STR_n                       "\156"
-#define STR_o                       "\157"
-#define STR_p                       "\160"
-#define STR_q                       "\161"
-#define STR_r                       "\162"
-#define STR_s                       "\163"
-#define STR_t                       "\164"
-#define STR_u                       "\165"
-#define STR_v                       "\166"
-#define STR_w                       "\167"
-#define STR_x                       "\170"
-#define STR_y                       "\171"
-#define STR_z                       "\172"
-#define STR_LEFT_CURLY_BRACKET      "\173"
-#define STR_VERTICAL_LINE           "\174"
-#define STR_RIGHT_CURLY_BRACKET     "\175"
-#define STR_TILDE                   "\176"
-
-#define STRING_ACCEPT0              STR_A STR_C STR_C STR_E STR_P STR_T "\0"
-#define STRING_COMMIT0              STR_C STR_O STR_M STR_M STR_I STR_T "\0"
-#define STRING_F0                   STR_F "\0"
-#define STRING_FAIL0                STR_F STR_A STR_I STR_L "\0"
-#define STRING_MARK0                STR_M STR_A STR_R STR_K "\0"
-#define STRING_PRUNE0               STR_P STR_R STR_U STR_N STR_E "\0"
-#define STRING_SKIP0                STR_S STR_K STR_I STR_P "\0"
-#define STRING_THEN                 STR_T STR_H STR_E STR_N
-
-#define STRING_alpha0               STR_a STR_l STR_p STR_h STR_a "\0"
-#define STRING_lower0               STR_l STR_o STR_w STR_e STR_r "\0"
-#define STRING_upper0               STR_u STR_p STR_p STR_e STR_r "\0"
-#define STRING_alnum0               STR_a STR_l STR_n STR_u STR_m "\0"
-#define STRING_ascii0               STR_a STR_s STR_c STR_i STR_i "\0"
-#define STRING_blank0               STR_b STR_l STR_a STR_n STR_k "\0"
-#define STRING_cntrl0               STR_c STR_n STR_t STR_r STR_l "\0"
-#define STRING_digit0               STR_d STR_i STR_g STR_i STR_t "\0"
-#define STRING_graph0               STR_g STR_r STR_a STR_p STR_h "\0"
-#define STRING_print0               STR_p STR_r STR_i STR_n STR_t "\0"
-#define STRING_punct0               STR_p STR_u STR_n STR_c STR_t "\0"
-#define STRING_space0               STR_s STR_p STR_a STR_c STR_e "\0"
-#define STRING_word0                STR_w STR_o STR_r STR_d       "\0"
-#define STRING_xdigit               STR_x STR_d STR_i STR_g STR_i STR_t
-
-#define STRING_DEFINE               STR_D STR_E STR_F STR_I STR_N STR_E
-#define STRING_WEIRD_STARTWORD      STR_LEFT_SQUARE_BRACKET STR_COLON STR_LESS_THAN_SIGN STR_COLON STR_RIGHT_SQUARE_BRACKET STR_RIGHT_SQUARE_BRACKET
-#define STRING_WEIRD_ENDWORD        STR_LEFT_SQUARE_BRACKET STR_COLON STR_GREATER_THAN_SIGN STR_COLON STR_RIGHT_SQUARE_BRACKET STR_RIGHT_SQUARE_BRACKET
-
-#define STRING_CR_RIGHTPAR              STR_C STR_R STR_RIGHT_PARENTHESIS
-#define STRING_LF_RIGHTPAR              STR_L STR_F STR_RIGHT_PARENTHESIS
-#define STRING_CRLF_RIGHTPAR            STR_C STR_R STR_L STR_F STR_RIGHT_PARENTHESIS
-#define STRING_ANY_RIGHTPAR             STR_A STR_N STR_Y STR_RIGHT_PARENTHESIS
-#define STRING_ANYCRLF_RIGHTPAR         STR_A STR_N STR_Y STR_C STR_R STR_L STR_F STR_RIGHT_PARENTHESIS
-#define STRING_BSR_ANYCRLF_RIGHTPAR     STR_B STR_S STR_R STR_UNDERSCORE STR_A STR_N STR_Y STR_C STR_R STR_L STR_F STR_RIGHT_PARENTHESIS
-#define STRING_BSR_UNICODE_RIGHTPAR     STR_B STR_S STR_R STR_UNDERSCORE STR_U STR_N STR_I STR_C STR_O STR_D STR_E STR_RIGHT_PARENTHESIS
-#define STRING_UTF8_RIGHTPAR            STR_U STR_T STR_F STR_8 STR_RIGHT_PARENTHESIS
-#define STRING_UTF16_RIGHTPAR           STR_U STR_T STR_F STR_1 STR_6 STR_RIGHT_PARENTHESIS
-#define STRING_UTF32_RIGHTPAR           STR_U STR_T STR_F STR_3 STR_2 STR_RIGHT_PARENTHESIS
-#define STRING_UTF_RIGHTPAR             STR_U STR_T STR_F STR_RIGHT_PARENTHESIS
-#define STRING_UCP_RIGHTPAR             STR_U STR_C STR_P STR_RIGHT_PARENTHESIS
-#define STRING_NO_AUTO_POSSESS_RIGHTPAR STR_N STR_O STR_UNDERSCORE STR_A STR_U STR_T STR_O STR_UNDERSCORE STR_P STR_O STR_S STR_S STR_E STR_S STR_S STR_RIGHT_PARENTHESIS
-#define STRING_NO_START_OPT_RIGHTPAR    STR_N STR_O STR_UNDERSCORE STR_S STR_T STR_A STR_R STR_T STR_UNDERSCORE STR_O STR_P STR_T STR_RIGHT_PARENTHESIS
-#define STRING_LIMIT_MATCH_EQ           STR_L STR_I STR_M STR_I STR_T STR_UNDERSCORE STR_M STR_A STR_T STR_C STR_H STR_EQUALS_SIGN
-#define STRING_LIMIT_RECURSION_EQ       STR_L STR_I STR_M STR_I STR_T STR_UNDERSCORE STR_R STR_E STR_C STR_U STR_R STR_S STR_I STR_O STR_N STR_EQUALS_SIGN
-
-#endif  /* SUPPORT_UTF */
-
-/* Escape items that are just an encoding of a particular data value. */
-
-#ifndef ESC_a
-#define ESC_a CHAR_BEL
-#endif
-
-#ifndef ESC_e
-#define ESC_e CHAR_ESC
-#endif
-
-#ifndef ESC_f
-#define ESC_f CHAR_FF
-#endif
-
-#ifndef ESC_n
-#define ESC_n CHAR_LF
-#endif
-
-#ifndef ESC_r
-#define ESC_r CHAR_CR
-#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 CHAR_HT
-#endif
-
-/* Codes for different types of Unicode property */
-
-#define PT_ANY        0    /* Any property - matches all chars */
-#define PT_LAMP       1    /* L& - the union of Lu, Ll, Lt */
-#define PT_GC         2    /* Specified general characteristic (e.g. L) */
-#define PT_PC         3    /* Specified particular characteristic (e.g. Lu) */
-#define PT_SC         4    /* Script (e.g. Han) */
-#define PT_ALNUM      5    /* Alphanumeric - the union of L and N */
-#define PT_SPACE      6    /* Perl space - Z plus 9,10,12,13 */
-#define PT_PXSPACE    7    /* POSIX space - Z plus 9,10,11,12,13 */
-#define PT_WORD       8    /* Word - L plus N plus underscore */
-#define PT_CLIST      9    /* Pseudo-property: match character list */
-#define PT_UCNC      10    /* Universal Character nameable character */
-#define PT_TABSIZE   11    /* Size of square table for autopossessify tests */
-
-/* The following special properties are used only in XCLASS items, when POSIX
-classes are specified and PCRE_UCP is set - in other words, for Unicode
-handling of these classes. They are not available via the \p or \P escapes like
-those in the above list, and so they do not take part in the autopossessifying
-table. */
-
-#define PT_PXGRAPH   11    /* [:graph:] - characters that mark the paper */
-#define PT_PXPRINT   12    /* [:print:] - [:graph:] plus non-control spaces */
-#define PT_PXPUNCT   13    /* [:punct:] - punctuation characters */
-
-/* Flag bits and data types for the extended class (OP_XCLASS) for classes that
-contain 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_HASPROP   0x04    /* Flag: property checks are 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 (2-byte property code follows) */
-#define XCL_NOTPROP   4    /* Unicode inverted property (ditto) */
-
-/* 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 0
-for a data character.  Also, they must appear in the same order as in the
-opcode definitions below, up to ESC_z. There's a dummy for OP_ALLANY because it
-corresponds to "." in DOTALL mode rather than an escape sequence. It is also
-used for [^] in JavaScript compatibility mode, and for \C in non-utf mode. In
-non-DOTALL mode, "." behaves like \N.
-
-The special values ESC_DU, ESC_du, etc. are used instead of ESC_D, ESC_d, etc.
-when PCRE_UCP is set and replacement of \d etc by \p sequences is required.
-They must be contiguous, and remain in order so that the replacements can be
-looked up from a table.
-
-Negative numbers are used to encode a backreference (\1, \2, \3, etc.) in
-check_escape(). There 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_K, ESC_B, ESC_b, ESC_D, ESC_d, ESC_S, ESC_s,
-       ESC_W, ESC_w, ESC_N, ESC_dum, ESC_C, ESC_P, ESC_p, ESC_R, ESC_H,
-       ESC_h, ESC_V, ESC_v, ESC_X, ESC_Z, ESC_z,
-       ESC_E, ESC_Q, ESC_g, ESC_k,
-       ESC_DU, ESC_du, ESC_SU, ESC_su, ESC_WU, ESC_wu };
-
-
-/********************** Opcode definitions ******************/
-
-/****** NOTE NOTE NOTE ******
-
-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. Furthermore, values up to
-OP_DOLLM must not be changed without adjusting the table called autoposstab in
-pcre_compile.c
-
-Whenever this list is updated, the two macro definitions that follow must be
-updated to match. The possessification table called "opcode_possessify" in
-pcre_compile.c must also be updated, and also the tables called "coptable"
-and "poptable" in pcre_dfa_exec.c.
-
-****** NOTE NOTE NOTE ******/
-
-
-/* The values between FIRST_AUTOTAB_OP and LAST_AUTOTAB_RIGHT_OP, inclusive,
-are used in a table for deciding whether a repeated character type can be
-auto-possessified. */
-
-#define FIRST_AUTOTAB_OP       OP_NOT_DIGIT
-#define LAST_AUTOTAB_LEFT_OP   OP_EXTUNI
-#define LAST_AUTOTAB_RIGHT_OP  OP_DOLLM
-
-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_SET_SOM,        /* 3 Set start of match (\K) */
-  OP_NOT_WORD_BOUNDARY,  /*  4 \B */
-  OP_WORD_BOUNDARY,      /*  5 \b */
-  OP_NOT_DIGIT,          /*  6 \D */
-  OP_DIGIT,              /*  7 \d */
-  OP_NOT_WHITESPACE,     /*  8 \S */
-  OP_WHITESPACE,         /*  9 \s */
-  OP_NOT_WORDCHAR,       /* 10 \W */
-  OP_WORDCHAR,           /* 11 \w */
-
-  OP_ANY,            /* 12 Match any character except newline (\N) */
-  OP_ALLANY,         /* 13 Match any character */
-  OP_ANYBYTE,        /* 14 Match any byte (\C); different to OP_ANY for UTF-8 */
-  OP_NOTPROP,        /* 15 \P (not Unicode property) */
-  OP_PROP,           /* 16 \p (Unicode property) */
-  OP_ANYNL,          /* 17 \R (any newline sequence) */
-  OP_NOT_HSPACE,     /* 18 \H (not horizontal whitespace) */
-  OP_HSPACE,         /* 19 \h (horizontal whitespace) */
-  OP_NOT_VSPACE,     /* 20 \V (not vertical whitespace) */
-  OP_VSPACE,         /* 21 \v (vertical whitespace) */
-  OP_EXTUNI,         /* 22 \X (extended Unicode sequence */
-  OP_EODN,           /* 23 End of data or \n at end of data (\Z) */
-  OP_EOD,            /* 24 End of data (\z) */
-
-  /* Line end assertions */
-
-  OP_DOLL,           /* 25 End of line - not multiline */
-  OP_DOLLM,          /* 26 End of line - multiline */
-  OP_CIRC,           /* 27 Start of line - not multiline */
-  OP_CIRCM,          /* 28 Start of line - multiline */
-
-  /* Single characters; caseful must precede the caseless ones */
-
-  OP_CHAR,           /* 29 Match one character, casefully */
-  OP_CHARI,          /* 30 Match one character, caselessly */
-  OP_NOT,            /* 31 Match one character, not the given one, casefully */
-  OP_NOTI,           /* 32 Match one character, not the given one, caselessly */
-
-  /* The following sets of 13 opcodes must always be kept in step because
-  the offset from the first one is used to generate the others. */
-
-  /* Repeated characters; caseful must precede the caseless ones */
-
-  OP_STAR,           /* 33 The maximizing and minimizing versions of */
-  OP_MINSTAR,        /* 34 these six opcodes must come in pairs, with */
-  OP_PLUS,           /* 35 the minimizing one second. */
-  OP_MINPLUS,        /* 36 */
-  OP_QUERY,          /* 37 */
-  OP_MINQUERY,       /* 38 */
-
-  OP_UPTO,           /* 39 From 0 to n matches of one character, caseful*/
-  OP_MINUPTO,        /* 40 */
-  OP_EXACT,          /* 41 Exactly n matches */
-
-  OP_POSSTAR,        /* 42 Possessified star, caseful */
-  OP_POSPLUS,        /* 43 Possessified plus, caseful */
-  OP_POSQUERY,       /* 44 Posesssified query, caseful */
-  OP_POSUPTO,        /* 45 Possessified upto, caseful */
-
-  /* Repeated characters; caseless must follow the caseful ones */
-
-  OP_STARI,          /* 46 */
-  OP_MINSTARI,       /* 47 */
-  OP_PLUSI,          /* 48 */
-  OP_MINPLUSI,       /* 49 */
-  OP_QUERYI,         /* 50 */
-  OP_MINQUERYI,      /* 51 */
-
-  OP_UPTOI,          /* 52 From 0 to n matches of one character, caseless */
-  OP_MINUPTOI,       /* 53 */
-  OP_EXACTI,         /* 54 */
-
-  OP_POSSTARI,       /* 55 Possessified star, caseless */
-  OP_POSPLUSI,       /* 56 Possessified plus, caseless */
-  OP_POSQUERYI,      /* 57 Posesssified query, caseless */
-  OP_POSUPTOI,       /* 58 Possessified upto, caseless */
-
-  /* The negated ones must follow the non-negated ones, and match them */
-  /* Negated repeated character, caseful; must precede the caseless ones */
-
-  OP_NOTSTAR,        /* 59 The maximizing and minimizing versions of */
-  OP_NOTMINSTAR,     /* 60 these six opcodes must come in pairs, with */
-  OP_NOTPLUS,        /* 61 the minimizing one second. They must be in */
-  OP_NOTMINPLUS,     /* 62 exactly the same order as those above. */
-  OP_NOTQUERY,       /* 63 */
-  OP_NOTMINQUERY,    /* 64 */
-
-  OP_NOTUPTO,        /* 65 From 0 to n matches, caseful */
-  OP_NOTMINUPTO,     /* 66 */
-  OP_NOTEXACT,       /* 67 Exactly n matches */
-
-  OP_NOTPOSSTAR,     /* 68 Possessified versions, caseful */
-  OP_NOTPOSPLUS,     /* 69 */
-  OP_NOTPOSQUERY,    /* 70 */
-  OP_NOTPOSUPTO,     /* 71 */
-
-  /* Negated repeated character, caseless; must follow the caseful ones */
-
-  OP_NOTSTARI,       /* 72 */
-  OP_NOTMINSTARI,    /* 73 */
-  OP_NOTPLUSI,       /* 74 */
-  OP_NOTMINPLUSI,    /* 75 */
-  OP_NOTQUERYI,      /* 76 */
-  OP_NOTMINQUERYI,   /* 77 */
-
-  OP_NOTUPTOI,       /* 78 From 0 to n matches, caseless */
-  OP_NOTMINUPTOI,    /* 79 */
-  OP_NOTEXACTI,      /* 80 Exactly n matches */
-
-  OP_NOTPOSSTARI,    /* 81 Possessified versions, caseless */
-  OP_NOTPOSPLUSI,    /* 82 */
-  OP_NOTPOSQUERYI,   /* 83 */
-  OP_NOTPOSUPTOI,    /* 84 */
-
-  /* Character types */
-
-  OP_TYPESTAR,       /* 85 The maximizing and minimizing versions of */
-  OP_TYPEMINSTAR,    /* 86 these six opcodes must come in pairs, with */
-  OP_TYPEPLUS,       /* 87 the minimizing one second. These codes must */
-  OP_TYPEMINPLUS,    /* 88 be in exactly the same order as those above. */
-  OP_TYPEQUERY,      /* 89 */
-  OP_TYPEMINQUERY,   /* 90 */
-
-  OP_TYPEUPTO,       /* 91 From 0 to n matches */
-  OP_TYPEMINUPTO,    /* 92 */
-  OP_TYPEEXACT,      /* 93 Exactly n matches */
-
-  OP_TYPEPOSSTAR,    /* 94 Possessified versions */
-  OP_TYPEPOSPLUS,    /* 95 */
-  OP_TYPEPOSQUERY,   /* 96 */
-  OP_TYPEPOSUPTO,    /* 97 */
-
-  /* These are used for character classes and back references; only the
-  first six are the same as the sets above. */
-
-  OP_CRSTAR,         /* 98 The maximizing and minimizing versions of */
-  OP_CRMINSTAR,      /* 99 all these opcodes must come in pairs, with */
-  OP_CRPLUS,         /* 100 the minimizing one second. These codes must */
-  OP_CRMINPLUS,      /* 101 be in exactly the same order as those above. */
-  OP_CRQUERY,        /* 102 */
-  OP_CRMINQUERY,     /* 103 */
-
-  OP_CRRANGE,        /* 104 These are different to the three sets above. */
-  OP_CRMINRANGE,     /* 105 */
-
-  OP_CRPOSSTAR,      /* 106 Possessified versions */
-  OP_CRPOSPLUS,      /* 107 */
-  OP_CRPOSQUERY,     /* 108 */
-  OP_CRPOSRANGE,     /* 109 */
-
-  /* End of quantifier opcodes */
-
-  OP_CLASS,          /* 110 Match a character class, chars < 256 only */
-  OP_NCLASS,         /* 111 Same, but the bitmap was created from a negative
-                              class - the difference is relevant only when a
-                              character > 255 is encountered. */
-  OP_XCLASS,         /* 112 Extended class for handling > 255 chars within the
-                              class. This does both positive and negative. */
-  OP_REF,            /* 113 Match a back reference, casefully */
-  OP_REFI,           /* 114 Match a back reference, caselessly */
-  OP_DNREF,          /* 115 Match a duplicate name backref, casefully */
-  OP_DNREFI,         /* 116 Match a duplicate name backref, caselessly */
-  OP_RECURSE,        /* 117 Match a numbered subpattern (possibly recursive) */
-  OP_CALLOUT,        /* 118 Call out to external function if provided */
-
-  OP_ALT,            /* 119 Start of alternation */
-  OP_KET,            /* 120 End of group that doesn't have an unbounded repeat */
-  OP_KETRMAX,        /* 121 These two must remain together and in this */
-  OP_KETRMIN,        /* 122 order. They are for groups the repeat for ever. */
-  OP_KETRPOS,        /* 123 Possessive unlimited repeat. */
-
-  /* The assertions must come before BRA, CBRA, ONCE, and COND, and the four
-  asserts must remain in order. */
-
-  OP_REVERSE,        /* 124 Move pointer back - used in lookbehind assertions */
-  OP_ASSERT,         /* 125 Positive lookahead */
-  OP_ASSERT_NOT,     /* 126 Negative lookahead */
-  OP_ASSERTBACK,     /* 127 Positive lookbehind */
-  OP_ASSERTBACK_NOT, /* 128 Negative lookbehind */
-
-  /* ONCE, ONCE_NC, BRA, BRAPOS, CBRA, CBRAPOS, and COND must come immediately
-  after the assertions, with ONCE first, as there's a test for >= ONCE for a
-  subpattern that isn't an assertion. The POS versions must immediately follow
-  the non-POS versions in each case. */
-
-  OP_ONCE,           /* 129 Atomic group, contains captures */
-  OP_ONCE_NC,        /* 130 Atomic group containing no captures */
-  OP_BRA,            /* 131 Start of non-capturing bracket */
-  OP_BRAPOS,         /* 132 Ditto, with unlimited, possessive repeat */
-  OP_CBRA,           /* 133 Start of capturing bracket */
-  OP_CBRAPOS,        /* 134 Ditto, with unlimited, possessive repeat */
-  OP_COND,           /* 135 Conditional group */
-
-  /* These five must follow the previous five, in the same order. There's a
-  check for >= SBRA to distinguish the two sets. */
-
-  OP_SBRA,           /* 136 Start of non-capturing bracket, check empty  */
-  OP_SBRAPOS,        /* 137 Ditto, with unlimited, possessive repeat */
-  OP_SCBRA,          /* 138 Start of capturing bracket, check empty */
-  OP_SCBRAPOS,       /* 139 Ditto, with unlimited, possessive repeat */
-  OP_SCOND,          /* 140 Conditional group, check empty */
-
-  /* The next two pairs must (respectively) be kept together. */
-
-  OP_CREF,           /* 141 Used to hold a capture number as condition */
-  OP_DNCREF,         /* 142 Used to point to duplicate names as a condition */
-  OP_RREF,           /* 143 Used to hold a recursion number as condition */
-  OP_DNRREF,         /* 144 Used to point to duplicate names as a condition */
-  OP_DEF,            /* 145 The DEFINE condition */
-
-  OP_BRAZERO,        /* 146 These two must remain together and in this */
-  OP_BRAMINZERO,     /* 147 order. */
-  OP_BRAPOSZERO,     /* 148 */
-
-  /* These are backtracking control verbs */
-
-  OP_MARK,           /* 149 always has an argument */
-  OP_PRUNE,          /* 150 */
-  OP_PRUNE_ARG,      /* 151 same, but with argument */
-  OP_SKIP,           /* 152 */
-  OP_SKIP_ARG,       /* 153 same, but with argument */
-  OP_THEN,           /* 154 */
-  OP_THEN_ARG,       /* 155 same, but with argument */
-  OP_COMMIT,         /* 156 */
-
-  /* These are forced failure and success verbs */
-
-  OP_FAIL,           /* 157 */
-  OP_ACCEPT,         /* 158 */
-  OP_ASSERT_ACCEPT,  /* 159 Used inside assertions */
-  OP_CLOSE,          /* 160 Used before OP_ACCEPT to close open captures */
-
-  /* This is used to skip a subpattern with a {0} quantifier */
-
-  OP_SKIPZERO,       /* 161 */
-
-  /* This is not an opcode, but is used to check that tables indexed by opcode
-  are the correct length, in order to catch updating errors - there have been
-  some in the past. */
-
-  OP_TABLE_LENGTH
-};
-
-/* *** NOTE NOTE NOTE *** Whenever the list above is updated, the two macro
-definitions that follow must also be updated to match. There are also tables
-called "opcode_possessify" in pcre_compile.c and "coptable" and "poptable" in
-pcre_dfa_exec.c that must be updated. */
-
-
-/* This macro defines textual names for all the opcodes. These are used only
-for debugging, and some of them are only partial names. The macro is referenced
-only in pcre_printint.c, which fills out the full names in many cases (and in
-some cases doesn't actually use these names at all). */
-
-#define OP_NAME_LIST \
-  "End", "\\A", "\\G", "\\K", "\\B", "\\b", "\\D", "\\d",         \
-  "\\S", "\\s", "\\W", "\\w", "Any", "AllAny", "Anybyte",         \
-  "notprop", "prop", "\\R", "\\H", "\\h", "\\V", "\\v",           \
-  "extuni",  "\\Z", "\\z",                                        \
-  "$", "$", "^", "^", "char", "chari", "not", "noti",             \
-  "*", "*?", "+", "+?", "?", "??",                                \
-  "{", "{", "{",                                                  \
-  "*+","++", "?+", "{",                                           \
-  "*", "*?", "+", "+?", "?", "??",                                \
-  "{", "{", "{",                                                  \
-  "*+","++", "?+", "{",                                           \
-  "*", "*?", "+", "+?", "?", "??",                                \
-  "{", "{", "{",                                                  \
-  "*+","++", "?+", "{",                                           \
-  "*", "*?", "+", "+?", "?", "??",                                \
-  "{", "{", "{",                                                  \
-  "*+","++", "?+", "{",                                           \
-  "*", "*?", "+", "+?", "?", "??", "{", "{", "{",                 \
-  "*+","++", "?+", "{",                                           \
-  "*", "*?", "+", "+?", "?", "??", "{", "{",                      \
-  "*+","++", "?+", "{",                                           \
-  "class", "nclass", "xclass", "Ref", "Refi", "DnRef", "DnRefi",  \
-  "Recurse", "Callout",                                           \
-  "Alt", "Ket", "KetRmax", "KetRmin", "KetRpos",                  \
-  "Reverse", "Assert", "Assert not", "AssertB", "AssertB not",    \
-  "Once", "Once_NC",                                              \
-  "Bra", "BraPos", "CBra", "CBraPos",                             \
-  "Cond",                                                         \
-  "SBra", "SBraPos", "SCBra", "SCBraPos",                         \
-  "SCond",                                                        \
-  "Cond ref", "Cond dnref", "Cond rec", "Cond dnrec", "Cond def", \
-  "Brazero", "Braminzero", "Braposzero",                          \
-  "*MARK", "*PRUNE", "*PRUNE", "*SKIP", "*SKIP",                  \
-  "*THEN", "*THEN", "*COMMIT", "*FAIL",                           \
-  "*ACCEPT", "*ASSERT_ACCEPT",                                    \
-  "Close", "Skip zero"
-
-
-/* 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,                 /* \A, \G, \K, \B, \b                     */ \
-  1, 1, 1, 1, 1, 1,              /* \D, \d, \S, \s, \W, \w                 */ \
-  1, 1, 1,                       /* Any, AllAny, Anybyte                   */ \
-  3, 3,                          /* \P, \p                                 */ \
-  1, 1, 1, 1, 1,                 /* \R, \H, \h, \V, \v                     */ \
-  1,                             /* \X                                     */ \
-  1, 1, 1, 1, 1, 1,              /* \Z, \z, $, $M ^, ^M                    */ \
-  2,                             /* Char  - the minimum length             */ \
-  2,                             /* Chari  - the minimum length            */ \
-  2,                             /* not                                    */ \
-  2,                             /* noti                                   */ \
-  /* Positive single-char repeats                             ** These are */ \
-  2, 2, 2, 2, 2, 2,              /* *, *?, +, +?, ?, ??       ** minima in */ \
-  2+IMM2_SIZE, 2+IMM2_SIZE,      /* upto, minupto             ** mode      */ \
-  2+IMM2_SIZE,                   /* exact                                  */ \
-  2, 2, 2, 2+IMM2_SIZE,          /* *+, ++, ?+, upto+                      */ \
-  2, 2, 2, 2, 2, 2,              /* *I, *?I, +I, +?I, ?I, ??I ** UTF-8     */ \
-  2+IMM2_SIZE, 2+IMM2_SIZE,      /* upto I, minupto I                      */ \
-  2+IMM2_SIZE,                   /* exact I                                */ \
-  2, 2, 2, 2+IMM2_SIZE,          /* *+I, ++I, ?+I, upto+I                  */ \
-  /* Negative single-char repeats - only for chars < 256                   */ \
-  2, 2, 2, 2, 2, 2,              /* NOT *, *?, +, +?, ?, ??                */ \
-  2+IMM2_SIZE, 2+IMM2_SIZE,      /* NOT upto, minupto                      */ \
-  2+IMM2_SIZE,                   /* NOT exact                              */ \
-  2, 2, 2, 2+IMM2_SIZE,          /* Possessive NOT *, +, ?, upto           */ \
-  2, 2, 2, 2, 2, 2,              /* NOT *I, *?I, +I, +?I, ?I, ??I          */ \
-  2+IMM2_SIZE, 2+IMM2_SIZE,      /* NOT upto I, minupto I                  */ \
-  2+IMM2_SIZE,                   /* NOT exact I                            */ \
-  2, 2, 2, 2+IMM2_SIZE,          /* Possessive NOT *I, +I, ?I, upto I      */ \
-  /* Positive type repeats                                                 */ \
-  2, 2, 2, 2, 2, 2,              /* Type *, *?, +, +?, ?, ??               */ \
-  2+IMM2_SIZE, 2+IMM2_SIZE,      /* Type upto, minupto                     */ \
-  2+IMM2_SIZE,                   /* Type exact                             */ \
-  2, 2, 2, 2+IMM2_SIZE,          /* Possessive *+, ++, ?+, upto+           */ \
-  /* Character class & ref repeats                                         */ \
-  1, 1, 1, 1, 1, 1,              /* *, *?, +, +?, ?, ??                    */ \
-  1+2*IMM2_SIZE, 1+2*IMM2_SIZE,  /* CRRANGE, CRMINRANGE                    */ \
-  1, 1, 1, 1+2*IMM2_SIZE,        /* Possessive *+, ++, ?+, CRPOSRANGE      */ \
-  1+(32/sizeof(pcre_uchar)),     /* CLASS                                  */ \
-  1+(32/sizeof(pcre_uchar)),     /* NCLASS                                 */ \
-  0,                             /* XCLASS - variable length               */ \
-  1+IMM2_SIZE,                   /* REF                                    */ \
-  1+IMM2_SIZE,                   /* REFI                                   */ \
-  1+2*IMM2_SIZE,                 /* DNREF                                  */ \
-  1+2*IMM2_SIZE,                 /* DNREFI                                 */ \
-  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,                   /* KetRpos                                */ \
-  1+LINK_SIZE,                   /* Reverse                                */ \
-  1+LINK_SIZE,                   /* Assert                                 */ \
-  1+LINK_SIZE,                   /* Assert not                             */ \
-  1+LINK_SIZE,                   /* Assert behind                          */ \
-  1+LINK_SIZE,                   /* Assert behind not                      */ \
-  1+LINK_SIZE,                   /* ONCE                                   */ \
-  1+LINK_SIZE,                   /* ONCE_NC                                */ \
-  1+LINK_SIZE,                   /* BRA                                    */ \
-  1+LINK_SIZE,                   /* BRAPOS                                 */ \
-  1+LINK_SIZE+IMM2_SIZE,         /* CBRA                                   */ \
-  1+LINK_SIZE+IMM2_SIZE,         /* CBRAPOS                                */ \
-  1+LINK_SIZE,                   /* COND                                   */ \
-  1+LINK_SIZE,                   /* SBRA                                   */ \
-  1+LINK_SIZE,                   /* SBRAPOS                                */ \
-  1+LINK_SIZE+IMM2_SIZE,         /* SCBRA                                  */ \
-  1+LINK_SIZE+IMM2_SIZE,         /* SCBRAPOS                               */ \
-  1+LINK_SIZE,                   /* SCOND                                  */ \
-  1+IMM2_SIZE, 1+2*IMM2_SIZE,    /* CREF, DNCREF                           */ \
-  1+IMM2_SIZE, 1+2*IMM2_SIZE,    /* RREF, DNRREF                           */ \
-  1,                             /* DEF                                    */ \
-  1, 1, 1,                       /* BRAZERO, BRAMINZERO, BRAPOSZERO        */ \
-  3, 1, 3,                       /* MARK, PRUNE, PRUNE_ARG                 */ \
-  1, 3,                          /* SKIP, SKIP_ARG                         */ \
-  1, 3,                          /* THEN, THEN_ARG                         */ \
-  1, 1, 1, 1,                    /* COMMIT, FAIL, ACCEPT, ASSERT_ACCEPT    */ \
-  1+IMM2_SIZE, 1                 /* CLOSE, SKIPZERO                        */
-
-/* A magic value for OP_RREF to indicate the "any recursion" condition. */
-
-#define RREF_ANY  0xffff
-
-/* Compile time error code numbers. They are given names so that they can more
-easily be tracked. When a new number is added, the table called eint in
-pcreposix.c must be updated. */
-
-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, ERR48, ERR49,
-       ERR50, ERR51, ERR52, ERR53, ERR54, ERR55, ERR56, ERR57, ERR58, ERR59,
-       ERR60, ERR61, ERR62, ERR63, ERR64, ERR65, ERR66, ERR67, ERR68, ERR69,
-       ERR70, ERR71, ERR72, ERR73, ERR74, ERR75, ERR76, ERR77, ERR78, ERR79,
-       ERR80, ERR81, ERR82, ERR83, ERR84, ERR85, ERR86, ERRCOUNT };
-
-/* JIT compiling modes. The function list is indexed by them. */
-
-enum { JIT_COMPILE, JIT_PARTIAL_SOFT_COMPILE, JIT_PARTIAL_HARD_COMPILE,
-       JIT_NUMBER_OF_COMPILE_MODES };
-
-/* 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.
-
-The size of the structure must be a multiple of 8 bytes. For the case of
-compiled-on-4 and run-on-8, we include an extra pointer that is always NULL so
-that there are an even number of pointers which therefore are a multiple of 8
-bytes.
-
-It is necessary to fork the struct for the 32 bit library, since it needs to
-use pcre_uint32 for first_char and req_char. We can't put an ifdef inside the
-typedef because pcretest needs access to the struct of the 8-, 16- and 32-bit
-variants.
-
-*** WARNING ***
-When new fields are added to these structures, remember to adjust the code in
-pcre_byte_order.c that is concerned with swapping the byte order of the fields
-when a compiled regex is reloaded on a host with different endianness.
-*** WARNING ***
-There is also similar byte-flipping code in pcretest.c, which is used for
-testing the byte-flipping features. It must also be kept in step.
-*** WARNING ***
-*/
-
-typedef struct real_pcre8_or_16 {
-  pcre_uint32 magic_number;
-  pcre_uint32 size;               /* Total that was malloced */
-  pcre_uint32 options;            /* Public options */
-  pcre_uint32 flags;              /* Private flags */
-  pcre_uint32 limit_match;        /* Limit set from regex */
-  pcre_uint32 limit_recursion;    /* Limit set from regex */
-  pcre_uint16 first_char;         /* Starting character */
-  pcre_uint16 req_char;           /* This character must be seen */
-  pcre_uint16 max_lookbehind;     /* Longest lookbehind (characters) */
-  pcre_uint16 top_bracket;        /* Highest numbered group */
-  pcre_uint16 top_backref;        /* Highest numbered back reference */
-  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 */
-  pcre_uint16 dummy1;             /* To ensure size is a multiple of 8 */
-  pcre_uint16 dummy2;             /* To ensure size is a multiple of 8 */
-  pcre_uint16 dummy3;             /* To ensure size is a multiple of 8 */
-  const pcre_uint8 *tables;       /* Pointer to tables or NULL for std */
-  void             *nullpad;      /* NULL padding */
-} real_pcre8_or_16;
-
-typedef struct real_pcre8_or_16 real_pcre;
-typedef struct real_pcre8_or_16 real_pcre16;
-
-typedef struct real_pcre32 {
-  pcre_uint32 magic_number;
-  pcre_uint32 size;               /* Total that was malloced */
-  pcre_uint32 options;            /* Public options */
-  pcre_uint32 flags;              /* Private flags */
-  pcre_uint32 limit_match;        /* Limit set from regex */
-  pcre_uint32 limit_recursion;    /* Limit set from regex */
-  pcre_uint32 first_char;         /* Starting character */
-  pcre_uint32 req_char;           /* This character must be seen */
-  pcre_uint16 max_lookbehind;     /* Longest lookbehind (characters) */
-  pcre_uint16 top_bracket;        /* Highest numbered group */
-  pcre_uint16 top_backref;        /* Highest numbered back reference */
-  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 */
-  pcre_uint16 dummy;              /* To ensure size is a multiple of 8 */
-  const pcre_uint8 *tables;       /* Pointer to tables or NULL for std */
-  void             *nullpad;      /* NULL padding */
-} real_pcre32;
-
-#if defined COMPILE_PCRE8
-#define REAL_PCRE real_pcre
-#elif defined COMPILE_PCRE16
-#define REAL_PCRE real_pcre16
-#elif defined COMPILE_PCRE32
-#define REAL_PCRE real_pcre32
-#endif
-
-/* Assert that the size of REAL_PCRE is divisible by 8 */
-typedef int __assert_real_pcre_size_divisible_8[(sizeof(REAL_PCRE) % 8) == 0 ? 1 : -1];
-
-/* Needed in pcretest to access some fields in the real_pcre* structures
- * directly. They're unified for 8/16/32 bits since the structs only differ
- * after these fields; if that ever changes, need to fork those defines into
- * 8/16 and 32 bit versions. */
-#define REAL_PCRE_MAGIC(re)     (((REAL_PCRE*)re)->magic_number)
-#define REAL_PCRE_SIZE(re)      (((REAL_PCRE*)re)->size)
-#define REAL_PCRE_OPTIONS(re)   (((REAL_PCRE*)re)->options)
-#define REAL_PCRE_FLAGS(re)     (((REAL_PCRE*)re)->flags)
-
-/* 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 flags;              /* Private flags */
-  pcre_uint8 start_bits[32];      /* Starting char bits */
-  pcre_uint32 minlength;          /* Minimum subject length */
-} pcre_study_data;
-
-/* Structure for building a chain of open capturing subpatterns during
-compiling, so that instructions to close them can be compiled when (*ACCEPT) is
-encountered. This is also used to identify subpatterns that contain recursive
-back references to themselves, so that they can be made atomic. */
-
-typedef struct open_capitem {
-  struct open_capitem *next;    /* Chain link */
-  pcre_uint16 number;           /* Capture number */
-  pcre_uint16 flag;             /* Set TRUE if recursive back ref */
-} open_capitem;
-
-/* Structure for building a list of named groups during the first pass of
-compiling. */
-
-typedef struct named_group {
-  const pcre_uchar  *name;          /* Points to the name in the pattern */
-  int                length;        /* Length of the name */
-  pcre_uint32        number;        /* Group number */
-} named_group;
-
-/* Structure for passing "static" information around between the functions
-doing the compiling, so that they are thread-safe. */
-
-typedef struct compile_data {
-  const pcre_uint8 *lcc;            /* Points to lower casing table */
-  const pcre_uint8 *fcc;            /* Points to case-flipping table */
-  const pcre_uint8 *cbits;          /* Points to character type table */
-  const pcre_uint8 *ctypes;         /* Points to table of type maps */
-  const pcre_uchar *start_workspace;/* The start of working space */
-  const pcre_uchar *start_code;     /* The start of the compiled code */
-  const pcre_uchar *start_pattern;  /* The start of the pattern */
-  const pcre_uchar *end_pattern;    /* The end of the pattern */
-  pcre_uchar *hwm;                  /* High watermark of workspace */
-  open_capitem *open_caps;          /* Chain of open capture items */
-  named_group *named_groups;        /* Points to vector in pre-compile */
-  pcre_uchar *name_table;           /* The name/number table */
-  int  names_found;                 /* Number of entries so far */
-  int  name_entry_size;             /* Size of each entry */
-  int  named_group_list_size;       /* Number of entries in the list */
-  int  workspace_size;              /* Size of workspace */
-  unsigned int bracount;            /* Count of capturing parens as we compile */
-  int  final_bracount;              /* Saved value after first pass */
-  int  max_lookbehind;              /* Maximum lookbehind (characters) */
-  int  top_backref;                 /* Maximum back reference */
-  unsigned int backref_map;         /* Bitmap of low back refs */
-  unsigned int namedrefcount;       /* Number of backreferences by name */
-  int  parens_depth;                /* Depth of nested parentheses */
-  int  assert_depth;                /* Depth of nested assertions */
-  pcre_uint32 external_options;     /* External (initial) options */
-  pcre_uint32 external_flags;       /* External flag bits to be set */
-  int  req_varyopt;                 /* "After variable item" flag for reqbyte */
-  BOOL had_accept;                  /* (*ACCEPT) encountered */
-  BOOL had_pruneorskip;             /* (*PRUNE) or (*SKIP) encountered */
-  BOOL check_lookbehind;            /* Lookbehinds need later checking */
-  BOOL dupnames;                    /* Duplicate names exist */
-  BOOL dupgroups;                   /* Duplicate groups exist: (?| found */
-  BOOL iscondassert;                /* Next assert is a condition */
-  int  nltype;                      /* Newline type */
-  int  nllen;                       /* Newline string length */
-  pcre_uchar nl[4];                 /* Newline string when fixed length */
-} compile_data;
-
-/* Structure for maintaining a chain of pointers to the currently incomplete
-branches, for testing for left recursion while compiling. */
-
-typedef struct branch_chain {
-  struct branch_chain *outer;
-  pcre_uchar *current_branch;
-} branch_chain;
-
-/* Structure for mutual recursion detection. */
-
-typedef struct recurse_check {
-  struct recurse_check *prev;
-  const pcre_uchar *group;
-} recurse_check;
-
-/* Structure for items in a linked list that represents an explicit recursive
-call within the pattern; used by pcre_exec(). */
-
-typedef struct recursion_info {
-  struct recursion_info *prevrec; /* Previous recursion record (or NULL) */
-  unsigned int group_num;         /* Number of group that was called */
-  int *offset_save;               /* Pointer to start of saved offsets */
-  int saved_max;                  /* Number of saved offsets */
-  int saved_capture_last;         /* Last capture number */
-  PCRE_PUCHAR subject_position;   /* Position at start of recursion */
-} recursion_info;
-
-/* A similar structure for pcre_dfa_exec(). */
-
-typedef struct dfa_recursion_info {
-  struct dfa_recursion_info *prevrec;
-  int group_num;
-  PCRE_PUCHAR subject_position;
-} dfa_recursion_info;
-
-/* Structure for building a chain of data 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; used by
-pcre_exec(). */
-
-typedef struct eptrblock {
-  struct eptrblock *epb_prev;
-  PCRE_PUCHAR epb_saved_eptr;
-} eptrblock;
-
-
-/* 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 */
-  unsigned long int match_limit_recursion; /* As it says */
-  int   *offset_vector;           /* Offset vector */
-  int    offset_end;              /* One past the end */
-  int    offset_max;              /* The maximum usable for return data */
-  int    nltype;                  /* Newline type */
-  int    nllen;                   /* Newline string length */
-  int    name_count;              /* Number of names in name table */
-  int    name_entry_size;         /* Size of entry in names table */
-  unsigned int skip_arg_count;    /* For counting SKIP_ARGs */
-  unsigned int ignore_skip_arg;   /* For re-run when SKIP arg name not found */
-  pcre_uchar *name_table;         /* Table of names */
-  pcre_uchar nl[4];               /* Newline string when fixed */
-  const  pcre_uint8 *lcc;         /* Points to lower casing table */
-  const  pcre_uint8 *fcc;         /* Points to case-flipping table */
-  const  pcre_uint8 *ctypes;      /* Points to table of type maps */
-  BOOL   notbol;                  /* NOTBOL flag */
-  BOOL   noteol;                  /* NOTEOL flag */
-  BOOL   utf;                     /* UTF-8 / UTF-16 flag */
-  BOOL   jscript_compat;          /* JAVASCRIPT_COMPAT flag */
-  BOOL   use_ucp;                 /* PCRE_UCP flag */
-  BOOL   endonly;                 /* Dollar not before final \n */
-  BOOL   notempty;                /* Empty string match not wanted */
-  BOOL   notempty_atstart;        /* Empty string match at start not wanted */
-  BOOL   hitend;                  /* Hit the end of the subject at some point */
-  BOOL   bsr_anycrlf;             /* \R is just any CRLF, not full Unicode */
-  BOOL   hasthen;                 /* Pattern contains (*THEN) */
-  const  pcre_uchar *start_code;  /* For use when recursing */
-  PCRE_PUCHAR start_subject;      /* Start of the subject string */
-  PCRE_PUCHAR end_subject;        /* End of the subject string */
-  PCRE_PUCHAR start_match_ptr;    /* Start of matched string */
-  PCRE_PUCHAR end_match_ptr;      /* Subject position at end match */
-  PCRE_PUCHAR start_used_ptr;     /* Earliest consulted character */
-  int    partial;                 /* PARTIAL options */
-  int    end_offset_top;          /* Highwater mark at end of match */
-  pcre_int32 capture_last;        /* Most recent capture number + overflow flag */
-  int    start_offset;            /* The start offset value */
-  int    match_function_type;     /* Set for certain special calls of MATCH() */
-  eptrblock *eptrchain;           /* Chain of eptrblocks for tail recursions */
-  int    eptrn;                   /* Next free eptrblock */
-  recursion_info *recursive;      /* Linked list of recursion data */
-  void  *callout_data;            /* To pass back to callouts */
-  const  pcre_uchar *mark;        /* Mark pointer to pass back on success */
-  const  pcre_uchar *nomatch_mark;/* Mark pointer to pass back on failure */
-  const  pcre_uchar *once_target; /* Where to back up to for atomic groups */
-#ifdef NO_RECURSE
-  void  *match_frames_base;       /* For remembering malloc'd frames */
-#endif
-} match_data;
-
-/* A similar structure is used for the same purpose by the DFA matching
-functions. */
-
-typedef struct dfa_match_data {
-  const pcre_uchar *start_code;     /* Start of the compiled pattern */
-  const pcre_uchar *start_subject ; /* Start of the subject string */
-  const pcre_uchar *end_subject;    /* End of subject string */
-  const pcre_uchar *start_used_ptr; /* Earliest consulted character */
-  const pcre_uint8 *tables;         /* Character tables */
-  int   start_offset;               /* The start offset value */
-  int   moptions;                   /* Match options */
-  int   poptions;                   /* Pattern options */
-  int   nltype;                     /* Newline type */
-  int   nllen;                      /* Newline string length */
-  pcre_uchar nl[4];                 /* Newline string when fixed */
-  void *callout_data;               /* To pass back to callouts */
-  dfa_recursion_info *recursive;    /* Linked list of recursion data */
-} 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   /* alphanumeric 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)
-
-/* Internal function and data prefixes. */
-
-#if defined COMPILE_PCRE8
-#ifndef PUBL
-#define PUBL(name) pcre_##name
-#endif
-#ifndef PRIV
-#define PRIV(name) _pcre_##name
-#endif
-#elif defined COMPILE_PCRE16
-#ifndef PUBL
-#define PUBL(name) pcre16_##name
-#endif
-#ifndef PRIV
-#define PRIV(name) _pcre16_##name
-#endif
-#elif defined COMPILE_PCRE32
-#ifndef PUBL
-#define PUBL(name) pcre32_##name
-#endif
-#ifndef PRIV
-#define PRIV(name) _pcre32_##name
-#endif
-#else
-#error Unsupported compiling mode
-#endif /* COMPILE_PCRE[8|16|32] */
-
-/* Layout of the UCP type table that translates property names into types and
-codes. Each entry used to point directly to a name, but to reduce the number of
-relocations in shared libraries, it now has an offset into a single string
-instead. */
-
-typedef struct {
-  pcre_uint16 name_offset;
-  pcre_uint16 type;
-  pcre_uint16 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. */
-
-#ifdef COMPILE_PCRE8
-extern const int            PRIV(utf8_table1)[];
-extern const int            PRIV(utf8_table1_size);
-extern const int            PRIV(utf8_table2)[];
-extern const int            PRIV(utf8_table3)[];
-extern const pcre_uint8     PRIV(utf8_table4)[];
-#endif /* COMPILE_PCRE8 */
-
-extern const char           PRIV(utt_names)[];
-extern const ucp_type_table PRIV(utt)[];
-extern const int            PRIV(utt_size);
-
-extern const pcre_uint8     PRIV(OP_lengths)[];
-extern const pcre_uint8     PRIV(default_tables)[];
-
-extern const pcre_uint32    PRIV(hspace_list)[];
-extern const pcre_uint32    PRIV(vspace_list)[];
-
-
-/* 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. */
-
-/* String comparison functions. */
-#if defined COMPILE_PCRE8
-
-#define STRCMP_UC_UC(str1, str2) \
-  strcmp((char *)(str1), (char *)(str2))
-#define STRCMP_UC_C8(str1, str2) \
-  strcmp((char *)(str1), (str2))
-#define STRNCMP_UC_UC(str1, str2, num) \
-  strncmp((char *)(str1), (char *)(str2), (num))
-#define STRNCMP_UC_C8(str1, str2, num) \
-  strncmp((char *)(str1), (str2), (num))
-#define STRLEN_UC(str) strlen((const char *)str)
-
-#elif defined COMPILE_PCRE16 || defined COMPILE_PCRE32
-
-extern int               PRIV(strcmp_uc_uc)(const pcre_uchar *,
-                           const pcre_uchar *);
-extern int               PRIV(strcmp_uc_c8)(const pcre_uchar *,
-                           const char *);
-extern int               PRIV(strncmp_uc_uc)(const pcre_uchar *,
-                           const pcre_uchar *, unsigned int num);
-extern int               PRIV(strncmp_uc_c8)(const pcre_uchar *,
-                           const char *, unsigned int num);
-extern unsigned int      PRIV(strlen_uc)(const pcre_uchar *str);
-
-#define STRCMP_UC_UC(str1, str2) \
-  PRIV(strcmp_uc_uc)((str1), (str2))
-#define STRCMP_UC_C8(str1, str2) \
-  PRIV(strcmp_uc_c8)((str1), (str2))
-#define STRNCMP_UC_UC(str1, str2, num) \
-  PRIV(strncmp_uc_uc)((str1), (str2), (num))
-#define STRNCMP_UC_C8(str1, str2, num) \
-  PRIV(strncmp_uc_c8)((str1), (str2), (num))
-#define STRLEN_UC(str) PRIV(strlen_uc)(str)
-
-#endif /* COMPILE_PCRE[8|16|32] */
-
-#if defined COMPILE_PCRE8 || defined COMPILE_PCRE16
-
-#define STRCMP_UC_UC_TEST(str1, str2) STRCMP_UC_UC(str1, str2)
-#define STRCMP_UC_C8_TEST(str1, str2) STRCMP_UC_C8(str1, str2)
-
-#elif defined COMPILE_PCRE32
-
-extern int               PRIV(strcmp_uc_uc_utf)(const pcre_uchar *,
-                           const pcre_uchar *);
-extern int               PRIV(strcmp_uc_c8_utf)(const pcre_uchar *,
-                           const char *);
-
-#define STRCMP_UC_UC_TEST(str1, str2) \
-  (utf ? PRIV(strcmp_uc_uc_utf)((str1), (str2)) : PRIV(strcmp_uc_uc)((str1), (str2)))
-#define STRCMP_UC_C8_TEST(str1, str2) \
-  (utf ? PRIV(strcmp_uc_c8_utf)((str1), (str2)) : PRIV(strcmp_uc_c8)((str1), (str2)))
-
-#endif /* COMPILE_PCRE[8|16|32] */
-
-extern const pcre_uchar *PRIV(find_bracket)(const pcre_uchar *, BOOL, int);
-extern BOOL              PRIV(is_newline)(PCRE_PUCHAR, int, PCRE_PUCHAR,
-                           int *, BOOL);
-extern unsigned int      PRIV(ord2utf)(pcre_uint32, pcre_uchar *);
-extern int               PRIV(valid_utf)(PCRE_PUCHAR, int, int *);
-extern BOOL              PRIV(was_newline)(PCRE_PUCHAR, int, PCRE_PUCHAR,
-                           int *, BOOL);
-extern BOOL              PRIV(xclass)(pcre_uint32, const pcre_uchar *, BOOL);
-
-#ifdef SUPPORT_JIT
-extern void              PRIV(jit_compile)(const REAL_PCRE *,
-                           PUBL(extra) *, int);
-extern int               PRIV(jit_exec)(const PUBL(extra) *,
-                           const pcre_uchar *, int, int, int, int *, int);
-extern void              PRIV(jit_free)(void *);
-extern int               PRIV(jit_get_size)(void *);
-extern const char*       PRIV(jit_get_target)(void);
-#endif
-
-/* Unicode character database (UCD) */
-
-typedef struct {
-  pcre_uint8 script;     /* ucp_Arabic, etc. */
-  pcre_uint8 chartype;   /* ucp_Cc, etc. (general categories) */
-  pcre_uint8 gbprop;     /* ucp_gbControl, etc. (grapheme break property) */
-  pcre_uint8 caseset;    /* offset to multichar other cases or zero */
-  pcre_int32 other_case; /* offset to other case, or zero if none */
-} ucd_record;
-
-extern const pcre_uint32 PRIV(ucd_caseless_sets)[];
-extern const ucd_record  PRIV(ucd_records)[];
-extern const pcre_uint8  PRIV(ucd_stage1)[];
-extern const pcre_uint16 PRIV(ucd_stage2)[];
-extern const pcre_uint32 PRIV(ucp_gentype)[];
-extern const pcre_uint32 PRIV(ucp_gbtable)[];
-#ifdef SUPPORT_JIT
-extern const int         PRIV(ucp_typerange)[];
-#endif
-
-#ifdef SUPPORT_UCP
-/* UCD access macros */
-
-#define UCD_BLOCK_SIZE 128
-#define GET_UCD(ch) (PRIV(ucd_records) + \
-        PRIV(ucd_stage2)[PRIV(ucd_stage1)[(int)(ch) / UCD_BLOCK_SIZE] * \
-        UCD_BLOCK_SIZE + (int)(ch) % UCD_BLOCK_SIZE])
-
-#define UCD_CHARTYPE(ch)    GET_UCD(ch)->chartype
-#define UCD_SCRIPT(ch)      GET_UCD(ch)->script
-#define UCD_CATEGORY(ch)    PRIV(ucp_gentype)[UCD_CHARTYPE(ch)]
-#define UCD_GRAPHBREAK(ch)  GET_UCD(ch)->gbprop
-#define UCD_CASESET(ch)     GET_UCD(ch)->caseset
-#define UCD_OTHERCASE(ch)   ((pcre_uint32)((int)ch + (int)(GET_UCD(ch)->other_case)))
-
-#endif /* SUPPORT_UCP */
-
-#endif
-
-/* End of pcre_internal.h */
diff --git a/dist/pcre_jit_test.c b/dist/pcre_jit_test.c
deleted file mode 100644
index 1737895..0000000
--- a/dist/pcre_jit_test.c
+++ /dev/null
@@ -1,1738 +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.
-
-                  Main Library written by Philip Hazel
-           Copyright (c) 1997-2012 University of Cambridge
-
-  This JIT compiler regression test program was written by Zoltan Herczeg
-                      Copyright (c) 2010-2012
-
------------------------------------------------------------------------------
-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.
------------------------------------------------------------------------------
-*/
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <stdio.h>
-#include <string.h>
-#include "pcre.h"
-
-
-#include "pcre_internal.h"
-
-/*
- Letter characters:
-   \xe6\x92\xad = 0x64ad = 25773 (kanji)
- Non-letter characters:
-   \xc2\xa1 = 0xa1 =  (Inverted Exclamation Mark)
-   \xf3\xa9\xb7\x80 = 0xe9dc0 = 957888
-   \xed\xa0\x80 = 55296 = 0xd800 (Invalid UTF character)
-   \xed\xb0\x80 = 56320 = 0xdc00 (Invalid UTF character)
- Newlines:
-   \xc2\x85 = 0x85 = 133 (NExt Line = NEL)
-   \xe2\x80\xa8 = 0x2028 = 8232 (Line Separator)
- Othercase pairs:
-   \xc3\xa9 = 0xe9 = 233 (e')
-      \xc3\x89 = 0xc9 = 201 (E')
-   \xc3\xa1 = 0xe1 = 225 (a')
-      \xc3\x81 = 0xc1 = 193 (A')
-   \x53 = 0x53 = S
-     \x73 = 0x73 = s
-     \xc5\xbf = 0x17f = 383 (long S)
-   \xc8\xba = 0x23a = 570
-      \xe2\xb1\xa5 = 0x2c65 = 11365
-   \xe1\xbd\xb8 = 0x1f78 = 8056
-      \xe1\xbf\xb8 = 0x1ff8 = 8184
-   \xf0\x90\x90\x80 = 0x10400 = 66560
-      \xf0\x90\x90\xa8 = 0x10428 = 66600
-   \xc7\x84 = 0x1c4 = 452
-     \xc7\x85 = 0x1c5 = 453
-     \xc7\x86 = 0x1c6 = 454
- Caseless sets:
-   ucp_Armenian - \x{531}-\x{556} -> \x{561}-\x{586}
-   ucp_Coptic - \x{2c80}-\x{2ce3} -> caseless: XOR 0x1
-   ucp_Latin - \x{ff21}-\x{ff3a} -> \x{ff41]-\x{ff5a}
-
- Mark property:
-   \xcc\x8d = 0x30d = 781
- Special:
-   \xc2\x80 = 0x80 = 128 (lowest 2 byte character)
-   \xdf\xbf = 0x7ff = 2047 (highest 2 byte character)
-   \xe0\xa0\x80 = 0x800 = 2048 (lowest 2 byte character)
-   \xef\xbf\xbf = 0xffff = 65535 (highest 3 byte character)
-   \xf0\x90\x80\x80 = 0x10000 = 65536 (lowest 4 byte character)
-   \xf4\x8f\xbf\xbf = 0x10ffff = 1114111 (highest allowed utf character)
-*/
-
-static int regression_tests(void);
-
-int main(void)
-{
-	int jit = 0;
-#if defined SUPPORT_PCRE8
-	pcre_config(PCRE_CONFIG_JIT, &jit);
-#elif defined SUPPORT_PCRE16
-	pcre16_config(PCRE_CONFIG_JIT, &jit);
-#elif defined SUPPORT_PCRE32
-	pcre32_config(PCRE_CONFIG_JIT, &jit);
-#endif
-	if (!jit) {
-		printf("JIT must be enabled to run pcre_jit_test\n");
-		return 1;
-	}
-	return regression_tests();
-}
-
-/* --------------------------------------------------------------------------------------- */
-
-#if !(defined SUPPORT_PCRE8) && !(defined SUPPORT_PCRE16) && !(defined SUPPORT_PCRE32)
-#error SUPPORT_PCRE8 or SUPPORT_PCRE16 or SUPPORT_PCRE32 must be defined
-#endif
-
-#define MUA	(PCRE_MULTILINE | PCRE_UTF8 | PCRE_NEWLINE_ANYCRLF)
-#define MUAP	(PCRE_MULTILINE | PCRE_UTF8 | PCRE_NEWLINE_ANYCRLF | PCRE_UCP)
-#define CMUA	(PCRE_CASELESS | PCRE_MULTILINE | PCRE_UTF8 | PCRE_NEWLINE_ANYCRLF)
-#define CMUAP	(PCRE_CASELESS | PCRE_MULTILINE | PCRE_UTF8 | PCRE_NEWLINE_ANYCRLF | PCRE_UCP)
-#define MA	(PCRE_MULTILINE | PCRE_NEWLINE_ANYCRLF)
-#define MAP	(PCRE_MULTILINE | PCRE_NEWLINE_ANYCRLF | PCRE_UCP)
-#define CMA	(PCRE_CASELESS | PCRE_MULTILINE | PCRE_NEWLINE_ANYCRLF)
-
-#define OFFSET_MASK	0x00ffff
-#define F_NO8		0x010000
-#define F_NO16		0x020000
-#define F_NO32		0x020000
-#define F_NOMATCH	0x040000
-#define F_DIFF		0x080000
-#define F_FORCECONV	0x100000
-#define F_PROPERTY	0x200000
-#define F_STUDY		0x400000
-
-struct regression_test_case {
-	int flags;
-	int start_offset;
-	const char *pattern;
-	const char *input;
-};
-
-static struct regression_test_case regression_test_cases[] = {
-	/* Constant strings. */
-	{ MUA, 0, "AbC", "AbAbC" },
-	{ MUA, 0, "ACCEPT", "AACACCACCEACCEPACCEPTACCEPTT" },
-	{ CMUA, 0, "aA#\xc3\xa9\xc3\x81", "aA#Aa#\xc3\x89\xc3\xa1" },
-	{ MA, 0, "[^a]", "aAbB" },
-	{ CMA, 0, "[^m]", "mMnN" },
-	{ MA, 0, "a[^b][^#]", "abacd" },
-	{ CMA, 0, "A[^B][^E]", "abacd" },
-	{ CMUA, 0, "[^x][^#]", "XxBll" },
-	{ MUA, 0, "[^a]", "aaa\xc3\xa1#Ab" },
-	{ CMUA, 0, "[^A]", "aA\xe6\x92\xad" },
-	{ MUA, 0, "\\W(\\W)?\\w", "\r\n+bc" },
-	{ MUA, 0, "\\W(\\W)?\\w", "\n\r+bc" },
-	{ MUA, 0, "\\W(\\W)?\\w", "\r\r+bc" },
-	{ MUA, 0, "\\W(\\W)?\\w", "\n\n+bc" },
-	{ MUA, 0, "[axd]", "sAXd" },
-	{ CMUA, 0, "[axd]", "sAXd" },
-	{ CMUA, 0 | F_NOMATCH, "[^axd]", "DxA" },
-	{ MUA, 0, "[a-dA-C]", "\xe6\x92\xad\xc3\xa9.B" },
-	{ MUA, 0, "[^a-dA-C]", "\xe6\x92\xad\xc3\xa9" },
-	{ CMUA, 0, "[^\xc3\xa9]", "\xc3\xa9\xc3\x89." },
-	{ MUA, 0, "[^\xc3\xa9]", "\xc3\xa9\xc3\x89." },
-	{ MUA, 0, "[^a]", "\xc2\x80[]" },
-	{ CMUA, 0, "\xf0\x90\x90\xa7", "\xf0\x90\x91\x8f" },
-	{ CMA, 0, "1a2b3c4", "1a2B3c51A2B3C4" },
-	{ PCRE_CASELESS, 0, "\xff#a", "\xff#\xff\xfe##\xff#A" },
-	{ PCRE_CASELESS, 0, "\xfe", "\xff\xfc#\xfe\xfe" },
-	{ PCRE_CASELESS, 0, "a1", "Aa1" },
-	{ MA, 0, "\\Ca", "cda" },
-	{ CMA, 0, "\\Ca", "CDA" },
-	{ MA, 0 | F_NOMATCH, "\\Cx", "cda" },
-	{ CMA, 0 | F_NOMATCH, "\\Cx", "CDA" },
-	{ CMUAP, 0, "\xf0\x90\x90\x80\xf0\x90\x90\xa8", "\xf0\x90\x90\xa8\xf0\x90\x90\x80" },
-	{ CMUAP, 0, "\xf0\x90\x90\x80{2}", "\xf0\x90\x90\x80#\xf0\x90\x90\xa8\xf0\x90\x90\x80" },
-	{ CMUAP, 0, "\xf0\x90\x90\xa8{2}", "\xf0\x90\x90\x80#\xf0\x90\x90\xa8\xf0\x90\x90\x80" },
-	{ CMUAP, 0, "\xe1\xbd\xb8\xe1\xbf\xb8", "\xe1\xbf\xb8\xe1\xbd\xb8" },
-	{ MA, 0, "[3-57-9]", "5" },
-
-	/* Assertions. */
-	{ MUA, 0, "\\b[^A]", "A_B#" },
-	{ MA, 0 | F_NOMATCH, "\\b\\W", "\n*" },
-	{ MUA, 0, "\\B[^,]\\b[^s]\\b", "#X" },
-	{ MAP, 0, "\\B", "_\xa1" },
-	{ MAP, 0, "\\b_\\b[,A]\\B", "_," },
-	{ MUAP, 0, "\\b", "\xe6\x92\xad!" },
-	{ MUAP, 0, "\\B", "_\xc2\xa1\xc3\xa1\xc2\x85" },
-	{ MUAP, 0, "\\b[^A]\\B[^c]\\b[^_]\\B", "_\xc3\xa1\xe2\x80\xa8" },
-	{ MUAP, 0, "\\b\\w+\\B", "\xc3\x89\xc2\xa1\xe6\x92\xad\xc3\x81\xc3\xa1" },
-	{ MUA, 0 | F_NOMATCH, "\\b.", "\xcd\xbe" },
-	{ CMUAP, 0, "\\By", "\xf0\x90\x90\xa8y" },
-	{ MA, 0 | F_NOMATCH, "\\R^", "\n" },
-	{ MA, 1 | F_NOMATCH, "^", "\n" },
-	{ 0, 0, "^ab", "ab" },
-	{ 0, 0 | F_NOMATCH, "^ab", "aab" },
-	{ PCRE_MULTILINE | PCRE_NEWLINE_CRLF, 0, "^a", "\r\raa\n\naa\r\naa" },
-	{ PCRE_MULTILINE | PCRE_UTF8 | PCRE_NEWLINE_ANYCRLF, 0, "^-", "\xe2\x80\xa8--\xc2\x85-\r\n-" },
-	{ PCRE_MULTILINE | PCRE_NEWLINE_ANY, 0, "^-", "a--b--\x85--" },
-	{ PCRE_MULTILINE | PCRE_UTF8 | PCRE_NEWLINE_ANY, 0, "^-", "a--\xe2\x80\xa8--" },
-	{ PCRE_MULTILINE | PCRE_UTF8 | PCRE_NEWLINE_ANY, 0, "^-", "a--\xc2\x85--" },
-	{ 0, 0, "ab$", "ab" },
-	{ 0, 0 | F_NOMATCH, "ab$", "abab\n\n" },
-	{ PCRE_DOLLAR_ENDONLY, 0 | F_NOMATCH, "ab$", "abab\r\n" },
-	{ PCRE_MULTILINE | PCRE_NEWLINE_CRLF, 0, "a$", "\r\raa\n\naa\r\naa" },
-	{ PCRE_MULTILINE | PCRE_NEWLINE_ANY, 0, "a$", "aaa" },
-	{ PCRE_MULTILINE | PCRE_UTF8 | PCRE_NEWLINE_ANYCRLF, 0, "#$", "#\xc2\x85###\r#" },
-	{ PCRE_MULTILINE | PCRE_UTF8 | PCRE_NEWLINE_ANY, 0, "#$", "#\xe2\x80\xa9" },
-	{ PCRE_NOTBOL | PCRE_NEWLINE_ANY, 0 | F_NOMATCH, "^a", "aa\naa" },
-	{ PCRE_NOTBOL | PCRE_MULTILINE | PCRE_NEWLINE_ANY, 0, "^a", "aa\naa" },
-	{ PCRE_NOTEOL | PCRE_NEWLINE_ANY, 0 | F_NOMATCH, "a$", "aa\naa" },
-	{ PCRE_NOTEOL | PCRE_NEWLINE_ANY, 0 | F_NOMATCH, "a$", "aa\r\n" },
-	{ PCRE_UTF8 | PCRE_DOLLAR_ENDONLY | PCRE_NEWLINE_ANY, 0 | F_PROPERTY, "\\p{Any}{2,}$", "aa\r\n" },
-	{ PCRE_NOTEOL | PCRE_MULTILINE | PCRE_NEWLINE_ANY, 0, "a$", "aa\naa" },
-	{ PCRE_NEWLINE_CR, 0, ".\\Z", "aaa" },
-	{ PCRE_NEWLINE_CR | PCRE_UTF8, 0, "a\\Z", "aaa\r" },
-	{ PCRE_NEWLINE_CR, 0, ".\\Z", "aaa\n" },
-	{ PCRE_NEWLINE_CRLF, 0, ".\\Z", "aaa\r" },
-	{ PCRE_NEWLINE_CRLF | PCRE_UTF8, 0, ".\\Z", "aaa\n" },
-	{ PCRE_NEWLINE_CRLF, 0, ".\\Z", "aaa\r\n" },
-	{ PCRE_NEWLINE_ANYCRLF | PCRE_UTF8, 0, ".\\Z", "aaa" },
-	{ PCRE_NEWLINE_ANYCRLF | PCRE_UTF8, 0, ".\\Z", "aaa\r" },
-	{ PCRE_NEWLINE_ANYCRLF | PCRE_UTF8, 0, ".\\Z", "aaa\n" },
-	{ PCRE_NEWLINE_ANYCRLF | PCRE_UTF8, 0, ".\\Z", "aaa\r\n" },
-	{ PCRE_NEWLINE_ANYCRLF | PCRE_UTF8, 0, ".\\Z", "aaa\xe2\x80\xa8" },
-	{ PCRE_NEWLINE_ANYCRLF | PCRE_UTF8, 0, ".\\Z", "aaa" },
-	{ PCRE_NEWLINE_ANYCRLF | PCRE_UTF8, 0, ".\\Z", "aaa\r" },
-	{ PCRE_NEWLINE_ANYCRLF | PCRE_UTF8, 0, ".\\Z", "aaa\n" },
-	{ PCRE_NEWLINE_ANYCRLF | PCRE_UTF8, 0, ".\\Z", "aaa\r\n" },
-	{ PCRE_NEWLINE_ANY | PCRE_UTF8, 0, ".\\Z", "aaa\xc2\x85" },
-	{ PCRE_NEWLINE_ANY | PCRE_UTF8, 0, ".\\Z", "aaa\xe2\x80\xa8" },
-	{ MA, 0, "\\Aa", "aaa" },
-	{ MA, 1 | F_NOMATCH, "\\Aa", "aaa" },
-	{ MA, 1, "\\Ga", "aaa" },
-	{ MA, 1 | F_NOMATCH, "\\Ga", "aba" },
-	{ MA, 0, "a\\z", "aaa" },
-	{ MA, 0 | F_NOMATCH, "a\\z", "aab" },
-
-	/* Brackets. */
-	{ MUA, 0, "(ab|bb|cd)", "bacde" },
-	{ MUA, 0, "(?:ab|a)(bc|c)", "ababc" },
-	{ MUA, 0, "((ab|(cc))|(bb)|(?:cd|efg))", "abac" },
-	{ CMUA, 0, "((aB|(Cc))|(bB)|(?:cd|EFg))", "AcCe" },
-	{ MUA, 0, "((ab|(cc))|(bb)|(?:cd|ebg))", "acebebg" },
-	{ MUA, 0, "(?:(a)|(?:b))(cc|(?:d|e))(a|b)k", "accabdbbccbk" },
-
-	/* Greedy and non-greedy ? operators. */
-	{ MUA, 0, "(?:a)?a", "laab" },
-	{ CMUA, 0, "(A)?A", "llaab" },
-	{ MUA, 0, "(a)?\?a", "aab" }, /* ?? is the prefix of trygraphs in GCC. */
-	{ MUA, 0, "(a)?a", "manm" },
-	{ CMUA, 0, "(a|b)?\?d((?:e)?)", "ABABdx" },
-	{ MUA, 0, "(a|b)?\?d((?:e)?)", "abcde" },
-	{ MUA, 0, "((?:ab)?\?g|b(?:g(nn|d)?\?)?)?\?(?:n)?m", "abgnbgnnbgdnmm" },
-
-	/* Greedy and non-greedy + operators */
-	{ MUA, 0, "(aa)+aa", "aaaaaaa" },
-	{ MUA, 0, "(aa)+?aa", "aaaaaaa" },
-	{ MUA, 0, "(?:aba|ab|a)+l", "ababamababal" },
-	{ MUA, 0, "(?:aba|ab|a)+?l", "ababamababal" },
-	{ MUA, 0, "(a(?:bc|cb|b|c)+?|ss)+e", "accssabccbcacbccbbXaccssabccbcacbccbbe" },
-	{ MUA, 0, "(a(?:bc|cb|b|c)+|ss)+?e", "accssabccbcacbccbbXaccssabccbcacbccbbe" },
-	{ MUA, 0, "(?:(b(c)+?)+)?\?(?:(bc)+|(cb)+)+(?:m)+", "bccbcccbcbccbcbPbccbcccbcbccbcbmmn" },
-
-	/* Greedy and non-greedy * operators */
-	{ CMUA, 0, "(?:AA)*AB", "aaaaaaamaaaaaaab" },
-	{ MUA, 0, "(?:aa)*?ab", "aaaaaaamaaaaaaab" },
-	{ MUA, 0, "(aa|ab)*ab", "aaabaaab" },
-	{ CMUA, 0, "(aa|Ab)*?aB", "aaabaaab" },
-	{ MUA, 0, "(a|b)*(?:a)*(?:b)*m", "abbbaaababanabbbaaababamm" },
-	{ MUA, 0, "(a|b)*?(?:a)*?(?:b)*?m", "abbbaaababanabbbaaababamm" },
-	{ MA, 0, "a(a(\\1*)a|(b)b+){0}a", "aa" },
-	{ MA, 0, "((?:a|)*){0}a", "a" },
-
-	/* Combining ? + * operators */
-	{ MUA, 0, "((bm)+)?\?(?:a)*(bm)+n|((am)+?)?(?:a)+(am)*n", "bmbmabmamaaamambmaman" },
-	{ MUA, 0, "(((ab)?cd)*ef)+g", "abcdcdefcdefefmabcdcdefcdefefgg" },
-	{ MUA, 0, "(((ab)?\?cd)*?ef)+?g", "abcdcdefcdefefmabcdcdefcdefefgg" },
-	{ MUA, 0, "(?:(ab)?c|(?:ab)+?d)*g", "ababcdccababddg" },
-	{ MUA, 0, "(?:(?:ab)?\?c|(ab)+d)*?g", "ababcdccababddg" },
-
-	/* Single character iterators. */
-	{ MUA, 0, "(a+aab)+aaaab", "aaaabcaaaabaabcaabcaaabaaaab" },
-	{ MUA, 0, "(a*a*aab)+x", "aaaaabaabaaabmaabx" },
-	{ MUA, 0, "(a*?(b|ab)a*?)+x", "aaaabcxbbaabaacbaaabaabax" },
-	{ MUA, 0, "(a+(ab|ad)a+)+x", "aaabaaaadaabaaabaaaadaaax" },
-	{ MUA, 0, "(a?(a)a?)+(aaa)", "abaaabaaaaaaaa" },
-	{ MUA, 0, "(a?\?(a)a?\?)+(b)", "aaaacaaacaacacbaaab" },
-	{ MUA, 0, "(a{0,4}(b))+d", "aaaaaabaabcaaaaabaaaaabd" },
-	{ MUA, 0, "(a{0,4}?[^b])+d+(a{0,4}[^b])d+", "aaaaadaaaacaadddaaddd" },
-	{ MUA, 0, "(ba{2})+c", "baabaaabacbaabaac" },
-	{ MUA, 0, "(a*+bc++)+", "aaabbcaaabcccab" },
-	{ MUA, 0, "(a?+[^b])+", "babaacacb" },
-	{ MUA, 0, "(a{0,3}+b)(a{0,3}+b)(a{0,3}+)[^c]", "abaabaaacbaabaaaac" },
-	{ CMUA, 0, "([a-c]+[d-f]+?)+?g", "aBdacdehAbDaFgA" },
-	{ CMUA, 0, "[c-f]+k", "DemmFke" },
-	{ MUA, 0, "([DGH]{0,4}M)+", "GGDGHDGMMHMDHHGHM" },
-	{ MUA, 0, "([a-c]{4,}s)+", "abasabbasbbaabsbba" },
-	{ CMUA, 0, "[ace]{3,7}", "AcbDAcEEcEd" },
-	{ CMUA, 0, "[ace]{3,7}?", "AcbDAcEEcEd" },
-	{ CMUA, 0, "[ace]{3,}", "AcbDAcEEcEd" },
-	{ CMUA, 0, "[ace]{3,}?", "AcbDAcEEcEd" },
-	{ MUA, 0, "[ckl]{2,}?g", "cdkkmlglglkcg" },
-	{ CMUA, 0, "[ace]{5}?", "AcCebDAcEEcEd" },
-	{ MUA, 0, "([AbC]{3,5}?d)+", "BACaAbbAEAACCbdCCbdCCAAbb" },
-	{ MUA, 0, "([^ab]{0,}s){2}", "abaabcdsABamsDDs" },
-	{ MUA, 0, "\\b\\w+\\B", "x,a_cd" },
-	{ MUAP, 0, "\\b[^\xc2\xa1]+\\B", "\xc3\x89\xc2\xa1\xe6\x92\xad\xc3\x81\xc3\xa1" },
-	{ CMUA, 0, "[^b]+(a*)([^c]?d{3})", "aaaaddd" },
-	{ CMUAP, 0, "\xe1\xbd\xb8{2}", "\xe1\xbf\xb8#\xe1\xbf\xb8\xe1\xbd\xb8" },
-	{ CMUA, 0, "[^\xf0\x90\x90\x80]{2,4}@", "\xf0\x90\x90\xa8\xf0\x90\x90\x80###\xf0\x90\x90\x80@@@" },
-	{ CMUA, 0, "[^\xe1\xbd\xb8][^\xc3\xa9]", "\xe1\xbd\xb8\xe1\xbf\xb8\xc3\xa9\xc3\x89#" },
-	{ MUA, 0, "[^\xe1\xbd\xb8][^\xc3\xa9]", "\xe1\xbd\xb8\xe1\xbf\xb8\xc3\xa9\xc3\x89#" },
-	{ MUA, 0, "[^\xe1\xbd\xb8]{3,}?", "##\xe1\xbd\xb8#\xe1\xbd\xb8#\xc3\x89#\xe1\xbd\xb8" },
-
-	/* Bracket repeats with limit. */
-	{ MUA, 0, "(?:(ab){2}){5}M", "abababababababababababM" },
-	{ MUA, 0, "(?:ab|abab){1,5}M", "abababababababababababM" },
-	{ MUA, 0, "(?>ab|abab){1,5}M", "abababababababababababM" },
-	{ MUA, 0, "(?:ab|abab){1,5}?M", "abababababababababababM" },
-	{ MUA, 0, "(?>ab|abab){1,5}?M", "abababababababababababM" },
-	{ MUA, 0, "(?:(ab){1,4}?){1,3}?M", "abababababababababababababM" },
-	{ MUA, 0, "(?:(ab){1,4}){1,3}abababababababababababM", "ababababababababababababM" },
-	{ MUA, 0 | F_NOMATCH, "(?:(ab){1,4}){1,3}abababababababababababM", "abababababababababababM" },
-	{ MUA, 0, "(ab){4,6}?M", "abababababababM" },
-
-	/* Basic character sets. */
-	{ MUA, 0, "(?:\\s)+(?:\\S)+", "ab \t\xc3\xa9\xe6\x92\xad " },
-	{ MUA, 0, "(\\w)*(k)(\\W)?\?", "abcdef abck11" },
-	{ MUA, 0, "\\((\\d)+\\)\\D", "a() (83 (8)2 (9)ab" },
-	{ MUA, 0, "\\w(\\s|(?:\\d)*,)+\\w\\wb", "a 5, 4,, bb 5, 4,, aab" },
-	{ MUA, 0, "(\\v+)(\\V+)", "\x0e\xc2\x85\xe2\x80\xa8\x0b\x09\xe2\x80\xa9" },
-	{ MUA, 0, "(\\h+)(\\H+)", "\xe2\x80\xa8\xe2\x80\x80\x20\xe2\x80\x8a\xe2\x81\x9f\xe3\x80\x80\x09\x20\xc2\xa0\x0a" },
-	{ MUA, 0, "x[bcef]+", "xaxdxecbfg" },
-	{ MUA, 0, "x[bcdghij]+", "xaxexfxdgbjk" },
-	{ MUA, 0, "x[^befg]+", "xbxexacdhg" },
-	{ MUA, 0, "x[^bcdl]+", "xlxbxaekmd" },
-	{ MUA, 0, "x[^bcdghi]+", "xbxdxgxaefji" },
-	{ MUA, 0, "x[B-Fb-f]+", "xaxAxgxbfBFG" },
-	{ CMUA, 0, "\\x{e9}+", "#\xf0\x90\x90\xa8\xc3\xa8\xc3\xa9\xc3\x89\xc3\x88" },
-	{ CMUA, 0, "[^\\x{e9}]+", "\xc3\xa9#\xf0\x90\x90\xa8\xc3\xa8\xc3\x88\xc3\x89" },
-	{ MUA, 0, "[\\x02\\x7e]+", "\xc3\x81\xe1\xbf\xb8\xf0\x90\x90\xa8\x01\x02\x7e\x7f" },
-	{ MUA, 0, "[^\\x02\\x7e]+", "\x02\xc3\x81\xe1\xbf\xb8\xf0\x90\x90\xa8\x01\x7f\x7e" },
-	{ MUA, 0, "[\\x{81}-\\x{7fe}]+", "#\xe1\xbf\xb8\xf0\x90\x90\xa8\xc2\x80\xc2\x81\xdf\xbe\xdf\xbf" },
-	{ MUA, 0, "[^\\x{81}-\\x{7fe}]+", "\xc2\x81#\xe1\xbf\xb8\xf0\x90\x90\xa8\xc2\x80\xdf\xbf\xdf\xbe" },
-	{ MUA, 0, "[\\x{801}-\\x{fffe}]+", "#\xc3\xa9\xf0\x90\x90\x80\xe0\xa0\x80\xe0\xa0\x81\xef\xbf\xbe\xef\xbf\xbf" },
-	{ MUA, 0, "[^\\x{801}-\\x{fffe}]+", "\xe0\xa0\x81#\xc3\xa9\xf0\x90\x90\x80\xe0\xa0\x80\xef\xbf\xbf\xef\xbf\xbe" },
-	{ MUA, 0, "[\\x{10001}-\\x{10fffe}]+", "#\xc3\xa9\xe2\xb1\xa5\xf0\x90\x80\x80\xf0\x90\x80\x81\xf4\x8f\xbf\xbe\xf4\x8f\xbf\xbf" },
-	{ MUA, 0, "[^\\x{10001}-\\x{10fffe}]+", "\xf0\x90\x80\x81#\xc3\xa9\xe2\xb1\xa5\xf0\x90\x80\x80\xf4\x8f\xbf\xbf\xf4\x8f\xbf\xbe" },
-
-	/* Unicode properties. */
-	{ MUAP, 0, "[1-5\xc3\xa9\\w]", "\xc3\xa1_" },
-	{ MUAP, 0 | F_PROPERTY, "[\xc3\x81\\p{Ll}]", "A_\xc3\x89\xc3\xa1" },
-	{ MUAP, 0, "[\\Wd-h_x-z]+", "a\xc2\xa1#_yhzdxi" },
-	{ MUAP, 0 | F_NOMATCH | F_PROPERTY, "[\\P{Any}]", "abc" },
-	{ MUAP, 0 | F_NOMATCH | F_PROPERTY, "[^\\p{Any}]", "abc" },
-	{ MUAP, 0 | F_NOMATCH | F_PROPERTY, "[\\P{Any}\xc3\xa1-\xc3\xa8]", "abc" },
-	{ MUAP, 0 | F_NOMATCH | F_PROPERTY, "[^\\p{Any}\xc3\xa1-\xc3\xa8]", "abc" },
-	{ MUAP, 0 | F_NOMATCH | F_PROPERTY, "[\xc3\xa1-\xc3\xa8\\P{Any}]", "abc" },
-	{ MUAP, 0 | F_NOMATCH | F_PROPERTY, "[^\xc3\xa1-\xc3\xa8\\p{Any}]", "abc" },
-	{ MUAP, 0 | F_PROPERTY, "[\xc3\xa1-\xc3\xa8\\p{Any}]", "abc" },
-	{ MUAP, 0 | F_PROPERTY, "[^\xc3\xa1-\xc3\xa8\\P{Any}]", "abc" },
-	{ MUAP, 0, "[b-\xc3\xa9\\s]", "a\xc\xe6\x92\xad" },
-	{ CMUAP, 0, "[\xc2\x85-\xc2\x89\xc3\x89]", "\xc2\x84\xc3\xa9" },
-	{ MUAP, 0, "[^b-d^&\\s]{3,}", "db^ !a\xe2\x80\xa8_ae" },
-	{ MUAP, 0 | F_PROPERTY, "[^\\S\\P{Any}][\\sN]{1,3}[\\P{N}]{4}", "\xe2\x80\xaa\xa N\x9\xc3\xa9_0" },
-	{ MUA, 0 | F_PROPERTY, "[^\\P{L}\x9!D-F\xa]{2,3}", "\x9,.DF\xa.CG\xc3\x81" },
-	{ CMUAP, 0, "[\xc3\xa1-\xc3\xa9_\xe2\x80\xa0-\xe2\x80\xaf]{1,5}[^\xe2\x80\xa0-\xe2\x80\xaf]", "\xc2\xa1\xc3\x89\xc3\x89\xe2\x80\xaf_\xe2\x80\xa0" },
-	{ MUAP, 0 | F_PROPERTY, "[\xc3\xa2-\xc3\xa6\xc3\x81-\xc3\x84\xe2\x80\xa8-\xe2\x80\xa9\xe6\x92\xad\\p{Zs}]{2,}", "\xe2\x80\xa7\xe2\x80\xa9\xe6\x92\xad \xe6\x92\xae" },
-	{ MUAP, 0 | F_PROPERTY, "[\\P{L&}]{2}[^\xc2\x85-\xc2\x89\\p{Ll}\\p{Lu}]{2}", "\xc3\xa9\xe6\x92\xad.a\xe6\x92\xad|\xc2\x8a#" },
-	{ PCRE_UCP, 0, "[a-b\\s]{2,5}[^a]", "AB  baaa" },
-
-	/* Possible empty brackets. */
-	{ MUA, 0, "(?:|ab||bc|a)+d", "abcxabcabd" },
-	{ MUA, 0, "(|ab||bc|a)+d", "abcxabcabd" },
-	{ MUA, 0, "(?:|ab||bc|a)*d", "abcxabcabd" },
-	{ MUA, 0, "(|ab||bc|a)*d", "abcxabcabd" },
-	{ MUA, 0, "(?:|ab||bc|a)+?d", "abcxabcabd" },
-	{ MUA, 0, "(|ab||bc|a)+?d", "abcxabcabd" },
-	{ MUA, 0, "(?:|ab||bc|a)*?d", "abcxabcabd" },
-	{ MUA, 0, "(|ab||bc|a)*?d", "abcxabcabd" },
-	{ MUA, 0, "(((a)*?|(?:ba)+)+?|(?:|c|ca)*)*m", "abaacaccabacabalabaacaccabacabamm" },
-	{ MUA, 0, "(?:((?:a)*|(ba)+?)+|(|c|ca)*?)*?m", "abaacaccabacabalabaacaccabacabamm" },
-
-	/* Start offset. */
-	{ MUA, 3, "(\\d|(?:\\w)*\\w)+", "0ac01Hb" },
-	{ MUA, 4 | F_NOMATCH, "(\\w\\W\\w)+", "ab#d" },
-	{ MUA, 2 | F_NOMATCH, "(\\w\\W\\w)+", "ab#d" },
-	{ MUA, 1, "(\\w\\W\\w)+", "ab#d" },
-
-	/* Newline. */
-	{ PCRE_MULTILINE | PCRE_NEWLINE_CRLF, 0, "\\W{0,2}[^#]{3}", "\r\n#....." },
-	{ PCRE_MULTILINE | PCRE_NEWLINE_CR, 0, "\\W{0,2}[^#]{3}", "\r\n#....." },
-	{ PCRE_MULTILINE | PCRE_NEWLINE_CRLF, 0, "\\W{1,3}[^#]", "\r\n##...." },
-	{ MUA | PCRE_NO_UTF8_CHECK, 1, "^.a", "\n\x80\nxa" },
-	{ MUA, 1, "^", "\r\n" },
-	{ PCRE_MULTILINE | PCRE_NEWLINE_CRLF, 1 | F_NOMATCH, "^", "\r\n" },
-	{ PCRE_MULTILINE | PCRE_NEWLINE_CRLF, 1, "^", "\r\na" },
-
-	/* Any character except newline or any newline. */
-	{ PCRE_NEWLINE_CRLF, 0, ".", "\r" },
-	{ PCRE_NEWLINE_CRLF | PCRE_UTF8, 0, ".(.).", "a\xc3\xa1\r\n\n\r\r" },
-	{ PCRE_NEWLINE_ANYCRLF, 0, ".(.)", "a\rb\nc\r\n\xc2\x85\xe2\x80\xa8" },
-	{ PCRE_NEWLINE_ANYCRLF | PCRE_UTF8, 0, ".(.)", "a\rb\nc\r\n\xc2\x85\xe2\x80\xa8" },
-	{ PCRE_NEWLINE_ANY | PCRE_UTF8, 0, "(.).", "a\rb\nc\r\n\xc2\x85\xe2\x80\xa9$de" },
-	{ PCRE_NEWLINE_ANYCRLF | PCRE_UTF8, 0 | F_NOMATCH, ".(.).", "\xe2\x80\xa8\nb\r" },
-	{ PCRE_NEWLINE_ANY, 0, "(.)(.)", "#\x85#\r#\n#\r\n#\x84" },
-	{ PCRE_NEWLINE_ANY | PCRE_UTF8, 0, "(.+)#", "#\rMn\xc2\x85#\n###" },
-	{ PCRE_BSR_ANYCRLF, 0, "\\R", "\r" },
-	{ PCRE_BSR_ANYCRLF, 0, "\\R", "\x85#\r\n#" },
-	{ PCRE_BSR_UNICODE | PCRE_UTF8, 0, "\\R", "ab\xe2\x80\xa8#c" },
-	{ PCRE_BSR_UNICODE | PCRE_UTF8, 0, "\\R", "ab\r\nc" },
-	{ PCRE_NEWLINE_CRLF | PCRE_BSR_UNICODE | PCRE_UTF8, 0, "(\\R.)+", "\xc2\x85\r\n#\xe2\x80\xa8\n\r\n\r" },
-	{ MUA, 0 | F_NOMATCH, "\\R+", "ab" },
-	{ MUA, 0, "\\R+", "ab\r\n\r" },
-	{ MUA, 0, "\\R*", "ab\r\n\r" },
-	{ MUA, 0, "\\R*", "\r\n\r" },
-	{ MUA, 0, "\\R{2,4}", "\r\nab\r\r" },
-	{ MUA, 0, "\\R{2,4}", "\r\nab\n\n\n\r\r\r" },
-	{ MUA, 0, "\\R{2,}", "\r\nab\n\n\n\r\r\r" },
-	{ MUA, 0, "\\R{0,3}", "\r\n\r\n\r\n\r\n\r\n" },
-	{ MUA, 0 | F_NOMATCH, "\\R+\\R\\R", "\r\n\r\n" },
-	{ MUA, 0, "\\R+\\R\\R", "\r\r\r" },
-	{ MUA, 0, "\\R*\\R\\R", "\n\r" },
-	{ MUA, 0 | F_NOMATCH, "\\R{2,4}\\R\\R", "\r\r\r" },
-	{ MUA, 0, "\\R{2,4}\\R\\R", "\r\r\r\r" },
-
-	/* Atomic groups (no fallback from "next" direction). */
-	{ MUA, 0 | F_NOMATCH, "(?>ab)ab", "bab" },
-	{ MUA, 0 | F_NOMATCH, "(?>(ab))ab", "bab" },
-	{ MUA, 0, "(?>ab)+abc(?>de)*def(?>gh)?ghe(?>ij)+?k(?>lm)*?n(?>op)?\?op",
-			"bababcdedefgheijijklmlmnop" },
-	{ MUA, 0, "(?>a(b)+a|(ab)?\?(b))an", "abban" },
-	{ MUA, 0, "(?>ab+a|(?:ab)?\?b)an", "abban" },
-	{ MUA, 0, "((?>ab|ad|)*?)(?>|c)*abad", "abababcababad" },
-	{ MUA, 0, "(?>(aa|b|)*+(?>(##)|###)*d|(aa)(?>(baa)?)m)", "aabaa#####da" },
-	{ MUA, 0, "((?>a|)+?)b", "aaacaaab" },
-	{ MUA, 0, "(?>x|)*$", "aaa" },
-	{ MUA, 0, "(?>(x)|)*$", "aaa" },
-	{ MUA, 0, "(?>x|())*$", "aaa" },
-	{ MUA, 0, "((?>[cxy]a|[a-d])*?)b", "aaa+ aaab" },
-	{ MUA, 0, "((?>[cxy](a)|[a-d])*?)b", "aaa+ aaab" },
-	{ MUA, 0, "(?>((?>(a+))))bab|(?>((?>(a+))))bb", "aaaabaaabaabab" },
-	{ MUA, 0, "(?>(?>a+))bab|(?>(?>a+))bb", "aaaabaaabaabab" },
-	{ MUA, 0, "(?>(a)c|(?>(c)|(a))a)b*?bab", "aaaabaaabaabab" },
-	{ MUA, 0, "(?>ac|(?>c|a)a)b*?bab", "aaaabaaabaabab" },
-	{ MUA, 0, "(?>(b)b|(a))*b(?>(c)|d)?x", "ababcaaabdbx" },
-	{ MUA, 0, "(?>bb|a)*b(?>c|d)?x", "ababcaaabdbx" },
-	{ MUA, 0, "(?>(bb)|a)*b(?>c|(d))?x", "ababcaaabdbx" },
-	{ MUA, 0, "(?>(a))*?(?>(a))+?(?>(a))??x", "aaaaaacccaaaaabax" },
-	{ MUA, 0, "(?>a)*?(?>a)+?(?>a)??x", "aaaaaacccaaaaabax" },
-	{ MUA, 0, "(?>(a)|)*?(?>(a)|)+?(?>(a)|)??x", "aaaaaacccaaaaabax" },
-	{ MUA, 0, "(?>a|)*?(?>a|)+?(?>a|)??x", "aaaaaacccaaaaabax" },
-	{ MUA, 0, "(?>a(?>(a{0,2}))*?b|aac)+b", "aaaaaaacaaaabaaaaacaaaabaacaaabb" },
-	{ CMA, 0, "(?>((?>a{32}|b+|(a*))?(?>c+|d*)?\?)+e)+?f", "aaccebbdde bbdaaaccebbdee bbdaaaccebbdeef" },
-	{ MUA, 0, "(?>(?:(?>aa|a||x)+?b|(?>aa|a||(x))+?c)?(?>[ad]{0,2})*?d)+d", "aaacdbaabdcabdbaaacd aacaabdbdcdcaaaadaabcbaadd" },
-	{ MUA, 0, "(?>(?:(?>aa|a||(x))+?b|(?>aa|a||x)+?c)?(?>[ad]{0,2})*?d)+d", "aaacdbaabdcabdbaaacd aacaabdbdcdcaaaadaabcbaadd" },
-	{ MUA, 0 | F_PROPERTY, "\\X", "\xcc\x8d\xcc\x8d" },
-	{ MUA, 0 | F_PROPERTY, "\\X", "\xcc\x8d\xcc\x8d#\xcc\x8d\xcc\x8d" },
-	{ MUA, 0 | F_PROPERTY, "\\X+..", "\xcc\x8d#\xcc\x8d#\xcc\x8d\xcc\x8d" },
-	{ MUA, 0 | F_PROPERTY, "\\X{2,4}", "abcdef" },
-	{ MUA, 0 | F_PROPERTY, "\\X{2,4}?", "abcdef" },
-	{ MUA, 0 | F_NOMATCH | F_PROPERTY, "\\X{2,4}..", "#\xcc\x8d##" },
-	{ MUA, 0 | F_PROPERTY, "\\X{2,4}..", "#\xcc\x8d#\xcc\x8d##" },
-	{ MUA, 0, "(c(ab)?+ab)+", "cabcababcab" },
-	{ MUA, 0, "(?>(a+)b)+aabab", "aaaabaaabaabab" },
-
-	/* Possessive quantifiers. */
-	{ MUA, 0, "(?:a|b)++m", "mababbaaxababbaam" },
-	{ MUA, 0, "(?:a|b)*+m", "mababbaaxababbaam" },
-	{ MUA, 0, "(?:a|b)*+m", "ababbaaxababbaam" },
-	{ MUA, 0, "(a|b)++m", "mababbaaxababbaam" },
-	{ MUA, 0, "(a|b)*+m", "mababbaaxababbaam" },
-	{ MUA, 0, "(a|b)*+m", "ababbaaxababbaam" },
-	{ MUA, 0, "(a|b(*ACCEPT))++m", "maaxab" },
-	{ MUA, 0, "(?:b*)++m", "bxbbxbbbxm" },
-	{ MUA, 0, "(?:b*)++m", "bxbbxbbbxbbm" },
-	{ MUA, 0, "(?:b*)*+m", "bxbbxbbbxm" },
-	{ MUA, 0, "(?:b*)*+m", "bxbbxbbbxbbm" },
-	{ MUA, 0, "(b*)++m", "bxbbxbbbxm" },
-	{ MUA, 0, "(b*)++m", "bxbbxbbbxbbm" },
-	{ MUA, 0, "(b*)*+m", "bxbbxbbbxm" },
-	{ MUA, 0, "(b*)*+m", "bxbbxbbbxbbm" },
-	{ MUA, 0, "(?:a|(b))++m", "mababbaaxababbaam" },
-	{ MUA, 0, "(?:(a)|b)*+m", "mababbaaxababbaam" },
-	{ MUA, 0, "(?:(a)|(b))*+m", "ababbaaxababbaam" },
-	{ MUA, 0, "(a|(b))++m", "mababbaaxababbaam" },
-	{ MUA, 0, "((a)|b)*+m", "mababbaaxababbaam" },
-	{ MUA, 0, "((a)|(b))*+m", "ababbaaxababbaam" },
-	{ MUA, 0, "(a|(b)(*ACCEPT))++m", "maaxab" },
-	{ MUA, 0, "(?:(b*))++m", "bxbbxbbbxm" },
-	{ MUA, 0, "(?:(b*))++m", "bxbbxbbbxbbm" },
-	{ MUA, 0, "(?:(b*))*+m", "bxbbxbbbxm" },
-	{ MUA, 0, "(?:(b*))*+m", "bxbbxbbbxbbm" },
-	{ MUA, 0, "((b*))++m", "bxbbxbbbxm" },
-	{ MUA, 0, "((b*))++m", "bxbbxbbbxbbm" },
-	{ MUA, 0, "((b*))*+m", "bxbbxbbbxm" },
-	{ MUA, 0, "((b*))*+m", "bxbbxbbbxbbm" },
-	{ MUA, 0 | F_NOMATCH, "(?>(b{2,4}))(?:(?:(aa|c))++m|(?:(aa|c))+n)", "bbaacaaccaaaacxbbbmbn" },
-	{ MUA, 0, "((?:b)++a)+(cd)*+m", "bbababbacdcdnbbababbacdcdm" },
-	{ MUA, 0, "((?:(b))++a)+((c)d)*+m", "bbababbacdcdnbbababbacdcdm" },
-	{ MUA, 0, "(?:(?:(?:ab)*+k)++(?:n(?:cd)++)*+)*+m", "ababkkXababkkabkncXababkkabkncdcdncdXababkkabkncdcdncdkkabkncdXababkkabkncdcdncdkkabkncdm" },
-	{ MUA, 0, "(?:((ab)*+(k))++(n(?:c(d))++)*+)*+m", "ababkkXababkkabkncXababkkabkncdcdncdXababkkabkncdcdncdkkabkncdXababkkabkncdcdncdkkabkncdm" },
-
-	/* Back references. */
-	{ MUA, 0, "(aa|bb)(\\1*)(ll|)(\\3*)bbbbbbc", "aaaaaabbbbbbbbc" },
-	{ CMUA, 0, "(aa|bb)(\\1+)(ll|)(\\3+)bbbbbbc", "bBbbBbCbBbbbBbbcbbBbbbBBbbC" },
-	{ CMA, 0, "(a{2,4})\\1", "AaAaaAaA" },
-	{ MUA, 0, "(aa|bb)(\\1?)aa(\\1?)(ll|)(\\4+)bbc", "aaaaaaaabbaabbbbaabbbbc" },
-	{ MUA, 0, "(aa|bb)(\\1{0,5})(ll|)(\\3{0,5})cc", "bbxxbbbbxxaaaaaaaaaaaaaaaacc" },
-	{ MUA, 0, "(aa|bb)(\\1{3,5})(ll|)(\\3{3,5})cc", "bbbbbbbbbbbbaaaaaaccbbbbbbbbbbbbbbcc" },
-	{ MUA, 0, "(aa|bb)(\\1{3,})(ll|)(\\3{3,})cc", "bbbbbbbbbbbbaaaaaaccbbbbbbbbbbbbbbcc" },
-	{ MUA, 0, "(\\w+)b(\\1+)c", "GabGaGaDbGaDGaDc" },
-	{ MUA, 0, "(?:(aa)|b)\\1?b", "bb" },
-	{ CMUA, 0, "(aa|bb)(\\1*?)aa(\\1+?)", "bBBbaaAAaaAAaa" },
-	{ MUA, 0, "(aa|bb)(\\1*?)(dd|)cc(\\3+?)", "aaaaaccdd" },
-	{ CMUA, 0, "(?:(aa|bb)(\\1?\?)cc){2}(\\1?\?)", "aAaABBbbAAaAcCaAcCaA" },
-	{ MUA, 0, "(?:(aa|bb)(\\1{3,5}?)){2}(dd|)(\\3{3,5}?)", "aaaaaabbbbbbbbbbaaaaaaaaaaaaaa" },
-	{ CMA, 0, "(?:(aa|bb)(\\1{3,}?)){2}(dd|)(\\3{3,}?)", "aaaaaabbbbbbbbbbaaaaaaaaaaaaaa" },
-	{ MUA, 0, "(?:(aa|bb)(\\1{0,3}?)){2}(dd|)(\\3{0,3}?)b(\\1{0,3}?)(\\1{0,3})", "aaaaaaaaaaaaaaabaaaaa" },
-	{ MUA, 0, "(a(?:\\1|)a){3}b", "aaaaaaaaaaab" },
-	{ MA, 0, "(a?)b(\\1\\1*\\1+\\1?\\1*?\\1+?\\1??\\1*+\\1++\\1?+\\1{4}\\1{3,5}\\1{4,}\\1{0,5}\\1{3,5}?\\1{4,}?\\1{0,5}?\\1{3,5}+\\1{4,}+\\1{0,5}+#){2}d", "bb#b##d" },
-	{ MUAP, 0 | F_PROPERTY, "(\\P{N})\\1{2,}", ".www." },
-	{ MUAP, 0 | F_PROPERTY, "(\\P{N})\\1{0,2}", "wwwww." },
-	{ MUAP, 0 | F_PROPERTY, "(\\P{N})\\1{1,2}ww", "wwww" },
-	{ MUAP, 0 | F_PROPERTY, "(\\P{N})\\1{1,2}ww", "wwwww" },
-	{ PCRE_UCP, 0 | F_PROPERTY, "(\\P{N})\\1{2,}", ".www." },
-	{ CMUAP, 0, "(\xf0\x90\x90\x80)\\1", "\xf0\x90\x90\xa8\xf0\x90\x90\xa8" },
-	{ MUA | PCRE_DUPNAMES, 0 | F_NOMATCH, "\\k<A>{1,3}(?<A>aa)(?<A>bb)", "aabb" },
-	{ MUA | PCRE_DUPNAMES | PCRE_JAVASCRIPT_COMPAT, 0, "\\k<A>{1,3}(?<A>aa)(?<A>bb)", "aabb" },
-	{ MUA | PCRE_DUPNAMES | PCRE_JAVASCRIPT_COMPAT, 0, "\\k<A>*(?<A>aa)(?<A>bb)", "aabb" },
-	{ MUA | PCRE_DUPNAMES, 0, "(?<A>aa)(?<A>bb)\\k<A>{0,3}aaaaaa", "aabbaaaaaa" },
-	{ MUA | PCRE_DUPNAMES, 0, "(?<A>aa)(?<A>bb)\\k<A>{2,5}bb", "aabbaaaabb" },
-	{ MUA | PCRE_DUPNAMES, 0, "(?:(?<A>aa)|(?<A>bb))\\k<A>{0,3}m", "aaaaaaaabbbbaabbbbm" },
-	{ MUA | PCRE_DUPNAMES, 0 | F_NOMATCH, "\\k<A>{1,3}?(?<A>aa)(?<A>bb)", "aabb" },
-	{ MUA | PCRE_DUPNAMES | PCRE_JAVASCRIPT_COMPAT, 0, "\\k<A>{1,3}?(?<A>aa)(?<A>bb)", "aabb" },
-	{ MUA | PCRE_DUPNAMES, 0, "\\k<A>*?(?<A>aa)(?<A>bb)", "aabb" },
-	{ MUA | PCRE_DUPNAMES, 0, "(?:(?<A>aa)|(?<A>bb))\\k<A>{0,3}?m", "aaaaaabbbbbbaabbbbbbbbbbm" },
-	{ MUA | PCRE_DUPNAMES, 0, "(?:(?<A>aa)|(?<A>bb))\\k<A>*?m", "aaaaaabbbbbbaabbbbbbbbbbm" },
-	{ MUA | PCRE_DUPNAMES, 0, "(?:(?<A>aa)|(?<A>bb))\\k<A>{2,3}?", "aaaabbbbaaaabbbbbbbbbb" },
-	{ CMUA | PCRE_DUPNAMES, 0, "(?:(?<A>AA)|(?<A>BB))\\k<A>{0,3}M", "aaaaaaaabbbbaabbbbm" },
-	{ CMUA | PCRE_DUPNAMES, 0, "(?:(?<A>AA)|(?<A>BB))\\k<A>{1,3}M", "aaaaaaaabbbbaabbbbm" },
-	{ CMUA | PCRE_DUPNAMES, 0, "(?:(?<A>AA)|(?<A>BB))\\k<A>{0,3}?M", "aaaaaabbbbbbaabbbbbbbbbbm" },
-	{ CMUA | PCRE_DUPNAMES, 0, "(?:(?<A>AA)|(?<A>BB))\\k<A>{2,3}?", "aaaabbbbaaaabbbbbbbbbb" },
-
-	/* Assertions. */
-	{ MUA, 0, "(?=xx|yy|zz)\\w{4}", "abczzdefg" },
-	{ MUA, 0, "(?=((\\w+)b){3}|ab)", "dbbbb ab" },
-	{ MUA, 0, "(?!ab|bc|cd)[a-z]{2}", "Xabcdef" },
-	{ MUA, 0, "(?<=aaa|aa|a)a", "aaa" },
-	{ MUA, 2, "(?<=aaa|aa|a)a", "aaa" },
-	{ MA, 0, "(?<=aaa|aa|a)a", "aaa" },
-	{ MA, 2, "(?<=aaa|aa|a)a", "aaa" },
-	{ MUA, 0, "(\\d{2})(?!\\w+c|(((\\w?)m){2}n)+|\\1)", "x5656" },
-	{ MUA, 0, "((?=((\\d{2,6}\\w){2,}))\\w{5,20}K){2,}", "567v09708K12l00M00 567v09708K12l00M00K45K" },
-	{ MUA, 0, "(?=(?:(?=\\S+a)\\w*(b)){3})\\w+\\d", "bba bbab nbbkba nbbkba0kl" },
-	{ MUA, 0, "(?>a(?>(b+))a(?=(..)))*?k", "acabbcabbaabacabaabbakk" },
-	{ MUA, 0, "((?(?=(a))a)+k)", "bbak" },
-	{ MUA, 0, "((?(?=a)a)+k)", "bbak" },
-	{ MUA, 0 | F_NOMATCH, "(?=(?>(a))m)amk", "a k" },
-	{ MUA, 0 | F_NOMATCH, "(?!(?>(a))m)amk", "a k" },
-	{ MUA, 0 | F_NOMATCH, "(?>(?=(a))am)amk", "a k" },
-	{ MUA, 0, "(?=(?>a|(?=(?>(b+))a|c)[a-c]+)*?m)[a-cm]+k", "aaam bbam baaambaam abbabba baaambaamk" },
-	{ MUA, 0, "(?> ?\?\\b(?(?=\\w{1,4}(a))m)\\w{0,8}bc){2,}?", "bca ssbc mabd ssbc mabc" },
-	{ MUA, 0, "(?:(?=ab)?[^n][^n])+m", "ababcdabcdcdabnababcdabcdcdabm" },
-	{ MUA, 0, "(?:(?=a(b))?[^n][^n])+m", "ababcdabcdcdabnababcdabcdcdabm" },
-	{ MUA, 0, "(?:(?=.(.))??\\1.)+m", "aabbbcbacccanaabbbcbacccam" },
-	{ MUA, 0, "(?:(?=.)??[a-c])+m", "abacdcbacacdcaccam" },
-	{ MUA, 0, "((?!a)?(?!([^a]))?)+$", "acbab" },
-	{ MUA, 0, "((?!a)?\?(?!([^a]))?\?)+$", "acbab" },
-
-	/* Not empty, ACCEPT, FAIL */
-	{ MUA | PCRE_NOTEMPTY, 0 | F_NOMATCH, "a*", "bcx" },
-	{ MUA | PCRE_NOTEMPTY, 0, "a*", "bcaad" },
-	{ MUA | PCRE_NOTEMPTY, 0, "a*?", "bcaad" },
-	{ MUA | PCRE_NOTEMPTY_ATSTART, 0, "a*", "bcaad" },
-	{ MUA, 0, "a(*ACCEPT)b", "ab" },
-	{ MUA | PCRE_NOTEMPTY, 0 | F_NOMATCH, "a*(*ACCEPT)b", "bcx" },
-	{ MUA | PCRE_NOTEMPTY, 0, "a*(*ACCEPT)b", "bcaad" },
-	{ MUA | PCRE_NOTEMPTY, 0, "a*?(*ACCEPT)b", "bcaad" },
-	{ MUA | PCRE_NOTEMPTY, 0 | F_NOMATCH, "(?:z|a*(*ACCEPT)b)", "bcx" },
-	{ MUA | PCRE_NOTEMPTY, 0, "(?:z|a*(*ACCEPT)b)", "bcaad" },
-	{ MUA | PCRE_NOTEMPTY, 0, "(?:z|a*?(*ACCEPT)b)", "bcaad" },
-	{ MUA | PCRE_NOTEMPTY_ATSTART, 0, "a*(*ACCEPT)b", "bcx" },
-	{ MUA | PCRE_NOTEMPTY_ATSTART, 0 | F_NOMATCH, "a*(*ACCEPT)b", "" },
-	{ MUA, 0, "((a(*ACCEPT)b))", "ab" },
-	{ MUA, 0, "(a(*FAIL)a|a)", "aaa" },
-	{ MUA, 0, "(?=ab(*ACCEPT)b)a", "ab" },
-	{ MUA, 0, "(?=(?:x|ab(*ACCEPT)b))", "ab" },
-	{ MUA, 0, "(?=(a(b(*ACCEPT)b)))a", "ab" },
-	{ MUA | PCRE_NOTEMPTY, 0, "(?=a*(*ACCEPT))c", "c" },
-
-	/* Conditional blocks. */
-	{ MUA, 0, "(?(?=(a))a|b)+k", "ababbalbbadabak" },
-	{ MUA, 0, "(?(?!(b))a|b)+k", "ababbalbbadabak" },
-	{ MUA, 0, "(?(?=a)a|b)+k", "ababbalbbadabak" },
-	{ MUA, 0, "(?(?!b)a|b)+k", "ababbalbbadabak" },
-	{ MUA, 0, "(?(?=(a))a*|b*)+k", "ababbalbbadabak" },
-	{ MUA, 0, "(?(?!(b))a*|b*)+k", "ababbalbbadabak" },
-	{ MUA, 0, "(?(?!(b))(?:aaaaaa|a)|(?:bbbbbb|b))+aaaak", "aaaaaaaaaaaaaa bbbbbbbbbbbbbbb aaaaaaak" },
-	{ MUA, 0, "(?(?!b)(?:aaaaaa|a)|(?:bbbbbb|b))+aaaak", "aaaaaaaaaaaaaa bbbbbbbbbbbbbbb aaaaaaak" },
-	{ MUA, 0 | F_DIFF, "(?(?!(b))(?:aaaaaa|a)|(?:bbbbbb|b))+bbbbk", "aaaaaaaaaaaaaa bbbbbbbbbbbbbbb bbbbbbbk" },
-	{ MUA, 0, "(?(?!b)(?:aaaaaa|a)|(?:bbbbbb|b))+bbbbk", "aaaaaaaaaaaaaa bbbbbbbbbbbbbbb bbbbbbbk" },
-	{ MUA, 0, "(?(?=a)a*|b*)+k", "ababbalbbadabak" },
-	{ MUA, 0, "(?(?!b)a*|b*)+k", "ababbalbbadabak" },
-	{ MUA, 0, "(?(?=a)ab)", "a" },
-	{ MUA, 0, "(?(?<!b)c)", "b" },
-	{ MUA, 0, "(?(DEFINE)a(b))", "a" },
-	{ MUA, 0, "a(?(DEFINE)(?:b|(?:c?)+)*)", "a" },
-	{ MUA, 0, "(?(?=.[a-c])[k-l]|[A-D])", "kdB" },
-	{ MUA, 0, "(?(?!.{0,4}[cd])(aa|bb)|(cc|dd))+", "aabbccddaa" },
-	{ MUA, 0, "(?(?=[^#@]*@)(aaab|aa|aba)|(aba|aab)){3,}", "aaabaaaba#aaabaaaba#aaabaaaba@" },
-	{ MUA, 0, "((?=\\w{5})\\w(?(?=\\w*k)\\d|[a-f_])*\\w\\s)+", "mol m10kk m088k _f_a_ mbkkl" },
-	{ MUA, 0, "(c)?\?(?(1)a|b)", "cdcaa" },
-	{ MUA, 0, "(c)?\?(?(1)a|b)", "cbb" },
-	{ MUA, 0 | F_DIFF, "(?(?=(a))(aaaa|a?))+aak", "aaaaab aaaaak" },
-	{ MUA, 0, "(?(?=a)(aaaa|a?))+aak", "aaaaab aaaaak" },
-	{ MUA, 0, "(?(?!(b))(aaaa|a?))+aak", "aaaaab aaaaak" },
-	{ MUA, 0, "(?(?!b)(aaaa|a?))+aak", "aaaaab aaaaak" },
-	{ MUA, 0 | F_DIFF, "(?(?=(a))a*)+aak", "aaaaab aaaaak" },
-	{ MUA, 0, "(?(?=a)a*)+aak", "aaaaab aaaaak" },
-	{ MUA, 0, "(?(?!(b))a*)+aak", "aaaaab aaaaak" },
-	{ MUA, 0, "(?(?!b)a*)+aak", "aaaaab aaaaak" },
-	{ MUA, 0, "(?(?=(?=(?!(x))a)aa)aaa|(?(?=(?!y)bb)bbb))*k", "abaabbaaabbbaaabbb abaabbaaabbbaaabbbk" },
-	{ MUA, 0, "(?P<Name>a)?(?P<Name2>b)?(?(Name)c|d)*l", "bc ddd abccabccl" },
-	{ MUA, 0, "(?P<Name>a)?(?P<Name2>b)?(?(Name)c|d)+?dd", "bcabcacdb bdddd" },
-	{ MUA, 0, "(?P<Name>a)?(?P<Name2>b)?(?(Name)c|d)+l", "ababccddabdbccd abcccl" },
-	{ MUA, 0, "((?:a|aa)(?(1)aaa))x", "aax" },
-	{ MUA, 0, "(?(?!)a|b)", "ab" },
-	{ MUA, 0, "(?(?!)a)", "ab" },
-	{ MUA, 0 | F_NOMATCH, "(?(?!)a|b)", "ac" },
-
-	/* Set start of match. */
-	{ MUA, 0, "(?:\\Ka)*aaaab", "aaaaaaaa aaaaaaabb" },
-	{ MUA, 0, "(?>\\Ka\\Ka)*aaaab", "aaaaaaaa aaaaaaaaaabb" },
-	{ MUA, 0, "a+\\K(?<=\\Gaa)a", "aaaaaa" },
-	{ MUA | PCRE_NOTEMPTY, 0 | F_NOMATCH, "a\\K(*ACCEPT)b", "aa" },
-	{ MUA | PCRE_NOTEMPTY_ATSTART, 0, "a\\K(*ACCEPT)b", "aa" },
-
-	/* First line. */
-	{ MUA | PCRE_FIRSTLINE, 0 | F_PROPERTY, "\\p{Any}a", "bb\naaa" },
-	{ MUA | PCRE_FIRSTLINE, 0 | F_NOMATCH | F_PROPERTY, "\\p{Any}a", "bb\r\naaa" },
-	{ MUA | PCRE_FIRSTLINE, 0, "(?<=a)", "a" },
-	{ MUA | PCRE_FIRSTLINE, 0 | F_NOMATCH, "[^a][^b]", "ab" },
-	{ MUA | PCRE_FIRSTLINE, 0 | F_NOMATCH, "a", "\na" },
-	{ MUA | PCRE_FIRSTLINE, 0 | F_NOMATCH, "[abc]", "\na" },
-	{ MUA | PCRE_FIRSTLINE, 0 | F_NOMATCH, "^a", "\na" },
-	{ MUA | PCRE_FIRSTLINE, 0 | F_NOMATCH, "^(?<=\n)", "\na" },
-	{ MUA | PCRE_FIRSTLINE, 0, "\xf0\x90\x90\x80", "\xf0\x90\x90\x80" },
-	{ PCRE_MULTILINE | PCRE_UTF8 | PCRE_NEWLINE_ANY | PCRE_FIRSTLINE, 0 | F_NOMATCH, "#", "\xc2\x85#" },
-	{ PCRE_MULTILINE | PCRE_NEWLINE_ANY | PCRE_FIRSTLINE, 0 | F_NOMATCH, "#", "\x85#" },
-	{ PCRE_MULTILINE | PCRE_UTF8 | PCRE_NEWLINE_ANY | PCRE_FIRSTLINE, 0 | F_NOMATCH, "^#", "\xe2\x80\xa8#" },
-	{ PCRE_MULTILINE | PCRE_UTF8 | PCRE_NEWLINE_CRLF | PCRE_FIRSTLINE, 0 | F_PROPERTY, "\\p{Any}", "\r\na" },
-	{ PCRE_MULTILINE | PCRE_UTF8 | PCRE_NEWLINE_CRLF | PCRE_FIRSTLINE, 0, ".", "\r" },
-	{ PCRE_MULTILINE | PCRE_UTF8 | PCRE_NEWLINE_CRLF | PCRE_FIRSTLINE, 0, "a", "\ra" },
-	{ PCRE_MULTILINE | PCRE_UTF8 | PCRE_NEWLINE_CRLF | PCRE_FIRSTLINE, 0 | F_NOMATCH, "ba", "bbb\r\nba" },
-	{ PCRE_MULTILINE | PCRE_UTF8 | PCRE_NEWLINE_CRLF | PCRE_FIRSTLINE, 0 | F_NOMATCH | F_PROPERTY, "\\p{Any}{4}|a", "\r\na" },
-	{ PCRE_MULTILINE | PCRE_UTF8 | PCRE_NEWLINE_CRLF | PCRE_FIRSTLINE, 1, ".", "\r\n" },
-	{ PCRE_FIRSTLINE | PCRE_NEWLINE_LF | PCRE_DOTALL, 0 | F_NOMATCH, "ab.", "ab" },
-	{ MUA | PCRE_FIRSTLINE, 1 | F_NOMATCH, "^[a-d0-9]", "\nxx\nd" },
-
-	/* Recurse. */
-	{ MUA, 0, "(a)(?1)", "aa" },
-	{ MUA, 0, "((a))(?1)", "aa" },
-	{ MUA, 0, "(b|a)(?1)", "aa" },
-	{ MUA, 0, "(b|(a))(?1)", "aa" },
-	{ MUA, 0 | F_NOMATCH, "((a)(b)(?:a*))(?1)", "aba" },
-	{ MUA, 0, "((a)(b)(?:a*))(?1)", "abab" },
-	{ MUA, 0, "((a+)c(?2))b(?1)", "aacaabaca" },
-	{ MUA, 0, "((?2)b|(a)){2}(?1)", "aabab" },
-	{ MUA, 0, "(?1)(a)*+(?2)(b(?1))", "aababa" },
-	{ MUA, 0, "(?1)(((a(*ACCEPT)))b)", "axaa" },
-	{ MUA, 0, "(?1)(?(DEFINE) (((ac(*ACCEPT)))b) )", "akaac" },
-	{ MUA, 0, "(a+)b(?1)b\\1", "abaaabaaaaa" },
-	{ MUA, 0 | F_NOMATCH, "(?(DEFINE)(aa|a))(?1)ab", "aab" },
-	{ MUA, 0, "(?(DEFINE)(a\\Kb))(?1)+ababc", "abababxabababc" },
-	{ MUA, 0, "(a\\Kb)(?1)+ababc", "abababxababababc" },
-	{ MUA, 0 | F_NOMATCH, "(a\\Kb)(?1)+ababc", "abababxababababxc" },
-	{ MUA, 0, "b|<(?R)*>", "<<b>" },
-	{ MUA, 0, "(a\\K){0}(?:(?1)b|ac)", "ac" },
-	{ MUA, 0, "(?(DEFINE)(a(?2)|b)(b(?1)|(a)))(?:(?1)|(?2))m", "ababababnababababaam" },
-	{ MUA, 0, "(a)((?(R)a|b))(?2)", "aabbabaa" },
-	{ MUA, 0, "(a)((?(R2)a|b))(?2)", "aabbabaa" },
-	{ MUA, 0, "(a)((?(R1)a|b))(?2)", "ababba" },
-	{ MUA, 0, "(?(R0)aa|bb(?R))", "abba aabb bbaa" },
-	{ MUA, 0, "((?(R)(?:aaaa|a)|(?:(aaaa)|(a)))+)(?1)$", "aaaaaaaaaa aaaa" },
-	{ MUA, 0, "(?P<Name>a(?(R&Name)a|b))(?1)", "aab abb abaa" },
-	{ MUA, 0, "((?(R)a|(?1)){3})", "XaaaaaaaaaX" },
-	{ MUA, 0, "((?:(?(R)a|(?1))){3})", "XaaaaaaaaaX" },
-	{ MUA, 0, "((?(R)a|(?1)){1,3})aaaaaa", "aaaaaaaaXaaaaaaaaa" },
-	{ MUA, 0, "((?(R)a|(?1)){1,3}?)M", "aaaM" },
-
-	/* 16 bit specific tests. */
-	{ CMA, 0 | F_FORCECONV, "\xc3\xa1", "\xc3\x81\xc3\xa1" },
-	{ CMA, 0 | F_FORCECONV, "\xe1\xbd\xb8", "\xe1\xbf\xb8\xe1\xbd\xb8" },
-	{ CMA, 0 | F_FORCECONV, "[\xc3\xa1]", "\xc3\x81\xc3\xa1" },
-	{ CMA, 0 | F_FORCECONV, "[\xe1\xbd\xb8]", "\xe1\xbf\xb8\xe1\xbd\xb8" },
-	{ CMA, 0 | F_FORCECONV, "[a-\xed\xb0\x80]", "A" },
-	{ CMA, 0 | F_NO8 | F_FORCECONV, "[a-\\x{dc00}]", "B" },
-	{ CMA, 0 | F_NO8 | F_NOMATCH | F_FORCECONV, "[b-\\x{dc00}]", "a" },
-	{ CMA, 0 | F_NO8 | F_FORCECONV, "\xed\xa0\x80\\x{d800}\xed\xb0\x80\\x{dc00}", "\xed\xa0\x80\xed\xa0\x80\xed\xb0\x80\xed\xb0\x80" },
-	{ CMA, 0 | F_NO8 | F_FORCECONV, "[\xed\xa0\x80\\x{d800}]{1,2}?[\xed\xb0\x80\\x{dc00}]{1,2}?#", "\xed\xa0\x80\xed\xa0\x80\xed\xb0\x80\xed\xb0\x80#" },
-	{ CMA, 0 | F_FORCECONV, "[\xed\xa0\x80\xed\xb0\x80#]{0,3}(?<=\xed\xb0\x80.)", "\xed\xa0\x80#\xed\xa0\x80##\xed\xb0\x80\xed\xa0\x80" },
-	{ CMA, 0 | F_FORCECONV, "[\xed\xa0\x80-\xed\xb3\xbf]", "\xed\x9f\xbf\xed\xa0\x83" },
-	{ CMA, 0 | F_FORCECONV, "[\xed\xa0\x80-\xed\xb3\xbf]", "\xed\xb4\x80\xed\xb3\xb0" },
-	{ CMA, 0 | F_NO8 | F_FORCECONV, "[\\x{d800}-\\x{dcff}]", "\xed\x9f\xbf\xed\xa0\x83" },
-	{ CMA, 0 | F_NO8 | F_FORCECONV, "[\\x{d800}-\\x{dcff}]", "\xed\xb4\x80\xed\xb3\xb0" },
-	{ CMA, 0 | F_FORCECONV, "[\xed\xa0\x80-\xef\xbf\xbf]+[\x1-\xed\xb0\x80]+#", "\xed\xa0\x85\xc3\x81\xed\xa0\x85\xef\xbf\xb0\xc2\x85\xed\xa9\x89#" },
-	{ CMA, 0 | F_FORCECONV, "[\xed\xa0\x80][\xed\xb0\x80]{2,}", "\xed\xa0\x80\xed\xb0\x80\xed\xa0\x80\xed\xb0\x80\xed\xb0\x80\xed\xb0\x80" },
-	{ MA, 0 | F_FORCECONV, "[^\xed\xb0\x80]{3,}?", "##\xed\xb0\x80#\xed\xb0\x80#\xc3\x89#\xed\xb0\x80" },
-	{ MA, 0 | F_NO8 | F_FORCECONV, "[^\\x{dc00}]{3,}?", "##\xed\xb0\x80#\xed\xb0\x80#\xc3\x89#\xed\xb0\x80" },
-	{ CMA, 0 | F_FORCECONV, ".\\B.", "\xed\xa0\x80\xed\xb0\x80" },
-	{ CMA, 0 | F_FORCECONV, "\\D+(?:\\d+|.)\\S+(?:\\s+|.)\\W+(?:\\w+|.)\xed\xa0\x80\xed\xa0\x80", "\xed\xa0\x80\xed\xa0\x80\xed\xa0\x80\xed\xa0\x80\xed\xa0\x80\xed\xa0\x80\xed\xa0\x80\xed\xa0\x80" },
-	{ CMA, 0 | F_FORCECONV, "\\d*\\s*\\w*\xed\xa0\x80\xed\xa0\x80", "\xed\xa0\x80\xed\xa0\x80" },
-	{ CMA, 0 | F_FORCECONV | F_NOMATCH, "\\d*?\\D*?\\s*?\\S*?\\w*?\\W*?##", "\xed\xa0\x80\xed\xa0\x80\xed\xa0\x80\xed\xa0\x80#" },
-	{ CMA | PCRE_EXTENDED, 0 | F_FORCECONV, "\xed\xa0\x80 \xed\xb0\x80 !", "\xed\xa0\x80\xed\xb0\x80!" },
-	{ CMA, 0 | F_FORCECONV, "\xed\xa0\x80+#[^#]+\xed\xa0\x80", "\xed\xa0\x80#a\xed\xa0\x80" },
-	{ CMA, 0 | F_FORCECONV, "(\xed\xa0\x80+)#\\1", "\xed\xa0\x80\xed\xa0\x80#\xed\xa0\x80\xed\xa0\x80" },
-	{ PCRE_MULTILINE | PCRE_NEWLINE_ANY, 0 | F_NO8 | F_FORCECONV, "^-", "a--\xe2\x80\xa8--" },
-	{ PCRE_BSR_UNICODE, 0 | F_NO8 | F_FORCECONV, "\\R", "ab\xe2\x80\xa8" },
-	{ 0, 0 | F_NO8 | F_FORCECONV, "\\v", "ab\xe2\x80\xa9" },
-	{ 0, 0 | F_NO8 | F_FORCECONV, "\\h", "ab\xe1\xa0\x8e" },
-	{ 0, 0 | F_NO8 | F_FORCECONV, "\\v+?\\V+?#", "\xe2\x80\xa9\xe2\x80\xa9\xef\xbf\xbf\xef\xbf\xbf#" },
-	{ 0, 0 | F_NO8 | F_FORCECONV, "\\h+?\\H+?#", "\xe1\xa0\x8e\xe1\xa0\x8e\xef\xbf\xbf\xef\xbf\xbf#" },
-
-	/* Partial matching. */
-	{ MUA | PCRE_PARTIAL_SOFT, 0, "ab", "a" },
-	{ MUA | PCRE_PARTIAL_SOFT, 0, "ab|a", "a" },
-	{ MUA | PCRE_PARTIAL_HARD, 0, "ab|a", "a" },
-	{ MUA | PCRE_PARTIAL_SOFT, 0, "\\b#", "a" },
-	{ MUA | PCRE_PARTIAL_SOFT, 0, "(?<=a)b", "a" },
-	{ MUA | PCRE_PARTIAL_SOFT, 0, "abc|(?<=xxa)bc", "xxab" },
-	{ MUA | PCRE_PARTIAL_SOFT, 0, "a\\B", "a" },
-	{ MUA | PCRE_PARTIAL_HARD, 0, "a\\b", "a" },
-
-	/* (*MARK) verb. */
-	{ MUA, 0, "a(*MARK:aa)a", "ababaa" },
-	{ MUA, 0 | F_NOMATCH, "a(*:aa)a", "abab" },
-	{ MUA, 0, "a(*:aa)(b(*:bb)b|bc)", "abc" },
-	{ MUA, 0 | F_NOMATCH, "a(*:1)x|b(*:2)y", "abc" },
-	{ MUA, 0, "(?>a(*:aa))b|ac", "ac" },
-	{ MUA, 0, "(?(DEFINE)(a(*:aa)))(?1)", "a" },
-	{ MUA, 0 | F_NOMATCH, "(?(DEFINE)((a)(*:aa)))(?1)b", "aa" },
-	{ MUA, 0, "(?(DEFINE)(a(*:aa)))a(?1)b|aac", "aac" },
-	{ MUA, 0, "(a(*:aa)){0}(?:b(?1)b|c)+c", "babbab cc" },
-	{ MUA, 0, "(a(*:aa)){0}(?:b(?1)b)+", "babba" },
-	{ MUA, 0 | F_NOMATCH | F_STUDY, "(a(*:aa)){0}(?:b(?1)b)+", "ba" },
-	{ MUA, 0, "(a\\K(*:aa)){0}(?:b(?1)b|c)+c", "babbab cc" },
-	{ MUA, 0, "(a\\K(*:aa)){0}(?:b(?1)b)+", "babba" },
-	{ MUA, 0 | F_NOMATCH | F_STUDY, "(a\\K(*:aa)){0}(?:b(?1)b)+", "ba" },
-	{ MUA, 0 | F_NOMATCH | F_STUDY, "(*:mark)m", "a" },
-
-	/* (*COMMIT) verb. */
-	{ MUA, 0 | F_NOMATCH, "a(*COMMIT)b", "ac" },
-	{ MUA, 0, "aa(*COMMIT)b", "xaxaab" },
-	{ MUA, 0 | F_NOMATCH, "a(*COMMIT)(*:msg)b|ac", "ac" },
-	{ MUA, 0 | F_NOMATCH, "(a(*COMMIT)b)++", "abac" },
-	{ MUA, 0 | F_NOMATCH, "((a)(*COMMIT)b)++", "abac" },
-	{ MUA, 0 | F_NOMATCH, "(?=a(*COMMIT)b)ab|ad", "ad" },
-
-	/* (*PRUNE) verb. */
-	{ MUA, 0, "aa\\K(*PRUNE)b", "aaab" },
-	{ MUA, 0, "aa(*PRUNE:bb)b|a", "aa" },
-	{ MUA, 0, "(a)(a)(*PRUNE)b|(a)", "aa" },
-	{ MUA, 0, "(a)(a)(a)(a)(a)(a)(a)(a)(*PRUNE)b|(a)", "aaaaaaaa" },
-	{ MUA | PCRE_PARTIAL_SOFT, 0, "a(*PRUNE)a|", "a" },
-	{ MUA | PCRE_PARTIAL_SOFT, 0, "a(*PRUNE)a|m", "a" },
-	{ MUA, 0 | F_NOMATCH, "(?=a(*PRUNE)b)ab|ad", "ad" },
-	{ MUA, 0, "a(*COMMIT)(*PRUNE)d|bc", "abc" },
-	{ MUA, 0, "(?=a(*COMMIT)b)a(*PRUNE)c|bc", "abc" },
-	{ MUA, 0 | F_NOMATCH, "(*COMMIT)(?=a(*COMMIT)b)a(*PRUNE)c|bc", "abc" },
-	{ MUA, 0, "(?=(a)(*COMMIT)b)a(*PRUNE)c|bc", "abc" },
-	{ MUA, 0 | F_NOMATCH, "(*COMMIT)(?=(a)(*COMMIT)b)a(*PRUNE)c|bc", "abc" },
-	{ MUA, 0, "(a(*COMMIT)b){0}a(?1)(*PRUNE)c|bc", "abc" },
-	{ MUA, 0 | F_NOMATCH, "(a(*COMMIT)b){0}a(*COMMIT)(?1)(*PRUNE)c|bc", "abc" },
-	{ MUA, 0, "(a(*COMMIT)b)++(*PRUNE)d|c", "ababc" },
-	{ MUA, 0 | F_NOMATCH, "(*COMMIT)(a(*COMMIT)b)++(*PRUNE)d|c", "ababc" },
-	{ MUA, 0, "((a)(*COMMIT)b)++(*PRUNE)d|c", "ababc" },
-	{ MUA, 0 | F_NOMATCH, "(*COMMIT)((a)(*COMMIT)b)++(*PRUNE)d|c", "ababc" },
-	{ MUA, 0, "(?>a(*COMMIT)b)*abab(*PRUNE)d|ba", "ababab" },
-	{ MUA, 0 | F_NOMATCH, "(*COMMIT)(?>a(*COMMIT)b)*abab(*PRUNE)d|ba", "ababab" },
-	{ MUA, 0, "(?>a(*COMMIT)b)+abab(*PRUNE)d|ba", "ababab" },
-	{ MUA, 0 | F_NOMATCH, "(*COMMIT)(?>a(*COMMIT)b)+abab(*PRUNE)d|ba", "ababab" },
-	{ MUA, 0, "(?>a(*COMMIT)b)?ab(*PRUNE)d|ba", "aba" },
-	{ MUA, 0 | F_NOMATCH, "(*COMMIT)(?>a(*COMMIT)b)?ab(*PRUNE)d|ba", "aba" },
-	{ MUA, 0, "(?>a(*COMMIT)b)*?n(*PRUNE)d|ba", "abababn" },
-	{ MUA, 0 | F_NOMATCH, "(*COMMIT)(?>a(*COMMIT)b)*?n(*PRUNE)d|ba", "abababn" },
-	{ MUA, 0, "(?>a(*COMMIT)b)+?n(*PRUNE)d|ba", "abababn" },
-	{ MUA, 0 | F_NOMATCH, "(*COMMIT)(?>a(*COMMIT)b)+?n(*PRUNE)d|ba", "abababn" },
-	{ MUA, 0, "(?>a(*COMMIT)b)??n(*PRUNE)d|bn", "abn" },
-	{ MUA, 0 | F_NOMATCH, "(*COMMIT)(?>a(*COMMIT)b)??n(*PRUNE)d|bn", "abn" },
-
-	/* (*SKIP) verb. */
-	{ MUA, 0 | F_NOMATCH, "(?=a(*SKIP)b)ab|ad", "ad" },
-
-	/* (*THEN) verb. */
-	{ MUA, 0, "((?:a(*THEN)|aab)(*THEN)c|a+)+m", "aabcaabcaabcaabcnacm" },
-	{ MUA, 0 | F_NOMATCH, "((?:a(*THEN)|aab)(*THEN)c|a+)+m", "aabcm" },
-	{ MUA, 0, "((?:a(*THEN)|aab)c|a+)+m", "aabcaabcnmaabcaabcm" },
-	{ MUA, 0, "((?:a|aab)(*THEN)c|a+)+m", "aam" },
-	{ MUA, 0, "((?:a(*COMMIT)|aab)(*THEN)c|a+)+m", "aam" },
-	{ MUA, 0, "(?(?=a(*THEN)b)ab|ad)", "ad" },
-	{ MUA, 0, "(?(?!a(*THEN)b)ad|add)", "add" },
-	{ MUA, 0 | F_NOMATCH, "(?(?=a)a(*THEN)b|ad)", "ad" },
-	{ MUA, 0, "(?!(?(?=a)ab|b(*THEN)d))bn|bnn", "bnn" },
-
-	/* Deep recursion. */
-	{ MUA, 0, "((((?:(?:(?:\\w)+)?)*|(?>\\w)+?)+|(?>\\w)?\?)*)?\\s", "aaaaa+ " },
-	{ MUA, 0, "(?:((?:(?:(?:\\w*?)+)??|(?>\\w)?|\\w*+)*)+)+?\\s", "aa+ " },
-	{ MUA, 0, "((a?)+)+b", "aaaaaaaaaaaa b" },
-
-	/* Deep recursion: Stack limit reached. */
-	{ MA, 0 | F_NOMATCH, "a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?aaaaaaaaaaaaaaaaaaaaaaa", "aaaaaaaaaaaaaaaaaaaaaaa" },
-	{ MA, 0 | F_NOMATCH, "(?:a+)+b", "aaaaaaaaaaaaaaaaaaaaaaaa b" },
-	{ MA, 0 | F_NOMATCH, "(?:a+?)+?b", "aaaaaaaaaaaaaaaaaaaaaaaa b" },
-	{ MA, 0 | F_NOMATCH, "(?:a*)*b", "aaaaaaaaaaaaaaaaaaaaaaaa b" },
-	{ MA, 0 | F_NOMATCH, "(?:a*?)*?b", "aaaaaaaaaaaaaaaaaaaaaaaa b" },
-
-	{ 0, 0, NULL, NULL }
-};
-
-static const unsigned char *tables(int mode)
-{
-	/* The purpose of this function to allow valgrind
-	for reporting invalid reads and writes. */
-	static unsigned char *tables_copy;
-	const char *errorptr;
-	int erroroffset;
-	unsigned char *default_tables;
-#if defined SUPPORT_PCRE8
-	pcre *regex;
-	char null_str[1] = { 0 };
-#elif defined SUPPORT_PCRE16
-	pcre16 *regex;
-	PCRE_UCHAR16 null_str[1] = { 0 };
-#elif defined SUPPORT_PCRE32
-	pcre32 *regex;
-	PCRE_UCHAR32 null_str[1] = { 0 };
-#endif
-
-	if (mode) {
-		if (tables_copy)
-			free(tables_copy);
-		tables_copy = NULL;
-		return NULL;
-	}
-
-	if (tables_copy)
-		return tables_copy;
-
-	default_tables = NULL;
-#if defined SUPPORT_PCRE8
-	regex = pcre_compile(null_str, 0, &errorptr, &erroroffset, NULL);
-	if (regex) {
-		pcre_fullinfo(regex, NULL, PCRE_INFO_DEFAULT_TABLES, &default_tables);
-		pcre_free(regex);
-	}
-#elif defined SUPPORT_PCRE16
-	regex = pcre16_compile(null_str, 0, &errorptr, &erroroffset, NULL);
-	if (regex) {
-		pcre16_fullinfo(regex, NULL, PCRE_INFO_DEFAULT_TABLES, &default_tables);
-		pcre16_free(regex);
-	}
-#elif defined SUPPORT_PCRE32
-	regex = pcre32_compile(null_str, 0, &errorptr, &erroroffset, NULL);
-	if (regex) {
-		pcre32_fullinfo(regex, NULL, PCRE_INFO_DEFAULT_TABLES, &default_tables);
-		pcre32_free(regex);
-	}
-#endif
-	/* Shouldn't ever happen. */
-	if (!default_tables)
-		return NULL;
-
-	/* Unfortunately this value cannot get from pcre_fullinfo.
-	Since this is a test program, this is acceptable at the moment. */
-	tables_copy = (unsigned char *)malloc(1088);
-	if (!tables_copy)
-		return NULL;
-
-	memcpy(tables_copy, default_tables, 1088);
-	return tables_copy;
-}
-
-#ifdef SUPPORT_PCRE8
-static pcre_jit_stack* callback8(void *arg)
-{
-	return (pcre_jit_stack *)arg;
-}
-#endif
-
-#ifdef SUPPORT_PCRE16
-static pcre16_jit_stack* callback16(void *arg)
-{
-	return (pcre16_jit_stack *)arg;
-}
-#endif
-
-#ifdef SUPPORT_PCRE32
-static pcre32_jit_stack* callback32(void *arg)
-{
-	return (pcre32_jit_stack *)arg;
-}
-#endif
-
-#ifdef SUPPORT_PCRE8
-static pcre_jit_stack *stack8;
-
-static pcre_jit_stack *getstack8(void)
-{
-	if (!stack8)
-		stack8 = pcre_jit_stack_alloc(1, 1024 * 1024);
-	return stack8;
-}
-
-static void setstack8(pcre_extra *extra)
-{
-	if (!extra) {
-		if (stack8)
-			pcre_jit_stack_free(stack8);
-		stack8 = NULL;
-		return;
-	}
-
-	pcre_assign_jit_stack(extra, callback8, getstack8());
-}
-#endif /* SUPPORT_PCRE8 */
-
-#ifdef SUPPORT_PCRE16
-static pcre16_jit_stack *stack16;
-
-static pcre16_jit_stack *getstack16(void)
-{
-	if (!stack16)
-		stack16 = pcre16_jit_stack_alloc(1, 1024 * 1024);
-	return stack16;
-}
-
-static void setstack16(pcre16_extra *extra)
-{
-	if (!extra) {
-		if (stack16)
-			pcre16_jit_stack_free(stack16);
-		stack16 = NULL;
-		return;
-	}
-
-	pcre16_assign_jit_stack(extra, callback16, getstack16());
-}
-#endif /* SUPPORT_PCRE16 */
-
-#ifdef SUPPORT_PCRE32
-static pcre32_jit_stack *stack32;
-
-static pcre32_jit_stack *getstack32(void)
-{
-	if (!stack32)
-		stack32 = pcre32_jit_stack_alloc(1, 1024 * 1024);
-	return stack32;
-}
-
-static void setstack32(pcre32_extra *extra)
-{
-	if (!extra) {
-		if (stack32)
-			pcre32_jit_stack_free(stack32);
-		stack32 = NULL;
-		return;
-	}
-
-	pcre32_assign_jit_stack(extra, callback32, getstack32());
-}
-#endif /* SUPPORT_PCRE32 */
-
-#ifdef SUPPORT_PCRE16
-
-static int convert_utf8_to_utf16(const char *input, PCRE_UCHAR16 *output, int *offsetmap, int max_length)
-{
-	unsigned char *iptr = (unsigned char*)input;
-	PCRE_UCHAR16 *optr = output;
-	unsigned int c;
-
-	if (max_length == 0)
-		return 0;
-
-	while (*iptr && max_length > 1) {
-		c = 0;
-		if (offsetmap)
-			*offsetmap++ = (int)(iptr - (unsigned char*)input);
-
-		if (*iptr < 0xc0)
-			c = *iptr++;
-		else if (!(*iptr & 0x20)) {
-			c = ((iptr[0] & 0x1f) << 6) | (iptr[1] & 0x3f);
-			iptr += 2;
-		} else if (!(*iptr & 0x10)) {
-			c = ((iptr[0] & 0x0f) << 12) | ((iptr[1] & 0x3f) << 6) | (iptr[2] & 0x3f);
-			iptr += 3;
-		} else if (!(*iptr & 0x08)) {
-			c = ((iptr[0] & 0x07) << 18) | ((iptr[1] & 0x3f) << 12) | ((iptr[2] & 0x3f) << 6) | (iptr[3] & 0x3f);
-			iptr += 4;
-		}
-
-		if (c < 65536) {
-			*optr++ = c;
-			max_length--;
-		} else if (max_length <= 2) {
-			*optr = '\0';
-			return (int)(optr - output);
-		} else {
-			c -= 0x10000;
-			*optr++ = 0xd800 | ((c >> 10) & 0x3ff);
-			*optr++ = 0xdc00 | (c & 0x3ff);
-			max_length -= 2;
-			if (offsetmap)
-				offsetmap++;
-		}
-	}
-	if (offsetmap)
-		*offsetmap = (int)(iptr - (unsigned char*)input);
-	*optr = '\0';
-	return (int)(optr - output);
-}
-
-static int copy_char8_to_char16(const char *input, PCRE_UCHAR16 *output, int max_length)
-{
-	unsigned char *iptr = (unsigned char*)input;
-	PCRE_UCHAR16 *optr = output;
-
-	if (max_length == 0)
-		return 0;
-
-	while (*iptr && max_length > 1) {
-		*optr++ = *iptr++;
-		max_length--;
-	}
-	*optr = '\0';
-	return (int)(optr - output);
-}
-
-#define REGTEST_MAX_LENGTH16 4096
-static PCRE_UCHAR16 regtest_buf16[REGTEST_MAX_LENGTH16];
-static int regtest_offsetmap16[REGTEST_MAX_LENGTH16];
-
-#endif /* SUPPORT_PCRE16 */
-
-#ifdef SUPPORT_PCRE32
-
-static int convert_utf8_to_utf32(const char *input, PCRE_UCHAR32 *output, int *offsetmap, int max_length)
-{
-	unsigned char *iptr = (unsigned char*)input;
-	PCRE_UCHAR32 *optr = output;
-	unsigned int c;
-
-	if (max_length == 0)
-		return 0;
-
-	while (*iptr && max_length > 1) {
-		c = 0;
-		if (offsetmap)
-			*offsetmap++ = (int)(iptr - (unsigned char*)input);
-
-		if (*iptr < 0xc0)
-			c = *iptr++;
-		else if (!(*iptr & 0x20)) {
-			c = ((iptr[0] & 0x1f) << 6) | (iptr[1] & 0x3f);
-			iptr += 2;
-		} else if (!(*iptr & 0x10)) {
-			c = ((iptr[0] & 0x0f) << 12) | ((iptr[1] & 0x3f) << 6) | (iptr[2] & 0x3f);
-			iptr += 3;
-		} else if (!(*iptr & 0x08)) {
-			c = ((iptr[0] & 0x07) << 18) | ((iptr[1] & 0x3f) << 12) | ((iptr[2] & 0x3f) << 6) | (iptr[3] & 0x3f);
-			iptr += 4;
-		}
-
-		*optr++ = c;
-		max_length--;
-	}
-	if (offsetmap)
-		*offsetmap = (int)(iptr - (unsigned char*)input);
-	*optr = 0;
-	return (int)(optr - output);
-}
-
-static int copy_char8_to_char32(const char *input, PCRE_UCHAR32 *output, int max_length)
-{
-	unsigned char *iptr = (unsigned char*)input;
-	PCRE_UCHAR32 *optr = output;
-
-	if (max_length == 0)
-		return 0;
-
-	while (*iptr && max_length > 1) {
-		*optr++ = *iptr++;
-		max_length--;
-	}
-	*optr = '\0';
-	return (int)(optr - output);
-}
-
-#define REGTEST_MAX_LENGTH32 4096
-static PCRE_UCHAR32 regtest_buf32[REGTEST_MAX_LENGTH32];
-static int regtest_offsetmap32[REGTEST_MAX_LENGTH32];
-
-#endif /* SUPPORT_PCRE32 */
-
-static int check_ascii(const char *input)
-{
-	const unsigned char *ptr = (unsigned char *)input;
-	while (*ptr) {
-		if (*ptr > 127)
-			return 0;
-		ptr++;
-	}
-	return 1;
-}
-
-static int regression_tests(void)
-{
-	struct regression_test_case *current = regression_test_cases;
-	const char *error;
-	char *cpu_info;
-	int i, err_offs;
-	int is_successful, is_ascii;
-	int total = 0;
-	int successful = 0;
-	int successful_row = 0;
-	int counter = 0;
-	int study_mode;
-	int utf = 0, ucp = 0;
-	int disabled_flags = 0;
-#ifdef SUPPORT_PCRE8
-	pcre *re8;
-	pcre_extra *extra8;
-	pcre_extra dummy_extra8;
-	int ovector8_1[32];
-	int ovector8_2[32];
-	int return_value8[2];
-	unsigned char *mark8_1, *mark8_2;
-#endif
-#ifdef SUPPORT_PCRE16
-	pcre16 *re16;
-	pcre16_extra *extra16;
-	pcre16_extra dummy_extra16;
-	int ovector16_1[32];
-	int ovector16_2[32];
-	int return_value16[2];
-	PCRE_UCHAR16 *mark16_1, *mark16_2;
-	int length16;
-#endif
-#ifdef SUPPORT_PCRE32
-	pcre32 *re32;
-	pcre32_extra *extra32;
-	pcre32_extra dummy_extra32;
-	int ovector32_1[32];
-	int ovector32_2[32];
-	int return_value32[2];
-	PCRE_UCHAR32 *mark32_1, *mark32_2;
-	int length32;
-#endif
-
-	/* This test compares the behaviour of interpreter and JIT. Although disabling
-	utf or ucp may make tests fail, if the pcre_exec result is the SAME, it is
-	still considered successful from pcre_jit_test point of view. */
-
-#if defined SUPPORT_PCRE8
-	pcre_config(PCRE_CONFIG_JITTARGET, &cpu_info);
-#elif defined SUPPORT_PCRE16
-	pcre16_config(PCRE_CONFIG_JITTARGET, &cpu_info);
-#elif defined SUPPORT_PCRE32
-	pcre32_config(PCRE_CONFIG_JITTARGET, &cpu_info);
-#endif
-
-	printf("Running JIT regression tests\n");
-	printf("  target CPU of SLJIT compiler: %s\n", cpu_info);
-
-#if defined SUPPORT_PCRE8
-	pcre_config(PCRE_CONFIG_UTF8, &utf);
-	pcre_config(PCRE_CONFIG_UNICODE_PROPERTIES, &ucp);
-#elif defined SUPPORT_PCRE16
-	pcre16_config(PCRE_CONFIG_UTF16, &utf);
-	pcre16_config(PCRE_CONFIG_UNICODE_PROPERTIES, &ucp);
-#elif defined SUPPORT_PCRE32
-	pcre32_config(PCRE_CONFIG_UTF32, &utf);
-	pcre32_config(PCRE_CONFIG_UNICODE_PROPERTIES, &ucp);
-#endif
-
-	if (!utf)
-		disabled_flags |= PCRE_UTF8 | PCRE_UTF16 | PCRE_UTF32;
-	if (!ucp)
-		disabled_flags |= PCRE_UCP;
-#ifdef SUPPORT_PCRE8
-	printf("  in  8 bit mode with UTF-8  %s and ucp %s:\n", utf ? "enabled" : "disabled", ucp ? "enabled" : "disabled");
-#endif
-#ifdef SUPPORT_PCRE16
-	printf("  in 16 bit mode with UTF-16 %s and ucp %s:\n", utf ? "enabled" : "disabled", ucp ? "enabled" : "disabled");
-#endif
-#ifdef SUPPORT_PCRE32
-	printf("  in 32 bit mode with UTF-32 %s and ucp %s:\n", utf ? "enabled" : "disabled", ucp ? "enabled" : "disabled");
-#endif
-
-	while (current->pattern) {
-		/* printf("\nPattern: %s :\n", current->pattern); */
-		total++;
-		is_ascii = 0;
-		if (!(current->start_offset & F_PROPERTY))
-			is_ascii = check_ascii(current->pattern) && check_ascii(current->input);
-
-		if (current->flags & PCRE_PARTIAL_SOFT)
-			study_mode = PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE;
-		else if (current->flags & PCRE_PARTIAL_HARD)
-			study_mode = PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE;
-		else
-			study_mode = PCRE_STUDY_JIT_COMPILE;
-		error = NULL;
-#ifdef SUPPORT_PCRE8
-		re8 = NULL;
-		if (!(current->start_offset & F_NO8))
-			re8 = pcre_compile(current->pattern,
-				current->flags & ~(PCRE_NOTBOL | PCRE_NOTEOL | PCRE_NOTEMPTY | PCRE_NOTEMPTY_ATSTART | PCRE_PARTIAL_SOFT | PCRE_PARTIAL_HARD | disabled_flags),
-				&error, &err_offs, tables(0));
-
-		extra8 = NULL;
-		if (re8) {
-			error = NULL;
-			extra8 = pcre_study(re8, study_mode, &error);
-			if (!extra8) {
-				printf("\n8 bit: Cannot study pattern: %s\n", current->pattern);
-				pcre_free(re8);
-				re8 = NULL;
-			}
-			else if (!(extra8->flags & PCRE_EXTRA_EXECUTABLE_JIT)) {
-				printf("\n8 bit: JIT compiler does not support: %s\n", current->pattern);
-				pcre_free_study(extra8);
-				pcre_free(re8);
-				re8 = NULL;
-			}
-			extra8->flags |= PCRE_EXTRA_MARK;
-		} else if (((utf && ucp) || is_ascii) && !(current->start_offset & F_NO8))
-			printf("\n8 bit: Cannot compile pattern \"%s\": %s\n", current->pattern, error);
-#endif
-#ifdef SUPPORT_PCRE16
-		if ((current->flags & PCRE_UTF16) || (current->start_offset & F_FORCECONV))
-			convert_utf8_to_utf16(current->pattern, regtest_buf16, NULL, REGTEST_MAX_LENGTH16);
-		else
-			copy_char8_to_char16(current->pattern, regtest_buf16, REGTEST_MAX_LENGTH16);
-
-		re16 = NULL;
-		if (!(current->start_offset & F_NO16))
-			re16 = pcre16_compile(regtest_buf16,
-				current->flags & ~(PCRE_NOTBOL | PCRE_NOTEOL | PCRE_NOTEMPTY | PCRE_NOTEMPTY_ATSTART | PCRE_PARTIAL_SOFT | PCRE_PARTIAL_HARD | disabled_flags),
-				&error, &err_offs, tables(0));
-
-		extra16 = NULL;
-		if (re16) {
-			error = NULL;
-			extra16 = pcre16_study(re16, study_mode, &error);
-			if (!extra16) {
-				printf("\n16 bit: Cannot study pattern: %s\n", current->pattern);
-				pcre16_free(re16);
-				re16 = NULL;
-			}
-			else if (!(extra16->flags & PCRE_EXTRA_EXECUTABLE_JIT)) {
-				printf("\n16 bit: JIT compiler does not support: %s\n", current->pattern);
-				pcre16_free_study(extra16);
-				pcre16_free(re16);
-				re16 = NULL;
-			}
-			extra16->flags |= PCRE_EXTRA_MARK;
-		} else if (((utf && ucp) || is_ascii) && !(current->start_offset & F_NO16))
-			printf("\n16 bit: Cannot compile pattern \"%s\": %s\n", current->pattern, error);
-#endif
-#ifdef SUPPORT_PCRE32
-		if ((current->flags & PCRE_UTF32) || (current->start_offset & F_FORCECONV))
-			convert_utf8_to_utf32(current->pattern, regtest_buf32, NULL, REGTEST_MAX_LENGTH32);
-		else
-			copy_char8_to_char32(current->pattern, regtest_buf32, REGTEST_MAX_LENGTH32);
-
-		re32 = NULL;
-		if (!(current->start_offset & F_NO32))
-			re32 = pcre32_compile(regtest_buf32,
-				current->flags & ~(PCRE_NOTBOL | PCRE_NOTEOL | PCRE_NOTEMPTY | PCRE_NOTEMPTY_ATSTART | PCRE_PARTIAL_SOFT | PCRE_PARTIAL_HARD | disabled_flags),
-				&error, &err_offs, tables(0));
-
-		extra32 = NULL;
-		if (re32) {
-			error = NULL;
-			extra32 = pcre32_study(re32, study_mode, &error);
-			if (!extra32) {
-				printf("\n32 bit: Cannot study pattern: %s\n", current->pattern);
-				pcre32_free(re32);
-				re32 = NULL;
-			}
-			if (!(extra32->flags & PCRE_EXTRA_EXECUTABLE_JIT)) {
-				printf("\n32 bit: JIT compiler does not support: %s\n", current->pattern);
-				pcre32_free_study(extra32);
-				pcre32_free(re32);
-				re32 = NULL;
-			}
-			extra32->flags |= PCRE_EXTRA_MARK;
-		} else if (((utf && ucp) || is_ascii) && !(current->start_offset & F_NO32))
-			printf("\n32 bit: Cannot compile pattern \"%s\": %s\n", current->pattern, error);
-#endif
-
-		counter++;
-		if ((counter & 0x3) != 0) {
-#ifdef SUPPORT_PCRE8
-			setstack8(NULL);
-#endif
-#ifdef SUPPORT_PCRE16
-			setstack16(NULL);
-#endif
-#ifdef SUPPORT_PCRE32
-			setstack32(NULL);
-#endif
-		}
-
-#ifdef SUPPORT_PCRE8
-		return_value8[0] = -1000;
-		return_value8[1] = -1000;
-		for (i = 0; i < 32; ++i)
-			ovector8_1[i] = -2;
-		for (i = 0; i < 32; ++i)
-			ovector8_2[i] = -2;
-		if (re8) {
-			mark8_1 = NULL;
-			mark8_2 = NULL;
-			extra8->mark = &mark8_1;
-
-			if ((counter & 0x1) != 0) {
-				setstack8(extra8);
-				return_value8[0] = pcre_exec(re8, extra8, current->input, strlen(current->input), current->start_offset & OFFSET_MASK,
-					current->flags & (PCRE_NOTBOL | PCRE_NOTEOL | PCRE_NOTEMPTY | PCRE_NOTEMPTY_ATSTART | PCRE_PARTIAL_SOFT | PCRE_PARTIAL_HARD | PCRE_NO_UTF8_CHECK), ovector8_1, 32);
-			} else
-				return_value8[0] = pcre_jit_exec(re8, extra8, current->input, strlen(current->input), current->start_offset & OFFSET_MASK,
-					current->flags & (PCRE_NOTBOL | PCRE_NOTEOL | PCRE_NOTEMPTY | PCRE_NOTEMPTY_ATSTART | PCRE_PARTIAL_SOFT | PCRE_PARTIAL_HARD | PCRE_NO_UTF8_CHECK), ovector8_1, 32, getstack8());
-			memset(&dummy_extra8, 0, sizeof(pcre_extra));
-			dummy_extra8.flags = PCRE_EXTRA_MARK;
-			if (current->start_offset & F_STUDY) {
-				dummy_extra8.flags |= PCRE_EXTRA_STUDY_DATA;
-				dummy_extra8.study_data = extra8->study_data;
-			}
-			dummy_extra8.mark = &mark8_2;
-			return_value8[1] = pcre_exec(re8, &dummy_extra8, current->input, strlen(current->input), current->start_offset & OFFSET_MASK,
-				current->flags & (PCRE_NOTBOL | PCRE_NOTEOL | PCRE_NOTEMPTY | PCRE_NOTEMPTY_ATSTART | PCRE_PARTIAL_SOFT | PCRE_PARTIAL_HARD | PCRE_NO_UTF8_CHECK), ovector8_2, 32);
-		}
-#endif
-
-#ifdef SUPPORT_PCRE16
-		return_value16[0] = -1000;
-		return_value16[1] = -1000;
-		for (i = 0; i < 32; ++i)
-			ovector16_1[i] = -2;
-		for (i = 0; i < 32; ++i)
-			ovector16_2[i] = -2;
-		if (re16) {
-			mark16_1 = NULL;
-			mark16_2 = NULL;
-			if ((current->flags & PCRE_UTF16) || (current->start_offset & F_FORCECONV))
-				length16 = convert_utf8_to_utf16(current->input, regtest_buf16, regtest_offsetmap16, REGTEST_MAX_LENGTH16);
-			else
-				length16 = copy_char8_to_char16(current->input, regtest_buf16, REGTEST_MAX_LENGTH16);
-			extra16->mark = &mark16_1;
-			if ((counter & 0x1) != 0) {
-				setstack16(extra16);
-				return_value16[0] = pcre16_exec(re16, extra16, regtest_buf16, length16, current->start_offset & OFFSET_MASK,
-					current->flags & (PCRE_NOTBOL | PCRE_NOTEOL | PCRE_NOTEMPTY | PCRE_NOTEMPTY_ATSTART | PCRE_PARTIAL_SOFT | PCRE_PARTIAL_HARD | PCRE_NO_UTF8_CHECK), ovector16_1, 32);
-			} else
-				return_value16[0] = pcre16_jit_exec(re16, extra16, regtest_buf16, length16, current->start_offset & OFFSET_MASK,
-					current->flags & (PCRE_NOTBOL | PCRE_NOTEOL | PCRE_NOTEMPTY | PCRE_NOTEMPTY_ATSTART | PCRE_PARTIAL_SOFT | PCRE_PARTIAL_HARD | PCRE_NO_UTF8_CHECK), ovector16_1, 32, getstack16());
-			memset(&dummy_extra16, 0, sizeof(pcre16_extra));
-			dummy_extra16.flags = PCRE_EXTRA_MARK;
-			if (current->start_offset & F_STUDY) {
-				dummy_extra16.flags |= PCRE_EXTRA_STUDY_DATA;
-				dummy_extra16.study_data = extra16->study_data;
-			}
-			dummy_extra16.mark = &mark16_2;
-			return_value16[1] = pcre16_exec(re16, &dummy_extra16, regtest_buf16, length16, current->start_offset & OFFSET_MASK,
-				current->flags & (PCRE_NOTBOL | PCRE_NOTEOL | PCRE_NOTEMPTY | PCRE_NOTEMPTY_ATSTART | PCRE_PARTIAL_SOFT | PCRE_PARTIAL_HARD | PCRE_NO_UTF8_CHECK), ovector16_2, 32);
-		}
-#endif
-
-#ifdef SUPPORT_PCRE32
-		return_value32[0] = -1000;
-		return_value32[1] = -1000;
-		for (i = 0; i < 32; ++i)
-			ovector32_1[i] = -2;
-		for (i = 0; i < 32; ++i)
-			ovector32_2[i] = -2;
-		if (re32) {
-			mark32_1 = NULL;
-			mark32_2 = NULL;
-			if ((current->flags & PCRE_UTF32) || (current->start_offset & F_FORCECONV))
-				length32 = convert_utf8_to_utf32(current->input, regtest_buf32, regtest_offsetmap32, REGTEST_MAX_LENGTH32);
-			else
-				length32 = copy_char8_to_char32(current->input, regtest_buf32, REGTEST_MAX_LENGTH32);
-			extra32->mark = &mark32_1;
-			if ((counter & 0x1) != 0) {
-				setstack32(extra32);
-				return_value32[0] = pcre32_exec(re32, extra32, regtest_buf32, length32, current->start_offset & OFFSET_MASK,
-					current->flags & (PCRE_NOTBOL | PCRE_NOTEOL | PCRE_NOTEMPTY | PCRE_NOTEMPTY_ATSTART | PCRE_PARTIAL_SOFT | PCRE_PARTIAL_HARD | PCRE_NO_UTF8_CHECK), ovector32_1, 32);
-			} else
-				return_value32[0] = pcre32_jit_exec(re32, extra32, regtest_buf32, length32, current->start_offset & OFFSET_MASK,
-					current->flags & (PCRE_NOTBOL | PCRE_NOTEOL | PCRE_NOTEMPTY | PCRE_NOTEMPTY_ATSTART | PCRE_PARTIAL_SOFT | PCRE_PARTIAL_HARD | PCRE_NO_UTF8_CHECK), ovector32_1, 32, getstack32());
-			memset(&dummy_extra32, 0, sizeof(pcre32_extra));
-			dummy_extra32.flags = PCRE_EXTRA_MARK;
-			if (current->start_offset & F_STUDY) {
-				dummy_extra32.flags |= PCRE_EXTRA_STUDY_DATA;
-				dummy_extra32.study_data = extra32->study_data;
-			}
-			dummy_extra32.mark = &mark32_2;
-			return_value32[1] = pcre32_exec(re32, &dummy_extra32, regtest_buf32, length32, current->start_offset & OFFSET_MASK,
-				current->flags & (PCRE_NOTBOL | PCRE_NOTEOL | PCRE_NOTEMPTY | PCRE_NOTEMPTY_ATSTART | PCRE_PARTIAL_SOFT | PCRE_PARTIAL_HARD | PCRE_NO_UTF8_CHECK), ovector32_2, 32);
-		}
-#endif
-
-		/* printf("[%d-%d-%d|%d-%d|%d-%d|%d-%d]%s",
-			return_value8[0], return_value16[0], return_value32[0],
-			ovector8_1[0], ovector8_1[1],
-			ovector16_1[0], ovector16_1[1],
-			ovector32_1[0], ovector32_1[1],
-			(current->flags & PCRE_CASELESS) ? "C" : ""); */
-
-		/* If F_DIFF is set, just run the test, but do not compare the results.
-		Segfaults can still be captured. */
-
-		is_successful = 1;
-		if (!(current->start_offset & F_DIFF)) {
-#if defined SUPPORT_UTF && ((defined(SUPPORT_PCRE8) + defined(SUPPORT_PCRE16) + defined(SUPPORT_PCRE32)) >= 2)
-			if (!(current->start_offset & F_FORCECONV)) {
-				int return_value;
-
-				/* All results must be the same. */
-#ifdef SUPPORT_PCRE8
-				if ((return_value = return_value8[0]) != return_value8[1]) {
-					printf("\n8 bit: Return value differs(J8:%d,I8:%d): [%d] '%s' @ '%s'\n",
-						return_value8[0], return_value8[1], total, current->pattern, current->input);
-					is_successful = 0;
-				} else
-#endif
-#ifdef SUPPORT_PCRE16
-				if ((return_value = return_value16[0]) != return_value16[1]) {
-					printf("\n16 bit: Return value differs(J16:%d,I16:%d): [%d] '%s' @ '%s'\n",
-						return_value16[0], return_value16[1], total, current->pattern, current->input);
-					is_successful = 0;
-				} else
-#endif
-#ifdef SUPPORT_PCRE32
-				if ((return_value = return_value32[0]) != return_value32[1]) {
-					printf("\n32 bit: Return value differs(J32:%d,I32:%d): [%d] '%s' @ '%s'\n",
-						return_value32[0], return_value32[1], total, current->pattern, current->input);
-					is_successful = 0;
-				} else
-#endif
-#if defined SUPPORT_PCRE8 && defined SUPPORT_PCRE16
-				if (return_value8[0] != return_value16[0]) {
-					printf("\n8 and 16 bit: Return value differs(J8:%d,J16:%d): [%d] '%s' @ '%s'\n",
-						return_value8[0], return_value16[0],
-						total, current->pattern, current->input);
-					is_successful = 0;
-				} else
-#endif
-#if defined SUPPORT_PCRE8 && defined SUPPORT_PCRE32
-				if (return_value8[0] != return_value32[0]) {
-					printf("\n8 and 32 bit: Return value differs(J8:%d,J32:%d): [%d] '%s' @ '%s'\n",
-						return_value8[0], return_value32[0],
-						total, current->pattern, current->input);
-					is_successful = 0;
-				} else
-#endif
-#if defined SUPPORT_PCRE16 && defined SUPPORT_PCRE32
-				if (return_value16[0] != return_value32[0]) {
-					printf("\n16 and 32 bit: Return value differs(J16:%d,J32:%d): [%d] '%s' @ '%s'\n",
-						return_value16[0], return_value32[0],
-						total, current->pattern, current->input);
-					is_successful = 0;
-				} else
-#endif
-				if (return_value >= 0 || return_value == PCRE_ERROR_PARTIAL) {
-					if (return_value == PCRE_ERROR_PARTIAL) {
-						return_value = 2;
-					} else {
-						return_value *= 2;
-					}
-#ifdef SUPPORT_PCRE8
-					return_value8[0] = return_value;
-#endif
-#ifdef SUPPORT_PCRE16
-					return_value16[0] = return_value;
-#endif
-#ifdef SUPPORT_PCRE32
-					return_value32[0] = return_value;
-#endif
-					/* Transform back the results. */
-					if (current->flags & PCRE_UTF8) {
-#ifdef SUPPORT_PCRE16
-						for (i = 0; i < return_value; ++i) {
-							if (ovector16_1[i] >= 0)
-								ovector16_1[i] = regtest_offsetmap16[ovector16_1[i]];
-							if (ovector16_2[i] >= 0)
-								ovector16_2[i] = regtest_offsetmap16[ovector16_2[i]];
-						}
-#endif
-#ifdef SUPPORT_PCRE32
-						for (i = 0; i < return_value; ++i) {
-							if (ovector32_1[i] >= 0)
-								ovector32_1[i] = regtest_offsetmap32[ovector32_1[i]];
-							if (ovector32_2[i] >= 0)
-								ovector32_2[i] = regtest_offsetmap32[ovector32_2[i]];
-						}
-#endif
-					}
-
-					for (i = 0; i < return_value; ++i) {
-#if defined SUPPORT_PCRE8 && defined SUPPORT_PCRE16
-						if (ovector8_1[i] != ovector8_2[i] || ovector8_1[i] != ovector16_1[i] || ovector8_1[i] != ovector16_2[i]) {
-							printf("\n8 and 16 bit: Ovector[%d] value differs(J8:%d,I8:%d,J16:%d,I16:%d): [%d] '%s' @ '%s' \n",
-								i, ovector8_1[i], ovector8_2[i], ovector16_1[i], ovector16_2[i],
-								total, current->pattern, current->input);
-							is_successful = 0;
-						}
-#endif
-#if defined SUPPORT_PCRE8 && defined SUPPORT_PCRE32
-						if (ovector8_1[i] != ovector8_2[i] || ovector8_1[i] != ovector32_1[i] || ovector8_1[i] != ovector32_2[i]) {
-							printf("\n8 and 32 bit: Ovector[%d] value differs(J8:%d,I8:%d,J32:%d,I32:%d): [%d] '%s' @ '%s' \n",
-								i, ovector8_1[i], ovector8_2[i], ovector32_1[i], ovector32_2[i],
-								total, current->pattern, current->input);
-							is_successful = 0;
-						}
-#endif
-#if defined SUPPORT_PCRE16 && defined SUPPORT_PCRE16
-						if (ovector16_1[i] != ovector16_2[i] || ovector16_1[i] != ovector16_1[i] || ovector16_1[i] != ovector16_2[i]) {
-							printf("\n16 and 16 bit: Ovector[%d] value differs(J16:%d,I16:%d,J32:%d,I32:%d): [%d] '%s' @ '%s' \n",
-								i, ovector16_1[i], ovector16_2[i], ovector16_1[i], ovector16_2[i],
-								total, current->pattern, current->input);
-							is_successful = 0;
-						}
-#endif
-					}
-				}
-			} else
-#endif /* more than one of SUPPORT_PCRE8, SUPPORT_PCRE16 and SUPPORT_PCRE32 */
-			{
-				/* Only the 8 bit and 16 bit results must be equal. */
-#ifdef SUPPORT_PCRE8
-				if (return_value8[0] != return_value8[1]) {
-					printf("\n8 bit: Return value differs(%d:%d): [%d] '%s' @ '%s'\n",
-						return_value8[0], return_value8[1], total, current->pattern, current->input);
-					is_successful = 0;
-				} else if (return_value8[0] >= 0 || return_value8[0] == PCRE_ERROR_PARTIAL) {
-					if (return_value8[0] == PCRE_ERROR_PARTIAL)
-						return_value8[0] = 2;
-					else
-						return_value8[0] *= 2;
-
-					for (i = 0; i < return_value8[0]; ++i)
-						if (ovector8_1[i] != ovector8_2[i]) {
-							printf("\n8 bit: Ovector[%d] value differs(%d:%d): [%d] '%s' @ '%s'\n",
-								i, ovector8_1[i], ovector8_2[i], total, current->pattern, current->input);
-							is_successful = 0;
-						}
-				}
-#endif
-
-#ifdef SUPPORT_PCRE16
-				if (return_value16[0] != return_value16[1]) {
-					printf("\n16 bit: Return value differs(%d:%d): [%d] '%s' @ '%s'\n",
-						return_value16[0], return_value16[1], total, current->pattern, current->input);
-					is_successful = 0;
-				} else if (return_value16[0] >= 0 || return_value16[0] == PCRE_ERROR_PARTIAL) {
-					if (return_value16[0] == PCRE_ERROR_PARTIAL)
-						return_value16[0] = 2;
-					else
-						return_value16[0] *= 2;
-
-					for (i = 0; i < return_value16[0]; ++i)
-						if (ovector16_1[i] != ovector16_2[i]) {
-							printf("\n16 bit: Ovector[%d] value differs(%d:%d): [%d] '%s' @ '%s'\n",
-								i, ovector16_1[i], ovector16_2[i], total, current->pattern, current->input);
-							is_successful = 0;
-						}
-				}
-#endif
-
-#ifdef SUPPORT_PCRE32
-				if (return_value32[0] != return_value32[1]) {
-					printf("\n32 bit: Return value differs(%d:%d): [%d] '%s' @ '%s'\n",
-						return_value32[0], return_value32[1], total, current->pattern, current->input);
-					is_successful = 0;
-				} else if (return_value32[0] >= 0 || return_value32[0] == PCRE_ERROR_PARTIAL) {
-					if (return_value32[0] == PCRE_ERROR_PARTIAL)
-						return_value32[0] = 2;
-					else
-						return_value32[0] *= 2;
-
-					for (i = 0; i < return_value32[0]; ++i)
-						if (ovector32_1[i] != ovector32_2[i]) {
-							printf("\n32 bit: Ovector[%d] value differs(%d:%d): [%d] '%s' @ '%s'\n",
-								i, ovector32_1[i], ovector32_2[i], total, current->pattern, current->input);
-							is_successful = 0;
-						}
-				}
-#endif
-			}
-		}
-
-		if (is_successful) {
-#ifdef SUPPORT_PCRE8
-			if (!(current->start_offset & F_NO8) && ((utf && ucp) || is_ascii)) {
-				if (return_value8[0] < 0 && !(current->start_offset & F_NOMATCH)) {
-					printf("8 bit: Test should match: [%d] '%s' @ '%s'\n",
-						total, current->pattern, current->input);
-					is_successful = 0;
-				}
-
-				if (return_value8[0] >= 0 && (current->start_offset & F_NOMATCH)) {
-					printf("8 bit: Test should not match: [%d] '%s' @ '%s'\n",
-						total, current->pattern, current->input);
-					is_successful = 0;
-				}
-			}
-#endif
-#ifdef SUPPORT_PCRE16
-			if (!(current->start_offset & F_NO16) && ((utf && ucp) || is_ascii)) {
-				if (return_value16[0] < 0 && !(current->start_offset & F_NOMATCH)) {
-					printf("16 bit: Test should match: [%d] '%s' @ '%s'\n",
-						total, current->pattern, current->input);
-					is_successful = 0;
-				}
-
-				if (return_value16[0] >= 0 && (current->start_offset & F_NOMATCH)) {
-					printf("16 bit: Test should not match: [%d] '%s' @ '%s'\n",
-						total, current->pattern, current->input);
-					is_successful = 0;
-				}
-			}
-#endif
-#ifdef SUPPORT_PCRE32
-			if (!(current->start_offset & F_NO32) && ((utf && ucp) || is_ascii)) {
-				if (return_value32[0] < 0 && !(current->start_offset & F_NOMATCH)) {
-					printf("32 bit: Test should match: [%d] '%s' @ '%s'\n",
-						total, current->pattern, current->input);
-					is_successful = 0;
-				}
-
-				if (return_value32[0] >= 0 && (current->start_offset & F_NOMATCH)) {
-					printf("32 bit: Test should not match: [%d] '%s' @ '%s'\n",
-						total, current->pattern, current->input);
-					is_successful = 0;
-				}
-			}
-#endif
-		}
-
-		if (is_successful) {
-#ifdef SUPPORT_PCRE8
-			if (mark8_1 != mark8_2) {
-				printf("8 bit: Mark value mismatch: [%d] '%s' @ '%s'\n",
-					total, current->pattern, current->input);
-				is_successful = 0;
-			}
-#endif
-#ifdef SUPPORT_PCRE16
-			if (mark16_1 != mark16_2) {
-				printf("16 bit: Mark value mismatch: [%d] '%s' @ '%s'\n",
-					total, current->pattern, current->input);
-				is_successful = 0;
-			}
-#endif
-#ifdef SUPPORT_PCRE32
-			if (mark32_1 != mark32_2) {
-				printf("32 bit: Mark value mismatch: [%d] '%s' @ '%s'\n",
-					total, current->pattern, current->input);
-				is_successful = 0;
-			}
-#endif
-		}
-
-#ifdef SUPPORT_PCRE8
-		if (re8) {
-			pcre_free_study(extra8);
-			pcre_free(re8);
-		}
-#endif
-#ifdef SUPPORT_PCRE16
-		if (re16) {
-			pcre16_free_study(extra16);
-			pcre16_free(re16);
-		}
-#endif
-#ifdef SUPPORT_PCRE32
-		if (re32) {
-			pcre32_free_study(extra32);
-			pcre32_free(re32);
-		}
-#endif
-
-		if (is_successful) {
-			successful++;
-			successful_row++;
-			printf(".");
-			if (successful_row >= 60) {
-				successful_row = 0;
-				printf("\n");
-			}
-		} else
-			successful_row = 0;
-
-		fflush(stdout);
-		current++;
-	}
-	tables(1);
-#ifdef SUPPORT_PCRE8
-	setstack8(NULL);
-#endif
-#ifdef SUPPORT_PCRE16
-	setstack16(NULL);
-#endif
-#ifdef SUPPORT_PCRE32
-	setstack32(NULL);
-#endif
-
-	if (total == successful) {
-		printf("\nAll JIT regression tests are successfully passed.\n");
-		return 0;
-	} else {
-		printf("\nSuccessful test ratio: %d%% (%d failed)\n", successful * 100 / total, total - successful);
-		return 1;
-	}
-}
-
-/* End of pcre_jit_test.c */
diff --git a/dist/pcre_refcount.c b/dist/pcre_refcount.c
deleted file mode 100644
index 79efa90..0000000
--- a/dist/pcre_refcount.c
+++ /dev/null
@@ -1,92 +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
-           Copyright (c) 1997-2012 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. */
-
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#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
-*/
-
-#if defined COMPILE_PCRE8
-PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
-pcre_refcount(pcre *argument_re, int adjust)
-#elif defined COMPILE_PCRE16
-PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
-pcre16_refcount(pcre16 *argument_re, int adjust)
-#elif defined COMPILE_PCRE32
-PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
-pcre32_refcount(pcre32 *argument_re, int adjust)
-#endif
-{
-REAL_PCRE *re = (REAL_PCRE *)argument_re;
-if (re == NULL) return PCRE_ERROR_NULL;
-if (re->magic_number != MAGIC_NUMBER) return PCRE_ERROR_BADMAGIC;
-if ((re->flags & PCRE_MODE) == 0) return PCRE_ERROR_BADMODE;
-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 --git a/dist/pcre_string_utils.c b/dist/pcre_string_utils.c
deleted file mode 100644
index 25eacc8..0000000
--- a/dist/pcre_string_utils.c
+++ /dev/null
@@ -1,211 +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
-           Copyright (c) 1997-2014 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 internal functions for comparing and finding the length
-of strings for different data item sizes. */
-
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include "pcre_internal.h"
-
-#ifndef COMPILE_PCRE8
-
-/*************************************************
-*           Compare string utilities             *
-*************************************************/
-
-/* The following two functions compares two strings. Basically a strcmp
-for non 8 bit characters.
-
-Arguments:
-  str1        first string
-  str2        second string
-
-Returns:      0 if both string are equal (like strcmp), 1 otherwise
-*/
-
-int
-PRIV(strcmp_uc_uc)(const pcre_uchar *str1, const pcre_uchar *str2)
-{
-pcre_uchar c1;
-pcre_uchar c2;
-
-while (*str1 != '\0' || *str2 != '\0')
-  {
-  c1 = *str1++;
-  c2 = *str2++;
-  if (c1 != c2)
-    return ((c1 > c2) << 1) - 1;
-  }
-/* Both length and characters must be equal. */
-return 0;
-}
-
-#ifdef COMPILE_PCRE32
-
-int
-PRIV(strcmp_uc_uc_utf)(const pcre_uchar *str1, const pcre_uchar *str2)
-{
-pcre_uchar c1;
-pcre_uchar c2;
-
-while (*str1 != '\0' || *str2 != '\0')
-  {
-  c1 = UCHAR21INC(str1);
-  c2 = UCHAR21INC(str2);
-  if (c1 != c2)
-    return ((c1 > c2) << 1) - 1;
-  }
-/* Both length and characters must be equal. */
-return 0;
-}
-
-#endif /* COMPILE_PCRE32 */
-
-int
-PRIV(strcmp_uc_c8)(const pcre_uchar *str1, const char *str2)
-{
-const pcre_uint8 *ustr2 = (pcre_uint8 *)str2;
-pcre_uchar c1;
-pcre_uchar c2;
-
-while (*str1 != '\0' || *ustr2 != '\0')
-  {
-  c1 = *str1++;
-  c2 = (pcre_uchar)*ustr2++;
-  if (c1 != c2)
-    return ((c1 > c2) << 1) - 1;
-  }
-/* Both length and characters must be equal. */
-return 0;
-}
-
-#ifdef COMPILE_PCRE32
-
-int
-PRIV(strcmp_uc_c8_utf)(const pcre_uchar *str1, const char *str2)
-{
-const pcre_uint8 *ustr2 = (pcre_uint8 *)str2;
-pcre_uchar c1;
-pcre_uchar c2;
-
-while (*str1 != '\0' || *ustr2 != '\0')
-  {
-  c1 = UCHAR21INC(str1);
-  c2 = (pcre_uchar)*ustr2++;
-  if (c1 != c2)
-    return ((c1 > c2) << 1) - 1;
-  }
-/* Both length and characters must be equal. */
-return 0;
-}
-
-#endif /* COMPILE_PCRE32 */
-
-/* The following two functions compares two, fixed length
-strings. Basically an strncmp for non 8 bit characters.
-
-Arguments:
-  str1        first string
-  str2        second string
-  num         size of the string
-
-Returns:      0 if both string are equal (like strcmp), 1 otherwise
-*/
-
-int
-PRIV(strncmp_uc_uc)(const pcre_uchar *str1, const pcre_uchar *str2, unsigned int num)
-{
-pcre_uchar c1;
-pcre_uchar c2;
-
-while (num-- > 0)
-  {
-  c1 = *str1++;
-  c2 = *str2++;
-  if (c1 != c2)
-    return ((c1 > c2) << 1) - 1;
-  }
-/* Both length and characters must be equal. */
-return 0;
-}
-
-int
-PRIV(strncmp_uc_c8)(const pcre_uchar *str1, const char *str2, unsigned int num)
-{
-const pcre_uint8 *ustr2 = (pcre_uint8 *)str2;
-pcre_uchar c1;
-pcre_uchar c2;
-
-while (num-- > 0)
-  {
-  c1 = *str1++;
-  c2 = (pcre_uchar)*ustr2++;
-  if (c1 != c2)
-    return ((c1 > c2) << 1) - 1;
-  }
-/* Both length and characters must be equal. */
-return 0;
-}
-
-/* The following function returns with the length of
-a zero terminated string. Basically an strlen for non 8 bit characters.
-
-Arguments:
-  str         string
-
-Returns:      length of the string
-*/
-
-unsigned int
-PRIV(strlen_uc)(const pcre_uchar *str)
-{
-unsigned int len = 0;
-while (*str++ != 0)
-  len++;
-return len;
-}
-
-#endif /* !COMPILE_PCRE8 */
-
-/* End of pcre_string_utils.c */
diff --git a/dist/pcre_stringpiece.h.in b/dist/pcre_stringpiece.h.in
deleted file mode 100644
index eb25826..0000000
--- a/dist/pcre_stringpiece.h.in
+++ /dev/null
@@ -1,180 +0,0 @@
-// Copyright (c) 2005, Google Inc.
-// All rights reserved.
-//
-// 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 Google Inc. 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.
-//
-// Author: Sanjay Ghemawat
-//
-// A string like object that points into another piece of memory.
-// Useful for providing an interface that allows clients to easily
-// pass in either a "const char*" or a "string".
-//
-// Arghh!  I wish C++ literals were automatically of type "string".
-
-#ifndef _PCRE_STRINGPIECE_H
-#define _PCRE_STRINGPIECE_H
-
-#include <cstring>
-#include <string>
-#include <iosfwd>    // for ostream forward-declaration
-
-#if @pcre_have_type_traits@
-#define HAVE_TYPE_TRAITS
-#include <type_traits.h>
-#elif @pcre_have_bits_type_traits@
-#define HAVE_TYPE_TRAITS
-#include <bits/type_traits.h>
-#endif
-
-#include <pcre.h>
-
-using std::memcmp;
-using std::strlen;
-using std::string;
-
-namespace pcrecpp {
-
-class PCRECPP_EXP_DEFN StringPiece {
- private:
-  const char*   ptr_;
-  int           length_;
-
- public:
-  // We provide non-explicit singleton constructors so users can pass
-  // in a "const char*" or a "string" wherever a "StringPiece" is
-  // expected.
-  StringPiece()
-    : ptr_(NULL), length_(0) { }
-  StringPiece(const char* str)
-    : ptr_(str), length_(static_cast<int>(strlen(ptr_))) { }
-  StringPiece(const unsigned char* str)
-    : ptr_(reinterpret_cast<const char*>(str)),
-      length_(static_cast<int>(strlen(ptr_))) { }
-  StringPiece(const string& str)
-    : ptr_(str.data()), length_(static_cast<int>(str.size())) { }
-  StringPiece(const char* offset, int len)
-    : ptr_(offset), length_(len) { }
-
-  // data() may return a pointer to a buffer with embedded NULs, and the
-  // returned buffer may or may not be null terminated.  Therefore it is
-  // typically a mistake to pass data() to a routine that expects a NUL
-  // terminated string.  Use "as_string().c_str()" if you really need to do
-  // this.  Or better yet, change your routine so it does not rely on NUL
-  // termination.
-  const char* data() const { return ptr_; }
-  int size() const { return length_; }
-  bool empty() const { return length_ == 0; }
-
-  void clear() { ptr_ = NULL; length_ = 0; }
-  void set(const char* buffer, int len) { ptr_ = buffer; length_ = len; }
-  void set(const char* str) {
-    ptr_ = str;
-    length_ = static_cast<int>(strlen(str));
-  }
-  void set(const void* buffer, int len) {
-    ptr_ = reinterpret_cast<const char*>(buffer);
-    length_ = len;
-  }
-
-  char operator[](int i) const { return ptr_[i]; }
-
-  void remove_prefix(int n) {
-    ptr_ += n;
-    length_ -= n;
-  }
-
-  void remove_suffix(int n) {
-    length_ -= n;
-  }
-
-  bool operator==(const StringPiece& x) const {
-    return ((length_ == x.length_) &&
-            (memcmp(ptr_, x.ptr_, length_) == 0));
-  }
-  bool operator!=(const StringPiece& x) const {
-    return !(*this == x);
-  }
-
-#define STRINGPIECE_BINARY_PREDICATE(cmp,auxcmp)                             \
-  bool operator cmp (const StringPiece& x) const {                           \
-    int r = memcmp(ptr_, x.ptr_, length_ < x.length_ ? length_ : x.length_); \
-    return ((r auxcmp 0) || ((r == 0) && (length_ cmp x.length_)));          \
-  }
-  STRINGPIECE_BINARY_PREDICATE(<,  <);
-  STRINGPIECE_BINARY_PREDICATE(<=, <);
-  STRINGPIECE_BINARY_PREDICATE(>=, >);
-  STRINGPIECE_BINARY_PREDICATE(>,  >);
-#undef STRINGPIECE_BINARY_PREDICATE
-
-  int compare(const StringPiece& x) const {
-    int r = memcmp(ptr_, x.ptr_, length_ < x.length_ ? length_ : x.length_);
-    if (r == 0) {
-      if (length_ < x.length_) r = -1;
-      else if (length_ > x.length_) r = +1;
-    }
-    return r;
-  }
-
-  string as_string() const {
-    return string(data(), size());
-  }
-
-  void CopyToString(string* target) const {
-    target->assign(ptr_, length_);
-  }
-
-  // Does "this" start with "x"
-  bool starts_with(const StringPiece& x) const {
-    return ((length_ >= x.length_) && (memcmp(ptr_, x.ptr_, x.length_) == 0));
-  }
-};
-
-}   // namespace pcrecpp
-
-// ------------------------------------------------------------------
-// Functions used to create STL containers that use StringPiece
-//  Remember that a StringPiece's lifetime had better be less than
-//  that of the underlying string or char*.  If it is not, then you
-//  cannot safely store a StringPiece into an STL container
-// ------------------------------------------------------------------
-
-#ifdef HAVE_TYPE_TRAITS
-// This makes vector<StringPiece> really fast for some STL implementations
-template<> struct __type_traits<pcrecpp::StringPiece> {
-  typedef __true_type    has_trivial_default_constructor;
-  typedef __true_type    has_trivial_copy_constructor;
-  typedef __true_type    has_trivial_assignment_operator;
-  typedef __true_type    has_trivial_destructor;
-  typedef __true_type    is_POD_type;
-};
-#endif
-
-// allow StringPiece to be logged
-PCRECPP_EXP_DECL std::ostream& operator<<(std::ostream& o,
-                                          const pcrecpp::StringPiece& piece);
-
-#endif /* _PCRE_STRINGPIECE_H */
diff --git a/dist/pcre_study.c b/dist/pcre_study.c
deleted file mode 100644
index 7fd0ba0..0000000
--- a/dist/pcre_study.c
+++ /dev/null
@@ -1,1686 +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
-           Copyright (c) 1997-2012 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. */
-
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include "pcre_internal.h"
-
-#define SET_BIT(c) start_bits[c/8] |= (1 << (c&7))
-
-/* Returns from set_start_bits() */
-
-enum { SSB_FAIL, SSB_DONE, SSB_CONTINUE, SSB_UNKNOWN };
-
-
-
-/*************************************************
-*   Find the minimum subject length for a group  *
-*************************************************/
-
-/* Scan a parenthesized group and compute the minimum length of subject that
-is needed to match it. This is a lower bound; it does not mean there is a
-string of that length that matches. In UTF8 mode, the result is in characters
-rather than bytes.
-
-Arguments:
-  re              compiled pattern block
-  code            pointer to start of group (the bracket)
-  startcode       pointer to start of the whole pattern's code
-  options         the compiling options
-  recurses        chain of recurse_check to catch mutual recursion
-  countptr        pointer to call count (to catch over complexity)
-
-Returns:   the minimum length
-           -1 if \C in UTF-8 mode or (*ACCEPT) was encountered
-           -2 internal error (missing capturing bracket)
-           -3 internal error (opcode not listed)
-*/
-
-static int
-find_minlength(const REAL_PCRE *re, const pcre_uchar *code,
-  const pcre_uchar *startcode, int options, recurse_check *recurses,
-  int *countptr)
-{
-int length = -1;
-/* PCRE_UTF16 has the same value as PCRE_UTF8. */
-BOOL utf = (options & PCRE_UTF8) != 0;
-BOOL had_recurse = FALSE;
-recurse_check this_recurse;
-register int branchlength = 0;
-register pcre_uchar *cc = (pcre_uchar *)code + 1 + LINK_SIZE;
-
-if ((*countptr)++ > 1000) return -1;   /* too complex */
-
-if (*code == OP_CBRA || *code == OP_SCBRA ||
-    *code == OP_CBRAPOS || *code == OP_SCBRAPOS) cc += IMM2_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, min;
-  pcre_uchar *cs, *ce;
-  register pcre_uchar op = *cc;
-
-  switch (op)
-    {
-    case OP_COND:
-    case OP_SCOND:
-
-    /* If there is only one branch in a condition, the implied branch has zero
-    length, so we don't add anything. This covers the DEFINE "condition"
-    automatically. */
-
-    cs = cc + GET(cc, 1);
-    if (*cs != OP_ALT)
-      {
-      cc = cs + 1 + LINK_SIZE;
-      break;
-      }
-
-    /* Otherwise we can fall through and treat it the same as any other
-    subpattern. */
-
-    case OP_CBRA:
-    case OP_SCBRA:
-    case OP_BRA:
-    case OP_SBRA:
-    case OP_CBRAPOS:
-    case OP_SCBRAPOS:
-    case OP_BRAPOS:
-    case OP_SBRAPOS:
-    case OP_ONCE:
-    case OP_ONCE_NC:
-    d = find_minlength(re, cc, startcode, options, recurses, countptr);
-    if (d < 0) return d;
-    branchlength += d;
-    do cc += GET(cc, 1); while (*cc == OP_ALT);
-    cc += 1 + LINK_SIZE;
-    break;
-
-    /* ACCEPT makes things far too complicated; we have to give up. */
-
-    case OP_ACCEPT:
-    case OP_ASSERT_ACCEPT:
-    return -1;
-
-    /* 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. If an
-    ACCEPT was previously encountered, use the length that was in force at that
-    time, and pass back the shortest ACCEPT length. */
-
-    case OP_ALT:
-    case OP_KET:
-    case OP_KETRMAX:
-    case OP_KETRMIN:
-    case OP_KETRPOS:
-    case OP_END:
-    if (length < 0 || (!had_recurse && branchlength < length))
-      length = branchlength;
-    if (op != OP_ALT) return length;
-    cc += 1 + LINK_SIZE;
-    branchlength = 0;
-    had_recurse = FALSE;
-    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_CREF:
-    case OP_DNCREF:
-    case OP_RREF:
-    case OP_DNRREF:
-    case OP_DEF:
-    case OP_CALLOUT:
-    case OP_SOD:
-    case OP_SOM:
-    case OP_EOD:
-    case OP_EODN:
-    case OP_CIRC:
-    case OP_CIRCM:
-    case OP_DOLL:
-    case OP_DOLLM:
-    case OP_NOT_WORD_BOUNDARY:
-    case OP_WORD_BOUNDARY:
-    cc += PRIV(OP_lengths)[*cc];
-    break;
-
-    /* Skip over a subpattern that has a {0} or {0,x} quantifier */
-
-    case OP_BRAZERO:
-    case OP_BRAMINZERO:
-    case OP_BRAPOSZERO:
-    case OP_SKIPZERO:
-    cc += PRIV(OP_lengths)[*cc];
-    do cc += GET(cc, 1); while (*cc == OP_ALT);
-    cc += 1 + LINK_SIZE;
-    break;
-
-    /* Handle literal characters and + repetitions */
-
-    case OP_CHAR:
-    case OP_CHARI:
-    case OP_NOT:
-    case OP_NOTI:
-    case OP_PLUS:
-    case OP_PLUSI:
-    case OP_MINPLUS:
-    case OP_MINPLUSI:
-    case OP_POSPLUS:
-    case OP_POSPLUSI:
-    case OP_NOTPLUS:
-    case OP_NOTPLUSI:
-    case OP_NOTMINPLUS:
-    case OP_NOTMINPLUSI:
-    case OP_NOTPOSPLUS:
-    case OP_NOTPOSPLUSI:
-    branchlength++;
-    cc += 2;
-#ifdef SUPPORT_UTF
-    if (utf && HAS_EXTRALEN(cc[-1])) cc += GET_EXTRALEN(cc[-1]);
-#endif
-    break;
-
-    case OP_TYPEPLUS:
-    case OP_TYPEMINPLUS:
-    case OP_TYPEPOSPLUS:
-    branchlength++;
-    cc += (cc[1] == OP_PROP || cc[1] == OP_NOTPROP)? 4 : 2;
-    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:
-    case OP_EXACTI:
-    case OP_NOTEXACT:
-    case OP_NOTEXACTI:
-    branchlength += GET2(cc,1);
-    cc += 2 + IMM2_SIZE;
-#ifdef SUPPORT_UTF
-    if (utf && HAS_EXTRALEN(cc[-1])) cc += GET_EXTRALEN(cc[-1]);
-#endif
-    break;
-
-    case OP_TYPEEXACT:
-    branchlength += GET2(cc,1);
-    cc += 2 + IMM2_SIZE + ((cc[1 + IMM2_SIZE] == OP_PROP
-      || cc[1 + IMM2_SIZE] == OP_NOTPROP)? 2 : 0);
-    break;
-
-    /* Handle single-char non-literal matchers */
-
-    case OP_PROP:
-    case OP_NOTPROP:
-    cc += 2;
-    /* 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:
-    case OP_ALLANY:
-    case OP_EXTUNI:
-    case OP_HSPACE:
-    case OP_NOT_HSPACE:
-    case OP_VSPACE:
-    case OP_NOT_VSPACE:
-    branchlength++;
-    cc++;
-    break;
-
-    /* "Any newline" might match two characters, but it also might match just
-    one. */
-
-    case OP_ANYNL:
-    branchlength += 1;
-    cc++;
-    break;
-
-    /* The single-byte matcher means we can't proceed in UTF-8 mode. (In
-    non-UTF-8 mode \C will actually be turned into OP_ALLANY, so won't ever
-    appear, but leave the code, just in case.) */
-
-    case OP_ANYBYTE:
-#ifdef SUPPORT_UTF
-    if (utf) return -1;
-#endif
-    branchlength++;
-    cc++;
-    break;
-
-    /* For repeated character types, we have to test for \p and \P, which have
-    an extra two bytes of parameters. */
-
-    case OP_TYPESTAR:
-    case OP_TYPEMINSTAR:
-    case OP_TYPEQUERY:
-    case OP_TYPEMINQUERY:
-    case OP_TYPEPOSSTAR:
-    case OP_TYPEPOSQUERY:
-    if (cc[1] == OP_PROP || cc[1] == OP_NOTPROP) cc += 2;
-    cc += PRIV(OP_lengths)[op];
-    break;
-
-    case OP_TYPEUPTO:
-    case OP_TYPEMINUPTO:
-    case OP_TYPEPOSUPTO:
-    if (cc[1 + IMM2_SIZE] == OP_PROP
-      || cc[1 + IMM2_SIZE] == OP_NOTPROP) cc += 2;
-    cc += PRIV(OP_lengths)[op];
-    break;
-
-    /* Check a class for variable quantification */
-
-    case OP_CLASS:
-    case OP_NCLASS:
-#if defined SUPPORT_UTF || defined COMPILE_PCRE16 || defined COMPILE_PCRE32
-    case OP_XCLASS:
-    /* The original code caused an unsigned overflow in 64 bit systems,
-    so now we use a conditional statement. */
-    if (op == OP_XCLASS)
-      cc += GET(cc, 1);
-    else
-      cc += PRIV(OP_lengths)[OP_CLASS];
-#else
-    cc += PRIV(OP_lengths)[OP_CLASS];
-#endif
-
-    switch (*cc)
-      {
-      case OP_CRPLUS:
-      case OP_CRMINPLUS:
-      case OP_CRPOSPLUS:
-      branchlength++;
-      /* Fall through */
-
-      case OP_CRSTAR:
-      case OP_CRMINSTAR:
-      case OP_CRQUERY:
-      case OP_CRMINQUERY:
-      case OP_CRPOSSTAR:
-      case OP_CRPOSQUERY:
-      cc++;
-      break;
-
-      case OP_CRRANGE:
-      case OP_CRMINRANGE:
-      case OP_CRPOSRANGE:
-      branchlength += GET2(cc,1);
-      cc += 1 + 2 * IMM2_SIZE;
-      break;
-
-      default:
-      branchlength++;
-      break;
-      }
-    break;
-
-    /* Backreferences and subroutine calls are treated in the same way: we find
-    the minimum length for the subpattern. A recursion, however, causes an
-    a flag to be set that causes the length of this branch to be ignored. The
-    logic is that a recursion can only make sense if there is another
-    alternation that stops the recursing. That will provide the minimum length
-    (when no recursion happens). A backreference within the group that it is
-    referencing behaves in the same way.
-
-    If PCRE_JAVASCRIPT_COMPAT is set, a backreference to an unset bracket
-    matches an empty string (by default it causes a matching failure), so in
-    that case we must set the minimum length to zero. */
-
-    case OP_DNREF:     /* Duplicate named pattern back reference */
-    case OP_DNREFI:
-    if ((options & PCRE_JAVASCRIPT_COMPAT) == 0)
-      {
-      int count = GET2(cc, 1+IMM2_SIZE);
-      pcre_uchar *slot = (pcre_uchar *)re +
-        re->name_table_offset + GET2(cc, 1) * re->name_entry_size;
-      d = INT_MAX;
-      while (count-- > 0)
-        {
-        ce = cs = (pcre_uchar *)PRIV(find_bracket)(startcode, utf, GET2(slot, 0));
-        if (cs == NULL) return -2;
-        do ce += GET(ce, 1); while (*ce == OP_ALT);
-        if (cc > cs && cc < ce)     /* Simple recursion */
-          {
-          d = 0;
-          had_recurse = TRUE;
-          break;
-          }
-        else
-          {
-          recurse_check *r = recurses;
-          for (r = recurses; r != NULL; r = r->prev) if (r->group == cs) break;
-          if (r != NULL)           /* Mutual recursion */
-            {
-            d = 0;
-            had_recurse = TRUE;
-            break;
-            }
-          else
-            {
-            int dd;
-            this_recurse.prev = recurses;
-            this_recurse.group = cs;
-            dd = find_minlength(re, cs, startcode, options, &this_recurse,
-              countptr);
-            if (dd < d) d = dd;
-            }
-          }
-        slot += re->name_entry_size;
-        }
-      }
-    else d = 0;
-    cc += 1 + 2*IMM2_SIZE;
-    goto REPEAT_BACK_REFERENCE;
-
-    case OP_REF:      /* Single back reference */
-    case OP_REFI:
-    if ((options & PCRE_JAVASCRIPT_COMPAT) == 0)
-      {
-      ce = cs = (pcre_uchar *)PRIV(find_bracket)(startcode, utf, GET2(cc, 1));
-      if (cs == NULL) return -2;
-      do ce += GET(ce, 1); while (*ce == OP_ALT);
-      if (cc > cs && cc < ce)    /* Simple recursion */
-        {
-        d = 0;
-        had_recurse = TRUE;
-        }
-      else
-        {
-        recurse_check *r = recurses;
-        for (r = recurses; r != NULL; r = r->prev) if (r->group == cs) break;
-        if (r != NULL)           /* Mutual recursion */
-          {
-          d = 0;
-          had_recurse = TRUE;
-          }
-        else
-          {
-          this_recurse.prev = recurses;
-          this_recurse.group = cs;
-          d = find_minlength(re, cs, startcode, options, &this_recurse,
-            countptr);
-          }
-        }
-      }
-    else d = 0;
-    cc += 1 + IMM2_SIZE;
-
-    /* Handle repeated back references */
-
-    REPEAT_BACK_REFERENCE:
-    switch (*cc)
-      {
-      case OP_CRSTAR:
-      case OP_CRMINSTAR:
-      case OP_CRQUERY:
-      case OP_CRMINQUERY:
-      case OP_CRPOSSTAR:
-      case OP_CRPOSQUERY:
-      min = 0;
-      cc++;
-      break;
-
-      case OP_CRPLUS:
-      case OP_CRMINPLUS:
-      case OP_CRPOSPLUS:
-      min = 1;
-      cc++;
-      break;
-
-      case OP_CRRANGE:
-      case OP_CRMINRANGE:
-      case OP_CRPOSRANGE:
-      min = GET2(cc, 1);
-      cc += 1 + 2 * IMM2_SIZE;
-      break;
-
-      default:
-      min = 1;
-      break;
-      }
-
-    branchlength += min * d;
-    break;
-
-    /* We can easily detect direct recursion, but not mutual recursion. This is
-    caught by a recursion depth count. */
-
-    case OP_RECURSE:
-    cs = ce = (pcre_uchar *)startcode + GET(cc, 1);
-    do ce += GET(ce, 1); while (*ce == OP_ALT);
-    if (cc > cs && cc < ce)    /* Simple recursion */
-      had_recurse = TRUE;
-    else
-      {
-      recurse_check *r = recurses;
-      for (r = recurses; r != NULL; r = r->prev) if (r->group == cs) break;
-      if (r != NULL)           /* Mutual recursion */
-        had_recurse = TRUE;
-      else
-        {
-        this_recurse.prev = recurses;
-        this_recurse.group = cs;
-        branchlength += find_minlength(re, cs, startcode, options,
-          &this_recurse, countptr);
-        }
-      }
-    cc += 1 + LINK_SIZE;
-    break;
-
-    /* Anything else does not or need not match a character. We can get the
-    item's length from the table, but for those that can match zero occurrences
-    of a character, we must take special action for UTF-8 characters. As it
-    happens, the "NOT" versions of these opcodes are used at present only for
-    ASCII characters, so they could be omitted from this list. However, in
-    future that may change, so we include them here so as not to leave a
-    gotcha for a future maintainer. */
-
-    case OP_UPTO:
-    case OP_UPTOI:
-    case OP_NOTUPTO:
-    case OP_NOTUPTOI:
-    case OP_MINUPTO:
-    case OP_MINUPTOI:
-    case OP_NOTMINUPTO:
-    case OP_NOTMINUPTOI:
-    case OP_POSUPTO:
-    case OP_POSUPTOI:
-    case OP_NOTPOSUPTO:
-    case OP_NOTPOSUPTOI:
-
-    case OP_STAR:
-    case OP_STARI:
-    case OP_NOTSTAR:
-    case OP_NOTSTARI:
-    case OP_MINSTAR:
-    case OP_MINSTARI:
-    case OP_NOTMINSTAR:
-    case OP_NOTMINSTARI:
-    case OP_POSSTAR:
-    case OP_POSSTARI:
-    case OP_NOTPOSSTAR:
-    case OP_NOTPOSSTARI:
-
-    case OP_QUERY:
-    case OP_QUERYI:
-    case OP_NOTQUERY:
-    case OP_NOTQUERYI:
-    case OP_MINQUERY:
-    case OP_MINQUERYI:
-    case OP_NOTMINQUERY:
-    case OP_NOTMINQUERYI:
-    case OP_POSQUERY:
-    case OP_POSQUERYI:
-    case OP_NOTPOSQUERY:
-    case OP_NOTPOSQUERYI:
-
-    cc += PRIV(OP_lengths)[op];
-#ifdef SUPPORT_UTF
-    if (utf && HAS_EXTRALEN(cc[-1])) cc += GET_EXTRALEN(cc[-1]);
-#endif
-    break;
-
-    /* Skip these, but we need to add in the name length. */
-
-    case OP_MARK:
-    case OP_PRUNE_ARG:
-    case OP_SKIP_ARG:
-    case OP_THEN_ARG:
-    cc += PRIV(OP_lengths)[op] + cc[1];
-    break;
-
-    /* The remaining opcodes are just skipped over. */
-
-    case OP_CLOSE:
-    case OP_COMMIT:
-    case OP_FAIL:
-    case OP_PRUNE:
-    case OP_SET_SOM:
-    case OP_SKIP:
-    case OP_THEN:
-    cc += PRIV(OP_lengths)[op];
-    break;
-
-    /* This should not occur: we list all opcodes explicitly so that when
-    new ones get added they are properly considered. */
-
-    default:
-    return -3;
-    }
-  }
-/* Control never gets here */
-}
-
-
-
-/*************************************************
-*      Set a bit and maybe its alternate case    *
-*************************************************/
-
-/* Given a character, set its first byte's bit in the table, and also the
-corresponding bit for the other version of a letter if we are caseless. In
-UTF-8 mode, for characters greater than 127, we can only do the caseless thing
-when Unicode property support is available.
-
-Arguments:
-  start_bits    points to the bit map
-  p             points to the character
-  caseless      the caseless flag
-  cd            the block with char table pointers
-  utf           TRUE for UTF-8 / UTF-16 / UTF-32 mode
-
-Returns:        pointer after the character
-*/
-
-static const pcre_uchar *
-set_table_bit(pcre_uint8 *start_bits, const pcre_uchar *p, BOOL caseless,
-  compile_data *cd, BOOL utf)
-{
-pcre_uint32 c = *p;
-
-#ifdef COMPILE_PCRE8
-SET_BIT(c);
-
-#ifdef SUPPORT_UTF
-if (utf && c > 127)
-  {
-  GETCHARINC(c, p);
-#ifdef SUPPORT_UCP
-  if (caseless)
-    {
-    pcre_uchar buff[6];
-    c = UCD_OTHERCASE(c);
-    (void)PRIV(ord2utf)(c, buff);
-    SET_BIT(buff[0]);
-    }
-#endif  /* Not SUPPORT_UCP */
-  return p;
-  }
-#else   /* Not SUPPORT_UTF */
-(void)(utf);   /* Stops warning for unused parameter */
-#endif  /* SUPPORT_UTF */
-
-/* Not UTF-8 mode, or character is less than 127. */
-
-if (caseless && (cd->ctypes[c] & ctype_letter) != 0) SET_BIT(cd->fcc[c]);
-return p + 1;
-#endif  /* COMPILE_PCRE8 */
-
-#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32
-if (c > 0xff)
-  {
-  c = 0xff;
-  caseless = FALSE;
-  }
-SET_BIT(c);
-
-#ifdef SUPPORT_UTF
-if (utf && c > 127)
-  {
-  GETCHARINC(c, p);
-#ifdef SUPPORT_UCP
-  if (caseless)
-    {
-    c = UCD_OTHERCASE(c);
-    if (c > 0xff)
-      c = 0xff;
-    SET_BIT(c);
-    }
-#endif  /* SUPPORT_UCP */
-  return p;
-  }
-#else   /* Not SUPPORT_UTF */
-(void)(utf);   /* Stops warning for unused parameter */
-#endif  /* SUPPORT_UTF */
-
-if (caseless && (cd->ctypes[c] & ctype_letter) != 0) SET_BIT(cd->fcc[c]);
-return p + 1;
-#endif
-}
-
-
-
-/*************************************************
-*     Set bits for a positive character type     *
-*************************************************/
-
-/* This function sets starting bits for a character type. In UTF-8 mode, we can
-only do a direct setting for bytes less than 128, as otherwise there can be
-confusion with bytes in the middle of UTF-8 characters. In a "traditional"
-environment, the tables will only recognize ASCII characters anyway, but in at
-least one Windows environment, some higher bytes bits were set in the tables.
-So we deal with that case by considering the UTF-8 encoding.
-
-Arguments:
-  start_bits     the starting bitmap
-  cbit type      the type of character wanted
-  table_limit    32 for non-UTF-8; 16 for UTF-8
-  cd             the block with char table pointers
-
-Returns:         nothing
-*/
-
-static void
-set_type_bits(pcre_uint8 *start_bits, int cbit_type, unsigned int table_limit,
-  compile_data *cd)
-{
-register pcre_uint32 c;
-for (c = 0; c < table_limit; c++) start_bits[c] |= cd->cbits[c+cbit_type];
-#if defined SUPPORT_UTF && defined COMPILE_PCRE8
-if (table_limit == 32) return;
-for (c = 128; c < 256; c++)
-  {
-  if ((cd->cbits[c/8] & (1 << (c&7))) != 0)
-    {
-    pcre_uchar buff[6];
-    (void)PRIV(ord2utf)(c, buff);
-    SET_BIT(buff[0]);
-    }
-  }
-#endif
-}
-
-
-/*************************************************
-*     Set bits for a negative character type     *
-*************************************************/
-
-/* This function sets starting bits for a negative character type such as \D.
-In UTF-8 mode, we can only do a direct setting for bytes less than 128, as
-otherwise there can be confusion with bytes in the middle of UTF-8 characters.
-Unlike in the positive case, where we can set appropriate starting bits for
-specific high-valued UTF-8 characters, in this case we have to set the bits for
-all high-valued characters. The lowest is 0xc2, but we overkill by starting at
-0xc0 (192) for simplicity.
-
-Arguments:
-  start_bits     the starting bitmap
-  cbit type      the type of character wanted
-  table_limit    32 for non-UTF-8; 16 for UTF-8
-  cd             the block with char table pointers
-
-Returns:         nothing
-*/
-
-static void
-set_nottype_bits(pcre_uint8 *start_bits, int cbit_type, unsigned int table_limit,
-  compile_data *cd)
-{
-register pcre_uint32 c;
-for (c = 0; c < table_limit; c++) start_bits[c] |= ~cd->cbits[c+cbit_type];
-#if defined SUPPORT_UTF && defined COMPILE_PCRE8
-if (table_limit != 32) for (c = 24; c < 32; c++) start_bits[c] = 0xff;
-#endif
-}
-
-
-
-/*************************************************
-*          Create bitmap of starting bytes       *
-*************************************************/
-
-/* This function scans a compiled unanchored expression recursively and
-attempts to build a bitmap of the set of possible starting bytes. As time goes
-by, we may be able to get more clever at doing this. The SSB_CONTINUE return is
-useful for parenthesized groups in patterns such as (a*)b where the group
-provides some optional starting bytes but scanning must continue at the outer
-level to find at least one mandatory byte. At the outermost level, this
-function fails unless the result is SSB_DONE.
-
-Arguments:
-  code         points to an expression
-  start_bits   points to a 32-byte table, initialized to 0
-  utf          TRUE if in UTF-8 / UTF-16 / UTF-32 mode
-  cd           the block with char table pointers
-
-Returns:       SSB_FAIL     => Failed to find any starting bytes
-               SSB_DONE     => Found mandatory starting bytes
-               SSB_CONTINUE => Found optional starting bytes
-               SSB_UNKNOWN  => Hit an unrecognized opcode
-*/
-
-static int
-set_start_bits(const pcre_uchar *code, pcre_uint8 *start_bits, BOOL utf,
-  compile_data *cd)
-{
-register pcre_uint32 c;
-int yield = SSB_DONE;
-#if defined SUPPORT_UTF && defined COMPILE_PCRE8
-int table_limit = utf? 16:32;
-#else
-int table_limit = 32;
-#endif
-
-#if 0
-/* ========================================================================= */
-/* The following comment and code was inserted in January 1999. In May 2006,
-when it was observed to cause compiler warnings about unused values, I took it
-out again. If anybody is still using OS/2, they will have to put it back
-manually. */
-
-/* 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;
-/* ========================================================================= */
-#endif
-
-do
-  {
-  BOOL try_next = TRUE;
-  const pcre_uchar *tcode = code + 1 + LINK_SIZE;
-
-  if (*code == OP_CBRA || *code == OP_SCBRA ||
-      *code == OP_CBRAPOS || *code == OP_SCBRAPOS) tcode += IMM2_SIZE;
-
-  while (try_next)    /* Loop for items in this branch */
-    {
-    int rc;
-
-    switch(*tcode)
-      {
-      /* If we reach something we don't understand, it means a new opcode has
-      been created that hasn't been added to this code. Hopefully this problem
-      will be discovered during testing. */
-
-      default:
-      return SSB_UNKNOWN;
-
-      /* Fail for a valid opcode that implies no starting bits. */
-
-      case OP_ACCEPT:
-      case OP_ASSERT_ACCEPT:
-      case OP_ALLANY:
-      case OP_ANY:
-      case OP_ANYBYTE:
-      case OP_CIRC:
-      case OP_CIRCM:
-      case OP_CLOSE:
-      case OP_COMMIT:
-      case OP_COND:
-      case OP_CREF:
-      case OP_DEF:
-      case OP_DNCREF:
-      case OP_DNREF:
-      case OP_DNREFI:
-      case OP_DNRREF:
-      case OP_DOLL:
-      case OP_DOLLM:
-      case OP_END:
-      case OP_EOD:
-      case OP_EODN:
-      case OP_EXTUNI:
-      case OP_FAIL:
-      case OP_MARK:
-      case OP_NOT:
-      case OP_NOTEXACT:
-      case OP_NOTEXACTI:
-      case OP_NOTI:
-      case OP_NOTMINPLUS:
-      case OP_NOTMINPLUSI:
-      case OP_NOTMINQUERY:
-      case OP_NOTMINQUERYI:
-      case OP_NOTMINSTAR:
-      case OP_NOTMINSTARI:
-      case OP_NOTMINUPTO:
-      case OP_NOTMINUPTOI:
-      case OP_NOTPLUS:
-      case OP_NOTPLUSI:
-      case OP_NOTPOSPLUS:
-      case OP_NOTPOSPLUSI:
-      case OP_NOTPOSQUERY:
-      case OP_NOTPOSQUERYI:
-      case OP_NOTPOSSTAR:
-      case OP_NOTPOSSTARI:
-      case OP_NOTPOSUPTO:
-      case OP_NOTPOSUPTOI:
-      case OP_NOTPROP:
-      case OP_NOTQUERY:
-      case OP_NOTQUERYI:
-      case OP_NOTSTAR:
-      case OP_NOTSTARI:
-      case OP_NOTUPTO:
-      case OP_NOTUPTOI:
-      case OP_NOT_HSPACE:
-      case OP_NOT_VSPACE:
-      case OP_PRUNE:
-      case OP_PRUNE_ARG:
-      case OP_RECURSE:
-      case OP_REF:
-      case OP_REFI:
-      case OP_REVERSE:
-      case OP_RREF:
-      case OP_SCOND:
-      case OP_SET_SOM:
-      case OP_SKIP:
-      case OP_SKIP_ARG:
-      case OP_SOD:
-      case OP_SOM:
-      case OP_THEN:
-      case OP_THEN_ARG:
-      return SSB_FAIL;
-
-      /* A "real" property test implies no starting bits, but the fake property
-      PT_CLIST identifies a list of characters. These lists are short, as they
-      are used for characters with more than one "other case", so there is no
-      point in recognizing them for OP_NOTPROP. */
-
-      case OP_PROP:
-      if (tcode[1] != PT_CLIST) return SSB_FAIL;
-        {
-        const pcre_uint32 *p = PRIV(ucd_caseless_sets) + tcode[2];
-        while ((c = *p++) < NOTACHAR)
-          {
-#if defined SUPPORT_UTF && defined COMPILE_PCRE8
-          if (utf)
-            {
-            pcre_uchar buff[6];
-            (void)PRIV(ord2utf)(c, buff);
-            c = buff[0];
-            }
-#endif
-          if (c > 0xff) SET_BIT(0xff); else SET_BIT(c);
-          }
-        }
-      try_next = FALSE;
-      break;
-
-      /* We can ignore word boundary tests. */
-
-      case OP_WORD_BOUNDARY:
-      case OP_NOT_WORD_BOUNDARY:
-      tcode++;
-      break;
-
-      /* If we hit a bracket or a positive lookahead assertion, recurse to set
-      bits from within the subpattern. If it can't find anything, we have to
-      give up. If it finds some mandatory character(s), we are done for this
-      branch. Otherwise, carry on scanning after the subpattern. */
-
-      case OP_BRA:
-      case OP_SBRA:
-      case OP_CBRA:
-      case OP_SCBRA:
-      case OP_BRAPOS:
-      case OP_SBRAPOS:
-      case OP_CBRAPOS:
-      case OP_SCBRAPOS:
-      case OP_ONCE:
-      case OP_ONCE_NC:
-      case OP_ASSERT:
-      rc = set_start_bits(tcode, start_bits, utf, cd);
-      if (rc == SSB_FAIL || rc == SSB_UNKNOWN) return rc;
-      if (rc == SSB_DONE) try_next = FALSE; else
-        {
-        do tcode += GET(tcode, 1); while (*tcode == OP_ALT);
-        tcode += 1 + LINK_SIZE;
-        }
-      break;
-
-      /* If we hit ALT or KET, it means we haven't found anything mandatory in
-      this branch, though we might have found something optional. For ALT, we
-      continue with the next alternative, but we have to arrange that the final
-      result from subpattern is SSB_CONTINUE rather than SSB_DONE. For KET,
-      return SSB_CONTINUE: if this is the top level, that indicates failure,
-      but after a nested subpattern, it causes scanning to continue. */
-
-      case OP_ALT:
-      yield = SSB_CONTINUE;
-      try_next = FALSE;
-      break;
-
-      case OP_KET:
-      case OP_KETRMAX:
-      case OP_KETRMIN:
-      case OP_KETRPOS:
-      return SSB_CONTINUE;
-
-      /* Skip over callout */
-
-      case OP_CALLOUT:
-      tcode += 2 + 2*LINK_SIZE;
-      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;
-
-      /* BRAZERO does the bracket, but carries on. */
-
-      case OP_BRAZERO:
-      case OP_BRAMINZERO:
-      case OP_BRAPOSZERO:
-      rc = set_start_bits(++tcode, start_bits, utf, cd);
-      if (rc == SSB_FAIL || rc == SSB_UNKNOWN) return rc;
-/* =========================================================================
-      See the comment at the head of this function concerning the next line,
-      which was an old fudge for the benefit of OS/2.
-      dummy = 1;
-  ========================================================================= */
-      do tcode += GET(tcode,1); while (*tcode == OP_ALT);
-      tcode += 1 + LINK_SIZE;
-      break;
-
-      /* SKIPZERO skips the bracket. */
-
-      case OP_SKIPZERO:
-      tcode++;
-      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_POSSTAR:
-      case OP_QUERY:
-      case OP_MINQUERY:
-      case OP_POSQUERY:
-      tcode = set_table_bit(start_bits, tcode + 1, FALSE, cd, utf);
-      break;
-
-      case OP_STARI:
-      case OP_MINSTARI:
-      case OP_POSSTARI:
-      case OP_QUERYI:
-      case OP_MINQUERYI:
-      case OP_POSQUERYI:
-      tcode = set_table_bit(start_bits, tcode + 1, TRUE, cd, utf);
-      break;
-
-      /* Single-char upto sets the bit and tries the next */
-
-      case OP_UPTO:
-      case OP_MINUPTO:
-      case OP_POSUPTO:
-      tcode = set_table_bit(start_bits, tcode + 1 + IMM2_SIZE, FALSE, cd, utf);
-      break;
-
-      case OP_UPTOI:
-      case OP_MINUPTOI:
-      case OP_POSUPTOI:
-      tcode = set_table_bit(start_bits, tcode + 1 + IMM2_SIZE, TRUE, cd, utf);
-      break;
-
-      /* At least one single char sets the bit and stops */
-
-      case OP_EXACT:
-      tcode += IMM2_SIZE;
-      /* Fall through */
-      case OP_CHAR:
-      case OP_PLUS:
-      case OP_MINPLUS:
-      case OP_POSPLUS:
-      (void)set_table_bit(start_bits, tcode + 1, FALSE, cd, utf);
-      try_next = FALSE;
-      break;
-
-      case OP_EXACTI:
-      tcode += IMM2_SIZE;
-      /* Fall through */
-      case OP_CHARI:
-      case OP_PLUSI:
-      case OP_MINPLUSI:
-      case OP_POSPLUSI:
-      (void)set_table_bit(start_bits, tcode + 1, TRUE, cd, utf);
-      try_next = FALSE;
-      break;
-
-      /* Special spacing and line-terminating items. These recognize specific
-      lists of characters. The difference between VSPACE and ANYNL is that the
-      latter can match the two-character CRLF sequence, but that is not
-      relevant for finding the first character, so their code here is
-      identical. */
-
-      case OP_HSPACE:
-      SET_BIT(CHAR_HT);
-      SET_BIT(CHAR_SPACE);
-#ifdef SUPPORT_UTF
-      if (utf)
-        {
-#ifdef COMPILE_PCRE8
-        SET_BIT(0xC2);  /* For U+00A0 */
-        SET_BIT(0xE1);  /* For U+1680, U+180E */
-        SET_BIT(0xE2);  /* For U+2000 - U+200A, U+202F, U+205F */
-        SET_BIT(0xE3);  /* For U+3000 */
-#elif defined COMPILE_PCRE16 || defined COMPILE_PCRE32
-        SET_BIT(0xA0);
-        SET_BIT(0xFF);  /* For characters > 255 */
-#endif  /* COMPILE_PCRE[8|16|32] */
-        }
-      else
-#endif /* SUPPORT_UTF */
-        {
-#ifndef EBCDIC
-        SET_BIT(0xA0);
-#endif  /* Not EBCDIC */
-#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32
-        SET_BIT(0xFF);  /* For characters > 255 */
-#endif  /* COMPILE_PCRE[16|32] */
-        }
-      try_next = FALSE;
-      break;
-
-      case OP_ANYNL:
-      case OP_VSPACE:
-      SET_BIT(CHAR_LF);
-      SET_BIT(CHAR_VT);
-      SET_BIT(CHAR_FF);
-      SET_BIT(CHAR_CR);
-#ifdef SUPPORT_UTF
-      if (utf)
-        {
-#ifdef COMPILE_PCRE8
-        SET_BIT(0xC2);  /* For U+0085 */
-        SET_BIT(0xE2);  /* For U+2028, U+2029 */
-#elif defined COMPILE_PCRE16 || defined COMPILE_PCRE32
-        SET_BIT(CHAR_NEL);
-        SET_BIT(0xFF);  /* For characters > 255 */
-#endif  /* COMPILE_PCRE[8|16|32] */
-        }
-      else
-#endif /* SUPPORT_UTF */
-        {
-        SET_BIT(CHAR_NEL);
-#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32
-        SET_BIT(0xFF);  /* For characters > 255 */
-#endif
-        }
-      try_next = FALSE;
-      break;
-
-      /* Single character types set the bits and stop. Note that if PCRE_UCP
-      is set, we do not see these op codes because \d etc are converted to
-      properties. Therefore, these apply in the case when only characters less
-      than 256 are recognized to match the types. */
-
-      case OP_NOT_DIGIT:
-      set_nottype_bits(start_bits, cbit_digit, table_limit, cd);
-      try_next = FALSE;
-      break;
-
-      case OP_DIGIT:
-      set_type_bits(start_bits, cbit_digit, table_limit, cd);
-      try_next = FALSE;
-      break;
-
-      /* The cbit_space table has vertical tab as whitespace; we no longer
-      have to play fancy tricks because Perl added VT to its whitespace at
-      release 5.18. PCRE added it at release 8.34. */
-
-      case OP_NOT_WHITESPACE:
-      set_nottype_bits(start_bits, cbit_space, table_limit, cd);
-      try_next = FALSE;
-      break;
-
-      case OP_WHITESPACE:
-      set_type_bits(start_bits, cbit_space, table_limit, cd);
-      try_next = FALSE;
-      break;
-
-      case OP_NOT_WORDCHAR:
-      set_nottype_bits(start_bits, cbit_word, table_limit, cd);
-      try_next = FALSE;
-      break;
-
-      case OP_WORDCHAR:
-      set_type_bits(start_bits, cbit_word, table_limit, cd);
-      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:
-      case OP_TYPEPOSPLUS:
-      tcode++;
-      break;
-
-      case OP_TYPEEXACT:
-      tcode += 1 + IMM2_SIZE;
-      break;
-
-      /* Zero or more repeats of character types set the bits and then
-      try again. */
-
-      case OP_TYPEUPTO:
-      case OP_TYPEMINUPTO:
-      case OP_TYPEPOSUPTO:
-      tcode += IMM2_SIZE;  /* Fall through */
-
-      case OP_TYPESTAR:
-      case OP_TYPEMINSTAR:
-      case OP_TYPEPOSSTAR:
-      case OP_TYPEQUERY:
-      case OP_TYPEMINQUERY:
-      case OP_TYPEPOSQUERY:
-      switch(tcode[1])
-        {
-        default:
-        case OP_ANY:
-        case OP_ALLANY:
-        return SSB_FAIL;
-
-        case OP_HSPACE:
-        SET_BIT(CHAR_HT);
-        SET_BIT(CHAR_SPACE);
-#ifdef SUPPORT_UTF
-        if (utf)
-          {
-#ifdef COMPILE_PCRE8
-          SET_BIT(0xC2);  /* For U+00A0 */
-          SET_BIT(0xE1);  /* For U+1680, U+180E */
-          SET_BIT(0xE2);  /* For U+2000 - U+200A, U+202F, U+205F */
-          SET_BIT(0xE3);  /* For U+3000 */
-#elif defined COMPILE_PCRE16 || defined COMPILE_PCRE32
-          SET_BIT(0xA0);
-          SET_BIT(0xFF);  /* For characters > 255 */
-#endif  /* COMPILE_PCRE[8|16|32] */
-          }
-        else
-#endif /* SUPPORT_UTF */
-#ifndef EBCDIC
-          SET_BIT(0xA0);
-#endif  /* Not EBCDIC */
-        break;
-
-        case OP_ANYNL:
-        case OP_VSPACE:
-        SET_BIT(CHAR_LF);
-        SET_BIT(CHAR_VT);
-        SET_BIT(CHAR_FF);
-        SET_BIT(CHAR_CR);
-#ifdef SUPPORT_UTF
-        if (utf)
-          {
-#ifdef COMPILE_PCRE8
-          SET_BIT(0xC2);  /* For U+0085 */
-          SET_BIT(0xE2);  /* For U+2028, U+2029 */
-#elif defined COMPILE_PCRE16 || defined COMPILE_PCRE32
-          SET_BIT(CHAR_NEL);
-          SET_BIT(0xFF);  /* For characters > 255 */
-#endif  /* COMPILE_PCRE16 */
-          }
-        else
-#endif /* SUPPORT_UTF */
-          SET_BIT(CHAR_NEL);
-        break;
-
-        case OP_NOT_DIGIT:
-        set_nottype_bits(start_bits, cbit_digit, table_limit, cd);
-        break;
-
-        case OP_DIGIT:
-        set_type_bits(start_bits, cbit_digit, table_limit, cd);
-        break;
-
-        /* The cbit_space table has vertical tab as whitespace; we no longer
-        have to play fancy tricks because Perl added VT to its whitespace at
-        release 5.18. PCRE added it at release 8.34. */
-
-        case OP_NOT_WHITESPACE:
-        set_nottype_bits(start_bits, cbit_space, table_limit, cd);
-        break;
-
-        case OP_WHITESPACE:
-        set_type_bits(start_bits, cbit_space, table_limit, cd);
-        break;
-
-        case OP_NOT_WORDCHAR:
-        set_nottype_bits(start_bits, cbit_word, table_limit, cd);
-        break;
-
-        case OP_WORDCHAR:
-        set_type_bits(start_bits, cbit_word, table_limit, cd);
-        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. */
-
-#if defined SUPPORT_UTF || !defined COMPILE_PCRE8
-      case OP_XCLASS:
-      if ((tcode[1 + LINK_SIZE] & XCL_HASPROP) != 0)
-        return SSB_FAIL;
-      /* All bits are set. */
-      if ((tcode[1 + LINK_SIZE] & XCL_MAP) == 0 && (tcode[1 + LINK_SIZE] & XCL_NOT) != 0)
-        return SSB_FAIL;
-#endif
-      /* Fall through */
-
-      case OP_NCLASS:
-#if defined SUPPORT_UTF && defined COMPILE_PCRE8
-      if (utf)
-        {
-        start_bits[24] |= 0xf0;              /* Bits for 0xc4 - 0xc8 */
-        memset(start_bits+25, 0xff, 7);      /* Bits for 0xc9 - 0xff */
-        }
-#endif
-#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32
-      SET_BIT(0xFF);                         /* For characters > 255 */
-#endif
-      /* Fall through */
-
-      case OP_CLASS:
-        {
-        pcre_uint8 *map;
-#if defined SUPPORT_UTF || !defined COMPILE_PCRE8
-        map = NULL;
-        if (*tcode == OP_XCLASS)
-          {
-          if ((tcode[1 + LINK_SIZE] & XCL_MAP) != 0)
-            map = (pcre_uint8 *)(tcode + 1 + LINK_SIZE + 1);
-          tcode += GET(tcode, 1);
-          }
-        else
-#endif
-          {
-          tcode++;
-          map = (pcre_uint8 *)tcode;
-          tcode += 32 / sizeof(pcre_uchar);
-          }
-
-        /* 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 defined SUPPORT_UTF || !defined COMPILE_PCRE8
-        if (map != NULL)
-#endif
-          {
-#if defined SUPPORT_UTF && defined COMPILE_PCRE8
-          if (utf)
-            {
-            for (c = 0; c < 16; c++) start_bits[c] |= map[c];
-            for (c = 128; c < 256; c++)
-              {
-              if ((map[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. */
-                }
-              }
-            }
-          else
-#endif
-            {
-            /* In non-UTF-8 mode, the two bit maps are completely compatible. */
-            for (c = 0; c < 32; c++) start_bits[c] |= map[c];
-            }
-          }
-
-        /* Advance past the bit map, and act on what follows. For a zero
-        minimum repeat, continue; otherwise stop processing. */
-
-        switch (*tcode)
-          {
-          case OP_CRSTAR:
-          case OP_CRMINSTAR:
-          case OP_CRQUERY:
-          case OP_CRMINQUERY:
-          case OP_CRPOSSTAR:
-          case OP_CRPOSQUERY:
-          tcode++;
-          break;
-
-          case OP_CRRANGE:
-          case OP_CRMINRANGE:
-          case OP_CRPOSRANGE:
-          if (GET2(tcode, 1) == 0) tcode += 1 + 2 * IMM2_SIZE;
-            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 yield;
-}
-
-
-
-
-
-/*************************************************
-*          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[16]_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[16]_extra block, with study_data filled in and
-              the appropriate flags set;
-            NULL on error or if no optimization possible
-*/
-
-#if defined COMPILE_PCRE8
-PCRE_EXP_DEFN pcre_extra * PCRE_CALL_CONVENTION
-pcre_study(const pcre *external_re, int options, const char **errorptr)
-#elif defined COMPILE_PCRE16
-PCRE_EXP_DEFN pcre16_extra * PCRE_CALL_CONVENTION
-pcre16_study(const pcre16 *external_re, int options, const char **errorptr)
-#elif defined COMPILE_PCRE32
-PCRE_EXP_DEFN pcre32_extra * PCRE_CALL_CONVENTION
-pcre32_study(const pcre32 *external_re, int options, const char **errorptr)
-#endif
-{
-int min;
-int count = 0;
-BOOL bits_set = FALSE;
-pcre_uint8 start_bits[32];
-PUBL(extra) *extra = NULL;
-pcre_study_data *study;
-const pcre_uint8 *tables;
-pcre_uchar *code;
-compile_data compile_block;
-const REAL_PCRE *re = (const REAL_PCRE *)external_re;
-
-
-*errorptr = NULL;
-
-if (re == NULL || re->magic_number != MAGIC_NUMBER)
-  {
-  *errorptr = "argument is not a compiled regular expression";
-  return NULL;
-  }
-
-if ((re->flags & PCRE_MODE) == 0)
-  {
-#if defined COMPILE_PCRE8
-  *errorptr = "argument not compiled in 8 bit mode";
-#elif defined COMPILE_PCRE16
-  *errorptr = "argument not compiled in 16 bit mode";
-#elif defined COMPILE_PCRE32
-  *errorptr = "argument not compiled in 32 bit mode";
-#endif
-  return NULL;
-  }
-
-if ((options & ~PUBLIC_STUDY_OPTIONS) != 0)
-  {
-  *errorptr = "unknown or incorrect option bit(s) set";
-  return NULL;
-  }
-
-code = (pcre_uchar *)re + re->name_table_offset +
-  (re->name_count * re->name_entry_size);
-
-/* For an anchored pattern, or an unanchored pattern that has a first char, or
-a multiline pattern that matches only at "line starts", there is no point in
-seeking a list of starting bytes. */
-
-if ((re->options & PCRE_ANCHORED) == 0 &&
-    (re->flags & (PCRE_FIRSTSET|PCRE_STARTLINE)) == 0)
-  {
-  int rc;
-
-  /* Set the character tables in the block that is passed around */
-
-  tables = re->tables;
-
-#if defined COMPILE_PCRE8
-  if (tables == NULL)
-    (void)pcre_fullinfo(external_re, NULL, PCRE_INFO_DEFAULT_TABLES,
-    (void *)(&tables));
-#elif defined COMPILE_PCRE16
-  if (tables == NULL)
-    (void)pcre16_fullinfo(external_re, NULL, PCRE_INFO_DEFAULT_TABLES,
-    (void *)(&tables));
-#elif defined COMPILE_PCRE32
-  if (tables == NULL)
-    (void)pcre32_fullinfo(external_re, NULL, PCRE_INFO_DEFAULT_TABLES,
-    (void *)(&tables));
-#endif
-
-  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(pcre_uint8));
-  rc = set_start_bits(code, start_bits, (re->options & PCRE_UTF8) != 0,
-    &compile_block);
-  bits_set = rc == SSB_DONE;
-  if (rc == SSB_UNKNOWN)
-    {
-    *errorptr = "internal error: opcode not recognized";
-    return NULL;
-    }
-  }
-
-/* Find the minimum length of subject string. */
-
-switch(min = find_minlength(re, code, code, re->options, NULL, &count))
-  {
-  case -2: *errorptr = "internal error: missing capturing bracket"; return NULL;
-  case -3: *errorptr = "internal error: opcode not recognized"; return NULL;
-  default: break;
-  }
-
-/* If a set of starting bytes has been identified, or if the minimum length is
-greater than zero, or if JIT optimization has been requested, or if
-PCRE_STUDY_EXTRA_NEEDED is set, get a pcre[16]_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. */
-
-if (bits_set || min > 0 || (options & (
-#ifdef SUPPORT_JIT
-    PCRE_STUDY_JIT_COMPILE | PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE |
-    PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE |
-#endif
-    PCRE_STUDY_EXTRA_NEEDED)) != 0)
-  {
-  extra = (PUBL(extra) *)(PUBL(malloc))
-    (sizeof(PUBL(extra)) + sizeof(pcre_study_data));
-  if (extra == NULL)
-    {
-    *errorptr = "failed to get memory";
-    return NULL;
-    }
-
-  study = (pcre_study_data *)((char *)extra + sizeof(PUBL(extra)));
-  extra->flags = PCRE_EXTRA_STUDY_DATA;
-  extra->study_data = study;
-
-  study->size = sizeof(pcre_study_data);
-  study->flags = 0;
-
-  /* Set the start bits always, to avoid unset memory errors if the
-  study data is written to a file, but set the flag only if any of the bits
-  are set, to save time looking when none are. */
-
-  if (bits_set)
-    {
-    study->flags |= PCRE_STUDY_MAPPED;
-    memcpy(study->start_bits, start_bits, sizeof(start_bits));
-    }
-  else memset(study->start_bits, 0, 32 * sizeof(pcre_uint8));
-
-#ifdef PCRE_DEBUG
-  if (bits_set)
-    {
-    pcre_uint8 *ptr = start_bits;
-    int i;
-
-    printf("Start bits:\n");
-    for (i = 0; i < 32; i++)
-      printf("%3d: %02x%s", i * 8, *ptr++, ((i + 1) & 0x7) != 0? " " : "\n");
-    }
-#endif
-
-  /* Always set the minlength value in the block, because the JIT compiler
-  makes use of it. However, don't set the bit unless the length is greater than
-  zero - the interpretive pcre_exec() and pcre_dfa_exec() needn't waste time
-  checking the zero case. */
-
-  if (min > 0)
-    {
-    study->flags |= PCRE_STUDY_MINLEN;
-    study->minlength = min;
-    }
-  else study->minlength = 0;
-
-  /* If JIT support was compiled and requested, attempt the JIT compilation.
-  If no starting bytes were found, and the minimum length is zero, and JIT
-  compilation fails, abandon the extra block and return NULL, unless
-  PCRE_STUDY_EXTRA_NEEDED is set. */
-
-#ifdef SUPPORT_JIT
-  extra->executable_jit = NULL;
-  if ((options & PCRE_STUDY_JIT_COMPILE) != 0)
-    PRIV(jit_compile)(re, extra, JIT_COMPILE);
-  if ((options & PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE) != 0)
-    PRIV(jit_compile)(re, extra, JIT_PARTIAL_SOFT_COMPILE);
-  if ((options & PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE) != 0)
-    PRIV(jit_compile)(re, extra, JIT_PARTIAL_HARD_COMPILE);
-
-  if (study->flags == 0 && (extra->flags & PCRE_EXTRA_EXECUTABLE_JIT) == 0 &&
-      (options & PCRE_STUDY_EXTRA_NEEDED) == 0)
-    {
-#if defined COMPILE_PCRE8
-    pcre_free_study(extra);
-#elif defined COMPILE_PCRE16
-    pcre16_free_study(extra);
-#elif defined COMPILE_PCRE32
-    pcre32_free_study(extra);
-#endif
-    extra = NULL;
-    }
-#endif
-  }
-
-return extra;
-}
-
-
-/*************************************************
-*          Free the study data                   *
-*************************************************/
-
-/* This function frees the memory that was obtained by pcre_study().
-
-Argument:   a pointer to the pcre[16]_extra block
-Returns:    nothing
-*/
-
-#if defined COMPILE_PCRE8
-PCRE_EXP_DEFN void
-pcre_free_study(pcre_extra *extra)
-#elif defined COMPILE_PCRE16
-PCRE_EXP_DEFN void
-pcre16_free_study(pcre16_extra *extra)
-#elif defined COMPILE_PCRE32
-PCRE_EXP_DEFN void
-pcre32_free_study(pcre32_extra *extra)
-#endif
-{
-if (extra == NULL)
-  return;
-#ifdef SUPPORT_JIT
-if ((extra->flags & PCRE_EXTRA_EXECUTABLE_JIT) != 0 &&
-     extra->executable_jit != NULL)
-  PRIV(jit_free)(extra->executable_jit);
-#endif
-PUBL(free)(extra);
-}
-
-/* End of pcre_study.c */
diff --git a/dist/pcre_ucd.c b/dist/pcre_ucd.c
deleted file mode 100644
index 69c4fd4..0000000
--- a/dist/pcre_ucd.c
+++ /dev/null
@@ -1,3630 +0,0 @@
-/* This module is generated by the maint/MultiStage2.py script.
-Do not modify it by hand. Instead modify the script and run it
-to regenerate this code.
-
-As well as being part of the PCRE library, this module is #included
-by the pcretest program, which redefines the PRIV macro to change
-table names from _pcre_xxx to xxxx, thereby avoiding name clashes
-with the library. At present, just one of these tables is actually
-needed. */
-
-#ifndef PCRE_INCLUDED
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include "pcre_internal.h"
-
-#endif /* PCRE_INCLUDED */
-
-/* Unicode character database. */
-/* This file was autogenerated by the MultiStage2.py script. */
-/* Total size: 72576 bytes, block size: 128. */
-
-/* The tables herein are needed only when UCP support is built
-into PCRE. This module should not be referenced otherwise, so
-it should not matter whether it is compiled or not. However
-a comment was received about space saving - maybe the guy linked
-all the modules rather than using a library - so we include a
-condition to cut out the tables when not needed. But don't leave
-a totally empty module because some compilers barf at that.
-Instead, just supply small dummy tables. */
-
-#ifndef SUPPORT_UCP
-const ucd_record PRIV(ucd_records)[] = {{0,0,0,0,0 }};
-const pcre_uint8 PRIV(ucd_stage1)[] = {0};
-const pcre_uint16 PRIV(ucd_stage2)[] = {0};
-const pcre_uint32 PRIV(ucd_caseless_sets)[] = {0};
-#else
-
-/* When recompiling tables with a new Unicode version, please check the
-types in this structure definition from pcre_internal.h (the actual
-field names will be different):
-
-typedef struct {
-pcre_uint8 property_0;
-pcre_uint8 property_1;
-pcre_uint8 property_2;
-pcre_uint8 property_3;
-pcre_int32 property_4;
-} ucd_record;
-*/
-
-
-const pcre_uint32 PRIV(ucd_caseless_sets)[] = {
-  NOTACHAR,
-  0x0053,   0x0073,   0x017f,   NOTACHAR,
-  0x01c4,   0x01c5,   0x01c6,   NOTACHAR,
-  0x01c7,   0x01c8,   0x01c9,   NOTACHAR,
-  0x01ca,   0x01cb,   0x01cc,   NOTACHAR,
-  0x01f1,   0x01f2,   0x01f3,   NOTACHAR,
-  0x0345,   0x0399,   0x03b9,   0x1fbe,   NOTACHAR,
-  0x00b5,   0x039c,   0x03bc,   NOTACHAR,
-  0x03a3,   0x03c2,   0x03c3,   NOTACHAR,
-  0x0392,   0x03b2,   0x03d0,   NOTACHAR,
-  0x0398,   0x03b8,   0x03d1,   0x03f4,   NOTACHAR,
-  0x03a6,   0x03c6,   0x03d5,   NOTACHAR,
-  0x03a0,   0x03c0,   0x03d6,   NOTACHAR,
-  0x039a,   0x03ba,   0x03f0,   NOTACHAR,
-  0x03a1,   0x03c1,   0x03f1,   NOTACHAR,
-  0x0395,   0x03b5,   0x03f5,   NOTACHAR,
-  0x1e60,   0x1e61,   0x1e9b,   NOTACHAR,
-  0x03a9,   0x03c9,   0x2126,   NOTACHAR,
-  0x004b,   0x006b,   0x212a,   NOTACHAR,
-  0x00c5,   0x00e5,   0x212b,   NOTACHAR,
-};
-
-/* When #included in pcretest, we don't need this large table. */
-
-#ifndef PCRE_INCLUDED
-
-const ucd_record PRIV(ucd_records)[] = { /* 5760 bytes, record size 8 */
-  {     9,      0,      2,      0,      0, }, /*   0 */
-  {     9,      0,      1,      0,      0, }, /*   1 */
-  {     9,      0,      0,      0,      0, }, /*   2 */
-  {     9,     29,     12,      0,      0, }, /*   3 */
-  {     9,     21,     12,      0,      0, }, /*   4 */
-  {     9,     23,     12,      0,      0, }, /*   5 */
-  {     9,     22,     12,      0,      0, }, /*   6 */
-  {     9,     18,     12,      0,      0, }, /*   7 */
-  {     9,     25,     12,      0,      0, }, /*   8 */
-  {     9,     17,     12,      0,      0, }, /*   9 */
-  {     9,     13,     12,      0,      0, }, /*  10 */
-  {    33,      9,     12,      0,     32, }, /*  11 */
-  {    33,      9,     12,     71,     32, }, /*  12 */
-  {    33,      9,     12,      1,     32, }, /*  13 */
-  {     9,     24,     12,      0,      0, }, /*  14 */
-  {     9,     16,     12,      0,      0, }, /*  15 */
-  {    33,      5,     12,      0,    -32, }, /*  16 */
-  {    33,      5,     12,     71,    -32, }, /*  17 */
-  {    33,      5,     12,      1,    -32, }, /*  18 */
-  {     9,     26,     12,      0,      0, }, /*  19 */
-  {    33,      7,     12,      0,      0, }, /*  20 */
-  {     9,     20,     12,      0,      0, }, /*  21 */
-  {     9,      1,      2,      0,      0, }, /*  22 */
-  {     9,     15,     12,      0,      0, }, /*  23 */
-  {     9,      5,     12,     26,    775, }, /*  24 */
-  {     9,     19,     12,      0,      0, }, /*  25 */
-  {    33,      9,     12,     75,     32, }, /*  26 */
-  {    33,      5,     12,      0,   7615, }, /*  27 */
-  {    33,      5,     12,     75,    -32, }, /*  28 */
-  {    33,      5,     12,      0,    121, }, /*  29 */
-  {    33,      9,     12,      0,      1, }, /*  30 */
-  {    33,      5,     12,      0,     -1, }, /*  31 */
-  {    33,      9,     12,      0,      0, }, /*  32 */
-  {    33,      5,     12,      0,      0, }, /*  33 */
-  {    33,      9,     12,      0,   -121, }, /*  34 */
-  {    33,      5,     12,      1,   -268, }, /*  35 */
-  {    33,      5,     12,      0,    195, }, /*  36 */
-  {    33,      9,     12,      0,    210, }, /*  37 */
-  {    33,      9,     12,      0,    206, }, /*  38 */
-  {    33,      9,     12,      0,    205, }, /*  39 */
-  {    33,      9,     12,      0,     79, }, /*  40 */
-  {    33,      9,     12,      0,    202, }, /*  41 */
-  {    33,      9,     12,      0,    203, }, /*  42 */
-  {    33,      9,     12,      0,    207, }, /*  43 */
-  {    33,      5,     12,      0,     97, }, /*  44 */
-  {    33,      9,     12,      0,    211, }, /*  45 */
-  {    33,      9,     12,      0,    209, }, /*  46 */
-  {    33,      5,     12,      0,    163, }, /*  47 */
-  {    33,      9,     12,      0,    213, }, /*  48 */
-  {    33,      5,     12,      0,    130, }, /*  49 */
-  {    33,      9,     12,      0,    214, }, /*  50 */
-  {    33,      9,     12,      0,    218, }, /*  51 */
-  {    33,      9,     12,      0,    217, }, /*  52 */
-  {    33,      9,     12,      0,    219, }, /*  53 */
-  {    33,      5,     12,      0,     56, }, /*  54 */
-  {    33,      9,     12,      5,      2, }, /*  55 */
-  {    33,      8,     12,      5,      1, }, /*  56 */
-  {    33,      5,     12,      5,     -2, }, /*  57 */
-  {    33,      9,     12,      9,      2, }, /*  58 */
-  {    33,      8,     12,      9,      1, }, /*  59 */
-  {    33,      5,     12,      9,     -2, }, /*  60 */
-  {    33,      9,     12,     13,      2, }, /*  61 */
-  {    33,      8,     12,     13,      1, }, /*  62 */
-  {    33,      5,     12,     13,     -2, }, /*  63 */
-  {    33,      5,     12,      0,    -79, }, /*  64 */
-  {    33,      9,     12,     17,      2, }, /*  65 */
-  {    33,      8,     12,     17,      1, }, /*  66 */
-  {    33,      5,     12,     17,     -2, }, /*  67 */
-  {    33,      9,     12,      0,    -97, }, /*  68 */
-  {    33,      9,     12,      0,    -56, }, /*  69 */
-  {    33,      9,     12,      0,   -130, }, /*  70 */
-  {    33,      9,     12,      0,  10795, }, /*  71 */
-  {    33,      9,     12,      0,   -163, }, /*  72 */
-  {    33,      9,     12,      0,  10792, }, /*  73 */
-  {    33,      5,     12,      0,  10815, }, /*  74 */
-  {    33,      9,     12,      0,   -195, }, /*  75 */
-  {    33,      9,     12,      0,     69, }, /*  76 */
-  {    33,      9,     12,      0,     71, }, /*  77 */
-  {    33,      5,     12,      0,  10783, }, /*  78 */
-  {    33,      5,     12,      0,  10780, }, /*  79 */
-  {    33,      5,     12,      0,  10782, }, /*  80 */
-  {    33,      5,     12,      0,   -210, }, /*  81 */
-  {    33,      5,     12,      0,   -206, }, /*  82 */
-  {    33,      5,     12,      0,   -205, }, /*  83 */
-  {    33,      5,     12,      0,   -202, }, /*  84 */
-  {    33,      5,     12,      0,   -203, }, /*  85 */
-  {    33,      5,     12,      0,  42319, }, /*  86 */
-  {    33,      5,     12,      0,  42315, }, /*  87 */
-  {    33,      5,     12,      0,   -207, }, /*  88 */
-  {    33,      5,     12,      0,  42280, }, /*  89 */
-  {    33,      5,     12,      0,  42308, }, /*  90 */
-  {    33,      5,     12,      0,   -209, }, /*  91 */
-  {    33,      5,     12,      0,   -211, }, /*  92 */
-  {    33,      5,     12,      0,  10743, }, /*  93 */
-  {    33,      5,     12,      0,  42305, }, /*  94 */
-  {    33,      5,     12,      0,  10749, }, /*  95 */
-  {    33,      5,     12,      0,   -213, }, /*  96 */
-  {    33,      5,     12,      0,   -214, }, /*  97 */
-  {    33,      5,     12,      0,  10727, }, /*  98 */
-  {    33,      5,     12,      0,   -218, }, /*  99 */
-  {    33,      5,     12,      0,  42282, }, /* 100 */
-  {    33,      5,     12,      0,    -69, }, /* 101 */
-  {    33,      5,     12,      0,   -217, }, /* 102 */
-  {    33,      5,     12,      0,    -71, }, /* 103 */
-  {    33,      5,     12,      0,   -219, }, /* 104 */
-  {    33,      5,     12,      0,  42258, }, /* 105 */
-  {    33,      6,     12,      0,      0, }, /* 106 */
-  {     9,      6,     12,      0,      0, }, /* 107 */
-  {     3,     24,     12,      0,      0, }, /* 108 */
-  {    27,     12,      3,      0,      0, }, /* 109 */
-  {    27,     12,      3,     21,    116, }, /* 110 */
-  {    19,      9,     12,      0,      1, }, /* 111 */
-  {    19,      5,     12,      0,     -1, }, /* 112 */
-  {    19,     24,     12,      0,      0, }, /* 113 */
-  {     9,      2,     12,      0,      0, }, /* 114 */
-  {    19,      6,     12,      0,      0, }, /* 115 */
-  {    19,      5,     12,      0,    130, }, /* 116 */
-  {    19,      9,     12,      0,    116, }, /* 117 */
-  {    19,      9,     12,      0,     38, }, /* 118 */
-  {    19,      9,     12,      0,     37, }, /* 119 */
-  {    19,      9,     12,      0,     64, }, /* 120 */
-  {    19,      9,     12,      0,     63, }, /* 121 */
-  {    19,      5,     12,      0,      0, }, /* 122 */
-  {    19,      9,     12,      0,     32, }, /* 123 */
-  {    19,      9,     12,     34,     32, }, /* 124 */
-  {    19,      9,     12,     59,     32, }, /* 125 */
-  {    19,      9,     12,     38,     32, }, /* 126 */
-  {    19,      9,     12,     21,     32, }, /* 127 */
-  {    19,      9,     12,     51,     32, }, /* 128 */
-  {    19,      9,     12,     26,     32, }, /* 129 */
-  {    19,      9,     12,     47,     32, }, /* 130 */
-  {    19,      9,     12,     55,     32, }, /* 131 */
-  {    19,      9,     12,     30,     32, }, /* 132 */
-  {    19,      9,     12,     43,     32, }, /* 133 */
-  {    19,      9,     12,     67,     32, }, /* 134 */
-  {    19,      5,     12,      0,    -38, }, /* 135 */
-  {    19,      5,     12,      0,    -37, }, /* 136 */
-  {    19,      5,     12,      0,    -32, }, /* 137 */
-  {    19,      5,     12,     34,    -32, }, /* 138 */
-  {    19,      5,     12,     59,    -32, }, /* 139 */
-  {    19,      5,     12,     38,    -32, }, /* 140 */
-  {    19,      5,     12,     21,   -116, }, /* 141 */
-  {    19,      5,     12,     51,    -32, }, /* 142 */
-  {    19,      5,     12,     26,   -775, }, /* 143 */
-  {    19,      5,     12,     47,    -32, }, /* 144 */
-  {    19,      5,     12,     55,    -32, }, /* 145 */
-  {    19,      5,     12,     30,      1, }, /* 146 */
-  {    19,      5,     12,     30,    -32, }, /* 147 */
-  {    19,      5,     12,     43,    -32, }, /* 148 */
-  {    19,      5,     12,     67,    -32, }, /* 149 */
-  {    19,      5,     12,      0,    -64, }, /* 150 */
-  {    19,      5,     12,      0,    -63, }, /* 151 */
-  {    19,      9,     12,      0,      8, }, /* 152 */
-  {    19,      5,     12,     34,    -30, }, /* 153 */
-  {    19,      5,     12,     38,    -25, }, /* 154 */
-  {    19,      9,     12,      0,      0, }, /* 155 */
-  {    19,      5,     12,     43,    -15, }, /* 156 */
-  {    19,      5,     12,     47,    -22, }, /* 157 */
-  {    19,      5,     12,      0,     -8, }, /* 158 */
-  {    10,      9,     12,      0,      1, }, /* 159 */
-  {    10,      5,     12,      0,     -1, }, /* 160 */
-  {    19,      5,     12,     51,    -54, }, /* 161 */
-  {    19,      5,     12,     55,    -48, }, /* 162 */
-  {    19,      5,     12,      0,      7, }, /* 163 */
-  {    19,      5,     12,      0,   -116, }, /* 164 */
-  {    19,      9,     12,     38,    -60, }, /* 165 */
-  {    19,      5,     12,     59,    -64, }, /* 166 */
-  {    19,     25,     12,      0,      0, }, /* 167 */
-  {    19,      9,     12,      0,     -7, }, /* 168 */
-  {    19,      9,     12,      0,   -130, }, /* 169 */
-  {    12,      9,     12,      0,     80, }, /* 170 */
-  {    12,      9,     12,      0,     32, }, /* 171 */
-  {    12,      5,     12,      0,    -32, }, /* 172 */
-  {    12,      5,     12,      0,    -80, }, /* 173 */
-  {    12,      9,     12,      0,      1, }, /* 174 */
-  {    12,      5,     12,      0,     -1, }, /* 175 */
-  {    12,     26,     12,      0,      0, }, /* 176 */
-  {    12,     12,      3,      0,      0, }, /* 177 */
-  {    12,     11,      3,      0,      0, }, /* 178 */
-  {    12,      9,     12,      0,     15, }, /* 179 */
-  {    12,      5,     12,      0,    -15, }, /* 180 */
-  {     1,      9,     12,      0,     48, }, /* 181 */
-  {     1,      6,     12,      0,      0, }, /* 182 */
-  {     1,     21,     12,      0,      0, }, /* 183 */
-  {     1,      5,     12,      0,    -48, }, /* 184 */
-  {     1,      5,     12,      0,      0, }, /* 185 */
-  {     1,     17,     12,      0,      0, }, /* 186 */
-  {     1,     26,     12,      0,      0, }, /* 187 */
-  {     1,     23,     12,      0,      0, }, /* 188 */
-  {    25,     12,      3,      0,      0, }, /* 189 */
-  {    25,     17,     12,      0,      0, }, /* 190 */
-  {    25,     21,     12,      0,      0, }, /* 191 */
-  {    25,      7,     12,      0,      0, }, /* 192 */
-  {     0,      1,      2,      0,      0, }, /* 193 */
-  {     0,     25,     12,      0,      0, }, /* 194 */
-  {     0,     21,     12,      0,      0, }, /* 195 */
-  {     0,     23,     12,      0,      0, }, /* 196 */
-  {     0,     26,     12,      0,      0, }, /* 197 */
-  {     0,     12,      3,      0,      0, }, /* 198 */
-  {     0,      7,     12,      0,      0, }, /* 199 */
-  {     0,      6,     12,      0,      0, }, /* 200 */
-  {     0,     13,     12,      0,      0, }, /* 201 */
-  {    49,     21,     12,      0,      0, }, /* 202 */
-  {    49,      1,      2,      0,      0, }, /* 203 */
-  {    49,      7,     12,      0,      0, }, /* 204 */
-  {    49,     12,      3,      0,      0, }, /* 205 */
-  {    55,      7,     12,      0,      0, }, /* 206 */
-  {    55,     12,      3,      0,      0, }, /* 207 */
-  {    63,     13,     12,      0,      0, }, /* 208 */
-  {    63,      7,     12,      0,      0, }, /* 209 */
-  {    63,     12,      3,      0,      0, }, /* 210 */
-  {    63,      6,     12,      0,      0, }, /* 211 */
-  {    63,     26,     12,      0,      0, }, /* 212 */
-  {    63,     21,     12,      0,      0, }, /* 213 */
-  {    89,      7,     12,      0,      0, }, /* 214 */
-  {    89,     12,      3,      0,      0, }, /* 215 */
-  {    89,      6,     12,      0,      0, }, /* 216 */
-  {    89,     21,     12,      0,      0, }, /* 217 */
-  {    94,      7,     12,      0,      0, }, /* 218 */
-  {    94,     12,      3,      0,      0, }, /* 219 */
-  {    94,     21,     12,      0,      0, }, /* 220 */
-  {    14,     12,      3,      0,      0, }, /* 221 */
-  {    14,     10,      5,      0,      0, }, /* 222 */
-  {    14,      7,     12,      0,      0, }, /* 223 */
-  {    14,     13,     12,      0,      0, }, /* 224 */
-  {    14,     21,     12,      0,      0, }, /* 225 */
-  {    14,      6,     12,      0,      0, }, /* 226 */
-  {     2,      7,     12,      0,      0, }, /* 227 */
-  {     2,     12,      3,      0,      0, }, /* 228 */
-  {     2,     10,      5,      0,      0, }, /* 229 */
-  {     2,     10,      3,      0,      0, }, /* 230 */
-  {     2,     13,     12,      0,      0, }, /* 231 */
-  {     2,     23,     12,      0,      0, }, /* 232 */
-  {     2,     15,     12,      0,      0, }, /* 233 */
-  {     2,     26,     12,      0,      0, }, /* 234 */
-  {    21,     12,      3,      0,      0, }, /* 235 */
-  {    21,     10,      5,      0,      0, }, /* 236 */
-  {    21,      7,     12,      0,      0, }, /* 237 */
-  {    21,     13,     12,      0,      0, }, /* 238 */
-  {    20,     12,      3,      0,      0, }, /* 239 */
-  {    20,     10,      5,      0,      0, }, /* 240 */
-  {    20,      7,     12,      0,      0, }, /* 241 */
-  {    20,     13,     12,      0,      0, }, /* 242 */
-  {    20,     21,     12,      0,      0, }, /* 243 */
-  {    20,     23,     12,      0,      0, }, /* 244 */
-  {    43,     12,      3,      0,      0, }, /* 245 */
-  {    43,     10,      5,      0,      0, }, /* 246 */
-  {    43,      7,     12,      0,      0, }, /* 247 */
-  {    43,     10,      3,      0,      0, }, /* 248 */
-  {    43,     13,     12,      0,      0, }, /* 249 */
-  {    43,     26,     12,      0,      0, }, /* 250 */
-  {    43,     15,     12,      0,      0, }, /* 251 */
-  {    53,     12,      3,      0,      0, }, /* 252 */
-  {    53,      7,     12,      0,      0, }, /* 253 */
-  {    53,     10,      3,      0,      0, }, /* 254 */
-  {    53,     10,      5,      0,      0, }, /* 255 */
-  {    53,     13,     12,      0,      0, }, /* 256 */
-  {    53,     15,     12,      0,      0, }, /* 257 */
-  {    53,     26,     12,      0,      0, }, /* 258 */
-  {    53,     23,     12,      0,      0, }, /* 259 */
-  {    54,     12,      3,      0,      0, }, /* 260 */
-  {    54,     10,      5,      0,      0, }, /* 261 */
-  {    54,      7,     12,      0,      0, }, /* 262 */
-  {    54,     13,     12,      0,      0, }, /* 263 */
-  {    54,     15,     12,      0,      0, }, /* 264 */
-  {    54,     26,     12,      0,      0, }, /* 265 */
-  {    28,     12,      3,      0,      0, }, /* 266 */
-  {    28,     10,      5,      0,      0, }, /* 267 */
-  {    28,      7,     12,      0,      0, }, /* 268 */
-  {    28,     10,      3,      0,      0, }, /* 269 */
-  {    28,     13,     12,      0,      0, }, /* 270 */
-  {    36,     12,      3,      0,      0, }, /* 271 */
-  {    36,     10,      5,      0,      0, }, /* 272 */
-  {    36,      7,     12,      0,      0, }, /* 273 */
-  {    36,     10,      3,      0,      0, }, /* 274 */
-  {    36,     13,     12,      0,      0, }, /* 275 */
-  {    36,     15,     12,      0,      0, }, /* 276 */
-  {    36,     26,     12,      0,      0, }, /* 277 */
-  {    47,     10,      5,      0,      0, }, /* 278 */
-  {    47,      7,     12,      0,      0, }, /* 279 */
-  {    47,     12,      3,      0,      0, }, /* 280 */
-  {    47,     10,      3,      0,      0, }, /* 281 */
-  {    47,     13,     12,      0,      0, }, /* 282 */
-  {    47,     21,     12,      0,      0, }, /* 283 */
-  {    56,      7,     12,      0,      0, }, /* 284 */
-  {    56,     12,      3,      0,      0, }, /* 285 */
-  {    56,      7,      5,      0,      0, }, /* 286 */
-  {    56,      6,     12,      0,      0, }, /* 287 */
-  {    56,     21,     12,      0,      0, }, /* 288 */
-  {    56,     13,     12,      0,      0, }, /* 289 */
-  {    32,      7,     12,      0,      0, }, /* 290 */
-  {    32,     12,      3,      0,      0, }, /* 291 */
-  {    32,      7,      5,      0,      0, }, /* 292 */
-  {    32,      6,     12,      0,      0, }, /* 293 */
-  {    32,     13,     12,      0,      0, }, /* 294 */
-  {    57,      7,     12,      0,      0, }, /* 295 */
-  {    57,     26,     12,      0,      0, }, /* 296 */
-  {    57,     21,     12,      0,      0, }, /* 297 */
-  {    57,     12,      3,      0,      0, }, /* 298 */
-  {    57,     13,     12,      0,      0, }, /* 299 */
-  {    57,     15,     12,      0,      0, }, /* 300 */
-  {    57,     22,     12,      0,      0, }, /* 301 */
-  {    57,     18,     12,      0,      0, }, /* 302 */
-  {    57,     10,      5,      0,      0, }, /* 303 */
-  {    38,      7,     12,      0,      0, }, /* 304 */
-  {    38,     10,     12,      0,      0, }, /* 305 */
-  {    38,     12,      3,      0,      0, }, /* 306 */
-  {    38,     10,      5,      0,      0, }, /* 307 */
-  {    38,     13,     12,      0,      0, }, /* 308 */
-  {    38,     21,     12,      0,      0, }, /* 309 */
-  {    38,     26,     12,      0,      0, }, /* 310 */
-  {    16,      9,     12,      0,   7264, }, /* 311 */
-  {    16,      7,     12,      0,      0, }, /* 312 */
-  {    16,      6,     12,      0,      0, }, /* 313 */
-  {    23,      7,      6,      0,      0, }, /* 314 */
-  {    23,      7,      7,      0,      0, }, /* 315 */
-  {    23,      7,      8,      0,      0, }, /* 316 */
-  {    15,      7,     12,      0,      0, }, /* 317 */
-  {    15,     12,      3,      0,      0, }, /* 318 */
-  {    15,     21,     12,      0,      0, }, /* 319 */
-  {    15,     15,     12,      0,      0, }, /* 320 */
-  {    15,     26,     12,      0,      0, }, /* 321 */
-  {     8,      7,     12,      0,      0, }, /* 322 */
-  {     7,     17,     12,      0,      0, }, /* 323 */
-  {     7,      7,     12,      0,      0, }, /* 324 */
-  {     7,     21,     12,      0,      0, }, /* 325 */
-  {    40,     29,     12,      0,      0, }, /* 326 */
-  {    40,      7,     12,      0,      0, }, /* 327 */
-  {    40,     22,     12,      0,      0, }, /* 328 */
-  {    40,     18,     12,      0,      0, }, /* 329 */
-  {    45,      7,     12,      0,      0, }, /* 330 */
-  {    45,     14,     12,      0,      0, }, /* 331 */
-  {    50,      7,     12,      0,      0, }, /* 332 */
-  {    50,     12,      3,      0,      0, }, /* 333 */
-  {    24,      7,     12,      0,      0, }, /* 334 */
-  {    24,     12,      3,      0,      0, }, /* 335 */
-  {     6,      7,     12,      0,      0, }, /* 336 */
-  {     6,     12,      3,      0,      0, }, /* 337 */
-  {    51,      7,     12,      0,      0, }, /* 338 */
-  {    51,     12,      3,      0,      0, }, /* 339 */
-  {    31,      7,     12,      0,      0, }, /* 340 */
-  {    31,     12,      3,      0,      0, }, /* 341 */
-  {    31,     10,      5,      0,      0, }, /* 342 */
-  {    31,     21,     12,      0,      0, }, /* 343 */
-  {    31,      6,     12,      0,      0, }, /* 344 */
-  {    31,     23,     12,      0,      0, }, /* 345 */
-  {    31,     13,     12,      0,      0, }, /* 346 */
-  {    31,     15,     12,      0,      0, }, /* 347 */
-  {    37,     21,     12,      0,      0, }, /* 348 */
-  {    37,     17,     12,      0,      0, }, /* 349 */
-  {    37,     12,      3,      0,      0, }, /* 350 */
-  {    37,      1,      2,      0,      0, }, /* 351 */
-  {    37,     13,     12,      0,      0, }, /* 352 */
-  {    37,      7,     12,      0,      0, }, /* 353 */
-  {    37,      6,     12,      0,      0, }, /* 354 */
-  {    34,      7,     12,      0,      0, }, /* 355 */
-  {    34,     12,      3,      0,      0, }, /* 356 */
-  {    34,     10,      5,      0,      0, }, /* 357 */
-  {    34,     26,     12,      0,      0, }, /* 358 */
-  {    34,     21,     12,      0,      0, }, /* 359 */
-  {    34,     13,     12,      0,      0, }, /* 360 */
-  {    52,      7,     12,      0,      0, }, /* 361 */
-  {    39,      7,     12,      0,      0, }, /* 362 */
-  {    39,     10,     12,      0,      0, }, /* 363 */
-  {    39,     10,      5,      0,      0, }, /* 364 */
-  {    39,     13,     12,      0,      0, }, /* 365 */
-  {    39,     15,     12,      0,      0, }, /* 366 */
-  {    39,     26,     12,      0,      0, }, /* 367 */
-  {    31,     26,     12,      0,      0, }, /* 368 */
-  {     5,      7,     12,      0,      0, }, /* 369 */
-  {     5,     12,      3,      0,      0, }, /* 370 */
-  {     5,     10,      5,      0,      0, }, /* 371 */
-  {     5,     21,     12,      0,      0, }, /* 372 */
-  {    90,      7,     12,      0,      0, }, /* 373 */
-  {    90,     10,      5,      0,      0, }, /* 374 */
-  {    90,     12,      3,      0,      0, }, /* 375 */
-  {    90,     10,     12,      0,      0, }, /* 376 */
-  {    90,     13,     12,      0,      0, }, /* 377 */
-  {    90,     21,     12,      0,      0, }, /* 378 */
-  {    90,      6,     12,      0,      0, }, /* 379 */
-  {    27,     11,      3,      0,      0, }, /* 380 */
-  {    61,     12,      3,      0,      0, }, /* 381 */
-  {    61,     10,      5,      0,      0, }, /* 382 */
-  {    61,      7,     12,      0,      0, }, /* 383 */
-  {    61,     13,     12,      0,      0, }, /* 384 */
-  {    61,     21,     12,      0,      0, }, /* 385 */
-  {    61,     26,     12,      0,      0, }, /* 386 */
-  {    75,     12,      3,      0,      0, }, /* 387 */
-  {    75,     10,      5,      0,      0, }, /* 388 */
-  {    75,      7,     12,      0,      0, }, /* 389 */
-  {    75,     13,     12,      0,      0, }, /* 390 */
-  {    92,      7,     12,      0,      0, }, /* 391 */
-  {    92,     12,      3,      0,      0, }, /* 392 */
-  {    92,     10,      5,      0,      0, }, /* 393 */
-  {    92,     21,     12,      0,      0, }, /* 394 */
-  {    69,      7,     12,      0,      0, }, /* 395 */
-  {    69,     10,      5,      0,      0, }, /* 396 */
-  {    69,     12,      3,      0,      0, }, /* 397 */
-  {    69,     21,     12,      0,      0, }, /* 398 */
-  {    69,     13,     12,      0,      0, }, /* 399 */
-  {    72,     13,     12,      0,      0, }, /* 400 */
-  {    72,      7,     12,      0,      0, }, /* 401 */
-  {    72,      6,     12,      0,      0, }, /* 402 */
-  {    72,     21,     12,      0,      0, }, /* 403 */
-  {    75,     21,     12,      0,      0, }, /* 404 */
-  {     9,     10,      5,      0,      0, }, /* 405 */
-  {     9,      7,     12,      0,      0, }, /* 406 */
-  {    12,      5,     12,      0,      0, }, /* 407 */
-  {    12,      6,     12,      0,      0, }, /* 408 */
-  {    33,      5,     12,      0,  35332, }, /* 409 */
-  {    33,      5,     12,      0,   3814, }, /* 410 */
-  {    33,      9,     12,     63,      1, }, /* 411 */
-  {    33,      5,     12,     63,     -1, }, /* 412 */
-  {    33,      5,     12,     63,    -58, }, /* 413 */
-  {    33,      9,     12,      0,  -7615, }, /* 414 */
-  {    19,      5,     12,      0,      8, }, /* 415 */
-  {    19,      9,     12,      0,     -8, }, /* 416 */
-  {    19,      5,     12,      0,     74, }, /* 417 */
-  {    19,      5,     12,      0,     86, }, /* 418 */
-  {    19,      5,     12,      0,    100, }, /* 419 */
-  {    19,      5,     12,      0,    128, }, /* 420 */
-  {    19,      5,     12,      0,    112, }, /* 421 */
-  {    19,      5,     12,      0,    126, }, /* 422 */
-  {    19,      8,     12,      0,     -8, }, /* 423 */
-  {    19,      5,     12,      0,      9, }, /* 424 */
-  {    19,      9,     12,      0,    -74, }, /* 425 */
-  {    19,      8,     12,      0,     -9, }, /* 426 */
-  {    19,      5,     12,     21,  -7173, }, /* 427 */
-  {    19,      9,     12,      0,    -86, }, /* 428 */
-  {    19,      9,     12,      0,   -100, }, /* 429 */
-  {    19,      9,     12,      0,   -112, }, /* 430 */
-  {    19,      9,     12,      0,   -128, }, /* 431 */
-  {    19,      9,     12,      0,   -126, }, /* 432 */
-  {    27,      1,      3,      0,      0, }, /* 433 */
-  {     9,     27,      2,      0,      0, }, /* 434 */
-  {     9,     28,      2,      0,      0, }, /* 435 */
-  {     9,      2,      2,      0,      0, }, /* 436 */
-  {     9,      9,     12,      0,      0, }, /* 437 */
-  {     9,      5,     12,      0,      0, }, /* 438 */
-  {    19,      9,     12,     67,  -7517, }, /* 439 */
-  {    33,      9,     12,     71,  -8383, }, /* 440 */
-  {    33,      9,     12,     75,  -8262, }, /* 441 */
-  {    33,      9,     12,      0,     28, }, /* 442 */
-  {    33,      5,     12,      0,    -28, }, /* 443 */
-  {    33,     14,     12,      0,     16, }, /* 444 */
-  {    33,     14,     12,      0,    -16, }, /* 445 */
-  {    33,     14,     12,      0,      0, }, /* 446 */
-  {     9,     26,     12,      0,     26, }, /* 447 */
-  {     9,     26,     12,      0,    -26, }, /* 448 */
-  {     4,     26,     12,      0,      0, }, /* 449 */
-  {    17,      9,     12,      0,     48, }, /* 450 */
-  {    17,      5,     12,      0,    -48, }, /* 451 */
-  {    33,      9,     12,      0, -10743, }, /* 452 */
-  {    33,      9,     12,      0,  -3814, }, /* 453 */
-  {    33,      9,     12,      0, -10727, }, /* 454 */
-  {    33,      5,     12,      0, -10795, }, /* 455 */
-  {    33,      5,     12,      0, -10792, }, /* 456 */
-  {    33,      9,     12,      0, -10780, }, /* 457 */
-  {    33,      9,     12,      0, -10749, }, /* 458 */
-  {    33,      9,     12,      0, -10783, }, /* 459 */
-  {    33,      9,     12,      0, -10782, }, /* 460 */
-  {    33,      9,     12,      0, -10815, }, /* 461 */
-  {    10,      5,     12,      0,      0, }, /* 462 */
-  {    10,     26,     12,      0,      0, }, /* 463 */
-  {    10,     12,      3,      0,      0, }, /* 464 */
-  {    10,     21,     12,      0,      0, }, /* 465 */
-  {    10,     15,     12,      0,      0, }, /* 466 */
-  {    16,      5,     12,      0,  -7264, }, /* 467 */
-  {    58,      7,     12,      0,      0, }, /* 468 */
-  {    58,      6,     12,      0,      0, }, /* 469 */
-  {    58,     21,     12,      0,      0, }, /* 470 */
-  {    58,     12,      3,      0,      0, }, /* 471 */
-  {    22,     26,     12,      0,      0, }, /* 472 */
-  {    22,      6,     12,      0,      0, }, /* 473 */
-  {    22,     14,     12,      0,      0, }, /* 474 */
-  {    23,     10,      3,      0,      0, }, /* 475 */
-  {    26,      7,     12,      0,      0, }, /* 476 */
-  {    26,      6,     12,      0,      0, }, /* 477 */
-  {    29,      7,     12,      0,      0, }, /* 478 */
-  {    29,      6,     12,      0,      0, }, /* 479 */
-  {     3,      7,     12,      0,      0, }, /* 480 */
-  {    23,      7,     12,      0,      0, }, /* 481 */
-  {    23,     26,     12,      0,      0, }, /* 482 */
-  {    29,     26,     12,      0,      0, }, /* 483 */
-  {    22,      7,     12,      0,      0, }, /* 484 */
-  {    60,      7,     12,      0,      0, }, /* 485 */
-  {    60,      6,     12,      0,      0, }, /* 486 */
-  {    60,     26,     12,      0,      0, }, /* 487 */
-  {    85,      7,     12,      0,      0, }, /* 488 */
-  {    85,      6,     12,      0,      0, }, /* 489 */
-  {    85,     21,     12,      0,      0, }, /* 490 */
-  {    76,      7,     12,      0,      0, }, /* 491 */
-  {    76,      6,     12,      0,      0, }, /* 492 */
-  {    76,     21,     12,      0,      0, }, /* 493 */
-  {    76,     13,     12,      0,      0, }, /* 494 */
-  {    12,      7,     12,      0,      0, }, /* 495 */
-  {    12,     21,     12,      0,      0, }, /* 496 */
-  {    78,      7,     12,      0,      0, }, /* 497 */
-  {    78,     14,     12,      0,      0, }, /* 498 */
-  {    78,     12,      3,      0,      0, }, /* 499 */
-  {    78,     21,     12,      0,      0, }, /* 500 */
-  {    33,      9,     12,      0, -35332, }, /* 501 */
-  {    33,      9,     12,      0, -42280, }, /* 502 */
-  {    33,      9,     12,      0, -42308, }, /* 503 */
-  {    33,      9,     12,      0, -42319, }, /* 504 */
-  {    33,      9,     12,      0, -42315, }, /* 505 */
-  {    33,      9,     12,      0, -42305, }, /* 506 */
-  {    33,      9,     12,      0, -42258, }, /* 507 */
-  {    33,      9,     12,      0, -42282, }, /* 508 */
-  {    48,      7,     12,      0,      0, }, /* 509 */
-  {    48,     12,      3,      0,      0, }, /* 510 */
-  {    48,     10,      5,      0,      0, }, /* 511 */
-  {    48,     26,     12,      0,      0, }, /* 512 */
-  {    64,      7,     12,      0,      0, }, /* 513 */
-  {    64,     21,     12,      0,      0, }, /* 514 */
-  {    74,     10,      5,      0,      0, }, /* 515 */
-  {    74,      7,     12,      0,      0, }, /* 516 */
-  {    74,     12,      3,      0,      0, }, /* 517 */
-  {    74,     21,     12,      0,      0, }, /* 518 */
-  {    74,     13,     12,      0,      0, }, /* 519 */
-  {    68,     13,     12,      0,      0, }, /* 520 */
-  {    68,      7,     12,      0,      0, }, /* 521 */
-  {    68,     12,      3,      0,      0, }, /* 522 */
-  {    68,     21,     12,      0,      0, }, /* 523 */
-  {    73,      7,     12,      0,      0, }, /* 524 */
-  {    73,     12,      3,      0,      0, }, /* 525 */
-  {    73,     10,      5,      0,      0, }, /* 526 */
-  {    73,     21,     12,      0,      0, }, /* 527 */
-  {    83,     12,      3,      0,      0, }, /* 528 */
-  {    83,     10,      5,      0,      0, }, /* 529 */
-  {    83,      7,     12,      0,      0, }, /* 530 */
-  {    83,     21,     12,      0,      0, }, /* 531 */
-  {    83,     13,     12,      0,      0, }, /* 532 */
-  {    38,      6,     12,      0,      0, }, /* 533 */
-  {    67,      7,     12,      0,      0, }, /* 534 */
-  {    67,     12,      3,      0,      0, }, /* 535 */
-  {    67,     10,      5,      0,      0, }, /* 536 */
-  {    67,     13,     12,      0,      0, }, /* 537 */
-  {    67,     21,     12,      0,      0, }, /* 538 */
-  {    91,      7,     12,      0,      0, }, /* 539 */
-  {    91,     12,      3,      0,      0, }, /* 540 */
-  {    91,      6,     12,      0,      0, }, /* 541 */
-  {    91,     21,     12,      0,      0, }, /* 542 */
-  {    86,      7,     12,      0,      0, }, /* 543 */
-  {    86,     10,      5,      0,      0, }, /* 544 */
-  {    86,     12,      3,      0,      0, }, /* 545 */
-  {    86,     21,     12,      0,      0, }, /* 546 */
-  {    86,      6,     12,      0,      0, }, /* 547 */
-  {    86,     13,     12,      0,      0, }, /* 548 */
-  {    23,      7,      9,      0,      0, }, /* 549 */
-  {    23,      7,     10,      0,      0, }, /* 550 */
-  {     9,      4,      2,      0,      0, }, /* 551 */
-  {     9,      3,     12,      0,      0, }, /* 552 */
-  {    25,     25,     12,      0,      0, }, /* 553 */
-  {     0,     24,     12,      0,      0, }, /* 554 */
-  {     9,      6,      3,      0,      0, }, /* 555 */
-  {    35,      7,     12,      0,      0, }, /* 556 */
-  {    19,     14,     12,      0,      0, }, /* 557 */
-  {    19,     15,     12,      0,      0, }, /* 558 */
-  {    19,     26,     12,      0,      0, }, /* 559 */
-  {    70,      7,     12,      0,      0, }, /* 560 */
-  {    66,      7,     12,      0,      0, }, /* 561 */
-  {    41,      7,     12,      0,      0, }, /* 562 */
-  {    41,     15,     12,      0,      0, }, /* 563 */
-  {    18,      7,     12,      0,      0, }, /* 564 */
-  {    18,     14,     12,      0,      0, }, /* 565 */
-  {   117,      7,     12,      0,      0, }, /* 566 */
-  {   117,     12,      3,      0,      0, }, /* 567 */
-  {    59,      7,     12,      0,      0, }, /* 568 */
-  {    59,     21,     12,      0,      0, }, /* 569 */
-  {    42,      7,     12,      0,      0, }, /* 570 */
-  {    42,     21,     12,      0,      0, }, /* 571 */
-  {    42,     14,     12,      0,      0, }, /* 572 */
-  {    13,      9,     12,      0,     40, }, /* 573 */
-  {    13,      5,     12,      0,    -40, }, /* 574 */
-  {    46,      7,     12,      0,      0, }, /* 575 */
-  {    44,      7,     12,      0,      0, }, /* 576 */
-  {    44,     13,     12,      0,      0, }, /* 577 */
-  {   105,      7,     12,      0,      0, }, /* 578 */
-  {   103,      7,     12,      0,      0, }, /* 579 */
-  {   103,     21,     12,      0,      0, }, /* 580 */
-  {   109,      7,     12,      0,      0, }, /* 581 */
-  {    11,      7,     12,      0,      0, }, /* 582 */
-  {    80,      7,     12,      0,      0, }, /* 583 */
-  {    80,     21,     12,      0,      0, }, /* 584 */
-  {    80,     15,     12,      0,      0, }, /* 585 */
-  {   119,      7,     12,      0,      0, }, /* 586 */
-  {   119,     26,     12,      0,      0, }, /* 587 */
-  {   119,     15,     12,      0,      0, }, /* 588 */
-  {   115,      7,     12,      0,      0, }, /* 589 */
-  {   115,     15,     12,      0,      0, }, /* 590 */
-  {    65,      7,     12,      0,      0, }, /* 591 */
-  {    65,     15,     12,      0,      0, }, /* 592 */
-  {    65,     21,     12,      0,      0, }, /* 593 */
-  {    71,      7,     12,      0,      0, }, /* 594 */
-  {    71,     21,     12,      0,      0, }, /* 595 */
-  {    97,      7,     12,      0,      0, }, /* 596 */
-  {    96,      7,     12,      0,      0, }, /* 597 */
-  {    30,      7,     12,      0,      0, }, /* 598 */
-  {    30,     12,      3,      0,      0, }, /* 599 */
-  {    30,     15,     12,      0,      0, }, /* 600 */
-  {    30,     21,     12,      0,      0, }, /* 601 */
-  {    87,      7,     12,      0,      0, }, /* 602 */
-  {    87,     15,     12,      0,      0, }, /* 603 */
-  {    87,     21,     12,      0,      0, }, /* 604 */
-  {   116,      7,     12,      0,      0, }, /* 605 */
-  {   116,     15,     12,      0,      0, }, /* 606 */
-  {   111,      7,     12,      0,      0, }, /* 607 */
-  {   111,     26,     12,      0,      0, }, /* 608 */
-  {   111,     12,      3,      0,      0, }, /* 609 */
-  {   111,     15,     12,      0,      0, }, /* 610 */
-  {   111,     21,     12,      0,      0, }, /* 611 */
-  {    77,      7,     12,      0,      0, }, /* 612 */
-  {    77,     21,     12,      0,      0, }, /* 613 */
-  {    82,      7,     12,      0,      0, }, /* 614 */
-  {    82,     15,     12,      0,      0, }, /* 615 */
-  {    81,      7,     12,      0,      0, }, /* 616 */
-  {    81,     15,     12,      0,      0, }, /* 617 */
-  {   120,      7,     12,      0,      0, }, /* 618 */
-  {   120,     21,     12,      0,      0, }, /* 619 */
-  {   120,     15,     12,      0,      0, }, /* 620 */
-  {    88,      7,     12,      0,      0, }, /* 621 */
-  {     0,     15,     12,      0,      0, }, /* 622 */
-  {    93,     10,      5,      0,      0, }, /* 623 */
-  {    93,     12,      3,      0,      0, }, /* 624 */
-  {    93,      7,     12,      0,      0, }, /* 625 */
-  {    93,     21,     12,      0,      0, }, /* 626 */
-  {    93,     15,     12,      0,      0, }, /* 627 */
-  {    93,     13,     12,      0,      0, }, /* 628 */
-  {    84,     12,      3,      0,      0, }, /* 629 */
-  {    84,     10,      5,      0,      0, }, /* 630 */
-  {    84,      7,     12,      0,      0, }, /* 631 */
-  {    84,     21,     12,      0,      0, }, /* 632 */
-  {    84,      1,      2,      0,      0, }, /* 633 */
-  {   100,      7,     12,      0,      0, }, /* 634 */
-  {   100,     13,     12,      0,      0, }, /* 635 */
-  {    95,     12,      3,      0,      0, }, /* 636 */
-  {    95,      7,     12,      0,      0, }, /* 637 */
-  {    95,     10,      5,      0,      0, }, /* 638 */
-  {    95,     13,     12,      0,      0, }, /* 639 */
-  {    95,     21,     12,      0,      0, }, /* 640 */
-  {   110,      7,     12,      0,      0, }, /* 641 */
-  {   110,     12,      3,      0,      0, }, /* 642 */
-  {   110,     21,     12,      0,      0, }, /* 643 */
-  {    99,     12,      3,      0,      0, }, /* 644 */
-  {    99,     10,      5,      0,      0, }, /* 645 */
-  {    99,      7,     12,      0,      0, }, /* 646 */
-  {    99,     21,     12,      0,      0, }, /* 647 */
-  {    99,     13,     12,      0,      0, }, /* 648 */
-  {    47,     15,     12,      0,      0, }, /* 649 */
-  {   107,      7,     12,      0,      0, }, /* 650 */
-  {   107,     10,      5,      0,      0, }, /* 651 */
-  {   107,     12,      3,      0,      0, }, /* 652 */
-  {   107,     21,     12,      0,      0, }, /* 653 */
-  {   108,      7,     12,      0,      0, }, /* 654 */
-  {   108,     12,      3,      0,      0, }, /* 655 */
-  {   108,     10,      5,      0,      0, }, /* 656 */
-  {   108,     13,     12,      0,      0, }, /* 657 */
-  {   106,     12,      3,      0,      0, }, /* 658 */
-  {   106,     10,      5,      0,      0, }, /* 659 */
-  {   106,      7,     12,      0,      0, }, /* 660 */
-  {   106,     10,      3,      0,      0, }, /* 661 */
-  {   123,      7,     12,      0,      0, }, /* 662 */
-  {   123,     10,      3,      0,      0, }, /* 663 */
-  {   123,     10,      5,      0,      0, }, /* 664 */
-  {   123,     12,      3,      0,      0, }, /* 665 */
-  {   123,     21,     12,      0,      0, }, /* 666 */
-  {   123,     13,     12,      0,      0, }, /* 667 */
-  {   122,      7,     12,      0,      0, }, /* 668 */
-  {   122,     10,      3,      0,      0, }, /* 669 */
-  {   122,     10,      5,      0,      0, }, /* 670 */
-  {   122,     12,      3,      0,      0, }, /* 671 */
-  {   122,     21,     12,      0,      0, }, /* 672 */
-  {   113,      7,     12,      0,      0, }, /* 673 */
-  {   113,     10,      5,      0,      0, }, /* 674 */
-  {   113,     12,      3,      0,      0, }, /* 675 */
-  {   113,     21,     12,      0,      0, }, /* 676 */
-  {   113,     13,     12,      0,      0, }, /* 677 */
-  {   101,      7,     12,      0,      0, }, /* 678 */
-  {   101,     12,      3,      0,      0, }, /* 679 */
-  {   101,     10,      5,      0,      0, }, /* 680 */
-  {   101,     13,     12,      0,      0, }, /* 681 */
-  {   124,      9,     12,      0,     32, }, /* 682 */
-  {   124,      5,     12,      0,    -32, }, /* 683 */
-  {   124,     13,     12,      0,      0, }, /* 684 */
-  {   124,     15,     12,      0,      0, }, /* 685 */
-  {   124,      7,     12,      0,      0, }, /* 686 */
-  {   121,      7,     12,      0,      0, }, /* 687 */
-  {    62,      7,     12,      0,      0, }, /* 688 */
-  {    62,     14,     12,      0,      0, }, /* 689 */
-  {    62,     21,     12,      0,      0, }, /* 690 */
-  {    79,      7,     12,      0,      0, }, /* 691 */
-  {   114,      7,     12,      0,      0, }, /* 692 */
-  {   114,     13,     12,      0,      0, }, /* 693 */
-  {   114,     21,     12,      0,      0, }, /* 694 */
-  {   102,      7,     12,      0,      0, }, /* 695 */
-  {   102,     12,      3,      0,      0, }, /* 696 */
-  {   102,     21,     12,      0,      0, }, /* 697 */
-  {   118,      7,     12,      0,      0, }, /* 698 */
-  {   118,     12,      3,      0,      0, }, /* 699 */
-  {   118,     21,     12,      0,      0, }, /* 700 */
-  {   118,     26,     12,      0,      0, }, /* 701 */
-  {   118,      6,     12,      0,      0, }, /* 702 */
-  {   118,     13,     12,      0,      0, }, /* 703 */
-  {   118,     15,     12,      0,      0, }, /* 704 */
-  {    98,      7,     12,      0,      0, }, /* 705 */
-  {    98,     10,      5,      0,      0, }, /* 706 */
-  {    98,     12,      3,      0,      0, }, /* 707 */
-  {    98,      6,     12,      0,      0, }, /* 708 */
-  {   104,      7,     12,      0,      0, }, /* 709 */
-  {   104,     26,     12,      0,      0, }, /* 710 */
-  {   104,     12,      3,      0,      0, }, /* 711 */
-  {   104,     21,     12,      0,      0, }, /* 712 */
-  {     9,     10,      3,      0,      0, }, /* 713 */
-  {    19,     12,      3,      0,      0, }, /* 714 */
-  {   112,      7,     12,      0,      0, }, /* 715 */
-  {   112,     15,     12,      0,      0, }, /* 716 */
-  {   112,     12,      3,      0,      0, }, /* 717 */
-  {     9,     26,     11,      0,      0, }, /* 718 */
-  {    26,     26,     12,      0,      0, }, /* 719 */
-};
-
-const pcre_uint8 PRIV(ucd_stage1)[] = { /* 8704 bytes */
-  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, /* U+0000 */
- 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, /* U+0800 */
- 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 41, 41, 42, 43, 44, 45, /* U+1000 */
- 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, /* U+1800 */
- 62, 63, 64, 65, 66, 66, 67, 68, 69, 70, 71, 72, 73, 71, 74, 75, /* U+2000 */
- 76, 76, 66, 77, 66, 66, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, /* U+2800 */
- 88, 89, 90, 91, 92, 93, 94, 71, 95, 95, 95, 95, 95, 95, 95, 95, /* U+3000 */
- 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+3800 */
- 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+4000 */
- 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 96, 95, 95, 95, 95, /* U+4800 */
- 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+5000 */
- 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+5800 */
- 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+6000 */
- 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+6800 */
- 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+7000 */
- 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+7800 */
- 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+8000 */
- 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+8800 */
- 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+9000 */
- 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 97, /* U+9800 */
- 98, 99, 99, 99, 99, 99, 99, 99, 99,100,101,101,102,103,104,105, /* U+A000 */
-106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,114, /* U+A800 */
-115,116,117,118,119,120,114,115,116,117,118,119,120,114,115,116, /* U+B000 */
-117,118,119,120,114,115,116,117,118,119,120,114,115,116,117,118, /* U+B800 */
-119,120,114,115,116,117,118,119,120,114,115,116,117,118,119,120, /* U+C000 */
-114,115,116,117,118,119,120,114,115,116,117,118,119,120,114,115, /* U+C800 */
-116,117,118,119,120,114,115,116,117,118,119,120,114,115,116,121, /* U+D000 */
-122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122, /* U+D800 */
-123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+E000 */
-123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+E800 */
-123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+F000 */
-123,123, 95, 95,124,125,126,127,128,128,129,130,131,132,133,134, /* U+F800 */
-135,136,137,138,139,140,141,142,143,144,145,139,146,146,147,139, /* U+10000 */
-148,149,150,151,152,153,154,155,156,139,139,139,157,139,139,139, /* U+10800 */
-158,159,160,161,162,163,164,139,139,165,139,166,167,168,139,139, /* U+11000 */
-139,169,139,139,139,170,139,139,139,139,139,139,139,139,139,139, /* U+11800 */
-171,171,171,171,171,171,171,172,173,139,139,139,139,139,139,139, /* U+12000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+12800 */
-174,174,174,174,174,174,174,174,175,139,139,139,139,139,139,139, /* U+13000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+13800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+14000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+14800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+15000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+15800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+16000 */
-176,176,176,176,177,178,179,180,139,139,139,139,139,139,181,182, /* U+16800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+17000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+17800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+18000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+18800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+19000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+19800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+1A000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+1A800 */
-183,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+1B000 */
-139,139,139,139,139,139,139,139,184,185,139,139,139,139,139,139, /* U+1B800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+1C000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+1C800 */
- 71,186,187,188,189,139,190,139,191,192,193,194,195,196,197,198, /* U+1D000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+1D800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+1E000 */
-199,200,139,139,139,139,139,139,139,139,139,139,201,202,139,139, /* U+1E800 */
-203,204,205,206,207,139,208,209, 71,210,211,212,213,214,215,216, /* U+1F000 */
-217,218,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+1F800 */
- 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+20000 */
- 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+20800 */
- 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+21000 */
- 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+21800 */
- 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+22000 */
- 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+22800 */
- 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+23000 */
- 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+23800 */
- 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+24000 */
- 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+24800 */
- 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+25000 */
- 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+25800 */
- 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+26000 */
- 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+26800 */
- 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+27000 */
- 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+27800 */
- 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+28000 */
- 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+28800 */
- 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+29000 */
- 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+29800 */
- 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95,219, 95, 95, /* U+2A000 */
- 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+2A800 */
- 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95,220, 95, /* U+2B000 */
-221,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+2B800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+2C000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+2C800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+2D000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+2D800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+2E000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+2E800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+2F000 */
- 95, 95, 95, 95,221,139,139,139,139,139,139,139,139,139,139,139, /* U+2F800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+30000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+30800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+31000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+31800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+32000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+32800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+33000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+33800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+34000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+34800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+35000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+35800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+36000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+36800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+37000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+37800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+38000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+38800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+39000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+39800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+3A000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+3A800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+3B000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+3B800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+3C000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+3C800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+3D000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+3D800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+3E000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+3E800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+3F000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+3F800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+40000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+40800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+41000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+41800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+42000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+42800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+43000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+43800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+44000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+44800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+45000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+45800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+46000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+46800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+47000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+47800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+48000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+48800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+49000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+49800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+4A000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+4A800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+4B000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+4B800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+4C000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+4C800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+4D000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+4D800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+4E000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+4E800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+4F000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+4F800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+50000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+50800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+51000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+51800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+52000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+52800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+53000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+53800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+54000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+54800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+55000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+55800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+56000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+56800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+57000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+57800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+58000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+58800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+59000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+59800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+5A000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+5A800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+5B000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+5B800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+5C000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+5C800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+5D000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+5D800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+5E000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+5E800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+5F000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+5F800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+60000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+60800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+61000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+61800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+62000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+62800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+63000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+63800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+64000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+64800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+65000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+65800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+66000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+66800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+67000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+67800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+68000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+68800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+69000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+69800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+6A000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+6A800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+6B000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+6B800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+6C000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+6C800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+6D000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+6D800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+6E000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+6E800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+6F000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+6F800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+70000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+70800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+71000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+71800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+72000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+72800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+73000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+73800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+74000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+74800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+75000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+75800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+76000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+76800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+77000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+77800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+78000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+78800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+79000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+79800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+7A000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+7A800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+7B000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+7B800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+7C000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+7C800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+7D000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+7D800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+7E000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+7E800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+7F000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+7F800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+80000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+80800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+81000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+81800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+82000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+82800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+83000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+83800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+84000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+84800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+85000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+85800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+86000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+86800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+87000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+87800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+88000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+88800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+89000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+89800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+8A000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+8A800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+8B000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+8B800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+8C000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+8C800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+8D000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+8D800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+8E000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+8E800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+8F000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+8F800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+90000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+90800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+91000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+91800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+92000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+92800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+93000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+93800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+94000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+94800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+95000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+95800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+96000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+96800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+97000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+97800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+98000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+98800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+99000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+99800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+9A000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+9A800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+9B000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+9B800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+9C000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+9C800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+9D000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+9D800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+9E000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+9E800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+9F000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+9F800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+A0000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+A0800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+A1000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+A1800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+A2000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+A2800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+A3000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+A3800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+A4000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+A4800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+A5000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+A5800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+A6000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+A6800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+A7000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+A7800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+A8000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+A8800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+A9000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+A9800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+AA000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+AA800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+AB000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+AB800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+AC000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+AC800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+AD000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+AD800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+AE000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+AE800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+AF000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+AF800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+B0000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+B0800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+B1000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+B1800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+B2000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+B2800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+B3000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+B3800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+B4000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+B4800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+B5000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+B5800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+B6000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+B6800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+B7000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+B7800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+B8000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+B8800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+B9000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+B9800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+BA000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+BA800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+BB000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+BB800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+BC000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+BC800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+BD000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+BD800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+BE000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+BE800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+BF000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+BF800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+C0000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+C0800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+C1000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+C1800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+C2000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+C2800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+C3000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+C3800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+C4000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+C4800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+C5000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+C5800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+C6000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+C6800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+C7000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+C7800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+C8000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+C8800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+C9000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+C9800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+CA000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+CA800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+CB000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+CB800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+CC000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+CC800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+CD000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+CD800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+CE000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+CE800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+CF000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+CF800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+D0000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+D0800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+D1000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+D1800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+D2000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+D2800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+D3000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+D3800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+D4000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+D4800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+D5000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+D5800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+D6000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+D6800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+D7000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+D7800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+D8000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+D8800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+D9000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+D9800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+DA000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+DA800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+DB000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+DB800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+DC000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+DC800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+DD000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+DD800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+DE000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+DE800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+DF000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+DF800 */
-222,223,224,225,223,223,223,223,223,223,223,223,223,223,223,223, /* U+E0000 */
-223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223, /* U+E0800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+E1000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+E1800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+E2000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+E2800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+E3000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+E3800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+E4000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+E4800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+E5000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+E5800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+E6000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+E6800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+E7000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+E7800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+E8000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+E8800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+E9000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+E9800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+EA000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+EA800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+EB000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+EB800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+EC000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+EC800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+ED000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+ED800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+EE000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+EE800 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+EF000 */
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+EF800 */
-123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+F0000 */
-123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+F0800 */
-123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+F1000 */
-123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+F1800 */
-123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+F2000 */
-123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+F2800 */
-123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+F3000 */
-123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+F3800 */
-123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+F4000 */
-123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+F4800 */
-123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+F5000 */
-123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+F5800 */
-123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+F6000 */
-123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+F6800 */
-123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+F7000 */
-123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+F7800 */
-123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+F8000 */
-123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+F8800 */
-123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+F9000 */
-123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+F9800 */
-123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+FA000 */
-123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+FA800 */
-123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+FB000 */
-123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+FB800 */
-123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+FC000 */
-123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+FC800 */
-123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+FD000 */
-123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+FD800 */
-123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+FE000 */
-123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+FE800 */
-123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+FF000 */
-123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,226, /* U+FF800 */
-123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+100000 */
-123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+100800 */
-123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+101000 */
-123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+101800 */
-123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+102000 */
-123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+102800 */
-123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+103000 */
-123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+103800 */
-123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+104000 */
-123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+104800 */
-123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+105000 */
-123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+105800 */
-123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+106000 */
-123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+106800 */
-123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+107000 */
-123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+107800 */
-123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+108000 */
-123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+108800 */
-123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+109000 */
-123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+109800 */
-123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+10A000 */
-123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+10A800 */
-123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+10B000 */
-123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+10B800 */
-123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+10C000 */
-123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+10C800 */
-123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+10D000 */
-123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+10D800 */
-123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+10E000 */
-123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+10E800 */
-123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+10F000 */
-123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,226, /* U+10F800 */
-};
-
-const pcre_uint16 PRIV(ucd_stage2)[] = { /* 58112 bytes, block = 128 */
-/* block 0 */
-  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  2,  0,  0,
-  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-  3,  4,  4,  4,  5,  4,  4,  4,  6,  7,  4,  8,  4,  9,  4,  4,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  4,  4,  8,  8,  8,  4,
-  4, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 11, 11, 11, 11,
- 11, 11, 11, 13, 11, 11, 11, 11, 11, 11, 11,  6,  4,  7, 14, 15,
- 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 17, 16, 16, 16, 16,
- 16, 16, 16, 18, 16, 16, 16, 16, 16, 16, 16,  6,  8,  7,  8,  0,
-
-/* block 1 */
-  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-  3,  4,  5,  5,  5,  5, 19,  4, 14, 19, 20, 21,  8, 22, 19, 14,
- 19,  8, 23, 23, 14, 24,  4,  4, 14, 23, 20, 25, 23, 23, 23,  4,
- 11, 11, 11, 11, 11, 26, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
- 11, 11, 11, 11, 11, 11, 11,  8, 11, 11, 11, 11, 11, 11, 11, 27,
- 16, 16, 16, 16, 16, 28, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16,  8, 16, 16, 16, 16, 16, 16, 16, 29,
-
-/* block 2 */
- 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,
- 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,
- 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,
- 32, 33, 30, 31, 30, 31, 30, 31, 33, 30, 31, 30, 31, 30, 31, 30,
- 31, 30, 31, 30, 31, 30, 31, 30, 31, 33, 30, 31, 30, 31, 30, 31,
- 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,
- 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,
- 30, 31, 30, 31, 30, 31, 30, 31, 34, 30, 31, 30, 31, 30, 31, 35,
-
-/* block 3 */
- 36, 37, 30, 31, 30, 31, 38, 30, 31, 39, 39, 30, 31, 33, 40, 41,
- 42, 30, 31, 39, 43, 44, 45, 46, 30, 31, 47, 33, 45, 48, 49, 50,
- 30, 31, 30, 31, 30, 31, 51, 30, 31, 51, 33, 33, 30, 31, 51, 30,
- 31, 52, 52, 30, 31, 30, 31, 53, 30, 31, 33, 20, 30, 31, 33, 54,
- 20, 20, 20, 20, 55, 56, 57, 58, 59, 60, 61, 62, 63, 30, 31, 30,
- 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 64, 30, 31,
- 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,
- 33, 65, 66, 67, 30, 31, 68, 69, 30, 31, 30, 31, 30, 31, 30, 31,
-
-/* block 4 */
- 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,
- 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,
- 70, 33, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,
- 30, 31, 30, 31, 33, 33, 33, 33, 33, 33, 71, 30, 31, 72, 73, 74,
- 74, 30, 31, 75, 76, 77, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,
- 78, 79, 80, 81, 82, 33, 83, 83, 33, 84, 33, 85, 86, 33, 33, 33,
- 83, 87, 33, 88, 33, 89, 90, 33, 91, 92, 33, 93, 94, 33, 33, 92,
- 33, 95, 96, 33, 33, 97, 33, 33, 33, 33, 33, 33, 33, 98, 33, 33,
-
-/* block 5 */
- 99, 33, 33, 99, 33, 33, 33,100, 99,101,102,102,103, 33, 33, 33,
- 33, 33,104, 33, 20, 33, 33, 33, 33, 33, 33, 33, 33, 33,105, 33,
- 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
-106,106,106,106,106,106,106,106,106,107,107,107,107,107,107,107,
-107,107, 14, 14, 14, 14,107,107,107,107,107,107,107,107,107,107,
-107,107, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-106,106,106,106,106, 14, 14, 14, 14, 14,108,108,107, 14,107, 14,
- 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-
-/* block 6 */
-109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,
-109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,
-109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,
-109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,
-109,109,109,109,109,110,109,109,109,109,109,109,109,109,109,109,
-109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,
-109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,
-111,112,111,112,107,113,111,112,114,114,115,116,116,116,  4,117,
-
-/* block 7 */
-114,114,114,114,113, 14,118,  4,119,119,119,114,120,114,121,121,
-122,123,124,123,123,125,123,123,126,127,128,123,129,123,123,123,
-130,131,114,132,123,123,133,123,123,134,123,123,135,136,136,136,
-122,137,138,137,137,139,137,137,140,141,142,137,143,137,137,137,
-144,145,146,147,137,137,148,137,137,149,137,137,150,151,151,152,
-153,154,155,155,155,156,157,158,111,112,111,112,111,112,111,112,
-111,112,159,160,159,160,159,160,159,160,159,160,159,160,159,160,
-161,162,163,164,165,166,167,111,112,168,111,112,122,169,169,169,
-
-/* block 8 */
-170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,
-171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,
-171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,
-172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,
-172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,
-173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
-174,175,174,175,174,175,174,175,174,175,174,175,174,175,174,175,
-174,175,174,175,174,175,174,175,174,175,174,175,174,175,174,175,
-
-/* block 9 */
-174,175,176,177,177,109,109,177,178,178,174,175,174,175,174,175,
-174,175,174,175,174,175,174,175,174,175,174,175,174,175,174,175,
-174,175,174,175,174,175,174,175,174,175,174,175,174,175,174,175,
-174,175,174,175,174,175,174,175,174,175,174,175,174,175,174,175,
-179,174,175,174,175,174,175,174,175,174,175,174,175,174,175,180,
-174,175,174,175,174,175,174,175,174,175,174,175,174,175,174,175,
-174,175,174,175,174,175,174,175,174,175,174,175,174,175,174,175,
-174,175,174,175,174,175,174,175,174,175,174,175,174,175,174,175,
-
-/* block 10 */
-174,175,174,175,174,175,174,175,174,175,174,175,174,175,174,175,
-174,175,174,175,174,175,174,175,174,175,174,175,174,175,174,175,
-174,175,174,175,174,175,174,175,174,175,174,175,174,175,174,175,
-114,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
-181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
-181,181,181,181,181,181,181,114,114,182,183,183,183,183,183,183,
-114,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,
-184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,
-
-/* block 11 */
-184,184,184,184,184,184,184,185,114,  4,186,114,114,187,187,188,
-114,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,
-189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,
-189,189,189,189,189,189,189,189,189,189,189,189,189,189,190,189,
-191,189,189,191,189,189,191,189,114,114,114,114,114,114,114,114,
-192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,
-192,192,192,192,192,192,192,192,192,192,192,114,114,114,114,114,
-192,192,192,191,191,114,114,114,114,114,114,114,114,114,114,114,
-
-/* block 12 */
-193,193,193,193,193, 22,194,194,194,195,195,196,  4,195,197,197,
-198,198,198,198,198,198,198,198,198,198,198,  4, 22,114,195,  4,
-199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,
-199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,
-107,199,199,199,199,199,199,199,199,199,199,109,109,109,109,109,
-109,109,109,109,109,109,198,198,198,198,198,198,198,198,198,198,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,195,195,195,195,199,199,
-109,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,
-
-/* block 13 */
-199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,
-199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,
-199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,
-199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,
-199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,
-199,199,199,199,195,199,198,198,198,198,198,198,198, 22,197,198,
-198,198,198,198,198,200,200,198,198,197,198,198,198,198,199,199,
-201,201,201,201,201,201,201,201,201,201,199,199,199,197,197,199,
-
-/* block 14 */
-202,202,202,202,202,202,202,202,202,202,202,202,202,202,114,203,
-204,205,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
-204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,
-205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,
-205,205,205,205,205,205,205,205,205,205,205,114,114,204,204,204,
-199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,
-199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,
-199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,
-
-/* block 15 */
-206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,
-206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,
-206,206,206,206,206,206,207,207,207,207,207,207,207,207,207,207,
-207,206,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-208,208,208,208,208,208,208,208,208,208,209,209,209,209,209,209,
-209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,
-209,209,209,209,209,209,209,209,209,209,209,210,210,210,210,210,
-210,210,210,210,211,211,212,213,213,213,211,114,114,114,114,114,
-
-/* block 16 */
-214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,
-214,214,214,214,214,214,215,215,215,215,216,215,215,215,215,215,
-215,215,215,215,216,215,215,215,216,215,215,215,215,215,114,114,
-217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,114,
-218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,
-218,218,218,218,218,218,218,218,218,219,219,219,114,114,220,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-
-/* block 17 */
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,
-199,199,199,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,198,198,198,198,198,198,198,198,198,198,198,198,
-198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,
-
-/* block 18 */
-221,221,221,222,223,223,223,223,223,223,223,223,223,223,223,223,
-223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,
-223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,
-223,223,223,223,223,223,223,223,223,223,221,222,221,223,222,222,
-222,221,221,221,221,221,221,221,221,222,222,222,222,221,222,222,
-223,109,109,221,221,221,221,221,223,223,223,223,223,223,223,223,
-223,223,221,221,  4,  4,224,224,224,224,224,224,224,224,224,224,
-225,226,223,223,223,223,223,223,223,223,223,223,223,223,223,223,
-
-/* block 19 */
-227,228,229,229,114,227,227,227,227,227,227,227,227,114,114,227,
-227,114,114,227,227,227,227,227,227,227,227,227,227,227,227,227,
-227,227,227,227,227,227,227,227,227,114,227,227,227,227,227,227,
-227,114,227,114,114,114,227,227,227,227,114,114,228,227,230,229,
-229,228,228,228,228,114,114,229,229,114,114,229,229,228,227,114,
-114,114,114,114,114,114,114,230,114,114,114,114,227,227,114,227,
-227,227,228,228,114,114,231,231,231,231,231,231,231,231,231,231,
-227,227,232,232,233,233,233,233,233,233,234,232,114,114,114,114,
-
-/* block 20 */
-114,235,235,236,114,237,237,237,237,237,237,114,114,114,114,237,
-237,114,114,237,237,237,237,237,237,237,237,237,237,237,237,237,
-237,237,237,237,237,237,237,237,237,114,237,237,237,237,237,237,
-237,114,237,237,114,237,237,114,237,237,114,114,235,114,236,236,
-236,235,235,114,114,114,114,235,235,114,114,235,235,235,114,114,
-114,235,114,114,114,114,114,114,114,237,237,237,237,114,237,114,
-114,114,114,114,114,114,238,238,238,238,238,238,238,238,238,238,
-235,235,237,237,237,235,114,114,114,114,114,114,114,114,114,114,
-
-/* block 21 */
-114,239,239,240,114,241,241,241,241,241,241,241,241,241,114,241,
-241,241,114,241,241,241,241,241,241,241,241,241,241,241,241,241,
-241,241,241,241,241,241,241,241,241,114,241,241,241,241,241,241,
-241,114,241,241,114,241,241,241,241,241,114,114,239,241,240,240,
-240,239,239,239,239,239,114,239,239,240,114,240,240,239,114,114,
-241,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-241,241,239,239,114,114,242,242,242,242,242,242,242,242,242,242,
-243,244,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-
-/* block 22 */
-114,245,246,246,114,247,247,247,247,247,247,247,247,114,114,247,
-247,114,114,247,247,247,247,247,247,247,247,247,247,247,247,247,
-247,247,247,247,247,247,247,247,247,114,247,247,247,247,247,247,
-247,114,247,247,114,247,247,247,247,247,114,114,245,247,248,245,
-246,245,245,245,245,114,114,246,246,114,114,246,246,245,114,114,
-114,114,114,114,114,114,245,248,114,114,114,114,247,247,114,247,
-247,247,245,245,114,114,249,249,249,249,249,249,249,249,249,249,
-250,247,251,251,251,251,251,251,114,114,114,114,114,114,114,114,
-
-/* block 23 */
-114,114,252,253,114,253,253,253,253,253,253,114,114,114,253,253,
-253,114,253,253,253,253,114,114,114,253,253,114,253,114,253,253,
-114,114,114,253,253,114,114,114,253,253,253,114,114,114,253,253,
-253,253,253,253,253,253,253,253,253,253,114,114,114,114,254,255,
-252,255,255,114,114,114,255,255,255,114,255,255,255,252,114,114,
-253,114,114,114,114,114,114,254,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,256,256,256,256,256,256,256,256,256,256,
-257,257,257,258,258,258,258,258,258,259,258,114,114,114,114,114,
-
-/* block 24 */
-260,261,261,261,114,262,262,262,262,262,262,262,262,114,262,262,
-262,114,262,262,262,262,262,262,262,262,262,262,262,262,262,262,
-262,262,262,262,262,262,262,262,262,114,262,262,262,262,262,262,
-262,262,262,262,262,262,262,262,262,262,114,114,114,262,260,260,
-260,261,261,261,261,114,260,260,260,114,260,260,260,260,114,114,
-114,114,114,114,114,260,260,114,262,262,114,114,114,114,114,114,
-262,262,260,260,114,114,263,263,263,263,263,263,263,263,263,263,
-114,114,114,114,114,114,114,114,264,264,264,264,264,264,264,265,
-
-/* block 25 */
-114,266,267,267,114,268,268,268,268,268,268,268,268,114,268,268,
-268,114,268,268,268,268,268,268,268,268,268,268,268,268,268,268,
-268,268,268,268,268,268,268,268,268,114,268,268,268,268,268,268,
-268,268,268,268,114,268,268,268,268,268,114,114,266,268,267,266,
-267,267,269,267,267,114,266,267,267,114,267,267,266,266,114,114,
-114,114,114,114,114,269,269,114,114,114,114,114,114,114,268,114,
-268,268,266,266,114,114,270,270,270,270,270,270,270,270,270,270,
-114,268,268,114,114,114,114,114,114,114,114,114,114,114,114,114,
-
-/* block 26 */
-114,271,272,272,114,273,273,273,273,273,273,273,273,114,273,273,
-273,114,273,273,273,273,273,273,273,273,273,273,273,273,273,273,
-273,273,273,273,273,273,273,273,273,273,273,273,273,273,273,273,
-273,273,273,273,273,273,273,273,273,273,273,114,114,273,274,272,
-272,271,271,271,271,114,272,272,272,114,272,272,272,271,273,114,
-114,114,114,114,114,114,114,274,114,114,114,114,114,114,114,114,
-273,273,271,271,114,114,275,275,275,275,275,275,275,275,275,275,
-276,276,276,276,276,276,114,114,114,277,273,273,273,273,273,273,
-
-/* block 27 */
-114,114,278,278,114,279,279,279,279,279,279,279,279,279,279,279,
-279,279,279,279,279,279,279,114,114,114,279,279,279,279,279,279,
-279,279,279,279,279,279,279,279,279,279,279,279,279,279,279,279,
-279,279,114,279,279,279,279,279,279,279,279,279,114,279,114,114,
-279,279,279,279,279,279,279,114,114,114,280,114,114,114,114,281,
-278,278,280,280,280,114,280,114,278,278,278,278,278,278,278,281,
-114,114,114,114,114,114,282,282,282,282,282,282,282,282,282,282,
-114,114,278,278,283,114,114,114,114,114,114,114,114,114,114,114,
-
-/* block 28 */
-114,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,
-284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,
-284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,
-284,285,284,286,285,285,285,285,285,285,285,114,114,114,114,  5,
-284,284,284,284,284,284,287,285,285,285,285,285,285,285,285,288,
-289,289,289,289,289,289,289,289,289,289,288,288,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-
-/* block 29 */
-114,290,290,114,290,114,114,290,290,114,290,114,114,290,114,114,
-114,114,114,114,290,290,290,290,114,290,290,290,290,290,290,290,
-114,290,290,290,114,290,114,290,114,114,290,290,114,290,290,290,
-290,291,290,292,291,291,291,291,291,291,114,291,291,290,114,114,
-290,290,290,290,290,114,293,114,291,291,291,291,291,291,114,114,
-294,294,294,294,294,294,294,294,294,294,114,114,290,290,290,290,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-
-/* block 30 */
-295,296,296,296,297,297,297,297,297,297,297,297,297,297,297,297,
-297,297,297,296,297,296,296,296,298,298,296,296,296,296,296,296,
-299,299,299,299,299,299,299,299,299,299,300,300,300,300,300,300,
-300,300,300,300,296,298,296,298,296,298,301,302,301,302,303,303,
-295,295,295,295,295,295,295,295,114,295,295,295,295,295,295,295,
-295,295,295,295,295,295,295,295,295,295,295,295,295,295,295,295,
-295,295,295,295,295,295,295,295,295,295,295,295,295,114,114,114,
-114,298,298,298,298,298,298,298,298,298,298,298,298,298,298,303,
-
-/* block 31 */
-298,298,298,298,298,297,298,298,295,295,295,295,295,298,298,298,
-298,298,298,298,298,298,298,298,114,298,298,298,298,298,298,298,
-298,298,298,298,298,298,298,298,298,298,298,298,298,298,298,298,
-298,298,298,298,298,298,298,298,298,298,298,298,298,114,296,296,
-296,296,296,296,296,296,298,296,296,296,296,296,296,114,296,296,
-297,297,297,297,297, 19, 19, 19, 19,297,297,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-
-/* block 32 */
-304,304,304,304,304,304,304,304,304,304,304,304,304,304,304,304,
-304,304,304,304,304,304,304,304,304,304,304,304,304,304,304,304,
-304,304,304,304,304,304,304,304,304,304,304,305,305,306,306,306,
-306,307,306,306,306,306,306,306,305,306,306,307,307,306,306,304,
-308,308,308,308,308,308,308,308,308,308,309,309,309,309,309,309,
-304,304,304,304,304,304,307,307,306,306,304,304,304,304,306,306,
-306,304,305,305,305,304,304,305,305,305,305,305,305,305,304,304,
-304,306,306,306,306,304,304,304,304,304,304,304,304,304,304,304,
-
-/* block 33 */
-304,304,306,305,307,306,306,305,305,305,305,305,305,306,304,305,
-308,308,308,308,308,308,308,308,308,308,305,305,305,306,310,310,
-311,311,311,311,311,311,311,311,311,311,311,311,311,311,311,311,
-311,311,311,311,311,311,311,311,311,311,311,311,311,311,311,311,
-311,311,311,311,311,311,114,311,114,114,114,114,114,311,114,114,
-312,312,312,312,312,312,312,312,312,312,312,312,312,312,312,312,
-312,312,312,312,312,312,312,312,312,312,312,312,312,312,312,312,
-312,312,312,312,312,312,312,312,312,312,312,  4,313,312,312,312,
-
-/* block 34 */
-314,314,314,314,314,314,314,314,314,314,314,314,314,314,314,314,
-314,314,314,314,314,314,314,314,314,314,314,314,314,314,314,314,
-314,314,314,314,314,314,314,314,314,314,314,314,314,314,314,314,
-314,314,314,314,314,314,314,314,314,314,314,314,314,314,314,314,
-314,314,314,314,314,314,314,314,314,314,314,314,314,314,314,314,
-314,314,314,314,314,314,314,314,314,314,314,314,314,314,314,314,
-315,315,315,315,315,315,315,315,315,315,315,315,315,315,315,315,
-315,315,315,315,315,315,315,315,315,315,315,315,315,315,315,315,
-
-/* block 35 */
-315,315,315,315,315,315,315,315,315,315,315,315,315,315,315,315,
-315,315,315,315,315,315,315,315,315,315,315,315,315,315,315,315,
-315,315,315,315,315,315,315,315,316,316,316,316,316,316,316,316,
-316,316,316,316,316,316,316,316,316,316,316,316,316,316,316,316,
-316,316,316,316,316,316,316,316,316,316,316,316,316,316,316,316,
-316,316,316,316,316,316,316,316,316,316,316,316,316,316,316,316,
-316,316,316,316,316,316,316,316,316,316,316,316,316,316,316,316,
-316,316,316,316,316,316,316,316,316,316,316,316,316,316,316,316,
-
-/* block 36 */
-317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,
-317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,
-317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,
-317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,
-317,317,317,317,317,317,317,317,317,114,317,317,317,317,114,114,
-317,317,317,317,317,317,317,114,317,114,317,317,317,317,114,114,
-317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,
-317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,
-
-/* block 37 */
-317,317,317,317,317,317,317,317,317,114,317,317,317,317,114,114,
-317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,
-317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,
-317,114,317,317,317,317,114,114,317,317,317,317,317,317,317,114,
-317,114,317,317,317,317,114,114,317,317,317,317,317,317,317,317,
-317,317,317,317,317,317,317,114,317,317,317,317,317,317,317,317,
-317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,
-317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,
-
-/* block 38 */
-317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,
-317,114,317,317,317,317,114,114,317,317,317,317,317,317,317,317,
-317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,
-317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,
-317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,
-317,317,317,317,317,317,317,317,317,317,317,114,114,318,318,318,
-319,319,319,319,319,319,319,319,319,320,320,320,320,320,320,320,
-320,320,320,320,320,320,320,320,320,320,320,320,320,114,114,114,
-
-/* block 39 */
-317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,
-321,321,321,321,321,321,321,321,321,321,114,114,114,114,114,114,
-322,322,322,322,322,322,322,322,322,322,322,322,322,322,322,322,
-322,322,322,322,322,322,322,322,322,322,322,322,322,322,322,322,
-322,322,322,322,322,322,322,322,322,322,322,322,322,322,322,322,
-322,322,322,322,322,322,322,322,322,322,322,322,322,322,322,322,
-322,322,322,322,322,322,322,322,322,322,322,322,322,322,322,322,
-322,322,322,322,322,114,114,114,114,114,114,114,114,114,114,114,
-
-/* block 40 */
-323,324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,
-324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,
-324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,
-324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,
-324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,
-324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,
-324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,
-324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,
-
-/* block 41 */
-324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,
-324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,
-324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,
-324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,
-324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,
-324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,
-324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,
-324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,
-
-/* block 42 */
-324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,
-324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,
-324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,
-324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,
-324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,
-324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,
-324,324,324,324,324,324,324,324,324,324,324,324,324,325,325,324,
-324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,
-
-/* block 43 */
-326,327,327,327,327,327,327,327,327,327,327,327,327,327,327,327,
-327,327,327,327,327,327,327,327,327,327,327,328,329,114,114,114,
-330,330,330,330,330,330,330,330,330,330,330,330,330,330,330,330,
-330,330,330,330,330,330,330,330,330,330,330,330,330,330,330,330,
-330,330,330,330,330,330,330,330,330,330,330,330,330,330,330,330,
-330,330,330,330,330,330,330,330,330,330,330,330,330,330,330,330,
-330,330,330,330,330,330,330,330,330,330,330,  4,  4,  4,331,331,
-331,330,330,330,330,330,330,330,330,114,114,114,114,114,114,114,
-
-/* block 44 */
-332,332,332,332,332,332,332,332,332,332,332,332,332,114,332,332,
-332,332,333,333,333,114,114,114,114,114,114,114,114,114,114,114,
-334,334,334,334,334,334,334,334,334,334,334,334,334,334,334,334,
-334,334,335,335,335,  4,  4,114,114,114,114,114,114,114,114,114,
-336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,
-336,336,337,337,114,114,114,114,114,114,114,114,114,114,114,114,
-338,338,338,338,338,338,338,338,338,338,338,338,338,114,338,338,
-338,114,339,339,114,114,114,114,114,114,114,114,114,114,114,114,
-
-/* block 45 */
-340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,
-340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,
-340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,
-340,340,340,340,341,341,342,341,341,341,341,341,341,341,342,342,
-342,342,342,342,342,342,341,342,342,341,341,341,341,341,341,341,
-341,341,341,341,343,343,343,344,343,343,343,345,340,341,114,114,
-346,346,346,346,346,346,346,346,346,346,114,114,114,114,114,114,
-347,347,347,347,347,347,347,347,347,347,114,114,114,114,114,114,
-
-/* block 46 */
-348,348,  4,  4,348,  4,349,348,348,348,348,350,350,350,351,114,
-352,352,352,352,352,352,352,352,352,352,114,114,114,114,114,114,
-353,353,353,353,353,353,353,353,353,353,353,353,353,353,353,353,
-353,353,353,353,353,353,353,353,353,353,353,353,353,353,353,353,
-353,353,353,354,353,353,353,353,353,353,353,353,353,353,353,353,
-353,353,353,353,353,353,353,353,353,353,353,353,353,353,353,353,
-353,353,353,353,353,353,353,353,353,353,353,353,353,353,353,353,
-353,353,353,353,353,353,353,353,114,114,114,114,114,114,114,114,
-
-/* block 47 */
-353,353,353,353,353,353,353,353,353,353,353,353,353,353,353,353,
-353,353,353,353,353,353,353,353,353,353,353,353,353,353,353,353,
-353,353,353,353,353,353,353,353,353,350,353,114,114,114,114,114,
-324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,
-324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,
-324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,
-324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,
-324,324,324,324,324,324,114,114,114,114,114,114,114,114,114,114,
-
-/* block 48 */
-355,355,355,355,355,355,355,355,355,355,355,355,355,355,355,355,
-355,355,355,355,355,355,355,355,355,355,355,355,355,355,355,114,
-356,356,356,357,357,357,357,356,356,357,357,357,114,114,114,114,
-357,357,356,357,357,357,357,357,357,356,356,356,114,114,114,114,
-358,114,114,114,359,359,360,360,360,360,360,360,360,360,360,360,
-361,361,361,361,361,361,361,361,361,361,361,361,361,361,361,361,
-361,361,361,361,361,361,361,361,361,361,361,361,361,361,114,114,
-361,361,361,361,361,114,114,114,114,114,114,114,114,114,114,114,
-
-/* block 49 */
-362,362,362,362,362,362,362,362,362,362,362,362,362,362,362,362,
-362,362,362,362,362,362,362,362,362,362,362,362,362,362,362,362,
-362,362,362,362,362,362,362,362,362,362,362,362,114,114,114,114,
-363,363,363,363,363,364,364,364,363,363,364,363,363,363,363,363,
-363,362,362,362,362,362,362,362,363,363,114,114,114,114,114,114,
-365,365,365,365,365,365,365,365,365,365,366,114,114,114,367,367,
-368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,
-368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,
-
-/* block 50 */
-369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,
-369,369,369,369,369,369,369,370,370,371,371,370,114,114,372,372,
-373,373,373,373,373,373,373,373,373,373,373,373,373,373,373,373,
-373,373,373,373,373,373,373,373,373,373,373,373,373,373,373,373,
-373,373,373,373,373,373,373,373,373,373,373,373,373,373,373,373,
-373,373,373,373,373,374,375,374,375,375,375,375,375,375,375,114,
-375,376,375,376,376,375,375,375,375,375,375,375,375,374,374,374,
-374,374,374,375,375,375,375,375,375,375,375,375,375,114,114,375,
-
-/* block 51 */
-377,377,377,377,377,377,377,377,377,377,114,114,114,114,114,114,
-377,377,377,377,377,377,377,377,377,377,114,114,114,114,114,114,
-378,378,378,378,378,378,378,379,378,378,378,378,378,378,114,114,
-109,109,109,109,109,109,109,109,109,109,109,109,109,109,380,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-
-/* block 52 */
-381,381,381,381,382,383,383,383,383,383,383,383,383,383,383,383,
-383,383,383,383,383,383,383,383,383,383,383,383,383,383,383,383,
-383,383,383,383,383,383,383,383,383,383,383,383,383,383,383,383,
-383,383,383,383,381,382,381,381,381,381,381,382,381,382,382,382,
-382,382,381,382,382,383,383,383,383,383,383,383,114,114,114,114,
-384,384,384,384,384,384,384,384,384,384,385,385,385,385,385,385,
-385,386,386,386,386,386,386,386,386,386,386,381,381,381,381,381,
-381,381,381,381,386,386,386,386,386,386,386,386,386,114,114,114,
-
-/* block 53 */
-387,387,388,389,389,389,389,389,389,389,389,389,389,389,389,389,
-389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,
-389,388,387,387,387,387,388,388,387,387,388,387,387,387,389,389,
-390,390,390,390,390,390,390,390,390,390,389,389,389,389,389,389,
-391,391,391,391,391,391,391,391,391,391,391,391,391,391,391,391,
-391,391,391,391,391,391,391,391,391,391,391,391,391,391,391,391,
-391,391,391,391,391,391,392,393,392,392,393,393,393,392,393,392,
-392,392,393,393,114,114,114,114,114,114,114,114,394,394,394,394,
-
-/* block 54 */
-395,395,395,395,395,395,395,395,395,395,395,395,395,395,395,395,
-395,395,395,395,395,395,395,395,395,395,395,395,395,395,395,395,
-395,395,395,395,396,396,396,396,396,396,396,396,397,397,397,397,
-397,397,397,397,396,396,397,397,114,114,114,398,398,398,398,398,
-399,399,399,399,399,399,399,399,399,399,114,114,114,395,395,395,
-400,400,400,400,400,400,400,400,400,400,401,401,401,401,401,401,
-401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,
-401,401,401,401,401,401,401,401,402,402,402,402,402,402,403,403,
-
-/* block 55 */
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-404,404,404,404,404,404,404,404,114,114,114,114,114,114,114,114,
-109,109,109,  4,109,109,109,109,109,109,109,109,109,109,109,109,
-109,405,109,109,109,109,109,109,109,406,406,406,406,109,406,406,
-406,406,405,405,109,406,406,114,109,109,114,114,114,114,114,114,
-
-/* block 56 */
- 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
- 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
- 33, 33, 33, 33, 33, 33,122,122,122,122,122,407,106,106,106,106,
-106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,
-106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,
-106,106,106,106,106,106,106,106,106,106,106,106,106,115,115,115,
-115,115,106,106,106,106,115,115,115,115,115, 33, 33, 33, 33, 33,
- 33, 33, 33, 33, 33, 33, 33, 33,408,409, 33, 33, 33,410, 33, 33,
-
-/* block 57 */
- 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
- 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,106,106,106,106,106,
-106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,
-106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,115,
-109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,
-109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,
-109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,
-109,109,109,109,109,109,114,114,114,114,114,114,109,109,109,109,
-
-/* block 58 */
- 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,
- 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,
- 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,
- 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,
- 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,
- 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,
-411,412, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,
- 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,
-
-/* block 59 */
- 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,
- 30, 31, 30, 31, 30, 31, 33, 33, 33, 33, 33,413, 33, 33,414, 33,
- 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,
- 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,
- 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,
- 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,
- 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,
- 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,
-
-/* block 60 */
-415,415,415,415,415,415,415,415,416,416,416,416,416,416,416,416,
-415,415,415,415,415,415,114,114,416,416,416,416,416,416,114,114,
-415,415,415,415,415,415,415,415,416,416,416,416,416,416,416,416,
-415,415,415,415,415,415,415,415,416,416,416,416,416,416,416,416,
-415,415,415,415,415,415,114,114,416,416,416,416,416,416,114,114,
-122,415,122,415,122,415,122,415,114,416,114,416,114,416,114,416,
-415,415,415,415,415,415,415,415,416,416,416,416,416,416,416,416,
-417,417,418,418,418,418,419,419,420,420,421,421,422,422,114,114,
-
-/* block 61 */
-415,415,415,415,415,415,415,415,423,423,423,423,423,423,423,423,
-415,415,415,415,415,415,415,415,423,423,423,423,423,423,423,423,
-415,415,415,415,415,415,415,415,423,423,423,423,423,423,423,423,
-415,415,122,424,122,114,122,122,416,416,425,425,426,113,427,113,
-113,113,122,424,122,114,122,122,428,428,428,428,426,113,113,113,
-415,415,122,122,114,114,122,122,416,416,429,429,114,113,113,113,
-415,415,122,122,122,163,122,122,416,416,430,430,168,113,113,113,
-114,114,122,424,122,114,122,122,431,431,432,432,426,113,113,114,
-
-/* block 62 */
-  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3, 22,433,433, 22, 22,
-  9,  9,  9,  9,  9,  9,  4,  4, 21, 25,  6, 21, 21, 25,  6, 21,
-  4,  4,  4,  4,  4,  4,  4,  4,434,435, 22, 22, 22, 22, 22,  3,
-  4,  4,  4,  4,  4,  4,  4,  4,  4, 21, 25,  4,  4,  4,  4, 15,
- 15,  4,  4,  4,  8,  6,  7,  4,  4,  4,  4,  4,  4,  4,  4,  4,
-  4,  4,  8,  4, 15,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  3,
- 22, 22, 22, 22, 22,436, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
- 23,106,114,114, 23, 23, 23, 23, 23, 23,  8,  8,  8,  6,  7,106,
-
-/* block 63 */
- 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,  8,  8,  8,  6,  7,114,
-106,106,106,106,106,106,106,106,106,106,106,106,106,114,114,114,
-  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
-  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-109,109,109,109,109,109,109,109,109,109,109,109,109,380,380,380,
-380,109,380,380,380,109,109,109,109,109,109,109,109,109,109,109,
-109,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-
-/* block 64 */
- 19, 19,437, 19, 19, 19, 19,437, 19, 19,438,437,437,437,438,438,
-437,437,437,438, 19,437, 19, 19,  8,437,437,437,437,437, 19, 19,
- 19, 19, 19, 19,437, 19,439, 19,437, 19,440,441,437,437, 19,438,
-437,437,442,437,438,406,406,406,406,438, 19, 19,438,438,437,437,
-  8,  8,  8,  8,  8,437,438,438,438,438, 19,  8, 19, 19,443, 19,
- 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
-444,444,444,444,444,444,444,444,444,444,444,444,444,444,444,444,
-445,445,445,445,445,445,445,445,445,445,445,445,445,445,445,445,
-
-/* block 65 */
-446,446,446, 30, 31,446,446,446,446, 23,114,114,114,114,114,114,
-  8,  8,  8,  8,  8, 19, 19, 19, 19, 19,  8,  8, 19, 19, 19, 19,
-  8, 19, 19,  8, 19, 19,  8, 19, 19, 19, 19, 19, 19, 19,  8, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,  8,  8,
- 19, 19,  8, 19,  8, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-
-/* block 66 */
-  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-
-/* block 67 */
- 19, 19, 19, 19, 19, 19, 19, 19,  6,  7,  6,  7, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
-  8,  8, 19, 19, 19, 19, 19, 19, 19,  6,  7, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,  8, 19, 19, 19,
-
-/* block 68 */
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,  8,  8,  8,  8,  8,
-  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-  8,  8,  8,  8, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,  8,  8,  8,  8,
-  8,  8, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,114,114,114,114,114,
-
-/* block 69 */
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
- 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
- 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
-
-/* block 70 */
- 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
- 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19,447,447,447,447,447,447,447,447,447,447,
-447,447,447,447,447,447,447,447,447,447,447,447,447,447,447,447,
-448,448,448,448,448,448,448,448,448,448,448,448,448,448,448,448,
-448,448,448,448,448,448,448,448,448,448, 23, 23, 23, 23, 23, 23,
- 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
-
-/* block 71 */
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
-
-/* block 72 */
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19,  8, 19, 19, 19, 19, 19, 19, 19, 19,
- 19,  8, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,  8,  8,  8,  8,  8,  8,  8,  8,
-
-/* block 73 */
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,  8,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
-
-/* block 74 */
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,  6,  7,  6,  7,  6,  7,  6,  7,
-  6,  7,  6,  7,  6,  7, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
-
-/* block 75 */
- 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
- 23, 23, 23, 23, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
-  8,  8,  8,  8,  8,  6,  7,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-  8,  8,  8,  8,  8,  8,  6,  7,  6,  7,  6,  7,  6,  7,  6,  7,
-  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-
-/* block 76 */
-449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,
-449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,
-449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,
-449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,
-449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,
-449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,
-449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,
-449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,
-
-/* block 77 */
-  8,  8,  8,  6,  7,  6,  7,  6,  7,  6,  7,  6,  7,  6,  7,  6,
-  7,  6,  7,  6,  7,  6,  7,  6,  7,  8,  8,  8,  8,  8,  8,  8,
-  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-  8,  8,  8,  8,  8,  8,  8,  8,  6,  7,  6,  7,  8,  8,  8,  8,
-  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  6,  7,  8,  8,
-
-/* block 78 */
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
-  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
-  8,  8,  8,  8,  8, 19, 19,  8,  8,  8,  8,  8,  8, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19,114,114, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
-
-/* block 79 */
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19,114,114, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,114,114,114, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19,114, 19, 19, 19, 19, 19, 19,
- 19, 19,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-
-/* block 80 */
-450,450,450,450,450,450,450,450,450,450,450,450,450,450,450,450,
-450,450,450,450,450,450,450,450,450,450,450,450,450,450,450,450,
-450,450,450,450,450,450,450,450,450,450,450,450,450,450,450,114,
-451,451,451,451,451,451,451,451,451,451,451,451,451,451,451,451,
-451,451,451,451,451,451,451,451,451,451,451,451,451,451,451,451,
-451,451,451,451,451,451,451,451,451,451,451,451,451,451,451,114,
- 30, 31,452,453,454,455,456, 30, 31, 30, 31, 30, 31,457,458,459,
-460, 33, 30, 31, 33, 30, 31, 33, 33, 33, 33, 33,106,106,461,461,
-
-/* block 81 */
-159,160,159,160,159,160,159,160,159,160,159,160,159,160,159,160,
-159,160,159,160,159,160,159,160,159,160,159,160,159,160,159,160,
-159,160,159,160,159,160,159,160,159,160,159,160,159,160,159,160,
-159,160,159,160,159,160,159,160,159,160,159,160,159,160,159,160,
-159,160,159,160,159,160,159,160,159,160,159,160,159,160,159,160,
-159,160,159,160,159,160,159,160,159,160,159,160,159,160,159,160,
-159,160,159,160,462,463,463,463,463,463,463,159,160,159,160,464,
-464,464,159,160,114,114,114,114,114,465,465,465,465,466,465,465,
-
-/* block 82 */
-467,467,467,467,467,467,467,467,467,467,467,467,467,467,467,467,
-467,467,467,467,467,467,467,467,467,467,467,467,467,467,467,467,
-467,467,467,467,467,467,114,467,114,114,114,114,114,467,114,114,
-468,468,468,468,468,468,468,468,468,468,468,468,468,468,468,468,
-468,468,468,468,468,468,468,468,468,468,468,468,468,468,468,468,
-468,468,468,468,468,468,468,468,468,468,468,468,468,468,468,468,
-468,468,468,468,468,468,468,468,114,114,114,114,114,114,114,469,
-470,114,114,114,114,114,114,114,114,114,114,114,114,114,114,471,
-
-/* block 83 */
-317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,
-317,317,317,317,317,317,317,114,114,114,114,114,114,114,114,114,
-317,317,317,317,317,317,317,114,317,317,317,317,317,317,317,114,
-317,317,317,317,317,317,317,114,317,317,317,317,317,317,317,114,
-317,317,317,317,317,317,317,114,317,317,317,317,317,317,317,114,
-317,317,317,317,317,317,317,114,317,317,317,317,317,317,317,114,
-177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,
-177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,
-
-/* block 84 */
-  4,  4, 21, 25, 21, 25,  4,  4,  4, 21, 25,  4, 21, 25,  4,  4,
-  4,  4,  4,  4,  4,  4,  4,  9,  4,  4,  9,  4, 21, 25,  4,  4,
- 21, 25,  6,  7,  6,  7,  6,  7,  6,  7,  4,  4,  4,  4,  4,107,
-  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  9,  9,  4,  4,  4,  4,
-  9,  4,  6,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-
-/* block 85 */
-472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,
-472,472,472,472,472,472,472,472,472,472,114,472,472,472,472,472,
-472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,
-472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,
-472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,
-472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,
-472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,
-472,472,472,472,114,114,114,114,114,114,114,114,114,114,114,114,
-
-/* block 86 */
-472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,
-472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,
-472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,
-472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,
-472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,
-472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,
-472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,
-472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,
-
-/* block 87 */
-472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,
-472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,
-472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,
-472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,
-472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,
-472,472,472,472,472,472,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,114,114,114,114,
-
-/* block 88 */
-  3,  4,  4,  4, 19,473,406,474,  6,  7,  6,  7,  6,  7,  6,  7,
-  6,  7, 19, 19,  6,  7,  6,  7,  6,  7,  6,  7,  9,  6,  7,  7,
- 19,474,474,474,474,474,474,474,474,474,109,109,109,109,475,475,
-  9,107,107,107,107,107, 19, 19,474,474,474,473,406,  4, 19, 19,
-114,476,476,476,476,476,476,476,476,476,476,476,476,476,476,476,
-476,476,476,476,476,476,476,476,476,476,476,476,476,476,476,476,
-476,476,476,476,476,476,476,476,476,476,476,476,476,476,476,476,
-476,476,476,476,476,476,476,476,476,476,476,476,476,476,476,476,
-
-/* block 89 */
-476,476,476,476,476,476,476,476,476,476,476,476,476,476,476,476,
-476,476,476,476,476,476,476,114,114,109,109, 14, 14,477,477,476,
-  9,478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,
-478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,
-478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,
-478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,
-478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,
-478,478,478,478,478,478,478,478,478,478,478,  4,107,479,479,478,
-
-/* block 90 */
-114,114,114,114,114,480,480,480,480,480,480,480,480,480,480,480,
-480,480,480,480,480,480,480,480,480,480,480,480,480,480,480,480,
-480,480,480,480,480,480,480,480,480,480,480,480,480,480,114,114,
-114,481,481,481,481,481,481,481,481,481,481,481,481,481,481,481,
-481,481,481,481,481,481,481,481,481,481,481,481,481,481,481,481,
-481,481,481,481,481,481,481,481,481,481,481,481,481,481,481,481,
-481,481,481,481,481,481,481,481,481,481,481,481,481,481,481,481,
-481,481,481,481,481,481,481,481,481,481,481,481,481,481,481,481,
-
-/* block 91 */
-481,481,481,481,481,481,481,481,481,481,481,481,481,481,481,114,
- 19, 19, 23, 23, 23, 23, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
-480,480,480,480,480,480,480,480,480,480,480,480,480,480,480,480,
-480,480,480,480,480,480,480,480,480,480,480,114,114,114,114,114,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19,114,114,114,114,114,114,114,114,114,114,114,114,
-478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,
-
-/* block 92 */
-482,482,482,482,482,482,482,482,482,482,482,482,482,482,482,482,
-482,482,482,482,482,482,482,482,482,482,482,482,482,482,482,114,
- 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 23, 23, 23, 23, 23, 23, 23, 23,
- 19, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
-482,482,482,482,482,482,482,482,482,482,482,482,482,482,482,482,
-482,482,482,482,482,482,482,482,482,482,482,482,482,482,482, 19,
-
-/* block 93 */
- 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
-483,483,483,483,483,483,483,483,483,483,483,483,483,483,483,483,
-483,483,483,483,483,483,483,483,483,483,483,483,483,483,483,483,
-483,483,483,483,483,483,483,483,483,483,483,483,483,483,483,114,
-
-/* block 94 */
-483,483,483,483,483,483,483,483,483,483,483,483,483,483,483,483,
-483,483,483,483,483,483,483,483,483,483,483,483,483,483,483,483,
-483,483,483,483,483,483,483,483,483,483,483,483,483,483,483,483,
-483,483,483,483,483,483,483,483,483,483,483,483,483,483,483,483,
-483,483,483,483,483,483,483,483,483,483,483,483,483,483,483,483,
-483,483,483,483,483,483,483,483, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
-
-/* block 95 */
-484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,
-484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,
-484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,
-484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,
-484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,
-484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,
-484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,
-484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,
-
-/* block 96 */
-484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,
-484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,
-484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,
-484,484,484,484,484,484,114,114,114,114,114,114,114,114,114,114,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
-
-/* block 97 */
-484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,
-484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,
-484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,
-484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,
-484,484,484,484,484,484,484,484,484,484,484,484,484,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-
-/* block 98 */
-485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,
-485,485,485,485,485,486,485,485,485,485,485,485,485,485,485,485,
-485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,
-485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,
-485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,
-485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,
-485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,
-485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,
-
-/* block 99 */
-485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,
-485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,
-485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,
-485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,
-485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,
-485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,
-485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,
-485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,
-
-/* block 100 */
-485,485,485,485,485,485,485,485,485,485,485,485,485,114,114,114,
-487,487,487,487,487,487,487,487,487,487,487,487,487,487,487,487,
-487,487,487,487,487,487,487,487,487,487,487,487,487,487,487,487,
-487,487,487,487,487,487,487,487,487,487,487,487,487,487,487,487,
-487,487,487,487,487,487,487,114,114,114,114,114,114,114,114,114,
-488,488,488,488,488,488,488,488,488,488,488,488,488,488,488,488,
-488,488,488,488,488,488,488,488,488,488,488,488,488,488,488,488,
-488,488,488,488,488,488,488,488,489,489,489,489,489,489,490,490,
-
-/* block 101 */
-491,491,491,491,491,491,491,491,491,491,491,491,491,491,491,491,
-491,491,491,491,491,491,491,491,491,491,491,491,491,491,491,491,
-491,491,491,491,491,491,491,491,491,491,491,491,491,491,491,491,
-491,491,491,491,491,491,491,491,491,491,491,491,491,491,491,491,
-491,491,491,491,491,491,491,491,491,491,491,491,491,491,491,491,
-491,491,491,491,491,491,491,491,491,491,491,491,491,491,491,491,
-491,491,491,491,491,491,491,491,491,491,491,491,491,491,491,491,
-491,491,491,491,491,491,491,491,491,491,491,491,491,491,491,491,
-
-/* block 102 */
-491,491,491,491,491,491,491,491,491,491,491,491,492,493,493,493,
-491,491,491,491,491,491,491,491,491,491,491,491,491,491,491,491,
-494,494,494,494,494,494,494,494,494,494,491,491,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-174,175,174,175,174,175,174,175,174,175,174,175,174,175,174,175,
-174,175,174,175,174,175,174,175,174,175,174,175,174,175,174,175,
-174,175,174,175,174,175,174,175,174,175,174,175,174,175,495,177,
-178,178,178,496,177,177,177,177,177,177,177,177,177,177,496,408,
-
-/* block 103 */
-174,175,174,175,174,175,174,175,174,175,174,175,174,175,174,175,
-174,175,174,175,174,175,174,175,174,175,174,175,408,408,114,177,
-497,497,497,497,497,497,497,497,497,497,497,497,497,497,497,497,
-497,497,497,497,497,497,497,497,497,497,497,497,497,497,497,497,
-497,497,497,497,497,497,497,497,497,497,497,497,497,497,497,497,
-497,497,497,497,497,497,497,497,497,497,497,497,497,497,497,497,
-497,497,497,497,497,497,498,498,498,498,498,498,498,498,498,498,
-499,499,500,500,500,500,500,500,114,114,114,114,114,114,114,114,
-
-/* block 104 */
- 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
- 14, 14, 14, 14, 14, 14, 14,107,107,107,107,107,107,107,107,107,
- 14, 14, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,
- 33, 33, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,
- 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,
- 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,
- 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,
-106, 33, 33, 33, 33, 33, 33, 33, 33, 30, 31, 30, 31,501, 30, 31,
-
-/* block 105 */
- 30, 31, 30, 31, 30, 31, 30, 31,107, 14, 14, 30, 31,502, 33,114,
- 30, 31, 30, 31, 33, 33, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,
- 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,503,504,505,506,114,114,
-507,508,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114, 20,106,106, 33, 20, 20, 20, 20, 20,
-
-/* block 106 */
-509,509,510,509,509,509,510,509,509,509,509,510,509,509,509,509,
-509,509,509,509,509,509,509,509,509,509,509,509,509,509,509,509,
-509,509,509,511,511,510,510,511,512,512,512,512,114,114,114,114,
- 23, 23, 23, 23, 23, 23, 19, 19,  5, 19,114,114,114,114,114,114,
-513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,
-513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,
-513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,
-513,513,513,513,514,514,514,514,114,114,114,114,114,114,114,114,
-
-/* block 107 */
-515,515,516,516,516,516,516,516,516,516,516,516,516,516,516,516,
-516,516,516,516,516,516,516,516,516,516,516,516,516,516,516,516,
-516,516,516,516,516,516,516,516,516,516,516,516,516,516,516,516,
-516,516,516,516,515,515,515,515,515,515,515,515,515,515,515,515,
-515,515,515,515,517,114,114,114,114,114,114,114,114,114,518,518,
-519,519,519,519,519,519,519,519,519,519,114,114,114,114,114,114,
-221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,
-221,221,223,223,223,223,223,223,225,225,225,223,114,114,114,114,
-
-/* block 108 */
-520,520,520,520,520,520,520,520,520,520,521,521,521,521,521,521,
-521,521,521,521,521,521,521,521,521,521,521,521,521,521,521,521,
-521,521,521,521,521,521,522,522,522,522,522,522,522,522,  4,523,
-524,524,524,524,524,524,524,524,524,524,524,524,524,524,524,524,
-524,524,524,524,524,524,524,525,525,525,525,525,525,525,525,525,
-525,525,526,526,114,114,114,114,114,114,114,114,114,114,114,527,
-314,314,314,314,314,314,314,314,314,314,314,314,314,314,314,314,
-314,314,314,314,314,314,314,314,314,314,314,314,314,114,114,114,
-
-/* block 109 */
-528,528,528,529,530,530,530,530,530,530,530,530,530,530,530,530,
-530,530,530,530,530,530,530,530,530,530,530,530,530,530,530,530,
-530,530,530,530,530,530,530,530,530,530,530,530,530,530,530,530,
-530,530,530,528,529,529,528,528,528,528,529,529,528,529,529,529,
-529,531,531,531,531,531,531,531,531,531,531,531,531,531,114,107,
-532,532,532,532,532,532,532,532,532,532,114,114,114,114,531,531,
-304,304,304,304,304,306,533,304,304,304,304,304,304,304,304,304,
-308,308,308,308,308,308,308,308,308,308,304,304,304,304,304,114,
-
-/* block 110 */
-534,534,534,534,534,534,534,534,534,534,534,534,534,534,534,534,
-534,534,534,534,534,534,534,534,534,534,534,534,534,534,534,534,
-534,534,534,534,534,534,534,534,534,535,535,535,535,535,535,536,
-536,535,535,536,536,535,535,114,114,114,114,114,114,114,114,114,
-534,534,534,535,534,534,534,534,534,534,534,534,535,536,114,114,
-537,537,537,537,537,537,537,537,537,537,114,114,538,538,538,538,
-304,304,304,304,304,304,304,304,304,304,304,304,304,304,304,304,
-533,304,304,304,304,304,304,310,310,310,304,305,306,305,304,304,
-
-/* block 111 */
-539,539,539,539,539,539,539,539,539,539,539,539,539,539,539,539,
-539,539,539,539,539,539,539,539,539,539,539,539,539,539,539,539,
-539,539,539,539,539,539,539,539,539,539,539,539,539,539,539,539,
-540,539,540,540,540,539,539,540,540,539,539,539,539,539,540,540,
-539,540,539,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,539,539,541,542,542,
-543,543,543,543,543,543,543,543,543,543,543,544,545,545,544,544,
-546,546,543,547,547,544,545,114,114,114,114,114,114,114,114,114,
-
-/* block 112 */
-114,317,317,317,317,317,317,114,114,317,317,317,317,317,317,114,
-114,317,317,317,317,317,317,114,114,114,114,114,114,114,114,114,
-317,317,317,317,317,317,317,114,317,317,317,317,317,317,317,114,
- 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
- 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
- 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 14,106,106,106,106,
-114,114,114,114, 33,122,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-
-/* block 113 */
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-543,543,543,543,543,543,543,543,543,543,543,543,543,543,543,543,
-543,543,543,543,543,543,543,543,543,543,543,543,543,543,543,543,
-543,543,543,544,544,545,544,544,545,544,544,546,544,545,114,114,
-548,548,548,548,548,548,548,548,548,548,114,114,114,114,114,114,
-
-/* block 114 */
-549,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,
-550,550,550,550,550,550,550,550,550,550,550,550,549,550,550,550,
-550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,
-550,550,550,550,550,550,550,550,549,550,550,550,550,550,550,550,
-550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,
-550,550,550,550,549,550,550,550,550,550,550,550,550,550,550,550,
-550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,
-549,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,
-
-/* block 115 */
-550,550,550,550,550,550,550,550,550,550,550,550,549,550,550,550,
-550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,
-550,550,550,550,550,550,550,550,549,550,550,550,550,550,550,550,
-550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,
-550,550,550,550,549,550,550,550,550,550,550,550,550,550,550,550,
-550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,
-549,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,
-550,550,550,550,550,550,550,550,550,550,550,550,549,550,550,550,
-
-/* block 116 */
-550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,
-550,550,550,550,550,550,550,550,549,550,550,550,550,550,550,550,
-550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,
-550,550,550,550,549,550,550,550,550,550,550,550,550,550,550,550,
-550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,
-549,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,
-550,550,550,550,550,550,550,550,550,550,550,550,549,550,550,550,
-550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,
-
-/* block 117 */
-550,550,550,550,550,550,550,550,549,550,550,550,550,550,550,550,
-550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,
-550,550,550,550,549,550,550,550,550,550,550,550,550,550,550,550,
-550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,
-549,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,
-550,550,550,550,550,550,550,550,550,550,550,550,549,550,550,550,
-550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,
-550,550,550,550,550,550,550,550,549,550,550,550,550,550,550,550,
-
-/* block 118 */
-550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,
-550,550,550,550,549,550,550,550,550,550,550,550,550,550,550,550,
-550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,
-549,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,
-550,550,550,550,550,550,550,550,550,550,550,550,549,550,550,550,
-550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,
-550,550,550,550,550,550,550,550,549,550,550,550,550,550,550,550,
-550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,
-
-/* block 119 */
-550,550,550,550,549,550,550,550,550,550,550,550,550,550,550,550,
-550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,
-549,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,
-550,550,550,550,550,550,550,550,550,550,550,550,549,550,550,550,
-550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,
-550,550,550,550,550,550,550,550,549,550,550,550,550,550,550,550,
-550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,
-550,550,550,550,549,550,550,550,550,550,550,550,550,550,550,550,
-
-/* block 120 */
-550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,
-549,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,
-550,550,550,550,550,550,550,550,550,550,550,550,549,550,550,550,
-550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,
-550,550,550,550,550,550,550,550,549,550,550,550,550,550,550,550,
-550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,
-550,550,550,550,549,550,550,550,550,550,550,550,550,550,550,550,
-550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,
-
-/* block 121 */
-550,550,550,550,550,550,550,550,549,550,550,550,550,550,550,550,
-550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,
-550,550,550,550,114,114,114,114,114,114,114,114,114,114,114,114,
-315,315,315,315,315,315,315,315,315,315,315,315,315,315,315,315,
-315,315,315,315,315,315,315,114,114,114,114,316,316,316,316,316,
-316,316,316,316,316,316,316,316,316,316,316,316,316,316,316,316,
-316,316,316,316,316,316,316,316,316,316,316,316,316,316,316,316,
-316,316,316,316,316,316,316,316,316,316,316,316,114,114,114,114,
-
-/* block 122 */
-551,551,551,551,551,551,551,551,551,551,551,551,551,551,551,551,
-551,551,551,551,551,551,551,551,551,551,551,551,551,551,551,551,
-551,551,551,551,551,551,551,551,551,551,551,551,551,551,551,551,
-551,551,551,551,551,551,551,551,551,551,551,551,551,551,551,551,
-551,551,551,551,551,551,551,551,551,551,551,551,551,551,551,551,
-551,551,551,551,551,551,551,551,551,551,551,551,551,551,551,551,
-551,551,551,551,551,551,551,551,551,551,551,551,551,551,551,551,
-551,551,551,551,551,551,551,551,551,551,551,551,551,551,551,551,
-
-/* block 123 */
-552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,
-552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,
-552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,
-552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,
-552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,
-552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,
-552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,
-552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,
-
-/* block 124 */
-484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,
-484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,
-484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,
-484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,
-484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,
-484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,
-484,484,484,484,484,484,484,484,484,484,484,484,484,484,114,114,
-484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,
-
-/* block 125 */
-484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,
-484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,
-484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,
-484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,
-484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,
-484,484,484,484,484,484,484,484,484,484,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-
-/* block 126 */
- 33, 33, 33, 33, 33, 33, 33,114,114,114,114,114,114,114,114,114,
-114,114,114,185,185,185,185,185,114,114,114,114,114,192,189,192,
-192,192,192,192,192,192,192,192,192,553,192,192,192,192,192,192,
-192,192,192,192,192,192,192,114,192,192,192,192,192,114,192,114,
-192,192,114,192,192,114,192,192,192,192,192,192,192,192,192,192,
-199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,
-199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,
-199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,
-
-/* block 127 */
-199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,
-199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,
-199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,
-199,199,554,554,554,554,554,554,554,554,554,554,554,554,554,554,
-554,554,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,199,199,199,199,199,199,199,199,199,199,199,199,199,
-199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,
-199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,
-
-/* block 128 */
-199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,
-199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,
-199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,
-199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,
-199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,
-199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,
-199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,
-199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,
-
-/* block 129 */
-199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,
-199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,
-199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,
-199,199,199,199,199,199,199,199,199,199,199,199,199,199,  7,  6,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,
-199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,
-199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,
-
-/* block 130 */
-199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,
-114,114,199,199,199,199,199,199,199,199,199,199,199,199,199,199,
-199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,
-199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,
-199,199,199,199,199,199,199,199,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-199,199,199,199,199,199,199,199,199,199,199,199,196,197,114,114,
-
-/* block 131 */
-109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,
-  4,  4,  4,  4,  4,  4,  4,  6,  7,  4,114,114,114,114,114,114,
-109,109,109,109,109,109,109,109,109,109,109,109,109,109,114,114,
-  4,  9,  9, 15, 15,  6,  7,  6,  7,  6,  7,  6,  7,  6,  7,  6,
-  7,  6,  7,  6,  7,  4,  4,  6,  7,  4,  4,  4,  4, 15, 15, 15,
-  4,  4,  4,114,  4,  4,  4,  4,  9,  6,  7,  6,  7,  6,  7,  4,
-  4,  4,  8,  9,  8,  8,  8,114,  4,  5,  4,  4,114,114,114,114,
-199,199,199,199,199,114,199,199,199,199,199,199,199,199,199,199,
-
-/* block 132 */
-199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,
-199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,
-199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,
-199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,
-199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,
-199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,
-199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,
-199,199,199,199,199,199,199,199,199,199,199,199,199,114,114, 22,
-
-/* block 133 */
-114,  4,  4,  4,  5,  4,  4,  4,  6,  7,  4,  8,  4,  9,  4,  4,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  4,  4,  8,  8,  8,  4,
-  4, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
- 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  6,  4,  7, 14, 15,
- 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,  6,  8,  7,  8,  6,
-  7,  4,  6,  7,  4,  4,478,478,478,478,478,478,478,478,478,478,
-107,478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,
-
-/* block 134 */
-478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,
-478,478,478,478,478,478,478,478,478,478,478,478,478,478,555,555,
-481,481,481,481,481,481,481,481,481,481,481,481,481,481,481,481,
-481,481,481,481,481,481,481,481,481,481,481,481,481,481,481,114,
-114,114,481,481,481,481,481,481,114,114,481,481,481,481,481,481,
-114,114,481,481,481,481,481,481,114,114,481,481,481,114,114,114,
-  5,  5,  8, 14, 19,  5,  5,114, 19,  8,  8,  8,  8, 19, 19,114,
-436,436,436,436,436,436,436,436,436, 22, 22, 22, 19, 19,114,114,
-
-/* block 135 */
-556,556,556,556,556,556,556,556,556,556,556,556,114,556,556,556,
-556,556,556,556,556,556,556,556,556,556,556,556,556,556,556,556,
-556,556,556,556,556,556,556,114,556,556,556,556,556,556,556,556,
-556,556,556,556,556,556,556,556,556,556,556,114,556,556,114,556,
-556,556,556,556,556,556,556,556,556,556,556,556,556,556,114,114,
-556,556,556,556,556,556,556,556,556,556,556,556,556,556,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-
-/* block 136 */
-556,556,556,556,556,556,556,556,556,556,556,556,556,556,556,556,
-556,556,556,556,556,556,556,556,556,556,556,556,556,556,556,556,
-556,556,556,556,556,556,556,556,556,556,556,556,556,556,556,556,
-556,556,556,556,556,556,556,556,556,556,556,556,556,556,556,556,
-556,556,556,556,556,556,556,556,556,556,556,556,556,556,556,556,
-556,556,556,556,556,556,556,556,556,556,556,556,556,556,556,556,
-556,556,556,556,556,556,556,556,556,556,556,556,556,556,556,556,
-556,556,556,556,556,556,556,556,556,556,556,114,114,114,114,114,
-
-/* block 137 */
-  4,  4,  4,114,114,114,114, 23, 23, 23, 23, 23, 23, 23, 23, 23,
- 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
- 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
- 23, 23, 23, 23,114,114,114, 19, 19, 19, 19, 19, 19, 19, 19, 19,
-557,557,557,557,557,557,557,557,557,557,557,557,557,557,557,557,
-557,557,557,557,557,557,557,557,557,557,557,557,557,557,557,557,
-557,557,557,557,557,557,557,557,557,557,557,557,557,557,557,557,
-557,557,557,557,557,558,558,558,558,559,559,559,559,559,559,559,
-
-/* block 138 */
-559,559,559,559,559,559,559,559,559,559,558,558,559,114,114,114,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,114,114,114,114,
-559,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,109,114,114,
-
-/* block 139 */
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-
-/* block 140 */
-560,560,560,560,560,560,560,560,560,560,560,560,560,560,560,560,
-560,560,560,560,560,560,560,560,560,560,560,560,560,114,114,114,
-561,561,561,561,561,561,561,561,561,561,561,561,561,561,561,561,
-561,561,561,561,561,561,561,561,561,561,561,561,561,561,561,561,
-561,561,561,561,561,561,561,561,561,561,561,561,561,561,561,561,
-561,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-109, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
- 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,114,114,114,114,
-
-/* block 141 */
-562,562,562,562,562,562,562,562,562,562,562,562,562,562,562,562,
-562,562,562,562,562,562,562,562,562,562,562,562,562,562,562,562,
-563,563,563,563,114,114,114,114,114,114,114,114,114,114,114,114,
-564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,
-564,565,564,564,564,564,564,564,564,564,565,114,114,114,114,114,
-566,566,566,566,566,566,566,566,566,566,566,566,566,566,566,566,
-566,566,566,566,566,566,566,566,566,566,566,566,566,566,566,566,
-566,566,566,566,566,566,567,567,567,567,567,114,114,114,114,114,
-
-/* block 142 */
-568,568,568,568,568,568,568,568,568,568,568,568,568,568,568,568,
-568,568,568,568,568,568,568,568,568,568,568,568,568,568,114,569,
-570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,
-570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,
-570,570,570,570,114,114,114,114,570,570,570,570,570,570,570,570,
-571,572,572,572,572,572,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-
-/* block 143 */
-573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,
-573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,
-573,573,573,573,573,573,573,573,574,574,574,574,574,574,574,574,
-574,574,574,574,574,574,574,574,574,574,574,574,574,574,574,574,
-574,574,574,574,574,574,574,574,574,574,574,574,574,574,574,574,
-575,575,575,575,575,575,575,575,575,575,575,575,575,575,575,575,
-575,575,575,575,575,575,575,575,575,575,575,575,575,575,575,575,
-575,575,575,575,575,575,575,575,575,575,575,575,575,575,575,575,
-
-/* block 144 */
-576,576,576,576,576,576,576,576,576,576,576,576,576,576,576,576,
-576,576,576,576,576,576,576,576,576,576,576,576,576,576,114,114,
-577,577,577,577,577,577,577,577,577,577,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-
-/* block 145 */
-578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,
-578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,
-578,578,578,578,578,578,578,578,114,114,114,114,114,114,114,114,
-579,579,579,579,579,579,579,579,579,579,579,579,579,579,579,579,
-579,579,579,579,579,579,579,579,579,579,579,579,579,579,579,579,
-579,579,579,579,579,579,579,579,579,579,579,579,579,579,579,579,
-579,579,579,579,114,114,114,114,114,114,114,114,114,114,114,580,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-
-/* block 146 */
-581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,
-581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,
-581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,
-581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,
-581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,
-581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,
-581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,
-581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,
-
-/* block 147 */
-581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,
-581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,
-581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,
-581,581,581,581,581,581,581,114,114,114,114,114,114,114,114,114,
-581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,
-581,581,581,581,581,581,114,114,114,114,114,114,114,114,114,114,
-581,581,581,581,581,581,581,581,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-
-/* block 148 */
-582,582,582,582,582,582,114,114,582,114,582,582,582,582,582,582,
-582,582,582,582,582,582,582,582,582,582,582,582,582,582,582,582,
-582,582,582,582,582,582,582,582,582,582,582,582,582,582,582,582,
-582,582,582,582,582,582,114,582,582,114,114,114,582,114,114,582,
-583,583,583,583,583,583,583,583,583,583,583,583,583,583,583,583,
-583,583,583,583,583,583,114,584,585,585,585,585,585,585,585,585,
-586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
-586,586,586,586,586,586,586,587,587,588,588,588,588,588,588,588,
-
-/* block 149 */
-589,589,589,589,589,589,589,589,589,589,589,589,589,589,589,589,
-589,589,589,589,589,589,589,589,589,589,589,589,589,589,589,114,
-114,114,114,114,114,114,114,590,590,590,590,590,590,590,590,590,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-
-/* block 150 */
-591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,
-591,591,591,591,591,591,592,592,592,592,592,592,114,114,114,593,
-594,594,594,594,594,594,594,594,594,594,594,594,594,594,594,594,
-594,594,594,594,594,594,594,594,594,594,114,114,114,114,114,595,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-
-/* block 151 */
-596,596,596,596,596,596,596,596,596,596,596,596,596,596,596,596,
-596,596,596,596,596,596,596,596,596,596,596,596,596,596,596,596,
-597,597,597,597,597,597,597,597,597,597,597,597,597,597,597,597,
-597,597,597,597,597,597,597,597,114,114,114,114,114,114,597,597,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-
-/* block 152 */
-598,599,599,599,114,599,599,114,114,114,114,114,599,599,599,599,
-598,598,598,598,114,598,598,598,114,598,598,598,598,598,598,598,
-598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,
-598,598,598,598,114,114,114,114,599,599,599,114,114,114,114,599,
-600,600,600,600,600,600,600,600,114,114,114,114,114,114,114,114,
-601,601,601,601,601,601,601,601,601,114,114,114,114,114,114,114,
-602,602,602,602,602,602,602,602,602,602,602,602,602,602,602,602,
-602,602,602,602,602,602,602,602,602,602,602,602,602,603,603,604,
-
-/* block 153 */
-605,605,605,605,605,605,605,605,605,605,605,605,605,605,605,605,
-605,605,605,605,605,605,605,605,605,605,605,605,605,606,606,606,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-607,607,607,607,607,607,607,607,608,607,607,607,607,607,607,607,
-607,607,607,607,607,607,607,607,607,607,607,607,607,607,607,607,
-607,607,607,607,607,609,609,114,114,114,114,610,610,610,610,610,
-611,611,611,611,611,611,611,114,114,114,114,114,114,114,114,114,
-
-/* block 154 */
-612,612,612,612,612,612,612,612,612,612,612,612,612,612,612,612,
-612,612,612,612,612,612,612,612,612,612,612,612,612,612,612,612,
-612,612,612,612,612,612,612,612,612,612,612,612,612,612,612,612,
-612,612,612,612,612,612,114,114,114,613,613,613,613,613,613,613,
-614,614,614,614,614,614,614,614,614,614,614,614,614,614,614,614,
-614,614,614,614,614,614,114,114,615,615,615,615,615,615,615,615,
-616,616,616,616,616,616,616,616,616,616,616,616,616,616,616,616,
-616,616,616,114,114,114,114,114,617,617,617,617,617,617,617,617,
-
-/* block 155 */
-618,618,618,618,618,618,618,618,618,618,618,618,618,618,618,618,
-618,618,114,114,114,114,114,114,114,619,619,619,619,114,114,114,
-114,114,114,114,114,114,114,114,114,620,620,620,620,620,620,620,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-
-/* block 156 */
-621,621,621,621,621,621,621,621,621,621,621,621,621,621,621,621,
-621,621,621,621,621,621,621,621,621,621,621,621,621,621,621,621,
-621,621,621,621,621,621,621,621,621,621,621,621,621,621,621,621,
-621,621,621,621,621,621,621,621,621,621,621,621,621,621,621,621,
-621,621,621,621,621,621,621,621,621,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-
-/* block 157 */
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-622,622,622,622,622,622,622,622,622,622,622,622,622,622,622,622,
-622,622,622,622,622,622,622,622,622,622,622,622,622,622,622,114,
-
-/* block 158 */
-623,624,623,625,625,625,625,625,625,625,625,625,625,625,625,625,
-625,625,625,625,625,625,625,625,625,625,625,625,625,625,625,625,
-625,625,625,625,625,625,625,625,625,625,625,625,625,625,625,625,
-625,625,625,625,625,625,625,625,624,624,624,624,624,624,624,624,
-624,624,624,624,624,624,624,626,626,626,626,626,626,626,114,114,
-114,114,627,627,627,627,627,627,627,627,627,627,627,627,627,627,
-627,627,627,627,627,627,628,628,628,628,628,628,628,628,628,628,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,624,
-
-/* block 159 */
-629,629,630,631,631,631,631,631,631,631,631,631,631,631,631,631,
-631,631,631,631,631,631,631,631,631,631,631,631,631,631,631,631,
-631,631,631,631,631,631,631,631,631,631,631,631,631,631,631,631,
-630,630,630,629,629,629,629,630,630,629,629,632,632,633,632,632,
-632,632,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-634,634,634,634,634,634,634,634,634,634,634,634,634,634,634,634,
-634,634,634,634,634,634,634,634,634,114,114,114,114,114,114,114,
-635,635,635,635,635,635,635,635,635,635,114,114,114,114,114,114,
-
-/* block 160 */
-636,636,636,637,637,637,637,637,637,637,637,637,637,637,637,637,
-637,637,637,637,637,637,637,637,637,637,637,637,637,637,637,637,
-637,637,637,637,637,637,637,636,636,636,636,636,638,636,636,636,
-636,636,636,636,636,114,639,639,639,639,639,639,639,639,639,639,
-640,640,640,640,114,114,114,114,114,114,114,114,114,114,114,114,
-641,641,641,641,641,641,641,641,641,641,641,641,641,641,641,641,
-641,641,641,641,641,641,641,641,641,641,641,641,641,641,641,641,
-641,641,641,642,643,643,641,114,114,114,114,114,114,114,114,114,
-
-/* block 161 */
-644,644,645,646,646,646,646,646,646,646,646,646,646,646,646,646,
-646,646,646,646,646,646,646,646,646,646,646,646,646,646,646,646,
-646,646,646,646,646,646,646,646,646,646,646,646,646,646,646,646,
-646,646,646,645,645,645,644,644,644,644,644,644,644,644,644,645,
-645,646,646,646,646,647,647,647,647,114,114,114,114,647,114,114,
-648,648,648,648,648,648,648,648,648,648,646,114,114,114,114,114,
-114,649,649,649,649,649,649,649,649,649,649,649,649,649,649,649,
-649,649,649,649,649,114,114,114,114,114,114,114,114,114,114,114,
-
-/* block 162 */
-650,650,650,650,650,650,650,650,650,650,650,650,650,650,650,650,
-650,650,114,650,650,650,650,650,650,650,650,650,650,650,650,650,
-650,650,650,650,650,650,650,650,650,650,650,650,651,651,651,652,
-652,652,651,651,652,651,652,652,653,653,653,653,653,653,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-
-/* block 163 */
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-654,654,654,654,654,654,654,654,654,654,654,654,654,654,654,654,
-654,654,654,654,654,654,654,654,654,654,654,654,654,654,654,654,
-654,654,654,654,654,654,654,654,654,654,654,654,654,654,654,655,
-656,656,656,655,655,655,655,655,655,655,655,114,114,114,114,114,
-657,657,657,657,657,657,657,657,657,657,114,114,114,114,114,114,
-
-/* block 164 */
-114,658,659,659,114,660,660,660,660,660,660,660,660,114,114,660,
-660,114,114,660,660,660,660,660,660,660,660,660,660,660,660,660,
-660,660,660,660,660,660,660,660,660,114,660,660,660,660,660,660,
-660,114,660,660,114,660,660,660,660,660,114,114,658,660,661,659,
-658,659,659,659,659,114,114,659,659,114,114,659,659,659,114,114,
-114,114,114,114,114,114,114,661,114,114,114,114,114,660,660,660,
-660,660,659,659,114,114,658,658,658,658,658,658,658,114,114,114,
-658,658,658,658,658,114,114,114,114,114,114,114,114,114,114,114,
-
-/* block 165 */
-662,662,662,662,662,662,662,662,662,662,662,662,662,662,662,662,
-662,662,662,662,662,662,662,662,662,662,662,662,662,662,662,662,
-662,662,662,662,662,662,662,662,662,662,662,662,662,662,662,662,
-663,664,664,665,665,665,665,665,665,664,665,664,664,663,664,665,
-665,664,665,665,662,662,666,662,114,114,114,114,114,114,114,114,
-667,667,667,667,667,667,667,667,667,667,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-
-/* block 166 */
-668,668,668,668,668,668,668,668,668,668,668,668,668,668,668,668,
-668,668,668,668,668,668,668,668,668,668,668,668,668,668,668,668,
-668,668,668,668,668,668,668,668,668,668,668,668,668,668,668,669,
-670,670,671,671,671,671,114,114,670,670,670,670,671,671,670,671,
-671,672,672,672,672,672,672,672,672,672,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-
-/* block 167 */
-673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,
-673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,
-673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,
-674,674,674,675,675,675,675,675,675,675,675,674,674,675,674,675,
-675,676,676,676,673,114,114,114,114,114,114,114,114,114,114,114,
-677,677,677,677,677,677,677,677,677,677,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-
-/* block 168 */
-678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,
-678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,
-678,678,678,678,678,678,678,678,678,678,678,679,680,679,680,680,
-679,679,679,679,679,679,680,679,114,114,114,114,114,114,114,114,
-681,681,681,681,681,681,681,681,681,681,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-
-/* block 169 */
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-682,682,682,682,682,682,682,682,682,682,682,682,682,682,682,682,
-682,682,682,682,682,682,682,682,682,682,682,682,682,682,682,682,
-683,683,683,683,683,683,683,683,683,683,683,683,683,683,683,683,
-683,683,683,683,683,683,683,683,683,683,683,683,683,683,683,683,
-684,684,684,684,684,684,684,684,684,684,685,685,685,685,685,685,
-685,685,685,114,114,114,114,114,114,114,114,114,114,114,114,686,
-
-/* block 170 */
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-687,687,687,687,687,687,687,687,687,687,687,687,687,687,687,687,
-687,687,687,687,687,687,687,687,687,687,687,687,687,687,687,687,
-687,687,687,687,687,687,687,687,687,687,687,687,687,687,687,687,
-687,687,687,687,687,687,687,687,687,114,114,114,114,114,114,114,
-
-/* block 171 */
-688,688,688,688,688,688,688,688,688,688,688,688,688,688,688,688,
-688,688,688,688,688,688,688,688,688,688,688,688,688,688,688,688,
-688,688,688,688,688,688,688,688,688,688,688,688,688,688,688,688,
-688,688,688,688,688,688,688,688,688,688,688,688,688,688,688,688,
-688,688,688,688,688,688,688,688,688,688,688,688,688,688,688,688,
-688,688,688,688,688,688,688,688,688,688,688,688,688,688,688,688,
-688,688,688,688,688,688,688,688,688,688,688,688,688,688,688,688,
-688,688,688,688,688,688,688,688,688,688,688,688,688,688,688,688,
-
-/* block 172 */
-688,688,688,688,688,688,688,688,688,688,688,688,688,688,688,688,
-688,688,688,688,688,688,688,688,688,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-
-/* block 173 */
-689,689,689,689,689,689,689,689,689,689,689,689,689,689,689,689,
-689,689,689,689,689,689,689,689,689,689,689,689,689,689,689,689,
-689,689,689,689,689,689,689,689,689,689,689,689,689,689,689,689,
-689,689,689,689,689,689,689,689,689,689,689,689,689,689,689,689,
-689,689,689,689,689,689,689,689,689,689,689,689,689,689,689,689,
-689,689,689,689,689,689,689,689,689,689,689,689,689,689,689,689,
-689,689,689,689,689,689,689,689,689,689,689,689,689,689,689,114,
-690,690,690,690,690,114,114,114,114,114,114,114,114,114,114,114,
-
-/* block 174 */
-691,691,691,691,691,691,691,691,691,691,691,691,691,691,691,691,
-691,691,691,691,691,691,691,691,691,691,691,691,691,691,691,691,
-691,691,691,691,691,691,691,691,691,691,691,691,691,691,691,691,
-691,691,691,691,691,691,691,691,691,691,691,691,691,691,691,691,
-691,691,691,691,691,691,691,691,691,691,691,691,691,691,691,691,
-691,691,691,691,691,691,691,691,691,691,691,691,691,691,691,691,
-691,691,691,691,691,691,691,691,691,691,691,691,691,691,691,691,
-691,691,691,691,691,691,691,691,691,691,691,691,691,691,691,691,
-
-/* block 175 */
-691,691,691,691,691,691,691,691,691,691,691,691,691,691,691,691,
-691,691,691,691,691,691,691,691,691,691,691,691,691,691,691,691,
-691,691,691,691,691,691,691,691,691,691,691,691,691,691,691,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-
-/* block 176 */
-497,497,497,497,497,497,497,497,497,497,497,497,497,497,497,497,
-497,497,497,497,497,497,497,497,497,497,497,497,497,497,497,497,
-497,497,497,497,497,497,497,497,497,497,497,497,497,497,497,497,
-497,497,497,497,497,497,497,497,497,497,497,497,497,497,497,497,
-497,497,497,497,497,497,497,497,497,497,497,497,497,497,497,497,
-497,497,497,497,497,497,497,497,497,497,497,497,497,497,497,497,
-497,497,497,497,497,497,497,497,497,497,497,497,497,497,497,497,
-497,497,497,497,497,497,497,497,497,497,497,497,497,497,497,497,
-
-/* block 177 */
-497,497,497,497,497,497,497,497,497,497,497,497,497,497,497,497,
-497,497,497,497,497,497,497,497,497,497,497,497,497,497,497,497,
-497,497,497,497,497,497,497,497,497,497,497,497,497,497,497,497,
-497,497,497,497,497,497,497,497,497,114,114,114,114,114,114,114,
-692,692,692,692,692,692,692,692,692,692,692,692,692,692,692,692,
-692,692,692,692,692,692,692,692,692,692,692,692,692,692,692,114,
-693,693,693,693,693,693,693,693,693,693,114,114,114,114,694,694,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-
-/* block 178 */
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-695,695,695,695,695,695,695,695,695,695,695,695,695,695,695,695,
-695,695,695,695,695,695,695,695,695,695,695,695,695,695,114,114,
-696,696,696,696,696,697,114,114,114,114,114,114,114,114,114,114,
-
-/* block 179 */
-698,698,698,698,698,698,698,698,698,698,698,698,698,698,698,698,
-698,698,698,698,698,698,698,698,698,698,698,698,698,698,698,698,
-698,698,698,698,698,698,698,698,698,698,698,698,698,698,698,698,
-699,699,699,699,699,699,699,700,700,700,700,700,701,701,701,701,
-702,702,702,702,700,701,114,114,114,114,114,114,114,114,114,114,
-703,703,703,703,703,703,703,703,703,703,114,704,704,704,704,704,
-704,704,114,698,698,698,698,698,698,698,698,698,698,698,698,698,
-698,698,698,698,698,698,698,698,114,114,114,114,114,698,698,698,
-
-/* block 180 */
-698,698,698,698,698,698,698,698,698,698,698,698,698,698,698,698,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-
-/* block 181 */
-705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,
-705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,
-705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,
-705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,
-705,705,705,705,705,114,114,114,114,114,114,114,114,114,114,114,
-705,706,706,706,706,706,706,706,706,706,706,706,706,706,706,706,
-706,706,706,706,706,706,706,706,706,706,706,706,706,706,706,706,
-706,706,706,706,706,706,706,706,706,706,706,706,706,706,706,114,
-
-/* block 182 */
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,707,
-707,707,707,708,708,708,708,708,708,708,708,708,708,708,708,708,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-
-/* block 183 */
-478,476,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-
-/* block 184 */
-709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,
-709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,
-709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,
-709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,
-709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,
-709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,
-709,709,709,709,709,709,709,709,709,709,709,114,114,114,114,114,
-709,709,709,709,709,709,709,709,709,709,709,709,709,114,114,114,
-
-/* block 185 */
-709,709,709,709,709,709,709,709,709,114,114,114,114,114,114,114,
-709,709,709,709,709,709,709,709,709,709,114,114,710,711,711,712,
- 22, 22, 22, 22,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-
-/* block 186 */
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19,114,114,114,114,114,114,114,114,114,114,
-
-/* block 187 */
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19,114,114, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19,713,405,109,109,109, 19, 19, 19,405,713,713,
-713,713,713, 22, 22, 22, 22, 22, 22, 22, 22,109,109,109,109,109,
-
-/* block 188 */
-109,109,109, 19, 19,109,109,109,109,109,109,109, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,109,109,109,109, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-
-/* block 189 */
-559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,
-559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,
-559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,
-559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,
-559,559,714,714,714,559,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-
-/* block 190 */
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19,114,114,114,114,114,114,114,114,114,
- 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
- 23, 23,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-
-/* block 191 */
-437,437,437,437,437,437,437,437,437,437,437,437,437,437,437,437,
-437,437,437,437,437,437,437,437,437,437,438,438,438,438,438,438,
-438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,
-438,438,438,438,437,437,437,437,437,437,437,437,437,437,437,437,
-437,437,437,437,437,437,437,437,437,437,437,437,437,437,438,438,
-438,438,438,438,438,114,438,438,438,438,438,438,438,438,438,438,
-438,438,438,438,438,438,438,438,437,437,437,437,437,437,437,437,
-437,437,437,437,437,437,437,437,437,437,437,437,437,437,437,437,
-
-/* block 192 */
-437,437,438,438,438,438,438,438,438,438,438,438,438,438,438,438,
-438,438,438,438,438,438,438,438,438,438,438,438,437,114,437,437,
-114,114,437,114,114,437,437,114,114,437,437,437,437,114,437,437,
-437,437,437,437,437,437,438,438,438,438,114,438,114,438,438,438,
-438,438,438,438,114,438,438,438,438,438,438,438,438,438,438,438,
-437,437,437,437,437,437,437,437,437,437,437,437,437,437,437,437,
-437,437,437,437,437,437,437,437,437,437,438,438,438,438,438,438,
-438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,
-
-/* block 193 */
-438,438,438,438,437,437,114,437,437,437,437,114,114,437,437,437,
-437,437,437,437,437,114,437,437,437,437,437,437,437,114,438,438,
-438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,
-438,438,438,438,438,438,438,438,437,437,114,437,437,437,437,114,
-437,437,437,437,437,114,437,114,114,114,437,437,437,437,437,437,
-437,114,438,438,438,438,438,438,438,438,438,438,438,438,438,438,
-438,438,438,438,438,438,438,438,438,438,438,438,437,437,437,437,
-437,437,437,437,437,437,437,437,437,437,437,437,437,437,437,437,
-
-/* block 194 */
-437,437,437,437,437,437,438,438,438,438,438,438,438,438,438,438,
-438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,
-437,437,437,437,437,437,437,437,437,437,437,437,437,437,437,437,
-437,437,437,437,437,437,437,437,437,437,438,438,438,438,438,438,
-438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,
-438,438,438,438,437,437,437,437,437,437,437,437,437,437,437,437,
-437,437,437,437,437,437,437,437,437,437,437,437,437,437,438,438,
-438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,
-
-/* block 195 */
-438,438,438,438,438,438,438,438,437,437,437,437,437,437,437,437,
-437,437,437,437,437,437,437,437,437,437,437,437,437,437,437,437,
-437,437,438,438,438,438,438,438,438,438,438,438,438,438,438,438,
-438,438,438,438,438,438,438,438,438,438,438,438,437,437,437,437,
-437,437,437,437,437,437,437,437,437,437,437,437,437,437,437,437,
-437,437,437,437,437,437,438,438,438,438,438,438,438,438,438,438,
-438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,
-437,437,437,437,437,437,437,437,437,437,437,437,437,437,437,437,
-
-/* block 196 */
-437,437,437,437,437,437,437,437,437,437,438,438,438,438,438,438,
-438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,
-438,438,438,438,438,438,114,114,437,437,437,437,437,437,437,437,
-437,437,437,437,437,437,437,437,437,437,437,437,437,437,437,437,
-437,  8,438,438,438,438,438,438,438,438,438,438,438,438,438,438,
-438,438,438,438,438,438,438,438,438,438,438,  8,438,438,438,438,
-438,438,437,437,437,437,437,437,437,437,437,437,437,437,437,437,
-437,437,437,437,437,437,437,437,437,437,437,  8,438,438,438,438,
-
-/* block 197 */
-438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,
-438,438,438,438,438,  8,438,438,438,438,438,438,437,437,437,437,
-437,437,437,437,437,437,437,437,437,437,437,437,437,437,437,437,
-437,437,437,437,437,  8,438,438,438,438,438,438,438,438,438,438,
-438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,  8,
-438,438,438,438,438,438,437,437,437,437,437,437,437,437,437,437,
-437,437,437,437,437,437,437,437,437,437,437,437,437,437,437,  8,
-438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,
-
-/* block 198 */
-438,438,438,438,438,438,438,438,438,  8,438,438,438,438,438,438,
-437,437,437,437,437,437,437,437,437,437,437,437,437,437,437,437,
-437,437,437,437,437,437,437,437,437,  8,438,438,438,438,438,438,
-438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,
-438,438,438,  8,438,438,438,438,438,438,437,438,114,114, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-
-/* block 199 */
-715,715,715,715,715,715,715,715,715,715,715,715,715,715,715,715,
-715,715,715,715,715,715,715,715,715,715,715,715,715,715,715,715,
-715,715,715,715,715,715,715,715,715,715,715,715,715,715,715,715,
-715,715,715,715,715,715,715,715,715,715,715,715,715,715,715,715,
-715,715,715,715,715,715,715,715,715,715,715,715,715,715,715,715,
-715,715,715,715,715,715,715,715,715,715,715,715,715,715,715,715,
-715,715,715,715,715,715,715,715,715,715,715,715,715,715,715,715,
-715,715,715,715,715,715,715,715,715,715,715,715,715,715,715,715,
-
-/* block 200 */
-715,715,715,715,715,715,715,715,715,715,715,715,715,715,715,715,
-715,715,715,715,715,715,715,715,715,715,715,715,715,715,715,715,
-715,715,715,715,715,715,715,715,715,715,715,715,715,715,715,715,
-715,715,715,715,715,715,715,715,715,715,715,715,715,715,715,715,
-715,715,715,715,715,114,114,716,716,716,716,716,716,716,716,716,
-717,717,717,717,717,717,717,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-
-/* block 201 */
-199,199,199,199,114,199,199,199,199,199,199,199,199,199,199,199,
-199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,
-114,199,199,114,199,114,114,199,114,199,199,199,199,199,199,199,
-199,199,199,114,199,199,199,199,114,199,114,199,114,114,114,114,
-114,114,199,114,114,114,114,199,114,199,114,199,114,199,199,199,
-114,199,199,114,199,114,114,199,114,199,114,199,114,199,114,199,
-114,199,199,114,199,114,114,199,199,199,199,114,199,199,199,199,
-199,199,199,114,199,199,199,199,114,199,199,199,199,114,199,114,
-
-/* block 202 */
-199,199,199,199,199,199,199,199,199,199,114,199,199,199,199,199,
-199,199,199,199,199,199,199,199,199,199,199,199,114,114,114,114,
-114,199,199,199,114,199,199,199,199,199,114,199,199,199,199,199,
-199,199,199,199,199,199,199,199,199,199,199,199,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-194,194,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-
-/* block 203 */
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,114,114,114,114,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
-
-/* block 204 */
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19,114,114,114,114,114,114,114,114,114,114,114,114,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,114,
-114, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
-114, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
-114, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19,114,114,114,114,114,114,114,114,114,114,
-
-/* block 205 */
- 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,114,114,114,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,114,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,114,114,114,114,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
-
-/* block 206 */
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,718,718,718,718,718,718,718,718,718,718,
-718,718,718,718,718,718,718,718,718,718,718,718,718,718,718,718,
-
-/* block 207 */
-719, 19, 19,114,114,114,114,114,114,114,114,114,114,114,114,114,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,114,114,114,114,114,
- 19, 19, 19, 19, 19, 19, 19, 19, 19,114,114,114,114,114,114,114,
- 19, 19,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-
-/* block 208 */
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,114,114,114,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,114,114,
-
-/* block 209 */
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,114,
-114,114,114,114, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,114,114,114,114,114,114,114,114,
-
-/* block 210 */
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,114,
-
-/* block 211 */
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,114,114,114,114,114,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,114, 19, 19, 19, 19, 19,
-
-/* block 212 */
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19,114, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
-
-/* block 213 */
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19,114,114, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
-
-/* block 214 */
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,114,114,114,
- 19, 19, 19, 19,114,114,114,114,114,114,114,114,114,114,114,114,
-
-/* block 215 */
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19,114,114,114,114,114,114,114,114,114,114,114,114,
-
-/* block 216 */
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-
-/* block 217 */
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,114,114,114,114,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,114,114,114,114,114,114,114,114,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,114,114,114,114,114,114,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
-
-/* block 218 */
- 19, 19, 19, 19, 19, 19, 19, 19,114,114,114,114,114,114,114,114,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-
-/* block 219 */
-484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,
-484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,
-484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,
-484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,
-484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,
-484,484,484,484,484,484,484,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-
-/* block 220 */
-484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,
-484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,
-484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,
-484,484,484,484,484,114,114,114,114,114,114,114,114,114,114,114,
-484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,
-484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,
-484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,
-484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,
-
-/* block 221 */
-484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,
-484,484,484,484,484,484,484,484,484,484,484,484,484,484,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,
-
-/* block 222 */
-436, 22,436,436,436,436,436,436,436,436,436,436,436,436,436,436,
-436,436,436,436,436,436,436,436,436,436,436,436,436,436,436,436,
- 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
- 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
- 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
- 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
- 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
- 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
-
-/* block 223 */
-436,436,436,436,436,436,436,436,436,436,436,436,436,436,436,436,
-436,436,436,436,436,436,436,436,436,436,436,436,436,436,436,436,
-436,436,436,436,436,436,436,436,436,436,436,436,436,436,436,436,
-436,436,436,436,436,436,436,436,436,436,436,436,436,436,436,436,
-436,436,436,436,436,436,436,436,436,436,436,436,436,436,436,436,
-436,436,436,436,436,436,436,436,436,436,436,436,436,436,436,436,
-436,436,436,436,436,436,436,436,436,436,436,436,436,436,436,436,
-436,436,436,436,436,436,436,436,436,436,436,436,436,436,436,436,
-
-/* block 224 */
-109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,
-109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,
-109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,
-109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,
-109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,
-109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,
-109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,
-109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,
-
-/* block 225 */
-109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,
-109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,
-109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,
-109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,
-109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,
-109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,
-109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,
-436,436,436,436,436,436,436,436,436,436,436,436,436,436,436,436,
-
-/* block 226 */
-552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,
-552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,
-552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,
-552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,
-552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,
-552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,
-552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,
-552,552,552,552,552,552,552,552,552,552,552,552,552,552,114,114,
-
-};
-
-#if UCD_BLOCK_SIZE != 128
-#error Please correct UCD_BLOCK_SIZE in pcre_internal.h
-#endif
-#endif  /* SUPPORT_UCP */
-
-#endif  /* PCRE_INCLUDED */
diff --git a/dist/pcre_valid_utf8.c b/dist/pcre_valid_utf8.c
deleted file mode 100644
index 3b0f646..0000000
--- a/dist/pcre_valid_utf8.c
+++ /dev/null
@@ -1,301 +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
-           Copyright (c) 1997-2013 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. */
-
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include "pcre_internal.h"
-
-
-/*************************************************
-*         Validate a UTF-8 string                *
-*************************************************/
-
-/* This function is called (optionally) at the start of compile or match, to
-check 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.
-
-Originally, this function checked according to RFC 2279, allowing for values in
-the range 0 to 0x7fffffff, up to 6 bytes long, but ensuring that they were in
-the canonical format. Once somebody had pointed out RFC 3629 to me (it
-obsoletes 2279), additional restrictions were applied. The values are now
-limited to be between 0 and 0x0010ffff, no more than 4 bytes long, and the
-subrange 0xd000 to 0xdfff is excluded. However, the format of 5-byte and 6-byte
-characters is still checked.
-
-From release 8.13 more information about the details of the error are passed
-back in the returned value:
-
-PCRE_UTF8_ERR0   No error
-PCRE_UTF8_ERR1   Missing 1 byte at the end of the string
-PCRE_UTF8_ERR2   Missing 2 bytes at the end of the string
-PCRE_UTF8_ERR3   Missing 3 bytes at the end of the string
-PCRE_UTF8_ERR4   Missing 4 bytes at the end of the string
-PCRE_UTF8_ERR5   Missing 5 bytes at the end of the string
-PCRE_UTF8_ERR6   2nd-byte's two top bits are not 0x80
-PCRE_UTF8_ERR7   3rd-byte's two top bits are not 0x80
-PCRE_UTF8_ERR8   4th-byte's two top bits are not 0x80
-PCRE_UTF8_ERR9   5th-byte's two top bits are not 0x80
-PCRE_UTF8_ERR10  6th-byte's two top bits are not 0x80
-PCRE_UTF8_ERR11  5-byte character is not permitted by RFC 3629
-PCRE_UTF8_ERR12  6-byte character is not permitted by RFC 3629
-PCRE_UTF8_ERR13  4-byte character with value > 0x10ffff is not permitted
-PCRE_UTF8_ERR14  3-byte character with value 0xd000-0xdfff is not permitted
-PCRE_UTF8_ERR15  Overlong 2-byte sequence
-PCRE_UTF8_ERR16  Overlong 3-byte sequence
-PCRE_UTF8_ERR17  Overlong 4-byte sequence
-PCRE_UTF8_ERR18  Overlong 5-byte sequence (won't ever occur)
-PCRE_UTF8_ERR19  Overlong 6-byte sequence (won't ever occur)
-PCRE_UTF8_ERR20  Isolated 0x80 byte (not within UTF-8 character)
-PCRE_UTF8_ERR21  Byte with the illegal value 0xfe or 0xff
-PCRE_UTF8_ERR22  Unused (was non-character)
-
-Arguments:
-  string       points to the string
-  length       length of string, or -1 if the string is zero-terminated
-  errp         pointer to an error position offset variable
-
-Returns:       = 0    if the string is a valid UTF-8 string
-               > 0    otherwise, setting the offset of the bad character
-*/
-
-int
-PRIV(valid_utf)(PCRE_PUCHAR string, int length, int *erroroffset)
-{
-#ifdef SUPPORT_UTF
-register PCRE_PUCHAR p;
-
-if (length < 0)
-  {
-  for (p = string; *p != 0; p++);
-  length = (int)(p - string);
-  }
-
-for (p = string; length-- > 0; p++)
-  {
-  register pcre_uchar ab, c, d;
-
-  c = *p;
-  if (c < 128) continue;                /* ASCII character */
-
-  if (c < 0xc0)                         /* Isolated 10xx xxxx byte */
-    {
-    *erroroffset = (int)(p - string);
-    return PCRE_UTF8_ERR20;
-    }
-
-  if (c >= 0xfe)                        /* Invalid 0xfe or 0xff bytes */
-    {
-    *erroroffset = (int)(p - string);
-    return PCRE_UTF8_ERR21;
-    }
-
-  ab = PRIV(utf8_table4)[c & 0x3f];     /* Number of additional bytes */
-  if (length < ab)
-    {
-    *erroroffset = (int)(p - string);          /* Missing bytes */
-    return ab - length;                 /* Codes ERR1 to ERR5 */
-    }
-  length -= ab;                         /* Length remaining */
-
-  /* Check top bits in the second byte */
-
-  if (((d = *(++p)) & 0xc0) != 0x80)
-    {
-    *erroroffset = (int)(p - string) - 1;
-    return PCRE_UTF8_ERR6;
-    }
-
-  /* For each length, check that the remaining bytes start with the 0x80 bit
-  set and not the 0x40 bit. Then check for an overlong sequence, and for the
-  excluded range 0xd800 to 0xdfff. */
-
-  switch (ab)
-    {
-    /* 2-byte character. No further bytes to check for 0x80. Check first byte
-    for for xx00 000x (overlong sequence). */
-
-    case 1: if ((c & 0x3e) == 0)
-      {
-      *erroroffset = (int)(p - string) - 1;
-      return PCRE_UTF8_ERR15;
-      }
-    break;
-
-    /* 3-byte character. Check third byte for 0x80. Then check first 2 bytes
-      for 1110 0000, xx0x xxxx (overlong sequence) or
-          1110 1101, 1010 xxxx (0xd800 - 0xdfff) */
-
-    case 2:
-    if ((*(++p) & 0xc0) != 0x80)     /* Third byte */
-      {
-      *erroroffset = (int)(p - string) - 2;
-      return PCRE_UTF8_ERR7;
-      }
-    if (c == 0xe0 && (d & 0x20) == 0)
-      {
-      *erroroffset = (int)(p - string) - 2;
-      return PCRE_UTF8_ERR16;
-      }
-    if (c == 0xed && d >= 0xa0)
-      {
-      *erroroffset = (int)(p - string) - 2;
-      return PCRE_UTF8_ERR14;
-      }
-    break;
-
-    /* 4-byte character. Check 3rd and 4th bytes for 0x80. Then check first 2
-       bytes for for 1111 0000, xx00 xxxx (overlong sequence), then check for a
-       character greater than 0x0010ffff (f4 8f bf bf) */
-
-    case 3:
-    if ((*(++p) & 0xc0) != 0x80)     /* Third byte */
-      {
-      *erroroffset = (int)(p - string) - 2;
-      return PCRE_UTF8_ERR7;
-      }
-    if ((*(++p) & 0xc0) != 0x80)     /* Fourth byte */
-      {
-      *erroroffset = (int)(p - string) - 3;
-      return PCRE_UTF8_ERR8;
-      }
-    if (c == 0xf0 && (d & 0x30) == 0)
-      {
-      *erroroffset = (int)(p - string) - 3;
-      return PCRE_UTF8_ERR17;
-      }
-    if (c > 0xf4 || (c == 0xf4 && d > 0x8f))
-      {
-      *erroroffset = (int)(p - string) - 3;
-      return PCRE_UTF8_ERR13;
-      }
-    break;
-
-    /* 5-byte and 6-byte characters are not allowed by RFC 3629, and will be
-    rejected by the length test below. However, we do the appropriate tests
-    here so that overlong sequences get diagnosed, and also in case there is
-    ever an option for handling these larger code points. */
-
-    /* 5-byte character. Check 3rd, 4th, and 5th bytes for 0x80. Then check for
-    1111 1000, xx00 0xxx */
-
-    case 4:
-    if ((*(++p) & 0xc0) != 0x80)     /* Third byte */
-      {
-      *erroroffset = (int)(p - string) - 2;
-      return PCRE_UTF8_ERR7;
-      }
-    if ((*(++p) & 0xc0) != 0x80)     /* Fourth byte */
-      {
-      *erroroffset = (int)(p - string) - 3;
-      return PCRE_UTF8_ERR8;
-      }
-    if ((*(++p) & 0xc0) != 0x80)     /* Fifth byte */
-      {
-      *erroroffset = (int)(p - string) - 4;
-      return PCRE_UTF8_ERR9;
-      }
-    if (c == 0xf8 && (d & 0x38) == 0)
-      {
-      *erroroffset = (int)(p - string) - 4;
-      return PCRE_UTF8_ERR18;
-      }
-    break;
-
-    /* 6-byte character. Check 3rd-6th bytes for 0x80. Then check for
-    1111 1100, xx00 00xx. */
-
-    case 5:
-    if ((*(++p) & 0xc0) != 0x80)     /* Third byte */
-      {
-      *erroroffset = (int)(p - string) - 2;
-      return PCRE_UTF8_ERR7;
-      }
-    if ((*(++p) & 0xc0) != 0x80)     /* Fourth byte */
-      {
-      *erroroffset = (int)(p - string) - 3;
-      return PCRE_UTF8_ERR8;
-      }
-    if ((*(++p) & 0xc0) != 0x80)     /* Fifth byte */
-      {
-      *erroroffset = (int)(p - string) - 4;
-      return PCRE_UTF8_ERR9;
-      }
-    if ((*(++p) & 0xc0) != 0x80)     /* Sixth byte */
-      {
-      *erroroffset = (int)(p - string) - 5;
-      return PCRE_UTF8_ERR10;
-      }
-    if (c == 0xfc && (d & 0x3c) == 0)
-      {
-      *erroroffset = (int)(p - string) - 5;
-      return PCRE_UTF8_ERR19;
-      }
-    break;
-    }
-
-  /* Character is valid under RFC 2279, but 4-byte and 5-byte characters are
-  excluded by RFC 3629. The pointer p is currently at the last byte of the
-  character. */
-
-  if (ab > 3)
-    {
-    *erroroffset = (int)(p - string) - ab;
-    return (ab == 4)? PCRE_UTF8_ERR11 : PCRE_UTF8_ERR12;
-    }
-  }
-
-#else  /* Not SUPPORT_UTF */
-(void)(string);  /* Keep picky compilers happy */
-(void)(length);
-(void)(erroroffset);
-#endif
-
-return PCRE_UTF8_ERR0;   /* This indicates success */
-}
-
-/* End of pcre_valid_utf8.c */
diff --git a/dist/pcre_version.c b/dist/pcre_version.c
deleted file mode 100644
index ae86ff2..0000000
--- a/dist/pcre_version.c
+++ /dev/null
@@ -1,98 +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
-           Copyright (c) 1997-2012 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. */
-
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include "pcre_internal.h"
-
-
-/*************************************************
-*          Return version string                 *
-*************************************************/
-
-/* These macros are the standard way of turning unquoted text into C strings.
-They allow macros like PCRE_MAJOR to be defined without quotes, which is
-convenient for user programs that want to test its value. */
-
-#define STRING(a)  # a
-#define XSTRING(s) STRING(s)
-
-/* A problem turned up with PCRE_PRERELEASE, which is defined empty for
-production releases. Originally, it was used naively in this code:
-
-  return XSTRING(PCRE_MAJOR)
-         "." XSTRING(PCRE_MINOR)
-             XSTRING(PCRE_PRERELEASE)
-         " " XSTRING(PCRE_DATE);
-
-However, when PCRE_PRERELEASE is empty, this leads to an attempted expansion of
-STRING(). The C standard states: "If (before argument substitution) any
-argument consists of no preprocessing tokens, the behavior is undefined." It
-turns out the gcc treats this case as a single empty string - which is what we
-really want - but Visual C grumbles about the lack of an argument for the
-macro. Unfortunately, both are within their rights. To cope with both ways of
-handling this, I had resort to some messy hackery that does a test at run time.
-I could find no way of detecting that a macro is defined as an empty string at
-pre-processor time. This hack uses a standard trick for avoiding calling
-the STRING macro with an empty argument when doing the test. */
-
-#if defined COMPILE_PCRE8
-PCRE_EXP_DEFN const char * PCRE_CALL_CONVENTION
-pcre_version(void)
-#elif defined COMPILE_PCRE16
-PCRE_EXP_DEFN const char * PCRE_CALL_CONVENTION
-pcre16_version(void)
-#elif defined COMPILE_PCRE32
-PCRE_EXP_DEFN const char * PCRE_CALL_CONVENTION
-pcre32_version(void)
-#endif
-{
-return (XSTRING(Z PCRE_PRERELEASE)[1] == 0)?
-  XSTRING(PCRE_MAJOR.PCRE_MINOR PCRE_DATE) :
-  XSTRING(PCRE_MAJOR.PCRE_MINOR) XSTRING(PCRE_PRERELEASE PCRE_DATE);
-}
-
-/* End of pcre_version.c */
diff --git a/dist/pcrecpp.cc b/dist/pcrecpp.cc
deleted file mode 100644
index c595cbc..0000000
--- a/dist/pcrecpp.cc
+++ /dev/null
@@ -1,924 +0,0 @@
-// Copyright (c) 2010, Google Inc.
-// All rights reserved.
-//
-// 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 Google Inc. 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.
-//
-// Author: Sanjay Ghemawat
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <ctype.h>
-#include <limits.h>      /* for SHRT_MIN, USHRT_MAX, etc */
-#include <string.h>      /* for memcpy */
-#include <assert.h>
-#include <errno.h>
-#include <string>
-#include <algorithm>
-
-#include "pcrecpp_internal.h"
-#include "pcre.h"
-#include "pcrecpp.h"
-#include "pcre_stringpiece.h"
-
-
-namespace pcrecpp {
-
-// Maximum number of args we can set
-static const int kMaxArgs = 16;
-static const int kVecSize = (1 + kMaxArgs) * 3;  // results + PCRE workspace
-
-// Special object that stands-in for no argument
-Arg RE::no_arg((void*)NULL);
-
-// This is for ABI compatibility with old versions of pcre (pre-7.6),
-// which defined a global no_arg variable instead of putting it in the
-// RE class.  This works on GCC >= 3, at least.  It definitely works
-// for ELF, but may not for other object formats (Mach-O, for
-// instance, does not support aliases.)  We could probably have a more
-// inclusive test if we ever needed it.  (Note that not only the
-// __attribute__ syntax, but also __USER_LABEL_PREFIX__, are
-// gnu-specific.)
-#if defined(__GNUC__) && __GNUC__ >= 3 && defined(__ELF__)
-# define ULP_AS_STRING(x)            ULP_AS_STRING_INTERNAL(x)
-# define ULP_AS_STRING_INTERNAL(x)   #x
-# define USER_LABEL_PREFIX_STR       ULP_AS_STRING(__USER_LABEL_PREFIX__)
-extern Arg no_arg
-  __attribute__((alias(USER_LABEL_PREFIX_STR "_ZN7pcrecpp2RE6no_argE")));
-#endif
-
-// If a regular expression has no error, its error_ field points here
-static const string empty_string;
-
-// If the user doesn't ask for any options, we just use this one
-static RE_Options default_options;
-
-void RE::Init(const string& pat, const RE_Options* options) {
-  pattern_ = pat;
-  if (options == NULL) {
-    options_ = default_options;
-  } else {
-    options_ = *options;
-  }
-  error_ = &empty_string;
-  re_full_ = NULL;
-  re_partial_ = NULL;
-
-  re_partial_ = Compile(UNANCHORED);
-  if (re_partial_ != NULL) {
-    re_full_ = Compile(ANCHOR_BOTH);
-  }
-}
-
-void RE::Cleanup() {
-  if (re_full_ != NULL)         (*pcre_free)(re_full_);
-  if (re_partial_ != NULL)      (*pcre_free)(re_partial_);
-  if (error_ != &empty_string)  delete error_;
-}
-
-
-RE::~RE() {
-  Cleanup();
-}
-
-
-pcre* RE::Compile(Anchor anchor) {
-  // First, convert RE_Options into pcre options
-  int pcre_options = 0;
-  pcre_options = options_.all_options();
-
-  // Special treatment for anchoring.  This is needed because at
-  // runtime pcre only provides an option for anchoring at the
-  // beginning of a string (unless you use offset).
-  //
-  // There are three types of anchoring we want:
-  //    UNANCHORED      Compile the original pattern, and use
-  //                    a pcre unanchored match.
-  //    ANCHOR_START    Compile the original pattern, and use
-  //                    a pcre anchored match.
-  //    ANCHOR_BOTH     Tack a "\z" to the end of the original pattern
-  //                    and use a pcre anchored match.
-
-  const char* compile_error;
-  int eoffset;
-  pcre* re;
-  if (anchor != ANCHOR_BOTH) {
-    re = pcre_compile(pattern_.c_str(), pcre_options,
-                      &compile_error, &eoffset, NULL);
-  } else {
-    // Tack a '\z' at the end of RE.  Parenthesize it first so that
-    // the '\z' applies to all top-level alternatives in the regexp.
-    string wrapped = "(?:";  // A non-counting grouping operator
-    wrapped += pattern_;
-    wrapped += ")\\z";
-    re = pcre_compile(wrapped.c_str(), pcre_options,
-                      &compile_error, &eoffset, NULL);
-  }
-  if (re == NULL) {
-    if (error_ == &empty_string) error_ = new string(compile_error);
-  }
-  return re;
-}
-
-/***** Matching interfaces *****/
-
-bool RE::FullMatch(const StringPiece& text,
-                   const Arg& ptr1,
-                   const Arg& ptr2,
-                   const Arg& ptr3,
-                   const Arg& ptr4,
-                   const Arg& ptr5,
-                   const Arg& ptr6,
-                   const Arg& ptr7,
-                   const Arg& ptr8,
-                   const Arg& ptr9,
-                   const Arg& ptr10,
-                   const Arg& ptr11,
-                   const Arg& ptr12,
-                   const Arg& ptr13,
-                   const Arg& ptr14,
-                   const Arg& ptr15,
-                   const Arg& ptr16) const {
-  const Arg* args[kMaxArgs];
-  int n = 0;
-  if (&ptr1  == &no_arg) goto done; args[n++] = &ptr1;
-  if (&ptr2  == &no_arg) goto done; args[n++] = &ptr2;
-  if (&ptr3  == &no_arg) goto done; args[n++] = &ptr3;
-  if (&ptr4  == &no_arg) goto done; args[n++] = &ptr4;
-  if (&ptr5  == &no_arg) goto done; args[n++] = &ptr5;
-  if (&ptr6  == &no_arg) goto done; args[n++] = &ptr6;
-  if (&ptr7  == &no_arg) goto done; args[n++] = &ptr7;
-  if (&ptr8  == &no_arg) goto done; args[n++] = &ptr8;
-  if (&ptr9  == &no_arg) goto done; args[n++] = &ptr9;
-  if (&ptr10 == &no_arg) goto done; args[n++] = &ptr10;
-  if (&ptr11 == &no_arg) goto done; args[n++] = &ptr11;
-  if (&ptr12 == &no_arg) goto done; args[n++] = &ptr12;
-  if (&ptr13 == &no_arg) goto done; args[n++] = &ptr13;
-  if (&ptr14 == &no_arg) goto done; args[n++] = &ptr14;
-  if (&ptr15 == &no_arg) goto done; args[n++] = &ptr15;
-  if (&ptr16 == &no_arg) goto done; args[n++] = &ptr16;
- done:
-
-  int consumed;
-  int vec[kVecSize];
-  return DoMatchImpl(text, ANCHOR_BOTH, &consumed, args, n, vec, kVecSize);
-}
-
-bool RE::PartialMatch(const StringPiece& text,
-                      const Arg& ptr1,
-                      const Arg& ptr2,
-                      const Arg& ptr3,
-                      const Arg& ptr4,
-                      const Arg& ptr5,
-                      const Arg& ptr6,
-                      const Arg& ptr7,
-                      const Arg& ptr8,
-                      const Arg& ptr9,
-                      const Arg& ptr10,
-                      const Arg& ptr11,
-                      const Arg& ptr12,
-                      const Arg& ptr13,
-                      const Arg& ptr14,
-                      const Arg& ptr15,
-                      const Arg& ptr16) const {
-  const Arg* args[kMaxArgs];
-  int n = 0;
-  if (&ptr1  == &no_arg) goto done; args[n++] = &ptr1;
-  if (&ptr2  == &no_arg) goto done; args[n++] = &ptr2;
-  if (&ptr3  == &no_arg) goto done; args[n++] = &ptr3;
-  if (&ptr4  == &no_arg) goto done; args[n++] = &ptr4;
-  if (&ptr5  == &no_arg) goto done; args[n++] = &ptr5;
-  if (&ptr6  == &no_arg) goto done; args[n++] = &ptr6;
-  if (&ptr7  == &no_arg) goto done; args[n++] = &ptr7;
-  if (&ptr8  == &no_arg) goto done; args[n++] = &ptr8;
-  if (&ptr9  == &no_arg) goto done; args[n++] = &ptr9;
-  if (&ptr10 == &no_arg) goto done; args[n++] = &ptr10;
-  if (&ptr11 == &no_arg) goto done; args[n++] = &ptr11;
-  if (&ptr12 == &no_arg) goto done; args[n++] = &ptr12;
-  if (&ptr13 == &no_arg) goto done; args[n++] = &ptr13;
-  if (&ptr14 == &no_arg) goto done; args[n++] = &ptr14;
-  if (&ptr15 == &no_arg) goto done; args[n++] = &ptr15;
-  if (&ptr16 == &no_arg) goto done; args[n++] = &ptr16;
- done:
-
-  int consumed;
-  int vec[kVecSize];
-  return DoMatchImpl(text, UNANCHORED, &consumed, args, n, vec, kVecSize);
-}
-
-bool RE::Consume(StringPiece* input,
-                 const Arg& ptr1,
-                 const Arg& ptr2,
-                 const Arg& ptr3,
-                 const Arg& ptr4,
-                 const Arg& ptr5,
-                 const Arg& ptr6,
-                 const Arg& ptr7,
-                 const Arg& ptr8,
-                 const Arg& ptr9,
-                 const Arg& ptr10,
-                 const Arg& ptr11,
-                 const Arg& ptr12,
-                 const Arg& ptr13,
-                 const Arg& ptr14,
-                 const Arg& ptr15,
-                 const Arg& ptr16) const {
-  const Arg* args[kMaxArgs];
-  int n = 0;
-  if (&ptr1  == &no_arg) goto done; args[n++] = &ptr1;
-  if (&ptr2  == &no_arg) goto done; args[n++] = &ptr2;
-  if (&ptr3  == &no_arg) goto done; args[n++] = &ptr3;
-  if (&ptr4  == &no_arg) goto done; args[n++] = &ptr4;
-  if (&ptr5  == &no_arg) goto done; args[n++] = &ptr5;
-  if (&ptr6  == &no_arg) goto done; args[n++] = &ptr6;
-  if (&ptr7  == &no_arg) goto done; args[n++] = &ptr7;
-  if (&ptr8  == &no_arg) goto done; args[n++] = &ptr8;
-  if (&ptr9  == &no_arg) goto done; args[n++] = &ptr9;
-  if (&ptr10 == &no_arg) goto done; args[n++] = &ptr10;
-  if (&ptr11 == &no_arg) goto done; args[n++] = &ptr11;
-  if (&ptr12 == &no_arg) goto done; args[n++] = &ptr12;
-  if (&ptr13 == &no_arg) goto done; args[n++] = &ptr13;
-  if (&ptr14 == &no_arg) goto done; args[n++] = &ptr14;
-  if (&ptr15 == &no_arg) goto done; args[n++] = &ptr15;
-  if (&ptr16 == &no_arg) goto done; args[n++] = &ptr16;
- done:
-
-  int consumed;
-  int vec[kVecSize];
-  if (DoMatchImpl(*input, ANCHOR_START, &consumed,
-                  args, n, vec, kVecSize)) {
-    input->remove_prefix(consumed);
-    return true;
-  } else {
-    return false;
-  }
-}
-
-bool RE::FindAndConsume(StringPiece* input,
-                        const Arg& ptr1,
-                        const Arg& ptr2,
-                        const Arg& ptr3,
-                        const Arg& ptr4,
-                        const Arg& ptr5,
-                        const Arg& ptr6,
-                        const Arg& ptr7,
-                        const Arg& ptr8,
-                        const Arg& ptr9,
-                        const Arg& ptr10,
-                        const Arg& ptr11,
-                        const Arg& ptr12,
-                        const Arg& ptr13,
-                        const Arg& ptr14,
-                        const Arg& ptr15,
-                        const Arg& ptr16) const {
-  const Arg* args[kMaxArgs];
-  int n = 0;
-  if (&ptr1  == &no_arg) goto done; args[n++] = &ptr1;
-  if (&ptr2  == &no_arg) goto done; args[n++] = &ptr2;
-  if (&ptr3  == &no_arg) goto done; args[n++] = &ptr3;
-  if (&ptr4  == &no_arg) goto done; args[n++] = &ptr4;
-  if (&ptr5  == &no_arg) goto done; args[n++] = &ptr5;
-  if (&ptr6  == &no_arg) goto done; args[n++] = &ptr6;
-  if (&ptr7  == &no_arg) goto done; args[n++] = &ptr7;
-  if (&ptr8  == &no_arg) goto done; args[n++] = &ptr8;
-  if (&ptr9  == &no_arg) goto done; args[n++] = &ptr9;
-  if (&ptr10 == &no_arg) goto done; args[n++] = &ptr10;
-  if (&ptr11 == &no_arg) goto done; args[n++] = &ptr11;
-  if (&ptr12 == &no_arg) goto done; args[n++] = &ptr12;
-  if (&ptr13 == &no_arg) goto done; args[n++] = &ptr13;
-  if (&ptr14 == &no_arg) goto done; args[n++] = &ptr14;
-  if (&ptr15 == &no_arg) goto done; args[n++] = &ptr15;
-  if (&ptr16 == &no_arg) goto done; args[n++] = &ptr16;
- done:
-
-  int consumed;
-  int vec[kVecSize];
-  if (DoMatchImpl(*input, UNANCHORED, &consumed,
-                  args, n, vec, kVecSize)) {
-    input->remove_prefix(consumed);
-    return true;
-  } else {
-    return false;
-  }
-}
-
-bool RE::Replace(const StringPiece& rewrite,
-                 string *str) const {
-  int vec[kVecSize];
-  int matches = TryMatch(*str, 0, UNANCHORED, true, vec, kVecSize);
-  if (matches == 0)
-    return false;
-
-  string s;
-  if (!Rewrite(&s, rewrite, *str, vec, matches))
-    return false;
-
-  assert(vec[0] >= 0);
-  assert(vec[1] >= 0);
-  str->replace(vec[0], vec[1] - vec[0], s);
-  return true;
-}
-
-// Returns PCRE_NEWLINE_CRLF, PCRE_NEWLINE_CR, or PCRE_NEWLINE_LF.
-// Note that PCRE_NEWLINE_CRLF is defined to be P_N_CR | P_N_LF.
-// Modified by PH to add PCRE_NEWLINE_ANY and PCRE_NEWLINE_ANYCRLF.
-
-static int NewlineMode(int pcre_options) {
-  // TODO: if we can make it threadsafe, cache this var
-  int newline_mode = 0;
-  /* if (newline_mode) return newline_mode; */  // do this once it's cached
-  if (pcre_options & (PCRE_NEWLINE_CRLF|PCRE_NEWLINE_CR|PCRE_NEWLINE_LF|
-                      PCRE_NEWLINE_ANY|PCRE_NEWLINE_ANYCRLF)) {
-    newline_mode = (pcre_options &
-                    (PCRE_NEWLINE_CRLF|PCRE_NEWLINE_CR|PCRE_NEWLINE_LF|
-                     PCRE_NEWLINE_ANY|PCRE_NEWLINE_ANYCRLF));
-  } else {
-    int newline;
-    pcre_config(PCRE_CONFIG_NEWLINE, &newline);
-    if (newline == 10)
-      newline_mode = PCRE_NEWLINE_LF;
-    else if (newline == 13)
-      newline_mode = PCRE_NEWLINE_CR;
-    else if (newline == 3338)
-      newline_mode = PCRE_NEWLINE_CRLF;
-    else if (newline == -1)
-      newline_mode = PCRE_NEWLINE_ANY;
-    else if (newline == -2)
-      newline_mode = PCRE_NEWLINE_ANYCRLF;
-    else
-      assert(NULL == "Unexpected return value from pcre_config(NEWLINE)");
-  }
-  return newline_mode;
-}
-
-int RE::GlobalReplace(const StringPiece& rewrite,
-                      string *str) const {
-  int count = 0;
-  int vec[kVecSize];
-  string out;
-  int start = 0;
-  bool last_match_was_empty_string = false;
-
-  while (start <= static_cast<int>(str->length())) {
-    // If the previous match was for the empty string, we shouldn't
-    // just match again: we'll match in the same way and get an
-    // infinite loop.  Instead, we do the match in a special way:
-    // anchored -- to force another try at the same position --
-    // and with a flag saying that this time, ignore empty matches.
-    // If this special match returns, that means there's a non-empty
-    // match at this position as well, and we can continue.  If not,
-    // we do what perl does, and just advance by one.
-    // Notice that perl prints '@@@' for this;
-    //    perl -le '$_ = "aa"; s/b*|aa/@/g; print'
-    int matches;
-    if (last_match_was_empty_string) {
-      matches = TryMatch(*str, start, ANCHOR_START, false, vec, kVecSize);
-      if (matches <= 0) {
-        int matchend = start + 1;     // advance one character.
-        // If the current char is CR and we're in CRLF mode, skip LF too.
-        // Note it's better to call pcre_fullinfo() than to examine
-        // all_options(), since options_ could have changed bewteen
-        // compile-time and now, but this is simpler and safe enough.
-        // Modified by PH to add ANY and ANYCRLF.
-        if (matchend < static_cast<int>(str->length()) &&
-            (*str)[start] == '\r' && (*str)[matchend] == '\n' &&
-            (NewlineMode(options_.all_options()) == PCRE_NEWLINE_CRLF ||
-             NewlineMode(options_.all_options()) == PCRE_NEWLINE_ANY ||
-             NewlineMode(options_.all_options()) == PCRE_NEWLINE_ANYCRLF)) {
-          matchend++;
-        }
-        // We also need to advance more than one char if we're in utf8 mode.
-#ifdef SUPPORT_UTF8
-        if (options_.utf8()) {
-          while (matchend < static_cast<int>(str->length()) &&
-                 ((*str)[matchend] & 0xc0) == 0x80)
-            matchend++;
-        }
-#endif
-        if (start < static_cast<int>(str->length()))
-          out.append(*str, start, matchend - start);
-        start = matchend;
-        last_match_was_empty_string = false;
-        continue;
-      }
-    } else {
-      matches = TryMatch(*str, start, UNANCHORED, true, vec, kVecSize);
-      if (matches <= 0)
-        break;
-    }
-    int matchstart = vec[0], matchend = vec[1];
-    assert(matchstart >= start);
-    assert(matchend >= matchstart);
-    out.append(*str, start, matchstart - start);
-    Rewrite(&out, rewrite, *str, vec, matches);
-    start = matchend;
-    count++;
-    last_match_was_empty_string = (matchstart == matchend);
-  }
-
-  if (count == 0)
-    return 0;
-
-  if (start < static_cast<int>(str->length()))
-    out.append(*str, start, str->length() - start);
-  swap(out, *str);
-  return count;
-}
-
-bool RE::Extract(const StringPiece& rewrite,
-                 const StringPiece& text,
-                 string *out) const {
-  int vec[kVecSize];
-  int matches = TryMatch(text, 0, UNANCHORED, true, vec, kVecSize);
-  if (matches == 0)
-    return false;
-  out->erase();
-  return Rewrite(out, rewrite, text, vec, matches);
-}
-
-/*static*/ string RE::QuoteMeta(const StringPiece& unquoted) {
-  string result;
-
-  // Escape any ascii character not in [A-Za-z_0-9].
-  //
-  // Note that it's legal to escape a character even if it has no
-  // special meaning in a regular expression -- so this function does
-  // that.  (This also makes it identical to the perl function of the
-  // same name; see `perldoc -f quotemeta`.)  The one exception is
-  // escaping NUL: rather than doing backslash + NUL, like perl does,
-  // we do '\0', because pcre itself doesn't take embedded NUL chars.
-  for (int ii = 0; ii < unquoted.size(); ++ii) {
-    // Note that using 'isalnum' here raises the benchmark time from
-    // 32ns to 58ns:
-    if (unquoted[ii] == '\0') {
-      result += "\\0";
-    } else if ((unquoted[ii] < 'a' || unquoted[ii] > 'z') &&
-               (unquoted[ii] < 'A' || unquoted[ii] > 'Z') &&
-               (unquoted[ii] < '0' || unquoted[ii] > '9') &&
-               unquoted[ii] != '_' &&
-               // If this is the part of a UTF8 or Latin1 character, we need
-               // to copy this byte without escaping.  Experimentally this is
-               // what works correctly with the regexp library.
-               !(unquoted[ii] & 128)) {
-      result += '\\';
-      result += unquoted[ii];
-    } else {
-      result += unquoted[ii];
-    }
-  }
-
-  return result;
-}
-
-/***** Actual matching and rewriting code *****/
-
-int RE::TryMatch(const StringPiece& text,
-                 int startpos,
-                 Anchor anchor,
-                 bool empty_ok,
-                 int *vec,
-                 int vecsize) const {
-  pcre* re = (anchor == ANCHOR_BOTH) ? re_full_ : re_partial_;
-  if (re == NULL) {
-    //fprintf(stderr, "Matching against invalid re: %s\n", error_->c_str());
-    return 0;
-  }
-
-  pcre_extra extra = { 0, 0, 0, 0, 0, 0, 0, 0 };
-  if (options_.match_limit() > 0) {
-    extra.flags |= PCRE_EXTRA_MATCH_LIMIT;
-    extra.match_limit = options_.match_limit();
-  }
-  if (options_.match_limit_recursion() > 0) {
-    extra.flags |= PCRE_EXTRA_MATCH_LIMIT_RECURSION;
-    extra.match_limit_recursion = options_.match_limit_recursion();
-  }
-
-  // int options = 0;
-  // Changed by PH as a result of bugzilla #1288
-  int options = (options_.all_options() & PCRE_NO_UTF8_CHECK);
-
-  if (anchor != UNANCHORED)
-    options |= PCRE_ANCHORED;
-  if (!empty_ok)
-    options |= PCRE_NOTEMPTY;
-
-  int rc = pcre_exec(re,              // The regular expression object
-                     &extra,
-                     (text.data() == NULL) ? "" : text.data(),
-                     text.size(),
-                     startpos,
-                     options,
-                     vec,
-                     vecsize);
-
-  // Handle errors
-  if (rc == PCRE_ERROR_NOMATCH) {
-    return 0;
-  } else if (rc < 0) {
-    //fprintf(stderr, "Unexpected return code: %d when matching '%s'\n",
-    //        re, pattern_.c_str());
-    return 0;
-  } else if (rc == 0) {
-    // pcre_exec() returns 0 as a special case when the number of
-    // capturing subpatterns exceeds the size of the vector.
-    // When this happens, there is a match and the output vector
-    // is filled, but we miss out on the positions of the extra subpatterns.
-    rc = vecsize / 2;
-  }
-
-  return rc;
-}
-
-bool RE::DoMatchImpl(const StringPiece& text,
-                     Anchor anchor,
-                     int* consumed,
-                     const Arg* const* args,
-                     int n,
-                     int* vec,
-                     int vecsize) const {
-  assert((1 + n) * 3 <= vecsize);  // results + PCRE workspace
-  int matches = TryMatch(text, 0, anchor, true, vec, vecsize);
-  assert(matches >= 0);  // TryMatch never returns negatives
-  if (matches == 0)
-    return false;
-
-  *consumed = vec[1];
-
-  if (n == 0 || args == NULL) {
-    // We are not interested in results
-    return true;
-  }
-
-  if (NumberOfCapturingGroups() < n) {
-    // RE has fewer capturing groups than number of arg pointers passed in
-    return false;
-  }
-
-  // If we got here, we must have matched the whole pattern.
-  // We do not need (can not do) any more checks on the value of 'matches' here
-  // -- see the comment for TryMatch.
-  for (int i = 0; i < n; i++) {
-    const int start = vec[2*(i+1)];
-    const int limit = vec[2*(i+1)+1];
-    if (!args[i]->Parse(text.data() + start, limit-start)) {
-      // TODO: Should we indicate what the error was?
-      return false;
-    }
-  }
-
-  return true;
-}
-
-bool RE::DoMatch(const StringPiece& text,
-                 Anchor anchor,
-                 int* consumed,
-                 const Arg* const args[],
-                 int n) const {
-  assert(n >= 0);
-  size_t const vecsize = (1 + n) * 3;  // results + PCRE workspace
-                                       // (as for kVecSize)
-  int space[21];   // use stack allocation for small vecsize (common case)
-  int* vec = vecsize <= 21 ? space : new int[vecsize];
-  bool retval = DoMatchImpl(text, anchor, consumed, args, n, vec, (int)vecsize);
-  if (vec != space) delete [] vec;
-  return retval;
-}
-
-bool RE::Rewrite(string *out, const StringPiece &rewrite,
-                 const StringPiece &text, int *vec, int veclen) const {
-  for (const char *s = rewrite.data(), *end = s + rewrite.size();
-       s < end; s++) {
-    int c = *s;
-    if (c == '\\') {
-      c = *++s;
-      if (isdigit(c)) {
-        int n = (c - '0');
-        if (n >= veclen) {
-          //fprintf(stderr, requested group %d in regexp %.*s\n",
-          //        n, rewrite.size(), rewrite.data());
-          return false;
-        }
-        int start = vec[2 * n];
-        if (start >= 0)
-          out->append(text.data() + start, vec[2 * n + 1] - start);
-      } else if (c == '\\') {
-        *out += '\\';
-      } else {
-        //fprintf(stderr, "invalid rewrite pattern: %.*s\n",
-        //        rewrite.size(), rewrite.data());
-        return false;
-      }
-    } else {
-      *out += c;
-    }
-  }
-  return true;
-}
-
-// Return the number of capturing subpatterns, or -1 if the
-// regexp wasn't valid on construction.
-int RE::NumberOfCapturingGroups() const {
-  if (re_partial_ == NULL) return -1;
-
-  int result;
-  int pcre_retval = pcre_fullinfo(re_partial_,  // The regular expression object
-                                  NULL,         // We did not study the pattern
-                                  PCRE_INFO_CAPTURECOUNT,
-                                  &result);
-  assert(pcre_retval == 0);
-  return result;
-}
-
-/***** Parsers for various types *****/
-
-bool Arg::parse_null(const char* str, int n, void* dest) {
-  (void)str;
-  (void)n;
-  // We fail if somebody asked us to store into a non-NULL void* pointer
-  return (dest == NULL);
-}
-
-bool Arg::parse_string(const char* str, int n, void* dest) {
-  if (dest == NULL) return true;
-  reinterpret_cast<string*>(dest)->assign(str, n);
-  return true;
-}
-
-bool Arg::parse_stringpiece(const char* str, int n, void* dest) {
-  if (dest == NULL) return true;
-  reinterpret_cast<StringPiece*>(dest)->set(str, n);
-  return true;
-}
-
-bool Arg::parse_char(const char* str, int n, void* dest) {
-  if (n != 1) return false;
-  if (dest == NULL) return true;
-  *(reinterpret_cast<char*>(dest)) = str[0];
-  return true;
-}
-
-bool Arg::parse_uchar(const char* str, int n, void* dest) {
-  if (n != 1) return false;
-  if (dest == NULL) return true;
-  *(reinterpret_cast<unsigned char*>(dest)) = str[0];
-  return true;
-}
-
-// Largest number spec that we are willing to parse
-static const int kMaxNumberLength = 32;
-
-// REQUIRES "buf" must have length at least kMaxNumberLength+1
-// REQUIRES "n > 0"
-// Copies "str" into "buf" and null-terminates if necessary.
-// Returns one of:
-//      a. "str" if no termination is needed
-//      b. "buf" if the string was copied and null-terminated
-//      c. "" if the input was invalid and has no hope of being parsed
-static const char* TerminateNumber(char* buf, const char* str, int n) {
-  if ((n > 0) && isspace(*str)) {
-    // We are less forgiving than the strtoxxx() routines and do not
-    // allow leading spaces.
-    return "";
-  }
-
-  // See if the character right after the input text may potentially
-  // look like a digit.
-  if (isdigit(str[n]) ||
-      ((str[n] >= 'a') && (str[n] <= 'f')) ||
-      ((str[n] >= 'A') && (str[n] <= 'F'))) {
-    if (n > kMaxNumberLength) return ""; // Input too big to be a valid number
-    memcpy(buf, str, n);
-    buf[n] = '\0';
-    return buf;
-  } else {
-    // We can parse right out of the supplied string, so return it.
-    return str;
-  }
-}
-
-bool Arg::parse_long_radix(const char* str,
-                           int n,
-                           void* dest,
-                           int radix) {
-  if (n == 0) return false;
-  char buf[kMaxNumberLength+1];
-  str = TerminateNumber(buf, str, n);
-  char* end;
-  errno = 0;
-  long r = strtol(str, &end, radix);
-  if (end != str + n) return false;   // Leftover junk
-  if (errno) return false;
-  if (dest == NULL) return true;
-  *(reinterpret_cast<long*>(dest)) = r;
-  return true;
-}
-
-bool Arg::parse_ulong_radix(const char* str,
-                            int n,
-                            void* dest,
-                            int radix) {
-  if (n == 0) return false;
-  char buf[kMaxNumberLength+1];
-  str = TerminateNumber(buf, str, n);
-  if (str[0] == '-') return false;    // strtoul() on a negative number?!
-  char* end;
-  errno = 0;
-  unsigned long r = strtoul(str, &end, radix);
-  if (end != str + n) return false;   // Leftover junk
-  if (errno) return false;
-  if (dest == NULL) return true;
-  *(reinterpret_cast<unsigned long*>(dest)) = r;
-  return true;
-}
-
-bool Arg::parse_short_radix(const char* str,
-                            int n,
-                            void* dest,
-                            int radix) {
-  long r;
-  if (!parse_long_radix(str, n, &r, radix)) return false; // Could not parse
-  if (r < SHRT_MIN || r > SHRT_MAX) return false;       // Out of range
-  if (dest == NULL) return true;
-  *(reinterpret_cast<short*>(dest)) = static_cast<short>(r);
-  return true;
-}
-
-bool Arg::parse_ushort_radix(const char* str,
-                             int n,
-                             void* dest,
-                             int radix) {
-  unsigned long r;
-  if (!parse_ulong_radix(str, n, &r, radix)) return false; // Could not parse
-  if (r > USHRT_MAX) return false;                      // Out of range
-  if (dest == NULL) return true;
-  *(reinterpret_cast<unsigned short*>(dest)) = static_cast<unsigned short>(r);
-  return true;
-}
-
-bool Arg::parse_int_radix(const char* str,
-                          int n,
-                          void* dest,
-                          int radix) {
-  long r;
-  if (!parse_long_radix(str, n, &r, radix)) return false; // Could not parse
-  if (r < INT_MIN || r > INT_MAX) return false;         // Out of range
-  if (dest == NULL) return true;
-  *(reinterpret_cast<int*>(dest)) = r;
-  return true;
-}
-
-bool Arg::parse_uint_radix(const char* str,
-                           int n,
-                           void* dest,
-                           int radix) {
-  unsigned long r;
-  if (!parse_ulong_radix(str, n, &r, radix)) return false; // Could not parse
-  if (r > UINT_MAX) return false;                       // Out of range
-  if (dest == NULL) return true;
-  *(reinterpret_cast<unsigned int*>(dest)) = r;
-  return true;
-}
-
-bool Arg::parse_longlong_radix(const char* str,
-                               int n,
-                               void* dest,
-                               int radix) {
-#ifndef HAVE_LONG_LONG
-  return false;
-#else
-  if (n == 0) return false;
-  char buf[kMaxNumberLength+1];
-  str = TerminateNumber(buf, str, n);
-  char* end;
-  errno = 0;
-#if defined HAVE_STRTOQ
-  long long r = strtoq(str, &end, radix);
-#elif defined HAVE_STRTOLL
-  long long r = strtoll(str, &end, radix);
-#elif defined HAVE__STRTOI64
-  long long r = _strtoi64(str, &end, radix);
-#elif defined HAVE_STRTOIMAX
-  long long r = strtoimax(str, &end, radix);
-#else
-#error parse_longlong_radix: cannot convert input to a long-long
-#endif
-  if (end != str + n) return false;   // Leftover junk
-  if (errno) return false;
-  if (dest == NULL) return true;
-  *(reinterpret_cast<long long*>(dest)) = r;
-  return true;
-#endif   /* HAVE_LONG_LONG */
-}
-
-bool Arg::parse_ulonglong_radix(const char* str,
-                                int n,
-                                void* dest,
-                                int radix) {
-#ifndef HAVE_UNSIGNED_LONG_LONG
-  return false;
-#else
-  if (n == 0) return false;
-  char buf[kMaxNumberLength+1];
-  str = TerminateNumber(buf, str, n);
-  if (str[0] == '-') return false;    // strtoull() on a negative number?!
-  char* end;
-  errno = 0;
-#if defined HAVE_STRTOQ
-  unsigned long long r = strtouq(str, &end, radix);
-#elif defined HAVE_STRTOLL
-  unsigned long long r = strtoull(str, &end, radix);
-#elif defined HAVE__STRTOI64
-  unsigned long long r = _strtoui64(str, &end, radix);
-#elif defined HAVE_STRTOIMAX
-  unsigned long long r = strtoumax(str, &end, radix);
-#else
-#error parse_ulonglong_radix: cannot convert input to a long-long
-#endif
-  if (end != str + n) return false;   // Leftover junk
-  if (errno) return false;
-  if (dest == NULL) return true;
-  *(reinterpret_cast<unsigned long long*>(dest)) = r;
-  return true;
-#endif   /* HAVE_UNSIGNED_LONG_LONG */
-}
-
-bool Arg::parse_double(const char* str, int n, void* dest) {
-  if (n == 0) return false;
-  static const int kMaxLength = 200;
-  char buf[kMaxLength];
-  if (n >= kMaxLength) return false;
-  memcpy(buf, str, n);
-  buf[n] = '\0';
-  errno = 0;
-  char* end;
-  double r = strtod(buf, &end);
-  if (end != buf + n) return false;   // Leftover junk
-  if (errno) return false;
-  if (dest == NULL) return true;
-  *(reinterpret_cast<double*>(dest)) = r;
-  return true;
-}
-
-bool Arg::parse_float(const char* str, int n, void* dest) {
-  double r;
-  if (!parse_double(str, n, &r)) return false;
-  if (dest == NULL) return true;
-  *(reinterpret_cast<float*>(dest)) = static_cast<float>(r);
-  return true;
-}
-
-
-#define DEFINE_INTEGER_PARSERS(name)                                    \
-  bool Arg::parse_##name(const char* str, int n, void* dest) {          \
-    return parse_##name##_radix(str, n, dest, 10);                      \
-  }                                                                     \
-  bool Arg::parse_##name##_hex(const char* str, int n, void* dest) {    \
-    return parse_##name##_radix(str, n, dest, 16);                      \
-  }                                                                     \
-  bool Arg::parse_##name##_octal(const char* str, int n, void* dest) {  \
-    return parse_##name##_radix(str, n, dest, 8);                       \
-  }                                                                     \
-  bool Arg::parse_##name##_cradix(const char* str, int n, void* dest) { \
-    return parse_##name##_radix(str, n, dest, 0);                       \
-  }
-
-DEFINE_INTEGER_PARSERS(short)      /*                                   */
-DEFINE_INTEGER_PARSERS(ushort)     /*                                   */
-DEFINE_INTEGER_PARSERS(int)        /* Don't use semicolons after these  */
-DEFINE_INTEGER_PARSERS(uint)       /* statements because they can cause */
-DEFINE_INTEGER_PARSERS(long)       /* compiler warnings if the checking */
-DEFINE_INTEGER_PARSERS(ulong)      /* level is turned up high enough.   */
-DEFINE_INTEGER_PARSERS(longlong)   /*                                   */
-DEFINE_INTEGER_PARSERS(ulonglong)  /*                                   */
-
-#undef DEFINE_INTEGER_PARSERS
-
-}   // namespace pcrecpp
diff --git a/dist/pcrecpparg.h.in b/dist/pcrecpparg.h.in
deleted file mode 100644
index 61bcab5..0000000
--- a/dist/pcrecpparg.h.in
+++ /dev/null
@@ -1,174 +0,0 @@
-// Copyright (c) 2005, Google Inc.
-// All rights reserved.
-//
-// 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 Google Inc. 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.
-//
-// Author: Sanjay Ghemawat
-
-#ifndef _PCRECPPARG_H
-#define _PCRECPPARG_H
-
-#include <stdlib.h>    // for NULL
-#include <string>
-
-#include <pcre.h>
-
-namespace pcrecpp {
-
-class StringPiece;
-
-// Hex/Octal/Binary?
-
-// Special class for parsing into objects that define a ParseFrom() method
-template <class T>
-class _RE_MatchObject {
- public:
-  static inline bool Parse(const char* str, int n, void* dest) {
-    if (dest == NULL) return true;
-    T* object = reinterpret_cast<T*>(dest);
-    return object->ParseFrom(str, n);
-  }
-};
-
-class PCRECPP_EXP_DEFN Arg {
- public:
-  // Empty constructor so we can declare arrays of Arg
-  Arg();
-
-  // Constructor specially designed for NULL arguments
-  Arg(void*);
-
-  typedef bool (*Parser)(const char* str, int n, void* dest);
-
-// Type-specific parsers
-#define PCRE_MAKE_PARSER(type,name)                             \
-  Arg(type* p) : arg_(p), parser_(name) { }                     \
-  Arg(type* p, Parser parser) : arg_(p), parser_(parser) { }
-
-
-  PCRE_MAKE_PARSER(char,               parse_char);
-  PCRE_MAKE_PARSER(unsigned char,      parse_uchar);
-  PCRE_MAKE_PARSER(short,              parse_short);
-  PCRE_MAKE_PARSER(unsigned short,     parse_ushort);
-  PCRE_MAKE_PARSER(int,                parse_int);
-  PCRE_MAKE_PARSER(unsigned int,       parse_uint);
-  PCRE_MAKE_PARSER(long,               parse_long);
-  PCRE_MAKE_PARSER(unsigned long,      parse_ulong);
-#if @pcre_have_long_long@
-  PCRE_MAKE_PARSER(long long,          parse_longlong);
-#endif
-#if @pcre_have_ulong_long@
-  PCRE_MAKE_PARSER(unsigned long long, parse_ulonglong);
-#endif
-  PCRE_MAKE_PARSER(float,              parse_float);
-  PCRE_MAKE_PARSER(double,             parse_double);
-  PCRE_MAKE_PARSER(std::string,        parse_string);
-  PCRE_MAKE_PARSER(StringPiece,        parse_stringpiece);
-
-#undef PCRE_MAKE_PARSER
-
-  // Generic constructor
-  template <class T> Arg(T*, Parser parser);
-  // Generic constructor template
-  template <class T> Arg(T* p)
-    : arg_(p), parser_(_RE_MatchObject<T>::Parse) {
-  }
-
-  // Parse the data
-  bool Parse(const char* str, int n) const;
-
- private:
-  void*         arg_;
-  Parser        parser_;
-
-  static bool parse_null          (const char* str, int n, void* dest);
-  static bool parse_char          (const char* str, int n, void* dest);
-  static bool parse_uchar         (const char* str, int n, void* dest);
-  static bool parse_float         (const char* str, int n, void* dest);
-  static bool parse_double        (const char* str, int n, void* dest);
-  static bool parse_string        (const char* str, int n, void* dest);
-  static bool parse_stringpiece   (const char* str, int n, void* dest);
-
-#define PCRE_DECLARE_INTEGER_PARSER(name)                                   \
- private:                                                                   \
-  static bool parse_ ## name(const char* str, int n, void* dest);           \
-  static bool parse_ ## name ## _radix(                                     \
-    const char* str, int n, void* dest, int radix);                         \
- public:                                                                    \
-  static bool parse_ ## name ## _hex(const char* str, int n, void* dest);   \
-  static bool parse_ ## name ## _octal(const char* str, int n, void* dest); \
-  static bool parse_ ## name ## _cradix(const char* str, int n, void* dest)
-
-  PCRE_DECLARE_INTEGER_PARSER(short);
-  PCRE_DECLARE_INTEGER_PARSER(ushort);
-  PCRE_DECLARE_INTEGER_PARSER(int);
-  PCRE_DECLARE_INTEGER_PARSER(uint);
-  PCRE_DECLARE_INTEGER_PARSER(long);
-  PCRE_DECLARE_INTEGER_PARSER(ulong);
-  PCRE_DECLARE_INTEGER_PARSER(longlong);
-  PCRE_DECLARE_INTEGER_PARSER(ulonglong);
-
-#undef PCRE_DECLARE_INTEGER_PARSER
-};
-
-inline Arg::Arg() : arg_(NULL), parser_(parse_null) { }
-inline Arg::Arg(void* p) : arg_(p), parser_(parse_null) { }
-
-inline bool Arg::Parse(const char* str, int n) const {
-  return (*parser_)(str, n, arg_);
-}
-
-// This part of the parser, appropriate only for ints, deals with bases
-#define MAKE_INTEGER_PARSER(type, name) \
-  inline Arg Hex(type* ptr) { \
-    return Arg(ptr, Arg::parse_ ## name ## _hex); } \
-  inline Arg Octal(type* ptr) { \
-    return Arg(ptr, Arg::parse_ ## name ## _octal); } \
-  inline Arg CRadix(type* ptr) { \
-    return Arg(ptr, Arg::parse_ ## name ## _cradix); }
-
-MAKE_INTEGER_PARSER(short,              short)     /*                        */
-MAKE_INTEGER_PARSER(unsigned short,     ushort)    /*                        */
-MAKE_INTEGER_PARSER(int,                int)       /* Don't use semicolons   */
-MAKE_INTEGER_PARSER(unsigned int,       uint)      /* after these statement  */
-MAKE_INTEGER_PARSER(long,               long)      /* because they can cause */
-MAKE_INTEGER_PARSER(unsigned long,      ulong)     /* compiler warnings if   */
-#if @pcre_have_long_long@                          /* the checking level is  */
-MAKE_INTEGER_PARSER(long long,          longlong)  /* turned up high enough. */
-#endif                                             /*                        */
-#if @pcre_have_ulong_long@                         /*                        */
-MAKE_INTEGER_PARSER(unsigned long long, ulonglong) /*                        */
-#endif
-
-#undef PCRE_IS_SET
-#undef PCRE_SET_OR_CLEAR
-#undef MAKE_INTEGER_PARSER
-
-}   // namespace pcrecpp
-
-
-#endif /* _PCRECPPARG_H */
diff --git a/dist/pcredemo.c b/dist/pcredemo.c
deleted file mode 100644
index 946aba4..0000000
--- a/dist/pcredemo.c
+++ /dev/null
@@ -1,406 +0,0 @@
-/*************************************************
-*           PCRE DEMONSTRATION PROGRAM           *
-*************************************************/
-
-/* This is a demonstration program to illustrate the most straightforward ways
-of calling the PCRE regular expression library from a C program. See the
-pcresample documentation for a short discussion ("man pcresample" if you have
-the PCRE man pages installed).
-
-In Unix-like environments, if PCRE is installed in your standard system
-libraries, you should be able to compile this program using this command:
-
-gcc -Wall pcredemo.c -lpcre -o pcredemo
-
-If PCRE is not installed in a standard place, it is likely to be installed with
-support for the pkg-config mechanism. If you have pkg-config, you can compile
-this program using this command:
-
-gcc -Wall pcredemo.c `pkg-config --cflags --libs libpcre` -o pcredemo
-
-If you do not have pkg-config, you may have to use this:
-
-gcc -Wall pcredemo.c -I/usr/local/include -L/usr/local/lib \
-  -R/usr/local/lib -lpcre -o pcredemo
-
-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.
-
-Building under Windows:
-
-If you want to statically link this program against a non-dll .a file, you must
-define PCRE_STATIC before including pcre.h, otherwise the pcre_malloc() and
-pcre_free() exported functions will be declared __declspec(dllimport), with
-unwanted results. So in this environment, uncomment the following line. */
-
-/* #define PCRE_STATIC */
-
-#include <stdio.h>
-#include <string.h>
-#include <pcre.h>
-
-#define OVECCOUNT 30    /* should be a multiple of 3 */
-
-
-int main(int argc, char **argv)
-{
-pcre *re;
-const char *error;
-char *pattern;
-char *subject;
-unsigned char *name_table;
-unsigned int option_bits;
-int erroffset;
-int find_all;
-int crlf_is_newline;
-int namecount;
-int name_entry_size;
-int ovector[OVECCOUNT];
-int subject_length;
-int rc, i;
-int utf8;
-
-
-/**************************************************************************
-* 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++)
-  {
-  if (strcmp(argv[i], "-g") == 0) find_all = 1;
-    else break;
-  }
-
-/* After the options, we require exactly two arguments, which are the pattern,
-and the subject string. */
-
-if (argc - i != 2)
-  {
-  printf("Two arguments required: a regex and a subject string\n");
-  return 1;
-  }
-
-pattern = argv[i];
-subject = argv[i+1];
-subject_length = (int)strlen(subject);
-
-
-/*************************************************************************
-* Now we are going to compile the regular expression pattern, and handle *
-* and errors that are detected.                                          *
-*************************************************************************/
-
-re = pcre_compile(
-  pattern,              /* the pattern */
-  0,                    /* default options */
-  &error,               /* for error message */
-  &erroffset,           /* for error offset */
-  NULL);                /* use default character tables */
-
-/* Compilation failed: print the error message and exit */
-
-if (re == NULL)
-  {
-  printf("PCRE compilation failed at offset %d: %s\n", erroffset, error);
-  return 1;
-  }
-
-
-/*************************************************************************
-* If the compilation succeeded, we call PCRE again, in order to do a     *
-* pattern match against the subject string. This does just ONE match. If *
-* further matching is needed, it will be done below.                     *
-*************************************************************************/
-
-rc = pcre_exec(
-  re,                   /* the compiled pattern */
-  NULL,                 /* no extra data - we didn't study the pattern */
-  subject,              /* the subject string */
-  subject_length,       /* the length of the subject */
-  0,                    /* start at offset 0 in the subject */
-  0,                    /* default options */
-  ovector,              /* output vector for substring information */
-  OVECCOUNT);           /* number of elements in the output vector */
-
-/* Matching failed: handle error cases */
-
-if (rc < 0)
-  {
-  switch(rc)
-    {
-    case PCRE_ERROR_NOMATCH: printf("No match\n"); break;
-    /*
-    Handle other special cases if you like
-    */
-    default: printf("Matching error %d\n", rc); break;
-    }
-  pcre_free(re);     /* Release memory used for the compiled pattern */
-  return 1;
-  }
-
-/* Match succeded */
-
-printf("\nMatch succeeded at offset %d\n", ovector[0]);
-
-
-/*************************************************************************
-* We have found the first match within the subject string. If the output *
-* vector wasn't big enough, say so. Then output any substrings that were *
-* captured.                                                              *
-*************************************************************************/
-
-/* The output vector wasn't big enough */
-
-if (rc == 0)
-  {
-  rc = OVECCOUNT/3;
-  printf("ovector only has room for %d captured substrings\n", rc - 1);
-  }
-
-/* Show substrings stored in the output vector by number. Obviously, in a real
-application you might want to do things other than print them. */
-
-for (i = 0; i < rc; i++)
-  {
-  char *substring_start = subject + ovector[2*i];
-  int substring_length = ovector[2*i+1] - ovector[2*i];
-  printf("%2d: %.*s\n", i, substring_length, substring_start);
-  }
-
-
-/**************************************************************************
-* That concludes the basic part of this demonstration program. We have    *
-* compiled a pattern, and performed a single match. The code that follows *
-* shows first 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. */
-
-(void)pcre_fullinfo(
-  re,                   /* the compiled pattern */
-  NULL,                 /* no extra data - we didn't study the pattern */
-  PCRE_INFO_NAMECOUNT,  /* number of named substrings */
-  &namecount);          /* where to put the answer */
-
-if (namecount <= 0) printf("No named substrings\n"); else
-  {
-  unsigned char *tabptr;
-  printf("Named substrings\n");
-
-  /* Before we can access the substrings, we must extract the table for
-  translating names to numbers, and the size of each entry in the table. */
-
-  (void)pcre_fullinfo(
-    re,                       /* the compiled pattern */
-    NULL,                     /* no extra data - we didn't study the pattern */
-    PCRE_INFO_NAMETABLE,      /* address of the table */
-    &name_table);             /* where to put the answer */
-
-  (void)pcre_fullinfo(
-    re,                       /* the compiled pattern */
-    NULL,                     /* no extra data - we didn't study the pattern */
-    PCRE_INFO_NAMEENTRYSIZE,  /* size of each entry in the table */
-    &name_entry_size);        /* where to put the answer */
-
-  /* Now we can scan the table and, for each entry, print the number, the name,
-  and the substring itself. */
-
-  tabptr = name_table;
-  for (i = 0; i < namecount; i++)
-    {
-    int n = (tabptr[0] << 8) | tabptr[1];
-    printf("(%d) %*s: %.*s\n", n, name_entry_size - 3, tabptr + 2,
-      ovector[2*n+1] - ovector[2*n], subject + ovector[2*n]);
-    tabptr += name_entry_size;
-    }
-  }
-
-
-/*************************************************************************
-* If the "-g" option was given on the command line, we want to continue  *
-* to search for additional matches in the subject string, in a similar   *
-* way to the /g option in Perl. This turns out to be trickier than you   *
-* might think because of the possibility of matching an empty string.    *
-* What happens is as follows:                                            *
-*                                                                        *
-* If the previous match was NOT for an empty string, we can just start   *
-* the next match at the end of the previous one.                         *
-*                                                                        *
-* If the previous match WAS for an empty string, we can't do that, as it *
-* would lead to an infinite loop. Instead, a special call of pcre_exec() *
-* is made with the PCRE_NOTEMPTY_ATSTART and PCRE_ANCHORED flags set.    *
-* The first of these tells PCRE that an empty string at the start of the *
-* subject is not a valid match; other possibilities must be tried. The   *
-* second flag restricts PCRE to one match attempt at the initial string  *
-* position. If this match succeeds, an alternative to the empty string   *
-* match has been found, and we can print it and proceed round the loop,  *
-* advancing by the length of whatever was found. If this match does not  *
-* succeed, we still stay in the loop, advancing by just one character.   *
-* In UTF-8 mode, which can be set by (*UTF8) in the pattern, this may be *
-* more than one byte.                                                    *
-*                                                                        *
-* However, there is a complication concerned with newlines. When the     *
-* newline convention is such that CRLF is a valid newline, we must       *
-* advance by two characters rather than one. The newline convention can  *
-* be set in the regex by (*CR), etc.; if not, we must find the default.  *
-*************************************************************************/
-
-if (!find_all)     /* Check for -g */
-  {
-  pcre_free(re);   /* Release the memory used for the compiled pattern */
-  return 0;        /* Finish unless -g was given */
-  }
-
-/* Before running the loop, check for UTF-8 and whether CRLF is a valid newline
-sequence. First, find the options with which the regex was compiled; extract
-the UTF-8 state, and mask off all but the newline options. */
-
-(void)pcre_fullinfo(re, NULL, PCRE_INFO_OPTIONS, &option_bits);
-utf8 = option_bits & PCRE_UTF8;
-option_bits &= PCRE_NEWLINE_CR|PCRE_NEWLINE_LF|PCRE_NEWLINE_CRLF|
-               PCRE_NEWLINE_ANY|PCRE_NEWLINE_ANYCRLF;
-
-/* If no newline options were set, find the default newline convention from the
-build configuration. */
-
-if (option_bits == 0)
-  {
-  int d;
-  (void)pcre_config(PCRE_CONFIG_NEWLINE, &d);
-  /* Note that these values are always the ASCII ones, even in
-  EBCDIC environments. CR = 13, NL = 10. */
-  option_bits = (d == 13)? PCRE_NEWLINE_CR :
-          (d == 10)? PCRE_NEWLINE_LF :
-          (d == (13<<8 | 10))? PCRE_NEWLINE_CRLF :
-          (d == -2)? PCRE_NEWLINE_ANYCRLF :
-          (d == -1)? PCRE_NEWLINE_ANY : 0;
-  }
-
-/* See if CRLF is a valid newline sequence. */
-
-crlf_is_newline =
-     option_bits == PCRE_NEWLINE_ANY ||
-     option_bits == PCRE_NEWLINE_CRLF ||
-     option_bits == PCRE_NEWLINE_ANYCRLF;
-
-/* Loop for second and subsequent matches */
-
-for (;;)
-  {
-  int options = 0;                 /* Normally no options */
-  int start_offset = ovector[1];   /* Start at end of previous match */
-
-  /* If the previous match was for an empty string, we are finished if we are
-  at the end of the subject. Otherwise, arrange to run another match at the
-  same point to see if a non-empty match can be found. */
-
-  if (ovector[0] == ovector[1])
-    {
-    if (ovector[0] == subject_length) break;
-    options = PCRE_NOTEMPTY_ATSTART | PCRE_ANCHORED;
-    }
-
-  /* Run the next matching operation */
-
-  rc = pcre_exec(
-    re,                   /* the compiled pattern */
-    NULL,                 /* no extra data - we didn't study the pattern */
-    subject,              /* the subject string */
-    subject_length,       /* the length of the subject */
-    start_offset,         /* starting offset in the subject */
-    options,              /* options */
-    ovector,              /* output vector for substring information */
-    OVECCOUNT);           /* number of elements in the output vector */
-
-  /* This time, a result of NOMATCH isn't an error. If the value in "options"
-  is zero, it just means we have found all possible matches, so the loop ends.
-  Otherwise, it means we have failed to find a non-empty-string match at a
-  point where there was a previous empty-string match. In this case, we do what
-  Perl does: advance the matching position by one character, and continue. We
-  do this by setting the "end of previous match" offset, because that is picked
-  up at the top of the loop as the point at which to start again.
-
-  There are two complications: (a) When CRLF is a valid newline sequence, and
-  the current position is just before it, advance by an extra byte. (b)
-  Otherwise we must ensure that we skip an entire UTF-8 character if we are in
-  UTF-8 mode. */
-
-  if (rc == PCRE_ERROR_NOMATCH)
-    {
-    if (options == 0) break;                    /* All matches found */
-    ovector[1] = start_offset + 1;              /* Advance one byte */
-    if (crlf_is_newline &&                      /* If CRLF is newline & */
-        start_offset < subject_length - 1 &&    /* we are at CRLF, */
-        subject[start_offset] == '\r' &&
-        subject[start_offset + 1] == '\n')
-      ovector[1] += 1;                          /* Advance by one more. */
-    else if (utf8)                              /* Otherwise, ensure we */
-      {                                         /* advance a whole UTF-8 */
-      while (ovector[1] < subject_length)       /* character. */
-        {
-        if ((subject[ovector[1]] & 0xc0) != 0x80) break;
-        ovector[1] += 1;
-        }
-      }
-    continue;    /* Go round the loop again */
-    }
-
-  /* Other matching errors are not recoverable. */
-
-  if (rc < 0)
-    {
-    printf("Matching error %d\n", rc);
-    pcre_free(re);    /* Release memory used for the compiled pattern */
-    return 1;
-    }
-
-  /* Match succeded */
-
-  printf("\nMatch succeeded again at offset %d\n", ovector[0]);
-
-  /* The match succeeded, but the output vector wasn't big enough. */
-
-  if (rc == 0)
-    {
-    rc = OVECCOUNT/3;
-    printf("ovector only has room for %d captured substrings\n", rc - 1);
-    }
-
-  /* As before, show substrings stored in the output vector by number, and then
-  also any named substrings. */
-
-  for (i = 0; i < rc; i++)
-    {
-    char *substring_start = subject + ovector[2*i];
-    int substring_length = ovector[2*i+1] - ovector[2*i];
-    printf("%2d: %.*s\n", i, substring_length, substring_start);
-    }
-
-  if (namecount <= 0) printf("No named substrings\n"); else
-    {
-    unsigned char *tabptr = name_table;
-    printf("Named substrings\n");
-    for (i = 0; i < namecount; i++)
-      {
-      int n = (tabptr[0] << 8) | tabptr[1];
-      printf("(%d) %*s: %.*s\n", n, name_entry_size - 3, tabptr + 2,
-        ovector[2*n+1] - ovector[2*n], subject + ovector[2*n]);
-      tabptr += name_entry_size;
-      }
-    }
-  }      /* End of loop to find second and subsequent matches */
-
-printf("\n");
-pcre_free(re);       /* Release memory used for the compiled pattern */
-return 0;
-}
-
-/* End of pcredemo.c */
diff --git a/dist/pcregexp.pas b/dist/pcregexp.pas
deleted file mode 100644
index bb2b3da..0000000
--- a/dist/pcregexp.pas
+++ /dev/null
@@ -1,845 +0,0 @@
-{

-  pcRegExp - Perl compatible regular expressions for Virtual Pascal

-  (c) 2001 Peter S. Voronov aka Chem O'Dun <petervrn@yahoo.com>

-

-  Based on PCRE library interface unit for Virtual Pascal.

-  (c) 2001 Alexander Tokarev <dwalin@dwalin.ru>

-

-  The current PCRE version is: 3.7

-

-  This software may be distributed under the terms of the modified BSD license

-  Copyright (c) 2001, Alexander Tokarev

-  All rights reserved.

-

-  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 <ORGANIZATION> 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 HOLDER 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.

-

-  The PCRE library is written by: Philip Hazel <ph10@cam.ac.uk>

-  Copyright (c) 1997-2004 University of Cambridge

-

-  AngelsHolocaust 4-11-04 updated to use version v5.0

-  (INFO: this is regex-directed, NFA)

-  AH:  9-11-04 - pcre_free: removed var, pcre already gives the ptr, now

-			    everything works as it should (no more crashes)

-		 -> removed CheckRegExp because pcre handles errors perfectly

-      10-11-04 - added pcError (errorhandling), pcInit

-      13-11-04 - removed the ErrorPos = 0 check -> always print erroroffset

-      17-10-05 - support for \1-\9 backreferences in TpcRegExp.GetReplStr

-      17-02-06 - added RunTimeOptions: caller can set options while searching

-      19-02-06 - added SearchOfs(): let PCRE use the complete string and offset

-		 into the string itself

-      20-12-06 - support for version 7.0

-      27.08.08 - support for v7.7

-}

-

-{$H+} {$DEFINE PCRE_3_7} {$DEFINE PCRE_5_0} {$DEFINE PCRE_7_0} {$DEFINE PCRE_7_7}

-

-Unit pcregexp;

-

-Interface

-

-uses objects;

-

-Type

- PpcRegExp = ^TpcRegExp;

-// TpcRegExp = object

- TpcRegExp = object(TObject)

-  MatchesCount: integer;

-  RegExpC, RegExpExt : Pointer;

-  Matches:Pointer;

-  RegExp: shortstring;

-  SourceLen: integer;

-  PartialMatch : boolean;

-  Error : boolean;

-  ErrorMsg : Pchar;

-  ErrorPos : integer;

-  RunTimeOptions: Integer; // options which can be set by the caller

-  constructor Init(const ARegExp : shortstring; AOptions : integer; ALocale : Pointer);

-  function Search(AStr: Pchar; ALen : longint) : boolean; virtual;

-  function SearchNext( AStr: Pchar; ALen : longint) : boolean; virtual;

-  function SearchOfs ( AStr: Pchar; ALen, AOfs : longint) : boolean; virtual;

-  function MatchSub(ANom: integer; var Pos, Len : longint) : boolean; virtual;

-  function MatchFull(var Pos, Len : longint) : boolean; virtual;

-  function GetSubStr(ANom: integer; AStr: Pchar) : string; virtual;

-  function GetFullStr(AStr: Pchar) : string; virtual;

-  function GetReplStr(AStr: Pchar; const ARepl: string) : string; virtual;

-  function GetPreSubStr(AStr: Pchar) : string; virtual;

-  function GetPostSubStr(AStr: Pchar) : string; virtual;

-  function ErrorStr : string; virtual;

-  destructor Done; virtual;

- end;

-

- function pcGrepMatch(WildCard, aStr: string; AOptions:integer; ALocale : Pointer): Boolean;

- function pcGrepSub(WildCard, aStr, aRepl: string; AOptions:integer; ALocale : Pointer): string;

-

- function pcFastGrepMatch(WildCard, aStr: string): Boolean;

- function pcFastGrepSub(WildCard, aStr, aRepl: string): string;

-

-{$IFDEF PCRE_5_0}

- function pcGetVersion : pchar;

-{$ENDIF}

-

- function pcError (var pRegExp : Pointer) : Boolean;

- function pcInit  (const Pattern: Shortstring; CaseSens: Boolean) : Pointer;

-

-Const { Options }

- PCRE_CASELESS         = $0001;

- PCRE_MULTILINE        = $0002;

- PCRE_DOTALL           = $0004;

- PCRE_EXTENDED         = $0008;

- PCRE_ANCHORED         = $0010;

- PCRE_DOLLAR_ENDONLY   = $0020;

- PCRE_EXTRA            = $0040;

- PCRE_NOTBOL           = $0080;

- PCRE_NOTEOL           = $0100;

- PCRE_UNGREEDY         = $0200;

- PCRE_NOTEMPTY         = $0400;

-{$IFDEF PCRE_5_0}

- PCRE_UTF8             = $0800;

- PCRE_NO_AUTO_CAPTURE  = $1000;

- PCRE_NO_UTF8_CHECK    = $2000;

- PCRE_AUTO_CALLOUT     = $4000;

- PCRE_PARTIAL          = $8000;

-{$ENDIF}

-{$IFDEF PCRE_7_0}

- PCRE_DFA_SHORTEST     = $00010000;

- PCRE_DFA_RESTART      = $00020000;

- PCRE_FIRSTLINE        = $00040000;

- PCRE_DUPNAMES         = $00080000;

- PCRE_NEWLINE_CR       = $00100000;

- PCRE_NEWLINE_LF       = $00200000;

- PCRE_NEWLINE_CRLF     = $00300000;

- PCRE_NEWLINE_ANY      = $00400000;

- PCRE_NEWLINE_ANYCRLF  = $00500000;

-

- PCRE_NEWLINE_BITS     = PCRE_NEWLINE_CR or PCRE_NEWLINE_LF or PCRE_NEWLINE_ANY;

-

-{$ENDIF}

-{$IFDEF PCRE_7_7}

- PCRE_BSR_ANYCRLF      = $00800000;

- PCRE_BSR_UNICODE      = $01000000;

- PCRE_JAVASCRIPT_COMPAT= $02000000;

-{$ENDIF}

-

- PCRE_COMPILE_ALLOWED_OPTIONS = PCRE_ANCHORED + PCRE_AUTO_CALLOUT + PCRE_CASELESS  +

-				PCRE_DOLLAR_ENDONLY + PCRE_DOTALL + PCRE_EXTENDED  +

-				PCRE_EXTRA + PCRE_MULTILINE + PCRE_NO_AUTO_CAPTURE +

-				PCRE_UNGREEDY + PCRE_UTF8 + PCRE_NO_UTF8_CHECK

-				{$IFDEF PCRE_7_0}

-				+ PCRE_DUPNAMES + PCRE_FIRSTLINE + PCRE_NEWLINE_BITS

-				{$ENDIF}

-				{$IFDEF PCRE_7_7}

-				+ PCRE_BSR_ANYCRLF + PCRE_BSR_UNICODE + PCRE_JAVASCRIPT_COMPAT

-				{$ENDIF}

-				;

-

- PCRE_EXEC_ALLOWED_OPTIONS = PCRE_ANCHORED + PCRE_NOTBOL + PCRE_NOTEOL +

-			     PCRE_NOTEMPTY + PCRE_NO_UTF8_CHECK + PCRE_PARTIAL

-			     {$IFDEF PCRE_7_0}

-			     + PCRE_NEWLINE_BITS

-			     {$ENDIF}

-			     {$IFDEF PCRE_7_7}

-			     + PCRE_BSR_ANYCRLF + PCRE_BSR_UNICODE

-			     {$ENDIF}

-			     ;

-

-{$IFDEF PCRE_7_0}

- PCRE_DFA_EXEC_ALLOWED_OPTIONS = PCRE_ANCHORED + PCRE_NOTBOL + PCRE_NOTEOL +

-				 PCRE_NOTEMPTY + PCRE_NO_UTF8_CHECK + PCRE_PARTIAL +

-				 PCRE_DFA_SHORTEST + PCRE_DFA_RESTART +

-				 PCRE_NEWLINE_BITS

-				 {$IFDEF PCRE_7_7}

-				 + PCRE_BSR_ANYCRLF + PCRE_BSR_UNICODE

-				 {$ENDIF}

-				 ;

-{$ENDIF}

-

-{ Exec-time and get/set-time error codes }

- PCRE_ERROR_NOMATCH        =  -1;

- PCRE_ERROR_NULL	   =  -2;

- PCRE_ERROR_BADOPTION      =  -3;

- PCRE_ERROR_BADMAGIC       =  -4;

- PCRE_ERROR_UNKNOWN_MODE   =  -5;

- PCRE_ERROR_NOMEMORY       =  -6;

- PCRE_ERROR_NOSUBSTRING    =  -7;

-{$IFDEF PCRE_5_0}

- PCRE_ERROR_MATCHLIMIT     =  -8;

- PCRE_ERROR_CALLOUT        =  -9;  { Never used by PCRE itself }

- PCRE_ERROR_BADUTF8        = -10;

- PCRE_ERROR_BADUTF8_OFFSET = -11;

- PCRE_ERROR_PARTIAL        = -12;

- PCRE_ERROR_BADPARTIAL     = -13;

- PCRE_ERROR_INTERNAL       = -14;

- PCRE_ERROR_BADCOUNT       = -15;

-{$ENDIF}

-{$IFDEF PCRE_7_0}

- PCRE_ERROR_DFA_UITEM      = -16;

- PCRE_ERROR_DFA_UCOND      = -17;

- PCRE_ERROR_DFA_UMLIMIT    = -18;

- PCRE_ERROR_DFA_WSSIZE     = -19;

- PCRE_ERROR_DFA_RECURSE    = -20;

- PCRE_ERROR_RECURSIONLIMIT = -21;

- PCRE_ERROR_NULLWSLIMIT    = -22;

- PCRE_ERROR_BADNEWLINE     = -23;

-{$ENDIF}

-

-{ Request types for pcre_fullinfo() }

-

- PCRE_INFO_OPTIONS         =  0;

- PCRE_INFO_SIZE 	   =  1;

- PCRE_INFO_CAPTURECOUNT    =  2;

- PCRE_INFO_BACKREFMAX      =  3;

- PCRE_INFO_FIRSTBYTE       =  4;

- PCRE_INFO_FIRSTCHAR       =  4; { For backwards compatibility }

- PCRE_INFO_FIRSTTABLE      =  5;

-{$IFDEF PCRE_5_0}

- PCRE_INFO_LASTLITERAL     =  6;

- PCRE_INFO_NAMEENTRYSIZE   =  7;

- PCRE_INFO_NAMECOUNT       =  8;

- PCRE_INFO_NAMETABLE       =  9;

- PCRE_INFO_STUDYSIZE       = 10;

- PCRE_INFO_DEFAULT_TABLES  = 11;

-{$ENDIF PCRE_5_0}

-{$IFDEF PCRE_7_7}

- PCRE_INFO_OKPARTIAL       = 12;

- PCRE_INFO_JCHANGED        = 13;

- PCRE_INFO_HASCRORLF       = 14;

-{$ENDIF}

-

-{ Request types for pcre_config() }

-{$IFDEF PCRE_5_0}

- PCRE_CONFIG_UTF8       	    = 0;

- PCRE_CONFIG_NEWLINE    	    = 1;

- PCRE_CONFIG_LINK_SIZE  	    = 2;

- PCRE_CONFIG_POSIX_MALLOC_THRESHOLD = 3;

- PCRE_CONFIG_MATCH_LIMIT	    = 4;

- PCRE_CONFIG_STACKRECURSE           = 5;

- PCRE_CONFIG_UNICODE_PROPERTIES     = 6;

-{$ENDIF PCRE_5_0}

-{$IFDEF PCRE_7_0}

- PCRE_CONFIG_MATCH_LIMIT_RECURSION  = 7;

-{$ENDIF}

-{$IFDEF PCRE_7_7}

- PCRE_CONFIG_BSR		    = 8;

-{$ENDIF}

-

-{ Bit flags for the pcre_extra structure }

-{$IFDEF PCRE_5_0}

- PCRE_EXTRA_STUDY_DATA  	  = $0001;

- PCRE_EXTRA_MATCH_LIMIT 	  = $0002;

- PCRE_EXTRA_CALLOUT_DATA	  = $0004;

- PCRE_EXTRA_TABLES      	  = $0008;

-{$ENDIF PCRE_5_0}

-{$IFDEF PCRE_7_0}

- PCRE_EXTRA_MATCH_LIMIT_RECURSION = $0010;

-{$ENDIF}

-

-Const

-// DefaultOptions : integer = 0;

- DefaultLocaleTable : pointer = nil;

-

-{$IFDEF PCRE_5_0}

-{ 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. }

-

-type ppcre_extra = ^tpcre_extra;

-     tpcre_extra = record

-       flags : longint; 	       { Bits for which fields are set }

-       study_data : pointer;           { Opaque data from pcre_study() }

-       match_limit : longint;          { Maximum number of calls to match() }

-       callout_data : pointer;         { Data passed back in callouts }

-       tables : pointer;	       { Pointer to character tables }

-       match_limit_recursion: longint; { Max recursive calls to match() }

-     end;

-

-type ppcre_callout_block = ^pcre_callout_block;

-     pcre_callout_block = record

-       version,

-  (* ------------------------ Version 0 ------------------------------- *)

-       callout_number : integer;

-       offset_vector : pointer;

-       subject : pchar;

-       subject_length, start_match, current_position, capture_top,

-       capture_last : integer;

-       callout_data : pointer;

-  (* ------------------- Added for Version 1 -------------------------- *)

-       pattern_position, next_item_length : integer;

-     end;

-{$ENDIF PCRE_5_0}

-

-{$OrgName+}

-{$IFDEF VIRTUALPASCAL} {&Cdecl+} {$ENDIF VIRTUALPASCAL}

-

- { local replacement of external pcre memory management functions }

- function pcre_malloc( size : integer ) : pointer;

- procedure pcre_free( {var} p : pointer );

-{$IFDEF PCRE_5_0}

- const pcre_stack_malloc: function ( size : integer ): pointer = pcre_malloc;

-       pcre_stack_free: procedure ( {var} p : pointer ) = pcre_free;

- function pcre_callout(var p : ppcre_callout_block) : integer;

-{$ENDIF PCRE_5_0}

-{$IFDEF VIRTUALPASCAL} {&Cdecl-} {$ENDIF VIRTUALPASCAL}

-

-Implementation

-

-Uses strings, collect, messages, dnapp, commands, advance0, stringsx

-    {$IFDEF VIRTUALPASCAL} ,vpsyslow {$ENDIF VIRTUALPASCAL};

-

-Const

- MAGIC_NUMBER = $50435245; { 'PCRE' }

- MAX_MATCHES = 90; { changed in 3.5 version; should be divisible by 3, was 64}

-

-Type

- PMatchArray = ^TMatchArray;

- TMatchArray = array[0..( MAX_MATCHES * 3 )] of integer;

-

- PRegExpCollection = ^TRegExpCollection;

- TRegExpCollection =  object(TSortedCollection)

-   MaxRegExp : integer;

-   SearchRegExp : shortstring;

-   CompareModeInsert : boolean;

-   constructor Init(AMaxRegExp:integer);

-   procedure FreeItem(P: Pointer); virtual;

-   function  Compare(P1, P2: Pointer): Integer; virtual;

-   function  Find(ARegExp:shortstring;var P: PpcRegExp):boolean; virtual;

-   function CheckNew(ARegExp:shortstring):PpcRegExp;virtual;

- end;

-

-Var

- PRegExpCache : PRegExpCollection;

-

-

-{$IFDEF VIRTUALPASCAL} {&Cdecl+} {$ENDIF VIRTUALPASCAL}

-

- { imported original pcre functions }

-

- function pcre_compile( const pattern : PChar; options : integer;

-			var errorptr : PChar; var erroroffset : integer;

-			const tables : PChar ) : pointer {pcre}; external;

-{$IFDEF PCRE_7_0}

- function pcre_compile2( const pattern : PChar; options : integer;

-			 var errorcodeptr : Integer;

-			 var errorptr : PChar; var erroroffset : integer;

-			 const tables : PChar ) : pointer {pcre}; external;

-{$ENDIF}

-{$IFDEF PCRE_5_0}

- function pcre_config( what : integer; where : pointer) : integer; external;

- function pcre_copy_named_substring( const code : pointer {pcre};

-				     const subject : pchar;

-				     var ovector : integer;

-				     stringcount : integer;

-				     const stringname : pchar;

-				     var buffer : pchar;

-				     size : integer) : integer; external;

- function pcre_copy_substring( const subject : pchar; var ovector : integer;

-			       stringcount, stringnumber : integer;

-			       var buffer : pchar; size : integer )

-			       : integer; external;

- function pcre_exec( const argument_re : pointer {pcre};

-		     const extra_data : pointer {pcre_extra};

-{$ELSE}

- function pcre_exec( const external_re : pointer;

-		     const external_extra : pointer;

-{$ENDIF}

-		     const subject : PChar;

-		     length, start_offset, options : integer;

-		     offsets : pointer;

-		     offsetcount : integer ) : integer; external;

-{$IFDEF PCRE_7_0}

- function pcre_dfa_exec( const argument_re : pointer {pcre};

-			 const extra_data : pointer {pcre_extra};

-			 const subject : pchar;

-			 length, start_offset, options : integer;

-			 offsets : pointer;

-			 offsetcount : integer;

-			 workspace : pointer;

-			 wscount : integer ) : integer; external;

-{$ENDIF}

-{$IFDEF PCRE_5_0}

- procedure pcre_free_substring( const p : pchar ); external;

- procedure pcre_free_substring_list( var p : pchar ); external;

- function pcre_fullinfo( const argument_re : pointer {pcre};

-			 const extra_data : pointer {pcre_extra};

-			 what : integer;

-			 where : pointer ) : integer; external;

- function pcre_get_named_substring( const code : pointer {pcre};

-				    const subject : pchar;

-				    var ovector : integer;

-				    stringcount : integer;

-				    const stringname : pchar;

-				    var stringptr : pchar ) : integer; external;

- function pcre_get_stringnumber( const code : pointer {pcre};

-				 const stringname : pchar ) : integer; external;

- function pcre_get_stringtable_entries( const code : pointer {pcre};

-					const stringname : pchar;

-					var firstptr,

-					    lastptr : pchar ) : integer; external;

- function pcre_get_substring( const subject : pchar; var ovector : integer;

-			      stringcount, stringnumber : integer;

-			      var stringptr : pchar ) : integer; external;

- function pcre_get_substring_list( const subject : pchar; var ovector : integer;

-				   stringcount : integer;

-				   listptr : pointer {const char ***listptr}) : integer; external;

- function pcre_info( const argument_re : pointer {pcre};

-		     var optptr : integer;

-		     var first_byte : integer ) : integer; external;

- function pcre_maketables : pchar; external;

-{$ENDIF}

-{$IFDEF PCRE_7_0}

- function pcre_refcount( const argument_re : pointer {pcre};

-			 adjust : integer ) : pchar; external;

-{$ENDIF}

- function pcre_study( const external_re : pointer {pcre};

-		      options : integer;

-		      var errorptr : PChar ) : pointer {pcre_extra}; external;

-{$IFDEF PCRE_5_0}

- function pcre_version : pchar; external;

-{$ENDIF}

-

- function pcre_malloc( size : integer ) : pointer;

- begin

-  GetMem( result, size );

- end;

-

- procedure pcre_free( {var} p : pointer );

- begin

-  if (p <> nil) then

-    FreeMem( p, 0 );

-  {@p := nil;}

- end;

-

-{$IFDEF PCRE_5_0}

-(* Called from PCRE as a result of the (?C) item. We print out where we are in

-the match. Yield zero unless more callouts than the fail count, or the callout

-data is not zero. *)

-

- function pcre_callout;

- begin

- end;

-{$ENDIF}

-

-{$IFDEF VIRTUALPASCAL} {&Cdecl-} {$ENDIF VIRTUALPASCAL}

-

-// Always include the newest version of the library

-{$IFDEF PCRE_7_7}

-  {$L pcre77.lib}

-{$ELSE}

-  {$IFDEF PCRE_7_0}

-    {$L pcre70.lib}

-  {$ELSE}

-    {$IFDEF PCRE_5_0}

-      {$L pcre50.lib}

-    {$ELSE}

-      {$IFDEF PCRE_3_7}

-	{$L pcre37.lib}

-      {$ENDIF PCRE_3_7}

-    {$ENDIF PCRE_5_0}

-  {$ENDIF PCRE_7_0}

-{$ENDIF PCRE_7_7}

-

-{TpcRegExp}

-

- constructor TpcRegExp.Init(const ARegExp:shortstring; AOptions:integer; ALocale : Pointer);

- var

-  pRegExp : PChar;

- begin

-  RegExp:=ARegExp;

-  RegExpC:=nil;

-  RegExpExt:=nil;

-  Matches:=nil;

-  MatchesCount:=0;

-  Error:=true;

-  ErrorMsg:=nil;

-  ErrorPos:=0;

-  RunTimeOptions := 0;

-  if length(RegExp) < 255 then

-   begin

-    RegExp[length(RegExp)+1]:=#0;

-    pRegExp:=@RegExp[1];

-   end

-  else

-   begin

-    GetMem(pRegExp,length(RegExp)+1);

-    pRegExp:=strpcopy(pRegExp,RegExp);

-   end;

-  RegExpC := pcre_compile( pRegExp,

-			   AOptions and PCRE_COMPILE_ALLOWED_OPTIONS,

-			   ErrorMsg, ErrorPos, ALocale);

-  if length(RegExp) = 255 then

-   StrDispose(pRegExp);

-  if RegExpC = nil then

-   exit;

-  ErrorMsg:=nil;

-  RegExpExt := pcre_study( RegExpC, 0, ErrorMsg );

-  if (RegExpExt = nil) and (ErrorMsg <> nil) then

-   begin

-    pcre_free(RegExpC);

-    exit;

-   end;

-  GetMem(Matches,SizeOf(TMatchArray));

-  Error:=false;

- end;

-

- destructor TpcRegExp.Done;

- begin

-  if RegExpC <> nil then

-    pcre_free(RegExpC);

-  if RegExpExt <> nil then

-    pcre_free(RegExpExt);

-  if Matches <> nil then

-    FreeMem(Matches,SizeOf(TMatchArray));

- end;

-

- function TpcRegExp.SearchNext( AStr: Pchar; ALen : longint ) : boolean;

- var Options: Integer;

- begin // must handle PCRE_ERROR_PARTIAL here

-  Options := (RunTimeOptions or startup.MiscMultiData.cfgRegEx.DefaultOptions) and

-	     PCRE_EXEC_ALLOWED_OPTIONS;

-  if MatchesCount > 0 then

-    MatchesCount:=pcre_exec( RegExpC, RegExpExt, AStr, ALen, PMatchArray(Matches)^[1],

-			     Options, Matches, MAX_MATCHES ) else

-    MatchesCount:=pcre_exec( RegExpC, RegExpExt, AStr, ALen, 0,

-			     Options, Matches, MAX_MATCHES );

-{  if MatchesCount = 0 then

-    MatchesCount := MatchesCount div 3;}

-  PartialMatch := MatchesCount = PCRE_ERROR_PARTIAL;

-  SearchNext := MatchesCount > 0;

- end;

-

- function TpcRegExp.Search( AStr: Pchar; ALen : longint):boolean;

- begin

-  MatchesCount:=0;

-  Search:=SearchNext(AStr,ALen);

-  SourceLen:=ALen;

- end;

-

- function TpcRegExp.SearchOfs( AStr: Pchar; ALen, AOfs: longint ) : boolean;

- var Options: Integer;

- begin

-  MatchesCount:=0;

-  Options := (RunTimeOptions or startup.MiscMultiData.cfgRegEx.DefaultOptions) and

-	     PCRE_EXEC_ALLOWED_OPTIONS;

-  MatchesCount:=pcre_exec( RegExpC, RegExpExt, AStr, ALen, AOfs,

-			   Options, Matches, MAX_MATCHES );

-  PartialMatch := MatchesCount = PCRE_ERROR_PARTIAL;

-  SearchOfs := MatchesCount > 0;

-  SourceLen := ALen-AOfs;

- end;

-

- function TpcRegExp.MatchSub(ANom:integer; var Pos,Len:longint):boolean;

- begin

-  if (MatchesCount > 0) and (ANom <= (MatchesCount-1)) then

-   begin

-    ANom:=ANom*2;

-    Pos:=PMatchArray(Matches)^[ANom];

-    Len:=PMatchArray(Matches)^[ANom+1]-Pos;

-    MatchSub:=true;

-   end

-  else

-   MatchSub:=false;

- end;

-

- function TpcRegExp.MatchFull(var Pos,Len:longint):boolean;

- begin

-  MatchFull:=MatchSub(0,Pos,Len);

- end;

-

- function TpcRegExp.GetSubStr(ANom: integer; AStr: Pchar):string;

- var

-  s: ansistring;

-  pos,len: longint;

- begin

-  s:='';

-  if MatchSub(ANom, pos, len) then

-   begin

-    setlength(s, len);

-    Move(AStr[pos], s[1], len);

-   end;

-  GetSubStr:=s;

- end;

-

- function TpcRegExp.GetPreSubStr(AStr: Pchar):string;

- var

-  s: ansistring;

-  l: longint;

- begin

-  s:='';

-  if (MatchesCount > 0) then

-   begin

-    l:=PMatchArray(Matches)^[0]-1;

-    if l > 0 then

-     begin

-      setlength(s,l);

-      Move(AStr[1],s[1],l);

-     end;

-   end;

-  GetPreSubStr:=s;

- end;

-

- function TpcRegExp.GetPostSubStr(AStr: Pchar):string;

- var

-  s: ansistring;

-  l: longint;

-  ANom: integer;

- begin

-  s:='';

-  if (MatchesCount > 0) then

-   begin

-    ANom:=(MatchesCount-1){*2} shl 1;

-    l:=SourceLen-PMatchArray(Matches)^[ANom+1]+1;

-    if l > 0 then

-     begin

-      setlength(s,l);

-      Move(AStr[PMatchArray(Matches)^[ANom+1]],s[1],l);

-     end;

-   end;

-  GetPostSubStr:=s;

- end;

-

-

- function TpcRegExp.GetFullStr(AStr: Pchar):string;

- var

-  s: ansistring;

-  l: longint;

- begin

-  GetFullStr:=GetSubStr(0,AStr);

- end;

-

- function TpcRegExp.GetReplStr(AStr: Pchar; const ARepl: string):string;

- var

-  s: ansistring;

-  l,i,lasti: longint;

- begin

-  l:=length(ARepl);

-  i:=1;

-  lasti:=1;

-  s:='';

-  while i <= l do

-   begin

-    case ARepl[i] of

-     '\' :

-      begin

-       if i < l then

-	begin

-	 s:=s+copy(ARepl,lasti,i-lasti){+ARepl[i+1]};

-	 {AH 17-10-05 support for POSIX \1-\9 backreferences}

-	 case ARepl[i+1] of

-	  '0' : s:=s+GetFullStr(AStr);

-	  '1'..'9' : s:=s+GetSubStr(ord(ARepl[i+1])-ord('0'),AStr);

-	  else s:=s+ARepl[i+1]; // copy the escaped character

-	 end;

-	end;

-       inc(i);

-       lasti:=i+1;

-      end;

-     '$' :

-      begin

-       if i < l then

-	begin

-	 s:=s+copy(ARepl,lasti,i-lasti);

-	 case ARepl[i+1] of

-	  '&' : s:=s+GetFullStr(AStr);

-	  '1'..'9' : s:=s+GetSubStr(ord(ARepl[i+1])-ord('0'),AStr);

-	  '`' : s:=s+GetPreSubStr(AStr);

-	  #39 : s:=s+GetPostSubStr(AStr);

-	 end;

-	end;

-       inc(i);

-       lasti:=i+1;

-      end;

-    end;

-    inc(i);

-   end;

-  if lasti <= {AH 25-10-2004 added =, else l==1 won't work} l then

-    s:=s+copy(ARepl,lasti,l-lasti+1);

-  GetReplStr:=s;

- end;

-

- function TpcRegExp.ErrorStr:string;

-  begin

-   ErrorStr:=StrPas(ErrorMsg);

-  end;

-

-{TRegExpCollection}

-

-constructor TRegExpCollection.Init(AMaxRegExp: integer);

-begin

- Inherited Init(1,1);

- MaxRegExp:=AMaxRegExp;

- CompareModeInsert:=true;

-end;

-

-procedure TRegExpCollection.FreeItem(P: Pointer);

-begin

- if P <> nil then

-  begin

-   Dispose(PpcRegExp(P),Done);

-  end;

-end;

-

-function  TRegExpCollection.Compare(P1, P2: Pointer): Integer;

-//var

-// l,l1,l2,i : byte;

-//// wPos: pchar;

-begin

- if CompareModeInsert then

-  begin

-//   l1:=length(PpcRegExp(P1)^.RegExp);

-//   l2:=length(PpcRegExp(P2)^.RegExp);

-//   if l1 > l2 then l:=l2 else

-//      	     l:=l1;

-//   for i:=1 to l do

-//     if PpcRegExp(P1).RegExp[i] <> PpcRegExp(P2).RegExp[i] then break;

-//   if i <=l then

-//     Compare:=ord(PpcRegExp(P1).RegExp[i])-ord(PpcRegExp(P2).RegExp[i]) else

-//     Compare:=l1-l2;

-    Compare := stringsx.PasStrCmp(PpcRegExp(P1).RegExp, PpcRegExp(P2).RegExp, False);

-  end

- else

-  begin

-//   l1:=length(PpcRegExp(P1)^.RegExp);

-//   l2:=length(SearchRegExp);

-//   if l1 > l2 then l:=l2 else

-//      	     l:=l1;

-//   for i:=1 to l do

-//     if PpcRegExp(P1).RegExp[i] <> SearchRegExp[i] then

-//     begin

-//       Compare:=ord(PpcRegExp(P1).RegExp[i])-ord(SearchRegExp[i]);

-//       break;

-//     end;

-//   if i > l then Compare:=l1-l2;

-    Compare := stringsx.PasStrCmp(PpcRegExp(P1).RegExp, SearchRegExp, False);

-  end;

-end;

-

-function  TRegExpCollection.Find(ARegExp:shortstring;var P: PpcRegExp):boolean;

-var I : integer;

-begin

- CompareModeInsert:=false;

- SearchRegExp:=ARegExp;

- if Search(nil,I) then

-  begin

-   P:=PpcRegExp(At(I));

-   Find:=true;

-  end

- else

-  begin

-   P:=nil;

-   Find:=false;

-  end;

- CompareModeInsert:=true;

-end;

-

-function TRegExpCollection.CheckNew(ARegExp:shortstring):PpcRegExp;

-var

- P : PpcRegExp;

-begin

- if not Find(ARegExp,P) then

-  begin

-   if Count = MaxRegExp then

-    AtFree(0);

-   P:=New(ppcRegExp,Init(ARegExp,PCRE_CASELESS,nil));

-   Insert(P);

-  end;

- CheckNew:=P;

-end;

-

-function pcGrepMatch(WildCard, aStr: string; AOptions:integer; ALocale : Pointer): Boolean;

-var

- PpcRE:PpcRegExp;

-begin

- PpcRE:=New(ppcRegExp,Init(WildCard,AOptions,Alocale));

- pcGrepMatch:=PpcRE^.Search(pchar(AStr),Length(AStr));

- Dispose(PpcRE,Done);

-end;

-

-function pcGrepSub(WildCard, aStr, aRepl: string; AOptions:integer; ALocale : Pointer): string;

-var

- PpcRE:PpcRegExp;

-begin

- PpcRE:=New(ppcRegExp,Init(WildCard,AOptions,Alocale));

- if PpcRE^.Search(pchar(AStr),Length(AStr)) then

-  pcGrepSub:=PpcRE^.GetReplStr(pchar(AStr),ARepl)

- else

-  pcGrepSub:='';

- Dispose(PpcRE,Done);

-end;

-

-function pcFastGrepMatch(WildCard, aStr: string): Boolean;

-var

- PpcRE:PpcRegExp;

-begin

- PpcRE:=PRegExpCache^.CheckNew(WildCard);

- pcFastGrepMatch:=PpcRE^.Search(pchar(AStr),Length(AStr));

-end;

-

-function pcFastGrepSub(WildCard, aStr, aRepl: string): string;

-var

- PpcRE:PpcRegExp;

-begin

- PpcRE:=PRegExpCache^.CheckNew(WildCard);

- if PpcRE^.Search(pchar(AStr),Length(AStr)) then

-  pcFastGrepSub:=PpcRE^.GetReplStr(pchar(AStr),ARepl)

- else

-  pcFastGrepSub:='';

-end;

-

-{$IFDEF PCRE_5_0}

-function pcGetVersion : pchar; assembler; {$FRAME-}{$USES none}

-asm

-  call pcre_version

-end;

-{$ENDIF PCRE_5_0}

-

-function pcError;

-var P: ppcRegExp absolute pRegExp;

-begin

-  Result := (P = nil) or P^.Error;

-  If Result and (P <> nil) then

-  begin

-{     if P^.ErrorPos = 0 then

-      MessageBox(GetString(erRegExpCompile)+'"'+P^.ErrorStr+'"', nil,mfConfirmation+mfOkButton)

-    else}

-      MessageBox(GetString(erRegExpCompile)+'"'+P^.ErrorStr+'"'+GetString(erRegExpCompPos),

-		 @P^.ErrorPos,mfConfirmation+mfOkButton);

-    Dispose(P, Done);

-    P:=nil;

-  end;

-end;

-

-function pcInit;

-var Options : Integer;

-begin

-  If CaseSens then Options := 0 else Options := PCRE_CASELESS;

-  Result := New( PpcRegExp, Init( Pattern,

-				  {DefaultOptions}

-				  startup.MiscMultiData.cfgRegEx.DefaultOptions or Options,

-				  DefaultLocaleTable) );

-end;

-

-Initialization

- PRegExpCache:=New(PRegExpCollection,Init(64));

-Finalization

- Dispose(PRegExpCache,Done);

-End.

diff --git a/dist/pcreposix.c b/dist/pcreposix.c
deleted file mode 100644
index f024423..0000000
--- a/dist/pcreposix.c
+++ /dev/null
@@ -1,430 +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
-           Copyright (c) 1997-2014 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 is a wrapper that provides a POSIX API to the underlying PCRE
-functions. */
-
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-
-/* Ensure that the PCREPOSIX_EXP_xxx macros are set appropriately for
-compiling these functions. This must come before including pcreposix.h, where
-they are set for an application (using these functions) if they have not
-previously been set. */
-
-#if defined(_WIN32) && !defined(PCRE_STATIC)
-#  define PCREPOSIX_EXP_DECL extern __declspec(dllexport)
-#  define PCREPOSIX_EXP_DEFN __declspec(dllexport)
-#endif
-
-/* We include pcre.h before pcre_internal.h so that the PCRE library functions
-are declared as "import" for Windows by defining PCRE_EXP_DECL as "import".
-This is needed even though pcre_internal.h itself includes pcre.h, because it
-does so after it has set PCRE_EXP_DECL to "export" if it is not already set. */
-
-#include "pcre.h"
-#include "pcre_internal.h"
-#include "pcreposix.h"
-
-
-/* Table to translate PCRE compile time error codes into POSIX error codes. */
-
-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 */
-  /* 5 */
-  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 */
-  /* 10 */
-  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 ) */
-  /* 15 */
-  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 */
-  /* 20 */
-  REG_ESIZE,   /* regular expression too large */
-  REG_ESPACE,  /* failed to get memory */
-  REG_EPAREN,  /* unmatched parentheses */
-  REG_ASSERT,  /* internal error: code overflow */
-  REG_BADPAT,  /* unrecognized character after (?< */
-  /* 25 */
-  REG_BADPAT,  /* lookbehind assertion is not fixed length */
-  REG_BADPAT,  /* malformed number or name after (?( */
-  REG_BADPAT,  /* conditional group contains more than two branches */
-  REG_BADPAT,  /* assertion expected after (?( */
-  REG_BADPAT,  /* (?R or (?[+-]digits must be followed by ) */
-  /* 30 */
-  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{} or \o{} is too large */
-  /* 35 */
-  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 */
-  /* 40 */
-  REG_BADPAT,  /* recursive call could loop indefinitely */
-  REG_BADPAT,  /* unrecognized character after (?P */
-  REG_BADPAT,  /* syntax error in subpattern name (missing terminator) */
-  REG_BADPAT,  /* two named subpatterns have the same name */
-  REG_BADPAT,  /* invalid UTF-8 string */
-  /* 45 */
-  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 */
-  REG_BADPAT,  /* subpattern name is too long (maximum 32 characters) */
-  REG_BADPAT,  /* too many named subpatterns (maximum 10,000) */
-  /* 50 */
-  REG_BADPAT,  /* repeated subpattern is too long */
-  REG_BADPAT,  /* octal value is greater than \377 (not in UTF-8 mode) */
-  REG_BADPAT,  /* internal error: overran compiling workspace */
-  REG_BADPAT,  /* internal error: previously-checked referenced subpattern not found */
-  REG_BADPAT,  /* DEFINE group contains more than one branch */
-  /* 55 */
-  REG_BADPAT,  /* repeating a DEFINE group is not allowed */
-  REG_INVARG,  /* inconsistent NEWLINE options */
-  REG_BADPAT,  /* \g is not followed followed by an (optionally braced) non-zero number */
-  REG_BADPAT,  /* a numbered reference must not be zero */
-  REG_BADPAT,  /* an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT) */
-  /* 60 */
-  REG_BADPAT,  /* (*VERB) not recognized */
-  REG_BADPAT,  /* number is too big */
-  REG_BADPAT,  /* subpattern name expected */
-  REG_BADPAT,  /* digit expected after (?+ */
-  REG_BADPAT,  /* ] is an invalid data character in JavaScript compatibility mode */
-  /* 65 */
-  REG_BADPAT,  /* different names for subpatterns of the same number are not allowed */
-  REG_BADPAT,  /* (*MARK) must have an argument */
-  REG_INVARG,  /* this version of PCRE is not compiled with PCRE_UCP support */
-  REG_BADPAT,  /* \c must be followed by an ASCII character */
-  REG_BADPAT,  /* \k is not followed by a braced, angle-bracketed, or quoted name */
-  /* 70 */
-  REG_BADPAT,  /* internal error: unknown opcode in find_fixedlength() */
-  REG_BADPAT,  /* \N is not supported in a class */
-  REG_BADPAT,  /* too many forward references */
-  REG_BADPAT,  /* disallowed UTF-8/16/32 code point (>= 0xd800 && <= 0xdfff) */
-  REG_BADPAT,  /* invalid UTF-16 string (should not occur) */
-  /* 75 */
-  REG_BADPAT,  /* overlong MARK name */
-  REG_BADPAT,  /* character value in \u.... sequence is too large */
-  REG_BADPAT,  /* invalid UTF-32 string (should not occur) */
-  REG_BADPAT,  /* setting UTF is disabled by the application */
-  REG_BADPAT,  /* non-hex character in \\x{} (closing brace missing?) */
-  /* 80 */
-  REG_BADPAT,  /* non-octal character in \o{} (closing brace missing?) */
-  REG_BADPAT,  /* missing opening brace after \o */
-  REG_BADPAT,  /* parentheses too deeply nested */
-  REG_BADPAT,  /* invalid range in character class */
-  REG_BADPAT,  /* group name must start with a non-digit */
-  /* 85 */
-  REG_BADPAT,  /* parentheses too deeply nested (stack check) */
-  REG_BADPAT   /* missing digits in \x{} or \o{} */
-};
-
-/* Table of texts corresponding to POSIX error codes */
-
-static const char *const pstring[] = {
-  "",                                /* Dummy for value 0 */
-  "internal error",                  /* REG_ASSERT */
-  "invalid repeat counts in {}",     /* BADBR      */
-  "pattern error",                   /* BADPAT     */
-  "? * + invalid",                   /* BADRPT     */
-  "unbalanced {}",                   /* EBRACE     */
-  "unbalanced []",                   /* EBRACK     */
-  "collation error - not relevant",  /* ECOLLATE   */
-  "bad class",                       /* ECTYPE     */
-  "bad escape sequence",             /* EESCAPE    */
-  "empty expression",                /* EMPTY      */
-  "unbalanced ()",                   /* EPAREN     */
-  "bad range inside []",             /* ERANGE     */
-  "expression too big",              /* ESIZE      */
-  "failed to get memory",            /* ESPACE     */
-  "bad back reference",              /* ESUBREG    */
-  "bad argument",                    /* INVARG     */
-  "match failed"                     /* NOMATCH    */
-};
-
-
-
-
-/*************************************************
-*          Translate error code to string        *
-*************************************************/
-
-PCREPOSIX_EXP_DEFN size_t PCRE_CALL_CONVENTION
-regerror(int errcode, const regex_t *preg, char *errbuf, size_t errbuf_size)
-{
-const char *message, *addmessage;
-size_t length, addlength;
-
-message = (errcode >= (int)(sizeof(pstring)/sizeof(char *)))?
-  "unknown error code" : pstring[errcode];
-length = strlen(message) + 1;
-
-addmessage = " at offset ";
-addlength = (preg != NULL && (int)preg->re_erroffset != -1)?
-  strlen(addmessage) + 6 : 0;
-
-if (errbuf_size > 0)
-  {
-  if (addlength > 0 && errbuf_size >= length + addlength)
-    sprintf(errbuf, "%s%s%-6d", message, addmessage, (int)preg->re_erroffset);
-  else
-    {
-    strncpy(errbuf, message, errbuf_size - 1);
-    errbuf[errbuf_size-1] = 0;
-    }
-  }
-
-return length + addlength;
-}
-
-
-
-
-/*************************************************
-*           Free store held by a regex           *
-*************************************************/
-
-PCREPOSIX_EXP_DEFN void PCRE_CALL_CONVENTION
-regfree(regex_t *preg)
-{
-(PUBL(free))(preg->re_pcre);
-}
-
-
-
-
-/*************************************************
-*            Compile a regular expression        *
-*************************************************/
-
-/*
-Arguments:
-  preg        points to a structure for recording the compiled expression
-  pattern     the pattern to compile
-  cflags      compilation flags
-
-Returns:      0 on success
-              various non-zero codes on failure
-*/
-
-PCREPOSIX_EXP_DEFN int PCRE_CALL_CONVENTION
-regcomp(regex_t *preg, const char *pattern, int cflags)
-{
-const char *errorptr;
-int erroffset;
-int errorcode;
-int options = 0;
-int re_nsub = 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;
-if ((cflags & REG_NOSUB) != 0)    options |= PCRE_NO_AUTO_CAPTURE;
-if ((cflags & REG_UTF8) != 0)     options |= PCRE_UTF8;
-if ((cflags & REG_UCP) != 0)      options |= PCRE_UCP;
-if ((cflags & REG_UNGREEDY) != 0) options |= PCRE_UNGREEDY;
-
-preg->re_pcre = pcre_compile2(pattern, options, &errorcode, &errorptr,
-  &erroffset, NULL);
-preg->re_erroffset = erroffset;
-
-/* Safety: if the error code is too big for the translation vector (which
-should not happen, but we all make mistakes), return REG_BADPAT. */
-
-if (preg->re_pcre == NULL)
-  {
-  return (errorcode < (int)(sizeof(eint)/sizeof(const int)))?
-    eint[errorcode] : REG_BADPAT;
-  }
-
-(void)pcre_fullinfo((const pcre *)preg->re_pcre, NULL, PCRE_INFO_CAPTURECOUNT,
-  &re_nsub);
-preg->re_nsub = (size_t)re_nsub;
-return 0;
-}
-
-
-
-
-/*************************************************
-*              Match a regular expression        *
-*************************************************/
-
-/* Unfortunately, PCRE requires 3 ints of working space for each captured
-substring, so we have to get and release working store instead of just using
-the POSIX structures as was done in earlier releases when PCRE needed only 2
-ints. However, if the number of possible capturing brackets is small, use a
-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.
-
-If REG_NOSUB was specified at compile time, the PCRE_NO_AUTO_CAPTURE flag will
-be set. When this is the case, the nmatch and pmatch arguments are ignored, and
-the only result is yes/no/error. */
-
-PCREPOSIX_EXP_DEFN int PCRE_CALL_CONVENTION
-regexec(const regex_t *preg, const char *string, size_t nmatch,
-  regmatch_t pmatch[], int eflags)
-{
-int rc, so, eo;
-int options = 0;
-int *ovector = NULL;
-int small_ovector[POSIX_MALLOC_THRESHOLD * 3];
-BOOL allocated_ovector = FALSE;
-BOOL nosub =
-  (REAL_PCRE_OPTIONS((const pcre *)preg->re_pcre) & PCRE_NO_AUTO_CAPTURE) != 0;
-
-if ((eflags & REG_NOTBOL) != 0) options |= PCRE_NOTBOL;
-if ((eflags & REG_NOTEOL) != 0) options |= PCRE_NOTEOL;
-if ((eflags & REG_NOTEMPTY) != 0) options |= PCRE_NOTEMPTY;
-
-((regex_t *)preg)->re_erroffset = (size_t)(-1);  /* Only has meaning after compile */
-
-/* When no string data is being returned, or no vector has been passed in which
-to put it, ensure that nmatch is zero. Otherwise, ensure the vector for holding
-the return data is large enough. */
-
-if (nosub || pmatch == NULL) nmatch = 0;
-
-else if (nmatch > 0)
-  {
-  if (nmatch <= POSIX_MALLOC_THRESHOLD)
-    {
-    ovector = &(small_ovector[0]);
-    }
-  else
-    {
-    if (nmatch > INT_MAX/(sizeof(int) * 3)) return REG_ESPACE;
-    ovector = (int *)malloc(sizeof(int) * nmatch * 3);
-    if (ovector == NULL) return REG_ESPACE;
-    allocated_ovector = TRUE;
-    }
-  }
-
-/* REG_STARTEND is a BSD extension, to allow for non-NUL-terminated strings.
-The man page from OS X says "REG_STARTEND affects only the location of the
-string, not how it is matched". That is why the "so" value is used to bump the
-start location rather than being passed as a PCRE "starting offset". */
-
-if ((eflags & REG_STARTEND) != 0)
-  {
-  so = pmatch[0].rm_so;
-  eo = pmatch[0].rm_eo;
-  }
-else
-  {
-  so = 0;
-  eo = (int)strlen(string);
-  }
-
-rc = pcre_exec((const pcre *)preg->re_pcre, NULL, string + so, (eo - so),
-  0, options, ovector, (int)(nmatch * 3));
-
-if (rc == 0) rc = (int)nmatch;    /* All captured slots were filled in */
-
-/* Successful match */
-
-if (rc >= 0)
-  {
-  size_t i;
-  if (!nosub)
-    {
-    for (i = 0; i < (size_t)rc; i++)
-      {
-      pmatch[i].rm_so = ovector[i*2];
-      pmatch[i].rm_eo = ovector[i*2+1];
-      }
-    if (allocated_ovector) free(ovector);
-    for (; i < nmatch; i++) pmatch[i].rm_so = pmatch[i].rm_eo = -1;
-    }
-  return 0;
-  }
-
-/* Unsuccessful match */
-
-if (allocated_ovector) free(ovector);
-switch(rc)
-  {
-/* ========================================================================== */
-  /* These cases are never obeyed. This is a fudge that causes a compile-time
-  error if the vector eint, which is indexed by compile-time error number, is
-  not the correct length. It seems to be the only way to do such a check at
-  compile time, as the sizeof() operator does not work in the C preprocessor.
-  As all the PCRE_ERROR_xxx values are negative, we can use 0 and 1. */
-
-  case 0:
-  case (sizeof(eint)/sizeof(int) == ERRCOUNT):
-  return REG_ASSERT;
-/* ========================================================================== */
-
-  case PCRE_ERROR_NOMATCH: return REG_NOMATCH;
-  case PCRE_ERROR_NULL: return REG_INVARG;
-  case PCRE_ERROR_BADOPTION: return REG_INVARG;
-  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;
-  case PCRE_ERROR_BADMODE: return REG_INVARG;
-  default: return REG_ASSERT;
-  }
-}
-
-/* End of pcreposix.c */
diff --git a/dist/pcreposix.h b/dist/pcreposix.h
deleted file mode 100644
index c77c0b0..0000000
--- a/dist/pcreposix.h
+++ /dev/null
@@ -1,146 +0,0 @@
-/*************************************************
-*       Perl-Compatible Regular Expressions      *
-*************************************************/
-
-#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.
-
-            Copyright (c) 1997-2012 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. */
-
-#include <stdlib.h>
-
-/* Allow for C++ users */
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Options, mostly defined by POSIX, but with some extras. */
-
-#define REG_ICASE     0x0001   /* Maps to PCRE_CASELESS */
-#define REG_NEWLINE   0x0002   /* Maps to PCRE_MULTILINE */
-#define REG_NOTBOL    0x0004   /* Maps to PCRE_NOTBOL */
-#define REG_NOTEOL    0x0008   /* Maps to PCRE_NOTEOL */
-#define REG_DOTALL    0x0010   /* NOT defined by POSIX; maps to PCRE_DOTALL */
-#define REG_NOSUB     0x0020   /* Maps to PCRE_NO_AUTO_CAPTURE */
-#define REG_UTF8      0x0040   /* NOT defined by POSIX; maps to PCRE_UTF8 */
-#define REG_STARTEND  0x0080   /* BSD feature: pass subject string by so,eo */
-#define REG_NOTEMPTY  0x0100   /* NOT defined by POSIX; maps to PCRE_NOTEMPTY */
-#define REG_UNGREEDY  0x0200   /* NOT defined by POSIX; maps to PCRE_UNGREEDY */
-#define REG_UCP       0x0400   /* NOT defined by POSIX; maps to PCRE_UCP */
-
-/* This is not used by PCRE, but by defining it we make it easier
-to slot PCRE into existing programs that make POSIX calls. */
-
-#define REG_EXTENDED  0
-
-/* Error values. Not all these are relevant or used by the wrapper. */
-
-enum {
-  REG_ASSERT = 1,  /* internal error ? */
-  REG_BADBR,       /* invalid repeat counts in {} */
-  REG_BADPAT,      /* pattern error */
-  REG_BADRPT,      /* ? * + invalid */
-  REG_EBRACE,      /* unbalanced {} */
-  REG_EBRACK,      /* unbalanced [] */
-  REG_ECOLLATE,    /* collation error - not relevant */
-  REG_ECTYPE,      /* bad class */
-  REG_EESCAPE,     /* bad escape sequence */
-  REG_EMPTY,       /* empty expression */
-  REG_EPAREN,      /* unbalanced () */
-  REG_ERANGE,      /* bad range inside [] */
-  REG_ESIZE,       /* expression too big */
-  REG_ESPACE,      /* failed to get memory */
-  REG_ESUBREG,     /* bad back reference */
-  REG_INVARG,      /* bad argument */
-  REG_NOMATCH      /* match failed */
-};
-
-
-/* The structure representing a compiled regular expression. */
-
-typedef struct {
-  void *re_pcre;
-  size_t re_nsub;
-  size_t re_erroffset;
-} regex_t;
-
-/* The structure in which a captured offset is returned. */
-
-typedef int regoff_t;
-
-typedef struct {
-  regoff_t rm_so;
-  regoff_t rm_eo;
-} regmatch_t;
-
-/* When an application links to a PCRE DLL in Windows, the symbols that are
-imported have to be identified as such. When building PCRE, the appropriate
-export settings are needed, and are set in pcreposix.c before including this
-file. */
-
-#if defined(_WIN32) && !defined(PCRE_STATIC) && !defined(PCREPOSIX_EXP_DECL)
-#  define PCREPOSIX_EXP_DECL  extern __declspec(dllimport)
-#  define PCREPOSIX_EXP_DEFN  __declspec(dllimport)
-#endif
-
-/* By default, we use the standard "extern" declarations. */
-
-#ifndef PCREPOSIX_EXP_DECL
-#  ifdef __cplusplus
-#    define PCREPOSIX_EXP_DECL  extern "C"
-#    define PCREPOSIX_EXP_DEFN  extern "C"
-#  else
-#    define PCREPOSIX_EXP_DECL  extern
-#    define PCREPOSIX_EXP_DEFN  extern
-#  endif
-#endif
-
-/* The functions */
-
-PCREPOSIX_EXP_DECL int regcomp(regex_t *, const char *, int);
-PCREPOSIX_EXP_DECL int regexec(const regex_t *, const char *, size_t,
-                     regmatch_t *, int);
-PCREPOSIX_EXP_DECL size_t regerror(int, const regex_t *, char *, size_t);
-PCREPOSIX_EXP_DECL void regfree(regex_t *);
-
-#ifdef __cplusplus
-}   /* extern "C" */
-#endif
-
-#endif /* End of pcreposix.h */
diff --git a/dist/pcretest.c b/dist/pcretest.c
deleted file mode 100644
index 488e419..0000000
--- a/dist/pcretest.c
+++ /dev/null
@@ -1,5742 +0,0 @@
-/*************************************************
-*             PCRE testing program               *
-*************************************************/
-
-/* 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, er, *very* untidy in places. The
-addition of 16-bit support has made it even worse. :-(
-
------------------------------------------------------------------------------
-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 program now supports the testing of all of the 8-bit, 16-bit, and
-32-bit PCRE libraries in a single program. This is different from the modules
-such as pcre_compile.c in the library itself, which are compiled separately for
-each mode. If two modes are enabled, for example, pcre_compile.c is compiled
-twice. By contrast, pcretest.c is compiled only once. Therefore, it must not
-make use of any of the macros from pcre_internal.h that depend on
-COMPILE_PCRE8, COMPILE_PCRE16, or COMPILE_PCRE32. It does, however, make use of
-SUPPORT_PCRE8, SUPPORT_PCRE16, and SUPPORT_PCRE32 to ensure that it calls only
-supported library functions. */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <ctype.h>
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include <time.h>
-#include <locale.h>
-#include <errno.h>
-
-/* Both libreadline and libedit are optionally supported. The user-supplied
-original patch uses readline/readline.h for libedit, but in at least one system
-it is installed as editline/readline.h, so the configuration code now looks for
-that first, falling back to readline/readline.h. */
-
-#if defined(SUPPORT_LIBREADLINE) || defined(SUPPORT_LIBEDIT)
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-#if defined(SUPPORT_LIBREADLINE)
-#include <readline/readline.h>
-#include <readline/history.h>
-#else
-#if defined(HAVE_EDITLINE_READLINE_H)
-#include <editline/readline.h>
-#else
-#include <readline/readline.h>
-#endif
-#endif
-#endif
-
-/* A number of things vary for Windows builds. Originally, pcretest opened its
-input and output without "b"; then I was told that "b" was needed in some
-environments, so it was added for release 5.0 to both the input and output. (It
-makes no difference on Unix-like systems.) Later I was told that it is wrong
-for the input on Windows. I've now abstracted the modes into two macros that
-are set here, to make it easier to fiddle with them, and removed "b" from the
-input mode under Windows. */
-
-#if defined(_WIN32) || defined(WIN32)
-#include <io.h>                /* For _setmode() */
-#include <fcntl.h>             /* For _O_BINARY */
-#define INPUT_MODE   "r"
-#define OUTPUT_MODE  "wb"
-
-#ifndef isatty
-#define isatty _isatty         /* This is what Windows calls them, I'm told, */
-#endif                         /* though in some environments they seem to   */
-                               /* be already defined, hence the #ifndefs.    */
-#ifndef fileno
-#define fileno _fileno
-#endif
-
-/* A user sent this fix for Borland Builder 5 under Windows. */
-
-#ifdef __BORLANDC__
-#define _setmode(handle, mode) setmode(handle, mode)
-#endif
-
-/* Not Windows */
-
-#else
-#include <sys/time.h>          /* These two includes are needed */
-#include <sys/resource.h>      /* for setrlimit(). */
-#if defined NATIVE_ZOS         /* z/OS uses non-binary I/O */
-#define INPUT_MODE   "r"
-#define OUTPUT_MODE  "w"
-#else
-#define INPUT_MODE   "rb"
-#define OUTPUT_MODE  "wb"
-#endif
-#endif
-
-#ifdef __VMS
-#include <ssdef.h>
-void vms_setsymbol( char *, char *, int );
-#endif
-
-
-#define PRIV(name) name
-
-/* We have to 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.
-
-Although pcre_internal.h does itself include pcre.h, we explicitly include it
-here before pcre_internal.h so that the PCRE_EXP_xxx macros get set
-appropriately for an application, not for building PCRE. */
-
-#include "pcre.h"
-#include "pcre_internal.h"
-
-/* The pcre_printint() function, which prints the internal form of a compiled
-regex, is held in a separate file so that (a) it can be compiled in either
-8-, 16- or 32-bit mode, and (b) it can be #included directly in pcre_compile.c
-when that is compiled in debug mode. */
-
-#ifdef SUPPORT_PCRE8
-void pcre_printint(pcre *external_re, FILE *f, BOOL print_lengths);
-#endif
-#ifdef SUPPORT_PCRE16
-void pcre16_printint(pcre *external_re, FILE *f, BOOL print_lengths);
-#endif
-#ifdef SUPPORT_PCRE32
-void pcre32_printint(pcre *external_re, FILE *f, BOOL print_lengths);
-#endif
-
-/* We need access to some of the data tables that PCRE uses. So as not to have
-to keep two copies, we include the source files here, changing the names of the
-external symbols to prevent clashes. */
-
-#define PCRE_INCLUDED
-
-#include "pcre_tables.c"
-#include "pcre_ucd.c"
-
-/* The definition of the macro PRINTABLE, which determines whether to print an
-output character as-is or as a hex value when showing compiled patterns, is
-the same as in the printint.src file. We uses it here in cases when the locale
-has not been explicitly changed, so as to get consistent output from systems
-that differ in their output from isprint() even in the "C" locale. */
-
-#ifdef EBCDIC
-#define PRINTABLE(c) ((c) >= 64 && (c) < 255)
-#else
-#define PRINTABLE(c) ((c) >= 32 && (c) < 127)
-#endif
-
-#define PRINTOK(c) (locale_set? isprint(c) : PRINTABLE(c))
-
-/* Posix support is disabled in 16 or 32 bit only mode. */
-#if !defined SUPPORT_PCRE8 && !defined NOPOSIX
-#define NOPOSIX
-#endif
-
-/* It is possible to compile this test program without including support for
-testing the POSIX interface, though this is not available via the standard
-Makefile. */
-
-#if !defined NOPOSIX
-#include "pcreposix.h"
-#endif
-
-/* It is also possible, originally for the benefit of a version that was
-imported into Exim, to build pcretest without support for UTF8 or UTF16 (define
-NOUTF), without the interface to the DFA matcher (NODFA). In fact, we
-automatically cut out the UTF support if PCRE is built without it. */
-
-#ifndef SUPPORT_UTF
-#ifndef NOUTF
-#define NOUTF
-#endif
-#endif
-
-/* To make the code a bit tidier for 8/16/32-bit support, we define macros
-for all the pcre[16]_xxx functions (except pcre16_fullinfo, which is called
-only from one place and is handled differently). I couldn't dream up any way of
-using a single macro to do this in a generic way, because of the many different
-argument requirements. We know that at least one of SUPPORT_PCRE8 and
-SUPPORT_PCRE16 must be set. First define macros for each individual mode; then
-use these in the definitions of generic macros.
-
-**** Special note about the PCHARSxxx macros: the address of the string to be
-printed is always given as two arguments: a base address followed by an offset.
-The base address is cast to the correct data size for 8 or 16 bit data; the
-offset is in units of this size. If the string were given as base+offset in one
-argument, the casting might be incorrectly applied. */
-
-#ifdef SUPPORT_PCRE8
-
-#define PCHARS8(lv, p, offset, len, f) \
-  lv = pchars((pcre_uint8 *)(p) + offset, len, f)
-
-#define PCHARSV8(p, offset, len, f) \
-  (void)pchars((pcre_uint8 *)(p) + offset, len, f)
-
-#define READ_CAPTURE_NAME8(p, cn8, cn16, cn32, re) \
-  p = read_capture_name8(p, cn8, re)
-
-#define STRLEN8(p) ((int)strlen((char *)p))
-
-#define SET_PCRE_CALLOUT8(callout) \
-  pcre_callout = callout
-
-#define SET_PCRE_STACK_GUARD8(stack_guard) \
-  pcre_stack_guard = stack_guard
-
-#define PCRE_ASSIGN_JIT_STACK8(extra, callback, userdata) \
-   pcre_assign_jit_stack(extra, callback, userdata)
-
-#define PCRE_COMPILE8(re, pat, options, error, erroffset, tables) \
-  re = pcre_compile((char *)pat, options, error, erroffset, tables)
-
-#define PCRE_COPY_NAMED_SUBSTRING8(rc, re, bptr, offsets, count, \
-    namesptr, cbuffer, size) \
-  rc = pcre_copy_named_substring(re, (char *)bptr, offsets, count, \
-    (char *)namesptr, cbuffer, size)
-
-#define PCRE_COPY_SUBSTRING8(rc, bptr, offsets, count, i, cbuffer, size) \
-  rc = pcre_copy_substring((char *)bptr, offsets, count, i, cbuffer, size)
-
-#define PCRE_DFA_EXEC8(count, re, extra, bptr, len, start_offset, options, \
-    offsets, size_offsets, workspace, size_workspace) \
-  count = pcre_dfa_exec(re, extra, (char *)bptr, len, start_offset, options, \
-    offsets, size_offsets, workspace, size_workspace)
-
-#define PCRE_EXEC8(count, re, extra, bptr, len, start_offset, options, \
-    offsets, size_offsets) \
-  count = pcre_exec(re, extra, (char *)bptr, len, start_offset, options, \
-    offsets, size_offsets)
-
-#define PCRE_FREE_STUDY8(extra) \
-  pcre_free_study(extra)
-
-#define PCRE_FREE_SUBSTRING8(substring) \
-  pcre_free_substring(substring)
-
-#define PCRE_FREE_SUBSTRING_LIST8(listptr) \
-  pcre_free_substring_list(listptr)
-
-#define PCRE_GET_NAMED_SUBSTRING8(rc, re, bptr, offsets, count, \
-    getnamesptr, subsptr) \
-  rc = pcre_get_named_substring(re, (char *)bptr, offsets, count, \
-    (char *)getnamesptr, subsptr)
-
-#define PCRE_GET_STRINGNUMBER8(n, rc, ptr) \
-  n = pcre_get_stringnumber(re, (char *)ptr)
-
-#define PCRE_GET_SUBSTRING8(rc, bptr, offsets, count, i, subsptr) \
-  rc = pcre_get_substring((char *)bptr, offsets, count, i, subsptr)
-
-#define PCRE_GET_SUBSTRING_LIST8(rc, bptr, offsets, count, listptr) \
-  rc = pcre_get_substring_list((const char *)bptr, offsets, count, listptr)
-
-#define PCRE_PATTERN_TO_HOST_BYTE_ORDER8(rc, re, extra, tables) \
-  rc = pcre_pattern_to_host_byte_order(re, extra, tables)
-
-#define PCRE_PRINTINT8(re, outfile, debug_lengths) \
-  pcre_printint(re, outfile, debug_lengths)
-
-#define PCRE_STUDY8(extra, re, options, error) \
-  extra = pcre_study(re, options, error)
-
-#define PCRE_JIT_STACK_ALLOC8(startsize, maxsize) \
-  pcre_jit_stack_alloc(startsize, maxsize)
-
-#define PCRE_JIT_STACK_FREE8(stack) \
-  pcre_jit_stack_free(stack)
-
-#define pcre8_maketables pcre_maketables
-
-#endif /* SUPPORT_PCRE8 */
-
-/* -----------------------------------------------------------*/
-
-#ifdef SUPPORT_PCRE16
-
-#define PCHARS16(lv, p, offset, len, f) \
-  lv = pchars16((PCRE_SPTR16)(p) + offset, len, f)
-
-#define PCHARSV16(p, offset, len, f) \
-  (void)pchars16((PCRE_SPTR16)(p) + offset, len, f)
-
-#define READ_CAPTURE_NAME16(p, cn8, cn16, cn32, re) \
-  p = read_capture_name16(p, cn16, re)
-
-#define STRLEN16(p) ((int)strlen16((PCRE_SPTR16)p))
-
-#define SET_PCRE_CALLOUT16(callout) \
-  pcre16_callout = (int (*)(pcre16_callout_block *))callout
-
-#define SET_PCRE_STACK_GUARD16(stack_guard) \
-  pcre16_stack_guard = (int (*)(void))stack_guard
-
-#define PCRE_ASSIGN_JIT_STACK16(extra, callback, userdata) \
-  pcre16_assign_jit_stack((pcre16_extra *)extra, \
-    (pcre16_jit_callback)callback, userdata)
-
-#define PCRE_COMPILE16(re, pat, options, error, erroffset, tables) \
-  re = (pcre *)pcre16_compile((PCRE_SPTR16)pat, options, error, erroffset, \
-    tables)
-
-#define PCRE_COPY_NAMED_SUBSTRING16(rc, re, bptr, offsets, count, \
-    namesptr, cbuffer, size) \
-  rc = pcre16_copy_named_substring((pcre16 *)re, (PCRE_SPTR16)bptr, offsets, \
-    count, (PCRE_SPTR16)namesptr, (PCRE_UCHAR16 *)cbuffer, size/2)
-
-#define PCRE_COPY_SUBSTRING16(rc, bptr, offsets, count, i, cbuffer, size) \
-  rc = pcre16_copy_substring((PCRE_SPTR16)bptr, offsets, count, i, \
-    (PCRE_UCHAR16 *)cbuffer, size/2)
-
-#define PCRE_DFA_EXEC16(count, re, extra, bptr, len, start_offset, options, \
-    offsets, size_offsets, workspace, size_workspace) \
-  count = pcre16_dfa_exec((pcre16 *)re, (pcre16_extra *)extra, \
-    (PCRE_SPTR16)bptr, len, start_offset, options, offsets, size_offsets, \
-    workspace, size_workspace)
-
-#define PCRE_EXEC16(count, re, extra, bptr, len, start_offset, options, \
-    offsets, size_offsets) \
-  count = pcre16_exec((pcre16 *)re, (pcre16_extra *)extra, (PCRE_SPTR16)bptr, \
-    len, start_offset, options, offsets, size_offsets)
-
-#define PCRE_FREE_STUDY16(extra) \
-  pcre16_free_study((pcre16_extra *)extra)
-
-#define PCRE_FREE_SUBSTRING16(substring) \
-  pcre16_free_substring((PCRE_SPTR16)substring)
-
-#define PCRE_FREE_SUBSTRING_LIST16(listptr) \
-  pcre16_free_substring_list((PCRE_SPTR16 *)listptr)
-
-#define PCRE_GET_NAMED_SUBSTRING16(rc, re, bptr, offsets, count, \
-    getnamesptr, subsptr) \
-  rc = pcre16_get_named_substring((pcre16 *)re, (PCRE_SPTR16)bptr, offsets, \
-    count, (PCRE_SPTR16)getnamesptr, (PCRE_SPTR16 *)(void*)subsptr)
-
-#define PCRE_GET_STRINGNUMBER16(n, rc, ptr) \
-  n = pcre16_get_stringnumber(re, (PCRE_SPTR16)ptr)
-
-#define PCRE_GET_SUBSTRING16(rc, bptr, offsets, count, i, subsptr) \
-  rc = pcre16_get_substring((PCRE_SPTR16)bptr, offsets, count, i, \
-    (PCRE_SPTR16 *)(void*)subsptr)
-
-#define PCRE_GET_SUBSTRING_LIST16(rc, bptr, offsets, count, listptr) \
-  rc = pcre16_get_substring_list((PCRE_SPTR16)bptr, offsets, count, \
-    (PCRE_SPTR16 **)(void*)listptr)
-
-#define PCRE_PATTERN_TO_HOST_BYTE_ORDER16(rc, re, extra, tables) \
-  rc = pcre16_pattern_to_host_byte_order((pcre16 *)re, (pcre16_extra *)extra, \
-    tables)
-
-#define PCRE_PRINTINT16(re, outfile, debug_lengths) \
-  pcre16_printint(re, outfile, debug_lengths)
-
-#define PCRE_STUDY16(extra, re, options, error) \
-  extra = (pcre_extra *)pcre16_study((pcre16 *)re, options, error)
-
-#define PCRE_JIT_STACK_ALLOC16(startsize, maxsize) \
-  (pcre_jit_stack *)pcre16_jit_stack_alloc(startsize, maxsize)
-
-#define PCRE_JIT_STACK_FREE16(stack) \
-  pcre16_jit_stack_free((pcre16_jit_stack *)stack)
-
-#endif /* SUPPORT_PCRE16 */
-
-/* -----------------------------------------------------------*/
-
-#ifdef SUPPORT_PCRE32
-
-#define PCHARS32(lv, p, offset, len, f) \
-  lv = pchars32((PCRE_SPTR32)(p) + offset, len, use_utf, f)
-
-#define PCHARSV32(p, offset, len, f)                \
-  (void)pchars32((PCRE_SPTR32)(p) + offset, len, use_utf, f)
-
-#define READ_CAPTURE_NAME32(p, cn8, cn16, cn32, re) \
-  p = read_capture_name32(p, cn32, re)
-
-#define STRLEN32(p) ((int)strlen32((PCRE_SPTR32)p))
-
-#define SET_PCRE_CALLOUT32(callout) \
-  pcre32_callout = (int (*)(pcre32_callout_block *))callout
-
-#define SET_PCRE_STACK_GUARD32(stack_guard) \
-  pcre32_stack_guard = (int (*)(void))stack_guard
-
-#define PCRE_ASSIGN_JIT_STACK32(extra, callback, userdata) \
-  pcre32_assign_jit_stack((pcre32_extra *)extra, \
-    (pcre32_jit_callback)callback, userdata)
-
-#define PCRE_COMPILE32(re, pat, options, error, erroffset, tables) \
-  re = (pcre *)pcre32_compile((PCRE_SPTR32)pat, options, error, erroffset, \
-    tables)
-
-#define PCRE_COPY_NAMED_SUBSTRING32(rc, re, bptr, offsets, count, \
-    namesptr, cbuffer, size) \
-  rc = pcre32_copy_named_substring((pcre32 *)re, (PCRE_SPTR32)bptr, offsets, \
-    count, (PCRE_SPTR32)namesptr, (PCRE_UCHAR32 *)cbuffer, size/2)
-
-#define PCRE_COPY_SUBSTRING32(rc, bptr, offsets, count, i, cbuffer, size) \
-  rc = pcre32_copy_substring((PCRE_SPTR32)bptr, offsets, count, i, \
-    (PCRE_UCHAR32 *)cbuffer, size/2)
-
-#define PCRE_DFA_EXEC32(count, re, extra, bptr, len, start_offset, options, \
-    offsets, size_offsets, workspace, size_workspace) \
-  count = pcre32_dfa_exec((pcre32 *)re, (pcre32_extra *)extra, \
-    (PCRE_SPTR32)bptr, len, start_offset, options, offsets, size_offsets, \
-    workspace, size_workspace)
-
-#define PCRE_EXEC32(count, re, extra, bptr, len, start_offset, options, \
-    offsets, size_offsets) \
-  count = pcre32_exec((pcre32 *)re, (pcre32_extra *)extra, (PCRE_SPTR32)bptr, \
-    len, start_offset, options, offsets, size_offsets)
-
-#define PCRE_FREE_STUDY32(extra) \
-  pcre32_free_study((pcre32_extra *)extra)
-
-#define PCRE_FREE_SUBSTRING32(substring) \
-  pcre32_free_substring((PCRE_SPTR32)substring)
-
-#define PCRE_FREE_SUBSTRING_LIST32(listptr) \
-  pcre32_free_substring_list((PCRE_SPTR32 *)listptr)
-
-#define PCRE_GET_NAMED_SUBSTRING32(rc, re, bptr, offsets, count, \
-    getnamesptr, subsptr) \
-  rc = pcre32_get_named_substring((pcre32 *)re, (PCRE_SPTR32)bptr, offsets, \
-    count, (PCRE_SPTR32)getnamesptr, (PCRE_SPTR32 *)(void*)subsptr)
-
-#define PCRE_GET_STRINGNUMBER32(n, rc, ptr) \
-  n = pcre32_get_stringnumber(re, (PCRE_SPTR32)ptr)
-
-#define PCRE_GET_SUBSTRING32(rc, bptr, offsets, count, i, subsptr) \
-  rc = pcre32_get_substring((PCRE_SPTR32)bptr, offsets, count, i, \
-    (PCRE_SPTR32 *)(void*)subsptr)
-
-#define PCRE_GET_SUBSTRING_LIST32(rc, bptr, offsets, count, listptr) \
-  rc = pcre32_get_substring_list((PCRE_SPTR32)bptr, offsets, count, \
-    (PCRE_SPTR32 **)(void*)listptr)
-
-#define PCRE_PATTERN_TO_HOST_BYTE_ORDER32(rc, re, extra, tables) \
-  rc = pcre32_pattern_to_host_byte_order((pcre32 *)re, (pcre32_extra *)extra, \
-    tables)
-
-#define PCRE_PRINTINT32(re, outfile, debug_lengths) \
-  pcre32_printint(re, outfile, debug_lengths)
-
-#define PCRE_STUDY32(extra, re, options, error) \
-  extra = (pcre_extra *)pcre32_study((pcre32 *)re, options, error)
-
-#define PCRE_JIT_STACK_ALLOC32(startsize, maxsize) \
-  (pcre_jit_stack *)pcre32_jit_stack_alloc(startsize, maxsize)
-
-#define PCRE_JIT_STACK_FREE32(stack) \
-  pcre32_jit_stack_free((pcre32_jit_stack *)stack)
-
-#endif /* SUPPORT_PCRE32 */
-
-
-/* ----- More than one mode is supported; a runtime test is needed, except for
-pcre_config(), and the JIT stack functions, when it doesn't matter which
-available version is called. ----- */
-
-enum {
-  PCRE8_MODE,
-  PCRE16_MODE,
-  PCRE32_MODE
-};
-
-#if (defined (SUPPORT_PCRE8) + defined (SUPPORT_PCRE16) + \
-     defined (SUPPORT_PCRE32)) >= 2
-
-#define CHAR_SIZE (1 << pcre_mode)
-
-/* There doesn't seem to be an easy way of writing these macros that can cope
-with the 3 pairs of bit sizes plus all three bit sizes. So just handle all the
-cases separately. */
-
-/* ----- All three modes supported ----- */
-
-#if defined(SUPPORT_PCRE8) && defined(SUPPORT_PCRE16) && defined(SUPPORT_PCRE32)
-
-#define PCHARS(lv, p, offset, len, f) \
-  if (pcre_mode == PCRE32_MODE) \
-    PCHARS32(lv, p, offset, len, f); \
-  else if (pcre_mode == PCRE16_MODE) \
-    PCHARS16(lv, p, offset, len, f); \
-  else \
-    PCHARS8(lv, p, offset, len, f)
-
-#define PCHARSV(p, offset, len, f) \
-  if (pcre_mode == PCRE32_MODE) \
-    PCHARSV32(p, offset, len, f); \
-  else if (pcre_mode == PCRE16_MODE) \
-    PCHARSV16(p, offset, len, f); \
-  else \
-    PCHARSV8(p, offset, len, f)
-
-#define READ_CAPTURE_NAME(p, cn8, cn16, cn32, re) \
-  if (pcre_mode == PCRE32_MODE) \
-    READ_CAPTURE_NAME32(p, cn8, cn16, cn32, re); \
-  else if (pcre_mode == PCRE16_MODE) \
-    READ_CAPTURE_NAME16(p, cn8, cn16, cn32, re); \
-  else \
-    READ_CAPTURE_NAME8(p, cn8, cn16, cn32, re)
-
-#define SET_PCRE_CALLOUT(callout) \
-  if (pcre_mode == PCRE32_MODE) \
-    SET_PCRE_CALLOUT32(callout); \
-  else if (pcre_mode == PCRE16_MODE) \
-    SET_PCRE_CALLOUT16(callout); \
-  else \
-    SET_PCRE_CALLOUT8(callout)
-
-#define SET_PCRE_STACK_GUARD(stack_guard) \
-  if (pcre_mode == PCRE32_MODE) \
-    SET_PCRE_STACK_GUARD32(stack_guard); \
-  else if (pcre_mode == PCRE16_MODE) \
-    SET_PCRE_STACK_GUARD16(stack_guard); \
-  else \
-    SET_PCRE_STACK_GUARD8(stack_guard)
-
-#define STRLEN(p) (pcre_mode == PCRE32_MODE ? STRLEN32(p) : pcre_mode == PCRE16_MODE ? STRLEN16(p) : STRLEN8(p))
-
-#define PCRE_ASSIGN_JIT_STACK(extra, callback, userdata) \
-  if (pcre_mode == PCRE32_MODE) \
-    PCRE_ASSIGN_JIT_STACK32(extra, callback, userdata); \
-  else if (pcre_mode == PCRE16_MODE) \
-    PCRE_ASSIGN_JIT_STACK16(extra, callback, userdata); \
-  else \
-    PCRE_ASSIGN_JIT_STACK8(extra, callback, userdata)
-
-#define PCRE_COMPILE(re, pat, options, error, erroffset, tables) \
-  if (pcre_mode == PCRE32_MODE) \
-    PCRE_COMPILE32(re, pat, options, error, erroffset, tables); \
-  else if (pcre_mode == PCRE16_MODE) \
-    PCRE_COMPILE16(re, pat, options, error, erroffset, tables); \
-  else \
-    PCRE_COMPILE8(re, pat, options, error, erroffset, tables)
-
-#define PCRE_CONFIG pcre_config
-
-#define PCRE_COPY_NAMED_SUBSTRING(rc, re, bptr, offsets, count, \
-    namesptr, cbuffer, size) \
-  if (pcre_mode == PCRE32_MODE) \
-    PCRE_COPY_NAMED_SUBSTRING32(rc, re, bptr, offsets, count, \
-      namesptr, cbuffer, size); \
-  else if (pcre_mode == PCRE16_MODE) \
-    PCRE_COPY_NAMED_SUBSTRING16(rc, re, bptr, offsets, count, \
-      namesptr, cbuffer, size); \
-  else \
-    PCRE_COPY_NAMED_SUBSTRING8(rc, re, bptr, offsets, count, \
-      namesptr, cbuffer, size)
-
-#define PCRE_COPY_SUBSTRING(rc, bptr, offsets, count, i, cbuffer, size) \
-  if (pcre_mode == PCRE32_MODE) \
-    PCRE_COPY_SUBSTRING32(rc, bptr, offsets, count, i, cbuffer, size); \
-  else if (pcre_mode == PCRE16_MODE) \
-    PCRE_COPY_SUBSTRING16(rc, bptr, offsets, count, i, cbuffer, size); \
-  else \
-    PCRE_COPY_SUBSTRING8(rc, bptr, offsets, count, i, cbuffer, size)
-
-#define PCRE_DFA_EXEC(count, re, extra, bptr, len, start_offset, options, \
-    offsets, size_offsets, workspace, size_workspace) \
-  if (pcre_mode == PCRE32_MODE) \
-    PCRE_DFA_EXEC32(count, re, extra, bptr, len, start_offset, options, \
-      offsets, size_offsets, workspace, size_workspace); \
-  else if (pcre_mode == PCRE16_MODE) \
-    PCRE_DFA_EXEC16(count, re, extra, bptr, len, start_offset, options, \
-      offsets, size_offsets, workspace, size_workspace); \
-  else \
-    PCRE_DFA_EXEC8(count, re, extra, bptr, len, start_offset, options, \
-      offsets, size_offsets, workspace, size_workspace)
-
-#define PCRE_EXEC(count, re, extra, bptr, len, start_offset, options, \
-    offsets, size_offsets) \
-  if (pcre_mode == PCRE32_MODE) \
-    PCRE_EXEC32(count, re, extra, bptr, len, start_offset, options, \
-      offsets, size_offsets); \
-  else if (pcre_mode == PCRE16_MODE) \
-    PCRE_EXEC16(count, re, extra, bptr, len, start_offset, options, \
-      offsets, size_offsets); \
-  else \
-    PCRE_EXEC8(count, re, extra, bptr, len, start_offset, options, \
-      offsets, size_offsets)
-
-#define PCRE_FREE_STUDY(extra) \
-  if (pcre_mode == PCRE32_MODE) \
-    PCRE_FREE_STUDY32(extra); \
-  else if (pcre_mode == PCRE16_MODE) \
-    PCRE_FREE_STUDY16(extra); \
-  else \
-    PCRE_FREE_STUDY8(extra)
-
-#define PCRE_FREE_SUBSTRING(substring) \
-  if (pcre_mode == PCRE32_MODE) \
-    PCRE_FREE_SUBSTRING32(substring); \
-  else if (pcre_mode == PCRE16_MODE) \
-    PCRE_FREE_SUBSTRING16(substring); \
-  else \
-    PCRE_FREE_SUBSTRING8(substring)
-
-#define PCRE_FREE_SUBSTRING_LIST(listptr) \
-  if (pcre_mode == PCRE32_MODE) \
-    PCRE_FREE_SUBSTRING_LIST32(listptr); \
-  else if (pcre_mode == PCRE16_MODE) \
-    PCRE_FREE_SUBSTRING_LIST16(listptr); \
-  else \
-    PCRE_FREE_SUBSTRING_LIST8(listptr)
-
-#define PCRE_GET_NAMED_SUBSTRING(rc, re, bptr, offsets, count, \
-    getnamesptr, subsptr) \
-  if (pcre_mode == PCRE32_MODE) \
-    PCRE_GET_NAMED_SUBSTRING32(rc, re, bptr, offsets, count, \
-      getnamesptr, subsptr); \
-  else if (pcre_mode == PCRE16_MODE) \
-    PCRE_GET_NAMED_SUBSTRING16(rc, re, bptr, offsets, count, \
-      getnamesptr, subsptr); \
-  else \
-    PCRE_GET_NAMED_SUBSTRING8(rc, re, bptr, offsets, count, \
-      getnamesptr, subsptr)
-
-#define PCRE_GET_STRINGNUMBER(n, rc, ptr) \
-  if (pcre_mode == PCRE32_MODE) \
-    PCRE_GET_STRINGNUMBER32(n, rc, ptr); \
-  else if (pcre_mode == PCRE16_MODE) \
-    PCRE_GET_STRINGNUMBER16(n, rc, ptr); \
-  else \
-    PCRE_GET_STRINGNUMBER8(n, rc, ptr)
-
-#define PCRE_GET_SUBSTRING(rc, bptr, use_offsets, count, i, subsptr) \
-  if (pcre_mode == PCRE32_MODE) \
-    PCRE_GET_SUBSTRING32(rc, bptr, use_offsets, count, i, subsptr); \
-  else if (pcre_mode == PCRE16_MODE) \
-    PCRE_GET_SUBSTRING16(rc, bptr, use_offsets, count, i, subsptr); \
-  else \
-    PCRE_GET_SUBSTRING8(rc, bptr, use_offsets, count, i, subsptr)
-
-#define PCRE_GET_SUBSTRING_LIST(rc, bptr, offsets, count, listptr) \
-  if (pcre_mode == PCRE32_MODE) \
-    PCRE_GET_SUBSTRING_LIST32(rc, bptr, offsets, count, listptr); \
-  else if (pcre_mode == PCRE16_MODE) \
-    PCRE_GET_SUBSTRING_LIST16(rc, bptr, offsets, count, listptr); \
-  else \
-    PCRE_GET_SUBSTRING_LIST8(rc, bptr, offsets, count, listptr)
-
-#define PCRE_JIT_STACK_ALLOC(startsize, maxsize) \
-  (pcre_mode == PCRE32_MODE ? \
-     PCRE_JIT_STACK_ALLOC32(startsize, maxsize) \
-    : pcre_mode == PCRE16_MODE ? \
-      PCRE_JIT_STACK_ALLOC16(startsize, maxsize) \
-      : PCRE_JIT_STACK_ALLOC8(startsize, maxsize))
-
-#define PCRE_JIT_STACK_FREE(stack) \
-  if (pcre_mode == PCRE32_MODE) \
-    PCRE_JIT_STACK_FREE32(stack); \
-  else if (pcre_mode == PCRE16_MODE) \
-    PCRE_JIT_STACK_FREE16(stack); \
-  else \
-    PCRE_JIT_STACK_FREE8(stack)
-
-#define PCRE_MAKETABLES \
-  (pcre_mode == PCRE32_MODE ? pcre32_maketables() : pcre_mode == PCRE16_MODE ? pcre16_maketables() : pcre_maketables())
-
-#define PCRE_PATTERN_TO_HOST_BYTE_ORDER(rc, re, extra, tables) \
-  if (pcre_mode == PCRE32_MODE) \
-    PCRE_PATTERN_TO_HOST_BYTE_ORDER32(rc, re, extra, tables); \
-  else if (pcre_mode == PCRE16_MODE) \
-    PCRE_PATTERN_TO_HOST_BYTE_ORDER16(rc, re, extra, tables); \
-  else \
-    PCRE_PATTERN_TO_HOST_BYTE_ORDER8(rc, re, extra, tables)
-
-#define PCRE_PRINTINT(re, outfile, debug_lengths) \
-  if (pcre_mode == PCRE32_MODE) \
-    PCRE_PRINTINT32(re, outfile, debug_lengths); \
-  else if (pcre_mode == PCRE16_MODE) \
-    PCRE_PRINTINT16(re, outfile, debug_lengths); \
-  else \
-    PCRE_PRINTINT8(re, outfile, debug_lengths)
-
-#define PCRE_STUDY(extra, re, options, error) \
-  if (pcre_mode == PCRE32_MODE) \
-    PCRE_STUDY32(extra, re, options, error); \
-  else if (pcre_mode == PCRE16_MODE) \
-    PCRE_STUDY16(extra, re, options, error); \
-  else \
-    PCRE_STUDY8(extra, re, options, error)
-
-
-/* ----- Two out of three modes are supported ----- */
-
-#else
-
-/* We can use some macro trickery to make a single set of definitions work in
-the three different cases. */
-
-/* ----- 32-bit and 16-bit but not 8-bit supported ----- */
-
-#if defined(SUPPORT_PCRE32) && defined(SUPPORT_PCRE16)
-#define BITONE 32
-#define BITTWO 16
-
-/* ----- 32-bit and 8-bit but not 16-bit supported ----- */
-
-#elif defined(SUPPORT_PCRE32) && defined(SUPPORT_PCRE8)
-#define BITONE 32
-#define BITTWO 8
-
-/* ----- 16-bit and 8-bit but not 32-bit supported ----- */
-
-#else
-#define BITONE 16
-#define BITTWO 8
-#endif
-
-#define glue(a,b) a##b
-#define G(a,b) glue(a,b)
-
-
-/* ----- Common macros for two-mode cases ----- */
-
-#define PCHARS(lv, p, offset, len, f) \
-  if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \
-    G(PCHARS,BITONE)(lv, p, offset, len, f); \
-  else \
-    G(PCHARS,BITTWO)(lv, p, offset, len, f)
-
-#define PCHARSV(p, offset, len, f) \
-  if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \
-    G(PCHARSV,BITONE)(p, offset, len, f); \
-  else \
-    G(PCHARSV,BITTWO)(p, offset, len, f)
-
-#define READ_CAPTURE_NAME(p, cn8, cn16, cn32, re) \
-  if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \
-    G(READ_CAPTURE_NAME,BITONE)(p, cn8, cn16, cn32, re); \
-  else \
-    G(READ_CAPTURE_NAME,BITTWO)(p, cn8, cn16, cn32, re)
-
-#define SET_PCRE_CALLOUT(callout) \
-  if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \
-    G(SET_PCRE_CALLOUT,BITONE)(callout); \
-  else \
-    G(SET_PCRE_CALLOUT,BITTWO)(callout)
-
-#define SET_PCRE_STACK_GUARD(stack_guard) \
-  if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \
-    G(SET_PCRE_STACK_GUARD,BITONE)(stack_guard); \
-  else \
-    G(SET_PCRE_STACK_GUARD,BITTWO)(stack_guard)
-
-#define STRLEN(p) ((pcre_mode == G(G(PCRE,BITONE),_MODE)) ? \
-  G(STRLEN,BITONE)(p) : G(STRLEN,BITTWO)(p))
-
-#define PCRE_ASSIGN_JIT_STACK(extra, callback, userdata) \
-  if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \
-    G(PCRE_ASSIGN_JIT_STACK,BITONE)(extra, callback, userdata); \
-  else \
-    G(PCRE_ASSIGN_JIT_STACK,BITTWO)(extra, callback, userdata)
-
-#define PCRE_COMPILE(re, pat, options, error, erroffset, tables) \
-  if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \
-    G(PCRE_COMPILE,BITONE)(re, pat, options, error, erroffset, tables); \
-  else \
-    G(PCRE_COMPILE,BITTWO)(re, pat, options, error, erroffset, tables)
-
-#define PCRE_CONFIG G(G(pcre,BITONE),_config)
-
-#define PCRE_COPY_NAMED_SUBSTRING(rc, re, bptr, offsets, count, \
-    namesptr, cbuffer, size) \
-  if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \
-    G(PCRE_COPY_NAMED_SUBSTRING,BITONE)(rc, re, bptr, offsets, count, \
-      namesptr, cbuffer, size); \
-  else \
-    G(PCRE_COPY_NAMED_SUBSTRING,BITTWO)(rc, re, bptr, offsets, count, \
-      namesptr, cbuffer, size)
-
-#define PCRE_COPY_SUBSTRING(rc, bptr, offsets, count, i, cbuffer, size) \
-  if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \
-    G(PCRE_COPY_SUBSTRING,BITONE)(rc, bptr, offsets, count, i, cbuffer, size); \
-  else \
-    G(PCRE_COPY_SUBSTRING,BITTWO)(rc, bptr, offsets, count, i, cbuffer, size)
-
-#define PCRE_DFA_EXEC(count, re, extra, bptr, len, start_offset, options, \
-    offsets, size_offsets, workspace, size_workspace) \
-  if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \
-    G(PCRE_DFA_EXEC,BITONE)(count, re, extra, bptr, len, start_offset, options, \
-      offsets, size_offsets, workspace, size_workspace); \
-  else \
-    G(PCRE_DFA_EXEC,BITTWO)(count, re, extra, bptr, len, start_offset, options, \
-      offsets, size_offsets, workspace, size_workspace)
-
-#define PCRE_EXEC(count, re, extra, bptr, len, start_offset, options, \
-    offsets, size_offsets) \
-  if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \
-    G(PCRE_EXEC,BITONE)(count, re, extra, bptr, len, start_offset, options, \
-      offsets, size_offsets); \
-  else \
-    G(PCRE_EXEC,BITTWO)(count, re, extra, bptr, len, start_offset, options, \
-      offsets, size_offsets)
-
-#define PCRE_FREE_STUDY(extra) \
-  if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \
-    G(PCRE_FREE_STUDY,BITONE)(extra); \
-  else \
-    G(PCRE_FREE_STUDY,BITTWO)(extra)
-
-#define PCRE_FREE_SUBSTRING(substring) \
-  if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \
-    G(PCRE_FREE_SUBSTRING,BITONE)(substring); \
-  else \
-    G(PCRE_FREE_SUBSTRING,BITTWO)(substring)
-
-#define PCRE_FREE_SUBSTRING_LIST(listptr) \
-  if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \
-    G(PCRE_FREE_SUBSTRING_LIST,BITONE)(listptr); \
-  else \
-    G(PCRE_FREE_SUBSTRING_LIST,BITTWO)(listptr)
-
-#define PCRE_GET_NAMED_SUBSTRING(rc, re, bptr, offsets, count, \
-    getnamesptr, subsptr) \
-  if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \
-    G(PCRE_GET_NAMED_SUBSTRING,BITONE)(rc, re, bptr, offsets, count, \
-      getnamesptr, subsptr); \
-  else \
-    G(PCRE_GET_NAMED_SUBSTRING,BITTWO)(rc, re, bptr, offsets, count, \
-      getnamesptr, subsptr)
-
-#define PCRE_GET_STRINGNUMBER(n, rc, ptr) \
-  if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \
-    G(PCRE_GET_STRINGNUMBER,BITONE)(n, rc, ptr); \
-  else \
-    G(PCRE_GET_STRINGNUMBER,BITTWO)(n, rc, ptr)
-
-#define PCRE_GET_SUBSTRING(rc, bptr, use_offsets, count, i, subsptr) \
-  if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \
-    G(PCRE_GET_SUBSTRING,BITONE)(rc, bptr, use_offsets, count, i, subsptr); \
-  else \
-    G(PCRE_GET_SUBSTRING,BITTWO)(rc, bptr, use_offsets, count, i, subsptr)
-
-#define PCRE_GET_SUBSTRING_LIST(rc, bptr, offsets, count, listptr) \
-  if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \
-    G(PCRE_GET_SUBSTRING_LIST,BITONE)(rc, bptr, offsets, count, listptr); \
-  else \
-    G(PCRE_GET_SUBSTRING_LIST,BITTWO)(rc, bptr, offsets, count, listptr)
-
-#define PCRE_JIT_STACK_ALLOC(startsize, maxsize) \
-  (pcre_mode == G(G(PCRE,BITONE),_MODE)) ? \
-     G(PCRE_JIT_STACK_ALLOC,BITONE)(startsize, maxsize) \
-    : G(PCRE_JIT_STACK_ALLOC,BITTWO)(startsize, maxsize)
-
-#define PCRE_JIT_STACK_FREE(stack) \
-  if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \
-    G(PCRE_JIT_STACK_FREE,BITONE)(stack); \
-  else \
-    G(PCRE_JIT_STACK_FREE,BITTWO)(stack)
-
-#define PCRE_MAKETABLES \
-  (pcre_mode == G(G(PCRE,BITONE),_MODE)) ? \
-    G(G(pcre,BITONE),_maketables)() : G(G(pcre,BITTWO),_maketables)()
-
-#define PCRE_PATTERN_TO_HOST_BYTE_ORDER(rc, re, extra, tables) \
-  if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \
-    G(PCRE_PATTERN_TO_HOST_BYTE_ORDER,BITONE)(rc, re, extra, tables); \
-  else \
-    G(PCRE_PATTERN_TO_HOST_BYTE_ORDER,BITTWO)(rc, re, extra, tables)
-
-#define PCRE_PRINTINT(re, outfile, debug_lengths) \
-  if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \
-    G(PCRE_PRINTINT,BITONE)(re, outfile, debug_lengths); \
-  else \
-    G(PCRE_PRINTINT,BITTWO)(re, outfile, debug_lengths)
-
-#define PCRE_STUDY(extra, re, options, error) \
-  if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \
-    G(PCRE_STUDY,BITONE)(extra, re, options, error); \
-  else \
-    G(PCRE_STUDY,BITTWO)(extra, re, options, error)
-
-#endif  /* Two out of three modes */
-
-/* ----- End of cases where more than one mode is supported ----- */
-
-
-/* ----- Only 8-bit mode is supported ----- */
-
-#elif defined SUPPORT_PCRE8
-#define CHAR_SIZE                 1
-#define PCHARS                    PCHARS8
-#define PCHARSV                   PCHARSV8
-#define READ_CAPTURE_NAME         READ_CAPTURE_NAME8
-#define SET_PCRE_CALLOUT          SET_PCRE_CALLOUT8
-#define SET_PCRE_STACK_GUARD      SET_PCRE_STACK_GUARD8
-#define STRLEN                    STRLEN8
-#define PCRE_ASSIGN_JIT_STACK     PCRE_ASSIGN_JIT_STACK8
-#define PCRE_COMPILE              PCRE_COMPILE8
-#define PCRE_CONFIG               pcre_config
-#define PCRE_COPY_NAMED_SUBSTRING PCRE_COPY_NAMED_SUBSTRING8
-#define PCRE_COPY_SUBSTRING       PCRE_COPY_SUBSTRING8
-#define PCRE_DFA_EXEC             PCRE_DFA_EXEC8
-#define PCRE_EXEC                 PCRE_EXEC8
-#define PCRE_FREE_STUDY           PCRE_FREE_STUDY8
-#define PCRE_FREE_SUBSTRING       PCRE_FREE_SUBSTRING8
-#define PCRE_FREE_SUBSTRING_LIST  PCRE_FREE_SUBSTRING_LIST8
-#define PCRE_GET_NAMED_SUBSTRING  PCRE_GET_NAMED_SUBSTRING8
-#define PCRE_GET_STRINGNUMBER     PCRE_GET_STRINGNUMBER8
-#define PCRE_GET_SUBSTRING        PCRE_GET_SUBSTRING8
-#define PCRE_GET_SUBSTRING_LIST   PCRE_GET_SUBSTRING_LIST8
-#define PCRE_JIT_STACK_ALLOC      PCRE_JIT_STACK_ALLOC8
-#define PCRE_JIT_STACK_FREE       PCRE_JIT_STACK_FREE8
-#define PCRE_MAKETABLES           pcre_maketables()
-#define PCRE_PATTERN_TO_HOST_BYTE_ORDER PCRE_PATTERN_TO_HOST_BYTE_ORDER8
-#define PCRE_PRINTINT             PCRE_PRINTINT8
-#define PCRE_STUDY                PCRE_STUDY8
-
-/* ----- Only 16-bit mode is supported ----- */
-
-#elif defined SUPPORT_PCRE16
-#define CHAR_SIZE                 2
-#define PCHARS                    PCHARS16
-#define PCHARSV                   PCHARSV16
-#define READ_CAPTURE_NAME         READ_CAPTURE_NAME16
-#define SET_PCRE_CALLOUT          SET_PCRE_CALLOUT16
-#define SET_PCRE_STACK_GUARD      SET_PCRE_STACK_GUARD16
-#define STRLEN                    STRLEN16
-#define PCRE_ASSIGN_JIT_STACK     PCRE_ASSIGN_JIT_STACK16
-#define PCRE_COMPILE              PCRE_COMPILE16
-#define PCRE_CONFIG               pcre16_config
-#define PCRE_COPY_NAMED_SUBSTRING PCRE_COPY_NAMED_SUBSTRING16
-#define PCRE_COPY_SUBSTRING       PCRE_COPY_SUBSTRING16
-#define PCRE_DFA_EXEC             PCRE_DFA_EXEC16
-#define PCRE_EXEC                 PCRE_EXEC16
-#define PCRE_FREE_STUDY           PCRE_FREE_STUDY16
-#define PCRE_FREE_SUBSTRING       PCRE_FREE_SUBSTRING16
-#define PCRE_FREE_SUBSTRING_LIST  PCRE_FREE_SUBSTRING_LIST16
-#define PCRE_GET_NAMED_SUBSTRING  PCRE_GET_NAMED_SUBSTRING16
-#define PCRE_GET_STRINGNUMBER     PCRE_GET_STRINGNUMBER16
-#define PCRE_GET_SUBSTRING        PCRE_GET_SUBSTRING16
-#define PCRE_GET_SUBSTRING_LIST   PCRE_GET_SUBSTRING_LIST16
-#define PCRE_JIT_STACK_ALLOC      PCRE_JIT_STACK_ALLOC16
-#define PCRE_JIT_STACK_FREE       PCRE_JIT_STACK_FREE16
-#define PCRE_MAKETABLES           pcre16_maketables()
-#define PCRE_PATTERN_TO_HOST_BYTE_ORDER PCRE_PATTERN_TO_HOST_BYTE_ORDER16
-#define PCRE_PRINTINT             PCRE_PRINTINT16
-#define PCRE_STUDY                PCRE_STUDY16
-
-/* ----- Only 32-bit mode is supported ----- */
-
-#elif defined SUPPORT_PCRE32
-#define CHAR_SIZE                 4
-#define PCHARS                    PCHARS32
-#define PCHARSV                   PCHARSV32
-#define READ_CAPTURE_NAME         READ_CAPTURE_NAME32
-#define SET_PCRE_CALLOUT          SET_PCRE_CALLOUT32
-#define SET_PCRE_STACK_GUARD      SET_PCRE_STACK_GUARD32
-#define STRLEN                    STRLEN32
-#define PCRE_ASSIGN_JIT_STACK     PCRE_ASSIGN_JIT_STACK32
-#define PCRE_COMPILE              PCRE_COMPILE32
-#define PCRE_CONFIG               pcre32_config
-#define PCRE_COPY_NAMED_SUBSTRING PCRE_COPY_NAMED_SUBSTRING32
-#define PCRE_COPY_SUBSTRING       PCRE_COPY_SUBSTRING32
-#define PCRE_DFA_EXEC             PCRE_DFA_EXEC32
-#define PCRE_EXEC                 PCRE_EXEC32
-#define PCRE_FREE_STUDY           PCRE_FREE_STUDY32
-#define PCRE_FREE_SUBSTRING       PCRE_FREE_SUBSTRING32
-#define PCRE_FREE_SUBSTRING_LIST  PCRE_FREE_SUBSTRING_LIST32
-#define PCRE_GET_NAMED_SUBSTRING  PCRE_GET_NAMED_SUBSTRING32
-#define PCRE_GET_STRINGNUMBER     PCRE_GET_STRINGNUMBER32
-#define PCRE_GET_SUBSTRING        PCRE_GET_SUBSTRING32
-#define PCRE_GET_SUBSTRING_LIST   PCRE_GET_SUBSTRING_LIST32
-#define PCRE_JIT_STACK_ALLOC      PCRE_JIT_STACK_ALLOC32
-#define PCRE_JIT_STACK_FREE       PCRE_JIT_STACK_FREE32
-#define PCRE_MAKETABLES           pcre32_maketables()
-#define PCRE_PATTERN_TO_HOST_BYTE_ORDER PCRE_PATTERN_TO_HOST_BYTE_ORDER32
-#define PCRE_PRINTINT             PCRE_PRINTINT32
-#define PCRE_STUDY                PCRE_STUDY32
-
-#endif
-
-/* ----- End of mode-specific function call macros ----- */
-
-
-/* Other parameters */
-
-#ifndef CLOCKS_PER_SEC
-#ifdef CLK_TCK
-#define CLOCKS_PER_SEC CLK_TCK
-#else
-#define CLOCKS_PER_SEC 100
-#endif
-#endif
-
-#if !defined NODFA
-#define DFA_WS_DIMENSION 1000
-#endif
-
-/* This is the default loop count for timing. */
-
-#define LOOPREPEAT 500000
-
-/* Static variables */
-
-static FILE *outfile;
-static int log_store = 0;
-static int callout_count;
-static int callout_extra;
-static int callout_fail_count;
-static int callout_fail_id;
-static int debug_lengths;
-static int first_callout;
-static int jit_was_used;
-static int locale_set = 0;
-static int show_malloc;
-static int stack_guard_return;
-static int use_utf;
-static const unsigned char *last_callout_mark = NULL;
-
-/* The buffers grow automatically if very long input lines are encountered. */
-
-static int buffer_size = 50000;
-static pcre_uint8 *buffer = NULL;
-static pcre_uint8 *pbuffer = NULL;
-
-/* Just as a safety check, make sure that COMPILE_PCRE[16|32] are *not* set. */
-
-#ifdef COMPILE_PCRE16
-#error COMPILE_PCRE16 must not be set when compiling pcretest.c
-#endif
-
-#ifdef COMPILE_PCRE32
-#error COMPILE_PCRE32 must not be set when compiling pcretest.c
-#endif
-
-/* We need buffers for building 16/32-bit strings, and the tables of operator
-lengths that are used for 16/32-bit compiling, in order to swap bytes in a
-pattern for saving/reloading testing. Luckily, the data for these tables is
-defined as a macro. However, we must ensure that LINK_SIZE and IMM2_SIZE (which
-are used in the tables) are adjusted appropriately for the 16/32-bit world.
-LINK_SIZE is also used later in this program. */
-
-#ifdef SUPPORT_PCRE16
-#undef IMM2_SIZE
-#define IMM2_SIZE 1
-
-#if LINK_SIZE == 2
-#undef LINK_SIZE
-#define LINK_SIZE 1
-#elif LINK_SIZE == 3 || LINK_SIZE == 4
-#undef LINK_SIZE
-#define LINK_SIZE 2
-#else
-#error LINK_SIZE must be either 2, 3, or 4
-#endif
-
-static int buffer16_size = 0;
-static pcre_uint16 *buffer16 = NULL;
-static const pcre_uint16 OP_lengths16[] = { OP_LENGTHS };
-#endif  /* SUPPORT_PCRE16 */
-
-#ifdef SUPPORT_PCRE32
-#undef IMM2_SIZE
-#define IMM2_SIZE 1
-#undef LINK_SIZE
-#define LINK_SIZE 1
-
-static int buffer32_size = 0;
-static pcre_uint32 *buffer32 = NULL;
-static const pcre_uint32 OP_lengths32[] = { OP_LENGTHS };
-#endif  /* SUPPORT_PCRE32 */
-
-/* If we have 8-bit support, default to it; if there is also 16-or 32-bit
-support, it can be changed by an option. If there is no 8-bit support, there
-must be 16-or 32-bit support, so default it to 1. */
-
-#if defined SUPPORT_PCRE8
-static int pcre_mode = PCRE8_MODE;
-#elif defined SUPPORT_PCRE16
-static int pcre_mode = PCRE16_MODE;
-#elif defined SUPPORT_PCRE32
-static int pcre_mode = PCRE32_MODE;
-#endif
-
-/* JIT study options for -s+n and /S+n where '1' <= n <= '7'. */
-
-static int jit_study_bits[] =
-  {
-  PCRE_STUDY_JIT_COMPILE,
-  PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE,
-  PCRE_STUDY_JIT_COMPILE + PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE,
-  PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE,
-  PCRE_STUDY_JIT_COMPILE + PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE,
-  PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE + PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE,
-  PCRE_STUDY_JIT_COMPILE + PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE +
-    PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE
-};
-
-#define PCRE_STUDY_ALLJIT (PCRE_STUDY_JIT_COMPILE | \
-  PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE | PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE)
-
-/* Textual explanations for runtime error codes */
-
-static const char *errtexts[] = {
-  NULL,  /* 0 is no error */
-  NULL,  /* NOMATCH is handled specially */
-  "NULL argument passed",
-  "bad option value",
-  "magic number missing",
-  "unknown opcode - pattern overwritten?",
-  "no more memory",
-  NULL,  /* never returned by pcre_exec() or pcre_dfa_exec() */
-  "match limit exceeded",
-  "callout error code",
-  NULL,  /* BADUTF8/16 is handled specially */
-  NULL,  /* BADUTF8/16 offset is handled specially */
-  NULL,  /* PARTIAL is handled specially */
-  "not used - internal error",
-  "internal error - pattern overwritten?",
-  "bad count value",
-  "item unsupported for DFA matching",
-  "backreference condition or recursion test not supported for DFA matching",
-  "match limit not supported for DFA matching",
-  "workspace size exceeded in DFA matching",
-  "too much recursion for DFA matching",
-  "recursion limit exceeded",
-  "not used - internal error",
-  "invalid combination of newline options",
-  "bad offset value",
-  NULL,  /* SHORTUTF8/16 is handled specially */
-  "nested recursion at the same subject position",
-  "JIT stack limit reached",
-  "pattern compiled in wrong mode: 8-bit/16-bit error",
-  "pattern compiled with other endianness",
-  "invalid data in workspace for DFA restart",
-  "bad JIT option",
-  "bad length"
-};
-
-
-/*************************************************
-*         Alternate character tables             *
-*************************************************/
-
-/* By default, the "tables" pointer when calling PCRE is set to NULL, thereby
-using the default tables of the library. However, the T option can be used to
-select alternate sets of tables, for different kinds of testing. Note also that
-the L (locale) option also adjusts the tables. */
-
-/* This is the set of tables distributed as default with PCRE. It recognizes
-only ASCII characters. */
-
-static const pcre_uint8 tables0[] = {
-
-/* This table is a lower casing table. */
-
-    0,  1,  2,  3,  4,  5,  6,  7,
-    8,  9, 10, 11, 12, 13, 14, 15,
-   16, 17, 18, 19, 20, 21, 22, 23,
-   24, 25, 26, 27, 28, 29, 30, 31,
-   32, 33, 34, 35, 36, 37, 38, 39,
-   40, 41, 42, 43, 44, 45, 46, 47,
-   48, 49, 50, 51, 52, 53, 54, 55,
-   56, 57, 58, 59, 60, 61, 62, 63,
-   64, 97, 98, 99,100,101,102,103,
-  104,105,106,107,108,109,110,111,
-  112,113,114,115,116,117,118,119,
-  120,121,122, 91, 92, 93, 94, 95,
-   96, 97, 98, 99,100,101,102,103,
-  104,105,106,107,108,109,110,111,
-  112,113,114,115,116,117,118,119,
-  120,121,122,123,124,125,126,127,
-  128,129,130,131,132,133,134,135,
-  136,137,138,139,140,141,142,143,
-  144,145,146,147,148,149,150,151,
-  152,153,154,155,156,157,158,159,
-  160,161,162,163,164,165,166,167,
-  168,169,170,171,172,173,174,175,
-  176,177,178,179,180,181,182,183,
-  184,185,186,187,188,189,190,191,
-  192,193,194,195,196,197,198,199,
-  200,201,202,203,204,205,206,207,
-  208,209,210,211,212,213,214,215,
-  216,217,218,219,220,221,222,223,
-  224,225,226,227,228,229,230,231,
-  232,233,234,235,236,237,238,239,
-  240,241,242,243,244,245,246,247,
-  248,249,250,251,252,253,254,255,
-
-/* This table is a case flipping table. */
-
-    0,  1,  2,  3,  4,  5,  6,  7,
-    8,  9, 10, 11, 12, 13, 14, 15,
-   16, 17, 18, 19, 20, 21, 22, 23,
-   24, 25, 26, 27, 28, 29, 30, 31,
-   32, 33, 34, 35, 36, 37, 38, 39,
-   40, 41, 42, 43, 44, 45, 46, 47,
-   48, 49, 50, 51, 52, 53, 54, 55,
-   56, 57, 58, 59, 60, 61, 62, 63,
-   64, 97, 98, 99,100,101,102,103,
-  104,105,106,107,108,109,110,111,
-  112,113,114,115,116,117,118,119,
-  120,121,122, 91, 92, 93, 94, 95,
-   96, 65, 66, 67, 68, 69, 70, 71,
-   72, 73, 74, 75, 76, 77, 78, 79,
-   80, 81, 82, 83, 84, 85, 86, 87,
-   88, 89, 90,123,124,125,126,127,
-  128,129,130,131,132,133,134,135,
-  136,137,138,139,140,141,142,143,
-  144,145,146,147,148,149,150,151,
-  152,153,154,155,156,157,158,159,
-  160,161,162,163,164,165,166,167,
-  168,169,170,171,172,173,174,175,
-  176,177,178,179,180,181,182,183,
-  184,185,186,187,188,189,190,191,
-  192,193,194,195,196,197,198,199,
-  200,201,202,203,204,205,206,207,
-  208,209,210,211,212,213,214,215,
-  216,217,218,219,220,221,222,223,
-  224,225,226,227,228,229,230,231,
-  232,233,234,235,236,237,238,239,
-  240,241,242,243,244,245,246,247,
-  248,249,250,251,252,253,254,255,
-
-/* This table contains bit maps for various character classes. Each map is 32
-bytes long and the bits run from the least significant end of each byte. The
-classes that have their own maps are: space, xdigit, digit, upper, lower, word,
-graph, print, punct, and cntrl. Other classes are built from combinations. */
-
-  0x00,0x3e,0x00,0x00,0x01,0x00,0x00,0x00,
-  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
-  0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x03,
-  0x7e,0x00,0x00,0x00,0x7e,0x00,0x00,0x00,
-  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
-  0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x03,
-  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
-  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-  0xfe,0xff,0xff,0x07,0x00,0x00,0x00,0x00,
-  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
-  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-  0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0x07,
-  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
-  0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x03,
-  0xfe,0xff,0xff,0x87,0xfe,0xff,0xff,0x07,
-  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
-  0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,
-  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,
-  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
-  0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,
-  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,
-  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
-  0x00,0x00,0x00,0x00,0xfe,0xff,0x00,0xfc,
-  0x01,0x00,0x00,0xf8,0x01,0x00,0x00,0x78,
-  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
-  0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,
-  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,
-  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
-/* This table identifies various classes of character by individual bits:
-  0x01   white space character
-  0x02   letter
-  0x04   decimal digit
-  0x08   hexadecimal digit
-  0x10   alphanumeric or '_'
-  0x80   regular expression metacharacter or binary zero
-*/
-
-  0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*   0-  7 */
-  0x00,0x01,0x01,0x01,0x01,0x01,0x00,0x00, /*   8- 15 */
-  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  16- 23 */
-  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  24- 31 */
-  0x01,0x00,0x00,0x00,0x80,0x00,0x00,0x00, /*    - '  */
-  0x80,0x80,0x80,0x80,0x00,0x00,0x80,0x00, /*  ( - /  */
-  0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c, /*  0 - 7  */
-  0x1c,0x1c,0x00,0x00,0x00,0x00,0x00,0x80, /*  8 - ?  */
-  0x00,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x12, /*  @ - G  */
-  0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /*  H - O  */
-  0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /*  P - W  */
-  0x12,0x12,0x12,0x80,0x80,0x00,0x80,0x10, /*  X - _  */
-  0x00,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x12, /*  ` - g  */
-  0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /*  h - o  */
-  0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /*  p - w  */
-  0x12,0x12,0x12,0x80,0x80,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 */
-
-/* This is a set of tables that came originally from a Windows user. It seems
-to be at least an approximation of ISO 8859. In particular, there are
-characters greater than 128 that are marked as spaces, letters, etc. */
-
-static const pcre_uint8 tables1[] = {
-0,1,2,3,4,5,6,7,
-8,9,10,11,12,13,14,15,
-16,17,18,19,20,21,22,23,
-24,25,26,27,28,29,30,31,
-32,33,34,35,36,37,38,39,
-40,41,42,43,44,45,46,47,
-48,49,50,51,52,53,54,55,
-56,57,58,59,60,61,62,63,
-64,97,98,99,100,101,102,103,
-104,105,106,107,108,109,110,111,
-112,113,114,115,116,117,118,119,
-120,121,122,91,92,93,94,95,
-96,97,98,99,100,101,102,103,
-104,105,106,107,108,109,110,111,
-112,113,114,115,116,117,118,119,
-120,121,122,123,124,125,126,127,
-128,129,130,131,132,133,134,135,
-136,137,138,139,140,141,142,143,
-144,145,146,147,148,149,150,151,
-152,153,154,155,156,157,158,159,
-160,161,162,163,164,165,166,167,
-168,169,170,171,172,173,174,175,
-176,177,178,179,180,181,182,183,
-184,185,186,187,188,189,190,191,
-224,225,226,227,228,229,230,231,
-232,233,234,235,236,237,238,239,
-240,241,242,243,244,245,246,215,
-248,249,250,251,252,253,254,223,
-224,225,226,227,228,229,230,231,
-232,233,234,235,236,237,238,239,
-240,241,242,243,244,245,246,247,
-248,249,250,251,252,253,254,255,
-0,1,2,3,4,5,6,7,
-8,9,10,11,12,13,14,15,
-16,17,18,19,20,21,22,23,
-24,25,26,27,28,29,30,31,
-32,33,34,35,36,37,38,39,
-40,41,42,43,44,45,46,47,
-48,49,50,51,52,53,54,55,
-56,57,58,59,60,61,62,63,
-64,97,98,99,100,101,102,103,
-104,105,106,107,108,109,110,111,
-112,113,114,115,116,117,118,119,
-120,121,122,91,92,93,94,95,
-96,65,66,67,68,69,70,71,
-72,73,74,75,76,77,78,79,
-80,81,82,83,84,85,86,87,
-88,89,90,123,124,125,126,127,
-128,129,130,131,132,133,134,135,
-136,137,138,139,140,141,142,143,
-144,145,146,147,148,149,150,151,
-152,153,154,155,156,157,158,159,
-160,161,162,163,164,165,166,167,
-168,169,170,171,172,173,174,175,
-176,177,178,179,180,181,182,183,
-184,185,186,187,188,189,190,191,
-224,225,226,227,228,229,230,231,
-232,233,234,235,236,237,238,239,
-240,241,242,243,244,245,246,215,
-248,249,250,251,252,253,254,223,
-192,193,194,195,196,197,198,199,
-200,201,202,203,204,205,206,207,
-208,209,210,211,212,213,214,247,
-216,217,218,219,220,221,222,255,
-0,62,0,0,1,0,0,0,
-0,0,0,0,0,0,0,0,
-32,0,0,0,1,0,0,0,
-0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,255,3,
-126,0,0,0,126,0,0,0,
-0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,255,3,
-0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,12,2,
-0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,
-254,255,255,7,0,0,0,0,
-0,0,0,0,0,0,0,0,
-255,255,127,127,0,0,0,0,
-0,0,0,0,0,0,0,0,
-0,0,0,0,254,255,255,7,
-0,0,0,0,0,4,32,4,
-0,0,0,128,255,255,127,255,
-0,0,0,0,0,0,255,3,
-254,255,255,135,254,255,255,7,
-0,0,0,0,0,4,44,6,
-255,255,127,255,255,255,127,255,
-0,0,0,0,254,255,255,255,
-255,255,255,255,255,255,255,127,
-0,0,0,0,254,255,255,255,
-255,255,255,255,255,255,255,255,
-0,2,0,0,255,255,255,255,
-255,255,255,255,255,255,255,127,
-0,0,0,0,255,255,255,255,
-255,255,255,255,255,255,255,255,
-0,0,0,0,254,255,0,252,
-1,0,0,248,1,0,0,120,
-0,0,0,0,254,255,255,255,
-0,0,128,0,0,0,128,0,
-255,255,255,255,0,0,0,0,
-0,0,0,0,0,0,0,128,
-255,255,255,255,0,0,0,0,
-0,0,0,0,0,0,0,0,
-128,0,0,0,0,0,0,0,
-0,1,1,0,1,1,0,0,
-0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,
-1,0,0,0,128,0,0,0,
-128,128,128,128,0,0,128,0,
-28,28,28,28,28,28,28,28,
-28,28,0,0,0,0,0,128,
-0,26,26,26,26,26,26,18,
-18,18,18,18,18,18,18,18,
-18,18,18,18,18,18,18,18,
-18,18,18,128,128,0,128,16,
-0,26,26,26,26,26,26,18,
-18,18,18,18,18,18,18,18,
-18,18,18,18,18,18,18,18,
-18,18,18,128,128,0,0,0,
-0,0,0,0,0,1,0,0,
-0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,
-1,0,0,0,0,0,0,0,
-0,0,18,0,0,0,0,0,
-0,0,20,20,0,18,0,0,
-0,20,18,0,0,0,0,0,
-18,18,18,18,18,18,18,18,
-18,18,18,18,18,18,18,18,
-18,18,18,18,18,18,18,0,
-18,18,18,18,18,18,18,18,
-18,18,18,18,18,18,18,18,
-18,18,18,18,18,18,18,18,
-18,18,18,18,18,18,18,0,
-18,18,18,18,18,18,18,18
-};
-
-
-
-
-#ifndef HAVE_STRERROR
-/*************************************************
-*     Provide strerror() for non-ANSI libraries  *
-*************************************************/
-
-/* Some old-fashioned systems still around (e.g. SunOS4) don't have strerror()
-in their libraries, but can provide the same facility by this simple
-alternative function. */
-
-extern int   sys_nerr;
-extern char *sys_errlist[];
-
-char *
-strerror(int n)
-{
-if (n < 0 || n >= sys_nerr) return "unknown error number";
-return sys_errlist[n];
-}
-#endif /* HAVE_STRERROR */
-
-
-
-/*************************************************
-*       Print newline configuration              *
-*************************************************/
-
-/*
-Arguments:
-  rc         the return code from PCRE_CONFIG_NEWLINE
-  isc        TRUE if called from "-C newline"
-Returns:     nothing
-*/
-
-static void
-print_newline_config(int rc, BOOL isc)
-{
-const char *s = NULL;
-if (!isc) printf("  Newline sequence is ");
-switch(rc)
-  {
-  case CHAR_CR: s = "CR"; break;
-  case CHAR_LF: s = "LF"; break;
-  case (CHAR_CR<<8 | CHAR_LF): s = "CRLF"; break;
-  case -1: s = "ANY"; break;
-  case -2: s = "ANYCRLF"; break;
-
-  default:
-  printf("a non-standard value: 0x%04x\n", rc);
-  return;
-  }
-
-printf("%s\n", s);
-}
-
-
-
-/*************************************************
-*         JIT memory callback                    *
-*************************************************/
-
-static pcre_jit_stack* jit_callback(void *arg)
-{
-jit_was_used = TRUE;
-return (pcre_jit_stack *)arg;
-}
-
-
-#if !defined NOUTF || defined SUPPORT_PCRE16 || defined SUPPORT_PCRE32
-/*************************************************
-*            Convert UTF-8 string to value       *
-*************************************************/
-
-/* This function takes one or more bytes that represents a UTF-8 character,
-and returns the value of the character.
-
-Argument:
-  utf8bytes   a pointer to the byte vector
-  vptr        a pointer to an int to receive the value
-
-Returns:      >  0 => the number of bytes consumed
-              -6 to 0 => malformed UTF-8 character at offset = (-return)
-*/
-
-static int
-utf82ord(pcre_uint8 *utf8bytes, pcre_uint32 *vptr)
-{
-pcre_uint32 c = *utf8bytes++;
-pcre_uint32 d = c;
-int i, j, s;
-
-for (i = -1; i < 6; i++)               /* i is number of additional bytes */
-  {
-  if ((d & 0x80) == 0) break;
-  d <<= 1;
-  }
-
-if (i == -1) { *vptr = c; return 1; }  /* ascii character */
-if (i == 0 || i == 6) return 0;        /* invalid UTF-8 */
-
-/* i now has a value in the range 1-5 */
-
-s = 6*i;
-d = (c & utf8_table3[i]) << s;
-
-for (j = 0; j < i; j++)
-  {
-  c = *utf8bytes++;
-  if ((c & 0xc0) != 0x80) return -(j+1);
-  s -= 6;
-  d |= (c & 0x3f) << s;
-  }
-
-/* Check that encoding was the correct unique one */
-
-for (j = 0; j < utf8_table1_size; j++)
-  if (d <= (pcre_uint32)utf8_table1[j]) break;
-if (j != i) return -(i+1);
-
-/* Valid value */
-
-*vptr = d;
-return i+1;
-}
-#endif /* NOUTF || SUPPORT_PCRE16 */
-
-
-
-#if defined SUPPORT_PCRE8 && !defined NOUTF
-/*************************************************
-*       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
-  utf8bytes  pointer to buffer for result - at least 6 bytes long
-
-Returns:     number of characters placed in the buffer
-*/
-
-static int
-ord2utf8(pcre_uint32 cvalue, pcre_uint8 *utf8bytes)
-{
-register int i, j;
-if (cvalue > 0x7fffffffu)
-  return -1;
-for (i = 0; i < utf8_table1_size; i++)
-  if (cvalue <= (pcre_uint32)utf8_table1[i]) break;
-utf8bytes += i;
-for (j = i; j > 0; j--)
- {
- *utf8bytes-- = 0x80 | (cvalue & 0x3f);
- cvalue >>= 6;
- }
-*utf8bytes = utf8_table2[i] | cvalue;
-return i + 1;
-}
-#endif
-
-
-#ifdef SUPPORT_PCRE16
-/*************************************************
-*         Convert a string to 16-bit             *
-*************************************************/
-
-/* In non-UTF mode, the space needed for a 16-bit string is exactly double the
-8-bit size. For a UTF-8 string, the size needed for UTF-16 is no more than
-double, because up to 0xffff uses no more than 3 bytes in UTF-8 but possibly 4
-in UTF-16. Higher values use 4 bytes in UTF-8 and up to 4 bytes in UTF-16. The
-result is always left in buffer16.
-
-Note that this function does not object to surrogate values. This is
-deliberate; it makes it possible to construct UTF-16 strings that are invalid,
-for the purpose of testing that they are correctly faulted.
-
-Patterns to be converted are either plain ASCII or UTF-8; data lines are always
-in UTF-8 so that values greater than 255 can be handled.
-
-Arguments:
-  data       TRUE if converting a data line; FALSE for a regex
-  p          points to a byte string
-  utf        true if UTF-8 (to be converted to UTF-16)
-  len        number of bytes in the string (excluding trailing zero)
-
-Returns:     number of 16-bit data items used (excluding trailing zero)
-             OR -1 if a UTF-8 string is malformed
-             OR -2 if a value > 0x10ffff is encountered
-             OR -3 if a value > 0xffff is encountered when not in UTF mode
-*/
-
-static int
-to16(int data, pcre_uint8 *p, int utf, int len)
-{
-pcre_uint16 *pp;
-
-if (buffer16_size < 2*len + 2)
-  {
-  if (buffer16 != NULL) free(buffer16);
-  buffer16_size = 2*len + 2;
-  buffer16 = (pcre_uint16 *)malloc(buffer16_size);
-  if (buffer16 == NULL)
-    {
-    fprintf(stderr, "pcretest: malloc(%d) failed for buffer16\n", buffer16_size);
-    exit(1);
-    }
-  }
-
-pp = buffer16;
-
-if (!utf && !data)
-  {
-  while (len-- > 0) *pp++ = *p++;
-  }
-
-else
-  {
-  pcre_uint32 c = 0;
-  while (len > 0)
-    {
-    int chlen = utf82ord(p, &c);
-    if (chlen <= 0) return -1;
-    if (c > 0x10ffff) return -2;
-    p += chlen;
-    len -= chlen;
-    if (c < 0x10000) *pp++ = c; else
-      {
-      if (!utf) return -3;
-      c -= 0x10000;
-      *pp++ = 0xD800 | (c >> 10);
-      *pp++ = 0xDC00 | (c & 0x3ff);
-      }
-    }
-  }
-
-*pp = 0;
-return pp - buffer16;
-}
-#endif
-
-#ifdef SUPPORT_PCRE32
-/*************************************************
-*         Convert a string to 32-bit             *
-*************************************************/
-
-/* In non-UTF mode, the space needed for a 32-bit string is exactly four times the
-8-bit size. For a UTF-8 string, the size needed for UTF-32 is no more than four
-times, because up to 0xffff uses no more than 3 bytes in UTF-8 but possibly 4
-in UTF-32. Higher values use 4 bytes in UTF-8 and up to 4 bytes in UTF-32. The
-result is always left in buffer32.
-
-Note that this function does not object to surrogate values. This is
-deliberate; it makes it possible to construct UTF-32 strings that are invalid,
-for the purpose of testing that they are correctly faulted.
-
-Patterns to be converted are either plain ASCII or UTF-8; data lines are always
-in UTF-8 so that values greater than 255 can be handled.
-
-Arguments:
-  data       TRUE if converting a data line; FALSE for a regex
-  p          points to a byte string
-  utf        true if UTF-8 (to be converted to UTF-32)
-  len        number of bytes in the string (excluding trailing zero)
-
-Returns:     number of 32-bit data items used (excluding trailing zero)
-             OR -1 if a UTF-8 string is malformed
-             OR -2 if a value > 0x10ffff is encountered
-             OR -3 if an ill-formed value is encountered (i.e. a surrogate)
-*/
-
-static int
-to32(int data, pcre_uint8 *p, int utf, int len)
-{
-pcre_uint32 *pp;
-
-if (buffer32_size < 4*len + 4)
-  {
-  if (buffer32 != NULL) free(buffer32);
-  buffer32_size = 4*len + 4;
-  buffer32 = (pcre_uint32 *)malloc(buffer32_size);
-  if (buffer32 == NULL)
-    {
-    fprintf(stderr, "pcretest: malloc(%d) failed for buffer32\n", buffer32_size);
-    exit(1);
-    }
-  }
-
-pp = buffer32;
-
-if (!utf && !data)
-  {
-  while (len-- > 0) *pp++ = *p++;
-  }
-
-else
-  {
-  pcre_uint32 c = 0;
-  while (len > 0)
-    {
-    int chlen = utf82ord(p, &c);
-    if (chlen <= 0) return -1;
-    if (utf)
-      {
-      if (c > 0x10ffff) return -2;
-      if (!data && (c & 0xfffff800u) == 0xd800u) return -3;
-      }
-
-    p += chlen;
-    len -= chlen;
-    *pp++ = c;
-    }
-  }
-
-*pp = 0;
-return pp - buffer32;
-}
-
-/* Check that a 32-bit character string is valid UTF-32.
-
-Arguments:
-  string       points to the string
-  length       length of string, or -1 if the string is zero-terminated
-
-Returns:       TRUE  if the string is a valid UTF-32 string
-               FALSE otherwise
-*/
-
-#ifdef NEVER   /* Not used */
-#ifdef SUPPORT_UTF
-static BOOL
-valid_utf32(pcre_uint32 *string, int length)
-{
-register pcre_uint32 *p;
-register pcre_uint32 c;
-
-for (p = string; length-- > 0; p++)
-  {
-  c = *p;
-  if (c > 0x10ffffu) return FALSE;                 /* Too big */
-  if ((c & 0xfffff800u) == 0xd800u) return FALSE;  /* Surrogate */
-  }
-
-return TRUE;
-}
-#endif /* SUPPORT_UTF */
-#endif /* NEVER */
-#endif /* SUPPORT_PCRE32 */
-
-
-/*************************************************
-*        Read or extend an input line            *
-*************************************************/
-
-/* Input lines are read into buffer, but both patterns and data lines can be
-continued over multiple input lines. In addition, if the buffer fills up, we
-want to automatically expand it so as to be able to handle extremely large
-lines that are needed for certain stress tests. When the input buffer is
-expanded, the other two buffers must also be expanded likewise, and the
-contents of pbuffer, which are a copy of the input for callouts, must be
-preserved (for when expansion happens for a data line). This is not the most
-optimal way of handling this, but hey, this is just a test program!
-
-Arguments:
-  f            the file to read
-  start        where in buffer to start (this *must* be within buffer)
-  prompt       for stdin or readline()
-
-Returns:       pointer to the start of new data
-               could be a copy of start, or could be moved
-               NULL if no data read and EOF reached
-*/
-
-static pcre_uint8 *
-extend_inputline(FILE *f, pcre_uint8 *start, const char *prompt)
-{
-pcre_uint8 *here = start;
-
-for (;;)
-  {
-  size_t rlen = (size_t)(buffer_size - (here - buffer));
-
-  if (rlen > 1000)
-    {
-    int dlen;
-
-    /* If libreadline or libedit support is required, use readline() to read a
-    line if the input is a terminal. Note that readline() removes the trailing
-    newline, so we must put it back again, to be compatible with fgets(). */
-
-#if defined(SUPPORT_LIBREADLINE) || defined(SUPPORT_LIBEDIT)
-    if (isatty(fileno(f)))
-      {
-      size_t len;
-      char *s = readline(prompt);
-      if (s == NULL) return (here == start)? NULL : start;
-      len = strlen(s);
-      if (len > 0) add_history(s);
-      if (len > rlen - 1) len = rlen - 1;
-      memcpy(here, s, len);
-      here[len] = '\n';
-      here[len+1] = 0;
-      free(s);
-      }
-    else
-#endif
-
-    /* Read the next line by normal means, prompting if the file is stdin. */
-
-      {
-      if (f == stdin) printf("%s", prompt);
-      if (fgets((char *)here, rlen,  f) == NULL)
-        return (here == start)? NULL : start;
-      }
-
-    dlen = (int)strlen((char *)here);
-    if (dlen > 0 && here[dlen - 1] == '\n') return start;
-    here += dlen;
-    }
-
-  else
-    {
-    int new_buffer_size = 2*buffer_size;
-    pcre_uint8 *new_buffer = (pcre_uint8 *)malloc(new_buffer_size);
-    pcre_uint8 *new_pbuffer = (pcre_uint8 *)malloc(new_buffer_size);
-
-    if (new_buffer == NULL || new_pbuffer == NULL)
-      {
-      fprintf(stderr, "pcretest: malloc(%d) failed\n", new_buffer_size);
-      exit(1);
-      }
-
-    memcpy(new_buffer, buffer, buffer_size);
-    memcpy(new_pbuffer, pbuffer, buffer_size);
-
-    buffer_size = new_buffer_size;
-
-    start = new_buffer + (start - buffer);
-    here = new_buffer + (here - buffer);
-
-    free(buffer);
-    free(pbuffer);
-
-    buffer = new_buffer;
-    pbuffer = new_pbuffer;
-    }
-  }
-
-/* Control never gets here */
-}
-
-
-
-/*************************************************
-*          Read number from string               *
-*************************************************/
-
-/* We don't use strtoul() because SunOS4 doesn't have it. Rather than mess
-around with conditional compilation, just do the job by hand. It is only used
-for unpicking arguments, so just keep it simple.
-
-Arguments:
-  str           string to be converted
-  endptr        where to put the end pointer
-
-Returns:        the unsigned long
-*/
-
-static int
-get_value(pcre_uint8 *str, pcre_uint8 **endptr)
-{
-int result = 0;
-while(*str != 0 && isspace(*str)) str++;
-while (isdigit(*str)) result = result * 10 + (int)(*str++ - '0');
-*endptr = str;
-return(result);
-}
-
-
-
-/*************************************************
-*             Print one character                *
-*************************************************/
-
-/* Print a single character either literally, or as a hex escape. */
-
-static int pchar(pcre_uint32 c, FILE *f)
-{
-int n = 0;
-if (PRINTOK(c))
-  {
-  if (f != NULL) fprintf(f, "%c", c);
-  return 1;
-  }
-
-if (c < 0x100)
-  {
-  if (use_utf)
-    {
-    if (f != NULL) fprintf(f, "\\x{%02x}", c);
-    return 6;
-    }
-  else
-    {
-    if (f != NULL) fprintf(f, "\\x%02x", c);
-    return 4;
-    }
-  }
-
-if (f != NULL) n = fprintf(f, "\\x{%02x}", c);
-return n >= 0 ? n : 0;
-}
-
-
-
-#ifdef SUPPORT_PCRE8
-/*************************************************
-*         Print 8-bit character string           *
-*************************************************/
-
-/* Must handle UTF-8 strings in utf8 mode. Yields number of characters printed.
-If handed a NULL file, just counts chars without printing. */
-
-static int pchars(pcre_uint8 *p, int length, FILE *f)
-{
-pcre_uint32 c = 0;
-int yield = 0;
-
-if (length < 0)
-  length = strlen((char *)p);
-
-while (length-- > 0)
-  {
-#if !defined NOUTF
-  if (use_utf)
-    {
-    int rc = utf82ord(p, &c);
-    if (rc > 0 && rc <= length + 1)   /* Mustn't run over the end */
-      {
-      length -= rc - 1;
-      p += rc;
-      yield += pchar(c, f);
-      continue;
-      }
-    }
-#endif
-  c = *p++;
-  yield += pchar(c, f);
-  }
-
-return yield;
-}
-#endif
-
-
-
-#ifdef SUPPORT_PCRE16
-/*************************************************
-*    Find length of 0-terminated 16-bit string   *
-*************************************************/
-
-static int strlen16(PCRE_SPTR16 p)
-{
-PCRE_SPTR16 pp = p;
-while (*pp != 0) pp++;
-return (int)(pp - p);
-}
-#endif  /* SUPPORT_PCRE16 */
-
-
-
-#ifdef SUPPORT_PCRE32
-/*************************************************
-*    Find length of 0-terminated 32-bit string   *
-*************************************************/
-
-static int strlen32(PCRE_SPTR32 p)
-{
-PCRE_SPTR32 pp = p;
-while (*pp != 0) pp++;
-return (int)(pp - p);
-}
-#endif  /* SUPPORT_PCRE32 */
-
-
-
-#ifdef SUPPORT_PCRE16
-/*************************************************
-*           Print 16-bit character string        *
-*************************************************/
-
-/* Must handle UTF-16 strings in utf mode. Yields number of characters printed.
-If handed a NULL file, just counts chars without printing. */
-
-static int pchars16(PCRE_SPTR16 p, int length, FILE *f)
-{
-int yield = 0;
-
-if (length < 0)
-  length = strlen16(p);
-
-while (length-- > 0)
-  {
-  pcre_uint32 c = *p++ & 0xffff;
-#if !defined NOUTF
-  if (use_utf && c >= 0xD800 && c < 0xDC00 && length > 0)
-    {
-    int d = *p & 0xffff;
-    if (d >= 0xDC00 && d <= 0xDFFF)
-      {
-      c = ((c & 0x3ff) << 10) + (d & 0x3ff) + 0x10000;
-      length--;
-      p++;
-      }
-    }
-#endif
-  yield += pchar(c, f);
-  }
-
-return yield;
-}
-#endif  /* SUPPORT_PCRE16 */
-
-
-
-#ifdef SUPPORT_PCRE32
-/*************************************************
-*           Print 32-bit character string        *
-*************************************************/
-
-/* Must handle UTF-32 strings in utf mode. Yields number of characters printed.
-If handed a NULL file, just counts chars without printing. */
-
-static int pchars32(PCRE_SPTR32 p, int length, BOOL utf, FILE *f)
-{
-int yield = 0;
-
-(void)(utf);  /* Avoid compiler warning */
-
-if (length < 0)
-  length = strlen32(p);
-
-while (length-- > 0)
-  {
-  pcre_uint32 c = *p++;
-  yield += pchar(c, f);
-  }
-
-return yield;
-}
-#endif  /* SUPPORT_PCRE32 */
-
-
-
-#ifdef SUPPORT_PCRE8
-/*************************************************
-*     Read a capture name (8-bit) and check it   *
-*************************************************/
-
-static pcre_uint8 *
-read_capture_name8(pcre_uint8 *p, pcre_uint8 **pp, pcre *re)
-{
-pcre_uint8 *npp = *pp;
-while (isalnum(*p)) *npp++ = *p++;
-*npp++ = 0;
-*npp = 0;
-if (pcre_get_stringnumber(re, (char *)(*pp)) < 0)
-  {
-  fprintf(outfile, "no parentheses with name \"");
-  PCHARSV(*pp, 0, -1, outfile);
-  fprintf(outfile, "\"\n");
-  }
-
-*pp = npp;
-return p;
-}
-#endif  /* SUPPORT_PCRE8 */
-
-
-
-#ifdef SUPPORT_PCRE16
-/*************************************************
-*     Read a capture name (16-bit) and check it  *
-*************************************************/
-
-/* Note that the text being read is 8-bit. */
-
-static pcre_uint8 *
-read_capture_name16(pcre_uint8 *p, pcre_uint16 **pp, pcre *re)
-{
-pcre_uint16 *npp = *pp;
-while (isalnum(*p)) *npp++ = *p++;
-*npp++ = 0;
-*npp = 0;
-if (pcre16_get_stringnumber((pcre16 *)re, (PCRE_SPTR16)(*pp)) < 0)
-  {
-  fprintf(outfile, "no parentheses with name \"");
-  PCHARSV(*pp, 0, -1, outfile);
-  fprintf(outfile, "\"\n");
-  }
-*pp = npp;
-return p;
-}
-#endif  /* SUPPORT_PCRE16 */
-
-
-
-#ifdef SUPPORT_PCRE32
-/*************************************************
-*     Read a capture name (32-bit) and check it  *
-*************************************************/
-
-/* Note that the text being read is 8-bit. */
-
-static pcre_uint8 *
-read_capture_name32(pcre_uint8 *p, pcre_uint32 **pp, pcre *re)
-{
-pcre_uint32 *npp = *pp;
-while (isalnum(*p)) *npp++ = *p++;
-*npp++ = 0;
-*npp = 0;
-if (pcre32_get_stringnumber((pcre32 *)re, (PCRE_SPTR32)(*pp)) < 0)
-  {
-  fprintf(outfile, "no parentheses with name \"");
-  PCHARSV(*pp, 0, -1, outfile);
-  fprintf(outfile, "\"\n");
-  }
-*pp = npp;
-return p;
-}
-#endif  /* SUPPORT_PCRE32 */
-
-
-
-/*************************************************
-*            Stack guard function                *
-*************************************************/
-
-/* Called from PCRE when set in pcre_stack_guard. We give an error (non-zero)
-return when a count overflows. */
-
-static int stack_guard(void)
-{
-return stack_guard_return;
-}
-
-/*************************************************
-*              Callout function                  *
-*************************************************/
-
-/* Called from PCRE as a result of the (?C) item. We print out where we are in
-the match. Yield zero unless more callouts than the fail count, or the callout
-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, subject_length;
-
-if (callout_extra)
-  {
-  fprintf(f, "Callout %d: last capture = %d\n",
-    cb->callout_number, cb->capture_last);
-
-  if (cb->offset_vector != NULL)
-    {
-    for (i = 0; i < cb->capture_top * 2; i += 2)
-      {
-      if (cb->offset_vector[i] < 0)
-        fprintf(f, "%2d: <unset>\n", i/2);
-      else
-        {
-        fprintf(f, "%2d: ", i/2);
-        PCHARSV(cb->subject, cb->offset_vector[i],
-          cb->offset_vector[i+1] - cb->offset_vector[i], f);
-        fprintf(f, "\n");
-        }
-      }
-    }
-  }
-
-/* Re-print the subject in canonical form, the first time or if giving full
-datails. On subsequent calls in the same match, we use pchars just to find the
-printed lengths of the substrings. */
-
-if (f != NULL) fprintf(f, "--->");
-
-PCHARS(pre_start, cb->subject, 0, cb->start_match, f);
-PCHARS(post_start, cb->subject, cb->start_match,
-  cb->current_position - cb->start_match, f);
-
-PCHARS(subject_length, cb->subject, 0, cb->subject_length, NULL);
-
-PCHARSV(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. For automatic callouts, show the pattern offset. */
-
-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, "^");
-
-if (post_start > 0)
-  {
-  for (i = 0; i < post_start - 1; i++) fprintf(outfile, " ");
-  fprintf(outfile, "^");
-  }
-
-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 (cb->mark != last_callout_mark)
-  {
-  if (cb->mark == NULL)
-    fprintf(outfile, "Latest Mark: <unset>\n");
-  else
-    {
-    fprintf(outfile, "Latest Mark: ");
-    PCHARSV(cb->mark, 0, -1, outfile);
-    putc('\n', outfile);
-    }
-  last_callout_mark = cb->mark;
-  }
-
-if (cb->callout_data != NULL)
-  {
-  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 :
-       (++callout_count >= callout_fail_count)? 1 : 0;
-}
-
-
-/*************************************************
-*            Local malloc functions              *
-*************************************************/
-
-/* Alternative malloc function, to test functionality and save the size of a
-compiled re, which is the first store request that pcre_compile() makes. The
-show_malloc variable is set only during matching. */
-
-static void *new_malloc(size_t size)
-{
-void *block = 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()                  *
-*************************************************/
-
-/* Get one piece of information from the pcre_fullinfo() function. When only
-one of 8-, 16- or 32-bit is supported, pcre_mode should always have the correct
-value, but the code is defensive.
-
-Arguments:
-  re        compiled regex
-  study     study data
-  option    PCRE_INFO_xxx option
-  ptr       where to put the data
-
-Returns:    0 when OK, < 0 on error
-*/
-
-static int
-new_info(pcre *re, pcre_extra *study, int option, void *ptr)
-{
-int rc;
-
-if (pcre_mode == PCRE32_MODE)
-#ifdef SUPPORT_PCRE32
-  rc = pcre32_fullinfo((pcre32 *)re, (pcre32_extra *)study, option, ptr);
-#else
-  rc = PCRE_ERROR_BADMODE;
-#endif
-else if (pcre_mode == PCRE16_MODE)
-#ifdef SUPPORT_PCRE16
-  rc = pcre16_fullinfo((pcre16 *)re, (pcre16_extra *)study, option, ptr);
-#else
-  rc = PCRE_ERROR_BADMODE;
-#endif
-else
-#ifdef SUPPORT_PCRE8
-  rc = pcre_fullinfo(re, study, option, ptr);
-#else
-  rc = PCRE_ERROR_BADMODE;
-#endif
-
-if (rc < 0 && rc != PCRE_ERROR_UNSET)
-  {
-  fprintf(outfile, "Error %d from pcre%s_fullinfo(%d)\n", rc,
-    pcre_mode == PCRE32_MODE ? "32" : pcre_mode == PCRE16_MODE ? "16" : "", option);
-  if (rc == PCRE_ERROR_BADMODE)
-    fprintf(outfile, "Running in %d-bit mode but pattern was compiled in "
-      "%d-bit mode\n", 8 * CHAR_SIZE,
-      8 * (REAL_PCRE_FLAGS(re) & PCRE_MODE_MASK));
-  }
-
-return rc;
-}
-
-
-
-/*************************************************
-*             Swap byte functions                *
-*************************************************/
-
-/* The following functions swap the bytes of a pcre_uint16 and pcre_uint32
-value, respectively.
-
-Arguments:
-  value        any number
-
-Returns:       the byte swapped value
-*/
-
-static pcre_uint32
-swap_uint32(pcre_uint32 value)
-{
-return ((value & 0x000000ff) << 24) |
-       ((value & 0x0000ff00) <<  8) |
-       ((value & 0x00ff0000) >>  8) |
-       (value >> 24);
-}
-
-static pcre_uint16
-swap_uint16(pcre_uint16 value)
-{
-return (value >> 8) | (value << 8);
-}
-
-
-
-/*************************************************
-*        Flip bytes in a compiled pattern        *
-*************************************************/
-
-/* This function is called if the 'F' option was present on a pattern that is
-to be written to a file. We flip the bytes of all the integer fields in the
-regex data block and the study block. In 16-bit mode this also flips relevant
-bytes in the pattern itself. This is to make it possible to test PCRE's
-ability to reload byte-flipped patterns, e.g. those compiled on a different
-architecture. */
-
-#if defined SUPPORT_PCRE8 || defined SUPPORT_PCRE16
-static void
-regexflip8_or_16(pcre *ere, pcre_extra *extra)
-{
-real_pcre8_or_16 *re = (real_pcre8_or_16 *)ere;
-#ifdef SUPPORT_PCRE16
-int op;
-pcre_uint16 *ptr = (pcre_uint16 *)re + re->name_table_offset;
-int length = re->name_count * re->name_entry_size;
-#ifdef SUPPORT_UTF
-BOOL utf = (re->options & PCRE_UTF16) != 0;
-BOOL utf16_char = FALSE;
-#endif /* SUPPORT_UTF */
-#endif /* SUPPORT_PCRE16 */
-
-/* Always flip the bytes in the main data block and study blocks. */
-
-re->magic_number = REVERSED_MAGIC_NUMBER;
-re->size = swap_uint32(re->size);
-re->options = swap_uint32(re->options);
-re->flags = swap_uint32(re->flags);
-re->limit_match = swap_uint32(re->limit_match);
-re->limit_recursion = swap_uint32(re->limit_recursion);
-re->first_char = swap_uint16(re->first_char);
-re->req_char = swap_uint16(re->req_char);
-re->max_lookbehind = swap_uint16(re->max_lookbehind);
-re->top_bracket = swap_uint16(re->top_bracket);
-re->top_backref = swap_uint16(re->top_backref);
-re->name_table_offset = swap_uint16(re->name_table_offset);
-re->name_entry_size = swap_uint16(re->name_entry_size);
-re->name_count = swap_uint16(re->name_count);
-re->ref_count = swap_uint16(re->ref_count);
-
-if (extra != NULL && (extra->flags & PCRE_EXTRA_STUDY_DATA) != 0)
-  {
-  pcre_study_data *rsd = (pcre_study_data *)(extra->study_data);
-  rsd->size = swap_uint32(rsd->size);
-  rsd->flags = swap_uint32(rsd->flags);
-  rsd->minlength = swap_uint32(rsd->minlength);
-  }
-
-/* In 8-bit mode, that is all we need to do. In 16-bit mode we must swap bytes
-in the name table, if present, and then in the pattern itself. */
-
-#ifdef SUPPORT_PCRE16
-if (pcre_mode != PCRE16_MODE) return;
-
-while(TRUE)
-  {
-  /* Swap previous characters. */
-  while (length-- > 0)
-    {
-    *ptr = swap_uint16(*ptr);
-    ptr++;
-    }
-#ifdef SUPPORT_UTF
-  if (utf16_char)
-    {
-    if ((ptr[-1] & 0xfc00) == 0xd800)
-      {
-      /* We know that there is only one extra character in UTF-16. */
-      *ptr = swap_uint16(*ptr);
-      ptr++;
-      }
-    }
-  utf16_char = FALSE;
-#endif /* SUPPORT_UTF */
-
-  /* Get next opcode. */
-
-  length = 0;
-  op = *ptr;
-  *ptr++ = swap_uint16(op);
-
-  switch (op)
-    {
-    case OP_END:
-    return;
-
-#ifdef SUPPORT_UTF
-    case OP_CHAR:
-    case OP_CHARI:
-    case OP_NOT:
-    case OP_NOTI:
-    case OP_STAR:
-    case OP_MINSTAR:
-    case OP_PLUS:
-    case OP_MINPLUS:
-    case OP_QUERY:
-    case OP_MINQUERY:
-    case OP_UPTO:
-    case OP_MINUPTO:
-    case OP_EXACT:
-    case OP_POSSTAR:
-    case OP_POSPLUS:
-    case OP_POSQUERY:
-    case OP_POSUPTO:
-    case OP_STARI:
-    case OP_MINSTARI:
-    case OP_PLUSI:
-    case OP_MINPLUSI:
-    case OP_QUERYI:
-    case OP_MINQUERYI:
-    case OP_UPTOI:
-    case OP_MINUPTOI:
-    case OP_EXACTI:
-    case OP_POSSTARI:
-    case OP_POSPLUSI:
-    case OP_POSQUERYI:
-    case OP_POSUPTOI:
-    case OP_NOTSTAR:
-    case OP_NOTMINSTAR:
-    case OP_NOTPLUS:
-    case OP_NOTMINPLUS:
-    case OP_NOTQUERY:
-    case OP_NOTMINQUERY:
-    case OP_NOTUPTO:
-    case OP_NOTMINUPTO:
-    case OP_NOTEXACT:
-    case OP_NOTPOSSTAR:
-    case OP_NOTPOSPLUS:
-    case OP_NOTPOSQUERY:
-    case OP_NOTPOSUPTO:
-    case OP_NOTSTARI:
-    case OP_NOTMINSTARI:
-    case OP_NOTPLUSI:
-    case OP_NOTMINPLUSI:
-    case OP_NOTQUERYI:
-    case OP_NOTMINQUERYI:
-    case OP_NOTUPTOI:
-    case OP_NOTMINUPTOI:
-    case OP_NOTEXACTI:
-    case OP_NOTPOSSTARI:
-    case OP_NOTPOSPLUSI:
-    case OP_NOTPOSQUERYI:
-    case OP_NOTPOSUPTOI:
-    if (utf) utf16_char = TRUE;
-#endif
-    /* Fall through. */
-
-    default:
-    length = OP_lengths16[op] - 1;
-    break;
-
-    case OP_CLASS:
-    case OP_NCLASS:
-    /* Skip the character bit map. */
-    ptr += 32/sizeof(pcre_uint16);
-    length = 0;
-    break;
-
-    case OP_XCLASS:
-    /* LINK_SIZE can be 1 or 2 in 16 bit mode. */
-    if (LINK_SIZE > 1)
-      length = (int)((((unsigned int)(ptr[0]) << 16) | (unsigned int)(ptr[1]))
-        - (1 + LINK_SIZE + 1));
-    else
-      length = (int)((unsigned int)(ptr[0]) - (1 + LINK_SIZE + 1));
-
-    /* Reverse the size of the XCLASS instance. */
-    *ptr = swap_uint16(*ptr);
-    ptr++;
-    if (LINK_SIZE > 1)
-      {
-      *ptr = swap_uint16(*ptr);
-      ptr++;
-      }
-
-    op = *ptr;
-    *ptr = swap_uint16(op);
-    ptr++;
-    if ((op & XCL_MAP) != 0)
-      {
-      /* Skip the character bit map. */
-      ptr += 32/sizeof(pcre_uint16);
-      length -= 32/sizeof(pcre_uint16);
-      }
-    break;
-    }
-  }
-/* Control should never reach here in 16 bit mode. */
-#endif /* SUPPORT_PCRE16 */
-}
-#endif /* SUPPORT_PCRE[8|16] */
-
-
-
-#if defined SUPPORT_PCRE32
-static void
-regexflip_32(pcre *ere, pcre_extra *extra)
-{
-real_pcre32 *re = (real_pcre32 *)ere;
-int op;
-pcre_uint32 *ptr = (pcre_uint32 *)re + re->name_table_offset;
-int length = re->name_count * re->name_entry_size;
-
-/* Always flip the bytes in the main data block and study blocks. */
-
-re->magic_number = REVERSED_MAGIC_NUMBER;
-re->size = swap_uint32(re->size);
-re->options = swap_uint32(re->options);
-re->flags = swap_uint32(re->flags);
-re->limit_match = swap_uint32(re->limit_match);
-re->limit_recursion = swap_uint32(re->limit_recursion);
-re->first_char = swap_uint32(re->first_char);
-re->req_char = swap_uint32(re->req_char);
-re->max_lookbehind = swap_uint16(re->max_lookbehind);
-re->top_bracket = swap_uint16(re->top_bracket);
-re->top_backref = swap_uint16(re->top_backref);
-re->name_table_offset = swap_uint16(re->name_table_offset);
-re->name_entry_size = swap_uint16(re->name_entry_size);
-re->name_count = swap_uint16(re->name_count);
-re->ref_count = swap_uint16(re->ref_count);
-
-if (extra != NULL && (extra->flags & PCRE_EXTRA_STUDY_DATA) != 0)
-  {
-  pcre_study_data *rsd = (pcre_study_data *)(extra->study_data);
-  rsd->size = swap_uint32(rsd->size);
-  rsd->flags = swap_uint32(rsd->flags);
-  rsd->minlength = swap_uint32(rsd->minlength);
-  }
-
-/* In 32-bit mode we must swap bytes in the name table, if present, and then in
-the pattern itself. */
-
-while(TRUE)
-  {
-  /* Swap previous characters. */
-  while (length-- > 0)
-    {
-    *ptr = swap_uint32(*ptr);
-    ptr++;
-    }
-
-  /* Get next opcode. */
-
-  length = 0;
-  op = *ptr;
-  *ptr++ = swap_uint32(op);
-
-  switch (op)
-    {
-    case OP_END:
-    return;
-
-    default:
-    length = OP_lengths32[op] - 1;
-    break;
-
-    case OP_CLASS:
-    case OP_NCLASS:
-    /* Skip the character bit map. */
-    ptr += 32/sizeof(pcre_uint32);
-    length = 0;
-    break;
-
-    case OP_XCLASS:
-    /* LINK_SIZE can only be 1 in 32-bit mode. */
-    length = (int)((unsigned int)(ptr[0]) - (1 + LINK_SIZE + 1));
-
-    /* Reverse the size of the XCLASS instance. */
-    *ptr = swap_uint32(*ptr);
-    ptr++;
-
-    op = *ptr;
-    *ptr = swap_uint32(op);
-    ptr++;
-    if ((op & XCL_MAP) != 0)
-      {
-      /* Skip the character bit map. */
-      ptr += 32/sizeof(pcre_uint32);
-      length -= 32/sizeof(pcre_uint32);
-      }
-    break;
-    }
-  }
-/* Control should never reach here in 32 bit mode. */
-}
-
-#endif /* SUPPORT_PCRE32 */
-
-
-
-static void
-regexflip(pcre *ere, pcre_extra *extra)
-{
-#if defined SUPPORT_PCRE32
-  if (REAL_PCRE_FLAGS(ere) & PCRE_MODE32)
-    regexflip_32(ere, extra);
-#endif
-#if defined SUPPORT_PCRE8 || defined SUPPORT_PCRE16
-  if (REAL_PCRE_FLAGS(ere) & (PCRE_MODE8 | PCRE_MODE16))
-    regexflip8_or_16(ere, extra);
-#endif
-}
-
-
-
-/*************************************************
-*        Check match or recursion limit          *
-*************************************************/
-
-static int
-check_match_limit(pcre *re, pcre_extra *extra, pcre_uint8 *bptr, int len,
-  int start_offset, int options, int *use_offsets, int use_size_offsets,
-  int flag, unsigned long int *limit, int errnumber, const char *msg)
-{
-int count;
-int min = 0;
-int mid = 64;
-int max = -1;
-
-extra->flags |= flag;
-
-for (;;)
-  {
-  *limit = mid;
-
-  PCRE_EXEC(count, re, extra, bptr, len, start_offset, options,
-    use_offsets, use_size_offsets);
-
-  if (count == errnumber)
-    {
-    /* fprintf(outfile, "Testing %s limit = %d\n", msg, mid); */
-    min = mid;
-    mid = (mid == max - 1)? max : (max > 0)? (min + max)/2 : mid*2;
-    }
-
-  else if (count >= 0 || count == PCRE_ERROR_NOMATCH ||
-                         count == PCRE_ERROR_PARTIAL)
-    {
-    if (mid == min + 1)
-      {
-      fprintf(outfile, "Minimum %s limit = %d\n", msg, mid);
-      break;
-      }
-    /* fprintf(outfile, "Testing %s limit = %d\n", msg, mid); */
-    max = mid;
-    mid = (min + mid)/2;
-    }
-  else break;    /* Some other error */
-  }
-
-extra->flags &= ~flag;
-return count;
-}
-
-
-
-/*************************************************
-*         Case-independent strncmp() function    *
-*************************************************/
-
-/*
-Arguments:
-  s         first string
-  t         second string
-  n         number of characters to compare
-
-Returns:    < 0, = 0, or > 0, according to the comparison
-*/
-
-static int
-strncmpic(pcre_uint8 *s, pcre_uint8 *t, int n)
-{
-while (n--)
-  {
-  int c = tolower(*s++) - tolower(*t++);
-  if (c) return c;
-  }
-return 0;
-}
-
-
-
-/*************************************************
-*         Check multicharacter option            *
-*************************************************/
-
-/* This is used both at compile and run-time to check for <xxx> escapes. Print
-a message and return 0 if there is no match.
-
-Arguments:
-  p           points after the leading '<'
-  f           file for error message
-  nl          TRUE to check only for newline settings
-  stype       "modifier" or "escape sequence"
-
-Returns:      appropriate PCRE_NEWLINE_xxx flags, or 0
-*/
-
-static int
-check_mc_option(pcre_uint8 *p, FILE *f, BOOL nl, const char *stype)
-{
-if (strncmpic(p, (pcre_uint8 *)"cr>", 3) == 0) return PCRE_NEWLINE_CR;
-if (strncmpic(p, (pcre_uint8 *)"lf>", 3) == 0) return PCRE_NEWLINE_LF;
-if (strncmpic(p, (pcre_uint8 *)"crlf>", 5) == 0) return PCRE_NEWLINE_CRLF;
-if (strncmpic(p, (pcre_uint8 *)"anycrlf>", 8) == 0) return PCRE_NEWLINE_ANYCRLF;
-if (strncmpic(p, (pcre_uint8 *)"any>", 4) == 0) return PCRE_NEWLINE_ANY;
-if (strncmpic(p, (pcre_uint8 *)"bsr_anycrlf>", 12) == 0) return PCRE_BSR_ANYCRLF;
-if (strncmpic(p, (pcre_uint8 *)"bsr_unicode>", 12) == 0) return PCRE_BSR_UNICODE;
-
-if (!nl)
-  {
-  if (strncmpic(p, (pcre_uint8 *)"JS>", 3) == 0) return PCRE_JAVASCRIPT_COMPAT;
-  }
-
-fprintf(f, "Unknown %s at: <%s\n", stype, p);
-return 0;
-}
-
-
-
-/*************************************************
-*             Usage function                     *
-*************************************************/
-
-static void
-usage(void)
-{
-printf("Usage:     pcretest [options] [<input file> [<output file>]]\n\n");
-printf("Input and output default to stdin and stdout.\n");
-#if defined(SUPPORT_LIBREADLINE) || defined(SUPPORT_LIBEDIT)
-printf("If input is a terminal, readline() is used to read from it.\n");
-#else
-printf("This version of pcretest is not linked with readline().\n");
-#endif
-printf("\nOptions:\n");
-#ifdef SUPPORT_PCRE16
-printf("  -16      use the 16-bit library\n");
-#endif
-#ifdef SUPPORT_PCRE32
-printf("  -32      use the 32-bit library\n");
-#endif
-printf("  -b       show compiled code\n");
-printf("  -C       show PCRE compile-time options and exit\n");
-printf("  -C arg   show a specific compile-time option and exit\n");
-printf("           with its value if numeric (else 0). The arg can be:\n");
-printf("     linksize     internal link size [2, 3, 4]\n");
-printf("     pcre8        8 bit library support enabled [0, 1]\n");
-printf("     pcre16       16 bit library support enabled [0, 1]\n");
-printf("     pcre32       32 bit library support enabled [0, 1]\n");
-printf("     utf          Unicode Transformation Format supported [0, 1]\n");
-printf("     ucp          Unicode Properties supported [0, 1]\n");
-printf("     jit          Just-in-time compiler supported [0, 1]\n");
-printf("     newline      Newline type [CR, LF, CRLF, ANYCRLF, ANY]\n");
-printf("     bsr          \\R type [ANYCRLF, ANY]\n");
-printf("  -d       debug: show compiled code and information (-b and -i)\n");
-#if !defined NODFA
-printf("  -dfa     force DFA matching for all subjects\n");
-#endif
-printf("  -help    show usage information\n");
-printf("  -i       show information about compiled patterns\n"
-       "  -M       find MATCH_LIMIT minimum for each subject\n"
-       "  -m       output memory used information\n"
-       "  -O       set PCRE_NO_AUTO_POSSESS on each pattern\n"
-       "  -o <n>   set size of offsets vector to <n>\n");
-#if !defined NOPOSIX
-printf("  -p       use POSIX interface\n");
-#endif
-printf("  -q       quiet: do not output PCRE version number at start\n");
-printf("  -S <n>   set stack size to <n> megabytes\n");
-printf("  -s       force each pattern to be studied at basic level\n"
-       "  -s+      force each pattern to be studied, using JIT if available\n"
-       "  -s++     ditto, verifying when JIT was actually used\n"
-       "  -s+n     force each pattern to be studied, using JIT if available,\n"
-       "             where 1 <= n <= 7 selects JIT options\n"
-       "  -s++n    ditto, verifying when JIT was actually used\n"
-       "  -t       time compilation and execution\n");
-printf("  -t <n>   time compilation and execution, repeating <n> times\n");
-printf("  -tm      time execution (matching) only\n");
-printf("  -tm <n>  time execution (matching) only, repeating <n> times\n");
-printf("  -T       same as -t, but show total times at the end\n");
-printf("  -TM      same as -tm, but show total time at the end\n");
-}
-
-
-
-/*************************************************
-*                Main Program                    *
-*************************************************/
-
-/* Read lines from named file or stdin and write to named file or stdout; lines
-consist of a regular expression, in delimiters and optionally followed by
-options, followed by a set of test data, terminated by an empty line. */
-
-int main(int argc, char **argv)
-{
-FILE *infile = stdin;
-const char *version;
-int options = 0;
-int study_options = 0;
-int default_find_match_limit = FALSE;
-pcre_uint32 default_options = 0;
-int op = 1;
-int timeit = 0;
-int timeitm = 0;
-int showtotaltimes = 0;
-int showinfo = 0;
-int showstore = 0;
-int force_study = -1;
-int force_study_options = 0;
-int quiet = 0;
-int size_offsets = 45;
-int size_offsets_max;
-int *offsets = NULL;
-int debug = 0;
-int done = 0;
-int all_use_dfa = 0;
-int verify_jit = 0;
-int yield = 0;
-int stack_size;
-pcre_uint8 *dbuffer = NULL;
-pcre_uint8 lockout[24] = { 0 };
-size_t dbuffer_size = 1u << 14;
-clock_t total_compile_time = 0;
-clock_t total_study_time = 0;
-clock_t total_match_time = 0;
-
-#if !defined NOPOSIX
-int posix = 0;
-#endif
-#if !defined NODFA
-int *dfa_workspace = NULL;
-#endif
-
-pcre_jit_stack *jit_stack = NULL;
-
-/* These vectors store, end-to-end, a list of zero-terminated captured
-substring names, each list itself being terminated by an empty name. Assume
-that 1024 is plenty long enough for the few names we'll be testing. It is
-easiest to keep separate 8-, 16- and 32-bit versions, using the 32-bit version
-for the actual memory, to ensure alignment. */
-
-pcre_uint32 copynames[1024];
-pcre_uint32 getnames[1024];
-
-#ifdef SUPPORT_PCRE32
-pcre_uint32 *cn32ptr;
-pcre_uint32 *gn32ptr;
-#endif
-
-#ifdef SUPPORT_PCRE16
-pcre_uint16 *copynames16 = (pcre_uint16 *)copynames;
-pcre_uint16 *getnames16 = (pcre_uint16 *)getnames;
-pcre_uint16 *cn16ptr;
-pcre_uint16 *gn16ptr;
-#endif
-
-#ifdef SUPPORT_PCRE8
-pcre_uint8 *copynames8 = (pcre_uint8 *)copynames;
-pcre_uint8 *getnames8 = (pcre_uint8 *)getnames;
-pcre_uint8 *cn8ptr;
-pcre_uint8 *gn8ptr;
-#endif
-
-/* Get buffers from malloc() so that valgrind will check their misuse when
-debugging. They grow automatically when very long lines are read. The 16-
-and 32-bit buffers (buffer16, buffer32) are obtained only if needed. */
-
-buffer = (pcre_uint8 *)malloc(buffer_size);
-pbuffer = (pcre_uint8 *)malloc(buffer_size);
-
-/* The outfile variable is static so that new_malloc can use it. */
-
-outfile = stdout;
-
-/* The following  _setmode() stuff is some Windows magic that tells its runtime
-library to translate CRLF into a single LF character. At least, that's what
-I've been told: never having used Windows I take this all on trust. Originally
-it set 0x8000, but then I was advised that _O_BINARY was better. */
-
-#if defined(_WIN32) || defined(WIN32)
-_setmode( _fileno( stdout ), _O_BINARY );
-#endif
-
-/* Get the version number: both pcre_version() and pcre16_version() give the
-same answer. We just need to ensure that we call one that is available. */
-
-#if defined SUPPORT_PCRE8
-version = pcre_version();
-#elif defined SUPPORT_PCRE16
-version = pcre16_version();
-#elif defined SUPPORT_PCRE32
-version = pcre32_version();
-#endif
-
-/* Scan options */
-
-while (argc > 1 && argv[op][0] == '-')
-  {
-  pcre_uint8 *endptr;
-  char *arg = argv[op];
-
-  if (strcmp(arg, "-m") == 0) showstore = 1;
-  else if (strcmp(arg, "-s") == 0) force_study = 0;
-
-  else if (strncmp(arg, "-s+", 3) == 0)
-    {
-    arg += 3;
-    if (*arg == '+') { arg++; verify_jit = TRUE; }
-    force_study = 1;
-    if (*arg == 0)
-      force_study_options = jit_study_bits[6];
-    else if (*arg >= '1' && *arg <= '7')
-      force_study_options = jit_study_bits[*arg - '1'];
-    else goto BAD_ARG;
-    }
-  else if (strcmp(arg, "-8") == 0)
-    {
-#ifdef SUPPORT_PCRE8
-    pcre_mode = PCRE8_MODE;
-#else
-    printf("** This version of PCRE was built without 8-bit support\n");
-    exit(1);
-#endif
-    }
-  else if (strcmp(arg, "-16") == 0)
-    {
-#ifdef SUPPORT_PCRE16
-    pcre_mode = PCRE16_MODE;
-#else
-    printf("** This version of PCRE was built without 16-bit support\n");
-    exit(1);
-#endif
-    }
-  else if (strcmp(arg, "-32") == 0)
-    {
-#ifdef SUPPORT_PCRE32
-    pcre_mode = PCRE32_MODE;
-#else
-    printf("** This version of PCRE was built without 32-bit support\n");
-    exit(1);
-#endif
-    }
-  else if (strcmp(arg, "-q") == 0) quiet = 1;
-  else if (strcmp(arg, "-b") == 0) debug = 1;
-  else if (strcmp(arg, "-i") == 0) showinfo = 1;
-  else if (strcmp(arg, "-d") == 0) showinfo = debug = 1;
-  else if (strcmp(arg, "-M") == 0) default_find_match_limit = TRUE;
-  else if (strcmp(arg, "-O") == 0) default_options |= PCRE_NO_AUTO_POSSESS;
-#if !defined NODFA
-  else if (strcmp(arg, "-dfa") == 0) all_use_dfa = 1;
-#endif
-  else if (strcmp(arg, "-o") == 0 && argc > 2 &&
-      ((size_offsets = get_value((pcre_uint8 *)argv[op+1], &endptr)),
-        *endptr == 0))
-    {
-    op++;
-    argc--;
-    }
-  else if (strcmp(arg, "-t") == 0 || strcmp(arg, "-tm") == 0 ||
-           strcmp(arg, "-T") == 0 || strcmp(arg, "-TM") == 0)
-    {
-    int temp;
-    int both = arg[2] == 0;
-    showtotaltimes = arg[1] == 'T';
-    if (argc > 2 && (temp = get_value((pcre_uint8 *)argv[op+1], &endptr),
-                     *endptr == 0))
-      {
-      timeitm = temp;
-      op++;
-      argc--;
-      }
-    else timeitm = LOOPREPEAT;
-    if (both) timeit = timeitm;
-    }
-  else if (strcmp(arg, "-S") == 0 && argc > 2 &&
-      ((stack_size = get_value((pcre_uint8 *)argv[op+1], &endptr)),
-        *endptr == 0))
-    {
-#if defined(_WIN32) || defined(WIN32) || defined(__minix) || defined(NATIVE_ZOS) || defined(__VMS)
-    printf("PCRE: -S not supported on this OS\n");
-    exit(1);
-#else
-    int rc;
-    struct rlimit rlim;
-    getrlimit(RLIMIT_STACK, &rlim);
-    rlim.rlim_cur = stack_size * 1024 * 1024;
-    rc = setrlimit(RLIMIT_STACK, &rlim);
-    if (rc != 0)
-      {
-    printf("PCRE: setrlimit() failed with error %d\n", rc);
-    exit(1);
-      }
-    op++;
-    argc--;
-#endif
-    }
-#if !defined NOPOSIX
-  else if (strcmp(arg, "-p") == 0) posix = 1;
-#endif
-  else if (strcmp(arg, "-C") == 0)
-    {
-    int rc;
-    unsigned long int lrc;
-
-    if (argc > 2)
-      {
-      if (strcmp(argv[op + 1], "linksize") == 0)
-        {
-        (void)PCRE_CONFIG(PCRE_CONFIG_LINK_SIZE, &rc);
-        printf("%d\n", rc);
-        yield = rc;
-
-#ifdef __VMS
-        vms_setsymbol("LINKSIZE",0,yield );
-#endif
-        }
-      else if (strcmp(argv[op + 1], "pcre8") == 0)
-        {
-#ifdef SUPPORT_PCRE8
-        printf("1\n");
-        yield = 1;
-#else
-        printf("0\n");
-        yield = 0;
-#endif
-#ifdef __VMS
-        vms_setsymbol("PCRE8",0,yield );
-#endif
-        }
-      else if (strcmp(argv[op + 1], "pcre16") == 0)
-        {
-#ifdef SUPPORT_PCRE16
-        printf("1\n");
-        yield = 1;
-#else
-        printf("0\n");
-        yield = 0;
-#endif
-#ifdef __VMS
-        vms_setsymbol("PCRE16",0,yield );
-#endif
-        }
-      else if (strcmp(argv[op + 1], "pcre32") == 0)
-        {
-#ifdef SUPPORT_PCRE32
-        printf("1\n");
-        yield = 1;
-#else
-        printf("0\n");
-        yield = 0;
-#endif
-#ifdef __VMS
-        vms_setsymbol("PCRE32",0,yield );
-#endif
-        }
-      else if (strcmp(argv[op + 1], "utf") == 0)
-        {
-#ifdef SUPPORT_PCRE8
-        if (pcre_mode == PCRE8_MODE)
-          (void)pcre_config(PCRE_CONFIG_UTF8, &rc);
-#endif
-#ifdef SUPPORT_PCRE16
-        if (pcre_mode == PCRE16_MODE)
-          (void)pcre16_config(PCRE_CONFIG_UTF16, &rc);
-#endif
-#ifdef SUPPORT_PCRE32
-        if (pcre_mode == PCRE32_MODE)
-          (void)pcre32_config(PCRE_CONFIG_UTF32, &rc);
-#endif
-        printf("%d\n", rc);
-        yield = rc;
-#ifdef __VMS
-        vms_setsymbol("UTF",0,yield );
-#endif
-        }
-      else if (strcmp(argv[op + 1], "ucp") == 0)
-        {
-        (void)PCRE_CONFIG(PCRE_CONFIG_UNICODE_PROPERTIES, &rc);
-        printf("%d\n", rc);
-        yield = rc;
-        }
-      else if (strcmp(argv[op + 1], "jit") == 0)
-        {
-        (void)PCRE_CONFIG(PCRE_CONFIG_JIT, &rc);
-        printf("%d\n", rc);
-        yield = rc;
-        }
-      else if (strcmp(argv[op + 1], "newline") == 0)
-        {
-        (void)PCRE_CONFIG(PCRE_CONFIG_NEWLINE, &rc);
-        print_newline_config(rc, TRUE);
-        }
-      else if (strcmp(argv[op + 1], "bsr") == 0)
-        {
-        (void)PCRE_CONFIG(PCRE_CONFIG_BSR, &rc);
-        printf("%s\n", rc? "ANYCRLF" : "ANY");
-        }
-      else if (strcmp(argv[op + 1], "ebcdic") == 0)
-        {
-#ifdef EBCDIC
-        printf("1\n");
-        yield = 1;
-#else
-        printf("0\n");
-#endif
-        }
-      else if (strcmp(argv[op + 1], "ebcdic-nl") == 0)
-        {
-#ifdef EBCDIC
-        printf("0x%02x\n", CHAR_LF);
-#else
-        printf("0\n");
-#endif
-        }
-      else
-        {
-        printf("Unknown -C option: %s\n", argv[op + 1]);
-        }
-      goto EXIT;
-      }
-
-    /* No argument for -C: output all configuration information. */
-
-    printf("PCRE version %s\n", version);
-    printf("Compiled with\n");
-
-#ifdef EBCDIC
-    printf("  EBCDIC code support: LF is 0x%02x\n", CHAR_LF);
-#endif
-
-/* At least one of SUPPORT_PCRE8 and SUPPORT_PCRE16 will be set. If both
-are set, either both UTFs are supported or both are not supported. */
-
-#ifdef SUPPORT_PCRE8
-    printf("  8-bit support\n");
-    (void)pcre_config(PCRE_CONFIG_UTF8, &rc);
-      printf ("  %sUTF-8 support\n", rc ? "" : "No ");
-#endif
-#ifdef SUPPORT_PCRE16
-    printf("  16-bit support\n");
-    (void)pcre16_config(PCRE_CONFIG_UTF16, &rc);
-    printf ("  %sUTF-16 support\n", rc ? "" : "No ");
-#endif
-#ifdef SUPPORT_PCRE32
-    printf("  32-bit support\n");
-    (void)pcre32_config(PCRE_CONFIG_UTF32, &rc);
-    printf ("  %sUTF-32 support\n", rc ? "" : "No ");
-#endif
-
-    (void)PCRE_CONFIG(PCRE_CONFIG_UNICODE_PROPERTIES, &rc);
-    printf("  %sUnicode properties support\n", rc? "" : "No ");
-    (void)PCRE_CONFIG(PCRE_CONFIG_JIT, &rc);
-    if (rc)
-      {
-      const char *arch;
-      (void)PCRE_CONFIG(PCRE_CONFIG_JITTARGET, (void *)(&arch));
-      printf("  Just-in-time compiler support: %s\n", arch);
-      }
-    else
-      printf("  No just-in-time compiler support\n");
-    (void)PCRE_CONFIG(PCRE_CONFIG_NEWLINE, &rc);
-    print_newline_config(rc, FALSE);
-    (void)PCRE_CONFIG(PCRE_CONFIG_BSR, &rc);
-    printf("  \\R matches %s\n", rc? "CR, LF, or CRLF only" :
-                                     "all Unicode newlines");
-    (void)PCRE_CONFIG(PCRE_CONFIG_LINK_SIZE, &rc);
-    printf("  Internal link size = %d\n", rc);
-    (void)PCRE_CONFIG(PCRE_CONFIG_POSIX_MALLOC_THRESHOLD, &rc);
-    printf("  POSIX malloc threshold = %d\n", rc);
-    (void)PCRE_CONFIG(PCRE_CONFIG_PARENS_LIMIT, &lrc);
-    printf("  Parentheses nest limit = %ld\n", lrc);
-    (void)PCRE_CONFIG(PCRE_CONFIG_MATCH_LIMIT, &lrc);
-    printf("  Default match limit = %ld\n", lrc);
-    (void)PCRE_CONFIG(PCRE_CONFIG_MATCH_LIMIT_RECURSION, &lrc);
-    printf("  Default recursion depth limit = %ld\n", lrc);
-    (void)PCRE_CONFIG(PCRE_CONFIG_STACKRECURSE, &rc);
-    printf("  Match recursion uses %s", rc? "stack" : "heap");
-    if (showstore)
-      {
-      PCRE_EXEC(stack_size, NULL, NULL, NULL, -999, -999, 0, NULL, 0);
-      printf(": %sframe size = %d bytes", rc? "approximate " : "", -stack_size);
-      }
-    printf("\n");
-    goto EXIT;
-    }
-  else if (strcmp(arg, "-help") == 0 ||
-           strcmp(arg, "--help") == 0)
-    {
-    usage();
-    goto EXIT;
-    }
-  else
-    {
-    BAD_ARG:
-    printf("** Unknown or malformed option %s\n", arg);
-    usage();
-    yield = 1;
-    goto EXIT;
-    }
-  op++;
-  argc--;
-  }
-
-/* Get the store for the offsets vector, and remember what it was */
-
-size_offsets_max = size_offsets;
-offsets = (int *)malloc(size_offsets_max * sizeof(int));
-if (offsets == NULL)
-  {
-  printf("** Failed to get %d bytes of memory for offsets vector\n",
-    (int)(size_offsets_max * sizeof(int)));
-  yield = 1;
-  goto EXIT;
-  }
-
-/* Sort out the input and output files */
-
-if (argc > 1)
-  {
-  infile = fopen(argv[op], INPUT_MODE);
-  if (infile == NULL)
-    {
-    printf("** Failed to open %s\n", argv[op]);
-    yield = 1;
-    goto EXIT;
-    }
-  }
-
-if (argc > 2)
-  {
-  outfile = fopen(argv[op+1], OUTPUT_MODE);
-  if (outfile == NULL)
-    {
-    printf("** Failed to open %s\n", argv[op+1]);
-    yield = 1;
-    goto EXIT;
-    }
-  }
-
-/* Set alternative malloc function */
-
-#ifdef SUPPORT_PCRE8
-pcre_malloc = new_malloc;
-pcre_free = new_free;
-pcre_stack_malloc = stack_malloc;
-pcre_stack_free = stack_free;
-#endif
-
-#ifdef SUPPORT_PCRE16
-pcre16_malloc = new_malloc;
-pcre16_free = new_free;
-pcre16_stack_malloc = stack_malloc;
-pcre16_stack_free = stack_free;
-#endif
-
-#ifdef SUPPORT_PCRE32
-pcre32_malloc = new_malloc;
-pcre32_free = new_free;
-pcre32_stack_malloc = stack_malloc;
-pcre32_stack_free = stack_free;
-#endif
-
-/* Heading line unless quiet */
-
-if (!quiet) fprintf(outfile, "PCRE version %s\n\n", version);
-
-/* Main loop */
-
-while (!done)
-  {
-  pcre *re = NULL;
-  pcre_extra *extra = NULL;
-
-#if !defined NOPOSIX  /* There are still compilers that require no indent */
-  regex_t preg = { NULL, 0, 0} ;
-  int do_posix = 0;
-#endif
-
-  const char *error;
-  pcre_uint8 *markptr;
-  pcre_uint8 *p, *pp, *ppp;
-  pcre_uint8 *to_file = NULL;
-  const pcre_uint8 *tables = NULL;
-  unsigned long int get_options;
-  unsigned long int true_size, true_study_size = 0;
-  size_t size;
-  int do_allcaps = 0;
-  int do_mark = 0;
-  int do_study = 0;
-  int no_force_study = 0;
-  int do_debug = debug;
-  int do_G = 0;
-  int do_g = 0;
-  int do_showinfo = showinfo;
-  int do_showrest = 0;
-  int do_showcaprest = 0;
-  int do_flip = 0;
-  int erroroffset, len, delimiter, poffset;
-
-#if !defined NODFA
-  int dfa_matched = 0;
-#endif
-
-  use_utf = 0;
-  debug_lengths = 1;
-  SET_PCRE_STACK_GUARD(NULL);
-
-  if (extend_inputline(infile, buffer, "  re> ") == NULL) break;
-  if (infile != stdin) fprintf(outfile, "%s", (char *)buffer);
-  fflush(outfile);
-
-  p = buffer;
-  while (isspace(*p)) p++;
-  if (*p == 0) continue;
-
-  /* Handle option lock-out setting */
-
-  if (*p == '<' && p[1] == ' ')
-    {
-    p += 2;
-    while (isspace(*p)) p++;
-    if (strncmp((char *)p, "forbid ", 7) == 0)
-      {
-      p += 7;
-      while (isspace(*p)) p++;
-      pp = lockout;
-      while (!isspace(*p) && pp < lockout + sizeof(lockout) - 1)
-        *pp++ = *p++;
-      *pp = 0;
-      }
-    else
-      {
-      printf("** Unrecognized special command '%s'\n", p);
-      yield = 1;
-      goto EXIT;
-      }
-    continue;
-    }
-
-  /* See if the pattern is to be loaded pre-compiled from a file. */
-
-  if (*p == '<' && strchr((char *)(p+1), '<') == NULL)
-    {
-    pcre_uint32 magic;
-    pcre_uint8 sbuf[8];
-    FILE *f;
-
-    p++;
-    if (*p == '!')
-      {
-      do_debug = TRUE;
-      do_showinfo = TRUE;
-      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 = (pcre *)new_malloc(true_size);
-    if (re == NULL)
-      {
-      printf("** Failed to get %d bytes of memory for pcre object\n",
-        (int)true_size);
-      yield = 1;
-      goto EXIT;
-      }
-    if (fread(re, 1, true_size, f) != true_size) goto FAIL_READ;
-
-    magic = REAL_PCRE_MAGIC(re);
-    if (magic != MAGIC_NUMBER)
-      {
-      if (swap_uint32(magic) == MAGIC_NUMBER)
-        {
-        do_flip = 1;
-        }
-      else
-        {
-        fprintf(outfile, "Data in %s is not a compiled PCRE regex\n", p);
-        new_free(re);
-        fclose(f);
-        continue;
-        }
-      }
-
-    /* We hide the byte-invert info for little and big endian tests. */
-    fprintf(outfile, "Compiled pattern%s loaded from %s\n",
-      do_flip && (p[-1] == '<') ? " (byte-inverted)" : "", p);
-
-    /* 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)
-          {
-          PCRE_FREE_STUDY(extra);
-          }
-        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");
-
-    /* Flip the necessary bytes. */
-    if (do_flip)
-      {
-      int rc;
-      PCRE_PATTERN_TO_HOST_BYTE_ORDER(rc, re, extra, NULL);
-      if (rc == PCRE_ERROR_BADMODE)
-        {
-        pcre_uint32 flags_in_host_byte_order;
-        if (REAL_PCRE_MAGIC(re) == MAGIC_NUMBER)
-          flags_in_host_byte_order = REAL_PCRE_FLAGS(re);
-        else
-          flags_in_host_byte_order = swap_uint32(REAL_PCRE_FLAGS(re));
-        /* Simulate the result of the function call below. */
-        fprintf(outfile, "Error %d from pcre%s_fullinfo(%d)\n", rc,
-          pcre_mode == PCRE32_MODE ? "32" : pcre_mode == PCRE16_MODE ? "16" : "",
-          PCRE_INFO_OPTIONS);
-        fprintf(outfile, "Running in %d-bit mode but pattern was compiled in "
-          "%d-bit mode\n", 8 * CHAR_SIZE, 8 * (flags_in_host_byte_order & PCRE_MODE_MASK));
-        new_free(re);
-        fclose(f);
-        continue;
-        }
-      }
-
-    /* Need to know if UTF-8 for printing data strings. */
-
-    if (new_info(re, NULL, PCRE_INFO_OPTIONS, &get_options) < 0)
-      {
-      new_free(re);
-      fclose(f);
-      continue;
-      }
-    use_utf = (get_options & PCRE_UTF8) != 0;
-
-    fclose(f);
-    goto SHOW_INFO;
-    }
-
-  /* In-line pattern (the usual case). Get the delimiter and seek the end of
-  the pattern; if it isn't complete, read more. */
-
-  delimiter = *p++;
-
-  if (isalnum(delimiter) || delimiter == '\\')
-    {
-    fprintf(outfile, "** Delimiter must not be alphanumeric or \\\n");
-    goto SKIP_DATA;
-    }
-
-  pp = p;
-  poffset = (int)(p - buffer);
-
-  for(;;)
-    {
-    while (*pp != 0)
-      {
-      if (*pp == '\\' && pp[1] != 0) pp++;
-        else if (*pp == delimiter) break;
-      pp++;
-      }
-    if (*pp != 0) break;
-    if ((pp = extend_inputline(infile, pp, "    > ")) == NULL)
-      {
-      fprintf(outfile, "** Unexpected EOF\n");
-      done = 1;
-      goto CONTINUE;
-      }
-    if (infile != stdin) fprintf(outfile, "%s", (char *)pp);
-    }
-
-  /* The buffer may have moved while being extended; reset the start of data
-  pointer to the correct relative point in the buffer. */
-
-  p = buffer + poffset;
-
-  /* If the first character after the delimiter is backslash, make
-  the pattern end with backslash. This is purely to provide a way
-  of testing for the error message when a pattern ends with backslash. */
-
-  if (pp[1] == '\\') *pp++ = '\\';
-
-  /* Terminate the pattern at the delimiter, and save a copy of the pattern
-  for callouts. */
-
-  *pp++ = 0;
-  strcpy((char *)pbuffer, (char *)p);
-
-  /* Look for modifiers and options after the final delimiter. */
-
-  options = default_options;
-  study_options = force_study_options;
-  log_store = showstore;  /* default from command line */
-
-  while (*pp != 0)
-    {
-    /* Check to see whether this modifier has been locked out for this file.
-    This is complicated for the multi-character options that begin with '<'.
-    If there is no '>' in the lockout string, all multi-character modifiers are
-    locked out. */
-
-    if (strchr((char *)lockout, *pp) != NULL)
-      {
-      if (*pp == '<' && strchr((char *)lockout, '>') != NULL)
-        {
-        int x = check_mc_option(pp+1, outfile, FALSE, "modifier");
-        if (x == 0) goto SKIP_DATA;
-
-        for (ppp = lockout; *ppp != 0; ppp++)
-          {
-          if (*ppp == '<')
-            {
-            int y = check_mc_option(ppp+1, outfile, FALSE, "modifier");
-            if (y == 0)
-              {
-              printf("** Error in modifier forbid data - giving up.\n");
-              yield = 1;
-              goto EXIT;
-              }
-            if (x == y)
-              {
-              ppp = pp;
-              while (*ppp != '>') ppp++;
-              printf("** The %.*s modifier is locked out - giving up.\n",
-                (int)(ppp - pp + 1), pp);
-              yield = 1;
-              goto EXIT;
-              }
-            }
-          }
-        }
-
-      /* The single-character modifiers are straightforward. */
-
-      else
-        {
-        printf("** The /%c modifier is locked out - giving up.\n", *pp);
-        yield = 1;
-        goto EXIT;
-        }
-      }
-
-    /* The modifier is not locked out; handle it. */
-
-    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;
-      case 's': options |= PCRE_DOTALL; break;
-      case 'x': options |= PCRE_EXTENDED; break;
-
-      case '+':
-      if (do_showrest) do_showcaprest = 1; else do_showrest = 1;
-      break;
-
-      case '=': do_allcaps = 1; break;
-      case 'A': options |= PCRE_ANCHORED; break;
-      case 'B': do_debug = 1; 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 'J': options |= PCRE_DUPNAMES; break;
-      case 'K': do_mark = 1; break;
-      case 'M': log_store = 1; break;
-      case 'N': options |= PCRE_NO_AUTO_CAPTURE; break;
-      case 'O': options |= PCRE_NO_AUTO_POSSESS; break;
-
-#if !defined NOPOSIX
-      case 'P': do_posix = 1; break;
-#endif
-
-      case 'Q':
-      switch (*pp)
-        {
-        case '0':
-        case '1':
-        stack_guard_return = *pp++ - '0';
-        break;
-
-        default:
-        fprintf(outfile, "** Missing 0 or 1 after /Q\n");
-        goto SKIP_DATA;
-        }
-      SET_PCRE_STACK_GUARD(stack_guard);
-      break;
-
-      case 'S':
-      do_study = 1;
-      for (;;)
-        {
-        switch (*pp++)
-          {
-          case 'S':
-          do_study = 0;
-          no_force_study = 1;
-          break;
-
-          case '!':
-          study_options |= PCRE_STUDY_EXTRA_NEEDED;
-          break;
-
-          case '+':
-          if (*pp == '+')
-            {
-            verify_jit = TRUE;
-            pp++;
-            }
-          if (*pp >= '1' && *pp <= '7')
-            study_options |= jit_study_bits[*pp++ - '1'];
-          else
-            study_options |= jit_study_bits[6];
-          break;
-
-          case '-':
-          study_options &= ~PCRE_STUDY_ALLJIT;
-          break;
-
-          default:
-          pp--;
-          goto ENDLOOP;
-          }
-        }
-      ENDLOOP:
-      break;
-
-      case 'U': options |= PCRE_UNGREEDY; break;
-      case 'W': options |= PCRE_UCP; break;
-      case 'X': options |= PCRE_EXTRA; break;
-      case 'Y': options |= PCRE_NO_START_OPTIMISE; break;
-      case 'Z': debug_lengths = 0; break;
-      case '8': options |= PCRE_UTF8; use_utf = 1; break;
-      case '9': options |= PCRE_NEVER_UTF; break;
-      case '?': options |= PCRE_NO_UTF8_CHECK; break;
-
-      case 'T':
-      switch (*pp++)
-        {
-        case '0': tables = tables0; break;
-        case '1': tables = tables1; break;
-
-        case '\r':
-        case '\n':
-        case ' ':
-        case 0:
-        fprintf(outfile, "** Missing table number after /T\n");
-        goto SKIP_DATA;
-
-        default:
-        fprintf(outfile, "** Bad table number \"%c\" after /T\n", pp[-1]);
-        goto SKIP_DATA;
-        }
-      break;
-
-      case 'L':
-      ppp = pp;
-      /* The '\r' test here is so that it works on Windows. */
-      /* The '0' test is just in case this is an unterminated line. */
-      while (*ppp != 0 && *ppp != '\n' && *ppp != '\r' && *ppp != ' ') ppp++;
-      *ppp = 0;
-      if (setlocale(LC_CTYPE, (const char *)pp) == NULL)
-        {
-        fprintf(outfile, "** Failed to set locale \"%s\"\n", pp);
-        goto SKIP_DATA;
-        }
-      locale_set = 1;
-      tables = PCRE_MAKETABLES;
-      pp = ppp;
-      break;
-
-      case '>':
-      to_file = pp;
-      while (*pp != 0) pp++;
-      while (isspace(pp[-1])) pp--;
-      *pp = 0;
-      break;
-
-      case '<':
-        {
-        int x = check_mc_option(pp, outfile, FALSE, "modifier");
-        if (x == 0) goto SKIP_DATA;
-        options |= x;
-        while (*pp++ != '>');
-        }
-      break;
-
-      case '\r':                      /* So that it works in Windows */
-      case '\n':
-      case ' ':
-      break;
-
-      default:
-      fprintf(outfile, "** Unknown modifier '%c'\n", pp[-1]);
-      goto SKIP_DATA;
-      }
-    }
-
-  /* Handle compiling via the POSIX interface, which doesn't support the
-  timing, showing, or debugging options, nor the ability to pass over
-  local character tables. Neither does it have 16-bit support. */
-
-#if !defined NOPOSIX
-  if (posix || do_posix)
-    {
-    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;
-    if ((options & PCRE_NO_AUTO_CAPTURE) != 0) cflags |= REG_NOSUB;
-    if ((options & PCRE_UTF8) != 0) cflags |= REG_UTF8;
-    if ((options & PCRE_UCP) != 0) cflags |= REG_UCP;
-    if ((options & PCRE_UNGREEDY) != 0) cflags |= REG_UNGREEDY;
-
-    rc = regcomp(&preg, (char *)p, cflags);
-
-    /* Compilation failed; go back for another re, skipping to blank line
-    if non-interactive. */
-
-    if (rc != 0)
-      {
-      (void)regerror(rc, &preg, (char *)buffer, buffer_size);
-      fprintf(outfile, "Failed: POSIX code %d: %s\n", rc, buffer);
-      goto SKIP_DATA;
-      }
-    }
-
-  /* Handle compiling via the native interface */
-
-  else
-#endif  /* !defined NOPOSIX */
-
-    {
-    /* In 16- or 32-bit mode, convert the input. */
-
-#ifdef SUPPORT_PCRE16
-    if (pcre_mode == PCRE16_MODE)
-      {
-      switch(to16(FALSE, p, options & PCRE_UTF8, (int)strlen((char *)p)))
-        {
-        case -1:
-        fprintf(outfile, "**Failed: invalid UTF-8 string cannot be "
-          "converted to UTF-16\n");
-        goto SKIP_DATA;
-
-        case -2:
-        fprintf(outfile, "**Failed: character value greater than 0x10ffff "
-          "cannot be converted to UTF-16\n");
-        goto SKIP_DATA;
-
-        case -3: /* "Impossible error" when to16 is called arg1 FALSE */
-        fprintf(outfile, "**Failed: character value greater than 0xffff "
-          "cannot be converted to 16-bit in non-UTF mode\n");
-        goto SKIP_DATA;
-
-        default:
-        break;
-        }
-      p = (pcre_uint8 *)buffer16;
-      }
-#endif
-
-#ifdef SUPPORT_PCRE32
-    if (pcre_mode == PCRE32_MODE)
-      {
-      switch(to32(FALSE, p, options & PCRE_UTF32, (int)strlen((char *)p)))
-        {
-        case -1:
-        fprintf(outfile, "**Failed: invalid UTF-8 string cannot be "
-          "converted to UTF-32\n");
-        goto SKIP_DATA;
-
-        case -2:
-        fprintf(outfile, "**Failed: character value greater than 0x10ffff "
-          "cannot be converted to UTF-32\n");
-        goto SKIP_DATA;
-
-        case -3:
-        fprintf(outfile, "**Failed: character value is ill-formed UTF-32\n");
-        goto SKIP_DATA;
-
-        default:
-        break;
-        }
-      p = (pcre_uint8 *)buffer32;
-      }
-#endif
-
-    /* Compile many times when timing */
-
-    if (timeit > 0)
-      {
-      register int i;
-      clock_t time_taken;
-      clock_t start_time = clock();
-      for (i = 0; i < timeit; i++)
-        {
-        PCRE_COMPILE(re, p, options, &error, &erroroffset, tables);
-        if (re != NULL) free(re);
-        }
-      total_compile_time += (time_taken = clock() - start_time);
-      fprintf(outfile, "Compile time %.4f milliseconds\n",
-        (((double)time_taken * 1000.0) / (double)timeit) /
-          (double)CLOCKS_PER_SEC);
-      }
-
-    PCRE_COMPILE(re, p, options, &error, &erroroffset, tables);
-
-    /* Compilation failed; go back for another re, skipping to blank line
-    if non-interactive. */
-
-    if (re == NULL)
-      {
-      fprintf(outfile, "Failed: %s at offset %d\n", error, erroroffset);
-      SKIP_DATA:
-      if (infile != stdin)
-        {
-        for (;;)
-          {
-          if (extend_inputline(infile, buffer, NULL) == NULL)
-            {
-            done = 1;
-            goto CONTINUE;
-            }
-          len = (int)strlen((char *)buffer);
-          while (len > 0 && isspace(buffer[len-1])) len--;
-          if (len == 0) break;
-          }
-        fprintf(outfile, "\n");
-        }
-      goto CONTINUE;
-      }
-
-    /* Compilation succeeded. It is now possible to set the UTF-8 option from
-    within the regex; check for this so that we know how to process the data
-    lines. */
-
-    if (new_info(re, NULL, PCRE_INFO_OPTIONS, &get_options) < 0)
-      goto SKIP_DATA;
-    if ((get_options & PCRE_UTF8) != 0) use_utf = 1;
-
-    /* Extract the size for possible writing before possibly flipping it,
-    and remember the store that was got. */
-
-    true_size = REAL_PCRE_SIZE(re);
-
-    /* Output code size information if requested */
-
-    if (log_store)
-      {
-      int name_count, name_entry_size, real_pcre_size;
-
-      new_info(re, NULL, PCRE_INFO_NAMECOUNT, &name_count);
-      new_info(re, NULL, PCRE_INFO_NAMEENTRYSIZE, &name_entry_size);
-      real_pcre_size = 0;
-#ifdef SUPPORT_PCRE8
-      if (REAL_PCRE_FLAGS(re) & PCRE_MODE8)
-        real_pcre_size = sizeof(real_pcre);
-#endif
-#ifdef SUPPORT_PCRE16
-      if (REAL_PCRE_FLAGS(re) & PCRE_MODE16)
-        real_pcre_size = sizeof(real_pcre16);
-#endif
-#ifdef SUPPORT_PCRE32
-      if (REAL_PCRE_FLAGS(re) & PCRE_MODE32)
-        real_pcre_size = sizeof(real_pcre32);
-#endif
-      new_info(re, NULL, PCRE_INFO_SIZE, &size);
-      fprintf(outfile, "Memory allocation (code space): %d\n",
-        (int)(size - real_pcre_size - name_count * name_entry_size));
-      }
-
-    /* If -s or /S was present, study the regex to generate additional info to
-    help with the matching, unless the pattern has the SS option, which
-    suppresses the effect of /S (used for a few test patterns where studying is
-    never sensible). */
-
-    if (do_study || (force_study >= 0 && !no_force_study))
-      {
-      if (timeit > 0)
-        {
-        register int i;
-        clock_t time_taken;
-        clock_t start_time = clock();
-        for (i = 0; i < timeit; i++)
-          {
-          PCRE_STUDY(extra, re, study_options, &error);
-          }
-        total_study_time = (time_taken = clock() - start_time);
-        if (extra != NULL)
-          {
-          PCRE_FREE_STUDY(extra);
-          }
-        fprintf(outfile, "  Study time %.4f milliseconds\n",
-          (((double)time_taken * 1000.0) / (double)timeit) /
-            (double)CLOCKS_PER_SEC);
-        }
-      PCRE_STUDY(extra, 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 (log_store)
-          {
-          size_t jitsize;
-          if (new_info(re, extra, PCRE_INFO_JITSIZE, &jitsize) == 0 &&
-              jitsize != 0)
-            fprintf(outfile, "Memory allocation (JIT code): %d\n", (int)jitsize);
-          }
-        }
-      }
-
-    /* If /K was present, we set up for handling MARK data. */
-
-    if (do_mark)
-      {
-      if (extra == NULL)
-        {
-        extra = (pcre_extra *)malloc(sizeof(pcre_extra));
-        extra->flags = 0;
-        }
-      extra->mark = &markptr;
-      extra->flags |= PCRE_EXTRA_MARK;
-      }
-
-    /* Extract and display information from the compiled data if required. */
-
-    SHOW_INFO:
-
-    if (do_debug)
-      {
-      fprintf(outfile, "------------------------------------------------------------------\n");
-      PCRE_PRINTINT(re, outfile, debug_lengths);
-      }
-
-    /* We already have the options in get_options (see above) */
-
-    if (do_showinfo)
-      {
-      unsigned long int all_options;
-      pcre_uint32 first_char, need_char;
-      pcre_uint32 match_limit, recursion_limit;
-      int count, backrefmax, first_char_set, need_char_set, okpartial, jchanged,
-        hascrorlf, maxlookbehind, match_empty;
-      int nameentrysize, namecount;
-      const pcre_uint8 *nametable;
-
-      if (new_info(re, NULL, PCRE_INFO_CAPTURECOUNT, &count) +
-          new_info(re, NULL, PCRE_INFO_BACKREFMAX, &backrefmax) +
-          new_info(re, NULL, PCRE_INFO_FIRSTCHARACTER, &first_char) +
-          new_info(re, NULL, PCRE_INFO_FIRSTCHARACTERFLAGS, &first_char_set) +
-          new_info(re, NULL, PCRE_INFO_REQUIREDCHAR, &need_char) +
-          new_info(re, NULL, PCRE_INFO_REQUIREDCHARFLAGS, &need_char_set) +
-          new_info(re, NULL, PCRE_INFO_NAMEENTRYSIZE, &nameentrysize) +
-          new_info(re, NULL, PCRE_INFO_NAMECOUNT, &namecount) +
-          new_info(re, NULL, PCRE_INFO_NAMETABLE, (void *)&nametable) +
-          new_info(re, NULL, PCRE_INFO_OKPARTIAL, &okpartial) +
-          new_info(re, NULL, PCRE_INFO_JCHANGED, &jchanged) +
-          new_info(re, NULL, PCRE_INFO_HASCRORLF, &hascrorlf) +
-          new_info(re, NULL, PCRE_INFO_MATCH_EMPTY, &match_empty) +
-          new_info(re, NULL, PCRE_INFO_MAXLOOKBEHIND, &maxlookbehind)
-          != 0)
-        goto SKIP_DATA;
-
-      fprintf(outfile, "Capturing subpattern count = %d\n", count);
-
-      if (backrefmax > 0)
-        fprintf(outfile, "Max back reference = %d\n", backrefmax);
-
-      if (maxlookbehind > 0)
-        fprintf(outfile, "Max lookbehind = %d\n", maxlookbehind);
-
-      if (new_info(re, NULL, PCRE_INFO_MATCHLIMIT, &match_limit) == 0)
-        fprintf(outfile, "Match limit = %u\n", match_limit);
-
-      if (new_info(re, NULL, PCRE_INFO_RECURSIONLIMIT, &recursion_limit) == 0)
-        fprintf(outfile, "Recursion limit = %u\n", recursion_limit);
-
-      if (namecount > 0)
-        {
-        fprintf(outfile, "Named capturing subpatterns:\n");
-        while (namecount-- > 0)
-          {
-          int imm2_size = pcre_mode == PCRE8_MODE ? 2 : 1;
-          int length = (int)STRLEN(nametable + imm2_size);
-          fprintf(outfile, "  ");
-          PCHARSV(nametable, imm2_size, length, outfile);
-          while (length++ < nameentrysize - imm2_size) putc(' ', outfile);
-#ifdef SUPPORT_PCRE32
-          if (pcre_mode == PCRE32_MODE)
-            fprintf(outfile, "%3d\n", (int)(((PCRE_SPTR32)nametable)[0]));
-#endif
-#ifdef SUPPORT_PCRE16
-          if (pcre_mode == PCRE16_MODE)
-            fprintf(outfile, "%3d\n", (int)(((PCRE_SPTR16)nametable)[0]));
-#endif
-#ifdef SUPPORT_PCRE8
-          if (pcre_mode == PCRE8_MODE)
-            fprintf(outfile, "%3d\n", ((int)nametable[0] << 8) | (int)nametable[1]);
-#endif
-          nametable += nameentrysize * CHAR_SIZE;
-          }
-        }
-
-      if (!okpartial)  fprintf(outfile, "Partial matching not supported\n");
-      if (hascrorlf)   fprintf(outfile, "Contains explicit CR or LF match\n");
-      if (match_empty) fprintf(outfile, "May match empty string\n");
-
-      all_options = REAL_PCRE_OPTIONS(re);
-      if (do_flip) all_options = swap_uint32(all_options);
-
-      if (get_options == 0) fprintf(outfile, "No options\n");
-        else fprintf(outfile, "Options:%s%s%s%s%s%s%s%s%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_BSR_ANYCRLF) != 0)? " bsr_anycrlf" : "",
-          ((get_options & PCRE_BSR_UNICODE) != 0)? " bsr_unicode" : "",
-          ((get_options & PCRE_DOLLAR_ENDONLY) != 0)? " dollar_endonly" : "",
-          ((get_options & PCRE_EXTRA) != 0)? " extra" : "",
-          ((get_options & PCRE_UNGREEDY) != 0)? " ungreedy" : "",
-          ((get_options & PCRE_NO_AUTO_CAPTURE) != 0)? " no_auto_capture" : "",
-          ((get_options & PCRE_NO_AUTO_POSSESS) != 0)? " no_auto_possessify" : "",
-          ((get_options & PCRE_UTF8) != 0)? " utf" : "",
-          ((get_options & PCRE_UCP) != 0)? " ucp" : "",
-          ((get_options & PCRE_NO_UTF8_CHECK) != 0)? " no_utf_check" : "",
-          ((get_options & PCRE_NO_START_OPTIMIZE) != 0)? " no_start_optimize" : "",
-          ((get_options & PCRE_DUPNAMES) != 0)? " dupnames" : "",
-          ((get_options & PCRE_NEVER_UTF) != 0)? " never_utf" : "");
-
-      if (jchanged) fprintf(outfile, "Duplicate name status changes\n");
-
-      switch (get_options & PCRE_NEWLINE_BITS)
-        {
-        case PCRE_NEWLINE_CR:
-        fprintf(outfile, "Forced newline sequence: CR\n");
-        break;
-
-        case PCRE_NEWLINE_LF:
-        fprintf(outfile, "Forced newline sequence: LF\n");
-        break;
-
-        case PCRE_NEWLINE_CRLF:
-        fprintf(outfile, "Forced newline sequence: CRLF\n");
-        break;
-
-        case PCRE_NEWLINE_ANYCRLF:
-        fprintf(outfile, "Forced newline sequence: ANYCRLF\n");
-        break;
-
-        case PCRE_NEWLINE_ANY:
-        fprintf(outfile, "Forced newline sequence: ANY\n");
-        break;
-
-        default:
-        break;
-        }
-
-      if (first_char_set == 2)
-        {
-        fprintf(outfile, "First char at start or follows newline\n");
-        }
-      else if (first_char_set == 1)
-        {
-        const char *caseless =
-          ((REAL_PCRE_FLAGS(re) & PCRE_FCH_CASELESS) == 0)?
-          "" : " (caseless)";
-
-        if (PRINTOK(first_char))
-          fprintf(outfile, "First char = \'%c\'%s\n", first_char, caseless);
-        else
-          {
-          fprintf(outfile, "First char = ");
-          pchar(first_char, outfile);
-          fprintf(outfile, "%s\n", caseless);
-          }
-        }
-      else
-        {
-        fprintf(outfile, "No first char\n");
-        }
-
-      if (need_char_set == 0)
-        {
-        fprintf(outfile, "No need char\n");
-        }
-      else
-        {
-        const char *caseless =
-          ((REAL_PCRE_FLAGS(re) & PCRE_RCH_CASELESS) == 0)?
-          "" : " (caseless)";
-
-        if (PRINTOK(need_char))
-          fprintf(outfile, "Need char = \'%c\'%s\n", need_char, caseless);
-        else
-          {
-          fprintf(outfile, "Need char = ");
-          pchar(need_char, outfile);
-          fprintf(outfile, "%s\n", caseless);
-          }
-        }
-
-      /* 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 study was forced by an external -s, don't show this
-      information unless -i or -d was also present. This means that, except
-      when auto-callouts are involved, the output from runs with and without
-      -s should be identical. */
-
-      if (do_study || (force_study >= 0 && showinfo && !no_force_study))
-        {
-        if (extra == NULL)
-          fprintf(outfile, "Study returned NULL\n");
-        else
-          {
-          pcre_uint8 *start_bits = NULL;
-          int minlength;
-
-          if (new_info(re, extra, PCRE_INFO_MINLENGTH, &minlength) == 0)
-            fprintf(outfile, "Subject length lower bound = %d\n", minlength);
-
-          if (new_info(re, extra, PCRE_INFO_FIRSTTABLE, &start_bits) == 0)
-            {
-            if (start_bits == NULL)
-              fprintf(outfile, "No starting char list\n");
-            else
-              {
-              int i;
-              int c = 24;
-              fprintf(outfile, "Starting chars: ");
-              for (i = 0; i < 256; i++)
-                {
-                if ((start_bits[i/8] & (1<<(i&7))) != 0)
-                  {
-                  if (c > 75)
-                    {
-                    fprintf(outfile, "\n  ");
-                    c = 2;
-                    }
-                  if (PRINTOK(i) && i != ' ')
-                    {
-                    fprintf(outfile, "%c ", i);
-                    c += 2;
-                    }
-                  else
-                    {
-                    fprintf(outfile, "\\x%02x ", i);
-                    c += 5;
-                    }
-                  }
-                }
-              fprintf(outfile, "\n");
-              }
-            }
-          }
-
-        /* Show this only if the JIT was set by /S, not by -s. */
-
-        if ((study_options & PCRE_STUDY_ALLJIT) != 0 &&
-            (force_study_options & PCRE_STUDY_ALLJIT) == 0)
-          {
-          int jit;
-          if (new_info(re, extra, PCRE_INFO_JIT, &jit) == 0)
-            {
-            if (jit)
-              fprintf(outfile, "JIT study was successful\n");
-            else
-#ifdef SUPPORT_JIT
-              fprintf(outfile, "JIT study was not successful\n");
-#else
-              fprintf(outfile, "JIT support is not available in this version of PCRE\n");
-#endif
-            }
-          }
-        }
-      }
-
-    /* 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. */
-
-    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
-        {
-        pcre_uint8 sbuf[8];
-
-        if (do_flip) regexflip(re, extra);
-        sbuf[0] = (pcre_uint8)((true_size >> 24) & 255);
-        sbuf[1] = (pcre_uint8)((true_size >> 16) & 255);
-        sbuf[2] = (pcre_uint8)((true_size >>  8) & 255);
-        sbuf[3] = (pcre_uint8)((true_size) & 255);
-        sbuf[4] = (pcre_uint8)((true_study_size >> 24) & 255);
-        sbuf[5] = (pcre_uint8)((true_study_size >> 16) & 255);
-        sbuf[6] = (pcre_uint8)((true_study_size >>  8) & 255);
-        sbuf[7] = (pcre_uint8)((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
-          {
-          fprintf(outfile, "Compiled pattern written to %s\n", to_file);
-
-          /* If there is study data, write it. */
-
-          if (extra != NULL)
-            {
-            if (fwrite(extra->study_data, 1, true_study_size, f) <
-                true_study_size)
-              {
-              fprintf(outfile, "Write error on %s: %s\n", to_file,
-                strerror(errno));
-              }
-            else fprintf(outfile, "Study data written to %s\n", to_file);
-            }
-          }
-        fclose(f);
-        }
-
-      new_free(re);
-      if (extra != NULL)
-        {
-        PCRE_FREE_STUDY(extra);
-        }
-      if (locale_set)
-        {
-        new_free((void *)tables);
-        setlocale(LC_CTYPE, "C");
-        locale_set = 0;
-        }
-      continue;  /* With next regex */
-      }
-    }        /* End of non-POSIX compile */
-
-  /* Read data lines and test them */
-
-  for (;;)
-    {
-#ifdef SUPPORT_PCRE8
-    pcre_uint8 *q8;
-#endif
-#ifdef SUPPORT_PCRE16
-    pcre_uint16 *q16;
-#endif
-#ifdef SUPPORT_PCRE32
-    pcre_uint32 *q32;
-#endif
-    pcre_uint8 *bptr;
-    int *use_offsets = offsets;
-    int use_size_offsets = size_offsets;
-    int callout_data = 0;
-    int callout_data_set = 0;
-    int count;
-    pcre_uint32 c;
-    int copystrings = 0;
-    int find_match_limit = default_find_match_limit;
-    int getstrings = 0;
-    int getlist = 0;
-    int gmatched = 0;
-    int start_offset = 0;
-    int start_offset_sign = 1;
-    int g_notempty = 0;
-    int use_dfa = 0;
-
-    *copynames = 0;
-    *getnames = 0;
-
-#ifdef SUPPORT_PCRE32
-    cn32ptr = copynames;
-    gn32ptr = getnames;
-#endif
-#ifdef SUPPORT_PCRE16
-    cn16ptr = copynames16;
-    gn16ptr = getnames16;
-#endif
-#ifdef SUPPORT_PCRE8
-    cn8ptr = copynames8;
-    gn8ptr = getnames8;
-#endif
-
-    SET_PCRE_CALLOUT(callout);
-    first_callout = 1;
-    last_callout_mark = NULL;
-    callout_extra = 0;
-    callout_count = 0;
-    callout_fail_count = 999999;
-    callout_fail_id = -1;
-    show_malloc = 0;
-    options = 0;
-
-    if (extra != NULL) extra->flags &=
-      ~(PCRE_EXTRA_MATCH_LIMIT|PCRE_EXTRA_MATCH_LIMIT_RECURSION);
-
-    len = 0;
-    for (;;)
-      {
-      if (extend_inputline(infile, buffer + len, "data> ") == NULL)
-        {
-        if (len > 0)    /* Reached EOF without hitting a newline */
-          {
-          fprintf(outfile, "\n");
-          break;
-          }
-        done = 1;
-        goto CONTINUE;
-        }
-      if (infile != stdin) fprintf(outfile, "%s", (char *)buffer);
-      len = (int)strlen((char *)buffer);
-      if (buffer[len-1] == '\n') break;
-      }
-
-    while (len > 0 && isspace(buffer[len-1])) len--;
-    buffer[len] = 0;
-    if (len == 0) break;
-
-    p = buffer;
-    while (isspace(*p)) p++;
-
-#ifndef NOUTF
-    /* Check that the data is well-formed UTF-8 if we're in UTF mode. To create
-    invalid input to pcre_exec, you must use \x?? or \x{} sequences. */
-
-    if (use_utf)
-      {
-      pcre_uint8 *q;
-      pcre_uint32 cc;
-      int n = 1;
-
-      for (q = p; n > 0 && *q; q += n) n = utf82ord(q, &cc);
-      if (n <= 0)
-        {
-        fprintf(outfile, "**Failed: invalid UTF-8 string cannot be used as input in UTF mode\n");
-        goto NEXT_DATA;
-        }
-      }
-#endif
-
-#ifdef SUPPORT_VALGRIND
-    /* Mark the dbuffer as addressable but undefined again. */
-
-    if (dbuffer != NULL)
-      {
-      VALGRIND_MAKE_MEM_UNDEFINED(dbuffer, dbuffer_size * CHAR_SIZE);
-      }
-#endif
-
-    /* Allocate a buffer to hold the data line; len+1 is an upper bound on
-    the number of pcre_uchar units that will be needed. */
-
-    while (dbuffer == NULL || (size_t)len >= dbuffer_size)
-      {
-      dbuffer_size *= 2;
-      dbuffer = (pcre_uint8 *)realloc(dbuffer, dbuffer_size * CHAR_SIZE);
-      if (dbuffer == NULL)
-        {
-        fprintf(stderr, "pcretest: realloc(%d) failed\n", (int)dbuffer_size);
-        exit(1);
-        }
-      }
-
-#ifdef SUPPORT_PCRE8
-    q8 = (pcre_uint8 *) dbuffer;
-#endif
-#ifdef SUPPORT_PCRE16
-    q16 = (pcre_uint16 *) dbuffer;
-#endif
-#ifdef SUPPORT_PCRE32
-    q32 = (pcre_uint32 *) dbuffer;
-#endif
-
-    while ((c = *p++) != 0)
-      {
-      int i = 0;
-      int n = 0;
-
-      /* In UTF mode, input can be UTF-8, so just copy all non-backslash bytes.
-      In non-UTF mode, allow the value of the byte to fall through to later,
-      where values greater than 127 are turned into UTF-8 when running in
-      16-bit or 32-bit mode. */
-
-      if (c != '\\')
-        {
-#ifndef NOUTF
-        if (use_utf && HASUTF8EXTRALEN(c)) { GETUTF8INC(c, p); }
-#endif
-        }
-
-      /* Handle backslash escapes */
-
-      else switch ((c = *p++))
-        {
-        case 'a': c =  CHAR_BEL; break;
-        case 'b': c = '\b'; break;
-        case 'e': c =  CHAR_ESC; break;
-        case 'f': c = '\f'; break;
-        case 'n': c = '\n'; break;
-        case 'r': c = '\r'; break;
-        case 't': c = '\t'; break;
-        case 'v': c = '\v'; break;
-
-        case '0': case '1': case '2': case '3':
-        case '4': case '5': case '6': case '7':
-        c -= '0';
-        while (i++ < 2 && isdigit(*p) && *p != '8' && *p != '9')
-          c = c * 8 + *p++ - '0';
-        break;
-
-        case 'o':
-        if (*p == '{')
-          {
-          pcre_uint8 *pt = p;
-          c = 0;
-          for (pt++; isdigit(*pt) && *pt != '8' && *pt != '9'; pt++)
-            {
-            if (++i == 12)
-              fprintf(outfile, "** Too many octal digits in \\o{...} item; "
-                               "using only the first twelve.\n");
-            else c = c * 8 + *pt - '0';
-            }
-          if (*pt == '}') p = pt + 1;
-            else fprintf(outfile, "** Missing } after \\o{ (assumed)\n");
-          }
-        break;
-
-        case 'x':
-        if (*p == '{')
-          {
-          pcre_uint8 *pt = p;
-          c = 0;
-
-          /* We used to have "while (isxdigit(*(++pt)))" here, but it fails
-          when isxdigit() is a macro that refers to its argument more than
-          once. This is banned by the C Standard, but apparently happens in at
-          least one MacOS environment. */
-
-          for (pt++; isxdigit(*pt); pt++)
-            {
-            if (++i == 9)
-              fprintf(outfile, "** Too many hex digits in \\x{...} item; "
-                               "using only the first eight.\n");
-            else c = c * 16 + tolower(*pt) - ((isdigit(*pt))? '0' : 'a' - 10);
-            }
-          if (*pt == '}')
-            {
-            p = pt + 1;
-            break;
-            }
-          /* Not correct form for \x{...}; fall through */
-          }
-
-        /* \x without {} always defines just one byte in 8-bit mode. This
-        allows UTF-8 characters to be constructed byte by byte, and also allows
-        invalid UTF-8 sequences to be made. Just copy the byte in UTF mode.
-        Otherwise, pass it down to later code so that it can be turned into
-        UTF-8 when running in 16/32-bit mode. */
-
-        c = 0;
-        while (i++ < 2 && isxdigit(*p))
-          {
-          c = c * 16 + tolower(*p) - ((isdigit(*p))? '0' : 'a' - 10);
-          p++;
-          }
-#if !defined NOUTF && defined SUPPORT_PCRE8
-        if (use_utf && (pcre_mode == PCRE8_MODE))
-          {
-          *q8++ = c;
-          continue;
-          }
-#endif
-        break;
-
-        case 0:   /* \ followed by EOF allows for an empty line */
-        p--;
-        continue;
-
-        case '>':
-        if (*p == '-')
-          {
-          start_offset_sign = -1;
-          p++;
-          }
-        while(isdigit(*p)) start_offset = start_offset * 10 + *p++ - '0';
-        start_offset *= start_offset_sign;
-        continue;
-
-        case 'A':  /* Option setting */
-        options |= PCRE_ANCHORED;
-        continue;
-
-        case 'B':
-        options |= PCRE_NOTBOL;
-        continue;
-
-        case 'C':
-        if (isdigit(*p))    /* Set copy string */
-          {
-          while(isdigit(*p)) n = n * 10 + *p++ - '0';
-          copystrings |= 1 << n;
-          }
-        else if (isalnum(*p))
-          {
-          READ_CAPTURE_NAME(p, &cn8ptr, &cn16ptr, &cn32ptr, re);
-          }
-        else if (*p == '+')
-          {
-          callout_extra = 1;
-          p++;
-          }
-        else if (*p == '-')
-          {
-          SET_PCRE_CALLOUT(NULL);
-          p++;
-          }
-        else if (*p == '!')
-          {
-          callout_fail_id = 0;
-          p++;
-          while(isdigit(*p))
-            callout_fail_id = callout_fail_id * 10 + *p++ - '0';
-          callout_fail_count = 0;
-          if (*p == '!')
-            {
-            p++;
-            while(isdigit(*p))
-              callout_fail_count = callout_fail_count * 10 + *p++ - '0';
-            }
-          }
-        else if (*p == '*')
-          {
-          int sign = 1;
-          callout_data = 0;
-          if (*(++p) == '-') { sign = -1; p++; }
-          while(isdigit(*p))
-            callout_data = callout_data * 10 + *p++ - '0';
-          callout_data *= sign;
-          callout_data_set = 1;
-          }
-        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;
-#endif
-
-#if !defined NODFA
-        case 'F':
-        options |= PCRE_DFA_SHORTEST;
-        continue;
-#endif
-
-        case 'G':
-        if (isdigit(*p))
-          {
-          while(isdigit(*p)) n = n * 10 + *p++ - '0';
-          getstrings |= 1 << n;
-          }
-        else if (isalnum(*p))
-          {
-          READ_CAPTURE_NAME(p, &gn8ptr, &gn16ptr, &gn32ptr, re);
-          }
-        continue;
-
-        case 'J':
-        while(isdigit(*p)) n = n * 10 + *p++ - '0';
-        if (extra != NULL
-            && (extra->flags & PCRE_EXTRA_EXECUTABLE_JIT) != 0
-            && extra->executable_jit != NULL)
-          {
-          if (jit_stack != NULL) { PCRE_JIT_STACK_FREE(jit_stack); }
-          jit_stack = PCRE_JIT_STACK_ALLOC(1, n * 1024);
-          PCRE_ASSIGN_JIT_STACK(extra, jit_callback, jit_stack);
-          }
-        continue;
-
-        case 'L':
-        getlist = 1;
-        continue;
-
-        case 'M':
-        find_match_limit = 1;
-        continue;
-
-        case 'N':
-        if ((options & PCRE_NOTEMPTY) != 0)
-          options = (options & ~PCRE_NOTEMPTY) | PCRE_NOTEMPTY_ATSTART;
-        else
-          options |= PCRE_NOTEMPTY;
-        continue;
-
-        case 'O':
-        while(isdigit(*p)) n = n * 10 + *p++ - '0';
-        if (n > size_offsets_max)
-          {
-          size_offsets_max = n;
-          free(offsets);
-          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",
-              (int)(size_offsets_max * sizeof(int)));
-            yield = 1;
-            goto EXIT;
-            }
-          }
-        use_size_offsets = n;
-        if (n == 0) use_offsets = NULL;   /* Ensures it can't write to it */
-          else use_offsets = offsets + size_offsets_max - n;  /* To catch overruns */
-        continue;
-
-        case 'P':
-        options |= ((options & PCRE_PARTIAL_SOFT) == 0)?
-          PCRE_PARTIAL_SOFT : PCRE_PARTIAL_HARD;
-        continue;
-
-        case 'Q':
-        while(isdigit(*p)) n = n * 10 + *p++ - '0';
-        if (extra == NULL)
-          {
-          extra = (pcre_extra *)malloc(sizeof(pcre_extra));
-          extra->flags = 0;
-          }
-        extra->flags |= PCRE_EXTRA_MATCH_LIMIT_RECURSION;
-        extra->match_limit_recursion = n;
-        continue;
-
-        case 'q':
-        while(isdigit(*p)) n = n * 10 + *p++ - '0';
-        if (extra == NULL)
-          {
-          extra = (pcre_extra *)malloc(sizeof(pcre_extra));
-          extra->flags = 0;
-          }
-        extra->flags |= PCRE_EXTRA_MATCH_LIMIT;
-        extra->match_limit = n;
-        continue;
-
-#if !defined NODFA
-        case 'R':
-        options |= PCRE_DFA_RESTART;
-        continue;
-#endif
-
-        case 'S':
-        show_malloc = 1;
-        continue;
-
-        case 'Y':
-        options |= PCRE_NO_START_OPTIMIZE;
-        continue;
-
-        case 'Z':
-        options |= PCRE_NOTEOL;
-        continue;
-
-        case '?':
-        options |= PCRE_NO_UTF8_CHECK;
-        continue;
-
-        case '<':
-          {
-          int x = check_mc_option(p, outfile, TRUE, "escape sequence");
-          if (x == 0) goto NEXT_DATA;
-          options |= x;
-          while (*p++ != '>');
-          }
-        continue;
-        }
-
-      /* We now have a character value in c that may be greater than 255.
-      In 8-bit mode we convert to UTF-8 if we are in UTF mode. Values greater
-      than 127 in UTF mode must have come from \x{...} or octal constructs
-      because values from \x.. get this far only in non-UTF mode. */
-
-#ifdef SUPPORT_PCRE8
-      if (pcre_mode == PCRE8_MODE)
-        {
-#ifndef NOUTF
-        if (use_utf)
-          {
-          if (c > 0x7fffffff)
-            {
-            fprintf(outfile, "** Character \\x{%x} is greater than 0x7fffffff "
-              "and so cannot be converted to UTF-8\n", c);
-            goto NEXT_DATA;
-            }
-          q8 += ord2utf8(c, q8);
-          }
-        else
-#endif
-          {
-          if (c > 0xffu)
-            {
-            fprintf(outfile, "** Character \\x{%x} is greater than 255 "
-              "and UTF-8 mode is not enabled.\n", c);
-            fprintf(outfile, "** Truncation will probably give the wrong "
-              "result.\n");
-            }
-          *q8++ = c;
-          }
-        }
-#endif
-#ifdef SUPPORT_PCRE16
-      if (pcre_mode == PCRE16_MODE)
-        {
-#ifndef NOUTF
-        if (use_utf)
-          {
-          if (c > 0x10ffffu)
-            {
-            fprintf(outfile, "** Failed: character \\x{%x} is greater than "
-              "0x10ffff and so cannot be converted to UTF-16\n", c);
-            goto NEXT_DATA;
-            }
-          else if (c >= 0x10000u)
-            {
-            c-= 0x10000u;
-            *q16++ = 0xD800 | (c >> 10);
-            *q16++ = 0xDC00 | (c & 0x3ff);
-            }
-          else
-            *q16++ = c;
-          }
-        else
-#endif
-          {
-          if (c > 0xffffu)
-            {
-            fprintf(outfile, "** Character \\x{%x} is greater than 0xffff "
-              "and UTF-16 mode is not enabled.\n", c);
-            fprintf(outfile, "** Truncation will probably give the wrong "
-              "result.\n");
-            }
-
-          *q16++ = c;
-          }
-        }
-#endif
-#ifdef SUPPORT_PCRE32
-      if (pcre_mode == PCRE32_MODE)
-        {
-        *q32++ = c;
-        }
-#endif
-
-      }
-
-    /* Reached end of subject string */
-
-#ifdef SUPPORT_PCRE8
-    if (pcre_mode == PCRE8_MODE)
-    {
-      *q8 = 0;
-      len = (int)(q8 - (pcre_uint8 *)dbuffer);
-    }
-#endif
-#ifdef SUPPORT_PCRE16
-    if (pcre_mode == PCRE16_MODE)
-    {
-      *q16 = 0;
-      len = (int)(q16 - (pcre_uint16 *)dbuffer);
-    }
-#endif
-#ifdef SUPPORT_PCRE32
-    if (pcre_mode == PCRE32_MODE)
-    {
-      *q32 = 0;
-      len = (int)(q32 - (pcre_uint32 *)dbuffer);
-    }
-#endif
-
-    /* If we're compiling with explicit valgrind support, Mark the data from after
-    its end to the end of the buffer as unaddressable, so that a read over the end
-    of the buffer will be seen by valgrind, even if it doesn't cause a crash.
-    If we're not building with valgrind support, at least move the data to the end
-    of the buffer so that it might at least cause a crash.
-    If we are using the POSIX interface, we must include the terminating zero. */
-
-    bptr = dbuffer;
-
-#if !defined NOPOSIX
-    if (posix || do_posix)
-      {
-#ifdef SUPPORT_VALGRIND
-      VALGRIND_MAKE_MEM_NOACCESS(dbuffer + len + 1, dbuffer_size - (len + 1));
-#else
-      memmove(bptr + dbuffer_size - len - 1, bptr, len + 1);
-      bptr += dbuffer_size - len - 1;
-#endif
-      }
-    else
-#endif
-      {
-#ifdef SUPPORT_VALGRIND
-      VALGRIND_MAKE_MEM_NOACCESS(dbuffer + len * CHAR_SIZE, (dbuffer_size - len) * CHAR_SIZE);
-#else
-      bptr = memmove(bptr + (dbuffer_size - len) * CHAR_SIZE, bptr, len * CHAR_SIZE);
-#endif
-      }
-
-    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. */
-
-#if !defined NOPOSIX
-    if (posix || do_posix)
-      {
-      int rc;
-      int eflags = 0;
-      regmatch_t *pmatch = NULL;
-      if (use_size_offsets > 0)
-        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;
-      if ((options & PCRE_NOTEMPTY) != 0) eflags |= REG_NOTEMPTY;
-
-      rc = regexec(&preg, (const char *)bptr, use_size_offsets, pmatch, eflags);
-
-      if (rc != 0)
-        {
-        (void)regerror(rc, &preg, (char *)buffer, buffer_size);
-        fprintf(outfile, "No match: POSIX code %d: %s\n", rc, buffer);
-        }
-      else if ((REAL_PCRE_OPTIONS(preg.re_pcre) & PCRE_NO_AUTO_CAPTURE) != 0)
-        {
-        fprintf(outfile, "Matched with REG_NOSUB\n");
-        }
-      else
-        {
-        size_t i;
-        for (i = 0; i < (size_t)use_size_offsets; i++)
-          {
-          if (pmatch[i].rm_so >= 0)
-            {
-            fprintf(outfile, "%2d: ", (int)i);
-            PCHARSV(dbuffer, pmatch[i].rm_so,
-              pmatch[i].rm_eo - pmatch[i].rm_so, outfile);
-            fprintf(outfile, "\n");
-            if (do_showcaprest || (i == 0 && do_showrest))
-              {
-              fprintf(outfile, "%2d+ ", (int)i);
-              PCHARSV(dbuffer, pmatch[i].rm_eo, len - pmatch[i].rm_eo,
-                outfile);
-              fprintf(outfile, "\n");
-              }
-            }
-          }
-        }
-      free(pmatch);
-      goto NEXT_DATA;
-      }
-
-#endif  /* !defined NOPOSIX */
-
-    /* Handle matching via the native interface - repeats for /g and /G */
-
-    /* Ensure that there is a JIT callback if we want to verify that JIT was
-    actually used. If jit_stack == NULL, no stack has yet been assigned. */
-
-    if (verify_jit && jit_stack == NULL && extra != NULL)
-       { PCRE_ASSIGN_JIT_STACK(extra, jit_callback, jit_stack); }
-
-    for (;; gmatched++)    /* Loop for /g or /G */
-      {
-      markptr = NULL;
-      jit_was_used = FALSE;
-
-      if (timeitm > 0)
-        {
-        register int i;
-        clock_t time_taken;
-        clock_t start_time = clock();
-
-#if !defined NODFA
-        if (all_use_dfa || use_dfa)
-          {
-          if ((options & PCRE_DFA_RESTART) != 0)
-            {
-            fprintf(outfile, "Timing DFA restarts is not supported\n");
-            break;
-            }
-          if (dfa_workspace == NULL)
-            dfa_workspace = (int *)malloc(DFA_WS_DIMENSION*sizeof(int));
-          for (i = 0; i < timeitm; i++)
-            {
-            PCRE_DFA_EXEC(count, re, extra, bptr, len, start_offset,
-              (options | g_notempty), use_offsets, use_size_offsets,
-              dfa_workspace, DFA_WS_DIMENSION);
-            }
-          }
-        else
-#endif
-
-        for (i = 0; i < timeitm; i++)
-          {
-          PCRE_EXEC(count, re, extra, bptr, len, start_offset,
-            (options | g_notempty), use_offsets, use_size_offsets);
-          }
-        total_match_time += (time_taken = clock() - start_time);
-        fprintf(outfile, "Execute time %.4f milliseconds\n",
-          (((double)time_taken * 1000.0) / (double)timeitm) /
-            (double)CLOCKS_PER_SEC);
-        }
-
-      /* If find_match_limit is set, we want to do repeated matches with
-      varying limits in order to find the minimum value for the match limit and
-      for the recursion limit. The match limits are relevant only to the normal
-      running of pcre_exec(), so disable the JIT optimization. This makes it
-      possible to run the same set of tests with and without JIT externally
-      requested. */
-
-      if (find_match_limit)
-        {
-        if (extra != NULL) { PCRE_FREE_STUDY(extra); }
-        extra = (pcre_extra *)malloc(sizeof(pcre_extra));
-        extra->flags = 0;
-
-        (void)check_match_limit(re, extra, bptr, len, start_offset,
-          options|g_notempty, use_offsets, use_size_offsets,
-          PCRE_EXTRA_MATCH_LIMIT, &(extra->match_limit),
-          PCRE_ERROR_MATCHLIMIT, "match()");
-
-        count = check_match_limit(re, extra, bptr, len, start_offset,
-          options|g_notempty, use_offsets, use_size_offsets,
-          PCRE_EXTRA_MATCH_LIMIT_RECURSION, &(extra->match_limit_recursion),
-          PCRE_ERROR_RECURSIONLIMIT, "match() recursion");
-        }
-
-      /* If callout_data is set, use the interface with additional data */
-
-      else if (callout_data_set)
-        {
-        if (extra == NULL)
-          {
-          extra = (pcre_extra *)malloc(sizeof(pcre_extra));
-          extra->flags = 0;
-          }
-        extra->flags |= PCRE_EXTRA_CALLOUT_DATA;
-        extra->callout_data = &callout_data;
-        PCRE_EXEC(count, re, extra, bptr, len, start_offset,
-          options | g_notempty, use_offsets, use_size_offsets);
-        extra->flags &= ~PCRE_EXTRA_CALLOUT_DATA;
-        }
-
-      /* The normal case is just to do the match once, with the default
-      value of match_limit. */
-
-#if !defined NODFA
-      else if (all_use_dfa || use_dfa)
-        {
-        if (dfa_workspace == NULL)
-          dfa_workspace = (int *)malloc(DFA_WS_DIMENSION*sizeof(int));
-        if (dfa_matched++ == 0)
-          dfa_workspace[0] = -1;  /* To catch bad restart */
-        PCRE_DFA_EXEC(count, re, extra, bptr, len, start_offset,
-          (options | g_notempty), use_offsets, use_size_offsets, dfa_workspace,
-          DFA_WS_DIMENSION);
-        if (count == 0)
-          {
-          fprintf(outfile, "Matched, but offsets vector is too small to show all matches\n");
-          count = use_size_offsets/2;
-          }
-        }
-#endif
-
-      else
-        {
-        PCRE_EXEC(count, re, extra, bptr, len, start_offset,
-          options | g_notempty, use_offsets, use_size_offsets);
-        if (count == 0)
-          {
-          fprintf(outfile, "Matched, but too many substrings\n");
-          /* 2 is a special case; match can be returned */
-          count = (use_size_offsets == 2)? 1 : use_size_offsets/3;
-          }
-        }
-
-      /* Matched */
-
-      if (count >= 0)
-        {
-        int i, maxcount;
-        void *cnptr, *gnptr;
-
-#if !defined NODFA
-        if (all_use_dfa || use_dfa) maxcount = use_size_offsets/2; else
-#endif
-          /* 2 is a special case; match can be returned */
-          maxcount = (use_size_offsets == 2)? 1 : use_size_offsets/3;
-
-        /* This is a check against a lunatic return value. */
-
-        if (count > maxcount)
-          {
-          fprintf(outfile,
-            "** PCRE error: returned count %d is too big for offset size %d\n",
-            count, use_size_offsets);
-          count = use_size_offsets/3;
-          if (do_g || do_G)
-            {
-            fprintf(outfile, "** /%c loop abandoned\n", do_g? 'g' : 'G');
-            do_g = do_G = FALSE;        /* Break g/G loop */
-            }
-          }
-
-        /* do_allcaps requests showing of all captures in the pattern, to check
-        unset ones at the end. */
-
-        if (do_allcaps)
-          {
-          if (new_info(re, NULL, PCRE_INFO_CAPTURECOUNT, &count) < 0)
-            goto SKIP_DATA;
-          count++;   /* Allow for full match */
-          if (count * 2 > use_size_offsets) count = use_size_offsets/2;
-          }
-
-        /* Output the captured substrings. Note that, for the matched string,
-        the use of \K in an assertion can make the start later than the end. */
-
-        for (i = 0; i < count * 2; i += 2)
-          {
-          if (use_offsets[i] < 0)
-            {
-            if (use_offsets[i] != -1)
-              fprintf(outfile, "ERROR: bad negative value %d for offset %d\n",
-                use_offsets[i], i);
-            if (use_offsets[i+1] != -1)
-              fprintf(outfile, "ERROR: bad negative value %d for offset %d\n",
-                use_offsets[i+1], i+1);
-            fprintf(outfile, "%2d: <unset>\n", i/2);
-            }
-          else
-            {
-            int start = use_offsets[i];
-            int end = use_offsets[i+1];
-
-            if (start > end)
-              {
-              start = use_offsets[i+1];
-              end = use_offsets[i];
-              fprintf(outfile, "Start of matched string is beyond its end - "
-                "displaying from end to start.\n");
-              }
-
-            fprintf(outfile, "%2d: ", i/2);
-            PCHARSV(bptr, start, end - start, outfile);
-            if (verify_jit && jit_was_used) fprintf(outfile, " (JIT)");
-            fprintf(outfile, "\n");
-
-            /* Note: don't use the start/end variables here because we want to
-            show the text from what is reported as the end. */
-
-            if (do_showcaprest || (i == 0 && do_showrest))
-              {
-              fprintf(outfile, "%2d+ ", i/2);
-              PCHARSV(bptr, use_offsets[i+1], len - use_offsets[i+1],
-                outfile);
-              fprintf(outfile, "\n");
-              }
-            }
-          }
-
-        if (markptr != NULL)
-          {
-          fprintf(outfile, "MK: ");
-          PCHARSV(markptr, 0, -1, outfile);
-          fprintf(outfile, "\n");
-          }
-
-        for (i = 0; i < 32; i++)
-          {
-          if ((copystrings & (1 << i)) != 0)
-            {
-            int rc;
-            char copybuffer[256];
-            PCRE_COPY_SUBSTRING(rc, bptr, use_offsets, count, i,
-              copybuffer, sizeof(copybuffer));
-            if (rc < 0)
-              fprintf(outfile, "copy substring %d failed %d\n", i, rc);
-            else
-              {
-              fprintf(outfile, "%2dC ", i);
-              PCHARSV(copybuffer, 0, rc, outfile);
-              fprintf(outfile, " (%d)\n", rc);
-              }
-            }
-          }
-
-        cnptr = copynames;
-        for (;;)
-          {
-          int rc;
-          char copybuffer[256];
-
-#ifdef SUPPORT_PCRE32
-          if (pcre_mode == PCRE32_MODE)
-            {
-            if (*(pcre_uint32 *)cnptr == 0) break;
-            }
-#endif
-#ifdef SUPPORT_PCRE16
-          if (pcre_mode == PCRE16_MODE)
-            {
-            if (*(pcre_uint16 *)cnptr == 0) break;
-            }
-#endif
-#ifdef SUPPORT_PCRE8
-          if (pcre_mode == PCRE8_MODE)
-            {
-            if (*(pcre_uint8 *)cnptr == 0) break;
-            }
-#endif
-
-          PCRE_COPY_NAMED_SUBSTRING(rc, re, bptr, use_offsets, count,
-            cnptr, copybuffer, sizeof(copybuffer));
-
-          if (rc < 0)
-            {
-            fprintf(outfile, "copy substring ");
-            PCHARSV(cnptr, 0, -1, outfile);
-            fprintf(outfile, " failed %d\n", rc);
-            }
-          else
-            {
-            fprintf(outfile, "  C ");
-            PCHARSV(copybuffer, 0, rc, outfile);
-            fprintf(outfile, " (%d) ", rc);
-            PCHARSV(cnptr, 0, -1, outfile);
-            putc('\n', outfile);
-            }
-
-          cnptr = (char *)cnptr + (STRLEN(cnptr) + 1) * CHAR_SIZE;
-          }
-
-        for (i = 0; i < 32; i++)
-          {
-          if ((getstrings & (1 << i)) != 0)
-            {
-            int rc;
-            const char *substring;
-            PCRE_GET_SUBSTRING(rc, bptr, use_offsets, count, i, &substring);
-            if (rc < 0)
-              fprintf(outfile, "get substring %d failed %d\n", i, rc);
-            else
-              {
-              fprintf(outfile, "%2dG ", i);
-              PCHARSV(substring, 0, rc, outfile);
-              fprintf(outfile, " (%d)\n", rc);
-              PCRE_FREE_SUBSTRING(substring);
-              }
-            }
-          }
-
-        gnptr = getnames;
-        for (;;)
-          {
-          int rc;
-          const char *substring;
-
-#ifdef SUPPORT_PCRE32
-          if (pcre_mode == PCRE32_MODE)
-            {
-            if (*(pcre_uint32 *)gnptr == 0) break;
-            }
-#endif
-#ifdef SUPPORT_PCRE16
-          if (pcre_mode == PCRE16_MODE)
-            {
-            if (*(pcre_uint16 *)gnptr == 0) break;
-            }
-#endif
-#ifdef SUPPORT_PCRE8
-          if (pcre_mode == PCRE8_MODE)
-            {
-            if (*(pcre_uint8 *)gnptr == 0) break;
-            }
-#endif
-
-          PCRE_GET_NAMED_SUBSTRING(rc, re, bptr, use_offsets, count,
-            gnptr, &substring);
-          if (rc < 0)
-            {
-            fprintf(outfile, "get substring ");
-            PCHARSV(gnptr, 0, -1, outfile);
-            fprintf(outfile, " failed %d\n", rc);
-            }
-          else
-            {
-            fprintf(outfile, "  G ");
-            PCHARSV(substring, 0, rc, outfile);
-            fprintf(outfile, " (%d) ", rc);
-            PCHARSV(gnptr, 0, -1, outfile);
-            PCRE_FREE_SUBSTRING(substring);
-            putc('\n', outfile);
-            }
-
-          gnptr = (char *)gnptr + (STRLEN(gnptr) + 1) * CHAR_SIZE;
-          }
-
-        if (getlist)
-          {
-          int rc;
-          const char **stringlist;
-          PCRE_GET_SUBSTRING_LIST(rc, bptr, use_offsets, count, &stringlist);
-          if (rc < 0)
-            fprintf(outfile, "get substring list failed %d\n", rc);
-          else
-            {
-            for (i = 0; i < count; i++)
-              {
-              fprintf(outfile, "%2dL ", i);
-              PCHARSV(stringlist[i], 0, -1, outfile);
-              putc('\n', outfile);
-              }
-            if (stringlist[i] != NULL)
-              fprintf(outfile, "string list not terminated by NULL\n");
-            PCRE_FREE_SUBSTRING_LIST(stringlist);
-            }
-          }
-        }
-
-      /* There was a partial match. If the bumpalong point is not the same as
-      the first inspected character, show the offset explicitly. */
-
-      else if (count == PCRE_ERROR_PARTIAL)
-        {
-        fprintf(outfile, "Partial match");
-        if (use_size_offsets > 2 && use_offsets[0] != use_offsets[2])
-          fprintf(outfile, " at offset %d", use_offsets[2]);
-        if (markptr != NULL)
-          {
-          fprintf(outfile, ", mark=");
-          PCHARSV(markptr, 0, -1, outfile);
-          }
-        if (use_size_offsets > 1)
-          {
-          fprintf(outfile, ": ");
-          PCHARSV(bptr, use_offsets[0], use_offsets[1] - use_offsets[0],
-            outfile);
-          }
-        if (verify_jit && jit_was_used) fprintf(outfile, " (JIT)");
-        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. We won't be at the end of the
-      string - that was checked before setting g_notempty.
-
-      Complication arises in the case when the newline convention is "any",
-      "crlf", or "anycrlf". If the previous match was at the end of a line
-      terminated by CRLF, an advance of one character just passes the \r,
-      whereas we should prefer the longer newline sequence, as does the code in
-      pcre_exec(). Fudge the offset value to achieve this. We check for a
-      newline setting in the pattern; if none was set, use PCRE_CONFIG() to
-      find the default.
-
-      Otherwise, in the case of UTF-8 matching, the advance must be one
-      character, not one byte. */
-
-      else
-        {
-        if (g_notempty != 0)
-          {
-          int onechar = 1;
-          unsigned int obits = REAL_PCRE_OPTIONS(re);
-          use_offsets[0] = start_offset;
-          if ((obits & PCRE_NEWLINE_BITS) == 0)
-            {
-            int d;
-            (void)PCRE_CONFIG(PCRE_CONFIG_NEWLINE, &d);
-            /* Note that these values are always the ASCII ones, even in
-            EBCDIC environments. CR = 13, NL = 10. */
-            obits = (d == 13)? PCRE_NEWLINE_CR :
-                    (d == 10)? PCRE_NEWLINE_LF :
-                    (d == (13<<8 | 10))? PCRE_NEWLINE_CRLF :
-                    (d == -2)? PCRE_NEWLINE_ANYCRLF :
-                    (d == -1)? PCRE_NEWLINE_ANY : 0;
-            }
-          if (((obits & PCRE_NEWLINE_BITS) == PCRE_NEWLINE_ANY ||
-               (obits & PCRE_NEWLINE_BITS) == PCRE_NEWLINE_CRLF ||
-               (obits & PCRE_NEWLINE_BITS) == PCRE_NEWLINE_ANYCRLF)
-              &&
-              start_offset < len - 1 && (
-#ifdef SUPPORT_PCRE8
-              (pcre_mode == PCRE8_MODE &&
-               bptr[start_offset] == '\r' &&
-               bptr[start_offset + 1] == '\n') ||
-#endif
-#ifdef SUPPORT_PCRE16
-              (pcre_mode == PCRE16_MODE &&
-               ((PCRE_SPTR16)bptr)[start_offset] == '\r' &&
-               ((PCRE_SPTR16)bptr)[start_offset + 1] == '\n') ||
-#endif
-#ifdef SUPPORT_PCRE32
-              (pcre_mode == PCRE32_MODE &&
-               ((PCRE_SPTR32)bptr)[start_offset] == '\r' &&
-               ((PCRE_SPTR32)bptr)[start_offset + 1] == '\n') ||
-#endif
-              0))
-            onechar++;
-          else if (use_utf)
-            {
-            while (start_offset + onechar < len)
-              {
-              if ((bptr[start_offset+onechar] & 0xc0) != 0x80) break;
-              onechar++;
-              }
-            }
-          use_offsets[1] = start_offset + onechar;
-          }
-        else
-          {
-          switch(count)
-            {
-            case PCRE_ERROR_NOMATCH:
-            if (gmatched == 0)
-              {
-              if (markptr == NULL)
-                {
-                fprintf(outfile, "No match");
-                }
-              else
-                {
-                fprintf(outfile, "No match, mark = ");
-                PCHARSV(markptr, 0, -1, outfile);
-                }
-              if (verify_jit && jit_was_used) fprintf(outfile, " (JIT)");
-              putc('\n', outfile);
-              }
-            break;
-
-            case PCRE_ERROR_BADUTF8:
-            case PCRE_ERROR_SHORTUTF8:
-            fprintf(outfile, "Error %d (%s UTF-%d string)", count,
-              (count == PCRE_ERROR_BADUTF8)? "bad" : "short",
-              8 * CHAR_SIZE);
-            if (use_size_offsets >= 2)
-              fprintf(outfile, " offset=%d reason=%d", use_offsets[0],
-                use_offsets[1]);
-            fprintf(outfile, "\n");
-            break;
-
-            case PCRE_ERROR_BADUTF8_OFFSET:
-            fprintf(outfile, "Error %d (bad UTF-%d offset)\n", count,
-              8 * CHAR_SIZE);
-            break;
-
-            default:
-            if (count < 0 &&
-                (-count) < (int)(sizeof(errtexts)/sizeof(const char *)))
-              fprintf(outfile, "Error %d (%s)\n", count, errtexts[-count]);
-            else
-              fprintf(outfile, "Error %d (Unexpected value)\n", count);
-            break;
-            }
-
-          break;  /* Out of the /g loop */
-          }
-        }
-
-      /* If not /g or /G we are done */
-
-      if (!do_g && !do_G) break;
-
-      if (use_offsets == NULL)
-        {
-        fprintf(outfile, "Cannot do global matching without an ovector\n");
-        break;
-        }
-
-      /* If we have matched an empty string, first check to see if we are at
-      the end of the subject. If so, the /g loop is over. Otherwise, mimic what
-      Perl's /g options does. This turns out to be rather cunning. First we set
-      PCRE_NOTEMPTY_ATSTART and PCRE_ANCHORED and try the match again at the
-      same point. If this fails (picked up above) we advance to the next
-      character. */
-
-      g_notempty = 0;
-
-      if (use_offsets[0] == use_offsets[1])
-        {
-        if (use_offsets[0] == len) break;
-        g_notempty = PCRE_NOTEMPTY_ATSTART | PCRE_ANCHORED;
-        }
-
-      /* For /g, update the start offset, leaving the rest alone. There is a
-      tricky case when \K is used in a positive lookbehind assertion. This can
-      cause the end of the match to be less than or equal to the start offset.
-      In this case we restart at one past the start offset. This may return the
-      same match if the original start offset was bumped along during the
-      match, but eventually the new start offset will hit the actual start
-      offset. (In PCRE2 the true start offset is available, and this can be
-      done better. It is not worth doing more than making sure we do not loop
-      at this stage in the life of PCRE1.) */
-
-      if (do_g)
-        {
-        if (g_notempty == 0 && use_offsets[1] <= start_offset)
-          {
-          if (start_offset >= len) break;  /* End of subject */
-          start_offset++;
-          if (use_utf)
-            {
-            while (start_offset < len)
-              {
-              if ((bptr[start_offset] & 0xc0) != 0x80) break;
-              start_offset++;
-              }
-            }
-          }
-        else start_offset = use_offsets[1];
-        }
-
-      /* For /G, update the pointer and length */
-
-      else
-        {
-        bptr += use_offsets[1] * CHAR_SIZE;
-        len -= use_offsets[1];
-        }
-      }  /* End of loop for /g and /G */
-
-    NEXT_DATA: continue;
-    }    /* End of loop for data lines */
-
-  CONTINUE:
-
-#if !defined NOPOSIX
-  if ((posix || do_posix) && preg.re_pcre != 0) regfree(&preg);
-#endif
-
-  if (re != NULL) new_free(re);
-  if (extra != NULL)
-    {
-    PCRE_FREE_STUDY(extra);
-    }
-  if (locale_set)
-    {
-    new_free((void *)tables);
-    setlocale(LC_CTYPE, "C");
-    locale_set = 0;
-    }
-  if (jit_stack != NULL)
-    {
-    PCRE_JIT_STACK_FREE(jit_stack);
-    jit_stack = NULL;
-    }
-  }
-
-if (infile == stdin) fprintf(outfile, "\n");
-
-if (showtotaltimes)
-  {
-  fprintf(outfile, "--------------------------------------\n");
-  if (timeit > 0)
-    {
-    fprintf(outfile, "Total compile time %.4f milliseconds\n",
-      (((double)total_compile_time * 1000.0) / (double)timeit) /
-        (double)CLOCKS_PER_SEC);
-    fprintf(outfile, "Total study time   %.4f milliseconds\n",
-      (((double)total_study_time * 1000.0) / (double)timeit) /
-        (double)CLOCKS_PER_SEC);
-    }
-  fprintf(outfile, "Total execute time %.4f milliseconds\n",
-    (((double)total_match_time * 1000.0) / (double)timeitm) /
-      (double)CLOCKS_PER_SEC);
-  }
-
-EXIT:
-
-if (infile != NULL && infile != stdin) fclose(infile);
-if (outfile != NULL && outfile != stdout) fclose(outfile);
-
-free(buffer);
-free(dbuffer);
-free(pbuffer);
-free(offsets);
-
-#ifdef SUPPORT_PCRE16
-if (buffer16 != NULL) free(buffer16);
-#endif
-#ifdef SUPPORT_PCRE32
-if (buffer32 != NULL) free(buffer32);
-#endif
-
-#if !defined NODFA
-if (dfa_workspace != NULL)
-  free(dfa_workspace);
-#endif
-
-#if defined(__VMS)
-  yield = SS$_NORMAL;  /* Return values via DCL symbols */
-#endif
-
-return yield;
-}
-
-/* End of pcretest.c */
diff --git a/dist/perltest.pl b/dist/perltest.pl
deleted file mode 100755
index 29b808b..0000000
--- a/dist/perltest.pl
+++ /dev/null
@@ -1,242 +0,0 @@
-#! /usr/bin/env perl
-
-# Program for testing regular expressions with perl to check that PCRE handles
-# them the same. This version needs to have "use utf8" at the start for running
-# the UTF-8 tests, but *not* for the other tests. The only way I've found for
-# doing this is to cat this line in explicitly in the RunPerlTest script. I've
-# also used this method to supply "require Encode" for the UTF-8 tests, so that
-# the main test will still run where Encode is not installed.
-
-#use utf8;
-#require Encode;
-
-# Function for turning a string into a string of printing chars.
-
-sub pchars {
-my($t) = "";
-
-if ($utf8)
-  {
-  @p = unpack('U*', $_[0]);
-  foreach $c (@p)
-    {
-    if ($c >= 32 && $c < 127) { $t .= chr $c; }
-      else { $t .= sprintf("\\x{%02x}", $c);
-      }
-    }
-  }
-else
-  {
-  foreach $c (split(//, $_[0]))
-    {
-    if (ord $c >= 32 && ord $c < 127) { $t .= $c; }
-      else { $t .= sprintf("\\x%02x", ord $c); }
-    }
-  }
-
-$t;
-}
-
-
-# Read lines from named file or stdin and write to named file or stdout; lines
-# consist of a regular expression, in delimiters and optionally followed by
-# options, followed by a set of test data, terminated by an empty line.
-
-# Sort out the input and output files
-
-if (@ARGV > 0)
-  {
-  open(INFILE, "<$ARGV[0]") || die "Failed to open $ARGV[0]\n";
-  $infile = "INFILE";
-  }
-else { $infile = "STDIN"; }
-
-if (@ARGV > 1)
-  {
-  open(OUTFILE, ">$ARGV[1]") || die "Failed to open $ARGV[1]\n";
-  $outfile = "OUTFILE";
-  }
-else { $outfile = "STDOUT"; }
-
-printf($outfile "Perl $] Regular Expressions\n\n");
-
-# Main loop
-
-NEXT_RE:
-for (;;)
-  {
-  printf "  re> " if $infile eq "STDIN";
-  last if ! ($_ = <$infile>);
-  printf $outfile "$_" if $infile ne "STDIN";
-  next if ($_ =~ /^\s*$/ || $_ =~ /^< forbid/);
-
-  $pattern = $_;
-
-  while ($pattern !~ /^\s*(.).*\1/s)
-    {
-    printf "    > " if $infile eq "STDIN";
-    last if ! ($_ = <$infile>);
-    printf $outfile "$_" if $infile ne "STDIN";
-    $pattern .= $_;
-    }
-
-  chomp($pattern);
-  $pattern =~ s/\s+$//;
-
-  # The private /+ modifier means "print $' afterwards".
-
-  $showrest = ($pattern =~ s/\+(?=[a-zA-Z]*$)//);
-
-  # A doubled version is used by pcretest to print remainders after captures
-
-  $pattern =~ s/\+(?=[a-zA-Z]*$)//;
-
-  # Remove /8 from a UTF-8 pattern.
-
-  $utf8 = $pattern =~ s/8(?=[a-zA-Z]*$)//;
-
-  # Remove /J from a pattern with duplicate names.
-
-  $pattern =~ s/J(?=[a-zA-Z]*$)//;
-
-  # Remove /K from a pattern (asks pcretest to check MARK data) */
-
-  $pattern =~ s/K(?=[a-zA-Z]*$)//;
-
-  # /W asks pcretest to set PCRE_UCP; change this to /u for Perl
-
-  $pattern =~ s/W(?=[a-zA-Z]*$)/u/;
-
-  # Remove /S or /SS from a pattern (asks pcretest to study or not to study)
-
-  $pattern =~ s/S(?=[a-zA-Z]*$)//g;
-
-  # Remove /Y and /O from a pattern (disable PCRE optimizations)
-
-  $pattern =~ s/[YO](?=[a-zA-Z]*$)//;
-
-  # Check that the pattern is valid
-
-  eval "\$_ =~ ${pattern}";
-  if ($@)
-    {
-    printf $outfile "Error: $@";
-    if ($infile != "STDIN")
-      {
-      for (;;)
-        {
-        last if ! ($_ = <$infile>);
-        last if $_ =~ /^\s*$/;
-        }
-      }
-    next NEXT_RE;
-    }
-
-  # If the /g modifier is present, we want to put a loop round the matching;
-  # otherwise just a single "if".
-
-  $cmd = ($pattern =~ /g[a-z]*$/)? "while" : "if";
-
-  # If the pattern is actually the null string, Perl uses the most recently
-  # executed (and successfully compiled) regex is used instead. This is a
-  # nasty trap for the unwary! The PCRE test suite does contain null strings
-  # in places - if they are allowed through here all sorts of weird and
-  # unexpected effects happen. To avoid this, we replace such patterns with
-  # a non-null pattern that has the same effect.
-
-  $pattern = "/(?#)/$2" if ($pattern =~ /^(.)\1(.*)$/);
-
-  # Read data lines and test them
-
-  for (;;)
-    {
-    printf "data> " if $infile eq "STDIN";
-    last NEXT_RE if ! ($_ = <$infile>);
-    chomp;
-    printf $outfile "$_\n" if $infile ne "STDIN";
-
-    s/\s+$//;  # Remove trailing space
-    s/^\s+//;  # Remove leading space
-    s/\\Y//g;  # Remove \Y (pcretest flag to set PCRE_NO_START_OPTIMIZE)
-
-    last if ($_ eq "");
-    $x = eval "\"$_\"";   # To get escapes processed
-
-    # Empty array for holding results, ensure $REGERROR and $REGMARK are
-    # unset, then do the matching.
-
-    @subs = ();
-
-    $pushes = "push \@subs,\$&;" .
-         "push \@subs,\$1;" .
-         "push \@subs,\$2;" .
-         "push \@subs,\$3;" .
-         "push \@subs,\$4;" .
-         "push \@subs,\$5;" .
-         "push \@subs,\$6;" .
-         "push \@subs,\$7;" .
-         "push \@subs,\$8;" .
-         "push \@subs,\$9;" .
-         "push \@subs,\$10;" .
-         "push \@subs,\$11;" .
-         "push \@subs,\$12;" .
-         "push \@subs,\$13;" .
-         "push \@subs,\$14;" .
-         "push \@subs,\$15;" .
-         "push \@subs,\$16;" .
-         "push \@subs,\$'; }";
-
-    undef $REGERROR;
-    undef $REGMARK;
-
-    eval "${cmd} (\$x =~ ${pattern}) {" . $pushes;
-
-    if ($@)
-      {
-      printf $outfile "Error: $@\n";
-      next NEXT_RE;
-      }
-    elsif (scalar(@subs) == 0)
-      {
-      printf $outfile "No match";
-      if (defined $REGERROR && $REGERROR != 1)
-        { printf $outfile (", mark = %s", &pchars($REGERROR)); }
-      printf $outfile "\n";
-      }
-    else
-      {
-      while (scalar(@subs) != 0)
-        {
-        printf $outfile (" 0: %s\n", &pchars($subs[0]));
-        printf $outfile (" 0+ %s\n", &pchars($subs[17])) if $showrest;
-        $last_printed = 0;
-        for ($i = 1; $i <= 16; $i++)
-          {
-          if (defined $subs[$i])
-            {
-            while ($last_printed++ < $i-1)
-              { printf $outfile ("%2d: <unset>\n", $last_printed); }
-            printf $outfile ("%2d: %s\n", $i, &pchars($subs[$i]));
-            $last_printed = $i;
-            }
-          }
-        splice(@subs, 0, 18);
-        }
-
-      # It seems that $REGMARK is not marked as UTF-8 even when use utf8 is
-      # set and the input pattern was a UTF-8 string. We can, however, force
-      # it to be so marked.
-
-      if (defined $REGMARK && $REGMARK != 1)
-        {
-        $xx = $REGMARK;
-        $xx = Encode::decode_utf8($xx) if $utf8;
-        printf $outfile ("MK: %s\n", &pchars($xx));
-        }
-      }
-    }
-  }
-
-# printf $outfile "\n";
-
-# End
diff --git a/dist/testdata/saved16 b/dist/testdata/saved16
deleted file mode 100644
index f86326c..0000000
--- a/dist/testdata/saved16
+++ /dev/null
Binary files differ
diff --git a/dist/testdata/saved16BE-1 b/dist/testdata/saved16BE-1
deleted file mode 100644
index 5d2bd1b..0000000
--- a/dist/testdata/saved16BE-1
+++ /dev/null
Binary files differ
diff --git a/dist/testdata/saved16BE-2 b/dist/testdata/saved16BE-2
deleted file mode 100644
index c91ce37..0000000
--- a/dist/testdata/saved16BE-2
+++ /dev/null
Binary files differ
diff --git a/dist/testdata/saved16LE-1 b/dist/testdata/saved16LE-1
deleted file mode 100644
index 822ccd7..0000000
--- a/dist/testdata/saved16LE-1
+++ /dev/null
Binary files differ
diff --git a/dist/testdata/saved16LE-2 b/dist/testdata/saved16LE-2
deleted file mode 100644
index 656c058..0000000
--- a/dist/testdata/saved16LE-2
+++ /dev/null
Binary files differ
diff --git a/dist/testdata/saved32 b/dist/testdata/saved32
deleted file mode 100644
index a4e2704..0000000
--- a/dist/testdata/saved32
+++ /dev/null
Binary files differ
diff --git a/dist/testdata/saved32BE-1 b/dist/testdata/saved32BE-1
deleted file mode 100644
index 609d97c..0000000
--- a/dist/testdata/saved32BE-1
+++ /dev/null
Binary files differ
diff --git a/dist/testdata/saved32BE-2 b/dist/testdata/saved32BE-2
deleted file mode 100644
index 79bb5e8..0000000
--- a/dist/testdata/saved32BE-2
+++ /dev/null
Binary files differ
diff --git a/dist/testdata/saved32LE-1 b/dist/testdata/saved32LE-1
deleted file mode 100644
index 901dfb6..0000000
--- a/dist/testdata/saved32LE-1
+++ /dev/null
Binary files differ
diff --git a/dist/testdata/saved32LE-2 b/dist/testdata/saved32LE-2
deleted file mode 100644
index 5f64af9..0000000
--- a/dist/testdata/saved32LE-2
+++ /dev/null
Binary files differ
diff --git a/dist/testdata/saved8 b/dist/testdata/saved8
deleted file mode 100644
index 8cf0c13..0000000
--- a/dist/testdata/saved8
+++ /dev/null
Binary files differ
diff --git a/dist/testdata/testinput10 b/dist/testdata/testinput10
deleted file mode 100644
index 93ddb3a..0000000
--- a/dist/testdata/testinput10
+++ /dev/null
@@ -1,1419 +0,0 @@
-/-- This set of tests check Unicode property support with the DFA matching 
-    functionality of pcre_dfa_exec(). The -dfa flag must be used with pcretest
-    when running it. --/
-
-/\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}
-    \x{180e}
-    \x{061c}
-    \x{2066}
-    \x{2067}
-    \x{2068}
-    \x{2069}
-    ** 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{e000}  
-  
-/^\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}
-    \x{1a1b}
-    ** Failers
-    X
-    \x{903}
-  
-/^\p{Nd}+/8O
-    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}
-    \x{2309}
-    \x{230b}
-    ** 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}
-    \x{2308}
-    \x{230a}
-    ** 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{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+/8O
-    11111111111111111111111111111111111111111111111111111111111111111111111
-    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-     
-/\P{Nd}+/8O
-    11111111111111111111111111111111111111111111111111111111111111111111111
-    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-
-/[\D]+/8O
-    11111111111111111111111111111111111111111111111111111111111111111111111
-    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-
-/[\P{Nd}]+/8O
-    11111111111111111111111111111111111111111111111111111111111111111111111
-    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-
-/[\D\P{Nd}]+/8O
-    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} 
-    
-/^\p{Han}+/8
-    \x{2e81}\x{3007}\x{2f804}\x{31a0}
-    ** Failers
-    \x{2e7f}  
-
-/^\P{Katakana}+/8
-    \x{3105}
-    ** Failers
-    \x{30ff}  
-
-/^[\p{Arabic}]/8
-    \x{06e9}
-    \x{060b}
-    ** Failers
-    X\x{06e9}   
-
-/^[\P{Yi}]/8
-    \x{2f800}
-    ** Failers
-    \x{a014}
-    \x{a4c6}   
-
-/^\p{Any}X/8
-    AXYZ
-    \x{1234}XYZ 
-    ** Failers
-    X  
-    
-/^\P{Any}X/8
-    ** Failers
-    AX
-    
-/^\p{Any}?X/8
-    XYZ
-    AXYZ
-    \x{1234}XYZ 
-    ** Failers
-    ABXYZ   
-
-/^\P{Any}?X/8
-    XYZ
-    ** Failers
-    AXYZ
-    \x{1234}XYZ 
-    ABXYZ   
-
-/^\p{Any}+X/8
-    AXYZ
-    \x{1234}XYZ
-    A\x{1234}XYZ
-    ** Failers
-    XYZ
-
-/^\P{Any}+X/8
-    ** Failers
-    AXYZ
-    \x{1234}XYZ
-    A\x{1234}XYZ
-    XYZ
-
-/^\p{Any}*X/8
-    XYZ
-    AXYZ
-    \x{1234}XYZ
-    A\x{1234}XYZ
-    ** Failers
-
-/^\P{Any}*X/8
-    XYZ
-    ** Failers
-    AXYZ
-    \x{1234}XYZ
-    A\x{1234}XYZ
-
-/^[\p{Any}]X/8
-    AXYZ
-    \x{1234}XYZ 
-    ** Failers
-    X  
-    
-/^[\P{Any}]X/8
-    ** Failers
-    AX
-    
-/^[\p{Any}]?X/8
-    XYZ
-    AXYZ
-    \x{1234}XYZ 
-    ** Failers
-    ABXYZ   
-
-/^[\P{Any}]?X/8
-    XYZ
-    ** Failers
-    AXYZ
-    \x{1234}XYZ 
-    ABXYZ   
-
-/^[\p{Any}]+X/8
-    AXYZ
-    \x{1234}XYZ
-    A\x{1234}XYZ
-    ** Failers
-    XYZ
-
-/^[\P{Any}]+X/8
-    ** Failers
-    AXYZ
-    \x{1234}XYZ
-    A\x{1234}XYZ
-    XYZ
-
-/^[\p{Any}]*X/8
-    XYZ
-    AXYZ
-    \x{1234}XYZ
-    A\x{1234}XYZ
-    ** Failers
-
-/^[\P{Any}]*X/8
-    XYZ
-    ** Failers
-    AXYZ
-    \x{1234}XYZ
-    A\x{1234}XYZ
-
-/^\p{Any}{3,5}?/8
-    abcdefgh
-    \x{1234}\n\r\x{3456}xyz 
-
-/^\p{Any}{3,5}/8
-    abcdefgh
-    \x{1234}\n\r\x{3456}xyz 
-
-/^\P{Any}{3,5}?/8
-    ** Failers
-    abcdefgh
-    \x{1234}\n\r\x{3456}xyz 
-
-/^\p{L&}X/8
-     AXY
-     aXY
-     \x{1c5}XY
-     ** Failers
-     \x{1bb}XY
-     \x{2b0}XY
-     !XY      
-
-/^[\p{L&}]X/8
-     AXY
-     aXY
-     \x{1c5}XY
-     ** Failers
-     \x{1bb}XY
-     \x{2b0}XY
-     !XY      
-
-/^\p{L&}+X/8
-     AXY
-     aXY
-     AbcdeXyz 
-     \x{1c5}AbXY
-     abcDEXypqreXlmn 
-     ** Failers
-     \x{1bb}XY
-     \x{2b0}XY
-     !XY      
-
-/^[\p{L&}]+X/8
-     AXY
-     aXY
-     AbcdeXyz 
-     \x{1c5}AbXY
-     abcDEXypqreXlmn 
-     ** Failers
-     \x{1bb}XY
-     \x{2b0}XY
-     !XY      
-
-/^\p{L&}+?X/8
-     AXY
-     aXY
-     AbcdeXyz 
-     \x{1c5}AbXY
-     abcDEXypqreXlmn 
-     ** Failers
-     \x{1bb}XY
-     \x{2b0}XY
-     !XY      
-
-/^[\p{L&}]+?X/8
-     AXY
-     aXY
-     AbcdeXyz 
-     \x{1c5}AbXY
-     abcDEXypqreXlmn 
-     ** Failers
-     \x{1bb}XY
-     \x{2b0}XY
-     !XY      
-
-/^\P{L&}X/8
-     !XY
-     \x{1bb}XY
-     \x{2b0}XY
-     ** Failers
-     \x{1c5}XY
-     AXY      
-
-/^[\P{L&}]X/8
-     !XY
-     \x{1bb}XY
-     \x{2b0}XY
-     ** Failers
-     \x{1c5}XY
-     AXY      
-
-/^\x{023a}+?(\x{0130}+)/8i
-  \x{023a}\x{2c65}\x{0130}
-  
-/^\x{023a}+([^X])/8i
-  \x{023a}\x{2c65}X
- 
-/\x{c0}+\x{116}+/8i
-    \x{c0}\x{e0}\x{116}\x{117}
-
-/[\x{c0}\x{116}]+/8i
-    \x{c0}\x{e0}\x{116}\x{117}
-
-/Check property support in non-UTF-8 mode/
- 
-/\p{L}{4}/
-    123abcdefg
-    123abc\xc4\xc5zz
-
-/\p{Carian}\p{Cham}\p{Kayah_Li}\p{Lepcha}\p{Lycian}\p{Lydian}\p{Ol_Chiki}\p{Rejang}\p{Saurashtra}\p{Sundanese}\p{Vai}/8
-    \x{102A4}\x{AA52}\x{A91D}\x{1C46}\x{10283}\x{1092E}\x{1C6B}\x{A93B}\x{A8BF}\x{1BA0}\x{A50A}====
-
-/\x{a77d}\x{1d79}/8i
-    \x{a77d}\x{1d79}
-    \x{1d79}\x{a77d} 
-
-/\x{a77d}\x{1d79}/8
-    \x{a77d}\x{1d79}
-    ** Failers 
-    \x{1d79}\x{a77d} 
-
-/^\p{Xan}/8
-    ABCD
-    1234
-    \x{6ca}
-    \x{a6c}
-    \x{10a7}   
-    ** Failers
-    _ABC   
-
-/^\p{Xan}+/8
-    ABCD1234\x{6ca}\x{a6c}\x{10a7}_
-    ** Failers
-    _ABC   
-
-/^\p{Xan}*/8
-    ABCD1234\x{6ca}\x{a6c}\x{10a7}_
-    
-/^\p{Xan}{2,9}/8
-    ABCD1234\x{6ca}\x{a6c}\x{10a7}_
-    
-/^[\p{Xan}]/8
-    ABCD1234_
-    1234abcd_
-    \x{6ca}
-    \x{a6c}
-    \x{10a7}   
-    ** Failers
-    _ABC   
- 
-/^[\p{Xan}]+/8
-    ABCD1234\x{6ca}\x{a6c}\x{10a7}_
-    ** Failers
-    _ABC   
-
-/^>\p{Xsp}/8
-    >\x{1680}\x{2028}\x{0b}
-    ** Failers
-    \x{0b} 
-
-/^>\p{Xsp}+/8O
-    > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b}
-
-/^>\p{Xsp}*/8O
-    > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b}
-    
-/^>\p{Xsp}{2,9}/8O
-    > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b}
-    
-/^>[\p{Xsp}]/8O
-    >\x{2028}\x{0b}
- 
-/^>[\p{Xsp}]+/8O
-    > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b}
-
-/^>\p{Xps}/8
-    >\x{1680}\x{2028}\x{0b}
-    >\x{a0} 
-    ** Failers
-    \x{0b} 
-
-/^>\p{Xps}+/8
-    > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b}
-
-/^>\p{Xps}+?/8
-    >\x{1680}\x{2028}\x{0b}
-
-/^>\p{Xps}*/8
-    > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b}
-    
-/^>\p{Xps}{2,9}/8
-    > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b}
-    
-/^>\p{Xps}{2,9}?/8
-    > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b}
-    
-/^>[\p{Xps}]/8
-    >\x{2028}\x{0b}
- 
-/^>[\p{Xps}]+/8
-    > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b}
-
-/^\p{Xwd}/8
-    ABCD
-    1234
-    \x{6ca}
-    \x{a6c}
-    \x{10a7}
-    _ABC    
-    ** Failers
-    [] 
-
-/^\p{Xwd}+/8
-    ABCD1234\x{6ca}\x{a6c}\x{10a7}_
-
-/^\p{Xwd}*/8
-    ABCD1234\x{6ca}\x{a6c}\x{10a7}_
-    
-/^\p{Xwd}{2,9}/8
-    A_12\x{6ca}\x{a6c}\x{10a7}
-    
-/^[\p{Xwd}]/8
-    ABCD1234_
-    1234abcd_
-    \x{6ca}
-    \x{a6c}
-    \x{10a7}   
-    _ABC 
-    ** Failers
-    []   
- 
-/^[\p{Xwd}]+/8
-    ABCD1234\x{6ca}\x{a6c}\x{10a7}_
-
-/-- Unicode properties for \b abd \B --/
-
-/\b...\B/8W
-    abc_
-    \x{37e}abc\x{376} 
-    \x{37e}\x{376}\x{371}\x{393}\x{394} 
-    !\x{c0}++\x{c1}\x{c2} 
-    !\x{c0}+++++ 
-
-/-- Without PCRE_UCP, non-ASCII always fail, even if < 256  --/
-
-/\b...\B/8
-    abc_
-    ** Failers 
-    \x{37e}abc\x{376} 
-    \x{37e}\x{376}\x{371}\x{393}\x{394} 
-    !\x{c0}++\x{c1}\x{c2} 
-    !\x{c0}+++++ 
-
-/-- With PCRE_UCP, non-UTF8 chars that are < 256 still check properties  --/
-
-/\b...\B/W
-    abc_
-    !\x{c0}++\x{c1}\x{c2} 
-    !\x{c0}+++++ 
-    
-/-- Caseless single negated characters > 127 need UCP support --/
-
-/[^\x{100}]/8i
-    \x{100}\x{101}X
-
-/[^\x{100}]+/8i
-    \x{100}\x{101}XX
-
-/^\X/8
-    A\P
-    A\P\P 
-    A\x{300}\x{301}\P
-    A\x{300}\x{301}\P\P  
-    A\x{301}\P
-    A\x{301}\P\P  
-    
-/^\X{2,3}/8
-    A\P
-    A\P\P 
-    AA\P
-    AA\P\P  
-    A\x{300}\x{301}\P
-    A\x{300}\x{301}\P\P  
-    A\x{300}\x{301}A\x{300}\x{301}\P
-    A\x{300}\x{301}A\x{300}\x{301}\P\P  
-
-/^\X{2}/8
-    AA\P
-    AA\P\P  
-    A\x{300}\x{301}A\x{300}\x{301}\P
-    A\x{300}\x{301}A\x{300}\x{301}\P\P  
-    
-/^\X+/8
-    AA\P
-    AA\P\P  
-
-/^\X+?Z/8
-    AA\P
-    AA\P\P 
-
-/-- These are tests for extended grapheme clusters --/ 
-
-/^\X/8+
-    G\x{34e}\x{34e}X
-    \x{34e}\x{34e}X
-    \x04X
-    \x{1100}X
-    \x{1100}\x{34e}X
-    \x{1b04}\x{1b04}X 
-    *These match up to the roman letters
-    \x{1111}\x{1111}L,L
-    \x{1111}\x{1111}\x{1169}L,L,V
-    \x{1111}\x{ae4c}L, LV
-    \x{1111}\x{ad89}L, LVT
-    \x{1111}\x{ae4c}\x{1169}L, LV, V
-    \x{1111}\x{ae4c}\x{1169}\x{1169}L, LV, V, V
-    \x{1111}\x{ae4c}\x{1169}\x{11fe}L, LV, V, T
-    \x{1111}\x{ad89}\x{11fe}L, LVT, T
-    \x{1111}\x{ad89}\x{11fe}\x{11fe}L, LVT, T, T
-    \x{ad89}\x{11fe}\x{11fe}LVT, T, T
-    *These match just the first codepoint (invalid sequence)
-    \x{1111}\x{11fe}L, T
-    \x{ae4c}\x{1111}LV, L
-    \x{ae4c}\x{ae4c}LV, LV
-    \x{ae4c}\x{ad89}LV, LVT
-    \x{1169}\x{1111}V, L
-    \x{1169}\x{ae4c}V, LV
-    \x{1169}\x{ad89}V, LVT
-    \x{ad89}\x{1111}LVT, L
-    \x{ad89}\x{1169}LVT, V
-    \x{ad89}\x{ae4c}LVT, LV
-    \x{ad89}\x{ad89}LVT, LVT
-    \x{11fe}\x{1111}T, L
-    \x{11fe}\x{1169}T, V
-    \x{11fe}\x{ae4c}T, LV
-    \x{11fe}\x{ad89}T, LVT
-    *Test extend and spacing mark
-    \x{1111}\x{ae4c}\x{0711}L, LV, extend
-    \x{1111}\x{ae4c}\x{1b04}L, LV, spacing mark
-    \x{1111}\x{ae4c}\x{1b04}\x{0711}\x{1b04}L, LV, spacing mark, extend, spacing mark
-    *Test CR, LF, and control
-    \x0d\x{0711}CR, extend
-    \x0d\x{1b04}CR, spacingmark
-    \x0a\x{0711}LF, extend
-    \x0a\x{1b04}LF, spacingmark
-    \x0b\x{0711}Control, extend
-    \x09\x{1b04}Control, spacingmark
-    *There are no Prepend characters, so we can't test Prepend, CR
-    
-/^(?>\X{2})X/8+
-    \x{1111}\x{ae4c}\x{1111}\x{ae4c}X
-    
-/^\X{2,4}X/8+
-    \x{1111}\x{ae4c}\x{1111}\x{ae4c}X
-    \x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}X
-    \x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}X
-
-/^\X{2,4}?X/8+
-    \x{1111}\x{ae4c}\x{1111}\x{ae4c}X
-    \x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}X
-    \x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}X
-
-/-- --/
-
-/\x{1e9e}+/8i
-    \x{1e9e}\x{00df}
-
-/[z\x{1e9e}]+/8i
-    \x{1e9e}\x{00df}
-
-/\x{00df}+/8i
-    \x{1e9e}\x{00df}
-
-/[z\x{00df}]+/8i
-    \x{1e9e}\x{00df}
-
-/\x{1f88}+/8i
-    \x{1f88}\x{1f80} 
-
-/[z\x{1f88}]+/8i
-    \x{1f88}\x{1f80} 
-
-/-- Perl matches these --/
-
-/\x{00b5}+/8i
-    \x{00b5}\x{039c}\x{03bc}
-
-/\x{039c}+/8i
-    \x{00b5}\x{039c}\x{03bc}
-
-/\x{03bc}+/8i
-    \x{00b5}\x{039c}\x{03bc}
-
-
-/\x{00c5}+/8i
-    \x{00c5}\x{00e5}\x{212b}
-
-/\x{00e5}+/8i
-    \x{00c5}\x{00e5}\x{212b}
-
-/\x{212b}+/8i
-    \x{00c5}\x{00e5}\x{212b}
-
-
-/\x{01c4}+/8i
-    \x{01c4}\x{01c5}\x{01c6}
-
-/\x{01c5}+/8i
-    \x{01c4}\x{01c5}\x{01c6}
-
-/\x{01c6}+/8i
-    \x{01c4}\x{01c5}\x{01c6}
-
-
-/\x{01c7}+/8i
-    \x{01c7}\x{01c8}\x{01c9}
-
-/\x{01c8}+/8i
-    \x{01c7}\x{01c8}\x{01c9}
-
-/\x{01c9}+/8i
-    \x{01c7}\x{01c8}\x{01c9}
-
-
-/\x{01ca}+/8i
-    \x{01ca}\x{01cb}\x{01cc}
-
-/\x{01cb}+/8i
-    \x{01ca}\x{01cb}\x{01cc}
-
-/\x{01cc}+/8i
-    \x{01ca}\x{01cb}\x{01cc}
-
-
-/\x{01f1}+/8i
-    \x{01f1}\x{01f2}\x{01f3}
-
-/\x{01f2}+/8i
-    \x{01f1}\x{01f2}\x{01f3}
-
-/\x{01f3}+/8i
-    \x{01f1}\x{01f2}\x{01f3}
-
-
-/\x{0345}+/8i
-    \x{0345}\x{0399}\x{03b9}\x{1fbe}
-
-/\x{0399}+/8i
-    \x{0345}\x{0399}\x{03b9}\x{1fbe}
-
-/\x{03b9}+/8i
-    \x{0345}\x{0399}\x{03b9}\x{1fbe}
-
-/\x{1fbe}+/8i
-    \x{0345}\x{0399}\x{03b9}\x{1fbe}
-
-
-/\x{0392}+/8i
-    \x{0392}\x{03b2}\x{03d0}
-
-/\x{03b2}+/8i
-    \x{0392}\x{03b2}\x{03d0}
-
-/\x{03d0}+/8i
-    \x{0392}\x{03b2}\x{03d0}
-    
-
-/\x{0395}+/8i
-    \x{0395}\x{03b5}\x{03f5}
-
-/\x{03b5}+/8i
-    \x{0395}\x{03b5}\x{03f5}
-
-/\x{03f5}+/8i
-    \x{0395}\x{03b5}\x{03f5}
-
-
-/\x{0398}+/8i
-    \x{0398}\x{03b8}\x{03d1}\x{03f4}
-
-/\x{03b8}+/8i
-    \x{0398}\x{03b8}\x{03d1}\x{03f4}
-
-/\x{03d1}+/8i
-    \x{0398}\x{03b8}\x{03d1}\x{03f4}
-
-/\x{03f4}+/8i
-    \x{0398}\x{03b8}\x{03d1}\x{03f4}
-    
-
-/\x{039a}+/8i
-    \x{039a}\x{03ba}\x{03f0}
-
-/\x{03ba}+/8i
-    \x{039a}\x{03ba}\x{03f0}
-
-/\x{03f0}+/8i
-    \x{039a}\x{03ba}\x{03f0}
-    
-
-/\x{03a0}+/8i
-    \x{03a0}\x{03c0}\x{03d6} 
-
-/\x{03c0}+/8i
-    \x{03a0}\x{03c0}\x{03d6} 
-
-/\x{03d6}+/8i
-    \x{03a0}\x{03c0}\x{03d6} 
-
-
-/\x{03a1}+/8i
-    \x{03a1}\x{03c1}\x{03f1}
-
-/\x{03c1}+/8i
-    \x{03a1}\x{03c1}\x{03f1}
-
-/\x{03f1}+/8i
-    \x{03a1}\x{03c1}\x{03f1}
-
-
-/\x{03a3}+/8i
-    \x{03A3}\x{03C2}\x{03C3}
-
-/\x{03c2}+/8i
-    \x{03A3}\x{03C2}\x{03C3}
-
-/\x{03c3}+/8i
-    \x{03A3}\x{03C2}\x{03C3}
-    
-
-/\x{03a6}+/8i
-    \x{03a6}\x{03c6}\x{03d5} 
-
-/\x{03c6}+/8i
-    \x{03a6}\x{03c6}\x{03d5} 
-
-/\x{03d5}+/8i
-    \x{03a6}\x{03c6}\x{03d5} 
-
-
-/\x{03c9}+/8i
-    \x{03c9}\x{03a9}\x{2126}
-
-/\x{03a9}+/8i
-    \x{03c9}\x{03a9}\x{2126}
-
-/\x{2126}+/8i
-    \x{03c9}\x{03a9}\x{2126}
-    
-
-/\x{1e60}+/8i
-    \x{1e60}\x{1e61}\x{1e9b}
-
-/\x{1e61}+/8i
-    \x{1e60}\x{1e61}\x{1e9b}
-
-/\x{1e9b}+/8i
-    \x{1e60}\x{1e61}\x{1e9b}
-    
-
-/\x{1e9e}+/8i
-    \x{1e9e}\x{00df}
-
-/\x{00df}+/8i
-    \x{1e9e}\x{00df}
-    
-
-/\x{1f88}+/8i
-    \x{1f88}\x{1f80} 
-
-/\x{1f80}+/8i
-    \x{1f88}\x{1f80} 
-
-/\x{004b}+/8i
-    \x{004b}\x{006b}\x{212a}
-
-/\x{006b}+/8i
-    \x{004b}\x{006b}\x{212a}
-
-/\x{212a}+/8i
-    \x{004b}\x{006b}\x{212a}
-
-
-/\x{0053}+/8i
-    \x{0053}\x{0073}\x{017f}
-
-/\x{0073}+/8i
-    \x{0053}\x{0073}\x{017f}
-
-/\x{017f}+/8i
-    \x{0053}\x{0073}\x{017f}
-
-/ist/8i
-    ikt
-
-/is+t/8i
-    iSs\x{17f}t
-    ikt
-
-/is+?t/8i
-    ikt
-
-/is?t/8i
-    ikt
-
-/is{2}t/8i
-    iskt
-
-/^\p{Xuc}/8
-    $abc
-    @abc
-    `abc
-    \x{1234}abc
-    ** Failers
-    abc     
-
-/^\p{Xuc}+/8
-    $@`\x{a0}\x{1234}\x{e000}**
-    ** Failers
-    \x{9f}
-
-/^\p{Xuc}+?/8
-    $@`\x{a0}\x{1234}\x{e000}**
-    ** Failers
-    \x{9f}
-
-/^\p{Xuc}+?\*/8
-    $@`\x{a0}\x{1234}\x{e000}**
-    ** Failers
-    \x{9f}
-
-/^\p{Xuc}++/8
-    $@`\x{a0}\x{1234}\x{e000}**
-    ** Failers
-    \x{9f}
-
-/^\p{Xuc}{3,5}/8
-    $@`\x{a0}\x{1234}\x{e000}**
-    ** Failers
-    \x{9f}
-
-/^\p{Xuc}{3,5}?/8
-    $@`\x{a0}\x{1234}\x{e000}**
-    ** Failers
-    \x{9f}
-
-/^[\p{Xuc}]/8
-    $@`\x{a0}\x{1234}\x{e000}**
-    ** Failers
-    \x{9f}
-
-/^[\p{Xuc}]+/8
-    $@`\x{a0}\x{1234}\x{e000}**
-    ** Failers
-    \x{9f}
-
-/^\P{Xuc}/8
-    abc
-    ** Failers
-    $abc
-    @abc
-    `abc
-    \x{1234}abc
-
-/^[\P{Xuc}]/8
-    abc
-    ** Failers
-    $abc
-    @abc
-    `abc
-    \x{1234}abc
-
-/^A\s+Z/8W
-    A\x{2005}Z
-    A\x{85}\x{180e}\x{2005}Z
-
-/^A[\s]+Z/8W
-    A\x{2005}Z
-    A\x{85}\x{180e}\x{2005}Z
-
-/-- End of testinput10 --/ 
diff --git a/dist/testdata/testinput11 b/dist/testdata/testinput11
deleted file mode 100644
index ac9d228..0000000
--- a/dist/testdata/testinput11
+++ /dev/null
@@ -1,141 +0,0 @@
-/-- These are a few representative patterns whose lengths and offsets are to be 
-shown when the link size is 2. This is just a doublecheck test to ensure the 
-sizes don't go horribly wrong when something is changed. The pattern contents 
-are all themselves checked in other tests. Unicode, including property support, 
-is required for these tests. --/
-
-/((?i)b)/BM
-
-/(?s)(.*X|^B)/BM
-
-/(?s:.*X|^B)/BM
-
-/^[[:alnum:]]/BM
-
-/#/IxMD
-
-/a#/IxMD
-
-/x?+/BM
-
-/x++/BM
-
-/x{1,3}+/BM 
-
-/(x)*+/BM
-
-/^((a+)(?U)([ab]+)(?-U)([bc]+)(\w*))/BM
-
-|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|BM
-
-|\$\<\.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|BM
-
-/(a(?1)b)/BM
-
-/(a(?1)+b)/BM
-
-/a(?P<name1>b|c)d(?P<longername2>e)/BM
-
-/(?:a(?P<c>c(?P<d>d)))(?P<a>a)/BM
-
-/(?P<a>a)...(?P=a)bbb(?P>a)d/BM
-
-/abc(?C255)de(?C)f/BM
-
-/abcde/CBM
-
-/\x{100}/8BM
-
-/\x{1000}/8BM
-
-/\x{10000}/8BM
-
-/\x{100000}/8BM
-
-/\x{10ffff}/8BM
-
-/\x{110000}/8BM
-
-/[\x{ff}]/8BM
-
-/[\x{100}]/8BM
-
-/\x80/8BM
-
-/\xff/8BM
-
-/\x{0041}\x{2262}\x{0391}\x{002e}/D8M
-    
-/\x{D55c}\x{ad6d}\x{C5B4}/D8M 
-
-/\x{65e5}\x{672c}\x{8a9e}/D8M
-
-/[\x{100}]/8BM
-
-/[Z\x{100}]/8BM
-
-/^[\x{100}\E-\Q\E\x{150}]/B8M
-
-/^[\QĀ\E-\QŐ\E]/B8M
-
-/^[\QĀ\E-\QŐ\E/B8M
-
-/[\p{L}]/BM
-
-/[\p{^L}]/BM
-
-/[\P{L}]/BM
-
-/[\P{^L}]/BM
-
-/[abc\p{L}\x{0660}]/8BM
-
-/[\p{Nd}]/8BM
-
-/[\p{Nd}+-]+/8BM
-
-/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/8iBM
-
-/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/8BM
-
-/[\x{105}-\x{109}]/8iBM
-
-/( ( (?(1)0|) )*   )/xBM
-
-/(  (?(1)0|)*   )/xBM
-
-/[a]/BM
-
-/[a]/8BM
-
-/[\xaa]/BM
-
-/[\xaa]/8BM
-
-/[^a]/BM
-
-/[^a]/8BM
-
-/[^\xaa]/BM
-
-/[^\xaa]/8BM
-
-/[^\d]/8WB
-
-/[[:^alpha:][:^cntrl:]]+/8WB
-
-/[[:^cntrl:][:^alpha:]]+/8WB
-
-/[[:alpha:]]+/8WB
-
-/[[:^alpha:]\S]+/8WB
-
-/abc(d|e)(*THEN)x(123(*THEN)4|567(b|q)(*THEN)xx)/B
-
-/(((a\2)|(a*)\g<-1>))*a?/B
-
-/((?+1)(\1))/B
-
-/.((?2)(?R)\1)()/B
-
-/-- End of testinput11 --/
diff --git a/dist/testdata/testinput13 b/dist/testdata/testinput13
deleted file mode 100644
index c7bc67b..0000000
--- a/dist/testdata/testinput13
+++ /dev/null
@@ -1,9 +0,0 @@
-/-- This test is run only when JIT support is not available. It checks that an 
-attempt to use it has the expected behaviour. It also tests things that
-are different without JIT. --/
-   
-/abc/S+I
-
-/a*/SI
-
-/-- End of testinput13 --/
diff --git a/dist/testdata/testinput15 b/dist/testdata/testinput15
deleted file mode 100644
index 83e2677..0000000
--- a/dist/testdata/testinput15
+++ /dev/null
@@ -1,366 +0,0 @@
-/-- This set of tests is for UTF-8 support but not Unicode property support,
-    and is relevant only to the 8-bit library. --/
-
-< forbid W
-
-/X(\C{3})/8
-    X\x{1234}
-
-/X(\C{4})/8
-    X\x{1234}YZ
-    
-/X\C*/8
-    XYZabcdce
-    
-/X\C*?/8
-    XYZabcde
-    
-/X\C{3,5}/8
-    Xabcdefg   
-    X\x{1234} 
-    X\x{1234}YZ
-    X\x{1234}\x{512}  
-    X\x{1234}\x{512}YZ
-
-/X\C{3,5}?/8
-    Xabcdefg   
-    X\x{1234} 
-    X\x{1234}YZ
-    X\x{1234}\x{512}  
-
-/a\Cb/8
-    aXb
-    a\nb
-    
-/a\C\Cb/8 
-    a\x{100}b 
-
-/ab\Cde/8
-    abXde
-
-/a\C\Cb/8 
-    a\x{100}b
-    ** Failers 
-    a\x{12257}b
-
-/[Ã]/8
-
-/Ã/8
-
-/ÃÃÃxxx/8
-
-/ÃÃÃxxx/8?DZSSO
-
-/badutf/8
-    \xdf
-    \xef
-    \xef\x80
-    \xf7
-    \xf7\x80
-    \xf7\x80\x80
-    \xfb
-    \xfb\x80
-    \xfb\x80\x80
-    \xfb\x80\x80\x80
-    \xfd
-    \xfd\x80
-    \xfd\x80\x80
-    \xfd\x80\x80\x80
-    \xfd\x80\x80\x80\x80
-    \xdf\x7f
-    \xef\x7f\x80
-    \xef\x80\x7f
-    \xf7\x7f\x80\x80
-    \xf7\x80\x7f\x80
-    \xf7\x80\x80\x7f
-    \xfb\x7f\x80\x80\x80
-    \xfb\x80\x7f\x80\x80
-    \xfb\x80\x80\x7f\x80
-    \xfb\x80\x80\x80\x7f
-    \xfd\x7f\x80\x80\x80\x80
-    \xfd\x80\x7f\x80\x80\x80
-    \xfd\x80\x80\x7f\x80\x80
-    \xfd\x80\x80\x80\x7f\x80
-    \xfd\x80\x80\x80\x80\x7f
-    \xed\xa0\x80
-    \xc0\x8f
-    \xe0\x80\x8f
-    \xf0\x80\x80\x8f
-    \xf8\x80\x80\x80\x8f
-    \xfc\x80\x80\x80\x80\x8f
-    \x80
-    \xfe
-    \xff
-
-/badutf/8
-    \xfb\x80\x80\x80\x80
-    \xfd\x80\x80\x80\x80\x80
-    \xf7\xbf\xbf\xbf
-
-/shortutf/8
-    \P\P\xdf
-    \P\P\xef
-    \P\P\xef\x80
-    \P\P\xf7
-    \P\P\xf7\x80
-    \P\P\xf7\x80\x80
-    \P\P\xfb
-    \P\P\xfb\x80
-    \P\P\xfb\x80\x80
-    \P\P\xfb\x80\x80\x80
-    \P\P\xfd
-    \P\P\xfd\x80
-    \P\P\xfd\x80\x80
-    \P\P\xfd\x80\x80\x80
-    \P\P\xfd\x80\x80\x80\x80
-
-/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
-    \?\xf8\x88\x80\x80\x80  
-    \?\xf9\x87\x80\x80\x80  
-    \?\xfc\x84\x80\x80\x80\x80
-    \?\xfd\x83\x80\x80\x80\x80
-
-/\x{100}/8DZ
-
-/\x{1000}/8DZ
-
-/\x{10000}/8DZ
-
-/\x{100000}/8DZ
-
-/\x{10ffff}/8DZ
-
-/[\x{ff}]/8DZ
-
-/[\x{100}]/8DZ
-
-/\x80/8DZ
-
-/\xff/8DZ
-
-/\x{D55c}\x{ad6d}\x{C5B4}/DZ8 
-    \x{D55c}\x{ad6d}\x{C5B4} 
-
-/\x{65e5}\x{672c}\x{8a9e}/DZ8
-    \x{65e5}\x{672c}\x{8a9e}
-
-/\x{80}/DZ8
-
-/\x{084}/DZ8
-
-/\x{104}/DZ8
-
-/\x{861}/DZ8
-
-/\x{212ab}/DZ8
-
-/-- This one is here not because it's different to Perl, but because the way
-the captured single-byte is displayed. (In Perl it becomes a character, and you
-can't tell the difference.) --/
-    
-/X(\C)(.*)/8
-    X\x{1234}
-    X\nabc 
-
-/-- This one is here because Perl gives out a grumbly error message (quite 
-correctly, but that messes up comparisons). --/
-    
-/a\Cb/8
-    *** Failers 
-    a\x{100}b 
-    
-/[^ab\xC0-\xF0]/8SDZ
-    \x{f1}
-    \x{bf}
-    \x{100}
-    \x{1000}   
-    *** Failers
-    \x{c0} 
-    \x{f0} 
-
-/Ā{3,4}/8SDZ
-  \x{100}\x{100}\x{100}\x{100\x{100}
-
-/(\x{100}+|x)/8SDZ
-
-/(\x{100}*a|x)/8SDZ
-
-/(\x{100}{0,2}a|x)/8SDZ
-
-/(\x{100}{1,2}a|x)/8SDZ
-
-/\x{100}/8DZ
-
-/a\x{100}\x{101}*/8DZ
-
-/a\x{100}\x{101}+/8DZ
-
-/[^\x{c4}]/DZ
-
-/[\x{100}]/8DZ
-    \x{100}
-    Z\x{100}
-    \x{100}Z
-    *** Failers 
-
-/[\xff]/DZ8
-    >\x{ff}<
-
-/[^\xff]/8DZ
-
-/\x{100}abc(xyz(?1))/8DZ
-
-/a\x{1234}b/P8
-    a\x{1234}b
-
-/\777/8I
-  \x{1ff}
-  \777 
-  
-/\x{100}+\x{200}/8DZ
-
-/\x{100}+X/8DZ
-
-/^[\QĀ\E-\QŐ\E/BZ8
-
-/-- This tests the stricter UTF-8 check according to RFC 3629. --/ 
-    
-/X/8
-    \x{d800}
-    \x{d800}\?
-    \x{da00}
-    \x{da00}\?
-    \x{dfff}
-    \x{dfff}\?
-    \x{110000}    
-    \x{110000}\?    
-    \x{2000000} 
-    \x{2000000}\? 
-    \x{7fffffff} 
-    \x{7fffffff}\? 
-
-/(*UTF8)\x{1234}/
-  abcd\x{1234}pqr
-
-/(*CRLF)(*UTF)(*BSR_UNICODE)a\Rb/I
-
-/\h/SI8
-    ABC\x{09}
-    ABC\x{20}
-    ABC\x{a0}
-    ABC\x{1680}
-    ABC\x{180e}
-    ABC\x{2000}
-    ABC\x{202f} 
-    ABC\x{205f} 
-    ABC\x{3000} 
-
-/\v/SI8
-    ABC\x{0a}
-    ABC\x{0b}
-    ABC\x{0c}
-    ABC\x{0d}
-    ABC\x{85}
-    ABC\x{2028}
-
-/\h*A/SI8
-    CDBABC
-    
-/\v+A/SI8
-
-/\s?xxx\s/8SI
-
-/\sxxx\s/I8ST1
-    AB\x{85}xxx\x{a0}XYZ
-    AB\x{a0}xxx\x{85}XYZ
-
-/\S \S/I8ST1
-    \x{a2} \x{84} 
-    A Z 
-
-/a+/8
-    a\x{123}aa\>1
-    a\x{123}aa\>2
-    a\x{123}aa\>3
-    a\x{123}aa\>4
-    a\x{123}aa\>5
-    a\x{123}aa\>6
-
-/\x{1234}+/iS8I
-
-/\x{1234}+?/iS8I
-
-/\x{1234}++/iS8I
-
-/\x{1234}{2}/iS8I
-
-/[^\x{c4}]/8DZ
-
-/X+\x{200}/8DZ
-
-/\R/SI8
-
-/\777/8DZ
-
-/\w+\x{C4}/8BZ
-    a\x{C4}\x{C4}
-
-/\w+\x{C4}/8BZT1
-    a\x{C4}\x{C4}
-    
-/\W+\x{C4}/8BZ
-    !\x{C4}
- 
-/\W+\x{C4}/8BZT1
-    !\x{C4}
-
-/\W+\x{A1}/8BZ
-    !\x{A1}
- 
-/\W+\x{A1}/8BZT1
-    !\x{A1}
-
-/X\s+\x{A0}/8BZ
-    X\x20\x{A0}\x{A0}
-
-/X\s+\x{A0}/8BZT1
-    X\x20\x{A0}\x{A0}
-
-/\S+\x{A0}/8BZ
-    X\x{A0}\x{A0}
-
-/\S+\x{A0}/8BZT1
-    X\x{A0}\x{A0}
-
-/\x{a0}+\s!/8BZ
-    \x{a0}\x20!
-
-/\x{a0}+\s!/8BZT1
-    \x{a0}\x20!
-
-/A/8
-  \x{ff000041}
-  \x{7f000041} 
-
-/(*UTF8)abc/9
-
-/abc/89
-
-/-- End of testinput15 --/
diff --git a/dist/testdata/testinput16 b/dist/testdata/testinput16
deleted file mode 100644
index 15419e6..0000000
--- a/dist/testdata/testinput16
+++ /dev/null
@@ -1,41 +0,0 @@
-/-- This set of tests is run only with the 8-bit library when Unicode property 
-    support is available. It starts with tests of the POSIX interface, because
-    that is supported only with the 8-bit library. --/
-
-/\w/P
-    +++\x{c2}
-
-/\w/WP
-    +++\x{c2}
-    
-/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/8iDZ
-
-/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/8DZ
-
-/AB\x{1fb0}/8DZ
-
-/AB\x{1fb0}/8DZi
-
-/\x{401}\x{420}\x{421}\x{422}\x{423}\x{424}\x{425}\x{426}\x{427}\x{428}\x{429}\x{42a}\x{42b}\x{42c}\x{42d}\x{42e}\x{42f}/8iSI
-    \x{401}\x{420}\x{421}\x{422}\x{423}\x{424}\x{425}\x{426}\x{427}\x{428}\x{429}\x{42a}\x{42b}\x{42c}\x{42d}\x{42e}\x{42f}
-    \x{451}\x{440}\x{441}\x{442}\x{443}\x{444}\x{445}\x{446}\x{447}\x{448}\x{449}\x{44a}\x{44b}\x{44c}\x{44d}\x{44e}\x{44f}
-
-/[ⱥ]/8iBZ
-
-/[^ⱥ]/8iBZ
-
-/\h/SI
-
-/\v/SI
-
-/\R/SI
-
-/[[:blank:]]/WBZ
-
-/\x{212a}+/i8SI
-    KKkk\x{212a}
-
-/s+/i8SI
-    SSss\x{17f}
-
-/-- End of testinput16 --/
diff --git a/dist/testdata/testinput17 b/dist/testdata/testinput17
deleted file mode 100644
index c48e77f..0000000
--- a/dist/testdata/testinput17
+++ /dev/null
@@ -1,309 +0,0 @@
-/-- This set of tests is for the 16- and 32-bit library's basic (non-UTF-16 
-    or -32) features that are not compatible with the 8-bit library, or which 
-    give different output in 16- or 32-bit mode. --/
-    
-< forbid 8W 
-
-/a\Cb/
-    aXb
-    a\nb
-  
-/[^\x{c4}]/DZ
-  
-/\x{100}/I
-
-/  (?: [\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
-/xSI
-
-/[\h]/BZ
-    >\x09<
-
-/[\h]+/BZ
-    >\x09\x20\xa0<
-
-/[\v]/BZ
-
-/[^\h]/BZ
-
-/\h+/SI
-    \x{1681}\x{200b}\x{1680}\x{2000}\x{202f}\x{3000}
-    \x{3001}\x{2fff}\x{200a}\xa0\x{2000}
-
-/[\h\x{dc00}]+/BZSI
-    \x{1681}\x{200b}\x{1680}\x{2000}\x{202f}\x{3000}
-    \x{3001}\x{2fff}\x{200a}\xa0\x{2000}
-
-/\H+/SI
-    \x{1680}\x{180e}\x{167f}\x{1681}\x{180d}\x{180f}
-    \x{2000}\x{200a}\x{1fff}\x{200b}
-    \x{202f}\x{205f}\x{202e}\x{2030}\x{205e}\x{2060}
-    \xa0\x{3000}\x9f\xa1\x{2fff}\x{3001}
-
-/[\H\x{d800}]+/
-    \x{1680}\x{180e}\x{167f}\x{1681}\x{180d}\x{180f}
-    \x{2000}\x{200a}\x{1fff}\x{200b}
-    \x{202f}\x{205f}\x{202e}\x{2030}\x{205e}\x{2060}
-    \xa0\x{3000}\x9f\xa1\x{2fff}\x{3001}
-
-/\v+/SI
-    \x{2027}\x{2030}\x{2028}\x{2029}
-    \x09\x0e\x84\x86\x85\x0a\x0b\x0c\x0d
-
-/[\v\x{dc00}]+/BZSI
-    \x{2027}\x{2030}\x{2028}\x{2029}
-    \x09\x0e\x84\x86\x85\x0a\x0b\x0c\x0d
-
-/\V+/SI
-    \x{2028}\x{2029}\x{2027}\x{2030}
-    \x85\x0a\x0b\x0c\x0d\x09\x0e\x84\x86
-
-/[\V\x{d800}]+/
-    \x{2028}\x{2029}\x{2027}\x{2030}
-    \x85\x0a\x0b\x0c\x0d\x09\x0e\x84\x86
-
-/\R+/SI<bsr_unicode>
-    \x{2027}\x{2030}\x{2028}\x{2029}
-    \x09\x0e\x84\x86\x85\x0a\x0b\x0c\x0d
-
-/\x{d800}\x{d7ff}\x{dc00}\x{dc00}\x{dcff}\x{dd00}/I
-    \x{d800}\x{d7ff}\x{dc00}\x{dc00}\x{dcff}\x{dd00}
-
-/[^\x{80}][^\x{ff}][^\x{100}][^\x{1000}][^\x{ffff}]/BZ
-
-/[^\x{80}][^\x{ff}][^\x{100}][^\x{1000}][^\x{ffff}]/BZi
-
-/[^\x{100}]*[^\x{1000}]+[^\x{ffff}]??[^\x{8000}]{4,}[^\x{7fff}]{2,9}?[^\x{100}]{5,6}+/BZ
-
-/[^\x{100}]*[^\x{1000}]+[^\x{ffff}]??[^\x{8000}]{4,}[^\x{7fff}]{2,9}?[^\x{100}]{5,6}+/BZi
-
-/(*:0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF)XX/K
-    XX
-     
-/(*:0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDE)XX/K
-    XX
-
-/\u0100/<JS>BZ
-
-/[\u0100-\u0200]/<JS>BZ
-
-/\ud800/<JS>BZ
-
-/^\x{ffff}+/i
-    \x{ffff}
-
-/^\x{ffff}?/i
-    \x{ffff}
-
-/^\x{ffff}*/i
-    \x{ffff}
-
-/^\x{ffff}{3}/i
-    \x{ffff}\x{ffff}\x{ffff}
-
-/^\x{ffff}{0,3}/i
-    \x{ffff}
-
-/[^\x00-a]{12,}[^b-\xff]*/BZ
-
-/[^\s]*\s* [^\W]+\W+ [^\d]*?\d0 [^\d\w]{4,6}?\w*A/BZ
-
-/a*[b-\x{200}]?a#a*[b-\x{200}]?b#[a-f]*[g-\x{200}]*#[g-\x{200}]*[a-c]*#[g-\x{200}]*[a-h]*/BZ
-
-/^[\x{1234}\x{4321}]{2,4}?/
-    \x{1234}\x{1234}\x{1234}
-
-/(*THEN:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA)/
-
-/-- End of testinput17 --/
diff --git a/dist/testdata/testinput18 b/dist/testdata/testinput18
deleted file mode 100644
index 2dfb54c..0000000
--- a/dist/testdata/testinput18
+++ /dev/null
@@ -1,300 +0,0 @@
-/-- This set of tests is for UTF-16 and UTF-32 support, and is relevant only to
-    the 16- and 32-bit libraries. --/
-    
-< forbid W 
-
-/ÃÃÃxxx/8?DZSS
-
-/abc/8
-    Ã]
-
-/X(\C{3})/8
-    X\x{11234}Y
-    X\x{11234}YZ
-
-/X(\C{4})/8
-    X\x{11234}YZ
-    X\x{11234}YZW
-
-/X\C*/8
-    XYZabcdce
-
-/X\C*?/8
-    XYZabcde
-
-/X\C{3,5}/8
-    Xabcdefg
-    X\x{11234}Y
-    X\x{11234}YZ
-    X\x{11234}\x{512}
-    X\x{11234}\x{512}YZ
-    X\x{11234}\x{512}\x{11234}Z
-
-/X\C{3,5}?/8
-    Xabcdefg
-    X\x{11234}Y
-    X\x{11234}YZ
-    X\x{11234}\x{512}YZ
-    *** Failers
-    X\x{11234}
-
-/a\Cb/8
-    aXb
-    a\nb
-
-/a\C\Cb/8
-    a\x{12257}b
-    a\x{12257}\x{11234}b
-    ** Failers
-    a\x{100}b
-
-/ab\Cde/8
-    abXde
-
-/-- Check maximum character size --/
-
-/\x{ffff}/8DZ
-
-/\x{10000}/8DZ
-
-/\x{100}/8DZ
-
-/\x{1000}/8DZ
-
-/\x{10000}/8DZ
-
-/\x{100000}/8DZ
-
-/\x{10ffff}/8DZ
-
-/[\x{ff}]/8DZ
-
-/[\x{100}]/8DZ
-
-/\x80/8DZ
-
-/\xff/8DZ
-
-/\x{D55c}\x{ad6d}\x{C5B4}/DZ8
-    \x{D55c}\x{ad6d}\x{C5B4}
-
-/\x{65e5}\x{672c}\x{8a9e}/DZ8
-    \x{65e5}\x{672c}\x{8a9e}
-
-/\x{80}/DZ8
-
-/\x{084}/DZ8
-
-/\x{104}/DZ8
-
-/\x{861}/DZ8
-
-/\x{212ab}/DZ8
-
-/-- This one is here not because it's different to Perl, but because the way
-the captured single-byte is displayed. (In Perl it becomes a character, and you
-can't tell the difference.) --/
-
-/X(\C)(.*)/8
-    X\x{1234}
-    X\nabc
-
-/-- This one is here because Perl gives out a grumbly error message (quite
-correctly, but that messes up comparisons). --/
-
-/a\Cb/8
-    *** Failers
-    a\x{100}b
-
-/[^ab\xC0-\xF0]/8SDZ
-    \x{f1}
-    \x{bf}
-    \x{100}
-    \x{1000}
-    *** Failers
-    \x{c0}
-    \x{f0}
-
-/Ā{3,4}/8SDZ
-  \x{100}\x{100}\x{100}\x{100\x{100}
-
-/(\x{100}+|x)/8SDZ
-
-/(\x{100}*a|x)/8SDZ
-
-/(\x{100}{0,2}a|x)/8SDZ
-
-/(\x{100}{1,2}a|x)/8SDZ
-
-/\x{100}/8DZ
-
-/a\x{100}\x{101}*/8DZ
-
-/a\x{100}\x{101}+/8DZ
-
-/[^\x{c4}]/DZ
-
-/[\x{100}]/8DZ
-    \x{100}
-    Z\x{100}
-    \x{100}Z
-    *** Failers
-
-/[\xff]/DZ8
-    >\x{ff}<
-
-/[^\xff]/8DZ
-
-/\x{100}abc(xyz(?1))/8DZ
-
-/\777/8I
-  \x{1ff}
-  \777
-
-/\x{100}+\x{200}/8DZ
-
-/\x{100}+X/8DZ
-
-/^[\QĀ\E-\QŐ\E/BZ8
-
-/X/8
-    \x{d800}
-    \x{d800}\?
-    \x{da00}
-    \x{da00}\?
-    \x{dc00}
-    \x{dc00}\?
-    \x{de00}
-    \x{de00}\?
-    \x{dfff}
-    \x{dfff}\?
-    \x{110000}
-    \x{d800}\x{1234}
-
-/(*UTF16)\x{11234}/
-  abcd\x{11234}pqr
-
-/(*UTF)\x{11234}/I
-  abcd\x{11234}pqr
-
-/(*UTF-32)\x{11234}/
-  abcd\x{11234}pqr
-
-/(*CRLF)(*UTF16)(*BSR_UNICODE)a\Rb/I
-
-/(*CRLF)(*UTF32)(*BSR_UNICODE)a\Rb/I
-
-/\h/SI8
-    ABC\x{09}
-    ABC\x{20}
-    ABC\x{a0}
-    ABC\x{1680}
-    ABC\x{180e}
-    ABC\x{2000}
-    ABC\x{202f}
-    ABC\x{205f}
-    ABC\x{3000}
-
-/\v/SI8
-    ABC\x{0a}
-    ABC\x{0b}
-    ABC\x{0c}
-    ABC\x{0d}
-    ABC\x{85}
-    ABC\x{2028}
-
-/\h*A/SI8
-    CDBABC
-    \x{2000}ABC 
-
-/\R*A/SI8<bsr_unicode>
-    CDBABC
-    \x{2028}A  
-
-/\v+A/SI8
-
-/\s?xxx\s/8SI
-
-/\sxxx\s/I8ST1
-    AB\x{85}xxx\x{a0}XYZ
-    AB\x{a0}xxx\x{85}XYZ
-
-/\S \S/I8ST1
-    \x{a2} \x{84}
-    A Z
-
-/a+/8
-    a\x{123}aa\>1
-    a\x{123}aa\>2
-    a\x{123}aa\>3
-    a\x{123}aa\>4
-    a\x{123}aa\>5
-    a\x{123}aa\>6
-
-/\x{1234}+/iS8I
-
-/\x{1234}+?/iS8I
-
-/\x{1234}++/iS8I
-
-/\x{1234}{2}/iS8I
-
-/[^\x{c4}]/8DZ
-
-/X+\x{200}/8DZ
-
-/\R/SI8
-
-/-- Check bad offset --/
-
-/a/8
-    \x{10000}\>1
-    \x{10000}ab\>1
-    \x{10000}ab\>2
-    \x{10000}ab\>3
-    \x{10000}ab\>4
-    \x{10000}ab\>5
-
-/í¼€/8
-
-/\w+\x{C4}/8BZ
-    a\x{C4}\x{C4}
-
-/\w+\x{C4}/8BZT1
-    a\x{C4}\x{C4}
-    
-/\W+\x{C4}/8BZ
-    !\x{C4}
- 
-/\W+\x{C4}/8BZT1
-    !\x{C4}
-
-/\W+\x{A1}/8BZ
-    !\x{A1}
- 
-/\W+\x{A1}/8BZT1
-    !\x{A1}
-
-/X\s+\x{A0}/8BZ
-    X\x20\x{A0}\x{A0}
-
-/X\s+\x{A0}/8BZT1
-    X\x20\x{A0}\x{A0}
-
-/\S+\x{A0}/8BZ
-    X\x{A0}\x{A0}
-
-/\S+\x{A0}/8BZT1
-    X\x{A0}\x{A0}
-
-/\x{a0}+\s!/8BZ
-    \x{a0}\x20!
-
-/\x{a0}+\s!/8BZT1
-    \x{a0}\x20!
-
-/(*UTF)abc/9
-
-/abc/89
-
-/-- End of testinput18 --/
diff --git a/dist/testdata/testinput19 b/dist/testdata/testinput19
deleted file mode 100644
index ce45afc..0000000
--- a/dist/testdata/testinput19
+++ /dev/null
@@ -1,28 +0,0 @@
-/-- This set of tests is for Unicode property support, relevant only to the
-    16- and 32-bit library. --/
-    
-/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/8iDZ
-
-/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/8DZ
-
-/AB\x{1fb0}/8DZ
-
-/AB\x{1fb0}/8DZi
-
-/\x{401}\x{420}\x{421}\x{422}\x{423}\x{424}\x{425}\x{426}\x{427}\x{428}\x{429}\x{42a}\x{42b}\x{42c}\x{42d}\x{42e}\x{42f}/8iSI
-    \x{401}\x{420}\x{421}\x{422}\x{423}\x{424}\x{425}\x{426}\x{427}\x{428}\x{429}\x{42a}\x{42b}\x{42c}\x{42d}\x{42e}\x{42f}
-    \x{451}\x{440}\x{441}\x{442}\x{443}\x{444}\x{445}\x{446}\x{447}\x{448}\x{449}\x{44a}\x{44b}\x{44c}\x{44d}\x{44e}\x{44f}
-
-/[ⱥ]/8iBZ
-
-/[^ⱥ]/8iBZ
-
-/[[:blank:]]/WBZ
-
-/\x{212a}+/i8SI
-    KKkk\x{212a}
-
-/s+/i8SI
-    SSss\x{17f}
-
-/-- End of testinput19 --/ 
diff --git a/dist/testdata/testinput2 b/dist/testdata/testinput2
deleted file mode 100644
index e2e520f..0000000
--- a/dist/testdata/testinput2
+++ /dev/null
@@ -1,4220 +0,0 @@
-/-- This set of tests is not Perl-compatible. It checks on special features
-    of PCRE's API, error diagnostics, and the compiled code of some patterns.
-    It also checks the non-Perl syntax the PCRE supports (Python, .NET, 
-    Oniguruma). Finally, there are some tests where PCRE and Perl differ, 
-    either because PCRE can't be compatible, or there is a possible Perl 
-    bug.
-    
-    NOTE: This is a non-UTF set of tests. When UTF support is needed, use
-    test 5, and if Unicode Property Support is needed, use test 7. --/
-    
-< forbid 8W 
-  
-/(a)b|/I
-
-/abc/I
-    abc
-    defabc
-    \Aabc
-    *** Failers
-    \Adefabc
-    ABC
-
-/^abc/I
-    abc
-    \Aabc
-    *** Failers
-    defabc
-    \Adefabc
-
-/a+bc/I
-
-/a*bc/I
-
-/a{3}bc/I
-
-/(abc|a+z)/I
-
-/^abc$/I
-    abc
-    *** Failers
-    def\nabc
-
-/ab\idef/X
-
-/(?X)ab\idef/X
-
-/x{5,4}/
-
-/z{65536}/
-
-/[abcd/
-
-/(?X)[\B]/
-
-/(?X)[\R]/
-
-/(?X)[\X]/
-
-/[\B]/BZ
-
-/[\R]/BZ
-
-/[\X]/BZ
-
-/[z-a]/
-
-/^*/
-
-/(abc/
-
-/(?# abc/
-
-/(?z)abc/
-
-/.*b/I
-
-/.*?b/I
-
-/cat|dog|elephant/I
-    this sentence eventually mentions a cat
-    this sentences rambles on and on for a while and then reaches elephant
-
-/cat|dog|elephant/IS
-    this sentence eventually mentions a cat
-    this sentences rambles on and on for a while and then reaches elephant
-
-/cat|dog|elephant/IiS
-    this sentence eventually mentions a CAT cat
-    this sentences rambles on and on for a while to elephant ElePhant
-
-/a|[bcd]/IS
-
-/(a|[^\dZ])/IS
-
-/(a|b)*[\s]/IS
-
-/(ab\2)/
-
-/{4,5}abc/
-
-/(a)(b)(c)\2/I
-    abcb
-    \O0abcb
-    \O3abcb
-    \O6abcb
-    \O9abcb
-    \O12abcb
-
-/(a)bc|(a)(b)\2/I
-    abc
-    \O0abc
-    \O3abc
-    \O6abc
-    aba
-    \O0aba
-    \O3aba
-    \O6aba
-    \O9aba
-    \O12aba
-
-/abc$/IE
-    abc
-    *** Failers
-    abc\n
-    abc\ndef
-
-/(a)(b)(c)(d)(e)\6/
-
-/the quick brown fox/I
-    the quick brown fox
-    this is a line with the quick brown fox
-
-/the quick brown fox/IA
-    the quick brown fox
-    *** Failers
-    this is a line with the quick brown fox
-
-/ab(?z)cd/
-
-/^abc|def/I
-    abcdef
-    abcdef\B
-
-/.*((abc)$|(def))/I
-    defabc
-    \Zdefabc
-
-/)/
-
-/a[]b/
-
-/[^aeiou ]{3,}/I
-    co-processors, and for
-
-/<.*>/I
-    abc<def>ghi<klm>nop
-
-/<.*?>/I
-    abc<def>ghi<klm>nop
-
-/<.*>/IU
-    abc<def>ghi<klm>nop
-
-/(?U)<.*>/I
-    abc<def>ghi<klm>nop
-
-/<.*?>/IU
-    abc<def>ghi<klm>nop
-
-/={3,}/IU
-    abc========def
-
-/(?U)={3,}?/I
-    abc========def
-
-/(?<!bar|cattle)foo/I
-    foo
-    catfoo
-    *** Failers
-    the barfoo
-    and cattlefoo
-
-/(?<=a+)b/
-
-/(?<=aaa|b{0,3})b/
-
-/(?<!(foo)a\1)bar/
-
-/(?i)abc/I
-
-/(a|(?m)a)/I
-
-/(?i)^1234/I
-
-/(^b|(?i)^d)/I
-
-/(?s).*/I
-
-/[abcd]/IS
-
-/(?i)[abcd]/IS
-
-/(?m)[xy]|(b|c)/IS
-
-/(^a|^b)/Im
-
-/(?i)(^a|^b)/Im
-
-/(a)(?(1)a|b|c)/
-
-/(?(?=a)a|b|c)/
-
-/(?(1a)/
-
-/(?(1a))/
-
-/(?(?i))/
-
-/(?(abc))/
-
-/(?(?<ab))/
-
-/((?s)blah)\s+\1/I
-
-/((?i)blah)\s+\1/I
-
-/((?i)b)/IDZS
-
-/(a*b|(?i:c*(?-i)d))/IS
-
-/a$/I
-    a
-    a\n
-    *** Failers
-    \Za
-    \Za\n
-
-/a$/Im
-    a
-    a\n
-    \Za\n
-    *** Failers
-    \Za
-
-/\Aabc/Im
-
-/^abc/Im
-
-/^((a+)(?U)([ab]+)(?-U)([bc]+)(\w*))/I
-  aaaaabbbbbcccccdef
-
-/(?<=foo)[ab]/IS
-
-/(?<!foo)(alpha|omega)/IS
-
-/(?!alphabet)[ab]/IS
-
-/(?<=foo\n)^bar/Im
-    foo\nbarbar
-    ***Failers
-    rhubarb
-    barbell
-    abc\nbarton
-
-/^(?<=foo\n)bar/Im
-    foo\nbarbar
-    ***Failers
-    rhubarb
-    barbell
-    abc\nbarton
-
-/(?>^abc)/Im
-    abc
-    def\nabc
-    *** Failers
-    defabc
-
-/(?<=ab(c+)d)ef/
-
-/(?<=ab(?<=c+)d)ef/
-
-/(?<=ab(c|de)f)g/
-
-/The next three are in testinput2 because they have variable length branches/
-
-/(?<=bullock|donkey)-cart/I
-    the bullock-cart
-    a donkey-cart race
-    *** Failers
-    cart
-    horse-and-cart
-
-/(?<=ab(?i)x|y|z)/I
-
-/(?>.*)(?<=(abcd)|(xyz))/I
-    alphabetabcd
-    endingxyz
-
-/(?<=ab(?i)x(?-i)y|(?i)z|b)ZZ/I
-    abxyZZ
-    abXyZZ
-    ZZZ
-    zZZ
-    bZZ
-    BZZ
-    *** Failers
-    ZZ
-    abXYZZ
-    zzz
-    bzz
-
-/(?<!(foo)a)bar/I
-    bar
-    foobbar
-    *** Failers
-    fooabar
-
-/This one is here because Perl behaves differently; see also the following/I
-
-/^(a\1?){4}$/I
-    aaaa
-    aaaaaa
-    
-/Perl does not fail these two for the final subjects. Neither did PCRE until/
-/release 8.01. The problem is in backtracking into a subpattern that contains/
-/a recursive reference to itself. PCRE has now made these into atomic patterns./
-
-/^(xa|=?\1a){2}$/
-    xa=xaa
-    ** Failers
-    xa=xaaa
-
-/^(xa|=?\1a)+$/
-    xa=xaa
-    ** Failers
-    xa=xaaa
-
-/These are syntax tests from Perl 5.005/I
-
-/a[b-a]/
-
-/a[]b/
-
-/a[/
-
-/*a/
-
-/(*)b/
-
-/abc)/
-
-/(abc/
-
-/a**/
-
-/)(/
-
-/\1/
-
-/\2/
-
-/(a)|\2/
-
-/a[b-a]/Ii
-
-/a[]b/Ii
-
-/a[/Ii
-
-/*a/Ii
-
-/(*)b/Ii
-
-/abc)/Ii
-
-/(abc/Ii
-
-/a**/Ii
-
-/)(/Ii
-
-/:(?:/
-
-/(?<%)b/
-
-/a(?{)b/
-
-/a(?{{})b/
-
-/a(?{}})b/
-
-/a(?{"{"})b/
-
-/a(?{"{"}})b/
-
-/(?(1?)a|b)/
-
-/[a[:xyz:/
-
-/(?<=x+)y/
-
-/a{37,17}/
-
-/abc/\
-
-/abc/\i
-
-/(a)bc(d)/I
-    abcd
-    abcd\C2
-    abcd\C5
-
-/(.{20})/I
-    abcdefghijklmnopqrstuvwxyz
-    abcdefghijklmnopqrstuvwxyz\C1
-    abcdefghijklmnopqrstuvwxyz\G1
-
-/(.{15})/I
-    abcdefghijklmnopqrstuvwxyz
-    abcdefghijklmnopqrstuvwxyz\C1\G1
-
-/(.{16})/I
-    abcdefghijklmnopqrstuvwxyz
-    abcdefghijklmnopqrstuvwxyz\C1\G1\L
-
-/^(a|(bc))de(f)/I
-    adef\G1\G2\G3\G4\L
-    bcdef\G1\G2\G3\G4\L
-    adefghijk\C0
-
-/^abc\00def/I
-    abc\00def\L\C0
-
-/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/I
-
-/.*X/IDZ
-
-/.*X/IDZs
-
-/(.*X|^B)/IDZ
-
-/(.*X|^B)/IDZs
-
-/(?s)(.*X|^B)/IDZ
-
-/(?s:.*X|^B)/IDZ
-
-/\Biss\B/I+
-    Mississippi
-
-/iss/IG+
-    Mississippi
-
-/\Biss\B/IG+
-    Mississippi
-
-/\Biss\B/Ig+
-    Mississippi
-    *** Failers
-    Mississippi\A
-
-/(?<=[Ms])iss/Ig+
-    Mississippi
-
-/(?<=[Ms])iss/IG+
-    Mississippi
-
-/^iss/Ig+
-    ississippi
-
-/.*iss/Ig+
-    abciss\nxyzisspqr
-
-/.i./I+g
-    Mississippi
-    Mississippi\A
-    Missouri river
-    Missouri river\A
-
-/^.is/I+g
-    Mississippi
-
-/^ab\n/Ig+
-    ab\nab\ncd
-
-/^ab\n/Img+
-    ab\nab\ncd
-
-/abc/I
-
-/abc|bac/I
-
-/(abc|bac)/I
-
-/(abc|(c|dc))/I
-
-/(abc|(d|de)c)/I
-
-/a*/I
-
-/a+/I
-
-/(baa|a+)/I
-
-/a{0,3}/I
-
-/baa{3,}/I
-
-/"([^\\"]+|\\.)*"/I
-
-/(abc|ab[cd])/I
-
-/(a|.)/I
-
-/a|ba|\w/I
-
-/abc(?=pqr)/I
-
-/...(?<=abc)/I
-
-/abc(?!pqr)/I
-
-/ab./I
-
-/ab[xyz]/I
-
-/abc*/I
-
-/ab.c*/I
-
-/a.c*/I
-
-/.c*/I
-
-/ac*/I
-
-/(a.c*|b.c*)/I
-
-/a.c*|aba/I
-
-/.+a/I
-
-/(?=abcda)a.*/I
-
-/(?=a)a.*/I
-
-/a(b)*/I
-
-/a\d*/I
-
-/ab\d*/I
-
-/a(\d)*/I
-
-/abcde{0,0}/I
-
-/ab\d+/I
-
-/a(?(1)b)(.)/I
-
-/a(?(1)bag|big)(.)/I
-
-/a(?(1)bag|big)*(.)/I
-
-/a(?(1)bag|big)+(.)/I
-
-/a(?(1)b..|b..)(.)/I
-
-/ab\d{0}e/I
-
-/a?b?/I
-    a
-    b
-    ab
-    \
-    *** Failers
-    \N
-
-/|-/I
-    abcd
-    -abc
-    \Nab-c
-    *** Failers
-    \Nabc
-
-/^.?abcd/IS
-
-/\(             # ( at start
-  (?:           # Non-capturing bracket
-  (?>[^()]+)    # Either a sequence of non-brackets (no backtracking)
-  |             # Or
-  (?R)          # Recurse - i.e. nested bracketed string
-  )*            # Zero or more contents
-  \)            # Closing )
-  /Ix
-    (abcd)
-    (abcd)xyz
-    xyz(abcd)
-    (ab(xy)cd)pqr
-    (ab(xycd)pqr
-    () abc ()
-    12(abcde(fsh)xyz(foo(bar))lmno)89
-    *** Failers
-    abcd
-    abcd)
-    (abcd
-
-/\(  ( (?>[^()]+) | (?R) )* \) /Ixg
-    (ab(xy)cd)pqr
-    1(abcd)(x(y)z)pqr
-
-/\(  (?: (?>[^()]+) | (?R) ) \) /Ix
-    (abcd)
-    (ab(xy)cd)
-    (a(b(c)d)e)
-    ((ab))
-    *** Failers
-    ()
-
-/\(  (?: (?>[^()]+) | (?R) )? \) /Ix
-    ()
-    12(abcde(fsh)xyz(foo(bar))lmno)89
-
-/\(  ( (?>[^()]+) | (?R) )* \) /Ix
-    (ab(xy)cd)
-
-/\( ( ( (?>[^()]+) | (?R) )* ) \) /Ix
-    (ab(xy)cd)
-
-/\( (123)? ( ( (?>[^()]+) | (?R) )* ) \) /Ix
-    (ab(xy)cd)
-    (123ab(xy)cd)
-
-/\( ( (123)? ( (?>[^()]+) | (?R) )* ) \) /Ix
-    (ab(xy)cd)
-    (123ab(xy)cd)
-
-/\( (((((((((( ( (?>[^()]+) | (?R) )* )))))))))) \) /Ix
-    (ab(xy)cd)
-
-/\( ( ( (?>[^()<>]+) | ((?>[^()]+)) | (?R) )* ) \) /Ix
-    (abcd(xyz<p>qrs)123)
-
-/\( ( ( (?>[^()]+) | ((?R)) )* ) \) /Ix
-    (ab(cd)ef)
-    (ab(cd(ef)gh)ij)
-
-/^[[:alnum:]]/DZ
-
-/^[[:^alnum:]]/DZ
-
-/^[[:alpha:]]/DZ
-
-/^[[:^alpha:]]/DZ
-
-/[_[:alpha:]]/IS
-
-/^[[:ascii:]]/DZ
-
-/^[[:^ascii:]]/DZ
-
-/^[[:blank:]]/DZ
-
-/^[[:^blank:]]/DZ
-
-/[\n\x0b\x0c\x0d[:blank:]]/IS
-
-/^[[:cntrl:]]/DZ
-
-/^[[:digit:]]/DZ
-
-/^[[:graph:]]/DZ
-
-/^[[:lower:]]/DZ
-
-/^[[:print:]]/DZ
-
-/^[[:punct:]]/DZ
-
-/^[[:space:]]/DZ
-
-/^[[:upper:]]/DZ
-
-/^[[:xdigit:]]/DZ
-
-/^[[:word:]]/DZ
-
-/^[[:^cntrl:]]/DZ
-
-/^[12[:^digit:]]/DZ
-
-/^[[:^blank:]]/DZ
-
-/[01[:alpha:]%]/DZ
-
-/[[.ch.]]/I
-
-/[[=ch=]]/I
-
-/[[:rhubarb:]]/I
-
-/[[:upper:]]/Ii
-    A
-    a
-
-/[[:lower:]]/Ii
-    A
-    a
-
-/((?-i)[[:lower:]])[[:lower:]]/Ii
-    ab
-    aB
-    *** Failers
-    Ab
-    AB
-
-/[\200-\110]/I
-
-/^(?(0)f|b)oo/I
-
-/This one's here because of the large output vector needed/I
-
-/(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\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)/I
-    \O900 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 ABC ABC
-
-/This one's here because Perl does this differently and PCRE can't at present/I
-
-/(main(O)?)+/I
-    mainmain
-    mainOmain
-
-/These are all cases where Perl does it differently (nested captures)/I
-
-/^(a(b)?)+$/I
-    aba
-
-/^(aa(bb)?)+$/I
-    aabbaa
-
-/^(aa|aa(bb))+$/I
-    aabbaa
-
-/^(aa(bb)??)+$/I
-    aabbaa
-
-/^(?:aa(bb)?)+$/I
-    aabbaa
-
-/^(aa(b(b))?)+$/I
-    aabbaa
-
-/^(?:aa(b(b))?)+$/I
-    aabbaa
-
-/^(?:aa(b(?:b))?)+$/I
-    aabbaa
-
-/^(?:aa(bb(?:b))?)+$/I
-    aabbbaa
-
-/^(?:aa(b(?:bb))?)+$/I
-    aabbbaa
-
-/^(?:aa(?:b(b))?)+$/I
-    aabbaa
-
-/^(?:aa(?:b(bb))?)+$/I
-    aabbbaa
-
-/^(aa(b(bb))?)+$/I
-    aabbbaa
-
-/^(aa(bb(bb))?)+$/I
-    aabbbbaa
-
-/--------------------------------------------------------------------/I
-
-/#/IxDZ
-
-/a#/IxDZ
-
-/[\s]/DZ
-
-/[\S]/DZ
-
-/a(?i)b/DZ
-    ab
-    aB
-    *** Failers
-    AB
-
-/(a(?i)b)/DZ
-    ab
-    aB
-    *** Failers
-    AB
-
-/   (?i)abc/IxDZ
-
-/#this is a comment
-  (?i)abc/IxDZ
-
-/123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890/DZ
-
-/\Q123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890/DZ
-
-/\Q\E/DZ
-    \
-
-/\Q\Ex/DZ
-
-/ \Q\E/DZ
-
-/a\Q\E/DZ
-  abc
-  bca
-  bac
-
-/a\Q\Eb/DZ
-  abc
-
-/\Q\Eabc/DZ
-
-/x*+\w/DZ
-    *** Failers
-    xxxxx
-
-/x?+/DZ
-
-/x++/DZ
-
-/x{1,3}+/BZO
-
-/x{1,3}+/BZOi
-
-/[^x]{1,3}+/BZO
-
-/[^x]{1,3}+/BZOi
-
-/(x)*+/DZ
-
-/^(\w++|\s++)*$/I
-    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)/I
-    12345a
-    *** Failers
-    12345+
-
-/a++b/I
-    aaab
-
-/(a++b)/I
-    aaab
-
-/(a++)b/I
-    aaab
-
-/([^()]++|\([^()]*\))+/I
-    ((abc(ade)ufh()()x
-
-/\(([^()]++|\([^()]+\))+\)/I
-    (abc)
-    (abc(def)xyz)
-    *** Failers
-    ((()aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-
-/(abc){1,3}+/DZ
-
-/a+?+/I
-
-/a{2,3}?+b/I
-
-/(?U)a+?+/I
-
-/a{2,3}?+b/IU
-
-/x(?U)a++b/DZ
-    xaaaab
-
-/(?U)xa++b/DZ
-    xaaaab
-
-/^((a+)(?U)([ab]+)(?-U)([bc]+)(\w*))/DZ
-
-/^x(?U)a+b/DZ
-
-/^x(?U)(a+)b/DZ
-
-/[.x.]/I
-
-/[=x=]/I
-
-/[:x:]/I
-
-/\l/I
-
-/\L/I
-
-/\N{name}/I
-
-/\u/I
-
-/\U/I
-
-/a{1,3}b/U
-    ab
-
-/[/I
-
-/[a-/I
-
-/[[:space:]/I
-
-/[\s]/IDZ
-
-/[[:space:]]/IDZ
-
-/[[:space:]abcde]/IDZ
-
-/< (?: (?(R) \d++  | [^<>]*+) | (?R)) * >/Ix
-    <>
-    <abcd>
-    <abc <123> hij>
-    <abc <def> hij>
-    <abc<>def>
-    <abc<>
-    *** Failers
-    <abc
-
-|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|IDZ
-
-|\$\<\.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|IDZ
-
-/(.*)\d+\1/I
-
-/(.*)\d+/I
-
-/(.*)\d+\1/Is
-
-/(.*)\d+/Is
-
-/(.*(xyz))\d+\2/I
-
-/((.*))\d+\1/I
-    abc123bc
-
-/a[b]/I
-
-/(?=a).*/I
-
-/(?=abc).xyz/IiI
-
-/(?=abc)(?i).xyz/I
-
-/(?=a)(?=b)/I
-
-/(?=.)a/I
-
-/((?=abcda)a)/I
-
-/((?=abcda)ab)/I
-
-/()a/I
-
-/(?(1)ab|ac)(.)/I
-
-/(?(1)abz|acz)(.)/I
-
-/(?(1)abz)(.)/I
-
-/(?(1)abz)(1)23/I
-
-/(a)+/I
-
-/(a){2,3}/I
-
-/(a)*/I
-
-/[a]/I
-
-/[ab]/I
-
-/[ab]/IS
-
-/[^a]/I
-
-/\d456/I
-
-/\d456/IS
-
-/a^b/I
-
-/^a/Im
-  abcde
-  xy\nabc
-  *** Failers
-  xyabc
-
-/c|abc/I
-
-/(?i)[ab]/IS
-
-/[ab](?i)cd/IS
-
-/abc(?C)def/I
-    abcdef
-    1234abcdef
-    *** Failers
-    abcxyz
-    abcxyzf
-
-/abc(?C)de(?C1)f/I
-    123abcdef
-
-/(?C1)\dabc(?C2)def/IS
-    1234abcdef
-    *** Failers
-    abcdef
-
-/(?C1)\dabc(?C2)def/ISS
-    1234abcdef
-    *** Failers
-    abcdef
-
-/(?C255)ab/I
-
-/(?C256)ab/I
-
-/(?Cab)xx/I
-
-/(?C12vr)x/I
-
-/abc(?C)def/I
-    *** Failers
-    \x83\x0\x61bcdef
-
-/(abc)(?C)de(?C1)f/I
-    123abcdef
-    123abcdef\C+
-    123abcdef\C-
-    *** Failers
-    123abcdef\C!1
-
-/(?C0)(abc(?C1))*/I
-    abcabcabc
-    abcabc\C!1!3
-    *** Failers
-    abcabcabc\C!1!3
-
-/(\d{3}(?C))*/I
-    123\C+
-    123456\C+
-    123456789\C+
-
-/((xyz)(?C)p|(?C1)xyzabc)/I
-    xyzabc\C+
-
-/(X)((xyz)(?C)p|(?C1)xyzabc)/I
-    Xxyzabc\C+
-
-/(?=(abc))(?C)abcdef/I
-    abcdef\C+
-
-/(?!(abc)(?C1)d)(?C2)abcxyz/I
-    abcxyz\C+
-
-/(?<=(abc)(?C))xyz/I
-   abcxyz\C+
-
-/a(b+)(c*)(?C1)/I
-    abbbbbccc\C*1
-
-/a(b+?)(c*?)(?C1)/I
-    abbbbbccc\C*1
-
-/(?C)abc/I
-
-/(?C)^abc/I
-
-/(?C)a|b/IS
-
-/(?R)/I
-
-/(a|(?R))/I
-
-/(ab|(bc|(de|(?R))))/I
-
-/x(ab|(bc|(de|(?R))))/I
-    xab
-    xbc
-    xde
-    xxab
-    xxxab
-    *** Failers
-    xyab
-
-/(ab|(bc|(de|(?1))))/I
-
-/x(ab|(bc|(de|(?1)x)x)x)/I
-
-/^([^()]|\((?1)*\))*$/I
-    abc
-    a(b)c
-    a(b(c))d
-    *** Failers)
-    a(b(c)d
-
-/^>abc>([^()]|\((?1)*\))*<xyz<$/I
-   >abc>123<xyz<
-   >abc>1(2)3<xyz<
-   >abc>(1(2)3)<xyz<
-
-/(a(?1)b)/DZ
-
-/(a(?1)+b)/DZ
-
-/^(\d+|\((?1)([+*-])(?1)\)|-(?1))$/I
-    12
-    (((2+2)*-3)-7)
-    -12
-    *** Failers
-    ((2+2)*-3)-7)
-
-/^(x(y|(?1){2})z)/I
-    xyz
-    xxyzxyzz
-    *** Failers
-    xxyzz
-    xxyzxyzxyzz
-
-/((< (?: (?(R) \d++  | [^<>]*+) | (?2)) * >))/Ix
-    <>
-    <abcd>
-    <abc <123> hij>
-    <abc <def> hij>
-    <abc<>def>
-    <abc<>
-    *** Failers
-    <abc
-
-/(?1)/I
-
-/((?2)(abc)/I
-
-/^(abc)def(?1)/I
-    abcdefabc
-
-/^(a|b|c)=(?1)+/I
-    a=a
-    a=b
-    a=bc
-
-/^(a|b|c)=((?1))+/I
-    a=a
-    a=b
-    a=bc
-
-/a(?P<name1>b|c)d(?P<longername2>e)/DZ
-    abde
-    acde
-
-/(?:a(?P<c>c(?P<d>d)))(?P<a>a)/DZ
-
-/(?P<a>a)...(?P=a)bbb(?P>a)d/DZ
-
-/^\W*(?:(?P<one>(?P<two>.)\W*(?P>one)\W*(?P=two)|)|(?P<three>(?P<four>.)\W*(?P>three)\W*(?P=four)|\W*.\W*))\W*$/Ii
-    1221
-    Satan, oscillate my metallic sonatas!
-    A man, a plan, a canal: Panama!
-    Able was I ere I saw Elba.
-    *** Failers
-    The quick brown fox
-
-/((?(R)a|b))\1(?1)?/I
-  bb
-  bbaa
-
-/(.*)a/Is
-
-/(.*)a\1/Is
-
-/(.*)a(b)\2/Is
-
-/((.*)a|(.*)b)z/Is
-
-/((.*)a|(.*)b)z\1/Is
-
-/((.*)a|(.*)b)z\2/Is
-
-/((.*)a|(.*)b)z\3/Is
-
-/((.*)a|^(.*)b)z\3/Is
-
-/(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)a/Is
-
-/(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)a\31/Is
-
-/(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)a\32/Is
-
-/(a)(bc)/INDZ
-  abc
-
-/(?P<one>a)(bc)/INDZ
-  abc
-
-/(a)(?P<named>bc)/INDZ
-
-/(a+)*zz/I
-  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazzbbbbbb\M
-  aaaaaaaaaaaaaz\M
-
-/(aaa(?C1)bbb|ab)/I
-   aaabbb
-   aaabbb\C*0
-   aaabbb\C*1
-   aaabbb\C*-1
-
-/ab(?P<one>cd)ef(?P<two>gh)/I
-    abcdefgh
-    abcdefgh\C1\Gtwo
-    abcdefgh\Cone\Ctwo
-    abcdefgh\Cthree
-
-/(?P<Tes>)(?P<Test>)/DZ
-
-/(?P<Test>)(?P<Tes>)/DZ
-
-/(?P<Z>zz)(?P<A>aa)/I
-    zzaa\CZ
-    zzaa\CA
-
-/(?P<x>eks)(?P<x>eccs)/I
-
-/(?P<abc>abc(?P<def>def)(?P<abc>xyz))/I
-
-"\[((?P<elem>\d+)(,(?P>elem))*)\]"I
-    [10,20,30,5,5,4,4,2,43,23,4234]
-    *** Failers
-    []
-
-"\[((?P<elem>\d+)(,(?P>elem))*)?\]"I
-    [10,20,30,5,5,4,4,2,43,23,4234]
-    []
-
-/(a(b(?2)c))?/DZ
-
-/(a(b(?2)c))*/DZ
-
-/(a(b(?2)c)){0,2}/DZ
-
-/[ab]{1}+/DZ
-
-/((w\/|-|with)*(free|immediate)*.*?shipping\s*[!.-]*)/Ii
-     Baby Bjorn Active Carrier - With free SHIPPING!!
-
-/((w\/|-|with)*(free|immediate)*.*?shipping\s*[!.-]*)/IiS
-     Baby Bjorn Active Carrier - With free SHIPPING!!
-
-/a*.*b/ISDZ
-
-/(a|b)*.?c/ISDZ
-
-/abc(?C255)de(?C)f/DZ
-
-/abcde/ICDZ
-  abcde
-  abcdfe
-
-/a*b/ICDZS
-  ab
-  aaaab
-  aaaacb
-
-/a*b/ICDZSS
-  ab
-  aaaab
-  aaaacb
-
-/a+b/ICDZ
-  ab
-  aaaab
-  aaaacb
-
-/(abc|def)x/ICDZS
-  abcx
-  defx
-  ** Failers 
-  abcdefzx
-
-/(abc|def)x/ICDZSS
-  abcx
-  defx
-  ** Failers 
-  abcdefzx
-
-/(ab|cd){3,4}/IC
-  ababab
-  abcdabcd
-  abcdcdcdcdcd
-
-/([ab]{,4}c|xy)/ICDZS
-    Note: that { does NOT introduce a quantifier
-
-/([ab]{,4}c|xy)/ICDZSS
-    Note: that { does NOT introduce a quantifier
-
-/([ab]{1,4}c|xy){4,5}?123/ICDZ
-    aacaacaacaacaac123
-
-/\b.*/I
-  ab cd\>1
-
-/\b.*/Is
-  ab cd\>1
-
-/(?!.bcd).*/I
-  Xbcd12345
-
-/abcde/I
-    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$"I
-    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/I
-    123\P
-    a\P
-    b\P
-    c\P
-    c12\P
-    c123\P
-
-/^(?:\d){3,5}X/I
-    1\P
-    123\P
-    123X
-    1234\P
-    1234X
-    12345\P
-    12345X
-    *** Failers
-    1X
-    123456\P
-
-//KF>testsavedregex
-
-/abc/IS>testsavedregex
-<testsavedregex
-    abc
-    ** Failers
-    bca
-
-/abc/ISS>testsavedregex
-<testsavedregex
-    abc
-    ** Failers
-    bca
-
-/abc/IFS>testsavedregex
-<testsavedregex
-    abc
-    ** Failers
-    bca
-
-/abc/IFSS>testsavedregex
-<testsavedregex
-    abc
-    ** Failers
-    bca
-
-/(a|b)/IS>testsavedregex
-<testsavedregex
-    abc
-    ** Failers
-    def
-
-/(a|b)/ISS>testsavedregex
-<testsavedregex
-    abc
-    ** Failers
-    def
-
-/(a|b)/ISF>testsavedregex
-<testsavedregex
-    abc
-    ** Failers
-    def
-
-/(a|b)/ISSF>testsavedregex
-<testsavedregex
-    abc
-    ** Failers
-    def
-
-~<(\w+)/?>(.)*</(\1)>~smgI
-    \J1024<!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/I
-    this is a line\nbreak
-    line one\nthis is a line\nbreak in the second line
-
-/line\nbreak/If
-    this is a line\nbreak
-    ** Failers
-    line one\nthis is a line\nbreak in the second line
-
-/line\nbreak/Imf
-    this is a line\nbreak
-    ** Failers
-    line one\nthis is a line\nbreak in the second line
-
-/(?i)(?-i)AbCd/I
-    AbCd
-    ** Failers
-    abcd
-
-/a{11111111111111111111}/I
-
-/(){64294967295}/I
-
-/(){2,4294967295}/I
-
-"(?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"I
-    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"I
-    abcdefghijklAkB
-
-"(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)(l)A\11B"I
-    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)"I
-    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)"I
-    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-
-/[^()]*(?:\((?R)\)[^()]*)*/I
-    (this(and)that
-    (this(and)that)
-    (this(and)that)stuff
-
-/[^()]*(?:\((?>(?R))\)[^()]*)*/I
-    (this(and)that
-    (this(and)that)
-
-/[^()]*(?:\((?R)\))*[^()]*/I
-    (this(and)that
-    (this(and)that)
-
-/(?:\((?R)\))*[^()]*/I
-    (this(and)that
-    (this(and)that)
-    ((this))
-
-/(?:\((?R)\))|[^()]*/I
-    (this(and)that
-    (this(and)that)
-    (this)
-    ((this))
-
-/\x{0000ff}/I
-
-/^((?P<A>a1)|(?P<A>a2)b)/I
-
-/^((?P<A>a1)|(?P<A>a2)b)/IJ
-    a1b\CA
-    a2b\CA
-    ** Failers
-    a1b\CZ\CA
-    
-/(?|(?<a>)(?<b>)(?<a>)|(?<a>)(?<b>)(?<a>))/IJ
-
-/^(?P<A>a)(?P<A>b)/IJ
-    ab\CA
-
-/^(?P<A>a)(?P<A>b)|cd/IJ
-    ab\CA
-    cd\CA
-
-/^(?P<A>a)(?P<A>b)|cd(?P<A>ef)(?P<A>gh)/IJ
-    cdefgh\CA
-
-/^((?P<A>a1)|(?P<A>a2)b)/IJ
-    a1b\GA
-    a2b\GA
-    ** Failers
-    a1b\GZ\GA
-
-/^(?P<A>a)(?P<A>b)/IJ
-    ab\GA
-
-/^(?P<A>a)(?P<A>b)|cd/IJ
-    ab\GA
-    cd\GA
-
-/^(?P<A>a)(?P<A>b)|cd(?P<A>ef)(?P<A>gh)/IJ
-    cdefgh\GA
-
-/(?J)^((?P<A>a1)|(?P<A>a2)b)/I
-    a1b\CA
-    a2b\CA
-
-/^(?P<A>a) (?J:(?P<B>b)(?P<B>c)) (?P<A>d)/I
-
-/ In this next test, J is not set at the outer level; consequently it isn't
-set in the pattern's options; consequently pcre_get_named_substring() produces
-a random value. /Ix
-
-/^(?P<A>a) (?J:(?P<B>b)(?P<B>c)) (?P<C>d)/I
-    a bc d\CA\CB\CC
-
-/^(?P<A>a)?(?(A)a|b)/I
-    aabc
-    bc
-    ** Failers
-    abc
-
-/(?:(?(ZZ)a|b)(?P<ZZ>X))+/I
-    bXaX
-
-/(?:(?(2y)a|b)(X))+/I
-
-/(?:(?(ZA)a|b)(?P<ZZ>X))+/I
-
-/(?:(?(ZZ)a|b)(?(ZZ)a|b)(?P<ZZ>X))+/I
-    bbXaaX
-
-/(?:(?(ZZ)a|\(b\))\\(?P<ZZ>X))+/I
-    (b)\\Xa\\X
-
-/(?P<ABC/I
-
-/(?:(?(A)(?P=A)a|b)(?P<A>X|Y))+/I
-    bXXaYYaY
-    bXYaXXaX
-
-/()()()()()()()()()(?:(?(A)(?P=A)a|b)(?P<A>X|Y))+/I
-    bXXaYYaY
-
-/\s*,\s*/IS
-    \x0b,\x0b
-    \x0c,\x0d
-
-/^abc/Im
-    xyz\nabc
-    xyz\nabc\<lf>
-    xyz\r\nabc\<lf>
-    xyz\rabc\<cr>
-    xyz\r\nabc\<crlf>
-    ** Failers
-    xyz\nabc\<cr>
-    xyz\r\nabc\<cr>
-    xyz\nabc\<crlf>
-    xyz\rabc\<crlf>
-    xyz\rabc\<lf>
-
-/abc$/Im<lf>
-    xyzabc
-    xyzabc\n
-    xyzabc\npqr
-    xyzabc\r\<cr>
-    xyzabc\rpqr\<cr>
-    xyzabc\r\n\<crlf>
-    xyzabc\r\npqr\<crlf>
-    ** Failers
-    xyzabc\r
-    xyzabc\rpqr
-    xyzabc\r\n
-    xyzabc\r\npqr
-
-/^abc/Im<cr>
-    xyz\rabcdef
-    xyz\nabcdef\<lf>
-    ** Failers
-    xyz\nabcdef
-
-/^abc/Im<lf>
-    xyz\nabcdef
-    xyz\rabcdef\<cr>
-    ** Failers
-    xyz\rabcdef
-
-/^abc/Im<crlf>
-    xyz\r\nabcdef
-    xyz\rabcdef\<cr>
-    ** Failers
-    xyz\rabcdef
-
-/^abc/Im<bad>
-
-/abc/I
-    xyz\rabc\<bad>
-    abc
-
-/.*/I<lf>
-    abc\ndef
-    abc\rdef
-    abc\r\ndef
-    \<cr>abc\ndef
-    \<cr>abc\rdef
-    \<cr>abc\r\ndef
-    \<crlf>abc\ndef
-    \<crlf>abc\rdef
-    \<crlf>abc\r\ndef
-
-/\w+(.)(.)?def/Is
-    abc\ndef
-    abc\rdef
-    abc\r\ndef
-
-+((?:\s|//.*\\n|/[*](?:\\n|.)*?[*]/)*)+I
-   /* this is a C style comment */\M
-
-/(?P<B>25[0-5]|2[0-4]\d|[01]?\d?\d)(?:\.(?P>B)){3}/I
-
-/()()()()()()()()()()()()()()()()()()()()
- ()()()()()()()()()()()()()()()()()()()()
- ()()()()()()()()()()()()()()()()()()()()
- ()()()()()()()()()()()()()()()()()()()()
- ()()()()()()()()()()()()()()()()()()()()
- (.(.))/Ix
-    XY\O400
-
-/(a*b|(?i:c*(?-i)d))/IS
-
-/()[ab]xyz/IS
-
-/(|)[ab]xyz/IS
-
-/(|c)[ab]xyz/IS
-
-/(|c?)[ab]xyz/IS
-
-/(d?|c?)[ab]xyz/IS
-
-/(d?|c)[ab]xyz/IS
-
-/^a*b\d/DZ
-
-/^a*+b\d/DZ
-
-/^a*?b\d/DZ
-
-/^a+A\d/DZ
-    aaaA5
-    ** Failers
-    aaaa5
-
-/^a*A\d/IiDZ
-    aaaA5
-    aaaa5
-
-/(a*|b*)[cd]/IS
-
-/(a+|b*)[cd]/IS
-
-/(a*|b+)[cd]/IS
-
-/(a+|b+)[cd]/IS
-
-/((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
- ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
- (((
- a
- ))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
- ))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
- )))
-/Ix
-  large nest
-
-/a*\d/BZ
-
-/a*\D/BZ
-
-/0*\d/BZ
-
-/0*\D/BZ
-
-/a*\s/BZ
-
-/a*\S/BZ
-
-/ *\s/BZ
-
-/ *\S/BZ
-
-/a*\w/BZ
-
-/a*\W/BZ
-
-/=*\w/BZ
-
-/=*\W/BZ
-
-/\d*a/BZ
-
-/\d*2/BZ
-
-/\d*\d/BZ
-
-/\d*\D/BZ
-
-/\d*\s/BZ
-
-/\d*\S/BZ
-
-/\d*\w/BZ
-
-/\d*\W/BZ
-
-/\D*a/BZ
-
-/\D*2/BZ
-
-/\D*\d/BZ
-
-/\D*\D/BZ
-
-/\D*\s/BZ
-
-/\D*\S/BZ
-
-/\D*\w/BZ
-
-/\D*\W/BZ
-
-/\s*a/BZ
-
-/\s*2/BZ
-
-/\s*\d/BZ
-
-/\s*\D/BZ
-
-/\s*\s/BZ
-
-/\s*\S/BZ
-
-/\s*\w/BZ
-
-/\s*\W/BZ
-
-/\S*a/BZ
-
-/\S*2/BZ
-
-/\S*\d/BZ
-
-/\S*\D/BZ
-
-/\S*\s/BZ
-
-/\S*\S/BZ
-
-/\S*\w/BZ
-
-/\S*\W/BZ
-
-/\w*a/BZ
-
-/\w*2/BZ
-
-/\w*\d/BZ
-
-/\w*\D/BZ
-
-/\w*\s/BZ
-
-/\w*\S/BZ
-
-/\w*\w/BZ
-
-/\w*\W/BZ
-
-/\W*a/BZ
-
-/\W*2/BZ
-
-/\W*\d/BZ
-
-/\W*\D/BZ
-
-/\W*\s/BZ
-
-/\W*\S/BZ
-
-/\W*\w/BZ
-
-/\W*\W/BZ
-
-/[^a]+a/BZ
-
-/[^a]+a/BZi
-
-/[^a]+A/BZi
-
-/[^a]+b/BZ
-
-/[^a]+\d/BZ
-
-/a*[^a]/BZ
-
-/(?P<abc>x)(?P<xyz>y)/I
-    xy\Cabc\Cxyz
-
-/(?<abc>x)(?'xyz'y)/I
-    xy\Cabc\Cxyz
-
-/(?<abc'x)(?'xyz'y)/I
-
-/(?<abc>x)(?'xyz>y)/I
-
-/(?P'abc'x)(?P<xyz>y)/I
-
-/^(?:(?(ZZ)a|b)(?<ZZ>X))+/
-    bXaX
-    bXbX
-    ** Failers
-    aXaX
-    aXbX
-
-/^(?P>abc)(?<abcd>xxx)/
-
-/^(?P>abc)(?<abc>x|y)/
-    xx
-    xy
-    yy
-    yx
-
-/^(?P>abc)(?P<abc>x|y)/
-    xx
-    xy
-    yy
-    yx
-
-/^((?(abc)a|b)(?<abc>x|y))+/
-    bxay
-    bxby
-    ** Failers
-    axby
-
-/^(((?P=abc)|X)(?<abc>x|y))+/
-    XxXxxx
-    XxXyyx
-    XxXyxx
-    ** Failers
-    x
-
-/^(?1)(abc)/
-    abcabc
-
-/^(?:(?:\1|X)(a|b))+/
-    Xaaa
-    Xaba
-
-/^[\E\Qa\E-\Qz\E]+/BZ
-
-/^[a\Q]bc\E]/BZ
-
-/^[a-\Q\E]/BZ
-
-/^(?P>abc)[()](?<abc>)/BZ
-
-/^((?(abc)y)[()](?P<abc>x))+/BZ
-    (xy)x
-
-/^(?P>abc)\Q()\E(?<abc>)/BZ
-
-/^(?P>abc)[a\Q(]\E(](?<abc>)/BZ
-
-/^(?P>abc) # this is (a comment)
-  (?<abc>)/BZx
-
-/^\W*(?:(?<one>(?<two>.)\W*(?&one)\W*\k<two>|)|(?<three>(?<four>.)\W*(?&three)\W*\k'four'|\W*.\W*))\W*$/Ii
-    1221
-    Satan, oscillate my metallic sonatas!
-    A man, a plan, a canal: Panama!
-    Able was I ere I saw Elba.
-    *** Failers
-    The quick brown fox
-
-/(?=(\w+))\1:/I
-    abcd:
-
-/(?=(?'abc'\w+))\k<abc>:/I
-    abcd:
-
-/(?'abc'a|b)(?<abc>d|e)\k<abc>{2}/J
-    adaa
-    ** Failers
-    addd
-    adbb
-
-/(?'abc'a|b)(?<abc>d|e)(?&abc){2}/J
-    bdaa
-    bdab
-    ** Failers
-    bddd
-
-/(?(<bc))/
-
-/(?(''))/
-
-/(?('R')stuff)/
-
-/((abc (?(R) (?(R1)1) (?(R2)2) X  |  (?1)  (?2)   (?R) ))) /x
-    abcabc1Xabc2XabcXabcabc
-
-/(?<A> (?'B' abc (?(R) (?(R&A)1) (?(R&B)2) X  |  (?1)  (?2)   (?R) ))) /x
-    abcabc1Xabc2XabcXabcabc
-
-/(?<A> (?'B' abc (?(R) (?(R&C)1) (?(R&B)2) X  |  (?1)  (?2)   (?R) ))) /x
-
-/^(?(DEFINE) abc | xyz ) /x
-
-/(?(DEFINE) abc) xyz/xI
-
-/(a|)*\d/
-  \O0aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-  \O0aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4
-
-/^a.b/<lf>
-    a\rb
-    a\nb\<cr>
-    a\x85b\<anycrlf> 
-    ** Failers
-    a\nb
-    a\nb\<any>
-    a\rb\<cr>
-    a\rb\<any>
-    a\x85b\<any> 
-    a\rb\<anycrlf>
-
-/^abc./mgx<any>
-    abc1 \x0aabc2 \x0babc3xx \x0cabc4 \x0dabc5xx \x0d\x0aabc6 \x85abc7 JUNK
-
-/abc.$/mgx<any>
-    abc1\x0a abc2\x0b abc3\x0c abc4\x0d abc5\x0d\x0a abc6\x85 abc7 abc9
-
-/a/<cr><any>
-
-/a/<any><crlf>
-
-/^a\Rb/<bsr_unicode>
-    a\nb
-    a\rb
-    a\r\nb
-    a\x0bb
-    a\x0cb
-    a\x85b
-    ** Failers
-    a\n\rb
-
-/^a\R*b/<bsr_unicode>
-    ab
-    a\nb
-    a\rb
-    a\r\nb
-    a\x0bb
-    a\x0cb
-    a\x85b
-    a\n\rb
-    a\n\r\x85\x0cb
-
-/^a\R+b/<bsr_unicode>
-    a\nb
-    a\rb
-    a\r\nb
-    a\x0bb
-    a\x0cb
-    a\x85b
-    a\n\rb
-    a\n\r\x85\x0cb
-    ** Failers
-    ab
-
-/^a\R{1,3}b/<bsr_unicode>
-    a\nb
-    a\n\rb
-    a\n\r\x85b
-    a\r\n\r\nb
-    a\r\n\r\n\r\nb
-    a\n\r\n\rb
-    a\n\n\r\nb
-    ** Failers
-    a\n\n\n\rb
-    a\r
-
-/^a[\R]b/<bsr_unicode>
-    aRb
-    ** Failers
-    a\nb
-
-/(?&abc)X(?<abc>P)/I
-    abcPXP123
-
-/(?1)X(?<abc>P)/I
-    abcPXP123
-
-/(?:a(?&abc)b)*(?<abc>x)/
-    123axbaxbaxbx456
-    123axbaxbaxb456
-
-/(?:a(?&abc)b){1,5}(?<abc>x)/
-    123axbaxbaxbx456
-
-/(?:a(?&abc)b){2,5}(?<abc>x)/
-    123axbaxbaxbx456
-
-/(?:a(?&abc)b){2,}(?<abc>x)/
-    123axbaxbaxbx456
-
-/(abc)(?i:(?1))/
-   defabcabcxyz
-   DEFabcABCXYZ
-
-/(abc)(?:(?i)(?1))/
-   defabcabcxyz
-   DEFabcABCXYZ
-
-/^(a)\g-2/
-
-/^(a)\g/
-
-/^(a)\g{0}/
-
-/^(a)\g{3/
-
-/^(a)\g{aa}/
-
-/^a.b/<lf>
-    a\rb
-    *** Failers
-    a\nb
-
-/.+foo/
-    afoo
-    ** Failers
-    \r\nfoo
-    \nfoo
-
-/.+foo/<crlf>
-    afoo
-    \nfoo
-    ** Failers
-    \r\nfoo
-
-/.+foo/<any>
-    afoo
-    ** Failers
-    \nfoo
-    \r\nfoo
-
-/.+foo/s
-    afoo
-    \r\nfoo
-    \nfoo
-    
-/^$/mg<any>
-    abc\r\rxyz
-    abc\n\rxyz  
-    ** Failers 
-    abc\r\nxyz
-
-/(?m)^$/<any>g+
-    abc\r\n\r\n
-
-/(?m)^$|^\r\n/<any>g+ 
-    abc\r\n\r\n
-    
-/(?m)$/<any>g+ 
-    abc\r\n\r\n
-
-/abc.$/mgx<anycrlf>
-    abc1\x0a abc2\x0b abc3\x0c abc4\x0d abc5\x0d\x0a abc6\x85 abc9
-
-/^X/m
-    XABC
-    ** Failers 
-    XABC\B
-
-/(ab|c)(?-1)/BZ
-    abc
-
-/xy(?+1)(abc)/BZ
-    xyabcabc
-    ** Failers
-    xyabc  
-    
-/x(?-0)y/
-
-/x(?-1)y/
-
-/x(?+0)y/ 
-
-/x(?+1)y/
-
-/^(abc)?(?(-1)X|Y)/BZ
-    abcX
-    Y
-    ** Failers
-    abcY   
-    
-/^((?(+1)X|Y)(abc))+/BZ 
-    YabcXabc
-    YabcXabcXabc
-    ** Failers
-    XabcXabc  
-
-/(?(-1)a)/BZ
-
-/((?(-1)a))/BZ
-
-/((?(-2)a))/BZ
-
-/^(?(+1)X|Y)(.)/BZ
-    Y!
-
-/(?<A>tom|bon)-\k{A}/
-    tom-tom
-    bon-bon 
-    ** Failers
-    tom-bon  
-
-/\g{A/ 
-
-/(?|(abc)|(xyz))/BZ
-   >abc<
-   >xyz< 
-
-/(x)(?|(abc)|(xyz))(x)/BZ
-    xabcx
-    xxyzx 
-
-/(x)(?|(abc)(pqr)|(xyz))(x)/BZ
-    xabcpqrx
-    xxyzx 
-
-/\H++X/BZ
-    ** Failers
-    XXXX
-    
-/\H+\hY/BZ
-    XXXX Y 
-
-/\H+ Y/BZ
-
-/\h+A/BZ
-
-/\v*B/BZ
-
-/\V+\x0a/BZ
-
-/A+\h/BZ
-
-/ *\H/BZ
-
-/A*\v/BZ
-
-/\x0b*\V/BZ
-
-/\d+\h/BZ
-
-/\d*\v/BZ
-
-/S+\h\S+\v/BZ
-
-/\w{3,}\h\w+\v/BZ
-
-/\h+\d\h+\w\h+\S\h+\H/BZ
-
-/\v+\d\v+\w\v+\S\v+\V/BZ
-
-/\H+\h\H+\d/BZ
-
-/\V+\v\V+\w/BZ
-
-/\( (?: [^()]* | (?R) )* \)/x
-\J1024(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(00)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)
-
-/[\E]AAA/
-
-/[\Q\E]AAA/
-
-/[^\E]AAA/
-
-/[^\Q\E]AAA/
-
-/[\E^]AAA/
-
-/[\Q\E^]AAA/
-
-/A(*PRUNE)B(*SKIP)C(*THEN)D(*COMMIT)E(*F)F(*FAIL)G(?!)H(*ACCEPT)I/BZ
-
-/^a+(*FAIL)/C
-    aaaaaa
-    
-/a+b?c+(*FAIL)/C
-    aaabccc
-
-/a+b?(*PRUNE)c+(*FAIL)/C
-    aaabccc
-
-/a+b?(*COMMIT)c+(*FAIL)/C
-    aaabccc
-    
-/a+b?(*SKIP)c+(*FAIL)/C
-    aaabcccaaabccc
-
-/a+b?(*THEN)c+(*FAIL)/C
-    aaabccc
-    
-/a(*MARK)b/ 
-
-/(?i:A{1,}\6666666666)/
-
-/\g6666666666/
-
-/[\g6666666666]/BZ
-
-/(?1)\c[/
-
-/.+A/<crlf>
-    \r\nA
-    
-/\nA/<crlf>
-    \r\nA 
-
-/[\r\n]A/<crlf>
-    \r\nA 
-
-/(\r|\n)A/<crlf>
-    \r\nA 
-
-/a(*CR)b/
-
-/(*CR)a.b/
-    a\nb
-    ** Failers
-    a\rb  
-
-/(*CR)a.b/<lf>
-    a\nb
-    ** Failers
-    a\rb  
-
-/(*LF)a.b/<CRLF>
-    a\rb
-    ** Failers
-    a\nb  
-
-/(*CRLF)a.b/
-    a\rb
-    a\nb  
-    ** Failers
-    a\r\nb  
-
-/(*ANYCRLF)a.b/<CR>
-    ** Failers
-    a\rb
-    a\nb  
-    a\r\nb  
-
-/(*ANY)a.b/<cr>
-    ** Failers
-    a\rb
-    a\nb  
-    a\r\nb  
-    a\x85b 
-    
-/(*ANY).*/g
-    abc\r\ndef
-
-/(*ANYCRLF).*/g
-    abc\r\ndef
-
-/(*CRLF).*/g
-    abc\r\ndef
-
-/a\Rb/I<bsr_anycrlf>
-    a\rb
-    a\nb
-    a\r\nb
-    ** Failers
-    a\x85b
-    a\x0bb     
-
-/a\Rb/I<bsr_unicode>
-    a\rb
-    a\nb
-    a\r\nb
-    a\x85b
-    a\x0bb     
-    ** Failers 
-    a\x85b\<bsr_anycrlf>
-    a\x0bb\<bsr_anycrlf>
-    
-/a\R?b/I<bsr_anycrlf>
-    a\rb
-    a\nb
-    a\r\nb
-    ** Failers
-    a\x85b
-    a\x0bb     
-
-/a\R?b/I<bsr_unicode>
-    a\rb
-    a\nb
-    a\r\nb
-    a\x85b
-    a\x0bb     
-    ** Failers 
-    a\x85b\<bsr_anycrlf>
-    a\x0bb\<bsr_anycrlf>
-    
-/a\R{2,4}b/I<bsr_anycrlf>
-    a\r\n\nb
-    a\n\r\rb
-    a\r\n\r\n\r\n\r\nb
-    ** Failers
-    a\x85\85b
-    a\x0b\0bb     
-
-/a\R{2,4}b/I<bsr_unicode>
-    a\r\rb
-    a\n\n\nb
-    a\r\n\n\r\rb
-    a\x85\85b
-    a\x0b\0bb     
-    ** Failers 
-    a\r\r\r\r\rb 
-    a\x85\85b\<bsr_anycrlf>
-    a\x0b\0bb\<bsr_anycrlf>
- 
-/(*BSR_ANYCRLF)a\Rb/I
-    a\nb
-    a\rb 
-
-/(*BSR_UNICODE)a\Rb/I
-    a\x85b
-
-/(*BSR_ANYCRLF)(*CRLF)a\Rb/I
-    a\nb
-    a\rb 
-
-/(*CRLF)(*BSR_UNICODE)a\Rb/I
-    a\x85b
-
-/(*CRLF)(*BSR_ANYCRLF)(*CR)ab/I
-
-/(?<a>)(?&)/
-
-/(?<abc>)(?&a)/
-
-/(?<a>)(?&aaaaaaaaaaaaaaaaaaaaaaa)/
-
-/(?+-a)/
-
-/(?-+a)/
-
-/(?(-1))/
-
-/(?(+10))/
-
-/(?(10))/
-
-/(?(+2))()()/
-
-/(?(2))()()/
-
-/\k''/
-
-/\k<>/
-
-/\k{}/
-
-/\k/
-
-/\kabc/
-
-/(?P=)/
-
-/(?P>)/
-
-/(?!\w)(?R)/
-
-/(?=\w)(?R)/
-
-/(?<!\w)(?R)/
-
-/(?<=\w)(?R)/
-
-/[[:foo:]]/
-
-/[[:1234:]]/
-
-/[[:f\oo:]]/
-
-/[[: :]]/
-
-/[[:...:]]/
-
-/[[:l\ower:]]/
-
-/[[:abc\:]]/
-
-/[abc[:x\]pqr:]]/
-
-/[[:a\dz:]]/
-
-/(^(a|b\g<-1'c))/
-
-/^(?+1)(?<a>x|y){0}z/
-    xzxx
-    yzyy 
-    ** Failers
-    xxz  
-
-/(\3)(\1)(a)/
-    cat
-
-/(\3)(\1)(a)/<JS>
-    cat
-    
-/TA]/
-    The ACTA] comes 
-
-/TA]/<JS>
-    The ACTA] comes 
-
-/(?2)[]a()b](abc)/
-    abcbabc
-
-/(?2)[^]a()b](abc)/
-    abcbabc
-
-/(?1)[]a()b](abc)/
-    abcbabc
-    ** Failers 
-    abcXabc
-
-/(?1)[^]a()b](abc)/
-    abcXabc
-    ** Failers 
-    abcbabc
-
-/(?2)[]a()b](abc)(xyz)/
-    xyzbabcxyz
-
-/(?&N)[]a(?<N>)](?<M>abc)/
-   abc<abc
-
-/(?&N)[]a(?<N>)](abc)/
-   abc<abc
-
-/a[]b/
-
-/a[^]b/
-
-/a[]b/<JS>
-    ** Failers
-    ab
-
-/a[]+b/<JS>
-    ** Failers
-    ab 
-
-/a[]*+b/<JS>
-    ** Failers
-    ab 
-
-/a[^]b/<JS>
-    aXb
-    a\nb 
-    ** Failers
-    ab  
-    
-/a[^]+b/<JS> 
-    aXb
-    a\nX\nXb 
-    ** Failers
-    ab  
-
-/a(?!)b/BZ
-
-/(?!)?a/BZ
-    ab
-
-/a(*FAIL)+b/
-
-/(abc|pqr|123){0}[xyz]/SI
-
-/(?(?=.*b)b|^)/CI
-   adc
-   abc 
-   
-/(?(?=b).*b|^d)/I
-
-/(?(?=.*b).*b|^d)/I
-
-/xyz/C
-  xyz 
-  abcxyz 
-  abcxyz\Y
-  ** Failers 
-  abc
-  abc\Y
-  abcxypqr  
-  abcxypqr\Y  
-  
-/(*NO_START_OPT)xyz/C
-  abcxyz
-  
-/(*NO_AUTO_POSSESS)a+b/BZ  
-
-/xyz/CY
-  abcxyz 
-
-/^"((?(?=[a])[^"])|b)*"$/C
-    "ab"
-
-/^"((?(?=[a])[^"])|b)*"$/
-    "ab"
-
-/^X(?5)(a)(?|(b)|(q))(c)(d)Y/
-    XYabcdY
-
-/^X(?&N)(a)(?|(b)|(q))(c)(d)(?<N>Y)/
-    XYabcdY
- 
-/Xa{2,4}b/
-    X\P
-    Xa\P
-    Xaa\P 
-    Xaaa\P
-    Xaaaa\P 
-    
-/Xa{2,4}?b/
-    X\P
-    Xa\P
-    Xaa\P 
-    Xaaa\P
-    Xaaaa\P 
-    
-/Xa{2,4}+b/
-    X\P
-    Xa\P
-    Xaa\P 
-    Xaaa\P
-    Xaaaa\P 
-    
-/X\d{2,4}b/
-    X\P
-    X3\P
-    X33\P 
-    X333\P
-    X3333\P 
-    
-/X\d{2,4}?b/
-    X\P
-    X3\P
-    X33\P 
-    X333\P
-    X3333\P 
-    
-/X\d{2,4}+b/
-    X\P
-    X3\P
-    X33\P 
-    X333\P
-    X3333\P 
-    
-/X\D{2,4}b/
-    X\P
-    Xa\P
-    Xaa\P 
-    Xaaa\P
-    Xaaaa\P 
-    
-/X\D{2,4}?b/
-    X\P
-    Xa\P
-    Xaa\P 
-    Xaaa\P
-    Xaaaa\P 
-    
-/X\D{2,4}+b/
-    X\P
-    Xa\P
-    Xaa\P 
-    Xaaa\P
-    Xaaaa\P 
-    
-/X[abc]{2,4}b/
-    X\P
-    Xa\P
-    Xaa\P 
-    Xaaa\P
-    Xaaaa\P 
-    
-/X[abc]{2,4}?b/
-    X\P
-    Xa\P
-    Xaa\P 
-    Xaaa\P
-    Xaaaa\P 
-    
-/X[abc]{2,4}+b/
-    X\P
-    Xa\P
-    Xaa\P 
-    Xaaa\P
-    Xaaaa\P 
-    
-/X[^a]{2,4}b/
-    X\P
-    Xz\P
-    Xzz\P 
-    Xzzz\P
-    Xzzzz\P 
-    
-/X[^a]{2,4}?b/
-    X\P
-    Xz\P
-    Xzz\P 
-    Xzzz\P
-    Xzzzz\P 
-    
-/X[^a]{2,4}+b/
-    X\P
-    Xz\P
-    Xzz\P 
-    Xzzz\P
-    Xzzzz\P 
-    
-/(Y)X\1{2,4}b/
-    YX\P
-    YXY\P
-    YXYY\P 
-    YXYYY\P
-    YXYYYY\P 
-    
-/(Y)X\1{2,4}?b/
-    YX\P
-    YXY\P
-    YXYY\P 
-    YXYYY\P
-    YXYYYY\P 
-    
-/(Y)X\1{2,4}+b/
-    YX\P
-    YXY\P
-    YXYY\P 
-    YXYYY\P
-    YXYYYY\P 
-    
-/\++\KZ|\d+X|9+Y/
-    ++++123999\P
-    ++++123999Y\P
-    ++++Z1234\P 
-
-/Z(*F)/
-    Z\P
-    ZA\P 
-    
-/Z(?!)/
-    Z\P 
-    ZA\P 
-
-/dog(sbody)?/
-    dogs\P
-    dogs\P\P 
-    
-/dog(sbody)??/
-    dogs\P
-    dogs\P\P 
-
-/dog|dogsbody/
-    dogs\P
-    dogs\P\P 
- 
-/dogsbody|dog/
-    dogs\P
-    dogs\P\P 
-
-/\bthe cat\b/
-    the cat\P
-    the cat\P\P
-
-/abc/
-   abc\P
-   abc\P\P
-   
-/abc\K123/
-    xyzabc123pqr
-    xyzabc12\P
-    xyzabc12\P\P
-    
-/(?<=abc)123/
-    xyzabc123pqr 
-    xyzabc12\P
-    xyzabc12\P\P
-
-/\babc\b/
-    +++abc+++
-    +++ab\P
-    +++ab\P\P  
-
-/(?&word)(?&element)(?(DEFINE)(?<element><[^m][^>]>[^<])(?<word>\w*+))/BZ
-
-/(?&word)(?&element)(?(DEFINE)(?<element><[^\d][^>]>[^<])(?<word>\w*+))/BZ
-
-/(ab)(x(y)z(cd(*ACCEPT)))pq/BZ
-
-/abc\K/+
-    abcdef
-    abcdef\N\N
-    xyzabcdef\N\N
-    ** Failers
-    abcdef\N 
-    xyzabcdef\N
-    
-/^(?:(?=abc)|abc\K)/+
-    abcdef
-    abcdef\N\N 
-    ** Failers 
-    abcdef\N 
-
-/a?b?/+
-    xyz
-    xyzabc
-    xyzabc\N
-    xyzabc\N\N
-    xyz\N\N    
-    ** Failers 
-    xyz\N 
-
-/^a?b?/+
-    xyz
-    xyzabc
-    ** Failers 
-    xyzabc\N
-    xyzabc\N\N
-    xyz\N\N    
-    xyz\N 
-    
-/^(?<name>a|b\g<name>c)/
-    aaaa
-    bacxxx
-    bbaccxxx 
-    bbbacccxx
-
-/^(?<name>a|b\g'name'c)/
-    aaaa
-    bacxxx
-    bbaccxxx 
-    bbbacccxx
-
-/^(a|b\g<1>c)/
-    aaaa
-    bacxxx
-    bbaccxxx 
-    bbbacccxx
-
-/^(a|b\g'1'c)/
-    aaaa
-    bacxxx
-    bbaccxxx 
-    bbbacccxx
-
-/^(a|b\g'-1'c)/
-    aaaa
-    bacxxx
-    bbaccxxx 
-    bbbacccxx
-
-/(^(a|b\g<-1>c))/
-    aaaa
-    bacxxx
-    bbaccxxx 
-    bbbacccxx
-
-/(?-i:\g<name>)(?i:(?<name>a))/
-    XaaX
-    XAAX 
-
-/(?i:\g<name>)(?-i:(?<name>a))/
-    XaaX
-    ** Failers 
-    XAAX 
-
-/(?-i:\g<+1>)(?i:(a))/
-    XaaX
-    XAAX 
-
-/(?=(?<regex>(?#simplesyntax)\$(?<name>[a-zA-Z_\x{7f}-\x{ff}][a-zA-Z0-9_\x{7f}-\x{ff}]*)(?:\[(?<index>[a-zA-Z0-9_\x{7f}-\x{ff}]+|\$\g<name>)\]|->\g<name>(\(.*?\))?)?|(?#simple syntax withbraces)\$\{(?:\g<name>(?<indices>\[(?:\g<index>|'(?:\\.|[^'\\])*'|"(?:\g<regex>|\\.|[^"\\])*")\])?|\g<complex>|\$\{\g<complex>\})\}|(?#complexsyntax)\{(?<complex>\$(?<segment>\g<name>(\g<indices>*|\(.*?\))?)(?:->\g<segment>)*|\$\g<complex>|\$\{\g<complex>\})\}))\{/
-
-/(?<n>a|b|c)\g<n>*/
-   abc
-   accccbbb 
-
-/^X(?7)(a)(?|(b)|(q)(r)(s))(c)(d)(Y)/
-    XYabcdY
-
-/(?<=b(?1)|zzz)(a)/
-    xbaax
-    xzzzax 
-
-/(a)(?<=b\1)/
-
-/(a)(?<=b+(?1))/
-
-/(a+)(?<=b(?1))/
-
-/(a(?<=b(?1)))/
-
-/(?<=b(?1))xyz/
-
-/(?<=b(?1))xyz(b+)pqrstuvew/
-
-/(a|bc)\1/SI
-
-/(a|bc)\1{2,3}/SI
-
-/(a|bc)(?1)/SI
-
-/(a|b\1)(a|b\1)/SI
-
-/(a|b\1){2}/SI
-
-/(a|bbbb\1)(a|bbbb\1)/SI
-
-/(a|bbbb\1){2}/SI
-
-/^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]/SI
-
-/<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>/isIS
-
-"(?>.*/)foo"SI
-
-/(?(?=[^a-z]+[a-z])  \d{2}-[a-z]{3}-\d{2}  |  \d{2}-\d{2}-\d{2} ) /xSI
-
-/(?:(?:(?:(?:(?:(?:(?:(?:(?:(a|b|c))))))))))/iSI
-
-/(?:c|d)(?:)(?:aaaaaaaa(?:)(?:bbbbbbbb)(?:bbbbbbbb(?:))(?:bbbbbbbb(?:)(?:bbbbbbbb)))/SI
-
-/<a[\s]+href[\s]*=[\s]*          # find <a href=
- ([\"\'])?                       # find single or double quote
- (?(1) (.*?)\1 | ([^\s]+))       # if quote found, match up to next matching
-                                 # quote, otherwise match up to next space
-/isxSI
-
-/^(?!:)                       # colon disallowed at start
-  (?:                         # start of item
-    (?: [0-9a-f]{1,4} |       # 1-4 hex digits or
-    (?(1)0 | () ) )           # if null previously matched, fail; else null
-    :                         # followed by colon
-  ){1,7}                      # end item; 1-7 of them required               
-  [0-9a-f]{1,4} $             # final hex number at end of string
-  (?(1)|.)                    # check that there was an empty component
-  /xiIS
-
-/(?|(?<a>A)|(?<a>B))/I
-    AB\Ca
-    BA\Ca
-
-/(?|(?<a>A)|(?<b>B))/ 
-
-/(?:a(?<quote> (?<apostrophe>')|(?<realquote>")) |
-    b(?<quote> (?<apostrophe>')|(?<realquote>")) ) 
-    (?('quote')[a-z]+|[0-9]+)/JIx
-    a"aaaaa
-    b"aaaaa 
-    ** Failers 
-    b"11111
-    a"11111 
-    
-/^(?|(a)(b)(c)(?<D>d)|(?<D>e)) (?('D')X|Y)/JDZx
-    abcdX
-    eX
-    ** Failers
-    abcdY
-    ey     
-    
-/(?<A>a) (b)(c)  (?<A>d  (?(R&A)$ | (?4)) )/JDZx
-    abcdd
-    ** Failers
-    abcdde  
-
-/abcd*/
-    xxxxabcd\P
-    xxxxabcd\P\P
-
-/abcd*/i
-    xxxxabcd\P
-    xxxxabcd\P\P
-    XXXXABCD\P
-    XXXXABCD\P\P
-
-/abc\d*/
-    xxxxabc1\P
-    xxxxabc1\P\P
-
-/(a)bc\1*/
-    xxxxabca\P
-    xxxxabca\P\P
-
-/abc[de]*/
-    xxxxabcde\P
-    xxxxabcde\P\P
-
-/-- This is not in the Perl-compatible test because Perl seems currently to be
-    broken and not behaving as specified in that it *does* bumpalong after
-    hitting (*COMMIT). --/
-
-/(?1)(A(*COMMIT)|B)D/
-    ABD
-    XABD
-    BAD
-    ABXABD  
-    ** Failers 
-    ABX 
-    BAXBAD  
-
-/(\3)(\1)(a)/<JS>
-    cat
-
-/(\3)(\1)(a)/SI<JS>
-    cat
-
-/(\3)(\1)(a)/SI
-    cat
-
-/i(?(DEFINE)(?<s>a))/SI
-    i
-    
-/()i(?(1)a)/SI 
-    ia
-
-/(?i)a(?-i)b|c/BZ
-    XabX
-    XAbX
-    CcC 
-    ** Failers
-    XABX   
-
-/(?i)a(?s)b|c/BZ
-
-/(?i)a(?s-i)b|c/BZ
-
-/^(ab(c\1)d|x){2}$/BZ
-    xabcxd
-    
-/^(?&t)*+(?(DEFINE)(?<t>.))$/BZ
-
-/^(?&t)*(?(DEFINE)(?<t>.))$/BZ
-
-/ -- This one is here because Perl gives the match as "b" rather than "ab". I
-     believe this to be a Perl bug. --/  
-      
-/(?>a\Kb)z|(ab)/
-    ab 
-
-/(?P<L1>(?P<L2>0|)|(?P>L2)(?P>L1))/
-
-/abc(*MARK:)pqr/
-
-/abc(*:)pqr/
-
-/abc(*FAIL:123)xyz/
-
-/--- This should, and does, fail. In Perl, it does not, which I think is a 
-     bug because replacing the B in the pattern by (B|D) does make it fail. ---/
-
-/A(*COMMIT)B/+K
-    ACABX
-
-/--- These should be different, but in Perl they are not, which I think
-     is a bug in Perl. ---/
-
-/A(*THEN)B|A(*THEN)C/K
-    AC
-
-/A(*PRUNE)B|A(*PRUNE)C/K
-    AC
-    
-/--- Mark names can be duplicated. Perl doesn't give a mark for this one,
-though PCRE does. ---/
-
-/^A(*:A)B|^X(*:A)Y/K
-    ** Failers
-    XAQQ
-    
-/--- COMMIT at the start of a pattern should be the same as an anchor. Perl 
-optimizations defeat this. So does the PCRE optimization unless we disable it 
-with \Y. ---/
-
-/(*COMMIT)ABC/
-    ABCDEFG
-    ** Failers
-    DEFGABC\Y  
-    
-/^(ab (c+(*THEN)cd) | xyz)/x
-    abcccd  
-
-/^(ab (c+(*PRUNE)cd) | xyz)/x
-    abcccd  
-
-/^(ab (c+(*FAIL)cd) | xyz)/x
-    abcccd  
-    
-/--- Perl gets some of these wrong ---/ 
-
-/(?>.(*ACCEPT))*?5/
-    abcde
-
-/(.(*ACCEPT))*?5/
-    abcde
-
-/(.(*ACCEPT))5/
-    abcde
-
-/(.(*ACCEPT))*5/
-    abcde
-
-/A\NB./BZ
-    ACBD
-    *** Failers
-    A\nB
-    ACB\n   
-
-/A\NB./sBZ
-    ACBD
-    ACB\n 
-    *** Failers
-    A\nB  
-  
-/A\NB/<crlf>
-    A\nB
-    A\rB
-    ** Failers
-    A\r\nB    
-
-/\R+b/BZ
-
-/\R+\n/BZ
-
-/\R+\d/BZ
-
-/\d*\R/BZ
-
-/\s*\R/BZ
-    \x20\x0a
-    \x20\x0d
-    \x20\x0d\x0a
-
-/\S*\R/BZ
-    a\x0a
-
-/X\h*\R/BZ
-    X\x20\x0a
-
-/X\H*\R/BZ
-    X\x0d\x0a
-
-/X\H+\R/BZ
-    X\x0d\x0a
-
-/X\H++\R/BZ
-    X\x0d\x0a
-
-/(?<=abc)def/
-    abc\P\P
-
-/abc$/
-    abc
-    abc\P
-    abc\P\P
-
-/abc$/m
-    abc
-    abc\n
-    abc\P\P
-    abc\n\P\P 
-    abc\P
-    abc\n\P
-
-/abc\z/
-    abc
-    abc\P
-    abc\P\P
-
-/abc\Z/
-    abc
-    abc\P
-    abc\P\P
-
-/abc\b/
-    abc
-    abc\P
-    abc\P\P
-
-/abc\B/
-    abc
-    abc\P
-    abc\P\P
-
-/.+/
-    abc\>0
-    abc\>1
-    abc\>2
-    abc\>3
-    abc\>4
-    abc\>-4 
-
-/^\cģ/
-
-/(?P<abn>(?P=abn)xxx)/BZ
-
-/(a\1z)/BZ
-
-/(?P<abn>(?P=abn)(?<badstufxxx)/BZ
-
-/(?P<abn>(?P=axn)xxx)/BZ
-
-/(?P<abn>(?P=axn)xxx)(?<axn>yy)/BZ
-
-/-- These tests are here because Perl gets the first one wrong. --/
-
-/(\R*)(.)/s
-    \r\n
-    \r\r\n\n\r 
-    \r\r\n\n\r\n 
-
-/(\R)*(.)/s
-    \r\n
-    \r\r\n\n\r 
-    \r\r\n\n\r\n 
-
-/((?>\r\n|\n|\x0b|\f|\r|\x85)*)(.)/s
-    \r\n
-    \r\r\n\n\r 
-    \r\r\n\n\r\n 
-
-/-- --/
-
-/^abc$/BZ
-
-/^abc$/BZm
-
-/^(a)*+(\w)/S
-    aaaaX
-    ** Failers 
-    aaaa
-
-/^(?:a)*+(\w)/S
-    aaaaX
-    ** Failers 
-    aaaa
-
-/(a)++1234/SDZ
-
-/([abc])++1234/SI
-
-/(?<=(abc)+)X/
-
-/(^ab)/I
-
-/(^ab)++/I
-
-/(^ab|^)+/I
-
-/(^ab|^)++/I
-
-/(?:^ab)/I
-
-/(?:^ab)++/I
-
-/(?:^ab|^)+/I
-
-/(?:^ab|^)++/I
-
-/(.*ab)/I
-
-/(.*ab)++/I
-
-/(.*ab|.*)+/I
-
-/(.*ab|.*)++/I
-
-/(?:.*ab)/I
-
-/(?:.*ab)++/I
-
-/(?:.*ab|.*)+/I
-
-/(?:.*ab|.*)++/I
-
-/(?=a)[bcd]/I
-
-/((?=a))[bcd]/I
-
-/((?=a))+[bcd]/I
-
-/((?=a))++[bcd]/I
-
-/(?=a+)[bcd]/iI
-
-/(?=a+?)[bcd]/iI
-
-/(?=a++)[bcd]/iI
-
-/(?=a{3})[bcd]/iI
-
-/(abc)\1+/S
-
-/-- Perl doesn't get these right IMO (the 3rd is PCRE-specific) --/
-
-/(?1)(?:(b(*ACCEPT))){0}/
-    b
-
-/(?1)(?:(b(*ACCEPT))){0}c/
-    bc
-    ** Failers 
-    b 
-
-/(?1)(?:((*ACCEPT))){0}c/
-    c
-    c\N 
-
-/^.*?(?(?=a)a|b(*THEN)c)/
-    ba
-
-/^.*?(?(?=a)a|bc)/
-    ba
-
-/^.*?(?(?=a)a(*THEN)b|c)/
-    ac
-
-/^.*?(?(?=a)a(*THEN)b)c/
-    ac
-
-/^.*?(a(*THEN)b)c/
-    aabc
-    
-/^.*? (?1) c (?(DEFINE)(a(*THEN)b))/x
-    aabc
-
-/^.*?(a(*THEN)b|z)c/
-    aabc
-
-/^.*?(z|a(*THEN)b)c/
-    aabc
-
-/-- --/
-
-/-- These studied versions are here because they are not Perl-compatible; the
-    studying means the mark is not seen. --/
-
-/(*MARK:A)(*SKIP:B)(C|X)/KS
-    C
-    D
-     
-/(*:A)A+(*SKIP:A)(B|Z)/KS
-    AAAC
-
-/-- --/
-
-"(?=a*(*ACCEPT)b)c"
-    c
-    c\N 
-    
-/(?1)c(?(DEFINE)((*ACCEPT)b))/
-    c
-    c\N  
-    
-/(?>(*ACCEPT)b)c/
-    c
-    c\N  
-
-/(?:(?>(a)))+a%/++
-    %aa%
-
-/(a)b|ac/++SS
-    ac\O3
-    
-/(a)(b)x|abc/++
-     abc\O6
-
-/(a)bc|(a)(b)\2/
-    \O3abc
-    \O4abc 
-
-/(?(DEFINE)(a(?2)|b)(b(?1)|a))(?:(?1)|(?2))/SI
-
-/(a(?2)|b)(b(?1)|a)(?:(?1)|(?2))/SI
-
-/(a(?2)|b)(b(?1)|a)(?1)(?2)/SI
-
-/(abc)(?1)/SI
-
-/^(?>a)++/
-    aa\M
-    aaaaaaaaa\M 
-    
-/(a)(?1)++/
-    aa\M
-    aaaaaaaaa\M  
-
-/(?:(foo)|(bar)|(baz))X/SS=
-    bazfooX
-    foobazbarX
-    barfooX
-    bazX
-    foobarbazX    
-    bazfooX\O0
-    bazfooX\O2
-    bazfooX\O4
-    bazfooX\O6
-    bazfooX\O8
-    bazfooX\O10
-
-/(?=abc){3}abc/BZ
-
-/(?=abc)+abc/BZ
-
-/(?=abc)++abc/BZ
-
-/(?=abc){0}xyz/BZ
-
-/(?=(a))?./BZ
-
-/(?=(a))??./BZ
-
-/^(?=(a)){0}b(?1)/BZ
-
-/(?(DEFINE)(a))?b(?1)/BZ
-
-/^(?=(?1))?[az]([abc])d/BZ
-
-/^(?!a){0}\w+/BZ
-
-/(?<=(abc))?xyz/BZ
-
-/[:a[:abc]b:]/BZ
-
-/((?2))((?1))/SS
-    abc
-
-/((?(R2)a+|(?1)b))/SS
-    aaaabcde
-
-/(?(R)a*(?1)|((?R))b)/SS
-    aaaabcde
-
-/(a+|(?R)b)/
-
-/^(a(*:A)(d|e(*:B))z|aeq)/C
-    adz
-    aez
-    aeqwerty
-
-/.(*F)/
-    \P\Pabc
-
-/\btype\b\W*?\btext\b\W*?\bjavascript\b/IS
-
-/\btype\b\W*?\btext\b\W*?\bjavascript\b|\burl\b\W*?\bshell:|<input\b.*?\btype\b\W*?\bimage\b|\bonkeyup\b\W*?\=/IS
-
-/a(*SKIP)c|b(*ACCEPT)|/+S!I
-    a
-
-/a(*SKIP)c|b(*ACCEPT)cd(*ACCEPT)|x/SI
-    ax
-
-'a*(*ACCEPT)b'+
-    \N\N
-    abc\N\N
-    bbb\N\N 
-
-/(*ACCEPT)a/+I
-    bax
-
-/z(*ACCEPT)a/+I
-    baxzbx
-
-/a(?:.)*?a/ims                                                                  
-    \Mabbbbbbbbbbbbbbbbbbbbba
-    
-/a(?:.(*THEN))*?a/ims
-    \Mabbbbbbbbbbbbbbbbbbbbba
-
-/a(?:.(*THEN:ABC))*?a/ims
-    \Mabbbbbbbbbbbbbbbbbbbbba
-
-/^(?>a+)(?>(z+))\w/BZ
-    aaaazzzzb
-    ** Failers
-    aazz  
-
-/(.)(\1|a(?2))/
-    bab
-    
-/\1|(.)(?R)\1/
-    cbbbc
-    
-/(.)((?(1)c|a)|a(?2))/
-    baa  
-
-/(?P<abn>(?P=abn)xxx)/BZ
-
-/(a\1z)/BZ
-
-/^(?>a+)(?>b+)(?>c+)(?>d+)(?>e+)/
-     \Maabbccddee
-
-/^(?>(a+))(?>(b+))(?>(c+))(?>(d+))(?>(e+))/
-     \Maabbccddee
-
-/^(?>(a+))(?>b+)(?>(c+))(?>d+)(?>(e+))/
-     \Maabbccddee
-
-/^a\x41z/<JS>
-    aAz
-    *** Failers
-    ax41z
-
-/^a[m\x41]z/<JS>
-    aAz
-
-/^a\x1z/<JS>
-    ax1z
-
-/^a\u0041z/<JS>
-    aAz
-    *** Failers
-    au0041z
-
-/^a[m\u0041]z/<JS>
-    aAz
-
-/^a\u041z/<JS>
-    au041z
-    *** Failers
-    aAz
-
-/^a\U0041z/<JS>
-    aU0041z
-    *** Failers
-    aAz
-
-/(?(?=c)c|d)++Y/BZ
-
-/(?(?=c)c|d)*+Y/BZ
-
-/a[\NB]c/
-    aNc
-    
-/a[B-\Nc]/ 
-
-/a[B\Nc]/ 
-
-/(a)(?2){0,1999}?(b)/
-
-/(a)(?(DEFINE)(b))(?2){0,1999}?(?2)/
-
-/--- This test, with something more complicated than individual letters, causes
-different behaviour in Perl. Perhaps it disables some optimization; no tag is
-passed back for the failures, whereas in PCRE there is a tag. ---/
-    
-/(A|P)(*:A)(B|P) | (X|P)(X|P)(*:B)(Y|P)/xK
-    AABC
-    XXYZ 
-    ** Failers
-    XAQQ  
-    XAQQXZZ  
-    AXQQQ 
-    AXXQQQ 
-
-/-- Perl doesn't give marks for these, though it does if the alternatives are
-replaced by single letters. --/
-    
-/(b|q)(*:m)f|a(*:n)w/K
-    aw 
-    ** Failers 
-    abc
-
-/(q|b)(*:m)f|a(*:n)w/K
-    aw 
-    ** Failers 
-    abc
-
-/-- After a partial match, the behaviour is as for a failure. --/
-
-/^a(*:X)bcde/K
-   abc\P
-   
-/-- These are here because Perl doesn't return a mark, except for the first --/
-
-/(?=(*:x))(q|)/K+
-    abc
-
-/(?=(*:x))((*:y)q|)/K+
-    abc
-
-/(?=(*:x))(?:(*:y)q|)/K+
-    abc
-
-/(?=(*:x))(?>(*:y)q|)/K+
-    abc
-
-/(?=a(*:x))(?!a(*:y)c)/K+
-    ab
-
-/(?=a(*:x))(?=a(*:y)c|)/K+
-    ab
-
-/(..)\1/
-    ab\P
-    aba\P
-    abab\P
-
-/(..)\1/i
-    ab\P
-    abA\P
-    aBAb\P
-
-/(..)\1{2,}/
-    ab\P
-    aba\P
-    abab\P
-    ababa\P
-    ababab\P
-    ababab\P\P
-    abababa\P
-    abababa\P\P
-
-/(..)\1{2,}/i
-    ab\P
-    aBa\P
-    aBAb\P
-    AbaBA\P
-    abABAb\P
-    aBAbaB\P\P
-    abABabA\P
-    abaBABa\P\P
-
-/(..)\1{2,}?x/i
-    ab\P
-    abA\P
-    aBAb\P
-    abaBA\P
-    abAbaB\P
-    abaBabA\P
-    abAbABaBx\P
-
-/^(..)\1/
-    aba\P
-
-/^(..)\1{2,3}x/
-    aba\P
-    ababa\P
-    ababa\P\P
-    abababx
-    ababababx  
-
-/^(..)\1{2,3}?x/
-    aba\P
-    ababa\P
-    ababa\P\P
-    abababx
-    ababababx  
-    
-/^(..)(\1{2,3})ab/
-    abababab
-
-/^\R/
-    \r\P
-    \r\P\P
-    
-/^\R{2,3}x/
-    \r\P
-    \r\P\P
-    \r\r\P 
-    \r\r\P\P
-    \r\r\r\P  
-    \r\r\r\P\P
-    \r\rx
-    \r\r\rx    
-
-/^\R{2,3}?x/
-    \r\P
-    \r\P\P
-    \r\r\P 
-    \r\r\P\P
-    \r\r\r\P  
-    \r\r\r\P\P
-    \r\rx
-    \r\r\rx    
-    
-/^\R?x/
-    \r\P
-    \r\P\P 
-    x
-    \rx  
-
-/^\R+x/
-    \r\P
-    \r\P\P 
-    \r\n\P
-    \r\n\P\P  
-    \rx  
-
-/^a$/<CRLF>
-    a\r\P
-    a\r\P\P 
-
-/^a$/m<CRLF>
-    a\r\P
-    a\r\P\P 
-
-/^(a$|a\r)/<CRLF>
-    a\r\P
-    a\r\P\P 
-
-/^(a$|a\r)/m<CRLF>
-    a\r\P
-    a\r\P\P 
-
-/./<CRLF>
-    \r\P
-    \r\P\P 
-  
-/.{2,3}/<CRLF>
-    \r\P 
-    \r\P\P
-    \r\r\P
-    \r\r\P\P
-    \r\r\r\P
-    \r\r\r\P\P     
-
-/.{2,3}?/<CRLF>
-    \r\P 
-    \r\P\P
-    \r\r\P
-    \r\r\P\P
-    \r\r\r\P
-    \r\r\r\P\P     
-
-"AB(C(D))(E(F))?(?(?=\2)(?=\4))"
-    ABCDGHI\O03
-    
-/-- These are all run as real matches in test 1; here we are just checking the
-settings of the anchored and startline bits. --/ 
-
-/(?>.*?a)(?<=ba)/I
-
-/(?:.*?a)(?<=ba)/I
-
-/.*?a(*PRUNE)b/I
-
-/.*?a(*PRUNE)b/sI
-
-/^a(*PRUNE)b/sI
-
-/.*?a(*SKIP)b/I
-
-/(?>.*?a)b/sI
-
-/(?>.*?a)b/I
-
-/(?>^a)b/sI
-
-/(?>.*?)(?<=(abcd)|(wxyz))/I
-
-/(?>.*)(?<=(abcd)|(wxyz))/I
-
-"(?>.*)foo"I
-
-"(?>.*?)foo"I
-
-/(?>^abc)/mI
-
-/(?>.*abc)/mI
-
-/(?:.*abc)/mI
-
-/-- Check PCRE_STUDY_EXTRA_NEEDED --/
-
-/.?/S-I
-
-/.?/S!I
-
-/(?:(a)+(?C1)bb|aa(?C2)b)/
-    aab\C+
-   
-/(?:(a)++(?C1)bb|aa(?C2)b)/
-    aab\C+ 
-    
-/(?:(?>(a))(?C1)bb|aa(?C2)b)/
-    aab\C+ 
-
-/(?:(?1)(?C1)x|ab(?C2))((a)){0}/                                                
-    aab\C+ 
-
-/(?1)(?C1)((a)(?C2)){0}/   
-    aab\C+ 
-
-/(?:(a)+(?C1)bb|aa(?C2)b)++/
-    aab\C+
-    aab\C+\O2
-
-/(ab)x|ab/
-    ab\O3
-    ab\O2 
-  
-/(ab)/
-    ab\O3
-    ab\O2 
-    
-/(?<=123)(*MARK:xx)abc/K
-    xxxx123a\P\P
-    xxxx123a\P
-    
-/123\Kabc/
-    xxxx123a\P\P
-    xxxx123a\P
-
-/^(?(?=a)aa|bb)/C
-    bb
-
-/(?C1)^(?C2)(?(?C99)(?=(?C3)a(?C4))(?C5)a(?C6)a(?C7)|(?C8)b(?C9)b(?C10))(?C11)/
-    bb
-
-/-- Perl seems to have a bug with this one --/
-
-/aaaaa(*COMMIT)(*PRUNE)b|a+c/
-    aaaaaac
-    
-/-- Here are some that Perl treats differently because of the way it handles
-backtracking verbs. --/
-
- /(?!a(*COMMIT)b)ac|ad/
-     ac
-     ad 
-
-/^(?!a(*THEN)b|ac)../
-     ac
-     ad 
-
-/^(?=a(*THEN)b|ac)/
-    ac
-    
-/\A.*?(?:a|b(*THEN)c)/
-    ba
-
-/\A.*?(?:a|b(*THEN)c)++/
-    ba
-
-/\A.*?(?:a|b(*THEN)c|d)/
-    ba
-
-/(?:(a(*MARK:X)a+(*SKIP:X)b)){0}(?:(?1)|aac)/
-    aac 
-
-/\A.*?(a|b(*THEN)c)/
-    ba
-
-/^(A(*THEN)B|A(*THEN)D)/
-    AD           
-    
-/(?!b(*THEN)a)bn|bnn/
-    bnn
-
-/(?(?=b(*SKIP)a)bn|bnn)/
-    bnn
-
-/(?=b(*THEN)a|)bn|bnn/
-    bnn
-
-/-------------------------/ 
-
-/(*LIMIT_MATCH=12bc)abc/
-
-/(*LIMIT_MATCH=4294967290)abc/
-
-/(*LIMIT_RECURSION=4294967280)abc/I
-
-/(a+)*zz/
-    aaaaaaaaaaaaaz
-    aaaaaaaaaaaaaz\q3000
-
-/(a+)*zz/S-
-    aaaaaaaaaaaaaz\Q10 
-
-/(*LIMIT_MATCH=3000)(a+)*zz/I
-    aaaaaaaaaaaaaz
-    aaaaaaaaaaaaaz\q60000
-
-/(*LIMIT_MATCH=60000)(*LIMIT_MATCH=3000)(a+)*zz/I
-    aaaaaaaaaaaaaz
-
-/(*LIMIT_MATCH=60000)(a+)*zz/I
-    aaaaaaaaaaaaaz
-    aaaaaaaaaaaaaz\q3000
-
-/(*LIMIT_RECURSION=10)(a+)*zz/IS-
-    aaaaaaaaaaaaaz
-    aaaaaaaaaaaaaz\Q1000
-
-/(*LIMIT_RECURSION=10)(*LIMIT_RECURSION=1000)(a+)*zz/IS-
-    aaaaaaaaaaaaaz
-
-/(*LIMIT_RECURSION=1000)(a+)*zz/IS-
-    aaaaaaaaaaaaaz
-    aaaaaaaaaaaaaz\Q10
-
-/-- This test causes a segfault with Perl 5.18.0 --/
-
-/^(?=(a)){0}b(?1)/
-    backgammon
-
-/(?|(?<n>f)|(?<n>b))/JI
-
-/(?<a>abc)(?<a>z)\k<a>()/JDZS
-
-/a*[bcd]/BZ
-
-/[bcd]*a/BZ
-
-/-- A complete set of tests for auto-possessification of character types --/
-
-/\D+\D \D+\d \D+\S \D+\s \D+\W \D+\w \D+. \D+\C \D+\R \D+\H \D+\h \D+\V \D+\v \D+\Z \D+\z \D+$/BZx
-
-/\d+\D \d+\d \d+\S \d+\s \d+\W \d+\w \d+. \d+\C \d+\R \d+\H \d+\h \d+\V \d+\v \d+\Z \d+\z \d+$/BZx
-
-/\S+\D \S+\d \S+\S \S+\s \S+\W \S+\w \S+. \S+\C \S+\R \S+\H \S+\h \S+\V \S+\v \S+\Z \S+\z \S+$/BZx
-
-/\s+\D \s+\d \s+\S \s+\s \s+\W \s+\w \s+. \s+\C \s+\R \s+\H \s+\h \s+\V \s+\v \s+\Z \s+\z \s+$/BZx
-
-/\W+\D \W+\d \W+\S \W+\s \W+\W \W+\w \W+. \W+\C \W+\R \W+\H \W+\h \W+\V \W+\v \W+\Z \W+\z \W+$/BZx
-
-/\w+\D \w+\d \w+\S \w+\s \w+\W \w+\w \w+. \w+\C \w+\R \w+\H \w+\h \w+\V \w+\v \w+\Z \w+\z \w+$/BZx
-
-/\C+\D \C+\d \C+\S \C+\s \C+\W \C+\w \C+. \C+\C \C+\R \C+\H \C+\h \C+\V \C+\v \C+\Z \C+\z \C+$/BZx
-
-/\R+\D \R+\d \R+\S \R+\s \R+\W \R+\w \R+. \R+\C \R+\R \R+\H \R+\h \R+\V \R+\v \R+\Z \R+\z \R+$/BZx
-
-/\H+\D \H+\d \H+\S \H+\s \H+\W \H+\w \H+. \H+\C \H+\R \H+\H \H+\h \H+\V \H+\v \H+\Z \H+\z \H+$/BZx
-
-/\h+\D \h+\d \h+\S \h+\s \h+\W \h+\w \h+. \h+\C \h+\R \h+\H \h+\h \h+\V \h+\v \h+\Z \h+\z \h+$/BZx
-
-/\V+\D \V+\d \V+\S \V+\s \V+\W \V+\w \V+. \V+\C \V+\R \V+\H \V+\h \V+\V \V+\v \V+\Z \V+\z \V+$/BZx
-
-/\v+\D \v+\d \v+\S \v+\s \v+\W \v+\w \v+. \v+\C \v+\R \v+\H \v+\h \v+\V \v+\v \v+\Z \v+\z \v+$/BZx
-
-/ a+\D  a+\d  a+\S  a+\s  a+\W  a+\w  a+.  a+\C  a+\R  a+\H  a+\h  a+\V  a+\v  a+\Z  a+\z  a+$/BZx
-
-/\n+\D \n+\d \n+\S \n+\s \n+\W \n+\w \n+. \n+\C \n+\R \n+\H \n+\h \n+\V \n+\v \n+\Z \n+\z \n+$/BZx
-
-/ .+\D  .+\d  .+\S  .+\s  .+\W  .+\w  .+.  .+\C  .+\R  .+\H  .+\h  .+\V  .+\v  .+\Z  .+\z  .+$/BZx
-
-/ .+\D  .+\d  .+\S  .+\s  .+\W  .+\w  .+.  .+\C  .+\R  .+\H  .+\h  .+\V  .+\v  .+\Z  .+\z  .+$/BZxs
-
-/\D+$  \d+$  \S+$  \s+$  \W+$  \w+$  \C+$  \R+$  \H+$  \h+$  \V+$  \v+$   a+$  \n+$   .+$  .+$/BZxm
-
-/(?=a+)a(a+)++a/BZ
-
-/a+(bb|cc)a+(?:bb|cc)a+(?>bb|cc)a+(?:bb|cc)+a+(aa)a+(?:bb|aa)/BZ
-
-/a+(bb|cc)?#a+(?:bb|cc)??#a+(?:bb|cc)?+#a+(?:bb|cc)*#a+(bb|cc)?a#a+(?:aa)?/BZ
-
-/a+(?:bb)?a#a+(?:|||)#a+(?:|b)a#a+(?:|||)?a/BZ
-
-/[ab]*/BZ
-    aaaa
-
-/[ab]*?/BZ
-    aaaa
-
-/[ab]?/BZ
-    aaaa
-
-/[ab]??/BZ
-    aaaa
-
-/[ab]+/BZ
-    aaaa
-
-/[ab]+?/BZ
-    aaaa
-
-/[ab]{2,3}/BZ
-    aaaa
-
-/[ab]{2,3}?/BZ
-    aaaa
-
-/[ab]{2,}/BZ
-    aaaa
-
-/[ab]{2,}?/BZ
-    aaaa
-
-/\d+\s{0,5}=\s*\S?=\w{0,4}\W*/BZ
-
-/[a-d]{5,12}[e-z0-9]*#[^a-z]+[b-y]*a[2-7]?[^0-9a-z]+/BZ
-
-/[a-z]*\s#[ \t]?\S#[a-c]*\S#[C-G]+?\d#[4-8]*\D#[4-9,]*\D#[!$]{0,5}\w#[M-Xf-l]+\W#[a-c,]?\W/BZ
-
-/a+(aa|bb)*c#a*(bb|cc)*a#a?(bb|cc)*d#[a-f]*(g|hh)*f/BZ
-
-/[a-f]*(g|hh|i)*i#[a-x]{4,}(y{0,6})*y#[a-k]+(ll|mm)+n/BZ
-
-/[a-f]*(?>gg|hh)+#[a-f]*(?>gg|hh)?#[a-f]*(?>gg|hh)*a#[a-f]*(?>gg|hh)*h/BZ
-
-/[a-c]*d/DZS
-
-/[a-c]+d/DZS
-
-/[a-c]?d/DZS
-
-/[a-c]{4,6}d/DZS
-
-/[a-c]{0,6}d/DZS
-
-/-- End of special auto-possessive tests --/
-
-/^A\o{1239}B/
-    A\123B
-
-/^A\oB/
-    
-/^A\x{zz}B/ 
-
-/^A\x{12Z/
-
-/^A\x{/
-
-/[ab]++/BZO
-
-/[^ab]*+/BZO
-
-/a{4}+/BZO
-
-/a{4}+/BZOi
-
-/[a-[:digit:]]+/
-
-/[A-[:digit:]]+/
-
-/[a-[.xxx.]]+/
-
-/[a-[=xxx=]]+/
-
-/[a-[!xxx!]]+/
-
-/[A-[!xxx!]]+/
-    A]]]
-
-/[a-\d]+/
-
-/(?<0abc>xx)/
-
-/(?&1abc)xx(?<1abc>y)/
-
-/(?<ab-cd>xx)/
-
-/(?'0abc'xx)/
-
-/(?P<0abc>xx)/
-
-/\k<5ghj>/
-
-/\k'5ghj'/
-
-/\k{2fgh}/
-
-/(?P=8yuki)/
-
-/\g{4df}/
-
-/(?&1abc)xx(?<1abc>y)/
-
-/(?P>1abc)xx(?<1abc>y)/
-
-/\g'3gh'/
-
-/\g<5fg>/
-
-/(?(<4gh>)abc)/
-
-/(?('4gh')abc)/
-
-/(?(4gh)abc)/
-
-/(?(R&6yh)abc)/
-
-/(((a\2)|(a*)\g<-1>))*a?/BZ
-
-/-- Test the ugly "start or end of word" compatibility syntax --/
-
-/[[:<:]]red[[:>:]]/BZ
-    little red riding hood
-    a /red/ thing 
-    red is a colour
-    put it all on red  
-    ** Failers
-    no reduction
-    Alfred Winifred
-    
-/[a[:<:]] should give error/ 
-
-/(?=ab\K)/+
-    abcd
-
-/abcd/f<lf>
-    xx\nxabcd
-    
-/ -- Test stack check external calls --/ 
-
-/(((((a)))))/Q0
-
-/(((((a)))))/Q1
-
-/(((((a)))))/Q
-
-/^\w+(?>\s*)(?<=\w)/BZ
-
-/\othing/
-
-/\o{}/
-
-/\o{whatever}/
-
-/\xthing/
-
-/\x{}/
-
-/\x{whatever}/
-
-"((?=(?(?=(?(?=(?(?=()))))))))"
-    a
-
-"(?(?=)==)(((((((((?=)))))))))"
-    a
-
-/^(?:(a)|b)(?(1)A|B)/I
-    aA123\O3
-    aA123\O6
-
-'^(?:(?<AA>a)|b)(?(<AA>)A|B)'
-    aA123\O3
-    aA123\O6
-
-'^(?<AA>)(?:(?<AA>a)|b)(?(<AA>)A|B)'J
-    aA123\O3
-    aA123\O6
-
-'^(?:(?<AA>X)|)(?:(?<AA>a)|b)\k{AA}'J
-    aa123\O3
-    aa123\O6
-
-/(?<N111>(?J)(?<N111>1(111111)11|)1|1|)(?(<N111>)1)/
-
-/(?(?=0)?)+/
-
-/(?(?=0)(?=00)?00765)/
-     00765
-
-/(?(?=0)(?=00)?00765|(?!3).56)/
-     00765
-     456
-     ** Failers
-     356   
-
-'^(a)*+(\w)'
-    g
-    g\O3
-
-'^(?:a)*+(\w)'
-    g
-    g\O3
-
-//C
-    \O\C+
-
-"((?2){0,1999}())?"
-
-/((?+1)(\1))/BZ
-
-/(?(?!)a|b)/
-    bbb
-    aaa 
-
-"((?2)+)((?1))"
-
-"(?(?<E>.*!.*)?)"
-
-"X((?2)()*+){2}+"BZ
-
-"X((?2)()*+){2}"BZ
-
-"(?<=((?2))((?1)))"
-
-/(?<=\Ka)/g+
-    aaaaa
-
-/(?<=\Ka)/G+
-    aaaaa
-
-/((?2){73}(?2))((?1))/
-
-/.((?2)(?R)\1)()/BZ
-
-/(?1)()((((((\1++))\x85)+)|))/
-
-/(\9*+(?2);\3++()2|)++{/
-
-/\V\x85\9*+((?2)\3++()2)*:2/
-
-/(((?(R)){0,2}) (?''((?'R')((?'R')))))/J
-
-/(((?(X)){0,2}) (?''((?'X')((?'X')))))/J
-
-/(((?(R)){0,2}) (?''((?'X')((?'R')))))/
-
-"(?J)(?'d'(?'d'\g{d}))"
-
-".*?\h.+.\.+\R*?\xd(?i)(?=!(?=b`b`b`\`b\xa9b!)`\a`bbbbbbbbbbbbb`bbbbbbbbbbbb*R\x85bbbbbbb\C?{((?2)(?))((
-\H){8(?<=(?1){29}\xa8bbbb\x16\xd\xc6^($(?<! )(\xa9H4){4}h}1)B))\x15')"
-
-"(?J:(?|(?'R')(\k'R')|((?'R'))))"
-
-/(?<=|(\,\$(?73591620449005828816)\xa8.{7}){6}\x09)/
-
-//
-\O1
-
-/^(?:(?(1)x|)+)+$()/BZ
-
-/(?=di(?<=(?1))|(?=(.))))/
-
-/(?(R))*+/BZ
-
-/[[:\\](?'abc')[a:]/
-
-"[[[.\xe8Nq\xffq\xff\xe0\x2|||::Nq\xffq\xff\xe0\x6\x2|||::[[[:[::::::[[[[[::::::::[:[[[:[:::[[[[[[[[[[[[:::::::::::::::::[[.\xe8Nq\xffq\xff\xe0\x2|||::Nq\xffq\xff\xe0\x6\x2|||::[[[:[::::::[[[[[::::::::[:[[[:[:::[[[[[[[[[[[[[[:::E[[[:[:[[:[:::[[:::E[[[:[:[[:'[:::::E[[[:[::::::[[[:[[[[[[[::E[[[:[::::::[[[:[[[[[[[[:[[::[::::[[:::::::[[:[[[[[[[:[[::[:[[:[~"
-
-/()(?(R)0)*+/BZ
-
-/(?R-:(?</
-
-/(?1){3918}(((((0(\k'R'))))(?J)(?'R'(?'R'\3){99})))/I
-
-/(?J:(?|(:(?|(?'R')(\k'R')|((?'R')))H'Rk'Rf)|s(?'R')))/
-
-/0(?0)|(1)(*THEN)(*SKIP:0)(*FAIL)/
-    01
-
-/((?(R8000000000)))/ 
-
-/(?(8000000000/
-
-/(?:ab)?(?:ab)(?:ab)/
-    abab
-    ababab
-    aba
-
-/((*MARK:A))++a(*SKIP:B)b/
-    aacb
-
-/(?J:(?|(:(?|(?'R')(\z(?|(?'R')(\k'R')|((?'R')))k'R')|((?'R')))H'Ak'Rf)|s(?'R')))/
-
-/(?&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)(?&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)(?&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)(?&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)(?&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)(?&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)(?&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)(?&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)(?&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)(?&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)(?&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)(?&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)(?&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)(?&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)(?&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)(?&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)(?&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)(?&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)(?&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)(?&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>1)/
-
-/a[[:punct:]b]/BZ
-
-/-- End of testinput2 --/
diff --git a/dist/testdata/testinput20 b/dist/testdata/testinput20
deleted file mode 100644
index 2a6b8f2..0000000
--- a/dist/testdata/testinput20
+++ /dev/null
@@ -1,19 +0,0 @@
-/-- These DFA tests are for the handling of characters greater than 255 in
-    16- or 32-bit, non-UTF mode. --/
-
-/^\x{ffff}+/i
-    \x{ffff}
-
-/^\x{ffff}?/i
-    \x{ffff}
-
-/^\x{ffff}*/i
-    \x{ffff}
-
-/^\x{ffff}{3}/i
-    \x{ffff}\x{ffff}\x{ffff}
-
-/^\x{ffff}{0,3}/i
-    \x{ffff}
-
-/-- End of testinput20 --/
diff --git a/dist/testdata/testinput21 b/dist/testdata/testinput21
deleted file mode 100644
index 30895ee..0000000
--- a/dist/testdata/testinput21
+++ /dev/null
@@ -1,26 +0,0 @@
-/-- Tests for reloading pre-compiled patterns. The first one gives an error
-right away, and can be any old pattern compiled in 8-bit mode ("abc" is
-typical). The others require the link size to be 2. */x
-
-<!testsaved8
-
-%-- Generated from: 
-    /^[aL](?P<name>(?:[AaLl]+)[^xX-]*?)(?P<other>[\x{150}-\x{250}\x{300}]|
-      [^\x{800}aAs-uS-U\x{d800}-\x{dfff}])++[^#\b\x{500}\x{1000}]{3,5}$
-      /x
-
-    In 16-bit mode with options:  S>testdata/saved16LE-1
-                                 FS>testdata/saved16BE-1
-    In 32-bit mode with options:  S>testdata/saved32LE-1
-                                 FS>testdata/saved32BE-1
---%x
-
-<!testsaved16LE-1
-
-<!testsaved16BE-1
-
-<!testsaved32LE-1
-
-<!testsaved32BE-1
-
-/-- End of testinput21 --/
diff --git a/dist/testdata/testinput22 b/dist/testdata/testinput22
deleted file mode 100644
index ca408db..0000000
--- a/dist/testdata/testinput22
+++ /dev/null
@@ -1,23 +0,0 @@
-/-- Tests for reloading pre-compile patterns with UTF-16 or UTF-32 support. */
-
-%-- Generated from: 
-    /(?P<cbra1>[aZ\x{400}-\x{10ffff}]{4,}
-      [\x{f123}\x{10039}\x{20000}-\x{21234}]?|
-      [A-Cx-z\x{100000}-\x{1000a7}\x{101234}])
-      (?<cb2>[^az])/x 
-       
-    In 16-bit mode with options:  S8>testdata/saved16LE-2
-                                 FS8>testdata/saved16BE-2
-    In 32-bit mode with options:  S8>testdata/saved32LE-2
-                                 FS8>testdata/saved32BE-2
---%8x
-
-<!testsaved16LE-2
-
-<!testsaved16BE-2
-
-<!testsaved32LE-2
-
-<!testsaved32BE-2
-
-/-- End of testinput22 --/
diff --git a/dist/testdata/testinput23 b/dist/testdata/testinput23
deleted file mode 100644
index 0fdbae7..0000000
--- a/dist/testdata/testinput23
+++ /dev/null
@@ -1,20 +0,0 @@
-/-- Tests for the 16-bit library only */
-
-< forbid 8W
-
-/-- Check maximum non-UTF character size --/
-
-/\x{ffff}/
-    A\x{ffff}B
-
-/\x{10000}/
-
-/\o{20000}/
-
-/-- Check character ranges --/
-
-/[\H]/BZSI
-
-/[\V]/BZSI
-
-/-- End of testinput23 --/
diff --git a/dist/testdata/testinput24 b/dist/testdata/testinput24
deleted file mode 100644
index 23eb84e..0000000
--- a/dist/testdata/testinput24
+++ /dev/null
@@ -1,11 +0,0 @@
-/-- Tests for the 16-bit library with UTF-16 support only */
-
-< forbid W
-
-/bad/8
-    \x{d800}
-
-/short/8
-    \P\P\x{d800}
-
-/-- End of testinput24 --/
diff --git a/dist/testdata/testinput25 b/dist/testdata/testinput25
deleted file mode 100644
index 067ca12..0000000
--- a/dist/testdata/testinput25
+++ /dev/null
@@ -1,44 +0,0 @@
-/-- Tests for the 32-bit library only */
-
-< forbid 8W
-
-/-- Check maximum character size --/
-
-/\x{110000}/
-
-/\x{7fffffff}/
-
-/\x{80000000}/
-
-/\x{ffffffff}/
-
-/\x{100000000}/
-
-/\o{17777777777}/
-
-/\o{20000000000}/
-
-/\o{37777777777}/
-
-/\o{40000000000}/
-
-/\x{7fffffff}\x{7fffffff}/I
-
-/\x{80000000}\x{80000000}/I
-
-/\x{ffffffff}\x{ffffffff}/I
-
-/-- Non-UTF characters --/
-
-/\C{2,3}/
-    \x{400000}\x{400001}\x{400002}\x{400003}
-
-/\x{400000}\x{800000}/iDZ
-
-/-- Check character ranges --/
-
-/[\H]/BZSI
-
-/[\V]/BZSI
-
-/-- End of testinput25 --/
diff --git a/dist/testdata/testinput26 b/dist/testdata/testinput26
deleted file mode 100644
index 6b56ac1..0000000
--- a/dist/testdata/testinput26
+++ /dev/null
@@ -1,14 +0,0 @@
-/-- Tests for the 32-bit library with UTF-32 support only */
-
-< forbid W
-
-/-- Non-UTF characters --/
-
-/\x{110000}/8
-
-/\o{4200000}/8
-
-/\C/8
-    \x{110000}
-
-/-- End of testinput26 --/
diff --git a/dist/testdata/testinput3 b/dist/testdata/testinput3
deleted file mode 100644
index fcd4625..0000000
--- a/dist/testdata/testinput3
+++ /dev/null
@@ -1,100 +0,0 @@
-/-- This set of tests checks local-specific features, using the "fr_FR" locale. 
-    It is not Perl-compatible. When run via RunTest, the locale is edited to
-    be whichever of "fr_FR", "french", or "fr" is found to exist. There is
-    different version of this file called wintestinput3 for use on Windows,
-    where the locale is called "french" and the tests are run using
-    RunTest.bat. --/
-
-< forbid 8W 
-
-/^[\w]+/
-    *** Failers
-    École
-
-/^[\w]+/Lfr_FR
-    École
-
-/^[\w]+/
-    *** Failers
-    École
-
-/^[\W]+/
-    École
-
-/^[\W]+/Lfr_FR
-    *** Failers
-    École
-
-/[\b]/
-    \b
-    *** Failers
-    a
-
-/[\b]/Lfr_FR
-    \b
-    *** Failers
-    a
-
-/^\w+/
-    *** Failers
-    École
-
-/^\w+/Lfr_FR
-    École
-
-/(.+)\b(.+)/
-    École
-
-/(.+)\b(.+)/Lfr_FR
-    *** Failers
-    École
-
-/École/i
-    École
-    *** Failers
-    école
-
-/École/iLfr_FR
-    École
-    école
-
-/\w/IS
-
-/\w/ISLfr_FR
-
-/^[\xc8-\xc9]/iLfr_FR
-    École
-    école
-
-/^[\xc8-\xc9]/Lfr_FR
-    École
-    *** Failers 
-    école
-
-/\W+/Lfr_FR
-    >>>\xaa<<<
-    >>>\xba<<< 
-
-/[\W]+/Lfr_FR
-    >>>\xaa<<<
-    >>>\xba<<< 
-
-/[^[:alpha:]]+/Lfr_FR
-    >>>\xaa<<<
-    >>>\xba<<< 
-
-/\w+/Lfr_FR
-    >>>\xaa<<<
-    >>>\xba<<< 
-
-/[\w]+/Lfr_FR
-    >>>\xaa<<<
-    >>>\xba<<< 
-
-/[[:alpha:]]+/Lfr_FR
-    >>>\xaa<<<
-    >>>\xba<<< 
-    
-/[[:alpha:]][[:lower:]][[:upper:]]/DZLfr_FR 
-
-/-- End of testinput3 --/
diff --git a/dist/testdata/testinput4 b/dist/testdata/testinput4
deleted file mode 100644
index 8bdbdac..0000000
--- a/dist/testdata/testinput4
+++ /dev/null
@@ -1,730 +0,0 @@
-/-- This set of tests is for UTF support, excluding Unicode properties. It is
-    compatible with all versions of Perl >= 5.10 and both the 8-bit and 16-bit
-    PCRE libraries. --/
-    
-< forbid 9?=ABCDEFfGILMNPTUWXZ<
-   
-/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}
-
-/^ሴ/8
-    ሴ 
-
-/^\ሴ/8
-    ሴ 
-
-"(?s)(.{1,5})"8
-    abcdefg
-    ab
-
-/a*\x{100}*\w/8
-    a 
-
-/\S\S/8g
-    A\x{a3}BC
-    
-/\S{2}/8g
-    A\x{a3}BC
-    
-/\W\W/8g
-    +\x{a3}== 
-
-/\W{2}/8g
-    +\x{a3}== 
-
-/\S/8g
-    \x{442}\x{435}\x{441}\x{442}
-
-/[\S]/8g
-    \x{442}\x{435}\x{441}\x{442}
-
-/\D/8g
-    \x{442}\x{435}\x{441}\x{442}
-
-/[\D]/8g
-    \x{442}\x{435}\x{441}\x{442}
-
-/\W/8g
-    \x{2442}\x{2435}\x{2441}\x{2442}
-
-/[\W]/8g
-    \x{2442}\x{2435}\x{2441}\x{2442}
-    
-/[\S\s]*/8
-    abc\n\r\x{442}\x{435}\x{441}\x{442}xyz 
-
-/[\x{41f}\S]/8g
-    \x{442}\x{435}\x{441}\x{442}
-
-/.[^\S]./8g
-    abc def\x{442}\x{443}xyz\npqr
-
-/.[^\S\n]./8g
-    abc def\x{442}\x{443}xyz\npqr
-
-/[[:^alnum:]]/8g  
-    +\x{2442}
-    
-/[[:^alpha:]]/8g 
-    +\x{2442}
-    
-/[[:^ascii:]]/8g 
-    A\x{442}
-    
-/[[:^blank:]]/8g 
-    A\x{442}
-    
-/[[:^cntrl:]]/8g 
-    A\x{442}
-    
-/[[:^digit:]]/8g 
-    A\x{442}
-    
-/[[:^graph:]]/8g 
-    \x19\x{e01ff}
-    
-/[[:^lower:]]/8g 
-    A\x{422}
-    
-/[[:^print:]]/8g 
-    \x{19}\x{e01ff}
-    
-/[[:^punct:]]/8g 
-    A\x{442}
-    
-/[[:^space:]]/8g 
-    A\x{442}
-    
-/[[:^upper:]]/8g 
-    a\x{442}
-    
-/[[:^word:]]/8g  
-    +\x{2442}
-    
-/[[:^xdigit:]]/8g
-    M\x{442}
-
-/[^ABCDEFGHIJKLMNOPQRSTUVWXYZÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞĀĂĄĆĈĊČĎĐĒĔĖĘĚĜĞĠĢĤĦĨĪĬĮİIJĴĶĹĻĽĿŁŃŅŇŊŌŎŐŒŔŖŘŚŜŞŠŢŤŦŨŪŬŮŰŲŴŶŸŹŻŽƁƂƄƆƇƉƊƋƎƏƐƑƓƔƖƗƘƜƝƟƠƢƤƦƧƩƬƮƯƱƲƳƵƷƸƼDŽLJNJǍǏǑǓǕǗǙǛǞǠǢǤǦǨǪǬǮDZǴǶǷǸǺǼǾȀȂȄȆȈȊȌȎȐȒȔȖȘȚȜȞȠȢȤȦȨȪȬȮȰȲȺȻȽȾɁΆΈΉΊΌΎΏΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩΪΫϒϓϔϘϚϜϞϠϢϤϦϨϪϬϮϴϷϹϺϽϾϿЀЁЂЃЄЅІЇЈЉЊЋЌЍЎЏАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯѠѢѤѦѨѪѬѮѰѲѴѶѸѺѼѾҀҊҌҎҐҒҔҖҘҚҜҞҠҢҤҦҨҪҬҮҰҲҴҶҸҺҼҾӀӁӃӅӇӉӋӍӐӒӔӖӘӚӜӞӠӢӤӦӨӪӬӮӰӲӴӶӸԀԂԄԆԈԊԌԎԱԲԳԴԵԶԷԸԹԺԻԼԽԾԿՀՁՂՃՄՅՆՇՈՉՊՋՌՍՎՏՐՑՒՓՔՕՖႠႡႢႣႤႥႦႧႨႩႪႫႬႭႮႯႰႱႲႳႴႵႶႷႸႹႺႻႼႽႾႿჀჁჂჃჄჅḀḂḄḆḈḊḌḎḐḒḔḖḘḚḜḞḠḢḤḦḨḪḬḮḰḲḴḶḸḺḼḾṀṂṄṆṈṊṌṎṐṒṔṖṘṚṜṞṠṢṤṦṨṪṬṮṰṲṴṶṸṺṼṾẀẂẄẆẈẊẌẎẐẒẔẠẢẤẦẨẪẬẮẰẲẴẶẸẺẼẾỀỂỄỆỈỊỌỎỐỒỔỖỘỚỜỞỠỢỤỦỨỪỬỮỰỲỴỶỸἈἉἊἋἌἍἎἏἘἙἚἛἜἝἨἩἪἫἬἭἮἯἸἹἺἻἼἽἾἿὈὉὊὋὌὍὙὛὝὟὨὩὪὫὬὭὮὯᾸᾹᾺΆῈΈῊΉῘῙῚΊῨῩῪΎῬῸΌῺΏabcdefghijklmnopqrstuvwxyzªµºßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿāăąćĉċčďđēĕėęěĝğġģĥħĩīĭįıijĵķĸĺļľŀłńņňʼnŋōŏőœŕŗřśŝşšţťŧũūŭůűųŵŷźżžſƀƃƅƈƌƍƒƕƙƚƛƞơƣƥƨƪƫƭưƴƶƹƺƽƾƿdžljnjǎǐǒǔǖǘǚǜǝǟǡǣǥǧǩǫǭǯǰdzǵǹǻǽǿȁȃȅȇȉȋȍȏȑȓȕȗșțȝȟȡȣȥȧȩȫȭȯȱȳȴȵȶȷȸȹȼȿɀɐɑɒɓɔɕɖɗɘəɚɛɜɝɞɟɠɡɢɣɤɥɦɧɨɩɪɫɬɭɮɯɰɱɲɳɴɵɶɷɸɹɺɻɼɽɾɿʀʁʂʃʄʅʆʇʈʉʊʋʌʍʎʏʐʑʒʓʔʕʖʗʘʙʚʛʜʝʞʟʠʡʢʣʤʥʦʧʨʩʪʫʬʭʮʯΐάέήίΰαβγδεζηθικλμνξοπρςστυφχψωϊϋόύώϐϑϕϖϗϙϛϝϟϡϣϥϧϩϫϭϯϰϱϲϳϵϸϻϼабвгдежзийклмнопрстуфхцчшщъыьэюяѐёђѓєѕіїјљњћќѝўџѡѣѥѧѩѫѭѯѱѳѵѷѹѻѽѿҁҋҍҏґғҕҗҙқҝҟҡңҥҧҩҫҭүұҳҵҷҹһҽҿӂӄӆӈӊӌӎӑӓӕӗәӛӝӟӡӣӥӧөӫӭӯӱӳӵӷӹԁԃԅԇԉԋԍԏաբգդեզէըթժիլխծկհձղճմյնշոչպջռսվտրցւփքօֆևᴀᴁᴂᴃᴄᴅᴆᴇᴈᴉᴊᴋᴌᴍᴎᴏᴐᴑᴒᴓᴔᴕᴖᴗᴘᴙᴚᴛᴜᴝᴞᴟᴠᴡᴢᴣᴤᴥᴦᴧᴨᴩᴪᴫᵢᵣᵤᵥᵦᵧᵨᵩᵪᵫᵬᵭᵮᵯᵰᵱᵲᵳᵴᵵᵶᵷᵹᵺᵻᵼᵽᵾᵿᶀᶁᶂᶃᶄᶅᶆᶇᶈᶉᶊᶋᶌᶍᶎᶏᶐᶑᶒᶓᶔᶕᶖᶗᶘᶙᶚḁḃḅḇḉḋḍḏḑḓḕḗḙḛḝḟḡḣḥḧḩḫḭḯḱḳḵḷḹḻḽḿṁṃṅṇṉṋṍṏṑṓṕṗṙṛṝṟṡṣṥṧṩṫṭṯṱṳṵṷṹṻṽṿẁẃẅẇẉẋẍẏẑẓẕẖẗẘẙẚẛạảấầẩẫậắằẳẵặẹẻẽếềểễệỉịọỏốồổỗộớờởỡợụủứừửữựỳỵỷỹἀἁἂἃἄἅἆἇἐἑἒἓἔἕἠἡἢἣἤἥἦἧἰἱἲἳἴἵἶἷὀὁὂὃὄὅὐὑὒὓὔὕὖὗὠὡὢὣὤὥὦὧὰάὲέὴήὶίὸόὺύὼώᾀᾁᾂᾃᾄᾅᾆᾇᾐᾑᾒᾓᾔᾕᾖᾗᾠᾡᾢᾣᾤᾥᾦᾧᾰᾱᾲᾳᾴᾶᾷιῂῃῄῆῇῐῑῒΐῖῗῠῡῢΰῤῥῦῧῲῳῴῶῷⲁⲃⲅⲇⲉⲋⲍⲏⲑⲓⲕⲗⲙⲛⲝⲟⲡⲣⲥⲧⲩⲫⲭⲯⲱⲳⲵⲷⲹⲻⲽⲿⳁⳃⳅⳇⳉⳋⳍⳏⳑⳓⳕⳗⳙⳛⳝⳟⳡⳣⳤⴀⴁⴂⴃⴄⴅⴆⴇⴈⴉⴊⴋⴌⴍⴎⴏⴐⴑⴒⴓⴔⴕⴖⴗⴘⴙⴚⴛⴜⴝⴞⴟⴠⴡⴢⴣⴤⴥfffiflffifflſtstﬓﬔﬕﬖﬗ\d-_^]/8
-
-/^[^d]*?$/
-    abc
-
-/^[^d]*?$/8
-    abc
-
-/^[^d]*?$/i
-    abc
-
-/^[^d]*?$/8i
-    abc
-
-/(?i)[\xc3\xa9\xc3\xbd]|[\xc3\xa9\xc3\xbdA]/8
-
-/^[a\x{c0}]b/8
-    \x{c0}b
-    
-/^([a\x{c0}]*?)aa/8
-    a\x{c0}aaaa/ 
-
-/^([a\x{c0}]*?)aa/8
-    a\x{c0}aaaa/ 
-    a\x{c0}a\x{c0}aaa/ 
-
-/^([a\x{c0}]*)aa/8
-    a\x{c0}aaaa/ 
-    a\x{c0}a\x{c0}aaa/ 
-
-/^([a\x{c0}]*)a\x{c0}/8
-    a\x{c0}aaaa/ 
-    a\x{c0}a\x{c0}aaa/ 
-
-/A*/g8
-    AAB\x{123}BAA
-
-/(abc)\1/8i
-   abc
-
-/(abc)\1/8
-   abc
-
-/a(*:a\x{1234}b)/8K
-    abc
-
-/a(*:a£b)/8K 
-    abc
-
-/-- Noncharacters --/
-
-/./8
-    \x{fffe}
-    \x{ffff}
-    \x{1fffe}
-    \x{1ffff}
-    \x{2fffe}
-    \x{2ffff}
-    \x{3fffe}
-    \x{3ffff}
-    \x{4fffe}
-    \x{4ffff}
-    \x{5fffe}
-    \x{5ffff}
-    \x{6fffe}
-    \x{6ffff}
-    \x{7fffe}
-    \x{7ffff}
-    \x{8fffe}
-    \x{8ffff}
-    \x{9fffe}
-    \x{9ffff}
-    \x{afffe}
-    \x{affff}
-    \x{bfffe}
-    \x{bffff}
-    \x{cfffe}
-    \x{cffff}
-    \x{dfffe}
-    \x{dffff}
-    \x{efffe}
-    \x{effff}
-    \x{ffffe}
-    \x{fffff}
-    \x{10fffe}
-    \x{10ffff}
-    \x{fdd0}
-    \x{fdd1}
-    \x{fdd2}
-    \x{fdd3}
-    \x{fdd4}
-    \x{fdd5}
-    \x{fdd6}
-    \x{fdd7}
-    \x{fdd8}
-    \x{fdd9}
-    \x{fdda}
-    \x{fddb}
-    \x{fddc}
-    \x{fddd}
-    \x{fdde}
-    \x{fddf}
-    \x{fde0}
-    \x{fde1}
-    \x{fde2}
-    \x{fde3}
-    \x{fde4}
-    \x{fde5}
-    \x{fde6}
-    \x{fde7}
-    \x{fde8}
-    \x{fde9}
-    \x{fdea}
-    \x{fdeb}
-    \x{fdec}
-    \x{fded}
-    \x{fdee}
-    \x{fdef}
-
-/^\d*\w{4}/8
-    1234
-    123 
-    
-/^[^b]*\w{4}/8
-    aaaa
-    aaa  
- 
-/^[^b]*\w{4}/8i
-    aaaa
-    aaa  
- 
-/^\x{100}*.{4}/8
-    \x{100}\x{100}\x{100}\x{100}
-    \x{100}\x{100}\x{100}
-
-/^\x{100}*.{4}/8i
-    \x{100}\x{100}\x{100}\x{100}
-    \x{100}\x{100}\x{100}
-
-/^a+[a\x{200}]/8
-    aa
-
-/^.\B.\B./8
-    \x{10123}\x{10124}\x{10125}
-
-/^#[^\x{ffff}]#[^\x{ffff}]#[^\x{ffff}]#/8
-    #\x{10000}#\x{100}#\x{10ffff}#
-
-"[\S\V\H]"8
-
-/\C(\W?ſ)'?{{/8
-    \\C(\\W?ſ)'?{{
-
-/-- End of testinput4 --/
diff --git a/dist/testdata/testinput5 b/dist/testdata/testinput5
deleted file mode 100644
index 28561a9..0000000
--- a/dist/testdata/testinput5
+++ /dev/null
Binary files differ
diff --git a/dist/testdata/testinput6 b/dist/testdata/testinput6
deleted file mode 100644
index aeb62a0..0000000
--- a/dist/testdata/testinput6
+++ /dev/null
@@ -1,1556 +0,0 @@
-/-- This set of tests is for Unicode property support. It is compatible with
-    Perl >= 5.15. --/
-    
-< forbid 9?=ABCDEFfGILMNPTUXZ<
-
-/^\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
-    \x{e0000}
-    ** Failers
-    \x{09f} 
-  
-/^\p{Co}/8
-    \x{f8ff}
-    ** Failers
-    \x{09f} 
-  
-/^\p{Ll}/8
-    a
-    ** Failers 
-    Z
-    \x{e000}  
-  
-/^\p{Lm}/8
-    \x{2b0}
-    ** Failers
-    a 
-  
-/^\p{Lo}/8
-    \x{1bb}
-    \x{3400}
-    \x{3401}
-    \x{4d00}
-    \x{4db4}
-    \x{4db5}     
-    ** Failers
-    a 
-    \x{2b0}
-    \x{4db6} 
-  
-/^\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{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{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
-  
-/(?<=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
-    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{Ll}/8 
-    a
-    Az
-    ** Failers
-    ABC   
-
-/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]/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
-
-/^\X/8
-    A
-    A\x{300}BC 
-    A\x{300}\x{301}\x{302}BC 
-    \x{300}  
-
-/^\p{Han}+/8
-    \x{2e81}\x{3007}\x{2f804}\x{31a0}
-    ** Failers
-    \x{2e7f}  
-
-/^\P{Katakana}+/8
-    \x{3105}
-    ** Failers
-    \x{30ff}  
-
-/^[\p{Arabic}]/8
-    \x{06e9}
-    \x{060b}
-    ** Failers
-    \x{061c}
-    X\x{06e9}   
-
-/^[\P{Yi}]/8
-    \x{2f800}
-    ** Failers
-    \x{a014}
-    \x{a4c6}   
-    
-/^\p{Any}X/8
-    AXYZ
-    \x{1234}XYZ 
-    ** Failers
-    X  
-    
-/^\P{Any}X/8
-    ** Failers
-    AX
-    
-/^\p{Any}?X/8
-    XYZ
-    AXYZ
-    \x{1234}XYZ 
-    ** Failers
-    ABXYZ   
-
-/^\P{Any}?X/8
-    XYZ
-    ** Failers
-    AXYZ
-    \x{1234}XYZ 
-    ABXYZ   
-
-/^\p{Any}+X/8
-    AXYZ
-    \x{1234}XYZ
-    A\x{1234}XYZ
-    ** Failers
-    XYZ
-
-/^\P{Any}+X/8
-    ** Failers
-    AXYZ
-    \x{1234}XYZ
-    A\x{1234}XYZ
-    XYZ
-
-/^\p{Any}*X/8
-    XYZ
-    AXYZ
-    \x{1234}XYZ
-    A\x{1234}XYZ
-    ** Failers
-
-/^\P{Any}*X/8
-    XYZ
-    ** Failers
-    AXYZ
-    \x{1234}XYZ
-    A\x{1234}XYZ
-
-/^[\p{Any}]X/8
-    AXYZ
-    \x{1234}XYZ 
-    ** Failers
-    X  
-    
-/^[\P{Any}]X/8
-    ** Failers
-    AX
-    
-/^[\p{Any}]?X/8
-    XYZ
-    AXYZ
-    \x{1234}XYZ 
-    ** Failers
-    ABXYZ   
-
-/^[\P{Any}]?X/8
-    XYZ
-    ** Failers
-    AXYZ
-    \x{1234}XYZ 
-    ABXYZ   
-
-/^[\p{Any}]+X/8
-    AXYZ
-    \x{1234}XYZ
-    A\x{1234}XYZ
-    ** Failers
-    XYZ
-
-/^[\P{Any}]+X/8
-    ** Failers
-    AXYZ
-    \x{1234}XYZ
-    A\x{1234}XYZ
-    XYZ
-
-/^[\p{Any}]*X/8
-    XYZ
-    AXYZ
-    \x{1234}XYZ
-    A\x{1234}XYZ
-    ** Failers
-
-/^[\P{Any}]*X/8
-    XYZ
-    ** Failers
-    AXYZ
-    \x{1234}XYZ
-    A\x{1234}XYZ
-
-/^\p{Any}{3,5}?/8
-    abcdefgh
-    \x{1234}\n\r\x{3456}xyz 
-
-/^\p{Any}{3,5}/8
-    abcdefgh
-    \x{1234}\n\r\x{3456}xyz 
-
-/^\P{Any}{3,5}?/8
-    ** Failers
-    abcdefgh
-    \x{1234}\n\r\x{3456}xyz 
-
-/^\p{L&}X/8
-     AXY
-     aXY
-     \x{1c5}XY
-     ** Failers
-     \x{1bb}XY
-     \x{2b0}XY
-     !XY      
-
-/^[\p{L&}]X/8
-     AXY
-     aXY
-     \x{1c5}XY
-     ** Failers
-     \x{1bb}XY
-     \x{2b0}XY
-     !XY      
-
-/^\p{L&}+X/8
-     AXY
-     aXY
-     AbcdeXyz 
-     \x{1c5}AbXY
-     abcDEXypqreXlmn 
-     ** Failers
-     \x{1bb}XY
-     \x{2b0}XY
-     !XY      
-
-/^[\p{L&}]+X/8
-     AXY
-     aXY
-     AbcdeXyz 
-     \x{1c5}AbXY
-     abcDEXypqreXlmn 
-     ** Failers
-     \x{1bb}XY
-     \x{2b0}XY
-     !XY      
-
-/^\p{L&}+?X/8
-     AXY
-     aXY
-     AbcdeXyz 
-     \x{1c5}AbXY
-     abcDEXypqreXlmn 
-     ** Failers
-     \x{1bb}XY
-     \x{2b0}XY
-     !XY      
-
-/^[\p{L&}]+?X/8
-     AXY
-     aXY
-     AbcdeXyz 
-     \x{1c5}AbXY
-     abcDEXypqreXlmn 
-     ** Failers
-     \x{1bb}XY
-     \x{2b0}XY
-     !XY      
-
-/^\P{L&}X/8
-     !XY
-     \x{1bb}XY
-     \x{2b0}XY
-     ** Failers
-     \x{1c5}XY
-     AXY      
-
-/^[\P{L&}]X/8
-     !XY
-     \x{1bb}XY
-     \x{2b0}XY
-     ** Failers
-     \x{1c5}XY
-     AXY      
-
-/^(\p{Z}[^\p{C}\p{Z}]+)*$/
-    \xa0!
-
-/^[\pL](abc)(?1)/
-    AabcabcYZ    
-
-/([\pL]=(abc))*X/
-    L=abcX
-
-/^\p{Balinese}\p{Cuneiform}\p{Nko}\p{Phags_Pa}\p{Phoenician}/8
-    \x{1b00}\x{12000}\x{7c0}\x{a840}\x{10900}
-
-/Check property support in non-UTF-8 mode/
- 
-/\p{L}{4}/
-    123abcdefg
-    123abc\xc4\xc5zz
-
-/\X{1,3}\d/
-  \x8aBCD
-  
-/\X?\d/
-  \x8aBCD 
-
-/\P{L}?\d/
-  \x8aBCD 
-
-/[\PPP\x8a]{1,}\x80/
-    A\x80
-
-/^[\p{Arabic}]/8
-    \x{604}
-    \x{60e} 
-    \x{656} 
-    \x{657} 
-    \x{658} 
-    \x{659} 
-    \x{65a} 
-    \x{65b} 
-    \x{65c} 
-    \x{65d} 
-    \x{65e} 
-    \x{65f}
-    \x{66a} 
-    \x{6e9} 
-    \x{6ef}
-    \x{6fa}  
-    ** Failers
-    \x{650}
-    \x{651}  
-    \x{652}  
-    \x{653}  
-    \x{654} 
-    \x{655} 
-    
-/^\p{Cyrillic}/8
-    \x{1d2b} 
-    
-/^\p{Common}/8
-    \x{589}
-    \x{60c}
-    \x{61f}  
-    \x{964}
-    \x{965}  
-
-/^\p{Inherited}/8
-    \x{64b}
-    \x{654}
-    \x{655}
-    \x{200c} 
-    ** Failers
-    \x{64a}
-    \x{656}     
-
-/^\p{Shavian}/8
-    \x{10450}
-    \x{1047f}
-    
-/^\p{Deseret}/8
-    \x{10400}
-    \x{1044f}
-    
-/^\p{Osmanya}/8
-    \x{10480}
-    \x{1049d}
-    \x{104a0}
-    \x{104a9}
-    ** Failers
-    \x{1049e}
-    \x{1049f}
-    \x{104aa}           
-
-/\p{Carian}\p{Cham}\p{Kayah_Li}\p{Lepcha}\p{Lycian}\p{Lydian}\p{Ol_Chiki}\p{Rejang}\p{Saurashtra}\p{Sundanese}\p{Vai}/8
-    \x{102A4}\x{AA52}\x{A91D}\x{1C46}\x{10283}\x{1092E}\x{1C6B}\x{A93B}\x{A8BF}\x{1BA0}\x{A50A}====
-
-/\x{a77d}\x{1d79}/8i
-    \x{a77d}\x{1d79}
-    \x{1d79}\x{a77d} 
-
-/\x{a77d}\x{1d79}/8
-    \x{a77d}\x{1d79}
-    ** Failers 
-    \x{1d79}\x{a77d} 
-
-/(A)\1/8i
-    AA
-    Aa
-    aa
-    aA
-
-/(\x{10a})\1/8i
-    \x{10a}\x{10a}
-    \x{10a}\x{10b}
-    \x{10b}\x{10b}
-    \x{10b}\x{10a}
-    
-/The next two tests are for property support in non-UTF-8 mode/
-
-/(?:\p{Lu}|\x20)+/
-    \x41\x20\x50\xC2\x54\xC9\x20\x54\x4F\x44\x41\x59
-
-/[\p{Lu}\x20]+/
-    \x41\x20\x50\xC2\x54\xC9\x20\x54\x4F\x44\x41\x59
-
-/\p{Avestan}\p{Bamum}\p{Egyptian_Hieroglyphs}\p{Imperial_Aramaic}\p{Inscriptional_Pahlavi}\p{Inscriptional_Parthian}\p{Javanese}\p{Kaithi}\p{Lisu}\p{Meetei_Mayek}\p{Old_South_Arabian}\p{Old_Turkic}\p{Samaritan}\p{Tai_Tham}\p{Tai_Viet}/8
-    \x{10b00}\x{a6ef}\x{13007}\x{10857}\x{10b78}\x{10b58}\x{a980}\x{110c1}\x{a4ff}\x{abc0}\x{10a7d}\x{10c48}\x{0800}\x{1aad}\x{aac0}
-
-/^\w+/8W
-    Az_\x{aa}\x{c0}\x{1c5}\x{2b0}\x{3b6}\x{1d7c9}\x{2fa1d}1\x{660}\x{bef}\x{16ee}
-
-/^[[:xdigit:]]*/8W
-    1a\x{660}\x{bef}\x{16ee}
-  
-/^\d+/8W
-    1\x{660}\x{bef}\x{16ee}
-  
-/^[[:digit:]]+/8W
-    1\x{660}\x{bef}\x{16ee}
-
-/^>\s+/8W
-    >\x{20}\x{a0}\x{1680}\x{2028}\x{2029}\x{202f}\x{9}\x{b} 
-  
-/^>\pZ+/8W
-    >\x{20}\x{a0}\x{1680}\x{2028}\x{2029}\x{202f}\x{9}\x{b} 
-  
-/^>[[:space:]]*/8W
-    >\x{20}\x{a0}\x{1680}\x{2028}\x{2029}\x{202f}\x{9}\x{b} 
-
-/^>[[:blank:]]*/8W
-    >\x{20}\x{a0}\x{1680}\x{180e}\x{2000}\x{202f}\x{9}\x{b}\x{2028} 
-
-/^[[:alpha:]]*/8W
-    Az\x{aa}\x{c0}\x{1c5}\x{2b0}\x{3b6}\x{1d7c9}\x{2fa1d}
-
-/^[[:alnum:]]*/8W
-    Az\x{aa}\x{c0}\x{1c5}\x{2b0}\x{3b6}\x{1d7c9}\x{2fa1d}1\x{660}\x{bef}\x{16ee}
-
-/^[[:cntrl:]]*/8W
-    \x{0}\x{09}\x{1f}\x{7f}\x{9f} 
-
-/^[[:graph:]]*/8W
-    A\x{a1}\x{a0}
-
-/^[[:print:]]*/8W
-    A z\x{a0}\x{a1}
-
-/^[[:punct:]]*/8W
-    .+\x{a1}\x{a0}
-
-/\p{Zs}*?\R/
-    ** Failers
-    a\xFCb   
-
-/\p{Zs}*\R/                                                                    
-    ** Failers 
-    a\xFCb   
-
-/ⱥ/8i
-    ⱥ
-    Ⱥx 
-    Ⱥ 
-
-/[ⱥ]/8i
-    ⱥ
-    Ⱥx 
-    Ⱥ 
-
-/Ⱥ/8i
-    Ⱥ
-    ⱥ
-    
-/-- These are tests for extended grapheme clusters --/ 
-
-/^\X/8+
-    G\x{34e}\x{34e}X
-    \x{34e}\x{34e}X
-    \x04X
-    \x{1100}X
-    \x{1100}\x{34e}X
-    \x{1b04}\x{1b04}X 
-    *These match up to the roman letters
-    \x{1111}\x{1111}L,L
-    \x{1111}\x{1111}\x{1169}L,L,V
-    \x{1111}\x{ae4c}L, LV
-    \x{1111}\x{ad89}L, LVT
-    \x{1111}\x{ae4c}\x{1169}L, LV, V
-    \x{1111}\x{ae4c}\x{1169}\x{1169}L, LV, V, V
-    \x{1111}\x{ae4c}\x{1169}\x{11fe}L, LV, V, T
-    \x{1111}\x{ad89}\x{11fe}L, LVT, T
-    \x{1111}\x{ad89}\x{11fe}\x{11fe}L, LVT, T, T
-    \x{ad89}\x{11fe}\x{11fe}LVT, T, T
-    *These match just the first codepoint (invalid sequence)
-    \x{1111}\x{11fe}L, T
-    \x{ae4c}\x{1111}LV, L
-    \x{ae4c}\x{ae4c}LV, LV
-    \x{ae4c}\x{ad89}LV, LVT
-    \x{1169}\x{1111}V, L
-    \x{1169}\x{ae4c}V, LV
-    \x{1169}\x{ad89}V, LVT
-    \x{ad89}\x{1111}LVT, L
-    \x{ad89}\x{1169}LVT, V
-    \x{ad89}\x{ae4c}LVT, LV
-    \x{ad89}\x{ad89}LVT, LVT
-    \x{11fe}\x{1111}T, L
-    \x{11fe}\x{1169}T, V
-    \x{11fe}\x{ae4c}T, LV
-    \x{11fe}\x{ad89}T, LVT
-    *Test extend and spacing mark
-    \x{1111}\x{ae4c}\x{0711}L, LV, extend
-    \x{1111}\x{ae4c}\x{1b04}L, LV, spacing mark
-    \x{1111}\x{ae4c}\x{1b04}\x{0711}\x{1b04}L, LV, spacing mark, extend, spacing mark
-    *Test CR, LF, and control
-    \x0d\x{0711}CR, extend
-    \x0d\x{1b04}CR, spacingmark
-    \x0a\x{0711}LF, extend
-    \x0a\x{1b04}LF, spacingmark
-    \x0b\x{0711}Control, extend
-    \x09\x{1b04}Control, spacingmark
-    *There are no Prepend characters, so we can't test Prepend, CR
-    
-/^(?>\X{2})X/8+
-    \x{1111}\x{ae4c}\x{1111}\x{ae4c}X
-    
-/^\X{2,4}X/8+
-    \x{1111}\x{ae4c}\x{1111}\x{ae4c}X
-    \x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}X
-    \x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}X
-
-/^\X{2,4}?X/8+
-    \x{1111}\x{ae4c}\x{1111}\x{ae4c}X
-    \x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}X
-    \x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}X
-
-/\X*Z/8Y
-  A\x{300}
-
-/\X*(.)/8Y
-  A\x{1111}\x{ae4c}\x{1169}
-
-/\X?abc/8Y
-\xff\x7f\x00\x00\x03\x00\x41\xcc\x80\x41\x{300}\x61\x62\x63\x00\>06\?
-
-/-- --/
-
-/\x{1e9e}+/8i
-    \x{1e9e}\x{00df}
-
-/[z\x{1e9e}]+/8i
-    \x{1e9e}\x{00df}
-
-/\x{00df}+/8i
-    \x{1e9e}\x{00df}
-
-/[z\x{00df}]+/8i
-    \x{1e9e}\x{00df}
-
-/\x{1f88}+/8i
-    \x{1f88}\x{1f80} 
-
-/[z\x{1f88}]+/8i
-    \x{1f88}\x{1f80} 
-    
-/-- Characters with more than one other case; test in classes --/
-
-/[z\x{00b5}]+/8i
-    \x{00b5}\x{039c}\x{03bc}
-
-/[z\x{039c}]+/8i
-    \x{00b5}\x{039c}\x{03bc}
-
-/[z\x{03bc}]+/8i
-    \x{00b5}\x{039c}\x{03bc}
-
-/[z\x{00c5}]+/8i
-    \x{00c5}\x{00e5}\x{212b}
-
-/[z\x{00e5}]+/8i
-    \x{00c5}\x{00e5}\x{212b}
-
-/[z\x{212b}]+/8i
-    \x{00c5}\x{00e5}\x{212b}
-
-/[z\x{01c4}]+/8i
-    \x{01c4}\x{01c5}\x{01c6}
-
-/[z\x{01c5}]+/8i
-    \x{01c4}\x{01c5}\x{01c6}
-
-/[z\x{01c6}]+/8i
-    \x{01c4}\x{01c5}\x{01c6}
-
-/[z\x{01c7}]+/8i
-    \x{01c7}\x{01c8}\x{01c9}
-
-/[z\x{01c8}]+/8i
-    \x{01c7}\x{01c8}\x{01c9}
-
-/[z\x{01c9}]+/8i
-    \x{01c7}\x{01c8}\x{01c9}
-
-/[z\x{01ca}]+/8i
-    \x{01ca}\x{01cb}\x{01cc}
-
-/[z\x{01cb}]+/8i
-    \x{01ca}\x{01cb}\x{01cc}
-
-/[z\x{01cc}]+/8i
-    \x{01ca}\x{01cb}\x{01cc}
-
-/[z\x{01f1}]+/8i
-    \x{01f1}\x{01f2}\x{01f3}
-
-/[z\x{01f2}]+/8i
-    \x{01f1}\x{01f2}\x{01f3}
-
-/[z\x{01f3}]+/8i
-    \x{01f1}\x{01f2}\x{01f3}
-
-/[z\x{0345}]+/8i
-    \x{0345}\x{0399}\x{03b9}\x{1fbe}
-
-/[z\x{0399}]+/8i
-    \x{0345}\x{0399}\x{03b9}\x{1fbe}
-
-/[z\x{03b9}]+/8i
-    \x{0345}\x{0399}\x{03b9}\x{1fbe}
-
-/[z\x{1fbe}]+/8i
-    \x{0345}\x{0399}\x{03b9}\x{1fbe}
-
-/[z\x{0392}]+/8i
-    \x{0392}\x{03b2}\x{03d0}
-
-/[z\x{03b2}]+/8i
-    \x{0392}\x{03b2}\x{03d0}
-
-/[z\x{03d0}]+/8i
-    \x{0392}\x{03b2}\x{03d0}
-
-/[z\x{0395}]+/8i
-    \x{0395}\x{03b5}\x{03f5}
-
-/[z\x{03b5}]+/8i
-    \x{0395}\x{03b5}\x{03f5}
-
-/[z\x{03f5}]+/8i
-    \x{0395}\x{03b5}\x{03f5}
-
-/[z\x{0398}]+/8i
-    \x{0398}\x{03b8}\x{03d1}\x{03f4}
-
-/[z\x{03b8}]+/8i
-    \x{0398}\x{03b8}\x{03d1}\x{03f4}
-
-/[z\x{03d1}]+/8i
-    \x{0398}\x{03b8}\x{03d1}\x{03f4}
-
-/[z\x{03f4}]+/8i
-    \x{0398}\x{03b8}\x{03d1}\x{03f4}
-
-/[z\x{039a}]+/8i
-    \x{039a}\x{03ba}\x{03f0}
-
-/[z\x{03ba}]+/8i
-    \x{039a}\x{03ba}\x{03f0}
-
-/[z\x{03f0}]+/8i
-    \x{039a}\x{03ba}\x{03f0}
-
-/[z\x{03a0}]+/8i
-    \x{03a0}\x{03c0}\x{03d6} 
-
-/[z\x{03c0}]+/8i
-    \x{03a0}\x{03c0}\x{03d6} 
-
-/[z\x{03d6}]+/8i
-    \x{03a0}\x{03c0}\x{03d6} 
-
-/[z\x{03a1}]+/8i
-    \x{03a1}\x{03c1}\x{03f1}
-
-/[z\x{03c1}]+/8i
-    \x{03a1}\x{03c1}\x{03f1}
-
-/[z\x{03f1}]+/8i
-    \x{03a1}\x{03c1}\x{03f1}
-
-/[z\x{03a3}]+/8i
-    \x{03A3}\x{03C2}\x{03C3}
-
-/[z\x{03c2}]+/8i
-    \x{03A3}\x{03C2}\x{03C3}
-
-/[z\x{03c3}]+/8i
-    \x{03A3}\x{03C2}\x{03C3}
-
-/[z\x{03a6}]+/8i
-    \x{03a6}\x{03c6}\x{03d5} 
-
-/[z\x{03c6}]+/8i
-    \x{03a6}\x{03c6}\x{03d5} 
-
-/[z\x{03d5}]+/8i
-    \x{03a6}\x{03c6}\x{03d5} 
-
-/[z\x{03c9}]+/8i
-    \x{03c9}\x{03a9}\x{2126}
-
-/[z\x{03a9}]+/8i
-    \x{03c9}\x{03a9}\x{2126}
-
-/[z\x{2126}]+/8i
-    \x{03c9}\x{03a9}\x{2126}
-
-/[z\x{1e60}]+/8i
-    \x{1e60}\x{1e61}\x{1e9b}
-
-/[z\x{1e61}]+/8i
-    \x{1e60}\x{1e61}\x{1e9b}
-
-/[z\x{1e9b}]+/8i
-    \x{1e60}\x{1e61}\x{1e9b}
-
-/-- Perl 5.12.4 gets these wrong, but 5.15.3 is OK --/
-
-/[z\x{004b}]+/8i
-    \x{004b}\x{006b}\x{212a}
-
-/[z\x{006b}]+/8i
-    \x{004b}\x{006b}\x{212a}
-
-/[z\x{212a}]+/8i
-    \x{004b}\x{006b}\x{212a}
-
-/[z\x{0053}]+/8i
-    \x{0053}\x{0073}\x{017f}
-
-/[z\x{0073}]+/8i
-    \x{0053}\x{0073}\x{017f}
-
-/[z\x{017f}]+/8i
-    \x{0053}\x{0073}\x{017f}
-    
-/-- --/ 
-
-/(ΣΆΜΟΣ) \1/8i
-    ΣΆΜΟΣ ΣΆΜΟΣ
-    ΣΆΜΟΣ σάμος
-    σάμος σάμος
-    σάμος σάμοσ
-    σάμος ΣΆΜΟΣ  
-
-/(σάμος) \1/8i
-    ΣΆΜΟΣ ΣΆΜΟΣ
-    ΣΆΜΟΣ σάμος
-    σάμος σάμος
-    σάμος σάμοσ
-    σάμος ΣΆΜΟΣ  
-
-/(ΣΆΜΟΣ) \1*/8i
-    ΣΆΜΟΣ\x20
-    ΣΆΜΟΣ ΣΆΜΟΣσάμοςσάμος
-
-/-- Perl matches these --/
-
-/\x{00b5}+/8i
-    \x{00b5}\x{039c}\x{03bc}
-
-/\x{039c}+/8i
-    \x{00b5}\x{039c}\x{03bc}
-
-/\x{03bc}+/8i
-    \x{00b5}\x{039c}\x{03bc}
-
-
-/\x{00c5}+/8i
-    \x{00c5}\x{00e5}\x{212b}
-
-/\x{00e5}+/8i
-    \x{00c5}\x{00e5}\x{212b}
-
-/\x{212b}+/8i
-    \x{00c5}\x{00e5}\x{212b}
-
-
-/\x{01c4}+/8i
-    \x{01c4}\x{01c5}\x{01c6}
-
-/\x{01c5}+/8i
-    \x{01c4}\x{01c5}\x{01c6}
-
-/\x{01c6}+/8i
-    \x{01c4}\x{01c5}\x{01c6}
-
-
-/\x{01c7}+/8i
-    \x{01c7}\x{01c8}\x{01c9}
-
-/\x{01c8}+/8i
-    \x{01c7}\x{01c8}\x{01c9}
-
-/\x{01c9}+/8i
-    \x{01c7}\x{01c8}\x{01c9}
-
-
-/\x{01ca}+/8i
-    \x{01ca}\x{01cb}\x{01cc}
-
-/\x{01cb}+/8i
-    \x{01ca}\x{01cb}\x{01cc}
-
-/\x{01cc}+/8i
-    \x{01ca}\x{01cb}\x{01cc}
-
-
-/\x{01f1}+/8i
-    \x{01f1}\x{01f2}\x{01f3}
-
-/\x{01f2}+/8i
-    \x{01f1}\x{01f2}\x{01f3}
-
-/\x{01f3}+/8i
-    \x{01f1}\x{01f2}\x{01f3}
-
-
-/\x{0345}+/8i
-    \x{0345}\x{0399}\x{03b9}\x{1fbe}
-
-/\x{0399}+/8i
-    \x{0345}\x{0399}\x{03b9}\x{1fbe}
-
-/\x{03b9}+/8i
-    \x{0345}\x{0399}\x{03b9}\x{1fbe}
-
-/\x{1fbe}+/8i
-    \x{0345}\x{0399}\x{03b9}\x{1fbe}
-
-
-/\x{0392}+/8i
-    \x{0392}\x{03b2}\x{03d0}
-
-/\x{03b2}+/8i
-    \x{0392}\x{03b2}\x{03d0}
-
-/\x{03d0}+/8i
-    \x{0392}\x{03b2}\x{03d0}
-    
-
-/\x{0395}+/8i
-    \x{0395}\x{03b5}\x{03f5}
-
-/\x{03b5}+/8i
-    \x{0395}\x{03b5}\x{03f5}
-
-/\x{03f5}+/8i
-    \x{0395}\x{03b5}\x{03f5}
-
-
-/\x{0398}+/8i
-    \x{0398}\x{03b8}\x{03d1}\x{03f4}
-
-/\x{03b8}+/8i
-    \x{0398}\x{03b8}\x{03d1}\x{03f4}
-
-/\x{03d1}+/8i
-    \x{0398}\x{03b8}\x{03d1}\x{03f4}
-
-/\x{03f4}+/8i
-    \x{0398}\x{03b8}\x{03d1}\x{03f4}
-    
-
-/\x{039a}+/8i
-    \x{039a}\x{03ba}\x{03f0}
-
-/\x{03ba}+/8i
-    \x{039a}\x{03ba}\x{03f0}
-
-/\x{03f0}+/8i
-    \x{039a}\x{03ba}\x{03f0}
-    
-
-/\x{03a0}+/8i
-    \x{03a0}\x{03c0}\x{03d6} 
-
-/\x{03c0}+/8i
-    \x{03a0}\x{03c0}\x{03d6} 
-
-/\x{03d6}+/8i
-    \x{03a0}\x{03c0}\x{03d6} 
-
-
-/\x{03a1}+/8i
-    \x{03a1}\x{03c1}\x{03f1}
-
-/\x{03c1}+/8i
-    \x{03a1}\x{03c1}\x{03f1}
-
-/\x{03f1}+/8i
-    \x{03a1}\x{03c1}\x{03f1}
-
-
-/\x{03a3}+/8i
-    \x{03A3}\x{03C2}\x{03C3}
-
-/\x{03c2}+/8i
-    \x{03A3}\x{03C2}\x{03C3}
-
-/\x{03c3}+/8i
-    \x{03A3}\x{03C2}\x{03C3}
-    
-
-/\x{03a6}+/8i
-    \x{03a6}\x{03c6}\x{03d5} 
-
-/\x{03c6}+/8i
-    \x{03a6}\x{03c6}\x{03d5} 
-
-/\x{03d5}+/8i
-    \x{03a6}\x{03c6}\x{03d5} 
-
-
-/\x{03c9}+/8i
-    \x{03c9}\x{03a9}\x{2126}
-
-/\x{03a9}+/8i
-    \x{03c9}\x{03a9}\x{2126}
-
-/\x{2126}+/8i
-    \x{03c9}\x{03a9}\x{2126}
-    
-
-/\x{1e60}+/8i
-    \x{1e60}\x{1e61}\x{1e9b}
-
-/\x{1e61}+/8i
-    \x{1e60}\x{1e61}\x{1e9b}
-
-/\x{1e9b}+/8i
-    \x{1e60}\x{1e61}\x{1e9b}
-    
-
-/\x{1e9e}+/8i
-    \x{1e9e}\x{00df}
-
-/\x{00df}+/8i
-    \x{1e9e}\x{00df}
-    
-
-/\x{1f88}+/8i
-    \x{1f88}\x{1f80} 
-
-/\x{1f80}+/8i
-    \x{1f88}\x{1f80} 
-
-
-/-- Perl 5.12.4 gets these wrong, but 5.15.3 is OK --/
-
-/\x{004b}+/8i
-    \x{004b}\x{006b}\x{212a}
-
-/\x{006b}+/8i
-    \x{004b}\x{006b}\x{212a}
-
-/\x{212a}+/8i
-    \x{004b}\x{006b}\x{212a}
-
-
-/\x{0053}+/8i
-    \x{0053}\x{0073}\x{017f}
-
-/\x{0073}+/8i
-    \x{0053}\x{0073}\x{017f}
-
-/\x{017f}+/8i
-    \x{0053}\x{0073}\x{017f}
-
-/^\p{Any}*\d{4}/8
-    1234
-    123 
-
-/^\X*\w{4}/8
-    1234
-    123  
-
-/^A\s+Z/8W
-    A\x{2005}Z
-    A\x{85}\x{180e}\x{2005}Z
-
-/^A[\s]+Z/8W
-    A\x{2005}Z
-    A\x{85}\x{180e}\x{2005}Z
-
-/^[[:graph:]]+$/8W
-    Letter:ABC
-    Mark:\x{300}\x{1d172}\x{1d17b}
-    Number:9\x{660}
-    Punctuation:\x{66a},;
-    Symbol:\x{6de}<>\x{fffc}
-    Cf-property:\x{ad}\x{600}\x{601}\x{602}\x{603}\x{604}\x{6dd}\x{70f}
-    \x{200b}\x{200c}\x{200d}\x{200e}\x{200f}
-    \x{202a}\x{202b}\x{202c}\x{202d}\x{202e}
-    \x{2060}\x{2061}\x{2062}\x{2063}\x{2064}
-    \x{206a}\x{206b}\x{206c}\x{206d}\x{206e}\x{206f}
-    \x{feff}
-    \x{fff9}\x{fffa}\x{fffb}
-    \x{110bd}
-    \x{1d173}\x{1d174}\x{1d175}\x{1d176}\x{1d177}\x{1d178}\x{1d179}\x{1d17a}
-    \x{e0001}
-    \x{e0020}\x{e0030}\x{e0040}\x{e0050}\x{e0060}\x{e0070}\x{e007f}
-    ** Failers
-    \x{09}
-    \x{0a}
-    \x{1D}
-    \x{20}
-    \x{85}
-    \x{a0}
-    \x{61c}
-    \x{1680}
-    \x{180e}
-    \x{2028}
-    \x{2029}
-    \x{202f}
-    \x{2065}
-    \x{2066}
-    \x{2067}
-    \x{2068}
-    \x{2069}
-    \x{3000}
-    \x{e0002}
-    \x{e001f}
-    \x{e0080} 
-
-/^[[:print:]]+$/8W
-    Space: \x{a0}
-    \x{1680}\x{2000}\x{2001}\x{2002}\x{2003}\x{2004}\x{2005}
-    \x{2006}\x{2007}\x{2008}\x{2009}\x{200a} 
-    \x{202f}\x{205f} 
-    \x{3000}
-    Letter:ABC
-    Mark:\x{300}\x{1d172}\x{1d17b}
-    Number:9\x{660}
-    Punctuation:\x{66a},;
-    Symbol:\x{6de}<>\x{fffc}
-    Cf-property:\x{ad}\x{600}\x{601}\x{602}\x{603}\x{604}\x{6dd}\x{70f}
-    \x{180e}
-    \x{200b}\x{200c}\x{200d}\x{200e}\x{200f}
-    \x{202a}\x{202b}\x{202c}\x{202d}\x{202e}
-    \x{202f}
-    \x{2060}\x{2061}\x{2062}\x{2063}\x{2064}
-    \x{206a}\x{206b}\x{206c}\x{206d}\x{206e}\x{206f}
-    \x{feff}
-    \x{fff9}\x{fffa}\x{fffb}
-    \x{110bd}
-    \x{1d173}\x{1d174}\x{1d175}\x{1d176}\x{1d177}\x{1d178}\x{1d179}\x{1d17a}
-    \x{e0001}
-    \x{e0020}\x{e0030}\x{e0040}\x{e0050}\x{e0060}\x{e0070}\x{e007f}
-    ** Failers
-    \x{09}
-    \x{1D}
-    \x{85}
-    \x{61c}
-    \x{2028}
-    \x{2029}
-    \x{2065}
-    \x{2066}
-    \x{2067}
-    \x{2068}
-    \x{2069}
-    \x{e0002}
-    \x{e001f}
-    \x{e0080} 
-
-/^[[:punct:]]+$/8W
-    \$+<=>^`|~
-    !\"#%&'()*,-./:;?@[\\]_{}
-    \x{a1}\x{a7}  
-    \x{37e} 
-    ** Failers
-    abcde  
-
-/^[[:^graph:]]+$/8W
-    \x{09}\x{0a}\x{1D}\x{20}\x{85}\x{a0}\x{61c}\x{1680}\x{180e}
-    \x{2028}\x{2029}\x{202f}\x{2065}\x{2066}\x{2067}\x{2068}\x{2069}
-    \x{3000}\x{e0002}\x{e001f}\x{e0080}
-    ** Failers
-    Letter:ABC
-    Mark:\x{300}\x{1d172}\x{1d17b}
-    Number:9\x{660}
-    Punctuation:\x{66a},;
-    Symbol:\x{6de}<>\x{fffc}
-    Cf-property:\x{ad}\x{600}\x{601}\x{602}\x{603}\x{604}\x{6dd}\x{70f}
-    \x{200b}\x{200c}\x{200d}\x{200e}\x{200f}
-    \x{202a}\x{202b}\x{202c}\x{202d}\x{202e}
-    \x{2060}\x{2061}\x{2062}\x{2063}\x{2064}
-    \x{206a}\x{206b}\x{206c}\x{206d}\x{206e}\x{206f}
-    \x{feff}
-    \x{fff9}\x{fffa}\x{fffb}
-    \x{110bd}
-    \x{1d173}\x{1d174}\x{1d175}\x{1d176}\x{1d177}\x{1d178}\x{1d179}\x{1d17a}
-    \x{e0001}
-    \x{e0020}\x{e0030}\x{e0040}\x{e0050}\x{e0060}\x{e0070}\x{e007f}
-
-/^[[:^print:]]+$/8W
-    \x{09}\x{1D}\x{85}\x{61c}\x{2028}\x{2029}\x{2065}\x{2066}\x{2067}
-    \x{2068}\x{2069}\x{e0002}\x{e001f}\x{e0080}
-    ** Failers
-    Space: \x{a0}
-    \x{1680}\x{2000}\x{2001}\x{2002}\x{2003}\x{2004}\x{2005}
-    \x{2006}\x{2007}\x{2008}\x{2009}\x{200a} 
-    \x{202f}\x{205f} 
-    \x{3000}
-    Letter:ABC
-    Mark:\x{300}\x{1d172}\x{1d17b}
-    Number:9\x{660}
-    Punctuation:\x{66a},;
-    Symbol:\x{6de}<>\x{fffc}
-    Cf-property:\x{ad}\x{600}\x{601}\x{602}\x{603}\x{604}\x{6dd}\x{70f}
-    \x{180e}
-    \x{200b}\x{200c}\x{200d}\x{200e}\x{200f}
-    \x{202a}\x{202b}\x{202c}\x{202d}\x{202e}
-    \x{202f}
-    \x{2060}\x{2061}\x{2062}\x{2063}\x{2064}
-    \x{206a}\x{206b}\x{206c}\x{206d}\x{206e}\x{206f}
-    \x{feff}
-    \x{fff9}\x{fffa}\x{fffb}
-    \x{110bd}
-    \x{1d173}\x{1d174}\x{1d175}\x{1d176}\x{1d177}\x{1d178}\x{1d179}\x{1d17a}
-    \x{e0001}
-    \x{e0020}\x{e0030}\x{e0040}\x{e0050}\x{e0060}\x{e0070}\x{e007f}
-
-/^[[:^punct:]]+$/8W
-    abcde  
-    ** Failers
-    \$+<=>^`|~
-    !\"#%&'()*,-./:;?@[\\]_{}
-    \x{a1}\x{a7}  
-    \x{37e} 
-
-/[RST]+/8iW
-    Ss\x{17f}
-    
-/[R-T]+/8iW 
-    Ss\x{17f}
-
-/[q-u]+/8iW 
-    Ss\x{17f}
-
-/^s?c/mi8
-    scat
-
-/[A-`]/i8
-    abcdefghijklmno
-
-/\C\X*QT/8
-    Ӆ\x0aT
-
-/[\pS#moq]/
-    =
-
-/[[:punct:]]/8W
-    \xc2\xb4
-    \x{b4} 
-
-/[[:^ascii:]]/8W
-    \x{100}
-    \x{200}
-    \x{300}
-    \x{37e}
-    a
-    9
-    g
-
-/[[:^ascii:]\w]/8W
-    a
-    9
-    g
-    \x{100}
-    \x{200}
-    \x{300}
-    \x{37e}
-
-/[\w[:^ascii:]]/8W
-    a
-    9
-    g
-    \x{100}
-    \x{200}
-    \x{300}
-    \x{37e}
-
-/[^[:ascii:]\W]/8W
-    a
-    9
-    g
-    \x{100}
-    \x{200}
-    \x{300}
-    \x{37e}
-
-/[[:^ascii:]a]/8W
-    a
-    9
-    g
-    \x{100}
-    \x{200}
-    \x{37e}
-
-/-- End of testinput6 --/
diff --git a/dist/testdata/testinput7 b/dist/testdata/testinput7
deleted file mode 100644
index e411a4b..0000000
--- a/dist/testdata/testinput7
+++ /dev/null
@@ -1,856 +0,0 @@
-/-- These tests for Unicode property support test PCRE's API and show some of
-    the compiled code. They are not Perl-compatible. --/
-
-/[\p{L}]/DZ
-
-/[\p{^L}]/DZ
-
-/[\P{L}]/DZ
-
-/[\P{^L}]/DZ
-
-/[abc\p{L}\x{0660}]/8DZ
-
-/[\p{Nd}]/8DZ
-    1234
-
-/[\p{Nd}+-]+/8DZ
-    1234
-    12-34
-    12+\x{661}-34  
-    ** Failers
-    abcd  
-
-/[\x{105}-\x{109}]/8iDZ
-    \x{104}
-    \x{105}
-    \x{109}  
-    ** Failers
-    \x{100}
-    \x{10a} 
-    
-/[z-\x{100}]/8iDZ 
-    Z
-    z
-    \x{39c}
-    \x{178}
-    |
-    \x{80}
-    \x{ff}
-    \x{100}
-    \x{101} 
-    ** Failers
-    \x{102}
-    Y
-    y           
-
-/[z-\x{100}]/8DZi
-
-/(?:[\PPa*]*){8,}/
-
-/[\P{Any}]/BZ
-
-/[\P{Any}\E]/BZ
-
-/(\P{Yi}+\277)/
-
-/(\P{Yi}+\277)?/
-
-/(?<=\P{Yi}{3}A)X/
-
-/\p{Yi}+(\P{Yi}+)(?1)/
-
-/(\P{Yi}{2}\277)?/
-
-/[\P{Yi}A]/
-
-/[\P{Yi}\P{Yi}\P{Yi}A]/
-
-/[^\P{Yi}A]/
-
-/[^\P{Yi}\P{Yi}\P{Yi}A]/
-
-/(\P{Yi}*\277)*/
-
-/(\P{Yi}*?\277)*/
-
-/(\p{Yi}*+\277)*/
-
-/(\P{Yi}?\277)*/
-
-/(\P{Yi}??\277)*/
-
-/(\p{Yi}?+\277)*/
-
-/(\P{Yi}{0,3}\277)*/
-
-/(\P{Yi}{0,3}?\277)*/
-
-/(\p{Yi}{0,3}+\277)*/
-
-/\p{Zl}{2,3}+/8BZ
-    


-    \x{2028}\x{2028}\x{2028}
-    
-/\p{Zl}/8BZ
-
-/\p{Lu}{3}+/8BZ
-
-/\pL{2}+/8BZ
-
-/\p{Cc}{2}+/8BZ
-
-/^\p{Cf}/8
-    \x{180e}
-    \x{061c}
-    \x{2066}
-    \x{2067}
-    \x{2068}
-    \x{2069}
-
-/^\p{Cs}/8
-    \?\x{dfff}
-    ** Failers
-    \x{09f} 
-  
-/^\p{Mn}/8
-    \x{1a1b}
-
-/^\p{Pe}/8
-    \x{2309}
-    \x{230b}
-
-/^\p{Ps}/8
-    \x{2308}
-    \x{230a}
-
-/^\p{Sc}+/8
-    $\x{a2}\x{a3}\x{a4}\x{a5}\x{a6}
-    \x{9f2}
-    ** Failers
-    X
-    \x{2c2}
-  
-/^\p{Zs}/8
-    \ \
-    \x{a0}
-    \x{1680}
-    \x{2000}
-    \x{2001}     
-    ** Failers
-    \x{2028}
-    \x{200d} 
-  
-/-- These are here rather than in test 6 because Perl has problems with
-    the negative versions of the properties and behaves has changed how
-    it behaves for caseless matching. --/
-      
-/\p{^Lu}/8i
-    1234
-    ** Failers
-    ABC 
-
-/\P{Lu}/8i
-    1234
-    ** Failers
-    ABC 
-
-/\p{Ll}/8i 
-    a
-    Az
-    ** Failers
-    ABC   
-
-/\p{Lu}/8i
-    A
-    a\x{10a0}B 
-    ** Failers 
-    a
-    \x{1d00}  
-
-/\p{Lu}/8i
-    A
-    aZ
-    ** Failers
-    abc   
-
-/[\x{c0}\x{391}]/8i
-    \x{c0}
-    \x{e0} 
-
-/-- The next two are special cases where the lengths of the different cases of
-the same character differ. The first went wrong with heap frame storage; the
-second was broken in all cases. --/
-
-/^\x{023a}+?(\x{0130}+)/8i
-  \x{023a}\x{2c65}\x{0130}
-  
-/^\x{023a}+([^X])/8i
-  \x{023a}\x{2c65}X
-
-/\x{c0}+\x{116}+/8i
-    \x{c0}\x{e0}\x{116}\x{117}
-
-/[\x{c0}\x{116}]+/8i
-    \x{c0}\x{e0}\x{116}\x{117}
-
-/(\x{de})\1/8i
-    \x{de}\x{de}
-    \x{de}\x{fe}
-    \x{fe}\x{fe}
-    \x{fe}\x{de}
-
-/^\x{c0}$/8i
-    \x{c0}
-    \x{e0} 
-
-/^\x{e0}$/8i
-    \x{c0}
-    \x{e0} 
-
-/-- The next two should be Perl-compatible, but it fails to match \x{e0}. PCRE
-will match it only with UCP support, because without that it has no notion
-of case for anything other than the ASCII letters. --/ 
-
-/((?i)[\x{c0}])/8
-    \x{c0}
-    \x{e0} 
-
-/(?i:[\x{c0}])/8
-    \x{c0}
-    \x{e0} 
-
-/-- These are PCRE's extra properties to help with Unicodizing \d etc. --/
-
-/^\p{Xan}/8
-    ABCD
-    1234
-    \x{6ca}
-    \x{a6c}
-    \x{10a7}   
-    ** Failers
-    _ABC   
-
-/^\p{Xan}+/8
-    ABCD1234\x{6ca}\x{a6c}\x{10a7}_
-    ** Failers
-    _ABC   
-
-/^\p{Xan}+?/8
-    \x{6ca}\x{a6c}\x{10a7}_
-
-/^\p{Xan}*/8
-    ABCD1234\x{6ca}\x{a6c}\x{10a7}_
-    
-/^\p{Xan}{2,9}/8
-    ABCD1234\x{6ca}\x{a6c}\x{10a7}_
-    
-/^\p{Xan}{2,9}?/8
-    \x{6ca}\x{a6c}\x{10a7}_
-    
-/^[\p{Xan}]/8
-    ABCD1234_
-    1234abcd_
-    \x{6ca}
-    \x{a6c}
-    \x{10a7}   
-    ** Failers
-    _ABC   
- 
-/^[\p{Xan}]+/8
-    ABCD1234\x{6ca}\x{a6c}\x{10a7}_
-    ** Failers
-    _ABC   
-
-/^>\p{Xsp}/8
-    >\x{1680}\x{2028}\x{0b}
-    >\x{a0} 
-    ** Failers
-    \x{0b} 
-
-/^>\p{Xsp}+/8
-    > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b}
-
-/^>\p{Xsp}+?/8
-    >\x{1680}\x{2028}\x{0b}
-
-/^>\p{Xsp}*/8
-    > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b}
-    
-/^>\p{Xsp}{2,9}/8
-    > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b}
-    
-/^>\p{Xsp}{2,9}?/8
-    > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b}
-    
-/^>[\p{Xsp}]/8
-    >\x{2028}\x{0b}
- 
-/^>[\p{Xsp}]+/8
-    > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b}
-
-/^>\p{Xps}/8
-    >\x{1680}\x{2028}\x{0b}
-    >\x{a0} 
-    ** Failers
-    \x{0b} 
-
-/^>\p{Xps}+/8
-    > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b}
-
-/^>\p{Xps}+?/8
-    >\x{1680}\x{2028}\x{0b}
-
-/^>\p{Xps}*/8
-    > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b}
-    
-/^>\p{Xps}{2,9}/8
-    > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b}
-    
-/^>\p{Xps}{2,9}?/8
-    > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b}
-    
-/^>[\p{Xps}]/8
-    >\x{2028}\x{0b}
- 
-/^>[\p{Xps}]+/8
-    > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b}
-
-/^\p{Xwd}/8
-    ABCD
-    1234
-    \x{6ca}
-    \x{a6c}
-    \x{10a7}
-    _ABC    
-    ** Failers
-    [] 
-
-/^\p{Xwd}+/8
-    ABCD1234\x{6ca}\x{a6c}\x{10a7}_
-
-/^\p{Xwd}+?/8
-    \x{6ca}\x{a6c}\x{10a7}_
-
-/^\p{Xwd}*/8
-    ABCD1234\x{6ca}\x{a6c}\x{10a7}_
-    
-/^\p{Xwd}{2,9}/8
-    A_B12\x{6ca}\x{a6c}\x{10a7}
-    
-/^\p{Xwd}{2,9}?/8
-    \x{6ca}\x{a6c}\x{10a7}_
-    
-/^[\p{Xwd}]/8
-    ABCD1234_
-    1234abcd_
-    \x{6ca}
-    \x{a6c}
-    \x{10a7}   
-    _ABC 
-    ** Failers
-    []   
- 
-/^[\p{Xwd}]+/8
-    ABCD1234\x{6ca}\x{a6c}\x{10a7}_
-
-/-- A check not in UTF-8 mode --/
-
-/^[\p{Xwd}]+/
-    ABCD1234_
-    
-/-- Some negative checks --/
-
-/^[\P{Xwd}]+/8
-    !.+\x{019}\x{35a}AB
-
-/^[\p{^Xwd}]+/8
-    !.+\x{019}\x{35a}AB
-
-/[\D]/WBZ8
-    1\x{3c8}2
-
-/[\d]/WBZ8
-    >\x{6f4}<
-
-/[\S]/WBZ8
-    \x{1680}\x{6f4}\x{1680}
-
-/[\s]/WBZ8
-    >\x{1680}<
-
-/[\W]/WBZ8
-    A\x{1712}B
-
-/[\w]/WBZ8
-    >\x{1723}<
-
-/\D/WBZ8
-    1\x{3c8}2
-
-/\d/WBZ8
-    >\x{6f4}<
-
-/\S/WBZ8
-    \x{1680}\x{6f4}\x{1680}
-
-/\s/WBZ8
-    >\x{1680}>
-
-/\W/WBZ8
-    A\x{1712}B
-
-/\w/WBZ8
-    >\x{1723}<
-
-/[[:alpha:]]/WBZ
-
-/[[:lower:]]/WBZ
-
-/[[:upper:]]/WBZ
-
-/[[:alnum:]]/WBZ
-
-/[[:ascii:]]/WBZ
-
-/[[:cntrl:]]/WBZ
-
-/[[:digit:]]/WBZ
-
-/[[:graph:]]/WBZ
-
-/[[:print:]]/WBZ
-
-/[[:punct:]]/WBZ
-
-/[[:space:]]/WBZ
-
-/[[:word:]]/WBZ
-
-/[[:xdigit:]]/WBZ
-
-/-- Unicode properties for \b abd \B --/
-
-/\b...\B/8W
-    abc_
-    \x{37e}abc\x{376} 
-    \x{37e}\x{376}\x{371}\x{393}\x{394} 
-    !\x{c0}++\x{c1}\x{c2} 
-    !\x{c0}+++++ 
-
-/-- Without PCRE_UCP, non-ASCII always fail, even if < 256  --/
-
-/\b...\B/8
-    abc_
-    ** Failers 
-    \x{37e}abc\x{376} 
-    \x{37e}\x{376}\x{371}\x{393}\x{394} 
-    !\x{c0}++\x{c1}\x{c2} 
-    !\x{c0}+++++ 
-
-/-- With PCRE_UCP, non-UTF8 chars that are < 256 still check properties  --/
-
-/\b...\B/W
-    abc_
-    !\x{c0}++\x{c1}\x{c2} 
-    !\x{c0}+++++ 
-
-/-- Some of these are silly, but they check various combinations --/
-
-/[[:^alpha:][:^cntrl:]]+/8WBZ
-    123
-    abc 
-
-/[[:^cntrl:][:^alpha:]]+/8WBZ
-    123
-    abc 
-
-/[[:alpha:]]+/8WBZ
-    abc
-
-/[[:^alpha:]\S]+/8WBZ
-    123
-    abc 
-
-/[^\d]+/8WBZ
-    abc123
-    abc\x{123}
-    \x{660}abc   
-
-/\p{Lu}+9\p{Lu}+B\p{Lu}+b/BZ
-
-/\p{^Lu}+9\p{^Lu}+B\p{^Lu}+b/BZ
-
-/\P{Lu}+9\P{Lu}+B\P{Lu}+b/BZ
-
-/\p{Han}+X\p{Greek}+\x{370}/BZ8
-
-/\p{Xan}+!\p{Xan}+A/BZ
-
-/\p{Xsp}+!\p{Xsp}\t/BZ
-
-/\p{Xps}+!\p{Xps}\t/BZ
-
-/\p{Xwd}+!\p{Xwd}_/BZ
-
-/A+\p{N}A+\dB+\p{N}*B+\d*/WBZ
-
-/-- These behaved oddly in Perl, so they are kept in this test --/
-
-/(\x{23a}\x{23a}\x{23a})?\1/8i
-    \x{23a}\x{23a}\x{23a}\x{2c65}\x{2c65}
-
-/(ȺȺȺ)?\1/8i
-    ȺȺȺⱥⱥ
-
-/(\x{23a}\x{23a}\x{23a})?\1/8i
-    \x{23a}\x{23a}\x{23a}\x{2c65}\x{2c65}\x{2c65}
-
-/(ȺȺȺ)?\1/8i
-    ȺȺȺⱥⱥⱥ
-
-/(\x{23a}\x{23a}\x{23a})\1/8i
-    \x{23a}\x{23a}\x{23a}\x{2c65}\x{2c65}
-
-/(ȺȺȺ)\1/8i
-    ȺȺȺⱥⱥ
-
-/(\x{23a}\x{23a}\x{23a})\1/8i
-    \x{23a}\x{23a}\x{23a}\x{2c65}\x{2c65}\x{2c65}
-
-/(ȺȺȺ)\1/8i
-    ȺȺȺⱥⱥⱥ
-
-/(\x{2c65}\x{2c65})\1/8i
-    \x{2c65}\x{2c65}\x{23a}\x{23a}
-    
-/(ⱥⱥ)\1/8i
-    ⱥⱥȺȺ 
-    
-/(\x{23a}\x{23a}\x{23a})\1Y/8i
-    X\x{23a}\x{23a}\x{23a}\x{2c65}\x{2c65}\x{2c65}YZ
-
-/(\x{2c65}\x{2c65})\1Y/8i
-    X\x{2c65}\x{2c65}\x{23a}\x{23a}YZ
-
-/-- --/ 
-
-/-- These scripts weren't yet in Perl when I added Unicode 6.0.0 to PCRE --/
-
-/^[\p{Batak}]/8
-    \x{1bc0}
-    \x{1bff}
-    ** Failers
-    \x{1bf4}
-    
-/^[\p{Brahmi}]/8
-    \x{11000}
-    \x{1106f}
-    ** Failers
-    \x{1104e}
-    
-/^[\p{Mandaic}]/8
-    \x{840}
-    \x{85e}
-    ** Failers
-    \x{85c}
-    \x{85d}    
-
-/-- --/ 
-
-/(\X*)(.)/s8
-    A\x{300}
-
-/^S(\X*)e(\X*)$/8
-    Stéréo
-    
-/^\X/8 
-    ́réo
-
-/^a\X41z/<JS>
-    aX41z
-    *** Failers
-    aAz
-
-/(?<=ab\Cde)X/8
-
-/\X/
-    a\P
-    a\P\P
-
-/\Xa/
-    aa\P
-    aa\P\P
-
-/\X{2}/
-    aa\P
-    aa\P\P
-
-/\X+a/
-    a\P
-    aa\P
-    aa\P\P
-
-/\X+?a/
-    a\P
-    ab\P
-    aa\P
-    aa\P\P
-    aba\P
-    
-/-- These Unicode 6.1.0 scripts are not known to Perl. --/ 
-
-/\p{Chakma}\d/8W
-    \x{11100}\x{1113c}
-
-/\p{Takri}\d/8W
-    \x{11680}\x{116c0}
-
-/^\X/8
-    A\P
-    A\P\P 
-    A\x{300}\x{301}\P
-    A\x{300}\x{301}\P\P  
-    A\x{301}\P
-    A\x{301}\P\P  
-    
-/^\X{2,3}/8
-    A\P
-    A\P\P 
-    AA\P
-    AA\P\P  
-    A\x{300}\x{301}\P
-    A\x{300}\x{301}\P\P  
-    A\x{300}\x{301}A\x{300}\x{301}\P
-    A\x{300}\x{301}A\x{300}\x{301}\P\P  
-
-/^\X{2}/8
-    AA\P
-    AA\P\P  
-    A\x{300}\x{301}A\x{300}\x{301}\P
-    A\x{300}\x{301}A\x{300}\x{301}\P\P  
-    
-/^\X+/8
-    AA\P
-    AA\P\P  
-
-/^\X+?Z/8
-    AA\P
-    AA\P\P 
-
-/A\x{3a3}B/8iDZ
-
-/\x{3a3}B/8iDZ
-
-/[\x{3a3}]/8iBZ
-
-/[^\x{3a3}]/8iBZ
-
-/[\x{3a3}]+/8iBZ
-
-/[^\x{3a3}]+/8iBZ
-
-/a*\x{3a3}/8iBZ
-
-/\x{3a3}+a/8iBZ
-
-/\x{3a3}*\x{3c2}/8iBZ
-
-/\x{3a3}{3}/8i+
-    \x{3a3}\x{3c3}\x{3c2}\x{3a3}\x{3c3}\x{3c2}
-
-/\x{3a3}{2,4}/8i+
-    \x{3a3}\x{3c3}\x{3c2}\x{3a3}\x{3c3}\x{3c2}
-
-/\x{3a3}{2,4}?/8i+
-    \x{3a3}\x{3c3}\x{3c2}\x{3a3}\x{3c3}\x{3c2}
-
-/\x{3a3}+./8i+
-    \x{3a3}\x{3c3}\x{3c2}\x{3a3}\x{3c3}\x{3c2}
-
-/\x{3a3}++./8i+
-    ** Failers
-    \x{3a3}\x{3c3}\x{3c2}\x{3a3}\x{3c3}\x{3c2}
-
-/\x{3a3}*\x{3c2}/8iBZ
-
-/[^\x{3a3}]*\x{3c2}/8iBZ
-
-/[^a]*\x{3c2}/8iBZ
-
-/ist/8iBZ
-    ikt
-
-/is+t/8i
-    iSs\x{17f}t
-    ikt
-
-/is+?t/8i
-    ikt
-
-/is?t/8i
-    ikt
-
-/is{2}t/8i
-    iskt
-    
-/-- This property is a PCRE special --/
-
-/^\p{Xuc}/8
-    $abc
-    @abc
-    `abc
-    \x{1234}abc
-    ** Failers
-    abc     
-
-/^\p{Xuc}+/8
-    $@`\x{a0}\x{1234}\x{e000}**
-    ** Failers
-    \x{9f}
-
-/^\p{Xuc}+?/8
-    $@`\x{a0}\x{1234}\x{e000}**
-    ** Failers
-    \x{9f}
-
-/^\p{Xuc}+?\*/8
-    $@`\x{a0}\x{1234}\x{e000}**
-    ** Failers
-    \x{9f}
-
-/^\p{Xuc}++/8
-    $@`\x{a0}\x{1234}\x{e000}**
-    ** Failers
-    \x{9f}
-
-/^\p{Xuc}{3,5}/8
-    $@`\x{a0}\x{1234}\x{e000}**
-    ** Failers
-    \x{9f}
-
-/^\p{Xuc}{3,5}?/8
-    $@`\x{a0}\x{1234}\x{e000}**
-    ** Failers
-    \x{9f}
-
-/^[\p{Xuc}]/8
-    $@`\x{a0}\x{1234}\x{e000}**
-    ** Failers
-    \x{9f}
-
-/^[\p{Xuc}]+/8
-    $@`\x{a0}\x{1234}\x{e000}**
-    ** Failers
-    \x{9f}
-
-/^\P{Xuc}/8
-    abc
-    ** Failers
-    $abc
-    @abc
-    `abc
-    \x{1234}abc
-
-/^[\P{Xuc}]/8
-    abc
-    ** Failers
-    $abc
-    @abc
-    `abc
-    \x{1234}abc
-    
-/-- Some auto-possessification tests --/
-
-/\pN+\z/BZ
-
-/\PN+\z/BZ
-
-/\pN+/BZ
-
-/\PN+/BZ
-
-/\p{Any}+\p{Any} \p{Any}+\P{Any} \p{Any}+\p{L&} \p{Any}+\p{L} \p{Any}+\p{Lu} \p{Any}+\p{Han} \p{Any}+\p{Xan} \p{Any}+\p{Xsp} \p{Any}+\p{Xps} \p{Xwd}+\p{Any} \p{Any}+\p{Xuc}/BWZx  
-
-/\p{L&}+\p{Any} \p{L&}+\p{L&} \P{L&}+\p{L&} \p{L&}+\p{L} \p{L&}+\p{Lu} \p{L&}+\p{Han} \p{L&}+\p{Xan} \p{L&}+\P{Xan} \p{L&}+\p{Xsp} \p{L&}+\p{Xps} \p{Xwd}+\p{L&} \p{L&}+\p{Xuc}/BWZx  
-
-/\p{N}+\p{Any} \p{N}+\p{L&} \p{N}+\p{L} \p{N}+\P{L} \p{N}+\P{N} \p{N}+\p{Lu} \p{N}+\p{Han} \p{N}+\p{Xan} \p{N}+\p{Xsp} \p{N}+\p{Xps} \p{Xwd}+\p{N} \p{N}+\p{Xuc}/BWZx  
-
-/\p{Lu}+\p{Any} \p{Lu}+\p{L&} \p{Lu}+\p{L} \p{Lu}+\p{Lu} \P{Lu}+\p{Lu} \p{Lu}+\p{Nd} \p{Lu}+\P{Nd} \p{Lu}+\p{Han} \p{Lu}+\p{Xan} \p{Lu}+\p{Xsp} \p{Lu}+\p{Xps} \p{Xwd}+\p{Lu} \p{Lu}+\p{Xuc}/BWZx  
-
-/\p{Han}+\p{Lu} \p{Han}+\p{L&} \p{Han}+\p{L} \p{Han}+\p{Lu} \p{Han}+\p{Arabic} \p{Arabic}+\p{Arabic} \p{Han}+\p{Xan} \p{Han}+\p{Xsp} \p{Han}+\p{Xps} \p{Xwd}+\p{Han} \p{Han}+\p{Xuc}/BWZx  
-
-/\p{Xan}+\p{Any} \p{Xan}+\p{L&} \P{Xan}+\p{L&} \p{Xan}+\p{L} \p{Xan}+\p{Lu} \p{Xan}+\p{Han} \p{Xan}+\p{Xan} \p{Xan}+\P{Xan} \p{Xan}+\p{Xsp} \p{Xan}+\p{Xps} \p{Xwd}+\p{Xan} \p{Xan}+\p{Xuc}/BWZx  
-
-/\p{Xsp}+\p{Any} \p{Xsp}+\p{L&} \p{Xsp}+\p{L} \p{Xsp}+\p{Lu} \p{Xsp}+\p{Han} \p{Xsp}+\p{Xan} \p{Xsp}+\p{Xsp} \P{Xsp}+\p{Xsp} \p{Xsp}+\p{Xps} \p{Xwd}+\p{Xsp} \p{Xsp}+\p{Xuc}/BWZx  
-
-/\p{Xwd}+\p{Any} \p{Xwd}+\p{L&} \p{Xwd}+\p{L} \p{Xwd}+\p{Lu} \p{Xwd}+\p{Han} \p{Xwd}+\p{Xan} \p{Xwd}+\p{Xsp} \p{Xwd}+\p{Xps} \p{Xwd}+\p{Xwd} \p{Xwd}+\P{Xwd} \p{Xwd}+\p{Xuc}/BWZx  
-
-/\p{Xuc}+\p{Any} \p{Xuc}+\p{L&} \p{Xuc}+\p{L} \p{Xuc}+\p{Lu} \p{Xuc}+\p{Han} \p{Xuc}+\p{Xan} \p{Xuc}+\p{Xsp} \p{Xuc}+\p{Xps} \p{Xwd}+\p{Xuc} \p{Xuc}+\p{Xuc} \p{Xuc}+\P{Xuc}/BWZx  
-
-/\p{N}+\p{Ll} \p{N}+\p{Nd} \p{N}+\P{Nd}/BWZx
-
-/\p{Xan}+\p{L} \p{Xan}+\p{N} \p{Xan}+\p{C} \p{Xan}+\P{L} \P{Xan}+\p{N} \p{Xan}+\P{C}/BWZx
-
-/\p{L}+\p{Xan} \p{N}+\p{Xan} \p{C}+\p{Xan} \P{L}+\p{Xan} \p{N}+\p{Xan} \P{C}+\p{Xan} \p{L}+\P{Xan}/BWZx
-
-/\p{Xan}+\p{Lu} \p{Xan}+\p{Nd} \p{Xan}+\p{Cc} \p{Xan}+\P{Ll} \P{Xan}+\p{No} \p{Xan}+\P{Cf}/BWZx
-
-/\p{Lu}+\p{Xan} \p{Nd}+\p{Xan} \p{Cs}+\p{Xan} \P{Lt}+\p{Xan} \p{Nl}+\p{Xan} \P{Cc}+\p{Xan} \p{Lt}+\P{Xan}/BWZx
-
-/\w+\p{P} \w+\p{Po} \w+\s \p{Xan}+\s \s+\p{Xan} \s+\w/BWZx
-
-/\w+\P{P} \W+\p{Po} \w+\S \P{Xan}+\s \s+\P{Xan} \s+\W/BWZx
-
-/\w+\p{Po} \w+\p{Pc} \W+\p{Po} \W+\p{Pc} \w+\P{Po} \w+\P{Pc}/BWZx
-
-/\p{Nl}+\p{Xan} \P{Nl}+\p{Xan} \p{Nl}+\P{Xan} \P{Nl}+\P{Xan}/BWZx
-
-/\p{Xan}+\p{Nl} \P{Xan}+\p{Nl} \p{Xan}+\P{Nl} \P{Xan}+\P{Nl}/BWZx
-
-/\p{Xan}+\p{Nd} \P{Xan}+\p{Nd} \p{Xan}+\P{Nd} \P{Xan}+\P{Nd}/BWZx
-
-/-- End auto-possessification tests --/ 
-
-/\w+/8CWBZ
-    abcd
-
-/[\p{N}]?+/BZO
-
-/[\p{L}ab]{2,3}+/BZO
-
-/\D+\X \d+\X \S+\X \s+\X \W+\X \w+\X \C+\X \R+\X \H+\X \h+\X \V+\X \v+\X a+\X \n+\X .+\X/BZx
-
-/.+\X/BZxs
-
-/\X+$/BZxm
-
-/\X+\D \X+\d \X+\S \X+\s \X+\W \X+\w \X+. \X+\C \X+\R \X+\H \X+\h \X+\V \X+\v \X+\X \X+\Z \X+\z \X+$/BZx
-
-/\d+\s{0,5}=\s*\S?=\w{0,4}\W*/8WBZ
-
-/[RST]+/8iWBZ
-    
-/[R-T]+/8iWBZ 
-
-/[Q-U]+/8iWBZ 
-
-/^s?c/mi8I
-    scat
-
-/[\W\p{Any}]/BZ
-    abc
-    123 
-
-/[\W\pL]/BZ
-    abc
-    ** Failers 
-    123     
-
-/a[[:punct:]b]/WBZ
-
-/a[[:punct:]b]/8WBZ
-
-/a[b[:punct:]]/8WBZ
-
-/-- End of testinput7 --/
diff --git a/dist/testdata/testinput9 b/dist/testdata/testinput9
deleted file mode 100644
index 4575ffe..0000000
--- a/dist/testdata/testinput9
+++ /dev/null
@@ -1,719 +0,0 @@
-/-- This set of tests checks UTF-8 support with the DFA matching functionality
-    of pcre_dfa_exec(), excluding Unicode property support. The -dfa flag must
-    be used with pcretest when running it. --/
-    
-< forbid W 
-
-/\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  
-
-/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,}/8O
-    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*/8O
-  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-
-/\D*/8O
-  \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\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}
-
-/^abc./mgx8<any>
-    abc1 \x0aabc2 \x0babc3xx \x0cabc4 \x0dabc5xx \x0d\x0aabc6 \x{0085}abc7 \x{2028}abc8 \x{2029}abc9 JUNK
-
-/abc.$/mgx8<any>
-    abc1\x0a abc2\x0b abc3\x0c abc4\x0d abc5\x0d\x0a abc6\x{0085} abc7\x{2028} abc8\x{2029} abc9
-
-/^a\Rb/8<bsr_unicode>
-    a\nb
-    a\rb
-    a\r\nb
-    a\x0bb
-    a\x0cb
-    a\x{85}b   
-    a\x{2028}b 
-    a\x{2029}b 
-    ** Failers
-    a\n\rb    
-
-/^a\R*b/8<bsr_unicode>
-    ab
-    a\nb
-    a\rb
-    a\r\nb
-    a\x0bb
-    a\x0c\x{2028}\x{2029}b
-    a\x{85}b   
-    a\n\rb    
-    a\n\r\x{85}\x0cb 
-
-/^a\R+b/8<bsr_unicode>
-    a\nb
-    a\rb
-    a\r\nb
-    a\x0bb
-    a\x0c\x{2028}\x{2029}b
-    a\x{85}b   
-    a\n\rb    
-    a\n\r\x{85}\x0cb 
-    ** Failers
-    ab  
-
-/^a\R{1,3}b/8<bsr_unicode>
-    a\nb
-    a\n\rb
-    a\n\r\x{85}b
-    a\r\n\r\nb 
-    a\r\n\r\n\r\nb 
-    a\n\r\n\rb
-    a\n\n\r\nb 
-    ** Failers
-    a\n\n\n\rb
-    a\r
-
-/\h+\V?\v{3,4}/8O
-    \x09\x20\x{a0}X\x0a\x0b\x0c\x0d\x0a
-
-/\V?\v{3,4}/8O 
-    \x20\x{a0}X\x0a\x0b\x0c\x0d\x0a
-
-/\h+\V?\v{3,4}/8O
-    >\x09\x20\x{a0}X\x0a\x0a\x0a<
-
-/\V?\v{3,4}/8O
-    >\x09\x20\x{a0}X\x0a\x0a\x0a<
-
-/\H\h\V\v/8
-    X X\x0a
-    X\x09X\x0b
-    ** Failers
-    \x{a0} X\x0a   
-    
-/\H*\h+\V?\v{3,4}/8O 
-    \x09\x20\x{a0}X\x0a\x0b\x0c\x0d\x0a
-    \x09\x20\x{a0}\x0a\x0b\x0c\x0d\x0a
-    \x09\x20\x{a0}\x0a\x0b\x0c
-    ** Failers 
-    \x09\x20\x{a0}\x0a\x0b
-     
-/\H\h\V\v/8
-    \x{3001}\x{3000}\x{2030}\x{2028}
-    X\x{180e}X\x{85}
-    ** Failers
-    \x{2009} X\x0a   
-    
-/\H*\h+\V?\v{3,4}/8O 
-    \x{1680}\x{180e}\x{2007}X\x{2028}\x{2029}\x0c\x0d\x0a
-    \x09\x{205f}\x{a0}\x0a\x{2029}\x0c\x{2028}\x0a
-    \x09\x20\x{202f}\x0a\x0b\x0c
-    ** Failers 
-    \x09\x{200a}\x{a0}\x{2028}\x0b
-     
-/a\Rb/I8<bsr_anycrlf>
-    a\rb
-    a\nb
-    a\r\nb
-    ** Failers
-    a\x{85}b
-    a\x0bb     
-
-/a\Rb/I8<bsr_unicode>
-    a\rb
-    a\nb
-    a\r\nb
-    a\x{85}b
-    a\x0bb     
-    ** Failers 
-    a\x{85}b\<bsr_anycrlf>
-    a\x0bb\<bsr_anycrlf>
-    
-/a\R?b/I8<bsr_anycrlf>
-    a\rb
-    a\nb
-    a\r\nb
-    ** Failers
-    a\x{85}b
-    a\x0bb     
-
-/a\R?b/I8<bsr_unicode>
-    a\rb
-    a\nb
-    a\r\nb
-    a\x{85}b
-    a\x0bb     
-    ** Failers 
-    a\x{85}b\<bsr_anycrlf>
-    a\x0bb\<bsr_anycrlf>
- 
-/X/8f<any> 
-    A\x{1ec5}ABCXYZ
-
-/abcd*/8
-    xxxxabcd\P
-    xxxxabcd\P\P
-
-/abcd*/i8
-    xxxxabcd\P
-    xxxxabcd\P\P
-    XXXXABCD\P
-    XXXXABCD\P\P
-
-/abc\d*/8
-    xxxxabc1\P
-    xxxxabc1\P\P
-
-/abc[de]*/8
-    xxxxabcde\P
-    xxxxabcde\P\P
-
-/\bthe cat\b/8
-    the cat\P
-    the cat\P\P
-
-/ab\Cde/8
-    abXde
-
-/(?<=ab\Cde)X/8
-
-/./8<CRLF>
-    \r\P
-    \r\P\P 
-  
-/.{2,3}/8<CRLF>
-    \r\P 
-    \r\P\P
-    \r\r\P
-    \r\r\P\P
-    \r\r\r\P
-    \r\r\r\P\P     
-
-/.{2,3}?/8<CRLF>
-    \r\P 
-    \r\P\P
-    \r\r\P
-    \r\r\P\P
-    \r\r\r\P
-    \r\r\r\P\P     
-
-/[^\x{100}]/8
-    \x{100}\x{101}X
-
-/[^\x{100}]+/8
-    \x{100}\x{101}X
-
-/-- End of testinput9 --/ 
diff --git a/dist/testdata/testinputEBC b/dist/testdata/testinputEBC
deleted file mode 100644
index 378755d..0000000
--- a/dist/testdata/testinputEBC
+++ /dev/null
@@ -1,124 +0,0 @@
-/-- This is a specialized test for checking, when PCRE is compiled with the
-EBCDIC option but in an ASCII environment, that newline and white space
-functionality is working. It catches cases where explicit values such as 0x0a
-have been used instead of names like CHAR_LF. Needless to say, it is not a
-genuine EBCDIC test! In patterns, alphabetic characters that follow a backslash
-must be in EBCDIC code. In data, newlines and other spacing characters must be
-in EBCDIC, but can be specified as escapes. --/
-
-/-- Test default newline and variations --/
-
-/^A/m
-    ABC
-    12\x15ABC
-
-/^A/m<any>
-    12\x15ABC
-    12\x0dABC
-    12\x0d\x15ABC
-    12\x25ABC
-
-/^A/m<anycrlf>
-    12\x15ABC
-    12\x0dABC
-    12\x0d\x15ABC
-    ** Fail
-    12\x25ABC
-
-/-- Test \h --/
-
-/^A\ˆ/
-    A B
-    A\x41B
-
-/-- Test \H --/
-
-/^A\È/
-    AB
-    A\x42B
-    ** Fail
-    A B
-    A\x41B
-
-/-- Test \R --/
-
-/^A\Ù/
-    A\x15B
-    A\x0dB
-    A\x25B
-    A\x0bB
-    A\x0cB
-    ** Fail
-    A B
-
-/-- Test \v --/
-
-/^A\¥/
-    A\x15B
-    A\x0dB
-    A\x25B
-    A\x0bB
-    A\x0cB
-    ** Fail
-    A B
-
-/-- Test \V --/
-
-/^A\å/
-    A B
-    ** Fail
-    A\x15B
-    A\x0dB
-    A\x25B
-    A\x0bB
-    A\x0cB
-    
-/-- For repeated items, use an atomic group so that the output is the same
-for DFA matching (otherwise it may show multiple matches). --/ 
-
-/-- Test \h+ --/
-
-/^A(?>\ˆ+)/
-    A B
-
-/-- Test \H+ --/
-
-/^A(?>\È+)/
-    AB
-    ** Fail
-    A B
-
-/-- Test \R+ --/
-
-/^A(?>\Ù+)/
-    A\x15B
-    A\x0dB
-    A\x25B
-    A\x0bB
-    A\x0cB
-    ** Fail
-    A B
-
-/-- Test \v+ --/
-
-/^A(?>\¥+)/
-    A\x15B
-    A\x0dB
-    A\x25B
-    A\x0bB
-    A\x0cB
-    ** Fail
-    A B
-
-/-- Test \V+ --/
-
-/^A(?>\å+)/
-    A B
-    ** Fail
-    A\x15B
-    A\x0dB
-    A\x25B
-    A\x0bB
-    A\x0cB
-
-/-- End --/
diff --git a/dist/testdata/testoutput10 b/dist/testdata/testoutput10
deleted file mode 100644
index b89169c..0000000
--- a/dist/testdata/testoutput10
+++ /dev/null
@@ -1,2547 +0,0 @@
-/-- This set of tests check Unicode property support with the DFA matching 
-    functionality of pcre_dfa_exec(). The -dfa flag must be used with pcretest
-    when running it. --/
-
-/\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
-    a 
- 0: a
-    *** Failers 
-No match
-
-/^\PL+/8
-    1234
- 0: 1234
-    = 
- 0: =
-    *** Failers 
- 0: *** 
-    abcd 
-No match
-
-/^\X+/8
-    abcdA\x{300}\x{301}\x{302}
- 0: abcdA\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}A\x{300}\x{301}\x{302}
- 0: A\x{300}\x{301}\x{302}A\x{300}\x{301}\x{302}
-    a 
- 0: a
-    *** Failers 
- 0: *** Failers
-    \x{300}\x{301}\x{302}
- 0: \x{300}\x{301}\x{302}
-
-/\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: \x{300}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  
- 0: \x{300}abc
-
-/\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: \x{300}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  
- 0: \x{300}abc
-
-/^\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}
-    \x{180e}
- 0: \x{180e}
-    \x{061c}
- 0: \x{61c}
-    \x{2066}
- 0: \x{2066}
-    \x{2067}
- 0: \x{2067}
-    \x{2068}
- 0: \x{2068}
-    \x{2069}
- 0: \x{2069}
-    ** 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{e000}  
-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}
-    \x{1a1b}
- 0: \x{1a1b}
-    ** Failers
-No match
-    X
-No match
-    \x{903}
-No match
-  
-/^\p{Nd}+/8O
-    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}
-    \x{2309}
- 0: \x{2309}
-    \x{230b}
- 0: \x{230b}
-    ** 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}
-    \x{2308}
- 0: \x{2308}
-    \x{230a}
- 0: \x{230a}
-    ** 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{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
-    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+/8O
-    11111111111111111111111111111111111111111111111111111111111111111111111
-No match
-    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-Matched, but offsets vector is too small to show all 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}+/8O
-    11111111111111111111111111111111111111111111111111111111111111111111111
-No match
-    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-Matched, but offsets vector is too small to show all 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]+/8O
-    11111111111111111111111111111111111111111111111111111111111111111111111
-No match
-    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-Matched, but offsets vector is too small to show all 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}]+/8O
-    11111111111111111111111111111111111111111111111111111111111111111111111
-No match
-    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-Matched, but offsets vector is too small to show all 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}]+/8O
-    11111111111111111111111111111111111111111111111111111111111111111111111
-No match
-    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-Matched, but offsets vector is too small to show all 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}
-
-/\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}  
- 0: \x{300}
-
-/^[\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}
-    
-/^\p{Han}+/8
-    \x{2e81}\x{3007}\x{2f804}\x{31a0}
- 0: \x{2e81}\x{3007}\x{2f804}
-    ** Failers
-No match
-    \x{2e7f}  
-No match
-
-/^\P{Katakana}+/8
-    \x{3105}
- 0: \x{3105}
-    ** Failers
- 0: ** Failers
-    \x{30ff}  
-No match
-
-/^[\p{Arabic}]/8
-    \x{06e9}
- 0: \x{6e9}
-    \x{060b}
- 0: \x{60b}
-    ** Failers
-No match
-    X\x{06e9}   
-No match
-
-/^[\P{Yi}]/8
-    \x{2f800}
- 0: \x{2f800}
-    ** Failers
- 0: *
-    \x{a014}
-No match
-    \x{a4c6}   
-No match
-
-/^\p{Any}X/8
-    AXYZ
- 0: AX
-    \x{1234}XYZ 
- 0: \x{1234}X
-    ** Failers
-No match
-    X  
-No match
-    
-/^\P{Any}X/8
-    ** Failers
-No match
-    AX
-No match
-    
-/^\p{Any}?X/8
-    XYZ
- 0: X
-    AXYZ
- 0: AX
-    \x{1234}XYZ 
- 0: \x{1234}X
-    ** Failers
-No match
-    ABXYZ   
-No match
-
-/^\P{Any}?X/8
-    XYZ
- 0: X
-    ** Failers
-No match
-    AXYZ
-No match
-    \x{1234}XYZ 
-No match
-    ABXYZ   
-No match
-
-/^\p{Any}+X/8
-    AXYZ
- 0: AX
-    \x{1234}XYZ
- 0: \x{1234}X
-    A\x{1234}XYZ
- 0: A\x{1234}X
-    ** Failers
-No match
-    XYZ
-No match
-
-/^\P{Any}+X/8
-    ** Failers
-No match
-    AXYZ
-No match
-    \x{1234}XYZ
-No match
-    A\x{1234}XYZ
-No match
-    XYZ
-No match
-
-/^\p{Any}*X/8
-    XYZ
- 0: X
-    AXYZ
- 0: AX
-    \x{1234}XYZ
- 0: \x{1234}X
-    A\x{1234}XYZ
- 0: A\x{1234}X
-    ** Failers
-No match
-
-/^\P{Any}*X/8
-    XYZ
- 0: X
-    ** Failers
-No match
-    AXYZ
-No match
-    \x{1234}XYZ
-No match
-    A\x{1234}XYZ
-No match
-
-/^[\p{Any}]X/8
-    AXYZ
- 0: AX
-    \x{1234}XYZ 
- 0: \x{1234}X
-    ** Failers
-No match
-    X  
-No match
-    
-/^[\P{Any}]X/8
-    ** Failers
-No match
-    AX
-No match
-    
-/^[\p{Any}]?X/8
-    XYZ
- 0: X
-    AXYZ
- 0: AX
-    \x{1234}XYZ 
- 0: \x{1234}X
-    ** Failers
-No match
-    ABXYZ   
-No match
-
-/^[\P{Any}]?X/8
-    XYZ
- 0: X
-    ** Failers
-No match
-    AXYZ
-No match
-    \x{1234}XYZ 
-No match
-    ABXYZ   
-No match
-
-/^[\p{Any}]+X/8
-    AXYZ
- 0: AX
-    \x{1234}XYZ
- 0: \x{1234}X
-    A\x{1234}XYZ
- 0: A\x{1234}X
-    ** Failers
-No match
-    XYZ
-No match
-
-/^[\P{Any}]+X/8
-    ** Failers
-No match
-    AXYZ
-No match
-    \x{1234}XYZ
-No match
-    A\x{1234}XYZ
-No match
-    XYZ
-No match
-
-/^[\p{Any}]*X/8
-    XYZ
- 0: X
-    AXYZ
- 0: AX
-    \x{1234}XYZ
- 0: \x{1234}X
-    A\x{1234}XYZ
- 0: A\x{1234}X
-    ** Failers
-No match
-
-/^[\P{Any}]*X/8
-    XYZ
- 0: X
-    ** Failers
-No match
-    AXYZ
-No match
-    \x{1234}XYZ
-No match
-    A\x{1234}XYZ
-No match
-
-/^\p{Any}{3,5}?/8
-    abcdefgh
- 0: abcde
- 1: abcd
- 2: abc
-    \x{1234}\n\r\x{3456}xyz 
- 0: \x{1234}\x{0a}\x{0d}\x{3456}x
- 1: \x{1234}\x{0a}\x{0d}\x{3456}
- 2: \x{1234}\x{0a}\x{0d}
-
-/^\p{Any}{3,5}/8
-    abcdefgh
- 0: abcde
-    \x{1234}\n\r\x{3456}xyz 
- 0: \x{1234}\x{0a}\x{0d}\x{3456}x
-
-/^\P{Any}{3,5}?/8
-    ** Failers
-No match
-    abcdefgh
-No match
-    \x{1234}\n\r\x{3456}xyz 
-No match
-
-/^\p{L&}X/8
-     AXY
- 0: AX
-     aXY
- 0: aX
-     \x{1c5}XY
- 0: \x{1c5}X
-     ** Failers
-No match
-     \x{1bb}XY
-No match
-     \x{2b0}XY
-No match
-     !XY      
-No match
-
-/^[\p{L&}]X/8
-     AXY
- 0: AX
-     aXY
- 0: aX
-     \x{1c5}XY
- 0: \x{1c5}X
-     ** Failers
-No match
-     \x{1bb}XY
-No match
-     \x{2b0}XY
-No match
-     !XY      
-No match
-
-/^\p{L&}+X/8
-     AXY
- 0: AX
-     aXY
- 0: aX
-     AbcdeXyz 
- 0: AbcdeX
-     \x{1c5}AbXY
- 0: \x{1c5}AbX
-     abcDEXypqreXlmn 
- 0: abcDEXypqreX
- 1: abcDEX
-     ** Failers
-No match
-     \x{1bb}XY
-No match
-     \x{2b0}XY
-No match
-     !XY      
-No match
-
-/^[\p{L&}]+X/8
-     AXY
- 0: AX
-     aXY
- 0: aX
-     AbcdeXyz 
- 0: AbcdeX
-     \x{1c5}AbXY
- 0: \x{1c5}AbX
-     abcDEXypqreXlmn 
- 0: abcDEXypqreX
- 1: abcDEX
-     ** Failers
-No match
-     \x{1bb}XY
-No match
-     \x{2b0}XY
-No match
-     !XY      
-No match
-
-/^\p{L&}+?X/8
-     AXY
- 0: AX
-     aXY
- 0: aX
-     AbcdeXyz 
- 0: AbcdeX
-     \x{1c5}AbXY
- 0: \x{1c5}AbX
-     abcDEXypqreXlmn 
- 0: abcDEXypqreX
- 1: abcDEX
-     ** Failers
-No match
-     \x{1bb}XY
-No match
-     \x{2b0}XY
-No match
-     !XY      
-No match
-
-/^[\p{L&}]+?X/8
-     AXY
- 0: AX
-     aXY
- 0: aX
-     AbcdeXyz 
- 0: AbcdeX
-     \x{1c5}AbXY
- 0: \x{1c5}AbX
-     abcDEXypqreXlmn 
- 0: abcDEXypqreX
- 1: abcDEX
-     ** Failers
-No match
-     \x{1bb}XY
-No match
-     \x{2b0}XY
-No match
-     !XY      
-No match
-
-/^\P{L&}X/8
-     !XY
- 0: !X
-     \x{1bb}XY
- 0: \x{1bb}X
-     \x{2b0}XY
- 0: \x{2b0}X
-     ** Failers
-No match
-     \x{1c5}XY
-No match
-     AXY      
-No match
-
-/^[\P{L&}]X/8
-     !XY
- 0: !X
-     \x{1bb}XY
- 0: \x{1bb}X
-     \x{2b0}XY
- 0: \x{2b0}X
-     ** Failers
-No match
-     \x{1c5}XY
-No match
-     AXY      
-No match
-
-/^\x{023a}+?(\x{0130}+)/8i
-  \x{023a}\x{2c65}\x{0130}
- 0: \x{23a}\x{2c65}\x{130}
-  
-/^\x{023a}+([^X])/8i
-  \x{023a}\x{2c65}X
- 0: \x{23a}\x{2c65}
- 
-/\x{c0}+\x{116}+/8i
-    \x{c0}\x{e0}\x{116}\x{117}
- 0: \x{c0}\x{e0}\x{116}\x{117}
-
-/[\x{c0}\x{116}]+/8i
-    \x{c0}\x{e0}\x{116}\x{117}
- 0: \x{c0}\x{e0}\x{116}\x{117}
-
-/Check property support in non-UTF-8 mode/
- 
-/\p{L}{4}/
-    123abcdefg
- 0: abcd
-    123abc\xc4\xc5zz
- 0: abc\xc4
-
-/\p{Carian}\p{Cham}\p{Kayah_Li}\p{Lepcha}\p{Lycian}\p{Lydian}\p{Ol_Chiki}\p{Rejang}\p{Saurashtra}\p{Sundanese}\p{Vai}/8
-    \x{102A4}\x{AA52}\x{A91D}\x{1C46}\x{10283}\x{1092E}\x{1C6B}\x{A93B}\x{A8BF}\x{1BA0}\x{A50A}====
- 0: \x{102a4}\x{aa52}\x{a91d}\x{1c46}\x{10283}\x{1092e}\x{1c6b}\x{a93b}\x{a8bf}\x{1ba0}\x{a50a}
-
-/\x{a77d}\x{1d79}/8i
-    \x{a77d}\x{1d79}
- 0: \x{a77d}\x{1d79}
-    \x{1d79}\x{a77d} 
- 0: \x{1d79}\x{a77d}
-
-/\x{a77d}\x{1d79}/8
-    \x{a77d}\x{1d79}
- 0: \x{a77d}\x{1d79}
-    ** Failers 
-No match
-    \x{1d79}\x{a77d} 
-No match
-
-/^\p{Xan}/8
-    ABCD
- 0: A
-    1234
- 0: 1
-    \x{6ca}
- 0: \x{6ca}
-    \x{a6c}
- 0: \x{a6c}
-    \x{10a7}   
- 0: \x{10a7}
-    ** Failers
-No match
-    _ABC   
-No match
-
-/^\p{Xan}+/8
-    ABCD1234\x{6ca}\x{a6c}\x{10a7}_
- 0: ABCD1234\x{6ca}\x{a6c}\x{10a7}
-    ** Failers
-No match
-    _ABC   
-No match
-
-/^\p{Xan}*/8
-    ABCD1234\x{6ca}\x{a6c}\x{10a7}_
- 0: ABCD1234\x{6ca}\x{a6c}\x{10a7}
-    
-/^\p{Xan}{2,9}/8
-    ABCD1234\x{6ca}\x{a6c}\x{10a7}_
- 0: ABCD1234\x{6ca}
-    
-/^[\p{Xan}]/8
-    ABCD1234_
- 0: A
-    1234abcd_
- 0: 1
-    \x{6ca}
- 0: \x{6ca}
-    \x{a6c}
- 0: \x{a6c}
-    \x{10a7}   
- 0: \x{10a7}
-    ** Failers
-No match
-    _ABC   
-No match
- 
-/^[\p{Xan}]+/8
-    ABCD1234\x{6ca}\x{a6c}\x{10a7}_
- 0: ABCD1234\x{6ca}\x{a6c}\x{10a7}
-    ** Failers
-No match
-    _ABC   
-No match
-
-/^>\p{Xsp}/8
-    >\x{1680}\x{2028}\x{0b}
- 0: >\x{1680}
-    ** Failers
-No match
-    \x{0b} 
-No match
-
-/^>\p{Xsp}+/8O
-    > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b}
- 0: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b}
- 1: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}
- 2: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}
- 3: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}
- 4: > \x{09}\x{0a}\x{0c}\x{0d}
- 5: > \x{09}\x{0a}\x{0c}
- 6: > \x{09}\x{0a}
- 7: > \x{09}
- 8: > 
-
-/^>\p{Xsp}*/8O
-    > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b}
- 0: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b}
- 1: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}
- 2: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}
- 3: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}
- 4: > \x{09}\x{0a}\x{0c}\x{0d}
- 5: > \x{09}\x{0a}\x{0c}
- 6: > \x{09}\x{0a}
- 7: > \x{09}
- 8: > 
- 9: >
-    
-/^>\p{Xsp}{2,9}/8O
-    > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b}
- 0: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b}
- 1: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}
- 2: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}
- 3: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}
- 4: > \x{09}\x{0a}\x{0c}\x{0d}
- 5: > \x{09}\x{0a}\x{0c}
- 6: > \x{09}\x{0a}
- 7: > \x{09}
-    
-/^>[\p{Xsp}]/8O
-    >\x{2028}\x{0b}
- 0: >\x{2028}
- 
-/^>[\p{Xsp}]+/8O
-    > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b}
- 0: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b}
- 1: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}
- 2: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}
- 3: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}
- 4: > \x{09}\x{0a}\x{0c}\x{0d}
- 5: > \x{09}\x{0a}\x{0c}
- 6: > \x{09}\x{0a}
- 7: > \x{09}
- 8: > 
-
-/^>\p{Xps}/8
-    >\x{1680}\x{2028}\x{0b}
- 0: >\x{1680}
-    >\x{a0} 
- 0: >\x{a0}
-    ** Failers
-No match
-    \x{0b} 
-No match
-
-/^>\p{Xps}+/8
-    > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b}
- 0: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b}
-
-/^>\p{Xps}+?/8
-    >\x{1680}\x{2028}\x{0b}
- 0: >\x{1680}\x{2028}\x{0b}
- 1: >\x{1680}\x{2028}
- 2: >\x{1680}
-
-/^>\p{Xps}*/8
-    > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b}
- 0: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b}
-    
-/^>\p{Xps}{2,9}/8
-    > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b}
- 0: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b}
-    
-/^>\p{Xps}{2,9}?/8
-    > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b}
- 0: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b}
- 1: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}
- 2: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}
- 3: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}
- 4: > \x{09}\x{0a}\x{0c}\x{0d}
- 5: > \x{09}\x{0a}\x{0c}
- 6: > \x{09}\x{0a}
- 7: > \x{09}
-    
-/^>[\p{Xps}]/8
-    >\x{2028}\x{0b}
- 0: >\x{2028}
- 
-/^>[\p{Xps}]+/8
-    > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b}
- 0: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b}
-
-/^\p{Xwd}/8
-    ABCD
- 0: A
-    1234
- 0: 1
-    \x{6ca}
- 0: \x{6ca}
-    \x{a6c}
- 0: \x{a6c}
-    \x{10a7}
- 0: \x{10a7}
-    _ABC    
- 0: _
-    ** Failers
-No match
-    [] 
-No match
-
-/^\p{Xwd}+/8
-    ABCD1234\x{6ca}\x{a6c}\x{10a7}_
- 0: ABCD1234\x{6ca}\x{a6c}\x{10a7}_
-
-/^\p{Xwd}*/8
-    ABCD1234\x{6ca}\x{a6c}\x{10a7}_
- 0: ABCD1234\x{6ca}\x{a6c}\x{10a7}_
-    
-/^\p{Xwd}{2,9}/8
-    A_12\x{6ca}\x{a6c}\x{10a7}
- 0: A_12\x{6ca}\x{a6c}\x{10a7}
-    
-/^[\p{Xwd}]/8
-    ABCD1234_
- 0: A
-    1234abcd_
- 0: 1
-    \x{6ca}
- 0: \x{6ca}
-    \x{a6c}
- 0: \x{a6c}
-    \x{10a7}   
- 0: \x{10a7}
-    _ABC 
- 0: _
-    ** Failers
-No match
-    []   
-No match
- 
-/^[\p{Xwd}]+/8
-    ABCD1234\x{6ca}\x{a6c}\x{10a7}_
- 0: ABCD1234\x{6ca}\x{a6c}\x{10a7}_
-
-/-- Unicode properties for \b abd \B --/
-
-/\b...\B/8W
-    abc_
- 0: abc
-    \x{37e}abc\x{376} 
- 0: abc
-    \x{37e}\x{376}\x{371}\x{393}\x{394} 
- 0: \x{376}\x{371}\x{393}
-    !\x{c0}++\x{c1}\x{c2} 
- 0: ++\x{c1}
-    !\x{c0}+++++ 
- 0: \x{c0}++
-
-/-- Without PCRE_UCP, non-ASCII always fail, even if < 256  --/
-
-/\b...\B/8
-    abc_
- 0: abc
-    ** Failers 
- 0: Fai
-    \x{37e}abc\x{376} 
-No match
-    \x{37e}\x{376}\x{371}\x{393}\x{394} 
-No match
-    !\x{c0}++\x{c1}\x{c2} 
-No match
-    !\x{c0}+++++ 
-No match
-
-/-- With PCRE_UCP, non-UTF8 chars that are < 256 still check properties  --/
-
-/\b...\B/W
-    abc_
- 0: abc
-    !\x{c0}++\x{c1}\x{c2} 
- 0: ++\xc1
-    !\x{c0}+++++ 
- 0: \xc0++
-    
-/-- Caseless single negated characters > 127 need UCP support --/
-
-/[^\x{100}]/8i
-    \x{100}\x{101}X
- 0: X
-
-/[^\x{100}]+/8i
-    \x{100}\x{101}XX
- 0: XX
-
-/^\X/8
-    A\P
- 0: A
-    A\P\P 
-Partial match: A
-    A\x{300}\x{301}\P
- 0: A\x{300}\x{301}
-    A\x{300}\x{301}\P\P  
-Partial match: A\x{300}\x{301}
-    A\x{301}\P
- 0: A\x{301}
-    A\x{301}\P\P  
-Partial match: A\x{301}
-    
-/^\X{2,3}/8
-    A\P
-Partial match: A
-    A\P\P 
-Partial match: A
-    AA\P
- 0: AA
-    AA\P\P  
-Partial match: AA
-    A\x{300}\x{301}\P
-Partial match: A\x{300}\x{301}
-    A\x{300}\x{301}\P\P  
-Partial match: A\x{300}\x{301}
-    A\x{300}\x{301}A\x{300}\x{301}\P
- 0: A\x{300}\x{301}A\x{300}\x{301}
-    A\x{300}\x{301}A\x{300}\x{301}\P\P  
-Partial match: A\x{300}\x{301}A\x{300}\x{301}
-
-/^\X{2}/8
-    AA\P
- 0: AA
-    AA\P\P  
-Partial match: AA
-    A\x{300}\x{301}A\x{300}\x{301}\P
- 0: A\x{300}\x{301}A\x{300}\x{301}
-    A\x{300}\x{301}A\x{300}\x{301}\P\P  
-Partial match: A\x{300}\x{301}A\x{300}\x{301}
-    
-/^\X+/8
-    AA\P
- 0: AA
-    AA\P\P  
-Partial match: AA
-
-/^\X+?Z/8
-    AA\P
-Partial match: AA
-    AA\P\P 
-Partial match: AA
-
-/-- These are tests for extended grapheme clusters --/ 
-
-/^\X/8+
-    G\x{34e}\x{34e}X
- 0: G\x{34e}\x{34e}
- 0+ X
-    \x{34e}\x{34e}X
- 0: \x{34e}\x{34e}
- 0+ X
-    \x04X
- 0: \x{04}
- 0+ X
-    \x{1100}X
- 0: \x{1100}
- 0+ X
-    \x{1100}\x{34e}X
- 0: \x{1100}\x{34e}
- 0+ X
-    \x{1b04}\x{1b04}X 
- 0: \x{1b04}\x{1b04}
- 0+ X
-    *These match up to the roman letters
- 0: *
- 0+ These match up to the roman letters
-    \x{1111}\x{1111}L,L
- 0: \x{1111}\x{1111}
- 0+ L,L
-    \x{1111}\x{1111}\x{1169}L,L,V
- 0: \x{1111}\x{1111}\x{1169}
- 0+ L,L,V
-    \x{1111}\x{ae4c}L, LV
- 0: \x{1111}\x{ae4c}
- 0+ L, LV
-    \x{1111}\x{ad89}L, LVT
- 0: \x{1111}\x{ad89}
- 0+ L, LVT
-    \x{1111}\x{ae4c}\x{1169}L, LV, V
- 0: \x{1111}\x{ae4c}\x{1169}
- 0+ L, LV, V
-    \x{1111}\x{ae4c}\x{1169}\x{1169}L, LV, V, V
- 0: \x{1111}\x{ae4c}\x{1169}\x{1169}
- 0+ L, LV, V, V
-    \x{1111}\x{ae4c}\x{1169}\x{11fe}L, LV, V, T
- 0: \x{1111}\x{ae4c}\x{1169}\x{11fe}
- 0+ L, LV, V, T
-    \x{1111}\x{ad89}\x{11fe}L, LVT, T
- 0: \x{1111}\x{ad89}\x{11fe}
- 0+ L, LVT, T
-    \x{1111}\x{ad89}\x{11fe}\x{11fe}L, LVT, T, T
- 0: \x{1111}\x{ad89}\x{11fe}\x{11fe}
- 0+ L, LVT, T, T
-    \x{ad89}\x{11fe}\x{11fe}LVT, T, T
- 0: \x{ad89}\x{11fe}\x{11fe}
- 0+ LVT, T, T
-    *These match just the first codepoint (invalid sequence)
- 0: *
- 0+ These match just the first codepoint (invalid sequence)
-    \x{1111}\x{11fe}L, T
- 0: \x{1111}
- 0+ \x{11fe}L, T
-    \x{ae4c}\x{1111}LV, L
- 0: \x{ae4c}
- 0+ \x{1111}LV, L
-    \x{ae4c}\x{ae4c}LV, LV
- 0: \x{ae4c}
- 0+ \x{ae4c}LV, LV
-    \x{ae4c}\x{ad89}LV, LVT
- 0: \x{ae4c}
- 0+ \x{ad89}LV, LVT
-    \x{1169}\x{1111}V, L
- 0: \x{1169}
- 0+ \x{1111}V, L
-    \x{1169}\x{ae4c}V, LV
- 0: \x{1169}
- 0+ \x{ae4c}V, LV
-    \x{1169}\x{ad89}V, LVT
- 0: \x{1169}
- 0+ \x{ad89}V, LVT
-    \x{ad89}\x{1111}LVT, L
- 0: \x{ad89}
- 0+ \x{1111}LVT, L
-    \x{ad89}\x{1169}LVT, V
- 0: \x{ad89}
- 0+ \x{1169}LVT, V
-    \x{ad89}\x{ae4c}LVT, LV
- 0: \x{ad89}
- 0+ \x{ae4c}LVT, LV
-    \x{ad89}\x{ad89}LVT, LVT
- 0: \x{ad89}
- 0+ \x{ad89}LVT, LVT
-    \x{11fe}\x{1111}T, L
- 0: \x{11fe}
- 0+ \x{1111}T, L
-    \x{11fe}\x{1169}T, V
- 0: \x{11fe}
- 0+ \x{1169}T, V
-    \x{11fe}\x{ae4c}T, LV
- 0: \x{11fe}
- 0+ \x{ae4c}T, LV
-    \x{11fe}\x{ad89}T, LVT
- 0: \x{11fe}
- 0+ \x{ad89}T, LVT
-    *Test extend and spacing mark
- 0: *
- 0+ Test extend and spacing mark
-    \x{1111}\x{ae4c}\x{0711}L, LV, extend
- 0: \x{1111}\x{ae4c}\x{711}
- 0+ L, LV, extend
-    \x{1111}\x{ae4c}\x{1b04}L, LV, spacing mark
- 0: \x{1111}\x{ae4c}\x{1b04}
- 0+ L, LV, spacing mark
-    \x{1111}\x{ae4c}\x{1b04}\x{0711}\x{1b04}L, LV, spacing mark, extend, spacing mark
- 0: \x{1111}\x{ae4c}\x{1b04}\x{711}\x{1b04}
- 0+ L, LV, spacing mark, extend, spacing mark
-    *Test CR, LF, and control
- 0: *
- 0+ Test CR, LF, and control
-    \x0d\x{0711}CR, extend
- 0: \x{0d}
- 0+ \x{711}CR, extend
-    \x0d\x{1b04}CR, spacingmark
- 0: \x{0d}
- 0+ \x{1b04}CR, spacingmark
-    \x0a\x{0711}LF, extend
- 0: \x{0a}
- 0+ \x{711}LF, extend
-    \x0a\x{1b04}LF, spacingmark
- 0: \x{0a}
- 0+ \x{1b04}LF, spacingmark
-    \x0b\x{0711}Control, extend
- 0: \x{0b}
- 0+ \x{711}Control, extend
-    \x09\x{1b04}Control, spacingmark
- 0: \x{09}
- 0+ \x{1b04}Control, spacingmark
-    *There are no Prepend characters, so we can't test Prepend, CR
- 0: *
- 0+ There are no Prepend characters, so we can't test Prepend, CR
-    
-/^(?>\X{2})X/8+
-    \x{1111}\x{ae4c}\x{1111}\x{ae4c}X
- 0: \x{1111}\x{ae4c}\x{1111}\x{ae4c}X
- 0+ 
-    
-/^\X{2,4}X/8+
-    \x{1111}\x{ae4c}\x{1111}\x{ae4c}X
- 0: \x{1111}\x{ae4c}\x{1111}\x{ae4c}X
- 0+ 
-    \x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}X
- 0: \x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}X
- 0+ 
-    \x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}X
- 0: \x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}X
- 0+ 
-
-/^\X{2,4}?X/8+
-    \x{1111}\x{ae4c}\x{1111}\x{ae4c}X
- 0: \x{1111}\x{ae4c}\x{1111}\x{ae4c}X
- 0+ 
-    \x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}X
- 0: \x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}X
- 0+ 
-    \x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}X
- 0: \x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}X
- 0+ 
-
-/-- --/
-
-/\x{1e9e}+/8i
-    \x{1e9e}\x{00df}
- 0: \x{1e9e}\x{df}
-
-/[z\x{1e9e}]+/8i
-    \x{1e9e}\x{00df}
- 0: \x{1e9e}\x{df}
-
-/\x{00df}+/8i
-    \x{1e9e}\x{00df}
- 0: \x{1e9e}\x{df}
-
-/[z\x{00df}]+/8i
-    \x{1e9e}\x{00df}
- 0: \x{1e9e}\x{df}
-
-/\x{1f88}+/8i
-    \x{1f88}\x{1f80} 
- 0: \x{1f88}\x{1f80}
-
-/[z\x{1f88}]+/8i
-    \x{1f88}\x{1f80} 
- 0: \x{1f88}\x{1f80}
-
-/-- Perl matches these --/
-
-/\x{00b5}+/8i
-    \x{00b5}\x{039c}\x{03bc}
- 0: \x{b5}\x{39c}\x{3bc}
-
-/\x{039c}+/8i
-    \x{00b5}\x{039c}\x{03bc}
- 0: \x{b5}\x{39c}\x{3bc}
-
-/\x{03bc}+/8i
-    \x{00b5}\x{039c}\x{03bc}
- 0: \x{b5}\x{39c}\x{3bc}
-
-
-/\x{00c5}+/8i
-    \x{00c5}\x{00e5}\x{212b}
- 0: \x{c5}\x{e5}\x{212b}
-
-/\x{00e5}+/8i
-    \x{00c5}\x{00e5}\x{212b}
- 0: \x{c5}\x{e5}\x{212b}
-
-/\x{212b}+/8i
-    \x{00c5}\x{00e5}\x{212b}
- 0: \x{c5}\x{e5}\x{212b}
-
-
-/\x{01c4}+/8i
-    \x{01c4}\x{01c5}\x{01c6}
- 0: \x{1c4}\x{1c5}\x{1c6}
-
-/\x{01c5}+/8i
-    \x{01c4}\x{01c5}\x{01c6}
- 0: \x{1c4}\x{1c5}\x{1c6}
-
-/\x{01c6}+/8i
-    \x{01c4}\x{01c5}\x{01c6}
- 0: \x{1c4}\x{1c5}\x{1c6}
-
-
-/\x{01c7}+/8i
-    \x{01c7}\x{01c8}\x{01c9}
- 0: \x{1c7}\x{1c8}\x{1c9}
-
-/\x{01c8}+/8i
-    \x{01c7}\x{01c8}\x{01c9}
- 0: \x{1c7}\x{1c8}\x{1c9}
-
-/\x{01c9}+/8i
-    \x{01c7}\x{01c8}\x{01c9}
- 0: \x{1c7}\x{1c8}\x{1c9}
-
-
-/\x{01ca}+/8i
-    \x{01ca}\x{01cb}\x{01cc}
- 0: \x{1ca}\x{1cb}\x{1cc}
-
-/\x{01cb}+/8i
-    \x{01ca}\x{01cb}\x{01cc}
- 0: \x{1ca}\x{1cb}\x{1cc}
-
-/\x{01cc}+/8i
-    \x{01ca}\x{01cb}\x{01cc}
- 0: \x{1ca}\x{1cb}\x{1cc}
-
-
-/\x{01f1}+/8i
-    \x{01f1}\x{01f2}\x{01f3}
- 0: \x{1f1}\x{1f2}\x{1f3}
-
-/\x{01f2}+/8i
-    \x{01f1}\x{01f2}\x{01f3}
- 0: \x{1f1}\x{1f2}\x{1f3}
-
-/\x{01f3}+/8i
-    \x{01f1}\x{01f2}\x{01f3}
- 0: \x{1f1}\x{1f2}\x{1f3}
-
-
-/\x{0345}+/8i
-    \x{0345}\x{0399}\x{03b9}\x{1fbe}
- 0: \x{345}\x{399}\x{3b9}\x{1fbe}
-
-/\x{0399}+/8i
-    \x{0345}\x{0399}\x{03b9}\x{1fbe}
- 0: \x{345}\x{399}\x{3b9}\x{1fbe}
-
-/\x{03b9}+/8i
-    \x{0345}\x{0399}\x{03b9}\x{1fbe}
- 0: \x{345}\x{399}\x{3b9}\x{1fbe}
-
-/\x{1fbe}+/8i
-    \x{0345}\x{0399}\x{03b9}\x{1fbe}
- 0: \x{345}\x{399}\x{3b9}\x{1fbe}
-
-
-/\x{0392}+/8i
-    \x{0392}\x{03b2}\x{03d0}
- 0: \x{392}\x{3b2}\x{3d0}
-
-/\x{03b2}+/8i
-    \x{0392}\x{03b2}\x{03d0}
- 0: \x{392}\x{3b2}\x{3d0}
-
-/\x{03d0}+/8i
-    \x{0392}\x{03b2}\x{03d0}
- 0: \x{392}\x{3b2}\x{3d0}
-    
-
-/\x{0395}+/8i
-    \x{0395}\x{03b5}\x{03f5}
- 0: \x{395}\x{3b5}\x{3f5}
-
-/\x{03b5}+/8i
-    \x{0395}\x{03b5}\x{03f5}
- 0: \x{395}\x{3b5}\x{3f5}
-
-/\x{03f5}+/8i
-    \x{0395}\x{03b5}\x{03f5}
- 0: \x{395}\x{3b5}\x{3f5}
-
-
-/\x{0398}+/8i
-    \x{0398}\x{03b8}\x{03d1}\x{03f4}
- 0: \x{398}\x{3b8}\x{3d1}\x{3f4}
-
-/\x{03b8}+/8i
-    \x{0398}\x{03b8}\x{03d1}\x{03f4}
- 0: \x{398}\x{3b8}\x{3d1}\x{3f4}
-
-/\x{03d1}+/8i
-    \x{0398}\x{03b8}\x{03d1}\x{03f4}
- 0: \x{398}\x{3b8}\x{3d1}\x{3f4}
-
-/\x{03f4}+/8i
-    \x{0398}\x{03b8}\x{03d1}\x{03f4}
- 0: \x{398}\x{3b8}\x{3d1}\x{3f4}
-    
-
-/\x{039a}+/8i
-    \x{039a}\x{03ba}\x{03f0}
- 0: \x{39a}\x{3ba}\x{3f0}
-
-/\x{03ba}+/8i
-    \x{039a}\x{03ba}\x{03f0}
- 0: \x{39a}\x{3ba}\x{3f0}
-
-/\x{03f0}+/8i
-    \x{039a}\x{03ba}\x{03f0}
- 0: \x{39a}\x{3ba}\x{3f0}
-    
-
-/\x{03a0}+/8i
-    \x{03a0}\x{03c0}\x{03d6} 
- 0: \x{3a0}\x{3c0}\x{3d6}
-
-/\x{03c0}+/8i
-    \x{03a0}\x{03c0}\x{03d6} 
- 0: \x{3a0}\x{3c0}\x{3d6}
-
-/\x{03d6}+/8i
-    \x{03a0}\x{03c0}\x{03d6} 
- 0: \x{3a0}\x{3c0}\x{3d6}
-
-
-/\x{03a1}+/8i
-    \x{03a1}\x{03c1}\x{03f1}
- 0: \x{3a1}\x{3c1}\x{3f1}
-
-/\x{03c1}+/8i
-    \x{03a1}\x{03c1}\x{03f1}
- 0: \x{3a1}\x{3c1}\x{3f1}
-
-/\x{03f1}+/8i
-    \x{03a1}\x{03c1}\x{03f1}
- 0: \x{3a1}\x{3c1}\x{3f1}
-
-
-/\x{03a3}+/8i
-    \x{03A3}\x{03C2}\x{03C3}
- 0: \x{3a3}\x{3c2}\x{3c3}
-
-/\x{03c2}+/8i
-    \x{03A3}\x{03C2}\x{03C3}
- 0: \x{3a3}\x{3c2}\x{3c3}
-
-/\x{03c3}+/8i
-    \x{03A3}\x{03C2}\x{03C3}
- 0: \x{3a3}\x{3c2}\x{3c3}
-    
-
-/\x{03a6}+/8i
-    \x{03a6}\x{03c6}\x{03d5} 
- 0: \x{3a6}\x{3c6}\x{3d5}
-
-/\x{03c6}+/8i
-    \x{03a6}\x{03c6}\x{03d5} 
- 0: \x{3a6}\x{3c6}\x{3d5}
-
-/\x{03d5}+/8i
-    \x{03a6}\x{03c6}\x{03d5} 
- 0: \x{3a6}\x{3c6}\x{3d5}
-
-
-/\x{03c9}+/8i
-    \x{03c9}\x{03a9}\x{2126}
- 0: \x{3c9}\x{3a9}\x{2126}
-
-/\x{03a9}+/8i
-    \x{03c9}\x{03a9}\x{2126}
- 0: \x{3c9}\x{3a9}\x{2126}
-
-/\x{2126}+/8i
-    \x{03c9}\x{03a9}\x{2126}
- 0: \x{3c9}\x{3a9}\x{2126}
-    
-
-/\x{1e60}+/8i
-    \x{1e60}\x{1e61}\x{1e9b}
- 0: \x{1e60}\x{1e61}\x{1e9b}
-
-/\x{1e61}+/8i
-    \x{1e60}\x{1e61}\x{1e9b}
- 0: \x{1e60}\x{1e61}\x{1e9b}
-
-/\x{1e9b}+/8i
-    \x{1e60}\x{1e61}\x{1e9b}
- 0: \x{1e60}\x{1e61}\x{1e9b}
-    
-
-/\x{1e9e}+/8i
-    \x{1e9e}\x{00df}
- 0: \x{1e9e}\x{df}
-
-/\x{00df}+/8i
-    \x{1e9e}\x{00df}
- 0: \x{1e9e}\x{df}
-    
-
-/\x{1f88}+/8i
-    \x{1f88}\x{1f80} 
- 0: \x{1f88}\x{1f80}
-
-/\x{1f80}+/8i
-    \x{1f88}\x{1f80} 
- 0: \x{1f88}\x{1f80}
-
-/\x{004b}+/8i
-    \x{004b}\x{006b}\x{212a}
- 0: Kk\x{212a}
-
-/\x{006b}+/8i
-    \x{004b}\x{006b}\x{212a}
- 0: Kk\x{212a}
-
-/\x{212a}+/8i
-    \x{004b}\x{006b}\x{212a}
- 0: Kk\x{212a}
-
-
-/\x{0053}+/8i
-    \x{0053}\x{0073}\x{017f}
- 0: Ss\x{17f}
-
-/\x{0073}+/8i
-    \x{0053}\x{0073}\x{017f}
- 0: Ss\x{17f}
-
-/\x{017f}+/8i
-    \x{0053}\x{0073}\x{017f}
- 0: Ss\x{17f}
-
-/ist/8i
-    ikt
-No match
-
-/is+t/8i
-    iSs\x{17f}t
- 0: iSs\x{17f}t
-    ikt
-No match
-
-/is+?t/8i
-    ikt
-No match
-
-/is?t/8i
-    ikt
-No match
-
-/is{2}t/8i
-    iskt
-No match
-
-/^\p{Xuc}/8
-    $abc
- 0: $
-    @abc
- 0: @
-    `abc
- 0: `
-    \x{1234}abc
- 0: \x{1234}
-    ** Failers
-No match
-    abc     
-No match
-
-/^\p{Xuc}+/8
-    $@`\x{a0}\x{1234}\x{e000}**
- 0: $@`\x{a0}\x{1234}\x{e000}
-    ** Failers
-No match
-    \x{9f}
-No match
-
-/^\p{Xuc}+?/8
-    $@`\x{a0}\x{1234}\x{e000}**
- 0: $@`\x{a0}\x{1234}\x{e000}
- 1: $@`\x{a0}\x{1234}
- 2: $@`\x{a0}
- 3: $@`
- 4: $@
- 5: $
-    ** Failers
-No match
-    \x{9f}
-No match
-
-/^\p{Xuc}+?\*/8
-    $@`\x{a0}\x{1234}\x{e000}**
- 0: $@`\x{a0}\x{1234}\x{e000}*
-    ** Failers
-No match
-    \x{9f}
-No match
-
-/^\p{Xuc}++/8
-    $@`\x{a0}\x{1234}\x{e000}**
- 0: $@`\x{a0}\x{1234}\x{e000}
-    ** Failers
-No match
-    \x{9f}
-No match
-
-/^\p{Xuc}{3,5}/8
-    $@`\x{a0}\x{1234}\x{e000}**
- 0: $@`\x{a0}\x{1234}
-    ** Failers
-No match
-    \x{9f}
-No match
-
-/^\p{Xuc}{3,5}?/8
-    $@`\x{a0}\x{1234}\x{e000}**
- 0: $@`\x{a0}\x{1234}
- 1: $@`\x{a0}
- 2: $@`
-    ** Failers
-No match
-    \x{9f}
-No match
-
-/^[\p{Xuc}]/8
-    $@`\x{a0}\x{1234}\x{e000}**
- 0: $
-    ** Failers
-No match
-    \x{9f}
-No match
-
-/^[\p{Xuc}]+/8
-    $@`\x{a0}\x{1234}\x{e000}**
- 0: $@`\x{a0}\x{1234}\x{e000}
-    ** Failers
-No match
-    \x{9f}
-No match
-
-/^\P{Xuc}/8
-    abc
- 0: a
-    ** Failers
- 0: *
-    $abc
-No match
-    @abc
-No match
-    `abc
-No match
-    \x{1234}abc
-No match
-
-/^[\P{Xuc}]/8
-    abc
- 0: a
-    ** Failers
- 0: *
-    $abc
-No match
-    @abc
-No match
-    `abc
-No match
-    \x{1234}abc
-No match
-
-/^A\s+Z/8W
-    A\x{2005}Z
- 0: A\x{2005}Z
-    A\x{85}\x{180e}\x{2005}Z
- 0: A\x{85}\x{180e}\x{2005}Z
-
-/^A[\s]+Z/8W
-    A\x{2005}Z
- 0: A\x{2005}Z
-    A\x{85}\x{180e}\x{2005}Z
- 0: A\x{85}\x{180e}\x{2005}Z
-
-/-- End of testinput10 --/ 
diff --git a/dist/testdata/testoutput13 b/dist/testdata/testoutput13
deleted file mode 100644
index d6fb8a5..0000000
--- a/dist/testdata/testoutput13
+++ /dev/null
@@ -1,22 +0,0 @@
-/-- This test is run only when JIT support is not available. It checks that an 
-attempt to use it has the expected behaviour. It also tests things that
-are different without JIT. --/
-   
-/abc/S+I
-Capturing subpattern count = 0
-No options
-First char = 'a'
-Need char = 'c'
-Subject length lower bound = 3
-No starting char list
-JIT support is not available in this version of PCRE
-
-/a*/SI
-Capturing subpattern count = 0
-May match empty string
-No options
-No first char
-No need char
-Study returned NULL
-
-/-- End of testinput13 --/
diff --git a/dist/testdata/testoutput15 b/dist/testdata/testoutput15
deleted file mode 100644
index bad2807..0000000
--- a/dist/testdata/testoutput15
+++ /dev/null
@@ -1,1139 +0,0 @@
-/-- This set of tests is for UTF-8 support but not Unicode property support,
-    and is relevant only to the 8-bit library. --/
-
-< forbid W
-
-/X(\C{3})/8
-    X\x{1234}
- 0: X\x{1234}
- 1: \x{1234}
-
-/X(\C{4})/8
-    X\x{1234}YZ
- 0: X\x{1234}Y
- 1: \x{1234}Y
-    
-/X\C*/8
-    XYZabcdce
- 0: XYZabcdce
-    
-/X\C*?/8
-    XYZabcde
- 0: X
-    
-/X\C{3,5}/8
-    Xabcdefg   
- 0: Xabcde
-    X\x{1234} 
- 0: X\x{1234}
-    X\x{1234}YZ
- 0: X\x{1234}YZ
-    X\x{1234}\x{512}  
- 0: X\x{1234}\x{512}
-    X\x{1234}\x{512}YZ
- 0: X\x{1234}\x{512}
-
-/X\C{3,5}?/8
-    Xabcdefg   
- 0: Xabc
-    X\x{1234} 
- 0: X\x{1234}
-    X\x{1234}YZ
- 0: X\x{1234}
-    X\x{1234}\x{512}  
- 0: X\x{1234}
-
-/a\Cb/8
-    aXb
- 0: aXb
-    a\nb
- 0: a\x{0a}b
-    
-/a\C\Cb/8 
-    a\x{100}b 
- 0: a\x{100}b
-
-/ab\Cde/8
-    abXde
- 0: abXde
-
-/a\C\Cb/8 
-    a\x{100}b
- 0: a\x{100}b
-    ** Failers 
-No match
-    a\x{12257}b
-No match
-
-/[Ã]/8
-Failed: invalid UTF-8 string at offset 1
-
-/Ã/8
-Failed: invalid UTF-8 string at offset 0
-
-/ÃÃÃxxx/8
-Failed: invalid UTF-8 string at offset 0
-
-/ÃÃÃxxx/8?DZSSO
-------------------------------------------------------------------
-        Bra
-        \X{c0}\X{c0}\X{c0}xxx
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: no_auto_possessify utf no_utf_check
-First char = \x{c3}
-Need char = 'x'
-
-/badutf/8
-    \xdf
-Error -10 (bad UTF-8 string) offset=0 reason=1
-    \xef
-Error -10 (bad UTF-8 string) offset=0 reason=2
-    \xef\x80
-Error -10 (bad UTF-8 string) offset=0 reason=1
-    \xf7
-Error -10 (bad UTF-8 string) offset=0 reason=3
-    \xf7\x80
-Error -10 (bad UTF-8 string) offset=0 reason=2
-    \xf7\x80\x80
-Error -10 (bad UTF-8 string) offset=0 reason=1
-    \xfb
-Error -10 (bad UTF-8 string) offset=0 reason=4
-    \xfb\x80
-Error -10 (bad UTF-8 string) offset=0 reason=3
-    \xfb\x80\x80
-Error -10 (bad UTF-8 string) offset=0 reason=2
-    \xfb\x80\x80\x80
-Error -10 (bad UTF-8 string) offset=0 reason=1
-    \xfd
-Error -10 (bad UTF-8 string) offset=0 reason=5
-    \xfd\x80
-Error -10 (bad UTF-8 string) offset=0 reason=4
-    \xfd\x80\x80
-Error -10 (bad UTF-8 string) offset=0 reason=3
-    \xfd\x80\x80\x80
-Error -10 (bad UTF-8 string) offset=0 reason=2
-    \xfd\x80\x80\x80\x80
-Error -10 (bad UTF-8 string) offset=0 reason=1
-    \xdf\x7f
-Error -10 (bad UTF-8 string) offset=0 reason=6
-    \xef\x7f\x80
-Error -10 (bad UTF-8 string) offset=0 reason=6
-    \xef\x80\x7f
-Error -10 (bad UTF-8 string) offset=0 reason=7
-    \xf7\x7f\x80\x80
-Error -10 (bad UTF-8 string) offset=0 reason=6
-    \xf7\x80\x7f\x80
-Error -10 (bad UTF-8 string) offset=0 reason=7
-    \xf7\x80\x80\x7f
-Error -10 (bad UTF-8 string) offset=0 reason=8
-    \xfb\x7f\x80\x80\x80
-Error -10 (bad UTF-8 string) offset=0 reason=6
-    \xfb\x80\x7f\x80\x80
-Error -10 (bad UTF-8 string) offset=0 reason=7
-    \xfb\x80\x80\x7f\x80
-Error -10 (bad UTF-8 string) offset=0 reason=8
-    \xfb\x80\x80\x80\x7f
-Error -10 (bad UTF-8 string) offset=0 reason=9
-    \xfd\x7f\x80\x80\x80\x80
-Error -10 (bad UTF-8 string) offset=0 reason=6
-    \xfd\x80\x7f\x80\x80\x80
-Error -10 (bad UTF-8 string) offset=0 reason=7
-    \xfd\x80\x80\x7f\x80\x80
-Error -10 (bad UTF-8 string) offset=0 reason=8
-    \xfd\x80\x80\x80\x7f\x80
-Error -10 (bad UTF-8 string) offset=0 reason=9
-    \xfd\x80\x80\x80\x80\x7f
-Error -10 (bad UTF-8 string) offset=0 reason=10
-    \xed\xa0\x80
-Error -10 (bad UTF-8 string) offset=0 reason=14
-    \xc0\x8f
-Error -10 (bad UTF-8 string) offset=0 reason=15
-    \xe0\x80\x8f
-Error -10 (bad UTF-8 string) offset=0 reason=16
-    \xf0\x80\x80\x8f
-Error -10 (bad UTF-8 string) offset=0 reason=17
-    \xf8\x80\x80\x80\x8f
-Error -10 (bad UTF-8 string) offset=0 reason=18
-    \xfc\x80\x80\x80\x80\x8f
-Error -10 (bad UTF-8 string) offset=0 reason=19
-    \x80
-Error -10 (bad UTF-8 string) offset=0 reason=20
-    \xfe
-Error -10 (bad UTF-8 string) offset=0 reason=21
-    \xff
-Error -10 (bad UTF-8 string) offset=0 reason=21
-
-/badutf/8
-    \xfb\x80\x80\x80\x80
-Error -10 (bad UTF-8 string) offset=0 reason=11
-    \xfd\x80\x80\x80\x80\x80
-Error -10 (bad UTF-8 string) offset=0 reason=12
-    \xf7\xbf\xbf\xbf
-Error -10 (bad UTF-8 string) offset=0 reason=13
-
-/shortutf/8
-    \P\P\xdf
-Error -25 (short UTF-8 string) offset=0 reason=1
-    \P\P\xef
-Error -25 (short UTF-8 string) offset=0 reason=2
-    \P\P\xef\x80
-Error -25 (short UTF-8 string) offset=0 reason=1
-    \P\P\xf7
-Error -25 (short UTF-8 string) offset=0 reason=3
-    \P\P\xf7\x80
-Error -25 (short UTF-8 string) offset=0 reason=2
-    \P\P\xf7\x80\x80
-Error -25 (short UTF-8 string) offset=0 reason=1
-    \P\P\xfb
-Error -25 (short UTF-8 string) offset=0 reason=4
-    \P\P\xfb\x80
-Error -25 (short UTF-8 string) offset=0 reason=3
-    \P\P\xfb\x80\x80
-Error -25 (short UTF-8 string) offset=0 reason=2
-    \P\P\xfb\x80\x80\x80
-Error -25 (short UTF-8 string) offset=0 reason=1
-    \P\P\xfd
-Error -25 (short UTF-8 string) offset=0 reason=5
-    \P\P\xfd\x80
-Error -25 (short UTF-8 string) offset=0 reason=4
-    \P\P\xfd\x80\x80
-Error -25 (short UTF-8 string) offset=0 reason=3
-    \P\P\xfd\x80\x80\x80
-Error -25 (short UTF-8 string) offset=0 reason=2
-    \P\P\xfd\x80\x80\x80\x80
-Error -25 (short UTF-8 string) offset=0 reason=1
-
-/anything/8
-    \xc0\x80
-Error -10 (bad UTF-8 string) offset=0 reason=15
-    \xc1\x8f 
-Error -10 (bad UTF-8 string) offset=0 reason=15
-    \xe0\x9f\x80
-Error -10 (bad UTF-8 string) offset=0 reason=16
-    \xf0\x8f\x80\x80 
-Error -10 (bad UTF-8 string) offset=0 reason=17
-    \xf8\x87\x80\x80\x80  
-Error -10 (bad UTF-8 string) offset=0 reason=18
-    \xfc\x83\x80\x80\x80\x80
-Error -10 (bad UTF-8 string) offset=0 reason=19
-    \xfe\x80\x80\x80\x80\x80  
-Error -10 (bad UTF-8 string) offset=0 reason=21
-    \xff\x80\x80\x80\x80\x80  
-Error -10 (bad UTF-8 string) offset=0 reason=21
-    \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  
-Error -10 (bad UTF-8 string) offset=0 reason=11
-    \xf9\x87\x80\x80\x80  
-Error -10 (bad UTF-8 string) offset=0 reason=11
-    \xfc\x84\x80\x80\x80\x80
-Error -10 (bad UTF-8 string) offset=0 reason=12
-    \xfd\x83\x80\x80\x80\x80
-Error -10 (bad UTF-8 string) offset=0 reason=12
-    \?\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}/8DZ
-------------------------------------------------------------------
-        Bra
-        \x{100}
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = \x{c4}
-Need char = \x{80}
-
-/\x{1000}/8DZ
-------------------------------------------------------------------
-        Bra
-        \x{1000}
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = \x{e1}
-Need char = \x{80}
-
-/\x{10000}/8DZ
-------------------------------------------------------------------
-        Bra
-        \x{10000}
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = \x{f0}
-Need char = \x{80}
-
-/\x{100000}/8DZ
-------------------------------------------------------------------
-        Bra
-        \x{100000}
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = \x{f4}
-Need char = \x{80}
-
-/\x{10ffff}/8DZ
-------------------------------------------------------------------
-        Bra
-        \x{10ffff}
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = \x{f4}
-Need char = \x{bf}
-
-/[\x{ff}]/8DZ
-------------------------------------------------------------------
-        Bra
-        \x{ff}
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = \x{c3}
-Need char = \x{bf}
-
-/[\x{100}]/8DZ
-------------------------------------------------------------------
-        Bra
-        \x{100}
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = \x{c4}
-Need char = \x{80}
-
-/\x80/8DZ
-------------------------------------------------------------------
-        Bra
-        \x{80}
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = \x{c2}
-Need char = \x{80}
-
-/\xff/8DZ
-------------------------------------------------------------------
-        Bra
-        \x{ff}
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = \x{c3}
-Need char = \x{bf}
-
-/\x{D55c}\x{ad6d}\x{C5B4}/DZ8 
-------------------------------------------------------------------
-        Bra
-        \x{d55c}\x{ad6d}\x{c5b4}
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = \x{ed}
-Need char = \x{b4}
-    \x{D55c}\x{ad6d}\x{C5B4} 
- 0: \x{d55c}\x{ad6d}\x{c5b4}
-
-/\x{65e5}\x{672c}\x{8a9e}/DZ8
-------------------------------------------------------------------
-        Bra
-        \x{65e5}\x{672c}\x{8a9e}
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = \x{e6}
-Need char = \x{9e}
-    \x{65e5}\x{672c}\x{8a9e}
- 0: \x{65e5}\x{672c}\x{8a9e}
-
-/\x{80}/DZ8
-------------------------------------------------------------------
-        Bra
-        \x{80}
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = \x{c2}
-Need char = \x{80}
-
-/\x{084}/DZ8
-------------------------------------------------------------------
-        Bra
-        \x{84}
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = \x{c2}
-Need char = \x{84}
-
-/\x{104}/DZ8
-------------------------------------------------------------------
-        Bra
-        \x{104}
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = \x{c4}
-Need char = \x{84}
-
-/\x{861}/DZ8
-------------------------------------------------------------------
-        Bra
-        \x{861}
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = \x{e0}
-Need char = \x{a1}
-
-/\x{212ab}/DZ8
-------------------------------------------------------------------
-        Bra
-        \x{212ab}
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = \x{f0}
-Need char = \x{ab}
-
-/-- This one is here not because it's different to Perl, but because the way
-the captured single-byte is displayed. (In Perl it becomes a character, and you
-can't tell the difference.) --/
-    
-/X(\C)(.*)/8
-    X\x{1234}
- 0: X\x{1234}
- 1: \x{e1}
- 2: \x{88}\x{b4}
-    X\nabc 
- 0: X\x{0a}abc
- 1: \x{0a}
- 2: abc
-
-/-- This one is here because Perl gives out a grumbly error message (quite 
-correctly, but that messes up comparisons). --/
-    
-/a\Cb/8
-    *** Failers 
-No match
-    a\x{100}b 
-No match
-    
-/[^ab\xC0-\xF0]/8SDZ
-------------------------------------------------------------------
-        Bra
-        [\x00-`c-\xbf\xf1-\xff] (neg)
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-No first char
-No need char
-Subject length lower bound = 1
-Starting chars: \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 
-  \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}
- 0: \x{bf}
-    \x{100}
- 0: \x{100}
-    \x{1000}   
- 0: \x{1000}
-    *** Failers
- 0: *
-    \x{c0} 
-No match
-    \x{f0} 
-No match
-
-/Ā{3,4}/8SDZ
-------------------------------------------------------------------
-        Bra
-        \x{100}{3}
-        \x{100}?+
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = \x{c4}
-Need char = \x{80}
-Subject length lower bound = 3
-No starting char list
-  \x{100}\x{100}\x{100}\x{100\x{100}
- 0: \x{100}\x{100}\x{100}
-
-/(\x{100}+|x)/8SDZ
-------------------------------------------------------------------
-        Bra
-        CBra 1
-        \x{100}++
-        Alt
-        x
-        Ket
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 1
-Options: utf
-No first char
-No need char
-Subject length lower bound = 1
-Starting chars: x \xc4 
-
-/(\x{100}*a|x)/8SDZ
-------------------------------------------------------------------
-        Bra
-        CBra 1
-        \x{100}*+
-        a
-        Alt
-        x
-        Ket
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 1
-Options: utf
-No first char
-No need char
-Subject length lower bound = 1
-Starting chars: a x \xc4 
-
-/(\x{100}{0,2}a|x)/8SDZ
-------------------------------------------------------------------
-        Bra
-        CBra 1
-        \x{100}{0,2}+
-        a
-        Alt
-        x
-        Ket
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 1
-Options: utf
-No first char
-No need char
-Subject length lower bound = 1
-Starting chars: a x \xc4 
-
-/(\x{100}{1,2}a|x)/8SDZ
-------------------------------------------------------------------
-        Bra
-        CBra 1
-        \x{100}
-        \x{100}{0,1}+
-        a
-        Alt
-        x
-        Ket
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 1
-Options: utf
-No first char
-No need char
-Subject length lower bound = 1
-Starting chars: x \xc4 
-
-/\x{100}/8DZ
-------------------------------------------------------------------
-        Bra
-        \x{100}
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = \x{c4}
-Need char = \x{80}
-
-/a\x{100}\x{101}*/8DZ
-------------------------------------------------------------------
-        Bra
-        a\x{100}
-        \x{101}*+
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = 'a'
-Need char = \x{80}
-
-/a\x{100}\x{101}+/8DZ
-------------------------------------------------------------------
-        Bra
-        a\x{100}
-        \x{101}++
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = 'a'
-Need char = \x{81}
-
-/[^\x{c4}]/DZ
-------------------------------------------------------------------
-        Bra
-        [^\x{c4}]
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-No options
-No first char
-No need char
-
-/[\x{100}]/8DZ
-------------------------------------------------------------------
-        Bra
-        \x{100}
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = \x{c4}
-Need char = \x{80}
-    \x{100}
- 0: \x{100}
-    Z\x{100}
- 0: \x{100}
-    \x{100}Z
- 0: \x{100}
-    *** Failers 
-No match
-
-/[\xff]/DZ8
-------------------------------------------------------------------
-        Bra
-        \x{ff}
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = \x{c3}
-Need char = \x{bf}
-    >\x{ff}<
- 0: \x{ff}
-
-/[^\xff]/8DZ
-------------------------------------------------------------------
-        Bra
-        [^\x{ff}]
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-No first char
-No need char
-
-/\x{100}abc(xyz(?1))/8DZ
-------------------------------------------------------------------
-        Bra
-        \x{100}abc
-        CBra 1
-        xyz
-        Recurse
-        Ket
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 1
-Options: utf
-First char = \x{c4}
-Need char = 'z'
-
-/a\x{1234}b/P8
-    a\x{1234}b
- 0: a\x{1234}b
-
-/\777/8I
-Capturing subpattern count = 0
-Options: utf
-First char = \x{c7}
-Need char = \x{bf}
-  \x{1ff}
- 0: \x{1ff}
-  \777 
- 0: \x{1ff}
-  
-/\x{100}+\x{200}/8DZ
-------------------------------------------------------------------
-        Bra
-        \x{100}++
-        \x{200}
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = \x{c4}
-Need char = \x{80}
-
-/\x{100}+X/8DZ
-------------------------------------------------------------------
-        Bra
-        \x{100}++
-        X
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = \x{c4}
-Need char = 'X'
-
-/^[\QĀ\E-\QŐ\E/BZ8
-Failed: missing terminating ] for character class at offset 15
-
-/-- This tests the stricter UTF-8 check according to RFC 3629. --/ 
-    
-/X/8
-    \x{d800}
-Error -10 (bad UTF-8 string) offset=0 reason=14
-    \x{d800}\?
-No match
-    \x{da00}
-Error -10 (bad UTF-8 string) offset=0 reason=14
-    \x{da00}\?
-No match
-    \x{dfff}
-Error -10 (bad UTF-8 string) offset=0 reason=14
-    \x{dfff}\?
-No match
-    \x{110000}    
-Error -10 (bad UTF-8 string) offset=0 reason=13
-    \x{110000}\?    
-No match
-    \x{2000000} 
-Error -10 (bad UTF-8 string) offset=0 reason=11
-    \x{2000000}\? 
-No match
-    \x{7fffffff} 
-Error -10 (bad UTF-8 string) offset=0 reason=12
-    \x{7fffffff}\? 
-No match
-
-/(*UTF8)\x{1234}/
-  abcd\x{1234}pqr
- 0: \x{1234}
-
-/(*CRLF)(*UTF)(*BSR_UNICODE)a\Rb/I
-Capturing subpattern count = 0
-Options: bsr_unicode utf
-Forced newline sequence: CRLF
-First char = 'a'
-Need char = 'b'
-
-/\h/SI8
-Capturing subpattern count = 0
-Options: utf
-No first char
-No need char
-Subject length lower bound = 1
-Starting chars: \x09 \x20 \xc2 \xe1 \xe2 \xe3 
-    ABC\x{09}
- 0: \x{09}
-    ABC\x{20}
- 0:  
-    ABC\x{a0}
- 0: \x{a0}
-    ABC\x{1680}
- 0: \x{1680}
-    ABC\x{180e}
- 0: \x{180e}
-    ABC\x{2000}
- 0: \x{2000}
-    ABC\x{202f} 
- 0: \x{202f}
-    ABC\x{205f} 
- 0: \x{205f}
-    ABC\x{3000} 
- 0: \x{3000}
-
-/\v/SI8
-Capturing subpattern count = 0
-Options: utf
-No first char
-No need char
-Subject length lower bound = 1
-Starting chars: \x0a \x0b \x0c \x0d \xc2 \xe2 
-    ABC\x{0a}
- 0: \x{0a}
-    ABC\x{0b}
- 0: \x{0b}
-    ABC\x{0c}
- 0: \x{0c}
-    ABC\x{0d}
- 0: \x{0d}
-    ABC\x{85}
- 0: \x{85}
-    ABC\x{2028}
- 0: \x{2028}
-
-/\h*A/SI8
-Capturing subpattern count = 0
-Options: utf
-No first char
-Need char = 'A'
-Subject length lower bound = 1
-Starting chars: \x09 \x20 A \xc2 \xe1 \xe2 \xe3 
-    CDBABC
- 0: A
-    
-/\v+A/SI8
-Capturing subpattern count = 0
-Options: utf
-No first char
-Need char = 'A'
-Subject length lower bound = 2
-Starting chars: \x0a \x0b \x0c \x0d \xc2 \xe2 
-
-/\s?xxx\s/8SI
-Capturing subpattern count = 0
-Options: utf
-No first char
-Need char = 'x'
-Subject length lower bound = 4
-Starting chars: \x09 \x0a \x0b \x0c \x0d \x20 x 
-
-/\sxxx\s/I8ST1
-Capturing subpattern count = 0
-Options: utf
-No first char
-Need char = 'x'
-Subject length lower bound = 5
-Starting chars: \x09 \x0a \x0b \x0c \x0d \x20 \xc2 
-    AB\x{85}xxx\x{a0}XYZ
- 0: \x{85}xxx\x{a0}
-    AB\x{a0}xxx\x{85}XYZ
- 0: \x{a0}xxx\x{85}
-
-/\S \S/I8ST1
-Capturing subpattern count = 0
-Options: utf
-No first char
-Need char = ' '
-Subject length lower bound = 3
-Starting chars: \x00 \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x0e \x0f 
-  \x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17 \x18 \x19 \x1a \x1b \x1c \x1d \x1e 
-  \x1f ! " # $ % & ' ( ) * + , - . / 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 { | } ~ \x7f \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 
-    \x{a2} \x{84} 
- 0: \x{a2} \x{84}
-    A Z 
- 0: A Z
-
-/a+/8
-    a\x{123}aa\>1
- 0: aa
-    a\x{123}aa\>2
-Error -11 (bad UTF-8 offset)
-    a\x{123}aa\>3
- 0: aa
-    a\x{123}aa\>4
- 0: a
-    a\x{123}aa\>5
-No match
-    a\x{123}aa\>6
-Error -24 (bad offset value)
-
-/\x{1234}+/iS8I
-Capturing subpattern count = 0
-Options: caseless utf
-No first char
-No need char
-Subject length lower bound = 1
-Starting chars: \xe1 
-
-/\x{1234}+?/iS8I
-Capturing subpattern count = 0
-Options: caseless utf
-No first char
-No need char
-Subject length lower bound = 1
-Starting chars: \xe1 
-
-/\x{1234}++/iS8I
-Capturing subpattern count = 0
-Options: caseless utf
-No first char
-No need char
-Subject length lower bound = 1
-Starting chars: \xe1 
-
-/\x{1234}{2}/iS8I
-Capturing subpattern count = 0
-Options: caseless utf
-No first char
-No need char
-Subject length lower bound = 2
-Starting chars: \xe1 
-
-/[^\x{c4}]/8DZ
-------------------------------------------------------------------
-        Bra
-        [^\x{c4}]
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-No first char
-No need char
-
-/X+\x{200}/8DZ
-------------------------------------------------------------------
-        Bra
-        X++
-        \x{200}
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = 'X'
-Need char = \x{80}
-
-/\R/SI8
-Capturing subpattern count = 0
-Options: utf
-No first char
-No need char
-Subject length lower bound = 1
-Starting chars: \x0a \x0b \x0c \x0d \xc2 \xe2 
-
-/\777/8DZ
-------------------------------------------------------------------
-        Bra
-        \x{1ff}
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = \x{c7}
-Need char = \x{bf}
-
-/\w+\x{C4}/8BZ
-------------------------------------------------------------------
-        Bra
-        \w++
-        \x{c4}
-        Ket
-        End
-------------------------------------------------------------------
-    a\x{C4}\x{C4}
- 0: a\x{c4}
-
-/\w+\x{C4}/8BZT1
-------------------------------------------------------------------
-        Bra
-        \w+
-        \x{c4}
-        Ket
-        End
-------------------------------------------------------------------
-    a\x{C4}\x{C4}
- 0: a\x{c4}\x{c4}
-    
-/\W+\x{C4}/8BZ
-------------------------------------------------------------------
-        Bra
-        \W+
-        \x{c4}
-        Ket
-        End
-------------------------------------------------------------------
-    !\x{C4}
- 0: !\x{c4}
- 
-/\W+\x{C4}/8BZT1
-------------------------------------------------------------------
-        Bra
-        \W++
-        \x{c4}
-        Ket
-        End
-------------------------------------------------------------------
-    !\x{C4}
- 0: !\x{c4}
-
-/\W+\x{A1}/8BZ
-------------------------------------------------------------------
-        Bra
-        \W+
-        \x{a1}
-        Ket
-        End
-------------------------------------------------------------------
-    !\x{A1}
- 0: !\x{a1}
- 
-/\W+\x{A1}/8BZT1
-------------------------------------------------------------------
-        Bra
-        \W+
-        \x{a1}
-        Ket
-        End
-------------------------------------------------------------------
-    !\x{A1}
- 0: !\x{a1}
-
-/X\s+\x{A0}/8BZ
-------------------------------------------------------------------
-        Bra
-        X
-        \s++
-        \x{a0}
-        Ket
-        End
-------------------------------------------------------------------
-    X\x20\x{A0}\x{A0}
- 0: X \x{a0}
-
-/X\s+\x{A0}/8BZT1
-------------------------------------------------------------------
-        Bra
-        X
-        \s+
-        \x{a0}
-        Ket
-        End
-------------------------------------------------------------------
-    X\x20\x{A0}\x{A0}
- 0: X \x{a0}\x{a0}
-
-/\S+\x{A0}/8BZ
-------------------------------------------------------------------
-        Bra
-        \S+
-        \x{a0}
-        Ket
-        End
-------------------------------------------------------------------
-    X\x{A0}\x{A0}
- 0: X\x{a0}\x{a0}
-
-/\S+\x{A0}/8BZT1
-------------------------------------------------------------------
-        Bra
-        \S++
-        \x{a0}
-        Ket
-        End
-------------------------------------------------------------------
-    X\x{A0}\x{A0}
- 0: X\x{a0}
-
-/\x{a0}+\s!/8BZ
-------------------------------------------------------------------
-        Bra
-        \x{a0}++
-        \s
-        !
-        Ket
-        End
-------------------------------------------------------------------
-    \x{a0}\x20!
- 0: \x{a0} !
-
-/\x{a0}+\s!/8BZT1
-------------------------------------------------------------------
-        Bra
-        \x{a0}+
-        \s
-        !
-        Ket
-        End
-------------------------------------------------------------------
-    \x{a0}\x20!
- 0: \x{a0} !
-
-/A/8
-  \x{ff000041}
-** Character \x{ff000041} is greater than 0x7fffffff and so cannot be converted to UTF-8
-  \x{7f000041} 
-Error -10 (bad UTF-8 string) offset=0 reason=12
-
-/(*UTF8)abc/9
-Failed: setting UTF is disabled by the application at offset 0
-
-/abc/89
-Failed: setting UTF is disabled by the application at offset 0
-
-/-- End of testinput15 --/
diff --git a/dist/testdata/testoutput16 b/dist/testdata/testoutput16
deleted file mode 100644
index fd184cd..0000000
--- a/dist/testdata/testoutput16
+++ /dev/null
@@ -1,141 +0,0 @@
-/-- This set of tests is run only with the 8-bit library when Unicode property 
-    support is available. It starts with tests of the POSIX interface, because
-    that is supported only with the 8-bit library. --/
-
-/\w/P
-    +++\x{c2}
-No match: POSIX code 17: match failed
-
-/\w/WP
-    +++\x{c2}
- 0: \xc2
-    
-/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/8iDZ
-------------------------------------------------------------------
-        Bra
-     /i A\x{391}\x{10427}\x{ff3a}\x{1fb0}
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: caseless utf
-First char = 'A' (caseless)
-No need char
-
-/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/8DZ
-------------------------------------------------------------------
-        Bra
-        A\x{391}\x{10427}\x{ff3a}\x{1fb0}
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = 'A'
-Need char = \x{b0}
-
-/AB\x{1fb0}/8DZ
-------------------------------------------------------------------
-        Bra
-        AB\x{1fb0}
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = 'A'
-Need char = \x{b0}
-
-/AB\x{1fb0}/8DZi
-------------------------------------------------------------------
-        Bra
-     /i AB\x{1fb0}
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: caseless utf
-First char = 'A' (caseless)
-Need char = 'B' (caseless)
-
-/\x{401}\x{420}\x{421}\x{422}\x{423}\x{424}\x{425}\x{426}\x{427}\x{428}\x{429}\x{42a}\x{42b}\x{42c}\x{42d}\x{42e}\x{42f}/8iSI
-Capturing subpattern count = 0
-Options: caseless utf
-No first char
-No need char
-Subject length lower bound = 17
-Starting chars: \xd0 \xd1 
-    \x{401}\x{420}\x{421}\x{422}\x{423}\x{424}\x{425}\x{426}\x{427}\x{428}\x{429}\x{42a}\x{42b}\x{42c}\x{42d}\x{42e}\x{42f}
- 0: \x{401}\x{420}\x{421}\x{422}\x{423}\x{424}\x{425}\x{426}\x{427}\x{428}\x{429}\x{42a}\x{42b}\x{42c}\x{42d}\x{42e}\x{42f}
-    \x{451}\x{440}\x{441}\x{442}\x{443}\x{444}\x{445}\x{446}\x{447}\x{448}\x{449}\x{44a}\x{44b}\x{44c}\x{44d}\x{44e}\x{44f}
- 0: \x{451}\x{440}\x{441}\x{442}\x{443}\x{444}\x{445}\x{446}\x{447}\x{448}\x{449}\x{44a}\x{44b}\x{44c}\x{44d}\x{44e}\x{44f}
-
-/[ⱥ]/8iBZ
-------------------------------------------------------------------
-        Bra
-     /i \x{2c65}
-        Ket
-        End
-------------------------------------------------------------------
-
-/[^ⱥ]/8iBZ
-------------------------------------------------------------------
-        Bra
-     /i [^\x{2c65}]
-        Ket
-        End
-------------------------------------------------------------------
-
-/\h/SI
-Capturing subpattern count = 0
-No options
-No first char
-No need char
-Subject length lower bound = 1
-Starting chars: \x09 \x20 \xa0 
-
-/\v/SI
-Capturing subpattern count = 0
-No options
-No first char
-No need char
-Subject length lower bound = 1
-Starting chars: \x0a \x0b \x0c \x0d \x85 
-
-/\R/SI
-Capturing subpattern count = 0
-No options
-No first char
-No need char
-Subject length lower bound = 1
-Starting chars: \x0a \x0b \x0c \x0d \x85 
-
-/[[:blank:]]/WBZ
-------------------------------------------------------------------
-        Bra
-        [\x09 \xa0]
-        Ket
-        End
-------------------------------------------------------------------
-
-/\x{212a}+/i8SI
-Capturing subpattern count = 0
-Options: caseless utf
-No first char
-No need char
-Subject length lower bound = 1
-Starting chars: K k \xe2 
-    KKkk\x{212a}
- 0: KKkk\x{212a}
-
-/s+/i8SI
-Capturing subpattern count = 0
-Options: caseless utf
-No first char
-No need char
-Subject length lower bound = 1
-Starting chars: S s \xc5 
-    SSss\x{17f}
- 0: SSss\x{17f}
-
-/-- End of testinput16 --/
diff --git a/dist/testdata/testoutput17 b/dist/testdata/testoutput17
deleted file mode 100644
index 9ef6c72..0000000
--- a/dist/testdata/testoutput17
+++ /dev/null
@@ -1,560 +0,0 @@
-/-- This set of tests is for the 16- and 32-bit library's basic (non-UTF-16 
-    or -32) features that are not compatible with the 8-bit library, or which 
-    give different output in 16- or 32-bit mode. --/
-    
-< forbid 8W 
-
-/a\Cb/
-    aXb
- 0: aXb
-    a\nb
- 0: a\x0ab
-  
-/[^\x{c4}]/DZ
-------------------------------------------------------------------
-        Bra
-        [^\x{c4}]
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-No options
-No first char
-No need char
-  
-/\x{100}/I
-Capturing subpattern count = 0
-No options
-First char = \x{100}
-No need char
-
-/  (?: [\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
-/xSI
-Capturing subpattern count = 0
-Contains explicit CR or LF match
-Options: extended
-No first char
-No need char
-Subject length lower bound = 3
-Starting chars: \x09 \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 ^ _ ` 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 { | } ~ \x7f \xff 
-
-/[\h]/BZ
-------------------------------------------------------------------
-        Bra
-        [\x09 \xa0\x{1680}\x{180e}\x{2000}-\x{200a}\x{202f}\x{205f}\x{3000}]
-        Ket
-        End
-------------------------------------------------------------------
-    >\x09<
- 0: \x09
-
-/[\h]+/BZ
-------------------------------------------------------------------
-        Bra
-        [\x09 \xa0\x{1680}\x{180e}\x{2000}-\x{200a}\x{202f}\x{205f}\x{3000}]++
-        Ket
-        End
-------------------------------------------------------------------
-    >\x09\x20\xa0<
- 0: \x09 \xa0
-
-/[\v]/BZ
-------------------------------------------------------------------
-        Bra
-        [\x0a-\x0d\x85\x{2028}-\x{2029}]
-        Ket
-        End
-------------------------------------------------------------------
-
-/[^\h]/BZ
-------------------------------------------------------------------
-        Bra
-        [^\x09 \xa0\x{1680}\x{180e}\x{2000}-\x{200a}\x{202f}\x{205f}\x{3000}]
-        Ket
-        End
-------------------------------------------------------------------
-
-/\h+/SI
-Capturing subpattern count = 0
-No options
-No first char
-No need char
-Subject length lower bound = 1
-Starting chars: \x09 \x20 \xa0 \xff 
-    \x{1681}\x{200b}\x{1680}\x{2000}\x{202f}\x{3000}
- 0: \x{1680}\x{2000}\x{202f}\x{3000}
-    \x{3001}\x{2fff}\x{200a}\xa0\x{2000}
- 0: \x{200a}\xa0\x{2000}
-
-/[\h\x{dc00}]+/BZSI
-------------------------------------------------------------------
-        Bra
-        [\x09 \xa0\x{1680}\x{180e}\x{2000}-\x{200a}\x{202f}\x{205f}\x{3000}\x{dc00}]++
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-No options
-No first char
-No need char
-Subject length lower bound = 1
-Starting chars: \x09 \x20 \xa0 \xff 
-    \x{1681}\x{200b}\x{1680}\x{2000}\x{202f}\x{3000}
- 0: \x{1680}\x{2000}\x{202f}\x{3000}
-    \x{3001}\x{2fff}\x{200a}\xa0\x{2000}
- 0: \x{200a}\xa0\x{2000}
-
-/\H+/SI
-Capturing subpattern count = 0
-No options
-No first char
-No need char
-Subject length lower bound = 1
-No starting char list
-    \x{1680}\x{180e}\x{167f}\x{1681}\x{180d}\x{180f}
- 0: \x{167f}\x{1681}\x{180d}\x{180f}
-    \x{2000}\x{200a}\x{1fff}\x{200b}
- 0: \x{1fff}\x{200b}
-    \x{202f}\x{205f}\x{202e}\x{2030}\x{205e}\x{2060}
- 0: \x{202e}\x{2030}\x{205e}\x{2060}
-    \xa0\x{3000}\x9f\xa1\x{2fff}\x{3001}
- 0: \x9f\xa1\x{2fff}\x{3001}
-
-/[\H\x{d800}]+/
-    \x{1680}\x{180e}\x{167f}\x{1681}\x{180d}\x{180f}
- 0: \x{167f}\x{1681}\x{180d}\x{180f}
-    \x{2000}\x{200a}\x{1fff}\x{200b}
- 0: \x{1fff}\x{200b}
-    \x{202f}\x{205f}\x{202e}\x{2030}\x{205e}\x{2060}
- 0: \x{202e}\x{2030}\x{205e}\x{2060}
-    \xa0\x{3000}\x9f\xa1\x{2fff}\x{3001}
- 0: \x9f\xa1\x{2fff}\x{3001}
-
-/\v+/SI
-Capturing subpattern count = 0
-No options
-No first char
-No need char
-Subject length lower bound = 1
-Starting chars: \x0a \x0b \x0c \x0d \x85 \xff 
-    \x{2027}\x{2030}\x{2028}\x{2029}
- 0: \x{2028}\x{2029}
-    \x09\x0e\x84\x86\x85\x0a\x0b\x0c\x0d
- 0: \x85\x0a\x0b\x0c\x0d
-
-/[\v\x{dc00}]+/BZSI
-------------------------------------------------------------------
-        Bra
-        [\x0a-\x0d\x85\x{2028}-\x{2029}\x{dc00}]++
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-No options
-No first char
-No need char
-Subject length lower bound = 1
-Starting chars: \x0a \x0b \x0c \x0d \x85 \xff 
-    \x{2027}\x{2030}\x{2028}\x{2029}
- 0: \x{2028}\x{2029}
-    \x09\x0e\x84\x86\x85\x0a\x0b\x0c\x0d
- 0: \x85\x0a\x0b\x0c\x0d
-
-/\V+/SI
-Capturing subpattern count = 0
-No options
-No first char
-No need char
-Subject length lower bound = 1
-No starting char list
-    \x{2028}\x{2029}\x{2027}\x{2030}
- 0: \x{2027}\x{2030}
-    \x85\x0a\x0b\x0c\x0d\x09\x0e\x84\x86
- 0: \x09\x0e\x84\x86
-
-/[\V\x{d800}]+/
-    \x{2028}\x{2029}\x{2027}\x{2030}
- 0: \x{2027}\x{2030}
-    \x85\x0a\x0b\x0c\x0d\x09\x0e\x84\x86
- 0: \x09\x0e\x84\x86
-
-/\R+/SI<bsr_unicode>
-Capturing subpattern count = 0
-Options: bsr_unicode
-No first char
-No need char
-Subject length lower bound = 1
-Starting chars: \x0a \x0b \x0c \x0d \x85 \xff 
-    \x{2027}\x{2030}\x{2028}\x{2029}
- 0: \x{2028}\x{2029}
-    \x09\x0e\x84\x86\x85\x0a\x0b\x0c\x0d
- 0: \x85\x0a\x0b\x0c\x0d
-
-/\x{d800}\x{d7ff}\x{dc00}\x{dc00}\x{dcff}\x{dd00}/I
-Capturing subpattern count = 0
-No options
-First char = \x{d800}
-Need char = \x{dd00}
-    \x{d800}\x{d7ff}\x{dc00}\x{dc00}\x{dcff}\x{dd00}
- 0: \x{d800}\x{d7ff}\x{dc00}\x{dc00}\x{dcff}\x{dd00}
-
-/[^\x{80}][^\x{ff}][^\x{100}][^\x{1000}][^\x{ffff}]/BZ
-------------------------------------------------------------------
-        Bra
-        [^\x80]
-        [^\x{ff}]
-        [^\x{100}]
-        [^\x{1000}]
-        [^\x{ffff}]
-        Ket
-        End
-------------------------------------------------------------------
-
-/[^\x{80}][^\x{ff}][^\x{100}][^\x{1000}][^\x{ffff}]/BZi
-------------------------------------------------------------------
-        Bra
-     /i [^\x80]
-     /i [^\x{ff}]
-     /i [^\x{100}]
-     /i [^\x{1000}]
-     /i [^\x{ffff}]
-        Ket
-        End
-------------------------------------------------------------------
-
-/[^\x{100}]*[^\x{1000}]+[^\x{ffff}]??[^\x{8000}]{4,}[^\x{7fff}]{2,9}?[^\x{100}]{5,6}+/BZ
-------------------------------------------------------------------
-        Bra
-        [^\x{100}]*
-        [^\x{1000}]+
-        [^\x{ffff}]??
-        [^\x{8000}]{4}
-        [^\x{8000}]*
-        [^\x{7fff}]{2}
-        [^\x{7fff}]{0,7}?
-        [^\x{100}]{5}
-        [^\x{100}]?+
-        Ket
-        End
-------------------------------------------------------------------
-
-/[^\x{100}]*[^\x{1000}]+[^\x{ffff}]??[^\x{8000}]{4,}[^\x{7fff}]{2,9}?[^\x{100}]{5,6}+/BZi
-------------------------------------------------------------------
-        Bra
-     /i [^\x{100}]*
-     /i [^\x{1000}]+
-     /i [^\x{ffff}]??
-     /i [^\x{8000}]{4}
-     /i [^\x{8000}]*
-     /i [^\x{7fff}]{2}
-     /i [^\x{7fff}]{0,7}?
-     /i [^\x{100}]{5}
-     /i [^\x{100}]?+
-        Ket
-        End
-------------------------------------------------------------------
-
-/(*:0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF)XX/K
-    XX
- 0: XX
-MK: 0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
-     
-/(*:0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDE)XX/K
-    XX
- 0: XX
-MK: 0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDE
-
-/\u0100/<JS>BZ
-------------------------------------------------------------------
-        Bra
-        \x{100}
-        Ket
-        End
-------------------------------------------------------------------
-
-/[\u0100-\u0200]/<JS>BZ
-------------------------------------------------------------------
-        Bra
-        [\x{100}-\x{200}]
-        Ket
-        End
-------------------------------------------------------------------
-
-/\ud800/<JS>BZ
-------------------------------------------------------------------
-        Bra
-        \x{d800}
-        Ket
-        End
-------------------------------------------------------------------
-
-/^\x{ffff}+/i
-    \x{ffff}
- 0: \x{ffff}
-
-/^\x{ffff}?/i
-    \x{ffff}
- 0: \x{ffff}
-
-/^\x{ffff}*/i
-    \x{ffff}
- 0: \x{ffff}
-
-/^\x{ffff}{3}/i
-    \x{ffff}\x{ffff}\x{ffff}
- 0: \x{ffff}\x{ffff}\x{ffff}
-
-/^\x{ffff}{0,3}/i
-    \x{ffff}
- 0: \x{ffff}
-
-/[^\x00-a]{12,}[^b-\xff]*/BZ
-------------------------------------------------------------------
-        Bra
-        [b-\xff] (neg){12,}
-        [\x00-a] (neg)*+
-        Ket
-        End
-------------------------------------------------------------------
-
-/[^\s]*\s* [^\W]+\W+ [^\d]*?\d0 [^\d\w]{4,6}?\w*A/BZ
-------------------------------------------------------------------
-        Bra
-        [\x00-\x08\x0e-\x1f!-\xff] (neg)*
-        \s*
-         
-        [0-9A-Z_a-z]++
-        \W+
-         
-        [\x00-/:-\xff] (neg)*?
-        \d
-        0 
-        [\x00-/:-@[-^`{-\xff] (neg){4,6}?
-        \w*
-        A
-        Ket
-        End
-------------------------------------------------------------------
-
-/a*[b-\x{200}]?a#a*[b-\x{200}]?b#[a-f]*[g-\x{200}]*#[g-\x{200}]*[a-c]*#[g-\x{200}]*[a-h]*/BZ
-------------------------------------------------------------------
-        Bra
-        a*
-        [b-\xff\x{100}-\x{200}]?+
-        a#
-        a*+
-        [b-\xff\x{100}-\x{200}]?
-        b#
-        [a-f]*+
-        [g-\xff\x{100}-\x{200}]*+
-        #
-        [g-\xff\x{100}-\x{200}]*+
-        [a-c]*+
-        #
-        [g-\xff\x{100}-\x{200}]*
-        [a-h]*+
-        Ket
-        End
-------------------------------------------------------------------
-
-/^[\x{1234}\x{4321}]{2,4}?/
-    \x{1234}\x{1234}\x{1234}
- 0: \x{1234}\x{1234}
-
-/(*THEN:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA)/
-
-/-- End of testinput17 --/
diff --git a/dist/testdata/testoutput18-16 b/dist/testdata/testoutput18-16
deleted file mode 100644
index 1ef8704..0000000
--- a/dist/testdata/testoutput18-16
+++ /dev/null
@@ -1,1026 +0,0 @@
-/-- This set of tests is for UTF-16 and UTF-32 support, and is relevant only to
-    the 16- and 32-bit libraries. --/
-    
-< forbid W 
-
-/ÃÃÃxxx/8?DZSS
-**Failed: invalid UTF-8 string cannot be converted to UTF-16
-
-/abc/8
-    Ã]
-**Failed: invalid UTF-8 string cannot be used as input in UTF mode
-
-/X(\C{3})/8
-    X\x{11234}Y
- 0: X\x{11234}Y
- 1: \x{11234}Y
-    X\x{11234}YZ
- 0: X\x{11234}Y
- 1: \x{11234}Y
-
-/X(\C{4})/8
-    X\x{11234}YZ
- 0: X\x{11234}YZ
- 1: \x{11234}YZ
-    X\x{11234}YZW
- 0: X\x{11234}YZ
- 1: \x{11234}YZ
-
-/X\C*/8
-    XYZabcdce
- 0: XYZabcdce
-
-/X\C*?/8
-    XYZabcde
- 0: X
-
-/X\C{3,5}/8
-    Xabcdefg
- 0: Xabcde
-    X\x{11234}Y
- 0: X\x{11234}Y
-    X\x{11234}YZ
- 0: X\x{11234}YZ
-    X\x{11234}\x{512}
- 0: X\x{11234}\x{512}
-    X\x{11234}\x{512}YZ
- 0: X\x{11234}\x{512}YZ
-    X\x{11234}\x{512}\x{11234}Z
- 0: X\x{11234}\x{512}\x{11234}
-
-/X\C{3,5}?/8
-    Xabcdefg
- 0: Xabc
-    X\x{11234}Y
- 0: X\x{11234}Y
-    X\x{11234}YZ
- 0: X\x{11234}Y
-    X\x{11234}\x{512}YZ
- 0: X\x{11234}\x{512}
-    *** Failers
-No match
-    X\x{11234}
-No match
-
-/a\Cb/8
-    aXb
- 0: aXb
-    a\nb
- 0: a\x{0a}b
-
-/a\C\Cb/8
-    a\x{12257}b
- 0: a\x{12257}b
-    a\x{12257}\x{11234}b
-No match
-    ** Failers
-No match
-    a\x{100}b
-No match
-
-/ab\Cde/8
-    abXde
- 0: abXde
-
-/-- Check maximum character size --/
-
-/\x{ffff}/8DZ
-------------------------------------------------------------------
-        Bra
-        \x{ffff}
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = \x{ffff}
-No need char
-
-/\x{10000}/8DZ
-------------------------------------------------------------------
-        Bra
-        \x{10000}
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = \x{d800}
-Need char = \x{dc00}
-
-/\x{100}/8DZ
-------------------------------------------------------------------
-        Bra
-        \x{100}
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = \x{100}
-No need char
-
-/\x{1000}/8DZ
-------------------------------------------------------------------
-        Bra
-        \x{1000}
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = \x{1000}
-No need char
-
-/\x{10000}/8DZ
-------------------------------------------------------------------
-        Bra
-        \x{10000}
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = \x{d800}
-Need char = \x{dc00}
-
-/\x{100000}/8DZ
-------------------------------------------------------------------
-        Bra
-        \x{100000}
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = \x{dbc0}
-Need char = \x{dc00}
-
-/\x{10ffff}/8DZ
-------------------------------------------------------------------
-        Bra
-        \x{10ffff}
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = \x{dbff}
-Need char = \x{dfff}
-
-/[\x{ff}]/8DZ
-------------------------------------------------------------------
-        Bra
-        \x{ff}
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = \x{ff}
-No need char
-
-/[\x{100}]/8DZ
-------------------------------------------------------------------
-        Bra
-        \x{100}
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = \x{100}
-No need char
-
-/\x80/8DZ
-------------------------------------------------------------------
-        Bra
-        \x80
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = \x{80}
-No need char
-
-/\xff/8DZ
-------------------------------------------------------------------
-        Bra
-        \x{ff}
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = \x{ff}
-No need char
-
-/\x{D55c}\x{ad6d}\x{C5B4}/DZ8
-------------------------------------------------------------------
-        Bra
-        \x{d55c}\x{ad6d}\x{c5b4}
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = \x{d55c}
-Need char = \x{c5b4}
-    \x{D55c}\x{ad6d}\x{C5B4}
- 0: \x{d55c}\x{ad6d}\x{c5b4}
-
-/\x{65e5}\x{672c}\x{8a9e}/DZ8
-------------------------------------------------------------------
-        Bra
-        \x{65e5}\x{672c}\x{8a9e}
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = \x{65e5}
-Need char = \x{8a9e}
-    \x{65e5}\x{672c}\x{8a9e}
- 0: \x{65e5}\x{672c}\x{8a9e}
-
-/\x{80}/DZ8
-------------------------------------------------------------------
-        Bra
-        \x80
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = \x{80}
-No need char
-
-/\x{084}/DZ8
-------------------------------------------------------------------
-        Bra
-        \x{84}
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = \x{84}
-No need char
-
-/\x{104}/DZ8
-------------------------------------------------------------------
-        Bra
-        \x{104}
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = \x{104}
-No need char
-
-/\x{861}/DZ8
-------------------------------------------------------------------
-        Bra
-        \x{861}
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = \x{861}
-No need char
-
-/\x{212ab}/DZ8
-------------------------------------------------------------------
-        Bra
-        \x{212ab}
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = \x{d844}
-Need char = \x{deab}
-
-/-- This one is here not because it's different to Perl, but because the way
-the captured single-byte is displayed. (In Perl it becomes a character, and you
-can't tell the difference.) --/
-
-/X(\C)(.*)/8
-    X\x{1234}
- 0: X\x{1234}
- 1: \x{1234}
- 2: 
-    X\nabc
- 0: X\x{0a}abc
- 1: \x{0a}
- 2: abc
-
-/-- This one is here because Perl gives out a grumbly error message (quite
-correctly, but that messes up comparisons). --/
-
-/a\Cb/8
-    *** Failers
-No match
-    a\x{100}b
- 0: a\x{100}b
-
-/[^ab\xC0-\xF0]/8SDZ
-------------------------------------------------------------------
-        Bra
-        [\x00-`c-\xbf\xf1-\xff] (neg)
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-No first char
-No need char
-Subject length lower bound = 1
-Starting chars: \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 \xf1 \xf2 \xf3 \xf4 \xf5 \xf6 \xf7 \xf8 \xf9 \xfa \xfb 
-  \xfc \xfd \xfe \xff 
-    \x{f1}
- 0: \x{f1}
-    \x{bf}
- 0: \x{bf}
-    \x{100}
- 0: \x{100}
-    \x{1000}
- 0: \x{1000}
-    *** Failers
- 0: *
-    \x{c0}
-No match
-    \x{f0}
-No match
-
-/Ā{3,4}/8SDZ
-------------------------------------------------------------------
-        Bra
-        \x{100}{3}
-        \x{100}?+
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = \x{100}
-Need char = \x{100}
-Subject length lower bound = 3
-No starting char list
-  \x{100}\x{100}\x{100}\x{100\x{100}
- 0: \x{100}\x{100}\x{100}
-
-/(\x{100}+|x)/8SDZ
-------------------------------------------------------------------
-        Bra
-        CBra 1
-        \x{100}++
-        Alt
-        x
-        Ket
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 1
-Options: utf
-No first char
-No need char
-Subject length lower bound = 1
-Starting chars: x \xff 
-
-/(\x{100}*a|x)/8SDZ
-------------------------------------------------------------------
-        Bra
-        CBra 1
-        \x{100}*+
-        a
-        Alt
-        x
-        Ket
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 1
-Options: utf
-No first char
-No need char
-Subject length lower bound = 1
-Starting chars: a x \xff 
-
-/(\x{100}{0,2}a|x)/8SDZ
-------------------------------------------------------------------
-        Bra
-        CBra 1
-        \x{100}{0,2}+
-        a
-        Alt
-        x
-        Ket
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 1
-Options: utf
-No first char
-No need char
-Subject length lower bound = 1
-Starting chars: a x \xff 
-
-/(\x{100}{1,2}a|x)/8SDZ
-------------------------------------------------------------------
-        Bra
-        CBra 1
-        \x{100}
-        \x{100}{0,1}+
-        a
-        Alt
-        x
-        Ket
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 1
-Options: utf
-No first char
-No need char
-Subject length lower bound = 1
-Starting chars: x \xff 
-
-/\x{100}/8DZ
-------------------------------------------------------------------
-        Bra
-        \x{100}
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = \x{100}
-No need char
-
-/a\x{100}\x{101}*/8DZ
-------------------------------------------------------------------
-        Bra
-        a\x{100}
-        \x{101}*+
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = 'a'
-Need char = \x{100}
-
-/a\x{100}\x{101}+/8DZ
-------------------------------------------------------------------
-        Bra
-        a\x{100}
-        \x{101}++
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = 'a'
-Need char = \x{101}
-
-/[^\x{c4}]/DZ
-------------------------------------------------------------------
-        Bra
-        [^\x{c4}]
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-No options
-No first char
-No need char
-
-/[\x{100}]/8DZ
-------------------------------------------------------------------
-        Bra
-        \x{100}
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = \x{100}
-No need char
-    \x{100}
- 0: \x{100}
-    Z\x{100}
- 0: \x{100}
-    \x{100}Z
- 0: \x{100}
-    *** Failers
-No match
-
-/[\xff]/DZ8
-------------------------------------------------------------------
-        Bra
-        \x{ff}
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = \x{ff}
-No need char
-    >\x{ff}<
- 0: \x{ff}
-
-/[^\xff]/8DZ
-------------------------------------------------------------------
-        Bra
-        [^\x{ff}]
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-No first char
-No need char
-
-/\x{100}abc(xyz(?1))/8DZ
-------------------------------------------------------------------
-        Bra
-        \x{100}abc
-        CBra 1
-        xyz
-        Recurse
-        Ket
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 1
-Options: utf
-First char = \x{100}
-Need char = 'z'
-
-/\777/8I
-Capturing subpattern count = 0
-Options: utf
-First char = \x{1ff}
-No need char
-  \x{1ff}
- 0: \x{1ff}
-  \777
- 0: \x{1ff}
-
-/\x{100}+\x{200}/8DZ
-------------------------------------------------------------------
-        Bra
-        \x{100}++
-        \x{200}
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = \x{100}
-Need char = \x{200}
-
-/\x{100}+X/8DZ
-------------------------------------------------------------------
-        Bra
-        \x{100}++
-        X
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = \x{100}
-Need char = 'X'
-
-/^[\QĀ\E-\QŐ\E/BZ8
-Failed: missing terminating ] for character class at offset 13
-
-/X/8
-    \x{d800}
-Error -10 (bad UTF-16 string) offset=0 reason=1
-    \x{d800}\?
-No match
-    \x{da00}
-Error -10 (bad UTF-16 string) offset=0 reason=1
-    \x{da00}\?
-No match
-    \x{dc00}
-Error -10 (bad UTF-16 string) offset=0 reason=3
-    \x{dc00}\?
-No match
-    \x{de00}
-Error -10 (bad UTF-16 string) offset=0 reason=3
-    \x{de00}\?
-No match
-    \x{dfff}
-Error -10 (bad UTF-16 string) offset=0 reason=3
-    \x{dfff}\?
-No match
-    \x{110000}
-** Failed: character \x{110000} is greater than 0x10ffff and so cannot be converted to UTF-16
-    \x{d800}\x{1234}
-Error -10 (bad UTF-16 string) offset=1 reason=2
-
-/(*UTF16)\x{11234}/
-  abcd\x{11234}pqr
- 0: \x{11234}
-
-/(*UTF)\x{11234}/I
-Capturing subpattern count = 0
-Options: utf
-First char = \x{d804}
-Need char = \x{de34}
-  abcd\x{11234}pqr
- 0: \x{11234}
-
-/(*UTF-32)\x{11234}/
-Failed: (*VERB) not recognized or malformed at offset 5
-
-/(*CRLF)(*UTF16)(*BSR_UNICODE)a\Rb/I
-Capturing subpattern count = 0
-Options: bsr_unicode utf
-Forced newline sequence: CRLF
-First char = 'a'
-Need char = 'b'
-
-/(*CRLF)(*UTF32)(*BSR_UNICODE)a\Rb/I
-Failed: (*VERB) not recognized or malformed at offset 12
-
-/\h/SI8
-Capturing subpattern count = 0
-Options: utf
-No first char
-No need char
-Subject length lower bound = 1
-Starting chars: \x09 \x20 \xa0 \xff 
-    ABC\x{09}
- 0: \x{09}
-    ABC\x{20}
- 0:  
-    ABC\x{a0}
- 0: \x{a0}
-    ABC\x{1680}
- 0: \x{1680}
-    ABC\x{180e}
- 0: \x{180e}
-    ABC\x{2000}
- 0: \x{2000}
-    ABC\x{202f}
- 0: \x{202f}
-    ABC\x{205f}
- 0: \x{205f}
-    ABC\x{3000}
- 0: \x{3000}
-
-/\v/SI8
-Capturing subpattern count = 0
-Options: utf
-No first char
-No need char
-Subject length lower bound = 1
-Starting chars: \x0a \x0b \x0c \x0d \x85 \xff 
-    ABC\x{0a}
- 0: \x{0a}
-    ABC\x{0b}
- 0: \x{0b}
-    ABC\x{0c}
- 0: \x{0c}
-    ABC\x{0d}
- 0: \x{0d}
-    ABC\x{85}
- 0: \x{85}
-    ABC\x{2028}
- 0: \x{2028}
-
-/\h*A/SI8
-Capturing subpattern count = 0
-Options: utf
-No first char
-Need char = 'A'
-Subject length lower bound = 1
-Starting chars: \x09 \x20 A \xa0 \xff 
-    CDBABC
- 0: A
-    \x{2000}ABC 
- 0: \x{2000}A
-
-/\R*A/SI8<bsr_unicode>
-Capturing subpattern count = 0
-Options: bsr_unicode utf
-No first char
-Need char = 'A'
-Subject length lower bound = 1
-Starting chars: \x0a \x0b \x0c \x0d A \x85 \xff 
-    CDBABC
- 0: A
-    \x{2028}A  
- 0: \x{2028}A
-
-/\v+A/SI8
-Capturing subpattern count = 0
-Options: utf
-No first char
-Need char = 'A'
-Subject length lower bound = 2
-Starting chars: \x0a \x0b \x0c \x0d \x85 \xff 
-
-/\s?xxx\s/8SI
-Capturing subpattern count = 0
-Options: utf
-No first char
-Need char = 'x'
-Subject length lower bound = 4
-Starting chars: \x09 \x0a \x0b \x0c \x0d \x20 x 
-
-/\sxxx\s/I8ST1
-Capturing subpattern count = 0
-Options: utf
-No first char
-Need char = 'x'
-Subject length lower bound = 5
-Starting chars: \x09 \x0a \x0b \x0c \x0d \x20 \x85 \xa0 
-    AB\x{85}xxx\x{a0}XYZ
- 0: \x{85}xxx\x{a0}
-    AB\x{a0}xxx\x{85}XYZ
- 0: \x{a0}xxx\x{85}
-
-/\S \S/I8ST1
-Capturing subpattern count = 0
-Options: utf
-No first char
-Need char = ' '
-Subject length lower bound = 3
-Starting chars: \x00 \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x0e \x0f 
-  \x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17 \x18 \x19 \x1a \x1b \x1c \x1d \x1e 
-  \x1f ! " # $ % & ' ( ) * + , - . / 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 { | } ~ \x7f \x80 \x81 \x82 \x83 \x84 
-  \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 \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 
-    \x{a2} \x{84}
- 0: \x{a2} \x{84}
-    A Z
- 0: A Z
-
-/a+/8
-    a\x{123}aa\>1
- 0: aa
-    a\x{123}aa\>2
- 0: aa
-    a\x{123}aa\>3
- 0: a
-    a\x{123}aa\>4
-No match
-    a\x{123}aa\>5
-Error -24 (bad offset value)
-    a\x{123}aa\>6
-Error -24 (bad offset value)
-
-/\x{1234}+/iS8I
-Capturing subpattern count = 0
-Options: caseless utf
-First char = \x{1234}
-No need char
-Subject length lower bound = 1
-No starting char list
-
-/\x{1234}+?/iS8I
-Capturing subpattern count = 0
-Options: caseless utf
-First char = \x{1234}
-No need char
-Subject length lower bound = 1
-No starting char list
-
-/\x{1234}++/iS8I
-Capturing subpattern count = 0
-Options: caseless utf
-First char = \x{1234}
-No need char
-Subject length lower bound = 1
-No starting char list
-
-/\x{1234}{2}/iS8I
-Capturing subpattern count = 0
-Options: caseless utf
-First char = \x{1234}
-Need char = \x{1234}
-Subject length lower bound = 2
-No starting char list
-
-/[^\x{c4}]/8DZ
-------------------------------------------------------------------
-        Bra
-        [^\x{c4}]
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-No first char
-No need char
-
-/X+\x{200}/8DZ
-------------------------------------------------------------------
-        Bra
-        X++
-        \x{200}
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = 'X'
-Need char = \x{200}
-
-/\R/SI8
-Capturing subpattern count = 0
-Options: utf
-No first char
-No need char
-Subject length lower bound = 1
-Starting chars: \x0a \x0b \x0c \x0d \x85 \xff 
-
-/-- Check bad offset --/
-
-/a/8
-    \x{10000}\>1
-Error -11 (bad UTF-16 offset)
-    \x{10000}ab\>1
-Error -11 (bad UTF-16 offset)
-    \x{10000}ab\>2
- 0: a
-    \x{10000}ab\>3
-No match
-    \x{10000}ab\>4
-No match
-    \x{10000}ab\>5
-Error -24 (bad offset value)
-
-/í¼€/8
-Failed: invalid UTF-16 string at offset 0
-
-/\w+\x{C4}/8BZ
-------------------------------------------------------------------
-        Bra
-        \w++
-        \x{c4}
-        Ket
-        End
-------------------------------------------------------------------
-    a\x{C4}\x{C4}
- 0: a\x{c4}
-
-/\w+\x{C4}/8BZT1
-------------------------------------------------------------------
-        Bra
-        \w+
-        \x{c4}
-        Ket
-        End
-------------------------------------------------------------------
-    a\x{C4}\x{C4}
- 0: a\x{c4}\x{c4}
-    
-/\W+\x{C4}/8BZ
-------------------------------------------------------------------
-        Bra
-        \W+
-        \x{c4}
-        Ket
-        End
-------------------------------------------------------------------
-    !\x{C4}
- 0: !\x{c4}
- 
-/\W+\x{C4}/8BZT1
-------------------------------------------------------------------
-        Bra
-        \W++
-        \x{c4}
-        Ket
-        End
-------------------------------------------------------------------
-    !\x{C4}
- 0: !\x{c4}
-
-/\W+\x{A1}/8BZ
-------------------------------------------------------------------
-        Bra
-        \W+
-        \x{a1}
-        Ket
-        End
-------------------------------------------------------------------
-    !\x{A1}
- 0: !\x{a1}
- 
-/\W+\x{A1}/8BZT1
-------------------------------------------------------------------
-        Bra
-        \W+
-        \x{a1}
-        Ket
-        End
-------------------------------------------------------------------
-    !\x{A1}
- 0: !\x{a1}
-
-/X\s+\x{A0}/8BZ
-------------------------------------------------------------------
-        Bra
-        X
-        \s++
-        \x{a0}
-        Ket
-        End
-------------------------------------------------------------------
-    X\x20\x{A0}\x{A0}
- 0: X \x{a0}
-
-/X\s+\x{A0}/8BZT1
-------------------------------------------------------------------
-        Bra
-        X
-        \s+
-        \x{a0}
-        Ket
-        End
-------------------------------------------------------------------
-    X\x20\x{A0}\x{A0}
- 0: X \x{a0}\x{a0}
-
-/\S+\x{A0}/8BZ
-------------------------------------------------------------------
-        Bra
-        \S+
-        \x{a0}
-        Ket
-        End
-------------------------------------------------------------------
-    X\x{A0}\x{A0}
- 0: X\x{a0}\x{a0}
-
-/\S+\x{A0}/8BZT1
-------------------------------------------------------------------
-        Bra
-        \S++
-        \x{a0}
-        Ket
-        End
-------------------------------------------------------------------
-    X\x{A0}\x{A0}
- 0: X\x{a0}
-
-/\x{a0}+\s!/8BZ
-------------------------------------------------------------------
-        Bra
-        \x{a0}++
-        \s
-        !
-        Ket
-        End
-------------------------------------------------------------------
-    \x{a0}\x20!
- 0: \x{a0} !
-
-/\x{a0}+\s!/8BZT1
-------------------------------------------------------------------
-        Bra
-        \x{a0}+
-        \s
-        !
-        Ket
-        End
-------------------------------------------------------------------
-    \x{a0}\x20!
- 0: \x{a0} !
-
-/(*UTF)abc/9
-Failed: setting UTF is disabled by the application at offset 0
-
-/abc/89
-Failed: setting UTF is disabled by the application at offset 0
-
-/-- End of testinput18 --/
diff --git a/dist/testdata/testoutput18-32 b/dist/testdata/testoutput18-32
deleted file mode 100644
index 622ba64..0000000
--- a/dist/testdata/testoutput18-32
+++ /dev/null
@@ -1,1023 +0,0 @@
-/-- This set of tests is for UTF-16 and UTF-32 support, and is relevant only to
-    the 16- and 32-bit libraries. --/
-    
-< forbid W 
-
-/ÃÃÃxxx/8?DZSS
-**Failed: invalid UTF-8 string cannot be converted to UTF-32
-
-/abc/8
-    Ã]
-**Failed: invalid UTF-8 string cannot be used as input in UTF mode
-
-/X(\C{3})/8
-    X\x{11234}Y
-No match
-    X\x{11234}YZ
- 0: X\x{11234}YZ
- 1: \x{11234}YZ
-
-/X(\C{4})/8
-    X\x{11234}YZ
-No match
-    X\x{11234}YZW
- 0: X\x{11234}YZW
- 1: \x{11234}YZW
-
-/X\C*/8
-    XYZabcdce
- 0: XYZabcdce
-
-/X\C*?/8
-    XYZabcde
- 0: X
-
-/X\C{3,5}/8
-    Xabcdefg
- 0: Xabcde
-    X\x{11234}Y
-No match
-    X\x{11234}YZ
- 0: X\x{11234}YZ
-    X\x{11234}\x{512}
-No match
-    X\x{11234}\x{512}YZ
- 0: X\x{11234}\x{512}YZ
-    X\x{11234}\x{512}\x{11234}Z
- 0: X\x{11234}\x{512}\x{11234}Z
-
-/X\C{3,5}?/8
-    Xabcdefg
- 0: Xabc
-    X\x{11234}Y
-No match
-    X\x{11234}YZ
- 0: X\x{11234}YZ
-    X\x{11234}\x{512}YZ
- 0: X\x{11234}\x{512}Y
-    *** Failers
-No match
-    X\x{11234}
-No match
-
-/a\Cb/8
-    aXb
- 0: aXb
-    a\nb
- 0: a\x{0a}b
-
-/a\C\Cb/8
-    a\x{12257}b
-No match
-    a\x{12257}\x{11234}b
- 0: a\x{12257}\x{11234}b
-    ** Failers
-No match
-    a\x{100}b
-No match
-
-/ab\Cde/8
-    abXde
- 0: abXde
-
-/-- Check maximum character size --/
-
-/\x{ffff}/8DZ
-------------------------------------------------------------------
-        Bra
-        \x{ffff}
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = \x{ffff}
-No need char
-
-/\x{10000}/8DZ
-------------------------------------------------------------------
-        Bra
-        \x{10000}
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = \x{10000}
-No need char
-
-/\x{100}/8DZ
-------------------------------------------------------------------
-        Bra
-        \x{100}
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = \x{100}
-No need char
-
-/\x{1000}/8DZ
-------------------------------------------------------------------
-        Bra
-        \x{1000}
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = \x{1000}
-No need char
-
-/\x{10000}/8DZ
-------------------------------------------------------------------
-        Bra
-        \x{10000}
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = \x{10000}
-No need char
-
-/\x{100000}/8DZ
-------------------------------------------------------------------
-        Bra
-        \x{100000}
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = \x{100000}
-No need char
-
-/\x{10ffff}/8DZ
-------------------------------------------------------------------
-        Bra
-        \x{10ffff}
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = \x{10ffff}
-No need char
-
-/[\x{ff}]/8DZ
-------------------------------------------------------------------
-        Bra
-        \x{ff}
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = \x{ff}
-No need char
-
-/[\x{100}]/8DZ
-------------------------------------------------------------------
-        Bra
-        \x{100}
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = \x{100}
-No need char
-
-/\x80/8DZ
-------------------------------------------------------------------
-        Bra
-        \x80
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = \x{80}
-No need char
-
-/\xff/8DZ
-------------------------------------------------------------------
-        Bra
-        \x{ff}
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = \x{ff}
-No need char
-
-/\x{D55c}\x{ad6d}\x{C5B4}/DZ8
-------------------------------------------------------------------
-        Bra
-        \x{d55c}\x{ad6d}\x{c5b4}
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = \x{d55c}
-Need char = \x{c5b4}
-    \x{D55c}\x{ad6d}\x{C5B4}
- 0: \x{d55c}\x{ad6d}\x{c5b4}
-
-/\x{65e5}\x{672c}\x{8a9e}/DZ8
-------------------------------------------------------------------
-        Bra
-        \x{65e5}\x{672c}\x{8a9e}
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = \x{65e5}
-Need char = \x{8a9e}
-    \x{65e5}\x{672c}\x{8a9e}
- 0: \x{65e5}\x{672c}\x{8a9e}
-
-/\x{80}/DZ8
-------------------------------------------------------------------
-        Bra
-        \x80
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = \x{80}
-No need char
-
-/\x{084}/DZ8
-------------------------------------------------------------------
-        Bra
-        \x{84}
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = \x{84}
-No need char
-
-/\x{104}/DZ8
-------------------------------------------------------------------
-        Bra
-        \x{104}
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = \x{104}
-No need char
-
-/\x{861}/DZ8
-------------------------------------------------------------------
-        Bra
-        \x{861}
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = \x{861}
-No need char
-
-/\x{212ab}/DZ8
-------------------------------------------------------------------
-        Bra
-        \x{212ab}
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = \x{212ab}
-No need char
-
-/-- This one is here not because it's different to Perl, but because the way
-the captured single-byte is displayed. (In Perl it becomes a character, and you
-can't tell the difference.) --/
-
-/X(\C)(.*)/8
-    X\x{1234}
- 0: X\x{1234}
- 1: \x{1234}
- 2: 
-    X\nabc
- 0: X\x{0a}abc
- 1: \x{0a}
- 2: abc
-
-/-- This one is here because Perl gives out a grumbly error message (quite
-correctly, but that messes up comparisons). --/
-
-/a\Cb/8
-    *** Failers
-No match
-    a\x{100}b
- 0: a\x{100}b
-
-/[^ab\xC0-\xF0]/8SDZ
-------------------------------------------------------------------
-        Bra
-        [\x00-`c-\xbf\xf1-\xff] (neg)
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-No first char
-No need char
-Subject length lower bound = 1
-Starting chars: \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 \xf1 \xf2 \xf3 \xf4 \xf5 \xf6 \xf7 \xf8 \xf9 \xfa \xfb 
-  \xfc \xfd \xfe \xff 
-    \x{f1}
- 0: \x{f1}
-    \x{bf}
- 0: \x{bf}
-    \x{100}
- 0: \x{100}
-    \x{1000}
- 0: \x{1000}
-    *** Failers
- 0: *
-    \x{c0}
-No match
-    \x{f0}
-No match
-
-/Ā{3,4}/8SDZ
-------------------------------------------------------------------
-        Bra
-        \x{100}{3}
-        \x{100}?+
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = \x{100}
-Need char = \x{100}
-Subject length lower bound = 3
-No starting char list
-  \x{100}\x{100}\x{100}\x{100\x{100}
- 0: \x{100}\x{100}\x{100}
-
-/(\x{100}+|x)/8SDZ
-------------------------------------------------------------------
-        Bra
-        CBra 1
-        \x{100}++
-        Alt
-        x
-        Ket
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 1
-Options: utf
-No first char
-No need char
-Subject length lower bound = 1
-Starting chars: x \xff 
-
-/(\x{100}*a|x)/8SDZ
-------------------------------------------------------------------
-        Bra
-        CBra 1
-        \x{100}*+
-        a
-        Alt
-        x
-        Ket
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 1
-Options: utf
-No first char
-No need char
-Subject length lower bound = 1
-Starting chars: a x \xff 
-
-/(\x{100}{0,2}a|x)/8SDZ
-------------------------------------------------------------------
-        Bra
-        CBra 1
-        \x{100}{0,2}+
-        a
-        Alt
-        x
-        Ket
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 1
-Options: utf
-No first char
-No need char
-Subject length lower bound = 1
-Starting chars: a x \xff 
-
-/(\x{100}{1,2}a|x)/8SDZ
-------------------------------------------------------------------
-        Bra
-        CBra 1
-        \x{100}
-        \x{100}{0,1}+
-        a
-        Alt
-        x
-        Ket
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 1
-Options: utf
-No first char
-No need char
-Subject length lower bound = 1
-Starting chars: x \xff 
-
-/\x{100}/8DZ
-------------------------------------------------------------------
-        Bra
-        \x{100}
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = \x{100}
-No need char
-
-/a\x{100}\x{101}*/8DZ
-------------------------------------------------------------------
-        Bra
-        a\x{100}
-        \x{101}*+
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = 'a'
-Need char = \x{100}
-
-/a\x{100}\x{101}+/8DZ
-------------------------------------------------------------------
-        Bra
-        a\x{100}
-        \x{101}++
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = 'a'
-Need char = \x{101}
-
-/[^\x{c4}]/DZ
-------------------------------------------------------------------
-        Bra
-        [^\x{c4}]
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-No options
-No first char
-No need char
-
-/[\x{100}]/8DZ
-------------------------------------------------------------------
-        Bra
-        \x{100}
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = \x{100}
-No need char
-    \x{100}
- 0: \x{100}
-    Z\x{100}
- 0: \x{100}
-    \x{100}Z
- 0: \x{100}
-    *** Failers
-No match
-
-/[\xff]/DZ8
-------------------------------------------------------------------
-        Bra
-        \x{ff}
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = \x{ff}
-No need char
-    >\x{ff}<
- 0: \x{ff}
-
-/[^\xff]/8DZ
-------------------------------------------------------------------
-        Bra
-        [^\x{ff}]
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-No first char
-No need char
-
-/\x{100}abc(xyz(?1))/8DZ
-------------------------------------------------------------------
-        Bra
-        \x{100}abc
-        CBra 1
-        xyz
-        Recurse
-        Ket
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 1
-Options: utf
-First char = \x{100}
-Need char = 'z'
-
-/\777/8I
-Capturing subpattern count = 0
-Options: utf
-First char = \x{1ff}
-No need char
-  \x{1ff}
- 0: \x{1ff}
-  \777
- 0: \x{1ff}
-
-/\x{100}+\x{200}/8DZ
-------------------------------------------------------------------
-        Bra
-        \x{100}++
-        \x{200}
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = \x{100}
-Need char = \x{200}
-
-/\x{100}+X/8DZ
-------------------------------------------------------------------
-        Bra
-        \x{100}++
-        X
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = \x{100}
-Need char = 'X'
-
-/^[\QĀ\E-\QŐ\E/BZ8
-Failed: missing terminating ] for character class at offset 13
-
-/X/8
-    \x{d800}
-Error -10 (bad UTF-32 string) offset=0 reason=1
-    \x{d800}\?
-No match
-    \x{da00}
-Error -10 (bad UTF-32 string) offset=0 reason=1
-    \x{da00}\?
-No match
-    \x{dc00}
-Error -10 (bad UTF-32 string) offset=0 reason=1
-    \x{dc00}\?
-No match
-    \x{de00}
-Error -10 (bad UTF-32 string) offset=0 reason=1
-    \x{de00}\?
-No match
-    \x{dfff}
-Error -10 (bad UTF-32 string) offset=0 reason=1
-    \x{dfff}\?
-No match
-    \x{110000}
-Error -10 (bad UTF-32 string) offset=0 reason=3
-    \x{d800}\x{1234}
-Error -10 (bad UTF-32 string) offset=0 reason=1
-
-/(*UTF16)\x{11234}/
-Failed: (*VERB) not recognized or malformed at offset 5
-
-/(*UTF)\x{11234}/I
-Capturing subpattern count = 0
-Options: utf
-First char = \x{11234}
-No need char
-  abcd\x{11234}pqr
- 0: \x{11234}
-
-/(*UTF-32)\x{11234}/
-Failed: (*VERB) not recognized or malformed at offset 5
-
-/(*CRLF)(*UTF16)(*BSR_UNICODE)a\Rb/I
-Failed: (*VERB) not recognized or malformed at offset 12
-
-/(*CRLF)(*UTF32)(*BSR_UNICODE)a\Rb/I
-Capturing subpattern count = 0
-Options: bsr_unicode utf
-Forced newline sequence: CRLF
-First char = 'a'
-Need char = 'b'
-
-/\h/SI8
-Capturing subpattern count = 0
-Options: utf
-No first char
-No need char
-Subject length lower bound = 1
-Starting chars: \x09 \x20 \xa0 \xff 
-    ABC\x{09}
- 0: \x{09}
-    ABC\x{20}
- 0:  
-    ABC\x{a0}
- 0: \x{a0}
-    ABC\x{1680}
- 0: \x{1680}
-    ABC\x{180e}
- 0: \x{180e}
-    ABC\x{2000}
- 0: \x{2000}
-    ABC\x{202f}
- 0: \x{202f}
-    ABC\x{205f}
- 0: \x{205f}
-    ABC\x{3000}
- 0: \x{3000}
-
-/\v/SI8
-Capturing subpattern count = 0
-Options: utf
-No first char
-No need char
-Subject length lower bound = 1
-Starting chars: \x0a \x0b \x0c \x0d \x85 \xff 
-    ABC\x{0a}
- 0: \x{0a}
-    ABC\x{0b}
- 0: \x{0b}
-    ABC\x{0c}
- 0: \x{0c}
-    ABC\x{0d}
- 0: \x{0d}
-    ABC\x{85}
- 0: \x{85}
-    ABC\x{2028}
- 0: \x{2028}
-
-/\h*A/SI8
-Capturing subpattern count = 0
-Options: utf
-No first char
-Need char = 'A'
-Subject length lower bound = 1
-Starting chars: \x09 \x20 A \xa0 \xff 
-    CDBABC
- 0: A
-    \x{2000}ABC 
- 0: \x{2000}A
-
-/\R*A/SI8<bsr_unicode>
-Capturing subpattern count = 0
-Options: bsr_unicode utf
-No first char
-Need char = 'A'
-Subject length lower bound = 1
-Starting chars: \x0a \x0b \x0c \x0d A \x85 \xff 
-    CDBABC
- 0: A
-    \x{2028}A  
- 0: \x{2028}A
-
-/\v+A/SI8
-Capturing subpattern count = 0
-Options: utf
-No first char
-Need char = 'A'
-Subject length lower bound = 2
-Starting chars: \x0a \x0b \x0c \x0d \x85 \xff 
-
-/\s?xxx\s/8SI
-Capturing subpattern count = 0
-Options: utf
-No first char
-Need char = 'x'
-Subject length lower bound = 4
-Starting chars: \x09 \x0a \x0b \x0c \x0d \x20 x 
-
-/\sxxx\s/I8ST1
-Capturing subpattern count = 0
-Options: utf
-No first char
-Need char = 'x'
-Subject length lower bound = 5
-Starting chars: \x09 \x0a \x0b \x0c \x0d \x20 \x85 \xa0 
-    AB\x{85}xxx\x{a0}XYZ
- 0: \x{85}xxx\x{a0}
-    AB\x{a0}xxx\x{85}XYZ
- 0: \x{a0}xxx\x{85}
-
-/\S \S/I8ST1
-Capturing subpattern count = 0
-Options: utf
-No first char
-Need char = ' '
-Subject length lower bound = 3
-Starting chars: \x00 \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x0e \x0f 
-  \x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17 \x18 \x19 \x1a \x1b \x1c \x1d \x1e 
-  \x1f ! " # $ % & ' ( ) * + , - . / 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 { | } ~ \x7f \x80 \x81 \x82 \x83 \x84 
-  \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 \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 
-    \x{a2} \x{84}
- 0: \x{a2} \x{84}
-    A Z
- 0: A Z
-
-/a+/8
-    a\x{123}aa\>1
- 0: aa
-    a\x{123}aa\>2
- 0: aa
-    a\x{123}aa\>3
- 0: a
-    a\x{123}aa\>4
-No match
-    a\x{123}aa\>5
-Error -24 (bad offset value)
-    a\x{123}aa\>6
-Error -24 (bad offset value)
-
-/\x{1234}+/iS8I
-Capturing subpattern count = 0
-Options: caseless utf
-First char = \x{1234}
-No need char
-Subject length lower bound = 1
-No starting char list
-
-/\x{1234}+?/iS8I
-Capturing subpattern count = 0
-Options: caseless utf
-First char = \x{1234}
-No need char
-Subject length lower bound = 1
-No starting char list
-
-/\x{1234}++/iS8I
-Capturing subpattern count = 0
-Options: caseless utf
-First char = \x{1234}
-No need char
-Subject length lower bound = 1
-No starting char list
-
-/\x{1234}{2}/iS8I
-Capturing subpattern count = 0
-Options: caseless utf
-First char = \x{1234}
-Need char = \x{1234}
-Subject length lower bound = 2
-No starting char list
-
-/[^\x{c4}]/8DZ
-------------------------------------------------------------------
-        Bra
-        [^\x{c4}]
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-No first char
-No need char
-
-/X+\x{200}/8DZ
-------------------------------------------------------------------
-        Bra
-        X++
-        \x{200}
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = 'X'
-Need char = \x{200}
-
-/\R/SI8
-Capturing subpattern count = 0
-Options: utf
-No first char
-No need char
-Subject length lower bound = 1
-Starting chars: \x0a \x0b \x0c \x0d \x85 \xff 
-
-/-- Check bad offset --/
-
-/a/8
-    \x{10000}\>1
-No match
-    \x{10000}ab\>1
- 0: a
-    \x{10000}ab\>2
-No match
-    \x{10000}ab\>3
-No match
-    \x{10000}ab\>4
-Error -24 (bad offset value)
-    \x{10000}ab\>5
-Error -24 (bad offset value)
-
-/í¼€/8
-**Failed: character value is ill-formed UTF-32
-
-/\w+\x{C4}/8BZ
-------------------------------------------------------------------
-        Bra
-        \w++
-        \x{c4}
-        Ket
-        End
-------------------------------------------------------------------
-    a\x{C4}\x{C4}
- 0: a\x{c4}
-
-/\w+\x{C4}/8BZT1
-------------------------------------------------------------------
-        Bra
-        \w+
-        \x{c4}
-        Ket
-        End
-------------------------------------------------------------------
-    a\x{C4}\x{C4}
- 0: a\x{c4}\x{c4}
-    
-/\W+\x{C4}/8BZ
-------------------------------------------------------------------
-        Bra
-        \W+
-        \x{c4}
-        Ket
-        End
-------------------------------------------------------------------
-    !\x{C4}
- 0: !\x{c4}
- 
-/\W+\x{C4}/8BZT1
-------------------------------------------------------------------
-        Bra
-        \W++
-        \x{c4}
-        Ket
-        End
-------------------------------------------------------------------
-    !\x{C4}
- 0: !\x{c4}
-
-/\W+\x{A1}/8BZ
-------------------------------------------------------------------
-        Bra
-        \W+
-        \x{a1}
-        Ket
-        End
-------------------------------------------------------------------
-    !\x{A1}
- 0: !\x{a1}
- 
-/\W+\x{A1}/8BZT1
-------------------------------------------------------------------
-        Bra
-        \W+
-        \x{a1}
-        Ket
-        End
-------------------------------------------------------------------
-    !\x{A1}
- 0: !\x{a1}
-
-/X\s+\x{A0}/8BZ
-------------------------------------------------------------------
-        Bra
-        X
-        \s++
-        \x{a0}
-        Ket
-        End
-------------------------------------------------------------------
-    X\x20\x{A0}\x{A0}
- 0: X \x{a0}
-
-/X\s+\x{A0}/8BZT1
-------------------------------------------------------------------
-        Bra
-        X
-        \s+
-        \x{a0}
-        Ket
-        End
-------------------------------------------------------------------
-    X\x20\x{A0}\x{A0}
- 0: X \x{a0}\x{a0}
-
-/\S+\x{A0}/8BZ
-------------------------------------------------------------------
-        Bra
-        \S+
-        \x{a0}
-        Ket
-        End
-------------------------------------------------------------------
-    X\x{A0}\x{A0}
- 0: X\x{a0}\x{a0}
-
-/\S+\x{A0}/8BZT1
-------------------------------------------------------------------
-        Bra
-        \S++
-        \x{a0}
-        Ket
-        End
-------------------------------------------------------------------
-    X\x{A0}\x{A0}
- 0: X\x{a0}
-
-/\x{a0}+\s!/8BZ
-------------------------------------------------------------------
-        Bra
-        \x{a0}++
-        \s
-        !
-        Ket
-        End
-------------------------------------------------------------------
-    \x{a0}\x20!
- 0: \x{a0} !
-
-/\x{a0}+\s!/8BZT1
-------------------------------------------------------------------
-        Bra
-        \x{a0}+
-        \s
-        !
-        Ket
-        End
-------------------------------------------------------------------
-    \x{a0}\x20!
- 0: \x{a0} !
-
-/(*UTF)abc/9
-Failed: setting UTF is disabled by the application at offset 0
-
-/abc/89
-Failed: setting UTF is disabled by the application at offset 0
-
-/-- End of testinput18 --/
diff --git a/dist/testdata/testoutput19 b/dist/testdata/testoutput19
deleted file mode 100644
index eb8a8f6..0000000
--- a/dist/testdata/testoutput19
+++ /dev/null
@@ -1,108 +0,0 @@
-/-- This set of tests is for Unicode property support, relevant only to the
-    16- and 32-bit library. --/
-    
-/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/8iDZ
-------------------------------------------------------------------
-        Bra
-     /i A\x{391}\x{10427}\x{ff3a}\x{1fb0}
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: caseless utf
-First char = 'A' (caseless)
-Need char = \x{1fb0} (caseless)
-
-/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/8DZ
-------------------------------------------------------------------
-        Bra
-        A\x{391}\x{10427}\x{ff3a}\x{1fb0}
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = 'A'
-Need char = \x{1fb0}
-
-/AB\x{1fb0}/8DZ
-------------------------------------------------------------------
-        Bra
-        AB\x{1fb0}
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-First char = 'A'
-Need char = \x{1fb0}
-
-/AB\x{1fb0}/8DZi
-------------------------------------------------------------------
-        Bra
-     /i AB\x{1fb0}
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: caseless utf
-First char = 'A' (caseless)
-Need char = \x{1fb0} (caseless)
-
-/\x{401}\x{420}\x{421}\x{422}\x{423}\x{424}\x{425}\x{426}\x{427}\x{428}\x{429}\x{42a}\x{42b}\x{42c}\x{42d}\x{42e}\x{42f}/8iSI
-Capturing subpattern count = 0
-Options: caseless utf
-First char = \x{401} (caseless)
-Need char = \x{42f} (caseless)
-Subject length lower bound = 17
-No starting char list
-    \x{401}\x{420}\x{421}\x{422}\x{423}\x{424}\x{425}\x{426}\x{427}\x{428}\x{429}\x{42a}\x{42b}\x{42c}\x{42d}\x{42e}\x{42f}
- 0: \x{401}\x{420}\x{421}\x{422}\x{423}\x{424}\x{425}\x{426}\x{427}\x{428}\x{429}\x{42a}\x{42b}\x{42c}\x{42d}\x{42e}\x{42f}
-    \x{451}\x{440}\x{441}\x{442}\x{443}\x{444}\x{445}\x{446}\x{447}\x{448}\x{449}\x{44a}\x{44b}\x{44c}\x{44d}\x{44e}\x{44f}
- 0: \x{451}\x{440}\x{441}\x{442}\x{443}\x{444}\x{445}\x{446}\x{447}\x{448}\x{449}\x{44a}\x{44b}\x{44c}\x{44d}\x{44e}\x{44f}
-
-/[ⱥ]/8iBZ
-------------------------------------------------------------------
-        Bra
-     /i \x{2c65}
-        Ket
-        End
-------------------------------------------------------------------
-
-/[^ⱥ]/8iBZ
-------------------------------------------------------------------
-        Bra
-     /i [^\x{2c65}]
-        Ket
-        End
-------------------------------------------------------------------
-
-/[[:blank:]]/WBZ
-------------------------------------------------------------------
-        Bra
-        [\x09 \xa0\x{1680}\x{180e}\x{2000}-\x{200a}\x{202f}\x{205f}\x{3000}]
-        Ket
-        End
-------------------------------------------------------------------
-
-/\x{212a}+/i8SI
-Capturing subpattern count = 0
-Options: caseless utf
-No first char
-No need char
-Subject length lower bound = 1
-Starting chars: K k \xff 
-    KKkk\x{212a}
- 0: KKkk\x{212a}
-
-/s+/i8SI
-Capturing subpattern count = 0
-Options: caseless utf
-No first char
-No need char
-Subject length lower bound = 1
-Starting chars: S s \xff 
-    SSss\x{17f}
- 0: SSss\x{17f}
-
-/-- End of testinput19 --/ 
diff --git a/dist/testdata/testoutput21-16 b/dist/testdata/testoutput21-16
deleted file mode 100644
index da194d9..0000000
--- a/dist/testdata/testoutput21-16
+++ /dev/null
@@ -1,100 +0,0 @@
-/-- Tests for reloading pre-compiled patterns. The first one gives an error
-right away, and can be any old pattern compiled in 8-bit mode ("abc" is
-typical). The others require the link size to be 2. */x
-
-<!testsaved8
-Compiled pattern loaded from testsaved8
-No study data
-Error -28 from pcre16_fullinfo(0)
-Running in 16-bit mode but pattern was compiled in 8-bit mode
-
-%-- Generated from: 
-    /^[aL](?P<name>(?:[AaLl]+)[^xX-]*?)(?P<other>[\x{150}-\x{250}\x{300}]|
-      [^\x{800}aAs-uS-U\x{d800}-\x{dfff}])++[^#\b\x{500}\x{1000}]{3,5}$
-      /x
-
-    In 16-bit mode with options:  S>testdata/saved16LE-1
-                                 FS>testdata/saved16BE-1
-    In 32-bit mode with options:  S>testdata/saved32LE-1
-                                 FS>testdata/saved32BE-1
---%x
-
-<!testsaved16LE-1
-Compiled pattern loaded from testsaved16LE-1
-Study data loaded from testsaved16LE-1
-------------------------------------------------------------------
-  0 134 Bra
-  2     ^
-  3     [La]
- 20  43 CBra 1
- 23  20 Bra
- 25     [ALal]+
- 43  20 Ket
- 45     [\x00-,.-WY-wy-\xff] (neg)*?
- 63  43 Ket
- 65  12 CBraPos 2
- 68     [\x{150}-\x{250}\x{300}]
- 77  27 Alt
- 79     [^AS-Uas-u\x{800}\x{d800}-\x{dfff}]
-104  39 KetRpos
-106     [^\x08#\x{500}\x{1000}]{3,5}
-133     $
-134 134 Ket
-136     End
-------------------------------------------------------------------
-Capturing subpattern count = 2
-Named capturing subpatterns:
-  name    1
-  other   2
-Options: anchored extended
-No first char
-No need char
-Subject length lower bound = 6
-No starting char list
-
-<!testsaved16BE-1
-Compiled pattern loaded from testsaved16BE-1
-Study data loaded from testsaved16BE-1
-------------------------------------------------------------------
-  0 134 Bra
-  2     ^
-  3     [La]
- 20  43 CBra 1
- 23  20 Bra
- 25     [ALal]+
- 43  20 Ket
- 45     [\x00-,.-WY-wy-\xff] (neg)*?
- 63  43 Ket
- 65  12 CBraPos 2
- 68     [\x{150}-\x{250}\x{300}]
- 77  27 Alt
- 79     [^AS-Uas-u\x{800}\x{d800}-\x{dfff}]
-104  39 KetRpos
-106     [^\x08#\x{500}\x{1000}]{3,5}
-133     $
-134 134 Ket
-136     End
-------------------------------------------------------------------
-Capturing subpattern count = 2
-Named capturing subpatterns:
-  name    1
-  other   2
-Options: anchored extended
-No first char
-No need char
-Subject length lower bound = 6
-No starting char list
-
-<!testsaved32LE-1
-Compiled pattern loaded from testsaved32LE-1
-Study data loaded from testsaved32LE-1
-Error -28 from pcre16_fullinfo(0)
-Running in 16-bit mode but pattern was compiled in 32-bit mode
-
-<!testsaved32BE-1
-Compiled pattern loaded from testsaved32BE-1
-Study data loaded from testsaved32BE-1
-Error -28 from pcre16_fullinfo(0)
-Running in 16-bit mode but pattern was compiled in 32-bit mode
-
-/-- End of testinput21 --/
diff --git a/dist/testdata/testoutput21-32 b/dist/testdata/testoutput21-32
deleted file mode 100644
index d087bb6..0000000
--- a/dist/testdata/testoutput21-32
+++ /dev/null
@@ -1,100 +0,0 @@
-/-- Tests for reloading pre-compiled patterns. The first one gives an error
-right away, and can be any old pattern compiled in 8-bit mode ("abc" is
-typical). The others require the link size to be 2. */x
-
-<!testsaved8
-Compiled pattern loaded from testsaved8
-No study data
-Error -28 from pcre32_fullinfo(0)
-Running in 32-bit mode but pattern was compiled in 8-bit mode
-
-%-- Generated from: 
-    /^[aL](?P<name>(?:[AaLl]+)[^xX-]*?)(?P<other>[\x{150}-\x{250}\x{300}]|
-      [^\x{800}aAs-uS-U\x{d800}-\x{dfff}])++[^#\b\x{500}\x{1000}]{3,5}$
-      /x
-
-    In 16-bit mode with options:  S>testdata/saved16LE-1
-                                 FS>testdata/saved16BE-1
-    In 32-bit mode with options:  S>testdata/saved32LE-1
-                                 FS>testdata/saved32BE-1
---%x
-
-<!testsaved16LE-1
-Compiled pattern loaded from testsaved16LE-1
-Study data loaded from testsaved16LE-1
-Error -28 from pcre32_fullinfo(0)
-Running in 32-bit mode but pattern was compiled in 16-bit mode
-
-<!testsaved16BE-1
-Compiled pattern loaded from testsaved16BE-1
-Study data loaded from testsaved16BE-1
-Error -28 from pcre32_fullinfo(0)
-Running in 32-bit mode but pattern was compiled in 16-bit mode
-
-<!testsaved32LE-1
-Compiled pattern loaded from testsaved32LE-1
-Study data loaded from testsaved32LE-1
-------------------------------------------------------------------
-  0  94 Bra
-  2     ^
-  3     [La]
- 12  27 CBra 1
- 15  12 Bra
- 17     [ALal]+
- 27  12 Ket
- 29     [\x00-,.-WY-wy-\xff] (neg)*?
- 39  27 Ket
- 41  12 CBraPos 2
- 44     [\x{150}-\x{250}\x{300}]
- 53  19 Alt
- 55     [^AS-Uas-u\x{800}\x{d800}-\x{dfff}]
- 72  31 KetRpos
- 74     [^\x08#\x{500}\x{1000}]{3,5}
- 93     $
- 94  94 Ket
- 96     End
-------------------------------------------------------------------
-Capturing subpattern count = 2
-Named capturing subpatterns:
-  name    1
-  other   2
-Options: anchored extended
-No first char
-No need char
-Subject length lower bound = 6
-No starting char list
-
-<!testsaved32BE-1
-Compiled pattern loaded from testsaved32BE-1
-Study data loaded from testsaved32BE-1
-------------------------------------------------------------------
-  0  94 Bra
-  2     ^
-  3     [La]
- 12  27 CBra 1
- 15  12 Bra
- 17     [ALal]+
- 27  12 Ket
- 29     [\x00-,.-WY-wy-\xff] (neg)*?
- 39  27 Ket
- 41  12 CBraPos 2
- 44     [\x{150}-\x{250}\x{300}]
- 53  19 Alt
- 55     [^AS-Uas-u\x{800}\x{d800}-\x{dfff}]
- 72  31 KetRpos
- 74     [^\x08#\x{500}\x{1000}]{3,5}
- 93     $
- 94  94 Ket
- 96     End
-------------------------------------------------------------------
-Capturing subpattern count = 2
-Named capturing subpatterns:
-  name    1
-  other   2
-Options: anchored extended
-No first char
-No need char
-Subject length lower bound = 6
-No starting char list
-
-/-- End of testinput21 --/
diff --git a/dist/testdata/testoutput22-16 b/dist/testdata/testoutput22-16
deleted file mode 100644
index 32a71cd..0000000
--- a/dist/testdata/testoutput22-16
+++ /dev/null
@@ -1,81 +0,0 @@
-/-- Tests for reloading pre-compile patterns with UTF-16 or UTF-32 support. */
-
-%-- Generated from: 
-    /(?P<cbra1>[aZ\x{400}-\x{10ffff}]{4,}
-      [\x{f123}\x{10039}\x{20000}-\x{21234}]?|
-      [A-Cx-z\x{100000}-\x{1000a7}\x{101234}])
-      (?<cb2>[^az])/x 
-       
-    In 16-bit mode with options:  S8>testdata/saved16LE-2
-                                 FS8>testdata/saved16BE-2
-    In 32-bit mode with options:  S8>testdata/saved32LE-2
-                                 FS8>testdata/saved32BE-2
---%8x
-
-<!testsaved16LE-2
-Compiled pattern loaded from testsaved16LE-2
-Study data loaded from testsaved16LE-2
-------------------------------------------------------------------
-  0 101 Bra
-  2  45 CBra 1
-  5     [Za\x{400}-\x{10ffff}]{4,}
- 32     [\x{f123}\x{10039}\x{20000}-\x{21234}]?
- 47  30 Alt
- 49     [A-Cx-z\x{100000}-\x{1000a7}\x{101234}]
- 77  75 Ket
- 79  20 CBra 2
- 82     [\x00-`b-y{-\xff] (neg)
- 99  20 Ket
-101 101 Ket
-103     End
-------------------------------------------------------------------
-Capturing subpattern count = 2
-Named capturing subpatterns:
-  cb2     2
-  cbra1   1
-Options: extended utf
-No first char
-No need char
-Subject length lower bound = 2
-No starting char list
-
-<!testsaved16BE-2
-Compiled pattern loaded from testsaved16BE-2
-Study data loaded from testsaved16BE-2
-------------------------------------------------------------------
-  0 101 Bra
-  2  45 CBra 1
-  5     [Za\x{400}-\x{10ffff}]{4,}
- 32     [\x{f123}\x{10039}\x{20000}-\x{21234}]?
- 47  30 Alt
- 49     [A-Cx-z\x{100000}-\x{1000a7}\x{101234}]
- 77  75 Ket
- 79  20 CBra 2
- 82     [\x00-`b-y{-\xff] (neg)
- 99  20 Ket
-101 101 Ket
-103     End
-------------------------------------------------------------------
-Capturing subpattern count = 2
-Named capturing subpatterns:
-  cb2     2
-  cbra1   1
-Options: extended utf
-No first char
-No need char
-Subject length lower bound = 2
-No starting char list
-
-<!testsaved32LE-2
-Compiled pattern loaded from testsaved32LE-2
-Study data loaded from testsaved32LE-2
-Error -28 from pcre16_fullinfo(0)
-Running in 16-bit mode but pattern was compiled in 32-bit mode
-
-<!testsaved32BE-2
-Compiled pattern loaded from testsaved32BE-2
-Study data loaded from testsaved32BE-2
-Error -28 from pcre16_fullinfo(0)
-Running in 16-bit mode but pattern was compiled in 32-bit mode
-
-/-- End of testinput22 --/
diff --git a/dist/testdata/testoutput22-32 b/dist/testdata/testoutput22-32
deleted file mode 100644
index 13e441d..0000000
--- a/dist/testdata/testoutput22-32
+++ /dev/null
@@ -1,81 +0,0 @@
-/-- Tests for reloading pre-compile patterns with UTF-16 or UTF-32 support. */
-
-%-- Generated from: 
-    /(?P<cbra1>[aZ\x{400}-\x{10ffff}]{4,}
-      [\x{f123}\x{10039}\x{20000}-\x{21234}]?|
-      [A-Cx-z\x{100000}-\x{1000a7}\x{101234}])
-      (?<cb2>[^az])/x 
-       
-    In 16-bit mode with options:  S8>testdata/saved16LE-2
-                                 FS8>testdata/saved16BE-2
-    In 32-bit mode with options:  S8>testdata/saved32LE-2
-                                 FS8>testdata/saved32BE-2
---%8x
-
-<!testsaved16LE-2
-Compiled pattern loaded from testsaved16LE-2
-Study data loaded from testsaved16LE-2
-Error -28 from pcre32_fullinfo(0)
-Running in 32-bit mode but pattern was compiled in 16-bit mode
-
-<!testsaved16BE-2
-Compiled pattern loaded from testsaved16BE-2
-Study data loaded from testsaved16BE-2
-Error -28 from pcre32_fullinfo(0)
-Running in 32-bit mode but pattern was compiled in 16-bit mode
-
-<!testsaved32LE-2
-Compiled pattern loaded from testsaved32LE-2
-Study data loaded from testsaved32LE-2
-------------------------------------------------------------------
-  0  70 Bra
-  2  33 CBra 1
-  5     [Za\x{400}-\x{10ffff}]{4,}
- 23     [\x{f123}\x{10039}\x{20000}-\x{21234}]?
- 35  19 Alt
- 37     [A-Cx-z\x{100000}-\x{1000a7}\x{101234}]
- 54  52 Ket
- 56  12 CBra 2
- 59     [\x00-`b-y{-\xff] (neg)
- 68  12 Ket
- 70  70 Ket
- 72     End
-------------------------------------------------------------------
-Capturing subpattern count = 2
-Named capturing subpatterns:
-  cb2     2
-  cbra1   1
-Options: extended utf
-No first char
-No need char
-Subject length lower bound = 2
-No starting char list
-
-<!testsaved32BE-2
-Compiled pattern loaded from testsaved32BE-2
-Study data loaded from testsaved32BE-2
-------------------------------------------------------------------
-  0  70 Bra
-  2  33 CBra 1
-  5     [Za\x{400}-\x{10ffff}]{4,}
- 23     [\x{f123}\x{10039}\x{20000}-\x{21234}]?
- 35  19 Alt
- 37     [A-Cx-z\x{100000}-\x{1000a7}\x{101234}]
- 54  52 Ket
- 56  12 CBra 2
- 59     [\x00-`b-y{-\xff] (neg)
- 68  12 Ket
- 70  70 Ket
- 72     End
-------------------------------------------------------------------
-Capturing subpattern count = 2
-Named capturing subpatterns:
-  cb2     2
-  cbra1   1
-Options: extended utf
-No first char
-No need char
-Subject length lower bound = 2
-No starting char list
-
-/-- End of testinput22 --/
diff --git a/dist/testdata/testoutput23 b/dist/testdata/testoutput23
deleted file mode 100644
index 6dabf03..0000000
--- a/dist/testdata/testoutput23
+++ /dev/null
@@ -1,72 +0,0 @@
-/-- Tests for the 16-bit library only */
-
-< forbid 8W
-
-/-- Check maximum non-UTF character size --/
-
-/\x{ffff}/
-    A\x{ffff}B
- 0: \x{ffff}
-
-/\x{10000}/
-Failed: character value in \x{} or \o{} is too large at offset 8
-
-/\o{20000}/
-
-/-- Check character ranges --/
-
-/[\H]/BZSI
-------------------------------------------------------------------
-        Bra
-        [\x00-\x08\x0a-\x1f!-\x9f\xa1-\xff\x{100}-\x{167f}\x{1681}-\x{180d}\x{180f}-\x{1fff}\x{200b}-\x{202e}\x{2030}-\x{205e}\x{2060}-\x{2fff}\x{3001}-\x{ffff}]
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-No options
-No first char
-No need char
-Subject length lower bound = 1
-Starting chars: \x00 \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x0a \x0b 
-  \x0c \x0d \x0e \x0f \x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17 \x18 \x19 \x1a 
-  \x1b \x1c \x1d \x1e \x1f ! " # $ % & ' ( ) * + , - . / 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 { | } ~ \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 \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 
-
-/[\V]/BZSI
-------------------------------------------------------------------
-        Bra
-        [\x00-\x09\x0e-\x84\x86-\xff\x{100}-\x{2027}\x{202a}-\x{ffff}]
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-No options
-No first char
-No need char
-Subject length lower bound = 1
-Starting chars: \x00 \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x09 \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 [ \ ] ^ _ ` 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 { | } ~ \x7f \x80 \x81 \x82 
-  \x83 \x84 \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 
-
-/-- End of testinput23 --/
diff --git a/dist/testdata/testoutput24 b/dist/testdata/testoutput24
deleted file mode 100644
index 0714a0f..0000000
--- a/dist/testdata/testoutput24
+++ /dev/null
@@ -1,13 +0,0 @@
-/-- Tests for the 16-bit library with UTF-16 support only */
-
-< forbid W
-
-/bad/8
-    \x{d800}
-Error -10 (bad UTF-16 string) offset=0 reason=1
-
-/short/8
-    \P\P\x{d800}
-Error -25 (short UTF-16 string) offset=0 reason=1
-
-/-- End of testinput24 --/
diff --git a/dist/testdata/testoutput25 b/dist/testdata/testoutput25
deleted file mode 100644
index 4c62c8d..0000000
--- a/dist/testdata/testoutput25
+++ /dev/null
@@ -1,119 +0,0 @@
-/-- Tests for the 32-bit library only */
-
-< forbid 8W
-
-/-- Check maximum character size --/
-
-/\x{110000}/
-
-/\x{7fffffff}/
-
-/\x{80000000}/
-
-/\x{ffffffff}/
-
-/\x{100000000}/
-Failed: character value in \x{} or \o{} is too large at offset 12
-
-/\o{17777777777}/
-
-/\o{20000000000}/
-
-/\o{37777777777}/
-
-/\o{40000000000}/
-Failed: character value in \x{} or \o{} is too large at offset 14
-
-/\x{7fffffff}\x{7fffffff}/I
-Capturing subpattern count = 0
-No options
-First char = \x{7fffffff}
-Need char = \x{7fffffff}
-
-/\x{80000000}\x{80000000}/I
-Capturing subpattern count = 0
-No options
-First char = \x{80000000}
-Need char = \x{80000000}
-
-/\x{ffffffff}\x{ffffffff}/I
-Capturing subpattern count = 0
-No options
-First char = \x{ffffffff}
-Need char = \x{ffffffff}
-
-/-- Non-UTF characters --/
-
-/\C{2,3}/
-    \x{400000}\x{400001}\x{400002}\x{400003}
- 0: \x{400000}\x{400001}\x{400002}
-
-/\x{400000}\x{800000}/iDZ
-------------------------------------------------------------------
-        Bra
-     /i \x{400000}\x{800000}
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: caseless
-First char = \x{400000}
-Need char = \x{800000}
-
-/-- Check character ranges --/
-
-/[\H]/BZSI
-------------------------------------------------------------------
-        Bra
-        [\x00-\x08\x0a-\x1f!-\x9f\xa1-\xff\x{100}-\x{167f}\x{1681}-\x{180d}\x{180f}-\x{1fff}\x{200b}-\x{202e}\x{2030}-\x{205e}\x{2060}-\x{2fff}\x{3001}-\x{ffffffff}]
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-No options
-No first char
-No need char
-Subject length lower bound = 1
-Starting chars: \x00 \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x0a \x0b 
-  \x0c \x0d \x0e \x0f \x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17 \x18 \x19 \x1a 
-  \x1b \x1c \x1d \x1e \x1f ! " # $ % & ' ( ) * + , - . / 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 { | } ~ \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 \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 
-
-/[\V]/BZSI
-------------------------------------------------------------------
-        Bra
-        [\x00-\x09\x0e-\x84\x86-\xff\x{100}-\x{2027}\x{202a}-\x{ffffffff}]
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-No options
-No first char
-No need char
-Subject length lower bound = 1
-Starting chars: \x00 \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x09 \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 [ \ ] ^ _ ` 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 { | } ~ \x7f \x80 \x81 \x82 
-  \x83 \x84 \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 
-
-/-- End of testinput25 --/
diff --git a/dist/testdata/testoutput26 b/dist/testdata/testoutput26
deleted file mode 100644
index 28f8d42..0000000
--- a/dist/testdata/testoutput26
+++ /dev/null
@@ -1,17 +0,0 @@
-/-- Tests for the 32-bit library with UTF-32 support only */
-
-< forbid W
-
-/-- Non-UTF characters --/
-
-/\x{110000}/8
-Failed: character value in \x{} or \o{} is too large at offset 9
-
-/\o{4200000}/8
-Failed: character value in \x{} or \o{} is too large at offset 10
-
-/\C/8
-    \x{110000}
-Error -10 (bad UTF-32 string) offset=0 reason=3
-
-/-- End of testinput26 --/
diff --git a/dist/testdata/testoutput3 b/dist/testdata/testoutput3
deleted file mode 100644
index 73119ab..0000000
--- a/dist/testdata/testoutput3
+++ /dev/null
@@ -1,174 +0,0 @@
-/-- This set of tests checks local-specific features, using the "fr_FR" locale. 
-    It is not Perl-compatible. When run via RunTest, the locale is edited to
-    be whichever of "fr_FR", "french", or "fr" is found to exist. There is
-    different version of this file called wintestinput3 for use on Windows,
-    where the locale is called "french" and the tests are run using
-    RunTest.bat. --/
-
-< forbid 8W 
-
-/^[\w]+/
-    *** Failers
-No match
-    École
-No match
-
-/^[\w]+/Lfr_FR
-    École
- 0: École
-
-/^[\w]+/
-    *** Failers
-No match
-    École
-No match
-
-/^[\W]+/
-    École
- 0: \xc9
-
-/^[\W]+/Lfr_FR
-    *** Failers
- 0: *** 
-    École
-No match
-
-/[\b]/
-    \b
- 0: \x08
-    *** Failers
-No match
-    a
-No match
-
-/[\b]/Lfr_FR
-    \b
- 0: \x08
-    *** Failers
-No match
-    a
-No match
-
-/^\w+/
-    *** Failers
-No match
-    École
-No match
-
-/^\w+/Lfr_FR
-    École
- 0: École
-
-/(.+)\b(.+)/
-    École
- 0: \xc9cole
- 1: \xc9
- 2: cole
-
-/(.+)\b(.+)/Lfr_FR
-    *** Failers
- 0: *** Failers
- 1: *** 
- 2: Failers
-    École
-No match
-
-/École/i
-    École
- 0: \xc9cole
-    *** Failers
-No match
-    école
-No match
-
-/École/iLfr_FR
-    École
- 0: École
-    école
- 0: école
-
-/\w/IS
-Capturing subpattern count = 0
-No options
-No first char
-No need char
-Subject length lower bound = 1
-Starting chars: 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_FR
-Capturing subpattern count = 0
-No options
-No first char
-No need char
-Subject length lower bound = 1
-Starting chars: 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_FR
-    École
- 0: É
-    école
- 0: é
-
-/^[\xc8-\xc9]/Lfr_FR
-    École
- 0: É
-    *** Failers 
-No match
-    école
-No match
-
-/\W+/Lfr_FR
-    >>>\xaa<<<
- 0: >>>
-    >>>\xba<<< 
- 0: >>>
-
-/[\W]+/Lfr_FR
-    >>>\xaa<<<
- 0: >>>
-    >>>\xba<<< 
- 0: >>>
-
-/[^[:alpha:]]+/Lfr_FR
-    >>>\xaa<<<
- 0: >>>
-    >>>\xba<<< 
- 0: >>>
-
-/\w+/Lfr_FR
-    >>>\xaa<<<
- 0: ª
-    >>>\xba<<< 
- 0: º
-
-/[\w]+/Lfr_FR
-    >>>\xaa<<<
- 0: ª
-    >>>\xba<<< 
- 0: º
-
-/[[:alpha:]]+/Lfr_FR
-    >>>\xaa<<<
- 0: ª
-    >>>\xba<<< 
- 0: º
-    
-/[[:alpha:]][[:lower:]][[:upper:]]/DZLfr_FR 
-------------------------------------------------------------------
-        Bra
-        [A-Za-z\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\xff]
-        [a-z\xb5\xdf-\xf6\xf8-\xff]
-        [A-Z\xc0-\xd6\xd8-\xde]
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-No options
-No first char
-No need char
-
-/-- End of testinput3 --/
diff --git a/dist/testdata/testoutput3A b/dist/testdata/testoutput3A
deleted file mode 100644
index 0bde024..0000000
--- a/dist/testdata/testoutput3A
+++ /dev/null
@@ -1,174 +0,0 @@
-/-- This set of tests checks local-specific features, using the "fr_FR" locale. 
-    It is not Perl-compatible. When run via RunTest, the locale is edited to
-    be whichever of "fr_FR", "french", or "fr" is found to exist. There is
-    different version of this file called wintestinput3 for use on Windows,
-    where the locale is called "french" and the tests are run using
-    RunTest.bat. --/
-
-< forbid 8W 
-
-/^[\w]+/
-    *** Failers
-No match
-    École
-No match
-
-/^[\w]+/Lfr_FR
-    École
- 0: École
-
-/^[\w]+/
-    *** Failers
-No match
-    École
-No match
-
-/^[\W]+/
-    École
- 0: \xc9
-
-/^[\W]+/Lfr_FR
-    *** Failers
- 0: *** 
-    École
-No match
-
-/[\b]/
-    \b
- 0: \x08
-    *** Failers
-No match
-    a
-No match
-
-/[\b]/Lfr_FR
-    \b
- 0: \x08
-    *** Failers
-No match
-    a
-No match
-
-/^\w+/
-    *** Failers
-No match
-    École
-No match
-
-/^\w+/Lfr_FR
-    École
- 0: École
-
-/(.+)\b(.+)/
-    École
- 0: \xc9cole
- 1: \xc9
- 2: cole
-
-/(.+)\b(.+)/Lfr_FR
-    *** Failers
- 0: *** Failers
- 1: *** 
- 2: Failers
-    École
-No match
-
-/École/i
-    École
- 0: \xc9cole
-    *** Failers
-No match
-    école
-No match
-
-/École/iLfr_FR
-    École
- 0: École
-    école
- 0: école
-
-/\w/IS
-Capturing subpattern count = 0
-No options
-No first char
-No need char
-Subject length lower bound = 1
-Starting chars: 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_FR
-Capturing subpattern count = 0
-No options
-No first char
-No need char
-Subject length lower bound = 1
-Starting chars: 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_FR
-    École
- 0: É
-    école
- 0: é
-
-/^[\xc8-\xc9]/Lfr_FR
-    École
- 0: É
-    *** Failers 
-No match
-    école
-No match
-
-/\W+/Lfr_FR
-    >>>\xaa<<<
- 0: >>>
-    >>>\xba<<< 
- 0: >>>
-
-/[\W]+/Lfr_FR
-    >>>\xaa<<<
- 0: >>>
-    >>>\xba<<< 
- 0: >>>
-
-/[^[:alpha:]]+/Lfr_FR
-    >>>\xaa<<<
- 0: >>>
-    >>>\xba<<< 
- 0: >>>
-
-/\w+/Lfr_FR
-    >>>\xaa<<<
- 0: ª
-    >>>\xba<<< 
- 0: º
-
-/[\w]+/Lfr_FR
-    >>>\xaa<<<
- 0: ª
-    >>>\xba<<< 
- 0: º
-
-/[[:alpha:]]+/Lfr_FR
-    >>>\xaa<<<
- 0: ª
-    >>>\xba<<< 
- 0: º
-    
-/[[:alpha:]][[:lower:]][[:upper:]]/DZLfr_FR 
-------------------------------------------------------------------
-        Bra
-        [A-Za-z\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\xff]
-        [a-z\xaa\xb5\xba\xdf-\xf6\xf8-\xff]
-        [A-Z\xc0-\xd6\xd8-\xde]
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-No options
-No first char
-No need char
-
-/-- End of testinput3 --/
diff --git a/dist/testdata/testoutput3B b/dist/testdata/testoutput3B
deleted file mode 100644
index 8d9fe7d..0000000
--- a/dist/testdata/testoutput3B
+++ /dev/null
@@ -1,174 +0,0 @@
-/-- This set of tests checks local-specific features, using the "fr_FR" locale. 
-    It is not Perl-compatible. When run via RunTest, the locale is edited to
-    be whichever of "fr_FR", "french", or "fr" is found to exist. There is
-    different version of this file called wintestinput3 for use on Windows,
-    where the locale is called "french" and the tests are run using
-    RunTest.bat. --/
-
-< forbid 8W 
-
-/^[\w]+/
-    *** Failers
-No match
-    École
-No match
-
-/^[\w]+/Lfr_FR
-    École
- 0: École
-
-/^[\w]+/
-    *** Failers
-No match
-    École
-No match
-
-/^[\W]+/
-    École
- 0: \xc9
-
-/^[\W]+/Lfr_FR
-    *** Failers
- 0: *** 
-    École
-No match
-
-/[\b]/
-    \b
- 0: \x08
-    *** Failers
-No match
-    a
-No match
-
-/[\b]/Lfr_FR
-    \b
- 0: \x08
-    *** Failers
-No match
-    a
-No match
-
-/^\w+/
-    *** Failers
-No match
-    École
-No match
-
-/^\w+/Lfr_FR
-    École
- 0: École
-
-/(.+)\b(.+)/
-    École
- 0: \xc9cole
- 1: \xc9
- 2: cole
-
-/(.+)\b(.+)/Lfr_FR
-    *** Failers
- 0: *** Failers
- 1: *** 
- 2: Failers
-    École
-No match
-
-/École/i
-    École
- 0: \xc9cole
-    *** Failers
-No match
-    école
-No match
-
-/École/iLfr_FR
-    École
- 0: École
-    école
- 0: école
-
-/\w/IS
-Capturing subpattern count = 0
-No options
-No first char
-No need char
-Subject length lower bound = 1
-Starting chars: 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_FR
-Capturing subpattern count = 0
-No options
-No first char
-No need char
-Subject length lower bound = 1
-Starting chars: 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_FR
-    École
- 0: É
-    école
- 0: é
-
-/^[\xc8-\xc9]/Lfr_FR
-    École
- 0: É
-    *** Failers 
-No match
-    école
-No match
-
-/\W+/Lfr_FR
-    >>>\xaa<<<
- 0: >>>
-    >>>\xba<<< 
- 0: >>>
-
-/[\W]+/Lfr_FR
-    >>>\xaa<<<
- 0: >>>
-    >>>\xba<<< 
- 0: >>>
-
-/[^[:alpha:]]+/Lfr_FR
-    >>>\xaa<<<
- 0: >>>
-    >>>\xba<<< 
- 0: >>>
-
-/\w+/Lfr_FR
-    >>>\xaa<<<
- 0: ª
-    >>>\xba<<< 
- 0: º
-
-/[\w]+/Lfr_FR
-    >>>\xaa<<<
- 0: ª
-    >>>\xba<<< 
- 0: º
-
-/[[:alpha:]]+/Lfr_FR
-    >>>\xaa<<<
- 0: ª
-    >>>\xba<<< 
- 0: º
-    
-/[[:alpha:]][[:lower:]][[:upper:]]/DZLfr_FR 
-------------------------------------------------------------------
-        Bra
-        [A-Za-z\x83\x8a\x8c\x8e\x9a\x9c\x9e\x9f\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\xff]
-        [a-z\x83\x9a\x9c\x9e\xaa\xb5\xba\xdf-\xf6\xf8-\xff]
-        [A-Z\x8a\x8c\x8e\x9f\xc0-\xd6\xd8-\xde]
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-No options
-No first char
-No need char
-
-/-- End of testinput3 --/
diff --git a/dist/testdata/testoutput4 b/dist/testdata/testoutput4
deleted file mode 100644
index d43c123..0000000
--- a/dist/testdata/testoutput4
+++ /dev/null
@@ -1,1280 +0,0 @@
-/-- This set of tests is for UTF support, excluding Unicode properties. It is
-    compatible with all versions of Perl >= 5.10 and both the 8-bit and 16-bit
-    PCRE libraries. --/
-    
-< forbid 9?=ABCDEFfGILMNPTUWXZ<
-   
-/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
- 1: \x{4000}xy
-    a\x{4000}\x7fyb 
- 0: a\x{4000}\x{7f}yb
- 1: \x{4000}\x{7f}y
-    a\x{4000}\x{100}yb 
- 0: a\x{4000}\x{100}yb
- 1: \x{4000}\x{100}y
-    *** Failers
-No match
-    a\x{4000}b 
-No match
-    ac\ncb 
-No match
-
-/a(.*?)(.)/
-    a\xc0\x88b
- 0: a\xc0
- 1: 
- 2: \xc0
-
-/a(.*?)(.)/8
-    a\x{100}b
- 0: a\x{100}
- 1: 
- 2: \x{100}
-
-/a(.*)(.)/
-    a\xc0\x88b
- 0: a\xc0\x88b
- 1: \xc0\x88
- 2: b
-
-/a(.*)(.)/8
-    a\x{100}b
- 0: a\x{100}b
- 1: \x{100}
- 2: b
-
-/a(.)(.)/
-    a\xc0\x92bcd
- 0: a\xc0\x92
- 1: \xc0
- 2: \x92
-
-/a(.)(.)/8
-    a\x{240}bcd
- 0: a\x{240}b
- 1: \x{240}
- 2: b
-
-/a(.?)(.)/
-    a\xc0\x92bcd
- 0: a\xc0\x92
- 1: \xc0
- 2: \x92
-
-/a(.?)(.)/8
-    a\x{240}bcd
- 0: a\x{240}b
- 1: \x{240}
- 2: b
-
-/a(.??)(.)/
-    a\xc0\x92bcd
- 0: a\xc0
- 1: 
- 2: \xc0
-
-/a(.??)(.)/8
-    a\x{240}bcd
- 0: a\x{240}
- 1: 
- 2: \x{240}
-
-/a(.{3})b/8
-    a\x{1234}xyb 
- 0: a\x{1234}xyb
- 1: \x{1234}xy
-    a\x{1234}\x{4321}yb 
- 0: a\x{1234}\x{4321}yb
- 1: \x{1234}\x{4321}y
-    a\x{1234}\x{4321}\x{3412}b 
- 0: a\x{1234}\x{4321}\x{3412}b
- 1: \x{1234}\x{4321}\x{3412}
-    *** 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
- 1: \x{1234}xy
-    a\x{1234}\x{4321}yb 
- 0: a\x{1234}\x{4321}yb
- 1: \x{1234}\x{4321}y
-    a\x{1234}\x{4321}\x{3412}b 
- 0: a\x{1234}\x{4321}\x{3412}b
- 1: \x{1234}\x{4321}\x{3412}
-    axxxxbcdefghijb 
- 0: axxxxbcdefghijb
- 1: xxxxbcdefghij
-    a\x{1234}\x{4321}\x{3412}\x{3421}b 
- 0: a\x{1234}\x{4321}\x{3412}\x{3421}b
- 1: \x{1234}\x{4321}\x{3412}\x{3421}
-    *** Failers
-No match
-    a\x{1234}b 
-No match
-
-/a(.{3,}?)b/8
-    a\x{1234}xyb 
- 0: a\x{1234}xyb
- 1: \x{1234}xy
-    a\x{1234}\x{4321}yb 
- 0: a\x{1234}\x{4321}yb
- 1: \x{1234}\x{4321}y
-    a\x{1234}\x{4321}\x{3412}b 
- 0: a\x{1234}\x{4321}\x{3412}b
- 1: \x{1234}\x{4321}\x{3412}
-    axxxxbcdefghijb 
- 0: axxxxb
- 1: xxxx
-    a\x{1234}\x{4321}\x{3412}\x{3421}b 
- 0: a\x{1234}\x{4321}\x{3412}\x{3421}b
- 1: \x{1234}\x{4321}\x{3412}\x{3421}
-    *** Failers
-No match
-    a\x{1234}b 
-No match
-
-/a(.{3,5})b/8
-    a\x{1234}xyb 
- 0: a\x{1234}xyb
- 1: \x{1234}xy
-    a\x{1234}\x{4321}yb 
- 0: a\x{1234}\x{4321}yb
- 1: \x{1234}\x{4321}y
-    a\x{1234}\x{4321}\x{3412}b 
- 0: a\x{1234}\x{4321}\x{3412}b
- 1: \x{1234}\x{4321}\x{3412}
-    axxxxbcdefghijb 
- 0: axxxxb
- 1: xxxx
-    a\x{1234}\x{4321}\x{3412}\x{3421}b 
- 0: a\x{1234}\x{4321}\x{3412}\x{3421}b
- 1: \x{1234}\x{4321}\x{3412}\x{3421}
-    axbxxbcdefghijb 
- 0: axbxxb
- 1: xbxx
-    axxxxxbcdefghijb 
- 0: axxxxxb
- 1: xxxxx
-    *** 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
- 1: \x{1234}xy
-    a\x{1234}\x{4321}yb 
- 0: a\x{1234}\x{4321}yb
- 1: \x{1234}\x{4321}y
-    a\x{1234}\x{4321}\x{3412}b 
- 0: a\x{1234}\x{4321}\x{3412}b
- 1: \x{1234}\x{4321}\x{3412}
-    axxxxbcdefghijb 
- 0: axxxxb
- 1: xxxx
-    a\x{1234}\x{4321}\x{3412}\x{3421}b 
- 0: a\x{1234}\x{4321}\x{3412}\x{3421}b
- 1: \x{1234}\x{4321}\x{3412}\x{3421}
-    axbxxbcdefghijb 
- 0: axbxxb
- 1: xbxx
-    axxxxxbcdefghijb 
- 0: axxxxxb
- 1: xxxxx
-    *** 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
- 1: W
-    \x{256}XYZ 
- 0: X
- 1: \x{256}
-    *** Failers
-No match
-    XYZ 
-No match
-
-/[^a]+/8g
-    bcd
- 0: bcd
-    \x{100}aY\x{256}Z 
- 0: \x{100}
- 0: Y\x{256}Z
-    
-/^[^a]{2}/8
-    \x{100}bc
- 0: \x{100}b
- 
-/^[^a]{2,}/8
-    \x{100}bcAa
- 0: \x{100}bcA
-
-/^[^a]{2,}?/8
-    \x{100}bca
- 0: \x{100}b
-
-/[^a]+/8ig
-    bcd
- 0: bcd
-    \x{100}aY\x{256}Z 
- 0: \x{100}
- 0: Y\x{256}Z
-    
-/^[^a]{2}/8i
-    \x{100}bc
- 0: \x{100}b
- 
-/^[^a]{2,}/8i
-    \x{100}bcAa
- 0: \x{100}bc
-
-/^[^a]{2,}?/8i
-    \x{100}bca
- 0: \x{100}b
-
-/\x{100}{0,0}/8
-    abcd
- 0: 
- 
-/\x{100}?/8
-    abcd
- 0: 
-    \x{100}\x{100} 
- 0: \x{100}
-
-/\x{100}{0,3}/8 
-    \x{100}\x{100} 
- 0: \x{100}\x{100}
-    \x{100}\x{100}\x{100}\x{100} 
- 0: \x{100}\x{100}\x{100}
-    
-/\x{100}*/8
-    abce
- 0: 
-    \x{100}\x{100}\x{100}\x{100} 
- 0: \x{100}\x{100}\x{100}\x{100}
-
-/\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}
-
-/\x{100}+/8
-    abcd\x{100}\x{100}\x{100}\x{100} 
- 0: \x{100}\x{100}\x{100}\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}
-
-/\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}
-
-/(?<=a\x{100}{2}b)X/8+
-    Xyyya\x{100}\x{100}bXzzz
- 0: X
- 0+ zzz
-
-/\D*/8
-  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
- 0: 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}
- 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}
-
-/\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
-    *** Failers
- 0: *** Failers
-    1234  
-No match
-
-/\D{2,3}/8
-    12abcd34
- 0: abc
-    12ab34
- 0: ab
-    *** Failers  
- 0: ***
-    1234
-No match
-    12a34  
-No match
-
-/\D{2,3}?/8
-    12abcd34
- 0: ab
-    12ab34
- 0: ab
-    *** Failers  
- 0: **
-    1234
-No match
-    12a34  
-No match
-
-/\d+/8
-    12abcd34
- 0: 12
-    *** Failers
-No match
-
-/\d{2,3}/8
-    12abcd34
- 0: 12
-    1234abcd
- 0: 123
-    *** Failers  
-No match
-    1.4 
-No match
-
-/\d{2,3}?/8
-    12abcd34
- 0: 12
-    1234abcd
- 0: 12
-    *** Failers  
-No match
-    1.4 
-No match
-
-/\S+/8
-    12abcd34
- 0: 12abcd34
-    *** Failers
- 0: ***
-    \    \ 
-No match
-
-/\S{2,3}/8
-    12abcd34
- 0: 12a
-    1234abcd
- 0: 123
-    *** Failers
- 0: ***
-    \     \  
-No match
-
-/\S{2,3}?/8
-    12abcd34
- 0: 12
-    1234abcd
- 0: 12
-    *** Failers
- 0: **
-    \     \  
-No match
-
-/>\s+</8+
-    12>      <34
- 0: >      <
- 0+ 34
-    *** Failers
-No match
-
-/>\s{2,3}</8+
-    ab>  <cd
- 0: >  <
- 0+ cd
-    ab>   <ce
- 0: >   <
- 0+ ce
-    *** Failers
-No match
-    ab>    <cd 
-No match
-
-/>\s{2,3}?</8+
-    ab>  <cd
- 0: >  <
- 0+ cd
-    ab>   <ce
- 0: >   <
- 0+ ce
-    *** Failers
-No match
-    ab>    <cd 
-No match
-
-/\w+/8
-    12      34
- 0: 12
-    *** Failers
- 0: Failers
-    +++=*! 
-No match
-
-/\w{2,3}/8
-    ab  cd
- 0: ab
-    abcd ce
- 0: abc
-    *** Failers
- 0: Fai
-    a.b.c
-No match
-
-/\w{2,3}?/8
-    ab  cd
- 0: ab
-    abcd ce
- 0: ab
-    *** Failers
- 0: Fa
-    a.b.c
-No match
-
-/\W+/8
-    12====34
- 0: ====
-    *** Failers
- 0: *** 
-    abcd 
-No match
-
-/\W{2,3}/8
-    ab====cd
- 0: ===
-    ab==cd
- 0: ==
-    *** Failers
- 0: ***
-    a.b.c
-No match
-
-/\W{2,3}?/8
-    ab====cd
- 0: ==
-    ab==cd
- 0: ==
-    *** Failers
- 0: **
-    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}
-   *** 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}
-   *** 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}
-   *** 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}
-   *** 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: 
- 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}
-
-/^ሴ/8
-    ሴ 
- 0: \x{1234}
-
-/^\ሴ/8
-    ሴ 
- 0: \x{1234}
-
-"(?s)(.{1,5})"8
-    abcdefg
- 0: abcde
- 1: abcde
-    ab
- 0: ab
- 1: ab
-
-/a*\x{100}*\w/8
-    a 
- 0: a
-
-/\S\S/8g
-    A\x{a3}BC
- 0: A\x{a3}
- 0: BC
-    
-/\S{2}/8g
-    A\x{a3}BC
- 0: A\x{a3}
- 0: BC
-    
-/\W\W/8g
-    +\x{a3}== 
- 0: +\x{a3}
- 0: ==
-
-/\W{2}/8g
-    +\x{a3}== 
- 0: +\x{a3}
- 0: ==
-
-/\S/8g
-    \x{442}\x{435}\x{441}\x{442}
- 0: \x{442}
- 0: \x{435}
- 0: \x{441}
- 0: \x{442}
-
-/[\S]/8g
-    \x{442}\x{435}\x{441}\x{442}
- 0: \x{442}
- 0: \x{435}
- 0: \x{441}
- 0: \x{442}
-
-/\D/8g
-    \x{442}\x{435}\x{441}\x{442}
- 0: \x{442}
- 0: \x{435}
- 0: \x{441}
- 0: \x{442}
-
-/[\D]/8g
-    \x{442}\x{435}\x{441}\x{442}
- 0: \x{442}
- 0: \x{435}
- 0: \x{441}
- 0: \x{442}
-
-/\W/8g
-    \x{2442}\x{2435}\x{2441}\x{2442}
- 0: \x{2442}
- 0: \x{2435}
- 0: \x{2441}
- 0: \x{2442}
-
-/[\W]/8g
-    \x{2442}\x{2435}\x{2441}\x{2442}
- 0: \x{2442}
- 0: \x{2435}
- 0: \x{2441}
- 0: \x{2442}
-    
-/[\S\s]*/8
-    abc\n\r\x{442}\x{435}\x{441}\x{442}xyz 
- 0: abc\x{0a}\x{0d}\x{442}\x{435}\x{441}\x{442}xyz
-
-/[\x{41f}\S]/8g
-    \x{442}\x{435}\x{441}\x{442}
- 0: \x{442}
- 0: \x{435}
- 0: \x{441}
- 0: \x{442}
-
-/.[^\S]./8g
-    abc def\x{442}\x{443}xyz\npqr
- 0: c d
- 0: z\x{0a}p
-
-/.[^\S\n]./8g
-    abc def\x{442}\x{443}xyz\npqr
- 0: c d
-
-/[[:^alnum:]]/8g  
-    +\x{2442}
- 0: +
- 0: \x{2442}
-    
-/[[:^alpha:]]/8g 
-    +\x{2442}
- 0: +
- 0: \x{2442}
-    
-/[[:^ascii:]]/8g 
-    A\x{442}
- 0: \x{442}
-    
-/[[:^blank:]]/8g 
-    A\x{442}
- 0: A
- 0: \x{442}
-    
-/[[:^cntrl:]]/8g 
-    A\x{442}
- 0: A
- 0: \x{442}
-    
-/[[:^digit:]]/8g 
-    A\x{442}
- 0: A
- 0: \x{442}
-    
-/[[:^graph:]]/8g 
-    \x19\x{e01ff}
- 0: \x{19}
- 0: \x{e01ff}
-    
-/[[:^lower:]]/8g 
-    A\x{422}
- 0: A
- 0: \x{422}
-    
-/[[:^print:]]/8g 
-    \x{19}\x{e01ff}
- 0: \x{19}
- 0: \x{e01ff}
-    
-/[[:^punct:]]/8g 
-    A\x{442}
- 0: A
- 0: \x{442}
-    
-/[[:^space:]]/8g 
-    A\x{442}
- 0: A
- 0: \x{442}
-    
-/[[:^upper:]]/8g 
-    a\x{442}
- 0: a
- 0: \x{442}
-    
-/[[:^word:]]/8g  
-    +\x{2442}
- 0: +
- 0: \x{2442}
-    
-/[[:^xdigit:]]/8g
-    M\x{442}
- 0: M
- 0: \x{442}
-
-/[^ABCDEFGHIJKLMNOPQRSTUVWXYZÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞĀĂĄĆĈĊČĎĐĒĔĖĘĚĜĞĠĢĤĦĨĪĬĮİIJĴĶĹĻĽĿŁŃŅŇŊŌŎŐŒŔŖŘŚŜŞŠŢŤŦŨŪŬŮŰŲŴŶŸŹŻŽƁƂƄƆƇƉƊƋƎƏƐƑƓƔƖƗƘƜƝƟƠƢƤƦƧƩƬƮƯƱƲƳƵƷƸƼDŽLJNJǍǏǑǓǕǗǙǛǞǠǢǤǦǨǪǬǮDZǴǶǷǸǺǼǾȀȂȄȆȈȊȌȎȐȒȔȖȘȚȜȞȠȢȤȦȨȪȬȮȰȲȺȻȽȾɁΆΈΉΊΌΎΏΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩΪΫϒϓϔϘϚϜϞϠϢϤϦϨϪϬϮϴϷϹϺϽϾϿЀЁЂЃЄЅІЇЈЉЊЋЌЍЎЏАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯѠѢѤѦѨѪѬѮѰѲѴѶѸѺѼѾҀҊҌҎҐҒҔҖҘҚҜҞҠҢҤҦҨҪҬҮҰҲҴҶҸҺҼҾӀӁӃӅӇӉӋӍӐӒӔӖӘӚӜӞӠӢӤӦӨӪӬӮӰӲӴӶӸԀԂԄԆԈԊԌԎԱԲԳԴԵԶԷԸԹԺԻԼԽԾԿՀՁՂՃՄՅՆՇՈՉՊՋՌՍՎՏՐՑՒՓՔՕՖႠႡႢႣႤႥႦႧႨႩႪႫႬႭႮႯႰႱႲႳႴႵႶႷႸႹႺႻႼႽႾႿჀჁჂჃჄჅḀḂḄḆḈḊḌḎḐḒḔḖḘḚḜḞḠḢḤḦḨḪḬḮḰḲḴḶḸḺḼḾṀṂṄṆṈṊṌṎṐṒṔṖṘṚṜṞṠṢṤṦṨṪṬṮṰṲṴṶṸṺṼṾẀẂẄẆẈẊẌẎẐẒẔẠẢẤẦẨẪẬẮẰẲẴẶẸẺẼẾỀỂỄỆỈỊỌỎỐỒỔỖỘỚỜỞỠỢỤỦỨỪỬỮỰỲỴỶỸἈἉἊἋἌἍἎἏἘἙἚἛἜἝἨἩἪἫἬἭἮἯἸἹἺἻἼἽἾἿὈὉὊὋὌὍὙὛὝὟὨὩὪὫὬὭὮὯᾸᾹᾺΆῈΈῊΉῘῙῚΊῨῩῪΎῬῸΌῺΏabcdefghijklmnopqrstuvwxyzªµºßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿāăąćĉċčďđēĕėęěĝğġģĥħĩīĭįıijĵķĸĺļľŀłńņňʼnŋōŏőœŕŗřśŝşšţťŧũūŭůűųŵŷźżžſƀƃƅƈƌƍƒƕƙƚƛƞơƣƥƨƪƫƭưƴƶƹƺƽƾƿdžljnjǎǐǒǔǖǘǚǜǝǟǡǣǥǧǩǫǭǯǰdzǵǹǻǽǿȁȃȅȇȉȋȍȏȑȓȕȗșțȝȟȡȣȥȧȩȫȭȯȱȳȴȵȶȷȸȹȼȿɀɐɑɒɓɔɕɖɗɘəɚɛɜɝɞɟɠɡɢɣɤɥɦɧɨɩɪɫɬɭɮɯɰɱɲɳɴɵɶɷɸɹɺɻɼɽɾɿʀʁʂʃʄʅʆʇʈʉʊʋʌʍʎʏʐʑʒʓʔʕʖʗʘʙʚʛʜʝʞʟʠʡʢʣʤʥʦʧʨʩʪʫʬʭʮʯΐάέήίΰαβγδεζηθικλμνξοπρςστυφχψωϊϋόύώϐϑϕϖϗϙϛϝϟϡϣϥϧϩϫϭϯϰϱϲϳϵϸϻϼабвгдежзийклмнопрстуфхцчшщъыьэюяѐёђѓєѕіїјљњћќѝўџѡѣѥѧѩѫѭѯѱѳѵѷѹѻѽѿҁҋҍҏґғҕҗҙқҝҟҡңҥҧҩҫҭүұҳҵҷҹһҽҿӂӄӆӈӊӌӎӑӓӕӗәӛӝӟӡӣӥӧөӫӭӯӱӳӵӷӹԁԃԅԇԉԋԍԏաբգդեզէըթժիլխծկհձղճմյնշոչպջռսվտրցւփքօֆևᴀᴁᴂᴃᴄᴅᴆᴇᴈᴉᴊᴋᴌᴍᴎᴏᴐᴑᴒᴓᴔᴕᴖᴗᴘᴙᴚᴛᴜᴝᴞᴟᴠᴡᴢᴣᴤᴥᴦᴧᴨᴩᴪᴫᵢᵣᵤᵥᵦᵧᵨᵩᵪᵫᵬᵭᵮᵯᵰᵱᵲᵳᵴᵵᵶᵷᵹᵺᵻᵼᵽᵾᵿᶀᶁᶂᶃᶄᶅᶆᶇᶈᶉᶊᶋᶌᶍᶎᶏᶐᶑᶒᶓᶔᶕᶖᶗᶘᶙᶚḁḃḅḇḉḋḍḏḑḓḕḗḙḛḝḟḡḣḥḧḩḫḭḯḱḳḵḷḹḻḽḿṁṃṅṇṉṋṍṏṑṓṕṗṙṛṝṟṡṣṥṧṩṫṭṯṱṳṵṷṹṻṽṿẁẃẅẇẉẋẍẏẑẓẕẖẗẘẙẚẛạảấầẩẫậắằẳẵặẹẻẽếềểễệỉịọỏốồổỗộớờởỡợụủứừửữựỳỵỷỹἀἁἂἃἄἅἆἇἐἑἒἓἔἕἠἡἢἣἤἥἦἧἰἱἲἳἴἵἶἷὀὁὂὃὄὅὐὑὒὓὔὕὖὗὠὡὢὣὤὥὦὧὰάὲέὴήὶίὸόὺύὼώᾀᾁᾂᾃᾄᾅᾆᾇᾐᾑᾒᾓᾔᾕᾖᾗᾠᾡᾢᾣᾤᾥᾦᾧᾰᾱᾲᾳᾴᾶᾷιῂῃῄῆῇῐῑῒΐῖῗῠῡῢΰῤῥῦῧῲῳῴῶῷⲁⲃⲅⲇⲉⲋⲍⲏⲑⲓⲕⲗⲙⲛⲝⲟⲡⲣⲥⲧⲩⲫⲭⲯⲱⲳⲵⲷⲹⲻⲽⲿⳁⳃⳅⳇⳉⳋⳍⳏⳑⳓⳕⳗⳙⳛⳝⳟⳡⳣⳤⴀⴁⴂⴃⴄⴅⴆⴇⴈⴉⴊⴋⴌⴍⴎⴏⴐⴑⴒⴓⴔⴕⴖⴗⴘⴙⴚⴛⴜⴝⴞⴟⴠⴡⴢⴣⴤⴥfffiflffifflſtstﬓﬔﬕﬖﬗ\d-_^]/8
-
-/^[^d]*?$/
-    abc
- 0: abc
-
-/^[^d]*?$/8
-    abc
- 0: abc
-
-/^[^d]*?$/i
-    abc
- 0: abc
-
-/^[^d]*?$/8i
-    abc
- 0: abc
-
-/(?i)[\xc3\xa9\xc3\xbd]|[\xc3\xa9\xc3\xbdA]/8
-
-/^[a\x{c0}]b/8
-    \x{c0}b
- 0: \x{c0}b
-    
-/^([a\x{c0}]*?)aa/8
-    a\x{c0}aaaa/ 
- 0: a\x{c0}aa
- 1: a\x{c0}
-
-/^([a\x{c0}]*?)aa/8
-    a\x{c0}aaaa/ 
- 0: a\x{c0}aa
- 1: a\x{c0}
-    a\x{c0}a\x{c0}aaa/ 
- 0: a\x{c0}a\x{c0}aa
- 1: a\x{c0}a\x{c0}
-
-/^([a\x{c0}]*)aa/8
-    a\x{c0}aaaa/ 
- 0: a\x{c0}aaaa
- 1: a\x{c0}aa
-    a\x{c0}a\x{c0}aaa/ 
- 0: a\x{c0}a\x{c0}aaa
- 1: a\x{c0}a\x{c0}a
-
-/^([a\x{c0}]*)a\x{c0}/8
-    a\x{c0}aaaa/ 
- 0: a\x{c0}
- 1: 
-    a\x{c0}a\x{c0}aaa/ 
- 0: a\x{c0}a\x{c0}
- 1: a\x{c0}
-
-/A*/g8
-    AAB\x{123}BAA
- 0: AA
- 0: 
- 0: 
- 0: 
- 0: AA
- 0: 
-
-/(abc)\1/8i
-   abc
-No match
-
-/(abc)\1/8
-   abc
-No match
-
-/a(*:a\x{1234}b)/8K
-    abc
- 0: a
-MK: a\x{1234}b
-
-/a(*:a£b)/8K 
-    abc
- 0: a
-MK: a\x{a3}b
-
-/-- Noncharacters --/
-
-/./8
-    \x{fffe}
- 0: \x{fffe}
-    \x{ffff}
- 0: \x{ffff}
-    \x{1fffe}
- 0: \x{1fffe}
-    \x{1ffff}
- 0: \x{1ffff}
-    \x{2fffe}
- 0: \x{2fffe}
-    \x{2ffff}
- 0: \x{2ffff}
-    \x{3fffe}
- 0: \x{3fffe}
-    \x{3ffff}
- 0: \x{3ffff}
-    \x{4fffe}
- 0: \x{4fffe}
-    \x{4ffff}
- 0: \x{4ffff}
-    \x{5fffe}
- 0: \x{5fffe}
-    \x{5ffff}
- 0: \x{5ffff}
-    \x{6fffe}
- 0: \x{6fffe}
-    \x{6ffff}
- 0: \x{6ffff}
-    \x{7fffe}
- 0: \x{7fffe}
-    \x{7ffff}
- 0: \x{7ffff}
-    \x{8fffe}
- 0: \x{8fffe}
-    \x{8ffff}
- 0: \x{8ffff}
-    \x{9fffe}
- 0: \x{9fffe}
-    \x{9ffff}
- 0: \x{9ffff}
-    \x{afffe}
- 0: \x{afffe}
-    \x{affff}
- 0: \x{affff}
-    \x{bfffe}
- 0: \x{bfffe}
-    \x{bffff}
- 0: \x{bffff}
-    \x{cfffe}
- 0: \x{cfffe}
-    \x{cffff}
- 0: \x{cffff}
-    \x{dfffe}
- 0: \x{dfffe}
-    \x{dffff}
- 0: \x{dffff}
-    \x{efffe}
- 0: \x{efffe}
-    \x{effff}
- 0: \x{effff}
-    \x{ffffe}
- 0: \x{ffffe}
-    \x{fffff}
- 0: \x{fffff}
-    \x{10fffe}
- 0: \x{10fffe}
-    \x{10ffff}
- 0: \x{10ffff}
-    \x{fdd0}
- 0: \x{fdd0}
-    \x{fdd1}
- 0: \x{fdd1}
-    \x{fdd2}
- 0: \x{fdd2}
-    \x{fdd3}
- 0: \x{fdd3}
-    \x{fdd4}
- 0: \x{fdd4}
-    \x{fdd5}
- 0: \x{fdd5}
-    \x{fdd6}
- 0: \x{fdd6}
-    \x{fdd7}
- 0: \x{fdd7}
-    \x{fdd8}
- 0: \x{fdd8}
-    \x{fdd9}
- 0: \x{fdd9}
-    \x{fdda}
- 0: \x{fdda}
-    \x{fddb}
- 0: \x{fddb}
-    \x{fddc}
- 0: \x{fddc}
-    \x{fddd}
- 0: \x{fddd}
-    \x{fdde}
- 0: \x{fdde}
-    \x{fddf}
- 0: \x{fddf}
-    \x{fde0}
- 0: \x{fde0}
-    \x{fde1}
- 0: \x{fde1}
-    \x{fde2}
- 0: \x{fde2}
-    \x{fde3}
- 0: \x{fde3}
-    \x{fde4}
- 0: \x{fde4}
-    \x{fde5}
- 0: \x{fde5}
-    \x{fde6}
- 0: \x{fde6}
-    \x{fde7}
- 0: \x{fde7}
-    \x{fde8}
- 0: \x{fde8}
-    \x{fde9}
- 0: \x{fde9}
-    \x{fdea}
- 0: \x{fdea}
-    \x{fdeb}
- 0: \x{fdeb}
-    \x{fdec}
- 0: \x{fdec}
-    \x{fded}
- 0: \x{fded}
-    \x{fdee}
- 0: \x{fdee}
-    \x{fdef}
- 0: \x{fdef}
-
-/^\d*\w{4}/8
-    1234
- 0: 1234
-    123 
-No match
-    
-/^[^b]*\w{4}/8
-    aaaa
- 0: aaaa
-    aaa  
-No match
- 
-/^[^b]*\w{4}/8i
-    aaaa
- 0: aaaa
-    aaa  
-No match
- 
-/^\x{100}*.{4}/8
-    \x{100}\x{100}\x{100}\x{100}
- 0: \x{100}\x{100}\x{100}\x{100}
-    \x{100}\x{100}\x{100}
-No match
-
-/^\x{100}*.{4}/8i
-    \x{100}\x{100}\x{100}\x{100}
- 0: \x{100}\x{100}\x{100}\x{100}
-    \x{100}\x{100}\x{100}
-No match
-
-/^a+[a\x{200}]/8
-    aa
- 0: aa
-
-/^.\B.\B./8
-    \x{10123}\x{10124}\x{10125}
- 0: \x{10123}\x{10124}\x{10125}
-
-/^#[^\x{ffff}]#[^\x{ffff}]#[^\x{ffff}]#/8
-    #\x{10000}#\x{100}#\x{10ffff}#
- 0: #\x{10000}#\x{100}#\x{10ffff}#
-
-"[\S\V\H]"8
-
-/\C(\W?ſ)'?{{/8
-    \\C(\\W?ſ)'?{{
-No match
-
-/-- End of testinput4 --/
diff --git a/dist/testdata/testoutput5 b/dist/testdata/testoutput5
deleted file mode 100644
index bab989c..0000000
--- a/dist/testdata/testoutput5
+++ /dev/null
Binary files differ
diff --git a/dist/testdata/testoutput6 b/dist/testdata/testoutput6
deleted file mode 100644
index beb85aa..0000000
--- a/dist/testdata/testoutput6
+++ /dev/null
@@ -1,2560 +0,0 @@
-/-- This set of tests is for Unicode property support. It is compatible with
-    Perl >= 5.15. --/
-    
-< forbid 9?=ABCDEFfGILMNPTUXZ<
-
-/^\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
-    \x{e0000}
- 0: \x{e0000}
-    ** Failers
-No match
-    \x{09f} 
-No match
-  
-/^\p{Co}/8
-    \x{f8ff}
- 0: \x{f8ff}
-    ** Failers
-No match
-    \x{09f} 
-No match
-  
-/^\p{Ll}/8
-    a
- 0: a
-    ** Failers 
-No match
-    Z
-No match
-    \x{e000}  
-No match
-  
-/^\p{Lm}/8
-    \x{2b0}
- 0: \x{2b0}
-    ** Failers
-No match
-    a 
-No match
-  
-/^\p{Lo}/8
-    \x{1bb}
- 0: \x{1bb}
-    \x{3400}
- 0: \x{3400}
-    \x{3401}
- 0: \x{3401}
-    \x{4d00}
- 0: \x{4d00}
-    \x{4db4}
- 0: \x{4db4}
-    \x{4db5}     
- 0: \x{4db5}
-    ** Failers
-No match
-    a 
-No match
-    \x{2b0}
-No match
-    \x{4db6} 
-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{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{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
-  
-/(?<=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
-    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{Ll}/8 
-    a
- 0: a
-    Az
- 0: z
-    ** Failers
- 0: a
-    ABC   
-No match
-
-/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}
-
-/\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]/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
-
-/^\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}
-    \x{300}  
- 0: \x{300}
-
-/^\p{Han}+/8
-    \x{2e81}\x{3007}\x{2f804}\x{31a0}
- 0: \x{2e81}\x{3007}\x{2f804}
-    ** Failers
-No match
-    \x{2e7f}  
-No match
-
-/^\P{Katakana}+/8
-    \x{3105}
- 0: \x{3105}
-    ** Failers
- 0: ** Failers
-    \x{30ff}  
-No match
-
-/^[\p{Arabic}]/8
-    \x{06e9}
- 0: \x{6e9}
-    \x{060b}
- 0: \x{60b}
-    ** Failers
-No match
-    \x{061c}
-No match
-    X\x{06e9}   
-No match
-
-/^[\P{Yi}]/8
-    \x{2f800}
- 0: \x{2f800}
-    ** Failers
- 0: *
-    \x{a014}
-No match
-    \x{a4c6}   
-No match
-    
-/^\p{Any}X/8
-    AXYZ
- 0: AX
-    \x{1234}XYZ 
- 0: \x{1234}X
-    ** Failers
-No match
-    X  
-No match
-    
-/^\P{Any}X/8
-    ** Failers
-No match
-    AX
-No match
-    
-/^\p{Any}?X/8
-    XYZ
- 0: X
-    AXYZ
- 0: AX
-    \x{1234}XYZ 
- 0: \x{1234}X
-    ** Failers
-No match
-    ABXYZ   
-No match
-
-/^\P{Any}?X/8
-    XYZ
- 0: X
-    ** Failers
-No match
-    AXYZ
-No match
-    \x{1234}XYZ 
-No match
-    ABXYZ   
-No match
-
-/^\p{Any}+X/8
-    AXYZ
- 0: AX
-    \x{1234}XYZ
- 0: \x{1234}X
-    A\x{1234}XYZ
- 0: A\x{1234}X
-    ** Failers
-No match
-    XYZ
-No match
-
-/^\P{Any}+X/8
-    ** Failers
-No match
-    AXYZ
-No match
-    \x{1234}XYZ
-No match
-    A\x{1234}XYZ
-No match
-    XYZ
-No match
-
-/^\p{Any}*X/8
-    XYZ
- 0: X
-    AXYZ
- 0: AX
-    \x{1234}XYZ
- 0: \x{1234}X
-    A\x{1234}XYZ
- 0: A\x{1234}X
-    ** Failers
-No match
-
-/^\P{Any}*X/8
-    XYZ
- 0: X
-    ** Failers
-No match
-    AXYZ
-No match
-    \x{1234}XYZ
-No match
-    A\x{1234}XYZ
-No match
-
-/^[\p{Any}]X/8
-    AXYZ
- 0: AX
-    \x{1234}XYZ 
- 0: \x{1234}X
-    ** Failers
-No match
-    X  
-No match
-    
-/^[\P{Any}]X/8
-    ** Failers
-No match
-    AX
-No match
-    
-/^[\p{Any}]?X/8
-    XYZ
- 0: X
-    AXYZ
- 0: AX
-    \x{1234}XYZ 
- 0: \x{1234}X
-    ** Failers
-No match
-    ABXYZ   
-No match
-
-/^[\P{Any}]?X/8
-    XYZ
- 0: X
-    ** Failers
-No match
-    AXYZ
-No match
-    \x{1234}XYZ 
-No match
-    ABXYZ   
-No match
-
-/^[\p{Any}]+X/8
-    AXYZ
- 0: AX
-    \x{1234}XYZ
- 0: \x{1234}X
-    A\x{1234}XYZ
- 0: A\x{1234}X
-    ** Failers
-No match
-    XYZ
-No match
-
-/^[\P{Any}]+X/8
-    ** Failers
-No match
-    AXYZ
-No match
-    \x{1234}XYZ
-No match
-    A\x{1234}XYZ
-No match
-    XYZ
-No match
-
-/^[\p{Any}]*X/8
-    XYZ
- 0: X
-    AXYZ
- 0: AX
-    \x{1234}XYZ
- 0: \x{1234}X
-    A\x{1234}XYZ
- 0: A\x{1234}X
-    ** Failers
-No match
-
-/^[\P{Any}]*X/8
-    XYZ
- 0: X
-    ** Failers
-No match
-    AXYZ
-No match
-    \x{1234}XYZ
-No match
-    A\x{1234}XYZ
-No match
-
-/^\p{Any}{3,5}?/8
-    abcdefgh
- 0: abc
-    \x{1234}\n\r\x{3456}xyz 
- 0: \x{1234}\x{0a}\x{0d}
-
-/^\p{Any}{3,5}/8
-    abcdefgh
- 0: abcde
-    \x{1234}\n\r\x{3456}xyz 
- 0: \x{1234}\x{0a}\x{0d}\x{3456}x
-
-/^\P{Any}{3,5}?/8
-    ** Failers
-No match
-    abcdefgh
-No match
-    \x{1234}\n\r\x{3456}xyz 
-No match
-
-/^\p{L&}X/8
-     AXY
- 0: AX
-     aXY
- 0: aX
-     \x{1c5}XY
- 0: \x{1c5}X
-     ** Failers
-No match
-     \x{1bb}XY
-No match
-     \x{2b0}XY
-No match
-     !XY      
-No match
-
-/^[\p{L&}]X/8
-     AXY
- 0: AX
-     aXY
- 0: aX
-     \x{1c5}XY
- 0: \x{1c5}X
-     ** Failers
-No match
-     \x{1bb}XY
-No match
-     \x{2b0}XY
-No match
-     !XY      
-No match
-
-/^\p{L&}+X/8
-     AXY
- 0: AX
-     aXY
- 0: aX
-     AbcdeXyz 
- 0: AbcdeX
-     \x{1c5}AbXY
- 0: \x{1c5}AbX
-     abcDEXypqreXlmn 
- 0: abcDEXypqreX
-     ** Failers
-No match
-     \x{1bb}XY
-No match
-     \x{2b0}XY
-No match
-     !XY      
-No match
-
-/^[\p{L&}]+X/8
-     AXY
- 0: AX
-     aXY
- 0: aX
-     AbcdeXyz 
- 0: AbcdeX
-     \x{1c5}AbXY
- 0: \x{1c5}AbX
-     abcDEXypqreXlmn 
- 0: abcDEXypqreX
-     ** Failers
-No match
-     \x{1bb}XY
-No match
-     \x{2b0}XY
-No match
-     !XY      
-No match
-
-/^\p{L&}+?X/8
-     AXY
- 0: AX
-     aXY
- 0: aX
-     AbcdeXyz 
- 0: AbcdeX
-     \x{1c5}AbXY
- 0: \x{1c5}AbX
-     abcDEXypqreXlmn 
- 0: abcDEX
-     ** Failers
-No match
-     \x{1bb}XY
-No match
-     \x{2b0}XY
-No match
-     !XY      
-No match
-
-/^[\p{L&}]+?X/8
-     AXY
- 0: AX
-     aXY
- 0: aX
-     AbcdeXyz 
- 0: AbcdeX
-     \x{1c5}AbXY
- 0: \x{1c5}AbX
-     abcDEXypqreXlmn 
- 0: abcDEX
-     ** Failers
-No match
-     \x{1bb}XY
-No match
-     \x{2b0}XY
-No match
-     !XY      
-No match
-
-/^\P{L&}X/8
-     !XY
- 0: !X
-     \x{1bb}XY
- 0: \x{1bb}X
-     \x{2b0}XY
- 0: \x{2b0}X
-     ** Failers
-No match
-     \x{1c5}XY
-No match
-     AXY      
-No match
-
-/^[\P{L&}]X/8
-     !XY
- 0: !X
-     \x{1bb}XY
- 0: \x{1bb}X
-     \x{2b0}XY
- 0: \x{2b0}X
-     ** Failers
-No match
-     \x{1c5}XY
-No match
-     AXY      
-No match
-
-/^(\p{Z}[^\p{C}\p{Z}]+)*$/
-    \xa0!
- 0: \xa0!
- 1: \xa0!
-
-/^[\pL](abc)(?1)/
-    AabcabcYZ    
- 0: Aabcabc
- 1: abc
-
-/([\pL]=(abc))*X/
-    L=abcX
- 0: L=abcX
- 1: L=abc
- 2: abc
-
-/^\p{Balinese}\p{Cuneiform}\p{Nko}\p{Phags_Pa}\p{Phoenician}/8
-    \x{1b00}\x{12000}\x{7c0}\x{a840}\x{10900}
- 0: \x{1b00}\x{12000}\x{7c0}\x{a840}\x{10900}
-
-/Check property support in non-UTF-8 mode/
- 
-/\p{L}{4}/
-    123abcdefg
- 0: abcd
-    123abc\xc4\xc5zz
- 0: abc\xc4
-
-/\X{1,3}\d/
-  \x8aBCD
-No match
-  
-/\X?\d/
-  \x8aBCD 
-No match
-
-/\P{L}?\d/
-  \x8aBCD 
-No match
-
-/[\PPP\x8a]{1,}\x80/
-    A\x80
- 0: A\x80
-
-/^[\p{Arabic}]/8
-    \x{604}
- 0: \x{604}
-    \x{60e} 
- 0: \x{60e}
-    \x{656} 
- 0: \x{656}
-    \x{657} 
- 0: \x{657}
-    \x{658} 
- 0: \x{658}
-    \x{659} 
- 0: \x{659}
-    \x{65a} 
- 0: \x{65a}
-    \x{65b} 
- 0: \x{65b}
-    \x{65c} 
- 0: \x{65c}
-    \x{65d} 
- 0: \x{65d}
-    \x{65e} 
- 0: \x{65e}
-    \x{65f}
- 0: \x{65f}
-    \x{66a} 
- 0: \x{66a}
-    \x{6e9} 
- 0: \x{6e9}
-    \x{6ef}
- 0: \x{6ef}
-    \x{6fa}  
- 0: \x{6fa}
-    ** Failers
-No match
-    \x{650}
-No match
-    \x{651}  
-No match
-    \x{652}  
-No match
-    \x{653}  
-No match
-    \x{654} 
-No match
-    \x{655} 
-No match
-    
-/^\p{Cyrillic}/8
-    \x{1d2b} 
- 0: \x{1d2b}
-    
-/^\p{Common}/8
-    \x{589}
- 0: \x{589}
-    \x{60c}
- 0: \x{60c}
-    \x{61f}  
- 0: \x{61f}
-    \x{964}
- 0: \x{964}
-    \x{965}  
- 0: \x{965}
-
-/^\p{Inherited}/8
-    \x{64b}
- 0: \x{64b}
-    \x{654}
- 0: \x{654}
-    \x{655}
- 0: \x{655}
-    \x{200c} 
- 0: \x{200c}
-    ** Failers
-No match
-    \x{64a}
-No match
-    \x{656}     
-No match
-
-/^\p{Shavian}/8
-    \x{10450}
- 0: \x{10450}
-    \x{1047f}
- 0: \x{1047f}
-    
-/^\p{Deseret}/8
-    \x{10400}
- 0: \x{10400}
-    \x{1044f}
- 0: \x{1044f}
-    
-/^\p{Osmanya}/8
-    \x{10480}
- 0: \x{10480}
-    \x{1049d}
- 0: \x{1049d}
-    \x{104a0}
- 0: \x{104a0}
-    \x{104a9}
- 0: \x{104a9}
-    ** Failers
-No match
-    \x{1049e}
-No match
-    \x{1049f}
-No match
-    \x{104aa}           
-No match
-
-/\p{Carian}\p{Cham}\p{Kayah_Li}\p{Lepcha}\p{Lycian}\p{Lydian}\p{Ol_Chiki}\p{Rejang}\p{Saurashtra}\p{Sundanese}\p{Vai}/8
-    \x{102A4}\x{AA52}\x{A91D}\x{1C46}\x{10283}\x{1092E}\x{1C6B}\x{A93B}\x{A8BF}\x{1BA0}\x{A50A}====
- 0: \x{102a4}\x{aa52}\x{a91d}\x{1c46}\x{10283}\x{1092e}\x{1c6b}\x{a93b}\x{a8bf}\x{1ba0}\x{a50a}
-
-/\x{a77d}\x{1d79}/8i
-    \x{a77d}\x{1d79}
- 0: \x{a77d}\x{1d79}
-    \x{1d79}\x{a77d} 
- 0: \x{1d79}\x{a77d}
-
-/\x{a77d}\x{1d79}/8
-    \x{a77d}\x{1d79}
- 0: \x{a77d}\x{1d79}
-    ** Failers 
-No match
-    \x{1d79}\x{a77d} 
-No match
-
-/(A)\1/8i
-    AA
- 0: AA
- 1: A
-    Aa
- 0: Aa
- 1: A
-    aa
- 0: aa
- 1: a
-    aA
- 0: aA
- 1: a
-
-/(\x{10a})\1/8i
-    \x{10a}\x{10a}
- 0: \x{10a}\x{10a}
- 1: \x{10a}
-    \x{10a}\x{10b}
- 0: \x{10a}\x{10b}
- 1: \x{10a}
-    \x{10b}\x{10b}
- 0: \x{10b}\x{10b}
- 1: \x{10b}
-    \x{10b}\x{10a}
- 0: \x{10b}\x{10a}
- 1: \x{10b}
-    
-/The next two tests are for property support in non-UTF-8 mode/
-
-/(?:\p{Lu}|\x20)+/
-    \x41\x20\x50\xC2\x54\xC9\x20\x54\x4F\x44\x41\x59
- 0: A P\xc2T\xc9 TODAY
-
-/[\p{Lu}\x20]+/
-    \x41\x20\x50\xC2\x54\xC9\x20\x54\x4F\x44\x41\x59
- 0: A P\xc2T\xc9 TODAY
-
-/\p{Avestan}\p{Bamum}\p{Egyptian_Hieroglyphs}\p{Imperial_Aramaic}\p{Inscriptional_Pahlavi}\p{Inscriptional_Parthian}\p{Javanese}\p{Kaithi}\p{Lisu}\p{Meetei_Mayek}\p{Old_South_Arabian}\p{Old_Turkic}\p{Samaritan}\p{Tai_Tham}\p{Tai_Viet}/8
-    \x{10b00}\x{a6ef}\x{13007}\x{10857}\x{10b78}\x{10b58}\x{a980}\x{110c1}\x{a4ff}\x{abc0}\x{10a7d}\x{10c48}\x{0800}\x{1aad}\x{aac0}
- 0: \x{10b00}\x{a6ef}\x{13007}\x{10857}\x{10b78}\x{10b58}\x{a980}\x{110c1}\x{a4ff}\x{abc0}\x{10a7d}\x{10c48}\x{800}\x{1aad}\x{aac0}
-
-/^\w+/8W
-    Az_\x{aa}\x{c0}\x{1c5}\x{2b0}\x{3b6}\x{1d7c9}\x{2fa1d}1\x{660}\x{bef}\x{16ee}
- 0: Az_\x{aa}\x{c0}\x{1c5}\x{2b0}\x{3b6}\x{1d7c9}\x{2fa1d}1\x{660}\x{bef}\x{16ee}
-
-/^[[:xdigit:]]*/8W
-    1a\x{660}\x{bef}\x{16ee}
- 0: 1a
-  
-/^\d+/8W
-    1\x{660}\x{bef}\x{16ee}
- 0: 1\x{660}\x{bef}
-  
-/^[[:digit:]]+/8W
-    1\x{660}\x{bef}\x{16ee}
- 0: 1\x{660}\x{bef}
-
-/^>\s+/8W
-    >\x{20}\x{a0}\x{1680}\x{2028}\x{2029}\x{202f}\x{9}\x{b} 
- 0: > \x{a0}\x{1680}\x{2028}\x{2029}\x{202f}\x{09}\x{0b}
-  
-/^>\pZ+/8W
-    >\x{20}\x{a0}\x{1680}\x{2028}\x{2029}\x{202f}\x{9}\x{b} 
- 0: > \x{a0}\x{1680}\x{2028}\x{2029}\x{202f}
-  
-/^>[[:space:]]*/8W
-    >\x{20}\x{a0}\x{1680}\x{2028}\x{2029}\x{202f}\x{9}\x{b} 
- 0: > \x{a0}\x{1680}\x{2028}\x{2029}\x{202f}\x{09}\x{0b}
-
-/^>[[:blank:]]*/8W
-    >\x{20}\x{a0}\x{1680}\x{180e}\x{2000}\x{202f}\x{9}\x{b}\x{2028} 
- 0: > \x{a0}\x{1680}\x{180e}\x{2000}\x{202f}\x{09}
-
-/^[[:alpha:]]*/8W
-    Az\x{aa}\x{c0}\x{1c5}\x{2b0}\x{3b6}\x{1d7c9}\x{2fa1d}
- 0: Az\x{aa}\x{c0}\x{1c5}\x{2b0}\x{3b6}\x{1d7c9}\x{2fa1d}
-
-/^[[:alnum:]]*/8W
-    Az\x{aa}\x{c0}\x{1c5}\x{2b0}\x{3b6}\x{1d7c9}\x{2fa1d}1\x{660}\x{bef}\x{16ee}
- 0: Az\x{aa}\x{c0}\x{1c5}\x{2b0}\x{3b6}\x{1d7c9}\x{2fa1d}1\x{660}\x{bef}\x{16ee}
-
-/^[[:cntrl:]]*/8W
-    \x{0}\x{09}\x{1f}\x{7f}\x{9f} 
- 0: \x{00}\x{09}\x{1f}\x{7f}
-
-/^[[:graph:]]*/8W
-    A\x{a1}\x{a0}
- 0: A\x{a1}
-
-/^[[:print:]]*/8W
-    A z\x{a0}\x{a1}
- 0: A z\x{a0}\x{a1}
-
-/^[[:punct:]]*/8W
-    .+\x{a1}\x{a0}
- 0: .+\x{a1}
-
-/\p{Zs}*?\R/
-    ** Failers
-No match
-    a\xFCb   
-No match
-
-/\p{Zs}*\R/                                                                    
-    ** Failers 
-No match
-    a\xFCb   
-No match
-
-/ⱥ/8i
-    ⱥ
- 0: \x{2c65}
-    Ⱥx 
- 0: \x{23a}
-    Ⱥ 
- 0: \x{23a}
-
-/[ⱥ]/8i
-    ⱥ
- 0: \x{2c65}
-    Ⱥx 
- 0: \x{23a}
-    Ⱥ 
- 0: \x{23a}
-
-/Ⱥ/8i
-    Ⱥ
- 0: \x{23a}
-    ⱥ
- 0: \x{2c65}
-    
-/-- These are tests for extended grapheme clusters --/ 
-
-/^\X/8+
-    G\x{34e}\x{34e}X
- 0: G\x{34e}\x{34e}
- 0+ X
-    \x{34e}\x{34e}X
- 0: \x{34e}\x{34e}
- 0+ X
-    \x04X
- 0: \x{04}
- 0+ X
-    \x{1100}X
- 0: \x{1100}
- 0+ X
-    \x{1100}\x{34e}X
- 0: \x{1100}\x{34e}
- 0+ X
-    \x{1b04}\x{1b04}X 
- 0: \x{1b04}\x{1b04}
- 0+ X
-    *These match up to the roman letters
- 0: *
- 0+ These match up to the roman letters
-    \x{1111}\x{1111}L,L
- 0: \x{1111}\x{1111}
- 0+ L,L
-    \x{1111}\x{1111}\x{1169}L,L,V
- 0: \x{1111}\x{1111}\x{1169}
- 0+ L,L,V
-    \x{1111}\x{ae4c}L, LV
- 0: \x{1111}\x{ae4c}
- 0+ L, LV
-    \x{1111}\x{ad89}L, LVT
- 0: \x{1111}\x{ad89}
- 0+ L, LVT
-    \x{1111}\x{ae4c}\x{1169}L, LV, V
- 0: \x{1111}\x{ae4c}\x{1169}
- 0+ L, LV, V
-    \x{1111}\x{ae4c}\x{1169}\x{1169}L, LV, V, V
- 0: \x{1111}\x{ae4c}\x{1169}\x{1169}
- 0+ L, LV, V, V
-    \x{1111}\x{ae4c}\x{1169}\x{11fe}L, LV, V, T
- 0: \x{1111}\x{ae4c}\x{1169}\x{11fe}
- 0+ L, LV, V, T
-    \x{1111}\x{ad89}\x{11fe}L, LVT, T
- 0: \x{1111}\x{ad89}\x{11fe}
- 0+ L, LVT, T
-    \x{1111}\x{ad89}\x{11fe}\x{11fe}L, LVT, T, T
- 0: \x{1111}\x{ad89}\x{11fe}\x{11fe}
- 0+ L, LVT, T, T
-    \x{ad89}\x{11fe}\x{11fe}LVT, T, T
- 0: \x{ad89}\x{11fe}\x{11fe}
- 0+ LVT, T, T
-    *These match just the first codepoint (invalid sequence)
- 0: *
- 0+ These match just the first codepoint (invalid sequence)
-    \x{1111}\x{11fe}L, T
- 0: \x{1111}
- 0+ \x{11fe}L, T
-    \x{ae4c}\x{1111}LV, L
- 0: \x{ae4c}
- 0+ \x{1111}LV, L
-    \x{ae4c}\x{ae4c}LV, LV
- 0: \x{ae4c}
- 0+ \x{ae4c}LV, LV
-    \x{ae4c}\x{ad89}LV, LVT
- 0: \x{ae4c}
- 0+ \x{ad89}LV, LVT
-    \x{1169}\x{1111}V, L
- 0: \x{1169}
- 0+ \x{1111}V, L
-    \x{1169}\x{ae4c}V, LV
- 0: \x{1169}
- 0+ \x{ae4c}V, LV
-    \x{1169}\x{ad89}V, LVT
- 0: \x{1169}
- 0+ \x{ad89}V, LVT
-    \x{ad89}\x{1111}LVT, L
- 0: \x{ad89}
- 0+ \x{1111}LVT, L
-    \x{ad89}\x{1169}LVT, V
- 0: \x{ad89}
- 0+ \x{1169}LVT, V
-    \x{ad89}\x{ae4c}LVT, LV
- 0: \x{ad89}
- 0+ \x{ae4c}LVT, LV
-    \x{ad89}\x{ad89}LVT, LVT
- 0: \x{ad89}
- 0+ \x{ad89}LVT, LVT
-    \x{11fe}\x{1111}T, L
- 0: \x{11fe}
- 0+ \x{1111}T, L
-    \x{11fe}\x{1169}T, V
- 0: \x{11fe}
- 0+ \x{1169}T, V
-    \x{11fe}\x{ae4c}T, LV
- 0: \x{11fe}
- 0+ \x{ae4c}T, LV
-    \x{11fe}\x{ad89}T, LVT
- 0: \x{11fe}
- 0+ \x{ad89}T, LVT
-    *Test extend and spacing mark
- 0: *
- 0+ Test extend and spacing mark
-    \x{1111}\x{ae4c}\x{0711}L, LV, extend
- 0: \x{1111}\x{ae4c}\x{711}
- 0+ L, LV, extend
-    \x{1111}\x{ae4c}\x{1b04}L, LV, spacing mark
- 0: \x{1111}\x{ae4c}\x{1b04}
- 0+ L, LV, spacing mark
-    \x{1111}\x{ae4c}\x{1b04}\x{0711}\x{1b04}L, LV, spacing mark, extend, spacing mark
- 0: \x{1111}\x{ae4c}\x{1b04}\x{711}\x{1b04}
- 0+ L, LV, spacing mark, extend, spacing mark
-    *Test CR, LF, and control
- 0: *
- 0+ Test CR, LF, and control
-    \x0d\x{0711}CR, extend
- 0: \x{0d}
- 0+ \x{711}CR, extend
-    \x0d\x{1b04}CR, spacingmark
- 0: \x{0d}
- 0+ \x{1b04}CR, spacingmark
-    \x0a\x{0711}LF, extend
- 0: \x{0a}
- 0+ \x{711}LF, extend
-    \x0a\x{1b04}LF, spacingmark
- 0: \x{0a}
- 0+ \x{1b04}LF, spacingmark
-    \x0b\x{0711}Control, extend
- 0: \x{0b}
- 0+ \x{711}Control, extend
-    \x09\x{1b04}Control, spacingmark
- 0: \x{09}
- 0+ \x{1b04}Control, spacingmark
-    *There are no Prepend characters, so we can't test Prepend, CR
- 0: *
- 0+ There are no Prepend characters, so we can't test Prepend, CR
-    
-/^(?>\X{2})X/8+
-    \x{1111}\x{ae4c}\x{1111}\x{ae4c}X
- 0: \x{1111}\x{ae4c}\x{1111}\x{ae4c}X
- 0+ 
-    
-/^\X{2,4}X/8+
-    \x{1111}\x{ae4c}\x{1111}\x{ae4c}X
- 0: \x{1111}\x{ae4c}\x{1111}\x{ae4c}X
- 0+ 
-    \x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}X
- 0: \x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}X
- 0+ 
-    \x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}X
- 0: \x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}X
- 0+ 
-
-/^\X{2,4}?X/8+
-    \x{1111}\x{ae4c}\x{1111}\x{ae4c}X
- 0: \x{1111}\x{ae4c}\x{1111}\x{ae4c}X
- 0+ 
-    \x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}X
- 0: \x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}X
- 0+ 
-    \x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}X
- 0: \x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}X
- 0+ 
-
-/\X*Z/8Y
-  A\x{300}
-No match
-
-/\X*(.)/8Y
-  A\x{1111}\x{ae4c}\x{1169}
- 0: A\x{1111}
- 1: \x{1111}
-
-/\X?abc/8Y
-\xff\x7f\x00\x00\x03\x00\x41\xcc\x80\x41\x{300}\x61\x62\x63\x00\>06\?
- 0: A\x{300}abc
-
-/-- --/
-
-/\x{1e9e}+/8i
-    \x{1e9e}\x{00df}
- 0: \x{1e9e}\x{df}
-
-/[z\x{1e9e}]+/8i
-    \x{1e9e}\x{00df}
- 0: \x{1e9e}\x{df}
-
-/\x{00df}+/8i
-    \x{1e9e}\x{00df}
- 0: \x{1e9e}\x{df}
-
-/[z\x{00df}]+/8i
-    \x{1e9e}\x{00df}
- 0: \x{1e9e}\x{df}
-
-/\x{1f88}+/8i
-    \x{1f88}\x{1f80} 
- 0: \x{1f88}\x{1f80}
-
-/[z\x{1f88}]+/8i
-    \x{1f88}\x{1f80} 
- 0: \x{1f88}\x{1f80}
-    
-/-- Characters with more than one other case; test in classes --/
-
-/[z\x{00b5}]+/8i
-    \x{00b5}\x{039c}\x{03bc}
- 0: \x{b5}\x{39c}\x{3bc}
-
-/[z\x{039c}]+/8i
-    \x{00b5}\x{039c}\x{03bc}
- 0: \x{b5}\x{39c}\x{3bc}
-
-/[z\x{03bc}]+/8i
-    \x{00b5}\x{039c}\x{03bc}
- 0: \x{b5}\x{39c}\x{3bc}
-
-/[z\x{00c5}]+/8i
-    \x{00c5}\x{00e5}\x{212b}
- 0: \x{c5}\x{e5}\x{212b}
-
-/[z\x{00e5}]+/8i
-    \x{00c5}\x{00e5}\x{212b}
- 0: \x{c5}\x{e5}\x{212b}
-
-/[z\x{212b}]+/8i
-    \x{00c5}\x{00e5}\x{212b}
- 0: \x{c5}\x{e5}\x{212b}
-
-/[z\x{01c4}]+/8i
-    \x{01c4}\x{01c5}\x{01c6}
- 0: \x{1c4}\x{1c5}\x{1c6}
-
-/[z\x{01c5}]+/8i
-    \x{01c4}\x{01c5}\x{01c6}
- 0: \x{1c4}\x{1c5}\x{1c6}
-
-/[z\x{01c6}]+/8i
-    \x{01c4}\x{01c5}\x{01c6}
- 0: \x{1c4}\x{1c5}\x{1c6}
-
-/[z\x{01c7}]+/8i
-    \x{01c7}\x{01c8}\x{01c9}
- 0: \x{1c7}\x{1c8}\x{1c9}
-
-/[z\x{01c8}]+/8i
-    \x{01c7}\x{01c8}\x{01c9}
- 0: \x{1c7}\x{1c8}\x{1c9}
-
-/[z\x{01c9}]+/8i
-    \x{01c7}\x{01c8}\x{01c9}
- 0: \x{1c7}\x{1c8}\x{1c9}
-
-/[z\x{01ca}]+/8i
-    \x{01ca}\x{01cb}\x{01cc}
- 0: \x{1ca}\x{1cb}\x{1cc}
-
-/[z\x{01cb}]+/8i
-    \x{01ca}\x{01cb}\x{01cc}
- 0: \x{1ca}\x{1cb}\x{1cc}
-
-/[z\x{01cc}]+/8i
-    \x{01ca}\x{01cb}\x{01cc}
- 0: \x{1ca}\x{1cb}\x{1cc}
-
-/[z\x{01f1}]+/8i
-    \x{01f1}\x{01f2}\x{01f3}
- 0: \x{1f1}\x{1f2}\x{1f3}
-
-/[z\x{01f2}]+/8i
-    \x{01f1}\x{01f2}\x{01f3}
- 0: \x{1f1}\x{1f2}\x{1f3}
-
-/[z\x{01f3}]+/8i
-    \x{01f1}\x{01f2}\x{01f3}
- 0: \x{1f1}\x{1f2}\x{1f3}
-
-/[z\x{0345}]+/8i
-    \x{0345}\x{0399}\x{03b9}\x{1fbe}
- 0: \x{345}\x{399}\x{3b9}\x{1fbe}
-
-/[z\x{0399}]+/8i
-    \x{0345}\x{0399}\x{03b9}\x{1fbe}
- 0: \x{345}\x{399}\x{3b9}\x{1fbe}
-
-/[z\x{03b9}]+/8i
-    \x{0345}\x{0399}\x{03b9}\x{1fbe}
- 0: \x{345}\x{399}\x{3b9}\x{1fbe}
-
-/[z\x{1fbe}]+/8i
-    \x{0345}\x{0399}\x{03b9}\x{1fbe}
- 0: \x{345}\x{399}\x{3b9}\x{1fbe}
-
-/[z\x{0392}]+/8i
-    \x{0392}\x{03b2}\x{03d0}
- 0: \x{392}\x{3b2}\x{3d0}
-
-/[z\x{03b2}]+/8i
-    \x{0392}\x{03b2}\x{03d0}
- 0: \x{392}\x{3b2}\x{3d0}
-
-/[z\x{03d0}]+/8i
-    \x{0392}\x{03b2}\x{03d0}
- 0: \x{392}\x{3b2}\x{3d0}
-
-/[z\x{0395}]+/8i
-    \x{0395}\x{03b5}\x{03f5}
- 0: \x{395}\x{3b5}\x{3f5}
-
-/[z\x{03b5}]+/8i
-    \x{0395}\x{03b5}\x{03f5}
- 0: \x{395}\x{3b5}\x{3f5}
-
-/[z\x{03f5}]+/8i
-    \x{0395}\x{03b5}\x{03f5}
- 0: \x{395}\x{3b5}\x{3f5}
-
-/[z\x{0398}]+/8i
-    \x{0398}\x{03b8}\x{03d1}\x{03f4}
- 0: \x{398}\x{3b8}\x{3d1}\x{3f4}
-
-/[z\x{03b8}]+/8i
-    \x{0398}\x{03b8}\x{03d1}\x{03f4}
- 0: \x{398}\x{3b8}\x{3d1}\x{3f4}
-
-/[z\x{03d1}]+/8i
-    \x{0398}\x{03b8}\x{03d1}\x{03f4}
- 0: \x{398}\x{3b8}\x{3d1}\x{3f4}
-
-/[z\x{03f4}]+/8i
-    \x{0398}\x{03b8}\x{03d1}\x{03f4}
- 0: \x{398}\x{3b8}\x{3d1}\x{3f4}
-
-/[z\x{039a}]+/8i
-    \x{039a}\x{03ba}\x{03f0}
- 0: \x{39a}\x{3ba}\x{3f0}
-
-/[z\x{03ba}]+/8i
-    \x{039a}\x{03ba}\x{03f0}
- 0: \x{39a}\x{3ba}\x{3f0}
-
-/[z\x{03f0}]+/8i
-    \x{039a}\x{03ba}\x{03f0}
- 0: \x{39a}\x{3ba}\x{3f0}
-
-/[z\x{03a0}]+/8i
-    \x{03a0}\x{03c0}\x{03d6} 
- 0: \x{3a0}\x{3c0}\x{3d6}
-
-/[z\x{03c0}]+/8i
-    \x{03a0}\x{03c0}\x{03d6} 
- 0: \x{3a0}\x{3c0}\x{3d6}
-
-/[z\x{03d6}]+/8i
-    \x{03a0}\x{03c0}\x{03d6} 
- 0: \x{3a0}\x{3c0}\x{3d6}
-
-/[z\x{03a1}]+/8i
-    \x{03a1}\x{03c1}\x{03f1}
- 0: \x{3a1}\x{3c1}\x{3f1}
-
-/[z\x{03c1}]+/8i
-    \x{03a1}\x{03c1}\x{03f1}
- 0: \x{3a1}\x{3c1}\x{3f1}
-
-/[z\x{03f1}]+/8i
-    \x{03a1}\x{03c1}\x{03f1}
- 0: \x{3a1}\x{3c1}\x{3f1}
-
-/[z\x{03a3}]+/8i
-    \x{03A3}\x{03C2}\x{03C3}
- 0: \x{3a3}\x{3c2}\x{3c3}
-
-/[z\x{03c2}]+/8i
-    \x{03A3}\x{03C2}\x{03C3}
- 0: \x{3a3}\x{3c2}\x{3c3}
-
-/[z\x{03c3}]+/8i
-    \x{03A3}\x{03C2}\x{03C3}
- 0: \x{3a3}\x{3c2}\x{3c3}
-
-/[z\x{03a6}]+/8i
-    \x{03a6}\x{03c6}\x{03d5} 
- 0: \x{3a6}\x{3c6}\x{3d5}
-
-/[z\x{03c6}]+/8i
-    \x{03a6}\x{03c6}\x{03d5} 
- 0: \x{3a6}\x{3c6}\x{3d5}
-
-/[z\x{03d5}]+/8i
-    \x{03a6}\x{03c6}\x{03d5} 
- 0: \x{3a6}\x{3c6}\x{3d5}
-
-/[z\x{03c9}]+/8i
-    \x{03c9}\x{03a9}\x{2126}
- 0: \x{3c9}\x{3a9}\x{2126}
-
-/[z\x{03a9}]+/8i
-    \x{03c9}\x{03a9}\x{2126}
- 0: \x{3c9}\x{3a9}\x{2126}
-
-/[z\x{2126}]+/8i
-    \x{03c9}\x{03a9}\x{2126}
- 0: \x{3c9}\x{3a9}\x{2126}
-
-/[z\x{1e60}]+/8i
-    \x{1e60}\x{1e61}\x{1e9b}
- 0: \x{1e60}\x{1e61}\x{1e9b}
-
-/[z\x{1e61}]+/8i
-    \x{1e60}\x{1e61}\x{1e9b}
- 0: \x{1e60}\x{1e61}\x{1e9b}
-
-/[z\x{1e9b}]+/8i
-    \x{1e60}\x{1e61}\x{1e9b}
- 0: \x{1e60}\x{1e61}\x{1e9b}
-
-/-- Perl 5.12.4 gets these wrong, but 5.15.3 is OK --/
-
-/[z\x{004b}]+/8i
-    \x{004b}\x{006b}\x{212a}
- 0: Kk\x{212a}
-
-/[z\x{006b}]+/8i
-    \x{004b}\x{006b}\x{212a}
- 0: Kk\x{212a}
-
-/[z\x{212a}]+/8i
-    \x{004b}\x{006b}\x{212a}
- 0: Kk\x{212a}
-
-/[z\x{0053}]+/8i
-    \x{0053}\x{0073}\x{017f}
- 0: Ss\x{17f}
-
-/[z\x{0073}]+/8i
-    \x{0053}\x{0073}\x{017f}
- 0: Ss\x{17f}
-
-/[z\x{017f}]+/8i
-    \x{0053}\x{0073}\x{017f}
- 0: Ss\x{17f}
-    
-/-- --/ 
-
-/(ΣΆΜΟΣ) \1/8i
-    ΣΆΜΟΣ ΣΆΜΟΣ
- 0: \x{3a3}\x{386}\x{39c}\x{39f}\x{3a3} \x{3a3}\x{386}\x{39c}\x{39f}\x{3a3}
- 1: \x{3a3}\x{386}\x{39c}\x{39f}\x{3a3}
-    ΣΆΜΟΣ σάμος
- 0: \x{3a3}\x{386}\x{39c}\x{39f}\x{3a3} \x{3c3}\x{3ac}\x{3bc}\x{3bf}\x{3c2}
- 1: \x{3a3}\x{386}\x{39c}\x{39f}\x{3a3}
-    σάμος σάμος
- 0: \x{3c3}\x{3ac}\x{3bc}\x{3bf}\x{3c2} \x{3c3}\x{3ac}\x{3bc}\x{3bf}\x{3c2}
- 1: \x{3c3}\x{3ac}\x{3bc}\x{3bf}\x{3c2}
-    σάμος σάμοσ
- 0: \x{3c3}\x{3ac}\x{3bc}\x{3bf}\x{3c2} \x{3c3}\x{3ac}\x{3bc}\x{3bf}\x{3c3}
- 1: \x{3c3}\x{3ac}\x{3bc}\x{3bf}\x{3c2}
-    σάμος ΣΆΜΟΣ  
- 0: \x{3c3}\x{3ac}\x{3bc}\x{3bf}\x{3c2} \x{3a3}\x{386}\x{39c}\x{39f}\x{3a3}
- 1: \x{3c3}\x{3ac}\x{3bc}\x{3bf}\x{3c2}
-
-/(σάμος) \1/8i
-    ΣΆΜΟΣ ΣΆΜΟΣ
- 0: \x{3a3}\x{386}\x{39c}\x{39f}\x{3a3} \x{3a3}\x{386}\x{39c}\x{39f}\x{3a3}
- 1: \x{3a3}\x{386}\x{39c}\x{39f}\x{3a3}
-    ΣΆΜΟΣ σάμος
- 0: \x{3a3}\x{386}\x{39c}\x{39f}\x{3a3} \x{3c3}\x{3ac}\x{3bc}\x{3bf}\x{3c2}
- 1: \x{3a3}\x{386}\x{39c}\x{39f}\x{3a3}
-    σάμος σάμος
- 0: \x{3c3}\x{3ac}\x{3bc}\x{3bf}\x{3c2} \x{3c3}\x{3ac}\x{3bc}\x{3bf}\x{3c2}
- 1: \x{3c3}\x{3ac}\x{3bc}\x{3bf}\x{3c2}
-    σάμος σάμοσ
- 0: \x{3c3}\x{3ac}\x{3bc}\x{3bf}\x{3c2} \x{3c3}\x{3ac}\x{3bc}\x{3bf}\x{3c3}
- 1: \x{3c3}\x{3ac}\x{3bc}\x{3bf}\x{3c2}
-    σάμος ΣΆΜΟΣ  
- 0: \x{3c3}\x{3ac}\x{3bc}\x{3bf}\x{3c2} \x{3a3}\x{386}\x{39c}\x{39f}\x{3a3}
- 1: \x{3c3}\x{3ac}\x{3bc}\x{3bf}\x{3c2}
-
-/(ΣΆΜΟΣ) \1*/8i
-    ΣΆΜΟΣ\x20
- 0: \x{3a3}\x{386}\x{39c}\x{39f}\x{3a3} 
- 1: \x{3a3}\x{386}\x{39c}\x{39f}\x{3a3}
-    ΣΆΜΟΣ ΣΆΜΟΣσάμοςσάμος
- 0: \x{3a3}\x{386}\x{39c}\x{39f}\x{3a3} \x{3a3}\x{386}\x{39c}\x{39f}\x{3a3}\x{3c3}\x{3ac}\x{3bc}\x{3bf}\x{3c2}\x{3c3}\x{3ac}\x{3bc}\x{3bf}\x{3c2}
- 1: \x{3a3}\x{386}\x{39c}\x{39f}\x{3a3}
-
-/-- Perl matches these --/
-
-/\x{00b5}+/8i
-    \x{00b5}\x{039c}\x{03bc}
- 0: \x{b5}\x{39c}\x{3bc}
-
-/\x{039c}+/8i
-    \x{00b5}\x{039c}\x{03bc}
- 0: \x{b5}\x{39c}\x{3bc}
-
-/\x{03bc}+/8i
-    \x{00b5}\x{039c}\x{03bc}
- 0: \x{b5}\x{39c}\x{3bc}
-
-
-/\x{00c5}+/8i
-    \x{00c5}\x{00e5}\x{212b}
- 0: \x{c5}\x{e5}\x{212b}
-
-/\x{00e5}+/8i
-    \x{00c5}\x{00e5}\x{212b}
- 0: \x{c5}\x{e5}\x{212b}
-
-/\x{212b}+/8i
-    \x{00c5}\x{00e5}\x{212b}
- 0: \x{c5}\x{e5}\x{212b}
-
-
-/\x{01c4}+/8i
-    \x{01c4}\x{01c5}\x{01c6}
- 0: \x{1c4}\x{1c5}\x{1c6}
-
-/\x{01c5}+/8i
-    \x{01c4}\x{01c5}\x{01c6}
- 0: \x{1c4}\x{1c5}\x{1c6}
-
-/\x{01c6}+/8i
-    \x{01c4}\x{01c5}\x{01c6}
- 0: \x{1c4}\x{1c5}\x{1c6}
-
-
-/\x{01c7}+/8i
-    \x{01c7}\x{01c8}\x{01c9}
- 0: \x{1c7}\x{1c8}\x{1c9}
-
-/\x{01c8}+/8i
-    \x{01c7}\x{01c8}\x{01c9}
- 0: \x{1c7}\x{1c8}\x{1c9}
-
-/\x{01c9}+/8i
-    \x{01c7}\x{01c8}\x{01c9}
- 0: \x{1c7}\x{1c8}\x{1c9}
-
-
-/\x{01ca}+/8i
-    \x{01ca}\x{01cb}\x{01cc}
- 0: \x{1ca}\x{1cb}\x{1cc}
-
-/\x{01cb}+/8i
-    \x{01ca}\x{01cb}\x{01cc}
- 0: \x{1ca}\x{1cb}\x{1cc}
-
-/\x{01cc}+/8i
-    \x{01ca}\x{01cb}\x{01cc}
- 0: \x{1ca}\x{1cb}\x{1cc}
-
-
-/\x{01f1}+/8i
-    \x{01f1}\x{01f2}\x{01f3}
- 0: \x{1f1}\x{1f2}\x{1f3}
-
-/\x{01f2}+/8i
-    \x{01f1}\x{01f2}\x{01f3}
- 0: \x{1f1}\x{1f2}\x{1f3}
-
-/\x{01f3}+/8i
-    \x{01f1}\x{01f2}\x{01f3}
- 0: \x{1f1}\x{1f2}\x{1f3}
-
-
-/\x{0345}+/8i
-    \x{0345}\x{0399}\x{03b9}\x{1fbe}
- 0: \x{345}\x{399}\x{3b9}\x{1fbe}
-
-/\x{0399}+/8i
-    \x{0345}\x{0399}\x{03b9}\x{1fbe}
- 0: \x{345}\x{399}\x{3b9}\x{1fbe}
-
-/\x{03b9}+/8i
-    \x{0345}\x{0399}\x{03b9}\x{1fbe}
- 0: \x{345}\x{399}\x{3b9}\x{1fbe}
-
-/\x{1fbe}+/8i
-    \x{0345}\x{0399}\x{03b9}\x{1fbe}
- 0: \x{345}\x{399}\x{3b9}\x{1fbe}
-
-
-/\x{0392}+/8i
-    \x{0392}\x{03b2}\x{03d0}
- 0: \x{392}\x{3b2}\x{3d0}
-
-/\x{03b2}+/8i
-    \x{0392}\x{03b2}\x{03d0}
- 0: \x{392}\x{3b2}\x{3d0}
-
-/\x{03d0}+/8i
-    \x{0392}\x{03b2}\x{03d0}
- 0: \x{392}\x{3b2}\x{3d0}
-    
-
-/\x{0395}+/8i
-    \x{0395}\x{03b5}\x{03f5}
- 0: \x{395}\x{3b5}\x{3f5}
-
-/\x{03b5}+/8i
-    \x{0395}\x{03b5}\x{03f5}
- 0: \x{395}\x{3b5}\x{3f5}
-
-/\x{03f5}+/8i
-    \x{0395}\x{03b5}\x{03f5}
- 0: \x{395}\x{3b5}\x{3f5}
-
-
-/\x{0398}+/8i
-    \x{0398}\x{03b8}\x{03d1}\x{03f4}
- 0: \x{398}\x{3b8}\x{3d1}\x{3f4}
-
-/\x{03b8}+/8i
-    \x{0398}\x{03b8}\x{03d1}\x{03f4}
- 0: \x{398}\x{3b8}\x{3d1}\x{3f4}
-
-/\x{03d1}+/8i
-    \x{0398}\x{03b8}\x{03d1}\x{03f4}
- 0: \x{398}\x{3b8}\x{3d1}\x{3f4}
-
-/\x{03f4}+/8i
-    \x{0398}\x{03b8}\x{03d1}\x{03f4}
- 0: \x{398}\x{3b8}\x{3d1}\x{3f4}
-    
-
-/\x{039a}+/8i
-    \x{039a}\x{03ba}\x{03f0}
- 0: \x{39a}\x{3ba}\x{3f0}
-
-/\x{03ba}+/8i
-    \x{039a}\x{03ba}\x{03f0}
- 0: \x{39a}\x{3ba}\x{3f0}
-
-/\x{03f0}+/8i
-    \x{039a}\x{03ba}\x{03f0}
- 0: \x{39a}\x{3ba}\x{3f0}
-    
-
-/\x{03a0}+/8i
-    \x{03a0}\x{03c0}\x{03d6} 
- 0: \x{3a0}\x{3c0}\x{3d6}
-
-/\x{03c0}+/8i
-    \x{03a0}\x{03c0}\x{03d6} 
- 0: \x{3a0}\x{3c0}\x{3d6}
-
-/\x{03d6}+/8i
-    \x{03a0}\x{03c0}\x{03d6} 
- 0: \x{3a0}\x{3c0}\x{3d6}
-
-
-/\x{03a1}+/8i
-    \x{03a1}\x{03c1}\x{03f1}
- 0: \x{3a1}\x{3c1}\x{3f1}
-
-/\x{03c1}+/8i
-    \x{03a1}\x{03c1}\x{03f1}
- 0: \x{3a1}\x{3c1}\x{3f1}
-
-/\x{03f1}+/8i
-    \x{03a1}\x{03c1}\x{03f1}
- 0: \x{3a1}\x{3c1}\x{3f1}
-
-
-/\x{03a3}+/8i
-    \x{03A3}\x{03C2}\x{03C3}
- 0: \x{3a3}\x{3c2}\x{3c3}
-
-/\x{03c2}+/8i
-    \x{03A3}\x{03C2}\x{03C3}
- 0: \x{3a3}\x{3c2}\x{3c3}
-
-/\x{03c3}+/8i
-    \x{03A3}\x{03C2}\x{03C3}
- 0: \x{3a3}\x{3c2}\x{3c3}
-    
-
-/\x{03a6}+/8i
-    \x{03a6}\x{03c6}\x{03d5} 
- 0: \x{3a6}\x{3c6}\x{3d5}
-
-/\x{03c6}+/8i
-    \x{03a6}\x{03c6}\x{03d5} 
- 0: \x{3a6}\x{3c6}\x{3d5}
-
-/\x{03d5}+/8i
-    \x{03a6}\x{03c6}\x{03d5} 
- 0: \x{3a6}\x{3c6}\x{3d5}
-
-
-/\x{03c9}+/8i
-    \x{03c9}\x{03a9}\x{2126}
- 0: \x{3c9}\x{3a9}\x{2126}
-
-/\x{03a9}+/8i
-    \x{03c9}\x{03a9}\x{2126}
- 0: \x{3c9}\x{3a9}\x{2126}
-
-/\x{2126}+/8i
-    \x{03c9}\x{03a9}\x{2126}
- 0: \x{3c9}\x{3a9}\x{2126}
-    
-
-/\x{1e60}+/8i
-    \x{1e60}\x{1e61}\x{1e9b}
- 0: \x{1e60}\x{1e61}\x{1e9b}
-
-/\x{1e61}+/8i
-    \x{1e60}\x{1e61}\x{1e9b}
- 0: \x{1e60}\x{1e61}\x{1e9b}
-
-/\x{1e9b}+/8i
-    \x{1e60}\x{1e61}\x{1e9b}
- 0: \x{1e60}\x{1e61}\x{1e9b}
-    
-
-/\x{1e9e}+/8i
-    \x{1e9e}\x{00df}
- 0: \x{1e9e}\x{df}
-
-/\x{00df}+/8i
-    \x{1e9e}\x{00df}
- 0: \x{1e9e}\x{df}
-    
-
-/\x{1f88}+/8i
-    \x{1f88}\x{1f80} 
- 0: \x{1f88}\x{1f80}
-
-/\x{1f80}+/8i
-    \x{1f88}\x{1f80} 
- 0: \x{1f88}\x{1f80}
-
-
-/-- Perl 5.12.4 gets these wrong, but 5.15.3 is OK --/
-
-/\x{004b}+/8i
-    \x{004b}\x{006b}\x{212a}
- 0: Kk\x{212a}
-
-/\x{006b}+/8i
-    \x{004b}\x{006b}\x{212a}
- 0: Kk\x{212a}
-
-/\x{212a}+/8i
-    \x{004b}\x{006b}\x{212a}
- 0: Kk\x{212a}
-
-
-/\x{0053}+/8i
-    \x{0053}\x{0073}\x{017f}
- 0: Ss\x{17f}
-
-/\x{0073}+/8i
-    \x{0053}\x{0073}\x{017f}
- 0: Ss\x{17f}
-
-/\x{017f}+/8i
-    \x{0053}\x{0073}\x{017f}
- 0: Ss\x{17f}
-
-/^\p{Any}*\d{4}/8
-    1234
- 0: 1234
-    123 
-No match
-
-/^\X*\w{4}/8
-    1234
- 0: 1234
-    123  
-No match
-
-/^A\s+Z/8W
-    A\x{2005}Z
- 0: A\x{2005}Z
-    A\x{85}\x{180e}\x{2005}Z
- 0: A\x{85}\x{180e}\x{2005}Z
-
-/^A[\s]+Z/8W
-    A\x{2005}Z
- 0: A\x{2005}Z
-    A\x{85}\x{180e}\x{2005}Z
- 0: A\x{85}\x{180e}\x{2005}Z
-
-/^[[:graph:]]+$/8W
-    Letter:ABC
- 0: Letter:ABC
-    Mark:\x{300}\x{1d172}\x{1d17b}
- 0: Mark:\x{300}\x{1d172}\x{1d17b}
-    Number:9\x{660}
- 0: Number:9\x{660}
-    Punctuation:\x{66a},;
- 0: Punctuation:\x{66a},;
-    Symbol:\x{6de}<>\x{fffc}
- 0: Symbol:\x{6de}<>\x{fffc}
-    Cf-property:\x{ad}\x{600}\x{601}\x{602}\x{603}\x{604}\x{6dd}\x{70f}
- 0: Cf-property:\x{ad}\x{600}\x{601}\x{602}\x{603}\x{604}\x{6dd}\x{70f}
-    \x{200b}\x{200c}\x{200d}\x{200e}\x{200f}
- 0: \x{200b}\x{200c}\x{200d}\x{200e}\x{200f}
-    \x{202a}\x{202b}\x{202c}\x{202d}\x{202e}
- 0: \x{202a}\x{202b}\x{202c}\x{202d}\x{202e}
-    \x{2060}\x{2061}\x{2062}\x{2063}\x{2064}
- 0: \x{2060}\x{2061}\x{2062}\x{2063}\x{2064}
-    \x{206a}\x{206b}\x{206c}\x{206d}\x{206e}\x{206f}
- 0: \x{206a}\x{206b}\x{206c}\x{206d}\x{206e}\x{206f}
-    \x{feff}
- 0: \x{feff}
-    \x{fff9}\x{fffa}\x{fffb}
- 0: \x{fff9}\x{fffa}\x{fffb}
-    \x{110bd}
- 0: \x{110bd}
-    \x{1d173}\x{1d174}\x{1d175}\x{1d176}\x{1d177}\x{1d178}\x{1d179}\x{1d17a}
- 0: \x{1d173}\x{1d174}\x{1d175}\x{1d176}\x{1d177}\x{1d178}\x{1d179}\x{1d17a}
-    \x{e0001}
- 0: \x{e0001}
-    \x{e0020}\x{e0030}\x{e0040}\x{e0050}\x{e0060}\x{e0070}\x{e007f}
- 0: \x{e0020}\x{e0030}\x{e0040}\x{e0050}\x{e0060}\x{e0070}\x{e007f}
-    ** Failers
-No match
-    \x{09}
-No match
-    \x{0a}
-No match
-    \x{1D}
-No match
-    \x{20}
-No match
-    \x{85}
-No match
-    \x{a0}
-No match
-    \x{61c}
-No match
-    \x{1680}
-No match
-    \x{180e}
-No match
-    \x{2028}
-No match
-    \x{2029}
-No match
-    \x{202f}
-No match
-    \x{2065}
-No match
-    \x{2066}
-No match
-    \x{2067}
-No match
-    \x{2068}
-No match
-    \x{2069}
-No match
-    \x{3000}
-No match
-    \x{e0002}
-No match
-    \x{e001f}
-No match
-    \x{e0080} 
-No match
-
-/^[[:print:]]+$/8W
-    Space: \x{a0}
- 0: Space: \x{a0}
-    \x{1680}\x{2000}\x{2001}\x{2002}\x{2003}\x{2004}\x{2005}
- 0: \x{1680}\x{2000}\x{2001}\x{2002}\x{2003}\x{2004}\x{2005}
-    \x{2006}\x{2007}\x{2008}\x{2009}\x{200a} 
- 0: \x{2006}\x{2007}\x{2008}\x{2009}\x{200a}
-    \x{202f}\x{205f} 
- 0: \x{202f}\x{205f}
-    \x{3000}
- 0: \x{3000}
-    Letter:ABC
- 0: Letter:ABC
-    Mark:\x{300}\x{1d172}\x{1d17b}
- 0: Mark:\x{300}\x{1d172}\x{1d17b}
-    Number:9\x{660}
- 0: Number:9\x{660}
-    Punctuation:\x{66a},;
- 0: Punctuation:\x{66a},;
-    Symbol:\x{6de}<>\x{fffc}
- 0: Symbol:\x{6de}<>\x{fffc}
-    Cf-property:\x{ad}\x{600}\x{601}\x{602}\x{603}\x{604}\x{6dd}\x{70f}
- 0: Cf-property:\x{ad}\x{600}\x{601}\x{602}\x{603}\x{604}\x{6dd}\x{70f}
-    \x{180e}
- 0: \x{180e}
-    \x{200b}\x{200c}\x{200d}\x{200e}\x{200f}
- 0: \x{200b}\x{200c}\x{200d}\x{200e}\x{200f}
-    \x{202a}\x{202b}\x{202c}\x{202d}\x{202e}
- 0: \x{202a}\x{202b}\x{202c}\x{202d}\x{202e}
-    \x{202f}
- 0: \x{202f}
-    \x{2060}\x{2061}\x{2062}\x{2063}\x{2064}
- 0: \x{2060}\x{2061}\x{2062}\x{2063}\x{2064}
-    \x{206a}\x{206b}\x{206c}\x{206d}\x{206e}\x{206f}
- 0: \x{206a}\x{206b}\x{206c}\x{206d}\x{206e}\x{206f}
-    \x{feff}
- 0: \x{feff}
-    \x{fff9}\x{fffa}\x{fffb}
- 0: \x{fff9}\x{fffa}\x{fffb}
-    \x{110bd}
- 0: \x{110bd}
-    \x{1d173}\x{1d174}\x{1d175}\x{1d176}\x{1d177}\x{1d178}\x{1d179}\x{1d17a}
- 0: \x{1d173}\x{1d174}\x{1d175}\x{1d176}\x{1d177}\x{1d178}\x{1d179}\x{1d17a}
-    \x{e0001}
- 0: \x{e0001}
-    \x{e0020}\x{e0030}\x{e0040}\x{e0050}\x{e0060}\x{e0070}\x{e007f}
- 0: \x{e0020}\x{e0030}\x{e0040}\x{e0050}\x{e0060}\x{e0070}\x{e007f}
-    ** Failers
- 0: ** Failers
-    \x{09}
-No match
-    \x{1D}
-No match
-    \x{85}
-No match
-    \x{61c}
-No match
-    \x{2028}
-No match
-    \x{2029}
-No match
-    \x{2065}
-No match
-    \x{2066}
-No match
-    \x{2067}
-No match
-    \x{2068}
-No match
-    \x{2069}
-No match
-    \x{e0002}
-No match
-    \x{e001f}
-No match
-    \x{e0080} 
-No match
-
-/^[[:punct:]]+$/8W
-    \$+<=>^`|~
- 0: $+<=>^`|~
-    !\"#%&'()*,-./:;?@[\\]_{}
- 0: !"#%&'()*,-./:;?@[\]_{}
-    \x{a1}\x{a7}  
- 0: \x{a1}\x{a7}
-    \x{37e} 
- 0: \x{37e}
-    ** Failers
-No match
-    abcde  
-No match
-
-/^[[:^graph:]]+$/8W
-    \x{09}\x{0a}\x{1D}\x{20}\x{85}\x{a0}\x{61c}\x{1680}\x{180e}
- 0: \x{09}\x{0a}\x{1d} \x{85}\x{a0}\x{61c}\x{1680}\x{180e}
-    \x{2028}\x{2029}\x{202f}\x{2065}\x{2066}\x{2067}\x{2068}\x{2069}
- 0: \x{2028}\x{2029}\x{202f}\x{2065}\x{2066}\x{2067}\x{2068}\x{2069}
-    \x{3000}\x{e0002}\x{e001f}\x{e0080}
- 0: \x{3000}\x{e0002}\x{e001f}\x{e0080}
-    ** Failers
-No match
-    Letter:ABC
-No match
-    Mark:\x{300}\x{1d172}\x{1d17b}
-No match
-    Number:9\x{660}
-No match
-    Punctuation:\x{66a},;
-No match
-    Symbol:\x{6de}<>\x{fffc}
-No match
-    Cf-property:\x{ad}\x{600}\x{601}\x{602}\x{603}\x{604}\x{6dd}\x{70f}
-No match
-    \x{200b}\x{200c}\x{200d}\x{200e}\x{200f}
-No match
-    \x{202a}\x{202b}\x{202c}\x{202d}\x{202e}
-No match
-    \x{2060}\x{2061}\x{2062}\x{2063}\x{2064}
-No match
-    \x{206a}\x{206b}\x{206c}\x{206d}\x{206e}\x{206f}
-No match
-    \x{feff}
-No match
-    \x{fff9}\x{fffa}\x{fffb}
-No match
-    \x{110bd}
-No match
-    \x{1d173}\x{1d174}\x{1d175}\x{1d176}\x{1d177}\x{1d178}\x{1d179}\x{1d17a}
-No match
-    \x{e0001}
-No match
-    \x{e0020}\x{e0030}\x{e0040}\x{e0050}\x{e0060}\x{e0070}\x{e007f}
-No match
-
-/^[[:^print:]]+$/8W
-    \x{09}\x{1D}\x{85}\x{61c}\x{2028}\x{2029}\x{2065}\x{2066}\x{2067}
- 0: \x{09}\x{1d}\x{85}\x{61c}\x{2028}\x{2029}\x{2065}\x{2066}\x{2067}
-    \x{2068}\x{2069}\x{e0002}\x{e001f}\x{e0080}
- 0: \x{2068}\x{2069}\x{e0002}\x{e001f}\x{e0080}
-    ** Failers
-No match
-    Space: \x{a0}
-No match
-    \x{1680}\x{2000}\x{2001}\x{2002}\x{2003}\x{2004}\x{2005}
-No match
-    \x{2006}\x{2007}\x{2008}\x{2009}\x{200a} 
-No match
-    \x{202f}\x{205f} 
-No match
-    \x{3000}
-No match
-    Letter:ABC
-No match
-    Mark:\x{300}\x{1d172}\x{1d17b}
-No match
-    Number:9\x{660}
-No match
-    Punctuation:\x{66a},;
-No match
-    Symbol:\x{6de}<>\x{fffc}
-No match
-    Cf-property:\x{ad}\x{600}\x{601}\x{602}\x{603}\x{604}\x{6dd}\x{70f}
-No match
-    \x{180e}
-No match
-    \x{200b}\x{200c}\x{200d}\x{200e}\x{200f}
-No match
-    \x{202a}\x{202b}\x{202c}\x{202d}\x{202e}
-No match
-    \x{202f}
-No match
-    \x{2060}\x{2061}\x{2062}\x{2063}\x{2064}
-No match
-    \x{206a}\x{206b}\x{206c}\x{206d}\x{206e}\x{206f}
-No match
-    \x{feff}
-No match
-    \x{fff9}\x{fffa}\x{fffb}
-No match
-    \x{110bd}
-No match
-    \x{1d173}\x{1d174}\x{1d175}\x{1d176}\x{1d177}\x{1d178}\x{1d179}\x{1d17a}
-No match
-    \x{e0001}
-No match
-    \x{e0020}\x{e0030}\x{e0040}\x{e0050}\x{e0060}\x{e0070}\x{e007f}
-No match
-
-/^[[:^punct:]]+$/8W
-    abcde  
- 0: abcde
-    ** Failers
-No match
-    \$+<=>^`|~
-No match
-    !\"#%&'()*,-./:;?@[\\]_{}
-No match
-    \x{a1}\x{a7}  
-No match
-    \x{37e} 
-No match
-
-/[RST]+/8iW
-    Ss\x{17f}
- 0: Ss\x{17f}
-    
-/[R-T]+/8iW 
-    Ss\x{17f}
- 0: Ss\x{17f}
-
-/[q-u]+/8iW 
-    Ss\x{17f}
- 0: Ss\x{17f}
-
-/^s?c/mi8
-    scat
- 0: sc
-
-/[A-`]/i8
-    abcdefghijklmno
- 0: a
-
-/\C\X*QT/8
-    Ӆ\x0aT
-No match
-
-/[\pS#moq]/
-    =
- 0: =
-
-/[[:punct:]]/8W
-    \xc2\xb4
-No match
-    \x{b4} 
-No match
-
-/[[:^ascii:]]/8W
-    \x{100}
- 0: \x{100}
-    \x{200}
- 0: \x{200}
-    \x{300}
- 0: \x{300}
-    \x{37e}
- 0: \x{37e}
-    a
-No match
-    9
-No match
-    g
-No match
-
-/[[:^ascii:]\w]/8W
-    a
- 0: a
-    9
- 0: 9
-    g
- 0: g
-    \x{100}
- 0: \x{100}
-    \x{200}
- 0: \x{200}
-    \x{300}
- 0: \x{300}
-    \x{37e}
- 0: \x{37e}
-
-/[\w[:^ascii:]]/8W
-    a
- 0: a
-    9
- 0: 9
-    g
- 0: g
-    \x{100}
- 0: \x{100}
-    \x{200}
- 0: \x{200}
-    \x{300}
- 0: \x{300}
-    \x{37e}
- 0: \x{37e}
-
-/[^[:ascii:]\W]/8W
-    a
-No match
-    9
-No match
-    g
-No match
-    \x{100}
- 0: \x{100}
-    \x{200}
- 0: \x{200}
-    \x{300}
-No match
-    \x{37e}
-No match
-
-/[[:^ascii:]a]/8W
-    a
- 0: a
-    9
-No match
-    g
-No match
-    \x{100}
- 0: \x{100}
-    \x{200}
- 0: \x{200}
-    \x{37e}
- 0: \x{37e}
-
-/-- End of testinput6 --/
diff --git a/dist/testdata/testoutput7 b/dist/testdata/testoutput7
deleted file mode 100644
index cc9ebdd..0000000
--- a/dist/testdata/testoutput7
+++ /dev/null
@@ -1,2351 +0,0 @@
-/-- These tests for Unicode property support test PCRE's API and show some of
-    the compiled code. They are not Perl-compatible. --/
-
-/[\p{L}]/DZ
-------------------------------------------------------------------
-        Bra
-        [\p{L}]
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-No options
-No first char
-No need char
-
-/[\p{^L}]/DZ
-------------------------------------------------------------------
-        Bra
-        [\P{L}]
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-No options
-No first char
-No need char
-
-/[\P{L}]/DZ
-------------------------------------------------------------------
-        Bra
-        [\P{L}]
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-No options
-No first char
-No need char
-
-/[\P{^L}]/DZ
-------------------------------------------------------------------
-        Bra
-        [\p{L}]
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-No options
-No first char
-No need char
-
-/[abc\p{L}\x{0660}]/8DZ
-------------------------------------------------------------------
-        Bra
-        [a-c\p{L}\x{660}]
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-No first char
-No need char
-
-/[\p{Nd}]/8DZ
-------------------------------------------------------------------
-        Bra
-        [\p{Nd}]
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-No first char
-No need char
-    1234
- 0: 1
-
-/[\p{Nd}+-]+/8DZ
-------------------------------------------------------------------
-        Bra
-        [+\-\p{Nd}]++
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: utf
-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
-
-/[\x{105}-\x{109}]/8iDZ
-------------------------------------------------------------------
-        Bra
-        [\x{104}-\x{109}]
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: caseless utf
-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}]/8iDZ 
-------------------------------------------------------------------
-        Bra
-        [Zz-\xff\x{39c}\x{3bc}\x{212b}\x{1e9e}\x{212b}\x{178}\x{100}-\x{101}]
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: caseless utf
-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}]/8DZi
-------------------------------------------------------------------
-        Bra
-        [Zz-\xff\x{39c}\x{3bc}\x{212b}\x{1e9e}\x{212b}\x{178}\x{100}-\x{101}]
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: caseless utf
-No first char
-No need char
-
-/(?:[\PPa*]*){8,}/
-
-/[\P{Any}]/BZ
-------------------------------------------------------------------
-        Bra
-        [\P{Any}]
-        Ket
-        End
-------------------------------------------------------------------
-
-/[\P{Any}\E]/BZ
-------------------------------------------------------------------
-        Bra
-        [\P{Any}]
-        Ket
-        End
-------------------------------------------------------------------
-
-/(\P{Yi}+\277)/
-
-/(\P{Yi}+\277)?/
-
-/(?<=\P{Yi}{3}A)X/
-
-/\p{Yi}+(\P{Yi}+)(?1)/
-
-/(\P{Yi}{2}\277)?/
-
-/[\P{Yi}A]/
-
-/[\P{Yi}\P{Yi}\P{Yi}A]/
-
-/[^\P{Yi}A]/
-
-/[^\P{Yi}\P{Yi}\P{Yi}A]/
-
-/(\P{Yi}*\277)*/
-
-/(\P{Yi}*?\277)*/
-
-/(\p{Yi}*+\277)*/
-
-/(\P{Yi}?\277)*/
-
-/(\P{Yi}??\277)*/
-
-/(\p{Yi}?+\277)*/
-
-/(\P{Yi}{0,3}\277)*/
-
-/(\P{Yi}{0,3}?\277)*/
-
-/(\p{Yi}{0,3}+\277)*/
-
-/\p{Zl}{2,3}+/8BZ
-------------------------------------------------------------------
-        Bra
-        prop Zl {2}
-        prop Zl ?+
-        Ket
-        End
-------------------------------------------------------------------
-    


- 0: \x{2028}\x{2028}
-    \x{2028}\x{2028}\x{2028}
- 0: \x{2028}\x{2028}\x{2028}
-    
-/\p{Zl}/8BZ
-------------------------------------------------------------------
-        Bra
-        prop Zl
-        Ket
-        End
-------------------------------------------------------------------
-
-/\p{Lu}{3}+/8BZ
-------------------------------------------------------------------
-        Bra
-        prop Lu {3}
-        Ket
-        End
-------------------------------------------------------------------
-
-/\pL{2}+/8BZ
-------------------------------------------------------------------
-        Bra
-        prop L {2}
-        Ket
-        End
-------------------------------------------------------------------
-
-/\p{Cc}{2}+/8BZ
-------------------------------------------------------------------
-        Bra
-        prop Cc {2}
-        Ket
-        End
-------------------------------------------------------------------
-
-/^\p{Cf}/8
-    \x{180e}
- 0: \x{180e}
-    \x{061c}
- 0: \x{61c}
-    \x{2066}
- 0: \x{2066}
-    \x{2067}
- 0: \x{2067}
-    \x{2068}
- 0: \x{2068}
-    \x{2069}
- 0: \x{2069}
-
-/^\p{Cs}/8
-    \?\x{dfff}
- 0: \x{dfff}
-    ** Failers
-No match
-    \x{09f} 
-No match
-  
-/^\p{Mn}/8
-    \x{1a1b}
- 0: \x{1a1b}
-
-/^\p{Pe}/8
-    \x{2309}
- 0: \x{2309}
-    \x{230b}
- 0: \x{230b}
-
-/^\p{Ps}/8
-    \x{2308}
- 0: \x{2308}
-    \x{230a}
- 0: \x{230a}
-
-/^\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{Zs}/8
-    \ \
- 0:  
-    \x{a0}
- 0: \x{a0}
-    \x{1680}
- 0: \x{1680}
-    \x{2000}
- 0: \x{2000}
-    \x{2001}     
- 0: \x{2001}
-    ** Failers
-No match
-    \x{2028}
-No match
-    \x{200d} 
-No match
-  
-/-- These are here rather than in test 6 because Perl has problems with
-    the negative versions of the properties and behaves has changed how
-    it behaves for caseless matching. --/
-      
-/\p{^Lu}/8i
-    1234
- 0: 1
-    ** Failers
- 0: *
-    ABC 
-No match
-
-/\P{Lu}/8i
-    1234
- 0: 1
-    ** Failers
- 0: *
-    ABC 
-No match
-
-/\p{Ll}/8i 
-    a
- 0: a
-    Az
- 0: z
-    ** Failers
- 0: a
-    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
-    A
- 0: A
-    aZ
- 0: Z
-    ** Failers
- 0: F
-    abc   
-No match
-
-/[\x{c0}\x{391}]/8i
-    \x{c0}
- 0: \x{c0}
-    \x{e0} 
- 0: \x{e0}
-
-/-- The next two are special cases where the lengths of the different cases of
-the same character differ. The first went wrong with heap frame storage; the
-second was broken in all cases. --/
-
-/^\x{023a}+?(\x{0130}+)/8i
-  \x{023a}\x{2c65}\x{0130}
- 0: \x{23a}\x{2c65}\x{130}
- 1: \x{130}
-  
-/^\x{023a}+([^X])/8i
-  \x{023a}\x{2c65}X
- 0: \x{23a}\x{2c65}
- 1: \x{2c65}
-
-/\x{c0}+\x{116}+/8i
-    \x{c0}\x{e0}\x{116}\x{117}
- 0: \x{c0}\x{e0}\x{116}\x{117}
-
-/[\x{c0}\x{116}]+/8i
-    \x{c0}\x{e0}\x{116}\x{117}
- 0: \x{c0}\x{e0}\x{116}\x{117}
-
-/(\x{de})\1/8i
-    \x{de}\x{de}
- 0: \x{de}\x{de}
- 1: \x{de}
-    \x{de}\x{fe}
- 0: \x{de}\x{fe}
- 1: \x{de}
-    \x{fe}\x{fe}
- 0: \x{fe}\x{fe}
- 1: \x{fe}
-    \x{fe}\x{de}
- 0: \x{fe}\x{de}
- 1: \x{fe}
-
-/^\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}
-
-/-- The next two should be Perl-compatible, but it fails to match \x{e0}. PCRE
-will match it only with UCP support, because without that it has no notion
-of case for anything other than the ASCII letters. --/ 
-
-/((?i)[\x{c0}])/8
-    \x{c0}
- 0: \x{c0}
- 1: \x{c0}
-    \x{e0} 
- 0: \x{e0}
- 1: \x{e0}
-
-/(?i:[\x{c0}])/8
-    \x{c0}
- 0: \x{c0}
-    \x{e0} 
- 0: \x{e0}
-
-/-- These are PCRE's extra properties to help with Unicodizing \d etc. --/
-
-/^\p{Xan}/8
-    ABCD
- 0: A
-    1234
- 0: 1
-    \x{6ca}
- 0: \x{6ca}
-    \x{a6c}
- 0: \x{a6c}
-    \x{10a7}   
- 0: \x{10a7}
-    ** Failers
-No match
-    _ABC   
-No match
-
-/^\p{Xan}+/8
-    ABCD1234\x{6ca}\x{a6c}\x{10a7}_
- 0: ABCD1234\x{6ca}\x{a6c}\x{10a7}
-    ** Failers
-No match
-    _ABC   
-No match
-
-/^\p{Xan}+?/8
-    \x{6ca}\x{a6c}\x{10a7}_
- 0: \x{6ca}
-
-/^\p{Xan}*/8
-    ABCD1234\x{6ca}\x{a6c}\x{10a7}_
- 0: ABCD1234\x{6ca}\x{a6c}\x{10a7}
-    
-/^\p{Xan}{2,9}/8
-    ABCD1234\x{6ca}\x{a6c}\x{10a7}_
- 0: ABCD1234\x{6ca}
-    
-/^\p{Xan}{2,9}?/8
-    \x{6ca}\x{a6c}\x{10a7}_
- 0: \x{6ca}\x{a6c}
-    
-/^[\p{Xan}]/8
-    ABCD1234_
- 0: A
-    1234abcd_
- 0: 1
-    \x{6ca}
- 0: \x{6ca}
-    \x{a6c}
- 0: \x{a6c}
-    \x{10a7}   
- 0: \x{10a7}
-    ** Failers
-No match
-    _ABC   
-No match
- 
-/^[\p{Xan}]+/8
-    ABCD1234\x{6ca}\x{a6c}\x{10a7}_
- 0: ABCD1234\x{6ca}\x{a6c}\x{10a7}
-    ** Failers
-No match
-    _ABC   
-No match
-
-/^>\p{Xsp}/8
-    >\x{1680}\x{2028}\x{0b}
- 0: >\x{1680}
-    >\x{a0} 
- 0: >\x{a0}
-    ** Failers
-No match
-    \x{0b} 
-No match
-
-/^>\p{Xsp}+/8
-    > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b}
- 0: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b}
-
-/^>\p{Xsp}+?/8
-    >\x{1680}\x{2028}\x{0b}
- 0: >\x{1680}
-
-/^>\p{Xsp}*/8
-    > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b}
- 0: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b}
-    
-/^>\p{Xsp}{2,9}/8
-    > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b}
- 0: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b}
-    
-/^>\p{Xsp}{2,9}?/8
-    > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b}
- 0: > \x{09}
-    
-/^>[\p{Xsp}]/8
-    >\x{2028}\x{0b}
- 0: >\x{2028}
- 
-/^>[\p{Xsp}]+/8
-    > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b}
- 0: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b}
-
-/^>\p{Xps}/8
-    >\x{1680}\x{2028}\x{0b}
- 0: >\x{1680}
-    >\x{a0} 
- 0: >\x{a0}
-    ** Failers
-No match
-    \x{0b} 
-No match
-
-/^>\p{Xps}+/8
-    > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b}
- 0: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b}
-
-/^>\p{Xps}+?/8
-    >\x{1680}\x{2028}\x{0b}
- 0: >\x{1680}
-
-/^>\p{Xps}*/8
-    > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b}
- 0: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b}
-    
-/^>\p{Xps}{2,9}/8
-    > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b}
- 0: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b}
-    
-/^>\p{Xps}{2,9}?/8
-    > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b}
- 0: > \x{09}
-    
-/^>[\p{Xps}]/8
-    >\x{2028}\x{0b}
- 0: >\x{2028}
- 
-/^>[\p{Xps}]+/8
-    > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b}
- 0: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b}
-
-/^\p{Xwd}/8
-    ABCD
- 0: A
-    1234
- 0: 1
-    \x{6ca}
- 0: \x{6ca}
-    \x{a6c}
- 0: \x{a6c}
-    \x{10a7}
- 0: \x{10a7}
-    _ABC    
- 0: _
-    ** Failers
-No match
-    [] 
-No match
-
-/^\p{Xwd}+/8
-    ABCD1234\x{6ca}\x{a6c}\x{10a7}_
- 0: ABCD1234\x{6ca}\x{a6c}\x{10a7}_
-
-/^\p{Xwd}+?/8
-    \x{6ca}\x{a6c}\x{10a7}_
- 0: \x{6ca}
-
-/^\p{Xwd}*/8
-    ABCD1234\x{6ca}\x{a6c}\x{10a7}_
- 0: ABCD1234\x{6ca}\x{a6c}\x{10a7}_
-    
-/^\p{Xwd}{2,9}/8
-    A_B12\x{6ca}\x{a6c}\x{10a7}
- 0: A_B12\x{6ca}\x{a6c}\x{10a7}
-    
-/^\p{Xwd}{2,9}?/8
-    \x{6ca}\x{a6c}\x{10a7}_
- 0: \x{6ca}\x{a6c}
-    
-/^[\p{Xwd}]/8
-    ABCD1234_
- 0: A
-    1234abcd_
- 0: 1
-    \x{6ca}
- 0: \x{6ca}
-    \x{a6c}
- 0: \x{a6c}
-    \x{10a7}   
- 0: \x{10a7}
-    _ABC 
- 0: _
-    ** Failers
-No match
-    []   
-No match
- 
-/^[\p{Xwd}]+/8
-    ABCD1234\x{6ca}\x{a6c}\x{10a7}_
- 0: ABCD1234\x{6ca}\x{a6c}\x{10a7}_
-
-/-- A check not in UTF-8 mode --/
-
-/^[\p{Xwd}]+/
-    ABCD1234_
- 0: ABCD1234_
-    
-/-- Some negative checks --/
-
-/^[\P{Xwd}]+/8
-    !.+\x{019}\x{35a}AB
- 0: !.+\x{19}\x{35a}
-
-/^[\p{^Xwd}]+/8
-    !.+\x{019}\x{35a}AB
- 0: !.+\x{19}\x{35a}
-
-/[\D]/WBZ8
-------------------------------------------------------------------
-        Bra
-        [\P{Nd}]
-        Ket
-        End
-------------------------------------------------------------------
-    1\x{3c8}2
- 0: \x{3c8}
-
-/[\d]/WBZ8
-------------------------------------------------------------------
-        Bra
-        [\p{Nd}]
-        Ket
-        End
-------------------------------------------------------------------
-    >\x{6f4}<
- 0: \x{6f4}
-
-/[\S]/WBZ8
-------------------------------------------------------------------
-        Bra
-        [\P{Xsp}]
-        Ket
-        End
-------------------------------------------------------------------
-    \x{1680}\x{6f4}\x{1680}
- 0: \x{6f4}
-
-/[\s]/WBZ8
-------------------------------------------------------------------
-        Bra
-        [\p{Xsp}]
-        Ket
-        End
-------------------------------------------------------------------
-    >\x{1680}<
- 0: \x{1680}
-
-/[\W]/WBZ8
-------------------------------------------------------------------
-        Bra
-        [\P{Xwd}]
-        Ket
-        End
-------------------------------------------------------------------
-    A\x{1712}B
- 0: \x{1712}
-
-/[\w]/WBZ8
-------------------------------------------------------------------
-        Bra
-        [\p{Xwd}]
-        Ket
-        End
-------------------------------------------------------------------
-    >\x{1723}<
- 0: \x{1723}
-
-/\D/WBZ8
-------------------------------------------------------------------
-        Bra
-        notprop Nd
-        Ket
-        End
-------------------------------------------------------------------
-    1\x{3c8}2
- 0: \x{3c8}
-
-/\d/WBZ8
-------------------------------------------------------------------
-        Bra
-        prop Nd
-        Ket
-        End
-------------------------------------------------------------------
-    >\x{6f4}<
- 0: \x{6f4}
-
-/\S/WBZ8
-------------------------------------------------------------------
-        Bra
-        notprop Xsp
-        Ket
-        End
-------------------------------------------------------------------
-    \x{1680}\x{6f4}\x{1680}
- 0: \x{6f4}
-
-/\s/WBZ8
-------------------------------------------------------------------
-        Bra
-        prop Xsp
-        Ket
-        End
-------------------------------------------------------------------
-    >\x{1680}>
- 0: \x{1680}
-
-/\W/WBZ8
-------------------------------------------------------------------
-        Bra
-        notprop Xwd
-        Ket
-        End
-------------------------------------------------------------------
-    A\x{1712}B
- 0: \x{1712}
-
-/\w/WBZ8
-------------------------------------------------------------------
-        Bra
-        prop Xwd
-        Ket
-        End
-------------------------------------------------------------------
-    >\x{1723}<
- 0: \x{1723}
-
-/[[:alpha:]]/WBZ
-------------------------------------------------------------------
-        Bra
-        [\p{L}]
-        Ket
-        End
-------------------------------------------------------------------
-
-/[[:lower:]]/WBZ
-------------------------------------------------------------------
-        Bra
-        [\p{Ll}]
-        Ket
-        End
-------------------------------------------------------------------
-
-/[[:upper:]]/WBZ
-------------------------------------------------------------------
-        Bra
-        [\p{Lu}]
-        Ket
-        End
-------------------------------------------------------------------
-
-/[[:alnum:]]/WBZ
-------------------------------------------------------------------
-        Bra
-        [\p{Xan}]
-        Ket
-        End
-------------------------------------------------------------------
-
-/[[:ascii:]]/WBZ
-------------------------------------------------------------------
-        Bra
-        [\x00-\x7f]
-        Ket
-        End
-------------------------------------------------------------------
-
-/[[:cntrl:]]/WBZ
-------------------------------------------------------------------
-        Bra
-        [\x00-\x1f\x7f]
-        Ket
-        End
-------------------------------------------------------------------
-
-/[[:digit:]]/WBZ
-------------------------------------------------------------------
-        Bra
-        [\p{Nd}]
-        Ket
-        End
-------------------------------------------------------------------
-
-/[[:graph:]]/WBZ
-------------------------------------------------------------------
-        Bra
-        [[:graph:]]
-        Ket
-        End
-------------------------------------------------------------------
-
-/[[:print:]]/WBZ
-------------------------------------------------------------------
-        Bra
-        [[:print:]]
-        Ket
-        End
-------------------------------------------------------------------
-
-/[[:punct:]]/WBZ
-------------------------------------------------------------------
-        Bra
-        [[:punct:]]
-        Ket
-        End
-------------------------------------------------------------------
-
-/[[:space:]]/WBZ
-------------------------------------------------------------------
-        Bra
-        [\p{Xps}]
-        Ket
-        End
-------------------------------------------------------------------
-
-/[[:word:]]/WBZ
-------------------------------------------------------------------
-        Bra
-        [\p{Xwd}]
-        Ket
-        End
-------------------------------------------------------------------
-
-/[[:xdigit:]]/WBZ
-------------------------------------------------------------------
-        Bra
-        [0-9A-Fa-f]
-        Ket
-        End
-------------------------------------------------------------------
-
-/-- Unicode properties for \b abd \B --/
-
-/\b...\B/8W
-    abc_
- 0: abc
-    \x{37e}abc\x{376} 
- 0: abc
-    \x{37e}\x{376}\x{371}\x{393}\x{394} 
- 0: \x{376}\x{371}\x{393}
-    !\x{c0}++\x{c1}\x{c2} 
- 0: ++\x{c1}
-    !\x{c0}+++++ 
- 0: \x{c0}++
-
-/-- Without PCRE_UCP, non-ASCII always fail, even if < 256  --/
-
-/\b...\B/8
-    abc_
- 0: abc
-    ** Failers 
- 0: Fai
-    \x{37e}abc\x{376} 
-No match
-    \x{37e}\x{376}\x{371}\x{393}\x{394} 
-No match
-    !\x{c0}++\x{c1}\x{c2} 
-No match
-    !\x{c0}+++++ 
-No match
-
-/-- With PCRE_UCP, non-UTF8 chars that are < 256 still check properties  --/
-
-/\b...\B/W
-    abc_
- 0: abc
-    !\x{c0}++\x{c1}\x{c2} 
- 0: ++\xc1
-    !\x{c0}+++++ 
- 0: \xc0++
-
-/-- Some of these are silly, but they check various combinations --/
-
-/[[:^alpha:][:^cntrl:]]+/8WBZ
-------------------------------------------------------------------
-        Bra
-        [ -~\x80-\xff\P{L}\x{100}-\x{10ffff}]++
-        Ket
-        End
-------------------------------------------------------------------
-    123
- 0: 123
-    abc 
- 0: abc
-
-/[[:^cntrl:][:^alpha:]]+/8WBZ
-------------------------------------------------------------------
-        Bra
-        [ -~\x80-\xff\x{100}-\x{10ffff}\P{L}]++
-        Ket
-        End
-------------------------------------------------------------------
-    123
- 0: 123
-    abc 
- 0: abc
-
-/[[:alpha:]]+/8WBZ
-------------------------------------------------------------------
-        Bra
-        [\p{L}]++
-        Ket
-        End
-------------------------------------------------------------------
-    abc
- 0: abc
-
-/[[:^alpha:]\S]+/8WBZ
-------------------------------------------------------------------
-        Bra
-        [\P{L}\P{Xsp}]++
-        Ket
-        End
-------------------------------------------------------------------
-    123
- 0: 123
-    abc 
- 0: abc
-
-/[^\d]+/8WBZ
-------------------------------------------------------------------
-        Bra
-        [^\p{Nd}]++
-        Ket
-        End
-------------------------------------------------------------------
-    abc123
- 0: abc
-    abc\x{123}
- 0: abc\x{123}
-    \x{660}abc   
- 0: abc
-
-/\p{Lu}+9\p{Lu}+B\p{Lu}+b/BZ
-------------------------------------------------------------------
-        Bra
-        prop Lu ++
-        9
-        prop Lu +
-        B
-        prop Lu ++
-        b
-        Ket
-        End
-------------------------------------------------------------------
-
-/\p{^Lu}+9\p{^Lu}+B\p{^Lu}+b/BZ
-------------------------------------------------------------------
-        Bra
-        notprop Lu +
-        9
-        notprop Lu ++
-        B
-        notprop Lu +
-        b
-        Ket
-        End
-------------------------------------------------------------------
-
-/\P{Lu}+9\P{Lu}+B\P{Lu}+b/BZ
-------------------------------------------------------------------
-        Bra
-        notprop Lu +
-        9
-        notprop Lu ++
-        B
-        notprop Lu +
-        b
-        Ket
-        End
-------------------------------------------------------------------
-
-/\p{Han}+X\p{Greek}+\x{370}/BZ8
-------------------------------------------------------------------
-        Bra
-        prop Han ++
-        X
-        prop Greek +
-        \x{370}
-        Ket
-        End
-------------------------------------------------------------------
-
-/\p{Xan}+!\p{Xan}+A/BZ
-------------------------------------------------------------------
-        Bra
-        prop Xan ++
-        !
-        prop Xan +
-        A
-        Ket
-        End
-------------------------------------------------------------------
-
-/\p{Xsp}+!\p{Xsp}\t/BZ
-------------------------------------------------------------------
-        Bra
-        prop Xsp ++
-        !
-        prop Xsp
-        \x09
-        Ket
-        End
-------------------------------------------------------------------
-
-/\p{Xps}+!\p{Xps}\t/BZ
-------------------------------------------------------------------
-        Bra
-        prop Xps ++
-        !
-        prop Xps
-        \x09
-        Ket
-        End
-------------------------------------------------------------------
-
-/\p{Xwd}+!\p{Xwd}_/BZ
-------------------------------------------------------------------
-        Bra
-        prop Xwd ++
-        !
-        prop Xwd
-        _
-        Ket
-        End
-------------------------------------------------------------------
-
-/A+\p{N}A+\dB+\p{N}*B+\d*/WBZ
-------------------------------------------------------------------
-        Bra
-        A++
-        prop N
-        A++
-        prop Nd
-        B+
-        prop N *+
-        B++
-        prop Nd *+
-        Ket
-        End
-------------------------------------------------------------------
-
-/-- These behaved oddly in Perl, so they are kept in this test --/
-
-/(\x{23a}\x{23a}\x{23a})?\1/8i
-    \x{23a}\x{23a}\x{23a}\x{2c65}\x{2c65}
-No match
-
-/(ȺȺȺ)?\1/8i
-    ȺȺȺⱥⱥ
-No match
-
-/(\x{23a}\x{23a}\x{23a})?\1/8i
-    \x{23a}\x{23a}\x{23a}\x{2c65}\x{2c65}\x{2c65}
- 0: \x{23a}\x{23a}\x{23a}\x{2c65}\x{2c65}\x{2c65}
- 1: \x{23a}\x{23a}\x{23a}
-
-/(ȺȺȺ)?\1/8i
-    ȺȺȺⱥⱥⱥ
- 0: \x{23a}\x{23a}\x{23a}\x{2c65}\x{2c65}\x{2c65}
- 1: \x{23a}\x{23a}\x{23a}
-
-/(\x{23a}\x{23a}\x{23a})\1/8i
-    \x{23a}\x{23a}\x{23a}\x{2c65}\x{2c65}
-No match
-
-/(ȺȺȺ)\1/8i
-    ȺȺȺⱥⱥ
-No match
-
-/(\x{23a}\x{23a}\x{23a})\1/8i
-    \x{23a}\x{23a}\x{23a}\x{2c65}\x{2c65}\x{2c65}
- 0: \x{23a}\x{23a}\x{23a}\x{2c65}\x{2c65}\x{2c65}
- 1: \x{23a}\x{23a}\x{23a}
-
-/(ȺȺȺ)\1/8i
-    ȺȺȺⱥⱥⱥ
- 0: \x{23a}\x{23a}\x{23a}\x{2c65}\x{2c65}\x{2c65}
- 1: \x{23a}\x{23a}\x{23a}
-
-/(\x{2c65}\x{2c65})\1/8i
-    \x{2c65}\x{2c65}\x{23a}\x{23a}
- 0: \x{2c65}\x{2c65}\x{23a}\x{23a}
- 1: \x{2c65}\x{2c65}
-    
-/(ⱥⱥ)\1/8i
-    ⱥⱥȺȺ 
- 0: \x{2c65}\x{2c65}\x{23a}\x{23a}
- 1: \x{2c65}\x{2c65}
-    
-/(\x{23a}\x{23a}\x{23a})\1Y/8i
-    X\x{23a}\x{23a}\x{23a}\x{2c65}\x{2c65}\x{2c65}YZ
- 0: \x{23a}\x{23a}\x{23a}\x{2c65}\x{2c65}\x{2c65}Y
- 1: \x{23a}\x{23a}\x{23a}
-
-/(\x{2c65}\x{2c65})\1Y/8i
-    X\x{2c65}\x{2c65}\x{23a}\x{23a}YZ
- 0: \x{2c65}\x{2c65}\x{23a}\x{23a}Y
- 1: \x{2c65}\x{2c65}
-
-/-- --/ 
-
-/-- These scripts weren't yet in Perl when I added Unicode 6.0.0 to PCRE --/
-
-/^[\p{Batak}]/8
-    \x{1bc0}
- 0: \x{1bc0}
-    \x{1bff}
- 0: \x{1bff}
-    ** Failers
-No match
-    \x{1bf4}
-No match
-    
-/^[\p{Brahmi}]/8
-    \x{11000}
- 0: \x{11000}
-    \x{1106f}
- 0: \x{1106f}
-    ** Failers
-No match
-    \x{1104e}
-No match
-    
-/^[\p{Mandaic}]/8
-    \x{840}
- 0: \x{840}
-    \x{85e}
- 0: \x{85e}
-    ** Failers
-No match
-    \x{85c}
-No match
-    \x{85d}    
-No match
-
-/-- --/ 
-
-/(\X*)(.)/s8
-    A\x{300}
- 0: A
- 1: 
- 2: A
-
-/^S(\X*)e(\X*)$/8
-    Stéréo
- 0: Ste\x{301}re\x{301}o
- 1: te\x{301}r
- 2: \x{301}o
-    
-/^\X/8 
-    ́réo
- 0: \x{301}
-
-/^a\X41z/<JS>
-    aX41z
- 0: aX41z
-    *** Failers
-No match
-    aAz
-No match
-
-/(?<=ab\Cde)X/8
-Failed: \C not allowed in lookbehind assertion at offset 10
-
-/\X/
-    a\P
- 0: a
-    a\P\P
-Partial match: a
-
-/\Xa/
-    aa\P
- 0: aa
-    aa\P\P
- 0: aa
-
-/\X{2}/
-    aa\P
- 0: aa
-    aa\P\P
-Partial match: aa
-
-/\X+a/
-    a\P
-Partial match: a
-    aa\P
- 0: aa
-    aa\P\P
-Partial match: aa
-
-/\X+?a/
-    a\P
-Partial match: a
-    ab\P
-Partial match: ab
-    aa\P
- 0: aa
-    aa\P\P
- 0: aa
-    aba\P
- 0: aba
-    
-/-- These Unicode 6.1.0 scripts are not known to Perl. --/ 
-
-/\p{Chakma}\d/8W
-    \x{11100}\x{1113c}
- 0: \x{11100}\x{1113c}
-
-/\p{Takri}\d/8W
-    \x{11680}\x{116c0}
- 0: \x{11680}\x{116c0}
-
-/^\X/8
-    A\P
- 0: A
-    A\P\P 
-Partial match: A
-    A\x{300}\x{301}\P
- 0: A\x{300}\x{301}
-    A\x{300}\x{301}\P\P  
-Partial match: A\x{300}\x{301}
-    A\x{301}\P
- 0: A\x{301}
-    A\x{301}\P\P  
-Partial match: A\x{301}
-    
-/^\X{2,3}/8
-    A\P
-Partial match: A
-    A\P\P 
-Partial match: A
-    AA\P
- 0: AA
-    AA\P\P  
-Partial match: AA
-    A\x{300}\x{301}\P
-Partial match: A\x{300}\x{301}
-    A\x{300}\x{301}\P\P  
-Partial match: A\x{300}\x{301}
-    A\x{300}\x{301}A\x{300}\x{301}\P
- 0: A\x{300}\x{301}A\x{300}\x{301}
-    A\x{300}\x{301}A\x{300}\x{301}\P\P  
-Partial match: A\x{300}\x{301}A\x{300}\x{301}
-
-/^\X{2}/8
-    AA\P
- 0: AA
-    AA\P\P  
-Partial match: AA
-    A\x{300}\x{301}A\x{300}\x{301}\P
- 0: A\x{300}\x{301}A\x{300}\x{301}
-    A\x{300}\x{301}A\x{300}\x{301}\P\P  
-Partial match: A\x{300}\x{301}A\x{300}\x{301}
-    
-/^\X+/8
-    AA\P
- 0: AA
-    AA\P\P  
-Partial match: AA
-
-/^\X+?Z/8
-    AA\P
-Partial match: AA
-    AA\P\P 
-Partial match: AA
-
-/A\x{3a3}B/8iDZ
-------------------------------------------------------------------
-        Bra
-     /i A
-        clist 03a3 03c2 03c3
-     /i B
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: caseless utf
-First char = 'A' (caseless)
-Need char = 'B' (caseless)
-
-/\x{3a3}B/8iDZ
-------------------------------------------------------------------
-        Bra
-        clist 03a3 03c2 03c3
-     /i B
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: caseless utf
-No first char
-Need char = 'B' (caseless)
-
-/[\x{3a3}]/8iBZ
-------------------------------------------------------------------
-        Bra
-        clist 03a3 03c2 03c3
-        Ket
-        End
-------------------------------------------------------------------
-
-/[^\x{3a3}]/8iBZ
-------------------------------------------------------------------
-        Bra
-        not clist 03a3 03c2 03c3
-        Ket
-        End
-------------------------------------------------------------------
-
-/[\x{3a3}]+/8iBZ
-------------------------------------------------------------------
-        Bra
-        clist 03a3 03c2 03c3 ++
-        Ket
-        End
-------------------------------------------------------------------
-
-/[^\x{3a3}]+/8iBZ
-------------------------------------------------------------------
-        Bra
-        not clist 03a3 03c2 03c3 ++
-        Ket
-        End
-------------------------------------------------------------------
-
-/a*\x{3a3}/8iBZ
-------------------------------------------------------------------
-        Bra
-     /i a*+
-        clist 03a3 03c2 03c3
-        Ket
-        End
-------------------------------------------------------------------
-
-/\x{3a3}+a/8iBZ
-------------------------------------------------------------------
-        Bra
-        clist 03a3 03c2 03c3 ++
-     /i a
-        Ket
-        End
-------------------------------------------------------------------
-
-/\x{3a3}*\x{3c2}/8iBZ
-------------------------------------------------------------------
-        Bra
-        clist 03a3 03c2 03c3 *
-        clist 03a3 03c2 03c3
-        Ket
-        End
-------------------------------------------------------------------
-
-/\x{3a3}{3}/8i+
-    \x{3a3}\x{3c3}\x{3c2}\x{3a3}\x{3c3}\x{3c2}
- 0: \x{3a3}\x{3c3}\x{3c2}
- 0+ \x{3a3}\x{3c3}\x{3c2}
-
-/\x{3a3}{2,4}/8i+
-    \x{3a3}\x{3c3}\x{3c2}\x{3a3}\x{3c3}\x{3c2}
- 0: \x{3a3}\x{3c3}\x{3c2}\x{3a3}
- 0+ \x{3c3}\x{3c2}
-
-/\x{3a3}{2,4}?/8i+
-    \x{3a3}\x{3c3}\x{3c2}\x{3a3}\x{3c3}\x{3c2}
- 0: \x{3a3}\x{3c3}
- 0+ \x{3c2}\x{3a3}\x{3c3}\x{3c2}
-
-/\x{3a3}+./8i+
-    \x{3a3}\x{3c3}\x{3c2}\x{3a3}\x{3c3}\x{3c2}
- 0: \x{3a3}\x{3c3}\x{3c2}\x{3a3}\x{3c3}\x{3c2}
- 0+ 
-
-/\x{3a3}++./8i+
-    ** Failers
-No match
-    \x{3a3}\x{3c3}\x{3c2}\x{3a3}\x{3c3}\x{3c2}
-No match
-
-/\x{3a3}*\x{3c2}/8iBZ
-------------------------------------------------------------------
-        Bra
-        clist 03a3 03c2 03c3 *
-        clist 03a3 03c2 03c3
-        Ket
-        End
-------------------------------------------------------------------
-
-/[^\x{3a3}]*\x{3c2}/8iBZ
-------------------------------------------------------------------
-        Bra
-        not clist 03a3 03c2 03c3 *+
-        clist 03a3 03c2 03c3
-        Ket
-        End
-------------------------------------------------------------------
-
-/[^a]*\x{3c2}/8iBZ
-------------------------------------------------------------------
-        Bra
-     /i [^a]*
-        clist 03a3 03c2 03c3
-        Ket
-        End
-------------------------------------------------------------------
-
-/ist/8iBZ
-------------------------------------------------------------------
-        Bra
-     /i i
-        clist 0053 0073 017f
-     /i t
-        Ket
-        End
-------------------------------------------------------------------
-    ikt
-No match
-
-/is+t/8i
-    iSs\x{17f}t
- 0: iSs\x{17f}t
-    ikt
-No match
-
-/is+?t/8i
-    ikt
-No match
-
-/is?t/8i
-    ikt
-No match
-
-/is{2}t/8i
-    iskt
-No match
-    
-/-- This property is a PCRE special --/
-
-/^\p{Xuc}/8
-    $abc
- 0: $
-    @abc
- 0: @
-    `abc
- 0: `
-    \x{1234}abc
- 0: \x{1234}
-    ** Failers
-No match
-    abc     
-No match
-
-/^\p{Xuc}+/8
-    $@`\x{a0}\x{1234}\x{e000}**
- 0: $@`\x{a0}\x{1234}\x{e000}
-    ** Failers
-No match
-    \x{9f}
-No match
-
-/^\p{Xuc}+?/8
-    $@`\x{a0}\x{1234}\x{e000}**
- 0: $
-    ** Failers
-No match
-    \x{9f}
-No match
-
-/^\p{Xuc}+?\*/8
-    $@`\x{a0}\x{1234}\x{e000}**
- 0: $@`\x{a0}\x{1234}\x{e000}*
-    ** Failers
-No match
-    \x{9f}
-No match
-
-/^\p{Xuc}++/8
-    $@`\x{a0}\x{1234}\x{e000}**
- 0: $@`\x{a0}\x{1234}\x{e000}
-    ** Failers
-No match
-    \x{9f}
-No match
-
-/^\p{Xuc}{3,5}/8
-    $@`\x{a0}\x{1234}\x{e000}**
- 0: $@`\x{a0}\x{1234}
-    ** Failers
-No match
-    \x{9f}
-No match
-
-/^\p{Xuc}{3,5}?/8
-    $@`\x{a0}\x{1234}\x{e000}**
- 0: $@`
-    ** Failers
-No match
-    \x{9f}
-No match
-
-/^[\p{Xuc}]/8
-    $@`\x{a0}\x{1234}\x{e000}**
- 0: $
-    ** Failers
-No match
-    \x{9f}
-No match
-
-/^[\p{Xuc}]+/8
-    $@`\x{a0}\x{1234}\x{e000}**
- 0: $@`\x{a0}\x{1234}\x{e000}
-    ** Failers
-No match
-    \x{9f}
-No match
-
-/^\P{Xuc}/8
-    abc
- 0: a
-    ** Failers
- 0: *
-    $abc
-No match
-    @abc
-No match
-    `abc
-No match
-    \x{1234}abc
-No match
-
-/^[\P{Xuc}]/8
-    abc
- 0: a
-    ** Failers
- 0: *
-    $abc
-No match
-    @abc
-No match
-    `abc
-No match
-    \x{1234}abc
-No match
-    
-/-- Some auto-possessification tests --/
-
-/\pN+\z/BZ
-------------------------------------------------------------------
-        Bra
-        prop N ++
-        \z
-        Ket
-        End
-------------------------------------------------------------------
-
-/\PN+\z/BZ
-------------------------------------------------------------------
-        Bra
-        notprop N ++
-        \z
-        Ket
-        End
-------------------------------------------------------------------
-
-/\pN+/BZ
-------------------------------------------------------------------
-        Bra
-        prop N ++
-        Ket
-        End
-------------------------------------------------------------------
-
-/\PN+/BZ
-------------------------------------------------------------------
-        Bra
-        notprop N ++
-        Ket
-        End
-------------------------------------------------------------------
-
-/\p{Any}+\p{Any} \p{Any}+\P{Any} \p{Any}+\p{L&} \p{Any}+\p{L} \p{Any}+\p{Lu} \p{Any}+\p{Han} \p{Any}+\p{Xan} \p{Any}+\p{Xsp} \p{Any}+\p{Xps} \p{Xwd}+\p{Any} \p{Any}+\p{Xuc}/BWZx  
-------------------------------------------------------------------
-        Bra
-        prop Any +
-        prop Any
-        prop Any +
-        notprop Any
-        prop Any +
-        prop L&
-        prop Any +
-        prop L
-        prop Any +
-        prop Lu
-        prop Any +
-        prop Han
-        prop Any +
-        prop Xan
-        prop Any +
-        prop Xsp
-        prop Any +
-        prop Xps
-        prop Xwd +
-        prop Any
-        prop Any +
-        prop Xuc
-        Ket
-        End
-------------------------------------------------------------------
-
-/\p{L&}+\p{Any} \p{L&}+\p{L&} \P{L&}+\p{L&} \p{L&}+\p{L} \p{L&}+\p{Lu} \p{L&}+\p{Han} \p{L&}+\p{Xan} \p{L&}+\P{Xan} \p{L&}+\p{Xsp} \p{L&}+\p{Xps} \p{Xwd}+\p{L&} \p{L&}+\p{Xuc}/BWZx  
-------------------------------------------------------------------
-        Bra
-        prop L& +
-        prop Any
-        prop L& +
-        prop L&
-        notprop L& ++
-        prop L&
-        prop L& +
-        prop L
-        prop L& +
-        prop Lu
-        prop L& +
-        prop Han
-        prop L& +
-        prop Xan
-        prop L& ++
-        notprop Xan
-        prop L& ++
-        prop Xsp
-        prop L& ++
-        prop Xps
-        prop Xwd +
-        prop L&
-        prop L& +
-        prop Xuc
-        Ket
-        End
-------------------------------------------------------------------
-
-/\p{N}+\p{Any} \p{N}+\p{L&} \p{N}+\p{L} \p{N}+\P{L} \p{N}+\P{N} \p{N}+\p{Lu} \p{N}+\p{Han} \p{N}+\p{Xan} \p{N}+\p{Xsp} \p{N}+\p{Xps} \p{Xwd}+\p{N} \p{N}+\p{Xuc}/BWZx  
-------------------------------------------------------------------
-        Bra
-        prop N +
-        prop Any
-        prop N +
-        prop L&
-        prop N ++
-        prop L
-        prop N +
-        notprop L
-        prop N ++
-        notprop N
-        prop N ++
-        prop Lu
-        prop N +
-        prop Han
-        prop N +
-        prop Xan
-        prop N ++
-        prop Xsp
-        prop N ++
-        prop Xps
-        prop Xwd +
-        prop N
-        prop N +
-        prop Xuc
-        Ket
-        End
-------------------------------------------------------------------
-
-/\p{Lu}+\p{Any} \p{Lu}+\p{L&} \p{Lu}+\p{L} \p{Lu}+\p{Lu} \P{Lu}+\p{Lu} \p{Lu}+\p{Nd} \p{Lu}+\P{Nd} \p{Lu}+\p{Han} \p{Lu}+\p{Xan} \p{Lu}+\p{Xsp} \p{Lu}+\p{Xps} \p{Xwd}+\p{Lu} \p{Lu}+\p{Xuc}/BWZx  
-------------------------------------------------------------------
-        Bra
-        prop Lu +
-        prop Any
-        prop Lu +
-        prop L&
-        prop Lu +
-        prop L
-        prop Lu +
-        prop Lu
-        notprop Lu ++
-        prop Lu
-        prop Lu ++
-        prop Nd
-        prop Lu +
-        notprop Nd
-        prop Lu +
-        prop Han
-        prop Lu +
-        prop Xan
-        prop Lu ++
-        prop Xsp
-        prop Lu ++
-        prop Xps
-        prop Xwd +
-        prop Lu
-        prop Lu +
-        prop Xuc
-        Ket
-        End
-------------------------------------------------------------------
-
-/\p{Han}+\p{Lu} \p{Han}+\p{L&} \p{Han}+\p{L} \p{Han}+\p{Lu} \p{Han}+\p{Arabic} \p{Arabic}+\p{Arabic} \p{Han}+\p{Xan} \p{Han}+\p{Xsp} \p{Han}+\p{Xps} \p{Xwd}+\p{Han} \p{Han}+\p{Xuc}/BWZx  
-------------------------------------------------------------------
-        Bra
-        prop Han +
-        prop Lu
-        prop Han +
-        prop L&
-        prop Han +
-        prop L
-        prop Han +
-        prop Lu
-        prop Han ++
-        prop Arabic
-        prop Arabic +
-        prop Arabic
-        prop Han +
-        prop Xan
-        prop Han +
-        prop Xsp
-        prop Han +
-        prop Xps
-        prop Xwd +
-        prop Han
-        prop Han +
-        prop Xuc
-        Ket
-        End
-------------------------------------------------------------------
-
-/\p{Xan}+\p{Any} \p{Xan}+\p{L&} \P{Xan}+\p{L&} \p{Xan}+\p{L} \p{Xan}+\p{Lu} \p{Xan}+\p{Han} \p{Xan}+\p{Xan} \p{Xan}+\P{Xan} \p{Xan}+\p{Xsp} \p{Xan}+\p{Xps} \p{Xwd}+\p{Xan} \p{Xan}+\p{Xuc}/BWZx  
-------------------------------------------------------------------
-        Bra
-        prop Xan +
-        prop Any
-        prop Xan +
-        prop L&
-        notprop Xan ++
-        prop L&
-        prop Xan +
-        prop L
-        prop Xan +
-        prop Lu
-        prop Xan +
-        prop Han
-        prop Xan +
-        prop Xan
-        prop Xan ++
-        notprop Xan
-        prop Xan ++
-        prop Xsp
-        prop Xan ++
-        prop Xps
-        prop Xwd +
-        prop Xan
-        prop Xan +
-        prop Xuc
-        Ket
-        End
-------------------------------------------------------------------
-
-/\p{Xsp}+\p{Any} \p{Xsp}+\p{L&} \p{Xsp}+\p{L} \p{Xsp}+\p{Lu} \p{Xsp}+\p{Han} \p{Xsp}+\p{Xan} \p{Xsp}+\p{Xsp} \P{Xsp}+\p{Xsp} \p{Xsp}+\p{Xps} \p{Xwd}+\p{Xsp} \p{Xsp}+\p{Xuc}/BWZx  
-------------------------------------------------------------------
-        Bra
-        prop Xsp +
-        prop Any
-        prop Xsp ++
-        prop L&
-        prop Xsp ++
-        prop L
-        prop Xsp ++
-        prop Lu
-        prop Xsp +
-        prop Han
-        prop Xsp ++
-        prop Xan
-        prop Xsp +
-        prop Xsp
-        notprop Xsp ++
-        prop Xsp
-        prop Xsp +
-        prop Xps
-        prop Xwd ++
-        prop Xsp
-        prop Xsp +
-        prop Xuc
-        Ket
-        End
-------------------------------------------------------------------
-
-/\p{Xwd}+\p{Any} \p{Xwd}+\p{L&} \p{Xwd}+\p{L} \p{Xwd}+\p{Lu} \p{Xwd}+\p{Han} \p{Xwd}+\p{Xan} \p{Xwd}+\p{Xsp} \p{Xwd}+\p{Xps} \p{Xwd}+\p{Xwd} \p{Xwd}+\P{Xwd} \p{Xwd}+\p{Xuc}/BWZx  
-------------------------------------------------------------------
-        Bra
-        prop Xwd +
-        prop Any
-        prop Xwd +
-        prop L&
-        prop Xwd +
-        prop L
-        prop Xwd +
-        prop Lu
-        prop Xwd +
-        prop Han
-        prop Xwd +
-        prop Xan
-        prop Xwd ++
-        prop Xsp
-        prop Xwd ++
-        prop Xps
-        prop Xwd +
-        prop Xwd
-        prop Xwd ++
-        notprop Xwd
-        prop Xwd +
-        prop Xuc
-        Ket
-        End
-------------------------------------------------------------------
-
-/\p{Xuc}+\p{Any} \p{Xuc}+\p{L&} \p{Xuc}+\p{L} \p{Xuc}+\p{Lu} \p{Xuc}+\p{Han} \p{Xuc}+\p{Xan} \p{Xuc}+\p{Xsp} \p{Xuc}+\p{Xps} \p{Xwd}+\p{Xuc} \p{Xuc}+\p{Xuc} \p{Xuc}+\P{Xuc}/BWZx  
-------------------------------------------------------------------
-        Bra
-        prop Xuc +
-        prop Any
-        prop Xuc +
-        prop L&
-        prop Xuc +
-        prop L
-        prop Xuc +
-        prop Lu
-        prop Xuc +
-        prop Han
-        prop Xuc +
-        prop Xan
-        prop Xuc +
-        prop Xsp
-        prop Xuc +
-        prop Xps
-        prop Xwd +
-        prop Xuc
-        prop Xuc +
-        prop Xuc
-        prop Xuc ++
-        notprop Xuc
-        Ket
-        End
-------------------------------------------------------------------
-
-/\p{N}+\p{Ll} \p{N}+\p{Nd} \p{N}+\P{Nd}/BWZx
-------------------------------------------------------------------
-        Bra
-        prop N ++
-        prop Ll
-        prop N +
-        prop Nd
-        prop N +
-        notprop Nd
-        Ket
-        End
-------------------------------------------------------------------
-
-/\p{Xan}+\p{L} \p{Xan}+\p{N} \p{Xan}+\p{C} \p{Xan}+\P{L} \P{Xan}+\p{N} \p{Xan}+\P{C}/BWZx
-------------------------------------------------------------------
-        Bra
-        prop Xan +
-        prop L
-        prop Xan +
-        prop N
-        prop Xan ++
-        prop C
-        prop Xan +
-        notprop L
-        notprop Xan ++
-        prop N
-        prop Xan +
-        notprop C
-        Ket
-        End
-------------------------------------------------------------------
-
-/\p{L}+\p{Xan} \p{N}+\p{Xan} \p{C}+\p{Xan} \P{L}+\p{Xan} \p{N}+\p{Xan} \P{C}+\p{Xan} \p{L}+\P{Xan}/BWZx
-------------------------------------------------------------------
-        Bra
-        prop L +
-        prop Xan
-        prop N +
-        prop Xan
-        prop C ++
-        prop Xan
-        notprop L +
-        prop Xan
-        prop N +
-        prop Xan
-        notprop C +
-        prop Xan
-        prop L ++
-        notprop Xan
-        Ket
-        End
-------------------------------------------------------------------
-
-/\p{Xan}+\p{Lu} \p{Xan}+\p{Nd} \p{Xan}+\p{Cc} \p{Xan}+\P{Ll} \P{Xan}+\p{No} \p{Xan}+\P{Cf}/BWZx
-------------------------------------------------------------------
-        Bra
-        prop Xan +
-        prop Lu
-        prop Xan +
-        prop Nd
-        prop Xan ++
-        prop Cc
-        prop Xan +
-        notprop Ll
-        notprop Xan ++
-        prop No
-        prop Xan +
-        notprop Cf
-        Ket
-        End
-------------------------------------------------------------------
-
-/\p{Lu}+\p{Xan} \p{Nd}+\p{Xan} \p{Cs}+\p{Xan} \P{Lt}+\p{Xan} \p{Nl}+\p{Xan} \P{Cc}+\p{Xan} \p{Lt}+\P{Xan}/BWZx
-------------------------------------------------------------------
-        Bra
-        prop Lu +
-        prop Xan
-        prop Nd +
-        prop Xan
-        prop Cs ++
-        prop Xan
-        notprop Lt +
-        prop Xan
-        prop Nl +
-        prop Xan
-        notprop Cc +
-        prop Xan
-        prop Lt ++
-        notprop Xan
-        Ket
-        End
-------------------------------------------------------------------
-
-/\w+\p{P} \w+\p{Po} \w+\s \p{Xan}+\s \s+\p{Xan} \s+\w/BWZx
-------------------------------------------------------------------
-        Bra
-        prop Xwd +
-        prop P
-        prop Xwd +
-        prop Po
-        prop Xwd ++
-        prop Xsp
-        prop Xan ++
-        prop Xsp
-        prop Xsp ++
-        prop Xan
-        prop Xsp ++
-        prop Xwd
-        Ket
-        End
-------------------------------------------------------------------
-
-/\w+\P{P} \W+\p{Po} \w+\S \P{Xan}+\s \s+\P{Xan} \s+\W/BWZx
-------------------------------------------------------------------
-        Bra
-        prop Xwd +
-        notprop P
-        notprop Xwd +
-        prop Po
-        prop Xwd +
-        notprop Xsp
-        notprop Xan +
-        prop Xsp
-        prop Xsp +
-        notprop Xan
-        prop Xsp +
-        notprop Xwd
-        Ket
-        End
-------------------------------------------------------------------
-
-/\w+\p{Po} \w+\p{Pc} \W+\p{Po} \W+\p{Pc} \w+\P{Po} \w+\P{Pc}/BWZx
-------------------------------------------------------------------
-        Bra
-        prop Xwd +
-        prop Po
-        prop Xwd ++
-        prop Pc
-        notprop Xwd +
-        prop Po
-        notprop Xwd +
-        prop Pc
-        prop Xwd +
-        notprop Po
-        prop Xwd +
-        notprop Pc
-        Ket
-        End
-------------------------------------------------------------------
-
-/\p{Nl}+\p{Xan} \P{Nl}+\p{Xan} \p{Nl}+\P{Xan} \P{Nl}+\P{Xan}/BWZx
-------------------------------------------------------------------
-        Bra
-        prop Nl +
-        prop Xan
-        notprop Nl +
-        prop Xan
-        prop Nl ++
-        notprop Xan
-        notprop Nl +
-        notprop Xan
-        Ket
-        End
-------------------------------------------------------------------
-
-/\p{Xan}+\p{Nl} \P{Xan}+\p{Nl} \p{Xan}+\P{Nl} \P{Xan}+\P{Nl}/BWZx
-------------------------------------------------------------------
-        Bra
-        prop Xan +
-        prop Nl
-        notprop Xan ++
-        prop Nl
-        prop Xan +
-        notprop Nl
-        notprop Xan +
-        notprop Nl
-        Ket
-        End
-------------------------------------------------------------------
-
-/\p{Xan}+\p{Nd} \P{Xan}+\p{Nd} \p{Xan}+\P{Nd} \P{Xan}+\P{Nd}/BWZx
-------------------------------------------------------------------
-        Bra
-        prop Xan +
-        prop Nd
-        notprop Xan ++
-        prop Nd
-        prop Xan +
-        notprop Nd
-        notprop Xan +
-        notprop Nd
-        Ket
-        End
-------------------------------------------------------------------
-
-/-- End auto-possessification tests --/ 
-
-/\w+/8CWBZ
-------------------------------------------------------------------
-        Bra
-        Callout 255 0 3
-        prop Xwd ++
-        Callout 255 3 0
-        Ket
-        End
-------------------------------------------------------------------
-    abcd
---->abcd
- +0 ^        \w+
- +3 ^   ^    
- 0: abcd
-
-/[\p{N}]?+/BZO
-------------------------------------------------------------------
-        Bra
-        [\p{N}]?+
-        Ket
-        End
-------------------------------------------------------------------
-
-/[\p{L}ab]{2,3}+/BZO
-------------------------------------------------------------------
-        Bra
-        [ab\p{L}]{2,3}+
-        Ket
-        End
-------------------------------------------------------------------
-
-/\D+\X \d+\X \S+\X \s+\X \W+\X \w+\X \C+\X \R+\X \H+\X \h+\X \V+\X \v+\X a+\X \n+\X .+\X/BZx
-------------------------------------------------------------------
-        Bra
-        \D+
-        extuni
-        \d+
-        extuni
-        \S+
-        extuni
-        \s+
-        extuni
-        \W+
-        extuni
-        \w+
-        extuni
-        AllAny+
-        extuni
-        \R+
-        extuni
-        \H+
-        extuni
-        \h+
-        extuni
-        \V+
-        extuni
-        \v+
-        extuni
-        a+
-        extuni
-        \x0a+
-        extuni
-        Any+
-        extuni
-        Ket
-        End
-------------------------------------------------------------------
-
-/.+\X/BZxs
-------------------------------------------------------------------
-        Bra
-        AllAny+
-        extuni
-        Ket
-        End
-------------------------------------------------------------------
-
-/\X+$/BZxm
-------------------------------------------------------------------
-        Bra
-        extuni+
-     /m $
-        Ket
-        End
-------------------------------------------------------------------
-
-/\X+\D \X+\d \X+\S \X+\s \X+\W \X+\w \X+. \X+\C \X+\R \X+\H \X+\h \X+\V \X+\v \X+\X \X+\Z \X+\z \X+$/BZx
-------------------------------------------------------------------
-        Bra
-        extuni+
-        \D
-        extuni+
-        \d
-        extuni+
-        \S
-        extuni+
-        \s
-        extuni+
-        \W
-        extuni+
-        \w
-        extuni+
-        Any
-        extuni+
-        AllAny
-        extuni+
-        \R
-        extuni+
-        \H
-        extuni+
-        \h
-        extuni+
-        \V
-        extuni+
-        \v
-        extuni+
-        extuni
-        extuni+
-        \Z
-        extuni++
-        \z
-        extuni+
-        $
-        Ket
-        End
-------------------------------------------------------------------
-
-/\d+\s{0,5}=\s*\S?=\w{0,4}\W*/8WBZ
-------------------------------------------------------------------
-        Bra
-        prop Nd ++
-        prop Xsp {0,5}+
-        =
-        prop Xsp *+
-        notprop Xsp ?
-        =
-        prop Xwd {0,4}+
-        notprop Xwd *+
-        Ket
-        End
-------------------------------------------------------------------
-
-/[RST]+/8iWBZ
-------------------------------------------------------------------
-        Bra
-        [R-Tr-t\x{17f}]++
-        Ket
-        End
-------------------------------------------------------------------
-    
-/[R-T]+/8iWBZ 
-------------------------------------------------------------------
-        Bra
-        [R-Tr-t\x{17f}]++
-        Ket
-        End
-------------------------------------------------------------------
-
-/[Q-U]+/8iWBZ 
-------------------------------------------------------------------
-        Bra
-        [Q-Uq-u\x{17f}]++
-        Ket
-        End
-------------------------------------------------------------------
-
-/^s?c/mi8I
-Capturing subpattern count = 0
-Options: caseless multiline utf
-First char at start or follows newline
-Need char = 'c' (caseless)
-    scat
- 0: sc
-
-/[\W\p{Any}]/BZ
-------------------------------------------------------------------
-        Bra
-        [\x00-/:-@[-^`{-\xff\p{Any}]
-        Ket
-        End
-------------------------------------------------------------------
-    abc
- 0: a
-    123 
- 0: 1
-
-/[\W\pL]/BZ
-------------------------------------------------------------------
-        Bra
-        [\x00-/:-@[-^`{-\xff\p{L}]
-        Ket
-        End
-------------------------------------------------------------------
-    abc
- 0: a
-    ** Failers 
- 0: *
-    123     
-No match
-
-/a[[:punct:]b]/WBZ
-------------------------------------------------------------------
-        Bra
-        a
-        [b[:punct:]]
-        Ket
-        End
-------------------------------------------------------------------
-
-/a[[:punct:]b]/8WBZ
-------------------------------------------------------------------
-        Bra
-        a
-        [b[:punct:]]
-        Ket
-        End
-------------------------------------------------------------------
-
-/a[b[:punct:]]/8WBZ
-------------------------------------------------------------------
-        Bra
-        a
-        [b[:punct:]]
-        Ket
-        End
-------------------------------------------------------------------
-
-/-- End of testinput7 --/
diff --git a/dist/testdata/testoutput9 b/dist/testdata/testoutput9
deleted file mode 100644
index efbbf18..0000000
--- a/dist/testdata/testoutput9
+++ /dev/null
@@ -1,1287 +0,0 @@
-/-- This set of tests checks UTF-8 support with the DFA matching functionality
-    of pcre_dfa_exec(), excluding Unicode property support. The -dfa flag must
-    be used with pcretest when running it. --/
-    
-< forbid W 
-
-/\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
-
-/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
-    \x{100}aY\x{256}Z 
- 0: \x{100}
- 0: Y\x{256}Z
-    
-/^[^a]{2}/8
-    \x{100}bc
- 0: \x{100}b
- 
-/^[^a]{2,}/8
-    \x{100}bcAa
- 0: \x{100}bcA
-
-/^[^a]{2,}?/8
-    \x{100}bca
- 0: \x{100}bc
- 1: \x{100}b
-
-/[^a]+/8ig
-    bcd
- 0: bcd
-    \x{100}aY\x{256}Z 
- 0: \x{100}
- 0: Y\x{256}Z
-    
-/^[^a]{2}/8i
-    \x{100}bc
- 0: \x{100}b
- 
-/^[^a]{2,}/8i
-    \x{100}bcAa
- 0: \x{100}bc
-
-/^[^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}
-
-/\x{100}{0,3}/8 
-    \x{100}\x{100} 
- 0: \x{100}\x{100}
-    \x{100}\x{100}\x{100}\x{100} 
- 0: \x{100}\x{100}\x{100}
-    
-/\x{100}*/8
-    abce
- 0: 
-    \x{100}\x{100}\x{100}\x{100} 
- 0: \x{100}\x{100}\x{100}\x{100}
-
-/\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}
-
-/\x{100}+/8
-    abcd\x{100}\x{100}\x{100}\x{100} 
- 0: \x{100}\x{100}\x{100}\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}
-
-/\x{100}{3,}/8O
-    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*/8O
-  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-Matched, but offsets vector is too small to show all 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*/8O
-  \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\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 offsets vector is too small to show all 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
-    *** Failers
- 0: *** Failers
-    1234  
-No match
-
-/\D{2,3}/8
-    12abcd34
- 0: abc
-    12ab34
- 0: ab
-    *** Failers  
- 0: ***
-    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
-    *** Failers
-No match
-
-/\d{2,3}/8
-    12abcd34
- 0: 12
-    1234abcd
- 0: 123
-    *** 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
-    *** Failers
- 0: ***
-    \    \ 
-No match
-
-/\S{2,3}/8
-    12abcd34
- 0: 12a
-    1234abcd
- 0: 123
-    *** Failers
- 0: ***
-    \     \  
-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
-    *** Failers
- 0: Failers
-    +++=*! 
-No match
-
-/\w{2,3}/8
-    ab  cd
- 0: ab
-    abcd ce
- 0: abc
-    *** Failers
- 0: Fai
-    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: ====
-    *** Failers
- 0: *** 
-    abcd 
-No match
-
-/\W{2,3}/8
-    ab====cd
- 0: ===
-    ab==cd
- 0: ==
-    *** Failers
- 0: ***
-    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}
-   *** 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}
-   *** 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}
-
-/^abc./mgx8<any>
-    abc1 \x0aabc2 \x0babc3xx \x0cabc4 \x0dabc5xx \x0d\x0aabc6 \x{0085}abc7 \x{2028}abc8 \x{2029}abc9 JUNK
- 0: abc1
- 0: abc2
- 0: abc3
- 0: abc4
- 0: abc5
- 0: abc6
- 0: abc7
- 0: abc8
- 0: abc9
-
-/abc.$/mgx8<any>
-    abc1\x0a abc2\x0b abc3\x0c abc4\x0d abc5\x0d\x0a abc6\x{0085} abc7\x{2028} abc8\x{2029} abc9
- 0: abc1
- 0: abc2
- 0: abc3
- 0: abc4
- 0: abc5
- 0: abc6
- 0: abc7
- 0: abc8
- 0: abc9
-
-/^a\Rb/8<bsr_unicode>
-    a\nb
- 0: a\x{0a}b
-    a\rb
- 0: a\x{0d}b
-    a\r\nb
- 0: a\x{0d}\x{0a}b
-    a\x0bb
- 0: a\x{0b}b
-    a\x0cb
- 0: a\x{0c}b
-    a\x{85}b   
- 0: a\x{85}b
-    a\x{2028}b 
- 0: a\x{2028}b
-    a\x{2029}b 
- 0: a\x{2029}b
-    ** Failers
-No match
-    a\n\rb    
-No match
-
-/^a\R*b/8<bsr_unicode>
-    ab
- 0: ab
-    a\nb
- 0: a\x{0a}b
-    a\rb
- 0: a\x{0d}b
-    a\r\nb
- 0: a\x{0d}\x{0a}b
-    a\x0bb
- 0: a\x{0b}b
-    a\x0c\x{2028}\x{2029}b
- 0: a\x{0c}\x{2028}\x{2029}b
-    a\x{85}b   
- 0: a\x{85}b
-    a\n\rb    
- 0: a\x{0a}\x{0d}b
-    a\n\r\x{85}\x0cb 
- 0: a\x{0a}\x{0d}\x{85}\x{0c}b
-
-/^a\R+b/8<bsr_unicode>
-    a\nb
- 0: a\x{0a}b
-    a\rb
- 0: a\x{0d}b
-    a\r\nb
- 0: a\x{0d}\x{0a}b
-    a\x0bb
- 0: a\x{0b}b
-    a\x0c\x{2028}\x{2029}b
- 0: a\x{0c}\x{2028}\x{2029}b
-    a\x{85}b   
- 0: a\x{85}b
-    a\n\rb    
- 0: a\x{0a}\x{0d}b
-    a\n\r\x{85}\x0cb 
- 0: a\x{0a}\x{0d}\x{85}\x{0c}b
-    ** Failers
-No match
-    ab  
-No match
-
-/^a\R{1,3}b/8<bsr_unicode>
-    a\nb
- 0: a\x{0a}b
-    a\n\rb
- 0: a\x{0a}\x{0d}b
-    a\n\r\x{85}b
- 0: a\x{0a}\x{0d}\x{85}b
-    a\r\n\r\nb 
- 0: a\x{0d}\x{0a}\x{0d}\x{0a}b
-    a\r\n\r\n\r\nb 
- 0: a\x{0d}\x{0a}\x{0d}\x{0a}\x{0d}\x{0a}b
-    a\n\r\n\rb
- 0: a\x{0a}\x{0d}\x{0a}\x{0d}b
-    a\n\n\r\nb 
- 0: a\x{0a}\x{0a}\x{0d}\x{0a}b
-    ** Failers
-No match
-    a\n\n\n\rb
-No match
-    a\r
-No match
-
-/\h+\V?\v{3,4}/8O
-    \x09\x20\x{a0}X\x0a\x0b\x0c\x0d\x0a
- 0: \x{09} \x{a0}X\x{0a}\x{0b}\x{0c}\x{0d}
- 1: \x{09} \x{a0}X\x{0a}\x{0b}\x{0c}
-
-/\V?\v{3,4}/8O 
-    \x20\x{a0}X\x0a\x0b\x0c\x0d\x0a
- 0: X\x{0a}\x{0b}\x{0c}\x{0d}
- 1: X\x{0a}\x{0b}\x{0c}
-
-/\h+\V?\v{3,4}/8O
-    >\x09\x20\x{a0}X\x0a\x0a\x0a<
- 0: \x{09} \x{a0}X\x{0a}\x{0a}\x{0a}
-
-/\V?\v{3,4}/8O
-    >\x09\x20\x{a0}X\x0a\x0a\x0a<
- 0: X\x{0a}\x{0a}\x{0a}
-
-/\H\h\V\v/8
-    X X\x0a
- 0: X X\x{0a}
-    X\x09X\x0b
- 0: X\x{09}X\x{0b}
-    ** Failers
-No match
-    \x{a0} X\x0a   
-No match
-    
-/\H*\h+\V?\v{3,4}/8O 
-    \x09\x20\x{a0}X\x0a\x0b\x0c\x0d\x0a
- 0: \x{09} \x{a0}X\x{0a}\x{0b}\x{0c}\x{0d}
- 1: \x{09} \x{a0}X\x{0a}\x{0b}\x{0c}
-    \x09\x20\x{a0}\x0a\x0b\x0c\x0d\x0a
- 0: \x{09} \x{a0}\x{0a}\x{0b}\x{0c}\x{0d}
- 1: \x{09} \x{a0}\x{0a}\x{0b}\x{0c}
-    \x09\x20\x{a0}\x0a\x0b\x0c
- 0: \x{09} \x{a0}\x{0a}\x{0b}\x{0c}
-    ** Failers 
-No match
-    \x09\x20\x{a0}\x0a\x0b
-No match
-     
-/\H\h\V\v/8
-    \x{3001}\x{3000}\x{2030}\x{2028}
- 0: \x{3001}\x{3000}\x{2030}\x{2028}
-    X\x{180e}X\x{85}
- 0: X\x{180e}X\x{85}
-    ** Failers
-No match
-    \x{2009} X\x0a   
-No match
-    
-/\H*\h+\V?\v{3,4}/8O 
-    \x{1680}\x{180e}\x{2007}X\x{2028}\x{2029}\x0c\x0d\x0a
- 0: \x{1680}\x{180e}\x{2007}X\x{2028}\x{2029}\x{0c}\x{0d}
- 1: \x{1680}\x{180e}\x{2007}X\x{2028}\x{2029}\x{0c}
-    \x09\x{205f}\x{a0}\x0a\x{2029}\x0c\x{2028}\x0a
- 0: \x{09}\x{205f}\x{a0}\x{0a}\x{2029}\x{0c}\x{2028}
- 1: \x{09}\x{205f}\x{a0}\x{0a}\x{2029}\x{0c}
-    \x09\x20\x{202f}\x0a\x0b\x0c
- 0: \x{09} \x{202f}\x{0a}\x{0b}\x{0c}
-    ** Failers 
-No match
-    \x09\x{200a}\x{a0}\x{2028}\x0b
-No match
-     
-/a\Rb/I8<bsr_anycrlf>
-Capturing subpattern count = 0
-Options: bsr_anycrlf utf
-First char = 'a'
-Need char = 'b'
-    a\rb
- 0: a\x{0d}b
-    a\nb
- 0: a\x{0a}b
-    a\r\nb
- 0: a\x{0d}\x{0a}b
-    ** Failers
-No match
-    a\x{85}b
-No match
-    a\x0bb     
-No match
-
-/a\Rb/I8<bsr_unicode>
-Capturing subpattern count = 0
-Options: bsr_unicode utf
-First char = 'a'
-Need char = 'b'
-    a\rb
- 0: a\x{0d}b
-    a\nb
- 0: a\x{0a}b
-    a\r\nb
- 0: a\x{0d}\x{0a}b
-    a\x{85}b
- 0: a\x{85}b
-    a\x0bb     
- 0: a\x{0b}b
-    ** Failers 
-No match
-    a\x{85}b\<bsr_anycrlf>
-No match
-    a\x0bb\<bsr_anycrlf>
-No match
-    
-/a\R?b/I8<bsr_anycrlf>
-Capturing subpattern count = 0
-Options: bsr_anycrlf utf
-First char = 'a'
-Need char = 'b'
-    a\rb
- 0: a\x{0d}b
-    a\nb
- 0: a\x{0a}b
-    a\r\nb
- 0: a\x{0d}\x{0a}b
-    ** Failers
-No match
-    a\x{85}b
-No match
-    a\x0bb     
-No match
-
-/a\R?b/I8<bsr_unicode>
-Capturing subpattern count = 0
-Options: bsr_unicode utf
-First char = 'a'
-Need char = 'b'
-    a\rb
- 0: a\x{0d}b
-    a\nb
- 0: a\x{0a}b
-    a\r\nb
- 0: a\x{0d}\x{0a}b
-    a\x{85}b
- 0: a\x{85}b
-    a\x0bb     
- 0: a\x{0b}b
-    ** Failers 
-No match
-    a\x{85}b\<bsr_anycrlf>
-No match
-    a\x0bb\<bsr_anycrlf>
-No match
- 
-/X/8f<any> 
-    A\x{1ec5}ABCXYZ
- 0: X
-
-/abcd*/8
-    xxxxabcd\P
- 0: abcd
-    xxxxabcd\P\P
-Partial match: abcd
-
-/abcd*/i8
-    xxxxabcd\P
- 0: abcd
-    xxxxabcd\P\P
-Partial match: abcd
-    XXXXABCD\P
- 0: ABCD
-    XXXXABCD\P\P
-Partial match: ABCD
-
-/abc\d*/8
-    xxxxabc1\P
- 0: abc1
-    xxxxabc1\P\P
-Partial match: abc1
-
-/abc[de]*/8
-    xxxxabcde\P
- 0: abcde
-    xxxxabcde\P\P
-Partial match: abcde
-
-/\bthe cat\b/8
-    the cat\P
- 0: the cat
-    the cat\P\P
-Partial match: the cat
-
-/ab\Cde/8
-    abXde
-Error -16 (item unsupported for DFA matching)
-
-/(?<=ab\Cde)X/8
-Failed: \C not allowed in lookbehind assertion at offset 10
-
-/./8<CRLF>
-    \r\P
- 0: \x{0d}
-    \r\P\P 
-Partial match: \x{0d}
-  
-/.{2,3}/8<CRLF>
-    \r\P 
-Partial match: \x{0d}
-    \r\P\P
-Partial match: \x{0d}
-    \r\r\P
- 0: \x{0d}\x{0d}
-    \r\r\P\P
-Partial match: \x{0d}\x{0d}
-    \r\r\r\P
- 0: \x{0d}\x{0d}\x{0d}
-    \r\r\r\P\P     
-Partial match: \x{0d}\x{0d}\x{0d}
-
-/.{2,3}?/8<CRLF>
-    \r\P 
-Partial match: \x{0d}
-    \r\P\P
-Partial match: \x{0d}
-    \r\r\P
- 0: \x{0d}\x{0d}
-    \r\r\P\P
-Partial match: \x{0d}\x{0d}
-    \r\r\r\P
- 0: \x{0d}\x{0d}\x{0d}
- 1: \x{0d}\x{0d}
-    \r\r\r\P\P     
-Partial match: \x{0d}\x{0d}\x{0d}
-
-/[^\x{100}]/8
-    \x{100}\x{101}X
- 0: \x{101}
-
-/[^\x{100}]+/8
-    \x{100}\x{101}X
- 0: \x{101}X
-
-/-- End of testinput9 --/ 
diff --git a/dist/testdata/testoutputEBC b/dist/testdata/testoutputEBC
deleted file mode 100644
index 72b6fa3..0000000
--- a/dist/testdata/testoutputEBC
+++ /dev/null
@@ -1,188 +0,0 @@
-/-- This is a specialized test for checking, when PCRE is compiled with the
-EBCDIC option but in an ASCII environment, that newline and white space
-functionality is working. It catches cases where explicit values such as 0x0a
-have been used instead of names like CHAR_LF. Needless to say, it is not a
-genuine EBCDIC test! In patterns, alphabetic characters that follow a backslash
-must be in EBCDIC code. In data, newlines and other spacing characters must be
-in EBCDIC, but can be specified as escapes. --/
-
-/-- Test default newline and variations --/
-
-/^A/m
-    ABC
- 0: A
-    12\x15ABC
- 0: A
-
-/^A/m<any>
-    12\x15ABC
- 0: A
-    12\x0dABC
- 0: A
-    12\x0d\x15ABC
- 0: A
-    12\x25ABC
- 0: A
-
-/^A/m<anycrlf>
-    12\x15ABC
- 0: A
-    12\x0dABC
- 0: A
-    12\x0d\x15ABC
- 0: A
-    ** Fail
-No match
-    12\x25ABC
-No match
-
-/-- Test \h --/
-
-/^A\ˆ/
-    A B
- 0: A\x20
-    A\x41B
- 0: AA
-
-/-- Test \H --/
-
-/^A\È/
-    AB
- 0: AB
-    A\x42B
- 0: AB
-    ** Fail
-No match
-    A B
-No match
-    A\x41B
-No match
-
-/-- Test \R --/
-
-/^A\Ù/
-    A\x15B
- 0: A\x15
-    A\x0dB
- 0: A\x0d
-    A\x25B
- 0: A\x25
-    A\x0bB
- 0: A\x0b
-    A\x0cB
- 0: A\x0c
-    ** Fail
-No match
-    A B
-No match
-
-/-- Test \v --/
-
-/^A\¥/
-    A\x15B
- 0: A\x15
-    A\x0dB
- 0: A\x0d
-    A\x25B
- 0: A\x25
-    A\x0bB
- 0: A\x0b
-    A\x0cB
- 0: A\x0c
-    ** Fail
-No match
-    A B
-No match
-
-/-- Test \V --/
-
-/^A\å/
-    A B
- 0: A\x20
-    ** Fail
-No match
-    A\x15B
-No match
-    A\x0dB
-No match
-    A\x25B
-No match
-    A\x0bB
-No match
-    A\x0cB
-No match
-    
-/-- For repeated items, use an atomic group so that the output is the same
-for DFA matching (otherwise it may show multiple matches). --/ 
-
-/-- Test \h+ --/
-
-/^A(?>\ˆ+)/
-    A B
- 0: A\x20
-
-/-- Test \H+ --/
-
-/^A(?>\È+)/
-    AB
- 0: AB
-    ** Fail
-No match
-    A B
-No match
-
-/-- Test \R+ --/
-
-/^A(?>\Ù+)/
-    A\x15B
- 0: A\x15
-    A\x0dB
- 0: A\x0d
-    A\x25B
- 0: A\x25
-    A\x0bB
- 0: A\x0b
-    A\x0cB
- 0: A\x0c
-    ** Fail
-No match
-    A B
-No match
-
-/-- Test \v+ --/
-
-/^A(?>\¥+)/
-    A\x15B
- 0: A\x15
-    A\x0dB
- 0: A\x0d
-    A\x25B
- 0: A\x25
-    A\x0bB
- 0: A\x0b
-    A\x0cB
- 0: A\x0c
-    ** Fail
-No match
-    A B
-No match
-
-/-- Test \V+ --/
-
-/^A(?>\å+)/
-    A B
- 0: A\x20B
-    ** Fail
-No match
-    A\x15B
-No match
-    A\x0dB
-No match
-    A\x25B
-No match
-    A\x0bB
-No match
-    A\x0cB
-No match
-
-/-- End --/
diff --git a/dist/testdata/wintestinput3 b/dist/testdata/wintestinput3
deleted file mode 100644
index 04e76a6..0000000
--- a/dist/testdata/wintestinput3
+++ /dev/null
@@ -1,91 +0,0 @@
-/^[\w]+/
-    *** Failers
-    École
-
-/^[\w]+/Lfrench
-    École
-
-/^[\w]+/
-    *** Failers
-    École
-
-/^[\W]+/
-    École
-
-/^[\W]+/Lfrench
-    *** Failers
-    École
-
-/[\b]/
-    \b
-    *** Failers
-    a
-
-/[\b]/Lfrench
-    \b
-    *** Failers
-    a
-
-/^\w+/
-    *** Failers
-    École
-
-/^\w+/Lfrench
-    École
-
-/(.+)\b(.+)/
-    École
-
-/(.+)\b(.+)/Lfrench
-    *** Failers
-    École
-
-/École/i
-    École
-    *** Failers
-    école
-
-/École/iLfrench
-    École
-    école
-
-/\w/IS
-
-/\w/ISLfrench
-
-/^[\xc8-\xc9]/iLfrench
-    École
-    école
-
-/^[\xc8-\xc9]/Lfrench
-    École
-    *** Failers 
-    école
-
-/\W+/Lfrench
-    >>>\xaa<<<
-    >>>\xba<<< 
-
-/[\W]+/Lfrench
-    >>>\xaa<<<
-    >>>\xba<<< 
-
-/[^[:alpha:]]+/Lfrench
-    >>>\xaa<<<
-    >>>\xba<<< 
-
-/\w+/Lfrench
-    >>>\xaa<<<
-    >>>\xba<<< 
-
-/[\w]+/Lfrench
-    >>>\xaa<<<
-    >>>\xba<<< 
-
-/[[:alpha:]]+/Lfrench
-    >>>\xaa<<<
-    >>>\xba<<< 
-    
-/[[:alpha:]][[:lower:]][[:upper:]]/DZLfrench 
-
-/ End of testinput3 /
diff --git a/dist/testdata/wintestoutput3 b/dist/testdata/wintestoutput3
deleted file mode 100644
index 456ad19..0000000
--- a/dist/testdata/wintestoutput3
+++ /dev/null
@@ -1,166 +0,0 @@
-/^[\w]+/
-    *** Failers
-No match
-    École
-No match
-
-/^[\w]+/Lfrench
-    École
- 0: École
-
-/^[\w]+/
-    *** Failers
-No match
-    École
-No match
-
-/^[\W]+/
-    École
- 0: \xc9
-
-/^[\W]+/Lfrench
-    *** Failers
- 0: *** 
-    École
-No match
-
-/[\b]/
-    \b
- 0: \x08
-    *** Failers
-No match
-    a
-No match
-
-/[\b]/Lfrench
-    \b
- 0: \x08
-    *** Failers
-No match
-    a
-No match
-
-/^\w+/
-    *** Failers
-No match
-    École
-No match
-
-/^\w+/Lfrench
-    École
- 0: École
-
-/(.+)\b(.+)/
-    École
- 0: \xc9cole
- 1: \xc9
- 2: cole
-
-/(.+)\b(.+)/Lfrench
-    *** Failers
- 0: *** Failers
- 1: *** 
- 2: Failers
-    École
-No match
-
-/École/i
-    École
- 0: \xc9cole
-    *** Failers
-No match
-    école
-No match
-
-/École/iLfrench
-    École
- 0: École
-    école
- 0: école
-
-/\w/IS
-Capturing subpattern count = 0
-No options
-No first char
-No need char
-Subject length lower bound = 1
-Starting chars: 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/ISLfrench
-Capturing subpattern count = 0
-No options
-No first char
-No need char
-Subject length lower bound = 1
-Starting chars: 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]/iLfrench
-    École
- 0: É
-    école
- 0: é
-
-/^[\xc8-\xc9]/Lfrench
-    École
- 0: É
-    *** Failers 
-No match
-    école
-No match
-
-/\W+/Lfrench
-    >>>\xaa<<<
- 0: >>>
-    >>>\xba<<< 
- 0: >>>
-
-/[\W]+/Lfrench
-    >>>\xaa<<<
- 0: >>>
-    >>>\xba<<< 
- 0: >>>
-
-/[^[:alpha:]]+/Lfrench
-    >>>\xaa<<<
- 0: >>>
-    >>>\xba<<< 
- 0: >>>
-
-/\w+/Lfrench
-    >>>\xaa<<<
- 0: ª
-    >>>\xba<<< 
- 0: º
-
-/[\w]+/Lfrench
-    >>>\xaa<<<
- 0: ª
-    >>>\xba<<< 
- 0: º
-
-/[[:alpha:]]+/Lfrench
-    >>>\xaa<<<
- 0: ª
-    >>>\xba<<< 
- 0: º
-    
-/[[:alpha:]][[:lower:]][[:upper:]]/DZLfrench 
-------------------------------------------------------------------
-        Bra
-        [A-Za-z\x83\x8a\x8c\x8e\x9a\x9c\x9e\x9f\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\xff]
-        [a-z\x83\x9a\x9c\x9e\xaa\xb5\xba\xdf-\xf6\xf8-\xff]
-        [A-Z\x8a\x8c\x8e\x9f\xc0-\xd6\xd8-\xde]
-        Ket
-        End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-No options
-No first char
-No need char
-
-/ End of testinput3 /
diff --git a/dist/132html b/dist2/132html
similarity index 92%
rename from dist/132html
rename to dist2/132html
index e000249..3a16a59 100755
--- a/dist/132html
+++ b/dist2/132html
@@ -1,6 +1,6 @@
 #! /usr/bin/perl -w
 
-# Script to turn PCRE man pages into HTML
+# Script to turn PCRE2 man pages into HTML
 
 
 # Subroutine to handle font changes and other escapes
@@ -63,12 +63,12 @@
 <body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
 <h1>$ARGV[0] man page</h1>
 <p>
-Return to the <a href="index.html">PCRE index page</a>.
+Return to the <a href="index.html">PCRE2 index page</a>.
 </p>
 <p>
-This page is part of the PCRE HTML documentation. It was generated automatically
-from the original man page. If there is any nonsense in it, please consult the
-man page, in case the conversion went wrong.
+This page is part of the PCRE2 HTML documentation. It was generated
+automatically from the original man page. If there is any nonsense in it,
+please consult the man page, in case the conversion went wrong.
 <br>
 End
 
@@ -82,7 +82,7 @@
 
   if (/^\./)
     {
-    # Some of the PCRE man pages used to contain instances of .br. However,
+    # Some of the PCRE2 man pages used to contain instances of .br. However,
     # they should have all been removed because they cause trouble in some
     # (other) automated systems that translate man pages to HTML. Complain if
     # we find .br or .in (another macro that is deprecated).
@@ -232,7 +232,7 @@
       redo;            # Process the joined lines
       }
 
-    # .EX/.EE are used in the pcredemo page to bracket the entire program,
+    # .EX/.EE are used in the pcre2demo page to bracket the entire program,
     # which is unmodified except for turning backslash into "\e".
 
     elsif (/^\.EX\s*$/)
@@ -303,7 +303,7 @@
 
 print <<End ;
 <p>
-Return to the <a href="index.html">PCRE index page</a>.
+Return to the <a href="index.html">PCRE2 index page</a>.
 </p>
 End
 
diff --git a/dist2/AUTHORS b/dist2/AUTHORS
new file mode 100644
index 0000000..d9a0e15
--- /dev/null
+++ b/dist2/AUTHORS
@@ -0,0 +1,36 @@
+THE MAIN PCRE2 LIBRARY CODE
+---------------------------
+
+Written by:       Philip Hazel
+Email local part: ph10
+Email domain:     cam.ac.uk
+
+University of Cambridge Computing Service,
+Cambridge, England.
+
+Copyright (c) 1997-2016 University of Cambridge
+All rights reserved
+
+
+PCRE2 JUST-IN-TIME COMPILATION SUPPORT
+--------------------------------------
+
+Written by:       Zoltan Herczeg
+Email local part: hzmester
+Emain domain:     freemail.hu
+
+Copyright(c) 2010-2016 Zoltan Herczeg
+All rights reserved.
+
+
+STACK-LESS JUST-IN-TIME COMPILER
+--------------------------------
+
+Written by:       Zoltan Herczeg
+Email local part: hzmester
+Emain domain:     freemail.hu
+
+Copyright(c) 2009-2016 Zoltan Herczeg
+All rights reserved.
+
+####
diff --git a/dist2/CMakeLists.txt b/dist2/CMakeLists.txt
new file mode 100644
index 0000000..2c84b05
--- /dev/null
+++ b/dist2/CMakeLists.txt
@@ -0,0 +1,780 @@
+# CMakeLists.txt
+#
+#
+# This file enables PCRE2 to be built with the CMake configuration and build
+# tool. Download CMake in source or binary form from http://www.cmake.org/
+# Converted to support PCRE2 from the original PCRE file, August 2014.
+#
+# Original listfile by Christian Ehrlicher <Ch.Ehrlicher@gmx.de>
+# Refined and expanded by Daniel Richard G. <skunk@iSKUNK.ORG>
+# 2007-09-14 mod by Sheri so 7.4 supported configuration options can be entered
+# 2007-09-19 Adjusted by PH to retain previous default settings
+# 2007-12-26 (a) On UNIX, use names libpcre instead of just pcre
+#            (b) Ensure pcretest and pcregrep link with the local library,
+#                not a previously-installed one.
+#            (c) Add PCRE_SUPPORT_LIBREADLINE, PCRE_SUPPORT_LIBZ, and
+#                PCRE_SUPPORT_LIBBZ2.
+# 2008-01-20 Brought up to date to include several new features by Christian
+#            Ehrlicher.
+# 2008-01-22 Sheri added options for backward compatibility of library names
+#            when building with minGW:
+#            if "ON", NON_STANDARD_LIB_PREFIX causes shared libraries to
+#            be built without "lib" as prefix. (The libraries will be named
+#            pcre.dll, pcreposix.dll and pcrecpp.dll).
+#            if "ON", NON_STANDARD_LIB_SUFFIX causes shared libraries to
+#            be built with suffix of "-0.dll". (The libraries will be named
+#            libpcre-0.dll, libpcreposix-0.dll and libpcrecpp-0.dll - same names
+#            built by default with Configure and Make.
+# 2008-01-23 PH removed the automatic build of pcredemo.
+# 2008-04-22 PH modified READLINE support so it finds NCURSES when needed.
+# 2008-07-03 PH updated for revised UCP property support (change of files)
+# 2009-03-23 PH applied Steven Van Ingelgem's patch to change the name
+#            CMAKE_BINARY_DIR to PROJECT_BINARY_DIR so that it works when PCRE
+#            is included within another project.
+# 2009-03-23 PH applied a modified version of Steven Van Ingelgem's patches to
+#            add options to stop the building of pcregrep and the tests, and
+#            to disable the final configuration report.
+# 2009-04-11 PH applied Christian Ehrlicher's patch to show compiler flags that
+#            are set by specifying a release type.
+# 2010-01-02 PH added test for stdint.h
+# 2010-03-02 PH added test for inttypes.h
+# 2011-08-01 PH added PCREGREP_BUFSIZE
+# 2011-08-22 PH added PCRE_SUPPORT_JIT
+# 2011-09-06 PH modified WIN32 ADD_TEST line as suggested by Sergey Cherepanov
+# 2011-09-06 PH added PCRE_SUPPORT_PCREGREP_JIT
+# 2011-10-04 Sheri added support for including coff data in windows shared libraries
+#            compiled with MINGW if pcre.rc and/or pcreposix.rc are placed in
+#            the source dir by the user prior to building
+# 2011-10-04 Sheri changed various add_test's to use exes' location built instead
+#            of DEBUG location only (likely only matters in MSVC)
+# 2011-10-04 Sheri added scripts to provide needed variables to RunTest and
+#            RunGrepTest (used for UNIX and Msys)
+# 2011-10-04 Sheri added scripts to provide needed variables and to execute
+#            RunTest.bat in Win32 (for effortless testing with "make test")
+# 2011-10-04 Sheri Increased minimum required cmake version
+# 2012-01-06 PH removed pcre_info.c and added pcre_string_utils.c
+# 2012-01-10 Zoltan Herczeg added libpcre16 support
+# 2012-01-13 Stephen Kelly added out of source build support
+# 2012-01-17 PH applied Stephen Kelly's patch to parse the version data out
+#            of the configure.ac file
+# 2012-02-26 PH added support for libedit
+# 2012-09-06 PH added support for PCRE_EBCDIC_NL25
+# 2012-09-08 ChPe added PCRE32 support
+# 2012-10-23 PH added support for VALGRIND and GCOV
+# 2012-12-08 PH added patch from Daniel Richard G to quash some MSVC warnings
+# 2013-07-01 PH realized that the "support" for GCOV was a total nonsense and
+#            so it has been removed.
+# 2013-10-08 PH got rid of the "source" command, which is a bash-ism (use ".")
+# 2013-11-05 PH added support for PARENS_NEST_LIMIT
+# 2014-08-29 PH converted the file for PCRE2 (which has no C++).
+# 2015-04-24 PH added support for PCRE2_DEBUG
+# 2015-07-16 PH updated for new pcre2_find_bracket source module
+# 2015-08-24 PH correct C_FLAGS setting (patch from Roy Ivy III)
+# 2015-10=16 PH added support for never-backslash-C
+
+PROJECT(PCRE2 C)
+
+# Increased minimum to 2.8.0 to support newer add_test features. Set policy
+# CMP0026 to avoid warnings for the use of LOCATION in GET_TARGET_PROPERTY.
+
+CMAKE_MINIMUM_REQUIRED(VERSION 2.8.0)
+CMAKE_POLICY(SET CMP0026 OLD)
+
+SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake) # for FindReadline.cmake
+
+SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -I${PROJECT_SOURCE_DIR}/src")
+
+# external packages
+FIND_PACKAGE( BZip2 )
+FIND_PACKAGE( ZLIB )
+FIND_PACKAGE( Readline )
+FIND_PACKAGE( Editline )
+
+# Configuration checks
+
+INCLUDE(CheckIncludeFile)
+INCLUDE(CheckFunctionExists)
+INCLUDE(CheckTypeSize)
+
+CHECK_INCLUDE_FILE(dirent.h     HAVE_DIRENT_H)
+CHECK_INCLUDE_FILE(stdint.h     HAVE_STDINT_H)
+CHECK_INCLUDE_FILE(inttypes.h   HAVE_INTTYPES_H)
+CHECK_INCLUDE_FILE(sys/stat.h   HAVE_SYS_STAT_H)
+CHECK_INCLUDE_FILE(sys/types.h  HAVE_SYS_TYPES_H)
+CHECK_INCLUDE_FILE(unistd.h     HAVE_UNISTD_H)
+CHECK_INCLUDE_FILE(windows.h    HAVE_WINDOWS_H)
+
+CHECK_FUNCTION_EXISTS(bcopy     HAVE_BCOPY)
+CHECK_FUNCTION_EXISTS(memmove   HAVE_MEMMOVE)
+CHECK_FUNCTION_EXISTS(strerror  HAVE_STRERROR)
+
+# User-configurable options
+#
+# Note: CMakeSetup displays these in alphabetical order, regardless of
+# the order we use here.
+
+SET(BUILD_SHARED_LIBS OFF CACHE BOOL
+    "Build shared libraries instead of static ones.")
+
+OPTION(PCRE2_BUILD_PCRE2_8 "Build 8 bit PCRE2 library" ON)
+
+OPTION(PCRE2_BUILD_PCRE2_16 "Build 16 bit PCRE2 library" OFF)
+
+OPTION(PCRE2_BUILD_PCRE2_32 "Build 32 bit PCRE2 library" OFF)
+
+OPTION(PCRE2_DEBUG "Include debugging code" OFF)
+
+SET(PCRE2_EBCDIC OFF CACHE BOOL
+    "Use EBCDIC coding instead of ASCII. (This is rarely used outside of mainframe systems.)")
+
+SET(PCRE2_EBCDIC_NL25 OFF CACHE BOOL
+    "Use 0x25 as EBCDIC NL character instead of 0x15; implies EBCDIC.")
+
+SET(PCRE2_LINK_SIZE "2" CACHE STRING
+    "Internal link size (2, 3 or 4 allowed). See LINK_SIZE in config.h.in for details.")
+
+SET(PCRE2_PARENS_NEST_LIMIT "250" CACHE STRING
+    "Default nested parentheses limit. See PARENS_NEST_LIMIT in config.h.in for details.")
+
+SET(PCRE2_MATCH_LIMIT "10000000" CACHE STRING
+    "Default limit on internal looping. See MATCH_LIMIT in config.h.in for details.")
+
+SET(PCRE2_MATCH_LIMIT_RECURSION "MATCH_LIMIT" CACHE STRING
+    "Default limit on internal recursion. See MATCH_LIMIT_RECURSION in config.h.in for details.")
+
+SET(PCRE2GREP_BUFSIZE "20480" CACHE STRING
+    "Buffer size parameter for pcre2grep. See PCRE2GREP_BUFSIZE in config.h.in for details.")
+
+SET(PCRE2_NEWLINE "LF" CACHE STRING
+    "What to recognize as a newline (one of CR, LF, CRLF, ANY, ANYCRLF).")
+
+SET(PCRE2_HEAP_MATCH_RECURSE OFF CACHE BOOL
+    "If ON, then don't use stack recursion when matching. See HEAP_MATCH_RECURSE in config.h.in for details.")
+
+SET(PCRE2_SUPPORT_JIT OFF CACHE BOOL
+    "Enable support for Just-in-time compiling.")
+
+SET(PCRE2_SUPPORT_PCRE2GREP_JIT ON CACHE BOOL
+    "Enable use of Just-in-time compiling in pcre2grep.")
+
+SET(PCRE2_SUPPORT_UNICODE ON CACHE BOOL
+    "Enable support for Unicode and UTF-8/UTF-16/UTF-32 encoding.")
+
+SET(PCRE2_SUPPORT_BSR_ANYCRLF OFF CACHE BOOL
+    "ON=Backslash-R matches only LF CR and CRLF, OFF=Backslash-R matches all Unicode Linebreaks")
+
+SET(PCRE2_NEVER_BACKSLASH_C OFF CACHE BOOL
+    "If ON, backslash-C (upper case C) is locked out.")
+
+SET(PCRE2_SUPPORT_VALGRIND OFF CACHE BOOL
+    "Enable Valgrind support.")
+
+OPTION(PCRE2_SHOW_REPORT     "Show the final configuration report" ON)
+OPTION(PCRE2_BUILD_PCRE2GREP "Build pcre2grep" ON)
+OPTION(PCRE2_BUILD_TESTS     "Build the tests" ON)
+
+IF (MINGW)
+  OPTION(NON_STANDARD_LIB_PREFIX
+         "ON=Shared libraries built in mingw will be named pcre2.dll, etc., instead of libpcre2.dll, etc."
+         OFF)
+
+  OPTION(NON_STANDARD_LIB_SUFFIX
+         "ON=Shared libraries built in mingw will be named libpcre2-0.dll, etc., instead of libpcre2.dll, etc."
+         OFF)
+ENDIF(MINGW)
+
+IF(MSVC)
+  OPTION(INSTALL_MSVC_PDB
+         "ON=Install .pdb files built by MSVC, if generated"
+         OFF)
+ENDIF(MSVC)
+
+# bzip2 lib
+IF(BZIP2_FOUND)
+  OPTION (PCRE2_SUPPORT_LIBBZ2 "Enable support for linking pcre2grep with libbz2." ON)
+ENDIF(BZIP2_FOUND)
+IF(PCRE2_SUPPORT_LIBBZ2)
+  INCLUDE_DIRECTORIES(${BZIP2_INCLUDE_DIR})
+ENDIF(PCRE2_SUPPORT_LIBBZ2)
+
+# zlib
+IF(ZLIB_FOUND)
+  OPTION (PCRE2_SUPPORT_LIBZ "Enable support for linking pcre2grep with libz." ON)
+ENDIF(ZLIB_FOUND)
+IF(PCRE2_SUPPORT_LIBZ)
+  INCLUDE_DIRECTORIES(${ZLIB_INCLUDE_DIR})
+ENDIF(PCRE2_SUPPORT_LIBZ)
+
+# editline lib
+IF(EDITLINE_FOUND)
+  OPTION (PCRE2_SUPPORT_LIBEDIT  "Enable support for linking pcre2test with libedit." OFF)
+ENDIF(EDITLINE_FOUND)
+IF(PCRE2_SUPPORT_LIBEDIT)
+  INCLUDE_DIRECTORIES(${EDITLINE_INCLUDE_DIR})
+ENDIF(PCRE2_SUPPORT_LIBEDIT)
+
+# readline lib
+IF(READLINE_FOUND)
+  OPTION (PCRE2_SUPPORT_LIBREADLINE  "Enable support for linking pcre2test with libreadline." ON)
+ENDIF(READLINE_FOUND)
+IF(PCRE2_SUPPORT_LIBREADLINE)
+  INCLUDE_DIRECTORIES(${READLINE_INCLUDE_DIR})
+ENDIF(PCRE2_SUPPORT_LIBREADLINE)
+
+# Prepare build configuration
+
+IF(NOT BUILD_SHARED_LIBS)
+        SET(PCRE2_STATIC 1)
+ENDIF(NOT BUILD_SHARED_LIBS)
+
+IF(NOT PCRE2_BUILD_PCRE2_8 AND NOT PCRE2_BUILD_PCRE2_16 AND NOT PCRE2_BUILD_PCRE2_32)
+        MESSAGE(FATAL_ERROR "At least one of PCRE2_BUILD_PCRE2_8, PCRE2_BUILD_PCRE2_16 or PCRE2_BUILD_PCRE2_32 must be enabled")
+ENDIF(NOT PCRE2_BUILD_PCRE2_8 AND NOT PCRE2_BUILD_PCRE2_16 AND NOT PCRE2_BUILD_PCRE2_32)
+
+IF(PCRE2_BUILD_PCRE2_8)
+        SET(SUPPORT_PCRE2_8 1)
+ENDIF(PCRE2_BUILD_PCRE2_8)
+
+IF(PCRE2_BUILD_PCRE2_16)
+        SET(SUPPORT_PCRE2_16 1)
+ENDIF(PCRE2_BUILD_PCRE2_16)
+
+IF(PCRE2_BUILD_PCRE2_32)
+        SET(SUPPORT_PCRE2_32 1)
+ENDIF(PCRE2_BUILD_PCRE2_32)
+
+IF(PCRE2_BUILD_PCRE2GREP AND NOT PCRE2_BUILD_PCRE2_8)
+        MESSAGE(STATUS "** PCRE2_BUILD_PCRE2_8 must be enabled for the pcre2grep program")
+        SET(PCRE2_BUILD_PCRE2GREP OFF)
+ENDIF(PCRE2_BUILD_PCRE2GREP AND NOT PCRE2_BUILD_PCRE2_8)
+
+IF(PCRE2_SUPPORT_LIBREADLINE AND PCRE2_SUPPORT_LIBEDIT)
+        MESSAGE(FATAL_ERROR "Only one of libreadline or libeditline can be specified")
+ENDIF(PCRE2_SUPPORT_LIBREADLINE AND PCRE2_SUPPORT_LIBEDIT)
+
+IF(PCRE2_SUPPORT_BSR_ANYCRLF)
+        SET(BSR_ANYCRLF 1)
+ENDIF(PCRE2_SUPPORT_BSR_ANYCRLF)
+
+IF(PCRE2_NEVER_BACKSLASH_C)
+        SET(NEVER_BACKSLASH_C 1)
+ENDIF(PCRE2_NEVER_BACKSLASH_C)
+
+IF(PCRE2_SUPPORT_UNICODE)
+        SET(SUPPORT_UNICODE 1)
+ENDIF(PCRE2_SUPPORT_UNICODE)
+
+IF(PCRE2_SUPPORT_JIT)
+        SET(SUPPORT_JIT 1)
+ENDIF(PCRE2_SUPPORT_JIT)
+
+IF(PCRE2_SUPPORT_PCRE2GREP_JIT)
+        SET(SUPPORT_PCRE2GREP_JIT 1)
+ENDIF(PCRE2_SUPPORT_PCRE2GREP_JIT)
+
+IF(PCRE2_SUPPORT_VALGRIND)
+        SET(SUPPORT_VALGRIND 1)
+ENDIF(PCRE2_SUPPORT_VALGRIND)
+
+# This next one used to reference ${READLINE_LIBRARY})
+# but I was advised to add the NCURSES test as well, along with
+# some modifications to cmake/FindReadline.cmake which should
+# make it possible to override the default if necessary. PH
+
+IF(PCRE2_SUPPORT_LIBREADLINE)
+        SET(SUPPORT_LIBREADLINE 1)
+        SET(PCRE2TEST_LIBS ${READLINE_LIBRARY} ${NCURSES_LIBRARY})
+ENDIF(PCRE2_SUPPORT_LIBREADLINE)
+
+# libedit is a plug-compatible alternative to libreadline
+
+IF(PCRE2_SUPPORT_LIBEDIT)
+        SET(SUPPORT_LIBEDIT 1)
+        SET(PCRE2TEST_LIBS ${EDITLINE_LIBRARY} ${NCURSES_LIBRARY})
+ENDIF(PCRE2_SUPPORT_LIBEDIT)
+
+IF(PCRE2_SUPPORT_LIBZ)
+        SET(SUPPORT_LIBZ 1)
+        SET(PCRE2GREP_LIBS ${PCRE2GREP_LIBS} ${ZLIB_LIBRARIES})
+ENDIF(PCRE2_SUPPORT_LIBZ)
+
+IF(PCRE2_SUPPORT_LIBBZ2)
+        SET(SUPPORT_LIBBZ2 1)
+        SET(PCRE2GREP_LIBS ${PCRE2GREP_LIBS} ${BZIP2_LIBRARIES})
+ENDIF(PCRE2_SUPPORT_LIBBZ2)
+
+SET(NEWLINE_DEFAULT "")
+
+IF(PCRE2_NEWLINE STREQUAL "CR")
+        SET(NEWLINE_DEFAULT "1")
+ENDIF(PCRE2_NEWLINE STREQUAL "CR")
+IF(PCRE2_NEWLINE STREQUAL "LF")
+        SET(NEWLINE_DEFAULT "2")
+ENDIF(PCRE2_NEWLINE STREQUAL "LF")
+IF(PCRE2_NEWLINE STREQUAL "CRLF")
+        SET(NEWLINE_DEFAULT "3")
+ENDIF(PCRE2_NEWLINE STREQUAL "CRLF")
+IF(PCRE2_NEWLINE STREQUAL "ANY")
+        SET(NEWLINE_DEFAULT "4")
+ENDIF(PCRE2_NEWLINE STREQUAL "ANY")
+IF(PCRE2_NEWLINE STREQUAL "ANYCRLF")
+        SET(NEWLINE_DEFAULT "5")
+ENDIF(PCRE2_NEWLINE STREQUAL "ANYCRLF")
+
+IF(NEWLINE_DEFAULT STREQUAL "")
+        MESSAGE(FATAL_ERROR "The PCRE2_NEWLINE variable must be set to one of the following values: \"LF\", \"CR\", \"CRLF\", \"ANY\", \"ANYCRLF\".")
+ENDIF(NEWLINE_DEFAULT STREQUAL "")
+
+IF(PCRE2_EBCDIC)
+        SET(EBCDIC 1)
+ENDIF(PCRE2_EBCDIC)
+
+IF(PCRE2_EBCDIC_NL25)
+        SET(EBCDIC 1)
+        SET(EBCDIC_NL25 1)
+ENDIF(PCRE2_EBCDIC_NL25)
+
+IF(PCRE2_HEAP_MATCH_RECURSE)
+        SET(HEAP_MATCH_RECURSE 1)
+ENDIF(PCRE2_HEAP_MATCH_RECURSE)
+
+# Output files
+
+CONFIGURE_FILE(config-cmake.h.in
+               ${PROJECT_BINARY_DIR}/config.h
+               @ONLY)
+
+# Parse version numbers and date out of configure.ac
+
+file(STRINGS ${PROJECT_SOURCE_DIR}/configure.ac
+  configure_lines
+  LIMIT_COUNT 50 # Read only the first 50 lines of the file
+)
+
+set(SEARCHED_VARIABLES "pcre2_major" "pcre2_minor" "pcre2_prerelease" "pcre2_date")
+foreach(configure_line ${configure_lines})
+    foreach(_substitution_variable ${SEARCHED_VARIABLES})
+        string(TOUPPER ${_substitution_variable} _substitution_variable_upper)
+        if (NOT ${_substitution_variable_upper})
+            string(REGEX MATCH "m4_define\\(${_substitution_variable}, \\[(.*)\\]" MACTHED_STRING ${configure_line})
+            if (CMAKE_MATCH_1)
+                set(${_substitution_variable_upper} ${CMAKE_MATCH_1})
+            endif()
+        endif()
+    endforeach()
+endforeach()
+
+CONFIGURE_FILE(src/pcre2.h.in
+               ${PROJECT_BINARY_DIR}/pcre2.h
+               @ONLY)
+
+# What about pcre2-config and libpcre2.pc?
+
+# Character table generation
+
+OPTION(PCRE2_REBUILD_CHARTABLES "Rebuild char tables" OFF)
+IF(PCRE2_REBUILD_CHARTABLES)
+  ADD_EXECUTABLE(dftables src/dftables.c)
+  ADD_CUSTOM_COMMAND(
+    COMMENT "Generating character tables (pcre2_chartables.c) for current locale"
+    DEPENDS dftables
+    COMMAND dftables
+    ARGS        ${PROJECT_BINARY_DIR}/pcre2_chartables.c
+    OUTPUT      ${PROJECT_BINARY_DIR}/pcre2_chartables.c
+  )
+ELSE(PCRE2_REBUILD_CHARTABLES)
+  CONFIGURE_FILE(${PROJECT_SOURCE_DIR}/src/pcre2_chartables.c.dist
+                    ${PROJECT_BINARY_DIR}/pcre2_chartables.c
+                    COPYONLY)
+ENDIF(PCRE2_REBUILD_CHARTABLES)
+
+# Source code
+
+SET(PCRE2_HEADERS ${PROJECT_BINARY_DIR}/pcre2.h)
+
+SET(PCRE2_SOURCES
+  src/pcre2_auto_possess.c
+  ${PROJECT_BINARY_DIR}/pcre2_chartables.c
+  src/pcre2_compile.c
+  src/pcre2_config.c
+  src/pcre2_context.c
+  src/pcre2_dfa_match.c
+  src/pcre2_error.c
+  src/pcre2_find_bracket.c
+  src/pcre2_jit_compile.c
+  src/pcre2_maketables.c
+  src/pcre2_match.c
+  src/pcre2_match_data.c
+  src/pcre2_newline.c
+  src/pcre2_ord2utf.c
+  src/pcre2_pattern_info.c
+  src/pcre2_serialize.c
+  src/pcre2_string_utils.c
+  src/pcre2_study.c
+  src/pcre2_substitute.c
+  src/pcre2_substring.c
+  src/pcre2_tables.c
+  src/pcre2_ucd.c
+  src/pcre2_valid_utf.c
+  src/pcre2_xclass.c
+)
+
+SET(PCRE2POSIX_HEADERS src/pcre2posix.h)
+SET(PCRE2POSIX_SOURCES src/pcre2posix.c)
+
+IF(MINGW AND NOT PCRE2_STATIC)
+IF (EXISTS ${PROJECT_SOURCE_DIR}/pcre2.rc)
+ADD_CUSTOM_COMMAND(OUTPUT ${PROJECT_SOURCE_DIR}/pcre2.o
+PRE-LINK
+COMMAND windres ARGS pcre2.rc pcre2.o
+WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
+COMMENT Using pcre2 coff info in mingw build)
+SET(PCRE2_SOURCES
+  ${PCRE2_SOURCES} ${PROJECT_SOURCE_DIR}/pcre2.o
+)
+ENDIF(EXISTS ${PROJECT_SOURCE_DIR}/pcre2.rc)
+IF (EXISTS ${PROJECT_SOURCE_DIR}/pcre2posix.rc)
+ADD_CUSTOM_COMMAND(OUTPUT ${PROJECT_SOURCE_DIR}/pcre2posix.o
+PRE-LINK
+COMMAND windres ARGS pcre2posix.rc pcre2posix.o
+WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
+COMMENT Using pcre2posix coff info in mingw build)
+SET(PCRE2POSIX_SOURCES
+  ${PCRE2POSIX_SOURCES} ${PROJECT_SOURCE_DIR}/pcre2posix.o
+)
+ENDIF(EXISTS ${PROJECT_SOURCE_DIR}/pcre2posix.rc)
+ENDIF(MINGW AND NOT PCRE2_STATIC)
+
+IF(MSVC AND NOT PCRE2_STATIC)
+IF (EXISTS ${PROJECT_SOURCE_DIR}/pcre2.rc)
+SET(PCRE2_SOURCES
+  ${PCRE2_SOURCES} pcre2.rc)
+ENDIF(EXISTS ${PROJECT_SOURCE_DIR}/pcre2.rc)
+IF (EXISTS ${PROJECT_SOURCE_DIR}/pcre2posix.rc)
+SET(PCRE2POSIX_SOURCES
+  ${PCRE2POSIX_SOURCES} pcre2posix.rc)
+ENDIF (EXISTS ${PROJECT_SOURCE_DIR}/pcre2posix.rc)
+ENDIF(MSVC AND NOT PCRE2_STATIC)
+
+# Build setup
+
+ADD_DEFINITIONS(-DHAVE_CONFIG_H)
+
+IF(MSVC)
+  ADD_DEFINITIONS(-D_CRT_SECURE_NO_DEPRECATE -D_CRT_SECURE_NO_WARNINGS)
+ENDIF(MSVC)
+
+SET(CMAKE_INCLUDE_CURRENT_DIR 1)
+# needed to make sure to not link debug libs
+# against release libs and vice versa
+IF(WIN32)
+  SET(CMAKE_DEBUG_POSTFIX "d")
+ENDIF(WIN32)
+
+SET(targets)
+
+# 8-bit library
+
+IF(PCRE2_BUILD_PCRE2_8)
+ADD_LIBRARY(pcre2-8 ${PCRE2_HEADERS} ${PCRE2_SOURCES} ${PROJECT_BINARY_DIR}/config.h)
+SET_PROPERTY(TARGET pcre2-8
+  PROPERTY COMPILE_DEFINITIONS PCRE2_CODE_UNIT_WIDTH=8)
+SET(targets ${targets} pcre2-8)
+ADD_LIBRARY(pcre2posix ${PCRE2POSIX_HEADERS} ${PCRE2POSIX_SOURCES})
+SET_PROPERTY(TARGET pcre2posix
+  PROPERTY COMPILE_DEFINITIONS PCRE2_CODE_UNIT_WIDTH=8)
+SET(targets ${targets} pcre2posix)
+TARGET_LINK_LIBRARIES(pcre2posix pcre2-8)
+
+IF(MINGW AND NOT PCRE2_STATIC)
+  IF(NON_STANDARD_LIB_PREFIX)
+    SET_TARGET_PROPERTIES(pcre2-8 pcre2posix PROPERTIES PREFIX "")
+  ENDIF(NON_STANDARD_LIB_PREFIX)
+  IF(NON_STANDARD_LIB_SUFFIX)
+    SET_TARGET_PROPERTIES(pcre2-8 pcre2posix PROPERTIES SUFFIX "-0.dll")
+  ENDIF(NON_STANDARD_LIB_SUFFIX)
+ENDIF(MINGW AND NOT PCRE2_STATIC)
+ENDIF(PCRE2_BUILD_PCRE2_8)
+
+# 16-bit library
+
+IF(PCRE2_BUILD_PCRE2_16)
+ADD_LIBRARY(pcre2-16 ${PCRE2_HEADERS} ${PCRE2_SOURCES} ${PROJECT_BINARY_DIR}/config.h)
+SET_PROPERTY(TARGET pcre2-16
+  PROPERTY COMPILE_DEFINITIONS PCRE2_CODE_UNIT_WIDTH=16)
+SET(targets ${targets} pcre2-16)
+
+IF(MINGW AND NOT PCRE2_STATIC)
+  IF(NON_STANDARD_LIB_PREFIX)
+    SET_TARGET_PROPERTIES(pcre2-16 PROPERTIES PREFIX "")
+  ENDIF(NON_STANDARD_LIB_PREFIX)
+  IF(NON_STANDARD_LIB_SUFFIX)
+    SET_TARGET_PROPERTIES(pcre2-16 PROPERTIES SUFFIX "-0.dll")
+  ENDIF(NON_STANDARD_LIB_SUFFIX)
+ENDIF(MINGW AND NOT PCRE2_STATIC)
+ENDIF(PCRE2_BUILD_PCRE2_16)
+
+# 32-bit library
+
+IF(PCRE2_BUILD_PCRE2_32)
+ADD_LIBRARY(pcre2-32 ${PCRE2_HEADERS} ${PCRE2_SOURCES} ${PROJECT_BINARY_DIR}/config.h)
+SET_PROPERTY(TARGET pcre2-32
+  PROPERTY COMPILE_DEFINITIONS PCRE2_CODE_UNIT_WIDTH=32)
+SET(targets ${targets} pcre2-32)
+
+IF(MINGW AND NOT PCRE2_STATIC)
+  IF(NON_STANDARD_LIB_PREFIX)
+    SET_TARGET_PROPERTIES(pcre2-32 PROPERTIES PREFIX "")
+  ENDIF(NON_STANDARD_LIB_PREFIX)
+  IF(NON_STANDARD_LIB_SUFFIX)
+    SET_TARGET_PROPERTIES(pcre2-32 PROPERTIES SUFFIX "-0.dll")
+  ENDIF(NON_STANDARD_LIB_SUFFIX)
+ENDIF(MINGW AND NOT PCRE2_STATIC)
+ENDIF(PCRE2_BUILD_PCRE2_32)
+
+# Executables
+
+IF(PCRE2_BUILD_PCRE2GREP)
+  ADD_EXECUTABLE(pcre2grep src/pcre2grep.c)
+  SET_PROPERTY(TARGET pcre2grep
+    PROPERTY COMPILE_DEFINITIONS PCRE2_CODE_UNIT_WIDTH=8)
+  SET(targets ${targets} pcre2grep)
+  TARGET_LINK_LIBRARIES(pcre2grep pcre2posix ${PCRE2GREP_LIBS})
+ENDIF(PCRE2_BUILD_PCRE2GREP)
+
+# Testing
+
+IF(PCRE2_BUILD_TESTS)
+  ENABLE_TESTING()
+
+  SET(PCRE2TEST_SOURCES src/pcre2test.c)
+
+  ADD_EXECUTABLE(pcre2test ${PCRE2TEST_SOURCES})
+  SET(targets ${targets} pcre2test)
+  IF(PCRE2_BUILD_PCRE2_8)
+    LIST(APPEND PCRE2TEST_LIBS pcre2posix pcre2-8)
+  ENDIF(PCRE2_BUILD_PCRE2_8)
+  IF(PCRE2_BUILD_PCRE2_16)
+    LIST(APPEND PCRE2TEST_LIBS pcre2-16)
+  ENDIF(PCRE2_BUILD_PCRE2_16)
+  IF(PCRE2_BUILD_PCRE2_32)
+    LIST(APPEND PCRE2TEST_LIBS pcre2-32)
+  ENDIF(PCRE2_BUILD_PCRE2_32)
+  TARGET_LINK_LIBRARIES(pcre2test ${PCRE2TEST_LIBS})
+
+  IF(PCRE2_SUPPORT_JIT)
+    ADD_EXECUTABLE(pcre2_jit_test src/pcre2_jit_test.c)
+    SET(targets ${targets} pcre2_jit_test)
+    SET(PCRE2_JIT_TEST_LIBS )
+    IF(PCRE2_BUILD_PCRE2_8)
+      LIST(APPEND PCRE2_JIT_TEST_LIBS pcre2-8)
+    ENDIF(PCRE2_BUILD_PCRE2_8)
+    IF(PCRE2_BUILD_PCRE2_16)
+      LIST(APPEND PCRE2_JIT_TEST_LIBS pcre2-16)
+    ENDIF(PCRE2_BUILD_PCRE2_16)
+    IF(PCRE2_BUILD_PCRE2_32)
+      LIST(APPEND PCRE2_JIT_TEST_LIBS pcre2-32)
+    ENDIF(PCRE2_BUILD_PCRE2_32)
+    TARGET_LINK_LIBRARIES(pcre2_jit_test ${PCRE2_JIT_TEST_LIBS})
+  ENDIF(PCRE2_SUPPORT_JIT)
+
+  # exes in Debug location tested by the RunTest shell script
+  # via "make test"
+
+  IF(PCRE2_BUILD_PCRE2GREP)
+    GET_TARGET_PROPERTY(PCRE2GREP_EXE pcre2grep DEBUG_LOCATION)
+  ENDIF(PCRE2_BUILD_PCRE2GREP)
+
+  GET_TARGET_PROPERTY(PCRE2TEST_EXE pcre2test DEBUG_LOCATION)
+
+# =================================================
+  # Write out a CTest configuration file
+  #
+  FILE(WRITE ${PROJECT_BINARY_DIR}/CTestCustom.ctest
+  "# This is a generated file.
+MESSAGE(\"When testing is complete, review test output in the
+\\\"${PROJECT_BINARY_DIR}/Testing/Temporary\\\" folder.\")
+MESSAGE(\" \")
+")
+
+  FILE(WRITE ${PROJECT_BINARY_DIR}/pcre2_test.sh
+  "#! /bin/sh
+# This is a generated file.
+. ${PROJECT_SOURCE_DIR}/RunTest
+if test \"$?\" != \"0\"; then exit 1; fi
+# End
+")
+
+  IF(UNIX)
+    ADD_TEST(pcre2_test sh ${PROJECT_BINARY_DIR}/pcre2_test.sh)
+  ENDIF(UNIX)
+
+  IF(PCRE2_BUILD_PCRE2GREP)
+    FILE(WRITE ${PROJECT_BINARY_DIR}/pcre2_grep_test.sh
+    "#! /bin/sh
+# This is a generated file.
+. ${PROJECT_SOURCE_DIR}/RunGrepTest
+if test \"$?\" != \"0\"; then exit 1; fi
+# End
+")
+
+    IF(UNIX)
+      ADD_TEST(pcre2_grep_test sh ${PROJECT_BINARY_DIR}/pcre2_grep_test.sh)
+    ENDIF(UNIX)
+  ENDIF(PCRE2_BUILD_PCRE2GREP)
+
+  IF(WIN32)
+    # Provide environment for executing the bat file version of RunTest
+    FILE(TO_NATIVE_PATH ${PROJECT_SOURCE_DIR} winsrc)
+    FILE(TO_NATIVE_PATH ${PROJECT_BINARY_DIR} winbin)
+    FILE(TO_NATIVE_PATH ${PCRE2TEST_EXE} winexe)
+
+    FILE(WRITE ${PROJECT_BINARY_DIR}/pcre2_test.bat
+    "\@REM This is a generated file.
+\@echo off
+setlocal
+SET srcdir=\"${winsrc}\"
+SET pcre2test=\"${winexe}\"
+if not [%CMAKE_CONFIG_TYPE%]==[] SET pcre2test=\"${winbin}\\%CMAKE_CONFIG_TYPE%\\pcre2test.exe\"
+call %srcdir%\\RunTest.Bat
+if errorlevel 1 exit /b 1
+echo RunTest.bat tests successfully completed
+")
+
+  ADD_TEST(NAME pcre2_test_bat
+  COMMAND pcre2_test.bat)
+  SET_TESTS_PROPERTIES(pcre2_test_bat PROPERTIES
+  PASS_REGULAR_EXPRESSION "RunTest\\.bat tests successfully completed")
+
+    IF("$ENV{OSTYPE}" STREQUAL "msys")
+      # Both the sh and bat file versions of RunTest are run if make test is used
+      # in msys
+      ADD_TEST(pcre2_test_sh    sh.exe ${PROJECT_BINARY_DIR}/pcre2_test.sh)
+      IF(PCRE2_BUILD_PCRE2GREP)
+        ADD_TEST(pcre2_grep_test  sh.exe ${PROJECT_BINARY_DIR}/pcre2_grep_test.sh)
+      ENDIF(PCRE2_BUILD_PCRE2GREP)
+    ENDIF("$ENV{OSTYPE}" STREQUAL "msys")
+  ENDIF(WIN32)
+
+  # Changed to accommodate testing whichever location was just built
+
+  IF(PCRE2_SUPPORT_JIT)
+    ADD_TEST(pcre2_jit_test pcre2_jit_test)
+  ENDIF(PCRE2_SUPPORT_JIT)
+
+ENDIF(PCRE2_BUILD_TESTS)
+
+# Installation
+
+SET(CMAKE_INSTALL_ALWAYS 1)
+
+INSTALL(TARGETS ${targets}
+        RUNTIME DESTINATION bin
+        LIBRARY DESTINATION lib
+        ARCHIVE DESTINATION lib)
+
+INSTALL(FILES ${PCRE2_HEADERS} ${PCRE2POSIX_HEADERS} DESTINATION include)
+
+FILE(GLOB html ${PROJECT_SOURCE_DIR}/doc/html/*.html)
+FILE(GLOB man1 ${PROJECT_SOURCE_DIR}/doc/*.1)
+FILE(GLOB man3 ${PROJECT_SOURCE_DIR}/doc/*.3)
+
+FOREACH(man ${man3})
+        GET_FILENAME_COMPONENT(man_tmp ${man} NAME)
+        SET(man3_new ${man3} ${man})
+ENDFOREACH(man ${man3})
+SET(man3 ${man3_new})
+
+INSTALL(FILES ${man1} DESTINATION man/man1)
+INSTALL(FILES ${man3} DESTINATION man/man3)
+INSTALL(FILES ${html} DESTINATION share/doc/pcre2/html)
+
+IF(MSVC AND INSTALL_MSVC_PDB)
+    INSTALL(FILES ${PROJECT_BINARY_DIR}/pcre2.pdb
+                  ${PROJECT_BINARY_DIR}/pcre2posix.pdb
+            DESTINATION bin
+            CONFIGURATIONS RelWithDebInfo)
+    INSTALL(FILES ${PROJECT_BINARY_DIR}/pcre2d.pdb
+                  ${PROJECT_BINARY_DIR}/pcre2posixd.pdb
+            DESTINATION bin
+            CONFIGURATIONS Debug)
+ENDIF(MSVC AND INSTALL_MSVC_PDB)
+
+# Help, only for nice output
+IF(BUILD_SHARED_LIBS)
+  SET(BUILD_STATIC_LIBS OFF)
+ELSE(BUILD_SHARED_LIBS)
+  SET(BUILD_STATIC_LIBS ON)
+ENDIF(BUILD_SHARED_LIBS)
+
+IF(PCRE2_SHOW_REPORT)
+  STRING(TOUPPER "${CMAKE_BUILD_TYPE}" buildtype)
+  IF (CMAKE_C_FLAGS)
+    SET(cfsp " ")
+  ENDIF(CMAKE_C_FLAGS)
+  MESSAGE(STATUS "")
+  MESSAGE(STATUS "")
+  MESSAGE(STATUS "PCRE2 configuration summary:")
+  MESSAGE(STATUS "")
+  MESSAGE(STATUS "  Install prefix .................. : ${CMAKE_INSTALL_PREFIX}")
+  MESSAGE(STATUS "  C compiler ...................... : ${CMAKE_C_COMPILER}")
+  MESSAGE(STATUS "  C compiler flags ................ : ${CMAKE_C_FLAGS}${cfsp}${CMAKE_C_FLAGS_${buildtype}}")
+  MESSAGE(STATUS "")
+  MESSAGE(STATUS "  Build 8 bit PCRE2 library ....... : ${PCRE2_BUILD_PCRE2_8}")
+  MESSAGE(STATUS "  Build 16 bit PCRE2 library ...... : ${PCRE2_BUILD_PCRE2_16}")
+  MESSAGE(STATUS "  Build 32 bit PCRE2 library ...... : ${PCRE2_BUILD_PCRE2_32}")
+  MESSAGE(STATUS "  Enable JIT compiling support .... : ${PCRE2_SUPPORT_JIT}")
+  MESSAGE(STATUS "  Enable Unicode support .......... : ${PCRE2_SUPPORT_UNICODE}")
+  MESSAGE(STATUS "  Newline char/sequence ........... : ${PCRE2_NEWLINE}")
+  MESSAGE(STATUS "  \\R matches only ANYCRLF ......... : ${PCRE2_SUPPORT_BSR_ANYCRLF}")
+  MESSAGE(STATUS "  \\C is disabled .................. : ${PCRE2_NEVER_BACKSLASH_C}")
+  MESSAGE(STATUS "  EBCDIC coding ................... : ${PCRE2_EBCDIC}")
+  MESSAGE(STATUS "  EBCDIC coding with NL=0x25 ...... : ${PCRE2_EBCDIC_NL25}")
+  MESSAGE(STATUS "  Rebuild char tables ............. : ${PCRE2_REBUILD_CHARTABLES}")
+  MESSAGE(STATUS "  Use heap recursion .............. : ${PCRE2_HEAP_MATCH_RECURSE}")
+  MESSAGE(STATUS "  Internal link size .............. : ${PCRE2_LINK_SIZE}")
+  MESSAGE(STATUS "  Parentheses nest limit .......... : ${PCRE2_PARENS_NEST_LIMIT}")
+  MESSAGE(STATUS "  Match limit ..................... : ${PCRE2_MATCH_LIMIT}")
+  MESSAGE(STATUS "  Match limit recursion ........... : ${PCRE2_MATCH_LIMIT_RECURSION}")
+  MESSAGE(STATUS "  Build shared libs ............... : ${BUILD_SHARED_LIBS}")
+  MESSAGE(STATUS "  Build static libs ............... : ${BUILD_STATIC_LIBS}")
+  MESSAGE(STATUS "  Build pcre2grep ................. : ${PCRE2_BUILD_PCRE2GREP}")
+  MESSAGE(STATUS "  Enable JIT in pcre2grep ......... : ${PCRE2_SUPPORT_PCRE2GREP_JIT}")
+  MESSAGE(STATUS "  Buffer size for pcre2grep ....... : ${PCRE2GREP_BUFSIZE}")
+  MESSAGE(STATUS "  Build tests (implies pcre2test  . : ${PCRE2_BUILD_TESTS}")
+  MESSAGE(STATUS "               and pcre2grep)")
+  IF(ZLIB_FOUND)
+    MESSAGE(STATUS "  Link pcre2grep with libz ........ : ${PCRE2_SUPPORT_LIBZ}")
+  ELSE(ZLIB_FOUND)
+    MESSAGE(STATUS "  Link pcre2grep with libz ........ : Library not found" )
+  ENDIF(ZLIB_FOUND)
+  IF(BZIP2_FOUND)
+    MESSAGE(STATUS "  Link pcre2grep with libbz2 ...... : ${PCRE2_SUPPORT_LIBBZ2}")
+  ELSE(BZIP2_FOUND)
+    MESSAGE(STATUS "  Link pcre2grep with libbz2 ...... : Library not found" )
+  ENDIF(BZIP2_FOUND)
+  IF(EDITLINE_FOUND)
+    MESSAGE(STATUS "  Link pcre2test with libeditline . : ${PCRE2_SUPPORT_LIBEDIT}")
+  ELSE(EDITLINE_FOUND)
+    MESSAGE(STATUS "  Link pcre2test with libeditline . : Library not found" )
+  ENDIF(EDITLINE_FOUND)
+  IF(READLINE_FOUND)
+    MESSAGE(STATUS "  Link pcre2test with libreadline . : ${PCRE2_SUPPORT_LIBREADLINE}")
+  ELSE(READLINE_FOUND)
+    MESSAGE(STATUS "  Link pcre2test with libreadline . : Library not found" )
+  ENDIF(READLINE_FOUND)
+  MESSAGE(STATUS "  Support Valgrind .................: ${PCRE2_SUPPORT_VALGRIND}")
+
+  IF(MINGW AND NOT PCRE2_STATIC)
+    MESSAGE(STATUS "  Non-standard dll names (prefix) . : ${NON_STANDARD_LIB_PREFIX}")
+    MESSAGE(STATUS "  Non-standard dll names (suffix) . : ${NON_STANDARD_LIB_SUFFIX}")
+  ENDIF(MINGW AND NOT PCRE2_STATIC)
+
+  IF(MSVC)
+    MESSAGE(STATUS "  Install MSVC .pdb files ..........: ${INSTALL_MSVC_PDB}")
+  ENDIF(MSVC)
+
+  MESSAGE(STATUS "")
+ENDIF(PCRE2_SHOW_REPORT)
+
+# end CMakeLists.txt
diff --git a/dist2/COPYING b/dist2/COPYING
new file mode 100644
index 0000000..c233950
--- /dev/null
+++ b/dist2/COPYING
@@ -0,0 +1,5 @@
+PCRE2 LICENCE
+
+Please see the file LICENCE in the PCRE2 distribution for licensing details.
+
+End
diff --git a/dist2/ChangeLog b/dist2/ChangeLog
new file mode 100644
index 0000000..2035490
--- /dev/null
+++ b/dist2/ChangeLog
@@ -0,0 +1,758 @@
+Change Log for PCRE2
+--------------------
+
+Version 10.21 12-January-2016
+-----------------------------
+
+1. Improve matching speed of patterns starting with + or * in JIT.
+
+2. Use memchr() to find the first character in an unanchored match in 8-bit
+mode in the interpreter. This gives a significant speed improvement.
+
+3. Removed a redundant copy of the opcode_possessify table in the
+pcre2_auto_possessify.c source.
+
+4. Fix typos in dftables.c for z/OS.
+
+5. Change 36 for 10.20 broke the handling of [[:>:]] and [[:<:]] in that
+processing them could involve a buffer overflow if the following character was
+an opening parenthesis.
+
+6. Change 36 for 10.20 also introduced a bug in processing this pattern:
+/((?x)(*:0))#(?'/. Specifically: if a setting of (?x) was followed by a (*MARK)
+setting (which (*:0) is), then (?x) did not get unset at the end of its group
+during the scan for named groups, and hence the external # was incorrectly
+treated as a comment and the invalid (?' at the end of the pattern was not
+diagnosed. This caused a buffer overflow during the real compile. This bug was
+discovered by Karl Skomski with the LLVM fuzzer.
+
+7. Moved the pcre2_find_bracket() function from src/pcre2_compile.c into its
+own source module to avoid a circular dependency between src/pcre2_compile.c
+and src/pcre2_study.c
+
+8. A callout with a string argument containing an opening square bracket, for
+example /(?C$[$)(?<]/, was incorrectly processed and could provoke a buffer
+overflow. This bug was discovered by Karl Skomski with the LLVM fuzzer.
+
+9. The handling of callouts during the pre-pass for named group identification
+has been tightened up.
+
+10. The quantifier {1} can be ignored, whether greedy, non-greedy, or
+possessive. This is a very minor optimization.
+
+11. A possessively repeated conditional group that could match an empty string,
+for example, /(?(R))*+/, was incorrectly compiled.
+
+12. The Unicode tables have been updated to Unicode 8.0.0 (thanks to Christian
+Persch).
+
+13. An empty comment (?#) in a pattern was incorrectly processed and could
+provoke a buffer overflow. This bug was discovered by Karl Skomski with the
+LLVM fuzzer.
+
+14. Fix infinite recursion in the JIT compiler when certain patterns such as
+/(?:|a|){100}x/ are analysed.
+
+15. Some patterns with character classes involving [: and \\ were incorrectly
+compiled and could cause reading from uninitialized memory or an incorrect
+error diagnosis. Examples are: /[[:\\](?<[::]/ and /[[:\\](?'abc')[a:]. The
+first of these bugs was discovered by Karl Skomski with the LLVM fuzzer.
+
+16. Pathological patterns containing many nested occurrences of [: caused
+pcre2_compile() to run for a very long time. This bug was found by the LLVM
+fuzzer.
+
+17. A missing closing parenthesis for a callout with a string argument was not
+being diagnosed, possibly leading to a buffer overflow. This bug was found by
+the LLVM fuzzer.
+
+18. A conditional group with only one branch has an implicit empty alternative
+branch and must therefore be treated as potentially matching an empty string.
+
+19. If (?R was followed by - or + incorrect behaviour happened instead of a
+diagnostic. This bug was discovered by Karl Skomski with the LLVM fuzzer.
+
+20. Another bug that was introduced by change 36 for 10.20: conditional groups
+whose condition was an assertion preceded by an explicit callout with a string
+argument might be incorrectly processed, especially if the string contained \Q.
+This bug was discovered by Karl Skomski with the LLVM fuzzer.
+
+21. Compiling PCRE2 with the sanitize options of clang showed up a number of
+very pedantic coding infelicities and a buffer overflow while checking a UTF-8
+string if the final multi-byte UTF-8 character was truncated.
+
+22. For Perl compatibility in EBCDIC environments, ranges such as a-z in a
+class, where both values are literal letters in the same case, omit the
+non-letter EBCDIC code points within the range.
+
+23. Finding the minimum matching length of complex patterns with back
+references and/or recursions can take a long time. There is now a cut-off that
+gives up trying to find a minimum length when things get too complex.
+
+24. An optimization has been added that speeds up finding the minimum matching
+length for patterns containing repeated capturing groups or recursions.
+
+25. If a pattern contained a back reference to a group whose number was
+duplicated as a result of appearing in a (?|...) group, the computation of the
+minimum matching length gave a wrong result, which could cause incorrect "no
+match" errors. For such patterns, a minimum matching length cannot at present
+be computed.
+
+26. Added a check for integer overflow in conditions (?(<digits>) and
+(?(R<digits>). This omission was discovered by Karl Skomski with the LLVM
+fuzzer.
+
+27. Fixed an issue when \p{Any} inside an xclass did not read the current
+character.
+
+28. If pcre2grep was given the -q option with -c or -l, or when handling a
+binary file, it incorrectly wrote output to stdout.
+
+29. The JIT compiler did not restore the control verb head in case of *THEN
+control verbs. This issue was found by Karl Skomski with a custom LLVM fuzzer.
+
+30. The way recursive references such as (?3) are compiled has been re-written
+because the old way was the cause of many issues. Now, conversion of the group
+number into a pattern offset does not happen until the pattern has been
+completely compiled. This does mean that detection of all infinitely looping
+recursions is postponed till match time. In the past, some easy ones were
+detected at compile time. This re-writing was done in response to yet another
+bug found by the LLVM fuzzer.
+
+31. A test for a back reference to a non-existent group was missing for items
+such as \987. This caused incorrect code to be compiled. This issue was found
+by Karl Skomski with a custom LLVM fuzzer.
+
+32. Error messages for syntax errors following \g and \k were giving inaccurate
+offsets in the pattern.
+
+33. Improve the performance of starting single character repetitions in JIT.
+
+34. (*LIMIT_MATCH=) now gives an error instead of setting the value to 0.
+
+35. Error messages for syntax errors in *LIMIT_MATCH and *LIMIT_RECURSION now
+give the right offset instead of zero.
+
+36. The JIT compiler should not check repeats after a {0,1} repeat byte code.
+This issue was found by Karl Skomski with a custom LLVM fuzzer.
+
+37. The JIT compiler should restore the control chain for empty possessive
+repeats. This issue was found by Karl Skomski with a custom LLVM fuzzer.
+
+38. A bug which was introduced by the single character repetition optimization
+was fixed.
+
+39. Match limit check added to recursion. This issue was found by Karl Skomski
+with a custom LLVM fuzzer.
+
+40. Arrange for the UTF check in pcre2_match() and pcre2_dfa_match() to look
+only at the part of the subject that is relevant when the starting offset is
+non-zero.
+
+41. Improve first character match in JIT with SSE2 on x86.
+
+42. Fix two assertion fails in JIT. These issues were found by Karl Skomski
+with a custom LLVM fuzzer.
+
+43. Correct the setting of CMAKE_C_FLAGS in CMakeLists.txt (patch from Roy Ivy
+III).
+
+44. Fix bug in RunTest.bat for new test 14, and adjust the script for the added
+test (there are now 20 in total).
+
+45. Fixed a corner case of range optimization in JIT.
+
+46. Add the ${*MARK} facility to pcre2_substitute().
+
+47. Modifier lists in pcre2test were splitting at spaces without the required
+commas.
+
+48. Implemented PCRE2_ALT_VERBNAMES.
+
+49. Fixed two issues in JIT. These were found by Karl Skomski with a custom
+LLVM fuzzer.
+
+50. The pcre2test program has been extended by adding the #newline_default
+command. This has made it possible to run the standard tests when PCRE2 is
+compiled with either CR or CRLF as the default newline convention. As part of
+this work, the new command was added to several test files and the testing
+scripts were modified. The pcre2grep tests can now also be run when there is no
+LF in the default newline convention.
+
+51. The RunTest script has been modified so that, when JIT is used and valgrind
+is specified, a valgrind suppressions file is set up to ignore "Invalid read of
+size 16" errors because these are false positives when the hardware supports
+the SSE2 instruction set.
+
+52. It is now possible to have comment lines amid the subject strings in
+pcre2test (and perltest.sh) input.
+
+53. Implemented PCRE2_USE_OFFSET_LIMIT and pcre2_set_offset_limit().
+
+54. Add the null_context modifier to pcre2test so that calling pcre2_compile()
+and the matching functions with NULL contexts can be tested.
+
+55. Implemented PCRE2_SUBSTITUTE_EXTENDED.
+
+56. In a character class such as [\W\p{Any}] where both a negative-type escape
+("not a word character") and a property escape were present, the property
+escape was being ignored.
+
+57. Fixed integer overflow for patterns whose minimum matching length is very,
+very large.
+
+58. Implemented --never-backslash-C.
+
+59. Change 55 above introduced a bug by which certain patterns provoked the
+erroneous error "\ at end of pattern".
+
+60. The special sequences [[:<:]] and [[:>:]] gave rise to incorrect compiling
+errors or other strange effects if compiled in UCP mode. Found with libFuzzer
+and AddressSanitizer.
+
+61. Whitespace at the end of a pcre2test pattern line caused a spurious error
+message if there were only single-character modifiers. It should be ignored.
+
+62. The use of PCRE2_NO_AUTO_CAPTURE could cause incorrect compilation results
+or segmentation errors for some patterns. Found with libFuzzer and
+AddressSanitizer.
+
+63. Very long names in (*MARK) or (*THEN) etc. items could provoke a buffer
+overflow.
+
+64. Improve error message for overly-complicated patterns.
+
+65. Implemented an optional replication feature for patterns in pcre2test, to
+make it easier to test long repetitive patterns. The tests for 63 above are
+converted to use the new feature.
+
+66. In the POSIX wrapper, if regerror() was given too small a buffer, it could
+misbehave.
+
+67. In pcre2_substitute() in UTF mode, the UTF validity check on the
+replacement string was happening before the length setting when the replacement
+string was zero-terminated.
+
+68. In pcre2_substitute() in UTF mode, PCRE2_NO_UTF_CHECK can be set for the
+second and subsequent calls to pcre2_match().
+
+69. There was no check for integer overflow for a replacement group number in
+pcre2_substitute(). An added check for a number greater than the largest group
+number in the pattern means this is not now needed.
+
+70. The PCRE2-specific VERSION condition didn't work correctly if only one
+digit was given after the decimal point, or if more than two digits were given.
+It now works with one or two digits, and gives a compile time error if more are
+given.
+
+71. In pcre2_substitute() there was the possibility of reading one code unit
+beyond the end of the replacement string.
+
+72. The code for checking a subject's UTF-32 validity for a pattern with a
+lookbehind involved an out-of-bounds pointer, which could potentially cause
+trouble in some environments.
+
+73. The maximum lookbehind length was incorrectly calculated for patterns such
+as /(?<=(a)(?-1))x/ which have a recursion within a backreference.
+
+74. Give an error if a lookbehind assertion is longer than 65535 code units.
+
+75. Give an error in pcre2_substitute() if a match ends before it starts (as a
+result of the use of \K).
+
+76. Check the length of subpattern names and the names in (*MARK:xx) etc.
+dynamically to avoid the possibility of integer overflow.
+
+77. Implement pcre2_set_max_pattern_length() so that programs can restrict the
+size of patterns that they are prepared to handle.
+
+78. (*NO_AUTO_POSSESS) was not working.
+
+79. Adding group information caching improves the speed of compiling when
+checking whether a group has a fixed length and/or could match an empty string,
+especially when recursion or subroutine calls are involved. However, this
+cannot be used when (?| is present in the pattern because the same number may
+be used for groups of different sizes. To catch runaway patterns in this
+situation, counts have been introduced to the functions that scan for empty
+branches or compute fixed lengths.
+
+80. Allow for the possibility of the size of the nest_save structure not being
+a factor of the size of the compiling workspace (it currently is).
+
+81. Check for integer overflow in minimum length calculation and cap it at
+65535.
+
+82. Small optimizations in code for finding the minimum matching length.
+
+83. Lock out configuring for EBCDIC with non-8-bit libraries.
+
+84. Test for error code <= 0 in regerror().
+
+85. Check for too many replacements (more than INT_MAX) in pcre2_substitute().
+
+86. Avoid the possibility of computing with an out-of-bounds pointer (though
+not dereferencing it) while handling lookbehind assertions.
+
+87. Failure to get memory for the match data in regcomp() is now given as a
+regcomp() error instead of waiting for regexec() to pick it up.
+
+88. In pcre2_substitute(), ensure that CRLF is not split when it is a valid
+newline sequence.
+
+89. Paranoid check in regcomp() for bad error code from pcre2_compile().
+
+90. Run test 8 (internal offsets and code sizes) for link sizes 3 and 4 as well
+as for link size 2.
+
+91. Document that JIT has a limit on pattern size, and give more information
+about JIT compile failures in pcre2test.
+
+92. Implement PCRE2_INFO_HASBACKSLASHC.
+
+93. Re-arrange valgrind support code in pcre2test to avoid spurious reports
+with JIT (possibly caused by SSE2?).
+
+94. Support offset_limit in JIT.
+
+95. A sequence such as [[:punct:]b] that is, a POSIX character class followed
+by a single ASCII character in a class item, was incorrectly compiled in UCP
+mode. The POSIX class got lost, but only if the single character followed it.
+
+96. [:punct:] in UCP mode was matching some characters in the range 128-255
+that should not have been matched.
+
+97. If [:^ascii:] or [:^xdigit:] are present in a non-negated class, all
+characters with code points greater than 255 are in the class. When a Unicode
+property was also in the class (if PCRE2_UCP is set, escapes such as \w are
+turned into Unicode properties), wide characters were not correctly handled,
+and could fail to match.
+
+98. In pcre2test, make the "startoffset" modifier a synonym of "offset",
+because it sets the "startoffset" parameter for pcre2_match().
+
+99. If PCRE2_AUTO_CALLOUT was set on a pattern that had a (?# comment between
+an item and its qualifier (for example, A(?#comment)?B) pcre2_compile()
+misbehaved. This bug was found by the LLVM fuzzer.
+
+100. The error for an invalid UTF pattern string always gave the code unit
+offset as zero instead of where the invalidity was found.
+
+101. Further to 97 above, negated classes such as [^[:^ascii:]\d] were also not
+working correctly in UCP mode.
+
+102. Similar to 99 above, if an isolated \E was present between an item and its
+qualifier when PCRE2_AUTO_CALLOUT was set, pcre2_compile() misbehaved. This bug
+was found by the LLVM fuzzer.
+
+103. The POSIX wrapper function regexec() crashed if the option REG_STARTEND
+was set when the pmatch argument was NULL. It now returns REG_INVARG.
+
+104. Allow for up to 32-bit numbers in the ordin() function in pcre2grep.
+
+105. An empty \Q\E sequence between an item and its qualifier caused
+pcre2_compile() to misbehave when auto callouts were enabled. This bug
+was found by the LLVM fuzzer.
+
+106. If both PCRE2_ALT_VERBNAMES and PCRE2_EXTENDED were set, and a (*MARK) or
+other verb "name" ended with whitespace immediately before the closing
+parenthesis, pcre2_compile() misbehaved. Example: /(*:abc )/, but only when
+both those options were set.
+
+107. In a number of places pcre2_compile() was not handling NULL characters
+correctly, and pcre2test with the "bincode" modifier was not always correctly
+displaying fields containing NULLS:
+
+   (a) Within /x extended #-comments
+   (b) Within the "name" part of (*MARK) and other *verbs
+   (c) Within the text argument of a callout
+
+108. If a pattern that was compiled with PCRE2_EXTENDED started with white
+space or a #-type comment that was followed by (?-x), which turns off
+PCRE2_EXTENDED, and there was no subsequent (?x) to turn it on again,
+pcre2_compile() assumed that (?-x) applied to the whole pattern and
+consequently mis-compiled it. This bug was found by the LLVM fuzzer. The fix
+for this bug means that a setting of any of the (?imsxU) options at the start
+of a pattern is no longer transferred to the options that are returned by
+PCRE2_INFO_ALLOPTIONS. In fact, this was an anachronism that should have
+changed when the effects of those options were all moved to compile time.
+
+109. An escaped closing parenthesis in the "name" part of a (*verb) when
+PCRE2_ALT_VERBNAMES was set caused pcre2_compile() to malfunction. This bug
+was found by the LLVM fuzzer.
+
+110. Implemented PCRE2_SUBSTITUTE_UNSET_EMPTY, and updated pcre2test to make it
+possible to test it.
+
+111. "Harden" pcre2test against ridiculously large values in modifiers and
+command line arguments.
+
+112. Implemented PCRE2_SUBSTITUTE_UNKNOWN_UNSET and PCRE2_SUBSTITUTE_OVERFLOW_
+LENGTH.
+
+113. Fix printing of *MARK names that contain binary zeroes in pcre2test.
+
+
+Version 10.20 30-June-2015
+--------------------------
+
+1. Callouts with string arguments have been added.
+
+2. Assertion code generator in JIT has been optimized.
+
+3. The invalid pattern (?(?C) has a missing assertion condition at the end. The
+pcre2_compile() function read past the end of the input before diagnosing an
+error. This bug was discovered by the LLVM fuzzer.
+
+4. Implemented pcre2_callout_enumerate().
+
+5. Fix JIT compilation of conditional blocks whose assertion is converted to
+(*FAIL). E.g: /(?(?!))/.
+
+6. The pattern /(?(?!)^)/ caused references to random memory. This bug was
+discovered by the LLVM fuzzer.
+
+7. The assertion (?!) is optimized to (*FAIL). This was not handled correctly
+when this assertion was used as a condition, for example (?(?!)a|b). In
+pcre2_match() it worked by luck; in pcre2_dfa_match() it gave an incorrect
+error about an unsupported item.
+
+8. For some types of pattern, for example /Z*(|d*){216}/, the auto-
+possessification code could take exponential time to complete. A recursion
+depth limit of 1000 has been imposed to limit the resources used by this
+optimization. This infelicity was discovered by the LLVM fuzzer.
+
+9. A pattern such as /(*UTF)[\S\V\H]/, which contains a negated special class
+such as \S in non-UCP mode, explicit wide characters (> 255) can be ignored
+because \S ensures they are all in the class. The code for doing this was
+interacting badly with the code for computing the amount of space needed to
+compile the pattern, leading to a buffer overflow. This bug was discovered by
+the LLVM fuzzer.
+
+10. A pattern such as /((?2)+)((?1))/ which has mutual recursion nested inside
+other kinds of group caused stack overflow at compile time. This bug was
+discovered by the LLVM fuzzer.
+
+11. A pattern such as /(?1)(?#?'){8}(a)/ which had a parenthesized comment
+between a subroutine call and its quantifier was incorrectly compiled, leading
+to buffer overflow or other errors. This bug was discovered by the LLVM fuzzer.
+
+12. The illegal pattern /(?(?<E>.*!.*)?)/ was not being diagnosed as missing an
+assertion after (?(. The code was failing to check the character after (?(?<
+for the ! or = that would indicate a lookbehind assertion. This bug was
+discovered by the LLVM fuzzer.
+
+13. A pattern such as /X((?2)()*+){2}+/ which has a possessive quantifier with
+a fixed maximum following a group that contains a subroutine reference was
+incorrectly compiled and could trigger buffer overflow. This bug was discovered
+by the LLVM fuzzer.
+
+14. Negative relative recursive references such as (?-7) to non-existent
+subpatterns were not being diagnosed and could lead to unpredictable behaviour.
+This bug was discovered by the LLVM fuzzer.
+
+15. The bug fixed in 14 was due to an integer variable that was unsigned when
+it should have been signed. Some other "int" variables, having been checked,
+have either been changed to uint32_t or commented as "must be signed".
+
+16. A mutual recursion within a lookbehind assertion such as (?<=((?2))((?1)))
+caused a stack overflow instead of the diagnosis of a non-fixed length
+lookbehind assertion. This bug was discovered by the LLVM fuzzer.
+
+17. The use of \K in a positive lookbehind assertion in a non-anchored pattern
+(e.g. /(?<=\Ka)/) could make pcre2grep loop.
+
+18. There was a similar problem to 17 in pcre2test for global matches, though
+the code there did catch the loop.
+
+19. If a greedy quantified \X was preceded by \C in UTF mode (e.g. \C\X*),
+and a subsequent item in the pattern caused a non-match, backtracking over the
+repeated \X did not stop, but carried on past the start of the subject, causing
+reference to random memory and/or a segfault. There were also some other cases
+where backtracking after \C could crash. This set of bugs was discovered by the
+LLVM fuzzer.
+
+20. The function for finding the minimum length of a matching string could take
+a very long time if mutual recursion was present many times in a pattern, for
+example, /((?2){73}(?2))((?1))/. A better mutual recursion detection method has
+been implemented. This infelicity was discovered by the LLVM fuzzer.
+
+21. Implemented PCRE2_NEVER_BACKSLASH_C.
+
+22. The feature for string replication in pcre2test could read from freed
+memory if the replication required a buffer to be extended, and it was not
+working properly in 16-bit and 32-bit modes. This issue was discovered by a
+fuzzer: see http://lcamtuf.coredump.cx/afl/.
+
+23. Added the PCRE2_ALT_CIRCUMFLEX option.
+
+24. Adjust the treatment of \8 and \9 to be the same as the current Perl
+behaviour.
+
+25. Static linking against the PCRE2 library using the pkg-config module was
+failing on missing pthread symbols.
+
+26. If a group that contained a recursive back reference also contained a
+forward reference subroutine call followed by a non-forward-reference
+subroutine call, for example /.((?2)(?R)\1)()/, pcre2_compile() failed to
+compile correct code, leading to undefined behaviour or an internally detected
+error. This bug was discovered by the LLVM fuzzer.
+
+27. Quantification of certain items (e.g. atomic back references) could cause
+incorrect code to be compiled when recursive forward references were involved.
+For example, in this pattern: /(?1)()((((((\1++))\x85)+)|))/. This bug was
+discovered by the LLVM fuzzer.
+
+28. A repeated conditional group whose condition was a reference by name caused
+a buffer overflow if there was more than one group with the given name. This
+bug was discovered by the LLVM fuzzer.
+
+29. A recursive back reference by name within a group that had the same name as
+another group caused a buffer overflow. For example: /(?J)(?'d'(?'d'\g{d}))/.
+This bug was discovered by the LLVM fuzzer.
+
+30. A forward reference by name to a group whose number is the same as the
+current group, for example in this pattern: /(?|(\k'Pm')|(?'Pm'))/, caused a
+buffer overflow at compile time. This bug was discovered by the LLVM fuzzer.
+
+31. Fix -fsanitize=undefined warnings for left shifts of 1 by 31 (it treats 1
+as an int; fixed by writing it as 1u).
+
+32. Fix pcre2grep compile when -std=c99 is used with gcc, though it still gives
+a warning for "fileno" unless -std=gnu99 us used.
+
+33. A lookbehind assertion within a set of mutually recursive subpatterns could
+provoke a buffer overflow. This bug was discovered by the LLVM fuzzer.
+
+34. Give an error for an empty subpattern name such as (?'').
+
+35. Make pcre2test give an error if a pattern that follows #forbud_utf contains
+\P, \p, or \X.
+
+36. The way named subpatterns are handled has been refactored. There is now a
+pre-pass over the regex which does nothing other than identify named
+subpatterns and count the total captures. This means that information about
+named patterns is known before the rest of the compile. In particular, it means
+that forward references can be checked as they are encountered. Previously, the
+code for handling forward references was contorted and led to several errors in
+computing the memory requirements for some patterns, leading to buffer
+overflows.
+
+37. There was no check for integer overflow in subroutine calls such as (?123).
+
+38. The table entry for \l in EBCDIC environments was incorrect, leading to its
+being treated as a literal 'l' instead of causing an error.
+
+39. If a non-capturing group containing a conditional group that could match
+an empty string was repeated, it was not identified as matching an empty string
+itself. For example: /^(?:(?(1)x|)+)+$()/.
+
+40. In an EBCDIC environment, pcretest was mishandling the escape sequences
+\a and \e in test subject lines.
+
+41. In an EBCDIC environment, \a in a pattern was converted to the ASCII
+instead of the EBCDIC value.
+
+42. The handling of \c in an EBCDIC environment has been revised so that it is
+now compatible with the specification in Perl's perlebcdic page.
+
+43. Single character repetition in JIT has been improved. 20-30% speedup
+was achieved on certain patterns.
+
+44. The EBCDIC character 0x41 is a non-breaking space, equivalent to 0xa0 in
+ASCII/Unicode. This has now been added to the list of characters that are
+recognized as white space in EBCDIC.
+
+45. When PCRE2 was compiled without Unicode support, the use of \p and \P gave
+an error (correctly) when used outside a class, but did not give an error
+within a class.
+
+46. \h within a class was incorrectly compiled in EBCDIC environments.
+
+47. JIT should return with error when the compiled pattern requires
+more stack space than the maximum.
+
+48. Fixed a memory leak in pcre2grep when a locale is set.
+
+
+Version 10.10 06-March-2015
+---------------------------
+
+1. When a pattern is compiled, it remembers the highest back reference so that
+when matching, if the ovector is too small, extra memory can be obtained to
+use instead. A conditional subpattern whose condition is a check on a capture
+having happened, such as, for example in the pattern /^(?:(a)|b)(?(1)A|B)/, is
+another kind of back reference, but it was not setting the highest
+backreference number. This mattered only if pcre2_match() was called with an
+ovector that was too small to hold the capture, and there was no other kind of
+back reference (a situation which is probably quite rare). The effect of the
+bug was that the condition was always treated as FALSE when the capture could
+not be consulted, leading to a incorrect behaviour by pcre2_match(). This bug
+has been fixed.
+
+2. Functions for serialization and deserialization of sets of compiled patterns
+have been added.
+
+3. The value that is returned by PCRE2_INFO_SIZE has been corrected to remove
+excess code units at the end of the data block that may occasionally occur if
+the code for calculating the size over-estimates. This change stops the
+serialization code copying uninitialized data, to which valgrind objects. The
+documentation of PCRE2_INFO_SIZE was incorrect in stating that the size did not
+include the general overhead. This has been corrected.
+
+4. All code units in every slot in the table of group names are now set, again
+in order to avoid accessing uninitialized data when serializing.
+
+5. The (*NO_JIT) feature is implemented.
+
+6. If a bug that caused pcre2_compile() to use more memory than allocated was
+triggered when using valgrind, the code in (3) above passed a stupidly large
+value to valgrind. This caused a crash instead of an "internal error" return.
+
+7. A reference to a duplicated named group (either a back reference or a test
+for being set in a conditional) that occurred in a part of the pattern where
+PCRE2_DUPNAMES was not set caused the amount of memory needed for the pattern
+to be incorrectly calculated, leading to overwriting.
+
+8. A mutually recursive set of back references such as (\2)(\1) caused a
+segfault at compile time (while trying to find the minimum matching length).
+The infinite loop is now broken (with the minimum length unset, that is, zero).
+
+9. If an assertion that was used as a condition was quantified with a minimum
+of zero, matching went wrong. In particular, if the whole group had unlimited
+repetition and could match an empty string, a segfault was likely. The pattern
+(?(?=0)?)+ is an example that caused this. Perl allows assertions to be
+quantified, but not if they are being used as conditions, so the above pattern
+is faulted by Perl. PCRE2 has now been changed so that it also rejects such
+patterns.
+
+10. The error message for an invalid quantifier has been changed from "nothing
+to repeat" to "quantifier does not follow a repeatable item".
+
+11. If a bad UTF string is compiled with NO_UTF_CHECK, it may succeed, but
+scanning the compiled pattern in subsequent auto-possessification can get out
+of step and lead to an unknown opcode. Previously this could have caused an
+infinite loop. Now it generates an "internal error" error. This is a tidyup,
+not a bug fix; passing bad UTF with NO_UTF_CHECK is documented as having an
+undefined outcome.
+
+12. A UTF pattern containing a "not" match of a non-ASCII character and a
+subroutine reference could loop at compile time. Example: /[^\xff]((?1))/.
+
+13. The locale test (RunTest 3) has been upgraded. It now checks that a locale
+that is found in the output of "locale -a" can actually be set by pcre2test
+before it is accepted. Previously, in an environment where a locale was listed
+but would not set (an example does exist), the test would "pass" without
+actually doing anything. Also the fr_CA locale has been added to the list of
+locales that can be used.
+
+14. Fixed a bug in pcre2_substitute(). If a replacement string ended in a
+capturing group number without parentheses, the last character was incorrectly
+literally included at the end of the replacement string.
+
+15. A possessive capturing group such as (a)*+ with a minimum repeat of zero
+failed to allow the zero-repeat case if pcre2_match() was called with an
+ovector too small to capture the group.
+
+16. Improved error message in pcre2test when setting the stack size (-S) fails.
+
+17. Fixed two bugs in CMakeLists.txt: (1) Some lines had got lost in the
+transfer from PCRE1, meaning that CMake configuration failed if "build tests"
+was selected. (2) The file src/pcre2_serialize.c had not been added to the list
+of PCRE2 sources, which caused a failure to build pcre2test.
+
+18. Fixed typo in pcre2_serialize.c (DECL instead of DEFN) that causes problems
+only on Windows.
+
+19. Use binary input when reading back saved serialized patterns in pcre2test.
+
+20. Added RunTest.bat for running the tests under Windows.
+
+21. "make distclean" was not removing config.h, a file that may be created for
+use with CMake.
+
+22. A pattern such as "((?2){0,1999}())?", which has a group containing a
+forward reference repeated a large (but limited) number of times within a
+repeated outer group that has a zero minimum quantifier, caused incorrect code
+to be compiled, leading to the error "internal error: previously-checked
+referenced subpattern not found" when an incorrect memory address was read.
+This bug was reported as "heap overflow", discovered by Kai Lu of Fortinet's
+FortiGuard Labs. (Added 24-March-2015: CVE-2015-2325 was given to this.)
+
+23. A pattern such as "((?+1)(\1))/" containing a forward reference subroutine
+call within a group that also contained a recursive back reference caused
+incorrect code to be compiled. This bug was reported as "heap overflow",
+discovered by Kai Lu of Fortinet's FortiGuard Labs. (Added 24-March-2015:
+CVE-2015-2326 was given to this.)
+
+24. Computing the size of the JIT read-only data in advance has been a source
+of various issues, and new ones are still appear unfortunately. To fix
+existing and future issues, size computation is eliminated from the code,
+and replaced by on-demand memory allocation.
+
+25. A pattern such as /(?i)[A-`]/, where characters in the other case are
+adjacent to the end of the range, and the range contained characters with more
+than one other case, caused incorrect behaviour when compiled in UTF mode. In
+that example, the range a-j was left out of the class.
+
+
+Version 10.00 05-January-2015
+-----------------------------
+
+Version 10.00 is the first release of PCRE2, a revised API for the PCRE
+library. Changes prior to 10.00 are logged in the ChangeLog file for the old
+API, up to item 20 for release 8.36.
+
+The code of the library was heavily revised as part of the new API
+implementation. Details of each and every modification were not individually
+logged. In addition to the API changes, the following changes were made. They
+are either new functionality, or bug fixes and other noticeable changes of
+behaviour that were implemented after the code had been forked.
+
+1. Including Unicode support at build time is now enabled by default, but it
+can optionally be disabled. It is not enabled by default at run time (no
+change).
+
+2. The test program, now called pcre2test, was re-specified and almost
+completely re-written. Its input is not compatible with input for pcretest.
+
+3. Patterns may start with (*NOTEMPTY) or (*NOTEMPTY_ATSTART) to set the
+PCRE2_NOTEMPTY or PCRE2_NOTEMPTY_ATSTART options for every subject line that is
+matched by that pattern.
+
+4. For the benefit of those who use PCRE2 via some other application, that is,
+not writing the function calls themselves, it is possible to check the PCRE2
+version by matching a pattern such as /(?(VERSION>=10)yes|no)/ against a
+string such as "yesno".
+
+5. There are case-equivalent Unicode characters whose encodings use different
+numbers of code units in UTF-8. U+023A and U+2C65 are one example. (It is
+theoretically possible for this to happen in UTF-16 too.) If a backreference to
+a group containing one of these characters was greedily repeated, and during
+the match a backtrack occurred, the subject might be backtracked by the wrong
+number of code units. For example, if /^(\x{23a})\1*(.)/ is matched caselessly
+(and in UTF-8 mode) against "\x{23a}\x{2c65}\x{2c65}\x{2c65}", group 2 should
+capture the final character, which is the three bytes E2, B1, and A5 in UTF-8.
+Incorrect backtracking meant that group 2 captured only the last two bytes.
+This bug has been fixed; the new code is slower, but it is used only when the
+strings matched by the repetition are not all the same length.
+
+6. A pattern such as /()a/ was not setting the "first character must be 'a'"
+information. This applied to any pattern with a group that matched no
+characters, for example: /(?:(?=.)|(?<!x))a/.
+
+7. When an (*ACCEPT) is triggered inside capturing parentheses, it arranges for
+those parentheses to be closed with whatever has been captured so far. However,
+it was failing to mark any other groups between the highest capture so far and
+the currrent group as "unset". Thus, the ovector for those groups contained
+whatever was previously there. An example is the pattern /(x)|((*ACCEPT))/ when
+matched against "abcd".
+
+8. The pcre2_substitute() function has been implemented.
+
+9. If an assertion used as a condition was quantified with a minimum of zero
+(an odd thing to do, but it happened), SIGSEGV or other misbehaviour could
+occur.
+
+10. The PCRE2_NO_DOTSTAR_ANCHOR option has been implemented.
+
+****
diff --git a/dist/CheckMan b/dist2/CheckMan
similarity index 94%
rename from dist/CheckMan
rename to dist2/CheckMan
index 480d735..5686746 100755
--- a/dist/CheckMan
+++ b/dist2/CheckMan
@@ -1,6 +1,6 @@
 #! /usr/bin/perl
 
-# A script to scan PCRE's man pages to check for typos in the control
+# A script to scan PCRE2's man pages to check for typos in the control
 # sequences. I use only a small set of the available repertoire, so it is 
 # straightforward to check that nothing else has slipped in by mistake. This
 # script should be called in the doc directory.
diff --git a/dist/CleanTxt b/dist2/CleanTxt
similarity index 100%
rename from dist/CleanTxt
rename to dist2/CleanTxt
diff --git a/dist/Detrail b/dist2/Detrail
similarity index 100%
rename from dist/Detrail
rename to dist2/Detrail
diff --git a/dist2/HACKING b/dist2/HACKING
new file mode 100644
index 0000000..051520c
--- /dev/null
+++ b/dist2/HACKING
@@ -0,0 +1,604 @@
+Technical Notes about PCRE2
+---------------------------
+
+These are very rough technical notes that record potentially useful information
+about PCRE2 internals. PCRE2 is a library based on the original PCRE library,
+but with a revised (and incompatible) API. To avoid confusion, the original
+library is referred to as PCRE1 below. For information about testing PCRE2, see
+the pcre2test documentation and the comment at the head of the RunTest file.
+
+PCRE1 releases were up to 8.3x when PCRE2 was developed. The 8.xx series will
+continue for bugfixes if necessary. PCRE2 releases started at 10.00 to avoid
+confusion with PCRE1.
+
+
+Historical note 1
+-----------------
+
+Many years ago I implemented some regular expression functions to an algorithm
+suggested by Martin Richards. These were not Unix-like in form, and were quite
+restricted in what they could do by comparison with Perl. The interesting part
+about the algorithm was that the amount of space required to hold the compiled
+form of an expression was known in advance. The code to apply an expression did
+not operate by backtracking, as the original Henry Spencer code and current
+PCRE2 and Perl code does, but instead checked all possibilities simultaneously
+by keeping a list of current states and checking all of them as it advanced
+through the subject string. In the terminology of Jeffrey Friedl's book, it was
+a "DFA algorithm", though it was not a traditional Finite State Machine (FSM).
+When the pattern was all used up, all remaining states were possible matches,
+and the one matching the longest subset of the subject string was chosen. This
+did not necessarily maximize the individual wild portions of the pattern, as is
+expected in Unix and Perl-style regular expressions.
+
+
+Historical note 2
+-----------------
+
+By contrast, the code originally written by Henry Spencer (which was
+subsequently heavily modified for Perl) compiles the expression twice: once in
+a dummy mode in order to find out how much store will be needed, and then for
+real. (The Perl version probably doesn't do this any more; I'm talking about
+the original library.) The execution function operates by backtracking and
+maximizing (or, optionally, minimizing, in Perl) the amount of the subject that
+matches individual wild portions of the pattern. This is an "NFA algorithm" in
+Friedl's terminology.
+
+
+OK, here's the real stuff
+-------------------------
+
+For the set of functions that formed the original PCRE1 library (which are
+unrelated to those mentioned above), I tried at first to invent an algorithm
+that used an amount of store bounded by a multiple of the number of characters
+in the pattern, to save on compiling time. However, because of the greater
+complexity in Perl regular expressions, I couldn't do this. In any case, a
+first pass through the pattern is helpful for other reasons.
+
+
+Support for 16-bit and 32-bit data strings
+-------------------------------------------
+
+The library can be compiled in any combination of 8-bit, 16-bit or 32-bit
+modes, creating up to three different libraries. In the description that
+follows, the word "short" is used for a 16-bit data quantity, and the phrase
+"code unit" is used for a quantity that is a byte in 8-bit mode, a short in
+16-bit mode and a 32-bit word in 32-bit mode. The names of PCRE2 functions are
+given in generic form, without the _8, _16, or _32 suffix.
+
+
+Computing the memory requirement: how it was
+--------------------------------------------
+
+Up to and including release 6.7, PCRE1 worked by running a very degenerate
+first pass to calculate a maximum memory requirement, and then a second pass to
+do the real compile - which might use a bit less than the predicted amount of
+memory. The idea was that this would turn out faster than the Henry Spencer
+code because the first pass is degenerate and the second pass can just store
+stuff straight into memory, which it knows is big enough.
+
+
+Computing the memory requirement: how it is
+-------------------------------------------
+
+By the time I was working on a potential 6.8 release, the degenerate first pass
+had become very complicated and hard to maintain. Indeed one of the early
+things I did for 6.8 was to fix Yet Another Bug in the memory computation. Then
+I had a flash of inspiration as to how I could run the real compile function in
+a "fake" mode that enables it to compute how much memory it would need, while
+actually only ever using a few hundred bytes of working memory, and without too
+many tests of the mode that might slow it down. So I refactored the compiling
+functions to work this way. This got rid of about 600 lines of source. It
+should make future maintenance and development easier. As this was such a major
+change, I never released 6.8, instead upping the number to 7.0 (other quite
+major changes were also present in the 7.0 release).
+
+A side effect of this work was that the previous limit of 200 on the nesting
+depth of parentheses was removed. However, there was a downside: compiling ran
+more slowly than before (30% or more, depending on the pattern) because it now
+did a full analysis of the pattern. My hope was that this would not be a big
+issue, and in the event, nobody has commented on it.
+
+At release 8.34, a limit on the nesting depth of parentheses was re-introduced
+(default 250, settable at build time) so as to put a limit on the amount of
+system stack used by the compile function, which uses recursive function calls
+for nested parenthesized groups. This is a safety feature for environments with
+small stacks where the patterns are provided by users.
+
+History repeated itself for release 10.20. A number of bugs relating to named 
+subpatterns had been discovered by fuzzers. Most of these were related to the 
+handling of forward references when it was not known if the named pattern was
+unique. (References to non-unique names use a different opcode and more
+memory.) The use of duplicate group numbers (the (?| facility) also caused
+issues. 
+
+To get around these problems I adopted a new approach by adding a third pass,
+really a "pre-pass", over the pattern, which does nothing other than identify
+all the named subpatterns and their corresponding group numbers. This means 
+that the actual compile (both pre-pass and real compile) have full knowledge of 
+group names and numbers throughout. Several dozen lines of messy code were 
+eliminated, though the new pre-pass is not short (skipping over [] classes is 
+complicated).
+
+
+Traditional matching function
+-----------------------------
+
+The "traditional", and original, matching function is called pcre2_match(), and
+it implements an NFA algorithm, similar to the original Henry Spencer algorithm
+and the way that Perl works. This is not surprising, since it is intended to be
+as compatible with Perl as possible. This is the function most users of PCRE2
+will use most of the time. If PCRE2 is compiled with just-in-time (JIT)
+support, and studying a compiled pattern with JIT is successful, the JIT code
+is run instead of the normal pcre2_match() code, but the result is the same.
+
+
+Supplementary matching function
+-------------------------------
+
+There is also a supplementary matching function called pcre2_dfa_match(). This
+implements a DFA matching algorithm that searches simultaneously for all
+possible matches that start at one point in the subject string. (Going back to
+my roots: see Historical Note 1 above.) This function intreprets the same
+compiled pattern data as pcre2_match(); however, not all the facilities are
+available, and those that are do not always work in quite the same way. See the
+user documentation for details.
+
+The algorithm that is used for pcre2_dfa_match() is not a traditional FSM,
+because it may have a number of states active at one time. More work would be
+needed at compile time to produce a traditional FSM where only one state is
+ever active at once. I believe some other regex matchers work this way. JIT
+support is not available for this kind of matching.
+
+
+Changeable options
+------------------
+
+The /i, /m, or /s options (PCRE2_CASELESS, PCRE2_MULTILINE, PCRE2_DOTALL, and
+some others) may change in the middle of patterns. Their processing is handled
+entirely at compile time by generating different opcodes for the different
+settings. The runtime functions do not need to keep track of an options state.
+
+
+Format of compiled patterns
+---------------------------
+
+The compiled form of a pattern is a vector of unsigned code units (bytes in
+8-bit mode, shorts in 16-bit mode, 32-bit words in 32-bit mode), containing
+items of variable length. The first code unit in an item contains an opcode,
+and the length of the item is either implicit in the opcode or contained in the
+data that follows it.
+
+In many cases listed below, LINK_SIZE data values are specified for offsets
+within the compiled pattern. LINK_SIZE always specifies a number of bytes. The
+default value for LINK_SIZE is 2, except for the 32-bit library, where it can
+only be 4. The 8-bit library can be compiled to used 3-byte or 4-byte values,
+and the 16-bit library can be compiled to use 4-byte values, though this
+impairs performance. Specifing a LINK_SIZE larger than 2 for these libraries is
+necessary only when patterns whose compiled length is greater than 64K code
+units are going to be processed. When a LINK_SIZE value uses more than one code
+unit, the most significant unit is first.
+
+In this description, we assume the "normal" compilation options. Data values
+that are counts (e.g. quantifiers) are always two bytes long in 8-bit mode
+(most significant byte first), or one code unit in 16-bit and 32-bit modes.
+
+
+Opcodes with no following data
+------------------------------
+
+These items are all just one unit long
+
+  OP_END                 end of pattern
+  OP_ANY                 match any one character other than newline
+  OP_ALLANY              match any one character, including newline
+  OP_ANYBYTE             match any single code unit, even in UTF-8/16 mode
+  OP_SOD                 match start of data: \A
+  OP_SOM,                start of match (subject + offset): \G
+  OP_SET_SOM,            set start of match (\K)
+  OP_CIRC                ^ (start of data)
+  OP_CIRCM               ^ multiline mode (start of data or after newline)
+  OP_NOT_WORD_BOUNDARY   \W
+  OP_WORD_BOUNDARY       \w
+  OP_NOT_DIGIT           \D
+  OP_DIGIT               \d
+  OP_NOT_HSPACE          \H
+  OP_HSPACE              \h
+  OP_NOT_WHITESPACE      \S
+  OP_WHITESPACE          \s
+  OP_NOT_VSPACE          \V
+  OP_VSPACE              \v
+  OP_NOT_WORDCHAR        \W
+  OP_WORDCHAR            \w
+  OP_EODN                match end of data or newline at end: \Z
+  OP_EOD                 match end of data: \z
+  OP_DOLL                $ (end of data, or before final newline)
+  OP_DOLLM               $ multiline mode (end of data or before newline)
+  OP_EXTUNI              match an extended Unicode grapheme cluster
+  OP_ANYNL               match any Unicode newline sequence
+
+  OP_ASSERT_ACCEPT       )
+  OP_ACCEPT              ) These are Perl 5.10's "backtracking control
+  OP_COMMIT              ) verbs". If OP_ACCEPT is inside capturing
+  OP_FAIL                ) parentheses, it may be preceded by one or more
+  OP_PRUNE               ) OP_CLOSE, each followed by a count that
+  OP_SKIP                ) indicates which parentheses must be closed.
+  OP_THEN                )
+
+OP_ASSERT_ACCEPT is used when (*ACCEPT) is encountered within an assertion.
+This ends the assertion, not the entire pattern match. The assertion (?!) is 
+always optimized to OP_FAIL.
+
+
+Backtracking control verbs with optional data
+---------------------------------------------
+
+(*THEN) without an argument generates the opcode OP_THEN and no following data.
+OP_MARK is followed by the mark name, preceded by a length in one code unit,
+and followed by a binary zero. For (*PRUNE), (*SKIP), and (*THEN) with
+arguments, the opcodes OP_PRUNE_ARG, OP_SKIP_ARG, and OP_THEN_ARG are used,
+with the name following in the same format as OP_MARK.
+
+
+Matching literal characters
+---------------------------
+
+The OP_CHAR opcode is followed by a single character that is to be matched
+casefully. For caseless matching, OP_CHARI is used. In UTF-8 or UTF-16 modes,
+the character may be more than one code unit long. In UTF-32 mode, characters
+are always exactly one code unit long.
+
+If there is only one character in a character class, OP_CHAR or OP_CHARI is
+used for a positive class, and OP_NOT or OP_NOTI for a negative one (that is,
+for something like [^a]).
+
+
+Repeating single characters
+---------------------------
+
+The common repeats (*, +, ?), when applied to a single character, use the
+following opcodes, which come in caseful and caseless versions:
+
+  Caseful         Caseless
+  OP_STAR         OP_STARI
+  OP_MINSTAR      OP_MINSTARI
+  OP_POSSTAR      OP_POSSTARI
+  OP_PLUS         OP_PLUSI
+  OP_MINPLUS      OP_MINPLUSI
+  OP_POSPLUS      OP_POSPLUSI
+  OP_QUERY        OP_QUERYI
+  OP_MINQUERY     OP_MINQUERYI
+  OP_POSQUERY     OP_POSQUERYI
+
+Each opcode is followed by the character that is to be repeated. In ASCII or
+UTF-32 modes, these are two-code-unit items; in UTF-8 or UTF-16 modes, the
+length is variable. Those with "MIN" in their names are the minimizing
+versions. Those with "POS" in their names are possessive versions. Other kinds
+of repeat make use of these opcodes:
+
+  Caseful         Caseless
+  OP_UPTO         OP_UPTOI
+  OP_MINUPTO      OP_MINUPTOI
+  OP_POSUPTO      OP_POSUPTOI
+  OP_EXACT        OP_EXACTI
+
+Each of these is followed by a count and then the repeated character. The count
+is two bytes long in 8-bit mode (most significant byte first), or one code unit
+in 16-bit and 32-bit modes.
+
+OP_UPTO matches from 0 to the given number. A repeat with a non-zero minimum
+and a fixed maximum is coded as an OP_EXACT followed by an OP_UPTO (or
+OP_MINUPTO or OPT_POSUPTO).
+
+Another set of matching repeating opcodes (called OP_NOTSTAR, OP_NOTSTARI,
+etc.) are used for repeated, negated, single-character classes such as [^a]*.
+The normal single-character opcodes (OP_STAR, etc.) are used for repeated
+positive single-character classes.
+
+
+Repeating character types
+-------------------------
+
+Repeats of things like \d are done exactly as for single characters, except
+that instead of a character, the opcode for the type (e.g. OP_DIGIT) is stored
+in the next code unit. The opcodes are:
+
+  OP_TYPESTAR
+  OP_TYPEMINSTAR
+  OP_TYPEPOSSTAR
+  OP_TYPEPLUS
+  OP_TYPEMINPLUS
+  OP_TYPEPOSPLUS
+  OP_TYPEQUERY
+  OP_TYPEMINQUERY
+  OP_TYPEPOSQUERY
+  OP_TYPEUPTO
+  OP_TYPEMINUPTO
+  OP_TYPEPOSUPTO
+  OP_TYPEEXACT
+
+
+Match by Unicode property
+-------------------------
+
+OP_PROP and OP_NOTPROP are used for positive and negative matches of a
+character by testing its Unicode property (the \p and \P escape sequences).
+Each is followed by two code units that encode the desired property as a type
+and a value. The types are a set of #defines of the form PT_xxx, and the values
+are enumerations of the form ucp_xx, defined in the pcre2_ucp.h source file.
+The value is relevant only for PT_GC (General Category), PT_PC (Particular
+Category), and PT_SC (Script).
+
+Repeats of these items use the OP_TYPESTAR etc. set of opcodes, followed by
+three code units: OP_PROP or OP_NOTPROP, and then the desired property type and
+value.
+
+
+Character classes
+-----------------
+
+If there is only one character in a class, OP_CHAR or OP_CHARI is used for a
+positive class, and OP_NOT or OP_NOTI for a negative one (that is, for
+something like [^a]).
+
+A set of repeating opcodes (called OP_NOTSTAR etc.) are used for repeated,
+negated, single-character classes. The normal single-character opcodes
+(OP_STAR, etc.) are used for repeated positive single-character classes.
+
+When there is more than one character in a class, and all the code points are
+less than 256, OP_CLASS is used for a positive class, and OP_NCLASS for a
+negative one. In either case, the opcode is followed by a 32-byte (16-short,
+8-word) bit map containing a 1 bit for every character that is acceptable. The
+bits are counted from the least significant end of each unit. In caseless mode,
+bits for both cases are set.
+
+The reason for having both OP_CLASS and OP_NCLASS is so that, in UTF-8 and
+16-bit and 32-bit modes, subject characters with values greater than 255 can be
+handled correctly. For OP_CLASS they do not match, whereas for OP_NCLASS they
+do.
+
+For classes containing characters with values greater than 255 or that contain
+\p or \P, OP_XCLASS is used. It optionally uses a bit map if any acceptable
+code points are less than 256, followed by a list of pairs (for a range) and/or
+single characters and/or properties. In caseless mode, both cases are
+explicitly listed.
+
+OP_XCLASS is followed by a LINK_SIZE value containing the total length of the
+opcode and its data. This is followed by a code unit containing flag bits:
+XCL_NOT indicates that this is a negative class, and XCL_MAP indicates that a
+bit map is present. There follows the bit map, if XCL_MAP is set, and then a
+sequence of items coded as follows:
+
+  XCL_END      marks the end of the list
+  XCL_SINGLE   one character follows
+  XCL_RANGE    two characters follow
+  XCL_PROP     a Unicode property (type, value) follows
+  XCL_NOTPROP  a Unicode property (type, value) follows
+
+If a range starts with a code point less than 256 and ends with one greater
+than 255, it is split into two ranges, with characters less than 256 being
+indicated in the bit map, and the rest with XCL_RANGE.
+
+When XCL_NOT is set, the bit map, if present, contains bits for characters that
+are allowed (exactly as for OP_NCLASS), but the list of items that follow it
+specifies characters and properties that are not allowed.
+
+
+Back references
+---------------
+
+OP_REF (caseful) or OP_REFI (caseless) is followed by a count containing the
+reference number when the reference is to a unique capturing group (either by
+number or by name). When named groups are used, there may be more than one
+group with the same name. In this case, a reference to such a group by name
+generates OP_DNREF or OP_DNREFI. These are followed by two counts: the index
+(not the byte offset) in the group name table of the first entry for the
+required name, followed by the number of groups with the same name. The
+matching code can then search for the first one that is set.
+
+
+Repeating character classes and back references
+-----------------------------------------------
+
+Single-character classes are handled specially (see above). This section
+applies to other classes and also to back references. In both cases, the repeat
+information follows the base item. The matching code looks at the following
+opcode to see if it is one of these:
+
+  OP_CRSTAR
+  OP_CRMINSTAR
+  OP_CRPOSSTAR
+  OP_CRPLUS
+  OP_CRMINPLUS
+  OP_CRPOSPLUS
+  OP_CRQUERY
+  OP_CRMINQUERY
+  OP_CRPOSQUERY
+  OP_CRRANGE
+  OP_CRMINRANGE
+  OP_CRPOSRANGE
+
+All but the last three are single-code-unit items, with no data. The others are
+followed by the minimum and maximum repeat counts.
+
+
+Brackets and alternation
+------------------------
+
+A pair of non-capturing round brackets is wrapped round each expression at
+compile time, so alternation always happens in the context of brackets.
+
+[Note for North Americans: "bracket" to some English speakers, including
+myself, can be round, square, curly, or pointy. Hence this usage rather than
+"parentheses".]
+
+Non-capturing brackets use the opcode OP_BRA, capturing brackets use OP_CBRA. A
+bracket opcode is followed by a LINK_SIZE value which gives the offset to the
+next alternative OP_ALT or, if there aren't any branches, to the matching
+OP_KET opcode. Each OP_ALT is followed by a LINK_SIZE value giving the offset
+to the next one, or to the OP_KET opcode. For capturing brackets, the bracket
+number is a count that immediately follows the offset.
+
+OP_KET is used for subpatterns that do not repeat indefinitely, and OP_KETRMIN
+and OP_KETRMAX are used for indefinite repetitions, minimally or maximally
+respectively (see below for possessive repetitions). All three are followed by
+a LINK_SIZE value giving (as a positive number) the offset back to the matching
+bracket opcode.
+
+If a subpattern is quantified such that it is permitted to match zero times, it
+is preceded by one of OP_BRAZERO, OP_BRAMINZERO, or OP_SKIPZERO. These are
+single-unit opcodes that tell the matcher that skipping the following
+subpattern entirely is a valid match. In the case of the first two, not
+skipping the pattern is also valid (greedy and non-greedy). The third is used
+when a pattern has the quantifier {0,0}. It cannot be entirely discarded,
+because it may be called as a subroutine from elsewhere in the pattern.
+
+A subpattern with an indefinite maximum repetition is replicated in the
+compiled data its minimum number of times (or once with OP_BRAZERO if the
+minimum is zero), with the final copy terminating with OP_KETRMIN or OP_KETRMAX
+as appropriate.
+
+A subpattern with a bounded maximum repetition is replicated in a nested
+fashion up to the maximum number of times, with OP_BRAZERO or OP_BRAMINZERO
+before each replication after the minimum, so that, for example, (abc){2,5} is
+compiled as (abc)(abc)((abc)((abc)(abc)?)?)?, except that each bracketed group
+has the same number.
+
+When a repeated subpattern has an unbounded upper limit, it is checked to see
+whether it could match an empty string. If this is the case, the opcode in the
+final replication is changed to OP_SBRA or OP_SCBRA. This tells the matcher
+that it needs to check for matching an empty string when it hits OP_KETRMIN or
+OP_KETRMAX, and if so, to break the loop.
+
+
+Possessive brackets
+-------------------
+
+When a repeated group (capturing or non-capturing) is marked as possessive by
+the "+" notation, e.g. (abc)++, different opcodes are used. Their names all
+have POS on the end, e.g. OP_BRAPOS instead of OP_BRA and OP_SCBRAPOS instead
+of OP_SCBRA. The end of such a group is marked by OP_KETRPOS. If the minimum
+repetition is zero, the group is preceded by OP_BRAPOSZERO.
+
+
+Once-only (atomic) groups
+-------------------------
+
+These are just like other subpatterns, but they start with the opcode
+OP_ONCE or OP_ONCE_NC. The former is used when there are no capturing brackets
+within the atomic group; the latter when there are. The distinction is needed
+for when there is a backtrack to before the group - any captures within the
+group must be reset, so it is necessary to retain backtracking points inside
+the group, even after it is complete, in order to do this. When there are no
+captures in an atomic group, all the backtracking can be discarded when it is
+complete. This is more efficient, and also uses less stack.
+
+The check for matching an empty string in an unbounded repeat is handled
+entirely at runtime, so there are just these two opcodes for atomic groups.
+
+
+Assertions
+----------
+
+Forward assertions are also just like other subpatterns, but starting with one
+of the opcodes OP_ASSERT or OP_ASSERT_NOT. Backward assertions use the opcodes
+OP_ASSERTBACK and OP_ASSERTBACK_NOT, and the first opcode inside the assertion
+is OP_REVERSE, followed by a count of the number of characters to move back the
+pointer in the subject string. In ASCII or UTF-32 mode, the count is also the
+number of code units, but in UTF-8/16 mode each character may occupy more than
+one code unit. A separate count is present in each alternative of a lookbehind
+assertion, allowing them to have different (but fixed) lengths.
+
+
+Conditional subpatterns
+-----------------------
+
+These are like other subpatterns, but they start with the opcode OP_COND, or
+OP_SCOND for one that might match an empty string in an unbounded repeat.
+
+If the condition is a back reference, this is stored at the start of the
+subpattern using the opcode OP_CREF followed by a count containing the
+reference number, provided that the reference is to a unique capturing group.
+If the reference was by name and there is more than one group with that name,
+OP_DNCREF is used instead. It is followed by two counts: the index in the group
+names table, and the number of groups with the same name. The allows the
+matcher to check if any group with the given name is set.
+
+If the condition is "in recursion" (coded as "(?(R)"), or "in recursion of
+group x" (coded as "(?(Rx)"), the group number is stored at the start of the
+subpattern using the opcode OP_RREF (with a value of RREF_ANY (0xffff) for "the
+whole pattern") or OP_DNRREF (with data as for OP_DNCREF).
+
+For a DEFINE condition, OP_FALSE is used (with no associated data). During
+compilation, however, a DEFINE condition is coded as OP_DEFINE so that, when
+the conditional group is complete, there can be a check to ensure that it
+contains only one top-level branch. Once this has happened, the opcode is
+changed to OP_FALSE, so the matcher never sees OP_DEFINE.
+
+There is a special PCRE2-specific condition of the form (VERSION[>]=x.y), which
+tests the PCRE2 version number. This compiles into one of the opcodes OP_TRUE
+or OP_FALSE.
+
+If a condition is not a back reference, recursion test, DEFINE, or VERSION, it
+must start with an assertion, whose opcode normally immediately follows OP_COND
+or OP_SCOND. However, if automatic callouts are enabled, a callout is inserted
+immediately before the assertion. It is also possible to insert a manual
+callout at this point. Only assertion conditions may have callouts preceding
+the condition.
+
+A condition that is the negative assertion (?!) is optimized to OP_FAIL in all 
+parts of the pattern, so this is another opcode that may appear as a condition. 
+It is treated the same as OP_FALSE.
+
+
+Recursion
+---------
+
+Recursion either matches the current pattern, or some subexpression. The opcode
+OP_RECURSE is followed by a LINK_SIZE value that is the offset to the starting
+bracket from the start of the whole pattern. OP_RECURSE is also used for
+"subroutine" calls, even though they are not strictly a recursion. Repeated
+recursions are automatically wrapped inside OP_ONCE brackets, because otherwise
+some patterns broke them. A non-repeated recursion is not wrapped in OP_ONCE
+brackets, but it is nevertheless still treated as an atomic group.
+
+
+Callout
+-------
+
+A callout can nowadays have either a numerical argument or a string argument.
+These use OP_CALLOUT or OP_CALLOUT_STR, respectively. In each case these are
+followed by two LINK_SIZE values giving the offset in the pattern string to the
+start of the following item, and another count giving the length of this item.
+These values make it possible for pcre2test to output useful tracing
+information using callouts.
+
+In the case of a numeric callout, after these two values there is a single code
+unit containing the callout number, in the range 0-255, with 255 being used for
+callouts that are automatically inserted as a result of the PCRE2_AUTO_CALLOUT
+option. Thus, this opcode item is of fixed length:
+
+  [OP_CALLOUT] [PATTERN_OFFSET] [PATTERN_LENGTH] [NUMBER]
+
+For callouts with string arguments, OP_CALLOUT_STR has three more data items:
+a LINK_SIZE value giving the complete length of the entire opcode item, a
+LINK_SIZE item containing the offset within the pattern string to the start of
+the string argument, and the string itself, preceded by its starting delimiter
+and followed by a binary zero. When a callout function is called, a pointer to
+the actual string is passed, but the delimiter can be accessed as string[-1] if
+the application needs it. In the 8-bit library, the callout in /X(?C'abc')Y/ is
+compiled as the following bytes (decimal numbers represent binary values):
+
+  [OP_CALLOUT]  [0] [10]  [0] [1]  [0] [14]  [0] [5] ['] [a] [b] [c] [0]
+                --------  -------  --------  -------
+                   |         |        |         |
+                   ------- LINK_SIZE items ------
+
+Opcode table checking
+---------------------
+
+The last opcode that is defined in pcre2_internal.h is OP_TABLE_LENGTH. This is
+not a real opcode, but is used to check that tables indexed by opcode are the
+correct length, in order to catch updating errors.
+
+Philip Hazel
+June 2015
diff --git a/dist/INSTALL b/dist2/INSTALL
similarity index 100%
rename from dist/INSTALL
rename to dist2/INSTALL
diff --git a/dist/LICENCE b/dist2/LICENCE
similarity index 68%
rename from dist/LICENCE
rename to dist2/LICENCE
index 9f6f98e..6600a65 100644
--- a/dist/LICENCE
+++ b/dist2/LICENCE
@@ -1,18 +1,18 @@
-PCRE LICENCE
-------------
+PCRE2 LICENCE
+-------------
 
-PCRE is a library of functions to support regular expressions whose syntax
+PCRE2 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.
 
-Release 8 of PCRE is distributed under the terms of the "BSD" licence, as
-specified below. The documentation for PCRE, supplied in the "doc"
+Release 10 of PCRE2 is distributed under the terms of the "BSD" licence, as
+specified below. The documentation for PCRE2, supplied in the "doc"
 directory, is distributed under the same terms as the software itself. The data
 in the testdata directory is not copyrighted and is in the public domain.
 
 The basic library functions are written in C and are freestanding. Also
-included in the distribution is a set of C++ wrapper functions, and a
-just-in-time compiler that can be used to optimize pattern matching. These
-are both optional features that can be omitted when the library is built.
+included in the distribution is a just-in-time compiler that can be used to
+optimize pattern matching. This is an optional feature that can be omitted when
+the library is built.
 
 
 THE BASIC LIBRARY FUNCTIONS
@@ -25,18 +25,18 @@
 University of Cambridge Computing Service,
 Cambridge, England.
 
-Copyright (c) 1997-2015 University of Cambridge
+Copyright (c) 1997-2016 University of Cambridge
 All rights reserved.
 
 
-PCRE JUST-IN-TIME COMPILATION SUPPORT
--------------------------------------
+PCRE2 JUST-IN-TIME COMPILATION SUPPORT
+--------------------------------------
 
 Written by:       Zoltan Herczeg
 Email local part: hzmester
 Emain domain:     freemail.hu
 
-Copyright(c) 2010-2015 Zoltan Herczeg
+Copyright(c) 2010-2016 Zoltan Herczeg
 All rights reserved.
 
 
@@ -47,16 +47,7 @@
 Email local part: hzmester
 Emain domain:     freemail.hu
 
-Copyright(c) 2009-2015 Zoltan Herczeg
-All rights reserved.
-
-
-THE C++ WRAPPER FUNCTIONS
--------------------------
-
-Contributed by:   Google Inc.
-
-Copyright (c) 2007-2012, Google Inc.
+Copyright(c) 2009-2016 Zoltan Herczeg
 All rights reserved.
 
 
@@ -73,10 +64,9 @@
       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 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.
+    * Neither the name of the University of Cambridge nor the names of any
+      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
diff --git a/dist2/Makefile.am b/dist2/Makefile.am
new file mode 100644
index 0000000..5977ba0
--- /dev/null
+++ b/dist2/Makefile.am
@@ -0,0 +1,796 @@
+## Process this file with automake to produce Makefile.in.
+
+AUTOMAKE_OPTIONS = subdir-objects
+ACLOCAL_AMFLAGS = -I m4
+AM_CPPFLAGS = -I$(builddir)/src -I$(srcdir)/src
+
+## Specify the documentation files that are distributed.
+
+dist_doc_DATA = \
+  AUTHORS \
+  COPYING \
+  ChangeLog \
+  LICENCE \
+  NEWS \
+  README \
+  doc/pcre2.txt \
+  doc/pcre2-config.txt \
+  doc/pcre2grep.txt \
+  doc/pcre2test.txt
+
+dist_html_DATA = \
+  doc/html/NON-AUTOTOOLS-BUILD.txt \
+  doc/html/README.txt \
+  doc/html/index.html \
+  doc/html/pcre2-config.html \
+  doc/html/pcre2.html \
+  doc/html/pcre2_callout_enumerate.html \
+  doc/html/pcre2_code_free.html \
+  doc/html/pcre2_compile.html \
+  doc/html/pcre2_compile_context_copy.html \
+  doc/html/pcre2_compile_context_create.html \
+  doc/html/pcre2_compile_context_free.html \
+  doc/html/pcre2_config.html \
+  doc/html/pcre2_dfa_match.html \
+  doc/html/pcre2_general_context_copy.html \
+  doc/html/pcre2_general_context_create.html \
+  doc/html/pcre2_general_context_free.html \
+  doc/html/pcre2_get_error_message.html \
+  doc/html/pcre2_get_mark.html \
+  doc/html/pcre2_get_ovector_count.html \
+  doc/html/pcre2_get_ovector_pointer.html \
+  doc/html/pcre2_get_startchar.html \
+  doc/html/pcre2_jit_compile.html \
+  doc/html/pcre2_jit_free_unused_memory.html \
+  doc/html/pcre2_jit_match.html \
+  doc/html/pcre2_jit_stack_assign.html \
+  doc/html/pcre2_jit_stack_create.html \
+  doc/html/pcre2_jit_stack_free.html \
+  doc/html/pcre2_maketables.html \
+  doc/html/pcre2_match.html \
+  doc/html/pcre2_match_context_copy.html \
+  doc/html/pcre2_match_context_create.html \
+  doc/html/pcre2_match_context_free.html \
+  doc/html/pcre2_match_data_create.html \
+  doc/html/pcre2_match_data_create_from_pattern.html \
+  doc/html/pcre2_match_data_free.html \
+  doc/html/pcre2_pattern_info.html \
+  doc/html/pcre2_serialize_decode.html \
+  doc/html/pcre2_serialize_encode.html \
+  doc/html/pcre2_serialize_free.html \
+  doc/html/pcre2_serialize_get_number_of_codes.html \
+  doc/html/pcre2_set_bsr.html \
+  doc/html/pcre2_set_callout.html \
+  doc/html/pcre2_set_character_tables.html \
+  doc/html/pcre2_set_compile_recursion_guard.html \
+  doc/html/pcre2_set_match_limit.html \
+  doc/html/pcre2_set_offset_limit.html \
+  doc/html/pcre2_set_newline.html \
+  doc/html/pcre2_set_parens_nest_limit.html \
+  doc/html/pcre2_set_recursion_limit.html \
+  doc/html/pcre2_set_recursion_memory_management.html \
+  doc/html/pcre2_substitute.html \
+  doc/html/pcre2_substring_copy_byname.html \
+  doc/html/pcre2_substring_copy_bynumber.html \
+  doc/html/pcre2_substring_free.html \
+  doc/html/pcre2_substring_get_byname.html \
+  doc/html/pcre2_substring_get_bynumber.html \
+  doc/html/pcre2_substring_length_byname.html \
+  doc/html/pcre2_substring_length_bynumber.html \
+  doc/html/pcre2_substring_list_free.html \
+  doc/html/pcre2_substring_list_get.html \
+  doc/html/pcre2_substring_nametable_scan.html \
+  doc/html/pcre2_substring_number_from_name.html \
+  doc/html/pcre2api.html \
+  doc/html/pcre2build.html \
+  doc/html/pcre2callout.html \
+  doc/html/pcre2compat.html \
+  doc/html/pcre2demo.html \
+  doc/html/pcre2grep.html \
+  doc/html/pcre2jit.html \
+  doc/html/pcre2limits.html \
+  doc/html/pcre2matching.html \
+  doc/html/pcre2partial.html \
+  doc/html/pcre2pattern.html \
+  doc/html/pcre2perform.html \
+  doc/html/pcre2posix.html \
+  doc/html/pcre2sample.html \
+  doc/html/pcre2serialize.html \
+  doc/html/pcre2stack.html \
+  doc/html/pcre2syntax.html \
+  doc/html/pcre2test.html \
+  doc/html/pcre2unicode.html
+
+dist_man_MANS = \
+  doc/pcre2-config.1 \
+  doc/pcre2.3 \
+  doc/pcre2_callout_enumerate.3 \
+  doc/pcre2_code_free.3 \
+  doc/pcre2_compile.3 \
+  doc/pcre2_compile_context_copy.3 \
+  doc/pcre2_compile_context_create.3 \
+  doc/pcre2_compile_context_free.3 \
+  doc/pcre2_config.3 \
+  doc/pcre2_dfa_match.3 \
+  doc/pcre2_general_context_copy.3 \
+  doc/pcre2_general_context_create.3 \
+  doc/pcre2_general_context_free.3 \
+  doc/pcre2_get_error_message.3 \
+  doc/pcre2_get_mark.3 \
+  doc/pcre2_get_ovector_count.3 \
+  doc/pcre2_get_ovector_pointer.3 \
+  doc/pcre2_get_startchar.3 \
+  doc/pcre2_jit_compile.3 \
+  doc/pcre2_jit_free_unused_memory.3 \
+  doc/pcre2_jit_match.3 \
+  doc/pcre2_jit_stack_assign.3 \
+  doc/pcre2_jit_stack_create.3 \
+  doc/pcre2_jit_stack_free.3 \
+  doc/pcre2_maketables.3 \
+  doc/pcre2_match.3 \
+  doc/pcre2_match_context_copy.3 \
+  doc/pcre2_match_context_create.3 \
+  doc/pcre2_match_context_free.3 \
+  doc/pcre2_match_data_create.3 \
+  doc/pcre2_match_data_create_from_pattern.3 \
+  doc/pcre2_match_data_free.3 \
+  doc/pcre2_pattern_info.3 \
+  doc/pcre2_serialize_decode.3 \
+  doc/pcre2_serialize_encode.3 \
+  doc/pcre2_serialize_free.3 \
+  doc/pcre2_serialize_get_number_of_codes.3 \
+  doc/pcre2_set_bsr.3 \
+  doc/pcre2_set_callout.3 \
+  doc/pcre2_set_character_tables.3 \
+  doc/pcre2_set_compile_recursion_guard.3 \
+  doc/pcre2_set_match_limit.3 \
+  doc/pcre2_set_offset_limit.3 \
+  doc/pcre2_set_newline.3 \
+  doc/pcre2_set_parens_nest_limit.3 \
+  doc/pcre2_set_recursion_limit.3 \
+  doc/pcre2_set_recursion_memory_management.3 \
+  doc/pcre2_substitute.3 \
+  doc/pcre2_substring_copy_byname.3 \
+  doc/pcre2_substring_copy_bynumber.3 \
+  doc/pcre2_substring_free.3 \
+  doc/pcre2_substring_get_byname.3 \
+  doc/pcre2_substring_get_bynumber.3 \
+  doc/pcre2_substring_length_byname.3 \
+  doc/pcre2_substring_length_bynumber.3 \
+  doc/pcre2_substring_list_free.3 \
+  doc/pcre2_substring_list_get.3 \
+  doc/pcre2_substring_nametable_scan.3 \
+  doc/pcre2_substring_number_from_name.3 \
+  doc/pcre2api.3 \
+  doc/pcre2build.3 \
+  doc/pcre2callout.3 \
+  doc/pcre2compat.3 \
+  doc/pcre2demo.3 \
+  doc/pcre2grep.1 \
+  doc/pcre2jit.3 \
+  doc/pcre2limits.3 \
+  doc/pcre2matching.3 \
+  doc/pcre2partial.3 \
+  doc/pcre2pattern.3 \
+  doc/pcre2perform.3 \
+  doc/pcre2posix.3 \
+  doc/pcre2sample.3 \
+  doc/pcre2serialize.3 \
+  doc/pcre2stack.3 \
+  doc/pcre2syntax.3 \
+  doc/pcre2test.1 \
+  doc/pcre2unicode.3
+
+# The Libtool libraries to install.  We'll add to this later.
+
+lib_LTLIBRARIES =
+
+# Unit tests you want to run when people type 'make check'.
+# TESTS is for binary unit tests, check_SCRIPTS for script-based tests
+
+TESTS =
+check_SCRIPTS =
+dist_noinst_SCRIPTS =
+
+# Some of the binaries we make are to be installed, and others are
+# (non-user-visible) helper programs needed to build the libraries.
+
+bin_PROGRAMS =
+noinst_PROGRAMS =
+
+# Additional files to delete on 'make clean', 'make distclean',
+# and 'make maintainer-clean'.
+
+CLEANFILES =
+DISTCLEANFILES = src/config.h.in~ config.h
+MAINTAINERCLEANFILES =
+
+# Additional files to bundle with the distribution, over and above what
+# the Autotools include by default.
+
+EXTRA_DIST =
+
+# These files contain additional m4 macros that are used by autoconf.
+
+EXTRA_DIST += \
+  m4/ax_pthread.m4 m4/pcre2_visibility.m4
+
+# These files contain maintenance information
+
+EXTRA_DIST += \
+  NON-AUTOTOOLS-BUILD \
+  HACKING
+
+# These files are used in the preparation of a release
+
+EXTRA_DIST += \
+  PrepareRelease \
+  CheckMan \
+  CleanTxt \
+  Detrail \
+  132html \
+  doc/index.html.src
+
+# These files are usable versions of pcre2.h and config.h that are distributed
+# for the benefit of people who are building PCRE2 manually, without the
+# Autotools support.
+
+EXTRA_DIST += \
+  src/pcre2.h.generic \
+  src/config.h.generic
+
+# The only difference between pcre2.h.in and pcre2.h is the setting of the PCRE
+# version number. Therefore, we can create the generic version just by copying.
+
+src/pcre2.h.generic: src/pcre2.h.in configure.ac
+	rm -f $@
+	cp -p src/pcre2.h $@
+
+# It is more complicated for config.h.generic. We need the version that results
+# from a default configuration so as to get all the default values for PCRE
+# configuration macros such as MATCH_LIMIT and NEWLINE. We can get this by
+# doing a configure in a temporary directory. However, some trickery is needed,
+# because the source directory may already be configured. If you just try
+# running configure in a new directory, it complains. For this reason, we move
+# config.status out of the way while doing the default configuration. The
+# resulting config.h is munged by perl to put #ifdefs round any #defines for
+# macros with values, and to #undef all boolean macros such as HAVE_xxx and
+# SUPPORT_xxx. We also get rid of any gcc-specific visibility settings. Make
+# sure that PCRE2_EXP_DEFN is unset (in case it has visibility settings).
+
+src/config.h.generic: configure.ac
+	rm -rf $@ _generic
+	mkdir _generic
+	cs=$(srcdir)/config.status; test ! -f $$cs || mv -f $$cs $$cs.aside
+	cd _generic && $(abs_top_srcdir)/configure || :
+	cs=$(srcdir)/config.status; test ! -f $$cs.aside || mv -f $$cs.aside $$cs
+	test -f _generic/src/config.h
+	perl -n \
+	  -e 'BEGIN{$$blank=0;}' \
+	  -e 'if(/PCRE2_EXP_DEFN/){print"/* #undef PCRE2_EXP_DEFN */\n";$$blank=0;next;}' \
+	  -e 'if(/to make a symbol visible/){next;}' \
+	  -e 'if(/__attribute__ \(\(visibility/){next;}' \
+	  -e 'if(/LT_OBJDIR/){print"/* This is ignored unless you are using libtool. */\n";}' \
+	  -e 'if(/^#define\s((?:HAVE|SUPPORT|STDC)_\w+)/){print"/* #undef $$1 */\n";$$blank=0;next;}' \
+	  -e 'if(/^#define\s(?!PACKAGE|VERSION)(\w+)/){print"#ifndef $$1\n$$_#endif\n";$$blank=0;next;}' \
+	  -e 'if(/^\s*$$/){print unless $$blank; $$blank=1;} else{print;$$blank=0;}' \
+	  _generic/src/config.h >$@
+	rm -rf _generic
+
+MAINTAINERCLEANFILES += src/pcre2.h.generic src/config.h.generic
+
+# These are the header files we'll install. We do not distribute pcre2.h
+# because it is generated from pcre2.h.in.
+
+nodist_include_HEADERS = src/pcre2.h
+include_HEADERS = src/pcre2posix.h
+
+# This is the "config" script.
+
+bin_SCRIPTS = pcre2-config
+
+## ---------------------------------------------------------------
+## The dftables program is used to rebuild character tables before compiling
+## PCRE2, if --enable-rebuild-chartables is specified. It is not a user-visible
+## program. The default (when --enable-rebuild-chartables is not specified) is
+## to copy a distributed set of tables that are defined for ASCII code. In this
+## case, dftables is not needed.
+
+if WITH_REBUILD_CHARTABLES
+noinst_PROGRAMS += dftables
+dftables_SOURCES = src/dftables.c
+src/pcre2_chartables.c: dftables$(EXEEXT)
+	rm -f $@
+	./dftables$(EXEEXT) $@
+else
+src/pcre2_chartables.c: $(srcdir)/src/pcre2_chartables.c.dist
+	rm -f $@
+	$(LN_S) $(abs_srcdir)/src/pcre2_chartables.c.dist $(abs_builddir)/src/pcre2_chartables.c
+endif # WITH_REBUILD_CHARTABLES
+
+BUILT_SOURCES = src/pcre2_chartables.c
+NODIST_SOURCES = src/pcre2_chartables.c
+
+## Define the list of common sources, then arrange to build whichever of the
+## 8-, 16-, or 32-bit libraries are configured.
+
+COMMON_SOURCES = \
+  src/pcre2_auto_possess.c \
+  src/pcre2_compile.c \
+  src/pcre2_config.c \
+  src/pcre2_context.c \
+  src/pcre2_dfa_match.c \
+  src/pcre2_error.c \
+  src/pcre2_find_bracket.c \
+  src/pcre2_internal.h \
+  src/pcre2_intmodedep.h \
+  src/pcre2_jit_compile.c \
+  src/pcre2_maketables.c \
+  src/pcre2_match.c \
+  src/pcre2_match_data.c \
+  src/pcre2_newline.c \
+  src/pcre2_ord2utf.c \
+  src/pcre2_pattern_info.c \
+  src/pcre2_serialize.c \
+  src/pcre2_string_utils.c \
+  src/pcre2_study.c \
+  src/pcre2_substitute.c \
+  src/pcre2_substring.c \
+  src/pcre2_tables.c \
+  src/pcre2_ucd.c \
+  src/pcre2_ucp.h \
+  src/pcre2_valid_utf.c \
+  src/pcre2_xclass.c
+
+if WITH_PCRE2_8
+lib_LTLIBRARIES += libpcre2-8.la
+libpcre2_8_la_SOURCES = \
+  $(COMMON_SOURCES)
+nodist_libpcre2_8_la_SOURCES = \
+  $(NODIST_SOURCES)
+libpcre2_8_la_CFLAGS = \
+  -DPCRE2_CODE_UNIT_WIDTH=8 \
+  $(VISIBILITY_CFLAGS) \
+  $(AM_CFLAGS)
+libpcre2_8_la_LIBADD =
+endif # WITH_PCRE2_8
+
+if WITH_PCRE2_16
+lib_LTLIBRARIES += libpcre2-16.la
+libpcre2_16_la_SOURCES = \
+  $(COMMON_SOURCES)
+nodist_libpcre2_16_la_SOURCES = \
+  $(NODIST_SOURCES)
+libpcre2_16_la_CFLAGS = \
+  -DPCRE2_CODE_UNIT_WIDTH=16 \
+  $(VISIBILITY_CFLAGS) \
+  $(AM_CFLAGS)
+libpcre2_16_la_LIBADD =
+endif # WITH_PCRE2_16
+
+if WITH_PCRE2_32
+lib_LTLIBRARIES += libpcre2-32.la
+libpcre2_32_la_SOURCES = \
+  $(COMMON_SOURCES)
+nodist_libpcre2_32_la_SOURCES = \
+  $(NODIST_SOURCES)
+libpcre2_32_la_CFLAGS = \
+  -DPCRE2_CODE_UNIT_WIDTH=32 \
+  $(VISIBILITY_CFLAGS) \
+  $(AM_CFLAGS)
+libpcre2_32_la_LIBADD =
+endif # WITH_PCRE2_32
+
+# The pcre2_chartables.c.dist file is the default version of
+# pcre2_chartables.c, used unless --enable-rebuild-chartables is specified.
+
+EXTRA_DIST += src/pcre2_chartables.c.dist
+CLEANFILES += src/pcre2_chartables.c
+
+# The JIT compiler lives in a separate directory, but its files are #included
+# when pcre2_jit_compile.c is processed, so they must be distributed.
+
+EXTRA_DIST += \
+  src/sljit/sljitConfig.h \
+  src/sljit/sljitConfigInternal.h \
+  src/sljit/sljitExecAllocator.c \
+  src/sljit/sljitLir.c \
+  src/sljit/sljitLir.h \
+  src/sljit/sljitNativeARM_32.c \
+  src/sljit/sljitNativeARM_64.c \
+  src/sljit/sljitNativeARM_T2_32.c \
+  src/sljit/sljitNativeMIPS_32.c \
+  src/sljit/sljitNativeMIPS_64.c \
+  src/sljit/sljitNativeMIPS_common.c \
+  src/sljit/sljitNativePPC_32.c \
+  src/sljit/sljitNativePPC_64.c \
+  src/sljit/sljitNativePPC_common.c \
+  src/sljit/sljitNativeSPARC_32.c \
+  src/sljit/sljitNativeSPARC_common.c \
+  src/sljit/sljitNativeTILEGX-encoder.c \
+  src/sljit/sljitNativeTILEGX_64.c \
+  src/sljit/sljitNativeX86_32.c \
+  src/sljit/sljitNativeX86_64.c \
+  src/sljit/sljitNativeX86_common.c \
+  src/sljit/sljitUtils.c
+
+# Some of the JIT sources are also in separate files that are #included.
+
+EXTRA_DIST += \
+  src/pcre2_jit_match.c \
+  src/pcre2_jit_misc.c
+
+if WITH_PCRE2_8
+libpcre2_8_la_LDFLAGS = $(EXTRA_LIBPCRE2_8_LDFLAGS)
+endif # WITH_PCRE2_8
+if WITH_PCRE2_16
+libpcre2_16_la_LDFLAGS = $(EXTRA_LIBPCRE2_16_LDFLAGS)
+endif # WITH_PCRE2_16
+if WITH_PCRE2_32
+libpcre2_32_la_LDFLAGS = $(EXTRA_LIBPCRE2_32_LDFLAGS)
+endif # WITH_PCRE2_32
+
+if WITH_VALGRIND
+if WITH_PCRE2_8
+libpcre2_8_la_CFLAGS += $(VALGRIND_CFLAGS)
+endif # WITH_PCRE2_8
+if WITH_PCRE2_16
+libpcre2_16_la_CFLAGS += $(VALGRIND_CFLAGS)
+endif # WITH_PCRE2_16
+if WITH_PCRE2_32
+libpcre2_32_la_CFLAGS += $(VALGRIND_CFLAGS)
+endif # WITH_PCRE2_32
+endif # WITH_VALGRIND
+
+if WITH_GCOV
+if WITH_PCRE2_8
+libpcre2_8_la_CFLAGS += $(GCOV_CFLAGS)
+endif # WITH_PCRE2_8
+if WITH_PCRE2_16
+libpcre2_16_la_CFLAGS += $(GCOV_CFLAGS)
+endif # WITH_PCRE2_16
+if WITH_PCRE2_32
+libpcre2_32_la_CFLAGS += $(GCOV_CFLAGS)
+endif # WITH_PCRE2_32
+endif # WITH_GCOV
+
+## A version of the 8-bit library that has a POSIX API.
+
+if WITH_PCRE2_8
+lib_LTLIBRARIES += libpcre2-posix.la
+libpcre2_posix_la_SOURCES = src/pcre2posix.c
+libpcre2_posix_la_CFLAGS = \
+  -DPCRE2_CODE_UNIT_WIDTH=8 \
+  $(VISIBILITY_CFLAGS) $(AM_CFLAGS)
+libpcre2_posix_la_LDFLAGS = $(EXTRA_LIBPCRE2_POSIX_LDFLAGS)
+libpcre2_posix_la_LIBADD = libpcre2-8.la
+if WITH_GCOV
+libpcre2_posix_la_CFLAGS += $(GCOV_CFLAGS)
+endif # WITH_GCOV
+endif # WITH_PCRE2_8
+
+## Build pcre2grep if the 8-bit library is enabled
+
+if WITH_PCRE2_8
+bin_PROGRAMS += pcre2grep
+pcre2grep_SOURCES = src/pcre2grep.c
+pcre2grep_CFLAGS = $(AM_CFLAGS)
+pcre2grep_LDADD = $(LIBZ) $(LIBBZ2)
+pcre2grep_LDADD += libpcre2-8.la
+if WITH_GCOV
+pcre2grep_CFLAGS += $(GCOV_CFLAGS)
+pcre2grep_LDADD += $(GCOV_LIBS)
+endif # WITH_GCOV
+endif # WITH_PCRE2_8
+
+## -------- Testing ----------
+
+## If JIT support is enabled, arrange for the JIT test program to run.
+
+if WITH_JIT
+TESTS += pcre2_jit_test
+noinst_PROGRAMS += pcre2_jit_test
+pcre2_jit_test_SOURCES = src/pcre2_jit_test.c
+pcre2_jit_test_CFLAGS = $(AM_CFLAGS)
+pcre2_jit_test_LDADD =
+if WITH_PCRE2_8
+pcre2_jit_test_LDADD += libpcre2-8.la
+endif # WITH_PCRE2_8
+if WITH_PCRE2_16
+pcre2_jit_test_LDADD += libpcre2-16.la
+endif # WITH_PCRE2_16
+if WITH_PCRE2_32
+pcre2_jit_test_LDADD += libpcre2-32.la
+endif # WITH_PCRE2_32
+if WITH_GCOV
+pcre2_jit_test_CFLAGS += $(GCOV_CFLAGS)
+pcre2_jit_test_LDADD += $(GCOV_LIBS)
+endif # WITH_GCOV
+endif # WITH_JIT
+
+# Build the general pcre2test program. The file src/pcre2_printint.c is
+# #included by pcre2test as many times as needed, at different code unit
+# widths.
+
+bin_PROGRAMS += pcre2test
+EXTRA_DIST += src/pcre2_printint.c
+pcre2test_SOURCES = src/pcre2test.c
+pcre2test_CFLAGS = $(AM_CFLAGS)
+pcre2test_LDADD = $(LIBREADLINE)
+
+if WITH_PCRE2_8
+pcre2test_LDADD += libpcre2-8.la libpcre2-posix.la
+endif # WITH_PCRE2_8
+
+if WITH_PCRE2_16
+pcre2test_LDADD += libpcre2-16.la
+endif # WITH_PCRE2_16
+
+if WITH_PCRE2_32
+pcre2test_LDADD += libpcre2-32.la
+endif # WITH_PCRE2_32
+
+if WITH_VALGRIND
+pcre2test_CFLAGS += $(VALGRIND_CFLAGS)
+endif # WITH_VALGRIND
+
+if WITH_GCOV
+pcre2test_CFLAGS += $(GCOV_CFLAGS)
+pcre2test_LDADD += $(GCOV_LIBS)
+endif # WITH_GCOV
+
+## The main library tests. Each test is a binary plus a script that runs that
+## binary in various ways. We install these test binaries in case folks find it
+## helpful.
+
+TESTS += RunTest
+dist_noinst_SCRIPTS += RunTest
+
+EXTRA_DIST += RunTest.bat
+
+## When the 8-bit library is configured, pcre2grep will have been built.
+
+if WITH_PCRE2_8
+TESTS += RunGrepTest
+dist_noinst_SCRIPTS += RunGrepTest
+endif # WITH_PCRE2_8
+
+## Distribute all the test data files
+
+EXTRA_DIST += \
+  testdata/grepbinary \
+  testdata/grepfilelist \
+  testdata/grepinput \
+  testdata/grepinput3 \
+  testdata/grepinput8 \
+  testdata/grepinputv \
+  testdata/grepinputx \
+  testdata/greplist \
+  testdata/grepoutput \
+  testdata/grepoutput8 \
+  testdata/grepoutputN \
+  testdata/greppatN4 \
+  testdata/testinput1 \
+  testdata/testinput2 \
+  testdata/testinput3 \
+  testdata/testinput4 \
+  testdata/testinput5 \
+  testdata/testinput6 \
+  testdata/testinput7 \
+  testdata/testinput8 \
+  testdata/testinput9 \
+  testdata/testinput10 \
+  testdata/testinput11 \
+  testdata/testinput12 \
+  testdata/testinput13 \
+  testdata/testinput14 \
+  testdata/testinput15 \
+  testdata/testinput16 \
+  testdata/testinput17 \
+  testdata/testinput18 \
+  testdata/testinput19 \
+  testdata/testinput20 \
+  testdata/testinput21 \
+  testdata/testinput22 \
+  testdata/testinput23 \
+  testdata/testinputEBC \
+  testdata/testoutput1 \
+  testdata/testoutput2 \
+  testdata/testoutput3 \
+  testdata/testoutput3A \
+  testdata/testoutput3B \
+  testdata/testoutput4 \
+  testdata/testoutput5 \
+  testdata/testoutput6 \
+  testdata/testoutput7 \
+  testdata/testoutput8-16-2 \
+  testdata/testoutput8-16-3 \
+  testdata/testoutput8-16-3 \
+  testdata/testoutput8-32-2 \
+  testdata/testoutput8-32-3 \
+  testdata/testoutput8-32-4 \
+  testdata/testoutput8-8-2 \
+  testdata/testoutput8-8-3 \
+  testdata/testoutput8-8-4 \
+  testdata/testoutput9 \
+  testdata/testoutput10 \
+  testdata/testoutput11-16 \
+  testdata/testoutput11-32 \
+  testdata/testoutput12-16 \
+  testdata/testoutput12-32 \
+  testdata/testoutput13 \
+  testdata/testoutput14-16 \
+  testdata/testoutput14-32 \
+  testdata/testoutput14-8 \
+  testdata/testoutput15 \
+  testdata/testoutput16 \
+  testdata/testoutput17 \
+  testdata/testoutput18 \
+  testdata/testoutput19 \
+  testdata/testoutput20 \
+  testdata/testoutput21 \
+  testdata/testoutput22-16 \
+  testdata/testoutput22-32 \
+  testdata/testoutput22-8 \
+  testdata/testoutput23 \
+  testdata/testoutputEBC \
+  testdata/valgrind-jit.supp \
+  testdata/wintestinput3 \
+  testdata/wintestoutput3 \
+  perltest.sh
+
+# RunTest and RunGrepTest should clean up after themselves, but just in case
+# they don't, add their working files to CLEANFILES.
+
+CLEANFILES += \
+        testSinput \
+        test3input \
+        test3output \
+        test3outputA \
+        test3outputB \
+        testtry \
+        teststdout \
+	teststderr \
+        teststderrgrep \
+        testtemp1grep \
+        testtemp2grep \
+        testtrygrep \
+        testNinputgrep
+
+## ------------ End of testing -------------
+
+
+# PCRE2 demonstration program. Not built automatcally. The point is that the
+# users should build it themselves. So just distribute the source.
+
+EXTRA_DIST += src/pcre2demo.c
+
+
+# We have .pc files for pkg-config users.
+
+pkgconfigdir = $(libdir)/pkgconfig
+pkgconfig_DATA =
+
+if WITH_PCRE2_8
+pkgconfig_DATA += libpcre2-8.pc libpcre2-posix.pc
+endif
+
+if WITH_PCRE2_16
+pkgconfig_DATA += libpcre2-16.pc
+endif
+
+if WITH_PCRE2_32
+pkgconfig_DATA += libpcre2-32.pc
+endif
+
+
+# gcov/lcov code coverage reporting
+#
+# Coverage reporting targets:
+#
+# coverage: Create a coverage report from 'make check'
+# coverage-baseline: Capture baseline coverage information
+# coverage-reset: This zeros the coverage counters only
+# coverage-report: This creates the coverage report only
+# coverage-clean-report: This removes the generated coverage report
+#   without cleaning the coverage data itself
+# coverage-clean-data: This removes the captured coverage data without
+#   removing the coverage files created at compile time (*.gcno)
+# coverage-clean: This cleans all coverage data including the generated
+#   coverage report.
+
+if WITH_GCOV
+COVERAGE_TEST_NAME = $(PACKAGE)
+COVERAGE_NAME = $(PACKAGE)-$(VERSION)
+COVERAGE_OUTPUT_FILE = $(COVERAGE_NAME)-coverage.info
+COVERAGE_OUTPUT_DIR = $(COVERAGE_NAME)-coverage
+COVERAGE_LCOV_EXTRA_FLAGS =
+COVERAGE_GENHTML_EXTRA_FLAGS =
+
+coverage_quiet = $(coverage_quiet_$(V))
+coverage_quiet_ = $(coverage_quiet_$(AM_DEFAULT_VERBOSITY))
+coverage_quiet_0 = --quiet
+
+coverage-check: all
+	-$(MAKE) $(AM_MAKEFLAGS) -k check
+
+coverage-baseline:
+	$(LCOV) $(coverage_quiet) \
+		--directory $(top_builddir) \
+		--output-file "$(COVERAGE_OUTPUT_FILE)" \
+		--capture \
+		--initial
+
+coverage-report:
+	$(LCOV) $(coverage_quiet) \
+		--directory $(top_builddir) \
+		--capture \
+		--output-file "$(COVERAGE_OUTPUT_FILE).tmp" \
+		--test-name "$(COVERAGE_TEST_NAME)" \
+		--no-checksum \
+		--compat-libtool \
+		$(COVERAGE_LCOV_EXTRA_FLAGS)
+	$(LCOV) $(coverage_quiet) \
+		--directory $(top_builddir) \
+		--output-file "$(COVERAGE_OUTPUT_FILE)" \
+		--remove "$(COVERAGE_OUTPUT_FILE).tmp" \
+		"/tmp/*" \
+		"/usr/include/*" \
+		"$(includedir)/*"
+	-@rm -f "$(COVERAGE_OUTPUT_FILE).tmp"
+	LANG=C $(GENHTML) $(coverage_quiet) \
+		--prefix $(top_builddir) \
+		--output-directory "$(COVERAGE_OUTPUT_DIR)" \
+		--title "$(PACKAGE) $(VERSION) Code Coverage Report" \
+		--show-details "$(COVERAGE_OUTPUT_FILE)" \
+		--legend \
+		$(COVERAGE_GENHTML_EXTRA_FLAGS)
+	@echo "Code coverage report written to file://$(abs_builddir)/$(COVERAGE_OUTPUT_DIR)/index.html"
+
+coverage-reset:
+	-$(LCOV) $(coverage_quiet) --zerocounters --directory $(top_builddir)
+
+coverage-clean-report:
+	-rm -f "$(COVERAGE_OUTPUT_FILE)" "$(COVERAGE_OUTPUT_FILE).tmp"
+	-rm -rf "$(COVERAGE_OUTPUT_DIR)"
+
+coverage-clean-data:
+	-find $(top_builddir) -name "*.gcda" -delete
+
+coverage-clean: coverage-reset coverage-clean-report coverage-clean-data
+	-find $(top_builddir) -name "*.gcno" -delete
+
+coverage-distclean: coverage-clean
+
+coverage: coverage-reset coverage-baseline coverage-check coverage-report
+clean-local: coverage-clean
+distclean-local: coverage-distclean
+
+.PHONY: coverage coverage-baseline coverage-check coverage-report coverage-reset coverage-clean-report coverage-clean-data coverage-clean coverage-distclean
+
+# Without coverage support, still arrange for 'make distclean' to get rid of
+# any coverage files that may have been left from a different configuration.
+
+else
+
+coverage:
+	@echo "Configuring with --enable-coverage is required to generate code coverage report."
+
+DISTCLEANFILES += src/*.gcda src/*.gcno
+
+distclean-local:
+	rm -rf $(PACKAGE)-$(VERSION)-coverage*
+
+endif # WITH_GCOV
+
+## CMake support
+
+EXTRA_DIST += \
+  cmake/COPYING-CMAKE-SCRIPTS \
+  cmake/FindPackageHandleStandardArgs.cmake \
+  cmake/FindReadline.cmake \
+  cmake/FindEditline.cmake \
+  CMakeLists.txt \
+  config-cmake.h.in
+
+## end Makefile.am
diff --git a/dist2/Makefile.in b/dist2/Makefile.in
new file mode 100644
index 0000000..d86120b
--- /dev/null
+++ b/dist2/Makefile.in
@@ -0,0 +1,3135 @@
+# Makefile.in generated by automake 1.15 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+
+
+
+VPATH = @srcdir@
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+TESTS = $(am__EXEEXT_3) RunTest $(am__append_29)
+bin_PROGRAMS = $(am__EXEEXT_1) pcre2test$(EXEEXT)
+noinst_PROGRAMS = $(am__EXEEXT_2) $(am__EXEEXT_3)
+@WITH_REBUILD_CHARTABLES_TRUE@am__append_1 = dftables
+@WITH_PCRE2_8_TRUE@am__append_2 = libpcre2-8.la
+@WITH_PCRE2_16_TRUE@am__append_3 = libpcre2-16.la
+@WITH_PCRE2_32_TRUE@am__append_4 = libpcre2-32.la
+@WITH_PCRE2_8_TRUE@@WITH_VALGRIND_TRUE@am__append_5 = $(VALGRIND_CFLAGS)
+@WITH_PCRE2_16_TRUE@@WITH_VALGRIND_TRUE@am__append_6 = $(VALGRIND_CFLAGS)
+@WITH_PCRE2_32_TRUE@@WITH_VALGRIND_TRUE@am__append_7 = $(VALGRIND_CFLAGS)
+@WITH_GCOV_TRUE@@WITH_PCRE2_8_TRUE@am__append_8 = $(GCOV_CFLAGS)
+@WITH_GCOV_TRUE@@WITH_PCRE2_16_TRUE@am__append_9 = $(GCOV_CFLAGS)
+@WITH_GCOV_TRUE@@WITH_PCRE2_32_TRUE@am__append_10 = $(GCOV_CFLAGS)
+@WITH_PCRE2_8_TRUE@am__append_11 = libpcre2-posix.la
+@WITH_GCOV_TRUE@@WITH_PCRE2_8_TRUE@am__append_12 = $(GCOV_CFLAGS)
+@WITH_PCRE2_8_TRUE@am__append_13 = pcre2grep
+@WITH_GCOV_TRUE@@WITH_PCRE2_8_TRUE@am__append_14 = $(GCOV_CFLAGS)
+@WITH_GCOV_TRUE@@WITH_PCRE2_8_TRUE@am__append_15 = $(GCOV_LIBS)
+@WITH_JIT_TRUE@am__append_16 = pcre2_jit_test
+@WITH_JIT_TRUE@am__append_17 = pcre2_jit_test
+@WITH_JIT_TRUE@@WITH_PCRE2_8_TRUE@am__append_18 = libpcre2-8.la
+@WITH_JIT_TRUE@@WITH_PCRE2_16_TRUE@am__append_19 = libpcre2-16.la
+@WITH_JIT_TRUE@@WITH_PCRE2_32_TRUE@am__append_20 = libpcre2-32.la
+@WITH_GCOV_TRUE@@WITH_JIT_TRUE@am__append_21 = $(GCOV_CFLAGS)
+@WITH_GCOV_TRUE@@WITH_JIT_TRUE@am__append_22 = $(GCOV_LIBS)
+@WITH_PCRE2_8_TRUE@am__append_23 = libpcre2-8.la libpcre2-posix.la
+@WITH_PCRE2_16_TRUE@am__append_24 = libpcre2-16.la
+@WITH_PCRE2_32_TRUE@am__append_25 = libpcre2-32.la
+@WITH_VALGRIND_TRUE@am__append_26 = $(VALGRIND_CFLAGS)
+@WITH_GCOV_TRUE@am__append_27 = $(GCOV_CFLAGS)
+@WITH_GCOV_TRUE@am__append_28 = $(GCOV_LIBS)
+@WITH_PCRE2_8_TRUE@am__append_29 = RunGrepTest
+@WITH_PCRE2_8_TRUE@am__append_30 = RunGrepTest
+@WITH_PCRE2_8_TRUE@am__append_31 = libpcre2-8.pc libpcre2-posix.pc
+@WITH_PCRE2_16_TRUE@am__append_32 = libpcre2-16.pc
+@WITH_PCRE2_32_TRUE@am__append_33 = libpcre2-32.pc
+@WITH_GCOV_FALSE@am__append_34 = src/*.gcda src/*.gcno
+subdir = .
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_pthread.m4 \
+	$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
+	$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
+	$(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/m4/pcre2_visibility.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \
+	$(am__configure_deps) $(am__dist_noinst_SCRIPTS_DIST) \
+	$(dist_doc_DATA) $(dist_html_DATA) $(include_HEADERS) \
+	$(am__DIST_COMMON)
+am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
+ configure.lineno config.status.lineno
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/src/config.h
+CONFIG_CLEAN_FILES = libpcre2-8.pc libpcre2-16.pc libpcre2-32.pc \
+	libpcre2-posix.pc pcre2-config src/pcre2.h
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" \
+	"$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" \
+	"$(DESTDIR)$(man3dir)" "$(DESTDIR)$(docdir)" \
+	"$(DESTDIR)$(htmldir)" "$(DESTDIR)$(pkgconfigdir)" \
+	"$(DESTDIR)$(includedir)" "$(DESTDIR)$(includedir)"
+LTLIBRARIES = $(lib_LTLIBRARIES)
+libpcre2_16_la_DEPENDENCIES =
+am__libpcre2_16_la_SOURCES_DIST = src/pcre2_auto_possess.c \
+	src/pcre2_compile.c src/pcre2_config.c src/pcre2_context.c \
+	src/pcre2_dfa_match.c src/pcre2_error.c \
+	src/pcre2_find_bracket.c src/pcre2_internal.h \
+	src/pcre2_intmodedep.h src/pcre2_jit_compile.c \
+	src/pcre2_maketables.c src/pcre2_match.c \
+	src/pcre2_match_data.c src/pcre2_newline.c src/pcre2_ord2utf.c \
+	src/pcre2_pattern_info.c src/pcre2_serialize.c \
+	src/pcre2_string_utils.c src/pcre2_study.c \
+	src/pcre2_substitute.c src/pcre2_substring.c \
+	src/pcre2_tables.c src/pcre2_ucd.c src/pcre2_ucp.h \
+	src/pcre2_valid_utf.c src/pcre2_xclass.c
+am__dirstamp = $(am__leading_dot)dirstamp
+am__objects_1 = src/libpcre2_16_la-pcre2_auto_possess.lo \
+	src/libpcre2_16_la-pcre2_compile.lo \
+	src/libpcre2_16_la-pcre2_config.lo \
+	src/libpcre2_16_la-pcre2_context.lo \
+	src/libpcre2_16_la-pcre2_dfa_match.lo \
+	src/libpcre2_16_la-pcre2_error.lo \
+	src/libpcre2_16_la-pcre2_find_bracket.lo \
+	src/libpcre2_16_la-pcre2_jit_compile.lo \
+	src/libpcre2_16_la-pcre2_maketables.lo \
+	src/libpcre2_16_la-pcre2_match.lo \
+	src/libpcre2_16_la-pcre2_match_data.lo \
+	src/libpcre2_16_la-pcre2_newline.lo \
+	src/libpcre2_16_la-pcre2_ord2utf.lo \
+	src/libpcre2_16_la-pcre2_pattern_info.lo \
+	src/libpcre2_16_la-pcre2_serialize.lo \
+	src/libpcre2_16_la-pcre2_string_utils.lo \
+	src/libpcre2_16_la-pcre2_study.lo \
+	src/libpcre2_16_la-pcre2_substitute.lo \
+	src/libpcre2_16_la-pcre2_substring.lo \
+	src/libpcre2_16_la-pcre2_tables.lo \
+	src/libpcre2_16_la-pcre2_ucd.lo \
+	src/libpcre2_16_la-pcre2_valid_utf.lo \
+	src/libpcre2_16_la-pcre2_xclass.lo
+@WITH_PCRE2_16_TRUE@am_libpcre2_16_la_OBJECTS = $(am__objects_1)
+am__objects_2 = src/libpcre2_16_la-pcre2_chartables.lo
+@WITH_PCRE2_16_TRUE@nodist_libpcre2_16_la_OBJECTS = $(am__objects_2)
+libpcre2_16_la_OBJECTS = $(am_libpcre2_16_la_OBJECTS) \
+	$(nodist_libpcre2_16_la_OBJECTS)
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 = 
+libpcre2_16_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+	$(libpcre2_16_la_CFLAGS) $(CFLAGS) $(libpcre2_16_la_LDFLAGS) \
+	$(LDFLAGS) -o $@
+@WITH_PCRE2_16_TRUE@am_libpcre2_16_la_rpath = -rpath $(libdir)
+libpcre2_32_la_DEPENDENCIES =
+am__libpcre2_32_la_SOURCES_DIST = src/pcre2_auto_possess.c \
+	src/pcre2_compile.c src/pcre2_config.c src/pcre2_context.c \
+	src/pcre2_dfa_match.c src/pcre2_error.c \
+	src/pcre2_find_bracket.c src/pcre2_internal.h \
+	src/pcre2_intmodedep.h src/pcre2_jit_compile.c \
+	src/pcre2_maketables.c src/pcre2_match.c \
+	src/pcre2_match_data.c src/pcre2_newline.c src/pcre2_ord2utf.c \
+	src/pcre2_pattern_info.c src/pcre2_serialize.c \
+	src/pcre2_string_utils.c src/pcre2_study.c \
+	src/pcre2_substitute.c src/pcre2_substring.c \
+	src/pcre2_tables.c src/pcre2_ucd.c src/pcre2_ucp.h \
+	src/pcre2_valid_utf.c src/pcre2_xclass.c
+am__objects_3 = src/libpcre2_32_la-pcre2_auto_possess.lo \
+	src/libpcre2_32_la-pcre2_compile.lo \
+	src/libpcre2_32_la-pcre2_config.lo \
+	src/libpcre2_32_la-pcre2_context.lo \
+	src/libpcre2_32_la-pcre2_dfa_match.lo \
+	src/libpcre2_32_la-pcre2_error.lo \
+	src/libpcre2_32_la-pcre2_find_bracket.lo \
+	src/libpcre2_32_la-pcre2_jit_compile.lo \
+	src/libpcre2_32_la-pcre2_maketables.lo \
+	src/libpcre2_32_la-pcre2_match.lo \
+	src/libpcre2_32_la-pcre2_match_data.lo \
+	src/libpcre2_32_la-pcre2_newline.lo \
+	src/libpcre2_32_la-pcre2_ord2utf.lo \
+	src/libpcre2_32_la-pcre2_pattern_info.lo \
+	src/libpcre2_32_la-pcre2_serialize.lo \
+	src/libpcre2_32_la-pcre2_string_utils.lo \
+	src/libpcre2_32_la-pcre2_study.lo \
+	src/libpcre2_32_la-pcre2_substitute.lo \
+	src/libpcre2_32_la-pcre2_substring.lo \
+	src/libpcre2_32_la-pcre2_tables.lo \
+	src/libpcre2_32_la-pcre2_ucd.lo \
+	src/libpcre2_32_la-pcre2_valid_utf.lo \
+	src/libpcre2_32_la-pcre2_xclass.lo
+@WITH_PCRE2_32_TRUE@am_libpcre2_32_la_OBJECTS = $(am__objects_3)
+am__objects_4 = src/libpcre2_32_la-pcre2_chartables.lo
+@WITH_PCRE2_32_TRUE@nodist_libpcre2_32_la_OBJECTS = $(am__objects_4)
+libpcre2_32_la_OBJECTS = $(am_libpcre2_32_la_OBJECTS) \
+	$(nodist_libpcre2_32_la_OBJECTS)
+libpcre2_32_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+	$(libpcre2_32_la_CFLAGS) $(CFLAGS) $(libpcre2_32_la_LDFLAGS) \
+	$(LDFLAGS) -o $@
+@WITH_PCRE2_32_TRUE@am_libpcre2_32_la_rpath = -rpath $(libdir)
+libpcre2_8_la_DEPENDENCIES =
+am__libpcre2_8_la_SOURCES_DIST = src/pcre2_auto_possess.c \
+	src/pcre2_compile.c src/pcre2_config.c src/pcre2_context.c \
+	src/pcre2_dfa_match.c src/pcre2_error.c \
+	src/pcre2_find_bracket.c src/pcre2_internal.h \
+	src/pcre2_intmodedep.h src/pcre2_jit_compile.c \
+	src/pcre2_maketables.c src/pcre2_match.c \
+	src/pcre2_match_data.c src/pcre2_newline.c src/pcre2_ord2utf.c \
+	src/pcre2_pattern_info.c src/pcre2_serialize.c \
+	src/pcre2_string_utils.c src/pcre2_study.c \
+	src/pcre2_substitute.c src/pcre2_substring.c \
+	src/pcre2_tables.c src/pcre2_ucd.c src/pcre2_ucp.h \
+	src/pcre2_valid_utf.c src/pcre2_xclass.c
+am__objects_5 = src/libpcre2_8_la-pcre2_auto_possess.lo \
+	src/libpcre2_8_la-pcre2_compile.lo \
+	src/libpcre2_8_la-pcre2_config.lo \
+	src/libpcre2_8_la-pcre2_context.lo \
+	src/libpcre2_8_la-pcre2_dfa_match.lo \
+	src/libpcre2_8_la-pcre2_error.lo \
+	src/libpcre2_8_la-pcre2_find_bracket.lo \
+	src/libpcre2_8_la-pcre2_jit_compile.lo \
+	src/libpcre2_8_la-pcre2_maketables.lo \
+	src/libpcre2_8_la-pcre2_match.lo \
+	src/libpcre2_8_la-pcre2_match_data.lo \
+	src/libpcre2_8_la-pcre2_newline.lo \
+	src/libpcre2_8_la-pcre2_ord2utf.lo \
+	src/libpcre2_8_la-pcre2_pattern_info.lo \
+	src/libpcre2_8_la-pcre2_serialize.lo \
+	src/libpcre2_8_la-pcre2_string_utils.lo \
+	src/libpcre2_8_la-pcre2_study.lo \
+	src/libpcre2_8_la-pcre2_substitute.lo \
+	src/libpcre2_8_la-pcre2_substring.lo \
+	src/libpcre2_8_la-pcre2_tables.lo \
+	src/libpcre2_8_la-pcre2_ucd.lo \
+	src/libpcre2_8_la-pcre2_valid_utf.lo \
+	src/libpcre2_8_la-pcre2_xclass.lo
+@WITH_PCRE2_8_TRUE@am_libpcre2_8_la_OBJECTS = $(am__objects_5)
+am__objects_6 = src/libpcre2_8_la-pcre2_chartables.lo
+@WITH_PCRE2_8_TRUE@nodist_libpcre2_8_la_OBJECTS = $(am__objects_6)
+libpcre2_8_la_OBJECTS = $(am_libpcre2_8_la_OBJECTS) \
+	$(nodist_libpcre2_8_la_OBJECTS)
+libpcre2_8_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(libpcre2_8_la_CFLAGS) \
+	$(CFLAGS) $(libpcre2_8_la_LDFLAGS) $(LDFLAGS) -o $@
+@WITH_PCRE2_8_TRUE@am_libpcre2_8_la_rpath = -rpath $(libdir)
+@WITH_PCRE2_8_TRUE@libpcre2_posix_la_DEPENDENCIES = libpcre2-8.la
+am__libpcre2_posix_la_SOURCES_DIST = src/pcre2posix.c
+@WITH_PCRE2_8_TRUE@am_libpcre2_posix_la_OBJECTS =  \
+@WITH_PCRE2_8_TRUE@	src/libpcre2_posix_la-pcre2posix.lo
+libpcre2_posix_la_OBJECTS = $(am_libpcre2_posix_la_OBJECTS)
+libpcre2_posix_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+	$(libpcre2_posix_la_CFLAGS) $(CFLAGS) \
+	$(libpcre2_posix_la_LDFLAGS) $(LDFLAGS) -o $@
+@WITH_PCRE2_8_TRUE@am_libpcre2_posix_la_rpath = -rpath $(libdir)
+@WITH_PCRE2_8_TRUE@am__EXEEXT_1 = pcre2grep$(EXEEXT)
+@WITH_REBUILD_CHARTABLES_TRUE@am__EXEEXT_2 = dftables$(EXEEXT)
+@WITH_JIT_TRUE@am__EXEEXT_3 = pcre2_jit_test$(EXEEXT)
+PROGRAMS = $(bin_PROGRAMS) $(noinst_PROGRAMS)
+am__dftables_SOURCES_DIST = src/dftables.c
+@WITH_REBUILD_CHARTABLES_TRUE@am_dftables_OBJECTS =  \
+@WITH_REBUILD_CHARTABLES_TRUE@	src/dftables.$(OBJEXT)
+dftables_OBJECTS = $(am_dftables_OBJECTS)
+dftables_LDADD = $(LDADD)
+am__pcre2_jit_test_SOURCES_DIST = src/pcre2_jit_test.c
+@WITH_JIT_TRUE@am_pcre2_jit_test_OBJECTS =  \
+@WITH_JIT_TRUE@	src/pcre2_jit_test-pcre2_jit_test.$(OBJEXT)
+pcre2_jit_test_OBJECTS = $(am_pcre2_jit_test_OBJECTS)
+am__DEPENDENCIES_1 =
+@WITH_GCOV_TRUE@@WITH_JIT_TRUE@am__DEPENDENCIES_2 =  \
+@WITH_GCOV_TRUE@@WITH_JIT_TRUE@	$(am__DEPENDENCIES_1)
+@WITH_JIT_TRUE@pcre2_jit_test_DEPENDENCIES = $(am__append_18) \
+@WITH_JIT_TRUE@	$(am__append_19) $(am__append_20) \
+@WITH_JIT_TRUE@	$(am__DEPENDENCIES_2)
+pcre2_jit_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+	$(pcre2_jit_test_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o \
+	$@
+am__pcre2grep_SOURCES_DIST = src/pcre2grep.c
+@WITH_PCRE2_8_TRUE@am_pcre2grep_OBJECTS =  \
+@WITH_PCRE2_8_TRUE@	src/pcre2grep-pcre2grep.$(OBJEXT)
+pcre2grep_OBJECTS = $(am_pcre2grep_OBJECTS)
+@WITH_GCOV_TRUE@@WITH_PCRE2_8_TRUE@am__DEPENDENCIES_3 =  \
+@WITH_GCOV_TRUE@@WITH_PCRE2_8_TRUE@	$(am__DEPENDENCIES_1)
+@WITH_PCRE2_8_TRUE@pcre2grep_DEPENDENCIES = $(am__DEPENDENCIES_1) \
+@WITH_PCRE2_8_TRUE@	$(am__DEPENDENCIES_1) libpcre2-8.la \
+@WITH_PCRE2_8_TRUE@	$(am__DEPENDENCIES_3)
+pcre2grep_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(pcre2grep_CFLAGS) \
+	$(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+am_pcre2test_OBJECTS = src/pcre2test-pcre2test.$(OBJEXT)
+pcre2test_OBJECTS = $(am_pcre2test_OBJECTS)
+@WITH_GCOV_TRUE@am__DEPENDENCIES_4 = $(am__DEPENDENCIES_1)
+pcre2test_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__append_23) \
+	$(am__append_24) $(am__append_25) $(am__DEPENDENCIES_4)
+pcre2test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(pcre2test_CFLAGS) \
+	$(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+am__dist_noinst_SCRIPTS_DIST = RunTest RunGrepTest
+SCRIPTS = $(bin_SCRIPTS) $(dist_noinst_SCRIPTS)
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/src
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo "  CC      " $@;
+am__v_CC_1 = 
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo "  CCLD    " $@;
+am__v_CCLD_1 = 
+SOURCES = $(libpcre2_16_la_SOURCES) $(nodist_libpcre2_16_la_SOURCES) \
+	$(libpcre2_32_la_SOURCES) $(nodist_libpcre2_32_la_SOURCES) \
+	$(libpcre2_8_la_SOURCES) $(nodist_libpcre2_8_la_SOURCES) \
+	$(libpcre2_posix_la_SOURCES) $(dftables_SOURCES) \
+	$(pcre2_jit_test_SOURCES) $(pcre2grep_SOURCES) \
+	$(pcre2test_SOURCES)
+DIST_SOURCES = $(am__libpcre2_16_la_SOURCES_DIST) \
+	$(am__libpcre2_32_la_SOURCES_DIST) \
+	$(am__libpcre2_8_la_SOURCES_DIST) \
+	$(am__libpcre2_posix_la_SOURCES_DIST) \
+	$(am__dftables_SOURCES_DIST) \
+	$(am__pcre2_jit_test_SOURCES_DIST) \
+	$(am__pcre2grep_SOURCES_DIST) $(pcre2test_SOURCES)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+man1dir = $(mandir)/man1
+man3dir = $(mandir)/man3
+NROFF = nroff
+MANS = $(dist_man_MANS)
+DATA = $(dist_doc_DATA) $(dist_html_DATA) $(pkgconfig_DATA)
+HEADERS = $(include_HEADERS) $(nodist_include_HEADERS)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+CSCOPE = cscope
+AM_RECURSIVE_TARGETS = cscope check recheck
+am__tty_colors_dummy = \
+  mgn= red= grn= lgn= blu= brg= std=; \
+  am__color_tests=no
+am__tty_colors = { \
+  $(am__tty_colors_dummy); \
+  if test "X$(AM_COLOR_TESTS)" = Xno; then \
+    am__color_tests=no; \
+  elif test "X$(AM_COLOR_TESTS)" = Xalways; then \
+    am__color_tests=yes; \
+  elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \
+    am__color_tests=yes; \
+  fi; \
+  if test $$am__color_tests = yes; then \
+    red=''; \
+    grn=''; \
+    lgn=''; \
+    blu=''; \
+    mgn=''; \
+    brg=''; \
+    std=''; \
+  fi; \
+}
+am__recheck_rx = ^[ 	]*:recheck:[ 	]*
+am__global_test_result_rx = ^[ 	]*:global-test-result:[ 	]*
+am__copy_in_global_log_rx = ^[ 	]*:copy-in-global-log:[ 	]*
+# A command that, given a newline-separated list of test names on the
+# standard input, print the name of the tests that are to be re-run
+# upon "make recheck".
+am__list_recheck_tests = $(AWK) '{ \
+  recheck = 1; \
+  while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+    { \
+      if (rc < 0) \
+        { \
+          if ((getline line2 < ($$0 ".log")) < 0) \
+	    recheck = 0; \
+          break; \
+        } \
+      else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
+        { \
+          recheck = 0; \
+          break; \
+        } \
+      else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
+        { \
+          break; \
+        } \
+    }; \
+  if (recheck) \
+    print $$0; \
+  close ($$0 ".trs"); \
+  close ($$0 ".log"); \
+}'
+# A command that, given a newline-separated list of test names on the
+# standard input, create the global log from their .trs and .log files.
+am__create_global_log = $(AWK) ' \
+function fatal(msg) \
+{ \
+  print "fatal: making $@: " msg | "cat >&2"; \
+  exit 1; \
+} \
+function rst_section(header) \
+{ \
+  print header; \
+  len = length(header); \
+  for (i = 1; i <= len; i = i + 1) \
+    printf "="; \
+  printf "\n\n"; \
+} \
+{ \
+  copy_in_global_log = 1; \
+  global_test_result = "RUN"; \
+  while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+    { \
+      if (rc < 0) \
+         fatal("failed to read from " $$0 ".trs"); \
+      if (line ~ /$(am__global_test_result_rx)/) \
+        { \
+          sub("$(am__global_test_result_rx)", "", line); \
+          sub("[ 	]*$$", "", line); \
+          global_test_result = line; \
+        } \
+      else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
+        copy_in_global_log = 0; \
+    }; \
+  if (copy_in_global_log) \
+    { \
+      rst_section(global_test_result ": " $$0); \
+      while ((rc = (getline line < ($$0 ".log"))) != 0) \
+      { \
+        if (rc < 0) \
+          fatal("failed to read from " $$0 ".log"); \
+        print line; \
+      }; \
+      printf "\n"; \
+    }; \
+  close ($$0 ".trs"); \
+  close ($$0 ".log"); \
+}'
+# Restructured Text title.
+am__rst_title = { sed 's/.*/   &   /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
+# Solaris 10 'make', and several other traditional 'make' implementations,
+# pass "-e" to $(SHELL), and POSIX 2008 even requires this.  Work around it
+# by disabling -e (using the XSI extension "set +e") if it's set.
+am__sh_e_setup = case $$- in *e*) set +e;; esac
+# Default flags passed to test drivers.
+am__common_driver_flags = \
+  --color-tests "$$am__color_tests" \
+  --enable-hard-errors "$$am__enable_hard_errors" \
+  --expect-failure "$$am__expect_failure"
+# To be inserted before the command running the test.  Creates the
+# directory for the log if needed.  Stores in $dir the directory
+# containing $f, in $tst the test, in $log the log.  Executes the
+# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
+# passes TESTS_ENVIRONMENT.  Set up options for the wrapper that
+# will run the test scripts (or their associated LOG_COMPILER, if
+# thy have one).
+am__check_pre = \
+$(am__sh_e_setup);					\
+$(am__vpath_adj_setup) $(am__vpath_adj)			\
+$(am__tty_colors);					\
+srcdir=$(srcdir); export srcdir;			\
+case "$@" in						\
+  */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;;	\
+    *) am__odir=.;; 					\
+esac;							\
+test "x$$am__odir" = x"." || test -d "$$am__odir" 	\
+  || $(MKDIR_P) "$$am__odir" || exit $$?;		\
+if test -f "./$$f"; then dir=./;			\
+elif test -f "$$f"; then dir=;				\
+else dir="$(srcdir)/"; fi;				\
+tst=$$dir$$f; log='$@'; 				\
+if test -n '$(DISABLE_HARD_ERRORS)'; then		\
+  am__enable_hard_errors=no; 				\
+else							\
+  am__enable_hard_errors=yes; 				\
+fi; 							\
+case " $(XFAIL_TESTS) " in				\
+  *[\ \	]$$f[\ \	]* | *[\ \	]$$dir$$f[\ \	]*) \
+    am__expect_failure=yes;;				\
+  *)							\
+    am__expect_failure=no;;				\
+esac; 							\
+$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
+# A shell command to get the names of the tests scripts with any registered
+# extension removed (i.e., equivalently, the names of the test logs, with
+# the '.log' extension removed).  The result is saved in the shell variable
+# '$bases'.  This honors runtime overriding of TESTS and TEST_LOGS.  Sadly,
+# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
+# since that might cause problem with VPATH rewrites for suffix-less tests.
+# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
+am__set_TESTS_bases = \
+  bases='$(TEST_LOGS)'; \
+  bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
+  bases=`echo $$bases`
+RECHECK_LOGS = $(TEST_LOGS)
+TEST_SUITE_LOG = test-suite.log
+TEST_EXTENSIONS = @EXEEXT@ .test
+LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
+LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS)
+am__set_b = \
+  case '$@' in \
+    */*) \
+      case '$*' in \
+        */*) b='$*';; \
+          *) b=`echo '$@' | sed 's/\.log$$//'`; \
+       esac;; \
+    *) \
+      b='$*';; \
+  esac
+am__test_logs1 = $(TESTS:=.log)
+am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log)
+TEST_LOGS = $(am__test_logs2:.test.log=.log)
+TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
+TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \
+	$(TEST_LOG_FLAGS)
+am__DIST_COMMON = $(dist_man_MANS) $(srcdir)/Makefile.in \
+	$(srcdir)/libpcre2-16.pc.in $(srcdir)/libpcre2-32.pc.in \
+	$(srcdir)/libpcre2-8.pc.in $(srcdir)/libpcre2-posix.pc.in \
+	$(srcdir)/pcre2-config.in $(top_srcdir)/src/config.h.in \
+	$(top_srcdir)/src/pcre2.h.in AUTHORS COPYING ChangeLog INSTALL \
+	NEWS README ar-lib compile config.guess config.sub depcomp \
+	install-sh ltmain.sh missing test-driver
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+distdir = $(PACKAGE)-$(VERSION)
+top_distdir = $(distdir)
+am__remove_distdir = \
+  if test -d "$(distdir)"; then \
+    find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \
+      && rm -rf "$(distdir)" \
+      || { sleep 5 && rm -rf "$(distdir)"; }; \
+  else :; fi
+am__post_remove_distdir = $(am__remove_distdir)
+DIST_ARCHIVES = $(distdir).tar.gz $(distdir).tar.bz2 $(distdir).zip
+GZIP_ENV = --best
+DIST_TARGETS = dist-bzip2 dist-gzip dist-zip
+distuninstallcheck_listfiles = find . -type f -print
+am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \
+  | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$'
+distcleancheck_listfiles = find . -type f -print
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+EXTRA_LIBPCRE2_16_LDFLAGS = @EXTRA_LIBPCRE2_16_LDFLAGS@
+EXTRA_LIBPCRE2_32_LDFLAGS = @EXTRA_LIBPCRE2_32_LDFLAGS@
+EXTRA_LIBPCRE2_8_LDFLAGS = @EXTRA_LIBPCRE2_8_LDFLAGS@
+EXTRA_LIBPCRE2_POSIX_LDFLAGS = @EXTRA_LIBPCRE2_POSIX_LDFLAGS@
+FGREP = @FGREP@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_CXXFLAGS = @GCOV_CXXFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GENHTML = @GENHTML@
+GREP = @GREP@
+HAVE_VISIBILITY = @HAVE_VISIBILITY@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LCOV = @LCOV@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBBZ2 = @LIBBZ2@
+LIBOBJS = @LIBOBJS@
+LIBREADLINE = @LIBREADLINE@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBZ = @LIBZ@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PCRE2_DATE = @PCRE2_DATE@
+PCRE2_MAJOR = @PCRE2_MAJOR@
+PCRE2_MINOR = @PCRE2_MINOR@
+PCRE2_PRERELEASE = @PCRE2_PRERELEASE@
+PCRE2_STATIC_CFLAG = @PCRE2_STATIC_CFLAG@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_LIBS = @PTHREAD_LIBS@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHTOOL = @SHTOOL@
+STRIP = @STRIP@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VERSION = @VERSION@
+VISIBILITY_CFLAGS = @VISIBILITY_CFLAGS@
+VISIBILITY_CXXFLAGS = @VISIBILITY_CXXFLAGS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+ax_pthread_config = @ax_pthread_config@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+enable_pcre2_16 = @enable_pcre2_16@
+enable_pcre2_32 = @enable_pcre2_32@
+enable_pcre2_8 = @enable_pcre2_8@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+AUTOMAKE_OPTIONS = subdir-objects
+ACLOCAL_AMFLAGS = -I m4
+AM_CPPFLAGS = -I$(builddir)/src -I$(srcdir)/src
+dist_doc_DATA = \
+  AUTHORS \
+  COPYING \
+  ChangeLog \
+  LICENCE \
+  NEWS \
+  README \
+  doc/pcre2.txt \
+  doc/pcre2-config.txt \
+  doc/pcre2grep.txt \
+  doc/pcre2test.txt
+
+dist_html_DATA = \
+  doc/html/NON-AUTOTOOLS-BUILD.txt \
+  doc/html/README.txt \
+  doc/html/index.html \
+  doc/html/pcre2-config.html \
+  doc/html/pcre2.html \
+  doc/html/pcre2_callout_enumerate.html \
+  doc/html/pcre2_code_free.html \
+  doc/html/pcre2_compile.html \
+  doc/html/pcre2_compile_context_copy.html \
+  doc/html/pcre2_compile_context_create.html \
+  doc/html/pcre2_compile_context_free.html \
+  doc/html/pcre2_config.html \
+  doc/html/pcre2_dfa_match.html \
+  doc/html/pcre2_general_context_copy.html \
+  doc/html/pcre2_general_context_create.html \
+  doc/html/pcre2_general_context_free.html \
+  doc/html/pcre2_get_error_message.html \
+  doc/html/pcre2_get_mark.html \
+  doc/html/pcre2_get_ovector_count.html \
+  doc/html/pcre2_get_ovector_pointer.html \
+  doc/html/pcre2_get_startchar.html \
+  doc/html/pcre2_jit_compile.html \
+  doc/html/pcre2_jit_free_unused_memory.html \
+  doc/html/pcre2_jit_match.html \
+  doc/html/pcre2_jit_stack_assign.html \
+  doc/html/pcre2_jit_stack_create.html \
+  doc/html/pcre2_jit_stack_free.html \
+  doc/html/pcre2_maketables.html \
+  doc/html/pcre2_match.html \
+  doc/html/pcre2_match_context_copy.html \
+  doc/html/pcre2_match_context_create.html \
+  doc/html/pcre2_match_context_free.html \
+  doc/html/pcre2_match_data_create.html \
+  doc/html/pcre2_match_data_create_from_pattern.html \
+  doc/html/pcre2_match_data_free.html \
+  doc/html/pcre2_pattern_info.html \
+  doc/html/pcre2_serialize_decode.html \
+  doc/html/pcre2_serialize_encode.html \
+  doc/html/pcre2_serialize_free.html \
+  doc/html/pcre2_serialize_get_number_of_codes.html \
+  doc/html/pcre2_set_bsr.html \
+  doc/html/pcre2_set_callout.html \
+  doc/html/pcre2_set_character_tables.html \
+  doc/html/pcre2_set_compile_recursion_guard.html \
+  doc/html/pcre2_set_match_limit.html \
+  doc/html/pcre2_set_offset_limit.html \
+  doc/html/pcre2_set_newline.html \
+  doc/html/pcre2_set_parens_nest_limit.html \
+  doc/html/pcre2_set_recursion_limit.html \
+  doc/html/pcre2_set_recursion_memory_management.html \
+  doc/html/pcre2_substitute.html \
+  doc/html/pcre2_substring_copy_byname.html \
+  doc/html/pcre2_substring_copy_bynumber.html \
+  doc/html/pcre2_substring_free.html \
+  doc/html/pcre2_substring_get_byname.html \
+  doc/html/pcre2_substring_get_bynumber.html \
+  doc/html/pcre2_substring_length_byname.html \
+  doc/html/pcre2_substring_length_bynumber.html \
+  doc/html/pcre2_substring_list_free.html \
+  doc/html/pcre2_substring_list_get.html \
+  doc/html/pcre2_substring_nametable_scan.html \
+  doc/html/pcre2_substring_number_from_name.html \
+  doc/html/pcre2api.html \
+  doc/html/pcre2build.html \
+  doc/html/pcre2callout.html \
+  doc/html/pcre2compat.html \
+  doc/html/pcre2demo.html \
+  doc/html/pcre2grep.html \
+  doc/html/pcre2jit.html \
+  doc/html/pcre2limits.html \
+  doc/html/pcre2matching.html \
+  doc/html/pcre2partial.html \
+  doc/html/pcre2pattern.html \
+  doc/html/pcre2perform.html \
+  doc/html/pcre2posix.html \
+  doc/html/pcre2sample.html \
+  doc/html/pcre2serialize.html \
+  doc/html/pcre2stack.html \
+  doc/html/pcre2syntax.html \
+  doc/html/pcre2test.html \
+  doc/html/pcre2unicode.html
+
+dist_man_MANS = \
+  doc/pcre2-config.1 \
+  doc/pcre2.3 \
+  doc/pcre2_callout_enumerate.3 \
+  doc/pcre2_code_free.3 \
+  doc/pcre2_compile.3 \
+  doc/pcre2_compile_context_copy.3 \
+  doc/pcre2_compile_context_create.3 \
+  doc/pcre2_compile_context_free.3 \
+  doc/pcre2_config.3 \
+  doc/pcre2_dfa_match.3 \
+  doc/pcre2_general_context_copy.3 \
+  doc/pcre2_general_context_create.3 \
+  doc/pcre2_general_context_free.3 \
+  doc/pcre2_get_error_message.3 \
+  doc/pcre2_get_mark.3 \
+  doc/pcre2_get_ovector_count.3 \
+  doc/pcre2_get_ovector_pointer.3 \
+  doc/pcre2_get_startchar.3 \
+  doc/pcre2_jit_compile.3 \
+  doc/pcre2_jit_free_unused_memory.3 \
+  doc/pcre2_jit_match.3 \
+  doc/pcre2_jit_stack_assign.3 \
+  doc/pcre2_jit_stack_create.3 \
+  doc/pcre2_jit_stack_free.3 \
+  doc/pcre2_maketables.3 \
+  doc/pcre2_match.3 \
+  doc/pcre2_match_context_copy.3 \
+  doc/pcre2_match_context_create.3 \
+  doc/pcre2_match_context_free.3 \
+  doc/pcre2_match_data_create.3 \
+  doc/pcre2_match_data_create_from_pattern.3 \
+  doc/pcre2_match_data_free.3 \
+  doc/pcre2_pattern_info.3 \
+  doc/pcre2_serialize_decode.3 \
+  doc/pcre2_serialize_encode.3 \
+  doc/pcre2_serialize_free.3 \
+  doc/pcre2_serialize_get_number_of_codes.3 \
+  doc/pcre2_set_bsr.3 \
+  doc/pcre2_set_callout.3 \
+  doc/pcre2_set_character_tables.3 \
+  doc/pcre2_set_compile_recursion_guard.3 \
+  doc/pcre2_set_match_limit.3 \
+  doc/pcre2_set_offset_limit.3 \
+  doc/pcre2_set_newline.3 \
+  doc/pcre2_set_parens_nest_limit.3 \
+  doc/pcre2_set_recursion_limit.3 \
+  doc/pcre2_set_recursion_memory_management.3 \
+  doc/pcre2_substitute.3 \
+  doc/pcre2_substring_copy_byname.3 \
+  doc/pcre2_substring_copy_bynumber.3 \
+  doc/pcre2_substring_free.3 \
+  doc/pcre2_substring_get_byname.3 \
+  doc/pcre2_substring_get_bynumber.3 \
+  doc/pcre2_substring_length_byname.3 \
+  doc/pcre2_substring_length_bynumber.3 \
+  doc/pcre2_substring_list_free.3 \
+  doc/pcre2_substring_list_get.3 \
+  doc/pcre2_substring_nametable_scan.3 \
+  doc/pcre2_substring_number_from_name.3 \
+  doc/pcre2api.3 \
+  doc/pcre2build.3 \
+  doc/pcre2callout.3 \
+  doc/pcre2compat.3 \
+  doc/pcre2demo.3 \
+  doc/pcre2grep.1 \
+  doc/pcre2jit.3 \
+  doc/pcre2limits.3 \
+  doc/pcre2matching.3 \
+  doc/pcre2partial.3 \
+  doc/pcre2pattern.3 \
+  doc/pcre2perform.3 \
+  doc/pcre2posix.3 \
+  doc/pcre2sample.3 \
+  doc/pcre2serialize.3 \
+  doc/pcre2stack.3 \
+  doc/pcre2syntax.3 \
+  doc/pcre2test.1 \
+  doc/pcre2unicode.3
+
+
+# The Libtool libraries to install.  We'll add to this later.
+lib_LTLIBRARIES = $(am__append_2) $(am__append_3) $(am__append_4) \
+	$(am__append_11)
+check_SCRIPTS = 
+dist_noinst_SCRIPTS = RunTest $(am__append_30)
+
+# Additional files to delete on 'make clean', 'make distclean',
+# and 'make maintainer-clean'.
+
+# RunTest and RunGrepTest should clean up after themselves, but just in case
+# they don't, add their working files to CLEANFILES.
+CLEANFILES = src/pcre2_chartables.c testSinput test3input test3output \
+	test3outputA test3outputB testtry teststdout teststderr \
+	teststderrgrep testtemp1grep testtemp2grep testtrygrep \
+	testNinputgrep
+DISTCLEANFILES = src/config.h.in~ config.h $(am__append_34)
+MAINTAINERCLEANFILES = src/pcre2.h.generic src/config.h.generic
+
+# Additional files to bundle with the distribution, over and above what
+# the Autotools include by default.
+
+# These files contain additional m4 macros that are used by autoconf.
+
+# These files contain maintenance information
+
+# These files are used in the preparation of a release
+
+# These files are usable versions of pcre2.h and config.h that are distributed
+# for the benefit of people who are building PCRE2 manually, without the
+# Autotools support.
+
+# The pcre2_chartables.c.dist file is the default version of
+# pcre2_chartables.c, used unless --enable-rebuild-chartables is specified.
+
+# The JIT compiler lives in a separate directory, but its files are #included
+# when pcre2_jit_compile.c is processed, so they must be distributed.
+
+# Some of the JIT sources are also in separate files that are #included.
+
+# PCRE2 demonstration program. Not built automatcally. The point is that the
+# users should build it themselves. So just distribute the source.
+EXTRA_DIST = m4/ax_pthread.m4 m4/pcre2_visibility.m4 \
+	NON-AUTOTOOLS-BUILD HACKING PrepareRelease CheckMan CleanTxt \
+	Detrail 132html doc/index.html.src src/pcre2.h.generic \
+	src/config.h.generic src/pcre2_chartables.c.dist \
+	src/sljit/sljitConfig.h src/sljit/sljitConfigInternal.h \
+	src/sljit/sljitExecAllocator.c src/sljit/sljitLir.c \
+	src/sljit/sljitLir.h src/sljit/sljitNativeARM_32.c \
+	src/sljit/sljitNativeARM_64.c src/sljit/sljitNativeARM_T2_32.c \
+	src/sljit/sljitNativeMIPS_32.c src/sljit/sljitNativeMIPS_64.c \
+	src/sljit/sljitNativeMIPS_common.c \
+	src/sljit/sljitNativePPC_32.c src/sljit/sljitNativePPC_64.c \
+	src/sljit/sljitNativePPC_common.c \
+	src/sljit/sljitNativeSPARC_32.c \
+	src/sljit/sljitNativeSPARC_common.c \
+	src/sljit/sljitNativeTILEGX-encoder.c \
+	src/sljit/sljitNativeTILEGX_64.c src/sljit/sljitNativeX86_32.c \
+	src/sljit/sljitNativeX86_64.c \
+	src/sljit/sljitNativeX86_common.c src/sljit/sljitUtils.c \
+	src/pcre2_jit_match.c src/pcre2_jit_misc.c \
+	src/pcre2_printint.c RunTest.bat testdata/grepbinary \
+	testdata/grepfilelist testdata/grepinput testdata/grepinput3 \
+	testdata/grepinput8 testdata/grepinputv testdata/grepinputx \
+	testdata/greplist testdata/grepoutput testdata/grepoutput8 \
+	testdata/grepoutputN testdata/greppatN4 testdata/testinput1 \
+	testdata/testinput2 testdata/testinput3 testdata/testinput4 \
+	testdata/testinput5 testdata/testinput6 testdata/testinput7 \
+	testdata/testinput8 testdata/testinput9 testdata/testinput10 \
+	testdata/testinput11 testdata/testinput12 testdata/testinput13 \
+	testdata/testinput14 testdata/testinput15 testdata/testinput16 \
+	testdata/testinput17 testdata/testinput18 testdata/testinput19 \
+	testdata/testinput20 testdata/testinput21 testdata/testinput22 \
+	testdata/testinput23 testdata/testinputEBC \
+	testdata/testoutput1 testdata/testoutput2 testdata/testoutput3 \
+	testdata/testoutput3A testdata/testoutput3B \
+	testdata/testoutput4 testdata/testoutput5 testdata/testoutput6 \
+	testdata/testoutput7 testdata/testoutput8-16-2 \
+	testdata/testoutput8-16-3 testdata/testoutput8-16-3 \
+	testdata/testoutput8-32-2 testdata/testoutput8-32-3 \
+	testdata/testoutput8-32-4 testdata/testoutput8-8-2 \
+	testdata/testoutput8-8-3 testdata/testoutput8-8-4 \
+	testdata/testoutput9 testdata/testoutput10 \
+	testdata/testoutput11-16 testdata/testoutput11-32 \
+	testdata/testoutput12-16 testdata/testoutput12-32 \
+	testdata/testoutput13 testdata/testoutput14-16 \
+	testdata/testoutput14-32 testdata/testoutput14-8 \
+	testdata/testoutput15 testdata/testoutput16 \
+	testdata/testoutput17 testdata/testoutput18 \
+	testdata/testoutput19 testdata/testoutput20 \
+	testdata/testoutput21 testdata/testoutput22-16 \
+	testdata/testoutput22-32 testdata/testoutput22-8 \
+	testdata/testoutput23 testdata/testoutputEBC \
+	testdata/valgrind-jit.supp testdata/wintestinput3 \
+	testdata/wintestoutput3 perltest.sh src/pcre2demo.c \
+	cmake/COPYING-CMAKE-SCRIPTS \
+	cmake/FindPackageHandleStandardArgs.cmake \
+	cmake/FindReadline.cmake cmake/FindEditline.cmake \
+	CMakeLists.txt config-cmake.h.in
+
+# These are the header files we'll install. We do not distribute pcre2.h
+# because it is generated from pcre2.h.in.
+nodist_include_HEADERS = src/pcre2.h
+include_HEADERS = src/pcre2posix.h
+
+# This is the "config" script.
+bin_SCRIPTS = pcre2-config
+@WITH_REBUILD_CHARTABLES_TRUE@dftables_SOURCES = src/dftables.c
+BUILT_SOURCES = src/pcre2_chartables.c
+NODIST_SOURCES = src/pcre2_chartables.c
+COMMON_SOURCES = \
+  src/pcre2_auto_possess.c \
+  src/pcre2_compile.c \
+  src/pcre2_config.c \
+  src/pcre2_context.c \
+  src/pcre2_dfa_match.c \
+  src/pcre2_error.c \
+  src/pcre2_find_bracket.c \
+  src/pcre2_internal.h \
+  src/pcre2_intmodedep.h \
+  src/pcre2_jit_compile.c \
+  src/pcre2_maketables.c \
+  src/pcre2_match.c \
+  src/pcre2_match_data.c \
+  src/pcre2_newline.c \
+  src/pcre2_ord2utf.c \
+  src/pcre2_pattern_info.c \
+  src/pcre2_serialize.c \
+  src/pcre2_string_utils.c \
+  src/pcre2_study.c \
+  src/pcre2_substitute.c \
+  src/pcre2_substring.c \
+  src/pcre2_tables.c \
+  src/pcre2_ucd.c \
+  src/pcre2_ucp.h \
+  src/pcre2_valid_utf.c \
+  src/pcre2_xclass.c
+
+@WITH_PCRE2_8_TRUE@libpcre2_8_la_SOURCES = \
+@WITH_PCRE2_8_TRUE@  $(COMMON_SOURCES)
+
+@WITH_PCRE2_8_TRUE@nodist_libpcre2_8_la_SOURCES = \
+@WITH_PCRE2_8_TRUE@  $(NODIST_SOURCES)
+
+@WITH_PCRE2_8_TRUE@libpcre2_8_la_CFLAGS = -DPCRE2_CODE_UNIT_WIDTH=8 \
+@WITH_PCRE2_8_TRUE@	$(VISIBILITY_CFLAGS) $(AM_CFLAGS) \
+@WITH_PCRE2_8_TRUE@	$(am__append_5) $(am__append_8)
+@WITH_PCRE2_8_TRUE@libpcre2_8_la_LIBADD = 
+@WITH_PCRE2_16_TRUE@libpcre2_16_la_SOURCES = \
+@WITH_PCRE2_16_TRUE@  $(COMMON_SOURCES)
+
+@WITH_PCRE2_16_TRUE@nodist_libpcre2_16_la_SOURCES = \
+@WITH_PCRE2_16_TRUE@  $(NODIST_SOURCES)
+
+@WITH_PCRE2_16_TRUE@libpcre2_16_la_CFLAGS =  \
+@WITH_PCRE2_16_TRUE@	-DPCRE2_CODE_UNIT_WIDTH=16 \
+@WITH_PCRE2_16_TRUE@	$(VISIBILITY_CFLAGS) $(AM_CFLAGS) \
+@WITH_PCRE2_16_TRUE@	$(am__append_6) $(am__append_9)
+@WITH_PCRE2_16_TRUE@libpcre2_16_la_LIBADD = 
+@WITH_PCRE2_32_TRUE@libpcre2_32_la_SOURCES = \
+@WITH_PCRE2_32_TRUE@  $(COMMON_SOURCES)
+
+@WITH_PCRE2_32_TRUE@nodist_libpcre2_32_la_SOURCES = \
+@WITH_PCRE2_32_TRUE@  $(NODIST_SOURCES)
+
+@WITH_PCRE2_32_TRUE@libpcre2_32_la_CFLAGS =  \
+@WITH_PCRE2_32_TRUE@	-DPCRE2_CODE_UNIT_WIDTH=32 \
+@WITH_PCRE2_32_TRUE@	$(VISIBILITY_CFLAGS) $(AM_CFLAGS) \
+@WITH_PCRE2_32_TRUE@	$(am__append_7) $(am__append_10)
+@WITH_PCRE2_32_TRUE@libpcre2_32_la_LIBADD = 
+@WITH_PCRE2_8_TRUE@libpcre2_8_la_LDFLAGS = $(EXTRA_LIBPCRE2_8_LDFLAGS)
+@WITH_PCRE2_16_TRUE@libpcre2_16_la_LDFLAGS = $(EXTRA_LIBPCRE2_16_LDFLAGS)
+@WITH_PCRE2_32_TRUE@libpcre2_32_la_LDFLAGS = $(EXTRA_LIBPCRE2_32_LDFLAGS)
+@WITH_PCRE2_8_TRUE@libpcre2_posix_la_SOURCES = src/pcre2posix.c
+@WITH_PCRE2_8_TRUE@libpcre2_posix_la_CFLAGS =  \
+@WITH_PCRE2_8_TRUE@	-DPCRE2_CODE_UNIT_WIDTH=8 \
+@WITH_PCRE2_8_TRUE@	$(VISIBILITY_CFLAGS) $(AM_CFLAGS) \
+@WITH_PCRE2_8_TRUE@	$(am__append_12)
+@WITH_PCRE2_8_TRUE@libpcre2_posix_la_LDFLAGS = $(EXTRA_LIBPCRE2_POSIX_LDFLAGS)
+@WITH_PCRE2_8_TRUE@libpcre2_posix_la_LIBADD = libpcre2-8.la
+@WITH_PCRE2_8_TRUE@pcre2grep_SOURCES = src/pcre2grep.c
+@WITH_PCRE2_8_TRUE@pcre2grep_CFLAGS = $(AM_CFLAGS) $(am__append_14)
+@WITH_PCRE2_8_TRUE@pcre2grep_LDADD = $(LIBZ) $(LIBBZ2) libpcre2-8.la \
+@WITH_PCRE2_8_TRUE@	$(am__append_15)
+@WITH_JIT_TRUE@pcre2_jit_test_SOURCES = src/pcre2_jit_test.c
+@WITH_JIT_TRUE@pcre2_jit_test_CFLAGS = $(AM_CFLAGS) $(am__append_21)
+@WITH_JIT_TRUE@pcre2_jit_test_LDADD = $(am__append_18) \
+@WITH_JIT_TRUE@	$(am__append_19) $(am__append_20) \
+@WITH_JIT_TRUE@	$(am__append_22)
+pcre2test_SOURCES = src/pcre2test.c
+pcre2test_CFLAGS = $(AM_CFLAGS) $(am__append_26) $(am__append_27)
+pcre2test_LDADD = $(LIBREADLINE) $(am__append_23) $(am__append_24) \
+	$(am__append_25) $(am__append_28)
+
+# We have .pc files for pkg-config users.
+pkgconfigdir = $(libdir)/pkgconfig
+pkgconfig_DATA = $(am__append_31) $(am__append_32) $(am__append_33)
+
+# gcov/lcov code coverage reporting
+#
+# Coverage reporting targets:
+#
+# coverage: Create a coverage report from 'make check'
+# coverage-baseline: Capture baseline coverage information
+# coverage-reset: This zeros the coverage counters only
+# coverage-report: This creates the coverage report only
+# coverage-clean-report: This removes the generated coverage report
+#   without cleaning the coverage data itself
+# coverage-clean-data: This removes the captured coverage data without
+#   removing the coverage files created at compile time (*.gcno)
+# coverage-clean: This cleans all coverage data including the generated
+#   coverage report.
+@WITH_GCOV_TRUE@COVERAGE_TEST_NAME = $(PACKAGE)
+@WITH_GCOV_TRUE@COVERAGE_NAME = $(PACKAGE)-$(VERSION)
+@WITH_GCOV_TRUE@COVERAGE_OUTPUT_FILE = $(COVERAGE_NAME)-coverage.info
+@WITH_GCOV_TRUE@COVERAGE_OUTPUT_DIR = $(COVERAGE_NAME)-coverage
+@WITH_GCOV_TRUE@COVERAGE_LCOV_EXTRA_FLAGS = 
+@WITH_GCOV_TRUE@COVERAGE_GENHTML_EXTRA_FLAGS = 
+@WITH_GCOV_TRUE@coverage_quiet = $(coverage_quiet_$(V))
+@WITH_GCOV_TRUE@coverage_quiet_ = $(coverage_quiet_$(AM_DEFAULT_VERBOSITY))
+@WITH_GCOV_TRUE@coverage_quiet_0 = --quiet
+all: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs
+am--refresh: Makefile
+	@:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \
+	      $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    echo ' $(SHELL) ./config.status'; \
+	    $(SHELL) ./config.status;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	$(SHELL) ./config.status --recheck
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	$(am__cd) $(srcdir) && $(AUTOCONF)
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	$(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
+$(am__aclocal_m4_deps):
+
+src/config.h: src/stamp-h1
+	@test -f $@ || rm -f src/stamp-h1
+	@test -f $@ || $(MAKE) $(AM_MAKEFLAGS) src/stamp-h1
+
+src/stamp-h1: $(top_srcdir)/src/config.h.in $(top_builddir)/config.status
+	@rm -f src/stamp-h1
+	cd $(top_builddir) && $(SHELL) ./config.status src/config.h
+$(top_srcdir)/src/config.h.in:  $(am__configure_deps) 
+	($(am__cd) $(top_srcdir) && $(AUTOHEADER))
+	rm -f src/stamp-h1
+	touch $@
+
+distclean-hdr:
+	-rm -f src/config.h src/stamp-h1
+libpcre2-8.pc: $(top_builddir)/config.status $(srcdir)/libpcre2-8.pc.in
+	cd $(top_builddir) && $(SHELL) ./config.status $@
+libpcre2-16.pc: $(top_builddir)/config.status $(srcdir)/libpcre2-16.pc.in
+	cd $(top_builddir) && $(SHELL) ./config.status $@
+libpcre2-32.pc: $(top_builddir)/config.status $(srcdir)/libpcre2-32.pc.in
+	cd $(top_builddir) && $(SHELL) ./config.status $@
+libpcre2-posix.pc: $(top_builddir)/config.status $(srcdir)/libpcre2-posix.pc.in
+	cd $(top_builddir) && $(SHELL) ./config.status $@
+pcre2-config: $(top_builddir)/config.status $(srcdir)/pcre2-config.in
+	cd $(top_builddir) && $(SHELL) ./config.status $@
+src/pcre2.h: $(top_builddir)/config.status $(top_srcdir)/src/pcre2.h.in
+	cd $(top_builddir) && $(SHELL) ./config.status $@
+
+install-libLTLIBRARIES: $(lib_LTLIBRARIES)
+	@$(NORMAL_INSTALL)
+	@list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
+	list2=; for p in $$list; do \
+	  if test -f $$p; then \
+	    list2="$$list2 $$p"; \
+	  else :; fi; \
+	done; \
+	test -z "$$list2" || { \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \
+	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \
+	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
+	}
+
+uninstall-libLTLIBRARIES:
+	@$(NORMAL_UNINSTALL)
+	@list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
+	for p in $$list; do \
+	  $(am__strip_dir) \
+	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
+	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
+	done
+
+clean-libLTLIBRARIES:
+	-test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
+	@list='$(lib_LTLIBRARIES)'; \
+	locs=`for p in $$list; do echo $$p; done | \
+	      sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
+	      sort -u`; \
+	test -z "$$locs" || { \
+	  echo rm -f $${locs}; \
+	  rm -f $${locs}; \
+	}
+src/$(am__dirstamp):
+	@$(MKDIR_P) src
+	@: > src/$(am__dirstamp)
+src/$(DEPDIR)/$(am__dirstamp):
+	@$(MKDIR_P) src/$(DEPDIR)
+	@: > src/$(DEPDIR)/$(am__dirstamp)
+src/libpcre2_16_la-pcre2_auto_possess.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+src/libpcre2_16_la-pcre2_compile.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+src/libpcre2_16_la-pcre2_config.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+src/libpcre2_16_la-pcre2_context.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+src/libpcre2_16_la-pcre2_dfa_match.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+src/libpcre2_16_la-pcre2_error.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+src/libpcre2_16_la-pcre2_find_bracket.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+src/libpcre2_16_la-pcre2_jit_compile.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+src/libpcre2_16_la-pcre2_maketables.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+src/libpcre2_16_la-pcre2_match.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+src/libpcre2_16_la-pcre2_match_data.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+src/libpcre2_16_la-pcre2_newline.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+src/libpcre2_16_la-pcre2_ord2utf.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+src/libpcre2_16_la-pcre2_pattern_info.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+src/libpcre2_16_la-pcre2_serialize.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+src/libpcre2_16_la-pcre2_string_utils.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+src/libpcre2_16_la-pcre2_study.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+src/libpcre2_16_la-pcre2_substitute.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+src/libpcre2_16_la-pcre2_substring.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+src/libpcre2_16_la-pcre2_tables.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+src/libpcre2_16_la-pcre2_ucd.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+src/libpcre2_16_la-pcre2_valid_utf.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+src/libpcre2_16_la-pcre2_xclass.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+src/libpcre2_16_la-pcre2_chartables.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+
+libpcre2-16.la: $(libpcre2_16_la_OBJECTS) $(libpcre2_16_la_DEPENDENCIES) $(EXTRA_libpcre2_16_la_DEPENDENCIES) 
+	$(AM_V_CCLD)$(libpcre2_16_la_LINK) $(am_libpcre2_16_la_rpath) $(libpcre2_16_la_OBJECTS) $(libpcre2_16_la_LIBADD) $(LIBS)
+src/libpcre2_32_la-pcre2_auto_possess.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+src/libpcre2_32_la-pcre2_compile.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+src/libpcre2_32_la-pcre2_config.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+src/libpcre2_32_la-pcre2_context.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+src/libpcre2_32_la-pcre2_dfa_match.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+src/libpcre2_32_la-pcre2_error.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+src/libpcre2_32_la-pcre2_find_bracket.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+src/libpcre2_32_la-pcre2_jit_compile.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+src/libpcre2_32_la-pcre2_maketables.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+src/libpcre2_32_la-pcre2_match.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+src/libpcre2_32_la-pcre2_match_data.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+src/libpcre2_32_la-pcre2_newline.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+src/libpcre2_32_la-pcre2_ord2utf.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+src/libpcre2_32_la-pcre2_pattern_info.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+src/libpcre2_32_la-pcre2_serialize.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+src/libpcre2_32_la-pcre2_string_utils.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+src/libpcre2_32_la-pcre2_study.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+src/libpcre2_32_la-pcre2_substitute.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+src/libpcre2_32_la-pcre2_substring.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+src/libpcre2_32_la-pcre2_tables.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+src/libpcre2_32_la-pcre2_ucd.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+src/libpcre2_32_la-pcre2_valid_utf.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+src/libpcre2_32_la-pcre2_xclass.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+src/libpcre2_32_la-pcre2_chartables.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+
+libpcre2-32.la: $(libpcre2_32_la_OBJECTS) $(libpcre2_32_la_DEPENDENCIES) $(EXTRA_libpcre2_32_la_DEPENDENCIES) 
+	$(AM_V_CCLD)$(libpcre2_32_la_LINK) $(am_libpcre2_32_la_rpath) $(libpcre2_32_la_OBJECTS) $(libpcre2_32_la_LIBADD) $(LIBS)
+src/libpcre2_8_la-pcre2_auto_possess.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+src/libpcre2_8_la-pcre2_compile.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+src/libpcre2_8_la-pcre2_config.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+src/libpcre2_8_la-pcre2_context.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+src/libpcre2_8_la-pcre2_dfa_match.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+src/libpcre2_8_la-pcre2_error.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+src/libpcre2_8_la-pcre2_find_bracket.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+src/libpcre2_8_la-pcre2_jit_compile.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+src/libpcre2_8_la-pcre2_maketables.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+src/libpcre2_8_la-pcre2_match.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+src/libpcre2_8_la-pcre2_match_data.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+src/libpcre2_8_la-pcre2_newline.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+src/libpcre2_8_la-pcre2_ord2utf.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+src/libpcre2_8_la-pcre2_pattern_info.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+src/libpcre2_8_la-pcre2_serialize.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+src/libpcre2_8_la-pcre2_string_utils.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+src/libpcre2_8_la-pcre2_study.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+src/libpcre2_8_la-pcre2_substitute.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+src/libpcre2_8_la-pcre2_substring.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+src/libpcre2_8_la-pcre2_tables.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+src/libpcre2_8_la-pcre2_ucd.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+src/libpcre2_8_la-pcre2_valid_utf.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+src/libpcre2_8_la-pcre2_xclass.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+src/libpcre2_8_la-pcre2_chartables.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+
+libpcre2-8.la: $(libpcre2_8_la_OBJECTS) $(libpcre2_8_la_DEPENDENCIES) $(EXTRA_libpcre2_8_la_DEPENDENCIES) 
+	$(AM_V_CCLD)$(libpcre2_8_la_LINK) $(am_libpcre2_8_la_rpath) $(libpcre2_8_la_OBJECTS) $(libpcre2_8_la_LIBADD) $(LIBS)
+src/libpcre2_posix_la-pcre2posix.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+
+libpcre2-posix.la: $(libpcre2_posix_la_OBJECTS) $(libpcre2_posix_la_DEPENDENCIES) $(EXTRA_libpcre2_posix_la_DEPENDENCIES) 
+	$(AM_V_CCLD)$(libpcre2_posix_la_LINK) $(am_libpcre2_posix_la_rpath) $(libpcre2_posix_la_OBJECTS) $(libpcre2_posix_la_LIBADD) $(LIBS)
+install-binPROGRAMS: $(bin_PROGRAMS)
+	@$(NORMAL_INSTALL)
+	@list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
+	fi; \
+	for p in $$list; do echo "$$p $$p"; done | \
+	sed 's/$(EXEEXT)$$//' | \
+	while read p p1; do if test -f $$p \
+	 || test -f $$p1 \
+	  ; then echo "$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n;h' \
+	    -e 's|.*|.|' \
+	    -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
+	sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) files[d] = files[d] " " $$1; \
+	    else { print "f", $$3 "/" $$4, $$1; } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	    if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	    test -z "$$files" || { \
+	    echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+	    $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+	    } \
+	; done
+
+uninstall-binPROGRAMS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	  sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
+	      -e 's/$$/$(EXEEXT)/' \
+	`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(bindir)" && rm -f $$files
+
+clean-binPROGRAMS:
+	@list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \
+	echo " rm -f" $$list; \
+	rm -f $$list || exit $$?; \
+	test -n "$(EXEEXT)" || exit 0; \
+	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+	echo " rm -f" $$list; \
+	rm -f $$list
+
+clean-noinstPROGRAMS:
+	@list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \
+	echo " rm -f" $$list; \
+	rm -f $$list || exit $$?; \
+	test -n "$(EXEEXT)" || exit 0; \
+	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+	echo " rm -f" $$list; \
+	rm -f $$list
+src/dftables.$(OBJEXT): src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+
+dftables$(EXEEXT): $(dftables_OBJECTS) $(dftables_DEPENDENCIES) $(EXTRA_dftables_DEPENDENCIES) 
+	@rm -f dftables$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(dftables_OBJECTS) $(dftables_LDADD) $(LIBS)
+src/pcre2_jit_test-pcre2_jit_test.$(OBJEXT): src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+
+pcre2_jit_test$(EXEEXT): $(pcre2_jit_test_OBJECTS) $(pcre2_jit_test_DEPENDENCIES) $(EXTRA_pcre2_jit_test_DEPENDENCIES) 
+	@rm -f pcre2_jit_test$(EXEEXT)
+	$(AM_V_CCLD)$(pcre2_jit_test_LINK) $(pcre2_jit_test_OBJECTS) $(pcre2_jit_test_LDADD) $(LIBS)
+src/pcre2grep-pcre2grep.$(OBJEXT): src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+
+pcre2grep$(EXEEXT): $(pcre2grep_OBJECTS) $(pcre2grep_DEPENDENCIES) $(EXTRA_pcre2grep_DEPENDENCIES) 
+	@rm -f pcre2grep$(EXEEXT)
+	$(AM_V_CCLD)$(pcre2grep_LINK) $(pcre2grep_OBJECTS) $(pcre2grep_LDADD) $(LIBS)
+src/pcre2test-pcre2test.$(OBJEXT): src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+
+pcre2test$(EXEEXT): $(pcre2test_OBJECTS) $(pcre2test_DEPENDENCIES) $(EXTRA_pcre2test_DEPENDENCIES) 
+	@rm -f pcre2test$(EXEEXT)
+	$(AM_V_CCLD)$(pcre2test_LINK) $(pcre2test_OBJECTS) $(pcre2test_LDADD) $(LIBS)
+install-binSCRIPTS: $(bin_SCRIPTS)
+	@$(NORMAL_INSTALL)
+	@list='$(bin_SCRIPTS)'; test -n "$(bindir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
+	fi; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n' \
+	    -e 'h;s|.*|.|' \
+	    -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) { files[d] = files[d] " " $$1; \
+	      if (++n[d] == $(am__install_max)) { \
+		print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
+	    else { print "f", d "/" $$4, $$1 } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	     if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	     test -z "$$files" || { \
+	       echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+	       $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+	     } \
+	; done
+
+uninstall-binSCRIPTS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(bin_SCRIPTS)'; test -n "$(bindir)" || exit 0; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	       sed -e 's,.*/,,;$(transform)'`; \
+	dir='$(DESTDIR)$(bindir)'; $(am__uninstall_files_from_dir)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+	-rm -f src/*.$(OBJEXT)
+	-rm -f src/*.lo
+
+distclean-compile:
+	-rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/dftables.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libpcre2_16_la-pcre2_auto_possess.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libpcre2_16_la-pcre2_chartables.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libpcre2_16_la-pcre2_compile.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libpcre2_16_la-pcre2_config.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libpcre2_16_la-pcre2_context.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libpcre2_16_la-pcre2_dfa_match.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libpcre2_16_la-pcre2_error.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libpcre2_16_la-pcre2_find_bracket.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libpcre2_16_la-pcre2_jit_compile.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libpcre2_16_la-pcre2_maketables.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libpcre2_16_la-pcre2_match.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libpcre2_16_la-pcre2_match_data.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libpcre2_16_la-pcre2_newline.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libpcre2_16_la-pcre2_ord2utf.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libpcre2_16_la-pcre2_pattern_info.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libpcre2_16_la-pcre2_serialize.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libpcre2_16_la-pcre2_string_utils.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libpcre2_16_la-pcre2_study.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libpcre2_16_la-pcre2_substitute.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libpcre2_16_la-pcre2_substring.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libpcre2_16_la-pcre2_tables.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libpcre2_16_la-pcre2_ucd.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libpcre2_16_la-pcre2_valid_utf.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libpcre2_16_la-pcre2_xclass.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libpcre2_32_la-pcre2_auto_possess.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libpcre2_32_la-pcre2_chartables.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libpcre2_32_la-pcre2_compile.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libpcre2_32_la-pcre2_config.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libpcre2_32_la-pcre2_context.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libpcre2_32_la-pcre2_dfa_match.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libpcre2_32_la-pcre2_error.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libpcre2_32_la-pcre2_find_bracket.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libpcre2_32_la-pcre2_jit_compile.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libpcre2_32_la-pcre2_maketables.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libpcre2_32_la-pcre2_match.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libpcre2_32_la-pcre2_match_data.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libpcre2_32_la-pcre2_newline.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libpcre2_32_la-pcre2_ord2utf.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libpcre2_32_la-pcre2_pattern_info.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libpcre2_32_la-pcre2_serialize.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libpcre2_32_la-pcre2_string_utils.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libpcre2_32_la-pcre2_study.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libpcre2_32_la-pcre2_substitute.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libpcre2_32_la-pcre2_substring.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libpcre2_32_la-pcre2_tables.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libpcre2_32_la-pcre2_ucd.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libpcre2_32_la-pcre2_valid_utf.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libpcre2_32_la-pcre2_xclass.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libpcre2_8_la-pcre2_auto_possess.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libpcre2_8_la-pcre2_chartables.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libpcre2_8_la-pcre2_compile.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libpcre2_8_la-pcre2_config.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libpcre2_8_la-pcre2_context.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libpcre2_8_la-pcre2_dfa_match.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libpcre2_8_la-pcre2_error.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libpcre2_8_la-pcre2_find_bracket.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libpcre2_8_la-pcre2_jit_compile.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libpcre2_8_la-pcre2_maketables.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libpcre2_8_la-pcre2_match.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libpcre2_8_la-pcre2_match_data.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libpcre2_8_la-pcre2_newline.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libpcre2_8_la-pcre2_ord2utf.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libpcre2_8_la-pcre2_pattern_info.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libpcre2_8_la-pcre2_serialize.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libpcre2_8_la-pcre2_string_utils.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libpcre2_8_la-pcre2_study.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libpcre2_8_la-pcre2_substitute.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libpcre2_8_la-pcre2_substring.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libpcre2_8_la-pcre2_tables.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libpcre2_8_la-pcre2_ucd.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libpcre2_8_la-pcre2_valid_utf.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libpcre2_8_la-pcre2_xclass.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libpcre2_posix_la-pcre2posix.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/pcre2_jit_test-pcre2_jit_test.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/pcre2grep-pcre2grep.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/pcre2test-pcre2test.Po@am__quote@
+
+.c.o:
+@am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+@am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
+
+.c.obj:
+@am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+@am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+@am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.c.lo:
+@am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+@am__fastdepCC_TRUE@	$(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
+
+src/libpcre2_16_la-pcre2_auto_possess.lo: src/pcre2_auto_possess.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_16_la_CFLAGS) $(CFLAGS) -MT src/libpcre2_16_la-pcre2_auto_possess.lo -MD -MP -MF src/$(DEPDIR)/libpcre2_16_la-pcre2_auto_possess.Tpo -c -o src/libpcre2_16_la-pcre2_auto_possess.lo `test -f 'src/pcre2_auto_possess.c' || echo '$(srcdir)/'`src/pcre2_auto_possess.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libpcre2_16_la-pcre2_auto_possess.Tpo src/$(DEPDIR)/libpcre2_16_la-pcre2_auto_possess.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/pcre2_auto_possess.c' object='src/libpcre2_16_la-pcre2_auto_possess.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_16_la_CFLAGS) $(CFLAGS) -c -o src/libpcre2_16_la-pcre2_auto_possess.lo `test -f 'src/pcre2_auto_possess.c' || echo '$(srcdir)/'`src/pcre2_auto_possess.c
+
+src/libpcre2_16_la-pcre2_compile.lo: src/pcre2_compile.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_16_la_CFLAGS) $(CFLAGS) -MT src/libpcre2_16_la-pcre2_compile.lo -MD -MP -MF src/$(DEPDIR)/libpcre2_16_la-pcre2_compile.Tpo -c -o src/libpcre2_16_la-pcre2_compile.lo `test -f 'src/pcre2_compile.c' || echo '$(srcdir)/'`src/pcre2_compile.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libpcre2_16_la-pcre2_compile.Tpo src/$(DEPDIR)/libpcre2_16_la-pcre2_compile.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/pcre2_compile.c' object='src/libpcre2_16_la-pcre2_compile.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_16_la_CFLAGS) $(CFLAGS) -c -o src/libpcre2_16_la-pcre2_compile.lo `test -f 'src/pcre2_compile.c' || echo '$(srcdir)/'`src/pcre2_compile.c
+
+src/libpcre2_16_la-pcre2_config.lo: src/pcre2_config.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_16_la_CFLAGS) $(CFLAGS) -MT src/libpcre2_16_la-pcre2_config.lo -MD -MP -MF src/$(DEPDIR)/libpcre2_16_la-pcre2_config.Tpo -c -o src/libpcre2_16_la-pcre2_config.lo `test -f 'src/pcre2_config.c' || echo '$(srcdir)/'`src/pcre2_config.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libpcre2_16_la-pcre2_config.Tpo src/$(DEPDIR)/libpcre2_16_la-pcre2_config.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/pcre2_config.c' object='src/libpcre2_16_la-pcre2_config.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_16_la_CFLAGS) $(CFLAGS) -c -o src/libpcre2_16_la-pcre2_config.lo `test -f 'src/pcre2_config.c' || echo '$(srcdir)/'`src/pcre2_config.c
+
+src/libpcre2_16_la-pcre2_context.lo: src/pcre2_context.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_16_la_CFLAGS) $(CFLAGS) -MT src/libpcre2_16_la-pcre2_context.lo -MD -MP -MF src/$(DEPDIR)/libpcre2_16_la-pcre2_context.Tpo -c -o src/libpcre2_16_la-pcre2_context.lo `test -f 'src/pcre2_context.c' || echo '$(srcdir)/'`src/pcre2_context.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libpcre2_16_la-pcre2_context.Tpo src/$(DEPDIR)/libpcre2_16_la-pcre2_context.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/pcre2_context.c' object='src/libpcre2_16_la-pcre2_context.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_16_la_CFLAGS) $(CFLAGS) -c -o src/libpcre2_16_la-pcre2_context.lo `test -f 'src/pcre2_context.c' || echo '$(srcdir)/'`src/pcre2_context.c
+
+src/libpcre2_16_la-pcre2_dfa_match.lo: src/pcre2_dfa_match.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_16_la_CFLAGS) $(CFLAGS) -MT src/libpcre2_16_la-pcre2_dfa_match.lo -MD -MP -MF src/$(DEPDIR)/libpcre2_16_la-pcre2_dfa_match.Tpo -c -o src/libpcre2_16_la-pcre2_dfa_match.lo `test -f 'src/pcre2_dfa_match.c' || echo '$(srcdir)/'`src/pcre2_dfa_match.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libpcre2_16_la-pcre2_dfa_match.Tpo src/$(DEPDIR)/libpcre2_16_la-pcre2_dfa_match.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/pcre2_dfa_match.c' object='src/libpcre2_16_la-pcre2_dfa_match.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_16_la_CFLAGS) $(CFLAGS) -c -o src/libpcre2_16_la-pcre2_dfa_match.lo `test -f 'src/pcre2_dfa_match.c' || echo '$(srcdir)/'`src/pcre2_dfa_match.c
+
+src/libpcre2_16_la-pcre2_error.lo: src/pcre2_error.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_16_la_CFLAGS) $(CFLAGS) -MT src/libpcre2_16_la-pcre2_error.lo -MD -MP -MF src/$(DEPDIR)/libpcre2_16_la-pcre2_error.Tpo -c -o src/libpcre2_16_la-pcre2_error.lo `test -f 'src/pcre2_error.c' || echo '$(srcdir)/'`src/pcre2_error.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libpcre2_16_la-pcre2_error.Tpo src/$(DEPDIR)/libpcre2_16_la-pcre2_error.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/pcre2_error.c' object='src/libpcre2_16_la-pcre2_error.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_16_la_CFLAGS) $(CFLAGS) -c -o src/libpcre2_16_la-pcre2_error.lo `test -f 'src/pcre2_error.c' || echo '$(srcdir)/'`src/pcre2_error.c
+
+src/libpcre2_16_la-pcre2_find_bracket.lo: src/pcre2_find_bracket.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_16_la_CFLAGS) $(CFLAGS) -MT src/libpcre2_16_la-pcre2_find_bracket.lo -MD -MP -MF src/$(DEPDIR)/libpcre2_16_la-pcre2_find_bracket.Tpo -c -o src/libpcre2_16_la-pcre2_find_bracket.lo `test -f 'src/pcre2_find_bracket.c' || echo '$(srcdir)/'`src/pcre2_find_bracket.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libpcre2_16_la-pcre2_find_bracket.Tpo src/$(DEPDIR)/libpcre2_16_la-pcre2_find_bracket.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/pcre2_find_bracket.c' object='src/libpcre2_16_la-pcre2_find_bracket.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_16_la_CFLAGS) $(CFLAGS) -c -o src/libpcre2_16_la-pcre2_find_bracket.lo `test -f 'src/pcre2_find_bracket.c' || echo '$(srcdir)/'`src/pcre2_find_bracket.c
+
+src/libpcre2_16_la-pcre2_jit_compile.lo: src/pcre2_jit_compile.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_16_la_CFLAGS) $(CFLAGS) -MT src/libpcre2_16_la-pcre2_jit_compile.lo -MD -MP -MF src/$(DEPDIR)/libpcre2_16_la-pcre2_jit_compile.Tpo -c -o src/libpcre2_16_la-pcre2_jit_compile.lo `test -f 'src/pcre2_jit_compile.c' || echo '$(srcdir)/'`src/pcre2_jit_compile.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libpcre2_16_la-pcre2_jit_compile.Tpo src/$(DEPDIR)/libpcre2_16_la-pcre2_jit_compile.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/pcre2_jit_compile.c' object='src/libpcre2_16_la-pcre2_jit_compile.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_16_la_CFLAGS) $(CFLAGS) -c -o src/libpcre2_16_la-pcre2_jit_compile.lo `test -f 'src/pcre2_jit_compile.c' || echo '$(srcdir)/'`src/pcre2_jit_compile.c
+
+src/libpcre2_16_la-pcre2_maketables.lo: src/pcre2_maketables.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_16_la_CFLAGS) $(CFLAGS) -MT src/libpcre2_16_la-pcre2_maketables.lo -MD -MP -MF src/$(DEPDIR)/libpcre2_16_la-pcre2_maketables.Tpo -c -o src/libpcre2_16_la-pcre2_maketables.lo `test -f 'src/pcre2_maketables.c' || echo '$(srcdir)/'`src/pcre2_maketables.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libpcre2_16_la-pcre2_maketables.Tpo src/$(DEPDIR)/libpcre2_16_la-pcre2_maketables.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/pcre2_maketables.c' object='src/libpcre2_16_la-pcre2_maketables.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_16_la_CFLAGS) $(CFLAGS) -c -o src/libpcre2_16_la-pcre2_maketables.lo `test -f 'src/pcre2_maketables.c' || echo '$(srcdir)/'`src/pcre2_maketables.c
+
+src/libpcre2_16_la-pcre2_match.lo: src/pcre2_match.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_16_la_CFLAGS) $(CFLAGS) -MT src/libpcre2_16_la-pcre2_match.lo -MD -MP -MF src/$(DEPDIR)/libpcre2_16_la-pcre2_match.Tpo -c -o src/libpcre2_16_la-pcre2_match.lo `test -f 'src/pcre2_match.c' || echo '$(srcdir)/'`src/pcre2_match.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libpcre2_16_la-pcre2_match.Tpo src/$(DEPDIR)/libpcre2_16_la-pcre2_match.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/pcre2_match.c' object='src/libpcre2_16_la-pcre2_match.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_16_la_CFLAGS) $(CFLAGS) -c -o src/libpcre2_16_la-pcre2_match.lo `test -f 'src/pcre2_match.c' || echo '$(srcdir)/'`src/pcre2_match.c
+
+src/libpcre2_16_la-pcre2_match_data.lo: src/pcre2_match_data.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_16_la_CFLAGS) $(CFLAGS) -MT src/libpcre2_16_la-pcre2_match_data.lo -MD -MP -MF src/$(DEPDIR)/libpcre2_16_la-pcre2_match_data.Tpo -c -o src/libpcre2_16_la-pcre2_match_data.lo `test -f 'src/pcre2_match_data.c' || echo '$(srcdir)/'`src/pcre2_match_data.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libpcre2_16_la-pcre2_match_data.Tpo src/$(DEPDIR)/libpcre2_16_la-pcre2_match_data.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/pcre2_match_data.c' object='src/libpcre2_16_la-pcre2_match_data.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_16_la_CFLAGS) $(CFLAGS) -c -o src/libpcre2_16_la-pcre2_match_data.lo `test -f 'src/pcre2_match_data.c' || echo '$(srcdir)/'`src/pcre2_match_data.c
+
+src/libpcre2_16_la-pcre2_newline.lo: src/pcre2_newline.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_16_la_CFLAGS) $(CFLAGS) -MT src/libpcre2_16_la-pcre2_newline.lo -MD -MP -MF src/$(DEPDIR)/libpcre2_16_la-pcre2_newline.Tpo -c -o src/libpcre2_16_la-pcre2_newline.lo `test -f 'src/pcre2_newline.c' || echo '$(srcdir)/'`src/pcre2_newline.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libpcre2_16_la-pcre2_newline.Tpo src/$(DEPDIR)/libpcre2_16_la-pcre2_newline.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/pcre2_newline.c' object='src/libpcre2_16_la-pcre2_newline.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_16_la_CFLAGS) $(CFLAGS) -c -o src/libpcre2_16_la-pcre2_newline.lo `test -f 'src/pcre2_newline.c' || echo '$(srcdir)/'`src/pcre2_newline.c
+
+src/libpcre2_16_la-pcre2_ord2utf.lo: src/pcre2_ord2utf.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_16_la_CFLAGS) $(CFLAGS) -MT src/libpcre2_16_la-pcre2_ord2utf.lo -MD -MP -MF src/$(DEPDIR)/libpcre2_16_la-pcre2_ord2utf.Tpo -c -o src/libpcre2_16_la-pcre2_ord2utf.lo `test -f 'src/pcre2_ord2utf.c' || echo '$(srcdir)/'`src/pcre2_ord2utf.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libpcre2_16_la-pcre2_ord2utf.Tpo src/$(DEPDIR)/libpcre2_16_la-pcre2_ord2utf.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/pcre2_ord2utf.c' object='src/libpcre2_16_la-pcre2_ord2utf.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_16_la_CFLAGS) $(CFLAGS) -c -o src/libpcre2_16_la-pcre2_ord2utf.lo `test -f 'src/pcre2_ord2utf.c' || echo '$(srcdir)/'`src/pcre2_ord2utf.c
+
+src/libpcre2_16_la-pcre2_pattern_info.lo: src/pcre2_pattern_info.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_16_la_CFLAGS) $(CFLAGS) -MT src/libpcre2_16_la-pcre2_pattern_info.lo -MD -MP -MF src/$(DEPDIR)/libpcre2_16_la-pcre2_pattern_info.Tpo -c -o src/libpcre2_16_la-pcre2_pattern_info.lo `test -f 'src/pcre2_pattern_info.c' || echo '$(srcdir)/'`src/pcre2_pattern_info.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libpcre2_16_la-pcre2_pattern_info.Tpo src/$(DEPDIR)/libpcre2_16_la-pcre2_pattern_info.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/pcre2_pattern_info.c' object='src/libpcre2_16_la-pcre2_pattern_info.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_16_la_CFLAGS) $(CFLAGS) -c -o src/libpcre2_16_la-pcre2_pattern_info.lo `test -f 'src/pcre2_pattern_info.c' || echo '$(srcdir)/'`src/pcre2_pattern_info.c
+
+src/libpcre2_16_la-pcre2_serialize.lo: src/pcre2_serialize.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_16_la_CFLAGS) $(CFLAGS) -MT src/libpcre2_16_la-pcre2_serialize.lo -MD -MP -MF src/$(DEPDIR)/libpcre2_16_la-pcre2_serialize.Tpo -c -o src/libpcre2_16_la-pcre2_serialize.lo `test -f 'src/pcre2_serialize.c' || echo '$(srcdir)/'`src/pcre2_serialize.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libpcre2_16_la-pcre2_serialize.Tpo src/$(DEPDIR)/libpcre2_16_la-pcre2_serialize.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/pcre2_serialize.c' object='src/libpcre2_16_la-pcre2_serialize.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_16_la_CFLAGS) $(CFLAGS) -c -o src/libpcre2_16_la-pcre2_serialize.lo `test -f 'src/pcre2_serialize.c' || echo '$(srcdir)/'`src/pcre2_serialize.c
+
+src/libpcre2_16_la-pcre2_string_utils.lo: src/pcre2_string_utils.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_16_la_CFLAGS) $(CFLAGS) -MT src/libpcre2_16_la-pcre2_string_utils.lo -MD -MP -MF src/$(DEPDIR)/libpcre2_16_la-pcre2_string_utils.Tpo -c -o src/libpcre2_16_la-pcre2_string_utils.lo `test -f 'src/pcre2_string_utils.c' || echo '$(srcdir)/'`src/pcre2_string_utils.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libpcre2_16_la-pcre2_string_utils.Tpo src/$(DEPDIR)/libpcre2_16_la-pcre2_string_utils.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/pcre2_string_utils.c' object='src/libpcre2_16_la-pcre2_string_utils.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_16_la_CFLAGS) $(CFLAGS) -c -o src/libpcre2_16_la-pcre2_string_utils.lo `test -f 'src/pcre2_string_utils.c' || echo '$(srcdir)/'`src/pcre2_string_utils.c
+
+src/libpcre2_16_la-pcre2_study.lo: src/pcre2_study.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_16_la_CFLAGS) $(CFLAGS) -MT src/libpcre2_16_la-pcre2_study.lo -MD -MP -MF src/$(DEPDIR)/libpcre2_16_la-pcre2_study.Tpo -c -o src/libpcre2_16_la-pcre2_study.lo `test -f 'src/pcre2_study.c' || echo '$(srcdir)/'`src/pcre2_study.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libpcre2_16_la-pcre2_study.Tpo src/$(DEPDIR)/libpcre2_16_la-pcre2_study.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/pcre2_study.c' object='src/libpcre2_16_la-pcre2_study.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_16_la_CFLAGS) $(CFLAGS) -c -o src/libpcre2_16_la-pcre2_study.lo `test -f 'src/pcre2_study.c' || echo '$(srcdir)/'`src/pcre2_study.c
+
+src/libpcre2_16_la-pcre2_substitute.lo: src/pcre2_substitute.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_16_la_CFLAGS) $(CFLAGS) -MT src/libpcre2_16_la-pcre2_substitute.lo -MD -MP -MF src/$(DEPDIR)/libpcre2_16_la-pcre2_substitute.Tpo -c -o src/libpcre2_16_la-pcre2_substitute.lo `test -f 'src/pcre2_substitute.c' || echo '$(srcdir)/'`src/pcre2_substitute.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libpcre2_16_la-pcre2_substitute.Tpo src/$(DEPDIR)/libpcre2_16_la-pcre2_substitute.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/pcre2_substitute.c' object='src/libpcre2_16_la-pcre2_substitute.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_16_la_CFLAGS) $(CFLAGS) -c -o src/libpcre2_16_la-pcre2_substitute.lo `test -f 'src/pcre2_substitute.c' || echo '$(srcdir)/'`src/pcre2_substitute.c
+
+src/libpcre2_16_la-pcre2_substring.lo: src/pcre2_substring.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_16_la_CFLAGS) $(CFLAGS) -MT src/libpcre2_16_la-pcre2_substring.lo -MD -MP -MF src/$(DEPDIR)/libpcre2_16_la-pcre2_substring.Tpo -c -o src/libpcre2_16_la-pcre2_substring.lo `test -f 'src/pcre2_substring.c' || echo '$(srcdir)/'`src/pcre2_substring.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libpcre2_16_la-pcre2_substring.Tpo src/$(DEPDIR)/libpcre2_16_la-pcre2_substring.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/pcre2_substring.c' object='src/libpcre2_16_la-pcre2_substring.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_16_la_CFLAGS) $(CFLAGS) -c -o src/libpcre2_16_la-pcre2_substring.lo `test -f 'src/pcre2_substring.c' || echo '$(srcdir)/'`src/pcre2_substring.c
+
+src/libpcre2_16_la-pcre2_tables.lo: src/pcre2_tables.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_16_la_CFLAGS) $(CFLAGS) -MT src/libpcre2_16_la-pcre2_tables.lo -MD -MP -MF src/$(DEPDIR)/libpcre2_16_la-pcre2_tables.Tpo -c -o src/libpcre2_16_la-pcre2_tables.lo `test -f 'src/pcre2_tables.c' || echo '$(srcdir)/'`src/pcre2_tables.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libpcre2_16_la-pcre2_tables.Tpo src/$(DEPDIR)/libpcre2_16_la-pcre2_tables.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/pcre2_tables.c' object='src/libpcre2_16_la-pcre2_tables.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_16_la_CFLAGS) $(CFLAGS) -c -o src/libpcre2_16_la-pcre2_tables.lo `test -f 'src/pcre2_tables.c' || echo '$(srcdir)/'`src/pcre2_tables.c
+
+src/libpcre2_16_la-pcre2_ucd.lo: src/pcre2_ucd.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_16_la_CFLAGS) $(CFLAGS) -MT src/libpcre2_16_la-pcre2_ucd.lo -MD -MP -MF src/$(DEPDIR)/libpcre2_16_la-pcre2_ucd.Tpo -c -o src/libpcre2_16_la-pcre2_ucd.lo `test -f 'src/pcre2_ucd.c' || echo '$(srcdir)/'`src/pcre2_ucd.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libpcre2_16_la-pcre2_ucd.Tpo src/$(DEPDIR)/libpcre2_16_la-pcre2_ucd.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/pcre2_ucd.c' object='src/libpcre2_16_la-pcre2_ucd.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_16_la_CFLAGS) $(CFLAGS) -c -o src/libpcre2_16_la-pcre2_ucd.lo `test -f 'src/pcre2_ucd.c' || echo '$(srcdir)/'`src/pcre2_ucd.c
+
+src/libpcre2_16_la-pcre2_valid_utf.lo: src/pcre2_valid_utf.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_16_la_CFLAGS) $(CFLAGS) -MT src/libpcre2_16_la-pcre2_valid_utf.lo -MD -MP -MF src/$(DEPDIR)/libpcre2_16_la-pcre2_valid_utf.Tpo -c -o src/libpcre2_16_la-pcre2_valid_utf.lo `test -f 'src/pcre2_valid_utf.c' || echo '$(srcdir)/'`src/pcre2_valid_utf.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libpcre2_16_la-pcre2_valid_utf.Tpo src/$(DEPDIR)/libpcre2_16_la-pcre2_valid_utf.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/pcre2_valid_utf.c' object='src/libpcre2_16_la-pcre2_valid_utf.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_16_la_CFLAGS) $(CFLAGS) -c -o src/libpcre2_16_la-pcre2_valid_utf.lo `test -f 'src/pcre2_valid_utf.c' || echo '$(srcdir)/'`src/pcre2_valid_utf.c
+
+src/libpcre2_16_la-pcre2_xclass.lo: src/pcre2_xclass.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_16_la_CFLAGS) $(CFLAGS) -MT src/libpcre2_16_la-pcre2_xclass.lo -MD -MP -MF src/$(DEPDIR)/libpcre2_16_la-pcre2_xclass.Tpo -c -o src/libpcre2_16_la-pcre2_xclass.lo `test -f 'src/pcre2_xclass.c' || echo '$(srcdir)/'`src/pcre2_xclass.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libpcre2_16_la-pcre2_xclass.Tpo src/$(DEPDIR)/libpcre2_16_la-pcre2_xclass.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/pcre2_xclass.c' object='src/libpcre2_16_la-pcre2_xclass.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_16_la_CFLAGS) $(CFLAGS) -c -o src/libpcre2_16_la-pcre2_xclass.lo `test -f 'src/pcre2_xclass.c' || echo '$(srcdir)/'`src/pcre2_xclass.c
+
+src/libpcre2_16_la-pcre2_chartables.lo: src/pcre2_chartables.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_16_la_CFLAGS) $(CFLAGS) -MT src/libpcre2_16_la-pcre2_chartables.lo -MD -MP -MF src/$(DEPDIR)/libpcre2_16_la-pcre2_chartables.Tpo -c -o src/libpcre2_16_la-pcre2_chartables.lo `test -f 'src/pcre2_chartables.c' || echo '$(srcdir)/'`src/pcre2_chartables.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libpcre2_16_la-pcre2_chartables.Tpo src/$(DEPDIR)/libpcre2_16_la-pcre2_chartables.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/pcre2_chartables.c' object='src/libpcre2_16_la-pcre2_chartables.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_16_la_CFLAGS) $(CFLAGS) -c -o src/libpcre2_16_la-pcre2_chartables.lo `test -f 'src/pcre2_chartables.c' || echo '$(srcdir)/'`src/pcre2_chartables.c
+
+src/libpcre2_32_la-pcre2_auto_possess.lo: src/pcre2_auto_possess.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_32_la_CFLAGS) $(CFLAGS) -MT src/libpcre2_32_la-pcre2_auto_possess.lo -MD -MP -MF src/$(DEPDIR)/libpcre2_32_la-pcre2_auto_possess.Tpo -c -o src/libpcre2_32_la-pcre2_auto_possess.lo `test -f 'src/pcre2_auto_possess.c' || echo '$(srcdir)/'`src/pcre2_auto_possess.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libpcre2_32_la-pcre2_auto_possess.Tpo src/$(DEPDIR)/libpcre2_32_la-pcre2_auto_possess.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/pcre2_auto_possess.c' object='src/libpcre2_32_la-pcre2_auto_possess.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_32_la_CFLAGS) $(CFLAGS) -c -o src/libpcre2_32_la-pcre2_auto_possess.lo `test -f 'src/pcre2_auto_possess.c' || echo '$(srcdir)/'`src/pcre2_auto_possess.c
+
+src/libpcre2_32_la-pcre2_compile.lo: src/pcre2_compile.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_32_la_CFLAGS) $(CFLAGS) -MT src/libpcre2_32_la-pcre2_compile.lo -MD -MP -MF src/$(DEPDIR)/libpcre2_32_la-pcre2_compile.Tpo -c -o src/libpcre2_32_la-pcre2_compile.lo `test -f 'src/pcre2_compile.c' || echo '$(srcdir)/'`src/pcre2_compile.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libpcre2_32_la-pcre2_compile.Tpo src/$(DEPDIR)/libpcre2_32_la-pcre2_compile.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/pcre2_compile.c' object='src/libpcre2_32_la-pcre2_compile.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_32_la_CFLAGS) $(CFLAGS) -c -o src/libpcre2_32_la-pcre2_compile.lo `test -f 'src/pcre2_compile.c' || echo '$(srcdir)/'`src/pcre2_compile.c
+
+src/libpcre2_32_la-pcre2_config.lo: src/pcre2_config.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_32_la_CFLAGS) $(CFLAGS) -MT src/libpcre2_32_la-pcre2_config.lo -MD -MP -MF src/$(DEPDIR)/libpcre2_32_la-pcre2_config.Tpo -c -o src/libpcre2_32_la-pcre2_config.lo `test -f 'src/pcre2_config.c' || echo '$(srcdir)/'`src/pcre2_config.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libpcre2_32_la-pcre2_config.Tpo src/$(DEPDIR)/libpcre2_32_la-pcre2_config.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/pcre2_config.c' object='src/libpcre2_32_la-pcre2_config.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_32_la_CFLAGS) $(CFLAGS) -c -o src/libpcre2_32_la-pcre2_config.lo `test -f 'src/pcre2_config.c' || echo '$(srcdir)/'`src/pcre2_config.c
+
+src/libpcre2_32_la-pcre2_context.lo: src/pcre2_context.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_32_la_CFLAGS) $(CFLAGS) -MT src/libpcre2_32_la-pcre2_context.lo -MD -MP -MF src/$(DEPDIR)/libpcre2_32_la-pcre2_context.Tpo -c -o src/libpcre2_32_la-pcre2_context.lo `test -f 'src/pcre2_context.c' || echo '$(srcdir)/'`src/pcre2_context.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libpcre2_32_la-pcre2_context.Tpo src/$(DEPDIR)/libpcre2_32_la-pcre2_context.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/pcre2_context.c' object='src/libpcre2_32_la-pcre2_context.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_32_la_CFLAGS) $(CFLAGS) -c -o src/libpcre2_32_la-pcre2_context.lo `test -f 'src/pcre2_context.c' || echo '$(srcdir)/'`src/pcre2_context.c
+
+src/libpcre2_32_la-pcre2_dfa_match.lo: src/pcre2_dfa_match.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_32_la_CFLAGS) $(CFLAGS) -MT src/libpcre2_32_la-pcre2_dfa_match.lo -MD -MP -MF src/$(DEPDIR)/libpcre2_32_la-pcre2_dfa_match.Tpo -c -o src/libpcre2_32_la-pcre2_dfa_match.lo `test -f 'src/pcre2_dfa_match.c' || echo '$(srcdir)/'`src/pcre2_dfa_match.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libpcre2_32_la-pcre2_dfa_match.Tpo src/$(DEPDIR)/libpcre2_32_la-pcre2_dfa_match.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/pcre2_dfa_match.c' object='src/libpcre2_32_la-pcre2_dfa_match.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_32_la_CFLAGS) $(CFLAGS) -c -o src/libpcre2_32_la-pcre2_dfa_match.lo `test -f 'src/pcre2_dfa_match.c' || echo '$(srcdir)/'`src/pcre2_dfa_match.c
+
+src/libpcre2_32_la-pcre2_error.lo: src/pcre2_error.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_32_la_CFLAGS) $(CFLAGS) -MT src/libpcre2_32_la-pcre2_error.lo -MD -MP -MF src/$(DEPDIR)/libpcre2_32_la-pcre2_error.Tpo -c -o src/libpcre2_32_la-pcre2_error.lo `test -f 'src/pcre2_error.c' || echo '$(srcdir)/'`src/pcre2_error.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libpcre2_32_la-pcre2_error.Tpo src/$(DEPDIR)/libpcre2_32_la-pcre2_error.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/pcre2_error.c' object='src/libpcre2_32_la-pcre2_error.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_32_la_CFLAGS) $(CFLAGS) -c -o src/libpcre2_32_la-pcre2_error.lo `test -f 'src/pcre2_error.c' || echo '$(srcdir)/'`src/pcre2_error.c
+
+src/libpcre2_32_la-pcre2_find_bracket.lo: src/pcre2_find_bracket.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_32_la_CFLAGS) $(CFLAGS) -MT src/libpcre2_32_la-pcre2_find_bracket.lo -MD -MP -MF src/$(DEPDIR)/libpcre2_32_la-pcre2_find_bracket.Tpo -c -o src/libpcre2_32_la-pcre2_find_bracket.lo `test -f 'src/pcre2_find_bracket.c' || echo '$(srcdir)/'`src/pcre2_find_bracket.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libpcre2_32_la-pcre2_find_bracket.Tpo src/$(DEPDIR)/libpcre2_32_la-pcre2_find_bracket.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/pcre2_find_bracket.c' object='src/libpcre2_32_la-pcre2_find_bracket.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_32_la_CFLAGS) $(CFLAGS) -c -o src/libpcre2_32_la-pcre2_find_bracket.lo `test -f 'src/pcre2_find_bracket.c' || echo '$(srcdir)/'`src/pcre2_find_bracket.c
+
+src/libpcre2_32_la-pcre2_jit_compile.lo: src/pcre2_jit_compile.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_32_la_CFLAGS) $(CFLAGS) -MT src/libpcre2_32_la-pcre2_jit_compile.lo -MD -MP -MF src/$(DEPDIR)/libpcre2_32_la-pcre2_jit_compile.Tpo -c -o src/libpcre2_32_la-pcre2_jit_compile.lo `test -f 'src/pcre2_jit_compile.c' || echo '$(srcdir)/'`src/pcre2_jit_compile.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libpcre2_32_la-pcre2_jit_compile.Tpo src/$(DEPDIR)/libpcre2_32_la-pcre2_jit_compile.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/pcre2_jit_compile.c' object='src/libpcre2_32_la-pcre2_jit_compile.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_32_la_CFLAGS) $(CFLAGS) -c -o src/libpcre2_32_la-pcre2_jit_compile.lo `test -f 'src/pcre2_jit_compile.c' || echo '$(srcdir)/'`src/pcre2_jit_compile.c
+
+src/libpcre2_32_la-pcre2_maketables.lo: src/pcre2_maketables.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_32_la_CFLAGS) $(CFLAGS) -MT src/libpcre2_32_la-pcre2_maketables.lo -MD -MP -MF src/$(DEPDIR)/libpcre2_32_la-pcre2_maketables.Tpo -c -o src/libpcre2_32_la-pcre2_maketables.lo `test -f 'src/pcre2_maketables.c' || echo '$(srcdir)/'`src/pcre2_maketables.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libpcre2_32_la-pcre2_maketables.Tpo src/$(DEPDIR)/libpcre2_32_la-pcre2_maketables.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/pcre2_maketables.c' object='src/libpcre2_32_la-pcre2_maketables.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_32_la_CFLAGS) $(CFLAGS) -c -o src/libpcre2_32_la-pcre2_maketables.lo `test -f 'src/pcre2_maketables.c' || echo '$(srcdir)/'`src/pcre2_maketables.c
+
+src/libpcre2_32_la-pcre2_match.lo: src/pcre2_match.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_32_la_CFLAGS) $(CFLAGS) -MT src/libpcre2_32_la-pcre2_match.lo -MD -MP -MF src/$(DEPDIR)/libpcre2_32_la-pcre2_match.Tpo -c -o src/libpcre2_32_la-pcre2_match.lo `test -f 'src/pcre2_match.c' || echo '$(srcdir)/'`src/pcre2_match.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libpcre2_32_la-pcre2_match.Tpo src/$(DEPDIR)/libpcre2_32_la-pcre2_match.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/pcre2_match.c' object='src/libpcre2_32_la-pcre2_match.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_32_la_CFLAGS) $(CFLAGS) -c -o src/libpcre2_32_la-pcre2_match.lo `test -f 'src/pcre2_match.c' || echo '$(srcdir)/'`src/pcre2_match.c
+
+src/libpcre2_32_la-pcre2_match_data.lo: src/pcre2_match_data.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_32_la_CFLAGS) $(CFLAGS) -MT src/libpcre2_32_la-pcre2_match_data.lo -MD -MP -MF src/$(DEPDIR)/libpcre2_32_la-pcre2_match_data.Tpo -c -o src/libpcre2_32_la-pcre2_match_data.lo `test -f 'src/pcre2_match_data.c' || echo '$(srcdir)/'`src/pcre2_match_data.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libpcre2_32_la-pcre2_match_data.Tpo src/$(DEPDIR)/libpcre2_32_la-pcre2_match_data.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/pcre2_match_data.c' object='src/libpcre2_32_la-pcre2_match_data.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_32_la_CFLAGS) $(CFLAGS) -c -o src/libpcre2_32_la-pcre2_match_data.lo `test -f 'src/pcre2_match_data.c' || echo '$(srcdir)/'`src/pcre2_match_data.c
+
+src/libpcre2_32_la-pcre2_newline.lo: src/pcre2_newline.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_32_la_CFLAGS) $(CFLAGS) -MT src/libpcre2_32_la-pcre2_newline.lo -MD -MP -MF src/$(DEPDIR)/libpcre2_32_la-pcre2_newline.Tpo -c -o src/libpcre2_32_la-pcre2_newline.lo `test -f 'src/pcre2_newline.c' || echo '$(srcdir)/'`src/pcre2_newline.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libpcre2_32_la-pcre2_newline.Tpo src/$(DEPDIR)/libpcre2_32_la-pcre2_newline.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/pcre2_newline.c' object='src/libpcre2_32_la-pcre2_newline.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_32_la_CFLAGS) $(CFLAGS) -c -o src/libpcre2_32_la-pcre2_newline.lo `test -f 'src/pcre2_newline.c' || echo '$(srcdir)/'`src/pcre2_newline.c
+
+src/libpcre2_32_la-pcre2_ord2utf.lo: src/pcre2_ord2utf.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_32_la_CFLAGS) $(CFLAGS) -MT src/libpcre2_32_la-pcre2_ord2utf.lo -MD -MP -MF src/$(DEPDIR)/libpcre2_32_la-pcre2_ord2utf.Tpo -c -o src/libpcre2_32_la-pcre2_ord2utf.lo `test -f 'src/pcre2_ord2utf.c' || echo '$(srcdir)/'`src/pcre2_ord2utf.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libpcre2_32_la-pcre2_ord2utf.Tpo src/$(DEPDIR)/libpcre2_32_la-pcre2_ord2utf.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/pcre2_ord2utf.c' object='src/libpcre2_32_la-pcre2_ord2utf.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_32_la_CFLAGS) $(CFLAGS) -c -o src/libpcre2_32_la-pcre2_ord2utf.lo `test -f 'src/pcre2_ord2utf.c' || echo '$(srcdir)/'`src/pcre2_ord2utf.c
+
+src/libpcre2_32_la-pcre2_pattern_info.lo: src/pcre2_pattern_info.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_32_la_CFLAGS) $(CFLAGS) -MT src/libpcre2_32_la-pcre2_pattern_info.lo -MD -MP -MF src/$(DEPDIR)/libpcre2_32_la-pcre2_pattern_info.Tpo -c -o src/libpcre2_32_la-pcre2_pattern_info.lo `test -f 'src/pcre2_pattern_info.c' || echo '$(srcdir)/'`src/pcre2_pattern_info.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libpcre2_32_la-pcre2_pattern_info.Tpo src/$(DEPDIR)/libpcre2_32_la-pcre2_pattern_info.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/pcre2_pattern_info.c' object='src/libpcre2_32_la-pcre2_pattern_info.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_32_la_CFLAGS) $(CFLAGS) -c -o src/libpcre2_32_la-pcre2_pattern_info.lo `test -f 'src/pcre2_pattern_info.c' || echo '$(srcdir)/'`src/pcre2_pattern_info.c
+
+src/libpcre2_32_la-pcre2_serialize.lo: src/pcre2_serialize.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_32_la_CFLAGS) $(CFLAGS) -MT src/libpcre2_32_la-pcre2_serialize.lo -MD -MP -MF src/$(DEPDIR)/libpcre2_32_la-pcre2_serialize.Tpo -c -o src/libpcre2_32_la-pcre2_serialize.lo `test -f 'src/pcre2_serialize.c' || echo '$(srcdir)/'`src/pcre2_serialize.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libpcre2_32_la-pcre2_serialize.Tpo src/$(DEPDIR)/libpcre2_32_la-pcre2_serialize.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/pcre2_serialize.c' object='src/libpcre2_32_la-pcre2_serialize.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_32_la_CFLAGS) $(CFLAGS) -c -o src/libpcre2_32_la-pcre2_serialize.lo `test -f 'src/pcre2_serialize.c' || echo '$(srcdir)/'`src/pcre2_serialize.c
+
+src/libpcre2_32_la-pcre2_string_utils.lo: src/pcre2_string_utils.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_32_la_CFLAGS) $(CFLAGS) -MT src/libpcre2_32_la-pcre2_string_utils.lo -MD -MP -MF src/$(DEPDIR)/libpcre2_32_la-pcre2_string_utils.Tpo -c -o src/libpcre2_32_la-pcre2_string_utils.lo `test -f 'src/pcre2_string_utils.c' || echo '$(srcdir)/'`src/pcre2_string_utils.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libpcre2_32_la-pcre2_string_utils.Tpo src/$(DEPDIR)/libpcre2_32_la-pcre2_string_utils.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/pcre2_string_utils.c' object='src/libpcre2_32_la-pcre2_string_utils.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_32_la_CFLAGS) $(CFLAGS) -c -o src/libpcre2_32_la-pcre2_string_utils.lo `test -f 'src/pcre2_string_utils.c' || echo '$(srcdir)/'`src/pcre2_string_utils.c
+
+src/libpcre2_32_la-pcre2_study.lo: src/pcre2_study.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_32_la_CFLAGS) $(CFLAGS) -MT src/libpcre2_32_la-pcre2_study.lo -MD -MP -MF src/$(DEPDIR)/libpcre2_32_la-pcre2_study.Tpo -c -o src/libpcre2_32_la-pcre2_study.lo `test -f 'src/pcre2_study.c' || echo '$(srcdir)/'`src/pcre2_study.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libpcre2_32_la-pcre2_study.Tpo src/$(DEPDIR)/libpcre2_32_la-pcre2_study.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/pcre2_study.c' object='src/libpcre2_32_la-pcre2_study.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_32_la_CFLAGS) $(CFLAGS) -c -o src/libpcre2_32_la-pcre2_study.lo `test -f 'src/pcre2_study.c' || echo '$(srcdir)/'`src/pcre2_study.c
+
+src/libpcre2_32_la-pcre2_substitute.lo: src/pcre2_substitute.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_32_la_CFLAGS) $(CFLAGS) -MT src/libpcre2_32_la-pcre2_substitute.lo -MD -MP -MF src/$(DEPDIR)/libpcre2_32_la-pcre2_substitute.Tpo -c -o src/libpcre2_32_la-pcre2_substitute.lo `test -f 'src/pcre2_substitute.c' || echo '$(srcdir)/'`src/pcre2_substitute.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libpcre2_32_la-pcre2_substitute.Tpo src/$(DEPDIR)/libpcre2_32_la-pcre2_substitute.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/pcre2_substitute.c' object='src/libpcre2_32_la-pcre2_substitute.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_32_la_CFLAGS) $(CFLAGS) -c -o src/libpcre2_32_la-pcre2_substitute.lo `test -f 'src/pcre2_substitute.c' || echo '$(srcdir)/'`src/pcre2_substitute.c
+
+src/libpcre2_32_la-pcre2_substring.lo: src/pcre2_substring.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_32_la_CFLAGS) $(CFLAGS) -MT src/libpcre2_32_la-pcre2_substring.lo -MD -MP -MF src/$(DEPDIR)/libpcre2_32_la-pcre2_substring.Tpo -c -o src/libpcre2_32_la-pcre2_substring.lo `test -f 'src/pcre2_substring.c' || echo '$(srcdir)/'`src/pcre2_substring.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libpcre2_32_la-pcre2_substring.Tpo src/$(DEPDIR)/libpcre2_32_la-pcre2_substring.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/pcre2_substring.c' object='src/libpcre2_32_la-pcre2_substring.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_32_la_CFLAGS) $(CFLAGS) -c -o src/libpcre2_32_la-pcre2_substring.lo `test -f 'src/pcre2_substring.c' || echo '$(srcdir)/'`src/pcre2_substring.c
+
+src/libpcre2_32_la-pcre2_tables.lo: src/pcre2_tables.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_32_la_CFLAGS) $(CFLAGS) -MT src/libpcre2_32_la-pcre2_tables.lo -MD -MP -MF src/$(DEPDIR)/libpcre2_32_la-pcre2_tables.Tpo -c -o src/libpcre2_32_la-pcre2_tables.lo `test -f 'src/pcre2_tables.c' || echo '$(srcdir)/'`src/pcre2_tables.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libpcre2_32_la-pcre2_tables.Tpo src/$(DEPDIR)/libpcre2_32_la-pcre2_tables.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/pcre2_tables.c' object='src/libpcre2_32_la-pcre2_tables.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_32_la_CFLAGS) $(CFLAGS) -c -o src/libpcre2_32_la-pcre2_tables.lo `test -f 'src/pcre2_tables.c' || echo '$(srcdir)/'`src/pcre2_tables.c
+
+src/libpcre2_32_la-pcre2_ucd.lo: src/pcre2_ucd.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_32_la_CFLAGS) $(CFLAGS) -MT src/libpcre2_32_la-pcre2_ucd.lo -MD -MP -MF src/$(DEPDIR)/libpcre2_32_la-pcre2_ucd.Tpo -c -o src/libpcre2_32_la-pcre2_ucd.lo `test -f 'src/pcre2_ucd.c' || echo '$(srcdir)/'`src/pcre2_ucd.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libpcre2_32_la-pcre2_ucd.Tpo src/$(DEPDIR)/libpcre2_32_la-pcre2_ucd.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/pcre2_ucd.c' object='src/libpcre2_32_la-pcre2_ucd.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_32_la_CFLAGS) $(CFLAGS) -c -o src/libpcre2_32_la-pcre2_ucd.lo `test -f 'src/pcre2_ucd.c' || echo '$(srcdir)/'`src/pcre2_ucd.c
+
+src/libpcre2_32_la-pcre2_valid_utf.lo: src/pcre2_valid_utf.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_32_la_CFLAGS) $(CFLAGS) -MT src/libpcre2_32_la-pcre2_valid_utf.lo -MD -MP -MF src/$(DEPDIR)/libpcre2_32_la-pcre2_valid_utf.Tpo -c -o src/libpcre2_32_la-pcre2_valid_utf.lo `test -f 'src/pcre2_valid_utf.c' || echo '$(srcdir)/'`src/pcre2_valid_utf.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libpcre2_32_la-pcre2_valid_utf.Tpo src/$(DEPDIR)/libpcre2_32_la-pcre2_valid_utf.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/pcre2_valid_utf.c' object='src/libpcre2_32_la-pcre2_valid_utf.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_32_la_CFLAGS) $(CFLAGS) -c -o src/libpcre2_32_la-pcre2_valid_utf.lo `test -f 'src/pcre2_valid_utf.c' || echo '$(srcdir)/'`src/pcre2_valid_utf.c
+
+src/libpcre2_32_la-pcre2_xclass.lo: src/pcre2_xclass.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_32_la_CFLAGS) $(CFLAGS) -MT src/libpcre2_32_la-pcre2_xclass.lo -MD -MP -MF src/$(DEPDIR)/libpcre2_32_la-pcre2_xclass.Tpo -c -o src/libpcre2_32_la-pcre2_xclass.lo `test -f 'src/pcre2_xclass.c' || echo '$(srcdir)/'`src/pcre2_xclass.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libpcre2_32_la-pcre2_xclass.Tpo src/$(DEPDIR)/libpcre2_32_la-pcre2_xclass.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/pcre2_xclass.c' object='src/libpcre2_32_la-pcre2_xclass.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_32_la_CFLAGS) $(CFLAGS) -c -o src/libpcre2_32_la-pcre2_xclass.lo `test -f 'src/pcre2_xclass.c' || echo '$(srcdir)/'`src/pcre2_xclass.c
+
+src/libpcre2_32_la-pcre2_chartables.lo: src/pcre2_chartables.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_32_la_CFLAGS) $(CFLAGS) -MT src/libpcre2_32_la-pcre2_chartables.lo -MD -MP -MF src/$(DEPDIR)/libpcre2_32_la-pcre2_chartables.Tpo -c -o src/libpcre2_32_la-pcre2_chartables.lo `test -f 'src/pcre2_chartables.c' || echo '$(srcdir)/'`src/pcre2_chartables.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libpcre2_32_la-pcre2_chartables.Tpo src/$(DEPDIR)/libpcre2_32_la-pcre2_chartables.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/pcre2_chartables.c' object='src/libpcre2_32_la-pcre2_chartables.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_32_la_CFLAGS) $(CFLAGS) -c -o src/libpcre2_32_la-pcre2_chartables.lo `test -f 'src/pcre2_chartables.c' || echo '$(srcdir)/'`src/pcre2_chartables.c
+
+src/libpcre2_8_la-pcre2_auto_possess.lo: src/pcre2_auto_possess.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_8_la_CFLAGS) $(CFLAGS) -MT src/libpcre2_8_la-pcre2_auto_possess.lo -MD -MP -MF src/$(DEPDIR)/libpcre2_8_la-pcre2_auto_possess.Tpo -c -o src/libpcre2_8_la-pcre2_auto_possess.lo `test -f 'src/pcre2_auto_possess.c' || echo '$(srcdir)/'`src/pcre2_auto_possess.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libpcre2_8_la-pcre2_auto_possess.Tpo src/$(DEPDIR)/libpcre2_8_la-pcre2_auto_possess.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/pcre2_auto_possess.c' object='src/libpcre2_8_la-pcre2_auto_possess.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_8_la_CFLAGS) $(CFLAGS) -c -o src/libpcre2_8_la-pcre2_auto_possess.lo `test -f 'src/pcre2_auto_possess.c' || echo '$(srcdir)/'`src/pcre2_auto_possess.c
+
+src/libpcre2_8_la-pcre2_compile.lo: src/pcre2_compile.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_8_la_CFLAGS) $(CFLAGS) -MT src/libpcre2_8_la-pcre2_compile.lo -MD -MP -MF src/$(DEPDIR)/libpcre2_8_la-pcre2_compile.Tpo -c -o src/libpcre2_8_la-pcre2_compile.lo `test -f 'src/pcre2_compile.c' || echo '$(srcdir)/'`src/pcre2_compile.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libpcre2_8_la-pcre2_compile.Tpo src/$(DEPDIR)/libpcre2_8_la-pcre2_compile.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/pcre2_compile.c' object='src/libpcre2_8_la-pcre2_compile.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_8_la_CFLAGS) $(CFLAGS) -c -o src/libpcre2_8_la-pcre2_compile.lo `test -f 'src/pcre2_compile.c' || echo '$(srcdir)/'`src/pcre2_compile.c
+
+src/libpcre2_8_la-pcre2_config.lo: src/pcre2_config.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_8_la_CFLAGS) $(CFLAGS) -MT src/libpcre2_8_la-pcre2_config.lo -MD -MP -MF src/$(DEPDIR)/libpcre2_8_la-pcre2_config.Tpo -c -o src/libpcre2_8_la-pcre2_config.lo `test -f 'src/pcre2_config.c' || echo '$(srcdir)/'`src/pcre2_config.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libpcre2_8_la-pcre2_config.Tpo src/$(DEPDIR)/libpcre2_8_la-pcre2_config.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/pcre2_config.c' object='src/libpcre2_8_la-pcre2_config.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_8_la_CFLAGS) $(CFLAGS) -c -o src/libpcre2_8_la-pcre2_config.lo `test -f 'src/pcre2_config.c' || echo '$(srcdir)/'`src/pcre2_config.c
+
+src/libpcre2_8_la-pcre2_context.lo: src/pcre2_context.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_8_la_CFLAGS) $(CFLAGS) -MT src/libpcre2_8_la-pcre2_context.lo -MD -MP -MF src/$(DEPDIR)/libpcre2_8_la-pcre2_context.Tpo -c -o src/libpcre2_8_la-pcre2_context.lo `test -f 'src/pcre2_context.c' || echo '$(srcdir)/'`src/pcre2_context.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libpcre2_8_la-pcre2_context.Tpo src/$(DEPDIR)/libpcre2_8_la-pcre2_context.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/pcre2_context.c' object='src/libpcre2_8_la-pcre2_context.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_8_la_CFLAGS) $(CFLAGS) -c -o src/libpcre2_8_la-pcre2_context.lo `test -f 'src/pcre2_context.c' || echo '$(srcdir)/'`src/pcre2_context.c
+
+src/libpcre2_8_la-pcre2_dfa_match.lo: src/pcre2_dfa_match.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_8_la_CFLAGS) $(CFLAGS) -MT src/libpcre2_8_la-pcre2_dfa_match.lo -MD -MP -MF src/$(DEPDIR)/libpcre2_8_la-pcre2_dfa_match.Tpo -c -o src/libpcre2_8_la-pcre2_dfa_match.lo `test -f 'src/pcre2_dfa_match.c' || echo '$(srcdir)/'`src/pcre2_dfa_match.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libpcre2_8_la-pcre2_dfa_match.Tpo src/$(DEPDIR)/libpcre2_8_la-pcre2_dfa_match.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/pcre2_dfa_match.c' object='src/libpcre2_8_la-pcre2_dfa_match.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_8_la_CFLAGS) $(CFLAGS) -c -o src/libpcre2_8_la-pcre2_dfa_match.lo `test -f 'src/pcre2_dfa_match.c' || echo '$(srcdir)/'`src/pcre2_dfa_match.c
+
+src/libpcre2_8_la-pcre2_error.lo: src/pcre2_error.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_8_la_CFLAGS) $(CFLAGS) -MT src/libpcre2_8_la-pcre2_error.lo -MD -MP -MF src/$(DEPDIR)/libpcre2_8_la-pcre2_error.Tpo -c -o src/libpcre2_8_la-pcre2_error.lo `test -f 'src/pcre2_error.c' || echo '$(srcdir)/'`src/pcre2_error.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libpcre2_8_la-pcre2_error.Tpo src/$(DEPDIR)/libpcre2_8_la-pcre2_error.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/pcre2_error.c' object='src/libpcre2_8_la-pcre2_error.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_8_la_CFLAGS) $(CFLAGS) -c -o src/libpcre2_8_la-pcre2_error.lo `test -f 'src/pcre2_error.c' || echo '$(srcdir)/'`src/pcre2_error.c
+
+src/libpcre2_8_la-pcre2_find_bracket.lo: src/pcre2_find_bracket.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_8_la_CFLAGS) $(CFLAGS) -MT src/libpcre2_8_la-pcre2_find_bracket.lo -MD -MP -MF src/$(DEPDIR)/libpcre2_8_la-pcre2_find_bracket.Tpo -c -o src/libpcre2_8_la-pcre2_find_bracket.lo `test -f 'src/pcre2_find_bracket.c' || echo '$(srcdir)/'`src/pcre2_find_bracket.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libpcre2_8_la-pcre2_find_bracket.Tpo src/$(DEPDIR)/libpcre2_8_la-pcre2_find_bracket.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/pcre2_find_bracket.c' object='src/libpcre2_8_la-pcre2_find_bracket.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_8_la_CFLAGS) $(CFLAGS) -c -o src/libpcre2_8_la-pcre2_find_bracket.lo `test -f 'src/pcre2_find_bracket.c' || echo '$(srcdir)/'`src/pcre2_find_bracket.c
+
+src/libpcre2_8_la-pcre2_jit_compile.lo: src/pcre2_jit_compile.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_8_la_CFLAGS) $(CFLAGS) -MT src/libpcre2_8_la-pcre2_jit_compile.lo -MD -MP -MF src/$(DEPDIR)/libpcre2_8_la-pcre2_jit_compile.Tpo -c -o src/libpcre2_8_la-pcre2_jit_compile.lo `test -f 'src/pcre2_jit_compile.c' || echo '$(srcdir)/'`src/pcre2_jit_compile.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libpcre2_8_la-pcre2_jit_compile.Tpo src/$(DEPDIR)/libpcre2_8_la-pcre2_jit_compile.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/pcre2_jit_compile.c' object='src/libpcre2_8_la-pcre2_jit_compile.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_8_la_CFLAGS) $(CFLAGS) -c -o src/libpcre2_8_la-pcre2_jit_compile.lo `test -f 'src/pcre2_jit_compile.c' || echo '$(srcdir)/'`src/pcre2_jit_compile.c
+
+src/libpcre2_8_la-pcre2_maketables.lo: src/pcre2_maketables.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_8_la_CFLAGS) $(CFLAGS) -MT src/libpcre2_8_la-pcre2_maketables.lo -MD -MP -MF src/$(DEPDIR)/libpcre2_8_la-pcre2_maketables.Tpo -c -o src/libpcre2_8_la-pcre2_maketables.lo `test -f 'src/pcre2_maketables.c' || echo '$(srcdir)/'`src/pcre2_maketables.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libpcre2_8_la-pcre2_maketables.Tpo src/$(DEPDIR)/libpcre2_8_la-pcre2_maketables.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/pcre2_maketables.c' object='src/libpcre2_8_la-pcre2_maketables.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_8_la_CFLAGS) $(CFLAGS) -c -o src/libpcre2_8_la-pcre2_maketables.lo `test -f 'src/pcre2_maketables.c' || echo '$(srcdir)/'`src/pcre2_maketables.c
+
+src/libpcre2_8_la-pcre2_match.lo: src/pcre2_match.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_8_la_CFLAGS) $(CFLAGS) -MT src/libpcre2_8_la-pcre2_match.lo -MD -MP -MF src/$(DEPDIR)/libpcre2_8_la-pcre2_match.Tpo -c -o src/libpcre2_8_la-pcre2_match.lo `test -f 'src/pcre2_match.c' || echo '$(srcdir)/'`src/pcre2_match.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libpcre2_8_la-pcre2_match.Tpo src/$(DEPDIR)/libpcre2_8_la-pcre2_match.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/pcre2_match.c' object='src/libpcre2_8_la-pcre2_match.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_8_la_CFLAGS) $(CFLAGS) -c -o src/libpcre2_8_la-pcre2_match.lo `test -f 'src/pcre2_match.c' || echo '$(srcdir)/'`src/pcre2_match.c
+
+src/libpcre2_8_la-pcre2_match_data.lo: src/pcre2_match_data.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_8_la_CFLAGS) $(CFLAGS) -MT src/libpcre2_8_la-pcre2_match_data.lo -MD -MP -MF src/$(DEPDIR)/libpcre2_8_la-pcre2_match_data.Tpo -c -o src/libpcre2_8_la-pcre2_match_data.lo `test -f 'src/pcre2_match_data.c' || echo '$(srcdir)/'`src/pcre2_match_data.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libpcre2_8_la-pcre2_match_data.Tpo src/$(DEPDIR)/libpcre2_8_la-pcre2_match_data.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/pcre2_match_data.c' object='src/libpcre2_8_la-pcre2_match_data.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_8_la_CFLAGS) $(CFLAGS) -c -o src/libpcre2_8_la-pcre2_match_data.lo `test -f 'src/pcre2_match_data.c' || echo '$(srcdir)/'`src/pcre2_match_data.c
+
+src/libpcre2_8_la-pcre2_newline.lo: src/pcre2_newline.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_8_la_CFLAGS) $(CFLAGS) -MT src/libpcre2_8_la-pcre2_newline.lo -MD -MP -MF src/$(DEPDIR)/libpcre2_8_la-pcre2_newline.Tpo -c -o src/libpcre2_8_la-pcre2_newline.lo `test -f 'src/pcre2_newline.c' || echo '$(srcdir)/'`src/pcre2_newline.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libpcre2_8_la-pcre2_newline.Tpo src/$(DEPDIR)/libpcre2_8_la-pcre2_newline.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/pcre2_newline.c' object='src/libpcre2_8_la-pcre2_newline.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_8_la_CFLAGS) $(CFLAGS) -c -o src/libpcre2_8_la-pcre2_newline.lo `test -f 'src/pcre2_newline.c' || echo '$(srcdir)/'`src/pcre2_newline.c
+
+src/libpcre2_8_la-pcre2_ord2utf.lo: src/pcre2_ord2utf.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_8_la_CFLAGS) $(CFLAGS) -MT src/libpcre2_8_la-pcre2_ord2utf.lo -MD -MP -MF src/$(DEPDIR)/libpcre2_8_la-pcre2_ord2utf.Tpo -c -o src/libpcre2_8_la-pcre2_ord2utf.lo `test -f 'src/pcre2_ord2utf.c' || echo '$(srcdir)/'`src/pcre2_ord2utf.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libpcre2_8_la-pcre2_ord2utf.Tpo src/$(DEPDIR)/libpcre2_8_la-pcre2_ord2utf.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/pcre2_ord2utf.c' object='src/libpcre2_8_la-pcre2_ord2utf.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_8_la_CFLAGS) $(CFLAGS) -c -o src/libpcre2_8_la-pcre2_ord2utf.lo `test -f 'src/pcre2_ord2utf.c' || echo '$(srcdir)/'`src/pcre2_ord2utf.c
+
+src/libpcre2_8_la-pcre2_pattern_info.lo: src/pcre2_pattern_info.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_8_la_CFLAGS) $(CFLAGS) -MT src/libpcre2_8_la-pcre2_pattern_info.lo -MD -MP -MF src/$(DEPDIR)/libpcre2_8_la-pcre2_pattern_info.Tpo -c -o src/libpcre2_8_la-pcre2_pattern_info.lo `test -f 'src/pcre2_pattern_info.c' || echo '$(srcdir)/'`src/pcre2_pattern_info.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libpcre2_8_la-pcre2_pattern_info.Tpo src/$(DEPDIR)/libpcre2_8_la-pcre2_pattern_info.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/pcre2_pattern_info.c' object='src/libpcre2_8_la-pcre2_pattern_info.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_8_la_CFLAGS) $(CFLAGS) -c -o src/libpcre2_8_la-pcre2_pattern_info.lo `test -f 'src/pcre2_pattern_info.c' || echo '$(srcdir)/'`src/pcre2_pattern_info.c
+
+src/libpcre2_8_la-pcre2_serialize.lo: src/pcre2_serialize.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_8_la_CFLAGS) $(CFLAGS) -MT src/libpcre2_8_la-pcre2_serialize.lo -MD -MP -MF src/$(DEPDIR)/libpcre2_8_la-pcre2_serialize.Tpo -c -o src/libpcre2_8_la-pcre2_serialize.lo `test -f 'src/pcre2_serialize.c' || echo '$(srcdir)/'`src/pcre2_serialize.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libpcre2_8_la-pcre2_serialize.Tpo src/$(DEPDIR)/libpcre2_8_la-pcre2_serialize.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/pcre2_serialize.c' object='src/libpcre2_8_la-pcre2_serialize.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_8_la_CFLAGS) $(CFLAGS) -c -o src/libpcre2_8_la-pcre2_serialize.lo `test -f 'src/pcre2_serialize.c' || echo '$(srcdir)/'`src/pcre2_serialize.c
+
+src/libpcre2_8_la-pcre2_string_utils.lo: src/pcre2_string_utils.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_8_la_CFLAGS) $(CFLAGS) -MT src/libpcre2_8_la-pcre2_string_utils.lo -MD -MP -MF src/$(DEPDIR)/libpcre2_8_la-pcre2_string_utils.Tpo -c -o src/libpcre2_8_la-pcre2_string_utils.lo `test -f 'src/pcre2_string_utils.c' || echo '$(srcdir)/'`src/pcre2_string_utils.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libpcre2_8_la-pcre2_string_utils.Tpo src/$(DEPDIR)/libpcre2_8_la-pcre2_string_utils.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/pcre2_string_utils.c' object='src/libpcre2_8_la-pcre2_string_utils.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_8_la_CFLAGS) $(CFLAGS) -c -o src/libpcre2_8_la-pcre2_string_utils.lo `test -f 'src/pcre2_string_utils.c' || echo '$(srcdir)/'`src/pcre2_string_utils.c
+
+src/libpcre2_8_la-pcre2_study.lo: src/pcre2_study.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_8_la_CFLAGS) $(CFLAGS) -MT src/libpcre2_8_la-pcre2_study.lo -MD -MP -MF src/$(DEPDIR)/libpcre2_8_la-pcre2_study.Tpo -c -o src/libpcre2_8_la-pcre2_study.lo `test -f 'src/pcre2_study.c' || echo '$(srcdir)/'`src/pcre2_study.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libpcre2_8_la-pcre2_study.Tpo src/$(DEPDIR)/libpcre2_8_la-pcre2_study.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/pcre2_study.c' object='src/libpcre2_8_la-pcre2_study.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_8_la_CFLAGS) $(CFLAGS) -c -o src/libpcre2_8_la-pcre2_study.lo `test -f 'src/pcre2_study.c' || echo '$(srcdir)/'`src/pcre2_study.c
+
+src/libpcre2_8_la-pcre2_substitute.lo: src/pcre2_substitute.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_8_la_CFLAGS) $(CFLAGS) -MT src/libpcre2_8_la-pcre2_substitute.lo -MD -MP -MF src/$(DEPDIR)/libpcre2_8_la-pcre2_substitute.Tpo -c -o src/libpcre2_8_la-pcre2_substitute.lo `test -f 'src/pcre2_substitute.c' || echo '$(srcdir)/'`src/pcre2_substitute.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libpcre2_8_la-pcre2_substitute.Tpo src/$(DEPDIR)/libpcre2_8_la-pcre2_substitute.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/pcre2_substitute.c' object='src/libpcre2_8_la-pcre2_substitute.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_8_la_CFLAGS) $(CFLAGS) -c -o src/libpcre2_8_la-pcre2_substitute.lo `test -f 'src/pcre2_substitute.c' || echo '$(srcdir)/'`src/pcre2_substitute.c
+
+src/libpcre2_8_la-pcre2_substring.lo: src/pcre2_substring.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_8_la_CFLAGS) $(CFLAGS) -MT src/libpcre2_8_la-pcre2_substring.lo -MD -MP -MF src/$(DEPDIR)/libpcre2_8_la-pcre2_substring.Tpo -c -o src/libpcre2_8_la-pcre2_substring.lo `test -f 'src/pcre2_substring.c' || echo '$(srcdir)/'`src/pcre2_substring.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libpcre2_8_la-pcre2_substring.Tpo src/$(DEPDIR)/libpcre2_8_la-pcre2_substring.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/pcre2_substring.c' object='src/libpcre2_8_la-pcre2_substring.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_8_la_CFLAGS) $(CFLAGS) -c -o src/libpcre2_8_la-pcre2_substring.lo `test -f 'src/pcre2_substring.c' || echo '$(srcdir)/'`src/pcre2_substring.c
+
+src/libpcre2_8_la-pcre2_tables.lo: src/pcre2_tables.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_8_la_CFLAGS) $(CFLAGS) -MT src/libpcre2_8_la-pcre2_tables.lo -MD -MP -MF src/$(DEPDIR)/libpcre2_8_la-pcre2_tables.Tpo -c -o src/libpcre2_8_la-pcre2_tables.lo `test -f 'src/pcre2_tables.c' || echo '$(srcdir)/'`src/pcre2_tables.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libpcre2_8_la-pcre2_tables.Tpo src/$(DEPDIR)/libpcre2_8_la-pcre2_tables.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/pcre2_tables.c' object='src/libpcre2_8_la-pcre2_tables.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_8_la_CFLAGS) $(CFLAGS) -c -o src/libpcre2_8_la-pcre2_tables.lo `test -f 'src/pcre2_tables.c' || echo '$(srcdir)/'`src/pcre2_tables.c
+
+src/libpcre2_8_la-pcre2_ucd.lo: src/pcre2_ucd.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_8_la_CFLAGS) $(CFLAGS) -MT src/libpcre2_8_la-pcre2_ucd.lo -MD -MP -MF src/$(DEPDIR)/libpcre2_8_la-pcre2_ucd.Tpo -c -o src/libpcre2_8_la-pcre2_ucd.lo `test -f 'src/pcre2_ucd.c' || echo '$(srcdir)/'`src/pcre2_ucd.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libpcre2_8_la-pcre2_ucd.Tpo src/$(DEPDIR)/libpcre2_8_la-pcre2_ucd.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/pcre2_ucd.c' object='src/libpcre2_8_la-pcre2_ucd.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_8_la_CFLAGS) $(CFLAGS) -c -o src/libpcre2_8_la-pcre2_ucd.lo `test -f 'src/pcre2_ucd.c' || echo '$(srcdir)/'`src/pcre2_ucd.c
+
+src/libpcre2_8_la-pcre2_valid_utf.lo: src/pcre2_valid_utf.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_8_la_CFLAGS) $(CFLAGS) -MT src/libpcre2_8_la-pcre2_valid_utf.lo -MD -MP -MF src/$(DEPDIR)/libpcre2_8_la-pcre2_valid_utf.Tpo -c -o src/libpcre2_8_la-pcre2_valid_utf.lo `test -f 'src/pcre2_valid_utf.c' || echo '$(srcdir)/'`src/pcre2_valid_utf.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libpcre2_8_la-pcre2_valid_utf.Tpo src/$(DEPDIR)/libpcre2_8_la-pcre2_valid_utf.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/pcre2_valid_utf.c' object='src/libpcre2_8_la-pcre2_valid_utf.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_8_la_CFLAGS) $(CFLAGS) -c -o src/libpcre2_8_la-pcre2_valid_utf.lo `test -f 'src/pcre2_valid_utf.c' || echo '$(srcdir)/'`src/pcre2_valid_utf.c
+
+src/libpcre2_8_la-pcre2_xclass.lo: src/pcre2_xclass.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_8_la_CFLAGS) $(CFLAGS) -MT src/libpcre2_8_la-pcre2_xclass.lo -MD -MP -MF src/$(DEPDIR)/libpcre2_8_la-pcre2_xclass.Tpo -c -o src/libpcre2_8_la-pcre2_xclass.lo `test -f 'src/pcre2_xclass.c' || echo '$(srcdir)/'`src/pcre2_xclass.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libpcre2_8_la-pcre2_xclass.Tpo src/$(DEPDIR)/libpcre2_8_la-pcre2_xclass.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/pcre2_xclass.c' object='src/libpcre2_8_la-pcre2_xclass.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_8_la_CFLAGS) $(CFLAGS) -c -o src/libpcre2_8_la-pcre2_xclass.lo `test -f 'src/pcre2_xclass.c' || echo '$(srcdir)/'`src/pcre2_xclass.c
+
+src/libpcre2_8_la-pcre2_chartables.lo: src/pcre2_chartables.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_8_la_CFLAGS) $(CFLAGS) -MT src/libpcre2_8_la-pcre2_chartables.lo -MD -MP -MF src/$(DEPDIR)/libpcre2_8_la-pcre2_chartables.Tpo -c -o src/libpcre2_8_la-pcre2_chartables.lo `test -f 'src/pcre2_chartables.c' || echo '$(srcdir)/'`src/pcre2_chartables.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libpcre2_8_la-pcre2_chartables.Tpo src/$(DEPDIR)/libpcre2_8_la-pcre2_chartables.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/pcre2_chartables.c' object='src/libpcre2_8_la-pcre2_chartables.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_8_la_CFLAGS) $(CFLAGS) -c -o src/libpcre2_8_la-pcre2_chartables.lo `test -f 'src/pcre2_chartables.c' || echo '$(srcdir)/'`src/pcre2_chartables.c
+
+src/libpcre2_posix_la-pcre2posix.lo: src/pcre2posix.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_posix_la_CFLAGS) $(CFLAGS) -MT src/libpcre2_posix_la-pcre2posix.lo -MD -MP -MF src/$(DEPDIR)/libpcre2_posix_la-pcre2posix.Tpo -c -o src/libpcre2_posix_la-pcre2posix.lo `test -f 'src/pcre2posix.c' || echo '$(srcdir)/'`src/pcre2posix.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libpcre2_posix_la-pcre2posix.Tpo src/$(DEPDIR)/libpcre2_posix_la-pcre2posix.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/pcre2posix.c' object='src/libpcre2_posix_la-pcre2posix.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre2_posix_la_CFLAGS) $(CFLAGS) -c -o src/libpcre2_posix_la-pcre2posix.lo `test -f 'src/pcre2posix.c' || echo '$(srcdir)/'`src/pcre2posix.c
+
+src/pcre2_jit_test-pcre2_jit_test.o: src/pcre2_jit_test.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcre2_jit_test_CFLAGS) $(CFLAGS) -MT src/pcre2_jit_test-pcre2_jit_test.o -MD -MP -MF src/$(DEPDIR)/pcre2_jit_test-pcre2_jit_test.Tpo -c -o src/pcre2_jit_test-pcre2_jit_test.o `test -f 'src/pcre2_jit_test.c' || echo '$(srcdir)/'`src/pcre2_jit_test.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/pcre2_jit_test-pcre2_jit_test.Tpo src/$(DEPDIR)/pcre2_jit_test-pcre2_jit_test.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/pcre2_jit_test.c' object='src/pcre2_jit_test-pcre2_jit_test.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcre2_jit_test_CFLAGS) $(CFLAGS) -c -o src/pcre2_jit_test-pcre2_jit_test.o `test -f 'src/pcre2_jit_test.c' || echo '$(srcdir)/'`src/pcre2_jit_test.c
+
+src/pcre2_jit_test-pcre2_jit_test.obj: src/pcre2_jit_test.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcre2_jit_test_CFLAGS) $(CFLAGS) -MT src/pcre2_jit_test-pcre2_jit_test.obj -MD -MP -MF src/$(DEPDIR)/pcre2_jit_test-pcre2_jit_test.Tpo -c -o src/pcre2_jit_test-pcre2_jit_test.obj `if test -f 'src/pcre2_jit_test.c'; then $(CYGPATH_W) 'src/pcre2_jit_test.c'; else $(CYGPATH_W) '$(srcdir)/src/pcre2_jit_test.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/pcre2_jit_test-pcre2_jit_test.Tpo src/$(DEPDIR)/pcre2_jit_test-pcre2_jit_test.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/pcre2_jit_test.c' object='src/pcre2_jit_test-pcre2_jit_test.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcre2_jit_test_CFLAGS) $(CFLAGS) -c -o src/pcre2_jit_test-pcre2_jit_test.obj `if test -f 'src/pcre2_jit_test.c'; then $(CYGPATH_W) 'src/pcre2_jit_test.c'; else $(CYGPATH_W) '$(srcdir)/src/pcre2_jit_test.c'; fi`
+
+src/pcre2grep-pcre2grep.o: src/pcre2grep.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcre2grep_CFLAGS) $(CFLAGS) -MT src/pcre2grep-pcre2grep.o -MD -MP -MF src/$(DEPDIR)/pcre2grep-pcre2grep.Tpo -c -o src/pcre2grep-pcre2grep.o `test -f 'src/pcre2grep.c' || echo '$(srcdir)/'`src/pcre2grep.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/pcre2grep-pcre2grep.Tpo src/$(DEPDIR)/pcre2grep-pcre2grep.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/pcre2grep.c' object='src/pcre2grep-pcre2grep.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcre2grep_CFLAGS) $(CFLAGS) -c -o src/pcre2grep-pcre2grep.o `test -f 'src/pcre2grep.c' || echo '$(srcdir)/'`src/pcre2grep.c
+
+src/pcre2grep-pcre2grep.obj: src/pcre2grep.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcre2grep_CFLAGS) $(CFLAGS) -MT src/pcre2grep-pcre2grep.obj -MD -MP -MF src/$(DEPDIR)/pcre2grep-pcre2grep.Tpo -c -o src/pcre2grep-pcre2grep.obj `if test -f 'src/pcre2grep.c'; then $(CYGPATH_W) 'src/pcre2grep.c'; else $(CYGPATH_W) '$(srcdir)/src/pcre2grep.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/pcre2grep-pcre2grep.Tpo src/$(DEPDIR)/pcre2grep-pcre2grep.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/pcre2grep.c' object='src/pcre2grep-pcre2grep.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcre2grep_CFLAGS) $(CFLAGS) -c -o src/pcre2grep-pcre2grep.obj `if test -f 'src/pcre2grep.c'; then $(CYGPATH_W) 'src/pcre2grep.c'; else $(CYGPATH_W) '$(srcdir)/src/pcre2grep.c'; fi`
+
+src/pcre2test-pcre2test.o: src/pcre2test.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcre2test_CFLAGS) $(CFLAGS) -MT src/pcre2test-pcre2test.o -MD -MP -MF src/$(DEPDIR)/pcre2test-pcre2test.Tpo -c -o src/pcre2test-pcre2test.o `test -f 'src/pcre2test.c' || echo '$(srcdir)/'`src/pcre2test.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/pcre2test-pcre2test.Tpo src/$(DEPDIR)/pcre2test-pcre2test.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/pcre2test.c' object='src/pcre2test-pcre2test.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcre2test_CFLAGS) $(CFLAGS) -c -o src/pcre2test-pcre2test.o `test -f 'src/pcre2test.c' || echo '$(srcdir)/'`src/pcre2test.c
+
+src/pcre2test-pcre2test.obj: src/pcre2test.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcre2test_CFLAGS) $(CFLAGS) -MT src/pcre2test-pcre2test.obj -MD -MP -MF src/$(DEPDIR)/pcre2test-pcre2test.Tpo -c -o src/pcre2test-pcre2test.obj `if test -f 'src/pcre2test.c'; then $(CYGPATH_W) 'src/pcre2test.c'; else $(CYGPATH_W) '$(srcdir)/src/pcre2test.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/pcre2test-pcre2test.Tpo src/$(DEPDIR)/pcre2test-pcre2test.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/pcre2test.c' object='src/pcre2test-pcre2test.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcre2test_CFLAGS) $(CFLAGS) -c -o src/pcre2test-pcre2test.obj `if test -f 'src/pcre2test.c'; then $(CYGPATH_W) 'src/pcre2test.c'; else $(CYGPATH_W) '$(srcdir)/src/pcre2test.c'; fi`
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+	-rm -rf src/.libs src/_libs
+
+distclean-libtool:
+	-rm -f libtool config.lt
+install-man1: $(dist_man_MANS)
+	@$(NORMAL_INSTALL)
+	@list1=''; \
+	list2='$(dist_man_MANS)'; \
+	test -n "$(man1dir)" \
+	  && test -n "`echo $$list1$$list2`" \
+	  || exit 0; \
+	echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \
+	$(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \
+	{ for i in $$list1; do echo "$$i"; done;  \
+	if test -n "$$list2"; then \
+	  for i in $$list2; do echo "$$i"; done \
+	    | sed -n '/\.1[a-z]*$$/p'; \
+	fi; \
+	} | while read p; do \
+	  if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; echo "$$p"; \
+	done | \
+	sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+	      -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \
+	sed 'N;N;s,\n, ,g' | { \
+	list=; while read file base inst; do \
+	  if test "$$base" = "$$inst"; then list="$$list $$file"; else \
+	    echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \
+	    $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \
+	  fi; \
+	done; \
+	for i in $$list; do echo "$$i"; done | $(am__base_list) | \
+	while read files; do \
+	  test -z "$$files" || { \
+	    echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \
+	    $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \
+	done; }
+
+uninstall-man1:
+	@$(NORMAL_UNINSTALL)
+	@list=''; test -n "$(man1dir)" || exit 0; \
+	files=`{ for i in $$list; do echo "$$i"; done; \
+	l2='$(dist_man_MANS)'; for i in $$l2; do echo "$$i"; done | \
+	  sed -n '/\.1[a-z]*$$/p'; \
+	} | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+	      -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
+	dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir)
+install-man3: $(dist_man_MANS)
+	@$(NORMAL_INSTALL)
+	@list1=''; \
+	list2='$(dist_man_MANS)'; \
+	test -n "$(man3dir)" \
+	  && test -n "`echo $$list1$$list2`" \
+	  || exit 0; \
+	echo " $(MKDIR_P) '$(DESTDIR)$(man3dir)'"; \
+	$(MKDIR_P) "$(DESTDIR)$(man3dir)" || exit 1; \
+	{ for i in $$list1; do echo "$$i"; done;  \
+	if test -n "$$list2"; then \
+	  for i in $$list2; do echo "$$i"; done \
+	    | sed -n '/\.3[a-z]*$$/p'; \
+	fi; \
+	} | while read p; do \
+	  if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; echo "$$p"; \
+	done | \
+	sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^3][0-9a-z]*$$,3,;x' \
+	      -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \
+	sed 'N;N;s,\n, ,g' | { \
+	list=; while read file base inst; do \
+	  if test "$$base" = "$$inst"; then list="$$list $$file"; else \
+	    echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man3dir)/$$inst'"; \
+	    $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man3dir)/$$inst" || exit $$?; \
+	  fi; \
+	done; \
+	for i in $$list; do echo "$$i"; done | $(am__base_list) | \
+	while read files; do \
+	  test -z "$$files" || { \
+	    echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man3dir)'"; \
+	    $(INSTALL_DATA) $$files "$(DESTDIR)$(man3dir)" || exit $$?; }; \
+	done; }
+
+uninstall-man3:
+	@$(NORMAL_UNINSTALL)
+	@list=''; test -n "$(man3dir)" || exit 0; \
+	files=`{ for i in $$list; do echo "$$i"; done; \
+	l2='$(dist_man_MANS)'; for i in $$l2; do echo "$$i"; done | \
+	  sed -n '/\.3[a-z]*$$/p'; \
+	} | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^3][0-9a-z]*$$,3,;x' \
+	      -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
+	dir='$(DESTDIR)$(man3dir)'; $(am__uninstall_files_from_dir)
+install-dist_docDATA: $(dist_doc_DATA)
+	@$(NORMAL_INSTALL)
+	@list='$(dist_doc_DATA)'; test -n "$(docdir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(docdir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(docdir)" || exit 1; \
+	fi; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(docdir)'"; \
+	  $(INSTALL_DATA) $$files "$(DESTDIR)$(docdir)" || exit $$?; \
+	done
+
+uninstall-dist_docDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(dist_doc_DATA)'; test -n "$(docdir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	dir='$(DESTDIR)$(docdir)'; $(am__uninstall_files_from_dir)
+install-dist_htmlDATA: $(dist_html_DATA)
+	@$(NORMAL_INSTALL)
+	@list='$(dist_html_DATA)'; test -n "$(htmldir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(htmldir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(htmldir)" || exit 1; \
+	fi; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(htmldir)'"; \
+	  $(INSTALL_DATA) $$files "$(DESTDIR)$(htmldir)" || exit $$?; \
+	done
+
+uninstall-dist_htmlDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(dist_html_DATA)'; test -n "$(htmldir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	dir='$(DESTDIR)$(htmldir)'; $(am__uninstall_files_from_dir)
+install-pkgconfigDATA: $(pkgconfig_DATA)
+	@$(NORMAL_INSTALL)
+	@list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(pkgconfigdir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" || exit 1; \
+	fi; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \
+	  $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \
+	done
+
+uninstall-pkgconfigDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	dir='$(DESTDIR)$(pkgconfigdir)'; $(am__uninstall_files_from_dir)
+install-includeHEADERS: $(include_HEADERS)
+	@$(NORMAL_INSTALL)
+	@list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(includedir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(includedir)" || exit 1; \
+	fi; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includedir)'"; \
+	  $(INSTALL_HEADER) $$files "$(DESTDIR)$(includedir)" || exit $$?; \
+	done
+
+uninstall-includeHEADERS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir)
+install-nodist_includeHEADERS: $(nodist_include_HEADERS)
+	@$(NORMAL_INSTALL)
+	@list='$(nodist_include_HEADERS)'; test -n "$(includedir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(includedir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(includedir)" || exit 1; \
+	fi; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includedir)'"; \
+	  $(INSTALL_HEADER) $$files "$(DESTDIR)$(includedir)" || exit $$?; \
+	done
+
+uninstall-nodist_includeHEADERS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(nodist_include_HEADERS)'; test -n "$(includedir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir)
+
+ID: $(am__tagged_files)
+	$(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	set x; \
+	here=`pwd`; \
+	$(am__define_uniq_tagged_files); \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	$(am__define_uniq_tagged_files); \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+cscope: cscope.files
+	test ! -s cscope.files \
+	  || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS)
+clean-cscope:
+	-rm -f cscope.files
+cscope.files: clean-cscope cscopelist
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+	list='$(am__tagged_files)'; \
+	case "$(srcdir)" in \
+	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+	  *) sdir=$(subdir)/$(srcdir) ;; \
+	esac; \
+	for i in $$list; do \
+	  if test -f "$$i"; then \
+	    echo "$(subdir)/$$i"; \
+	  else \
+	    echo "$$sdir/$$i"; \
+	  fi; \
+	done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+	-rm -f cscope.out cscope.in.out cscope.po.out cscope.files
+
+# Recover from deleted '.trs' file; this should ensure that
+# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
+# both 'foo.log' and 'foo.trs'.  Break the recipe in two subshells
+# to avoid problems with "make -n".
+.log.trs:
+	rm -f $< $@
+	$(MAKE) $(AM_MAKEFLAGS) $<
+
+# Leading 'am--fnord' is there to ensure the list of targets does not
+# expand to empty, as could happen e.g. with make check TESTS=''.
+am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
+am--force-recheck:
+	@:
+
+$(TEST_SUITE_LOG): $(TEST_LOGS)
+	@$(am__set_TESTS_bases); \
+	am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
+	redo_bases=`for i in $$bases; do \
+	              am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
+	            done`; \
+	if test -n "$$redo_bases"; then \
+	  redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
+	  redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
+	  if $(am__make_dryrun); then :; else \
+	    rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
+	  fi; \
+	fi; \
+	if test -n "$$am__remaking_logs"; then \
+	  echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
+	       "recursion detected" >&2; \
+	elif test -n "$$redo_logs"; then \
+	  am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
+	fi; \
+	if $(am__make_dryrun); then :; else \
+	  st=0;  \
+	  errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
+	  for i in $$redo_bases; do \
+	    test -f $$i.trs && test -r $$i.trs \
+	      || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
+	    test -f $$i.log && test -r $$i.log \
+	      || { echo "$$errmsg $$i.log" >&2; st=1; }; \
+	  done; \
+	  test $$st -eq 0 || exit 1; \
+	fi
+	@$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
+	ws='[ 	]'; \
+	results=`for b in $$bases; do echo $$b.trs; done`; \
+	test -n "$$results" || results=/dev/null; \
+	all=`  grep "^$$ws*:test-result:"           $$results | wc -l`; \
+	pass=` grep "^$$ws*:test-result:$$ws*PASS"  $$results | wc -l`; \
+	fail=` grep "^$$ws*:test-result:$$ws*FAIL"  $$results | wc -l`; \
+	skip=` grep "^$$ws*:test-result:$$ws*SKIP"  $$results | wc -l`; \
+	xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
+	xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
+	error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
+	if test `expr $$fail + $$xpass + $$error` -eq 0; then \
+	  success=true; \
+	else \
+	  success=false; \
+	fi; \
+	br='==================='; br=$$br$$br$$br$$br; \
+	result_count () \
+	{ \
+	    if test x"$$1" = x"--maybe-color"; then \
+	      maybe_colorize=yes; \
+	    elif test x"$$1" = x"--no-color"; then \
+	      maybe_colorize=no; \
+	    else \
+	      echo "$@: invalid 'result_count' usage" >&2; exit 4; \
+	    fi; \
+	    shift; \
+	    desc=$$1 count=$$2; \
+	    if test $$maybe_colorize = yes && test $$count -gt 0; then \
+	      color_start=$$3 color_end=$$std; \
+	    else \
+	      color_start= color_end=; \
+	    fi; \
+	    echo "$${color_start}# $$desc $$count$${color_end}"; \
+	}; \
+	create_testsuite_report () \
+	{ \
+	  result_count $$1 "TOTAL:" $$all   "$$brg"; \
+	  result_count $$1 "PASS: " $$pass  "$$grn"; \
+	  result_count $$1 "SKIP: " $$skip  "$$blu"; \
+	  result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
+	  result_count $$1 "FAIL: " $$fail  "$$red"; \
+	  result_count $$1 "XPASS:" $$xpass "$$red"; \
+	  result_count $$1 "ERROR:" $$error "$$mgn"; \
+	}; \
+	{								\
+	  echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" |	\
+	    $(am__rst_title);						\
+	  create_testsuite_report --no-color;				\
+	  echo;								\
+	  echo ".. contents:: :depth: 2";				\
+	  echo;								\
+	  for b in $$bases; do echo $$b; done				\
+	    | $(am__create_global_log);					\
+	} >$(TEST_SUITE_LOG).tmp || exit 1;				\
+	mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG);			\
+	if $$success; then						\
+	  col="$$grn";							\
+	 else								\
+	  col="$$red";							\
+	  test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG);		\
+	fi;								\
+	echo "$${col}$$br$${std}"; 					\
+	echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}";	\
+	echo "$${col}$$br$${std}"; 					\
+	create_testsuite_report --maybe-color;				\
+	echo "$$col$$br$$std";						\
+	if $$success; then :; else					\
+	  echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}";		\
+	  if test -n "$(PACKAGE_BUGREPORT)"; then			\
+	    echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}";	\
+	  fi;								\
+	  echo "$$col$$br$$std";					\
+	fi;								\
+	$$success || exit 1
+
+check-TESTS:
+	@list='$(RECHECK_LOGS)';           test -z "$$list" || rm -f $$list
+	@list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
+	@test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+	@set +e; $(am__set_TESTS_bases); \
+	log_list=`for i in $$bases; do echo $$i.log; done`; \
+	trs_list=`for i in $$bases; do echo $$i.trs; done`; \
+	log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
+	$(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
+	exit $$?;
+recheck: all $(check_SCRIPTS)
+	@test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+	@set +e; $(am__set_TESTS_bases); \
+	bases=`for i in $$bases; do echo $$i; done \
+	         | $(am__list_recheck_tests)` || exit 1; \
+	log_list=`for i in $$bases; do echo $$i.log; done`; \
+	log_list=`echo $$log_list`; \
+	$(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
+	        am__force_recheck=am--force-recheck \
+	        TEST_LOGS="$$log_list"; \
+	exit $$?
+pcre2_jit_test.log: pcre2_jit_test$(EXEEXT)
+	@p='pcre2_jit_test$(EXEEXT)'; \
+	b='pcre2_jit_test'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+RunTest.log: RunTest
+	@p='RunTest'; \
+	b='RunTest'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+RunGrepTest.log: RunGrepTest
+	@p='RunGrepTest'; \
+	b='RunGrepTest'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+.test.log:
+	@p='$<'; \
+	$(am__set_b); \
+	$(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+@am__EXEEXT_TRUE@.test$(EXEEXT).log:
+@am__EXEEXT_TRUE@	@p='$<'; \
+@am__EXEEXT_TRUE@	$(am__set_b); \
+@am__EXEEXT_TRUE@	$(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+@am__EXEEXT_TRUE@	--log-file $$b.log --trs-file $$b.trs \
+@am__EXEEXT_TRUE@	$(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+@am__EXEEXT_TRUE@	"$$tst" $(AM_TESTS_FD_REDIRECT)
+
+distdir: $(DISTFILES)
+	$(am__remove_distdir)
+	test -d "$(distdir)" || mkdir "$(distdir)"
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+	-test -n "$(am__skip_mode_fix)" \
+	|| find "$(distdir)" -type d ! -perm -755 \
+		-exec chmod u+rwx,go+rx {} \; -o \
+	  ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
+	  ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
+	  ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
+	|| chmod -R a+r "$(distdir)"
+dist-gzip: distdir
+	tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+	$(am__post_remove_distdir)
+dist-bzip2: distdir
+	tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2
+	$(am__post_remove_distdir)
+
+dist-lzip: distdir
+	tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz
+	$(am__post_remove_distdir)
+
+dist-xz: distdir
+	tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz
+	$(am__post_remove_distdir)
+
+dist-tarZ: distdir
+	@echo WARNING: "Support for distribution archives compressed with" \
+		       "legacy program 'compress' is deprecated." >&2
+	@echo WARNING: "It will be removed altogether in Automake 2.0" >&2
+	tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
+	$(am__post_remove_distdir)
+
+dist-shar: distdir
+	@echo WARNING: "Support for shar distribution archives is" \
+	               "deprecated." >&2
+	@echo WARNING: "It will be removed altogether in Automake 2.0" >&2
+	shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
+	$(am__post_remove_distdir)
+dist-zip: distdir
+	-rm -f $(distdir).zip
+	zip -rq $(distdir).zip $(distdir)
+	$(am__post_remove_distdir)
+
+dist dist-all:
+	$(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:'
+	$(am__post_remove_distdir)
+
+# This target untars the dist file and tries a VPATH configuration.  Then
+# it guarantees that the distribution is self-contained by making another
+# tarfile.
+distcheck: dist
+	case '$(DIST_ARCHIVES)' in \
+	*.tar.gz*) \
+	  GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\
+	*.tar.bz2*) \
+	  bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
+	*.tar.lz*) \
+	  lzip -dc $(distdir).tar.lz | $(am__untar) ;;\
+	*.tar.xz*) \
+	  xz -dc $(distdir).tar.xz | $(am__untar) ;;\
+	*.tar.Z*) \
+	  uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
+	*.shar.gz*) \
+	  GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\
+	*.zip*) \
+	  unzip $(distdir).zip ;;\
+	esac
+	chmod -R a-w $(distdir)
+	chmod u+w $(distdir)
+	mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst
+	chmod a-w $(distdir)
+	test -d $(distdir)/_build || exit 0; \
+	dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
+	  && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
+	  && am__cwd=`pwd` \
+	  && $(am__cd) $(distdir)/_build/sub \
+	  && ../../configure \
+	    $(AM_DISTCHECK_CONFIGURE_FLAGS) \
+	    $(DISTCHECK_CONFIGURE_FLAGS) \
+	    --srcdir=../.. --prefix="$$dc_install_base" \
+	  && $(MAKE) $(AM_MAKEFLAGS) \
+	  && $(MAKE) $(AM_MAKEFLAGS) dvi \
+	  && $(MAKE) $(AM_MAKEFLAGS) check \
+	  && $(MAKE) $(AM_MAKEFLAGS) install \
+	  && $(MAKE) $(AM_MAKEFLAGS) installcheck \
+	  && $(MAKE) $(AM_MAKEFLAGS) uninstall \
+	  && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
+	        distuninstallcheck \
+	  && chmod -R a-w "$$dc_install_base" \
+	  && ({ \
+	       (cd ../.. && umask 077 && mkdir "$$dc_destdir") \
+	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
+	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
+	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
+	            distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
+	      } || { rm -rf "$$dc_destdir"; exit 1; }) \
+	  && rm -rf "$$dc_destdir" \
+	  && $(MAKE) $(AM_MAKEFLAGS) dist \
+	  && rm -rf $(DIST_ARCHIVES) \
+	  && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \
+	  && cd "$$am__cwd" \
+	  || exit 1
+	$(am__post_remove_distdir)
+	@(echo "$(distdir) archives ready for distribution: "; \
+	  list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
+	  sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
+distuninstallcheck:
+	@test -n '$(distuninstallcheck_dir)' || { \
+	  echo 'ERROR: trying to run $@ with an empty' \
+	       '$$(distuninstallcheck_dir)' >&2; \
+	  exit 1; \
+	}; \
+	$(am__cd) '$(distuninstallcheck_dir)' || { \
+	  echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \
+	  exit 1; \
+	}; \
+	test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \
+	   || { echo "ERROR: files left after uninstall:" ; \
+	        if test -n "$(DESTDIR)"; then \
+	          echo "  (check DESTDIR support)"; \
+	        fi ; \
+	        $(distuninstallcheck_listfiles) ; \
+	        exit 1; } >&2
+distcleancheck: distclean
+	@if test '$(srcdir)' = . ; then \
+	  echo "ERROR: distcleancheck can only run from a VPATH build" ; \
+	  exit 1 ; \
+	fi
+	@test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
+	  || { echo "ERROR: files left in build directory after distclean:" ; \
+	       $(distcleancheck_listfiles) ; \
+	       exit 1; } >&2
+check-am: all-am
+	$(MAKE) $(AM_MAKEFLAGS) $(check_SCRIPTS)
+	$(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) check-am
+all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(SCRIPTS) $(MANS) $(DATA) \
+		$(HEADERS)
+install-binPROGRAMS: install-libLTLIBRARIES
+
+installdirs:
+	for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(man3dir)" "$(DESTDIR)$(docdir)" "$(DESTDIR)$(htmldir)" "$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(includedir)" "$(DESTDIR)$(includedir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+	-test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
+	-test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
+	-test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+	-rm -f src/$(DEPDIR)/$(am__dirstamp)
+	-rm -f src/$(am__dirstamp)
+	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+	-test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
+	-test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
+@WITH_GCOV_FALSE@clean-local:
+clean: clean-am
+
+clean-am: clean-binPROGRAMS clean-generic clean-libLTLIBRARIES \
+	clean-libtool clean-local clean-noinstPROGRAMS mostlyclean-am
+
+distclean: distclean-am
+	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
+	-rm -rf src/$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-hdr distclean-libtool distclean-local distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-dist_docDATA install-dist_htmlDATA \
+	install-includeHEADERS install-man \
+	install-nodist_includeHEADERS install-pkgconfigDATA
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-binPROGRAMS install-binSCRIPTS \
+	install-libLTLIBRARIES
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man: install-man1 install-man3
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
+	-rm -rf $(top_srcdir)/autom4te.cache
+	-rm -rf src/$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-binSCRIPTS \
+	uninstall-dist_docDATA uninstall-dist_htmlDATA \
+	uninstall-includeHEADERS uninstall-libLTLIBRARIES \
+	uninstall-man uninstall-nodist_includeHEADERS \
+	uninstall-pkgconfigDATA
+
+uninstall-man: uninstall-man1 uninstall-man3
+
+.MAKE: all check check-am install install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am am--refresh check check-TESTS \
+	check-am clean clean-binPROGRAMS clean-cscope clean-generic \
+	clean-libLTLIBRARIES clean-libtool clean-local \
+	clean-noinstPROGRAMS cscope cscopelist-am ctags ctags-am dist \
+	dist-all dist-bzip2 dist-gzip dist-lzip dist-shar dist-tarZ \
+	dist-xz dist-zip distcheck distclean distclean-compile \
+	distclean-generic distclean-hdr distclean-libtool \
+	distclean-local distclean-tags distcleancheck distdir \
+	distuninstallcheck dvi dvi-am html html-am info info-am \
+	install install-am install-binPROGRAMS install-binSCRIPTS \
+	install-data install-data-am install-dist_docDATA \
+	install-dist_htmlDATA install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am \
+	install-includeHEADERS install-info install-info-am \
+	install-libLTLIBRARIES install-man install-man1 install-man3 \
+	install-nodist_includeHEADERS install-pdf install-pdf-am \
+	install-pkgconfigDATA install-ps install-ps-am install-strip \
+	installcheck installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	recheck tags tags-am uninstall uninstall-am \
+	uninstall-binPROGRAMS uninstall-binSCRIPTS \
+	uninstall-dist_docDATA uninstall-dist_htmlDATA \
+	uninstall-includeHEADERS uninstall-libLTLIBRARIES \
+	uninstall-man uninstall-man1 uninstall-man3 \
+	uninstall-nodist_includeHEADERS uninstall-pkgconfigDATA
+
+.PRECIOUS: Makefile
+
+
+# The only difference between pcre2.h.in and pcre2.h is the setting of the PCRE
+# version number. Therefore, we can create the generic version just by copying.
+
+src/pcre2.h.generic: src/pcre2.h.in configure.ac
+	rm -f $@
+	cp -p src/pcre2.h $@
+
+# It is more complicated for config.h.generic. We need the version that results
+# from a default configuration so as to get all the default values for PCRE
+# configuration macros such as MATCH_LIMIT and NEWLINE. We can get this by
+# doing a configure in a temporary directory. However, some trickery is needed,
+# because the source directory may already be configured. If you just try
+# running configure in a new directory, it complains. For this reason, we move
+# config.status out of the way while doing the default configuration. The
+# resulting config.h is munged by perl to put #ifdefs round any #defines for
+# macros with values, and to #undef all boolean macros such as HAVE_xxx and
+# SUPPORT_xxx. We also get rid of any gcc-specific visibility settings. Make
+# sure that PCRE2_EXP_DEFN is unset (in case it has visibility settings).
+
+src/config.h.generic: configure.ac
+	rm -rf $@ _generic
+	mkdir _generic
+	cs=$(srcdir)/config.status; test ! -f $$cs || mv -f $$cs $$cs.aside
+	cd _generic && $(abs_top_srcdir)/configure || :
+	cs=$(srcdir)/config.status; test ! -f $$cs.aside || mv -f $$cs.aside $$cs
+	test -f _generic/src/config.h
+	perl -n \
+	  -e 'BEGIN{$$blank=0;}' \
+	  -e 'if(/PCRE2_EXP_DEFN/){print"/* #undef PCRE2_EXP_DEFN */\n";$$blank=0;next;}' \
+	  -e 'if(/to make a symbol visible/){next;}' \
+	  -e 'if(/__attribute__ \(\(visibility/){next;}' \
+	  -e 'if(/LT_OBJDIR/){print"/* This is ignored unless you are using libtool. */\n";}' \
+	  -e 'if(/^#define\s((?:HAVE|SUPPORT|STDC)_\w+)/){print"/* #undef $$1 */\n";$$blank=0;next;}' \
+	  -e 'if(/^#define\s(?!PACKAGE|VERSION)(\w+)/){print"#ifndef $$1\n$$_#endif\n";$$blank=0;next;}' \
+	  -e 'if(/^\s*$$/){print unless $$blank; $$blank=1;} else{print;$$blank=0;}' \
+	  _generic/src/config.h >$@
+	rm -rf _generic
+@WITH_REBUILD_CHARTABLES_TRUE@src/pcre2_chartables.c: dftables$(EXEEXT)
+@WITH_REBUILD_CHARTABLES_TRUE@	rm -f $@
+@WITH_REBUILD_CHARTABLES_TRUE@	./dftables$(EXEEXT) $@
+@WITH_REBUILD_CHARTABLES_FALSE@src/pcre2_chartables.c: $(srcdir)/src/pcre2_chartables.c.dist
+@WITH_REBUILD_CHARTABLES_FALSE@	rm -f $@
+@WITH_REBUILD_CHARTABLES_FALSE@	$(LN_S) $(abs_srcdir)/src/pcre2_chartables.c.dist $(abs_builddir)/src/pcre2_chartables.c
+
+@WITH_GCOV_TRUE@coverage-check: all
+@WITH_GCOV_TRUE@	-$(MAKE) $(AM_MAKEFLAGS) -k check
+
+@WITH_GCOV_TRUE@coverage-baseline:
+@WITH_GCOV_TRUE@	$(LCOV) $(coverage_quiet) \
+@WITH_GCOV_TRUE@		--directory $(top_builddir) \
+@WITH_GCOV_TRUE@		--output-file "$(COVERAGE_OUTPUT_FILE)" \
+@WITH_GCOV_TRUE@		--capture \
+@WITH_GCOV_TRUE@		--initial
+
+@WITH_GCOV_TRUE@coverage-report:
+@WITH_GCOV_TRUE@	$(LCOV) $(coverage_quiet) \
+@WITH_GCOV_TRUE@		--directory $(top_builddir) \
+@WITH_GCOV_TRUE@		--capture \
+@WITH_GCOV_TRUE@		--output-file "$(COVERAGE_OUTPUT_FILE).tmp" \
+@WITH_GCOV_TRUE@		--test-name "$(COVERAGE_TEST_NAME)" \
+@WITH_GCOV_TRUE@		--no-checksum \
+@WITH_GCOV_TRUE@		--compat-libtool \
+@WITH_GCOV_TRUE@		$(COVERAGE_LCOV_EXTRA_FLAGS)
+@WITH_GCOV_TRUE@	$(LCOV) $(coverage_quiet) \
+@WITH_GCOV_TRUE@		--directory $(top_builddir) \
+@WITH_GCOV_TRUE@		--output-file "$(COVERAGE_OUTPUT_FILE)" \
+@WITH_GCOV_TRUE@		--remove "$(COVERAGE_OUTPUT_FILE).tmp" \
+@WITH_GCOV_TRUE@		"/tmp/*" \
+@WITH_GCOV_TRUE@		"/usr/include/*" \
+@WITH_GCOV_TRUE@		"$(includedir)/*"
+@WITH_GCOV_TRUE@	-@rm -f "$(COVERAGE_OUTPUT_FILE).tmp"
+@WITH_GCOV_TRUE@	LANG=C $(GENHTML) $(coverage_quiet) \
+@WITH_GCOV_TRUE@		--prefix $(top_builddir) \
+@WITH_GCOV_TRUE@		--output-directory "$(COVERAGE_OUTPUT_DIR)" \
+@WITH_GCOV_TRUE@		--title "$(PACKAGE) $(VERSION) Code Coverage Report" \
+@WITH_GCOV_TRUE@		--show-details "$(COVERAGE_OUTPUT_FILE)" \
+@WITH_GCOV_TRUE@		--legend \
+@WITH_GCOV_TRUE@		$(COVERAGE_GENHTML_EXTRA_FLAGS)
+@WITH_GCOV_TRUE@	@echo "Code coverage report written to file://$(abs_builddir)/$(COVERAGE_OUTPUT_DIR)/index.html"
+
+@WITH_GCOV_TRUE@coverage-reset:
+@WITH_GCOV_TRUE@	-$(LCOV) $(coverage_quiet) --zerocounters --directory $(top_builddir)
+
+@WITH_GCOV_TRUE@coverage-clean-report:
+@WITH_GCOV_TRUE@	-rm -f "$(COVERAGE_OUTPUT_FILE)" "$(COVERAGE_OUTPUT_FILE).tmp"
+@WITH_GCOV_TRUE@	-rm -rf "$(COVERAGE_OUTPUT_DIR)"
+
+@WITH_GCOV_TRUE@coverage-clean-data:
+@WITH_GCOV_TRUE@	-find $(top_builddir) -name "*.gcda" -delete
+
+@WITH_GCOV_TRUE@coverage-clean: coverage-reset coverage-clean-report coverage-clean-data
+@WITH_GCOV_TRUE@	-find $(top_builddir) -name "*.gcno" -delete
+
+@WITH_GCOV_TRUE@coverage-distclean: coverage-clean
+
+@WITH_GCOV_TRUE@coverage: coverage-reset coverage-baseline coverage-check coverage-report
+@WITH_GCOV_TRUE@clean-local: coverage-clean
+@WITH_GCOV_TRUE@distclean-local: coverage-distclean
+
+@WITH_GCOV_TRUE@.PHONY: coverage coverage-baseline coverage-check coverage-report coverage-reset coverage-clean-report coverage-clean-data coverage-clean coverage-distclean
+
+# Without coverage support, still arrange for 'make distclean' to get rid of
+# any coverage files that may have been left from a different configuration.
+
+@WITH_GCOV_FALSE@coverage:
+@WITH_GCOV_FALSE@	@echo "Configuring with --enable-coverage is required to generate code coverage report."
+
+@WITH_GCOV_FALSE@distclean-local:
+@WITH_GCOV_FALSE@	rm -rf $(PACKAGE)-$(VERSION)-coverage*
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/dist2/NEWS b/dist2/NEWS
new file mode 100644
index 0000000..aaeee5c
--- /dev/null
+++ b/dist2/NEWS
@@ -0,0 +1,88 @@
+News about PCRE2 releases
+-------------------------
+
+Version 10.21 12-January-2016
+-----------------------------
+
+1. Many bugs have been fixed. A large number of them were provoked only by very
+strange pattern input, and were discovered by fuzzers. Some others were
+discovered by code auditing. See ChangeLog for details.
+
+2. The Unicode tables have been updated to Unicode version 8.0.0.
+
+3. For Perl compatibility in EBCDIC environments, ranges such as a-z in a
+class, where both values are literal letters in the same case, omit the
+non-letter EBCDIC code points within the range.
+
+4. There have been a number of enhancements to the pcre2_substitute() function,
+giving more flexibility to replacement facilities. It is now also possible to
+cause the function to return the needed buffer size if the one given is too
+small.
+
+5. The PCRE2_ALT_VERBNAMES option causes the "name" parts of special verbs such
+as (*THEN:name) to be processed for backslashes and to take note of
+PCRE2_EXTENDED.
+
+6. PCRE2_INFO_HASBACKSLASHC makes it possible for a client to find out if a
+pattern uses \C, and --never-backslash-C makes it possible to compile a version
+PCRE2 in which the use of \C is always forbidden.
+
+7. A limit to the length of pattern that can be handled can now be set by
+calling pcre2_set_max_pattern_length().
+
+8. When matching an unanchored pattern, a match can be required to begin within
+a given number of code units after the start of the subject by calling
+pcre2_set_offset_limit().
+
+9. The pcre2test program has been extended to test new facilities, and it can
+now run the tests when LF on its own is not a valid newline sequence.
+
+10. The RunTest script has also been updated to enable more tests to be run.
+
+11. There have been some minor performance enhancements.
+
+
+Version 10.20 30-June-2015
+--------------------------
+
+1. Callouts with string arguments and the pcre2_callout_enumerate() function
+have been implemented.
+
+2. The PCRE2_NEVER_BACKSLASH_C option, which locks out the use of \C, is added.
+
+3. The PCRE2_ALT_CIRCUMFLEX option lets ^ match after a newline at the end of a
+subject in multiline mode.
+
+4. The way named subpatterns are handled has been refactored. The previous
+approach had several bugs.
+
+5. The handling of \c in EBCDIC environments has been changed to conform to the
+perlebcdic document. This is an incompatible change.
+
+6. Bugs have been mended, many of them discovered by fuzzers.
+
+
+Version 10.10 06-March-2015
+---------------------------
+
+1. Serialization and de-serialization functions have been added to the API,
+making it possible to save and restore sets of compiled patterns, though
+restoration must be done in the same environment that was used for compilation.
+
+2. The (*NO_JIT) feature has been added; this makes it possible for a pattern
+creator to specify that JIT is not to be used.
+
+3. A number of bugs have been fixed. In particular, bugs that caused building
+on Windows using CMake to fail have been mended.
+
+
+Version 10.00 05-January-2015
+-----------------------------
+
+Version 10.00 is the first release of PCRE2, a revised API for the PCRE
+library. Changes prior to 10.00 are logged in the ChangeLog file for the old
+API, up to item 20 for release 8.36. New programs are recommended to use the
+new library. Programs that use the original (PCRE1) API will need changing
+before linking with the new library.
+
+****
diff --git a/dist2/NON-AUTOTOOLS-BUILD b/dist2/NON-AUTOTOOLS-BUILD
new file mode 100644
index 0000000..ceb9245
--- /dev/null
+++ b/dist2/NON-AUTOTOOLS-BUILD
@@ -0,0 +1,392 @@
+Building PCRE2 without using autotools
+--------------------------------------
+
+This document has been converted from the PCRE1 document. I have removed a
+number of sections about building in various environments, as they applied only
+to PCRE1 and are probably out of date.
+
+This document contains the following sections:
+
+  General
+  Generic instructions for the PCRE2 C library
+  Stack size in Windows environments
+  Linking programs in Windows environments
+  Calling conventions in Windows environments
+  Comments about Win32 builds
+  Building PCRE2 on Windows with CMake
+  Testing with RunTest.bat
+  Building PCRE2 on native z/OS and z/VM
+
+
+GENERAL
+
+The basic PCRE2 library consists entirely of code written in Standard C, and so
+should compile successfully on any system that has a Standard C compiler and
+library.
+
+The PCRE2 distribution includes a "configure" file for use by the
+configure/make (autotools) build system, as found in many Unix-like
+environments. The README file contains information about the options for
+"configure".
+
+There is also support for CMake, which some users prefer, especially in Windows
+environments, though it can also be run in Unix-like environments. See the
+section entitled "Building PCRE2 on Windows with CMake" below.
+
+Versions of src/config.h and src/pcre2.h are distributed in the PCRE2 tarballs
+under the names src/config.h.generic and src/pcre2.h.generic. These are
+provided for those who build PCRE2 without using "configure" or CMake. If you
+use "configure" or CMake, the .generic versions are not used.
+
+
+GENERIC INSTRUCTIONS FOR THE PCRE2 C LIBRARY
+
+The following are generic instructions for building the PCRE2 C library "by
+hand". If you are going to use CMake, this section does not apply to you; you
+can skip ahead to the CMake section.
+
+ (1) Copy or rename the file src/config.h.generic as src/config.h, and edit the
+     macro settings that it contains to whatever is appropriate for your
+     environment. In particular, you can alter the definition of the NEWLINE
+     macro to specify what character(s) you want to be interpreted as line
+     terminators.
+
+     When you compile any of the PCRE2 modules, you must specify
+     -DHAVE_CONFIG_H to your compiler so that src/config.h is included in the
+     sources.
+
+     An alternative approach is not to edit src/config.h, but to use -D on the
+     compiler command line to make any changes that you need to the
+     configuration options. In this case -DHAVE_CONFIG_H must not be set.
+
+     NOTE: There have been occasions when the way in which certain parameters
+     in src/config.h are used has changed between releases. (In the
+     configure/make world, this is handled automatically.) When upgrading to a
+     new release, you are strongly advised to review src/config.h.generic
+     before re-using what you had previously.
+
+ (2) Copy or rename the file src/pcre2.h.generic as src/pcre2.h.
+
+ (3) EITHER:
+       Copy or rename file src/pcre2_chartables.c.dist as
+       src/pcre2_chartables.c.
+
+     OR:
+       Compile src/dftables.c as a stand-alone program (using -DHAVE_CONFIG_H
+       if you have set up src/config.h), and then run it with the single
+       argument "src/pcre2_chartables.c". This generates a set of standard
+       character tables and writes them to that file. The tables are generated
+       using the default C locale for your system. If you want to use a locale
+       that is specified by LC_xxx environment variables, add the -L option to
+       the dftables command. You must use this method if you are building on a
+       system that uses EBCDIC code.
+
+     The tables in src/pcre2_chartables.c are defaults. The caller of PCRE2 can
+     specify alternative tables at run time.
+
+ (4) For an 8-bit library, compile the following source files from the src
+     directory, setting -DPCRE2_CODE_UNIT_WIDTH=8 as a compiler option. Also
+     set -DHAVE_CONFIG_H if you have set up src/config.h with your
+     configuration, or else use other -D settings to change the configuration
+     as required.
+
+       pcre2_auto_possess.c
+       pcre2_chartables.c
+       pcre2_compile.c
+       pcre2_config.c
+       pcre2_context.c
+       pcre2_dfa_match.c
+       pcre2_error.c
+       pcre2_find_bracket.c
+       pcre2_jit_compile.c
+       pcre2_maketables.c
+       pcre2_match.c
+       pcre2_match_data.c
+       pcre2_newline.c
+       pcre2_ord2utf.c
+       pcre2_pattern_info.c
+       pcre2_serialize.c
+       pcre2_string_utils.c
+       pcre2_study.c
+       pcre2_substitute.c
+       pcre2_substring.c
+       pcre2_tables.c
+       pcre2_ucd.c
+       pcre2_valid_utf.c
+       pcre2_xclass.c
+
+     Make sure that you include -I. in the compiler command (or equivalent for
+     an unusual compiler) so that all included PCRE2 header files are first
+     sought in the src directory under the current directory. Otherwise you run
+     the risk of picking up a previously-installed file from somewhere else.
+
+     Note that you must compile pcre2_jit_compile.c, even if you have not
+     defined SUPPORT_JIT in src/config.h, because when JIT support is not
+     configured, dummy functions are compiled. When JIT support IS configured,
+     pcre2_compile.c #includes other files from the sljit subdirectory, where
+     there should be 16 files, all of whose names begin with "sljit". It also
+     #includes src/pcre2_jit_match.c and src/pcre2_jit_misc.c, so you should
+     not compile these yourself.
+
+ (5) Now link all the compiled code into an object library in whichever form
+     your system keeps such libraries. This is the basic PCRE2 C 8-bit library.
+     If your system has static and shared libraries, you may have to do this
+     once for each type.
+
+ (6) If you want to build a 16-bit library or 32-bit library (as well as, or
+     instead of the 8-bit library) just supply 16 or 32 as the value of
+     -DPCRE2_CODE_UNIT_WIDTH when you are compiling.
+
+ (7) If you want to build the POSIX wrapper functions (which apply only to the
+     8-bit library), ensure that you have the src/pcre2posix.h file and then
+     compile src/pcre2posix.c. Link the result (on its own) as the pcre2posix
+     library.
+
+ (8) The pcre2test program can be linked with any combination of the 8-bit,
+     16-bit and 32-bit libraries (depending on what you selected in
+     src/config.h). Compile src/pcre2test.c; don't forget -DHAVE_CONFIG_H if
+     necessary, but do NOT define PCRE2_CODE_UNIT_WIDTH. Then link with the
+     appropriate library/ies. If you compiled an 8-bit library, pcre2test also
+     needs the pcre2posix wrapper library.
+
+ (9) Run pcre2test on the testinput files in the testdata directory, and check
+     that the output matches the corresponding testoutput files. There are
+     comments about what each test does in the section entitled "Testing PCRE2"
+     in the README file. If you compiled more than one of the 8-bit, 16-bit and
+     32-bit libraries, you need to run pcre2test with the -16 option to do
+     16-bit tests and with the -32 option to do 32-bit tests.
+
+     Some tests are relevant only when certain build-time options are selected.
+     For example, test 4 is for Unicode support, and will not run if you have
+     built PCRE2 without it. See the comments at the start of each testinput
+     file. If you have a suitable Unix-like shell, the RunTest script will run
+     the appropriate tests for you. The command "RunTest list" will output a
+     list of all the tests.
+
+     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.
+
+(10) If you have built PCRE2 with SUPPORT_JIT, the JIT features can be tested
+     by running pcre2test with the -jit option. This is done automatically by
+     the RunTest script. You might also like to build and run the freestanding
+     JIT test program, src/pcre2_jit_test.c.
+
+(11) If you want to use the pcre2grep command, compile and link
+     src/pcre2grep.c; it uses only the basic 8-bit PCRE2 library (it does not
+     need the pcre2posix library).
+
+
+STACK SIZE IN WINDOWS ENVIRONMENTS
+
+The default processor stack size of 1Mb in some Windows environments is too
+small for matching patterns that need much recursion. In particular, test 2 may
+fail because of this. Normally, running out of stack causes a crash, but there
+have been cases where the test program has just died silently. See your linker
+documentation for how to increase stack size if you experience problems. If you
+are using CMake (see "BUILDING PCRE2 ON WINDOWS WITH CMAKE" below) and the gcc
+compiler, you can increase the stack size for pcre2test and pcre2grep by
+setting the CMAKE_EXE_LINKER_FLAGS variable to "-Wl,--stack,8388608" (for
+example). The Linux default of 8Mb is a reasonable choice for the stack, though
+even that can be too small for some pattern/subject combinations.
+
+PCRE2 has a compile configuration option to disable the use of stack for
+recursion so that heap is used instead. However, pattern matching is
+significantly slower when this is done. There is more about stack usage in the
+"pcre2stack" documentation.
+
+
+LINKING PROGRAMS IN WINDOWS ENVIRONMENTS
+
+If you want to statically link a program against a PCRE2 library in the form of
+a non-dll .a file, you must define PCRE2_STATIC before including src/pcre2.h.
+
+
+CALLING CONVENTIONS IN WINDOWS ENVIRONMENTS
+
+It is possible to compile programs to use different calling conventions using
+MSVC. Search the web for "calling conventions" for more information. To make it
+easier to change the calling convention for the exported functions in the
+PCRE2 library, the macro PCRE2_CALL_CONVENTION is present in all the external
+definitions. It can be set externally when compiling (e.g. in CFLAGS). If it is
+not set, it defaults to empty; the default calling convention is then used
+(which is what is wanted most of the time).
+
+
+COMMENTS ABOUT WIN32 BUILDS (see also "BUILDING PCRE2 ON WINDOWS WITH CMAKE")
+
+There are two ways of building PCRE2 using the "configure, make, make install"
+paradigm on Windows systems: using MinGW or using Cygwin. These are not at all
+the same thing; they are completely different from each other. There is also
+support for building using CMake, which some users find a more straightforward
+way of building PCRE2 under Windows.
+
+The MinGW home page (http://www.mingw.org/) says this:
+
+  MinGW: A collection of freely available and freely distributable Windows
+  specific header files and import libraries combined with GNU toolsets that
+  allow one to produce native Windows programs that do not rely on any
+  3rd-party C runtime DLLs.
+
+The Cygwin home page (http://www.cygwin.com/) says this:
+
+  Cygwin is a Linux-like environment for Windows. It consists of two parts:
+
+  . A DLL (cygwin1.dll) which acts as a Linux API emulation layer providing
+    substantial Linux API functionality
+
+  . A collection of tools which provide Linux look and feel.
+
+On both MinGW and Cygwin, PCRE2 should build correctly using:
+
+  ./configure && make && make install
+
+This should create two libraries called libpcre2-8 and libpcre2-posix. These
+are independent libraries: when you link with libpcre2-posix you must also link
+with libpcre2-8, which contains the basic functions.
+
+Using Cygwin's compiler generates libraries and executables that depend on
+cygwin1.dll. If a library that is generated this way is distributed,
+cygwin1.dll has to be distributed as well. Since cygwin1.dll is under the GPL
+licence, this forces not only PCRE2 to be under the GPL, but also the entire
+application. A distributor who wants to keep their own code proprietary must
+purchase an appropriate Cygwin licence.
+
+MinGW has no such restrictions. The MinGW compiler generates a library or
+executable that can run standalone on Windows without any third party dll or
+licensing issues.
+
+But there is more complication:
+
+If a Cygwin user uses the -mno-cygwin Cygwin gcc flag, what that really does is
+to tell Cygwin's gcc to use the MinGW gcc. Cygwin's gcc is only acting as a
+front end to MinGW's gcc (if you install Cygwin's gcc, you get both Cygwin's
+gcc and MinGW's gcc). So, a user can:
+
+. Build native binaries by using MinGW or by getting Cygwin and using
+  -mno-cygwin.
+
+. Build binaries that depend on cygwin1.dll by using Cygwin with the normal
+  compiler flags.
+
+The test files that are supplied with PCRE2 are in UNIX format, with LF
+characters as line terminators. Unless your PCRE2 library uses a default
+newline option that includes LF as a valid newline, it may be necessary to
+change the line terminators in the test files to get some of the tests to work.
+
+
+BUILDING PCRE2 ON WINDOWS WITH CMAKE
+
+CMake is an alternative configuration facility that can be used instead of
+"configure". CMake creates project files (make files, solution files, etc.)
+tailored to numerous development environments, including Visual Studio,
+Borland, Msys, MinGW, NMake, and Unix. If possible, use short paths with no
+spaces in the names for your CMake installation and your PCRE2 source and build
+directories.
+
+The following instructions were contributed by a PCRE1 user, but they should
+also work for PCRE2. If they are not followed exactly, errors may occur. In the
+event that errors do occur, it is recommended that you delete the CMake cache
+before attempting to repeat the CMake build process. In the CMake GUI, the
+cache can be deleted by selecting "File > Delete Cache".
+
+1.  Install the latest CMake version available from http://www.cmake.org/, and
+    ensure that cmake\bin is on your path.
+
+2.  Unzip (retaining folder structure) the PCRE2 source tree into a source
+    directory such as C:\pcre2. You should ensure your local date and time
+    is not earlier than the file dates in your source dir if the release is
+    very new.
+
+3.  Create a new, empty build directory, preferably a subdirectory of the
+    source dir. For example, C:\pcre2\pcre2-xx\build.
+
+4.  Run cmake-gui from the Shell envirornment of your build tool, for example,
+    Msys for Msys/MinGW or Visual Studio Command Prompt for VC/VC++. Do not try
+    to start Cmake from the Windows Start menu, as this can lead to errors.
+
+5.  Enter C:\pcre2\pcre2-xx and C:\pcre2\pcre2-xx\build for the source and
+    build directories, respectively.
+
+6.  Hit the "Configure" button.
+
+7.  Select the particular IDE / build tool that you are using (Visual
+    Studio, MSYS makefiles, MinGW makefiles, etc.)
+
+8.  The GUI will then list several configuration options. This is where
+    you can disable Unicode support or select other PCRE2 optional features.
+
+9.  Hit "Configure" again. The adjacent "Generate" button should now be
+    active.
+
+10. Hit "Generate".
+
+11. The build directory should now contain a usable build system, be it a
+    solution file for Visual Studio, makefiles for MinGW, etc. Exit from
+    cmake-gui and use the generated build system with your compiler or IDE.
+    E.g., for MinGW you can run "make", or for Visual Studio, open the PCRE2
+    solution, select the desired configuration (Debug, or Release, etc.) and
+    build the ALL_BUILD project.
+
+12. If during configuration with cmake-gui you've elected to build the test
+    programs, you can execute them by building the test project. E.g., for
+    MinGW: "make test"; for Visual Studio build the RUN_TESTS project. The
+    most recent build configuration is targeted by the tests. A summary of
+    test results is presented. Complete test output is subsequently
+    available for review in Testing\Temporary under your build dir.
+
+
+TESTING WITH RUNTEST.BAT
+
+If configured with CMake, building the test project ("make test" or building
+ALL_TESTS in Visual Studio) creates (and runs) pcre2_test.bat (and depending
+on your configuration options, possibly other test programs) in the build
+directory. The pcre2_test.bat script runs RunTest.bat with correct source and
+exe paths.
+
+For manual testing with RunTest.bat, provided the build dir is a subdirectory
+of the source directory: Open command shell window. Chdir to the location
+of your pcre2test.exe and pcre2grep.exe programs. Call RunTest.bat with
+"..\RunTest.Bat" or "..\..\RunTest.bat" as appropriate.
+
+To run only a particular test with RunTest.Bat provide a test number argument.
+
+Otherwise:
+
+1. Copy RunTest.bat into the directory where pcre2test.exe and pcre2grep.exe
+   have been created.
+
+2. Edit RunTest.bat to indentify the full or relative location of
+   the pcre2 source (wherein which the testdata folder resides), e.g.:
+
+   set srcdir=C:\pcre2\pcre2-10.00
+
+3. In a Windows command environment, chdir to the location of your bat and
+   exe programs.
+
+4. Run RunTest.bat. Test outputs will automatically be compared to expected
+   results, and discrepancies will be identified in the console output.
+
+To independently test the just-in-time compiler, run pcre2_jit_test.exe.
+
+
+BUILDING PCRE2 ON NATIVE Z/OS AND Z/VM
+
+z/OS and z/VM are operating systems for mainframe computers, produced by IBM.
+The character code used is EBCDIC, not ASCII or Unicode. In z/OS, UNIX APIs and
+applications can be supported through UNIX System Services, and in such an
+environment PCRE2 can be built in the same way as in other systems. However, in
+native z/OS (without UNIX System Services) and in z/VM, special ports are
+required. For details, please see this web site:
+
+  http://www.zaconsultants.net
+
+The site currently has ports for PCRE1 releases, but PCRE2 should follow in due
+course.
+
+You may also download PCRE1 from WWW.CBTTAPE.ORG, file 882. Everything, source
+and executable, is in EBCDIC and native z/OS file formats and this is the
+recommended download site.
+
+=============================
+Last Updated: 16 July 2015
diff --git a/dist/PrepareRelease b/dist2/PrepareRelease
similarity index 62%
rename from dist/PrepareRelease
rename to dist2/PrepareRelease
index 9891e08..114fce0 100755
--- a/dist/PrepareRelease
+++ b/dist2/PrepareRelease
@@ -1,7 +1,7 @@
 #/bin/sh
 
-# Script to prepare the files for building a PCRE release. It does some
-# processing of the documentation, detrails files, and creates pcre.h.generic
+# Script to prepare the files for building a PCRE2 release. It does some
+# processing of the documentation, detrails files, and creates pcre2.h.generic
 # and config.h.generic (for use by builders who can't run ./configure).
 
 # You must run this script before runnning "make dist". If its first argument
@@ -9,7 +9,7 @@
 # arguments. The script makes use of the following files:
 
 # 132html     A Perl script that converts a .1 or .3 man page into HTML. It
-#             "knows" the relevant troff constructs that are used in the PCRE
+#             "knows" the relevant troff constructs that are used in the PCRE2
 #             man pages.
 
 # CheckMan    A Perl script that checks man pages for typos in the mark up.
@@ -27,19 +27,19 @@
 
 # README & NON-AUTOTOOLS-BUILD
 #             These files are copied into the doc/html directory, with .txt
-#             extensions so that they can by hyperlinked from the HTML 
+#             extensions so that they can by hyperlinked from the HTML
 #             documentation, because some people just go to the HTML without
 #             looking for text files.
 
 
-# First, sort out the documentation. Remove pcredemo.3 first because it won't
+# First, sort out the documentation. Remove pcre2demo.3 first because it won't
 # pass the markup check (it is created below, using markup that none of the
 # other pages use).
 
 cd doc
 echo Processing documentation
 
-/bin/rm -f pcredemo.3
+/bin/rm -f pcre2demo.3
 
 # Check the remaining man pages
 
@@ -50,37 +50,37 @@
 # tidy for online reading. Concatenate all the .3 stuff, but omit the
 # individual function pages.
 
-cat <<End >pcre.txt
+cat <<End >pcre2.txt
 -----------------------------------------------------------------------------
-This file contains a concatenation of the PCRE man pages, converted to plain
+This file contains a concatenation of the PCRE2 man pages, converted to plain
 text format for ease of searching with a text editor, or for use on systems
 that do not have a man page processor. The small individual files that give
 synopses of each function in the library have not been included. Neither has
-the pcredemo program. There are separate text files for the pcregrep and
-pcretest commands.
+the pcre2demo program. There are separate text files for the pcre2grep and
+pcre2test commands.
 -----------------------------------------------------------------------------
 
 
 End
 
-echo "Making pcre.txt"
-for file in pcre pcre16 pcre32 pcrebuild pcrematching pcreapi pcrecallout \
-            pcrecompat pcrepattern pcresyntax pcreunicode pcrejit pcrepartial \
-            pcreprecompile pcreperform pcreposix pcrecpp pcresample \
-            pcrelimits pcrestack ; do
+echo "Making pcre2.txt"
+for file in pcre2 pcre2api pcre2build pcre2callout pcre2compat pcre2jit \
+            pcre2limits pcre2matching pcre2partial pcre2pattern pcre2perform \
+            pcre2posix pcre2sample pcre2serialize pcre2stack pcre2syntax \
+            pcre2unicode ; do
   echo "  Processing $file.3"
   nroff -c -man $file.3 >$file.rawtxt
-  perl ../CleanTxt <$file.rawtxt >>pcre.txt
+  perl ../CleanTxt <$file.rawtxt >>pcre2.txt
   /bin/rm $file.rawtxt
-  echo "------------------------------------------------------------------------------" >>pcre.txt
-  if [ "$file" != "pcresample" ] ; then
-    echo " " >>pcre.txt
-    echo " " >>pcre.txt
+  echo "------------------------------------------------------------------------------" >>pcre2.txt
+  if [ "$file" != "pcre2sample" ] ; then
+    echo " " >>pcre2.txt
+    echo " " >>pcre2.txt
   fi
 done
 
 # The three commands
-for file in pcretest pcregrep pcre-config ; do
+for file in pcre2test pcre2grep pcre2-config ; do
   echo Making $file.txt
   nroff -c -man $file.1 >$file.rawtxt
   perl ../CleanTxt <$file.rawtxt >$file.txt
@@ -88,12 +88,12 @@
 done
 
 
-# Make pcredemo.3 from the pcredemo.c source file
+# Make pcre2demo.3 from the pcre2demo.c source file
 
-echo "Making pcredemo.3"
-perl <<"END" >pcredemo.3
-  open(IN, "../pcredemo.c") || die "Failed to open pcredemo.c\n";
-  open(OUT, ">pcredemo.3") || die "Failed to open pcredemo.3\n";
+echo "Making pcre2demo.3"
+perl <<"END" >pcre2demo.3
+  open(IN, "../src/pcre2demo.c") || die "Failed to open src/pcre2demo.c\n";
+  open(OUT, ">pcre2demo.3") || die "Failed to open pcre2demo.3\n";
   print OUT ".\\\" Start example.\n" .
             ".de EX\n" .
             ".  nr mE \\\\n(.f\n" .
@@ -145,12 +145,11 @@
   base=`basename $file .3`
   toc=-toc
   if [ `expr $base : '.*_'` -ne 0 ] ; then toc="" ; fi
-  if [ "$base" = "pcresample" ]  || \
-     [ "$base" = "pcrestack" ]   || \
-     [ "$base" = "pcrecompat" ]  || \
-     [ "$base" = "pcrelimits" ]  || \
-     [ "$base" = "pcreperform" ] || \
-     [ "$base" = "pcreunicode" ] ; then
+  if [ "$base" = "pcre2sample" ]  || \
+     [ "$base" = "pcre2stack" ]   || \
+     [ "$base" = "pcre2compat" ]  || \
+     [ "$base" = "pcre2limits" ]  || \
+     [ "$base" = "pcre2unicode" ] ; then
     toc=""
   fi
   echo "  Making $base.html"
@@ -167,20 +166,16 @@
 # These files are detrailed; do not detrail the test data because there may be
 # significant trailing spaces. Do not detrail RunTest.bat, because it has CRLF
 # line endings and the detrail script removes all trailing white space. The
-# configure files are also omitted from the detrailing. We don't bother with
-# those pcre[16|32]_xx files that just define COMPILE_PCRE16 and then #include the
-# common file, because they aren't going to change.
+# configure files are also omitted from the detrailing.
 
 files="\
   Makefile.am \
-  Makefile.in \
   configure.ac \
   README \
   LICENCE \
   COPYING \
   AUTHORS \
   NEWS \
-  NON-UNIX-USE \
   NON-AUTOTOOLS-BUILD \
   INSTALL \
   132html \
@@ -190,65 +185,47 @@
   CMakeLists.txt \
   RunGrepTest \
   RunTest \
-  pcre-config.in \
-  libpcre.pc.in \
-  libpcre16.pc.in \
-  libpcre32.pc.in \
-  libpcreposix.pc.in \
-  libpcrecpp.pc.in \
-  config.h.in \
-  pcre_chartables.c.dist \
-  pcredemo.c \
-  pcregrep.c \
-  pcretest.c \
-  dftables.c \
-  pcreposix.c \
-  pcreposix.h \
-  pcre.h.in \
-  pcre_internal.h \
-  pcre_byte_order.c \
-  pcre_compile.c \
-  pcre_config.c \
-  pcre_dfa_exec.c \
-  pcre_exec.c \
-  pcre_fullinfo.c \
-  pcre_get.c \
-  pcre_globals.c \
-  pcre_jit_compile.c \
-  pcre_jit_test.c \
-  pcre_maketables.c \
-  pcre_newline.c \
-  pcre_ord2utf8.c \
-  pcre16_ord2utf16.c \
-  pcre32_ord2utf32.c \
-  pcre_printint.c \
-  pcre_refcount.c \
-  pcre_string_utils.c \
-  pcre_study.c \
-  pcre_tables.c \
-  pcre_valid_utf8.c \
-  pcre_version.c \
-  pcre_xclass.c \
-  pcre16_utf16_utils.c \
-  pcre32_utf32_utils.c \
-  pcre16_valid_utf16.c \
-  pcre32_valid_utf32.c \
-  pcre_scanner.cc \
-  pcre_scanner.h \
-  pcre_scanner_unittest.cc \
-  pcrecpp.cc \
-  pcrecpp.h \
-  pcrecpparg.h.in \
-  pcrecpp_unittest.cc \
-  pcre_stringpiece.cc \
-  pcre_stringpiece.h.in \
-  pcre_stringpiece_unittest.cc \
-  perltest.pl \
-  ucp.h \
-  makevp.bat \
-  pcre.def \
-  libpcre.def \
-  libpcreposix.def"
+  pcre2-config.in \
+  perltest.sh \
+  libpcre2-8.pc.in \
+  libpcre2-16.pc.in \
+  libpcre2-32.pc.in \
+  libpcre2-posix.pc.in \
+  src/dftables.c \
+  src/pcre2.h.in \
+  src/pcre2_auto_possess.c \
+  src/pcre2_compile.c \
+  src/pcre2_config.c \
+  src/pcre2_context.c \
+  src/pcre2_dfa_match.c \
+  src/pcre2_error.c \
+  src/pcre2_find_bracket.c \
+  src/pcre2_internal.h \
+  src/pcre2_intmodedep.h \
+  src/pcre2_jit_compile.c \
+  src/pcre2_jit_match.c \
+  src/pcre2_jit_misc.c \
+  src/pcre2_jit_test.c \
+  src/pcre2_maketables.c \
+  src/pcre2_match.c \
+  src/pcre2_match_data.c \
+  src/pcre2_newline.c \
+  src/pcre2_ord2utf.c \
+  src/pcre2_pattern_info.c \
+  src/pcre2_printint.c \
+  src/pcre2_string_utils.c \
+  src/pcre2_study.c \
+  src/pcre2_substring.c \
+  src/pcre2_tables.c \
+  src/pcre2_ucd.c \
+  src/pcre2_ucp.h \
+  src/pcre2_valid_utf.c \
+  src/pcre2_xclass.c \
+  src/pcre2demo.c \
+  src/pcre2grep.c \
+  src/pcre2posix.c \
+  src/pcre2posix.h \
+  src/pcre2test.c"
 
 echo Detrailing
 perl ./Detrail $files doc/p* doc/html/*
diff --git a/dist2/README b/dist2/README
new file mode 100644
index 0000000..48d2ffd
--- /dev/null
+++ b/dist2/README
@@ -0,0 +1,843 @@
+README file for PCRE2 (Perl-compatible regular expression library)
+------------------------------------------------------------------
+
+PCRE2 is a re-working of the original PCRE library to provide an entirely new
+API. The latest release of PCRE2 is always available in three alternative
+formats from:
+
+  ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre2-xxx.tar.gz
+  ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre2-xxx.tar.bz2
+  ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre2-xxx.zip
+
+There is a mailing list for discussion about the development of PCRE (both the
+original and new APIs) at pcre-dev@exim.org. You can access the archives and
+subscribe or manage your subscription here:
+
+   https://lists.exim.org/mailman/listinfo/pcre-dev
+
+Please read the NEWS file if you are upgrading from a previous release.
+The contents of this README file are:
+
+  The PCRE2 APIs
+  Documentation for PCRE2
+  Contributions by users of PCRE2
+  Building PCRE2 on non-Unix-like systems
+  Building PCRE2 without using autotools
+  Building PCRE2 using autotools
+  Retrieving configuration information
+  Shared libraries
+  Cross-compiling using autotools
+  Making new tarballs
+  Testing PCRE2
+  Character tables
+  File manifest
+
+
+The PCRE2 APIs
+--------------
+
+PCRE2 is written in C, and it has its own API. There are three sets of
+functions, one for the 8-bit library, which processes strings of bytes, one for
+the 16-bit library, which processes strings of 16-bit values, and one for the
+32-bit library, which processes strings of 32-bit values. There are no C++
+wrappers.
+
+The distribution does contain a set of C wrapper functions for the 8-bit
+library that are based on the POSIX regular expression API (see the pcre2posix
+man page). These can be found in a library called libpcre2posix. Note that this
+just provides a POSIX calling interface to PCRE2; the regular expressions
+themselves still follow Perl syntax and semantics. The POSIX API is restricted,
+and does not give full access to all of PCRE2's facilities.
+
+The header file for the POSIX-style functions is called pcre2posix.h. The
+official POSIX name is regex.h, but I did not want to risk possible problems
+with existing files of that name by distributing it that way. To use PCRE2 with
+an existing program that uses the POSIX API, pcre2posix.h will have to be
+renamed or pointed at by a link.
+
+If you are using the POSIX interface to PCRE2 and there is already a POSIX
+regex library installed on your system, as well as worrying about the regex.h
+header file (as mentioned above), you must also take care when linking programs
+to ensure that they link with PCRE2's libpcre2posix library. Otherwise they may
+pick up the POSIX functions of the same name from the other library.
+
+One way of avoiding this confusion is to compile PCRE2 with the addition of
+-Dregcomp=PCRE2regcomp (and similarly for the other POSIX functions) to the
+compiler flags (CFLAGS if you are using "configure" -- see below). This has the
+effect of renaming the functions so that the names no longer clash. Of course,
+you have to do the same thing for your applications, or write them using the
+new names.
+
+
+Documentation for PCRE2
+-----------------------
+
+If you install PCRE2 in the normal way on a Unix-like system, you will end up
+with a set of man pages whose names all start with "pcre2". The one that is
+just called "pcre2" lists all the others. In addition to these man pages, the
+PCRE2 documentation is supplied in two other forms:
+
+  1. There are files called doc/pcre2.txt, doc/pcre2grep.txt, and
+     doc/pcre2test.txt in the source distribution. The first of these is a
+     concatenation of the text forms of all the section 3 man pages except the
+     listing of pcre2demo.c and those that summarize individual functions. The
+     other two are the text forms of the section 1 man pages for the pcre2grep
+     and pcre2test commands. These text forms are provided for ease of scanning
+     with text editors or similar tools. They are installed in
+     <prefix>/share/doc/pcre2, where <prefix> is the installation prefix
+     (defaulting to /usr/local).
+
+  2. A set of files containing all the documentation in HTML form, hyperlinked
+     in various ways, and rooted in a file called index.html, is distributed in
+     doc/html and installed in <prefix>/share/doc/pcre2/html.
+
+
+Building PCRE2 on non-Unix-like systems
+---------------------------------------
+
+For a non-Unix-like system, please read the comments in the file
+NON-AUTOTOOLS-BUILD, though if your system supports the use of "configure" and
+"make" you may be able to build PCRE2 using autotools in the same way as for
+many Unix-like systems.
+
+PCRE2 can also be configured using CMake, which can be run in various ways
+(command line, GUI, etc). This creates Makefiles, solution files, etc. The file
+NON-AUTOTOOLS-BUILD has information about CMake.
+
+PCRE2 has been compiled on many different operating systems. It should be
+straightforward to build PCRE2 on any system that has a Standard C compiler and
+library, because it uses only Standard C functions.
+
+
+Building PCRE2 without using autotools
+--------------------------------------
+
+The use of autotools (in particular, libtool) is problematic in some
+environments, even some that are Unix or Unix-like. See the NON-AUTOTOOLS-BUILD
+file for ways of building PCRE2 without using autotools.
+
+
+Building PCRE2 using autotools
+------------------------------
+
+The following instructions assume the use of the widely used "configure; make;
+make install" (autotools) process.
+
+To build PCRE2 on system that supports autotools, first run the "configure"
+command from the PCRE2 distribution directory, with your current directory set
+to the directory where you want the files to be created. This command is a
+standard GNU "autoconf" configuration script, for which generic instructions
+are supplied in the file INSTALL.
+
+Most commonly, people build PCRE2 within its own distribution directory, and in
+this case, on many systems, just running "./configure" is sufficient. However,
+the usual methods of changing standard defaults are available. For example:
+
+CFLAGS='-O2 -Wall' ./configure --prefix=/opt/local
+
+This command specifies that the C compiler should be run with the flags '-O2
+-Wall' instead of the default, and that "make install" should install PCRE2
+under /opt/local instead of the default /usr/local.
+
+If you want to build in a different directory, just run "configure" with that
+directory as current. For example, suppose you have unpacked the PCRE2 source
+into /source/pcre2/pcre2-xxx, but you want to build it in
+/build/pcre2/pcre2-xxx:
+
+cd /build/pcre2/pcre2-xxx
+/source/pcre2/pcre2-xxx/configure
+
+PCRE2 is written in C and is normally compiled as a C library. However, it is
+possible to build it as a C++ library, though the provided building apparatus
+does not have any features to support this.
+
+There are some optional features that can be included or omitted from the PCRE2
+library. They are also documented in the pcre2build man page.
+
+. By default, both shared and static libraries are built. You can change this
+  by adding one of these options to the "configure" command:
+
+  --disable-shared
+  --disable-static
+
+  (See also "Shared libraries on Unix-like systems" below.)
+
+. By default, only the 8-bit library is built. If you add --enable-pcre2-16 to
+  the "configure" command, the 16-bit library is also built. If you add
+  --enable-pcre2-32 to the "configure" command, the 32-bit library is also
+  built. If you want only the 16-bit or 32-bit library, use --disable-pcre2-8
+  to disable building the 8-bit library.
+
+. If you want to include support for just-in-time compiling, which can give
+  large performance improvements on certain platforms, add --enable-jit to the
+  "configure" command. This support is available only for certain hardware
+  architectures. If you try to enable it on an unsupported architecture, there
+  will be a compile time error.
+
+. When JIT support is enabled, pcre2grep automatically makes use of it, unless
+  you add --disable-pcre2grep-jit to the "configure" command.
+
+. If you do not want to make use of the support for UTF-8 Unicode character
+  strings in the 8-bit library, UTF-16 Unicode character strings in the 16-bit
+  library, or UTF-32 Unicode character strings in the 32-bit library, you can
+  add --disable-unicode to the "configure" command. This reduces the size of
+  the libraries. It is not possible to configure one library with Unicode
+  support, and another without, in the same configuration.
+
+  When Unicode support is available, the use of a UTF encoding still has to be
+  enabled by setting the PCRE2_UTF option at run time or starting a pattern
+  with (*UTF). When PCRE2 is compiled with Unicode support, its input can only
+  either be ASCII or UTF-8/16/32, even when running on EBCDIC platforms. It is
+  not possible to use both --enable-unicode and --enable-ebcdic at the same
+  time.
+
+  As well as supporting UTF strings, Unicode support includes support for the
+  \P, \p, and \X sequences that recognize Unicode character properties.
+  However, only the basic two-letter properties such as Lu are supported.
+  Escape sequences such as \d and \w in patterns do not by default make use of
+  Unicode properties, but can be made to do so by setting the PCRE2_UCP option
+  or starting a pattern with (*UCP).
+
+. You can build PCRE2 to recognize either CR or LF or the sequence CRLF, or any
+  of the preceding, or any of the Unicode newline sequences, as indicating the
+  end of a line. Whatever you specify at build time is the default; the caller
+  of PCRE2 can change the selection at run time. The default newline indicator
+  is a single LF character (the Unix standard). You can specify the default
+  newline indicator by adding --enable-newline-is-cr, --enable-newline-is-lf,
+  --enable-newline-is-crlf, --enable-newline-is-anycrlf, or
+  --enable-newline-is-any to the "configure" command, respectively.
+
+  If you specify --enable-newline-is-cr or --enable-newline-is-crlf, some of
+  the standard tests will fail, because the lines in the test files end with
+  LF. Even if the files are edited to change the line endings, there are likely
+  to be some failures. With --enable-newline-is-anycrlf or
+  --enable-newline-is-any, many tests should succeed, but there may be some
+  failures.
+
+. By default, the sequence \R in a pattern matches any Unicode line ending
+  sequence. This is independent of the option specifying what PCRE2 considers
+  to be the end of a line (see above). However, the caller of PCRE2 can
+  restrict \R to match only CR, LF, or CRLF. You can make this the default by
+  adding --enable-bsr-anycrlf to the "configure" command (bsr = "backslash R").
+
+. In a pattern, the escape sequence \C matches a single code unit, even in a
+  UTF mode. This can be dangerous because it breaks up multi-code-unit
+  characters. You can build PCRE2 with the use of \C permanently locked out by
+  adding --enable-never-backslash-C (note the upper case C) to the "configure"
+  command. When \C is allowed by the library, individual applications can lock
+  it out by calling pcre2_compile() with the PCRE2_NEVER_BACKSLASH_C option.
+
+. PCRE2 has a counter that limits the depth of nesting of parentheses in a
+  pattern. This limits the amount of system stack that a pattern uses when it
+  is compiled. The default is 250, but you can change it by setting, for
+  example,
+
+  --with-parens-nest-limit=500
+
+. PCRE2 has a counter that can be set to limit the amount of resources it uses
+  when matching a pattern. 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,
+
+  --with-match-limit=500000
+
+  on the "configure" command. This is just the default; individual calls to
+  pcre2_match() can supply their own value. There is more discussion on the
+  pcre2api man page.
+
+. There is a separate counter that limits the depth of recursive function calls
+  during a matching process. This also has a default of ten million, which is
+  essentially "unlimited". You can change the default by setting, for example,
+
+  --with-match-limit-recursion=500000
+
+  Recursive function calls use up the runtime stack; running out of stack can
+  cause programs to crash in strange ways. There is a discussion about stack
+  sizes in the pcre2stack man page.
+
+. In the 8-bit library, the default maximum compiled pattern size is around
+  64K. You can increase this by adding --with-link-size=3 to the "configure"
+  command. PCRE2 then uses three bytes instead of two for offsets to different
+  parts of the compiled pattern. In the 16-bit library, --with-link-size=3 is
+  the same as --with-link-size=4, which (in both libraries) uses four-byte
+  offsets. Increasing the internal link size reduces performance in the 8-bit
+  and 16-bit libraries. In the 32-bit library, the link size setting is
+  ignored, as 4-byte offsets are always used.
+
+. You can build PCRE2 so that its internal match() function that is called from
+  pcre2_match() does not call itself recursively. Instead, it uses memory
+  blocks obtained from the heap to save data that would otherwise be saved on
+  the stack. To build PCRE2 like this, use
+
+  --disable-stack-for-recursion
+
+  on the "configure" command. PCRE2 runs more slowly in this mode, but it may
+  be necessary in environments with limited stack sizes. This applies only to
+  the normal execution of the pcre2_match() function; if JIT support is being
+  successfully used, it is not relevant. Equally, it does not apply to
+  pcre2_dfa_match(), which does not use deeply nested recursion. There is a
+  discussion about stack sizes in the pcre2stack man page.
+
+. For speed, PCRE2 uses four tables for manipulating and identifying characters
+  whose code point values are less than 256. By default, it uses a set of
+  tables for ASCII encoding that is part of the distribution. If you specify
+
+  --enable-rebuild-chartables
+
+  a program called dftables is compiled and run in the default C locale when
+  you obey "make". It builds a source file called pcre2_chartables.c. If you do
+  not specify this option, pcre2_chartables.c is created as a copy of
+  pcre2_chartables.c.dist. See "Character tables" below for further
+  information.
+
+. It is possible to compile PCRE2 for use on systems that use EBCDIC as their
+  character code (as opposed to ASCII/Unicode) by specifying
+
+  --enable-ebcdic --disable-unicode
+
+  This automatically implies --enable-rebuild-chartables (see above). However,
+  when PCRE2 is built this way, it always operates in EBCDIC. It cannot support
+  both EBCDIC and UTF-8/16/32. There is a second option, --enable-ebcdic-nl25,
+  which specifies that the code value for the EBCDIC NL character is 0x25
+  instead of the default 0x15.
+
+. If you specify --enable-debug, additional debugging code is included in the
+  build. This option is intended for use by the PCRE2 maintainers.
+
+. In environments where valgrind is installed, if you specify
+
+  --enable-valgrind
+
+  PCRE2 will use valgrind annotations to mark certain memory regions as
+  unaddressable. This allows it to detect invalid memory accesses, and is
+  mostly useful for debugging PCRE2 itself.
+
+. In environments where the gcc compiler is used and lcov version 1.6 or above
+  is installed, if you specify
+
+  --enable-coverage
+
+  the build process implements a code coverage report for the test suite. The
+  report is generated by running "make coverage". If ccache is installed on
+  your system, it must be disabled when building PCRE2 for coverage reporting.
+  You can do this by setting the environment variable CCACHE_DISABLE=1 before
+  running "make" to build PCRE2. There is more information about coverage
+  reporting in the "pcre2build" documentation.
+
+. The pcre2grep program currently supports only 8-bit data files, and so
+  requires the 8-bit PCRE2 library. It is possible to compile pcre2grep to use
+  libz and/or libbz2, in order to read .gz and .bz2 files (respectively), by
+  specifying one or both of
+
+  --enable-pcre2grep-libz
+  --enable-pcre2grep-libbz2
+
+  Of course, the relevant libraries must be installed on your system.
+
+. The default size (in bytes) of the internal buffer used by pcre2grep can be
+  set by, for example:
+
+  --with-pcre2grep-bufsize=51200
+
+  The value must be a plain integer. The default is 20480.
+
+. It is possible to compile pcre2test so that it links with the libreadline
+  or libedit libraries, by specifying, respectively,
+
+  --enable-pcre2test-libreadline or --enable-pcre2test-libedit
+
+  If this is done, when pcre2test's input is from a terminal, it reads it using
+  the readline() function. This provides line-editing and history facilities.
+  Note that libreadline is GPL-licenced, so if you distribute a binary of
+  pcre2test linked in this way, there may be licensing issues. These can be
+  avoided by linking with libedit (which has a BSD licence) instead.
+
+  Enabling libreadline causes the -lreadline option to be added to the
+  pcre2test build. In many operating environments with a sytem-installed
+  readline library this is sufficient. However, in some environments (e.g. if
+  an unmodified distribution version of readline is in use), it may be
+  necessary to specify something like LIBS="-lncurses" as well. This is
+  because, to quote the readline INSTALL, "Readline uses the termcap functions,
+  but does not link with the termcap or curses library itself, allowing
+  applications which link with readline the to choose an appropriate library."
+  If you get error messages about missing functions tgetstr, tgetent, tputs,
+  tgetflag, or tgoto, this is the problem, and linking with the ncurses library
+  should fix it.
+
+The "configure" script builds the following files for the basic C library:
+
+. Makefile             the makefile that builds the library
+. src/config.h         build-time configuration options for the library
+. src/pcre2.h          the public PCRE2 header file
+. pcre2-config          script that shows the building settings such as CFLAGS
+                         that were set for "configure"
+. libpcre2-8.pc        )
+. libpcre2-16.pc       ) data for the pkg-config command
+. libpcre2-32.pc       )
+. libpcre2-posix.pc    )
+. libtool              script that builds shared and/or static libraries
+
+Versions of config.h and pcre2.h are distributed in the src directory of PCRE2
+tarballs under the names config.h.generic and pcre2.h.generic. These are
+provided for those who have to build PCRE2 without using "configure" or CMake.
+If you use "configure" or CMake, the .generic versions are not used.
+
+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". This builds whichever of the
+libraries libpcre2-8, libpcre2-16 and libpcre2-32 are configured, and a test
+program called pcre2test. If you enabled JIT support with --enable-jit, another
+test program called pcre2_jit_test is built as well. If the 8-bit library is
+built, libpcre2-posix and the pcre2grep command are also built. Running
+"make" with the -j option may speed up compilation on multiprocessor systems.
+
+The command "make check" runs all the appropriate tests. Details of the PCRE2
+tests are given below in a separate section of this document. The -j option of
+"make" can also be used when running the tests.
+
+You can use "make install" to install PCRE2 into live directories on your
+system. The following are installed (file names are all relative to the
+<prefix> that is set when "configure" is run):
+
+  Commands (bin):
+    pcre2test
+    pcre2grep (if 8-bit support is enabled)
+    pcre2-config
+
+  Libraries (lib):
+    libpcre2-8      (if 8-bit support is enabled)
+    libpcre2-16     (if 16-bit support is enabled)
+    libpcre2-32     (if 32-bit support is enabled)
+    libpcre2-posix  (if 8-bit support is enabled)
+
+  Configuration information (lib/pkgconfig):
+    libpcre2-8.pc
+    libpcre2-16.pc
+    libpcre2-32.pc
+    libpcre2-posix.pc
+
+  Header files (include):
+    pcre2.h
+    pcre2posix.h
+
+  Man pages (share/man/man{1,3}):
+    pcre2grep.1
+    pcre2test.1
+    pcre2-config.1
+    pcre2.3
+    pcre2*.3 (lots more pages, all starting "pcre2")
+
+  HTML documentation (share/doc/pcre2/html):
+    index.html
+    *.html (lots more pages, hyperlinked from index.html)
+
+  Text file documentation (share/doc/pcre2):
+    AUTHORS
+    COPYING
+    ChangeLog
+    LICENCE
+    NEWS
+    README
+    pcre2.txt         (a concatenation of the man(3) pages)
+    pcre2test.txt     the pcre2test man page
+    pcre2grep.txt     the pcre2grep man page
+    pcre2-config.txt  the pcre2-config man page
+
+If you want to remove PCRE2 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
+------------------------------------
+
+Running "make install" installs the command pcre2-config, which can be used to
+recall information about the PCRE2 configuration and installation. For example:
+
+  pcre2-config --version
+
+prints the version number, and
+
+  pcre2-config --libs8
+
+outputs information about where the 8-bit library is installed. This command
+can be included in makefiles for programs that use PCRE2, saving the programmer
+from having to remember too many details. Run pcre2-config with no arguments to
+obtain a list of possible arguments.
+
+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:
+
+  pkg-config --libs libpcre2-16
+
+The data is held in *.pc files that are installed in a directory called
+<prefix>/lib/pkgconfig.
+
+
+Shared libraries
+----------------
+
+The default distribution builds PCRE2 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
+libraries. They are placed in a subdirectory called .libs when they are newly
+built. The programs pcre2test and pcre2grep are built to use these uninstalled
+libraries (by means of wrapper scripts in the case of shared libraries). When
+you use "make install" to install shared libraries, pcre2grep and pcre2test are
+automatically re-built to use the newly installed shared libraries before being
+installed themselves. However, the versions left in the build directory still
+use the uninstalled libraries.
+
+To build PCRE2 using static libraries only you must use --disable-shared when
+configuring it. For example:
+
+./configure --prefix=/usr/gnu --disable-shared
+
+Then run "make" in the usual way. Similarly, you can use --disable-static to
+build only shared libraries.
+
+
+Cross-compiling using autotools
+-------------------------------
+
+You can specify CC and CFLAGS in the normal way to the "configure" command, in
+order to cross-compile PCRE2 for some other host. However, you should NOT
+specify --enable-rebuild-chartables, because if you do, the dftables.c source
+file is compiled and run on the local host, in order to generate the inbuilt
+character tables (the pcre2_chartables.c file). This will probably not work,
+because dftables.c needs to be compiled with the local compiler, not the cross
+compiler.
+
+When --enable-rebuild-chartables is not specified, pcre2_chartables.c is
+created by making a copy of pcre2_chartables.c.dist, which is a default set of
+tables that assumes ASCII code. Cross-compiling with the default tables should
+not be a problem.
+
+If you need to modify the character tables when cross-compiling, you should
+move pcre2_chartables.c.dist out of the way, then compile dftables.c by hand
+and run it on the local host to make a new version of pcre2_chartables.c.dist.
+Then when you cross-compile PCRE2 this new version of the tables will be used.
+
+
+Making new tarballs
+-------------------
+
+The command "make dist" creates three PCRE2 tarballs, in tar.gz, tar.bz2, and
+zip formats. The command "make distcheck" does the same, but then does a trial
+build of the new distribution to ensure that it works.
+
+If you have modified any of the man page sources in the doc directory, you
+should first run the PrepareRelease script before making a distribution. This
+script creates the .txt and HTML forms of the documentation from the man pages.
+
+
+Testing PCRE2
+------------
+
+To test the basic PCRE2 library on a Unix-like system, run the RunTest script.
+There is another script called RunGrepTest that tests the pcre2grep command.
+When JIT support is enabled, a third test program called pcre2_jit_test is
+built. Both the scripts and all the program tests are run if you obey "make
+check". For other environments, see the instructions in NON-AUTOTOOLS-BUILD.
+
+The RunTest script runs the pcre2test test program (which is documented in its
+own man page) on each of the relevant testinput files in the testdata
+directory, and compares the output with the contents of the corresponding
+testoutput files. RunTest uses a file called testtry to hold the main output
+from pcre2test. Other files whose names begin with "test" are used as working
+files in some tests.
+
+Some tests are relevant only when certain build-time options were selected. For
+example, the tests for UTF-8/16/32 features are run only when Unicode support
+is available. RunTest outputs a comment when it skips a test.
+
+Many (but not all) of the tests that are not skipped are run twice if JIT
+support is available. On the second run, JIT compilation is forced. This
+testing can be suppressed by putting "nojit" on the RunTest command line.
+
+The entire set of tests is run once for each of the 8-bit, 16-bit and 32-bit
+libraries that are enabled. If you want to run just one set of tests, call
+RunTest with either the -8, -16 or -32 option.
+
+If valgrind is installed, you can run the tests under it by putting "valgrind"
+on the RunTest command line. To run pcre2test on just one or more specific test
+files, give their numbers as arguments to RunTest, for example:
+
+  RunTest 2 7 11
+
+You can also specify ranges of tests such as 3-6 or 3- (meaning 3 to the
+end), or a number preceded by ~ to exclude a test. For example:
+
+  Runtest 3-15 ~10
+
+This runs tests 3 to 15, excluding test 10, and just ~13 runs all the tests
+except test 13. Whatever order the arguments are in, the tests are always run
+in numerical order.
+
+You can also call RunTest with the single argument "list" to cause it to output
+a list of tests.
+
+The test sequence starts with "test 0", which is a special test that has no
+input file, and whose output is not checked. This is because it will be
+different on different hardware and with different configurations. The test
+exists in order to exercise some of pcre2test's code that would not otherwise
+be run.
+
+Tests 1 and 2 can always be run, as they expect only plain text strings (not
+UTF) and make no use of Unicode properties. The first test file can be fed
+directly into the perltest.sh script to check that Perl gives the same results.
+The only difference you should see is in the first few lines, where the Perl
+version is given instead of the PCRE2 version. The second set of tests check
+auxiliary functions, error detection, and run-time flags that are specific to
+PCRE2. It also uses the debugging flags to check some of the internals of
+pcre2_compile().
+
+If you build PCRE2 with a locale setting that is not the standard C locale, the
+character tables may be different (see next paragraph). In some cases, this may
+cause failures in the second set of tests. For example, in a locale where the
+isprint() function yields TRUE for characters in the range 128-255, the use of
+[:isascii:] inside a character class defines a different set of characters, and
+this shows up in this test as a difference in the compiled code, which is being
+listed for checking. For example, where the comparison test output contains
+[\x00-\x7f] the test might contain [\x00-\xff], and similarly in some other
+cases. This is not a bug in PCRE2.
+
+Test 3 checks pcre2_maketables(), the facility for building a set of character
+tables for a specific locale and using them instead of the default tables. The
+script uses the "locale" command to check for the availability of the "fr_FR",
+"french", or "fr" locale, and uses the first one that it finds. If the "locale"
+command fails, or if its output doesn't include "fr_FR", "french", or "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 an error like this:
+
+  ** Failed to set locale "fr_FR"
+
+it means that the given locale is not available on your system, despite being
+listed by "locale". This does not mean that PCRE2 is broken. There are three
+alternative output files for the third test, because three different versions
+of the French locale have been encountered. The test passes if its output
+matches any one of them.
+
+Tests 4 and 5 check UTF and Unicode property support, test 4 being compatible
+with the perltest.sh script, and test 5 checking PCRE2-specific things.
+
+Tests 6 and 7 check the pcre2_dfa_match() alternative matching function, in
+non-UTF mode and UTF-mode with Unicode property support, respectively.
+
+Test 8 checks some internal offsets and code size features; it is run only when
+the default "link size" of 2 is set (in other cases the sizes change) and when
+Unicode support is enabled.
+
+Tests 9 and 10 are run only in 8-bit mode, and tests 11 and 12 are run only in
+16-bit and 32-bit modes. These are tests that generate different output in
+8-bit mode. Each pair are for general cases and Unicode support, respectively.
+Test 13 checks the handling of non-UTF characters greater than 255 by
+pcre2_dfa_match() in 16-bit and 32-bit modes.
+
+Test 14 contains a number of tests that must not be run with JIT. They check,
+among other non-JIT things, the match-limiting features of the intepretive
+matcher.
+
+Test 15 is run only when JIT support is not available. It checks that an
+attempt to use JIT has the expected behaviour.
+
+Test 16 is run only when JIT support is available. It checks JIT complete and
+partial modes, match-limiting under JIT, and other JIT-specific features.
+
+Tests 17 and 18 are run only in 8-bit mode. They check the POSIX interface to
+the 8-bit library, without and with Unicode support, respectively.
+
+Test 19 checks the serialization functions by writing a set of compiled
+patterns to a file, and then reloading and checking them.
+
+
+Character tables
+----------------
+
+For speed, PCRE2 uses four tables for manipulating and identifying characters
+whose code point values are less than 256. By default, a set of tables that is
+built into the library is used. The pcre2_maketables() function can be called
+by an application to create a new set of tables in the current locale. This are
+passed to PCRE2 by calling pcre2_set_character_tables() to put a pointer into a
+compile context.
+
+The source file called pcre2_chartables.c contains the default set of tables.
+By default, this is created as a copy of pcre2_chartables.c.dist, which
+contains tables for ASCII coding. However, if --enable-rebuild-chartables is
+specified for ./configure, a different version of pcre2_chartables.c is built
+by the program dftables (compiled from dftables.c), which uses the ANSI C
+character handling functions such as isalnum(), isalpha(), isupper(),
+islower(), etc. to build the table sources. This means that the default C
+locale which is set for your system will control the contents of these default
+tables. You can change the default tables by editing pcre2_chartables.c and
+then re-building PCRE2. If you do this, you should take care to ensure that the
+file does not get automatically re-generated. The best way to do this is to
+move pcre2_chartables.c.dist out of the way and replace it with your customized
+tables.
+
+When the dftables program is run as a result of --enable-rebuild-chartables,
+it uses the default C locale that is set on your system. It does not pay
+attention to the LC_xxx environment variables. In other words, it uses the
+system's default locale rather than whatever the compiling user happens to have
+set. If you really do want to build a source set of character tables in a
+locale that is specified by the LC_xxx variables, you can run the dftables
+program by hand with the -L option. For example:
+
+  ./dftables -L pcre2_chartables.c.special
+
+The first two 256-byte tables provide lower casing and case flipping functions,
+respectively. The next table consists of three 32-byte bit maps which identify
+digits, "word" characters, and white space, respectively. These are used when
+building 32-byte bit maps that represent character classes for code points less
+than 256. The final 256-byte table has bits indicating various character types,
+as follows:
+
+    1   white space character
+    2   letter
+    4   decimal digit
+    8   hexadecimal digit
+   16   alphanumeric or '_'
+  128   regular expression metacharacter or binary zero
+
+You should not alter the set of characters that contain the 128 bit, as that
+will cause PCRE2 to malfunction.
+
+
+File manifest
+-------------
+
+The distribution should contain the files listed below.
+
+(A) Source files for the PCRE2 library functions and their headers are found in
+    the src directory:
+
+  src/dftables.c           auxiliary program for building pcre2_chartables.c
+                           when --enable-rebuild-chartables is specified
+
+  src/pcre2_chartables.c.dist  a default set of character tables that assume
+                           ASCII coding; unless --enable-rebuild-chartables is
+                           specified, used by copying to pcre2_chartables.c
+
+  src/pcre2posix.c         )
+  src/pcre2_auto_possess.c )
+  src/pcre2_compile.c      )
+  src/pcre2_config.c       )
+  src/pcre2_context.c      )
+  src/pcre2_dfa_match.c    )
+  src/pcre2_error.c        )
+  src/pcre2_find_bracket.c )
+  src/pcre2_jit_compile.c  )
+  src/pcre2_jit_match.c    ) sources for the functions in the library,
+  src/pcre2_jit_misc.c     )   and some internal functions that they use
+  src/pcre2_maketables.c   )
+  src/pcre2_match.c        )
+  src/pcre2_match_data.c   )
+  src/pcre2_newline.c      )
+  src/pcre2_ord2utf.c      )
+  src/pcre2_pattern_info.c )
+  src/pcre2_serialize.c    )
+  src/pcre2_string_utils.c )
+  src/pcre2_study.c        )
+  src/pcre2_substitute.c   )
+  src/pcre2_substring.c    )
+  src/pcre2_tables.c       )
+  src/pcre2_ucd.c          )
+  src/pcre2_valid_utf.c    )
+  src/pcre2_xclass.c       )
+
+  src/pcre2_printint.c     debugging function that is used by pcre2test,
+
+  src/config.h.in          template for config.h, when built by "configure"
+  src/pcre2.h.in           template for pcre2.h when built by "configure"
+  src/pcre2posix.h         header for the external POSIX wrapper API
+  src/pcre2_internal.h     header for internal use
+  src/pcre2_intmodedep.h   a mode-specific internal header
+  src/pcre2_ucp.h          header for Unicode property handling
+
+  sljit/*                  source files for the JIT compiler
+
+(B) Source files for programs that use PCRE2:
+
+  src/pcre2demo.c          simple demonstration of coding calls to PCRE2
+  src/pcre2grep.c          source of a grep utility that uses PCRE2
+  src/pcre2test.c          comprehensive test program
+  src/pcre2_printint.c     part of pcre2test
+  src/pcre2_jit_test.c     JIT test program
+
+(C) Auxiliary files:
+
+  132html                  script to turn "man" pages into HTML
+  AUTHORS                  information about the author of PCRE2
+  ChangeLog                log of changes to the code
+  CleanTxt                 script to clean nroff output for txt man pages
+  Detrail                  script to remove trailing spaces
+  HACKING                  some notes about the internals of PCRE2
+  INSTALL                  generic installation instructions
+  LICENCE                  conditions for the use of PCRE2
+  COPYING                  the same, using GNU's standard name
+  Makefile.in              ) template for Unix Makefile, which is built by
+                           )   "configure"
+  Makefile.am              ) the automake input that was used to create
+                           )   Makefile.in
+  NEWS                     important changes in this release
+  NON-AUTOTOOLS-BUILD      notes on building PCRE2 without using autotools
+  PrepareRelease           script to make preparations for "make dist"
+  README                   this file
+  RunTest                  a Unix shell script for running tests
+  RunGrepTest              a Unix shell script for pcre2grep tests
+  aclocal.m4               m4 macros (generated by "aclocal")
+  config.guess             ) files used by libtool,
+  config.sub               )   used only when building a shared library
+  configure                a configuring shell script (built by autoconf)
+  configure.ac             ) the autoconf input that was used to build
+                           )   "configure" and config.h
+  depcomp                  ) script to find program dependencies, generated by
+                           )   automake
+  doc/*.3                  man page sources for PCRE2
+  doc/*.1                  man page sources for pcre2grep and pcre2test
+  doc/index.html.src       the base HTML page
+  doc/html/*               HTML documentation
+  doc/pcre2.txt            plain text version of the man pages
+  doc/pcre2test.txt        plain text documentation of test program
+  install-sh               a shell script for installing files
+  libpcre2-8.pc.in         template for libpcre2-8.pc for pkg-config
+  libpcre2-16.pc.in        template for libpcre2-16.pc for pkg-config
+  libpcre2-32.pc.in        template for libpcre2-32.pc for pkg-config
+  libpcre2posix.pc.in      template for libpcre2posix.pc for pkg-config
+  ltmain.sh                file used to build a libtool script
+  missing                  ) common stub for a few missing GNU programs while
+                           )   installing, generated by automake
+  mkinstalldirs            script for making install directories
+  perltest.sh              Script for running a Perl test program
+  pcre2-config.in          source of script which retains PCRE2 information
+  testdata/testinput*      test data for main library tests
+  testdata/testoutput*     expected test results
+  testdata/grep*           input and output for pcre2grep tests
+  testdata/*               other supporting test files
+
+(D) Auxiliary files for cmake support
+
+  cmake/COPYING-CMAKE-SCRIPTS
+  cmake/FindPackageHandleStandardArgs.cmake
+  cmake/FindEditline.cmake
+  cmake/FindReadline.cmake
+  CMakeLists.txt
+  config-cmake.h.in
+
+(E) Auxiliary files for building PCRE2 "by hand"
+
+  pcre2.h.generic         ) a version of the public PCRE2 header file
+                          )   for use in non-"configure" environments
+  config.h.generic        ) a version of config.h for use in non-"configure"
+                          )   environments
+
+Philip Hazel
+Email local part: ph10
+Email domain: cam.ac.uk
+Last updated: 16 October 2015
diff --git a/dist2/RunGrepTest b/dist2/RunGrepTest
new file mode 100755
index 0000000..67d672b
--- /dev/null
+++ b/dist2/RunGrepTest
@@ -0,0 +1,633 @@
+#! /bin/sh
+
+# Run pcre2grep tests. The assumption is that the PCRE2 tests check the library
+# itself. What we are checking here is the file handling and options that are
+# supported by pcre2grep. This script must be run in the build directory.
+
+# Set the C locale, so that sort(1) behaves predictably.
+
+LC_ALL=C
+export LC_ALL
+
+# Remove any non-default colouring and aliases that the caller may have set.
+
+unset PCRE2GREP_COLOUR PCRE2GREP_COLOR
+unset cp ls mv rm
+
+# Remember the current (build) directory, set the program to be tested, and
+# valgrind settings when requested.
+
+builddir=`pwd`
+pcre2grep=$builddir/pcre2grep
+pcre2test=$builddir/pcre2test
+
+if [ ! -x $pcre2grep ] ; then
+  echo "** $pcre2grep does not exist or is not execuatble."
+  exit 1
+fi
+
+if [ ! -x $pcre2test ] ; then
+  echo "** $pcre2test does not exist or is not execuatble."
+  exit 1
+fi
+
+valgrind=
+while [ $# -gt 0 ] ; do
+  case $1 in
+    valgrind) valgrind="valgrind -q --leak-check=no --smc-check=all";;
+    *) echo "RunGrepTest: Unknown argument $1"; exit 1;;
+  esac
+  shift
+done
+
+pcre2grep_version=`$pcre2grep -V`
+if [ "$valgrind" = "" ] ; then
+  echo "Testing $pcre2grep_version"
+else
+  echo "Testing $pcre2grep_version using valgrind"
+fi
+
+# Set up a suitable "diff" command for comparison. Some systems have a diff
+# that lacks a -u option. Try to deal with this; better do the test for the -b
+# option as well.
+
+cf="diff"
+diff -b  /dev/null /dev/null 2>/dev/null && cf="diff -b"
+diff -u  /dev/null /dev/null 2>/dev/null && cf="diff -u"
+diff -ub /dev/null /dev/null 2>/dev/null && cf="diff -ub"
+
+# If this test is being run from "make check", $srcdir will be set. If not, set
+# it to the current or parent directory, whichever one contains the test data.
+# Subsequently, we run most of the pcre2grep tests in the source directory so
+# that the file names in the output are always the same.
+
+if [ -z "$srcdir" -o ! -d "$srcdir/testdata" ] ; then
+  if [ -d "./testdata" ] ; then
+    srcdir=.
+  elif [ -d "../testdata" ] ; then
+    srcdir=..
+  else
+    echo "Cannot find the testdata directory"
+    exit 1
+  fi
+fi
+
+# Check for the availability of UTF-8 support
+
+$pcre2test -C unicode >/dev/null
+utf8=$?
+
+# Check default newline convention. If it does not include LF, force LF.
+
+nl=`$pcre2test -C newline`
+if [ "$nl" != "LF" -a "$nl" != "ANY" -a "$nl" != "ANYCRLF" ]; then
+  pcre2grep="$pcre2grep -N LF"
+  echo "Default newline setting forced to LF"
+fi
+
+# ------ Function to run and check a special pcre2grep arguments test -------
+
+checkspecial()
+  {
+  $valgrind $pcre2grep $1 >>testtrygrep 2>&1
+  if [ $? -ne $2 ] ; then
+    echo "** pcre2grep $1 failed - check testtrygrep"
+    exit 1
+  fi
+  }
+
+# ------ Normal tests ------
+
+echo "Testing pcre2grep main features"
+
+echo "---------------------------- Test 1 ------------------------------" >testtrygrep
+(cd $srcdir; $valgrind $pcre2grep PATTERN ./testdata/grepinput) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 2 ------------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep '^PATTERN' ./testdata/grepinput) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 3 ------------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep -in PATTERN ./testdata/grepinput) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 4 ------------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep -ic PATTERN ./testdata/grepinput) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 5 ------------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep -in PATTERN ./testdata/grepinput ./testdata/grepinputx) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 6 ------------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep -inh PATTERN ./testdata/grepinput ./testdata/grepinputx) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 7 ------------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep -il PATTERN ./testdata/grepinput ./testdata/grepinputx) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 8 ------------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep -l PATTERN ./testdata/grepinput ./testdata/grepinputx) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 9 ------------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep -q PATTERN ./testdata/grepinput ./testdata/grepinputx) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 10 -----------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep -q NEVER-PATTERN ./testdata/grepinput ./testdata/grepinputx) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 11 -----------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep -vn pattern ./testdata/grepinputx) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 12 -----------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep -ix pattern ./testdata/grepinputx) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 13 -----------------------------" >>testtrygrep
+echo seventeen >testtemp1grep
+(cd $srcdir; $valgrind $pcre2grep -f./testdata/greplist -f $builddir/testtemp1grep ./testdata/grepinputx) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 14 -----------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep -w pat ./testdata/grepinput ./testdata/grepinputx) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 15 -----------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep 'abc^*' ./testdata/grepinput) 2>>testtrygrep >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 16 -----------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep abc ./testdata/grepinput ./testdata/nonexistfile) 2>>testtrygrep >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 17 -----------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep -M 'the\noutput' ./testdata/grepinput) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 18 -----------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep -Mn '(the\noutput|dog\.\n--)' ./testdata/grepinput) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 19 -----------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep -Mix 'Pattern' ./testdata/grepinputx) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 20 -----------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep -Mixn 'complete pair\nof lines' ./testdata/grepinputx) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 21 -----------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep -nA3 'four' ./testdata/grepinputx) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 22 -----------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep -nB3 'four' ./testdata/grepinputx) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 23 -----------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep -C3 'four' ./testdata/grepinputx) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 24 -----------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep -A9 'four' ./testdata/grepinputx) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 25 -----------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep -nB9 'four' ./testdata/grepinputx) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 26 -----------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep -A9 -B9 'four' ./testdata/grepinputx) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 27 -----------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep -A10 'four' ./testdata/grepinputx) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 28 -----------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep -nB10 'four' ./testdata/grepinputx) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 29 -----------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep -C12 -B10 'four' ./testdata/grepinputx) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 30 -----------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep -inB3 'pattern' ./testdata/grepinput ./testdata/grepinputx) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 31 -----------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep -inA3 'pattern' ./testdata/grepinput ./testdata/grepinputx) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 32 -----------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep -L 'fox' ./testdata/grepinput ./testdata/grepinputx) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 33 -----------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep 'fox' ./testdata/grepnonexist) >>testtrygrep 2>&1
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 34 -----------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep -s 'fox' ./testdata/grepnonexist) >>testtrygrep 2>&1
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 35 -----------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep -L -r --include=grepinputx --include grepinput8 --exclude-dir='^\.' 'fox' ./testdata | sort) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 36 -----------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep -L -r --include=grepinput --exclude 'grepinput$' --exclude=grepinput8 --exclude-dir='^\.' 'fox' ./testdata | sort) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 37 -----------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep  '^(a+)*\d' ./testdata/grepinput) >>testtrygrep 2>teststderrgrep
+echo "RC=$?" >>testtrygrep
+echo "======== STDERR ========" >>testtrygrep
+cat teststderrgrep >>testtrygrep
+
+echo "---------------------------- Test 38 ------------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep '>\x00<' ./testdata/grepinput) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 39 ------------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep -A1 'before the binary zero' ./testdata/grepinput) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 40 ------------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep -B1 'after the binary zero' ./testdata/grepinput) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 41 ------------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep -B1 -o '\w+ the binary zero' ./testdata/grepinput) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 42 ------------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep -B1 -onH '\w+ the binary zero' ./testdata/grepinput) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 43 ------------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep -on 'before|zero|after' ./testdata/grepinput) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 44 ------------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep -on -e before -ezero -e after ./testdata/grepinput) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 45 ------------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep -on -f ./testdata/greplist -e binary ./testdata/grepinput) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 46 ------------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep -eabc -e '(unclosed' ./testdata/grepinput) 2>>testtrygrep >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 47 ------------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep -Fx "AB.VE
+elephant" ./testdata/grepinput) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 48 ------------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep -F "AB.VE
+elephant" ./testdata/grepinput) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 49 ------------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep -F -e DATA -e "AB.VE
+elephant" ./testdata/grepinput) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 50 ------------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep "^(abc|def|ghi|jkl)" ./testdata/grepinputx) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 51 ------------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep -Mv "brown\sfox" ./testdata/grepinputv) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 52 ------------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep --colour=always jumps ./testdata/grepinputv) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 53 ------------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep --file-offsets 'before|zero|after' ./testdata/grepinput) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 54 ------------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep --line-offsets 'before|zero|after' ./testdata/grepinput) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 55 -----------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep -f./testdata/greplist --color=always ./testdata/grepinputx) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 56 -----------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep -c lazy ./testdata/grepinput*) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 57 -----------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep -c -l lazy ./testdata/grepinput*) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 58 -----------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep --regex=PATTERN ./testdata/grepinput) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 59 -----------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep --regexp=PATTERN ./testdata/grepinput) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 60 -----------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep --regex PATTERN ./testdata/grepinput) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 61 -----------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep --regexp PATTERN ./testdata/grepinput) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 62 -----------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep --match-limit=1000 --no-jit -M 'This is a file(.|\R)*file.' ./testdata/grepinput) >>testtrygrep 2>&1
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 63 -----------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep --recursion-limit=1000 --no-jit -M 'This is a file(.|\R)*file.' ./testdata/grepinput) >>testtrygrep 2>&1
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 64 ------------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep -o1 '(?<=PAT)TERN (ap(pear)s)' ./testdata/grepinput) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 65 ------------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep -o2 '(?<=PAT)TERN (ap(pear)s)' ./testdata/grepinput) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 66 ------------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep -o3 '(?<=PAT)TERN (ap(pear)s)' ./testdata/grepinput) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 67 ------------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep -o12 '(?<=PAT)TERN (ap(pear)s)' ./testdata/grepinput) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 68 ------------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep --only-matching=2 '(?<=PAT)TERN (ap(pear)s)' ./testdata/grepinput) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 69 -----------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep -vn --colour=always pattern ./testdata/grepinputx) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 70 -----------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep --color=always -M "triple:\t.*\n\n" ./testdata/grepinput3) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 71 -----------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep -o "^01|^02|^03" ./testdata/grepinput) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 72 -----------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep --color=always "^01|^02|^03" ./testdata/grepinput) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 73 -----------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep -o --colour=always "^01|^02|^03" ./testdata/grepinput) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 74 -----------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep -o "^01|02|^03" ./testdata/grepinput) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 75 -----------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep --color=always "^01|02|^03" ./testdata/grepinput) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 76 -----------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep -o --colour=always "^01|02|^03" ./testdata/grepinput) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 77 -----------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep -o "^01|^02|03" ./testdata/grepinput) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 78 -----------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep --color=always "^01|^02|03" ./testdata/grepinput) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 79 -----------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep -o --colour=always "^01|^02|03" ./testdata/grepinput) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 80 -----------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep -o "\b01|\b02" ./testdata/grepinput) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 81 -----------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep --color=always "\\b01|\\b02" ./testdata/grepinput) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 82 -----------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep -o --colour=always "\\b01|\\b02" ./testdata/grepinput) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 83 -----------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep --buffer-size=100 "^a" ./testdata/grepinput3) >>testtrygrep 2>&1
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 84 -----------------------------" >>testtrygrep
+echo testdata/grepinput3 >testtemp1grep
+(cd $srcdir; $valgrind $pcre2grep --file-list ./testdata/grepfilelist --file-list $builddir/testtemp1grep "fox|complete|t7") >>testtrygrep 2>&1
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 85 -----------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep --file-list=./testdata/grepfilelist "dolor" ./testdata/grepinput3) >>testtrygrep 2>&1
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 86 -----------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep "dog" ./testdata/grepbinary) >>testtrygrep 2>&1
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 87 -----------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep "cat" ./testdata/grepbinary) >>testtrygrep 2>&1
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 88 -----------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep -v "cat" ./testdata/grepbinary) >>testtrygrep 2>&1
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 89 -----------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep -I "dog" ./testdata/grepbinary) >>testtrygrep 2>&1
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 90 -----------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep --binary-files=without-match "dog" ./testdata/grepbinary) >>testtrygrep 2>&1
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 91 -----------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep -a "dog" ./testdata/grepbinary) >>testtrygrep 2>&1
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 92 -----------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep --binary-files=text "dog" ./testdata/grepbinary) >>testtrygrep 2>&1
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 93 -----------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep --text "dog" ./testdata/grepbinary) >>testtrygrep 2>&1
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 94 -----------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep -L -r --include=grepinputx --include grepinput8 'fox' ./testdata/grepinput* | sort) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 95 -----------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep --file-list ./testdata/grepfilelist --exclude grepinputv "fox|complete") >>testtrygrep 2>&1
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 96 -----------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep -L -r --include-dir=testdata --exclude '^(?!grepinput)' 'fox' ./test* | sort) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 97 -----------------------------" >>testtrygrep
+echo "grepinput$" >testtemp1grep
+echo "grepinput8" >>testtemp1grep
+(cd $srcdir; $valgrind $pcre2grep -L -r --include=grepinput --exclude-from $builddir/testtemp1grep --exclude-dir='^\.' 'fox' ./testdata | sort) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 98 -----------------------------" >>testtrygrep
+echo "grepinput$" >testtemp1grep
+echo "grepinput8" >>testtemp1grep
+(cd $srcdir; $valgrind $pcre2grep -L -r --exclude=grepinput3 --include=grepinput --exclude-from $builddir/testtemp1grep --exclude-dir='^\.' 'fox' ./testdata | sort) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 99 -----------------------------" >>testtrygrep
+echo "grepinput$" >testtemp1grep
+echo "grepinput8" >testtemp2grep
+(cd $srcdir; $valgrind $pcre2grep -L -r --include grepinput --exclude-from $builddir/testtemp1grep --exclude-from=$builddir/testtemp2grep --exclude-dir='^\.' 'fox' ./testdata | sort) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 100 ------------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep -Ho2 --only-matching=1 -o3 '(\w+) binary (\w+)(\.)?' ./testdata/grepinput) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 101 ------------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep -o3 -Ho2 -o12 --only-matching=1 -o3 --colour=always --om-separator='|' '(\w+) binary (\w+)(\.)?' ./testdata/grepinput) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 102 -----------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep -n "^$" ./testdata/grepinput3) >>testtrygrep 2>&1
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 103 -----------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep --only-matching "^$" ./testdata/grepinput3) >>testtrygrep 2>&1
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 104 -----------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep -n --only-matching "^$" ./testdata/grepinput3) >>testtrygrep 2>&1
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 105 -----------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep --colour=always "ipsum|" ./testdata/grepinput3) >>testtrygrep 2>&1
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 106 -----------------------------" >>testtrygrep
+(cd $srcdir; echo "a" | $valgrind $pcre2grep -M "|a" ) >>testtrygrep 2>&1
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 107 -----------------------------" >>testtrygrep
+echo "a" >testtemp1grep
+echo "aaaaa" >>testtemp1grep
+(cd $srcdir; $valgrind $pcre2grep  --line-offsets '(?<=\Ka)' $builddir/testtemp1grep) >>testtrygrep 2>&1
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 108 ------------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep -lq PATTERN ./testdata/grepinput ./testdata/grepinputx) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+echo "---------------------------- Test 109 -----------------------------" >>testtrygrep
+(cd $srcdir; $valgrind $pcre2grep -cq lazy ./testdata/grepinput*) >>testtrygrep
+echo "RC=$?" >>testtrygrep
+
+# Now compare the results.
+
+$cf $srcdir/testdata/grepoutput testtrygrep
+if [ $? != 0 ] ; then exit 1; fi
+
+
+# These tests require UTF-8 support
+
+if [ $utf8 -ne 0 ] ; then
+  echo "Testing pcre2grep UTF-8 features"
+
+  echo "---------------------------- Test U1 ------------------------------" >testtrygrep
+  (cd $srcdir; $valgrind $pcre2grep -n -u --newline=any "^X" ./testdata/grepinput8) >>testtrygrep
+  echo "RC=$?" >>testtrygrep
+
+  echo "---------------------------- Test U2 ------------------------------" >>testtrygrep
+  (cd $srcdir; $valgrind $pcre2grep -n -u -C 3 --newline=any "Match" ./testdata/grepinput8) >>testtrygrep
+  echo "RC=$?" >>testtrygrep
+
+  echo "---------------------------- Test U3 ------------------------------" >>testtrygrep
+  (cd $srcdir; $valgrind $pcre2grep --line-offsets -u --newline=any '(?<=\K\x{17f})' ./testdata/grepinput8) >>testtrygrep
+  echo "RC=$?" >>testtrygrep
+
+  $cf $srcdir/testdata/grepoutput8 testtrygrep
+  if [ $? != 0 ] ; then exit 1; fi
+
+else
+  echo "Skipping pcre2grep UTF-8 tests: no UTF-8 support in PCRE2 library"
+fi
+
+
+# We go to some contortions to try to ensure that the tests for the various
+# newline settings will work in environments where the normal newline sequence
+# is not \n. Do not use exported files, whose line endings might be changed.
+# Instead, create an input file using printf so that its contents are exactly
+# what we want. Note the messy fudge to get printf to write a string that
+# starts with a hyphen. These tests are run in the build directory.
+
+echo "Testing pcre2grep newline settings"
+printf "abc\rdef\r\nghi\njkl" >testNinputgrep
+
+printf "%c--------------------------- Test N1 ------------------------------\r\n" - >testtrygrep
+$valgrind $pcre2grep -n -N CR "^(abc|def|ghi|jkl)" testNinputgrep >>testtrygrep
+
+printf "%c--------------------------- Test N2 ------------------------------\r\n" - >>testtrygrep
+$valgrind $pcre2grep -n --newline=crlf "^(abc|def|ghi|jkl)" testNinputgrep >>testtrygrep
+
+printf "%c--------------------------- Test N3 ------------------------------\r\n" - >>testtrygrep
+pattern=`printf 'def\rjkl'`
+$valgrind $pcre2grep -n --newline=cr -F "$pattern" testNinputgrep >>testtrygrep
+
+printf "%c--------------------------- Test N4 ------------------------------\r\n" - >>testtrygrep
+$valgrind $pcre2grep -n --newline=crlf -F -f $srcdir/testdata/greppatN4 testNinputgrep >>testtrygrep
+
+printf "%c--------------------------- Test N5 ------------------------------\r\n" - >>testtrygrep
+$valgrind $pcre2grep -n --newline=any "^(abc|def|ghi|jkl)" testNinputgrep >>testtrygrep
+
+printf "%c--------------------------- Test N6 ------------------------------\r\n" - >>testtrygrep
+$valgrind $pcre2grep -n --newline=anycrlf "^(abc|def|ghi|jkl)" testNinputgrep >>testtrygrep
+
+$cf $srcdir/testdata/grepoutputN testtrygrep
+if [ $? != 0 ] ; then exit 1; fi
+
+
+# Finally, some tests to exercise code that is not tested above, just to be
+# sure that it runs OK. Doing this improves the coverage statistics. The output
+# is not checked.
+
+echo "Testing miscellaneous pcre2grep arguments (unchecked)"
+echo '' >testtrygrep
+checkspecial '-xxxxx' 2
+checkspecial '--help' 0
+checkspecial '--line-buffered --colour=auto abc /dev/null' 1
+
+# Clean up local working files
+rm -f testNinputgrep teststderrgrep testtrygrep testtemp1grep testtemp2grep
+
+exit 0
+
+# End
diff --git a/dist2/RunTest b/dist2/RunTest
new file mode 100755
index 0000000..36dc638
--- /dev/null
+++ b/dist2/RunTest
@@ -0,0 +1,850 @@
+#! /bin/sh
+
+###############################################################################
+# Run the PCRE2 tests using the pcre2test program. The appropriate tests are
+# selected, depending on which build-time options were used.
+#
+# When JIT support is available, all appropriate tests are run with and without
+# JIT, unless "-nojit" is given on the command line. There are also two tests
+# for JIT-specific features, one to be run when JIT support is available
+# (unless "-nojit" is specified), and one when it is not.
+#
+# Whichever of the 8-, 16- and 32-bit libraries exist are tested. It is also
+# possible to select which to test by giving "-8", "-16" or "-32" on the
+# command line.
+#
+# As well as "-nojit", "-8", "-16", and "-32", arguments for this script are
+# individual test numbers, ranges of tests such as 3-6 or 3- (meaning 3 to the
+# end), or a number preceded by ~ to exclude a test. For example, "3-15 ~10"
+# runs tests 3 to 15, excluding test 10, and just "~10" runs all the tests
+# except test 10. Whatever order the arguments are in, the tests are always run
+# in numerical order.
+#
+# Inappropriate tests are automatically skipped (with a comment to say so). For
+# example, if JIT support is not compiled, test 16 is skipped, whereas if JIT
+# support is compiled, test 15 is skipped.
+#
+# Other arguments can be one of the words "-valgrind", "-valgrind-log", or
+# "-sim" followed by an argument to run cross-compiled executables under a
+# simulator, for example:
+#
+# RunTest 3 -sim "qemu-arm -s 8388608"
+#
+# For backwards compatibility, -nojit, -valgrind, -valgrind-log, and -sim may
+# be given without the leading "-" character.
+#
+# When PCRE2 is compiled by clang with -fsanitize arguments, some tests need
+# very much more stack than normal. In environments where the stack can be
+# set at runtime, -bigstack sets a gigantic stack.
+#
+# There are two special cases where only one argument is allowed:
+#
+# If the first and only argument is "ebcdic", the script runs the special
+# EBCDIC test that can be useful for checking certain EBCDIC features, even
+# when run in an ASCII environment. PCRE2 must be built with EBCDIC support for
+# this test to be run.
+#
+# If the script is obeyed as "RunTest list", a list of available tests is
+# output, but none of them are run.
+###############################################################################
+
+# Define test titles in variables so that they can be output as a list. Some
+# of them are modified (e.g. with -8 or -16) when used in the actual tests.
+
+title0="Test 0: Unchecked pcre2test argument tests (to improve coverage)"
+title1="Test 1: Main non-UTF, non-UCP functionality (compatible with Perl >= 5.10)"
+title2="Test 2: API, errors, internals, and non-Perl stuff"
+title3="Test 3: Locale-specific features"
+title4A="Test 4: UTF"
+title4B=" and Unicode property support (compatible with Perl >= 5.10)"
+title5A="Test 5: API, internals, and non-Perl stuff for UTF"
+title5B=" and UCP support"
+title6="Test 6: DFA matching main non-UTF, non-UCP functionality"
+title7A="Test 7: DFA matching with UTF"
+title7B=" and Unicode property support"
+title8="Test 8: Internal offsets and code size tests"
+title9="Test 9: Specials for the basic 8-bit library"
+title10="Test 10: Specials for the 8-bit library with UTF-8 and UCP support"
+title11="Test 11: Specials for the basic 16-bit and 32-bit libraries"
+title12="Test 12: Specials for the 16-bit and 32-bit libraries UTF and UCP support"
+title13="Test 13: DFA specials for the basic 16-bit and 32-bit libraries"
+title14="Test 14: DFA specials for UTF and UCP support"
+title15="Test 15: Non-JIT limits and other non-JIT tests"
+title16="Test 16: JIT-specific features when JIT is not available"
+title17="Test 17: JIT-specific features when JIT is available"
+title18="Test 18: Tests of the POSIX interface, excluding UTF/UCP"
+title19="Test 19: Tests of the POSIX interface with UTF/UCP"
+title20="Test 20: Serialization tests"
+title21="Test 21: \C tests without UTF (supported for DFA matching)"
+title22="Test 22: \C tests with UTF (not supported for DFA matching)"
+title23="Test 23: \C disabled test"
+maxtest=23
+
+if [ $# -eq 1 -a "$1" = "list" ]; then
+  echo $title0
+  echo $title1
+  echo $title2 "(not UTF or UCP)"
+  echo $title3
+  echo $title4A $title4B
+  echo $title5A $title5B
+  echo $title6
+  echo $title7A $title7B
+  echo $title8
+  echo $title9
+  echo $title10
+  echo $title11
+  echo $title12
+  echo $title13
+  echo $title14
+  echo $title15
+  echo $title16
+  echo $title17
+  echo $title18
+  echo $title19
+  echo $title20
+  echo $title21
+  echo $title22
+  echo $title23
+  exit 0
+fi
+
+# Set up a suitable "diff" command for comparison. Some systems
+# have a diff that lacks a -u option. Try to deal with this.
+
+cf="diff"
+diff -u /dev/null /dev/null 2>/dev/null && cf="diff -u"
+
+# Find the test data
+
+if [ -n "$srcdir" -a -d "$srcdir" ] ; then
+  testdata="$srcdir/testdata"
+elif [ -d "./testdata" ] ; then
+  testdata=./testdata
+elif [ -d "../testdata" ] ; then
+  testdata=../testdata
+else
+  echo "Cannot find the testdata directory"
+  exit 1
+fi
+
+
+# ------ Function to check results of a test -------
+
+# This function is called with three parameters:
+#
+#  $1 the value of $? after a call to pcre2test
+#  $2 the suffix of the output file to compare with
+#  $3 the $opt value (empty, -jit, or -dfa)
+#
+# Note: must define using name(), not "function name", for Solaris.
+
+checkresult()
+  {
+  if [ $1 -ne 0 ] ; then
+    echo "** pcre2test failed - check testtry"
+    exit 1
+  fi
+  case "$3" in
+    -jit) with=" with JIT";;
+    -dfa) with=" with DFA";;
+    *)    with="";;
+  esac
+  $cf $testdata/testoutput$2 testtry
+  if [ $? != 0 ] ; then
+    echo ""
+    echo "** Test $2 failed$with"
+    exit 1
+  fi
+  echo "  OK$with"
+  }
+
+
+# ------ Function to run and check a special pcre2test arguments test -------
+
+checkspecial()
+  {
+  $valgrind  $vjs ./pcre2test $1 >>testtry
+  if [ $? -ne 0 ] ; then
+    echo "** pcre2test $1 failed - check testtry"
+    exit 1
+  fi
+  }
+
+
+# ------ Special EBCDIC Test -------
+
+if [ $# -eq 1 -a "$1" = "ebcdic" ]; then
+  $valgrind ./pcre2test -C ebcdic >/dev/null
+  ebcdic=$?
+  if [ $ebcdic -ne 1 ] ; then
+    echo "Cannot run EBCDIC tests: EBCDIC support not compiled"
+    exit 1
+  fi
+  for opt in "" "-dfa"; do
+    ./pcre2test -q $opt $testdata/testinputEBC >testtry
+    checkresult $? EBC "$opt"
+  done
+exit 0
+fi
+
+
+# ------ Normal Tests ------
+
+# Default values
+
+arg8=
+arg16=
+arg32=
+nojit=
+bigstack=
+sim=
+skip=
+valgrind=
+vjs=
+
+# This is in case the caller has set aliases (as I do - PH)
+unset cp ls mv rm
+
+# Process options and select which tests to run; for those that are explicitly
+# requested, check that the necessary optional facilities are available.
+
+do0=no
+do1=no
+do2=no
+do3=no
+do4=no
+do5=no
+do6=no
+do7=no
+do8=no
+do9=no
+do10=no
+do11=no
+do12=no
+do13=no
+do14=no
+do15=no
+do16=no
+do17=no
+do18=no
+do19=no
+do20=no
+do21=no
+do22=no
+do23=no
+
+while [ $# -gt 0 ] ; do
+  case $1 in
+    0) do0=yes;;
+    1) do1=yes;;
+    2) do2=yes;;
+    3) do3=yes;;
+    4) do4=yes;;
+    5) do5=yes;;
+    6) do6=yes;;
+    7) do7=yes;;
+    8) do8=yes;;
+    9) do9=yes;;
+   10) do10=yes;;
+   11) do11=yes;;
+   12) do12=yes;;
+   13) do13=yes;;
+   14) do14=yes;;
+   15) do15=yes;;
+   16) do16=yes;;
+   17) do17=yes;;
+   18) do18=yes;;
+   19) do19=yes;;
+   20) do20=yes;;
+   21) do21=yes;;
+   22) do22=yes;;
+   23) do23=yes;;
+   -8) arg8=yes;;
+  -16) arg16=yes;;
+  -32) arg32=yes;;
+   bigstack|-bigstack) bigstack=yes;;
+   nojit|-nojit) nojit=yes;;
+   sim|-sim) shift; sim=$1;;
+   valgrind|-valgrind) valgrind="valgrind --tool=memcheck -q --smc-check=all";;
+   valgrind-log|-valgrind-log) valgrind="valgrind --tool=memcheck --num-callers=30 --leak-check=no --error-limit=no --smc-check=all --log-file=report.%p ";;
+   ~*)
+     if expr "$1" : '~[0-9][0-9]*$' >/dev/null; then
+       skip="$skip `expr "$1" : '~\([0-9]*\)*$'`"
+     else
+       echo "Unknown option or test selector '$1'"; exit 1
+     fi
+   ;;
+   *-*)
+     if expr "$1" : '[0-9][0-9]*-[0-9]*$' >/dev/null; then
+       tf=`expr "$1" : '\([0-9]*\)'`
+       tt=`expr "$1" : '.*-\([0-9]*\)'`
+       if [ "$tt" = "" ] ; then tt=$maxtest; fi
+       if expr \( "$tt" ">" "$maxtest" \) >/dev/null; then
+         echo "Invalid test range '$1'"; exit 1
+       fi
+       while expr "$tf" "<=" "$tt" >/dev/null; do
+         eval do${tf}=yes
+         tf=`expr $tf + 1`
+       done
+     else
+       echo "Invalid test range '$1'"; exit 1
+     fi
+   ;;
+   *) echo "Unknown option or test selector '$1'"; exit 1;;
+  esac
+  shift
+done
+
+# Find which optional facilities are available.
+
+$sim ./pcre2test -C linksize >/dev/null
+link_size=$?
+if [ $link_size -lt 2 ] ; then
+  echo "RunTest: Failed to find internal link size"
+  exit 1
+fi
+if [ $link_size -gt 4 ] ; then
+  echo "RunTest: Failed to find internal link size"
+  exit 1
+fi
+
+# If it is possible to set the system stack size, arrange to set a value for
+# test 2, which needs more than the even the Linux default when PCRE2 has been
+# compiled by gcc with -fsanitize=address. When the compiler is clang, sanitize
+# options require an even bigger stack for test 2, and an increased stack for
+# some of the other tests.
+
+$sim ./pcre2test -S 1 /dev/null /dev/null
+if [ $? -eq 0 ] ; then
+  if [ "$bigstack" = "" ] ; then
+    test2stack="-S 16"
+    defaultstack=""
+  else
+    test2stack="-S 1024"
+    defaultstack="-S 64"
+  fi
+else
+  test2stack=""
+  defaultstack=""
+fi
+
+# All of 8-bit, 16-bit, and 32-bit character strings may be supported, but only
+# one need be.
+
+$sim ./pcre2test -C pcre2-8 >/dev/null
+support8=$?
+$sim ./pcre2test -C pcre2-16 >/dev/null
+support16=$?
+$sim ./pcre2test -C pcre2-32 >/dev/null
+support32=$?
+
+# \C may be disabled
+
+$sim ./pcre2test -C backslash-C >/dev/null
+supportBSC=$?
+
+# Initialize all bitsizes skipped
+
+test8=skip
+test16=skip
+test32=skip
+
+# If no bitsize arguments, select all that are available
+
+if [ "$arg8$arg16$arg32" = "" ] ; then
+  if [ $support8 -ne 0 ] ; then
+    test8=-8
+  fi
+  if [ $support16 -ne 0 ] ; then
+    test16=-16
+  fi
+  if [ $support32 -ne 0 ] ; then
+    test32=-32
+  fi
+
+# Otherwise, select requested bit sizes
+
+else
+  if [ "$arg8" = yes ] ; then
+    if [ $support8 -eq 0 ] ; then
+      echo "Cannot run 8-bit library tests: 8-bit library not compiled"
+      exit 1
+    fi
+    test8=-8
+  fi
+  if [ "$arg16" = yes ] ; then
+    if [ $support16 -eq 0 ] ; then
+      echo "Cannot run 16-bit library tests: 16-bit library not compiled"
+      exit 1
+    fi
+    test16=-16
+  fi
+  if [ "$arg32" = yes ] ; then
+    if [ $support32 -eq 0 ] ; then
+      echo "Cannot run 32-bit library tests: 32-bit library not compiled"
+      exit 1
+    fi
+    test32=-32
+  fi
+fi
+
+# UTF support is implied by Unicode support, and it always applies to all bit
+# sizes if both are supported; we can't have UTF-8 support without UTF-16 or
+# UTF-32 support.
+
+$sim ./pcre2test -C unicode >/dev/null
+utf=$?
+
+# When JIT is used with valgrind, we need to set up valgrind suppressions as
+# otherwise there are a lot of false positive valgrind reports when the
+# the hardware supports SSE2.
+
+jitopt=
+$sim ./pcre2test -C jit >/dev/null
+jit=$?
+if [ $jit -ne 0 -a "$nojit" != "yes" ] ; then
+  jitopt=-jit
+  if [ "$valgrind" != "" ] ; then
+    vjs="--suppressions=$testdata/valgrind-jit.supp"
+  fi
+fi
+
+# If no specific tests were requested, select all. Those that are not
+# relevant will be automatically skipped.
+
+if [ $do0  = no -a $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 -a $do10 = no -a $do11 = no -a \
+     $do12 = no -a $do13 = no -a $do14 = no -a $do15 = no -a \
+     $do16 = no -a $do17 = no -a $do18 = no -a $do19 = no -a \
+     $do20 = no -a $do21 = no -a $do22 = no -a $do23 = no \
+   ]; then
+  do0=yes
+  do1=yes
+  do2=yes
+  do3=yes
+  do4=yes
+  do5=yes
+  do6=yes
+  do7=yes
+  do8=yes
+  do9=yes
+  do10=yes
+  do11=yes
+  do12=yes
+  do13=yes
+  do14=yes
+  do15=yes
+  do16=yes
+  do17=yes
+  do18=yes
+  do19=yes
+  do20=yes
+  do21=yes
+  do22=yes
+  do23=yes
+fi
+
+# Handle any explicit skips at this stage, so that an argument list may consist
+# only of explicit skips.
+
+for i in $skip; do eval do$i=no; done
+
+# Show which release and which test data
+
+echo ""
+echo PCRE2 C library tests using test data from $testdata
+$sim ./pcre2test /dev/null
+echo ""
+
+for bmode in "$test8" "$test16" "$test32"; do
+  case "$bmode" in
+    skip) continue;;
+    -16)  if [ "$test8$test32" != "skipskip" ] ; then echo ""; fi
+          bits=16; echo "---- Testing 16-bit library ----"; echo "";;
+    -32)  if [ "$test8$test16" != "skipskip" ] ; then echo ""; fi
+          bits=32; echo "---- Testing 32-bit library ----"; echo "";;
+    -8)   bits=8; echo "---- Testing 8-bit library ----"; echo "";;
+  esac
+
+  # Test 0 is a special test. Its output is not checked, because it will
+  # be different on different hardware and with different configurations.
+  # Running this test just exercises the code.
+
+  if [ $do0 = yes ] ; then
+    echo $title0
+    echo '/abc/jit,memory' >testSinput
+    echo '   abc' >>testSinput
+    echo '' >testtry
+    checkspecial '-C'
+    checkspecial '--help'
+    checkspecial '-S 1 -t 10 testSinput'
+    echo "  OK"
+  fi
+
+  # Primary non-UTF test, compatible with JIT and all versions of Perl >= 5.8
+
+  if [ $do1 = yes ] ; then
+    echo $title1
+    for opt in "" $jitopt; do
+      $sim $valgrind ${opt:+$vjs} ./pcre2test -q $defaultstack $bmode $opt $testdata/testinput1 testtry
+      checkresult $? 1 "$opt"
+    done
+  fi
+
+  # PCRE2 tests that are not Perl-compatible: API, errors, internals
+
+  if [ $do2 = yes ] ; then
+    echo $title2 "(excluding UTF-$bits)"
+    for opt in "" $jitopt; do
+      $sim $valgrind ${opt:+$vjs} ./pcre2test -q $test2stack $bmode $opt $testdata/testinput2 testtry
+      if [ $? = 0 ] ; then
+        checkresult $? 2 "$opt"
+      else
+        echo " "
+        echo "** Test 2 requires a lot of stack. If it has crashed with a"
+        echo "** segmentation fault, it may be that you do not have enough"
+        echo "** stack available by default. Please see the 'pcre2stack' man"
+        echo "** page for a discussion of PCRE2's stack usage."
+        echo " "
+        exit 1
+      fi
+    done
+  fi
+
+  # Locale-specific tests, provided that either the "fr_FR", "fr_CA", "french"
+  # or "fr" locale is available. The first two are Unix-like standards; the
+  # last two are for Windows. Unfortunately, different versions of the French
+  # locale give different outputs for some items. This test passes if the
+  # output matches any one of the alternative output files.
+
+  if [ $do3 = yes ] ; then
+    locale=
+
+    # In some environments locales that are listed by the "locale -a"
+    # command do not seem to work with setlocale(). Therefore, we do
+    # a preliminary test to see if pcre2test can set one before going
+    # on to use it.
+
+    for loc in 'fr_FR' 'french' 'fr' 'fr_CA'; do
+      locale -a | grep "^$loc\$" >/dev/null
+      if [ $? -eq 0 ] ; then
+        echo "/a/locale=$loc" | \
+          $sim $valgrind ./pcre2test -q $bmode | \
+            grep "Failed to set locale" >/dev/null
+        if [ $? -ne 0 ] ; then
+          locale=$loc
+          if [ "$locale" = "fr_FR" ] ; then
+            infile=$testdata/testinput3
+            outfile=$testdata/testoutput3
+            outfile2=$testdata/testoutput3A
+            outfile3=$testdata/testoutput3B
+          else
+            infile=test3input
+            outfile=test3output
+            outfile2=test3outputA
+            outfile3=test3outputB
+            sed "s/fr_FR/$loc/" $testdata/testinput3 >test3input
+            sed "s/fr_FR/$loc/" $testdata/testoutput3 >test3output
+            sed "s/fr_FR/$loc/" $testdata/testoutput3A >test3outputA
+            sed "s/fr_FR/$loc/" $testdata/testoutput3B >test3outputB
+          fi
+          break
+        fi
+      fi
+    done
+
+    if [ "$locale" != "" ] ; then
+      echo $title3 "(using '$locale' locale)"
+      for opt in "" $jitopt; do
+        $sim $valgrind ${opt:+$vjs} ./pcre2test -q $defaultstack $bmode $opt $infile testtry
+        if [ $? = 0 ] ; then
+          case "$opt" in
+            -jit) with=" with JIT";;
+            *)    with="";;
+          esac
+          if $cf $outfile testtry >teststdout || \
+             $cf $outfile2 testtry >teststdout || \
+             $cf $outfile3 testtry >teststdout
+          then
+            echo "  OK$with"
+          else
+            echo "** Locale test did not run successfully$with. The output did not match"
+            echo "   $outfile, $outfile2 or $outfile3."
+            echo "   This may mean that there is a problem with the locale settings rather"
+            echo "   than a bug in PCRE2."
+            exit 1
+          fi
+        else exit 1
+        fi
+      done
+    else
+      echo "Cannot test locale-specific features - none of the 'fr_FR', 'fr_CA',"
+      echo "'fr' or 'french' locales can be set, or the \"locale\" command is"
+      echo "not available to check for them."
+      echo " "
+    fi
+  fi
+
+  # Tests for UTF and Unicode property support
+
+  if [ $do4 = yes ] ; then
+    echo ${title4A}-${bits}${title4B}
+    if [ $utf -eq 0 ] ; then
+      echo "  Skipped because UTF-$bits support is not available"
+    else
+      for opt in "" $jitopt; do
+        $sim $valgrind ${opt:+$vjs} ./pcre2test -q $defaultstack $bmode $opt $testdata/testinput4 testtry
+        checkresult $? 4 "$opt"
+      done
+    fi
+  fi
+
+  if [ $do5 = yes ] ; then
+    echo ${title5A}-${bits}$title5B
+    if [ $utf -eq 0 ] ; then
+      echo "  Skipped because UTF-$bits support is not available"
+    else
+      for opt in "" $jitopt; do
+        $sim $valgrind ${opt:+$vjs} ./pcre2test -q $defaultstack $bmode $opt $testdata/testinput5 testtry
+        checkresult $? 5 "$opt"
+      done
+    fi
+  fi
+
+  # Tests for DFA matching support
+
+  if [ $do6 = yes ] ; then
+    echo $title6
+    $sim $valgrind ./pcre2test -q $defaultstack $bmode $testdata/testinput6 testtry
+    checkresult $? 6 ""
+  fi
+
+  if [ $do7 = yes ] ; then
+    echo ${title7A}-${bits}$title7B
+    if [ $utf -eq 0 ] ; then
+      echo "  Skipped because UTF-$bits support is not available"
+    else
+      $sim $valgrind ./pcre2test -q $defaultstack $bmode $opt $testdata/testinput7 testtry
+      checkresult $? 7 ""
+    fi
+  fi
+
+  # Test of internal offsets and code sizes. This test is run only when there
+  # is UTF/UCP support. The actual tests are mostly the same as in some of the
+  # above, but in this test we inspect some offsets and sizes. This is a
+  # doublecheck for the maintainer, just in case something changes unexpectely.
+  # The output from this test is different in 8-bit, 16-bit, and 32-bit modes
+  # and for different link sizes, so there are different output files for each
+  # mode and link size.
+
+  if [ $do8 = yes ] ; then
+    echo $title8
+    if [ $utf -eq 0 ] ; then
+      echo "  Skipped because UTF-$bits support is not available"
+    else
+      $sim $valgrind ./pcre2test -q $defaultstack $bmode $testdata/testinput8 testtry
+      checkresult $? 8-$bits-$link_size ""
+    fi
+  fi
+
+  # Tests for 8-bit-specific features
+
+  if [ "$do9" = yes ] ; then
+    echo $title9
+    if [ "$bits" = "16" -o "$bits" = "32" ] ; then
+      echo "  Skipped when running 16/32-bit tests"
+    else
+      for opt in "" $jitopt; do
+        $sim $valgrind ${opt:+$vjs} ./pcre2test -q $defaultstack $bmode $opt $testdata/testinput9 testtry
+        checkresult $? 9 "$opt"
+      done
+    fi
+  fi
+
+  # Tests for UTF-8 and UCP 8-bit-specific features
+
+  if [ "$do10" = yes ] ; then
+    echo $title10
+    if [ "$bits" = "16" -o "$bits" = "32" ] ; then
+      echo "  Skipped when running 16/32-bit tests"
+    elif [ $utf -eq 0 ] ; then
+      echo "  Skipped because UTF-$bits support is not available"
+    else
+      for opt in "" $jitopt; do
+        $sim $valgrind ${opt:+$vjs} ./pcre2test -q $defaultstack $bmode $opt $testdata/testinput10 testtry
+        checkresult $? 10 "$opt"
+      done
+    fi
+  fi
+
+  # Tests for 16-bit and 32-bit features. Output is different for the two widths.
+
+  if [ $do11 = yes ] ; then
+    echo $title11
+    if [ "$bits" = "8" ] ; then
+      echo "  Skipped when running 8-bit tests"
+    else
+      for opt in "" $jitopt; do
+        $sim $valgrind ${opt:+$vjs} ./pcre2test -q $defaultstack $bmode $opt $testdata/testinput11 testtry
+        checkresult $? 11-$bits "$opt"
+      done
+    fi
+  fi
+
+  # Tests for 16-bit and 32-bit features with UTF-16/32 and UCP support. Output
+  # is different for the two widths.
+
+  if [ $do12 = yes ] ; then
+    echo $title12
+    if [ "$bits" = "8" ] ; then
+      echo "  Skipped when running 8-bit tests"
+    elif [ $utf -eq 0 ] ; then
+      echo "  Skipped because UTF-$bits support is not available"
+    else
+      for opt in "" $jitopt; do
+        $sim $valgrind ${opt:+$vjs} ./pcre2test -q $defaultstack $bmode $opt $testdata/testinput12 testtry
+        checkresult $? 12-$bits "$opt"
+      done
+    fi
+  fi
+
+  # Tests for 16/32-bit-specific features in DFA non-UTF modes
+
+  if [ $do13 = yes ] ; then
+    echo $title13
+    if [ "$bits" = "8" ] ; then
+      echo "  Skipped when running 8-bit tests"
+    else
+      $sim $valgrind ./pcre2test -q $defaultstack $bmode $testdata/testinput13 testtry
+      checkresult $? 13 ""
+    fi
+  fi
+
+  # Tests for DFA UTF and UCP features. Output is different for the different widths.
+
+  if [ $do14 = yes ] ; then
+    echo $title14
+    if [ $utf -eq 0 ] ; then
+      echo "  Skipped because UTF-$bits support is not available"
+    else
+      $sim $valgrind ./pcre2test -q $defaultstack $bmode $opt $testdata/testinput14 testtry
+      checkresult $? 14-$bits ""
+    fi
+  fi
+
+  # Test non-JIT match and recursion limits
+
+  if [ $do15 = yes ] ; then
+    echo $title15
+    $sim $valgrind ./pcre2test -q $defaultstack $bmode $testdata/testinput15 testtry
+    checkresult $? 15 ""
+  fi
+
+  # Test JIT-specific features when JIT is not available
+
+  if [ $do16 = yes ] ; then
+    echo $title16
+    if [ $jit -ne 0 ] ; then
+      echo "  Skipped because JIT is available"
+    else
+      $sim $valgrind ./pcre2test -q $defaultstack $bmode $testdata/testinput16 testtry
+      checkresult $? 16 ""
+    fi
+  fi
+
+  # Test JIT-specific features when JIT is available
+
+  if [ $do17 = yes ] ; then
+    echo $title17
+    if [ $jit -eq 0 -o "$nojit" = "yes" ] ; then
+      echo "  Skipped because JIT is not available or nojit was specified"
+    else
+      $sim $valgrind $vjs ./pcre2test -q $defaultstack $bmode $testdata/testinput17 testtry
+      checkresult $? 17 ""
+    fi
+  fi
+
+  # Tests for the POSIX interface without UTF/UCP (8-bit only)
+
+  if [ $do18 = yes ] ; then
+    echo $title18
+    if [ "$bits" = "16" -o "$bits" = "32" ] ; then
+      echo "  Skipped when running 16/32-bit tests"
+    else
+      $sim $valgrind ./pcre2test -q $defaultstack $bmode $testdata/testinput18 testtry
+      checkresult $? 18 ""
+    fi
+  fi
+
+  # Tests for the POSIX interface with UTF/UCP (8-bit only)
+
+  if [ $do19 = yes ] ; then
+    echo $title19
+    if [ "$bits" = "16" -o "$bits" = "32" ] ; then
+      echo "  Skipped when running 16/32-bit tests"
+    elif [ $utf -eq 0 ] ; then
+      echo "  Skipped because UTF-$bits support is not available"
+    else
+      $sim $valgrind ./pcre2test -q $defaultstack $bmode $testdata/testinput19 testtry
+      checkresult $? 19 ""
+    fi
+  fi
+
+  # Serialization tests
+
+  if [ $do20 = yes ] ; then
+    echo $title20
+    $sim $valgrind ./pcre2test -q $defaultstack $bmode $testdata/testinput20 testtry
+    checkresult $? 20 ""
+  fi
+
+  # \C tests without UTF - DFA matching is supported
+
+  if [ "$do21" = yes ] ; then
+    echo $title21
+    if [ $supportBSC -eq 0 ] ; then
+      echo "  Skipped because \C is disabled"
+    else
+      for opt in "" $jitopt -dfa; do
+        $sim $valgrind ${opt:+$vjs} ./pcre2test -q $defaultstack $bmode $opt $testdata/testinput21 testtry
+        checkresult $? 21 "$opt"
+      done
+    fi
+  fi
+
+  # \C tests with UTF - DFA matching is not supported for \C in UTF mode
+
+  if [ "$do22" = yes ] ; then
+    echo $title22
+    if [ $supportBSC -eq 0 ] ; then
+      echo "  Skipped because \C is disabled"
+    elif [ $utf -eq 0 ] ; then
+      echo "  Skipped because UTF-$bits support is not available"
+    else
+      for opt in "" $jitopt; do
+        $sim $valgrind ${opt:+$vjs} ./pcre2test -q $defaultstack $bmode $opt $testdata/testinput22 testtry
+        checkresult $? 22-$bits "$opt"
+      done
+    fi
+  fi
+
+  # Test when \C is disabled
+
+  if [ "$do23" = yes ] ; then
+    echo $title23
+    if [ $supportBSC -ne 0 ] ; then
+      echo "  Skipped because \C is not disabled"
+    else
+      $sim $valgrind ${opt:+$vjs} ./pcre2test -q $defaultstack $bmode $opt $testdata/testinput23 testtry
+      checkresult $? 23 ""
+    fi
+  fi
+
+# End of loop for 8/16/32-bit tests
+done
+
+# Clean up local working files
+rm -f testSinput test3input testsaved1 testsaved2 test3output test3outputA test3outputB teststdout teststderr testtry
+
+# End
diff --git a/dist2/RunTest.bat b/dist2/RunTest.bat
new file mode 100644
index 0000000..ce9d5b5
--- /dev/null
+++ b/dist2/RunTest.bat
@@ -0,0 +1,524 @@
+@echo off

+@rem

+@rem MS Windows batch file to run pcre2test on testfiles with the correct

+@rem options. This file must use CRLF linebreaks to function properly,

+@rem and requires both pcre2test and pcre2grep.

+@rem

+@rem ------------------------ HISTORY ----------------------------------

+@rem This file was originally contributed to PCRE1 by Ralf Junker, and touched

+@rem up by Daniel Richard G. Tests 10-12 added by Philip H.

+@rem Philip H also changed test 3 to use "wintest" files.

+@rem

+@rem Updated by Tom Fortmann to support explicit test numbers on the command

+@rem line. Added argument validation and added error reporting.

+@rem

+@rem Sheri Pierce added logic to skip feature dependent tests

+@rem tests 4 5 7 10 12 14 19 and 22 require Unicode support

+@rem 8 requires Unicode and link size 2

+@rem 16 requires absence of jit support

+@rem 17 requires presence of jit support

+@rem Sheri P also added override tests for study and jit testing

+@rem Zoltan Herczeg added libpcre16 support

+@rem Zoltan Herczeg added libpcre32 support

+@rem -------------------------------------------------------------------

+@rem

+@rem The file was converted for PCRE2 by PH, February 2015.

+@rem Updated for new test 14 (moving others up a number), August 2015.

+@rem Tidied and updated for new tests 21, 22, 23 by PH, October 2015.

+

+

+setlocal enabledelayedexpansion

+if [%srcdir%]==[] (

+if exist testdata\ set srcdir=.)

+if [%srcdir%]==[] (

+if exist ..\testdata\ set srcdir=..)

+if [%srcdir%]==[] (

+if exist ..\..\testdata\ set srcdir=..\..)

+if NOT exist %srcdir%\testdata\ (

+Error: echo distribution testdata folder not found!

+call :conferror

+exit /b 1

+goto :eof

+)

+

+if [%pcre2test%]==[] set pcre2test=.\pcre2test.exe

+

+echo source dir is %srcdir%

+echo pcre2test=%pcre2test%

+

+if NOT exist %pcre2test% (

+echo Error: %pcre2test% not found!

+echo.

+call :conferror

+exit /b 1

+)

+

+%pcre2test% -C linksize >NUL

+set link_size=%ERRORLEVEL%

+%pcre2test% -C pcre2-8 >NUL

+set support8=%ERRORLEVEL%

+%pcre2test% -C pcre2-16 >NUL

+set support16=%ERRORLEVEL%

+%pcre2test% -C pcre2-32 >NUL

+set support32=%ERRORLEVEL%

+%pcre2test% -C unicode >NUL

+set unicode=%ERRORLEVEL%

+%pcre2test% -C jit >NUL

+set jit=%ERRORLEVEL%

+%pcre2test% -C backslash-C >NUL

+set supportBSC=%ERRORLEVEL%

+

+if %support8% EQU 1 (

+if not exist testout8 md testout8

+if not exist testoutjit8 md testoutjit8

+)

+

+if %support16% EQU 1 (

+if not exist testout16 md testout16

+if not exist testoutjit16 md testoutjit16

+)

+

+if %support16% EQU 1 (

+if not exist testout32 md testout32

+if not exist testoutjit32 md testoutjit32

+)

+

+set do1=no

+set do2=no

+set do3=no

+set do4=no

+set do5=no

+set do6=no

+set do7=no

+set do8=no

+set do9=no

+set do10=no

+set do11=no

+set do12=no

+set do13=no

+set do14=no

+set do15=no

+set do16=no

+set do17=no

+set do18=no

+set do19=no

+set do20=no

+set do21=no

+set do22=no

+set do23=no

+set all=yes

+

+for %%a in (%*) do (

+  set valid=no

+  for %%v in (1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23) do if %%v == %%a set valid=yes

+  if "!valid!" == "yes" (

+    set do%%a=yes

+    set all=no

+) else (

+    echo Invalid test number - %%a!

+        echo Usage %0 [ test_number ] ...

+        echo Where test_number is one or more optional test numbers 1 through 23, default is all tests.

+        exit /b 1

+)

+)

+set failed="no"

+

+if "%all%" == "yes" (

+  set do1=yes

+  set do2=yes

+  set do3=yes

+  set do4=yes

+  set do5=yes

+  set do6=yes

+  set do7=yes

+  set do8=yes

+  set do9=yes

+  set do10=yes

+  set do11=yes

+  set do12=yes

+  set do13=yes

+  set do14=yes

+  set do15=yes

+  set do16=yes

+  set do17=yes

+  set do18=yes

+  set do19=yes

+  set do20=yes

+  set do21=yes

+  set do22=yes

+  set do23=yes

+)

+

+@echo RunTest.bat's pcre2test output is written to newly created subfolders

+@echo named testout{8,16,32} and testoutjit{8,16,32}.

+@echo.

+

+set mode=

+set bits=8

+

+:nextMode

+if "%mode%" == "" (

+  if %support8% EQU 0 goto modeSkip

+  echo.

+  echo ---- Testing 8-bit library ----

+  echo.

+)

+if "%mode%" == "-16" (

+  if %support16% EQU 0 goto modeSkip

+  echo.

+  echo ---- Testing 16-bit library ----

+  echo.

+)

+if "%mode%" == "-32" (

+  if %support32% EQU 0 goto modeSkip

+  echo.

+  echo ---- Testing 32-bit library ----

+  echo.

+)

+if "%do1%" == "yes" call :do1

+if "%do2%" == "yes" call :do2

+if "%do3%" == "yes" call :do3

+if "%do4%" == "yes" call :do4

+if "%do5%" == "yes" call :do5

+if "%do6%" == "yes" call :do6

+if "%do7%" == "yes" call :do7

+if "%do8%" == "yes" call :do8

+if "%do9%" == "yes" call :do9

+if "%do10%" == "yes" call :do10

+if "%do11%" == "yes" call :do11

+if "%do12%" == "yes" call :do12

+if "%do13%" == "yes" call :do13

+if "%do14%" == "yes" call :do14

+if "%do15%" == "yes" call :do15

+if "%do16%" == "yes" call :do16

+if "%do17%" == "yes" call :do17

+if "%do18%" == "yes" call :do18

+if "%do19%" == "yes" call :do19

+if "%do20%" == "yes" call :do20

+if "%do21%" == "yes" call :do21

+if "%do22%" == "yes" call :do22

+if "%do23%" == "yes" call :do23

+:modeSkip

+if "%mode%" == "" (

+  set mode=-16

+  set bits=16

+  goto nextMode

+)

+if "%mode%" == "-16" (

+  set mode=-32

+  set bits=32

+  goto nextMode

+)

+

+@rem If mode is -32, testing is finished

+if %failed% == "yes" (

+echo In above output, one or more of the various tests failed!

+exit /b 1

+)

+echo All OK

+goto :eof

+

+:runsub

+@rem Function to execute pcre2test and compare the output

+@rem Arguments are as follows:

+@rem

+@rem       1 = test number

+@rem       2 = outputdir

+@rem       3 = test name use double quotes

+@rem   4 - 9 = pcre2test options

+

+if [%1] == [] (

+  echo Missing test number argument!

+  exit /b 1

+)

+

+if [%2] == [] (

+  echo Missing outputdir!

+  exit /b 1

+)

+

+if [%3] == [] (

+  echo Missing test name argument!

+  exit /b 1

+)

+

+set testinput=testinput%1

+set testoutput=testoutput%1

+if exist %srcdir%\testdata\win%testinput% (

+  set testinput=wintestinput%1

+  set testoutput=wintestoutput%1

+)

+

+echo Test %1: %3

+%pcre2test% %mode% %4 %5 %6 %7 %8 %9 %srcdir%\testdata\%testinput% >%2%bits%\%testoutput%

+if errorlevel 1 (

+  echo.          failed executing command-line:

+  echo.            %pcre2test% %mode% %4 %5 %6 %7 %8 %9 %srcdir%\testdata\%testinput% ^>%2%bits%\%testoutput%

+  set failed="yes"

+  goto :eof

+)

+

+set type=

+if [%1]==[8] (

+  set type=-%bits%

+)

+if [%1]==[11] (

+  set type=-%bits%

+)

+if [%1]==[12] (

+  set type=-%bits%

+)

+if [%1]==[14] (

+  set type=-%bits%

+)

+

+fc /n %srcdir%\testdata\%testoutput%%type% %2%bits%\%testoutput% >NUL

+

+if errorlevel 1 (

+  echo.          failed comparison: fc /n %srcdir%\testdata\%testoutput% %2%bits%\%testoutput%

+  if [%1]==[2] (

+    echo.

+    echo ** Test 2 requires a lot of stack. PCRE2 can be configured to

+    echo ** use heap for recursion. Otherwise, to pass Test 2

+    echo ** you generally need to allocate 8 mb stack to PCRE2.

+    echo ** See the 'pcre2stack' page for a discussion of PCRE2's

+    echo ** stack usage.

+    echo.

+)

+  if [%1]==[3] (

+    echo.

+    echo ** Test 3 failure usually means french locale is not

+    echo ** available on the system, rather than a bug or problem with PCRE2.

+    echo.

+    goto :eof

+)

+

+  set failed="yes"

+  goto :eof

+)

+

+echo.          Passed.

+goto :eof

+

+:do1

+call :runsub 1 testout "Main non-UTF, non-UCP functionality (Compatible with Perl >= 5.10)" -q

+if %jit% EQU 1 call :runsub 1 testoutjit "Test with JIT Override" -q -jit

+goto :eof

+

+:do2

+  call :runsub 2 testout "API, errors, internals, and non-Perl stuff" -q

+  if %jit% EQU 1 call :runsub 2 testoutjit "Test with JIT Override" -q -jit

+goto :eof

+

+:do3

+  call :runsub 3 testout "Locale-specific features" -q

+  if %jit% EQU 1 call :runsub 3 testoutjit "Test with JIT Override" -q -jit

+goto :eof

+

+:do4

+if %unicode% EQU 0 (

+  echo Test 4 Skipped due to absence of Unicode support.

+  goto :eof

+)

+  call :runsub 4 testout "UTF-%bits% and Unicode property support - (Compatible with Perl >= 5.10)" -q

+  if %jit% EQU 1 call :runsub 4 testoutjit "Test with JIT Override" -q -jit

+goto :eof

+

+:do5

+if %unicode% EQU 0 (

+  echo Test 5 Skipped due to absence of Unicode support.

+  goto :eof

+)

+  call :runsub 5 testout "API, internals, and non-Perl stuff for UTF-%bits% and UCP" -q

+  if %jit% EQU 1 call :runsub 5 testoutjit "Test with JIT Override" -q -jit

+goto :eof

+

+:do6

+  call :runsub 6 testout "DFA matching main non-UTF, non-UCP functionality" -q

+goto :eof

+

+:do7

+if %unicode% EQU 0 (

+  echo Test 7 Skipped due to absence of Unicode support.

+  goto :eof

+)

+  call :runsub 7 testout "DFA matching with UTF-%bits% and Unicode property support" -q

+  goto :eof

+

+:do8

+if NOT %link_size% EQU 2 (

+  echo Test 8 Skipped because link size is not 2.

+  goto :eof

+)

+if %unicode% EQU 0 (

+  echo Test 8 Skipped due to absence of Unicode support.

+  goto :eof

+)

+  call :runsub 8 testout "Internal offsets and code size tests" -q

+goto :eof

+

+:do9

+if NOT %bits% EQU 8 (

+  echo Test 9 Skipped when running 16/32-bit tests.

+  goto :eof

+)

+  call :runsub 9 testout "Specials for the basic 8-bit library" -q

+  if %jit% EQU 1 call :runsub 9 testoutjit "Test with JIT Override" -q -jit

+goto :eof

+

+:do10

+if NOT %bits% EQU 8 (

+  echo Test 10 Skipped when running 16/32-bit tests.

+  goto :eof

+)

+if %unicode% EQU 0 (

+  echo Test 10 Skipped due to absence of Unicode support.

+  goto :eof

+)

+  call :runsub 10 testout "Specials for the 8-bit library with Unicode support" -q

+  if %jit% EQU 1 call :runsub 10 testoutjit "Test with JIT Override" -q -jit

+goto :eof

+

+:do11

+if %bits% EQU 8 (

+  echo Test 11 Skipped when running 8-bit tests.

+  goto :eof

+)

+  call :runsub 11 testout "Specials for the basic 16/32-bit library" -q

+  if %jit% EQU 1 call :runsub 11 testoutjit "Test with JIT Override" -q -jit

+goto :eof

+

+:do12

+if %bits% EQU 8 (

+  echo Test 12 Skipped when running 8-bit tests.

+  goto :eof

+)

+if %unicode% EQU 0 (

+  echo Test 12 Skipped due to absence of Unicode support.

+  goto :eof

+)

+  call :runsub 12 testout "Specials for the 16/32-bit library with Unicode support" -q

+  if %jit% EQU 1 call :runsub 12 testoutjit "Test with JIT Override" -q -jit

+goto :eof

+

+:do13

+if %bits% EQU 8 (

+  echo Test 13 Skipped when running 8-bit tests.

+  goto :eof

+)

+  call :runsub 13 testout "DFA specials for the basic 16/32-bit library" -q

+goto :eof

+

+:do14

+if %unicode% EQU 0 (

+  echo Test 14 Skipped due to absence of Unicode support.

+  goto :eof

+)

+  call :runsub 14 testout "DFA specials for UTF and UCP support" -q

+  goto :eof

+

+:do15

+call :runsub 15 testout "Non-JIT limits and other non_JIT tests" -q

+goto :eof

+

+:do16

+if %jit% EQU 1 (

+  echo Test 16 Skipped due to presence of JIT support.

+  goto :eof

+)

+  call :runsub 16 testout "JIT-specific features when JIT is not available" -q

+goto :eof

+

+:do17

+if %jit% EQU 0 (

+  echo Test 17 Skipped due to absence of JIT support.

+  goto :eof

+)

+  call :runsub 17 testout "JIT-specific features when JIT is available" -q

+goto :eof

+

+:do18

+if %bits% EQU 16 (

+  echo Test 18 Skipped when running 16-bit tests.

+  goto :eof

+)

+if %bits% EQU 32 (

+  echo Test 18 Skipped when running 32-bit tests.

+  goto :eof

+)

+  call :runsub 18 testout "POSIX interface, excluding UTF-8 and UCP" -q

+goto :eof

+

+:do19

+if %bits% EQU 16 (

+  echo Test 19 Skipped when running 16-bit tests.

+  goto :eof

+)

+if %bits% EQU 32 (

+  echo Test 19 Skipped when running 32-bit tests.

+  goto :eof

+)

+if %unicode% EQU 0 (

+  echo Test 19 Skipped due to absence of Unicode support.

+  goto :eof

+)

+  call :runsub 19 testout "POSIX interface with UTF-8 and UCP" -q

+goto :eof

+

+:do20

+call :runsub 20 testout "Serialization tests" -q

+goto :eof

+

+:do21

+if %supportBSC% EQU 0 (

+  echo Test 21 Skipped due to absence of backslash-C support.

+  goto :eof

+)

+  call :runsub 21 testout "Backslash-C tests without UTF" -q

+  call :runsub 21 testout "Backslash-C tests without UTF (DFA)" -q -dfa

+  if %jit% EQU 1 call :runsub 21 testoutjit "Test with JIT Override" -q -jit

+goto :eof

+

+:do22

+if %supportBSC% EQU 0 (

+  echo Test 22 Skipped due to absence of backslash-C support.

+  goto :eof

+)

+if %unicode% EQU 0 (

+  echo Test 22 Skipped due to absence of Unicode support.

+  goto :eof

+)

+  call :runsub 22 testout "Backslash-C tests with UTF" -q

+  if %jit% EQU 1 call :runsub 22 testoutjit "Test with JIT Override" -q -jit

+goto :eof

+

+:do23

+if %supportBSC% EQU 1 (

+  echo Test 23 Skipped due to presence of backslash-C support.

+  goto :eof

+)

+  call :runsub 23 testout "Backslash-C disabled test" -q

+goto :eof

+

+:conferror

+@echo.

+@echo Either your build is incomplete or you have a configuration error.

+@echo.

+@echo If configured with cmake and executed via "make test" or the MSVC "RUN_TESTS"

+@echo project, pcre2_test.bat defines variables and automatically calls RunTest.bat.

+@echo For manual testing of all available features, after configuring with cmake

+@echo and building, you can run the built pcre2_test.bat. For best results with

+@echo cmake builds and tests avoid directories with full path names that include

+@echo spaces for source or build.

+@echo.

+@echo Otherwise, if the build dir is in a subdir of the source dir, testdata needed

+@echo for input and verification should be found automatically when (from the

+@echo location of the the built exes) you call RunTest.bat. By default RunTest.bat

+@echo runs all tests compatible with the linked pcre2 library but it can be given

+@echo a test number as an argument.

+@echo.

+@echo If the build dir is not under the source dir you can either copy your exes

+@echo to the source folder or copy RunTest.bat and the testdata folder to the

+@echo location of your built exes and then run RunTest.bat.

+@echo.

+goto :eof

diff --git a/dist/aclocal.m4 b/dist2/aclocal.m4
similarity index 99%
rename from dist/aclocal.m4
rename to dist2/aclocal.m4
index 0241dd2..10c9cd1 100644
--- a/dist/aclocal.m4
+++ b/dist2/aclocal.m4
@@ -1492,4 +1492,4 @@
 m4_include([m4/ltsugar.m4])
 m4_include([m4/ltversion.m4])
 m4_include([m4/lt~obsolete.m4])
-m4_include([m4/pcre_visibility.m4])
+m4_include([m4/pcre2_visibility.m4])
diff --git a/dist/ar-lib b/dist2/ar-lib
similarity index 100%
rename from dist/ar-lib
rename to dist2/ar-lib
diff --git a/dist/cmake/COPYING-CMAKE-SCRIPTS b/dist2/cmake/COPYING-CMAKE-SCRIPTS
similarity index 100%
rename from dist/cmake/COPYING-CMAKE-SCRIPTS
rename to dist2/cmake/COPYING-CMAKE-SCRIPTS
diff --git a/dist/cmake/FindEditline.cmake b/dist2/cmake/FindEditline.cmake
similarity index 100%
rename from dist/cmake/FindEditline.cmake
rename to dist2/cmake/FindEditline.cmake
diff --git a/dist/cmake/FindPackageHandleStandardArgs.cmake b/dist2/cmake/FindPackageHandleStandardArgs.cmake
similarity index 100%
rename from dist/cmake/FindPackageHandleStandardArgs.cmake
rename to dist2/cmake/FindPackageHandleStandardArgs.cmake
diff --git a/dist/cmake/FindReadline.cmake b/dist2/cmake/FindReadline.cmake
similarity index 100%
rename from dist/cmake/FindReadline.cmake
rename to dist2/cmake/FindReadline.cmake
diff --git a/dist/compile b/dist2/compile
similarity index 100%
rename from dist/compile
rename to dist2/compile
diff --git a/dist2/config-cmake.h.in b/dist2/config-cmake.h.in
new file mode 100644
index 0000000..0cfd8b1
--- /dev/null
+++ b/dist2/config-cmake.h.in
@@ -0,0 +1,48 @@
+/* config.h for CMake builds */
+
+#cmakedefine HAVE_DIRENT_H 1
+#cmakedefine HAVE_INTTYPES_H 1    
+#cmakedefine HAVE_STDINT_H 1                                                   
+#cmakedefine HAVE_STRERROR 1
+#cmakedefine HAVE_SYS_STAT_H 1
+#cmakedefine HAVE_SYS_TYPES_H 1
+#cmakedefine HAVE_UNISTD_H 1
+#cmakedefine HAVE_WINDOWS_H 1
+
+#cmakedefine HAVE_BCOPY 1
+#cmakedefine HAVE_MEMMOVE 1
+
+#cmakedefine PCRE2_STATIC 1
+
+#cmakedefine SUPPORT_PCRE2_8 1
+#cmakedefine SUPPORT_PCRE2_16 1
+#cmakedefine SUPPORT_PCRE2_32 1
+#cmakedefine PCRE2_DEBUG 1
+
+#cmakedefine SUPPORT_LIBBZ2 1
+#cmakedefine SUPPORT_LIBEDIT 1
+#cmakedefine SUPPORT_LIBREADLINE 1
+#cmakedefine SUPPORT_LIBZ 1
+
+#cmakedefine SUPPORT_JIT 1
+#cmakedefine SUPPORT_PCRE2GREP_JIT 1
+#cmakedefine SUPPORT_UNICODE 1
+#cmakedefine SUPPORT_VALGRIND 1
+
+#cmakedefine BSR_ANYCRLF 1
+#cmakedefine EBCDIC 1
+#cmakedefine EBCDIC_NL25 1
+#cmakedefine HEAP_MATCH_RECURSE 1
+#cmakedefine NEVER_BACKSLASH_C 1
+
+#define LINK_SIZE		@PCRE2_LINK_SIZE@
+#define MATCH_LIMIT		@PCRE2_MATCH_LIMIT@
+#define MATCH_LIMIT_RECURSION	@PCRE2_MATCH_LIMIT_RECURSION@
+#define NEWLINE_DEFAULT         @NEWLINE_DEFAULT@
+#define PARENS_NEST_LIMIT       @PCRE2_PARENS_NEST_LIMIT@
+#define PCRE2GREP_BUFSIZE       @PCRE2GREP_BUFSIZE@
+
+#define MAX_NAME_SIZE	32
+#define MAX_NAME_COUNT	10000
+
+/* end config.h for CMake builds */
diff --git a/dist/config.guess b/dist2/config.guess
similarity index 100%
rename from dist/config.guess
rename to dist2/config.guess
diff --git a/dist/config.sub b/dist2/config.sub
similarity index 100%
rename from dist/config.sub
rename to dist2/config.sub
diff --git a/dist/configure b/dist2/configure
similarity index 74%
rename from dist/configure
rename to dist2/configure
index 5ca9342..e9f9e37 100755
--- a/dist/configure
+++ b/dist2/configure
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for PCRE 8.38.
+# Generated by GNU Autoconf 2.69 for PCRE2 10.21.
 #
 #
 # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
@@ -585,14 +585,14 @@
 MAKEFLAGS=
 
 # Identity of this package.
-PACKAGE_NAME='PCRE'
-PACKAGE_TARNAME='pcre'
-PACKAGE_VERSION='8.38'
-PACKAGE_STRING='PCRE 8.38'
+PACKAGE_NAME='PCRE2'
+PACKAGE_TARNAME='pcre2'
+PACKAGE_VERSION='10.21'
+PACKAGE_STRING='PCRE2 10.21'
 PACKAGE_BUGREPORT=''
 PACKAGE_URL=''
 
-ac_unique_file="pcre.h.in"
+ac_unique_file="src/pcre2.h.in"
 # Factoring default headers for most tests.
 ac_includes_default="\
 #include <stdio.h>
@@ -649,49 +649,42 @@
 LIBBZ2
 LIBZ
 DISTCHECK_CONFIGURE_FLAGS
-EXTRA_LIBPCRECPP_LDFLAGS
-EXTRA_LIBPCREPOSIX_LDFLAGS
-EXTRA_LIBPCRE32_LDFLAGS
-EXTRA_LIBPCRE16_LDFLAGS
-EXTRA_LIBPCRE_LDFLAGS
+EXTRA_LIBPCRE2_POSIX_LDFLAGS
+EXTRA_LIBPCRE2_32_LDFLAGS
+EXTRA_LIBPCRE2_16_LDFLAGS
+EXTRA_LIBPCRE2_8_LDFLAGS
 PTHREAD_CFLAGS
 PTHREAD_LIBS
 PTHREAD_CC
 ax_pthread_config
-PCRE_STATIC_CFLAG
+PCRE2_STATIC_CFLAG
 LIBREADLINE
 WITH_VALGRIND_FALSE
 WITH_VALGRIND_TRUE
-WITH_UTF_FALSE
-WITH_UTF_TRUE
+WITH_UNICODE_FALSE
+WITH_UNICODE_TRUE
 WITH_JIT_FALSE
 WITH_JIT_TRUE
 WITH_REBUILD_CHARTABLES_FALSE
 WITH_REBUILD_CHARTABLES_TRUE
-WITH_PCRE_CPP_FALSE
-WITH_PCRE_CPP_TRUE
-WITH_PCRE32_FALSE
-WITH_PCRE32_TRUE
-WITH_PCRE16_FALSE
-WITH_PCRE16_TRUE
-WITH_PCRE8_FALSE
-WITH_PCRE8_TRUE
-pcre_have_bits_type_traits
-pcre_have_type_traits
-pcre_have_ulong_long
-pcre_have_long_long
-enable_cpp
-enable_pcre32
-enable_pcre16
-enable_pcre8
-PCRE_DATE
-PCRE_PRERELEASE
-PCRE_MINOR
-PCRE_MAJOR
+WITH_DEBUG_FALSE
+WITH_DEBUG_TRUE
+WITH_PCRE2_32_FALSE
+WITH_PCRE2_32_TRUE
+WITH_PCRE2_16_FALSE
+WITH_PCRE2_16_TRUE
+WITH_PCRE2_8_FALSE
+WITH_PCRE2_8_TRUE
+enable_pcre2_32
+enable_pcre2_16
+enable_pcre2_8
+PCRE2_DATE
+PCRE2_PRERELEASE
+PCRE2_MINOR
+PCRE2_MAJOR
 HAVE_VISIBILITY
 VISIBILITY_CXXFLAGS
 VISIBILITY_CFLAGS
-CXXCPP
 LT_SYS_LIBRARY_PATH
 OTOOL64
 OTOOL
@@ -722,12 +715,6 @@
 EGREP
 GREP
 CPP
-am__fastdepCXX_FALSE
-am__fastdepCXX_TRUE
-CXXDEPMODE
-ac_ct_CXX
-CXXFLAGS
-CXX
 am__fastdepCC_FALSE
 am__fastdepCC_TRUE
 CCDEPMODE
@@ -828,28 +815,29 @@
 enable_pcre8
 enable_pcre16
 enable_pcre32
-enable_cpp
+enable_pcre2_8
+enable_pcre2_16
+enable_pcre2_32
+enable_debug
 enable_jit
-enable_pcregrep_jit
+enable_pcre2grep_jit
 enable_rebuild_chartables
-enable_utf8
-enable_utf
-enable_unicode_properties
+enable_unicode
 enable_newline_is_cr
 enable_newline_is_lf
 enable_newline_is_crlf
 enable_newline_is_anycrlf
 enable_newline_is_any
 enable_bsr_anycrlf
+enable_never_backslash_C
 enable_ebcdic
 enable_ebcdic_nl25
 enable_stack_for_recursion
-enable_pcregrep_libz
-enable_pcregrep_libbz2
-with_pcregrep_bufsize
-enable_pcretest_libedit
-enable_pcretest_libreadline
-with_posix_malloc_threshold
+enable_pcre2grep_libz
+enable_pcre2grep_libbz2
+with_pcre2grep_bufsize
+enable_pcre2test_libedit
+enable_pcre2test_libreadline
 with_link_size
 with_parens_nest_limit
 with_match_limit
@@ -865,12 +853,8 @@
 LDFLAGS
 LIBS
 CPPFLAGS
-CXX
-CXXFLAGS
-CCC
 CPP
 LT_SYS_LIBRARY_PATH
-CXXCPP
 PKG_CONFIG
 PKG_CONFIG_PATH
 PKG_CONFIG_LIBDIR
@@ -1418,7 +1402,7 @@
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures PCRE 8.38 to adapt to many kinds of systems.
+\`configure' configures PCRE2 10.21 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1466,7 +1450,7 @@
   --infodir=DIR           info documentation [DATAROOTDIR/info]
   --localedir=DIR         locale-dependent data [DATAROOTDIR/locale]
   --mandir=DIR            man documentation [DATAROOTDIR/man]
-  --docdir=DIR            documentation root [DATAROOTDIR/doc/pcre]
+  --docdir=DIR            documentation root [DATAROOTDIR/doc/pcre2]
   --htmldir=DIR           html documentation [DOCDIR]
   --dvidir=DIR            dvi documentation [DOCDIR]
   --pdfdir=DIR            pdf documentation [DOCDIR]
@@ -1488,7 +1472,7 @@
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of PCRE 8.38:";;
+     short | recursive ) echo "Configuration of PCRE2 10.21:";;
    esac
   cat <<\_ACEOF
 
@@ -1507,21 +1491,16 @@
   --enable-fast-install[=PKGS]
                           optimize for fast installation [default=yes]
   --disable-libtool-lock  avoid locking (might break parallel builds)
-  --disable-pcre8         disable 8 bit character support
-  --enable-pcre16         enable 16 bit character support
-  --enable-pcre32         enable 32 bit character support
-  --disable-cpp           disable C++ support
+
+  --disable-pcre2-8       disable 8 bit character support
+  --enable-pcre2-16       enable 16 bit character support
+  --enable-pcre2-32       enable 32 bit character support
+  --enable-debug          enable debugging code
   --enable-jit            enable Just-In-Time compiling support
-  --disable-pcregrep-jit  disable JIT support in pcregrep
+  --disable-pcre2grep-jit disable JIT support in pcre2grep
   --enable-rebuild-chartables
                           rebuild character tables in current locale
-  --enable-utf8           another name for --enable-utf. Kept only for
-                          compatibility reasons
-  --enable-utf            enable UTF-8/16/32 support (incompatible with
-                          --enable-ebcdic)
-  --enable-unicode-properties
-                          enable Unicode properties support (implies
-                          --enable-utf)
+  --disable-unicode       disable Unicode support
   --enable-newline-is-cr  use CR as newline character
   --enable-newline-is-lf  use LF as newline character (default)
   --enable-newline-is-crlf
@@ -1530,6 +1509,8 @@
                           use CR, LF, or CRLF as newline sequence
   --enable-newline-is-any use any valid Unicode newline sequence
   --enable-bsr-anycrlf    \R matches only CR, LF, CRLF by default
+  --enable-never-backslash-C
+                          use of \C causes an error
   --enable-ebcdic         assume EBCDIC coding rather than ASCII; incompatible
                           with --enable-utf; use only in (uncommon) EBCDIC
                           environments; it implies --enable-rebuild-chartables
@@ -1537,13 +1518,13 @@
                           implies --enable-ebcdic
   --disable-stack-for-recursion
                           don't use stack recursion when matching
-  --enable-pcregrep-libz  link pcregrep with libz to handle .gz files
-  --enable-pcregrep-libbz2
-                          link pcregrep with libbz2 to handle .bz2 files
-  --enable-pcretest-libedit
-                          link pcretest with libedit
-  --enable-pcretest-libreadline
-                          link pcretest with libreadline
+  --enable-pcre2grep-libz link pcre2grep with libz to handle .gz files
+  --enable-pcre2grep-libbz2
+                          link pcre2grep with libbz2 to handle .bz2 files
+  --enable-pcre2test-libedit
+                          link pcre2test with libedit
+  --enable-pcre2test-libreadline
+                          link pcre2test with libreadline
   --enable-valgrind       valgrind support
   --enable-coverage       enable code coverage reports using gcov
 
@@ -1558,10 +1539,8 @@
   --with-gnu-ld           assume the C compiler uses GNU ld [default=no]
   --with-sysroot[=DIR]    Search for dependent libraries within DIR (or the
                           compiler's sysroot if not specified).
-  --with-pcregrep-bufsize=N
-                          pcregrep buffer size (default=20480, minimum=8192)
-  --with-posix-malloc-threshold=NBYTES
-                          threshold for POSIX malloc usage (default=10)
+  --with-pcre2grep-bufsize=N
+                          pcre2grep buffer size (default=20480, minimum=8192)
   --with-link-size=N      internal link size (2, 3, or 4 allowed; default=2)
   --with-parens-nest-limit=N
                           nested parentheses limit (default=250)
@@ -1578,12 +1557,9 @@
   LIBS        libraries to pass to the linker, e.g. -l<library>
   CPPFLAGS    (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
               you have headers in a nonstandard directory <include dir>
-  CXX         C++ compiler command
-  CXXFLAGS    C++ compiler flags
   CPP         C preprocessor
   LT_SYS_LIBRARY_PATH
               User-defined run-time library search path.
-  CXXCPP      C++ preprocessor
   PKG_CONFIG  path to pkg-config utility
   PKG_CONFIG_PATH
               directories to add to pkg-config's search path
@@ -1662,7 +1638,7 @@
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-PCRE configure 8.38
+PCRE2 configure 10.21
 generated by GNU Autoconf 2.69
 
 Copyright (C) 2012 Free Software Foundation, Inc.
@@ -1714,44 +1690,6 @@
 
 } # ac_fn_c_try_compile
 
-# ac_fn_cxx_try_compile LINENO
-# ----------------------------
-# Try to compile conftest.$ac_ext, and return whether this succeeded.
-ac_fn_cxx_try_compile ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  rm -f conftest.$ac_objext
-  if { { ac_try="$ac_compile"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_compile") 2>conftest.err
-  ac_status=$?
-  if test -s conftest.err; then
-    grep -v '^ *+' conftest.err >conftest.er1
-    cat conftest.er1 >&5
-    mv -f conftest.er1 conftest.err
-  fi
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && {
-	 test -z "$ac_cxx_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest.$ac_objext; then :
-  ac_retval=0
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_retval=1
-fi
-  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-  as_fn_set_status $ac_retval
-
-} # ac_fn_cxx_try_compile
-
 # ac_fn_c_try_cpp LINENO
 # ----------------------
 # Try to preprocess conftest.$ac_ext, and return whether this succeeded.
@@ -2051,89 +1989,6 @@
 
 } # ac_fn_c_check_func
 
-# ac_fn_cxx_try_cpp LINENO
-# ------------------------
-# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
-ac_fn_cxx_try_cpp ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  if { { ac_try="$ac_cpp conftest.$ac_ext"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
-  ac_status=$?
-  if test -s conftest.err; then
-    grep -v '^ *+' conftest.err >conftest.er1
-    cat conftest.er1 >&5
-    mv -f conftest.er1 conftest.err
-  fi
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } > conftest.i && {
-	 test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
-	 test ! -s conftest.err
-       }; then :
-  ac_retval=0
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-    ac_retval=1
-fi
-  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-  as_fn_set_status $ac_retval
-
-} # ac_fn_cxx_try_cpp
-
-# ac_fn_cxx_try_link LINENO
-# -------------------------
-# Try to link conftest.$ac_ext, and return whether this succeeded.
-ac_fn_cxx_try_link ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  rm -f conftest.$ac_objext conftest$ac_exeext
-  if { { ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_link") 2>conftest.err
-  ac_status=$?
-  if test -s conftest.err; then
-    grep -v '^ *+' conftest.err >conftest.er1
-    cat conftest.er1 >&5
-    mv -f conftest.er1 conftest.err
-  fi
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && {
-	 test -z "$ac_cxx_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest$ac_exeext && {
-	 test "$cross_compiling" = yes ||
-	 test -x conftest$ac_exeext
-       }; then :
-  ac_retval=0
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_retval=1
-fi
-  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
-  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
-  # interfere with the next link command; also delete a directory that is
-  # left behind by Apple's compiler.  We do this before executing the actions.
-  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
-  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-  as_fn_set_status $ac_retval
-
-} # ac_fn_cxx_try_link
-
 # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES
 # -------------------------------------------------------
 # Tests whether HEADER exists, giving a warning if it cannot be compiled using
@@ -2221,147 +2076,6 @@
 
 } # ac_fn_c_check_header_mongrel
 
-# ac_fn_cxx_check_header_mongrel LINENO HEADER VAR INCLUDES
-# ---------------------------------------------------------
-# Tests whether HEADER exists, giving a warning if it cannot be compiled using
-# the include files in INCLUDES and setting the cache variable VAR
-# accordingly.
-ac_fn_cxx_check_header_mongrel ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  if eval \${$3+:} false; then :
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
-  $as_echo_n "(cached) " >&6
-fi
-eval ac_res=\$$3
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-else
-  # Is the header compilable?
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5
-$as_echo_n "checking $2 usability... " >&6; }
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-#include <$2>
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
-  ac_header_compiler=yes
-else
-  ac_header_compiler=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5
-$as_echo "$ac_header_compiler" >&6; }
-
-# Is the header present?
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5
-$as_echo_n "checking $2 presence... " >&6; }
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <$2>
-_ACEOF
-if ac_fn_cxx_try_cpp "$LINENO"; then :
-  ac_header_preproc=yes
-else
-  ac_header_preproc=no
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5
-$as_echo "$ac_header_preproc" >&6; }
-
-# So?  What about this header?
-case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in #((
-  yes:no: )
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5
-$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;}
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
-$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
-    ;;
-  no:yes:* )
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5
-$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;}
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     check for missing prerequisite headers?" >&5
-$as_echo "$as_me: WARNING: $2:     check for missing prerequisite headers?" >&2;}
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5
-$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&5
-$as_echo "$as_me: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&2;}
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
-$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
-    ;;
-esac
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  eval "$3=\$ac_header_compiler"
-fi
-eval ac_res=\$$3
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-fi
-  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-
-} # ac_fn_cxx_check_header_mongrel
-
-# ac_fn_cxx_check_type LINENO TYPE VAR INCLUDES
-# ---------------------------------------------
-# Tests whether TYPE exists after having included INCLUDES, setting cache
-# variable VAR accordingly.
-ac_fn_cxx_check_type ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  eval "$3=no"
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-int
-main ()
-{
-if (sizeof ($2))
-	 return 0;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-int
-main ()
-{
-if (sizeof (($2)))
-	    return 0;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
-
-else
-  eval "$3=yes"
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-eval ac_res=\$$3
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-
-} # ac_fn_cxx_check_type
-
 # ac_fn_c_check_type LINENO TYPE VAR INCLUDES
 # -------------------------------------------
 # Tests whether TYPE exists after having included INCLUDES, setting cache
@@ -2419,7 +2133,7 @@
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by PCRE $as_me 8.38, which was
+It was created by PCRE2 $as_me 10.21, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
@@ -3282,8 +2996,8 @@
 
 
 # Define the identity of the package.
- PACKAGE='pcre'
- VERSION='8.38'
+ PACKAGE='pcre2'
+ VERSION='10.21'
 
 
 cat >>confdefs.h <<_ACEOF
@@ -3415,7 +3129,7 @@
 fi
 AM_BACKSLASH='\'
 
-ac_config_headers="$ac_config_headers config.h"
+ac_config_headers="$ac_config_headers src/config.h"
 
 
 # This is a new thing required to stop a warning from automake 1.12
@@ -4634,18 +4348,15 @@
 # This was added at the suggestion of libtoolize (03-Jan-10)
 
 
-# The default CFLAGS and CXXFLAGS in Autoconf are "-g -O2" for gcc and just
-# "-g" for any other compiler. There doesn't seem to be a standard way of
-# getting rid of the -g (which I don't think is needed for a production
-# library). This fudge seems to achieve the necessary. First, we remember the
-# externally set values of CFLAGS and CXXFLAGS. Then call the AC_PROG_CC and
-# AC_PROG_CXX macros to find the compilers - if CFLAGS and CXXFLAGS are not
-# set, they will be set to Autoconf's defaults. Afterwards, if the original
+# The default CFLAGS in Autoconf are "-g -O2" for gcc and just "-g" for any
+# other compiler. There doesn't seem to be a standard way of getting rid of the
+# -g (which I don't think is needed for a production library). This fudge seems
+# to achieve the necessary. First, we remember the externally set values of
+# CFLAGS. Then call the AC_PROG_CC macro to find the compiler - if CFLAGS is
+# not set, it will be set to Autoconf's defaults. Afterwards, if the original
 # values were not set, remove the -g from the Autoconf defaults.
-# (PH 02-May-07)
 
 remember_set_CFLAGS="$CFLAGS"
-remember_set_CXXFLAGS="$CXXFLAGS"
 
 ac_ext=c
 ac_cpp='$CPP $CPPFLAGS'
@@ -5373,391 +5084,6 @@
 fi
 
 
-ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-if test -z "$CXX"; then
-  if test -n "$CCC"; then
-    CXX=$CCC
-  else
-    if test -n "$ac_tool_prefix"; then
-  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
-  do
-    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
-set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CXX+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$CXX"; then
-  ac_cv_prog_CXX="$CXX" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-CXX=$ac_cv_prog_CXX
-if test -n "$CXX"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5
-$as_echo "$CXX" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-    test -n "$CXX" && break
-  done
-fi
-if test -z "$CXX"; then
-  ac_ct_CXX=$CXX
-  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
-do
-  # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_CXX+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_CXX"; then
-  ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_CXX="$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
-if test -n "$ac_ct_CXX"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5
-$as_echo "$ac_ct_CXX" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-  test -n "$ac_ct_CXX" && break
-done
-
-  if test "x$ac_ct_CXX" = x; then
-    CXX="g++"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    CXX=$ac_ct_CXX
-  fi
-fi
-
-  fi
-fi
-# Provide some information about the compiler.
-$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5
-set X $ac_compile
-ac_compiler=$2
-for ac_option in --version -v -V -qversion; do
-  { { ac_try="$ac_compiler $ac_option >&5"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
-  ac_status=$?
-  if test -s conftest.err; then
-    sed '10a\
-... rest of stderr output deleted ...
-         10q' conftest.err >conftest.er1
-    cat conftest.er1 >&5
-  fi
-  rm -f conftest.er1 conftest.err
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }
-done
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5
-$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; }
-if ${ac_cv_cxx_compiler_gnu+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-#ifndef __GNUC__
-       choke me
-#endif
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
-  ac_compiler_gnu=yes
-else
-  ac_compiler_gnu=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-ac_cv_cxx_compiler_gnu=$ac_compiler_gnu
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5
-$as_echo "$ac_cv_cxx_compiler_gnu" >&6; }
-if test $ac_compiler_gnu = yes; then
-  GXX=yes
-else
-  GXX=
-fi
-ac_test_CXXFLAGS=${CXXFLAGS+set}
-ac_save_CXXFLAGS=$CXXFLAGS
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5
-$as_echo_n "checking whether $CXX accepts -g... " >&6; }
-if ${ac_cv_prog_cxx_g+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_save_cxx_werror_flag=$ac_cxx_werror_flag
-   ac_cxx_werror_flag=yes
-   ac_cv_prog_cxx_g=no
-   CXXFLAGS="-g"
-   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
-  ac_cv_prog_cxx_g=yes
-else
-  CXXFLAGS=""
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
-
-else
-  ac_cxx_werror_flag=$ac_save_cxx_werror_flag
-	 CXXFLAGS="-g"
-	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
-  ac_cv_prog_cxx_g=yes
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-   ac_cxx_werror_flag=$ac_save_cxx_werror_flag
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5
-$as_echo "$ac_cv_prog_cxx_g" >&6; }
-if test "$ac_test_CXXFLAGS" = set; then
-  CXXFLAGS=$ac_save_CXXFLAGS
-elif test $ac_cv_prog_cxx_g = yes; then
-  if test "$GXX" = yes; then
-    CXXFLAGS="-g -O2"
-  else
-    CXXFLAGS="-g"
-  fi
-else
-  if test "$GXX" = yes; then
-    CXXFLAGS="-O2"
-  else
-    CXXFLAGS=
-  fi
-fi
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-depcc="$CXX"  am_compiler_list=
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
-$as_echo_n "checking dependency style of $depcc... " >&6; }
-if ${am_cv_CXX_dependencies_compiler_type+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
-  # We make a subdir and do the tests there.  Otherwise we can end up
-  # making bogus files that we don't know about and never remove.  For
-  # instance it was reported that on HP-UX the gcc test will end up
-  # making a dummy file named 'D' -- because '-MD' means "put the output
-  # in D".
-  rm -rf conftest.dir
-  mkdir conftest.dir
-  # Copy depcomp to subdir because otherwise we won't find it if we're
-  # using a relative directory.
-  cp "$am_depcomp" conftest.dir
-  cd conftest.dir
-  # We will build objects and dependencies in a subdirectory because
-  # it helps to detect inapplicable dependency modes.  For instance
-  # both Tru64's cc and ICC support -MD to output dependencies as a
-  # side effect of compilation, but ICC will put the dependencies in
-  # the current directory while Tru64 will put them in the object
-  # directory.
-  mkdir sub
-
-  am_cv_CXX_dependencies_compiler_type=none
-  if test "$am_compiler_list" = ""; then
-     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
-  fi
-  am__universal=false
-  case " $depcc " in #(
-     *\ -arch\ *\ -arch\ *) am__universal=true ;;
-     esac
-
-  for depmode in $am_compiler_list; do
-    # Setup a source with many dependencies, because some compilers
-    # like to wrap large dependency lists on column 80 (with \), and
-    # we should not choose a depcomp mode which is confused by this.
-    #
-    # We need to recreate these files for each test, as the compiler may
-    # overwrite some of them when testing with obscure command lines.
-    # This happens at least with the AIX C compiler.
-    : > sub/conftest.c
-    for i in 1 2 3 4 5 6; do
-      echo '#include "conftst'$i'.h"' >> sub/conftest.c
-      # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
-      # Solaris 10 /bin/sh.
-      echo '/* dummy */' > sub/conftst$i.h
-    done
-    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
-
-    # We check with '-c' and '-o' for the sake of the "dashmstdout"
-    # mode.  It turns out that the SunPro C++ compiler does not properly
-    # handle '-M -o', and we need to detect this.  Also, some Intel
-    # versions had trouble with output in subdirs.
-    am__obj=sub/conftest.${OBJEXT-o}
-    am__minus_obj="-o $am__obj"
-    case $depmode in
-    gcc)
-      # This depmode causes a compiler race in universal mode.
-      test "$am__universal" = false || continue
-      ;;
-    nosideeffect)
-      # After this tag, mechanisms are not by side-effect, so they'll
-      # only be used when explicitly requested.
-      if test "x$enable_dependency_tracking" = xyes; then
-	continue
-      else
-	break
-      fi
-      ;;
-    msvc7 | msvc7msys | msvisualcpp | msvcmsys)
-      # This compiler won't grok '-c -o', but also, the minuso test has
-      # not run yet.  These depmodes are late enough in the game, and
-      # so weak that their functioning should not be impacted.
-      am__obj=conftest.${OBJEXT-o}
-      am__minus_obj=
-      ;;
-    none) break ;;
-    esac
-    if depmode=$depmode \
-       source=sub/conftest.c object=$am__obj \
-       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
-       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
-         >/dev/null 2>conftest.err &&
-       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
-       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
-       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
-       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
-      # icc doesn't choke on unknown options, it will just issue warnings
-      # or remarks (even with -Werror).  So we grep stderr for any message
-      # that says an option was ignored or not supported.
-      # When given -MP, icc 7.0 and 7.1 complain thusly:
-      #   icc: Command line warning: ignoring option '-M'; no argument required
-      # The diagnosis changed in icc 8.0:
-      #   icc: Command line remark: option '-MP' not supported
-      if (grep 'ignoring option' conftest.err ||
-          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
-        am_cv_CXX_dependencies_compiler_type=$depmode
-        break
-      fi
-    fi
-  done
-
-  cd ..
-  rm -rf conftest.dir
-else
-  am_cv_CXX_dependencies_compiler_type=none
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5
-$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; }
-CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type
-
- if
-  test "x$enable_dependency_tracking" != xno \
-  && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then
-  am__fastdepCXX_TRUE=
-  am__fastdepCXX_FALSE='#'
-else
-  am__fastdepCXX_TRUE='#'
-  am__fastdepCXX_FALSE=
-fi
-
-
 
 
 if test "x$remember_set_CFLAGS" = "x"
@@ -5771,50 +5097,6 @@
   fi
 fi
 
-if test "x$remember_set_CXXFLAGS" = "x"
-then
-  if test "$CXXFLAGS" = "-g -O2"
-  then
-    CXXFLAGS="-O2"
-  elif test "$CXXFLAGS" = "-g"
-  then
-    CXXFLAGS=""
-  fi
-fi
-
-# AC_PROG_CXX will return "g++" even if no c++ compiler is installed.
-# Check for that case, and just disable c++ code if g++ doesn't run.
-ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-
-
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
-
-else
-  CXX=""; CXXCP=""; CXXFLAGS=""
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
 # Check for a 64-bit integer type
 ac_ext=c
 ac_cpp='$CPP $CPPFLAGS'
@@ -9896,16 +9178,6 @@
 
 
 
-func_stripname_cnf ()
-{
-  case $2 in
-  .*) func_stripname_result=`$ECHO "$3" | $SED "s%^$1%%; s%\\\\$2\$%%"`;;
-  *)  func_stripname_result=`$ECHO "$3" | $SED "s%^$1%%; s%$2\$%%"`;;
-  esac
-} # func_stripname_cnf
-
-
-
 
 
 # Set options
@@ -14180,3310 +13452,6 @@
 
 CC=$lt_save_CC
 
-      if test -n "$CXX" && ( test no != "$CXX" &&
-    ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) ||
-    (test g++ != "$CXX"))); then
-  ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5
-$as_echo_n "checking how to run the C++ preprocessor... " >&6; }
-if test -z "$CXXCPP"; then
-  if ${ac_cv_prog_CXXCPP+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-      # Double quotes because CXXCPP needs to be expanded
-    for CXXCPP in "$CXX -E" "/lib/cpp"
-    do
-      ac_preproc_ok=false
-for ac_cxx_preproc_warn_flag in '' yes
-do
-  # Use a header file that comes with gcc, so configuring glibc
-  # with a fresh cross-compiler works.
-  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-  # <limits.h> exists even on freestanding compilers.
-  # On the NeXT, cc -E runs the code through the compiler's parser,
-  # not just through cpp. "Syntax error" is here to catch this case.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-		     Syntax error
-_ACEOF
-if ac_fn_cxx_try_cpp "$LINENO"; then :
-
-else
-  # Broken: fails on valid input.
-continue
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
-  # OK, works on sane cases.  Now check whether nonexistent headers
-  # can be detected and how.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <ac_nonexistent.h>
-_ACEOF
-if ac_fn_cxx_try_cpp "$LINENO"; then :
-  # Broken: success on invalid input.
-continue
-else
-  # Passes both tests.
-ac_preproc_ok=:
-break
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.i conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then :
-  break
-fi
-
-    done
-    ac_cv_prog_CXXCPP=$CXXCPP
-
-fi
-  CXXCPP=$ac_cv_prog_CXXCPP
-else
-  ac_cv_prog_CXXCPP=$CXXCPP
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5
-$as_echo "$CXXCPP" >&6; }
-ac_preproc_ok=false
-for ac_cxx_preproc_warn_flag in '' yes
-do
-  # Use a header file that comes with gcc, so configuring glibc
-  # with a fresh cross-compiler works.
-  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-  # <limits.h> exists even on freestanding compilers.
-  # On the NeXT, cc -E runs the code through the compiler's parser,
-  # not just through cpp. "Syntax error" is here to catch this case.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-		     Syntax error
-_ACEOF
-if ac_fn_cxx_try_cpp "$LINENO"; then :
-
-else
-  # Broken: fails on valid input.
-continue
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
-  # OK, works on sane cases.  Now check whether nonexistent headers
-  # can be detected and how.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <ac_nonexistent.h>
-_ACEOF
-if ac_fn_cxx_try_cpp "$LINENO"; then :
-  # Broken: success on invalid input.
-continue
-else
-  # Passes both tests.
-ac_preproc_ok=:
-break
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.i conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then :
-
-else
-  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check
-See \`config.log' for more details" "$LINENO" 5; }
-fi
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-else
-  _lt_caught_CXX_error=yes
-fi
-
-ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-
-archive_cmds_need_lc_CXX=no
-allow_undefined_flag_CXX=
-always_export_symbols_CXX=no
-archive_expsym_cmds_CXX=
-compiler_needs_object_CXX=no
-export_dynamic_flag_spec_CXX=
-hardcode_direct_CXX=no
-hardcode_direct_absolute_CXX=no
-hardcode_libdir_flag_spec_CXX=
-hardcode_libdir_separator_CXX=
-hardcode_minus_L_CXX=no
-hardcode_shlibpath_var_CXX=unsupported
-hardcode_automatic_CXX=no
-inherit_rpath_CXX=no
-module_cmds_CXX=
-module_expsym_cmds_CXX=
-link_all_deplibs_CXX=unknown
-old_archive_cmds_CXX=$old_archive_cmds
-reload_flag_CXX=$reload_flag
-reload_cmds_CXX=$reload_cmds
-no_undefined_flag_CXX=
-whole_archive_flag_spec_CXX=
-enable_shared_with_static_runtimes_CXX=no
-
-# Source file extension for C++ test sources.
-ac_ext=cpp
-
-# Object file extension for compiled C++ test sources.
-objext=o
-objext_CXX=$objext
-
-# No sense in running all these tests if we already determined that
-# the CXX compiler isn't working.  Some variables (like enable_shared)
-# are currently assumed to apply to all compilers on this platform,
-# and will be corrupted by setting them based on a non-working compiler.
-if test yes != "$_lt_caught_CXX_error"; then
-  # Code to be used in simple compile tests
-  lt_simple_compile_test_code="int some_variable = 0;"
-
-  # Code to be used in simple link tests
-  lt_simple_link_test_code='int main(int, char *[]) { return(0); }'
-
-  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
-
-
-
-
-
-
-# If no C compiler was specified, use CC.
-LTCC=${LTCC-"$CC"}
-
-# If no C compiler flags were specified, use CFLAGS.
-LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
-
-# Allow CC to be a program name with arguments.
-compiler=$CC
-
-
-  # save warnings/boilerplate of simple test code
-  ac_outfile=conftest.$ac_objext
-echo "$lt_simple_compile_test_code" >conftest.$ac_ext
-eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_compiler_boilerplate=`cat conftest.err`
-$RM conftest*
-
-  ac_outfile=conftest.$ac_objext
-echo "$lt_simple_link_test_code" >conftest.$ac_ext
-eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_linker_boilerplate=`cat conftest.err`
-$RM -r conftest*
-
-
-  # Allow CC to be a program name with arguments.
-  lt_save_CC=$CC
-  lt_save_CFLAGS=$CFLAGS
-  lt_save_LD=$LD
-  lt_save_GCC=$GCC
-  GCC=$GXX
-  lt_save_with_gnu_ld=$with_gnu_ld
-  lt_save_path_LD=$lt_cv_path_LD
-  if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
-    lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
-  else
-    $as_unset lt_cv_prog_gnu_ld
-  fi
-  if test -n "${lt_cv_path_LDCXX+set}"; then
-    lt_cv_path_LD=$lt_cv_path_LDCXX
-  else
-    $as_unset lt_cv_path_LD
-  fi
-  test -z "${LDCXX+set}" || LD=$LDCXX
-  CC=${CXX-"c++"}
-  CFLAGS=$CXXFLAGS
-  compiler=$CC
-  compiler_CXX=$CC
-  func_cc_basename $compiler
-cc_basename=$func_cc_basename_result
-
-
-  if test -n "$compiler"; then
-    # We don't want -fno-exception when compiling C++ code, so set the
-    # no_builtin_flag separately
-    if test yes = "$GXX"; then
-      lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin'
-    else
-      lt_prog_compiler_no_builtin_flag_CXX=
-    fi
-
-    if test yes = "$GXX"; then
-      # Set up default GNU C++ configuration
-
-
-
-# Check whether --with-gnu-ld was given.
-if test "${with_gnu_ld+set}" = set; then :
-  withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes
-else
-  with_gnu_ld=no
-fi
-
-ac_prog=ld
-if test yes = "$GCC"; then
-  # Check if gcc -print-prog-name=ld gives a path.
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
-$as_echo_n "checking for ld used by $CC... " >&6; }
-  case $host in
-  *-*-mingw*)
-    # gcc leaves a trailing carriage return, which upsets mingw
-    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
-  *)
-    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
-  esac
-  case $ac_prog in
-    # Accept absolute paths.
-    [\\/]* | ?:[\\/]*)
-      re_direlt='/[^/][^/]*/\.\./'
-      # Canonicalize the pathname of ld
-      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
-      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
-	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
-      done
-      test -z "$LD" && LD=$ac_prog
-      ;;
-  "")
-    # If it fails, then pretend we aren't using GCC.
-    ac_prog=ld
-    ;;
-  *)
-    # If it is relative, then search for the first ld in PATH.
-    with_gnu_ld=unknown
-    ;;
-  esac
-elif test yes = "$with_gnu_ld"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
-$as_echo_n "checking for GNU ld... " >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
-$as_echo_n "checking for non-GNU ld... " >&6; }
-fi
-if ${lt_cv_path_LD+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -z "$LD"; then
-  lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
-  for ac_dir in $PATH; do
-    IFS=$lt_save_ifs
-    test -z "$ac_dir" && ac_dir=.
-    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
-      lt_cv_path_LD=$ac_dir/$ac_prog
-      # Check to see if the program is GNU ld.  I'd rather use --version,
-      # but apparently some variants of GNU ld only accept -v.
-      # Break only if it was the GNU/non-GNU ld that we prefer.
-      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
-      *GNU* | *'with BFD'*)
-	test no != "$with_gnu_ld" && break
-	;;
-      *)
-	test yes != "$with_gnu_ld" && break
-	;;
-      esac
-    fi
-  done
-  IFS=$lt_save_ifs
-else
-  lt_cv_path_LD=$LD # Let the user override the test with a path.
-fi
-fi
-
-LD=$lt_cv_path_LD
-if test -n "$LD"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
-$as_echo "$LD" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
-$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
-if ${lt_cv_prog_gnu_ld+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  # I'd rather use --version here, but apparently some GNU lds only accept -v.
-case `$LD -v 2>&1 </dev/null` in
-*GNU* | *'with BFD'*)
-  lt_cv_prog_gnu_ld=yes
-  ;;
-*)
-  lt_cv_prog_gnu_ld=no
-  ;;
-esac
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5
-$as_echo "$lt_cv_prog_gnu_ld" >&6; }
-with_gnu_ld=$lt_cv_prog_gnu_ld
-
-
-
-
-
-
-
-      # Check if GNU C++ uses GNU ld as the underlying linker, since the
-      # archiving commands below assume that GNU ld is being used.
-      if test yes = "$with_gnu_ld"; then
-        archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
-        archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
-
-        hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'
-        export_dynamic_flag_spec_CXX='$wl--export-dynamic'
-
-        # If archive_cmds runs LD, not CC, wlarc should be empty
-        # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
-        #     investigate it a little bit more. (MM)
-        wlarc='$wl'
-
-        # ancient GNU ld didn't support --whole-archive et. al.
-        if eval "`$CC -print-prog-name=ld` --help 2>&1" |
-	  $GREP 'no-whole-archive' > /dev/null; then
-          whole_archive_flag_spec_CXX=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
-        else
-          whole_archive_flag_spec_CXX=
-        fi
-      else
-        with_gnu_ld=no
-        wlarc=
-
-        # A generic and very simple default shared library creation
-        # command for GNU C++ for the case where it uses the native
-        # linker, instead of GNU ld.  If possible, this setting should
-        # overridden to take advantage of the native linker features on
-        # the platform it is being used on.
-        archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
-      fi
-
-      # Commands to make compiler produce verbose output that lists
-      # what "hidden" libraries, object files and flags are used when
-      # linking a shared library.
-      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
-
-    else
-      GXX=no
-      with_gnu_ld=no
-      wlarc=
-    fi
-
-    # PORTME: fill in a description of your system's C++ link characteristics
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
-$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
-    ld_shlibs_CXX=yes
-    case $host_os in
-      aix3*)
-        # FIXME: insert proper C++ library support
-        ld_shlibs_CXX=no
-        ;;
-      aix[4-9]*)
-        if test ia64 = "$host_cpu"; then
-          # On IA64, the linker does run time linking by default, so we don't
-          # have to do anything special.
-          aix_use_runtimelinking=no
-          exp_sym_flag='-Bexport'
-          no_entry_flag=
-        else
-          aix_use_runtimelinking=no
-
-          # Test if we are trying to use run time linking or normal
-          # AIX style linking. If -brtl is somewhere in LDFLAGS, we
-          # have runtime linking enabled, and use it for executables.
-          # For shared libraries, we enable/disable runtime linking
-          # depending on the kind of the shared library created -
-          # when "with_aix_soname,aix_use_runtimelinking" is:
-          # "aix,no"   lib.a(lib.so.V) shared, rtl:no,  for executables
-          # "aix,yes"  lib.so          shared, rtl:yes, for executables
-          #            lib.a           static archive
-          # "both,no"  lib.so.V(shr.o) shared, rtl:yes
-          #            lib.a(lib.so.V) shared, rtl:no,  for executables
-          # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables
-          #            lib.a(lib.so.V) shared, rtl:no
-          # "svr4,*"   lib.so.V(shr.o) shared, rtl:yes, for executables
-          #            lib.a           static archive
-          case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
-	    for ld_flag in $LDFLAGS; do
-	      case $ld_flag in
-	      *-brtl*)
-	        aix_use_runtimelinking=yes
-	        break
-	        ;;
-	      esac
-	    done
-	    if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then
-	      # With aix-soname=svr4, we create the lib.so.V shared archives only,
-	      # so we don't have lib.a shared libs to link our executables.
-	      # We have to force runtime linking in this case.
-	      aix_use_runtimelinking=yes
-	      LDFLAGS="$LDFLAGS -Wl,-brtl"
-	    fi
-	    ;;
-          esac
-
-          exp_sym_flag='-bexport'
-          no_entry_flag='-bnoentry'
-        fi
-
-        # When large executables or shared objects are built, AIX ld can
-        # have problems creating the table of contents.  If linking a library
-        # or program results in "error TOC overflow" add -mminimal-toc to
-        # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
-        # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
-
-        archive_cmds_CXX=''
-        hardcode_direct_CXX=yes
-        hardcode_direct_absolute_CXX=yes
-        hardcode_libdir_separator_CXX=':'
-        link_all_deplibs_CXX=yes
-        file_list_spec_CXX='$wl-f,'
-        case $with_aix_soname,$aix_use_runtimelinking in
-        aix,*) ;;	# no import file
-        svr4,* | *,yes) # use import file
-          # The Import File defines what to hardcode.
-          hardcode_direct_CXX=no
-          hardcode_direct_absolute_CXX=no
-          ;;
-        esac
-
-        if test yes = "$GXX"; then
-          case $host_os in aix4.[012]|aix4.[012].*)
-          # We only want to do this on AIX 4.2 and lower, the check
-          # below for broken collect2 doesn't work under 4.3+
-	  collect2name=`$CC -print-prog-name=collect2`
-	  if test -f "$collect2name" &&
-	     strings "$collect2name" | $GREP resolve_lib_name >/dev/null
-	  then
-	    # We have reworked collect2
-	    :
-	  else
-	    # We have old collect2
-	    hardcode_direct_CXX=unsupported
-	    # It fails to find uninstalled libraries when the uninstalled
-	    # path is not listed in the libpath.  Setting hardcode_minus_L
-	    # to unsupported forces relinking
-	    hardcode_minus_L_CXX=yes
-	    hardcode_libdir_flag_spec_CXX='-L$libdir'
-	    hardcode_libdir_separator_CXX=
-	  fi
-          esac
-          shared_flag='-shared'
-	  if test yes = "$aix_use_runtimelinking"; then
-	    shared_flag=$shared_flag' $wl-G'
-	  fi
-	  # Need to ensure runtime linking is disabled for the traditional
-	  # shared library, or the linker may eventually find shared libraries
-	  # /with/ Import File - we do not want to mix them.
-	  shared_flag_aix='-shared'
-	  shared_flag_svr4='-shared $wl-G'
-        else
-          # not using gcc
-          if test ia64 = "$host_cpu"; then
-	  # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
-	  # chokes on -Wl,-G. The following line is correct:
-	  shared_flag='-G'
-          else
-	    if test yes = "$aix_use_runtimelinking"; then
-	      shared_flag='$wl-G'
-	    else
-	      shared_flag='$wl-bM:SRE'
-	    fi
-	    shared_flag_aix='$wl-bM:SRE'
-	    shared_flag_svr4='$wl-G'
-          fi
-        fi
-
-        export_dynamic_flag_spec_CXX='$wl-bexpall'
-        # It seems that -bexpall does not export symbols beginning with
-        # underscore (_), so it is better to generate a list of symbols to
-	# export.
-        always_export_symbols_CXX=yes
-	if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then
-          # Warning - without using the other runtime loading flags (-brtl),
-          # -berok will link without error, but may produce a broken library.
-          # The "-G" linker flag allows undefined symbols.
-          no_undefined_flag_CXX='-bernotok'
-          # Determine the default libpath from the value encoded in an empty
-          # executable.
-          if test set = "${lt_cv_aix_libpath+set}"; then
-  aix_libpath=$lt_cv_aix_libpath
-else
-  if ${lt_cv_aix_libpath__CXX+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
-
-  lt_aix_libpath_sed='
-      /Import File Strings/,/^$/ {
-	  /^0/ {
-	      s/^0  *\([^ ]*\) *$/\1/
-	      p
-	  }
-      }'
-  lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-  # Check for a 64-bit object if we didn't find anything.
-  if test -z "$lt_cv_aix_libpath__CXX"; then
-    lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-  fi
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-  if test -z "$lt_cv_aix_libpath__CXX"; then
-    lt_cv_aix_libpath__CXX=/usr/lib:/lib
-  fi
-
-fi
-
-  aix_libpath=$lt_cv_aix_libpath__CXX
-fi
-
-          hardcode_libdir_flag_spec_CXX='$wl-blibpath:$libdir:'"$aix_libpath"
-
-          archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag
-        else
-          if test ia64 = "$host_cpu"; then
-	    hardcode_libdir_flag_spec_CXX='$wl-R $libdir:/usr/lib:/lib'
-	    allow_undefined_flag_CXX="-z nodefs"
-	    archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols"
-          else
-	    # Determine the default libpath from the value encoded in an
-	    # empty executable.
-	    if test set = "${lt_cv_aix_libpath+set}"; then
-  aix_libpath=$lt_cv_aix_libpath
-else
-  if ${lt_cv_aix_libpath__CXX+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
-
-  lt_aix_libpath_sed='
-      /Import File Strings/,/^$/ {
-	  /^0/ {
-	      s/^0  *\([^ ]*\) *$/\1/
-	      p
-	  }
-      }'
-  lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-  # Check for a 64-bit object if we didn't find anything.
-  if test -z "$lt_cv_aix_libpath__CXX"; then
-    lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-  fi
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-  if test -z "$lt_cv_aix_libpath__CXX"; then
-    lt_cv_aix_libpath__CXX=/usr/lib:/lib
-  fi
-
-fi
-
-  aix_libpath=$lt_cv_aix_libpath__CXX
-fi
-
-	    hardcode_libdir_flag_spec_CXX='$wl-blibpath:$libdir:'"$aix_libpath"
-	    # Warning - without using the other run time loading flags,
-	    # -berok will link without error, but may produce a broken library.
-	    no_undefined_flag_CXX=' $wl-bernotok'
-	    allow_undefined_flag_CXX=' $wl-berok'
-	    if test yes = "$with_gnu_ld"; then
-	      # We only use this code for GNU lds that support --whole-archive.
-	      whole_archive_flag_spec_CXX='$wl--whole-archive$convenience $wl--no-whole-archive'
-	    else
-	      # Exported symbols can be pulled into shared objects from archives
-	      whole_archive_flag_spec_CXX='$convenience'
-	    fi
-	    archive_cmds_need_lc_CXX=yes
-	    archive_expsym_cmds_CXX='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d'
-	    # -brtl affects multiple linker settings, -berok does not and is overridden later
-	    compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`'
-	    if test svr4 != "$with_aix_soname"; then
-	      # This is similar to how AIX traditionally builds its shared
-	      # libraries. Need -bnortl late, we may have -brtl in LDFLAGS.
-	      archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname'
-	    fi
-	    if test aix != "$with_aix_soname"; then
-	      archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp'
-	    else
-	      # used by -dlpreopen to get the symbols
-	      archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$MV  $output_objdir/$realname.d/$soname $output_objdir'
-	    fi
-	    archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$RM -r $output_objdir/$realname.d'
-          fi
-        fi
-        ;;
-
-      beos*)
-	if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	  allow_undefined_flag_CXX=unsupported
-	  # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
-	  # support --undefined.  This deserves some investigation.  FIXME
-	  archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
-	else
-	  ld_shlibs_CXX=no
-	fi
-	;;
-
-      chorus*)
-        case $cc_basename in
-          *)
-	  # FIXME: insert proper C++ library support
-	  ld_shlibs_CXX=no
-	  ;;
-        esac
-        ;;
-
-      cygwin* | mingw* | pw32* | cegcc*)
-	case $GXX,$cc_basename in
-	,cl* | no,cl*)
-	  # Native MSVC
-	  # hardcode_libdir_flag_spec is actually meaningless, as there is
-	  # no search path for DLLs.
-	  hardcode_libdir_flag_spec_CXX=' '
-	  allow_undefined_flag_CXX=unsupported
-	  always_export_symbols_CXX=yes
-	  file_list_spec_CXX='@'
-	  # Tell ltmain to make .lib files, not .a files.
-	  libext=lib
-	  # Tell ltmain to make .dll files, not .so files.
-	  shrext_cmds=.dll
-	  # FIXME: Setting linknames here is a bad hack.
-	  archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames='
-	  archive_expsym_cmds_CXX='if   test DEF = "`$SED -n     -e '\''s/^[	 ]*//'\''     -e '\''/^\(;.*\)*$/d'\''     -e '\''s/^\(EXPORTS\|LIBRARY\)\([	 ].*\)*$/DEF/p'\''     -e q     $export_symbols`" ; then
-              cp "$export_symbols" "$output_objdir/$soname.def";
-              echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp";
-            else
-              $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp;
-            fi~
-            $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
-            linknames='
-	  # The linker will not automatically build a static lib if we build a DLL.
-	  # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true'
-	  enable_shared_with_static_runtimes_CXX=yes
-	  # Don't use ranlib
-	  old_postinstall_cmds_CXX='chmod 644 $oldlib'
-	  postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~
-            lt_tool_outputfile="@TOOL_OUTPUT@"~
-            case $lt_outputfile in
-              *.exe|*.EXE) ;;
-              *)
-                lt_outputfile=$lt_outputfile.exe
-                lt_tool_outputfile=$lt_tool_outputfile.exe
-                ;;
-            esac~
-            func_to_tool_file "$lt_outputfile"~
-            if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then
-              $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
-              $RM "$lt_outputfile.manifest";
-            fi'
-	  ;;
-	*)
-	  # g++
-	  # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless,
-	  # as there is no search path for DLLs.
-	  hardcode_libdir_flag_spec_CXX='-L$libdir'
-	  export_dynamic_flag_spec_CXX='$wl--export-all-symbols'
-	  allow_undefined_flag_CXX=unsupported
-	  always_export_symbols_CXX=no
-	  enable_shared_with_static_runtimes_CXX=yes
-
-	  if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
-	    archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-	    # If the export-symbols file already is a .def file, use it as
-	    # is; otherwise, prepend EXPORTS...
-	    archive_expsym_cmds_CXX='if   test DEF = "`$SED -n     -e '\''s/^[	 ]*//'\''     -e '\''/^\(;.*\)*$/d'\''     -e '\''s/^\(EXPORTS\|LIBRARY\)\([	 ].*\)*$/DEF/p'\''     -e q     $export_symbols`" ; then
-              cp $export_symbols $output_objdir/$soname.def;
-            else
-              echo EXPORTS > $output_objdir/$soname.def;
-              cat $export_symbols >> $output_objdir/$soname.def;
-            fi~
-            $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-	  else
-	    ld_shlibs_CXX=no
-	  fi
-	  ;;
-	esac
-	;;
-      darwin* | rhapsody*)
-
-
-  archive_cmds_need_lc_CXX=no
-  hardcode_direct_CXX=no
-  hardcode_automatic_CXX=yes
-  hardcode_shlibpath_var_CXX=unsupported
-  if test yes = "$lt_cv_ld_force_load"; then
-    whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
-
-  else
-    whole_archive_flag_spec_CXX=''
-  fi
-  link_all_deplibs_CXX=yes
-  allow_undefined_flag_CXX=$_lt_dar_allow_undefined
-  case $cc_basename in
-     ifort*|nagfor*) _lt_dar_can_shared=yes ;;
-     *) _lt_dar_can_shared=$GCC ;;
-  esac
-  if test yes = "$_lt_dar_can_shared"; then
-    output_verbose_link_cmd=func_echo_all
-    archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil"
-    module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil"
-    archive_expsym_cmds_CXX="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil"
-    module_expsym_cmds_CXX="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil"
-       if test yes != "$lt_cv_apple_cc_single_mod"; then
-      archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil"
-      archive_expsym_cmds_CXX="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil"
-    fi
-
-  else
-  ld_shlibs_CXX=no
-  fi
-
-	;;
-
-      os2*)
-	hardcode_libdir_flag_spec_CXX='-L$libdir'
-	hardcode_minus_L_CXX=yes
-	allow_undefined_flag_CXX=unsupported
-	shrext_cmds=.dll
-	archive_cmds_CXX='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
-	  $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
-	  $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
-	  $ECHO EXPORTS >> $output_objdir/$libname.def~
-	  emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
-	  $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
-	  emximp -o $lib $output_objdir/$libname.def'
-	archive_expsym_cmds_CXX='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
-	  $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
-	  $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
-	  $ECHO EXPORTS >> $output_objdir/$libname.def~
-	  prefix_cmds="$SED"~
-	  if test EXPORTS = "`$SED 1q $export_symbols`"; then
-	    prefix_cmds="$prefix_cmds -e 1d";
-	  fi~
-	  prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
-	  cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
-	  $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
-	  emximp -o $lib $output_objdir/$libname.def'
-	old_archive_From_new_cmds_CXX='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
-	enable_shared_with_static_runtimes_CXX=yes
-	;;
-
-      dgux*)
-        case $cc_basename in
-          ec++*)
-	    # FIXME: insert proper C++ library support
-	    ld_shlibs_CXX=no
-	    ;;
-          ghcx*)
-	    # Green Hills C++ Compiler
-	    # FIXME: insert proper C++ library support
-	    ld_shlibs_CXX=no
-	    ;;
-          *)
-	    # FIXME: insert proper C++ library support
-	    ld_shlibs_CXX=no
-	    ;;
-        esac
-        ;;
-
-      freebsd2.*)
-        # C++ shared libraries reported to be fairly broken before
-	# switch to ELF
-        ld_shlibs_CXX=no
-        ;;
-
-      freebsd-elf*)
-        archive_cmds_need_lc_CXX=no
-        ;;
-
-      freebsd* | dragonfly*)
-        # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
-        # conventions
-        ld_shlibs_CXX=yes
-        ;;
-
-      haiku*)
-        archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
-        link_all_deplibs_CXX=yes
-        ;;
-
-      hpux9*)
-        hardcode_libdir_flag_spec_CXX='$wl+b $wl$libdir'
-        hardcode_libdir_separator_CXX=:
-        export_dynamic_flag_spec_CXX='$wl-E'
-        hardcode_direct_CXX=yes
-        hardcode_minus_L_CXX=yes # Not in the search PATH,
-				             # but as the default
-				             # location of the library.
-
-        case $cc_basename in
-          CC*)
-            # FIXME: insert proper C++ library support
-            ld_shlibs_CXX=no
-            ;;
-          aCC*)
-            archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
-            # Commands to make compiler produce verbose output that lists
-            # what "hidden" libraries, object files and flags are used when
-            # linking a shared library.
-            #
-            # There doesn't appear to be a way to prevent this compiler from
-            # explicitly linking system object files so we need to strip them
-            # from the output so that they don't get included in the library
-            # dependencies.
-            output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
-            ;;
-          *)
-            if test yes = "$GXX"; then
-              archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
-            else
-              # FIXME: insert proper C++ library support
-              ld_shlibs_CXX=no
-            fi
-            ;;
-        esac
-        ;;
-
-      hpux10*|hpux11*)
-        if test no = "$with_gnu_ld"; then
-	  hardcode_libdir_flag_spec_CXX='$wl+b $wl$libdir'
-	  hardcode_libdir_separator_CXX=:
-
-          case $host_cpu in
-            hppa*64*|ia64*)
-              ;;
-            *)
-	      export_dynamic_flag_spec_CXX='$wl-E'
-              ;;
-          esac
-        fi
-        case $host_cpu in
-          hppa*64*|ia64*)
-            hardcode_direct_CXX=no
-            hardcode_shlibpath_var_CXX=no
-            ;;
-          *)
-            hardcode_direct_CXX=yes
-            hardcode_direct_absolute_CXX=yes
-            hardcode_minus_L_CXX=yes # Not in the search PATH,
-					         # but as the default
-					         # location of the library.
-            ;;
-        esac
-
-        case $cc_basename in
-          CC*)
-	    # FIXME: insert proper C++ library support
-	    ld_shlibs_CXX=no
-	    ;;
-          aCC*)
-	    case $host_cpu in
-	      hppa*64*)
-	        archive_cmds_CXX='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	        ;;
-	      ia64*)
-	        archive_cmds_CXX='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	        ;;
-	      *)
-	        archive_cmds_CXX='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	        ;;
-	    esac
-	    # Commands to make compiler produce verbose output that lists
-	    # what "hidden" libraries, object files and flags are used when
-	    # linking a shared library.
-	    #
-	    # There doesn't appear to be a way to prevent this compiler from
-	    # explicitly linking system object files so we need to strip them
-	    # from the output so that they don't get included in the library
-	    # dependencies.
-	    output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
-	    ;;
-          *)
-	    if test yes = "$GXX"; then
-	      if test no = "$with_gnu_ld"; then
-	        case $host_cpu in
-	          hppa*64*)
-	            archive_cmds_CXX='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	            ;;
-	          ia64*)
-	            archive_cmds_CXX='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	            ;;
-	          *)
-	            archive_cmds_CXX='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	            ;;
-	        esac
-	      fi
-	    else
-	      # FIXME: insert proper C++ library support
-	      ld_shlibs_CXX=no
-	    fi
-	    ;;
-        esac
-        ;;
-
-      interix[3-9]*)
-	hardcode_direct_CXX=no
-	hardcode_shlibpath_var_CXX=no
-	hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'
-	export_dynamic_flag_spec_CXX='$wl-E'
-	# Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
-	# Instead, shared libraries are loaded at an image base (0x10000000 by
-	# default) and relocated if they conflict, which is a slow very memory
-	# consuming and fragmenting process.  To avoid this, we pick a random,
-	# 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
-	# time.  Moving up from 0x10000000 also allows more sbrk(2) space.
-	archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-	archive_expsym_cmds_CXX='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-	;;
-      irix5* | irix6*)
-        case $cc_basename in
-          CC*)
-	    # SGI C++
-	    archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
-
-	    # Archives containing C++ object files must be created using
-	    # "CC -ar", where "CC" is the IRIX C++ compiler.  This is
-	    # necessary to make sure instantiated templates are included
-	    # in the archive.
-	    old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs'
-	    ;;
-          *)
-	    if test yes = "$GXX"; then
-	      if test no = "$with_gnu_ld"; then
-	        archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
-	      else
-	        archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib'
-	      fi
-	    fi
-	    link_all_deplibs_CXX=yes
-	    ;;
-        esac
-        hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'
-        hardcode_libdir_separator_CXX=:
-        inherit_rpath_CXX=yes
-        ;;
-
-      linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
-        case $cc_basename in
-          KCC*)
-	    # Kuck and Associates, Inc. (KAI) C++ Compiler
-
-	    # KCC will only create a shared library if the output file
-	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
-	    # to its proper name (with version) after linking.
-	    archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
-	    archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib'
-	    # Commands to make compiler produce verbose output that lists
-	    # what "hidden" libraries, object files and flags are used when
-	    # linking a shared library.
-	    #
-	    # There doesn't appear to be a way to prevent this compiler from
-	    # explicitly linking system object files so we need to strip them
-	    # from the output so that they don't get included in the library
-	    # dependencies.
-	    output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
-
-	    hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'
-	    export_dynamic_flag_spec_CXX='$wl--export-dynamic'
-
-	    # Archives containing C++ object files must be created using
-	    # "CC -Bstatic", where "CC" is the KAI C++ compiler.
-	    old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs'
-	    ;;
-	  icpc* | ecpc* )
-	    # Intel C++
-	    with_gnu_ld=yes
-	    # version 8.0 and above of icpc choke on multiply defined symbols
-	    # if we add $predep_objects and $postdep_objects, however 7.1 and
-	    # earlier do not add the objects themselves.
-	    case `$CC -V 2>&1` in
-	      *"Version 7."*)
-	        archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
-		archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
-		;;
-	      *)  # Version 8.0 or newer
-	        tmp_idyn=
-	        case $host_cpu in
-		  ia64*) tmp_idyn=' -i_dynamic';;
-		esac
-	        archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
-		archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
-		;;
-	    esac
-	    archive_cmds_need_lc_CXX=no
-	    hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'
-	    export_dynamic_flag_spec_CXX='$wl--export-dynamic'
-	    whole_archive_flag_spec_CXX='$wl--whole-archive$convenience $wl--no-whole-archive'
-	    ;;
-          pgCC* | pgcpp*)
-            # Portland Group C++ compiler
-	    case `$CC -V` in
-	    *pgCC\ [1-5].* | *pgcpp\ [1-5].*)
-	      prelink_cmds_CXX='tpldir=Template.dir~
-               rm -rf $tpldir~
-               $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
-               compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"'
-	      old_archive_cmds_CXX='tpldir=Template.dir~
-                rm -rf $tpldir~
-                $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
-                $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~
-                $RANLIB $oldlib'
-	      archive_cmds_CXX='tpldir=Template.dir~
-                rm -rf $tpldir~
-                $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
-                $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
-	      archive_expsym_cmds_CXX='tpldir=Template.dir~
-                rm -rf $tpldir~
-                $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
-                $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
-	      ;;
-	    *) # Version 6 and above use weak symbols
-	      archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
-	      archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
-	      ;;
-	    esac
-
-	    hardcode_libdir_flag_spec_CXX='$wl--rpath $wl$libdir'
-	    export_dynamic_flag_spec_CXX='$wl--export-dynamic'
-	    whole_archive_flag_spec_CXX='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
-            ;;
-	  cxx*)
-	    # Compaq C++
-	    archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
-	    archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname  -o $lib $wl-retain-symbols-file $wl$export_symbols'
-
-	    runpath_var=LD_RUN_PATH
-	    hardcode_libdir_flag_spec_CXX='-rpath $libdir'
-	    hardcode_libdir_separator_CXX=:
-
-	    # Commands to make compiler produce verbose output that lists
-	    # what "hidden" libraries, object files and flags are used when
-	    # linking a shared library.
-	    #
-	    # There doesn't appear to be a way to prevent this compiler from
-	    # explicitly linking system object files so we need to strip them
-	    # from the output so that they don't get included in the library
-	    # dependencies.
-	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed'
-	    ;;
-	  xl* | mpixl* | bgxl*)
-	    # IBM XL 8.0 on PPC, with GNU ld
-	    hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'
-	    export_dynamic_flag_spec_CXX='$wl--export-dynamic'
-	    archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
-	    if test yes = "$supports_anon_versioning"; then
-	      archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~
-                cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-                echo "local: *; };" >> $output_objdir/$libname.ver~
-                $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib'
-	    fi
-	    ;;
-	  *)
-	    case `$CC -V 2>&1 | sed 5q` in
-	    *Sun\ C*)
-	      # Sun C++ 5.9
-	      no_undefined_flag_CXX=' -zdefs'
-	      archive_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	      archive_expsym_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols'
-	      hardcode_libdir_flag_spec_CXX='-R$libdir'
-	      whole_archive_flag_spec_CXX='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
-	      compiler_needs_object_CXX=yes
-
-	      # Not sure whether something based on
-	      # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1
-	      # would be better.
-	      output_verbose_link_cmd='func_echo_all'
-
-	      # Archives containing C++ object files must be created using
-	      # "CC -xar", where "CC" is the Sun C++ compiler.  This is
-	      # necessary to make sure instantiated templates are included
-	      # in the archive.
-	      old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs'
-	      ;;
-	    esac
-	    ;;
-	esac
-	;;
-
-      lynxos*)
-        # FIXME: insert proper C++ library support
-	ld_shlibs_CXX=no
-	;;
-
-      m88k*)
-        # FIXME: insert proper C++ library support
-        ld_shlibs_CXX=no
-	;;
-
-      mvs*)
-        case $cc_basename in
-          cxx*)
-	    # FIXME: insert proper C++ library support
-	    ld_shlibs_CXX=no
-	    ;;
-	  *)
-	    # FIXME: insert proper C++ library support
-	    ld_shlibs_CXX=no
-	    ;;
-	esac
-	;;
-
-      netbsd*)
-        if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-	  archive_cmds_CXX='$LD -Bshareable  -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
-	  wlarc=
-	  hardcode_libdir_flag_spec_CXX='-R$libdir'
-	  hardcode_direct_CXX=yes
-	  hardcode_shlibpath_var_CXX=no
-	fi
-	# Workaround some broken pre-1.5 toolchains
-	output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
-	;;
-
-      *nto* | *qnx*)
-        ld_shlibs_CXX=yes
-	;;
-
-      openbsd* | bitrig*)
-	if test -f /usr/libexec/ld.so; then
-	  hardcode_direct_CXX=yes
-	  hardcode_shlibpath_var_CXX=no
-	  hardcode_direct_absolute_CXX=yes
-	  archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
-	  hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'
-	  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`"; then
-	    archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib'
-	    export_dynamic_flag_spec_CXX='$wl-E'
-	    whole_archive_flag_spec_CXX=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
-	  fi
-	  output_verbose_link_cmd=func_echo_all
-	else
-	  ld_shlibs_CXX=no
-	fi
-	;;
-
-      osf3* | osf4* | osf5*)
-        case $cc_basename in
-          KCC*)
-	    # Kuck and Associates, Inc. (KAI) C++ Compiler
-
-	    # KCC will only create a shared library if the output file
-	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
-	    # to its proper name (with version) after linking.
-	    archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
-
-	    hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'
-	    hardcode_libdir_separator_CXX=:
-
-	    # Archives containing C++ object files must be created using
-	    # the KAI C++ compiler.
-	    case $host in
-	      osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;;
-	      *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;;
-	    esac
-	    ;;
-          RCC*)
-	    # Rational C++ 2.4.1
-	    # FIXME: insert proper C++ library support
-	    ld_shlibs_CXX=no
-	    ;;
-          cxx*)
-	    case $host in
-	      osf3*)
-	        allow_undefined_flag_CXX=' $wl-expect_unresolved $wl\*'
-	        archive_cmds_CXX='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n "$verstring" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
-	        hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'
-		;;
-	      *)
-	        allow_undefined_flag_CXX=' -expect_unresolved \*'
-	        archive_cmds_CXX='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
-	        archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
-                  echo "-hidden">> $lib.exp~
-                  $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp  `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~
-                  $RM $lib.exp'
-	        hardcode_libdir_flag_spec_CXX='-rpath $libdir'
-		;;
-	    esac
-
-	    hardcode_libdir_separator_CXX=:
-
-	    # Commands to make compiler produce verbose output that lists
-	    # what "hidden" libraries, object files and flags are used when
-	    # linking a shared library.
-	    #
-	    # There doesn't appear to be a way to prevent this compiler from
-	    # explicitly linking system object files so we need to strip them
-	    # from the output so that they don't get included in the library
-	    # dependencies.
-	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
-	    ;;
-	  *)
-	    if test yes,no = "$GXX,$with_gnu_ld"; then
-	      allow_undefined_flag_CXX=' $wl-expect_unresolved $wl\*'
-	      case $host in
-	        osf3*)
-	          archive_cmds_CXX='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
-		  ;;
-	        *)
-	          archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
-		  ;;
-	      esac
-
-	      hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'
-	      hardcode_libdir_separator_CXX=:
-
-	      # Commands to make compiler produce verbose output that lists
-	      # what "hidden" libraries, object files and flags are used when
-	      # linking a shared library.
-	      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
-
-	    else
-	      # FIXME: insert proper C++ library support
-	      ld_shlibs_CXX=no
-	    fi
-	    ;;
-        esac
-        ;;
-
-      psos*)
-        # FIXME: insert proper C++ library support
-        ld_shlibs_CXX=no
-        ;;
-
-      sunos4*)
-        case $cc_basename in
-          CC*)
-	    # Sun C++ 4.x
-	    # FIXME: insert proper C++ library support
-	    ld_shlibs_CXX=no
-	    ;;
-          lcc*)
-	    # Lucid
-	    # FIXME: insert proper C++ library support
-	    ld_shlibs_CXX=no
-	    ;;
-          *)
-	    # FIXME: insert proper C++ library support
-	    ld_shlibs_CXX=no
-	    ;;
-        esac
-        ;;
-
-      solaris*)
-        case $cc_basename in
-          CC* | sunCC*)
-	    # Sun C++ 4.2, 5.x and Centerline C++
-            archive_cmds_need_lc_CXX=yes
-	    no_undefined_flag_CXX=' -zdefs'
-	    archive_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	    archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-              $CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
-
-	    hardcode_libdir_flag_spec_CXX='-R$libdir'
-	    hardcode_shlibpath_var_CXX=no
-	    case $host_os in
-	      solaris2.[0-5] | solaris2.[0-5].*) ;;
-	      *)
-		# The compiler driver will combine and reorder linker options,
-		# but understands '-z linker_flag'.
-	        # Supported since Solaris 2.6 (maybe 2.5.1?)
-		whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract'
-	        ;;
-	    esac
-	    link_all_deplibs_CXX=yes
-
-	    output_verbose_link_cmd='func_echo_all'
-
-	    # Archives containing C++ object files must be created using
-	    # "CC -xar", where "CC" is the Sun C++ compiler.  This is
-	    # necessary to make sure instantiated templates are included
-	    # in the archive.
-	    old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs'
-	    ;;
-          gcx*)
-	    # Green Hills C++ Compiler
-	    archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
-
-	    # The C++ compiler must be used to create the archive.
-	    old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
-	    ;;
-          *)
-	    # GNU C++ compiler with Solaris linker
-	    if test yes,no = "$GXX,$with_gnu_ld"; then
-	      no_undefined_flag_CXX=' $wl-z ${wl}defs'
-	      if $CC --version | $GREP -v '^2\.7' > /dev/null; then
-	        archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
-	        archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-                  $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
-
-	        # Commands to make compiler produce verbose output that lists
-	        # what "hidden" libraries, object files and flags are used when
-	        # linking a shared library.
-	        output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
-	      else
-	        # g++ 2.7 appears to require '-G' NOT '-shared' on this
-	        # platform.
-	        archive_cmds_CXX='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
-	        archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-                  $CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
-
-	        # Commands to make compiler produce verbose output that lists
-	        # what "hidden" libraries, object files and flags are used when
-	        # linking a shared library.
-	        output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
-	      fi
-
-	      hardcode_libdir_flag_spec_CXX='$wl-R $wl$libdir'
-	      case $host_os in
-		solaris2.[0-5] | solaris2.[0-5].*) ;;
-		*)
-		  whole_archive_flag_spec_CXX='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract'
-		  ;;
-	      esac
-	    fi
-	    ;;
-        esac
-        ;;
-
-    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
-      no_undefined_flag_CXX='$wl-z,text'
-      archive_cmds_need_lc_CXX=no
-      hardcode_shlibpath_var_CXX=no
-      runpath_var='LD_RUN_PATH'
-
-      case $cc_basename in
-        CC*)
-	  archive_cmds_CXX='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  archive_expsym_cmds_CXX='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	*)
-	  archive_cmds_CXX='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  archive_expsym_cmds_CXX='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-      esac
-      ;;
-
-      sysv5* | sco3.2v5* | sco5v6*)
-	# Note: We CANNOT use -z defs as we might desire, because we do not
-	# link with -lc, and that would cause any symbols used from libc to
-	# always be unresolved, which means just about no library would
-	# ever link correctly.  If we're not using GNU ld we use -z text
-	# though, which does catch some bad symbols but isn't as heavy-handed
-	# as -z defs.
-	no_undefined_flag_CXX='$wl-z,text'
-	allow_undefined_flag_CXX='$wl-z,nodefs'
-	archive_cmds_need_lc_CXX=no
-	hardcode_shlibpath_var_CXX=no
-	hardcode_libdir_flag_spec_CXX='$wl-R,$libdir'
-	hardcode_libdir_separator_CXX=':'
-	link_all_deplibs_CXX=yes
-	export_dynamic_flag_spec_CXX='$wl-Bexport'
-	runpath_var='LD_RUN_PATH'
-
-	case $cc_basename in
-          CC*)
-	    archive_cmds_CXX='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	    archive_expsym_cmds_CXX='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	    old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~
-              '"$old_archive_cmds_CXX"
-	    reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~
-              '"$reload_cmds_CXX"
-	    ;;
-	  *)
-	    archive_cmds_CXX='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	    archive_expsym_cmds_CXX='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	    ;;
-	esac
-      ;;
-
-      tandem*)
-        case $cc_basename in
-          NCC*)
-	    # NonStop-UX NCC 3.20
-	    # FIXME: insert proper C++ library support
-	    ld_shlibs_CXX=no
-	    ;;
-          *)
-	    # FIXME: insert proper C++ library support
-	    ld_shlibs_CXX=no
-	    ;;
-        esac
-        ;;
-
-      vxworks*)
-        # FIXME: insert proper C++ library support
-        ld_shlibs_CXX=no
-        ;;
-
-      *)
-        # FIXME: insert proper C++ library support
-        ld_shlibs_CXX=no
-        ;;
-    esac
-
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5
-$as_echo "$ld_shlibs_CXX" >&6; }
-    test no = "$ld_shlibs_CXX" && can_build_shared=no
-
-    GCC_CXX=$GXX
-    LD_CXX=$LD
-
-    ## CAVEAT EMPTOR:
-    ## There is no encapsulation within the following macros, do not change
-    ## the running order or otherwise move them around unless you know exactly
-    ## what you are doing...
-    # Dependencies to place before and after the object being linked:
-predep_objects_CXX=
-postdep_objects_CXX=
-predeps_CXX=
-postdeps_CXX=
-compiler_lib_search_path_CXX=
-
-cat > conftest.$ac_ext <<_LT_EOF
-class Foo
-{
-public:
-  Foo (void) { a = 0; }
-private:
-  int a;
-};
-_LT_EOF
-
-
-_lt_libdeps_save_CFLAGS=$CFLAGS
-case "$CC $CFLAGS " in #(
-*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;;
-*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;;
-*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;;
-esac
-
-if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then
-  # Parse the compiler output and extract the necessary
-  # objects, libraries and library flags.
-
-  # Sentinel used to keep track of whether or not we are before
-  # the conftest object file.
-  pre_test_object_deps_done=no
-
-  for p in `eval "$output_verbose_link_cmd"`; do
-    case $prev$p in
-
-    -L* | -R* | -l*)
-       # Some compilers place space between "-{L,R}" and the path.
-       # Remove the space.
-       if test x-L = "$p" ||
-          test x-R = "$p"; then
-	 prev=$p
-	 continue
-       fi
-
-       # Expand the sysroot to ease extracting the directories later.
-       if test -z "$prev"; then
-         case $p in
-         -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;;
-         -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;;
-         -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;;
-         esac
-       fi
-       case $p in
-       =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;;
-       esac
-       if test no = "$pre_test_object_deps_done"; then
-	 case $prev in
-	 -L | -R)
-	   # Internal compiler library paths should come after those
-	   # provided the user.  The postdeps already come after the
-	   # user supplied libs so there is no need to process them.
-	   if test -z "$compiler_lib_search_path_CXX"; then
-	     compiler_lib_search_path_CXX=$prev$p
-	   else
-	     compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} $prev$p"
-	   fi
-	   ;;
-	 # The "-l" case would never come before the object being
-	 # linked, so don't bother handling this case.
-	 esac
-       else
-	 if test -z "$postdeps_CXX"; then
-	   postdeps_CXX=$prev$p
-	 else
-	   postdeps_CXX="${postdeps_CXX} $prev$p"
-	 fi
-       fi
-       prev=
-       ;;
-
-    *.lto.$objext) ;; # Ignore GCC LTO objects
-    *.$objext)
-       # This assumes that the test object file only shows up
-       # once in the compiler output.
-       if test "$p" = "conftest.$objext"; then
-	 pre_test_object_deps_done=yes
-	 continue
-       fi
-
-       if test no = "$pre_test_object_deps_done"; then
-	 if test -z "$predep_objects_CXX"; then
-	   predep_objects_CXX=$p
-	 else
-	   predep_objects_CXX="$predep_objects_CXX $p"
-	 fi
-       else
-	 if test -z "$postdep_objects_CXX"; then
-	   postdep_objects_CXX=$p
-	 else
-	   postdep_objects_CXX="$postdep_objects_CXX $p"
-	 fi
-       fi
-       ;;
-
-    *) ;; # Ignore the rest.
-
-    esac
-  done
-
-  # Clean up.
-  rm -f a.out a.exe
-else
-  echo "libtool.m4: error: problem compiling CXX test program"
-fi
-
-$RM -f confest.$objext
-CFLAGS=$_lt_libdeps_save_CFLAGS
-
-# PORTME: override above test on systems where it is broken
-case $host_os in
-interix[3-9]*)
-  # Interix 3.5 installs completely hosed .la files for C++, so rather than
-  # hack all around it, let's just trust "g++" to DTRT.
-  predep_objects_CXX=
-  postdep_objects_CXX=
-  postdeps_CXX=
-  ;;
-esac
-
-
-case " $postdeps_CXX " in
-*" -lc "*) archive_cmds_need_lc_CXX=no ;;
-esac
- compiler_lib_search_dirs_CXX=
-if test -n "${compiler_lib_search_path_CXX}"; then
- compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | $SED -e 's! -L! !g' -e 's!^ !!'`
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-    lt_prog_compiler_wl_CXX=
-lt_prog_compiler_pic_CXX=
-lt_prog_compiler_static_CXX=
-
-
-  # C++ specific cases for pic, static, wl, etc.
-  if test yes = "$GXX"; then
-    lt_prog_compiler_wl_CXX='-Wl,'
-    lt_prog_compiler_static_CXX='-static'
-
-    case $host_os in
-    aix*)
-      # All AIX code is PIC.
-      if test ia64 = "$host_cpu"; then
-	# AIX 5 now supports IA64 processor
-	lt_prog_compiler_static_CXX='-Bstatic'
-      fi
-      lt_prog_compiler_pic_CXX='-fPIC'
-      ;;
-
-    amigaos*)
-      case $host_cpu in
-      powerpc)
-            # see comment about AmigaOS4 .so support
-            lt_prog_compiler_pic_CXX='-fPIC'
-        ;;
-      m68k)
-            # FIXME: we need at least 68020 code to build shared libraries, but
-            # adding the '-m68020' flag to GCC prevents building anything better,
-            # like '-m68040'.
-            lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4'
-        ;;
-      esac
-      ;;
-
-    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
-      # PIC is the default for these OSes.
-      ;;
-    mingw* | cygwin* | os2* | pw32* | cegcc*)
-      # This hack is so that the source file can tell whether it is being
-      # built for inclusion in a dll (and should export symbols for example).
-      # Although the cygwin gcc ignores -fPIC, still need this for old-style
-      # (--disable-auto-import) libraries
-      lt_prog_compiler_pic_CXX='-DDLL_EXPORT'
-      case $host_os in
-      os2*)
-	lt_prog_compiler_static_CXX='$wl-static'
-	;;
-      esac
-      ;;
-    darwin* | rhapsody*)
-      # PIC is the default on this platform
-      # Common symbols not allowed in MH_DYLIB files
-      lt_prog_compiler_pic_CXX='-fno-common'
-      ;;
-    *djgpp*)
-      # DJGPP does not support shared libraries at all
-      lt_prog_compiler_pic_CXX=
-      ;;
-    haiku*)
-      # PIC is the default for Haiku.
-      # The "-static" flag exists, but is broken.
-      lt_prog_compiler_static_CXX=
-      ;;
-    interix[3-9]*)
-      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
-      # Instead, we relocate shared libraries at runtime.
-      ;;
-    sysv4*MP*)
-      if test -d /usr/nec; then
-	lt_prog_compiler_pic_CXX=-Kconform_pic
-      fi
-      ;;
-    hpux*)
-      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
-      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
-      # sets the default TLS model and affects inlining.
-      case $host_cpu in
-      hppa*64*)
-	;;
-      *)
-	lt_prog_compiler_pic_CXX='-fPIC'
-	;;
-      esac
-      ;;
-    *qnx* | *nto*)
-      # QNX uses GNU C++, but need to define -shared option too, otherwise
-      # it will coredump.
-      lt_prog_compiler_pic_CXX='-fPIC -shared'
-      ;;
-    *)
-      lt_prog_compiler_pic_CXX='-fPIC'
-      ;;
-    esac
-  else
-    case $host_os in
-      aix[4-9]*)
-	# All AIX code is PIC.
-	if test ia64 = "$host_cpu"; then
-	  # AIX 5 now supports IA64 processor
-	  lt_prog_compiler_static_CXX='-Bstatic'
-	else
-	  lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp'
-	fi
-	;;
-      chorus*)
-	case $cc_basename in
-	cxch68*)
-	  # Green Hills C++ Compiler
-	  # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
-	  ;;
-	esac
-	;;
-      mingw* | cygwin* | os2* | pw32* | cegcc*)
-	# This hack is so that the source file can tell whether it is being
-	# built for inclusion in a dll (and should export symbols for example).
-	lt_prog_compiler_pic_CXX='-DDLL_EXPORT'
-	;;
-      dgux*)
-	case $cc_basename in
-	  ec++*)
-	    lt_prog_compiler_pic_CXX='-KPIC'
-	    ;;
-	  ghcx*)
-	    # Green Hills C++ Compiler
-	    lt_prog_compiler_pic_CXX='-pic'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      freebsd* | dragonfly*)
-	# FreeBSD uses GNU C++
-	;;
-      hpux9* | hpux10* | hpux11*)
-	case $cc_basename in
-	  CC*)
-	    lt_prog_compiler_wl_CXX='-Wl,'
-	    lt_prog_compiler_static_CXX='$wl-a ${wl}archive'
-	    if test ia64 != "$host_cpu"; then
-	      lt_prog_compiler_pic_CXX='+Z'
-	    fi
-	    ;;
-	  aCC*)
-	    lt_prog_compiler_wl_CXX='-Wl,'
-	    lt_prog_compiler_static_CXX='$wl-a ${wl}archive'
-	    case $host_cpu in
-	    hppa*64*|ia64*)
-	      # +Z the default
-	      ;;
-	    *)
-	      lt_prog_compiler_pic_CXX='+Z'
-	      ;;
-	    esac
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      interix*)
-	# This is c89, which is MS Visual C++ (no shared libs)
-	# Anyone wants to do a port?
-	;;
-      irix5* | irix6* | nonstopux*)
-	case $cc_basename in
-	  CC*)
-	    lt_prog_compiler_wl_CXX='-Wl,'
-	    lt_prog_compiler_static_CXX='-non_shared'
-	    # CC pic flag -KPIC is the default.
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
-	case $cc_basename in
-	  KCC*)
-	    # KAI C++ Compiler
-	    lt_prog_compiler_wl_CXX='--backend -Wl,'
-	    lt_prog_compiler_pic_CXX='-fPIC'
-	    ;;
-	  ecpc* )
-	    # old Intel C++ for x86_64, which still supported -KPIC.
-	    lt_prog_compiler_wl_CXX='-Wl,'
-	    lt_prog_compiler_pic_CXX='-KPIC'
-	    lt_prog_compiler_static_CXX='-static'
-	    ;;
-	  icpc* )
-	    # Intel C++, used to be incompatible with GCC.
-	    # ICC 10 doesn't accept -KPIC any more.
-	    lt_prog_compiler_wl_CXX='-Wl,'
-	    lt_prog_compiler_pic_CXX='-fPIC'
-	    lt_prog_compiler_static_CXX='-static'
-	    ;;
-	  pgCC* | pgcpp*)
-	    # Portland Group C++ compiler
-	    lt_prog_compiler_wl_CXX='-Wl,'
-	    lt_prog_compiler_pic_CXX='-fpic'
-	    lt_prog_compiler_static_CXX='-Bstatic'
-	    ;;
-	  cxx*)
-	    # Compaq C++
-	    # Make sure the PIC flag is empty.  It appears that all Alpha
-	    # Linux and Compaq Tru64 Unix objects are PIC.
-	    lt_prog_compiler_pic_CXX=
-	    lt_prog_compiler_static_CXX='-non_shared'
-	    ;;
-	  xlc* | xlC* | bgxl[cC]* | mpixl[cC]*)
-	    # IBM XL 8.0, 9.0 on PPC and BlueGene
-	    lt_prog_compiler_wl_CXX='-Wl,'
-	    lt_prog_compiler_pic_CXX='-qpic'
-	    lt_prog_compiler_static_CXX='-qstaticlink'
-	    ;;
-	  *)
-	    case `$CC -V 2>&1 | sed 5q` in
-	    *Sun\ C*)
-	      # Sun C++ 5.9
-	      lt_prog_compiler_pic_CXX='-KPIC'
-	      lt_prog_compiler_static_CXX='-Bstatic'
-	      lt_prog_compiler_wl_CXX='-Qoption ld '
-	      ;;
-	    esac
-	    ;;
-	esac
-	;;
-      lynxos*)
-	;;
-      m88k*)
-	;;
-      mvs*)
-	case $cc_basename in
-	  cxx*)
-	    lt_prog_compiler_pic_CXX='-W c,exportall'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      netbsd*)
-	;;
-      *qnx* | *nto*)
-        # QNX uses GNU C++, but need to define -shared option too, otherwise
-        # it will coredump.
-        lt_prog_compiler_pic_CXX='-fPIC -shared'
-        ;;
-      osf3* | osf4* | osf5*)
-	case $cc_basename in
-	  KCC*)
-	    lt_prog_compiler_wl_CXX='--backend -Wl,'
-	    ;;
-	  RCC*)
-	    # Rational C++ 2.4.1
-	    lt_prog_compiler_pic_CXX='-pic'
-	    ;;
-	  cxx*)
-	    # Digital/Compaq C++
-	    lt_prog_compiler_wl_CXX='-Wl,'
-	    # Make sure the PIC flag is empty.  It appears that all Alpha
-	    # Linux and Compaq Tru64 Unix objects are PIC.
-	    lt_prog_compiler_pic_CXX=
-	    lt_prog_compiler_static_CXX='-non_shared'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      psos*)
-	;;
-      solaris*)
-	case $cc_basename in
-	  CC* | sunCC*)
-	    # Sun C++ 4.2, 5.x and Centerline C++
-	    lt_prog_compiler_pic_CXX='-KPIC'
-	    lt_prog_compiler_static_CXX='-Bstatic'
-	    lt_prog_compiler_wl_CXX='-Qoption ld '
-	    ;;
-	  gcx*)
-	    # Green Hills C++ Compiler
-	    lt_prog_compiler_pic_CXX='-PIC'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      sunos4*)
-	case $cc_basename in
-	  CC*)
-	    # Sun C++ 4.x
-	    lt_prog_compiler_pic_CXX='-pic'
-	    lt_prog_compiler_static_CXX='-Bstatic'
-	    ;;
-	  lcc*)
-	    # Lucid
-	    lt_prog_compiler_pic_CXX='-pic'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
-	case $cc_basename in
-	  CC*)
-	    lt_prog_compiler_wl_CXX='-Wl,'
-	    lt_prog_compiler_pic_CXX='-KPIC'
-	    lt_prog_compiler_static_CXX='-Bstatic'
-	    ;;
-	esac
-	;;
-      tandem*)
-	case $cc_basename in
-	  NCC*)
-	    # NonStop-UX NCC 3.20
-	    lt_prog_compiler_pic_CXX='-KPIC'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      vxworks*)
-	;;
-      *)
-	lt_prog_compiler_can_build_shared_CXX=no
-	;;
-    esac
-  fi
-
-case $host_os in
-  # For platforms that do not support PIC, -DPIC is meaningless:
-  *djgpp*)
-    lt_prog_compiler_pic_CXX=
-    ;;
-  *)
-    lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC"
-    ;;
-esac
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
-$as_echo_n "checking for $compiler option to produce PIC... " >&6; }
-if ${lt_cv_prog_compiler_pic_CXX+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5
-$as_echo "$lt_cv_prog_compiler_pic_CXX" >&6; }
-lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX
-
-#
-# Check to make sure the PIC flag actually works.
-#
-if test -n "$lt_prog_compiler_pic_CXX"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5
-$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; }
-if ${lt_cv_prog_compiler_pic_works_CXX+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_pic_works_CXX=no
-   ac_outfile=conftest.$ac_objext
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-   lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC"  ## exclude from sc_useless_quotes_in_assignment
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   # The option is referenced via a variable to avoid confusing sed.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
-   (eval "$lt_compile" 2>conftest.err)
-   ac_status=$?
-   cat conftest.err >&5
-   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-   if (exit $ac_status) && test -s "$ac_outfile"; then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings other than the usual output.
-     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
-     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
-       lt_cv_prog_compiler_pic_works_CXX=yes
-     fi
-   fi
-   $RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5
-$as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; }
-
-if test yes = "$lt_cv_prog_compiler_pic_works_CXX"; then
-    case $lt_prog_compiler_pic_CXX in
-     "" | " "*) ;;
-     *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;;
-     esac
-else
-    lt_prog_compiler_pic_CXX=
-     lt_prog_compiler_can_build_shared_CXX=no
-fi
-
-fi
-
-
-
-
-
-#
-# Check to make sure the static flag actually works.
-#
-wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\"
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
-$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
-if ${lt_cv_prog_compiler_static_works_CXX+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_static_works_CXX=no
-   save_LDFLAGS=$LDFLAGS
-   LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
-   echo "$lt_simple_link_test_code" > conftest.$ac_ext
-   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
-     # The linker can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     if test -s conftest.err; then
-       # Append any errors to the config.log.
-       cat conftest.err 1>&5
-       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
-       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-       if diff conftest.exp conftest.er2 >/dev/null; then
-         lt_cv_prog_compiler_static_works_CXX=yes
-       fi
-     else
-       lt_cv_prog_compiler_static_works_CXX=yes
-     fi
-   fi
-   $RM -r conftest*
-   LDFLAGS=$save_LDFLAGS
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5
-$as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; }
-
-if test yes = "$lt_cv_prog_compiler_static_works_CXX"; then
-    :
-else
-    lt_prog_compiler_static_CXX=
-fi
-
-
-
-
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
-$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
-if ${lt_cv_prog_compiler_c_o_CXX+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_c_o_CXX=no
-   $RM -r conftest 2>/dev/null
-   mkdir conftest
-   cd conftest
-   mkdir out
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
-   lt_compiler_flag="-o out/conftest2.$ac_objext"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
-   (eval "$lt_compile" 2>out/conftest.err)
-   ac_status=$?
-   cat out/conftest.err >&5
-   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-   if (exit $ac_status) && test -s out/conftest2.$ac_objext
-   then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
-     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
-     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
-       lt_cv_prog_compiler_c_o_CXX=yes
-     fi
-   fi
-   chmod u+w . 2>&5
-   $RM conftest*
-   # SGI C++ compiler will create directory out/ii_files/ for
-   # template instantiation
-   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
-   $RM out/* && rmdir out
-   cd ..
-   $RM -r conftest
-   $RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5
-$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; }
-
-
-
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
-$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
-if ${lt_cv_prog_compiler_c_o_CXX+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_c_o_CXX=no
-   $RM -r conftest 2>/dev/null
-   mkdir conftest
-   cd conftest
-   mkdir out
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
-   lt_compiler_flag="-o out/conftest2.$ac_objext"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
-   (eval "$lt_compile" 2>out/conftest.err)
-   ac_status=$?
-   cat out/conftest.err >&5
-   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-   if (exit $ac_status) && test -s out/conftest2.$ac_objext
-   then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
-     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
-     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
-       lt_cv_prog_compiler_c_o_CXX=yes
-     fi
-   fi
-   chmod u+w . 2>&5
-   $RM conftest*
-   # SGI C++ compiler will create directory out/ii_files/ for
-   # template instantiation
-   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
-   $RM out/* && rmdir out
-   cd ..
-   $RM -r conftest
-   $RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5
-$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; }
-
-
-
-
-hard_links=nottested
-if test no = "$lt_cv_prog_compiler_c_o_CXX" && test no != "$need_locks"; then
-  # do not overwrite the value of need_locks provided by the user
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
-$as_echo_n "checking if we can lock with hard links... " >&6; }
-  hard_links=yes
-  $RM conftest*
-  ln conftest.a conftest.b 2>/dev/null && hard_links=no
-  touch conftest.a
-  ln conftest.a conftest.b 2>&5 || hard_links=no
-  ln conftest.a conftest.b 2>/dev/null && hard_links=no
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
-$as_echo "$hard_links" >&6; }
-  if test no = "$hard_links"; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5
-$as_echo "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;}
-    need_locks=warn
-  fi
-else
-  need_locks=no
-fi
-
-
-
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
-$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
-
-  export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
-  exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
-  case $host_os in
-  aix[4-9]*)
-    # If we're using GNU nm, then we don't want the "-C" option.
-    # -C means demangle to GNU nm, but means don't demangle to AIX nm.
-    # Without the "-l" option, or with the "-B" option, AIX nm treats
-    # weak defined symbols like other global defined symbols, whereas
-    # GNU nm marks them as "W".
-    # While the 'weak' keyword is ignored in the Export File, we need
-    # it in the Import File for the 'aix-soname' feature, so we have
-    # to replace the "-B" option with "-P" for AIX nm.
-    if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
-      export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols'
-    else
-      export_symbols_cmds_CXX='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
-    fi
-    ;;
-  pw32*)
-    export_symbols_cmds_CXX=$ltdll_cmds
-    ;;
-  cygwin* | mingw* | cegcc*)
-    case $cc_basename in
-    cl*)
-      exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
-      ;;
-    *)
-      export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols'
-      exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'
-      ;;
-    esac
-    ;;
-  *)
-    export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
-    ;;
-  esac
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5
-$as_echo "$ld_shlibs_CXX" >&6; }
-test no = "$ld_shlibs_CXX" && can_build_shared=no
-
-with_gnu_ld_CXX=$with_gnu_ld
-
-
-
-
-
-
-#
-# Do we need to explicitly link libc?
-#
-case "x$archive_cmds_need_lc_CXX" in
-x|xyes)
-  # Assume -lc should be added
-  archive_cmds_need_lc_CXX=yes
-
-  if test yes,yes = "$GCC,$enable_shared"; then
-    case $archive_cmds_CXX in
-    *'~'*)
-      # FIXME: we may have to deal with multi-command sequences.
-      ;;
-    '$CC '*)
-      # Test whether the compiler implicitly links with -lc since on some
-      # systems, -lgcc has to come before -lc. If gcc already passes -lc
-      # to ld, don't add -lc before -lgcc.
-      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
-$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; }
-if ${lt_cv_archive_cmds_need_lc_CXX+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  $RM conftest*
-	echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
-	if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } 2>conftest.err; then
-	  soname=conftest
-	  lib=conftest
-	  libobjs=conftest.$ac_objext
-	  deplibs=
-	  wl=$lt_prog_compiler_wl_CXX
-	  pic_flag=$lt_prog_compiler_pic_CXX
-	  compiler_flags=-v
-	  linker_flags=-v
-	  verstring=
-	  output_objdir=.
-	  libname=conftest
-	  lt_save_allow_undefined_flag=$allow_undefined_flag_CXX
-	  allow_undefined_flag_CXX=
-	  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
-  (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }
-	  then
-	    lt_cv_archive_cmds_need_lc_CXX=no
-	  else
-	    lt_cv_archive_cmds_need_lc_CXX=yes
-	  fi
-	  allow_undefined_flag_CXX=$lt_save_allow_undefined_flag
-	else
-	  cat conftest.err 1>&5
-	fi
-	$RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5
-$as_echo "$lt_cv_archive_cmds_need_lc_CXX" >&6; }
-      archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX
-      ;;
-    esac
-  fi
-  ;;
-esac
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
-$as_echo_n "checking dynamic linker characteristics... " >&6; }
-
-library_names_spec=
-libname_spec='lib$name'
-soname_spec=
-shrext_cmds=.so
-postinstall_cmds=
-postuninstall_cmds=
-finish_cmds=
-finish_eval=
-shlibpath_var=
-shlibpath_overrides_runpath=unknown
-version_type=none
-dynamic_linker="$host_os ld.so"
-sys_lib_dlsearch_path_spec="/lib /usr/lib"
-need_lib_prefix=unknown
-hardcode_into_libs=no
-
-# when you set need_version to no, make sure it does not cause -set_version
-# flags to be left without arguments
-need_version=unknown
-
-
-
-case $host_os in
-aix3*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='$libname$release$shared_ext$versuffix $libname.a'
-  shlibpath_var=LIBPATH
-
-  # AIX 3 has no versioning support, so we append a major version to the name.
-  soname_spec='$libname$release$shared_ext$major'
-  ;;
-
-aix[4-9]*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  hardcode_into_libs=yes
-  if test ia64 = "$host_cpu"; then
-    # AIX 5 supports IA64
-    library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext'
-    shlibpath_var=LD_LIBRARY_PATH
-  else
-    # With GCC up to 2.95.x, collect2 would create an import file
-    # for dependence libraries.  The import file would start with
-    # the line '#! .'.  This would cause the generated library to
-    # depend on '.', always an invalid library.  This was fixed in
-    # development snapshots of GCC prior to 3.0.
-    case $host_os in
-      aix4 | aix4.[01] | aix4.[01].*)
-      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
-	   echo ' yes '
-	   echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then
-	:
-      else
-	can_build_shared=no
-      fi
-      ;;
-    esac
-    # Using Import Files as archive members, it is possible to support
-    # filename-based versioning of shared library archives on AIX. While
-    # this would work for both with and without runtime linking, it will
-    # prevent static linking of such archives. So we do filename-based
-    # shared library versioning with .so extension only, which is used
-    # when both runtime linking and shared linking is enabled.
-    # Unfortunately, runtime linking may impact performance, so we do
-    # not want this to be the default eventually. Also, we use the
-    # versioned .so libs for executables only if there is the -brtl
-    # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only.
-    # To allow for filename-based versioning support, we need to create
-    # libNAME.so.V as an archive file, containing:
-    # *) an Import File, referring to the versioned filename of the
-    #    archive as well as the shared archive member, telling the
-    #    bitwidth (32 or 64) of that shared object, and providing the
-    #    list of exported symbols of that shared object, eventually
-    #    decorated with the 'weak' keyword
-    # *) the shared object with the F_LOADONLY flag set, to really avoid
-    #    it being seen by the linker.
-    # At run time we better use the real file rather than another symlink,
-    # but for link time we create the symlink libNAME.so -> libNAME.so.V
-
-    case $with_aix_soname,$aix_use_runtimelinking in
-    # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct
-    # soname into executable. Probably we can add versioning support to
-    # collect2, so additional links can be useful in future.
-    aix,yes) # traditional libtool
-      dynamic_linker='AIX unversionable lib.so'
-      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
-      # instead of lib<name>.a to let people know that these are not
-      # typical AIX shared libraries.
-      library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
-      ;;
-    aix,no) # traditional AIX only
-      dynamic_linker='AIX lib.a(lib.so.V)'
-      # We preserve .a as extension for shared libraries through AIX4.2
-      # and later when we are not doing run time linking.
-      library_names_spec='$libname$release.a $libname.a'
-      soname_spec='$libname$release$shared_ext$major'
-      ;;
-    svr4,*) # full svr4 only
-      dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)"
-      library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
-      # We do not specify a path in Import Files, so LIBPATH fires.
-      shlibpath_overrides_runpath=yes
-      ;;
-    *,yes) # both, prefer svr4
-      dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)"
-      library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
-      # unpreferred sharedlib libNAME.a needs extra handling
-      postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"'
-      postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"'
-      # We do not specify a path in Import Files, so LIBPATH fires.
-      shlibpath_overrides_runpath=yes
-      ;;
-    *,no) # both, prefer aix
-      dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)"
-      library_names_spec='$libname$release.a $libname.a'
-      soname_spec='$libname$release$shared_ext$major'
-      # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling
-      postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)'
-      postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"'
-      ;;
-    esac
-    shlibpath_var=LIBPATH
-  fi
-  ;;
-
-amigaos*)
-  case $host_cpu in
-  powerpc)
-    # Since July 2007 AmigaOS4 officially supports .so libraries.
-    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
-    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
-    ;;
-  m68k)
-    library_names_spec='$libname.ixlibrary $libname.a'
-    # Create ${libname}_ixlibrary.a entries in /sys/libs.
-    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
-    ;;
-  esac
-  ;;
-
-beos*)
-  library_names_spec='$libname$shared_ext'
-  dynamic_linker="$host_os ld.so"
-  shlibpath_var=LIBRARY_PATH
-  ;;
-
-bsdi[45]*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_version=no
-  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
-  soname_spec='$libname$release$shared_ext$major'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
-  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
-  # the default ld.so.conf also contains /usr/contrib/lib and
-  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
-  # libtool to hard-code these into programs
-  ;;
-
-cygwin* | mingw* | pw32* | cegcc*)
-  version_type=windows
-  shrext_cmds=.dll
-  need_version=no
-  need_lib_prefix=no
-
-  case $GCC,$cc_basename in
-  yes,*)
-    # gcc
-    library_names_spec='$libname.dll.a'
-    # DLL is installed to $(libdir)/../bin by postinstall_cmds
-    postinstall_cmds='base_file=`basename \$file`~
-      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
-      dldir=$destdir/`dirname \$dlpath`~
-      test -d \$dldir || mkdir -p \$dldir~
-      $install_prog $dir/$dlname \$dldir/$dlname~
-      chmod a+x \$dldir/$dlname~
-      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
-        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
-      fi'
-    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
-      dlpath=$dir/\$dldll~
-       $RM \$dlpath'
-    shlibpath_overrides_runpath=yes
-
-    case $host_os in
-    cygwin*)
-      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
-      soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
-
-      ;;
-    mingw* | cegcc*)
-      # MinGW DLLs use traditional 'lib' prefix
-      soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
-      ;;
-    pw32*)
-      # pw32 DLLs use 'pw' prefix rather than 'lib'
-      library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
-      ;;
-    esac
-    dynamic_linker='Win32 ld.exe'
-    ;;
-
-  *,cl*)
-    # Native MSVC
-    libname_spec='$name'
-    soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
-    library_names_spec='$libname.dll.lib'
-
-    case $build_os in
-    mingw*)
-      sys_lib_search_path_spec=
-      lt_save_ifs=$IFS
-      IFS=';'
-      for lt_path in $LIB
-      do
-        IFS=$lt_save_ifs
-        # Let DOS variable expansion print the short 8.3 style file name.
-        lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
-        sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
-      done
-      IFS=$lt_save_ifs
-      # Convert to MSYS style.
-      sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'`
-      ;;
-    cygwin*)
-      # Convert to unix form, then to dos form, then back to unix form
-      # but this time dos style (no spaces!) so that the unix form looks
-      # like /cygdrive/c/PROGRA~1:/cygdr...
-      sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
-      sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
-      sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
-      ;;
-    *)
-      sys_lib_search_path_spec=$LIB
-      if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
-        # It is most probably a Windows format PATH.
-        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
-      else
-        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
-      fi
-      # FIXME: find the short name or the path components, as spaces are
-      # common. (e.g. "Program Files" -> "PROGRA~1")
-      ;;
-    esac
-
-    # DLL is installed to $(libdir)/../bin by postinstall_cmds
-    postinstall_cmds='base_file=`basename \$file`~
-      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
-      dldir=$destdir/`dirname \$dlpath`~
-      test -d \$dldir || mkdir -p \$dldir~
-      $install_prog $dir/$dlname \$dldir/$dlname'
-    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
-      dlpath=$dir/\$dldll~
-       $RM \$dlpath'
-    shlibpath_overrides_runpath=yes
-    dynamic_linker='Win32 link.exe'
-    ;;
-
-  *)
-    # Assume MSVC wrapper
-    library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib'
-    dynamic_linker='Win32 ld.exe'
-    ;;
-  esac
-  # FIXME: first we should search . and the directory the executable is in
-  shlibpath_var=PATH
-  ;;
-
-darwin* | rhapsody*)
-  dynamic_linker="$host_os dyld"
-  version_type=darwin
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='$libname$release$major$shared_ext $libname$shared_ext'
-  soname_spec='$libname$release$major$shared_ext'
-  shlibpath_overrides_runpath=yes
-  shlibpath_var=DYLD_LIBRARY_PATH
-  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
-
-  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
-  ;;
-
-dgux*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
-  soname_spec='$libname$release$shared_ext$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  ;;
-
-freebsd* | dragonfly*)
-  # DragonFly does not have aout.  When/if they implement a new
-  # versioning mechanism, adjust this.
-  if test -x /usr/bin/objformat; then
-    objformat=`/usr/bin/objformat`
-  else
-    case $host_os in
-    freebsd[23].*) objformat=aout ;;
-    *) objformat=elf ;;
-    esac
-  fi
-  version_type=freebsd-$objformat
-  case $version_type in
-    freebsd-elf*)
-      library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
-      soname_spec='$libname$release$shared_ext$major'
-      need_version=no
-      need_lib_prefix=no
-      ;;
-    freebsd-*)
-      library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
-      need_version=yes
-      ;;
-  esac
-  shlibpath_var=LD_LIBRARY_PATH
-  case $host_os in
-  freebsd2.*)
-    shlibpath_overrides_runpath=yes
-    ;;
-  freebsd3.[01]* | freebsdelf3.[01]*)
-    shlibpath_overrides_runpath=yes
-    hardcode_into_libs=yes
-    ;;
-  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
-  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
-    shlibpath_overrides_runpath=no
-    hardcode_into_libs=yes
-    ;;
-  *) # from 4.6 on, and DragonFly
-    shlibpath_overrides_runpath=yes
-    hardcode_into_libs=yes
-    ;;
-  esac
-  ;;
-
-haiku*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  dynamic_linker="$host_os runtime_loader"
-  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
-  soname_spec='$libname$release$shared_ext$major'
-  shlibpath_var=LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
-  hardcode_into_libs=yes
-  ;;
-
-hpux9* | hpux10* | hpux11*)
-  # Give a soname corresponding to the major version so that dld.sl refuses to
-  # link against other versions.
-  version_type=sunos
-  need_lib_prefix=no
-  need_version=no
-  case $host_cpu in
-  ia64*)
-    shrext_cmds='.so'
-    hardcode_into_libs=yes
-    dynamic_linker="$host_os dld.so"
-    shlibpath_var=LD_LIBRARY_PATH
-    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
-    soname_spec='$libname$release$shared_ext$major'
-    if test 32 = "$HPUX_IA64_MODE"; then
-      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
-      sys_lib_dlsearch_path_spec=/usr/lib/hpux32
-    else
-      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
-      sys_lib_dlsearch_path_spec=/usr/lib/hpux64
-    fi
-    ;;
-  hppa*64*)
-    shrext_cmds='.sl'
-    hardcode_into_libs=yes
-    dynamic_linker="$host_os dld.sl"
-    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
-    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
-    soname_spec='$libname$release$shared_ext$major'
-    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
-    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
-    ;;
-  *)
-    shrext_cmds='.sl'
-    dynamic_linker="$host_os dld.sl"
-    shlibpath_var=SHLIB_PATH
-    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
-    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
-    soname_spec='$libname$release$shared_ext$major'
-    ;;
-  esac
-  # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
-  postinstall_cmds='chmod 555 $lib'
-  # or fails outright, so override atomically:
-  install_override_mode=555
-  ;;
-
-interix[3-9]*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
-  soname_spec='$libname$release$shared_ext$major'
-  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
-
-irix5* | irix6* | nonstopux*)
-  case $host_os in
-    nonstopux*) version_type=nonstopux ;;
-    *)
-	if test yes = "$lt_cv_prog_gnu_ld"; then
-		version_type=linux # correct to gnu/linux during the next big refactor
-	else
-		version_type=irix
-	fi ;;
-  esac
-  need_lib_prefix=no
-  need_version=no
-  soname_spec='$libname$release$shared_ext$major'
-  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext'
-  case $host_os in
-  irix5* | nonstopux*)
-    libsuff= shlibsuff=
-    ;;
-  *)
-    case $LD in # libtool.m4 will add one of these switches to LD
-    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
-      libsuff= shlibsuff= libmagic=32-bit;;
-    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
-      libsuff=32 shlibsuff=N32 libmagic=N32;;
-    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
-      libsuff=64 shlibsuff=64 libmagic=64-bit;;
-    *) libsuff= shlibsuff= libmagic=never-match;;
-    esac
-    ;;
-  esac
-  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
-  shlibpath_overrides_runpath=no
-  sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff"
-  sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff"
-  hardcode_into_libs=yes
-  ;;
-
-# No shared lib support for Linux oldld, aout, or coff.
-linux*oldld* | linux*aout* | linux*coff*)
-  dynamic_linker=no
-  ;;
-
-linux*android*)
-  version_type=none # Android doesn't support versioned libraries.
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='$libname$release$shared_ext'
-  soname_spec='$libname$release$shared_ext'
-  finish_cmds=
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-
-  # This implies no fast_install, which is unacceptable.
-  # Some rework will be needed to allow for fast_install
-  # before this can be enabled.
-  hardcode_into_libs=yes
-
-  dynamic_linker='Android linker'
-  # Don't embed -rpath directories since the linker doesn't support them.
-  hardcode_libdir_flag_spec_CXX='-L$libdir'
-  ;;
-
-# This must be glibc/ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
-  soname_spec='$libname$release$shared_ext$major'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-
-  # Some binutils ld are patched to set DT_RUNPATH
-  if ${lt_cv_shlibpath_overrides_runpath+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_shlibpath_overrides_runpath=no
-    save_LDFLAGS=$LDFLAGS
-    save_libdir=$libdir
-    eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \
-	 LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\""
-    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
-  if  ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then :
-  lt_cv_shlibpath_overrides_runpath=yes
-fi
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-    LDFLAGS=$save_LDFLAGS
-    libdir=$save_libdir
-
-fi
-
-  shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
-
-  # This implies no fast_install, which is unacceptable.
-  # Some rework will be needed to allow for fast_install
-  # before this can be enabled.
-  hardcode_into_libs=yes
-
-  # Ideally, we could use ldconfig to report *all* directores which are
-  # searched for libraries, however this is still not possible.  Aside from not
-  # being certain /sbin/ldconfig is available, command
-  # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64,
-  # even though it is searched at run-time.  Try to do the best guess by
-  # appending ld.so.conf contents (and includes) to the search path.
-  if test -f /etc/ld.so.conf; then
-    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
-    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
-  fi
-
-  # We used to test for /lib/ld.so.1 and disable shared libraries on
-  # powerpc, because MkLinux only supported shared libraries with the
-  # GNU dynamic linker.  Since this was broken with cross compilers,
-  # most powerpc-linux boxes support dynamic linking these days and
-  # people can always --disable-shared, the test was removed, and we
-  # assume the GNU/Linux dynamic linker is in use.
-  dynamic_linker='GNU/Linux ld.so'
-  ;;
-
-netbsd*)
-  version_type=sunos
-  need_lib_prefix=no
-  need_version=no
-  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-    library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
-    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-    dynamic_linker='NetBSD (a.out) ld.so'
-  else
-    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
-    soname_spec='$libname$release$shared_ext$major'
-    dynamic_linker='NetBSD ld.elf_so'
-  fi
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  ;;
-
-newsos6)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  ;;
-
-*nto* | *qnx*)
-  version_type=qnx
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
-  soname_spec='$libname$release$shared_ext$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  dynamic_linker='ldqnx.so'
-  ;;
-
-openbsd* | bitrig*)
-  version_type=sunos
-  sys_lib_dlsearch_path_spec=/usr/lib
-  need_lib_prefix=no
-  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
-    need_version=no
-  else
-    need_version=yes
-  fi
-  library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  ;;
-
-os2*)
-  libname_spec='$name'
-  version_type=windows
-  shrext_cmds=.dll
-  need_version=no
-  need_lib_prefix=no
-  # OS/2 can only load a DLL with a base name of 8 characters or less.
-  soname_spec='`test -n "$os2dllname" && libname="$os2dllname";
-    v=$($ECHO $release$versuffix | tr -d .-);
-    n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _);
-    $ECHO $n$v`$shared_ext'
-  library_names_spec='${libname}_dll.$libext'
-  dynamic_linker='OS/2 ld.exe'
-  shlibpath_var=BEGINLIBPATH
-  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
-  sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
-  postinstall_cmds='base_file=`basename \$file`~
-    dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~
-    dldir=$destdir/`dirname \$dlpath`~
-    test -d \$dldir || mkdir -p \$dldir~
-    $install_prog $dir/$dlname \$dldir/$dlname~
-    chmod a+x \$dldir/$dlname~
-    if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
-      eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
-    fi'
-  postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~
-    dlpath=$dir/\$dldll~
-    $RM \$dlpath'
-  ;;
-
-osf3* | osf4* | osf5*)
-  version_type=osf
-  need_lib_prefix=no
-  need_version=no
-  soname_spec='$libname$release$shared_ext$major'
-  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
-  shlibpath_var=LD_LIBRARY_PATH
-  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
-  sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
-  ;;
-
-rdos*)
-  dynamic_linker=no
-  ;;
-
-solaris*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
-  soname_spec='$libname$release$shared_ext$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  # ldd complains unless libraries are executable
-  postinstall_cmds='chmod +x $lib'
-  ;;
-
-sunos4*)
-  version_type=sunos
-  library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
-  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  if test yes = "$with_gnu_ld"; then
-    need_lib_prefix=no
-  fi
-  need_version=yes
-  ;;
-
-sysv4 | sysv4.3*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
-  soname_spec='$libname$release$shared_ext$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  case $host_vendor in
-    sni)
-      shlibpath_overrides_runpath=no
-      need_lib_prefix=no
-      runpath_var=LD_RUN_PATH
-      ;;
-    siemens)
-      need_lib_prefix=no
-      ;;
-    motorola)
-      need_lib_prefix=no
-      need_version=no
-      shlibpath_overrides_runpath=no
-      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
-      ;;
-  esac
-  ;;
-
-sysv4*MP*)
-  if test -d /usr/nec; then
-    version_type=linux # correct to gnu/linux during the next big refactor
-    library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext'
-    soname_spec='$libname$shared_ext.$major'
-    shlibpath_var=LD_LIBRARY_PATH
-  fi
-  ;;
-
-sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
-  version_type=sco
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext'
-  soname_spec='$libname$release$shared_ext$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  if test yes = "$with_gnu_ld"; then
-    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
-  else
-    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
-    case $host_os in
-      sco3.2v5*)
-        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
-	;;
-    esac
-  fi
-  sys_lib_dlsearch_path_spec='/usr/lib'
-  ;;
-
-tpf*)
-  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
-
-uts4*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
-  soname_spec='$libname$release$shared_ext$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  ;;
-
-*)
-  dynamic_linker=no
-  ;;
-esac
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
-$as_echo "$dynamic_linker" >&6; }
-test no = "$dynamic_linker" && can_build_shared=no
-
-variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
-if test yes = "$GCC"; then
-  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
-fi
-
-if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then
-  sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec
-fi
-
-if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then
-  sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec
-fi
-
-# remember unaugmented sys_lib_dlsearch_path content for libtool script decls...
-configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec
-
-# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code
-func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH"
-
-# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool
-configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
-$as_echo_n "checking how to hardcode library paths into programs... " >&6; }
-hardcode_action_CXX=
-if test -n "$hardcode_libdir_flag_spec_CXX" ||
-   test -n "$runpath_var_CXX" ||
-   test yes = "$hardcode_automatic_CXX"; then
-
-  # We can hardcode non-existent directories.
-  if test no != "$hardcode_direct_CXX" &&
-     # If the only mechanism to avoid hardcoding is shlibpath_var, we
-     # have to relink, otherwise we might link with an installed library
-     # when we should be linking with a yet-to-be-installed one
-     ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" &&
-     test no != "$hardcode_minus_L_CXX"; then
-    # Linking always hardcodes the temporary library directory.
-    hardcode_action_CXX=relink
-  else
-    # We can link without hardcoding, and we can hardcode nonexisting dirs.
-    hardcode_action_CXX=immediate
-  fi
-else
-  # We cannot hardcode anything, or else we can only hardcode existing
-  # directories.
-  hardcode_action_CXX=unsupported
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5
-$as_echo "$hardcode_action_CXX" >&6; }
-
-if test relink = "$hardcode_action_CXX" ||
-   test yes = "$inherit_rpath_CXX"; then
-  # Fast installation is not supported
-  enable_fast_install=no
-elif test yes = "$shlibpath_overrides_runpath" ||
-     test no = "$enable_shared"; then
-  # Fast installation is not necessary
-  enable_fast_install=needless
-fi
-
-
-
-
-
-
-
-  fi # test -n "$compiler"
-
-  CC=$lt_save_CC
-  CFLAGS=$lt_save_CFLAGS
-  LDCXX=$LD
-  LD=$lt_save_LD
-  GCC=$lt_save_GCC
-  with_gnu_ld=$lt_save_with_gnu_ld
-  lt_cv_path_LDCXX=$lt_cv_path_LD
-  lt_cv_path_LD=$lt_save_path_LD
-  lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
-  lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
-fi # test yes != "$_lt_caught_CXX_error"
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
 
 
 
@@ -17528,11 +13496,11 @@
   if test -n "$GCC"; then
                 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the -Werror option is usable" >&5
 $as_echo_n "checking whether the -Werror option is usable... " >&6; }
-    if ${pcre_cv_cc_vis_werror+:} false; then :
+    if ${pcre2_cv_cc_vis_werror+:} false; then :
   $as_echo_n "(cached) " >&6
 else
 
-      pcre_save_CFLAGS="$CFLAGS"
+      pcre2_save_CFLAGS="$CFLAGS"
       CFLAGS="$CFLAGS -Werror"
       cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
@@ -17546,25 +13514,25 @@
 }
 _ACEOF
 if ac_fn_c_try_compile "$LINENO"; then :
-  pcre_cv_cc_vis_werror=yes
+  pcre2_cv_cc_vis_werror=yes
 else
-  pcre_cv_cc_vis_werror=no
+  pcre2_cv_cc_vis_werror=no
 fi
 rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-      CFLAGS="$pcre_save_CFLAGS"
+      CFLAGS="$pcre2_save_CFLAGS"
 fi
 
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $pcre_cv_cc_vis_werror" >&5
-$as_echo "$pcre_cv_cc_vis_werror" >&6; }
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $pcre2_cv_cc_vis_werror" >&5
+$as_echo "$pcre2_cv_cc_vis_werror" >&6; }
         { $as_echo "$as_me:${as_lineno-$LINENO}: checking for simple visibility declarations" >&5
 $as_echo_n "checking for simple visibility declarations... " >&6; }
-    if ${pcre_cv_cc_visibility+:} false; then :
+    if ${pcre2_cv_cc_visibility+:} false; then :
   $as_echo_n "(cached) " >&6
 else
 
-      pcre_save_CFLAGS="$CFLAGS"
+      pcre2_save_CFLAGS="$CFLAGS"
       CFLAGS="$CFLAGS -fvisibility=hidden"
-                                    if test $pcre_cv_cc_vis_werror = yes; then
+                                    if test $pcre2_cv_cc_vis_werror = yes; then
         CFLAGS="$CFLAGS -Werror"
       fi
       cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -17584,40 +13552,31 @@
 }
 _ACEOF
 if ac_fn_c_try_compile "$LINENO"; then :
-  pcre_cv_cc_visibility=yes
+  pcre2_cv_cc_visibility=yes
 else
-  pcre_cv_cc_visibility=no
+  pcre2_cv_cc_visibility=no
 fi
 rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-      CFLAGS="$pcre_save_CFLAGS"
+      CFLAGS="$pcre2_save_CFLAGS"
 fi
 
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $pcre_cv_cc_visibility" >&5
-$as_echo "$pcre_cv_cc_visibility" >&6; }
-    if test $pcre_cv_cc_visibility = yes; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $pcre2_cv_cc_visibility" >&5
+$as_echo "$pcre2_cv_cc_visibility" >&6; }
+    if test $pcre2_cv_cc_visibility = yes; then
       VISIBILITY_CFLAGS="-fvisibility=hidden"
       VISIBILITY_CXXFLAGS="-fvisibility=hidden -fvisibility-inlines-hidden"
       HAVE_VISIBILITY=1
 
-$as_echo "#define PCRE_EXP_DECL extern __attribute__ ((visibility (\"default\")))" >>confdefs.h
+$as_echo "#define PCRE2_EXP_DECL extern __attribute__ ((visibility (\"default\")))" >>confdefs.h
 
 
-$as_echo "#define PCRE_EXP_DEFN __attribute__ ((visibility (\"default\")))" >>confdefs.h
+$as_echo "#define PCRE2_EXP_DEFN __attribute__ ((visibility (\"default\")))" >>confdefs.h
 
 
-$as_echo "#define PCRE_EXP_DATA_DEFN __attribute__ ((visibility (\"default\")))" >>confdefs.h
+$as_echo "#define PCRE2POSIX_EXP_DECL extern __attribute__ ((visibility (\"default\")))" >>confdefs.h
 
 
-$as_echo "#define PCREPOSIX_EXP_DECL extern __attribute__ ((visibility (\"default\")))" >>confdefs.h
-
-
-$as_echo "#define PCREPOSIX_EXP_DEFN extern __attribute__ ((visibility (\"default\")))" >>confdefs.h
-
-
-$as_echo "#define PCRECPP_EXP_DECL extern __attribute__ ((visibility (\"default\")))" >>confdefs.h
-
-
-$as_echo "#define PCRECPP_EXP_DEFN __attribute__ ((visibility (\"default\")))" >>confdefs.h
+$as_echo "#define PCRE2POSIX_EXP_DEFN extern __attribute__ ((visibility (\"default\")))" >>confdefs.h
 
     fi
   fi
@@ -17633,16 +13592,16 @@
 
 # Versioning
 
-PCRE_MAJOR="8"
-PCRE_MINOR="38"
-PCRE_PRERELEASE=""
-PCRE_DATE="2015-11-23"
+PCRE2_MAJOR="10"
+PCRE2_MINOR="21"
+PCRE2_PRERELEASE=""
+PCRE2_DATE="2016-01-12"
 
-if test "$PCRE_MINOR" = "08" -o "$PCRE_MINOR" = "09"
+if test "$PCRE2_MINOR" = "08" -o "$PCRE2_MINOR" = "09"
 then
   echo "***"
-  echo "*** Minor version number $PCRE_MINOR must not be used. ***"
-  echo "*** Use only 01 to 07 or 10 onwards, to avoid octal issues. ***"
+  echo "*** Minor version number $PCRE2_MINOR must not be used. ***"
+  echo "*** Use only 00 to 07 or 10 onwards, to avoid octal issues. ***"
   echo "***"
   exit 1
 fi
@@ -17658,47 +13617,74 @@
   htmldir='${docdir}/html'
 fi
 
-# Handle --disable-pcre8 (enabled by default)
+# Force an error for PCRE1 size options
 # Check whether --enable-pcre8 was given.
 if test "${enable_pcre8+set}" = set; then :
   enableval=$enable_pcre8;
 else
-  enable_pcre8=unset
+  enable_pcre8=no
 fi
 
-
-
-# Handle --enable-pcre16 (disabled by default)
 # Check whether --enable-pcre16 was given.
 if test "${enable_pcre16+set}" = set; then :
   enableval=$enable_pcre16;
 else
-  enable_pcre16=unset
+  enable_pcre16=no
 fi
 
-
-
-# Handle --enable-pcre32 (disabled by default)
 # Check whether --enable-pcre32 was given.
 if test "${enable_pcre32+set}" = set; then :
   enableval=$enable_pcre32;
 else
-  enable_pcre32=unset
+  enable_pcre32=no
 fi
 
 
+if test "$enable_pcre8$enable_pcre16$enable_pcre32" != "nonono"
+then
+  echo "** ERROR: Use --[en|dis]able-pcre2-[8|16|32], not --[en|dis]able-pcre[8|16|32]"
+  exit 1
+fi
 
-# Handle --disable-cpp. The substitution of enable_cpp is needed for use in
-# pcre-config.
-# Check whether --enable-cpp was given.
-if test "${enable_cpp+set}" = set; then :
-  enableval=$enable_cpp;
+# Handle --disable-pcre2-8 (enabled by default)
+# Check whether --enable-pcre2-8 was given.
+if test "${enable_pcre2_8+set}" = set; then :
+  enableval=$enable_pcre2_8;
 else
-  enable_cpp=unset
+  enable_pcre2_8=unset
 fi
 
 
 
+# Handle --enable-pcre2-16 (disabled by default)
+# Check whether --enable-pcre2-16 was given.
+if test "${enable_pcre2_16+set}" = set; then :
+  enableval=$enable_pcre2_16;
+else
+  enable_pcre2_16=unset
+fi
+
+
+
+# Handle --enable-pcre2-32 (disabled by default)
+# Check whether --enable-pcre2-32 was given.
+if test "${enable_pcre2_32+set}" = set; then :
+  enableval=$enable_pcre2_32;
+else
+  enable_pcre2_32=unset
+fi
+
+
+
+# Handle --dnable-debug (disabled by default)
+# Check whether --enable-debug was given.
+if test "${enable_debug+set}" = set; then :
+  enableval=$enable_debug;
+else
+  enable_debug=no
+fi
+
+
 # Handle --enable-jit (disabled by default)
 # Check whether --enable-jit was given.
 if test "${enable_jit+set}" = set; then :
@@ -17708,12 +13694,12 @@
 fi
 
 
-# Handle --disable-pcregrep-jit (enabled by default)
-# Check whether --enable-pcregrep-jit was given.
-if test "${enable_pcregrep_jit+set}" = set; then :
-  enableval=$enable_pcregrep_jit;
+# Handle --disable-pcre2grep-jit (enabled by default)
+# Check whether --enable-pcre2grep-jit was given.
+if test "${enable_pcre2grep_jit+set}" = set; then :
+  enableval=$enable_pcre2grep_jit;
 else
-  enable_pcregrep_jit=yes
+  enable_pcre2grep_jit=yes
 fi
 
 
@@ -17726,61 +13712,43 @@
 fi
 
 
-# Handle --enable-utf8 (disabled by default)
-# Check whether --enable-utf8 was given.
-if test "${enable_utf8+set}" = set; then :
-  enableval=$enable_utf8;
+# Handle --disable-unicode (enabled by default)
+# Check whether --enable-unicode was given.
+if test "${enable_unicode+set}" = set; then :
+  enableval=$enable_unicode;
 else
-  enable_utf8=unset
-fi
-
-
-# Handle --enable-utf (disabled by default)
-# Check whether --enable-utf was given.
-if test "${enable_utf+set}" = set; then :
-  enableval=$enable_utf;
-else
-  enable_utf=unset
-fi
-
-
-# Handle --enable-unicode-properties
-# Check whether --enable-unicode-properties was given.
-if test "${enable_unicode_properties+set}" = set; then :
-  enableval=$enable_unicode_properties;
-else
-  enable_unicode_properties=no
+  enable_unicode=unset
 fi
 
 
 # Handle newline options
-ac_pcre_newline=lf
+ac_pcre2_newline=lf
 # Check whether --enable-newline-is-cr was given.
 if test "${enable_newline_is_cr+set}" = set; then :
-  enableval=$enable_newline_is_cr; ac_pcre_newline=cr
+  enableval=$enable_newline_is_cr; ac_pcre2_newline=cr
 fi
 
 # Check whether --enable-newline-is-lf was given.
 if test "${enable_newline_is_lf+set}" = set; then :
-  enableval=$enable_newline_is_lf; ac_pcre_newline=lf
+  enableval=$enable_newline_is_lf; ac_pcre2_newline=lf
 fi
 
 # Check whether --enable-newline-is-crlf was given.
 if test "${enable_newline_is_crlf+set}" = set; then :
-  enableval=$enable_newline_is_crlf; ac_pcre_newline=crlf
+  enableval=$enable_newline_is_crlf; ac_pcre2_newline=crlf
 fi
 
 # Check whether --enable-newline-is-anycrlf was given.
 if test "${enable_newline_is_anycrlf+set}" = set; then :
-  enableval=$enable_newline_is_anycrlf; ac_pcre_newline=anycrlf
+  enableval=$enable_newline_is_anycrlf; ac_pcre2_newline=anycrlf
 fi
 
 # Check whether --enable-newline-is-any was given.
 if test "${enable_newline_is_any+set}" = set; then :
-  enableval=$enable_newline_is_any; ac_pcre_newline=any
+  enableval=$enable_newline_is_any; ac_pcre2_newline=any
 fi
 
-enable_newline="$ac_pcre_newline"
+enable_newline="$ac_pcre2_newline"
 
 # Handle --enable-bsr-anycrlf
 # Check whether --enable-bsr-anycrlf was given.
@@ -17791,6 +13759,15 @@
 fi
 
 
+# Handle --enable-never-backslash-C
+# Check whether --enable-never-backslash-C was given.
+if test "${enable_never_backslash_C+set}" = set; then :
+  enableval=$enable_never_backslash_C;
+else
+  enable_never_backslash_C=no
+fi
+
+
 # Handle --enable-ebcdic
 # Check whether --enable-ebcdic was given.
 if test "${enable_ebcdic+set}" = set; then :
@@ -17818,59 +13795,49 @@
 fi
 
 
-# Handle --enable-pcregrep-libz
-# Check whether --enable-pcregrep-libz was given.
-if test "${enable_pcregrep_libz+set}" = set; then :
-  enableval=$enable_pcregrep_libz;
+# Handle --enable-pcre2grep-libz
+# Check whether --enable-pcre2grep-libz was given.
+if test "${enable_pcre2grep_libz+set}" = set; then :
+  enableval=$enable_pcre2grep_libz;
 else
-  enable_pcregrep_libz=no
+  enable_pcre2grep_libz=no
 fi
 
 
-# Handle --enable-pcregrep-libbz2
-# Check whether --enable-pcregrep-libbz2 was given.
-if test "${enable_pcregrep_libbz2+set}" = set; then :
-  enableval=$enable_pcregrep_libbz2;
+# Handle --enable-pcre2grep-libbz2
+# Check whether --enable-pcre2grep-libbz2 was given.
+if test "${enable_pcre2grep_libbz2+set}" = set; then :
+  enableval=$enable_pcre2grep_libbz2;
 else
-  enable_pcregrep_libbz2=no
+  enable_pcre2grep_libbz2=no
 fi
 
 
-# Handle --with-pcregrep-bufsize=N
+# Handle --with-pcre2grep-bufsize=N
 
-# Check whether --with-pcregrep-bufsize was given.
-if test "${with_pcregrep_bufsize+set}" = set; then :
-  withval=$with_pcregrep_bufsize;
+# Check whether --with-pcre2grep-bufsize was given.
+if test "${with_pcre2grep_bufsize+set}" = set; then :
+  withval=$with_pcre2grep_bufsize;
 else
-  with_pcregrep_bufsize=20480
+  with_pcre2grep_bufsize=20480
 fi
 
 
-# Handle --enable-pcretest-libedit
-# Check whether --enable-pcretest-libedit was given.
-if test "${enable_pcretest_libedit+set}" = set; then :
-  enableval=$enable_pcretest_libedit;
+# Handle --enable-pcre2test-libedit
+# Check whether --enable-pcre2test-libedit was given.
+if test "${enable_pcre2test_libedit+set}" = set; then :
+  enableval=$enable_pcre2test_libedit;
 else
-  enable_pcretest_libedit=no
+  enable_pcre2test_libedit=no
 fi
 
 
-# Handle --enable-pcretest-libreadline
-# Check whether --enable-pcretest-libreadline was given.
-if test "${enable_pcretest_libreadline+set}" = set; then :
-  enableval=$enable_pcretest_libreadline;
+# Handle --enable-pcre2test-libreadline
+# Check whether --enable-pcre2test-libreadline was given.
+if test "${enable_pcre2test_libreadline+set}" = set; then :
+  enableval=$enable_pcre2test_libreadline;
 else
-  enable_pcretest_libreadline=no
-fi
-
-
-# Handle --with-posix-malloc-threshold=NBYTES
-
-# Check whether --with-posix-malloc-threshold was given.
-if test "${with_posix_malloc_threshold+set}" = set; then :
-  withval=$with_posix_malloc_threshold;
-else
-  with_posix_malloc_threshold=10
+  enable_pcre2test_libreadline=no
 fi
 
 
@@ -17939,81 +13906,45 @@
 fi
 
 
-# Copy enable_utf8 value to enable_utf for compatibility reasons
-if test "x$enable_utf8" != "xunset"
+# Set the default value for pcre2-8
+if test "x$enable_pcre2_8" = "xunset"
 then
-  if test "x$enable_utf" != "xunset"
-  then
-    as_fn_error $? "--enable/disable-utf8 is kept only for compatibility reasons and its value is copied to --enable/disable-utf. Newer code must use --enable/disable-utf alone." "$LINENO" 5
-  fi
-  enable_utf=$enable_utf8
+  enable_pcre2_8=yes
 fi
 
-# Set the default value for pcre8
-if test "x$enable_pcre8" = "xunset"
+# Set the default value for pcre2-16
+if test "x$enable_pcre2_16" = "xunset"
 then
-  enable_pcre8=yes
+  enable_pcre2_16=no
 fi
 
-# Set the default value for pcre16
-if test "x$enable_pcre16" = "xunset"
+# Set the default value for pcre2-32
+if test "x$enable_pcre2_32" = "xunset"
 then
-  enable_pcre16=no
+  enable_pcre2_32=no
 fi
 
-# Set the default value for pcre32
-if test "x$enable_pcre32" = "xunset"
+# Make sure at least one library is selected
+if test "x$enable_pcre2_8$enable_pcre2_16$enable_pcre2_32" = "xnonono"
 then
-  enable_pcre32=no
+  as_fn_error $? "At least one of the 8, 16 or 32 bit libraries must be enabled" "$LINENO" 5
 fi
 
-# Make sure enable_pcre8 or enable_pcre16 was set
-if test "x$enable_pcre8$enable_pcre16$enable_pcre32" = "xnonono"
+# Unicode is enabled by default.
+if test "x$enable_unicode" = "xunset"
 then
-  as_fn_error $? "At least one of 8, 16 or 32 bit pcre library must be enabled" "$LINENO" 5
+  enable_unicode=yes
 fi
 
-# Make sure that if enable_unicode_properties was set, that UTF support is enabled.
-if test "x$enable_unicode_properties" = "xyes"
-then
-  if test "x$enable_utf" = "xno"
-  then
-    as_fn_error $? "support for Unicode properties requires UTF-8/16/32 support" "$LINENO" 5
-  fi
-  enable_utf=yes
-fi
-
-# enable_utf is disabled by default.
-if test "x$enable_utf" = "xunset"
-then
-  enable_utf=no
-fi
-
-# enable_cpp copies the value of enable_pcre8 by default
-if test "x$enable_cpp" = "xunset"
-then
-  enable_cpp=$enable_pcre8
-fi
-
-# Make sure that if enable_cpp was set, that enable_pcre8 support is enabled
-if test "x$enable_cpp" = "xyes"
-then
-  if test "x$enable_pcre8" = "xno"
-  then
-    as_fn_error $? "C++ library requires pcre library with 8 bit characters" "$LINENO" 5
-  fi
-fi
-
-# Convert the newline identifier into the appropriate integer value. The first
-# three are ASCII values 0x0a, 0x0d, and 0x0d0a, but if EBCDIC is enabled, they
-# are changed below.
+# Convert the newline identifier into the appropriate integer value. These must
+# agree with the PCRE2_NEWLINE_xxx values in pcre2.h.
 
 case "$enable_newline" in
-  lf)      ac_pcre_newline_value=10   ;;
-  cr)      ac_pcre_newline_value=13   ;;
-  crlf)    ac_pcre_newline_value=3338 ;;
-  anycrlf) ac_pcre_newline_value=-2   ;;
-  any)     ac_pcre_newline_value=-1   ;;
+  cr)      ac_pcre2_newline_value=1 ;;
+  lf)      ac_pcre2_newline_value=2 ;;
+  crlf)    ac_pcre2_newline_value=3 ;;
+  any)     ac_pcre2_newline_value=4 ;;
+  anycrlf) ac_pcre2_newline_value=5 ;;
   *)
   as_fn_error $? "invalid argument \"$enable_newline\" to --enable-newline option" "$LINENO" 5
   ;;
@@ -18024,29 +13955,19 @@
   enable_ebcdic=yes
 fi
 
-# Make sure that if enable_ebcdic is set, rebuild_chartables is also enabled,
-# and the newline value is adjusted appropriately (CR is still 13, but LF is
-# 21 or 37). Also check that UTF support is not requested, because PCRE cannot
-# handle EBCDIC and UTF in the same build. To do so it would need to use
-# different character constants depending on the mode.
+# Make sure that if enable_ebcdic is set, rebuild_chartables is also enabled.
+# Also check that UTF support is not requested, because PCRE2 cannot handle
+# EBCDIC and UTF in the same build. To do so it would need to use different
+# character constants depending on the mode. Also, EBCDIC cannot be used with
+# 16-bit and 32-bit libraries.
 #
 if test "x$enable_ebcdic" = "xyes"; then
   enable_rebuild_chartables=yes
-
-  if test "x$enable_utf" = "xyes"; then
-    as_fn_error $? "support for EBCDIC and UTF-8/16/32 cannot be enabled at the same time" "$LINENO" 5
+  if test "x$enable_unicode" = "xyes"; then
+    as_fn_error $? "support for EBCDIC and Unicode cannot be enabled at the same time" "$LINENO" 5
   fi
-
-  if test "x$enable_ebcdic_nl25" = "xno"; then
-    case "$ac_pcre_newline_value" in
-      10)   ac_pcre_newline_value=21 ;;
-      3338) ac_pcre_newline_value=3349 ;;
-    esac
-  else
-    case "$ac_pcre_newline_value" in
-      10)   ac_pcre_newline_value=37 ;;
-      3338) ac_pcre_newline_value=3365 ;;
-    esac
+  if test "x$enable_pcre2_16" = "xyes" -o "x$enable_pcre2_32" = "xyes"; then
+    as_fn_error $? "EBCDIC support is available only for the 8-bit library" "$LINENO" 5
   fi
 fi
 
@@ -18199,233 +14120,37 @@
 done
 
 
-# The files below are C++ header files.
-pcre_have_type_traits="0"
-pcre_have_bits_type_traits="0"
-
-if test "x$enable_cpp" = "xyes" -a -z "$CXX"; then
-   as_fn_error $? "You need a C++ compiler for C++ support." "$LINENO" 5
-fi
-
-if test "x$enable_cpp" = "xyes" -a -n "$CXX"
-then
-ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-
-
-# Older versions of pcre defined pcrecpp::no_arg, but in new versions
-# it's called pcrecpp::RE::no_arg.  For backwards ABI compatibility,
-# we want to make one an alias for the other.  Different systems do
-# this in different ways.  Some systems, for instance, can do it via
-# a linker flag: -alias (for os x 10.5) or -i (for os x <=10.4).
-OLD_LDFLAGS="$LDFLAGS"
-for flag in "-alias,__ZN7pcrecpp2RE6no_argE,__ZN7pcrecpp6no_argE" \
-            "-i__ZN7pcrecpp6no_argE:__ZN7pcrecpp2RE6no_argE"; do
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for alias support in the linker" >&5
-$as_echo_n "checking for alias support in the linker... " >&6; }
-  LDFLAGS="$OLD_LDFLAGS -Wl,$flag"
-  # We try to run the linker with this new ld flag.  If the link fails,
-  # we give up and remove the new flag from LDFLAGS.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-namespace pcrecpp {
-                                    class RE { static int no_arg; };
-                                    int RE::no_arg;
-                                  }
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; };
-                  EXTRA_LIBPCRECPP_LDFLAGS="$EXTRA_LIBPCRECPP_LDFLAGS -Wl,$flag";
-                  break;
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-done
-LDFLAGS="$OLD_LDFLAGS"
-
-# We could be more clever here, given we're doing AC_SUBST with this
-# (eg set a var to be the name of the include file we want). But we're not
-# so it's easy to change back to 'regular' autoconf vars if we needed to.
-
-for ac_header in string
-do :
-  ac_fn_cxx_check_header_mongrel "$LINENO" "string" "ac_cv_header_string" "$ac_includes_default"
-if test "x$ac_cv_header_string" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_STRING 1
-_ACEOF
- pcre_have_cpp_headers="1"
-else
-  pcre_have_cpp_headers="0"
-fi
-
-done
-
-for ac_header in bits/type_traits.h
-do :
-  ac_fn_cxx_check_header_mongrel "$LINENO" "bits/type_traits.h" "ac_cv_header_bits_type_traits_h" "$ac_includes_default"
-if test "x$ac_cv_header_bits_type_traits_h" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_BITS_TYPE_TRAITS_H 1
-_ACEOF
- pcre_have_bits_type_traits="1"
-else
-  pcre_have_bits_type_traits="0"
-fi
-
-done
-
-for ac_header in type_traits.h
-do :
-  ac_fn_cxx_check_header_mongrel "$LINENO" "type_traits.h" "ac_cv_header_type_traits_h" "$ac_includes_default"
-if test "x$ac_cv_header_type_traits_h" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_TYPE_TRAITS_H 1
-_ACEOF
- pcre_have_type_traits="1"
-else
-  pcre_have_type_traits="0"
-fi
-
-done
-
-
-# (This isn't c++-specific, but is only used in pcrecpp.cc, so try this
-# in a c++ context.  This matters becuase strtoimax is C99 and may not
-# be supported by the C++ compiler.)
-# Figure out how to create a longlong from a string: strtoll and
-# equiv.  It's not enough to call AC_CHECK_FUNCS: hpux has a
-# strtoll, for instance, but it only takes 2 args instead of 3!
-# We have to call AH_TEMPLATE since AC_DEFINE_UNQUOTED below is complex.
-
-
-
-
-have_strto_fn=0
-for fn in strtoq strtoll _strtoi64 strtoimax; do
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $fn" >&5
-$as_echo_n "checking for $fn... " >&6; }
-  if test "$fn" = strtoimax; then
-    include=stdint.h
-  else
-    include=stdlib.h
-  fi
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <$include>
-int
-main ()
-{
-char* e; return $fn("100", &e, 10)
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_`echo $fn | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ` 1
-_ACEOF
-
-                     have_strto_fn=1
-                     break
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-done
-
-if test "$have_strto_fn" = 1; then
-  ac_fn_cxx_check_type "$LINENO" "long long" "ac_cv_type_long_long" "$ac_includes_default"
-if test "x$ac_cv_type_long_long" = xyes; then :
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_LONG_LONG 1
-_ACEOF
-
-pcre_have_long_long="1"
-else
-  pcre_have_long_long="0"
-fi
-
-  ac_fn_cxx_check_type "$LINENO" "unsigned long long" "ac_cv_type_unsigned_long_long" "$ac_includes_default"
-if test "x$ac_cv_type_unsigned_long_long" = xyes; then :
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_UNSIGNED_LONG_LONG 1
-_ACEOF
-
-pcre_have_ulong_long="1"
-else
-  pcre_have_ulong_long="0"
-fi
-
-else
-  pcre_have_long_long="0"
-  pcre_have_ulong_long="0"
-fi
-
-
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-fi
-# Using AC_SUBST eliminates the need to include config.h in a public .h file
-
-
-
 # Conditional compilation
- if test "x$enable_pcre8" = "xyes"; then
-  WITH_PCRE8_TRUE=
-  WITH_PCRE8_FALSE='#'
+ if test "x$enable_pcre2_8" = "xyes"; then
+  WITH_PCRE2_8_TRUE=
+  WITH_PCRE2_8_FALSE='#'
 else
-  WITH_PCRE8_TRUE='#'
-  WITH_PCRE8_FALSE=
+  WITH_PCRE2_8_TRUE='#'
+  WITH_PCRE2_8_FALSE=
 fi
 
- if test "x$enable_pcre16" = "xyes"; then
-  WITH_PCRE16_TRUE=
-  WITH_PCRE16_FALSE='#'
+ if test "x$enable_pcre2_16" = "xyes"; then
+  WITH_PCRE2_16_TRUE=
+  WITH_PCRE2_16_FALSE='#'
 else
-  WITH_PCRE16_TRUE='#'
-  WITH_PCRE16_FALSE=
+  WITH_PCRE2_16_TRUE='#'
+  WITH_PCRE2_16_FALSE=
 fi
 
- if test "x$enable_pcre32" = "xyes"; then
-  WITH_PCRE32_TRUE=
-  WITH_PCRE32_FALSE='#'
+ if test "x$enable_pcre2_32" = "xyes"; then
+  WITH_PCRE2_32_TRUE=
+  WITH_PCRE2_32_FALSE='#'
 else
-  WITH_PCRE32_TRUE='#'
-  WITH_PCRE32_FALSE=
+  WITH_PCRE2_32_TRUE='#'
+  WITH_PCRE2_32_FALSE=
 fi
 
- if test "x$enable_cpp" = "xyes"; then
-  WITH_PCRE_CPP_TRUE=
-  WITH_PCRE_CPP_FALSE='#'
+ if test "x$enable_debug" = "xyes"; then
+  WITH_DEBUG_TRUE=
+  WITH_DEBUG_FALSE='#'
 else
-  WITH_PCRE_CPP_TRUE='#'
-  WITH_PCRE_CPP_FALSE=
+  WITH_DEBUG_TRUE='#'
+  WITH_DEBUG_FALSE=
 fi
 
  if test "x$enable_rebuild_chartables" = "xyes"; then
@@ -18444,12 +14169,12 @@
   WITH_JIT_FALSE=
 fi
 
- if test "x$enable_utf" = "xyes"; then
-  WITH_UTF_TRUE=
-  WITH_UTF_FALSE='#'
+ if test "x$enable_unicode" = "xyes"; then
+  WITH_UNICODE_TRUE=
+  WITH_UNICODE_FALSE='#'
 else
-  WITH_UTF_TRUE='#'
-  WITH_UTF_FALSE=
+  WITH_UNICODE_TRUE='#'
+  WITH_UNICODE_FALSE=
 fi
 
  if test "x$enable_valgrind" = "xyes"; then
@@ -18636,7 +14361,7 @@
 #     therefore missing the function definition.
 #   - The compiler thus generates a "C" signature for the test function.
 #   - The linker fails to find the "C" function.
-#   - PCRE fails to configure if asked to do so against libbz2.
+#   - PCRE2 fails to configure if asked to do so against libbz2.
 #
 # Solution:
 #
@@ -18690,7 +14415,7 @@
 
 # Check for the availabiity of libreadline
 
-if test "$enable_pcretest_libreadline" = "yes"; then
+if test "$enable_pcre2test_libreadline" = "yes"; then
  for ac_header in readline/readline.h
 do :
   ac_fn_c_check_header_mongrel "$LINENO" "readline/readline.h" "ac_cv_header_readline_readline_h" "$ac_includes_default"
@@ -18980,7 +14705,7 @@
 # Check for the availability of libedit. Different distributions put its
 # headers in different places. Try to cover the most common ones.
 
-if test "$enable_pcretest_libedit" = "yes"; then
+if test "$enable_pcre2test_libedit" = "yes"; then
   for ac_header in editline/readline.h
 do :
   ac_fn_c_check_header_mongrel "$LINENO" "editline/readline.h" "ac_cv_header_editline_readline_h" "$ac_includes_default"
@@ -19063,32 +14788,38 @@
 
 # This facilitates -ansi builds under Linux
 
-PCRE_STATIC_CFLAG=""
+PCRE2_STATIC_CFLAG=""
 if test "x$enable_shared" = "xno" ; then
 
-$as_echo "#define PCRE_STATIC 1" >>confdefs.h
+$as_echo "#define PCRE2_STATIC 1" >>confdefs.h
 
-  PCRE_STATIC_CFLAG="-DPCRE_STATIC"
+  PCRE2_STATIC_CFLAG="-DPCRE2_STATIC"
 fi
 
 
-# Here is where pcre specific defines are handled
+# Here is where PCRE2-specific defines are handled
 
-if test "$enable_pcre8" = "yes"; then
+if test "$enable_pcre2_8" = "yes"; then
 
-$as_echo "#define SUPPORT_PCRE8 /**/" >>confdefs.h
+$as_echo "#define SUPPORT_PCRE2_8 /**/" >>confdefs.h
 
 fi
 
-if test "$enable_pcre16" = "yes"; then
+if test "$enable_pcre2_16" = "yes"; then
 
-$as_echo "#define SUPPORT_PCRE16 /**/" >>confdefs.h
+$as_echo "#define SUPPORT_PCRE2_16 /**/" >>confdefs.h
 
 fi
 
-if test "$enable_pcre32" = "yes"; then
+if test "$enable_pcre2_32" = "yes"; then
 
-$as_echo "#define SUPPORT_PCRE32 /**/" >>confdefs.h
+$as_echo "#define SUPPORT_PCRE2_32 /**/" >>confdefs.h
+
+fi
+
+if test "$enable_debug" = "yes"; then
+
+$as_echo "#define PCRE2_DEBUG /**/" >>confdefs.h
 
 fi
 
@@ -19500,67 +15231,61 @@
 $as_echo "#define SUPPORT_JIT /**/" >>confdefs.h
 
 else
-  enable_pcregrep_jit="no"
+  enable_pcre2grep_jit="no"
 fi
 
-if test "$enable_pcregrep_jit" = "yes"; then
+if test "$enable_pcre2grep_jit" = "yes"; then
 
-$as_echo "#define SUPPORT_PCREGREP_JIT /**/" >>confdefs.h
+$as_echo "#define SUPPORT_PCRE2GREP_JIT /**/" >>confdefs.h
 
 fi
 
-if test "$enable_utf" = "yes"; then
+if test "$enable_unicode" = "yes"; then
 
-$as_echo "#define SUPPORT_UTF /**/" >>confdefs.h
-
-fi
-
-if test "$enable_unicode_properties" = "yes"; then
-
-$as_echo "#define SUPPORT_UCP /**/" >>confdefs.h
+$as_echo "#define SUPPORT_UNICODE /**/" >>confdefs.h
 
 fi
 
 if test "$enable_stack_for_recursion" = "no"; then
 
-$as_echo "#define NO_RECURSE /**/" >>confdefs.h
+$as_echo "#define HEAP_MATCH_RECURSE /**/" >>confdefs.h
 
 fi
 
-if test "$enable_pcregrep_libz" = "yes"; then
+if test "$enable_pcre2grep_libz" = "yes"; then
 
 $as_echo "#define SUPPORT_LIBZ /**/" >>confdefs.h
 
 fi
 
-if test "$enable_pcregrep_libbz2" = "yes"; then
+if test "$enable_pcre2grep_libbz2" = "yes"; then
 
 $as_echo "#define SUPPORT_LIBBZ2 /**/" >>confdefs.h
 
 fi
 
-if test $with_pcregrep_bufsize -lt 8192 ; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $with_pcregrep_bufsize is too small for --with-pcregrep-bufsize; using 8192" >&5
-$as_echo "$as_me: WARNING: $with_pcregrep_bufsize is too small for --with-pcregrep-bufsize; using 8192" >&2;}
-  with_pcregrep_bufsize="8192"
+if test $with_pcre2grep_bufsize -lt 8192 ; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $with_pcre2grep_bufsize is too small for --with-pcre2grep-bufsize; using 8192" >&5
+$as_echo "$as_me: WARNING: $with_pcre2grep_bufsize is too small for --with-pcre2grep-bufsize; using 8192" >&2;}
+  with_pcre2grep_bufsize="8192"
 else
   if test $? -gt 1 ; then
-  as_fn_error $? "Bad value for  --with-pcregrep-bufsize" "$LINENO" 5
+  as_fn_error $? "Bad value for  --with-pcre2grep-bufsize" "$LINENO" 5
   fi
 fi
 
 
 cat >>confdefs.h <<_ACEOF
-#define PCREGREP_BUFSIZE $with_pcregrep_bufsize
+#define PCRE2GREP_BUFSIZE $with_pcre2grep_bufsize
 _ACEOF
 
 
-if test "$enable_pcretest_libedit" = "yes"; then
+if test "$enable_pcre2test_libedit" = "yes"; then
 
 $as_echo "#define SUPPORT_LIBEDIT /**/" >>confdefs.h
 
   LIBREADLINE="$LIBEDIT"
-elif test "$enable_pcretest_libreadline" = "yes"; then
+elif test "$enable_pcre2test_libreadline" = "yes"; then
 
 $as_echo "#define SUPPORT_LIBREADLINE /**/" >>confdefs.h
 
@@ -19568,7 +15293,7 @@
 
 
 cat >>confdefs.h <<_ACEOF
-#define NEWLINE $ac_pcre_newline_value
+#define NEWLINE_DEFAULT $ac_pcre2_newline_value
 _ACEOF
 
 
@@ -19578,6 +15303,12 @@
 
 fi
 
+if test "$enable_never_backslash_C" = "yes"; then
+
+$as_echo "#define NEVER_BACKSLASH_C /**/" >>confdefs.h
+
+fi
+
 
 cat >>confdefs.h <<_ACEOF
 #define LINK_SIZE $with_link_size
@@ -19586,12 +15317,6 @@
 
 
 cat >>confdefs.h <<_ACEOF
-#define POSIX_MALLOC_THRESHOLD $with_posix_malloc_threshold
-_ACEOF
-
-
-
-cat >>confdefs.h <<_ACEOF
 #define PARENS_NEST_LIMIT $with_parens_nest_limit
 _ACEOF
 
@@ -19654,25 +15379,20 @@
     ;;
 esac
 
-# The extra LDFLAGS for each particular library
-# (Note: The libpcre*_version bits are m4 variables, assigned above)
+# The extra LDFLAGS for each particular library. The libpcre2*_version values
+# are m4 variables, assigned above.
 
-EXTRA_LIBPCRE_LDFLAGS="$EXTRA_LIBPCRE_LDFLAGS \
-                       $NO_UNDEFINED -version-info 3:6:2"
+EXTRA_LIBPCRE2_8_LDFLAGS="$EXTRA_LIBPCRE2_8_LDFLAGS \
+  $NO_UNDEFINED -version-info 3:0:3"
 
-EXTRA_LIBPCRE16_LDFLAGS="$EXTRA_LIBPCRE16_LDFLAGS \
-                       $NO_UNDEFINED -version-info 2:6:2"
+EXTRA_LIBPCRE2_16_LDFLAGS="$EXTRA_LIBPCRE2_16_LDFLAGS \
+  $NO_UNDEFINED -version-info 3:0:3"
 
-EXTRA_LIBPCRE32_LDFLAGS="$EXTRA_LIBPCRE32_LDFLAGS \
-                       $NO_UNDEFINED -version-info 0:6:0"
+EXTRA_LIBPCRE2_32_LDFLAGS="$EXTRA_LIBPCRE2_32_LDFLAGS \
+  $NO_UNDEFINED -version-info 3:0:3"
 
-EXTRA_LIBPCREPOSIX_LDFLAGS="$EXTRA_LIBPCREPOSIX_LDFLAGS \
-                            $NO_UNDEFINED -version-info 0:3:0"
-
-EXTRA_LIBPCRECPP_LDFLAGS="$EXTRA_LIBPCRECPP_LDFLAGS \
-                          $NO_UNDEFINED -version-info 0:1:0 \
-                          $EXPORT_ALL_SYMBOLS"
-
+EXTRA_LIBPCRE2_POSIX_LDFLAGS="$EXTRA_LIBPCRE2_POSIX_LDFLAGS \
+  $NO_UNDEFINED -version-info 0:1:0"
 
 
 
@@ -19681,68 +15401,68 @@
 
 # When we run 'make distcheck', use these arguments. Turning off compiler
 # optimization makes it run faster.
-DISTCHECK_CONFIGURE_FLAGS="CFLAGS='' CXXFLAGS='' --enable-pcre16 --enable-pcre32 --enable-jit --enable-cpp --enable-unicode-properties"
+DISTCHECK_CONFIGURE_FLAGS="CFLAGS='' CXXFLAGS='' --enable-pcre2-16 --enable-pcre2-32 --enable-jit --enable-utf"
 
 
-# Check that, if --enable-pcregrep-libz or --enable-pcregrep-libbz2 is
+# Check that, if --enable-pcre2grep-libz or --enable-pcre2grep-libbz2 is
 # specified, the relevant library is available.
 
-if test "$enable_pcregrep_libz" = "yes"; then
+if test "$enable_pcre2grep_libz" = "yes"; then
   if test "$HAVE_ZLIB_H" != "1"; then
-    echo "** Cannot --enable-pcregrep-libz because zlib.h was not found"
+    echo "** Cannot --enable-pcre2grep-libz because zlib.h was not found"
     exit 1
   fi
   if test "$HAVE_LIBZ" != "1"; then
-    echo "** Cannot --enable-pcregrep-libz because libz was not found"
+    echo "** Cannot --enable-pcre2grep-libz because libz was not found"
     exit 1
   fi
   LIBZ="-lz"
 fi
 
 
-if test "$enable_pcregrep_libbz2" = "yes"; then
+if test "$enable_pcre2grep_libbz2" = "yes"; then
   if test "$HAVE_BZLIB_H" != "1"; then
-    echo "** Cannot --enable-pcregrep-libbz2 because bzlib.h was not found"
+    echo "** Cannot --enable-pcre2grep-libbz2 because bzlib.h was not found"
     exit 1
   fi
   if test "$HAVE_LIBBZ2" != "1"; then
-    echo "** Cannot --enable-pcregrep-libbz2 because libbz2 was not found"
+    echo "** Cannot --enable-pcre2grep-libbz2 because libbz2 was not found"
     exit 1
   fi
   LIBBZ2="-lbz2"
 fi
 
 
-# Similarly for --enable-pcretest-readline
+# Similarly for --enable-pcre2test-readline
 
-if test "$enable_pcretest_libedit" = "yes"; then
-  if test "$enable_pcretest_libreadline" = "yes"; then
-    echo "** Cannot use both --enable-pcretest-libedit and --enable-pcretest-readline"
+if test "$enable_pcre2test_libedit" = "yes"; then
+  if test "$enable_pcre2test_libreadline" = "yes"; then
+    echo "** Cannot use both --enable-pcre2test-libedit and --enable-pcre2test-readline"
     exit 1
   fi
   if test "$HAVE_EDITLINE_READLINE_H" != "1" -a \
           "$HAVE_READLINE_READLINE_H" != "1"; then
-    echo "** Cannot --enable-pcretest-libedit because neither editline/readline.h"
+    echo "** Cannot --enable-pcre2test-libedit because neither editline/readline.h"
     echo "** nor readline/readline.h was found."
     exit 1
   fi
   if test -z "$LIBEDIT"; then
-    echo "** Cannot --enable-pcretest-libedit because libedit library was not found."
+    echo "** Cannot --enable-pcre2test-libedit because libedit library was not found."
     exit 1
   fi
 fi
 
-if test "$enable_pcretest_libreadline" = "yes"; then
+if test "$enable_pcre2test_libreadline" = "yes"; then
   if test "$HAVE_READLINE_H" != "1"; then
-    echo "** Cannot --enable-pcretest-readline because readline/readline.h was not found."
+    echo "** Cannot --enable-pcre2test-readline because readline/readline.h was not found."
     exit 1
   fi
   if test "$HAVE_HISTORY_H" != "1"; then
-    echo "** Cannot --enable-pcretest-readline because readline/history.h was not found."
+    echo "** Cannot --enable-pcre2test-readline because readline/history.h was not found."
     exit 1
   fi
   if test -z "$LIBREADLINE"; then
-    echo "** Cannot --enable-pcretest-readline because readline library was not found."
+    echo "** Cannot --enable-pcre2test-readline because readline library was not found."
     exit 1
   fi
 fi
@@ -20133,14 +15853,14 @@
 
 
 # Produce these files, in addition to config.h.
-ac_config_files="$ac_config_files Makefile libpcre.pc libpcre16.pc libpcre32.pc libpcreposix.pc libpcrecpp.pc pcre-config pcre.h pcre_stringpiece.h pcrecpparg.h"
+ac_config_files="$ac_config_files Makefile libpcre2-8.pc libpcre2-16.pc libpcre2-32.pc libpcre2-posix.pc pcre2-config src/pcre2.h"
 
 
 # Make the generated script files executable.
 ac_config_commands="$ac_config_commands script-chmod"
 
 
-# Make sure that pcre_chartables.c is removed in case the method for
+# Make sure that pcre2_chartables.c is removed in case the method for
 # creating it was changed by reconfiguration.
 ac_config_commands="$ac_config_commands delete-old-chartables"
 
@@ -20282,24 +16002,20 @@
   as_fn_error $? "conditional \"am__fastdepCC\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
-if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then
-  as_fn_error $? "conditional \"am__fastdepCXX\" was never defined.
+if test -z "${WITH_PCRE2_8_TRUE}" && test -z "${WITH_PCRE2_8_FALSE}"; then
+  as_fn_error $? "conditional \"WITH_PCRE2_8\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
-if test -z "${WITH_PCRE8_TRUE}" && test -z "${WITH_PCRE8_FALSE}"; then
-  as_fn_error $? "conditional \"WITH_PCRE8\" was never defined.
+if test -z "${WITH_PCRE2_16_TRUE}" && test -z "${WITH_PCRE2_16_FALSE}"; then
+  as_fn_error $? "conditional \"WITH_PCRE2_16\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
-if test -z "${WITH_PCRE16_TRUE}" && test -z "${WITH_PCRE16_FALSE}"; then
-  as_fn_error $? "conditional \"WITH_PCRE16\" was never defined.
+if test -z "${WITH_PCRE2_32_TRUE}" && test -z "${WITH_PCRE2_32_FALSE}"; then
+  as_fn_error $? "conditional \"WITH_PCRE2_32\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
-if test -z "${WITH_PCRE32_TRUE}" && test -z "${WITH_PCRE32_FALSE}"; then
-  as_fn_error $? "conditional \"WITH_PCRE32\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${WITH_PCRE_CPP_TRUE}" && test -z "${WITH_PCRE_CPP_FALSE}"; then
-  as_fn_error $? "conditional \"WITH_PCRE_CPP\" was never defined.
+if test -z "${WITH_DEBUG_TRUE}" && test -z "${WITH_DEBUG_FALSE}"; then
+  as_fn_error $? "conditional \"WITH_DEBUG\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
 if test -z "${WITH_REBUILD_CHARTABLES_TRUE}" && test -z "${WITH_REBUILD_CHARTABLES_FALSE}"; then
@@ -20310,8 +16026,8 @@
   as_fn_error $? "conditional \"WITH_JIT\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
-if test -z "${WITH_UTF_TRUE}" && test -z "${WITH_UTF_FALSE}"; then
-  as_fn_error $? "conditional \"WITH_UTF\" was never defined.
+if test -z "${WITH_UNICODE_TRUE}" && test -z "${WITH_UNICODE_FALSE}"; then
+  as_fn_error $? "conditional \"WITH_UNICODE\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
 if test -z "${WITH_VALGRIND_TRUE}" && test -z "${WITH_VALGRIND_FALSE}"; then
@@ -20719,7 +16435,7 @@
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by PCRE $as_me 8.38, which was
+This file was extended by PCRE2 $as_me 10.21, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -20785,7 +16501,7 @@
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-PCRE config.status 8.38
+PCRE2 config.status 10.21
 configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 
@@ -21050,60 +16766,6 @@
 enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`'
 old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`'
 striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`'
-compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`'
-predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`'
-postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`'
-predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`'
-postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`'
-compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`'
-LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`'
-reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`'
-reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`'
-old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`'
-compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`'
-GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`'
-lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`'
-lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`'
-lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`'
-lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`'
-lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`'
-archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`'
-enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`'
-export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`'
-whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`'
-compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`'
-old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`'
-old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`'
-archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`'
-archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`'
-module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`'
-module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`'
-with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`'
-allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`'
-no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`'
-hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`'
-hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`'
-hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`'
-hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`'
-hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`'
-hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`'
-hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`'
-inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`'
-link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`'
-always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`'
-export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`'
-exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`'
-include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`'
-prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`'
-postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`'
-file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`'
-hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`'
-compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`'
-predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`'
-postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`'
-predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`'
-postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`'
-compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`'
 
 LTCC='$LTCC'
 LTCFLAGS='$LTCFLAGS'
@@ -21186,38 +16848,7 @@
 install_override_mode \
 finish_eval \
 old_striplib \
-striplib \
-compiler_lib_search_dirs \
-predep_objects \
-postdep_objects \
-predeps \
-postdeps \
-compiler_lib_search_path \
-LD_CXX \
-reload_flag_CXX \
-compiler_CXX \
-lt_prog_compiler_no_builtin_flag_CXX \
-lt_prog_compiler_pic_CXX \
-lt_prog_compiler_wl_CXX \
-lt_prog_compiler_static_CXX \
-lt_cv_prog_compiler_c_o_CXX \
-export_dynamic_flag_spec_CXX \
-whole_archive_flag_spec_CXX \
-compiler_needs_object_CXX \
-with_gnu_ld_CXX \
-allow_undefined_flag_CXX \
-no_undefined_flag_CXX \
-hardcode_libdir_flag_spec_CXX \
-hardcode_libdir_separator_CXX \
-exclude_expsyms_CXX \
-include_expsyms_CXX \
-file_list_spec_CXX \
-compiler_lib_search_dirs_CXX \
-predep_objects_CXX \
-postdep_objects_CXX \
-predeps_CXX \
-postdeps_CXX \
-compiler_lib_search_path_CXX; do
+striplib; do
     case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
     *[\\\\\\\`\\"\\\$]*)
       eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
@@ -21248,18 +16879,7 @@
 finish_cmds \
 sys_lib_search_path_spec \
 configure_time_dlsearch_path \
-configure_time_lt_sys_library_path \
-reload_cmds_CXX \
-old_archive_cmds_CXX \
-old_archive_from_new_cmds_CXX \
-old_archive_from_expsyms_cmds_CXX \
-archive_cmds_CXX \
-archive_expsym_cmds_CXX \
-module_cmds_CXX \
-module_expsym_cmds_CXX \
-export_symbols_cmds_CXX \
-prelink_cmds_CXX \
-postlink_cmds_CXX; do
+configure_time_lt_sys_library_path; do
     case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
     *[\\\\\\\`\\"\\\$]*)
       eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
@@ -21287,8 +16907,6 @@
 
 
 
-
-
 _ACEOF
 
 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
@@ -21297,19 +16915,16 @@
 for ac_config_target in $ac_config_targets
 do
   case $ac_config_target in
-    "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
+    "src/config.h") CONFIG_HEADERS="$CONFIG_HEADERS src/config.h" ;;
     "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
     "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;;
     "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
-    "libpcre.pc") CONFIG_FILES="$CONFIG_FILES libpcre.pc" ;;
-    "libpcre16.pc") CONFIG_FILES="$CONFIG_FILES libpcre16.pc" ;;
-    "libpcre32.pc") CONFIG_FILES="$CONFIG_FILES libpcre32.pc" ;;
-    "libpcreposix.pc") CONFIG_FILES="$CONFIG_FILES libpcreposix.pc" ;;
-    "libpcrecpp.pc") CONFIG_FILES="$CONFIG_FILES libpcrecpp.pc" ;;
-    "pcre-config") CONFIG_FILES="$CONFIG_FILES pcre-config" ;;
-    "pcre.h") CONFIG_FILES="$CONFIG_FILES pcre.h" ;;
-    "pcre_stringpiece.h") CONFIG_FILES="$CONFIG_FILES pcre_stringpiece.h" ;;
-    "pcrecpparg.h") CONFIG_FILES="$CONFIG_FILES pcrecpparg.h" ;;
+    "libpcre2-8.pc") CONFIG_FILES="$CONFIG_FILES libpcre2-8.pc" ;;
+    "libpcre2-16.pc") CONFIG_FILES="$CONFIG_FILES libpcre2-16.pc" ;;
+    "libpcre2-32.pc") CONFIG_FILES="$CONFIG_FILES libpcre2-32.pc" ;;
+    "libpcre2-posix.pc") CONFIG_FILES="$CONFIG_FILES libpcre2-posix.pc" ;;
+    "pcre2-config") CONFIG_FILES="$CONFIG_FILES pcre2-config" ;;
+    "src/pcre2.h") CONFIG_FILES="$CONFIG_FILES src/pcre2.h" ;;
     "script-chmod") CONFIG_COMMANDS="$CONFIG_COMMANDS script-chmod" ;;
     "delete-old-chartables") CONFIG_COMMANDS="$CONFIG_COMMANDS delete-old-chartables" ;;
 
@@ -22045,7 +17660,7 @@
 
 
 # The names of the tagged configurations supported by this script.
-available_tags='CXX '
+available_tags=''
 
 # Configured defaults for sys_lib_dlsearch_path munging.
 : \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"}
@@ -22453,20 +18068,6 @@
 # How to hardcode a shared library path into an executable.
 hardcode_action=$hardcode_action
 
-# The directories searched by this compiler when creating a shared library.
-compiler_lib_search_dirs=$lt_compiler_lib_search_dirs
-
-# Dependencies to place before and after the objects being linked to
-# create a shared library.
-predep_objects=$lt_predep_objects
-postdep_objects=$lt_postdep_objects
-predeps=$lt_predeps
-postdeps=$lt_postdeps
-
-# The library search path used internally by the compiler when linking
-# a shared library.
-compiler_lib_search_path=$lt_compiler_lib_search_path
-
 # ### END LIBTOOL CONFIG
 
 _LT_EOF
@@ -22559,162 +18160,9 @@
     (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
   chmod +x "$ofile"
 
-
-    cat <<_LT_EOF >> "$ofile"
-
-# ### BEGIN LIBTOOL TAG CONFIG: CXX
-
-# The linker used to build libraries.
-LD=$lt_LD_CXX
-
-# How to create reloadable object files.
-reload_flag=$lt_reload_flag_CXX
-reload_cmds=$lt_reload_cmds_CXX
-
-# Commands used to build an old-style archive.
-old_archive_cmds=$lt_old_archive_cmds_CXX
-
-# A language specific compiler.
-CC=$lt_compiler_CXX
-
-# Is the compiler the GNU compiler?
-with_gcc=$GCC_CXX
-
-# Compiler flag to turn off builtin functions.
-no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX
-
-# Additional compiler flags for building library objects.
-pic_flag=$lt_lt_prog_compiler_pic_CXX
-
-# How to pass a linker flag through the compiler.
-wl=$lt_lt_prog_compiler_wl_CXX
-
-# Compiler flag to prevent dynamic linking.
-link_static_flag=$lt_lt_prog_compiler_static_CXX
-
-# Does compiler simultaneously support -c and -o options?
-compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX
-
-# Whether or not to add -lc for building shared libraries.
-build_libtool_need_lc=$archive_cmds_need_lc_CXX
-
-# Whether or not to disallow shared libs when runtime libs are static.
-allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX
-
-# Compiler flag to allow reflexive dlopens.
-export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX
-
-# Compiler flag to generate shared objects directly from archives.
-whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX
-
-# Whether the compiler copes with passing no objects directly.
-compiler_needs_object=$lt_compiler_needs_object_CXX
-
-# Create an old-style archive from a shared archive.
-old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX
-
-# Create a temporary old-style archive to link instead of a shared archive.
-old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX
-
-# Commands used to build a shared archive.
-archive_cmds=$lt_archive_cmds_CXX
-archive_expsym_cmds=$lt_archive_expsym_cmds_CXX
-
-# Commands used to build a loadable module if different from building
-# a shared archive.
-module_cmds=$lt_module_cmds_CXX
-module_expsym_cmds=$lt_module_expsym_cmds_CXX
-
-# Whether we are building with GNU ld or not.
-with_gnu_ld=$lt_with_gnu_ld_CXX
-
-# Flag that allows shared libraries with undefined symbols to be built.
-allow_undefined_flag=$lt_allow_undefined_flag_CXX
-
-# Flag that enforces no undefined symbols.
-no_undefined_flag=$lt_no_undefined_flag_CXX
-
-# Flag to hardcode \$libdir into a binary during linking.
-# This must work even if \$libdir does not exist
-hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX
-
-# Whether we need a single "-rpath" flag with a separated argument.
-hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX
-
-# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
-# DIR into the resulting binary.
-hardcode_direct=$hardcode_direct_CXX
-
-# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
-# DIR into the resulting binary and the resulting library dependency is
-# "absolute",i.e impossible to change by setting \$shlibpath_var if the
-# library is relocated.
-hardcode_direct_absolute=$hardcode_direct_absolute_CXX
-
-# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
-# into the resulting binary.
-hardcode_minus_L=$hardcode_minus_L_CXX
-
-# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
-# into the resulting binary.
-hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX
-
-# Set to "yes" if building a shared library automatically hardcodes DIR
-# into the library and all subsequent libraries and executables linked
-# against it.
-hardcode_automatic=$hardcode_automatic_CXX
-
-# Set to yes if linker adds runtime paths of dependent libraries
-# to runtime path list.
-inherit_rpath=$inherit_rpath_CXX
-
-# Whether libtool must link a program against all its dependency libraries.
-link_all_deplibs=$link_all_deplibs_CXX
-
-# Set to "yes" if exported symbols are required.
-always_export_symbols=$always_export_symbols_CXX
-
-# The commands to list exported symbols.
-export_symbols_cmds=$lt_export_symbols_cmds_CXX
-
-# Symbols that should not be listed in the preloaded symbols.
-exclude_expsyms=$lt_exclude_expsyms_CXX
-
-# Symbols that must always be exported.
-include_expsyms=$lt_include_expsyms_CXX
-
-# Commands necessary for linking programs (against libraries) with templates.
-prelink_cmds=$lt_prelink_cmds_CXX
-
-# Commands necessary for finishing linking programs.
-postlink_cmds=$lt_postlink_cmds_CXX
-
-# Specify filename containing input files.
-file_list_spec=$lt_file_list_spec_CXX
-
-# How to hardcode a shared library path into an executable.
-hardcode_action=$hardcode_action_CXX
-
-# The directories searched by this compiler when creating a shared library.
-compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX
-
-# Dependencies to place before and after the objects being linked to
-# create a shared library.
-predep_objects=$lt_predep_objects_CXX
-postdep_objects=$lt_postdep_objects_CXX
-predeps=$lt_predeps_CXX
-postdeps=$lt_postdeps_CXX
-
-# The library search path used internally by the compiler when linking
-# a shared library.
-compiler_lib_search_path=$lt_compiler_lib_search_path_CXX
-
-# ### END LIBTOOL TAG CONFIG: CXX
-_LT_EOF
-
  ;;
-    "script-chmod":C) chmod a+x pcre-config ;;
-    "delete-old-chartables":C) rm -f pcre_chartables.c ;;
+    "script-chmod":C) chmod a+x pcre2-config ;;
+    "delete-old-chartables":C) rm -f pcre2_chartables.c ;;
 
   esac
 done # for ac_tag
@@ -22771,41 +18219,37 @@
     Install prefix .................. : ${prefix}
     C preprocessor .................. : ${CPP}
     C compiler ...................... : ${CC}
-    C++ preprocessor ................ : ${CXXCPP}
-    C++ compiler .................... : ${CXX}
     Linker .......................... : ${LD}
     C preprocessor flags ............ : ${CPPFLAGS}
     C compiler flags ................ : ${CFLAGS} ${VISIBILITY_CFLAGS}
-    C++ compiler flags .............. : ${CXXFLAGS} ${VISIBILITY_CXXFLAGS}
     Linker flags .................... : ${LDFLAGS}
     Extra libraries ................. : ${LIBS}
 
-    Build 8 bit pcre library ........ : ${enable_pcre8}
-    Build 16 bit pcre library ....... : ${enable_pcre16}
-    Build 32 bit pcre library ....... : ${enable_pcre32}
-    Build C++ library ............... : ${enable_cpp}
+    Build 8-bit pcre2 library ....... : ${enable_pcre2_8}
+    Build 16-bit pcre2 library ...... : ${enable_pcre2_16}
+    Build 32-bit pcre2 library ...... : ${enable_pcre2_32}
+    Include debugging code .......... : ${enable_debug}
     Enable JIT compiling support .... : ${enable_jit}
-    Enable UTF-8/16/32 support ...... : ${enable_utf}
-    Unicode properties .............. : ${enable_unicode_properties}
+    Enable Unicode support .......... : ${enable_unicode}
     Newline char/sequence ........... : ${enable_newline}
     \R matches only ANYCRLF ......... : ${enable_bsr_anycrlf}
+    \C is disabled .................. : ${enable_never_backslash_C}
     EBCDIC coding ................... : ${enable_ebcdic}
     EBCDIC code for NL .............. : ${ebcdic_nl_code}
     Rebuild char tables ............. : ${enable_rebuild_chartables}
     Use stack recursion ............. : ${enable_stack_for_recursion}
-    POSIX mem threshold ............. : ${with_posix_malloc_threshold}
     Internal link size .............. : ${with_link_size}
     Nested parentheses limit ........ : ${with_parens_nest_limit}
     Match limit ..................... : ${with_match_limit}
     Match limit recursion ........... : ${with_match_limit_recursion}
     Build shared libs ............... : ${enable_shared}
     Build static libs ............... : ${enable_static}
-    Use JIT in pcregrep ............. : ${enable_pcregrep_jit}
-    Buffer size for pcregrep ........ : ${with_pcregrep_bufsize}
-    Link pcregrep with libz ......... : ${enable_pcregrep_libz}
-    Link pcregrep with libbz2 ....... : ${enable_pcregrep_libbz2}
-    Link pcretest with libedit ...... : ${enable_pcretest_libedit}
-    Link pcretest with libreadline .. : ${enable_pcretest_libreadline}
+    Use JIT in pcre2grep ............ : ${enable_pcre2grep_jit}
+    Buffer size for pcre2grep ....... : ${with_pcre2grep_bufsize}
+    Link pcre2grep with libz ........ : ${enable_pcre2grep_libz}
+    Link pcre2grep with libbz2 ...... : ${enable_pcre2grep_libbz2}
+    Link pcre2test with libedit ..... : ${enable_pcre2test_libedit}
+    Link pcre2test with libreadline . : ${enable_pcre2test_libreadline}
     Valgrind support ................ : ${enable_valgrind}
     Code coverage ................... : ${enable_coverage}
 
diff --git a/dist2/configure.ac b/dist2/configure.ac
new file mode 100644
index 0000000..99ad8a9
--- /dev/null
+++ b/dist2/configure.ac
@@ -0,0 +1,921 @@
+dnl Process this file with autoconf to produce a configure script.
+
+dnl NOTE FOR MAINTAINERS: Do not use minor version numbers 08 or 09 because
+dnl the leading zeros may cause them to be treated as invalid octal constants
+dnl if a PCRE2 user writes code that uses PCRE2_MINOR as a number. There is now
+dnl a check further down that throws an error if 08 or 09 are used.
+
+dnl The PCRE2_PRERELEASE feature is for identifying release candidates. It might
+dnl be defined as -RC2, for example. For real releases, it should be empty.
+
+m4_define(pcre2_major, [10])
+m4_define(pcre2_minor, [21])
+m4_define(pcre2_prerelease, [])
+m4_define(pcre2_date, [2016-01-12])
+
+# NOTE: The CMakeLists.txt file searches for the above variables in the first
+# 50 lines of this file. Please update that if the variables above are moved.
+
+# Libtool shared library interface versions (current:revision:age)
+m4_define(libpcre2_8_version,     [3:0:3])
+m4_define(libpcre2_16_version,    [3:0:3])
+m4_define(libpcre2_32_version,    [3:0:3])
+m4_define(libpcre2_posix_version, [0:1:0])
+
+AC_PREREQ(2.57)
+AC_INIT(PCRE2, pcre2_major.pcre2_minor[]pcre2_prerelease, , pcre2)
+AC_CONFIG_SRCDIR([src/pcre2.h.in])
+AM_INIT_AUTOMAKE([dist-bzip2 dist-zip])
+m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
+AC_CONFIG_HEADERS(src/config.h)
+
+# This is a new thing required to stop a warning from automake 1.12
+m4_ifdef([AM_PROG_AR], [AM_PROG_AR])
+
+# This was added at the suggestion of libtoolize (03-Jan-10)
+AC_CONFIG_MACRO_DIR([m4])
+
+# The default CFLAGS in Autoconf are "-g -O2" for gcc and just "-g" for any
+# other compiler. There doesn't seem to be a standard way of getting rid of the
+# -g (which I don't think is needed for a production library). This fudge seems
+# to achieve the necessary. First, we remember the externally set values of
+# CFLAGS. Then call the AC_PROG_CC macro to find the compiler - if CFLAGS is
+# not set, it will be set to Autoconf's defaults. Afterwards, if the original
+# values were not set, remove the -g from the Autoconf defaults.
+
+remember_set_CFLAGS="$CFLAGS"
+
+AC_PROG_CC
+AM_PROG_CC_C_O
+
+if test "x$remember_set_CFLAGS" = "x"
+then
+  if test "$CFLAGS" = "-g -O2"
+  then
+    CFLAGS="-O2"
+  elif test "$CFLAGS" = "-g"
+  then
+    CFLAGS=""
+  fi
+fi
+
+# Check for a 64-bit integer type
+AC_TYPE_INT64_T
+
+AC_PROG_INSTALL
+AC_LIBTOOL_WIN32_DLL
+LT_INIT
+AC_PROG_LN_S
+
+# Check for GCC visibility feature
+
+PCRE2_VISIBILITY
+
+# Versioning
+
+PCRE2_MAJOR="pcre2_major"
+PCRE2_MINOR="pcre2_minor"
+PCRE2_PRERELEASE="pcre2_prerelease"
+PCRE2_DATE="pcre2_date"
+
+if test "$PCRE2_MINOR" = "08" -o "$PCRE2_MINOR" = "09"
+then
+  echo "***"
+  echo "*** Minor version number $PCRE2_MINOR must not be used. ***"
+  echo "*** Use only 00 to 07 or 10 onwards, to avoid octal issues. ***"
+  echo "***"
+  exit 1
+fi
+
+AC_SUBST(PCRE2_MAJOR)
+AC_SUBST(PCRE2_MINOR)
+AC_SUBST(PCRE2_PRERELEASE)
+AC_SUBST(PCRE2_DATE)
+
+# Set a more sensible default value for $(htmldir).
+if test "x$htmldir" = 'x${docdir}'
+then
+  htmldir='${docdir}/html'
+fi
+
+# Force an error for PCRE1 size options
+AC_ARG_ENABLE(pcre8,,,enable_pcre8=no)
+AC_ARG_ENABLE(pcre16,,,enable_pcre16=no)
+AC_ARG_ENABLE(pcre32,,,enable_pcre32=no)
+
+if test "$enable_pcre8$enable_pcre16$enable_pcre32" != "nonono"
+then
+  echo "** ERROR: Use --[[en|dis]]able-pcre2-[[8|16|32]], not --[[en|dis]]able-pcre[[8|16|32]]"
+  exit 1
+fi
+
+# Handle --disable-pcre2-8 (enabled by default)
+AC_ARG_ENABLE(pcre2-8,
+              AS_HELP_STRING([--disable-pcre2-8],
+                             [disable 8 bit character support]),
+              , enable_pcre2_8=unset)
+AC_SUBST(enable_pcre2_8)
+
+# Handle --enable-pcre2-16 (disabled by default)
+AC_ARG_ENABLE(pcre2-16,
+              AS_HELP_STRING([--enable-pcre2-16],
+                             [enable 16 bit character support]),
+              , enable_pcre2_16=unset)
+AC_SUBST(enable_pcre2_16)
+
+# Handle --enable-pcre2-32 (disabled by default)
+AC_ARG_ENABLE(pcre2-32,
+              AS_HELP_STRING([--enable-pcre2-32],
+                             [enable 32 bit character support]),
+              , enable_pcre2_32=unset)
+AC_SUBST(enable_pcre2_32)
+
+# Handle --dnable-debug (disabled by default)
+AC_ARG_ENABLE(debug,
+              AS_HELP_STRING([--enable-debug],
+                             [enable debugging code]),
+              , enable_debug=no)
+
+# Handle --enable-jit (disabled by default)
+AC_ARG_ENABLE(jit,
+              AS_HELP_STRING([--enable-jit],
+                             [enable Just-In-Time compiling support]),
+              , enable_jit=no)
+
+# Handle --disable-pcre2grep-jit (enabled by default)
+AC_ARG_ENABLE(pcre2grep-jit,
+              AS_HELP_STRING([--disable-pcre2grep-jit],
+                             [disable JIT support in pcre2grep]),
+              , enable_pcre2grep_jit=yes)
+
+# Handle --enable-rebuild-chartables
+AC_ARG_ENABLE(rebuild-chartables,
+              AS_HELP_STRING([--enable-rebuild-chartables],
+                             [rebuild character tables in current locale]),
+              , enable_rebuild_chartables=no)
+
+# Handle --disable-unicode (enabled by default)
+AC_ARG_ENABLE(unicode,
+              AS_HELP_STRING([--disable-unicode],
+                             [disable Unicode support]),
+              , enable_unicode=unset)
+
+# Handle newline options
+ac_pcre2_newline=lf
+AC_ARG_ENABLE(newline-is-cr,
+              AS_HELP_STRING([--enable-newline-is-cr],
+                             [use CR as newline character]),
+              ac_pcre2_newline=cr)
+AC_ARG_ENABLE(newline-is-lf,
+              AS_HELP_STRING([--enable-newline-is-lf],
+                             [use LF as newline character (default)]),
+              ac_pcre2_newline=lf)
+AC_ARG_ENABLE(newline-is-crlf,
+              AS_HELP_STRING([--enable-newline-is-crlf],
+                             [use CRLF as newline sequence]),
+              ac_pcre2_newline=crlf)
+AC_ARG_ENABLE(newline-is-anycrlf,
+              AS_HELP_STRING([--enable-newline-is-anycrlf],
+                             [use CR, LF, or CRLF as newline sequence]),
+              ac_pcre2_newline=anycrlf)
+AC_ARG_ENABLE(newline-is-any,
+              AS_HELP_STRING([--enable-newline-is-any],
+                             [use any valid Unicode newline sequence]),
+              ac_pcre2_newline=any)
+enable_newline="$ac_pcre2_newline"
+
+# Handle --enable-bsr-anycrlf
+AC_ARG_ENABLE(bsr-anycrlf,
+              AS_HELP_STRING([--enable-bsr-anycrlf],
+                             [\R matches only CR, LF, CRLF by default]),
+              , enable_bsr_anycrlf=no)
+
+# Handle --enable-never-backslash-C
+AC_ARG_ENABLE(never-backslash-C,
+              AS_HELP_STRING([--enable-never-backslash-C],
+                             [use of \C causes an error]),
+              , enable_never_backslash_C=no)
+
+# Handle --enable-ebcdic
+AC_ARG_ENABLE(ebcdic,
+              AS_HELP_STRING([--enable-ebcdic],
+                             [assume EBCDIC coding rather than ASCII; incompatible with --enable-utf; use only in (uncommon) EBCDIC environments; it implies --enable-rebuild-chartables]),
+              , enable_ebcdic=no)
+
+# Handle --enable-ebcdic-nl25
+AC_ARG_ENABLE(ebcdic-nl25,
+              AS_HELP_STRING([--enable-ebcdic-nl25],
+                             [set EBCDIC code for NL to 0x25 instead of 0x15; it implies --enable-ebcdic]),
+              , enable_ebcdic_nl25=no)
+
+# Handle --disable-stack-for-recursion
+AC_ARG_ENABLE(stack-for-recursion,
+              AS_HELP_STRING([--disable-stack-for-recursion],
+                             [don't use stack recursion when matching]),
+              , enable_stack_for_recursion=yes)
+
+# Handle --enable-pcre2grep-libz
+AC_ARG_ENABLE(pcre2grep-libz,
+              AS_HELP_STRING([--enable-pcre2grep-libz],
+                             [link pcre2grep with libz to handle .gz files]),
+              , enable_pcre2grep_libz=no)
+
+# Handle --enable-pcre2grep-libbz2
+AC_ARG_ENABLE(pcre2grep-libbz2,
+              AS_HELP_STRING([--enable-pcre2grep-libbz2],
+                             [link pcre2grep with libbz2 to handle .bz2 files]),
+              , enable_pcre2grep_libbz2=no)
+
+# Handle --with-pcre2grep-bufsize=N
+AC_ARG_WITH(pcre2grep-bufsize,
+              AS_HELP_STRING([--with-pcre2grep-bufsize=N],
+                             [pcre2grep buffer size (default=20480, minimum=8192)]),
+              , with_pcre2grep_bufsize=20480)
+
+# Handle --enable-pcre2test-libedit
+AC_ARG_ENABLE(pcre2test-libedit,
+              AS_HELP_STRING([--enable-pcre2test-libedit],
+                             [link pcre2test with libedit]),
+              , enable_pcre2test_libedit=no)
+
+# Handle --enable-pcre2test-libreadline
+AC_ARG_ENABLE(pcre2test-libreadline,
+              AS_HELP_STRING([--enable-pcre2test-libreadline],
+                             [link pcre2test with libreadline]),
+              , enable_pcre2test_libreadline=no)
+
+# Handle --with-link-size=N
+AC_ARG_WITH(link-size,
+            AS_HELP_STRING([--with-link-size=N],
+                           [internal link size (2, 3, or 4 allowed; default=2)]),
+            , with_link_size=2)
+
+# Handle --with-parens-nest-limit=N
+AC_ARG_WITH(parens-nest-limit,
+            AS_HELP_STRING([--with-parens-nest-limit=N],
+                           [nested parentheses limit (default=250)]),
+            , with_parens_nest_limit=250)
+
+# Handle --with-match-limit=N
+AC_ARG_WITH(match-limit,
+            AS_HELP_STRING([--with-match-limit=N],
+                           [default limit on internal looping (default=10000000)]),
+            , with_match_limit=10000000)
+
+# Handle --with-match-limit_recursion=N
+#
+# Note: In config.h, the default is to define MATCH_LIMIT_RECURSION
+# symbolically as MATCH_LIMIT, which in turn is defined to be some numeric
+# value (e.g. 10000000). MATCH_LIMIT_RECURSION can otherwise be set to some
+# different numeric value (or even the same numeric value as MATCH_LIMIT,
+# though no longer defined in terms of the latter).
+#
+AC_ARG_WITH(match-limit-recursion,
+            AS_HELP_STRING([--with-match-limit-recursion=N],
+                           [default limit on internal recursion (default=MATCH_LIMIT)]),
+            , with_match_limit_recursion=MATCH_LIMIT)
+
+# Handle --enable-valgrind
+AC_ARG_ENABLE(valgrind,
+              AS_HELP_STRING([--enable-valgrind],
+                             [valgrind support]),
+              , enable_valgrind=no)
+
+# Enable code coverage reports using gcov
+AC_ARG_ENABLE(coverage,
+              AS_HELP_STRING([--enable-coverage],
+                             [enable code coverage reports using gcov]),
+              , enable_coverage=no)
+
+# Set the default value for pcre2-8
+if test "x$enable_pcre2_8" = "xunset"
+then
+  enable_pcre2_8=yes
+fi
+
+# Set the default value for pcre2-16
+if test "x$enable_pcre2_16" = "xunset"
+then
+  enable_pcre2_16=no
+fi
+
+# Set the default value for pcre2-32
+if test "x$enable_pcre2_32" = "xunset"
+then
+  enable_pcre2_32=no
+fi
+
+# Make sure at least one library is selected
+if test "x$enable_pcre2_8$enable_pcre2_16$enable_pcre2_32" = "xnonono"
+then
+  AC_MSG_ERROR([At least one of the 8, 16 or 32 bit libraries must be enabled])
+fi
+
+# Unicode is enabled by default.
+if test "x$enable_unicode" = "xunset"
+then
+  enable_unicode=yes
+fi
+
+# Convert the newline identifier into the appropriate integer value. These must
+# agree with the PCRE2_NEWLINE_xxx values in pcre2.h.
+
+case "$enable_newline" in
+  cr)      ac_pcre2_newline_value=1 ;;
+  lf)      ac_pcre2_newline_value=2 ;;
+  crlf)    ac_pcre2_newline_value=3 ;;
+  any)     ac_pcre2_newline_value=4 ;;
+  anycrlf) ac_pcre2_newline_value=5 ;;
+  *)
+  AC_MSG_ERROR([invalid argument \"$enable_newline\" to --enable-newline option])
+  ;;
+esac
+
+# --enable-ebcdic-nl25 implies --enable-ebcdic
+if test "x$enable_ebcdic_nl25" = "xyes"; then
+  enable_ebcdic=yes
+fi
+
+# Make sure that if enable_ebcdic is set, rebuild_chartables is also enabled.
+# Also check that UTF support is not requested, because PCRE2 cannot handle
+# EBCDIC and UTF in the same build. To do so it would need to use different
+# character constants depending on the mode. Also, EBCDIC cannot be used with
+# 16-bit and 32-bit libraries.
+#
+if test "x$enable_ebcdic" = "xyes"; then
+  enable_rebuild_chartables=yes
+  if test "x$enable_unicode" = "xyes"; then
+    AC_MSG_ERROR([support for EBCDIC and Unicode cannot be enabled at the same time])
+  fi
+  if test "x$enable_pcre2_16" = "xyes" -o "x$enable_pcre2_32" = "xyes"; then
+    AC_MSG_ERROR([EBCDIC support is available only for the 8-bit library])
+  fi
+fi
+
+# Check argument to --with-link-size
+case "$with_link_size" in
+  2|3|4) ;;
+  *)
+  AC_MSG_ERROR([invalid argument \"$with_link_size\" to --with-link-size option])
+  ;;
+esac
+
+AH_TOP([
+/* PCRE2 is written in Standard C, but there are a few non-standard things it
+can cope with, allowing it to run on SunOS4 and other "close to standard"
+systems.
+
+In environments that support the GNU autotools, config.h.in is converted into
+config.h by the "configure" script. In environments that use CMake,
+config-cmake.in is converted into config.h. If you are going to build PCRE2 "by
+hand" without using "configure" or CMake, you should copy the distributed
+config.h.generic to config.h, and edit the macro definitions to be the way you
+need them. You must then add -DHAVE_CONFIG_H to all of your compile commands,
+so that config.h is included at the start of every source.
+
+Alternatively, you can avoid editing by using -D on the compiler command line
+to set the macro values. In this case, you do not have to set -DHAVE_CONFIG_H,
+but if you do, default values will be taken from config.h for non-boolean
+macros that are not defined on the command line.
+
+Boolean macros such as HAVE_STDLIB_H and SUPPORT_PCRE2_8 should either be defined
+(conventionally to 1) for TRUE, and not defined at all for FALSE. All such
+macros are listed as a commented #undef in config.h.generic. Macros such as
+MATCH_LIMIT, whose actual value is relevant, have defaults defined, but are
+surrounded by #ifndef/#endif lines so that the value can be overridden by -D.
+
+PCRE2 uses memmove() if HAVE_MEMMOVE is defined; otherwise it uses bcopy() if
+HAVE_BCOPY is defined. If your system has neither bcopy() nor memmove(), make
+sure both macros are undefined; an emulation function will then be used. */])
+
+# Checks for header files.
+AC_HEADER_STDC
+AC_CHECK_HEADERS(limits.h sys/types.h sys/stat.h dirent.h)
+AC_CHECK_HEADERS([windows.h], [HAVE_WINDOWS_H=1])
+
+# Conditional compilation
+AM_CONDITIONAL(WITH_PCRE2_8, test "x$enable_pcre2_8" = "xyes")
+AM_CONDITIONAL(WITH_PCRE2_16, test "x$enable_pcre2_16" = "xyes")
+AM_CONDITIONAL(WITH_PCRE2_32, test "x$enable_pcre2_32" = "xyes")
+AM_CONDITIONAL(WITH_DEBUG, test "x$enable_debug" = "xyes")
+AM_CONDITIONAL(WITH_REBUILD_CHARTABLES, test "x$enable_rebuild_chartables" = "xyes")
+AM_CONDITIONAL(WITH_JIT, test "x$enable_jit" = "xyes")
+AM_CONDITIONAL(WITH_UNICODE, test "x$enable_unicode" = "xyes")
+AM_CONDITIONAL(WITH_VALGRIND, test "x$enable_valgrind" = "xyes")
+
+# Checks for typedefs, structures, and compiler characteristics.
+
+AC_C_CONST
+AC_TYPE_SIZE_T
+
+# Checks for library functions.
+
+AC_CHECK_FUNCS(bcopy memmove strerror)
+
+# Check for the availability of libz (aka zlib)
+
+AC_CHECK_HEADERS([zlib.h], [HAVE_ZLIB_H=1])
+AC_CHECK_LIB([z], [gzopen], [HAVE_LIBZ=1])
+
+# Check for the availability of libbz2. Originally we just used AC_CHECK_LIB,
+# as for libz. However, this had the following problem, diagnosed and fixed by
+# a user:
+#
+#   - libbz2 uses the Pascal calling convention (WINAPI) for the functions
+#     under Win32.
+#   - The standard autoconf AC_CHECK_LIB fails to include "bzlib.h",
+#     therefore missing the function definition.
+#   - The compiler thus generates a "C" signature for the test function.
+#   - The linker fails to find the "C" function.
+#   - PCRE2 fails to configure if asked to do so against libbz2.
+#
+# Solution:
+#
+#   - Replace the AC_CHECK_LIB test with a custom test.
+
+AC_CHECK_HEADERS([bzlib.h], [HAVE_BZLIB_H=1])
+# Original test
+# AC_CHECK_LIB([bz2], [BZ2_bzopen], [HAVE_LIBBZ2=1])
+#
+# Custom test follows
+
+AC_MSG_CHECKING([for libbz2])
+OLD_LIBS="$LIBS"
+LIBS="$LIBS -lbz2"
+AC_LINK_IFELSE([AC_LANG_PROGRAM([[
+#ifdef HAVE_BZLIB_H
+#include <bzlib.h>
+#endif]],
+[[return (int)BZ2_bzopen("conftest", "rb");]])],
+[AC_MSG_RESULT([yes]);HAVE_LIBBZ2=1; break;],
+AC_MSG_RESULT([no]))
+LIBS="$OLD_LIBS"
+
+# Check for the availabiity of libreadline
+
+if test "$enable_pcre2test_libreadline" = "yes"; then
+ AC_CHECK_HEADERS([readline/readline.h], [HAVE_READLINE_H=1])
+ AC_CHECK_HEADERS([readline/history.h], [HAVE_HISTORY_H=1])
+ AC_CHECK_LIB([readline], [readline], [LIBREADLINE="-lreadline"],
+   [unset ac_cv_lib_readline_readline;
+    AC_CHECK_LIB([readline], [readline], [LIBREADLINE="-ltinfo"],
+     [unset ac_cv_lib_readline_readline;
+      AC_CHECK_LIB([readline], [readline], [LIBREADLINE="-lcurses"],
+       [unset ac_cv_lib_readline_readline;
+        AC_CHECK_LIB([readline], [readline], [LIBREADLINE="-lncurses"],
+         [unset ac_cv_lib_readline_readline;
+	  AC_CHECK_LIB([readline], [readline], [LIBREADLINE="-lncursesw"],
+           [unset ac_cv_lib_readline_readline;
+	    AC_CHECK_LIB([readline], [readline], [LIBREADLINE="-ltermcap"],
+             [LIBREADLINE=""],
+             [-ltermcap])],
+           [-lncursesw])],
+         [-lncurses])],
+       [-lcurses])],
+     [-ltinfo])])
+ AC_SUBST(LIBREADLINE)
+ if test -n "$LIBREADLINE"; then
+   if test "$LIBREADLINE" != "-lreadline"; then
+     echo "-lreadline needs $LIBREADLINE"
+     LIBREADLINE="-lreadline $LIBREADLINE"
+   fi
+ fi
+fi
+
+
+# Check for the availability of libedit. Different distributions put its
+# headers in different places. Try to cover the most common ones.
+
+if test "$enable_pcre2test_libedit" = "yes"; then
+  AC_CHECK_HEADERS([editline/readline.h], [HAVE_EDITLINE_READLINE_H=1],
+    [AC_CHECK_HEADERS([edit/readline/readline.h], [HAVE_READLINE_READLINE_H=1],
+      [AC_CHECK_HEADERS([readline/readline.h], [HAVE_READLINE_READLINE_H=1])])])
+  AC_CHECK_LIB([edit], [readline], [LIBEDIT="-ledit"])
+fi
+
+# This facilitates -ansi builds under Linux
+dnl AC_DEFINE([_GNU_SOURCE], [], [Enable GNU extensions in glibc])
+
+PCRE2_STATIC_CFLAG=""
+if test "x$enable_shared" = "xno" ; then
+  AC_DEFINE([PCRE2_STATIC], [1], [
+    Define to any value if linking statically (TODO: make nice with Libtool)])
+  PCRE2_STATIC_CFLAG="-DPCRE2_STATIC"
+fi
+AC_SUBST(PCRE2_STATIC_CFLAG)
+
+# Here is where PCRE2-specific defines are handled
+
+if test "$enable_pcre2_8" = "yes"; then
+  AC_DEFINE([SUPPORT_PCRE2_8], [], [
+    Define to any value to enable the 8 bit PCRE2 library.])
+fi
+
+if test "$enable_pcre2_16" = "yes"; then
+  AC_DEFINE([SUPPORT_PCRE2_16], [], [
+    Define to any value to enable the 16 bit PCRE2 library.])
+fi
+
+if test "$enable_pcre2_32" = "yes"; then
+  AC_DEFINE([SUPPORT_PCRE2_32], [], [
+    Define to any value to enable the 32 bit PCRE2 library.])
+fi
+
+if test "$enable_debug" = "yes"; then
+  AC_DEFINE([PCRE2_DEBUG], [], [
+    Define to any value to include debugging code.])
+fi
+
+# Unless running under Windows, JIT support requires pthreads.
+
+if test "$enable_jit" = "yes"; then
+  if test "$HAVE_WINDOWS_H" != "1"; then
+    AX_PTHREAD([], [AC_MSG_ERROR([JIT support requires pthreads])])
+    CC="$PTHREAD_CC"
+    CFLAGS="$PTHREAD_CFLAGS $CFLAGS"
+    LIBS="$PTHREAD_LIBS $LIBS"
+  fi
+  AC_DEFINE([SUPPORT_JIT], [], [
+    Define to any value to enable support for Just-In-Time compiling.])
+else
+  enable_pcre2grep_jit="no"
+fi
+
+if test "$enable_pcre2grep_jit" = "yes"; then
+  AC_DEFINE([SUPPORT_PCRE2GREP_JIT], [], [
+    Define to any value to enable JIT support in pcre2grep.])
+fi
+
+if test "$enable_unicode" = "yes"; then
+  AC_DEFINE([SUPPORT_UNICODE], [], [
+    Define to any value to enable support for Unicode and UTF encoding.
+    This will work even in an EBCDIC environment, but it is incompatible
+    with the EBCDIC macro. That is, PCRE2 can support *either* EBCDIC
+    code *or* ASCII/Unicode, but not both at once.])
+fi
+
+if test "$enable_stack_for_recursion" = "no"; then
+  AC_DEFINE([HEAP_MATCH_RECURSE], [], [
+    PCRE2 uses recursive function calls to handle backtracking while
+    matching. This can sometimes be a problem on systems that have
+    stacks of limited size. Define HEAP_MATCH_RECURSE to any value to get a
+    version that doesn't use recursion in the match() function; instead
+    it creates its own stack by steam using memory from the heap. For more
+    detail, see the comments and other stuff just above the match() function.])
+fi
+
+if test "$enable_pcre2grep_libz" = "yes"; then
+  AC_DEFINE([SUPPORT_LIBZ], [], [
+    Define to any value to allow pcre2grep to be linked with libz, so that it is
+    able to handle .gz files.])
+fi
+
+if test "$enable_pcre2grep_libbz2" = "yes"; then
+  AC_DEFINE([SUPPORT_LIBBZ2], [], [
+    Define to any value to allow pcre2grep to be linked with libbz2, so that it
+    is able to handle .bz2 files.])
+fi
+
+if test $with_pcre2grep_bufsize -lt 8192 ; then
+  AC_MSG_WARN([$with_pcre2grep_bufsize is too small for --with-pcre2grep-bufsize; using 8192])
+  with_pcre2grep_bufsize="8192"
+else
+  if test $? -gt 1 ; then
+  AC_MSG_ERROR([Bad value for  --with-pcre2grep-bufsize])
+  fi
+fi
+
+AC_DEFINE_UNQUOTED([PCRE2GREP_BUFSIZE], [$with_pcre2grep_bufsize], [
+  The value of PCRE2GREP_BUFSIZE determines the size of buffer used by pcre2grep
+  to hold parts of the file it is searching. This is also the minimum value.
+  The actual amount of memory used by pcre2grep is three times this number,
+  because it allows for the buffering of "before" and "after" lines.])
+
+if test "$enable_pcre2test_libedit" = "yes"; then
+  AC_DEFINE([SUPPORT_LIBEDIT], [], [
+    Define to any value to allow pcre2test to be linked with libedit.])
+  LIBREADLINE="$LIBEDIT"
+elif test "$enable_pcre2test_libreadline" = "yes"; then
+  AC_DEFINE([SUPPORT_LIBREADLINE], [], [
+    Define to any value to allow pcre2test to be linked with libreadline.])
+fi
+
+AC_DEFINE_UNQUOTED([NEWLINE_DEFAULT], [$ac_pcre2_newline_value], [
+  The value of NEWLINE_DEFAULT determines the default newline character
+  sequence. PCRE2 client programs can override this by selecting other values
+  at run time. The valid values are 1 (CR), 2 (LF), 3 (CRLF), 4 (ANY),
+  and 5 (ANYCRLF).])
+
+if test "$enable_bsr_anycrlf" = "yes"; then
+  AC_DEFINE([BSR_ANYCRLF], [], [
+    By default, the \R escape sequence matches any Unicode line ending
+    character or sequence of characters. If BSR_ANYCRLF is defined (to any
+    value), this is changed so that backslash-R matches only CR, LF, or CRLF.
+    The build-time default can be overridden by the user of PCRE2 at runtime.])
+fi
+
+if test "$enable_never_backslash_C" = "yes"; then
+  AC_DEFINE([NEVER_BACKSLASH_C], [], [
+    Defining NEVER_BACKSLASH_C locks out the use of \C in all patterns.])
+fi
+
+AC_DEFINE_UNQUOTED([LINK_SIZE], [$with_link_size], [
+  The value of LINK_SIZE determines the number of bytes used to store
+  links as offsets within the compiled regex. The default is 2, which
+  allows for compiled patterns up to 64K long. This covers the vast
+  majority of cases. However, PCRE2 can also be compiled to use 3 or 4
+  bytes instead. This allows for longer patterns in extreme cases.])
+
+AC_DEFINE_UNQUOTED([PARENS_NEST_LIMIT], [$with_parens_nest_limit], [
+  The value of PARENS_NEST_LIMIT specifies the maximum depth of nested
+  parentheses (of any kind) in a pattern. This limits the amount of system
+  stack that is used while compiling a pattern.])
+
+AC_DEFINE_UNQUOTED([MATCH_LIMIT], [$with_match_limit], [
+  The value of MATCH_LIMIT determines the default number of times the
+  internal match() function can be called during a single execution of
+  pcre2_match(). There is a runtime interface for setting a different
+  limit. The limit exists in order to catch runaway regular
+  expressions that take for ever to determine that they do not match.
+  The default is set very large so that it does not accidentally catch
+  legitimate cases.])
+
+AC_DEFINE_UNQUOTED([MATCH_LIMIT_RECURSION], [$with_match_limit_recursion], [
+  The above limit applies to all calls of match(), whether or not they
+  increase the recursion depth. In some environments it is desirable
+  to limit the depth of recursive calls of match() more strictly, in
+  order to restrict the maximum amount of stack (or heap, if
+  HEAP_MATCH_RECURSE is defined) that is used. The value of
+  MATCH_LIMIT_RECURSION applies only to recursive calls of match(). To
+  have any useful effect, it must be less than the value of
+  MATCH_LIMIT. The default is to use the same value as MATCH_LIMIT.
+  There is a runtime method for setting a different limit.])
+
+AC_DEFINE([MAX_NAME_SIZE], [32], [
+  This limit is parameterized just in case anybody ever wants to
+  change it. Care must be taken if it is increased, because it guards
+  against integer overflow caused by enormously large patterns.])
+
+AC_DEFINE([MAX_NAME_COUNT], [10000], [
+  This limit is parameterized just in case anybody ever wants to
+  change it. Care must be taken if it is increased, because it guards
+  against integer overflow caused by enormously large patterns.])
+
+AH_VERBATIM([PCRE2_EXP_DEFN], [
+/* If you are compiling for a system other than a Unix-like system or
+   Win32, and it needs some magic to be inserted before the definition
+   of a function that is exported by the library, define this macro to
+   contain the relevant magic. If you do not define this macro, a suitable
+    __declspec value is used for Windows systems; in other environments
+   "extern" is used for a C compiler and "extern C" for a C++ compiler.
+   This macro apears at the start of every exported function that is part
+   of the external API. It does not appear on functions that are "external"
+   in the C sense, but which are internal to the library. */
+#undef PCRE2_EXP_DEFN])
+
+if test "$enable_ebcdic" = "yes"; then
+  AC_DEFINE_UNQUOTED([EBCDIC], [], [
+    If you are compiling for a system that uses EBCDIC instead of ASCII
+    character codes, define this macro to any value. When EBCDIC is set, PCRE2
+    assumes that all input strings are in EBCDIC. If you do not define this
+    macro, PCRE2 will assume input strings are ASCII or UTF-8/16/32 Unicode. It
+    is not possible to build a version of PCRE2 that supports both EBCDIC and
+    UTF-8/16/32.])
+fi
+
+if test "$enable_ebcdic_nl25" = "yes"; then
+  AC_DEFINE_UNQUOTED([EBCDIC_NL25], [], [
+    In an EBCDIC environment, define this macro to any value to arrange for
+    the NL character to be 0x25 instead of the default 0x15. NL plays the role
+    that LF does in an ASCII/Unicode environment.])
+fi
+
+if test "$enable_valgrind" = "yes"; then
+  AC_DEFINE_UNQUOTED([SUPPORT_VALGRIND], [], [
+     Define to any value for valgrind support to find invalid memory reads.])
+fi
+
+# Platform specific issues
+NO_UNDEFINED=
+EXPORT_ALL_SYMBOLS=
+case $host_os in
+  cygwin* | mingw* )
+    if test X"$enable_shared" = Xyes; then
+      NO_UNDEFINED="-no-undefined"
+      EXPORT_ALL_SYMBOLS="-Wl,--export-all-symbols"
+    fi
+    ;;
+esac
+
+# The extra LDFLAGS for each particular library. The libpcre2*_version values
+# are m4 variables, assigned above.
+
+EXTRA_LIBPCRE2_8_LDFLAGS="$EXTRA_LIBPCRE2_8_LDFLAGS \
+  $NO_UNDEFINED -version-info libpcre2_8_version"
+
+EXTRA_LIBPCRE2_16_LDFLAGS="$EXTRA_LIBPCRE2_16_LDFLAGS \
+  $NO_UNDEFINED -version-info libpcre2_16_version"
+
+EXTRA_LIBPCRE2_32_LDFLAGS="$EXTRA_LIBPCRE2_32_LDFLAGS \
+  $NO_UNDEFINED -version-info libpcre2_32_version"
+
+EXTRA_LIBPCRE2_POSIX_LDFLAGS="$EXTRA_LIBPCRE2_POSIX_LDFLAGS \
+  $NO_UNDEFINED -version-info libpcre2_posix_version"
+
+AC_SUBST(EXTRA_LIBPCRE2_8_LDFLAGS)
+AC_SUBST(EXTRA_LIBPCRE2_16_LDFLAGS)
+AC_SUBST(EXTRA_LIBPCRE2_32_LDFLAGS)
+AC_SUBST(EXTRA_LIBPCRE2_POSIX_LDFLAGS)
+
+# When we run 'make distcheck', use these arguments. Turning off compiler
+# optimization makes it run faster.
+DISTCHECK_CONFIGURE_FLAGS="CFLAGS='' CXXFLAGS='' --enable-pcre2-16 --enable-pcre2-32 --enable-jit --enable-utf"
+AC_SUBST(DISTCHECK_CONFIGURE_FLAGS)
+
+# Check that, if --enable-pcre2grep-libz or --enable-pcre2grep-libbz2 is
+# specified, the relevant library is available.
+
+if test "$enable_pcre2grep_libz" = "yes"; then
+  if test "$HAVE_ZLIB_H" != "1"; then
+    echo "** Cannot --enable-pcre2grep-libz because zlib.h was not found"
+    exit 1
+  fi
+  if test "$HAVE_LIBZ" != "1"; then
+    echo "** Cannot --enable-pcre2grep-libz because libz was not found"
+    exit 1
+  fi
+  LIBZ="-lz"
+fi
+AC_SUBST(LIBZ)
+
+if test "$enable_pcre2grep_libbz2" = "yes"; then
+  if test "$HAVE_BZLIB_H" != "1"; then
+    echo "** Cannot --enable-pcre2grep-libbz2 because bzlib.h was not found"
+    exit 1
+  fi
+  if test "$HAVE_LIBBZ2" != "1"; then
+    echo "** Cannot --enable-pcre2grep-libbz2 because libbz2 was not found"
+    exit 1
+  fi
+  LIBBZ2="-lbz2"
+fi
+AC_SUBST(LIBBZ2)
+
+# Similarly for --enable-pcre2test-readline
+
+if test "$enable_pcre2test_libedit" = "yes"; then
+  if test "$enable_pcre2test_libreadline" = "yes"; then
+    echo "** Cannot use both --enable-pcre2test-libedit and --enable-pcre2test-readline"
+    exit 1
+  fi
+  if test "$HAVE_EDITLINE_READLINE_H" != "1" -a \
+          "$HAVE_READLINE_READLINE_H" != "1"; then
+    echo "** Cannot --enable-pcre2test-libedit because neither editline/readline.h"
+    echo "** nor readline/readline.h was found."
+    exit 1
+  fi
+  if test -z "$LIBEDIT"; then
+    echo "** Cannot --enable-pcre2test-libedit because libedit library was not found."
+    exit 1
+  fi
+fi
+
+if test "$enable_pcre2test_libreadline" = "yes"; then
+  if test "$HAVE_READLINE_H" != "1"; then
+    echo "** Cannot --enable-pcre2test-readline because readline/readline.h was not found."
+    exit 1
+  fi
+  if test "$HAVE_HISTORY_H" != "1"; then
+    echo "** Cannot --enable-pcre2test-readline because readline/history.h was not found."
+    exit 1
+  fi
+  if test -z "$LIBREADLINE"; then
+    echo "** Cannot --enable-pcre2test-readline because readline library was not found."
+    exit 1
+  fi
+fi
+
+# Handle valgrind support
+
+if test "$enable_valgrind" = "yes"; then
+  m4_ifdef([PKG_CHECK_MODULES],
+           [PKG_CHECK_MODULES([VALGRIND],[valgrind])],
+           [AC_MSG_ERROR([pkg-config not supported])])
+fi
+
+# Handle code coverage reporting support
+if test "$enable_coverage" = "yes"; then
+  if test "x$GCC" != "xyes"; then
+    AC_MSG_ERROR([Code coverage reports can only be generated when using GCC])
+  fi
+
+  # ccache is incompatible with gcov
+  AC_PATH_PROG([SHTOOL],[shtool],[false])
+  case `$SHTOOL path $CC` in
+    *ccache*) cc_ccache=yes;;
+    *) cc_ccache=no;;
+  esac
+
+  if test "$cc_ccache" = "yes"; then
+    if test -z "$CCACHE_DISABLE" -o "$CCACHE_DISABLE" != "1"; then
+      AC_MSG_ERROR([must export CCACHE_DISABLE=1 to disable ccache for code coverage])
+    fi
+  fi
+
+  AC_ARG_VAR([LCOV],[the ltp lcov program])
+  AC_PATH_PROG([LCOV],[lcov],[false])
+  if test "x$LCOV" = "xfalse"; then
+    AC_MSG_ERROR([lcov not found])
+  fi
+
+  AC_ARG_VAR([GENHTML],[the ltp genhtml program])
+  AC_PATH_PROG([GENHTML],[genhtml],[false])
+  if test "x$GENHTML" = "xfalse"; then
+    AC_MSG_ERROR([genhtml not found])
+  fi
+
+  # Set flags needed for gcov
+  GCOV_CFLAGS="-O0 -ggdb3 -fprofile-arcs -ftest-coverage"
+  GCOV_CXXFLAGS="-O0 -ggdb3 -fprofile-arcs -ftest-coverage"
+  GCOV_LIBS="-lgcov"
+  AC_SUBST([GCOV_CFLAGS])
+  AC_SUBST([GCOV_CXXFLAGS])
+  AC_SUBST([GCOV_LIBS])
+fi # enable_coverage
+
+AM_CONDITIONAL([WITH_GCOV],[test "x$enable_coverage" = "xyes"])
+
+# Produce these files, in addition to config.h.
+AC_CONFIG_FILES(
+	Makefile
+	libpcre2-8.pc
+	libpcre2-16.pc
+	libpcre2-32.pc
+	libpcre2-posix.pc
+	pcre2-config
+	src/pcre2.h
+)
+
+# Make the generated script files executable.
+AC_CONFIG_COMMANDS([script-chmod], [chmod a+x pcre2-config])
+
+# Make sure that pcre2_chartables.c is removed in case the method for
+# creating it was changed by reconfiguration.
+AC_CONFIG_COMMANDS([delete-old-chartables], [rm -f pcre2_chartables.c])
+
+AC_OUTPUT
+
+# Print out a nice little message after configure is run displaying the
+# chosen options.
+
+ebcdic_nl_code=n/a
+if test "$enable_ebcdic_nl25" = "yes"; then
+  ebcdic_nl_code=0x25
+elif test "$enable_ebcdic" = "yes"; then
+  ebcdic_nl_code=0x15
+fi
+
+cat <<EOF
+
+$PACKAGE-$VERSION configuration summary:
+
+    Install prefix .................. : ${prefix}
+    C preprocessor .................. : ${CPP}
+    C compiler ...................... : ${CC}
+    Linker .......................... : ${LD}
+    C preprocessor flags ............ : ${CPPFLAGS}
+    C compiler flags ................ : ${CFLAGS} ${VISIBILITY_CFLAGS}
+    Linker flags .................... : ${LDFLAGS}
+    Extra libraries ................. : ${LIBS}
+
+    Build 8-bit pcre2 library ....... : ${enable_pcre2_8}
+    Build 16-bit pcre2 library ...... : ${enable_pcre2_16}
+    Build 32-bit pcre2 library ...... : ${enable_pcre2_32}
+    Include debugging code .......... : ${enable_debug}
+    Enable JIT compiling support .... : ${enable_jit}
+    Enable Unicode support .......... : ${enable_unicode}
+    Newline char/sequence ........... : ${enable_newline}
+    \R matches only ANYCRLF ......... : ${enable_bsr_anycrlf}
+    \C is disabled .................. : ${enable_never_backslash_C}
+    EBCDIC coding ................... : ${enable_ebcdic}
+    EBCDIC code for NL .............. : ${ebcdic_nl_code}
+    Rebuild char tables ............. : ${enable_rebuild_chartables}
+    Use stack recursion ............. : ${enable_stack_for_recursion}
+    Internal link size .............. : ${with_link_size}
+    Nested parentheses limit ........ : ${with_parens_nest_limit}
+    Match limit ..................... : ${with_match_limit}
+    Match limit recursion ........... : ${with_match_limit_recursion}
+    Build shared libs ............... : ${enable_shared}
+    Build static libs ............... : ${enable_static}
+    Use JIT in pcre2grep ............ : ${enable_pcre2grep_jit}
+    Buffer size for pcre2grep ....... : ${with_pcre2grep_bufsize}
+    Link pcre2grep with libz ........ : ${enable_pcre2grep_libz}
+    Link pcre2grep with libbz2 ...... : ${enable_pcre2grep_libbz2}
+    Link pcre2test with libedit ..... : ${enable_pcre2test_libedit}
+    Link pcre2test with libreadline . : ${enable_pcre2test_libreadline}
+    Valgrind support ................ : ${enable_valgrind}
+    Code coverage ................... : ${enable_coverage}
+
+EOF
+
+dnl end configure.ac
diff --git a/dist/depcomp b/dist2/depcomp
similarity index 100%
rename from dist/depcomp
rename to dist2/depcomp
diff --git a/dist2/doc/html/NON-AUTOTOOLS-BUILD.txt b/dist2/doc/html/NON-AUTOTOOLS-BUILD.txt
new file mode 100644
index 0000000..ceb9245
--- /dev/null
+++ b/dist2/doc/html/NON-AUTOTOOLS-BUILD.txt
@@ -0,0 +1,392 @@
+Building PCRE2 without using autotools
+--------------------------------------
+
+This document has been converted from the PCRE1 document. I have removed a
+number of sections about building in various environments, as they applied only
+to PCRE1 and are probably out of date.
+
+This document contains the following sections:
+
+  General
+  Generic instructions for the PCRE2 C library
+  Stack size in Windows environments
+  Linking programs in Windows environments
+  Calling conventions in Windows environments
+  Comments about Win32 builds
+  Building PCRE2 on Windows with CMake
+  Testing with RunTest.bat
+  Building PCRE2 on native z/OS and z/VM
+
+
+GENERAL
+
+The basic PCRE2 library consists entirely of code written in Standard C, and so
+should compile successfully on any system that has a Standard C compiler and
+library.
+
+The PCRE2 distribution includes a "configure" file for use by the
+configure/make (autotools) build system, as found in many Unix-like
+environments. The README file contains information about the options for
+"configure".
+
+There is also support for CMake, which some users prefer, especially in Windows
+environments, though it can also be run in Unix-like environments. See the
+section entitled "Building PCRE2 on Windows with CMake" below.
+
+Versions of src/config.h and src/pcre2.h are distributed in the PCRE2 tarballs
+under the names src/config.h.generic and src/pcre2.h.generic. These are
+provided for those who build PCRE2 without using "configure" or CMake. If you
+use "configure" or CMake, the .generic versions are not used.
+
+
+GENERIC INSTRUCTIONS FOR THE PCRE2 C LIBRARY
+
+The following are generic instructions for building the PCRE2 C library "by
+hand". If you are going to use CMake, this section does not apply to you; you
+can skip ahead to the CMake section.
+
+ (1) Copy or rename the file src/config.h.generic as src/config.h, and edit the
+     macro settings that it contains to whatever is appropriate for your
+     environment. In particular, you can alter the definition of the NEWLINE
+     macro to specify what character(s) you want to be interpreted as line
+     terminators.
+
+     When you compile any of the PCRE2 modules, you must specify
+     -DHAVE_CONFIG_H to your compiler so that src/config.h is included in the
+     sources.
+
+     An alternative approach is not to edit src/config.h, but to use -D on the
+     compiler command line to make any changes that you need to the
+     configuration options. In this case -DHAVE_CONFIG_H must not be set.
+
+     NOTE: There have been occasions when the way in which certain parameters
+     in src/config.h are used has changed between releases. (In the
+     configure/make world, this is handled automatically.) When upgrading to a
+     new release, you are strongly advised to review src/config.h.generic
+     before re-using what you had previously.
+
+ (2) Copy or rename the file src/pcre2.h.generic as src/pcre2.h.
+
+ (3) EITHER:
+       Copy or rename file src/pcre2_chartables.c.dist as
+       src/pcre2_chartables.c.
+
+     OR:
+       Compile src/dftables.c as a stand-alone program (using -DHAVE_CONFIG_H
+       if you have set up src/config.h), and then run it with the single
+       argument "src/pcre2_chartables.c". This generates a set of standard
+       character tables and writes them to that file. The tables are generated
+       using the default C locale for your system. If you want to use a locale
+       that is specified by LC_xxx environment variables, add the -L option to
+       the dftables command. You must use this method if you are building on a
+       system that uses EBCDIC code.
+
+     The tables in src/pcre2_chartables.c are defaults. The caller of PCRE2 can
+     specify alternative tables at run time.
+
+ (4) For an 8-bit library, compile the following source files from the src
+     directory, setting -DPCRE2_CODE_UNIT_WIDTH=8 as a compiler option. Also
+     set -DHAVE_CONFIG_H if you have set up src/config.h with your
+     configuration, or else use other -D settings to change the configuration
+     as required.
+
+       pcre2_auto_possess.c
+       pcre2_chartables.c
+       pcre2_compile.c
+       pcre2_config.c
+       pcre2_context.c
+       pcre2_dfa_match.c
+       pcre2_error.c
+       pcre2_find_bracket.c
+       pcre2_jit_compile.c
+       pcre2_maketables.c
+       pcre2_match.c
+       pcre2_match_data.c
+       pcre2_newline.c
+       pcre2_ord2utf.c
+       pcre2_pattern_info.c
+       pcre2_serialize.c
+       pcre2_string_utils.c
+       pcre2_study.c
+       pcre2_substitute.c
+       pcre2_substring.c
+       pcre2_tables.c
+       pcre2_ucd.c
+       pcre2_valid_utf.c
+       pcre2_xclass.c
+
+     Make sure that you include -I. in the compiler command (or equivalent for
+     an unusual compiler) so that all included PCRE2 header files are first
+     sought in the src directory under the current directory. Otherwise you run
+     the risk of picking up a previously-installed file from somewhere else.
+
+     Note that you must compile pcre2_jit_compile.c, even if you have not
+     defined SUPPORT_JIT in src/config.h, because when JIT support is not
+     configured, dummy functions are compiled. When JIT support IS configured,
+     pcre2_compile.c #includes other files from the sljit subdirectory, where
+     there should be 16 files, all of whose names begin with "sljit". It also
+     #includes src/pcre2_jit_match.c and src/pcre2_jit_misc.c, so you should
+     not compile these yourself.
+
+ (5) Now link all the compiled code into an object library in whichever form
+     your system keeps such libraries. This is the basic PCRE2 C 8-bit library.
+     If your system has static and shared libraries, you may have to do this
+     once for each type.
+
+ (6) If you want to build a 16-bit library or 32-bit library (as well as, or
+     instead of the 8-bit library) just supply 16 or 32 as the value of
+     -DPCRE2_CODE_UNIT_WIDTH when you are compiling.
+
+ (7) If you want to build the POSIX wrapper functions (which apply only to the
+     8-bit library), ensure that you have the src/pcre2posix.h file and then
+     compile src/pcre2posix.c. Link the result (on its own) as the pcre2posix
+     library.
+
+ (8) The pcre2test program can be linked with any combination of the 8-bit,
+     16-bit and 32-bit libraries (depending on what you selected in
+     src/config.h). Compile src/pcre2test.c; don't forget -DHAVE_CONFIG_H if
+     necessary, but do NOT define PCRE2_CODE_UNIT_WIDTH. Then link with the
+     appropriate library/ies. If you compiled an 8-bit library, pcre2test also
+     needs the pcre2posix wrapper library.
+
+ (9) Run pcre2test on the testinput files in the testdata directory, and check
+     that the output matches the corresponding testoutput files. There are
+     comments about what each test does in the section entitled "Testing PCRE2"
+     in the README file. If you compiled more than one of the 8-bit, 16-bit and
+     32-bit libraries, you need to run pcre2test with the -16 option to do
+     16-bit tests and with the -32 option to do 32-bit tests.
+
+     Some tests are relevant only when certain build-time options are selected.
+     For example, test 4 is for Unicode support, and will not run if you have
+     built PCRE2 without it. See the comments at the start of each testinput
+     file. If you have a suitable Unix-like shell, the RunTest script will run
+     the appropriate tests for you. The command "RunTest list" will output a
+     list of all the tests.
+
+     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.
+
+(10) If you have built PCRE2 with SUPPORT_JIT, the JIT features can be tested
+     by running pcre2test with the -jit option. This is done automatically by
+     the RunTest script. You might also like to build and run the freestanding
+     JIT test program, src/pcre2_jit_test.c.
+
+(11) If you want to use the pcre2grep command, compile and link
+     src/pcre2grep.c; it uses only the basic 8-bit PCRE2 library (it does not
+     need the pcre2posix library).
+
+
+STACK SIZE IN WINDOWS ENVIRONMENTS
+
+The default processor stack size of 1Mb in some Windows environments is too
+small for matching patterns that need much recursion. In particular, test 2 may
+fail because of this. Normally, running out of stack causes a crash, but there
+have been cases where the test program has just died silently. See your linker
+documentation for how to increase stack size if you experience problems. If you
+are using CMake (see "BUILDING PCRE2 ON WINDOWS WITH CMAKE" below) and the gcc
+compiler, you can increase the stack size for pcre2test and pcre2grep by
+setting the CMAKE_EXE_LINKER_FLAGS variable to "-Wl,--stack,8388608" (for
+example). The Linux default of 8Mb is a reasonable choice for the stack, though
+even that can be too small for some pattern/subject combinations.
+
+PCRE2 has a compile configuration option to disable the use of stack for
+recursion so that heap is used instead. However, pattern matching is
+significantly slower when this is done. There is more about stack usage in the
+"pcre2stack" documentation.
+
+
+LINKING PROGRAMS IN WINDOWS ENVIRONMENTS
+
+If you want to statically link a program against a PCRE2 library in the form of
+a non-dll .a file, you must define PCRE2_STATIC before including src/pcre2.h.
+
+
+CALLING CONVENTIONS IN WINDOWS ENVIRONMENTS
+
+It is possible to compile programs to use different calling conventions using
+MSVC. Search the web for "calling conventions" for more information. To make it
+easier to change the calling convention for the exported functions in the
+PCRE2 library, the macro PCRE2_CALL_CONVENTION is present in all the external
+definitions. It can be set externally when compiling (e.g. in CFLAGS). If it is
+not set, it defaults to empty; the default calling convention is then used
+(which is what is wanted most of the time).
+
+
+COMMENTS ABOUT WIN32 BUILDS (see also "BUILDING PCRE2 ON WINDOWS WITH CMAKE")
+
+There are two ways of building PCRE2 using the "configure, make, make install"
+paradigm on Windows systems: using MinGW or using Cygwin. These are not at all
+the same thing; they are completely different from each other. There is also
+support for building using CMake, which some users find a more straightforward
+way of building PCRE2 under Windows.
+
+The MinGW home page (http://www.mingw.org/) says this:
+
+  MinGW: A collection of freely available and freely distributable Windows
+  specific header files and import libraries combined with GNU toolsets that
+  allow one to produce native Windows programs that do not rely on any
+  3rd-party C runtime DLLs.
+
+The Cygwin home page (http://www.cygwin.com/) says this:
+
+  Cygwin is a Linux-like environment for Windows. It consists of two parts:
+
+  . A DLL (cygwin1.dll) which acts as a Linux API emulation layer providing
+    substantial Linux API functionality
+
+  . A collection of tools which provide Linux look and feel.
+
+On both MinGW and Cygwin, PCRE2 should build correctly using:
+
+  ./configure && make && make install
+
+This should create two libraries called libpcre2-8 and libpcre2-posix. These
+are independent libraries: when you link with libpcre2-posix you must also link
+with libpcre2-8, which contains the basic functions.
+
+Using Cygwin's compiler generates libraries and executables that depend on
+cygwin1.dll. If a library that is generated this way is distributed,
+cygwin1.dll has to be distributed as well. Since cygwin1.dll is under the GPL
+licence, this forces not only PCRE2 to be under the GPL, but also the entire
+application. A distributor who wants to keep their own code proprietary must
+purchase an appropriate Cygwin licence.
+
+MinGW has no such restrictions. The MinGW compiler generates a library or
+executable that can run standalone on Windows without any third party dll or
+licensing issues.
+
+But there is more complication:
+
+If a Cygwin user uses the -mno-cygwin Cygwin gcc flag, what that really does is
+to tell Cygwin's gcc to use the MinGW gcc. Cygwin's gcc is only acting as a
+front end to MinGW's gcc (if you install Cygwin's gcc, you get both Cygwin's
+gcc and MinGW's gcc). So, a user can:
+
+. Build native binaries by using MinGW or by getting Cygwin and using
+  -mno-cygwin.
+
+. Build binaries that depend on cygwin1.dll by using Cygwin with the normal
+  compiler flags.
+
+The test files that are supplied with PCRE2 are in UNIX format, with LF
+characters as line terminators. Unless your PCRE2 library uses a default
+newline option that includes LF as a valid newline, it may be necessary to
+change the line terminators in the test files to get some of the tests to work.
+
+
+BUILDING PCRE2 ON WINDOWS WITH CMAKE
+
+CMake is an alternative configuration facility that can be used instead of
+"configure". CMake creates project files (make files, solution files, etc.)
+tailored to numerous development environments, including Visual Studio,
+Borland, Msys, MinGW, NMake, and Unix. If possible, use short paths with no
+spaces in the names for your CMake installation and your PCRE2 source and build
+directories.
+
+The following instructions were contributed by a PCRE1 user, but they should
+also work for PCRE2. If they are not followed exactly, errors may occur. In the
+event that errors do occur, it is recommended that you delete the CMake cache
+before attempting to repeat the CMake build process. In the CMake GUI, the
+cache can be deleted by selecting "File > Delete Cache".
+
+1.  Install the latest CMake version available from http://www.cmake.org/, and
+    ensure that cmake\bin is on your path.
+
+2.  Unzip (retaining folder structure) the PCRE2 source tree into a source
+    directory such as C:\pcre2. You should ensure your local date and time
+    is not earlier than the file dates in your source dir if the release is
+    very new.
+
+3.  Create a new, empty build directory, preferably a subdirectory of the
+    source dir. For example, C:\pcre2\pcre2-xx\build.
+
+4.  Run cmake-gui from the Shell envirornment of your build tool, for example,
+    Msys for Msys/MinGW or Visual Studio Command Prompt for VC/VC++. Do not try
+    to start Cmake from the Windows Start menu, as this can lead to errors.
+
+5.  Enter C:\pcre2\pcre2-xx and C:\pcre2\pcre2-xx\build for the source and
+    build directories, respectively.
+
+6.  Hit the "Configure" button.
+
+7.  Select the particular IDE / build tool that you are using (Visual
+    Studio, MSYS makefiles, MinGW makefiles, etc.)
+
+8.  The GUI will then list several configuration options. This is where
+    you can disable Unicode support or select other PCRE2 optional features.
+
+9.  Hit "Configure" again. The adjacent "Generate" button should now be
+    active.
+
+10. Hit "Generate".
+
+11. The build directory should now contain a usable build system, be it a
+    solution file for Visual Studio, makefiles for MinGW, etc. Exit from
+    cmake-gui and use the generated build system with your compiler or IDE.
+    E.g., for MinGW you can run "make", or for Visual Studio, open the PCRE2
+    solution, select the desired configuration (Debug, or Release, etc.) and
+    build the ALL_BUILD project.
+
+12. If during configuration with cmake-gui you've elected to build the test
+    programs, you can execute them by building the test project. E.g., for
+    MinGW: "make test"; for Visual Studio build the RUN_TESTS project. The
+    most recent build configuration is targeted by the tests. A summary of
+    test results is presented. Complete test output is subsequently
+    available for review in Testing\Temporary under your build dir.
+
+
+TESTING WITH RUNTEST.BAT
+
+If configured with CMake, building the test project ("make test" or building
+ALL_TESTS in Visual Studio) creates (and runs) pcre2_test.bat (and depending
+on your configuration options, possibly other test programs) in the build
+directory. The pcre2_test.bat script runs RunTest.bat with correct source and
+exe paths.
+
+For manual testing with RunTest.bat, provided the build dir is a subdirectory
+of the source directory: Open command shell window. Chdir to the location
+of your pcre2test.exe and pcre2grep.exe programs. Call RunTest.bat with
+"..\RunTest.Bat" or "..\..\RunTest.bat" as appropriate.
+
+To run only a particular test with RunTest.Bat provide a test number argument.
+
+Otherwise:
+
+1. Copy RunTest.bat into the directory where pcre2test.exe and pcre2grep.exe
+   have been created.
+
+2. Edit RunTest.bat to indentify the full or relative location of
+   the pcre2 source (wherein which the testdata folder resides), e.g.:
+
+   set srcdir=C:\pcre2\pcre2-10.00
+
+3. In a Windows command environment, chdir to the location of your bat and
+   exe programs.
+
+4. Run RunTest.bat. Test outputs will automatically be compared to expected
+   results, and discrepancies will be identified in the console output.
+
+To independently test the just-in-time compiler, run pcre2_jit_test.exe.
+
+
+BUILDING PCRE2 ON NATIVE Z/OS AND Z/VM
+
+z/OS and z/VM are operating systems for mainframe computers, produced by IBM.
+The character code used is EBCDIC, not ASCII or Unicode. In z/OS, UNIX APIs and
+applications can be supported through UNIX System Services, and in such an
+environment PCRE2 can be built in the same way as in other systems. However, in
+native z/OS (without UNIX System Services) and in z/VM, special ports are
+required. For details, please see this web site:
+
+  http://www.zaconsultants.net
+
+The site currently has ports for PCRE1 releases, but PCRE2 should follow in due
+course.
+
+You may also download PCRE1 from WWW.CBTTAPE.ORG, file 882. Everything, source
+and executable, is in EBCDIC and native z/OS file formats and this is the
+recommended download site.
+
+=============================
+Last Updated: 16 July 2015
diff --git a/dist2/doc/html/README.txt b/dist2/doc/html/README.txt
new file mode 100644
index 0000000..48d2ffd
--- /dev/null
+++ b/dist2/doc/html/README.txt
@@ -0,0 +1,843 @@
+README file for PCRE2 (Perl-compatible regular expression library)
+------------------------------------------------------------------
+
+PCRE2 is a re-working of the original PCRE library to provide an entirely new
+API. The latest release of PCRE2 is always available in three alternative
+formats from:
+
+  ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre2-xxx.tar.gz
+  ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre2-xxx.tar.bz2
+  ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre2-xxx.zip
+
+There is a mailing list for discussion about the development of PCRE (both the
+original and new APIs) at pcre-dev@exim.org. You can access the archives and
+subscribe or manage your subscription here:
+
+   https://lists.exim.org/mailman/listinfo/pcre-dev
+
+Please read the NEWS file if you are upgrading from a previous release.
+The contents of this README file are:
+
+  The PCRE2 APIs
+  Documentation for PCRE2
+  Contributions by users of PCRE2
+  Building PCRE2 on non-Unix-like systems
+  Building PCRE2 without using autotools
+  Building PCRE2 using autotools
+  Retrieving configuration information
+  Shared libraries
+  Cross-compiling using autotools
+  Making new tarballs
+  Testing PCRE2
+  Character tables
+  File manifest
+
+
+The PCRE2 APIs
+--------------
+
+PCRE2 is written in C, and it has its own API. There are three sets of
+functions, one for the 8-bit library, which processes strings of bytes, one for
+the 16-bit library, which processes strings of 16-bit values, and one for the
+32-bit library, which processes strings of 32-bit values. There are no C++
+wrappers.
+
+The distribution does contain a set of C wrapper functions for the 8-bit
+library that are based on the POSIX regular expression API (see the pcre2posix
+man page). These can be found in a library called libpcre2posix. Note that this
+just provides a POSIX calling interface to PCRE2; the regular expressions
+themselves still follow Perl syntax and semantics. The POSIX API is restricted,
+and does not give full access to all of PCRE2's facilities.
+
+The header file for the POSIX-style functions is called pcre2posix.h. The
+official POSIX name is regex.h, but I did not want to risk possible problems
+with existing files of that name by distributing it that way. To use PCRE2 with
+an existing program that uses the POSIX API, pcre2posix.h will have to be
+renamed or pointed at by a link.
+
+If you are using the POSIX interface to PCRE2 and there is already a POSIX
+regex library installed on your system, as well as worrying about the regex.h
+header file (as mentioned above), you must also take care when linking programs
+to ensure that they link with PCRE2's libpcre2posix library. Otherwise they may
+pick up the POSIX functions of the same name from the other library.
+
+One way of avoiding this confusion is to compile PCRE2 with the addition of
+-Dregcomp=PCRE2regcomp (and similarly for the other POSIX functions) to the
+compiler flags (CFLAGS if you are using "configure" -- see below). This has the
+effect of renaming the functions so that the names no longer clash. Of course,
+you have to do the same thing for your applications, or write them using the
+new names.
+
+
+Documentation for PCRE2
+-----------------------
+
+If you install PCRE2 in the normal way on a Unix-like system, you will end up
+with a set of man pages whose names all start with "pcre2". The one that is
+just called "pcre2" lists all the others. In addition to these man pages, the
+PCRE2 documentation is supplied in two other forms:
+
+  1. There are files called doc/pcre2.txt, doc/pcre2grep.txt, and
+     doc/pcre2test.txt in the source distribution. The first of these is a
+     concatenation of the text forms of all the section 3 man pages except the
+     listing of pcre2demo.c and those that summarize individual functions. The
+     other two are the text forms of the section 1 man pages for the pcre2grep
+     and pcre2test commands. These text forms are provided for ease of scanning
+     with text editors or similar tools. They are installed in
+     <prefix>/share/doc/pcre2, where <prefix> is the installation prefix
+     (defaulting to /usr/local).
+
+  2. A set of files containing all the documentation in HTML form, hyperlinked
+     in various ways, and rooted in a file called index.html, is distributed in
+     doc/html and installed in <prefix>/share/doc/pcre2/html.
+
+
+Building PCRE2 on non-Unix-like systems
+---------------------------------------
+
+For a non-Unix-like system, please read the comments in the file
+NON-AUTOTOOLS-BUILD, though if your system supports the use of "configure" and
+"make" you may be able to build PCRE2 using autotools in the same way as for
+many Unix-like systems.
+
+PCRE2 can also be configured using CMake, which can be run in various ways
+(command line, GUI, etc). This creates Makefiles, solution files, etc. The file
+NON-AUTOTOOLS-BUILD has information about CMake.
+
+PCRE2 has been compiled on many different operating systems. It should be
+straightforward to build PCRE2 on any system that has a Standard C compiler and
+library, because it uses only Standard C functions.
+
+
+Building PCRE2 without using autotools
+--------------------------------------
+
+The use of autotools (in particular, libtool) is problematic in some
+environments, even some that are Unix or Unix-like. See the NON-AUTOTOOLS-BUILD
+file for ways of building PCRE2 without using autotools.
+
+
+Building PCRE2 using autotools
+------------------------------
+
+The following instructions assume the use of the widely used "configure; make;
+make install" (autotools) process.
+
+To build PCRE2 on system that supports autotools, first run the "configure"
+command from the PCRE2 distribution directory, with your current directory set
+to the directory where you want the files to be created. This command is a
+standard GNU "autoconf" configuration script, for which generic instructions
+are supplied in the file INSTALL.
+
+Most commonly, people build PCRE2 within its own distribution directory, and in
+this case, on many systems, just running "./configure" is sufficient. However,
+the usual methods of changing standard defaults are available. For example:
+
+CFLAGS='-O2 -Wall' ./configure --prefix=/opt/local
+
+This command specifies that the C compiler should be run with the flags '-O2
+-Wall' instead of the default, and that "make install" should install PCRE2
+under /opt/local instead of the default /usr/local.
+
+If you want to build in a different directory, just run "configure" with that
+directory as current. For example, suppose you have unpacked the PCRE2 source
+into /source/pcre2/pcre2-xxx, but you want to build it in
+/build/pcre2/pcre2-xxx:
+
+cd /build/pcre2/pcre2-xxx
+/source/pcre2/pcre2-xxx/configure
+
+PCRE2 is written in C and is normally compiled as a C library. However, it is
+possible to build it as a C++ library, though the provided building apparatus
+does not have any features to support this.
+
+There are some optional features that can be included or omitted from the PCRE2
+library. They are also documented in the pcre2build man page.
+
+. By default, both shared and static libraries are built. You can change this
+  by adding one of these options to the "configure" command:
+
+  --disable-shared
+  --disable-static
+
+  (See also "Shared libraries on Unix-like systems" below.)
+
+. By default, only the 8-bit library is built. If you add --enable-pcre2-16 to
+  the "configure" command, the 16-bit library is also built. If you add
+  --enable-pcre2-32 to the "configure" command, the 32-bit library is also
+  built. If you want only the 16-bit or 32-bit library, use --disable-pcre2-8
+  to disable building the 8-bit library.
+
+. If you want to include support for just-in-time compiling, which can give
+  large performance improvements on certain platforms, add --enable-jit to the
+  "configure" command. This support is available only for certain hardware
+  architectures. If you try to enable it on an unsupported architecture, there
+  will be a compile time error.
+
+. When JIT support is enabled, pcre2grep automatically makes use of it, unless
+  you add --disable-pcre2grep-jit to the "configure" command.
+
+. If you do not want to make use of the support for UTF-8 Unicode character
+  strings in the 8-bit library, UTF-16 Unicode character strings in the 16-bit
+  library, or UTF-32 Unicode character strings in the 32-bit library, you can
+  add --disable-unicode to the "configure" command. This reduces the size of
+  the libraries. It is not possible to configure one library with Unicode
+  support, and another without, in the same configuration.
+
+  When Unicode support is available, the use of a UTF encoding still has to be
+  enabled by setting the PCRE2_UTF option at run time or starting a pattern
+  with (*UTF). When PCRE2 is compiled with Unicode support, its input can only
+  either be ASCII or UTF-8/16/32, even when running on EBCDIC platforms. It is
+  not possible to use both --enable-unicode and --enable-ebcdic at the same
+  time.
+
+  As well as supporting UTF strings, Unicode support includes support for the
+  \P, \p, and \X sequences that recognize Unicode character properties.
+  However, only the basic two-letter properties such as Lu are supported.
+  Escape sequences such as \d and \w in patterns do not by default make use of
+  Unicode properties, but can be made to do so by setting the PCRE2_UCP option
+  or starting a pattern with (*UCP).
+
+. You can build PCRE2 to recognize either CR or LF or the sequence CRLF, or any
+  of the preceding, or any of the Unicode newline sequences, as indicating the
+  end of a line. Whatever you specify at build time is the default; the caller
+  of PCRE2 can change the selection at run time. The default newline indicator
+  is a single LF character (the Unix standard). You can specify the default
+  newline indicator by adding --enable-newline-is-cr, --enable-newline-is-lf,
+  --enable-newline-is-crlf, --enable-newline-is-anycrlf, or
+  --enable-newline-is-any to the "configure" command, respectively.
+
+  If you specify --enable-newline-is-cr or --enable-newline-is-crlf, some of
+  the standard tests will fail, because the lines in the test files end with
+  LF. Even if the files are edited to change the line endings, there are likely
+  to be some failures. With --enable-newline-is-anycrlf or
+  --enable-newline-is-any, many tests should succeed, but there may be some
+  failures.
+
+. By default, the sequence \R in a pattern matches any Unicode line ending
+  sequence. This is independent of the option specifying what PCRE2 considers
+  to be the end of a line (see above). However, the caller of PCRE2 can
+  restrict \R to match only CR, LF, or CRLF. You can make this the default by
+  adding --enable-bsr-anycrlf to the "configure" command (bsr = "backslash R").
+
+. In a pattern, the escape sequence \C matches a single code unit, even in a
+  UTF mode. This can be dangerous because it breaks up multi-code-unit
+  characters. You can build PCRE2 with the use of \C permanently locked out by
+  adding --enable-never-backslash-C (note the upper case C) to the "configure"
+  command. When \C is allowed by the library, individual applications can lock
+  it out by calling pcre2_compile() with the PCRE2_NEVER_BACKSLASH_C option.
+
+. PCRE2 has a counter that limits the depth of nesting of parentheses in a
+  pattern. This limits the amount of system stack that a pattern uses when it
+  is compiled. The default is 250, but you can change it by setting, for
+  example,
+
+  --with-parens-nest-limit=500
+
+. PCRE2 has a counter that can be set to limit the amount of resources it uses
+  when matching a pattern. 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,
+
+  --with-match-limit=500000
+
+  on the "configure" command. This is just the default; individual calls to
+  pcre2_match() can supply their own value. There is more discussion on the
+  pcre2api man page.
+
+. There is a separate counter that limits the depth of recursive function calls
+  during a matching process. This also has a default of ten million, which is
+  essentially "unlimited". You can change the default by setting, for example,
+
+  --with-match-limit-recursion=500000
+
+  Recursive function calls use up the runtime stack; running out of stack can
+  cause programs to crash in strange ways. There is a discussion about stack
+  sizes in the pcre2stack man page.
+
+. In the 8-bit library, the default maximum compiled pattern size is around
+  64K. You can increase this by adding --with-link-size=3 to the "configure"
+  command. PCRE2 then uses three bytes instead of two for offsets to different
+  parts of the compiled pattern. In the 16-bit library, --with-link-size=3 is
+  the same as --with-link-size=4, which (in both libraries) uses four-byte
+  offsets. Increasing the internal link size reduces performance in the 8-bit
+  and 16-bit libraries. In the 32-bit library, the link size setting is
+  ignored, as 4-byte offsets are always used.
+
+. You can build PCRE2 so that its internal match() function that is called from
+  pcre2_match() does not call itself recursively. Instead, it uses memory
+  blocks obtained from the heap to save data that would otherwise be saved on
+  the stack. To build PCRE2 like this, use
+
+  --disable-stack-for-recursion
+
+  on the "configure" command. PCRE2 runs more slowly in this mode, but it may
+  be necessary in environments with limited stack sizes. This applies only to
+  the normal execution of the pcre2_match() function; if JIT support is being
+  successfully used, it is not relevant. Equally, it does not apply to
+  pcre2_dfa_match(), which does not use deeply nested recursion. There is a
+  discussion about stack sizes in the pcre2stack man page.
+
+. For speed, PCRE2 uses four tables for manipulating and identifying characters
+  whose code point values are less than 256. By default, it uses a set of
+  tables for ASCII encoding that is part of the distribution. If you specify
+
+  --enable-rebuild-chartables
+
+  a program called dftables is compiled and run in the default C locale when
+  you obey "make". It builds a source file called pcre2_chartables.c. If you do
+  not specify this option, pcre2_chartables.c is created as a copy of
+  pcre2_chartables.c.dist. See "Character tables" below for further
+  information.
+
+. It is possible to compile PCRE2 for use on systems that use EBCDIC as their
+  character code (as opposed to ASCII/Unicode) by specifying
+
+  --enable-ebcdic --disable-unicode
+
+  This automatically implies --enable-rebuild-chartables (see above). However,
+  when PCRE2 is built this way, it always operates in EBCDIC. It cannot support
+  both EBCDIC and UTF-8/16/32. There is a second option, --enable-ebcdic-nl25,
+  which specifies that the code value for the EBCDIC NL character is 0x25
+  instead of the default 0x15.
+
+. If you specify --enable-debug, additional debugging code is included in the
+  build. This option is intended for use by the PCRE2 maintainers.
+
+. In environments where valgrind is installed, if you specify
+
+  --enable-valgrind
+
+  PCRE2 will use valgrind annotations to mark certain memory regions as
+  unaddressable. This allows it to detect invalid memory accesses, and is
+  mostly useful for debugging PCRE2 itself.
+
+. In environments where the gcc compiler is used and lcov version 1.6 or above
+  is installed, if you specify
+
+  --enable-coverage
+
+  the build process implements a code coverage report for the test suite. The
+  report is generated by running "make coverage". If ccache is installed on
+  your system, it must be disabled when building PCRE2 for coverage reporting.
+  You can do this by setting the environment variable CCACHE_DISABLE=1 before
+  running "make" to build PCRE2. There is more information about coverage
+  reporting in the "pcre2build" documentation.
+
+. The pcre2grep program currently supports only 8-bit data files, and so
+  requires the 8-bit PCRE2 library. It is possible to compile pcre2grep to use
+  libz and/or libbz2, in order to read .gz and .bz2 files (respectively), by
+  specifying one or both of
+
+  --enable-pcre2grep-libz
+  --enable-pcre2grep-libbz2
+
+  Of course, the relevant libraries must be installed on your system.
+
+. The default size (in bytes) of the internal buffer used by pcre2grep can be
+  set by, for example:
+
+  --with-pcre2grep-bufsize=51200
+
+  The value must be a plain integer. The default is 20480.
+
+. It is possible to compile pcre2test so that it links with the libreadline
+  or libedit libraries, by specifying, respectively,
+
+  --enable-pcre2test-libreadline or --enable-pcre2test-libedit
+
+  If this is done, when pcre2test's input is from a terminal, it reads it using
+  the readline() function. This provides line-editing and history facilities.
+  Note that libreadline is GPL-licenced, so if you distribute a binary of
+  pcre2test linked in this way, there may be licensing issues. These can be
+  avoided by linking with libedit (which has a BSD licence) instead.
+
+  Enabling libreadline causes the -lreadline option to be added to the
+  pcre2test build. In many operating environments with a sytem-installed
+  readline library this is sufficient. However, in some environments (e.g. if
+  an unmodified distribution version of readline is in use), it may be
+  necessary to specify something like LIBS="-lncurses" as well. This is
+  because, to quote the readline INSTALL, "Readline uses the termcap functions,
+  but does not link with the termcap or curses library itself, allowing
+  applications which link with readline the to choose an appropriate library."
+  If you get error messages about missing functions tgetstr, tgetent, tputs,
+  tgetflag, or tgoto, this is the problem, and linking with the ncurses library
+  should fix it.
+
+The "configure" script builds the following files for the basic C library:
+
+. Makefile             the makefile that builds the library
+. src/config.h         build-time configuration options for the library
+. src/pcre2.h          the public PCRE2 header file
+. pcre2-config          script that shows the building settings such as CFLAGS
+                         that were set for "configure"
+. libpcre2-8.pc        )
+. libpcre2-16.pc       ) data for the pkg-config command
+. libpcre2-32.pc       )
+. libpcre2-posix.pc    )
+. libtool              script that builds shared and/or static libraries
+
+Versions of config.h and pcre2.h are distributed in the src directory of PCRE2
+tarballs under the names config.h.generic and pcre2.h.generic. These are
+provided for those who have to build PCRE2 without using "configure" or CMake.
+If you use "configure" or CMake, the .generic versions are not used.
+
+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". This builds whichever of the
+libraries libpcre2-8, libpcre2-16 and libpcre2-32 are configured, and a test
+program called pcre2test. If you enabled JIT support with --enable-jit, another
+test program called pcre2_jit_test is built as well. If the 8-bit library is
+built, libpcre2-posix and the pcre2grep command are also built. Running
+"make" with the -j option may speed up compilation on multiprocessor systems.
+
+The command "make check" runs all the appropriate tests. Details of the PCRE2
+tests are given below in a separate section of this document. The -j option of
+"make" can also be used when running the tests.
+
+You can use "make install" to install PCRE2 into live directories on your
+system. The following are installed (file names are all relative to the
+<prefix> that is set when "configure" is run):
+
+  Commands (bin):
+    pcre2test
+    pcre2grep (if 8-bit support is enabled)
+    pcre2-config
+
+  Libraries (lib):
+    libpcre2-8      (if 8-bit support is enabled)
+    libpcre2-16     (if 16-bit support is enabled)
+    libpcre2-32     (if 32-bit support is enabled)
+    libpcre2-posix  (if 8-bit support is enabled)
+
+  Configuration information (lib/pkgconfig):
+    libpcre2-8.pc
+    libpcre2-16.pc
+    libpcre2-32.pc
+    libpcre2-posix.pc
+
+  Header files (include):
+    pcre2.h
+    pcre2posix.h
+
+  Man pages (share/man/man{1,3}):
+    pcre2grep.1
+    pcre2test.1
+    pcre2-config.1
+    pcre2.3
+    pcre2*.3 (lots more pages, all starting "pcre2")
+
+  HTML documentation (share/doc/pcre2/html):
+    index.html
+    *.html (lots more pages, hyperlinked from index.html)
+
+  Text file documentation (share/doc/pcre2):
+    AUTHORS
+    COPYING
+    ChangeLog
+    LICENCE
+    NEWS
+    README
+    pcre2.txt         (a concatenation of the man(3) pages)
+    pcre2test.txt     the pcre2test man page
+    pcre2grep.txt     the pcre2grep man page
+    pcre2-config.txt  the pcre2-config man page
+
+If you want to remove PCRE2 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
+------------------------------------
+
+Running "make install" installs the command pcre2-config, which can be used to
+recall information about the PCRE2 configuration and installation. For example:
+
+  pcre2-config --version
+
+prints the version number, and
+
+  pcre2-config --libs8
+
+outputs information about where the 8-bit library is installed. This command
+can be included in makefiles for programs that use PCRE2, saving the programmer
+from having to remember too many details. Run pcre2-config with no arguments to
+obtain a list of possible arguments.
+
+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:
+
+  pkg-config --libs libpcre2-16
+
+The data is held in *.pc files that are installed in a directory called
+<prefix>/lib/pkgconfig.
+
+
+Shared libraries
+----------------
+
+The default distribution builds PCRE2 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
+libraries. They are placed in a subdirectory called .libs when they are newly
+built. The programs pcre2test and pcre2grep are built to use these uninstalled
+libraries (by means of wrapper scripts in the case of shared libraries). When
+you use "make install" to install shared libraries, pcre2grep and pcre2test are
+automatically re-built to use the newly installed shared libraries before being
+installed themselves. However, the versions left in the build directory still
+use the uninstalled libraries.
+
+To build PCRE2 using static libraries only you must use --disable-shared when
+configuring it. For example:
+
+./configure --prefix=/usr/gnu --disable-shared
+
+Then run "make" in the usual way. Similarly, you can use --disable-static to
+build only shared libraries.
+
+
+Cross-compiling using autotools
+-------------------------------
+
+You can specify CC and CFLAGS in the normal way to the "configure" command, in
+order to cross-compile PCRE2 for some other host. However, you should NOT
+specify --enable-rebuild-chartables, because if you do, the dftables.c source
+file is compiled and run on the local host, in order to generate the inbuilt
+character tables (the pcre2_chartables.c file). This will probably not work,
+because dftables.c needs to be compiled with the local compiler, not the cross
+compiler.
+
+When --enable-rebuild-chartables is not specified, pcre2_chartables.c is
+created by making a copy of pcre2_chartables.c.dist, which is a default set of
+tables that assumes ASCII code. Cross-compiling with the default tables should
+not be a problem.
+
+If you need to modify the character tables when cross-compiling, you should
+move pcre2_chartables.c.dist out of the way, then compile dftables.c by hand
+and run it on the local host to make a new version of pcre2_chartables.c.dist.
+Then when you cross-compile PCRE2 this new version of the tables will be used.
+
+
+Making new tarballs
+-------------------
+
+The command "make dist" creates three PCRE2 tarballs, in tar.gz, tar.bz2, and
+zip formats. The command "make distcheck" does the same, but then does a trial
+build of the new distribution to ensure that it works.
+
+If you have modified any of the man page sources in the doc directory, you
+should first run the PrepareRelease script before making a distribution. This
+script creates the .txt and HTML forms of the documentation from the man pages.
+
+
+Testing PCRE2
+------------
+
+To test the basic PCRE2 library on a Unix-like system, run the RunTest script.
+There is another script called RunGrepTest that tests the pcre2grep command.
+When JIT support is enabled, a third test program called pcre2_jit_test is
+built. Both the scripts and all the program tests are run if you obey "make
+check". For other environments, see the instructions in NON-AUTOTOOLS-BUILD.
+
+The RunTest script runs the pcre2test test program (which is documented in its
+own man page) on each of the relevant testinput files in the testdata
+directory, and compares the output with the contents of the corresponding
+testoutput files. RunTest uses a file called testtry to hold the main output
+from pcre2test. Other files whose names begin with "test" are used as working
+files in some tests.
+
+Some tests are relevant only when certain build-time options were selected. For
+example, the tests for UTF-8/16/32 features are run only when Unicode support
+is available. RunTest outputs a comment when it skips a test.
+
+Many (but not all) of the tests that are not skipped are run twice if JIT
+support is available. On the second run, JIT compilation is forced. This
+testing can be suppressed by putting "nojit" on the RunTest command line.
+
+The entire set of tests is run once for each of the 8-bit, 16-bit and 32-bit
+libraries that are enabled. If you want to run just one set of tests, call
+RunTest with either the -8, -16 or -32 option.
+
+If valgrind is installed, you can run the tests under it by putting "valgrind"
+on the RunTest command line. To run pcre2test on just one or more specific test
+files, give their numbers as arguments to RunTest, for example:
+
+  RunTest 2 7 11
+
+You can also specify ranges of tests such as 3-6 or 3- (meaning 3 to the
+end), or a number preceded by ~ to exclude a test. For example:
+
+  Runtest 3-15 ~10
+
+This runs tests 3 to 15, excluding test 10, and just ~13 runs all the tests
+except test 13. Whatever order the arguments are in, the tests are always run
+in numerical order.
+
+You can also call RunTest with the single argument "list" to cause it to output
+a list of tests.
+
+The test sequence starts with "test 0", which is a special test that has no
+input file, and whose output is not checked. This is because it will be
+different on different hardware and with different configurations. The test
+exists in order to exercise some of pcre2test's code that would not otherwise
+be run.
+
+Tests 1 and 2 can always be run, as they expect only plain text strings (not
+UTF) and make no use of Unicode properties. The first test file can be fed
+directly into the perltest.sh script to check that Perl gives the same results.
+The only difference you should see is in the first few lines, where the Perl
+version is given instead of the PCRE2 version. The second set of tests check
+auxiliary functions, error detection, and run-time flags that are specific to
+PCRE2. It also uses the debugging flags to check some of the internals of
+pcre2_compile().
+
+If you build PCRE2 with a locale setting that is not the standard C locale, the
+character tables may be different (see next paragraph). In some cases, this may
+cause failures in the second set of tests. For example, in a locale where the
+isprint() function yields TRUE for characters in the range 128-255, the use of
+[:isascii:] inside a character class defines a different set of characters, and
+this shows up in this test as a difference in the compiled code, which is being
+listed for checking. For example, where the comparison test output contains
+[\x00-\x7f] the test might contain [\x00-\xff], and similarly in some other
+cases. This is not a bug in PCRE2.
+
+Test 3 checks pcre2_maketables(), the facility for building a set of character
+tables for a specific locale and using them instead of the default tables. The
+script uses the "locale" command to check for the availability of the "fr_FR",
+"french", or "fr" locale, and uses the first one that it finds. If the "locale"
+command fails, or if its output doesn't include "fr_FR", "french", or "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 an error like this:
+
+  ** Failed to set locale "fr_FR"
+
+it means that the given locale is not available on your system, despite being
+listed by "locale". This does not mean that PCRE2 is broken. There are three
+alternative output files for the third test, because three different versions
+of the French locale have been encountered. The test passes if its output
+matches any one of them.
+
+Tests 4 and 5 check UTF and Unicode property support, test 4 being compatible
+with the perltest.sh script, and test 5 checking PCRE2-specific things.
+
+Tests 6 and 7 check the pcre2_dfa_match() alternative matching function, in
+non-UTF mode and UTF-mode with Unicode property support, respectively.
+
+Test 8 checks some internal offsets and code size features; it is run only when
+the default "link size" of 2 is set (in other cases the sizes change) and when
+Unicode support is enabled.
+
+Tests 9 and 10 are run only in 8-bit mode, and tests 11 and 12 are run only in
+16-bit and 32-bit modes. These are tests that generate different output in
+8-bit mode. Each pair are for general cases and Unicode support, respectively.
+Test 13 checks the handling of non-UTF characters greater than 255 by
+pcre2_dfa_match() in 16-bit and 32-bit modes.
+
+Test 14 contains a number of tests that must not be run with JIT. They check,
+among other non-JIT things, the match-limiting features of the intepretive
+matcher.
+
+Test 15 is run only when JIT support is not available. It checks that an
+attempt to use JIT has the expected behaviour.
+
+Test 16 is run only when JIT support is available. It checks JIT complete and
+partial modes, match-limiting under JIT, and other JIT-specific features.
+
+Tests 17 and 18 are run only in 8-bit mode. They check the POSIX interface to
+the 8-bit library, without and with Unicode support, respectively.
+
+Test 19 checks the serialization functions by writing a set of compiled
+patterns to a file, and then reloading and checking them.
+
+
+Character tables
+----------------
+
+For speed, PCRE2 uses four tables for manipulating and identifying characters
+whose code point values are less than 256. By default, a set of tables that is
+built into the library is used. The pcre2_maketables() function can be called
+by an application to create a new set of tables in the current locale. This are
+passed to PCRE2 by calling pcre2_set_character_tables() to put a pointer into a
+compile context.
+
+The source file called pcre2_chartables.c contains the default set of tables.
+By default, this is created as a copy of pcre2_chartables.c.dist, which
+contains tables for ASCII coding. However, if --enable-rebuild-chartables is
+specified for ./configure, a different version of pcre2_chartables.c is built
+by the program dftables (compiled from dftables.c), which uses the ANSI C
+character handling functions such as isalnum(), isalpha(), isupper(),
+islower(), etc. to build the table sources. This means that the default C
+locale which is set for your system will control the contents of these default
+tables. You can change the default tables by editing pcre2_chartables.c and
+then re-building PCRE2. If you do this, you should take care to ensure that the
+file does not get automatically re-generated. The best way to do this is to
+move pcre2_chartables.c.dist out of the way and replace it with your customized
+tables.
+
+When the dftables program is run as a result of --enable-rebuild-chartables,
+it uses the default C locale that is set on your system. It does not pay
+attention to the LC_xxx environment variables. In other words, it uses the
+system's default locale rather than whatever the compiling user happens to have
+set. If you really do want to build a source set of character tables in a
+locale that is specified by the LC_xxx variables, you can run the dftables
+program by hand with the -L option. For example:
+
+  ./dftables -L pcre2_chartables.c.special
+
+The first two 256-byte tables provide lower casing and case flipping functions,
+respectively. The next table consists of three 32-byte bit maps which identify
+digits, "word" characters, and white space, respectively. These are used when
+building 32-byte bit maps that represent character classes for code points less
+than 256. The final 256-byte table has bits indicating various character types,
+as follows:
+
+    1   white space character
+    2   letter
+    4   decimal digit
+    8   hexadecimal digit
+   16   alphanumeric or '_'
+  128   regular expression metacharacter or binary zero
+
+You should not alter the set of characters that contain the 128 bit, as that
+will cause PCRE2 to malfunction.
+
+
+File manifest
+-------------
+
+The distribution should contain the files listed below.
+
+(A) Source files for the PCRE2 library functions and their headers are found in
+    the src directory:
+
+  src/dftables.c           auxiliary program for building pcre2_chartables.c
+                           when --enable-rebuild-chartables is specified
+
+  src/pcre2_chartables.c.dist  a default set of character tables that assume
+                           ASCII coding; unless --enable-rebuild-chartables is
+                           specified, used by copying to pcre2_chartables.c
+
+  src/pcre2posix.c         )
+  src/pcre2_auto_possess.c )
+  src/pcre2_compile.c      )
+  src/pcre2_config.c       )
+  src/pcre2_context.c      )
+  src/pcre2_dfa_match.c    )
+  src/pcre2_error.c        )
+  src/pcre2_find_bracket.c )
+  src/pcre2_jit_compile.c  )
+  src/pcre2_jit_match.c    ) sources for the functions in the library,
+  src/pcre2_jit_misc.c     )   and some internal functions that they use
+  src/pcre2_maketables.c   )
+  src/pcre2_match.c        )
+  src/pcre2_match_data.c   )
+  src/pcre2_newline.c      )
+  src/pcre2_ord2utf.c      )
+  src/pcre2_pattern_info.c )
+  src/pcre2_serialize.c    )
+  src/pcre2_string_utils.c )
+  src/pcre2_study.c        )
+  src/pcre2_substitute.c   )
+  src/pcre2_substring.c    )
+  src/pcre2_tables.c       )
+  src/pcre2_ucd.c          )
+  src/pcre2_valid_utf.c    )
+  src/pcre2_xclass.c       )
+
+  src/pcre2_printint.c     debugging function that is used by pcre2test,
+
+  src/config.h.in          template for config.h, when built by "configure"
+  src/pcre2.h.in           template for pcre2.h when built by "configure"
+  src/pcre2posix.h         header for the external POSIX wrapper API
+  src/pcre2_internal.h     header for internal use
+  src/pcre2_intmodedep.h   a mode-specific internal header
+  src/pcre2_ucp.h          header for Unicode property handling
+
+  sljit/*                  source files for the JIT compiler
+
+(B) Source files for programs that use PCRE2:
+
+  src/pcre2demo.c          simple demonstration of coding calls to PCRE2
+  src/pcre2grep.c          source of a grep utility that uses PCRE2
+  src/pcre2test.c          comprehensive test program
+  src/pcre2_printint.c     part of pcre2test
+  src/pcre2_jit_test.c     JIT test program
+
+(C) Auxiliary files:
+
+  132html                  script to turn "man" pages into HTML
+  AUTHORS                  information about the author of PCRE2
+  ChangeLog                log of changes to the code
+  CleanTxt                 script to clean nroff output for txt man pages
+  Detrail                  script to remove trailing spaces
+  HACKING                  some notes about the internals of PCRE2
+  INSTALL                  generic installation instructions
+  LICENCE                  conditions for the use of PCRE2
+  COPYING                  the same, using GNU's standard name
+  Makefile.in              ) template for Unix Makefile, which is built by
+                           )   "configure"
+  Makefile.am              ) the automake input that was used to create
+                           )   Makefile.in
+  NEWS                     important changes in this release
+  NON-AUTOTOOLS-BUILD      notes on building PCRE2 without using autotools
+  PrepareRelease           script to make preparations for "make dist"
+  README                   this file
+  RunTest                  a Unix shell script for running tests
+  RunGrepTest              a Unix shell script for pcre2grep tests
+  aclocal.m4               m4 macros (generated by "aclocal")
+  config.guess             ) files used by libtool,
+  config.sub               )   used only when building a shared library
+  configure                a configuring shell script (built by autoconf)
+  configure.ac             ) the autoconf input that was used to build
+                           )   "configure" and config.h
+  depcomp                  ) script to find program dependencies, generated by
+                           )   automake
+  doc/*.3                  man page sources for PCRE2
+  doc/*.1                  man page sources for pcre2grep and pcre2test
+  doc/index.html.src       the base HTML page
+  doc/html/*               HTML documentation
+  doc/pcre2.txt            plain text version of the man pages
+  doc/pcre2test.txt        plain text documentation of test program
+  install-sh               a shell script for installing files
+  libpcre2-8.pc.in         template for libpcre2-8.pc for pkg-config
+  libpcre2-16.pc.in        template for libpcre2-16.pc for pkg-config
+  libpcre2-32.pc.in        template for libpcre2-32.pc for pkg-config
+  libpcre2posix.pc.in      template for libpcre2posix.pc for pkg-config
+  ltmain.sh                file used to build a libtool script
+  missing                  ) common stub for a few missing GNU programs while
+                           )   installing, generated by automake
+  mkinstalldirs            script for making install directories
+  perltest.sh              Script for running a Perl test program
+  pcre2-config.in          source of script which retains PCRE2 information
+  testdata/testinput*      test data for main library tests
+  testdata/testoutput*     expected test results
+  testdata/grep*           input and output for pcre2grep tests
+  testdata/*               other supporting test files
+
+(D) Auxiliary files for cmake support
+
+  cmake/COPYING-CMAKE-SCRIPTS
+  cmake/FindPackageHandleStandardArgs.cmake
+  cmake/FindEditline.cmake
+  cmake/FindReadline.cmake
+  CMakeLists.txt
+  config-cmake.h.in
+
+(E) Auxiliary files for building PCRE2 "by hand"
+
+  pcre2.h.generic         ) a version of the public PCRE2 header file
+                          )   for use in non-"configure" environments
+  config.h.generic        ) a version of config.h for use in non-"configure"
+                          )   environments
+
+Philip Hazel
+Email local part: ph10
+Email domain: cam.ac.uk
+Last updated: 16 October 2015
diff --git a/dist2/doc/html/index.html b/dist2/doc/html/index.html
new file mode 100644
index 0000000..f459657
--- /dev/null
+++ b/dist2/doc/html/index.html
@@ -0,0 +1,270 @@
+<html>
+<!-- This is a manually maintained file that is the root of the HTML version of
+     the PCRE2 documentation. When the HTML documents are built from the man
+     page versions, the entire doc/html directory is emptied, this file is then
+     copied into doc/html/index.html, and the remaining files therein are
+     created by the 132html script.
+-->
+<head>
+<title>PCRE2 specification</title>
+</head>
+<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
+<h1>Perl-compatible Regular Expressions (revised API: PCRE2)</h1>
+<p>
+The HTML documentation for PCRE2 consists of a number of pages that are listed
+below in alphabetical order. If you are new to PCRE2, please read the first one
+first.
+</p>
+
+<table>
+<tr><td><a href="pcre2.html">pcre2</a></td>
+    <td>&nbsp;&nbsp;Introductory page</td></tr>
+
+<tr><td><a href="pcre2-config.html">pcre2-config</a></td>
+    <td>&nbsp;&nbsp;Information about the installation configuration</td></tr>
+
+<tr><td><a href="pcre2api.html">pcre2api</a></td>
+    <td>&nbsp;&nbsp;PCRE2's native API</td></tr>
+
+<tr><td><a href="pcre2build.html">pcre2build</a></td>
+    <td>&nbsp;&nbsp;Building PCRE2</td></tr>
+
+<tr><td><a href="pcre2callout.html">pcre2callout</a></td>
+    <td>&nbsp;&nbsp;The <i>callout</i> facility</td></tr>
+
+<tr><td><a href="pcre2compat.html">pcre2compat</a></td>
+    <td>&nbsp;&nbsp;Compability with Perl</td></tr>
+
+<tr><td><a href="pcre2demo.html">pcre2demo</a></td>
+    <td>&nbsp;&nbsp;A demonstration C program that uses the PCRE2 library</td></tr>
+
+<tr><td><a href="pcre2grep.html">pcre2grep</a></td>
+    <td>&nbsp;&nbsp;The <b>pcre2grep</b> command</td></tr>
+
+<tr><td><a href="pcre2jit.html">pcre2jit</a></td>
+    <td>&nbsp;&nbsp;Discussion of the just-in-time optimization support</td></tr>
+
+<tr><td><a href="pcre2limits.html">pcre2limits</a></td>
+    <td>&nbsp;&nbsp;Details of size and other limits</td></tr>
+
+<tr><td><a href="pcre2matching.html">pcre2matching</a></td>
+    <td>&nbsp;&nbsp;Discussion of the two matching algorithms</td></tr>
+
+<tr><td><a href="pcre2partial.html">pcre2partial</a></td>
+    <td>&nbsp;&nbsp;Using PCRE2 for partial matching</td></tr>
+
+<tr><td><a href="pcre2pattern.html">pcre2pattern</a></td>
+    <td>&nbsp;&nbsp;Specification of the regular expressions supported by PCRE2</td></tr>
+
+<tr><td><a href="pcre2perform.html">pcre2perform</a></td>
+    <td>&nbsp;&nbsp;Some comments on performance</td></tr>
+
+<tr><td><a href="pcre2posix.html">pcre2posix</a></td>
+    <td>&nbsp;&nbsp;The POSIX API to the PCRE2 8-bit library</td></tr>
+
+<tr><td><a href="pcre2sample.html">pcre2sample</a></td>
+    <td>&nbsp;&nbsp;Discussion of the pcre2demo program</td></tr>
+
+<tr><td><a href="pcre2serialize.html">pcre2serialize</a></td>
+    <td>&nbsp;&nbsp;Serializing functions for saving precompiled patterns</td></tr>
+
+<tr><td><a href="pcre2stack.html">pcre2stack</a></td>
+    <td>&nbsp;&nbsp;Discussion of PCRE2's stack usage</td></tr>
+
+<tr><td><a href="pcre2syntax.html">pcre2syntax</a></td>
+    <td>&nbsp;&nbsp;Syntax quick-reference summary</td></tr>
+
+<tr><td><a href="pcre2test.html">pcre2test</a></td>
+    <td>&nbsp;&nbsp;The <b>pcre2test</b> command for testing PCRE2</td></tr>
+
+<tr><td><a href="pcre2unicode.html">pcre2unicode</a></td>
+    <td>&nbsp;&nbsp;Discussion of Unicode and UTF-8/UTF-16/UTF-32 support</td></tr>
+</table>
+
+<p>
+There are also individual pages that summarize the interface for each function
+in the library.
+</p>
+
+<table>
+
+<tr><td><a href="pcre2_callout_enumerate.html">pcre2_callout_enumerate</a></td>
+    <td>&nbsp;&nbsp;Enumerate callouts in a compiled pattern</td></tr>
+
+<tr><td><a href="pcre2_code_free.html">pcre2_code_free</a></td>
+    <td>&nbsp;&nbsp;Free a compiled pattern</td></tr>
+
+<tr><td><a href="pcre2_compile.html">pcre2_compile</a></td>
+    <td>&nbsp;&nbsp;Compile a regular expression pattern</td></tr>
+
+<tr><td><a href="pcre2_compile_context_copy.html">pcre2_compile_context_copy</a></td>
+    <td>&nbsp;&nbsp;Copy a compile context</td></tr>
+
+<tr><td><a href="pcre2_compile_context_create.html">pcre2_compile_context_create</a></td>
+    <td>&nbsp;&nbsp;Create a compile context</td></tr>
+
+<tr><td><a href="pcre2_compile_context_free.html">pcre2_compile_context_free</a></td>
+    <td>&nbsp;&nbsp;Free a compile context</td></tr>
+
+<tr><td><a href="pcre2_config.html">pcre2_config</a></td>
+    <td>&nbsp;&nbsp;Show build-time configuration options</td></tr>
+
+<tr><td><a href="pcre2_dfa_match.html">pcre2_dfa_match</a></td>
+    <td>&nbsp;&nbsp;Match a compiled pattern to a subject string
+    (DFA algorithm; <i>not</i> Perl compatible)</td></tr>
+
+<tr><td><a href="pcre2_general_context_copy.html">pcre2_general_context_copy</a></td>
+    <td>&nbsp;&nbsp;Copy a general context</td></tr>
+
+<tr><td><a href="pcre2_general_context_create.html">pcre2_general_context_create</a></td>
+    <td>&nbsp;&nbsp;Create a general context</td></tr>
+
+<tr><td><a href="pcre2_general_context_free.html">pcre2_general_context_free</a></td>
+    <td>&nbsp;&nbsp;Free a general context</td></tr>
+
+<tr><td><a href="pcre2_get_error_message.html">pcre2_get_error_message</a></td>
+    <td>&nbsp;&nbsp;Free study data</td></tr>
+
+<tr><td><a href="pcre2_get_mark.html">pcre2_get_mark</a></td>
+    <td>&nbsp;&nbsp;Get a (*MARK) name</td></tr>
+
+<tr><td><a href="pcre2_get_ovector_count.html">pcre2_get_ovector_count</a></td>
+    <td>&nbsp;&nbsp;Get the ovector count</td></tr>
+
+<tr><td><a href="pcre2_get_ovector_pointer.html">pcre2_get_ovector_pointer</a></td>
+    <td>&nbsp;&nbsp;Get a pointer to the ovector</td></tr>
+
+<tr><td><a href="pcre2_get_startchar.html">pcre2_get_startchar</a></td>
+    <td>&nbsp;&nbsp;Get the starting character offset</td></tr>
+
+<tr><td><a href="pcre2_jit_compile.html">pcre2_jit_compile</a></td>
+    <td>&nbsp;&nbsp;Process a compiled pattern with the JIT compiler</td></tr>
+
+<tr><td><a href="pcre2_jit_free_unused_memory.html">pcre2_jit_free_unused_memory</a></td>
+    <td>&nbsp;&nbsp;Free unused JIT memory</td></tr>
+
+<tr><td><a href="pcre2_jit_match.html">pcre2_jit_match</a></td>
+    <td>&nbsp;&nbsp;Fast path interface to JIT matching</td></tr>
+
+<tr><td><a href="pcre2_jit_stack_assign.html">pcre2_jit_stack_assign</a></td>
+    <td>&nbsp;&nbsp;Assign stack for JIT matching</td></tr>
+
+<tr><td><a href="pcre2_jit_stack_create.html">pcre2_jit_stack_create</a></td>
+    <td>&nbsp;&nbsp;Create a stack for JIT matching</td></tr>
+
+<tr><td><a href="pcre2_jit_stack_free.html">pcre2_jit_stack_free</a></td>
+    <td>&nbsp;&nbsp;Free a JIT matching stack</td></tr>
+
+<tr><td><a href="pcre2_maketables.html">pcre2_maketables</a></td>
+    <td>&nbsp;&nbsp;Build character tables in current locale</td></tr>
+
+<tr><td><a href="pcre2_match.html">pcre2_match</a></td>
+    <td>&nbsp;&nbsp;Match a compiled pattern to a subject string
+    (Perl compatible)</td></tr>
+
+<tr><td><a href="pcre2_match_context_copy.html">pcre2_match_context_copy</a></td>
+    <td>&nbsp;&nbsp;Copy a match context</td></tr>
+
+<tr><td><a href="pcre2_match_context_create.html">pcre2_match_context_create</a></td>
+    <td>&nbsp;&nbsp;Create a match context</td></tr>
+
+<tr><td><a href="pcre2_match_context_free.html">pcre2_match_context_free</a></td>
+    <td>&nbsp;&nbsp;Free a match context</td></tr>
+
+<tr><td><a href="pcre2_match_data_create.html">pcre2_match_data_create</a></td>
+    <td>&nbsp;&nbsp;Create a match data block</td></tr>
+
+<tr><td><a href="pcre2_match_data_create_from_pattern.html">pcre2_match_data_create_from_pattern</a></td>
+    <td>&nbsp;&nbsp;Create a match data block getting size from pattern</td></tr>
+
+<tr><td><a href="pcre2_match_data_free.html">pcre2_match_data_free</a></td>
+    <td>&nbsp;&nbsp;Free a match data block</td></tr>
+
+<tr><td><a href="pcre2_pattern_info.html">pcre2_pattern_info</a></td>
+    <td>&nbsp;&nbsp;Extract information about a pattern</td></tr>
+
+<tr><td><a href="pcre2_serialize_decode.html">pcre2_serialize_decode</a></td>
+    <td>&nbsp;&nbsp;Decode serialized compiled patterns</td></tr>
+
+<tr><td><a href="pcre2_serialize_encode.html">pcre2_serialize_encode</a></td>
+    <td>&nbsp;&nbsp;Serialize compiled patterns for save/restore</td></tr>
+
+<tr><td><a href="pcre2_serialize_free.html">pcre2_serialize_free</a></td>
+    <td>&nbsp;&nbsp;Free serialized compiled patterns</td></tr>
+
+<tr><td><a href="pcre2_serialize_get_number_of_codes.html">pcre2_serialize_get_number_of_codes</a></td>
+    <td>&nbsp;&nbsp;Get number of serialized compiled patterns</td></tr>
+
+<tr><td><a href="pcre2_set_bsr.html">pcre2_set_bsr</a></td>
+    <td>&nbsp;&nbsp;Set \R convention</td></tr>
+
+<tr><td><a href="pcre2_set_callout.html">pcre2_set_callout</a></td>
+    <td>&nbsp;&nbsp;Set up a callout function</td></tr>
+
+<tr><td><a href="pcre2_set_character_tables.html">pcre2_set_character_tables</a></td>
+    <td>&nbsp;&nbsp;Set character tables</td></tr>
+
+<tr><td><a href="pcre2_set_compile_recursion_guard.html">pcre2_set_compile_recursion_guard</a></td>
+    <td>&nbsp;&nbsp;Set up a compile recursion guard function</td></tr>
+
+<tr><td><a href="pcre2_set_match_limit.html">pcre2_set_match_limit</a></td>
+    <td>&nbsp;&nbsp;Set the match limit</td></tr>
+
+<tr><td><a href="pcre2_set_max_pattern_length.html">pcre2_set_max_pattern_length</a></td>
+    <td>&nbsp;&nbsp;Set the maximum length of pattern</td></tr>
+
+<tr><td><a href="pcre2_set_newline.html">pcre2_set_newline</a></td>
+    <td>&nbsp;&nbsp;Set the newline convention</td></tr>
+
+<tr><td><a href="pcre2_set_offset_limit.html">pcre2_set_offset_limit</a></td>
+    <td>&nbsp;&nbsp;Set the offset limit</td></tr>
+
+<tr><td><a href="pcre2_set_parens_nest_limit.html">pcre2_set_parens_nest_limit</a></td>
+    <td>&nbsp;&nbsp;Set the parentheses nesting limit</td></tr>
+
+<tr><td><a href="pcre2_set_recursion_limit.html">pcre2_set_recursion_limit</a></td>
+    <td>&nbsp;&nbsp;Set the match recursion limit</td></tr>
+
+<tr><td><a href="pcre2_set_recursion_memory_management.html">pcre2_set_recursion_memory_management</a></td>
+    <td>&nbsp;&nbsp;Set match recursion memory management</td></tr>
+
+<tr><td><a href="pcre2_substitute.html">pcre2_substitute</a></td>
+    <td>&nbsp;&nbsp;Match a compiled pattern to a subject string and do
+    substitutions</td></tr>
+
+<tr><td><a href="pcre2_substring_copy_byname.html">pcre2_substring_copy_byname</a></td>
+    <td>&nbsp;&nbsp;Extract named substring into given buffer</td></tr>
+
+<tr><td><a href="pcre2_substring_copy_bynumber.html">pcre2_substring_copy_bynumber</a></td>
+    <td>&nbsp;&nbsp;Extract numbered substring into given buffer</td></tr>
+
+<tr><td><a href="pcre2_substring_free.html">pcre2_substring_free</a></td>
+    <td>&nbsp;&nbsp;Free extracted substring</td></tr>
+
+<tr><td><a href="pcre2_substring_get_byname.html">pcre2_substring_get_byname</a></td>
+    <td>&nbsp;&nbsp;Extract named substring into new memory</td></tr>
+
+<tr><td><a href="pcre2_substring_get_bynumber.html">pcre2_substring_get_bynumber</a></td>
+    <td>&nbsp;&nbsp;Extract numbered substring into new memory</td></tr>
+
+<tr><td><a href="pcre2_substring_length_byname.html">pcre2_substring_length_byname</a></td>
+    <td>&nbsp;&nbsp;Find length of named substring</td></tr>
+
+<tr><td><a href="pcre2_substring_length_bynumber.html">pcre2_substring_length_bynumber</a></td>
+    <td>&nbsp;&nbsp;Find length of numbered substring</td></tr>
+
+<tr><td><a href="pcre2_substring_list_free.html">pcre2_substring_list_free</a></td>
+    <td>&nbsp;&nbsp;Free list of extracted substrings</td></tr>
+
+<tr><td><a href="pcre2_substring_list_get.html">pcre2_substring_list_get</a></td>
+    <td>&nbsp;&nbsp;Extract all substrings into new memory</td></tr>
+
+<tr><td><a href="pcre2_substring_nametable_scan.html">pcre2_substring_nametable_scan</a></td>
+    <td>&nbsp;&nbsp;Find table entries for given string name</td></tr>
+
+<tr><td><a href="pcre2_substring_number_from_name.html">pcre2_substring_number_from_name</a></td>
+    <td>&nbsp;&nbsp;Convert captured string name to number</td></tr>
+</table>
+
+</html>
+
diff --git a/dist2/doc/html/pcre2-config.html b/dist2/doc/html/pcre2-config.html
new file mode 100644
index 0000000..b71d760
--- /dev/null
+++ b/dist2/doc/html/pcre2-config.html
@@ -0,0 +1,102 @@
+<html>
+<head>
+<title>pcre2-config specification</title>
+</head>
+<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
+<h1>pcre2-config man page</h1>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
+<p>
+This page is part of the PCRE2 HTML documentation. It was generated
+automatically from the original man page. If there is any nonsense in it,
+please consult the man page, in case the conversion went wrong.
+<br>
+<ul>
+<li><a name="TOC1" href="#SEC1">SYNOPSIS</a>
+<li><a name="TOC2" href="#SEC2">DESCRIPTION</a>
+<li><a name="TOC3" href="#SEC3">OPTIONS</a>
+<li><a name="TOC4" href="#SEC4">SEE ALSO</a>
+<li><a name="TOC5" href="#SEC5">AUTHOR</a>
+<li><a name="TOC6" href="#SEC6">REVISION</a>
+</ul>
+<br><a name="SEC1" href="#TOC1">SYNOPSIS</a><br>
+<P>
+<b>pcre2-config  [--prefix] [--exec-prefix] [--version]</b>
+<b>             [--libs8] [--libs16] [--libs32] [--libs-posix]</b>
+<b>             [--cflags] [--cflags-posix]</b>
+</P>
+<br><a name="SEC2" href="#TOC1">DESCRIPTION</a><br>
+<P>
+<b>pcre2-config</b> returns the configuration of the installed PCRE2 libraries
+and the options required to compile a program to use them. Some of the options
+apply only to the 8-bit, or 16-bit, or 32-bit libraries, respectively, and are
+not available for libraries that have not been built. If an unavailable option
+is encountered, the "usage" information is output.
+</P>
+<br><a name="SEC3" href="#TOC1">OPTIONS</a><br>
+<P>
+<b>--prefix</b>
+Writes the directory prefix used in the PCRE2 installation for architecture
+independent files (<i>/usr</i> on many systems, <i>/usr/local</i> on some
+systems) to the standard output.
+</P>
+<P>
+<b>--exec-prefix</b>
+Writes the directory prefix used in the PCRE2 installation for architecture
+dependent files (normally the same as <b>--prefix</b>) to the standard output.
+</P>
+<P>
+<b>--version</b>
+Writes the version number of the installed PCRE2 libraries to the standard
+output.
+</P>
+<P>
+<b>--libs8</b>
+Writes to the standard output the command line options required to link
+with the 8-bit PCRE2 library (<b>-lpcre2-8</b> on many systems).
+</P>
+<P>
+<b>--libs16</b>
+Writes to the standard output the command line options required to link
+with the 16-bit PCRE2 library (<b>-lpcre2-16</b> on many systems).
+</P>
+<P>
+<b>--libs32</b>
+Writes to the standard output the command line options required to link
+with the 32-bit PCRE2 library (<b>-lpcre2-32</b> on many systems).
+</P>
+<P>
+<b>--libs-posix</b>
+Writes to the standard output the command line options required to link with
+PCRE2's POSIX API wrapper library (<b>-lpcre2-posix</b> <b>-lpcre2-8</b> on many
+systems).
+</P>
+<P>
+<b>--cflags</b>
+Writes to the standard output the command line options required to compile
+files that use PCRE2 (this may include some <b>-I</b> options, but is blank on
+many systems).
+</P>
+<P>
+<b>--cflags-posix</b>
+Writes to the standard output the command line options required to compile
+files that use PCRE2's POSIX API wrapper library (this may include some
+<b>-I</b> options, but is blank on many systems).
+</P>
+<br><a name="SEC4" href="#TOC1">SEE ALSO</a><br>
+<P>
+<b>pcre2(3)</b>
+</P>
+<br><a name="SEC5" href="#TOC1">AUTHOR</a><br>
+<P>
+This manual page was originally written by Mark Baker for the Debian GNU/Linux
+system. It has been subsequently revised as a generic PCRE2 man page.
+</P>
+<br><a name="SEC6" href="#TOC1">REVISION</a><br>
+<P>
+Last updated: 28 September 2014
+<br>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
diff --git a/dist2/doc/html/pcre2.html b/dist2/doc/html/pcre2.html
new file mode 100644
index 0000000..07ab8e9
--- /dev/null
+++ b/dist2/doc/html/pcre2.html
@@ -0,0 +1,198 @@
+<html>
+<head>
+<title>pcre2 specification</title>
+</head>
+<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
+<h1>pcre2 man page</h1>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
+<p>
+This page is part of the PCRE2 HTML documentation. It was generated
+automatically from the original man page. If there is any nonsense in it,
+please consult the man page, in case the conversion went wrong.
+<br>
+<ul>
+<li><a name="TOC1" href="#SEC1">INTRODUCTION</a>
+<li><a name="TOC2" href="#SEC2">SECURITY CONSIDERATIONS</a>
+<li><a name="TOC3" href="#SEC3">USER DOCUMENTATION</a>
+<li><a name="TOC4" href="#SEC4">AUTHOR</a>
+<li><a name="TOC5" href="#SEC5">REVISION</a>
+</ul>
+<br><a name="SEC1" href="#TOC1">INTRODUCTION</a><br>
+<P>
+PCRE2 is the name used for a revised API for the PCRE library, which is a set
+of functions, written in C, that implement regular expression pattern matching
+using the same syntax and semantics as Perl, with just a few differences. Some
+features that appeared in Python and the original PCRE before they appeared in
+Perl are also available using the Python syntax. There is also some support for
+one or two .NET and Oniguruma syntax items, and there are options for
+requesting some minor changes that give better ECMAScript (aka JavaScript)
+compatibility.
+</P>
+<P>
+The source code for PCRE2 can be compiled to support 8-bit, 16-bit, or 32-bit
+code units, which means that up to three separate libraries may be installed.
+The original work to extend PCRE to 16-bit and 32-bit code units was done by
+Zoltan Herczeg and Christian Persch, respectively. In all three cases, strings
+can be interpreted either as one character per code unit, or as UTF-encoded
+Unicode, with support for Unicode general category properties. Unicode support
+is optional at build time (but is the default). However, processing strings as
+UTF code units must be enabled explicitly at run time. The version of Unicode
+in use can be discovered by running
+<pre>
+  pcre2test -C
+</PRE>
+</P>
+<P>
+The three libraries contain identical sets of functions, with names ending in
+_8, _16, or _32, respectively (for example, <b>pcre2_compile_8()</b>). However,
+by defining PCRE2_CODE_UNIT_WIDTH to be 8, 16, or 32, a program that uses just
+one code unit width can be written using generic names such as
+<b>pcre2_compile()</b>, and the documentation is written assuming that this is
+the case.
+</P>
+<P>
+In addition to the Perl-compatible matching function, PCRE2 contains an
+alternative 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
+<a href="pcre2matching.html"><b>pcre2matching</b></a>
+page.
+</P>
+<P>
+Details of exactly which Perl regular expression features are and are not
+supported by PCRE2 are given in separate documents. See the
+<a href="pcre2pattern.html"><b>pcre2pattern</b></a>
+and
+<a href="pcre2compat.html"><b>pcre2compat</b></a>
+pages. There is a syntax summary in the
+<a href="pcre2syntax.html"><b>pcre2syntax</b></a>
+page.
+</P>
+<P>
+Some features of PCRE2 can be included, excluded, or changed when the library
+is built. The
+<a href="pcre2_config.html"><b>pcre2_config()</b></a>
+function makes it possible for a client to discover which features are
+available. The features themselves are described in the
+<a href="pcre2build.html"><b>pcre2build</b></a>
+page. Documentation about building PCRE2 for various operating systems can be
+found in the
+<a href="README.txt"><b>README</b></a>
+and
+<a href="NON-AUTOTOOLS-BUILD.txt"><b>NON-AUTOTOOLS_BUILD</b></a>
+files in the source distribution.
+</P>
+<P>
+The libraries 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
+"_pcre2", 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.
+</P>
+<br><a name="SEC2" href="#TOC1">SECURITY CONSIDERATIONS</a><br>
+<P>
+If you are using PCRE2 in a non-UTF application that permits users to supply
+arbitrary patterns for compilation, you should be aware of a feature that
+allows users to turn on UTF support from within a pattern. For example, an
+8-bit pattern that begins with "(*UTF)" turns on UTF-8 mode, which interprets
+patterns and subjects as strings of UTF-8 code units instead of individual
+8-bit characters. This causes both the pattern and any data against which it is
+matched to be checked for UTF-8 validity. If the data string is very long, such
+a check might use sufficiently many resources as to cause your application to
+lose performance.
+</P>
+<P>
+One way of guarding against this possibility is to use the
+<b>pcre2_pattern_info()</b> function to check the compiled pattern's options for
+PCRE2_UTF. Alternatively, you can set the PCRE2_NEVER_UTF option when calling
+<b>pcre2_compile()</b>. This causes an compile time error if a pattern contains
+a UTF-setting sequence.
+</P>
+<P>
+The use of Unicode properties for character types such as \d can also be
+enabled from within the pattern, by specifying "(*UCP)". This feature can be
+disallowed by setting the PCRE2_NEVER_UCP option.
+</P>
+<P>
+If your application is one that supports UTF, be aware that validity checking
+can take time. If the same data string is to be matched many times, you can use
+the PCRE2_NO_UTF_CHECK option for the second and subsequent matches to avoid
+running redundant checks.
+</P>
+<P>
+The use of the \C escape sequence in a UTF-8 or UTF-16 pattern can lead to
+problems, because it may leave the current matching point in the middle of a
+multi-code-unit character. The PCRE2_NEVER_BACKSLASH_C option can be used by an
+application to lock out the use of \C, causing a compile-time error if it is
+encountered. It is also possible to build PCRE2 with the use of \C permanently
+disabled.
+</P>
+<P>
+Another way that performance can be hit is by running a pattern that has a very
+large search tree against a string that will never match. Nested unlimited
+repeats in a pattern are a common example. PCRE2 provides some protection
+against this: see the <b>pcre2_set_match_limit()</b> function in the
+<a href="pcre2api.html"><b>pcre2api</b></a>
+page.
+</P>
+<br><a name="SEC3" href="#TOC1">USER DOCUMENTATION</a><br>
+<P>
+The user documentation for PCRE2 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,
+the descriptions of the <b>pcre2grep</b> and <b>pcre2test</b> programs are in
+files called <b>pcre2grep.txt</b> and <b>pcre2test.txt</b>, respectively. The
+remaining sections, except for the <b>pcre2demo</b> section (which is a program
+listing), and the short pages for individual functions, are concatenated in
+<b>pcre2.txt</b>, for ease of searching. The sections are as follows:
+<pre>
+  pcre2              this document
+  pcre2-config       show PCRE2 installation configuration information
+  pcre2api           details of PCRE2's native C API
+  pcre2build         building PCRE2
+  pcre2callout       details of the callout feature
+  pcre2compat        discussion of Perl compatibility
+  pcre2demo          a demonstration C program that uses PCRE2
+  pcre2grep          description of the <b>pcre2grep</b> command (8-bit only)
+  pcre2jit           discussion of just-in-time optimization support
+  pcre2limits        details of size and other limits
+  pcre2matching      discussion of the two matching algorithms
+  pcre2partial       details of the partial matching facility
+  pcre2pattern       syntax and semantics of supported regular expression patterns
+  pcre2perform       discussion of performance issues
+  pcre2posix         the POSIX-compatible C API for the 8-bit library
+  pcre2sample        discussion of the pcre2demo program
+  pcre2stack         discussion of stack usage
+  pcre2syntax        quick syntax reference
+  pcre2test          description of the <b>pcre2test</b> command
+  pcre2unicode       discussion of Unicode and UTF support
+</pre>
+In the "man" and HTML formats, there is also a short page for each C library
+function, listing its arguments and results.
+</P>
+<br><a name="SEC4" href="#TOC1">AUTHOR</a><br>
+<P>
+Philip Hazel
+<br>
+University Computing Service
+<br>
+Cambridge, England.
+<br>
+</P>
+<P>
+Putting an actual email address here is a spam magnet. If you want to email me,
+use my two initials, followed by the two digits 10, at the domain cam.ac.uk.
+</P>
+<br><a name="SEC5" href="#TOC1">REVISION</a><br>
+<P>
+Last updated: 16 October 2015
+<br>
+Copyright &copy; 1997-2015 University of Cambridge.
+<br>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
diff --git a/dist2/doc/html/pcre2_callout_enumerate.html b/dist2/doc/html/pcre2_callout_enumerate.html
new file mode 100644
index 0000000..6c2cdb8
--- /dev/null
+++ b/dist2/doc/html/pcre2_callout_enumerate.html
@@ -0,0 +1,62 @@
+<html>
+<head>
+<title>pcre2_callout_enumerate specification</title>
+</head>
+<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
+<h1>pcre2_callout_enumerate man page</h1>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
+<p>
+This page is part of the PCRE2 HTML documentation. It was generated
+automatically from the original man page. If there is any nonsense in it,
+please consult the man page, in case the conversion went wrong.
+<br>
+<br><b>
+SYNOPSIS
+</b><br>
+<P>
+<b>#include &#60;pcre2.h&#62;</b>
+</P>
+<P>
+<b>int pcre2_callout_enumerate(const pcre2_code *<i>code</i>,</b>
+<b>  int (*<i>callback</i>)(pcre2_callout_enumerate_block *, void *),</b>
+<b>  void *<i>callout_data</i>);</b>
+</P>
+<br><b>
+DESCRIPTION
+</b><br>
+<P>
+This function scans a compiled regular expression and calls the <i>callback()</i>
+function for each callout within the pattern. The yield of the function is zero
+for success and non-zero otherwise. The arguments are:
+<pre>
+  <i>code</i>           Points to the compiled pattern
+  <i>callback</i>       The callback function
+  <i>callout_data</i>   User data that is passed to the callback
+</pre>
+The <i>callback()</i> function is passed a pointer to a data block containing
+the following fields:
+<pre>
+  <i>version</i>                Block version number
+  <i>pattern_position</i>       Offset to next item in pattern
+  <i>next_item_length</i>       Length of next item in pattern
+  <i>callout_number</i>         Number for numbered callouts
+  <i>callout_string_offset</i>  Offset to string within pattern
+  <i>callout_string_length</i>  Length of callout string
+  <i>callout_string</i>         Points to callout string or is NULL
+</pre>
+The second argument is the callout data that was passed to
+<b>pcre2_callout_enumerate()</b>. The <b>callback()</b> function must return zero
+for success. Any other value causes the pattern scan to stop, with the value
+being passed back as the result of <b>pcre2_callout_enumerate()</b>.
+</P>
+<P>
+There is a complete description of the PCRE2 native API in the
+<a href="pcre2api.html"><b>pcre2api</b></a>
+page and a description of the POSIX API in the
+<a href="pcre2posix.html"><b>pcre2posix</b></a>
+page.
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
diff --git a/dist2/doc/html/pcre2_code_free.html b/dist2/doc/html/pcre2_code_free.html
new file mode 100644
index 0000000..0477abe
--- /dev/null
+++ b/dist2/doc/html/pcre2_code_free.html
@@ -0,0 +1,39 @@
+<html>
+<head>
+<title>pcre2_code_free specification</title>
+</head>
+<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
+<h1>pcre2_code_free man page</h1>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
+<p>
+This page is part of the PCRE2 HTML documentation. It was generated
+automatically from the original man page. If there is any nonsense in it,
+please consult the man page, in case the conversion went wrong.
+<br>
+<br><b>
+SYNOPSIS
+</b><br>
+<P>
+<b>#include &#60;pcre2.h&#62;</b>
+</P>
+<P>
+<b>void pcre2_code_free(pcre2_code *<i>code</i>);</b>
+</P>
+<br><b>
+DESCRIPTION
+</b><br>
+<P>
+This function frees the memory used for a compiled pattern, including any
+memory used by the JIT compiler.
+</P>
+<P>
+There is a complete description of the PCRE2 native API in the
+<a href="pcre2api.html"><b>pcre2api</b></a>
+page and a description of the POSIX API in the
+<a href="pcre2posix.html"><b>pcre2posix</b></a>
+page.
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
diff --git a/dist2/doc/html/pcre2_compile.html b/dist2/doc/html/pcre2_compile.html
new file mode 100644
index 0000000..544f4fe
--- /dev/null
+++ b/dist2/doc/html/pcre2_compile.html
@@ -0,0 +1,91 @@
+<html>
+<head>
+<title>pcre2_compile specification</title>
+</head>
+<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
+<h1>pcre2_compile man page</h1>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
+<p>
+This page is part of the PCRE2 HTML documentation. It was generated
+automatically from the original man page. If there is any nonsense in it,
+please consult the man page, in case the conversion went wrong.
+<br>
+<br><b>
+SYNOPSIS
+</b><br>
+<P>
+<b>#include &#60;pcre2.h&#62;</b>
+</P>
+<P>
+<b>pcre2_code *pcre2_compile(PCRE2_SPTR <i>pattern</i>, PCRE2_SIZE <i>length</i>,</b>
+<b>  uint32_t <i>options</i>, int *<i>errorcode</i>, PCRE2_SIZE *<i>erroroffset,</i></b>
+<b>  pcre2_compile_context *<i>ccontext</i>);</b>
+</P>
+<br><b>
+DESCRIPTION
+</b><br>
+<P>
+This function compiles a regular expression pattern into an internal form. Its
+arguments are:
+<pre>
+  <i>pattern</i>       A string containing expression to be compiled
+  <i>length</i>        The length of the string or PCRE2_ZERO_TERMINATED
+  <i>options</i>       Option bits
+  <i>errorcode</i>     Where to put an error code
+  <i>erroffset</i>     Where to put an error offset
+  <i>ccontext</i>      Pointer to a compile context or NULL
+</pre>
+The length of the string and any error offset that is returned are in code
+units, not characters. A compile context is needed only if you want to change
+<pre>
+  What \R matches (Unicode newlines or CR, LF, CRLF only)
+  PCRE2's character tables
+  The newline character sequence
+  The compile time nested parentheses limit
+</pre>
+or provide an external function for stack size checking. The option bits are:
+<pre>
+  PCRE2_ANCHORED           Force pattern anchoring
+  PCRE2_ALT_BSUX           Alternative handling of \u, \U, and \x
+  PCRE2_ALT_CIRCUMFLEX     Alternative handling of ^ in multiline mode
+  PCRE2_AUTO_CALLOUT       Compile automatic callouts
+  PCRE2_CASELESS           Do caseless matching
+  PCRE2_DOLLAR_ENDONLY     $ not to match newline at end
+  PCRE2_DOTALL             . matches anything including NL
+  PCRE2_DUPNAMES           Allow duplicate names for subpatterns
+  PCRE2_EXTENDED           Ignore white space and # comments
+  PCRE2_FIRSTLINE          Force matching to be before newline
+  PCRE2_MATCH_UNSET_BACKREF  Match unset back references
+  PCRE2_MULTILINE          ^ and $ match newlines within data
+  PCRE2_NEVER_BACKSLASH_C  Lock out the use of \C in patterns
+  PCRE2_NEVER_UCP          Lock out PCRE2_UCP, e.g. via (*UCP)
+  PCRE2_NEVER_UTF          Lock out PCRE2_UTF, e.g. via (*UTF)
+  PCRE2_NO_AUTO_CAPTURE    Disable numbered capturing paren-
+                            theses (named ones available)
+  PCRE2_NO_AUTO_POSSESS    Disable auto-possessification
+  PCRE2_NO_DOTSTAR_ANCHOR  Disable automatic anchoring for .*
+  PCRE2_NO_START_OPTIMIZE  Disable match-time start optimizations
+  PCRE2_NO_UTF_CHECK       Do not check the pattern for UTF validity
+                             (only relevant if PCRE2_UTF is set)
+  PCRE2_UCP                Use Unicode properties for \d, \w, etc.
+  PCRE2_UNGREEDY           Invert greediness of quantifiers
+  PCRE2_UTF                Treat pattern and subjects as UTF strings
+</pre>
+PCRE2 must be built with Unicode support in order to use PCRE2_UTF, PCRE2_UCP
+and related options.
+</P>
+<P>
+The yield of the function is a pointer to a private data structure that
+contains the compiled pattern, or NULL if an error was detected.
+</P>
+<P>
+There is a complete description of the PCRE2 native API in the
+<a href="pcre2api.html"><b>pcre2api</b></a>
+page and a description of the POSIX API in the
+<a href="pcre2posix.html"><b>pcre2posix</b></a>
+page.
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
diff --git a/dist2/doc/html/pcre2_compile_context_copy.html b/dist2/doc/html/pcre2_compile_context_copy.html
new file mode 100644
index 0000000..9e9884b
--- /dev/null
+++ b/dist2/doc/html/pcre2_compile_context_copy.html
@@ -0,0 +1,41 @@
+<html>
+<head>
+<title>pcre2_compile_context_copy specification</title>
+</head>
+<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
+<h1>pcre2_compile_context_copy man page</h1>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
+<p>
+This page is part of the PCRE2 HTML documentation. It was generated
+automatically from the original man page. If there is any nonsense in it,
+please consult the man page, in case the conversion went wrong.
+<br>
+<br><b>
+SYNOPSIS
+</b><br>
+<P>
+<b>#include &#60;pcre2.h&#62;</b>
+</P>
+<P>
+<b>pcre2_compile_context *pcre2_compile_context_copy(</b>
+<b>  pcre2_compile_context *<i>ccontext</i>);</b>
+</P>
+<br><b>
+DESCRIPTION
+</b><br>
+<P>
+This function makes a new copy of a compile context, using the memory
+allocation function that was used for the original context. The result is NULL
+if the memory cannot be obtained.
+</P>
+<P>
+There is a complete description of the PCRE2 native API in the
+<a href="pcre2api.html"><b>pcre2api</b></a>
+page and a description of the POSIX API in the
+<a href="pcre2posix.html"><b>pcre2posix</b></a>
+page.
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
diff --git a/dist2/doc/html/pcre2_compile_context_create.html b/dist2/doc/html/pcre2_compile_context_create.html
new file mode 100644
index 0000000..5eacd4e
--- /dev/null
+++ b/dist2/doc/html/pcre2_compile_context_create.html
@@ -0,0 +1,42 @@
+<html>
+<head>
+<title>pcre2_compile_context_create specification</title>
+</head>
+<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
+<h1>pcre2_compile_context_create man page</h1>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
+<p>
+This page is part of the PCRE2 HTML documentation. It was generated
+automatically from the original man page. If there is any nonsense in it,
+please consult the man page, in case the conversion went wrong.
+<br>
+<br><b>
+SYNOPSIS
+</b><br>
+<P>
+<b>#include &#60;pcre2.h&#62;</b>
+</P>
+<P>
+<b>pcre2_compile_context *pcre2_compile_context_create(</b>
+<b>  pcre2_general_context *<i>gcontext</i>);</b>
+</P>
+<br><b>
+DESCRIPTION
+</b><br>
+<P>
+This function creates and initializes a new compile context. If its argument is
+NULL, <b>malloc()</b> is used to get the necessary memory; otherwise the memory
+allocation function within the general context is used. The result is NULL if
+the memory could not be obtained.
+</P>
+<P>
+There is a complete description of the PCRE2 native API in the
+<a href="pcre2api.html"><b>pcre2api</b></a>
+page and a description of the POSIX API in the
+<a href="pcre2posix.html"><b>pcre2posix</b></a>
+page.
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
diff --git a/dist2/doc/html/pcre2_compile_context_free.html b/dist2/doc/html/pcre2_compile_context_free.html
new file mode 100644
index 0000000..ea67a18
--- /dev/null
+++ b/dist2/doc/html/pcre2_compile_context_free.html
@@ -0,0 +1,40 @@
+<html>
+<head>
+<title>pcre2_compile_context_free specification</title>
+</head>
+<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
+<h1>pcre2_compile_context_free man page</h1>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
+<p>
+This page is part of the PCRE2 HTML documentation. It was generated
+automatically from the original man page. If there is any nonsense in it,
+please consult the man page, in case the conversion went wrong.
+<br>
+<br><b>
+SYNOPSIS
+</b><br>
+<P>
+<b>#include &#60;pcre2.h&#62;</b>
+</P>
+<P>
+<b>void pcre2_compile_context_free(pcre2_compile_context *<i>ccontext</i>);</b>
+</P>
+<br><b>
+DESCRIPTION
+</b><br>
+<P>
+This function frees the memory occupied by a compile context, using the memory
+freeing function from the general context with which it was created, or
+<b>free()</b> if that was not set.
+</P>
+<P>
+There is a complete description of the PCRE2 native API in the
+<a href="pcre2api.html"><b>pcre2api</b></a>
+page and a description of the POSIX API in the
+<a href="pcre2posix.html"><b>pcre2posix</b></a>
+page.
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
diff --git a/dist2/doc/html/pcre2_config.html b/dist2/doc/html/pcre2_config.html
new file mode 100644
index 0000000..a51b0c7
--- /dev/null
+++ b/dist2/doc/html/pcre2_config.html
@@ -0,0 +1,83 @@
+<html>
+<head>
+<title>pcre2_config specification</title>
+</head>
+<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
+<h1>pcre2_config man page</h1>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
+<p>
+This page is part of the PCRE2 HTML documentation. It was generated
+automatically from the original man page. If there is any nonsense in it,
+please consult the man page, in case the conversion went wrong.
+<br>
+<br><b>
+SYNOPSIS
+</b><br>
+<P>
+<b>#include &#60;pcre2.h&#62;</b>
+</P>
+<P>
+<b>int pcre2_config(uint32_t <i>what</i>, void *<i>where</i>);</b>
+</P>
+<br><b>
+DESCRIPTION
+</b><br>
+<P>
+This function makes it possible for a client program to find out which optional
+features are available in the version of the PCRE2 library it is using. The
+arguments are as follows:
+<pre>
+  <i>what</i>     A code specifying what information is required
+  <i>where</i>    Points to where to put the information
+</pre>
+If <i>where</i> is NULL, the function returns the amount of memory needed for
+the requested information. When the information is a string, the value is in
+code units; for other types of data it is in bytes.
+</P>
+<P>
+If <b>where</b> is not NULL, for PCRE2_CONFIG_JITTARGET,
+PCRE2_CONFIG_UNICODE_VERSION, and PCRE2_CONFIG_VERSION it must point to a
+buffer that is large enough to hold the string. For all other codes it must
+point to a uint32_t integer variable. The available codes are:
+<pre>
+  PCRE2_CONFIG_BSR             Indicates what \R matches by default:
+                                 PCRE2_BSR_UNICODE
+                                 PCRE2_BSR_ANYCRLF
+  PCRE2_CONFIG_JIT             Availability of just-in-time compiler
+                                support (1=yes 0=no)
+  PCRE2_CONFIG_JITTARGET       Information about the target archi-
+                                 tecture for the JIT compiler
+  PCRE2_CONFIG_LINKSIZE        Configured internal link size (2, 3, 4)
+  PCRE2_CONFIG_MATCHLIMIT      Default internal resource limit
+  PCRE2_CONFIG_NEWLINE         Code for the default newline sequence:
+                                 PCRE2_NEWLINE_CR
+                                 PCRE2_NEWLINE_LF
+                                 PCRE2_NEWLINE_CRLF
+                                 PCRE2_NEWLINE_ANY
+                                 PCRE2_NEWLINE_ANYCRLF
+  PCRE2_CONFIG_PARENSLIMIT     Default parentheses nesting limit
+  PCRE2_CONFIG_RECURSIONLIMIT  Internal recursion depth limit
+  PCRE2_CONFIG_STACKRECURSE    Recursion implementation (1=stack
+                                 0=heap)
+  PCRE2_CONFIG_UNICODE         Availability of Unicode support (1=yes
+                                 0=no)
+  PCRE2_CONFIG_UNICODE_VERSION The Unicode version (a string)
+  PCRE2_CONFIG_VERSION         The PCRE2 version (a string)
+</pre>
+The function yields a non-negative value on success or the negative value
+PCRE2_ERROR_BADOPTION otherwise. This is also the result for the
+PCRE2_CONFIG_JITTARGET code if JIT support is not available. When a string is
+requested, the function returns the number of code units used, including the
+terminating zero.
+</P>
+<P>
+There is a complete description of the PCRE2 native API in the
+<a href="pcre2api.html"><b>pcre2api</b></a>
+page and a description of the POSIX API in the
+<a href="pcre2posix.html"><b>pcre2posix</b></a>
+page.
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
diff --git a/dist2/doc/html/pcre2_dfa_match.html b/dist2/doc/html/pcre2_dfa_match.html
new file mode 100644
index 0000000..e137a14
--- /dev/null
+++ b/dist2/doc/html/pcre2_dfa_match.html
@@ -0,0 +1,79 @@
+<html>
+<head>
+<title>pcre2_dfa_match specification</title>
+</head>
+<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
+<h1>pcre2_dfa_match man page</h1>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
+<p>
+This page is part of the PCRE2 HTML documentation. It was generated
+automatically from the original man page. If there is any nonsense in it,
+please consult the man page, in case the conversion went wrong.
+<br>
+<br><b>
+SYNOPSIS
+</b><br>
+<P>
+<b>#include &#60;pcre2.h&#62;</b>
+</P>
+<P>
+<b>int pcre2_dfa_match(const pcre2_code *<i>code</i>, PCRE2_SPTR <i>subject</i>,</b>
+<b>  PCRE2_SIZE <i>length</i>, PCRE2_SIZE <i>startoffset</i>,</b>
+<b>  uint32_t <i>options</i>, pcre2_match_data *<i>match_data</i>,</b>
+<b>  pcre2_match_context *<i>mcontext</i>,</b>
+<b>  int *<i>workspace</i>, PCRE2_SIZE <i>wscount</i>);</b>
+</P>
+<br><b>
+DESCRIPTION
+</b><br>
+<P>
+This function matches a compiled regular expression against a given subject
+string, using an alternative matching algorithm that scans the subject string
+just once (<i>not</i> Perl-compatible). (The Perl-compatible matching function
+is <b>pcre2_match()</b>.) The arguments for this function are:
+<pre>
+  <i>code</i>         Points to the compiled pattern
+  <i>subject</i>      Points to the subject string
+  <i>length</i>       Length of the subject string
+  <i>startoffset</i>  Offset in the subject at which to start matching
+  <i>options</i>      Option bits
+  <i>match_data</i>   Points to a match data block, for results
+  <i>mcontext</i>     Points to a match context, or is NULL
+  <i>workspace</i>    Points to a vector of ints used as working space
+  <i>wscount</i>      Number of elements in the vector
+</pre>
+For <b>pcre2_dfa_match()</b>, a match context is needed only if you want to set
+up a callout function. The <i>length</i> and <i>startoffset</i> values are code
+units, not characters. The options are:
+<pre>
+  PCRE2_ANCHORED          Match only at the first position
+  PCRE2_NOTBOL            Subject is not the beginning of a line
+  PCRE2_NOTEOL            Subject is not the end of a line
+  PCRE2_NOTEMPTY          An empty string is not a valid match
+  PCRE2_NOTEMPTY_ATSTART  An empty string at the start of the subject
+                           is not a valid match
+  PCRE2_NO_UTF_CHECK      Do not check the subject for UTF
+                           validity (only relevant if PCRE2_UTF
+                           was set at compile time)
+  PCRE2_PARTIAL_SOFT      Return PCRE2_ERROR_PARTIAL for a partial
+                            match if no full matches are found
+  PCRE2_PARTIAL_HARD      Return PCRE2_ERROR_PARTIAL for a partial match
+                           even if there is a full match as well
+  PCRE2_DFA_RESTART       Restart after a partial match
+  PCRE2_DFA_SHORTEST      Return only the shortest match
+</pre>
+There are restrictions on what may appear in a pattern when using this matching
+function. Details are given in the
+<a href="pcre2matching.html"><b>pcre2matching</b></a>
+documentation. For details of partial matching, see the
+<a href="pcre2partial.html"><b>pcre2partial</b></a>
+page. There is a complete description of the PCRE2 native API in the
+<a href="pcre2api.html"><b>pcre2api</b></a>
+page and a description of the POSIX API in the
+<a href="pcre2posix.html"><b>pcre2posix</b></a>
+page.
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
diff --git a/dist2/doc/html/pcre2_general_context_copy.html b/dist2/doc/html/pcre2_general_context_copy.html
new file mode 100644
index 0000000..0018534
--- /dev/null
+++ b/dist2/doc/html/pcre2_general_context_copy.html
@@ -0,0 +1,42 @@
+<html>
+<head>
+<title>pcre2_general_context_copy specification</title>
+</head>
+<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
+<h1>pcre2_general_context_copy man page</h1>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
+<p>
+This page is part of the PCRE2 HTML documentation. It was generated
+automatically from the original man page. If there is any nonsense in it,
+please consult the man page, in case the conversion went wrong.
+<br>
+<br><b>
+SYNOPSIS
+</b><br>
+<P>
+<b>#include &#60;pcre2.h&#62;</b>
+</P>
+<P>
+<b>pcre2_general_context *pcre2_general_context_copy(</b>
+<b>  pcre2_general_context *<i>gcontext</i>);</b>
+</P>
+<br><b>
+DESCRIPTION
+</b><br>
+<P>
+This function makes a new copy of a general context, using the memory
+allocation functions in the context, if set, to get the necessary memory.
+Otherwise <b>malloc()</b> is used. The result is NULL if the memory cannot be
+obtained.
+</P>
+<P>
+There is a complete description of the PCRE2 native API in the
+<a href="pcre2api.html"><b>pcre2api</b></a>
+page and a description of the POSIX API in the
+<a href="pcre2posix.html"><b>pcre2posix</b></a>
+page.
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
diff --git a/dist2/doc/html/pcre2_general_context_create.html b/dist2/doc/html/pcre2_general_context_create.html
new file mode 100644
index 0000000..bc31ee8
--- /dev/null
+++ b/dist2/doc/html/pcre2_general_context_create.html
@@ -0,0 +1,44 @@
+<html>
+<head>
+<title>pcre2_general_context_create specification</title>
+</head>
+<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
+<h1>pcre2_general_context_create man page</h1>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
+<p>
+This page is part of the PCRE2 HTML documentation. It was generated
+automatically from the original man page. If there is any nonsense in it,
+please consult the man page, in case the conversion went wrong.
+<br>
+<br><b>
+SYNOPSIS
+</b><br>
+<P>
+<b>#include &#60;pcre2.h&#62;</b>
+</P>
+<P>
+<b>pcre2_general_context *pcre2_general_context_create(</b>
+<b>  void *(*<i>private_malloc</i>)(PCRE2_SIZE, void *),</b>
+<b>  void (*<i>private_free</i>)(void *, void *), void *<i>memory_data</i>);</b>
+</P>
+<br><b>
+DESCRIPTION
+</b><br>
+<P>
+This function creates and initializes a general context. The arguments define
+custom memory management functions and a data value that is passed to them when
+they are called. The <b>private_malloc()</b> function is used to get memory for
+the context. If either of the first two arguments is NULL, the system memory
+management function is used. The result is NULL if no memory could be obtained.
+</P>
+<P>
+There is a complete description of the PCRE2 native API in the
+<a href="pcre2api.html"><b>pcre2api</b></a>
+page and a description of the POSIX API in the
+<a href="pcre2posix.html"><b>pcre2posix</b></a>
+page.
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
diff --git a/dist2/doc/html/pcre2_general_context_free.html b/dist2/doc/html/pcre2_general_context_free.html
new file mode 100644
index 0000000..ec818ef
--- /dev/null
+++ b/dist2/doc/html/pcre2_general_context_free.html
@@ -0,0 +1,39 @@
+<html>
+<head>
+<title>pcre2_general_context_free specification</title>
+</head>
+<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
+<h1>pcre2_general_context_free man page</h1>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
+<p>
+This page is part of the PCRE2 HTML documentation. It was generated
+automatically from the original man page. If there is any nonsense in it,
+please consult the man page, in case the conversion went wrong.
+<br>
+<br><b>
+SYNOPSIS
+</b><br>
+<P>
+<b>#include &#60;pcre2.h&#62;</b>
+</P>
+<P>
+<b>void pcre2_general_context_free(pcre2_general_context *<i>gcontext</i>);</b>
+</P>
+<br><b>
+DESCRIPTION
+</b><br>
+<P>
+This function frees the memory occupied by a general context, using the memory
+freeing function within the context, if set.
+</P>
+<P>
+There is a complete description of the PCRE2 native API in the
+<a href="pcre2api.html"><b>pcre2api</b></a>
+page and a description of the POSIX API in the
+<a href="pcre2posix.html"><b>pcre2posix</b></a>
+page.
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
diff --git a/dist2/doc/html/pcre2_get_error_message.html b/dist2/doc/html/pcre2_get_error_message.html
new file mode 100644
index 0000000..5d42291
--- /dev/null
+++ b/dist2/doc/html/pcre2_get_error_message.html
@@ -0,0 +1,48 @@
+<html>
+<head>
+<title>pcre2_get_error_message specification</title>
+</head>
+<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
+<h1>pcre2_get_error_message man page</h1>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
+<p>
+This page is part of the PCRE2 HTML documentation. It was generated
+automatically from the original man page. If there is any nonsense in it,
+please consult the man page, in case the conversion went wrong.
+<br>
+<br><b>
+SYNOPSIS
+</b><br>
+<P>
+<b>#include &#60;pcre2.h&#62;</b>
+</P>
+<P>
+<b>int pcre2_get_error_message(int <i>errorcode</i>, PCRE2_UCHAR *<i>buffer</i>,</b>
+<b>  PCRE2_SIZE <i>bufflen</i>);</b>
+</P>
+<br><b>
+DESCRIPTION
+</b><br>
+<P>
+This function provides a textual error message for each PCRE2 error code.
+Compilation errors are positive numbers; UTF formatting errors and matching
+errors are negative numbers. The arguments are:
+<pre>
+  <i>errorcode</i>   an error code (positive or negative)
+  <i>buffer</i>      where to put the message
+  <i>bufflen</i>     the length of the buffer (code units)
+</pre>
+The function returns the length of the message, excluding the trailing zero, or
+a negative error code if the buffer is too small.
+</P>
+<P>
+There is a complete description of the PCRE2 native API in the
+<a href="pcre2api.html"><b>pcre2api</b></a>
+page and a description of the POSIX API in the
+<a href="pcre2posix.html"><b>pcre2posix</b></a>
+page.
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
diff --git a/dist2/doc/html/pcre2_get_mark.html b/dist2/doc/html/pcre2_get_mark.html
new file mode 100644
index 0000000..f8e50e3
--- /dev/null
+++ b/dist2/doc/html/pcre2_get_mark.html
@@ -0,0 +1,43 @@
+<html>
+<head>
+<title>pcre2_get_mark specification</title>
+</head>
+<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
+<h1>pcre2_get_mark man page</h1>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
+<p>
+This page is part of the PCRE2 HTML documentation. It was generated
+automatically from the original man page. If there is any nonsense in it,
+please consult the man page, in case the conversion went wrong.
+<br>
+<br><b>
+SYNOPSIS
+</b><br>
+<P>
+<b>#include &#60;pcre2.h&#62;</b>
+</P>
+<P>
+<b>PCRE2_SPTR pcre2_get_mark(pcre2_match_data *<i>match_data</i>);</b>
+</P>
+<br><b>
+DESCRIPTION
+</b><br>
+<P>
+After a call of <b>pcre2_match()</b> that was passed the match block that is
+this function's argument, this function returns a pointer to the last (*MARK)
+name that was encountered. The name is zero-terminated, and is within the
+compiled pattern. If no (*MARK) name is available, NULL is returned. A (*MARK)
+name may be available after a failed match or a partial match, as well as after
+a successful one.
+</P>
+<P>
+There is a complete description of the PCRE2 native API in the
+<a href="pcre2api.html"><b>pcre2api</b></a>
+page and a description of the POSIX API in the
+<a href="pcre2posix.html"><b>pcre2posix</b></a>
+page.
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
diff --git a/dist2/doc/html/pcre2_get_ovector_count.html b/dist2/doc/html/pcre2_get_ovector_count.html
new file mode 100644
index 0000000..05aacb6
--- /dev/null
+++ b/dist2/doc/html/pcre2_get_ovector_count.html
@@ -0,0 +1,39 @@
+<html>
+<head>
+<title>pcre2_get_ovector_count specification</title>
+</head>
+<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
+<h1>pcre2_get_ovector_count man page</h1>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
+<p>
+This page is part of the PCRE2 HTML documentation. It was generated
+automatically from the original man page. If there is any nonsense in it,
+please consult the man page, in case the conversion went wrong.
+<br>
+<br><b>
+SYNOPSIS
+</b><br>
+<P>
+<b>#include &#60;pcre2.h&#62;</b>
+</P>
+<P>
+<b>uint32_t pcre2_get_ovector_count(pcre2_match_data *<i>match_data</i>);</b>
+</P>
+<br><b>
+DESCRIPTION
+</b><br>
+<P>
+This function returns the number of pairs of offsets in the ovector that forms
+part of the given match data block.
+</P>
+<P>
+There is a complete description of the PCRE2 native API in the
+<a href="pcre2api.html"><b>pcre2api</b></a>
+page and a description of the POSIX API in the
+<a href="pcre2posix.html"><b>pcre2posix</b></a>
+page.
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
diff --git a/dist2/doc/html/pcre2_get_ovector_pointer.html b/dist2/doc/html/pcre2_get_ovector_pointer.html
new file mode 100644
index 0000000..ff6317e
--- /dev/null
+++ b/dist2/doc/html/pcre2_get_ovector_pointer.html
@@ -0,0 +1,40 @@
+<html>
+<head>
+<title>pcre2_get_ovector_pointer specification</title>
+</head>
+<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
+<h1>pcre2_get_ovector_pointer man page</h1>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
+<p>
+This page is part of the PCRE2 HTML documentation. It was generated
+automatically from the original man page. If there is any nonsense in it,
+please consult the man page, in case the conversion went wrong.
+<br>
+<br><b>
+SYNOPSIS
+</b><br>
+<P>
+<b>#include &#60;pcre2.h&#62;</b>
+</P>
+<P>
+<b>PCRE2_SIZE *pcre2_get_ovector_pointer(pcre2_match_data *<i>match_data</i>);</b>
+</P>
+<br><b>
+DESCRIPTION
+</b><br>
+<P>
+This function returns a pointer to the vector of offsets that forms part of the
+given match data block. The number of pairs can be found by calling
+<b>pcre2_get_ovector_count()</b>.
+</P>
+<P>
+There is a complete description of the PCRE2 native API in the
+<a href="pcre2api.html"><b>pcre2api</b></a>
+page and a description of the POSIX API in the
+<a href="pcre2posix.html"><b>pcre2posix</b></a>
+page.
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
diff --git a/dist2/doc/html/pcre2_get_startchar.html b/dist2/doc/html/pcre2_get_startchar.html
new file mode 100644
index 0000000..d2c28b2
--- /dev/null
+++ b/dist2/doc/html/pcre2_get_startchar.html
@@ -0,0 +1,44 @@
+<html>
+<head>
+<title>pcre2_get_startchar specification</title>
+</head>
+<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
+<h1>pcre2_get_startchar man page</h1>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
+<p>
+This page is part of the PCRE2 HTML documentation. It was generated
+automatically from the original man page. If there is any nonsense in it,
+please consult the man page, in case the conversion went wrong.
+<br>
+<br><b>
+SYNOPSIS
+</b><br>
+<P>
+<b>#include &#60;pcre2.h&#62;</b>
+</P>
+<P>
+<b>PCRE2_SIZE pcre2_get_startchar(pcre2_match_data *<i>match_data</i>);</b>
+</P>
+<br><b>
+DESCRIPTION
+</b><br>
+<P>
+After a successful call of <b>pcre2_match()</b> that was passed the match block
+that is this function's argument, this function returns the code unit offset of
+the character at which the successful match started. For a non-partial match,
+this can be different to the value of <i>ovector[0]</i> if the pattern contains
+the \K escape sequence. After a partial match, however, this value is always
+the same as <i>ovector[0]</i> because \K does not affect the result of a
+partial match.
+</P>
+<P>
+There is a complete description of the PCRE2 native API in the
+<a href="pcre2api.html"><b>pcre2api</b></a>
+page and a description of the POSIX API in the
+<a href="pcre2posix.html"><b>pcre2posix</b></a>
+page.
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
diff --git a/dist2/doc/html/pcre2_jit_compile.html b/dist2/doc/html/pcre2_jit_compile.html
new file mode 100644
index 0000000..15b0138
--- /dev/null
+++ b/dist2/doc/html/pcre2_jit_compile.html
@@ -0,0 +1,56 @@
+<html>
+<head>
+<title>pcre2_jit_compile specification</title>
+</head>
+<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
+<h1>pcre2_jit_compile man page</h1>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
+<p>
+This page is part of the PCRE2 HTML documentation. It was generated
+automatically from the original man page. If there is any nonsense in it,
+please consult the man page, in case the conversion went wrong.
+<br>
+<br><b>
+SYNOPSIS
+</b><br>
+<P>
+<b>#include &#60;pcre2.h&#62;</b>
+</P>
+<P>
+<b>int pcre2_jit_compile(pcre2_code *<i>code</i>, uint32_t <i>options</i>);</b>
+</P>
+<br><b>
+DESCRIPTION
+</b><br>
+<P>
+This function requests JIT compilation, which, if the just-in-time compiler is
+available, further processes a compiled pattern into machine code that executes
+much faster than the <b>pcre2_match()</b> interpretive matching function. Full
+details are given in the
+<a href="pcre2jit.html"><b>pcre2jit</b></a>
+documentation.
+</P>
+<P>
+The first argument is a pointer that was returned by a successful call to
+<b>pcre2_compile()</b>, and the second must contain one or more of the following
+bits:
+<pre>
+  PCRE2_JIT_COMPLETE      compile code for full matching
+  PCRE2_JIT_PARTIAL_SOFT  compile code for soft partial matching
+  PCRE2_JIT_PARTIAL_HARD  compile code for hard partial matching
+</pre>
+The yield of the function is 0 for success, or a negative error code otherwise.
+In particular, PCRE2_ERROR_JIT_BADOPTION is returned if JIT is not supported or
+if an unknown bit is set in <i>options</i>.
+</P>
+<P>
+There is a complete description of the PCRE2 native API in the
+<a href="pcre2api.html"><b>pcre2api</b></a>
+page and a description of the POSIX API in the
+<a href="pcre2posix.html"><b>pcre2posix</b></a>
+page.
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
diff --git a/dist2/doc/html/pcre2_jit_free_unused_memory.html b/dist2/doc/html/pcre2_jit_free_unused_memory.html
new file mode 100644
index 0000000..8b59b8e
--- /dev/null
+++ b/dist2/doc/html/pcre2_jit_free_unused_memory.html
@@ -0,0 +1,43 @@
+<html>
+<head>
+<title>pcre2_jit_free_unused_memory specification</title>
+</head>
+<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
+<h1>pcre2_jit_free_unused_memory man page</h1>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
+<p>
+This page is part of the PCRE2 HTML documentation. It was generated
+automatically from the original man page. If there is any nonsense in it,
+please consult the man page, in case the conversion went wrong.
+<br>
+<br><b>
+SYNOPSIS
+</b><br>
+<P>
+<b>#include &#60;pcre2.h&#62;</b>
+</P>
+<P>
+<b>void pcre2_jit_free_unused_memory(pcre2_general_context *<i>gcontext</i>);</b>
+</P>
+<br><b>
+DESCRIPTION
+</b><br>
+<P>
+This function frees unused JIT executable memory. The argument is a general
+context, for custom memory management, or NULL for standard memory management.
+JIT memory allocation retains some memory in order to improve future JIT
+compilation speed. In low memory conditions,
+\fBpcre2_jit_free_unused_memory()\fB can be used to cause this memory to be
+freed.
+</P>
+<P>
+There is a complete description of the PCRE2 native API in the
+<a href="pcre2api.html"><b>pcre2api</b></a>
+page and a description of the POSIX API in the
+<a href="pcre2posix.html"><b>pcre2posix</b></a>
+page.
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
diff --git a/dist2/doc/html/pcre2_jit_match.html b/dist2/doc/html/pcre2_jit_match.html
new file mode 100644
index 0000000..1d59667
--- /dev/null
+++ b/dist2/doc/html/pcre2_jit_match.html
@@ -0,0 +1,58 @@
+<html>
+<head>
+<title>pcre2_jit_match specification</title>
+</head>
+<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
+<h1>pcre2_jit_match man page</h1>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
+<p>
+This page is part of the PCRE2 HTML documentation. It was generated
+automatically from the original man page. If there is any nonsense in it,
+please consult the man page, in case the conversion went wrong.
+<br>
+<br><b>
+SYNOPSIS
+</b><br>
+<P>
+<b>#include &#60;pcre2.h&#62;</b>
+</P>
+<P>
+<b>int pcre2_jit_match(const pcre2_code *<i>code</i>, PCRE2_SPTR <i>subject</i>,</b>
+<b>  PCRE2_SIZE <i>length</i>, PCRE2_SIZE <i>startoffset</i>,</b>
+<b>  uint32_t <i>options</i>, pcre2_match_data *<i>match_data</i>,</b>
+<b>  pcre2_match_context *<i>mcontext</i>);</b>
+</P>
+<br><b>
+DESCRIPTION
+</b><br>
+<P>
+This function matches a compiled regular expression that has been successfully
+processed by the JIT compiler against a given subject string, using a matching
+algorithm that is similar to Perl's. It is a "fast path" interface to JIT, and
+it bypasses some of the sanity checks that <b>pcre2_match()</b> applies.
+Its arguments are exactly the same as for
+<a href="pcre2_match.html"><b>pcre2_match()</b>.</a>
+</P>
+<P>
+The supported options are PCRE2_NOTBOL, PCRE2_NOTEOL, PCRE2_NOTEMPTY,
+PCRE2_NOTEMPTY_ATSTART, PCRE2_PARTIAL_HARD, and PCRE2_PARTIAL_SOFT. Unsupported
+options are ignored. The subject string is not checked for UTF validity.
+</P>
+<P>
+The return values are the same as for <b>pcre2_match()</b> plus
+PCRE2_ERROR_JIT_BADOPTION if a matching mode (partial or complete) is requested
+that was not compiled. For details of partial matching, see the
+<a href="pcre2partial.html"><b>pcre2partial</b></a>
+page.
+</P>
+<P>
+There is a complete description of the PCRE2 native API in the
+<a href="pcre2api.html"><b>pcre2api</b></a>
+page and a description of the JIT API in the
+<a href="pcre2jit.html"><b>pcre2jit</b></a>
+page.
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
diff --git a/dist2/doc/html/pcre2_jit_stack_assign.html b/dist2/doc/html/pcre2_jit_stack_assign.html
new file mode 100644
index 0000000..e7e3a6a
--- /dev/null
+++ b/dist2/doc/html/pcre2_jit_stack_assign.html
@@ -0,0 +1,70 @@
+<html>
+<head>
+<title>pcre2_jit_stack_assign specification</title>
+</head>
+<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
+<h1>pcre2_jit_stack_assign man page</h1>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
+<p>
+This page is part of the PCRE2 HTML documentation. It was generated
+automatically from the original man page. If there is any nonsense in it,
+please consult the man page, in case the conversion went wrong.
+<br>
+<br><b>
+SYNOPSIS
+</b><br>
+<P>
+<b>#include &#60;pcre2.h&#62;</b>
+</P>
+<P>
+<b>void pcre2_jit_stack_assign(pcre2_match_context *<i>mcontext</i>,</b>
+<b>  pcre2_jit_callback <i>callback_function</i>, void *<i>callback_data</i>);</b>
+</P>
+<br><b>
+DESCRIPTION
+</b><br>
+<P>
+This function provides control over the memory used by JIT as a run-time stack
+when <b>pcre2_match()</b> or <b>pcre2_jit_match()</b> is called with a pattern
+that has been successfully processed by the JIT compiler. The information that
+determines which stack is used is put into a match context that is subsequently
+passed to a matching function. The arguments of this function are:
+<pre>
+  mcontext       a pointer to a match context
+  callback       a callback function
+  callback_data  a JIT stack or a value to be passed to the callback
+</PRE>
+</P>
+<P>
+If <i>callback</i> is NULL and <i>callback_data</i> is NULL, an internal 32K
+block on the machine stack is used.
+</P>
+<P>
+If <i>callback</i> is NULL and <i>callback_data</i> is not NULL,
+<i>callback_data</i> must be a valid JIT stack, the result of calling
+<b>pcre2_jit_stack_create()</b>.
+</P>
+<P>
+If <i>callback</i> not NULL, it is called with <i>callback_data</i> as an
+argument at the start of matching, in order to set up a JIT stack. If the
+result is NULL, the internal 32K stack is used; otherwise the return value must
+be a valid JIT stack, the result of calling <b>pcre2_jit_stack_create()</b>.
+</P>
+<P>
+You may safely use the same JIT stack for multiple patterns, as long as they
+are all matched in the same thread. In a multithread application, each thread
+must use its own JIT stack. For more details, see the
+<a href="pcre2jit.html"><b>pcre2jit</b></a>
+page.
+</P>
+<P>
+There is a complete description of the PCRE2 native API in the
+<a href="pcre2api.html"><b>pcre2api</b></a>
+page and a description of the POSIX API in the
+<a href="pcre2posix.html"><b>pcre2posix</b></a>
+page.
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
diff --git a/dist2/doc/html/pcre2_jit_stack_create.html b/dist2/doc/html/pcre2_jit_stack_create.html
new file mode 100644
index 0000000..a668e34
--- /dev/null
+++ b/dist2/doc/html/pcre2_jit_stack_create.html
@@ -0,0 +1,50 @@
+<html>
+<head>
+<title>pcre2_jit_stack_create specification</title>
+</head>
+<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
+<h1>pcre2_jit_stack_create man page</h1>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
+<p>
+This page is part of the PCRE2 HTML documentation. It was generated
+automatically from the original man page. If there is any nonsense in it,
+please consult the man page, in case the conversion went wrong.
+<br>
+<br><b>
+SYNOPSIS
+</b><br>
+<P>
+<b>#include &#60;pcre2.h&#62;</b>
+</P>
+<P>
+<b>pcre2_jit_stack *pcre2_jit_stack_create(PCRE2_SIZE <i>startsize</i>,</b>
+<b>  PCRE2_SIZE <i>maxsize</i>, pcre2_general_context *<i>gcontext</i>);</b>
+</P>
+<br><b>
+DESCRIPTION
+</b><br>
+<P>
+This function is used to create a stack for use by the code compiled by the JIT
+compiler. The first two arguments are a starting size for the stack, and a
+maximum size to which it is allowed to grow. The final argument is a general
+context, for memory allocation functions, or NULL for standard memory
+allocation. The result can be passed to the JIT run-time code by calling
+<b>pcre2_jit_stack_assign()</b> to associate the stack with a compiled pattern,
+which can then be processed by <b>pcre2_match()</b>. If the "fast path" JIT
+matcher, <b>pcre2_jit_match()</b> is used, the stack can be passed directly as
+an argument. A maximum stack size of 512K to 1M should be more than enough for
+any pattern. For more details, see the
+<a href="pcre2jit.html"><b>pcre2jit</b></a>
+page.
+</P>
+<P>
+There is a complete description of the PCRE2 native API in the
+<a href="pcre2api.html"><b>pcre2api</b></a>
+page and a description of the POSIX API in the
+<a href="pcre2posix.html"><b>pcre2posix</b></a>
+page.
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
diff --git a/dist2/doc/html/pcre2_jit_stack_free.html b/dist2/doc/html/pcre2_jit_stack_free.html
new file mode 100644
index 0000000..21ac276
--- /dev/null
+++ b/dist2/doc/html/pcre2_jit_stack_free.html
@@ -0,0 +1,42 @@
+<html>
+<head>
+<title>pcre2_jit_stack_free specification</title>
+</head>
+<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
+<h1>pcre2_jit_stack_free man page</h1>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
+<p>
+This page is part of the PCRE2 HTML documentation. It was generated
+automatically from the original man page. If there is any nonsense in it,
+please consult the man page, in case the conversion went wrong.
+<br>
+<br><b>
+SYNOPSIS
+</b><br>
+<P>
+<b>#include &#60;pcre2.h&#62;</b>
+</P>
+<P>
+<b>void pcre2_jit_stack_free(pcre2_jit_stack *<i>jit_stack</i>);</b>
+</P>
+<br><b>
+DESCRIPTION
+</b><br>
+<P>
+This function is used to free a JIT stack that was created by
+<b>pcre2_jit_stack_create()</b> when it is no longer needed. For more details,
+see the
+<a href="pcre2jit.html"><b>pcre2jit</b></a>
+page.
+</P>
+<P>
+There is a complete description of the PCRE2 native API in the
+<a href="pcre2api.html"><b>pcre2api</b></a>
+page and a description of the POSIX API in the
+<a href="pcre2posix.html"><b>pcre2posix</b></a>
+page.
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
diff --git a/dist2/doc/html/pcre2_maketables.html b/dist2/doc/html/pcre2_maketables.html
new file mode 100644
index 0000000..068e6d4
--- /dev/null
+++ b/dist2/doc/html/pcre2_maketables.html
@@ -0,0 +1,48 @@
+<html>
+<head>
+<title>pcre2_maketables specification</title>
+</head>
+<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
+<h1>pcre2_maketables man page</h1>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
+<p>
+This page is part of the PCRE2 HTML documentation. It was generated
+automatically from the original man page. If there is any nonsense in it,
+please consult the man page, in case the conversion went wrong.
+<br>
+<br><b>
+SYNOPSIS
+</b><br>
+<P>
+<b>#include &#60;pcre2.h&#62;</b>
+</P>
+<P>
+<b>const unsigned char *pcre2_maketables(pcre22_general_context *<i>gcontext</i>);</b>
+</P>
+<br><b>
+DESCRIPTION
+</b><br>
+<P>
+This function builds a set of character tables for character values less than
+256. These can be passed to <b>pcre2_compile()</b> in a compile context in order
+to override the internal, built-in tables (which were either defaulted or made
+by <b>pcre2_maketables()</b> when PCRE2 was compiled). See the
+<a href="pcre2_set_character_tables.html"><b>pcre2_set_character_tables()</b></a>
+page. You might want to do this if you are using a non-standard locale.
+</P>
+<P>
+If the argument is NULL, <b>malloc()</b> is used to get memory for the tables.
+Otherwise it must point to a general context, which can supply pointers to a
+custom memory manager. The function yields a pointer to the tables.
+</P>
+<P>
+There is a complete description of the PCRE2 native API in the
+<a href="pcre2api.html"><b>pcre2api</b></a>
+page and a description of the POSIX API in the
+<a href="pcre2posix.html"><b>pcre2posix</b></a>
+page.
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
diff --git a/dist2/doc/html/pcre2_match.html b/dist2/doc/html/pcre2_match.html
new file mode 100644
index 0000000..0e389eb
--- /dev/null
+++ b/dist2/doc/html/pcre2_match.html
@@ -0,0 +1,76 @@
+<html>
+<head>
+<title>pcre2_match specification</title>
+</head>
+<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
+<h1>pcre2_match man page</h1>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
+<p>
+This page is part of the PCRE2 HTML documentation. It was generated
+automatically from the original man page. If there is any nonsense in it,
+please consult the man page, in case the conversion went wrong.
+<br>
+<br><b>
+SYNOPSIS
+</b><br>
+<P>
+<b>#include &#60;pcre2.h&#62;</b>
+</P>
+<P>
+<b>int pcre2_match(const pcre2_code *<i>code</i>, PCRE2_SPTR <i>subject</i>,</b>
+<b>  PCRE2_SIZE <i>length</i>, PCRE2_SIZE <i>startoffset</i>,</b>
+<b>  uint32_t <i>options</i>, pcre2_match_data *<i>match_data</i>,</b>
+<b>  pcre2_match_context *<i>mcontext</i>);</b>
+</P>
+<br><b>
+DESCRIPTION
+</b><br>
+<P>
+This function matches a compiled regular expression against a given subject
+string, using a matching algorithm that is similar to Perl's. It returns
+offsets to captured substrings. Its arguments are:
+<pre>
+  <i>code</i>         Points to the compiled pattern
+  <i>subject</i>      Points to the subject string
+  <i>length</i>       Length of the subject string
+  <i>startoffset</i>  Offset in the subject at which to start matching
+  <i>options</i>      Option bits
+  <i>match_data</i>   Points to a match data block, for results
+  <i>mcontext</i>     Points to a match context, or is NULL
+</pre>
+A match context is needed only if you want to:
+<pre>
+  Set up a callout function
+  Change the limit for calling the internal function <i>match()</i>
+  Change the limit for calling <i>match()</i> recursively
+  Set custom memory management when the heap is used for recursion
+</pre>
+The <i>length</i> and <i>startoffset</i> values are code
+units, not characters. The options are:
+<pre>
+  PCRE2_ANCHORED          Match only at the first position
+  PCRE2_NOTBOL            Subject string is not the beginning of a line
+  PCRE2_NOTEOL            Subject string is not the end of a line
+  PCRE2_NOTEMPTY          An empty string is not a valid match
+  PCRE2_NOTEMPTY_ATSTART  An empty string at the start of the subject
+                           is not a valid match
+  PCRE2_NO_UTF_CHECK      Do not check the subject for UTF
+                           validity (only relevant if PCRE2_UTF
+                           was set at compile time)
+  PCRE2_PARTIAL_SOFT      Return PCRE2_ERROR_PARTIAL for a partial
+                            match if no full matches are found
+  PCRE2_PARTIAL_HARD      Return PCRE2_ERROR_PARTIAL for a partial match
+                           if that is found before a full match
+</pre>
+For details of partial matching, see the
+<a href="pcre2partial.html"><b>pcre2partial</b></a>
+page. There is a complete description of the PCRE2 native API in the
+<a href="pcre2api.html"><b>pcre2api</b></a>
+page and a description of the POSIX API in the
+<a href="pcre2posix.html"><b>pcre2posix</b></a>
+page.
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
diff --git a/dist2/doc/html/pcre2_match_context_copy.html b/dist2/doc/html/pcre2_match_context_copy.html
new file mode 100644
index 0000000..4a719d6
--- /dev/null
+++ b/dist2/doc/html/pcre2_match_context_copy.html
@@ -0,0 +1,41 @@
+<html>
+<head>
+<title>pcre2_match_context_copy specification</title>
+</head>
+<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
+<h1>pcre2_match_context_copy man page</h1>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
+<p>
+This page is part of the PCRE2 HTML documentation. It was generated
+automatically from the original man page. If there is any nonsense in it,
+please consult the man page, in case the conversion went wrong.
+<br>
+<br><b>
+SYNOPSIS
+</b><br>
+<P>
+<b>#include &#60;pcre2.h&#62;</b>
+</P>
+<P>
+<b>pcre2_match_context *pcre2_match_context_copy(</b>
+<b>  pcre2_match_context *<i>mcontext</i>);</b>
+</P>
+<br><b>
+DESCRIPTION
+</b><br>
+<P>
+This function makes a new copy of a match context, using the memory
+allocation function that was used for the original context. The result is NULL
+if the memory cannot be obtained.
+</P>
+<P>
+There is a complete description of the PCRE2 native API in the
+<a href="pcre2api.html"><b>pcre2api</b></a>
+page and a description of the POSIX API in the
+<a href="pcre2posix.html"><b>pcre2posix</b></a>
+page.
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
diff --git a/dist2/doc/html/pcre2_match_context_create.html b/dist2/doc/html/pcre2_match_context_create.html
new file mode 100644
index 0000000..f7f2735
--- /dev/null
+++ b/dist2/doc/html/pcre2_match_context_create.html
@@ -0,0 +1,42 @@
+<html>
+<head>
+<title>pcre2_match_context_create specification</title>
+</head>
+<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
+<h1>pcre2_match_context_create man page</h1>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
+<p>
+This page is part of the PCRE2 HTML documentation. It was generated
+automatically from the original man page. If there is any nonsense in it,
+please consult the man page, in case the conversion went wrong.
+<br>
+<br><b>
+SYNOPSIS
+</b><br>
+<P>
+<b>#include &#60;pcre2.h&#62;</b>
+</P>
+<P>
+<b>pcre2_match_context *pcre2_match_context_create(</b>
+<b>  pcre2_general_context *<i>gcontext</i>);</b>
+</P>
+<br><b>
+DESCRIPTION
+</b><br>
+<P>
+This function creates and initializes a new match context. If its argument is
+NULL, <b>malloc()</b> is used to get the necessary memory; otherwise the memory
+allocation function within the general context is used. The result is NULL if
+the memory could not be obtained.
+</P>
+<P>
+There is a complete description of the PCRE2 native API in the
+<a href="pcre2api.html"><b>pcre2api</b></a>
+page and a description of the POSIX API in the
+<a href="pcre2posix.html"><b>pcre2posix</b></a>
+page.
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
diff --git a/dist2/doc/html/pcre2_match_context_free.html b/dist2/doc/html/pcre2_match_context_free.html
new file mode 100644
index 0000000..8248974
--- /dev/null
+++ b/dist2/doc/html/pcre2_match_context_free.html
@@ -0,0 +1,40 @@
+<html>
+<head>
+<title>pcre2_match_context_free specification</title>
+</head>
+<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
+<h1>pcre2_match_context_free man page</h1>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
+<p>
+This page is part of the PCRE2 HTML documentation. It was generated
+automatically from the original man page. If there is any nonsense in it,
+please consult the man page, in case the conversion went wrong.
+<br>
+<br><b>
+SYNOPSIS
+</b><br>
+<P>
+<b>#include &#60;pcre2.h&#62;</b>
+</P>
+<P>
+<b>void pcre2_match_context_free(pcre2_match_context *<i>mcontext</i>);</b>
+</P>
+<br><b>
+DESCRIPTION
+</b><br>
+<P>
+This function frees the memory occupied by a match context, using the memory
+freeing function from the general context with which it was created, or
+<b>free()</b> if that was not set.
+</P>
+<P>
+There is a complete description of the PCRE2 native API in the
+<a href="pcre2api.html"><b>pcre2api</b></a>
+page and a description of the POSIX API in the
+<a href="pcre2posix.html"><b>pcre2posix</b></a>
+page.
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
diff --git a/dist2/doc/html/pcre2_match_data_create.html b/dist2/doc/html/pcre2_match_data_create.html
new file mode 100644
index 0000000..8d0321b
--- /dev/null
+++ b/dist2/doc/html/pcre2_match_data_create.html
@@ -0,0 +1,49 @@
+<html>
+<head>
+<title>pcre2_match_data_create specification</title>
+</head>
+<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
+<h1>pcre2_match_data_create man page</h1>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
+<p>
+This page is part of the PCRE2 HTML documentation. It was generated
+automatically from the original man page. If there is any nonsense in it,
+please consult the man page, in case the conversion went wrong.
+<br>
+<br><b>
+SYNOPSIS
+</b><br>
+<P>
+<b>#include &#60;pcre2.h&#62;</b>
+</P>
+<P>
+<b>pcre2_match_data *pcre2_match_data_create(uint32_t <i>ovecsize</i>,</b>
+<b>  pcre2_general_context *<i>gcontext</i>);</b>
+</P>
+<br><b>
+DESCRIPTION
+</b><br>
+<P>
+This function creates a new match data block, which is used for holding the
+result of a match. The first argument specifies the number of pairs of offsets
+that are required. These form the "output vector" (ovector) within the match
+data block, and are used to identify the matched string and any captured
+substrings. There is always one pair of offsets; if <b>ovecsize</b> is zero, it
+is treated as one.
+</P>
+<P>
+The second argument points to a general context, for custom memory management,
+or is NULL for system memory management. The result of the function is NULL if
+the memory for the block could not be obtained.
+</P>
+<P>
+There is a complete description of the PCRE2 native API in the
+<a href="pcre2api.html"><b>pcre2api</b></a>
+page and a description of the POSIX API in the
+<a href="pcre2posix.html"><b>pcre2posix</b></a>
+page.
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
diff --git a/dist2/doc/html/pcre2_match_data_create_from_pattern.html b/dist2/doc/html/pcre2_match_data_create_from_pattern.html
new file mode 100644
index 0000000..f40cf1e
--- /dev/null
+++ b/dist2/doc/html/pcre2_match_data_create_from_pattern.html
@@ -0,0 +1,50 @@
+<html>
+<head>
+<title>pcre2_match_data_create_from_pattern specification</title>
+</head>
+<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
+<h1>pcre2_match_data_create_from_pattern man page</h1>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
+<p>
+This page is part of the PCRE2 HTML documentation. It was generated
+automatically from the original man page. If there is any nonsense in it,
+please consult the man page, in case the conversion went wrong.
+<br>
+<br><b>
+SYNOPSIS
+</b><br>
+<P>
+<b>#include &#60;pcre2.h&#62;</b>
+</P>
+<P>
+<b>pcre2_match_data *pcre2_match_data_create_from_pattern(</b>
+<b>  const pcre2_code *<i>code</i>, pcre2_general_context *<i>gcontext</i>);</b>
+</P>
+<br><b>
+DESCRIPTION
+</b><br>
+<P>
+This function creates a new match data block, which is used for holding the
+result of a match. The first argument points to a compiled pattern. The number
+of capturing parentheses within the pattern is used to compute the number of
+pairs of offsets that are required in the match data block. These form the
+"output vector" (ovector) within the match data block, and are used to identify
+the matched string and any captured substrings.
+</P>
+<P>
+The second argument points to a general context, for custom memory management,
+or is NULL to use the same memory allocator as was used for the compiled
+pattern. The result of the function is NULL if the memory for the block could
+not be obtained.
+</P>
+<P>
+There is a complete description of the PCRE2 native API in the
+<a href="pcre2api.html"><b>pcre2api</b></a>
+page and a description of the POSIX API in the
+<a href="pcre2posix.html"><b>pcre2posix</b></a>
+page.
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
diff --git a/dist2/doc/html/pcre2_match_data_free.html b/dist2/doc/html/pcre2_match_data_free.html
new file mode 100644
index 0000000..70e107e
--- /dev/null
+++ b/dist2/doc/html/pcre2_match_data_free.html
@@ -0,0 +1,40 @@
+<html>
+<head>
+<title>pcre2_match_data_free specification</title>
+</head>
+<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
+<h1>pcre2_match_data_free man page</h1>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
+<p>
+This page is part of the PCRE2 HTML documentation. It was generated
+automatically from the original man page. If there is any nonsense in it,
+please consult the man page, in case the conversion went wrong.
+<br>
+<br><b>
+SYNOPSIS
+</b><br>
+<P>
+<b>#include &#60;pcre2.h&#62;</b>
+</P>
+<P>
+<b>void pcre2_match_data_free(pcre2_match_data *<i>match_data</i>);</b>
+</P>
+<br><b>
+DESCRIPTION
+</b><br>
+<P>
+This function frees the memory occupied by a match data block, using the memory
+freeing function from the general context with which it was created, or
+<b>free()</b> if that was not set.
+</P>
+<P>
+There is a complete description of the PCRE2 native API in the
+<a href="pcre2api.html"><b>pcre2api</b></a>
+page and a description of the POSIX API in the
+<a href="pcre2posix.html"><b>pcre2posix</b></a>
+page.
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
diff --git a/dist2/doc/html/pcre2_pattern_info.html b/dist2/doc/html/pcre2_pattern_info.html
new file mode 100644
index 0000000..b4cd6f5
--- /dev/null
+++ b/dist2/doc/html/pcre2_pattern_info.html
@@ -0,0 +1,107 @@
+<html>
+<head>
+<title>pcre2_pattern_info specification</title>
+</head>
+<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
+<h1>pcre2_pattern_info man page</h1>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
+<p>
+This page is part of the PCRE2 HTML documentation. It was generated
+automatically from the original man page. If there is any nonsense in it,
+please consult the man page, in case the conversion went wrong.
+<br>
+<br><b>
+SYNOPSIS
+</b><br>
+<P>
+<b>#include &#60;pcre2.h&#62;</b>
+</P>
+<P>
+<b>int pcre2_pattern_info(const pcre2 *<i>code</i>, uint32_t <i>what</i>, void *<i>where</i>);</b>
+</P>
+<br><b>
+DESCRIPTION
+</b><br>
+<P>
+This function returns information about a compiled pattern. Its arguments are:
+<pre>
+  <i>code</i>     Pointer to a compiled regular expression
+  <i>what</i>     What information is required
+  <i>where</i>    Where to put the information
+</pre>
+The recognized values for the <i>what</i> argument, and the information they
+request are as follows:
+<pre>
+  PCRE2_INFO_ALLOPTIONS      Final options after compiling
+  PCRE2_INFO_ARGOPTIONS      Options passed to <b>pcre2_compile()</b>
+  PCRE2_INFO_BACKREFMAX      Number of highest back reference
+  PCRE2_INFO_BSR             What \R matches:
+                               PCRE2_BSR_UNICODE: Unicode line endings
+                               PCRE2_BSR_ANYCRLF: CR, LF, or CRLF only
+  PCRE2_INFO_CAPTURECOUNT    Number of capturing subpatterns
+  PCRE2_INFO_FIRSTBITMAP     Bitmap of first code units, or NULL
+  PCRE2_INFO_FIRSTCODETYPE   Type of start-of-match information
+                               0 nothing set
+                               1 first code unit is set
+                               2 start of string or after newline
+  PCRE2_INFO_FIRSTCODEUNIT   First code unit when type is 1
+  PCRE2_INFO_HASBACKSLASHC   Return 1 if pattern contains \C
+  PCRE2_INFO_HASCRORLF       Return 1 if explicit CR or LF matches
+                               exist in the pattern
+  PCRE2_INFO_JCHANGED        Return 1 if (?J) or (?-J) was used
+  PCRE2_INFO_JITSIZE         Size of JIT compiled code, or 0
+  PCRE2_INFO_LASTCODETYPE    Type of must-be-present information
+                               0 nothing set
+                               1 code unit is set
+  PCRE2_INFO_LASTCODEUNIT    Last code unit when type is 1
+  PCRE2_INFO_MATCHEMPTY      1 if the pattern can match an
+                               empty string, 0 otherwise
+  PCRE2_INFO_MATCHLIMIT      Match limit if set,
+                               otherwise PCRE2_ERROR_UNSET
+  PCRE2_INFO_MAXLOOKBEHIND   Length (in characters) of the longest
+                               lookbehind assertion
+  PCRE2_INFO_MINLENGTH       Lower bound length of matching strings
+  PCRE2_INFO_NAMECOUNT       Number of named subpatterns
+  PCRE2_INFO_NAMEENTRYSIZE   Size of name table entries
+  PCRE2_INFO_NAMETABLE       Pointer to name table
+  PCRE2_CONFIG_NEWLINE       Code for the newline sequence:
+                               PCRE2_NEWLINE_CR
+                               PCRE2_NEWLINE_LF
+                               PCRE2_NEWLINE_CRLF
+                               PCRE2_NEWLINE_ANY
+                               PCRE2_NEWLINE_ANYCRLF
+  PCRE2_INFO_RECURSIONLIMIT  Recursion limit if set,
+                               otherwise PCRE2_ERROR_UNSET
+  PCRE2_INFO_SIZE            Size of compiled pattern
+</pre>
+If <i>where</i> is NULL, the function returns the amount of memory needed for
+the requested information, in bytes. Otherwise, the <i>where</i> argument must
+point to an unsigned 32-bit integer (uint32_t variable), except for the
+following <i>what</i> values, when it must point to a variable of the type
+shown:
+<pre>
+  PCRE2_INFO_FIRSTBITMAP     const uint8_t *
+  PCRE2_INFO_JITSIZE         size_t
+  PCRE2_INFO_NAMETABLE       PCRE2_SPTR
+  PCRE2_INFO_SIZE            size_t
+</pre>
+The yield of the function is zero on success or:
+<pre>
+  PCRE2_ERROR_NULL           the argument <i>code</i> is NULL
+  PCRE2_ERROR_BADMAGIC       the "magic number" was not found
+  PCRE2_ERROR_BADOPTION      the value of <i>what</i> is invalid
+  PCRE2_ERROR_BADMODE        the pattern was compiled in the wrong mode
+  PCRE2_ERROR_UNSET          the requested information is not set
+</PRE>
+</P>
+<P>
+There is a complete description of the PCRE2 native API in the
+<a href="pcre2api.html"><b>pcre2api</b></a>
+page and a description of the POSIX API in the
+<a href="pcre2posix.html"><b>pcre2posix</b></a>
+page.
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
diff --git a/dist2/doc/html/pcre2_serialize_decode.html b/dist2/doc/html/pcre2_serialize_decode.html
new file mode 100644
index 0000000..688398f
--- /dev/null
+++ b/dist2/doc/html/pcre2_serialize_decode.html
@@ -0,0 +1,62 @@
+<html>
+<head>
+<title>pcre2_serialize_decode specification</title>
+</head>
+<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
+<h1>pcre2_serialize_decode man page</h1>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
+<p>
+This page is part of the PCRE2 HTML documentation. It was generated
+automatically from the original man page. If there is any nonsense in it,
+please consult the man page, in case the conversion went wrong.
+<br>
+<br><b>
+SYNOPSIS
+</b><br>
+<P>
+<b>#include &#60;pcre2.h&#62;</b>
+</P>
+<P>
+<b>int32_t pcre2_serialize_decode(pcre2_code **<i>codes</i>,</b>
+<b>  int32_t <i>number_of_codes</i>, const uint8_t *<i>bytes</i>,</b>
+<b>  pcre2_general_context *<i>gcontext</i>);</b>
+</P>
+<br><b>
+DESCRIPTION
+</b><br>
+<P>
+This function decodes a serialized set of compiled patterns back into a list of
+individual patterns. Its arguments are:
+<pre>
+  <i>codes</i>            pointer to a vector in which to build the list
+  <i>number_of_codes</i>  number of slots in the vector
+  <i>bytes</i>            the serialized byte stream
+  <i>gcontext</i>         pointer to a general context or NULL
+</pre>
+The <i>bytes</i> argument must point to a block of data that was originally
+created by <b>pcre2_serialize_encode()</b>, though it may have been saved on
+disc or elsewhere in the meantime. If there are more codes in the serialized
+data than slots in the list, only those compiled patterns that will fit are
+decoded. The yield of the function is the number of decoded patterns, or one of
+the following negative error codes:
+<pre>
+  PCRE2_ERROR_BADDATA   <i>number_of_codes</i> is zero or less
+  PCRE2_ERROR_BADMAGIC  mismatch of id bytes in <i>bytes</i>
+  PCRE2_ERROR_BADMODE   mismatch of variable unit size or PCRE version
+  PCRE2_ERROR_MEMORY    memory allocation failed
+  PCRE2_ERROR_NULL      <i>codes</i> or <i>bytes</i> is NULL
+</pre>
+PCRE2_ERROR_BADMAGIC may mean that the data is corrupt, or that it was compiled
+on a system with different endianness.
+</P>
+<P>
+There is a complete description of the PCRE2 native API in the
+<a href="pcre2api.html"><b>pcre2api</b></a>
+page and a description of the POSIX API in the
+<a href="pcre2posix.html"><b>pcre2posix</b></a>
+page.
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
diff --git a/dist2/doc/html/pcre2_serialize_encode.html b/dist2/doc/html/pcre2_serialize_encode.html
new file mode 100644
index 0000000..08cc46d
--- /dev/null
+++ b/dist2/doc/html/pcre2_serialize_encode.html
@@ -0,0 +1,61 @@
+<html>
+<head>
+<title>pcre2_serialize_encode specification</title>
+</head>
+<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
+<h1>pcre2_serialize_encode man page</h1>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
+<p>
+This page is part of the PCRE2 HTML documentation. It was generated
+automatically from the original man page. If there is any nonsense in it,
+please consult the man page, in case the conversion went wrong.
+<br>
+<br><b>
+SYNOPSIS
+</b><br>
+<P>
+<b>#include &#60;pcre2.h&#62;</b>
+</P>
+<P>
+<b>int32_t pcre2_serialize_encode(const pcre2_code **<i>codes</i>,</b>
+<b>  int32_t <i>number_of_codes</i>, uint8_t **<i>serialized_bytes</i>,</b>
+<b>  PCRE2_SIZE *<i>serialized_size</i>, pcre2_general_context *<i>gcontext</i>);</b>
+</P>
+<br><b>
+DESCRIPTION
+</b><br>
+<P>
+This function encodes a list of compiled patterns into a byte stream that can
+be saved on disc or elsewhere. Its arguments are:
+<pre>
+  <i>codes</i>             pointer to a vector containing the list
+  <i>number_of_codes</i>   number of slots in the vector
+  <i>serialized_bytes</i>  set to point to the serialized byte stream
+  <i>serialized_size</i>   set to the number of bytes in the byte stream
+  <i>gcontext</i>          pointer to a general context or NULL
+</pre>
+The context argument is used to obtain memory for the byte stream. When the
+serialized data is no longer needed, it must be freed by calling
+<b>pcre2_serialize_free()</b>. The yield of the function is the number of
+serialized patterns, or one of the following negative error codes:
+<pre>
+  PCRE2_ERROR_BADDATA      <i>number_of_codes</i> is zero or less
+  PCRE2_ERROR_BADMAGIC     mismatch of id bytes in one of the patterns
+  PCRE2_ERROR_MEMORY       memory allocation failed
+  PCRE2_ERROR_MIXEDTABLES  the patterns do not all use the same tables
+  PCRE2_ERROR_NULL         an argument other than <i>gcontext</i> is NULL
+</pre>
+PCRE2_ERROR_BADMAGIC means either that a pattern's code has been corrupted, or
+that a slot in the vector does not point to a compiled pattern.
+</P>
+<P>
+There is a complete description of the PCRE2 native API in the
+<a href="pcre2api.html"><b>pcre2api</b></a>
+page and a description of the POSIX API in the
+<a href="pcre2posix.html"><b>pcre2posix</b></a>
+page.
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
diff --git a/dist2/doc/html/pcre2_serialize_free.html b/dist2/doc/html/pcre2_serialize_free.html
new file mode 100644
index 0000000..10695dc
--- /dev/null
+++ b/dist2/doc/html/pcre2_serialize_free.html
@@ -0,0 +1,40 @@
+<html>
+<head>
+<title>pcre2_serialize_free specification</title>
+</head>
+<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
+<h1>pcre2_serialize_free man page</h1>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
+<p>
+This page is part of the PCRE2 HTML documentation. It was generated
+automatically from the original man page. If there is any nonsense in it,
+please consult the man page, in case the conversion went wrong.
+<br>
+<br><b>
+SYNOPSIS
+</b><br>
+<P>
+<b>#include &#60;pcre2.h&#62;</b>
+</P>
+<P>
+<b>void pcre2_serialize_free(uint8_t *<i>bytes</i>);</b>
+</P>
+<br><b>
+DESCRIPTION
+</b><br>
+<P>
+This function frees the memory that was obtained by
+<b>pcre2_serialize_encode()</b> to hold a serialized byte stream. The argument
+must point to such a byte stream.
+</P>
+<P>
+There is a complete description of the PCRE2 native API in the
+<a href="pcre2api.html"><b>pcre2api</b></a>
+page and a description of the POSIX API in the
+<a href="pcre2posix.html"><b>pcre2posix</b></a>
+page.
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
diff --git a/dist2/doc/html/pcre2_serialize_get_number_of_codes.html b/dist2/doc/html/pcre2_serialize_get_number_of_codes.html
new file mode 100644
index 0000000..3bab45a
--- /dev/null
+++ b/dist2/doc/html/pcre2_serialize_get_number_of_codes.html
@@ -0,0 +1,49 @@
+<html>
+<head>
+<title>pcre2_serialize_get_number_of_codes specification</title>
+</head>
+<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
+<h1>pcre2_serialize_get_number_of_codes man page</h1>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
+<p>
+This page is part of the PCRE2 HTML documentation. It was generated
+automatically from the original man page. If there is any nonsense in it,
+please consult the man page, in case the conversion went wrong.
+<br>
+<br><b>
+SYNOPSIS
+</b><br>
+<P>
+<b>#include &#60;pcre2.h&#62;</b>
+</P>
+<P>
+<b>int32_t pcre2_serialize_get_number_of_codes(const uint8_t *<i>bytes</i>);</b>
+</P>
+<br><b>
+DESCRIPTION
+</b><br>
+<P>
+The <i>bytes</i> argument must point to a serialized byte stream that was
+originally created by <b>pcre2_serialize_encode()</b> (though it may have been
+saved on disc or elsewhere in the meantime). The function returns the number of
+serialized patterns in the byte stream, or one of the following negative error
+codes:
+<pre>
+  PCRE2_ERROR_BADMAGIC  mismatch of id bytes in <i>bytes</i>
+  PCRE2_ERROR_BADMODE   mismatch of variable unit size or PCRE version
+  PCRE2_ERROR_NULL      the argument is NULL
+</pre>
+PCRE2_ERROR_BADMAGIC may mean that the data is corrupt, or that it was compiled
+on a system with different endianness.
+</P>
+<P>
+There is a complete description of the PCRE2 native API in the
+<a href="pcre2api.html"><b>pcre2api</b></a>
+page and a description of the POSIX API in the
+<a href="pcre2posix.html"><b>pcre2posix</b></a>
+page.
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
diff --git a/dist2/doc/html/pcre2_set_bsr.html b/dist2/doc/html/pcre2_set_bsr.html
new file mode 100644
index 0000000..8a62f18
--- /dev/null
+++ b/dist2/doc/html/pcre2_set_bsr.html
@@ -0,0 +1,42 @@
+<html>
+<head>
+<title>pcre2_set_bsr specification</title>
+</head>
+<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
+<h1>pcre2_set_bsr man page</h1>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
+<p>
+This page is part of the PCRE2 HTML documentation. It was generated
+automatically from the original man page. If there is any nonsense in it,
+please consult the man page, in case the conversion went wrong.
+<br>
+<br><b>
+SYNOPSIS
+</b><br>
+<P>
+<b>#include &#60;pcre2.h&#62;</b>
+</P>
+<P>
+<b>int pcre2_set_bsr(pcre2_compile_context *<i>ccontext</i>,</b>
+<b>  uint32_t <i>value</i>);</b>
+</P>
+<br><b>
+DESCRIPTION
+</b><br>
+<P>
+This function sets the convention for processing \R within a compile context.
+The second argument must be one of PCRE2_BSR_ANYCRLF or PCRE2_BSR_UNICODE. The
+result is zero for success or PCRE2_ERROR_BADDATA if the second argument is
+invalid.
+</P>
+<P>
+There is a complete description of the PCRE2 native API in the
+<a href="pcre2api.html"><b>pcre2api</b></a>
+page and a description of the POSIX API in the
+<a href="pcre2posix.html"><b>pcre2posix</b></a>
+page.
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
diff --git a/dist2/doc/html/pcre2_set_callout.html b/dist2/doc/html/pcre2_set_callout.html
new file mode 100644
index 0000000..635e0c2
--- /dev/null
+++ b/dist2/doc/html/pcre2_set_callout.html
@@ -0,0 +1,43 @@
+<html>
+<head>
+<title>pcre2_set_callout specification</title>
+</head>
+<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
+<h1>pcre2_set_callout man page</h1>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
+<p>
+This page is part of the PCRE2 HTML documentation. It was generated
+automatically from the original man page. If there is any nonsense in it,
+please consult the man page, in case the conversion went wrong.
+<br>
+<br><b>
+SYNOPSIS
+</b><br>
+<P>
+<b>#include &#60;pcre2.h&#62;</b>
+</P>
+<P>
+<b>int pcre2_set_callout(pcre2_match_context *<i>mcontext</i>,</b>
+<b>  int (*<i>callout_function</i>)(pcre2_callout_block *),</b>
+<b>  void *<i>callout_data</i>);</b>
+</P>
+<br><b>
+DESCRIPTION
+</b><br>
+<P>
+This function sets the callout fields in a match context (the first argument).
+The second argument specifies a callout function, and the third argument is an
+opaque data time that is passed to it. The result of this function is always
+zero.
+</P>
+<P>
+There is a complete description of the PCRE2 native API in the
+<a href="pcre2api.html"><b>pcre2api</b></a>
+page and a description of the POSIX API in the
+<a href="pcre2posix.html"><b>pcre2posix</b></a>
+page.
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
diff --git a/dist2/doc/html/pcre2_set_character_tables.html b/dist2/doc/html/pcre2_set_character_tables.html
new file mode 100644
index 0000000..5a1bd20
--- /dev/null
+++ b/dist2/doc/html/pcre2_set_character_tables.html
@@ -0,0 +1,42 @@
+<html>
+<head>
+<title>pcre2_set_character_tables specification</title>
+</head>
+<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
+<h1>pcre2_set_character_tables man page</h1>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
+<p>
+This page is part of the PCRE2 HTML documentation. It was generated
+automatically from the original man page. If there is any nonsense in it,
+please consult the man page, in case the conversion went wrong.
+<br>
+<br><b>
+SYNOPSIS
+</b><br>
+<P>
+<b>#include &#60;pcre2.h&#62;</b>
+</P>
+<P>
+<b>int pcre2_set_character_tables(pcre2_compile_context *<i>ccontext</i>,</b>
+<b>  const unsigned char *<i>tables</i>);</b>
+</P>
+<br><b>
+DESCRIPTION
+</b><br>
+<P>
+This function sets a pointer to custom character tables within a compile
+context. The second argument must be the result of a call to
+<b>pcre2_maketables()</b> or NULL to request the default tables. The result is
+always zero.
+</P>
+<P>
+There is a complete description of the PCRE2 native API in the
+<a href="pcre2api.html"><b>pcre2api</b></a>
+page and a description of the POSIX API in the
+<a href="pcre2posix.html"><b>pcre2posix</b></a>
+page.
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
diff --git a/dist2/doc/html/pcre2_set_compile_recursion_guard.html b/dist2/doc/html/pcre2_set_compile_recursion_guard.html
new file mode 100644
index 0000000..c09942c
--- /dev/null
+++ b/dist2/doc/html/pcre2_set_compile_recursion_guard.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>pcre2_set_compile_recursion_guard specification</title>
+</head>
+<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
+<h1>pcre2_set_compile_recursion_guard man page</h1>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
+<p>
+This page is part of the PCRE2 HTML documentation. It was generated
+automatically from the original man page. If there is any nonsense in it,
+please consult the man page, in case the conversion went wrong.
+<br>
+<br><b>
+SYNOPSIS
+</b><br>
+<P>
+<b>#include &#60;pcre2.h&#62;</b>
+</P>
+<P>
+<b>int pcre2_set_compile_recursion_guard(pcre2_compile_context *<i>ccontext</i>,</b>
+<b>  int (*<i>guard_function</i>)(uint32_t, void *), void *<i>user_data</i>);</b>
+</P>
+<br><b>
+DESCRIPTION
+</b><br>
+<P>
+This function defines, within a compile context, a function that is called
+whenever <b>pcre2_compile()</b> starts to compile a parenthesized part of a
+pattern. The first argument to the function gives the current depth of
+parenthesis nesting, and the second is user data that is supplied when the
+function is set up. The callout function should return zero if all is well, or
+non-zero to force an error. This feature is provided so that applications can
+check the available system stack space, in order to avoid running out. The
+result of <b>pcre2_set_compile_recursion_guard()</b> is always zero.
+</P>
+<P>
+There is a complete description of the PCRE2 native API in the
+<a href="pcre2api.html"><b>pcre2api</b></a>
+page and a description of the POSIX API in the
+<a href="pcre2posix.html"><b>pcre2posix</b></a>
+page.
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
diff --git a/dist2/doc/html/pcre2_set_match_limit.html b/dist2/doc/html/pcre2_set_match_limit.html
new file mode 100644
index 0000000..e840c74
--- /dev/null
+++ b/dist2/doc/html/pcre2_set_match_limit.html
@@ -0,0 +1,40 @@
+<html>
+<head>
+<title>pcre2_set_match_limit specification</title>
+</head>
+<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
+<h1>pcre2_set_match_limit man page</h1>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
+<p>
+This page is part of the PCRE2 HTML documentation. It was generated
+automatically from the original man page. If there is any nonsense in it,
+please consult the man page, in case the conversion went wrong.
+<br>
+<br><b>
+SYNOPSIS
+</b><br>
+<P>
+<b>#include &#60;pcre2.h&#62;</b>
+</P>
+<P>
+<b>int pcre2_set_match_limit(pcre2_match_context *<i>mcontext</i>,</b>
+<b>  uint32_t <i>value</i>);</b>
+</P>
+<br><b>
+DESCRIPTION
+</b><br>
+<P>
+This function sets the match limit field in a match context. The result is
+always zero.
+</P>
+<P>
+There is a complete description of the PCRE2 native API in the
+<a href="pcre2api.html"><b>pcre2api</b></a>
+page and a description of the POSIX API in the
+<a href="pcre2posix.html"><b>pcre2posix</b></a>
+page.
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
diff --git a/dist2/doc/html/pcre2_set_newline.html b/dist2/doc/html/pcre2_set_newline.html
new file mode 100644
index 0000000..ae6332a
--- /dev/null
+++ b/dist2/doc/html/pcre2_set_newline.html
@@ -0,0 +1,50 @@
+<html>
+<head>
+<title>pcre2_set_newline specification</title>
+</head>
+<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
+<h1>pcre2_set_newline man page</h1>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
+<p>
+This page is part of the PCRE2 HTML documentation. It was generated
+automatically from the original man page. If there is any nonsense in it,
+please consult the man page, in case the conversion went wrong.
+<br>
+<br><b>
+SYNOPSIS
+</b><br>
+<P>
+<b>#include &#60;pcre2.h&#62;</b>
+</P>
+<P>
+<b>int pcre2_set_newline(pcre2_compile_context *<i>ccontext</i>,</b>
+<b>  uint32_t <i>value</i>);</b>
+</P>
+<br><b>
+DESCRIPTION
+</b><br>
+<P>
+This function sets the newline convention within a compile context. This
+specifies which character(s) are recognized as newlines when compiling and
+matching patterns. The second argument must be one of:
+<pre>
+  PCRE2_NEWLINE_CR        Carriage return only
+  PCRE2_NEWLINE_LF        Linefeed only
+  PCRE2_NEWLINE_CRLF      CR followed by LF only
+  PCRE2_NEWLINE_ANYCRLF   Any of the above
+  PCRE2_NEWLINE_ANY       Any Unicode newline sequence
+</pre>
+The result is zero for success or PCRE2_ERROR_BADDATA if the second argument is
+invalid.
+</P>
+<P>
+There is a complete description of the PCRE2 native API in the
+<a href="pcre2api.html"><b>pcre2api</b></a>
+page and a description of the POSIX API in the
+<a href="pcre2posix.html"><b>pcre2posix</b></a>
+page.
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
diff --git a/dist2/doc/html/pcre2_set_offset_limit.html b/dist2/doc/html/pcre2_set_offset_limit.html
new file mode 100644
index 0000000..6d9a85c
--- /dev/null
+++ b/dist2/doc/html/pcre2_set_offset_limit.html
@@ -0,0 +1,40 @@
+<html>
+<head>
+<title>pcre2_set_offset_limit specification</title>
+</head>
+<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
+<h1>pcre2_set_offset_limit man page</h1>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
+<p>
+This page is part of the PCRE2 HTML documentation. It was generated
+automatically from the original man page. If there is any nonsense in it,
+please consult the man page, in case the conversion went wrong.
+<br>
+<br><b>
+SYNOPSIS
+</b><br>
+<P>
+<b>#include &#60;pcre2.h&#62;</b>
+</P>
+<P>
+<b>int pcre2_set_offset_limit(pcre2_match_context *<i>mcontext</i>,</b>
+<b>  PCRE2_SIZE <i>value</i>);</b>
+</P>
+<br><b>
+DESCRIPTION
+</b><br>
+<P>
+This function sets the offset limit field in a match context. The result is
+always zero.
+</P>
+<P>
+There is a complete description of the PCRE2 native API in the
+<a href="pcre2api.html"><b>pcre2api</b></a>
+page and a description of the POSIX API in the
+<a href="pcre2posix.html"><b>pcre2posix</b></a>
+page.
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
diff --git a/dist2/doc/html/pcre2_set_parens_nest_limit.html b/dist2/doc/html/pcre2_set_parens_nest_limit.html
new file mode 100644
index 0000000..95fd31c
--- /dev/null
+++ b/dist2/doc/html/pcre2_set_parens_nest_limit.html
@@ -0,0 +1,40 @@
+<html>
+<head>
+<title>pcre2_set_parens_nest_limit specification</title>
+</head>
+<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
+<h1>pcre2_set_parens_nest_limit man page</h1>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
+<p>
+This page is part of the PCRE2 HTML documentation. It was generated
+automatically from the original man page. If there is any nonsense in it,
+please consult the man page, in case the conversion went wrong.
+<br>
+<br><b>
+SYNOPSIS
+</b><br>
+<P>
+<b>#include &#60;pcre2.h&#62;</b>
+</P>
+<P>
+<b>int pcre2_set_parens_nest_limit(pcre2_compile_context *<i>ccontext</i>,</b>
+<b>  uint32_t <i>value</i>);</b>
+</P>
+<br><b>
+DESCRIPTION
+</b><br>
+<P>
+This function sets, in a compile context, the maximum depth of nested
+parentheses in a pattern. The result is always zero.
+</P>
+<P>
+There is a complete description of the PCRE2 native API in the
+<a href="pcre2api.html"><b>pcre2api</b></a>
+page and a description of the POSIX API in the
+<a href="pcre2posix.html"><b>pcre2posix</b></a>
+page.
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
diff --git a/dist2/doc/html/pcre2_set_recursion_limit.html b/dist2/doc/html/pcre2_set_recursion_limit.html
new file mode 100644
index 0000000..5adcc99
--- /dev/null
+++ b/dist2/doc/html/pcre2_set_recursion_limit.html
@@ -0,0 +1,40 @@
+<html>
+<head>
+<title>pcre2_set_recursion_limit specification</title>
+</head>
+<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
+<h1>pcre2_set_recursion_limit man page</h1>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
+<p>
+This page is part of the PCRE2 HTML documentation. It was generated
+automatically from the original man page. If there is any nonsense in it,
+please consult the man page, in case the conversion went wrong.
+<br>
+<br><b>
+SYNOPSIS
+</b><br>
+<P>
+<b>#include &#60;pcre2.h&#62;</b>
+</P>
+<P>
+<b>int pcre2_set_recursion_limit(pcre2_match_context *<i>mcontext</i>,</b>
+<b>  uint32_t <i>value</i>);</b>
+</P>
+<br><b>
+DESCRIPTION
+</b><br>
+<P>
+This function sets the recursion limit field in a match context. The result is
+always zero.
+</P>
+<P>
+There is a complete description of the PCRE2 native API in the
+<a href="pcre2api.html"><b>pcre2api</b></a>
+page and a description of the POSIX API in the
+<a href="pcre2posix.html"><b>pcre2posix</b></a>
+page.
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
diff --git a/dist2/doc/html/pcre2_set_recursion_memory_management.html b/dist2/doc/html/pcre2_set_recursion_memory_management.html
new file mode 100644
index 0000000..ec18947
--- /dev/null
+++ b/dist2/doc/html/pcre2_set_recursion_memory_management.html
@@ -0,0 +1,47 @@
+<html>
+<head>
+<title>pcre2_set_recursion_memory_management specification</title>
+</head>
+<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
+<h1>pcre2_set_recursion_memory_management man page</h1>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
+<p>
+This page is part of the PCRE2 HTML documentation. It was generated
+automatically from the original man page. If there is any nonsense in it,
+please consult the man page, in case the conversion went wrong.
+<br>
+<br><b>
+SYNOPSIS
+</b><br>
+<P>
+<b>#include &#60;pcre2.h&#62;</b>
+</P>
+<P>
+<b>int pcre2_set_recursion_memory_management(</b>
+<b>  pcre2_match_context *<i>mcontext</i>,</b>
+<b>  void *(*<i>private_malloc</i>)(PCRE2_SIZE, void *),</b>
+<b>  void (*<i>private_free</i>)(void *, void *), void *<i>memory_data</i>);</b>
+</P>
+<br><b>
+DESCRIPTION
+</b><br>
+<P>
+This function sets the match context fields for custom memory management when
+PCRE2 is compiled to use the heap instead of the system stack for recursive
+function calls while matching. When PCRE2 is compiled to use the stack (the
+default) this function does nothing. The first argument is a match context, the
+second and third specify the memory allocation and freeing functions, and the
+final argument is an opaque value that is passed to them whenever they are
+called. The result of this function is always zero.
+</P>
+<P>
+There is a complete description of the PCRE2 native API in the
+<a href="pcre2api.html"><b>pcre2api</b></a>
+page and a description of the POSIX API in the
+<a href="pcre2posix.html"><b>pcre2posix</b></a>
+page.
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
diff --git a/dist2/doc/html/pcre2_substitute.html b/dist2/doc/html/pcre2_substitute.html
new file mode 100644
index 0000000..2dfd094
--- /dev/null
+++ b/dist2/doc/html/pcre2_substitute.html
@@ -0,0 +1,90 @@
+<html>
+<head>
+<title>pcre2_substitute specification</title>
+</head>
+<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
+<h1>pcre2_substitute man page</h1>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
+<p>
+This page is part of the PCRE2 HTML documentation. It was generated
+automatically from the original man page. If there is any nonsense in it,
+please consult the man page, in case the conversion went wrong.
+<br>
+<br><b>
+SYNOPSIS
+</b><br>
+<P>
+<b>#include &#60;pcre2.h&#62;</b>
+</P>
+<P>
+<b>int pcre2_substitute(const pcre2_code *<i>code</i>, PCRE2_SPTR <i>subject</i>,</b>
+<b>  PCRE2_SIZE <i>length</i>, PCRE2_SIZE <i>startoffset</i>,</b>
+<b>  uint32_t <i>options</i>, pcre2_match_data *<i>match_data</i>,</b>
+<b>  pcre2_match_context *<i>mcontext</i>, PCRE2_SPTR <i>replacement</i>,</b>
+<b>  PCRE2_SIZE <i>rlength</i>, PCRE2_UCHAR *<i>outputbuffer</i>,</b>
+<b>  PCRE2_SIZE *<i>outlengthptr</i>);</b>
+</P>
+<br><b>
+DESCRIPTION
+</b><br>
+<P>
+This function matches a compiled regular expression against a given subject
+string, using a matching algorithm that is similar to Perl's. It then makes a
+copy of the subject, substituting a replacement string for what was matched.
+Its arguments are:
+<pre>
+  <i>code</i>          Points to the compiled pattern
+  <i>subject</i>       Points to the subject string
+  <i>length</i>        Length of the subject string
+  <i>startoffset</i>   Offset in the subject at which to start matching
+  <i>options</i>       Option bits
+  <i>match_data</i>    Points to a match data block, or is NULL
+  <i>mcontext</i>      Points to a match context, or is NULL
+  <i>replacement</i>   Points to the replacement string
+  <i>rlength</i>       Length of the replacement string
+  <i>outputbuffer</i>  Points to the output buffer
+  <i>outlengthptr</i>  Points to the length of the output buffer
+</pre>
+A match context is needed only if you want to:
+<pre>
+  Set up a callout function
+  Change the limit for calling the internal function <i>match()</i>
+  Change the limit for calling <i>match()</i> recursively
+  Set custom memory management when the heap is used for recursion
+</pre>
+The <i>length</i>, <i>startoffset</i> and <i>rlength</i> values are code
+units, not characters, as is the contents of the variable pointed at by
+<i>outlengthptr</i>, which is updated to the actual length of the new string.
+The options are:
+<pre>
+  PCRE2_ANCHORED             Match only at the first position
+  PCRE2_NOTBOL               Subject is not the beginning of a line
+  PCRE2_NOTEOL               Subject is not the end of a line
+  PCRE2_NOTEMPTY             An empty string is not a valid match
+  PCRE2_NOTEMPTY_ATSTART     An empty string at the start of the
+                              subject is not a valid match
+  PCRE2_NO_UTF_CHECK         Do not check the subject or replacement
+                              for UTF validity (only relevant if
+                              PCRE2_UTF was set at compile time)
+  PCRE2_SUBSTITUTE_EXTENDED  Do extended replacement processing
+  PCRE2_SUBSTITUTE_GLOBAL    Replace all occurrences in the subject
+  PCRE2_SUBSTITUTE_OVERFLOW_LENGTH  If overflow, compute needed length
+  PCRE2_SUBSTITUTE_UNKNOWN_UNSET  Treat unknown group as unset
+  PCRE2_SUBSTITUTE_UNSET_EMPTY  Simple unset insert = empty string
+</pre>
+The function returns the number of substitutions, which may be zero if there
+were no matches. The result can be greater than one only when
+PCRE2_SUBSTITUTE_GLOBAL is set. In the event of an error, a negative error code
+is returned.
+</P>
+<P>
+There is a complete description of the PCRE2 native API in the
+<a href="pcre2api.html"><b>pcre2api</b></a>
+page and a description of the POSIX API in the
+<a href="pcre2posix.html"><b>pcre2posix</b></a>
+page.
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
diff --git a/dist2/doc/html/pcre2_substring_copy_byname.html b/dist2/doc/html/pcre2_substring_copy_byname.html
new file mode 100644
index 0000000..fd01805
--- /dev/null
+++ b/dist2/doc/html/pcre2_substring_copy_byname.html
@@ -0,0 +1,58 @@
+<html>
+<head>
+<title>pcre2_substring_copy_byname specification</title>
+</head>
+<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
+<h1>pcre2_substring_copy_byname man page</h1>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
+<p>
+This page is part of the PCRE2 HTML documentation. It was generated
+automatically from the original man page. If there is any nonsense in it,
+please consult the man page, in case the conversion went wrong.
+<br>
+<br><b>
+SYNOPSIS
+</b><br>
+<P>
+<b>#include &#60;pcre2.h&#62;</b>
+</P>
+<P>
+<b>int pcre2_substring_copy_byname(pcre2_match_data *<i>match_data</i>,</b>
+<b>  PCRE2_SPTR <i>name</i>, PCRE2_UCHAR *<i>buffer</i>, PCRE2_SIZE *<i>bufflen</i>);</b>
+</P>
+<br><b>
+DESCRIPTION
+</b><br>
+<P>
+This is a convenience function for extracting a captured substring, identified
+by name, into a given buffer. The arguments are:
+<pre>
+  <i>match_data</i>    The match data block for the match
+  <i>name</i>          Name of the required substring
+  <i>buffer</i>        Buffer to receive the string
+  <i>bufflen</i>       Length of buffer (code units)
+</pre>
+The <i>bufflen</i> variable is updated to contain the length of the extracted
+string, excluding the trailing zero. The yield of the function is zero for
+success or one of the following error numbers:
+<pre>
+  PCRE2_ERROR_NOSUBSTRING   there are no groups of that name
+  PCRE2_ERROR_UNAVAILBLE    the ovector was too small for that group
+  PCRE2_ERROR_UNSET         the group did not participate in the match
+  PCRE2_ERROR_NOMEMORY      the buffer is not big enough
+</pre>
+If there is more than one group with the given name, the first one that is set
+is returned. In this situation PCRE2_ERROR_UNSET means that no group with the
+given name was set.
+</P>
+<P>
+There is a complete description of the PCRE2 native API in the
+<a href="pcre2api.html"><b>pcre2api</b></a>
+page and a description of the POSIX API in the
+<a href="pcre2posix.html"><b>pcre2posix</b></a>
+page.
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
diff --git a/dist2/doc/html/pcre2_substring_copy_bynumber.html b/dist2/doc/html/pcre2_substring_copy_bynumber.html
new file mode 100644
index 0000000..83e1a27
--- /dev/null
+++ b/dist2/doc/html/pcre2_substring_copy_bynumber.html
@@ -0,0 +1,57 @@
+<html>
+<head>
+<title>pcre2_substring_copy_bynumber specification</title>
+</head>
+<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
+<h1>pcre2_substring_copy_bynumber man page</h1>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
+<p>
+This page is part of the PCRE2 HTML documentation. It was generated
+automatically from the original man page. If there is any nonsense in it,
+please consult the man page, in case the conversion went wrong.
+<br>
+<br><b>
+SYNOPSIS
+</b><br>
+<P>
+<b>#include &#60;pcre2.h&#62;</b>
+</P>
+<P>
+<b>int pcre2_substring_copy_bynumber(pcre2_match_data *<i>match_data</i>,</b>
+<b>  uint32_t <i>number</i>, PCRE2_UCHAR *<i>buffer</i>,</b>
+<b>  PCRE2_SIZE *<i>bufflen</i>);</b>
+</P>
+<br><b>
+DESCRIPTION
+</b><br>
+<P>
+This is a convenience function for extracting a captured substring into a given
+buffer. The arguments are:
+<pre>
+  <i>match_data</i>    The match data block for the match
+  <i>number</i>        Number of the required substring
+  <i>buffer</i>        Buffer to receive the string
+  <i>bufflen</i>       Length of buffer
+</pre>
+The <i>bufflen</i> variable is updated with the length of the extracted string,
+excluding the terminating zero. The yield of the function is zero for success
+or one of the following error numbers:
+<pre>
+  PCRE2_ERROR_NOSUBSTRING   there are no groups of that number
+  PCRE2_ERROR_UNAVAILBLE    the ovector was too small for that group
+  PCRE2_ERROR_UNSET         the group did not participate in the match
+  PCRE2_ERROR_NOMEMORY      the buffer is too small
+
+</PRE>
+</P>
+<P>
+There is a complete description of the PCRE2 native API in the
+<a href="pcre2api.html"><b>pcre2api</b></a>
+page and a description of the POSIX API in the
+<a href="pcre2posix.html"><b>pcre2posix</b></a>
+page.
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
diff --git a/dist2/doc/html/pcre2_substring_free.html b/dist2/doc/html/pcre2_substring_free.html
new file mode 100644
index 0000000..35a5b55
--- /dev/null
+++ b/dist2/doc/html/pcre2_substring_free.html
@@ -0,0 +1,41 @@
+<html>
+<head>
+<title>pcre2_substring_free specification</title>
+</head>
+<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
+<h1>pcre2_substring_free man page</h1>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
+<p>
+This page is part of the PCRE2 HTML documentation. It was generated
+automatically from the original man page. If there is any nonsense in it,
+please consult the man page, in case the conversion went wrong.
+<br>
+<br><b>
+SYNOPSIS
+</b><br>
+<P>
+<b>#include &#60;pcre2.h&#62;</b>
+</P>
+<P>
+<b>void pcre2_substring_free(PCRE2_UCHAR *<i>buffer</i>);</b>
+</P>
+<br><b>
+DESCRIPTION
+</b><br>
+<P>
+This is a convenience function for freeing the memory obtained by a previous
+call to <b>pcre2_substring_get_byname()</b> or
+<b>pcre2_substring_get_bynumber()</b>. Its only argument is a pointer to the
+string.
+</P>
+<P>
+There is a complete description of the PCRE2 native API in the
+<a href="pcre2api.html"><b>pcre2api</b></a>
+page and a description of the POSIX API in the
+<a href="pcre2posix.html"><b>pcre2posix</b></a>
+page.
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
diff --git a/dist2/doc/html/pcre2_substring_get_byname.html b/dist2/doc/html/pcre2_substring_get_byname.html
new file mode 100644
index 0000000..a4b8771
--- /dev/null
+++ b/dist2/doc/html/pcre2_substring_get_byname.html
@@ -0,0 +1,60 @@
+<html>
+<head>
+<title>pcre2_substring_get_byname specification</title>
+</head>
+<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
+<h1>pcre2_substring_get_byname man page</h1>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
+<p>
+This page is part of the PCRE2 HTML documentation. It was generated
+automatically from the original man page. If there is any nonsense in it,
+please consult the man page, in case the conversion went wrong.
+<br>
+<br><b>
+SYNOPSIS
+</b><br>
+<P>
+<b>#include &#60;pcre2.h&#62;</b>
+</P>
+<P>
+<b>int pcre2_substring_get_byname(pcre2_match_data *<i>match_data</i>,</b>
+<b>  PCRE2_SPTR <i>name</i>, PCRE2_UCHAR **<i>bufferptr</i>, PCRE2_SIZE *<i>bufflen</i>);</b>
+</P>
+<br><b>
+DESCRIPTION
+</b><br>
+<P>
+This is a convenience function for extracting a captured substring by name into
+newly acquired memory. The arguments are:
+<pre>
+  <i>match_data</i>    The match data for the match
+  <i>name</i>          Name of the required substring
+  <i>bufferptr</i>     Where to put the string pointer
+  <i>bufflen</i>       Where to put the string length
+</pre>
+The memory in which the substring is placed is obtained by calling the same
+memory allocation function that was used for the match data block. The
+convenience function <b>pcre2_substring_free()</b> can be used to free it when
+it is no longer needed. The yield of the function is zero for success or one of
+the following error numbers:
+<pre>
+  PCRE2_ERROR_NOSUBSTRING   there are no groups of that name
+  PCRE2_ERROR_UNAVAILBLE    the ovector was too small for that group
+  PCRE2_ERROR_UNSET         the group did not participate in the match
+  PCRE2_ERROR_NOMEMORY      memory could not be obtained
+</pre>
+If there is more than one group with the given name, the first one that is set
+is returned. In this situation PCRE2_ERROR_UNSET means that no group with the
+given name was set.
+</P>
+<P>
+There is a complete description of the PCRE2 native API in the
+<a href="pcre2api.html"><b>pcre2api</b></a>
+page and a description of the POSIX API in the
+<a href="pcre2posix.html"><b>pcre2posix</b></a>
+page.
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
diff --git a/dist2/doc/html/pcre2_substring_get_bynumber.html b/dist2/doc/html/pcre2_substring_get_bynumber.html
new file mode 100644
index 0000000..391bc82
--- /dev/null
+++ b/dist2/doc/html/pcre2_substring_get_bynumber.html
@@ -0,0 +1,58 @@
+<html>
+<head>
+<title>pcre2_substring_get_bynumber specification</title>
+</head>
+<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
+<h1>pcre2_substring_get_bynumber man page</h1>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
+<p>
+This page is part of the PCRE2 HTML documentation. It was generated
+automatically from the original man page. If there is any nonsense in it,
+please consult the man page, in case the conversion went wrong.
+<br>
+<br><b>
+SYNOPSIS
+</b><br>
+<P>
+<b>#include &#60;pcre2.h&#62;</b>
+</P>
+<P>
+<b>int pcre2_substring_get_bynumber(pcre2_match_data *<i>match_data</i>,</b>
+<b>  uint32_t <i>number</i>, PCRE2_UCHAR **<i>bufferptr</i>, PCRE2_SIZE *<i>bufflen</i>);</b>
+</P>
+<br><b>
+DESCRIPTION
+</b><br>
+<P>
+This is a convenience function for extracting a captured substring by number
+into newly acquired memory. The arguments are:
+<pre>
+  <i>match_data</i>    The match data for the match
+  <i>number</i>        Number of the required substring
+  <i>bufferptr</i>     Where to put the string pointer
+  <i>bufflen</i>       Where to put the string length
+</pre>
+The memory in which the substring is placed is obtained by calling the same
+memory allocation function that was used for the match data block. The
+convenience function <b>pcre2_substring_free()</b> can be used to free it when
+it is no longer needed. The yield of the function is zero for success or one of
+the following error numbers:
+<pre>
+  PCRE2_ERROR_NOSUBSTRING   there are no groups of that number
+  PCRE2_ERROR_UNAVAILBLE    the ovector was too small for that group
+  PCRE2_ERROR_UNSET         the group did not participate in the match
+  PCRE2_ERROR_NOMEMORY      memory could not be obtained
+
+</PRE>
+</P>
+<P>
+There is a complete description of the PCRE2 native API in the
+<a href="pcre2api.html"><b>pcre2api</b></a>
+page and a description of the POSIX API in the
+<a href="pcre2posix.html"><b>pcre2posix</b></a>
+page.
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
diff --git a/dist2/doc/html/pcre2_substring_length_byname.html b/dist2/doc/html/pcre2_substring_length_byname.html
new file mode 100644
index 0000000..213bc94
--- /dev/null
+++ b/dist2/doc/html/pcre2_substring_length_byname.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>pcre2_substring_length_byname specification</title>
+</head>
+<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
+<h1>pcre2_substring_length_byname man page</h1>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
+<p>
+This page is part of the PCRE2 HTML documentation. It was generated
+automatically from the original man page. If there is any nonsense in it,
+please consult the man page, in case the conversion went wrong.
+<br>
+<br><b>
+SYNOPSIS
+</b><br>
+<P>
+<b>#include &#60;pcre2.h&#62;</b>
+</P>
+<P>
+<b>int pcre2_substring_length_byname(pcre2_match_data *<i>match_data</i>,</b>
+<b>  PCRE2_SPTR <i>name</i>, PCRE2_SIZE *<i>length</i>);</b>
+</P>
+<br><b>
+DESCRIPTION
+</b><br>
+<P>
+This function returns the length of a matched substring, identified by name.
+The arguments are:
+<pre>
+  <i>match_data</i>   The match data block for the match
+  <i>name</i>         The substring name
+  <i>length</i>       Where to return the length
+</pre>
+The yield is zero on success, or an error code if the substring is not found.
+</P>
+<P>
+There is a complete description of the PCRE2 native API in the
+<a href="pcre2api.html"><b>pcre2api</b></a>
+page and a description of the POSIX API in the
+<a href="pcre2posix.html"><b>pcre2posix</b></a>
+page.
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
diff --git a/dist2/doc/html/pcre2_substring_length_bynumber.html b/dist2/doc/html/pcre2_substring_length_bynumber.html
new file mode 100644
index 0000000..db01cca
--- /dev/null
+++ b/dist2/doc/html/pcre2_substring_length_bynumber.html
@@ -0,0 +1,48 @@
+<html>
+<head>
+<title>pcre2_substring_length_bynumber specification</title>
+</head>
+<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
+<h1>pcre2_substring_length_bynumber man page</h1>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
+<p>
+This page is part of the PCRE2 HTML documentation. It was generated
+automatically from the original man page. If there is any nonsense in it,
+please consult the man page, in case the conversion went wrong.
+<br>
+<br><b>
+SYNOPSIS
+</b><br>
+<P>
+<b>#include &#60;pcre2.h&#62;</b>
+</P>
+<P>
+<b>int pcre2_substring_length_bynumber(pcre2_match_data *<i>match_data</i>,</b>
+<b>  uint32_t <i>number</i>, PCRE2_SIZE *<i>length</i>);</b>
+</P>
+<br><b>
+DESCRIPTION
+</b><br>
+<P>
+This function returns the length of a matched substring, identified by number.
+The arguments are:
+<pre>
+  <i>match_data</i>   The match data block for the match
+  <i>number</i>       The substring number
+  <i>length</i>       Where to return the length, or NULL
+</pre>
+The third argument may be NULL if all you want to know is whether or not a
+substring is set. The yield is zero on success, or a negative error code
+otherwise. After a partial match, only substring 0 is available.
+</P>
+<P>
+There is a complete description of the PCRE2 native API in the
+<a href="pcre2api.html"><b>pcre2api</b></a>
+page and a description of the POSIX API in the
+<a href="pcre2posix.html"><b>pcre2posix</b></a>
+page.
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
diff --git a/dist2/doc/html/pcre2_substring_list_free.html b/dist2/doc/html/pcre2_substring_list_free.html
new file mode 100644
index 0000000..d61241d
--- /dev/null
+++ b/dist2/doc/html/pcre2_substring_list_free.html
@@ -0,0 +1,40 @@
+<html>
+<head>
+<title>pcre2_substring_list_free specification</title>
+</head>
+<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
+<h1>pcre2_substring_list_free man page</h1>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
+<p>
+This page is part of the PCRE2 HTML documentation. It was generated
+automatically from the original man page. If there is any nonsense in it,
+please consult the man page, in case the conversion went wrong.
+<br>
+<br><b>
+SYNOPSIS
+</b><br>
+<P>
+<b>#include &#60;pcre2.h&#62;</b>
+</P>
+<P>
+<b>void pcre2_substring_list_free(PCRE2_SPTR *<i>list</i>);</b>
+</P>
+<br><b>
+DESCRIPTION
+</b><br>
+<P>
+This is a convenience function for freeing the store obtained by a previous
+call to <b>pcre2substring_list_get()</b>. Its only argument is a pointer to
+the list of string pointers.
+</P>
+<P>
+There is a complete description of the PCRE2 native API in the
+<a href="pcre2api.html"><b>pcre2api</b></a>
+page and a description of the POSIX API in the
+<a href="pcre2posix.html"><b>pcre2posix</b></a>
+page.
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
diff --git a/dist2/doc/html/pcre2_substring_list_get.html b/dist2/doc/html/pcre2_substring_list_get.html
new file mode 100644
index 0000000..fd43627
--- /dev/null
+++ b/dist2/doc/html/pcre2_substring_list_get.html
@@ -0,0 +1,56 @@
+<html>
+<head>
+<title>pcre2_substring_list_get specification</title>
+</head>
+<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
+<h1>pcre2_substring_list_get man page</h1>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
+<p>
+This page is part of the PCRE2 HTML documentation. It was generated
+automatically from the original man page. If there is any nonsense in it,
+please consult the man page, in case the conversion went wrong.
+<br>
+<br><b>
+SYNOPSIS
+</b><br>
+<P>
+<b>#include &#60;pcre2.h&#62;</b>
+</P>
+<P>
+<b>int pcre2_substring_list_get(pcre2_match_data *<i>match_data</i>,</b>
+<b>"  PCRE2_UCHAR ***<i>listptr</i>, PCRE2_SIZE **<i>lengthsptr</i>);</b>
+</P>
+<br><b>
+DESCRIPTION
+</b><br>
+<P>
+This is a convenience function for extracting all the captured substrings after
+a pattern match. It builds a list of pointers to the strings, and (optionally)
+a second list that contains their lengths (in code units), excluding a
+terminating zero that is added to each of them. All this is done in a single
+block of memory that is obtained using the same memory allocation function that
+was used to get the match data block. The convenience function
+<b>pcre2_substring_list_free()</b> can be used to free it when it is no longer
+needed. The arguments are:
+<pre>
+  <i>match_data</i>    The match data block
+  <i>listptr</i>       Where to put a pointer to the list
+  <i>lengthsptr</i>    Where to put a pointer to the lengths, or NULL
+</pre>
+A pointer to a list of pointers is put in the variable whose address is in
+<i>listptr</i>. The list is terminated by a NULL pointer. If <i>lengthsptr</i> is
+not NULL, a matching list of lengths is created, and its address is placed in
+<i>lengthsptr</i>. The yield of the function is zero on success or
+PCRE2_ERROR_NOMEMORY if sufficient memory could not be obtained.
+</P>
+<P>
+There is a complete description of the PCRE2 native API in the
+<a href="pcre2api.html"><b>pcre2api</b></a>
+page and a description of the POSIX API in the
+<a href="pcre2posix.html"><b>pcre2posix</b></a>
+page.
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
diff --git a/dist2/doc/html/pcre2_substring_nametable_scan.html b/dist2/doc/html/pcre2_substring_nametable_scan.html
new file mode 100644
index 0000000..5a44ea9
--- /dev/null
+++ b/dist2/doc/html/pcre2_substring_nametable_scan.html
@@ -0,0 +1,53 @@
+<html>
+<head>
+<title>pcre2_substring_nametable_scan specification</title>
+</head>
+<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
+<h1>pcre2_substring_nametable_scan man page</h1>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
+<p>
+This page is part of the PCRE2 HTML documentation. It was generated
+automatically from the original man page. If there is any nonsense in it,
+please consult the man page, in case the conversion went wrong.
+<br>
+<br><b>
+SYNOPSIS
+</b><br>
+<P>
+<b>#include &#60;pcre2.h&#62;</b>
+</P>
+<P>
+<b>int pcre2_substring_nametable_scan(const pcre2_code *<i>code</i>,</b>
+<b>  PCRE2_SPTR <i>name</i>, PCRE2_SPTR *<i>first</i>, PCRE2_SPTR *<i>last</i>);</b>
+</P>
+<br><b>
+DESCRIPTION
+</b><br>
+<P>
+This convenience function finds, for a compiled pattern, the first and last
+entries for a given name in the table that translates capturing parenthesis
+names into numbers.
+<pre>
+  <i>code</i>    Compiled regular expression
+  <i>name</i>    Name whose entries required
+  <i>first</i>   Where to return a pointer to the first entry
+  <i>last</i>    Where to return a pointer to the last entry
+</pre>
+When the name is found in the table, if <i>first</i> is NULL, the function
+returns a group number, but if there is more than one matching entry, it is not
+defined which one. Otherwise, when both pointers have been set, the yield of
+the function is the length of each entry in code units. If the name is not
+found, PCRE2_ERROR_NOSUBSTRING is returned.
+</P>
+<P>
+There is a complete description of the PCRE2 native API, including the format of
+the table entries, in the
+<a href="pcre2api.html"><b>pcre2api</b></a>
+page, and a description of the POSIX API in the
+<a href="pcre2posix.html"><b>pcre2posix</b></a>
+page.
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
diff --git a/dist2/doc/html/pcre2_substring_number_from_name.html b/dist2/doc/html/pcre2_substring_number_from_name.html
new file mode 100644
index 0000000..160fbda
--- /dev/null
+++ b/dist2/doc/html/pcre2_substring_number_from_name.html
@@ -0,0 +1,50 @@
+<html>
+<head>
+<title>pcre2_substring_number_from_name specification</title>
+</head>
+<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
+<h1>pcre2_substring_number_from_name man page</h1>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
+<p>
+This page is part of the PCRE2 HTML documentation. It was generated
+automatically from the original man page. If there is any nonsense in it,
+please consult the man page, in case the conversion went wrong.
+<br>
+<br><b>
+SYNOPSIS
+</b><br>
+<P>
+<b>#include &#60;pcre2.h&#62;</b>
+</P>
+<P>
+<b>int pcre2_substring_number_from_name(const pcre2_code *<i>code</i>,</b>
+<b>  PCRE2_SPTR <i>name</i>);</b>
+</P>
+<br><b>
+DESCRIPTION
+</b><br>
+<P>
+This convenience function finds the number of a named substring capturing
+parenthesis in a compiled pattern, provided that it is a unique name. The
+function arguments are:
+<pre>
+  <i>code</i>    Compiled regular expression
+  <i>name</i>    Name whose number is required
+</pre>
+The yield of the function is the number of the parenthesis if the name is
+found, or PCRE2_ERROR_NOSUBSTRING if it is not found. When duplicate names are
+allowed (PCRE2_DUPNAMES is set), if the name is not unique,
+PCRE2_ERROR_NOUNIQUESUBSTRING is returned. You can obtain the list of numbers
+with the same name by calling <b>pcre2_substring_nametable_scan()</b>.
+</P>
+<P>
+There is a complete description of the PCRE2 native API in the
+<a href="pcre2api.html"><b>pcre2api</b></a>
+page and a description of the POSIX API in the
+<a href="pcre2posix.html"><b>pcre2posix</b></a>
+page.
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
diff --git a/dist2/doc/html/pcre2api.html b/dist2/doc/html/pcre2api.html
new file mode 100644
index 0000000..bf1dd8e
--- /dev/null
+++ b/dist2/doc/html/pcre2api.html
@@ -0,0 +1,3130 @@
+<html>
+<head>
+<title>pcre2api specification</title>
+</head>
+<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
+<h1>pcre2api man page</h1>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
+<p>
+This page is part of the PCRE2 HTML documentation. It was generated
+automatically from the original man page. If there is any nonsense in it,
+please consult the man page, in case the conversion went wrong.
+<br>
+<ul>
+<li><a name="TOC1" href="#SEC1">PCRE2 NATIVE API BASIC FUNCTIONS</a>
+<li><a name="TOC2" href="#SEC2">PCRE2 NATIVE API AUXILIARY MATCH FUNCTIONS</a>
+<li><a name="TOC3" href="#SEC3">PCRE2 NATIVE API GENERAL CONTEXT FUNCTIONS</a>
+<li><a name="TOC4" href="#SEC4">PCRE2 NATIVE API COMPILE CONTEXT FUNCTIONS</a>
+<li><a name="TOC5" href="#SEC5">PCRE2 NATIVE API MATCH CONTEXT FUNCTIONS</a>
+<li><a name="TOC6" href="#SEC6">PCRE2 NATIVE API STRING EXTRACTION FUNCTIONS</a>
+<li><a name="TOC7" href="#SEC7">PCRE2 NATIVE API STRING SUBSTITUTION FUNCTION</a>
+<li><a name="TOC8" href="#SEC8">PCRE2 NATIVE API JIT FUNCTIONS</a>
+<li><a name="TOC9" href="#SEC9">PCRE2 NATIVE API SERIALIZATION FUNCTIONS</a>
+<li><a name="TOC10" href="#SEC10">PCRE2 NATIVE API AUXILIARY FUNCTIONS</a>
+<li><a name="TOC11" href="#SEC11">PCRE2 8-BIT, 16-BIT, AND 32-BIT LIBRARIES</a>
+<li><a name="TOC12" href="#SEC12">PCRE2 API OVERVIEW</a>
+<li><a name="TOC13" href="#SEC13">STRING LENGTHS AND OFFSETS</a>
+<li><a name="TOC14" href="#SEC14">NEWLINES</a>
+<li><a name="TOC15" href="#SEC15">MULTITHREADING</a>
+<li><a name="TOC16" href="#SEC16">PCRE2 CONTEXTS</a>
+<li><a name="TOC17" href="#SEC17">CHECKING BUILD-TIME OPTIONS</a>
+<li><a name="TOC18" href="#SEC18">COMPILING A PATTERN</a>
+<li><a name="TOC19" href="#SEC19">COMPILATION ERROR CODES</a>
+<li><a name="TOC20" href="#SEC20">JUST-IN-TIME (JIT) COMPILATION</a>
+<li><a name="TOC21" href="#SEC21">LOCALE SUPPORT</a>
+<li><a name="TOC22" href="#SEC22">INFORMATION ABOUT A COMPILED PATTERN</a>
+<li><a name="TOC23" href="#SEC23">INFORMATION ABOUT A PATTERN'S CALLOUTS</a>
+<li><a name="TOC24" href="#SEC24">SERIALIZATION AND PRECOMPILING</a>
+<li><a name="TOC25" href="#SEC25">THE MATCH DATA BLOCK</a>
+<li><a name="TOC26" href="#SEC26">MATCHING A PATTERN: THE TRADITIONAL FUNCTION</a>
+<li><a name="TOC27" href="#SEC27">NEWLINE HANDLING WHEN MATCHING</a>
+<li><a name="TOC28" href="#SEC28">HOW PCRE2_MATCH() RETURNS A STRING AND CAPTURED SUBSTRINGS</a>
+<li><a name="TOC29" href="#SEC29">OTHER INFORMATION ABOUT A MATCH</a>
+<li><a name="TOC30" href="#SEC30">ERROR RETURNS FROM <b>pcre2_match()</b></a>
+<li><a name="TOC31" href="#SEC31">EXTRACTING CAPTURED SUBSTRINGS BY NUMBER</a>
+<li><a name="TOC32" href="#SEC32">EXTRACTING A LIST OF ALL CAPTURED SUBSTRINGS</a>
+<li><a name="TOC33" href="#SEC33">EXTRACTING CAPTURED SUBSTRINGS BY NAME</a>
+<li><a name="TOC34" href="#SEC34">CREATING A NEW STRING WITH SUBSTITUTIONS</a>
+<li><a name="TOC35" href="#SEC35">DUPLICATE SUBPATTERN NAMES</a>
+<li><a name="TOC36" href="#SEC36">FINDING ALL POSSIBLE MATCHES AT ONE POSITION</a>
+<li><a name="TOC37" href="#SEC37">MATCHING A PATTERN: THE ALTERNATIVE FUNCTION</a>
+<li><a name="TOC38" href="#SEC38">SEE ALSO</a>
+<li><a name="TOC39" href="#SEC39">AUTHOR</a>
+<li><a name="TOC40" href="#SEC40">REVISION</a>
+</ul>
+<P>
+<b>#include &#60;pcre2.h&#62;</b>
+<br>
+<br>
+PCRE2 is a new API for PCRE. This document contains a description of all its
+functions. See the
+<a href="pcre2.html"><b>pcre2</b></a>
+document for an overview of all the PCRE2 documentation.
+</P>
+<br><a name="SEC1" href="#TOC1">PCRE2 NATIVE API BASIC FUNCTIONS</a><br>
+<P>
+<b>pcre2_code *pcre2_compile(PCRE2_SPTR <i>pattern</i>, PCRE2_SIZE <i>length</i>,</b>
+<b>  uint32_t <i>options</i>, int *<i>errorcode</i>, PCRE2_SIZE *<i>erroroffset,</i></b>
+<b>  pcre2_compile_context *<i>ccontext</i>);</b>
+<br>
+<br>
+<b>void pcre2_code_free(pcre2_code *<i>code</i>);</b>
+<br>
+<br>
+<b>pcre2_match_data *pcre2_match_data_create(uint32_t <i>ovecsize</i>,</b>
+<b>  pcre2_general_context *<i>gcontext</i>);</b>
+<br>
+<br>
+<b>pcre2_match_data *pcre2_match_data_create_from_pattern(</b>
+<b>  const pcre2_code *<i>code</i>, pcre2_general_context *<i>gcontext</i>);</b>
+<br>
+<br>
+<b>int pcre2_match(const pcre2_code *<i>code</i>, PCRE2_SPTR <i>subject</i>,</b>
+<b>  PCRE2_SIZE <i>length</i>, PCRE2_SIZE <i>startoffset</i>,</b>
+<b>  uint32_t <i>options</i>, pcre2_match_data *<i>match_data</i>,</b>
+<b>  pcre2_match_context *<i>mcontext</i>);</b>
+<br>
+<br>
+<b>int pcre2_dfa_match(const pcre2_code *<i>code</i>, PCRE2_SPTR <i>subject</i>,</b>
+<b>  PCRE2_SIZE <i>length</i>, PCRE2_SIZE <i>startoffset</i>,</b>
+<b>  uint32_t <i>options</i>, pcre2_match_data *<i>match_data</i>,</b>
+<b>  pcre2_match_context *<i>mcontext</i>,</b>
+<b>  int *<i>workspace</i>, PCRE2_SIZE <i>wscount</i>);</b>
+<br>
+<br>
+<b>void pcre2_match_data_free(pcre2_match_data *<i>match_data</i>);</b>
+</P>
+<br><a name="SEC2" href="#TOC1">PCRE2 NATIVE API AUXILIARY MATCH FUNCTIONS</a><br>
+<P>
+<b>PCRE2_SPTR pcre2_get_mark(pcre2_match_data *<i>match_data</i>);</b>
+<br>
+<br>
+<b>uint32_t pcre2_get_ovector_count(pcre2_match_data *<i>match_data</i>);</b>
+<br>
+<br>
+<b>PCRE2_SIZE *pcre2_get_ovector_pointer(pcre2_match_data *<i>match_data</i>);</b>
+<br>
+<br>
+<b>PCRE2_SIZE pcre2_get_startchar(pcre2_match_data *<i>match_data</i>);</b>
+</P>
+<br><a name="SEC3" href="#TOC1">PCRE2 NATIVE API GENERAL CONTEXT FUNCTIONS</a><br>
+<P>
+<b>pcre2_general_context *pcre2_general_context_create(</b>
+<b>  void *(*<i>private_malloc</i>)(PCRE2_SIZE, void *),</b>
+<b>  void (*<i>private_free</i>)(void *, void *), void *<i>memory_data</i>);</b>
+<br>
+<br>
+<b>pcre2_general_context *pcre2_general_context_copy(</b>
+<b>  pcre2_general_context *<i>gcontext</i>);</b>
+<br>
+<br>
+<b>void pcre2_general_context_free(pcre2_general_context *<i>gcontext</i>);</b>
+</P>
+<br><a name="SEC4" href="#TOC1">PCRE2 NATIVE API COMPILE CONTEXT FUNCTIONS</a><br>
+<P>
+<b>pcre2_compile_context *pcre2_compile_context_create(</b>
+<b>  pcre2_general_context *<i>gcontext</i>);</b>
+<br>
+<br>
+<b>pcre2_compile_context *pcre2_compile_context_copy(</b>
+<b>  pcre2_compile_context *<i>ccontext</i>);</b>
+<br>
+<br>
+<b>void pcre2_compile_context_free(pcre2_compile_context *<i>ccontext</i>);</b>
+<br>
+<br>
+<b>int pcre2_set_bsr(pcre2_compile_context *<i>ccontext</i>,</b>
+<b>  uint32_t <i>value</i>);</b>
+<br>
+<br>
+<b>int pcre2_set_character_tables(pcre2_compile_context *<i>ccontext</i>,</b>
+<b>  const unsigned char *<i>tables</i>);</b>
+<br>
+<br>
+<b>int pcre2_set_max_pattern_length(pcre2_compile_context *<i>ccontext</i>,</b>
+<b>  PCRE2_SIZE <i>value</i>);</b>
+<br>
+<br>
+<b>int pcre2_set_newline(pcre2_compile_context *<i>ccontext</i>,</b>
+<b>  uint32_t <i>value</i>);</b>
+<br>
+<br>
+<b>int pcre2_set_parens_nest_limit(pcre2_compile_context *<i>ccontext</i>,</b>
+<b>  uint32_t <i>value</i>);</b>
+<br>
+<br>
+<b>int pcre2_set_compile_recursion_guard(pcre2_compile_context *<i>ccontext</i>,</b>
+<b>  int (*<i>guard_function</i>)(uint32_t, void *), void *<i>user_data</i>);</b>
+</P>
+<br><a name="SEC5" href="#TOC1">PCRE2 NATIVE API MATCH CONTEXT FUNCTIONS</a><br>
+<P>
+<b>pcre2_match_context *pcre2_match_context_create(</b>
+<b>  pcre2_general_context *<i>gcontext</i>);</b>
+<br>
+<br>
+<b>pcre2_match_context *pcre2_match_context_copy(</b>
+<b>  pcre2_match_context *<i>mcontext</i>);</b>
+<br>
+<br>
+<b>void pcre2_match_context_free(pcre2_match_context *<i>mcontext</i>);</b>
+<br>
+<br>
+<b>int pcre2_set_callout(pcre2_match_context *<i>mcontext</i>,</b>
+<b>  int (*<i>callout_function</i>)(pcre2_callout_block *, void *),</b>
+<b>  void *<i>callout_data</i>);</b>
+<br>
+<br>
+<b>int pcre2_set_match_limit(pcre2_match_context *<i>mcontext</i>,</b>
+<b>  uint32_t <i>value</i>);</b>
+<br>
+<br>
+<b>int pcre2_set_offset_limit(pcre2_match_context *<i>mcontext</i>,</b>
+<b>  PCRE2_SIZE <i>value</i>);</b>
+<br>
+<br>
+<b>int pcre2_set_recursion_limit(pcre2_match_context *<i>mcontext</i>,</b>
+<b>  uint32_t <i>value</i>);</b>
+<br>
+<br>
+<b>int pcre2_set_recursion_memory_management(</b>
+<b>  pcre2_match_context *<i>mcontext</i>,</b>
+<b>  void *(*<i>private_malloc</i>)(PCRE2_SIZE, void *),</b>
+<b>  void (*<i>private_free</i>)(void *, void *), void *<i>memory_data</i>);</b>
+</P>
+<br><a name="SEC6" href="#TOC1">PCRE2 NATIVE API STRING EXTRACTION FUNCTIONS</a><br>
+<P>
+<b>int pcre2_substring_copy_byname(pcre2_match_data *<i>match_data</i>,</b>
+<b>  PCRE2_SPTR <i>name</i>, PCRE2_UCHAR *<i>buffer</i>, PCRE2_SIZE *<i>bufflen</i>);</b>
+<br>
+<br>
+<b>int pcre2_substring_copy_bynumber(pcre2_match_data *<i>match_data</i>,</b>
+<b>  uint32_t <i>number</i>, PCRE2_UCHAR *<i>buffer</i>,</b>
+<b>  PCRE2_SIZE *<i>bufflen</i>);</b>
+<br>
+<br>
+<b>void pcre2_substring_free(PCRE2_UCHAR *<i>buffer</i>);</b>
+<br>
+<br>
+<b>int pcre2_substring_get_byname(pcre2_match_data *<i>match_data</i>,</b>
+<b>  PCRE2_SPTR <i>name</i>, PCRE2_UCHAR **<i>bufferptr</i>, PCRE2_SIZE *<i>bufflen</i>);</b>
+<br>
+<br>
+<b>int pcre2_substring_get_bynumber(pcre2_match_data *<i>match_data</i>,</b>
+<b>  uint32_t <i>number</i>, PCRE2_UCHAR **<i>bufferptr</i>,</b>
+<b>  PCRE2_SIZE *<i>bufflen</i>);</b>
+<br>
+<br>
+<b>int pcre2_substring_length_byname(pcre2_match_data *<i>match_data</i>,</b>
+<b>  PCRE2_SPTR <i>name</i>, PCRE2_SIZE *<i>length</i>);</b>
+<br>
+<br>
+<b>int pcre2_substring_length_bynumber(pcre2_match_data *<i>match_data</i>,</b>
+<b>  uint32_t <i>number</i>, PCRE2_SIZE *<i>length</i>);</b>
+<br>
+<br>
+<b>int pcre2_substring_nametable_scan(const pcre2_code *<i>code</i>,</b>
+<b>  PCRE2_SPTR <i>name</i>, PCRE2_SPTR *<i>first</i>, PCRE2_SPTR *<i>last</i>);</b>
+<br>
+<br>
+<b>int pcre2_substring_number_from_name(const pcre2_code *<i>code</i>,</b>
+<b>  PCRE2_SPTR <i>name</i>);</b>
+<br>
+<br>
+<b>void pcre2_substring_list_free(PCRE2_SPTR *<i>list</i>);</b>
+<br>
+<br>
+<b>int pcre2_substring_list_get(pcre2_match_data *<i>match_data</i>,</b>
+<b>"  PCRE2_UCHAR ***<i>listptr</i>, PCRE2_SIZE **<i>lengthsptr</i>);</b>
+</P>
+<br><a name="SEC7" href="#TOC1">PCRE2 NATIVE API STRING SUBSTITUTION FUNCTION</a><br>
+<P>
+<b>int pcre2_substitute(const pcre2_code *<i>code</i>, PCRE2_SPTR <i>subject</i>,</b>
+<b>  PCRE2_SIZE <i>length</i>, PCRE2_SIZE <i>startoffset</i>,</b>
+<b>  uint32_t <i>options</i>, pcre2_match_data *<i>match_data</i>,</b>
+<b>  pcre2_match_context *<i>mcontext</i>, PCRE2_SPTR \fIreplacementzfP,</b>
+<b>  PCRE2_SIZE <i>rlength</i>, PCRE2_UCHAR *<i>outputbuffer</i>,</b>
+<b>  PCRE2_SIZE *<i>outlengthptr</i>);</b>
+</P>
+<br><a name="SEC8" href="#TOC1">PCRE2 NATIVE API JIT FUNCTIONS</a><br>
+<P>
+<b>int pcre2_jit_compile(pcre2_code *<i>code</i>, uint32_t <i>options</i>);</b>
+<br>
+<br>
+<b>int pcre2_jit_match(const pcre2_code *<i>code</i>, PCRE2_SPTR <i>subject</i>,</b>
+<b>  PCRE2_SIZE <i>length</i>, PCRE2_SIZE <i>startoffset</i>,</b>
+<b>  uint32_t <i>options</i>, pcre2_match_data *<i>match_data</i>,</b>
+<b>  pcre2_match_context *<i>mcontext</i>);</b>
+<br>
+<br>
+<b>void pcre2_jit_free_unused_memory(pcre2_general_context *<i>gcontext</i>);</b>
+<br>
+<br>
+<b>pcre2_jit_stack *pcre2_jit_stack_create(PCRE2_SIZE <i>startsize</i>,</b>
+<b>  PCRE2_SIZE <i>maxsize</i>, pcre2_general_context *<i>gcontext</i>);</b>
+<br>
+<br>
+<b>void pcre2_jit_stack_assign(pcre2_match_context *<i>mcontext</i>,</b>
+<b>  pcre2_jit_callback <i>callback_function</i>, void *<i>callback_data</i>);</b>
+<br>
+<br>
+<b>void pcre2_jit_stack_free(pcre2_jit_stack *<i>jit_stack</i>);</b>
+</P>
+<br><a name="SEC9" href="#TOC1">PCRE2 NATIVE API SERIALIZATION FUNCTIONS</a><br>
+<P>
+<b>int32_t pcre2_serialize_decode(pcre2_code **<i>codes</i>,</b>
+<b>  int32_t <i>number_of_codes</i>, const uint8_t *<i>bytes</i>,</b>
+<b>  pcre2_general_context *<i>gcontext</i>);</b>
+<br>
+<br>
+<b>int32_t pcre2_serialize_encode(const pcre2_code **<i>codes</i>,</b>
+<b>  int32_t <i>number_of_codes</i>, uint8_t **<i>serialized_bytes</i>,</b>
+<b>  PCRE2_SIZE *<i>serialized_size</i>, pcre2_general_context *<i>gcontext</i>);</b>
+<br>
+<br>
+<b>void pcre2_serialize_free(uint8_t *<i>bytes</i>);</b>
+<br>
+<br>
+<b>int32_t pcre2_serialize_get_number_of_codes(const uint8_t *<i>bytes</i>);</b>
+</P>
+<br><a name="SEC10" href="#TOC1">PCRE2 NATIVE API AUXILIARY FUNCTIONS</a><br>
+<P>
+<b>int pcre2_get_error_message(int <i>errorcode</i>, PCRE2_UCHAR *<i>buffer</i>,</b>
+<b>  PCRE2_SIZE <i>bufflen</i>);</b>
+<br>
+<br>
+<b>const unsigned char *pcre2_maketables(pcre2_general_context *<i>gcontext</i>);</b>
+<br>
+<br>
+<b>int pcre2_pattern_info(const pcre2 *<i>code</i>, uint32_t <i>what</i>, void *<i>where</i>);</b>
+<br>
+<br>
+<b>int pcre2_callout_enumerate(const pcre2_code *<i>code</i>,</b>
+<b>  int (*<i>callback</i>)(pcre2_callout_enumerate_block *, void *),</b>
+<b>  void *<i>user_data</i>);</b>
+<br>
+<br>
+<b>int pcre2_config(uint32_t <i>what</i>, void *<i>where</i>);</b>
+</P>
+<br><a name="SEC11" href="#TOC1">PCRE2 8-BIT, 16-BIT, AND 32-BIT LIBRARIES</a><br>
+<P>
+There are three PCRE2 libraries, supporting 8-bit, 16-bit, and 32-bit code
+units, respectively. However, there is just one header file, <b>pcre2.h</b>.
+This contains the function prototypes and other definitions for all three
+libraries. One, two, or all three can be installed simultaneously. On Unix-like
+systems the libraries are called <b>libpcre2-8</b>, <b>libpcre2-16</b>, and
+<b>libpcre2-32</b>, and they can also co-exist with the original PCRE libraries.
+</P>
+<P>
+Character strings are passed to and from a PCRE2 library as a sequence of
+unsigned integers in code units of the appropriate width. Every PCRE2 function
+comes in three different forms, one for each library, for example:
+<pre>
+  <b>pcre2_compile_8()</b>
+  <b>pcre2_compile_16()</b>
+  <b>pcre2_compile_32()</b>
+</pre>
+There are also three different sets of data types:
+<pre>
+  <b>PCRE2_UCHAR8, PCRE2_UCHAR16, PCRE2_UCHAR32</b>
+  <b>PCRE2_SPTR8,  PCRE2_SPTR16,  PCRE2_SPTR32</b>
+</pre>
+The UCHAR types define unsigned code units of the appropriate widths. For
+example, PCRE2_UCHAR16 is usually defined as `uint16_t'. The SPTR types are
+constant pointers to the equivalent UCHAR types, that is, they are pointers to
+vectors of unsigned code units.
+</P>
+<P>
+Many applications use only one code unit width. For their convenience, macros
+are defined whose names are the generic forms such as <b>pcre2_compile()</b> and
+PCRE2_SPTR. These macros use the value of the macro PCRE2_CODE_UNIT_WIDTH to
+generate the appropriate width-specific function and macro names.
+PCRE2_CODE_UNIT_WIDTH is not defined by default. An application must define it
+to be 8, 16, or 32 before including <b>pcre2.h</b> in order to make use of the
+generic names.
+</P>
+<P>
+Applications that use more than one code unit width can be linked with more
+than one PCRE2 library, but must define PCRE2_CODE_UNIT_WIDTH to be 0 before
+including <b>pcre2.h</b>, and then use the real function names. Any code that is
+to be included in an environment where the value of PCRE2_CODE_UNIT_WIDTH is
+unknown should also use the real function names. (Unfortunately, it is not
+possible in C code to save and restore the value of a macro.)
+</P>
+<P>
+If PCRE2_CODE_UNIT_WIDTH is not defined before including <b>pcre2.h</b>, a
+compiler error occurs.
+</P>
+<P>
+When using multiple libraries in an application, you must take care when
+processing any particular pattern to use only functions from a single library.
+For example, if you want to run a match using a pattern that was compiled with
+<b>pcre2_compile_16()</b>, you must do so with <b>pcre2_match_16()</b>, not
+<b>pcre2_match_8()</b>.
+</P>
+<P>
+In the function summaries above, and in the rest of this document and other
+PCRE2 documents, functions and data types are described using their generic
+names, without the 8, 16, or 32 suffix.
+</P>
+<br><a name="SEC12" href="#TOC1">PCRE2 API OVERVIEW</a><br>
+<P>
+PCRE2 has its own native API, which is described in this document. There are
+also some wrapper functions for the 8-bit library that correspond to the
+POSIX regular expression API, but they do not give access to all the
+functionality. They are described in the
+<a href="pcre2posix.html"><b>pcre2posix</b></a>
+documentation. Both these APIs define a set of C function calls.
+</P>
+<P>
+The native API C data types, function prototypes, option values, and error
+codes are defined in the header file <b>pcre2.h</b>, which contains definitions
+of PCRE2_MAJOR and PCRE2_MINOR, the major and minor release numbers for the
+library. Applications can use these to include support for different releases
+of PCRE2.
+</P>
+<P>
+In a Windows environment, if you want to statically link an application program
+against a non-dll PCRE2 library, you must define PCRE2_STATIC before including
+<b>pcre2.h</b>.
+</P>
+<P>
+The functions <b>pcre2_compile()</b>, and <b>pcre2_match()</b> are used for
+compiling and matching regular expressions in a Perl-compatible manner. A
+sample program that demonstrates the simplest way of using them is provided in
+the file called <i>pcre2demo.c</i> in the PCRE2 source distribution. A listing
+of this program is given in the
+<a href="pcre2demo.html"><b>pcre2demo</b></a>
+documentation, and the
+<a href="pcre2sample.html"><b>pcre2sample</b></a>
+documentation describes how to compile and run it.
+</P>
+<P>
+Just-in-time compiler support is an optional feature of PCRE2 that can be built
+in appropriate hardware environments. It greatly speeds up the matching
+performance of many patterns. Programs can request that it be used if
+available, by calling <b>pcre2_jit_compile()</b> after a pattern has been
+successfully compiled by <b>pcre2_compile()</b>. This does nothing if JIT
+support is not available.
+</P>
+<P>
+More complicated programs might need to make use of the specialist functions
+<b>pcre2_jit_stack_create()</b>, <b>pcre2_jit_stack_free()</b>, and
+<b>pcre2_jit_stack_assign()</b> in order to control the JIT code's memory usage.
+</P>
+<P>
+JIT matching is automatically used by <b>pcre2_match()</b> if it is available.
+There is also a direct interface for JIT matching, which gives improved
+performance. The JIT-specific functions are discussed in the
+<a href="pcre2jit.html"><b>pcre2jit</b></a>
+documentation.
+</P>
+<P>
+A second matching function, <b>pcre2_dfa_match()</b>, which is not
+Perl-compatible, is also provided. This uses a different algorithm for the
+matching. The alternative algorithm finds all possible matches (at a given
+point in the subject), and scans the subject just once (unless there are
+lookbehind assertions). However, this algorithm does not return captured
+substrings. A description of the two matching algorithms and their advantages
+and disadvantages is given in the
+<a href="pcre2matching.html"><b>pcre2matching</b></a>
+documentation. There is no JIT support for <b>pcre2_dfa_match()</b>.
+</P>
+<P>
+In addition to the main compiling and matching functions, there are convenience
+functions for extracting captured substrings from a subject string that has
+been matched by <b>pcre2_match()</b>. They are:
+<pre>
+  <b>pcre2_substring_copy_byname()</b>
+  <b>pcre2_substring_copy_bynumber()</b>
+  <b>pcre2_substring_get_byname()</b>
+  <b>pcre2_substring_get_bynumber()</b>
+  <b>pcre2_substring_list_get()</b>
+  <b>pcre2_substring_length_byname()</b>
+  <b>pcre2_substring_length_bynumber()</b>
+  <b>pcre2_substring_nametable_scan()</b>
+  <b>pcre2_substring_number_from_name()</b>
+</pre>
+<b>pcre2_substring_free()</b> and <b>pcre2_substring_list_free()</b> are also
+provided, to free the memory used for extracted strings.
+</P>
+<P>
+The function <b>pcre2_substitute()</b> can be called to match a pattern and
+return a copy of the subject string with substitutions for parts that were
+matched.
+</P>
+<P>
+Finally, there are functions for finding out information about a compiled
+pattern (<b>pcre2_pattern_info()</b>) and about the configuration with which
+PCRE2 was built (<b>pcre2_config()</b>).
+</P>
+<br><a name="SEC13" href="#TOC1">STRING LENGTHS AND OFFSETS</a><br>
+<P>
+The PCRE2 API uses string lengths and offsets into strings of code units in
+several places. These values are always of type PCRE2_SIZE, which is an
+unsigned integer type, currently always defined as <i>size_t</i>. The largest
+value that can be stored in such a type (that is ~(PCRE2_SIZE)0) is reserved
+as a special indicator for zero-terminated strings and unset offsets.
+Therefore, the longest string that can be handled is one less than this
+maximum.
+<a name="newlines"></a></P>
+<br><a name="SEC14" href="#TOC1">NEWLINES</a><br>
+<P>
+PCRE2 supports five different conventions for indicating line breaks in
+strings: a single CR (carriage return) character, a single LF (linefeed)
+character, the two-character sequence CRLF, any of the three preceding, or any
+Unicode newline sequence. The Unicode newline sequences are the three just
+mentioned, plus the single characters VT (vertical tab, U+000B), FF (form feed,
+U+000C), NEL (next line, U+0085), LS (line separator, U+2028), and PS
+(paragraph separator, U+2029).
+</P>
+<P>
+Each of the first three conventions is used by at least one operating system as
+its standard newline sequence. When PCRE2 is built, a default can be specified.
+The default default is LF, which is the Unix standard. However, the newline
+convention can be changed by an application when calling <b>pcre2_compile()</b>,
+or it can be specified by special text at the start of the pattern itself; this
+overrides any other settings. See the
+<a href="pcre2pattern.html"><b>pcre2pattern</b></a>
+page for details of the special character sequences.
+</P>
+<P>
+In the PCRE2 documentation the word "newline" is used to mean "the character or
+pair of characters that indicate a line break". The choice of newline
+convention affects the handling of the dot, circumflex, and dollar
+metacharacters, the handling of #-comments in /x mode, and, when CRLF is a
+recognized line ending sequence, the match position advancement for a
+non-anchored pattern. There is more detail about this in the
+<a href="#matchoptions">section on <b>pcre2_match()</b> options</a>
+below.
+</P>
+<P>
+The choice of newline convention does not affect the interpretation of
+the \n or \r escape sequences, nor does it affect what \R matches; this has
+its own separate convention.
+</P>
+<br><a name="SEC15" href="#TOC1">MULTITHREADING</a><br>
+<P>
+In a multithreaded application it is important to keep thread-specific data
+separate from data that can be shared between threads. The PCRE2 library code
+itself is thread-safe: it contains no static or global variables. The API is
+designed to be fairly simple for non-threaded applications while at the same
+time ensuring that multithreaded applications can use it.
+</P>
+<P>
+There are several different blocks of data that are used to pass information
+between the application and the PCRE2 libraries.
+</P>
+<P>
+(1) A pointer to the compiled form of a pattern is returned to the user when
+<b>pcre2_compile()</b> is successful. The data in the compiled pattern is fixed,
+and does not change when the pattern is matched. Therefore, it is thread-safe,
+that is, the same compiled pattern can be used by more than one thread
+simultaneously. An application can compile all its patterns at the start,
+before forking off multiple threads that use them. However, if the just-in-time
+optimization feature is being used, it needs separate memory stack areas for
+each thread. See the
+<a href="pcre2jit.html"><b>pcre2jit</b></a>
+documentation for more details.
+</P>
+<P>
+(2) The next section below introduces the idea of "contexts" in which PCRE2
+functions are called. A context is nothing more than a collection of parameters
+that control the way PCRE2 operates. Grouping a number of parameters together
+in a context is a convenient way of passing them to a PCRE2 function without
+using lots of arguments. The parameters that are stored in contexts are in some
+sense "advanced features" of the API. Many straightforward applications will
+not need to use contexts.
+</P>
+<P>
+In a multithreaded application, if the parameters in a context are values that
+are never changed, the same context can be used by all the threads. However, if
+any thread needs to change any value in a context, it must make its own
+thread-specific copy.
+</P>
+<P>
+(3) The matching functions need a block of memory for working space and for
+storing the results of a match. This includes details of what was matched, as
+well as additional information such as the name of a (*MARK) setting. Each
+thread must provide its own version of this memory.
+</P>
+<br><a name="SEC16" href="#TOC1">PCRE2 CONTEXTS</a><br>
+<P>
+Some PCRE2 functions have a lot of parameters, many of which are used only by
+specialist applications, for example, those that use custom memory management
+or non-standard character tables. To keep function argument lists at a
+reasonable size, and at the same time to keep the API extensible, "uncommon"
+parameters are passed to certain functions in a <b>context</b> instead of
+directly. A context is just a block of memory that holds the parameter values.
+Applications that do not need to adjust any of the context parameters can pass
+NULL when a context pointer is required.
+</P>
+<P>
+There are three different types of context: a general context that is relevant
+for several PCRE2 operations, a compile-time context, and a match-time context.
+</P>
+<br><b>
+The general context
+</b><br>
+<P>
+At present, this context just contains pointers to (and data for) external
+memory management functions that are called from several places in the PCRE2
+library. The context is named `general' rather than specifically `memory'
+because in future other fields may be added. If you do not want to supply your
+own custom memory management functions, you do not need to bother with a
+general context. A general context is created by:
+<b>pcre2_general_context *pcre2_general_context_create(</b>
+<b>  void *(*<i>private_malloc</i>)(PCRE2_SIZE, void *),</b>
+<b>  void (*<i>private_free</i>)(void *, void *), void *<i>memory_data</i>);</b>
+<br>
+<br>
+The two function pointers specify custom memory management functions, whose
+prototypes are:
+<pre>
+  <b>void *private_malloc(PCRE2_SIZE, void *);</b>
+  <b>void  private_free(void *, void *);</b>
+</pre>
+Whenever code in PCRE2 calls these functions, the final argument is the value
+of <i>memory_data</i>. Either of the first two arguments of the creation
+function may be NULL, in which case the system memory management functions
+<i>malloc()</i> and <i>free()</i> are used. (This is not currently useful, as
+there are no other fields in a general context, but in future there might be.)
+The <i>private_malloc()</i> function is used (if supplied) to obtain memory for
+storing the context, and all three values are saved as part of the context.
+</P>
+<P>
+Whenever PCRE2 creates a data block of any kind, the block contains a pointer
+to the <i>free()</i> function that matches the <i>malloc()</i> function that was
+used. When the time comes to free the block, this function is called.
+</P>
+<P>
+A general context can be copied by calling:
+<b>pcre2_general_context *pcre2_general_context_copy(</b>
+<b>  pcre2_general_context *<i>gcontext</i>);</b>
+<br>
+<br>
+The memory used for a general context should be freed by calling:
+<b>void pcre2_general_context_free(pcre2_general_context *<i>gcontext</i>);</b>
+<a name="compilecontext"></a></P>
+<br><b>
+The compile context
+</b><br>
+<P>
+A compile context is required if you want to change the default values of any
+of the following compile-time parameters:
+<pre>
+  What \R matches (Unicode newlines or CR, LF, CRLF only)
+  PCRE2's character tables
+  The newline character sequence
+  The compile time nested parentheses limit
+  The maximum length of the pattern string
+  An external function for stack checking
+</pre>
+A compile context is also required if you are using custom memory management.
+If none of these apply, just pass NULL as the context argument of
+<i>pcre2_compile()</i>.
+</P>
+<P>
+A compile context is created, copied, and freed by the following functions:
+<b>pcre2_compile_context *pcre2_compile_context_create(</b>
+<b>  pcre2_general_context *<i>gcontext</i>);</b>
+<br>
+<br>
+<b>pcre2_compile_context *pcre2_compile_context_copy(</b>
+<b>  pcre2_compile_context *<i>ccontext</i>);</b>
+<br>
+<br>
+<b>void pcre2_compile_context_free(pcre2_compile_context *<i>ccontext</i>);</b>
+<br>
+<br>
+A compile context is created with default values for its parameters. These can
+be changed by calling the following functions, which return 0 on success, or
+PCRE2_ERROR_BADDATA if invalid data is detected.
+<b>int pcre2_set_bsr(pcre2_compile_context *<i>ccontext</i>,</b>
+<b>  uint32_t <i>value</i>);</b>
+<br>
+<br>
+The value must be PCRE2_BSR_ANYCRLF, to specify that \R matches only CR, LF,
+or CRLF, or PCRE2_BSR_UNICODE, to specify that \R matches any Unicode line
+ending sequence. The value is used by the JIT compiler and by the two
+interpreted matching functions, <i>pcre2_match()</i> and
+<i>pcre2_dfa_match()</i>.
+<b>int pcre2_set_character_tables(pcre2_compile_context *<i>ccontext</i>,</b>
+<b>  const unsigned char *<i>tables</i>);</b>
+<br>
+<br>
+The value must be the result of a call to <i>pcre2_maketables()</i>, whose only
+argument is a general context. This function builds a set of character tables
+in the current locale.
+<b>int pcre2_set_max_pattern_length(pcre2_compile_context *<i>ccontext</i>,</b>
+<b>  PCRE2_SIZE <i>value</i>);</b>
+<br>
+<br>
+This sets a maximum length, in code units, for the pattern string that is to be
+compiled. If the pattern is longer, an error is generated. This facility is
+provided so that applications that accept patterns from external sources can
+limit their size. The default is the largest number that a PCRE2_SIZE variable
+can hold, which is effectively unlimited.
+<b>int pcre2_set_newline(pcre2_compile_context *<i>ccontext</i>,</b>
+<b>  uint32_t <i>value</i>);</b>
+<br>
+<br>
+This specifies which characters or character sequences are to be recognized as
+newlines. The value must be one of PCRE2_NEWLINE_CR (carriage return only),
+PCRE2_NEWLINE_LF (linefeed only), PCRE2_NEWLINE_CRLF (the two-character
+sequence CR followed by LF), PCRE2_NEWLINE_ANYCRLF (any of the above), or
+PCRE2_NEWLINE_ANY (any Unicode newline sequence).
+</P>
+<P>
+When a pattern is compiled with the PCRE2_EXTENDED option, the value of this
+parameter affects the recognition of white space and the end of internal
+comments starting with #. The value is saved with the compiled pattern for
+subsequent use by the JIT compiler and by the two interpreted matching
+functions, <i>pcre2_match()</i> and <i>pcre2_dfa_match()</i>.
+<b>int pcre2_set_parens_nest_limit(pcre2_compile_context *<i>ccontext</i>,</b>
+<b>  uint32_t <i>value</i>);</b>
+<br>
+<br>
+This parameter ajusts the limit, set when PCRE2 is built (default 250), on the
+depth of parenthesis nesting in a pattern. This limit stops rogue patterns
+using up too much system stack when being compiled.
+<b>int pcre2_set_compile_recursion_guard(pcre2_compile_context *<i>ccontext</i>,</b>
+<b>  int (*<i>guard_function</i>)(uint32_t, void *), void *<i>user_data</i>);</b>
+<br>
+<br>
+There is at least one application that runs PCRE2 in threads with very limited
+system stack, where running out of stack is to be avoided at all costs. The
+parenthesis limit above cannot take account of how much stack is actually
+available. For a finer control, you can supply a function that is called
+whenever <b>pcre2_compile()</b> starts to compile a parenthesized part of a
+pattern. This function can check the actual stack size (or anything else that
+it wants to, of course).
+</P>
+<P>
+The first argument to the callout function gives the current depth of
+nesting, and the second is user data that is set up by the last argument of
+<b>pcre2_set_compile_recursion_guard()</b>. The callout function should return
+zero if all is well, or non-zero to force an error.
+<a name="matchcontext"></a></P>
+<br><b>
+The match context
+</b><br>
+<P>
+A match context is required if you want to change the default values of any
+of the following match-time parameters:
+<pre>
+  A callout function
+  The offset limit for matching an unanchored pattern
+  The limit for calling <b>match()</b> (see below)
+  The limit for calling <b>match()</b> recursively
+</pre>
+A match context is also required if you are using custom memory management.
+If none of these apply, just pass NULL as the context argument of
+<b>pcre2_match()</b>, <b>pcre2_dfa_match()</b>, or <b>pcre2_jit_match()</b>.
+</P>
+<P>
+A match context is created, copied, and freed by the following functions:
+<b>pcre2_match_context *pcre2_match_context_create(</b>
+<b>  pcre2_general_context *<i>gcontext</i>);</b>
+<br>
+<br>
+<b>pcre2_match_context *pcre2_match_context_copy(</b>
+<b>  pcre2_match_context *<i>mcontext</i>);</b>
+<br>
+<br>
+<b>void pcre2_match_context_free(pcre2_match_context *<i>mcontext</i>);</b>
+<br>
+<br>
+A match context is created with default values for its parameters. These can
+be changed by calling the following functions, which return 0 on success, or
+PCRE2_ERROR_BADDATA if invalid data is detected.
+<b>int pcre2_set_callout(pcre2_match_context *<i>mcontext</i>,</b>
+<b>  int (*<i>callout_function</i>)(pcre2_callout_block *, void *),</b>
+<b>  void *<i>callout_data</i>);</b>
+<br>
+<br>
+This sets up a "callout" function, which PCRE2 will call at specified points
+during a matching operation. Details are given in the
+<a href="pcre2callout.html"><b>pcre2callout</b></a>
+documentation.
+<b>int pcre2_set_offset_limit(pcre2_match_context *<i>mcontext</i>,</b>
+<b>  PCRE2_SIZE <i>value</i>);</b>
+<br>
+<br>
+The <i>offset_limit</i> parameter limits how far an unanchored search can
+advance in the subject string. The default value is PCRE2_UNSET. The
+<b>pcre2_match()</b> and <b>pcre2_dfa_match()</b> functions return
+PCRE2_ERROR_NOMATCH if a match with a starting point before or at the given
+offset is not found. For example, if the pattern /abc/ is matched against
+"123abc" with an offset limit less than 3, the result is PCRE2_ERROR_NO_MATCH.
+A match can never be found if the <i>startoffset</i> argument of
+<b>pcre2_match()</b> or <b>pcre2_dfa_match()</b> is greater than the offset
+limit.
+</P>
+<P>
+When using this facility, you must set PCRE2_USE_OFFSET_LIMIT when calling
+<b>pcre2_compile()</b> so that when JIT is in use, different code can be
+compiled. If a match is started with a non-default match limit when
+PCRE2_USE_OFFSET_LIMIT is not set, an error is generated.
+</P>
+<P>
+The offset limit facility can be used to track progress when searching large
+subject strings. See also the PCRE2_FIRSTLINE option, which requires a match to
+start within the first line of the subject. If this is set with an offset
+limit, a match must occur in the first line and also within the offset limit.
+In other words, whichever limit comes first is used.
+<b>int pcre2_set_match_limit(pcre2_match_context *<i>mcontext</i>,</b>
+<b>  uint32_t <i>value</i>);</b>
+<br>
+<br>
+The <i>match_limit</i> parameter provides a means of preventing PCRE2 from using
+up too many resources when processing patterns that are not going to match, but
+which have a very large number of possibilities in their search trees. The
+classic example is a pattern that uses nested unlimited repeats.
+</P>
+<P>
+Internally, <b>pcre2_match()</b> uses a function called <b>match()</b>, which it
+calls repeatedly (sometimes recursively). The limit set by <i>match_limit</i> is
+imposed on the number of times this function is called during a match, which
+has the effect of limiting the amount of backtracking that can take place. For
+patterns that are not anchored, the count restarts from zero for each position
+in the subject string. This limit is not relevant to <b>pcre2_dfa_match()</b>,
+which ignores it.
+</P>
+<P>
+When <b>pcre2_match()</b> is called with a pattern that was successfully
+processed by <b>pcre2_jit_compile()</b>, the way in which matching is executed
+is entirely different. However, there is still the possibility of runaway
+matching that goes on for a very long time, and so the <i>match_limit</i> value
+is also used in this case (but in a different way) to limit how long the
+matching can continue.
+</P>
+<P>
+The default value for the limit can be set when PCRE2 is built; the default
+default is 10 million, which handles all but the most extreme cases. If the
+limit is exceeded, <b>pcre2_match()</b> returns PCRE2_ERROR_MATCHLIMIT. A value
+for the match limit may also be supplied by an item at the start of a pattern
+of the form
+<pre>
+  (*LIMIT_MATCH=ddd)
+</pre>
+where ddd is a decimal number. However, such a setting is ignored unless ddd is
+less than the limit set by the caller of <b>pcre2_match()</b> or, if no such
+limit is set, less than the default.
+<b>int pcre2_set_recursion_limit(pcre2_match_context *<i>mcontext</i>,</b>
+<b>  uint32_t <i>value</i>);</b>
+<br>
+<br>
+The <i>recursion_limit</i> parameter is similar to <i>match_limit</i>, but
+instead of limiting the total number of times that <b>match()</b> is called, it
+limits the depth of recursion. The recursion depth is a smaller number than the
+total number of calls, because not all calls to <b>match()</b> are recursive.
+This limit is of use only if it is set smaller than <i>match_limit</i>.
+</P>
+<P>
+Limiting the recursion depth limits the amount of system stack that can be
+used, or, when PCRE2 has been compiled to use memory on the heap instead of the
+stack, the amount of heap memory that can be used. This limit is not relevant,
+and is ignored, when matching is done using JIT compiled code or by the
+<b>pcre2_dfa_match()</b> function.
+</P>
+<P>
+The default value for <i>recursion_limit</i> can be set when PCRE2 is built; the
+default default is the same value as the default for <i>match_limit</i>. If the
+limit is exceeded, <b>pcre2_match()</b> returns PCRE2_ERROR_RECURSIONLIMIT. A
+value for the recursion limit may also be supplied by an item at the start of a
+pattern of the form
+<pre>
+  (*LIMIT_RECURSION=ddd)
+</pre>
+where ddd is a decimal number. However, such a setting is ignored unless ddd is
+less than the limit set by the caller of <b>pcre2_match()</b> or, if no such
+limit is set, less than the default.
+<b>int pcre2_set_recursion_memory_management(</b>
+<b>  pcre2_match_context *<i>mcontext</i>,</b>
+<b>  void *(*<i>private_malloc</i>)(PCRE2_SIZE, void *),</b>
+<b>  void (*<i>private_free</i>)(void *, void *), void *<i>memory_data</i>);</b>
+<br>
+<br>
+This function sets up two additional custom memory management functions for use
+by <b>pcre2_match()</b> when PCRE2 is compiled to use the heap for remembering
+backtracking data, instead of recursive function calls that use the system
+stack. There is a discussion about PCRE2's stack usage in the
+<a href="pcre2stack.html"><b>pcre2stack</b></a>
+documentation. See the
+<a href="pcre2build.html"><b>pcre2build</b></a>
+documentation for details of how to build PCRE2.
+</P>
+<P>
+Using the heap for recursion is a non-standard way of building PCRE2, for use
+in environments that have limited stacks. Because of the greater use of memory
+management, <b>pcre2_match()</b> runs more slowly. Functions that are different
+to the general custom memory functions are provided so that special-purpose
+external code can be used for this case, because the memory blocks are all the
+same size. The blocks are retained by <b>pcre2_match()</b> until it is about to
+exit so that they can be re-used when possible during the match. In the absence
+of these functions, the normal custom memory management functions are used, if
+supplied, otherwise the system functions.
+</P>
+<br><a name="SEC17" href="#TOC1">CHECKING BUILD-TIME OPTIONS</a><br>
+<P>
+<b>int pcre2_config(uint32_t <i>what</i>, void *<i>where</i>);</b>
+</P>
+<P>
+The function <b>pcre2_config()</b> makes it possible for a PCRE2 client to
+discover which optional features have been compiled into the PCRE2 library. The
+<a href="pcre2build.html"><b>pcre2build</b></a>
+documentation has more details about these optional features.
+</P>
+<P>
+The first argument for <b>pcre2_config()</b> specifies which information is
+required. The second argument is a pointer to memory into which the information
+is placed. If NULL is passed, the function returns the amount of memory that is
+needed for the requested information. For calls that return numerical values,
+the value is in bytes; when requesting these values, <i>where</i> should point
+to appropriately aligned memory. For calls that return strings, the required
+length is given in code units, not counting the terminating zero.
+</P>
+<P>
+When requesting information, the returned value from <b>pcre2_config()</b> is
+non-negative on success, or the negative error code PCRE2_ERROR_BADOPTION if
+the value in the first argument is not recognized. The following information is
+available:
+<pre>
+  PCRE2_CONFIG_BSR
+</pre>
+The output is a uint32_t integer whose value indicates what character
+sequences the \R escape sequence matches by default. A value of
+PCRE2_BSR_UNICODE means that \R matches any Unicode line ending sequence; a
+value of PCRE2_BSR_ANYCRLF means that \R matches only CR, LF, or CRLF. The
+default can be overridden when a pattern is compiled.
+<pre>
+  PCRE2_CONFIG_JIT
+</pre>
+The output is a uint32_t integer that is set to one if support for just-in-time
+compiling is available; otherwise it is set to zero.
+<pre>
+  PCRE2_CONFIG_JITTARGET
+</pre>
+The <i>where</i> argument should point to a buffer that is at least 48 code
+units long. (The exact length required can be found by calling
+<b>pcre2_config()</b> with <b>where</b> set to NULL.) The buffer is filled with a
+string that contains the name of the architecture for which the JIT compiler is
+configured, for example "x86 32bit (little endian + unaligned)". If JIT support
+is not available, PCRE2_ERROR_BADOPTION is returned, otherwise the number of
+code units used is returned. This is the length of the string, plus one unit
+for the terminating zero.
+<pre>
+  PCRE2_CONFIG_LINKSIZE
+</pre>
+The output is a uint32_t integer that contains the number of bytes used for
+internal linkage in compiled regular expressions. When PCRE2 is configured, the
+value can be set to 2, 3, or 4, with the default being 2. This is the value
+that is returned by <b>pcre2_config()</b>. However, when the 16-bit library is
+compiled, a value of 3 is rounded up to 4, and when the 32-bit library is
+compiled, internal linkages always use 4 bytes, so the configured value is not
+relevant.
+</P>
+<P>
+The default value of 2 for the 8-bit and 16-bit libraries is sufficient for all
+but the most massive patterns, since it allows the size of the compiled pattern
+to be up to 64K code units. Larger values allow larger regular expressions to
+be compiled by those two libraries, but at the expense of slower matching.
+<pre>
+  PCRE2_CONFIG_MATCHLIMIT
+</pre>
+The output is a uint32_t integer that gives the default limit for the number of
+internal matching function calls in a <b>pcre2_match()</b> execution. Further
+details are given with <b>pcre2_match()</b> below.
+<pre>
+  PCRE2_CONFIG_NEWLINE
+</pre>
+The output is a uint32_t integer whose value specifies the default character
+sequence that is recognized as meaning "newline". The values are:
+<pre>
+  PCRE2_NEWLINE_CR       Carriage return (CR)
+  PCRE2_NEWLINE_LF       Linefeed (LF)
+  PCRE2_NEWLINE_CRLF     Carriage return, linefeed (CRLF)
+  PCRE2_NEWLINE_ANY      Any Unicode line ending
+  PCRE2_NEWLINE_ANYCRLF  Any of CR, LF, or CRLF
+</pre>
+The default should normally correspond to the standard sequence for your
+operating system.
+<pre>
+  PCRE2_CONFIG_PARENSLIMIT
+</pre>
+The output is a uint32_t integer that gives the maximum depth of nesting
+of parentheses (of any kind) in a pattern. This limit is imposed to cap the
+amount of system stack used when a pattern is compiled. It is specified when
+PCRE2 is built; the default is 250. This limit does not take into account the
+stack that may already be used by the calling application. For finer control
+over compilation stack usage, see <b>pcre2_set_compile_recursion_guard()</b>.
+<pre>
+  PCRE2_CONFIG_RECURSIONLIMIT
+</pre>
+The output is a uint32_t integer that gives the default limit for the depth of
+recursion when calling the internal matching function in a <b>pcre2_match()</b>
+execution. Further details are given with <b>pcre2_match()</b> below.
+<pre>
+  PCRE2_CONFIG_STACKRECURSE
+</pre>
+The output is a uint32_t integer that is set to one if internal recursion when
+running <b>pcre2_match()</b> is implemented by recursive function calls that use
+the system stack to remember their state. This is the usual way that PCRE2 is
+compiled. The output is zero if PCRE2 was compiled to use blocks of data on the
+heap instead of recursive function calls.
+<pre>
+  PCRE2_CONFIG_UNICODE_VERSION
+</pre>
+The <i>where</i> argument should point to a buffer that is at least 24 code
+units long. (The exact length required can be found by calling
+<b>pcre2_config()</b> with <b>where</b> set to NULL.) If PCRE2 has been compiled
+without Unicode support, the buffer is filled with the text "Unicode not
+supported". Otherwise, the Unicode version string (for example, "8.0.0") is
+inserted. The number of code units used is returned. This is the length of the
+string plus one unit for the terminating zero.
+<pre>
+  PCRE2_CONFIG_UNICODE
+</pre>
+The output is a uint32_t integer that is set to one if Unicode support is
+available; otherwise it is set to zero. Unicode support implies UTF support.
+<pre>
+  PCRE2_CONFIG_VERSION
+</pre>
+The <i>where</i> argument should point to a buffer that is at least 12 code
+units long. (The exact length required can be found by calling
+<b>pcre2_config()</b> with <b>where</b> set to NULL.) The buffer is filled with
+the PCRE2 version string, zero-terminated. The number of code units used is
+returned. This is the length of the string plus one unit for the terminating
+zero.
+<a name="compiling"></a></P>
+<br><a name="SEC18" href="#TOC1">COMPILING A PATTERN</a><br>
+<P>
+<b>pcre2_code *pcre2_compile(PCRE2_SPTR <i>pattern</i>, PCRE2_SIZE <i>length</i>,</b>
+<b>  uint32_t <i>options</i>, int *<i>errorcode</i>, PCRE2_SIZE *<i>erroroffset,</i></b>
+<b>  pcre2_compile_context *<i>ccontext</i>);</b>
+<br>
+<br>
+<b>void pcre2_code_free(pcre2_code *<i>code</i>);</b>
+</P>
+<P>
+The <b>pcre2_compile()</b> function compiles a pattern into an internal form.
+The pattern is defined by a pointer to a string of code units and a length, If
+the pattern is zero-terminated, the length can be specified as
+PCRE2_ZERO_TERMINATED. The function returns a pointer to a block of memory that
+contains the compiled pattern and related data. The caller must free the memory
+by calling <b>pcre2_code_free()</b> when it is no longer needed.
+</P>
+<P>
+NOTE: When one of the matching functions is called, pointers to the compiled
+pattern and the subject string are set in the match data block so that they can
+be referenced by the extraction functions. After running a match, you must not
+free a compiled pattern (or a subject string) until after all operations on the
+<a href="#matchdatablock">match data block</a>
+have taken place.
+</P>
+<P>
+If the compile context argument <i>ccontext</i> is NULL, memory for the compiled
+pattern is obtained by calling <b>malloc()</b>. Otherwise, it is obtained from
+the same memory function that was used for the compile context.
+</P>
+<P>
+The <i>options</i> argument contains various bit settings that affect the
+compilation. It should be zero if no options are required. The available
+options are described below. Some of them (in particular, those that are
+compatible with Perl, but some others as well) can also be set and unset from
+within the pattern (see the detailed description in the
+<a href="pcre2pattern.html"><b>pcre2pattern</b></a>
+documentation).
+</P>
+<P>
+For those options that can be different in different parts of the pattern, the
+contents of the <i>options</i> argument specifies their settings at the start of
+compilation. The PCRE2_ANCHORED and PCRE2_NO_UTF_CHECK options can be set at
+the time of matching as well as at compile time.
+</P>
+<P>
+Other, less frequently required compile-time parameters (for example, the
+newline setting) can be provided in a compile context (as described
+<a href="#compilecontext">above).</a>
+</P>
+<P>
+If <i>errorcode</i> or <i>erroroffset</i> is NULL, <b>pcre2_compile()</b> returns
+NULL immediately. Otherwise, if compilation of a pattern fails,
+<b>pcre2_compile()</b> returns NULL, having set these variables to an error code
+and an offset (number of code units) within the pattern, respectively. The
+<b>pcre2_get_error_message()</b> function provides a textual message for each
+error code. Compilation errors are positive numbers, but UTF formatting errors
+are negative numbers. For an invalid UTF-8 or UTF-16 string, the offset is that
+of the first code unit of the failing character.
+</P>
+<P>
+Some errors are not detected until the whole pattern has been scanned; in these
+cases, the offset passed back is the length of the pattern. Note that the
+offset is in code units, not characters, even in a UTF mode. It may sometimes
+point into the middle of a UTF-8 or UTF-16 character.
+</P>
+<P>
+This code fragment shows a typical straightforward call to
+<b>pcre2_compile()</b>:
+<pre>
+  pcre2_code *re;
+  PCRE2_SIZE erroffset;
+  int errorcode;
+  re = pcre2_compile(
+    "^A.*Z",                /* the pattern */
+    PCRE2_ZERO_TERMINATED,  /* the pattern is zero-terminated */
+    0,                      /* default options */
+    &errorcode,             /* for error code */
+    &erroffset,             /* for error offset */
+    NULL);                  /* no compile context */
+</pre>
+The following names for option bits are defined in the <b>pcre2.h</b> header
+file:
+<pre>
+  PCRE2_ANCHORED
+</pre>
+If this bit is set, the pattern is forced to be "anchored", that is, it is
+constrained to match only at the first matching point in the string that is
+being searched (the "subject string"). This effect can also be achieved by
+appropriate constructs in the pattern itself, which is the only way to do it in
+Perl.
+<pre>
+  PCRE2_ALLOW_EMPTY_CLASS
+</pre>
+By default, for compatibility with Perl, a closing square bracket that
+immediately follows an opening one is treated as a data character for the
+class. When PCRE2_ALLOW_EMPTY_CLASS is set, it terminates the class, which
+therefore contains no characters and so can never match.
+<pre>
+  PCRE2_ALT_BSUX
+</pre>
+This option request alternative handling of three escape sequences, which
+makes PCRE2's behaviour more like ECMAscript (aka JavaScript). When it is set:
+</P>
+<P>
+(1) \U matches an upper case "U" character; by default \U causes a compile
+time error (Perl uses \U to upper case subsequent characters).
+</P>
+<P>
+(2) \u matches a lower case "u" character unless it is followed by four
+hexadecimal digits, in which case the hexadecimal number defines the code point
+to match. By default, \u causes a compile time error (Perl uses it to upper
+case the following character).
+</P>
+<P>
+(3) \x matches a lower case "x" character unless it is followed by two
+hexadecimal digits, in which case the hexadecimal number defines the code point
+to match. By default, as in Perl, a hexadecimal number is always expected after
+\x, but it may have zero, one, or two digits (so, for example, \xz matches a
+binary zero character followed by z).
+<pre>
+  PCRE2_ALT_CIRCUMFLEX
+</pre>
+In multiline mode (when PCRE2_MULTILINE is set), the circumflex metacharacter
+matches at the start of the subject (unless PCRE2_NOTBOL is set), and also
+after any internal newline. However, it does not match after a newline at the
+end of the subject, for compatibility with Perl. If you want a multiline
+circumflex also to match after a terminating newline, you must set
+PCRE2_ALT_CIRCUMFLEX.
+<pre>
+  PCRE2_ALT_VERBNAMES
+</pre>
+By default, for compatibility with Perl, the name in any verb sequence such as
+(*MARK:NAME) is any sequence of characters that does not include a closing
+parenthesis. The name is not processed in any way, and it is not possible to
+include a closing parenthesis in the name. However, if the PCRE2_ALT_VERBNAMES
+option is set, normal backslash processing is applied to verb names and only an
+unescaped closing parenthesis terminates the name. A closing parenthesis can be
+included in a name either as \) or between \Q and \E. If the PCRE2_EXTENDED
+option is set, unescaped whitespace in verb names is skipped and #-comments are
+recognized, exactly as in the rest of the pattern.
+<pre>
+  PCRE2_AUTO_CALLOUT
+</pre>
+If this bit is set, <b>pcre2_compile()</b> automatically inserts callout items,
+all with number 255, before each pattern item. For discussion of the callout
+facility, see the
+<a href="pcre2callout.html"><b>pcre2callout</b></a>
+documentation.
+<pre>
+  PCRE2_CASELESS
+</pre>
+If this bit is set, letters in the pattern match both upper and lower case
+letters in the subject. It is equivalent to Perl's /i option, and it can be
+changed within a pattern by a (?i) option setting.
+<pre>
+  PCRE2_DOLLAR_ENDONLY
+</pre>
+If this bit is set, a dollar metacharacter in the pattern matches only at the
+end of the subject string. Without this option, a dollar also matches
+immediately before a newline at the end of the string (but not before any other
+newlines). The PCRE2_DOLLAR_ENDONLY option is ignored if PCRE2_MULTILINE is
+set. There is no equivalent to this option in Perl, and no way to set it within
+a pattern.
+<pre>
+  PCRE2_DOTALL
+</pre>
+If this bit is set, a dot metacharacter in the pattern matches any character,
+including one that indicates a newline. However, it only ever matches one
+character, even if newlines are coded as CRLF. Without this option, a dot does
+not match when the current position in the subject is at a newline. This option
+is equivalent to Perl's /s option, and it can be changed within a pattern by a
+(?s) option setting. A negative class such as [^a] always matches newline
+characters, independent of the setting of this option.
+<pre>
+  PCRE2_DUPNAMES
+</pre>
+If this bit is set, names used to identify capturing subpatterns need not be
+unique. This can be helpful for certain types of pattern when it is known that
+only one instance of the named subpattern can ever be matched. There are more
+details of named subpatterns below; see also the
+<a href="pcre2pattern.html"><b>pcre2pattern</b></a>
+documentation.
+<pre>
+  PCRE2_EXTENDED
+</pre>
+If this bit is set, most white space characters in the pattern are totally
+ignored except when escaped or inside a character class. However, white space
+is not allowed within sequences such as (?&#62; that introduce various
+parenthesized subpatterns, nor within numerical quantifiers such as {1,3}.
+Ignorable white space is permitted between an item and a following quantifier
+and between a quantifier and a following + that indicates possessiveness.
+</P>
+<P>
+PCRE2_EXTENDED also causes characters between an unescaped # outside a
+character class and the next newline, inclusive, to be ignored, which makes it
+possible to include comments inside complicated patterns. Note that the end of
+this type of comment is a literal newline sequence in the pattern; escape
+sequences that happen to represent a newline do not count. PCRE2_EXTENDED is
+equivalent to Perl's /x option, and it can be changed within a pattern by a
+(?x) option setting.
+</P>
+<P>
+Which characters are interpreted as newlines can be specified by a setting in
+the compile context that is passed to <b>pcre2_compile()</b> or by a special
+sequence at the start of the pattern, as described in the section entitled
+<a href="pcre2pattern.html#newlines">"Newline conventions"</a>
+in the <b>pcre2pattern</b> documentation. A default is defined when PCRE2 is
+built.
+<pre>
+  PCRE2_FIRSTLINE
+</pre>
+If this option is set, an unanchored pattern is required to match before or at
+the first newline in the subject string, though the matched text may continue
+over the newline. See also PCRE2_USE_OFFSET_LIMIT, which provides a more
+general limiting facility. If PCRE2_FIRSTLINE is set with an offset limit, a
+match must occur in the first line and also within the offset limit. In other
+words, whichever limit comes first is used.
+<pre>
+  PCRE2_MATCH_UNSET_BACKREF
+</pre>
+If this option is set, a back reference to an unset subpattern group matches an
+empty string (by default this causes the current matching alternative to fail).
+A pattern such as (\1)(a) succeeds when this option is set (assuming it can
+find an "a" in the subject), whereas it fails by default, for Perl
+compatibility. Setting this option makes PCRE2 behave more like ECMAscript (aka
+JavaScript).
+<pre>
+  PCRE2_MULTILINE
+</pre>
+By default, for the purposes of matching "start of line" and "end of line",
+PCRE2 treats the subject string as consisting of a single line of characters,
+even if it actually contains newlines. The "start of line" metacharacter (^)
+matches only at the start of the string, and the "end of line" metacharacter
+($) matches only at the end of the string, or before a terminating newline
+(except when PCRE2_DOLLAR_ENDONLY is set). Note, however, that unless
+PCRE2_DOTALL is set, the "any character" metacharacter (.) does not match at a
+newline. This behaviour (for ^, $, and dot) is the same as Perl.
+</P>
+<P>
+When PCRE2_MULTILINE it is set, the "start of line" and "end of line"
+constructs match immediately following or immediately before internal newlines
+in the subject string, respectively, as well as at the very start and end. This
+is equivalent to Perl's /m option, and it can be changed within a pattern by a
+(?m) option setting. Note that the "start of line" metacharacter does not match
+after a newline at the end of the subject, for compatibility with Perl.
+However, you can change this by setting the PCRE2_ALT_CIRCUMFLEX option. If
+there are no newlines in a subject string, or no occurrences of ^ or $ in a
+pattern, setting PCRE2_MULTILINE has no effect.
+<pre>
+  PCRE2_NEVER_BACKSLASH_C
+</pre>
+This option locks out the use of \C in the pattern that is being compiled.
+This escape can cause unpredictable behaviour in UTF-8 or UTF-16 modes, because
+it may leave the current matching point in the middle of a multi-code-unit
+character. This option may be useful in applications that process patterns from
+external sources. Note that there is also a build-time option that permanently
+locks out the use of \C.
+<pre>
+  PCRE2_NEVER_UCP
+</pre>
+This option locks out the use of Unicode properties for handling \B, \b, \D,
+\d, \S, \s, \W, \w, and some of the POSIX character classes, as described
+for the PCRE2_UCP option below. In particular, it prevents the creator of the
+pattern from enabling this facility by starting the pattern with (*UCP). This
+option may be useful in applications that process patterns from external
+sources. The option combination PCRE_UCP and PCRE_NEVER_UCP causes an error.
+<pre>
+  PCRE2_NEVER_UTF
+</pre>
+This option locks out interpretation of the pattern as UTF-8, UTF-16, or
+UTF-32, depending on which library is in use. In particular, it prevents the
+creator of the pattern from switching to UTF interpretation by starting the
+pattern with (*UTF). This option may be useful in applications that process
+patterns from external sources. The combination of PCRE2_UTF and
+PCRE2_NEVER_UTF causes an error.
+<pre>
+  PCRE2_NO_AUTO_CAPTURE
+</pre>
+If this option is set, it disables the use of numbered capturing parentheses in
+the pattern. Any opening parenthesis that is not followed by ? behaves as if it
+were followed by ?: but named parentheses can still be used for capturing (and
+they acquire numbers in the usual way). There is no equivalent of this option
+in Perl.
+<pre>
+  PCRE2_NO_AUTO_POSSESS
+</pre>
+If this option is set, it disables "auto-possessification", which is an
+optimization that, for example, turns a+b into a++b in order to avoid
+backtracks into a+ that can never be successful. However, if callouts are in
+use, auto-possessification means that some callouts are never taken. You can
+set this option if you want the matching functions to do a full unoptimized
+search and run all the callouts, but it is mainly provided for testing
+purposes.
+<pre>
+  PCRE2_NO_DOTSTAR_ANCHOR
+</pre>
+If this option is set, it disables an optimization that is applied when .* is
+the first significant item in a top-level branch of a pattern, and all the
+other branches also start with .* or with \A or \G or ^. The optimization is
+automatically disabled for .* if it is inside an atomic group or a capturing
+group that is the subject of a back reference, or if the pattern contains
+(*PRUNE) or (*SKIP). When the optimization is not disabled, such a pattern is
+automatically anchored if PCRE2_DOTALL is set for all the .* items and
+PCRE2_MULTILINE is not set for any ^ items. Otherwise, the fact that any match
+must start either at the start of the subject or following a newline is
+remembered. Like other optimizations, this can cause callouts to be skipped.
+<pre>
+  PCRE2_NO_START_OPTIMIZE
+</pre>
+This is an option whose main effect is at matching time. It does not change
+what <b>pcre2_compile()</b> generates, but it does affect the output of the JIT
+compiler.
+</P>
+<P>
+There are a number of optimizations that may occur at the start of a match, in
+order to speed up the process. For example, if it is known that an unanchored
+match must start with a specific character, the matching code searches the
+subject for that character, and fails immediately if it cannot find it, without
+actually running the main matching function. This means that a special item
+such as (*COMMIT) at the start of a pattern is not considered until after a
+suitable starting point for the match has been found. Also, when callouts or
+(*MARK) items are in use, these "start-up" optimizations can cause them to be
+skipped if the pattern is never actually used. The start-up optimizations are
+in effect a pre-scan of the subject that takes place before the pattern is run.
+</P>
+<P>
+The PCRE2_NO_START_OPTIMIZE option disables the start-up optimizations,
+possibly causing performance to suffer, but ensuring that in cases where the
+result is "no match", the callouts do occur, and that items such as (*COMMIT)
+and (*MARK) are considered at every possible starting position in the subject
+string.
+</P>
+<P>
+Setting PCRE2_NO_START_OPTIMIZE may change the outcome of a matching operation.
+Consider the pattern
+<pre>
+  (*COMMIT)ABC
+</pre>
+When this is compiled, PCRE2 records the fact that a match must start with the
+character "A". Suppose the subject string is "DEFABC". The start-up
+optimization scans along the subject, finds "A" and runs the first match
+attempt from there. The (*COMMIT) item means that the pattern must match the
+current starting position, which in this case, it does. However, if the same
+match is run with PCRE2_NO_START_OPTIMIZE set, the initial scan along the
+subject string does not happen. The first match attempt is run starting from
+"D" and when this fails, (*COMMIT) prevents any further matches being tried, so
+the overall result is "no match". There are also other start-up optimizations.
+For example, a minimum length for the subject may be recorded. Consider the
+pattern
+<pre>
+  (*MARK:A)(X|Y)
+</pre>
+The minimum length for a match is one character. If the subject is "ABC", there
+will be attempts to match "ABC", "BC", and "C". An attempt to match an empty
+string at the end of the subject does not take place, because PCRE2 knows that
+the subject is now too short, and so the (*MARK) is never encountered. In this
+case, the optimization does not affect the overall match result, which is still
+"no match", but it does affect the auxiliary information that is returned.
+<pre>
+  PCRE2_NO_UTF_CHECK
+</pre>
+When PCRE2_UTF is set, the validity of the pattern as a UTF string is
+automatically checked. There are discussions about the validity of
+<a href="pcre2unicode.html#utf8strings">UTF-8 strings,</a>
+<a href="pcre2unicode.html#utf16strings">UTF-16 strings,</a>
+and
+<a href="pcre2unicode.html#utf32strings">UTF-32 strings</a>
+in the
+<a href="pcre2unicode.html"><b>pcre2unicode</b></a>
+document.
+If an invalid UTF sequence is found, <b>pcre2_compile()</b> returns a negative
+error code.
+</P>
+<P>
+If you know that your pattern is valid, and you want to skip this check for
+performance reasons, you can set the PCRE2_NO_UTF_CHECK option. When it is set,
+the effect of passing an invalid UTF string as a pattern is undefined. It may
+cause your program to crash or loop. Note that this option can also be passed
+to <b>pcre2_match()</b> and <b>pcre_dfa_match()</b>, to suppress validity
+checking of the subject string.
+<pre>
+  PCRE2_UCP
+</pre>
+This option changes the way PCRE2 processes \B, \b, \D, \d, \S, \s, \W,
+\w, and some of the POSIX character classes. By default, only ASCII characters
+are recognized, but if PCRE2_UCP is set, Unicode properties are used instead to
+classify characters. More details are given in the section on
+<a href="pcre2pattern.html#genericchartypes">generic character types</a>
+in the
+<a href="pcre2pattern.html"><b>pcre2pattern</b></a>
+page. If you set PCRE2_UCP, matching one of the items it affects takes much
+longer. The option is available only if PCRE2 has been compiled with Unicode
+support.
+<pre>
+  PCRE2_UNGREEDY
+</pre>
+This option inverts the "greediness" of the quantifiers so that they are not
+greedy by default, but become greedy if followed by "?". It is not compatible
+with Perl. It can also be set by a (?U) option setting within the pattern.
+<pre>
+  PCRE2_USE_OFFSET_LIMIT
+</pre>
+This option must be set for <b>pcre2_compile()</b> if
+<b>pcre2_set_offset_limit()</b> is going to be used to set a non-default offset
+limit in a match context for matches that use this pattern. An error is
+generated if an offset limit is set without this option. For more details, see
+the description of <b>pcre2_set_offset_limit()</b> in the
+<a href="#matchcontext">section</a>
+that describes match contexts. See also the PCRE2_FIRSTLINE
+option above.
+<pre>
+  PCRE2_UTF
+</pre>
+This option causes PCRE2 to regard both the pattern and the subject strings
+that are subsequently processed as strings of UTF characters instead of
+single-code-unit strings. It is available when PCRE2 is built to include
+Unicode support (which is the default). If Unicode support is not available,
+the use of this option provokes an error. Details of how this option changes
+the behaviour of PCRE2 are given in the
+<a href="pcre2unicode.html"><b>pcre2unicode</b></a>
+page.
+</P>
+<br><a name="SEC19" href="#TOC1">COMPILATION ERROR CODES</a><br>
+<P>
+There are over 80 positive error codes that <b>pcre2_compile()</b> may return if
+it finds an error in the pattern. There are also some negative error codes that
+are used for invalid UTF strings. These are the same as given by
+<b>pcre2_match()</b> and <b>pcre2_dfa_match()</b>, and are described in the
+<a href="pcre2unicode.html"><b>pcre2unicode</b></a>
+page. The <b>pcre2_get_error_message()</b> function can be called to obtain a
+textual error message from any error code.
+</P>
+<br><a name="SEC20" href="#TOC1">JUST-IN-TIME (JIT) COMPILATION</a><br>
+<P>
+<b>int pcre2_jit_compile(pcre2_code *<i>code</i>, uint32_t <i>options</i>);</b>
+<br>
+<br>
+<b>int pcre2_jit_match(const pcre2_code *<i>code</i>, PCRE2_SPTR <i>subject</i>,</b>
+<b>  PCRE2_SIZE <i>length</i>, PCRE2_SIZE <i>startoffset</i>,</b>
+<b>  uint32_t <i>options</i>, pcre2_match_data *<i>match_data</i>,</b>
+<b>  pcre2_match_context *<i>mcontext</i>);</b>
+<br>
+<br>
+<b>void pcre2_jit_free_unused_memory(pcre2_general_context *<i>gcontext</i>);</b>
+<br>
+<br>
+<b>pcre2_jit_stack *pcre2_jit_stack_create(PCRE2_SIZE <i>startsize</i>,</b>
+<b>  PCRE2_SIZE <i>maxsize</i>, pcre2_general_context *<i>gcontext</i>);</b>
+<br>
+<br>
+<b>void pcre2_jit_stack_assign(pcre2_match_context *<i>mcontext</i>,</b>
+<b>  pcre2_jit_callback <i>callback_function</i>, void *<i>callback_data</i>);</b>
+<br>
+<br>
+<b>void pcre2_jit_stack_free(pcre2_jit_stack *<i>jit_stack</i>);</b>
+</P>
+<P>
+These functions provide support for JIT compilation, which, if the just-in-time
+compiler is available, further processes a compiled pattern into machine code
+that executes much faster than the <b>pcre2_match()</b> interpretive matching
+function. Full details are given in the
+<a href="pcre2jit.html"><b>pcre2jit</b></a>
+documentation.
+</P>
+<P>
+JIT compilation is a heavyweight optimization. It can take some time for
+patterns to be analyzed, and for one-off matches and simple patterns the
+benefit of faster execution might be offset by a much slower compilation time.
+Most, but not all patterns can be optimized by the JIT compiler.
+<a name="localesupport"></a></P>
+<br><a name="SEC21" href="#TOC1">LOCALE SUPPORT</a><br>
+<P>
+PCRE2 handles caseless matching, and determines whether characters are letters,
+digits, or whatever, by reference to a set of tables, indexed by character code
+point. This applies only to characters whose code points are less than 256. By
+default, higher-valued code points never match escapes such as \w or \d.
+However, if PCRE2 is built with UTF support, all characters can be tested with
+\p and \P, or, alternatively, the PCRE2_UCP option can be set when a pattern
+is compiled; this causes \w and friends to use Unicode property support
+instead of the built-in tables.
+</P>
+<P>
+The use of locales with Unicode is discouraged. If you are handling characters
+with code points greater than 128, you should either use Unicode support, or
+use locales, but not try to mix the two.
+</P>
+<P>
+PCRE2 contains an internal set of character tables that are used by default.
+These are sufficient for many applications. Normally, the internal tables
+recognize only ASCII characters. However, when PCRE2 is built, it is possible
+to cause the internal tables to be rebuilt in the default "C" locale of the
+local system, which may cause them to be different.
+</P>
+<P>
+The internal tables can be overridden by tables supplied by the application
+that calls PCRE2. These may be created in a different locale from the default.
+As more and more applications change to using Unicode, the need for this locale
+support is expected to die away.
+</P>
+<P>
+External tables are built by calling the <b>pcre2_maketables()</b> function, in
+the relevant locale. The result can be passed to <b>pcre2_compile()</b> as often
+as necessary, by creating a compile context and calling
+<b>pcre2_set_character_tables()</b> to set the tables pointer therein. For
+example, to build and use tables that are appropriate for the French locale
+(where accented characters with values greater than 128 are treated as
+letters), the following code could be used:
+<pre>
+  setlocale(LC_CTYPE, "fr_FR");
+  tables = pcre2_maketables(NULL);
+  ccontext = pcre2_compile_context_create(NULL);
+  pcre2_set_character_tables(ccontext, tables);
+  re = pcre2_compile(..., ccontext);
+</pre>
+The locale name "fr_FR" is used on Linux and other Unix-like systems; if you
+are using Windows, the name for the French locale is "french". It is the
+caller's responsibility to ensure that the memory containing the tables remains
+available for as long as it is needed.
+</P>
+<P>
+The pointer that is passed (via the compile context) to <b>pcre2_compile()</b>
+is saved with the compiled pattern, and the same tables are used by
+<b>pcre2_match()</b> and <b>pcre_dfa_match()</b>. Thus, for any single pattern,
+compilation, and matching all happen in the same locale, but different patterns
+can be processed in different locales.
+<a name="infoaboutpattern"></a></P>
+<br><a name="SEC22" href="#TOC1">INFORMATION ABOUT A COMPILED PATTERN</a><br>
+<P>
+<b>int pcre2_pattern_info(const pcre2 *<i>code</i>, uint32_t <i>what</i>, void *<i>where</i>);</b>
+</P>
+<P>
+The <b>pcre2_pattern_info()</b> function returns general information about a
+compiled pattern. For information about callouts, see the
+<a href="pcre2pattern.html#infoaboutcallouts">next section.</a>
+The first argument for <b>pcre2_pattern_info()</b> is a pointer to the compiled
+pattern. The second argument specifies which piece of information is required,
+and the third argument is a pointer to a variable to receive the data. If the
+third argument is NULL, the first argument is ignored, and the function returns
+the size in bytes of the variable that is required for the information
+requested. Otherwise, The yield of the function is zero for success, or one of
+the following negative numbers:
+<pre>
+  PCRE2_ERROR_NULL           the argument <i>code</i> was NULL
+  PCRE2_ERROR_BADMAGIC       the "magic number" was not found
+  PCRE2_ERROR_BADOPTION      the value of <i>what</i> was invalid
+  PCRE2_ERROR_UNSET          the requested field is not set
+</pre>
+The "magic number" is placed at the start of each compiled pattern as an simple
+check against passing an arbitrary memory pointer. Here is a typical call of
+<b>pcre2_pattern_info()</b>, to obtain the length of the compiled pattern:
+<pre>
+  int rc;
+  size_t length;
+  rc = pcre2_pattern_info(
+    re,               /* result of pcre2_compile() */
+    PCRE2_INFO_SIZE,  /* what is required */
+    &length);         /* where to put the data */
+</pre>
+The possible values for the second argument are defined in <b>pcre2.h</b>, and
+are as follows:
+<pre>
+  PCRE2_INFO_ALLOPTIONS
+  PCRE2_INFO_ARGOPTIONS
+</pre>
+Return a copy of the pattern's options. The third argument should point to a
+<b>uint32_t</b> variable. PCRE2_INFO_ARGOPTIONS returns exactly the options that
+were passed to <b>pcre2_compile()</b>, whereas PCRE2_INFO_ALLOPTIONS returns
+the compile options as modified by any top-level option settings such as (*UTF)
+at the start of the pattern itself. For example, if the pattern /(*UTF)abc/ is
+compiled with the PCRE2_EXTENDED option, the result is PCRE2_EXTENDED and
+PCRE2_UTF.
+</P>
+<P>
+A pattern compiled without PCRE2_ANCHORED is automatically anchored by PCRE2 if
+the first significant item in every top-level branch is one of the following:
+<pre>
+  ^     unless PCRE2_MULTILINE is set
+  \A    always
+  \G    always
+  .*    sometimes - see below
+</pre>
+When .* is the first significant item, anchoring is possible only when all the
+following are true:
+<pre>
+  .* is not in an atomic group
+  .* is not in a capturing group that is the subject of a back reference
+  PCRE2_DOTALL is in force for .*
+  Neither (*PRUNE) nor (*SKIP) appears in the pattern.
+  PCRE2_NO_DOTSTAR_ANCHOR is not set.
+</pre>
+For patterns that are auto-anchored, the PCRE2_ANCHORED bit is set in the
+options returned for PCRE2_INFO_ALLOPTIONS.
+<pre>
+  PCRE2_INFO_BACKREFMAX
+</pre>
+Return the number of the highest back reference in the pattern. The third
+argument should point to an <b>uint32_t</b> variable. Named subpatterns acquire
+numbers as well as names, and these count towards the highest back reference.
+Back references such as \4 or \g{12} match the captured characters of the
+given group, but in addition, the check that a capturing group is set in a
+conditional subpattern such as (?(3)a|b) is also a back reference. Zero is
+returned if there are no back references.
+<pre>
+  PCRE2_INFO_BSR
+</pre>
+The output is a uint32_t whose value indicates what character sequences the \R
+escape sequence matches. A value of PCRE2_BSR_UNICODE means that \R matches
+any Unicode line ending sequence; a value of PCRE2_BSR_ANYCRLF means that \R
+matches only CR, LF, or CRLF.
+<pre>
+  PCRE2_INFO_CAPTURECOUNT
+</pre>
+Return the highest capturing subpattern number in the pattern. In patterns
+where (?| is not used, this is also the total number of capturing subpatterns.
+The third argument should point to an <b>uint32_t</b> variable.
+<pre>
+  PCRE2_INFO_FIRSTBITMAP
+</pre>
+In the absence of a single first code unit for a non-anchored pattern,
+<b>pcre2_compile()</b> may construct a 256-bit table that defines a fixed set of
+values for the first code unit in any match. For example, a pattern that starts
+with [abc] results in a table with three bits set. When code unit values
+greater than 255 are supported, the flag bit for 255 means "any code unit of
+value 255 or above". If such a table was constructed, a pointer to it is
+returned. Otherwise NULL is returned. The third argument should point to an
+<b>const uint8_t *</b> variable.
+<pre>
+  PCRE2_INFO_FIRSTCODETYPE
+</pre>
+Return information about the first code unit of any matched string, for a
+non-anchored pattern. The third argument should point to an <b>uint32_t</b>
+variable. If there is a fixed first value, for example, the letter "c" from a
+pattern such as (cat|cow|coyote), 1 is returned, and the character value can be
+retrieved using PCRE2_INFO_FIRSTCODEUNIT. If there is no fixed first value, but
+it is known that a match can occur only at the start of the subject or
+following a newline in the subject, 2 is returned. Otherwise, and for anchored
+patterns, 0 is returned.
+<pre>
+  PCRE2_INFO_FIRSTCODEUNIT
+</pre>
+Return the value of the first code unit of any matched string in the situation
+where PCRE2_INFO_FIRSTCODETYPE returns 1; otherwise return 0. The third
+argument should point to an <b>uint32_t</b> variable. In the 8-bit library, the
+value is always less than 256. In the 16-bit library the value can be up to
+0xffff. In the 32-bit library in UTF-32 mode the value can be up to 0x10ffff,
+and up to 0xffffffff when not using UTF-32 mode.
+<pre>
+  PCRE2_INFO_HASBACKSLASHC
+</pre>
+Return 1 if the pattern contains any instances of \C, otherwise 0. The third
+argument should point to an <b>uint32_t</b> variable.
+<pre>
+  PCRE2_INFO_HASCRORLF
+</pre>
+Return 1 if the pattern contains any explicit matches for CR or LF characters,
+otherwise 0. The third argument should point to an <b>uint32_t</b> variable. An
+explicit match is either a literal CR or LF character, or \r or \n.
+<pre>
+  PCRE2_INFO_JCHANGED
+</pre>
+Return 1 if the (?J) or (?-J) option setting is used in the pattern, otherwise
+0. The third argument should point to an <b>uint32_t</b> variable. (?J) and
+(?-J) set and unset the local PCRE2_DUPNAMES option, respectively.
+<pre>
+  PCRE2_INFO_JITSIZE
+</pre>
+If the compiled pattern was successfully processed by
+<b>pcre2_jit_compile()</b>, return the size of the JIT compiled code, otherwise
+return zero. The third argument should point to a <b>size_t</b> variable.
+<pre>
+  PCRE2_INFO_LASTCODETYPE
+</pre>
+Returns 1 if there is a rightmost literal code unit that must exist in any
+matched string, other than at its start. The third argument should  point to an
+<b>uint32_t</b> variable. If there is no such value, 0 is returned. When 1 is
+returned, the code unit value itself can be retrieved using
+PCRE2_INFO_LASTCODEUNIT. For anchored patterns, a last literal value is
+recorded only if it follows something of variable length. For example, for the
+pattern /^a\d+z\d+/ the returned value is 1 (with "z" returned from
+PCRE2_INFO_LASTCODEUNIT), but for /^a\dz\d/ the returned value is 0.
+<pre>
+  PCRE2_INFO_LASTCODEUNIT
+</pre>
+Return the value of the rightmost literal data unit that must exist in any
+matched string, other than at its start, if such a value has been recorded. The
+third argument should point to an <b>uint32_t</b> variable. If there is no such
+value, 0 is returned.
+<pre>
+  PCRE2_INFO_MATCHEMPTY
+</pre>
+Return 1 if the pattern might match an empty string, otherwise 0. The third
+argument should point to an <b>uint32_t</b> variable. When a pattern contains
+recursive subroutine calls it is not always possible to determine whether or
+not it can match an empty string. PCRE2 takes a cautious approach and returns 1
+in such cases.
+<pre>
+  PCRE2_INFO_MATCHLIMIT
+</pre>
+If the pattern set a match limit by including an item of the form
+(*LIMIT_MATCH=nnnn) at the start, the value is returned. The third argument
+should point to an unsigned 32-bit integer. If no such value has been set, the
+call to <b>pcre2_pattern_info()</b> returns the error PCRE2_ERROR_UNSET.
+<pre>
+  PCRE2_INFO_MAXLOOKBEHIND
+</pre>
+Return the number of characters (not code units) in the longest lookbehind
+assertion in the pattern. The third argument should point to an unsigned 32-bit
+integer. This information is useful when doing multi-segment matching using the
+partial matching facilities. Note that the simple assertions \b and \B
+require a one-character lookbehind. \A also registers a one-character
+lookbehind, though it does not actually inspect the previous character. This is
+to ensure that at least one character from the old segment is retained when a
+new segment is processed. Otherwise, if there are no lookbehinds in the
+pattern, \A might match incorrectly at the start of a new segment.
+<pre>
+  PCRE2_INFO_MINLENGTH
+</pre>
+If a minimum length for matching subject strings was computed, its value is
+returned. Otherwise the returned value is 0. The value is a number of
+characters, which in UTF mode may be different from the number of code units.
+The third argument should point to an <b>uint32_t</b> variable. The value is a
+lower bound to the length of any matching string. There may not be any strings
+of that length that do actually match, but every string that does match is at
+least that long.
+<pre>
+  PCRE2_INFO_NAMECOUNT
+  PCRE2_INFO_NAMEENTRYSIZE
+  PCRE2_INFO_NAMETABLE
+</pre>
+PCRE2 supports the use of named as well as numbered capturing parentheses. The
+names are just an additional way of identifying the parentheses, which still
+acquire numbers. Several convenience functions such as
+<b>pcre2_substring_get_byname()</b> are provided for extracting captured
+substrings by name. It is also possible to extract the data directly, by first
+converting the name to a number in order to access the correct pointers in the
+output vector (described with <b>pcre2_match()</b> below). To do the conversion,
+you need to use the name-to-number map, which is described by these three
+values.
+</P>
+<P>
+The map consists of a number of fixed-size entries. PCRE2_INFO_NAMECOUNT gives
+the number of entries, and PCRE2_INFO_NAMEENTRYSIZE gives the size of each
+entry in code units; both of these return a <b>uint32_t</b> value. The entry
+size depends on the length of the longest name.
+</P>
+<P>
+PCRE2_INFO_NAMETABLE returns a pointer to the first entry of the table. This is
+a PCRE2_SPTR pointer to a block of code units. In the 8-bit library, the first
+two bytes of each entry are the number of the capturing parenthesis, most
+significant byte first. In the 16-bit library, the pointer points to 16-bit
+code units, the first of which contains the parenthesis number. In the 32-bit
+library, the pointer points to 32-bit code units, the first of which contains
+the parenthesis number. The rest of the entry is the corresponding name, zero
+terminated.
+</P>
+<P>
+The names are in alphabetical order. If (?| is used to create multiple groups
+with the same number, as described in the
+<a href="pcre2pattern.html#dupsubpatternnumber">section on duplicate subpattern numbers</a>
+in the
+<a href="pcre2pattern.html"><b>pcre2pattern</b></a>
+page, the groups may be given the same name, but there is only one entry in the
+table. Different names for groups of the same number are not permitted.
+</P>
+<P>
+Duplicate names for subpatterns with different numbers are permitted, but only
+if PCRE2_DUPNAMES is set. They appear in the table in the order in which they
+were found in the pattern. In the absence of (?| this is the order of
+increasing number; when (?| is used this is not necessarily the case because
+later subpatterns may have lower numbers.
+</P>
+<P>
+As a simple example of the name/number table, consider the following pattern
+after compilation by the 8-bit library (assume PCRE2_EXTENDED is set, so white
+space - including newlines - is ignored):
+<pre>
+  (?&#60;date&#62; (?&#60;year&#62;(\d\d)?\d\d) - (?&#60;month&#62;\d\d) - (?&#60;day&#62;\d\d) )
+</pre>
+There are four named subpatterns, so the table has four entries, and each entry
+in the table is eight bytes long. The table is as follows, with non-printing
+bytes shows in hexadecimal, and undefined bytes shown as ??:
+<pre>
+  00 01 d  a  t  e  00 ??
+  00 05 d  a  y  00 ?? ??
+  00 04 m  o  n  t  h  00
+  00 02 y  e  a  r  00 ??
+</pre>
+When writing code to extract data from named subpatterns using the
+name-to-number map, remember that the length of the entries is likely to be
+different for each compiled pattern.
+<pre>
+  PCRE2_INFO_NEWLINE
+</pre>
+The output is a <b>uint32_t</b> with one of the following values:
+<pre>
+  PCRE2_NEWLINE_CR       Carriage return (CR)
+  PCRE2_NEWLINE_LF       Linefeed (LF)
+  PCRE2_NEWLINE_CRLF     Carriage return, linefeed (CRLF)
+  PCRE2_NEWLINE_ANY      Any Unicode line ending
+  PCRE2_NEWLINE_ANYCRLF  Any of CR, LF, or CRLF
+</pre>
+This specifies the default character sequence that will be recognized as
+meaning "newline" while matching.
+<pre>
+  PCRE2_INFO_RECURSIONLIMIT
+</pre>
+If the pattern set a recursion limit by including an item of the form
+(*LIMIT_RECURSION=nnnn) at the start, the value is returned. The third
+argument should point to an unsigned 32-bit integer. If no such value has been
+set, the call to <b>pcre2_pattern_info()</b> returns the error PCRE2_ERROR_UNSET.
+<pre>
+  PCRE2_INFO_SIZE
+</pre>
+Return the size of the compiled pattern in bytes (for all three libraries). The
+third argument should point to a <b>size_t</b> variable. This value includes the
+size of the general data block that precedes the code units of the compiled
+pattern itself. The value that is used when <b>pcre2_compile()</b> is getting
+memory in which to place the compiled pattern may be slightly larger than the
+value returned by this option, because there are cases where the code that
+calculates the size has to over-estimate. Processing a pattern with the JIT
+compiler does not alter the value returned by this option.
+<a name="infoaboutcallouts"></a></P>
+<br><a name="SEC23" href="#TOC1">INFORMATION ABOUT A PATTERN'S CALLOUTS</a><br>
+<P>
+<b>int pcre2_callout_enumerate(const pcre2_code *<i>code</i>,</b>
+<b>  int (*<i>callback</i>)(pcre2_callout_enumerate_block *, void *),</b>
+<b>  void *<i>user_data</i>);</b>
+<br>
+<br>
+A script language that supports the use of string arguments in callouts might
+like to scan all the callouts in a pattern before running the match. This can
+be done by calling <b>pcre2_callout_enumerate()</b>. The first argument is a
+pointer to a compiled pattern, the second points to a callback function, and
+the third is arbitrary user data. The callback function is called for every
+callout in the pattern in the order in which they appear. Its first argument is
+a pointer to a callout enumeration block, and its second argument is the
+<i>user_data</i> value that was passed to <b>pcre2_callout_enumerate()</b>. The
+contents of the callout enumeration block are described in the
+<a href="pcre2callout.html"><b>pcre2callout</b></a>
+documentation, which also gives further details about callouts.
+</P>
+<br><a name="SEC24" href="#TOC1">SERIALIZATION AND PRECOMPILING</a><br>
+<P>
+It is possible to save compiled patterns on disc or elsewhere, and reload them
+later, subject to a number of restrictions. The functions whose names begin
+with <b>pcre2_serialize_</b> are used for this purpose. They are described in
+the
+<a href="pcre2serialize.html"><b>pcre2serialize</b></a>
+documentation.
+<a name="matchdatablock"></a></P>
+<br><a name="SEC25" href="#TOC1">THE MATCH DATA BLOCK</a><br>
+<P>
+<b>pcre2_match_data *pcre2_match_data_create(uint32_t <i>ovecsize</i>,</b>
+<b>  pcre2_general_context *<i>gcontext</i>);</b>
+<br>
+<br>
+<b>pcre2_match_data *pcre2_match_data_create_from_pattern(</b>
+<b>  const pcre2_code *<i>code</i>, pcre2_general_context *<i>gcontext</i>);</b>
+<br>
+<br>
+<b>void pcre2_match_data_free(pcre2_match_data *<i>match_data</i>);</b>
+</P>
+<P>
+Information about a successful or unsuccessful match is placed in a match
+data block, which is an opaque structure that is accessed by function calls. In
+particular, the match data block contains a vector of offsets into the subject
+string that define the matched part of the subject and any substrings that were
+captured. This is know as the <i>ovector</i>.
+</P>
+<P>
+Before calling <b>pcre2_match()</b>, <b>pcre2_dfa_match()</b>, or
+<b>pcre2_jit_match()</b> you must create a match data block by calling one of
+the creation functions above. For <b>pcre2_match_data_create()</b>, the first
+argument is the number of pairs of offsets in the <i>ovector</i>. One pair of
+offsets is required to identify the string that matched the whole pattern, with
+another pair for each captured substring. For example, a value of 4 creates
+enough space to record the matched portion of the subject plus three captured
+substrings. A minimum of at least 1 pair is imposed by
+<b>pcre2_match_data_create()</b>, so it is always possible to return the overall
+matched string.
+</P>
+<P>
+The second argument of <b>pcre2_match_data_create()</b> is a pointer to a
+general context, which can specify custom memory management for obtaining the
+memory for the match data block. If you are not using custom memory management,
+pass NULL, which causes <b>malloc()</b> to be used.
+</P>
+<P>
+For <b>pcre2_match_data_create_from_pattern()</b>, the first argument is a
+pointer to a compiled pattern. The ovector is created to be exactly the right
+size to hold all the substrings a pattern might capture. The second argument is
+again a pointer to a general context, but in this case if NULL is passed, the
+memory is obtained using the same allocator that was used for the compiled
+pattern (custom or default).
+</P>
+<P>
+A match data block can be used many times, with the same or different compiled
+patterns. You can extract information from a match data block after a match
+operation has finished, using functions that are described in the sections on
+<a href="#matchedstrings">matched strings</a>
+and
+<a href="#matchotherdata">other match data</a>
+below.
+</P>
+<P>
+When a call of <b>pcre2_match()</b> fails, valid data is available in the match
+block only when the error is PCRE2_ERROR_NOMATCH, PCRE2_ERROR_PARTIAL, or one
+of the error codes for an invalid UTF string. Exactly what is available depends
+on the error, and is detailed below.
+</P>
+<P>
+When one of the matching functions is called, pointers to the compiled pattern
+and the subject string are set in the match data block so that they can be
+referenced by the extraction functions. After running a match, you must not
+free a compiled pattern or a subject string until after all operations on the
+match data block (for that match) have taken place.
+</P>
+<P>
+When a match data block itself is no longer needed, it should be freed by
+calling <b>pcre2_match_data_free()</b>.
+</P>
+<br><a name="SEC26" href="#TOC1">MATCHING A PATTERN: THE TRADITIONAL FUNCTION</a><br>
+<P>
+<b>int pcre2_match(const pcre2_code *<i>code</i>, PCRE2_SPTR <i>subject</i>,</b>
+<b>  PCRE2_SIZE <i>length</i>, PCRE2_SIZE <i>startoffset</i>,</b>
+<b>  uint32_t <i>options</i>, pcre2_match_data *<i>match_data</i>,</b>
+<b>  pcre2_match_context *<i>mcontext</i>);</b>
+</P>
+<P>
+The function <b>pcre2_match()</b> is called to match a subject string against a
+compiled pattern, which is passed in the <i>code</i> argument. You can call
+<b>pcre2_match()</b> with the same <i>code</i> argument as many times as you
+like, in order to find multiple matches in the subject string or to match
+different subject strings with the same pattern.
+</P>
+<P>
+This function is the main matching facility of the library, and it operates in
+a Perl-like manner. For specialist use there is also an alternative matching
+function, which is described
+<a href="#dfamatch">below</a>
+in the section about the <b>pcre2_dfa_match()</b> function.
+</P>
+<P>
+Here is an example of a simple call to <b>pcre2_match()</b>:
+<pre>
+  pcre2_match_data *md = pcre2_match_data_create(4, NULL);
+  int rc = pcre2_match(
+    re,             /* result of pcre2_compile() */
+    "some string",  /* the subject string */
+    11,             /* the length of the subject string */
+    0,              /* start at offset 0 in the subject */
+    0,              /* default options */
+    match_data,     /* the match data block */
+    NULL);          /* a match context; NULL means use defaults */
+</pre>
+If the subject string is zero-terminated, the length can be given as
+PCRE2_ZERO_TERMINATED. A match context must be provided if certain less common
+matching parameters are to be changed. For details, see the section on
+<a href="#matchcontext">the match context</a>
+above.
+</P>
+<br><b>
+The string to be matched by <b>pcre2_match()</b>
+</b><br>
+<P>
+The subject string is passed to <b>pcre2_match()</b> as a pointer in
+<i>subject</i>, a length in <i>length</i>, and a starting offset in
+<i>startoffset</i>. The length and offset are in code units, not characters.
+That is, they are in bytes for the 8-bit library, 16-bit code units for the
+16-bit library, and 32-bit code units for the 32-bit library, whether or not
+UTF processing is enabled.
+</P>
+<P>
+If <i>startoffset</i> is greater than the length of the subject,
+<b>pcre2_match()</b> returns PCRE2_ERROR_BADOFFSET. When the starting offset is
+zero, the search for a match starts at the beginning of the subject, and this
+is by far the most common case. In UTF-8 or UTF-16 mode, the starting offset
+must point to the start of a character, or to the end of the subject (in UTF-32
+mode, one code unit equals one character, so all offsets are valid). Like the
+pattern string, the subject may contain binary zeroes.
+</P>
+<P>
+A non-zero starting offset is useful when searching for another match in the
+same subject by calling <b>pcre2_match()</b> again after a previous success.
+Setting <i>startoffset</i> differs from passing over a shortened string and
+setting PCRE2_NOTBOL in the case of a pattern that begins with any kind of
+lookbehind. For example, consider the pattern
+<pre>
+  \Biss\B
+</pre>
+which finds occurrences of "iss" in the middle of words. (\B matches only if
+the current position in the subject is not a word boundary.) When applied to
+the string "Mississipi" the first call to <b>pcre2_match()</b> finds the first
+occurrence. If <b>pcre2_match()</b> is called again with just the remainder of
+the subject, namely "issipi", it does not match, because \B is always false at
+the start of the subject, which is deemed to be a word boundary. However, if
+<b>pcre2_match()</b> is passed the entire string again, but with
+<i>startoffset</i> set to 4, it finds the second occurrence of "iss" because it
+is able to look behind the starting point to discover that it is preceded by a
+letter.
+</P>
+<P>
+Finding all the matches in a subject is tricky when the pattern can match an
+empty string. It is possible to emulate Perl's /g behaviour by first trying the
+match again at the same offset, with the PCRE2_NOTEMPTY_ATSTART and
+PCRE2_ANCHORED options, and then if that fails, advancing the starting offset
+and trying an ordinary match again. There is some code that demonstrates how to
+do this in the
+<a href="pcre2demo.html"><b>pcre2demo</b></a>
+sample program. In the most general case, you have to check to see if the
+newline convention recognizes CRLF as a newline, and if so, and the current
+character is CR followed by LF, advance the starting offset by two characters
+instead of one.
+</P>
+<P>
+If a non-zero starting offset is passed when the pattern is anchored, one
+attempt to match at the given offset is made. This can only succeed if the
+pattern does not require the match to be at the start of the subject.
+<a name="matchoptions"></a></P>
+<br><b>
+Option bits for <b>pcre2_match()</b>
+</b><br>
+<P>
+The unused bits of the <i>options</i> argument for <b>pcre2_match()</b> must be
+zero. The only bits that may be set are PCRE2_ANCHORED, PCRE2_NOTBOL,
+PCRE2_NOTEOL, PCRE2_NOTEMPTY, PCRE2_NOTEMPTY_ATSTART, PCRE2_NO_UTF_CHECK,
+PCRE2_PARTIAL_HARD, and PCRE2_PARTIAL_SOFT. Their action is described below.
+</P>
+<P>
+Setting PCRE2_ANCHORED at match time is not supported by the just-in-time (JIT)
+compiler. If it is set, JIT matching is disabled and the normal interpretive
+code in <b>pcre2_match()</b> is run. The remaining options are supported for JIT
+matching.
+<pre>
+  PCRE2_ANCHORED
+</pre>
+The PCRE2_ANCHORED option limits <b>pcre2_match()</b> to matching at the first
+matching position. If a pattern was compiled with PCRE2_ANCHORED, or turned out
+to be anchored by virtue of its contents, it cannot be made unachored at
+matching time. Note that setting the option at match time disables JIT
+matching.
+<pre>
+  PCRE2_NOTBOL
+</pre>
+This option specifies that first character of the subject string is not the
+beginning of a line, so the circumflex metacharacter should not match before
+it. Setting this without having set PCRE2_MULTILINE at compile time causes
+circumflex never to match. This option affects only the behaviour of the
+circumflex metacharacter. It does not affect \A.
+<pre>
+  PCRE2_NOTEOL
+</pre>
+This option specifies that the end of the subject string is not the end of a
+line, so the dollar metacharacter should not match it nor (except in multiline
+mode) a newline immediately before it. Setting this without having set
+PCRE2_MULTILINE at compile time causes dollar never to match. This option
+affects only the behaviour of the dollar metacharacter. It does not affect \Z
+or \z.
+<pre>
+  PCRE2_NOTEMPTY
+</pre>
+An empty string is not considered to be a valid match if this option is set. If
+there are alternatives in the pattern, they are tried. If all the alternatives
+match the empty string, the entire match fails. For example, if the pattern
+<pre>
+  a?b?
+</pre>
+is applied to a string not beginning with "a" or "b", it matches an empty
+string at the start of the subject. With PCRE2_NOTEMPTY set, this match is not
+valid, so <b>pcre2_match()</b> searches further into the string for occurrences
+of "a" or "b".
+<pre>
+  PCRE2_NOTEMPTY_ATSTART
+</pre>
+This is like PCRE2_NOTEMPTY, except that it locks out an empty string match
+only at the first matching position, that is, at the start of the subject plus
+the starting offset. An empty string match later in the subject is permitted.
+If the pattern is anchored, such a match can occur only if the pattern contains
+\K.
+<pre>
+  PCRE2_NO_UTF_CHECK
+</pre>
+When PCRE2_UTF is set at compile time, the validity of the subject as a UTF
+string is checked by default when <b>pcre2_match()</b> is subsequently called.
+If a non-zero starting offset is given, the check is applied only to that part
+of the subject that could be inspected during matching, and there is a check
+that the starting offset points to the first code unit of a character or to the
+end of the subject. If there are no lookbehind assertions in the pattern, the
+check starts at the starting offset. Otherwise, it starts at the length of the
+longest lookbehind before the starting offset, or at the start of the subject
+if there are not that many characters before the starting offset. Note that the
+sequences \b and \B are one-character lookbehinds.
+</P>
+<P>
+The check is carried out before any other processing takes place, and a
+negative error code is returned if the check fails. There are several UTF error
+codes for each code unit width, corresponding to different problems with the
+code unit sequence. There are discussions about the validity of
+<a href="pcre2unicode.html#utf8strings">UTF-8 strings,</a>
+<a href="pcre2unicode.html#utf16strings">UTF-16 strings,</a>
+and
+<a href="pcre2unicode.html#utf32strings">UTF-32 strings</a>
+in the
+<a href="pcre2unicode.html"><b>pcre2unicode</b></a>
+page.
+</P>
+<P>
+If you know that your subject is valid, and you want to skip these checks for
+performance reasons, you can set the PCRE2_NO_UTF_CHECK option when calling
+<b>pcre2_match()</b>. You might want to do this for the second and subsequent
+calls to <b>pcre2_match()</b> if you are making repeated calls to find all the
+matches in a single subject string.
+</P>
+<P>
+NOTE: When PCRE2_NO_UTF_CHECK is set, the effect of passing an invalid string
+as a subject, or an invalid value of <i>startoffset</i>, is undefined. Your
+program may crash or loop indefinitely.
+<pre>
+  PCRE2_PARTIAL_HARD
+  PCRE2_PARTIAL_SOFT
+</pre>
+These options turn on the partial matching feature. A partial match occurs if
+the end of the subject string is reached successfully, but there are not enough
+subject characters to complete the match. If this happens when
+PCRE2_PARTIAL_SOFT (but not PCRE2_PARTIAL_HARD) is set, matching continues by
+testing any remaining alternatives. Only if no complete match can be found is
+PCRE2_ERROR_PARTIAL returned instead of PCRE2_ERROR_NOMATCH. In other words,
+PCRE2_PARTIAL_SOFT specifies that the caller is prepared to handle a partial
+match, but only if no complete match can be found.
+</P>
+<P>
+If PCRE2_PARTIAL_HARD is set, it overrides PCRE2_PARTIAL_SOFT. In this case, if
+a partial match is found, <b>pcre2_match()</b> immediately returns
+PCRE2_ERROR_PARTIAL, without considering any other alternatives. In other
+words, when PCRE2_PARTIAL_HARD is set, a partial match is considered to be more
+important that an alternative complete match.
+</P>
+<P>
+There is a more detailed discussion of partial and multi-segment matching, with
+examples, in the
+<a href="pcre2partial.html"><b>pcre2partial</b></a>
+documentation.
+</P>
+<br><a name="SEC27" href="#TOC1">NEWLINE HANDLING WHEN MATCHING</a><br>
+<P>
+When PCRE2 is built, a default newline convention is set; this is usually the
+standard convention for the operating system. The default can be overridden in
+a
+<a href="#compilecontext">compile context</a>
+by calling <b>pcre2_set_newline()</b>. It can also be overridden by starting a
+pattern string with, for example, (*CRLF), as described in the
+<a href="pcre2pattern.html#newlines">section on newline conventions</a>
+in the
+<a href="pcre2pattern.html"><b>pcre2pattern</b></a>
+page. During matching, the newline choice affects the behaviour of the dot,
+circumflex, and dollar metacharacters. It may also alter the way the match
+starting position is advanced after a match failure for an unanchored pattern.
+</P>
+<P>
+When PCRE2_NEWLINE_CRLF, PCRE2_NEWLINE_ANYCRLF, or PCRE2_NEWLINE_ANY is set as
+the newline convention, and a match attempt for an unanchored pattern fails
+when the current starting position is at a CRLF sequence, and the pattern
+contains no explicit matches for CR or LF characters, the match position is
+advanced by two characters instead of one, in other words, to after the CRLF.
+</P>
+<P>
+The above rule is a compromise that makes the most common cases work as
+expected. For example, if the pattern is .+A (and the PCRE2_DOTALL option is
+not set), it does not match the string "\r\nA" because, after failing at the
+start, it skips both the CR and the LF before retrying. However, the pattern
+[\r\n]A does match that string, because it contains an explicit CR or LF
+reference, and so advances only by one character after the first failure.
+</P>
+<P>
+An explicit match for CR of LF is either a literal appearance of one of those
+characters in the pattern, or one of the \r or \n escape sequences. Implicit
+matches such as [^X] do not count, nor does \s, even though it includes CR and
+LF in the characters that it matches.
+</P>
+<P>
+Notwithstanding the above, anomalous effects may still occur when CRLF is a
+valid newline sequence and explicit \r or \n escapes appear in the pattern.
+<a name="matchedstrings"></a></P>
+<br><a name="SEC28" href="#TOC1">HOW PCRE2_MATCH() RETURNS A STRING AND CAPTURED SUBSTRINGS</a><br>
+<P>
+<b>uint32_t pcre2_get_ovector_count(pcre2_match_data *<i>match_data</i>);</b>
+<br>
+<br>
+<b>PCRE2_SIZE *pcre2_get_ovector_pointer(pcre2_match_data *<i>match_data</i>);</b>
+</P>
+<P>
+In general, a pattern matches a certain portion of the subject, and in
+addition, further substrings from the subject may be picked out by
+parenthesized parts of the pattern. Following the usage in Jeffrey Friedl's
+book, this is called "capturing" in what follows, and the phrase "capturing
+subpattern" or "capturing group" is used for a fragment of a pattern that picks
+out a substring. PCRE2 supports several other kinds of parenthesized subpattern
+that do not cause substrings to be captured. The <b>pcre2_pattern_info()</b>
+function can be used to find out how many capturing subpatterns there are in a
+compiled pattern.
+</P>
+<P>
+You can use auxiliary functions for accessing captured substrings
+<a href="#extractbynumber">by number</a>
+or
+<a href="#extractbyname">by name,</a>
+as described in sections below.
+</P>
+<P>
+Alternatively, you can make direct use of the vector of PCRE2_SIZE values,
+called the <b>ovector</b>, which contains the offsets of captured strings. It is
+part of the
+<a href="#matchdatablock">match data block.</a>
+The function <b>pcre2_get_ovector_pointer()</b> returns the address of the
+ovector, and <b>pcre2_get_ovector_count()</b> returns the number of pairs of
+values it contains.
+</P>
+<P>
+Within the ovector, the first in each pair of values is set to the offset of
+the first code unit of a substring, and the second is set to the offset of the
+first code unit after the end of a substring. These values are always code unit
+offsets, not character offsets. That is, they are byte offsets in the 8-bit
+library, 16-bit offsets in the 16-bit library, and 32-bit offsets in the 32-bit
+library.
+</P>
+<P>
+After a partial match (error return PCRE2_ERROR_PARTIAL), only the first pair
+of offsets (that is, <i>ovector[0]</i> and <i>ovector[1]</i>) are set. They
+identify the part of the subject that was partially matched. See the
+<a href="pcre2partial.html"><b>pcre2partial</b></a>
+documentation for details of partial matching.
+</P>
+<P>
+After a successful match, the first pair of offsets identifies the portion of
+the subject string that was matched by the entire pattern. The next pair is
+used for the first capturing subpattern, and so on. The value returned by
+<b>pcre2_match()</b> is one more than the highest numbered pair that has been
+set. For example, if two substrings have been captured, the returned value is
+3. If there are no capturing subpatterns, the return value from a successful
+match is 1, indicating that just the first pair of offsets has been set.
+</P>
+<P>
+If a pattern uses the \K escape sequence within a positive assertion, the
+reported start of a successful match can be greater than the end of the match.
+For example, if the pattern (?=ab\K) is matched against "ab", the start and
+end offset values for the match are 2 and 0.
+</P>
+<P>
+If a capturing subpattern group is matched repeatedly within a single match
+operation, it is the last portion of the subject that it matched that is
+returned.
+</P>
+<P>
+If the ovector is too small to hold all the captured substring offsets, as much
+as possible is filled in, and the function returns a value of zero. If captured
+substrings are not of interest, <b>pcre2_match()</b> may be called with a match
+data block whose ovector is of minimum length (that is, one pair). However, if
+the pattern contains back references and the <i>ovector</i> is not big enough to
+remember the related substrings, PCRE2 has to get additional memory for use
+during matching. Thus it is usually advisable to set up a match data block
+containing an ovector of reasonable size.
+</P>
+<P>
+It is possible for capturing subpattern number <i>n+1</i> to match some part of
+the subject when subpattern <i>n</i> has not been used at all. For example, if
+the string "abc" is matched against the pattern (a|(z))(bc) the return from the
+function is 4, and subpatterns 1 and 3 are matched, but 2 is not. When this
+happens, both values in the offset pairs corresponding to unused subpatterns
+are set to PCRE2_UNSET.
+</P>
+<P>
+Offset values that correspond to unused subpatterns at the end of the
+expression are also set to PCRE2_UNSET. For example, if the string "abc" is
+matched against the pattern (abc)(x(yz)?)? subpatterns 2 and 3 are not matched.
+The return from the function is 2, because the highest used capturing
+subpattern number is 1. The offsets for for the second and third capturing
+subpatterns (assuming the vector is large enough, of course) are set to
+PCRE2_UNSET.
+</P>
+<P>
+Elements in the ovector that do not correspond to capturing parentheses in the
+pattern are never changed. That is, if a pattern contains <i>n</i> capturing
+parentheses, no more than <i>ovector[0]</i> to <i>ovector[2n+1]</i> are set by
+<b>pcre2_match()</b>. The other elements retain whatever values they previously
+had.
+<a name="matchotherdata"></a></P>
+<br><a name="SEC29" href="#TOC1">OTHER INFORMATION ABOUT A MATCH</a><br>
+<P>
+<b>PCRE2_SPTR pcre2_get_mark(pcre2_match_data *<i>match_data</i>);</b>
+<br>
+<br>
+<b>PCRE2_SIZE pcre2_get_startchar(pcre2_match_data *<i>match_data</i>);</b>
+</P>
+<P>
+As well as the offsets in the ovector, other information about a match is
+retained in the match data block and can be retrieved by the above functions in
+appropriate circumstances. If they are called at other times, the result is
+undefined.
+</P>
+<P>
+After a successful match, a partial match (PCRE2_ERROR_PARTIAL), or a failure
+to match (PCRE2_ERROR_NOMATCH), a (*MARK) name may be available, and
+<b>pcre2_get_mark()</b> can be called. It returns a pointer to the
+zero-terminated name, which is within the compiled pattern. Otherwise NULL is
+returned. The length of the (*MARK) name (excluding the terminating zero) is
+stored in the code unit that preceeds the name. You should use this instead of
+relying on the terminating zero if the (*MARK) name might contain a binary
+zero.
+</P>
+<P>
+After a successful match, the (*MARK) name that is returned is the
+last one encountered on the matching path through the pattern. After a "no
+match" or a partial match, the last encountered (*MARK) name is returned. For
+example, consider this pattern:
+<pre>
+  ^(*MARK:A)((*MARK:B)a|b)c
+</pre>
+When it matches "bc", the returned mark is A. The B mark is "seen" in the first
+branch of the group, but it is not on the matching path. On the other hand,
+when this pattern fails to match "bx", the returned mark is B.
+</P>
+<P>
+After a successful match, a partial match, or one of the invalid UTF errors
+(for example, PCRE2_ERROR_UTF8_ERR5), <b>pcre2_get_startchar()</b> can be
+called. After a successful or partial match it returns the code unit offset of
+the character at which the match started. For a non-partial match, this can be
+different to the value of <i>ovector[0]</i> if the pattern contains the \K
+escape sequence. After a partial match, however, this value is always the same
+as <i>ovector[0]</i> because \K does not affect the result of a partial match.
+</P>
+<P>
+After a UTF check failure, <b>pcre2_get_startchar()</b> can be used to obtain
+the code unit offset of the invalid UTF character. Details are given in the
+<a href="pcre2unicode.html"><b>pcre2unicode</b></a>
+page.
+<a name="errorlist"></a></P>
+<br><a name="SEC30" href="#TOC1">ERROR RETURNS FROM <b>pcre2_match()</b></a><br>
+<P>
+If <b>pcre2_match()</b> fails, it returns a negative number. This can be
+converted to a text string by calling <b>pcre2_get_error_message()</b>. Negative
+error codes are also returned by other functions, and are documented with them.
+The codes are given names in the header file. If UTF checking is in force and
+an invalid UTF subject string is detected, one of a number of UTF-specific
+negative error codes is returned. Details are given in the
+<a href="pcre2unicode.html"><b>pcre2unicode</b></a>
+page. The following are the other errors that may be returned by
+<b>pcre2_match()</b>:
+<pre>
+  PCRE2_ERROR_NOMATCH
+</pre>
+The subject string did not match the pattern.
+<pre>
+  PCRE2_ERROR_PARTIAL
+</pre>
+The subject string did not match, but it did match partially. See the
+<a href="pcre2partial.html"><b>pcre2partial</b></a>
+documentation for details of partial matching.
+<pre>
+  PCRE2_ERROR_BADMAGIC
+</pre>
+PCRE2 stores a 4-byte "magic number" at the start of the compiled code, to
+catch the case when it is passed a junk pointer. This is the error that is
+returned when the magic number is not present.
+<pre>
+  PCRE2_ERROR_BADMODE
+</pre>
+This error is given when a pattern that was compiled by the 8-bit library is
+passed to a 16-bit or 32-bit library function, or vice versa.
+<pre>
+  PCRE2_ERROR_BADOFFSET
+</pre>
+The value of <i>startoffset</i> was greater than the length of the subject.
+<pre>
+  PCRE2_ERROR_BADOPTION
+</pre>
+An unrecognized bit was set in the <i>options</i> argument.
+<pre>
+  PCRE2_ERROR_BADUTFOFFSET
+</pre>
+The UTF code unit sequence that was passed as a subject was checked and found
+to be valid (the PCRE2_NO_UTF_CHECK option was not set), but the value of
+<i>startoffset</i> did not point to the beginning of a UTF character or the end
+of the subject.
+<pre>
+  PCRE2_ERROR_CALLOUT
+</pre>
+This error is never generated by <b>pcre2_match()</b> itself. It is provided for
+use by callout functions that want to cause <b>pcre2_match()</b> or
+<b>pcre2_callout_enumerate()</b> to return a distinctive error code. See the
+<a href="pcre2callout.html"><b>pcre2callout</b></a>
+documentation for details.
+<pre>
+  PCRE2_ERROR_INTERNAL
+</pre>
+An unexpected internal error has occurred. This error could be caused by a bug
+in PCRE2 or by overwriting of the compiled pattern.
+<pre>
+  PCRE2_ERROR_JIT_BADOPTION
+</pre>
+This error is returned when a pattern that was successfully studied using JIT
+is being matched, but the matching mode (partial or complete match) does not
+correspond to any JIT compilation mode. When the JIT fast path function is
+used, this error may be also given for invalid options. See the
+<a href="pcre2jit.html"><b>pcre2jit</b></a>
+documentation for more details.
+<pre>
+  PCRE2_ERROR_JIT_STACKLIMIT
+</pre>
+This error is returned when a pattern that was successfully studied using JIT
+is being matched, but the memory available for the just-in-time processing
+stack is not large enough. See the
+<a href="pcre2jit.html"><b>pcre2jit</b></a>
+documentation for more details.
+<pre>
+  PCRE2_ERROR_MATCHLIMIT
+</pre>
+The backtracking limit was reached.
+<pre>
+  PCRE2_ERROR_NOMEMORY
+</pre>
+If a pattern contains back references, but the ovector is not big enough to
+remember the referenced substrings, PCRE2 gets a block of memory at the start
+of matching to use for this purpose. There are some other special cases where
+extra memory is needed during matching. This error is given when memory cannot
+be obtained.
+<pre>
+  PCRE2_ERROR_NULL
+</pre>
+Either the <i>code</i>, <i>subject</i>, or <i>match_data</i> argument was passed
+as NULL.
+<pre>
+  PCRE2_ERROR_RECURSELOOP
+</pre>
+This error is returned when <b>pcre2_match()</b> detects a recursion loop within
+the pattern. Specifically, it means that either the whole pattern or a
+subpattern has been called recursively for the second time at the same position
+in the subject string. Some simple patterns that might do this are detected and
+faulted at compile time, but more complicated cases, in particular mutual
+recursions between two different subpatterns, cannot be detected until matching
+is attempted.
+<pre>
+  PCRE2_ERROR_RECURSIONLIMIT
+</pre>
+The internal recursion limit was reached.
+<a name="extractbynumber"></a></P>
+<br><a name="SEC31" href="#TOC1">EXTRACTING CAPTURED SUBSTRINGS BY NUMBER</a><br>
+<P>
+<b>int pcre2_substring_length_bynumber(pcre2_match_data *<i>match_data</i>,</b>
+<b>  uint32_t <i>number</i>, PCRE2_SIZE *<i>length</i>);</b>
+<br>
+<br>
+<b>int pcre2_substring_copy_bynumber(pcre2_match_data *<i>match_data</i>,</b>
+<b>  uint32_t <i>number</i>, PCRE2_UCHAR *<i>buffer</i>,</b>
+<b>  PCRE2_SIZE *<i>bufflen</i>);</b>
+<br>
+<br>
+<b>int pcre2_substring_get_bynumber(pcre2_match_data *<i>match_data</i>,</b>
+<b>  uint32_t <i>number</i>, PCRE2_UCHAR **<i>bufferptr</i>,</b>
+<b>  PCRE2_SIZE *<i>bufflen</i>);</b>
+<br>
+<br>
+<b>void pcre2_substring_free(PCRE2_UCHAR *<i>buffer</i>);</b>
+</P>
+<P>
+Captured substrings can be accessed directly by using the ovector as described
+<a href="#matchedstrings">above.</a>
+For convenience, auxiliary functions are provided for extracting captured
+substrings as new, separate, zero-terminated strings. A substring that contains
+a binary zero is correctly extracted and has a further zero added on the end,
+but the result is not, of course, a C string.
+</P>
+<P>
+The functions in this section identify substrings by number. The number zero
+refers to the entire matched substring, with higher numbers referring to
+substrings captured by parenthesized groups. After a partial match, only
+substring zero is available. An attempt to extract any other substring gives
+the error PCRE2_ERROR_PARTIAL. The next section describes similar functions for
+extracting captured substrings by name.
+</P>
+<P>
+If a pattern uses the \K escape sequence within a positive assertion, the
+reported start of a successful match can be greater than the end of the match.
+For example, if the pattern (?=ab\K) is matched against "ab", the start and
+end offset values for the match are 2 and 0. In this situation, calling these
+functions with a zero substring number extracts a zero-length empty string.
+</P>
+<P>
+You can find the length in code units of a captured substring without
+extracting it by calling <b>pcre2_substring_length_bynumber()</b>. The first
+argument is a pointer to the match data block, the second is the group number,
+and the third is a pointer to a variable into which the length is placed. If
+you just want to know whether or not the substring has been captured, you can
+pass the third argument as NULL.
+</P>
+<P>
+The <b>pcre2_substring_copy_bynumber()</b> function copies a captured substring
+into a supplied buffer, whereas <b>pcre2_substring_get_bynumber()</b> copies it
+into new memory, obtained using the same memory allocation function that was
+used for the match data block. The first two arguments of these functions are a
+pointer to the match data block and a capturing group number.
+</P>
+<P>
+The final arguments of <b>pcre2_substring_copy_bynumber()</b> are a pointer to
+the buffer and a pointer to a variable that contains its length in code units.
+This is updated to contain the actual number of code units used for the
+extracted substring, excluding the terminating zero.
+</P>
+<P>
+For <b>pcre2_substring_get_bynumber()</b> the third and fourth arguments point
+to variables that are updated with a pointer to the new memory and the number
+of code units that comprise the substring, again excluding the terminating
+zero. When the substring is no longer needed, the memory should be freed by
+calling <b>pcre2_substring_free()</b>.
+</P>
+<P>
+The return value from all these functions is zero for success, or a negative
+error code. If the pattern match failed, the match failure code is returned.
+If a substring number greater than zero is used after a partial match,
+PCRE2_ERROR_PARTIAL is returned. Other possible error codes are:
+<pre>
+  PCRE2_ERROR_NOMEMORY
+</pre>
+The buffer was too small for <b>pcre2_substring_copy_bynumber()</b>, or the
+attempt to get memory failed for <b>pcre2_substring_get_bynumber()</b>.
+<pre>
+  PCRE2_ERROR_NOSUBSTRING
+</pre>
+There is no substring with that number in the pattern, that is, the number is
+greater than the number of capturing parentheses.
+<pre>
+  PCRE2_ERROR_UNAVAILABLE
+</pre>
+The substring number, though not greater than the number of captures in the
+pattern, is greater than the number of slots in the ovector, so the substring
+could not be captured.
+<pre>
+  PCRE2_ERROR_UNSET
+</pre>
+The substring did not participate in the match. For example, if the pattern is
+(abc)|(def) and the subject is "def", and the ovector contains at least two
+capturing slots, substring number 1 is unset.
+</P>
+<br><a name="SEC32" href="#TOC1">EXTRACTING A LIST OF ALL CAPTURED SUBSTRINGS</a><br>
+<P>
+<b>int pcre2_substring_list_get(pcre2_match_data *<i>match_data</i>,</b>
+<b>"  PCRE2_UCHAR ***<i>listptr</i>, PCRE2_SIZE **<i>lengthsptr</i>);</b>
+<br>
+<br>
+<b>void pcre2_substring_list_free(PCRE2_SPTR *<i>list</i>);</b>
+</P>
+<P>
+The <b>pcre2_substring_list_get()</b> function extracts all available substrings
+and builds a list of pointers to them. It also (optionally) builds a second
+list that contains their lengths (in code units), excluding a terminating zero
+that is added to each of them. All this is done in a single block of memory
+that is obtained using the same memory allocation function that was used to get
+the match data block.
+</P>
+<P>
+This function must be called only after a successful match. If called after a
+partial match, the error code PCRE2_ERROR_PARTIAL is returned.
+</P>
+<P>
+The address of the memory block is returned via <i>listptr</i>, which is also
+the start of the list of string pointers. The end of the list is marked by a
+NULL pointer. The address of the list of lengths is returned via
+<i>lengthsptr</i>. If your strings do not contain binary zeros and you do not
+therefore need the lengths, you may supply NULL as the <b>lengthsptr</b>
+argument to disable the creation of a list of lengths. The yield of the
+function is zero if all went well, or PCRE2_ERROR_NOMEMORY if the memory block
+could not be obtained. When the list is no longer needed, it should be freed by
+calling <b>pcre2_substring_list_free()</b>.
+</P>
+<P>
+If this function encounters a substring that is unset, which can happen when
+capturing subpattern number <i>n+1</i> matches some part of the subject, but
+subpattern <i>n</i> has not been used at all, it returns an empty string. This
+can be distinguished from a genuine zero-length substring by inspecting the
+appropriate offset in the ovector, which contain PCRE2_UNSET for unset
+substrings, or by calling <b>pcre2_substring_length_bynumber()</b>.
+<a name="extractbyname"></a></P>
+<br><a name="SEC33" href="#TOC1">EXTRACTING CAPTURED SUBSTRINGS BY NAME</a><br>
+<P>
+<b>int pcre2_substring_number_from_name(const pcre2_code *<i>code</i>,</b>
+<b>  PCRE2_SPTR <i>name</i>);</b>
+<br>
+<br>
+<b>int pcre2_substring_length_byname(pcre2_match_data *<i>match_data</i>,</b>
+<b>  PCRE2_SPTR <i>name</i>, PCRE2_SIZE *<i>length</i>);</b>
+<br>
+<br>
+<b>int pcre2_substring_copy_byname(pcre2_match_data *<i>match_data</i>,</b>
+<b>  PCRE2_SPTR <i>name</i>, PCRE2_UCHAR *<i>buffer</i>, PCRE2_SIZE *<i>bufflen</i>);</b>
+<br>
+<br>
+<b>int pcre2_substring_get_byname(pcre2_match_data *<i>match_data</i>,</b>
+<b>  PCRE2_SPTR <i>name</i>, PCRE2_UCHAR **<i>bufferptr</i>, PCRE2_SIZE *<i>bufflen</i>);</b>
+<br>
+<br>
+<b>void pcre2_substring_free(PCRE2_UCHAR *<i>buffer</i>);</b>
+</P>
+<P>
+To extract a substring by name, you first have to find associated number.
+For example, for this pattern:
+<pre>
+  (a+)b(?&#60;xxx&#62;\d+)...
+</pre>
+the number of the subpattern called "xxx" is 2. If the name is known to be
+unique (PCRE2_DUPNAMES was not set), you can find the number from the name by
+calling <b>pcre2_substring_number_from_name()</b>. The first argument is the
+compiled pattern, and the second is the name. The yield of the function is the
+subpattern number, PCRE2_ERROR_NOSUBSTRING if there is no subpattern of that
+name, or PCRE2_ERROR_NOUNIQUESUBSTRING if there is more than one subpattern of
+that name. Given the number, you can extract the substring directly, or use one
+of the functions described above.
+</P>
+<P>
+For convenience, there are also "byname" functions that correspond to the
+"bynumber" functions, the only difference being that the second argument is a
+name instead of a number. If PCRE2_DUPNAMES is set and there are duplicate
+names, these functions scan all the groups with the given name, and return the
+first named string that is set.
+</P>
+<P>
+If there are no groups with the given name, PCRE2_ERROR_NOSUBSTRING is
+returned. If all groups with the name have numbers that are greater than the
+number of slots in the ovector, PCRE2_ERROR_UNAVAILABLE is returned. If there
+is at least one group with a slot in the ovector, but no group is found to be
+set, PCRE2_ERROR_UNSET is returned.
+</P>
+<P>
+<b>Warning:</b> If the pattern uses the (?| feature to set up multiple
+subpatterns with the same number, as described in the
+<a href="pcre2pattern.html#dupsubpatternnumber">section on duplicate subpattern numbers</a>
+in the
+<a href="pcre2pattern.html"><b>pcre2pattern</b></a>
+page, you cannot use names to distinguish the different subpatterns, because
+names are not included in the compiled code. The matching process uses only
+numbers. For this reason, the use of different names for subpatterns of the
+same number causes an error at compile time.
+</P>
+<br><a name="SEC34" href="#TOC1">CREATING A NEW STRING WITH SUBSTITUTIONS</a><br>
+<P>
+<b>int pcre2_substitute(const pcre2_code *<i>code</i>, PCRE2_SPTR <i>subject</i>,</b>
+<b>  PCRE2_SIZE <i>length</i>, PCRE2_SIZE <i>startoffset</i>,</b>
+<b>  uint32_t <i>options</i>, pcre2_match_data *<i>match_data</i>,</b>
+<b>  pcre2_match_context *<i>mcontext</i>, PCRE2_SPTR <i>replacement</i>,</b>
+<b>  PCRE2_SIZE <i>rlength</i>, PCRE2_UCHAR *\fIoutputbuffer\zfP,</b>
+<b>  PCRE2_SIZE *<i>outlengthptr</i>);</b>
+</P>
+<P>
+This function calls <b>pcre2_match()</b> and then makes a copy of the subject
+string in <i>outputbuffer</i>, replacing the part that was matched with the
+<i>replacement</i> string, whose length is supplied in <b>rlength</b>. This can
+be given as PCRE2_ZERO_TERMINATED for a zero-terminated string. Matches in
+which a \K item in a lookahead in the pattern causes the match to end before
+it starts are not supported, and give rise to an error return.
+</P>
+<P>
+The first seven arguments of <b>pcre2_substitute()</b> are the same as for
+<b>pcre2_match()</b>, except that the partial matching options are not
+permitted, and <i>match_data</i> may be passed as NULL, in which case a match
+data block is obtained and freed within this function, using memory management
+functions from the match context, if provided, or else those that were used to
+allocate memory for the compiled code.
+</P>
+<P>
+The <i>outlengthptr</i> argument must point to a variable that contains the
+length, in code units, of the output buffer. If the function is successful, the
+value is updated to contain the length of the new string, excluding the
+trailing zero that is automatically added.
+</P>
+<P>
+If the function is not successful, the value set via <i>outlengthptr</i> depends
+on the type of error. For syntax errors in the replacement string, the value is
+the offset in the replacement string where the error was detected. For other
+errors, the value is PCRE2_UNSET by default. This includes the case of the
+output buffer being too small, unless PCRE2_SUBSTITUTE_OVERFLOW_LENGTH is set
+(see below), in which case the value is the minimum length needed, including
+space for the trailing zero. Note that in order to compute the required length,
+<b>pcre2_substitute()</b> has to simulate all the matching and copying, instead
+of giving an error return as soon as the buffer overflows. Note also that the
+length is in code units, not bytes.
+</P>
+<P>
+In the replacement string, which is interpreted as a UTF string in UTF mode,
+and is checked for UTF validity unless the PCRE2_NO_UTF_CHECK option is set, a
+dollar character is an escape character that can specify the insertion of
+characters from capturing groups or (*MARK) items in the pattern. The following
+forms are always recognized:
+<pre>
+  $$                  insert a dollar character
+  $&#60;n&#62; or ${&#60;n&#62;}      insert the contents of group &#60;n&#62;
+  $*MARK or ${*MARK}  insert the name of the last (*MARK) encountered
+</pre>
+Either a group number or a group name can be given for &#60;n&#62;. Curly brackets are
+required only if the following character would be interpreted as part of the
+number or name. The number may be zero to include the entire matched string.
+For example, if the pattern a(b)c is matched with "=abc=" and the replacement
+string "+$1$0$1+", the result is "=+babcb+=".
+</P>
+<P>
+The facility for inserting a (*MARK) name can be used to perform simple
+simultaneous substitutions, as this <b>pcre2test</b> example shows:
+<pre>
+  /(*:pear)apple|(*:orange)lemon/g,replace=${*MARK}
+      apple lemon
+   2: pear orange
+</pre>
+As well as the usual options for <b>pcre2_match()</b>, a number of additional
+options can be set in the <i>options</i> argument.
+</P>
+<P>
+PCRE2_SUBSTITUTE_GLOBAL causes the function to iterate over the subject string,
+replacing every matching substring. If this is not set, only the first matching
+substring is replaced. If any matched substring has zero length, after the
+substitution has happened, an attempt to find a non-empty match at the same
+position is performed. If this is not successful, the current position is
+advanced by one character except when CRLF is a valid newline sequence and the
+next two characters are CR, LF. In this case, the current position is advanced
+by two characters.
+</P>
+<P>
+PCRE2_SUBSTITUTE_OVERFLOW_LENGTH changes what happens when the output buffer is
+too small. The default action is to return PCRE2_ERROR_NOMEMORY immediately. If
+this option is set, however, <b>pcre2_substitute()</b> continues to go through
+the motions of matching and substituting (without, of course, writing anything)
+in order to compute the size of buffer that is needed. This value is passed
+back via the <i>outlengthptr</i> variable, with the result of the function still
+being PCRE2_ERROR_NOMEMORY.
+</P>
+<P>
+Passing a buffer size of zero is a permitted way of finding out how much memory
+is needed for given substitution. However, this does mean that the entire
+operation is carried out twice. Depending on the application, it may be more
+efficient to allocate a large buffer and free the excess afterwards, instead of
+using PCRE2_SUBSTITUTE_OVERFLOW_LENGTH.
+</P>
+<P>
+PCRE2_SUBSTITUTE_UNKNOWN_UNSET causes references to capturing groups that do
+not appear in the pattern to be treated as unset groups. This option should be
+used with care, because it means that a typo in a group name or number no
+longer causes the PCRE2_ERROR_NOSUBSTRING error.
+</P>
+<P>
+PCRE2_SUBSTITUTE_UNSET_EMPTY causes unset capturing groups (including unknown
+groups when PCRE2_SUBSTITUTE_UNKNOWN_UNSET is set) to be treated as empty
+strings when inserted as described above. If this option is not set, an attempt
+to insert an unset group causes the PCRE2_ERROR_UNSET error. This option does
+not influence the extended substitution syntax described below.
+</P>
+<P>
+PCRE2_SUBSTITUTE_EXTENDED causes extra processing to be applied to the
+replacement string. Without this option, only the dollar character is special,
+and only the group insertion forms listed above are valid. When
+PCRE2_SUBSTITUTE_EXTENDED is set, two things change:
+</P>
+<P>
+Firstly, backslash in a replacement string is interpreted as an escape
+character. The usual forms such as \n or \x{ddd} can be used to specify
+particular character codes, and backslash followed by any non-alphanumeric
+character quotes that character. Extended quoting can be coded using \Q...\E,
+exactly as in pattern strings.
+</P>
+<P>
+There are also four escape sequences for forcing the case of inserted letters.
+The insertion mechanism has three states: no case forcing, force upper case,
+and force lower case. The escape sequences change the current state: \U and
+\L change to upper or lower case forcing, respectively, and \E (when not
+terminating a \Q quoted sequence) reverts to no case forcing. The sequences
+\u and \l force the next character (if it is a letter) to upper or lower
+case, respectively, and then the state automatically reverts to no case
+forcing. Case forcing applies to all inserted  characters, including those from
+captured groups and letters within \Q...\E quoted sequences.
+</P>
+<P>
+Note that case forcing sequences such as \U...\E do not nest. For example,
+the result of processing "\Uaa\LBB\Ecc\E" is "AAbbcc"; the final \E has no
+effect.
+</P>
+<P>
+The second effect of setting PCRE2_SUBSTITUTE_EXTENDED is to add more
+flexibility to group substitution. The syntax is similar to that used by Bash:
+<pre>
+  ${&#60;n&#62;:-&#60;string&#62;}
+  ${&#60;n&#62;:+&#60;string1&#62;:&#60;string2&#62;}
+</pre>
+As before, &#60;n&#62; may be a group number or a name. The first form specifies a
+default value. If group &#60;n&#62; is set, its value is inserted; if not, &#60;string&#62; is
+expanded and the result inserted. The second form specifies strings that are
+expanded and inserted when group &#60;n&#62; is set or unset, respectively. The first
+form is just a convenient shorthand for
+<pre>
+  ${&#60;n&#62;:+${&#60;n&#62;}:&#60;string&#62;}
+</pre>
+Backslash can be used to escape colons and closing curly brackets in the
+replacement strings. A change of the case forcing state within a replacement
+string remains in force afterwards, as shown in this <b>pcre2test</b> example:
+<pre>
+  /(some)?(body)/substitute_extended,replace=${1:+\U:\L}HeLLo
+      body
+   1: hello
+      somebody
+   1: HELLO
+</pre>
+The PCRE2_SUBSTITUTE_UNSET_EMPTY option does not affect these extended
+substitutions. However, PCRE2_SUBSTITUTE_UNKNOWN_UNSET does cause unknown
+groups in the extended syntax forms to be treated as unset.
+</P>
+<P>
+If successful, <b>pcre2_substitute()</b> returns the number of replacements that
+were made. This may be zero if no matches were found, and is never greater than
+1 unless PCRE2_SUBSTITUTE_GLOBAL is set.
+</P>
+<P>
+In the event of an error, a negative error code is returned. Except for
+PCRE2_ERROR_NOMATCH (which is never returned), errors from <b>pcre2_match()</b>
+are passed straight back.
+</P>
+<P>
+PCRE2_ERROR_NOSUBSTRING is returned for a non-existent substring insertion,
+unless PCRE2_SUBSTITUTE_UNKNOWN_UNSET is set.
+</P>
+<P>
+PCRE2_ERROR_UNSET is returned for an unset substring insertion (including an
+unknown substring when PCRE2_SUBSTITUTE_UNKNOWN_UNSET is set) when the simple
+(non-extended) syntax is used and PCRE2_SUBSTITUTE_UNSET_EMPTY is not set.
+</P>
+<P>
+PCRE2_ERROR_NOMEMORY is returned if the output buffer is not big enough. If the
+PCRE2_SUBSTITUTE_OVERFLOW_LENGTH option is set, the size of buffer that is
+needed is returned via <i>outlengthptr</i>. Note that this does not happen by
+default.
+</P>
+<P>
+PCRE2_ERROR_BADREPLACEMENT is used for miscellaneous syntax errors in the
+replacement string, with more particular errors being PCRE2_ERROR_BADREPESCAPE
+(invalid escape sequence), PCRE2_ERROR_REPMISSING_BRACE (closing curly bracket
+not found), PCRE2_BADSUBSTITUTION (syntax error in extended group
+substitution), and PCRE2_BADSUBPATTERN (the pattern match ended before it
+started, which can happen if \K is used in an assertion).
+</P>
+<P>
+As for all PCRE2 errors, a text message that describes the error can be
+obtained by calling <b>pcre2_get_error_message()</b>.
+</P>
+<br><a name="SEC35" href="#TOC1">DUPLICATE SUBPATTERN NAMES</a><br>
+<P>
+<b>int pcre2_substring_nametable_scan(const pcre2_code *<i>code</i>,</b>
+<b>  PCRE2_SPTR <i>name</i>, PCRE2_SPTR *<i>first</i>, PCRE2_SPTR *<i>last</i>);</b>
+</P>
+<P>
+When a pattern is compiled with the PCRE2_DUPNAMES option, names for
+subpatterns are not required to be unique. Duplicate names are always allowed
+for subpatterns with the same number, created by using the (?| feature. Indeed,
+if such subpatterns are named, they are required to use the same names.
+</P>
+<P>
+Normally, patterns with duplicate names are such that in any one match, only
+one of the named subpatterns participates. An example is shown in the
+<a href="pcre2pattern.html"><b>pcre2pattern</b></a>
+documentation.
+</P>
+<P>
+When duplicates are present, <b>pcre2_substring_copy_byname()</b> and
+<b>pcre2_substring_get_byname()</b> return the first substring corresponding to
+the given name that is set. Only if none are set is PCRE2_ERROR_UNSET is
+returned. The <b>pcre2_substring_number_from_name()</b> function returns the
+error PCRE2_ERROR_NOUNIQUESUBSTRING when there are duplicate names.
+</P>
+<P>
+If you want to get full details of all captured substrings for a given name,
+you must use the <b>pcre2_substring_nametable_scan()</b> function. The first
+argument is the compiled pattern, and the second is the name. If the third and
+fourth arguments are NULL, the function returns a group number for a unique
+name, or PCRE2_ERROR_NOUNIQUESUBSTRING otherwise.
+</P>
+<P>
+When the third and fourth arguments are not NULL, they must be pointers to
+variables that are updated by the function. After it has run, they point to the
+first and last entries in the name-to-number table for the given name, and the
+function returns the length of each entry in code units. In both cases,
+PCRE2_ERROR_NOSUBSTRING is returned if there are no entries for the given name.
+</P>
+<P>
+The format of the name table is described
+<a href="#infoaboutpattern">above</a>
+in the section entitled <i>Information about a pattern</i>. Given all the
+relevant entries for the name, you can extract each of their numbers, and hence
+the captured data.
+</P>
+<br><a name="SEC36" href="#TOC1">FINDING ALL POSSIBLE MATCHES AT ONE POSITION</a><br>
+<P>
+The traditional matching function uses a similar algorithm to Perl, which stops
+when it finds the first match at a given point in the subject. If you want to
+find all possible matches, or the longest possible match at a given position,
+consider using the alternative matching function (see below) instead. If you
+cannot use the alternative function, you can kludge it up by making use of the
+callout facility, which is described in the
+<a href="pcre2callout.html"><b>pcre2callout</b></a>
+documentation.
+</P>
+<P>
+What you have to do is to insert a callout right at the end of the pattern.
+When your callout function is called, extract and save the current matched
+substring. Then return 1, which forces <b>pcre2_match()</b> to backtrack and try
+other alternatives. Ultimately, when it runs out of matches,
+<b>pcre2_match()</b> will yield PCRE2_ERROR_NOMATCH.
+<a name="dfamatch"></a></P>
+<br><a name="SEC37" href="#TOC1">MATCHING A PATTERN: THE ALTERNATIVE FUNCTION</a><br>
+<P>
+<b>int pcre2_dfa_match(const pcre2_code *<i>code</i>, PCRE2_SPTR <i>subject</i>,</b>
+<b>  PCRE2_SIZE <i>length</i>, PCRE2_SIZE <i>startoffset</i>,</b>
+<b>  uint32_t <i>options</i>, pcre2_match_data *<i>match_data</i>,</b>
+<b>  pcre2_match_context *<i>mcontext</i>,</b>
+<b>  int *<i>workspace</i>, PCRE2_SIZE <i>wscount</i>);</b>
+</P>
+<P>
+The function <b>pcre2_dfa_match()</b> is called to match a subject string
+against a compiled pattern, using a matching algorithm that scans the subject
+string just once, and does not backtrack. This has different characteristics to
+the normal algorithm, and is not compatible with Perl. Some of the features of
+PCRE2 patterns are not supported. Nevertheless, there are times when this kind
+of matching can be useful. For a discussion of the two matching algorithms, and
+a list of features that <b>pcre2_dfa_match()</b> does not support, see the
+<a href="pcre2matching.html"><b>pcre2matching</b></a>
+documentation.
+</P>
+<P>
+The arguments for the <b>pcre2_dfa_match()</b> function are the same as for
+<b>pcre2_match()</b>, plus two extras. The ovector within the match data block
+is used in a different way, and this is described below. The other common
+arguments are used in the same way as for <b>pcre2_match()</b>, so their
+description is not repeated here.
+</P>
+<P>
+The two additional arguments provide workspace for the function. The workspace
+vector should contain at least 20 elements. It is used for keeping track of
+multiple paths through the pattern tree. More workspace is needed for patterns
+and subjects where there are a lot of potential matches.
+</P>
+<P>
+Here is an example of a simple call to <b>pcre2_dfa_match()</b>:
+<pre>
+  int wspace[20];
+  pcre2_match_data *md = pcre2_match_data_create(4, NULL);
+  int rc = pcre2_dfa_match(
+    re,             /* result of pcre2_compile() */
+    "some string",  /* the subject string */
+    11,             /* the length of the subject string */
+    0,              /* start at offset 0 in the subject */
+    0,              /* default options */
+    match_data,     /* the match data block */
+    NULL,           /* a match context; NULL means use defaults */
+    wspace,         /* working space vector */
+    20);            /* number of elements (NOT size in bytes) */
+</PRE>
+</P>
+<br><b>
+Option bits for <b>pcre_dfa_match()</b>
+</b><br>
+<P>
+The unused bits of the <i>options</i> argument for <b>pcre2_dfa_match()</b> must
+be zero. The only bits that may be set are PCRE2_ANCHORED, PCRE2_NOTBOL,
+PCRE2_NOTEOL, PCRE2_NOTEMPTY, PCRE2_NOTEMPTY_ATSTART, PCRE2_NO_UTF_CHECK,
+PCRE2_PARTIAL_HARD, PCRE2_PARTIAL_SOFT, PCRE2_DFA_SHORTEST, and
+PCRE2_DFA_RESTART. All but the last four of these are exactly the same as for
+<b>pcre2_match()</b>, so their description is not repeated here.
+<pre>
+  PCRE2_PARTIAL_HARD
+  PCRE2_PARTIAL_SOFT
+</pre>
+These have the same general effect as they do for <b>pcre2_match()</b>, but the
+details are slightly different. When PCRE2_PARTIAL_HARD is set for
+<b>pcre2_dfa_match()</b>, it returns PCRE2_ERROR_PARTIAL if the end of the
+subject is reached and there is still at least one matching possibility that
+requires additional characters. This happens even if some complete matches have
+already been found. When PCRE2_PARTIAL_SOFT is set, the return code
+PCRE2_ERROR_NOMATCH is converted into PCRE2_ERROR_PARTIAL if the end of the
+subject is reached, there have been no complete matches, but there is still at
+least one matching possibility. The portion of the string that was inspected
+when the longest partial match was found is set as the first matching string in
+both cases. There is a more detailed discussion of partial and multi-segment
+matching, with examples, in the
+<a href="pcre2partial.html"><b>pcre2partial</b></a>
+documentation.
+<pre>
+  PCRE2_DFA_SHORTEST
+</pre>
+Setting the PCRE2_DFA_SHORTEST option causes the matching algorithm to stop as
+soon as it has found one match. Because of the way the alternative algorithm
+works, this is necessarily the shortest possible match at the first possible
+matching point in the subject string.
+<pre>
+  PCRE2_DFA_RESTART
+</pre>
+When <b>pcre2_dfa_match()</b> returns a partial match, it is possible to call it
+again, with additional subject characters, and have it continue with the same
+match. The PCRE2_DFA_RESTART option requests this action; when it is set, the
+<i>workspace</i> and <i>wscount</i> options must reference the same vector as
+before because data about the match so far is left in them after a partial
+match. There is more discussion of this facility in the
+<a href="pcre2partial.html"><b>pcre2partial</b></a>
+documentation.
+</P>
+<br><b>
+Successful returns from <b>pcre2_dfa_match()</b>
+</b><br>
+<P>
+When <b>pcre2_dfa_match()</b> succeeds, it may have matched more than one
+substring in the subject. Note, however, that all the matches from one run of
+the function start at the same point in the subject. The shorter matches are
+all initial substrings of the longer matches. For example, if the pattern
+<pre>
+  &#60;.*&#62;
+</pre>
+is matched against the string
+<pre>
+  This is &#60;something&#62; &#60;something else&#62; &#60;something further&#62; no more
+</pre>
+the three matched strings are
+<pre>
+  &#60;something&#62; &#60;something else&#62; &#60;something further&#62;
+  &#60;something&#62; &#60;something else&#62;
+  &#60;something&#62;
+</pre>
+On success, the yield of the function is a number greater than zero, which is
+the number of matched substrings. The offsets of the substrings are returned in
+the ovector, and can be extracted by number in the same way as for
+<b>pcre2_match()</b>, but the numbers bear no relation to any capturing groups
+that may exist in the pattern, because DFA matching does not support group
+capture.
+</P>
+<P>
+Calls to the convenience functions that extract substrings by name
+return the error PCRE2_ERROR_DFA_UFUNC (unsupported function) if used after a
+DFA match. The convenience functions that extract substrings by number never
+return PCRE2_ERROR_NOSUBSTRING, and the meanings of some other errors are
+slightly different:
+<pre>
+  PCRE2_ERROR_UNAVAILABLE
+</pre>
+The ovector is not big enough to include a slot for the given substring number.
+<pre>
+  PCRE2_ERROR_UNSET
+</pre>
+There is a slot in the ovector for this substring, but there were insufficient
+matches to fill it.
+</P>
+<P>
+The matched strings are stored in the ovector in reverse order of length; that
+is, the longest matching string is first. If there were too many matches to fit
+into the ovector, the yield of the function is zero, and the vector is filled
+with the longest matches.
+</P>
+<P>
+NOTE: PCRE2's "auto-possessification" optimization usually applies to character
+repeats at the end of a pattern (as well as internally). For example, the
+pattern "a\d+" is compiled as if it were "a\d++". For DFA matching, this
+means that only one possible match is found. If you really do want multiple
+matches in such cases, either use an ungreedy repeat auch as "a\d+?" or set
+the PCRE2_NO_AUTO_POSSESS option when compiling.
+</P>
+<br><b>
+Error returns from <b>pcre2_dfa_match()</b>
+</b><br>
+<P>
+The <b>pcre2_dfa_match()</b> function returns a negative number when it fails.
+Many of the errors are the same as for <b>pcre2_match()</b>, as described
+<a href="#errorlist">above.</a>
+There are in addition the following errors that are specific to
+<b>pcre2_dfa_match()</b>:
+<pre>
+  PCRE2_ERROR_DFA_UITEM
+</pre>
+This return is given if <b>pcre2_dfa_match()</b> encounters an item in the
+pattern that it does not support, for instance, the use of \C in a UTF mode or
+a back reference.
+<pre>
+  PCRE2_ERROR_DFA_UCOND
+</pre>
+This return is given if <b>pcre2_dfa_match()</b> encounters a condition item
+that uses a back reference for the condition, or a test for recursion in a
+specific group. These are not supported.
+<pre>
+  PCRE2_ERROR_DFA_WSSIZE
+</pre>
+This return is given if <b>pcre2_dfa_match()</b> runs out of space in the
+<i>workspace</i> vector.
+<pre>
+  PCRE2_ERROR_DFA_RECURSE
+</pre>
+When a recursive subpattern is processed, the matching function calls itself
+recursively, using private memory for the ovector and <i>workspace</i>. This
+error is given if the internal ovector is not large enough. This should be
+extremely rare, as a vector of size 1000 is used.
+<pre>
+  PCRE2_ERROR_DFA_BADRESTART
+</pre>
+When <b>pcre2_dfa_match()</b> is called with the <b>PCRE2_DFA_RESTART</b> option,
+some plausibility checks are made on the contents of the workspace, which
+should contain data about the previous partial match. If any of these checks
+fail, this error is given.
+</P>
+<br><a name="SEC38" href="#TOC1">SEE ALSO</a><br>
+<P>
+<b>pcre2build</b>(3), <b>pcre2callout</b>(3), <b>pcre2demo(3)</b>,
+<b>pcre2matching</b>(3), <b>pcre2partial</b>(3), <b>pcre2posix</b>(3),
+<b>pcre2sample</b>(3), <b>pcre2stack</b>(3), <b>pcre2unicode</b>(3).
+</P>
+<br><a name="SEC39" href="#TOC1">AUTHOR</a><br>
+<P>
+Philip Hazel
+<br>
+University Computing Service
+<br>
+Cambridge, England.
+<br>
+</P>
+<br><a name="SEC40" href="#TOC1">REVISION</a><br>
+<P>
+Last updated: 16 December 2015
+<br>
+Copyright &copy; 1997-2015 University of Cambridge.
+<br>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
diff --git a/dist2/doc/html/pcre2build.html b/dist2/doc/html/pcre2build.html
new file mode 100644
index 0000000..1e5f737
--- /dev/null
+++ b/dist2/doc/html/pcre2build.html
@@ -0,0 +1,511 @@
+<html>
+<head>
+<title>pcre2build specification</title>
+</head>
+<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
+<h1>pcre2build man page</h1>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
+<p>
+This page is part of the PCRE2 HTML documentation. It was generated
+automatically from the original man page. If there is any nonsense in it,
+please consult the man page, in case the conversion went wrong.
+<br>
+<ul>
+<li><a name="TOC1" href="#SEC1">BUILDING PCRE2</a>
+<li><a name="TOC2" href="#SEC2">PCRE2 BUILD-TIME OPTIONS</a>
+<li><a name="TOC3" href="#SEC3">BUILDING 8-BIT, 16-BIT AND 32-BIT LIBRARIES</a>
+<li><a name="TOC4" href="#SEC4">BUILDING SHARED AND STATIC LIBRARIES</a>
+<li><a name="TOC5" href="#SEC5">UNICODE AND UTF SUPPORT</a>
+<li><a name="TOC6" href="#SEC6">DISABLING THE USE OF \C</a>
+<li><a name="TOC7" href="#SEC7">JUST-IN-TIME COMPILER SUPPORT</a>
+<li><a name="TOC8" href="#SEC8">NEWLINE RECOGNITION</a>
+<li><a name="TOC9" href="#SEC9">WHAT \R MATCHES</a>
+<li><a name="TOC10" href="#SEC10">HANDLING VERY LARGE PATTERNS</a>
+<li><a name="TOC11" href="#SEC11">AVOIDING EXCESSIVE STACK USAGE</a>
+<li><a name="TOC12" href="#SEC12">LIMITING PCRE2 RESOURCE USAGE</a>
+<li><a name="TOC13" href="#SEC13">CREATING CHARACTER TABLES AT BUILD TIME</a>
+<li><a name="TOC14" href="#SEC14">USING EBCDIC CODE</a>
+<li><a name="TOC15" href="#SEC15">PCRE2GREP OPTIONS FOR COMPRESSED FILE SUPPORT</a>
+<li><a name="TOC16" href="#SEC16">PCRE2GREP BUFFER SIZE</a>
+<li><a name="TOC17" href="#SEC17">PCRE2TEST OPTION FOR LIBREADLINE SUPPORT</a>
+<li><a name="TOC18" href="#SEC18">INCLUDING DEBUGGING CODE</a>
+<li><a name="TOC19" href="#SEC19">DEBUGGING WITH VALGRIND SUPPORT</a>
+<li><a name="TOC20" href="#SEC20">CODE COVERAGE REPORTING</a>
+<li><a name="TOC21" href="#SEC21">SEE ALSO</a>
+<li><a name="TOC22" href="#SEC22">AUTHOR</a>
+<li><a name="TOC23" href="#SEC23">REVISION</a>
+</ul>
+<br><a name="SEC1" href="#TOC1">BUILDING PCRE2</a><br>
+<P>
+PCRE2 is distributed with a <b>configure</b> script that can be used to build
+the library in Unix-like environments using the applications known as
+Autotools. Also in the distribution are files to support building using
+<b>CMake</b> instead of <b>configure</b>. The text file
+<a href="README.txt"><b>README</b></a>
+contains general information about building with Autotools (some of which is
+repeated below), and also has some comments about building on various operating
+systems. There is a lot more information about building PCRE2 without using
+Autotools (including information about using <b>CMake</b> and building "by
+hand") in the text file called
+<a href="NON-AUTOTOOLS-BUILD.txt"><b>NON-AUTOTOOLS-BUILD</b>.</a>
+You should consult this file as well as the
+<a href="README.txt"><b>README</b></a>
+file if you are building in a non-Unix-like environment.
+</P>
+<br><a name="SEC2" href="#TOC1">PCRE2 BUILD-TIME OPTIONS</a><br>
+<P>
+The rest of this document describes the optional features of PCRE2 that can be
+selected when the library is compiled. It assumes use of the <b>configure</b>
+script, where the optional features are selected or deselected by providing
+options to <b>configure</b> before running the <b>make</b> command. However, the
+same options can be selected in both Unix-like and non-Unix-like environments
+if you are using <b>CMake</b> instead of <b>configure</b> to build PCRE2.
+</P>
+<P>
+If you are not using Autotools or <b>CMake</b>, option selection can be done by
+editing the <b>config.h</b> file, or by passing parameter settings to the
+compiler, as described in
+<a href="NON-AUTOTOOLS-BUILD.txt"><b>NON-AUTOTOOLS-BUILD</b>.</a>
+</P>
+<P>
+The complete list of options for <b>configure</b> (which includes the standard
+ones such as the selection of the installation directory) can be obtained by
+running
+<pre>
+  ./configure --help
+</pre>
+The following sections include descriptions of options whose names begin with
+--enable or --disable. These settings specify changes to the defaults for the
+<b>configure</b> command. Because of the way that <b>configure</b> works,
+--enable and --disable always come in pairs, so the complementary option always
+exists as well, but as it specifies the default, it is not described.
+</P>
+<br><a name="SEC3" href="#TOC1">BUILDING 8-BIT, 16-BIT AND 32-BIT LIBRARIES</a><br>
+<P>
+By default, a library called <b>libpcre2-8</b> is built, containing functions
+that take string arguments contained in vectors of bytes, interpreted either as
+single-byte characters, or UTF-8 strings. You can also build two other
+libraries, called <b>libpcre2-16</b> and <b>libpcre2-32</b>, which process
+strings that are contained in vectors of 16-bit and 32-bit code units,
+respectively. These can be interpreted either as single-unit characters or
+UTF-16/UTF-32 strings. To build these additional libraries, add one or both of
+the following to the <b>configure</b> command:
+<pre>
+  --enable-pcre2-16
+  --enable-pcre2-32
+</pre>
+If you do not want the 8-bit library, add
+<pre>
+  --disable-pcre2-8
+</pre>
+as well. At least one of the three libraries must be built. Note that the POSIX
+wrapper is for the 8-bit library only, and that <b>pcre2grep</b> is an 8-bit
+program. Neither of these are built if you select only the 16-bit or 32-bit
+libraries.
+</P>
+<br><a name="SEC4" href="#TOC1">BUILDING SHARED AND STATIC LIBRARIES</a><br>
+<P>
+The Autotools PCRE2 building process uses <b>libtool</b> to build both shared
+and static libraries by default. You can suppress an unwanted library by adding
+one of
+<pre>
+  --disable-shared
+  --disable-static
+</pre>
+to the <b>configure</b> command.
+</P>
+<br><a name="SEC5" href="#TOC1">UNICODE AND UTF SUPPORT</a><br>
+<P>
+By default, PCRE2 is built with support for Unicode and UTF character strings.
+To build it without Unicode support, add
+<pre>
+  --disable-unicode
+</pre>
+to the <b>configure</b> command. This setting applies to all three libraries. It
+is not possible to build one library with Unicode support, and another without,
+in the same configuration.
+</P>
+<P>
+Of itself, Unicode support does not make PCRE2 treat strings as UTF-8, UTF-16
+or UTF-32. To do that, applications that use the library can set the PCRE2_UTF
+option when they call <b>pcre2_compile()</b> to compile a pattern.
+Alternatively, patterns may be started with (*UTF) unless the application has
+locked this out by setting PCRE2_NEVER_UTF.
+</P>
+<P>
+UTF support allows the libraries to process character code points up to
+0x10ffff in the strings that they handle. It also provides support for
+accessing the Unicode properties of such characters, using pattern escapes such
+as \P, \p, and \X. Only the general category properties such as <i>Lu</i> and
+<i>Nd</i> are supported. Details are given in the
+<a href="pcre2pattern.html"><b>pcre2pattern</b></a>
+documentation.
+</P>
+<P>
+Pattern escapes such as \d and \w do not by default make use of Unicode
+properties. The application can request that they do by setting the PCRE2_UCP
+option. Unless the application has set PCRE2_NEVER_UCP, a pattern may also
+request this by starting with (*UCP).
+</P>
+<br><a name="SEC6" href="#TOC1">DISABLING THE USE OF \C</a><br>
+<P>
+The \C escape sequence, which matches a single code unit, even in a UTF mode,
+can cause unpredictable behaviour because it may leave the current matching
+point in the middle of a multi-code-unit character. The application can lock it
+out by setting the PCRE2_NEVER_BACKSLASH_C option when calling
+<b>pcre2_compile()</b>. There is also a build-time option
+<pre>
+  --enable-never-backslash-C
+</pre>
+(note the upper case C) which locks out the use of \C entirely.
+</P>
+<br><a name="SEC7" href="#TOC1">JUST-IN-TIME COMPILER SUPPORT</a><br>
+<P>
+Just-in-time compiler support is included in the build by specifying
+<pre>
+  --enable-jit
+</pre>
+This support is available only for certain hardware architectures. If this
+option is set for an unsupported architecture, a building error occurs.
+See the
+<a href="pcre2jit.html"><b>pcre2jit</b></a>
+documentation for a discussion of JIT usage. When JIT support is enabled,
+pcre2grep automatically makes use of it, unless you add
+<pre>
+  --disable-pcre2grep-jit
+</pre>
+to the "configure" command.
+</P>
+<br><a name="SEC8" href="#TOC1">NEWLINE RECOGNITION</a><br>
+<P>
+By default, PCRE2 interprets the linefeed (LF) character as indicating the end
+of a line. This is the normal newline character on Unix-like systems. You can
+compile PCRE2 to use carriage return (CR) instead, by adding
+<pre>
+  --enable-newline-is-cr
+</pre>
+to the <b>configure</b> command. There is also an --enable-newline-is-lf option,
+which explicitly specifies linefeed as the newline character.
+</P>
+<P>
+Alternatively, you can specify that line endings are to be indicated by the
+two-character sequence CRLF (CR immediately followed by LF). If you want this,
+add
+<pre>
+  --enable-newline-is-crlf
+</pre>
+to the <b>configure</b> command. There is a fourth option, specified by
+<pre>
+  --enable-newline-is-anycrlf
+</pre>
+which causes PCRE2 to recognize any of the three sequences CR, LF, or CRLF as
+indicating a line ending. Finally, a fifth option, specified by
+<pre>
+  --enable-newline-is-any
+</pre>
+causes PCRE2 to recognize any Unicode newline sequence. The Unicode newline
+sequences are the three just mentioned, plus the single characters VT (vertical
+tab, U+000B), FF (form feed, U+000C), NEL (next line, U+0085), LS (line
+separator, U+2028), and PS (paragraph separator, U+2029).
+</P>
+<P>
+Whatever default line ending convention is selected when PCRE2 is built can be
+overridden by applications that use the library. At build time it is
+conventional to use the standard for your operating system.
+</P>
+<br><a name="SEC9" href="#TOC1">WHAT \R MATCHES</a><br>
+<P>
+By default, the sequence \R in a pattern matches any Unicode newline sequence,
+independently of what has been selected as the line ending sequence. If you
+specify
+<pre>
+  --enable-bsr-anycrlf
+</pre>
+the default is changed so that \R matches only CR, LF, or CRLF. Whatever is
+selected when PCRE2 is built can be overridden by applications that use the
+called.
+</P>
+<br><a name="SEC10" href="#TOC1">HANDLING VERY LARGE PATTERNS</a><br>
+<P>
+Within a compiled pattern, offset values are used to point from one part to
+another (for example, from an opening parenthesis to an alternation
+metacharacter). By default, in the 8-bit and 16-bit libraries, two-byte values
+are used for these offsets, leading to a maximum size for a compiled pattern of
+around 64K code units. This is sufficient to handle all but the most gigantic
+patterns. Nevertheless, some people do want to process truly enormous patterns,
+so it is possible to compile PCRE2 to use three-byte or four-byte offsets by
+adding a setting such as
+<pre>
+  --with-link-size=3
+</pre>
+to the <b>configure</b> command. The value given must be 2, 3, or 4. For the
+16-bit library, a value of 3 is rounded up to 4. In these libraries, using
+longer offsets slows down the operation of PCRE2 because it has to load
+additional data when handling them. For the 32-bit library the value is always
+4 and cannot be overridden; the value of --with-link-size is ignored.
+</P>
+<br><a name="SEC11" href="#TOC1">AVOIDING EXCESSIVE STACK USAGE</a><br>
+<P>
+When matching with the <b>pcre2_match()</b> function, PCRE2 implements
+backtracking by making recursive calls to an internal function called
+<b>match()</b>. In environments where the size of the stack is limited, this can
+severely limit PCRE2's operation. (The Unix environment does not usually suffer
+from this problem, but it may sometimes be necessary to increase the maximum
+stack size. There is a discussion in the
+<a href="pcre2stack.html"><b>pcre2stack</b></a>
+documentation.) An alternative approach to recursion that uses memory from the
+heap to remember data, instead of using recursive function calls, has been
+implemented to work round the problem of limited stack size. If you want to
+build a version of PCRE2 that works this way, add
+<pre>
+  --disable-stack-for-recursion
+</pre>
+to the <b>configure</b> command. By default, the system functions <b>malloc()</b>
+and <b>free()</b> are called to manage the heap memory that is required, but
+custom memory management functions can be called instead. PCRE2 runs noticeably
+more slowly when built in this way. This option affects only the
+<b>pcre2_match()</b> function; it is not relevant for <b>pcre2_dfa_match()</b>.
+</P>
+<br><a name="SEC12" href="#TOC1">LIMITING PCRE2 RESOURCE USAGE</a><br>
+<P>
+Internally, PCRE2 has a function called <b>match()</b>, which it calls
+repeatedly (sometimes recursively) when matching a pattern with the
+<b>pcre2_match()</b> function. By controlling the maximum number of times this
+function may be called during a single matching operation, a limit can be
+placed on the resources used by a single call to <b>pcre2_match()</b>. The limit
+can be changed at run time, as described in the
+<a href="pcre2api.html"><b>pcre2api</b></a>
+documentation. The default is 10 million, but this can be changed by adding a
+setting such as
+<pre>
+  --with-match-limit=500000
+</pre>
+to the <b>configure</b> command. This setting has no effect on the
+<b>pcre2_dfa_match()</b> matching function.
+</P>
+<P>
+In some environments it is desirable to limit the depth of recursive calls of
+<b>match()</b> more strictly than the total number of calls, in order to
+restrict the maximum amount of stack (or heap, if --disable-stack-for-recursion
+is specified) that is used. A second limit controls this; it defaults to the
+value that is set for --with-match-limit, which imposes no additional
+constraints. However, you can set a lower limit by adding, for example,
+<pre>
+  --with-match-limit-recursion=10000
+</pre>
+to the <b>configure</b> command. This value can also be overridden at run time.
+</P>
+<br><a name="SEC13" href="#TOC1">CREATING CHARACTER TABLES AT BUILD TIME</a><br>
+<P>
+PCRE2 uses fixed tables for processing characters whose code points are less
+than 256. By default, PCRE2 is built with a set of tables that are distributed
+in the file <i>src/pcre2_chartables.c.dist</i>. These tables are for ASCII codes
+only. If you add
+<pre>
+  --enable-rebuild-chartables
+</pre>
+to the <b>configure</b> command, the distributed tables are no longer used.
+Instead, a program called <b>dftables</b> is compiled and run. This outputs the
+source for new set of tables, created in the default locale of your C run-time
+system. (This method of replacing the tables does not work if you are cross
+compiling, because <b>dftables</b> is run on the local host. If you need to
+create alternative tables when cross compiling, you will have to do so "by
+hand".)
+</P>
+<br><a name="SEC14" href="#TOC1">USING EBCDIC CODE</a><br>
+<P>
+PCRE2 assumes by default that it will run in an environment where the character
+code is ASCII or Unicode, which is a superset of ASCII. This is the case for
+most computer operating systems. PCRE2 can, however, be compiled to run in an
+8-bit EBCDIC environment by adding
+<pre>
+  --enable-ebcdic --disable-unicode
+</pre>
+to the <b>configure</b> command. This setting implies
+--enable-rebuild-chartables. You should only use it if you know that you are in
+an EBCDIC environment (for example, an IBM mainframe operating system).
+</P>
+<P>
+It is not possible to support both EBCDIC and UTF-8 codes in the same version
+of the library. Consequently, --enable-unicode and --enable-ebcdic are mutually
+exclusive.
+</P>
+<P>
+The EBCDIC character that corresponds to an ASCII LF is assumed to have the
+value 0x15 by default. However, in some EBCDIC environments, 0x25 is used. In
+such an environment you should use
+<pre>
+  --enable-ebcdic-nl25
+</pre>
+as well as, or instead of, --enable-ebcdic. The EBCDIC character for CR has the
+same value as in ASCII, namely, 0x0d. Whichever of 0x15 and 0x25 is <i>not</i>
+chosen as LF is made to correspond to the Unicode NEL character (which, in
+Unicode, is 0x85).
+</P>
+<P>
+The options that select newline behaviour, such as --enable-newline-is-cr,
+and equivalent run-time options, refer to these character values in an EBCDIC
+environment.
+</P>
+<br><a name="SEC15" href="#TOC1">PCRE2GREP OPTIONS FOR COMPRESSED FILE SUPPORT</a><br>
+<P>
+By default, <b>pcre2grep</b> reads all files as plain text. You can build it so
+that it recognizes files whose names end in <b>.gz</b> or <b>.bz2</b>, and reads
+them with <b>libz</b> or <b>libbz2</b>, respectively, by adding one or both of
+<pre>
+  --enable-pcre2grep-libz
+  --enable-pcre2grep-libbz2
+</pre>
+to the <b>configure</b> command. These options naturally require that the
+relevant libraries are installed on your system. Configuration will fail if
+they are not.
+</P>
+<br><a name="SEC16" href="#TOC1">PCRE2GREP BUFFER SIZE</a><br>
+<P>
+<b>pcre2grep</b> uses an internal buffer to hold a "window" on the file it is
+scanning, in order to be able to output "before" and "after" lines when it
+finds a match. The size of the buffer is controlled by a parameter whose
+default value is 20K. The buffer itself is three times this size, but because
+of the way it is used for holding "before" lines, the longest line that is
+guaranteed to be processable is the parameter size. You can change the default
+parameter value by adding, for example,
+<pre>
+  --with-pcre2grep-bufsize=50K
+</pre>
+to the <b>configure</b> command. The caller of \fPpcre2grep\fP can override this
+value by using --buffer-size on the command line..
+</P>
+<br><a name="SEC17" href="#TOC1">PCRE2TEST OPTION FOR LIBREADLINE SUPPORT</a><br>
+<P>
+If you add one of
+<pre>
+  --enable-pcre2test-libreadline
+  --enable-pcre2test-libedit
+</pre>
+to the <b>configure</b> command, <b>pcre2test</b> is linked with the
+<b>libreadline</b> or<b>libedit</b> library, respectively, and when its input is
+from a terminal, it reads it using the <b>readline()</b> function. This provides
+line-editing and history facilities. Note that <b>libreadline</b> is
+GPL-licensed, so if you distribute a binary of <b>pcre2test</b> linked in this
+way, there may be licensing issues. These can be avoided by linking instead
+with <b>libedit</b>, which has a BSD licence.
+</P>
+<P>
+Setting --enable-pcre2test-libreadline causes the <b>-lreadline</b> option to be
+added to the <b>pcre2test</b> build. In many operating environments with a
+sytem-installed readline library this is sufficient. However, in some
+environments (e.g. if an unmodified distribution version of readline is in
+use), some extra configuration may be necessary. The INSTALL file for
+<b>libreadline</b> says this:
+<pre>
+  "Readline uses the termcap functions, but does not link with
+  the termcap or curses library itself, allowing applications
+  which link with readline the to choose an appropriate library."
+</pre>
+If your environment has not been set up so that an appropriate library is
+automatically included, you may need to add something like
+<pre>
+  LIBS="-ncurses"
+</pre>
+immediately before the <b>configure</b> command.
+</P>
+<br><a name="SEC18" href="#TOC1">INCLUDING DEBUGGING CODE</a><br>
+<P>
+If you add
+<pre>
+  --enable-debug
+</pre>
+to the <b>configure</b> command, additional debugging code is included in the
+build. This feature is intended for use by the PCRE2 maintainers.
+</P>
+<br><a name="SEC19" href="#TOC1">DEBUGGING WITH VALGRIND SUPPORT</a><br>
+<P>
+If you add
+<pre>
+  --enable-valgrind
+</pre>
+to the <b>configure</b> command, PCRE2 will use valgrind annotations to mark
+certain memory regions as unaddressable. This allows it to detect invalid
+memory accesses, and is mostly useful for debugging PCRE2 itself.
+</P>
+<br><a name="SEC20" href="#TOC1">CODE COVERAGE REPORTING</a><br>
+<P>
+If your C compiler is gcc, you can build a version of PCRE2 that can generate a
+code coverage report for its test suite. To enable this, you must install
+<b>lcov</b> version 1.6 or above. Then specify
+<pre>
+  --enable-coverage
+</pre>
+to the <b>configure</b> command and build PCRE2 in the usual way.
+</P>
+<P>
+Note that using <b>ccache</b> (a caching C compiler) is incompatible with code
+coverage reporting. If you have configured <b>ccache</b> to run automatically
+on your system, you must set the environment variable
+<pre>
+  CCACHE_DISABLE=1
+</pre>
+before running <b>make</b> to build PCRE2, so that <b>ccache</b> is not used.
+</P>
+<P>
+When --enable-coverage is used, the following addition targets are added to the
+<i>Makefile</i>:
+<pre>
+  make coverage
+</pre>
+This creates a fresh coverage report for the PCRE2 test suite. It is equivalent
+to running "make coverage-reset", "make coverage-baseline", "make check", and
+then "make coverage-report".
+<pre>
+  make coverage-reset
+</pre>
+This zeroes the coverage counters, but does nothing else.
+<pre>
+  make coverage-baseline
+</pre>
+This captures baseline coverage information.
+<pre>
+  make coverage-report
+</pre>
+This creates the coverage report.
+<pre>
+  make coverage-clean-report
+</pre>
+This removes the generated coverage report without cleaning the coverage data
+itself.
+<pre>
+  make coverage-clean-data
+</pre>
+This removes the captured coverage data without removing the coverage files
+created at compile time (*.gcno).
+<pre>
+  make coverage-clean
+</pre>
+This cleans all coverage data including the generated coverage report. For more
+information about code coverage, see the <b>gcov</b> and <b>lcov</b>
+documentation.
+</P>
+<br><a name="SEC21" href="#TOC1">SEE ALSO</a><br>
+<P>
+<b>pcre2api</b>(3), <b>pcre2-config</b>(3).
+</P>
+<br><a name="SEC22" href="#TOC1">AUTHOR</a><br>
+<P>
+Philip Hazel
+<br>
+University Computing Service
+<br>
+Cambridge, England.
+<br>
+</P>
+<br><a name="SEC23" href="#TOC1">REVISION</a><br>
+<P>
+Last updated: 16 October 2015
+<br>
+Copyright &copy; 1997-2015 University of Cambridge.
+<br>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
diff --git a/dist2/doc/html/pcre2callout.html b/dist2/doc/html/pcre2callout.html
new file mode 100644
index 0000000..7e85c9a
--- /dev/null
+++ b/dist2/doc/html/pcre2callout.html
@@ -0,0 +1,408 @@
+<html>
+<head>
+<title>pcre2callout specification</title>
+</head>
+<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
+<h1>pcre2callout man page</h1>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
+<p>
+This page is part of the PCRE2 HTML documentation. It was generated
+automatically from the original man page. If there is any nonsense in it,
+please consult the man page, in case the conversion went wrong.
+<br>
+<ul>
+<li><a name="TOC1" href="#SEC1">SYNOPSIS</a>
+<li><a name="TOC2" href="#SEC2">DESCRIPTION</a>
+<li><a name="TOC3" href="#SEC3">MISSING CALLOUTS</a>
+<li><a name="TOC4" href="#SEC4">THE CALLOUT INTERFACE</a>
+<li><a name="TOC5" href="#SEC5">RETURN VALUES FROM CALLOUTS</a>
+<li><a name="TOC6" href="#SEC6">CALLOUT ENUMERATION</a>
+<li><a name="TOC7" href="#SEC7">AUTHOR</a>
+<li><a name="TOC8" href="#SEC8">REVISION</a>
+</ul>
+<br><a name="SEC1" href="#TOC1">SYNOPSIS</a><br>
+<P>
+<b>#include &#60;pcre2.h&#62;</b>
+</P>
+<P>
+<b>int (*pcre2_callout)(pcre2_callout_block *, void *);</b>
+<br>
+<br>
+<b>int pcre2_callout_enumerate(const pcre2_code *<i>code</i>,</b>
+<b>  int (*<i>callback</i>)(pcre2_callout_enumerate_block *, void *),</b>
+<b>  void *<i>user_data</i>);</b>
+</P>
+<br><a name="SEC2" href="#TOC1">DESCRIPTION</a><br>
+<P>
+PCRE2 provides a feature called "callout", which is a means of temporarily
+passing control to the caller of PCRE2 in the middle of pattern matching. The
+caller of PCRE2 provides an external function by putting its entry point in
+a match context (see <b>pcre2_set_callout()</b> in the
+<a href="pcre2api.html"><b>pcre2api</b></a>
+documentation).
+</P>
+<P>
+Within a regular expression, (?C&#60;arg&#62;) indicates a point at which the external
+function is to be called. Different callout points can be identified by putting
+a number less than 256 after the letter C. The default value is zero.
+Alternatively, the argument may be a delimited string. The starting delimiter
+must be one of ` ' " ^ % # $ { and the ending delimiter is the same as the
+start, except for {, where the ending delimiter is }. If the ending delimiter
+is needed within the string, it must be doubled. For example, this pattern has
+two callout points:
+<pre>
+  (?C1)abc(?C"some ""arbitrary"" text")def
+</pre>
+If the PCRE2_AUTO_CALLOUT option bit is set when a pattern is compiled, PCRE2
+automatically inserts callouts, all with number 255, before each item in the
+pattern. For example, if PCRE2_AUTO_CALLOUT is used with the pattern
+<pre>
+  A(\d{2}|--)
+</pre>
+it is processed as if it were
+<br>
+<br>
+(?C255)A(?C255)((?C255)\d{2}(?C255)|(?C255)-(?C255)-(?C255))(?C255)
+<br>
+<br>
+Notice that there is a callout before and after each parenthesis and
+alternation bar. If the pattern contains a conditional group whose condition is
+an assertion, an automatic callout is inserted immediately before the
+condition. Such a callout may also be inserted explicitly, for example:
+<pre>
+  (?(?C9)(?=a)ab|de)  (?(?C%text%)(?!=d)ab|de)
+</pre>
+This applies only to assertion conditions (because they are themselves
+independent groups).
+</P>
+<P>
+Callouts can be useful for tracking the progress of pattern matching. The
+<a href="pcre2test.html"><b>pcre2test</b></a>
+program has a pattern qualifier (/auto_callout) that sets automatic callouts.
+When any callouts are present, the output from <b>pcre2test</b> indicates how
+the pattern is being matched. This is useful information when you are trying to
+optimize the performance of a particular pattern.
+</P>
+<br><a name="SEC3" href="#TOC1">MISSING CALLOUTS</a><br>
+<P>
+You should be aware that, because of optimizations in the way PCRE2 compiles
+and matches patterns, callouts sometimes do not happen exactly as you might
+expect.
+</P>
+<br><b>
+Auto-possessification
+</b><br>
+<P>
+At compile time, PCRE2 "auto-possessifies" repeated items when it knows that
+what follows cannot be part of the repeat. For example, a+[bc] is compiled as
+if it were a++[bc]. The <b>pcre2test</b> output when this pattern is compiled
+with PCRE2_ANCHORED and PCRE2_AUTO_CALLOUT and then applied to the string
+"aaaa" is:
+<pre>
+  ---&#62;aaaa
+   +0 ^        a+
+   +2 ^   ^    [bc]
+  No match
+</pre>
+This indicates that when matching [bc] fails, there is no backtracking into a+
+and therefore the callouts that would be taken for the backtracks do not occur.
+You can disable the auto-possessify feature by passing PCRE2_NO_AUTO_POSSESS to
+<b>pcre2_compile()</b>, or starting the pattern with (*NO_AUTO_POSSESS). In this
+case, the output changes to this:
+<pre>
+  ---&#62;aaaa
+   +0 ^        a+
+   +2 ^   ^    [bc]
+   +2 ^  ^     [bc]
+   +2 ^ ^      [bc]
+   +2 ^^       [bc]
+  No match
+</pre>
+This time, when matching [bc] fails, the matcher backtracks into a+ and tries
+again, repeatedly, until a+ itself fails.
+</P>
+<br><b>
+Automatic .* anchoring
+</b><br>
+<P>
+By default, an optimization is applied when .* is the first significant item in
+a pattern. If PCRE2_DOTALL is set, so that the dot can match any character, the
+pattern is automatically anchored. If PCRE2_DOTALL is not set, a match can
+start only after an internal newline or at the beginning of the subject, and
+<b>pcre2_compile()</b> remembers this. This optimization is disabled, however,
+if .* is in an atomic group or if there is a back reference to the capturing
+group in which it appears. It is also disabled if the pattern contains (*PRUNE)
+or (*SKIP). However, the presence of callouts does not affect it.
+</P>
+<P>
+For example, if the pattern .*\d is compiled with PCRE2_AUTO_CALLOUT and
+applied to the string "aa", the <b>pcre2test</b> output is:
+<pre>
+  ---&#62;aa
+   +0 ^      .*
+   +2 ^ ^    \d
+   +2 ^^     \d
+   +2 ^      \d
+  No match
+</pre>
+This shows that all match attempts start at the beginning of the subject. In
+other words, the pattern is anchored. You can disable this optimization by
+passing PCRE2_NO_DOTSTAR_ANCHOR to <b>pcre2_compile()</b>, or starting the
+pattern with (*NO_DOTSTAR_ANCHOR). In this case, the output changes to:
+<pre>
+  ---&#62;aa
+   +0 ^      .*
+   +2 ^ ^    \d
+   +2 ^^     \d
+   +2 ^      \d
+   +0  ^     .*
+   +2  ^^    \d
+   +2  ^     \d
+  No match
+</pre>
+This shows more match attempts, starting at the second subject character.
+Another optimization, described in the next section, means that there is no
+subsequent attempt to match with an empty subject.
+</P>
+<P>
+If a pattern has more than one top-level branch, automatic anchoring occurs if
+all branches are anchorable.
+</P>
+<br><b>
+Other optimizations
+</b><br>
+<P>
+Other optimizations that provide fast "no match" results also affect callouts.
+For example, if the pattern is
+<pre>
+  ab(?C4)cd
+</pre>
+PCRE2 knows that any matching string must contain the letter "d". If the
+subject string is "abyz", the lack of "d" means that matching doesn't ever
+start, and the callout is never reached. However, with "abyd", though the
+result is still no match, the callout is obeyed.
+</P>
+<P>
+PCRE2 also knows the minimum length of a matching string, and will immediately
+give a "no match" return without actually running a match if the subject is not
+long enough, or, for unanchored patterns, if it has been scanned far enough.
+</P>
+<P>
+You can disable these optimizations by passing the PCRE2_NO_START_OPTIMIZE
+option to <b>pcre2_compile()</b>, or by starting the pattern with
+(*NO_START_OPT). This slows down the matching process, but does ensure that
+callouts such as the example above are obeyed.
+<a name="calloutinterface"></a></P>
+<br><a name="SEC4" href="#TOC1">THE CALLOUT INTERFACE</a><br>
+<P>
+During matching, when PCRE2 reaches a callout point, if an external function is
+set in the match context, it is called. This applies to both normal and DFA
+matching. The first argument to the callout function is a pointer to a
+<b>pcre2_callout</b> block. The second argument is the void * callout data that
+was supplied when the callout was set up by calling <b>pcre2_set_callout()</b>
+(see the
+<a href="pcre2api.html"><b>pcre2api</b></a>
+documentation). The callout block structure contains the following fields:
+<pre>
+  uint32_t      <i>version</i>;
+  uint32_t      <i>callout_number</i>;
+  uint32_t      <i>capture_top</i>;
+  uint32_t      <i>capture_last</i>;
+  PCRE2_SIZE   *<i>offset_vector</i>;
+  PCRE2_SPTR    <i>mark</i>;
+  PCRE2_SPTR    <i>subject</i>;
+  PCRE2_SIZE    <i>subject_length</i>;
+  PCRE2_SIZE    <i>start_match</i>;
+  PCRE2_SIZE    <i>current_position</i>;
+  PCRE2_SIZE    <i>pattern_position</i>;
+  PCRE2_SIZE    <i>next_item_length</i>;
+  PCRE2_SIZE    <i>callout_string_offset</i>;
+  PCRE2_SIZE    <i>callout_string_length</i>;
+  PCRE2_SPTR    <i>callout_string</i>;
+</pre>
+The <i>version</i> field contains the version number of the block format. The
+current version is 1; the three callout string fields were added for this
+version. If you are writing an application that might use an earlier release of
+PCRE2, you should check the version number before accessing any of these
+fields. The version number will increase in future if more fields are added,
+but the intention is never to remove any of the existing fields.
+</P>
+<br><b>
+Fields for numerical callouts
+</b><br>
+<P>
+For a numerical callout, <i>callout_string</i> is NULL, and <i>callout_number</i>
+contains the number of the callout, in the range 0-255. This is the number
+that follows (?C for manual callouts; it is 255 for automatically generated
+callouts.
+</P>
+<br><b>
+Fields for string callouts
+</b><br>
+<P>
+For callouts with string arguments, <i>callout_number</i> is always zero, and
+<i>callout_string</i> points to the string that is contained within the compiled
+pattern. Its length is given by <i>callout_string_length</i>. Duplicated ending
+delimiters that were present in the original pattern string have been turned
+into single characters, but there is no other processing of the callout string
+argument. An additional code unit containing binary zero is present after the
+string, but is not included in the length. The delimiter that was used to start
+the string is also stored within the pattern, immediately before the string
+itself. You can access this delimiter as <i>callout_string</i>[-1] if you need
+it.
+</P>
+<P>
+The <i>callout_string_offset</i> field is the code unit offset to the start of
+the callout argument string within the original pattern string. This is
+provided for the benefit of applications such as script languages that might
+need to report errors in the callout string within the pattern.
+</P>
+<br><b>
+Fields for all callouts
+</b><br>
+<P>
+The remaining fields in the callout block are the same for both kinds of
+callout.
+</P>
+<P>
+The <i>offset_vector</i> field is a pointer to the vector of capturing offsets
+(the "ovector") that was passed to the matching function in the match data
+block. When <b>pcre2_match()</b> is used, the contents can be inspected in
+order to extract substrings that have been matched so far, in the same way as
+for extracting substrings after a match has completed. For the DFA matching
+function, this field is not useful.
+</P>
+<P>
+The <i>subject</i> and <i>subject_length</i> fields contain copies of the values
+that were passed to the matching function.
+</P>
+<P>
+The <i>start_match</i> field normally contains the offset within the subject at
+which the current match attempt started. However, if the escape sequence \K
+has been encountered, this value is changed to reflect the modified starting
+point. If the pattern is not anchored, the callout function may be called
+several times from the same point in the pattern for different starting points
+in the subject.
+</P>
+<P>
+The <i>current_position</i> field contains the offset within the subject of the
+current match pointer.
+</P>
+<P>
+When the <b>pcre2_match()</b> is used, the <i>capture_top</i> field contains one
+more than the number of the highest numbered captured substring so far. If no
+substrings have been captured, the value of <i>capture_top</i> is one. This is
+always the case when the DFA functions are used, because they do not support
+captured substrings.
+</P>
+<P>
+The <i>capture_last</i> field contains the number of the most recently captured
+substring. However, when a recursion exits, the value reverts to what it was
+outside the recursion, as do the values of all captured substrings. If no
+substrings have been captured, the value of <i>capture_last</i> is 0. This is
+always the case for the DFA matching functions.
+</P>
+<P>
+The <i>pattern_position</i> field contains the offset in the pattern string to
+the next item to be matched.
+</P>
+<P>
+The <i>next_item_length</i> field contains the length of the next item to be
+matched in the pattern string. When the callout immediately precedes an
+alternation bar, a closing parenthesis, or the end of the pattern, the length
+is zero. When the callout precedes an opening parenthesis, the length is that
+of the entire subpattern.
+</P>
+<P>
+The <i>pattern_position</i> and <i>next_item_length</i> fields are intended to
+help in distinguishing between different automatic callouts, which all have the
+same callout number. However, they are set for all callouts, and are used by
+<b>pcre2test</b> to show the next item to be matched when displaying callout
+information.
+</P>
+<P>
+In callouts from <b>pcre2_match()</b> the <i>mark</i> field contains a pointer to
+the zero-terminated name of the most recently passed (*MARK), (*PRUNE), or
+(*THEN) item in the match, or NULL if no such items have been passed. Instances
+of (*PRUNE) or (*THEN) without a name do not obliterate a previous (*MARK). In
+callouts from the DFA matching function this field always contains NULL.
+</P>
+<br><a name="SEC5" href="#TOC1">RETURN VALUES FROM CALLOUTS</a><br>
+<P>
+The external callout function returns an integer to PCRE2. If the value is
+zero, matching proceeds as normal. If the value is greater than zero, matching
+fails at the current point, but the testing of other matching possibilities
+goes ahead, just as if a lookahead assertion had failed. If the value is less
+than zero, the match is abandoned, and the matching function returns the
+negative value.
+</P>
+<P>
+Negative values should normally be chosen from the set of PCRE2_ERROR_xxx
+values. In particular, PCRE2_ERROR_NOMATCH forces a standard "no match"
+failure. The error number PCRE2_ERROR_CALLOUT is reserved for use by callout
+functions; it will never be used by PCRE2 itself.
+</P>
+<br><a name="SEC6" href="#TOC1">CALLOUT ENUMERATION</a><br>
+<P>
+<b>int pcre2_callout_enumerate(const pcre2_code *<i>code</i>,</b>
+<b>  int (*<i>callback</i>)(pcre2_callout_enumerate_block *, void *),</b>
+<b>  void *<i>user_data</i>);</b>
+<br>
+<br>
+A script language that supports the use of string arguments in callouts might
+like to scan all the callouts in a pattern before running the match. This can
+be done by calling <b>pcre2_callout_enumerate()</b>. The first argument is a
+pointer to a compiled pattern, the second points to a callback function, and
+the third is arbitrary user data. The callback function is called for every
+callout in the pattern in the order in which they appear. Its first argument is
+a pointer to a callout enumeration block, and its second argument is the
+<i>user_data</i> value that was passed to <b>pcre2_callout_enumerate()</b>. The
+data block contains the following fields:
+<pre>
+  <i>version</i>                Block version number
+  <i>pattern_position</i>       Offset to next item in pattern
+  <i>next_item_length</i>       Length of next item in pattern
+  <i>callout_number</i>         Number for numbered callouts
+  <i>callout_string_offset</i>  Offset to string within pattern
+  <i>callout_string_length</i>  Length of callout string
+  <i>callout_string</i>         Points to callout string or is NULL
+</pre>
+The version number is currently 0. It will increase if new fields are ever
+added to the block. The remaining fields are the same as their namesakes in the
+<b>pcre2_callout</b> block that is used for callouts during matching, as
+described
+<a href="#calloutinterface">above.</a>
+</P>
+<P>
+Note that the value of <i>pattern_position</i> is unique for each callout.
+However, if a callout occurs inside a group that is quantified with a non-zero
+minimum or a fixed maximum, the group is replicated inside the compiled
+pattern. For example, a pattern such as /(a){2}/ is compiled as if it were
+/(a)(a)/. This means that the callout will be enumerated more than once, but
+with the same value for <i>pattern_position</i> in each case.
+</P>
+<P>
+The callback function should normally return zero. If it returns a non-zero
+value, scanning the pattern stops, and that value is returned from
+<b>pcre2_callout_enumerate()</b>.
+</P>
+<br><a name="SEC7" href="#TOC1">AUTHOR</a><br>
+<P>
+Philip Hazel
+<br>
+University Computing Service
+<br>
+Cambridge, England.
+<br>
+</P>
+<br><a name="SEC8" href="#TOC1">REVISION</a><br>
+<P>
+Last updated: 23 March 2015
+<br>
+Copyright &copy; 1997-2015 University of Cambridge.
+<br>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
diff --git a/dist2/doc/html/pcre2compat.html b/dist2/doc/html/pcre2compat.html
new file mode 100644
index 0000000..3b29e6f
--- /dev/null
+++ b/dist2/doc/html/pcre2compat.html
@@ -0,0 +1,223 @@
+<html>
+<head>
+<title>pcre2compat specification</title>
+</head>
+<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
+<h1>pcre2compat man page</h1>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
+<p>
+This page is part of the PCRE2 HTML documentation. It was generated
+automatically from the original man page. If there is any nonsense in it,
+please consult the man page, in case the conversion went wrong.
+<br>
+<br><b>
+DIFFERENCES BETWEEN PCRE2 AND PERL
+</b><br>
+<P>
+This document describes the differences in the ways that PCRE2 and Perl handle
+regular expressions. The differences described here are with respect to Perl
+versions 5.10 and above.
+</P>
+<P>
+1. PCRE2 has only a subset of Perl's Unicode support. Details of what it does
+have are given in the
+<a href="pcre2unicode.html"><b>pcre2unicode</b></a>
+page.
+</P>
+<P>
+2. PCRE2 allows repeat quantifiers only on parenthesized assertions, but they
+do not mean what you might think. For example, (?!a){3} does not assert that
+the next three characters are not "a". It just asserts that the next character
+is not "a" three times (in principle: PCRE2 optimizes this to run the assertion
+just once). Perl allows repeat quantifiers on other assertions such as \b, but
+these do not seem to have any use.
+</P>
+<P>
+3. Capturing subpatterns that occur inside negative lookahead assertions are
+counted, but their entries in the offsets vector are never set. Perl sometimes
+(but not always) sets its numerical variables from inside negative assertions.
+</P>
+<P>
+4. The following Perl escape sequences are not supported: \l, \u, \L,
+\U, and \N when followed by a character name or Unicode value. (\N on its
+own, matching a non-newline character, is supported.) In fact these are
+implemented by Perl's general string-handling and are not part of its pattern
+matching engine. If any of these are encountered by PCRE2, an error is
+generated by default. However, if the PCRE2_ALT_BSUX option is set,
+\U and \u are interpreted as ECMAScript interprets them.
+</P>
+<P>
+5. The Perl escape sequences \p, \P, and \X are supported only if PCRE2 is
+built with Unicode support. The properties that can be tested with \p and \P
+are limited to the general category properties such as Lu and Nd, script names
+such as Greek or Han, and the derived properties Any and L&. PCRE2 does support
+the Cs (surrogate) property, which Perl does not; the Perl documentation says
+"Because Perl hides the need for the user to understand the internal
+representation of Unicode characters, there is no need to implement the
+somewhat messy concept of surrogates."
+</P>
+<P>
+6. PCRE2 does support the \Q...\E escape for quoting substrings. Characters
+in between are treated as literals. This is slightly different from Perl in
+that $ and @ are also handled as literals inside the quotes. In Perl, they
+cause variable interpolation (but of course PCRE2 does not have variables).
+Note the following examples:
+<pre>
+    Pattern            PCRE2 matches      Perl matches
+
+    \Qabc$xyz\E        abc$xyz           abc followed by the contents of $xyz
+    \Qabc\$xyz\E       abc\$xyz          abc\$xyz
+    \Qabc\E\$\Qxyz\E   abc$xyz           abc$xyz
+</pre>
+The \Q...\E sequence is recognized both inside and outside character classes.
+</P>
+<P>
+7. Fairly obviously, PCRE2 does not support the (?{code}) and (??{code})
+constructions. However, there is support for recursive patterns. This is not
+available in Perl 5.8, but it is in Perl 5.10. Also, the PCRE2 "callout"
+feature allows an external function to be called during pattern matching. See
+the
+<a href="pcre2callout.html"><b>pcre2callout</b></a>
+documentation for details.
+</P>
+<P>
+8. Subroutine calls (whether recursive or not) are treated as atomic groups.
+Atomic recursion is like Python, but unlike Perl. Captured values that are set
+outside a subroutine call can be referenced from inside in PCRE2, but not in
+Perl. There is a discussion that explains these differences in more detail in
+the
+<a href="pcre2pattern.html#recursiondifference">section on recursion differences from Perl</a>
+in the
+<a href="pcre2pattern.html"><b>pcre2pattern</b></a>
+page.
+</P>
+<P>
+9. If any of the backtracking control verbs are used in a subpattern that is
+called as a subroutine (whether or not recursively), their effect is confined
+to that subpattern; it does not extend to the surrounding pattern. This is not
+always the case in Perl. In particular, if (*THEN) is present in a group that
+is called as a subroutine, its action is limited to that group, even if the
+group does not contain any | characters. Note that such subpatterns are
+processed as anchored at the point where they are tested.
+</P>
+<P>
+10. If a pattern contains more than one backtracking control verb, the first
+one that is backtracked onto acts. For example, in the pattern
+A(*COMMIT)B(*PRUNE)C a failure in B triggers (*COMMIT), but a failure in C
+triggers (*PRUNE). Perl's behaviour is more complex; in many cases it is the
+same as PCRE2, but there are examples where it differs.
+</P>
+<P>
+11. Most backtracking verbs in assertions have their normal actions. They are
+not confined to the assertion.
+</P>
+<P>
+12. There are some differences that are concerned with the settings of captured
+strings when part of a pattern is repeated. For example, matching "aba" against
+the pattern /^(a(b)?)+$/ in Perl leaves $2 unset, but in PCRE2 it is set to
+"b".
+</P>
+<P>
+13. PCRE2's handling of duplicate subpattern numbers and duplicate subpattern
+names is not as general as Perl's. This is a consequence of the fact the PCRE2
+works internally just with numbers, using an external table to translate
+between numbers and names. In particular, a pattern such as (?|(?&#60;a&#62;A)|(?&#60;b)B),
+where the two capturing parentheses have the same number but different names,
+is not supported, and causes an error at compile time. If it were allowed, it
+would not be possible to distinguish which parentheses matched, because both
+names map to capturing subpattern number 1. To avoid this confusing situation,
+an error is given at compile time.
+</P>
+<P>
+14. Perl recognizes comments in some places that PCRE2 does not, for example,
+between the ( and ? at the start of a subpattern. If the /x modifier is set,
+Perl allows white space between ( and ? (though current Perls warn that this is
+deprecated) but PCRE2 never does, even if the PCRE2_EXTENDED option is set.
+</P>
+<P>
+15. Perl, when in warning mode, gives warnings for character classes such as
+[A-\d] or [a-[:digit:]]. It then treats the hyphens as literals. PCRE2 has no
+warning features, so it gives an error in these cases because they are almost
+certainly user mistakes.
+</P>
+<P>
+16. In PCRE2, the upper/lower case character properties Lu and Ll are not
+affected when case-independent matching is specified. For example, \p{Lu}
+always matches an upper case letter. I think Perl has changed in this respect;
+in the release at the time of writing (5.16), \p{Lu} and \p{Ll} match all
+letters, regardless of case, when case independence is specified.
+</P>
+<P>
+17. PCRE2 provides some extensions to the Perl regular expression facilities.
+Perl 5.10 includes new features that are not in earlier versions of Perl, some
+of which (such as named parentheses) have been in PCRE2 for some time. This
+list is with respect to Perl 5.10:
+<br>
+<br>
+(a) Although lookbehind assertions in PCRE2 must match fixed length strings,
+each alternative branch of a lookbehind assertion can match a different length
+of string. Perl requires them all to have the same length.
+<br>
+<br>
+(b) If PCRE2_DOLLAR_ENDONLY is set and PCRE2_MULTILINE is not set, the $
+meta-character matches only at the very end of the string.
+<br>
+<br>
+(c) A backslash followed by a letter with no special meaning is faulted. (Perl
+can be made to issue a warning.)
+<br>
+<br>
+(d) If PCRE2_UNGREEDY is set, the greediness of the repetition quantifiers is
+inverted, that is, by default they are not greedy, but if followed by a
+question mark they are.
+<br>
+<br>
+(e) PCRE2_ANCHORED can be used at matching time to force a pattern to be tried
+only at the first matching position in the subject string.
+<br>
+<br>
+(f) The PCRE2_NOTBOL, PCRE2_NOTEOL, PCRE2_NOTEMPTY, PCRE2_NOTEMPTY_ATSTART, and
+PCRE2_NO_AUTO_CAPTURE options have no Perl equivalents.
+<br>
+<br>
+(g) The \R escape sequence can be restricted to match only CR, LF, or CRLF
+by the PCRE2_BSR_ANYCRLF option.
+<br>
+<br>
+(h) The callout facility is PCRE2-specific.
+<br>
+<br>
+(i) The partial matching facility is PCRE2-specific.
+<br>
+<br>
+(j) The alternative matching function (<b>pcre2_dfa_match()</b> matches in a
+different way and is not Perl-compatible.
+<br>
+<br>
+(k) PCRE2 recognizes some special sequences such as (*CR) at the start of
+a pattern that set overall options that cannot be changed within the pattern.
+</P>
+<br><b>
+AUTHOR
+</b><br>
+<P>
+Philip Hazel
+<br>
+University Computing Service
+<br>
+Cambridge, England.
+<br>
+</P>
+<br><b>
+REVISION
+</b><br>
+<P>
+Last updated: 15 March 2015
+<br>
+Copyright &copy; 1997-2015 University of Cambridge.
+<br>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
diff --git a/dist2/doc/html/pcre2demo.html b/dist2/doc/html/pcre2demo.html
new file mode 100644
index 0000000..5919117
--- /dev/null
+++ b/dist2/doc/html/pcre2demo.html
@@ -0,0 +1,443 @@
+<html>
+<head>
+<title>pcre2demo specification</title>
+</head>
+<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
+<h1>pcre2demo man page</h1>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
+<p>
+This page is part of the PCRE2 HTML documentation. It was generated
+automatically from the original man page. If there is any nonsense in it,
+please consult the man page, in case the conversion went wrong.
+<br>
+<ul>
+</ul>
+<PRE>
+/*************************************************
+*           PCRE2 DEMONSTRATION PROGRAM          *
+*************************************************/
+
+/* This is a demonstration program to illustrate a straightforward way of
+calling the PCRE2 regular expression library from a C program. See the
+pcre2sample documentation for a short discussion ("man pcre2sample" if you have
+the PCRE2 man pages installed). PCRE2 is a revised API for the library, and is
+incompatible with the original PCRE API.
+
+There are actually three libraries, each supporting a different code unit
+width. This demonstration program uses the 8-bit library.
+
+In Unix-like environments, if PCRE2 is installed in your standard system
+libraries, you should be able to compile this program using this command:
+
+gcc -Wall pcre2demo.c -lpcre2-8 -o pcre2demo
+
+If PCRE2 is not installed in a standard place, it is likely to be installed
+with support for the pkg-config mechanism. If you have pkg-config, you can
+compile this program using this command:
+
+gcc -Wall pcre2demo.c `pkg-config --cflags --libs libpcre2-8` -o pcre2demo
+
+If you do not have pkg-config, you may have to use this:
+
+gcc -Wall pcre2demo.c -I/usr/local/include -L/usr/local/lib \
+  -R/usr/local/lib -lpcre2-8 -o pcre2demo
+
+Replace "/usr/local/include" and "/usr/local/lib" with wherever the include and
+library files for PCRE2 are installed on your system. Only some operating
+systems (Solaris is one) use the -R option.
+
+Building under Windows:
+
+If you want to statically link this program against a non-dll .a file, you must
+define PCRE2_STATIC before including pcre2.h, so in this environment, uncomment
+the following line. */
+
+/* #define PCRE2_STATIC */
+
+/* This macro must be defined before including pcre2.h. For a program that uses
+only one code unit width, it makes it possible to use generic function names
+such as pcre2_compile(). */
+
+#define PCRE2_CODE_UNIT_WIDTH 8
+
+#include &lt;stdio.h&gt;
+#include &lt;string.h&gt;
+#include &lt;pcre2.h&gt;
+
+
+/**************************************************************************
+* Here is the program. The API includes the concept of "contexts" for     *
+* setting up unusual interface requirements for compiling and matching,   *
+* such as custom memory managers and non-standard newline definitions.    *
+* This program does not do any of this, so it makes no use of contexts,   *
+* always passing NULL where a context could be given.                     *
+**************************************************************************/
+
+int main(int argc, char **argv)
+{
+pcre2_code *re;
+PCRE2_SPTR pattern;     /* PCRE2_SPTR is a pointer to unsigned code units of */
+PCRE2_SPTR subject;     /* the appropriate width (8, 16, or 32 bits). */
+PCRE2_SPTR name_table;
+
+int crlf_is_newline;
+int errornumber;
+int find_all;
+int i;
+int namecount;
+int name_entry_size;
+int rc;
+int utf8;
+
+uint32_t option_bits;
+uint32_t newline;
+
+PCRE2_SIZE erroroffset;
+PCRE2_SIZE *ovector;
+
+size_t subject_length;
+pcre2_match_data *match_data;
+
+
+
+/**************************************************************************
+* 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 &lt; argc; i++)
+  {
+  if (strcmp(argv[i], "-g") == 0) find_all = 1;
+    else break;
+  }
+
+/* After the options, we require exactly two arguments, which are the pattern,
+and the subject string. */
+
+if (argc - i != 2)
+  {
+  printf("Two arguments required: a regex and a subject string\n");
+  return 1;
+  }
+
+/* As pattern and subject are char arguments, they can be straightforwardly
+cast to PCRE2_SPTR as we are working in 8-bit code units. */
+
+pattern = (PCRE2_SPTR)argv[i];
+subject = (PCRE2_SPTR)argv[i+1];
+subject_length = strlen((char *)subject);
+
+
+/*************************************************************************
+* Now we are going to compile the regular expression pattern, and handle *
+* any errors that are detected.                                          *
+*************************************************************************/
+
+re = pcre2_compile(
+  pattern,               /* the pattern */
+  PCRE2_ZERO_TERMINATED, /* indicates pattern is zero-terminated */
+  0,                     /* default options */
+  &amp;errornumber,          /* for error number */
+  &amp;erroroffset,          /* for error offset */
+  NULL);                 /* use default compile context */
+
+/* Compilation failed: print the error message and exit. */
+
+if (re == NULL)
+  {
+  PCRE2_UCHAR buffer[256];
+  pcre2_get_error_message(errornumber, buffer, sizeof(buffer));
+  printf("PCRE2 compilation failed at offset %d: %s\n", (int)erroroffset,
+    buffer);
+  return 1;
+  }
+
+
+/*************************************************************************
+* If the compilation succeeded, we call PCRE again, in order to do a     *
+* pattern match against the subject string. This does just ONE match. If *
+* further matching is needed, it will be done below. Before running the  *
+* match we must set up a match_data block for holding the result.        *
+*************************************************************************/
+
+/* Using this function ensures that the block is exactly the right size for
+the number of capturing parentheses in the pattern. */
+
+match_data = pcre2_match_data_create_from_pattern(re, NULL);
+
+rc = pcre2_match(
+  re,                   /* the compiled pattern */
+  subject,              /* the subject string */
+  subject_length,       /* the length of the subject */
+  0,                    /* start at offset 0 in the subject */
+  0,                    /* default options */
+  match_data,           /* block for storing the result */
+  NULL);                /* use default match context */
+
+/* Matching failed: handle error cases */
+
+if (rc &lt; 0)
+  {
+  switch(rc)
+    {
+    case PCRE2_ERROR_NOMATCH: printf("No match\n"); break;
+    /*
+    Handle other special cases if you like
+    */
+    default: printf("Matching error %d\n", rc); break;
+    }
+  pcre2_match_data_free(match_data);   /* Release memory used for the match */
+  pcre2_code_free(re);                 /* data and the compiled pattern. */
+  return 1;
+  }
+
+/* Match succeded. Get a pointer to the output vector, where string offsets are
+stored. */
+
+ovector = pcre2_get_ovector_pointer(match_data);
+printf("\nMatch succeeded at offset %d\n", (int)ovector[0]);
+
+
+/*************************************************************************
+* We have found the first match within the subject string. If the output *
+* vector wasn't big enough, say so. Then output any substrings that were *
+* captured.                                                              *
+*************************************************************************/
+
+/* The output vector wasn't big enough. This should not happen, because we used
+pcre2_match_data_create_from_pattern() above. */
+
+if (rc == 0)
+  printf("ovector was not big enough for all the captured substrings\n");
+
+/* Show substrings stored in the output vector by number. Obviously, in a real
+application you might want to do things other than print them. */
+
+for (i = 0; i &lt; rc; i++)
+  {
+  PCRE2_SPTR substring_start = subject + ovector[2*i];
+  size_t substring_length = ovector[2*i+1] - ovector[2*i];
+  printf("%2d: %.*s\n", i, (int)substring_length, (char *)substring_start);
+  }
+
+
+/**************************************************************************
+* That concludes the basic part of this demonstration program. We have    *
+* compiled a pattern, and performed a single match. The code that follows *
+* shows first 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. */
+
+(void)pcre2_pattern_info(
+  re,                   /* the compiled pattern */
+  PCRE2_INFO_NAMECOUNT, /* get the number of named substrings */
+  &amp;namecount);          /* where to put the answer */
+
+if (namecount &lt;= 0) printf("No named substrings\n"); else
+  {
+  PCRE2_SPTR tabptr;
+  printf("Named substrings\n");
+
+  /* Before we can access the substrings, we must extract the table for
+  translating names to numbers, and the size of each entry in the table. */
+
+  (void)pcre2_pattern_info(
+    re,                       /* the compiled pattern */
+    PCRE2_INFO_NAMETABLE,     /* address of the table */
+    &amp;name_table);             /* where to put the answer */
+
+  (void)pcre2_pattern_info(
+    re,                       /* the compiled pattern */
+    PCRE2_INFO_NAMEENTRYSIZE, /* size of each entry in the table */
+    &amp;name_entry_size);        /* where to put the answer */
+
+  /* Now we can scan the table and, for each entry, print the number, the name,
+  and the substring itself. In the 8-bit library the number is held in two
+  bytes, most significant first. */
+
+  tabptr = name_table;
+  for (i = 0; i &lt; namecount; i++)
+    {
+    int n = (tabptr[0] &lt;&lt; 8) | tabptr[1];
+    printf("(%d) %*s: %.*s\n", n, name_entry_size - 3, tabptr + 2,
+      (int)(ovector[2*n+1] - ovector[2*n]), subject + ovector[2*n]);
+    tabptr += name_entry_size;
+    }
+  }
+
+
+/*************************************************************************
+* If the "-g" option was given on the command line, we want to continue  *
+* to search for additional matches in the subject string, in a similar   *
+* way to the /g option in Perl. This turns out to be trickier than you   *
+* might think because of the possibility of matching an empty string.    *
+* What happens is as follows:                                            *
+*                                                                        *
+* If the previous match was NOT for an empty string, we can just start   *
+* the next match at the end of the previous one.                         *
+*                                                                        *
+* If the previous match WAS for an empty string, we can't do that, as it *
+* would lead to an infinite loop. Instead, a call of pcre2_match() is    *
+* made with the PCRE2_NOTEMPTY_ATSTART and PCRE2_ANCHORED flags set. The *
+* first of these tells PCRE2 that an empty string at the start of the    *
+* subject is not a valid match; other possibilities must be tried. The   *
+* second flag restricts PCRE2 to one match attempt at the initial string *
+* position. If this match succeeds, an alternative to the empty string   *
+* match has been found, and we can print it and proceed round the loop,  *
+* advancing by the length of whatever was found. If this match does not  *
+* succeed, we still stay in the loop, advancing by just one character.   *
+* In UTF-8 mode, which can be set by (*UTF) in the pattern, this may be  *
+* more than one byte.                                                    *
+*                                                                        *
+* However, there is a complication concerned with newlines. When the     *
+* newline convention is such that CRLF is a valid newline, we must       *
+* advance by two characters rather than one. The newline convention can  *
+* be set in the regex by (*CR), etc.; if not, we must find the default.  *
+*************************************************************************/
+
+if (!find_all)     /* Check for -g */
+  {
+  pcre2_match_data_free(match_data);  /* Release the memory that was used */
+  pcre2_code_free(re);                /* for the match data and the pattern. */
+  return 0;                           /* Exit the program. */
+  }
+
+/* Before running the loop, check for UTF-8 and whether CRLF is a valid newline
+sequence. First, find the options with which the regex was compiled and extract
+the UTF state. */
+
+(void)pcre2_pattern_info(re, PCRE2_INFO_ALLOPTIONS, &amp;option_bits);
+utf8 = (option_bits &amp; PCRE2_UTF) != 0;
+
+/* Now find the newline convention and see whether CRLF is a valid newline
+sequence. */
+
+(void)pcre2_pattern_info(re, PCRE2_INFO_NEWLINE, &amp;newline);
+crlf_is_newline = newline == PCRE2_NEWLINE_ANY ||
+                  newline == PCRE2_NEWLINE_CRLF ||
+                  newline == PCRE2_NEWLINE_ANYCRLF;
+
+/* Loop for second and subsequent matches */
+
+for (;;)
+  {
+  uint32_t options = 0;                    /* Normally no options */
+  PCRE2_SIZE start_offset = ovector[1];  /* Start at end of previous match */
+
+  /* If the previous match was for an empty string, we are finished if we are
+  at the end of the subject. Otherwise, arrange to run another match at the
+  same point to see if a non-empty match can be found. */
+
+  if (ovector[0] == ovector[1])
+    {
+    if (ovector[0] == subject_length) break;
+    options = PCRE2_NOTEMPTY_ATSTART | PCRE2_ANCHORED;
+    }
+
+  /* Run the next matching operation */
+
+  rc = pcre2_match(
+    re,                   /* the compiled pattern */
+    subject,              /* the subject string */
+    subject_length,       /* the length of the subject */
+    start_offset,         /* starting offset in the subject */
+    options,              /* options */
+    match_data,           /* block for storing the result */
+    NULL);                /* use default match context */
+
+  /* This time, a result of NOMATCH isn't an error. If the value in "options"
+  is zero, it just means we have found all possible matches, so the loop ends.
+  Otherwise, it means we have failed to find a non-empty-string match at a
+  point where there was a previous empty-string match. In this case, we do what
+  Perl does: advance the matching position by one character, and continue. We
+  do this by setting the "end of previous match" offset, because that is picked
+  up at the top of the loop as the point at which to start again.
+
+  There are two complications: (a) When CRLF is a valid newline sequence, and
+  the current position is just before it, advance by an extra byte. (b)
+  Otherwise we must ensure that we skip an entire UTF character if we are in
+  UTF mode. */
+
+  if (rc == PCRE2_ERROR_NOMATCH)
+    {
+    if (options == 0) break;                    /* All matches found */
+    ovector[1] = start_offset + 1;              /* Advance one code unit */
+    if (crlf_is_newline &amp;&amp;                      /* If CRLF is newline &amp; */
+        start_offset &lt; subject_length - 1 &amp;&amp;    /* we are at CRLF, */
+        subject[start_offset] == '\r' &amp;&amp;
+        subject[start_offset + 1] == '\n')
+      ovector[1] += 1;                          /* Advance by one more. */
+    else if (utf8)                              /* Otherwise, ensure we */
+      {                                         /* advance a whole UTF-8 */
+      while (ovector[1] &lt; subject_length)       /* character. */
+        {
+        if ((subject[ovector[1]] &amp; 0xc0) != 0x80) break;
+        ovector[1] += 1;
+        }
+      }
+    continue;    /* Go round the loop again */
+    }
+
+  /* Other matching errors are not recoverable. */
+
+  if (rc &lt; 0)
+    {
+    printf("Matching error %d\n", rc);
+    pcre2_match_data_free(match_data);
+    pcre2_code_free(re);
+    return 1;
+    }
+
+  /* Match succeded */
+
+  printf("\nMatch succeeded again at offset %d\n", (int)ovector[0]);
+
+  /* The match succeeded, but the output vector wasn't big enough. This
+  should not happen. */
+
+  if (rc == 0)
+    printf("ovector was not big enough for all the captured substrings\n");
+
+  /* As before, show substrings stored in the output vector by number, and then
+  also any named substrings. */
+
+  for (i = 0; i &lt; rc; i++)
+    {
+    PCRE2_SPTR substring_start = subject + ovector[2*i];
+    size_t substring_length = ovector[2*i+1] - ovector[2*i];
+    printf("%2d: %.*s\n", i, (int)substring_length, (char *)substring_start);
+    }
+
+  if (namecount &lt;= 0) printf("No named substrings\n"); else
+    {
+    PCRE2_SPTR tabptr = name_table;
+    printf("Named substrings\n");
+    for (i = 0; i &lt; namecount; i++)
+      {
+      int n = (tabptr[0] &lt;&lt; 8) | tabptr[1];
+      printf("(%d) %*s: %.*s\n", n, name_entry_size - 3, tabptr + 2,
+        (int)(ovector[2*n+1] - ovector[2*n]), subject + ovector[2*n]);
+      tabptr += name_entry_size;
+      }
+    }
+  }      /* End of loop to find second and subsequent matches */
+
+printf("\n");
+pcre2_match_data_free(match_data);
+pcre2_code_free(re);
+return 0;
+}
+
+/* End of pcre2demo.c */
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
diff --git a/dist/doc/html/pcregrep.html b/dist2/doc/html/pcre2grep.html
similarity index 77%
rename from dist/doc/html/pcregrep.html
rename to dist2/doc/html/pcre2grep.html
index dacbb49..dcfb96f 100644
--- a/dist/doc/html/pcregrep.html
+++ b/dist2/doc/html/pcre2grep.html
@@ -1,16 +1,16 @@
 <html>
 <head>
-<title>pcregrep specification</title>
+<title>pcre2grep specification</title>
 </head>
 <body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
-<h1>pcregrep man page</h1>
+<h1>pcre2grep man page</h1>
 <p>
-Return to the <a href="index.html">PCRE index page</a>.
+Return to the <a href="index.html">PCRE2 index page</a>.
 </p>
 <p>
-This page is part of the PCRE HTML documentation. It was generated automatically
-from the original man page. If there is any nonsense in it, please consult the
-man page, in case the conversion went wrong.
+This page is part of the PCRE2 HTML documentation. It was generated
+automatically from the original man page. If there is any nonsense in it,
+please consult the man page, in case the conversion went wrong.
 <br>
 <ul>
 <li><a name="TOC1" href="#SEC1">SYNOPSIS</a>
@@ -30,24 +30,24 @@
 </ul>
 <br><a name="SEC1" href="#TOC1">SYNOPSIS</a><br>
 <P>
-<b>pcregrep [options] [long options] [pattern] [path1 path2 ...]</b>
+<b>pcre2grep [options] [long options] [pattern] [path1 path2 ...]</b>
 </P>
 <br><a name="SEC2" href="#TOC1">DESCRIPTION</a><br>
 <P>
-<b>pcregrep</b> searches files for character patterns, in the same way as other
-grep commands do, but it uses the PCRE regular expression library to support
+<b>pcre2grep</b> searches files for character patterns, in the same way as other
+grep commands do, but it uses the PCRE2 regular expression library to support
 patterns that are compatible with the regular expressions of Perl 5. See
-<a href="pcresyntax.html"><b>pcresyntax</b>(3)</a>
+<a href="pcre2syntax.html"><b>pcre2syntax</b>(3)</a>
 for a quick-reference summary of pattern syntax, or
-<a href="pcrepattern.html"><b>pcrepattern</b>(3)</a>
+<a href="pcre2pattern.html"><b>pcre2pattern</b>(3)</a>
 for a full description of the syntax and semantics of the regular expressions
-that PCRE supports.
+that PCRE2 supports.
 </P>
 <P>
 Patterns, whether supplied on the command line or in a separate file, are given
 without delimiters. For example:
 <pre>
-  pcregrep Thursday /etc/motd
+  pcre2grep Thursday /etc/motd
 </pre>
 If you attempt to use delimiters (for example, by surrounding a pattern with
 slashes, as is common in Perl scripts), they are interpreted as part of the
@@ -63,26 +63,27 @@
 argument pattern must be provided.
 </P>
 <P>
-If no files are specified, <b>pcregrep</b> reads the standard input. The
+If no files are specified, <b>pcre2grep</b> reads the standard input. The
 standard input can also be referenced by a name consisting of a single hyphen.
 For example:
 <pre>
-  pcregrep some-pattern /file1 - /file3
+  pcre2grep some-pattern file1 - file3
 </pre>
-By default, each line that matches a pattern is copied to the standard
-output, and if there is more than one file, the file name is output at the
-start of each line, followed by a colon. However, there are options that can
-change how <b>pcregrep</b> behaves. In particular, the <b>-M</b> option makes it
-possible to search for patterns that span line boundaries. What defines a line
-boundary is controlled by the <b>-N</b> (<b>--newline</b>) option.
+Input files are searched line by line. By default, each line that matches a
+pattern is copied to the standard output, and if there is more than one file,
+the file name is output at the start of each line, followed by a colon.
+However, there are options that can change how <b>pcre2grep</b> behaves. In
+particular, the <b>-M</b> option makes it possible to search for strings that
+span line boundaries. What defines a line boundary is controlled by the
+<b>-N</b> (<b>--newline</b>) option.
 </P>
 <P>
 The amount of memory used for buffering files that are being scanned is
 controlled by a parameter that can be set by the <b>--buffer-size</b> option.
-The default value for this parameter is specified when <b>pcregrep</b> is built,
-with the default default being 20K. A block of memory three times this size is
-used (to allow for buffering "before" and "after" lines). An error occurs if a
-line overflows the buffer.
+The default value for this parameter is specified when <b>pcre2grep</b> is
+built, with the default default being 20K. A block of memory three times this
+size is used (to allow for buffering "before" and "after" lines). An error
+occurs if a line overflows the buffer.
 </P>
 <P>
 Patterns can be no longer than 8K or BUFSIZ bytes, whichever is the greater.
@@ -117,12 +118,12 @@
 </P>
 <P>
 If the <b>LC_ALL</b> or <b>LC_CTYPE</b> environment variable is set,
-<b>pcregrep</b> uses the value to set a locale when calling the PCRE library.
+<b>pcre2grep</b> uses the value to set a locale when calling the PCRE2 library.
 The <b>--locale</b> option can be used to override this.
 </P>
 <br><a name="SEC3" href="#TOC1">SUPPORT FOR COMPRESSED FILES</a><br>
 <P>
-It is possible to compile <b>pcregrep</b> so that it uses <b>libz</b> or
+It is possible to compile <b>pcre2grep</b> so that it uses <b>libz</b> or
 <b>libbz2</b> to read files whose names end in <b>.gz</b> or <b>.bz2</b>,
 respectively. You can find out whether your binary has support for one or both
 of these file types by running it with the <b>--help</b> option. If the
@@ -149,15 +150,15 @@
 <b>--</b>
 This terminates the list of options. It is useful if the next item on the
 command line starts with a hyphen but is not an option. This allows for the
-processing of patterns and filenames that start with hyphens.
+processing of patterns and file names that start with hyphens.
 </P>
 <P>
 <b>-A</b> <i>number</i>, <b>--after-context=</b><i>number</i>
-Output <i>number</i> lines of context after each matching line. If filenames
+Output <i>number</i> lines of context after each matching line. If file names
 and/or line numbers are being output, a hyphen separator is used instead of a
 colon for the context lines. A line containing "--" is output between each
 group of lines, unless they are in fact contiguous in the input file. The value
-of <i>number</i> is expected to be relatively small. However, <b>pcregrep</b>
+of <i>number</i> is expected to be relatively small. However, <b>pcre2grep</b>
 guarantees to have up to 8K of following text available for context output.
 </P>
 <P>
@@ -167,11 +168,11 @@
 </P>
 <P>
 <b>-B</b> <i>number</i>, <b>--before-context=</b><i>number</i>
-Output <i>number</i> lines of context before each matching line. If filenames
+Output <i>number</i> lines of context before each matching line. If file names
 and/or line numbers are being output, a hyphen separator is used instead of a
 colon for the context lines. A line containing "--" is output between each
 group of lines, unless they are in fact contiguous in the input file. The value
-of <i>number</i> is expected to be relatively small. However, <b>pcregrep</b>
+of <i>number</i> is expected to be relatively small. However, <b>pcre2grep</b>
 guarantees to have up to 8K of preceding text available for context output.
 </P>
 <P>
@@ -184,7 +185,8 @@
 succeeds, the output may be binary garbage, which can have nasty effects if
 sent to a terminal. If the word is "without-match", which is equivalent to the
 <b>-I</b> option, binary files are not processed at all; they are assumed not to
-be of interest.
+be of interest and are skipped without causing any output or affecting the
+return code.
 </P>
 <P>
 <b>--buffer-size=</b><i>number</i>
@@ -198,10 +200,15 @@
 </P>
 <P>
 <b>-c</b>, <b>--count</b>
-Do not output individual lines from the files that are being scanned; instead
-output the number of lines that would otherwise have been shown. If no lines
-are selected, the number zero is output. If several files are are being
-scanned, a count is output for each of them. However, if the
+Do not output lines from the files that are being scanned; instead output the
+number of matches (or non-matches if <b>-v</b> is used) that would otherwise
+have caused lines to be shown. By default, this count is the same as the number
+of suppressed lines, but if the <b>-M</b> (multiline) option is used (without
+<b>-v</b>), there may be more suppressed lines than the number of matches.
+<br>
+<br>
+If no lines are selected, the number zero is output. If several files are are
+being scanned, a count is output for each of them. However, if the
 <b>--files-with-matches</b> option is also used, only those files whose counts
 are greater than zero are listed. When <b>-c</b> is used, the <b>-A</b>,
 <b>-B</b>, and <b>-C</b> options are ignored.
@@ -219,12 +226,12 @@
 coloured. The value (which is optional, see above) may be "never", "always", or
 "auto". In the latter case, colouring happens only if the standard output is
 connected to a terminal. More resources are used when colouring is enabled,
-because <b>pcregrep</b> has to search for all possible matches in a line, not
+because <b>pcre2grep</b> has to search for all possible matches in a line, not
 just one, in order to colour them all.
 <br>
 <br>
 The colour that is used can be specified by setting the environment variable
-PCREGREP_COLOUR or PCREGREP_COLOR. The value of this variable should be a
+PCRE2GREP_COLOUR or PCRE2GREP_COLOR. The value of this variable should be a
 string of two numbers, separated by a semicolon. They are copied directly into
 the control string for setting colour on a terminal, so it is your
 responsibility to ensure that they make sense. If neither of the environment
@@ -261,7 +268,7 @@
 these options are specified. Note that multiple use of <b>-e</b> is not the same
 as a single pattern with alternatives. For example, X|Y finds the first
 character in a line that is X or Y, whereas if the two patterns are given
-separately, with X first, <b>pcregrep</b> finds X if it is present, even if it
+separately, with X first, <b>pcre2grep</b> finds X if it is present, even if it
 follows Y in the line. It finds Y only if there is no X in the line. This
 matters only if you are using <b>-o</b> or <b>--colo(u)r</b> to show the part(s)
 of the line that matched.
@@ -271,10 +278,10 @@
 Files (but not directories) whose names match the pattern are skipped without
 being processed. This applies to all files, whether listed on the command line,
 obtained from <b>--file-list</b>, or by scanning a directory. The pattern is a
-PCRE regular expression, and is matched against the final component of the file
-name, not the entire path. The <b>-F</b>, <b>-w</b>, and <b>-x</b> options do not
-apply to this pattern. The option may be given any number of times in order to
-specify multiple patterns. If a file name matches both an <b>--include</b>
+PCRE2 regular expression, and is matched against the final component of the
+file name, not the entire path. The <b>-F</b>, <b>-w</b>, and <b>-x</b> options do
+not apply to this pattern. The option may be given any number of times in order
+to specify multiple patterns. If a file name matches both an <b>--include</b>
 and an <b>--exclude</b> pattern, it is excluded. There is no short form for this
 option.
 </P>
@@ -291,7 +298,7 @@
 Directories whose names match the pattern are skipped without being processed,
 whatever the setting of the <b>--recursive</b> option. This applies to all
 directories, whether listed on the command line, obtained from
-<b>--file-list</b>, or by scanning a parent directory. The pattern is a PCRE
+<b>--file-list</b>, or by scanning a parent directory. The pattern is a PCRE2
 regular expression, and is matched against the final component of the directory
 name, not the entire path. The <b>-F</b>, <b>-w</b>, and <b>-x</b> options do not
 apply to this pattern. The option may be given any number of times in order to
@@ -323,7 +330,7 @@
 <br>
 <br>
 If this option is given more than once, all the specified files are
-read. A data line is output if any of the patterns match it. A filename can
+read. A data line is output if any of the patterns match it. A file name can
 be given as "-" to refer to the standard input. When <b>-f</b> is used, patterns
 specified on the command line using <b>-e</b> may also be present; they are
 tested before the file's patterns. However, no other pattern is taken from the
@@ -334,7 +341,7 @@
 Read a list of files and/or directories that are to be scanned from the given
 file, one per line. Trailing white space is removed from each line, and blank
 lines are ignored. These paths are processed before any that are listed on the
-command line. The filename can be given as "-" to refer to the standard input.
+command line. The file name can be given as "-" to refer to the standard input.
 If <b>--file</b> and <b>--file-list</b> are both specified as "-", patterns are
 read first. This is useful only when the standard input is a terminal, from
 which further lines (the list of files) can be read after an end-of-file
@@ -352,17 +359,18 @@
 </P>
 <P>
 <b>-H</b>, <b>--with-filename</b>
-Force the inclusion of the filename at the start of output lines when searching
-a single file. By default, the filename is not shown in this case. For matching
-lines, the filename is followed by a colon; for context lines, a hyphen
-separator is used. If a line number is also being output, it follows the file
-name.
+Force the inclusion of the file name at the start of output lines when
+searching a single file. By default, the file name is not shown in this case.
+For matching lines, the file name is followed by a colon; for context lines, a
+hyphen separator is used. If a line number is also being output, it follows the
+file name. When the <b>-M</b> option causes a pattern to match more than one
+line, only the first is preceded by the file name.
 </P>
 <P>
 <b>-h</b>, <b>--no-filename</b>
-Suppress the output filenames when searching multiple files. By default,
-filenames are shown when multiple files are searched. For matching lines, the
-filename is followed by a colon; for context lines, a hyphen separator is used.
+Suppress the output file names when searching multiple files. By default,
+file names are shown when multiple files are searched. For matching lines, the
+file name is followed by a colon; for context lines, a hyphen separator is used.
 If a line number is also being output, it follows the file name.
 </P>
 <P>
@@ -373,7 +381,7 @@
 </P>
 <P>
 <b>-I</b>
-Treat binary files as never matching. This is equivalent to
+Ignore binary files. This is equivalent to
 <b>--binary-files</b>=<i>without-match</i>.
 </P>
 <P>
@@ -386,7 +394,7 @@
 processed are those that match one of the patterns (and do not match an
 <b>--exclude</b> pattern). This option does not affect directories, but it
 applies to all files, whether listed on the command line, obtained from
-<b>--file-list</b>, or by scanning a directory. The pattern is a PCRE regular
+<b>--file-list</b>, or by scanning a directory. The pattern is a PCRE2 regular
 expression, and is matched against the final component of the file name, not
 the entire path. The <b>-F</b>, <b>-w</b>, and <b>-x</b> options do not apply to
 this pattern. The option may be given any number of times. If a file name
@@ -406,8 +414,8 @@
 are processed are those that match one of the patterns (and do not match an
 <b>--exclude-dir</b> pattern). This applies to all directories, whether listed
 on the command line, obtained from <b>--file-list</b>, or by scanning a parent
-directory. The pattern is a PCRE regular expression, and is matched against the
-final component of the directory name, not the entire path. The <b>-F</b>,
+directory. The pattern is a PCRE2 regular expression, and is matched against
+the final component of the directory name, not the entire path. The <b>-F</b>,
 <b>-w</b>, and <b>-x</b> options do not apply to this pattern. The option may be
 given any number of times. If a directory matches both <b>--include-dir</b> and
 <b>--exclude-dir</b>, it is excluded. There is no short form for this option.
@@ -438,12 +446,12 @@
 <b>--line-buffered</b>
 When this option is given, input is read and processed line by line, and the
 output is flushed after each write. By default, input is read in large chunks,
-unless <b>pcregrep</b> can determine that it is reading from a terminal (which
+unless <b>pcre2grep</b> can determine that it is reading from a terminal (which
 is currently possible only in Unix-like environments). Output to terminal is
 normally automatically flushed by the operating system. This option can be
 useful when the input or output is attached to a pipe and you do not want
-<b>pcregrep</b> to buffer up large amounts of data. However, its use will affect
-performance, and the <b>-M</b> (multiline) option ceases to work.
+<b>pcre2grep</b> to buffer up large amounts of data. However, its use will
+affect performance, and the <b>-M</b> (multiline) option ceases to work.
 </P>
 <P>
 <b>--line-offsets</b>
@@ -459,7 +467,7 @@
 <b>--locale</b>=<i>locale-name</i>
 This option specifies a locale to be used for pattern matching. It overrides
 the value in the <b>LC_ALL</b> or <b>LC_CTYPE</b> environment variables. If no
-locale is specified, the PCRE library's default (usually the "C" locale) is
+locale is specified, the PCRE2 library's default (usually the "C" locale) is
 used. There is no short form for this option.
 </P>
 <P>
@@ -467,14 +475,14 @@
 Processing some regular expression patterns can require a very large amount of
 memory, leading in some cases to a program crash if not enough is available.
 Other patterns may take a very long time to search for all possible matching
-strings. The <b>pcre_exec()</b> function that is called by <b>pcregrep</b> to do
-the matching has two parameters that can limit the resources that it uses.
+strings. The <b>pcre2_match()</b> function that is called by <b>pcre2grep</b> to
+do the matching has two parameters that can limit the resources that it uses.
 <br>
 <br>
 The <b>--match-limit</b> option provides a means of limiting resource usage
 when processing patterns that are not going to match, but which have a very
 large number of possibilities in their search trees. The classic example is a
-pattern that uses nested unlimited repeats. Internally, PCRE uses a function
+pattern that uses nested unlimited repeats. Internally, PCRE2 uses a function
 called <b>match()</b> which it calls repeatedly (sometimes recursively). The
 limit set by <b>--match-limit</b> is imposed on the number of times this
 function is called during a match, which has the effect of limiting the amount
@@ -490,29 +498,44 @@
 <br>
 <br>
 There are no short forms for these options. The default settings are specified
-when the PCRE library is compiled, with the default default being 10 million.
+when the PCRE2 library is compiled, with the default default being 10 million.
 </P>
 <P>
 <b>-M</b>, <b>--multiline</b>
 Allow patterns to match more than one line. When this option is given, patterns
 may usefully contain literal newline characters and internal occurrences of ^
 and $ characters. The output for a successful match may consist of more than
-one line, the last of which is the one in which the match ended. If the matched
-string ends with a newline sequence the output ends at the end of that line.
+one line. The first is the line in which the match started, and the last is the
+line in which the match ended. If the matched string ends with a newline
+sequence the output ends at the end of that line.
 <br>
 <br>
-When this option is set, the PCRE library is called in "multiline" mode.
+When this option is set, the PCRE2 library is called in "multiline" mode.
+However, <b>pcre2grep</b> still processes the input line by line. The difference
+is that a matched string may extend past the end of a line and continue on
+one or more subsequent lines. The newline sequence must be matched as part of
+the pattern. For example, to find the phrase "regular expression" in a file
+where "regular" might be at the end of a line and "expression" at the start of
+the next line, you could use this command:
+<pre>
+  pcre2grep -M 'regular\s+expression' &#60;file&#62;
+</pre>
+The \s escape sequence matches any white space character, including newlines,
+and is followed by + so as to match trailing white space on the first line as
+well as possibly handling a two-character newline sequence.
+<br>
+<br>
 There is a limit to the number of lines that can be matched, imposed by the way
-that <b>pcregrep</b> buffers the input file as it scans it. However,
-<b>pcregrep</b> ensures that at least 8K characters or the rest of the document
+that <b>pcre2grep</b> buffers the input file as it scans it. However,
+<b>pcre2grep</b> ensures that at least 8K characters or the rest of the file
 (whichever is the shorter) are available for forward matching, and similarly
 the previous 8K characters (or all the previous characters, if fewer than 8K)
-are guaranteed to be available for lookbehind assertions. This option does not
-work when input is read line by line (see \fP--line-buffered\fP.)
+are guaranteed to be available for lookbehind assertions. The <b>-M</b> option
+does not work when input is read line by line (see \fP--line-buffered\fP.)
 </P>
 <P>
 <b>-N</b> <i>newline-type</i>, <b>--newline</b>=<i>newline-type</i>
-The PCRE library supports five different conventions for indicating
+The PCRE2 library supports five different conventions for indicating
 the ends of lines. They are the single-character sequences CR (carriage return)
 and LF (linefeed), the two-character sequence CRLF, an "anycrlf" convention,
 which recognizes any of the preceding three types, and an "any" convention, in
@@ -522,14 +545,14 @@
 PS (paragraph separator, U+2029).
 <br>
 <br>
-When the PCRE library is built, a default line-ending sequence is specified.
+When the PCRE2 library is built, a default line-ending sequence is specified.
 This is normally the standard sequence for the operating system. Unless
-otherwise specified by this option, <b>pcregrep</b> uses the library's default.
+otherwise specified by this option, <b>pcre2grep</b> uses the library's default.
 The possible values for this option are CR, LF, CRLF, ANYCRLF, or ANY. This
-makes it possible to use <b>pcregrep</b> to scan files that have come from other
-environments without having to modify their line endings. If the data that is
-being scanned does not agree with the convention set by this option,
-<b>pcregrep</b> may behave in strange ways. Note that this option does not
+makes it possible to use <b>pcre2grep</b> to scan files that have come from
+other environments without having to modify their line endings. If the data
+that is being scanned does not agree with the convention set by this option,
+<b>pcre2grep</b> may behave in strange ways. Note that this option does not
 apply to files specified by the <b>-f</b>, <b>--exclude-from</b>, or
 <b>--include-from</b> options, which are expected to use the operating system's
 standard newline sequence.
@@ -537,14 +560,15 @@
 <P>
 <b>-n</b>, <b>--line-number</b>
 Precede each output line by its line number in the file, followed by a colon
-for matching lines or a hyphen for context lines. If the filename is also being
-output, it precedes the line number. This option is forced if
-<b>--line-offsets</b> is used.
+for matching lines or a hyphen for context lines. If the file name is also
+being output, it precedes the line number. When the <b>-M</b> option causes a
+pattern to match more than one line, only the first is preceded by its line
+number. This option is forced if <b>--line-offsets</b> is used.
 </P>
 <P>
 <b>--no-jit</b>
-If the PCRE library is built with support for just-in-time compiling (which
-speeds up matching), <b>pcregrep</b> automatically makes use of this, unless it
+If the PCRE2 library is built with support for just-in-time compiling (which
+speeds up matching), <b>pcre2grep</b> automatically makes use of this, unless it
 was explicitly disabled at build time. This option can be used to disable the
 use of JIT at run time. It is provided for testing and working round problems.
 It should never be needed in normal use.
@@ -570,7 +594,7 @@
 the same shell item, for example, -o3 or --only-matching=2. The comments given
 for the non-argument case above also apply to this case. If the specified
 capturing parentheses do not exist in the pattern, or were not set in the
-match, nothing is output unless the file name or line number are being printed.
+match, nothing is output unless the file name or line number are being output.
 <br>
 <br>
 If this option is given multiple times, multiple substrings are output, in the
@@ -608,14 +632,14 @@
 </P>
 <P>
 <b>-u</b>, <b>--utf-8</b>
-Operate in UTF-8 mode. This option is available only if PCRE has been compiled
+Operate in UTF-8 mode. This option is available only if PCRE2 has been compiled
 with UTF-8 support. All patterns (including those for any <b>--exclude</b> and
 <b>--include</b> options) and all subject lines that are scanned must be valid
 strings of UTF-8 characters.
 </P>
 <P>
 <b>-V</b>, <b>--version</b>
-Write the version numbers of <b>pcregrep</b> and the PCRE library to the
+Write the version numbers of <b>pcre2grep</b> and the PCRE2 library to the
 standard output and then exit. Anything else on the command line is
 ignored.
 </P>
@@ -635,49 +659,49 @@
 <b>-x</b>, <b>--line-regex</b>, <b>--line-regexp</b>
 Force the patterns to be anchored (each must start matching at the beginning of
 a line) and in addition, require them to match entire lines. This is equivalent
-to having ^ and $ characters at the start and end of each alternative branch in
-every pattern. This option applies only to the patterns that are matched
-against the contents of files; it does not apply to patterns specified by any
-of the <b>--include</b> or <b>--exclude</b> options.
+to having ^ and $ characters at the start and end of each alternative top-level
+branch in every pattern. This option applies only to the patterns that are
+matched against the contents of files; it does not apply to patterns specified
+by any of the <b>--include</b> or <b>--exclude</b> options.
 </P>
 <br><a name="SEC6" href="#TOC1">ENVIRONMENT VARIABLES</a><br>
 <P>
 The environment variables <b>LC_ALL</b> and <b>LC_CTYPE</b> are examined, in that
 order, for a locale. The first one that is set is used. This can be overridden
-by the <b>--locale</b> option. If no locale is set, the PCRE library's default
+by the <b>--locale</b> option. If no locale is set, the PCRE2 library's default
 (usually the "C" locale) is used.
 </P>
 <br><a name="SEC7" href="#TOC1">NEWLINES</a><br>
 <P>
-The <b>-N</b> (<b>--newline</b>) option allows <b>pcregrep</b> to scan files with
+The <b>-N</b> (<b>--newline</b>) option allows <b>pcre2grep</b> to scan files with
 different newline conventions from the default. Any parts of the input files
 that are written to the standard output are copied identically, with whatever
 newline sequences they have in the input. However, the setting of this option
 does not affect the interpretation of files specified by the <b>-f</b>,
 <b>--exclude-from</b>, or <b>--include-from</b> options, which are assumed to use
 the operating system's standard newline sequence, nor does it affect the way in
-which <b>pcregrep</b> writes informational messages to the standard error and
+which <b>pcre2grep</b> writes informational messages to the standard error and
 output streams. For these it uses the string "\n" to indicate newlines,
 relying on the C I/O library to convert this to an appropriate sequence.
 </P>
 <br><a name="SEC8" href="#TOC1">OPTIONS COMPATIBILITY</a><br>
 <P>
-Many of the short and long forms of <b>pcregrep</b>'s options are the same
+Many of the short and long forms of <b>pcre2grep</b>'s options are the same
 as in the GNU <b>grep</b> program. Any long option of the form
 <b>--xxx-regexp</b> (GNU terminology) is also available as <b>--xxx-regex</b>
-(PCRE terminology). However, the <b>--file-list</b>, <b>--file-offsets</b>,
+(PCRE2 terminology). However, the <b>--file-list</b>, <b>--file-offsets</b>,
 <b>--include-dir</b>, <b>--line-offsets</b>, <b>--locale</b>, <b>--match-limit</b>,
 <b>-M</b>, <b>--multiline</b>, <b>-N</b>, <b>--newline</b>, <b>--om-separator</b>,
 <b>--recursion-limit</b>, <b>-u</b>, and <b>--utf-8</b> options are specific to
-<b>pcregrep</b>, as is the use of the <b>--only-matching</b> option with a
+<b>pcre2grep</b>, as is the use of the <b>--only-matching</b> option with a
 capturing parentheses number.
 </P>
 <P>
 Although most of the common options work the same way, a few are different in
-<b>pcregrep</b>. For example, the <b>--include</b> option's argument is a glob
-for GNU <b>grep</b>, but a regular expression for <b>pcregrep</b>. If both the
+<b>pcre2grep</b>. For example, the <b>--include</b> option's argument is a glob
+for GNU <b>grep</b>, but a regular expression for <b>pcre2grep</b>. If both the
 <b>-c</b> and <b>-l</b> options are given, GNU grep lists only file names,
-without counts, but <b>pcregrep</b> gives the counts.
+without counts, but <b>pcre2grep</b> gives the counts as well.
 </P>
 <br><a name="SEC9" href="#TOC1">OPTIONS WITH DATA</a><br>
 <P>
@@ -709,22 +733,22 @@
 The exceptions to the above are the <b>--colour</b> (or <b>--color</b>) and
 <b>--only-matching</b> options, for which the data is optional. If one of these
 options does have data, it must be given in the first form, using an equals
-character. Otherwise <b>pcregrep</b> will assume that it has no data.
+character. Otherwise <b>pcre2grep</b> will assume that it has no data.
 </P>
 <br><a name="SEC10" href="#TOC1">MATCHING ERRORS</a><br>
 <P>
 It is possible to supply a regular expression that takes a very long time to
 fail to match certain lines. Such patterns normally involve nested indefinite
 repeats, for example: (a+)*\d when matched against a line of a's with no final
-digit. The PCRE matching function has a resource limit that causes it to abort
-in these circumstances. If this happens, <b>pcregrep</b> outputs an error
+digit. The PCRE2 matching function has a resource limit that causes it to abort
+in these circumstances. If this happens, <b>pcre2grep</b> outputs an error
 message and the line that caused the problem to the standard error stream. If
-there are more than 20 such errors, <b>pcregrep</b> gives up.
+there are more than 20 such errors, <b>pcre2grep</b> gives up.
 </P>
 <P>
-The <b>--match-limit</b> option of <b>pcregrep</b> can be used to set the overall
-resource limit; there is a second option called <b>--recursion-limit</b> that
-sets a limit on the amount of memory (usually stack) that is used (see the
+The <b>--match-limit</b> option of <b>pcre2grep</b> can be used to set the
+overall resource limit; there is a second option called <b>--recursion-limit</b>
+that sets a limit on the amount of memory (usually stack) that is used (see the
 discussion of these options above).
 </P>
 <br><a name="SEC11" href="#TOC1">DIAGNOSTICS</a><br>
@@ -737,7 +761,7 @@
 </P>
 <br><a name="SEC12" href="#TOC1">SEE ALSO</a><br>
 <P>
-<b>pcrepattern</b>(3), <b>pcresyntax</b>(3), <b>pcretest</b>(1).
+<b>pcre2pattern</b>(3), <b>pcre2syntax</b>(3).
 </P>
 <br><a name="SEC13" href="#TOC1">AUTHOR</a><br>
 <P>
@@ -745,15 +769,15 @@
 <br>
 University Computing Service
 <br>
-Cambridge CB2 3QH, England.
+Cambridge, England.
 <br>
 </P>
 <br><a name="SEC14" href="#TOC1">REVISION</a><br>
 <P>
-Last updated: 03 April 2014
+Last updated: 03 January 2015
 <br>
-Copyright &copy; 1997-2014 University of Cambridge.
+Copyright &copy; 1997-2015 University of Cambridge.
 <br>
 <p>
-Return to the <a href="index.html">PCRE index page</a>.
+Return to the <a href="index.html">PCRE2 index page</a>.
 </p>
diff --git a/dist2/doc/html/pcre2jit.html b/dist2/doc/html/pcre2jit.html
new file mode 100644
index 0000000..48ee122
--- /dev/null
+++ b/dist2/doc/html/pcre2jit.html
@@ -0,0 +1,441 @@
+<html>
+<head>
+<title>pcre2jit specification</title>
+</head>
+<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
+<h1>pcre2jit man page</h1>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
+<p>
+This page is part of the PCRE2 HTML documentation. It was generated
+automatically from the original man page. If there is any nonsense in it,
+please consult the man page, in case the conversion went wrong.
+<br>
+<ul>
+<li><a name="TOC1" href="#SEC1">PCRE2 JUST-IN-TIME COMPILER SUPPORT</a>
+<li><a name="TOC2" href="#SEC2">AVAILABILITY OF JIT SUPPORT</a>
+<li><a name="TOC3" href="#SEC3">SIMPLE USE OF JIT</a>
+<li><a name="TOC4" href="#SEC4">UNSUPPORTED OPTIONS AND PATTERN ITEMS</a>
+<li><a name="TOC5" href="#SEC5">RETURN VALUES FROM JIT MATCHING</a>
+<li><a name="TOC6" href="#SEC6">CONTROLLING THE JIT STACK</a>
+<li><a name="TOC7" href="#SEC7">JIT STACK FAQ</a>
+<li><a name="TOC8" href="#SEC8">FREEING JIT SPECULATIVE MEMORY</a>
+<li><a name="TOC9" href="#SEC9">EXAMPLE CODE</a>
+<li><a name="TOC10" href="#SEC10">JIT FAST PATH API</a>
+<li><a name="TOC11" href="#SEC11">SEE ALSO</a>
+<li><a name="TOC12" href="#SEC12">AUTHOR</a>
+<li><a name="TOC13" href="#SEC13">REVISION</a>
+</ul>
+<br><a name="SEC1" href="#TOC1">PCRE2 JUST-IN-TIME COMPILER SUPPORT</a><br>
+<P>
+Just-in-time compiling is a heavyweight optimization that can greatly speed up
+pattern matching. However, it comes at the cost of extra processing before the
+match is performed, so it is of most benefit when the same pattern is going to
+be matched many times. This does not necessarily mean many calls of a matching
+function; if the pattern is not anchored, matching attempts may take place many
+times at various positions in the subject, even for a single call. Therefore,
+if the subject string is very long, it may still pay to use JIT even for
+one-off matches. JIT support is available for all of the 8-bit, 16-bit and
+32-bit PCRE2 libraries.
+</P>
+<P>
+JIT support applies only to the traditional Perl-compatible matching function.
+It does not apply when the DFA matching function is being used. The code for
+this support was written by Zoltan Herczeg.
+</P>
+<br><a name="SEC2" href="#TOC1">AVAILABILITY OF JIT SUPPORT</a><br>
+<P>
+JIT support is an optional feature of PCRE2. The "configure" option
+--enable-jit (or equivalent CMake option) must be set when PCRE2 is built if
+you want to use JIT. The support is limited to the following hardware
+platforms:
+<pre>
+  ARM 32-bit (v5, v7, and Thumb2)
+  ARM 64-bit
+  Intel x86 32-bit and 64-bit
+  MIPS 32-bit and 64-bit
+  Power PC 32-bit and 64-bit
+  SPARC 32-bit
+</pre>
+If --enable-jit is set on an unsupported platform, compilation fails.
+</P>
+<P>
+A program can tell if JIT support is available by calling <b>pcre2_config()</b>
+with the PCRE2_CONFIG_JIT option. The result is 1 when JIT is available, and 0
+otherwise. However, a simple program does not need to check this in order to
+use JIT. The API is implemented in a way that falls back to the interpretive
+code if JIT is not available. For programs that need the best possible
+performance, there is also a "fast path" API that is JIT-specific.
+</P>
+<br><a name="SEC3" href="#TOC1">SIMPLE USE OF JIT</a><br>
+<P>
+To make use of the JIT support in the simplest way, all you have to do is to
+call <b>pcre2_jit_compile()</b> after successfully compiling a pattern with
+<b>pcre2_compile()</b>. This function has two arguments: the first is the
+compiled pattern pointer that was returned by <b>pcre2_compile()</b>, and the
+second is zero or more of the following option bits: PCRE2_JIT_COMPLETE,
+PCRE2_JIT_PARTIAL_HARD, or PCRE2_JIT_PARTIAL_SOFT.
+</P>
+<P>
+If JIT support is not available, a call to <b>pcre2_jit_compile()</b> does
+nothing and returns PCRE2_ERROR_JIT_BADOPTION. Otherwise, the compiled pattern
+is passed to the JIT compiler, which turns it into machine code that executes
+much faster than the normal interpretive code, but yields exactly the same
+results. The returned value from <b>pcre2_jit_compile()</b> is zero on success,
+or a negative error code.
+</P>
+<P>
+There is a limit to the size of pattern that JIT supports, imposed by the size
+of machine stack that it uses. The exact rules are not documented because they
+may change at any time, in particular, when new optimizations are introduced.
+If a pattern is too big, a call to \fBpcre2_jit_compile()\fB returns
+PCRE2_ERROR_NOMEMORY.
+</P>
+<P>
+PCRE2_JIT_COMPLETE requests the JIT compiler to generate code for complete
+matches. If you want to run partial matches using the PCRE2_PARTIAL_HARD or
+PCRE2_PARTIAL_SOFT options of <b>pcre2_match()</b>, you should set one or both
+of the other options as well as, or instead of PCRE2_JIT_COMPLETE. The JIT
+compiler generates different optimized code for each of the three modes
+(normal, soft partial, hard partial). When <b>pcre2_match()</b> is called, the
+appropriate code is run if it is available. Otherwise, the pattern is matched
+using interpretive code.
+</P>
+<P>
+You can call <b>pcre2_jit_compile()</b> multiple times for the same compiled
+pattern. It does nothing if it has previously compiled code for any of the
+option bits. For example, you can call it once with PCRE2_JIT_COMPLETE and
+(perhaps later, when you find you need partial matching) again with
+PCRE2_JIT_COMPLETE and PCRE2_JIT_PARTIAL_HARD. This time it will ignore
+PCRE2_JIT_COMPLETE and just compile code for partial matching. If
+<b>pcre2_jit_compile()</b> is called with no option bits set, it immediately
+returns zero. This is an alternative way of testing whether JIT is available.
+</P>
+<P>
+At present, it is not possible to free JIT compiled code except when the entire
+compiled pattern is freed by calling <b>pcre2_code_free()</b>.
+</P>
+<P>
+In some circumstances you may need to call additional functions. These are
+described in the section entitled
+<a href="#stackcontrol">"Controlling the JIT stack"</a>
+below.
+</P>
+<P>
+There are some <b>pcre2_match()</b> options that are not supported by JIT, and
+there are also some pattern items that JIT cannot handle. Details are given
+below. In both cases, matching automatically falls back to the interpretive
+code. If you want to know whether JIT was actually used for a particular match,
+you should arrange for a JIT callback function to be set up as described in the
+section entitled
+<a href="#stackcontrol">"Controlling the JIT stack"</a>
+below, even if you do not need to supply a non-default JIT stack. Such a
+callback function is called whenever JIT code is about to be obeyed. If the
+match-time options are not right for JIT execution, the callback function is
+not obeyed.
+</P>
+<P>
+If the JIT compiler finds an unsupported item, no JIT data is generated. You
+can find out if JIT matching is available after compiling a pattern by calling
+<b>pcre2_pattern_info()</b> with the PCRE2_INFO_JITSIZE option. A non-zero
+result means that JIT compilation was successful. A result of 0 means that JIT
+support is not available, or the pattern was not processed by
+<b>pcre2_jit_compile()</b>, or the JIT compiler was not able to handle the
+pattern.
+</P>
+<br><a name="SEC4" href="#TOC1">UNSUPPORTED OPTIONS AND PATTERN ITEMS</a><br>
+<P>
+The <b>pcre2_match()</b> options that are supported for JIT matching are
+PCRE2_NOTBOL, PCRE2_NOTEOL, PCRE2_NOTEMPTY, PCRE2_NOTEMPTY_ATSTART,
+PCRE2_NO_UTF_CHECK, PCRE2_PARTIAL_HARD, and PCRE2_PARTIAL_SOFT. The
+PCRE2_ANCHORED option is not supported at match time.
+</P>
+<P>
+The only unsupported pattern items are \C (match a single data unit) when
+running in a UTF mode, and a callout immediately before an assertion condition
+in a conditional group.
+</P>
+<br><a name="SEC5" href="#TOC1">RETURN VALUES FROM JIT MATCHING</a><br>
+<P>
+When a pattern is matched using JIT matching, the return values are the same
+as those given by the interpretive <b>pcre2_match()</b> code, with the addition
+of one new error code: PCRE2_ERROR_JIT_STACKLIMIT. This means that the memory
+used for the JIT stack was insufficient. See
+<a href="#stackcontrol">"Controlling the JIT stack"</a>
+below for a discussion of JIT stack usage.
+</P>
+<P>
+The error code PCRE2_ERROR_MATCHLIMIT is returned by the JIT code if searching
+a very large pattern tree goes on for too long, as it is in the same
+circumstance when JIT is not used, but the details of exactly what is counted
+are not the same. The PCRE2_ERROR_RECURSIONLIMIT error code is never returned
+when JIT matching is used.
+<a name="stackcontrol"></a></P>
+<br><a name="SEC6" href="#TOC1">CONTROLLING THE JIT STACK</a><br>
+<P>
+When the compiled JIT code runs, it needs a block of memory to use as a stack.
+By default, it uses 32K on the machine stack. However, some large or
+complicated patterns need more than this. The error PCRE2_ERROR_JIT_STACKLIMIT
+is given when there is not enough stack. Three functions are provided for
+managing blocks of memory for use as JIT stacks. There is further discussion
+about the use of JIT stacks in the section entitled
+<a href="#stackfaq">"JIT stack FAQ"</a>
+below.
+</P>
+<P>
+The <b>pcre2_jit_stack_create()</b> function creates a JIT stack. Its arguments
+are a starting size, a maximum size, and a general context (for memory
+allocation functions, or NULL for standard memory allocation). It returns a
+pointer to an opaque structure of type <b>pcre2_jit_stack</b>, or NULL if there
+is an error. The <b>pcre2_jit_stack_free()</b> function is used to free a stack
+that is no longer needed. (For the technically minded: the address space is
+allocated by mmap or VirtualAlloc.)
+</P>
+<P>
+JIT uses far less memory for recursion than the interpretive code,
+and a maximum stack size of 512K to 1M should be more than enough for any
+pattern.
+</P>
+<P>
+The <b>pcre2_jit_stack_assign()</b> function specifies which stack JIT code
+should use. Its arguments are as follows:
+<pre>
+  pcre2_match_context  *mcontext
+  pcre2_jit_callback    callback
+  void                 *data
+</pre>
+The first argument is a pointer to a match context. When this is subsequently
+passed to a matching function, its information determines which JIT stack is
+used. There are three cases for the values of the other two options:
+<pre>
+  (1) If <i>callback</i> is NULL and <i>data</i> is NULL, an internal 32K block
+      on the machine stack is used. This is the default when a match
+      context is created.
+
+  (2) If <i>callback</i> is NULL and <i>data</i> is not NULL, <i>data</i> must be
+      a pointer to a valid JIT stack, the result of calling
+      <b>pcre2_jit_stack_create()</b>.
+
+  (3) If <i>callback</i> is not NULL, it must point to a function that is
+      called with <i>data</i> as an argument at the start of matching, in
+      order to set up a JIT stack. If the return from the callback
+      function is NULL, the internal 32K stack is used; otherwise the
+      return value must be a valid JIT stack, the result of calling
+      <b>pcre2_jit_stack_create()</b>.
+</pre>
+A callback function is obeyed whenever JIT code is about to be run; it is not
+obeyed when <b>pcre2_match()</b> is called with options that are incompatible
+for JIT matching. A callback function can therefore be used to determine
+whether a match operation was executed by JIT or by the interpreter.
+</P>
+<P>
+You may safely use the same JIT stack for more than one pattern (either by
+assigning directly or by callback), as long as the patterns are matched
+sequentially in the same thread. Currently, the only way to set up
+non-sequential matches in one thread is to use callouts: if a callout function
+starts another match, that match must use a different JIT stack to the one used
+for currently suspended match(es).
+</P>
+<P>
+In a multithread application, if you do not
+specify a JIT stack, or if you assign or pass back NULL from a callback, that
+is thread-safe, because each thread has its own machine stack. However, if you
+assign or pass back a non-NULL JIT stack, this must be a different stack for
+each thread so that the application is thread-safe.
+</P>
+<P>
+Strictly speaking, even more is allowed. You can assign the same non-NULL stack
+to a match context that is used by any number of patterns, as long as they are
+not used for matching by multiple threads at the same time. For example, you
+could use the same stack in all compiled patterns, with a global mutex in the
+callback to wait until the stack is available for use. However, this is an
+inefficient solution, and not recommended.
+</P>
+<P>
+This is a suggestion for how a multithreaded program that needs to set up
+non-default JIT stacks might operate:
+<pre>
+  During thread initalization
+    thread_local_var = pcre2_jit_stack_create(...)
+
+  During thread exit
+    pcre2_jit_stack_free(thread_local_var)
+
+  Use a one-line callback function
+    return thread_local_var
+</pre>
+All the functions described in this section do nothing if JIT is not available.
+<a name="stackfaq"></a></P>
+<br><a name="SEC7" href="#TOC1">JIT STACK FAQ</a><br>
+<P>
+(1) Why do we need JIT stacks?
+<br>
+<br>
+PCRE2 (and JIT) is a recursive, depth-first engine, so it needs a stack where
+the local data of the current node is pushed before checking its child nodes.
+Allocating real machine stack on some platforms is difficult. For example, the
+stack chain needs to be updated every time if we extend the stack on PowerPC.
+Although it is possible, its updating time overhead decreases performance. So
+we do the recursion in memory.
+</P>
+<P>
+(2) Why don't we simply allocate blocks of memory with <b>malloc()</b>?
+<br>
+<br>
+Modern operating systems have a nice feature: they can reserve an address space
+instead of allocating memory. We can safely allocate memory pages inside this
+address space, so the stack could grow without moving memory data (this is
+important because of pointers). Thus we can allocate 1M address space, and use
+only a single memory page (usually 4K) if that is enough. However, we can still
+grow up to 1M anytime if needed.
+</P>
+<P>
+(3) Who "owns" a JIT stack?
+<br>
+<br>
+The owner of the stack is the user program, not the JIT studied pattern or
+anything else. The user program must ensure that if a stack is being used by
+<b>pcre2_match()</b>, (that is, it is assigned to a match context that is passed
+to the pattern currently running), that stack must not be used by any other
+threads (to avoid overwriting the same memory area). The best practice for
+multithreaded programs is to allocate a stack for each thread, and return this
+stack through the JIT callback function.
+</P>
+<P>
+(4) When should a JIT stack be freed?
+<br>
+<br>
+You can free a JIT stack at any time, as long as it will not be used by
+<b>pcre2_match()</b> again. When you assign the stack to a match context, only a
+pointer is set. There is no reference counting or any other magic. You can free
+compiled patterns, contexts, and stacks in any order, anytime. Just \fIdo
+not\fP call <b>pcre2_match()</b> with a match context pointing to an already
+freed stack, as that will cause SEGFAULT. (Also, do not free a stack currently
+used by <b>pcre2_match()</b> in another thread). You can also replace the stack
+in a context at any time when it is not in use. You should free the previous
+stack before assigning a replacement.
+</P>
+<P>
+(5) Should I allocate/free a stack every time before/after calling
+<b>pcre2_match()</b>?
+<br>
+<br>
+No, because this is too costly in terms of resources. However, you could
+implement some clever idea which release the stack if it is not used in let's
+say two minutes. The JIT callback can help to achieve this without keeping a
+list of patterns.
+</P>
+<P>
+(6) OK, the stack is for long term memory allocation. But what happens if a
+pattern causes stack overflow with a stack of 1M? Is that 1M kept until the
+stack is freed?
+<br>
+<br>
+Especially on embedded sytems, it might be a good idea to release memory
+sometimes without freeing the stack. There is no API for this at the moment.
+Probably a function call which returns with the currently allocated memory for
+any stack and another which allows releasing memory (shrinking the stack) would
+be a good idea if someone needs this.
+</P>
+<P>
+(7) This is too much of a headache. Isn't there any better solution for JIT
+stack handling?
+<br>
+<br>
+No, thanks to Windows. If POSIX threads were used everywhere, we could throw
+out this complicated API.
+</P>
+<br><a name="SEC8" href="#TOC1">FREEING JIT SPECULATIVE MEMORY</a><br>
+<P>
+<b>void pcre2_jit_free_unused_memory(pcre2_general_context *<i>gcontext</i>);</b>
+</P>
+<P>
+The JIT executable allocator does not free all memory when it is possible.
+It expects new allocations, and keeps some free memory around to improve
+allocation speed. However, in low memory conditions, it might be better to free
+all possible memory. You can cause this to happen by calling
+pcre2_jit_free_unused_memory(). Its argument is a general context, for custom
+memory management, or NULL for standard memory management.
+</P>
+<br><a name="SEC9" href="#TOC1">EXAMPLE CODE</a><br>
+<P>
+This is a single-threaded example that specifies a JIT stack without using a
+callback. A real program should include error checking after all the function
+calls.
+<pre>
+  int rc;
+  pcre2_code *re;
+  pcre2_match_data *match_data;
+  pcre2_match_context *mcontext;
+  pcre2_jit_stack *jit_stack;
+
+  re = pcre2_compile(pattern, PCRE2_ZERO_TERMINATED, 0,
+    &errornumber, &erroffset, NULL);
+  rc = pcre2_jit_compile(re, PCRE2_JIT_COMPLETE);
+  mcontext = pcre2_match_context_create(NULL);
+  jit_stack = pcre2_jit_stack_create(32*1024, 512*1024, NULL);
+  pcre2_jit_stack_assign(mcontext, NULL, jit_stack);
+  match_data = pcre2_match_data_create(re, 10);
+  rc = pcre2_match(re, subject, length, 0, 0, match_data, mcontext);
+  /* Process result */
+
+  pcre2_code_free(re);
+  pcre2_match_data_free(match_data);
+  pcre2_match_context_free(mcontext);
+  pcre2_jit_stack_free(jit_stack);
+
+</PRE>
+</P>
+<br><a name="SEC10" href="#TOC1">JIT FAST PATH API</a><br>
+<P>
+Because the API described above falls back to interpreted matching when JIT is
+not available, it is convenient for programs that are written for general use
+in many environments. However, calling JIT via <b>pcre2_match()</b> does have a
+performance impact. Programs that are written for use where JIT is known to be
+available, and which need the best possible performance, can instead use a
+"fast path" API to call JIT matching directly instead of calling
+<b>pcre2_match()</b> (obviously only for patterns that have been successfully
+processed by <b>pcre2_jit_compile()</b>).
+</P>
+<P>
+The fast path function is called <b>pcre2_jit_match()</b>, and it takes exactly
+the same arguments as <b>pcre2_match()</b>. The return values are also the same,
+plus PCRE2_ERROR_JIT_BADOPTION if a matching mode (partial or complete) is
+requested that was not compiled. Unsupported option bits (for example,
+PCRE2_ANCHORED) are ignored.
+</P>
+<P>
+When you call <b>pcre2_match()</b>, as well as testing for invalid options, a
+number of other sanity checks are performed on the arguments. For example, if
+the subject pointer is NULL, an immediate error is given. Also, unless
+PCRE2_NO_UTF_CHECK is set, a UTF subject string is tested for validity. In the
+interests of speed, these checks do not happen on the JIT fast path, and if
+invalid data is passed, the result is undefined.
+</P>
+<P>
+Bypassing the sanity checks and the <b>pcre2_match()</b> wrapping can give
+speedups of more than 10%.
+</P>
+<br><a name="SEC11" href="#TOC1">SEE ALSO</a><br>
+<P>
+<b>pcre2api</b>(3)
+</P>
+<br><a name="SEC12" href="#TOC1">AUTHOR</a><br>
+<P>
+Philip Hazel (FAQ by Zoltan Herczeg)
+<br>
+University Computing Service
+<br>
+Cambridge, England.
+<br>
+</P>
+<br><a name="SEC13" href="#TOC1">REVISION</a><br>
+<P>
+Last updated: 14 November 2015
+<br>
+Copyright &copy; 1997-2015 University of Cambridge.
+<br>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
diff --git a/dist2/doc/html/pcre2limits.html b/dist2/doc/html/pcre2limits.html
new file mode 100644
index 0000000..e227a30
--- /dev/null
+++ b/dist2/doc/html/pcre2limits.html
@@ -0,0 +1,102 @@
+<html>
+<head>
+<title>pcre2limits specification</title>
+</head>
+<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
+<h1>pcre2limits man page</h1>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
+<p>
+This page is part of the PCRE2 HTML documentation. It was generated
+automatically from the original man page. If there is any nonsense in it,
+please consult the man page, in case the conversion went wrong.
+<br>
+<br><b>
+SIZE AND OTHER LIMITATIONS
+</b><br>
+<P>
+There are some size limitations in PCRE2 but it is hoped that they will never
+in practice be relevant.
+</P>
+<P>
+The maximum size of a compiled pattern is approximately 64K code units for the
+8-bit and 16-bit libraries if PCRE2 is compiled with the default internal
+linkage size, which is 2 bytes for these libraries. If you want to process
+regular expressions that are truly enormous, you can compile PCRE2 with an
+internal linkage size of 3 or 4 (when building the 16-bit library, 3 is rounded
+up to 4). See the <b>README</b> file in the source distribution and the
+<a href="pcre2build.html"><b>pcre2build</b></a>
+documentation for details. In these cases the limit is substantially larger.
+However, the speed of execution is slower. In the 32-bit library, the internal
+linkage size is always 4.
+</P>
+<P>
+The maximum length of a source pattern string is essentially unlimited; it is
+the largest number a PCRE2_SIZE variable can hold. However, the program that
+calls <b>pcre2_compile()</b> can specify a smaller limit.
+</P>
+<P>
+The maximum length (in code units) of a subject string is one less than the
+largest number a PCRE2_SIZE variable can hold. PCRE2_SIZE is an unsigned
+integer type, usually defined as size_t. Its maximum value (that is
+~(PCRE2_SIZE)0) is reserved as a special indicator for zero-terminated strings
+and unset offsets.
+</P>
+<P>
+Note that when using the traditional matching function, PCRE2 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. For a discussion of stack issues, see the
+<a href="pcre2stack.html"><b>pcre2stack</b></a>
+documentation.
+</P>
+<P>
+All values in repeating quantifiers must be less than 65536.
+</P>
+<P>
+The maximum length of a lookbehind assertion is 65535 characters.
+</P>
+<P>
+There is no limit to the number of parenthesized subpatterns, but there can be
+no more than 65535 capturing subpatterns. There is, however, a limit to the
+depth of nesting of parenthesized subpatterns of all kinds. This is imposed in
+order to limit the amount of system stack used at compile time. The limit can
+be specified when PCRE2 is built; the default is 250.
+</P>
+<P>
+There is a limit to the number of forward references to subsequent subpatterns
+of around 200,000. Repeated forward references with fixed upper limits, for
+example, (?2){0,100} when subpattern number 2 is to the right, are included in
+the count. There is no limit to the number of backward references.
+</P>
+<P>
+The maximum length of name for a named subpattern is 32 code units, and the
+maximum number of named subpatterns is 10000.
+</P>
+<P>
+The maximum length of a name in a (*MARK), (*PRUNE), (*SKIP), or (*THEN) verb
+is 255 for the 8-bit library and 65535 for the 16-bit and 32-bit libraries.
+</P>
+<br><b>
+AUTHOR
+</b><br>
+<P>
+Philip Hazel
+<br>
+University Computing Service
+<br>
+Cambridge, England.
+<br>
+</P>
+<br><b>
+REVISION
+</b><br>
+<P>
+Last updated: 05 November 2015
+<br>
+Copyright &copy; 1997-2015 University of Cambridge.
+<br>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
diff --git a/dist/doc/html/pcrematching.html b/dist2/doc/html/pcre2matching.html
similarity index 71%
rename from dist/doc/html/pcrematching.html
rename to dist2/doc/html/pcre2matching.html
index a1af39b..859bbb3 100644
--- a/dist/doc/html/pcrematching.html
+++ b/dist2/doc/html/pcre2matching.html
@@ -1,19 +1,19 @@
 <html>
 <head>
-<title>pcrematching specification</title>
+<title>pcre2matching specification</title>
 </head>
 <body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
-<h1>pcrematching man page</h1>
+<h1>pcre2matching man page</h1>
 <p>
-Return to the <a href="index.html">PCRE index page</a>.
+Return to the <a href="index.html">PCRE2 index page</a>.
 </p>
 <p>
-This page is part of the PCRE HTML documentation. It was generated automatically
-from the original man page. If there is any nonsense in it, please consult the
-man page, in case the conversion went wrong.
+This page is part of the PCRE2 HTML documentation. It was generated
+automatically from the original man page. If there is any nonsense in it,
+please consult the man page, in case the conversion went wrong.
 <br>
 <ul>
-<li><a name="TOC1" href="#SEC1">PCRE MATCHING ALGORITHMS</a>
+<li><a name="TOC1" href="#SEC1">PCRE2 MATCHING ALGORITHMS</a>
 <li><a name="TOC2" href="#SEC2">REGULAR EXPRESSIONS AS TREES</a>
 <li><a name="TOC3" href="#SEC3">THE STANDARD MATCHING ALGORITHM</a>
 <li><a name="TOC4" href="#SEC4">THE ALTERNATIVE MATCHING ALGORITHM</a>
@@ -22,23 +22,22 @@
 <li><a name="TOC7" href="#SEC7">AUTHOR</a>
 <li><a name="TOC8" href="#SEC8">REVISION</a>
 </ul>
-<br><a name="SEC1" href="#TOC1">PCRE MATCHING ALGORITHMS</a><br>
+<br><a name="SEC1" href="#TOC1">PCRE2 MATCHING ALGORITHMS</a><br>
 <P>
-This document describes the two different algorithms that are available in PCRE
-for matching a compiled regular expression against a given subject string. The
-"standard" algorithm is the one provided by the <b>pcre_exec()</b>,
-<b>pcre16_exec()</b> and <b>pcre32_exec()</b> functions. These work in the same
-as as Perl's matching function, and provide a Perl-compatible matching operation.
-The just-in-time (JIT) optimization that is described in the
-<a href="pcrejit.html"><b>pcrejit</b></a>
-documentation is compatible with these functions.
+This document describes the two different algorithms that are available in
+PCRE2 for matching a compiled regular expression against a given subject
+string. The "standard" algorithm is the one provided by the <b>pcre2_match()</b>
+function. This works in the same as as Perl's matching function, and provide a
+Perl-compatible matching operation. The just-in-time (JIT) optimization that is
+described in the
+<a href="pcre2jit.html"><b>pcre2jit</b></a>
+documentation is compatible with this function.
 </P>
 <P>
-An alternative algorithm is provided by the <b>pcre_dfa_exec()</b>,
-<b>pcre16_dfa_exec()</b> and <b>pcre32_dfa_exec()</b> functions; they operate in
-a different way, and are not Perl-compatible. This alternative has advantages
-and disadvantages compared with the standard algorithm, and these are described
-below.
+An alternative algorithm is provided by the <b>pcre2_dfa_match()</b> function;
+it operates in a different way, and is not Perl-compatible. This alternative
+has advantages and disadvantages compared with the standard algorithm, and
+these are described below.
 </P>
 <P>
 When there is only one possible way in which a given subject string can match a
@@ -61,20 +60,19 @@
 infinite size, but it is still a tree. Matching the pattern to a given subject
 string (from a given starting point) can be thought of as a search of the tree.
 There are two ways to search a tree: depth-first and breadth-first, and these
-correspond to the two matching algorithms provided by PCRE.
+correspond to the two matching algorithms provided by PCRE2.
 </P>
 <br><a name="SEC3" href="#TOC1">THE STANDARD MATCHING ALGORITHM</a><br>
 <P>
-In the terminology of Jeffrey Friedl's book "Mastering Regular
-Expressions", the standard algorithm is an "NFA algorithm". It conducts a
-depth-first search of the pattern tree. That is, it proceeds along a single
-path through the tree, checking that the subject matches what is required. When
-there is a mismatch, the algorithm tries any alternatives at the current point,
-and if they all fail, it backs up to the previous branch point in the tree, and
-tries the next alternative branch at that level. This often involves backing up
-(moving to the left) in the subject string as well. The order in which
-repetition branches are tried is controlled by the greedy or ungreedy nature of
-the quantifier.
+In the terminology of Jeffrey Friedl's book "Mastering Regular Expressions",
+the standard algorithm is an "NFA algorithm". It conducts a depth-first search
+of the pattern tree. That is, it proceeds along a single path through the tree,
+checking that the subject matches what is required. When there is a mismatch,
+the algorithm tries any alternatives at the current point, and if they all
+fail, it backs up to the previous branch point in the tree, and tries the next
+alternative branch at that level. This often involves backing up (moving to the
+left) in the subject string as well. The order in which repetition branches are
+tried is controlled by the greedy or ungreedy nature of the quantifier.
 </P>
 <P>
 If a leaf node is reached, a matching string has been found, and at that point
@@ -120,27 +118,28 @@
 <pre>
   cat(er(pillar)?)?
 </pre>
-is matched against the string "the caterpillar catchment", the result will be
-the three strings "caterpillar", "cater", and "cat" that start at the fifth
+is matched against the string "the caterpillar catchment", the result is the
+three strings "caterpillar", "cater", and "cat" that start at the fifth
 character of the subject. The algorithm does not automatically move on to find
 matches that start at later positions.
 </P>
 <P>
-PCRE's "auto-possessification" optimization usually applies to character
+PCRE2's "auto-possessification" optimization usually applies to character
 repeats at the end of a pattern (as well as internally). For example, the
 pattern "a\d+" is compiled as if it were "a\d++" because there is no point
 even considering the possibility of backtracking into the repeated digits. For
 DFA matching, this means that only one possible match is found. If you really
 do want multiple matches in such cases, either use an ungreedy repeat
-("a\d+?") or set the PCRE_NO_AUTO_POSSESS option when compiling.
+("a\d+?") or set the PCRE2_NO_AUTO_POSSESS option when compiling.
 </P>
 <P>
-There are a number of features of PCRE regular expressions that are not
+There are a number of features of PCRE2 regular expressions that are not
 supported by the alternative matching algorithm. They are as follows:
 </P>
 <P>
 1. Because the algorithm finds all possible matches, the greedy or ungreedy
-nature of repetition quantifiers is not relevant. Greedy and ungreedy
+nature of repetition quantifiers is not relevant (though it may affect
+auto-possessification, as just described). During matching, greedy and ungreedy
 quantifiers are treated in exactly the same way. However, possessive
 quantifiers can make a difference when what follows could also match what is
 quantified, for example in a pattern like this:
@@ -155,7 +154,7 @@
 <P>
 2. When dealing with multiple paths through the tree simultaneously, it is not
 straightforward to keep track of captured substrings for the different matching
-possibilities, and PCRE's implementation of this algorithm does not attempt to
+possibilities, and PCRE2's implementation of this algorithm does not attempt to
 do this. This means that no captured substrings are available.
 </P>
 <P>
@@ -173,13 +172,13 @@
 </P>
 <P>
 6. Callouts are supported, but the value of the <i>capture_top</i> field is
-always 1, and the value of the <i>capture_last</i> field is always -1.
+always 1, and the value of the <i>capture_last</i> field is always 0.
 </P>
 <P>
 7. The \C escape sequence, which (in the standard algorithm) always matches a
-single data unit, even in UTF-8, UTF-16 or UTF-32 modes, is not supported in
-these modes, because the alternative algorithm moves through the subject string
-one character (not data unit) at a time, for all active paths through the tree.
+single code unit, even in a UTF mode, is not supported in these modes, because
+the alternative algorithm moves through the subject string one character (not
+code unit) at a time, for all active paths through the tree.
 </P>
 <P>
 8. Except for (*FAIL), the backtracking control verbs such as (*PRUNE) are not
@@ -199,10 +198,10 @@
 2. Because the alternative algorithm scans the subject string just once, and
 never needs to backtrack (except for lookbehinds), it is possible to pass very
 long subject strings to the matching function in several pieces, checking for
-partial matching each time. Although it is possible to do multi-segment
-matching using the standard algorithm by retaining partially matched
+partial matching each time. Although it is also possible to do multi-segment
+matching using the standard algorithm, by retaining partially matched
 substrings, it is more complicated. The
-<a href="pcrepartial.html"><b>pcrepartial</b></a>
+<a href="pcre2partial.html"><b>pcre2partial</b></a>
 documentation gives details of partial matching and discusses multi-segment
 matching.
 </P>
@@ -228,15 +227,15 @@
 <br>
 University Computing Service
 <br>
-Cambridge CB2 3QH, England.
+Cambridge, England.
 <br>
 </P>
 <br><a name="SEC8" href="#TOC1">REVISION</a><br>
 <P>
-Last updated: 12 November 2013
+Last updated: 29 September 2014
 <br>
-Copyright &copy; 1997-2012 University of Cambridge.
+Copyright &copy; 1997-2014 University of Cambridge.
 <br>
 <p>
-Return to the <a href="index.html">PCRE index page</a>.
+Return to the <a href="index.html">PCRE2 index page</a>.
 </p>
diff --git a/dist2/doc/html/pcre2partial.html b/dist2/doc/html/pcre2partial.html
new file mode 100644
index 0000000..4e156b8
--- /dev/null
+++ b/dist2/doc/html/pcre2partial.html
@@ -0,0 +1,465 @@
+<html>
+<head>
+<title>pcre2partial specification</title>
+</head>
+<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
+<h1>pcre2partial man page</h1>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
+<p>
+This page is part of the PCRE2 HTML documentation. It was generated
+automatically from the original man page. If there is any nonsense in it,
+please consult the man page, in case the conversion went wrong.
+<br>
+<ul>
+<li><a name="TOC1" href="#SEC1">PARTIAL MATCHING IN PCRE2</a>
+<li><a name="TOC2" href="#SEC2">PARTIAL MATCHING USING pcre2_match()</a>
+<li><a name="TOC3" href="#SEC3">PARTIAL MATCHING USING pcre2_dfa_match()</a>
+<li><a name="TOC4" href="#SEC4">PARTIAL MATCHING AND WORD BOUNDARIES</a>
+<li><a name="TOC5" href="#SEC5">EXAMPLE OF PARTIAL MATCHING USING PCRE2TEST</a>
+<li><a name="TOC6" href="#SEC6">MULTI-SEGMENT MATCHING WITH pcre2_dfa_match()</a>
+<li><a name="TOC7" href="#SEC7">MULTI-SEGMENT MATCHING WITH pcre2_match()</a>
+<li><a name="TOC8" href="#SEC8">ISSUES WITH MULTI-SEGMENT MATCHING</a>
+<li><a name="TOC9" href="#SEC9">AUTHOR</a>
+<li><a name="TOC10" href="#SEC10">REVISION</a>
+</ul>
+<br><a name="SEC1" href="#TOC1">PARTIAL MATCHING IN PCRE2</a><br>
+<P>
+In normal use of PCRE2, if the subject string that is passed to a matching
+function matches as far as it goes, but is too short to match the entire
+pattern, PCRE2_ERROR_NOMATCH is returned. There are circumstances where it
+might be helpful to distinguish this case from other cases in which there is no
+match.
+</P>
+<P>
+Consider, for example, an application where a human is required to type in data
+for a field with specific formatting requirements. An example might be a date
+in the form <i>ddmmmyy</i>, defined by this pattern:
+<pre>
+  ^\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d$
+</pre>
+If the application sees the user's keystrokes one by one, and can check that
+what has been typed so far is potentially valid, it is able to raise an error
+as soon as a mistake is made, by beeping and not reflecting the character that
+has been typed, for example. This immediate feedback is likely to be a better
+user interface than a check that is delayed until the entire string has been
+entered. Partial matching can also be useful when the subject string is very
+long and is not all available at once.
+</P>
+<P>
+PCRE2 supports partial matching by means of the PCRE2_PARTIAL_SOFT and
+PCRE2_PARTIAL_HARD options, which can be set when calling a matching function.
+The difference between the two options is whether or not a partial match is
+preferred to an alternative complete match, though the details differ between
+the two types of matching function. If both options are set, PCRE2_PARTIAL_HARD
+takes precedence.
+</P>
+<P>
+If you want to use partial matching with just-in-time optimized code, you must
+call <b>pcre2_jit_compile()</b> with one or both of these options:
+<pre>
+  PCRE2_JIT_PARTIAL_SOFT
+  PCRE2_JIT_PARTIAL_HARD
+</pre>
+PCRE2_JIT_COMPLETE should also be set if you are going to run non-partial
+matches on the same pattern. If the appropriate JIT mode has not been compiled,
+interpretive matching code is used.
+</P>
+<P>
+Setting a partial matching option disables two of PCRE2's standard
+optimizations. PCRE2 remembers the last literal code unit in a pattern, and
+abandons matching immediately if it is not present in the subject string. This
+optimization cannot be used for a subject string that might match only
+partially. PCRE2 also knows the minimum length of a matching string, and does
+not bother to run the matching function on shorter strings. This optimization
+is also disabled for partial matching.
+</P>
+<br><a name="SEC2" href="#TOC1">PARTIAL MATCHING USING pcre2_match()</a><br>
+<P>
+A partial match occurs during a call to <b>pcre2_match()</b> when the end of the
+subject string is reached successfully, but matching cannot continue because
+more characters are needed. However, at least one character in the subject must
+have been inspected. This character need not form part of the final matched
+string; lookbehind assertions and the \K escape sequence provide ways of
+inspecting characters before the start of a matched string. The requirement for
+inspecting at least one character exists because an empty string can always be
+matched; without such a restriction there would always be a partial match of an
+empty string at the end of the subject.
+</P>
+<P>
+When a partial match is returned, the first two elements in the ovector point
+to the portion of the subject that was matched, but the values in the rest of
+the ovector are undefined. The appearance of \K in the pattern has no effect
+for a partial match. Consider this pattern:
+<pre>
+  /abc\K123/
+</pre>
+If it is matched against "456abc123xyz" the result is a complete match, and the
+ovector defines the matched string as "123", because \K resets the "start of
+match" point. However, if a partial match is requested and the subject string
+is "456abc12", a partial match is found for the string "abc12", because all
+these characters are needed for a subsequent re-match with additional
+characters.
+</P>
+<P>
+What happens when a partial match is identified depends on which of the two
+partial matching options are set.
+</P>
+<br><b>
+PCRE2_PARTIAL_SOFT WITH pcre2_match()
+</b><br>
+<P>
+If PCRE2_PARTIAL_SOFT is set when <b>pcre2_match()</b> identifies a partial
+match, the partial match is remembered, but matching continues as normal, and
+other alternatives in the pattern are tried. If no complete match can be found,
+PCRE2_ERROR_PARTIAL is returned instead of PCRE2_ERROR_NOMATCH.
+</P>
+<P>
+This option is "soft" because it prefers a complete match over a partial match.
+All the various matching items in a pattern behave as if the subject string is
+potentially complete. For example, \z, \Z, and $ match at the end of the
+subject, as normal, and for \b and \B the end of the subject is treated as a
+non-alphanumeric.
+</P>
+<P>
+If there is more than one partial match, the first one that was found provides
+the data that is returned. Consider this pattern:
+<pre>
+  /123\w+X|dogY/
+</pre>
+If this is matched against the subject string "abc123dog", both
+alternatives fail to match, but the end of the subject is reached during
+matching, so PCRE2_ERROR_PARTIAL is returned. The offsets are set to 3 and 9,
+identifying "123dog" as the first partial match that was found. (In this
+example, there are two partial matches, because "dog" on its own partially
+matches the second alternative.)
+</P>
+<br><b>
+PCRE2_PARTIAL_HARD WITH pcre2_match()
+</b><br>
+<P>
+If PCRE2_PARTIAL_HARD is set for <b>pcre2_match()</b>, PCRE2_ERROR_PARTIAL is
+returned as soon as a partial match is found, without continuing to search for
+possible complete matches. This option is "hard" because it prefers an earlier
+partial match over a later complete match. For this reason, the assumption is
+made that the end of the supplied subject string may not be the true end of the
+available data, and so, if \z, \Z, \b, \B, or $ are encountered at the end
+of the subject, the result is PCRE2_ERROR_PARTIAL, provided that at least one
+character in the subject has been inspected.
+</P>
+<br><b>
+Comparing hard and soft partial matching
+</b><br>
+<P>
+The difference between the two partial matching options can be illustrated by a
+pattern such as:
+<pre>
+  /dog(sbody)?/
+</pre>
+This matches either "dog" or "dogsbody", greedily (that is, it prefers the
+longer string if possible). If it is matched against the string "dog" with
+PCRE2_PARTIAL_SOFT, it yields a complete match for "dog". However, if
+PCRE2_PARTIAL_HARD is set, the result is PCRE2_ERROR_PARTIAL. On the other
+hand, if the pattern is made ungreedy the result is different:
+<pre>
+  /dog(sbody)??/
+</pre>
+In this case the result is always a complete match because that is found first,
+and matching never continues after finding a complete match. It might be easier
+to follow this explanation by thinking of the two patterns like this:
+<pre>
+  /dog(sbody)?/    is the same as  /dogsbody|dog/
+  /dog(sbody)??/   is the same as  /dog|dogsbody/
+</pre>
+The second pattern will never match "dogsbody", because it will always find the
+shorter match first.
+</P>
+<br><a name="SEC3" href="#TOC1">PARTIAL MATCHING USING pcre2_dfa_match()</a><br>
+<P>
+The DFA functions move along the subject string character by character, without
+backtracking, searching for all possible matches simultaneously. If the end of
+the subject is reached before the end of the pattern, there is the possibility
+of a partial match, again provided that at least one character has been
+inspected.
+</P>
+<P>
+When PCRE2_PARTIAL_SOFT is set, PCRE2_ERROR_PARTIAL is returned only if there
+have been no complete matches. Otherwise, the complete matches are returned.
+However, if PCRE2_PARTIAL_HARD is set, a partial match takes precedence over
+any complete matches. The portion of the string that was matched when the
+longest partial match was found is set as the first matching string.
+</P>
+<P>
+Because the DFA functions always search for all possible matches, and there is
+no difference between greedy and ungreedy repetition, their behaviour is
+different from the standard functions when PCRE2_PARTIAL_HARD is set. Consider
+the string "dog" matched against the ungreedy pattern shown above:
+<pre>
+  /dog(sbody)??/
+</pre>
+Whereas the standard function stops as soon as it finds the complete match for
+"dog", the DFA function also finds the partial match for "dogsbody", and so
+returns that when PCRE2_PARTIAL_HARD is set.
+</P>
+<br><a name="SEC4" href="#TOC1">PARTIAL MATCHING AND WORD BOUNDARIES</a><br>
+<P>
+If a pattern ends with one of sequences \b or \B, which test for word
+boundaries, partial matching with PCRE2_PARTIAL_SOFT can give counter-intuitive
+results. Consider this pattern:
+<pre>
+  /\bcat\b/
+</pre>
+This matches "cat", provided there is a word boundary at either end. If the
+subject string is "the cat", the comparison of the final "t" with a following
+character cannot take place, so a partial match is found. However, normal
+matching carries on, and \b matches at the end of the subject when the last
+character is a letter, so a complete match is found. The result, therefore, is
+<i>not</i> PCRE2_ERROR_PARTIAL. Using PCRE2_PARTIAL_HARD in this case does yield
+PCRE2_ERROR_PARTIAL, because then the partial match takes precedence.
+</P>
+<br><a name="SEC5" href="#TOC1">EXAMPLE OF PARTIAL MATCHING USING PCRE2TEST</a><br>
+<P>
+If the <b>partial_soft</b> (or <b>ps</b>) modifier is present on a
+<b>pcre2test</b> data line, the PCRE2_PARTIAL_SOFT option is used for the match.
+Here is a run of <b>pcre2test</b> that uses the date example quoted above:
+<pre>
+    re&#62; /^\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d$/
+  data&#62; 25jun04\=ps
+   0: 25jun04
+   1: jun
+  data&#62; 25dec3\=ps
+  Partial match: 23dec3
+  data&#62; 3ju\=ps
+  Partial match: 3ju
+  data&#62; 3juj\=ps
+  No match
+  data&#62; j\=ps
+  No match
+</pre>
+The first data string is matched completely, so <b>pcre2test</b> shows the
+matched substrings. The remaining four strings do not match the complete
+pattern, but the first two are partial matches. Similar output is obtained
+if DFA matching is used.
+</P>
+<P>
+If the <b>partial_hard</b> (or <b>ph</b>) modifier is present on a
+<b>pcre2test</b> data line, the PCRE2_PARTIAL_HARD option is set for the match.
+</P>
+<br><a name="SEC6" href="#TOC1">MULTI-SEGMENT MATCHING WITH pcre2_dfa_match()</a><br>
+<P>
+When a partial match has been found using a DFA matching function, it is
+possible to continue the match by providing additional subject data and calling
+the function again with the same compiled regular expression, this time setting
+the PCRE2_DFA_RESTART option. You must pass the same working space as before,
+because this is where details of the previous partial match are stored. Here is
+an example using <b>pcre2test</b>:
+<pre>
+    re&#62; /^\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d$/
+  data&#62; 23ja\=dfa,ps
+  Partial match: 23ja
+  data&#62; n05\=dfa,dfa_restart
+   0: n05
+</pre>
+The first call has "23ja" as the subject, and requests partial matching; the
+second call has "n05" as the subject for the continued (restarted) match.
+Notice that when the match is complete, only the last part is shown; PCRE2 does
+not retain the previously partially-matched string. It is up to the calling
+program to do that if it needs to.
+</P>
+<P>
+That means that, for an unanchored pattern, if a continued match fails, it is
+not possible to try again at a new starting point. All this facility is capable
+of doing is continuing with the previous match attempt. In the previous
+example, if the second set of data is "ug23" the result is no match, even
+though there would be a match for "aug23" if the entire string were given at
+once. Depending on the application, this may or may not be what you want.
+The only way to allow for starting again at the next character is to retain the
+matched part of the subject and try a new complete match.
+</P>
+<P>
+You can set the PCRE2_PARTIAL_SOFT or PCRE2_PARTIAL_HARD options with
+PCRE2_DFA_RESTART to continue partial matching over multiple segments. This
+facility can be used to pass very long subject strings to the DFA matching
+functions.
+</P>
+<br><a name="SEC7" href="#TOC1">MULTI-SEGMENT MATCHING WITH pcre2_match()</a><br>
+<P>
+Unlike the DFA function, it is not possible to restart the previous match with
+a new segment of data when using <b>pcre2_match()</b>. Instead, new data must be
+added to the previous subject string, and the entire match re-run, starting
+from the point where the partial match occurred. Earlier data can be discarded.
+</P>
+<P>
+It is best to use PCRE2_PARTIAL_HARD in this situation, because it does not
+treat the end of a segment as the end of the subject when matching \z, \Z,
+\b, \B, and $. Consider an unanchored pattern that matches dates:
+<pre>
+    re&#62; /\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d/
+  data&#62; The date is 23ja\=ph
+  Partial match: 23ja
+</pre>
+At this stage, an application could discard the text preceding "23ja", add on
+text from the next segment, and call the matching function again. Unlike the
+DFA matching function, the entire matching string must always be available,
+and the complete matching process occurs for each call, so more memory and more
+processing time is needed.
+</P>
+<br><a name="SEC8" href="#TOC1">ISSUES WITH MULTI-SEGMENT MATCHING</a><br>
+<P>
+Certain types of pattern may give problems with multi-segment matching,
+whichever matching function is used.
+</P>
+<P>
+1. If the pattern contains a test for the beginning of a line, you need to pass
+the PCRE2_NOTBOL option when the subject string for any call does start at the
+beginning of a line. There is also a PCRE2_NOTEOL option, but in practice when
+doing multi-segment matching you should be using PCRE2_PARTIAL_HARD, which
+includes the effect of PCRE2_NOTEOL.
+</P>
+<P>
+2. If a pattern contains a lookbehind assertion, characters that precede the
+start of the partial match may have been inspected during the matching process.
+When using <b>pcre2_match()</b>, sufficient characters must be retained for the
+next match attempt. You can ensure that enough characters are retained by doing
+the following:
+</P>
+<P>
+Before doing any matching, find the length of the longest lookbehind in the
+pattern by calling <b>pcre2_pattern_info()</b> with the PCRE2_INFO_MAXLOOKBEHIND
+option. Note that the resulting count is in characters, not code units. After a
+partial match, moving back from the ovector[0] offset in the subject by the
+number of characters given for the maximum lookbehind gets you to the earliest
+character that must be retained. In a non-UTF or a 32-bit situation, moving
+back is just a subtraction, but in UTF-8 or UTF-16 you have to count characters
+while moving back through the code units.
+</P>
+<P>
+Characters before the point you have now reached can be discarded, and after
+the next segment has been added to what is retained, you should run the next
+match with the <b>startoffset</b> argument set so that the match begins at the
+same point as before.
+</P>
+<P>
+For example, if the pattern "(?&#60;=123)abc" is partially matched against the
+string "xx123ab", the ovector offsets are 5 and 7 ("ab"). The maximum
+lookbehind count is 3, so all characters before offset 2 can be discarded. The
+value of <b>startoffset</b> for the next match should be 3. When <b>pcre2test</b>
+displays a partial match, it indicates the lookbehind characters with '&#60;'
+characters:
+<pre>
+    re&#62; "(?&#60;=123)abc"
+  data&#62; xx123ab\=ph
+  Partial match: 123ab
+                 &#60;&#60;&#60;
+</PRE>
+</P>
+<P>
+3. Because a partial match must always contain at least one character, what
+might be considered a partial match of an empty string actually gives a "no
+match" result. For example:
+<pre>
+    re&#62; /c(?&#60;=abc)x/
+  data&#62; ab\=ps
+  No match
+</pre>
+If the next segment begins "cx", a match should be found, but this will only
+happen if characters from the previous segment are retained. For this reason, a
+"no match" result should be interpreted as "partial match of an empty string"
+when the pattern contains lookbehinds.
+</P>
+<P>
+4. Matching a subject string that is split into multiple segments may not
+always produce exactly the same result as matching over one single long string,
+especially when PCRE2_PARTIAL_SOFT is used. The section "Partial Matching and
+Word Boundaries" above describes an issue that arises if the pattern ends with
+\b or \B. Another kind of difference may occur when there are multiple
+matching possibilities, because (for PCRE2_PARTIAL_SOFT) a partial match result
+is given only when there are no completed matches. This means that as soon as
+the shortest match has been found, continuation to a new subject segment is no
+longer possible. Consider this <b>pcre2test</b> example:
+<pre>
+    re&#62; /dog(sbody)?/
+  data&#62; dogsb\=ps
+   0: dog
+  data&#62; do\=ps,dfa
+  Partial match: do
+  data&#62; gsb\=ps,dfa,dfa_restart
+   0: g
+  data&#62; dogsbody\=dfa
+   0: dogsbody
+   1: dog
+</pre>
+The first data line passes the string "dogsb" to a standard matching function,
+setting the PCRE2_PARTIAL_SOFT option. Although the string is a partial match
+for "dogsbody", the result is not PCRE2_ERROR_PARTIAL, because the shorter
+string "dog" is a complete match. Similarly, when the subject is presented to
+a DFA matching function in several parts ("do" and "gsb" being the first two)
+the match stops when "dog" has been found, and it is not possible to continue.
+On the other hand, if "dogsbody" is presented as a single string, a DFA
+matching function finds both matches.
+</P>
+<P>
+Because of these problems, it is best to use PCRE2_PARTIAL_HARD when matching
+multi-segment data. The example above then behaves differently:
+<pre>
+    re&#62; /dog(sbody)?/
+  data&#62; dogsb\=ph
+  Partial match: dogsb
+  data&#62; do\=ps,dfa
+  Partial match: do
+  data&#62; gsb\=ph,dfa,dfa_restart
+  Partial match: gsb
+</pre>
+5. Patterns that contain alternatives at the top level which do not all start
+with the same pattern item may not work as expected when PCRE2_DFA_RESTART is
+used. For example, consider this pattern:
+<pre>
+  1234|3789
+</pre>
+If the first part of the subject is "ABC123", a partial match of the first
+alternative is found at offset 3. There is no partial match for the second
+alternative, because such a match does not start at the same point in the
+subject string. Attempting to continue with the string "7890" does not yield a
+match because only those alternatives that match at one point in the subject
+are remembered. The problem arises because the start of the second alternative
+matches within the first alternative. There is no problem with anchored
+patterns or patterns such as:
+<pre>
+  1234|ABCD
+</pre>
+where no string can be a partial match for both alternatives. This is not a
+problem if a standard matching function is used, because the entire match has
+to be rerun each time:
+<pre>
+    re&#62; /1234|3789/
+  data&#62; ABC123\=ph
+  Partial match: 123
+  data&#62; 1237890
+   0: 3789
+</pre>
+Of course, instead of using PCRE2_DFA_RESTART, the same technique of re-running
+the entire match can also be used with the DFA matching function. Another
+possibility is to work with two buffers. If a partial match at offset <i>n</i>
+in the first buffer is followed by "no match" when PCRE2_DFA_RESTART is used on
+the second buffer, you can then try a new match starting at offset <i>n+1</i> in
+the first buffer.
+</P>
+<br><a name="SEC9" href="#TOC1">AUTHOR</a><br>
+<P>
+Philip Hazel
+<br>
+University Computing Service
+<br>
+Cambridge, England.
+<br>
+</P>
+<br><a name="SEC10" href="#TOC1">REVISION</a><br>
+<P>
+Last updated: 22 December 2014
+<br>
+Copyright &copy; 1997-2014 University of Cambridge.
+<br>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
diff --git a/dist/doc/html/pcrepattern.html b/dist2/doc/html/pcre2pattern.html
similarity index 74%
rename from dist/doc/html/pcrepattern.html
rename to dist2/doc/html/pcre2pattern.html
index 55034a7..c88e931 100644
--- a/dist/doc/html/pcrepattern.html
+++ b/dist2/doc/html/pcre2pattern.html
@@ -1,26 +1,26 @@
 <html>
 <head>
-<title>pcrepattern specification</title>
+<title>pcre2pattern specification</title>
 </head>
 <body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
-<h1>pcrepattern man page</h1>
+<h1>pcre2pattern man page</h1>
 <p>
-Return to the <a href="index.html">PCRE index page</a>.
+Return to the <a href="index.html">PCRE2 index page</a>.
 </p>
 <p>
-This page is part of the PCRE HTML documentation. It was generated automatically
-from the original man page. If there is any nonsense in it, please consult the
-man page, in case the conversion went wrong.
+This page is part of the PCRE2 HTML documentation. It was generated
+automatically from the original man page. If there is any nonsense in it,
+please consult the man page, in case the conversion went wrong.
 <br>
 <ul>
-<li><a name="TOC1" href="#SEC1">PCRE REGULAR EXPRESSION DETAILS</a>
+<li><a name="TOC1" href="#SEC1">PCRE2 REGULAR EXPRESSION DETAILS</a>
 <li><a name="TOC2" href="#SEC2">SPECIAL START-OF-PATTERN ITEMS</a>
 <li><a name="TOC3" href="#SEC3">EBCDIC CHARACTER CODES</a>
 <li><a name="TOC4" href="#SEC4">CHARACTERS AND METACHARACTERS</a>
 <li><a name="TOC5" href="#SEC5">BACKSLASH</a>
 <li><a name="TOC6" href="#SEC6">CIRCUMFLEX AND DOLLAR</a>
 <li><a name="TOC7" href="#SEC7">FULL STOP (PERIOD, DOT) AND \N</a>
-<li><a name="TOC8" href="#SEC8">MATCHING A SINGLE DATA UNIT</a>
+<li><a name="TOC8" href="#SEC8">MATCHING A SINGLE CODE UNIT</a>
 <li><a name="TOC9" href="#SEC9">SQUARE BRACKETS AND CHARACTER CLASSES</a>
 <li><a name="TOC10" href="#SEC10">POSIX CHARACTER CLASSES</a>
 <li><a name="TOC11" href="#SEC11">COMPATIBILITY FEATURE FOR WORD BOUNDARIES</a>
@@ -44,38 +44,37 @@
 <li><a name="TOC29" href="#SEC29">AUTHOR</a>
 <li><a name="TOC30" href="#SEC30">REVISION</a>
 </ul>
-<br><a name="SEC1" href="#TOC1">PCRE REGULAR EXPRESSION DETAILS</a><br>
+<br><a name="SEC1" href="#TOC1">PCRE2 REGULAR EXPRESSION DETAILS</a><br>
 <P>
-The syntax and semantics of the regular expressions that are supported by PCRE
+The syntax and semantics of the regular expressions that are supported by PCRE2
 are described in detail below. There is a quick-reference syntax summary in the
-<a href="pcresyntax.html"><b>pcresyntax</b></a>
-page. PCRE tries to match Perl syntax and semantics as closely as it can. PCRE
-also supports some alternative regular expression syntax (which does not
+<a href="pcre2syntax.html"><b>pcre2syntax</b></a>
+page. PCRE2 tries to match Perl syntax and semantics as closely as it can.
+PCRE2 also supports some alternative regular expression syntax (which does not
 conflict with the Perl syntax) in order to provide some compatibility with
 regular expressions in Python, .NET, and Oniguruma.
 </P>
 <P>
-Perl's regular expressions are described in its own documentation, and
-regular expressions in general are covered 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.
+Perl's regular expressions are described in its own documentation, and regular
+expressions in general are covered 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
+PCRE2's regular expressions is intended as reference material.
 </P>
 <P>
-This document discusses the patterns that are supported by PCRE when one its
-main matching functions, <b>pcre_exec()</b> (8-bit) or <b>pcre[16|32]_exec()</b>
-(16- or 32-bit), is used. PCRE also has alternative matching functions,
-<b>pcre_dfa_exec()</b> and <b>pcre[16|32_dfa_exec()</b>, which match using a
-different algorithm that is not Perl-compatible. Some of the features discussed
-below are not available when DFA matching is used. The advantages and
-disadvantages of the alternative functions, and how they differ from the normal
-functions, are discussed in the
-<a href="pcrematching.html"><b>pcrematching</b></a>
+This document discusses the patterns that are supported by PCRE2 when its main
+matching function, <b>pcre2_match()</b>, is used. PCRE2 also has an alternative
+matching function, <b>pcre2_dfa_match()</b>, which matches using a different
+algorithm that is not Perl-compatible. Some of the features discussed below are
+not available when DFA matching is used. The advantages and disadvantages of
+the alternative function, and how it differs from the normal function, are
+discussed in the
+<a href="pcre2matching.html"><b>pcre2matching</b></a>
 page.
 </P>
 <br><a name="SEC2" href="#TOC1">SPECIAL START-OF-PATTERN ITEMS</a><br>
 <P>
-A number of options that can be passed to <b>pcre_compile()</b> can also be set
+A number of options that can be passed to <b>pcre2_compile()</b> can also be set
 by special items at the start of a pattern. These are not Perl-compatible, but
 are provided to make these options accessible to pattern writers who are not
 able to change the program that processes the pattern. Any number of these
@@ -86,52 +85,59 @@
 UTF support
 </b><br>
 <P>
-The original operation of PCRE was on strings of one-byte characters. However,
-there is now also support for UTF-8 strings in the original library, an
-extra library that supports 16-bit and UTF-16 character strings, and a
-third library that supports 32-bit and UTF-32 character strings. To use these
-features, PCRE must be built to include appropriate support. When using UTF
-strings you must either call the compiling function with the PCRE_UTF8,
-PCRE_UTF16, or PCRE_UTF32 option, or the pattern must start with one of
-these special sequences:
-<pre>
-  (*UTF8)
-  (*UTF16)
-  (*UTF32)
-  (*UTF)
-</pre>
-(*UTF) is a generic sequence that can be used with any of the libraries.
-Starting a pattern with such a sequence is equivalent to setting the relevant
-option. How setting a UTF mode affects pattern matching is mentioned in several
-places below. There is also a summary of features in the
-<a href="pcreunicode.html"><b>pcreunicode</b></a>
+In the 8-bit and 16-bit PCRE2 libraries, characters may be coded either as
+single code units, or as multiple UTF-8 or UTF-16 code units. UTF-32 can be
+specified for the 32-bit library, in which case it constrains the character
+values to valid Unicode code points. To process UTF strings, PCRE2 must be
+built to include Unicode support (which is the default). When using UTF strings
+you must either call the compiling function with the PCRE2_UTF option, or the
+pattern must start with the special sequence (*UTF), which is equivalent to
+setting the relevant option. How setting a UTF mode affects pattern matching is
+mentioned in several places below. There is also a summary of features in the
+<a href="pcre2unicode.html"><b>pcre2unicode</b></a>
 page.
 </P>
 <P>
 Some applications that allow their users to supply patterns may wish to
-restrict them to non-UTF data for security reasons. If the PCRE_NEVER_UTF
-option is set at compile time, (*UTF) etc. are not allowed, and their
-appearance causes an error.
+restrict them to non-UTF data for security reasons. If the PCRE2_NEVER_UTF
+option is passed to <b>pcre2_compile()</b>, (*UTF) is not allowed, and its
+appearance in a pattern causes an error.
 </P>
 <br><b>
 Unicode property support
 </b><br>
 <P>
 Another special sequence that may appear at the start of a pattern is (*UCP).
-This has the same effect as setting the PCRE_UCP option: it causes sequences
+This has the same effect as setting the PCRE2_UCP option: it causes sequences
 such as \d and \w to use Unicode properties to determine character types,
-instead of recognizing only characters with codes less than 128 via a lookup
+instead of recognizing only characters with codes less than 256 via a lookup
 table.
 </P>
+<P>
+Some applications that allow their users to supply patterns may wish to
+restrict them for security reasons. If the PCRE2_NEVER_UCP option is passed to
+<b>pcre2_compile()</b>, (*UCP) is not allowed, and its appearance in a pattern
+causes an error.
+</P>
+<br><b>
+Locking out empty string matching
+</b><br>
+<P>
+Starting a pattern with (*NOTEMPTY) or (*NOTEMPTY_ATSTART) has the same effect
+as passing the PCRE2_NOTEMPTY or PCRE2_NOTEMPTY_ATSTART option to whichever
+matching function is subsequently called to match the pattern. These options
+lock out the matching of empty strings, either entirely, or only at the start
+of the subject.
+</P>
 <br><b>
 Disabling auto-possessification
 </b><br>
 <P>
 If a pattern starts with (*NO_AUTO_POSSESS), it has the same effect as setting
-the PCRE_NO_AUTO_POSSESS option at compile time. This stops PCRE from making
-quantifiers possessive when what follows cannot match the repeated item. For
-example, by default a+b is treated as a++b. For more details, see the
-<a href="pcreapi.html"><b>pcreapi</b></a>
+the PCRE2_NO_AUTO_POSSESS option. This stops PCRE2 from making quantifiers
+possessive when what follows cannot match the repeated item. For example, by
+default a+b is treated as a++b. For more details, see the
+<a href="pcre2api.html"><b>pcre2api</b></a>
 documentation.
 </P>
 <br><b>
@@ -139,25 +145,65 @@
 </b><br>
 <P>
 If a pattern starts with (*NO_START_OPT), it has the same effect as setting the
-PCRE_NO_START_OPTIMIZE option either at compile or matching time. This disables
-several optimizations for quickly reaching "no match" results. For more
-details, see the
-<a href="pcreapi.html"><b>pcreapi</b></a>
+PCRE2_NO_START_OPTIMIZE option. This disables several optimizations for quickly
+reaching "no match" results. For more details, see the
+<a href="pcre2api.html"><b>pcre2api</b></a>
 documentation.
+</P>
+<br><b>
+Disabling automatic anchoring
+</b><br>
+<P>
+If a pattern starts with (*NO_DOTSTAR_ANCHOR), it has the same effect as
+setting the PCRE2_NO_DOTSTAR_ANCHOR option. This disables optimizations that
+apply to patterns whose top-level branches all start with .* (match any number
+of arbitrary characters). For more details, see the
+<a href="pcre2api.html"><b>pcre2api</b></a>
+documentation.
+</P>
+<br><b>
+Disabling JIT compilation
+</b><br>
+<P>
+If a pattern that starts with (*NO_JIT) is successfully compiled, an attempt by
+the application to apply the JIT optimization by calling
+<b>pcre2_jit_compile()</b> is ignored.
+</P>
+<br><b>
+Setting match and recursion limits
+</b><br>
+<P>
+The caller of <b>pcre2_match()</b> can set a limit on the number of times the
+internal <b>match()</b> function is called and on the maximum depth of
+recursive calls. These facilities are provided to catch runaway matches that
+are provoked by patterns with huge matching trees (a typical example is a
+pattern with nested unlimited repeats) and to avoid running out of system stack
+by too much recursion. When one of these limits is reached, <b>pcre2_match()</b>
+gives an error return. The limits can also be set by items at the start of the
+pattern of the form
+<pre>
+  (*LIMIT_MATCH=d)
+  (*LIMIT_RECURSION=d)
+</pre>
+where d is any number of decimal digits. However, the value of the setting must
+be less than the value set (or defaulted) by the caller of <b>pcre2_match()</b>
+for it to have any effect. In other words, the pattern writer can lower the
+limits set by the programmer, but not raise them. If there is more than one
+setting of one of these limits, the lower value is used.
 <a name="newlines"></a></P>
 <br><b>
 Newline conventions
 </b><br>
 <P>
-PCRE supports five different conventions for indicating line breaks in
+PCRE2 supports five different conventions for indicating line breaks in
 strings: a single CR (carriage return) character, a single LF (linefeed)
 character, the two-character sequence CRLF, any of the three preceding, or any
 Unicode newline sequence. The
-<a href="pcreapi.html"><b>pcreapi</b></a>
+<a href="pcre2api.html"><b>pcre2api</b></a>
 page has
-<a href="pcreapi.html#newlines">further discussion</a>
-about newlines, and shows how to set the newline convention in the
-<i>options</i> arguments for the compiling and matching functions.
+<a href="pcre2api.html#newlines">further discussion</a>
+about newlines, and shows how to set the newline convention when calling
+<b>pcre2_compile()</b>.
 </P>
 <P>
 It is also possible to specify a newline convention by starting a pattern
@@ -181,7 +227,7 @@
 <P>
 The newline convention affects where the circumflex and dollar assertions are
 true. It also affects the interpretation of the dot metacharacter when
-PCRE_DOTALL is not set, and the behaviour of \N. However, it does not affect
+PCRE2_DOTALL is not set, and the behaviour of \N. However, it does not affect
 what the \R escape sequence matches. By default, this is any Unicode newline
 sequence, for Perl compatibility. However, this can be changed; see the
 description of \R in the section entitled
@@ -190,32 +236,20 @@
 convention.
 </P>
 <br><b>
-Setting match and recursion limits
+Specifying what \R matches
 </b><br>
 <P>
-The caller of <b>pcre_exec()</b> can set a limit on the number of times the
-internal <b>match()</b> function is called and on the maximum depth of
-recursive calls. These facilities are provided to catch runaway matches that
-are provoked by patterns with huge matching trees (a typical example is a
-pattern with nested unlimited repeats) and to avoid running out of system stack
-by too much recursion. When one of these limits is reached, <b>pcre_exec()</b>
-gives an error return. The limits can also be set by items at the start of the
-pattern of the form
-<pre>
-  (*LIMIT_MATCH=d)
-  (*LIMIT_RECURSION=d)
-</pre>
-where d is any number of decimal digits. However, the value of the setting must
-be less than the value set (or defaulted) by the caller of <b>pcre_exec()</b>
-for it to have any effect. In other words, the pattern writer can lower the
-limits set by the programmer, but not raise them. If there is more than one
-setting of one of these limits, the lower value is used.
+It is possible to restrict \R to match only CR, LF, or CRLF (instead of the
+complete set of Unicode line endings) by setting the option PCRE2_BSR_ANYCRLF
+at compile time. This effect can also be achieved by starting a pattern with
+(*BSR_ANYCRLF). For completeness, (*BSR_UNICODE) is also recognized,
+corresponding to PCRE2_BSR_UNICODE.
 </P>
 <br><a name="SEC3" href="#TOC1">EBCDIC CHARACTER CODES</a><br>
 <P>
-PCRE can be compiled to run in an environment that uses EBCDIC as its character
-code rather than ASCII or Unicode (typically a mainframe system). In the
-sections below, character code values are ASCII or Unicode; in an EBCDIC
+PCRE2 can be compiled to run in an environment that uses EBCDIC as its
+character code rather than ASCII or Unicode (typically a mainframe system). In
+the sections below, character code values are ASCII or Unicode; in an EBCDIC
 environment these characters may have different code values, and there are no
 code points greater than 255.
 </P>
@@ -228,14 +262,8 @@
   The quick brown fox
 </pre>
 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 a UTF 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 support.
+caseless matching is specified (the PCRE2_CASELESS option), letters are matched
+independently of case.
 </P>
 <P>
 The power of regular expressions comes from the ability to include alternatives
@@ -296,19 +324,19 @@
 greater than 127) are treated as literals.
 </P>
 <P>
-If a pattern is compiled with the PCRE_EXTENDED option, most white space in the
-pattern (other than in a character class), and characters between a # outside a
-character class and the next newline, inclusive, are ignored. An escaping
-backslash can be used to include a white space or # character as part of the
-pattern.
+If a pattern is compiled with the PCRE2_EXTENDED option, most white space in
+the pattern (other than in a character class), and characters between a #
+outside a character class and the next newline, inclusive, are ignored. An
+escaping backslash can be used to include a white space or # character as part
+of the pattern.
 </P>
 <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
-Perl, $ and @ cause variable interpolation. Note the following examples:
+that $ and @ are handled as literals in \Q...\E sequences in PCRE2, whereas
+in Perl, $ and @ cause variable interpolation. Note the following examples:
 <pre>
-  Pattern            PCRE matches   Perl matches
+  Pattern            PCRE2 matches   Perl matches
 
   \Qabc$xyz\E        abc$xyz        abc followed by the contents of $xyz
   \Qabc\$xyz\E       abc\$xyz       abc\$xyz
@@ -327,13 +355,13 @@
 <P>
 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 often easier to use
-one of the following escape sequences than the binary character it represents.
-In an ASCII or Unicode environment, these escapes are as follows:
+non-printing characters in a pattern, but when a pattern is being prepared by
+text editing, it is often easier to use one of the following escape sequences
+than the binary character it represents. In an ASCII or Unicode environment,
+these escapes are as follows:
 <pre>
   \a        alarm, that is, the BEL character (hex 07)
-  \cx       "control-x", where x is any ASCII character
+  \cx       "control-x", where x is any printable ASCII character
   \e        escape (hex 1B)
   \f        form feed (hex 0C)
   \n        linefeed (hex 0A)
@@ -343,18 +371,19 @@
   \ddd      character with octal code ddd, or back reference
   \o{ddd..} character with octal code ddd..
   \xhh      character with hex code hh
-  \x{hhh..} character with hex code hhh.. (non-JavaScript mode)
-  \uhhhh    character with hex code hhhh (JavaScript mode only)
+  \x{hhh..} character with hex code hhh.. (default mode)
+  \uhhhh    character with hex code hhhh (when PCRE2_ALT_BSUX is set)
 </pre>
 The precise effect of \cx on ASCII characters 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 \cA to \cZ become hex 01 to hex 1A (A is 41, Z is 5A),
 but \c{ becomes hex 3B ({ is 7B), and \c; becomes hex 7B (; is 3B). If the
-data item (byte or 16-bit value) following \c has a value greater than 127, a
-compile-time error occurs. This locks out non-ASCII characters in all modes.
+code unit following \c has a value less than 32 or greater than 126, a
+compile-time error occurs. This locks out non-printable ASCII characters in all
+modes.
 </P>
 <P>
-When PCRE is compiled in EBCDIC mode, \a, \e, \f, \n, \r, and \t
+When PCRE2 is compiled in EBCDIC mode, \a, \e, \f, \n, \r, and \t
 generate the appropriate EBCDIC code values. The \c escape is processed
 as specified for Perl in the <b>perlebcdic</b> document. The only characters
 that are allowed after \c are A-Z, a-z, or one of @, [, \, ], ^, _, or ?. Any
@@ -375,7 +404,7 @@
 APC character. Unfortunately, there are several variants of EBCDIC. In most of
 them the APC character has the value 255 (hex FF), but in the one Perl calls
 POSIX-BC its value is 95 (hex 5F). If certain other characters have POSIX-BC
-values, PCRE makes \? generate 95; otherwise it generates 255.
+values, PCRE2 makes \? generate 95; otherwise it generates 255.
 </P>
 <P>
 After \0 up to two further octal digits are read. If there are fewer than two
@@ -399,21 +428,24 @@
 </P>
 <P>
 The handling of a backslash followed by a digit other than 0 is complicated,
-and Perl has changed in recent releases, causing PCRE also to change. Outside a
-character class, PCRE reads the digit and any following digits as a decimal
-number. If the number is less than 8, or if there have been at least that many
-previous capturing left parentheses in the expression, the entire sequence is
-taken as a <i>back reference</i>. A description of how this works is given
+and Perl has changed over time, causing PCRE2 also to change.
+</P>
+<P>
+Outside a character class, PCRE2 reads the digit and any following digits as a
+decimal number. If the number is less than 10, begins with the digit 8 or 9, or
+if there are at least that many previous capturing left parentheses in the
+expression, the entire sequence is taken as a <i>back reference</i>. A
+description of how this works is given
 <a href="#backreferences">later,</a>
 following the discussion of
 <a href="#subpattern">parenthesized subpatterns.</a>
+Otherwise, up to three octal digits are read to form a character code.
 </P>
 <P>
-Inside a character class, or if the decimal number following \ is greater than
-7 and there have not been that many capturing subpatterns, PCRE handles \8 and
-\9 as the literal characters "8" and "9", and otherwise re-reads up to three
-octal digits following the backslash, using them to generate a data character.
-Any subsequent digits stand for themselves. For example:
+Inside a character class, PCRE2 handles \8 and \9 as the literal characters
+"8" and "9", and otherwise reads up to three octal digits following the
+backslash, using them to generate a data character. Any subsequent digits stand
+for themselves. For example, outside a character class:
 <pre>
   \040   is another way of writing an ASCII space
   \40    is the same, provided there are fewer than 40 previous capturing subpatterns
@@ -423,7 +455,7 @@
   \0113  is a tab followed by the character "3"
   \113   might be a back reference, otherwise the character with octal code 113
   \377   might be a back reference, otherwise the value 255 (decimal)
-  \81    is either a back reference, or the two characters "8" and "1"
+  \81    is always a back reference .sp
 </pre>
 Note that octal values of 100 or greater that are specified using this syntax
 must not be introduced by a leading zero, because no more than three octal
@@ -437,17 +469,17 @@
 }, an error occurs.
 </P>
 <P>
-If the PCRE_JAVASCRIPT_COMPAT option is set, the interpretation of \x is
-as just described only when it is followed by two hexadecimal digits.
-Otherwise, it matches a literal "x" character. In JavaScript mode, support for
-code points greater than 256 is provided by \u, which must be followed by
-four hexadecimal digits; otherwise it matches a literal "u" character.
+If the PCRE2_ALT_BSUX option is set, the interpretation of \x is as just
+described only when it is followed by two hexadecimal digits. Otherwise, it
+matches a literal "x" character. In this mode mode, support for code points
+greater than 256 is provided by \u, which must be followed by four hexadecimal
+digits; otherwise it matches a literal "u" character.
 </P>
 <P>
 Characters whose value is less than 256 can be defined by either of the two
-syntaxes for \x (or by \u in JavaScript mode). There is no difference in the
-way they are handled. For example, \xdc is exactly the same as \x{dc} (or
-\u00dc in JavaScript mode).
+syntaxes for \x (or by \u in PCRE2_ALT_BSUX mode). There is no difference in
+the way they are handled. For example, \xdc is exactly the same as \x{dc} (or
+\u00dc in PCRE2_ALT_BSUX mode).
 </P>
 <br><b>
 Constraints on character values
@@ -476,20 +508,19 @@
 </P>
 <P>
 \N is not allowed in a character class. \B, \R, and \X are not special
-inside a character class. Like other unrecognized escape sequences, they are
-treated as the literal characters "B", "R", and "X" by default, but cause an
-error if the PCRE_EXTRA option is set. Outside a character class, these
-sequences have different meanings.
+inside a character class. Like other unrecognized alphabetic escape sequences,
+they cause an error. Outside a character class, these sequences have different
+meanings.
 </P>
 <br><b>
 Unsupported escape sequences
 </b><br>
 <P>
 In Perl, the sequences \l, \L, \u, and \U are recognized by its string
-handler and used to modify the case of following characters. By default, PCRE
-does not support these escape sequences. However, if the PCRE_JAVASCRIPT_COMPAT
-option is set, \U matches a "U" character, and \u can be used to define a
-character by code point, as described in the previous section.
+handler and used to modify the case of following characters. By default, PCRE2
+does not support these escape sequences. However, if the PCRE2_ALT_BSUX option
+is set, \U matches a "U" character, and \u can be used to define a character
+by code point, as described in the previous section.
 </P>
 <br><b>
 Absolute and relative back references
@@ -535,8 +566,8 @@
 There is also the single sequence \N, which matches a non-newline character.
 This is the same as
 <a href="#fullstopdot">the "." metacharacter</a>
-when PCRE_DOTALL is not set. Perl also uses \N to match characters by name;
-PCRE does not support this.
+when PCRE2_DOTALL is not set. Perl also uses \N to match characters by name;
+PCRE2 does not support this.
 </P>
 <P>
 Each pair of lower and upper case escape sequences partitions the complete set
@@ -547,23 +578,20 @@
 there is no character to match.
 </P>
 <P>
-For compatibility with Perl, \s did not used to match the VT character (code
-11), which made it different from the the POSIX "space" class. However, Perl
-added VT at release 5.18, and PCRE followed suit at release 8.34. The default
-\s characters are now HT (9), LF (10), VT (11), FF (12), CR (13), and space
-(32), which are defined as white space in the "C" locale. This list may vary if
-locale-specific matching is taking place. For example, in some locales the
-"non-breaking space" character (\xA0) is recognized as white space, and in
+The default \s characters are HT (9), LF (10), VT (11), FF (12), CR (13), and
+space (32), which are defined as white space in the "C" locale. This list may
+vary if locale-specific matching is taking place. For example, in some locales
+the "non-breaking space" character (\xA0) is recognized as white space, and in
 others the VT character is not.
 </P>
 <P>
 A "word" character is an underscore or any character that is a letter or digit.
-By default, the definition of letters and digits is controlled by PCRE's
+By default, the definition of letters and digits is controlled by PCRE2's
 low-valued character tables, and may vary if locale-specific matching is taking
 place (see
-<a href="pcreapi.html#localesupport">"Locale support"</a>
+<a href="pcre2api.html#localesupport">"Locale support"</a>
 in the
-<a href="pcreapi.html"><b>pcreapi</b></a>
+<a href="pcre2api.html"><b>pcre2api</b></a>
 page). For example, in a French locale such as "fr_FR" in Unix-like systems,
 or "french" in Windows, some character codes greater than 127 are used for
 accented letters, and these are then matched by \w. The use of locales with
@@ -571,13 +599,12 @@
 </P>
 <P>
 By default, characters whose code points are greater than 127 never match \d,
-\s, or \w, and always match \D, \S, and \W, although this may vary for
-characters in the range 128-255 when locale-specific matching is happening.
+\s, or \w, and always match \D, \S, and \W, although this may be different
+for characters in the range 128-255 when locale-specific matching is happening.
 These escape sequences retain their original meanings from before Unicode
-support was available, mainly for efficiency reasons. If PCRE is compiled with
-Unicode property support, and the PCRE_UCP option is set, the behaviour is
-changed so that Unicode properties are used to determine character types, as
-follows:
+support was available, mainly for efficiency reasons. If the PCRE2_UCP option
+is set, the behaviour is changed so that Unicode properties are used to
+determine character types, as follows:
 <pre>
   \d  any character that matches \p{Nd} (decimal digit)
   \s  any character that matches \p{Z} or \h or \v
@@ -585,15 +612,14 @@
 </pre>
 The upper case escapes match the inverse sets of characters. Note that \d
 matches only decimal digits, whereas \w matches any Unicode digit, as well as
-any Unicode letter, and underscore. Note also that PCRE_UCP affects \b, and
+any Unicode letter, and underscore. Note also that PCRE2_UCP affects \b, and
 \B because they are defined in terms of \w and \W. Matching these sequences
-is noticeably slower when PCRE_UCP is set.
+is noticeably slower when PCRE2_UCP is set.
 </P>
 <P>
-The sequences \h, \H, \v, and \V are features that were added to Perl at
-release 5.10. In contrast to the other sequences, which match only ASCII
-characters by default, these always match certain high-valued code points,
-whether or not PCRE_UCP is set. The horizontal space characters are:
+The sequences \h, \H, \v, and \V, in contrast to the other sequences, which
+match only ASCII characters by default, always match a specific list of code
+points, whether or not PCRE2_UCP is set. The horizontal space characters are:
 <pre>
   U+0009     Horizontal tab (HT)
   U+0020     Space
@@ -625,8 +651,8 @@
   U+2028     Line separator
   U+2029     Paragraph separator
 </pre>
-In 8-bit, non-UTF-8 mode, only the characters with codepoints less than 256 are
-relevant.
+In 8-bit, non-UTF-8 mode, only the characters with code points less than 256
+are relevant.
 <a name="newlineseq"></a></P>
 <br><b>
 Newline sequences
@@ -643,48 +669,45 @@
 This particular group matches either the two-character sequence CR followed by
 LF, or one of the single characters LF (linefeed, U+000A), VT (vertical tab,
 U+000B), FF (form feed, U+000C), CR (carriage return, U+000D), or NEL (next
-line, U+0085). The two-character sequence is treated as a single unit that
-cannot be split.
+line, U+0085). Because this is an atomic group, the two-character sequence is
+treated as a single unit that cannot be split.
 </P>
 <P>
 In other modes, two additional characters whose codepoints are greater than 255
 are added: LS (line separator, U+2028) and PS (paragraph separator, U+2029).
-Unicode character property support is not needed for these characters to be
-recognized.
+Unicode support is not needed for these characters to be recognized.
 </P>
 <P>
 It is possible to restrict \R to match only CR, LF, or CRLF (instead of the
-complete set of Unicode line endings) by setting the option PCRE_BSR_ANYCRLF
-either at compile time or when the pattern is matched. (BSR is an abbrevation
-for "backslash R".) This can be made the default when PCRE is built; if this is
-the case, the other behaviour can be requested via the PCRE_BSR_UNICODE option.
-It is also possible to specify these settings by starting a pattern string with
-one of the following sequences:
+complete set of Unicode line endings) by setting the option PCRE2_BSR_ANYCRLF
+at compile time. (BSR is an abbrevation for "backslash R".) This can be made
+the default when PCRE2 is built; if this is the case, the other behaviour can
+be requested via the PCRE2_BSR_UNICODE option. It is also possible to specify
+these settings by starting a pattern string with one of the following
+sequences:
 <pre>
   (*BSR_ANYCRLF)   CR, LF, or CRLF only
   (*BSR_UNICODE)   any Unicode newline sequence
 </pre>
-These override the default and the options given to the compiling function, but
-they can themselves be overridden by options given to a matching function. Note
-that these special settings, which are not Perl-compatible, are recognized only
-at the very start of a pattern, and that they must be in upper case. If more
-than one of them is present, the last one is used. They can be combined with a
-change of newline convention; for example, a pattern can start with:
+These override the default and the options given to the compiling function.
+Note that these special settings, which are not Perl-compatible, are recognized
+only at the very start of a pattern, and that they must be in upper case. If
+more than one of them is present, the last one is used. They can be combined
+with a change of newline convention; for example, a pattern can start with:
 <pre>
   (*ANY)(*BSR_ANYCRLF)
 </pre>
-They can also be combined with the (*UTF8), (*UTF16), (*UTF32), (*UTF) or
-(*UCP) special sequences. Inside a character class, \R is treated as an
-unrecognized escape sequence, and so matches the letter "R" by default, but
-causes an error if PCRE_EXTRA is set.
+They can also be combined with the (*UTF) or (*UCP) special sequences. Inside a
+character class, \R is treated as an unrecognized escape sequence, and causes
+an error.
 <a name="uniextseq"></a></P>
 <br><b>
 Unicode character properties
 </b><br>
 <P>
-When PCRE is built with Unicode character property support, three additional
-escape sequences that match characters with specific properties are available.
-When in 8-bit non-UTF-8 mode, these sequences are of course limited to testing
+When PCRE2 is built with Unicode support (the default), three additional escape
+sequences that match characters with specific properties are available. In
+8-bit non-UTF-8 mode, these sequences are of course limited to testing
 characters whose codepoints are less than 256, but they do work in this mode.
 The extra escape sequences are:
 <pre>
@@ -694,12 +717,12 @@
 </pre>
 The property names represented by <i>xx</i> above are limited to the Unicode
 script names, the general category properties, "Any", which matches any
-character (including newline), and some special PCRE properties (described
+character (including newline), and some special PCRE2 properties (described
 in the
 <a href="#extraprops">next section).</a>
-Other Perl properties such as "InMusicalSymbols" are not currently supported by
-PCRE. Note that \P{Any} does not match any characters, so always causes a
-match failure.
+Other Perl properties such as "InMusicalSymbols" are not supported by PCRE2.
+Note that \P{Any} does not match any characters, so always causes a match
+failure.
 </P>
 <P>
 Sets of Unicode characters are defined as belonging to certain scripts. A
@@ -713,6 +736,8 @@
 "Common". The current list of scripts is:
 </P>
 <P>
+Ahom,
+Anatolian_Hieroglyphs,
 Arabic,
 Armenian,
 Avestan,
@@ -753,6 +778,7 @@
 Han,
 Hangul,
 Hanunoo,
+Hatran,
 Hebrew,
 Hiragana,
 Imperial_Aramaic,
@@ -789,12 +815,14 @@
 Modi,
 Mongolian,
 Mro,
+Multani,
 Myanmar,
 Nabataean,
 New_Tai_Lue,
 Nko,
 Ogham,
 Ol_Chiki,
+Old_Hungarian,
 Old_Italic,
 Old_North_Arabian,
 Old_Permic,
@@ -816,6 +844,7 @@
 Sharada,
 Shavian,
 Siddham,
+SignWriting,
 Sinhala,
 Sora_Sompeng,
 Sundanese,
@@ -907,15 +936,14 @@
 <P>
 The Cs (Surrogate) property applies only to characters in the range U+D800 to
 U+DFFF. Such characters are not valid in Unicode strings and so
-cannot be tested by PCRE, unless UTF validity checking has been turned off
-(see the discussion of PCRE_NO_UTF8_CHECK, PCRE_NO_UTF16_CHECK and
-PCRE_NO_UTF32_CHECK in the
-<a href="pcreapi.html"><b>pcreapi</b></a>
+cannot be tested by PCRE2, unless UTF validity checking has been turned off
+(see the discussion of PCRE2_NO_UTF_CHECK in the
+<a href="pcre2api.html"><b>pcre2api</b></a>
 page). Perl does not support the Cs property.
 </P>
 <P>
 The long synonyms for property names that Perl supports (such as \p{Letter})
-are not supported by PCRE, nor is it permitted to prefix any of these
+are not supported by PCRE2, nor is it permitted to prefix any of these
 properties with "Is".
 </P>
 <P>
@@ -929,11 +957,11 @@
 the behaviour of current versions of Perl.
 </P>
 <P>
-Matching characters by Unicode property is not fast, because PCRE has to do a
+Matching characters by Unicode property is not fast, because PCRE2 has to do a
 multistage table lookup in order to find a character's property. That is why
 the traditional escape sequences such as \d and \w do not use Unicode
-properties in PCRE by default, though you can make them do so by setting the
-PCRE_UCP option or by starting the pattern with (*UCP).
+properties in PCRE2 by default, though you can make them do so by setting the
+PCRE2_UCP option or by starting the pattern with (*UCP).
 </P>
 <br><b>
 Extended grapheme clusters
@@ -942,25 +970,11 @@
 The \X escape matches any number of Unicode characters that form an "extended
 grapheme cluster", and treats the sequence as an atomic group
 <a href="#atomicgroup">(see below).</a>
-Up to and including release 8.31, PCRE matched an earlier, simpler definition
-that was equivalent to
-<pre>
-  (?&#62;\PM\pM*)
-</pre>
-That is, it matched a character without the "mark" property, followed by zero
-or more characters with the "mark" property. Characters with the "mark"
-property are typically non-spacing accents that affect the preceding character.
-</P>
-<P>
-This simple definition was extended in Unicode to include more complicated
-kinds of composite character by giving each character a grapheme breaking
-property, and creating rules that use these properties to define the boundaries
-of extended grapheme clusters. In releases of PCRE later than 8.31, \X matches
-one of these clusters.
-</P>
-<P>
-\X always matches at least one character. Then it decides whether to add
-additional characters according to the following rules for ending a cluster:
+Unicode supports various kinds of composite character by giving each character
+a grapheme breaking property, and having rules that use these properties to
+define the boundaries of extended grapheme clusters. \X always matches at
+least one character. Then it decides whether to add additional characters
+according to the following rules for ending a cluster:
 </P>
 <P>
 1. End at the end of the subject string.
@@ -985,13 +999,13 @@
 6. Otherwise, end the cluster.
 <a name="extraprops"></a></P>
 <br><b>
-PCRE's additional properties
+PCRE2's additional properties
 </b><br>
 <P>
-As well as the standard Unicode properties described above, PCRE supports four
+As well as the standard Unicode properties described above, PCRE2 supports four
 more that make it possible to convert traditional escape sequences such as \w
-and \s to use Unicode properties. PCRE uses these non-standard, non-Perl
-properties internally when PCRE_UCP is set. However, they may also be used
+and \s to use Unicode properties. PCRE2 uses these non-standard, non-Perl
+properties internally when PCRE2_UCP is set. However, they may also be used
 explicitly. These properties are:
 <pre>
   Xan   Any alphanumeric character
@@ -1002,9 +1016,9 @@
 Xan matches characters that have either the L (letter) or the N (number)
 property. Xps matches the characters tab, linefeed, vertical tab, form feed, or
 carriage return, and any other character that has the Z (separator) property.
-Xsp is the same as Xps; it used to exclude vertical tab, for Perl
-compatibility, but Perl changed, and so PCRE followed at release 8.34. Xwd
-matches the same characters as Xan, plus underscore.
+Xsp is the same as Xps; in PCRE1 it used to exclude vertical tab, for Perl
+compatibility, but Perl changed. Xwd matches the same characters as Xan, plus
+underscore.
 </P>
 <P>
 There is another non-standard property, Xuc, which matches any character that
@@ -1040,7 +1054,7 @@
 </P>
 <P>
 Perl documents that the use of \K within assertions is "not well defined". In
-PCRE, \K is acted upon when it occurs inside positive assertions, but is
+PCRE2, \K is acted upon when it occurs inside positive assertions, but is
 ignored in negative assertions. Note that when a pattern such as (?=ab\K)
 matches, the reported start of the match can be greater than the end of the
 match.
@@ -1065,18 +1079,16 @@
   \G     matches at the first matching position in the subject
 </pre>
 Inside a character class, \b has a different meaning; it matches the backspace
-character. If any other of these assertions appears in a character class, by
-default it matches the corresponding literal character (for example, \B
-matches the letter B). However, if the PCRE_EXTRA option is set, an "invalid
-escape sequence" error is generated instead.
+character. If any other of these assertions appears in a character class, an
+"invalid escape sequence" error is generated.
 </P>
 <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. In a UTF mode, the meanings
-of \w and \W can be changed by setting the PCRE_UCP option. When this is
-done, it also affects \b and \B. Neither PCRE nor Perl has a separate "start
+of \w and \W can be changed by setting the PCRE2_UCP option. When this is
+done, it also affects \b and \B. Neither PCRE2 nor Perl has a separate "start
 of word" or "end of word" metasequence. However, whatever follows \b normally
 determines which it is. For example, the fragment \ba matches "a" at the start
 of a word.
@@ -1086,26 +1098,27 @@
 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
+PCRE2_NOTBOL or PCRE2_NOTEOL options, which affect only the behaviour of the
 circumflex and dollar metacharacters. However, if the <i>startoffset</i>
-argument of <b>pcre_exec()</b> 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 at the end
-of the string as well as at the very end, whereas \z matches only at the end.
+argument of <b>pcre2_match()</b> 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 at the
+end of the string as well as at the very end, whereas \z matches only at the
+end.
 </P>
 <P>
 The \G assertion is true only when the current matching position is at the
 start point of the match, as specified by the <i>startoffset</i> argument of
-<b>pcre_exec()</b>. It differs from \A when the value of <i>startoffset</i> is
-non-zero. By calling <b>pcre_exec()</b> multiple times with appropriate
+<b>pcre2_match()</b>. It differs from \A when the value of <i>startoffset</i> is
+non-zero. By calling <b>pcre2_match()</b> 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.
 </P>
 <P>
-Note, however, that PCRE's interpretation of \G, as the start of the current
+Note, however, that PCRE2's interpretation of \G, 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
+string was empty. Because PCRE2 does just one match at a time, it cannot
 reproduce this behaviour.
 </P>
 <P>
@@ -1117,15 +1130,19 @@
 <P>
 The circumflex and dollar metacharacters are zero-width assertions. That is,
 they test for a particular condition being true without consuming any
-characters from the subject string.
+characters from the subject string. These two metacharacters are concerned with
+matching the starts and ends of lines. If the newline convention is set so that
+only the two-character sequence CRLF is recognized as a newline, isolated CR
+and LF characters are treated as ordinary data characters, and are not
+recognized as newlines.
 </P>
 <P>
 Outside a character class, in the default matching mode, the circumflex
 character is an assertion that is true only if the current matching point is at
 the start of the subject string. If the <i>startoffset</i> argument of
-<b>pcre_exec()</b> is non-zero, circumflex can never match if the PCRE_MULTILINE
-option is unset. Inside a character class, circumflex has an entirely different
-meaning
+<b>pcre2_match()</b> is non-zero, or if PCRE2_NOTBOL is set, circumflex can
+never match if the PCRE2_MULTILINE option is unset. Inside a character class,
+circumflex has an entirely different meaning
 <a href="#characterclass">(see below).</a>
 </P>
 <P>
@@ -1140,37 +1157,48 @@
 <P>
 The 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 at
-the end of the string (by default). Note, however, that it does not actually
-match the newline. 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.
+the end of the string (by default), unless PCRE2_NOTEOL is set. Note, however,
+that it does not actually match the newline. 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>
 <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
+the string, by setting the PCRE2_DOLLAR_ENDONLY option at compile time. This
 does not affect the \Z assertion.
 </P>
 <P>
-The meanings of the circumflex and dollar characters are changed if the
-PCRE_MULTILINE option is set. When this is the case, a circumflex matches
-immediately after internal newlines as well as at the start of the subject
-string. It does not match after a newline that ends the string. A dollar
-matches before any newlines in the string, as well as at the very end, when
-PCRE_MULTILINE is set. When newline is specified as the two-character
-sequence CRLF, isolated CR and LF characters do not indicate newlines.
+The meanings of the circumflex and dollar metacharacters are changed if the
+PCRE2_MULTILINE option is set. When this is the case, a dollar character
+matches before any newlines in the string, as well as at the very end, and a
+circumflex matches immediately after internal newlines as well as at the start
+of the subject string. It does not match after a newline that ends the string,
+for compatibility with Perl. However, this can be changed by setting the
+PCRE2_ALT_CIRCUMFLEX option.
 </P>
 <P>
 For example, the pattern /^abc$/ matches the subject string "def\nabc" (where
 \n represents a newline) 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 <i>startoffset</i> argument of <b>pcre_exec()</b> is non-zero. The
-PCRE_DOLLAR_ENDONLY option is ignored if PCRE_MULTILINE is set.
+when the <i>startoffset</i> argument of <b>pcre2_match()</b> is non-zero. The
+PCRE2_DOLLAR_ENDONLY option is ignored if PCRE2_MULTILINE is set.
+</P>
+<P>
+When the newline convention (see
+<a href="#newlines">"Newline conventions"</a>
+below) recognizes the two-character sequence CRLF as a newline, this is
+preferred, even if the single characters CR and LF are also recognized as
+newlines. For example, if the newline convention is "any", a multiline mode
+circumflex matches before "xyz" in the string "abc\r\nxyz" rather than after
+CR, even though CR on its own is a valid newline. (It also matches at the very
+start of the string, of course.)
 </P>
 <P>
 Note that the sequences \A, \Z, and \z 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 or not PCRE_MULTILINE is set.
+\A it is always anchored, whether or not PCRE2_MULTILINE is set.
 <a name="fullstopdot"></a></P>
 <br><a name="SEC7" href="#TOC1">FULL STOP (PERIOD, DOT) AND \N</a><br>
 <P>
@@ -1187,10 +1215,10 @@
 characters.
 </P>
 <P>
-The behaviour of dot with regard to newlines can be changed. If the PCRE_DOTALL
-option is set, a dot matches any one character, without exception. If the
-two-character sequence CRLF is present in the subject string, it takes two dots
-to match it.
+The behaviour of dot with regard to newlines can be changed. If the
+PCRE2_DOTALL option is set, a dot matches any one character, without exception.
+If the two-character sequence CRLF is present in the subject string, it takes
+two dots to match it.
 </P>
 <P>
 The handling of dot is entirely independent of the handling of circumflex and
@@ -1199,67 +1227,77 @@
 </P>
 <P>
 The escape sequence \N behaves like a dot, except that it is not affected by
-the PCRE_DOTALL option. In other words, it matches any character except one
+the PCRE2_DOTALL option. In other words, it matches any character except one
 that signifies the end of a line. Perl also uses \N to match characters by
-name; PCRE does not support this.
+name; PCRE2 does not support this.
 </P>
-<br><a name="SEC8" href="#TOC1">MATCHING A SINGLE DATA UNIT</a><br>
+<br><a name="SEC8" href="#TOC1">MATCHING A SINGLE CODE UNIT</a><br>
 <P>
-Outside a character class, the escape sequence \C matches any one data unit,
-whether or not a UTF mode is set. In the 8-bit library, one data unit is one
-byte; in the 16-bit library it is a 16-bit unit; in the 32-bit library it is
-a 32-bit unit. Unlike a dot, \C always
-matches line-ending characters. The feature is provided in Perl in order to
-match individual bytes in UTF-8 mode, but it is unclear how it can usefully be
-used. Because \C breaks up characters into individual data units, matching one
-unit with \C in a UTF mode means that the rest of the string may start with a
-malformed UTF character. This has undefined results, because PCRE assumes that
-it is dealing with valid UTF strings (and by default it checks this at the
-start of processing unless the PCRE_NO_UTF8_CHECK, PCRE_NO_UTF16_CHECK or
-PCRE_NO_UTF32_CHECK option is used).
+Outside a character class, the escape sequence \C matches any one code unit,
+whether or not a UTF mode is set. In the 8-bit library, one code unit is one
+byte; in the 16-bit library it is a 16-bit unit; in the 32-bit library it is a
+32-bit unit. Unlike a dot, \C always matches line-ending characters. The
+feature is provided in Perl in order to match individual bytes in UTF-8 mode,
+but it is unclear how it can usefully be used.
 </P>
 <P>
-PCRE does not allow \C to appear in lookbehind assertions
+Because \C breaks up characters into individual code units, matching one unit
+with \C in UTF-8 or UTF-16 mode means that the rest of the string may start
+with a malformed UTF character. This has undefined results, because PCRE2
+assumes that it is matching character by character in a valid UTF string (by
+default it checks the subject string's validity at the start of processing
+unless the PCRE2_NO_UTF_CHECK option is used).
+</P>
+<P>
+An application can lock out the use of \C by setting the
+PCRE2_NEVER_BACKSLASH_C option when compiling a pattern. It is also possible to
+build PCRE2 with the use of \C permanently disabled.
+</P>
+<P>
+PCRE2 does not allow \C to appear in lookbehind assertions
 <a href="#lookbehind">(described below)</a>
 in a UTF mode, because this would make it impossible to calculate the length of
-the lookbehind.
+the lookbehind. Neither the alternative matching function
+<b>pcre2_dfa_match()</b> not the JIT optimizer support \C in a UTF mode. The
+former gives a match-time error; the latter fails to optimize and so the match
+is always run using the interpreter.
 </P>
 <P>
-In general, the \C escape sequence is best avoided. However, one
-way of using it that avoids the problem of malformed UTF characters is to use a
-lookahead to check the length of the next character, as in this pattern, which
-could be used with a UTF-8 string (ignore white space and line breaks):
+In general, the \C escape sequence is best avoided. However, one way of using
+it that avoids the problem of malformed UTF characters is to use a lookahead to
+check the length of the next character, as in this pattern, which could be used
+with a UTF-8 string (ignore white space and line breaks):
 <pre>
   (?| (?=[\x00-\x7f])(\C) |
       (?=[\x80-\x{7ff}])(\C)(\C) |
       (?=[\x{800}-\x{ffff}])(\C)(\C)(\C) |
       (?=[\x{10000}-\x{1fffff}])(\C)(\C)(\C)(\C))
 </pre>
-A group that starts with (?| resets the capturing parentheses numbers in each
-alternative (see
+In this example, a group that starts with (?| resets the capturing parentheses
+numbers in each alternative (see
 <a href="#dupsubpatternnumber">"Duplicate Subpattern Numbers"</a>
 below). The assertions at the start of each branch check the next UTF-8
 character for values whose encoding uses 1, 2, 3, or 4 bytes, respectively. The
 character's individual bytes are then captured by the appropriate number of
-groups.
+\C groups.
 <a name="characterclass"></a></P>
 <br><a name="SEC9" href="#TOC1">SQUARE BRACKETS AND CHARACTER CLASSES</a><br>
 <P>
 An opening square bracket introduces a character class, terminated by a closing
 square bracket. A closing square bracket on its own is not special by default.
-However, if the PCRE_JAVASCRIPT_COMPAT option is set, a lone closing square
-bracket causes a compile-time error. If a 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.
+If a 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. This means that, by default, an empty class cannot
+be defined. However, if the PCRE2_ALLOW_EMPTY_CLASS option is set, a closing
+square bracket at the start does end the (empty) class.
 </P>
 <P>
-A character class matches a single character in the subject. In a UTF mode, the
-character may be more than one data unit long. A matched character must be in
-the set of characters defined by the class, unless the first character in the
-class definition is a circumflex, in which case the subject character must not
-be in 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.
+A character class matches a single character in the subject. A matched
+character must be in the set of characters defined by the class, unless the
+first character in the class definition is a circumflex, in which case the
+subject character must not be in 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>
 <P>
 For example, the character class [aeiou] matches any lower case vowel, while
@@ -1271,27 +1309,16 @@
 string.
 </P>
 <P>
-In UTF-8 (UTF-16, UTF-32) mode, characters with values greater than 255 (0xffff)
-can be included in a class as a literal string of data units, or by using the
-\x{ escaping mechanism.
-</P>
-<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. In a UTF 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 in a UTF mode for characters 128 and
-above, you must ensure that PCRE is compiled with Unicode property support as
-well as with UTF support.
+caseful version would.
 </P>
 <P>
 Characters that might indicate line breaks are never treated in any special way
 when matching character classes, whatever line-ending sequence is in use, and
-whatever setting of the PCRE_DOTALL and PCRE_MULTILINE options is used. A class
-such as [^a] always matches one of these characters.
+whatever setting of the PCRE2_DOTALL and PCRE2_MULTILINE options is used. A
+class such as [^a] always matches one of these characters.
 </P>
 <P>
 The minus (hyphen) character can be used to specify a range of characters in a
@@ -1318,32 +1345,39 @@
 but [A-\d] and [A-[:digit:]] are not.
 </P>
 <P>
-Ranges operate in the collating sequence of character values. They can also be
-used for characters specified numerically, for example [\000-\037]. Ranges
-can include any characters that are valid for the current mode.
+Ranges normally include all code points between the start and end characters,
+inclusive. They can also be used for code points specified numerically, for
+example [\000-\037]. Ranges can include any characters that are valid for the
+current mode.
+</P>
+<P>
+There is a special case in EBCDIC environments for ranges whose end points are
+both specified as literal letters in the same case. For compatibility with
+Perl, EBCDIC code points within the range that are not letters are omitted. For
+example, [h-k] matches only four characters, even though the codes for h and k
+are 0x88 and 0x92, a range of 11 code points. However, if the range is
+specified numerically, for example, [\x88-\x92] or [h-\x92], all code points
+are included.
 </P>
 <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 in a non-UTF mode, if character
 tables for a French locale are in use, [\xc8-\xcb] matches accented E
-characters in both cases. In UTF modes, PCRE supports the concept of case for
-characters with values greater than 128 only when it is compiled with Unicode
-property support.
+characters in both cases.
 </P>
 <P>
 The character escape sequences \d, \D, \h, \H, \p, \P, \s, \S, \v,
 \V, \w, and \W may appear in a character class, and add the characters that
 they match to the class. For example, [\dABCDEF] matches any hexadecimal
-digit. In UTF modes, the PCRE_UCP option affects the meanings of \d, \s, \w
+digit. In UTF modes, the PCRE2_UCP option affects the meanings of \d, \s, \w
 and their upper case partners, just as it does when they appear outside a
 character class, as described in the section entitled
 <a href="#genericchartypes">"Generic character types"</a>
 above. The escape sequence \b has a different meaning inside a character
 class; it matches the backspace character. The sequences \B, \N, \R, and \X
 are not special inside a character class. Like any other unrecognized escape
-sequences, they are treated as the literal characters "B", "N", "R", and "X" by
-default, but cause an error if the PCRE_EXTRA option is set.
+sequences, they cause an error.
 </P>
 <P>
 A circumflex can conveniently be used with the upper case character types to
@@ -1364,7 +1398,7 @@
 <br><a name="SEC10" href="#TOC1">POSIX CHARACTER CLASSES</a><br>
 <P>
 Perl supports the POSIX notation for character classes. This uses names
-enclosed by [: and :] within the enclosing square brackets. PCRE also supports
+enclosed by [: and :] within the enclosing square brackets. PCRE2 also supports
 this notation. For example,
 <pre>
   [01[:alpha:]%]
@@ -1382,17 +1416,15 @@
   lower    lower case letters
   print    printing characters, including space
   punct    printing characters, excluding letters and digits and space
-  space    white space (the same as \s from PCRE 8.34)
+  space    white space (the same as \s from PCRE2 8.34)
   upper    upper case letters
   word     "word" characters (same as \w)
   xdigit   hexadecimal digits
 </pre>
 The default "space" characters are HT (9), LF (10), VT (11), FF (12), CR (13),
 and space (32). If locale-specific matching is taking place, the list of space
-characters may be different; there may be fewer or more of them. "Space" used
-to be different to \s, which did not include VT, for Perl compatibility.
-However, Perl changed at release 5.18, and PCRE followed at release 8.34.
-"Space" and \s now match the same set of characters.
+characters may be different; there may be fewer or more of them. "Space" and
+\s match the same set of characters.
 </P>
 <P>
 The name "word" is a Perl extension, and "blank" is a GNU extension from Perl
@@ -1401,20 +1433,22 @@
 <pre>
   [12[:^digit:]]
 </pre>
-matches "1", "2", or any non-digit. PCRE (and Perl) also recognize the POSIX
+matches "1", "2", or any non-digit. PCRE2 (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.
 </P>
 <P>
-By default, characters with values greater than 128 do not match any of the
-POSIX character classes. However, if the PCRE_UCP option is passed to
-<b>pcre_compile()</b>, some of the classes are changed so that Unicode character
-properties are used. This is achieved by replacing certain POSIX classes by
-other sequences, as follows:
+By default, characters with values greater than 127 do not match any of the
+POSIX character classes, although this may be different for characters in the
+range 128-255 when locale-specific matching is happening. However, if the
+PCRE2_UCP option is passed to <b>pcre2_compile()</b>, some of the classes are
+changed so that Unicode character properties are used. This is achieved by
+replacing certain POSIX classes with other sequences, as follows:
 <pre>
   [:alnum:]  becomes  \p{Xan}
   [:alpha:]  becomes  \p{L}
   [:blank:]  becomes  \h
+  [:cntrl:]  becomes  \p{Cc}
   [:digit:]  becomes  \p{Nd}
   [:lower:]  becomes  \p{Ll}
   [:space:]  becomes  \p{Xps}
@@ -1444,18 +1478,18 @@
 <P>
 [:punct:]
 This matches all characters that have the Unicode P (punctuation) property,
-plus those characters whose code points are less than 128 that have the S
-(Symbol) property.
+plus those characters with code points less than 256 that have the S (Symbol)
+property.
 </P>
 <P>
 The other POSIX classes are unchanged, and match only characters with code
-points less than 128.
+points less than 256.
 </P>
 <br><a name="SEC11" href="#TOC1">COMPATIBILITY FEATURE FOR WORD BOUNDARIES</a><br>
 <P>
 In the POSIX.2 compliant library that was included in 4.4BSD Unix, the ugly
 syntax [[:&#60;:]] and [[:&#62;:]] is used for matching "start of word" and "end of
-word". PCRE treats these items as follows:
+word". PCRE2 treats these items as follows:
 <pre>
   [[:&#60;:]]  is converted to  \b(?=\w)
   [[:&#62;:]]  is converted to  \b(?&#60;=\w)
@@ -1487,34 +1521,35 @@
 </P>
 <br><a name="SEC13" href="#TOC1">INTERNAL OPTION SETTING</a><br>
 <P>
-The settings of the PCRE_CASELESS, PCRE_MULTILINE, PCRE_DOTALL, and
-PCRE_EXTENDED options (which are Perl-compatible) can be changed from within
+The settings of the PCRE2_CASELESS, PCRE2_MULTILINE, PCRE2_DOTALL, and
+PCRE2_EXTENDED options (which are Perl-compatible) can be changed from within
 the pattern by a sequence of Perl option letters enclosed between "(?" and ")".
 The option letters are
 <pre>
-  i  for PCRE_CASELESS
-  m  for PCRE_MULTILINE
-  s  for PCRE_DOTALL
-  x  for PCRE_EXTENDED
+  i  for PCRE2_CASELESS
+  m  for PCRE2_MULTILINE
+  s  for PCRE2_DOTALL
+  x  for PCRE2_EXTENDED
 </pre>
 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
+setting and unsetting such as (?im-sx), which sets PCRE2_CASELESS and
+PCRE2_MULTILINE while unsetting PCRE2_DOTALL and PCRE2_EXTENDED, is also
 permitted. If a letter appears both before and after the hyphen, the option is
-unset.
+unset. An empty options setting "(?)" is allowed. Needless to say, it has no
+effect.
 </P>
 <P>
-The PCRE-specific options PCRE_DUPNAMES, PCRE_UNGREEDY, and PCRE_EXTRA can be
-changed in the same way as the Perl-compatible options by using the characters
-J, U and X respectively.
+The PCRE2-specific options PCRE2_DUPNAMES and PCRE2_UNGREEDY can be changed in
+the same way as the Perl-compatible options by using the characters J and U
+respectively.
 </P>
 <P>
 When one of these option changes 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
+that follows. If the change is placed right at the start of a pattern, PCRE2
 extracts it into the global options (and it will therefore show up in data
-extracted by the <b>pcre_fullinfo()</b> function).
+extracted by the <b>pcre2_pattern_info()</b> function).
 </P>
 <P>
 An option change within a subpattern (see below for a description of
@@ -1522,7 +1557,7 @@
 <pre>
   (a(?i)b)c
 </pre>
-matches abc and aBc and no other strings (assuming PCRE_CASELESS is not used).
+matches abc and aBc and no other strings (assuming PCRE2_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,
@@ -1535,18 +1570,26 @@
 behaviour otherwise.
 </P>
 <P>
-<b>Note:</b> There are other PCRE-specific options that can be set by the
-application when the compiling or matching functions are called. In some cases
-the pattern can contain special leading sequences such as (*CRLF) to override
-what the application has set or what has been defaulted. Details are given in
-the section entitled
+As a convenient shorthand, if any option settings are required at the start of
+a non-capturing subpattern (see the next section), the option letters may
+appear between the "?" and the ":". Thus the two patterns
+<pre>
+  (?i:saturday|sunday)
+  (?:(?i)saturday|sunday)
+</pre>
+match exactly the same set of strings.
+</P>
+<P>
+<b>Note:</b> There are other PCRE2-specific options that can be set by the
+application when the compiling function is called. The pattern can contain
+special leading sequences such as (*CRLF) to override what the application has
+set or what has been defaulted. Details are given in the section entitled
 <a href="#newlineseq">"Newline sequences"</a>
-above. There are also the (*UTF8), (*UTF16),(*UTF32), and (*UCP) leading
-sequences that can be used to set UTF and Unicode property modes; they are
-equivalent to setting the PCRE_UTF8, PCRE_UTF16, PCRE_UTF32 and the PCRE_UCP
-options, respectively. The (*UTF) sequence is a generic version that can be
-used with any of the libraries. However, the application can set the
-PCRE_NEVER_UTF option, which locks out the use of the (*UTF) sequences.
+above. There are also the (*UTF) and (*UCP) leading sequences that can be used
+to set UTF and Unicode property modes; they are equivalent to setting the
+PCRE2_UTF and PCRE2_UCP options, respectively. However, the application can set
+the PCRE2_NEVER_UTF and PCRE2_NEVER_UCP options, which lock out the use of the
+(*UTF) and (*UCP) sequences.
 <a name="subpattern"></a></P>
 <br><a name="SEC14" href="#TOC1">SUBPATTERNS</a><br>
 <P>
@@ -1563,10 +1606,10 @@
 <br>
 <br>
 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 <i>ovector</i> argument of the
-matching function. (This applies only to the traditional matching functions;
-the DFA matching functions do not support capturing.)
+the whole pattern matches, the portion of the subject string that matched the
+subpattern is passed back to the caller, separately from the portion that
+matched the whole pattern. (This applies only to the traditional matching
+function; the DFA matching function does not support capturing.)
 </P>
 <P>
 Opening parentheses are counted from left to right (starting from 1) to obtain
@@ -1639,6 +1682,10 @@
 <pre>
   /(?|(abc)|(def))(?1)/
 </pre>
+A relative reference such as (?-1) is no different: it is just a convenient way
+of computing an absolute group number.
+</P>
+<P>
 If a
 <a href="#conditions">condition test</a>
 for a subpattern's having matched refers to a non-unique number, the test is
@@ -1653,14 +1700,14 @@
 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 this
-difficulty, PCRE supports the naming of subpatterns. This feature was not
-added to Perl until release 5.10. Python had the feature earlier, and PCRE
-introduced it at release 4.0, using the Python syntax. PCRE now supports both
-the Perl and the Python syntax. Perl allows identically numbered subpatterns to
-have different names, but PCRE does not.
+difficulty, PCRE2 supports the naming of subpatterns. This feature was not
+added to Perl until release 5.10. Python had the feature earlier, and PCRE1
+introduced it at release 4.0, using the Python syntax. PCRE2 supports both the
+Perl and the Python syntax. Perl allows identically numbered subpatterns to
+have different names, but PCRE2 does not.
 </P>
 <P>
-In PCRE, a subpattern can be named in one of three ways: (?&#60;name&#62;...) or
+In PCRE2, a subpattern can be named in one of three ways: (?&#60;name&#62;...) or
 (?'name'...) as in Perl, or (?P&#60;name&#62;...) as in Python. References to capturing
 parentheses from other parts of the pattern, such as
 <a href="#backreferences">back references,</a>
@@ -1672,20 +1719,20 @@
 <P>
 Names consist of up to 32 alphanumeric characters and underscores, but must
 start with a non-digit. Named capturing parentheses are still allocated numbers
-as well as names, exactly as if the names were not present. The PCRE API
+as well as names, exactly as if the names were not present. The PCRE2 API
 provides function calls for extracting the name-to-number translation table
-from a compiled pattern. There is also a convenience function for extracting a
+from a compiled pattern. There are also convenience functions for extracting a
 captured substring by name.
 </P>
 <P>
 By default, a name must be unique within a pattern, but it is possible to relax
-this constraint by setting the PCRE_DUPNAMES option at compile time. (Duplicate
-names are also always permitted for subpatterns with the same number, set up as
-described in the previous section.) Duplicate names can be useful for patterns
-where only one instance of the named parentheses can match. Suppose you want to
-match the name of a weekday, either as a 3-letter abbreviation or as the full
-name, and in both cases you want to extract the abbreviation. This pattern
-(ignoring the line breaks) does the job:
+this constraint by setting the PCRE2_DUPNAMES option at compile time.
+(Duplicate names are also always permitted for subpatterns with the same
+number, set up as described in the previous section.) Duplicate names can be
+useful for patterns where only one instance of the named parentheses can match.
+Suppose you want to match the name of a weekday, either as a 3-letter
+abbreviation or as the full name, and in both cases you want to extract the
+abbreviation. This pattern (ignoring the line breaks) does the job:
 <pre>
   (?&#60;DN&#62;Mon|Fri|Sun)(?:day)?|
   (?&#60;DN&#62;Tue)(?:sday)?|
@@ -1698,7 +1745,7 @@
 subpattern, as described in the previous section.)
 </P>
 <P>
-The convenience function for extracting the data by name returns the substring
+The convenience functions for extracting the data by name returns the substring
 for the first (and in this example, the only) subpattern of that name that
 matched. This saves searching to find which numbered subpattern it was.
 </P>
@@ -1728,15 +1775,15 @@
 true for any one of them, the overall condition is true. This is the same
 behaviour as testing by number. For further details of the interfaces for
 handling named subpatterns, see the
-<a href="pcreapi.html"><b>pcreapi</b></a>
+<a href="pcre2api.html"><b>pcre2api</b></a>
 documentation.
 </P>
 <P>
 <b>Warning:</b> You cannot use different names to distinguish between two
-subpatterns with the same number because PCRE uses only the numbers when
+subpatterns with the same number because PCRE2 uses only the numbers when
 matching. For this reason, an error is given at compile time if different names
 are given to subpatterns with the same number. However, you can always give the
-same name to subpatterns with the same number, even when PCRE_DUPNAMES is not
+same name to subpatterns with the same number, even when PCRE2_DUPNAMES is not
 set.
 </P>
 <br><a name="SEC17" href="#TOC1">REPETITION</a><br>
@@ -1751,8 +1798,8 @@
   the \R escape sequence
   an escape such as \d or \pL that matches a single character
   a character class
-  a back reference (see next section)
-  a parenthesized subpattern (including assertions)
+  a back reference
+  a parenthesized subpattern (including most assertions)
   a subroutine call to a subpattern (recursive or otherwise)
 </pre>
 The general repetition quantifier specifies a minimum and maximum number of
@@ -1769,7 +1816,7 @@
 <pre>
   [aeiou]{3,}
 </pre>
-matches at least 3 successive vowels, but may match many more, while
+matches at least 3 successive vowels, but may match many more, whereas
 <pre>
   \d{8}
 </pre>
@@ -1779,11 +1826,11 @@
 quantifier, but a literal string of four characters.
 </P>
 <P>
-In UTF modes, quantifiers apply to characters rather than to individual data
+In UTF modes, quantifiers apply to characters rather than to individual code
 units. Thus, for example, \x{100}{2} matches two characters, each of
 which is represented by a two-byte sequence in a UTF-8 string. Similarly,
 \X{3} matches three Unicode extended grapheme clusters, each of which may be
-several data units long (and they may be of different lengths).
+several code units long (and they may be of different lengths).
 </P>
 <P>
 The quantifier {0} is permitted, causing the expression to behave as if the
@@ -1808,7 +1855,7 @@
 <pre>
   (a?)*
 </pre>
-Earlier versions of Perl and PCRE used to give an error at compile time for
+Earlier versions of Perl and PCRE1 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.
@@ -1831,9 +1878,8 @@
 item.
 </P>
 <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
+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
 <pre>
   /\*.*?\*/
 </pre>
@@ -1848,7 +1894,7 @@
 way the rest of the pattern matches.
 </P>
 <P>
-If the PCRE_UNGREEDY option is set (an option that is not available in Perl),
+If the PCRE2_UNGREEDY option is set (an option that 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.
@@ -1859,17 +1905,17 @@
 compiled pattern, in proportion to the size of the minimum or maximum.
 </P>
 <P>
-If a pattern starts with .* or .{0,} and the PCRE_DOTALL option (equivalent
+If a pattern starts with .* or .{0,} and the PCRE2_DOTALL option (equivalent
 to Perl's /s) is set, thus allowing the dot 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
+overall match at any position after the first. PCRE2 normally treats such a
 pattern as though it were preceded by \A.
 </P>
 <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.
+worth setting PCRE2_DOTALL in order to obtain this optimization, or
+alternatively, using ^ to indicate anchoring explicitly.
 </P>
 <P>
 However, there are some cases where the optimization cannot be used. When .*
@@ -1890,7 +1936,8 @@
   (?&#62;.*?a)b
 </pre>
 It matches "ab" in the subject "aab". The use of the backtracking control verbs
-(*PRUNE) and (*SKIP) also disable this optimization.
+(*PRUNE) and (*SKIP) also disable this optimization, and there is an option,
+PCRE2_NO_DOTSTAR_ANCHOR, to do so explicitly.
 </P>
 <P>
 When a capturing subpattern is repeated, the value captured is the substring
@@ -1903,7 +1950,7 @@
 corresponding captured values may have been set in previous iterations. For
 example, after
 <pre>
-  /(a|(b))+/
+  (a|(b))+
 </pre>
 matches "aba" the value of the second captured substring is "b".
 <a name="atomicgroup"></a></P>
@@ -1940,9 +1987,9 @@
 normal.
 </P>
 <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.
+An alternative description is that a subpattern of this type matches exactly
+the string of characters that an identical standalone pattern would match, if
+anchored at the current point in the subject string.
 </P>
 <P>
 Atomic grouping subpatterns are not capturing subpatterns. Simple cases such as
@@ -1966,7 +2013,7 @@
 <pre>
   (abc|xyz){2,3}+
 </pre>
-Possessive quantifiers are always greedy; the setting of the PCRE_UNGREEDY
+Possessive quantifiers are always greedy; the setting of the PCRE2_UNGREEDY
 option is ignored. They are a convenient notation for the simpler forms of
 atomic group. However, there is no difference in the meaning of a possessive
 quantifier and the equivalent atomic group, though there may be a performance
@@ -1976,13 +2023,15 @@
 The possessive quantifier syntax is an extension to the Perl 5.8 syntax.
 Jeffrey Friedl originated the idea (and the name) in the first edition of his
 book. Mike McCloskey liked it, so implemented it when he built Sun's Java
-package, and PCRE copied it from there. It ultimately found its way into Perl
+package, and PCRE1 copied it from there. It ultimately found its way into Perl
 at release 5.10.
 </P>
 <P>
-PCRE has an optimization that automatically "possessifies" certain simple
+PCRE2 has an optimization that automatically "possessifies" certain simple
 pattern constructs. For example, the sequence A+B is treated as A++B because
 there is no point in backtracking into a sequence of A's when B must follow.
+This feature can be disabled by the PCRE2_NO_AUTOPOSSESS option, or starting
+the pattern with (*NO_AUTO_POSSESS).
 </P>
 <P>
 When a pattern contains an unlimited repeat inside a subpattern that can itself
@@ -2001,7 +2050,7 @@
 it takes a long time before reporting failure. This is because the string can
 be divided between the internal \D+ 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
+than a single character at the end, because both PCRE2 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
@@ -2019,17 +2068,17 @@
 previous capturing left parentheses.
 </P>
 <P>
-However, if the decimal number following the backslash is less than 10, it is
+However, if the decimal number following the backslash is less than 8, 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. A "forward back reference" of this type can make sense
+numbers less than 8. A "forward back reference" of this type can make sense
 when a repetition is involved and the subpattern to the right has participated
 in an earlier iteration.
 </P>
 <P>
 It is not possible to have a numerical "forward back reference" to a subpattern
-whose number is 10 or more using this syntax because a sequence such as \50 is
+whose number is 8 or more using this syntax because a sequence such as \50 is
 interpreted as a character defined in octal. See the subsection entitled
 "Non-printing characters"
 <a href="#digitsafterbackslash">above</a>
@@ -2102,14 +2151,14 @@
   (a|(bc))\2
 </pre>
 always fails if it starts to match "a" rather than "bc". However, if the
-PCRE_JAVASCRIPT_COMPAT option is set at compile time, a back reference to an
+PCRE2_MATCH_UNSET_BACKREF option is set at compile time, a back reference to an
 unset value matches an empty string.
 </P>
 <P>
 Because there may be many capturing parentheses in a pattern, all digits
 following a 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
+terminate the back reference. If the PCRE2_EXTENDED option is set, this can be
 white space. Otherwise, the \g{ syntax or an empty comment (see
 <a href="#comments">"Comments"</a>
 below) can be used.
@@ -2142,8 +2191,8 @@
 <br><a name="SEC20" href="#TOC1">ASSERTIONS</a><br>
 <P>
 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
+matching point that does not consume any characters. The simple assertions
+coded as \b, \B, \A, \G, \Z, \z, ^ and $ are described
 <a href="#smallassertions">above.</a>
 </P>
 <P>
@@ -2160,10 +2209,11 @@
 always, does do capturing in negative assertions.)
 </P>
 <P>
-For compatibility with Perl, assertion subpatterns may be repeated; though
+For compatibility with Perl, most assertion subpatterns may be repeated; though
 it makes no sense to assert the same thing several times, the side effect of
-capturing parentheses may occasionally be useful. In practice, there only three
-cases:
+capturing parentheses may occasionally be useful. However, an assertion that
+forms the condition for a conditional subpattern may not be quantified. In
+practice, for other assertions, there only three cases:
 <br>
 <br>
 (1) If the quantifier is {0}, the assertion is never obeyed during matching.
@@ -2238,7 +2288,7 @@
   (?&#60;=ab(c|de))
 </pre>
 is not permitted, because its single top-level branch can match two different
-lengths, but it is acceptable to PCRE if rewritten to use two top-level
+lengths, but it is acceptable to PCRE2 if rewritten to use two top-level
 branches:
 <pre>
   (?&#60;=abc|abde)
@@ -2255,10 +2305,10 @@
 assertion fails.
 </P>
 <P>
-In a UTF mode, PCRE does not allow the \C escape (which matches a single data
+In a UTF mode, PCRE2 does not allow the \C escape (which matches a single code
 unit even in a UTF mode) to appear in lookbehind assertions, because it makes
 it impossible to calculate the length of the lookbehind. The \X and \R
-escapes, which can match different numbers of data units, are also not
+escapes, which can match different numbers of code units, are also not
 permitted.
 </P>
 <P>
@@ -2276,7 +2326,7 @@
   abcd$
 </pre>
 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
+from left to right, PCRE2 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
 <pre>
   ^.*abcd$
@@ -2289,10 +2339,11 @@
 <pre>
   ^.*+(?&#60;=abcd)
 </pre>
-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.
+there can be no backtracking for the .*+ item because of the possessive
+quantifier; 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.
 </P>
 <br><b>
 Using multiple assertions
@@ -2352,8 +2403,8 @@
 </PRE>
 </P>
 <P>
-There are four kinds of condition: references to subpatterns, references to
-recursion, a pseudo-condition called DEFINE, and assertions.
+There are five kinds of condition: references to subpatterns, references to
+recursion, two pseudo-conditions called DEFINE and VERSION, and assertions.
 </P>
 <br><b>
 Checking for a used subpattern by number
@@ -2374,7 +2425,7 @@
 </P>
 <P>
 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
+make it more readable (assume the PCRE2_EXTENDED option) and to divide it into
 three parts for ease of discussion:
 <pre>
   ( \( )?    [^()]+    (?(1) \) )
@@ -2402,7 +2453,7 @@
 </b><br>
 <P>
 Perl uses the syntax (?(&#60;name&#62;)...) or (?('name')...) to test for a used
-subpattern by name. For compatibility with earlier versions of PCRE, which had
+subpattern by name. For compatibility with earlier versions of PCRE1, which had
 this facility before Perl, the syntax (?(name)...) is also recognized.
 </P>
 <P>
@@ -2461,6 +2512,24 @@
 components of an IPv4 address, insisting on a word boundary at each end.
 </P>
 <br><b>
+Checking the PCRE2 version
+</b><br>
+<P>
+Programs that link with a PCRE2 library can check the version by calling
+<b>pcre2_config()</b> with appropriate arguments. Users of applications that do
+not have access to the underlying code cannot do this. A special "condition"
+called VERSION exists to allow such users to discover which version of PCRE2
+they are dealing with by using this condition to match a string such as
+"yesno". VERSION must be followed either by "=" or "&#62;=" and a version number.
+For example:
+<pre>
+  (?(VERSION&#62;=10.4)yes|no)
+</pre>
+This pattern matches "yes" if the PCRE2 version is greater or equal to 10.4, or
+"no" otherwise. The fractional part of the version number may not contain more
+than two digits.
+</P>
+<br><b>
 Assertion conditions
 </b><br>
 <P>
@@ -2482,28 +2551,29 @@
 <br><a name="SEC22" href="#TOC1">COMMENTS</a><br>
 <P>
 There are two ways of including comments in patterns that are processed by
-PCRE. In both cases, the start of the comment must not be in a character class,
-nor in the middle of any other sequence of related characters such as (?: or a
-subpattern name or number. The characters that make up a comment play no part
-in the pattern matching.
+PCRE2. In both cases, the start of the comment must not be in a character
+class, nor in the middle of any other sequence of related characters such as
+(?: or a subpattern name or number. The characters that make up a comment play
+no part in the pattern matching.
 </P>
 <P>
 The sequence (?# marks the start of a comment that continues up to the next
-closing parenthesis. Nested parentheses are not permitted. If the PCRE_EXTENDED
-option is set, an unescaped # character also introduces a comment, which in
-this case continues to immediately after the next newline character or
-character sequence in the pattern. Which characters are interpreted as newlines
-is controlled by the options passed to a compiling function or by a special
-sequence at the start of the pattern, as described in the section entitled
+closing parenthesis. Nested parentheses are not permitted. If the
+PCRE2_EXTENDED option is set, an unescaped # character also introduces a
+comment, which in this case continues to immediately after the next newline
+character or character sequence in the pattern. Which characters are
+interpreted as newlines is controlled by an option passed to the compiling
+function or by a special sequence at the start of the pattern, as described in
+the section entitled
 <a href="#newlines">"Newline conventions"</a>
 above. Note that the end of this type of comment is a literal newline sequence
 in the pattern; escape sequences that happen to represent a newline do not
-count. For example, consider this pattern when PCRE_EXTENDED is set, and the
-default newline convention is in force:
+count. For example, consider this pattern when PCRE2_EXTENDED is set, and the
+default newline convention (a single linefeed character) is in force:
 <pre>
   abc #comment \n still comment
 </pre>
-On encountering the # character, <b>pcre_compile()</b> skips along, looking for
+On encountering the # character, <b>pcre2_compile()</b> skips along, looking for
 a newline in the pattern. The sequence \n is still literal at this stage, so
 it does not terminate the comment. Only an actual character with the code value
 0x0a (the default newline) does so.
@@ -2528,9 +2598,9 @@
 recursively to the pattern in which it appears.
 </P>
 <P>
-Obviously, PCRE cannot support the interpolation of Perl code. Instead, it
+Obviously, PCRE2 cannot support the interpolation of Perl code. Instead, it
 supports special syntax for recursion of the entire pattern, and also for
-individual subpattern recursion. After its introduction in PCRE and Python,
+individual subpattern recursion. After its introduction in PCRE1 and Python,
 this kind of recursion was subsequently introduced into Perl at release 5.10.
 </P>
 <P>
@@ -2542,8 +2612,8 @@
 a recursive call of the entire regular expression.
 </P>
 <P>
-This PCRE pattern solves the nested parentheses problem (assume the
-PCRE_EXTENDED option is set so that white space is ignored):
+This PCRE2 pattern solves the nested parentheses problem (assume the
+PCRE2_EXTENDED option is set so that white space is ignored):
 <pre>
   \( ( [^()]++ | (?R) )* \)
 </pre>
@@ -2570,6 +2640,21 @@
 capturing parentheses leftwards from the point at which it is encountered.
 </P>
 <P>
+Be aware however, that if
+<a href="#dupsubpatternnumber">duplicate subpattern numbers</a>
+are in use, relative references refer to the earliest subpattern with the
+appropriate number. Consider, for example:
+<pre>
+  (?|(a)|(b)) (c) (?-2)
+</pre>
+The first two capturing groups (a) and (b) are both numbered 1, and group (c)
+is number 2. When the reference (?-2) is encountered, the second most recently
+opened parentheses has the number 1, but it is the first such group (the (a)
+group) to which the recursion refers. This would be the same if an absolute
+reference (?1) was used. In other words, relative references are just a
+shorthand for computing a group number.
+</P>
+<P>
 It is also possible to refer to subsequently opened parentheses, by writing
 references such as (?+2). However, these cannot be recursive because the
 reference is not inside the parentheses that are referenced. They are always
@@ -2577,9 +2662,9 @@
 calls, as described in the next section.
 </P>
 <P>
-An alternative approach is to use named parentheses instead. The Perl syntax
-for this is (?&name); PCRE's earlier syntax (?P&#62;name) is also supported. We
-could rewrite the above example as follows:
+An alternative approach is to use named parentheses. The Perl syntax for this
+is (?&name); PCRE1's earlier syntax (?P&#62;name) is also supported. We could
+rewrite the above example as follows:
 <pre>
   (?&#60;pn&#62; \( ( [^()]++ | (?&pn) )* \) )
 </pre>
@@ -2587,10 +2672,10 @@
 used.
 </P>
 <P>
-This particular example pattern that we have been looking at contains nested
-unlimited repeats, and so the use of a possessive quantifier 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
+The example pattern that we have been looking at contains nested unlimited
+repeats, and so the use of a possessive quantifier 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
 <pre>
   (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()
 </pre>
@@ -2603,7 +2688,7 @@
 At the end of a match, the values of capturing parentheses are those from
 the outermost level. If you want to obtain intermediate values, a callout
 function can be used (see below and the
-<a href="pcrecallout.html"><b>pcrecallout</b></a>
+<a href="pcre2callout.html"><b>pcre2callout</b></a>
 documentation). If the pattern above is matched against
 <pre>
   (ab(cd)ef)
@@ -2614,10 +2699,9 @@
 (temporarily) set at a deeper level during the matching process.
 </P>
 <P>
-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
-<b>pcre_malloc</b>, freeing it via <b>pcre_free</b> afterwards. If no memory can
-be obtained, the match fails with the PCRE_ERROR_NOMEMORY error.
+If there are more than 15 capturing parentheses in a pattern, PCRE2 has to
+obtain extra memory from the heap to store data during a recursion. If no
+memory can be obtained, the match fails with the PCRE2_ERROR_NOMEMORY error.
 </P>
 <P>
 Do not confuse the (?R) item with the condition (R), which tests for recursion.
@@ -2632,10 +2716,10 @@
 is the actual recursive call.
 <a name="recursiondifference"></a></P>
 <br><b>
-Differences in recursion processing between PCRE and Perl
+Differences in recursion processing between PCRE2 and Perl
 </b><br>
 <P>
-Recursion processing in PCRE differs from Perl in two important ways. In PCRE
+Recursion processing in PCRE2 differs from Perl in two important ways. In PCRE2
 (like Python, but unlike Perl), a recursive subpattern call is always treated
 as an atomic group. That is, once it has matched some of the subject string, it
 is never re-entered, even if it contains untried alternatives and there is a
@@ -2646,7 +2730,7 @@
   ^(.|(.)(?1)\2)$
 </pre>
 The idea is that it either matches a single character, or two identical
-characters surrounding a sub-palindrome. In Perl, this pattern works; in PCRE
+characters surrounding a sub-palindrome. In Perl, this pattern works; in PCRE2
 it does not if the pattern is longer than three characters. Consider the
 subject string "abcba":
 </P>
@@ -2671,7 +2755,7 @@
 until it runs out of characters, at which point the recursion fails. But this
 time we do have another alternative to try at the higher level. That is the big
 difference: in the previous case the remaining alternative is at a deeper
-recursion level, which PCRE cannot use.
+recursion level, which PCRE2 cannot use.
 </P>
 <P>
 To change the pattern so that it matches all palindromic strings, not just
@@ -2680,7 +2764,7 @@
 <pre>
   ^((.)(?1)\2|.?)$
 </pre>
-Again, this works in Perl, but not in PCRE, and for the same reason. When a
+Again, this works in Perl, but not in PCRE2, and for the same reason. When a
 deeper recursion has matched a single character, it cannot be entered again in
 order to match an empty string. The solution is to separate the two cases, and
 write out the odd and even cases as alternatives at the higher level:
@@ -2692,31 +2776,31 @@
 <pre>
   ^\W*+(?:((.)\W*+(?1)\W*+\2|)|((.)\W*+(?3)\W*+\4|\W*+.\W*+))\W*+$
 </pre>
-If run with the PCRE_CASELESS option, this pattern matches phrases such as "A
-man, a plan, a canal: Panama!" and it works well in both PCRE and Perl. Note
-the use of the possessive quantifier *+ to avoid backtracking into sequences of
-non-word characters. Without this, PCRE takes a great deal longer (ten times or
-more) to match typical phrases, and Perl takes so long that you think it has
+If run with the PCRE2_CASELESS option, this pattern matches phrases such as "A
+man, a plan, a canal: Panama!" and it works in both PCRE2 and Perl. Note the
+use of the possessive quantifier *+ to avoid backtracking into sequences of
+non-word characters. Without this, PCRE2 takes a great deal longer (ten times
+or more) to match typical phrases, and Perl takes so long that you think it has
 gone into a loop.
 </P>
 <P>
 <b>WARNING</b>: The palindrome-matching patterns above work only if the subject
 string does not start with a palindrome that is shorter than the entire string.
 For example, although "abcba" is correctly matched, if the subject is "ababa",
-PCRE finds the palindrome "aba" at the start, then fails at top level because
+PCRE2 finds the palindrome "aba" at the start, then fails at top level because
 the end of the string does not follow. Once again, it cannot jump back into the
 recursion to try other alternatives, so the entire match fails.
 </P>
 <P>
-The second way in which PCRE and Perl differ in their recursion processing is
+The second way in which PCRE2 and Perl differ in their recursion processing is
 in the handling of captured values. In Perl, when a subpattern is called
 recursively or as a subpattern (see the next section), it has no access to any
-values that were captured outside the recursion, whereas in PCRE these values
+values that were captured outside the recursion, whereas in PCRE2 these values
 can be referenced. Consider this pattern:
 <pre>
   ^(.)(\1|a(?2))
 </pre>
-In PCRE, this pattern matches "bab". The first capturing parentheses match "b",
+In PCRE2, this pattern matches "bab". The first capturing parentheses match "b",
 then in the second group, when the back reference \1 fails to match "b", the
 second alternative matches "a" and then recurses. In the recursion, \1 does
 now match "b" and so the whole match succeeds. In Perl, the pattern fails to
@@ -2774,7 +2858,7 @@
   (?&#60;pn&#62; \( ( (?&#62;[^()]+) | \g&#60;pn&#62; )* \) )
   (sens|respons)e and \g'1'ibility
 </pre>
-PCRE supports an extension to Oniguruma: if a number is preceded by a
+PCRE2 supports an extension to Oniguruma: if a number is preceded by a
 plus or a minus sign it is taken as a relative reference. For example:
 <pre>
   (abc)(?i:\g&#60;-1&#62;)
@@ -2790,46 +2874,73 @@
 same pair of parentheses when there is a repetition.
 </P>
 <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 <i>pcre_callout</i>
-(8-bit library) or <i>pcre[16|32]_callout</i> (16-bit or 32-bit library).
-By default, this variable contains NULL, which disables all calling out.
+PCRE2 provides a similar feature, but of course it cannot obey arbitrary Perl
+code. The feature is called "callout". The caller of PCRE2 provides an external
+function by putting its entry point in a match context using the function
+<b>pcre2_set_callout()</b>, and then passing that context to <b>pcre2_match()</b>
+or <b>pcre2_dfa_match()</b>. If no match context is passed, or if the callout
+entry point is set to NULL, callouts are disabled.
 </P>
 <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:
+Within a regular expression, (?C&#60;arg&#62;) indicates a point at which the external
+function is to be called. There are two kinds of callout: those with a
+numerical argument and those with a string argument. (?C) on its own with no
+argument is treated as (?C0). A numerical argument allows the application to
+distinguish between different callouts. String arguments were added for release
+10.20 to make it possible for script languages that use PCRE2 to embed short
+scripts within patterns in a similar way to Perl.
+</P>
+<P>
+During matching, when PCRE2 reaches a callout point, the external function is
+called. It is provided with the number or string argument of the callout, the
+position in the pattern, and one item of data that is also set in the match
+block. The callout function may cause matching to proceed, to backtrack, or to
+fail.
+</P>
+<P>
+By default, PCRE2 implements a number of optimizations at matching time, and
+one side-effect is that sometimes callouts are skipped. If you need all
+possible callouts to happen, you need to set options that disable the relevant
+optimizations. More details, including a complete description of the
+programming interface to the callout function, are given in the
+<a href="pcre2callout.html"><b>pcre2callout</b></a>
+documentation.
+</P>
+<br><b>
+Callouts with numerical arguments
+</b><br>
+<P>
+If you just want to have a means of identifying different callout points, put a
+number less than 256 after the letter C. For example, this pattern has two
+callout points:
 <pre>
   (?C1)abc(?C2)def
 </pre>
-If the PCRE_AUTO_CALLOUT flag is passed to a compiling function, callouts are
-automatically installed before each item in the pattern. They are all numbered
-255. If there is a conditional group in the pattern whose condition is an
-assertion, an additional callout is inserted just before the condition. An
-explicit callout may also be set at this position, as in this example:
+If the PCRE2_AUTO_CALLOUT flag is passed to <b>pcre2_compile()</b>, numerical
+callouts are automatically installed before each item in the pattern. They are
+all numbered 255. If there is a conditional group in the pattern whose
+condition is an assertion, an additional callout is inserted just before the
+condition. An explicit callout may also be set at this position, as in this
+example:
 <pre>
   (?(?C9)(?=a)abc|def)
 </pre>
 Note that this applies only to assertion conditions, not to other types of
 condition.
 </P>
+<br><b>
+Callouts with string arguments
+</b><br>
 <P>
-During matching, when PCRE reaches a callout point, the external function is
-called. It is provided with the number of the callout, the position in the
-pattern, and, optionally, one item of data originally supplied by the caller of
-the matching function. The callout function may cause matching to proceed, to
-backtrack, or to fail altogether.
-</P>
-<P>
-By default, PCRE implements a number of optimizations at compile time and
-matching time, and one side-effect is that sometimes callouts are skipped. If
-you need all possible callouts to happen, you need to set options that disable
-the relevant optimizations. More details, and a complete description of the
-interface to the callout function, are given in the
-<a href="pcrecallout.html"><b>pcrecallout</b></a>
-documentation.
+A delimited string may be used instead of a number as a callout argument. The
+starting delimiter must be one of ` ' " ^ % # $ { and the ending delimiter is
+the same as the start, except for {, where the ending delimiter is }. If the
+ending delimiter is needed within the string, it must be doubled. For
+example:
+<pre>
+  (?C'ab ''c'' d')xyz(?C{any text})pqr
+</pre>
+The doubling is removed before the string is passed to the callout function.
 <a name="backtrackcontrol"></a></P>
 <br><a name="SEC27" href="#TOC1">BACKTRACKING CONTROL</a><br>
 <P>
@@ -2837,26 +2948,37 @@
 are still described in the Perl documentation as "experimental and subject to
 change or removal in a future version of Perl". It goes on to say: "Their usage
 in production code should be noted to avoid problems during upgrades." The same
-remarks apply to the PCRE features described in this section.
+remarks apply to the PCRE2 features described in this section.
 </P>
 <P>
 The new verbs make use of what was previously invalid syntax: an opening
-parenthesis followed by an asterisk. They are generally of the form
-(*VERB) or (*VERB:NAME). Some may take either form, possibly behaving
-differently depending on whether or not a name is present. A name is any
-sequence of characters that does not include a closing parenthesis. The maximum
-length of name is 255 in the 8-bit library and 65535 in the 16-bit and 32-bit
-libraries. If the name is empty, that is, if the closing parenthesis
-immediately follows the colon, the effect is as if the colon were not there.
-Any number of these verbs may occur in a pattern.
+parenthesis followed by an asterisk. They are generally of the form (*VERB) or
+(*VERB:NAME). Some verbs take either form, possibly behaving differently
+depending on whether or not a name is present.
+</P>
+<P>
+By default, for compatibility with Perl, a name is any sequence of characters
+that does not include a closing parenthesis. The name is not processed in
+any way, and it is not possible to include a closing parenthesis in the name.
+However, if the PCRE2_ALT_VERBNAMES option is set, normal backslash processing
+is applied to verb names and only an unescaped closing parenthesis terminates
+the name. A closing parenthesis can be included in a name either as \) or
+between \Q and \E. If the PCRE2_EXTENDED option is set, unescaped whitespace
+in verb names is skipped and #-comments are recognized, exactly as in the rest
+of the pattern.
+</P>
+<P>
+The maximum length of a name is 255 in the 8-bit library and 65535 in the
+16-bit and 32-bit libraries. If the name is empty, that is, if the closing
+parenthesis immediately follows the colon, the effect is as if the colon were
+not there. Any number of these verbs may occur in a pattern.
 </P>
 <P>
 Since these verbs are specifically related to backtracking, most of them can be
-used only when the pattern is to be matched using one of the traditional
-matching functions, because these use a backtracking algorithm. With the
-exception of (*FAIL), which behaves like a failing negative assertion, the
-backtracking control verbs cause an error if encountered by a DFA matching
-function.
+used only when the pattern is to be matched using the traditional matching
+function, because these use a backtracking algorithm. With the exception of
+(*FAIL), which behaves like a failing negative assertion, the backtracking
+control verbs cause an error if encountered by the DFA matching function.
 </P>
 <P>
 The behaviour of these verbs in
@@ -2870,18 +2992,18 @@
 Optimizations that affect backtracking verbs
 </b><br>
 <P>
-PCRE contains some optimizations that are used to speed up matching by running
+PCRE2 contains some optimizations that are used to speed up matching by running
 some checks at the start of each match attempt. For example, it may know the
 minimum length of matching subject, or that a particular character must be
 present. When one of these optimizations bypasses the running of a match, any
 included backtracking verbs will not, of course, be processed. You can suppress
-the start-of-match optimizations by setting the PCRE_NO_START_OPTIMIZE option
-when calling <b>pcre_compile()</b> or <b>pcre_exec()</b>, or by starting the
-pattern with (*NO_START_OPT). There is more discussion of this option in the
-section entitled
-<a href="pcreapi.html#execoptions">"Option bits for <b>pcre_exec()</b>"</a>
+the start-of-match optimizations by setting the PCRE2_NO_START_OPTIMIZE option
+when calling <b>pcre2_compile()</b>, or by starting the pattern with
+(*NO_START_OPT). There is more discussion of this option in the section
+entitled
+<a href="pcre2api.html#compiling">"Compiling a pattern"</a>
 in the
-<a href="pcreapi.html"><b>pcreapi</b></a>
+<a href="pcre2api.html"><b>pcre2api</b></a>
 documentation.
 </P>
 <P>
@@ -2917,7 +3039,7 @@
 This verb causes a matching failure, forcing backtracking to occur. It is
 equivalent to (?!) but easier to read. The Perl documentation notes that it is
 probably useful only when combined with (?{}) or (??{}). Those are, of course,
-Perl features that are not present in PCRE. The nearest equivalent is the
+Perl features that are not present in PCRE2. The nearest equivalent is the
 callout feature, as for example in this pattern:
 <pre>
   a+(?C)(*FAIL)
@@ -2942,13 +3064,13 @@
 When a match succeeds, the name of the last-encountered (*MARK:NAME),
 (*PRUNE:NAME), or (*THEN:NAME) on the matching path is passed back to the
 caller as described in the section entitled
-<a href="pcreapi.html#extradata">"Extra data for <b>pcre_exec()</b>"</a>
+<a href="pcre2api.html#matchotherdata">"Other information about the match"</a>
 in the
-<a href="pcreapi.html"><b>pcreapi</b></a>
-documentation. Here is an example of <b>pcretest</b> output, where the /K
+<a href="pcre2api.html"><b>pcre2api</b></a>
+documentation. Here is an example of <b>pcre2test</b> output, where the "mark"
 modifier requests the retrieval and outputting of (*MARK) data:
 <pre>
-    re&#62; /X(*MARK:A)Y|X(*MARK:B)Z/K
+    re&#62; /X(*MARK:A)Y|X(*MARK:B)Z/mark
   data&#62; XY
    0: XY
   MK: A
@@ -2970,7 +3092,7 @@
 After a partial match or a failed match, the last encountered name in the
 entire match process is returned. For example:
 <pre>
-    re&#62; /X(*MARK:A)Y|X(*MARK:B)Z/K
+    re&#62; /X(*MARK:A)Y|X(*MARK:B)Z/mark
   data&#62; XP
   No match, mark = B
 </pre>
@@ -2981,7 +3103,7 @@
 </P>
 <P>
 If you are interested in (*MARK) values after failed matches, you should
-probably set the PCRE_NO_START_OPTIMIZE option
+probably set the PCRE2_NO_START_OPTIMIZE option
 <a href="#nooptimize">(see above)</a>
 to ensure that the match is always attempted.
 </P>
@@ -2992,12 +3114,11 @@
 The following verbs do nothing when they are encountered. Matching continues
 with what follows, but if there is no subsequent match, causing a backtrack to
 the verb, a failure is forced. That is, backtracking cannot pass to the left of
-the verb. However, when one of these verbs appears inside an atomic group or an
-assertion that is true, its effect is confined to that group, because once the
-group has been matched, there is never any backtracking into it. In this
-situation, backtracking can "jump back" to the left of the entire atomic group
-or assertion. (Remember also, as stated above, that this localization also
-applies in subroutine calls.)
+the verb. However, when one of these verbs appears inside an atomic group
+(which includes any group that is called as a subroutine) or in an assertion
+that is true, its effect is confined to that group, because once the group has
+been matched, there is never any backtracking into it. In this situation,
+backtracking has to jump to the left of the entire atomic group or assertion.
 </P>
 <P>
 These verbs differ in exactly what kind of failure occurs when backtracking
@@ -3011,7 +3132,7 @@
 outright if there is a later matching failure that causes backtracking to reach
 it. Even if the pattern is unanchored, no further attempts to find a match by
 advancing the starting point take place. If (*COMMIT) is the only backtracking
-verb that is encountered, once it has been passed <b>pcre_exec()</b> is
+verb that is encountered, once it has been passed <b>pcre2_match()</b> is
 committed to finding a match at the current starting point, or not at all. For
 example:
 <pre>
@@ -3029,23 +3150,23 @@
 </P>
 <P>
 Note that (*COMMIT) at the start of a pattern is not the same as an anchor,
-unless PCRE's start-of-match optimizations are turned off, as shown in this
-output from <b>pcretest</b>:
+unless PCRE2's start-of-match optimizations are turned off, as shown in this
+output from <b>pcre2test</b>:
 <pre>
     re&#62; /(*COMMIT)abc/
   data&#62; xyzabc
    0: abc
-  data&#62; xyzabc\Y
+  data&#62;
+  re&#62; /(*COMMIT)abc/no_start_optimize
+  data&#62; xyzabc
   No match
 </pre>
-For this pattern, PCRE knows that any match must start with "a", so the
+For the first pattern, PCRE2 knows that any match must start with "a", so the
 optimization skips along the subject to "a" before applying the pattern to the
-first set of data. The match attempt then succeeds. In the second set of data,
-the escape sequence \Y is interpreted by the <b>pcretest</b> program. It causes
-the PCRE_NO_START_OPTIMIZE option to be set when <b>pcre_exec()</b> is called.
-This disables the optimization that skips along to the first character. The
-pattern is now applied starting at "x", and so the (*COMMIT) causes the match
-to fail without trying any other starting points.
+first set of data. The match attempt then succeeds. The second pattern disables
+the optimization that skips along to the first character. The pattern is now
+applied starting at "x", and so the (*COMMIT) causes the match to fail without
+trying any other starting points.
 <pre>
   (*PRUNE) or (*PRUNE:NAME)
 </pre>
@@ -3063,7 +3184,8 @@
 <P>
 The behaviour of (*PRUNE:NAME) is the not the same as (*MARK:NAME)(*PRUNE).
 It is like (*MARK:NAME) in that the name is remembered for passing back to the
-caller. However, (*SKIP:NAME) searches only for names set with (*MARK).
+caller. However, (*SKIP:NAME) searches only for names set with (*MARK),
+ignoring those set by (*PRUNE) or (*THEN).
 <pre>
   (*SKIP)
 </pre>
@@ -3114,7 +3236,8 @@
 <P>
 The behaviour of (*THEN:NAME) is the not the same as (*MARK:NAME)(*THEN).
 It is like (*MARK:NAME) in that the name is remembered for passing back to the
-caller. However, (*SKIP:NAME) searches only for names set with (*MARK).
+caller. However, (*SKIP:NAME) searches only for names set with (*MARK),
+ignoring those set by (*PRUNE) and (*THEN).
 </P>
 <P>
 A subpattern that does not contain a | character is just a part of the
@@ -3189,19 +3312,20 @@
 Backtracking verbs in repeated groups
 </b><br>
 <P>
-PCRE differs from Perl in its handling of backtracking verbs in repeated
+PCRE2 differs from Perl in its handling of backtracking verbs in repeated
 groups. For example, consider:
 <pre>
   /(a(*COMMIT)b)+ac/
 </pre>
-If the subject is "abac", Perl matches, but PCRE fails because the (*COMMIT) in
-the second repeat of the group acts.
+If the subject is "abac", Perl matches, but PCRE2 fails because the (*COMMIT)
+in the second repeat of the group acts.
 <a name="btassert"></a></P>
 <br><b>
 Backtracking verbs in assertions
 </b><br>
 <P>
-(*FAIL) in an assertion has its normal effect: it forces an immediate backtrack.
+(*FAIL) in an assertion has its normal effect: it forces an immediate
+backtrack.
 </P>
 <P>
 (*ACCEPT) in a positive assertion causes the assertion to succeed without any
@@ -3250,8 +3374,8 @@
 </P>
 <br><a name="SEC28" href="#TOC1">SEE ALSO</a><br>
 <P>
-<b>pcreapi</b>(3), <b>pcrecallout</b>(3), <b>pcrematching</b>(3),
-<b>pcresyntax</b>(3), <b>pcre</b>(3), <b>pcre16(3)</b>, <b>pcre32(3)</b>.
+<b>pcre2api</b>(3), <b>pcre2callout</b>(3), <b>pcre2matching</b>(3),
+<b>pcre2syntax</b>(3), <b>pcre2</b>(3).
 </P>
 <br><a name="SEC29" href="#TOC1">AUTHOR</a><br>
 <P>
@@ -3259,15 +3383,15 @@
 <br>
 University Computing Service
 <br>
-Cambridge CB2 3QH, England.
+Cambridge, England.
 <br>
 </P>
 <br><a name="SEC30" href="#TOC1">REVISION</a><br>
 <P>
-Last updated: 14 June 2015
+Last updated: 13 November 2015
 <br>
 Copyright &copy; 1997-2015 University of Cambridge.
 <br>
 <p>
-Return to the <a href="index.html">PCRE index page</a>.
+Return to the <a href="index.html">PCRE2 index page</a>.
 </p>
diff --git a/dist2/doc/html/pcre2perform.html b/dist2/doc/html/pcre2perform.html
new file mode 100644
index 0000000..ac9d23c
--- /dev/null
+++ b/dist2/doc/html/pcre2perform.html
@@ -0,0 +1,197 @@
+<html>
+<head>
+<title>pcre2perform specification</title>
+</head>
+<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
+<h1>pcre2perform man page</h1>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
+<p>
+This page is part of the PCRE2 HTML documentation. It was generated
+automatically from the original man page. If there is any nonsense in it,
+please consult the man page, in case the conversion went wrong.
+<br>
+<ul>
+<li><a name="TOC1" href="#SEC1">PCRE2 PERFORMANCE</a>
+<li><a name="TOC2" href="#SEC2">COMPILED PATTERN MEMORY USAGE</a>
+<li><a name="TOC3" href="#SEC3">STACK USAGE AT RUN TIME</a>
+<li><a name="TOC4" href="#SEC4">PROCESSING TIME</a>
+<li><a name="TOC5" href="#SEC5">AUTHOR</a>
+<li><a name="TOC6" href="#SEC6">REVISION</a>
+</ul>
+<br><a name="SEC1" href="#TOC1">PCRE2 PERFORMANCE</a><br>
+<P>
+Two aspects of performance are discussed below: memory usage and processing
+time. The way you express your pattern as a regular expression can affect both
+of them.
+</P>
+<br><a name="SEC2" href="#TOC1">COMPILED PATTERN MEMORY USAGE</a><br>
+<P>
+Patterns are compiled by PCRE2 into a reasonably efficient interpretive code,
+so that most simple patterns do not use much memory. However, there is one case
+where the memory usage of a compiled pattern can be unexpectedly large. If a
+parenthesized subpattern has a quantifier with a minimum greater than 1 and/or
+a limited maximum, the whole subpattern is repeated in the compiled code. For
+example, the pattern
+<pre>
+  (abc|def){2,4}
+</pre>
+is compiled as if it were
+<pre>
+  (abc|def)(abc|def)((abc|def)(abc|def)?)?
+</pre>
+(Technical aside: It is done this way so that backtrack points within each of
+the repetitions can be independently maintained.)
+</P>
+<P>
+For regular expressions whose quantifiers use only small numbers, this is not
+usually a problem. However, if the numbers are large, and particularly if such
+repetitions are nested, the memory usage can become an embarrassment. For
+example, the very simple pattern
+<pre>
+  ((ab){1,1000}c){1,3}
+</pre>
+uses 51K bytes when compiled using the 8-bit library. When PCRE2 is compiled
+with its default internal pointer size of two bytes, the size limit on a
+compiled pattern is 64K code units in the 8-bit and 16-bit libraries, and this
+is reached with the above pattern if the outer repetition is increased from 3
+to 4. PCRE2 can be compiled to use larger internal pointers and thus handle
+larger compiled patterns, but it is better to try to rewrite your pattern to
+use less memory if you can.
+</P>
+<P>
+One way of reducing the memory usage for such patterns is to make use of
+PCRE2's
+<a href="pcre2pattern.html#subpatternsassubroutines">"subroutine"</a>
+facility. Re-writing the above pattern as
+<pre>
+  ((ab)(?2){0,999}c)(?1){0,2}
+</pre>
+reduces the memory requirements to 18K, and indeed it remains under 20K even
+with the outer repetition increased to 100. However, this pattern is not
+exactly equivalent, because the "subroutine" calls are treated as
+<a href="pcre2pattern.html#atomicgroup">atomic groups</a>
+into which there can be no backtracking if there is a subsequent matching
+failure. Therefore, PCRE2 cannot do this kind of rewriting automatically.
+Furthermore, there is a noticeable loss of speed when executing the modified
+pattern. Nevertheless, if the atomic grouping is not a problem and the loss of
+speed is acceptable, this kind of rewriting will allow you to process patterns
+that PCRE2 cannot otherwise handle.
+</P>
+<br><a name="SEC3" href="#TOC1">STACK USAGE AT RUN TIME</a><br>
+<P>
+When <b>pcre2_match()</b> is used for matching, certain kinds of pattern can
+cause it to use large amounts of the process stack. In some environments the
+default process stack is quite small, and if it runs out the result is often
+SIGSEGV. Rewriting your pattern can often help. The
+<a href="pcre2stack.html"><b>pcre2stack</b></a>
+documentation discusses this issue in detail.
+</P>
+<br><a name="SEC4" href="#TOC1">PROCESSING TIME</a><br>
+<P>
+Certain items in regular expression patterns are processed more efficiently
+than others. It is more efficient to use a character class like [aeiou] than a
+set of single-character alternatives such as (a|e|i|o|u). In general, the
+simplest construction that provides the required behaviour is usually the most
+efficient. Jeffrey Friedl's book contains a lot of useful general discussion
+about optimizing regular expressions for efficient performance. This document
+contains a few observations about PCRE2.
+</P>
+<P>
+Using Unicode character properties (the \p, \P, and \X escapes) is slow,
+because PCRE2 has to use a multi-stage table lookup whenever it needs a
+character's property. If you can find an alternative pattern that does not use
+character properties, it will probably be faster.
+</P>
+<P>
+By default, the escape sequences \b, \d, \s, and \w, and the POSIX
+character classes such as [:alpha:] do not use Unicode properties, partly for
+backwards compatibility, and partly for performance reasons. However, you can
+set the PCRE2_UCP option or start the pattern with (*UCP) if you want Unicode
+character properties to be used. This can double the matching time for items
+such as \d, when matched with <b>pcre2_match()</b>; the performance loss is
+less with a DFA matching function, and in both cases there is not much
+difference for \b.
+</P>
+<P>
+When a pattern begins with .* not in atomic parentheses, nor in parentheses
+that are the subject of a backreference, and the PCRE2_DOTALL option is set,
+the pattern is implicitly anchored by PCRE2, since it can match only at the
+start of a subject string. If the pattern has multiple top-level branches, they
+must all be anchorable. The optimization can be disabled by the
+PCRE2_NO_DOTSTAR_ANCHOR option, and is automatically disabled if the pattern
+contains (*PRUNE) or (*SKIP).
+</P>
+<P>
+If PCRE2_DOTALL is not set, PCRE2 cannot make this optimization, because the
+dot metacharacter does not then match a newline, and if the subject string
+contains newlines, the pattern may match from the character immediately
+following one of them instead of from the very start. For example, the pattern
+<pre>
+  .*second
+</pre>
+matches the subject "first\nand second" (where \n stands for a newline
+character), with the match starting at the seventh character. In order to do
+this, PCRE2 has to retry the match starting after every newline in the subject.
+</P>
+<P>
+If you are using such a pattern with subject strings that do not contain
+newlines, the best performance is obtained by setting PCRE2_DOTALL, or starting
+the pattern with ^.* or ^.*? to indicate explicit anchoring. That saves PCRE2
+from having to scan along the subject looking for a newline to restart at.
+</P>
+<P>
+Beware of patterns that contain nested indefinite repeats. These can take a
+long time to run when applied to a string that does not match. Consider the
+pattern fragment
+<pre>
+  ^(a+)*
+</pre>
+This can match "aaaa" in 16 different ways, and this number increases very
+rapidly as the string gets longer. (The * repeat can match 0, 1, 2, 3, or 4
+times, and for each of those cases other than 0 or 4, the + repeats can match
+different numbers of times.) When the remainder of the pattern is such that the
+entire match is going to fail, PCRE2 has in principle to try every possible
+variation, and this can take an extremely long time, even for relatively short
+strings.
+</P>
+<P>
+An optimization catches some of the more simple cases such as
+<pre>
+  (a+)*b
+</pre>
+where a literal character follows. Before embarking on the standard matching
+procedure, PCRE2 checks that there is a "b" later in the subject string, and if
+there is not, it fails the match immediately. However, when there is no
+following literal this optimization cannot be used. You can see the difference
+by comparing the behaviour of
+<pre>
+  (a+)*\d
+</pre>
+with the pattern above. The former gives a failure almost instantly when
+applied to a whole line of "a" characters, whereas the latter takes an
+appreciable time with strings longer than about 20 characters.
+</P>
+<P>
+In many cases, the solution to this kind of performance issue is to use an
+atomic group or a possessive quantifier.
+</P>
+<br><a name="SEC5" href="#TOC1">AUTHOR</a><br>
+<P>
+Philip Hazel
+<br>
+University Computing Service
+<br>
+Cambridge, England.
+<br>
+</P>
+<br><a name="SEC6" href="#TOC1">REVISION</a><br>
+<P>
+Last updated: 02 January 2015
+<br>
+Copyright &copy; 1997-2015 University of Cambridge.
+<br>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
diff --git a/dist/doc/html/pcreposix.html b/dist2/doc/html/pcre2posix.html
similarity index 64%
rename from dist/doc/html/pcreposix.html
rename to dist2/doc/html/pcre2posix.html
index 18924cf..e16a4c3 100644
--- a/dist/doc/html/pcreposix.html
+++ b/dist2/doc/html/pcre2posix.html
@@ -1,16 +1,16 @@
 <html>
 <head>
-<title>pcreposix specification</title>
+<title>pcre2posix specification</title>
 </head>
 <body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
-<h1>pcreposix man page</h1>
+<h1>pcre2posix man page</h1>
 <p>
-Return to the <a href="index.html">PCRE index page</a>.
+Return to the <a href="index.html">PCRE2 index page</a>.
 </p>
 <p>
-This page is part of the PCRE HTML documentation. It was generated automatically
-from the original man page. If there is any nonsense in it, please consult the
-man page, in case the conversion went wrong.
+This page is part of the PCRE2 HTML documentation. It was generated
+automatically from the original man page. If there is any nonsense in it,
+please consult the man page, in case the conversion went wrong.
 <br>
 <ul>
 <li><a name="TOC1" href="#SEC1">SYNOPSIS</a>
@@ -25,16 +25,18 @@
 </ul>
 <br><a name="SEC1" href="#TOC1">SYNOPSIS</a><br>
 <P>
-<b>#include &#60;pcreposix.h&#62;</b>
+<b>#include &#60;pcre2posix.h&#62;</b>
 </P>
 <P>
 <b>int regcomp(regex_t *<i>preg</i>, const char *<i>pattern</i>,</b>
 <b>     int <i>cflags</i>);</b>
 <br>
 <br>
-<b>int regexec(regex_t *<i>preg</i>, const char *<i>string</i>,</b>
+<b>int regexec(const regex_t *<i>preg</i>, const char *<i>string</i>,</b>
 <b>     size_t <i>nmatch</i>, regmatch_t <i>pmatch</i>[], int <i>eflags</i>);</b>
-<b>     size_t regerror(int <i>errcode</i>, const regex_t *<i>preg</i>,</b>
+<br>
+<br>
+<b>size_t regerror(int <i>errcode</i>, const regex_t *<i>preg</i>,</b>
 <b>     char *<i>errbuf</i>, size_t <i>errbuf_size</i>);</b>
 <br>
 <br>
@@ -42,43 +44,43 @@
 </P>
 <br><a name="SEC2" href="#TOC1">DESCRIPTION</a><br>
 <P>
-This set of functions provides a POSIX-style API for the PCRE regular
+This set of functions provides a POSIX-style API for the PCRE2 regular
 expression 8-bit library. See the
-<a href="pcreapi.html"><b>pcreapi</b></a>
-documentation for a description of PCRE's native API, which contains much
-additional functionality. There is no POSIX-style wrapper for PCRE's 16-bit
-and 32-bit library.
+<a href="pcre2api.html"><b>pcre2api</b></a>
+documentation for a description of PCRE2's native API, which contains much
+additional functionality. There is no POSIX-style wrapper for PCRE2's 16-bit
+and 32-bit libraries.
 </P>
 <P>
 The functions described here are just wrapper functions that ultimately call
-the PCRE native API. Their prototypes are defined in the <b>pcreposix.h</b>
+the PCRE2 native API. Their prototypes are defined in the <b>pcre2posix.h</b>
 header file, and on Unix systems the library itself is called
-<b>pcreposix.a</b>, so can be accessed by adding <b>-lpcreposix</b> to the
+<b>libpcre2-posix.a</b>, so can be accessed by adding <b>-lpcre2-posix</b> to the
 command for linking an application that uses them. Because the POSIX functions
-call the native ones, it is also necessary to add <b>-lpcre</b>.
+call the native ones, it is also necessary to add <b>-lpcre2-8</b>.
 </P>
 <P>
-I have implemented only those POSIX option bits that can be reasonably mapped
-to PCRE native options. In addition, the option REG_EXTENDED is defined with
-the value zero. This has no effect, but since programs that are written to the
-POSIX interface often use it, this makes it easier to slot in PCRE as a
+Those POSIX option bits that can reasonably be mapped to PCRE2 native options
+have been implemented. In addition, the option REG_EXTENDED is defined with the
+value zero. This has no effect, but since programs that are written to the
+POSIX interface often use it, this makes it easier to slot in PCRE2 as a
 replacement library. Other POSIX options are not even defined.
 </P>
 <P>
 There are also some other options that are not defined by POSIX. These have
 been added at the request of users who want to make use of certain
-PCRE-specific features via the POSIX calling interface.
+PCRE2-specific features via the POSIX calling interface.
 </P>
 <P>
-When PCRE is called via these functions, it is only the API that is POSIX-like
+When PCRE2 is called via these functions, it is only the API that is POSIX-like
 in style. The syntax and semantics of the regular expressions themselves are
-still those of Perl, subject to the setting of various PCRE options, as
+still those of Perl, subject to the setting of various PCRE2 options, as
 described below. "POSIX-like in style" means that the API approximates to the
-POSIX definition; it is not fully POSIX-compatible, and in multi-byte encoding
+POSIX definition; it is not fully POSIX-compatible, and in multi-unit encoding
 domains it is probably even less compatible.
 </P>
 <P>
-The header for these functions is supplied as <b>pcreposix.h</b> to avoid any
+The header for these functions is supplied as <b>pcre2posix.h</b> to avoid any
 potential clash with other POSIX libraries. It can, of course, be renamed or
 aliased as <b>regex.h</b>, which is the "correct" name. It provides two
 structure types, <i>regex_t</i> for compiled internal forms, and
@@ -100,24 +102,24 @@
 <pre>
   REG_DOTALL
 </pre>
-The PCRE_DOTALL option is set when the regular expression is passed for
+The PCRE2_DOTALL option is set when the regular expression is passed for
 compilation to the native function. Note that REG_DOTALL is not part of the
 POSIX standard.
 <pre>
   REG_ICASE
 </pre>
-The PCRE_CASELESS option is set when the regular expression is passed for
+The PCRE2_CASELESS option is set when the regular expression is passed for
 compilation to the native function.
 <pre>
   REG_NEWLINE
 </pre>
-The PCRE_MULTILINE option is set when the regular expression is passed for
+The PCRE2_MULTILINE option is set when the regular expression is passed for
 compilation to the native function. Note that this does <i>not</i> mimic the
 defined POSIX behaviour for REG_NEWLINE (see the following section).
 <pre>
   REG_NOSUB
 </pre>
-The PCRE_NO_AUTO_CAPTURE option is set when the regular expression is passed
+The PCRE2_NO_AUTO_CAPTURE option is set when the regular expression is passed
 for compilation to the native function. In addition, when a pattern that is
 compiled with this flag is passed to <b>regexec()</b> for matching, the
 <i>nmatch</i> and <i>pmatch</i> arguments are ignored, and no captured strings
@@ -125,32 +127,32 @@
 <pre>
   REG_UCP
 </pre>
-The PCRE_UCP option is set when the regular expression is passed for
-compilation to the native function. This causes PCRE to use Unicode properties
+The PCRE2_UCP option is set when the regular expression is passed for
+compilation to the native function. This causes PCRE2 to use Unicode properties
 when matchine \d, \w, etc., instead of just recognizing ASCII values. Note
-that REG_UTF8 is not part of the POSIX standard.
+that REG_UCP is not part of the POSIX standard.
 <pre>
   REG_UNGREEDY
 </pre>
-The PCRE_UNGREEDY option is set when the regular expression is passed for
+The PCRE2_UNGREEDY option is set when the regular expression is passed for
 compilation to the native function. Note that REG_UNGREEDY is not part of the
 POSIX standard.
 <pre>
-  REG_UTF8
+  REG_UTF
 </pre>
-The PCRE_UTF8 option is set when the regular expression is passed for
+The PCRE2_UTF option is set when the regular expression is passed for
 compilation to the native function. This causes the pattern itself and all data
-strings used for matching it to be treated as UTF-8 strings. Note that REG_UTF8
+strings used for matching it to be treated as UTF-8 strings. Note that REG_UTF
 is not part of the POSIX standard.
 </P>
 <P>
 In the absence of these flags, no options are passed to the native function.
-This means the the regex is compiled with PCRE default semantics. In
+This means the the regex is compiled with PCRE2 default semantics. In
 particular, the way it handles newline characters in the subject string is the
-Perl way, not the POSIX way. Note that setting PCRE_MULTILINE has only
+Perl way, not the POSIX way. Note that setting PCRE2_MULTILINE has only
 <i>some</i> of the effects specified for REG_NEWLINE. It does not affect the way
-newlines are matched by . (they are not) or by a negative class such as [^a]
-(they are).
+newlines are matched by the dot metacharacter (they are not) or by a negative
+class such as [^a] (they are).
 </P>
 <P>
 The yield of <b>regcomp()</b> is zero on success, and non-zero otherwise. The
@@ -166,19 +168,19 @@
 <br><a name="SEC4" href="#TOC1">MATCHING NEWLINE CHARACTERS</a><br>
 <P>
 This area is not simple, because POSIX and Perl take different views of things.
-It is not possible to get PCRE to obey POSIX semantics, but then PCRE was never
-intended to be a POSIX engine. The following table lists the different
-possibilities for matching newline characters in PCRE:
+It is not possible to get PCRE2 to obey POSIX semantics, but then PCRE2 was
+never intended to be a POSIX engine. The following table lists the different
+possibilities for matching newline characters in Perl and PCRE2:
 <pre>
                           Default   Change with
 
-  . matches newline          no     PCRE_DOTALL
+  . matches newline          no     PCRE2_DOTALL
   newline matches [^a]       yes    not changeable
-  $ matches \n at end        yes    PCRE_DOLLARENDONLY
-  $ matches \n in middle     no     PCRE_MULTILINE
-  ^ matches \n in middle     no     PCRE_MULTILINE
+  $ matches \n at end        yes    PCRE2_DOLLAR_ENDONLY
+  $ matches \n in middle     no     PCRE2_MULTILINE
+  ^ matches \n in middle     no     PCRE2_MULTILINE
 </pre>
-This is the equivalent table for POSIX:
+This is the equivalent table for a POSIX-compatible pattern matcher:
 <pre>
                           Default   Change with
 
@@ -188,14 +190,18 @@
   $ matches \n in middle     no     REG_NEWLINE
   ^ matches \n in middle     no     REG_NEWLINE
 </pre>
-PCRE's behaviour is the same as Perl's, except that there is no equivalent for
-PCRE_DOLLAR_ENDONLY in Perl. In both PCRE and Perl, there is no way to stop
-newline from matching [^a].
+This behaviour is not what happens when PCRE2 is called via its POSIX
+API. By default, PCRE2's behaviour is the same as Perl's, except that there is
+no equivalent for PCRE2_DOLLAR_ENDONLY in Perl. In both PCRE2 and Perl, there
+is no way to stop newline from matching [^a].
 </P>
 <P>
-The default POSIX newline handling can be obtained by setting PCRE_DOTALL and
-PCRE_DOLLAR_ENDONLY, but there is no way to make PCRE behave exactly as for the
-REG_NEWLINE action.
+Default POSIX newline handling can be obtained by setting PCRE2_DOTALL and
+PCRE2_DOLLAR_ENDONLY when calling <b>pcre2_compile()</b> directly, but there is
+no way to make PCRE2 behave exactly as for the REG_NEWLINE action. When using
+the POSIX API, passing REG_NEWLINE to PCRE2's <b>regcomp()</b> function
+causes PCRE2_MULTILINE to be passed to <b>pcre2_compile()</b>, and REG_DOTALL
+passes PCRE2_DOTALL. There is no way to pass PCRE2_DOLLAR_ENDONLY.
 </P>
 <br><a name="SEC5" href="#TOC1">MATCHING A PATTERN</a><br>
 <P>
@@ -206,18 +212,18 @@
 <pre>
   REG_NOTBOL
 </pre>
-The PCRE_NOTBOL option is set when calling the underlying PCRE matching
+The PCRE2_NOTBOL option is set when calling the underlying PCRE2 matching
 function.
 <pre>
   REG_NOTEMPTY
 </pre>
-The PCRE_NOTEMPTY option is set when calling the underlying PCRE matching
+The PCRE2_NOTEMPTY option is set when calling the underlying PCRE2 matching
 function. Note that REG_NOTEMPTY is not part of the POSIX standard. However,
 setting this option can give more POSIX-like behaviour in some situations.
 <pre>
   REG_NOTEOL
 </pre>
-The PCRE_NOTEOL option is set when calling the underlying PCRE matching
+The PCRE2_NOTEOL option is set when calling the underlying PCRE2 matching
 function.
 <pre>
   REG_STARTEND
@@ -229,7 +235,8 @@
 IEEE Standard 1003.2 (POSIX.2), and should be used with caution in software
 intended to be portable to other systems. Note that a non-zero <i>rm_so</i> does
 not imply REG_NOTBOL; REG_STARTEND affects only the location of the string, not
-how it is matched.
+how it is matched. Setting REG_STARTEND and passing <i>pmatch</i> as NULL are
+mutually exclusive; the error REG_INVARG is returned.
 </P>
 <P>
 If the pattern was compiled with the REG_NOSUB flag, no data about any matched
@@ -244,7 +251,7 @@
 Otherwise,the portion of the string that was matched, and also any captured
 substrings, are returned via the <i>pmatch</i> argument, which points to an
 array of <i>nmatch</i> structures of type <i>regmatch_t</i>, containing the
-members <i>rm_so</i> and <i>rm_eo</i>. These contain the offset to the first
+members <i>rm_so</i> and <i>rm_eo</i>. These contain the byte offset to the first
 character of each substring and the offset to the first character after the end
 of each substring, respectively. The 0th element of the vector relates to the
 entire portion of <i>string</i> that was matched; subsequent elements relate to
@@ -260,9 +267,11 @@
 The <b>regerror()</b> function maps a non-zero errorcode from either
 <b>regcomp()</b> or <b>regexec()</b> to a printable message. If <i>preg</i> is not
 NULL, the error should have arisen from the use of that structure. A message
-terminated by a binary zero is placed in <i>errbuf</i>. The length of the
-message, including the zero, is limited to <i>errbuf_size</i>. The yield of the
-function is the size of buffer needed to hold the whole message.
+terminated by a binary zero is placed in <i>errbuf</i>. If the buffer is too
+short, only the first <i>errbuf_size</i> - 1 characters of the error message are
+used. The yield of the function is the size of buffer needed to hold the whole
+message, including the terminating zero. This value is greater than
+<i>errbuf_size</i> if the message was truncated.
 </P>
 <br><a name="SEC7" href="#TOC1">MEMORY USAGE</a><br>
 <P>
@@ -276,15 +285,15 @@
 <br>
 University Computing Service
 <br>
-Cambridge CB2 3QH, England.
+Cambridge, England.
 <br>
 </P>
 <br><a name="SEC9" href="#TOC1">REVISION</a><br>
 <P>
-Last updated: 09 January 2012
+Last updated: 29 November 2015
 <br>
-Copyright &copy; 1997-2012 University of Cambridge.
+Copyright &copy; 1997-2015 University of Cambridge.
 <br>
 <p>
-Return to the <a href="index.html">PCRE index page</a>.
+Return to the <a href="index.html">PCRE2 index page</a>.
 </p>
diff --git a/dist2/doc/html/pcre2sample.html b/dist2/doc/html/pcre2sample.html
new file mode 100644
index 0000000..60a928b
--- /dev/null
+++ b/dist2/doc/html/pcre2sample.html
@@ -0,0 +1,106 @@
+<html>
+<head>
+<title>pcre2sample specification</title>
+</head>
+<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
+<h1>pcre2sample man page</h1>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
+<p>
+This page is part of the PCRE2 HTML documentation. It was generated
+automatically from the original man page. If there is any nonsense in it,
+please consult the man page, in case the conversion went wrong.
+<br>
+<br><b>
+PCRE2 SAMPLE PROGRAM
+</b><br>
+<P>
+A simple, complete demonstration program to get you started with using PCRE2 is
+supplied in the file <i>pcre2demo.c</i> in the <b>src</b> directory in the PCRE2
+distribution. A listing of this program is given in the
+<a href="pcre2demo.html"><b>pcre2demo</b></a>
+documentation. If you do not have a copy of the PCRE2 distribution, you can
+save this listing to re-create the contents of <i>pcre2demo.c</i>.
+</P>
+<P>
+The demonstration program, which uses the PCRE2 8-bit library, compiles the
+regular expression that is its first argument, and matches it against the
+subject string in its second argument. No PCRE2 options are set, and default
+character tables are used. If matching succeeds, the program outputs the
+portion of the subject that matched, together with the contents of any captured
+substrings.
+</P>
+<P>
+If the -g option is given on the command line, the program then goes on to
+check for further matches of the same regular expression in the same subject
+string. The logic is a little bit tricky because of the possibility of matching
+an empty string. Comments in the code explain what is going on.
+</P>
+<P>
+If PCRE2 is installed in the standard include and library directories for your
+operating system, you should be able to compile the demonstration program using
+this command:
+<pre>
+  gcc -o pcre2demo pcre2demo.c -lpcre2-8
+</pre>
+If PCRE2 is installed elsewhere, you may need to add additional options to the
+command line. For example, on a Unix-like system that has PCRE2 installed in
+<i>/usr/local</i>, you can compile the demonstration program using a command
+like this:
+<pre>
+  gcc -o pcre2demo -I/usr/local/include pcre2demo.c -L/usr/local/lib -lpcre2-8
+
+</PRE>
+</P>
+<P>
+Once you have compiled and linked the demonstration program, you can run simple
+tests like this:
+<pre>
+  ./pcre2demo 'cat|dog' 'the cat sat on the mat'
+  ./pcre2demo -g 'cat|dog' 'the dog sat on the cat'
+</pre>
+Note that there is a much more comprehensive test program, called
+<a href="pcre2test.html"><b>pcre2test</b>,</a>
+which supports many more facilities for testing regular expressions using the
+PCRE2 libraries. The
+<a href="pcre2demo.html"><b>pcre2demo</b></a>
+program is provided as a simple coding example.
+</P>
+<P>
+If you try to run
+<a href="pcre2demo.html"><b>pcre2demo</b></a>
+when PCRE2 is not installed in the standard library directory, you may get an
+error like this on some operating systems (e.g. Solaris):
+<pre>
+  ld.so.1: a.out: fatal: libpcre2.so.0: open failed: No such file or directory
+</pre>
+This is caused by the way shared library support works on those systems. You
+need to add
+<pre>
+  -R/usr/local/lib
+</pre>
+(for example) to the compile command to get round this problem.
+</P>
+<br><b>
+AUTHOR
+</b><br>
+<P>
+Philip Hazel
+<br>
+University Computing Service
+<br>
+Cambridge, England.
+<br>
+</P>
+<br><b>
+REVISION
+</b><br>
+<P>
+Last updated: 20 October 2014
+<br>
+Copyright &copy; 1997-2014 University of Cambridge.
+<br>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
diff --git a/dist2/doc/html/pcre2serialize.html b/dist2/doc/html/pcre2serialize.html
new file mode 100644
index 0000000..3747c0a
--- /dev/null
+++ b/dist2/doc/html/pcre2serialize.html
@@ -0,0 +1,189 @@
+<html>
+<head>
+<title>pcre2serialize specification</title>
+</head>
+<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
+<h1>pcre2serialize man page</h1>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
+<p>
+This page is part of the PCRE2 HTML documentation. It was generated
+automatically from the original man page. If there is any nonsense in it,
+please consult the man page, in case the conversion went wrong.
+<br>
+<ul>
+<li><a name="TOC1" href="#SEC1">SAVING AND RE-USING PRECOMPILED PCRE2 PATTERNS</a>
+<li><a name="TOC2" href="#SEC2">SAVING COMPILED PATTERNS</a>
+<li><a name="TOC3" href="#SEC3">RE-USING PRECOMPILED PATTERNS</a>
+<li><a name="TOC4" href="#SEC4">AUTHOR</a>
+<li><a name="TOC5" href="#SEC5">REVISION</a>
+</ul>
+<br><a name="SEC1" href="#TOC1">SAVING AND RE-USING PRECOMPILED PCRE2 PATTERNS</a><br>
+<P>
+<b>int32_t pcre2_serialize_decode(pcre2_code **<i>codes</i>,</b>
+<b>  int32_t <i>number_of_codes</i>, const uint32_t *<i>bytes</i>,</b>
+<b>  pcre2_general_context *<i>gcontext</i>);</b>
+<br>
+<br>
+<b>int32_t pcre2_serialize_encode(pcre2_code **<i>codes</i>,</b>
+<b>  int32_t <i>number_of_codes</i>, uint32_t **<i>serialized_bytes</i>,</b>
+<b>  PCRE2_SIZE *<i>serialized_size</i>, pcre2_general_context *<i>gcontext</i>);</b>
+<br>
+<br>
+<b>void pcre2_serialize_free(uint8_t *<i>bytes</i>);</b>
+<br>
+<br>
+<b>int32_t pcre2_serialize_get_number_of_codes(const uint8_t *<i>bytes</i>);</b>
+<br>
+<br>
+If you are running an application that uses a large number of regular
+expression patterns, it may be useful to store them in a precompiled form
+instead of having to compile them every time the application is run. However,
+if you are using the just-in-time optimization feature, it is not possible to
+save and reload the JIT data, because it is position-dependent. The host on
+which the patterns are reloaded must be running the same version of PCRE2, with
+the same code unit width, and must also have the same endianness, pointer width
+and PCRE2_SIZE type. For example, patterns compiled on a 32-bit system using
+PCRE2's 16-bit library cannot be reloaded on a 64-bit system, nor can they be
+reloaded using the 8-bit library.
+</P>
+<br><a name="SEC2" href="#TOC1">SAVING COMPILED PATTERNS</a><br>
+<P>
+Before compiled patterns can be saved they must be serialized, that is,
+converted to a stream of bytes. A single byte stream may contain any number of
+compiled patterns, but they must all use the same character tables. A single
+copy of the tables is included in the byte stream (its size is 1088 bytes). For
+more details of character tables, see the
+<a href="pcre2api.html#localesupport">section on locale support</a>
+in the
+<a href="pcre2api.html"><b>pcre2api</b></a>
+documentation.
+</P>
+<P>
+The function <b>pcre2_serialize_encode()</b> creates a serialized byte stream
+from a list of compiled patterns. Its first two arguments specify the list,
+being a pointer to a vector of pointers to compiled patterns, and the length of
+the vector. The third and fourth arguments point to variables which are set to
+point to the created byte stream and its length, respectively. The final
+argument is a pointer to a general context, which can be used to specify custom
+memory mangagement functions. If this argument is NULL, <b>malloc()</b> is used
+to obtain memory for the byte stream. The yield of the function is the number
+of serialized patterns, or one of the following negative error codes:
+<pre>
+  PCRE2_ERROR_BADDATA      the number of patterns is zero or less
+  PCRE2_ERROR_BADMAGIC     mismatch of id bytes in one of the patterns
+  PCRE2_ERROR_MEMORY       memory allocation failed
+  PCRE2_ERROR_MIXEDTABLES  the patterns do not all use the same tables
+  PCRE2_ERROR_NULL         the 1st, 3rd, or 4th argument is NULL
+</pre>
+PCRE2_ERROR_BADMAGIC means either that a pattern's code has been corrupted, or
+that a slot in the vector does not point to a compiled pattern.
+</P>
+<P>
+Once a set of patterns has been serialized you can save the data in any
+appropriate manner. Here is sample code that compiles two patterns and writes
+them to a file. It assumes that the variable <i>fd</i> refers to a file that is
+open for output. The error checking that should be present in a real
+application has been omitted for simplicity.
+<pre>
+  int errorcode;
+  uint8_t *bytes;
+  PCRE2_SIZE erroroffset;
+  PCRE2_SIZE bytescount;
+  pcre2_code *list_of_codes[2];
+  list_of_codes[0] = pcre2_compile("first pattern",
+    PCRE2_ZERO_TERMINATED, 0, &errorcode, &erroroffset, NULL);
+  list_of_codes[1] = pcre2_compile("second pattern",
+    PCRE2_ZERO_TERMINATED, 0, &errorcode, &erroroffset, NULL);
+  errorcode = pcre2_serialize_encode(list_of_codes, 2, &bytes,
+    &bytescount, NULL);
+  errorcode = fwrite(bytes, 1, bytescount, fd);
+</pre>
+Note that the serialized data is binary data that may contain any of the 256
+possible byte values. On systems that make a distinction between binary and
+non-binary data, be sure that the file is opened for binary output.
+</P>
+<P>
+Serializing a set of patterns leaves the original data untouched, so they can
+still be used for matching. Their memory must eventually be freed in the usual
+way by calling <b>pcre2_code_free()</b>. When you have finished with the byte
+stream, it too must be freed by calling <b>pcre2_serialize_free()</b>.
+</P>
+<br><a name="SEC3" href="#TOC1">RE-USING PRECOMPILED PATTERNS</a><br>
+<P>
+In order to re-use a set of saved patterns you must first make the serialized
+byte stream available in main memory (for example, by reading from a file). The
+management of this memory block is up to the application. You can use the
+<b>pcre2_serialize_get_number_of_codes()</b> function to find out how many
+compiled patterns are in the serialized data without actually decoding the
+patterns:
+<pre>
+  uint8_t *bytes = &#60;serialized data&#62;;
+  int32_t number_of_codes = pcre2_serialize_get_number_of_codes(bytes);
+</pre>
+The <b>pcre2_serialize_decode()</b> function reads a byte stream and recreates
+the compiled patterns in new memory blocks, setting pointers to them in a
+vector. The first two arguments are a pointer to a suitable vector and its
+length, and the third argument points to a byte stream. The final argument is a
+pointer to a general context, which can be used to specify custom memory
+mangagement functions for the decoded patterns. If this argument is NULL,
+<b>malloc()</b> and <b>free()</b> are used. After deserialization, the byte
+stream is no longer needed and can be discarded.
+<pre>
+  int32_t number_of_codes;
+  pcre2_code *list_of_codes[2];
+  uint8_t *bytes = &#60;serialized data&#62;;
+  int32_t number_of_codes =
+    pcre2_serialize_decode(list_of_codes, 2, bytes, NULL);
+</pre>
+If the vector is not large enough for all the patterns in the byte stream, it
+is filled with those that fit, and the remainder are ignored. The yield of the
+function is the number of decoded patterns, or one of the following negative
+error codes:
+<pre>
+  PCRE2_ERROR_BADDATA   second argument is zero or less
+  PCRE2_ERROR_BADMAGIC  mismatch of id bytes in the data
+  PCRE2_ERROR_BADMODE   mismatch of variable unit size or PCRE2 version
+  PCRE2_ERROR_MEMORY    memory allocation failed
+  PCRE2_ERROR_NULL      first or third argument is NULL
+</pre>
+PCRE2_ERROR_BADMAGIC may mean that the data is corrupt, or that it was compiled
+on a system with different endianness.
+</P>
+<P>
+Decoded patterns can be used for matching in the usual way, and must be freed
+by calling <b>pcre2_code_free()</b>. However, be aware that there is a potential
+race issue if you are using multiple patterns that were decoded from a single
+byte stream in a multithreaded application. A single copy of the character
+tables is used by all the decoded patterns and a reference count is used to
+arrange for its memory to be automatically freed when the last pattern is
+freed, but there is no locking on this reference count. Therefore, if you want
+to call <b>pcre2_code_free()</b> for these patterns in different threads, you
+must arrange your own locking, and ensure that <b>pcre2_code_free()</b> cannot
+be called by two threads at the same time.
+</P>
+<P>
+If a pattern was processed by <b>pcre2_jit_compile()</b> before being
+serialized, the JIT data is discarded and so is no longer available after a
+save/restore cycle. You can, however, process a restored pattern with
+<b>pcre2_jit_compile()</b> if you wish.
+</P>
+<br><a name="SEC4" href="#TOC1">AUTHOR</a><br>
+<P>
+Philip Hazel
+<br>
+University Computing Service
+<br>
+Cambridge, England.
+<br>
+</P>
+<br><a name="SEC5" href="#TOC1">REVISION</a><br>
+<P>
+Last updated: 03 November 2015
+<br>
+Copyright &copy; 1997-2015 University of Cambridge.
+<br>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
diff --git a/dist2/doc/html/pcre2stack.html b/dist2/doc/html/pcre2stack.html
new file mode 100644
index 0000000..2942c7a
--- /dev/null
+++ b/dist2/doc/html/pcre2stack.html
@@ -0,0 +1,207 @@
+<html>
+<head>
+<title>pcre2stack specification</title>
+</head>
+<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
+<h1>pcre2stack man page</h1>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
+<p>
+This page is part of the PCRE2 HTML documentation. It was generated
+automatically from the original man page. If there is any nonsense in it,
+please consult the man page, in case the conversion went wrong.
+<br>
+<br><b>
+PCRE2 DISCUSSION OF STACK USAGE
+</b><br>
+<P>
+When you call <b>pcre2_match()</b>, it makes use of an internal function called
+<b>match()</b>. This calls itself recursively at branch points in the pattern,
+in order to remember the state of the match so that it can back up and try a
+different alternative after a failure. As matching proceeds deeper and deeper
+into the tree of possibilities, the recursion depth increases. The
+<b>match()</b> function is also called in other circumstances, for example,
+whenever a parenthesized sub-pattern is entered, and in certain cases of
+repetition.
+</P>
+<P>
+Not all calls of <b>match()</b> increase the recursion depth; for an item such
+as a* it may be called several times at the same level, after matching
+different numbers of a's. Furthermore, in a number of cases where the result of
+the recursive call would immediately be passed back as the result of the
+current call (a "tail recursion"), the function is just restarted instead.
+</P>
+<P>
+Each time the internal <b>match()</b> function is called recursively, it uses
+memory from the process stack. For certain kinds of pattern and data, very
+large amounts of stack may be needed, despite the recognition of "tail
+recursion". Note that if PCRE2 is compiled with the -fsanitize=address option
+of the GCC compiler, the stack requirements are greatly increased.
+</P>
+<P>
+The above comments apply when <b>pcre2_match()</b> is run in its normal
+interpretive manner. If the compiled pattern was processed by
+<b>pcre2_jit_compile()</b>, and just-in-time compiling was successful, and the
+options passed to <b>pcre2_match()</b> were not incompatible, the matching
+process uses the JIT-compiled code instead of the <b>match()</b> function. In
+this case, the memory requirements are handled entirely differently. See the
+<a href="pcre2jit.html"><b>pcre2jit</b></a>
+documentation for details.
+</P>
+<P>
+The <b>pcre2_dfa_match()</b> function operates in a different way to
+<b>pcre2_match()</b>, and uses recursion only when there is a regular expression
+recursion or subroutine call in the pattern. This includes the processing of
+assertion and "once-only" subpatterns, which are handled like subroutine calls.
+Normally, these are never very deep, and the limit on the complexity of
+<b>pcre2_dfa_match()</b> is controlled by the amount of workspace it is given.
+However, it is possible to write patterns with runaway infinite recursions;
+such patterns will cause <b>pcre2_dfa_match()</b> to run out of stack. At
+present, there is no protection against this.
+</P>
+<P>
+The comments that follow do NOT apply to <b>pcre2_dfa_match()</b>; they are
+relevant only for <b>pcre2_match()</b> without the JIT optimization.
+</P>
+<br><b>
+Reducing <b>pcre2_match()</b>'s stack usage
+</b><br>
+<P>
+You can often reduce the amount of recursion, and therefore the
+amount of stack used, by modifying the pattern that is being matched. Consider,
+for example, this pattern:
+<pre>
+  ([^&#60;]|&#60;(?!inet))+
+</pre>
+It matches from wherever it starts until it encounters "&#60;inet" or the end of
+the data, and is the kind of pattern that might be used when processing an XML
+file. Each iteration of the outer parentheses matches either one character that
+is not "&#60;" or a "&#60;" that is not followed by "inet". However, each time a
+parenthesis is processed, a recursion occurs, so this formulation uses a stack
+frame for each matched character. For a long string, a lot of stack is
+required. Consider now this rewritten pattern, which matches exactly the same
+strings:
+<pre>
+  ([^&#60;]++|&#60;(?!inet))+
+</pre>
+This uses very much less stack, because runs of characters that do not contain
+"&#60;" are "swallowed" in one item inside the parentheses. Recursion happens only
+when a "&#60;" character that is not followed by "inet" is encountered (and we
+assume this is relatively rare). A possessive quantifier is used to stop any
+backtracking into the runs of non-"&#60;" characters, but that is not related to
+stack usage.
+</P>
+<P>
+This example shows that one way of avoiding stack problems when matching long
+subject strings is to write repeated parenthesized subpatterns to match more
+than one character whenever possible.
+</P>
+<br><b>
+Compiling PCRE2 to use heap instead of stack for <b>pcre2_match()</b>
+</b><br>
+<P>
+In environments where stack memory is constrained, you might want to compile
+PCRE2 to use heap memory instead of stack for remembering back-up points when
+<b>pcre2_match()</b> is running. This makes it run more slowly, however. Details
+of how to do this are given in the
+<a href="pcre2build.html"><b>pcre2build</b></a>
+documentation. When built in this way, instead of using the stack, PCRE2
+gets memory for remembering backup points from the heap. By default, the memory
+is obtained by calling the system <b>malloc()</b> function, but you can arrange
+to supply your own memory management function. For details, see the section
+entitled
+<a href="pcre2api.html#matchcontext">"The match context"</a>
+in the
+<a href="pcre2api.html"><b>pcre2api</b></a>
+documentation. Since the block sizes are always the same, it may be possible to
+implement customized a memory handler that is more efficient than the standard
+function. The memory blocks obtained for this purpose are retained and re-used
+if possible while <b>pcre2_match()</b> is running. They are all freed just
+before it exits.
+</P>
+<br><b>
+Limiting <b>pcre2_match()</b>'s stack usage
+</b><br>
+<P>
+You can set limits on the number of times the internal <b>match()</b> function
+is called, both in total and recursively. If a limit is exceeded,
+<b>pcre2_match()</b> returns an error code. Setting suitable limits should
+prevent it from running out of stack. The default values of the limits are very
+large, and unlikely ever to operate. They can be changed when PCRE2 is built,
+and they can also be set when <b>pcre2_match()</b> is called. For details of
+these interfaces, see the
+<a href="pcre2build.html"><b>pcre2build</b></a>
+documentation and the section entitled
+<a href="pcre2api.html#matchcontext">"The match context"</a>
+in the
+<a href="pcre2api.html"><b>pcre2api</b></a>
+documentation.
+</P>
+<P>
+As a very rough rule of thumb, you should reckon on about 500 bytes per
+recursion. Thus, if you want to limit your stack usage to 8Mb, you should set
+the limit at 16000 recursions. A 64Mb stack, on the other hand, can support
+around 128000 recursions.
+</P>
+<P>
+The <b>pcre2test</b> test program has a modifier called "find_limits" which, if
+applied to a subject line, causes it to find the smallest limits that allow a a
+pattern to match. This is done by calling <b>pcre2_match()</b> repeatedly with
+different limits.
+</P>
+<br><b>
+Changing stack size in Unix-like systems
+</b><br>
+<P>
+In Unix-like environments, there is not often a problem with the stack unless
+very long strings are involved, though the default limit on stack size varies
+from system to system. Values from 8Mb to 64Mb are common. You can find your
+default limit by running the command:
+<pre>
+  ulimit -s
+</pre>
+Unfortunately, the effect of running out of stack is often SIGSEGV, though
+sometimes a more explicit error message is given. You can normally increase the
+limit on stack size by code such as this:
+<pre>
+  struct rlimit rlim;
+  getrlimit(RLIMIT_STACK, &rlim);
+  rlim.rlim_cur = 100*1024*1024;
+  setrlimit(RLIMIT_STACK, &rlim);
+</pre>
+This reads the current limits (soft and hard) using <b>getrlimit()</b>, then
+attempts to increase the soft limit to 100Mb using <b>setrlimit()</b>. You must
+do this before calling <b>pcre2_match()</b>.
+</P>
+<br><b>
+Changing stack size in Mac OS X
+</b><br>
+<P>
+Using <b>setrlimit()</b>, as described above, should also work on Mac OS X. It
+is also possible to set a stack size when linking a program. There is a
+discussion about stack sizes in Mac OS X at this web site:
+<a href="http://developer.apple.com/qa/qa2005/qa1419.html">http://developer.apple.com/qa/qa2005/qa1419.html.</a>
+</P>
+<br><b>
+AUTHOR
+</b><br>
+<P>
+Philip Hazel
+<br>
+University Computing Service
+<br>
+Cambridge, England.
+<br>
+</P>
+<br><b>
+REVISION
+</b><br>
+<P>
+Last updated: 21 November 2014
+<br>
+Copyright &copy; 1997-2014 University of Cambridge.
+<br>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
diff --git a/dist/doc/html/pcresyntax.html b/dist2/doc/html/pcre2syntax.html
similarity index 72%
rename from dist/doc/html/pcresyntax.html
rename to dist2/doc/html/pcre2syntax.html
index 5896b9e..7fdc0dc 100644
--- a/dist/doc/html/pcresyntax.html
+++ b/dist2/doc/html/pcre2syntax.html
@@ -1,24 +1,24 @@
 <html>
 <head>
-<title>pcresyntax specification</title>
+<title>pcre2syntax specification</title>
 </head>
 <body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
-<h1>pcresyntax man page</h1>
+<h1>pcre2syntax man page</h1>
 <p>
-Return to the <a href="index.html">PCRE index page</a>.
+Return to the <a href="index.html">PCRE2 index page</a>.
 </p>
 <p>
-This page is part of the PCRE HTML documentation. It was generated automatically
-from the original man page. If there is any nonsense in it, please consult the
-man page, in case the conversion went wrong.
+This page is part of the PCRE2 HTML documentation. It was generated
+automatically from the original man page. If there is any nonsense in it,
+please consult the man page, in case the conversion went wrong.
 <br>
 <ul>
-<li><a name="TOC1" href="#SEC1">PCRE REGULAR EXPRESSION SYNTAX SUMMARY</a>
+<li><a name="TOC1" href="#SEC1">PCRE2 REGULAR EXPRESSION SYNTAX SUMMARY</a>
 <li><a name="TOC2" href="#SEC2">QUOTING</a>
-<li><a name="TOC3" href="#SEC3">CHARACTERS</a>
+<li><a name="TOC3" href="#SEC3">ESCAPED CHARACTERS</a>
 <li><a name="TOC4" href="#SEC4">CHARACTER TYPES</a>
 <li><a name="TOC5" href="#SEC5">GENERAL CATEGORY PROPERTIES FOR \p and \P</a>
-<li><a name="TOC6" href="#SEC6">PCRE SPECIAL CATEGORY PROPERTIES FOR \p and \P</a>
+<li><a name="TOC6" href="#SEC6">PCRE2 SPECIAL CATEGORY PROPERTIES FOR \p and \P</a>
 <li><a name="TOC7" href="#SEC7">SCRIPT NAMES FOR \p AND \P</a>
 <li><a name="TOC8" href="#SEC8">CHARACTER CLASSES</a>
 <li><a name="TOC9" href="#SEC9">QUANTIFIERS</a>
@@ -41,11 +41,11 @@
 <li><a name="TOC26" href="#SEC26">AUTHOR</a>
 <li><a name="TOC27" href="#SEC27">REVISION</a>
 </ul>
-<br><a name="SEC1" href="#TOC1">PCRE REGULAR EXPRESSION SYNTAX SUMMARY</a><br>
+<br><a name="SEC1" href="#TOC1">PCRE2 REGULAR EXPRESSION SYNTAX SUMMARY</a><br>
 <P>
 The full syntax and semantics of the regular expressions that are supported by
-PCRE are described in the
-<a href="pcrepattern.html"><b>pcrepattern</b></a>
+PCRE2 are described in the
+<a href="pcre2pattern.html"><b>pcre2pattern</b></a>
 documentation. This document contains a quick-reference summary of the syntax.
 </P>
 <br><a name="SEC2" href="#TOC1">QUOTING</a><br>
@@ -55,11 +55,12 @@
   \Q...\E    treat enclosed characters as literal
 </PRE>
 </P>
-<br><a name="SEC3" href="#TOC1">CHARACTERS</a><br>
+<br><a name="SEC3" href="#TOC1">ESCAPED CHARACTERS</a><br>
 <P>
+This table applies to ASCII and Unicode environments.
 <pre>
   \a         alarm, that is, the BEL character (hex 07)
-  \cx        "control-x", where x is any ASCII character
+  \cx        "control-x", where x is any ASCII printing character
   \e         escape (hex 1B)
   \f         form feed (hex 0C)
   \n         newline (hex 0A)
@@ -68,18 +69,32 @@
   \0dd       character with octal code 0dd
   \ddd       character with octal code ddd, or backreference
   \o{ddd..}  character with octal code ddd..
+  \U         "U" if PCRE2_ALT_BSUX is set (otherwise is an error)
+  \uhhhh     character with hex code hhhh (if PCRE2_ALT_BSUX is set)
   \xhh       character with hex code hh
   \x{hhh..}  character with hex code hhh..
 </pre>
-Note that \0dd is always an octal code, and that \8 and \9 are the literal
-characters "8" and "9".
+Note that \0dd is always an octal code. The treatment of backslash followed by
+a non-zero digit is complicated; for details see the section
+<a href="pcre2pattern.html#digitsafterbackslash">"Non-printing characters"</a>
+in the
+<a href="pcre2pattern.html"><b>pcre2pattern</b></a>
+documentation, where details of escape processing in EBCDIC environments are
+also given.
+</P>
+<P>
+When \x is not followed by {, from zero to two hexadecimal digits are read,
+but if PCRE2_ALT_BSUX is set, \x must be followed by two hexadecimal digits to
+be recognized as a hexadecimal escape; otherwise it matches a literal "x".
+Likewise, if \u (in ALT_BSUX mode) is not followed by four hexadecimal digits,
+it matches a literal "u".
 </P>
 <br><a name="SEC4" href="#TOC1">CHARACTER TYPES</a><br>
 <P>
 <pre>
   .          any character except newline;
                in dotall mode, any character whatsoever
-  \C         one data unit, even in UTF mode (best avoided)
+  \C         one code unit, even in UTF mode (best avoided)
   \d         a decimal digit
   \D         a character that is not a decimal digit
   \h         a horizontal white space character
@@ -96,11 +111,18 @@
   \W         a "non-word" character
   \X         a Unicode extended grapheme cluster
 </pre>
+\C is dangerous because it may leave the current matching point in the middle
+of a UTF-8 or UTF-16 character. The application can lock out the use of \C by
+setting the PCRE2_NEVER_BACKSLASH_C option. It is also possible to build PCRE2
+with the use of \C permanently disabled.
+</P>
+<P>
 By default, \d, \s, and \w match only ASCII characters, even in UTF-8 mode
-or in the 16- bit and 32-bit libraries. However, if locale-specific matching is
+or in the 16-bit and 32-bit libraries. However, if locale-specific matching is
 happening, \s and \w may also match characters with code points in the range
-128-255. If the PCRE_UCP option is set, the behaviour of these escape sequences
-is changed to use Unicode properties and they match many more characters.
+128-255. If the PCRE2_UCP option is set, the behaviour of these escape
+sequences is changed to use Unicode properties and they match many more
+characters.
 </P>
 <br><a name="SEC5" href="#TOC1">GENERAL CATEGORY PROPERTIES FOR \p and \P</a><br>
 <P>
@@ -151,7 +173,7 @@
   Zs         Space separator
 </PRE>
 </P>
-<br><a name="SEC6" href="#TOC1">PCRE SPECIAL CATEGORY PROPERTIES FOR \p and \P</a><br>
+<br><a name="SEC6" href="#TOC1">PCRE2 SPECIAL CATEGORY PROPERTIES FOR \p and \P</a><br>
 <P>
 <pre>
   Xan        Alphanumeric: union of properties L and N
@@ -162,10 +184,12 @@
   Xwd        Perl word: property Xan or underscore
 </pre>
 Perl and POSIX space are now the same. Perl added VT to its space character set
-at release 5.18 and PCRE changed at release 8.34.
+at release 5.18.
 </P>
 <br><a name="SEC7" href="#TOC1">SCRIPT NAMES FOR \p AND \P</a><br>
 <P>
+Ahom,
+Anatolian_Hieroglyphs,
 Arabic,
 Armenian,
 Avestan,
@@ -206,6 +230,7 @@
 Han,
 Hangul,
 Hanunoo,
+Hatran,
 Hebrew,
 Hiragana,
 Imperial_Aramaic,
@@ -242,12 +267,14 @@
 Modi,
 Mongolian,
 Mro,
+Multani,
 Myanmar,
 Nabataean,
 New_Tai_Lue,
 Nko,
 Ogham,
 Ol_Chiki,
+Old_Hungarian,
 Old_Italic,
 Old_North_Arabian,
 Old_Permic,
@@ -269,6 +296,7 @@
 Sharada,
 Shavian,
 Siddham,
+SignWriting,
 Sinhala,
 Sora_Sompeng,
 Sundanese,
@@ -316,8 +344,8 @@
   word        same as \w
   xdigit      hexadecimal digit
 </pre>
-In PCRE, POSIX character set names recognize only ASCII characters by default,
-but some of them use Unicode properties if PCRE_UCP is set. You can use
+In PCRE2, POSIX character set names recognize only ASCII characters by default,
+but some of them use Unicode properties if PCRE2_UCP is set. You can use
 \Q...\E inside a character class.
 </P>
 <br><a name="SEC9" href="#TOC1">QUANTIFIERS</a><br>
@@ -347,13 +375,14 @@
   \b          word boundary
   \B          not a word boundary
   ^           start of subject
-               also after internal newline in multiline mode
+                also after an internal newline in multiline mode
+                (after any newline if PCRE2_ALT_CIRCUMFLEX is set)
   \A          start of subject
   $           end of subject
-               also before newline at end of subject
-               also before internal newline in multiline mode
+                also before newline at end of subject
+                also before internal newline in multiline mode
   \Z          end of subject
-               also before newline at end of subject
+                also before newline at end of subject
   \z          end of subject
   \G          first matching position in subject
 </PRE>
@@ -412,16 +441,19 @@
 <pre>
   (*LIMIT_MATCH=d) set the match limit to d (decimal number)
   (*LIMIT_RECURSION=d) set the recursion limit to d (decimal number)
-  (*NO_AUTO_POSSESS) no auto-possessification (PCRE_NO_AUTO_POSSESS)
-  (*NO_START_OPT) no start-match optimization (PCRE_NO_START_OPTIMIZE)
-  (*UTF8)         set UTF-8 mode: 8-bit library (PCRE_UTF8)
-  (*UTF16)        set UTF-16 mode: 16-bit library (PCRE_UTF16)
-  (*UTF32)        set UTF-32 mode: 32-bit library (PCRE_UTF32)
+  (*NOTEMPTY)     set PCRE2_NOTEMPTY when matching
+  (*NOTEMPTY_ATSTART) set PCRE2_NOTEMPTY_ATSTART when matching
+  (*NO_AUTO_POSSESS) no auto-possessification (PCRE2_NO_AUTO_POSSESS)
+  (*NO_DOTSTAR_ANCHOR) no .* anchoring (PCRE2_NO_DOTSTAR_ANCHOR)
+  (*NO_JIT)       disable JIT optimization
+  (*NO_START_OPT) no start-match optimization (PCRE2_NO_START_OPTIMIZE)
   (*UTF)          set appropriate UTF mode for the library in use
-  (*UCP)          set PCRE_UCP (use Unicode properties for \d etc)
+  (*UCP)          set PCRE2_UCP (use Unicode properties for \d etc)
 </pre>
 Note that LIMIT_MATCH and LIMIT_RECURSION can only reduce the value of the
-limits set by the caller of pcre_exec(), not increase them.
+limits set by the caller of pcre2_match(), not increase them. The application
+can lock out the use of (*UTF) and (*UCP) by setting the PCRE2_NEVER_UTF or
+PCRE2_NEVER_UCP options, respectively, at compile time.
 </P>
 <br><a name="SEC17" href="#TOC1">NEWLINE CONVENTION</a><br>
 <P>
@@ -481,10 +513,10 @@
   \g'name'        call subpattern by name (Oniguruma)
   \g&#60;n&#62;           call subpattern by absolute number (Oniguruma)
   \g'n'           call subpattern by absolute number (Oniguruma)
-  \g&#60;+n&#62;          call subpattern by relative number (PCRE extension)
-  \g'+n'          call subpattern by relative number (PCRE extension)
-  \g&#60;-n&#62;          call subpattern by relative number (PCRE extension)
-  \g'-n'          call subpattern by relative number (PCRE extension)
+  \g&#60;+n&#62;          call subpattern by relative number (PCRE2 extension)
+  \g'+n'          call subpattern by relative number (PCRE2 extension)
+  \g&#60;-n&#62;          call subpattern by relative number (PCRE2 extension)
+  \g'-n'          call subpattern by relative number (PCRE2 extension)
 </PRE>
 </P>
 <br><a name="SEC22" href="#TOC1">CONDITIONAL PATTERNS</a><br>
@@ -493,17 +525,18 @@
   (?(condition)yes-pattern)
   (?(condition)yes-pattern|no-pattern)
 
-  (?(n)...        absolute reference condition
-  (?(+n)...       relative reference condition
-  (?(-n)...       relative reference condition
-  (?(&#60;name&#62;)...   named reference condition (Perl)
-  (?('name')...   named reference condition (Perl)
-  (?(name)...     named reference condition (PCRE)
-  (?(R)...        overall recursion condition
-  (?(Rn)...       specific group recursion condition
-  (?(R&name)...   specific recursion condition
-  (?(DEFINE)...   define subpattern for reference
-  (?(assert)...   assertion condition
+  (?(n)               absolute reference condition
+  (?(+n)              relative reference condition
+  (?(-n)              relative reference condition
+  (?(&#60;name&#62;)          named reference condition (Perl)
+  (?('name')          named reference condition (Perl)
+  (?(name)            named reference condition (PCRE2)
+  (?(R)               overall recursion condition
+  (?(Rn)              specific group recursion condition
+  (?(R&name)          specific recursion condition
+  (?(DEFINE)          define subpattern for reference
+  (?(VERSION[&#62;]=n.m)  test PCRE2 version
+  (?(assert)          assertion condition
 </PRE>
 </P>
 <br><a name="SEC23" href="#TOC1">BACKTRACKING CONTROL</a><br>
@@ -532,14 +565,18 @@
 <br><a name="SEC24" href="#TOC1">CALLOUTS</a><br>
 <P>
 <pre>
-  (?C)      callout
-  (?Cn)     callout with data n
-</PRE>
+  (?C)            callout (assumed number 0)
+  (?Cn)           callout with numerical data n
+  (?C"text")      callout with string data
+</pre>
+The allowed string delimiters are ` ' " ^ % # $ (which are the same for the
+start and the end), and the starting delimiter { matched with the ending
+delimiter }. To encode the ending delimiter within the string, double it.
 </P>
 <br><a name="SEC25" href="#TOC1">SEE ALSO</a><br>
 <P>
-<b>pcrepattern</b>(3), <b>pcreapi</b>(3), <b>pcrecallout</b>(3),
-<b>pcrematching</b>(3), <b>pcre</b>(3).
+<b>pcre2pattern</b>(3), <b>pcre2api</b>(3), <b>pcre2callout</b>(3),
+<b>pcre2matching</b>(3), <b>pcre2</b>(3).
 </P>
 <br><a name="SEC26" href="#TOC1">AUTHOR</a><br>
 <P>
@@ -547,15 +584,15 @@
 <br>
 University Computing Service
 <br>
-Cambridge CB2 3QH, England.
+Cambridge, England.
 <br>
 </P>
 <br><a name="SEC27" href="#TOC1">REVISION</a><br>
 <P>
-Last updated: 08 January 2014
+Last updated: 16 October 2015
 <br>
-Copyright &copy; 1997-2014 University of Cambridge.
+Copyright &copy; 1997-2015 University of Cambridge.
 <br>
 <p>
-Return to the <a href="index.html">PCRE index page</a>.
+Return to the <a href="index.html">PCRE2 index page</a>.
 </p>
diff --git a/dist2/doc/html/pcre2test.html b/dist2/doc/html/pcre2test.html
new file mode 100644
index 0000000..537985d
--- /dev/null
+++ b/dist2/doc/html/pcre2test.html
@@ -0,0 +1,1669 @@
+<html>
+<head>
+<title>pcre2test specification</title>
+</head>
+<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
+<h1>pcre2test man page</h1>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
+<p>
+This page is part of the PCRE2 HTML documentation. It was generated
+automatically from the original man page. If there is any nonsense in it,
+please consult the man page, in case the conversion went wrong.
+<br>
+<ul>
+<li><a name="TOC1" href="#SEC1">SYNOPSIS</a>
+<li><a name="TOC2" href="#SEC2">PCRE2's 8-BIT, 16-BIT AND 32-BIT LIBRARIES</a>
+<li><a name="TOC3" href="#SEC3">INPUT ENCODING</a>
+<li><a name="TOC4" href="#SEC4">COMMAND LINE OPTIONS</a>
+<li><a name="TOC5" href="#SEC5">DESCRIPTION</a>
+<li><a name="TOC6" href="#SEC6">COMMAND LINES</a>
+<li><a name="TOC7" href="#SEC7">MODIFIER SYNTAX</a>
+<li><a name="TOC8" href="#SEC8">PATTERN SYNTAX</a>
+<li><a name="TOC9" href="#SEC9">SUBJECT LINE SYNTAX</a>
+<li><a name="TOC10" href="#SEC10">PATTERN MODIFIERS</a>
+<li><a name="TOC11" href="#SEC11">SUBJECT MODIFIERS</a>
+<li><a name="TOC12" href="#SEC12">THE ALTERNATIVE MATCHING FUNCTION</a>
+<li><a name="TOC13" href="#SEC13">DEFAULT OUTPUT FROM pcre2test</a>
+<li><a name="TOC14" href="#SEC14">OUTPUT FROM THE ALTERNATIVE MATCHING FUNCTION</a>
+<li><a name="TOC15" href="#SEC15">RESTARTING AFTER A PARTIAL MATCH</a>
+<li><a name="TOC16" href="#SEC16">CALLOUTS</a>
+<li><a name="TOC17" href="#SEC17">NON-PRINTING CHARACTERS</a>
+<li><a name="TOC18" href="#SEC18">SAVING AND RESTORING COMPILED PATTERNS</a>
+<li><a name="TOC19" href="#SEC19">SEE ALSO</a>
+<li><a name="TOC20" href="#SEC20">AUTHOR</a>
+<li><a name="TOC21" href="#SEC21">REVISION</a>
+</ul>
+<br><a name="SEC1" href="#TOC1">SYNOPSIS</a><br>
+<P>
+<b>pcre2test [options] [input file [output file]]</b>
+<br>
+<br>
+<b>pcre2test</b> is a test program for the PCRE2 regular expression libraries,
+but it can also be used for experimenting with regular expressions. This
+document describes the features of the test program; for details of the regular
+expressions themselves, see the
+<a href="pcre2pattern.html"><b>pcre2pattern</b></a>
+documentation. For details of the PCRE2 library function calls and their
+options, see the
+<a href="pcre2api.html"><b>pcre2api</b></a>
+documentation.
+</P>
+<P>
+The input for <b>pcre2test</b> is a sequence of regular expression patterns and
+subject strings to be matched. There are also command lines for setting
+defaults and controlling some special actions. The output shows the result of
+each match attempt. Modifiers on external or internal command lines, the
+patterns, and the subject lines specify PCRE2 function options, control how the
+subject is processed, and what output is produced.
+</P>
+<P>
+As the original fairly simple PCRE library evolved, it acquired many different
+features, and as a result, the original <b>pcretest</b> program ended up with a
+lot of options in a messy, arcane syntax, for testing all the features. The
+move to the new PCRE2 API provided an opportunity to re-implement the test
+program as <b>pcre2test</b>, with a cleaner modifier syntax. Nevertheless, there
+are still many obscure modifiers, some of which are specifically designed for
+use in conjunction with the test script and data files that are distributed as
+part of PCRE2. All the modifiers are documented here, some without much
+justification, but many of them are unlikely to be of use except when testing
+the libraries.
+</P>
+<br><a name="SEC2" href="#TOC1">PCRE2's 8-BIT, 16-BIT AND 32-BIT LIBRARIES</a><br>
+<P>
+Different versions of the PCRE2 library can be built to support character
+strings that are encoded in 8-bit, 16-bit, or 32-bit code units. One, two, or
+all three of these libraries may be simultaneously installed. The
+<b>pcre2test</b> program can be used to test all the libraries. However, its own
+input and output are always in 8-bit format. When testing the 16-bit or 32-bit
+libraries, patterns and subject strings are converted to 16- or 32-bit format
+before being passed to the library functions. Results are converted back to
+8-bit code units for output.
+</P>
+<P>
+In the rest of this document, the names of library functions and structures
+are given in generic form, for example, <b>pcre_compile()</b>. The actual
+names used in the libraries have a suffix _8, _16, or _32, as appropriate.
+</P>
+<br><a name="SEC3" href="#TOC1">INPUT ENCODING</a><br>
+<P>
+Input to <b>pcre2test</b> is processed line by line, either by calling the C
+library's <b>fgets()</b> function, or via the <b>libreadline</b> library (see
+below). The input is processed using using C's string functions, so must not
+contain binary zeroes, even though in Unix-like environments, <b>fgets()</b>
+treats any bytes other than newline as data characters. In some Windows
+environments character 26 (hex 1A) causes an immediate end of file, and no
+further data is read.
+</P>
+<P>
+For maximum portability, therefore, it is safest to avoid non-printing
+characters in <b>pcre2test</b> input files. There is a facility for specifying a
+pattern's characters as hexadecimal pairs, thus making it possible to include
+binary zeroes in a pattern for testing purposes. Subject lines are processed
+for backslash escapes, which makes it possible to include any data value.
+</P>
+<br><a name="SEC4" href="#TOC1">COMMAND LINE OPTIONS</a><br>
+<P>
+<b>-8</b>
+If the 8-bit library has been built, this option causes it to be used (this is
+the default). If the 8-bit library has not been built, this option causes an
+error.
+</P>
+<P>
+<b>-16</b>
+If the 16-bit library has been built, this option causes it to be used. If only
+the 16-bit library has been built, this is the default. If the 16-bit library
+has not been built, this option causes an error.
+</P>
+<P>
+<b>-32</b>
+If the 32-bit library has been built, this option causes it to be used. If only
+the 32-bit library has been built, this is the default. If the 32-bit library
+has not been built, this option causes an error.
+</P>
+<P>
+<b>-b</b>
+Behave as if each pattern has the <b>/fullbincode</b> modifier; the full
+internal binary form of the pattern is output after compilation.
+</P>
+<P>
+<b>-C</b>
+Output the version number of the PCRE2 library, and all available information
+about the optional features that are included, and then exit with zero exit
+code. All other options are ignored.
+</P>
+<P>
+<b>-C</b> <i>option</i>
+Output information about a specific build-time option, then exit. This
+functionality is intended for use in scripts such as <b>RunTest</b>. The
+following options output the value and set the exit code as indicated:
+<pre>
+  ebcdic-nl  the code for LF (= NL) in an EBCDIC environment:
+               0x15 or 0x25
+               0 if used in an ASCII environment
+               exit code is always 0
+  linksize   the configured internal link size (2, 3, or 4)
+               exit code is set to the link size
+  newline    the default newline setting:
+               CR, LF, CRLF, ANYCRLF, or ANY
+               exit code is always 0
+  bsr        the default setting for what \R matches:
+               ANYCRLF or ANY
+               exit code is always 0
+</pre>
+The following options output 1 for true or 0 for false, and set the exit code
+to the same value:
+<pre>
+  backslash-C  \C is supported (not locked out)
+  ebcdic       compiled for an EBCDIC environment
+  jit          just-in-time support is available
+  pcre2-16     the 16-bit library was built
+  pcre2-32     the 32-bit library was built
+  pcre2-8      the 8-bit library was built
+  unicode      Unicode support is available
+</pre>
+If an unknown option is given, an error message is output; the exit code is 0.
+</P>
+<P>
+<b>-d</b>
+Behave as if each pattern has the <b>debug</b> modifier; the internal
+form and information about the compiled pattern is output after compilation;
+<b>-d</b> is equivalent to <b>-b -i</b>.
+</P>
+<P>
+<b>-dfa</b>
+Behave as if each subject line has the <b>dfa</b> modifier; matching is done
+using the <b>pcre2_dfa_match()</b> function instead of the default
+<b>pcre2_match()</b>.
+</P>
+<P>
+<b>-help</b>
+Output a brief summary these options and then exit.
+</P>
+<P>
+<b>-i</b>
+Behave as if each pattern has the <b>/info</b> modifier; information about the
+compiled pattern is given after compilation.
+</P>
+<P>
+<b>-jit</b>
+Behave as if each pattern line has the <b>jit</b> modifier; after successful
+compilation, each pattern is passed to the just-in-time compiler, if available.
+</P>
+<P>
+\fB-pattern\fB <i>modifier-list</i>
+Behave as if each pattern line contains the given modifiers.
+</P>
+<P>
+<b>-q</b>
+Do not output the version number of <b>pcre2test</b> at the start of execution.
+</P>
+<P>
+<b>-S</b> <i>size</i>
+On Unix-like systems, set the size of the run-time stack to <i>size</i>
+megabytes.
+</P>
+<P>
+<b>-subject</b> <i>modifier-list</i>
+Behave as if each subject line contains the given modifiers.
+</P>
+<P>
+<b>-t</b>
+Run each compile and match many times with a timer, and output the resulting
+times per compile or match. When JIT is used, separate times are given for the
+initial compile and the JIT compile. You can control the number of iterations
+that are used for timing by following <b>-t</b> with a number (as a separate
+item on the command line). For example, "-t 1000" iterates 1000 times. The
+default is to iterate 500,000 times.
+</P>
+<P>
+<b>-tm</b>
+This is like <b>-t</b> except that it times only the matching phase, not the
+compile phase.
+</P>
+<P>
+<b>-T</b> <b>-TM</b>
+These behave like <b>-t</b> and <b>-tm</b>, but in addition, at the end of a run,
+the total times for all compiles and matches are output.
+</P>
+<P>
+<b>-version</b>
+Output the PCRE2 version number and then exit.
+</P>
+<br><a name="SEC5" href="#TOC1">DESCRIPTION</a><br>
+<P>
+If <b>pcre2test</b> is given two filename arguments, it reads from the first and
+writes to the second. If the first name is "-", input is taken from the
+standard input. If <b>pcre2test</b> is given only one argument, it reads from
+that file and writes to stdout. Otherwise, it reads from stdin and writes to
+stdout.
+</P>
+<P>
+When <b>pcre2test</b> is built, a configuration option can specify that it
+should be linked with the <b>libreadline</b> or <b>libedit</b> library. When this
+is done, if the input is from a terminal, it is read using the <b>readline()</b>
+function. This provides line-editing and history facilities. The output from
+the <b>-help</b> option states whether or not <b>readline()</b> will be used.
+</P>
+<P>
+The program handles any number of tests, each of which consists of a set of
+input lines. Each set starts with a regular expression pattern, followed by any
+number of subject lines to be matched against that pattern. In between sets of
+test data, command lines that begin with # may appear. This file format, with
+some restrictions, can also be processed by the <b>perltest.sh</b> script that
+is distributed with PCRE2 as a means of checking that the behaviour of PCRE2
+and Perl is the same.
+</P>
+<P>
+When the input is a terminal, <b>pcre2test</b> prompts for each line of input,
+using "re&#62;" to prompt for regular expression patterns, and "data&#62;" to prompt
+for subject lines. Command lines starting with # can be entered only in
+response to the "re&#62;" prompt.
+</P>
+<P>
+Each subject line is matched separately and independently. If you want to do
+multi-line matches, you have to use the \n escape sequence (or \r or \r\n,
+etc., depending on the newline setting) in a single line of input to encode the
+newline sequences. There is no limit on the length of subject lines; the input
+buffer is automatically extended if it is too small. There are replication
+features that makes it possible to generate long repetitive pattern or subject
+lines without having to supply them explicitly.
+</P>
+<P>
+An empty line or the end of the file signals the end of the subject lines for a
+test, at which point a new pattern or command line is expected if there is
+still input to be read.
+</P>
+<br><a name="SEC6" href="#TOC1">COMMAND LINES</a><br>
+<P>
+In between sets of test data, a line that begins with # is interpreted as a
+command line. If the first character is followed by white space or an
+exclamation mark, the line is treated as a comment, and ignored. Otherwise, the
+following commands are recognized:
+<pre>
+  #forbid_utf
+</pre>
+Subsequent patterns automatically have the PCRE2_NEVER_UTF and PCRE2_NEVER_UCP
+options set, which locks out the use of the PCRE2_UTF and PCRE2_UCP options and
+the use of (*UTF) and (*UCP) at the start of patterns. This command also forces
+an error if a subsequent pattern contains any occurrences of \P, \p, or \X,
+which are still supported when PCRE2_UTF is not set, but which require Unicode
+property support to be included in the library.
+</P>
+<P>
+This is a trigger guard that is used in test files to ensure that UTF or
+Unicode property tests are not accidentally added to files that are used when
+Unicode support is not included in the library. Setting PCRE2_NEVER_UTF and
+PCRE2_NEVER_UCP as a default can also be obtained by the use of <b>#pattern</b>;
+the difference is that <b>#forbid_utf</b> cannot be unset, and the automatic
+options are not displayed in pattern information, to avoid cluttering up test
+output.
+<pre>
+  #load &#60;filename&#62;
+</pre>
+This command is used to load a set of precompiled patterns from a file, as
+described in the section entitled "Saving and restoring compiled patterns"
+<a href="#saverestore">below.</a>
+<pre>
+  #newline_default [&#60;newline-list&#62;]
+</pre>
+When PCRE2 is built, a default newline convention can be specified. This
+determines which characters and/or character pairs are recognized as indicating
+a newline in a pattern or subject string. The default can be overridden when a
+pattern is compiled. The standard test files contain tests of various newline
+conventions, but the majority of the tests expect a single linefeed to be
+recognized as a newline by default. Without special action the tests would fail
+when PCRE2 is compiled with either CR or CRLF as the default newline.
+</P>
+<P>
+The #newline_default command specifies a list of newline types that are
+acceptable as the default. The types must be one of CR, LF, CRLF, ANYCRLF, or
+ANY (in upper or lower case), for example:
+<pre>
+  #newline_default LF Any anyCRLF
+</pre>
+If the default newline is in the list, this command has no effect. Otherwise,
+except when testing the POSIX API, a <b>newline</b> modifier that specifies the
+first newline convention in the list (LF in the above example) is added to any
+pattern that does not already have a <b>newline</b> modifier. If the newline
+list is empty, the feature is turned off. This command is present in a number
+of the standard test input files.
+</P>
+<P>
+When the POSIX API is being tested there is no way to override the default
+newline convention, though it is possible to set the newline convention from
+within the pattern. A warning is given if the <b>posix</b> modifier is used when
+<b>#newline_default</b> would set a default for the non-POSIX API.
+<pre>
+  #pattern &#60;modifier-list&#62;
+</pre>
+This command sets a default modifier list that applies to all subsequent
+patterns. Modifiers on a pattern can change these settings.
+<pre>
+  #perltest
+</pre>
+The appearance of this line causes all subsequent modifier settings to be
+checked for compatibility with the <b>perltest.sh</b> script, which is used to
+confirm that Perl gives the same results as PCRE2. Also, apart from comment
+lines, none of the other command lines are permitted, because they and many
+of the modifiers are specific to <b>pcre2test</b>, and should not be used in
+test files that are also processed by <b>perltest.sh</b>. The <b>#perltest</b>
+command helps detect tests that are accidentally put in the wrong file.
+<pre>
+  #pop [&#60;modifiers&#62;]
+</pre>
+This command is used to manipulate the stack of compiled patterns, as described
+in the section entitled "Saving and restoring compiled patterns"
+<a href="#saverestore">below.</a>
+<pre>
+  #save &#60;filename&#62;
+</pre>
+This command is used to save a set of compiled patterns to a file, as described
+in the section entitled "Saving and restoring compiled patterns"
+<a href="#saverestore">below.</a>
+<pre>
+  #subject &#60;modifier-list&#62;
+</pre>
+This command sets a default modifier list that applies to all subsequent
+subject lines. Modifiers on a subject line can change these settings.
+</P>
+<br><a name="SEC7" href="#TOC1">MODIFIER SYNTAX</a><br>
+<P>
+Modifier lists are used with both pattern and subject lines. Items in a list
+are separated by commas followed by optional white space. Trailing whitespace
+in a modifier list is ignored. Some modifiers may be given for both patterns
+and subject lines, whereas others are valid only for one or the other. Each
+modifier has a long name, for example "anchored", and some of them must be
+followed by an equals sign and a value, for example, "offset=12". Values cannot
+contain comma characters, but may contain spaces. Modifiers that do not take
+values may be preceded by a minus sign to turn off a previous setting.
+</P>
+<P>
+A few of the more common modifiers can also be specified as single letters, for
+example "i" for "caseless". In documentation, following the Perl convention,
+these are written with a slash ("the /i modifier") for clarity. Abbreviated
+modifiers must all be concatenated in the first item of a modifier list. If the
+first item is not recognized as a long modifier name, it is interpreted as a
+sequence of these abbreviations. For example:
+<pre>
+  /abc/ig,newline=cr,jit=3
+</pre>
+This is a pattern line whose modifier list starts with two one-letter modifiers
+(/i and /g). The lower-case abbreviated modifiers are the same as used in Perl.
+</P>
+<br><a name="SEC8" href="#TOC1">PATTERN SYNTAX</a><br>
+<P>
+A pattern line must start with one of the following characters (common symbols,
+excluding pattern meta-characters):
+<pre>
+  / ! " ' ` - = _ : ; , % & @ ~
+</pre>
+This is interpreted as the pattern's delimiter. A regular expression may be
+continued over several input lines, in which case the newline characters are
+included within it. It is possible to include the delimiter within the pattern
+by escaping it with a backslash, for example
+<pre>
+  /abc\/def/
+</pre>
+If you do this, the escape and the delimiter form part of the pattern, but
+since the delimiters are all non-alphanumeric, this does not affect its
+interpretation. If the terminating delimiter is immediately followed by a
+backslash, for example,
+<pre>
+  /abc/\
+</pre>
+then a backslash is added to the end of the pattern. This is done to provide a
+way of testing the error condition that arises if a pattern finishes with a
+backslash, because
+<pre>
+  /abc\/
+</pre>
+is interpreted as the first line of a pattern that starts with "abc/", causing
+pcre2test to read the next line as a continuation of the regular expression.
+</P>
+<P>
+A pattern can be followed by a modifier list (details below).
+</P>
+<br><a name="SEC9" href="#TOC1">SUBJECT LINE SYNTAX</a><br>
+<P>
+Before each subject line is passed to <b>pcre2_match()</b> or
+<b>pcre2_dfa_match()</b>, leading and trailing white space is removed, and the
+line is scanned for backslash escapes. The following provide a means of
+encoding non-printing characters in a visible way:
+<pre>
+  \a         alarm (BEL, \x07)
+  \b         backspace (\x08)
+  \e         escape (\x27)
+  \f         form feed (\x0c)
+  \n         newline (\x0a)
+  \r         carriage return (\x0d)
+  \t         tab (\x09)
+  \v         vertical tab (\x0b)
+  \nnn       octal character (up to 3 octal digits); always
+               a byte unless &#62; 255 in UTF-8 or 16-bit or 32-bit mode
+  \o{dd...}  octal character (any number of octal digits}
+  \xhh       hexadecimal byte (up to 2 hex digits)
+  \x{hh...}  hexadecimal character (any number of hex digits)
+</pre>
+The use of \x{hh...} is not dependent on the use of the <b>utf</b> modifier on
+the pattern. It is recognized always. There may be any number of hexadecimal
+digits inside the braces; invalid values provoke error messages.
+</P>
+<P>
+Note that \xhh specifies one byte rather than one character in UTF-8 mode;
+this makes it possible to construct invalid UTF-8 sequences for testing
+purposes. On the other hand, \x{hh} is interpreted as a UTF-8 character in
+UTF-8 mode, generating more than one byte if the value is greater than 127.
+When testing the 8-bit library not in UTF-8 mode, \x{hh} generates one byte
+for values less than 256, and causes an error for greater values.
+</P>
+<P>
+In UTF-16 mode, all 4-digit \x{hhhh} values are accepted. This makes it
+possible to construct invalid UTF-16 sequences for testing purposes.
+</P>
+<P>
+In UTF-32 mode, all 4- to 8-digit \x{...} values are accepted. This makes it
+possible to construct invalid UTF-32 sequences for testing purposes.
+</P>
+<P>
+There is a special backslash sequence that specifies replication of one or more
+characters:
+<pre>
+  \[&#60;characters&#62;]{&#60;count&#62;}
+</pre>
+This makes it possible to test long strings without having to provide them as
+part of the file. For example:
+<pre>
+  \[abc]{4}
+</pre>
+is converted to "abcabcabcabc". This feature does not support nesting. To
+include a closing square bracket in the characters, code it as \x5D.
+</P>
+<P>
+A backslash followed by an equals sign marks the end of the subject string and
+the start of a modifier list. For example:
+<pre>
+  abc\=notbol,notempty
+</pre>
+If the subject string is empty and \= is followed by whitespace, the line is
+treated as a comment line, and is not used for matching. For example:
+<pre>
+  \= This is a comment.
+  abc\= This is an invalid modifier list.
+</pre>
+A backslash followed by any other non-alphanumeric character just escapes that
+character. A backslash followed by anything else causes an error. However, if
+the very last character in the line is a backslash (and there is no modifier
+list), it is ignored. This gives a way of passing an empty line as data, since
+a real empty line terminates the data input.
+</P>
+<br><a name="SEC10" href="#TOC1">PATTERN MODIFIERS</a><br>
+<P>
+There are several types of modifier that can appear in pattern lines. Except
+where noted below, they may also be used in <b>#pattern</b> commands. A
+pattern's modifier list can add to or override default modifiers that were set
+by a previous <b>#pattern</b> command.
+<a name="optionmodifiers"></a></P>
+<br><b>
+Setting compilation options
+</b><br>
+<P>
+The following modifiers set options for <b>pcre2_compile()</b>. The most common
+ones have single-letter abbreviations. See
+<a href="pcre2api.html"><b>pcre2api</b></a>
+for a description of their effects.
+<pre>
+      allow_empty_class         set PCRE2_ALLOW_EMPTY_CLASS
+      alt_bsux                  set PCRE2_ALT_BSUX
+      alt_circumflex            set PCRE2_ALT_CIRCUMFLEX
+      alt_verbnames             set PCRE2_ALT_VERBNAMES
+      anchored                  set PCRE2_ANCHORED
+      auto_callout              set PCRE2_AUTO_CALLOUT
+  /i  caseless                  set PCRE2_CASELESS
+      dollar_endonly            set PCRE2_DOLLAR_ENDONLY
+  /s  dotall                    set PCRE2_DOTALL
+      dupnames                  set PCRE2_DUPNAMES
+  /x  extended                  set PCRE2_EXTENDED
+      firstline                 set PCRE2_FIRSTLINE
+      match_unset_backref       set PCRE2_MATCH_UNSET_BACKREF
+  /m  multiline                 set PCRE2_MULTILINE
+      never_backslash_c         set PCRE2_NEVER_BACKSLASH_C
+      never_ucp                 set PCRE2_NEVER_UCP
+      never_utf                 set PCRE2_NEVER_UTF
+      no_auto_capture           set PCRE2_NO_AUTO_CAPTURE
+      no_auto_possess           set PCRE2_NO_AUTO_POSSESS
+      no_dotstar_anchor         set PCRE2_NO_DOTSTAR_ANCHOR
+      no_start_optimize         set PCRE2_NO_START_OPTIMIZE
+      no_utf_check              set PCRE2_NO_UTF_CHECK
+      ucp                       set PCRE2_UCP
+      ungreedy                  set PCRE2_UNGREEDY
+      use_offset_limit          set PCRE2_USE_OFFSET_LIMIT
+      utf                       set PCRE2_UTF
+</pre>
+As well as turning on the PCRE2_UTF option, the <b>utf</b> modifier causes all
+non-printing characters in output strings to be printed using the \x{hh...}
+notation. Otherwise, those less than 0x100 are output in hex without the curly
+brackets.
+<a name="controlmodifiers"></a></P>
+<br><b>
+Setting compilation controls
+</b><br>
+<P>
+The following modifiers affect the compilation process or request information
+about the pattern:
+<pre>
+      bsr=[anycrlf|unicode]     specify \R handling
+  /B  bincode                   show binary code without lengths
+      callout_info              show callout information
+      debug                     same as info,fullbincode
+      fullbincode               show binary code with lengths
+  /I  info                      show info about compiled pattern
+      hex                       pattern is coded in hexadecimal
+      jit[=&#60;number&#62;]            use JIT
+      jitfast                   use JIT fast path
+      jitverify                 verify JIT use
+      locale=&#60;name&#62;             use this locale
+      max_pattern_length=&#60;n&#62;    set the maximum pattern length
+      memory                    show memory used
+      newline=&#60;type&#62;            set newline type
+      null_context              compile with a NULL context
+      parens_nest_limit=&#60;n&#62;     set maximum parentheses depth
+      posix                     use the POSIX API
+      push                      push compiled pattern onto the stack
+      stackguard=&#60;number&#62;       test the stackguard feature
+      tables=[0|1|2]            select internal tables
+</pre>
+The effects of these modifiers are described in the following sections.
+</P>
+<br><b>
+Newline and \R handling
+</b><br>
+<P>
+The <b>bsr</b> modifier specifies what \R in a pattern should match. If it is
+set to "anycrlf", \R matches CR, LF, or CRLF only. If it is set to "unicode",
+\R matches any Unicode newline sequence. The default is specified when PCRE2
+is built, with the default default being Unicode.
+</P>
+<P>
+The <b>newline</b> modifier specifies which characters are to be interpreted as
+newlines, both in the pattern and in subject lines. The type must be one of CR,
+LF, CRLF, ANYCRLF, or ANY (in upper or lower case).
+</P>
+<br><b>
+Information about a pattern
+</b><br>
+<P>
+The <b>debug</b> modifier is a shorthand for <b>info,fullbincode</b>, requesting
+all available information.
+</P>
+<P>
+The <b>bincode</b> modifier causes a representation of the compiled code to be
+output after compilation. This information does not contain length and offset
+values, which ensures that the same output is generated for different internal
+link sizes and different code unit widths. By using <b>bincode</b>, the same
+regression tests can be used in different environments.
+</P>
+<P>
+The <b>fullbincode</b> modifier, by contrast, <i>does</i> include length and
+offset values. This is used in a few special tests that run only for specific
+code unit widths and link sizes, and is also useful for one-off tests.
+</P>
+<P>
+The <b>info</b> modifier requests information about the compiled pattern
+(whether it is anchored, has a fixed first character, and so on). The
+information is obtained from the <b>pcre2_pattern_info()</b> function. Here are
+some typical examples:
+<pre>
+    re&#62; /(?i)(^a|^b)/m,info
+  Capturing subpattern count = 1
+  Compile options: multiline
+  Overall options: caseless multiline
+  First code unit at start or follows newline
+  Subject length lower bound = 1
+
+    re&#62; /(?i)abc/info
+  Capturing subpattern count = 0
+  Compile options: &#60;none&#62;
+  Overall options: caseless
+  First code unit = 'a' (caseless)
+  Last code unit = 'c' (caseless)
+  Subject length lower bound = 3
+</pre>
+"Compile options" are those specified by modifiers; "overall options" have
+added options that are taken or deduced from the pattern. If both sets of
+options are the same, just a single "options" line is output; if there are no
+options, the line is omitted. "First code unit" is where any match must start;
+if there is more than one they are listed as "starting code units". "Last code
+unit" is the last literal code unit that must be present in any match. This is
+not necessarily the last character. These lines are omitted if no starting or
+ending code units are recorded.
+</P>
+<P>
+The <b>callout_info</b> modifier requests information about all the callouts in
+the pattern. A list of them is output at the end of any other information that
+is requested. For each callout, either its number or string is given, followed
+by the item that follows it in the pattern.
+</P>
+<br><b>
+Passing a NULL context
+</b><br>
+<P>
+Normally, <b>pcre2test</b> passes a context block to <b>pcre2_compile()</b>. If
+the <b>null_context</b> modifier is set, however, NULL is passed. This is for
+testing that <b>pcre2_compile()</b> behaves correctly in this case (it uses
+default values).
+</P>
+<br><b>
+Specifying a pattern in hex
+</b><br>
+<P>
+The <b>hex</b> modifier specifies that the characters of the pattern are to be
+interpreted as pairs of hexadecimal digits. White space is permitted between
+pairs. For example:
+<pre>
+  /ab 32 59/hex
+</pre>
+This feature is provided as a way of creating patterns that contain binary zero
+and other non-printing characters. By default, <b>pcre2test</b> passes patterns
+as zero-terminated strings to <b>pcre2_compile()</b>, giving the length as
+PCRE2_ZERO_TERMINATED. However, for patterns specified in hexadecimal, the
+actual length of the pattern is passed.
+</P>
+<br><b>
+Generating long repetitive patterns
+</b><br>
+<P>
+Some tests use long patterns that are very repetitive. Instead of creating a
+very long input line for such a pattern, you can use a special repetition
+feature, similar to the one described for subject lines above. If the
+<b>expand</b> modifier is present on a pattern, parts of the pattern that have
+the form
+<pre>
+  \[&#60;characters&#62;]{&#60;count&#62;}
+</pre>
+are expanded before the pattern is passed to <b>pcre2_compile()</b>. For
+example, \[AB]{6000} is expanded to "ABAB..." 6000 times. This construction
+cannot be nested. An initial "\[" sequence is recognized only if "]{" followed
+by decimal digits and "}" is found later in the pattern. If not, the characters
+remain in the pattern unaltered.
+</P>
+<P>
+If part of an expanded pattern looks like an expansion, but is really part of
+the actual pattern, unwanted expansion can be avoided by giving two values in
+the quantifier. For example, \[AB]{6000,6000} is not recognized as an
+expansion item.
+</P>
+<P>
+If the <b>info</b> modifier is set on an expanded pattern, the result of the
+expansion is included in the information that is output.
+</P>
+<br><b>
+JIT compilation
+</b><br>
+<P>
+Just-in-time (JIT) compiling is a heavyweight optimization that can greatly
+speed up pattern matching. See the
+<a href="pcre2jit.html"><b>pcre2jit</b></a>
+documentation for details. JIT compiling happens, optionally, after a pattern
+has been successfully compiled into an internal form. The JIT compiler converts
+this to optimized machine code. It needs to know whether the match-time options
+PCRE2_PARTIAL_HARD and PCRE2_PARTIAL_SOFT are going to be used, because
+different code is generated for the different cases. See the <b>partial</b>
+modifier in "Subject Modifiers"
+<a href="#subjectmodifiers">below</a>
+for details of how these options are specified for each match attempt.
+</P>
+<P>
+JIT compilation is requested by the <b>/jit</b> pattern modifier, which may
+optionally be followed by an equals sign and a number in the range 0 to 7.
+The three bits that make up the number specify which of the three JIT operating
+modes are to be compiled:
+<pre>
+  1  compile JIT code for non-partial matching
+  2  compile JIT code for soft partial matching
+  4  compile JIT code for hard partial matching
+</pre>
+The possible values for the <b>/jit</b> modifier are therefore:
+<pre>
+  0  disable JIT
+  1  normal matching only
+  2  soft partial matching only
+  3  normal and soft partial matching
+  4  hard partial matching only
+  6  soft and hard partial matching only
+  7  all three modes
+</pre>
+If no number is given, 7 is assumed. The phrase "partial matching" means a call
+to <b>pcre2_match()</b> with either the PCRE2_PARTIAL_SOFT or the
+PCRE2_PARTIAL_HARD option set. Note that such a call may return a complete
+match; the options enable the possibility of a partial match, but do not
+require it. Note also that if you request JIT compilation only for partial
+matching (for example, /jit=2) but do not set the <b>partial</b> modifier on a
+subject line, that match will not use JIT code because none was compiled for
+non-partial matching.
+</P>
+<P>
+If JIT compilation is successful, the compiled JIT code will automatically be
+used when an appropriate type of match is run, except when incompatible
+run-time options are specified. For more details, see the
+<a href="pcre2jit.html"><b>pcre2jit</b></a>
+documentation. See also the <b>jitstack</b> modifier below for a way of
+setting the size of the JIT stack.
+</P>
+<P>
+If the <b>jitfast</b> modifier is specified, matching is done using the JIT
+"fast path" interface, <b>pcre2_jit_match()</b>, which skips some of the sanity
+checks that are done by <b>pcre2_match()</b>, and of course does not work when
+JIT is not supported. If <b>jitfast</b> is specified without <b>jit</b>, jit=7 is
+assumed.
+</P>
+<P>
+If the <b>jitverify</b> modifier is specified, information about the compiled
+pattern shows whether JIT compilation was or was not successful. If
+<b>jitverify</b> is specified without <b>jit</b>, jit=7 is assumed. If JIT
+compilation is successful when <b>jitverify</b> is set, the text "(JIT)" is
+added to the first output line after a match or non match when JIT-compiled
+code was actually used in the match.
+</P>
+<br><b>
+Setting a locale
+</b><br>
+<P>
+The <b>/locale</b> modifier must specify the name of a locale, for example:
+<pre>
+  /pattern/locale=fr_FR
+</pre>
+The given locale is set, <b>pcre2_maketables()</b> is called to build a set of
+character tables for the locale, and this is then passed to
+<b>pcre2_compile()</b> when compiling the regular expression. The same tables
+are used when matching the following subject lines. The <b>/locale</b> modifier
+applies only to the pattern on which it appears, but can be given in a
+<b>#pattern</b> command if a default is needed. Setting a locale and alternate
+character tables are mutually exclusive.
+</P>
+<br><b>
+Showing pattern memory
+</b><br>
+<P>
+The <b>/memory</b> modifier causes the size in bytes of the memory used to hold
+the compiled pattern to be output. This does not include the size of the
+<b>pcre2_code</b> block; it is just the actual compiled data. If the pattern is
+subsequently passed to the JIT compiler, the size of the JIT compiled code is
+also output. Here is an example:
+<pre>
+    re&#62; /a(b)c/jit,memory
+  Memory allocation (code space): 21
+  Memory allocation (JIT code): 1910
+
+</PRE>
+</P>
+<br><b>
+Limiting nested parentheses
+</b><br>
+<P>
+The <b>parens_nest_limit</b> modifier sets a limit on the depth of nested
+parentheses in a pattern. Breaching the limit causes a compilation error.
+The default for the library is set when PCRE2 is built, but <b>pcre2test</b>
+sets its own default of 220, which is required for running the standard test
+suite.
+</P>
+<br><b>
+Limiting the pattern length
+</b><br>
+<P>
+The <b>max_pattern_length</b> modifier sets a limit, in code units, to the
+length of pattern that <b>pcre2_compile()</b> will accept. Breaching the limit
+causes a compilation error. The default is the largest number a PCRE2_SIZE
+variable can hold (essentially unlimited).
+</P>
+<br><b>
+Using the POSIX wrapper API
+</b><br>
+<P>
+The <b>/posix</b> modifier causes <b>pcre2test</b> to call PCRE2 via the POSIX
+wrapper API rather than its native API. This supports only the 8-bit library.
+Note that it does not imply POSIX matching semantics; for more detail see the
+<a href="pcre2posix.html"><b>pcre2posix</b></a>
+documentation. When the POSIX API is being used, the following pattern
+modifiers set options for the <b>regcomp()</b> function:
+<pre>
+  caseless           REG_ICASE
+  multiline          REG_NEWLINE
+  no_auto_capture    REG_NOSUB
+  dotall             REG_DOTALL     )
+  ungreedy           REG_UNGREEDY   ) These options are not part of
+  ucp                REG_UCP        )   the POSIX standard
+  utf                REG_UTF8       )
+</pre>
+The <b>regerror_buffsize</b> modifier specifies a size for the error buffer that
+is passed to <b>regerror()</b> in the event of a compilation error. For example:
+<pre>
+  /abc/posix,regerror_buffsize=20
+</pre>
+This provides a means of testing the behaviour of <b>regerror()</b> when the
+buffer is too small for the error message. If this modifier has not been set, a
+large buffer is used.
+</P>
+<P>
+The <b>aftertext</b> and <b>allaftertext</b> subject modifiers work as described
+below. All other modifiers cause an error.
+</P>
+<br><b>
+Testing the stack guard feature
+</b><br>
+<P>
+The <b>/stackguard</b> modifier is used to test the use of
+<b>pcre2_set_compile_recursion_guard()</b>, a function that is provided to
+enable stack availability to be checked during compilation (see the
+<a href="pcre2api.html"><b>pcre2api</b></a>
+documentation for details). If the number specified by the modifier is greater
+than zero, <b>pcre2_set_compile_recursion_guard()</b> is called to set up
+callback from <b>pcre2_compile()</b> to a local function. The argument it
+receives is the current nesting parenthesis depth; if this is greater than the
+value given by the modifier, non-zero is returned, causing the compilation to
+be aborted.
+</P>
+<br><b>
+Using alternative character tables
+</b><br>
+<P>
+The value specified for the <b>/tables</b> modifier must be one of the digits 0,
+1, or 2. It causes a specific set of built-in character tables to be passed to
+<b>pcre2_compile()</b>. This is used in the PCRE2 tests to check behaviour with
+different character tables. The digit specifies the tables as follows:
+<pre>
+  0   do not pass any special character tables
+  1   the default ASCII tables, as distributed in
+        pcre2_chartables.c.dist
+  2   a set of tables defining ISO 8859 characters
+</pre>
+In table 2, some characters whose codes are greater than 128 are identified as
+letters, digits, spaces, etc. Setting alternate character tables and a locale
+are mutually exclusive.
+</P>
+<br><b>
+Setting certain match controls
+</b><br>
+<P>
+The following modifiers are really subject modifiers, and are described below.
+However, they may be included in a pattern's modifier list, in which case they
+are applied to every subject line that is processed with that pattern. They may
+not appear in <b>#pattern</b> commands. These modifiers do not affect the
+compilation process.
+<pre>
+      aftertext                  show text after match
+      allaftertext               show text after captures
+      allcaptures                show all captures
+      allusedtext                show all consulted text
+  /g  global                     global matching
+      mark                       show mark values
+      replace=&#60;string&#62;           specify a replacement string
+      startchar                  show starting character when relevant
+      substitute_extended        use PCRE2_SUBSTITUTE_EXTENDED
+      substitute_overflow_length use PCRE2_SUBSTITUTE_OVERFLOW_LENGTH
+      substitute_unknown_unset   use PCRE2_SUBSTITUTE_UNKNOWN_UNSET
+      substitute_unset_empty     use PCRE2_SUBSTITUTE_UNSET_EMPTY
+</pre>
+These modifiers may not appear in a <b>#pattern</b> command. If you want them as
+defaults, set them in a <b>#subject</b> command.
+</P>
+<br><b>
+Saving a compiled pattern
+</b><br>
+<P>
+When a pattern with the <b>push</b> modifier is successfully compiled, it is
+pushed onto a stack of compiled patterns, and <b>pcre2test</b> expects the next
+line to contain a new pattern (or a command) instead of a subject line. This
+facility is used when saving compiled patterns to a file, as described in the
+section entitled "Saving and restoring compiled patterns"
+<a href="#saverestore">below.</a>
+The <b>push</b> modifier is incompatible with compilation modifiers such as
+<b>global</b> that act at match time. Any that are specified are ignored, with a
+warning message, except for <b>replace</b>, which causes an error. Note that,
+<b>jitverify</b>, which is allowed, does not carry through to any subsequent
+matching that uses this pattern.
+<a name="subjectmodifiers"></a></P>
+<br><a name="SEC11" href="#TOC1">SUBJECT MODIFIERS</a><br>
+<P>
+The modifiers that can appear in subject lines and the <b>#subject</b>
+command are of two types.
+</P>
+<br><b>
+Setting match options
+</b><br>
+<P>
+The following modifiers set options for <b>pcre2_match()</b> or
+<b>pcre2_dfa_match()</b>. See
+<a href="pcreapi.html"><b>pcreapi</b></a>
+for a description of their effects.
+<pre>
+      anchored                  set PCRE2_ANCHORED
+      dfa_restart               set PCRE2_DFA_RESTART
+      dfa_shortest              set PCRE2_DFA_SHORTEST
+      no_utf_check              set PCRE2_NO_UTF_CHECK
+      notbol                    set PCRE2_NOTBOL
+      notempty                  set PCRE2_NOTEMPTY
+      notempty_atstart          set PCRE2_NOTEMPTY_ATSTART
+      noteol                    set PCRE2_NOTEOL
+      partial_hard (or ph)      set PCRE2_PARTIAL_HARD
+      partial_soft (or ps)      set PCRE2_PARTIAL_SOFT
+</pre>
+The partial matching modifiers are provided with abbreviations because they
+appear frequently in tests.
+</P>
+<P>
+If the <b>/posix</b> modifier was present on the pattern, causing the POSIX
+wrapper API to be used, the only option-setting modifiers that have any effect
+are <b>notbol</b>, <b>notempty</b>, and <b>noteol</b>, causing REG_NOTBOL,
+REG_NOTEMPTY, and REG_NOTEOL, respectively, to be passed to <b>regexec()</b>.
+Any other modifiers cause an error.
+</P>
+<br><b>
+Setting match controls
+</b><br>
+<P>
+The following modifiers affect the matching process or request additional
+information. Some of them may also be specified on a pattern line (see above),
+in which case they apply to every subject line that is matched against that
+pattern.
+<pre>
+      aftertext                  show text after match
+      allaftertext               show text after captures
+      allcaptures                show all captures
+      allusedtext                show all consulted text (non-JIT only)
+      altglobal                  alternative global matching
+      callout_capture            show captures at callout time
+      callout_data=&#60;n&#62;           set a value to pass via callouts
+      callout_fail=&#60;n&#62;[:&#60;m&#62;]     control callout failure
+      callout_none               do not supply a callout function
+      copy=&#60;number or name&#62;      copy captured substring
+      dfa                        use <b>pcre2_dfa_match()</b>
+      find_limits                find match and recursion limits
+      get=&#60;number or name&#62;       extract captured substring
+      getall                     extract all captured substrings
+  /g  global                     global matching
+      jitstack=&#60;n&#62;               set size of JIT stack
+      mark                       show mark values
+      match_limit=&#60;n&#62;            set a match limit
+      memory                     show memory usage
+      null_context               match with a NULL context
+      offset=&#60;n&#62;                 set starting offset
+      offset_limit=&#60;n&#62;           set offset limit
+      ovector=&#60;n&#62;                set size of output vector
+      recursion_limit=&#60;n&#62;        set a recursion limit
+      replace=&#60;string&#62;           specify a replacement string
+      startchar                  show startchar when relevant
+      startoffset=&#60;n&#62;            same as offset=&#60;n&#62;
+      substitute_extedded        use PCRE2_SUBSTITUTE_EXTENDED
+      substitute_overflow_length use PCRE2_SUBSTITUTE_OVERFLOW_LENGTH
+      substitute_unknown_unset   use PCRE2_SUBSTITUTE_UNKNOWN_UNSET
+      substitute_unset_empty     use PCRE2_SUBSTITUTE_UNSET_EMPTY
+      zero_terminate             pass the subject as zero-terminated
+</pre>
+The effects of these modifiers are described in the following sections.
+</P>
+<br><b>
+Showing more text
+</b><br>
+<P>
+The <b>aftertext</b> modifier requests that as well as outputting the part of
+the subject string that matched the entire pattern, <b>pcre2test</b> should in
+addition output the remainder of the subject string. This is useful for tests
+where the subject contains multiple copies of the same substring. The
+<b>allaftertext</b> modifier requests the same action for captured substrings as
+well as the main matched substring. In each case the remainder is output on the
+following line with a plus character following the capture number.
+</P>
+<P>
+The <b>allusedtext</b> modifier requests that all the text that was consulted
+during a successful pattern match by the interpreter should be shown. This
+feature is not supported for JIT matching, and if requested with JIT it is
+ignored (with a warning message). Setting this modifier affects the output if
+there is a lookbehind at the start of a match, or a lookahead at the end, or if
+\K is used in the pattern. Characters that precede or follow the start and end
+of the actual match are indicated in the output by '&#60;' or '&#62;' characters
+underneath them. Here is an example:
+<pre>
+    re&#62; /(?&#60;=pqr)abc(?=xyz)/
+  data&#62; 123pqrabcxyz456\=allusedtext
+   0: pqrabcxyz
+      &#60;&#60;&#60;   &#62;&#62;&#62;
+</pre>
+This shows that the matched string is "abc", with the preceding and following
+strings "pqr" and "xyz" having been consulted during the match (when processing
+the assertions).
+</P>
+<P>
+The <b>startchar</b> modifier requests that the starting character for the match
+be indicated, if it is different to the start of the matched string. The only
+time when this occurs is when \K has been processed as part of the match. In
+this situation, the output for the matched string is displayed from the
+starting character instead of from the match point, with circumflex characters
+under the earlier characters. For example:
+<pre>
+    re&#62; /abc\Kxyz/
+  data&#62; abcxyz\=startchar
+   0: abcxyz
+      ^^^
+</pre>
+Unlike <b>allusedtext</b>, the <b>startchar</b> modifier can be used with JIT.
+However, these two modifiers are mutually exclusive.
+</P>
+<br><b>
+Showing the value of all capture groups
+</b><br>
+<P>
+The <b>allcaptures</b> modifier requests that the values of all potential
+captured parentheses be output after a match. By default, only those up to the
+highest one actually used in the match are output (corresponding to the return
+code from <b>pcre2_match()</b>). Groups that did not take part in the match
+are output as "&#60;unset&#62;".
+</P>
+<br><b>
+Testing callouts
+</b><br>
+<P>
+A callout function is supplied when <b>pcre2test</b> calls the library matching
+functions, unless <b>callout_none</b> is specified. If <b>callout_capture</b> is
+set, the current captured groups are output when a callout occurs.
+</P>
+<P>
+The <b>callout_fail</b> modifier can be given one or two numbers. If there is
+only one number, 1 is returned instead of 0 when a callout of that number is
+reached. If two numbers are given, 1 is returned when callout &#60;n&#62; is reached
+for the &#60;m&#62;th time. Note that callouts with string arguments are always given
+the number zero. See "Callouts" below for a description of the output when a
+callout it taken.
+</P>
+<P>
+The <b>callout_data</b> modifier can be given an unsigned or a negative number.
+This is set as the "user data" that is passed to the matching function, and
+passed back when the callout function is invoked. Any value other than zero is
+used as a return from <b>pcre2test</b>'s callout function.
+</P>
+<br><b>
+Finding all matches in a string
+</b><br>
+<P>
+Searching for all possible matches within a subject can be requested by the
+<b>global</b> or <b>/altglobal</b> modifier. After finding a match, the matching
+function is called again to search the remainder of the subject. The difference
+between <b>global</b> and <b>altglobal</b> is that the former uses the
+<i>start_offset</i> argument to <b>pcre2_match()</b> or <b>pcre2_dfa_match()</b>
+to start searching at a new point within the entire string (which is what Perl
+does), whereas the latter passes over a shortened subject. This makes a
+difference to the matching process if the pattern begins with a lookbehind
+assertion (including \b or \B).
+</P>
+<P>
+If an empty string is matched, the next match is done with the
+PCRE2_NOTEMPTY_ATSTART and PCRE2_ANCHORED flags set, in order to search for
+another, non-empty, match at the same point in the subject. If this match
+fails, the start offset is advanced, and the normal match is retried. This
+imitates the way Perl handles such cases when using the <b>/g</b> modifier or
+the <b>split()</b> function. Normally, the start offset is advanced by one
+character, but if the newline convention recognizes CRLF as a newline, and the
+current character is CR followed by LF, an advance of two characters occurs.
+</P>
+<br><b>
+Testing substring extraction functions
+</b><br>
+<P>
+The <b>copy</b> and <b>get</b> modifiers can be used to test the
+<b>pcre2_substring_copy_xxx()</b> and <b>pcre2_substring_get_xxx()</b> functions.
+They can be given more than once, and each can specify a group name or number,
+for example:
+<pre>
+   abcd\=copy=1,copy=3,get=G1
+</pre>
+If the <b>#subject</b> command is used to set default copy and/or get lists,
+these can be unset by specifying a negative number to cancel all numbered
+groups and an empty name to cancel all named groups.
+</P>
+<P>
+The <b>getall</b> modifier tests <b>pcre2_substring_list_get()</b>, which
+extracts all captured substrings.
+</P>
+<P>
+If the subject line is successfully matched, the substrings extracted by the
+convenience functions are output with C, G, or L after the string number
+instead of a colon. This is in addition to the normal full list. The string
+length (that is, the return from the extraction function) is given in
+parentheses after each substring, followed by the name when the extraction was
+by name.
+</P>
+<br><b>
+Testing the substitution function
+</b><br>
+<P>
+If the <b>replace</b> modifier is set, the <b>pcre2_substitute()</b> function is
+called instead of one of the matching functions. Note that replacement strings
+cannot contain commas, because a comma signifies the end of a modifier. This is
+not thought to be an issue in a test program.
+</P>
+<P>
+Unlike subject strings, <b>pcre2test</b> does not process replacement strings
+for escape sequences. In UTF mode, a replacement string is checked to see if it
+is a valid UTF-8 string. If so, it is correctly converted to a UTF string of
+the appropriate code unit width. If it is not a valid UTF-8 string, the
+individual code units are copied directly. This provides a means of passing an
+invalid UTF-8 string for testing purposes.
+</P>
+<P>
+The following modifiers set options (in additional to the normal match options)
+for <b>pcre2_substitute()</b>:
+<pre>
+  global                      PCRE2_SUBSTITUTE_GLOBAL
+  substitute_extended         PCRE2_SUBSTITUTE_EXTENDED
+  substitute_overflow_length  PCRE2_SUBSTITUTE_OVERFLOW_LENGTH
+  substitute_unknown_unset    PCRE2_SUBSTITUTE_UNKNOWN_UNSET
+  substitute_unset_empty      PCRE2_SUBSTITUTE_UNSET_EMPTY
+
+</PRE>
+</P>
+<P>
+After a successful substitution, the modified string is output, preceded by the
+number of replacements. This may be zero if there were no matches. Here is a
+simple example of a substitution test:
+<pre>
+  /abc/replace=xxx
+      =abc=abc=
+   1: =xxx=abc=
+      =abc=abc=\=global
+   2: =xxx=xxx=
+</pre>
+Subject and replacement strings should be kept relatively short (fewer than 256
+characters) for substitution tests, as fixed-size buffers are used. To make it
+easy to test for buffer overflow, if the replacement string starts with a
+number in square brackets, that number is passed to <b>pcre2_substitute()</b> as
+the size of the output buffer, with the replacement string starting at the next
+character. Here is an example that tests the edge case:
+<pre>
+  /abc/
+      123abc123\=replace=[10]XYZ
+   1: 123XYZ123
+      123abc123\=replace=[9]XYZ
+  Failed: error -47: no more memory
+</pre>
+The default action of <b>pcre2_substitute()</b> is to return
+PCRE2_ERROR_NOMEMORY when the output buffer is too small. However, if the
+PCRE2_SUBSTITUTE_OVERFLOW_LENGTH option is set (by using the
+<b>substitute_overflow_length</b> modifier), <b>pcre2_substitute()</b> continues
+to go through the motions of matching and substituting, in order to compute the
+size of buffer that is required. When this happens, <b>pcre2test</b> shows the
+required buffer length (which includes space for the trailing zero) as part of
+the error message. For example:
+<pre>
+  /abc/substitute_overflow_length
+      123abc123\=replace=[9]XYZ
+  Failed: error -47: no more memory: 10 code units are needed
+</pre>
+A replacement string is ignored with POSIX and DFA matching. Specifying partial
+matching provokes an error return ("bad option value") from
+<b>pcre2_substitute()</b>.
+</P>
+<br><b>
+Setting the JIT stack size
+</b><br>
+<P>
+The <b>jitstack</b> modifier provides a way of setting the maximum stack size
+that is used by the just-in-time optimization code. It is ignored if JIT
+optimization is not being used. The value is a number of kilobytes. Providing a
+stack that is larger than the default 32K is necessary only for very
+complicated patterns.
+</P>
+<br><b>
+Setting match and recursion limits
+</b><br>
+<P>
+The <b>match_limit</b> and <b>recursion_limit</b> modifiers set the appropriate
+limits in the match context. These values are ignored when the
+<b>find_limits</b> modifier is specified.
+</P>
+<br><b>
+Finding minimum limits
+</b><br>
+<P>
+If the <b>find_limits</b> modifier is present, <b>pcre2test</b> calls
+<b>pcre2_match()</b> several times, setting different values in the match
+context via <b>pcre2_set_match_limit()</b> and <b>pcre2_set_recursion_limit()</b>
+until it finds the minimum values for each parameter that allow
+<b>pcre2_match()</b> to complete without error.
+</P>
+<P>
+If JIT is being used, only the match limit is relevant. If DFA matching is
+being used, neither limit is relevant, and this modifier is ignored (with a
+warning message).
+</P>
+<P>
+The <i>match_limit</i> number is a measure of the amount of backtracking
+that takes place, and learning the minimum value can be instructive. For most
+simple matches, the number is quite small, but for patterns with very large
+numbers of matching possibilities, it can become large very quickly with
+increasing length of subject string. The <i>match_limit_recursion</i> number is
+a measure of how much stack (or, if PCRE2 is compiled with NO_RECURSE, how much
+heap) memory is needed to complete the match attempt.
+</P>
+<br><b>
+Showing MARK names
+</b><br>
+<P>
+The <b>mark</b> modifier causes the names from backtracking control verbs that
+are returned from calls to <b>pcre2_match()</b> to be displayed. If a mark is
+returned for a match, non-match, or partial match, <b>pcre2test</b> shows it.
+For a match, it is on a line by itself, tagged with "MK:". Otherwise, it
+is added to the non-match message.
+</P>
+<br><b>
+Showing memory usage
+</b><br>
+<P>
+The <b>memory</b> modifier causes <b>pcre2test</b> to log all memory allocation
+and freeing calls that occur during a match operation.
+</P>
+<br><b>
+Setting a starting offset
+</b><br>
+<P>
+The <b>offset</b> modifier sets an offset in the subject string at which
+matching starts. Its value is a number of code units, not characters.
+</P>
+<br><b>
+Setting an offset limit
+</b><br>
+<P>
+The <b>offset_limit</b> modifier sets a limit for unanchored matches. If a match
+cannot be found starting at or before this offset in the subject, a "no match"
+return is given. The data value is a number of code units, not characters. When
+this modifier is used, the <b>use_offset_limit</b> modifier must have been set
+for the pattern; if not, an error is generated.
+</P>
+<br><b>
+Setting the size of the output vector
+</b><br>
+<P>
+The <b>ovector</b> modifier applies only to the subject line in which it
+appears, though of course it can also be used to set a default in a
+<b>#subject</b> command. It specifies the number of pairs of offsets that are
+available for storing matching information. The default is 15.
+</P>
+<P>
+A value of zero is useful when testing the POSIX API because it causes
+<b>regexec()</b> to be called with a NULL capture vector. When not testing the
+POSIX API, a value of zero is used to cause
+<b>pcre2_match_data_create_from_pattern()</b> to be called, in order to create a
+match block of exactly the right size for the pattern. (It is not possible to
+create a match block with a zero-length ovector; there is always at least one
+pair of offsets.)
+</P>
+<br><b>
+Passing the subject as zero-terminated
+</b><br>
+<P>
+By default, the subject string is passed to a native API matching function with
+its correct length. In order to test the facility for passing a zero-terminated
+string, the <b>zero_terminate</b> modifier is provided. It causes the length to
+be passed as PCRE2_ZERO_TERMINATED. (When matching via the POSIX interface,
+this modifier has no effect, as there is no facility for passing a length.)
+</P>
+<P>
+When testing <b>pcre2_substitute()</b>, this modifier also has the effect of
+passing the replacement string as zero-terminated.
+</P>
+<br><b>
+Passing a NULL context
+</b><br>
+<P>
+Normally, <b>pcre2test</b> passes a context block to <b>pcre2_match()</b>,
+<b>pcre2_dfa_match()</b> or <b>pcre2_jit_match()</b>. If the <b>null_context</b>
+modifier is set, however, NULL is passed. This is for testing that the matching
+functions behave correctly in this case (they use default values). This
+modifier cannot be used with the <b>find_limits</b> modifier or when testing the
+substitution function.
+</P>
+<br><a name="SEC12" href="#TOC1">THE ALTERNATIVE MATCHING FUNCTION</a><br>
+<P>
+By default, <b>pcre2test</b> uses the standard PCRE2 matching function,
+<b>pcre2_match()</b> to match each subject line. PCRE2 also supports an
+alternative matching function, <b>pcre2_dfa_match()</b>, which operates in a
+different way, and has some restrictions. The differences between the two
+functions are described in the
+<a href="pcre2matching.html"><b>pcre2matching</b></a>
+documentation.
+</P>
+<P>
+If the <b>dfa</b> modifier is set, the alternative matching function is used.
+This function finds all possible matches at a given point in the subject. If,
+however, the <b>dfa_shortest</b> modifier is set, processing stops after the
+first match is found. This is always the shortest possible match.
+</P>
+<br><a name="SEC13" href="#TOC1">DEFAULT OUTPUT FROM pcre2test</a><br>
+<P>
+This section describes the output when the normal matching function,
+<b>pcre2_match()</b>, is being used.
+</P>
+<P>
+When a match succeeds, <b>pcre2test</b> outputs the list of captured substrings,
+starting with number 0 for the string that matched the whole pattern.
+Otherwise, it outputs "No match" when the return is PCRE2_ERROR_NOMATCH, or
+"Partial match:" followed by the partially matching substring when the
+return is PCRE2_ERROR_PARTIAL. (Note that this is the
+entire substring that was inspected during the partial match; it may include
+characters before the actual match start if a lookbehind assertion, \K, \b,
+or \B was involved.)
+</P>
+<P>
+For any other return, <b>pcre2test</b> outputs the PCRE2 negative error number
+and a short descriptive phrase. If the error is a failed UTF string check, the
+code unit offset of the start of the failing character is also output. Here is
+an example of an interactive <b>pcre2test</b> run.
+<pre>
+  $ pcre2test
+  PCRE2 version 9.00 2014-05-10
+
+    re&#62; /^abc(\d+)/
+  data&#62; abc123
+   0: abc123
+   1: 123
+  data&#62; xyz
+  No match
+</pre>
+Unset capturing substrings that are not followed by one that is set are not
+shown by <b>pcre2test</b> unless the <b>allcaptures</b> modifier is specified. In
+the following example, there are two capturing substrings, but when the first
+data line is matched, the second, unset substring is not shown. An "internal"
+unset substring is shown as "&#60;unset&#62;", as for the second data line.
+<pre>
+    re&#62; /(a)|(b)/
+  data&#62; a
+   0: a
+   1: a
+  data&#62; b
+   0: b
+   1: &#60;unset&#62;
+   2: b
+</pre>
+If the strings contain any non-printing characters, they are output as \xhh
+escapes if the value is less than 256 and UTF mode is not set. Otherwise they
+are output as \x{hh...} escapes. See below for the definition of non-printing
+characters. If the <b>/aftertext</b> modifier is set, the output for substring
+0 is followed by the the rest of the subject string, identified by "0+" like
+this:
+<pre>
+    re&#62; /cat/aftertext
+  data&#62; cataract
+   0: cat
+   0+ aract
+</pre>
+If global matching is requested, the results of successive matching attempts
+are output in sequence, like this:
+<pre>
+    re&#62; /\Bi(\w\w)/g
+  data&#62; Mississippi
+   0: iss
+   1: ss
+   0: iss
+   1: ss
+   0: ipp
+   1: pp
+</pre>
+"No match" is output only if the first match attempt fails. Here is an example
+of a failure message (the offset 4 that is specified by the <b>offset</b>
+modifier is past the end of the subject string):
+<pre>
+    re&#62; /xyz/
+  data&#62; xyz\=offset=4
+  Error -24 (bad offset value)
+</PRE>
+</P>
+<P>
+Note that whereas patterns can be continued over several lines (a plain "&#62;"
+prompt is used for continuations), subject lines may not. However newlines can
+be included in a subject by means of the \n escape (or \r, \r\n, etc.,
+depending on the newline sequence setting).
+</P>
+<br><a name="SEC14" href="#TOC1">OUTPUT FROM THE ALTERNATIVE MATCHING FUNCTION</a><br>
+<P>
+When the alternative matching function, <b>pcre2_dfa_match()</b>, is used, the
+output consists of a list of all the matches that start at the first point in
+the subject where there is at least one match. For example:
+<pre>
+    re&#62; /(tang|tangerine|tan)/
+  data&#62; yellow tangerine\=dfa
+   0: tangerine
+   1: tang
+   2: tan
+</pre>
+Using the normal matching function on this data finds only "tang". The
+longest matching string is always given first (and numbered zero). After a
+PCRE2_ERROR_PARTIAL return, the output is "Partial match:", followed by the
+partially matching substring. Note that this is the entire substring that was
+inspected during the partial match; it may include characters before the actual
+match start if a lookbehind assertion, \b, or \B was involved. (\K is not
+supported for DFA matching.)
+</P>
+<P>
+If global matching is requested, the search for further matches resumes
+at the end of the longest match. For example:
+<pre>
+    re&#62; /(tang|tangerine|tan)/g
+  data&#62; yellow tangerine and tangy sultana\=dfa
+   0: tangerine
+   1: tang
+   2: tan
+   0: tang
+   1: tan
+   0: tan
+</pre>
+The alternative matching function does not support substring capture, so the
+modifiers that are concerned with captured substrings are not relevant.
+</P>
+<br><a name="SEC15" href="#TOC1">RESTARTING AFTER A PARTIAL MATCH</a><br>
+<P>
+When the alternative matching function has given the PCRE2_ERROR_PARTIAL
+return, indicating that the subject partially matched the pattern, you can
+restart the match with additional subject data by means of the
+<b>dfa_restart</b> modifier. For example:
+<pre>
+    re&#62; /^\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d$/
+  data&#62; 23ja\=P,dfa
+  Partial match: 23ja
+  data&#62; n05\=dfa,dfa_restart
+   0: n05
+</pre>
+For further information about partial matching, see the
+<a href="pcre2partial.html"><b>pcre2partial</b></a>
+documentation.
+</P>
+<br><a name="SEC16" href="#TOC1">CALLOUTS</a><br>
+<P>
+If the pattern contains any callout requests, <b>pcre2test</b>'s callout
+function is called during matching unless <b>callout_none</b> is specified.
+This works with both matching functions.
+</P>
+<P>
+The callout function in <b>pcre2test</b> returns zero (carry on matching) by
+default, but you can use a <b>callout_fail</b> modifier in a subject line (as
+described above) to change this and other parameters of the callout.
+</P>
+<P>
+Inserting callouts can be helpful when using <b>pcre2test</b> to check
+complicated regular expressions. For further information about callouts, see
+the
+<a href="pcre2callout.html"><b>pcre2callout</b></a>
+documentation.
+</P>
+<P>
+The output for callouts with numerical arguments and those with string
+arguments is slightly different.
+</P>
+<br><b>
+Callouts with numerical arguments
+</b><br>
+<P>
+By default, the callout function displays the callout number, the start and
+current positions in the subject text at the callout time, and the next pattern
+item to be tested. For example:
+<pre>
+  ---&#62;pqrabcdef
+    0    ^  ^     \d
+</pre>
+This output indicates that callout number 0 occurred for a match attempt
+starting at the fourth character of the subject string, when the pointer was at
+the seventh character, and when the next pattern item was \d. Just
+one circumflex is output if the start and current positions are the same.
+</P>
+<P>
+Callouts numbered 255 are assumed to be automatic callouts, inserted as a
+result of the <b>/auto_callout</b> pattern modifier. In this case, instead of
+showing the callout number, the offset in the pattern, preceded by a plus, is
+output. For example:
+<pre>
+    re&#62; /\d?[A-E]\*/auto_callout
+  data&#62; E*
+  ---&#62;E*
+   +0 ^      \d?
+   +3 ^      [A-E]
+   +8 ^^     \*
+  +10 ^ ^
+   0: E*
+</pre>
+If a pattern contains (*MARK) items, an additional line is output whenever
+a change of latest mark is passed to the callout function. For example:
+<pre>
+    re&#62; /a(*MARK:X)bc/auto_callout
+  data&#62; abc
+  ---&#62;abc
+   +0 ^       a
+   +1 ^^      (*MARK:X)
+  +10 ^^      b
+  Latest Mark: X
+  +11 ^ ^     c
+  +12 ^  ^
+   0: abc
+</pre>
+The mark changes between matching "a" and "b", but stays the same for the rest
+of the match, so nothing more is output. If, as a result of backtracking, the
+mark reverts to being unset, the text "&#60;unset&#62;" is output.
+</P>
+<br><b>
+Callouts with string arguments
+</b><br>
+<P>
+The output for a callout with a string argument is similar, except that instead
+of outputting a callout number before the position indicators, the callout
+string and its offset in the pattern string are output before the reflection of
+the subject string, and the subject string is reflected for each callout. For
+example:
+<pre>
+    re&#62; /^ab(?C'first')cd(?C"second")ef/
+  data&#62; abcdefg
+  Callout (7): 'first'
+  ---&#62;abcdefg
+      ^ ^         c
+  Callout (20): "second"
+  ---&#62;abcdefg
+      ^   ^       e
+   0: abcdef
+
+</PRE>
+</P>
+<br><a name="SEC17" href="#TOC1">NON-PRINTING CHARACTERS</a><br>
+<P>
+When <b>pcre2test</b> is outputting text in the compiled version of a pattern,
+bytes other than 32-126 are always treated as non-printing characters and are
+therefore shown as hex escapes.
+</P>
+<P>
+When <b>pcre2test</b> is outputting text that is a matched part of a subject
+string, it behaves in the same way, unless a different locale has been set for
+the pattern (using the <b>/locale</b> modifier). In this case, the
+<b>isprint()</b> function is used to distinguish printing and non-printing
+characters.
+<a name="saverestore"></a></P>
+<br><a name="SEC18" href="#TOC1">SAVING AND RESTORING COMPILED PATTERNS</a><br>
+<P>
+It is possible to save compiled patterns on disc or elsewhere, and reload them
+later, subject to a number of restrictions. JIT data cannot be saved. The host
+on which the patterns are reloaded must be running the same version of PCRE2,
+with the same code unit width, and must also have the same endianness, pointer
+width and PCRE2_SIZE type. Before compiled patterns can be saved they must be
+serialized, that is, converted to a stream of bytes. A single byte stream may
+contain any number of compiled patterns, but they must all use the same
+character tables. A single copy of the tables is included in the byte stream
+(its size is 1088 bytes).
+</P>
+<P>
+The functions whose names begin with <b>pcre2_serialize_</b> are used
+for serializing and de-serializing. They are described in the
+<a href="pcre2serialize.html"><b>pcre2serialize</b></a>
+documentation. In this section we describe the features of <b>pcre2test</b> that
+can be used to test these functions.
+</P>
+<P>
+When a pattern with <b>push</b> modifier is successfully compiled, it is pushed
+onto a stack of compiled patterns, and <b>pcre2test</b> expects the next line to
+contain a new pattern (or command) instead of a subject line. By this means, a
+number of patterns can be compiled and retained. The <b>push</b> modifier is
+incompatible with <b>posix</b>, and control modifiers that act at match time are
+ignored (with a message). The <b>jitverify</b> modifier applies only at compile
+time. The command
+<pre>
+  #save &#60;filename&#62;
+</pre>
+causes all the stacked patterns to be serialized and the result written to the
+named file. Afterwards, all the stacked patterns are freed. The command
+<pre>
+  #load &#60;filename&#62;
+</pre>
+reads the data in the file, and then arranges for it to be de-serialized, with
+the resulting compiled patterns added to the pattern stack. The pattern on the
+top of the stack can be retrieved by the #pop command, which must be followed
+by lines of subjects that are to be matched with the pattern, terminated as
+usual by an empty line or end of file. This command may be followed by a
+modifier list containing only
+<a href="#controlmodifiers">control modifiers</a>
+that act after a pattern has been compiled. In particular, <b>hex</b>,
+<b>posix</b>, and <b>push</b> are not allowed, nor are any
+<a href="#optionmodifiers">option-setting modifiers.</a>
+The JIT modifiers are, however permitted. Here is an example that saves and
+reloads two patterns.
+<pre>
+  /abc/push
+  /xyz/push
+  #save tempfile
+  #load tempfile
+  #pop info
+  xyz
+
+  #pop jit,bincode
+  abc
+</pre>
+If <b>jitverify</b> is used with #pop, it does not automatically imply
+<b>jit</b>, which is different behaviour from when it is used on a pattern.
+</P>
+<br><a name="SEC19" href="#TOC1">SEE ALSO</a><br>
+<P>
+<b>pcre2</b>(3), <b>pcre2api</b>(3), <b>pcre2callout</b>(3),
+<b>pcre2jit</b>, <b>pcre2matching</b>(3), <b>pcre2partial</b>(d),
+<b>pcre2pattern</b>(3), <b>pcre2serialize</b>(3).
+</P>
+<br><a name="SEC20" href="#TOC1">AUTHOR</a><br>
+<P>
+Philip Hazel
+<br>
+University Computing Service
+<br>
+Cambridge, England.
+<br>
+</P>
+<br><a name="SEC21" href="#TOC1">REVISION</a><br>
+<P>
+Last updated: 12 December 2015
+<br>
+Copyright &copy; 1997-2015 University of Cambridge.
+<br>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
diff --git a/dist2/doc/html/pcre2unicode.html b/dist2/doc/html/pcre2unicode.html
new file mode 100644
index 0000000..7af55c3
--- /dev/null
+++ b/dist2/doc/html/pcre2unicode.html
@@ -0,0 +1,285 @@
+<html>
+<head>
+<title>pcre2unicode specification</title>
+</head>
+<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
+<h1>pcre2unicode man page</h1>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
+<p>
+This page is part of the PCRE2 HTML documentation. It was generated
+automatically from the original man page. If there is any nonsense in it,
+please consult the man page, in case the conversion went wrong.
+<br>
+<br><b>
+UNICODE AND UTF SUPPORT
+</b><br>
+<P>
+When PCRE2 is built with Unicode support (which is the default), it has
+knowledge of Unicode character properties and can process text strings in
+UTF-8, UTF-16, or UTF-32 format (depending on the code unit width). However, by
+default, PCRE2 assumes that one code unit is one character. To process a
+pattern as a UTF string, where a character may require more than one code unit,
+you must call
+<a href="pcre2_compile.html"><b>pcre2_compile()</b></a>
+with the PCRE2_UTF option flag, or the pattern must start with the sequence
+(*UTF). When either of these is the case, both the pattern and any subject
+strings that are matched against it are treated as UTF strings instead of
+strings of individual one-code-unit characters.
+</P>
+<P>
+If you do not need Unicode support you can build PCRE2 without it, in which
+case the library will be smaller.
+</P>
+<br><b>
+UNICODE PROPERTY SUPPORT
+</b><br>
+<P>
+When PCRE2 is built with Unicode support, the escape sequences \p{..},
+\P{..}, and \X can be used. The Unicode 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, the Unicode script names such as Arabic or Han, and
+the derived properties Any and L&. Full lists are given in the
+<a href="pcre2pattern.html"><b>pcre2pattern</b></a>
+and
+<a href="pcre2syntax.html"><b>pcre2syntax</b></a>
+documentation. Only the short names for properties are supported. For example,
+\p{L} matches a letter. Its Perl synonym, \p{Letter}, is not supported.
+Furthermore, in Perl, many properties may optionally be prefixed by "Is", for
+compatibility with Perl 5.6. PCRE does not support this.
+</P>
+<br><b>
+WIDE CHARACTERS AND UTF MODES
+</b><br>
+<P>
+Codepoints less than 256 can be specified in patterns by either braced or
+unbraced hexadecimal escape sequences (for example, \x{b3} or \xb3). Larger
+values have to use braced sequences. Unbraced octal code points up to \777 are
+also recognized; larger ones can be coded using \o{...}.
+</P>
+<P>
+In UTF modes, repeat quantifiers apply to complete UTF characters, not to
+individual code units.
+</P>
+<P>
+In UTF modes, the dot metacharacter matches one UTF character instead of a
+single code unit.
+</P>
+<P>
+The escape sequence \C can be used to match a single code unit, in a UTF mode,
+but its use can lead to some strange effects because it breaks up multi-unit
+characters (see the description of \C in the
+<a href="pcre2pattern.html"><b>pcre2pattern</b></a>
+documentation). The use of \C is not supported by the alternative matching
+function <b>pcre2_dfa_match()</b> when in UTF mode. Its use provokes a
+match-time error. The JIT optimization also does not support \C in UTF mode.
+If JIT optimization is requested for a UTF pattern that contains \C, it will
+not succeed, and so the matching will be carried out by the normal interpretive
+function.
+</P>
+<P>
+The character escapes \b, \B, \d, \D, \s, \S, \w, and \W correctly test
+characters of any code value, but, by default, the characters that PCRE2
+recognizes as digits, spaces, or word characters remain the same set as in
+non-UTF mode, all with code points less than 256. This remains true even when
+PCRE2 is built to include Unicode support, because to do otherwise would slow
+down matching in many common cases. Note that this also applies to \b
+and \B, because they are defined in terms of \w and \W. If you want
+to test for a wider sense of, say, "digit", you can use explicit Unicode
+property tests such as \p{Nd}. Alternatively, if you set the PCRE2_UCP option,
+the way that the character escapes work is changed so that Unicode properties
+are used to determine which characters match. There are more details in the
+section on
+<a href="pcre2pattern.html#genericchartypes">generic character types</a>
+in the
+<a href="pcre2pattern.html"><b>pcre2pattern</b></a>
+documentation.
+</P>
+<P>
+Similarly, characters that match the POSIX named character classes are all
+low-valued characters, unless the PCRE2_UCP option is set.
+</P>
+<P>
+However, the special horizontal and vertical white space matching escapes (\h,
+\H, \v, and \V) do match all the appropriate Unicode characters, whether or
+not PCRE2_UCP is set.
+</P>
+<P>
+Case-insensitive matching in UTF mode makes use of Unicode properties. A few
+Unicode characters such as Greek sigma have more than two codepoints that are
+case-equivalent, and these are treated as such.
+</P>
+<br><b>
+VALIDITY OF UTF STRINGS
+</b><br>
+<P>
+When the PCRE2_UTF option is set, the strings passed as patterns and subjects
+are (by default) checked for validity on entry to the relevant functions.
+If an invalid UTF string is passed, an negative error code is returned. The
+code unit offset to the offending character can be extracted from the match
+data block by calling <b>pcre2_get_startchar()</b>, which is used for this
+purpose after a UTF error.
+</P>
+<P>
+UTF-16 and UTF-32 strings can indicate their endianness by special code knows
+as a byte-order mark (BOM). The PCRE2 functions do not handle this, expecting
+strings to be in host byte order.
+</P>
+<P>
+A UTF string is checked before any other processing takes place. In the case of
+<b>pcre2_match()</b> and <b>pcre2_dfa_match()</b> calls with a non-zero starting
+offset, the check is applied only to that part of the subject that could be
+inspected during matching, and there is a check that the starting offset points
+to the first code unit of a character or to the end of the subject. If there
+are no lookbehind assertions in the pattern, the check starts at the starting
+offset. Otherwise, it starts at the length of the longest lookbehind before the
+starting offset, or at the start of the subject if there are not that many
+characters before the starting offset. Note that the sequences \b and \B are
+one-character lookbehinds.
+</P>
+<P>
+In addition to checking the format of the string, there is a check to ensure
+that all code points lie in the range U+0 to U+10FFFF, excluding the surrogate
+area. The so-called "non-character" code points are not excluded because
+Unicode corrigendum #9 makes it clear that they should not be.
+</P>
+<P>
+Characters in the "Surrogate Area" of Unicode are reserved for use by UTF-16,
+where they are used in pairs to encode code points with values greater than
+0xFFFF. The code points that are encoded by UTF-16 pairs are available
+independently in the UTF-8 and UTF-32 encodings. (In other words, the whole
+surrogate thing is a fudge for UTF-16 which unfortunately messes up UTF-8 and
+UTF-32.)
+</P>
+<P>
+In some situations, you may already know that your strings are valid, and
+therefore want to skip these checks in order to improve performance, for
+example in the case of a long subject string that is being scanned repeatedly.
+If you set the PCRE2_NO_UTF_CHECK option at compile time or at match time,
+PCRE2 assumes that the pattern or subject it is given (respectively) contains
+only valid UTF code unit sequences.
+</P>
+<P>
+Passing PCRE2_NO_UTF_CHECK to <b>pcre2_compile()</b> just disables the check for
+the pattern; it does not also apply to subject strings. If you want to disable
+the check for a subject string you must pass this option to <b>pcre2_match()</b>
+or <b>pcre2_dfa_match()</b>.
+</P>
+<P>
+If you pass an invalid UTF string when PCRE2_NO_UTF_CHECK is set, the result
+is undefined and your program may crash or loop indefinitely.
+<a name="utf8strings"></a></P>
+<br><b>
+Errors in UTF-8 strings
+</b><br>
+<P>
+The following negative error codes are given for invalid UTF-8 strings:
+<pre>
+  PCRE2_ERROR_UTF8_ERR1
+  PCRE2_ERROR_UTF8_ERR2
+  PCRE2_ERROR_UTF8_ERR3
+  PCRE2_ERROR_UTF8_ERR4
+  PCRE2_ERROR_UTF8_ERR5
+</pre>
+The string ends with a truncated UTF-8 character; the code specifies how many
+bytes are missing (1 to 5). Although RFC 3629 restricts UTF-8 characters to be
+no longer than 4 bytes, the encoding scheme (originally defined by RFC 2279)
+allows for up to 6 bytes, and this is checked first; hence the possibility of
+4 or 5 missing bytes.
+<pre>
+  PCRE2_ERROR_UTF8_ERR6
+  PCRE2_ERROR_UTF8_ERR7
+  PCRE2_ERROR_UTF8_ERR8
+  PCRE2_ERROR_UTF8_ERR9
+  PCRE2_ERROR_UTF8_ERR10
+</pre>
+The two most significant bits of the 2nd, 3rd, 4th, 5th, or 6th byte of the
+character do not have the binary value 0b10 (that is, either the most
+significant bit is 0, or the next bit is 1).
+<pre>
+  PCRE2_ERROR_UTF8_ERR11
+  PCRE2_ERROR_UTF8_ERR12
+</pre>
+A character that is valid by the RFC 2279 rules is either 5 or 6 bytes long;
+these code points are excluded by RFC 3629.
+<pre>
+  PCRE2_ERROR_UTF8_ERR13
+</pre>
+A 4-byte character has a value greater than 0x10fff; these code points are
+excluded by RFC 3629.
+<pre>
+  PCRE2_ERROR_UTF8_ERR14
+</pre>
+A 3-byte character has a value in the range 0xd800 to 0xdfff; this range of
+code points are reserved by RFC 3629 for use with UTF-16, and so are excluded
+from UTF-8.
+<pre>
+  PCRE2_ERROR_UTF8_ERR15
+  PCRE2_ERROR_UTF8_ERR16
+  PCRE2_ERROR_UTF8_ERR17
+  PCRE2_ERROR_UTF8_ERR18
+  PCRE2_ERROR_UTF8_ERR19
+</pre>
+A 2-, 3-, 4-, 5-, or 6-byte character is "overlong", that is, it codes for a
+value that can be represented by fewer bytes, which is invalid. For example,
+the two bytes 0xc0, 0xae give the value 0x2e, whose correct coding uses just
+one byte.
+<pre>
+  PCRE2_ERROR_UTF8_ERR20
+</pre>
+The two most significant bits of the first byte of a character have the binary
+value 0b10 (that is, the most significant bit is 1 and the second is 0). Such a
+byte can only validly occur as the second or subsequent byte of a multi-byte
+character.
+<pre>
+  PCRE2_ERROR_UTF8_ERR21
+</pre>
+The first byte of a character has the value 0xfe or 0xff. These values can
+never occur in a valid UTF-8 string.
+<a name="utf16strings"></a></P>
+<br><b>
+Errors in UTF-16 strings
+</b><br>
+<P>
+The following negative error codes are given for invalid UTF-16 strings:
+<pre>
+  PCRE_UTF16_ERR1  Missing low surrogate at end of string
+  PCRE_UTF16_ERR2  Invalid low surrogate follows high surrogate
+  PCRE_UTF16_ERR3  Isolated low surrogate
+
+<a name="utf32strings"></a></PRE>
+</P>
+<br><b>
+Errors in UTF-32 strings
+</b><br>
+<P>
+The following negative error codes are given for invalid UTF-32 strings:
+<pre>
+  PCRE_UTF32_ERR1  Surrogate character (range from 0xd800 to 0xdfff)
+  PCRE_UTF32_ERR2  Code point is greater than 0x10ffff
+
+</PRE>
+</P>
+<br><b>
+AUTHOR
+</b><br>
+<P>
+Philip Hazel
+<br>
+University Computing Service
+<br>
+Cambridge, England.
+<br>
+</P>
+<br><b>
+REVISION
+</b><br>
+<P>
+Last updated: 16 October 2015
+<br>
+Copyright &copy; 1997-2015 University of Cambridge.
+<br>
+<p>
+Return to the <a href="index.html">PCRE2 index page</a>.
+</p>
diff --git a/dist2/doc/index.html.src b/dist2/doc/index.html.src
new file mode 100644
index 0000000..f459657
--- /dev/null
+++ b/dist2/doc/index.html.src
@@ -0,0 +1,270 @@
+<html>
+<!-- This is a manually maintained file that is the root of the HTML version of
+     the PCRE2 documentation. When the HTML documents are built from the man
+     page versions, the entire doc/html directory is emptied, this file is then
+     copied into doc/html/index.html, and the remaining files therein are
+     created by the 132html script.
+-->
+<head>
+<title>PCRE2 specification</title>
+</head>
+<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
+<h1>Perl-compatible Regular Expressions (revised API: PCRE2)</h1>
+<p>
+The HTML documentation for PCRE2 consists of a number of pages that are listed
+below in alphabetical order. If you are new to PCRE2, please read the first one
+first.
+</p>
+
+<table>
+<tr><td><a href="pcre2.html">pcre2</a></td>
+    <td>&nbsp;&nbsp;Introductory page</td></tr>
+
+<tr><td><a href="pcre2-config.html">pcre2-config</a></td>
+    <td>&nbsp;&nbsp;Information about the installation configuration</td></tr>
+
+<tr><td><a href="pcre2api.html">pcre2api</a></td>
+    <td>&nbsp;&nbsp;PCRE2's native API</td></tr>
+
+<tr><td><a href="pcre2build.html">pcre2build</a></td>
+    <td>&nbsp;&nbsp;Building PCRE2</td></tr>
+
+<tr><td><a href="pcre2callout.html">pcre2callout</a></td>
+    <td>&nbsp;&nbsp;The <i>callout</i> facility</td></tr>
+
+<tr><td><a href="pcre2compat.html">pcre2compat</a></td>
+    <td>&nbsp;&nbsp;Compability with Perl</td></tr>
+
+<tr><td><a href="pcre2demo.html">pcre2demo</a></td>
+    <td>&nbsp;&nbsp;A demonstration C program that uses the PCRE2 library</td></tr>
+
+<tr><td><a href="pcre2grep.html">pcre2grep</a></td>
+    <td>&nbsp;&nbsp;The <b>pcre2grep</b> command</td></tr>
+
+<tr><td><a href="pcre2jit.html">pcre2jit</a></td>
+    <td>&nbsp;&nbsp;Discussion of the just-in-time optimization support</td></tr>
+
+<tr><td><a href="pcre2limits.html">pcre2limits</a></td>
+    <td>&nbsp;&nbsp;Details of size and other limits</td></tr>
+
+<tr><td><a href="pcre2matching.html">pcre2matching</a></td>
+    <td>&nbsp;&nbsp;Discussion of the two matching algorithms</td></tr>
+
+<tr><td><a href="pcre2partial.html">pcre2partial</a></td>
+    <td>&nbsp;&nbsp;Using PCRE2 for partial matching</td></tr>
+
+<tr><td><a href="pcre2pattern.html">pcre2pattern</a></td>
+    <td>&nbsp;&nbsp;Specification of the regular expressions supported by PCRE2</td></tr>
+
+<tr><td><a href="pcre2perform.html">pcre2perform</a></td>
+    <td>&nbsp;&nbsp;Some comments on performance</td></tr>
+
+<tr><td><a href="pcre2posix.html">pcre2posix</a></td>
+    <td>&nbsp;&nbsp;The POSIX API to the PCRE2 8-bit library</td></tr>
+
+<tr><td><a href="pcre2sample.html">pcre2sample</a></td>
+    <td>&nbsp;&nbsp;Discussion of the pcre2demo program</td></tr>
+
+<tr><td><a href="pcre2serialize.html">pcre2serialize</a></td>
+    <td>&nbsp;&nbsp;Serializing functions for saving precompiled patterns</td></tr>
+
+<tr><td><a href="pcre2stack.html">pcre2stack</a></td>
+    <td>&nbsp;&nbsp;Discussion of PCRE2's stack usage</td></tr>
+
+<tr><td><a href="pcre2syntax.html">pcre2syntax</a></td>
+    <td>&nbsp;&nbsp;Syntax quick-reference summary</td></tr>
+
+<tr><td><a href="pcre2test.html">pcre2test</a></td>
+    <td>&nbsp;&nbsp;The <b>pcre2test</b> command for testing PCRE2</td></tr>
+
+<tr><td><a href="pcre2unicode.html">pcre2unicode</a></td>
+    <td>&nbsp;&nbsp;Discussion of Unicode and UTF-8/UTF-16/UTF-32 support</td></tr>
+</table>
+
+<p>
+There are also individual pages that summarize the interface for each function
+in the library.
+</p>
+
+<table>
+
+<tr><td><a href="pcre2_callout_enumerate.html">pcre2_callout_enumerate</a></td>
+    <td>&nbsp;&nbsp;Enumerate callouts in a compiled pattern</td></tr>
+
+<tr><td><a href="pcre2_code_free.html">pcre2_code_free</a></td>
+    <td>&nbsp;&nbsp;Free a compiled pattern</td></tr>
+
+<tr><td><a href="pcre2_compile.html">pcre2_compile</a></td>
+    <td>&nbsp;&nbsp;Compile a regular expression pattern</td></tr>
+
+<tr><td><a href="pcre2_compile_context_copy.html">pcre2_compile_context_copy</a></td>
+    <td>&nbsp;&nbsp;Copy a compile context</td></tr>
+
+<tr><td><a href="pcre2_compile_context_create.html">pcre2_compile_context_create</a></td>
+    <td>&nbsp;&nbsp;Create a compile context</td></tr>
+
+<tr><td><a href="pcre2_compile_context_free.html">pcre2_compile_context_free</a></td>
+    <td>&nbsp;&nbsp;Free a compile context</td></tr>
+
+<tr><td><a href="pcre2_config.html">pcre2_config</a></td>
+    <td>&nbsp;&nbsp;Show build-time configuration options</td></tr>
+
+<tr><td><a href="pcre2_dfa_match.html">pcre2_dfa_match</a></td>
+    <td>&nbsp;&nbsp;Match a compiled pattern to a subject string
+    (DFA algorithm; <i>not</i> Perl compatible)</td></tr>
+
+<tr><td><a href="pcre2_general_context_copy.html">pcre2_general_context_copy</a></td>
+    <td>&nbsp;&nbsp;Copy a general context</td></tr>
+
+<tr><td><a href="pcre2_general_context_create.html">pcre2_general_context_create</a></td>
+    <td>&nbsp;&nbsp;Create a general context</td></tr>
+
+<tr><td><a href="pcre2_general_context_free.html">pcre2_general_context_free</a></td>
+    <td>&nbsp;&nbsp;Free a general context</td></tr>
+
+<tr><td><a href="pcre2_get_error_message.html">pcre2_get_error_message</a></td>
+    <td>&nbsp;&nbsp;Free study data</td></tr>
+
+<tr><td><a href="pcre2_get_mark.html">pcre2_get_mark</a></td>
+    <td>&nbsp;&nbsp;Get a (*MARK) name</td></tr>
+
+<tr><td><a href="pcre2_get_ovector_count.html">pcre2_get_ovector_count</a></td>
+    <td>&nbsp;&nbsp;Get the ovector count</td></tr>
+
+<tr><td><a href="pcre2_get_ovector_pointer.html">pcre2_get_ovector_pointer</a></td>
+    <td>&nbsp;&nbsp;Get a pointer to the ovector</td></tr>
+
+<tr><td><a href="pcre2_get_startchar.html">pcre2_get_startchar</a></td>
+    <td>&nbsp;&nbsp;Get the starting character offset</td></tr>
+
+<tr><td><a href="pcre2_jit_compile.html">pcre2_jit_compile</a></td>
+    <td>&nbsp;&nbsp;Process a compiled pattern with the JIT compiler</td></tr>
+
+<tr><td><a href="pcre2_jit_free_unused_memory.html">pcre2_jit_free_unused_memory</a></td>
+    <td>&nbsp;&nbsp;Free unused JIT memory</td></tr>
+
+<tr><td><a href="pcre2_jit_match.html">pcre2_jit_match</a></td>
+    <td>&nbsp;&nbsp;Fast path interface to JIT matching</td></tr>
+
+<tr><td><a href="pcre2_jit_stack_assign.html">pcre2_jit_stack_assign</a></td>
+    <td>&nbsp;&nbsp;Assign stack for JIT matching</td></tr>
+
+<tr><td><a href="pcre2_jit_stack_create.html">pcre2_jit_stack_create</a></td>
+    <td>&nbsp;&nbsp;Create a stack for JIT matching</td></tr>
+
+<tr><td><a href="pcre2_jit_stack_free.html">pcre2_jit_stack_free</a></td>
+    <td>&nbsp;&nbsp;Free a JIT matching stack</td></tr>
+
+<tr><td><a href="pcre2_maketables.html">pcre2_maketables</a></td>
+    <td>&nbsp;&nbsp;Build character tables in current locale</td></tr>
+
+<tr><td><a href="pcre2_match.html">pcre2_match</a></td>
+    <td>&nbsp;&nbsp;Match a compiled pattern to a subject string
+    (Perl compatible)</td></tr>
+
+<tr><td><a href="pcre2_match_context_copy.html">pcre2_match_context_copy</a></td>
+    <td>&nbsp;&nbsp;Copy a match context</td></tr>
+
+<tr><td><a href="pcre2_match_context_create.html">pcre2_match_context_create</a></td>
+    <td>&nbsp;&nbsp;Create a match context</td></tr>
+
+<tr><td><a href="pcre2_match_context_free.html">pcre2_match_context_free</a></td>
+    <td>&nbsp;&nbsp;Free a match context</td></tr>
+
+<tr><td><a href="pcre2_match_data_create.html">pcre2_match_data_create</a></td>
+    <td>&nbsp;&nbsp;Create a match data block</td></tr>
+
+<tr><td><a href="pcre2_match_data_create_from_pattern.html">pcre2_match_data_create_from_pattern</a></td>
+    <td>&nbsp;&nbsp;Create a match data block getting size from pattern</td></tr>
+
+<tr><td><a href="pcre2_match_data_free.html">pcre2_match_data_free</a></td>
+    <td>&nbsp;&nbsp;Free a match data block</td></tr>
+
+<tr><td><a href="pcre2_pattern_info.html">pcre2_pattern_info</a></td>
+    <td>&nbsp;&nbsp;Extract information about a pattern</td></tr>
+
+<tr><td><a href="pcre2_serialize_decode.html">pcre2_serialize_decode</a></td>
+    <td>&nbsp;&nbsp;Decode serialized compiled patterns</td></tr>
+
+<tr><td><a href="pcre2_serialize_encode.html">pcre2_serialize_encode</a></td>
+    <td>&nbsp;&nbsp;Serialize compiled patterns for save/restore</td></tr>
+
+<tr><td><a href="pcre2_serialize_free.html">pcre2_serialize_free</a></td>
+    <td>&nbsp;&nbsp;Free serialized compiled patterns</td></tr>
+
+<tr><td><a href="pcre2_serialize_get_number_of_codes.html">pcre2_serialize_get_number_of_codes</a></td>
+    <td>&nbsp;&nbsp;Get number of serialized compiled patterns</td></tr>
+
+<tr><td><a href="pcre2_set_bsr.html">pcre2_set_bsr</a></td>
+    <td>&nbsp;&nbsp;Set \R convention</td></tr>
+
+<tr><td><a href="pcre2_set_callout.html">pcre2_set_callout</a></td>
+    <td>&nbsp;&nbsp;Set up a callout function</td></tr>
+
+<tr><td><a href="pcre2_set_character_tables.html">pcre2_set_character_tables</a></td>
+    <td>&nbsp;&nbsp;Set character tables</td></tr>
+
+<tr><td><a href="pcre2_set_compile_recursion_guard.html">pcre2_set_compile_recursion_guard</a></td>
+    <td>&nbsp;&nbsp;Set up a compile recursion guard function</td></tr>
+
+<tr><td><a href="pcre2_set_match_limit.html">pcre2_set_match_limit</a></td>
+    <td>&nbsp;&nbsp;Set the match limit</td></tr>
+
+<tr><td><a href="pcre2_set_max_pattern_length.html">pcre2_set_max_pattern_length</a></td>
+    <td>&nbsp;&nbsp;Set the maximum length of pattern</td></tr>
+
+<tr><td><a href="pcre2_set_newline.html">pcre2_set_newline</a></td>
+    <td>&nbsp;&nbsp;Set the newline convention</td></tr>
+
+<tr><td><a href="pcre2_set_offset_limit.html">pcre2_set_offset_limit</a></td>
+    <td>&nbsp;&nbsp;Set the offset limit</td></tr>
+
+<tr><td><a href="pcre2_set_parens_nest_limit.html">pcre2_set_parens_nest_limit</a></td>
+    <td>&nbsp;&nbsp;Set the parentheses nesting limit</td></tr>
+
+<tr><td><a href="pcre2_set_recursion_limit.html">pcre2_set_recursion_limit</a></td>
+    <td>&nbsp;&nbsp;Set the match recursion limit</td></tr>
+
+<tr><td><a href="pcre2_set_recursion_memory_management.html">pcre2_set_recursion_memory_management</a></td>
+    <td>&nbsp;&nbsp;Set match recursion memory management</td></tr>
+
+<tr><td><a href="pcre2_substitute.html">pcre2_substitute</a></td>
+    <td>&nbsp;&nbsp;Match a compiled pattern to a subject string and do
+    substitutions</td></tr>
+
+<tr><td><a href="pcre2_substring_copy_byname.html">pcre2_substring_copy_byname</a></td>
+    <td>&nbsp;&nbsp;Extract named substring into given buffer</td></tr>
+
+<tr><td><a href="pcre2_substring_copy_bynumber.html">pcre2_substring_copy_bynumber</a></td>
+    <td>&nbsp;&nbsp;Extract numbered substring into given buffer</td></tr>
+
+<tr><td><a href="pcre2_substring_free.html">pcre2_substring_free</a></td>
+    <td>&nbsp;&nbsp;Free extracted substring</td></tr>
+
+<tr><td><a href="pcre2_substring_get_byname.html">pcre2_substring_get_byname</a></td>
+    <td>&nbsp;&nbsp;Extract named substring into new memory</td></tr>
+
+<tr><td><a href="pcre2_substring_get_bynumber.html">pcre2_substring_get_bynumber</a></td>
+    <td>&nbsp;&nbsp;Extract numbered substring into new memory</td></tr>
+
+<tr><td><a href="pcre2_substring_length_byname.html">pcre2_substring_length_byname</a></td>
+    <td>&nbsp;&nbsp;Find length of named substring</td></tr>
+
+<tr><td><a href="pcre2_substring_length_bynumber.html">pcre2_substring_length_bynumber</a></td>
+    <td>&nbsp;&nbsp;Find length of numbered substring</td></tr>
+
+<tr><td><a href="pcre2_substring_list_free.html">pcre2_substring_list_free</a></td>
+    <td>&nbsp;&nbsp;Free list of extracted substrings</td></tr>
+
+<tr><td><a href="pcre2_substring_list_get.html">pcre2_substring_list_get</a></td>
+    <td>&nbsp;&nbsp;Extract all substrings into new memory</td></tr>
+
+<tr><td><a href="pcre2_substring_nametable_scan.html">pcre2_substring_nametable_scan</a></td>
+    <td>&nbsp;&nbsp;Find table entries for given string name</td></tr>
+
+<tr><td><a href="pcre2_substring_number_from_name.html">pcre2_substring_number_from_name</a></td>
+    <td>&nbsp;&nbsp;Convert captured string name to number</td></tr>
+</table>
+
+</html>
+
diff --git a/dist2/doc/pcre2-config.1 b/dist2/doc/pcre2-config.1
new file mode 100644
index 0000000..7fa0a09
--- /dev/null
+++ b/dist2/doc/pcre2-config.1
@@ -0,0 +1,86 @@
+.TH PCRE2-CONFIG 1 "28 September 2014" "PCRE2 10.00"
+.SH NAME
+pcre2-config - program to return PCRE2 configuration
+.SH SYNOPSIS
+.rs
+.sp
+.nf
+.B pcre2-config  [--prefix] [--exec-prefix] [--version]
+.B "             [--libs8] [--libs16] [--libs32] [--libs-posix]"
+.B "             [--cflags] [--cflags-posix]"
+.fi
+.
+.
+.SH DESCRIPTION
+.rs
+.sp
+\fBpcre2-config\fP returns the configuration of the installed PCRE2 libraries
+and the options required to compile a program to use them. Some of the options
+apply only to the 8-bit, or 16-bit, or 32-bit libraries, respectively, and are
+not available for libraries that have not been built. If an unavailable option
+is encountered, the "usage" information is output.
+.
+.
+.SH OPTIONS
+.rs
+.TP 10
+\fB--prefix\fP
+Writes the directory prefix used in the PCRE2 installation for architecture
+independent files (\fI/usr\fP on many systems, \fI/usr/local\fP on some
+systems) to the standard output.
+.TP 10
+\fB--exec-prefix\fP
+Writes the directory prefix used in the PCRE2 installation for architecture
+dependent files (normally the same as \fB--prefix\fP) to the standard output.
+.TP 10
+\fB--version\fP
+Writes the version number of the installed PCRE2 libraries to the standard
+output.
+.TP 10
+\fB--libs8\fP
+Writes to the standard output the command line options required to link
+with the 8-bit PCRE2 library (\fB-lpcre2-8\fP on many systems).
+.TP 10
+\fB--libs16\fP
+Writes to the standard output the command line options required to link
+with the 16-bit PCRE2 library (\fB-lpcre2-16\fP on many systems).
+.TP 10
+\fB--libs32\fP
+Writes to the standard output the command line options required to link
+with the 32-bit PCRE2 library (\fB-lpcre2-32\fP on many systems).
+.TP 10
+\fB--libs-posix\fP
+Writes to the standard output the command line options required to link with
+PCRE2's POSIX API wrapper library (\fB-lpcre2-posix\fP \fB-lpcre2-8\fP on many
+systems).
+.TP 10
+\fB--cflags\fP
+Writes to the standard output the command line options required to compile
+files that use PCRE2 (this may include some \fB-I\fP options, but is blank on
+many systems).
+.TP 10
+\fB--cflags-posix\fP
+Writes to the standard output the command line options required to compile
+files that use PCRE2's POSIX API wrapper library (this may include some
+\fB-I\fP options, but is blank on many systems).
+.
+.
+.SH "SEE ALSO"
+.rs
+.sp
+\fBpcre2(3)\fP
+.
+.
+.SH AUTHOR
+.rs
+.sp
+This manual page was originally written by Mark Baker for the Debian GNU/Linux
+system. It has been subsequently revised as a generic PCRE2 man page.
+.
+.
+.SH REVISION
+.rs
+.sp
+.nf
+Last updated: 28 September 2014
+.fi
diff --git a/dist2/doc/pcre2-config.txt b/dist2/doc/pcre2-config.txt
new file mode 100644
index 0000000..8ddea2a
--- /dev/null
+++ b/dist2/doc/pcre2-config.txt
@@ -0,0 +1,81 @@
+PCRE2-CONFIG(1)             General Commands Manual            PCRE2-CONFIG(1)
+
+
+
+NAME
+       pcre2-config - program to return PCRE2 configuration
+
+SYNOPSIS
+
+       pcre2-config [--prefix] [--exec-prefix] [--version]
+                    [--libs8] [--libs16] [--libs32] [--libs-posix]
+                    [--cflags] [--cflags-posix]
+
+
+DESCRIPTION
+
+       pcre2-config returns the configuration of the installed PCRE2 libraries
+       and the options required to compile a program to use them. Some of  the
+       options  apply  only  to  the  8-bit,  or  16-bit, or 32-bit libraries,
+       respectively, and are not available for libraries that  have  not  been
+       built. If an unavailable option is encountered, the "usage" information
+       is output.
+
+
+OPTIONS
+
+       --prefix  Writes the directory prefix used in  the  PCRE2  installation
+                 for  architecture  independent  files  (/usr on many systems,
+                 /usr/local on some systems) to the standard output.
+
+       --exec-prefix
+                 Writes the directory prefix used in  the  PCRE2  installation
+                 for architecture dependent files (normally the same as --pre-
+                 fix) to the standard output.
+
+       --version Writes the version number of the installed PCRE2 libraries to
+                 the standard output.
+
+       --libs8   Writes  to  the  standard  output  the  command  line options
+                 required to link with the 8-bit PCRE2 library  (-lpcre2-8  on
+                 many systems).
+
+       --libs16  Writes  to  the  standard  output  the  command  line options
+                 required to link with the 16-bit PCRE2 library (-lpcre2-16 on
+                 many systems).
+
+       --libs32  Writes  to  the  standard  output  the  command  line options
+                 required to link with the 32-bit PCRE2 library (-lpcre2-32 on
+                 many systems).
+
+       --libs-posix
+                 Writes  to  the  standard  output  the  command  line options
+                 required to link  with  PCRE2's  POSIX  API  wrapper  library
+                 (-lpcre2-posix -lpcre2-8 on many systems).
+
+       --cflags  Writes  to  the  standard  output  the  command  line options
+                 required to compile files that use PCRE2  (this  may  include
+                 some -I options, but is blank on many systems).
+
+       --cflags-posix
+                 Writes  to  the  standard  output  the  command  line options
+                 required to compile files that use PCRE2's POSIX API  wrapper
+                 library  (this  may  include some -I options, but is blank on
+                 many systems).
+
+
+SEE ALSO
+
+       pcre2(3)
+
+
+AUTHOR
+
+       This manual page was originally written by Mark Baker  for  the  Debian
+       GNU/Linux  system.  It has been subsequently revised as a generic PCRE2
+       man page.
+
+
+REVISION
+
+       Last updated: 28 September 2014
diff --git a/dist2/doc/pcre2.3 b/dist2/doc/pcre2.3
new file mode 100644
index 0000000..9a84ce3
--- /dev/null
+++ b/dist2/doc/pcre2.3
@@ -0,0 +1,194 @@
+.TH PCRE2 3 "16 October 2015" "PCRE2 10.21"
+.SH NAME
+PCRE2 - Perl-compatible regular expressions (revised API)
+.SH INTRODUCTION
+.rs
+.sp
+PCRE2 is the name used for a revised API for the PCRE library, which is a set
+of functions, written in C, that implement regular expression pattern matching
+using the same syntax and semantics as Perl, with just a few differences. Some
+features that appeared in Python and the original PCRE before they appeared in
+Perl are also available using the Python syntax. There is also some support for
+one or two .NET and Oniguruma syntax items, and there are options for
+requesting some minor changes that give better ECMAScript (aka JavaScript)
+compatibility.
+.P
+The source code for PCRE2 can be compiled to support 8-bit, 16-bit, or 32-bit
+code units, which means that up to three separate libraries may be installed.
+The original work to extend PCRE to 16-bit and 32-bit code units was done by
+Zoltan Herczeg and Christian Persch, respectively. In all three cases, strings
+can be interpreted either as one character per code unit, or as UTF-encoded
+Unicode, with support for Unicode general category properties. Unicode support
+is optional at build time (but is the default). However, processing strings as
+UTF code units must be enabled explicitly at run time. The version of Unicode
+in use can be discovered by running
+.sp
+  pcre2test -C
+.P
+The three libraries contain identical sets of functions, with names ending in
+_8, _16, or _32, respectively (for example, \fBpcre2_compile_8()\fP). However,
+by defining PCRE2_CODE_UNIT_WIDTH to be 8, 16, or 32, a program that uses just
+one code unit width can be written using generic names such as
+\fBpcre2_compile()\fP, and the documentation is written assuming that this is
+the case.
+.P
+In addition to the Perl-compatible matching function, PCRE2 contains an
+alternative 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
+\fBpcre2matching\fP
+.\"
+page.
+.P
+Details of exactly which Perl regular expression features are and are not
+supported by PCRE2 are given in separate documents. See the
+.\" HREF
+\fBpcre2pattern\fP
+.\"
+and
+.\" HREF
+\fBpcre2compat\fP
+.\"
+pages. There is a syntax summary in the
+.\" HREF
+\fBpcre2syntax\fP
+.\"
+page.
+.P
+Some features of PCRE2 can be included, excluded, or changed when the library
+is built. The
+.\" HREF
+\fBpcre2_config()\fP
+.\"
+function makes it possible for a client to discover which features are
+available. The features themselves are described in the
+.\" HREF
+\fBpcre2build\fP
+.\"
+page. Documentation about building PCRE2 for various operating systems can be
+found in the
+.\" HTML <a href="README.txt">
+.\" </a>
+\fBREADME\fP
+.\"
+and
+.\" HTML <a href="NON-AUTOTOOLS-BUILD.txt">
+.\" </a>
+\fBNON-AUTOTOOLS_BUILD\fP
+.\"
+files in the source distribution.
+.P
+The libraries 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
+"_pcre2", 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 "SECURITY CONSIDERATIONS"
+.rs
+.sp
+If you are using PCRE2 in a non-UTF application that permits users to supply
+arbitrary patterns for compilation, you should be aware of a feature that
+allows users to turn on UTF support from within a pattern. For example, an
+8-bit pattern that begins with "(*UTF)" turns on UTF-8 mode, which interprets
+patterns and subjects as strings of UTF-8 code units instead of individual
+8-bit characters. This causes both the pattern and any data against which it is
+matched to be checked for UTF-8 validity. If the data string is very long, such
+a check might use sufficiently many resources as to cause your application to
+lose performance.
+.P
+One way of guarding against this possibility is to use the
+\fBpcre2_pattern_info()\fP function to check the compiled pattern's options for
+PCRE2_UTF. Alternatively, you can set the PCRE2_NEVER_UTF option when calling
+\fBpcre2_compile()\fP. This causes an compile time error if a pattern contains
+a UTF-setting sequence.
+.P
+The use of Unicode properties for character types such as \ed can also be
+enabled from within the pattern, by specifying "(*UCP)". This feature can be
+disallowed by setting the PCRE2_NEVER_UCP option.
+.P
+If your application is one that supports UTF, be aware that validity checking
+can take time. If the same data string is to be matched many times, you can use
+the PCRE2_NO_UTF_CHECK option for the second and subsequent matches to avoid
+running redundant checks.
+.P
+The use of the \eC escape sequence in a UTF-8 or UTF-16 pattern can lead to
+problems, because it may leave the current matching point in the middle of a
+multi-code-unit character. The PCRE2_NEVER_BACKSLASH_C option can be used by an
+application to lock out the use of \eC, causing a compile-time error if it is
+encountered. It is also possible to build PCRE2 with the use of \eC permanently
+disabled.
+.P
+Another way that performance can be hit is by running a pattern that has a very
+large search tree against a string that will never match. Nested unlimited
+repeats in a pattern are a common example. PCRE2 provides some protection
+against this: see the \fBpcre2_set_match_limit()\fP function in the
+.\" HREF
+\fBpcre2api\fP
+.\"
+page.
+.
+.
+.SH "USER DOCUMENTATION"
+.rs
+.sp
+The user documentation for PCRE2 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,
+the descriptions of the \fBpcre2grep\fP and \fBpcre2test\fP programs are in
+files called \fBpcre2grep.txt\fP and \fBpcre2test.txt\fP, respectively. The
+remaining sections, except for the \fBpcre2demo\fP section (which is a program
+listing), and the short pages for individual functions, are concatenated in
+\fBpcre2.txt\fP, for ease of searching. The sections are as follows:
+.sp
+  pcre2              this document
+  pcre2-config       show PCRE2 installation configuration information
+  pcre2api           details of PCRE2's native C API
+  pcre2build         building PCRE2
+  pcre2callout       details of the callout feature
+  pcre2compat        discussion of Perl compatibility
+  pcre2demo          a demonstration C program that uses PCRE2
+  pcre2grep          description of the \fBpcre2grep\fP command (8-bit only)
+  pcre2jit           discussion of just-in-time optimization support
+  pcre2limits        details of size and other limits
+  pcre2matching      discussion of the two matching algorithms
+  pcre2partial       details of the partial matching facility
+.\" JOIN
+  pcre2pattern       syntax and semantics of supported regular
+                       expression patterns
+  pcre2perform       discussion of performance issues
+  pcre2posix         the POSIX-compatible C API for the 8-bit library
+  pcre2sample        discussion of the pcre2demo program
+  pcre2stack         discussion of stack usage
+  pcre2syntax        quick syntax reference
+  pcre2test          description of the \fBpcre2test\fP command
+  pcre2unicode       discussion of Unicode and UTF support
+.sp
+In the "man" and HTML formats, there is also a short page for each C library
+function, listing its arguments and results.
+.
+.
+.SH AUTHOR
+.rs
+.sp
+.nf
+Philip Hazel
+University Computing Service
+Cambridge, England.
+.fi
+.P
+Putting an actual email address here is a spam magnet. If you want to email me,
+use my two initials, followed by the two digits 10, at the domain cam.ac.uk.
+.
+.
+.SH REVISION
+.rs
+.sp
+.nf
+Last updated: 16 October 2015
+Copyright (c) 1997-2015 University of Cambridge.
+.fi
diff --git a/dist2/doc/pcre2.txt b/dist2/doc/pcre2.txt
new file mode 100644
index 0000000..9df2d47
--- /dev/null
+++ b/dist2/doc/pcre2.txt
@@ -0,0 +1,9799 @@
+-----------------------------------------------------------------------------
+This file contains a concatenation of the PCRE2 man pages, converted to plain
+text format for ease of searching with a text editor, or for use on systems
+that do not have a man page processor. The small individual files that give
+synopses of each function in the library have not been included. Neither has
+the pcre2demo program. There are separate text files for the pcre2grep and
+pcre2test commands.
+-----------------------------------------------------------------------------
+
+
+PCRE2(3)                   Library Functions Manual                   PCRE2(3)
+
+
+
+NAME
+       PCRE2 - Perl-compatible regular expressions (revised API)
+
+INTRODUCTION
+
+       PCRE2 is the name used for a revised API for the PCRE library, which is
+       a set of functions, written in C,  that  implement  regular  expression
+       pattern matching using the same syntax and semantics as Perl, with just
+       a few differences. Some features that appeared in Python and the origi-
+       nal  PCRE  before  they  appeared  in Perl are also available using the
+       Python syntax. There is also some support for one or two .NET and Onig-
+       uruma  syntax  items,  and  there are options for requesting some minor
+       changes that give better ECMAScript (aka JavaScript) compatibility.
+
+       The source code for PCRE2 can be compiled to support 8-bit, 16-bit,  or
+       32-bit  code units, which means that up to three separate libraries may
+       be installed.  The original work to extend PCRE to  16-bit  and  32-bit
+       code  units  was  done  by Zoltan Herczeg and Christian Persch, respec-
+       tively. In all three cases, strings can be interpreted  either  as  one
+       character  per  code  unit, or as UTF-encoded Unicode, with support for
+       Unicode general category properties. Unicode  support  is  optional  at
+       build  time  (but  is  the default). However, processing strings as UTF
+       code units must be enabled explicitly at run time. The version of  Uni-
+       code in use can be discovered by running
+
+         pcre2test -C
+
+       The  three  libraries  contain  identical sets of functions, with names
+       ending in _8,  _16,  or  _32,  respectively  (for  example,  pcre2_com-
+       pile_8()).  However,  by defining PCRE2_CODE_UNIT_WIDTH to be 8, 16, or
+       32, a program that uses just one code unit width can be  written  using
+       generic names such as pcre2_compile(), and the documentation is written
+       assuming that this is the case.
+
+       In addition to the Perl-compatible matching function, PCRE2 contains an
+       alternative  function that matches the same compiled patterns in a dif-
+       ferent way. In certain circumstances, the alternative function has some
+       advantages.   For  a discussion of the two matching algorithms, see the
+       pcre2matching page.
+
+       Details of exactly which Perl regular expression features are  and  are
+       not  supported  by  PCRE2  are  given  in  separate  documents. See the
+       pcre2pattern and pcre2compat pages. There is a syntax  summary  in  the
+       pcre2syntax page.
+
+       Some  features  of PCRE2 can be included, excluded, or changed when the
+       library is built. The pcre2_config() function makes it possible  for  a
+       client  to  discover  which  features are available. The features them-
+       selves are described in the pcre2build page. Documentation about build-
+       ing  PCRE2 for various operating systems can be found in the README and
+       NON-AUTOTOOLS_BUILD files in the source distribution.
+
+       The libraries 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 "_pcre2", 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.
+
+
+SECURITY CONSIDERATIONS
+
+       If you are using PCRE2 in a non-UTF application that permits  users  to
+       supply  arbitrary  patterns  for  compilation, you should be aware of a
+       feature that allows users to turn on UTF support from within a pattern.
+       For  example, an 8-bit pattern that begins with "(*UTF)" turns on UTF-8
+       mode, which interprets patterns and subjects as strings of  UTF-8  code
+       units instead of individual 8-bit characters. This causes both the pat-
+       tern and any data against which it is matched to be checked  for  UTF-8
+       validity.  If the data string is very long, such a check might use suf-
+       ficiently many resources as to cause your application to  lose  perfor-
+       mance.
+
+       One  way  of guarding against this possibility is to use the pcre2_pat-
+       tern_info() function  to  check  the  compiled  pattern's  options  for
+       PCRE2_UTF.  Alternatively,  you can set the PCRE2_NEVER_UTF option when
+       calling pcre2_compile(). This causes an compile time error if a pattern
+       contains a UTF-setting sequence.
+
+       The  use  of Unicode properties for character types such as \d can also
+       be enabled from within the pattern, by specifying "(*UCP)".  This  fea-
+       ture can be disallowed by setting the PCRE2_NEVER_UCP option.
+
+       If  your  application  is one that supports UTF, be aware that validity
+       checking can take time. If the same data string is to be  matched  many
+       times,  you  can  use  the PCRE2_NO_UTF_CHECK option for the second and
+       subsequent matches to avoid running redundant checks.
+
+       The use of the \C escape sequence in a UTF-8 or UTF-16 pattern can lead
+       to  problems,  because  it  may leave the current matching point in the
+       middle of  a  multi-code-unit  character.  The  PCRE2_NEVER_BACKSLASH_C
+       option can be used by an application to lock out the use of \C, causing
+       a compile-time error if it is encountered. It is also possible to build
+       PCRE2 with the use of \C permanently disabled.
+
+       Another  way  that  performance can be hit is by running a pattern that
+       has a very large search tree against a string that  will  never  match.
+       Nested  unlimited repeats in a pattern are a common example. PCRE2 pro-
+       vides some protection against  this:  see  the  pcre2_set_match_limit()
+       function in the pcre2api page.
+
+
+USER DOCUMENTATION
+
+       The  user  documentation for PCRE2 comprises a number of different sec-
+       tions. 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,  the  descriptions  of  the  pcre2grep  and
+       pcre2test programs are in files called pcre2grep.txt and pcre2test.txt,
+       respectively. The remaining sections, except for the pcre2demo  section
+       (which  is a program listing), and the short pages for individual func-
+       tions, are concatenated in pcre2.txt, for ease of searching.  The  sec-
+       tions are as follows:
+
+         pcre2              this document
+         pcre2-config       show PCRE2 installation configuration information
+         pcre2api           details of PCRE2's native C API
+         pcre2build         building PCRE2
+         pcre2callout       details of the callout feature
+         pcre2compat        discussion of Perl compatibility
+         pcre2demo          a demonstration C program that uses PCRE2
+         pcre2grep          description of the pcre2grep command (8-bit only)
+         pcre2jit           discussion of just-in-time optimization support
+         pcre2limits        details of size and other limits
+         pcre2matching      discussion of the two matching algorithms
+         pcre2partial       details of the partial matching facility
+         pcre2pattern       syntax and semantics of supported regular
+                              expression patterns
+         pcre2perform       discussion of performance issues
+         pcre2posix         the POSIX-compatible C API for the 8-bit library
+         pcre2sample        discussion of the pcre2demo program
+         pcre2stack         discussion of stack usage
+         pcre2syntax        quick syntax reference
+         pcre2test          description of the pcre2test command
+         pcre2unicode       discussion of Unicode and UTF support
+
+       In  the  "man"  and HTML formats, there is also a short page for each C
+       library function, listing its arguments and results.
+
+
+AUTHOR
+
+       Philip Hazel
+       University Computing Service
+       Cambridge, England.
+
+       Putting an actual email address here is a spam magnet. If you  want  to
+       email  me,  use  my two initials, followed by the two digits 10, at the
+       domain cam.ac.uk.
+
+
+REVISION
+
+       Last updated: 16 October 2015
+       Copyright (c) 1997-2015 University of Cambridge.
+------------------------------------------------------------------------------
+
+
+PCRE2API(3)                Library Functions Manual                PCRE2API(3)
+
+
+
+NAME
+       PCRE2 - Perl-compatible regular expressions (revised API)
+
+       #include <pcre2.h>
+
+       PCRE2  is  a  new API for PCRE. This document contains a description of
+       all its functions. See the pcre2 document for an overview  of  all  the
+       PCRE2 documentation.
+
+
+PCRE2 NATIVE API BASIC FUNCTIONS
+
+       pcre2_code *pcre2_compile(PCRE2_SPTR pattern, PCRE2_SIZE length,
+         uint32_t options, int *errorcode, PCRE2_SIZE *erroroffset,
+         pcre2_compile_context *ccontext);
+
+       void pcre2_code_free(pcre2_code *code);
+
+       pcre2_match_data *pcre2_match_data_create(uint32_t ovecsize,
+         pcre2_general_context *gcontext);
+
+       pcre2_match_data *pcre2_match_data_create_from_pattern(
+         const pcre2_code *code, pcre2_general_context *gcontext);
+
+       int pcre2_match(const pcre2_code *code, PCRE2_SPTR subject,
+         PCRE2_SIZE length, PCRE2_SIZE startoffset,
+         uint32_t options, pcre2_match_data *match_data,
+         pcre2_match_context *mcontext);
+
+       int pcre2_dfa_match(const pcre2_code *code, PCRE2_SPTR subject,
+         PCRE2_SIZE length, PCRE2_SIZE startoffset,
+         uint32_t options, pcre2_match_data *match_data,
+         pcre2_match_context *mcontext,
+         int *workspace, PCRE2_SIZE wscount);
+
+       void pcre2_match_data_free(pcre2_match_data *match_data);
+
+
+PCRE2 NATIVE API AUXILIARY MATCH FUNCTIONS
+
+       PCRE2_SPTR pcre2_get_mark(pcre2_match_data *match_data);
+
+       uint32_t pcre2_get_ovector_count(pcre2_match_data *match_data);
+
+       PCRE2_SIZE *pcre2_get_ovector_pointer(pcre2_match_data *match_data);
+
+       PCRE2_SIZE pcre2_get_startchar(pcre2_match_data *match_data);
+
+
+PCRE2 NATIVE API GENERAL CONTEXT FUNCTIONS
+
+       pcre2_general_context *pcre2_general_context_create(
+         void *(*private_malloc)(PCRE2_SIZE, void *),
+         void (*private_free)(void *, void *), void *memory_data);
+
+       pcre2_general_context *pcre2_general_context_copy(
+         pcre2_general_context *gcontext);
+
+       void pcre2_general_context_free(pcre2_general_context *gcontext);
+
+
+PCRE2 NATIVE API COMPILE CONTEXT FUNCTIONS
+
+       pcre2_compile_context *pcre2_compile_context_create(
+         pcre2_general_context *gcontext);
+
+       pcre2_compile_context *pcre2_compile_context_copy(
+         pcre2_compile_context *ccontext);
+
+       void pcre2_compile_context_free(pcre2_compile_context *ccontext);
+
+       int pcre2_set_bsr(pcre2_compile_context *ccontext,
+         uint32_t value);
+
+       int pcre2_set_character_tables(pcre2_compile_context *ccontext,
+         const unsigned char *tables);
+
+       int pcre2_set_max_pattern_length(pcre2_compile_context *ccontext,
+         PCRE2_SIZE value);
+
+       int pcre2_set_newline(pcre2_compile_context *ccontext,
+         uint32_t value);
+
+       int pcre2_set_parens_nest_limit(pcre2_compile_context *ccontext,
+         uint32_t value);
+
+       int pcre2_set_compile_recursion_guard(pcre2_compile_context *ccontext,
+         int (*guard_function)(uint32_t, void *), void *user_data);
+
+
+PCRE2 NATIVE API MATCH CONTEXT FUNCTIONS
+
+       pcre2_match_context *pcre2_match_context_create(
+         pcre2_general_context *gcontext);
+
+       pcre2_match_context *pcre2_match_context_copy(
+         pcre2_match_context *mcontext);
+
+       void pcre2_match_context_free(pcre2_match_context *mcontext);
+
+       int pcre2_set_callout(pcre2_match_context *mcontext,
+         int (*callout_function)(pcre2_callout_block *, void *),
+         void *callout_data);
+
+       int pcre2_set_match_limit(pcre2_match_context *mcontext,
+         uint32_t value);
+
+       int pcre2_set_offset_limit(pcre2_match_context *mcontext,
+         PCRE2_SIZE value);
+
+       int pcre2_set_recursion_limit(pcre2_match_context *mcontext,
+         uint32_t value);
+
+       int pcre2_set_recursion_memory_management(
+         pcre2_match_context *mcontext,
+         void *(*private_malloc)(PCRE2_SIZE, void *),
+         void (*private_free)(void *, void *), void *memory_data);
+
+
+PCRE2 NATIVE API STRING EXTRACTION FUNCTIONS
+
+       int pcre2_substring_copy_byname(pcre2_match_data *match_data,
+         PCRE2_SPTR name, PCRE2_UCHAR *buffer, PCRE2_SIZE *bufflen);
+
+       int pcre2_substring_copy_bynumber(pcre2_match_data *match_data,
+         uint32_t number, PCRE2_UCHAR *buffer,
+         PCRE2_SIZE *bufflen);
+
+       void pcre2_substring_free(PCRE2_UCHAR *buffer);
+
+       int pcre2_substring_get_byname(pcre2_match_data *match_data,
+         PCRE2_SPTR name, PCRE2_UCHAR **bufferptr, PCRE2_SIZE *bufflen);
+
+       int pcre2_substring_get_bynumber(pcre2_match_data *match_data,
+         uint32_t number, PCRE2_UCHAR **bufferptr,
+         PCRE2_SIZE *bufflen);
+
+       int pcre2_substring_length_byname(pcre2_match_data *match_data,
+         PCRE2_SPTR name, PCRE2_SIZE *length);
+
+       int pcre2_substring_length_bynumber(pcre2_match_data *match_data,
+         uint32_t number, PCRE2_SIZE *length);
+
+       int pcre2_substring_nametable_scan(const pcre2_code *code,
+         PCRE2_SPTR name, PCRE2_SPTR *first, PCRE2_SPTR *last);
+
+       int pcre2_substring_number_from_name(const pcre2_code *code,
+         PCRE2_SPTR name);
+
+       void pcre2_substring_list_free(PCRE2_SPTR *list);
+
+       int pcre2_substring_list_get(pcre2_match_data *match_data,
+         PCRE2_UCHAR ***listptr, PCRE2_SIZE **lengthsptr);
+
+
+PCRE2 NATIVE API STRING SUBSTITUTION FUNCTION
+
+       int pcre2_substitute(const pcre2_code *code, PCRE2_SPTR subject,
+         PCRE2_SIZE length, PCRE2_SIZE startoffset,
+         uint32_t options, pcre2_match_data *match_data,
+         pcre2_match_context *mcontext, PCRE2_SPTR replacementzfP,
+         PCRE2_SIZE rlength, PCRE2_UCHAR *outputbuffer,
+         PCRE2_SIZE *outlengthptr);
+
+
+PCRE2 NATIVE API JIT FUNCTIONS
+
+       int pcre2_jit_compile(pcre2_code *code, uint32_t options);
+
+       int pcre2_jit_match(const pcre2_code *code, PCRE2_SPTR subject,
+         PCRE2_SIZE length, PCRE2_SIZE startoffset,
+         uint32_t options, pcre2_match_data *match_data,
+         pcre2_match_context *mcontext);
+
+       void pcre2_jit_free_unused_memory(pcre2_general_context *gcontext);
+
+       pcre2_jit_stack *pcre2_jit_stack_create(PCRE2_SIZE startsize,
+         PCRE2_SIZE maxsize, pcre2_general_context *gcontext);
+
+       void pcre2_jit_stack_assign(pcre2_match_context *mcontext,
+         pcre2_jit_callback callback_function, void *callback_data);
+
+       void pcre2_jit_stack_free(pcre2_jit_stack *jit_stack);
+
+
+PCRE2 NATIVE API SERIALIZATION FUNCTIONS
+
+       int32_t pcre2_serialize_decode(pcre2_code **codes,
+         int32_t number_of_codes, const uint8_t *bytes,
+         pcre2_general_context *gcontext);
+
+       int32_t pcre2_serialize_encode(const pcre2_code **codes,
+         int32_t number_of_codes, uint8_t **serialized_bytes,
+         PCRE2_SIZE *serialized_size, pcre2_general_context *gcontext);
+
+       void pcre2_serialize_free(uint8_t *bytes);
+
+       int32_t pcre2_serialize_get_number_of_codes(const uint8_t *bytes);
+
+
+PCRE2 NATIVE API AUXILIARY FUNCTIONS
+
+       int pcre2_get_error_message(int errorcode, PCRE2_UCHAR *buffer,
+         PCRE2_SIZE bufflen);
+
+       const unsigned char *pcre2_maketables(pcre2_general_context *gcontext);
+
+       int pcre2_pattern_info(const pcre2 *code, uint32_t what, void *where);
+
+       int pcre2_callout_enumerate(const pcre2_code *code,
+         int (*callback)(pcre2_callout_enumerate_block *, void *),
+         void *user_data);
+
+       int pcre2_config(uint32_t what, void *where);
+
+
+PCRE2 8-BIT, 16-BIT, AND 32-BIT LIBRARIES
+
+       There  are  three PCRE2 libraries, supporting 8-bit, 16-bit, and 32-bit
+       code units, respectively. However,  there  is  just  one  header  file,
+       pcre2.h.   This  contains the function prototypes and other definitions
+       for all three libraries. One, two, or all three can be installed simul-
+       taneously.  On  Unix-like  systems the libraries are called libpcre2-8,
+       libpcre2-16, and libpcre2-32, and they can also co-exist with the orig-
+       inal PCRE libraries.
+
+       Character  strings are passed to and from a PCRE2 library as a sequence
+       of unsigned integers in code units  of  the  appropriate  width.  Every
+       PCRE2  function  comes  in three different forms, one for each library,
+       for example:
+
+         pcre2_compile_8()
+         pcre2_compile_16()
+         pcre2_compile_32()
+
+       There are also three different sets of data types:
+
+         PCRE2_UCHAR8, PCRE2_UCHAR16, PCRE2_UCHAR32
+         PCRE2_SPTR8,  PCRE2_SPTR16,  PCRE2_SPTR32
+
+       The UCHAR types define unsigned code units of the  appropriate  widths.
+       For  example,  PCRE2_UCHAR16 is usually defined as `uint16_t'. The SPTR
+       types are constant pointers to the equivalent  UCHAR  types,  that  is,
+       they are pointers to vectors of unsigned code units.
+
+       Many  applications use only one code unit width. For their convenience,
+       macros are defined whose names are the generic forms such as pcre2_com-
+       pile()  and  PCRE2_SPTR.  These  macros  use  the  value  of  the macro
+       PCRE2_CODE_UNIT_WIDTH to generate the appropriate width-specific  func-
+       tion and macro names.  PCRE2_CODE_UNIT_WIDTH is not defined by default.
+       An application must define it to be  8,  16,  or  32  before  including
+       pcre2.h in order to make use of the generic names.
+
+       Applications  that use more than one code unit width can be linked with
+       more than one PCRE2 library, but must define  PCRE2_CODE_UNIT_WIDTH  to
+       be  0  before  including pcre2.h, and then use the real function names.
+       Any code that is to be included in an environment where  the  value  of
+       PCRE2_CODE_UNIT_WIDTH  is  unknown  should  also  use the real function
+       names. (Unfortunately, it is not possible in C code to save and restore
+       the value of a macro.)
+
+       If  PCRE2_CODE_UNIT_WIDTH  is  not  defined before including pcre2.h, a
+       compiler error occurs.
+
+       When using multiple libraries in an application,  you  must  take  care
+       when  processing  any  particular  pattern to use only functions from a
+       single library.  For example, if you want to run a match using  a  pat-
+       tern  that  was  compiled  with pcre2_compile_16(), you must do so with
+       pcre2_match_16(), not pcre2_match_8().
+
+       In the function summaries above, and in the rest of this  document  and
+       other  PCRE2  documents,  functions  and data types are described using
+       their generic names, without the 8, 16, or 32 suffix.
+
+
+PCRE2 API OVERVIEW
+
+       PCRE2 has its own native API, which  is  described  in  this  document.
+       There are also some wrapper functions for the 8-bit library that corre-
+       spond to the POSIX regular expression API, but they do not give  access
+       to all the functionality. They are described in the pcre2posix documen-
+       tation. Both these APIs define a set of C function calls.
+
+       The native API C data types, function prototypes,  option  values,  and
+       error codes are defined in the header file pcre2.h, which contains def-
+       initions of PCRE2_MAJOR and PCRE2_MINOR, the major  and  minor  release
+       numbers  for the library. Applications can use these to include support
+       for different releases of PCRE2.
+
+       In a Windows environment, if you want to statically link an application
+       program  against  a non-dll PCRE2 library, you must define PCRE2_STATIC
+       before including pcre2.h.
+
+       The functions pcre2_compile(), and pcre2_match() are used for compiling
+       and  matching regular expressions in a Perl-compatible manner. A sample
+       program that demonstrates the simplest way of using them is provided in
+       the file called pcre2demo.c in the PCRE2 source distribution. A listing
+       of this program is  given  in  the  pcre2demo  documentation,  and  the
+       pcre2sample documentation describes how to compile and run it.
+
+       Just-in-time  compiler support is an optional feature of PCRE2 that can
+       be built in appropriate hardware environments. It greatly speeds up the
+       matching  performance of many patterns. Programs can request that it be
+       used if available, by calling pcre2_jit_compile() after a  pattern  has
+       been successfully compiled by pcre2_compile(). This does nothing if JIT
+       support is not available.
+
+       More complicated programs might need to  make  use  of  the  specialist
+       functions    pcre2_jit_stack_create(),    pcre2_jit_stack_free(),   and
+       pcre2_jit_stack_assign() in order to  control  the  JIT  code's  memory
+       usage.
+
+       JIT matching is automatically used by pcre2_match() if it is available.
+       There is also a direct interface for JIT matching, which gives improved
+       performance.  The  JIT-specific functions are discussed in the pcre2jit
+       documentation.
+
+       A second matching function, pcre2_dfa_match(), which is  not  Perl-com-
+       patible,  is  also  provided.  This  uses a different algorithm for the
+       matching. The alternative algorithm finds all possible  matches  (at  a
+       given  point  in  the subject), and scans the subject just once (unless
+       there are lookbehind assertions).  However,  this  algorithm  does  not
+       return  captured  substrings.  A  description of the two matching algo-
+       rithms  and  their  advantages  and  disadvantages  is  given  in   the
+       pcre2matching    documentation.   There   is   no   JIT   support   for
+       pcre2_dfa_match().
+
+       In addition to the main compiling and  matching  functions,  there  are
+       convenience functions for extracting captured substrings from a subject
+       string that has been matched by pcre2_match(). They are:
+
+         pcre2_substring_copy_byname()
+         pcre2_substring_copy_bynumber()
+         pcre2_substring_get_byname()
+         pcre2_substring_get_bynumber()
+         pcre2_substring_list_get()
+         pcre2_substring_length_byname()
+         pcre2_substring_length_bynumber()
+         pcre2_substring_nametable_scan()
+         pcre2_substring_number_from_name()
+
+       pcre2_substring_free() and pcre2_substring_list_free()  are  also  pro-
+       vided, to free the memory used for extracted strings.
+
+       The  function  pcre2_substitute()  can be called to match a pattern and
+       return a copy of the subject string with substitutions for  parts  that
+       were matched.
+
+       Finally,  there  are functions for finding out information about a com-
+       piled pattern (pcre2_pattern_info()) and about the  configuration  with
+       which PCRE2 was built (pcre2_config()).
+
+
+STRING LENGTHS AND OFFSETS
+
+       The  PCRE2  API  uses  string  lengths and offsets into strings of code
+       units in several places. These values are always  of  type  PCRE2_SIZE,
+       which  is an unsigned integer type, currently always defined as size_t.
+       The largest  value  that  can  be  stored  in  such  a  type  (that  is
+       ~(PCRE2_SIZE)0)  is reserved as a special indicator for zero-terminated
+       strings and unset offsets.  Therefore, the longest string that  can  be
+       handled is one less than this maximum.
+
+
+NEWLINES
+
+       PCRE2 supports five different conventions for indicating line breaks in
+       strings: a single CR (carriage return) character, a  single  LF  (line-
+       feed) character, the two-character sequence CRLF, any of the three pre-
+       ceding, or any Unicode newline sequence. The Unicode newline  sequences
+       are  the  three just mentioned, plus the single characters VT (vertical
+       tab, U+000B), FF (form feed, U+000C), NEL (next line, U+0085), LS (line
+       separator, U+2028), and PS (paragraph separator, U+2029).
+
+       Each  of  the first three conventions is used by at least one operating
+       system as its standard newline sequence. When PCRE2 is built, a default
+       can  be  specified.  The default default is LF, which is the Unix stan-
+       dard. However, the newline convention can be changed by an  application
+       when calling pcre2_compile(), or it can be specified by special text at
+       the start of the pattern itself; this overrides any other settings. See
+       the pcre2pattern page for details of the special character sequences.
+
+       In  the  PCRE2  documentation  the  word "newline" is used to mean "the
+       character or pair of characters that indicate a line break". The choice
+       of  newline convention affects the handling of the dot, circumflex, and
+       dollar metacharacters, the handling of #-comments in /x mode, and, when
+       CRLF  is a recognized line ending sequence, the match position advance-
+       ment for a non-anchored pattern. There is more detail about this in the
+       section on pcre2_match() options below.
+
+       The  choice of newline convention does not affect the interpretation of
+       the \n or \r escape sequences, nor does it affect what \R matches; this
+       has its own separate convention.
+
+
+MULTITHREADING
+
+       In  a multithreaded application it is important to keep thread-specific
+       data separate from data that can be shared between threads.  The  PCRE2
+       library  code  itself  is  thread-safe: it contains no static or global
+       variables. The API is designed to be  fairly  simple  for  non-threaded
+       applications  while at the same time ensuring that multithreaded appli-
+       cations can use it.
+
+       There are several different blocks of data that are used to pass infor-
+       mation between the application and the PCRE2 libraries.
+
+       (1) A pointer to the compiled form of a pattern is returned to the user
+       when pcre2_compile() is successful. The data in the compiled pattern is
+       fixed,  and  does not change when the pattern is matched. Therefore, it
+       is thread-safe, that is, the same compiled pattern can be used by  more
+       than one thread simultaneously. An application can compile all its pat-
+       terns at the start, before forking off multiple threads that use  them.
+       However,  if  the  just-in-time  optimization feature is being used, it
+       needs separate memory stack areas for each  thread.  See  the  pcre2jit
+       documentation for more details.
+
+       (2)  The  next section below introduces the idea of "contexts" in which
+       PCRE2 functions are called. A context is nothing more than a collection
+       of parameters that control the way PCRE2 operates. Grouping a number of
+       parameters together in a context is a convenient way of passing them to
+       a  PCRE2  function without using lots of arguments. The parameters that
+       are stored in contexts are in some sense  "advanced  features"  of  the
+       API. Many straightforward applications will not need to use contexts.
+
+       In a multithreaded application, if the parameters in a context are val-
+       ues that are never changed, the same context can be  used  by  all  the
+       threads. However, if any thread needs to change any value in a context,
+       it must make its own thread-specific copy.
+
+       (3) The matching functions need a block of memory for working space and
+       for  storing  the results of a match. This includes details of what was
+       matched, as well as additional  information  such  as  the  name  of  a
+       (*MARK)  setting. Each thread must provide its own version of this mem-
+       ory.
+
+
+PCRE2 CONTEXTS
+
+       Some PCRE2 functions have a lot of parameters, many of which  are  used
+       only  by  specialist  applications,  for example, those that use custom
+       memory management or non-standard character tables.  To  keep  function
+       argument  lists  at a reasonable size, and at the same time to keep the
+       API extensible, "uncommon" parameters are passed to  certain  functions
+       in  a  context instead of directly. A context is just a block of memory
+       that holds the parameter values.  Applications  that  do  not  need  to
+       adjust  any  of  the  context  parameters  can pass NULL when a context
+       pointer is required.
+
+       There are three different types of context: a general context  that  is
+       relevant  for  several  PCRE2 operations, a compile-time context, and a
+       match-time context.
+
+   The general context
+
+       At present, this context just  contains  pointers  to  (and  data  for)
+       external  memory  management  functions  that  are  called from several
+       places in the PCRE2 library. The context is named `general' rather than
+       specifically  `memory'  because in future other fields may be added. If
+       you do not want to supply your own custom memory management  functions,
+       you  do not need to bother with a general context. A general context is
+       created by:
+
+       pcre2_general_context *pcre2_general_context_create(
+         void *(*private_malloc)(PCRE2_SIZE, void *),
+         void (*private_free)(void *, void *), void *memory_data);
+
+       The two function pointers specify custom memory  management  functions,
+       whose prototypes are:
+
+         void *private_malloc(PCRE2_SIZE, void *);
+         void  private_free(void *, void *);
+
+       Whenever code in PCRE2 calls these functions, the final argument is the
+       value of memory_data. Either of the first two arguments of the creation
+       function  may be NULL, in which case the system memory management func-
+       tions malloc() and free() are used. (This is not currently  useful,  as
+       there  are  no  other  fields in a general context, but in future there
+       might be.)  The private_malloc() function  is  used  (if  supplied)  to
+       obtain  memory  for storing the context, and all three values are saved
+       as part of the context.
+
+       Whenever PCRE2 creates a data block of any kind, the block  contains  a
+       pointer  to the free() function that matches the malloc() function that
+       was used. When the time comes to  free  the  block,  this  function  is
+       called.
+
+       A general context can be copied by calling:
+
+       pcre2_general_context *pcre2_general_context_copy(
+         pcre2_general_context *gcontext);
+
+       The memory used for a general context should be freed by calling:
+
+       void pcre2_general_context_free(pcre2_general_context *gcontext);
+
+
+   The compile context
+
+       A  compile context is required if you want to change the default values
+       of any of the following compile-time parameters:
+
+         What \R matches (Unicode newlines or CR, LF, CRLF only)
+         PCRE2's character tables
+         The newline character sequence
+         The compile time nested parentheses limit
+         The maximum length of the pattern string
+         An external function for stack checking
+
+       A compile context is also required if you are using custom memory  man-
+       agement.   If  none of these apply, just pass NULL as the context argu-
+       ment of pcre2_compile().
+
+       A compile context is created, copied, and freed by the following  func-
+       tions:
+
+       pcre2_compile_context *pcre2_compile_context_create(
+         pcre2_general_context *gcontext);
+
+       pcre2_compile_context *pcre2_compile_context_copy(
+         pcre2_compile_context *ccontext);
+
+       void pcre2_compile_context_free(pcre2_compile_context *ccontext);
+
+       A  compile  context  is created with default values for its parameters.
+       These can be changed by calling the following functions, which return 0
+       on success, or PCRE2_ERROR_BADDATA if invalid data is detected.
+
+       int pcre2_set_bsr(pcre2_compile_context *ccontext,
+         uint32_t value);
+
+       The  value  must  be PCRE2_BSR_ANYCRLF, to specify that \R matches only
+       CR, LF, or CRLF, or PCRE2_BSR_UNICODE, to specify that \R  matches  any
+       Unicode line ending sequence. The value is used by the JIT compiler and
+       by  the  two  interpreted   matching   functions,   pcre2_match()   and
+       pcre2_dfa_match().
+
+       int pcre2_set_character_tables(pcre2_compile_context *ccontext,
+         const unsigned char *tables);
+
+       The  value  must  be  the result of a call to pcre2_maketables(), whose
+       only argument is a general context. This function builds a set of char-
+       acter tables in the current locale.
+
+       int pcre2_set_max_pattern_length(pcre2_compile_context *ccontext,
+         PCRE2_SIZE value);
+
+       This  sets a maximum length, in code units, for the pattern string that
+       is to be compiled. If the pattern is longer,  an  error  is  generated.
+       This  facility  is  provided  so that applications that accept patterns
+       from external sources can limit their size. The default is the  largest
+       number that a PCRE2_SIZE variable can hold, which is effectively unlim-
+       ited.
+
+       int pcre2_set_newline(pcre2_compile_context *ccontext,
+         uint32_t value);
+
+       This specifies which characters or character sequences are to be recog-
+       nized  as newlines. The value must be one of PCRE2_NEWLINE_CR (carriage
+       return only), PCRE2_NEWLINE_LF (linefeed only), PCRE2_NEWLINE_CRLF (the
+       two-character  sequence  CR followed by LF), PCRE2_NEWLINE_ANYCRLF (any
+       of the above), or PCRE2_NEWLINE_ANY (any Unicode newline sequence).
+
+       When a pattern is compiled with the PCRE2_EXTENDED option, the value of
+       this  parameter  affects  the recognition of white space and the end of
+       internal comments starting with #. The value is saved with the compiled
+       pattern  for  subsequent  use by the JIT compiler and by the two inter-
+       preted matching functions, pcre2_match() and pcre2_dfa_match().
+
+       int pcre2_set_parens_nest_limit(pcre2_compile_context *ccontext,
+         uint32_t value);
+
+       This parameter ajusts the limit, set when PCRE2 is built (default 250),
+       on  the  depth  of  parenthesis  nesting in a pattern. This limit stops
+       rogue patterns using up too much system stack when being compiled.
+
+       int pcre2_set_compile_recursion_guard(pcre2_compile_context *ccontext,
+         int (*guard_function)(uint32_t, void *), void *user_data);
+
+       There is at least one application that runs PCRE2 in threads with  very
+       limited  system  stack,  where running out of stack is to be avoided at
+       all costs. The parenthesis limit above cannot take account of how  much
+       stack  is  actually  available.  For  a finer control, you can supply a
+       function that is called whenever pcre2_compile() starts  to  compile  a
+       parenthesized  part  of  a  pattern. This function can check the actual
+       stack size (or anything else that it wants to, of course).
+
+       The first argument to the callout function gives the current  depth  of
+       nesting,  and  the second is user data that is set up by the last argu-
+       ment  of  pcre2_set_compile_recursion_guard().  The  callout   function
+       should return zero if all is well, or non-zero to force an error.
+
+   The match context
+
+       A match context is required if you want to change the default values of
+       any of the following match-time parameters:
+
+         A callout function
+         The offset limit for matching an unanchored pattern
+         The limit for calling match() (see below)
+         The limit for calling match() recursively
+
+       A match context is also required if you are using custom memory manage-
+       ment.   If  none of these apply, just pass NULL as the context argument
+       of pcre2_match(), pcre2_dfa_match(), or pcre2_jit_match().
+
+       A match context is created, copied, and freed by  the  following  func-
+       tions:
+
+       pcre2_match_context *pcre2_match_context_create(
+         pcre2_general_context *gcontext);
+
+       pcre2_match_context *pcre2_match_context_copy(
+         pcre2_match_context *mcontext);
+
+       void pcre2_match_context_free(pcre2_match_context *mcontext);
+
+       A  match  context  is  created  with default values for its parameters.
+       These can be changed by calling the following functions, which return 0
+       on success, or PCRE2_ERROR_BADDATA if invalid data is detected.
+
+       int pcre2_set_callout(pcre2_match_context *mcontext,
+         int (*callout_function)(pcre2_callout_block *, void *),
+         void *callout_data);
+
+       This  sets  up a "callout" function, which PCRE2 will call at specified
+       points during a matching operation. Details are given in the pcre2call-
+       out documentation.
+
+       int pcre2_set_offset_limit(pcre2_match_context *mcontext,
+         PCRE2_SIZE value);
+
+       The  offset_limit  parameter  limits  how  far an unanchored search can
+       advance in the subject string. The default value  is  PCRE2_UNSET.  The
+       pcre2_match()      and      pcre2_dfa_match()      functions     return
+       PCRE2_ERROR_NOMATCH if a match with a starting point before or  at  the
+       given offset is not found. For example, if the pattern /abc/ is matched
+       against "123abc" with an offset  limit  less  than  3,  the  result  is
+       PCRE2_ERROR_NO_MATCH.   A  match  can never be found if the startoffset
+       argument of pcre2_match() or pcre2_dfa_match() is greater than the off-
+       set limit.
+
+       When  using  this  facility,  you  must set PCRE2_USE_OFFSET_LIMIT when
+       calling pcre2_compile() so that when JIT is in use, different code  can
+       be  compiled. If a match is started with a non-default match limit when
+       PCRE2_USE_OFFSET_LIMIT is not set, an error is generated.
+
+       The offset limit facility can be used to track progress when  searching
+       large  subject  strings.  See  also  the  PCRE2_FIRSTLINE option, which
+       requires a match to start within the first line of the subject. If this
+       is  set  with an offset limit, a match must occur in the first line and
+       also within the offset limit.  In other words,  whichever  limit  comes
+       first is used.
+
+       int pcre2_set_match_limit(pcre2_match_context *mcontext,
+         uint32_t value);
+
+       The  match_limit  parameter  provides  a means of preventing PCRE2 from
+       using up too many resources when processing patterns that are not going
+       to  match, but which have a very large number of possibilities in their
+       search trees. The classic example is a pattern that uses nested  unlim-
+       ited repeats.
+
+       Internally,  pcre2_match()  uses  a  function  called match(), which it
+       calls repeatedly (sometimes recursively). The limit set by  match_limit
+       is  imposed  on  the  number  of times this function is called during a
+       match, which has the effect of limiting the amount of backtracking that
+       can  take place. For patterns that are not anchored, the count restarts
+       from zero for each position in the subject string. This  limit  is  not
+       relevant to pcre2_dfa_match(), which ignores it.
+
+       When  pcre2_match() is called with a pattern that was successfully pro-
+       cessed by pcre2_jit_compile(), the way in which matching is executed is
+       entirely  different. However, there is still the possibility of runaway
+       matching that goes on for a very long  time,  and  so  the  match_limit
+       value  is  also used in this case (but in a different way) to limit how
+       long the matching can continue.
+
+       The default value for the limit can be set when  PCRE2  is  built;  the
+       default  default  is 10 million, which handles all but the most extreme
+       cases.   If   the   limit   is    exceeded,    pcre2_match()    returns
+       PCRE2_ERROR_MATCHLIMIT.  A  value  for the match limit may also be sup-
+       plied by an item at the start of a pattern of the form
+
+         (*LIMIT_MATCH=ddd)
+
+       where ddd is a decimal number.  However,  such  a  setting  is  ignored
+       unless  ddd  is  less than the limit set by the caller of pcre2_match()
+       or, if no such limit is set, less than the default.
+
+       int pcre2_set_recursion_limit(pcre2_match_context *mcontext,
+         uint32_t value);
+
+       The recursion_limit parameter is similar to match_limit, but instead of
+       limiting  the  total  number of times that match() is called, it limits
+       the depth of recursion. The recursion depth is a  smaller  number  than
+       the  total number of calls, because not all calls to match() are recur-
+       sive.  This limit is of use only if it is set smaller than match_limit.
+
+       Limiting the recursion depth limits the amount of system stack that can
+       be  used,  or,  when  PCRE2 has been compiled to use memory on the heap
+       instead of the stack, the amount of heap memory that can be used.  This
+       limit  is not relevant, and is ignored, when matching is done using JIT
+       compiled code or by the pcre2_dfa_match() function.
+
+       The default value for recursion_limit can be set when PCRE2  is  built;
+       the  default  default is the same value as the default for match_limit.
+       If the limit is exceeded, pcre2_match() returns  PCRE2_ERROR_RECURSION-
+       LIMIT.  A value for the recursion limit may also be supplied by an item
+       at the start of a pattern of the form
+
+         (*LIMIT_RECURSION=ddd)
+
+       where ddd is a decimal number.  However,  such  a  setting  is  ignored
+       unless  ddd  is  less than the limit set by the caller of pcre2_match()
+       or, if no such limit is set, less than the default.
+
+       int pcre2_set_recursion_memory_management(
+         pcre2_match_context *mcontext,
+         void *(*private_malloc)(PCRE2_SIZE, void *),
+         void (*private_free)(void *, void *), void *memory_data);
+
+       This function sets up two additional custom memory management functions
+       for  use  by  pcre2_match()  when PCRE2 is compiled to use the heap for
+       remembering backtracking data, instead of recursive function calls that
+       use  the  system stack. There is a discussion about PCRE2's stack usage
+       in the pcre2stack documentation. See the pcre2build  documentation  for
+       details of how to build PCRE2.
+
+       Using  the  heap for recursion is a non-standard way of building PCRE2,
+       for use in environments  that  have  limited  stacks.  Because  of  the
+       greater use of memory management, pcre2_match() runs more slowly. Func-
+       tions that are different to the general  custom  memory  functions  are
+       provided  so  that  special-purpose  external code can be used for this
+       case, because the memory blocks are all the same size. The  blocks  are
+       retained by pcre2_match() until it is about to exit so that they can be
+       re-used when possible during the match. In the absence of  these  func-
+       tions,  the normal custom memory management functions are used, if sup-
+       plied, otherwise the system functions.
+
+
+CHECKING BUILD-TIME OPTIONS
+
+       int pcre2_config(uint32_t what, void *where);
+
+       The function pcre2_config() makes it possible for  a  PCRE2  client  to
+       discover  which  optional  features  have  been compiled into the PCRE2
+       library. The pcre2build documentation  has  more  details  about  these
+       optional features.
+
+       The  first  argument  for pcre2_config() specifies which information is
+       required. The second argument is a pointer to  memory  into  which  the
+       information  is  placed.  If  NULL  is passed, the function returns the
+       amount of memory that is needed  for  the  requested  information.  For
+       calls  that  return  numerical  values,  the  value  is  in bytes; when
+       requesting these values, where should point  to  appropriately  aligned
+       memory.  For calls that return strings, the required length is given in
+       code units, not counting the terminating zero.
+
+       When requesting information, the returned value from pcre2_config()  is
+       non-negative  on success, or the negative error code PCRE2_ERROR_BADOP-
+       TION if the value in the first argument is not recognized. The  follow-
+       ing information is available:
+
+         PCRE2_CONFIG_BSR
+
+       The  output  is a uint32_t integer whose value indicates what character
+       sequences the \R  escape  sequence  matches  by  default.  A  value  of
+       PCRE2_BSR_UNICODE  means  that  \R  matches  any  Unicode  line  ending
+       sequence; a value of PCRE2_BSR_ANYCRLF means that \R matches  only  CR,
+       LF, or CRLF. The default can be overridden when a pattern is compiled.
+
+         PCRE2_CONFIG_JIT
+
+       The  output  is  a  uint32_t  integer that is set to one if support for
+       just-in-time compiling is available; otherwise it is set to zero.
+
+         PCRE2_CONFIG_JITTARGET
+
+       The where argument should point to a buffer that is at  least  48  code
+       units  long.  (The  exact  length  required  can  be  found  by calling
+       pcre2_config() with where set to NULL.) The buffer  is  filled  with  a
+       string  that  contains  the  name of the architecture for which the JIT
+       compiler is  configured,  for  example  "x86  32bit  (little  endian  +
+       unaligned)".  If JIT support is not available, PCRE2_ERROR_BADOPTION is
+       returned, otherwise the number of code units used is returned. This  is
+       the length of the string, plus one unit for the terminating zero.
+
+         PCRE2_CONFIG_LINKSIZE
+
+       The output is a uint32_t integer that contains the number of bytes used
+       for internal linkage in compiled regular  expressions.  When  PCRE2  is
+       configured,  the value can be set to 2, 3, or 4, with the default being
+       2. This is the value that is returned by pcre2_config(). However,  when
+       the  16-bit  library  is compiled, a value of 3 is rounded up to 4, and
+       when the 32-bit library is compiled, internal  linkages  always  use  4
+       bytes, so the configured value is not relevant.
+
+       The default value of 2 for the 8-bit and 16-bit libraries is sufficient
+       for all but the most massive patterns, since it allows the size of  the
+       compiled pattern to be up to 64K code units. Larger values allow larger
+       regular expressions to be compiled by those two libraries, but  at  the
+       expense of slower matching.
+
+         PCRE2_CONFIG_MATCHLIMIT
+
+       The  output  is a uint32_t integer that gives the default limit for the
+       number of internal matching function calls in  a  pcre2_match()  execu-
+       tion. Further details are given with pcre2_match() below.
+
+         PCRE2_CONFIG_NEWLINE
+
+       The  output  is  a  uint32_t  integer whose value specifies the default
+       character sequence that is recognized as meaning "newline". The  values
+       are:
+
+         PCRE2_NEWLINE_CR       Carriage return (CR)
+         PCRE2_NEWLINE_LF       Linefeed (LF)
+         PCRE2_NEWLINE_CRLF     Carriage return, linefeed (CRLF)
+         PCRE2_NEWLINE_ANY      Any Unicode line ending
+         PCRE2_NEWLINE_ANYCRLF  Any of CR, LF, or CRLF
+
+       The  default  should  normally  correspond to the standard sequence for
+       your operating system.
+
+         PCRE2_CONFIG_PARENSLIMIT
+
+       The output is a uint32_t integer that gives the maximum depth of  nest-
+       ing of parentheses (of any kind) in a pattern. This limit is imposed to
+       cap the amount of system stack used when a pattern is compiled.  It  is
+       specified  when PCRE2 is built; the default is 250. This limit does not
+       take into account the stack that may already be  used  by  the  calling
+       application.  For  finer  control  over  compilation  stack  usage, see
+       pcre2_set_compile_recursion_guard().
+
+         PCRE2_CONFIG_RECURSIONLIMIT
+
+       The output is a uint32_t integer that gives the default limit  for  the
+       depth  of  recursion  when  calling the internal matching function in a
+       pcre2_match() execution. Further details are given  with  pcre2_match()
+       below.
+
+         PCRE2_CONFIG_STACKRECURSE
+
+       The  output is a uint32_t integer that is set to one if internal recur-
+       sion when running pcre2_match() is implemented  by  recursive  function
+       calls  that  use  the system stack to remember their state. This is the
+       usual way that PCRE2 is compiled. The output is zero if PCRE2 was  com-
+       piled  to  use blocks of data on the heap instead of recursive function
+       calls.
+
+         PCRE2_CONFIG_UNICODE_VERSION
+
+       The where argument should point to a buffer that is at  least  24  code
+       units  long.  (The  exact  length  required  can  be  found  by calling
+       pcre2_config() with where set to NULL.)  If  PCRE2  has  been  compiled
+       without  Unicode  support,  the buffer is filled with the text "Unicode
+       not supported". Otherwise, the Unicode  version  string  (for  example,
+       "8.0.0")  is  inserted. The number of code units used is returned. This
+       is the length of the string plus one unit for the terminating zero.
+
+         PCRE2_CONFIG_UNICODE
+
+       The output is a uint32_t integer that is set to one if Unicode  support
+       is  available; otherwise it is set to zero. Unicode support implies UTF
+       support.
+
+         PCRE2_CONFIG_VERSION
+
+       The where argument should point to a buffer that is at  least  12  code
+       units  long.  (The  exact  length  required  can  be  found  by calling
+       pcre2_config() with where set to NULL.) The buffer is filled  with  the
+       PCRE2 version string, zero-terminated. The number of code units used is
+       returned. This is the length of the string plus one unit for the termi-
+       nating zero.
+
+
+COMPILING A PATTERN
+
+       pcre2_code *pcre2_compile(PCRE2_SPTR pattern, PCRE2_SIZE length,
+         uint32_t options, int *errorcode, PCRE2_SIZE *erroroffset,
+         pcre2_compile_context *ccontext);
+
+       void pcre2_code_free(pcre2_code *code);
+
+       The  pcre2_compile() function compiles a pattern into an internal form.
+       The pattern is defined by a pointer to a string of  code  units  and  a
+       length,  If the pattern is zero-terminated, the length can be specified
+       as PCRE2_ZERO_TERMINATED. The function returns a pointer to a block  of
+       memory  that contains the compiled pattern and related data. The caller
+       must free the memory by calling pcre2_code_free() when it is no  longer
+       needed.
+
+       NOTE:  When  one  of  the matching functions is called, pointers to the
+       compiled pattern and the subject string are set in the match data block
+       so  that they can be referenced by the extraction functions. After run-
+       ning a match, you must not  free  a  compiled  pattern  (or  a  subject
+       string)  until  after all operations on the match data block have taken
+       place.
+
+       If the compile context argument ccontext is NULL, memory for  the  com-
+       piled  pattern  is  obtained  by  calling  malloc().  Otherwise,  it is
+       obtained from the same memory function that was used  for  the  compile
+       context.
+
+       The options argument contains various bit settings that affect the com-
+       pilation. It should be zero if no options are required.  The  available
+       options  are  described  below. Some of them (in particular, those that
+       are compatible with Perl, but some others as well) can also be set  and
+       unset  from  within  the  pattern  (see the detailed description in the
+       pcre2pattern documentation).
+
+       For those options that can be different in different parts of the  pat-
+       tern,  the contents of the options argument specifies their settings at
+       the start of compilation.  The  PCRE2_ANCHORED  and  PCRE2_NO_UTF_CHECK
+       options can be set at the time of matching as well as at compile time.
+
+       Other,  less  frequently required compile-time parameters (for example,
+       the newline setting) can be provided in a compile context (as described
+       above).
+
+       If errorcode or erroroffset is NULL, pcre2_compile() returns NULL imme-
+       diately. Otherwise, if compilation of a pattern fails,  pcre2_compile()
+       returns NULL, having set these variables to an error code and an offset
+       (number  of  code  units)  within  the   pattern,   respectively.   The
+       pcre2_get_error_message()  function provides a textual message for each
+       error code. Compilation errors are positive numbers, but UTF formatting
+       errors are negative numbers. For an invalid UTF-8 or UTF-16 string, the
+       offset is that of the first code unit of the failing character.
+
+       Some errors are not detected until the whole pattern has been  scanned;
+       in  these  cases,  the offset passed back is the length of the pattern.
+       Note that the offset is in code units, not characters, even  in  a  UTF
+       mode. It may sometimes point into the middle of a UTF-8 or UTF-16 char-
+       acter.
+
+       This code fragment shows a typical straightforward call  to  pcre2_com-
+       pile():
+
+         pcre2_code *re;
+         PCRE2_SIZE erroffset;
+         int errorcode;
+         re = pcre2_compile(
+           "^A.*Z",                /* the pattern */
+           PCRE2_ZERO_TERMINATED,  /* the pattern is zero-terminated */
+           0,                      /* default options */
+           &errorcode,             /* for error code */
+           &erroffset,             /* for error offset */
+           NULL);                  /* no compile context */
+
+       The  following  names for option bits are defined in the pcre2.h header
+       file:
+
+         PCRE2_ANCHORED
+
+       If this bit is set, the pattern is forced to be "anchored", that is, it
+       is  constrained to match only at the first matching point in the string
+       that is being searched (the "subject string"). This effect can also  be
+       achieved  by appropriate constructs in the pattern itself, which is the
+       only way to do it in Perl.
+
+         PCRE2_ALLOW_EMPTY_CLASS
+
+       By default, for compatibility with Perl, a closing square bracket  that
+       immediately  follows  an opening one is treated as a data character for
+       the class. When  PCRE2_ALLOW_EMPTY_CLASS  is  set,  it  terminates  the
+       class, which therefore contains no characters and so can never match.
+
+         PCRE2_ALT_BSUX
+
+       This  option  request  alternative  handling of three escape sequences,
+       which makes PCRE2's behaviour more like  ECMAscript  (aka  JavaScript).
+       When it is set:
+
+       (1) \U matches an upper case "U" character; by default \U causes a com-
+       pile time error (Perl uses \U to upper case subsequent characters).
+
+       (2) \u matches a lower case "u" character unless it is followed by four
+       hexadecimal  digits,  in  which case the hexadecimal number defines the
+       code point to match. By default, \u causes a compile time  error  (Perl
+       uses it to upper case the following character).
+
+       (3)  \x matches a lower case "x" character unless it is followed by two
+       hexadecimal digits, in which case the hexadecimal  number  defines  the
+       code  point  to  match. By default, as in Perl, a hexadecimal number is
+       always expected after \x, but it may have zero, one, or two digits (so,
+       for example, \xz matches a binary zero character followed by z).
+
+         PCRE2_ALT_CIRCUMFLEX
+
+       In  multiline  mode  (when  PCRE2_MULTILINE  is  set),  the  circumflex
+       metacharacter matches at the start of the subject (unless  PCRE2_NOTBOL
+       is  set),  and  also  after  any internal newline. However, it does not
+       match after a newline at the end of the subject, for compatibility with
+       Perl.  If  you want a multiline circumflex also to match after a termi-
+       nating newline, you must set PCRE2_ALT_CIRCUMFLEX.
+
+         PCRE2_ALT_VERBNAMES
+
+       By default, for compatibility with Perl, the name in any verb  sequence
+       such  as  (*MARK:NAME)  is  any  sequence  of  characters that does not
+       include a closing parenthesis. The name is not processed  in  any  way,
+       and  it  is  not possible to include a closing parenthesis in the name.
+       However, if the PCRE2_ALT_VERBNAMES option  is  set,  normal  backslash
+       processing  is  applied  to  verb  names  and only an unescaped closing
+       parenthesis terminates the name. A closing parenthesis can be  included
+       in  a  name  either  as  \) or between \Q and \E. If the PCRE2_EXTENDED
+       option is set, unescaped whitespace in verb names is skipped and #-com-
+       ments are recognized, exactly as in the rest of the pattern.
+
+         PCRE2_AUTO_CALLOUT
+
+       If  this  bit  is  set,  pcre2_compile()  automatically inserts callout
+       items, all with number 255, before each pattern item. For discussion of
+       the callout facility, see the pcre2callout documentation.
+
+         PCRE2_CASELESS
+
+       If  this  bit is set, letters in the pattern match both upper and lower
+       case letters in the subject. It is equivalent to Perl's /i option,  and
+       it can be changed within a pattern by a (?i) option setting.
+
+         PCRE2_DOLLAR_ENDONLY
+
+       If  this bit is set, a dollar metacharacter in the pattern matches only
+       at the end of the subject string. Without this option,  a  dollar  also
+       matches  immediately before a newline at the end of the string (but not
+       before any other newlines). The PCRE2_DOLLAR_ENDONLY option is  ignored
+       if  PCRE2_MULTILINE  is  set.  There is no equivalent to this option in
+       Perl, and no way to set it within a pattern.
+
+         PCRE2_DOTALL
+
+       If this bit is set, a dot metacharacter  in  the  pattern  matches  any
+       character,  including  one  that  indicates a newline. However, it only
+       ever matches one character, even if newlines are coded as CRLF. Without
+       this option, a dot does not match when the current position in the sub-
+       ject is at a newline. This option is equivalent to  Perl's  /s  option,
+       and it can be changed within a pattern by a (?s) option setting. A neg-
+       ative class such as [^a] always matches newline characters, independent
+       of the setting of this option.
+
+         PCRE2_DUPNAMES
+
+       If  this  bit is set, names used to identify capturing subpatterns need
+       not be unique. This can be helpful for certain types of pattern when it
+       is  known  that  only  one instance of the named subpattern can ever be
+       matched. There are more details of named subpatterns  below;  see  also
+       the pcre2pattern documentation.
+
+         PCRE2_EXTENDED
+
+       If  this  bit  is  set,  most white space characters in the pattern are
+       totally ignored except when escaped or inside a character  class.  How-
+       ever,  white  space  is  not  allowed within sequences such as (?> that
+       introduce various parenthesized subpatterns, nor within numerical quan-
+       tifiers  such  as {1,3}.  Ignorable white space is permitted between an
+       item and a following quantifier and between a quantifier and a  follow-
+       ing + that indicates possessiveness.
+
+       PCRE2_EXTENDED  also causes characters between an unescaped # outside a
+       character class and the next newline, inclusive, to be  ignored,  which
+       makes it possible to include comments inside complicated patterns. Note
+       that the end of this type of comment is a literal newline  sequence  in
+       the pattern; escape sequences that happen to represent a newline do not
+       count. PCRE2_EXTENDED is equivalent to Perl's /x option, and it can  be
+       changed within a pattern by a (?x) option setting.
+
+       Which characters are interpreted as newlines can be specified by a set-
+       ting in the compile context that is passed to pcre2_compile() or  by  a
+       special  sequence at the start of the pattern, as described in the sec-
+       tion entitled "Newline conventions" in the pcre2pattern  documentation.
+       A default is defined when PCRE2 is built.
+
+         PCRE2_FIRSTLINE
+
+       If  this  option  is  set,  an  unanchored pattern is required to match
+       before or at the first  newline  in  the  subject  string,  though  the
+       matched  text  may  continue  over the newline. See also PCRE2_USE_OFF-
+       SET_LIMIT,  which  provides  a  more  general  limiting  facility.   If
+       PCRE2_FIRSTLINE  is set with an offset limit, a match must occur in the
+       first line and also within the offset limit. In other words,  whichever
+       limit comes first is used.
+
+         PCRE2_MATCH_UNSET_BACKREF
+
+       If  this  option  is set, a back reference to an unset subpattern group
+       matches an empty string (by default this causes  the  current  matching
+       alternative  to  fail).   A  pattern such as (\1)(a) succeeds when this
+       option is set (assuming it can find an "a" in the subject), whereas  it
+       fails  by  default,  for  Perl compatibility. Setting this option makes
+       PCRE2 behave more like ECMAscript (aka JavaScript).
+
+         PCRE2_MULTILINE
+
+       By default, for the purposes of matching "start of line"  and  "end  of
+       line",  PCRE2  treats the subject string as consisting of a single line
+       of characters, even if it actually contains  newlines.  The  "start  of
+       line"  metacharacter  (^)  matches only at the start of the string, and
+       the "end of line" metacharacter ($) matches only  at  the  end  of  the
+       string,  or  before  a  terminating  newline  (except  when  PCRE2_DOL-
+       LAR_ENDONLY is set). Note, however, that unless  PCRE2_DOTALL  is  set,
+       the "any character" metacharacter (.) does not match at a newline. This
+       behaviour (for ^, $, and dot) is the same as Perl.
+
+       When PCRE2_MULTILINE it is set, the "start of line" and "end  of  line"
+       constructs  match  immediately following or immediately before internal
+       newlines in the subject string, respectively, as well as  at  the  very
+       start  and  end.  This is equivalent to Perl's /m option, and it can be
+       changed within a pattern by a (?m) option setting. Note that the "start
+       of line" metacharacter does not match after a newline at the end of the
+       subject, for compatibility with Perl.  However, you can change this  by
+       setting  the PCRE2_ALT_CIRCUMFLEX option. If there are no newlines in a
+       subject string, or no occurrences of ^  or  $  in  a  pattern,  setting
+       PCRE2_MULTILINE has no effect.
+
+         PCRE2_NEVER_BACKSLASH_C
+
+       This  option  locks out the use of \C in the pattern that is being com-
+       piled.  This escape can  cause  unpredictable  behaviour  in  UTF-8  or
+       UTF-16  modes,  because  it may leave the current matching point in the
+       middle of a multi-code-unit character. This option  may  be  useful  in
+       applications  that  process  patterns  from external sources. Note that
+       there is also a build-time option that permanently locks out the use of
+       \C.
+
+         PCRE2_NEVER_UCP
+
+       This  option  locks  out the use of Unicode properties for handling \B,
+       \b, \D, \d, \S, \s, \W, \w, and some of the POSIX character classes, as
+       described  for  the  PCRE2_UCP option below. In particular, it prevents
+       the creator of the pattern from enabling this facility by starting  the
+       pattern  with  (*UCP).  This  option may be useful in applications that
+       process patterns from external sources. The option combination PCRE_UCP
+       and PCRE_NEVER_UCP causes an error.
+
+         PCRE2_NEVER_UTF
+
+       This  option  locks out interpretation of the pattern as UTF-8, UTF-16,
+       or UTF-32, depending on which library is in use. In particular, it pre-
+       vents  the  creator of the pattern from switching to UTF interpretation
+       by starting the pattern with (*UTF).  This  option  may  be  useful  in
+       applications  that process patterns from external sources. The combina-
+       tion of PCRE2_UTF and PCRE2_NEVER_UTF causes an error.
+
+         PCRE2_NO_AUTO_CAPTURE
+
+       If this option is set, it disables the use of numbered capturing paren-
+       theses  in the pattern. Any opening parenthesis that is not followed by
+       ? behaves as if it were followed by ?: but named parentheses can  still
+       be  used  for  capturing  (and  they acquire numbers in the usual way).
+       There is no equivalent of this option in Perl.
+
+         PCRE2_NO_AUTO_POSSESS
+
+       If this option is set, it disables "auto-possessification", which is an
+       optimization  that,  for example, turns a+b into a++b in order to avoid
+       backtracks into a+ that can never be successful. However,  if  callouts
+       are  in  use,  auto-possessification means that some callouts are never
+       taken. You can set this option if you want the matching functions to do
+       a  full  unoptimized  search and run all the callouts, but it is mainly
+       provided for testing purposes.
+
+         PCRE2_NO_DOTSTAR_ANCHOR
+
+       If this option is set, it disables an optimization that is applied when
+       .*  is  the  first significant item in a top-level branch of a pattern,
+       and all the other branches also start with .* or with \A or  \G  or  ^.
+       The  optimization  is  automatically disabled for .* if it is inside an
+       atomic group or a capturing group that is the subject of a back  refer-
+       ence,  or  if  the pattern contains (*PRUNE) or (*SKIP). When the opti-
+       mization is not disabled, such a pattern is automatically  anchored  if
+       PCRE2_DOTALL is set for all the .* items and PCRE2_MULTILINE is not set
+       for any ^ items. Otherwise, the fact that any match must  start  either
+       at  the start of the subject or following a newline is remembered. Like
+       other optimizations, this can cause callouts to be skipped.
+
+         PCRE2_NO_START_OPTIMIZE
+
+       This is an option whose main effect is at matching time.  It  does  not
+       change what pcre2_compile() generates, but it does affect the output of
+       the JIT compiler.
+
+       There are a number of optimizations that may occur at the  start  of  a
+       match,  in  order  to speed up the process. For example, if it is known
+       that an unanchored match must start  with  a  specific  character,  the
+       matching  code searches the subject for that character, and fails imme-
+       diately if it cannot find it, without actually running the main  match-
+       ing  function.  This means that a special item such as (*COMMIT) at the
+       start of a pattern is not considered until after  a  suitable  starting
+       point  for  the  match  has  been found. Also, when callouts or (*MARK)
+       items are in use, these "start-up" optimizations can cause them  to  be
+       skipped  if  the pattern is never actually used. The start-up optimiza-
+       tions are in effect a pre-scan of the subject that takes  place  before
+       the pattern is run.
+
+       The PCRE2_NO_START_OPTIMIZE option disables the start-up optimizations,
+       possibly causing performance to suffer,  but  ensuring  that  in  cases
+       where  the  result is "no match", the callouts do occur, and that items
+       such as (*COMMIT) and (*MARK) are considered at every possible starting
+       position in the subject string.
+
+       Setting  PCRE2_NO_START_OPTIMIZE  may  change the outcome of a matching
+       operation.  Consider the pattern
+
+         (*COMMIT)ABC
+
+       When this is compiled, PCRE2 records the fact that a match  must  start
+       with  the  character  "A".  Suppose the subject string is "DEFABC". The
+       start-up optimization scans along the subject, finds "A" and  runs  the
+       first  match attempt from there. The (*COMMIT) item means that the pat-
+       tern must match the current starting position, which in this  case,  it
+       does.  However,  if  the same match is run with PCRE2_NO_START_OPTIMIZE
+       set, the initial scan along the subject string  does  not  happen.  The
+       first  match  attempt  is  run  starting  from "D" and when this fails,
+       (*COMMIT) prevents any further matches  being  tried,  so  the  overall
+       result is "no match". There are also other start-up optimizations.  For
+       example, a minimum length for the subject may be recorded. Consider the
+       pattern
+
+         (*MARK:A)(X|Y)
+
+       The  minimum  length  for  a  match is one character. If the subject is
+       "ABC", there will be attempts to match "ABC", "BC", and "C". An attempt
+       to match an empty string at the end of the subject does not take place,
+       because PCRE2 knows that the subject is  now  too  short,  and  so  the
+       (*MARK)  is  never encountered. In this case, the optimization does not
+       affect the overall match result, which is still "no match", but it does
+       affect the auxiliary information that is returned.
+
+         PCRE2_NO_UTF_CHECK
+
+       When  PCRE2_UTF  is set, the validity of the pattern as a UTF string is
+       automatically checked. There are  discussions  about  the  validity  of
+       UTF-8  strings,  UTF-16 strings, and UTF-32 strings in the pcre2unicode
+       document.  If an invalid UTF sequence is found, pcre2_compile() returns
+       a negative error code.
+
+       If you know that your pattern is valid, and you want to skip this check
+       for performance reasons, you can  set  the  PCRE2_NO_UTF_CHECK  option.
+       When  it  is set, the effect of passing an invalid UTF string as a pat-
+       tern is undefined. It may cause your program to  crash  or  loop.  Note
+       that   this   option   can   also   be   passed  to  pcre2_match()  and
+       pcre_dfa_match(), to suppress validity checking of the subject string.
+
+         PCRE2_UCP
+
+       This option changes the way PCRE2 processes \B, \b, \D, \d, \S, \s, \W,
+       \w,  and  some  of  the POSIX character classes. By default, only ASCII
+       characters are recognized, but if PCRE2_UCP is set, Unicode  properties
+       are  used instead to classify characters. More details are given in the
+       section on generic character types in the pcre2pattern page. If you set
+       PCRE2_UCP,  matching one of the items it affects takes much longer. The
+       option is available only if PCRE2 has been compiled with  Unicode  sup-
+       port.
+
+         PCRE2_UNGREEDY
+
+       This  option  inverts  the "greediness" of the quantifiers so that they
+       are not greedy by default, but become greedy if followed by "?". It  is
+       not  compatible  with Perl. It can also be set by a (?U) option setting
+       within the pattern.
+
+         PCRE2_USE_OFFSET_LIMIT
+
+       This option must be set for pcre2_compile() if pcre2_set_offset_limit()
+       is  going  to be used to set a non-default offset limit in a match con-
+       text for matches that use this pattern. An error  is  generated  if  an
+       offset  limit  is  set  without  this option. For more details, see the
+       description of pcre2_set_offset_limit() in the section  that  describes
+       match contexts. See also the PCRE2_FIRSTLINE option above.
+
+         PCRE2_UTF
+
+       This  option  causes  PCRE2  to regard both the pattern and the subject
+       strings that are subsequently processed as strings  of  UTF  characters
+       instead  of  single-code-unit  strings.  It  is available when PCRE2 is
+       built to include Unicode support (which is  the  default).  If  Unicode
+       support  is  not  available,  the use of this option provokes an error.
+       Details of how this option changes the behaviour of PCRE2 are given  in
+       the pcre2unicode page.
+
+
+COMPILATION ERROR CODES
+
+       There  are over 80 positive error codes that pcre2_compile() may return
+       if it finds an error in the pattern. There are also some negative error
+       codes  that  are  used  for  invalid UTF strings. These are the same as
+       given by pcre2_match() and pcre2_dfa_match(), and are described in  the
+       pcre2unicode page. The pcre2_get_error_message() function can be called
+       to obtain a textual error message from any error code.
+
+
+JUST-IN-TIME (JIT) COMPILATION
+
+       int pcre2_jit_compile(pcre2_code *code, uint32_t options);
+
+       int pcre2_jit_match(const pcre2_code *code, PCRE2_SPTR subject,
+         PCRE2_SIZE length, PCRE2_SIZE startoffset,
+         uint32_t options, pcre2_match_data *match_data,
+         pcre2_match_context *mcontext);
+
+       void pcre2_jit_free_unused_memory(pcre2_general_context *gcontext);
+
+       pcre2_jit_stack *pcre2_jit_stack_create(PCRE2_SIZE startsize,
+         PCRE2_SIZE maxsize, pcre2_general_context *gcontext);
+
+       void pcre2_jit_stack_assign(pcre2_match_context *mcontext,
+         pcre2_jit_callback callback_function, void *callback_data);
+
+       void pcre2_jit_stack_free(pcre2_jit_stack *jit_stack);
+
+       These functions provide support for  JIT  compilation,  which,  if  the
+       just-in-time  compiler  is available, further processes a compiled pat-
+       tern into machine code that executes much faster than the pcre2_match()
+       interpretive  matching function. Full details are given in the pcre2jit
+       documentation.
+
+       JIT compilation is a heavyweight optimization. It can  take  some  time
+       for  patterns  to  be analyzed, and for one-off matches and simple pat-
+       terns the benefit of faster execution might be offset by a much  slower
+       compilation  time.   Most, but not all patterns can be optimized by the
+       JIT compiler.
+
+
+LOCALE SUPPORT
+
+       PCRE2 handles caseless matching, and determines whether characters  are
+       letters,  digits, or whatever, by reference to a set of tables, indexed
+       by character code point. This applies only  to  characters  whose  code
+       points  are  less than 256. By default, higher-valued code points never
+       match escapes such as \w or \d.  However, if PCRE2 is  built  with  UTF
+       support,  all  characters  can  be  tested with \p and \P, or, alterna-
+       tively, the PCRE2_UCP option can be set when  a  pattern  is  compiled;
+       this  causes  \w and friends to use Unicode property support instead of
+       the built-in tables.
+
+       The use of locales with Unicode is discouraged.  If  you  are  handling
+       characters  with  code  points  greater than 128, you should either use
+       Unicode support, or use locales, but not try to mix the two.
+
+       PCRE2 contains an internal set of character tables  that  are  used  by
+       default.   These  are  sufficient  for many applications. Normally, the
+       internal tables recognize only ASCII characters. However, when PCRE2 is
+       built, it is possible to cause the internal tables to be rebuilt in the
+       default "C" locale of the local system, which may cause them to be dif-
+       ferent.
+
+       The  internal tables can be overridden by tables supplied by the appli-
+       cation that calls PCRE2. These may be created  in  a  different  locale
+       from  the  default.  As more and more applications change to using Uni-
+       code, the need for this locale support is expected to die away.
+
+       External tables are built by calling the  pcre2_maketables()  function,
+       in  the relevant locale. The result can be passed to pcre2_compile() as
+       often  as  necessary,  by  creating  a  compile  context  and   calling
+       pcre2_set_character_tables()  to  set  the  tables pointer therein. For
+       example, to build and use tables that are appropriate  for  the  French
+       locale  (where  accented  characters  with  values greater than 128 are
+       treated as letters), the following code could be used:
+
+         setlocale(LC_CTYPE, "fr_FR");
+         tables = pcre2_maketables(NULL);
+         ccontext = pcre2_compile_context_create(NULL);
+         pcre2_set_character_tables(ccontext, tables);
+         re = pcre2_compile(..., ccontext);
+
+       The locale name "fr_FR" is used on Linux and other  Unix-like  systems;
+       if  you  are using Windows, the name for the French locale is "french".
+       It is the caller's responsibility to ensure that the memory  containing
+       the tables remains available for as long as it is needed.
+
+       The pointer that is passed (via the compile context) to pcre2_compile()
+       is saved with the compiled pattern, and the same  tables  are  used  by
+       pcre2_match()  and pcre_dfa_match(). Thus, for any single pattern, com-
+       pilation, and matching all happen in the  same  locale,  but  different
+       patterns can be processed in different locales.
+
+
+INFORMATION ABOUT A COMPILED PATTERN
+
+       int pcre2_pattern_info(const pcre2 *code, uint32_t what, void *where);
+
+       The  pcre2_pattern_info()  function returns general information about a
+       compiled pattern. For information about callouts, see the next section.
+       The  first  argument  for pcre2_pattern_info() is a pointer to the com-
+       piled pattern. The second argument specifies which piece of information
+       is  required,  and  the  third  argument  is a pointer to a variable to
+       receive the data. If the third argument is NULL, the first argument  is
+       ignored,  and  the  function  returns the size in bytes of the variable
+       that is required for the information requested. Otherwise, The yield of
+       the function is zero for success, or one of the following negative num-
+       bers:
+
+         PCRE2_ERROR_NULL           the argument code was NULL
+         PCRE2_ERROR_BADMAGIC       the "magic number" was not found
+         PCRE2_ERROR_BADOPTION      the value of what was invalid
+         PCRE2_ERROR_UNSET          the requested field is not set
+
+       The "magic number" is placed at the start of each compiled  pattern  as
+       an  simple check against passing an arbitrary memory pointer. Here is a
+       typical call of pcre2_pattern_info(), to obtain the length of the  com-
+       piled pattern:
+
+         int rc;
+         size_t length;
+         rc = pcre2_pattern_info(
+           re,               /* result of pcre2_compile() */
+           PCRE2_INFO_SIZE,  /* what is required */
+           &length);         /* where to put the data */
+
+       The possible values for the second argument are defined in pcre2.h, and
+       are as follows:
+
+         PCRE2_INFO_ALLOPTIONS
+         PCRE2_INFO_ARGOPTIONS
+
+       Return a copy of the pattern's options. The third argument should point
+       to  a  uint32_t  variable.  PCRE2_INFO_ARGOPTIONS  returns  exactly the
+       options that were passed to pcre2_compile(), whereas  PCRE2_INFO_ALLOP-
+       TIONS  returns  the compile options as modified by any top-level option
+       settings such as (*UTF) at the start of the pattern itself.  For  exam-
+       ple,  if  the  pattern  /(*UTF)abc/ is compiled with the PCRE2_EXTENDED
+       option, the result is PCRE2_EXTENDED and PCRE2_UTF.
+
+       A pattern compiled without PCRE2_ANCHORED is automatically anchored  by
+       PCRE2 if the first significant item in every top-level branch is one of
+       the following:
+
+         ^     unless PCRE2_MULTILINE is set
+         \A    always
+         \G    always
+         .*    sometimes - see below
+
+       When .* is the first significant item, anchoring is possible only  when
+       all the following are true:
+
+         .* is not in an atomic group
+         .* is not in a capturing group that is the subject
+              of a back reference
+         PCRE2_DOTALL is in force for .*
+         Neither (*PRUNE) nor (*SKIP) appears in the pattern.
+         PCRE2_NO_DOTSTAR_ANCHOR is not set.
+
+       For  patterns  that are auto-anchored, the PCRE2_ANCHORED bit is set in
+       the options returned for PCRE2_INFO_ALLOPTIONS.
+
+         PCRE2_INFO_BACKREFMAX
+
+       Return the number of the highest back reference  in  the  pattern.  The
+       third  argument should point to an uint32_t variable. Named subpatterns
+       acquire numbers as well as names, and these count towards  the  highest
+       back  reference.   Back  references such as \4 or \g{12} match the cap-
+       tured characters of the given group, but in addition, the check that  a
+       capturing group is set in a conditional subpattern such as (?(3)a|b) is
+       also a back reference. Zero is returned if there  are  no  back  refer-
+       ences.
+
+         PCRE2_INFO_BSR
+
+       The output is a uint32_t whose value indicates what character sequences
+       the \R escape sequence matches. A value of PCRE2_BSR_UNICODE means that
+       \R  matches any Unicode line ending sequence; a value of PCRE2_BSR_ANY-
+       CRLF means that \R matches only CR, LF, or CRLF.
+
+         PCRE2_INFO_CAPTURECOUNT
+
+       Return the highest capturing subpattern number in the pattern. In  pat-
+       terns where (?| is not used, this is also the total number of capturing
+       subpatterns.  The third argument should point to an uint32_t variable.
+
+         PCRE2_INFO_FIRSTBITMAP
+
+       In the absence of a single first code unit for a non-anchored  pattern,
+       pcre2_compile()  may construct a 256-bit table that defines a fixed set
+       of values for the first code unit in any match. For example, a  pattern
+       that  starts  with  [abc]  results in a table with three bits set. When
+       code unit values greater than 255 are supported, the flag bit  for  255
+       means  "any  code unit of value 255 or above". If such a table was con-
+       structed, a pointer to it is returned. Otherwise NULL is returned.  The
+       third argument should point to an const uint8_t * variable.
+
+         PCRE2_INFO_FIRSTCODETYPE
+
+       Return information about the first code unit of any matched string, for
+       a non-anchored pattern. The third argument should point to an  uint32_t
+       variable.  If there is a fixed first value, for example, the letter "c"
+       from a pattern such as (cat|cow|coyote), 1 is returned, and the charac-
+       ter  value can be retrieved using PCRE2_INFO_FIRSTCODEUNIT. If there is
+       no fixed first value, but it is known that a match can  occur  only  at
+       the  start  of  the subject or following a newline in the subject, 2 is
+       returned. Otherwise, and for anchored patterns, 0 is returned.
+
+         PCRE2_INFO_FIRSTCODEUNIT
+
+       Return the value of the first code unit of any matched  string  in  the
+       situation where PCRE2_INFO_FIRSTCODETYPE returns 1; otherwise return 0.
+       The third argument should point to an uint32_t variable. In  the  8-bit
+       library,  the  value is always less than 256. In the 16-bit library the
+       value can be up to 0xffff. In the 32-bit library  in  UTF-32  mode  the
+       value can be up to 0x10ffff, and up to 0xffffffff when not using UTF-32
+       mode.
+
+         PCRE2_INFO_HASBACKSLASHC
+
+       Return 1 if the pattern contains any instances of \C, otherwise 0.  The
+       third argument should point to an uint32_t variable.
+
+         PCRE2_INFO_HASCRORLF
+
+       Return  1  if  the  pattern  contains any explicit matches for CR or LF
+       characters, otherwise 0. The third argument should point to an uint32_t
+       variable.  An explicit match is either a literal CR or LF character, or
+       \r or \n.
+
+         PCRE2_INFO_JCHANGED
+
+       Return 1 if the (?J) or (?-J) option setting is used  in  the  pattern,
+       otherwise  0.  The third argument should point to an uint32_t variable.
+       (?J) and (?-J) set and unset the local PCRE2_DUPNAMES  option,  respec-
+       tively.
+
+         PCRE2_INFO_JITSIZE
+
+       If  the  compiled  pattern was successfully processed by pcre2_jit_com-
+       pile(), return the size of the  JIT  compiled  code,  otherwise  return
+       zero. The third argument should point to a size_t variable.
+
+         PCRE2_INFO_LASTCODETYPE
+
+       Returns  1 if there is a rightmost literal code unit that must exist in
+       any matched string, other than at its start. The third argument  should
+       point  to  an  uint32_t  variable.  If  there  is  no  such value, 0 is
+       returned. When 1 is  returned,  the  code  unit  value  itself  can  be
+       retrieved  using PCRE2_INFO_LASTCODEUNIT. For anchored patterns, a last
+       literal value is recorded only if  it  follows  something  of  variable
+       length.  For example, for the pattern /^a\d+z\d+/ the returned value is
+       1 (with "z" returned from PCRE2_INFO_LASTCODEUNIT), but  for  /^a\dz\d/
+       the returned value is 0.
+
+         PCRE2_INFO_LASTCODEUNIT
+
+       Return  the value of the rightmost literal data unit that must exist in
+       any matched string, other than at its start, if such a value  has  been
+       recorded.  The  third argument should point to an uint32_t variable. If
+       there is no such value, 0 is returned.
+
+         PCRE2_INFO_MATCHEMPTY
+
+       Return 1 if the pattern might match an empty string, otherwise  0.  The
+       third  argument  should  point  to an uint32_t variable. When a pattern
+       contains recursive subroutine calls it is not always possible to deter-
+       mine  whether  or  not it can match an empty string. PCRE2 takes a cau-
+       tious approach and returns 1 in such cases.
+
+         PCRE2_INFO_MATCHLIMIT
+
+       If the pattern set a match limit by  including  an  item  of  the  form
+       (*LIMIT_MATCH=nnnn)  at  the  start,  the  value is returned. The third
+       argument should point to an unsigned 32-bit integer. If no  such  value
+       has  been  set,  the  call  to  pcre2_pattern_info()  returns the error
+       PCRE2_ERROR_UNSET.
+
+         PCRE2_INFO_MAXLOOKBEHIND
+
+       Return the number of characters (not code units) in the longest lookbe-
+       hind  assertion  in  the pattern. The third argument should point to an
+       unsigned 32-bit integer. This information is useful when  doing  multi-
+       segment  matching  using the partial matching facilities. Note that the
+       simple assertions \b and \B require a one-character lookbehind. \A also
+       registers  a  one-character  lookbehind,  though  it  does not actually
+       inspect the previous character. This is to ensure  that  at  least  one
+       character  from  the old segment is retained when a new segment is pro-
+       cessed. Otherwise, if there are no lookbehinds in the pattern, \A might
+       match incorrectly at the start of a new segment.
+
+         PCRE2_INFO_MINLENGTH
+
+       If  a  minimum  length  for  matching subject strings was computed, its
+       value is returned. Otherwise the returned value is 0. The  value  is  a
+       number  of characters, which in UTF mode may be different from the num-
+       ber of code units.  The third argument  should  point  to  an  uint32_t
+       variable.  The  value  is  a  lower bound to the length of any matching
+       string. There may not be any strings of that length  that  do  actually
+       match, but every string that does match is at least that long.
+
+         PCRE2_INFO_NAMECOUNT
+         PCRE2_INFO_NAMEENTRYSIZE
+         PCRE2_INFO_NAMETABLE
+
+       PCRE2 supports the use of named as well as numbered capturing parenthe-
+       ses. The names are just an additional way of identifying the  parenthe-
+       ses, which still acquire numbers. Several convenience functions such as
+       pcre2_substring_get_byname() are provided for extracting captured  sub-
+       strings  by  name. It is also possible to extract the data directly, by
+       first converting the name to a number in order to  access  the  correct
+       pointers  in the output vector (described with pcre2_match() below). To
+       do the conversion, you need to use the  name-to-number  map,  which  is
+       described by these three values.
+
+       The  map  consists  of a number of fixed-size entries. PCRE2_INFO_NAME-
+       COUNT gives the number of entries, and  PCRE2_INFO_NAMEENTRYSIZE  gives
+       the  size  of each entry in code units; both of these return a uint32_t
+       value. The entry size depends on the length of the longest name.
+
+       PCRE2_INFO_NAMETABLE returns a pointer to the first entry of the table.
+       This  is  a  PCRE2_SPTR  pointer to a block of code units. In the 8-bit
+       library, the first two bytes of each entry are the number of  the  cap-
+       turing parenthesis, most significant byte first. In the 16-bit library,
+       the pointer points to 16-bit code units, the first  of  which  contains
+       the  parenthesis  number.  In the 32-bit library, the pointer points to
+       32-bit code units, the first of which contains the parenthesis  number.
+       The rest of the entry is the corresponding name, zero terminated.
+
+       The  names are in alphabetical order. If (?| is used to create multiple
+       groups with the same number, as described in the section  on  duplicate
+       subpattern  numbers  in  the pcre2pattern page, the groups may be given
+       the same name, but there is only one  entry  in  the  table.  Different
+       names for groups of the same number are not permitted.
+
+       Duplicate  names  for subpatterns with different numbers are permitted,
+       but only if PCRE2_DUPNAMES is set. They appear  in  the  table  in  the
+       order  in  which  they were found in the pattern. In the absence of (?|
+       this is the order of increasing number; when (?| is used  this  is  not
+       necessarily the case because later subpatterns may have lower numbers.
+
+       As  a  simple  example of the name/number table, consider the following
+       pattern after compilation by the 8-bit library  (assume  PCRE2_EXTENDED
+       is set, so white space - including newlines - is ignored):
+
+         (?<date> (?<year>(\d\d)?\d\d) -
+         (?<month>\d\d) - (?<day>\d\d) )
+
+       There  are  four  named subpatterns, so the table has four entries, and
+       each entry in the table is eight bytes long. The table is  as  follows,
+       with non-printing bytes shows in hexadecimal, and undefined bytes shown
+       as ??:
+
+         00 01 d  a  t  e  00 ??
+         00 05 d  a  y  00 ?? ??
+         00 04 m  o  n  t  h  00
+         00 02 y  e  a  r  00 ??
+
+       When writing code to extract data  from  named  subpatterns  using  the
+       name-to-number  map,  remember that the length of the entries is likely
+       to be different for each compiled pattern.
+
+         PCRE2_INFO_NEWLINE
+
+       The output is a uint32_t with one of the following values:
+
+         PCRE2_NEWLINE_CR       Carriage return (CR)
+         PCRE2_NEWLINE_LF       Linefeed (LF)
+         PCRE2_NEWLINE_CRLF     Carriage return, linefeed (CRLF)
+         PCRE2_NEWLINE_ANY      Any Unicode line ending
+         PCRE2_NEWLINE_ANYCRLF  Any of CR, LF, or CRLF
+
+       This specifies the default character sequence that will  be  recognized
+       as meaning "newline" while matching.
+
+         PCRE2_INFO_RECURSIONLIMIT
+
+       If  the  pattern set a recursion limit by including an item of the form
+       (*LIMIT_RECURSION=nnnn) at the start, the value is returned. The  third
+       argument  should  point to an unsigned 32-bit integer. If no such value
+       has been set,  the  call  to  pcre2_pattern_info()  returns  the  error
+       PCRE2_ERROR_UNSET.
+
+         PCRE2_INFO_SIZE
+
+       Return  the  size  of  the  compiled  pattern  in  bytes (for all three
+       libraries). The third argument should point to a size_t variable.  This
+       value  includes  the  size  of the general data block that precedes the
+       code units of the compiled pattern itself. The value that is used  when
+       pcre2_compile()  is  getting memory in which to place the compiled pat-
+       tern may be slightly larger than the value  returned  by  this  option,
+       because  there are cases where the code that calculates the size has to
+       over-estimate. Processing a pattern with  the  JIT  compiler  does  not
+       alter the value returned by this option.
+
+
+INFORMATION ABOUT A PATTERN'S CALLOUTS
+
+       int pcre2_callout_enumerate(const pcre2_code *code,
+         int (*callback)(pcre2_callout_enumerate_block *, void *),
+         void *user_data);
+
+       A script language that supports the use of string arguments in callouts
+       might like to scan all the callouts in a  pattern  before  running  the
+       match. This can be done by calling pcre2_callout_enumerate(). The first
+       argument is a pointer to a compiled pattern, the  second  points  to  a
+       callback  function,  and the third is arbitrary user data. The callback
+       function is called for every callout in the pattern  in  the  order  in
+       which they appear. Its first argument is a pointer to a callout enumer-
+       ation block, and its second argument is the user_data  value  that  was
+       passed  to  pcre2_callout_enumerate(). The contents of the callout enu-
+       meration block are described in the pcre2callout  documentation,  which
+       also gives further details about callouts.
+
+
+SERIALIZATION AND PRECOMPILING
+
+       It  is  possible  to  save  compiled patterns on disc or elsewhere, and
+       reload them later, subject to a number of restrictions.  The  functions
+       whose names begin with pcre2_serialize_ are used for this purpose. They
+       are described in the pcre2serialize documentation.
+
+
+THE MATCH DATA BLOCK
+
+       pcre2_match_data *pcre2_match_data_create(uint32_t ovecsize,
+         pcre2_general_context *gcontext);
+
+       pcre2_match_data *pcre2_match_data_create_from_pattern(
+         const pcre2_code *code, pcre2_general_context *gcontext);
+
+       void pcre2_match_data_free(pcre2_match_data *match_data);
+
+       Information about a successful or unsuccessful match  is  placed  in  a
+       match  data  block,  which  is  an opaque structure that is accessed by
+       function calls. In particular, the match data block contains  a  vector
+       of  offsets into the subject string that define the matched part of the
+       subject and any substrings that were captured.  This  is  know  as  the
+       ovector.
+
+       Before  calling  pcre2_match(), pcre2_dfa_match(), or pcre2_jit_match()
+       you must create a match data block by calling one of the creation func-
+       tions  above.  For pcre2_match_data_create(), the first argument is the
+       number of pairs of offsets in the  ovector.  One  pair  of  offsets  is
+       required  to  identify  the string that matched the whole pattern, with
+       another pair for each captured substring. For example,  a  value  of  4
+       creates  enough space to record the matched portion of the subject plus
+       three captured substrings. A minimum of at least 1 pair is  imposed  by
+       pcre2_match_data_create(), so it is always possible to return the over-
+       all matched string.
+
+       The second argument of pcre2_match_data_create() is a pointer to a gen-
+       eral  context, which can specify custom memory management for obtaining
+       the memory for the match data block. If you are not using custom memory
+       management, pass NULL, which causes malloc() to be used.
+
+       For  pcre2_match_data_create_from_pattern(),  the  first  argument is a
+       pointer to a compiled pattern. The ovector is created to be exactly the
+       right size to hold all the substrings a pattern might capture. The sec-
+       ond argument is again a pointer to a general context, but in this  case
+       if NULL is passed, the memory is obtained using the same allocator that
+       was used for the compiled pattern (custom or default).
+
+       A match data block can be used many times, with the same  or  different
+       compiled  patterns. You can extract information from a match data block
+       after  a  match  operation  has  finished,  using  functions  that  are
+       described  in  the  sections  on  matched  strings and other match data
+       below.
+
+       When a call of pcre2_match() fails, valid  data  is  available  in  the
+       match    block    only   when   the   error   is   PCRE2_ERROR_NOMATCH,
+       PCRE2_ERROR_PARTIAL, or one of the  error  codes  for  an  invalid  UTF
+       string. Exactly what is available depends on the error, and is detailed
+       below.
+
+       When one of the matching functions is called, pointers to the  compiled
+       pattern  and the subject string are set in the match data block so that
+       they can be referenced by the extraction  functions.  After  running  a
+       match,  you  must not free a compiled pattern or a subject string until
+       after all operations on the match data  block  (for  that  match)  have
+       taken place.
+
+       When  a match data block itself is no longer needed, it should be freed
+       by calling pcre2_match_data_free().
+
+
+MATCHING A PATTERN: THE TRADITIONAL FUNCTION
+
+       int pcre2_match(const pcre2_code *code, PCRE2_SPTR subject,
+         PCRE2_SIZE length, PCRE2_SIZE startoffset,
+         uint32_t options, pcre2_match_data *match_data,
+         pcre2_match_context *mcontext);
+
+       The function pcre2_match() is called to match a subject string  against
+       a  compiled pattern, which is passed in the code argument. You can call
+       pcre2_match() with the same code argument as many times as you like, in
+       order  to  find multiple matches in the subject string or to match dif-
+       ferent subject strings with the same pattern.
+
+       This function is the main matching facility  of  the  library,  and  it
+       operates  in  a  Perl-like  manner. For specialist use there is also an
+       alternative matching function, which is described below in the  section
+       about the pcre2_dfa_match() function.
+
+       Here is an example of a simple call to pcre2_match():
+
+         pcre2_match_data *md = pcre2_match_data_create(4, NULL);
+         int rc = pcre2_match(
+           re,             /* result of pcre2_compile() */
+           "some string",  /* the subject string */
+           11,             /* the length of the subject string */
+           0,              /* start at offset 0 in the subject */
+           0,              /* default options */
+           match_data,     /* the match data block */
+           NULL);          /* a match context; NULL means use defaults */
+
+       If  the  subject  string is zero-terminated, the length can be given as
+       PCRE2_ZERO_TERMINATED. A match context must be provided if certain less
+       common matching parameters are to be changed. For details, see the sec-
+       tion on the match context above.
+
+   The string to be matched by pcre2_match()
+
+       The subject string is passed to pcre2_match() as a pointer in  subject,
+       a  length  in  length, and a starting offset in startoffset. The length
+       and offset are in code units, not characters.  That  is,  they  are  in
+       bytes  for the 8-bit library, 16-bit code units for the 16-bit library,
+       and 32-bit code units for the 32-bit library, whether or not  UTF  pro-
+       cessing is enabled.
+
+       If startoffset is greater than the length of the subject, pcre2_match()
+       returns PCRE2_ERROR_BADOFFSET. When the starting offset  is  zero,  the
+       search  for a match starts at the beginning of the subject, and this is
+       by far the most common case. In UTF-8 or UTF-16 mode, the starting off-
+       set  must  point to the start of a character, or to the end of the sub-
+       ject (in UTF-32 mode, one code unit equals one character, so  all  off-
+       sets  are  valid).  Like  the  pattern  string, the subject may contain
+       binary zeroes.
+
+       A non-zero starting offset is useful when searching for  another  match
+       in  the  same  subject  by calling pcre2_match() again after a previous
+       success.  Setting startoffset differs from  passing  over  a  shortened
+       string  and  setting  PCRE2_NOTBOL in the case of a pattern that begins
+       with any kind of lookbehind. For example, consider the pattern
+
+         \Biss\B
+
+       which finds occurrences of "iss" in the middle of  words.  (\B  matches
+       only  if  the  current position in the subject is not a word boundary.)
+       When applied to the string "Mississipi" the first call to pcre2_match()
+       finds  the first occurrence. If pcre2_match() is called again with just
+       the remainder of the subject,  namely  "issipi",  it  does  not  match,
+       because \B is always false at the start of the subject, which is deemed
+       to be a word boundary. However, if pcre2_match() is passed  the  entire
+       string again, but with startoffset set to 4, it finds the second occur-
+       rence of "iss" because it is able to look behind the starting point  to
+       discover that it is preceded by a letter.
+
+       Finding  all  the  matches  in a subject is tricky when the pattern can
+       match an empty string. It is possible to emulate Perl's /g behaviour by
+       first   trying   the   match   again  at  the  same  offset,  with  the
+       PCRE2_NOTEMPTY_ATSTART and PCRE2_ANCHORED options,  and  then  if  that
+       fails,  advancing  the  starting  offset  and  trying an ordinary match
+       again. There is some code that demonstrates  how  to  do  this  in  the
+       pcre2demo  sample  program. In the most general case, you have to check
+       to see if the newline convention recognizes CRLF as a newline,  and  if
+       so,  and the current character is CR followed by LF, advance the start-
+       ing offset by two characters instead of one.
+
+       If a non-zero starting offset is passed when the pattern  is  anchored,
+       one attempt to match at the given offset is made. This can only succeed
+       if the pattern does not require the match to be at  the  start  of  the
+       subject.
+
+   Option bits for pcre2_match()
+
+       The unused bits of the options argument for pcre2_match() must be zero.
+       The only  bits  that  may  be  set  are  PCRE2_ANCHORED,  PCRE2_NOTBOL,
+       PCRE2_NOTEOL,          PCRE2_NOTEMPTY,          PCRE2_NOTEMPTY_ATSTART,
+       PCRE2_NO_UTF_CHECK, PCRE2_PARTIAL_HARD, and  PCRE2_PARTIAL_SOFT.  Their
+       action is described below.
+
+       Setting  PCRE2_ANCHORED  at match time is not supported by the just-in-
+       time (JIT) compiler. If it is set, JIT matching  is  disabled  and  the
+       normal interpretive code in pcre2_match() is run. The remaining options
+       are supported for JIT matching.
+
+         PCRE2_ANCHORED
+
+       The PCRE2_ANCHORED option limits pcre2_match() to matching at the first
+       matching  position.  If  a pattern was compiled with PCRE2_ANCHORED, or
+       turned out to be anchored by virtue of its contents, it cannot be  made
+       unachored  at matching time. Note that setting the option at match time
+       disables JIT matching.
+
+         PCRE2_NOTBOL
+
+       This option specifies that first character of the subject string is not
+       the  beginning  of  a  line, so the circumflex metacharacter should not
+       match before it. Setting this without  having  set  PCRE2_MULTILINE  at
+       compile time causes circumflex never to match. This option affects only
+       the behaviour of the circumflex metacharacter. It does not affect \A.
+
+         PCRE2_NOTEOL
+
+       This option specifies that the end of the subject string is not the end
+       of  a line, so the dollar metacharacter should not match it nor (except
+       in multiline mode) a newline immediately before it. Setting this  with-
+       out  having  set PCRE2_MULTILINE at compile time causes dollar never to
+       match. This option affects only the behaviour of the dollar metacharac-
+       ter. It does not affect \Z or \z.
+
+         PCRE2_NOTEMPTY
+
+       An empty string is not considered to be a valid match if this option is
+       set. If there are alternatives in the pattern, they are tried.  If  all
+       the  alternatives  match  the empty string, the entire match fails. For
+       example, if the pattern
+
+         a?b?
+
+       is applied to a string not beginning with "a" or  "b",  it  matches  an
+       empty string at the start of the subject. With PCRE2_NOTEMPTY set, this
+       match is not valid, so pcre2_match() searches further into  the  string
+       for occurrences of "a" or "b".
+
+         PCRE2_NOTEMPTY_ATSTART
+
+       This  is  like PCRE2_NOTEMPTY, except that it locks out an empty string
+       match only at the first matching position, that is, at the start of the
+       subject  plus  the  starting offset. An empty string match later in the
+       subject is permitted.  If the pattern is anchored,  such  a  match  can
+       occur only if the pattern contains \K.
+
+         PCRE2_NO_UTF_CHECK
+
+       When PCRE2_UTF is set at compile time, the validity of the subject as a
+       UTF string is checked by default  when  pcre2_match()  is  subsequently
+       called.   If  a non-zero starting offset is given, the check is applied
+       only to that part of the subject that could be inspected during  match-
+       ing,  and there is a check that the starting offset points to the first
+       code unit of a character or to the end of the subject. If there are  no
+       lookbehind  assertions in the pattern, the check starts at the starting
+       offset. Otherwise, it starts at the length of  the  longest  lookbehind
+       before the starting offset, or at the start of the subject if there are
+       not that many characters before the  starting  offset.  Note  that  the
+       sequences \b and \B are one-character lookbehinds.
+
+       The check is carried out before any other processing takes place, and a
+       negative error code is returned if the check fails. There  are  several
+       UTF  error  codes  for each code unit width, corresponding to different
+       problems with the code unit sequence. There are discussions  about  the
+       validity  of  UTF-8  strings, UTF-16 strings, and UTF-32 strings in the
+       pcre2unicode page.
+
+       If you know that your subject is valid, and  you  want  to  skip  these
+       checks  for  performance  reasons,  you  can set the PCRE2_NO_UTF_CHECK
+       option when calling pcre2_match(). You might want to do  this  for  the
+       second and subsequent calls to pcre2_match() if you are making repeated
+       calls to find all the matches in a single subject string.
+
+       NOTE: When PCRE2_NO_UTF_CHECK is set, the effect of passing an  invalid
+       string  as a subject, or an invalid value of startoffset, is undefined.
+       Your program may crash or loop indefinitely.
+
+         PCRE2_PARTIAL_HARD
+         PCRE2_PARTIAL_SOFT
+
+       These options turn on the partial matching  feature.  A  partial  match
+       occurs  if  the  end of the subject string is reached successfully, but
+       there are not enough subject characters to complete the match. If  this
+       happens  when  PCRE2_PARTIAL_SOFT  (but not PCRE2_PARTIAL_HARD) is set,
+       matching continues by testing any remaining alternatives.  Only  if  no
+       complete  match can be found is PCRE2_ERROR_PARTIAL returned instead of
+       PCRE2_ERROR_NOMATCH. In other words, PCRE2_PARTIAL_SOFT specifies  that
+       the  caller  is prepared to handle a partial match, but only if no com-
+       plete match can be found.
+
+       If PCRE2_PARTIAL_HARD is set, it overrides PCRE2_PARTIAL_SOFT. In  this
+       case,  if  a  partial match is found, pcre2_match() immediately returns
+       PCRE2_ERROR_PARTIAL, without considering  any  other  alternatives.  In
+       other words, when PCRE2_PARTIAL_HARD is set, a partial match is consid-
+       ered to be more important that an alternative complete match.
+
+       There is a more detailed discussion of partial and multi-segment match-
+       ing, with examples, in the pcre2partial documentation.
+
+
+NEWLINE HANDLING WHEN MATCHING
+
+       When  PCRE2 is built, a default newline convention is set; this is usu-
+       ally the standard convention for the operating system. The default  can
+       be  overridden  in a compile context by calling pcre2_set_newline(). It
+       can also be overridden by starting a pattern string with, for  example,
+       (*CRLF),  as  described  in  the  section on newline conventions in the
+       pcre2pattern page. During matching, the newline choice affects the  be-
+       haviour  of the dot, circumflex, and dollar metacharacters. It may also
+       alter the way the match starting position is  advanced  after  a  match
+       failure for an unanchored pattern.
+
+       When PCRE2_NEWLINE_CRLF, PCRE2_NEWLINE_ANYCRLF, or PCRE2_NEWLINE_ANY is
+       set as the newline convention, and a match attempt  for  an  unanchored
+       pattern fails when the current starting position is at a CRLF sequence,
+       and the pattern contains no explicit matches for CR or  LF  characters,
+       the  match  position  is  advanced by two characters instead of one, in
+       other words, to after the CRLF.
+
+       The above rule is a compromise that makes the most common cases work as
+       expected.  For  example,  if  the  pattern is .+A (and the PCRE2_DOTALL
+       option is not set), it does not match the string "\r\nA" because, after
+       failing  at the start, it skips both the CR and the LF before retrying.
+       However, the pattern [\r\n]A does match that string,  because  it  con-
+       tains an explicit CR or LF reference, and so advances only by one char-
+       acter after the first failure.
+
+       An explicit match for CR of LF is either a literal appearance of one of
+       those  characters  in  the  pattern,  or  one  of  the  \r or \n escape
+       sequences. Implicit matches such as [^X] do not  count,  nor  does  \s,
+       even though it includes CR and LF in the characters that it matches.
+
+       Notwithstanding  the above, anomalous effects may still occur when CRLF
+       is a valid newline sequence and explicit \r or \n escapes appear in the
+       pattern.
+
+
+HOW PCRE2_MATCH() RETURNS A STRING AND CAPTURED SUBSTRINGS
+
+       uint32_t pcre2_get_ovector_count(pcre2_match_data *match_data);
+
+       PCRE2_SIZE *pcre2_get_ovector_pointer(pcre2_match_data *match_data);
+
+       In  general, a pattern matches a certain portion of the subject, and in
+       addition, further substrings from the subject  may  be  picked  out  by
+       parenthesized  parts  of  the  pattern.  Following the usage in Jeffrey
+       Friedl's book, this is called "capturing"  in  what  follows,  and  the
+       phrase  "capturing subpattern" or "capturing group" is used for a frag-
+       ment of a pattern that picks out a substring.  PCRE2  supports  several
+       other kinds of parenthesized subpattern that do not cause substrings to
+       be captured. The pcre2_pattern_info() function can be used to find  out
+       how many capturing subpatterns there are in a compiled pattern.
+
+       You  can  use  auxiliary functions for accessing captured substrings by
+       number or by name, as described in sections below.
+
+       Alternatively, you can make direct use of the vector of PCRE2_SIZE val-
+       ues,  called  the  ovector,  which  contains  the  offsets  of captured
+       strings.  It  is  part  of  the  match  data   block.    The   function
+       pcre2_get_ovector_pointer()  returns  the  address  of the ovector, and
+       pcre2_get_ovector_count() returns the number of pairs of values it con-
+       tains.
+
+       Within the ovector, the first in each pair of values is set to the off-
+       set of the first code unit of a substring, and the second is set to the
+       offset  of the first code unit after the end of a substring. These val-
+       ues are always code unit offsets, not character offsets. That is,  they
+       are  byte  offsets  in  the 8-bit library, 16-bit offsets in the 16-bit
+       library, and 32-bit offsets in the 32-bit library.
+
+       After a partial match  (error  return  PCRE2_ERROR_PARTIAL),  only  the
+       first  pair  of  offsets  (that is, ovector[0] and ovector[1]) are set.
+       They identify the part of the subject that was partially  matched.  See
+       the pcre2partial documentation for details of partial matching.
+
+       After a successful match, the first pair of offsets identifies the por-
+       tion of the subject string that was matched by the entire pattern.  The
+       next  pair  is  used for the first capturing subpattern, and so on. The
+       value returned by pcre2_match() is one more than the  highest  numbered
+       pair  that  has been set. For example, if two substrings have been cap-
+       tured, the returned value is 3. If there are no capturing  subpatterns,
+       the return value from a successful match is 1, indicating that just the
+       first pair of offsets has been set.
+
+       If a pattern uses the \K escape sequence within a  positive  assertion,
+       the reported start of a successful match can be greater than the end of
+       the match.  For example, if the pattern  (?=ab\K)  is  matched  against
+       "ab", the start and end offset values for the match are 2 and 0.
+
+       If  a  capturing subpattern group is matched repeatedly within a single
+       match operation, it is the last portion of the subject that it  matched
+       that is returned.
+
+       If the ovector is too small to hold all the captured substring offsets,
+       as much as possible is filled in, and the function returns a  value  of
+       zero.  If captured substrings are not of interest, pcre2_match() may be
+       called with a match data block whose ovector is of minimum length (that
+       is, one pair). However, if the pattern contains back references and the
+       ovector is not big enough to remember the related substrings, PCRE2 has
+       to  get  additional  memory for use during matching. Thus it is usually
+       advisable to set up a match data block containing an ovector of reason-
+       able size.
+
+       It  is  possible for capturing subpattern number n+1 to match some part
+       of the subject when subpattern n has not been used at all. For example,
+       if  the  string  "abc"  is  matched against the pattern (a|(z))(bc) the
+       return from the function is 4, and subpatterns 1 and 3 are matched, but
+       2  is  not.  When  this happens, both values in the offset pairs corre-
+       sponding to unused subpatterns are set to PCRE2_UNSET.
+
+       Offset values that correspond to unused subpatterns at the end  of  the
+       expression  are  also  set  to  PCRE2_UNSET. For example, if the string
+       "abc" is matched against the pattern (abc)(x(yz)?)? subpatterns 2 and 3
+       are  not matched.  The return from the function is 2, because the high-
+       est used capturing subpattern number is 1. The offsets for for the sec-
+       ond  and  third  capturing  subpatterns  (assuming  the vector is large
+       enough, of course) are set to PCRE2_UNSET.
+
+       Elements in the ovector that do not correspond to capturing parentheses
+       in the pattern are never changed. That is, if a pattern contains n cap-
+       turing parentheses, no more than ovector[0] to ovector[2n+1] are set by
+       pcre2_match().  The  other  elements retain whatever values they previ-
+       ously had.
+
+
+OTHER INFORMATION ABOUT A MATCH
+
+       PCRE2_SPTR pcre2_get_mark(pcre2_match_data *match_data);
+
+       PCRE2_SIZE pcre2_get_startchar(pcre2_match_data *match_data);
+
+       As well as the offsets in the ovector, other information about a  match
+       is  retained  in the match data block and can be retrieved by the above
+       functions in appropriate circumstances. If they  are  called  at  other
+       times, the result is undefined.
+
+       After  a  successful match, a partial match (PCRE2_ERROR_PARTIAL), or a
+       failure to match (PCRE2_ERROR_NOMATCH), a (*MARK) name  may  be  avail-
+       able,  and  pcre2_get_mark() can be called. It returns a pointer to the
+       zero-terminated name, which is within the compiled  pattern.  Otherwise
+       NULL  is returned. The length of the (*MARK) name (excluding the termi-
+       nating zero) is stored in the code unit that  preceeds  the  name.  You
+       should  use  this  instead  of  relying  on the terminating zero if the
+       (*MARK) name might contain a binary zero.
+
+       After a successful match, the (*MARK) name that is returned is the last
+       one  encountered  on the matching path through the pattern. After a "no
+       match" or a  partial  match,  the  last  encountered  (*MARK)  name  is
+       returned. For example, consider this pattern:
+
+         ^(*MARK:A)((*MARK:B)a|b)c
+
+       When  it  matches "bc", the returned mark is A. The B mark is "seen" in
+       the first branch of the group, but it is not on the matching  path.  On
+       the  other  hand,  when  this pattern fails to match "bx", the returned
+       mark is B.
+
+       After a successful match, a partial match, or one of  the  invalid  UTF
+       errors  (for example, PCRE2_ERROR_UTF8_ERR5), pcre2_get_startchar() can
+       be called. After a successful or partial match it returns the code unit
+       offset  of  the character at which the match started. For a non-partial
+       match, this can be different to the value of ovector[0] if the  pattern
+       contains  the  \K escape sequence. After a partial match, however, this
+       value is always the same as ovector[0] because \K does not  affect  the
+       result of a partial match.
+
+       After  a UTF check failure, pcre2_get_startchar() can be used to obtain
+       the code unit offset of the invalid UTF character. Details are given in
+       the pcre2unicode page.
+
+
+ERROR RETURNS FROM pcre2_match()
+
+       If  pcre2_match() fails, it returns a negative number. This can be con-
+       verted to a text string by calling pcre2_get_error_message().  Negative
+       error  codes  are  also returned by other functions, and are documented
+       with them.  The codes are given names in the header file. If UTF check-
+       ing is in force and an invalid UTF subject string is detected, one of a
+       number of UTF-specific negative error codes is  returned.  Details  are
+       given in the pcre2unicode page. The following are the other errors that
+       may be returned by pcre2_match():
+
+         PCRE2_ERROR_NOMATCH
+
+       The subject string did not match the pattern.
+
+         PCRE2_ERROR_PARTIAL
+
+       The subject string did not match, but it did match partially.  See  the
+       pcre2partial documentation for details of partial matching.
+
+         PCRE2_ERROR_BADMAGIC
+
+       PCRE2 stores a 4-byte "magic number" at the start of the compiled code,
+       to catch the case when it is passed a junk pointer. This is  the  error
+       that is returned when the magic number is not present.
+
+         PCRE2_ERROR_BADMODE
+
+       This  error  is  given  when  a  pattern that was compiled by the 8-bit
+       library is passed to a 16-bit  or  32-bit  library  function,  or  vice
+       versa.
+
+         PCRE2_ERROR_BADOFFSET
+
+       The value of startoffset was greater than the length of the subject.
+
+         PCRE2_ERROR_BADOPTION
+
+       An unrecognized bit was set in the options argument.
+
+         PCRE2_ERROR_BADUTFOFFSET
+
+       The UTF code unit sequence that was passed as a subject was checked and
+       found to be valid (the PCRE2_NO_UTF_CHECK option was not set), but  the
+       value  of startoffset did not point to the beginning of a UTF character
+       or the end of the subject.
+
+         PCRE2_ERROR_CALLOUT
+
+       This error is never generated by pcre2_match() itself. It  is  provided
+       for  use  by  callout  functions  that  want  to cause pcre2_match() or
+       pcre2_callout_enumerate() to return a distinctive error code.  See  the
+       pcre2callout documentation for details.
+
+         PCRE2_ERROR_INTERNAL
+
+       An  unexpected  internal error has occurred. This error could be caused
+       by a bug in PCRE2 or by overwriting of the compiled pattern.
+
+         PCRE2_ERROR_JIT_BADOPTION
+
+       This error is returned when a pattern  that  was  successfully  studied
+       using  JIT is being matched, but the matching mode (partial or complete
+       match) does not correspond to any JIT compilation mode.  When  the  JIT
+       fast  path  function  is used, this error may be also given for invalid
+       options. See the pcre2jit documentation for more details.
+
+         PCRE2_ERROR_JIT_STACKLIMIT
+
+       This error is returned when a pattern  that  was  successfully  studied
+       using  JIT  is being matched, but the memory available for the just-in-
+       time processing stack is not large enough. See the pcre2jit  documenta-
+       tion for more details.
+
+         PCRE2_ERROR_MATCHLIMIT
+
+       The backtracking limit was reached.
+
+         PCRE2_ERROR_NOMEMORY
+
+       If  a  pattern  contains  back  references,  but the ovector is not big
+       enough to remember the referenced substrings, PCRE2  gets  a  block  of
+       memory at the start of matching to use for this purpose. There are some
+       other special cases where extra memory is needed during matching.  This
+       error is given when memory cannot be obtained.
+
+         PCRE2_ERROR_NULL
+
+       Either the code, subject, or match_data argument was passed as NULL.
+
+         PCRE2_ERROR_RECURSELOOP
+
+       This  error  is  returned  when  pcre2_match() detects a recursion loop
+       within the pattern. Specifically, it means that either the  whole  pat-
+       tern or a subpattern has been called recursively for the second time at
+       the same position in the subject  string.  Some  simple  patterns  that
+       might  do  this are detected and faulted at compile time, but more com-
+       plicated cases, in particular mutual recursions between  two  different
+       subpatterns, cannot be detected until matching is attempted.
+
+         PCRE2_ERROR_RECURSIONLIMIT
+
+       The internal recursion limit was reached.
+
+
+EXTRACTING CAPTURED SUBSTRINGS BY NUMBER
+
+       int pcre2_substring_length_bynumber(pcre2_match_data *match_data,
+         uint32_t number, PCRE2_SIZE *length);
+
+       int pcre2_substring_copy_bynumber(pcre2_match_data *match_data,
+         uint32_t number, PCRE2_UCHAR *buffer,
+         PCRE2_SIZE *bufflen);
+
+       int pcre2_substring_get_bynumber(pcre2_match_data *match_data,
+         uint32_t number, PCRE2_UCHAR **bufferptr,
+         PCRE2_SIZE *bufflen);
+
+       void pcre2_substring_free(PCRE2_UCHAR *buffer);
+
+       Captured  substrings  can  be accessed directly by using the ovector as
+       described above.  For convenience, auxiliary functions are provided for
+       extracting   captured  substrings  as  new,  separate,  zero-terminated
+       strings. A substring that contains a binary zero is correctly extracted
+       and  has  a  further  zero  added on the end, but the result is not, of
+       course, a C string.
+
+       The functions in this section identify substrings by number. The number
+       zero refers to the entire matched substring, with higher numbers refer-
+       ring to substrings captured by parenthesized groups.  After  a  partial
+       match,  only  substring  zero  is  available. An attempt to extract any
+       other substring gives the error PCRE2_ERROR_PARTIAL. The  next  section
+       describes similar functions for extracting captured substrings by name.
+
+       If  a  pattern uses the \K escape sequence within a positive assertion,
+       the reported start of a successful match can be greater than the end of
+       the  match.   For  example,  if the pattern (?=ab\K) is matched against
+       "ab", the start and end offset values for the match are  2  and  0.  In
+       this  situation,  calling  these functions with a zero substring number
+       extracts a zero-length empty string.
+
+       You can find the length in code units of a captured  substring  without
+       extracting  it  by calling pcre2_substring_length_bynumber(). The first
+       argument is a pointer to the match data block, the second is the  group
+       number,  and the third is a pointer to a variable into which the length
+       is placed. If you just want to know whether or not  the  substring  has
+       been captured, you can pass the third argument as NULL.
+
+       The  pcre2_substring_copy_bynumber()  function  copies  a captured sub-
+       string into a supplied buffer,  whereas  pcre2_substring_get_bynumber()
+       copies  it  into  new memory, obtained using the same memory allocation
+       function that was used for the match data block. The  first  two  argu-
+       ments  of  these  functions are a pointer to the match data block and a
+       capturing group number.
+
+       The final arguments of pcre2_substring_copy_bynumber() are a pointer to
+       the buffer and a pointer to a variable that contains its length in code
+       units.  This is updated to contain the actual number of code units used
+       for the extracted substring, excluding the terminating zero.
+
+       For pcre2_substring_get_bynumber() the third and fourth arguments point
+       to variables that are updated with a pointer to the new memory and  the
+       number  of  code units that comprise the substring, again excluding the
+       terminating zero. When the substring is no longer  needed,  the  memory
+       should be freed by calling pcre2_substring_free().
+
+       The  return  value  from  all these functions is zero for success, or a
+       negative error code. If the pattern match  failed,  the  match  failure
+       code  is  returned.   If  a  substring number greater than zero is used
+       after a partial match, PCRE2_ERROR_PARTIAL is returned. Other  possible
+       error codes are:
+
+         PCRE2_ERROR_NOMEMORY
+
+       The  buffer  was  too small for pcre2_substring_copy_bynumber(), or the
+       attempt to get memory failed for pcre2_substring_get_bynumber().
+
+         PCRE2_ERROR_NOSUBSTRING
+
+       There is no substring with that number in the  pattern,  that  is,  the
+       number is greater than the number of capturing parentheses.
+
+         PCRE2_ERROR_UNAVAILABLE
+
+       The substring number, though not greater than the number of captures in
+       the pattern, is greater than the number of slots in the ovector, so the
+       substring could not be captured.
+
+         PCRE2_ERROR_UNSET
+
+       The  substring  did  not  participate in the match. For example, if the
+       pattern is (abc)|(def) and the subject is "def", and the  ovector  con-
+       tains at least two capturing slots, substring number 1 is unset.
+
+
+EXTRACTING A LIST OF ALL CAPTURED SUBSTRINGS
+
+       int pcre2_substring_list_get(pcre2_match_data *match_data,
+         PCRE2_UCHAR ***listptr, PCRE2_SIZE **lengthsptr);
+
+       void pcre2_substring_list_free(PCRE2_SPTR *list);
+
+       The  pcre2_substring_list_get()  function  extracts  all available sub-
+       strings and builds a list of pointers to  them.  It  also  (optionally)
+       builds  a  second  list  that  contains  their lengths (in code units),
+       excluding a terminating zero that is added to each of them. All this is
+       done in a single block of memory that is obtained using the same memory
+       allocation function that was used to get the match data block.
+
+       This function must be called only after a successful match.  If  called
+       after a partial match, the error code PCRE2_ERROR_PARTIAL is returned.
+
+       The  address of the memory block is returned via listptr, which is also
+       the start of the list of string pointers. The end of the list is marked
+       by  a  NULL pointer. The address of the list of lengths is returned via
+       lengthsptr. If your strings do not contain binary zeros and you do  not
+       therefore need the lengths, you may supply NULL as the lengthsptr argu-
+       ment to disable the creation of a list of lengths.  The  yield  of  the
+       function  is zero if all went well, or PCRE2_ERROR_NOMEMORY if the mem-
+       ory block could not be obtained. When the list is no longer needed,  it
+       should be freed by calling pcre2_substring_list_free().
+
+       If this function encounters a substring that is unset, which can happen
+       when capturing subpattern number n+1 matches some part of the  subject,
+       but  subpattern n has not been used at all, it returns an empty string.
+       This can be distinguished  from  a  genuine  zero-length  substring  by
+       inspecting  the  appropriate  offset  in  the  ovector,  which  contain
+       PCRE2_UNSET  for   unset   substrings,   or   by   calling   pcre2_sub-
+       string_length_bynumber().
+
+
+EXTRACTING CAPTURED SUBSTRINGS BY NAME
+
+       int pcre2_substring_number_from_name(const pcre2_code *code,
+         PCRE2_SPTR name);
+
+       int pcre2_substring_length_byname(pcre2_match_data *match_data,
+         PCRE2_SPTR name, PCRE2_SIZE *length);
+
+       int pcre2_substring_copy_byname(pcre2_match_data *match_data,
+         PCRE2_SPTR name, PCRE2_UCHAR *buffer, PCRE2_SIZE *bufflen);
+
+       int pcre2_substring_get_byname(pcre2_match_data *match_data,
+         PCRE2_SPTR name, PCRE2_UCHAR **bufferptr, PCRE2_SIZE *bufflen);
+
+       void pcre2_substring_free(PCRE2_UCHAR *buffer);
+
+       To  extract a substring by name, you first have to find associated num-
+       ber.  For example, for this pattern:
+
+         (a+)b(?<xxx>\d+)...
+
+       the number of the subpattern called "xxx" is 2. If the name is known to
+       be  unique  (PCRE2_DUPNAMES  was not set), you can find the number from
+       the name by calling pcre2_substring_number_from_name(). The first argu-
+       ment  is the compiled pattern, and the second is the name. The yield of
+       the function is the subpattern number, PCRE2_ERROR_NOSUBSTRING if there
+       is  no  subpattern  of  that  name, or PCRE2_ERROR_NOUNIQUESUBSTRING if
+       there is more than one subpattern of that name. Given the  number,  you
+       can  extract  the  substring  directly,  or  use  one  of the functions
+       described above.
+
+       For convenience, there are also "byname" functions that  correspond  to
+       the  "bynumber"  functions,  the  only difference being that the second
+       argument is a name instead of a number. If PCRE2_DUPNAMES  is  set  and
+       there are duplicate names, these functions scan all the groups with the
+       given name, and return the first named string that is set.
+
+       If there are no groups with the given name, PCRE2_ERROR_NOSUBSTRING  is
+       returned.  If  all  groups  with the name have numbers that are greater
+       than the number of slots in  the  ovector,  PCRE2_ERROR_UNAVAILABLE  is
+       returned.  If  there  is at least one group with a slot in the ovector,
+       but no group is found to be set, PCRE2_ERROR_UNSET is returned.
+
+       Warning: If the pattern uses the (?| feature to set up multiple subpat-
+       terns  with  the  same number, as described in the section on duplicate
+       subpattern numbers in the pcre2pattern page, you cannot  use  names  to
+       distinguish  the  different subpatterns, because names are not included
+       in the compiled code. The matching process uses only numbers. For  this
+       reason,  the  use of different names for subpatterns of the same number
+       causes an error at compile time.
+
+
+CREATING A NEW STRING WITH SUBSTITUTIONS
+
+       int pcre2_substitute(const pcre2_code *code, PCRE2_SPTR subject,
+         PCRE2_SIZE length, PCRE2_SIZE startoffset,
+         uint32_t options, pcre2_match_data *match_data,
+         pcre2_match_context *mcontext, PCRE2_SPTR replacement,
+         PCRE2_SIZE rlength, PCRE2_UCHAR *outputbufferP,
+         PCRE2_SIZE *outlengthptr);
+
+       This function calls pcre2_match() and then makes a copy of the  subject
+       string  in  outputbuffer,  replacing the part that was matched with the
+       replacement string, whose length is supplied in rlength.  This  can  be
+       given as PCRE2_ZERO_TERMINATED for a zero-terminated string. Matches in
+       which a \K item in a lookahead in the pattern causes the match  to  end
+       before it starts are not supported, and give rise to an error return.
+
+       The  first  seven  arguments  of pcre2_substitute() are the same as for
+       pcre2_match(), except that the partial matching options are not permit-
+       ted,  and  match_data may be passed as NULL, in which case a match data
+       block is obtained and freed within this function, using memory  manage-
+       ment  functions from the match context, if provided, or else those that
+       were used to allocate memory for the compiled code.
+
+       The outlengthptr argument must point to a variable  that  contains  the
+       length,  in  code  units, of the output buffer. If the function is suc-
+       cessful, the value is updated to contain the length of the new  string,
+       excluding the trailing zero that is automatically added.
+
+       If  the  function  is  not  successful,  the value set via outlengthptr
+       depends on the type of error. For  syntax  errors  in  the  replacement
+       string,  the  value  is  the offset in the replacement string where the
+       error was detected. For other  errors,  the  value  is  PCRE2_UNSET  by
+       default.  This  includes the case of the output buffer being too small,
+       unless PCRE2_SUBSTITUTE_OVERFLOW_LENGTH is set (see  below),  in  which
+       case  the  value  is the minimum length needed, including space for the
+       trailing zero. Note that in  order  to  compute  the  required  length,
+       pcre2_substitute()  has  to  simulate  all  the  matching  and copying,
+       instead of giving an error return as soon as the buffer overflows. Note
+       also that the length is in code units, not bytes.
+
+       In  the replacement string, which is interpreted as a UTF string in UTF
+       mode, and is checked for UTF  validity  unless  the  PCRE2_NO_UTF_CHECK
+       option is set, a dollar character is an escape character that can spec-
+       ify the insertion of characters from capturing groups or (*MARK)  items
+       in the pattern. The following forms are always recognized:
+
+         $$                  insert a dollar character
+         $<n> or ${<n>}      insert the contents of group <n>
+         $*MARK or ${*MARK}  insert the name of the last (*MARK) encountered
+
+       Either  a  group  number  or  a  group name can be given for <n>. Curly
+       brackets are required only if the following character would  be  inter-
+       preted as part of the number or name. The number may be zero to include
+       the entire matched string.   For  example,  if  the  pattern  a(b)c  is
+       matched  with "=abc=" and the replacement string "+$1$0$1+", the result
+       is "=+babcb+=".
+
+       The facility for inserting a (*MARK) name can be used to perform simple
+       simultaneous substitutions, as this pcre2test example shows:
+
+         /(*:pear)apple|(*:orange)lemon/g,replace=${*MARK}
+             apple lemon
+          2: pear orange
+
+       As  well as the usual options for pcre2_match(), a number of additional
+       options can be set in the options argument.
+
+       PCRE2_SUBSTITUTE_GLOBAL causes the function to iterate over the subject
+       string,  replacing  every  matching substring. If this is not set, only
+       the first matching substring is replaced. If any matched substring  has
+       zero  length, after the substitution has happened, an attempt to find a
+       non-empty match at the same position is performed. If this is not  suc-
+       cessful,  the current position is advanced by one character except when
+       CRLF is a valid newline sequence and the next two  characters  are  CR,
+       LF. In this case, the current position is advanced by two characters.
+
+       PCRE2_SUBSTITUTE_OVERFLOW_LENGTH  changes  what happens when the output
+       buffer is too small. The default action is to return PCRE2_ERROR_NOMEM-
+       ORY  immediately.  If  this  option is set, however, pcre2_substitute()
+       continues to go through the motions of matching and substituting (with-
+       out,  of course, writing anything) in order to compute the size of buf-
+       fer that is needed. This value is  passed  back  via  the  outlengthptr
+       variable,    with    the   result   of   the   function   still   being
+       PCRE2_ERROR_NOMEMORY.
+
+       Passing a buffer size of zero is a permitted way  of  finding  out  how
+       much  memory  is needed for given substitution. However, this does mean
+       that the entire operation is carried out twice. Depending on the appli-
+       cation,  it  may  be more efficient to allocate a large buffer and free
+       the  excess  afterwards,  instead   of   using   PCRE2_SUBSTITUTE_OVER-
+       FLOW_LENGTH.
+
+       PCRE2_SUBSTITUTE_UNKNOWN_UNSET  causes  references  to capturing groups
+       that do not appear in the pattern to be treated as unset  groups.  This
+       option  should  be  used  with  care, because it means that a typo in a
+       group name or  number  no  longer  causes  the  PCRE2_ERROR_NOSUBSTRING
+       error.
+
+       PCRE2_SUBSTITUTE_UNSET_EMPTY  causes  unset capturing groups (including
+       unknown  groups  when  PCRE2_SUBSTITUTE_UNKNOWN_UNSET  is  set)  to  be
+       treated  as  empty  strings  when  inserted as described above. If this
+       option is not set, an attempt to  insert  an  unset  group  causes  the
+       PCRE2_ERROR_UNSET  error.  This  option does not influence the extended
+       substitution syntax described below.
+
+       PCRE2_SUBSTITUTE_EXTENDED causes extra processing to be applied to  the
+       replacement  string.  Without this option, only the dollar character is
+       special, and only the group insertion forms  listed  above  are  valid.
+       When PCRE2_SUBSTITUTE_EXTENDED is set, two things change:
+
+       Firstly,  backslash in a replacement string is interpreted as an escape
+       character. The usual forms such as \n or \x{ddd} can be used to specify
+       particular  character codes, and backslash followed by any non-alphanu-
+       meric character quotes that character. Extended quoting  can  be  coded
+       using \Q...\E, exactly as in pattern strings.
+
+       There  are  also four escape sequences for forcing the case of inserted
+       letters.  The insertion mechanism has three states:  no  case  forcing,
+       force upper case, and force lower case. The escape sequences change the
+       current state: \U and \L change to upper or lower case forcing, respec-
+       tively,  and  \E (when not terminating a \Q quoted sequence) reverts to
+       no case forcing. The sequences \u and \l force the next  character  (if
+       it  is  a  letter)  to  upper or lower case, respectively, and then the
+       state automatically reverts to no case forcing. Case forcing applies to
+       all inserted  characters, including those from captured groups and let-
+       ters within \Q...\E quoted sequences.
+
+       Note that case forcing sequences such as \U...\E do not nest. For exam-
+       ple,  the  result of processing "\Uaa\LBB\Ecc\E" is "AAbbcc"; the final
+       \E has no effect.
+
+       The second effect of setting PCRE2_SUBSTITUTE_EXTENDED is to  add  more
+       flexibility  to  group substitution. The syntax is similar to that used
+       by Bash:
+
+         ${<n>:-<string>}
+         ${<n>:+<string1>:<string2>}
+
+       As before, <n> may be a group number or a name. The first  form  speci-
+       fies  a  default  value. If group <n> is set, its value is inserted; if
+       not, <string> is expanded and the  result  inserted.  The  second  form
+       specifies  strings that are expanded and inserted when group <n> is set
+       or unset, respectively. The first form is just a  convenient  shorthand
+       for
+
+         ${<n>:+${<n>}:<string>}
+
+       Backslash  can  be  used to escape colons and closing curly brackets in
+       the replacement strings. A change of the case forcing  state  within  a
+       replacement  string  remains  in  force  afterwards,  as  shown in this
+       pcre2test example:
+
+         /(some)?(body)/substitute_extended,replace=${1:+\U:\L}HeLLo
+             body
+          1: hello
+             somebody
+          1: HELLO
+
+       The PCRE2_SUBSTITUTE_UNSET_EMPTY option does not affect these  extended
+       substitutions.   However,   PCRE2_SUBSTITUTE_UNKNOWN_UNSET  does  cause
+       unknown groups in the extended syntax forms to be treated as unset.
+
+       If successful, pcre2_substitute() returns the  number  of  replacements
+       that were made. This may be zero if no matches were found, and is never
+       greater than 1 unless PCRE2_SUBSTITUTE_GLOBAL is set.
+
+       In the event of an error, a negative error code is returned. Except for
+       PCRE2_ERROR_NOMATCH    (which   is   never   returned),   errors   from
+       pcre2_match() are passed straight back.
+
+       PCRE2_ERROR_NOSUBSTRING is returned for a non-existent substring inser-
+       tion, unless PCRE2_SUBSTITUTE_UNKNOWN_UNSET is set.
+
+       PCRE2_ERROR_UNSET is returned for an unset substring insertion (includ-
+       ing an unknown substring when  PCRE2_SUBSTITUTE_UNKNOWN_UNSET  is  set)
+       when  the  simple  (non-extended)  syntax  is  used  and  PCRE2_SUBSTI-
+       TUTE_UNSET_EMPTY is not set.
+
+       PCRE2_ERROR_NOMEMORY is returned  if  the  output  buffer  is  not  big
+       enough. If the PCRE2_SUBSTITUTE_OVERFLOW_LENGTH option is set, the size
+       of buffer that is needed is returned via outlengthptr. Note  that  this
+       does not happen by default.
+
+       PCRE2_ERROR_BADREPLACEMENT  is  used for miscellaneous syntax errors in
+       the   replacement   string,   with   more   particular   errors   being
+       PCRE2_ERROR_BADREPESCAPE  (invalid  escape  sequence), PCRE2_ERROR_REP-
+       MISSING_BRACE (closing curly bracket not found),  PCRE2_BADSUBSTITUTION
+       (syntax  error in extended group substitution), and PCRE2_BADSUBPATTERN
+       (the pattern match ended before it started, which can happen if  \K  is
+       used in an assertion).
+
+       As for all PCRE2 errors, a text message that describes the error can be
+       obtained by calling pcre2_get_error_message().
+
+
+DUPLICATE SUBPATTERN NAMES
+
+       int pcre2_substring_nametable_scan(const pcre2_code *code,
+         PCRE2_SPTR name, PCRE2_SPTR *first, PCRE2_SPTR *last);
+
+       When a pattern is compiled with the PCRE2_DUPNAMES  option,  names  for
+       subpatterns  are  not required to be unique. Duplicate names are always
+       allowed for subpatterns with the same number, created by using the  (?|
+       feature.  Indeed,  if  such subpatterns are named, they are required to
+       use the same names.
+
+       Normally, patterns with duplicate names are such that in any one match,
+       only  one of the named subpatterns participates. An example is shown in
+       the pcre2pattern documentation.
+
+       When  duplicates   are   present,   pcre2_substring_copy_byname()   and
+       pcre2_substring_get_byname()  return  the first substring corresponding
+       to  the  given  name  that  is  set.  Only   if   none   are   set   is
+       PCRE2_ERROR_UNSET  is  returned. The pcre2_substring_number_from_name()
+       function returns the error PCRE2_ERROR_NOUNIQUESUBSTRING when there are
+       duplicate names.
+
+       If  you want to get full details of all captured substrings for a given
+       name, you must use the pcre2_substring_nametable_scan()  function.  The
+       first  argument is the compiled pattern, and the second is the name. If
+       the third and fourth arguments are NULL, the function returns  a  group
+       number for a unique name, or PCRE2_ERROR_NOUNIQUESUBSTRING otherwise.
+
+       When the third and fourth arguments are not NULL, they must be pointers
+       to variables that are updated by the function. After it has  run,  they
+       point to the first and last entries in the name-to-number table for the
+       given name, and the function returns the length of each entry  in  code
+       units.  In both cases, PCRE2_ERROR_NOSUBSTRING is returned if there are
+       no entries for the given name.
+
+       The format of the name table is described above in the section entitled
+       Information  about  a  pattern.  Given all the relevant entries for the
+       name, you can extract each of their numbers,  and  hence  the  captured
+       data.
+
+
+FINDING ALL POSSIBLE MATCHES AT ONE POSITION
+
+       The  traditional  matching  function  uses a similar algorithm to Perl,
+       which stops when it finds the first match at a given point in the  sub-
+       ject. If you want to find all possible matches, or the longest possible
+       match at a given position,  consider  using  the  alternative  matching
+       function  (see  below) instead. If you cannot use the alternative func-
+       tion, you can kludge it up by making use of the callout facility, which
+       is described in the pcre2callout documentation.
+
+       What you have to do is to insert a callout right at the end of the pat-
+       tern.  When your callout function is called, extract and save the  cur-
+       rent  matched  substring.  Then return 1, which forces pcre2_match() to
+       backtrack and try other alternatives. Ultimately, when it runs  out  of
+       matches, pcre2_match() will yield PCRE2_ERROR_NOMATCH.
+
+
+MATCHING A PATTERN: THE ALTERNATIVE FUNCTION
+
+       int pcre2_dfa_match(const pcre2_code *code, PCRE2_SPTR subject,
+         PCRE2_SIZE length, PCRE2_SIZE startoffset,
+         uint32_t options, pcre2_match_data *match_data,
+         pcre2_match_context *mcontext,
+         int *workspace, PCRE2_SIZE wscount);
+
+       The  function  pcre2_dfa_match()  is  called  to match a subject string
+       against a compiled pattern, using a matching algorithm that  scans  the
+       subject  string  just  once, and does not backtrack. This has different
+       characteristics to the normal algorithm, and  is  not  compatible  with
+       Perl.  Some of the features of PCRE2 patterns are not supported. Never-
+       theless, there are times when this kind of matching can be useful.  For
+       a  discussion  of  the  two matching algorithms, and a list of features
+       that pcre2_dfa_match() does not support, see the pcre2matching documen-
+       tation.
+
+       The  arguments  for  the pcre2_dfa_match() function are the same as for
+       pcre2_match(), plus two extras. The ovector within the match data block
+       is used in a different way, and this is described below. The other com-
+       mon arguments are used in the same way as for pcre2_match(),  so  their
+       description is not repeated here.
+
+       The  two  additional  arguments provide workspace for the function. The
+       workspace vector should contain at least 20 elements. It  is  used  for
+       keeping  track  of  multiple  paths  through  the  pattern  tree.  More
+       workspace is needed for patterns and subjects where there are a lot  of
+       potential matches.
+
+       Here is an example of a simple call to pcre2_dfa_match():
+
+         int wspace[20];
+         pcre2_match_data *md = pcre2_match_data_create(4, NULL);
+         int rc = pcre2_dfa_match(
+           re,             /* result of pcre2_compile() */
+           "some string",  /* the subject string */
+           11,             /* the length of the subject string */
+           0,              /* start at offset 0 in the subject */
+           0,              /* default options */
+           match_data,     /* the match data block */
+           NULL,           /* a match context; NULL means use defaults */
+           wspace,         /* working space vector */
+           20);            /* number of elements (NOT size in bytes) */
+
+   Option bits for pcre_dfa_match()
+
+       The  unused  bits of the options argument for pcre2_dfa_match() must be
+       zero. The only bits that may be set are  PCRE2_ANCHORED,  PCRE2_NOTBOL,
+       PCRE2_NOTEOL,          PCRE2_NOTEMPTY,          PCRE2_NOTEMPTY_ATSTART,
+       PCRE2_NO_UTF_CHECK,       PCRE2_PARTIAL_HARD,       PCRE2_PARTIAL_SOFT,
+       PCRE2_DFA_SHORTEST,  and  PCRE2_DFA_RESTART.  All  but the last four of
+       these are exactly the same as for pcre2_match(), so  their  description
+       is not repeated here.
+
+         PCRE2_PARTIAL_HARD
+         PCRE2_PARTIAL_SOFT
+
+       These  have  the  same general effect as they do for pcre2_match(), but
+       the details are slightly different. When PCRE2_PARTIAL_HARD is set  for
+       pcre2_dfa_match(),  it  returns  PCRE2_ERROR_PARTIAL  if the end of the
+       subject is reached and there is still at least one matching possibility
+       that requires additional characters. This happens even if some complete
+       matches have already been found. When PCRE2_PARTIAL_SOFT  is  set,  the
+       return  code  PCRE2_ERROR_NOMATCH is converted into PCRE2_ERROR_PARTIAL
+       if the end of the subject is  reached,  there  have  been  no  complete
+       matches, but there is still at least one matching possibility. The por-
+       tion of the string that was inspected when the  longest  partial  match
+       was found is set as the first matching string in both cases. There is a
+       more detailed discussion of partial and  multi-segment  matching,  with
+       examples, in the pcre2partial documentation.
+
+         PCRE2_DFA_SHORTEST
+
+       Setting  the PCRE2_DFA_SHORTEST option causes the matching algorithm to
+       stop as soon as it has found one match. Because of the way the alterna-
+       tive  algorithm  works, this is necessarily the shortest possible match
+       at the first possible matching point in the subject string.
+
+         PCRE2_DFA_RESTART
+
+       When pcre2_dfa_match() returns a partial match, it is possible to  call
+       it again, with additional subject characters, and have it continue with
+       the same match. The PCRE2_DFA_RESTART option requests this action; when
+       it  is  set,  the workspace and wscount options must reference the same
+       vector as before because data about the match so far is  left  in  them
+       after a partial match. There is more discussion of this facility in the
+       pcre2partial documentation.
+
+   Successful returns from pcre2_dfa_match()
+
+       When pcre2_dfa_match() succeeds, it may have matched more than one sub-
+       string in the subject. Note, however, that all the matches from one run
+       of the function start at the same point in  the  subject.  The  shorter
+       matches  are all initial substrings of the longer matches. For example,
+       if the pattern
+
+         <.*>
+
+       is matched against the string
+
+         This is <something> <something else> <something further> no more
+
+       the three matched strings are
+
+         <something> <something else> <something further>
+         <something> <something else>
+         <something>
+
+       On success, the yield of the function is a number  greater  than  zero,
+       which  is  the  number  of  matched substrings. The offsets of the sub-
+       strings are returned in the ovector, and can be extracted by number  in
+       the  same way as for pcre2_match(), but the numbers bear no relation to
+       any capturing groups that may exist in the pattern, because DFA  match-
+       ing does not support group capture.
+
+       Calls  to  the  convenience  functions  that extract substrings by name
+       return the error PCRE2_ERROR_DFA_UFUNC (unsupported function)  if  used
+       after a DFA match. The convenience functions that extract substrings by
+       number never return PCRE2_ERROR_NOSUBSTRING, and the meanings  of  some
+       other errors are slightly different:
+
+         PCRE2_ERROR_UNAVAILABLE
+
+       The ovector is not big enough to include a slot for the given substring
+       number.
+
+         PCRE2_ERROR_UNSET
+
+       There is a slot in the ovector  for  this  substring,  but  there  were
+       insufficient matches to fill it.
+
+       The  matched  strings  are  stored  in  the ovector in reverse order of
+       length; that is, the longest matching string is first.  If  there  were
+       too  many matches to fit into the ovector, the yield of the function is
+       zero, and the vector is filled with the longest matches.
+
+       NOTE: PCRE2's "auto-possessification" optimization usually  applies  to
+       character  repeats at the end of a pattern (as well as internally). For
+       example, the pattern "a\d+" is compiled as if it were "a\d++". For  DFA
+       matching,  this  means  that  only  one possible match is found. If you
+       really do want multiple matches in such cases, either use  an  ungreedy
+       repeat  auch  as  "a\d+?"  or set the PCRE2_NO_AUTO_POSSESS option when
+       compiling.
+
+   Error returns from pcre2_dfa_match()
+
+       The pcre2_dfa_match() function returns a negative number when it fails.
+       Many  of  the  errors  are  the same as for pcre2_match(), as described
+       above.  There are in addition the following errors that are specific to
+       pcre2_dfa_match():
+
+         PCRE2_ERROR_DFA_UITEM
+
+       This  return  is  given  if pcre2_dfa_match() encounters an item in the
+       pattern that it does not support, for instance, the use of \C in a  UTF
+       mode or a back reference.
+
+         PCRE2_ERROR_DFA_UCOND
+
+       This  return  is given if pcre2_dfa_match() encounters a condition item
+       that uses a back reference for the condition, or a test  for  recursion
+       in a specific group. These are not supported.
+
+         PCRE2_ERROR_DFA_WSSIZE
+
+       This  return  is  given  if  pcre2_dfa_match() runs out of space in the
+       workspace vector.
+
+         PCRE2_ERROR_DFA_RECURSE
+
+       When a recursive subpattern is processed, the matching  function  calls
+       itself recursively, using private memory for the ovector and workspace.
+       This error is given if the internal ovector is not large  enough.  This
+       should be extremely rare, as a vector of size 1000 is used.
+
+         PCRE2_ERROR_DFA_BADRESTART
+
+       When  pcre2_dfa_match()  is  called  with the PCRE2_DFA_RESTART option,
+       some plausibility checks are made on the  contents  of  the  workspace,
+       which  should  contain data about the previous partial match. If any of
+       these checks fail, this error is given.
+
+
+SEE ALSO
+
+       pcre2build(3),   pcre2callout(3),    pcre2demo(3),    pcre2matching(3),
+       pcre2partial(3),    pcre2posix(3),    pcre2sample(3),    pcre2stack(3),
+       pcre2unicode(3).
+
+
+AUTHOR
+
+       Philip Hazel
+       University Computing Service
+       Cambridge, England.
+
+
+REVISION
+
+       Last updated: 16 December 2015
+       Copyright (c) 1997-2015 University of Cambridge.
+------------------------------------------------------------------------------
+
+
+PCRE2BUILD(3)              Library Functions Manual              PCRE2BUILD(3)
+
+
+
+NAME
+       PCRE2 - Perl-compatible regular expressions (revised API)
+
+BUILDING PCRE2
+
+       PCRE2  is distributed with a configure script that can be used to build
+       the library in Unix-like environments using the applications  known  as
+       Autotools. Also in the distribution are files to support building using
+       CMake instead of configure.  The  text  file  README  contains  general
+       information  about  building  with Autotools (some of which is repeated
+       below), and also has some comments about building on various  operating
+       systems.  There  is a lot more information about building PCRE2 without
+       using Autotools (including information about using CMake  and  building
+       "by  hand")  in  the  text file called NON-AUTOTOOLS-BUILD.  You should
+       consult this file as well as the README file if you are building  in  a
+       non-Unix-like environment.
+
+
+PCRE2 BUILD-TIME OPTIONS
+
+       The rest of this document describes the optional features of PCRE2 that
+       can be selected when the library is compiled. It  assumes  use  of  the
+       configure  script,  where  the  optional features are selected or dese-
+       lected by providing options to configure before running the  make  com-
+       mand.  However,  the same options can be selected in both Unix-like and
+       non-Unix-like environments if you are using CMake instead of  configure
+       to build PCRE2.
+
+       If  you  are not using Autotools or CMake, option selection can be done
+       by editing the config.h file, or by passing parameter settings  to  the
+       compiler, as described in NON-AUTOTOOLS-BUILD.
+
+       The complete list of options for configure (which includes the standard
+       ones such as the  selection  of  the  installation  directory)  can  be
+       obtained by running
+
+         ./configure --help
+
+       The  following  sections  include  descriptions  of options whose names
+       begin with --enable or --disable. These settings specify changes to the
+       defaults  for  the configure command. Because of the way that configure
+       works, --enable and --disable always come in pairs, so  the  complemen-
+       tary  option always exists as well, but as it specifies the default, it
+       is not described.
+
+
+BUILDING 8-BIT, 16-BIT AND 32-BIT LIBRARIES
+
+       By default, a library called libpcre2-8 is built, containing  functions
+       that  take  string arguments contained in vectors of bytes, interpreted
+       either as single-byte characters, or UTF-8 strings. You can also  build
+       two  other libraries, called libpcre2-16 and libpcre2-32, which process
+       strings that are contained in vectors of 16-bit and 32-bit code  units,
+       respectively. These can be interpreted either as single-unit characters
+       or UTF-16/UTF-32 strings. To build these additional libraries, add  one
+       or both of the following to the configure command:
+
+         --enable-pcre2-16
+         --enable-pcre2-32
+
+       If you do not want the 8-bit library, add
+
+         --disable-pcre2-8
+
+       as  well.  At least one of the three libraries must be built. Note that
+       the POSIX wrapper is for the 8-bit library only, and that pcre2grep  is
+       an  8-bit  program.  Neither  of these are built if you select only the
+       16-bit or 32-bit libraries.
+
+
+BUILDING SHARED AND STATIC LIBRARIES
+
+       The Autotools PCRE2 building process uses libtool to build both  shared
+       and  static  libraries by default. You can suppress an unwanted library
+       by adding one of
+
+         --disable-shared
+         --disable-static
+
+       to the configure command.
+
+
+UNICODE AND UTF SUPPORT
+
+       By default, PCRE2 is built with support for Unicode and  UTF  character
+       strings.  To build it without Unicode support, add
+
+         --disable-unicode
+
+       to  the configure command. This setting applies to all three libraries.
+       It is not possible to build  one  library  with  Unicode  support,  and
+       another without, in the same configuration.
+
+       Of  itself, Unicode support does not make PCRE2 treat strings as UTF-8,
+       UTF-16 or UTF-32. To do that, applications that use the library can set
+       the  PCRE2_UTF  option when they call pcre2_compile() to compile a pat-
+       tern.  Alternatively, patterns may be started with  (*UTF)  unless  the
+       application has locked this out by setting PCRE2_NEVER_UTF.
+
+       UTF support allows the libraries to process character code points up to
+       0x10ffff in the strings that they handle. It also provides support  for
+       accessing  the  Unicode  properties  of  such characters, using pattern
+       escapes such as \P, \p, and \X. Only the  general  category  properties
+       such  as Lu and Nd are supported. Details are given in the pcre2pattern
+       documentation.
+
+       Pattern escapes such as \d and \w do not by default make use of Unicode
+       properties.  The  application  can  request that they do by setting the
+       PCRE2_UCP option. Unless the application  has  set  PCRE2_NEVER_UCP,  a
+       pattern may also request this by starting with (*UCP).
+
+
+DISABLING THE USE OF \C
+
+       The \C escape sequence, which matches a single code unit, even in a UTF
+       mode, can cause unpredictable behaviour because it may leave  the  cur-
+       rent  matching  point in the middle of a multi-code-unit character. The
+       application can lock it  out  by  setting  the  PCRE2_NEVER_BACKSLASH_C
+       option when calling pcre2_compile(). There is also a build-time option
+
+         --enable-never-backslash-C
+
+       (note the upper case C) which locks out the use of \C entirely.
+
+
+JUST-IN-TIME COMPILER SUPPORT
+
+       Just-in-time compiler support is included in the build by specifying
+
+         --enable-jit
+
+       This  support  is available only for certain hardware architectures. If
+       this option is set for an unsupported architecture,  a  building  error
+       occurs.   See the pcre2jit documentation for a discussion of JIT usage.
+       When JIT support is enabled, pcre2grep automatically makes use  of  it,
+       unless you add
+
+         --disable-pcre2grep-jit
+
+       to the "configure" command.
+
+
+NEWLINE RECOGNITION
+
+       By  default, PCRE2 interprets the linefeed (LF) character as indicating
+       the end of a line. This is the normal newline  character  on  Unix-like
+       systems.  You can compile PCRE2 to use carriage return (CR) instead, by
+       adding
+
+         --enable-newline-is-cr
+
+       to the configure  command.  There  is  also  an  --enable-newline-is-lf
+       option, which explicitly specifies linefeed as the newline character.
+
+       Alternatively, you can specify that line endings are to be indicated by
+       the two-character sequence CRLF (CR immediately followed by LF). If you
+       want this, add
+
+         --enable-newline-is-crlf
+
+       to the configure command. There is a fourth option, specified by
+
+         --enable-newline-is-anycrlf
+
+       which  causes  PCRE2 to recognize any of the three sequences CR, LF, or
+       CRLF as indicating a line ending. Finally, a fifth option, specified by
+
+         --enable-newline-is-any
+
+       causes PCRE2 to recognize any Unicode  newline  sequence.  The  Unicode
+       newline sequences are the three just mentioned, plus the single charac-
+       ters VT (vertical tab, U+000B), FF (form feed, U+000C), NEL (next line,
+       U+0085),  LS  (line  separator,  U+2028),  and PS (paragraph separator,
+       U+2029).
+
+       Whatever default line ending convention is selected when PCRE2 is built
+       can  be  overridden by applications that use the library. At build time
+       it is conventional to use the standard for your operating system.
+
+
+WHAT \R MATCHES
+
+       By default, the sequence \R in a pattern matches  any  Unicode  newline
+       sequence,  independently  of  what has been selected as the line ending
+       sequence. If you specify
+
+         --enable-bsr-anycrlf
+
+       the default is changed so that \R matches only CR, LF, or  CRLF.  What-
+       ever  is selected when PCRE2 is built can be overridden by applications
+       that use the called.
+
+
+HANDLING VERY LARGE PATTERNS
+
+       Within a compiled pattern, offset values are used  to  point  from  one
+       part  to another (for example, from an opening parenthesis to an alter-
+       nation metacharacter). By default, in the 8-bit and  16-bit  libraries,
+       two-byte  values  are used for these offsets, leading to a maximum size
+       for a compiled pattern of around 64K code units. This is sufficient  to
+       handle all but the most gigantic patterns. Nevertheless, some people do
+       want to process truly enormous patterns, so it is possible  to  compile
+       PCRE2  to  use three-byte or four-byte offsets by adding a setting such
+       as
+
+         --with-link-size=3
+
+       to the configure command. The value given must be 2, 3, or 4.  For  the
+       16-bit  library,  a  value of 3 is rounded up to 4. In these libraries,
+       using longer offsets slows down the operation of PCRE2 because  it  has
+       to  load additional data when handling them. For the 32-bit library the
+       value is always 4 and cannot be overridden; the value  of  --with-link-
+       size is ignored.
+
+
+AVOIDING EXCESSIVE STACK USAGE
+
+       When  matching  with the pcre2_match() function, PCRE2 implements back-
+       tracking by making recursive  calls  to  an  internal  function  called
+       match().  In  environments where the size of the stack is limited, this
+       can severely limit PCRE2's operation. (The Unix  environment  does  not
+       usually  suffer from this problem, but it may sometimes be necessary to
+       increase  the  maximum  stack  size.  There  is  a  discussion  in  the
+       pcre2stack  documentation.)  An  alternative approach to recursion that
+       uses memory from the heap to remember data, instead of using  recursive
+       function  calls, has been implemented to work round the problem of lim-
+       ited stack size. If you want to build a version  of  PCRE2  that  works
+       this way, add
+
+         --disable-stack-for-recursion
+
+       to the configure command. By default, the system functions malloc() and
+       free() are called to manage the heap memory that is required, but  cus-
+       tom  memory  management  functions  can  be  called instead. PCRE2 runs
+       noticeably more slowly when built in this way. This option affects only
+       the pcre2_match() function; it is not relevant for pcre2_dfa_match().
+
+
+LIMITING PCRE2 RESOURCE USAGE
+
+       Internally, PCRE2 has a function called match(), which it calls repeat-
+       edly  (sometimes  recursively)  when  matching  a  pattern   with   the
+       pcre2_match() function. By controlling the maximum number of times this
+       function may be called during a single matching operation, a limit  can
+       be  placed on the resources used by a single call to pcre2_match(). The
+       limit can be changed at run time, as described in the pcre2api documen-
+       tation.  The default is 10 million, but this can be changed by adding a
+       setting such as
+
+         --with-match-limit=500000
+
+       to  the  configure  command.  This  setting  has  no  effect   on   the
+       pcre2_dfa_match() matching function.
+
+       In  some  environments  it is desirable to limit the depth of recursive
+       calls of match() more strictly than the total number of calls, in order
+       to  restrict  the maximum amount of stack (or heap, if --disable-stack-
+       for-recursion is specified) that is used. A second limit controls this;
+       it  defaults  to  the  value  that is set for --with-match-limit, which
+       imposes no additional constraints. However, you can set a  lower  limit
+       by adding, for example,
+
+         --with-match-limit-recursion=10000
+
+       to  the  configure  command.  This  value can also be overridden at run
+       time.
+
+
+CREATING CHARACTER TABLES AT BUILD TIME
+
+       PCRE2 uses fixed tables for processing characters whose code points are
+       less than 256. By default, PCRE2 is built with a set of tables that are
+       distributed in the file src/pcre2_chartables.c.dist. These  tables  are
+       for ASCII codes only. If you add
+
+         --enable-rebuild-chartables
+
+       to  the  configure  command, the distributed tables are no longer used.
+       Instead, a program called dftables is compiled and  run.  This  outputs
+       the source for new set of tables, created in the default locale of your
+       C run-time system. (This method of replacing the tables does  not  work
+       if  you are cross compiling, because dftables is run on the local host.
+       If you need to create alternative tables when cross compiling, you will
+       have to do so "by hand".)
+
+
+USING EBCDIC CODE
+
+       PCRE2  assumes  by default that it will run in an environment where the
+       character code is ASCII or Unicode, which is a superset of ASCII.  This
+       is the case for most computer operating systems. PCRE2 can, however, be
+       compiled to run in an 8-bit EBCDIC environment by adding
+
+         --enable-ebcdic --disable-unicode
+
+       to the configure command. This setting implies --enable-rebuild-charta-
+       bles.  You  should  only  use  it if you know that you are in an EBCDIC
+       environment (for example, an IBM mainframe operating system).
+
+       It is not possible to support both EBCDIC and UTF-8 codes in  the  same
+       version  of  the  library. Consequently, --enable-unicode and --enable-
+       ebcdic are mutually exclusive.
+
+       The EBCDIC character that corresponds to an ASCII LF is assumed to have
+       the  value  0x15 by default. However, in some EBCDIC environments, 0x25
+       is used. In such an environment you should use
+
+         --enable-ebcdic-nl25
+
+       as well as, or instead of, --enable-ebcdic. The EBCDIC character for CR
+       has  the  same  value  as in ASCII, namely, 0x0d. Whichever of 0x15 and
+       0x25 is not chosen as LF is made to correspond to the Unicode NEL char-
+       acter (which, in Unicode, is 0x85).
+
+       The options that select newline behaviour, such as --enable-newline-is-
+       cr, and equivalent run-time options, refer to these character values in
+       an EBCDIC environment.
+
+
+PCRE2GREP OPTIONS FOR COMPRESSED FILE SUPPORT
+
+       By  default,  pcre2grep reads all files as plain text. You can build it
+       so that it recognizes files whose names end in .gz or .bz2,  and  reads
+       them with libz or libbz2, respectively, by adding one or both of
+
+         --enable-pcre2grep-libz
+         --enable-pcre2grep-libbz2
+
+       to the configure command. These options naturally require that the rel-
+       evant libraries are installed on your system. Configuration  will  fail
+       if they are not.
+
+
+PCRE2GREP BUFFER SIZE
+
+       pcre2grep  uses an internal buffer to hold a "window" on the file it is
+       scanning, in order to be able to output "before" and "after" lines when
+       it  finds  a match. The size of the buffer is controlled by a parameter
+       whose default value is 20K. The buffer itself is three times this size,
+       but because of the way it is used for holding "before" lines, the long-
+       est line that is guaranteed to be processable is  the  parameter  size.
+       You can change the default parameter value by adding, for example,
+
+         --with-pcre2grep-bufsize=50K
+
+       to  the  configure  command.  The caller of pcre2grep can override this
+       value by using --buffer-size on the command line..
+
+
+PCRE2TEST OPTION FOR LIBREADLINE SUPPORT
+
+       If you add one of
+
+         --enable-pcre2test-libreadline
+         --enable-pcre2test-libedit
+
+       to the configure command, pcre2test  is  linked  with  the  libreadline
+       orlibedit library, respectively, and when its input is from a terminal,
+       it reads it using the readline() function. This  provides  line-editing
+       and  history  facilities.  Note that libreadline is GPL-licensed, so if
+       you distribute a binary of pcre2test linked in this way, there  may  be
+       licensing issues. These can be avoided by linking instead with libedit,
+       which has a BSD licence.
+
+       Setting --enable-pcre2test-libreadline causes the -lreadline option  to
+       be  added to the pcre2test build. In many operating environments with a
+       sytem-installed readline library this is sufficient. However,  in  some
+       environments (e.g. if an unmodified distribution version of readline is
+       in use), some extra configuration may be necessary.  The  INSTALL  file
+       for libreadline says this:
+
+         "Readline uses the termcap functions, but does not link with
+         the termcap or curses library itself, allowing applications
+         which link with readline the to choose an appropriate library."
+
+       If  your environment has not been set up so that an appropriate library
+       is automatically included, you may need to add something like
+
+         LIBS="-ncurses"
+
+       immediately before the configure command.
+
+
+INCLUDING DEBUGGING CODE
+
+       If you add
+
+         --enable-debug
+
+       to the configure command, additional debugging code is included in  the
+       build. This feature is intended for use by the PCRE2 maintainers.
+
+
+DEBUGGING WITH VALGRIND SUPPORT
+
+       If you add
+
+         --enable-valgrind
+
+       to  the  configure command, PCRE2 will use valgrind annotations to mark
+       certain memory regions as  unaddressable.  This  allows  it  to  detect
+       invalid  memory  accesses,  and  is  mostly  useful for debugging PCRE2
+       itself.
+
+
+CODE COVERAGE REPORTING
+
+       If your C compiler is gcc, you can build a version of  PCRE2  that  can
+       generate a code coverage report for its test suite. To enable this, you
+       must install lcov version 1.6 or above. Then specify
+
+         --enable-coverage
+
+       to the configure command and build PCRE2 in the usual way.
+
+       Note that using ccache (a caching C compiler) is incompatible with code
+       coverage  reporting. If you have configured ccache to run automatically
+       on your system, you must set the environment variable
+
+         CCACHE_DISABLE=1
+
+       before running make to build PCRE2, so that ccache is not used.
+
+       When --enable-coverage is used,  the  following  addition  targets  are
+       added to the Makefile:
+
+         make coverage
+
+       This  creates  a  fresh coverage report for the PCRE2 test suite. It is
+       equivalent to running "make coverage-reset", "make  coverage-baseline",
+       "make check", and then "make coverage-report".
+
+         make coverage-reset
+
+       This zeroes the coverage counters, but does nothing else.
+
+         make coverage-baseline
+
+       This captures baseline coverage information.
+
+         make coverage-report
+
+       This creates the coverage report.
+
+         make coverage-clean-report
+
+       This  removes the generated coverage report without cleaning the cover-
+       age data itself.
+
+         make coverage-clean-data
+
+       This removes the captured coverage data without removing  the  coverage
+       files created at compile time (*.gcno).
+
+         make coverage-clean
+
+       This  cleans all coverage data including the generated coverage report.
+       For more information about code coverage, see the gcov and  lcov  docu-
+       mentation.
+
+
+SEE ALSO
+
+       pcre2api(3), pcre2-config(3).
+
+
+AUTHOR
+
+       Philip Hazel
+       University Computing Service
+       Cambridge, England.
+
+
+REVISION
+
+       Last updated: 16 October 2015
+       Copyright (c) 1997-2015 University of Cambridge.
+------------------------------------------------------------------------------
+
+
+PCRE2CALLOUT(3)            Library Functions Manual            PCRE2CALLOUT(3)
+
+
+
+NAME
+       PCRE2 - Perl-compatible regular expressions (revised API)
+
+SYNOPSIS
+
+       #include <pcre2.h>
+
+       int (*pcre2_callout)(pcre2_callout_block *, void *);
+
+       int pcre2_callout_enumerate(const pcre2_code *code,
+         int (*callback)(pcre2_callout_enumerate_block *, void *),
+         void *user_data);
+
+
+DESCRIPTION
+
+       PCRE2  provides  a feature called "callout", which is a means of tempo-
+       rarily passing control to the caller of PCRE2 in the middle of  pattern
+       matching.  The caller of PCRE2 provides an external function by putting
+       its entry point in a match  context  (see  pcre2_set_callout()  in  the
+       pcre2api documentation).
+
+       Within  a  regular expression, (?C<arg>) indicates a point at which the
+       external function is to be called.  Different  callout  points  can  be
+       identified  by  putting  a number less than 256 after the letter C. The
+       default value is zero.  Alternatively, the argument may be a  delimited
+       string.  The  starting delimiter must be one of ` ' " ^ % # $ { and the
+       ending delimiter is the same as the start, except for {, where the end-
+       ing  delimiter  is  }.  If  the  ending  delimiter is needed within the
+       string, it must be doubled. For example, this pattern has  two  callout
+       points:
+
+         (?C1)abc(?C"some ""arbitrary"" text")def
+
+       If the PCRE2_AUTO_CALLOUT option bit is set when a pattern is compiled,
+       PCRE2 automatically inserts callouts, all with number 255, before  each
+       item  in  the  pattern. For example, if PCRE2_AUTO_CALLOUT is used with
+       the pattern
+
+         A(\d{2}|--)
+
+       it is processed as if it were
+
+       (?C255)A(?C255)((?C255)\d{2}(?C255)|(?C255)-(?C255)-(?C255))(?C255)
+
+       Notice that there is a callout before and after  each  parenthesis  and
+       alternation bar. If the pattern contains a conditional group whose con-
+       dition is an assertion, an automatic callout  is  inserted  immediately
+       before  the  condition. Such a callout may also be inserted explicitly,
+       for example:
+
+         (?(?C9)(?=a)ab|de)  (?(?C%text%)(?!=d)ab|de)
+
+       This applies only to assertion conditions (because they are  themselves
+       independent groups).
+
+       Callouts  can  be useful for tracking the progress of pattern matching.
+       The pcre2test program has a pattern qualifier (/auto_callout) that sets
+       automatic  callouts.   When  any  callouts are present, the output from
+       pcre2test indicates how the pattern is being matched.  This  is  useful
+       information  when  you are trying to optimize the performance of a par-
+       ticular pattern.
+
+
+MISSING CALLOUTS
+
+       You should be aware that, because of optimizations  in  the  way  PCRE2
+       compiles and matches patterns, callouts sometimes do not happen exactly
+       as you might expect.
+
+   Auto-possessification
+
+       At compile time, PCRE2 "auto-possessifies" repeated items when it knows
+       that  what follows cannot be part of the repeat. For example, a+[bc] is
+       compiled as if it were a++[bc]. The pcre2test output when this  pattern
+       is compiled with PCRE2_ANCHORED and PCRE2_AUTO_CALLOUT and then applied
+       to the string "aaaa" is:
+
+         --->aaaa
+          +0 ^        a+
+          +2 ^   ^    [bc]
+         No match
+
+       This indicates that when matching [bc] fails, there is no  backtracking
+       into  a+  and  therefore the callouts that would be taken for the back-
+       tracks do not occur.  You can disable the  auto-possessify  feature  by
+       passing  PCRE2_NO_AUTO_POSSESS to pcre2_compile(), or starting the pat-
+       tern with (*NO_AUTO_POSSESS). In this case, the output changes to this:
+
+         --->aaaa
+          +0 ^        a+
+          +2 ^   ^    [bc]
+          +2 ^  ^     [bc]
+          +2 ^ ^      [bc]
+          +2 ^^       [bc]
+         No match
+
+       This time, when matching [bc] fails, the matcher backtracks into a+ and
+       tries again, repeatedly, until a+ itself fails.
+
+   Automatic .* anchoring
+
+       By default, an optimization is applied when .* is the first significant
+       item in a pattern. If PCRE2_DOTALL is set, so that the  dot  can  match
+       any  character,  the pattern is automatically anchored. If PCRE2_DOTALL
+       is not set, a match can start only after an internal newline or at  the
+       beginning  of  the  subject,  and  pcre2_compile() remembers this. This
+       optimization is disabled, however, if .* is in an atomic  group  or  if
+       there  is  a back reference to the capturing group in which it appears.
+       It is also disabled if the pattern contains (*PRUNE) or  (*SKIP).  How-
+       ever, the presence of callouts does not affect it.
+
+       For  example,  if  the pattern .*\d is compiled with PCRE2_AUTO_CALLOUT
+       and applied to the string "aa", the pcre2test output is:
+
+         --->aa
+          +0 ^      .*
+          +2 ^ ^    \d
+          +2 ^^     \d
+          +2 ^      \d
+         No match
+
+       This shows that all match attempts start at the beginning of  the  sub-
+       ject.  In  other  words,  the pattern is anchored. You can disable this
+       optimization by passing PCRE2_NO_DOTSTAR_ANCHOR to pcre2_compile(),  or
+       starting  the pattern with (*NO_DOTSTAR_ANCHOR). In this case, the out-
+       put changes to:
+
+         --->aa
+          +0 ^      .*
+          +2 ^ ^    \d
+          +2 ^^     \d
+          +2 ^      \d
+          +0  ^     .*
+          +2  ^^    \d
+          +2  ^     \d
+         No match
+
+       This shows more match attempts, starting at the second subject  charac-
+       ter.   Another  optimization, described in the next section, means that
+       there is no subsequent attempt to match with an empty subject.
+
+       If a pattern has more than one top-level  branch,  automatic  anchoring
+       occurs if all branches are anchorable.
+
+   Other optimizations
+
+       Other  optimizations  that  provide fast "no match" results also affect
+       callouts.  For example, if the pattern is
+
+         ab(?C4)cd
+
+       PCRE2 knows that any matching string must contain the  letter  "d".  If
+       the  subject  string  is  "abyz",  the  lack of "d" means that matching
+       doesn't ever start, and the callout is  never  reached.  However,  with
+       "abyd", though the result is still no match, the callout is obeyed.
+
+       PCRE2  also  knows  the  minimum  length of a matching string, and will
+       immediately give a "no match" return without actually running  a  match
+       if  the  subject is not long enough, or, for unanchored patterns, if it
+       has been scanned far enough.
+
+       You can disable these optimizations by passing the PCRE2_NO_START_OPTI-
+       MIZE  option  to  pcre2_compile(),  or  by  starting  the  pattern with
+       (*NO_START_OPT). This slows down the matching process, but does  ensure
+       that callouts such as the example above are obeyed.
+
+
+THE CALLOUT INTERFACE
+
+       During  matching,  when  PCRE2  reaches a callout point, if an external
+       function is set in the match context, it is  called.  This  applies  to
+       both  normal  and DFA matching. The first argument to the callout func-
+       tion is a pointer to a pcre2_callout block. The second argument is  the
+       void  *  callout  data that was supplied when the callout was set up by
+       calling pcre2_set_callout() (see the pcre2api documentation). The call-
+       out block structure contains the following fields:
+
+         uint32_t      version;
+         uint32_t      callout_number;
+         uint32_t      capture_top;
+         uint32_t      capture_last;
+         PCRE2_SIZE   *offset_vector;
+         PCRE2_SPTR    mark;
+         PCRE2_SPTR    subject;
+         PCRE2_SIZE    subject_length;
+         PCRE2_SIZE    start_match;
+         PCRE2_SIZE    current_position;
+         PCRE2_SIZE    pattern_position;
+         PCRE2_SIZE    next_item_length;
+         PCRE2_SIZE    callout_string_offset;
+         PCRE2_SIZE    callout_string_length;
+         PCRE2_SPTR    callout_string;
+
+       The  version field contains the version number of the block format. The
+       current version is 1; the three callout string fields  were  added  for
+       this  version. If you are writing an application that might use an ear-
+       lier release of PCRE2, you  should  check  the  version  number  before
+       accessing  any  of  these  fields.  The version number will increase in
+       future if more fields are added, but the intention is never  to  remove
+       any of the existing fields.
+
+   Fields for numerical callouts
+
+       For  a  numerical  callout,  callout_string is NULL, and callout_number
+       contains the number of the callout, in the range  0-255.  This  is  the
+       number  that  follows  (?C for manual callouts; it is 255 for automati-
+       cally generated callouts.
+
+   Fields for string callouts
+
+       For callouts with string arguments, callout_number is always zero,  and
+       callout_string  points  to the string that is contained within the com-
+       piled pattern. Its length is given by callout_string_length. Duplicated
+       ending delimiters that were present in the original pattern string have
+       been turned into single characters, but there is no other processing of
+       the  callout string argument. An additional code unit containing binary
+       zero is present after the string, but is not included  in  the  length.
+       The  delimiter  that was used to start the string is also stored within
+       the pattern, immediately before the string itself. You can access  this
+       delimiter as callout_string[-1] if you need it.
+
+       The callout_string_offset field is the code unit offset to the start of
+       the callout argument string within the original pattern string. This is
+       provided  for the benefit of applications such as script languages that
+       might need to report errors in the callout string within the pattern.
+
+   Fields for all callouts
+
+       The remaining fields in the callout block are the same for  both  kinds
+       of callout.
+
+       The offset_vector field is a pointer to the vector of capturing offsets
+       (the "ovector") that was passed to the matching function in  the  match
+       data  block.  When pcre2_match() is used, the contents can be inspected
+       in order to extract substrings that have been matched so  far,  in  the
+       same  way as for extracting substrings after a match has completed. For
+       the DFA matching function, this field is not useful.
+
+       The subject and subject_length fields contain copies of the values that
+       were passed to the matching function.
+
+       The  start_match  field normally contains the offset within the subject
+       at which the current match attempt  started.  However,  if  the  escape
+       sequence  \K has been encountered, this value is changed to reflect the
+       modified starting point. If the pattern is not  anchored,  the  callout
+       function may be called several times from the same point in the pattern
+       for different starting points in the subject.
+
+       The current_position field contains the offset within  the  subject  of
+       the current match pointer.
+
+       When the pcre2_match() is used, the capture_top field contains one more
+       than the number of the highest numbered captured substring so  far.  If
+       no substrings have been captured, the value of capture_top is one. This
+       is always the case when the DFA functions are used, because they do not
+       support captured substrings.
+
+       The  capture_last  field  contains the number of the most recently cap-
+       tured substring. However, when a recursion exits, the value reverts  to
+       what  it  was  outside  the recursion, as do the values of all captured
+       substrings. If no substrings have been  captured,  the  value  of  cap-
+       ture_last is 0. This is always the case for the DFA matching functions.
+
+       The pattern_position field contains the offset in the pattern string to
+       the next item to be matched.
+
+       The next_item_length field contains the length of the next item  to  be
+       matched in the pattern string. When the callout immediately precedes an
+       alternation bar, a closing parenthesis, or the end of the pattern,  the
+       length  is  zero. When the callout precedes an opening parenthesis, the
+       length is that of the entire subpattern.
+
+       The pattern_position and next_item_length fields are intended  to  help
+       in  distinguishing between different automatic callouts, which all have
+       the same callout number. However, they are set for  all  callouts,  and
+       are used by pcre2test to show the next item to be matched when display-
+       ing callout information.
+
+       In callouts from pcre2_match() the mark field contains a pointer to the
+       zero-terminated  name of the most recently passed (*MARK), (*PRUNE), or
+       (*THEN) item in the match, or NULL if no such items have  been  passed.
+       Instances  of  (*PRUNE)  or  (*THEN) without a name do not obliterate a
+       previous (*MARK). In callouts from the DFA matching function this field
+       always contains NULL.
+
+
+RETURN VALUES FROM CALLOUTS
+
+       The external callout function returns an integer to PCRE2. If the value
+       is zero, matching proceeds as normal. If  the  value  is  greater  than
+       zero,  matching  fails  at  the current point, but the testing of other
+       matching possibilities goes ahead, just as if a lookahead assertion had
+       failed. If the value is less than zero, the match is abandoned, and the
+       matching function returns the negative value.
+
+       Negative  values  should  normally  be   chosen   from   the   set   of
+       PCRE2_ERROR_xxx  values.  In  particular,  PCRE2_ERROR_NOMATCH forces a
+       standard "no match" failure. The error  number  PCRE2_ERROR_CALLOUT  is
+       reserved  for  use by callout functions; it will never be used by PCRE2
+       itself.
+
+
+CALLOUT ENUMERATION
+
+       int pcre2_callout_enumerate(const pcre2_code *code,
+         int (*callback)(pcre2_callout_enumerate_block *, void *),
+         void *user_data);
+
+       A script language that supports the use of string arguments in callouts
+       might  like  to  scan  all the callouts in a pattern before running the
+       match. This can be done by calling pcre2_callout_enumerate(). The first
+       argument  is  a  pointer  to a compiled pattern, the second points to a
+       callback function, and the third is arbitrary user data.  The  callback
+       function  is  called  for  every callout in the pattern in the order in
+       which they appear. Its first argument is a pointer to a callout enumer-
+       ation  block,  and  its second argument is the user_data value that was
+       passed to pcre2_callout_enumerate(). The data block contains  the  fol-
+       lowing fields:
+
+         version                Block version number
+         pattern_position       Offset to next item in pattern
+         next_item_length       Length of next item in pattern
+         callout_number         Number for numbered callouts
+         callout_string_offset  Offset to string within pattern
+         callout_string_length  Length of callout string
+         callout_string         Points to callout string or is NULL
+
+       The  version  number is currently 0. It will increase if new fields are
+       ever added to the block. The remaining fields are  the  same  as  their
+       namesakes  in  the pcre2_callout block that is used for callouts during
+       matching, as described above.
+
+       Note that the value of pattern_position is  unique  for  each  callout.
+       However,  if  a callout occurs inside a group that is quantified with a
+       non-zero minimum or a fixed maximum, the group is replicated inside the
+       compiled  pattern.  For example, a pattern such as /(a){2}/ is compiled
+       as if it were /(a)(a)/. This means that the callout will be  enumerated
+       more  than  once,  but with the same value for pattern_position in each
+       case.
+
+       The callback function should normally return zero. If it returns a non-
+       zero value, scanning the pattern stops, and that value is returned from
+       pcre2_callout_enumerate().
+
+
+AUTHOR
+
+       Philip Hazel
+       University Computing Service
+       Cambridge, England.
+
+
+REVISION
+
+       Last updated: 23 March 2015
+       Copyright (c) 1997-2015 University of Cambridge.
+------------------------------------------------------------------------------
+
+
+PCRE2COMPAT(3)             Library Functions Manual             PCRE2COMPAT(3)
+
+
+
+NAME
+       PCRE2 - Perl-compatible regular expressions (revised API)
+
+DIFFERENCES BETWEEN PCRE2 AND PERL
+
+       This document describes the differences in the ways that PCRE2 and Perl
+       handle regular expressions. The differences  described  here  are  with
+       respect to Perl versions 5.10 and above.
+
+       1.  PCRE2  has only a subset of Perl's Unicode support. Details of what
+       it does have are given in the pcre2unicode page.
+
+       2. PCRE2 allows repeat quantifiers only  on  parenthesized  assertions,
+       but  they  do not mean what you might think. For example, (?!a){3} does
+       not assert that the next three characters are not "a". It just  asserts
+       that  the  next  character  is not "a" three times (in principle: PCRE2
+       optimizes this to run the assertion  just  once).  Perl  allows  repeat
+       quantifiers  on  other  assertions such as \b, but these do not seem to
+       have any use.
+
+       3. Capturing subpatterns that occur inside  negative  lookahead  asser-
+       tions  are  counted,  but their entries in the offsets vector are never
+       set. Perl sometimes (but not always) sets its numerical variables  from
+       inside negative assertions.
+
+       4.  The  following Perl escape sequences are not supported: \l, \u, \L,
+       \U, and \N when followed by a character name or Unicode value.  (\N  on
+       its own, matching a non-newline character, is supported.) In fact these
+       are implemented by Perl's general string-handling and are not  part  of
+       its  pattern matching engine. If any of these are encountered by PCRE2,
+       an error is generated by default. However, if the PCRE2_ALT_BSUX option
+       is set, \U and \u are interpreted as ECMAScript interprets them.
+
+       5. The Perl escape sequences \p, \P, and \X are supported only if PCRE2
+       is built with Unicode support. The properties that can be  tested  with
+       \p and \P are limited to the general category properties such as Lu and
+       Nd, script names such as Greek or Han, and the derived  properties  Any
+       and L&. PCRE2 does support the Cs (surrogate) property, which Perl does
+       not; the Perl documentation says "Because Perl hides the need  for  the
+       user  to  understand the internal representation of Unicode characters,
+       there is no need to implement the  somewhat  messy  concept  of  surro-
+       gates."
+
+       6.  PCRE2 does support the \Q...\E escape for quoting substrings. Char-
+       acters in between are treated as literals. This is  slightly  different
+       from  Perl  in  that  $  and  @ are also handled as literals inside the
+       quotes. In Perl, they cause variable interpolation (but of course PCRE2
+       does not have variables).  Note the following examples:
+
+           Pattern            PCRE2 matches      Perl matches
+
+           \Qabc$xyz\E        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.
+
+       7.  Fairly  obviously,  PCRE2  does  not  support  the  (?{code})   and
+       (??{code})  constructions. However, there is support for recursive pat-
+       terns. This is not available in Perl 5.8, but it is in Perl 5.10. Also,
+       the  PCRE2  "callout"  feature allows an external function to be called
+       during  pattern  matching.  See  the  pcre2callout  documentation   for
+       details.
+
+       8.  Subroutine  calls  (whether recursive or not) are treated as atomic
+       groups.  Atomic recursion is like Python,  but  unlike  Perl.  Captured
+       values  that  are  set outside a subroutine call can be referenced from
+       inside in PCRE2, but not in Perl. There is a discussion  that  explains
+       these  differences  in  more detail in the section on recursion differ-
+       ences from Perl in the pcre2pattern page.
+
+       9. If any of the backtracking control verbs are used  in  a  subpattern
+       that  is  called  as  a  subroutine (whether or not recursively), their
+       effect is confined to that subpattern; it does not extend to  the  sur-
+       rounding  pattern.  This is not always the case in Perl. In particular,
+       if (*THEN) is present in a group that is called as  a  subroutine,  its
+       action is limited to that group, even if the group does not contain any
+       | characters. Note that such subpatterns are processed as  anchored  at
+       the point where they are tested.
+
+       10.  If a pattern contains more than one backtracking control verb, the
+       first one that is backtracked onto acts. For example,  in  the  pattern
+       A(*COMMIT)B(*PRUNE)C  a  failure in B triggers (*COMMIT), but a failure
+       in C triggers (*PRUNE). Perl's behaviour is more complex; in many cases
+       it is the same as PCRE2, but there are examples where it differs.
+
+       11.  Most  backtracking  verbs in assertions have their normal actions.
+       They are not confined to the assertion.
+
+       12. There are some differences that are concerned with the settings  of
+       captured  strings  when  part  of  a  pattern is repeated. For example,
+       matching "aba" against the  pattern  /^(a(b)?)+$/  in  Perl  leaves  $2
+       unset, but in PCRE2 it is set to "b".
+
+       13. PCRE2's handling of duplicate subpattern numbers and duplicate sub-
+       pattern names is not as general as Perl's. This is a consequence of the
+       fact  the  PCRE2  works internally just with numbers, using an external
+       table to translate between numbers and names. In particular, a  pattern
+       such  as  (?|(?<a>A)|(?<b)B),  where the two capturing parentheses have
+       the same number but different names, is not supported,  and  causes  an
+       error  at compile time. If it were allowed, it would not be possible to
+       distinguish which parentheses matched, because both names map  to  cap-
+       turing subpattern number 1. To avoid this confusing situation, an error
+       is given at compile time.
+
+       14. Perl recognizes comments in some places that PCRE2  does  not,  for
+       example,  between  the  ( and ? at the start of a subpattern. If the /x
+       modifier is set, Perl allows white space between ( and ?  (though  cur-
+       rent  Perls warn that this is deprecated) but PCRE2 never does, even if
+       the PCRE2_EXTENDED option is set.
+
+       15. Perl, when in warning mode, gives warnings  for  character  classes
+       such  as  [A-\d] or [a-[:digit:]]. It then treats the hyphens as liter-
+       als. PCRE2 has no warning features, so it gives an error in these cases
+       because they are almost certainly user mistakes.
+
+       16.  In  PCRE2, the upper/lower case character properties Lu and Ll are
+       not affected when case-independent matching is specified. For  example,
+       \p{Lu} always matches an upper case letter. I think Perl has changed in
+       this respect; in the release at the time of writing (5.16), \p{Lu}  and
+       \p{Ll} match all letters, regardless of case, when case independence is
+       specified.
+
+       17. PCRE2 provides some  extensions  to  the  Perl  regular  expression
+       facilities.   Perl  5.10  includes new features that are not in earlier
+       versions of Perl, some of which (such as named parentheses)  have  been
+       in PCRE2 for some time. This list is with respect to Perl 5.10:
+
+       (a)  Although  lookbehind  assertions  in PCRE2 must match fixed length
+       strings, each alternative branch of a lookbehind assertion can match  a
+       different  length  of  string.  Perl requires them all to have the same
+       length.
+
+       (b) If PCRE2_DOLLAR_ENDONLY is set and PCRE2_MULTILINE is not set,  the
+       $ meta-character matches only at the very end of the string.
+
+       (c)  A  backslash  followed  by  a  letter  with  no special meaning is
+       faulted. (Perl can be made to issue a warning.)
+
+       (d) If PCRE2_UNGREEDY is set, the greediness of the repetition  quanti-
+       fiers is inverted, that is, by default they are not greedy, but if fol-
+       lowed by a question mark they are.
+
+       (e) PCRE2_ANCHORED can be used at matching time to force a  pattern  to
+       be tried only at the first matching position in the subject string.
+
+       (f)      The      PCRE2_NOTBOL,      PCRE2_NOTEOL,      PCRE2_NOTEMPTY,
+       PCRE2_NOTEMPTY_ATSTART, and PCRE2_NO_AUTO_CAPTURE options have no  Perl
+       equivalents.
+
+       (g)  The  \R escape sequence can be restricted to match only CR, LF, or
+       CRLF by the PCRE2_BSR_ANYCRLF option.
+
+       (h) The callout facility is PCRE2-specific.
+
+       (i) The partial matching facility is PCRE2-specific.
+
+       (j) The alternative matching function (pcre2_dfa_match() matches  in  a
+       different way and is not Perl-compatible.
+
+       (k)  PCRE2 recognizes some special sequences such as (*CR) at the start
+       of a pattern that set overall options that cannot be changed within the
+       pattern.
+
+
+AUTHOR
+
+       Philip Hazel
+       University Computing Service
+       Cambridge, England.
+
+
+REVISION
+
+       Last updated: 15 March 2015
+       Copyright (c) 1997-2015 University of Cambridge.
+------------------------------------------------------------------------------
+
+
+PCRE2JIT(3)                Library Functions Manual                PCRE2JIT(3)
+
+
+
+NAME
+       PCRE2 - Perl-compatible regular expressions (revised API)
+
+PCRE2 JUST-IN-TIME COMPILER SUPPORT
+
+       Just-in-time  compiling  is a heavyweight optimization that can greatly
+       speed up pattern matching. However, it comes at the cost of extra  pro-
+       cessing  before  the  match is performed, so it is of most benefit when
+       the same pattern is going to be matched many times. This does not  nec-
+       essarily  mean many calls of a matching function; if the pattern is not
+       anchored, matching attempts may take place many times at various  posi-
+       tions in the subject, even for a single call. Therefore, if the subject
+       string is very long, it may still pay  to  use  JIT  even  for  one-off
+       matches.  JIT  support  is  available  for all of the 8-bit, 16-bit and
+       32-bit PCRE2 libraries.
+
+       JIT support applies only to the  traditional  Perl-compatible  matching
+       function.   It  does  not apply when the DFA matching function is being
+       used. The code for this support was written by Zoltan Herczeg.
+
+
+AVAILABILITY OF JIT SUPPORT
+
+       JIT support is an optional feature of  PCRE2.  The  "configure"  option
+       --enable-jit  (or  equivalent  CMake  option) must be set when PCRE2 is
+       built if you want to use JIT. The support is limited to  the  following
+       hardware platforms:
+
+         ARM 32-bit (v5, v7, and Thumb2)
+         ARM 64-bit
+         Intel x86 32-bit and 64-bit
+         MIPS 32-bit and 64-bit
+         Power PC 32-bit and 64-bit
+         SPARC 32-bit
+
+       If --enable-jit is set on an unsupported platform, compilation fails.
+
+       A  program  can  tell if JIT support is available by calling pcre2_con-
+       fig() with the PCRE2_CONFIG_JIT option. The result is  1  when  JIT  is
+       available,  and 0 otherwise. However, a simple program does not need to
+       check this in order to use JIT. The API is implemented in  a  way  that
+       falls  back  to the interpretive code if JIT is not available. For pro-
+       grams that need the best possible performance, there is  also  a  "fast
+       path" API that is JIT-specific.
+
+
+SIMPLE USE OF JIT
+
+       To  make use of the JIT support in the simplest way, all you have to do
+       is to call pcre2_jit_compile() after successfully compiling  a  pattern
+       with pcre2_compile(). This function has two arguments: the first is the
+       compiled pattern pointer that was returned by pcre2_compile(), and  the
+       second  is  zero  or  more of the following option bits: PCRE2_JIT_COM-
+       PLETE, PCRE2_JIT_PARTIAL_HARD, or PCRE2_JIT_PARTIAL_SOFT.
+
+       If JIT support is not available, a  call  to  pcre2_jit_compile()  does
+       nothing  and returns PCRE2_ERROR_JIT_BADOPTION. Otherwise, the compiled
+       pattern is passed to the JIT compiler, which turns it into machine code
+       that executes much faster than the normal interpretive code, but yields
+       exactly the same results. The returned value  from  pcre2_jit_compile()
+       is zero on success, or a negative error code.
+
+       There  is  a limit to the size of pattern that JIT supports, imposed by
+       the size of machine stack that it uses. The exact rules are  not  docu-
+       mented  because  they  may  change at any time, in particular, when new
+       optimizations are introduced.  If a pattern  is  too  big,  a  call  to
+       pcre2_jit_compile() returns PCRE2_ERROR_NOMEMORY.
+
+       PCRE2_JIT_COMPLETE  requests the JIT compiler to generate code for com-
+       plete matches. If you want to run partial matches using the  PCRE2_PAR-
+       TIAL_HARD  or  PCRE2_PARTIAL_SOFT  options of pcre2_match(), you should
+       set one or both of  the  other  options  as  well  as,  or  instead  of
+       PCRE2_JIT_COMPLETE. The JIT compiler generates different optimized code
+       for each of the three modes (normal, soft partial, hard partial).  When
+       pcre2_match()  is  called,  the appropriate code is run if it is avail-
+       able. Otherwise, the pattern is matched using interpretive code.
+
+       You can call pcre2_jit_compile() multiple times for the  same  compiled
+       pattern.  It does nothing if it has previously compiled code for any of
+       the option bits. For example, you can call it once with  PCRE2_JIT_COM-
+       PLETE  and  (perhaps  later,  when  you find you need partial matching)
+       again with PCRE2_JIT_COMPLETE and PCRE2_JIT_PARTIAL_HARD. This time  it
+       will ignore PCRE2_JIT_COMPLETE and just compile code for partial match-
+       ing. If pcre2_jit_compile() is called with no option bits set, it imme-
+       diately returns zero. This is an alternative way of testing whether JIT
+       is available.
+
+       At present, it is not possible to free JIT compiled  code  except  when
+       the entire compiled pattern is freed by calling pcre2_code_free().
+
+       In  some circumstances you may need to call additional functions. These
+       are described in the  section  entitled  "Controlling  the  JIT  stack"
+       below.
+
+       There are some pcre2_match() options that are not supported by JIT, and
+       there are also some pattern items that JIT cannot handle.  Details  are
+       given  below.  In  both cases, matching automatically falls back to the
+       interpretive code. If you want to know whether JIT  was  actually  used
+       for  a particular match, you should arrange for a JIT callback function
+       to be set up as described in the section entitled "Controlling the  JIT
+       stack"  below,  even  if  you  do  not need to supply a non-default JIT
+       stack. Such a callback function is called whenever JIT code is about to
+       be  obeyed.  If the match-time options are not right for JIT execution,
+       the callback function is not obeyed.
+
+       If the JIT compiler finds an unsupported item, no JIT  data  is  gener-
+       ated.  You  can find out if JIT matching is available after compiling a
+       pattern by calling  pcre2_pattern_info()  with  the  PCRE2_INFO_JITSIZE
+       option.  A non-zero result means that JIT compilation was successful. A
+       result of 0 means that JIT support is not available, or the pattern was
+       not  processed by pcre2_jit_compile(), or the JIT compiler was not able
+       to handle the pattern.
+
+
+UNSUPPORTED OPTIONS AND PATTERN ITEMS
+
+       The pcre2_match() options that  are  supported  for  JIT  matching  are
+       PCRE2_NOTBOL,   PCRE2_NOTEOL,  PCRE2_NOTEMPTY,  PCRE2_NOTEMPTY_ATSTART,
+       PCRE2_NO_UTF_CHECK,  PCRE2_PARTIAL_HARD,  and  PCRE2_PARTIAL_SOFT.  The
+       PCRE2_ANCHORED option is not supported at match time.
+
+       The  only  unsupported  pattern items are \C (match a single data unit)
+       when running in a UTF mode, and a callout immediately before an  asser-
+       tion condition in a conditional group.
+
+
+RETURN VALUES FROM JIT MATCHING
+
+       When a pattern is matched using JIT matching, the return values are the
+       same as those given by the interpretive pcre2_match()  code,  with  the
+       addition  of one new error code: PCRE2_ERROR_JIT_STACKLIMIT. This means
+       that the memory used for the JIT stack was insufficient. See  "Control-
+       ling the JIT stack" below for a discussion of JIT stack usage.
+
+       The  error  code  PCRE2_ERROR_MATCHLIMIT is returned by the JIT code if
+       searching a very large pattern tree goes on for too long, as it  is  in
+       the  same circumstance when JIT is not used, but the details of exactly
+       what is counted are not the same. The PCRE2_ERROR_RECURSIONLIMIT  error
+       code is never returned when JIT matching is used.
+
+
+CONTROLLING THE JIT STACK
+
+       When the compiled JIT code runs, it needs a block of memory to use as a
+       stack.  By default, it uses 32K on the  machine  stack.  However,  some
+       large   or   complicated  patterns  need  more  than  this.  The  error
+       PCRE2_ERROR_JIT_STACKLIMIT is given when there  is  not  enough  stack.
+       Three  functions  are provided for managing blocks of memory for use as
+       JIT stacks. There is further discussion about the use of JIT stacks  in
+       the section entitled "JIT stack FAQ" below.
+
+       The  pcre2_jit_stack_create()  function  creates a JIT stack. Its argu-
+       ments are a starting size, a maximum size, and a general  context  (for
+       memory  allocation  functions, or NULL for standard memory allocation).
+       It returns a pointer to an opaque structure of type pcre2_jit_stack, or
+       NULL  if there is an error. The pcre2_jit_stack_free() function is used
+       to free a stack that is no longer needed. (For the technically  minded:
+       the address space is allocated by mmap or VirtualAlloc.)
+
+       JIT  uses far less memory for recursion than the interpretive code, and
+       a maximum stack size of 512K to 1M should be more than enough  for  any
+       pattern.
+
+       The  pcre2_jit_stack_assign()  function  specifies which stack JIT code
+       should use. Its arguments are as follows:
+
+         pcre2_match_context  *mcontext
+         pcre2_jit_callback    callback
+         void                 *data
+
+       The first argument is a pointer to a match context. When this is subse-
+       quently passed to a matching function, its information determines which
+       JIT stack is used. There are three cases for the values  of  the  other
+       two options:
+
+         (1) If callback is NULL and data is NULL, an internal 32K block
+             on the machine stack is used. This is the default when a match
+             context is created.
+
+         (2) If callback is NULL and data is not NULL, data must be
+             a pointer to a valid JIT stack, the result of calling
+             pcre2_jit_stack_create().
+
+         (3) If callback is not NULL, it must point to a function that is
+             called with data as an argument at the start of matching, in
+             order to set up a JIT stack. If the return from the callback
+             function is NULL, the internal 32K stack is used; otherwise the
+             return value must be a valid JIT stack, the result of calling
+             pcre2_jit_stack_create().
+
+       A  callback function is obeyed whenever JIT code is about to be run; it
+       is not obeyed when pcre2_match() is called with options that are incom-
+       patible  for JIT matching. A callback function can therefore be used to
+       determine whether a match operation was  executed  by  JIT  or  by  the
+       interpreter.
+
+       You may safely use the same JIT stack for more than one pattern (either
+       by assigning directly or by callback), as  long  as  the  patterns  are
+       matched sequentially in the same thread. Currently, the only way to set
+       up non-sequential matches in one thread is to use callouts: if a  call-
+       out  function starts another match, that match must use a different JIT
+       stack to the one used for currently suspended match(es).
+
+       In a multithread application, if you do not specify a JIT stack, or  if
+       you  assign  or  pass  back  NULL from a callback, that is thread-safe,
+       because each thread has its own machine stack. However, if  you  assign
+       or  pass  back a non-NULL JIT stack, this must be a different stack for
+       each thread so that the application is thread-safe.
+
+       Strictly speaking, even more is allowed. You can assign the  same  non-
+       NULL  stack  to a match context that is used by any number of patterns,
+       as long as they are not used for matching by multiple  threads  at  the
+       same  time.  For  example, you could use the same stack in all compiled
+       patterns, with a global mutex in the callback to wait until  the  stack
+       is available for use. However, this is an inefficient solution, and not
+       recommended.
+
+       This is a suggestion for how a multithreaded program that needs to  set
+       up non-default JIT stacks might operate:
+
+         During thread initalization
+           thread_local_var = pcre2_jit_stack_create(...)
+
+         During thread exit
+           pcre2_jit_stack_free(thread_local_var)
+
+         Use a one-line callback function
+           return thread_local_var
+
+       All  the  functions  described in this section do nothing if JIT is not
+       available.
+
+
+JIT STACK FAQ
+
+       (1) Why do we need JIT stacks?
+
+       PCRE2 (and JIT) is a recursive, depth-first engine, so it needs a stack
+       where  the local data of the current node is pushed before checking its
+       child nodes.  Allocating real machine stack on some platforms is diffi-
+       cult. For example, the stack chain needs to be updated every time if we
+       extend the stack on PowerPC.  Although it  is  possible,  its  updating
+       time overhead decreases performance. So we do the recursion in memory.
+
+       (2) Why don't we simply allocate blocks of memory with malloc()?
+
+       Modern  operating  systems  have  a  nice  feature: they can reserve an
+       address space instead of allocating memory. We can safely allocate mem-
+       ory  pages  inside  this address space, so the stack could grow without
+       moving memory data (this is important because of pointers). Thus we can
+       allocate  1M  address space, and use only a single memory page (usually
+       4K) if that is enough. However, we can still grow up to 1M  anytime  if
+       needed.
+
+       (3) Who "owns" a JIT stack?
+
+       The owner of the stack is the user program, not the JIT studied pattern
+       or anything else. The user program must ensure that if a stack is being
+       used by pcre2_match(), (that is, it is assigned to a match context that
+       is passed to the pattern currently running), that  stack  must  not  be
+       used  by any other threads (to avoid overwriting the same memory area).
+       The best practice for multithreaded programs is to allocate a stack for
+       each thread, and return this stack through the JIT callback function.
+
+       (4) When should a JIT stack be freed?
+
+       You can free a JIT stack at any time, as long as it will not be used by
+       pcre2_match() again. When you assign the stack to a match context, only
+       a  pointer  is  set. There is no reference counting or any other magic.
+       You can free compiled patterns, contexts, and stacks in any order, any-
+       time.  Just  do not call pcre2_match() with a match context pointing to
+       an already freed stack, as that will cause SEGFAULT. (Also, do not free
+       a  stack  currently  used  by pcre2_match() in another thread). You can
+       also replace the stack in a context at any time when it is not in  use.
+       You should free the previous stack before assigning a replacement.
+
+       (5)  Should  I  allocate/free  a  stack every time before/after calling
+       pcre2_match()?
+
+       No, because this is too costly in  terms  of  resources.  However,  you
+       could  implement  some clever idea which release the stack if it is not
+       used in let's say two minutes. The JIT callback  can  help  to  achieve
+       this without keeping a list of patterns.
+
+       (6)  OK, the stack is for long term memory allocation. But what happens
+       if a pattern causes stack overflow with a stack of 1M? Is that 1M  kept
+       until the stack is freed?
+
+       Especially  on embedded sytems, it might be a good idea to release mem-
+       ory sometimes without freeing the stack. There is no API  for  this  at
+       the  moment.  Probably a function call which returns with the currently
+       allocated memory for any stack and another which allows releasing  mem-
+       ory (shrinking the stack) would be a good idea if someone needs this.
+
+       (7) This is too much of a headache. Isn't there any better solution for
+       JIT stack handling?
+
+       No, thanks to Windows. If POSIX threads were used everywhere, we  could
+       throw out this complicated API.
+
+
+FREEING JIT SPECULATIVE MEMORY
+
+       void pcre2_jit_free_unused_memory(pcre2_general_context *gcontext);
+
+       The JIT executable allocator does not free all memory when it is possi-
+       ble.  It expects new allocations, and keeps some free memory around  to
+       improve  allocation  speed. However, in low memory conditions, it might
+       be better to free all possible memory. You can cause this to happen  by
+       calling  pcre2_jit_free_unused_memory(). Its argument is a general con-
+       text, for custom memory management, or NULL for standard memory manage-
+       ment.
+
+
+EXAMPLE CODE
+
+       This  is  a  single-threaded example that specifies a JIT stack without
+       using a callback. A real program should include  error  checking  after
+       all the function calls.
+
+         int rc;
+         pcre2_code *re;
+         pcre2_match_data *match_data;
+         pcre2_match_context *mcontext;
+         pcre2_jit_stack *jit_stack;
+
+         re = pcre2_compile(pattern, PCRE2_ZERO_TERMINATED, 0,
+           &errornumber, &erroffset, NULL);
+         rc = pcre2_jit_compile(re, PCRE2_JIT_COMPLETE);
+         mcontext = pcre2_match_context_create(NULL);
+         jit_stack = pcre2_jit_stack_create(32*1024, 512*1024, NULL);
+         pcre2_jit_stack_assign(mcontext, NULL, jit_stack);
+         match_data = pcre2_match_data_create(re, 10);
+         rc = pcre2_match(re, subject, length, 0, 0, match_data, mcontext);
+         /* Process result */
+
+         pcre2_code_free(re);
+         pcre2_match_data_free(match_data);
+         pcre2_match_context_free(mcontext);
+         pcre2_jit_stack_free(jit_stack);
+
+
+JIT FAST PATH API
+
+       Because the API described above falls back to interpreted matching when
+       JIT is not available, it is convenient for programs  that  are  written
+       for  general  use  in  many  environments.  However,  calling  JIT  via
+       pcre2_match() does have a performance impact. Programs that are written
+       for  use  where  JIT  is known to be available, and which need the best
+       possible performance, can instead use a "fast path"  API  to  call  JIT
+       matching  directly instead of calling pcre2_match() (obviously only for
+       patterns that have been successfully processed by pcre2_jit_compile()).
+
+       The fast path  function  is  called  pcre2_jit_match(),  and  it  takes
+       exactly the same arguments as pcre2_match(). The return values are also
+       the same, plus PCRE2_ERROR_JIT_BADOPTION if a matching mode (partial or
+       complete)  is  requested that was not compiled. Unsupported option bits
+       (for example, PCRE2_ANCHORED) are ignored.
+
+       When you call pcre2_match(), as well as testing for invalid options,  a
+       number of other sanity checks are performed on the arguments. For exam-
+       ple, if the subject pointer is NULL, an immediate error is given. Also,
+       unless  PCRE2_NO_UTF_CHECK  is  set, a UTF subject string is tested for
+       validity. In the interests of speed, these checks do not happen on  the
+       JIT fast path, and if invalid data is passed, the result is undefined.
+
+       Bypassing  the  sanity  checks  and the pcre2_match() wrapping can give
+       speedups of more than 10%.
+
+
+SEE ALSO
+
+       pcre2api(3)
+
+
+AUTHOR
+
+       Philip Hazel (FAQ by Zoltan Herczeg)
+       University Computing Service
+       Cambridge, England.
+
+
+REVISION
+
+       Last updated: 14 November 2015
+       Copyright (c) 1997-2015 University of Cambridge.
+------------------------------------------------------------------------------
+
+
+PCRE2LIMITS(3)             Library Functions Manual             PCRE2LIMITS(3)
+
+
+
+NAME
+       PCRE2 - Perl-compatible regular expressions (revised API)
+
+SIZE AND OTHER LIMITATIONS
+
+       There are some size limitations in PCRE2 but it is hoped that they will
+       never in practice be relevant.
+
+       The maximum size of a compiled pattern is approximately 64K code  units
+       for  the  8-bit  and  16-bit  libraries  if  PCRE2 is compiled with the
+       default internal linkage size, which is 2 bytes for these libraries. If
+       you  want  to  process regular expressions that are truly enormous, you
+       can compile PCRE2 with an internal linkage size of 3 or 4 (when  build-
+       ing  the  16-bit library, 3 is rounded up to 4). See the README file in
+       the source distribution and the pcre2build documentation  for  details.
+       In  these  cases the limit is substantially larger.  However, the speed
+       of execution is slower. In the 32-bit  library,  the  internal  linkage
+       size is always 4.
+
+       The maximum length of a source pattern string is essentially unlimited;
+       it is the largest number a PCRE2_SIZE variable can hold.  However,  the
+       program that calls pcre2_compile() can specify a smaller limit.
+
+       The maximum length (in code units) of a subject string is one less than
+       the largest number a PCRE2_SIZE variable can  hold.  PCRE2_SIZE  is  an
+       unsigned  integer  type,  usually  defined as size_t. Its maximum value
+       (that is ~(PCRE2_SIZE)0) is reserved as a special indicator  for  zero-
+       terminated strings and unset offsets.
+
+       Note  that  when  using  the  traditional matching function, PCRE2 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. For a  discussion  of  stack
+       issues, see the pcre2stack documentation.
+
+       All values in repeating quantifiers must be less than 65536.
+
+       The maximum length of a lookbehind assertion is 65535 characters.
+
+       There is no limit to the number of parenthesized subpatterns, but there
+       can be no more than 65535 capturing subpatterns. There is,  however,  a
+       limit  to  the  depth  of  nesting  of parenthesized subpatterns of all
+       kinds. This is imposed in order to limit the  amount  of  system  stack
+       used  at  compile time. The limit can be specified when PCRE2 is built;
+       the default is 250.
+
+       There is a limit to the number of forward references to subsequent sub-
+       patterns  of  around  200,000.  Repeated  forward references with fixed
+       upper limits, for example, (?2){0,100} when subpattern number 2  is  to
+       the  right,  are included in the count. There is no limit to the number
+       of backward references.
+
+       The maximum length of name for a named subpattern is 32 code units, and
+       the maximum number of named subpatterns is 10000.
+
+       The  maximum  length  of  a  name  in  a (*MARK), (*PRUNE), (*SKIP), or
+       (*THEN) verb is 255 for the 8-bit library and 65535 for the 16-bit  and
+       32-bit libraries.
+
+
+AUTHOR
+
+       Philip Hazel
+       University Computing Service
+       Cambridge, England.
+
+
+REVISION
+
+       Last updated: 05 November 2015
+       Copyright (c) 1997-2015 University of Cambridge.
+------------------------------------------------------------------------------
+
+
+PCRE2MATCHING(3)           Library Functions Manual           PCRE2MATCHING(3)
+
+
+
+NAME
+       PCRE2 - Perl-compatible regular expressions (revised API)
+
+PCRE2 MATCHING ALGORITHMS
+
+       This document describes the two different algorithms that are available
+       in PCRE2 for matching a compiled regular  expression  against  a  given
+       subject  string.  The  "standard"  algorithm is the one provided by the
+       pcre2_match() function. This works in the same as  as  Perl's  matching
+       function,  and  provide a Perl-compatible matching operation. The just-
+       in-time (JIT) optimization that is described in the pcre2jit documenta-
+       tion is compatible with this function.
+
+       An alternative algorithm is provided by the pcre2_dfa_match() function;
+       it operates in a different way, and is not Perl-compatible. This alter-
+       native  has  advantages  and  disadvantages  compared with the standard
+       algorithm, and these are described below.
+
+       When there is only one possible way in which a given subject string can
+       match  a pattern, the two algorithms give the same answer. A difference
+       arises, however, when there are multiple possibilities. For example, if
+       the pattern
+
+         ^<.*>
+
+       is matched against the string
+
+         <something> <something else> <something further>
+
+       there are three possible answers. The standard algorithm finds only one
+       of them, whereas the alternative algorithm finds all three.
+
+
+REGULAR EXPRESSIONS AS TREES
+
+       The set of strings that are matched by a regular expression can be rep-
+       resented  as  a  tree structure. An unlimited repetition in the pattern
+       makes the tree of infinite size, but it is still a tree.  Matching  the
+       pattern  to a given subject string (from a given starting point) can be
+       thought of as a search of the tree.  There are two  ways  to  search  a
+       tree:  depth-first  and  breadth-first, and these correspond to the two
+       matching algorithms provided by PCRE2.
+
+
+THE STANDARD MATCHING ALGORITHM
+
+       In the terminology of Jeffrey Friedl's book "Mastering Regular  Expres-
+       sions",  the  standard  algorithm  is an "NFA algorithm". It conducts a
+       depth-first search of the pattern tree. That is, it  proceeds  along  a
+       single path through the tree, checking that the subject matches what is
+       required. When there is a mismatch, the algorithm  tries  any  alterna-
+       tives  at  the  current point, and if they all fail, it backs up to the
+       previous branch point in the  tree,  and  tries  the  next  alternative
+       branch  at  that  level.  This often involves backing up (moving to the
+       left) in the subject string as well.  The  order  in  which  repetition
+       branches  are  tried  is controlled by the greedy or ungreedy nature of
+       the quantifier.
+
+       If a leaf node is reached, a matching string has  been  found,  and  at
+       that  point the algorithm stops. Thus, if there is more than one possi-
+       ble match, this algorithm returns the first one that it finds.  Whether
+       this  is the shortest, the longest, or some intermediate length depends
+       on the way the greedy and ungreedy repetition quantifiers are specified
+       in the pattern.
+
+       Because  it  ends  up  with a single path through the tree, it is rela-
+       tively straightforward for this algorithm to keep  track  of  the  sub-
+       strings  that  are  matched  by portions of the pattern in parentheses.
+       This provides support for capturing parentheses and back references.
+
+
+THE ALTERNATIVE MATCHING ALGORITHM
+
+       This algorithm conducts a breadth-first search of  the  tree.  Starting
+       from  the  first  matching  point  in the subject, it scans the subject
+       string from left to right, once, character by character, and as it does
+       this,  it remembers all the paths through the tree that represent valid
+       matches. In Friedl's terminology, this is a kind  of  "DFA  algorithm",
+       though  it is not implemented as a traditional finite state machine (it
+       keeps multiple states active simultaneously).
+
+       Although the general principle of this matching algorithm  is  that  it
+       scans  the subject string only once, without backtracking, there is one
+       exception: when a lookaround assertion is encountered,  the  characters
+       following  or  preceding  the  current  point  have to be independently
+       inspected.
+
+       The scan continues until either the end of the subject is  reached,  or
+       there  are  no more unterminated paths. At this point, terminated paths
+       represent the different matching possibilities (if there are none,  the
+       match  has  failed).   Thus,  if there is more than one possible match,
+       this algorithm finds all of them, and in particular, it finds the long-
+       est.  The  matches are returned in decreasing order of length. There is
+       an option to stop the algorithm after the first match (which is  neces-
+       sarily the shortest) is found.
+
+       Note that all the matches that are found start at the same point in the
+       subject. If the pattern
+
+         cat(er(pillar)?)?
+
+       is matched against the string "the caterpillar catchment",  the  result
+       is  the  three  strings "caterpillar", "cater", and "cat" that start at
+       the fifth character of the subject. The algorithm  does  not  automati-
+       cally move on to find matches that start at later positions.
+
+       PCRE2's "auto-possessification" optimization usually applies to charac-
+       ter repeats at the end of a pattern (as well as internally). For  exam-
+       ple, the pattern "a\d+" is compiled as if it were "a\d++" because there
+       is no point even considering the possibility of backtracking  into  the
+       repeated  digits.  For  DFA matching, this means that only one possible
+       match is found. If you really do want multiple matches in  such  cases,
+       either  use  an ungreedy repeat ("a\d+?") or set the PCRE2_NO_AUTO_POS-
+       SESS option when compiling.
+
+       There are a number of features of PCRE2 regular  expressions  that  are
+       not  supported  by the alternative matching algorithm. They are as fol-
+       lows:
+
+       1. Because the algorithm finds all  possible  matches,  the  greedy  or
+       ungreedy  nature  of  repetition quantifiers is not relevant (though it
+       may affect auto-possessification, as just described). During  matching,
+       greedy  and  ungreedy  quantifiers are treated in exactly the same way.
+       However, possessive quantifiers can make a difference when what follows
+       could  also  match  what  is  quantified, for example in a pattern like
+       this:
+
+         ^a++\w!
+
+       This pattern matches "aaab!" but not "aaa!", which would be matched  by
+       a  non-possessive quantifier. Similarly, if an atomic group is present,
+       it is matched as if it were a standalone pattern at the current  point,
+       and  the  longest match is then "locked in" for the rest of the overall
+       pattern.
+
+       2. When dealing with multiple paths through the tree simultaneously, it
+       is  not  straightforward  to  keep track of captured substrings for the
+       different matching possibilities, and PCRE2's  implementation  of  this
+       algorithm does not attempt to do this. This means that no captured sub-
+       strings are available.
+
+       3. Because no substrings are captured, back references within the  pat-
+       tern are not supported, and cause errors if encountered.
+
+       4.  For  the same reason, conditional expressions that use a backrefer-
+       ence as the condition or test for a specific group  recursion  are  not
+       supported.
+
+       5.  Because  many  paths  through the tree may be active, the \K escape
+       sequence, which resets the start of the match when encountered (but may
+       be  on  some  paths  and not on others), is not supported. It causes an
+       error if encountered.
+
+       6. Callouts are supported, but the value of the  capture_top  field  is
+       always 1, and the value of the capture_last field is always 0.
+
+       7.  The  \C  escape  sequence, which (in the standard algorithm) always
+       matches a single code unit, even in a UTF mode,  is  not  supported  in
+       these  modes,  because the alternative algorithm moves through the sub-
+       ject string one character (not code unit) at a  time,  for  all  active
+       paths through the tree.
+
+       8.  Except for (*FAIL), the backtracking control verbs such as (*PRUNE)
+       are not supported. (*FAIL) is supported, and  behaves  like  a  failing
+       negative assertion.
+
+
+ADVANTAGES OF THE ALTERNATIVE ALGORITHM
+
+       Using  the alternative matching algorithm provides the following advan-
+       tages:
+
+       1. All possible matches (at a single point in the subject) are automat-
+       ically  found,  and  in particular, the longest match is found. To find
+       more than one match using the standard algorithm, you have to do kludgy
+       things with callouts.
+
+       2.  Because  the  alternative  algorithm  scans the subject string just
+       once, and never needs to backtrack (except for lookbehinds), it is pos-
+       sible  to  pass  very  long subject strings to the matching function in
+       several pieces, checking for partial matching each time. Although it is
+       also  possible  to  do  multi-segment matching using the standard algo-
+       rithm, by retaining partially matched substrings, it  is  more  compli-
+       cated. The pcre2partial documentation gives details of partial matching
+       and discusses multi-segment matching.
+
+
+DISADVANTAGES OF THE ALTERNATIVE ALGORITHM
+
+       The alternative algorithm suffers from a number of disadvantages:
+
+       1. It is substantially slower than  the  standard  algorithm.  This  is
+       partly  because  it has to search for all possible matches, but is also
+       because it is less susceptible to optimization.
+
+       2. Capturing parentheses and back references are not supported.
+
+       3. Although atomic groups are supported, their use does not provide the
+       performance advantage that it does for the standard algorithm.
+
+
+AUTHOR
+
+       Philip Hazel
+       University Computing Service
+       Cambridge, England.
+
+
+REVISION
+
+       Last updated: 29 September 2014
+       Copyright (c) 1997-2014 University of Cambridge.
+------------------------------------------------------------------------------
+
+
+PCRE2PARTIAL(3)            Library Functions Manual            PCRE2PARTIAL(3)
+
+
+
+NAME
+       PCRE2 - Perl-compatible regular expressions
+
+PARTIAL MATCHING IN PCRE2
+
+       In  normal  use  of  PCRE2,  if  the subject string that is passed to a
+       matching function matches as far as it goes, but is too short to  match
+       the  entire pattern, PCRE2_ERROR_NOMATCH is returned. There are circum-
+       stances where it might be helpful to distinguish this case  from  other
+       cases in which there is no match.
+
+       Consider, for example, an application where a human is required to type
+       in data for a field with specific formatting requirements.  An  example
+       might be a date in the form ddmmmyy, defined by this pattern:
+
+         ^\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d$
+
+       If the application sees the user's keystrokes one by one, and can check
+       that what has been typed so far is potentially valid,  it  is  able  to
+       raise  an  error  as  soon  as  a  mistake  is made, by beeping and not
+       reflecting the character that has been typed, for example. This immedi-
+       ate  feedback is likely to be a better user interface than a check that
+       is delayed until the entire string has been entered.  Partial  matching
+       can  also be useful when the subject string is very long and is not all
+       available at once.
+
+       PCRE2 supports partial matching by means of the PCRE2_PARTIAL_SOFT  and
+       PCRE2_PARTIAL_HARD  options,  which  can be set when calling a matching
+       function.  The difference between the two options is whether or  not  a
+       partial match is preferred to an alternative complete match, though the
+       details differ between the two types  of  matching  function.  If  both
+       options are set, PCRE2_PARTIAL_HARD takes precedence.
+
+       If  you  want to use partial matching with just-in-time optimized code,
+       you must call pcre2_jit_compile() with one or both of these options:
+
+         PCRE2_JIT_PARTIAL_SOFT
+         PCRE2_JIT_PARTIAL_HARD
+
+       PCRE2_JIT_COMPLETE should also be set if you are going to run  non-par-
+       tial  matches  on the same pattern. If the appropriate JIT mode has not
+       been compiled, interpretive matching code is used.
+
+       Setting a partial matching option  disables  two  of  PCRE2's  standard
+       optimizations. PCRE2 remembers the last literal code unit in a pattern,
+       and abandons matching immediately if it is not present in  the  subject
+       string.  This  optimization  cannot  be  used for a subject string that
+       might match only partially. PCRE2 also knows the minimum  length  of  a
+       matching  string,  and  does not bother to run the matching function on
+       shorter strings. This optimization is also disabled for partial  match-
+       ing.
+
+
+PARTIAL MATCHING USING pcre2_match()
+
+       A  partial  match occurs during a call to pcre2_match() when the end of
+       the subject string is reached successfully, but  matching  cannot  con-
+       tinue because more characters are needed. However, at least one charac-
+       ter in the subject must have been inspected. This  character  need  not
+       form part of the final matched string; lookbehind assertions and the \K
+       escape sequence provide ways of inspecting characters before the  start
+       of  a matched string. The requirement for inspecting at least one char-
+       acter exists because an empty string can  always  be  matched;  without
+       such  a  restriction  there would always be a partial match of an empty
+       string at the end of the subject.
+
+       When a partial match is returned, the first two elements in the ovector
+       point to the portion of the subject that was matched, but the values in
+       the rest of the ovector are undefined. The appearance of \K in the pat-
+       tern has no effect for a partial match. Consider this pattern:
+
+         /abc\K123/
+
+       If it is matched against "456abc123xyz" the result is a complete match,
+       and the ovector defines the matched string as "123", because \K  resets
+       the  "start  of  match" point. However, if a partial match is requested
+       and the subject string is "456abc12", a partial match is found for  the
+       string  "abc12",  because  all these characters are needed for a subse-
+       quent re-match with additional characters.
+
+       What happens when a partial match is identified depends on which of the
+       two partial matching options are set.
+
+   PCRE2_PARTIAL_SOFT WITH pcre2_match()
+
+       If  PCRE2_PARTIAL_SOFT  is  set when pcre2_match() identifies a partial
+       match, the partial match is remembered, but matching continues as  nor-
+       mal,  and  other  alternatives in the pattern are tried. If no complete
+       match  can  be  found,  PCRE2_ERROR_PARTIAL  is  returned  instead   of
+       PCRE2_ERROR_NOMATCH.
+
+       This  option  is "soft" because it prefers a complete match over a par-
+       tial match.  All the various matching items in a pattern behave  as  if
+       the  subject string is potentially complete. For example, \z, \Z, and $
+       match at the end of the subject, as normal, and for \b and \B  the  end
+       of the subject is treated as a non-alphanumeric.
+
+       If  there  is more than one partial match, the first one that was found
+       provides the data that is returned. Consider this pattern:
+
+         /123\w+X|dogY/
+
+       If this is matched against the subject string "abc123dog", both  alter-
+       natives  fail  to  match,  but the end of the subject is reached during
+       matching, so PCRE2_ERROR_PARTIAL is returned. The offsets are set to  3
+       and  9, identifying "123dog" as the first partial match that was found.
+       (In this example, there are two partial matches, because "dog"  on  its
+       own partially matches the second alternative.)
+
+   PCRE2_PARTIAL_HARD WITH pcre2_match()
+
+       If  PCRE2_PARTIAL_HARD is set for pcre2_match(), PCRE2_ERROR_PARTIAL is
+       returned as soon as a partial match is  found,  without  continuing  to
+       search  for possible complete matches. This option is "hard" because it
+       prefers an earlier partial match over a later complete match. For  this
+       reason,  the  assumption  is  made that the end of the supplied subject
+       string may not be the true end of the available data, and  so,  if  \z,
+       \Z,  \b, \B, or $ are encountered at the end of the subject, the result
+       is PCRE2_ERROR_PARTIAL, provided that at least  one  character  in  the
+       subject has been inspected.
+
+   Comparing hard and soft partial matching
+
+       The  difference  between the two partial matching options can be illus-
+       trated by a pattern such as:
+
+         /dog(sbody)?/
+
+       This matches either "dog" or "dogsbody", greedily (that is, it  prefers
+       the  longer  string  if  possible). If it is matched against the string
+       "dog" with PCRE2_PARTIAL_SOFT, it yields a complete  match  for  "dog".
+       However,  if  PCRE2_PARTIAL_HARD is set, the result is PCRE2_ERROR_PAR-
+       TIAL. On the other hand, if the pattern is made ungreedy the result  is
+       different:
+
+         /dog(sbody)??/
+
+       In  this  case  the  result  is always a complete match because that is
+       found first, and matching never  continues  after  finding  a  complete
+       match. It might be easier to follow this explanation by thinking of the
+       two patterns like this:
+
+         /dog(sbody)?/    is the same as  /dogsbody|dog/
+         /dog(sbody)??/   is the same as  /dog|dogsbody/
+
+       The second pattern will never match "dogsbody", because it will  always
+       find the shorter match first.
+
+
+PARTIAL MATCHING USING pcre2_dfa_match()
+
+       The DFA functions move along the subject string character by character,
+       without backtracking, searching for  all  possible  matches  simultane-
+       ously.  If the end of the subject is reached before the end of the pat-
+       tern, there is the possibility of a partial match, again provided  that
+       at least one character has been inspected.
+
+       When PCRE2_PARTIAL_SOFT is set, PCRE2_ERROR_PARTIAL is returned only if
+       there have been no complete matches. Otherwise,  the  complete  matches
+       are  returned.   However, if PCRE2_PARTIAL_HARD is set, a partial match
+       takes precedence over any complete matches. The portion of  the  string
+       that was matched when the longest partial match was found is set as the
+       first matching string.
+
+       Because the DFA functions always search for all possible  matches,  and
+       there  is  no  difference between greedy and ungreedy repetition, their
+       behaviour is different from  the  standard  functions  when  PCRE2_PAR-
+       TIAL_HARD  is  set.  Consider  the  string  "dog"  matched  against the
+       ungreedy pattern shown above:
+
+         /dog(sbody)??/
+
+       Whereas the standard function stops as soon as it  finds  the  complete
+       match  for  "dog",  the  DFA  function also finds the partial match for
+       "dogsbody", and so returns that when PCRE2_PARTIAL_HARD is set.
+
+
+PARTIAL MATCHING AND WORD BOUNDARIES
+
+       If a pattern ends with one of sequences \b or \B, which test  for  word
+       boundaries,  partial matching with PCRE2_PARTIAL_SOFT can give counter-
+       intuitive results. Consider this pattern:
+
+         /\bcat\b/
+
+       This matches "cat", provided there is a word boundary at either end. If
+       the subject string is "the cat", the comparison of the final "t" with a
+       following character cannot take place, so a  partial  match  is  found.
+       However,  normal  matching carries on, and \b matches at the end of the
+       subject when the last character is a letter, so  a  complete  match  is
+       found.   The  result,  therefore,  is  not  PCRE2_ERROR_PARTIAL.  Using
+       PCRE2_PARTIAL_HARD in this case does yield PCRE2_ERROR_PARTIAL, because
+       then the partial match takes precedence.
+
+
+EXAMPLE OF PARTIAL MATCHING USING PCRE2TEST
+
+       If  the  partial_soft  (or  ps) modifier is present on a pcre2test data
+       line, the PCRE2_PARTIAL_SOFT option is used for the match.  Here  is  a
+       run of pcre2test that uses the date example quoted above:
+
+           re> /^\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d$/
+         data> 25jun04\=ps
+          0: 25jun04
+          1: jun
+         data> 25dec3\=ps
+         Partial match: 23dec3
+         data> 3ju\=ps
+         Partial match: 3ju
+         data> 3juj\=ps
+         No match
+         data> j\=ps
+         No match
+
+       The  first  data  string  is matched completely, so pcre2test shows the
+       matched substrings. The remaining four strings do not  match  the  com-
+       plete pattern, but the first two are partial matches. Similar output is
+       obtained if DFA matching is used.
+
+       If the partial_hard (or ph) modifier is present  on  a  pcre2test  data
+       line, the PCRE2_PARTIAL_HARD option is set for the match.
+
+
+MULTI-SEGMENT MATCHING WITH pcre2_dfa_match()
+
+       When  a  partial match has been found using a DFA matching function, it
+       is possible to continue the match by providing additional subject  data
+       and  calling  the function again with the same compiled regular expres-
+       sion, this time setting the PCRE2_DFA_RESTART option. You must pass the
+       same working space as before, because this is where details of the pre-
+       vious partial match are stored. Here is an example using pcre2test:
+
+           re> /^\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d$/
+         data> 23ja\=dfa,ps
+         Partial match: 23ja
+         data> n05\=dfa,dfa_restart
+          0: n05
+
+       The first call has "23ja" as the subject, and requests  partial  match-
+       ing;  the  second  call  has  "n05"  as  the  subject for the continued
+       (restarted) match.  Notice that when the match is  complete,  only  the
+       last  part  is  shown;  PCRE2 does not retain the previously partially-
+       matched string. It is up to the calling program to do that if it  needs
+       to.
+
+       That means that, for an unanchored pattern, if a continued match fails,
+       it is not possible to try again at  a  new  starting  point.  All  this
+       facility  is  capable  of  doing  is continuing with the previous match
+       attempt. In the previous example, if the second set of data  is  "ug23"
+       the  result is no match, even though there would be a match for "aug23"
+       if the entire string were given at once. Depending on the  application,
+       this may or may not be what you want.  The only way to allow for start-
+       ing again at the next character is to retain the matched  part  of  the
+       subject and try a new complete match.
+
+       You  can  set the PCRE2_PARTIAL_SOFT or PCRE2_PARTIAL_HARD options with
+       PCRE2_DFA_RESTART to continue partial matching over multiple  segments.
+       This  facility can be used to pass very long subject strings to the DFA
+       matching functions.
+
+
+MULTI-SEGMENT MATCHING WITH pcre2_match()
+
+       Unlike the DFA function, it is not possible  to  restart  the  previous
+       match with a new segment of data when using pcre2_match(). Instead, new
+       data must be added to the previous subject string, and the entire match
+       re-run,  starting from the point where the partial match occurred. Ear-
+       lier data can be discarded.
+
+       It is best to use PCRE2_PARTIAL_HARD in this situation, because it does
+       not  treat the end of a segment as the end of the subject when matching
+       \z, \Z, \b, \B, and $. Consider  an  unanchored  pattern  that  matches
+       dates:
+
+           re> /\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d/
+         data> The date is 23ja\=ph
+         Partial match: 23ja
+
+       At  this stage, an application could discard the text preceding "23ja",
+       add on text from the next  segment,  and  call  the  matching  function
+       again.  Unlike  the  DFA  matching function, the entire matching string
+       must always be available, and the complete matching process occurs  for
+       each call, so more memory and more processing time is needed.
+
+
+ISSUES WITH MULTI-SEGMENT MATCHING
+
+       Certain types of pattern may give problems with multi-segment matching,
+       whichever matching function is used.
+
+       1. If the pattern contains a test for the beginning of a line, you need
+       to  pass  the  PCRE2_NOTBOL option when the subject string for any call
+       does start at the beginning of a line. There  is  also  a  PCRE2_NOTEOL
+       option, but in practice when doing multi-segment matching you should be
+       using PCRE2_PARTIAL_HARD, which includes the effect of PCRE2_NOTEOL.
+
+       2. If a pattern contains a lookbehind assertion, characters  that  pre-
+       cede  the start of the partial match may have been inspected during the
+       matching process.  When using pcre2_match(), sufficient characters must
+       be  retained  for  the  next  match attempt. You can ensure that enough
+       characters are retained by doing the following:
+
+       Before doing any matching, find the length of the longest lookbehind in
+       the     pattern    by    calling    pcre2_pattern_info()    with    the
+       PCRE2_INFO_MAXLOOKBEHIND option. Note that the resulting  count  is  in
+       characters, not code units. After a partial match, moving back from the
+       ovector[0] offset in the subject by the number of characters given  for
+       the  maximum lookbehind gets you to the earliest character that must be
+       retained. In a non-UTF or a 32-bit situation, moving  back  is  just  a
+       subtraction,  but in UTF-8 or UTF-16 you have to count characters while
+       moving back through the code units.
+
+       Characters before the point you have now reached can be discarded,  and
+       after  the  next segment has been added to what is retained, you should
+       run the next match with the startoffset argument set so that the  match
+       begins at the same point as before.
+
+       For  example, if the pattern "(?<=123)abc" is partially matched against
+       the string "xx123ab", the ovector offsets are 5 and 7 ("ab"). The maxi-
+       mum  lookbehind  count  is  3, so all characters before offset 2 can be
+       discarded. The value of startoffset for the next  match  should  be  3.
+       When  pcre2test  displays  a partial match, it indicates the lookbehind
+       characters with '<' characters:
+
+           re> "(?<=123)abc"
+         data> xx123ab\=ph
+         Partial match: 123ab
+                        <<<
+
+       3. Because a partial match must always contain at least one  character,
+       what  might  be  considered a partial match of an empty string actually
+       gives a "no match" result. For example:
+
+           re> /c(?<=abc)x/
+         data> ab\=ps
+         No match
+
+       If the next segment begins "cx", a match should be found, but this will
+       only  happen  if characters from the previous segment are retained. For
+       this reason, a "no match" result  should  be  interpreted  as  "partial
+       match of an empty string" when the pattern contains lookbehinds.
+
+       4.  Matching  a subject string that is split into multiple segments may
+       not always produce exactly the same result as matching over one  single
+       long  string,  especially  when PCRE2_PARTIAL_SOFT is used. The section
+       "Partial Matching and Word Boundaries" above describes  an  issue  that
+       arises  if  the  pattern ends with \b or \B. Another kind of difference
+       may occur when there are multiple matching possibilities, because  (for
+       PCRE2_PARTIAL_SOFT) a partial match result is given only when there are
+       no completed matches. This means that as soon as the shortest match has
+       been  found,  continuation to a new subject segment is no longer possi-
+       ble. Consider this pcre2test example:
+
+           re> /dog(sbody)?/
+         data> dogsb\=ps
+          0: dog
+         data> do\=ps,dfa
+         Partial match: do
+         data> gsb\=ps,dfa,dfa_restart
+          0: g
+         data> dogsbody\=dfa
+          0: dogsbody
+          1: dog
+
+       The first data line passes the string "dogsb" to  a  standard  matching
+       function, setting the PCRE2_PARTIAL_SOFT option. Although the string is
+       a partial match for "dogsbody", the result is not  PCRE2_ERROR_PARTIAL,
+       because  the  shorter string "dog" is a complete match. Similarly, when
+       the subject is presented to a DFA matching function  in  several  parts
+       ("do"  and  "gsb"  being  the first two) the match stops when "dog" has
+       been found, and it is not possible to continue.  On the other hand,  if
+       "dogsbody"  is  presented  as  a single string, a DFA matching function
+       finds both matches.
+
+       Because of these problems, it is best to  use  PCRE2_PARTIAL_HARD  when
+       matching  multi-segment  data.  The  example above then behaves differ-
+       ently:
+
+           re> /dog(sbody)?/
+         data> dogsb\=ph
+         Partial match: dogsb
+         data> do\=ps,dfa
+         Partial match: do
+         data> gsb\=ph,dfa,dfa_restart
+         Partial match: gsb
+
+       5. Patterns that contain alternatives at the top level which do not all
+       start  with  the  same  pattern  item  may  not  work  as expected when
+       PCRE2_DFA_RESTART is used. For example, consider this pattern:
+
+         1234|3789
+
+       If the first part of the subject is "ABC123", a partial  match  of  the
+       first  alternative  is found at offset 3. There is no partial match for
+       the second alternative, because such a match does not start at the same
+       point  in  the  subject  string. Attempting to continue with the string
+       "7890" does not yield a match  because  only  those  alternatives  that
+       match  at  one  point in the subject are remembered. The problem arises
+       because the start of the second alternative matches  within  the  first
+       alternative.  There  is  no  problem with anchored patterns or patterns
+       such as:
+
+         1234|ABCD
+
+       where no string can be a partial match for both alternatives.  This  is
+       not  a  problem  if  a  standard matching function is used, because the
+       entire match has to be rerun each time:
+
+           re> /1234|3789/
+         data> ABC123\=ph
+         Partial match: 123
+         data> 1237890
+          0: 3789
+
+       Of course, instead of using PCRE2_DFA_RESTART, the  same  technique  of
+       re-running  the  entire  match  can  also be used with the DFA matching
+       function. Another possibility is to work with two buffers. If a partial
+       match  at  offset  n in the first buffer is followed by "no match" when
+       PCRE2_DFA_RESTART is used on the second buffer, you can then try a  new
+       match starting at offset n+1 in the first buffer.
+
+
+AUTHOR
+
+       Philip Hazel
+       University Computing Service
+       Cambridge, England.
+
+
+REVISION
+
+       Last updated: 22 December 2014
+       Copyright (c) 1997-2014 University of Cambridge.
+------------------------------------------------------------------------------
+
+
+PCRE2PATTERN(3)            Library Functions Manual            PCRE2PATTERN(3)
+
+
+
+NAME
+       PCRE2 - Perl-compatible regular expressions (revised API)
+
+PCRE2 REGULAR EXPRESSION DETAILS
+
+       The  syntax and semantics of the regular expressions that are supported
+       by PCRE2 are described in detail below. There is a quick-reference syn-
+       tax  summary  in the pcre2syntax page. PCRE2 tries to match Perl syntax
+       and semantics as closely as it can.  PCRE2 also supports some  alterna-
+       tive  regular  expression syntax (which does not conflict with the Perl
+       syntax) in order to provide some compatibility with regular expressions
+       in Python, .NET, and Oniguruma.
+
+       Perl's  regular expressions are described in its own documentation, and
+       regular expressions in general are covered 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  PCRE2's  regular  expressions is
+       intended as reference material.
+
+       This document discusses the patterns that are supported by  PCRE2  when
+       its  main  matching function, pcre2_match(), is used. PCRE2 also has an
+       alternative matching function, pcre2_dfa_match(), which matches using a
+       different  algorithm  that is not Perl-compatible. Some of the features
+       discussed below are not available when DFA matching is used. The advan-
+       tages and disadvantages of the alternative function, and how it differs
+       from the normal function, are discussed in the pcre2matching page.
+
+
+SPECIAL START-OF-PATTERN ITEMS
+
+       A number of options that can be passed to pcre2_compile() can  also  be
+       set by special items at the start of a pattern. These are not Perl-com-
+       patible, but are provided to make these options accessible  to  pattern
+       writers  who are not able to change the program that processes the pat-
+       tern. Any number of these items  may  appear,  but  they  must  all  be
+       together right at the start of the pattern string, and the letters must
+       be in upper case.
+
+   UTF support
+
+       In the 8-bit and 16-bit PCRE2 libraries, characters may be coded either
+       as single code units, or as multiple UTF-8 or UTF-16 code units. UTF-32
+       can be specified for the 32-bit library, in which  case  it  constrains
+       the  character  values  to  valid  Unicode  code points. To process UTF
+       strings, PCRE2 must be built to include Unicode support (which  is  the
+       default).  When  using  UTF  strings you must either call the compiling
+       function with the PCRE2_UTF option, or the pattern must start with  the
+       special  sequence  (*UTF),  which is equivalent to setting the relevant
+       option. How setting a UTF mode affects pattern matching is mentioned in
+       several  places  below.  There  is  also  a  summary of features in the
+       pcre2unicode page.
+
+       Some applications that allow their users to supply patterns may wish to
+       restrict   them   to   non-UTF   data  for  security  reasons.  If  the
+       PCRE2_NEVER_UTF option is passed  to  pcre2_compile(),  (*UTF)  is  not
+       allowed, and its appearance in a pattern causes an error.
+
+   Unicode property support
+
+       Another  special  sequence that may appear at the start of a pattern is
+       (*UCP).  This has the same effect as setting the PCRE2_UCP  option:  it
+       causes  sequences such as \d and \w to use Unicode properties to deter-
+       mine character types, instead of recognizing only characters with codes
+       less than 256 via a lookup table.
+
+       Some applications that allow their users to supply patterns may wish to
+       restrict them for security reasons. If the  PCRE2_NEVER_UCP  option  is
+       passed to pcre2_compile(), (*UCP) is not allowed, and its appearance in
+       a pattern causes an error.
+
+   Locking out empty string matching
+
+       Starting a pattern with (*NOTEMPTY) or (*NOTEMPTY_ATSTART) has the same
+       effect  as  passing the PCRE2_NOTEMPTY or PCRE2_NOTEMPTY_ATSTART option
+       to whichever matching function is subsequently called to match the pat-
+       tern.  These  options  lock  out  the matching of empty strings, either
+       entirely, or only at the start of the subject.
+
+   Disabling auto-possessification
+
+       If a pattern starts with (*NO_AUTO_POSSESS), it has the same effect  as
+       setting  the PCRE2_NO_AUTO_POSSESS option. This stops PCRE2 from making
+       quantifiers possessive when what  follows  cannot  match  the  repeated
+       item. For example, by default a+b is treated as a++b. For more details,
+       see the pcre2api documentation.
+
+   Disabling start-up optimizations
+
+       If a pattern starts with (*NO_START_OPT), it has  the  same  effect  as
+       setting the PCRE2_NO_START_OPTIMIZE option. This disables several opti-
+       mizations for quickly reaching "no match" results.  For  more  details,
+       see the pcre2api documentation.
+
+   Disabling automatic anchoring
+
+       If  a  pattern starts with (*NO_DOTSTAR_ANCHOR), it has the same effect
+       as setting the PCRE2_NO_DOTSTAR_ANCHOR option. This disables  optimiza-
+       tions that apply to patterns whose top-level branches all start with .*
+       (match any number of arbitrary characters). For more details,  see  the
+       pcre2api documentation.
+
+   Disabling JIT compilation
+
+       If  a  pattern  that starts with (*NO_JIT) is successfully compiled, an
+       attempt by the application to apply the  JIT  optimization  by  calling
+       pcre2_jit_compile() is ignored.
+
+   Setting match and recursion limits
+
+       The  caller of pcre2_match() can set a limit on the number of times the
+       internal match() function is called and on the maximum depth of  recur-
+       sive calls. These facilities are provided to catch runaway matches that
+       are provoked by patterns with huge matching trees (a typical example is
+       a  pattern  with  nested unlimited repeats) and to avoid running out of
+       system stack by too  much  recursion.  When  one  of  these  limits  is
+       reached,  pcre2_match()  gives  an error return. The limits can also be
+       set by items at the start of the pattern of the form
+
+         (*LIMIT_MATCH=d)
+         (*LIMIT_RECURSION=d)
+
+       where d is any number of decimal digits. However, the value of the set-
+       ting  must  be  less than the value set (or defaulted) by the caller of
+       pcre2_match() for it to have any effect. In other  words,  the  pattern
+       writer  can lower the limits set by the programmer, but not raise them.
+       If there is more than one setting of one of  these  limits,  the  lower
+       value is used.
+
+   Newline conventions
+
+       PCRE2 supports five different conventions for indicating line breaks in
+       strings: a single CR (carriage return) character, a  single  LF  (line-
+       feed) character, the two-character sequence CRLF, any of the three pre-
+       ceding, or any Unicode newline sequence. The pcre2api page has  further
+       discussion  about newlines, and shows how to set the newline convention
+       when calling pcre2_compile().
+
+       It is also possible to specify a newline convention by starting a  pat-
+       tern string with one of the following five sequences:
+
+         (*CR)        carriage return
+         (*LF)        linefeed
+         (*CRLF)      carriage return, followed by linefeed
+         (*ANYCRLF)   any of the three above
+         (*ANY)       all Unicode newline sequences
+
+       These override the default and the options given to the compiling func-
+       tion. For example, on a Unix system where LF  is  the  default  newline
+       sequence, the pattern
+
+         (*CR)a.b
+
+       changes the convention to CR. That pattern matches "a\nb" because LF is
+       no longer a newline. If more than one of these settings is present, the
+       last one is used.
+
+       The  newline  convention affects where the circumflex and dollar asser-
+       tions are true. It also affects the interpretation of the dot metachar-
+       acter  when  PCRE2_DOTALL is not set, and the behaviour of \N. However,
+       it does not affect what the \R escape  sequence  matches.  By  default,
+       this  is any Unicode newline sequence, for Perl compatibility. However,
+       this can be changed; see the description of \R in the section  entitled
+       "Newline  sequences" below. A change of \R setting can be combined with
+       a change of newline convention.
+
+   Specifying what \R matches
+
+       It is possible to restrict \R to match only CR, LF, or CRLF (instead of
+       the  complete  set  of  Unicode  line  endings)  by  setting the option
+       PCRE2_BSR_ANYCRLF at compile time. This effect can also be achieved  by
+       starting  a  pattern  with (*BSR_ANYCRLF). For completeness, (*BSR_UNI-
+       CODE) is also recognized, corresponding to PCRE2_BSR_UNICODE.
+
+
+EBCDIC CHARACTER CODES
+
+       PCRE2 can be compiled to run in an environment that uses EBCDIC as  its
+       character code rather than ASCII or Unicode (typically a mainframe sys-
+       tem). In the sections below, character code values are  ASCII  or  Uni-
+       code; in an EBCDIC environment these characters may have different code
+       values, and there are no code points greater than 255.
+
+
+CHARACTERS AND METACHARACTERS
+
+       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
+
+         The quick brown fox
+
+       matches a portion of a subject string that is identical to itself. When
+       caseless matching is specified (the PCRE2_CASELESS option), letters are
+       matched independently of case.
+
+       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 metacharacters, which do not stand for themselves
+       but instead are interpreted in some special way.
+
+       There are two different sets of metacharacters: those that  are  recog-
+       nized  anywhere in the pattern except within square brackets, and those
+       that are recognized within square brackets.  Outside  square  brackets,
+       the metacharacters are as follows:
+
+         \      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)
+         [      start character class definition
+         |      start of alternative branch
+         (      start subpattern
+         )      end subpattern
+         ?      extends the meaning of (
+                also 0 or 1 quantifier
+                also quantifier minimizer
+         *      0 or more quantifier
+         +      1 or more quantifier
+                also "possessive quantifier"
+         {      start min/max quantifier
+
+       Part  of  a  pattern  that is in square brackets is called a "character
+       class". In a character class the only metacharacters are:
+
+         \      general escape character
+         ^      negate the class, but only if the first character
+         -      indicates character range
+         [      POSIX character class (only if followed by POSIX
+                  syntax)
+         ]      terminates the character class
+
+       The following sections describe the use of each of the metacharacters.
+
+
+BACKSLASH
+
+       The backslash character has several uses. Firstly, if it is followed by
+       a character that is not a number or a letter, 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.  This escaping action applies whether  or  not  the  following
+       character  would  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 back-
+       slash, you write \\.
+
+       In a UTF mode, only ASCII numbers and letters have any special  meaning
+       after  a  backslash.  All  other characters (in particular, those whose
+       codepoints are greater than 127) are treated as literals.
+
+       If a pattern is compiled with the  PCRE2_EXTENDED  option,  most  white
+       space  in the pattern (other than in a character class), and characters
+       between a # outside a character class and the next newline,  inclusive,
+       are ignored. An escaping backslash can be used to include a white space
+       or # character as part of the pattern.
+
+       If you want to remove the special meaning from a  sequence  of  charac-
+       ters,  you can do so by putting them between \Q and \E. This is differ-
+       ent from Perl in that $ and  @  are  handled  as  literals  in  \Q...\E
+       sequences  in PCRE2, whereas in Perl, $ and @ cause variable interpola-
+       tion. Note the following examples:
+
+         Pattern            PCRE2 matches   Perl matches
+
+         \Qabc$xyz\E        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.   An  isolated \E that is not preceded by \Q is ignored. If \Q
+       is not followed by \E later in the pattern, the literal  interpretation
+       continues  to  the  end  of  the pattern (that is, \E is assumed at the
+       end). If the isolated \Q is inside a character class,  this  causes  an
+       error, because the character class is not terminated.
+
+   Non-printing characters
+
+       A second use of backslash provides a way of encoding non-printing char-
+       acters in patterns in a visible manner. There is no restriction on  the
+       appearance  of non-printing characters in a pattern, but when a pattern
+       is being prepared by text editing, it is often easier to use one of the
+       following  escape sequences than the binary character it represents. In
+       an ASCII or Unicode environment, these escapes are as follows:
+
+         \a        alarm, that is, the BEL character (hex 07)
+         \cx       "control-x", where x is any printable ASCII character
+         \e        escape (hex 1B)
+         \f        form feed (hex 0C)
+         \n        linefeed (hex 0A)
+         \r        carriage return (hex 0D)
+         \t        tab (hex 09)
+         \0dd      character with octal code 0dd
+         \ddd      character with octal code ddd, or back reference
+         \o{ddd..} character with octal code ddd..
+         \xhh      character with hex code hh
+         \x{hhh..} character with hex code hhh.. (default mode)
+         \uhhhh    character with hex code hhhh (when PCRE2_ALT_BSUX is set)
+
+       The precise effect of \cx on ASCII characters 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 \cA to \cZ become hex 01 to hex 1A
+       (A  is  41, Z is 5A), but \c{ becomes hex 3B ({ is 7B), and \c; becomes
+       hex 7B (; is 3B). If the code unit following \c has a value  less  than
+       32  or  greater  than  126, a compile-time error occurs. This locks out
+       non-printable ASCII characters in all modes.
+
+       When PCRE2 is compiled in EBCDIC mode, \a, \e, \f, \n, \r, and \t  gen-
+       erate the appropriate EBCDIC code values. The \c escape is processed as
+       specified for Perl in the perlebcdic document. The only characters that
+       are  allowed  after  \c are A-Z, a-z, or one of @, [, \, ], ^, _, or ?.
+       Any other character provokes a  compile-time  error.  The  sequence  \@
+       encodes  character  code 0; the letters (in either case) encode charac-
+       ters 1-26 (hex 01 to hex 1A); [, \, ], ^, and _ encode characters 27-31
+       (hex 1B to hex 1F), and \? becomes either 255 (hex FF) or 95 (hex 5F).
+
+       Thus,  apart  from  \?,  these escapes generate the same character code
+       values as they do in an ASCII environment, though the meanings  of  the
+       values  mostly  differ.  For example, \G always generates code value 7,
+       which is BEL in ASCII but DEL in EBCDIC.
+
+       The sequence \? generates DEL (127, hex 7F) in  an  ASCII  environment,
+       but  because  127  is  not a control character in EBCDIC, Perl makes it
+       generate the APC character. Unfortunately, there are  several  variants
+       of  EBCDIC.  In  most  of them the APC character has the value 255 (hex
+       FF), but in the one Perl calls POSIX-BC its value is 95  (hex  5F).  If
+       certain  other characters have POSIX-BC values, PCRE2 makes \? generate
+       95; otherwise it generates 255.
+
+       After \0 up to two further octal digits are read. If  there  are  fewer
+       than  two  digits,  just  those  that  are  present  are used. Thus the
+       sequence \0\x\015 specifies two binary zeros followed by a CR character
+       (code value 13). Make sure you supply two digits after the initial zero
+       if the pattern character that follows is itself an octal digit.
+
+       The escape \o must be followed by a sequence of octal digits,  enclosed
+       in  braces.  An  error occurs if this is not the case. This escape is a
+       recent addition to Perl; it provides way of specifying  character  code
+       points  as  octal  numbers  greater than 0777, and it also allows octal
+       numbers and back references to be unambiguously specified.
+
+       For greater clarity and unambiguity, it is best to avoid following \ by
+       a digit greater than zero. Instead, use \o{} or \x{} to specify charac-
+       ter numbers, and \g{} to specify back references. The  following  para-
+       graphs describe the old, ambiguous syntax.
+
+       The handling of a backslash followed by a digit other than 0 is compli-
+       cated, and Perl has changed over time, causing PCRE2 also to change.
+
+       Outside a character class, PCRE2 reads the digit and any following dig-
+       its as a decimal number. If the number is less than 10, begins with the
+       digit 8 or 9, or if there are at least  that  many  previous  capturing
+       left  parentheses  in the expression, the entire sequence is taken as a
+       back reference. A description of how this works is given later, follow-
+       ing  the  discussion  of  parenthesized  subpatterns.  Otherwise, up to
+       three octal digits are read to form a character code.
+
+       Inside a character class, PCRE2 handles \8 and \9 as the literal  char-
+       acters  "8"  and "9", and otherwise reads up to three octal digits fol-
+       lowing the backslash, using them to generate a data character. Any sub-
+       sequent  digits  stand for themselves. For example, outside a character
+       class:
+
+         \040   is another way of writing an ASCII space
+         \40    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
+                   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
+                   character with octal code 113
+         \377   might be a back reference, otherwise
+                   the value 255 (decimal)
+         \81    is always a back reference
+
+       Note that octal values of 100 or greater that are specified using  this
+       syntax  must  not be introduced by a leading zero, because no more than
+       three octal digits are ever read.
+
+       By default, after \x that is not followed by {, from zero to two  hexa-
+       decimal  digits  are  read (letters can be in upper or lower case). Any
+       number of hexadecimal digits may appear between \x{ and }. If a charac-
+       ter  other  than  a  hexadecimal digit appears between \x{ and }, or if
+       there is no terminating }, an error occurs.
+
+       If the PCRE2_ALT_BSUX option is set, the interpretation  of  \x  is  as
+       just described only when it is followed by two hexadecimal digits. Oth-
+       erwise, it matches a literal "x" character. In this mode mode,  support
+       for  code points greater than 256 is provided by \u, which must be fol-
+       lowed by four hexadecimal digits; otherwise it matches  a  literal  "u"
+       character.
+
+       Characters whose value is less than 256 can be defined by either of the
+       two syntaxes for \x (or by \u in PCRE2_ALT_BSUX mode). There is no dif-
+       ference  in  the way they are handled. For example, \xdc is exactly the
+       same as \x{dc} (or \u00dc in PCRE2_ALT_BSUX mode).
+
+   Constraints on character values
+
+       Characters that are specified using octal or  hexadecimal  numbers  are
+       limited to certain values, as follows:
+
+         8-bit non-UTF mode    less than 0x100
+         8-bit UTF-8 mode      less than 0x10ffff and a valid codepoint
+         16-bit non-UTF mode   less than 0x10000
+         16-bit UTF-16 mode    less than 0x10ffff and a valid codepoint
+         32-bit non-UTF mode   less than 0x100000000
+         32-bit UTF-32 mode    less than 0x10ffff and a valid codepoint
+
+       Invalid  Unicode  codepoints  are  the  range 0xd800 to 0xdfff (the so-
+       called "surrogate" codepoints), and 0xffef.
+
+   Escape sequences in character classes
+
+       All the sequences that define a single character value can be used both
+       inside  and  outside character classes. In addition, inside a character
+       class, \b is interpreted as the backspace character (hex 08).
+
+       \N is not allowed in a character class. \B, \R, and \X are not  special
+       inside  a  character  class.  Like other unrecognized alphabetic escape
+       sequences, they cause  an  error.  Outside  a  character  class,  these
+       sequences have different meanings.
+
+   Unsupported escape sequences
+
+       In  Perl, the sequences \l, \L, \u, and \U are recognized by its string
+       handler and used  to  modify  the  case  of  following  characters.  By
+       default, PCRE2 does not support these escape sequences. However, if the
+       PCRE2_ALT_BSUX option is set, \U matches a "U" character, and \u can be
+       used  to define a character by code point, as described in the previous
+       section.
+
+   Absolute and relative back references
+
+       The sequence \g followed by an unsigned or a negative  number,  option-
+       ally  enclosed  in braces, is an absolute or relative back reference. A
+       named back reference can be coded as \g{name}. Back references are dis-
+       cussed later, following the discussion of parenthesized subpatterns.
+
+   Absolute and relative subroutine calls
+
+       For  compatibility with Oniguruma, the non-Perl syntax \g followed by a
+       name or a number enclosed either in angle brackets or single quotes, is
+       an  alternative  syntax for referencing a subpattern as a "subroutine".
+       Details are discussed later.   Note  that  \g{...}  (Perl  syntax)  and
+       \g<...>  (Oniguruma  syntax)  are  not synonymous. The former is a back
+       reference; the latter is a subroutine call.
+
+   Generic character types
+
+       Another use of backslash is for specifying generic character types:
+
+         \d     any decimal digit
+         \D     any character that is not a decimal digit
+         \h     any horizontal white space character
+         \H     any character that is not a horizontal white space character
+         \s     any white space character
+         \S     any character that is not a white space character
+         \v     any vertical white space character
+         \V     any character that is not a vertical white space character
+         \w     any "word" character
+         \W     any "non-word" character
+
+       There is also the single sequence \N, which matches a non-newline char-
+       acter.   This is the same as the "." metacharacter when PCRE2_DOTALL is
+       not set. Perl also uses \N to match characters by name; PCRE2 does  not
+       support this.
+
+       Each  pair of lower and upper case escape sequences partitions the com-
+       plete set of characters into two disjoint  sets.  Any  given  character
+       matches  one, and only one, of each pair. The 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, because there is no character  to
+       match.
+
+       The  default  \s  characters  are HT (9), LF (10), VT (11), FF (12), CR
+       (13), and space (32), which are defined  as  white  space  in  the  "C"
+       locale. This list may vary if locale-specific matching is taking place.
+       For example, in some locales the "non-breaking space" character  (\xA0)
+       is recognized as white space, and in others the VT character is not.
+
+       A  "word"  character is an underscore or any character that is a letter
+       or digit.  By default, the definition of letters  and  digits  is  con-
+       trolled by PCRE2's low-valued character tables, and may vary if locale-
+       specific matching is taking place (see "Locale support" in the pcre2api
+       page).  For  example,  in  a French locale such as "fr_FR" in Unix-like
+       systems, or "french" in Windows, some character codes greater than  127
+       are  used  for  accented letters, and these are then matched by \w. The
+       use of locales with Unicode is discouraged.
+
+       By default, characters whose code points are  greater  than  127  never
+       match \d, \s, or \w, and always match \D, \S, and \W, although this may
+       be different for characters in the range 128-255  when  locale-specific
+       matching  is  happening.   These escape sequences retain their original
+       meanings from before Unicode support was available,  mainly  for  effi-
+       ciency  reasons.  If  the  PCRE2_UCP  option  is  set, the behaviour is
+       changed so that Unicode properties  are  used  to  determine  character
+       types, as follows:
+
+         \d  any character that matches \p{Nd} (decimal digit)
+         \s  any character that matches \p{Z} or \h or \v
+         \w  any character that matches \p{L} or \p{N}, plus underscore
+
+       The  upper case escapes match the inverse sets of characters. Note that
+       \d matches only decimal digits, whereas \w matches any  Unicode  digit,
+       as well as any Unicode letter, and underscore. Note also that PCRE2_UCP
+       affects \b, and \B because they are defined in  terms  of  \w  and  \W.
+       Matching these sequences is noticeably slower when PCRE2_UCP is set.
+
+       The  sequences  \h, \H, \v, and \V, in contrast to the other sequences,
+       which match only ASCII characters by default, always match  a  specific
+       list  of  code  points, whether or not PCRE2_UCP is set. The horizontal
+       space characters are:
+
+         U+0009     Horizontal tab (HT)
+         U+0020     Space
+         U+00A0     Non-break space
+         U+1680     Ogham space mark
+         U+180E     Mongolian vowel separator
+         U+2000     En quad
+         U+2001     Em quad
+         U+2002     En space
+         U+2003     Em space
+         U+2004     Three-per-em space
+         U+2005     Four-per-em space
+         U+2006     Six-per-em space
+         U+2007     Figure space
+         U+2008     Punctuation space
+         U+2009     Thin space
+         U+200A     Hair space
+         U+202F     Narrow no-break space
+         U+205F     Medium mathematical space
+         U+3000     Ideographic space
+
+       The vertical space characters are:
+
+         U+000A     Linefeed (LF)
+         U+000B     Vertical tab (VT)
+         U+000C     Form feed (FF)
+         U+000D     Carriage return (CR)
+         U+0085     Next line (NEL)
+         U+2028     Line separator
+         U+2029     Paragraph separator
+
+       In 8-bit, non-UTF-8 mode, only the characters  with  code  points  less
+       than 256 are relevant.
+
+   Newline sequences
+
+       Outside  a  character class, by default, the escape sequence \R matches
+       any Unicode newline sequence. In 8-bit non-UTF-8 mode \R is  equivalent
+       to the following:
+
+         (?>\r\n|\n|\x0b|\f|\r|\x85)
+
+       This  is  an  example  of an "atomic group", details of which are given
+       below.  This particular group matches either the two-character sequence
+       CR  followed  by  LF,  or  one  of  the single characters LF (linefeed,
+       U+000A), VT (vertical tab, U+000B), FF (form feed,  U+000C),  CR  (car-
+       riage  return,  U+000D), or NEL (next line, U+0085). Because this is an
+       atomic group, the two-character sequence is treated as  a  single  unit
+       that cannot be split.
+
+       In  other modes, two additional characters whose codepoints are greater
+       than 255 are added: LS (line separator, U+2028) and PS (paragraph sepa-
+       rator,  U+2029).  Unicode support is not needed for these characters to
+       be recognized.
+
+       It is possible to restrict \R to match only CR, LF, or CRLF (instead of
+       the  complete  set  of  Unicode  line  endings)  by  setting the option
+       PCRE2_BSR_ANYCRLF at compile time. (BSR is an  abbrevation  for  "back-
+       slash R".) This can be made the default when PCRE2 is built; if this is
+       the case, the other behaviour can be requested via  the  PCRE2_BSR_UNI-
+       CODE  option. It is also possible to specify these settings by starting
+       a pattern string with one of the following sequences:
+
+         (*BSR_ANYCRLF)   CR, LF, or CRLF only
+         (*BSR_UNICODE)   any Unicode newline sequence
+
+       These override the default and the options given to the compiling func-
+       tion.  Note that these special settings, which are not Perl-compatible,
+       are recognized only at the very start of a pattern, and that they  must
+       be  in upper case. If more than one of them is present, the last one is
+       used. They can be combined with a change  of  newline  convention;  for
+       example, a pattern can start with:
+
+         (*ANY)(*BSR_ANYCRLF)
+
+       They  can also be combined with the (*UTF) or (*UCP) special sequences.
+       Inside a character class, \R  is  treated  as  an  unrecognized  escape
+       sequence, and causes an error.
+
+   Unicode character properties
+
+       When  PCRE2  is  built  with Unicode support (the default), three addi-
+       tional escape sequences that match characters with specific  properties
+       are  available.  In 8-bit non-UTF-8 mode, these sequences are of course
+       limited to testing characters whose codepoints are less than  256,  but
+       they do work in this mode.  The extra escape sequences are:
+
+         \p{xx}   a character with the xx property
+         \P{xx}   a character without the xx property
+         \X       a Unicode extended grapheme cluster
+
+       The  property  names represented by xx above are limited to the Unicode
+       script names, the general category properties, "Any", which matches any
+       character  (including  newline),  and  some  special  PCRE2  properties
+       (described in the next section).  Other Perl properties such as  "InMu-
+       sicalSymbols"  are  not supported by PCRE2.  Note that \P{Any} does not
+       match any characters, so always causes a match failure.
+
+       Sets of Unicode characters are defined as belonging to certain scripts.
+       A  character from one of these sets can be matched using a script name.
+       For example:
+
+         \p{Greek}
+         \P{Han}
+
+       Those that are not part of an identified script are lumped together  as
+       "Common". The current list of scripts is:
+
+       Ahom,   Anatolian_Hieroglyphs,  Arabic,  Armenian,  Avestan,  Balinese,
+       Bamum, Bassa_Vah, Batak, Bengali, Bopomofo, Brahmi, Braille,  Buginese,
+       Buhid,  Canadian_Aboriginal,  Carian, Caucasian_Albanian, Chakma, Cham,
+       Cherokee,  Common,  Coptic,  Cuneiform,  Cypriot,  Cyrillic,   Deseret,
+       Devanagari,  Duployan,  Egyptian_Hieroglyphs,  Elbasan, Ethiopic, Geor-
+       gian, Glagolitic, Gothic,  Grantha,  Greek,  Gujarati,  Gurmukhi,  Han,
+       Hangul, Hanunoo, Hatran, Hebrew, Hiragana, Imperial_Aramaic, Inherited,
+       Inscriptional_Pahlavi, Inscriptional_Parthian, Javanese,  Kaithi,  Kan-
+       nada,  Katakana,  Kayah_Li,  Kharoshthi, Khmer, Khojki, Khudawadi, Lao,
+       Latin, Lepcha, Limbu, Linear_A, Linear_B, Lisu, Lycian,  Lydian,  Maha-
+       jani,  Malayalam,  Mandaic,  Manichaean,  Meetei_Mayek,  Mende_Kikakui,
+       Meroitic_Cursive, Meroitic_Hieroglyphs,  Miao,  Modi,  Mongolian,  Mro,
+       Multani,   Myanmar,   Nabataean,  New_Tai_Lue,  Nko,  Ogham,  Ol_Chiki,
+       Old_Hungarian, Old_Italic, Old_North_Arabian, Old_Permic,  Old_Persian,
+       Old_South_Arabian, Old_Turkic, Oriya, Osmanya, Pahawh_Hmong, Palmyrene,
+       Pau_Cin_Hau,  Phags_Pa,  Phoenician,  Psalter_Pahlavi,  Rejang,  Runic,
+       Samaritan, Saurashtra, Sharada, Shavian, Siddham, SignWriting, Sinhala,
+       Sora_Sompeng,  Sundanese,  Syloti_Nagri,  Syriac,  Tagalog,   Tagbanwa,
+       Tai_Le,   Tai_Tham,  Tai_Viet,  Takri,  Tamil,  Telugu,  Thaana,  Thai,
+       Tibetan, Tifinagh, Tirhuta, Ugaritic, Vai, Warang_Citi, Yi.
+
+       Each character has exactly one Unicode general category property, spec-
+       ified  by a two-letter abbreviation. For compatibility with Perl, nega-
+       tion can be specified by including a  circumflex  between  the  opening
+       brace  and  the  property  name.  For  example,  \p{^Lu} is the same as
+       \P{Lu}.
+
+       If only one letter is specified with \p or \P, it includes all the gen-
+       eral  category 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:
+
+         \p{L}
+         \pL
+
+       The following general category property codes are supported:
+
+         C     Other
+         Cc    Control
+         Cf    Format
+         Cn    Unassigned
+         Co    Private use
+         Cs    Surrogate
+
+         L     Letter
+         Ll    Lower case letter
+         Lm    Modifier letter
+         Lo    Other letter
+         Lt    Title case letter
+         Lu    Upper case letter
+
+         M     Mark
+         Mc    Spacing mark
+         Me    Enclosing mark
+         Mn    Non-spacing mark
+
+         N     Number
+         Nd    Decimal number
+         Nl    Letter number
+         No    Other number
+
+         P     Punctuation
+         Pc    Connector punctuation
+         Pd    Dash punctuation
+         Pe    Close punctuation
+         Pf    Final punctuation
+         Pi    Initial punctuation
+         Po    Other punctuation
+         Ps    Open punctuation
+
+         S     Symbol
+         Sc    Currency symbol
+         Sk    Modifier symbol
+         Sm    Mathematical symbol
+         So    Other symbol
+
+         Z     Separator
+         Zl    Line separator
+         Zp    Paragraph separator
+         Zs    Space separator
+
+       The  special property L& is also supported: it matches a character that
+       has the Lu, Ll, or Lt property, in other words, a letter  that  is  not
+       classified as a modifier or "other".
+
+       The  Cs  (Surrogate)  property  applies only to characters in the range
+       U+D800 to U+DFFF. Such characters are not valid in Unicode strings  and
+       so  cannot  be  tested  by PCRE2, unless UTF validity checking has been
+       turned off (see the discussion of PCRE2_NO_UTF_CHECK  in  the  pcre2api
+       page). Perl does not support the Cs property.
+
+       The  long  synonyms  for  property  names  that  Perl supports (such as
+       \p{Letter}) are not supported by PCRE2, nor is it permitted  to  prefix
+       any of these properties with "Is".
+
+       No character that is in the Unicode table has the Cn (unassigned) prop-
+       erty.  Instead, this property is assumed for any code point that is not
+       in the Unicode table.
+
+       Specifying  caseless  matching  does not affect these escape sequences.
+       For example, \p{Lu} always matches only upper  case  letters.  This  is
+       different from the behaviour of current versions of Perl.
+
+       Matching  characters by Unicode property is not fast, because PCRE2 has
+       to do a multistage table lookup in order to find  a  character's  prop-
+       erty. That is why the traditional escape sequences such as \d and \w do
+       not use Unicode properties in PCRE2 by default,  though  you  can  make
+       them  do  so by setting the PCRE2_UCP option or by starting the pattern
+       with (*UCP).
+
+   Extended grapheme clusters
+
+       The \X escape matches any number of Unicode  characters  that  form  an
+       "extended grapheme cluster", and treats the sequence as an atomic group
+       (see below).  Unicode supports various kinds of composite character  by
+       giving  each  character  a grapheme breaking property, and having rules
+       that use these properties to define the boundaries of extended grapheme
+       clusters.  \X  always  matches  at least one character. Then it decides
+       whether to add additional characters according to the  following  rules
+       for ending a cluster:
+
+       1. End at the end of the subject string.
+
+       2.  Do not end between CR and LF; otherwise end after any control char-
+       acter.
+
+       3. Do not break Hangul (a Korean  script)  syllable  sequences.  Hangul
+       characters  are of five types: L, V, T, LV, and LVT. An L character may
+       be followed by an L, V, LV, or LVT character; an LV or V character  may
+       be followed by a V or T character; an LVT or T character may be follwed
+       only by a T character.
+
+       4. Do not end before extending characters or spacing marks.  Characters
+       with  the  "mark"  property  always have the "extend" grapheme breaking
+       property.
+
+       5. Do not end after prepend characters.
+
+       6. Otherwise, end the cluster.
+
+   PCRE2's additional properties
+
+       As well as the standard Unicode properties described above, PCRE2  sup-
+       ports  four  more  that  make it possible to convert traditional escape
+       sequences such as \w and \s to use Unicode properties. PCRE2 uses these
+       non-standard,  non-Perl  properties  internally  when PCRE2_UCP is set.
+       However, they may also be used explicitly. These properties are:
+
+         Xan   Any alphanumeric character
+         Xps   Any POSIX space character
+         Xsp   Any Perl space character
+         Xwd   Any Perl "word" character
+
+       Xan matches characters that have either the L (letter) or the  N  (num-
+       ber)  property. Xps matches the characters tab, linefeed, vertical tab,
+       form feed, or carriage return, and any other character that has  the  Z
+       (separator)  property.   Xsp  is  the  same as Xps; in PCRE1 it used to
+       exclude vertical tab, for Perl compatibility,  but  Perl  changed.  Xwd
+       matches the same characters as Xan, plus underscore.
+
+       There  is another non-standard property, Xuc, which matches any charac-
+       ter that can be represented by a Universal Character Name  in  C++  and
+       other  programming  languages.  These are the characters $, @, ` (grave
+       accent), and all characters with Unicode code points  greater  than  or
+       equal  to U+00A0, except for the surrogates U+D800 to U+DFFF. Note that
+       most base (ASCII) characters are excluded. (Universal  Character  Names
+       are  of  the  form \uHHHH or \UHHHHHHHH where H is a hexadecimal digit.
+       Note that the Xuc property does not match these sequences but the char-
+       acters that they represent.)
+
+   Resetting the match start
+
+       The  escape sequence \K causes any previously matched characters not to
+       be included in the final matched sequence. For example, the pattern:
+
+         foo\Kbar
+
+       matches "foobar", but reports that it has matched "bar".  This  feature
+       is  similar  to  a lookbehind assertion (described below).  However, in
+       this case, the part of the subject before the real match does not  have
+       to  be of fixed length, as lookbehind assertions do. The use of \K does
+       not interfere with the setting of captured  substrings.   For  example,
+       when the pattern
+
+         (foo)\Kbar
+
+       matches "foobar", the first substring is still set to "foo".
+
+       Perl  documents  that  the  use  of  \K  within assertions is "not well
+       defined". In PCRE2, \K is acted upon when  it  occurs  inside  positive
+       assertions,  but  is  ignored  in negative assertions. Note that when a
+       pattern such as (?=ab\K) matches, the reported start of the  match  can
+       be greater than the end of the match.
+
+   Simple assertions
+
+       The  final use of backslash is for certain simple assertions. An asser-
+       tion 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 the start of the subject
+         \Z     matches at the end of the subject
+                 also matches before a newline at the end of the subject
+         \z     matches only at the end of the subject
+         \G     matches at the first matching position in the subject
+
+       Inside  a  character  class, \b has a different meaning; it matches the
+       backspace character. If any other of  these  assertions  appears  in  a
+       character class, an "invalid escape sequence" error is generated.
+
+       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.  In  a
+       UTF  mode,  the  meanings  of  \w  and \W can be changed by setting the
+       PCRE2_UCP option. When this is done, it also affects \b and \B. Neither
+       PCRE2  nor Perl has a separate "start of word" or "end of word" metase-
+       quence. However, whatever follows \b normally determines which  it  is.
+       For example, the fragment \ba matches "a" at the start of a word.
+
+       The  \A,  \Z,  and \z 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  asser-
+       tions  are  not  affected  by the PCRE2_NOTBOL or PCRE2_NOTEOL options,
+       which affect only the behaviour of the circumflex and dollar  metachar-
+       acters.  However,  if the startoffset argument of pcre2_match() 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 at the end of the  string
+       as well as at the very end, 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 startoffset  argument
+       of  pcre2_match().  It differs from \A when the value of startoffset is
+       non-zero. By calling  pcre2_match()  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 PCRE2's interpretation of \G, 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 PCRE2 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 to the starting match position, and the "anchored" flag is set
+       in the compiled regular expression.
+
+
+CIRCUMFLEX AND DOLLAR
+
+       The circumflex and dollar  metacharacters  are  zero-width  assertions.
+       That  is,  they test for a particular condition being true without con-
+       suming any characters from the subject string. These two metacharacters
+       are  concerned  with matching the starts and ends of lines. If the new-
+       line convention is set so that only the two-character sequence CRLF  is
+       recognized  as  a newline, isolated CR and LF characters are treated as
+       ordinary data characters, and are not recognized as newlines.
+
+       Outside a character class, in the default matching mode, the circumflex
+       character  is  an  assertion  that is true only if the current matching
+       point is at the start of the subject string. If the  startoffset  argu-
+       ment  of  pcre2_match() is non-zero, or if PCRE2_NOTBOL is set, circum-
+       flex can never match if the PCRE2_MULTILINE option is unset.  Inside  a
+       character  class,  circumflex  has  an  entirely different meaning (see
+       below).
+
+       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 possible alternatives start with a circumflex, that is,
+       if the pattern is constrained to match only at the start  of  the  sub-
+       ject,  it  is  said  to be an "anchored" pattern. (There are also other
+       constructs that can cause a pattern to be anchored.)
+
+       The 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  at  the  end  of  the  string  (by  default),  unless
+       PCRE2_NOTEOL is set. Note, however, that it does not actually match the
+       newline. Dollar need not be the last character of the pattern if a num-
+       ber 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  charac-
+       ter class.
+
+       The  meaning  of  dollar  can be changed so that it matches only at the
+       very end of the string, by setting the PCRE2_DOLLAR_ENDONLY  option  at
+       compile time. This does not affect the \Z assertion.
+
+       The meanings of the circumflex and dollar metacharacters are changed if
+       the PCRE2_MULTILINE option is set. When this  is  the  case,  a  dollar
+       character  matches before any newlines in the string, as well as at the
+       very end, and a circumflex matches immediately after internal  newlines
+       as  well as at the start of the subject string. It does not match after
+       a newline that ends the string, for compatibility with  Perl.  However,
+       this can be changed by setting the PCRE2_ALT_CIRCUMFLEX option.
+
+       For  example, the pattern /^abc$/ matches the subject string "def\nabc"
+       (where \n represents a newline) 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 startoffset argument of
+       pcre2_match() is non-zero. The PCRE2_DOLLAR_ENDONLY option  is  ignored
+       if PCRE2_MULTILINE is set.
+
+       When  the  newline  convention (see "Newline conventions" below) recog-
+       nizes the two-character sequence CRLF as a newline, this is  preferred,
+       even  if  the  single  characters CR and LF are also recognized as new-
+       lines. For example, if the newline convention  is  "any",  a  multiline
+       mode  circumflex matches before "xyz" in the string "abc\r\nxyz" rather
+       than after CR, even though CR on its own is a valid newline.  (It  also
+       matches at the very start of the string, of course.)
+
+       Note  that  the sequences \A, \Z, and \z 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 or not PCRE2_MULTILINE is
+       set.
+
+
+FULL STOP (PERIOD, DOT) AND \N
+
+       Outside a character class, a dot in the pattern matches any one charac-
+       ter  in  the subject string except (by default) a character that signi-
+       fies the end of a line.
+
+       When a line ending is defined as a single character, dot never  matches
+       that  character; when the two-character sequence CRLF is used, dot does
+       not match CR if it is immediately followed  by  LF,  but  otherwise  it
+       matches  all characters (including isolated CRs and LFs). When any Uni-
+       code line endings are being recognized, dot does not match CR or LF  or
+       any of the other line ending characters.
+
+       The  behaviour  of  dot  with regard to newlines can be changed. If the
+       PCRE2_DOTALL option is set, a dot matches any  one  character,  without
+       exception.   If  the two-character sequence CRLF is present in the sub-
+       ject string, it takes two dots to match it.
+
+       The handling of dot is entirely independent of the handling of  circum-
+       flex  and  dollar,  the  only relationship being that they both involve
+       newlines. Dot has no special meaning in a character class.
+
+       The escape sequence \N behaves like  a  dot,  except  that  it  is  not
+       affected  by  the  PCRE2_DOTALL  option. In other words, it matches any
+       character except one that signifies the end of a line. Perl  also  uses
+       \N to match characters by name; PCRE2 does not support this.
+
+
+MATCHING A SINGLE CODE UNIT
+
+       Outside  a character class, the escape sequence \C matches any one code
+       unit, whether or not a UTF mode is set. In the 8-bit library, one  code
+       unit  is  one  byte;  in the 16-bit library it is a 16-bit unit; in the
+       32-bit library it is a 32-bit unit. Unlike a  dot,  \C  always  matches
+       line-ending  characters.  The  feature  is provided in Perl in order to
+       match individual bytes in UTF-8 mode, but it is unclear how it can use-
+       fully be used.
+
+       Because  \C  breaks  up characters into individual code units, matching
+       one unit with \C in UTF-8 or UTF-16 mode means that  the  rest  of  the
+       string  may  start  with  a malformed UTF character. This has undefined
+       results, because PCRE2 assumes that it is matching character by charac-
+       ter  in  a  valid UTF string (by default it checks the subject string's
+       validity at the  start  of  processing  unless  the  PCRE2_NO_UTF_CHECK
+       option is used).
+
+       An   application   can   lock   out  the  use  of  \C  by  setting  the
+       PCRE2_NEVER_BACKSLASH_C option when compiling a  pattern.  It  is  also
+       possible to build PCRE2 with the use of \C permanently disabled.
+
+       PCRE2  does  not allow \C to appear in lookbehind assertions (described
+       below) in a UTF mode, because this would make it impossible  to  calcu-
+       late  the  length  of  the lookbehind. Neither the alternative matching
+       function pcre2_dfa_match() not the JIT optimizer support \C  in  a  UTF
+       mode. The former gives a match-time error; the latter fails to optimize
+       and so the match is always run using the interpreter.
+
+       In general, the \C escape sequence is best avoided. However, one way of
+       using  it that avoids the problem of malformed UTF characters is to use
+       a lookahead to check the length of the next character, as in this  pat-
+       tern,  which  could be used with a UTF-8 string (ignore white space and
+       line breaks):
+
+         (?| (?=[\x00-\x7f])(\C) |
+             (?=[\x80-\x{7ff}])(\C)(\C) |
+             (?=[\x{800}-\x{ffff}])(\C)(\C)(\C) |
+             (?=[\x{10000}-\x{1fffff}])(\C)(\C)(\C)(\C))
+
+       In this example, a group that starts  with  (?|  resets  the  capturing
+       parentheses numbers in each alternative (see "Duplicate Subpattern Num-
+       bers" below). The assertions at the start of each branch check the next
+       UTF-8  character  for  values  whose encoding uses 1, 2, 3, or 4 bytes,
+       respectively. The character's individual bytes are then captured by the
+       appropriate number of \C groups.
+
+
+SQUARE BRACKETS AND CHARACTER CLASSES
+
+       An opening square bracket introduces a character class, terminated by a
+       closing square bracket. A closing square bracket on its own is not spe-
+       cial  by  default.  If a 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. This
+       means that, by default, an empty class cannot be defined.  However,  if
+       the  PCRE2_ALLOW_EMPTY_CLASS option is set, a closing square bracket at
+       the start does end the (empty) class.
+
+       A character class matches a single character in the subject. A  matched
+       character must be in the set of characters defined by the class, unless
+       the first character in the class definition is a circumflex,  in  which
+       case the subject character must not be in 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.
+
+       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 that are in the class by enumerating those that are  not.  A
+       class  that starts with a circumflex is not an assertion; it still con-
+       sumes a character from the subject string, and therefore  it  fails  if
+       the current pointer is at the end of the string.
+
+       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.
+
+       Characters that might indicate line breaks are  never  treated  in  any
+       special  way  when  matching  character  classes,  whatever line-ending
+       sequence is in use,  and  whatever  setting  of  the  PCRE2_DOTALL  and
+       PCRE2_MULTILINE  options  is  used. A class such as [^a] always matches
+       one of these characters.
+
+       The minus (hyphen) character can be used to specify a range of  charac-
+       ters  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, or immediately after a range. For
+       example, [b-d-z] matches letters in the range b to d, a hyphen  charac-
+       ter, or z.
+
+       It is not possible to have the literal character "]" as the end charac-
+       ter 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 inter-
+       preted 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.
+
+       An error is generated if a POSIX character  class  (see  below)  or  an
+       escape  sequence other than one that defines a single character appears
+       at a point where a range ending character  is  expected.  For  example,
+       [z-\xff] is valid, but [A-\d] and [A-[:digit:]] are not.
+
+       Ranges normally include all code points between the start and end char-
+       acters, inclusive. They can also be  used  for  code  points  specified
+       numerically, for example [\000-\037]. Ranges can include any characters
+       that are valid for the current mode.
+
+       There is a special case in EBCDIC environments  for  ranges  whose  end
+       points are both specified as literal letters in the same case. For com-
+       patibility with Perl, EBCDIC code points within the range that are  not
+       letters  are  omitted. For example, [h-k] matches only four characters,
+       even though the codes for h and k are 0x88 and 0x92, a range of 11 code
+       points.  However,  if  the range is specified numerically, for example,
+       [\x88-\x92] or [h-\x92], all code points are included.
+
+       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  in  a  non-UTF  mode,  if
+       character  tables  for  a French locale are in use, [\xc8-\xcb] matches
+       accented E characters in both cases.
+
+       The character escape sequences \d, \D, \h, \H, \p, \P, \s, \S, \v,  \V,
+       \w, and \W may appear in a character class, and add the characters that
+       they match to the class. For example, [\dABCDEF] matches any  hexadeci-
+       mal  digit.  In UTF modes, the PCRE2_UCP option affects the meanings of
+       \d, \s, \w and their upper case partners, just as  it  does  when  they
+       appear  outside a character class, as described in the section entitled
+       "Generic character types" above. The escape sequence \b has a different
+       meaning  inside  a character class; it matches the backspace character.
+       The sequences \B, \N, \R, and \X are not  special  inside  a  character
+       class.  Like  any  other  unrecognized  escape sequences, they cause an
+       error.
+
+       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, whereas [\w] includes underscore. A positive
+       character class should be read as "something OR something OR ..." and a
+       negative class as "NOT something AND NOT something AND NOT ...".
+
+       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, or for  a
+       special  compatibility  feature  -  see the next two sections), and the
+       terminating  closing  square  bracket.  However,  escaping  other  non-
+       alphanumeric characters does no harm.
+
+
+POSIX CHARACTER CLASSES
+
+       Perl supports the POSIX notation for character classes. This uses names
+       enclosed by [: and :] within the enclosing square brackets. PCRE2  also
+       supports this notation. For example,
+
+         [01[:alpha:]%]
+
+       matches "0", "1", any alphabetic character, or "%". The supported class
+       names are:
+
+         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)
+         graph    printing characters, excluding space
+         lower    lower case letters
+         print    printing characters, including space
+         punct    printing characters, excluding letters and digits and space
+         space    white space (the same as \s from PCRE2 8.34)
+         upper    upper case letters
+         word     "word" characters (same as \w)
+         xdigit   hexadecimal digits
+
+       The default "space" characters are HT (9), LF (10), VT (11),  FF  (12),
+       CR  (13),  and space (32). If locale-specific matching is taking place,
+       the list of space characters may be different; there may  be  fewer  or
+       more of them. "Space" and \s match the same set of characters.
+
+       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,
+
+         [12[:^digit:]]
+
+       matches "1", "2", or any non-digit. PCRE2 (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.
+
+       By default, characters with values greater than 127 do not match any of
+       the POSIX character classes, although this may be different for charac-
+       ters  in  the range 128-255 when locale-specific matching is happening.
+       However, if the PCRE2_UCP option is passed to pcre2_compile(), some  of
+       the  classes are changed so that Unicode character properties are used.
+       This  is  achieved  by  replacing  certain  POSIX  classes  with  other
+       sequences, as follows:
+
+         [:alnum:]  becomes  \p{Xan}
+         [:alpha:]  becomes  \p{L}
+         [:blank:]  becomes  \h
+         [:cntrl:]  becomes  \p{Cc}
+         [:digit:]  becomes  \p{Nd}
+         [:lower:]  becomes  \p{Ll}
+         [:space:]  becomes  \p{Xps}
+         [:upper:]  becomes  \p{Lu}
+         [:word:]   becomes  \p{Xwd}
+
+       Negated  versions, such as [:^alpha:] use \P instead of \p. Three other
+       POSIX classes are handled specially in UCP mode:
+
+       [:graph:] This matches characters that have glyphs that mark  the  page
+                 when printed. In Unicode property terms, it matches all char-
+                 acters with the L, M, N, P, S, or Cf properties, except for:
+
+                   U+061C           Arabic Letter Mark
+                   U+180E           Mongolian Vowel Separator
+                   U+2066 - U+2069  Various "isolate"s
+
+
+       [:print:] This matches the same  characters  as  [:graph:]  plus  space
+                 characters  that  are  not controls, that is, characters with
+                 the Zs property.
+
+       [:punct:] This matches all characters that have the Unicode P (punctua-
+                 tion)  property,  plus those characters with code points less
+                 than 256 that have the S (Symbol) property.
+
+       The other POSIX classes are unchanged, and match only  characters  with
+       code points less than 256.
+
+
+COMPATIBILITY FEATURE FOR WORD BOUNDARIES
+
+       In  the POSIX.2 compliant library that was included in 4.4BSD Unix, the
+       ugly syntax [[:<:]] and [[:>:]] is used for matching  "start  of  word"
+       and "end of word". PCRE2 treats these items as follows:
+
+         [[:<:]]  is converted to  \b(?=\w)
+         [[:>:]]  is converted to  \b(?<=\w)
+
+       Only these exact character sequences are recognized. A sequence such as
+       [a[:<:]b] provokes error for an unrecognized  POSIX  class  name.  This
+       support  is not compatible with Perl. It is provided to help migrations
+       from other environments, and is best not used in any new patterns. Note
+       that  \b matches at the start and the end of a word (see "Simple asser-
+       tions" above), and in a Perl-style pattern the preceding  or  following
+       character  normally  shows  which  is  wanted, without the need for the
+       assertions that are used above in order to give exactly the  POSIX  be-
+       haviour.
+
+
+VERTICAL BAR
+
+       Vertical  bar characters are used to separate alternative patterns. For
+       example, the pattern
+
+         gilbert|sullivan
+
+       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.
+
+
+INTERNAL OPTION SETTING
+
+       The  settings of the PCRE2_CASELESS, PCRE2_MULTILINE, PCRE2_DOTALL, and
+       PCRE2_EXTENDED options (which are Perl-compatible) can be changed  from
+       within  the  pattern  by  a  sequence  of  Perl option letters enclosed
+       between "(?" and ")".  The option letters are
+
+         i  for PCRE2_CASELESS
+         m  for PCRE2_MULTILINE
+         s  for PCRE2_DOTALL
+         x  for PCRE2_EXTENDED
+
+       For example, (?im) sets caseless, multiline matching. It is also possi-
+       ble to unset these options by preceding the letter with a hyphen, and a
+       combined setting and unsetting such as (?im-sx), which sets PCRE2_CASE-
+       LESS    and    PCRE2_MULTILINE   while   unsetting   PCRE2_DOTALL   and
+       PCRE2_EXTENDED, is also permitted. If a letter appears both before  and
+       after  the  hyphen, the option is unset. An empty options setting "(?)"
+       is allowed. Needless to say, it has no effect.
+
+       The PCRE2-specific options PCRE2_DUPNAMES  and  PCRE2_UNGREEDY  can  be
+       changed  in  the  same  way as the Perl-compatible options by using the
+       characters J and U respectively.
+
+       When one of these option changes 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,  PCRE2  extracts  it  into  the global options (and it will
+       therefore show up in data extracted by the  pcre2_pattern_info()  func-
+       tion).
+
+       An  option  change  within a subpattern (see below for a description of
+       subpatterns) affects only that part of the subpattern that follows  it,
+       so
+
+         (a(?i)b)c
+
+       matches  abc  and  aBc and no other strings (assuming PCRE2_CASELESS is
+       not used).  By this means, options can be made to have  different  set-
+       tings in different parts of the pattern. Any changes made in one alter-
+       native do carry on into subsequent branches within the same subpattern.
+       For example,
+
+         (a(?i)b|c)
+
+       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.
+
+       As a convenient shorthand, if any option settings are required  at  the
+       start  of a non-capturing subpattern (see the next section), the option
+       letters may appear between the "?" and the ":". Thus the two patterns
+
+         (?i:saturday|sunday)
+         (?:(?i)saturday|sunday)
+
+       match exactly the same set of strings.
+
+       Note: There are other PCRE2-specific options that can  be  set  by  the
+       application when the compiling function is called. The pattern can con-
+       tain special leading sequences such as (*CRLF)  to  override  what  the
+       application  has  set  or what has been defaulted. Details are given in
+       the section entitled "Newline sequences"  above.  There  are  also  the
+       (*UTF)  and  (*UCP)  leading  sequences that can be used to set UTF and
+       Unicode property modes; they are equivalent to  setting  the  PCRE2_UTF
+       and  PCRE2_UCP  options, respectively. However, the application can set
+       the PCRE2_NEVER_UTF and PCRE2_NEVER_UCP options, which lock out the use
+       of the (*UTF) and (*UCP) sequences.
+
+
+SUBPATTERNS
+
+       Subpatterns are delimited by parentheses (round brackets), which can be
+       nested.  Turning part of a pattern into a subpattern does two things:
+
+       1. It localizes a set of alternatives. For example, the pattern
+
+         cat(aract|erpillar|)
+
+       matches "cataract", "caterpillar", or "cat". Without  the  parentheses,
+       it would match "cataract", "erpillar" or an empty string.
+
+       2.  It  sets  up  the  subpattern as a capturing subpattern. This means
+       that, when the whole pattern matches, the portion of the subject string
+       that  matched  the  subpattern is passed back to the caller, separately
+       from the portion that matched the whole pattern. (This applies only  to
+       the  traditional  matching function; the DFA matching function does not
+       support capturing.)
+
+       Opening parentheses are counted from left to right (starting from 1) to
+       obtain  numbers  for  the  capturing  subpatterns.  For example, if the
+       string "the red king" is matched against the pattern
+
+         the ((red|white) (king|queen))
+
+       the captured substrings are "red king", "red", and "king", and are num-
+       bered 1, 2, and 3, respectively.
+
+       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  captur-
+       ing,  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
+
+         the ((?:red|white) (king|queen))
+
+       the captured substrings are "white queen" and "queen", and are numbered
+       1 and 2. The maximum number of capturing subpatterns is 65535.
+
+       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
+
+         (?i:saturday|sunday)
+         (?:(?i)saturday|sunday)
+
+       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".
+
+
+DUPLICATE SUBPATTERN NUMBERS
+
+       Perl 5.10 introduced a feature whereby each alternative in a subpattern
+       uses  the same numbers for its capturing parentheses. Such a subpattern
+       starts with (?| and is itself a non-capturing subpattern. For  example,
+       consider this pattern:
+
+         (?|(Sat)ur|(Sun))day
+
+       Because  the two alternatives are inside a (?| group, both sets of cap-
+       turing parentheses are numbered one. Thus, when  the  pattern  matches,
+       you  can  look  at captured substring number one, whichever alternative
+       matched. This construct is useful when you want to  capture  part,  but
+       not all, of one of a number of alternatives. Inside a (?| group, paren-
+       theses are numbered as usual, but the number is reset at the  start  of
+       each  branch.  The numbers of any capturing parentheses that follow the
+       subpattern start after the highest number used in any branch. The  fol-
+       lowing example is taken from the Perl documentation. The numbers under-
+       neath show in which buffer the captured content will be stored.
+
+         # before  ---------------branch-reset----------- after
+         / ( a )  (?| x ( y ) z | (p (q) r) | (t) u (v) ) ( z ) /x
+         # 1            2         2  3        2     3     4
+
+       A back reference to a numbered subpattern uses the  most  recent  value
+       that  is  set  for that number by any subpattern. The following pattern
+       matches "abcabc" or "defdef":
+
+         /(?|(abc)|(def))\1/
+
+       In contrast, a subroutine call to a numbered subpattern  always  refers
+       to  the  first  one in the pattern with the given number. The following
+       pattern matches "abcabc" or "defabc":
+
+         /(?|(abc)|(def))(?1)/
+
+       A relative reference such as (?-1) is no different: it is just a conve-
+       nient way of computing an absolute group number.
+
+       If  a condition test for a subpattern's having matched refers to a non-
+       unique number, the test is true if any of the subpatterns of that  num-
+       ber have matched.
+
+       An  alternative approach to using this "branch reset" feature is to use
+       duplicate named subpatterns, as described in the next section.
+
+
+NAMED SUBPATTERNS
+
+       Identifying capturing parentheses by number is simple, but  it  can  be
+       very  hard  to keep track of the numbers in complicated regular expres-
+       sions. Furthermore, if an  expression  is  modified,  the  numbers  may
+       change. To help with this difficulty, PCRE2 supports the naming of sub-
+       patterns. This feature was not added to Perl until release 5.10. Python
+       had  the feature earlier, and PCRE1 introduced it at release 4.0, using
+       the Python syntax. PCRE2 supports both the Perl and the Python  syntax.
+       Perl  allows  identically numbered subpatterns to have different names,
+       but PCRE2 does not.
+
+       In PCRE2, a subpattern can be named in one of three ways:  (?<name>...)
+       or  (?'name'...)  as in Perl, or (?P<name>...) as in Python. References
+       to capturing parentheses from other parts of the pattern, such as  back
+       references,  recursion,  and conditions, can be made by name as well as
+       by number.
+
+       Names consist of up to 32 alphanumeric characters and underscores,  but
+       must  start  with  a  non-digit.  Named capturing parentheses are still
+       allocated numbers as well as names, exactly as if the  names  were  not
+       present. The PCRE2 API provides function calls for extracting the name-
+       to-number translation table from a compiled  pattern.  There  are  also
+       convenience functions for extracting a captured substring by name.
+
+       By  default, a name must be unique within a pattern, but it is possible
+       to relax this constraint by setting the PCRE2_DUPNAMES option  at  com-
+       pile  time.  (Duplicate names are also always permitted for subpatterns
+       with the same number, set up as described  in  the  previous  section.)
+       Duplicate  names  can be useful for patterns where only one instance of
+       the named parentheses can match.  Suppose you want to match the name of
+       a  weekday,  either as a 3-letter abbreviation or as the full name, and
+       in both cases you  want  to  extract  the  abbreviation.  This  pattern
+       (ignoring the line breaks) does the job:
+
+         (?<DN>Mon|Fri|Sun)(?:day)?|
+         (?<DN>Tue)(?:sday)?|
+         (?<DN>Wed)(?:nesday)?|
+         (?<DN>Thu)(?:rsday)?|
+         (?<DN>Sat)(?:urday)?
+
+       There  are  five capturing substrings, but only one is ever set after a
+       match.  (An alternative way of solving this problem is to use a "branch
+       reset" subpattern, as described in the previous section.)
+
+       The  convenience  functions for extracting the data by name returns the
+       substring for the first (and in this example, the only)  subpattern  of
+       that  name  that  matched.  This saves searching to find which numbered
+       subpattern it was.
+
+       If you make a back reference to  a  non-unique  named  subpattern  from
+       elsewhere  in the pattern, the subpatterns to which the name refers are
+       checked in the order in which they appear in the overall  pattern.  The
+       first one that is set is used for the reference. For example, this pat-
+       tern matches both "foofoo" and "barbar" but not "foobar" or "barfoo":
+
+         (?:(?<n>foo)|(?<n>bar))\k<n>
+
+
+       If you make a subroutine call to a non-unique named subpattern, the one
+       that  corresponds  to  the first occurrence of the name is used. In the
+       absence of duplicate numbers (see the previous section) this is the one
+       with the lowest number.
+
+       If you use a named reference in a condition test (see the section about
+       conditions below), either to check whether a subpattern has matched, or
+       to  check for recursion, all subpatterns with the same name are tested.
+       If the condition is true for any one of them, the overall condition  is
+       true.  This  is  the  same  behaviour as testing by number. For further
+       details of the interfaces  for  handling  named  subpatterns,  see  the
+       pcre2api documentation.
+
+       Warning: You cannot use different names to distinguish between two sub-
+       patterns with the same number because PCRE2 uses only the numbers  when
+       matching. For this reason, an error is given at compile time if differ-
+       ent names are given to subpatterns with the same number.  However,  you
+       can always give the same name to subpatterns with the same number, even
+       when PCRE2_DUPNAMES is not set.
+
+
+REPETITION
+
+       Repetition is specified by quantifiers, which can  follow  any  of  the
+       following items:
+
+         a literal data character
+         the dot metacharacter
+         the \C escape sequence
+         the \X escape sequence
+         the \R escape sequence
+         an escape such as \d or \pL that matches a single character
+         a character class
+         a back reference
+         a parenthesized subpattern (including most assertions)
+         a subroutine call to a subpattern (recursive or otherwise)
+
+       The  general repetition quantifier specifies a minimum and maximum num-
+       ber 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:
+
+         z{2,4}
+
+       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
+
+         [aeiou]{3,}
+
+       matches at least 3 successive vowels, but may match many more, whereas
+
+         \d{8}
+
+       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  exam-
+       ple, {,6} is not a quantifier, but a literal string of four characters.
+
+       In UTF modes, quantifiers apply to characters rather than to individual
+       code units. Thus, for example, \x{100}{2} matches two characters,  each
+       of which is represented by a two-byte sequence in a UTF-8 string. Simi-
+       larly, \X{3} matches three Unicode extended grapheme clusters, each  of
+       which  may  be  several  code  units long (and they may be of different
+       lengths).
+
+       The quantifier {0} is permitted, causing the expression to behave as if
+       the previous item and the quantifier were not present. This may be use-
+       ful for subpatterns that are referenced as subroutines  from  elsewhere
+       in the pattern (but see also the section entitled "Defining subpatterns
+       for use by reference only" below). Items other  than  subpatterns  that
+       have a {0} quantifier are omitted from the compiled pattern.
+
+       For  convenience, the three most common quantifiers have single-charac-
+       ter abbreviations:
+
+         *    is equivalent to {0,}
+         +    is equivalent to {1,}
+         ?    is equivalent to {0,1}
+
+       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:
+
+         (a?)*
+
+       Earlier versions of Perl and PCRE1 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 bro-
+       ken.
+
+       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 /* and */ and within the comment,  individual  *  and  /
+       characters  may  appear. An attempt to match C comments by applying the
+       pattern
+
+         /\*.*\*/
+
+       to the string
+
+         /* first comment */  not comment  /* second comment */
+
+       fails, because it matches the entire string owing to the greediness  of
+       the .*  item.
+
+       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  pat-
+       tern
+
+         /\*.*?\*/
+
+       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
+
+       which matches one digit by preference, but can match two if that is the
+       only way the rest of the pattern matches.
+
+       If the PCRE2_UNGREEDY option is set (an option that 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.
+
+       When  a  parenthesized  subpattern  is quantified with a minimum repeat
+       count that 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.
+
+       If a pattern starts with  .*  or  .{0,}  and  the  PCRE2_DOTALL  option
+       (equivalent  to  Perl's /s) is set, thus allowing the dot to match new-
+       lines, 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. PCRE2 normally treats such a pattern as though it were
+       preceded by \A.
+
+       In cases where it is known that the subject  string  contains  no  new-
+       lines,  it  is worth setting PCRE2_DOTALL in order to obtain this opti-
+       mization, or alternatively, using ^ to indicate anchoring explicitly.
+
+       However, there are some cases where the optimization  cannot  be  used.
+       When .*  is inside capturing parentheses that are the subject of a back
+       reference elsewhere in the pattern, a match at the start may fail where
+       a later one succeeds. Consider, for example:
+
+         (.*)abc\1
+
+       If  the subject is "xyz123abc123" the match point is the fourth charac-
+       ter. For this reason, such a pattern is not implicitly anchored.
+
+       Another case where implicit anchoring is not applied is when the  lead-
+       ing  .* is inside an atomic group. Once again, a match at the start may
+       fail where a later one succeeds. Consider this pattern:
+
+         (?>.*?a)b
+
+       It matches "ab" in the subject "aab". The use of the backtracking  con-
+       trol  verbs  (*PRUNE)  and  (*SKIP) also disable this optimization, and
+       there is an option, PCRE2_NO_DOTSTAR_ANCHOR, to do so explicitly.
+
+       When a capturing subpattern is repeated, the value captured is the sub-
+       string that matched the final iteration. For example, after
+
+         (tweedle[dume]{3}\s*)+
+
+       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 itera-
+       tions. For example, after
+
+         (a|(b))+
+
+       matches "aba" the value of the second captured substring is "b".
+
+
+ATOMIC GROUPING AND POSSESSIVE QUANTIFIERS
+
+       With both maximizing ("greedy") and minimizing ("ungreedy"  or  "lazy")
+       repetition,  failure  of what follows normally causes the repeated item
+       to be re-evaluated to see if a different number of repeats  allows  the
+       rest  of  the pattern to match. Sometimes it is 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
+
+         123456bar
+
+       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+  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.
+
+       If we use atomic grouping for the previous example, the  matcher  gives
+       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+)foo
+
+       This kind of parenthesis "locks up" the  part of the  pattern  it  con-
+       tains  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.
+
+       An  alternative  description  is that a subpattern of this type matches
+       exactly the string of characters that an identical  standalone  pattern
+       would match, if anchored at the current point in the subject string.
+
+       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 pre-
+       pared 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.
+
+       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++foo
+
+       Note that a possessive quantifier can be used with an entire group, for
+       example:
+
+         (abc|xyz){2,3}+
+
+       Possessive  quantifiers  are  always  greedy;  the   setting   of   the
+       PCRE2_UNGREEDY  option  is  ignored. They are a convenient notation for
+       the simpler forms of atomic group. However, there is no  difference  in
+       the meaning of a possessive quantifier and the equivalent atomic group,
+       though there may be a performance  difference;  possessive  quantifiers
+       should be slightly faster.
+
+       The  possessive  quantifier syntax is an extension to the Perl 5.8 syn-
+       tax.  Jeffrey Friedl originated the idea (and the name)  in  the  first
+       edition of his book. Mike McCloskey liked it, so implemented it when he
+       built Sun's Java package, and PCRE1 copied it from there. It ultimately
+       found its way into Perl at release 5.10.
+
+       PCRE2  has  an  optimization  that automatically "possessifies" certain
+       simple pattern constructs. For example, the sequence A+B is treated  as
+       A++B  because  there is no point in backtracking into a sequence of A's
+       when B must follow.  This feature can be disabled by the PCRE2_NO_AUTO-
+       POSSESS option, or starting the pattern with (*NO_AUTO_POSSESS).
+
+       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+>)*[!?]
+
+       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
+
+         aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+
+       it takes a long time before reporting  failure.  This  is  because  the
+       string  can be divided between the internal \D+ 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 PCRE2 and Perl have an optimization that allows for  fast  failure
+       when  a single character is used. They remember the last single charac-
+       ter 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:
+
+         ((?>\D+)|<\d+>)*[!?]
+
+       sequences of non-digits cannot be broken, and failure happens quickly.
+
+
+BACK REFERENCES
+
+       Outside a character class, a backslash followed by a digit greater than
+       0 (and possibly further digits) is a back reference to a capturing sub-
+       pattern earlier (that is, to its left) in the pattern,  provided  there
+       have been that many previous capturing left parentheses.
+
+       However,  if the decimal number following the backslash is less than 8,
+       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 pat-
+       tern. In other words, the parentheses that are referenced need  not  be
+       to  the  left of the reference for numbers less than 8. A "forward back
+       reference" of this type can make sense when a  repetition  is  involved
+       and  the  subpattern to the right has participated in an earlier itera-
+       tion.
+
+       It is not possible to have a numerical "forward back  reference"  to  a
+       subpattern  whose  number  is  8  or  more  using this syntax because a
+       sequence such as \50 is interpreted as a character  defined  in  octal.
+       See the subsection entitled "Non-printing characters" above for further
+       details of the handling of digits following a backslash.  There  is  no
+       such  problem  when named parentheses are used. A back reference to any
+       subpattern is possible using named parentheses (see below).
+
+       Another way of avoiding the ambiguity inherent in  the  use  of  digits
+       following  a  backslash  is  to use the \g escape sequence. This escape
+       must be followed by an unsigned number or a negative number, optionally
+       enclosed in braces. These examples are all identical:
+
+         (ring), \1
+         (ring), \g1
+         (ring), \g{1}
+
+       An  unsigned number specifies an absolute reference without the ambigu-
+       ity that is present in the older syntax. It is also useful when literal
+       digits follow the reference. A negative number is a relative reference.
+       Consider this example:
+
+         (abc(def)ghi)\g{-1}
+
+       The sequence \g{-1} is a reference to the most recently started captur-
+       ing subpattern before \g, that is, is it equivalent to \2 in this exam-
+       ple.  Similarly, \g{-2} would be equivalent to \1. The use of  relative
+       references  can  be helpful in long patterns, and also in patterns that
+       are created by  joining  together  fragments  that  contain  references
+       within themselves.
+
+       A  back  reference matches whatever actually matched the capturing sub-
+       pattern in the current subject string, rather  than  anything  matching
+       the subpattern itself (see "Subpatterns as subroutines" below for a way
+       of doing that). So the pattern
+
+         (sens|respons)e and \1ibility
+
+       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  exam-
+       ple,
+
+         ((?i)rah)\s+\1
+
+       matches  "rah  rah"  and  "RAH RAH", but not "RAH rah", even though the
+       original capturing subpattern is matched caselessly.
+
+       There are several different ways of writing back  references  to  named
+       subpatterns.  The  .NET syntax \k{name} and the Perl syntax \k<name> or
+       \k'name' are supported, as is the Python syntax (?P=name). Perl  5.10's
+       unified back reference syntax, in which \g can be used for both numeric
+       and named references, is also supported. We  could  rewrite  the  above
+       example in any of the following ways:
+
+         (?<p1>(?i)rah)\s+\k<p1>
+         (?'p1'(?i)rah)\s+\k{p1}
+         (?P<p1>(?i)rah)\s+(?P=p1)
+         (?<p1>(?i)rah)\s+\g{p1}
+
+       A  subpattern  that  is  referenced  by  name may appear in the pattern
+       before or after the reference.
+
+       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 by default. For example, the pattern
+
+         (a|(bc))\2
+
+       always fails if it starts to match "a" rather than  "bc".  However,  if
+       the  PCRE2_MATCH_UNSET_BACKREF  option  is  set at compile time, a back
+       reference to an unset value matches an empty string.
+
+       Because there may be many capturing parentheses in a pattern, all  dig-
+       its  following a backslash are taken as part of a potential back refer-
+       ence number.  If the pattern continues with  a  digit  character,  some
+       delimiter  must  be  used  to  terminate  the  back  reference.  If the
+       PCRE2_EXTENDED option is set, this can be white space.  Otherwise,  the
+       \g{ syntax or an empty comment (see "Comments" below) can be used.
+
+   Recursive back references
+
+       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.   However,  such references can be useful inside repeated sub-
+       patterns. For example, the pattern
+
+         (a|b\1)+
+
+       matches any number of "a"s and also "aba", "ababbaa" etc. At each iter-
+       ation  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.
+
+       Back  references of this type cause the group that they reference to be
+       treated as an atomic group.  Once the whole group has been  matched,  a
+       subsequent  matching  failure cannot cause backtracking into the middle
+       of the group.
+
+
+ASSERTIONS
+
+       An assertion is a test on the characters  following  or  preceding  the
+       current matching point that does not consume any characters. The simple
+       assertions coded as \b, \B, \A, \G, \Z,  \z,  ^  and  $  are  described
+       above.
+
+       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.
+
+       Assertion  subpatterns are not capturing subpatterns. If such an asser-
+       tion contains capturing subpatterns within it, these  are  counted  for
+       the  purposes  of numbering the capturing subpatterns in the whole pat-
+       tern. However, substring capturing is carried  out  only  for  positive
+       assertions. (Perl sometimes, but not always, does do capturing in nega-
+       tive assertions.)
+
+       For  compatibility  with  Perl,  most  assertion  subpatterns  may   be
+       repeated;  though  it  makes  no sense to assert the same thing several
+       times, the side effect of capturing  parentheses  may  occasionally  be
+       useful.  However,  an  assertion  that forms the condition for a condi-
+       tional subpattern may not be quantified. In practice, for other  asser-
+       tions, there only three cases:
+
+       (1)  If  the  quantifier  is  {0}, the assertion is never obeyed during
+       matching.  However, it may  contain  internal  capturing  parenthesized
+       groups that are called from elsewhere via the subroutine mechanism.
+
+       (2)  If quantifier is {0,n} where n is greater than zero, it is treated
+       as if it were {0,1}. At run time, the rest  of  the  pattern  match  is
+       tried with and without the assertion, the order depending on the greed-
+       iness of the quantifier.
+
+       (3) If the minimum repetition is greater than zero, the  quantifier  is
+       ignored.   The  assertion  is  obeyed just once when encountered during
+       matching.
+
+   Lookahead assertions
+
+       Lookahead assertions start with (?= for positive assertions and (?! for
+       negative assertions. For example,
+
+         \w+(?=;)
+
+       matches  a word followed by a semicolon, but does not include the semi-
+       colon in the match, and
+
+         foo(?!bar)
+
+       matches any occurrence of "foo" that is not  followed  by  "bar".  Note
+       that the apparently similar pattern
+
+         (?!foo)bar
+
+       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 the other effect.
+
+       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.  The backtracking control verb (*FAIL) or (*F)
+       is a synonym for (?!).
+
+   Lookbehind assertions
+
+       Lookbehind assertions start with (?<= for positive assertions and  (?<!
+       for negative assertions. For example,
+
+         (?<!foo)bar
+
+       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 sev-
+       eral top-level alternatives, they do not all  have  to  have  the  same
+       fixed length. Thus
+
+         (?<=bullock|donkey)
+
+       is permitted, but
+
+         (?<!dogs?|cats?)
+
+       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, which requires all branches to
+       match the same length of string. An assertion such as
+
+         (?<=ab(c|de))
+
+       is not permitted, because its single top-level  branch  can  match  two
+       different  lengths,  but  it is acceptable to PCRE2 if rewritten to use
+       two top-level branches:
+
+         (?<=abc|abde)
+
+       In some cases, the escape sequence \K (see above) can be  used  instead
+       of a lookbehind assertion to get round the fixed-length restriction.
+
+       The  implementation  of lookbehind assertions is, for each alternative,
+       to temporarily move the current position back by the fixed  length  and
+       then try to match. If there are insufficient characters before the cur-
+       rent position, the assertion fails.
+
+       In a UTF mode, PCRE2 does not allow the \C escape (which matches a sin-
+       gle  code  unit even in a UTF mode) to appear in lookbehind assertions,
+       because it makes it impossible to calculate the length of  the  lookbe-
+       hind.  The \X and \R escapes, which can match different numbers of code
+       units, are also not permitted.
+
+       "Subroutine" calls (see below) such as (?2) or (?&X) are  permitted  in
+       lookbehinds,  as  long as the subpattern matches a fixed-length string.
+       Recursion, however, is not supported.
+
+       Possessive quantifiers can  be  used  in  conjunction  with  lookbehind
+       assertions to specify efficient matching of fixed-length strings at the
+       end of subject strings. Consider a simple pattern such as
+
+         abcd$
+
+       when applied to a long string that does  not  match.  Because  matching
+       proceeds  from  left to right, PCRE2 will look for each "a" in the sub-
+       ject and then see if what follows matches the rest of the  pattern.  If
+       the pattern is specified as
+
+         ^.*abcd$
+
+       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
+
+         ^.*+(?<=abcd)
+
+       there can be no backtracking for the .*+ item because of the possessive
+       quantifier; it can match only the entire string. The subsequent lookbe-
+       hind  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.
+
+   Using multiple assertions
+
+       Several assertions (of any sort) may occur in succession. For example,
+
+         (?<=\d{3})(?<!999)foo
+
+       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 not match "foo" pre-
+       ceded by six characters, the first of which are  digits  and  the  last
+       three  of  which  are not "999". For example, it doesn't match "123abc-
+       foo". A pattern to do that is
+
+         (?<=\d{3}...)(?<!999)foo
+
+       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".
+
+       Assertions can be nested in any combination. For example,
+
+         (?<=(?<!foo)bar)baz
+
+       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 that matches "foo" preceded by three digits and any
+       three characters that are not "999".
+
+
+CONDITIONAL SUBPATTERNS
+
+       It is possible to cause the matching process to obey a subpattern  con-
+       ditionally  or to choose between two alternative subpatterns, depending
+       on the result of an assertion, or whether a specific capturing  subpat-
+       tern  has  already  been matched. The two possible forms of conditional
+       subpattern are:
+
+         (?(condition)yes-pattern)
+         (?(condition)yes-pattern|no-pattern)
+
+       If the condition is satisfied, the yes-pattern is used;  otherwise  the
+       no-pattern  (if  present)  is used. If there are more than two alterna-
+       tives in the subpattern, a compile-time error occurs. Each of  the  two
+       alternatives may itself contain nested subpatterns of any form, includ-
+       ing  conditional  subpatterns;  the  restriction  to  two  alternatives
+       applies only at the level of the condition. This pattern fragment is an
+       example where the alternatives are complex:
+
+         (?(1) (A|B|C) | (D | (?(2)E|F) | E) )
+
+
+       There are five kinds of condition: references  to  subpatterns,  refer-
+       ences  to  recursion,  two pseudo-conditions called DEFINE and VERSION,
+       and assertions.
+
+   Checking for a used subpattern by number
+
+       If the text between the parentheses consists of a sequence  of  digits,
+       the condition is true if a capturing subpattern of that number has pre-
+       viously matched. If there is more than one  capturing  subpattern  with
+       the  same  number  (see  the earlier section about duplicate subpattern
+       numbers), the condition is true if any of them have matched. An  alter-
+       native  notation is to precede the digits with a plus or minus sign. In
+       this case, the subpattern number is relative rather than absolute.  The
+       most  recently opened parentheses can be referenced by (?(-1), the next
+       most recent by (?(-2), and so on. Inside loops it can also  make  sense
+       to refer to subsequent groups. The next parentheses to be opened can be
+       referenced as (?(+1), and so on. (The value zero in any of these  forms
+       is not used; it provokes a compile-time error.)
+
+       Consider  the  following  pattern, which contains non-significant white
+       space to make it more readable (assume the PCRE2_EXTENDED  option)  and
+       to divide it into three parts for ease of discussion:
+
+         ( \( )?    [^()]+    (?(1) \) )
+
+       The  first  part  matches  an optional opening parenthesis, and if that
+       character is present, sets it as the first captured substring. The sec-
+       ond  part  matches one or more characters that are not parentheses. The
+       third part is a conditional subpattern that tests whether  or  not  the
+       first  set  of  parentheses  matched.  If they did, that is, if subject
+       started with an opening parenthesis, the condition is true, and so  the
+       yes-pattern  is  executed and a closing parenthesis is required. Other-
+       wise, 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.
+
+       If you were embedding this pattern in a larger one,  you  could  use  a
+       relative reference:
+
+         ...other stuff... ( \( )?    [^()]+    (?(-1) \) ) ...
+
+       This  makes  the  fragment independent of the parentheses in the larger
+       pattern.
+
+   Checking for a used subpattern by name
+
+       Perl uses the syntax (?(<name>)...) or (?('name')...)  to  test  for  a
+       used  subpattern  by  name.  For compatibility with earlier versions of
+       PCRE1, which had this facility before Perl, the syntax (?(name)...)  is
+       also recognized.
+
+       Rewriting the above example to use a named subpattern gives this:
+
+         (?<OPEN> \( )?    [^()]+    (?(<OPEN>) \) )
+
+       If  the  name used in a condition of this kind is a duplicate, the test
+       is applied to all subpatterns of the same name, and is true if any  one
+       of them has matched.
+
+   Checking for pattern recursion
+
+       If the condition is the string (R), and there is no subpattern with the
+       name R, the condition is true if a recursive call to the whole  pattern
+       or any subpattern has been made. If digits or a name preceded by amper-
+       sand follow the letter R, for example:
+
+         (?(R3)...) or (?(R&name)...)
+
+       the condition is true if the most recent recursion is into a subpattern
+       whose number or name is given. This condition does not check the entire
+       recursion stack. If the name used in a condition  of  this  kind  is  a
+       duplicate, the test is applied to all subpatterns of the same name, and
+       is true if any one of them is the most recent recursion.
+
+       At "top level", all these recursion test  conditions  are  false.   The
+       syntax for recursive patterns is described below.
+
+   Defining subpatterns for use by reference only
+
+       If  the  condition  is  the string (DEFINE), and there is no subpattern
+       with the name DEFINE, the condition is  always  false.  In  this  case,
+       there  may  be  only  one  alternative  in the subpattern. It is always
+       skipped if control reaches this point  in  the  pattern;  the  idea  of
+       DEFINE  is that it can be used to define subroutines that can be refer-
+       enced from elsewhere. (The use of subroutines is described below.)  For
+       example,  a  pattern  to match an IPv4 address such as "192.168.23.245"
+       could be written like this (ignore white space and line breaks):
+
+         (?(DEFINE) (?<byte> 2[0-4]\d | 25[0-5] | 1\d\d | [1-9]?\d) )
+         \b (?&byte) (\.(?&byte)){3} \b
+
+       The first part of the pattern is a DEFINE group inside which a  another
+       group  named "byte" is defined. This matches an individual component of
+       an IPv4 address (a number less than 256). When  matching  takes  place,
+       this  part  of  the pattern is skipped because DEFINE acts like a false
+       condition. The rest of the pattern uses references to the  named  group
+       to  match the four dot-separated components of an IPv4 address, insist-
+       ing on a word boundary at each end.
+
+   Checking the PCRE2 version
+
+       Programs that link with a PCRE2 library can check the version by  call-
+       ing  pcre2_config()  with  appropriate arguments. Users of applications
+       that do not have access to the underlying code cannot do this.  A  spe-
+       cial  "condition" called VERSION exists to allow such users to discover
+       which version of PCRE2 they are dealing with by using this condition to
+       match  a string such as "yesno". VERSION must be followed either by "="
+       or ">=" and a version number.  For example:
+
+         (?(VERSION>=10.4)yes|no)
+
+       This pattern matches "yes" if the PCRE2 version is greater or equal  to
+       10.4,  or "no" otherwise. The fractional part of the version number may
+       not contain more than two digits.
+
+   Assertion conditions
+
+       If the condition is not in any of the above  formats,  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:
+
+         (?(?=[^a-z]*[a-z])
+         \d{2}-[a-z]{3}-\d{2}  |  \d{2}-\d{2}-\d{2} )
+
+       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.
+
+
+COMMENTS
+
+       There are two ways of including comments in patterns that are processed
+       by PCRE2. In both cases, the start of the comment  must  not  be  in  a
+       character  class,  nor  in  the middle of any other sequence of related
+       characters such as (?: or a subpattern name or number.  The  characters
+       that make up a comment play no part in the pattern matching.
+
+       The  sequence (?# marks the start of a comment that continues up to the
+       next closing parenthesis. Nested parentheses are not permitted. If  the
+       PCRE2_EXTENDED  option is set, an unescaped # character also introduces
+       a comment, which in this case continues to immediately after  the  next
+       newline  character  or character sequence in the pattern. Which charac-
+       ters are interpreted as newlines is controlled by an option  passed  to
+       the  compiling  function  or  by a special sequence at the start of the
+       pattern, as described in the  section  entitled  "Newline  conventions"
+       above.  Note  that the end of this type of comment is a literal newline
+       sequence in the pattern; escape sequences that happen  to  represent  a
+       newline   do  not  count.  For  example,  consider  this  pattern  when
+       PCRE2_EXTENDED is set, and the default  newline  convention  (a  single
+       linefeed character) is in force:
+
+         abc #comment \n still comment
+
+       On  encountering  the # character, pcre2_compile() skips along, looking
+       for a newline in the pattern. The sequence \n is still literal at  this
+       stage,  so  it does not terminate the comment. Only an actual character
+       with the code value 0x0a (the default newline) does so.
+
+
+RECURSIVE PATTERNS
+
+       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.
+
+       For some time, Perl has provided a facility that allows regular expres-
+       sions  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 using code interpolation to solve the
+       parentheses problem can be created like this:
+
+         $re = qr{\( (?: (?>[^()]+) | (?p{$re}) )* \)}x;
+
+       The (?p{...}) item interpolates Perl code at run time, and in this case
+       refers recursively to the pattern in which it appears.
+
+       Obviously,  PCRE2  cannot  support  the  interpolation  of  Perl  code.
+       Instead, it supports special syntax for recursion of  the  entire  pat-
+       tern, and also for individual subpattern recursion. After its introduc-
+       tion in PCRE1 and Python,  this  kind  of  recursion  was  subsequently
+       introduced into Perl at release 5.10.
+
+       A  special  item  that consists of (? followed by a number greater than
+       zero and a closing parenthesis is a recursive subroutine  call  of  the
+       subpattern  of  the  given  number, provided that it occurs inside that
+       subpattern. (If not, it is a non-recursive subroutine  call,  which  is
+       described  in  the  next  section.)  The special item (?R) or (?0) is a
+       recursive call of the entire regular expression.
+
+       This PCRE2 pattern solves the nested parentheses  problem  (assume  the
+       PCRE2_EXTENDED option is set so that white space is ignored):
+
+         \( ( [^()]++ | (?R) )* \)
+
+       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 parenthe-
+       sized substring).  Finally there is a closing parenthesis. Note the use
+       of a possessive quantifier to avoid backtracking into sequences of non-
+       parentheses.
+
+       If this were part of a larger pattern, you would not  want  to  recurse
+       the entire pattern, so instead you could use this:
+
+         ( \( ( [^()]++ | (?1) )* \) )
+
+       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.  This is made easier by the use of relative references. Instead
+       of (?1) in the pattern above you can write (?-2) to refer to the second
+       most  recently  opened  parentheses  preceding  the recursion. In other
+       words, a negative number counts capturing  parentheses  leftwards  from
+       the point at which it is encountered.
+
+       Be aware however, that if duplicate subpattern numbers are in use, rel-
+       ative references refer to the earliest subpattern with the  appropriate
+       number. Consider, for example:
+
+         (?|(a)|(b)) (c) (?-2)
+
+       The  first  two  capturing  groups (a) and (b) are both numbered 1, and
+       group (c) is number 2. When the reference  (?-2)  is  encountered,  the
+       second most recently opened parentheses has the number 1, but it is the
+       first such group (the (a) group) to which the  recursion  refers.  This
+       would  be  the  same  if  an absolute reference (?1) was used. In other
+       words, relative references are just a shorthand for computing  a  group
+       number.
+
+       It  is  also  possible  to refer to subsequently opened parentheses, by
+       writing references such as (?+2). However, these  cannot  be  recursive
+       because  the  reference  is  not inside the parentheses that are refer-
+       enced. They are always non-recursive subroutine calls, as described  in
+       the next section.
+
+       An  alternative  approach  is to use named parentheses. The Perl syntax
+       for this is (?&name); PCRE1's earlier syntax  (?P>name)  is  also  sup-
+       ported. We could rewrite the above example as follows:
+
+         (?<pn> \( ( [^()]++ | (?&pn) )* \) )
+
+       If  there  is more than one subpattern with the same name, the earliest
+       one is used.
+
+       The example pattern that we have been looking at contains nested unlim-
+       ited  repeats,  and  so the use of a possessive quantifier 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
+
+         (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()
+
+       it  yields  "no  match" quickly. However, if a possessive quantifier 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.
+
+       At the end of a match, the values of capturing  parentheses  are  those
+       from  the outermost level. If you want to obtain intermediate values, a
+       callout function can be used (see below and the pcre2callout documenta-
+       tion). If the pattern above is matched against
+
+         (ab(cd)ef)
+
+       the  value  for  the  inner capturing parentheses (numbered 2) is "ef",
+       which is the last value taken on at the top level. If a capturing  sub-
+       pattern  is  not  matched at the top level, its final captured value is
+       unset, even if it was (temporarily) set at a deeper  level  during  the
+       matching process.
+
+       If there are more than 15 capturing parentheses in a pattern, PCRE2 has
+       to obtain extra memory from the heap to store data during a  recursion.
+       If   no   memory   can   be   obtained,   the   match  fails  with  the
+       PCRE2_ERROR_NOMEMORY error.
+
+       Do not confuse the (?R) item with the condition (R),  which  tests  for
+       recursion.   Consider  this pattern, which matches text in angle brack-
+       ets, allowing for arbitrary nesting. Only digits are allowed in  nested
+       brackets  (that is, when recursing), whereas any characters are permit-
+       ted at the outer level.
+
+         < (?: (?(R) \d++  | [^<>]*+) | (?R)) * >
+
+       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.
+
+   Differences in recursion processing between PCRE2 and Perl
+
+       Recursion processing in PCRE2 differs from Perl in two important  ways.
+       In PCRE2 (like Python, but unlike Perl), a recursive subpattern call is
+       always treated as an atomic group. That is, once it has matched some of
+       the subject string, it is never re-entered, even if it contains untried
+       alternatives and there is a subsequent matching failure.  This  can  be
+       illustrated  by the following pattern, which purports to match a palin-
+       dromic string that contains an odd number of characters  (for  example,
+       "a", "aba", "abcba", "abcdcba"):
+
+         ^(.|(.)(?1)\2)$
+
+       The idea is that it either matches a single character, or two identical
+       characters surrounding a sub-palindrome. In Perl, this  pattern  works;
+       in  PCRE2  it  does not if the pattern is longer than three characters.
+       Consider the subject string "abcba":
+
+       At the top level, the first character is matched, but as it is  not  at
+       the end of the string, the first alternative fails; the second alterna-
+       tive is taken and the recursion kicks in. The recursive call to subpat-
+       tern  1  successfully  matches the next character ("b"). (Note that the
+       beginning and end of line tests are not part of the recursion).
+
+       Back at the top level, the next character ("c") is compared  with  what
+       subpattern  2 matched, which was "a". This fails. Because the recursion
+       is treated as an atomic group, there are now  no  backtracking  points,
+       and  so  the  entire  match fails. (Perl is able, at this point, to re-
+       enter the recursion and try the second alternative.)  However,  if  the
+       pattern is written with the alternatives in the other order, things are
+       different:
+
+         ^((.)(?1)\2|.)$
+
+       This time, the recursing alternative is tried first, and  continues  to
+       recurse  until  it runs out of characters, at which point the recursion
+       fails. But this time we do have  another  alternative  to  try  at  the
+       higher  level.  That  is  the  big difference: in the previous case the
+       remaining alternative is at a deeper recursion level, which PCRE2  can-
+       not use.
+
+       To  change  the pattern so that it matches all palindromic strings, not
+       just those with an odd number of characters, it is tempting  to  change
+       the pattern to this:
+
+         ^((.)(?1)\2|.?)$
+
+       Again,  this  works in Perl, but not in PCRE2, and for the same reason.
+       When a deeper recursion has matched a single character,  it  cannot  be
+       entered  again  in  order  to match an empty string. The solution is to
+       separate the two cases, and write out the odd and even cases as  alter-
+       natives at the higher level:
+
+         ^(?:((.)(?1)\2|)|((.)(?3)\4|.))
+
+       If  you  want  to match typical palindromic phrases, the pattern has to
+       ignore all non-word characters, which can be done like this:
+
+         ^\W*+(?:((.)\W*+(?1)\W*+\2|)|((.)\W*+(?3)\W*+\4|\W*+.\W*+))\W*+$
+
+       If run with the PCRE2_CASELESS option,  this  pattern  matches  phrases
+       such  as  "A  man, a plan, a canal: Panama!" and it works in both PCRE2
+       and Perl. Note the use of the possessive quantifier *+ to  avoid  back-
+       tracking  into  sequences  of  non-word characters. Without this, PCRE2
+       takes a great deal longer (ten times or more) to match typical phrases,
+       and Perl takes so long that you think it has gone into a loop.
+
+       WARNING:  The  palindrome-matching patterns above work only if the sub-
+       ject string does not start with a palindrome that is shorter  than  the
+       entire  string.  For example, although "abcba" is correctly matched, if
+       the subject is "ababa", PCRE2 finds the palindrome "aba" at the  start,
+       then  fails at top level because the end of the string does not follow.
+       Once again, it cannot jump back into the recursion to try other  alter-
+       natives, so the entire match fails.
+
+       The  second  way in which PCRE2 and Perl differ in their recursion pro-
+       cessing is in the handling of captured values. In Perl, when a  subpat-
+       tern  is  called recursively or as a subpattern (see the next section),
+       it has no access to any values that were captured  outside  the  recur-
+       sion,  whereas  in  PCRE2 these values can be referenced. Consider this
+       pattern:
+
+         ^(.)(\1|a(?2))
+
+       In PCRE2, this pattern matches "bab". The first  capturing  parentheses
+       match  "b",  then in the second group, when the back reference \1 fails
+       to match "b", the second alternative matches "a" and then recurses.  In
+       the  recursion,  \1 does now match "b" and so the whole match succeeds.
+       In Perl, the pattern fails to match because inside the  recursive  call
+       \1 cannot access the externally set value.
+
+
+SUBPATTERNS AS SUBROUTINES
+
+       If  the  syntax for a recursive subpattern call (either by number or by
+       name) is used outside the parentheses to which it refers,  it  operates
+       like  a subroutine in a programming language. The called subpattern may
+       be defined before or after the reference. A numbered reference  can  be
+       absolute or relative, as in these examples:
+
+         (...(absolute)...)...(?2)...
+         (...(relative)...)...(?-1)...
+         (...(?+1)...(relative)...
+
+       An earlier example pointed out that the pattern
+
+         (sens|respons)e and \1ibility
+
+       matches  "sense and sensibility" and "response and responsibility", but
+       not "sense and responsibility". If instead the pattern
+
+         (sens|respons)e and (?1)ibility
+
+       is used, it does match "sense and responsibility" as well as the  other
+       two  strings.  Another  example  is  given  in the discussion of DEFINE
+       above.
+
+       All subroutine calls, whether recursive or not, are always  treated  as
+       atomic  groups. That is, once a subroutine has matched some of the sub-
+       ject string, it is never re-entered, even if it contains untried alter-
+       natives  and  there  is  a  subsequent  matching failure. Any capturing
+       parentheses that are set during the subroutine  call  revert  to  their
+       previous values afterwards.
+
+       Processing  options  such as case-independence are fixed when a subpat-
+       tern is defined, so if it is used as a subroutine, such options  cannot
+       be changed for different calls. For example, consider this pattern:
+
+         (abc)(?i:(?-1))
+
+       It  matches  "abcabc". It does not match "abcABC" because the change of
+       processing option does not affect the called subpattern.
+
+
+ONIGURUMA SUBROUTINE SYNTAX
+
+       For compatibility with Oniguruma, the non-Perl syntax \g followed by  a
+       name or a number enclosed either in angle brackets or single quotes, is
+       an alternative syntax for referencing a  subpattern  as  a  subroutine,
+       possibly  recursively. Here are two of the examples used above, rewrit-
+       ten using this syntax:
+
+         (?<pn> \( ( (?>[^()]+) | \g<pn> )* \) )
+         (sens|respons)e and \g'1'ibility
+
+       PCRE2 supports an extension to Oniguruma: if a number is preceded by  a
+       plus or a minus sign it is taken as a relative reference. For example:
+
+         (abc)(?i:\g<-1>)
+
+       Note  that \g{...} (Perl syntax) and \g<...> (Oniguruma syntax) are not
+       synonymous. The former is a back reference; the latter is a  subroutine
+       call.
+
+
+CALLOUTS
+
+       Perl has a feature whereby using the sequence (?{...}) causes arbitrary
+       Perl code to be obeyed in the middle of matching a regular  expression.
+       This makes it possible, amongst other things, to extract different sub-
+       strings that match the same pair of parentheses when there is a repeti-
+       tion.
+
+       PCRE2  provides  a  similar feature, but of course it cannot obey arbi-
+       trary Perl code. The feature is called "callout". The caller  of  PCRE2
+       provides  an  external  function  by putting its entry point in a match
+       context using the function pcre2_set_callout(), and then  passing  that
+       context  to  pcre2_match() or pcre2_dfa_match(). If no match context is
+       passed, or if the callout entry point is set to NULL, callouts are dis-
+       abled.
+
+       Within  a  regular expression, (?C<arg>) indicates a point at which the
+       external function is to be called. There  are  two  kinds  of  callout:
+       those  with a numerical argument and those with a string argument. (?C)
+       on its own with no argument is treated as (?C0). A  numerical  argument
+       allows  the  application  to  distinguish  between  different callouts.
+       String arguments were added for release 10.20 to make it  possible  for
+       script  languages that use PCRE2 to embed short scripts within patterns
+       in a similar way to Perl.
+
+       During matching, when PCRE2 reaches a callout point, the external func-
+       tion  is  called.  It is provided with the number or string argument of
+       the callout, the position in the pattern, and one item of data that  is
+       also set in the match block. The callout function may cause matching to
+       proceed, to backtrack, or to fail.
+
+       By default, PCRE2 implements a  number  of  optimizations  at  matching
+       time,  and  one  side-effect is that sometimes callouts are skipped. If
+       you need all possible callouts to happen, you need to set options  that
+       disable  the relevant optimizations. More details, including a complete
+       description of the programming interface to the callout  function,  are
+       given in the pcre2callout documentation.
+
+   Callouts with numerical arguments
+
+       If  you  just  want  to  have  a means of identifying different callout
+       points, put a number less than 256 after the  letter  C.  For  example,
+       this pattern has two callout points:
+
+         (?C1)abc(?C2)def
+
+       If  the PCRE2_AUTO_CALLOUT flag is passed to pcre2_compile(), numerical
+       callouts are automatically installed before each item in  the  pattern.
+       They  are all numbered 255. If there is a conditional group in the pat-
+       tern whose condition is an assertion, an additional callout is inserted
+       just  before the condition. An explicit callout may also be set at this
+       position, as in this example:
+
+         (?(?C9)(?=a)abc|def)
+
+       Note that this applies only to assertion conditions, not to other types
+       of condition.
+
+   Callouts with string arguments
+
+       A  delimited  string may be used instead of a number as a callout argu-
+       ment. The starting delimiter must be one of ` ' " ^ % #  $  {  and  the
+       ending delimiter is the same as the start, except for {, where the end-
+       ing delimiter is }. If  the  ending  delimiter  is  needed  within  the
+       string, it must be doubled. For example:
+
+         (?C'ab ''c'' d')xyz(?C{any text})pqr
+
+       The  doubling  is  removed  before  the string is passed to the callout
+       function.
+
+
+BACKTRACKING CONTROL
+
+       Perl 5.10 introduced a number of "Special Backtracking Control  Verbs",
+       which  are  still  described in the Perl documentation as "experimental
+       and subject to change or removal in a future version of Perl". It  goes
+       on  to  say:  "Their  usage in production code should be noted to avoid
+       problems during upgrades." The same remarks apply to the PCRE2 features
+       described in this section.
+
+       The  new verbs make use of what was previously invalid syntax: an open-
+       ing parenthesis followed by an asterisk. They are generally of the form
+       (*VERB) or (*VERB:NAME). Some verbs take either form, possibly behaving
+       differently depending on whether or not a name is present.
+
+       By default, for compatibility with Perl, a  name  is  any  sequence  of
+       characters that does not include a closing parenthesis. The name is not
+       processed in any way, and it is  not  possible  to  include  a  closing
+       parenthesis in the name.  However, if the PCRE2_ALT_VERBNAMES option is
+       set, normal backslash processing is applied to verb names and  only  an
+       unescaped  closing parenthesis terminates the name. A closing parenthe-
+       sis can be included in a name either as \) or between \Q and \E. If the
+       PCRE2_EXTENDED  option  is  set,  unescaped whitespace in verb names is
+       skipped and #-comments are recognized, exactly as in the  rest  of  the
+       pattern.
+
+       The  maximum  length of a name is 255 in the 8-bit library and 65535 in
+       the 16-bit and 32-bit libraries. If the name is empty, that is, if  the
+       closing  parenthesis immediately follows the colon, the effect is as if
+       the colon were not there. Any number of these verbs may occur in a pat-
+       tern.
+
+       Since  these  verbs  are  specifically related to backtracking, most of
+       them can be used only when the pattern is to be matched using the  tra-
+       ditional matching function, because these use a backtracking algorithm.
+       With the exception of (*FAIL), which behaves like  a  failing  negative
+       assertion, the backtracking control verbs cause an error if encountered
+       by the DFA matching function.
+
+       The behaviour of these verbs in repeated  groups,  assertions,  and  in
+       subpatterns called as subroutines (whether or not recursively) is docu-
+       mented below.
+
+   Optimizations that affect backtracking verbs
+
+       PCRE2 contains some optimizations that are used to speed up matching by
+       running some checks at the start of each match attempt. For example, it
+       may know the minimum length of matching subject, or that  a  particular
+       character must be present. When one of these optimizations bypasses the
+       running of a match,  any  included  backtracking  verbs  will  not,  of
+       course, be processed. You can suppress the start-of-match optimizations
+       by setting the PCRE2_NO_START_OPTIMIZE option when  calling  pcre2_com-
+       pile(),  or by starting the pattern with (*NO_START_OPT). There is more
+       discussion of this option in the section entitled "Compiling a pattern"
+       in the pcre2api documentation.
+
+       Experiments  with  Perl  suggest that it too has similar optimizations,
+       sometimes leading to anomalous results.
+
+   Verbs that act immediately
+
+       The following verbs act as soon as they are encountered. They  may  not
+       be followed by a name.
+
+          (*ACCEPT)
+
+       This  verb causes the match to end successfully, skipping the remainder
+       of the pattern. However, when it is inside a subpattern that is  called
+       as  a  subroutine, only that subpattern is ended successfully. Matching
+       then continues at the outer level. If (*ACCEPT) in triggered in a posi-
+       tive  assertion,  the  assertion succeeds; in a negative assertion, the
+       assertion fails.
+
+       If (*ACCEPT) is inside capturing parentheses, the data so far  is  cap-
+       tured. For example:
+
+         A((?:A|B(*ACCEPT)|C)D)
+
+       This  matches  "AB", "AAD", or "ACD"; when it matches "AB", "B" is cap-
+       tured by the outer parentheses.
+
+         (*FAIL) or (*F)
+
+       This verb causes a matching failure, forcing backtracking to occur.  It
+       is  equivalent to (?!) but easier to read. The Perl documentation notes
+       that it is probably useful only when combined  with  (?{})  or  (??{}).
+       Those  are, of course, Perl features that are not present in PCRE2. The
+       nearest equivalent is the callout feature, as for example in this  pat-
+       tern:
+
+         a+(?C)(*FAIL)
+
+       A  match  with the string "aaaa" always fails, but the callout is taken
+       before each backtrack happens (in this example, 10 times).
+
+   Recording which path was taken
+
+       There is one verb whose main purpose  is  to  track  how  a  match  was
+       arrived  at,  though  it  also  has a secondary use in conjunction with
+       advancing the match starting point (see (*SKIP) below).
+
+         (*MARK:NAME) or (*:NAME)
+
+       A name is always  required  with  this  verb.  There  may  be  as  many
+       instances  of  (*MARK) as you like in a pattern, and their names do not
+       have to be unique.
+
+       When a match succeeds, the name of the  last-encountered  (*MARK:NAME),
+       (*PRUNE:NAME),  or  (*THEN:NAME) on the matching path is passed back to
+       the caller as described in  the  section  entitled  "Other  information
+       about  the  match" in the pcre2api documentation. Here is an example of
+       pcre2test output, where the "mark" modifier requests the retrieval  and
+       outputting of (*MARK) data:
+
+           re> /X(*MARK:A)Y|X(*MARK:B)Z/mark
+         data> XY
+          0: XY
+         MK: A
+         XZ
+          0: XZ
+         MK: B
+
+       The (*MARK) name is tagged with "MK:" in this output, and in this exam-
+       ple it indicates which of the two alternatives matched. This is a  more
+       efficient  way of obtaining this information than putting each alterna-
+       tive in its own capturing parentheses.
+
+       If a verb with a name is encountered in a positive  assertion  that  is
+       true,  the  name  is recorded and passed back if it is the last-encoun-
+       tered. This does not happen for negative assertions or failing positive
+       assertions.
+
+       After  a  partial match or a failed match, the last encountered name in
+       the entire match process is returned. For example:
+
+           re> /X(*MARK:A)Y|X(*MARK:B)Z/mark
+         data> XP
+         No match, mark = B
+
+       Note that in this unanchored example the  mark  is  retained  from  the
+       match attempt that started at the letter "X" in the subject. Subsequent
+       match attempts starting at "P" and then with an empty string do not get
+       as far as the (*MARK) item, but nevertheless do not reset it.
+
+       If  you  are  interested  in  (*MARK)  values after failed matches, you
+       should probably set the PCRE2_NO_START_OPTIMIZE option (see  above)  to
+       ensure that the match is always attempted.
+
+   Verbs that act after backtracking
+
+       The following verbs do nothing when they are encountered. Matching con-
+       tinues with what follows, but if there is no subsequent match,  causing
+       a  backtrack  to  the  verb, a failure is forced. That is, backtracking
+       cannot pass to the left of the verb. However, when one of  these  verbs
+       appears inside an atomic group (which includes any group that is called
+       as a subroutine) or in an assertion that is true, its  effect  is  con-
+       fined  to that group, because once the group has been matched, there is
+       never any backtracking into it. In this situation, backtracking has  to
+       jump to the left of the entire atomic group or assertion.
+
+       These  verbs  differ  in exactly what kind of failure occurs when back-
+       tracking reaches them. The behaviour described below  is  what  happens
+       when  the  verb is not in a subroutine or an assertion. Subsequent sec-
+       tions cover these special cases.
+
+         (*COMMIT)
+
+       This verb, which may not be followed by a name, causes the whole  match
+       to fail outright if there is a later matching failure that causes back-
+       tracking to reach it. Even if the pattern  is  unanchored,  no  further
+       attempts to find a match by advancing the starting point take place. If
+       (*COMMIT) is the only backtracking verb that is  encountered,  once  it
+       has  been  passed  pcre2_match() is committed to finding a match at the
+       current starting point, or not at all. For example:
+
+         a+(*COMMIT)b
+
+       This matches "xxaab" but not "aacaab". It can be thought of as  a  kind
+       of dynamic anchor, or "I've started, so I must finish." The name of the
+       most recently passed (*MARK) in the path is passed back when  (*COMMIT)
+       forces a match failure.
+
+       If  there  is more than one backtracking verb in a pattern, a different
+       one that follows (*COMMIT) may be triggered first,  so  merely  passing
+       (*COMMIT) during a match does not always guarantee that a match must be
+       at this starting point.
+
+       Note that (*COMMIT) at the start of a pattern is not  the  same  as  an
+       anchor,  unless PCRE2's start-of-match optimizations are turned off, as
+       shown in this output from pcre2test:
+
+           re> /(*COMMIT)abc/
+         data> xyzabc
+          0: abc
+         data>
+         re> /(*COMMIT)abc/no_start_optimize
+         data> xyzabc
+         No match
+
+       For the first pattern, PCRE2 knows that any match must start with  "a",
+       so  the optimization skips along the subject to "a" before applying the
+       pattern to the first set of data. The match attempt then succeeds.  The
+       second  pattern disables the optimization that skips along to the first
+       character. The pattern is now applied  starting  at  "x",  and  so  the
+       (*COMMIT)  causes  the  match to fail without trying any other starting
+       points.
+
+         (*PRUNE) or (*PRUNE:NAME)
+
+       This verb causes the match to fail at the current starting position  in
+       the subject if there is a later matching failure that causes backtrack-
+       ing to reach it. If the pattern is unanchored, the  normal  "bumpalong"
+       advance  to  the next starting character then happens. Backtracking can
+       occur as usual to the left of (*PRUNE), before it is reached,  or  when
+       matching  to  the  right  of  (*PRUNE), but if there is no match to the
+       right, backtracking cannot cross (*PRUNE). In simple cases, the use  of
+       (*PRUNE)  is just an alternative to an atomic group or possessive quan-
+       tifier, but there are some uses of (*PRUNE) that cannot be expressed in
+       any  other  way. In an anchored pattern (*PRUNE) has the same effect as
+       (*COMMIT).
+
+       The   behaviour   of   (*PRUNE:NAME)   is   the   not   the   same   as
+       (*MARK:NAME)(*PRUNE).   It  is  like  (*MARK:NAME)  in that the name is
+       remembered for  passing  back  to  the  caller.  However,  (*SKIP:NAME)
+       searches  only  for  names  set  with  (*MARK),  ignoring  those set by
+       (*PRUNE) or (*THEN).
+
+         (*SKIP)
+
+       This verb, when given without a name, is like (*PRUNE), except that  if
+       the  pattern  is unanchored, the "bumpalong" advance is not to the next
+       character, but to the position in the subject where (*SKIP) was encoun-
+       tered.  (*SKIP)  signifies that whatever text was matched leading up to
+       it cannot be part of a successful match. Consider:
+
+         a+(*SKIP)b
+
+       If the subject is "aaaac...",  after  the  first  match  attempt  fails
+       (starting  at  the  first  character in the string), the starting point
+       skips on to start the next attempt at "c". Note that a possessive quan-
+       tifer  does not have the same effect as this example; although it would
+       suppress backtracking  during  the  first  match  attempt,  the  second
+       attempt  would  start at the second character instead of skipping on to
+       "c".
+
+         (*SKIP:NAME)
+
+       When (*SKIP) has an associated name, its behaviour is modified. When it
+       is triggered, the previous path through the pattern is searched for the
+       most recent (*MARK) that has the  same  name.  If  one  is  found,  the
+       "bumpalong" advance is to the subject position that corresponds to that
+       (*MARK) instead of to where (*SKIP) was encountered. If no (*MARK) with
+       a matching name is found, the (*SKIP) is ignored.
+
+       Note  that (*SKIP:NAME) searches only for names set by (*MARK:NAME). It
+       ignores names that are set by (*PRUNE:NAME) or (*THEN:NAME).
+
+         (*THEN) or (*THEN:NAME)
+
+       This verb causes a skip to the next innermost  alternative  when  back-
+       tracking  reaches  it.  That  is,  it  cancels any further backtracking
+       within the current alternative. Its name  comes  from  the  observation
+       that it can be used for a pattern-based if-then-else block:
+
+         ( COND1 (*THEN) FOO | COND2 (*THEN) BAR | COND3 (*THEN) BAZ ) ...
+
+       If  the COND1 pattern matches, FOO is tried (and possibly further items
+       after the end of the group if FOO succeeds); on  failure,  the  matcher
+       skips  to  the second alternative and tries COND2, without backtracking
+       into COND1. If that succeeds and BAR fails, COND3 is tried.  If  subse-
+       quently  BAZ fails, there are no more alternatives, so there is a back-
+       track to whatever came before the  entire  group.  If  (*THEN)  is  not
+       inside an alternation, it acts like (*PRUNE).
+
+       The    behaviour   of   (*THEN:NAME)   is   the   not   the   same   as
+       (*MARK:NAME)(*THEN).  It is like  (*MARK:NAME)  in  that  the  name  is
+       remembered  for  passing  back  to  the  caller.  However, (*SKIP:NAME)
+       searches only for  names  set  with  (*MARK),  ignoring  those  set  by
+       (*PRUNE) and (*THEN).
+
+       A  subpattern that does not contain a | character is just a part of the
+       enclosing alternative; it is not a nested  alternation  with  only  one
+       alternative.  The effect of (*THEN) extends beyond such a subpattern to
+       the enclosing alternative. Consider this pattern, where A, B, etc.  are
+       complex  pattern fragments that do not contain any | characters at this
+       level:
+
+         A (B(*THEN)C) | D
+
+       If A and B are matched, but there is a failure in C, matching does  not
+       backtrack into A; instead it moves to the next alternative, that is, D.
+       However, if the subpattern containing (*THEN) is given an  alternative,
+       it behaves differently:
+
+         A (B(*THEN)C | (*FAIL)) | D
+
+       The  effect of (*THEN) is now confined to the inner subpattern. After a
+       failure in C, matching moves to (*FAIL), which causes the whole subpat-
+       tern  to  fail  because  there are no more alternatives to try. In this
+       case, matching does now backtrack into A.
+
+       Note that a conditional subpattern is  not  considered  as  having  two
+       alternatives,  because  only  one  is  ever used. In other words, the |
+       character in a conditional subpattern has a different meaning. Ignoring
+       white space, consider:
+
+         ^.*? (?(?=a) a | b(*THEN)c )
+
+       If  the  subject  is  "ba", this pattern does not match. Because .*? is
+       ungreedy, it initially matches zero  characters.  The  condition  (?=a)
+       then  fails,  the  character  "b"  is  matched, but "c" is not. At this
+       point, matching does not backtrack to .*? as might perhaps be  expected
+       from  the  presence  of  the | character. The conditional subpattern is
+       part of the single alternative that comprises the whole pattern, and so
+       the  match  fails.  (If  there was a backtrack into .*?, allowing it to
+       match "b", the match would succeed.)
+
+       The verbs just described provide four different "strengths" of  control
+       when subsequent matching fails. (*THEN) is the weakest, carrying on the
+       match at the next alternative. (*PRUNE) comes next, failing  the  match
+       at  the  current starting position, but allowing an advance to the next
+       character (for an unanchored pattern). (*SKIP) is similar, except  that
+       the advance may be more than one character. (*COMMIT) is the strongest,
+       causing the entire match to fail.
+
+   More than one backtracking verb
+
+       If more than one backtracking verb is present in  a  pattern,  the  one
+       that  is  backtracked  onto first acts. For example, consider this pat-
+       tern, where A, B, etc. are complex pattern fragments:
+
+         (A(*COMMIT)B(*THEN)C|ABD)
+
+       If A matches but B fails, the backtrack to (*COMMIT) causes the  entire
+       match to fail. However, if A and B match, but C fails, the backtrack to
+       (*THEN) causes the next alternative (ABD) to be tried.  This  behaviour
+       is  consistent,  but is not always the same as Perl's. It means that if
+       two or more backtracking verbs appear in succession, all the  the  last
+       of them has no effect. Consider this example:
+
+         ...(*COMMIT)(*PRUNE)...
+
+       If there is a matching failure to the right, backtracking onto (*PRUNE)
+       causes it to be triggered, and its action is taken. There can never  be
+       a backtrack onto (*COMMIT).
+
+   Backtracking verbs in repeated groups
+
+       PCRE2  differs  from  Perl  in  its  handling  of backtracking verbs in
+       repeated groups. For example, consider:
+
+         /(a(*COMMIT)b)+ac/
+
+       If the subject is "abac", Perl matches, but  PCRE2  fails  because  the
+       (*COMMIT) in the second repeat of the group acts.
+
+   Backtracking verbs in assertions
+
+       (*FAIL)  in  an assertion has its normal effect: it forces an immediate
+       backtrack.
+
+       (*ACCEPT) in a positive assertion causes the assertion to succeed with-
+       out  any  further processing. In a negative assertion, (*ACCEPT) causes
+       the assertion to fail without any further processing.
+
+       The other backtracking verbs are not treated specially if  they  appear
+       in  a  positive  assertion.  In  particular,  (*THEN) skips to the next
+       alternative in the innermost enclosing  group  that  has  alternations,
+       whether or not this is within the assertion.
+
+       Negative  assertions  are,  however, different, in order to ensure that
+       changing a positive assertion into a  negative  assertion  changes  its
+       result. Backtracking into (*COMMIT), (*SKIP), or (*PRUNE) causes a neg-
+       ative assertion to be true, without considering any further alternative
+       branches in the assertion.  Backtracking into (*THEN) causes it to skip
+       to the next enclosing alternative within the assertion (the normal  be-
+       haviour),  but  if  the  assertion  does  not have such an alternative,
+       (*THEN) behaves like (*PRUNE).
+
+   Backtracking verbs in subroutines
+
+       These behaviours occur whether or not the subpattern is  called  recur-
+       sively.  Perl's treatment of subroutines is different in some cases.
+
+       (*FAIL)  in  a subpattern called as a subroutine has its normal effect:
+       it forces an immediate backtrack.
+
+       (*ACCEPT) in a subpattern called as a subroutine causes the  subroutine
+       match  to succeed without any further processing. Matching then contin-
+       ues after the subroutine call.
+
+       (*COMMIT), (*SKIP), and (*PRUNE) in a subpattern called as a subroutine
+       cause the subroutine match to fail.
+
+       (*THEN)  skips to the next alternative in the innermost enclosing group
+       within the subpattern that has alternatives. If there is no such  group
+       within the subpattern, (*THEN) causes the subroutine match to fail.
+
+
+SEE ALSO
+
+       pcre2api(3),    pcre2callout(3),    pcre2matching(3),   pcre2syntax(3),
+       pcre2(3).
+
+
+AUTHOR
+
+       Philip Hazel
+       University Computing Service
+       Cambridge, England.
+
+
+REVISION
+
+       Last updated: 13 November 2015
+       Copyright (c) 1997-2015 University of Cambridge.
+------------------------------------------------------------------------------
+
+
+PCRE2PERFORM(3)            Library Functions Manual            PCRE2PERFORM(3)
+
+
+
+NAME
+       PCRE2 - Perl-compatible regular expressions (revised API)
+
+PCRE2 PERFORMANCE
+
+       Two  aspects  of performance are discussed below: memory usage and pro-
+       cessing time. The way you express your pattern as a regular  expression
+       can affect both of them.
+
+
+COMPILED PATTERN MEMORY USAGE
+
+       Patterns are compiled by PCRE2 into a reasonably efficient interpretive
+       code, so that most simple patterns do not  use  much  memory.  However,
+       there  is  one case where the memory usage of a compiled pattern can be
+       unexpectedly large. If a parenthesized subpattern has a quantifier with
+       a minimum greater than 1 and/or a limited maximum, the whole subpattern
+       is repeated in the compiled code. For example, the pattern
+
+         (abc|def){2,4}
+
+       is compiled as if it were
+
+         (abc|def)(abc|def)((abc|def)(abc|def)?)?
+
+       (Technical aside: It is done this way so that backtrack  points  within
+       each of the repetitions can be independently maintained.)
+
+       For  regular expressions whose quantifiers use only small numbers, this
+       is not usually a problem. However, if the numbers are large,  and  par-
+       ticularly  if  such repetitions are nested, the memory usage can become
+       an embarrassment. For example, the very simple pattern
+
+         ((ab){1,1000}c){1,3}
+
+       uses 51K bytes when compiled using the 8-bit  library.  When  PCRE2  is
+       compiled  with its default internal pointer size of two bytes, the size
+       limit on a compiled pattern is 64K code units in the 8-bit  and  16-bit
+       libraries, and this is reached with the above pattern if the outer rep-
+       etition is increased from 3 to 4. PCRE2 can be compiled to  use  larger
+       internal  pointers  and thus handle larger compiled patterns, but it is
+       better to try to rewrite your pattern to use less memory if you can.
+
+       One way of reducing the memory usage for such patterns is to  make  use
+       of PCRE2's "subroutine" facility. Re-writing the above pattern as
+
+         ((ab)(?2){0,999}c)(?1){0,2}
+
+       reduces the memory requirements to 18K, and indeed it remains under 20K
+       even with the outer repetition increased to 100. However, this  pattern
+       is  not  exactly equivalent, because the "subroutine" calls are treated
+       as atomic groups into which there can be no backtracking if there is  a
+       subsequent  matching  failure.  Therefore, PCRE2 cannot do this kind of
+       rewriting automatically.  Furthermore, there is a  noticeable  loss  of
+       speed  when executing the modified pattern. Nevertheless, if the atomic
+       grouping is not a problem and the loss of  speed  is  acceptable,  this
+       kind  of rewriting will allow you to process patterns that PCRE2 cannot
+       otherwise handle.
+
+
+STACK USAGE AT RUN TIME
+
+       When pcre2_match() is used for matching, certain kinds of  pattern  can
+       cause  it  to  use large amounts of the process stack. In some environ-
+       ments the default process stack is quite small, and if it runs out  the
+       result  is  often  SIGSEGV.  Rewriting your pattern can often help. The
+       pcre2stack documentation discusses this issue in detail.
+
+
+PROCESSING TIME
+
+       Certain items in regular expression patterns are processed  more  effi-
+       ciently than others. It is more efficient to use a character class like
+       [aeiou]  than  a  set  of   single-character   alternatives   such   as
+       (a|e|i|o|u).  In  general,  the simplest construction that provides the
+       required behaviour is usually the most efficient. Jeffrey Friedl's book
+       contains  a  lot  of useful general discussion about optimizing regular
+       expressions for efficient performance. This  document  contains  a  few
+       observations about PCRE2.
+
+       Using  Unicode  character  properties  (the  \p, \P, and \X escapes) is
+       slow, because PCRE2 has to use a multi-stage table lookup  whenever  it
+       needs  a  character's  property. If you can find an alternative pattern
+       that does not use character properties, it will probably be faster.
+
+       By default, the escape sequences \b, \d, \s,  and  \w,  and  the  POSIX
+       character  classes  such  as  [:alpha:]  do not use Unicode properties,
+       partly for backwards compatibility, and partly for performance reasons.
+       However,  you  can  set  the PCRE2_UCP option or start the pattern with
+       (*UCP) if you want Unicode character properties to be  used.  This  can
+       double  the  matching  time  for  items  such  as \d, when matched with
+       pcre2_match(); the performance loss is less with a DFA  matching  func-
+       tion, and in both cases there is not much difference for \b.
+
+       When  a pattern begins with .* not in atomic parentheses, nor in paren-
+       theses that are the subject of a backreference,  and  the  PCRE2_DOTALL
+       option  is  set,  the pattern is implicitly anchored by PCRE2, since it
+       can match only at the start of a subject string.  If  the  pattern  has
+       multiple top-level branches, they must all be anchorable. The optimiza-
+       tion can be disabled by  the  PCRE2_NO_DOTSTAR_ANCHOR  option,  and  is
+       automatically disabled if the pattern contains (*PRUNE) or (*SKIP).
+
+       If  PCRE2_DOTALL  is  not  set,  PCRE2  cannot  make this optimization,
+       because the dot metacharacter does not then match a newline, and if the
+       subject  string contains newlines, the pattern may match from the char-
+       acter immediately following one of them instead of from the very start.
+       For example, the pattern
+
+         .*second
+
+       matches  the subject "first\nand second" (where \n stands for a newline
+       character), with the match starting at the seventh character. In  order
+       to  do  this, PCRE2 has to retry the match starting after every newline
+       in the subject.
+
+       If you are using such a pattern with subject strings that do  not  con-
+       tain   newlines,   the   best   performance   is  obtained  by  setting
+       PCRE2_DOTALL, or starting the pattern with  ^.*  or  ^.*?  to  indicate
+       explicit anchoring. That saves PCRE2 from having to scan along the sub-
+       ject looking for a newline to restart at.
+
+       Beware of patterns that contain nested indefinite  repeats.  These  can
+       take  a  long time to run when applied to a string that does not match.
+       Consider the pattern fragment
+
+         ^(a+)*
+
+       This can match "aaaa" in 16 different ways, and this  number  increases
+       very  rapidly  as the string gets longer. (The * repeat can match 0, 1,
+       2, 3, or 4 times, and for each of those cases other than 0 or 4, the  +
+       repeats  can  match  different numbers of times.) When the remainder of
+       the pattern is such that the entire match is going to fail,  PCRE2  has
+       in  principle  to  try  every  possible variation, and this can take an
+       extremely long time, even for relatively short strings.
+
+       An optimization catches some of the more simple cases such as
+
+         (a+)*b
+
+       where a literal character follows. Before  embarking  on  the  standard
+       matching  procedure, PCRE2 checks that there is a "b" later in the sub-
+       ject string, and if there is not, it fails the match immediately.  How-
+       ever,  when  there  is no following literal this optimization cannot be
+       used. You can see the difference by comparing the behaviour of
+
+         (a+)*\d
+
+       with the pattern above. The former gives  a  failure  almost  instantly
+       when  applied  to  a  whole  line of "a" characters, whereas the latter
+       takes an appreciable time with strings longer than about 20 characters.
+
+       In many cases, the solution to this kind of performance issue is to use
+       an atomic group or a possessive quantifier.
+
+
+AUTHOR
+
+       Philip Hazel
+       University Computing Service
+       Cambridge, England.
+
+
+REVISION
+
+       Last updated: 02 January 2015
+       Copyright (c) 1997-2015 University of Cambridge.
+------------------------------------------------------------------------------
+
+
+PCRE2POSIX(3)              Library Functions Manual              PCRE2POSIX(3)
+
+
+
+NAME
+       PCRE2 - Perl-compatible regular expressions (revised API)
+
+SYNOPSIS
+
+       #include <pcre2posix.h>
+
+       int regcomp(regex_t *preg, const char *pattern,
+            int cflags);
+
+       int regexec(const regex_t *preg, const char *string,
+            size_t nmatch, regmatch_t pmatch[], int eflags);
+
+       size_t regerror(int errcode, const regex_t *preg,
+            char *errbuf, size_t errbuf_size);
+
+       void regfree(regex_t *preg);
+
+
+DESCRIPTION
+
+       This  set of functions provides a POSIX-style API for the PCRE2 regular
+       expression 8-bit library. See the pcre2api documentation for a descrip-
+       tion  of PCRE2's native API, which contains much additional functional-
+       ity. There is no POSIX-style wrapper  for  PCRE2's  16-bit  and  32-bit
+       libraries.
+
+       The functions described here are just wrapper functions that ultimately
+       call the  PCRE2  native  API.  Their  prototypes  are  defined  in  the
+       pcre2posix.h  header  file,  and  on Unix systems the library itself is
+       called libpcre2-posix.a, so can be accessed by adding -lpcre2-posix  to
+       the  command  for  linking  an  application that uses them. Because the
+       POSIX functions call the native ones,  it  is  also  necessary  to  add
+       -lpcre2-8.
+
+       Those  POSIX  option bits that can reasonably be mapped to PCRE2 native
+       options have been implemented. In addition, the option REG_EXTENDED  is
+       defined  with  the  value  zero. This has no effect, but since programs
+       that are written to the POSIX interface often use  it,  this  makes  it
+       easier  to  slot in PCRE2 as a replacement library. Other POSIX options
+       are not even defined.
+
+       There are also some other options that are not defined by POSIX.  These
+       have been added at the request of users who want to make use of certain
+       PCRE2-specific features via the POSIX calling interface.
+
+       When PCRE2 is called via these functions, it is only the  API  that  is
+       POSIX-like  in  style.  The syntax and semantics of the regular expres-
+       sions themselves are still those of Perl, subject  to  the  setting  of
+       various  PCRE2 options, as described below. "POSIX-like in style" means
+       that the API approximates to the POSIX  definition;  it  is  not  fully
+       POSIX-compatible,  and  in  multi-unit  encoding domains it is probably
+       even less compatible.
+
+       The header for these functions is supplied as pcre2posix.h to avoid any
+       potential  clash  with  other  POSIX  libraries.  It can, of course, be
+       renamed or aliased as regex.h, which is the "correct" name. It provides
+       two  structure  types,  regex_t  for  compiled internal forms, and reg-
+       match_t for returning captured substrings. It also  defines  some  con-
+       stants  whose  names  start  with  "REG_";  these  are used for setting
+       options and identifying error codes.
+
+
+COMPILING A PATTERN
+
+       The function regcomp() is called to compile a pattern into an  internal
+       form.  The  pattern  is  a C string terminated by a binary zero, and is
+       passed in the argument pattern. The preg argument is  a  pointer  to  a
+       regex_t  structure that is used as a base for storing information about
+       the compiled regular expression.
+
+       The argument cflags is either zero, or contains one or more of the bits
+       defined by the following macros:
+
+         REG_DOTALL
+
+       The  PCRE2_DOTALL  option  is set when the regular expression is passed
+       for compilation to the native function. Note  that  REG_DOTALL  is  not
+       part of the POSIX standard.
+
+         REG_ICASE
+
+       The  PCRE2_CASELESS option is set when the regular expression is passed
+       for compilation to the native function.
+
+         REG_NEWLINE
+
+       The PCRE2_MULTILINE option is set when the regular expression is passed
+       for  compilation  to the native function. Note that this does not mimic
+       the defined POSIX behaviour for REG_NEWLINE  (see  the  following  sec-
+       tion).
+
+         REG_NOSUB
+
+       The  PCRE2_NO_AUTO_CAPTURE option is set when the regular expression is
+       passed for compilation to the native function. In addition, when a pat-
+       tern  that is compiled with this flag is passed to regexec() for match-
+       ing, the nmatch and pmatch  arguments  are  ignored,  and  no  captured
+       strings are returned.
+
+         REG_UCP
+
+       The  PCRE2_UCP  option is set when the regular expression is passed for
+       compilation to the native function. This causes PCRE2  to  use  Unicode
+       properties  when  matchine  \d,  \w,  etc., instead of just recognizing
+       ASCII values. Note that REG_UCP is not part of the POSIX standard.
+
+         REG_UNGREEDY
+
+       The PCRE2_UNGREEDY option is set when the regular expression is  passed
+       for  compilation  to the native function. Note that REG_UNGREEDY is not
+       part of the POSIX standard.
+
+         REG_UTF
+
+       The PCRE2_UTF option is set when the regular expression is  passed  for
+       compilation  to the native function. This causes the pattern itself and
+       all data strings used for matching it to be treated as  UTF-8  strings.
+       Note that REG_UTF is not part of the POSIX standard.
+
+       In  the  absence  of  these  flags, no options are passed to the native
+       function.  This means the the regex  is  compiled  with  PCRE2  default
+       semantics.  In particular, the way it handles newline characters in the
+       subject string is the Perl way, not the POSIX way.  Note  that  setting
+       PCRE2_MULTILINE has only some of the effects specified for REG_NEWLINE.
+       It does not affect the way newlines are matched by the dot  metacharac-
+       ter (they are not) or by a negative class such as [^a] (they are).
+
+       The  yield of regcomp() is zero on success, and non-zero otherwise. The
+       preg structure is filled in on success, and one member of the structure
+       is  public: re_nsub contains the number of capturing subpatterns in the
+       regular expression. Various error codes are defined in the header file.
+
+       NOTE: If the yield of regcomp() is non-zero, you must  not  attempt  to
+       use the contents of the preg structure. If, for example, you pass it to
+       regexec(), the result is undefined and your program is likely to crash.
+
+
+MATCHING NEWLINE CHARACTERS
+
+       This area is not simple, because POSIX and Perl take different views of
+       things.   It  is not possible to get PCRE2 to obey POSIX semantics, but
+       then PCRE2 was never intended to be a POSIX engine. The following table
+       lists  the  different  possibilities for matching newline characters in
+       Perl and PCRE2:
+
+                                 Default   Change with
+
+         . matches newline          no     PCRE2_DOTALL
+         newline matches [^a]       yes    not changeable
+         $ matches \n at end        yes    PCRE2_DOLLAR_ENDONLY
+         $ matches \n in middle     no     PCRE2_MULTILINE
+         ^ matches \n in middle     no     PCRE2_MULTILINE
+
+       This is the equivalent table for a POSIX-compatible pattern matcher:
+
+                                 Default   Change with
+
+         . matches newline          yes    REG_NEWLINE
+         newline matches [^a]       yes    REG_NEWLINE
+         $ matches \n at end        no     REG_NEWLINE
+         $ matches \n in middle     no     REG_NEWLINE
+         ^ matches \n in middle     no     REG_NEWLINE
+
+       This behaviour is not what happens when PCRE2 is called via  its  POSIX
+       API.  By  default, PCRE2's behaviour is the same as Perl's, except that
+       there is no equivalent for PCRE2_DOLLAR_ENDONLY in Perl. In both  PCRE2
+       and Perl, there is no way to stop newline from matching [^a].
+
+       Default  POSIX newline handling can be obtained by setting PCRE2_DOTALL
+       and PCRE2_DOLLAR_ENDONLY when  calling  pcre2_compile()  directly,  but
+       there  is  no  way  to make PCRE2 behave exactly as for the REG_NEWLINE
+       action. When using the POSIX API, passing REG_NEWLINE to  PCRE2's  reg-
+       comp() function causes PCRE2_MULTILINE to be passed to pcre2_compile(),
+       and REG_DOTALL passes PCRE2_DOTALL. There is no way to pass  PCRE2_DOL-
+       LAR_ENDONLY.
+
+
+MATCHING A PATTERN
+
+       The  function  regexec()  is  called  to  match a compiled pattern preg
+       against a given string, which is by default terminated by a  zero  byte
+       (but  see  REG_STARTEND below), subject to the options in eflags. These
+       can be:
+
+         REG_NOTBOL
+
+       The PCRE2_NOTBOL option is set when calling the underlying PCRE2 match-
+       ing function.
+
+         REG_NOTEMPTY
+
+       The  PCRE2_NOTEMPTY  option  is  set  when calling the underlying PCRE2
+       matching function. Note that REG_NOTEMPTY is  not  part  of  the  POSIX
+       standard.  However, setting this option can give more POSIX-like behav-
+       iour in some situations.
+
+         REG_NOTEOL
+
+       The PCRE2_NOTEOL option is set when calling the underlying PCRE2 match-
+       ing function.
+
+         REG_STARTEND
+
+       The  string  is  considered to start at string + pmatch[0].rm_so and to
+       have a terminating NUL located at string + pmatch[0].rm_eo (there  need
+       not  actually  be  a  NUL at that location), regardless of the value of
+       nmatch. This is a BSD extension, compatible with but not  specified  by
+       IEEE  Standard  1003.2  (POSIX.2),  and  should be used with caution in
+       software intended to be portable to other systems. Note that a non-zero
+       rm_so does not imply REG_NOTBOL; REG_STARTEND affects only the location
+       of the string, not how it is matched. Setting REG_STARTEND and  passing
+       pmatch  as  NULL  are  mutually  exclusive;  the  error  REG_INVARG  is
+       returned.
+
+       If the pattern was compiled with the REG_NOSUB flag, no data about  any
+       matched  strings  is  returned.  The  nmatch  and  pmatch  arguments of
+       regexec() are ignored.
+
+       If the value of nmatch is zero, or if the value pmatch is NULL, no data
+       about any matched strings is returned.
+
+       Otherwise,the portion of the string that was matched, and also any cap-
+       tured substrings, are returned via the pmatch argument, which points to
+       an  array  of nmatch structures of type regmatch_t, containing the mem-
+       bers rm_so and rm_eo. These contain the byte offset to the first  char-
+       acter of each substring and the offset to the first character after the
+       end of each substring, respectively. The  0th  element  of  the  vector
+       relates  to  the  entire portion of string that was matched; subsequent
+       elements relate to the capturing subpatterns of the regular expression.
+       Unused entries in the array have both structure members set to -1.
+
+       A  successful  match  yields  a  zero  return;  various error codes are
+       defined in the header file, of  which  REG_NOMATCH  is  the  "expected"
+       failure code.
+
+
+ERROR MESSAGES
+
+       The regerror() function maps a non-zero errorcode from either regcomp()
+       or regexec() to a printable message. If preg is  not  NULL,  the  error
+       should have arisen from the use of that structure. A message terminated
+       by a binary zero is placed in errbuf. If the buffer is too short,  only
+       the first errbuf_size - 1 characters of the error message are used. The
+       yield of the function is the size of buffer needed to  hold  the  whole
+       message,  including  the  terminating  zero. This value is greater than
+       errbuf_size if the message was truncated.
+
+
+MEMORY USAGE
+
+       Compiling a regular expression causes memory to be allocated and  asso-
+       ciated  with  the preg structure. The function regfree() frees all such
+       memory, after which preg may no longer be used as  a  compiled  expres-
+       sion.
+
+
+AUTHOR
+
+       Philip Hazel
+       University Computing Service
+       Cambridge, England.
+
+
+REVISION
+
+       Last updated: 29 November 2015
+       Copyright (c) 1997-2015 University of Cambridge.
+------------------------------------------------------------------------------
+
+
+PCRE2SAMPLE(3)             Library Functions Manual             PCRE2SAMPLE(3)
+
+
+
+NAME
+       PCRE2 - Perl-compatible regular expressions (revised API)
+
+PCRE2 SAMPLE PROGRAM
+
+       A  simple, complete demonstration program to get you started with using
+       PCRE2 is supplied in the file pcre2demo.c in the src directory  in  the
+       PCRE2 distribution. A listing of this program is given in the pcre2demo
+       documentation. If you do not have a copy of the PCRE2 distribution, you
+       can save this listing to re-create the contents of pcre2demo.c.
+
+       The demonstration program, which uses the PCRE2 8-bit library, compiles
+       the regular expression that is  its  first  argument,  and  matches  it
+       against the subject string in its second argument. No PCRE2 options are
+       set, and default character tables are used. If matching  succeeds,  the
+       program  outputs the portion of the subject that matched, together with
+       the contents of any captured substrings.
+
+       If the -g option is given on the command line, the program then goes on
+       to check for further matches of the same regular expression in the same
+       subject string. The logic is a little bit tricky because of the  possi-
+       bility  of  matching an empty string. Comments in the code explain what
+       is going on.
+
+       If PCRE2 is installed in the standard include and  library  directories
+       for your operating system, you should be able to compile the demonstra-
+       tion program using this command:
+
+         gcc -o pcre2demo pcre2demo.c -lpcre2-8
+
+       If PCRE2 is installed elsewhere, you may need to add additional options
+       to  the command line. For example, on a Unix-like system that has PCRE2
+       installed in /usr/local, you  can  compile  the  demonstration  program
+       using a command like this:
+
+         gcc -o pcre2demo -I/usr/local/include pcre2demo.c \
+             -L/usr/local/lib -lpcre2-8
+
+
+       Once  you  have  compiled and linked the demonstration program, you can
+       run simple tests like this:
+
+         ./pcre2demo 'cat|dog' 'the cat sat on the mat'
+         ./pcre2demo -g 'cat|dog' 'the dog sat on the cat'
+
+       Note that there is a  much  more  comprehensive  test  program,  called
+       pcre2test,  which  supports  many  more  facilities for testing regular
+       expressions using the PCRE2 libraries. The pcre2demo  program  is  pro-
+       vided as a simple coding example.
+
+       If you try to run pcre2demo when PCRE2 is not installed in the standard
+       library directory, you may get an error like  this  on  some  operating
+       systems (e.g. Solaris):
+
+         ld.so.1:  a.out:  fatal:  libpcre2.so.0: open failed: No such file or
+       directory
+
+       This is caused by the way shared library support works  on  those  sys-
+       tems. You need to add
+
+         -R/usr/local/lib
+
+       (for example) to the compile command to get round this problem.
+
+
+AUTHOR
+
+       Philip Hazel
+       University Computing Service
+       Cambridge, England.
+
+
+REVISION
+
+       Last updated: 20 October 2014
+       Copyright (c) 1997-2014 University of Cambridge.
+------------------------------------------------------------------------------
+PCRE2SERIALIZE(3)          Library Functions Manual          PCRE2SERIALIZE(3)
+
+
+
+NAME
+       PCRE2 - Perl-compatible regular expressions (revised API)
+
+SAVING AND RE-USING PRECOMPILED PCRE2 PATTERNS
+
+       int32_t pcre2_serialize_decode(pcre2_code **codes,
+         int32_t number_of_codes, const uint32_t *bytes,
+         pcre2_general_context *gcontext);
+
+       int32_t pcre2_serialize_encode(pcre2_code **codes,
+         int32_t number_of_codes, uint32_t **serialized_bytes,
+         PCRE2_SIZE *serialized_size, pcre2_general_context *gcontext);
+
+       void pcre2_serialize_free(uint8_t *bytes);
+
+       int32_t pcre2_serialize_get_number_of_codes(const uint8_t *bytes);
+
+       If  you  are running an application that uses a large number of regular
+       expression patterns, it may be useful to store them  in  a  precompiled
+       form  instead  of  having to compile them every time the application is
+       run. However, if you are using the just-in-time  optimization  feature,
+       it is not possible to save and reload the JIT data, because it is posi-
+       tion-dependent. The host on which the patterns  are  reloaded  must  be
+       running  the  same version of PCRE2, with the same code unit width, and
+       must also have the same endianness, pointer width and PCRE2_SIZE  type.
+       For  example, patterns compiled on a 32-bit system using PCRE2's 16-bit
+       library cannot be reloaded on a 64-bit system, nor can they be reloaded
+       using the 8-bit library.
+
+
+SAVING COMPILED PATTERNS
+
+       Before compiled patterns can be saved they must be serialized, that is,
+       converted to a stream of bytes. A single byte stream  may  contain  any
+       number  of  compiled patterns, but they must all use the same character
+       tables. A single copy of the tables is included in the byte stream (its
+       size is 1088 bytes). For more details of character tables, see the sec-
+       tion on locale support in the pcre2api documentation.
+
+       The function pcre2_serialize_encode() creates a serialized byte  stream
+       from  a  list of compiled patterns. Its first two arguments specify the
+       list, being a pointer to a vector of pointers to compiled patterns, and
+       the length of the vector. The third and fourth arguments point to vari-
+       ables which are set to point to the created byte stream and its length,
+       respectively.  The  final  argument  is a pointer to a general context,
+       which can be used to specify custom memory  mangagement  functions.  If
+       this  argument  is NULL, malloc() is used to obtain memory for the byte
+       stream. The yield of the function is the number of serialized patterns,
+       or one of the following negative error codes:
+
+         PCRE2_ERROR_BADDATA      the number of patterns is zero or less
+         PCRE2_ERROR_BADMAGIC     mismatch of id bytes in one of the patterns
+         PCRE2_ERROR_MEMORY       memory allocation failed
+         PCRE2_ERROR_MIXEDTABLES  the patterns do not all use the same tables
+         PCRE2_ERROR_NULL         the 1st, 3rd, or 4th argument is NULL
+
+       PCRE2_ERROR_BADMAGIC  means  either that a pattern's code has been cor-
+       rupted, or that a slot in the vector does not point to a compiled  pat-
+       tern.
+
+       Once a set of patterns has been serialized you can save the data in any
+       appropriate manner. Here is sample code that compiles two patterns  and
+       writes them to a file. It assumes that the variable fd refers to a file
+       that is open for output. The error checking that should be present in a
+       real application has been omitted for simplicity.
+
+         int errorcode;
+         uint8_t *bytes;
+         PCRE2_SIZE erroroffset;
+         PCRE2_SIZE bytescount;
+         pcre2_code *list_of_codes[2];
+         list_of_codes[0] = pcre2_compile("first pattern",
+           PCRE2_ZERO_TERMINATED, 0, &errorcode, &erroroffset, NULL);
+         list_of_codes[1] = pcre2_compile("second pattern",
+           PCRE2_ZERO_TERMINATED, 0, &errorcode, &erroroffset, NULL);
+         errorcode = pcre2_serialize_encode(list_of_codes, 2, &bytes,
+           &bytescount, NULL);
+         errorcode = fwrite(bytes, 1, bytescount, fd);
+
+       Note  that  the  serialized data is binary data that may contain any of
+       the 256 possible byte  values.  On  systems  that  make  a  distinction
+       between binary and non-binary data, be sure that the file is opened for
+       binary output.
+
+       Serializing a set of patterns leaves the original  data  untouched,  so
+       they  can  still  be used for matching. Their memory must eventually be
+       freed in the usual way by calling pcre2_code_free(). When you have fin-
+       ished with the byte stream, it too must be freed by calling pcre2_seri-
+       alize_free().
+
+
+RE-USING PRECOMPILED PATTERNS
+
+       In order to re-use a set of saved patterns  you  must  first  make  the
+       serialized  byte stream available in main memory (for example, by read-
+       ing from a file). The management of this memory  block  is  up  to  the
+       application.  You  can  use  the  pcre2_serialize_get_number_of_codes()
+       function to find out how many compiled patterns are in  the  serialized
+       data without actually decoding the patterns:
+
+         uint8_t *bytes = <serialized data>;
+         int32_t number_of_codes = pcre2_serialize_get_number_of_codes(bytes);
+
+       The pcre2_serialize_decode() function reads a byte stream and recreates
+       the compiled patterns in new memory blocks, setting pointers to them in
+       a  vector.  The  first two arguments are a pointer to a suitable vector
+       and its length, and the third argument points to  a  byte  stream.  The
+       final  argument is a pointer to a general context, which can be used to
+       specify custom memory mangagement functions for the  decoded  patterns.
+       If this argument is NULL, malloc() and free() are used. After deserial-
+       ization, the byte stream is no longer needed and can be discarded.
+
+         int32_t number_of_codes;
+         pcre2_code *list_of_codes[2];
+         uint8_t *bytes = <serialized data>;
+         int32_t number_of_codes =
+           pcre2_serialize_decode(list_of_codes, 2, bytes, NULL);
+
+       If the vector is not large enough for all  the  patterns  in  the  byte
+       stream,  it  is  filled  with  those  that  fit,  and the remainder are
+       ignored. The yield of the function is the number of  decoded  patterns,
+       or one of the following negative error codes:
+
+         PCRE2_ERROR_BADDATA   second argument is zero or less
+         PCRE2_ERROR_BADMAGIC  mismatch of id bytes in the data
+         PCRE2_ERROR_BADMODE   mismatch of variable unit size or PCRE2 version
+         PCRE2_ERROR_MEMORY    memory allocation failed
+         PCRE2_ERROR_NULL      first or third argument is NULL
+
+       PCRE2_ERROR_BADMAGIC  may mean that the data is corrupt, or that it was
+       compiled on a system with different endianness.
+
+       Decoded patterns can be used for matching in the usual way, and must be
+       freed  by  calling pcre2_code_free(). However, be aware that there is a
+       potential race issue if you  are  using  multiple  patterns  that  were
+       decoded  from  a  single  byte stream in a multithreaded application. A
+       single copy of the character tables is used by all the decoded patterns
+       and a reference count is used to arrange for its memory to be automati-
+       cally freed when the last pattern is freed, but there is no locking  on
+       this  reference count. Therefore, if you want to call pcre2_code_free()
+       for these patterns in different threads,  you  must  arrange  your  own
+       locking,  and  ensure  that  pcre2_code_free()  cannot be called by two
+       threads at the same time.
+
+       If a pattern was processed by pcre2_jit_compile() before being  serial-
+       ized,  the  JIT data is discarded and so is no longer available after a
+       save/restore cycle. You can, however, process a restored  pattern  with
+       pcre2_jit_compile() if you wish.
+
+
+AUTHOR
+
+       Philip Hazel
+       University Computing Service
+       Cambridge, England.
+
+
+REVISION
+
+       Last updated: 03 November 2015
+       Copyright (c) 1997-2015 University of Cambridge.
+------------------------------------------------------------------------------
+
+
+PCRE2STACK(3)              Library Functions Manual              PCRE2STACK(3)
+
+
+
+NAME
+       PCRE2 - Perl-compatible regular expressions (revised API)
+
+PCRE2 DISCUSSION OF STACK USAGE
+
+       When  you  call  pcre2_match(),  it  makes  use of an internal function
+       called match(). This calls itself recursively at branch points  in  the
+       pattern,  in  order  to  remember the state of the match so that it can
+       back up and try a different alternative after a  failure.  As  matching
+       proceeds  deeper  and deeper into the tree of possibilities, the recur-
+       sion depth increases. The match() function is also called in other cir-
+       cumstances,  for  example,  whenever  a  parenthesized  sub-pattern  is
+       entered, and in certain cases of repetition.
+
+       Not all calls of match() increase the recursion depth; for an item such
+       as  a* it may be called several times at the same level, after matching
+       different numbers of a's. Furthermore, in a number of cases  where  the
+       result  of  the  recursive call would immediately be passed back as the
+       result of the current call (a "tail recursion"), the function  is  just
+       restarted instead.
+
+       Each  time the internal match() function is called recursively, it uses
+       memory from the process stack. For certain kinds of pattern  and  data,
+       very  large  amounts of stack may be needed, despite the recognition of
+       "tail recursion". Note that if  PCRE2  is  compiled  with  the  -fsani-
+       tize=address  option  of  the  GCC compiler, the stack requirements are
+       greatly increased.
+
+       The above comments apply when pcre2_match() is run in its normal inter-
+       pretive manner. If the compiled pattern was processed by pcre2_jit_com-
+       pile(), and just-in-time compiling  was  successful,  and  the  options
+       passed  to  pcre2_match()  were  not incompatible, the matching process
+       uses the JIT-compiled code instead of the  match()  function.  In  this
+       case, the memory requirements are handled entirely differently. See the
+       pcre2jit documentation for details.
+
+       The  pcre2_dfa_match()  function  operates  in  a  different   way   to
+       pcre2_match(),  and uses recursion only when there is a regular expres-
+       sion recursion or subroutine call in the  pattern.  This  includes  the
+       processing  of assertion and "once-only" subpatterns, which are handled
+       like subroutine calls.  Normally, these are never very  deep,  and  the
+       limit  on  the  complexity  of  pcre2_dfa_match()  is controlled by the
+       amount of workspace it is given.  However, it is possible to write pat-
+       terns  with  runaway  infinite  recursions;  such  patterns  will cause
+       pcre2_dfa_match() to run out of stack. At present, there is no  protec-
+       tion against this.
+
+       The  comments  that  follow do NOT apply to pcre2_dfa_match(); they are
+       relevant only for pcre2_match() without the JIT optimization.
+
+   Reducing pcre2_match()'s stack usage
+
+       You can often reduce the amount of recursion, and therefore the  amount
+       of  stack  used,  by  modifying the pattern that is being matched. Con-
+       sider, for example, this pattern:
+
+         ([^<]|<(?!inet))+
+
+       It matches from wherever it starts until it encounters "<inet"  or  the
+       end  of  the  data,  and is the kind of pattern that might be used when
+       processing an XML file. Each iteration of the outer parentheses matches
+       either  one  character that is not "<" or a "<" that is not followed by
+       "inet". However, each time a  parenthesis  is  processed,  a  recursion
+       occurs, so this formulation uses a stack frame for each matched charac-
+       ter. For a long string, a lot of stack is required. Consider  now  this
+       rewritten pattern, which matches exactly the same strings:
+
+         ([^<]++|<(?!inet))+
+
+       This  uses very much less stack, because runs of characters that do not
+       contain "<" are "swallowed" in one item inside the parentheses.  Recur-
+       sion  happens  only when a "<" character that is not followed by "inet"
+       is encountered (and we assume this is relatively  rare).  A  possessive
+       quantifier  is  used  to stop any backtracking into the runs of non-"<"
+       characters, but that is not related to stack usage.
+
+       This example shows that one way of avoiding stack problems when  match-
+       ing long subject strings is to write repeated parenthesized subpatterns
+       to match more than one character whenever possible.
+
+   Compiling PCRE2 to use heap instead of stack for pcre2_match()
+
+       In environments where stack memory is constrained, you  might  want  to
+       compile PCRE2 to use heap memory instead of stack for remembering back-
+       up points when pcre2_match() is running. This makes it run more slowly,
+       however. Details of how to do this are given in the pcre2build documen-
+       tation. When built in this way, instead of using the stack, PCRE2  gets
+       memory  for  remembering  backup  points from the heap. By default, the
+       memory is obtained by calling the system malloc() function, but you can
+       arrange to supply your own memory management function. For details, see
+       the section entitled "The match context" in the pcre2api documentation.
+       Since the block sizes are always the same, it may be possible to imple-
+       ment customized a memory handler that is more efficient than the  stan-
+       dard function. The memory blocks obtained for this purpose are retained
+       and re-used if possible while pcre2_match() is running.  They  are  all
+       freed just before it exits.
+
+   Limiting pcre2_match()'s stack usage
+
+       You can set limits on the number of times the internal match() function
+       is called, both in total and  recursively.  If  a  limit  is  exceeded,
+       pcre2_match()  returns  an  error  code. Setting suitable limits should
+       prevent it from running out of stack. The default values of the  limits
+       are  very large, and unlikely ever to operate. They can be changed when
+       PCRE2 is built, and they can also be set when pcre2_match() is  called.
+       For  details  of these interfaces, see the pcre2build documentation and
+       the section entitled "The match context" in the pcre2api documentation.
+
+       As a very rough rule of thumb, you should reckon on about 500 bytes per
+       recursion.  Thus,  if  you  want  to limit your stack usage to 8Mb, you
+       should set the limit at 16000 recursions. A 64Mb stack,  on  the  other
+       hand, can support around 128000 recursions.
+
+       The  pcre2test  test program has a modifier called "find_limits" which,
+       if applied to a subject line, causes it to  find  the  smallest  limits
+       that  allow a a pattern to match. This is done by calling pcre2_match()
+       repeatedly with different limits.
+
+   Changing stack size in Unix-like systems
+
+       In Unix-like environments, there is not often a problem with the  stack
+       unless  very  long  strings  are  involved, though the default limit on
+       stack size varies from system to system. Values from 8Mb  to  64Mb  are
+       common. You can find your default limit by running the command:
+
+         ulimit -s
+
+       Unfortunately,  the  effect  of  running out of stack is often SIGSEGV,
+       though sometimes a more explicit error message is given. You  can  nor-
+       mally increase the limit on stack size by code such as this:
+
+         struct rlimit rlim;
+         getrlimit(RLIMIT_STACK, &rlim);
+         rlim.rlim_cur = 100*1024*1024;
+         setrlimit(RLIMIT_STACK, &rlim);
+
+       This  reads  the current limits (soft and hard) using getrlimit(), then
+       attempts to increase the soft limit to  100Mb  using  setrlimit().  You
+       must do this before calling pcre2_match().
+
+   Changing stack size in Mac OS X
+
+       Using setrlimit(), as described above, should also work on Mac OS X. It
+       is also possible to set a stack size when linking a program. There is a
+       discussion   about   stack  sizes  in  Mac  OS  X  at  this  web  site:
+       http://developer.apple.com/qa/qa2005/qa1419.html.
+
+
+AUTHOR
+
+       Philip Hazel
+       University Computing Service
+       Cambridge, England.
+
+
+REVISION
+
+       Last updated: 21 November 2014
+       Copyright (c) 1997-2014 University of Cambridge.
+------------------------------------------------------------------------------
+
+
+PCRE2SYNTAX(3)             Library Functions Manual             PCRE2SYNTAX(3)
+
+
+
+NAME
+       PCRE2 - Perl-compatible regular expressions (revised API)
+
+PCRE2 REGULAR EXPRESSION SYNTAX SUMMARY
+
+       The  full syntax and semantics of the regular expressions that are sup-
+       ported by PCRE2 are described in the pcre2pattern  documentation.  This
+       document contains a quick-reference summary of the syntax.
+
+
+QUOTING
+
+         \x         where x is non-alphanumeric is a literal x
+         \Q...\E    treat enclosed characters as literal
+
+
+ESCAPED CHARACTERS
+
+       This table applies to ASCII and Unicode environments.
+
+         \a         alarm, that is, the BEL character (hex 07)
+         \cx        "control-x", where x is any ASCII printing character
+         \e         escape (hex 1B)
+         \f         form feed (hex 0C)
+         \n         newline (hex 0A)
+         \r         carriage return (hex 0D)
+         \t         tab (hex 09)
+         \0dd       character with octal code 0dd
+         \ddd       character with octal code ddd, or backreference
+         \o{ddd..}  character with octal code ddd..
+         \U         "U" if PCRE2_ALT_BSUX is set (otherwise is an error)
+         \uhhhh     character with hex code hhhh (if PCRE2_ALT_BSUX is set)
+         \xhh       character with hex code hh
+         \x{hhh..}  character with hex code hhh..
+
+       Note that \0dd is always an octal code. The treatment of backslash fol-
+       lowed by a non-zero digit is complicated; for details see  the  section
+       "Non-printing  characters"  in  the  pcre2pattern  documentation, where
+       details of escape processing in EBCDIC environments are also given.
+
+       When \x is not followed by {, from zero to two hexadecimal  digits  are
+       read, but if PCRE2_ALT_BSUX is set, \x must be followed by two hexadec-
+       imal digits to be recognized as  a  hexadecimal  escape;  otherwise  it
+       matches  a literal "x".  Likewise, if \u (in ALT_BSUX mode) is not fol-
+       lowed by four hexadecimal digits, it matches a literal "u".
+
+
+CHARACTER TYPES
+
+         .          any character except newline;
+                      in dotall mode, any character whatsoever
+         \C         one code unit, even in UTF mode (best avoided)
+         \d         a decimal digit
+         \D         a character that is not a decimal digit
+         \h         a horizontal white space character
+         \H         a character that is not a horizontal white space character
+         \N         a character that is not a newline
+         \p{xx}     a character with the xx property
+         \P{xx}     a character without the xx property
+         \R         a newline sequence
+         \s         a white space character
+         \S         a character that is not a white space character
+         \v         a vertical white space character
+         \V         a character that is not a vertical white space character
+         \w         a "word" character
+         \W         a "non-word" character
+         \X         a Unicode extended grapheme cluster
+
+       \C is dangerous because it may leave the current matching point in  the
+       middle of a UTF-8 or UTF-16 character. The application can lock out the
+       use of \C by setting the PCRE2_NEVER_BACKSLASH_C  option.  It  is  also
+       possible to build PCRE2 with the use of \C permanently disabled.
+
+       By  default,  \d, \s, and \w match only ASCII characters, even in UTF-8
+       mode or in the 16-bit and 32-bit libraries. However, if locale-specific
+       matching  is  happening,  \s and \w may also match characters with code
+       points in the range 128-255. If the PCRE2_UCP option is set, the behav-
+       iour of these escape sequences is changed to use Unicode properties and
+       they match many more characters.
+
+
+GENERAL CATEGORY PROPERTIES FOR \p and \P
+
+         C          Other
+         Cc         Control
+         Cf         Format
+         Cn         Unassigned
+         Co         Private use
+         Cs         Surrogate
+
+         L          Letter
+         Ll         Lower case letter
+         Lm         Modifier letter
+         Lo         Other letter
+         Lt         Title case letter
+         Lu         Upper case letter
+         L&         Ll, Lu, or Lt
+
+         M          Mark
+         Mc         Spacing mark
+         Me         Enclosing mark
+         Mn         Non-spacing mark
+
+         N          Number
+         Nd         Decimal number
+         Nl         Letter number
+         No         Other number
+
+         P          Punctuation
+         Pc         Connector punctuation
+         Pd         Dash punctuation
+         Pe         Close punctuation
+         Pf         Final punctuation
+         Pi         Initial punctuation
+         Po         Other punctuation
+         Ps         Open punctuation
+
+         S          Symbol
+         Sc         Currency symbol
+         Sk         Modifier symbol
+         Sm         Mathematical symbol
+         So         Other symbol
+
+         Z          Separator
+         Zl         Line separator
+         Zp         Paragraph separator
+         Zs         Space separator
+
+
+PCRE2 SPECIAL CATEGORY PROPERTIES FOR \p and \P
+
+         Xan        Alphanumeric: union of properties L and N
+         Xps        POSIX space: property Z or tab, NL, VT, FF, CR
+         Xsp        Perl space: property Z or tab, NL, VT, FF, CR
+         Xuc        Univerally-named character: one that can be
+                      represented by a Universal Character Name
+         Xwd        Perl word: property Xan or underscore
+
+       Perl and POSIX space are now the same. Perl added VT to its space char-
+       acter set at release 5.18.
+
+
+SCRIPT NAMES FOR \p AND \P
+
+       Ahom,   Anatolian_Hieroglyphs,  Arabic,  Armenian,  Avestan,  Balinese,
+       Bamum, Bassa_Vah, Batak, Bengali, Bopomofo, Brahmi, Braille,  Buginese,
+       Buhid,  Canadian_Aboriginal,  Carian, Caucasian_Albanian, Chakma, Cham,
+       Cherokee,  Common,  Coptic,  Cuneiform,  Cypriot,  Cyrillic,   Deseret,
+       Devanagari,  Duployan,  Egyptian_Hieroglyphs,  Elbasan, Ethiopic, Geor-
+       gian, Glagolitic, Gothic,  Grantha,  Greek,  Gujarati,  Gurmukhi,  Han,
+       Hangul, Hanunoo, Hatran, Hebrew, Hiragana, Imperial_Aramaic, Inherited,
+       Inscriptional_Pahlavi, Inscriptional_Parthian, Javanese,  Kaithi,  Kan-
+       nada,  Katakana,  Kayah_Li,  Kharoshthi, Khmer, Khojki, Khudawadi, Lao,
+       Latin, Lepcha, Limbu, Linear_A, Linear_B, Lisu, Lycian,  Lydian,  Maha-
+       jani,  Malayalam,  Mandaic,  Manichaean,  Meetei_Mayek,  Mende_Kikakui,
+       Meroitic_Cursive, Meroitic_Hieroglyphs,  Miao,  Modi,  Mongolian,  Mro,
+       Multani,   Myanmar,   Nabataean,  New_Tai_Lue,  Nko,  Ogham,  Ol_Chiki,
+       Old_Hungarian, Old_Italic, Old_North_Arabian, Old_Permic,  Old_Persian,
+       Old_South_Arabian, Old_Turkic, Oriya, Osmanya, Pahawh_Hmong, Palmyrene,
+       Pau_Cin_Hau,  Phags_Pa,  Phoenician,  Psalter_Pahlavi,  Rejang,  Runic,
+       Samaritan, Saurashtra, Sharada, Shavian, Siddham, SignWriting, Sinhala,
+       Sora_Sompeng,  Sundanese,  Syloti_Nagri,  Syriac,  Tagalog,   Tagbanwa,
+       Tai_Le,   Tai_Tham,  Tai_Viet,  Takri,  Tamil,  Telugu,  Thaana,  Thai,
+       Tibetan, Tifinagh, Tirhuta, Ugaritic, Vai, Warang_Citi, Yi.
+
+
+CHARACTER CLASSES
+
+         [...]       positive character class
+         [^...]      negative character class
+         [x-y]       range (can be used for hex characters)
+         [[:xxx:]]   positive POSIX named set
+         [[:^xxx:]]  negative POSIX named set
+
+         alnum       alphanumeric
+         alpha       alphabetic
+         ascii       0-127
+         blank       space or tab
+         cntrl       control character
+         digit       decimal digit
+         graph       printing, excluding space
+         lower       lower case letter
+         print       printing, including space
+         punct       printing, excluding alphanumeric
+         space       white space
+         upper       upper case letter
+         word        same as \w
+         xdigit      hexadecimal digit
+
+       In PCRE2, POSIX character set names recognize only ASCII characters  by
+       default,  but  some of them use Unicode properties if PCRE2_UCP is set.
+       You can use \Q...\E inside a character class.
+
+
+QUANTIFIERS
+
+         ?           0 or 1, greedy
+         ?+          0 or 1, possessive
+         ??          0 or 1, lazy
+         *           0 or more, greedy
+         *+          0 or more, possessive
+         *?          0 or more, lazy
+         +           1 or more, greedy
+         ++          1 or more, possessive
+         +?          1 or more, lazy
+         {n}         exactly n
+         {n,m}       at least n, no more than m, greedy
+         {n,m}+      at least n, no more than m, possessive
+         {n,m}?      at least n, no more than m, lazy
+         {n,}        n or more, greedy
+         {n,}+       n or more, possessive
+         {n,}?       n or more, lazy
+
+
+ANCHORS AND SIMPLE ASSERTIONS
+
+         \b          word boundary
+         \B          not a word boundary
+         ^           start of subject
+                       also after an internal newline in multiline mode
+                       (after any newline if PCRE2_ALT_CIRCUMFLEX is set)
+         \A          start of subject
+         $           end of subject
+                       also before newline at end of subject
+                       also before internal newline in multiline mode
+         \Z          end of subject
+                       also before newline at end of subject
+         \z          end of subject
+         \G          first matching position in subject
+
+
+MATCH POINT RESET
+
+         \K          reset start of match
+
+       \K is honoured in positive assertions, but ignored in negative ones.
+
+
+ALTERNATION
+
+         expr|expr|expr...
+
+
+CAPTURING
+
+         (...)           capturing group
+         (?<name>...)    named capturing group (Perl)
+         (?'name'...)    named capturing group (Perl)
+         (?P<name>...)   named capturing group (Python)
+         (?:...)         non-capturing group
+         (?|...)         non-capturing group; reset group numbers for
+                          capturing groups in each alternative
+
+
+ATOMIC GROUPS
+
+         (?>...)         atomic, non-capturing group
+
+
+COMMENT
+
+         (?#....)        comment (not nestable)
+
+
+OPTION SETTING
+
+         (?i)            caseless
+         (?J)            allow duplicate names
+         (?m)            multiline
+         (?s)            single line (dotall)
+         (?U)            default ungreedy (lazy)
+         (?x)            extended (ignore white space)
+         (?-...)         unset option(s)
+
+       The following are recognized only at the very start  of  a  pattern  or
+       after  one  of the newline or \R options with similar syntax. More than
+       one of them may appear.
+
+         (*LIMIT_MATCH=d) set the match limit to d (decimal number)
+         (*LIMIT_RECURSION=d) set the recursion limit to d (decimal number)
+         (*NOTEMPTY)     set PCRE2_NOTEMPTY when matching
+         (*NOTEMPTY_ATSTART) set PCRE2_NOTEMPTY_ATSTART when matching
+         (*NO_AUTO_POSSESS) no auto-possessification (PCRE2_NO_AUTO_POSSESS)
+         (*NO_DOTSTAR_ANCHOR) no .* anchoring (PCRE2_NO_DOTSTAR_ANCHOR)
+         (*NO_JIT)       disable JIT optimization
+         (*NO_START_OPT) no start-match optimization (PCRE2_NO_START_OPTIMIZE)
+         (*UTF)          set appropriate UTF mode for the library in use
+         (*UCP)          set PCRE2_UCP (use Unicode properties for \d etc)
+
+       Note that LIMIT_MATCH and LIMIT_RECURSION can only reduce the value  of
+       the  limits  set by the caller of pcre2_match(), not increase them. The
+       application can lock out the use of (*UTF) and (*UCP)  by  setting  the
+       PCRE2_NEVER_UTF  or  PCRE2_NEVER_UCP  options, respectively, at compile
+       time.
+
+
+NEWLINE CONVENTION
+
+       These are recognized only at the very start of  the  pattern  or  after
+       option settings with a similar syntax.
+
+         (*CR)           carriage return only
+         (*LF)           linefeed only
+         (*CRLF)         carriage return followed by linefeed
+         (*ANYCRLF)      all three of the above
+         (*ANY)          any Unicode newline sequence
+
+
+WHAT \R MATCHES
+
+       These  are  recognized  only  at the very start of the pattern or after
+       option setting with a similar syntax.
+
+         (*BSR_ANYCRLF)  CR, LF, or CRLF
+         (*BSR_UNICODE)  any Unicode newline sequence
+
+
+LOOKAHEAD AND LOOKBEHIND ASSERTIONS
+
+         (?=...)         positive look ahead
+         (?!...)         negative look ahead
+         (?<=...)        positive look behind
+         (?<!...)        negative look behind
+
+       Each top-level branch of a look behind must be of a fixed length.
+
+
+BACKREFERENCES
+
+         \n              reference by number (can be ambiguous)
+         \gn             reference by number
+         \g{n}           reference by number
+         \g{-n}          relative reference by number
+         \k<name>        reference by name (Perl)
+         \k'name'        reference by name (Perl)
+         \g{name}        reference by name (Perl)
+         \k{name}        reference by name (.NET)
+         (?P=name)       reference by name (Python)
+
+
+SUBROUTINE REFERENCES (POSSIBLY RECURSIVE)
+
+         (?R)            recurse whole pattern
+         (?n)            call subpattern by absolute number
+         (?+n)           call subpattern by relative number
+         (?-n)           call subpattern by relative number
+         (?&name)        call subpattern by name (Perl)
+         (?P>name)       call subpattern by name (Python)
+         \g<name>        call subpattern by name (Oniguruma)
+         \g'name'        call subpattern by name (Oniguruma)
+         \g<n>           call subpattern by absolute number (Oniguruma)
+         \g'n'           call subpattern by absolute number (Oniguruma)
+         \g<+n>          call subpattern by relative number (PCRE2 extension)
+         \g'+n'          call subpattern by relative number (PCRE2 extension)
+         \g<-n>          call subpattern by relative number (PCRE2 extension)
+         \g'-n'          call subpattern by relative number (PCRE2 extension)
+
+
+CONDITIONAL PATTERNS
+
+         (?(condition)yes-pattern)
+         (?(condition)yes-pattern|no-pattern)
+
+         (?(n)               absolute reference condition
+         (?(+n)              relative reference condition
+         (?(-n)              relative reference condition
+         (?(<name>)          named reference condition (Perl)
+         (?('name')          named reference condition (Perl)
+         (?(name)            named reference condition (PCRE2)
+         (?(R)               overall recursion condition
+         (?(Rn)              specific group recursion condition
+         (?(R&name)          specific recursion condition
+         (?(DEFINE)          define subpattern for reference
+         (?(VERSION[>]=n.m)  test PCRE2 version
+         (?(assert)          assertion condition
+
+
+BACKTRACKING CONTROL
+
+       The following act immediately they are reached:
+
+         (*ACCEPT)       force successful match
+         (*FAIL)         force backtrack; synonym (*F)
+         (*MARK:NAME)    set name to be passed back; synonym (*:NAME)
+
+       The following act only when a subsequent match failure causes  a  back-
+       track to reach them. They all force a match failure, but they differ in
+       what happens afterwards. Those that advance the start-of-match point do
+       so only if the pattern is not anchored.
+
+         (*COMMIT)       overall failure, no advance of starting point
+         (*PRUNE)        advance to next starting character
+         (*PRUNE:NAME)   equivalent to (*MARK:NAME)(*PRUNE)
+         (*SKIP)         advance to current matching position
+         (*SKIP:NAME)    advance to position corresponding to an earlier
+                         (*MARK:NAME); if not found, the (*SKIP) is ignored
+         (*THEN)         local failure, backtrack to next alternation
+         (*THEN:NAME)    equivalent to (*MARK:NAME)(*THEN)
+
+
+CALLOUTS
+
+         (?C)            callout (assumed number 0)
+         (?Cn)           callout with numerical data n
+         (?C"text")      callout with string data
+
+       The allowed string delimiters are ` ' " ^ % # $ (which are the same for
+       the start and the end), and the starting delimiter { matched  with  the
+       ending  delimiter  }. To encode the ending delimiter within the string,
+       double it.
+
+
+SEE ALSO
+
+       pcre2pattern(3),   pcre2api(3),   pcre2callout(3),    pcre2matching(3),
+       pcre2(3).
+
+
+AUTHOR
+
+       Philip Hazel
+       University Computing Service
+       Cambridge, England.
+
+
+REVISION
+
+       Last updated: 16 October 2015
+       Copyright (c) 1997-2015 University of Cambridge.
+------------------------------------------------------------------------------
+
+
+PCRE2UNICODE(3)            Library Functions Manual            PCRE2UNICODE(3)
+
+
+
+NAME
+       PCRE - Perl-compatible regular expressions (revised API)
+
+UNICODE AND UTF SUPPORT
+
+       When PCRE2 is built with Unicode support (which is the default), it has
+       knowledge of Unicode character properties and can process text  strings
+       in  UTF-8, UTF-16, or UTF-32 format (depending on the code unit width).
+       However, by default, PCRE2 assumes that one code unit is one character.
+       To  process  a  pattern  as a UTF string, where a character may require
+       more than one  code  unit,  you  must  call  pcre2_compile()  with  the
+       PCRE2_UTF  option  flag,  or  the  pattern must start with the sequence
+       (*UTF). When either of these is the case, both the pattern and any sub-
+       ject  strings  that  are  matched against it are treated as UTF strings
+       instead of strings of individual one-code-unit characters.
+
+       If you do not need Unicode support you can build PCRE2 without  it,  in
+       which case the library will be smaller.
+
+
+UNICODE PROPERTY SUPPORT
+
+       When  PCRE2 is built with Unicode support, the escape sequences \p{..},
+       \P{..}, and \X can be used. The Unicode 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, the Unicode script  names  such
+       as Arabic or Han, and the derived properties Any and L&. Full lists are
+       given in the pcre2pattern and pcre2syntax documentation. Only the short
+       names  for  properties are supported. For example, \p{L} matches a let-
+       ter. Its Perl synonym, \p{Letter}, is not supported.   Furthermore,  in
+       Perl,  many properties may optionally be prefixed by "Is", for compati-
+       bility with Perl 5.6. PCRE does not support this.
+
+
+WIDE CHARACTERS AND UTF MODES
+
+       Codepoints less than 256 can be specified in patterns by either  braced
+       or unbraced hexadecimal escape sequences (for example, \x{b3} or \xb3).
+       Larger values have to use braced sequences. Unbraced octal code  points
+       up to \777 are also recognized; larger ones can be coded using \o{...}.
+
+       In  UTF modes, repeat quantifiers apply to complete UTF characters, not
+       to individual code units.
+
+       In UTF modes, the dot metacharacter matches one UTF  character  instead
+       of a single code unit.
+
+       The  escape  sequence  \C can be used to match a single code unit, in a
+       UTF mode, but its use can lead  to  some  strange  effects  because  it
+       breaks  up  multi-unit  characters  (see  the  description of \C in the
+       pcre2pattern documentation). The use of \C  is  not  supported  by  the
+       alternative  matching  function pcre2_dfa_match() when in UTF mode. Its
+       use provokes a match-time error. The JIT  optimization  also  does  not
+       support  \C  in  UTF  mode.  If JIT optimization is requested for a UTF
+       pattern that contains \C, it will not succeed, and so the matching will
+       be carried out by the normal interpretive function.
+
+       The character escapes \b, \B, \d, \D, \s, \S, \w, and \W correctly test
+       characters of any code value, but,  by  default,  the  characters  that
+       PCRE2  recognizes as digits, spaces, or word characters remain the same
+       set as in non-UTF mode, all  with  code  points  less  than  256.  This
+       remains  true  even  when  PCRE2  is  built to include Unicode support,
+       because to do otherwise would slow down matching in many common  cases.
+       Note  that  this also applies to \b and \B, because they are defined in
+       terms of \w and \W. If you want to test for  a  wider  sense  of,  say,
+       "digit",  you  can  use explicit Unicode property tests such as \p{Nd}.
+       Alternatively, if you set the PCRE2_UCP option, the way that the  char-
+       acter  escapes  work  is changed so that Unicode properties are used to
+       determine which characters match. There are more details in the section
+       on generic character types in the pcre2pattern documentation.
+
+       Similarly,  characters that match the POSIX named character classes are
+       all low-valued characters, unless the PCRE2_UCP option is set.
+
+       However, the special  horizontal  and  vertical  white  space  matching
+       escapes (\h, \H, \v, and \V) do match all the appropriate Unicode char-
+       acters, whether or not PCRE2_UCP is set.
+
+       Case-insensitive matching in UTF mode makes use of Unicode  properties.
+       A  few  Unicode characters such as Greek sigma have more than two code-
+       points that are case-equivalent, and these are treated as such.
+
+
+VALIDITY OF UTF STRINGS
+
+       When the PCRE2_UTF option is set, the strings passed  as  patterns  and
+       subjects are (by default) checked for validity on entry to the relevant
+       functions.  If an invalid UTF string is passed, an negative error  code
+       is  returned.  The  code  unit offset to the offending character can be
+       extracted from the match data block by  calling  pcre2_get_startchar(),
+       which is used for this purpose after a UTF error.
+
+       UTF-16 and UTF-32 strings can indicate their endianness by special code
+       knows as a byte-order mark (BOM). The PCRE2  functions  do  not  handle
+       this, expecting strings to be in host byte order.
+
+       A UTF string is checked before any other processing takes place. In the
+       case of pcre2_match()  and  pcre2_dfa_match()  calls  with  a  non-zero
+       starting  offset, the check is applied only to that part of the subject
+       that could be inspected during matching, and there is a check that  the
+       starting  offset points to the first code unit of a character or to the
+       end of the subject. If there are no lookbehind assertions in  the  pat-
+       tern,  the check starts at the starting offset. Otherwise, it starts at
+       the length of the longest lookbehind before the starting offset, or  at
+       the  start  of the subject if there are not that many characters before
+       the starting offset. Note that the sequences \b and \B are  one-charac-
+       ter lookbehinds.
+
+       In  addition  to checking the format of the string, there is a check to
+       ensure that all code points lie in the range U+0 to U+10FFFF, excluding
+       the  surrogate  area. The so-called "non-character" code points are not
+       excluded because Unicode corrigendum #9 makes it clear that they should
+       not be.
+
+       Characters  in  the "Surrogate Area" of Unicode are reserved for use by
+       UTF-16, where they are used in pairs to encode code points with  values
+       greater  than  0xFFFF. The code points that are encoded by UTF-16 pairs
+       are available independently in the  UTF-8  and  UTF-32  encodings.  (In
+       other  words,  the  whole  surrogate  thing is a fudge for UTF-16 which
+       unfortunately messes up UTF-8 and UTF-32.)
+
+       In some situations, you may already know that your strings  are  valid,
+       and  therefore  want  to  skip these checks in order to improve perfor-
+       mance, for example in the case of a long subject string that  is  being
+       scanned  repeatedly.   If you set the PCRE2_NO_UTF_CHECK option at com-
+       pile time or at match time, PCRE2 assumes that the pattern  or  subject
+       it is given (respectively) contains only valid UTF code unit sequences.
+
+       Passing  PCRE2_NO_UTF_CHECK  to pcre2_compile() just disables the check
+       for the pattern; it does not also apply to subject strings. If you want
+       to  disable the check for a subject string you must pass this option to
+       pcre2_match() or pcre2_dfa_match().
+
+       If you pass an invalid UTF string when PCRE2_NO_UTF_CHECK is  set,  the
+       result is undefined and your program may crash or loop indefinitely.
+
+   Errors in UTF-8 strings
+
+       The following negative error codes are given for invalid UTF-8 strings:
+
+         PCRE2_ERROR_UTF8_ERR1
+         PCRE2_ERROR_UTF8_ERR2
+         PCRE2_ERROR_UTF8_ERR3
+         PCRE2_ERROR_UTF8_ERR4
+         PCRE2_ERROR_UTF8_ERR5
+
+       The  string  ends  with a truncated UTF-8 character; the code specifies
+       how many bytes are missing (1 to 5). Although RFC 3629 restricts  UTF-8
+       characters  to  be  no longer than 4 bytes, the encoding scheme (origi-
+       nally defined by RFC 2279) allows for  up  to  6  bytes,  and  this  is
+       checked first; hence the possibility of 4 or 5 missing bytes.
+
+         PCRE2_ERROR_UTF8_ERR6
+         PCRE2_ERROR_UTF8_ERR7
+         PCRE2_ERROR_UTF8_ERR8
+         PCRE2_ERROR_UTF8_ERR9
+         PCRE2_ERROR_UTF8_ERR10
+
+       The two most significant bits of the 2nd, 3rd, 4th, 5th, or 6th byte of
+       the character do not have the binary value 0b10 (that  is,  either  the
+       most significant bit is 0, or the next bit is 1).
+
+         PCRE2_ERROR_UTF8_ERR11
+         PCRE2_ERROR_UTF8_ERR12
+
+       A  character that is valid by the RFC 2279 rules is either 5 or 6 bytes
+       long; these code points are excluded by RFC 3629.
+
+         PCRE2_ERROR_UTF8_ERR13
+
+       A 4-byte character has a value greater than 0x10fff; these code  points
+       are excluded by RFC 3629.
+
+         PCRE2_ERROR_UTF8_ERR14
+
+       A  3-byte  character  has  a  value in the range 0xd800 to 0xdfff; this
+       range of code points are reserved by RFC 3629 for use with UTF-16,  and
+       so are excluded from UTF-8.
+
+         PCRE2_ERROR_UTF8_ERR15
+         PCRE2_ERROR_UTF8_ERR16
+         PCRE2_ERROR_UTF8_ERR17
+         PCRE2_ERROR_UTF8_ERR18
+         PCRE2_ERROR_UTF8_ERR19
+
+       A  2-, 3-, 4-, 5-, or 6-byte character is "overlong", that is, it codes
+       for a value that can be represented by fewer bytes, which  is  invalid.
+       For  example,  the two bytes 0xc0, 0xae give the value 0x2e, whose cor-
+       rect coding uses just one byte.
+
+         PCRE2_ERROR_UTF8_ERR20
+
+       The two most significant bits of the first byte of a character have the
+       binary  value 0b10 (that is, the most significant bit is 1 and the sec-
+       ond is 0). Such a byte can only validly occur as the second  or  subse-
+       quent byte of a multi-byte character.
+
+         PCRE2_ERROR_UTF8_ERR21
+
+       The  first byte of a character has the value 0xfe or 0xff. These values
+       can never occur in a valid UTF-8 string.
+
+   Errors in UTF-16 strings
+
+       The following  negative  error  codes  are  given  for  invalid  UTF-16
+       strings:
+
+         PCRE_UTF16_ERR1  Missing low surrogate at end of string
+         PCRE_UTF16_ERR2  Invalid low surrogate follows high surrogate
+         PCRE_UTF16_ERR3  Isolated low surrogate
+
+
+   Errors in UTF-32 strings
+
+       The  following  negative  error  codes  are  given  for  invalid UTF-32
+       strings:
+
+         PCRE_UTF32_ERR1  Surrogate character (range from 0xd800 to 0xdfff)
+         PCRE_UTF32_ERR2  Code point is greater than 0x10ffff
+
+
+AUTHOR
+
+       Philip Hazel
+       University Computing Service
+       Cambridge, England.
+
+
+REVISION
+
+       Last updated: 16 October 2015
+       Copyright (c) 1997-2015 University of Cambridge.
+------------------------------------------------------------------------------
+
+
diff --git a/dist2/doc/pcre2_callout_enumerate.3 b/dist2/doc/pcre2_callout_enumerate.3
new file mode 100644
index 0000000..4573bb4
--- /dev/null
+++ b/dist2/doc/pcre2_callout_enumerate.3
@@ -0,0 +1,50 @@
+.TH PCRE2_COMPILE 3 "23 March 2015" "PCRE2 10.20"
+.SH NAME
+PCRE2 - Perl-compatible regular expressions (revised API)
+.SH SYNOPSIS
+.rs
+.sp
+.B #include <pcre2.h>
+.PP
+.nf
+.B int pcre2_callout_enumerate(const pcre2_code *\fIcode\fP,
+.B "  int (*\fIcallback\fP)(pcre2_callout_enumerate_block *, void *),"
+.B "  void *\fIcallout_data\fP);"
+.fi
+.
+.SH DESCRIPTION
+.rs
+.sp
+This function scans a compiled regular expression and calls the \fIcallback()\fP
+function for each callout within the pattern. The yield of the function is zero
+for success and non-zero otherwise. The arguments are:
+.sp
+  \fIcode\fP           Points to the compiled pattern
+  \fIcallback\fP       The callback function
+  \fIcallout_data\fP   User data that is passed to the callback
+.sp
+The \fIcallback()\fP function is passed a pointer to a data block containing
+the following fields:
+.sp
+  \fIversion\fP                Block version number
+  \fIpattern_position\fP       Offset to next item in pattern
+  \fInext_item_length\fP       Length of next item in pattern
+  \fIcallout_number\fP         Number for numbered callouts
+  \fIcallout_string_offset\fP  Offset to string within pattern
+  \fIcallout_string_length\fP  Length of callout string
+  \fIcallout_string\fP         Points to callout string or is NULL
+.sp
+The second argument is the callout data that was passed to
+\fBpcre2_callout_enumerate()\fP. The \fBcallback()\fP function must return zero
+for success. Any other value causes the pattern scan to stop, with the value
+being passed back as the result of \fBpcre2_callout_enumerate()\fP.
+.P
+There is a complete description of the PCRE2 native API in the
+.\" HREF
+\fBpcre2api\fP
+.\"
+page and a description of the POSIX API in the
+.\" HREF
+\fBpcre2posix\fP
+.\"
+page.
diff --git a/dist2/doc/pcre2_code_free.3 b/dist2/doc/pcre2_code_free.3
new file mode 100644
index 0000000..5127081
--- /dev/null
+++ b/dist2/doc/pcre2_code_free.3
@@ -0,0 +1,27 @@
+.TH PCRE2_CODE_FREE 3 "29 July 2015" "PCRE2 10.21"
+.SH NAME
+PCRE2 - Perl-compatible regular expressions (revised API)
+.SH SYNOPSIS
+.rs
+.sp
+.B #include <pcre2.h>
+.PP
+.nf
+.B void pcre2_code_free(pcre2_code *\fIcode\fP);
+.fi
+.
+.SH DESCRIPTION
+.rs
+.sp
+This function frees the memory used for a compiled pattern, including any
+memory used by the JIT compiler.
+.P
+There is a complete description of the PCRE2 native API in the
+.\" HREF
+\fBpcre2api\fP
+.\"
+page and a description of the POSIX API in the
+.\" HREF
+\fBpcre2posix\fP
+.\"
+page.
diff --git a/dist2/doc/pcre2_compile.3 b/dist2/doc/pcre2_compile.3
new file mode 100644
index 0000000..1e0dca5
--- /dev/null
+++ b/dist2/doc/pcre2_compile.3
@@ -0,0 +1,78 @@
+.TH PCRE2_COMPILE 3 "22 April 2015" "PCRE2 10.20"
+.SH NAME
+PCRE2 - Perl-compatible regular expressions (revised API)
+.SH SYNOPSIS
+.rs
+.sp
+.B #include <pcre2.h>
+.PP
+.nf
+.B pcre2_code *pcre2_compile(PCRE2_SPTR \fIpattern\fP, PCRE2_SIZE \fIlength\fP,
+.B "  uint32_t \fIoptions\fP, int *\fIerrorcode\fP, PCRE2_SIZE *\fIerroroffset,\fP"
+.B "  pcre2_compile_context *\fIccontext\fP);"
+.fi
+.
+.SH DESCRIPTION
+.rs
+.sp
+This function compiles a regular expression pattern into an internal form. Its
+arguments are:
+.sp
+  \fIpattern\fP       A string containing expression to be compiled
+  \fIlength\fP        The length of the string or PCRE2_ZERO_TERMINATED
+  \fIoptions\fP       Option bits
+  \fIerrorcode\fP     Where to put an error code
+  \fIerroffset\fP     Where to put an error offset
+  \fIccontext\fP      Pointer to a compile context or NULL
+.sp
+The length of the string and any error offset that is returned are in code
+units, not characters. A compile context is needed only if you want to change
+.sp
+  What \eR matches (Unicode newlines or CR, LF, CRLF only)
+  PCRE2's character tables
+  The newline character sequence
+  The compile time nested parentheses limit
+.sp
+or provide an external function for stack size checking. The option bits are:
+.sp
+  PCRE2_ANCHORED           Force pattern anchoring
+  PCRE2_ALT_BSUX           Alternative handling of \eu, \eU, and \ex
+  PCRE2_ALT_CIRCUMFLEX     Alternative handling of ^ in multiline mode
+  PCRE2_AUTO_CALLOUT       Compile automatic callouts
+  PCRE2_CASELESS           Do caseless matching
+  PCRE2_DOLLAR_ENDONLY     $ not to match newline at end
+  PCRE2_DOTALL             . matches anything including NL
+  PCRE2_DUPNAMES           Allow duplicate names for subpatterns
+  PCRE2_EXTENDED           Ignore white space and # comments
+  PCRE2_FIRSTLINE          Force matching to be before newline
+  PCRE2_MATCH_UNSET_BACKREF  Match unset back references
+  PCRE2_MULTILINE          ^ and $ match newlines within data
+  PCRE2_NEVER_BACKSLASH_C  Lock out the use of \eC in patterns
+  PCRE2_NEVER_UCP          Lock out PCRE2_UCP, e.g. via (*UCP)
+  PCRE2_NEVER_UTF          Lock out PCRE2_UTF, e.g. via (*UTF)
+  PCRE2_NO_AUTO_CAPTURE    Disable numbered capturing paren-
+                            theses (named ones available)
+  PCRE2_NO_AUTO_POSSESS    Disable auto-possessification
+  PCRE2_NO_DOTSTAR_ANCHOR  Disable automatic anchoring for .*
+  PCRE2_NO_START_OPTIMIZE  Disable match-time start optimizations
+  PCRE2_NO_UTF_CHECK       Do not check the pattern for UTF validity
+                             (only relevant if PCRE2_UTF is set)
+  PCRE2_UCP                Use Unicode properties for \ed, \ew, etc.
+  PCRE2_UNGREEDY           Invert greediness of quantifiers
+  PCRE2_UTF                Treat pattern and subjects as UTF strings
+.sp
+PCRE2 must be built with Unicode support in order to use PCRE2_UTF, PCRE2_UCP
+and related options.
+.P
+The yield of the function is a pointer to a private data structure that
+contains the compiled pattern, or NULL if an error was detected.
+.P
+There is a complete description of the PCRE2 native API in the
+.\" HREF
+\fBpcre2api\fP
+.\"
+page and a description of the POSIX API in the
+.\" HREF
+\fBpcre2posix\fP
+.\"
+page.
diff --git a/dist2/doc/pcre2_compile_context_copy.3 b/dist2/doc/pcre2_compile_context_copy.3
new file mode 100644
index 0000000..aea1187
--- /dev/null
+++ b/dist2/doc/pcre2_compile_context_copy.3
@@ -0,0 +1,29 @@
+.TH PCRE2_COMPILE_CONTEXT_COPY 3 "22 October 2014" "PCRE2 10.00"
+.SH NAME
+PCRE2 - Perl-compatible regular expressions (revised API)
+.SH SYNOPSIS
+.rs
+.sp
+.B #include <pcre2.h>
+.PP
+.nf
+.B pcre2_compile_context *pcre2_compile_context_copy(
+.B "  pcre2_compile_context *\fIccontext\fP);"
+.fi
+.
+.SH DESCRIPTION
+.rs
+.sp
+This function makes a new copy of a compile context, using the memory
+allocation function that was used for the original context. The result is NULL
+if the memory cannot be obtained.
+.P
+There is a complete description of the PCRE2 native API in the
+.\" HREF
+\fBpcre2api\fP
+.\"
+page and a description of the POSIX API in the
+.\" HREF
+\fBpcre2posix\fP
+.\"
+page.
diff --git a/dist2/doc/pcre2_compile_context_create.3 b/dist2/doc/pcre2_compile_context_create.3
new file mode 100644
index 0000000..3053df4
--- /dev/null
+++ b/dist2/doc/pcre2_compile_context_create.3
@@ -0,0 +1,30 @@
+.TH PCRE2_COMPILE_CONTEXT_CREATE 3 "22 October 2014" "PCRE2 10.00"
+.SH NAME
+PCRE2 - Perl-compatible regular expressions (revised API)
+.SH SYNOPSIS
+.rs
+.sp
+.B #include <pcre2.h>
+.PP
+.nf
+.B pcre2_compile_context *pcre2_compile_context_create(
+.B "  pcre2_general_context *\fIgcontext\fP);"
+.fi
+.
+.SH DESCRIPTION
+.rs
+.sp
+This function creates and initializes a new compile context. If its argument is
+NULL, \fBmalloc()\fP is used to get the necessary memory; otherwise the memory
+allocation function within the general context is used. The result is NULL if
+the memory could not be obtained.
+.P
+There is a complete description of the PCRE2 native API in the
+.\" HREF
+\fBpcre2api\fP
+.\"
+page and a description of the POSIX API in the
+.\" HREF
+\fBpcre2posix\fP
+.\"
+page.
diff --git a/dist2/doc/pcre2_compile_context_free.3 b/dist2/doc/pcre2_compile_context_free.3
new file mode 100644
index 0000000..0c6d787
--- /dev/null
+++ b/dist2/doc/pcre2_compile_context_free.3
@@ -0,0 +1,28 @@
+.TH PCRE2_COMPILE_CONTEXT_FREE 3 "22 October 2014" "PCRE2 10.00"
+.SH NAME
+PCRE2 - Perl-compatible regular expressions (revised API)
+.SH SYNOPSIS
+.rs
+.sp
+.B #include <pcre2.h>
+.PP
+.nf
+.B void pcre2_compile_context_free(pcre2_compile_context *\fIccontext\fP);
+.fi
+.
+.SH DESCRIPTION
+.rs
+.sp
+This function frees the memory occupied by a compile context, using the memory
+freeing function from the general context with which it was created, or
+\fBfree()\fP if that was not set.
+.P
+There is a complete description of the PCRE2 native API in the
+.\" HREF
+\fBpcre2api\fP
+.\"
+page and a description of the POSIX API in the
+.\" HREF
+\fBpcre2posix\fP
+.\"
+page.
diff --git a/dist2/doc/pcre2_config.3 b/dist2/doc/pcre2_config.3
new file mode 100644
index 0000000..0c29ce6
--- /dev/null
+++ b/dist2/doc/pcre2_config.3
@@ -0,0 +1,69 @@
+.TH PCRE2_CONFIG 3 "20 April 2014" "PCRE2 10.0"
+.SH NAME
+PCRE2 - Perl-compatible regular expressions (revised API)
+.SH SYNOPSIS
+.rs
+.sp
+.B #include <pcre2.h>
+.PP
+.SM
+.B int pcre2_config(uint32_t \fIwhat\fP, void *\fIwhere\fP);
+.
+.SH DESCRIPTION
+.rs
+.sp
+This function makes it possible for a client program to find out which optional
+features are available in the version of the PCRE2 library it is using. The
+arguments are as follows:
+.sp
+  \fIwhat\fP     A code specifying what information is required
+  \fIwhere\fP    Points to where to put the information
+.sp
+If \fIwhere\fP is NULL, the function returns the amount of memory needed for
+the requested information. When the information is a string, the value is in
+code units; for other types of data it is in bytes.
+.P
+If \fBwhere\fP is not NULL, for PCRE2_CONFIG_JITTARGET,
+PCRE2_CONFIG_UNICODE_VERSION, and PCRE2_CONFIG_VERSION it must point to a
+buffer that is large enough to hold the string. For all other codes it must
+point to a uint32_t integer variable. The available codes are:
+.sp
+  PCRE2_CONFIG_BSR             Indicates what \eR matches by default:
+                                 PCRE2_BSR_UNICODE
+                                 PCRE2_BSR_ANYCRLF
+  PCRE2_CONFIG_JIT             Availability of just-in-time compiler
+                                support (1=yes 0=no)
+  PCRE2_CONFIG_JITTARGET       Information about the target archi-
+                                 tecture for the JIT compiler
+  PCRE2_CONFIG_LINKSIZE        Configured internal link size (2, 3, 4)
+  PCRE2_CONFIG_MATCHLIMIT      Default internal resource limit
+  PCRE2_CONFIG_NEWLINE         Code for the default newline sequence:
+                                 PCRE2_NEWLINE_CR
+                                 PCRE2_NEWLINE_LF
+                                 PCRE2_NEWLINE_CRLF
+                                 PCRE2_NEWLINE_ANY
+                                 PCRE2_NEWLINE_ANYCRLF
+  PCRE2_CONFIG_PARENSLIMIT     Default parentheses nesting limit
+  PCRE2_CONFIG_RECURSIONLIMIT  Internal recursion depth limit
+  PCRE2_CONFIG_STACKRECURSE    Recursion implementation (1=stack
+                                 0=heap)
+  PCRE2_CONFIG_UNICODE         Availability of Unicode support (1=yes
+                                 0=no)
+  PCRE2_CONFIG_UNICODE_VERSION The Unicode version (a string)
+  PCRE2_CONFIG_VERSION         The PCRE2 version (a string)
+.sp
+The function yields a non-negative value on success or the negative value
+PCRE2_ERROR_BADOPTION otherwise. This is also the result for the
+PCRE2_CONFIG_JITTARGET code if JIT support is not available. When a string is
+requested, the function returns the number of code units used, including the
+terminating zero.
+.P
+There is a complete description of the PCRE2 native API in the
+.\" HREF
+\fBpcre2api\fP
+.\"
+page and a description of the POSIX API in the
+.\" HREF
+\fBpcre2posix\fP
+.\"
+page.
diff --git a/dist2/doc/pcre2_dfa_match.3 b/dist2/doc/pcre2_dfa_match.3
new file mode 100644
index 0000000..f45da0d
--- /dev/null
+++ b/dist2/doc/pcre2_dfa_match.3
@@ -0,0 +1,72 @@
+.TH PCRE2_DFA_MATCH 3 "12 May 2013" "PCRE2 10.00"
+.SH NAME
+PCRE2 - Perl-compatible regular expressions (revised API)
+.SH SYNOPSIS
+.rs
+.sp
+.B #include <pcre2.h>
+.PP
+.nf
+.B int pcre2_dfa_match(const pcre2_code *\fIcode\fP, PCRE2_SPTR \fIsubject\fP,
+.B "  PCRE2_SIZE \fIlength\fP, PCRE2_SIZE \fIstartoffset\fP,"
+.B "  uint32_t \fIoptions\fP, pcre2_match_data *\fImatch_data\fP,"
+.B "  pcre2_match_context *\fImcontext\fP,"
+.B "  int *\fIworkspace\fP, PCRE2_SIZE \fIwscount\fP);"
+.fi
+.
+.SH DESCRIPTION
+.rs
+.sp
+This function matches a compiled regular expression against a given subject
+string, using an alternative matching algorithm that scans the subject string
+just once (\fInot\fP Perl-compatible). (The Perl-compatible matching function
+is \fBpcre2_match()\fP.) The arguments for this function are:
+.sp
+  \fIcode\fP         Points to the compiled pattern
+  \fIsubject\fP      Points to the subject string
+  \fIlength\fP       Length of the subject string
+  \fIstartoffset\fP  Offset in the subject at which to start matching
+  \fIoptions\fP      Option bits
+  \fImatch_data\fP   Points to a match data block, for results
+  \fImcontext\fP     Points to a match context, or is NULL
+  \fIworkspace\fP    Points to a vector of ints used as working space
+  \fIwscount\fP      Number of elements in the vector
+.sp
+For \fBpcre2_dfa_match()\fP, a match context is needed only if you want to set
+up a callout function. The \fIlength\fP and \fIstartoffset\fP values are code
+units, not characters. The options are:
+.sp
+  PCRE2_ANCHORED          Match only at the first position
+  PCRE2_NOTBOL            Subject is not the beginning of a line
+  PCRE2_NOTEOL            Subject is not the end of a line
+  PCRE2_NOTEMPTY          An empty string is not a valid match
+  PCRE2_NOTEMPTY_ATSTART  An empty string at the start of the subject
+                           is not a valid match
+  PCRE2_NO_UTF_CHECK      Do not check the subject for UTF
+                           validity (only relevant if PCRE2_UTF
+                           was set at compile time)
+  PCRE2_PARTIAL_SOFT      Return PCRE2_ERROR_PARTIAL for a partial
+                            match if no full matches are found
+  PCRE2_PARTIAL_HARD      Return PCRE2_ERROR_PARTIAL for a partial match
+                           even if there is a full match as well
+  PCRE2_DFA_RESTART       Restart after a partial match
+  PCRE2_DFA_SHORTEST      Return only the shortest match
+.sp
+There are restrictions on what may appear in a pattern when using this matching
+function. Details are given in the
+.\" HREF
+\fBpcre2matching\fP
+.\"
+documentation. For details of partial matching, see the
+.\" HREF
+\fBpcre2partial\fP
+.\"
+page. There is a complete description of the PCRE2 native API in the
+.\" HREF
+\fBpcre2api\fP
+.\"
+page and a description of the POSIX API in the
+.\" HREF
+\fBpcre2posix\fP
+.\"
+page.
diff --git a/dist2/doc/pcre2_general_context_copy.3 b/dist2/doc/pcre2_general_context_copy.3
new file mode 100644
index 0000000..637e565
--- /dev/null
+++ b/dist2/doc/pcre2_general_context_copy.3
@@ -0,0 +1,30 @@
+.TH PCRE2_GENERAL_CONTEXT_COPY 3 "22 October 2014" "PCRE2 10.00"
+.SH NAME
+PCRE2 - Perl-compatible regular expressions (revised API)
+.SH SYNOPSIS
+.rs
+.sp
+.B #include <pcre2.h>
+.PP
+.nf
+.B pcre2_general_context *pcre2_general_context_copy(
+.B "  pcre2_general_context *\fIgcontext\fP);"
+.fi
+.
+.SH DESCRIPTION
+.rs
+.sp
+This function makes a new copy of a general context, using the memory
+allocation functions in the context, if set, to get the necessary memory.
+Otherwise \fBmalloc()\fP is used. The result is NULL if the memory cannot be
+obtained.
+.P
+There is a complete description of the PCRE2 native API in the
+.\" HREF
+\fBpcre2api\fP
+.\"
+page and a description of the POSIX API in the
+.\" HREF
+\fBpcre2posix\fP
+.\"
+page.
diff --git a/dist2/doc/pcre2_general_context_create.3 b/dist2/doc/pcre2_general_context_create.3
new file mode 100644
index 0000000..a3e6c10
--- /dev/null
+++ b/dist2/doc/pcre2_general_context_create.3
@@ -0,0 +1,32 @@
+.TH PCRE2_GENERAL_CONTEXT_CREATE 3 "22 October 2014" "PCRE2 10.00"
+.SH NAME
+PCRE2 - Perl-compatible regular expressions (revised API)
+.SH SYNOPSIS
+.rs
+.sp
+.B #include <pcre2.h>
+.PP
+.nf
+.B pcre2_general_context *pcre2_general_context_create(
+.B "  void *(*\fIprivate_malloc\fP)(PCRE2_SIZE, void *),"
+.B "  void (*\fIprivate_free\fP)(void *, void *), void *\fImemory_data\fP);"
+.fi
+.
+.SH DESCRIPTION
+.rs
+.sp
+This function creates and initializes a general context. The arguments define
+custom memory management functions and a data value that is passed to them when
+they are called. The \fBprivate_malloc()\fP function is used to get memory for
+the context. If either of the first two arguments is NULL, the system memory
+management function is used. The result is NULL if no memory could be obtained.
+.P
+There is a complete description of the PCRE2 native API in the
+.\" HREF
+\fBpcre2api\fP
+.\"
+page and a description of the POSIX API in the
+.\" HREF
+\fBpcre2posix\fP
+.\"
+page.
diff --git a/dist2/doc/pcre2_general_context_free.3 b/dist2/doc/pcre2_general_context_free.3
new file mode 100644
index 0000000..6285332
--- /dev/null
+++ b/dist2/doc/pcre2_general_context_free.3
@@ -0,0 +1,27 @@
+.TH PCRE2_GENERAL_CONTEXT_FREE 3 "22 October 2014" "PCRE2 10.00"
+.SH NAME
+PCRE2 - Perl-compatible regular expressions (revised API)
+.SH SYNOPSIS
+.rs
+.sp
+.B #include <pcre2.h>
+.PP
+.nf
+.B void pcre2_general_context_free(pcre2_general_context *\fIgcontext\fP);
+.fi
+.
+.SH DESCRIPTION
+.rs
+.sp
+This function frees the memory occupied by a general context, using the memory
+freeing function within the context, if set.
+.P
+There is a complete description of the PCRE2 native API in the
+.\" HREF
+\fBpcre2api\fP
+.\"
+page and a description of the POSIX API in the
+.\" HREF
+\fBpcre2posix\fP
+.\"
+page.
diff --git a/dist2/doc/pcre2_get_error_message.3 b/dist2/doc/pcre2_get_error_message.3
new file mode 100644
index 0000000..9ff5342
--- /dev/null
+++ b/dist2/doc/pcre2_get_error_message.3
@@ -0,0 +1,36 @@
+.TH PCRE2_GET_ERROR_MESSAGE 3 "21 October 2014" "PCRE2 10.00"
+.SH NAME
+PCRE2 - Perl-compatible regular expressions (revised API)
+.SH SYNOPSIS
+.rs
+.sp
+.B #include <pcre2.h>
+.PP
+.nf
+.B int pcre2_get_error_message(int \fIerrorcode\fP, PCRE2_UCHAR *\fIbuffer\fP,
+.B "  PCRE2_SIZE \fIbufflen\fP);"
+.fi
+.
+.SH DESCRIPTION
+.rs
+.sp
+This function provides a textual error message for each PCRE2 error code.
+Compilation errors are positive numbers; UTF formatting errors and matching
+errors are negative numbers. The arguments are:
+.sp
+  \fIerrorcode\fP   an error code (positive or negative)
+  \fIbuffer\fP      where to put the message
+  \fIbufflen\fP     the length of the buffer (code units)
+.sp
+The function returns the length of the message, excluding the trailing zero, or
+a negative error code if the buffer is too small.
+.P
+There is a complete description of the PCRE2 native API in the
+.\" HREF
+\fBpcre2api\fP
+.\"
+page and a description of the POSIX API in the
+.\" HREF
+\fBpcre2posix\fP
+.\"
+page.
diff --git a/dist2/doc/pcre2_get_mark.3 b/dist2/doc/pcre2_get_mark.3
new file mode 100644
index 0000000..e741dfe
--- /dev/null
+++ b/dist2/doc/pcre2_get_mark.3
@@ -0,0 +1,31 @@
+.TH PCRE2_GET_MARK 3 "24 October 2014" "PCRE2 10.00"
+.SH NAME
+PCRE2 - Perl-compatible regular expressions (revised API)
+.SH SYNOPSIS
+.rs
+.sp
+.B #include <pcre2.h>
+.PP
+.nf
+.B PCRE2_SPTR pcre2_get_mark(pcre2_match_data *\fImatch_data\fP);
+.fi
+.
+.SH DESCRIPTION
+.rs
+.sp
+After a call of \fBpcre2_match()\fP that was passed the match block that is
+this function's argument, this function returns a pointer to the last (*MARK)
+name that was encountered. The name is zero-terminated, and is within the
+compiled pattern. If no (*MARK) name is available, NULL is returned. A (*MARK)
+name may be available after a failed match or a partial match, as well as after
+a successful one.
+.P
+There is a complete description of the PCRE2 native API in the
+.\" HREF
+\fBpcre2api\fP
+.\"
+page and a description of the POSIX API in the
+.\" HREF
+\fBpcre2posix\fP
+.\"
+page.
diff --git a/dist2/doc/pcre2_get_ovector_count.3 b/dist2/doc/pcre2_get_ovector_count.3
new file mode 100644
index 0000000..3f6d748
--- /dev/null
+++ b/dist2/doc/pcre2_get_ovector_count.3
@@ -0,0 +1,27 @@
+.TH PCRE2_GET_OVECTOR_COUNT 3 "24 October 2014" "PCRE2 10.00"
+.SH NAME
+PCRE2 - Perl-compatible regular expressions (revised API)
+.SH SYNOPSIS
+.rs
+.sp
+.B #include <pcre2.h>
+.PP
+.nf
+.B uint32_t pcre2_get_ovector_count(pcre2_match_data *\fImatch_data\fP);
+.fi
+.
+.SH DESCRIPTION
+.rs
+.sp
+This function returns the number of pairs of offsets in the ovector that forms
+part of the given match data block.
+.P
+There is a complete description of the PCRE2 native API in the
+.\" HREF
+\fBpcre2api\fP
+.\"
+page and a description of the POSIX API in the
+.\" HREF
+\fBpcre2posix\fP
+.\"
+page.
diff --git a/dist2/doc/pcre2_get_ovector_pointer.3 b/dist2/doc/pcre2_get_ovector_pointer.3
new file mode 100644
index 0000000..261d652
--- /dev/null
+++ b/dist2/doc/pcre2_get_ovector_pointer.3
@@ -0,0 +1,28 @@
+.TH PCRE2_GET_OVECTOR_POINTER 3 "24 October 2014" "PCRE2 10.00"
+.SH NAME
+PCRE2 - Perl-compatible regular expressions (revised API)
+.SH SYNOPSIS
+.rs
+.sp
+.B #include <pcre2.h>
+.PP
+.nf
+.B PCRE2_SIZE *pcre2_get_ovector_pointer(pcre2_match_data *\fImatch_data\fP);
+.fi
+.
+.SH DESCRIPTION
+.rs
+.sp
+This function returns a pointer to the vector of offsets that forms part of the
+given match data block. The number of pairs can be found by calling
+\fBpcre2_get_ovector_count()\fP.
+.P
+There is a complete description of the PCRE2 native API in the
+.\" HREF
+\fBpcre2api\fP
+.\"
+page and a description of the POSIX API in the
+.\" HREF
+\fBpcre2posix\fP
+.\"
+page.
diff --git a/dist2/doc/pcre2_get_startchar.3 b/dist2/doc/pcre2_get_startchar.3
new file mode 100644
index 0000000..c6ac8b0
--- /dev/null
+++ b/dist2/doc/pcre2_get_startchar.3
@@ -0,0 +1,32 @@
+.TH PCRE2_GET_STARTCHAR 3 "24 October 2014" "PCRE2 10.00"
+.SH NAME
+PCRE2 - Perl-compatible regular expressions (revised API)
+.SH SYNOPSIS
+.rs
+.sp
+.B #include <pcre2.h>
+.PP
+.nf
+.B PCRE2_SIZE pcre2_get_startchar(pcre2_match_data *\fImatch_data\fP);
+.fi
+.
+.SH DESCRIPTION
+.rs
+.sp
+After a successful call of \fBpcre2_match()\fP that was passed the match block
+that is this function's argument, this function returns the code unit offset of
+the character at which the successful match started. For a non-partial match,
+this can be different to the value of \fIovector[0]\fP if the pattern contains
+the \eK escape sequence. After a partial match, however, this value is always
+the same as \fIovector[0]\fP because \eK does not affect the result of a
+partial match.
+.P
+There is a complete description of the PCRE2 native API in the
+.\" HREF
+\fBpcre2api\fP
+.\"
+page and a description of the POSIX API in the
+.\" HREF
+\fBpcre2posix\fP
+.\"
+page.
diff --git a/dist2/doc/pcre2_jit_compile.3 b/dist2/doc/pcre2_jit_compile.3
new file mode 100644
index 0000000..a11d949
--- /dev/null
+++ b/dist2/doc/pcre2_jit_compile.3
@@ -0,0 +1,45 @@
+.TH PCRE2_JIT_COMPILE 3 "21 October 2014" "PCRE2 10.00"
+.SH NAME
+PCRE2 - Perl-compatible regular expressions (revised API)
+.SH SYNOPSIS
+.rs
+.sp
+.B #include <pcre2.h>
+.PP
+.nf
+.B int pcre2_jit_compile(pcre2_code *\fIcode\fP, uint32_t \fIoptions\fP);
+.fi
+.
+.SH DESCRIPTION
+.rs
+.sp
+This function requests JIT compilation, which, if the just-in-time compiler is
+available, further processes a compiled pattern into machine code that executes
+much faster than the \fBpcre2_match()\fP interpretive matching function. Full
+details are given in the
+.\" HREF
+\fBpcre2jit\fP
+.\"
+documentation.
+.P
+The first argument is a pointer that was returned by a successful call to
+\fBpcre2_compile()\fP, and the second must contain one or more of the following
+bits:
+.sp
+  PCRE2_JIT_COMPLETE      compile code for full matching
+  PCRE2_JIT_PARTIAL_SOFT  compile code for soft partial matching
+  PCRE2_JIT_PARTIAL_HARD  compile code for hard partial matching
+.sp
+The yield of the function is 0 for success, or a negative error code otherwise.
+In particular, PCRE2_ERROR_JIT_BADOPTION is returned if JIT is not supported or
+if an unknown bit is set in \fIoptions\fP.
+.P
+There is a complete description of the PCRE2 native API in the
+.\" HREF
+\fBpcre2api\fP
+.\"
+page and a description of the POSIX API in the
+.\" HREF
+\fBpcre2posix\fP
+.\"
+page.
diff --git a/dist2/doc/pcre2_jit_free_unused_memory.3 b/dist2/doc/pcre2_jit_free_unused_memory.3
new file mode 100644
index 0000000..bf050c8
--- /dev/null
+++ b/dist2/doc/pcre2_jit_free_unused_memory.3
@@ -0,0 +1,31 @@
+.TH PCRE2_JIT_FREE_UNUSED_MEMORY 3 "27 October 2014" "PCRE2 10.00"
+.SH NAME
+PCRE2 - Perl-compatible regular expressions (revised API)
+.SH SYNOPSIS
+.rs
+.sp
+.B #include <pcre2.h>
+.PP
+.nf
+.B void pcre2_jit_free_unused_memory(pcre2_general_context *\fIgcontext\fP);
+.fi
+.
+.SH DESCRIPTION
+.rs
+.sp
+This function frees unused JIT executable memory. The argument is a general
+context, for custom memory management, or NULL for standard memory management.
+JIT memory allocation retains some memory in order to improve future JIT
+compilation speed. In low memory conditions,
+\fBpcre2_jit_free_unused_memory()\fB can be used to cause this memory to be
+freed.
+.P
+There is a complete description of the PCRE2 native API in the
+.\" HREF
+\fBpcre2api\fP
+.\"
+page and a description of the POSIX API in the
+.\" HREF
+\fBpcre2posix\fP
+.\"
+page.
diff --git a/dist2/doc/pcre2_jit_match.3 b/dist2/doc/pcre2_jit_match.3
new file mode 100644
index 0000000..b0cc197
--- /dev/null
+++ b/dist2/doc/pcre2_jit_match.3
@@ -0,0 +1,48 @@
+.TH PCRE2_JIT_MATCH 3 "03 November 2014" "PCRE2 10.0"
+.SH NAME
+PCRE2 - Perl-compatible regular expressions (revised API)
+.SH SYNOPSIS
+.rs
+.sp
+.B #include <pcre2.h>
+.PP
+.nf
+.B int pcre2_jit_match(const pcre2_code *\fIcode\fP, PCRE2_SPTR \fIsubject\fP,
+.B "  PCRE2_SIZE \fIlength\fP, PCRE2_SIZE \fIstartoffset\fP,"
+.B "  uint32_t \fIoptions\fP, pcre2_match_data *\fImatch_data\fP,"
+.B "  pcre2_match_context *\fImcontext\fP);"
+.fi
+.
+.SH DESCRIPTION
+.rs
+.sp
+This function matches a compiled regular expression that has been successfully
+processed by the JIT compiler against a given subject string, using a matching
+algorithm that is similar to Perl's. It is a "fast path" interface to JIT, and
+it bypasses some of the sanity checks that \fBpcre2_match()\fP applies.
+Its arguments are exactly the same as for
+.\" HREF
+\fBpcre2_match()\fP.
+.\"
+.P
+The supported options are PCRE2_NOTBOL, PCRE2_NOTEOL, PCRE2_NOTEMPTY,
+PCRE2_NOTEMPTY_ATSTART, PCRE2_PARTIAL_HARD, and PCRE2_PARTIAL_SOFT. Unsupported
+options are ignored. The subject string is not checked for UTF validity.
+.P
+The return values are the same as for \fBpcre2_match()\fP plus
+PCRE2_ERROR_JIT_BADOPTION if a matching mode (partial or complete) is requested
+that was not compiled. For details of partial matching, see the
+.\" HREF
+\fBpcre2partial\fP
+.\"
+page.
+.P
+There is a complete description of the PCRE2 native API in the
+.\" HREF
+\fBpcre2api\fP
+.\"
+page and a description of the JIT API in the
+.\" HREF
+\fBpcre2jit\fP
+.\"
+page.
diff --git a/dist2/doc/pcre2_jit_stack_assign.3 b/dist2/doc/pcre2_jit_stack_assign.3
new file mode 100644
index 0000000..66b8095
--- /dev/null
+++ b/dist2/doc/pcre2_jit_stack_assign.3
@@ -0,0 +1,55 @@
+.TH PCRE2_JIT_STACK_ASSIGN 3 "08 November 2014" "PCRE2 10.0"
+.SH NAME
+PCRE2 - Perl-compatible regular expressions (revised API)
+.SH SYNOPSIS
+.rs
+.sp
+.B #include <pcre2.h>
+.PP
+.nf
+.B void pcre2_jit_stack_assign(pcre2_match_context *\fImcontext\fP,
+.B "  pcre2_jit_callback \fIcallback_function\fP, void *\fIcallback_data\fP);"
+.fi
+.
+.SH DESCRIPTION
+.rs
+.sp
+This function provides control over the memory used by JIT as a run-time stack
+when \fBpcre2_match()\fP or \fBpcre2_jit_match()\fP is called with a pattern
+that has been successfully processed by the JIT compiler. The information that
+determines which stack is used is put into a match context that is subsequently
+passed to a matching function. The arguments of this function are:
+.sp
+  mcontext       a pointer to a match context
+  callback       a callback function
+  callback_data  a JIT stack or a value to be passed to the callback
+.P
+If \fIcallback\fP is NULL and \fIcallback_data\fP is NULL, an internal 32K
+block on the machine stack is used.
+.P
+If \fIcallback\fP is NULL and \fIcallback_data\fP is not NULL,
+\fIcallback_data\fP must be a valid JIT stack, the result of calling
+\fBpcre2_jit_stack_create()\fP.
+.P
+If \fIcallback\fP not NULL, it is called with \fIcallback_data\fP as an
+argument at the start of matching, in order to set up a JIT stack. If the
+result is NULL, the internal 32K stack is used; otherwise the return value must
+be a valid JIT stack, the result of calling \fBpcre2_jit_stack_create()\fP.
+.P
+You may safely use the same JIT stack for multiple patterns, as long as they
+are all matched in the same thread. In a multithread application, each thread
+must use its own JIT stack. For more details, see the
+.\" HREF
+\fBpcre2jit\fP
+.\"
+page.
+.P
+There is a complete description of the PCRE2 native API in the
+.\" HREF
+\fBpcre2api\fP
+.\"
+page and a description of the POSIX API in the
+.\" HREF
+\fBpcre2posix\fP
+.\"
+page.
diff --git a/dist2/doc/pcre2_jit_stack_create.3 b/dist2/doc/pcre2_jit_stack_create.3
new file mode 100644
index 0000000..d530d50
--- /dev/null
+++ b/dist2/doc/pcre2_jit_stack_create.3
@@ -0,0 +1,40 @@
+.TH PCRE2_JIT_STACK_CREATE 3 "03 November 2014" "PCRE2 10.00"
+.SH NAME
+PCRE2 - Perl-compatible regular expressions (revised API)
+.SH SYNOPSIS
+.rs
+.sp
+.B #include <pcre2.h>
+.PP
+.nf
+.B pcre2_jit_stack *pcre2_jit_stack_create(PCRE2_SIZE \fIstartsize\fP,
+.B "  PCRE2_SIZE \fImaxsize\fP, pcre2_general_context *\fIgcontext\fP);"
+.fi
+.
+.SH DESCRIPTION
+.rs
+.sp
+This function is used to create a stack for use by the code compiled by the JIT
+compiler. The first two arguments are a starting size for the stack, and a
+maximum size to which it is allowed to grow. The final argument is a general
+context, for memory allocation functions, or NULL for standard memory
+allocation. The result can be passed to the JIT run-time code by calling
+\fBpcre2_jit_stack_assign()\fP to associate the stack with a compiled pattern,
+which can then be processed by \fBpcre2_match()\fP. If the "fast path" JIT
+matcher, \fBpcre2_jit_match()\fP is used, the stack can be passed directly as
+an argument. A maximum stack size of 512K to 1M should be more than enough for
+any pattern. For more details, see the
+.\" HREF
+\fBpcre2jit\fP
+.\"
+page.
+.P
+There is a complete description of the PCRE2 native API in the
+.\" HREF
+\fBpcre2api\fP
+.\"
+page and a description of the POSIX API in the
+.\" HREF
+\fBpcre2posix\fP
+.\"
+page.
diff --git a/dist2/doc/pcre2_jit_stack_free.3 b/dist2/doc/pcre2_jit_stack_free.3
new file mode 100644
index 0000000..bfa4f79
--- /dev/null
+++ b/dist2/doc/pcre2_jit_stack_free.3
@@ -0,0 +1,31 @@
+.TH PCRE2_JIT_STACK_FREE 3 "21 October 2014" "PCRE2 10.00"
+.SH NAME
+PCRE2 - Perl-compatible regular expressions (revised API)
+.SH SYNOPSIS
+.rs
+.sp
+.B #include <pcre2.h>
+.PP
+.SM
+.B void pcre2_jit_stack_free(pcre2_jit_stack *\fIjit_stack\fP);
+.
+.SH DESCRIPTION
+.rs
+.sp
+This function is used to free a JIT stack that was created by
+\fBpcre2_jit_stack_create()\fP when it is no longer needed. For more details,
+see the
+.\" HREF
+\fBpcre2jit\fP
+.\"
+page.
+.P
+There is a complete description of the PCRE2 native API in the
+.\" HREF
+\fBpcre2api\fP
+.\"
+page and a description of the POSIX API in the
+.\" HREF
+\fBpcre2posix\fP
+.\"
+page.
diff --git a/dist2/doc/pcre2_maketables.3 b/dist2/doc/pcre2_maketables.3
new file mode 100644
index 0000000..322dba7
--- /dev/null
+++ b/dist2/doc/pcre2_maketables.3
@@ -0,0 +1,36 @@
+.TH PCRE2_MAKETABLES 3 "21 October 2014" "PCRE2 10.00"
+.SH NAME
+PCRE2 - Perl-compatible regular expressions (revised API)
+.SH SYNOPSIS
+.rs
+.sp
+.B #include <pcre2.h>
+.PP
+.SM
+.B const unsigned char *pcre2_maketables(pcre22_general_context *\fIgcontext\fP);
+.
+.SH DESCRIPTION
+.rs
+.sp
+This function builds a set of character tables for character values less than
+256. These can be passed to \fBpcre2_compile()\fP in a compile context in order
+to override the internal, built-in tables (which were either defaulted or made
+by \fBpcre2_maketables()\fP when PCRE2 was compiled). See the
+.\" HREF
+\fBpcre2_set_character_tables()\fP
+.\"
+page. You might want to do this if you are using a non-standard locale.
+.P
+If the argument is NULL, \fBmalloc()\fP is used to get memory for the tables.
+Otherwise it must point to a general context, which can supply pointers to a
+custom memory manager. The function yields a pointer to the tables.
+.P
+There is a complete description of the PCRE2 native API in the
+.\" HREF
+\fBpcre2api\fP
+.\"
+page and a description of the POSIX API in the
+.\" HREF
+\fBpcre2posix\fP
+.\"
+page.
diff --git a/dist2/doc/pcre2_match.3 b/dist2/doc/pcre2_match.3
new file mode 100644
index 0000000..f25cace
--- /dev/null
+++ b/dist2/doc/pcre2_match.3
@@ -0,0 +1,67 @@
+.TH PCRE2_MATCH 3 "21 October 2014" "PCRE2 10.00"
+.SH NAME
+PCRE2 - Perl-compatible regular expressions (revised API)
+.SH SYNOPSIS
+.rs
+.sp
+.B #include <pcre2.h>
+.PP
+.nf
+.B int pcre2_match(const pcre2_code *\fIcode\fP, PCRE2_SPTR \fIsubject\fP,
+.B "  PCRE2_SIZE \fIlength\fP, PCRE2_SIZE \fIstartoffset\fP,"
+.B "  uint32_t \fIoptions\fP, pcre2_match_data *\fImatch_data\fP,"
+.B "  pcre2_match_context *\fImcontext\fP);"
+.fi
+.
+.SH DESCRIPTION
+.rs
+.sp
+This function matches a compiled regular expression against a given subject
+string, using a matching algorithm that is similar to Perl's. It returns
+offsets to captured substrings. Its arguments are:
+.sp
+  \fIcode\fP         Points to the compiled pattern
+  \fIsubject\fP      Points to the subject string
+  \fIlength\fP       Length of the subject string
+  \fIstartoffset\fP  Offset in the subject at which to start matching
+  \fIoptions\fP      Option bits
+  \fImatch_data\fP   Points to a match data block, for results
+  \fImcontext\fP     Points to a match context, or is NULL
+.sp
+A match context is needed only if you want to:
+.sp
+  Set up a callout function
+  Change the limit for calling the internal function \fImatch()\fP
+  Change the limit for calling \fImatch()\fP recursively
+  Set custom memory management when the heap is used for recursion
+.sp
+The \fIlength\fP and \fIstartoffset\fP values are code
+units, not characters. The options are:
+.sp
+  PCRE2_ANCHORED          Match only at the first position
+  PCRE2_NOTBOL            Subject string is not the beginning of a line
+  PCRE2_NOTEOL            Subject string is not the end of a line
+  PCRE2_NOTEMPTY          An empty string is not a valid match
+  PCRE2_NOTEMPTY_ATSTART  An empty string at the start of the subject
+                           is not a valid match
+  PCRE2_NO_UTF_CHECK      Do not check the subject for UTF
+                           validity (only relevant if PCRE2_UTF
+                           was set at compile time)
+  PCRE2_PARTIAL_SOFT      Return PCRE2_ERROR_PARTIAL for a partial
+                            match if no full matches are found
+  PCRE2_PARTIAL_HARD      Return PCRE2_ERROR_PARTIAL for a partial match
+                           if that is found before a full match
+.sp
+For details of partial matching, see the
+.\" HREF
+\fBpcre2partial\fP
+.\"
+page. There is a complete description of the PCRE2 native API in the
+.\" HREF
+\fBpcre2api\fP
+.\"
+page and a description of the POSIX API in the
+.\" HREF
+\fBpcre2posix\fP
+.\"
+page.
diff --git a/dist2/doc/pcre2_match_context_copy.3 b/dist2/doc/pcre2_match_context_copy.3
new file mode 100644
index 0000000..26c33a6
--- /dev/null
+++ b/dist2/doc/pcre2_match_context_copy.3
@@ -0,0 +1,29 @@
+.TH PCRE2_MATCH_CONTEXT_COPY 3 "22 October 2014" "PCRE2 10.00"
+.SH NAME
+PCRE2 - Perl-compatible regular expressions (revised API)
+.SH SYNOPSIS
+.rs
+.sp
+.B #include <pcre2.h>
+.PP
+.nf
+.B pcre2_match_context *pcre2_match_context_copy(
+.B "  pcre2_match_context *\fImcontext\fP);"
+.fi
+.
+.SH DESCRIPTION
+.rs
+.sp
+This function makes a new copy of a match context, using the memory
+allocation function that was used for the original context. The result is NULL
+if the memory cannot be obtained.
+.P
+There is a complete description of the PCRE2 native API in the
+.\" HREF
+\fBpcre2api\fP
+.\"
+page and a description of the POSIX API in the
+.\" HREF
+\fBpcre2posix\fP
+.\"
+page.
diff --git a/dist2/doc/pcre2_match_context_create.3 b/dist2/doc/pcre2_match_context_create.3
new file mode 100644
index 0000000..d4a2665
--- /dev/null
+++ b/dist2/doc/pcre2_match_context_create.3
@@ -0,0 +1,30 @@
+.TH PCRE2_MATCH_CONTEXT_CREATE 3 "22 October 2014" "PCRE2 10.00"
+.SH NAME
+PCRE2 - Perl-compatible regular expressions (revised API)
+.SH SYNOPSIS
+.rs
+.sp
+.B #include <pcre2.h>
+.PP
+.nf
+.B pcre2_match_context *pcre2_match_context_create(
+.B "  pcre2_general_context *\fIgcontext\fP);"
+.fi
+.
+.SH DESCRIPTION
+.rs
+.sp
+This function creates and initializes a new match context. If its argument is
+NULL, \fBmalloc()\fP is used to get the necessary memory; otherwise the memory
+allocation function within the general context is used. The result is NULL if
+the memory could not be obtained.
+.P
+There is a complete description of the PCRE2 native API in the
+.\" HREF
+\fBpcre2api\fP
+.\"
+page and a description of the POSIX API in the
+.\" HREF
+\fBpcre2posix\fP
+.\"
+page.
diff --git a/dist2/doc/pcre2_match_context_free.3 b/dist2/doc/pcre2_match_context_free.3
new file mode 100644
index 0000000..71b9783
--- /dev/null
+++ b/dist2/doc/pcre2_match_context_free.3
@@ -0,0 +1,28 @@
+.TH PCRE2_MATCH_CONTEXT_FREE 3 "22 October 2014" "PCRE2 10.00"
+.SH NAME
+PCRE2 - Perl-compatible regular expressions (revised API)
+.SH SYNOPSIS
+.rs
+.sp
+.B #include <pcre2.h>
+.PP
+.nf
+.B void pcre2_match_context_free(pcre2_match_context *\fImcontext\fP);
+.fi
+.
+.SH DESCRIPTION
+.rs
+.sp
+This function frees the memory occupied by a match context, using the memory
+freeing function from the general context with which it was created, or
+\fBfree()\fP if that was not set.
+.P
+There is a complete description of the PCRE2 native API in the
+.\" HREF
+\fBpcre2api\fP
+.\"
+page and a description of the POSIX API in the
+.\" HREF
+\fBpcre2posix\fP
+.\"
+page.
diff --git a/dist2/doc/pcre2_match_data_create.3 b/dist2/doc/pcre2_match_data_create.3
new file mode 100644
index 0000000..3b0a29e
--- /dev/null
+++ b/dist2/doc/pcre2_match_data_create.3
@@ -0,0 +1,36 @@
+.TH PCRE2_MATCH_DATA_CREATE 3 "29 July 2015" "PCRE2 10.21"
+.SH NAME
+PCRE2 - Perl-compatible regular expressions (revised API)
+.SH SYNOPSIS
+.rs
+.sp
+.B #include <pcre2.h>
+.PP
+.nf
+.B pcre2_match_data *pcre2_match_data_create(uint32_t \fIovecsize\fP,
+.B "  pcre2_general_context *\fIgcontext\fP);"
+.fi
+.
+.SH DESCRIPTION
+.rs
+.sp
+This function creates a new match data block, which is used for holding the
+result of a match. The first argument specifies the number of pairs of offsets
+that are required. These form the "output vector" (ovector) within the match
+data block, and are used to identify the matched string and any captured
+substrings. There is always one pair of offsets; if \fBovecsize\fP is zero, it
+is treated as one.
+.P
+The second argument points to a general context, for custom memory management,
+or is NULL for system memory management. The result of the function is NULL if
+the memory for the block could not be obtained.
+.P
+There is a complete description of the PCRE2 native API in the
+.\" HREF
+\fBpcre2api\fP
+.\"
+page and a description of the POSIX API in the
+.\" HREF
+\fBpcre2posix\fP
+.\"
+page.
diff --git a/dist2/doc/pcre2_match_data_create_from_pattern.3 b/dist2/doc/pcre2_match_data_create_from_pattern.3
new file mode 100644
index 0000000..60bf77c
--- /dev/null
+++ b/dist2/doc/pcre2_match_data_create_from_pattern.3
@@ -0,0 +1,37 @@
+.TH PCRE2_MATCH_DATA_CREATE_FROM_PATTERN 3 "29 July 2015" "PCRE2 10.21"
+.SH NAME
+PCRE2 - Perl-compatible regular expressions (revised API)
+.SH SYNOPSIS
+.rs
+.sp
+.B #include <pcre2.h>
+.PP
+.nf
+.B pcre2_match_data *pcre2_match_data_create_from_pattern(
+.B "  const pcre2_code *\fIcode\fP, pcre2_general_context *\fIgcontext\fP);"
+.fi
+.
+.SH DESCRIPTION
+.rs
+.sp
+This function creates a new match data block, which is used for holding the
+result of a match. The first argument points to a compiled pattern. The number
+of capturing parentheses within the pattern is used to compute the number of
+pairs of offsets that are required in the match data block. These form the
+"output vector" (ovector) within the match data block, and are used to identify
+the matched string and any captured substrings.
+.P
+The second argument points to a general context, for custom memory management,
+or is NULL to use the same memory allocator as was used for the compiled
+pattern. The result of the function is NULL if the memory for the block could
+not be obtained.
+.P
+There is a complete description of the PCRE2 native API in the
+.\" HREF
+\fBpcre2api\fP
+.\"
+page and a description of the POSIX API in the
+.\" HREF
+\fBpcre2posix\fP
+.\"
+page.
diff --git a/dist2/doc/pcre2_match_data_free.3 b/dist2/doc/pcre2_match_data_free.3
new file mode 100644
index 0000000..5e4bc62
--- /dev/null
+++ b/dist2/doc/pcre2_match_data_free.3
@@ -0,0 +1,28 @@
+.TH PCRE2_MATCH_DATA_FREE 3 "24 October 2014" "PCRE2 10.00"
+.SH NAME
+PCRE2 - Perl-compatible regular expressions (revised API)
+.SH SYNOPSIS
+.rs
+.sp
+.B #include <pcre2.h>
+.PP
+.nf
+.B void pcre2_match_data_free(pcre2_match_data *\fImatch_data\fP);
+.fi
+.
+.SH DESCRIPTION
+.rs
+.sp
+This function frees the memory occupied by a match data block, using the memory
+freeing function from the general context with which it was created, or
+\fBfree()\fP if that was not set.
+.P
+There is a complete description of the PCRE2 native API in the
+.\" HREF
+\fBpcre2api\fP
+.\"
+page and a description of the POSIX API in the
+.\" HREF
+\fBpcre2posix\fP
+.\"
+page.
diff --git a/dist2/doc/pcre2_pattern_info.3 b/dist2/doc/pcre2_pattern_info.3
new file mode 100644
index 0000000..575840b
--- /dev/null
+++ b/dist2/doc/pcre2_pattern_info.3
@@ -0,0 +1,94 @@
+.TH PCRE2_PATTERN_INFO 3 "21 November 2015" "PCRE2 10.21"
+.SH NAME
+PCRE2 - Perl-compatible regular expressions (revised API)
+.SH SYNOPSIS
+.rs
+.sp
+.B #include <pcre2.h>
+.PP
+.nf
+.B int pcre2_pattern_info(const pcre2 *\fIcode\fP, uint32_t \fIwhat\fP, void *\fIwhere\fP);
+.fi
+.
+.SH DESCRIPTION
+.rs
+.sp
+This function returns information about a compiled pattern. Its arguments are:
+.sp
+  \fIcode\fP     Pointer to a compiled regular expression
+  \fIwhat\fP     What information is required
+  \fIwhere\fP    Where to put the information
+.sp
+The recognized values for the \fIwhat\fP argument, and the information they
+request are as follows:
+.sp
+  PCRE2_INFO_ALLOPTIONS      Final options after compiling
+  PCRE2_INFO_ARGOPTIONS      Options passed to \fBpcre2_compile()\fP
+  PCRE2_INFO_BACKREFMAX      Number of highest back reference
+  PCRE2_INFO_BSR             What \eR matches:
+                               PCRE2_BSR_UNICODE: Unicode line endings
+                               PCRE2_BSR_ANYCRLF: CR, LF, or CRLF only
+  PCRE2_INFO_CAPTURECOUNT    Number of capturing subpatterns
+  PCRE2_INFO_FIRSTBITMAP     Bitmap of first code units, or NULL
+  PCRE2_INFO_FIRSTCODETYPE   Type of start-of-match information
+                               0 nothing set
+                               1 first code unit is set
+                               2 start of string or after newline
+  PCRE2_INFO_FIRSTCODEUNIT   First code unit when type is 1
+  PCRE2_INFO_HASBACKSLASHC   Return 1 if pattern contains \eC
+  PCRE2_INFO_HASCRORLF       Return 1 if explicit CR or LF matches
+                               exist in the pattern
+  PCRE2_INFO_JCHANGED        Return 1 if (?J) or (?-J) was used
+  PCRE2_INFO_JITSIZE         Size of JIT compiled code, or 0
+  PCRE2_INFO_LASTCODETYPE    Type of must-be-present information
+                               0 nothing set
+                               1 code unit is set
+  PCRE2_INFO_LASTCODEUNIT    Last code unit when type is 1
+  PCRE2_INFO_MATCHEMPTY      1 if the pattern can match an
+                               empty string, 0 otherwise
+  PCRE2_INFO_MATCHLIMIT      Match limit if set,
+                               otherwise PCRE2_ERROR_UNSET
+  PCRE2_INFO_MAXLOOKBEHIND   Length (in characters) of the longest
+                               lookbehind assertion
+  PCRE2_INFO_MINLENGTH       Lower bound length of matching strings
+  PCRE2_INFO_NAMECOUNT       Number of named subpatterns
+  PCRE2_INFO_NAMEENTRYSIZE   Size of name table entries
+  PCRE2_INFO_NAMETABLE       Pointer to name table
+  PCRE2_CONFIG_NEWLINE       Code for the newline sequence:
+                               PCRE2_NEWLINE_CR
+                               PCRE2_NEWLINE_LF
+                               PCRE2_NEWLINE_CRLF
+                               PCRE2_NEWLINE_ANY
+                               PCRE2_NEWLINE_ANYCRLF
+  PCRE2_INFO_RECURSIONLIMIT  Recursion limit if set,
+                               otherwise PCRE2_ERROR_UNSET
+  PCRE2_INFO_SIZE            Size of compiled pattern
+.sp
+If \fIwhere\fP is NULL, the function returns the amount of memory needed for
+the requested information, in bytes. Otherwise, the \fIwhere\fP argument must
+point to an unsigned 32-bit integer (uint32_t variable), except for the
+following \fIwhat\fP values, when it must point to a variable of the type
+shown:
+.sp
+  PCRE2_INFO_FIRSTBITMAP     const uint8_t *
+  PCRE2_INFO_JITSIZE         size_t
+  PCRE2_INFO_NAMETABLE       PCRE2_SPTR
+  PCRE2_INFO_SIZE            size_t
+.sp
+The yield of the function is zero on success or:
+.sp
+  PCRE2_ERROR_NULL           the argument \fIcode\fP is NULL
+  PCRE2_ERROR_BADMAGIC       the "magic number" was not found
+  PCRE2_ERROR_BADOPTION      the value of \fIwhat\fP is invalid
+  PCRE2_ERROR_BADMODE        the pattern was compiled in the wrong mode
+  PCRE2_ERROR_UNSET          the requested information is not set
+.P
+There is a complete description of the PCRE2 native API in the
+.\" HREF
+\fBpcre2api\fP
+.\"
+page and a description of the POSIX API in the
+.\" HREF
+\fBpcre2posix\fP
+.\"
+page.
diff --git a/dist2/doc/pcre2_serialize_decode.3 b/dist2/doc/pcre2_serialize_decode.3
new file mode 100644
index 0000000..57304a5
--- /dev/null
+++ b/dist2/doc/pcre2_serialize_decode.3
@@ -0,0 +1,50 @@
+.TH PCRE2_SERIALIZE_DECODE 3 "02 September 2015" "PCRE2 10.21"
+.SH NAME
+PCRE2 - Perl-compatible regular expressions (revised API)
+.SH SYNOPSIS
+.rs
+.sp
+.B #include <pcre2.h>
+.PP
+.nf
+.B int32_t pcre2_serialize_decode(pcre2_code **\fIcodes\fP,
+.B "  int32_t \fInumber_of_codes\fP, const uint8_t *\fIbytes\fP,"
+.B "  pcre2_general_context *\fIgcontext\fP);"
+.fi
+.
+.SH DESCRIPTION
+.rs
+.sp
+This function decodes a serialized set of compiled patterns back into a list of
+individual patterns. Its arguments are:
+.sp
+  \fIcodes\fP            pointer to a vector in which to build the list
+  \fInumber_of_codes\fP  number of slots in the vector
+  \fIbytes\fP            the serialized byte stream
+  \fIgcontext\fP         pointer to a general context or NULL
+.sp
+The \fIbytes\fP argument must point to a block of data that was originally
+created by \fBpcre2_serialize_encode()\fP, though it may have been saved on
+disc or elsewhere in the meantime. If there are more codes in the serialized
+data than slots in the list, only those compiled patterns that will fit are
+decoded. The yield of the function is the number of decoded patterns, or one of
+the following negative error codes:
+.sp
+  PCRE2_ERROR_BADDATA   \fInumber_of_codes\fP is zero or less
+  PCRE2_ERROR_BADMAGIC  mismatch of id bytes in \fIbytes\fP
+  PCRE2_ERROR_BADMODE   mismatch of variable unit size or PCRE version
+  PCRE2_ERROR_MEMORY    memory allocation failed
+  PCRE2_ERROR_NULL      \fIcodes\fP or \fIbytes\fP is NULL
+.sp
+PCRE2_ERROR_BADMAGIC may mean that the data is corrupt, or that it was compiled
+on a system with different endianness.
+.P
+There is a complete description of the PCRE2 native API in the
+.\" HREF
+\fBpcre2api\fP
+.\"
+page and a description of the POSIX API in the
+.\" HREF
+\fBpcre2posix\fP
+.\"
+page.
diff --git a/dist2/doc/pcre2_serialize_encode.3 b/dist2/doc/pcre2_serialize_encode.3
new file mode 100644
index 0000000..9c29633
--- /dev/null
+++ b/dist2/doc/pcre2_serialize_encode.3
@@ -0,0 +1,49 @@
+.TH PCRE2_SERIALIZE_ENCODE 3 "02 September 2015" "PCRE2 10.21"
+.SH NAME
+PCRE2 - Perl-compatible regular expressions (revised API)
+.SH SYNOPSIS
+.rs
+.sp
+.B #include <pcre2.h>
+.PP
+.nf
+.B int32_t pcre2_serialize_encode(const pcre2_code **\fIcodes\fP,
+.B "  int32_t \fInumber_of_codes\fP, uint8_t **\fIserialized_bytes\fP,"
+.B "  PCRE2_SIZE *\fIserialized_size\fP, pcre2_general_context *\fIgcontext\fP);"
+.fi
+.
+.SH DESCRIPTION
+.rs
+.sp
+This function encodes a list of compiled patterns into a byte stream that can
+be saved on disc or elsewhere. Its arguments are:
+.sp
+  \fIcodes\fP             pointer to a vector containing the list
+  \fInumber_of_codes\fP   number of slots in the vector
+  \fIserialized_bytes\fP  set to point to the serialized byte stream
+  \fIserialized_size\fP   set to the number of bytes in the byte stream
+  \fIgcontext\fP          pointer to a general context or NULL
+.sp
+The context argument is used to obtain memory for the byte stream. When the
+serialized data is no longer needed, it must be freed by calling
+\fBpcre2_serialize_free()\fP. The yield of the function is the number of
+serialized patterns, or one of the following negative error codes:
+.sp
+  PCRE2_ERROR_BADDATA      \fInumber_of_codes\fP is zero or less
+  PCRE2_ERROR_BADMAGIC     mismatch of id bytes in one of the patterns
+  PCRE2_ERROR_MEMORY       memory allocation failed
+  PCRE2_ERROR_MIXEDTABLES  the patterns do not all use the same tables
+  PCRE2_ERROR_NULL         an argument other than \fIgcontext\fP is NULL
+.sp
+PCRE2_ERROR_BADMAGIC means either that a pattern's code has been corrupted, or
+that a slot in the vector does not point to a compiled pattern.
+.P
+There is a complete description of the PCRE2 native API in the
+.\" HREF
+\fBpcre2api\fP
+.\"
+page and a description of the POSIX API in the
+.\" HREF
+\fBpcre2posix\fP
+.\"
+page.
diff --git a/dist2/doc/pcre2_serialize_free.3 b/dist2/doc/pcre2_serialize_free.3
new file mode 100644
index 0000000..9daa94b
--- /dev/null
+++ b/dist2/doc/pcre2_serialize_free.3
@@ -0,0 +1,28 @@
+.TH PCRE2_SERIALIZE_FREE 3 "19 January 2015" "PCRE2 10.10"
+.SH NAME
+PCRE2 - Perl-compatible regular expressions (revised API)
+.SH SYNOPSIS
+.rs
+.sp
+.B #include <pcre2.h>
+.PP
+.nf
+.B void pcre2_serialize_free(uint8_t *\fIbytes\fP);
+.fi
+.
+.SH DESCRIPTION
+.rs
+.sp
+This function frees the memory that was obtained by
+\fBpcre2_serialize_encode()\fP to hold a serialized byte stream. The argument
+must point to such a byte stream.
+.P
+There is a complete description of the PCRE2 native API in the
+.\" HREF
+\fBpcre2api\fP
+.\"
+page and a description of the POSIX API in the
+.\" HREF
+\fBpcre2posix\fP
+.\"
+page.
diff --git a/dist2/doc/pcre2_serialize_get_number_of_codes.3 b/dist2/doc/pcre2_serialize_get_number_of_codes.3
new file mode 100644
index 0000000..d8ce6a1
--- /dev/null
+++ b/dist2/doc/pcre2_serialize_get_number_of_codes.3
@@ -0,0 +1,37 @@
+.TH PCRE2_SERIALIZE_GET_NUMBER_OF_CODES 3 "19 January 2015" "PCRE2 10.10"
+.SH NAME
+PCRE2 - Perl-compatible regular expressions (revised API)
+.SH SYNOPSIS
+.rs
+.sp
+.B #include <pcre2.h>
+.PP
+.nf
+.B int32_t pcre2_serialize_get_number_of_codes(const uint8_t *\fIbytes\fP);
+.fi
+.
+.SH DESCRIPTION
+.rs
+.sp
+The \fIbytes\fP argument must point to a serialized byte stream that was
+originally created by \fBpcre2_serialize_encode()\fP (though it may have been
+saved on disc or elsewhere in the meantime). The function returns the number of
+serialized patterns in the byte stream, or one of the following negative error
+codes:
+.sp
+  PCRE2_ERROR_BADMAGIC  mismatch of id bytes in \fIbytes\fP
+  PCRE2_ERROR_BADMODE   mismatch of variable unit size or PCRE version
+  PCRE2_ERROR_NULL      the argument is NULL
+.sp
+PCRE2_ERROR_BADMAGIC may mean that the data is corrupt, or that it was compiled
+on a system with different endianness.
+.P
+There is a complete description of the PCRE2 native API in the
+.\" HREF
+\fBpcre2api\fP
+.\"
+page and a description of the POSIX API in the
+.\" HREF
+\fBpcre2posix\fP
+.\"
+page.
diff --git a/dist2/doc/pcre2_set_bsr.3 b/dist2/doc/pcre2_set_bsr.3
new file mode 100644
index 0000000..ecf2437
--- /dev/null
+++ b/dist2/doc/pcre2_set_bsr.3
@@ -0,0 +1,30 @@
+.TH PCRE2_SET_BSR 3 "22 October 2014" "PCRE2 10.00"
+.SH NAME
+PCRE2 - Perl-compatible regular expressions (revised API)
+.SH SYNOPSIS
+.rs
+.sp
+.B #include <pcre2.h>
+.PP
+.nf
+.B int pcre2_set_bsr(pcre2_compile_context *\fIccontext\fP,
+.B "  uint32_t \fIvalue\fP);"
+.fi
+.
+.SH DESCRIPTION
+.rs
+.sp
+This function sets the convention for processing \eR within a compile context.
+The second argument must be one of PCRE2_BSR_ANYCRLF or PCRE2_BSR_UNICODE. The
+result is zero for success or PCRE2_ERROR_BADDATA if the second argument is
+invalid.
+.P
+There is a complete description of the PCRE2 native API in the
+.\" HREF
+\fBpcre2api\fP
+.\"
+page and a description of the POSIX API in the
+.\" HREF
+\fBpcre2posix\fP
+.\"
+page.
diff --git a/dist2/doc/pcre2_set_callout.3 b/dist2/doc/pcre2_set_callout.3
new file mode 100644
index 0000000..2f86f69
--- /dev/null
+++ b/dist2/doc/pcre2_set_callout.3
@@ -0,0 +1,31 @@
+.TH PCRE2_SET_CALLOUT 3 "24 October 2014" "PCRE2 10.00"
+.SH NAME
+PCRE2 - Perl-compatible regular expressions (revised API)
+.SH SYNOPSIS
+.rs
+.sp
+.B #include <pcre2.h>
+.PP
+.nf
+.B int pcre2_set_callout(pcre2_match_context *\fImcontext\fP,
+.B "  int (*\fIcallout_function\fP)(pcre2_callout_block *),"
+.B "  void *\fIcallout_data\fP);"
+.fi
+.
+.SH DESCRIPTION
+.rs
+.sp
+This function sets the callout fields in a match context (the first argument).
+The second argument specifies a callout function, and the third argument is an
+opaque data time that is passed to it. The result of this function is always
+zero.
+.P
+There is a complete description of the PCRE2 native API in the
+.\" HREF
+\fBpcre2api\fP
+.\"
+page and a description of the POSIX API in the
+.\" HREF
+\fBpcre2posix\fP
+.\"
+page.
diff --git a/dist2/doc/pcre2_set_character_tables.3 b/dist2/doc/pcre2_set_character_tables.3
new file mode 100644
index 0000000..1ede4f9
--- /dev/null
+++ b/dist2/doc/pcre2_set_character_tables.3
@@ -0,0 +1,30 @@
+.TH PCRE2_SET_CHARACTER_TABLES 3 "22 October 2014" "PCRE2 10.00"
+.SH NAME
+PCRE2 - Perl-compatible regular expressions (revised API)
+.SH SYNOPSIS
+.rs
+.sp
+.B #include <pcre2.h>
+.PP
+.nf
+.B int pcre2_set_character_tables(pcre2_compile_context *\fIccontext\fP,
+.B "  const unsigned char *\fItables\fP);"
+.fi
+.
+.SH DESCRIPTION
+.rs
+.sp
+This function sets a pointer to custom character tables within a compile
+context. The second argument must be the result of a call to
+\fBpcre2_maketables()\fP or NULL to request the default tables. The result is
+always zero.
+.P
+There is a complete description of the PCRE2 native API in the
+.\" HREF
+\fBpcre2api\fP
+.\"
+page and a description of the POSIX API in the
+.\" HREF
+\fBpcre2posix\fP
+.\"
+page.
diff --git a/dist2/doc/pcre2_set_compile_recursion_guard.3 b/dist2/doc/pcre2_set_compile_recursion_guard.3
new file mode 100644
index 0000000..0575f94
--- /dev/null
+++ b/dist2/doc/pcre2_set_compile_recursion_guard.3
@@ -0,0 +1,34 @@
+.TH PCRE2_SET_COMPILE_RECURSION_GUARD 3 "22 October 2014" "PCRE2 10.00"
+.SH NAME
+PCRE2 - Perl-compatible regular expressions (revised API)
+.SH SYNOPSIS
+.rs
+.sp
+.B #include <pcre2.h>
+.PP
+.nf
+.B int pcre2_set_compile_recursion_guard(pcre2_compile_context *\fIccontext\fP,
+.B "  int (*\fIguard_function\fP)(uint32_t, void *), void *\fIuser_data\fP);"
+.fi
+.
+.SH DESCRIPTION
+.rs
+.sp
+This function defines, within a compile context, a function that is called
+whenever \fBpcre2_compile()\fP starts to compile a parenthesized part of a
+pattern. The first argument to the function gives the current depth of
+parenthesis nesting, and the second is user data that is supplied when the
+function is set up. The callout function should return zero if all is well, or
+non-zero to force an error. This feature is provided so that applications can
+check the available system stack space, in order to avoid running out. The
+result of \fBpcre2_set_compile_recursion_guard()\fP is always zero.
+.P
+There is a complete description of the PCRE2 native API in the
+.\" HREF
+\fBpcre2api\fP
+.\"
+page and a description of the POSIX API in the
+.\" HREF
+\fBpcre2posix\fP
+.\"
+page.
diff --git a/dist2/doc/pcre2_set_match_limit.3 b/dist2/doc/pcre2_set_match_limit.3
new file mode 100644
index 0000000..523e97f
--- /dev/null
+++ b/dist2/doc/pcre2_set_match_limit.3
@@ -0,0 +1,28 @@
+.TH PCRE2_SET_MATCH_LIMIT 3 "24 October 2014" "PCRE2 10.00"
+.SH NAME
+PCRE2 - Perl-compatible regular expressions (revised API)
+.SH SYNOPSIS
+.rs
+.sp
+.B #include <pcre2.h>
+.PP
+.nf
+.B int pcre2_set_match_limit(pcre2_match_context *\fImcontext\fP,
+.B "  uint32_t \fIvalue\fP);"
+.fi
+.
+.SH DESCRIPTION
+.rs
+.sp
+This function sets the match limit field in a match context. The result is
+always zero.
+.P
+There is a complete description of the PCRE2 native API in the
+.\" HREF
+\fBpcre2api\fP
+.\"
+page and a description of the POSIX API in the
+.\" HREF
+\fBpcre2posix\fP
+.\"
+page.
diff --git a/dist2/doc/pcre2_set_newline.3 b/dist2/doc/pcre2_set_newline.3
new file mode 100644
index 0000000..8237500
--- /dev/null
+++ b/dist2/doc/pcre2_set_newline.3
@@ -0,0 +1,38 @@
+.TH PCRE2_SET_NEWLINE 3 "22 October 2014" "PCRE2 10.00"
+.SH NAME
+PCRE2 - Perl-compatible regular expressions (revised API)
+.SH SYNOPSIS
+.rs
+.sp
+.B #include <pcre2.h>
+.PP
+.nf
+.B int pcre2_set_newline(pcre2_compile_context *\fIccontext\fP,
+.B "  uint32_t \fIvalue\fP);"
+.fi
+.
+.SH DESCRIPTION
+.rs
+.sp
+This function sets the newline convention within a compile context. This
+specifies which character(s) are recognized as newlines when compiling and
+matching patterns. The second argument must be one of:
+.sp
+  PCRE2_NEWLINE_CR        Carriage return only
+  PCRE2_NEWLINE_LF        Linefeed only
+  PCRE2_NEWLINE_CRLF      CR followed by LF only
+  PCRE2_NEWLINE_ANYCRLF   Any of the above
+  PCRE2_NEWLINE_ANY       Any Unicode newline sequence
+.sp
+The result is zero for success or PCRE2_ERROR_BADDATA if the second argument is
+invalid.
+.P
+There is a complete description of the PCRE2 native API in the
+.\" HREF
+\fBpcre2api\fP
+.\"
+page and a description of the POSIX API in the
+.\" HREF
+\fBpcre2posix\fP
+.\"
+page.
diff --git a/dist2/doc/pcre2_set_offset_limit.3 b/dist2/doc/pcre2_set_offset_limit.3
new file mode 100644
index 0000000..20fa104
--- /dev/null
+++ b/dist2/doc/pcre2_set_offset_limit.3
@@ -0,0 +1,28 @@
+.TH PCRE2_SET_OFFSET_LIMIT 3 "22 September 2015" "PCRE2 10.21"
+.SH NAME
+PCRE2 - Perl-compatible regular expressions (revised API)
+.SH SYNOPSIS
+.rs
+.sp
+.B #include <pcre2.h>
+.PP
+.nf
+.B int pcre2_set_offset_limit(pcre2_match_context *\fImcontext\fP,
+.B "  PCRE2_SIZE \fIvalue\fP);"
+.fi
+.
+.SH DESCRIPTION
+.rs
+.sp
+This function sets the offset limit field in a match context. The result is
+always zero.
+.P
+There is a complete description of the PCRE2 native API in the
+.\" HREF
+\fBpcre2api\fP
+.\"
+page and a description of the POSIX API in the
+.\" HREF
+\fBpcre2posix\fP
+.\"
+page.
diff --git a/dist2/doc/pcre2_set_parens_nest_limit.3 b/dist2/doc/pcre2_set_parens_nest_limit.3
new file mode 100644
index 0000000..0367619
--- /dev/null
+++ b/dist2/doc/pcre2_set_parens_nest_limit.3
@@ -0,0 +1,28 @@
+.TH PCRE2_SET_PARENS_NEST_LIMIT 3 "22 October 2014" "PCRE2 10.00"
+.SH NAME
+PCRE2 - Perl-compatible regular expressions (revised API)
+.SH SYNOPSIS
+.rs
+.sp
+.B #include <pcre2.h>
+.PP
+.nf
+.B int pcre2_set_parens_nest_limit(pcre2_compile_context *\fIccontext\fP,
+.B "  uint32_t \fIvalue\fP);"
+.fi
+.
+.SH DESCRIPTION
+.rs
+.sp
+This function sets, in a compile context, the maximum depth of nested
+parentheses in a pattern. The result is always zero.
+.P
+There is a complete description of the PCRE2 native API in the
+.\" HREF
+\fBpcre2api\fP
+.\"
+page and a description of the POSIX API in the
+.\" HREF
+\fBpcre2posix\fP
+.\"
+page.
diff --git a/dist2/doc/pcre2_set_recursion_limit.3 b/dist2/doc/pcre2_set_recursion_limit.3
new file mode 100644
index 0000000..ab1f3cd
--- /dev/null
+++ b/dist2/doc/pcre2_set_recursion_limit.3
@@ -0,0 +1,28 @@
+.TH PCRE2_SET_RECURSION_LIMIT 3 "24 October 2014" "PCRE2 10.00"
+.SH NAME
+PCRE2 - Perl-compatible regular expressions (revised API)
+.SH SYNOPSIS
+.rs
+.sp
+.B #include <pcre2.h>
+.PP
+.nf
+.B int pcre2_set_recursion_limit(pcre2_match_context *\fImcontext\fP,
+.B "  uint32_t \fIvalue\fP);"
+.fi
+.
+.SH DESCRIPTION
+.rs
+.sp
+This function sets the recursion limit field in a match context. The result is
+always zero.
+.P
+There is a complete description of the PCRE2 native API in the
+.\" HREF
+\fBpcre2api\fP
+.\"
+page and a description of the POSIX API in the
+.\" HREF
+\fBpcre2posix\fP
+.\"
+page.
diff --git a/dist2/doc/pcre2_set_recursion_memory_management.3 b/dist2/doc/pcre2_set_recursion_memory_management.3
new file mode 100644
index 0000000..9b5887a
--- /dev/null
+++ b/dist2/doc/pcre2_set_recursion_memory_management.3
@@ -0,0 +1,35 @@
+.TH PCRE2_SET_RECURSION_MEMORY_MANAGEMENT 3 "24 October 2014" "PCRE2 10.00"
+.SH NAME
+PCRE2 - Perl-compatible regular expressions (revised API)
+.SH SYNOPSIS
+.rs
+.sp
+.B #include <pcre2.h>
+.PP
+.nf
+.B int pcre2_set_recursion_memory_management(
+.B "  pcre2_match_context *\fImcontext\fP,"
+.B "  void *(*\fIprivate_malloc\fP)(PCRE2_SIZE, void *),"
+.B "  void (*\fIprivate_free\fP)(void *, void *), void *\fImemory_data\fP);"
+.fi
+.
+.SH DESCRIPTION
+.rs
+.sp
+This function sets the match context fields for custom memory management when
+PCRE2 is compiled to use the heap instead of the system stack for recursive
+function calls while matching. When PCRE2 is compiled to use the stack (the
+default) this function does nothing. The first argument is a match context, the
+second and third specify the memory allocation and freeing functions, and the
+final argument is an opaque value that is passed to them whenever they are
+called. The result of this function is always zero.
+.P
+There is a complete description of the PCRE2 native API in the
+.\" HREF
+\fBpcre2api\fP
+.\"
+page and a description of the POSIX API in the
+.\" HREF
+\fBpcre2posix\fP
+.\"
+page.
diff --git a/dist2/doc/pcre2_substitute.3 b/dist2/doc/pcre2_substitute.3
new file mode 100644
index 0000000..e69e0cc
--- /dev/null
+++ b/dist2/doc/pcre2_substitute.3
@@ -0,0 +1,78 @@
+.TH PCRE2_SUBSTITUTE 3 "12 December 2015" "PCRE2 10.21"
+.SH NAME
+PCRE2 - Perl-compatible regular expressions (revised API)
+.SH SYNOPSIS
+.rs
+.sp
+.B #include <pcre2.h>
+.PP
+.nf
+.B int pcre2_substitute(const pcre2_code *\fIcode\fP, PCRE2_SPTR \fIsubject\fP,
+.B "  PCRE2_SIZE \fIlength\fP, PCRE2_SIZE \fIstartoffset\fP,"
+.B "  uint32_t \fIoptions\fP, pcre2_match_data *\fImatch_data\fP,"
+.B "  pcre2_match_context *\fImcontext\fP, PCRE2_SPTR \fIreplacement\fP,"
+.B "  PCRE2_SIZE \fIrlength\fP, PCRE2_UCHAR *\fIoutputbuffer\fP,"
+.B "  PCRE2_SIZE *\fIoutlengthptr\fP);"
+.fi
+.
+.SH DESCRIPTION
+.rs
+.sp
+This function matches a compiled regular expression against a given subject
+string, using a matching algorithm that is similar to Perl's. It then makes a
+copy of the subject, substituting a replacement string for what was matched.
+Its arguments are:
+.sp
+  \fIcode\fP          Points to the compiled pattern
+  \fIsubject\fP       Points to the subject string
+  \fIlength\fP        Length of the subject string
+  \fIstartoffset\fP   Offset in the subject at which to start matching
+  \fIoptions\fP       Option bits
+  \fImatch_data\fP    Points to a match data block, or is NULL
+  \fImcontext\fP      Points to a match context, or is NULL
+  \fIreplacement\fP   Points to the replacement string
+  \fIrlength\fP       Length of the replacement string
+  \fIoutputbuffer\fP  Points to the output buffer
+  \fIoutlengthptr\fP  Points to the length of the output buffer
+.sp
+A match context is needed only if you want to:
+.sp
+  Set up a callout function
+  Change the limit for calling the internal function \fImatch()\fP
+  Change the limit for calling \fImatch()\fP recursively
+  Set custom memory management when the heap is used for recursion
+.sp
+The \fIlength\fP, \fIstartoffset\fP and \fIrlength\fP values are code
+units, not characters, as is the contents of the variable pointed at by
+\fIoutlengthptr\fP, which is updated to the actual length of the new string.
+The options are:
+.sp
+  PCRE2_ANCHORED             Match only at the first position
+  PCRE2_NOTBOL               Subject is not the beginning of a line
+  PCRE2_NOTEOL               Subject is not the end of a line
+  PCRE2_NOTEMPTY             An empty string is not a valid match
+  PCRE2_NOTEMPTY_ATSTART     An empty string at the start of the
+                              subject is not a valid match
+  PCRE2_NO_UTF_CHECK         Do not check the subject or replacement
+                              for UTF validity (only relevant if
+                              PCRE2_UTF was set at compile time)
+  PCRE2_SUBSTITUTE_EXTENDED  Do extended replacement processing
+  PCRE2_SUBSTITUTE_GLOBAL    Replace all occurrences in the subject
+  PCRE2_SUBSTITUTE_OVERFLOW_LENGTH  If overflow, compute needed length
+  PCRE2_SUBSTITUTE_UNKNOWN_UNSET  Treat unknown group as unset
+  PCRE2_SUBSTITUTE_UNSET_EMPTY  Simple unset insert = empty string
+.sp
+The function returns the number of substitutions, which may be zero if there
+were no matches. The result can be greater than one only when
+PCRE2_SUBSTITUTE_GLOBAL is set. In the event of an error, a negative error code
+is returned.
+.P
+There is a complete description of the PCRE2 native API in the
+.\" HREF
+\fBpcre2api\fP
+.\"
+page and a description of the POSIX API in the
+.\" HREF
+\fBpcre2posix\fP
+.\"
+page.
diff --git a/dist2/doc/pcre2_substring_copy_byname.3 b/dist2/doc/pcre2_substring_copy_byname.3
new file mode 100644
index 0000000..d2af63b
--- /dev/null
+++ b/dist2/doc/pcre2_substring_copy_byname.3
@@ -0,0 +1,46 @@
+.TH PCRE2_SUBSTRING_COPY_BYNAME 3 "21 October 2014" "PCRE2 10.00"
+.SH NAME
+PCRE2 - Perl-compatible regular expressions (revised API)
+.SH SYNOPSIS
+.rs
+.sp
+.B #include <pcre2.h>
+.PP
+.nf
+.B int pcre2_substring_copy_byname(pcre2_match_data *\fImatch_data\fP,
+.B "  PCRE2_SPTR \fIname\fP, PCRE2_UCHAR *\fIbuffer\fP, PCRE2_SIZE *\fIbufflen\fP);"
+.fi
+.
+.SH DESCRIPTION
+.rs
+.sp
+This is a convenience function for extracting a captured substring, identified
+by name, into a given buffer. The arguments are:
+.sp
+  \fImatch_data\fP    The match data block for the match
+  \fIname\fP          Name of the required substring
+  \fIbuffer\fP        Buffer to receive the string
+  \fIbufflen\fP       Length of buffer (code units)
+.sp
+The \fIbufflen\fP variable is updated to contain the length of the extracted
+string, excluding the trailing zero. The yield of the function is zero for
+success or one of the following error numbers:
+.sp
+  PCRE2_ERROR_NOSUBSTRING   there are no groups of that name
+  PCRE2_ERROR_UNAVAILBLE    the ovector was too small for that group
+  PCRE2_ERROR_UNSET         the group did not participate in the match
+  PCRE2_ERROR_NOMEMORY      the buffer is not big enough
+.sp
+If there is more than one group with the given name, the first one that is set
+is returned. In this situation PCRE2_ERROR_UNSET means that no group with the
+given name was set.
+.P
+There is a complete description of the PCRE2 native API in the
+.\" HREF
+\fBpcre2api\fP
+.\"
+page and a description of the POSIX API in the
+.\" HREF
+\fBpcre2posix\fP
+.\"
+page.
diff --git a/dist2/doc/pcre2_substring_copy_bynumber.3 b/dist2/doc/pcre2_substring_copy_bynumber.3
new file mode 100644
index 0000000..4cee2b4
--- /dev/null
+++ b/dist2/doc/pcre2_substring_copy_bynumber.3
@@ -0,0 +1,44 @@
+.TH PCRE2_SUBSTRING_COPY_BYNUMBER 3 "13 December 2014" "PCRE2 10.00"
+.SH NAME
+PCRE2 - Perl-compatible regular expressions (revised API)
+.SH SYNOPSIS
+.rs
+.sp
+.B #include <pcre2.h>
+.PP
+.nf
+.B int pcre2_substring_copy_bynumber(pcre2_match_data *\fImatch_data\fP,
+.B "  uint32_t \fInumber\fP, PCRE2_UCHAR *\fIbuffer\fP,"
+.B "  PCRE2_SIZE *\fIbufflen\fP);"
+.fi
+.
+.SH DESCRIPTION
+.rs
+.sp
+This is a convenience function for extracting a captured substring into a given
+buffer. The arguments are:
+.sp
+  \fImatch_data\fP    The match data block for the match
+  \fInumber\fP        Number of the required substring
+  \fIbuffer\fP        Buffer to receive the string
+  \fIbufflen\fP       Length of buffer
+.sp
+The \fIbufflen\fP variable is updated with the length of the extracted string,
+excluding the terminating zero. The yield of the function is zero for success
+or one of the following error numbers:
+.sp
+  PCRE2_ERROR_NOSUBSTRING   there are no groups of that number
+  PCRE2_ERROR_UNAVAILBLE    the ovector was too small for that group
+  PCRE2_ERROR_UNSET         the group did not participate in the match
+  PCRE2_ERROR_NOMEMORY      the buffer is too small
+.sp
+.P
+There is a complete description of the PCRE2 native API in the
+.\" HREF
+\fBpcre2api\fP
+.\"
+page and a description of the POSIX API in the
+.\" HREF
+\fBpcre2posix\fP
+.\"
+page.
diff --git a/dist2/doc/pcre2_substring_free.3 b/dist2/doc/pcre2_substring_free.3
new file mode 100644
index 0000000..ca94e78
--- /dev/null
+++ b/dist2/doc/pcre2_substring_free.3
@@ -0,0 +1,28 @@
+.TH PCRE2_SUBSTRING_FREE 3 "21 October 2014" "PCRE2 10.00"
+.SH NAME
+PCRE2 - Perl-compatible regular expressions (revised API)
+.SH SYNOPSIS
+.rs
+.sp
+.B #include <pcre2.h>
+.PP
+.SM
+.B void pcre2_substring_free(PCRE2_UCHAR *\fIbuffer\fP);
+.
+.SH DESCRIPTION
+.rs
+.sp
+This is a convenience function for freeing the memory obtained by a previous
+call to \fBpcre2_substring_get_byname()\fP or
+\fBpcre2_substring_get_bynumber()\fP. Its only argument is a pointer to the
+string.
+.P
+There is a complete description of the PCRE2 native API in the
+.\" HREF
+\fBpcre2api\fP
+.\"
+page and a description of the POSIX API in the
+.\" HREF
+\fBpcre2posix\fP
+.\"
+page.
diff --git a/dist2/doc/pcre2_substring_get_byname.3 b/dist2/doc/pcre2_substring_get_byname.3
new file mode 100644
index 0000000..6c3f7d5
--- /dev/null
+++ b/dist2/doc/pcre2_substring_get_byname.3
@@ -0,0 +1,48 @@
+.TH PCRE2_SUBSTRING_GET_BYNAME 3 "21 October 2014" "PCRE2 10.00"
+.SH NAME
+PCRE2 - Perl-compatible regular expressions (revised API)
+.SH SYNOPSIS
+.rs
+.sp
+.B #include <pcre2.h>
+.PP
+.nf
+.B int pcre2_substring_get_byname(pcre2_match_data *\fImatch_data\fP,
+.B "  PCRE2_SPTR \fIname\fP, PCRE2_UCHAR **\fIbufferptr\fP, PCRE2_SIZE *\fIbufflen\fP);"
+.fi
+.
+.SH DESCRIPTION
+.rs
+.sp
+This is a convenience function for extracting a captured substring by name into
+newly acquired memory. The arguments are:
+.sp
+  \fImatch_data\fP    The match data for the match
+  \fIname\fP          Name of the required substring
+  \fIbufferptr\fP     Where to put the string pointer
+  \fIbufflen\fP       Where to put the string length
+.sp
+The memory in which the substring is placed is obtained by calling the same
+memory allocation function that was used for the match data block. The
+convenience function \fBpcre2_substring_free()\fP can be used to free it when
+it is no longer needed. The yield of the function is zero for success or one of
+the following error numbers:
+.sp
+  PCRE2_ERROR_NOSUBSTRING   there are no groups of that name
+  PCRE2_ERROR_UNAVAILBLE    the ovector was too small for that group
+  PCRE2_ERROR_UNSET         the group did not participate in the match
+  PCRE2_ERROR_NOMEMORY      memory could not be obtained
+.sp
+If there is more than one group with the given name, the first one that is set
+is returned. In this situation PCRE2_ERROR_UNSET means that no group with the
+given name was set.
+.P
+There is a complete description of the PCRE2 native API in the
+.\" HREF
+\fBpcre2api\fP
+.\"
+page and a description of the POSIX API in the
+.\" HREF
+\fBpcre2posix\fP
+.\"
+page.
diff --git a/dist2/doc/pcre2_substring_get_bynumber.3 b/dist2/doc/pcre2_substring_get_bynumber.3
new file mode 100644
index 0000000..51b6a04
--- /dev/null
+++ b/dist2/doc/pcre2_substring_get_bynumber.3
@@ -0,0 +1,45 @@
+.TH PCRE2_SUBSTRING_GET_BYNUMBER 3 "13 December 2014" "PCRE2 10.00"
+.SH NAME
+PCRE2 - Perl-compatible regular expressions (revised API)
+.SH SYNOPSIS
+.rs
+.sp
+.B #include <pcre2.h>
+.PP
+.nf
+.B int pcre2_substring_get_bynumber(pcre2_match_data *\fImatch_data\fP,
+.B "  uint32_t \fInumber\fP, PCRE2_UCHAR **\fIbufferptr\fP, PCRE2_SIZE *\fIbufflen\fP);"
+.fi
+.
+.SH DESCRIPTION
+.rs
+.sp
+This is a convenience function for extracting a captured substring by number
+into newly acquired memory. The arguments are:
+.sp
+  \fImatch_data\fP    The match data for the match
+  \fInumber\fP        Number of the required substring
+  \fIbufferptr\fP     Where to put the string pointer
+  \fIbufflen\fP       Where to put the string length
+.sp
+The memory in which the substring is placed is obtained by calling the same
+memory allocation function that was used for the match data block. The
+convenience function \fBpcre2_substring_free()\fP can be used to free it when
+it is no longer needed. The yield of the function is zero for success or one of
+the following error numbers:
+.sp
+  PCRE2_ERROR_NOSUBSTRING   there are no groups of that number
+  PCRE2_ERROR_UNAVAILBLE    the ovector was too small for that group
+  PCRE2_ERROR_UNSET         the group did not participate in the match
+  PCRE2_ERROR_NOMEMORY      memory could not be obtained
+.sp
+.P
+There is a complete description of the PCRE2 native API in the
+.\" HREF
+\fBpcre2api\fP
+.\"
+page and a description of the POSIX API in the
+.\" HREF
+\fBpcre2posix\fP
+.\"
+page.
diff --git a/dist2/doc/pcre2_substring_length_byname.3 b/dist2/doc/pcre2_substring_length_byname.3
new file mode 100644
index 0000000..84cdc6a
--- /dev/null
+++ b/dist2/doc/pcre2_substring_length_byname.3
@@ -0,0 +1,34 @@
+.TH PCRE2_SUBSTRING_LENGTH_BYNAME 3 "21 October 2014" "PCRE2 10.00"
+.SH NAME
+PCRE2 - Perl-compatible regular expressions (revised API)
+.SH SYNOPSIS
+.rs
+.sp
+.B #include <pcre2.h>
+.PP
+.nf
+.B int pcre2_substring_length_byname(pcre2_match_data *\fImatch_data\fP,
+.B "  PCRE2_SPTR \fIname\fP, PCRE2_SIZE *\fIlength\fP);"
+.fi
+.
+.SH DESCRIPTION
+.rs
+.sp
+This function returns the length of a matched substring, identified by name.
+The arguments are:
+.sp
+  \fImatch_data\fP   The match data block for the match
+  \fIname\fP         The substring name
+  \fIlength\fP       Where to return the length
+.sp
+The yield is zero on success, or an error code if the substring is not found.
+.P
+There is a complete description of the PCRE2 native API in the
+.\" HREF
+\fBpcre2api\fP
+.\"
+page and a description of the POSIX API in the
+.\" HREF
+\fBpcre2posix\fP
+.\"
+page.
diff --git a/dist2/doc/pcre2_substring_length_bynumber.3 b/dist2/doc/pcre2_substring_length_bynumber.3
new file mode 100644
index 0000000..12778d6
--- /dev/null
+++ b/dist2/doc/pcre2_substring_length_bynumber.3
@@ -0,0 +1,36 @@
+.TH PCRE2_SUBSTRING_LENGTH_BYNUMBER 3 "22 December 2014" "PCRE2 10.00"
+.SH NAME
+PCRE2 - Perl-compatible regular expressions (revised API)
+.SH SYNOPSIS
+.rs
+.sp
+.B #include <pcre2.h>
+.PP
+.nf
+.B int pcre2_substring_length_bynumber(pcre2_match_data *\fImatch_data\fP,
+.B "  uint32_t \fInumber\fP, PCRE2_SIZE *\fIlength\fP);"
+.fi
+.
+.SH DESCRIPTION
+.rs
+.sp
+This function returns the length of a matched substring, identified by number.
+The arguments are:
+.sp
+  \fImatch_data\fP   The match data block for the match
+  \fInumber\fP       The substring number
+  \fIlength\fP       Where to return the length, or NULL
+.sp
+The third argument may be NULL if all you want to know is whether or not a
+substring is set. The yield is zero on success, or a negative error code
+otherwise. After a partial match, only substring 0 is available.
+.P
+There is a complete description of the PCRE2 native API in the
+.\" HREF
+\fBpcre2api\fP
+.\"
+page and a description of the POSIX API in the
+.\" HREF
+\fBpcre2posix\fP
+.\"
+page.
diff --git a/dist2/doc/pcre2_substring_list_free.3 b/dist2/doc/pcre2_substring_list_free.3
new file mode 100644
index 0000000..4725f9c
--- /dev/null
+++ b/dist2/doc/pcre2_substring_list_free.3
@@ -0,0 +1,27 @@
+.TH PCRE2_SUBSTRING_LIST_FREE 3 "21 October 2014" "PCRE2 10.00"
+.SH NAME
+PCRE2 - Perl-compatible regular expressions (revised API)
+.SH SYNOPSIS
+.rs
+.sp
+.B #include <pcre2.h>
+.PP
+.SM
+.B void pcre2_substring_list_free(PCRE2_SPTR *\fIlist\fP);
+.
+.SH DESCRIPTION
+.rs
+.sp
+This is a convenience function for freeing the store obtained by a previous
+call to \fBpcre2substring_list_get()\fP. Its only argument is a pointer to
+the list of string pointers.
+.P
+There is a complete description of the PCRE2 native API in the
+.\" HREF
+\fBpcre2api\fP
+.\"
+page and a description of the POSIX API in the
+.\" HREF
+\fBpcre2posix\fP
+.\"
+page.
diff --git a/dist2/doc/pcre2_substring_list_get.3 b/dist2/doc/pcre2_substring_list_get.3
new file mode 100644
index 0000000..bdc400e
--- /dev/null
+++ b/dist2/doc/pcre2_substring_list_get.3
@@ -0,0 +1,44 @@
+.TH PCRE2_SUBSTRING_LIST_GET 3 "21 October 2014" "PCRE2 10.00"
+.SH NAME
+PCRE2 - Perl-compatible regular expressions (revised API)
+.SH SYNOPSIS
+.rs
+.sp
+.B #include <pcre2.h>
+.PP
+.nf
+.B int pcre2_substring_list_get(pcre2_match_data *\fImatch_data\fP,
+.B "  PCRE2_UCHAR ***\fIlistptr\fP, PCRE2_SIZE **\fIlengthsptr\fP);
+.fi
+.
+.SH DESCRIPTION
+.rs
+.sp
+This is a convenience function for extracting all the captured substrings after
+a pattern match. It builds a list of pointers to the strings, and (optionally)
+a second list that contains their lengths (in code units), excluding a
+terminating zero that is added to each of them. All this is done in a single
+block of memory that is obtained using the same memory allocation function that
+was used to get the match data block. The convenience function
+\fBpcre2_substring_list_free()\fP can be used to free it when it is no longer
+needed. The arguments are:
+.sp
+  \fImatch_data\fP    The match data block
+  \fIlistptr\fP       Where to put a pointer to the list
+  \fIlengthsptr\fP    Where to put a pointer to the lengths, or NULL
+.sp
+A pointer to a list of pointers is put in the variable whose address is in
+\fIlistptr\fP. The list is terminated by a NULL pointer. If \fIlengthsptr\fP is
+not NULL, a matching list of lengths is created, and its address is placed in
+\fIlengthsptr\fP. The yield of the function is zero on success or
+PCRE2_ERROR_NOMEMORY if sufficient memory could not be obtained.
+.P
+There is a complete description of the PCRE2 native API in the
+.\" HREF
+\fBpcre2api\fP
+.\"
+page and a description of the POSIX API in the
+.\" HREF
+\fBpcre2posix\fP
+.\"
+page.
diff --git a/dist2/doc/pcre2_substring_nametable_scan.3 b/dist2/doc/pcre2_substring_nametable_scan.3
new file mode 100644
index 0000000..4342f98
--- /dev/null
+++ b/dist2/doc/pcre2_substring_nametable_scan.3
@@ -0,0 +1,41 @@
+.TH PCRE2_SUBSTRING_NAMETABLE_SCAN 3 "21 October 2014" "PCRE2 10.00"
+.SH NAME
+PCRE2 - Perl-compatible regular expressions (revised API)
+.SH SYNOPSIS
+.rs
+.sp
+.B #include <pcre2.h>
+.PP
+.nf
+.B int pcre2_substring_nametable_scan(const pcre2_code *\fIcode\fP,
+.B "  PCRE2_SPTR \fIname\fP, PCRE2_SPTR *\fIfirst\fP, PCRE2_SPTR *\fIlast\fP);"
+.fi
+.
+.SH DESCRIPTION
+.rs
+.sp
+This convenience function finds, for a compiled pattern, the first and last
+entries for a given name in the table that translates capturing parenthesis
+names into numbers.
+.sp
+  \fIcode\fP    Compiled regular expression
+  \fIname\fP    Name whose entries required
+  \fIfirst\fP   Where to return a pointer to the first entry
+  \fIlast\fP    Where to return a pointer to the last entry
+.sp
+When the name is found in the table, if \fIfirst\fP is NULL, the function
+returns a group number, but if there is more than one matching entry, it is not
+defined which one. Otherwise, when both pointers have been set, the yield of
+the function is the length of each entry in code units. If the name is not
+found, PCRE2_ERROR_NOSUBSTRING is returned.
+.P
+There is a complete description of the PCRE2 native API, including the format of
+the table entries, in the
+.\" HREF
+\fBpcre2api\fP
+.\"
+page, and a description of the POSIX API in the
+.\" HREF
+\fBpcre2posix\fP
+.\"
+page.
diff --git a/dist2/doc/pcre2_substring_number_from_name.3 b/dist2/doc/pcre2_substring_number_from_name.3
new file mode 100644
index 0000000..b077b1d
--- /dev/null
+++ b/dist2/doc/pcre2_substring_number_from_name.3
@@ -0,0 +1,38 @@
+.TH PCRE2_SUBSTRING_NUMBER_FROM_NAME 3 "21 October 2014" "PCRE2 10.00"
+.SH NAME
+PCRE2 - Perl-compatible regular expressions (revised API)
+.SH SYNOPSIS
+.rs
+.sp
+.B #include <pcre2.h>
+.PP
+.nf
+.B int pcre2_substring_number_from_name(const pcre2_code *\fIcode\fP,
+.B "  PCRE2_SPTR \fIname\fP);"
+.fi
+.
+.SH DESCRIPTION
+.rs
+.sp
+This convenience function finds the number of a named substring capturing
+parenthesis in a compiled pattern, provided that it is a unique name. The
+function arguments are:
+.sp
+  \fIcode\fP    Compiled regular expression
+  \fIname\fP    Name whose number is required
+.sp
+The yield of the function is the number of the parenthesis if the name is
+found, or PCRE2_ERROR_NOSUBSTRING if it is not found. When duplicate names are
+allowed (PCRE2_DUPNAMES is set), if the name is not unique,
+PCRE2_ERROR_NOUNIQUESUBSTRING is returned. You can obtain the list of numbers
+with the same name by calling \fBpcre2_substring_nametable_scan()\fP.
+.P
+There is a complete description of the PCRE2 native API in the
+.\" HREF
+\fBpcre2api\fP
+.\"
+page and a description of the POSIX API in the
+.\" HREF
+\fBpcre2posix\fP
+.\"
+page.
diff --git a/dist2/doc/pcre2api.3 b/dist2/doc/pcre2api.3
new file mode 100644
index 0000000..b29f7b0
--- /dev/null
+++ b/dist2/doc/pcre2api.3
@@ -0,0 +1,3171 @@
+.TH PCRE2API 3 "16 December 2015" "PCRE2 10.21"
+.SH NAME
+PCRE2 - Perl-compatible regular expressions (revised API)
+.sp
+.B #include <pcre2.h>
+.sp
+PCRE2 is a new API for PCRE. This document contains a description of all its
+functions. See the
+.\" HREF
+\fBpcre2\fP
+.\"
+document for an overview of all the PCRE2 documentation.
+.
+.
+.SH "PCRE2 NATIVE API BASIC FUNCTIONS"
+.rs
+.sp
+.nf
+.B pcre2_code *pcre2_compile(PCRE2_SPTR \fIpattern\fP, PCRE2_SIZE \fIlength\fP,
+.B "  uint32_t \fIoptions\fP, int *\fIerrorcode\fP, PCRE2_SIZE *\fIerroroffset,\fP"
+.B "  pcre2_compile_context *\fIccontext\fP);"
+.sp
+.B void pcre2_code_free(pcre2_code *\fIcode\fP);
+.sp
+.B pcre2_match_data *pcre2_match_data_create(uint32_t \fIovecsize\fP,
+.B "  pcre2_general_context *\fIgcontext\fP);"
+.sp
+.B pcre2_match_data *pcre2_match_data_create_from_pattern(
+.B "  const pcre2_code *\fIcode\fP, pcre2_general_context *\fIgcontext\fP);"
+.sp
+.B int pcre2_match(const pcre2_code *\fIcode\fP, PCRE2_SPTR \fIsubject\fP,
+.B "  PCRE2_SIZE \fIlength\fP, PCRE2_SIZE \fIstartoffset\fP,"
+.B "  uint32_t \fIoptions\fP, pcre2_match_data *\fImatch_data\fP,"
+.B "  pcre2_match_context *\fImcontext\fP);"
+.sp
+.B int pcre2_dfa_match(const pcre2_code *\fIcode\fP, PCRE2_SPTR \fIsubject\fP,
+.B "  PCRE2_SIZE \fIlength\fP, PCRE2_SIZE \fIstartoffset\fP,"
+.B "  uint32_t \fIoptions\fP, pcre2_match_data *\fImatch_data\fP,"
+.B "  pcre2_match_context *\fImcontext\fP,"
+.B "  int *\fIworkspace\fP, PCRE2_SIZE \fIwscount\fP);"
+.sp
+.B void pcre2_match_data_free(pcre2_match_data *\fImatch_data\fP);
+.fi
+.
+.
+.SH "PCRE2 NATIVE API AUXILIARY MATCH FUNCTIONS"
+.rs
+.sp
+.nf
+.B PCRE2_SPTR pcre2_get_mark(pcre2_match_data *\fImatch_data\fP);
+.sp
+.B uint32_t pcre2_get_ovector_count(pcre2_match_data *\fImatch_data\fP);
+.sp
+.B PCRE2_SIZE *pcre2_get_ovector_pointer(pcre2_match_data *\fImatch_data\fP);
+.sp
+.B PCRE2_SIZE pcre2_get_startchar(pcre2_match_data *\fImatch_data\fP);
+.fi
+.
+.
+.SH "PCRE2 NATIVE API GENERAL CONTEXT FUNCTIONS"
+.rs
+.sp
+.nf
+.B pcre2_general_context *pcre2_general_context_create(
+.B "  void *(*\fIprivate_malloc\fP)(PCRE2_SIZE, void *),"
+.B "  void (*\fIprivate_free\fP)(void *, void *), void *\fImemory_data\fP);"
+.sp
+.B pcre2_general_context *pcre2_general_context_copy(
+.B "  pcre2_general_context *\fIgcontext\fP);"
+.sp
+.B void pcre2_general_context_free(pcre2_general_context *\fIgcontext\fP);
+.fi
+.
+.
+.SH "PCRE2 NATIVE API COMPILE CONTEXT FUNCTIONS"
+.rs
+.sp
+.nf
+.B pcre2_compile_context *pcre2_compile_context_create(
+.B "  pcre2_general_context *\fIgcontext\fP);"
+.sp
+.B pcre2_compile_context *pcre2_compile_context_copy(
+.B "  pcre2_compile_context *\fIccontext\fP);"
+.sp
+.B void pcre2_compile_context_free(pcre2_compile_context *\fIccontext\fP);
+.sp
+.B int pcre2_set_bsr(pcre2_compile_context *\fIccontext\fP,
+.B "  uint32_t \fIvalue\fP);"
+.sp
+.B int pcre2_set_character_tables(pcre2_compile_context *\fIccontext\fP,
+.B "  const unsigned char *\fItables\fP);"
+.sp
+.B int pcre2_set_max_pattern_length(pcre2_compile_context *\fIccontext\fP,
+.B "  PCRE2_SIZE \fIvalue\fP);"
+.sp
+.B int pcre2_set_newline(pcre2_compile_context *\fIccontext\fP,
+.B "  uint32_t \fIvalue\fP);"
+.sp
+.B int pcre2_set_parens_nest_limit(pcre2_compile_context *\fIccontext\fP,
+.B "  uint32_t \fIvalue\fP);"
+.sp
+.B int pcre2_set_compile_recursion_guard(pcre2_compile_context *\fIccontext\fP,
+.B "  int (*\fIguard_function\fP)(uint32_t, void *), void *\fIuser_data\fP);"
+.fi
+.
+.
+.SH "PCRE2 NATIVE API MATCH CONTEXT FUNCTIONS"
+.rs
+.sp
+.nf
+.B pcre2_match_context *pcre2_match_context_create(
+.B "  pcre2_general_context *\fIgcontext\fP);"
+.sp
+.B pcre2_match_context *pcre2_match_context_copy(
+.B "  pcre2_match_context *\fImcontext\fP);"
+.sp
+.B void pcre2_match_context_free(pcre2_match_context *\fImcontext\fP);
+.sp
+.B int pcre2_set_callout(pcre2_match_context *\fImcontext\fP,
+.B "  int (*\fIcallout_function\fP)(pcre2_callout_block *, void *),"
+.B "  void *\fIcallout_data\fP);"
+.sp
+.B int pcre2_set_match_limit(pcre2_match_context *\fImcontext\fP,
+.B "  uint32_t \fIvalue\fP);"
+.sp
+.B int pcre2_set_offset_limit(pcre2_match_context *\fImcontext\fP,
+.B "  PCRE2_SIZE \fIvalue\fP);"
+.sp
+.B int pcre2_set_recursion_limit(pcre2_match_context *\fImcontext\fP,
+.B "  uint32_t \fIvalue\fP);"
+.sp
+.B int pcre2_set_recursion_memory_management(
+.B "  pcre2_match_context *\fImcontext\fP,"
+.B "  void *(*\fIprivate_malloc\fP)(PCRE2_SIZE, void *),"
+.B "  void (*\fIprivate_free\fP)(void *, void *), void *\fImemory_data\fP);"
+.fi
+.
+.
+.SH "PCRE2 NATIVE API STRING EXTRACTION FUNCTIONS"
+.rs
+.sp
+.nf
+.B int pcre2_substring_copy_byname(pcre2_match_data *\fImatch_data\fP,
+.B "  PCRE2_SPTR \fIname\fP, PCRE2_UCHAR *\fIbuffer\fP, PCRE2_SIZE *\fIbufflen\fP);"
+.sp
+.B int pcre2_substring_copy_bynumber(pcre2_match_data *\fImatch_data\fP,
+.B "  uint32_t \fInumber\fP, PCRE2_UCHAR *\fIbuffer\fP,"
+.B "  PCRE2_SIZE *\fIbufflen\fP);"
+.sp
+.B void pcre2_substring_free(PCRE2_UCHAR *\fIbuffer\fP);
+.sp
+.B int pcre2_substring_get_byname(pcre2_match_data *\fImatch_data\fP,
+.B "  PCRE2_SPTR \fIname\fP, PCRE2_UCHAR **\fIbufferptr\fP, PCRE2_SIZE *\fIbufflen\fP);"
+.sp
+.B int pcre2_substring_get_bynumber(pcre2_match_data *\fImatch_data\fP,
+.B "  uint32_t \fInumber\fP, PCRE2_UCHAR **\fIbufferptr\fP,"
+.B "  PCRE2_SIZE *\fIbufflen\fP);"
+.sp
+.B int pcre2_substring_length_byname(pcre2_match_data *\fImatch_data\fP,
+.B "  PCRE2_SPTR \fIname\fP, PCRE2_SIZE *\fIlength\fP);"
+.sp
+.B int pcre2_substring_length_bynumber(pcre2_match_data *\fImatch_data\fP,
+.B "  uint32_t \fInumber\fP, PCRE2_SIZE *\fIlength\fP);"
+.sp
+.B int pcre2_substring_nametable_scan(const pcre2_code *\fIcode\fP,
+.B "  PCRE2_SPTR \fIname\fP, PCRE2_SPTR *\fIfirst\fP, PCRE2_SPTR *\fIlast\fP);"
+.sp
+.B int pcre2_substring_number_from_name(const pcre2_code *\fIcode\fP,
+.B "  PCRE2_SPTR \fIname\fP);"
+.sp
+.B void pcre2_substring_list_free(PCRE2_SPTR *\fIlist\fP);
+.sp
+.B int pcre2_substring_list_get(pcre2_match_data *\fImatch_data\fP,
+.B "  PCRE2_UCHAR ***\fIlistptr\fP, PCRE2_SIZE **\fIlengthsptr\fP);
+.fi
+.
+.
+.SH "PCRE2 NATIVE API STRING SUBSTITUTION FUNCTION"
+.rs
+.sp
+.nf
+.B int pcre2_substitute(const pcre2_code *\fIcode\fP, PCRE2_SPTR \fIsubject\fP,
+.B "  PCRE2_SIZE \fIlength\fP, PCRE2_SIZE \fIstartoffset\fP,"
+.B "  uint32_t \fIoptions\fP, pcre2_match_data *\fImatch_data\fP,"
+.B "  pcre2_match_context *\fImcontext\fP, PCRE2_SPTR \fIreplacementzfP,"
+.B "  PCRE2_SIZE \fIrlength\fP, PCRE2_UCHAR *\fIoutputbuffer\fP,"
+.B "  PCRE2_SIZE *\fIoutlengthptr\fP);"
+.fi
+.
+.
+.SH "PCRE2 NATIVE API JIT FUNCTIONS"
+.rs
+.sp
+.nf
+.B int pcre2_jit_compile(pcre2_code *\fIcode\fP, uint32_t \fIoptions\fP);
+.sp
+.B int pcre2_jit_match(const pcre2_code *\fIcode\fP, PCRE2_SPTR \fIsubject\fP,
+.B "  PCRE2_SIZE \fIlength\fP, PCRE2_SIZE \fIstartoffset\fP,"
+.B "  uint32_t \fIoptions\fP, pcre2_match_data *\fImatch_data\fP,"
+.B "  pcre2_match_context *\fImcontext\fP);"
+.sp
+.B void pcre2_jit_free_unused_memory(pcre2_general_context *\fIgcontext\fP);
+.sp
+.B pcre2_jit_stack *pcre2_jit_stack_create(PCRE2_SIZE \fIstartsize\fP,
+.B "  PCRE2_SIZE \fImaxsize\fP, pcre2_general_context *\fIgcontext\fP);"
+.sp
+.B void pcre2_jit_stack_assign(pcre2_match_context *\fImcontext\fP,
+.B "  pcre2_jit_callback \fIcallback_function\fP, void *\fIcallback_data\fP);"
+.sp
+.B void pcre2_jit_stack_free(pcre2_jit_stack *\fIjit_stack\fP);
+.fi
+.
+.
+.SH "PCRE2 NATIVE API SERIALIZATION FUNCTIONS"
+.rs
+.sp
+.nf
+.B int32_t pcre2_serialize_decode(pcre2_code **\fIcodes\fP,
+.B "  int32_t \fInumber_of_codes\fP, const uint8_t *\fIbytes\fP,"
+.B "  pcre2_general_context *\fIgcontext\fP);"
+.sp
+.B int32_t pcre2_serialize_encode(const pcre2_code **\fIcodes\fP,
+.B "  int32_t \fInumber_of_codes\fP, uint8_t **\fIserialized_bytes\fP,"
+.B "  PCRE2_SIZE *\fIserialized_size\fP, pcre2_general_context *\fIgcontext\fP);"
+.sp
+.B void pcre2_serialize_free(uint8_t *\fIbytes\fP);
+.sp
+.B int32_t pcre2_serialize_get_number_of_codes(const uint8_t *\fIbytes\fP);
+.fi
+.
+.
+.SH "PCRE2 NATIVE API AUXILIARY FUNCTIONS"
+.rs
+.sp
+.nf
+.B int pcre2_get_error_message(int \fIerrorcode\fP, PCRE2_UCHAR *\fIbuffer\fP,
+.B "  PCRE2_SIZE \fIbufflen\fP);"
+.sp
+.B const unsigned char *pcre2_maketables(pcre2_general_context *\fIgcontext\fP);
+.sp
+.B int pcre2_pattern_info(const pcre2 *\fIcode\fP, uint32_t \fIwhat\fP, void *\fIwhere\fP);
+.sp
+.B int pcre2_callout_enumerate(const pcre2_code *\fIcode\fP,
+.B "  int (*\fIcallback\fP)(pcre2_callout_enumerate_block *, void *),"
+.B "  void *\fIuser_data\fP);"
+.sp
+.B int pcre2_config(uint32_t \fIwhat\fP, void *\fIwhere\fP);
+.fi
+.
+.
+.SH "PCRE2 8-BIT, 16-BIT, AND 32-BIT LIBRARIES"
+.rs
+.sp
+There are three PCRE2 libraries, supporting 8-bit, 16-bit, and 32-bit code
+units, respectively. However, there is just one header file, \fBpcre2.h\fP.
+This contains the function prototypes and other definitions for all three
+libraries. One, two, or all three can be installed simultaneously. On Unix-like
+systems the libraries are called \fBlibpcre2-8\fP, \fBlibpcre2-16\fP, and
+\fBlibpcre2-32\fP, and they can also co-exist with the original PCRE libraries.
+.P
+Character strings are passed to and from a PCRE2 library as a sequence of
+unsigned integers in code units of the appropriate width. Every PCRE2 function
+comes in three different forms, one for each library, for example:
+.sp
+  \fBpcre2_compile_8()\fP
+  \fBpcre2_compile_16()\fP
+  \fBpcre2_compile_32()\fP
+.sp
+There are also three different sets of data types:
+.sp
+  \fBPCRE2_UCHAR8, PCRE2_UCHAR16, PCRE2_UCHAR32\fP
+  \fBPCRE2_SPTR8,  PCRE2_SPTR16,  PCRE2_SPTR32\fP
+.sp
+The UCHAR types define unsigned code units of the appropriate widths. For
+example, PCRE2_UCHAR16 is usually defined as `uint16_t'. The SPTR types are
+constant pointers to the equivalent UCHAR types, that is, they are pointers to
+vectors of unsigned code units.
+.P
+Many applications use only one code unit width. For their convenience, macros
+are defined whose names are the generic forms such as \fBpcre2_compile()\fP and
+PCRE2_SPTR. These macros use the value of the macro PCRE2_CODE_UNIT_WIDTH to
+generate the appropriate width-specific function and macro names.
+PCRE2_CODE_UNIT_WIDTH is not defined by default. An application must define it
+to be 8, 16, or 32 before including \fBpcre2.h\fP in order to make use of the
+generic names.
+.P
+Applications that use more than one code unit width can be linked with more
+than one PCRE2 library, but must define PCRE2_CODE_UNIT_WIDTH to be 0 before
+including \fBpcre2.h\fP, and then use the real function names. Any code that is
+to be included in an environment where the value of PCRE2_CODE_UNIT_WIDTH is
+unknown should also use the real function names. (Unfortunately, it is not
+possible in C code to save and restore the value of a macro.)
+.P
+If PCRE2_CODE_UNIT_WIDTH is not defined before including \fBpcre2.h\fP, a
+compiler error occurs.
+.P
+When using multiple libraries in an application, you must take care when
+processing any particular pattern to use only functions from a single library.
+For example, if you want to run a match using a pattern that was compiled with
+\fBpcre2_compile_16()\fP, you must do so with \fBpcre2_match_16()\fP, not
+\fBpcre2_match_8()\fP.
+.P
+In the function summaries above, and in the rest of this document and other
+PCRE2 documents, functions and data types are described using their generic
+names, without the 8, 16, or 32 suffix.
+.
+.
+.SH "PCRE2 API OVERVIEW"
+.rs
+.sp
+PCRE2 has its own native API, which is described in this document. There are
+also some wrapper functions for the 8-bit library that correspond to the
+POSIX regular expression API, but they do not give access to all the
+functionality. They are described in the
+.\" HREF
+\fBpcre2posix\fP
+.\"
+documentation. Both these APIs define a set of C function calls.
+.P
+The native API C data types, function prototypes, option values, and error
+codes are defined in the header file \fBpcre2.h\fP, which contains definitions
+of PCRE2_MAJOR and PCRE2_MINOR, the major and minor release numbers for the
+library. Applications can use these to include support for different releases
+of PCRE2.
+.P
+In a Windows environment, if you want to statically link an application program
+against a non-dll PCRE2 library, you must define PCRE2_STATIC before including
+\fBpcre2.h\fP.
+.P
+The functions \fBpcre2_compile()\fP, and \fBpcre2_match()\fP are used for
+compiling and matching regular expressions in a Perl-compatible manner. A
+sample program that demonstrates the simplest way of using them is provided in
+the file called \fIpcre2demo.c\fP in the PCRE2 source distribution. A listing
+of this program is given in the
+.\" HREF
+\fBpcre2demo\fP
+.\"
+documentation, and the
+.\" HREF
+\fBpcre2sample\fP
+.\"
+documentation describes how to compile and run it.
+.P
+Just-in-time compiler support is an optional feature of PCRE2 that can be built
+in appropriate hardware environments. It greatly speeds up the matching
+performance of many patterns. Programs can request that it be used if
+available, by calling \fBpcre2_jit_compile()\fP after a pattern has been
+successfully compiled by \fBpcre2_compile()\fP. This does nothing if JIT
+support is not available.
+.P
+More complicated programs might need to make use of the specialist functions
+\fBpcre2_jit_stack_create()\fP, \fBpcre2_jit_stack_free()\fP, and
+\fBpcre2_jit_stack_assign()\fP in order to control the JIT code's memory usage.
+.P
+JIT matching is automatically used by \fBpcre2_match()\fP if it is available.
+There is also a direct interface for JIT matching, which gives improved
+performance. The JIT-specific functions are discussed in the
+.\" HREF
+\fBpcre2jit\fP
+.\"
+documentation.
+.P
+A second matching function, \fBpcre2_dfa_match()\fP, which is not
+Perl-compatible, is also provided. This uses a different algorithm for the
+matching. The alternative algorithm finds all possible matches (at a given
+point in the subject), and scans the subject just once (unless there are
+lookbehind assertions). However, this algorithm does not return captured
+substrings. A description of the two matching algorithms and their advantages
+and disadvantages is given in the
+.\" HREF
+\fBpcre2matching\fP
+.\"
+documentation. There is no JIT support for \fBpcre2_dfa_match()\fP.
+.P
+In addition to the main compiling and matching functions, there are convenience
+functions for extracting captured substrings from a subject string that has
+been matched by \fBpcre2_match()\fP. They are:
+.sp
+  \fBpcre2_substring_copy_byname()\fP
+  \fBpcre2_substring_copy_bynumber()\fP
+  \fBpcre2_substring_get_byname()\fP
+  \fBpcre2_substring_get_bynumber()\fP
+  \fBpcre2_substring_list_get()\fP
+  \fBpcre2_substring_length_byname()\fP
+  \fBpcre2_substring_length_bynumber()\fP
+  \fBpcre2_substring_nametable_scan()\fP
+  \fBpcre2_substring_number_from_name()\fP
+.sp
+\fBpcre2_substring_free()\fP and \fBpcre2_substring_list_free()\fP are also
+provided, to free the memory used for extracted strings.
+.P
+The function \fBpcre2_substitute()\fP can be called to match a pattern and
+return a copy of the subject string with substitutions for parts that were
+matched.
+.P
+Finally, there are functions for finding out information about a compiled
+pattern (\fBpcre2_pattern_info()\fP) and about the configuration with which
+PCRE2 was built (\fBpcre2_config()\fP).
+.
+.
+.SH "STRING LENGTHS AND OFFSETS"
+.rs
+.sp
+The PCRE2 API uses string lengths and offsets into strings of code units in
+several places. These values are always of type PCRE2_SIZE, which is an
+unsigned integer type, currently always defined as \fIsize_t\fP. The largest
+value that can be stored in such a type (that is ~(PCRE2_SIZE)0) is reserved
+as a special indicator for zero-terminated strings and unset offsets.
+Therefore, the longest string that can be handled is one less than this
+maximum.
+.
+.
+.\" HTML <a name="newlines"></a>
+.SH NEWLINES
+.rs
+.sp
+PCRE2 supports five different conventions for indicating line breaks in
+strings: a single CR (carriage return) character, a single LF (linefeed)
+character, the two-character sequence CRLF, any of the three preceding, or any
+Unicode newline sequence. The Unicode newline sequences are the three just
+mentioned, plus the single characters VT (vertical tab, U+000B), FF (form feed,
+U+000C), NEL (next line, U+0085), LS (line separator, U+2028), and PS
+(paragraph separator, U+2029).
+.P
+Each of the first three conventions is used by at least one operating system as
+its standard newline sequence. When PCRE2 is built, a default can be specified.
+The default default is LF, which is the Unix standard. However, the newline
+convention can be changed by an application when calling \fBpcre2_compile()\fP,
+or it can be specified by special text at the start of the pattern itself; this
+overrides any other settings. See the
+.\" HREF
+\fBpcre2pattern\fP
+.\"
+page for details of the special character sequences.
+.P
+In the PCRE2 documentation the word "newline" is used to mean "the character or
+pair of characters that indicate a line break". The choice of newline
+convention affects the handling of the dot, circumflex, and dollar
+metacharacters, the handling of #-comments in /x mode, and, when CRLF is a
+recognized line ending sequence, the match position advancement for a
+non-anchored pattern. There is more detail about this in the
+.\" HTML <a href="#matchoptions">
+.\" </a>
+section on \fBpcre2_match()\fP options
+.\"
+below.
+.P
+The choice of newline convention does not affect the interpretation of
+the \en or \er escape sequences, nor does it affect what \eR matches; this has
+its own separate convention.
+.
+.
+.SH MULTITHREADING
+.rs
+.sp
+In a multithreaded application it is important to keep thread-specific data
+separate from data that can be shared between threads. The PCRE2 library code
+itself is thread-safe: it contains no static or global variables. The API is
+designed to be fairly simple for non-threaded applications while at the same
+time ensuring that multithreaded applications can use it.
+.P
+There are several different blocks of data that are used to pass information
+between the application and the PCRE2 libraries.
+.P
+(1) A pointer to the compiled form of a pattern is returned to the user when
+\fBpcre2_compile()\fP is successful. The data in the compiled pattern is fixed,
+and does not change when the pattern is matched. Therefore, it is thread-safe,
+that is, the same compiled pattern can be used by more than one thread
+simultaneously. An application can compile all its patterns at the start,
+before forking off multiple threads that use them. However, if the just-in-time
+optimization feature is being used, it needs separate memory stack areas for
+each thread. See the
+.\" HREF
+\fBpcre2jit\fP
+.\"
+documentation for more details.
+.P
+(2) The next section below introduces the idea of "contexts" in which PCRE2
+functions are called. A context is nothing more than a collection of parameters
+that control the way PCRE2 operates. Grouping a number of parameters together
+in a context is a convenient way of passing them to a PCRE2 function without
+using lots of arguments. The parameters that are stored in contexts are in some
+sense "advanced features" of the API. Many straightforward applications will
+not need to use contexts.
+.P
+In a multithreaded application, if the parameters in a context are values that
+are never changed, the same context can be used by all the threads. However, if
+any thread needs to change any value in a context, it must make its own
+thread-specific copy.
+.P
+(3) The matching functions need a block of memory for working space and for
+storing the results of a match. This includes details of what was matched, as
+well as additional information such as the name of a (*MARK) setting. Each
+thread must provide its own version of this memory.
+.
+.
+.SH "PCRE2 CONTEXTS"
+.rs
+.sp
+Some PCRE2 functions have a lot of parameters, many of which are used only by
+specialist applications, for example, those that use custom memory management
+or non-standard character tables. To keep function argument lists at a
+reasonable size, and at the same time to keep the API extensible, "uncommon"
+parameters are passed to certain functions in a \fBcontext\fP instead of
+directly. A context is just a block of memory that holds the parameter values.
+Applications that do not need to adjust any of the context parameters can pass
+NULL when a context pointer is required.
+.P
+There are three different types of context: a general context that is relevant
+for several PCRE2 operations, a compile-time context, and a match-time context.
+.
+.
+.SS "The general context"
+.rs
+.sp
+At present, this context just contains pointers to (and data for) external
+memory management functions that are called from several places in the PCRE2
+library. The context is named `general' rather than specifically `memory'
+because in future other fields may be added. If you do not want to supply your
+own custom memory management functions, you do not need to bother with a
+general context. A general context is created by:
+.sp
+.nf
+.B pcre2_general_context *pcre2_general_context_create(
+.B "  void *(*\fIprivate_malloc\fP)(PCRE2_SIZE, void *),"
+.B "  void (*\fIprivate_free\fP)(void *, void *), void *\fImemory_data\fP);"
+.fi
+.sp
+The two function pointers specify custom memory management functions, whose
+prototypes are:
+.sp
+  \fBvoid *private_malloc(PCRE2_SIZE, void *);\fP
+  \fBvoid  private_free(void *, void *);\fP
+.sp
+Whenever code in PCRE2 calls these functions, the final argument is the value
+of \fImemory_data\fP. Either of the first two arguments of the creation
+function may be NULL, in which case the system memory management functions
+\fImalloc()\fP and \fIfree()\fP are used. (This is not currently useful, as
+there are no other fields in a general context, but in future there might be.)
+The \fIprivate_malloc()\fP function is used (if supplied) to obtain memory for
+storing the context, and all three values are saved as part of the context.
+.P
+Whenever PCRE2 creates a data block of any kind, the block contains a pointer
+to the \fIfree()\fP function that matches the \fImalloc()\fP function that was
+used. When the time comes to free the block, this function is called.
+.P
+A general context can be copied by calling:
+.sp
+.nf
+.B pcre2_general_context *pcre2_general_context_copy(
+.B "  pcre2_general_context *\fIgcontext\fP);"
+.fi
+.sp
+The memory used for a general context should be freed by calling:
+.sp
+.nf
+.B void pcre2_general_context_free(pcre2_general_context *\fIgcontext\fP);
+.fi
+.sp
+.
+.
+.\" HTML <a name="compilecontext"></a>
+.SS "The compile context"
+.rs
+.sp
+A compile context is required if you want to change the default values of any
+of the following compile-time parameters:
+.sp
+  What \eR matches (Unicode newlines or CR, LF, CRLF only)
+  PCRE2's character tables
+  The newline character sequence
+  The compile time nested parentheses limit
+  The maximum length of the pattern string
+  An external function for stack checking
+.sp
+A compile context is also required if you are using custom memory management.
+If none of these apply, just pass NULL as the context argument of
+\fIpcre2_compile()\fP.
+.P
+A compile context is created, copied, and freed by the following functions:
+.sp
+.nf
+.B pcre2_compile_context *pcre2_compile_context_create(
+.B "  pcre2_general_context *\fIgcontext\fP);"
+.sp
+.B pcre2_compile_context *pcre2_compile_context_copy(
+.B "  pcre2_compile_context *\fIccontext\fP);"
+.sp
+.B void pcre2_compile_context_free(pcre2_compile_context *\fIccontext\fP);
+.fi
+.sp
+A compile context is created with default values for its parameters. These can
+be changed by calling the following functions, which return 0 on success, or
+PCRE2_ERROR_BADDATA if invalid data is detected.
+.sp
+.nf
+.B int pcre2_set_bsr(pcre2_compile_context *\fIccontext\fP,
+.B "  uint32_t \fIvalue\fP);"
+.fi
+.sp
+The value must be PCRE2_BSR_ANYCRLF, to specify that \eR matches only CR, LF,
+or CRLF, or PCRE2_BSR_UNICODE, to specify that \eR matches any Unicode line
+ending sequence. The value is used by the JIT compiler and by the two
+interpreted matching functions, \fIpcre2_match()\fP and
+\fIpcre2_dfa_match()\fP.
+.sp
+.nf
+.B int pcre2_set_character_tables(pcre2_compile_context *\fIccontext\fP,
+.B "  const unsigned char *\fItables\fP);"
+.fi
+.sp
+The value must be the result of a call to \fIpcre2_maketables()\fP, whose only
+argument is a general context. This function builds a set of character tables
+in the current locale.
+.sp
+.nf
+.B int pcre2_set_max_pattern_length(pcre2_compile_context *\fIccontext\fP,
+.B "  PCRE2_SIZE \fIvalue\fP);"
+.fi
+.sp
+This sets a maximum length, in code units, for the pattern string that is to be
+compiled. If the pattern is longer, an error is generated. This facility is
+provided so that applications that accept patterns from external sources can
+limit their size. The default is the largest number that a PCRE2_SIZE variable
+can hold, which is effectively unlimited.
+.sp
+.nf
+.B int pcre2_set_newline(pcre2_compile_context *\fIccontext\fP,
+.B "  uint32_t \fIvalue\fP);"
+.fi
+.sp
+This specifies which characters or character sequences are to be recognized as
+newlines. The value must be one of PCRE2_NEWLINE_CR (carriage return only),
+PCRE2_NEWLINE_LF (linefeed only), PCRE2_NEWLINE_CRLF (the two-character
+sequence CR followed by LF), PCRE2_NEWLINE_ANYCRLF (any of the above), or
+PCRE2_NEWLINE_ANY (any Unicode newline sequence).
+.P
+When a pattern is compiled with the PCRE2_EXTENDED option, the value of this
+parameter affects the recognition of white space and the end of internal
+comments starting with #. The value is saved with the compiled pattern for
+subsequent use by the JIT compiler and by the two interpreted matching
+functions, \fIpcre2_match()\fP and \fIpcre2_dfa_match()\fP.
+.sp
+.nf
+.B int pcre2_set_parens_nest_limit(pcre2_compile_context *\fIccontext\fP,
+.B "  uint32_t \fIvalue\fP);"
+.fi
+.sp
+This parameter ajusts the limit, set when PCRE2 is built (default 250), on the
+depth of parenthesis nesting in a pattern. This limit stops rogue patterns
+using up too much system stack when being compiled.
+.sp
+.nf
+.B int pcre2_set_compile_recursion_guard(pcre2_compile_context *\fIccontext\fP,
+.B "  int (*\fIguard_function\fP)(uint32_t, void *), void *\fIuser_data\fP);"
+.fi
+.sp
+There is at least one application that runs PCRE2 in threads with very limited
+system stack, where running out of stack is to be avoided at all costs. The
+parenthesis limit above cannot take account of how much stack is actually
+available. For a finer control, you can supply a function that is called
+whenever \fBpcre2_compile()\fP starts to compile a parenthesized part of a
+pattern. This function can check the actual stack size (or anything else that
+it wants to, of course).
+.P
+The first argument to the callout function gives the current depth of
+nesting, and the second is user data that is set up by the last argument of
+\fBpcre2_set_compile_recursion_guard()\fP. The callout function should return
+zero if all is well, or non-zero to force an error.
+.
+.
+.\" HTML <a name="matchcontext"></a>
+.SS "The match context"
+.rs
+.sp
+A match context is required if you want to change the default values of any
+of the following match-time parameters:
+.sp
+  A callout function
+  The offset limit for matching an unanchored pattern
+  The limit for calling \fBmatch()\fP (see below)
+  The limit for calling \fBmatch()\fP recursively
+.sp
+A match context is also required if you are using custom memory management.
+If none of these apply, just pass NULL as the context argument of
+\fBpcre2_match()\fP, \fBpcre2_dfa_match()\fP, or \fBpcre2_jit_match()\fP.
+.P
+A match context is created, copied, and freed by the following functions:
+.sp
+.nf
+.B pcre2_match_context *pcre2_match_context_create(
+.B "  pcre2_general_context *\fIgcontext\fP);"
+.sp
+.B pcre2_match_context *pcre2_match_context_copy(
+.B "  pcre2_match_context *\fImcontext\fP);"
+.sp
+.B void pcre2_match_context_free(pcre2_match_context *\fImcontext\fP);
+.fi
+.sp
+A match context is created with default values for its parameters. These can
+be changed by calling the following functions, which return 0 on success, or
+PCRE2_ERROR_BADDATA if invalid data is detected.
+.sp
+.nf
+.B int pcre2_set_callout(pcre2_match_context *\fImcontext\fP,
+.B "  int (*\fIcallout_function\fP)(pcre2_callout_block *, void *),"
+.B "  void *\fIcallout_data\fP);"
+.fi
+.sp
+This sets up a "callout" function, which PCRE2 will call at specified points
+during a matching operation. Details are given in the
+.\" HREF
+\fBpcre2callout\fP
+.\"
+documentation.
+.sp
+.nf
+.B int pcre2_set_offset_limit(pcre2_match_context *\fImcontext\fP,
+.B "  PCRE2_SIZE \fIvalue\fP);"
+.fi
+.sp
+The \fIoffset_limit\fP parameter limits how far an unanchored search can
+advance in the subject string. The default value is PCRE2_UNSET. The
+\fBpcre2_match()\fP and \fBpcre2_dfa_match()\fP functions return
+PCRE2_ERROR_NOMATCH if a match with a starting point before or at the given
+offset is not found. For example, if the pattern /abc/ is matched against
+"123abc" with an offset limit less than 3, the result is PCRE2_ERROR_NO_MATCH.
+A match can never be found if the \fIstartoffset\fP argument of
+\fBpcre2_match()\fP or \fBpcre2_dfa_match()\fP is greater than the offset
+limit.
+.P
+When using this facility, you must set PCRE2_USE_OFFSET_LIMIT when calling
+\fBpcre2_compile()\fP so that when JIT is in use, different code can be
+compiled. If a match is started with a non-default match limit when
+PCRE2_USE_OFFSET_LIMIT is not set, an error is generated.
+.P
+The offset limit facility can be used to track progress when searching large
+subject strings. See also the PCRE2_FIRSTLINE option, which requires a match to
+start within the first line of the subject. If this is set with an offset
+limit, a match must occur in the first line and also within the offset limit.
+In other words, whichever limit comes first is used.
+.sp
+.nf
+.B int pcre2_set_match_limit(pcre2_match_context *\fImcontext\fP,
+.B "  uint32_t \fIvalue\fP);"
+.fi
+.sp
+The \fImatch_limit\fP parameter provides a means of preventing PCRE2 from using
+up too many resources when processing patterns that are not going to match, but
+which have a very large number of possibilities in their search trees. The
+classic example is a pattern that uses nested unlimited repeats.
+.P
+Internally, \fBpcre2_match()\fP uses a function called \fBmatch()\fP, which it
+calls repeatedly (sometimes recursively). The limit set by \fImatch_limit\fP is
+imposed on the number of times this function is called during a match, which
+has the effect of limiting the amount of backtracking that can take place. For
+patterns that are not anchored, the count restarts from zero for each position
+in the subject string. This limit is not relevant to \fBpcre2_dfa_match()\fP,
+which ignores it.
+.P
+When \fBpcre2_match()\fP is called with a pattern that was successfully
+processed by \fBpcre2_jit_compile()\fP, the way in which matching is executed
+is entirely different. However, there is still the possibility of runaway
+matching that goes on for a very long time, and so the \fImatch_limit\fP value
+is also used in this case (but in a different way) to limit how long the
+matching can continue.
+.P
+The default value for the limit can be set when PCRE2 is built; the default
+default is 10 million, which handles all but the most extreme cases. If the
+limit is exceeded, \fBpcre2_match()\fP returns PCRE2_ERROR_MATCHLIMIT. A value
+for the match limit may also be supplied by an item at the start of a pattern
+of the form
+.sp
+  (*LIMIT_MATCH=ddd)
+.sp
+where ddd is a decimal number. However, such a setting is ignored unless ddd is
+less than the limit set by the caller of \fBpcre2_match()\fP or, if no such
+limit is set, less than the default.
+.sp
+.nf
+.B int pcre2_set_recursion_limit(pcre2_match_context *\fImcontext\fP,
+.B "  uint32_t \fIvalue\fP);"
+.fi
+.sp
+The \fIrecursion_limit\fP parameter is similar to \fImatch_limit\fP, but
+instead of limiting the total number of times that \fBmatch()\fP is called, it
+limits the depth of recursion. The recursion depth is a smaller number than the
+total number of calls, because not all calls to \fBmatch()\fP are recursive.
+This limit is of use only if it is set smaller than \fImatch_limit\fP.
+.P
+Limiting the recursion depth limits the amount of system stack that can be
+used, or, when PCRE2 has been compiled to use memory on the heap instead of the
+stack, the amount of heap memory that can be used. This limit is not relevant,
+and is ignored, when matching is done using JIT compiled code or by the
+\fBpcre2_dfa_match()\fP function.
+.P
+The default value for \fIrecursion_limit\fP can be set when PCRE2 is built; the
+default default is the same value as the default for \fImatch_limit\fP. If the
+limit is exceeded, \fBpcre2_match()\fP returns PCRE2_ERROR_RECURSIONLIMIT. A
+value for the recursion limit may also be supplied by an item at the start of a
+pattern of the form
+.sp
+  (*LIMIT_RECURSION=ddd)
+.sp
+where ddd is a decimal number. However, such a setting is ignored unless ddd is
+less than the limit set by the caller of \fBpcre2_match()\fP or, if no such
+limit is set, less than the default.
+.sp
+.nf
+.B int pcre2_set_recursion_memory_management(
+.B "  pcre2_match_context *\fImcontext\fP,"
+.B "  void *(*\fIprivate_malloc\fP)(PCRE2_SIZE, void *),"
+.B "  void (*\fIprivate_free\fP)(void *, void *), void *\fImemory_data\fP);"
+.fi
+.sp
+This function sets up two additional custom memory management functions for use
+by \fBpcre2_match()\fP when PCRE2 is compiled to use the heap for remembering
+backtracking data, instead of recursive function calls that use the system
+stack. There is a discussion about PCRE2's stack usage in the
+.\" HREF
+\fBpcre2stack\fP
+.\"
+documentation. See the
+.\" HREF
+\fBpcre2build\fP
+.\"
+documentation for details of how to build PCRE2.
+.P
+Using the heap for recursion is a non-standard way of building PCRE2, for use
+in environments that have limited stacks. Because of the greater use of memory
+management, \fBpcre2_match()\fP runs more slowly. Functions that are different
+to the general custom memory functions are provided so that special-purpose
+external code can be used for this case, because the memory blocks are all the
+same size. The blocks are retained by \fBpcre2_match()\fP until it is about to
+exit so that they can be re-used when possible during the match. In the absence
+of these functions, the normal custom memory management functions are used, if
+supplied, otherwise the system functions.
+.
+.
+.SH "CHECKING BUILD-TIME OPTIONS"
+.rs
+.sp
+.B int pcre2_config(uint32_t \fIwhat\fP, void *\fIwhere\fP);
+.P
+The function \fBpcre2_config()\fP makes it possible for a PCRE2 client to
+discover which optional features have been compiled into the PCRE2 library. The
+.\" HREF
+\fBpcre2build\fP
+.\"
+documentation has more details about these optional features.
+.P
+The first argument for \fBpcre2_config()\fP specifies which information is
+required. The second argument is a pointer to memory into which the information
+is placed. If NULL is passed, the function returns the amount of memory that is
+needed for the requested information. For calls that return numerical values,
+the value is in bytes; when requesting these values, \fIwhere\fP should point
+to appropriately aligned memory. For calls that return strings, the required
+length is given in code units, not counting the terminating zero.
+.P
+When requesting information, the returned value from \fBpcre2_config()\fP is
+non-negative on success, or the negative error code PCRE2_ERROR_BADOPTION if
+the value in the first argument is not recognized. The following information is
+available:
+.sp
+  PCRE2_CONFIG_BSR
+.sp
+The output is a uint32_t integer whose value indicates what character
+sequences the \eR escape sequence matches by default. A value of
+PCRE2_BSR_UNICODE means that \eR matches any Unicode line ending sequence; a
+value of PCRE2_BSR_ANYCRLF means that \eR matches only CR, LF, or CRLF. The
+default can be overridden when a pattern is compiled.
+.sp
+  PCRE2_CONFIG_JIT
+.sp
+The output is a uint32_t integer that is set to one if support for just-in-time
+compiling is available; otherwise it is set to zero.
+.sp
+  PCRE2_CONFIG_JITTARGET
+.sp
+The \fIwhere\fP argument should point to a buffer that is at least 48 code
+units long. (The exact length required can be found by calling
+\fBpcre2_config()\fP with \fBwhere\fP set to NULL.) The buffer is filled with a
+string that contains the name of the architecture for which the JIT compiler is
+configured, for example "x86 32bit (little endian + unaligned)". If JIT support
+is not available, PCRE2_ERROR_BADOPTION is returned, otherwise the number of
+code units used is returned. This is the length of the string, plus one unit
+for the terminating zero.
+.sp
+  PCRE2_CONFIG_LINKSIZE
+.sp
+The output is a uint32_t integer that contains the number of bytes used for
+internal linkage in compiled regular expressions. When PCRE2 is configured, the
+value can be set to 2, 3, or 4, with the default being 2. This is the value
+that is returned by \fBpcre2_config()\fP. However, when the 16-bit library is
+compiled, a value of 3 is rounded up to 4, and when the 32-bit library is
+compiled, internal linkages always use 4 bytes, so the configured value is not
+relevant.
+.P
+The default value of 2 for the 8-bit and 16-bit libraries is sufficient for all
+but the most massive patterns, since it allows the size of the compiled pattern
+to be up to 64K code units. Larger values allow larger regular expressions to
+be compiled by those two libraries, but at the expense of slower matching.
+.sp
+  PCRE2_CONFIG_MATCHLIMIT
+.sp
+The output is a uint32_t integer that gives the default limit for the number of
+internal matching function calls in a \fBpcre2_match()\fP execution. Further
+details are given with \fBpcre2_match()\fP below.
+.sp
+  PCRE2_CONFIG_NEWLINE
+.sp
+The output is a uint32_t integer whose value specifies the default character
+sequence that is recognized as meaning "newline". The values are:
+.sp
+  PCRE2_NEWLINE_CR       Carriage return (CR)
+  PCRE2_NEWLINE_LF       Linefeed (LF)
+  PCRE2_NEWLINE_CRLF     Carriage return, linefeed (CRLF)
+  PCRE2_NEWLINE_ANY      Any Unicode line ending
+  PCRE2_NEWLINE_ANYCRLF  Any of CR, LF, or CRLF
+.sp
+The default should normally correspond to the standard sequence for your
+operating system.
+.sp
+  PCRE2_CONFIG_PARENSLIMIT
+.sp
+The output is a uint32_t integer that gives the maximum depth of nesting
+of parentheses (of any kind) in a pattern. This limit is imposed to cap the
+amount of system stack used when a pattern is compiled. It is specified when
+PCRE2 is built; the default is 250. This limit does not take into account the
+stack that may already be used by the calling application. For finer control
+over compilation stack usage, see \fBpcre2_set_compile_recursion_guard()\fP.
+.sp
+  PCRE2_CONFIG_RECURSIONLIMIT
+.sp
+The output is a uint32_t integer that gives the default limit for the depth of
+recursion when calling the internal matching function in a \fBpcre2_match()\fP
+execution. Further details are given with \fBpcre2_match()\fP below.
+.sp
+  PCRE2_CONFIG_STACKRECURSE
+.sp
+The output is a uint32_t integer that is set to one if internal recursion when
+running \fBpcre2_match()\fP is implemented by recursive function calls that use
+the system stack to remember their state. This is the usual way that PCRE2 is
+compiled. The output is zero if PCRE2 was compiled to use blocks of data on the
+heap instead of recursive function calls.
+.sp
+  PCRE2_CONFIG_UNICODE_VERSION
+.sp
+The \fIwhere\fP argument should point to a buffer that is at least 24 code
+units long. (The exact length required can be found by calling
+\fBpcre2_config()\fP with \fBwhere\fP set to NULL.) If PCRE2 has been compiled
+without Unicode support, the buffer is filled with the text "Unicode not
+supported". Otherwise, the Unicode version string (for example, "8.0.0") is
+inserted. The number of code units used is returned. This is the length of the
+string plus one unit for the terminating zero.
+.sp
+  PCRE2_CONFIG_UNICODE
+.sp
+The output is a uint32_t integer that is set to one if Unicode support is
+available; otherwise it is set to zero. Unicode support implies UTF support.
+.sp
+  PCRE2_CONFIG_VERSION
+.sp
+The \fIwhere\fP argument should point to a buffer that is at least 12 code
+units long. (The exact length required can be found by calling
+\fBpcre2_config()\fP with \fBwhere\fP set to NULL.) The buffer is filled with
+the PCRE2 version string, zero-terminated. The number of code units used is
+returned. This is the length of the string plus one unit for the terminating
+zero.
+.
+.
+.\" HTML <a name="compiling"></a>
+.SH "COMPILING A PATTERN"
+.rs
+.sp
+.nf
+.B pcre2_code *pcre2_compile(PCRE2_SPTR \fIpattern\fP, PCRE2_SIZE \fIlength\fP,
+.B "  uint32_t \fIoptions\fP, int *\fIerrorcode\fP, PCRE2_SIZE *\fIerroroffset,\fP"
+.B "  pcre2_compile_context *\fIccontext\fP);"
+.sp
+.B void pcre2_code_free(pcre2_code *\fIcode\fP);
+.fi
+.P
+The \fBpcre2_compile()\fP function compiles a pattern into an internal form.
+The pattern is defined by a pointer to a string of code units and a length, If
+the pattern is zero-terminated, the length can be specified as
+PCRE2_ZERO_TERMINATED. The function returns a pointer to a block of memory that
+contains the compiled pattern and related data. The caller must free the memory
+by calling \fBpcre2_code_free()\fP when it is no longer needed.
+.P
+NOTE: When one of the matching functions is called, pointers to the compiled
+pattern and the subject string are set in the match data block so that they can
+be referenced by the extraction functions. After running a match, you must not
+free a compiled pattern (or a subject string) until after all operations on the
+.\" HTML <a href="#matchdatablock">
+.\" </a>
+match data block
+.\"
+have taken place.
+.P
+If the compile context argument \fIccontext\fP is NULL, memory for the compiled
+pattern is obtained by calling \fBmalloc()\fP. Otherwise, it is obtained from
+the same memory function that was used for the compile context.
+.P
+The \fIoptions\fP argument contains various bit settings that affect the
+compilation. It should be zero if no options are required. The available
+options are described below. Some of them (in particular, those that are
+compatible with Perl, but some others as well) can also be set and unset from
+within the pattern (see the detailed description in the
+.\" HREF
+\fBpcre2pattern\fP
+.\"
+documentation).
+.P
+For those options that can be different in different parts of the pattern, the
+contents of the \fIoptions\fP argument specifies their settings at the start of
+compilation. The PCRE2_ANCHORED and PCRE2_NO_UTF_CHECK options can be set at
+the time of matching as well as at compile time.
+.P
+Other, less frequently required compile-time parameters (for example, the
+newline setting) can be provided in a compile context (as described
+.\" HTML <a href="#compilecontext">
+.\" </a>
+above).
+.\"
+.P
+If \fIerrorcode\fP or \fIerroroffset\fP is NULL, \fBpcre2_compile()\fP returns
+NULL immediately. Otherwise, if compilation of a pattern fails,
+\fBpcre2_compile()\fP returns NULL, having set these variables to an error code
+and an offset (number of code units) within the pattern, respectively. The
+\fBpcre2_get_error_message()\fP function provides a textual message for each
+error code. Compilation errors are positive numbers, but UTF formatting errors
+are negative numbers. For an invalid UTF-8 or UTF-16 string, the offset is that
+of the first code unit of the failing character.
+.P
+Some errors are not detected until the whole pattern has been scanned; in these
+cases, the offset passed back is the length of the pattern. Note that the
+offset is in code units, not characters, even in a UTF mode. It may sometimes
+point into the middle of a UTF-8 or UTF-16 character.
+.P
+This code fragment shows a typical straightforward call to
+\fBpcre2_compile()\fP:
+.sp
+  pcre2_code *re;
+  PCRE2_SIZE erroffset;
+  int errorcode;
+  re = pcre2_compile(
+    "^A.*Z",                /* the pattern */
+    PCRE2_ZERO_TERMINATED,  /* the pattern is zero-terminated */
+    0,                      /* default options */
+    &errorcode,             /* for error code */
+    &erroffset,             /* for error offset */
+    NULL);                  /* no compile context */
+.sp
+The following names for option bits are defined in the \fBpcre2.h\fP header
+file:
+.sp
+  PCRE2_ANCHORED
+.sp
+If this bit is set, the pattern is forced to be "anchored", that is, it is
+constrained to match only at the first matching point in the string that is
+being searched (the "subject string"). This effect can also be achieved by
+appropriate constructs in the pattern itself, which is the only way to do it in
+Perl.
+.sp
+  PCRE2_ALLOW_EMPTY_CLASS
+.sp
+By default, for compatibility with Perl, a closing square bracket that
+immediately follows an opening one is treated as a data character for the
+class. When PCRE2_ALLOW_EMPTY_CLASS is set, it terminates the class, which
+therefore contains no characters and so can never match.
+.sp
+  PCRE2_ALT_BSUX
+.sp
+This option request alternative handling of three escape sequences, which
+makes PCRE2's behaviour more like ECMAscript (aka JavaScript). When it is set:
+.P
+(1) \eU matches an upper case "U" character; by default \eU causes a compile
+time error (Perl uses \eU to upper case subsequent characters).
+.P
+(2) \eu matches a lower case "u" character unless it is followed by four
+hexadecimal digits, in which case the hexadecimal number defines the code point
+to match. By default, \eu causes a compile time error (Perl uses it to upper
+case the following character).
+.P
+(3) \ex matches a lower case "x" character unless it is followed by two
+hexadecimal digits, in which case the hexadecimal number defines the code point
+to match. By default, as in Perl, a hexadecimal number is always expected after
+\ex, but it may have zero, one, or two digits (so, for example, \exz matches a
+binary zero character followed by z).
+.sp
+  PCRE2_ALT_CIRCUMFLEX
+.sp
+In multiline mode (when PCRE2_MULTILINE is set), the circumflex metacharacter
+matches at the start of the subject (unless PCRE2_NOTBOL is set), and also
+after any internal newline. However, it does not match after a newline at the
+end of the subject, for compatibility with Perl. If you want a multiline
+circumflex also to match after a terminating newline, you must set
+PCRE2_ALT_CIRCUMFLEX.
+.sp
+  PCRE2_ALT_VERBNAMES
+.sp
+By default, for compatibility with Perl, the name in any verb sequence such as
+(*MARK:NAME) is any sequence of characters that does not include a closing
+parenthesis. The name is not processed in any way, and it is not possible to
+include a closing parenthesis in the name. However, if the PCRE2_ALT_VERBNAMES
+option is set, normal backslash processing is applied to verb names and only an
+unescaped closing parenthesis terminates the name. A closing parenthesis can be
+included in a name either as \e) or between \eQ and \eE. If the PCRE2_EXTENDED
+option is set, unescaped whitespace in verb names is skipped and #-comments are
+recognized, exactly as in the rest of the pattern.
+.sp
+  PCRE2_AUTO_CALLOUT
+.sp
+If this bit is set, \fBpcre2_compile()\fP automatically inserts callout items,
+all with number 255, before each pattern item. For discussion of the callout
+facility, see the
+.\" HREF
+\fBpcre2callout\fP
+.\"
+documentation.
+.sp
+  PCRE2_CASELESS
+.sp
+If this bit is set, letters in the pattern match both upper and lower case
+letters in the subject. It is equivalent to Perl's /i option, and it can be
+changed within a pattern by a (?i) option setting.
+.sp
+  PCRE2_DOLLAR_ENDONLY
+.sp
+If this bit is set, a dollar metacharacter in the pattern matches only at the
+end of the subject string. Without this option, a dollar also matches
+immediately before a newline at the end of the string (but not before any other
+newlines). The PCRE2_DOLLAR_ENDONLY option is ignored if PCRE2_MULTILINE is
+set. There is no equivalent to this option in Perl, and no way to set it within
+a pattern.
+.sp
+  PCRE2_DOTALL
+.sp
+If this bit is set, a dot metacharacter in the pattern matches any character,
+including one that indicates a newline. However, it only ever matches one
+character, even if newlines are coded as CRLF. Without this option, a dot does
+not match when the current position in the subject is at a newline. This option
+is equivalent to Perl's /s option, and it can be changed within a pattern by a
+(?s) option setting. A negative class such as [^a] always matches newline
+characters, independent of the setting of this option.
+.sp
+  PCRE2_DUPNAMES
+.sp
+If this bit is set, names used to identify capturing subpatterns need not be
+unique. This can be helpful for certain types of pattern when it is known that
+only one instance of the named subpattern can ever be matched. There are more
+details of named subpatterns below; see also the
+.\" HREF
+\fBpcre2pattern\fP
+.\"
+documentation.
+.sp
+  PCRE2_EXTENDED
+.sp
+If this bit is set, most white space characters in the pattern are totally
+ignored except when escaped or inside a character class. However, white space
+is not allowed within sequences such as (?> that introduce various
+parenthesized subpatterns, nor within numerical quantifiers such as {1,3}.
+Ignorable white space is permitted between an item and a following quantifier
+and between a quantifier and a following + that indicates possessiveness.
+.P
+PCRE2_EXTENDED also causes characters between an unescaped # outside a
+character class and the next newline, inclusive, to be ignored, which makes it
+possible to include comments inside complicated patterns. Note that the end of
+this type of comment is a literal newline sequence in the pattern; escape
+sequences that happen to represent a newline do not count. PCRE2_EXTENDED is
+equivalent to Perl's /x option, and it can be changed within a pattern by a
+(?x) option setting.
+.P
+Which characters are interpreted as newlines can be specified by a setting in
+the compile context that is passed to \fBpcre2_compile()\fP or by a special
+sequence at the start of the pattern, as described in the section entitled
+.\" HTML <a href="pcre2pattern.html#newlines">
+.\" </a>
+"Newline conventions"
+.\"
+in the \fBpcre2pattern\fP documentation. A default is defined when PCRE2 is
+built.
+.sp
+  PCRE2_FIRSTLINE
+.sp
+If this option is set, an unanchored pattern is required to match before or at
+the first newline in the subject string, though the matched text may continue
+over the newline. See also PCRE2_USE_OFFSET_LIMIT, which provides a more
+general limiting facility. If PCRE2_FIRSTLINE is set with an offset limit, a
+match must occur in the first line and also within the offset limit. In other
+words, whichever limit comes first is used.
+.sp
+  PCRE2_MATCH_UNSET_BACKREF
+.sp
+If this option is set, a back reference to an unset subpattern group matches an
+empty string (by default this causes the current matching alternative to fail).
+A pattern such as (\e1)(a) succeeds when this option is set (assuming it can
+find an "a" in the subject), whereas it fails by default, for Perl
+compatibility. Setting this option makes PCRE2 behave more like ECMAscript (aka
+JavaScript).
+.sp
+  PCRE2_MULTILINE
+.sp
+By default, for the purposes of matching "start of line" and "end of line",
+PCRE2 treats the subject string as consisting of a single line of characters,
+even if it actually contains newlines. The "start of line" metacharacter (^)
+matches only at the start of the string, and the "end of line" metacharacter
+($) matches only at the end of the string, or before a terminating newline
+(except when PCRE2_DOLLAR_ENDONLY is set). Note, however, that unless
+PCRE2_DOTALL is set, the "any character" metacharacter (.) does not match at a
+newline. This behaviour (for ^, $, and dot) is the same as Perl.
+.P
+When PCRE2_MULTILINE it is set, the "start of line" and "end of line"
+constructs match immediately following or immediately before internal newlines
+in the subject string, respectively, as well as at the very start and end. This
+is equivalent to Perl's /m option, and it can be changed within a pattern by a
+(?m) option setting. Note that the "start of line" metacharacter does not match
+after a newline at the end of the subject, for compatibility with Perl.
+However, you can change this by setting the PCRE2_ALT_CIRCUMFLEX option. If
+there are no newlines in a subject string, or no occurrences of ^ or $ in a
+pattern, setting PCRE2_MULTILINE has no effect.
+.sp
+  PCRE2_NEVER_BACKSLASH_C
+.sp
+This option locks out the use of \eC in the pattern that is being compiled.
+This escape can cause unpredictable behaviour in UTF-8 or UTF-16 modes, because
+it may leave the current matching point in the middle of a multi-code-unit
+character. This option may be useful in applications that process patterns from
+external sources. Note that there is also a build-time option that permanently
+locks out the use of \eC.
+.sp
+  PCRE2_NEVER_UCP
+.sp
+This option locks out the use of Unicode properties for handling \eB, \eb, \eD,
+\ed, \eS, \es, \eW, \ew, and some of the POSIX character classes, as described
+for the PCRE2_UCP option below. In particular, it prevents the creator of the
+pattern from enabling this facility by starting the pattern with (*UCP). This
+option may be useful in applications that process patterns from external
+sources. The option combination PCRE_UCP and PCRE_NEVER_UCP causes an error.
+.sp
+  PCRE2_NEVER_UTF
+.sp
+This option locks out interpretation of the pattern as UTF-8, UTF-16, or
+UTF-32, depending on which library is in use. In particular, it prevents the
+creator of the pattern from switching to UTF interpretation by starting the
+pattern with (*UTF). This option may be useful in applications that process
+patterns from external sources. The combination of PCRE2_UTF and
+PCRE2_NEVER_UTF causes an error.
+.sp
+  PCRE2_NO_AUTO_CAPTURE
+.sp
+If this option is set, it disables the use of numbered capturing parentheses in
+the pattern. Any opening parenthesis that is not followed by ? behaves as if it
+were followed by ?: but named parentheses can still be used for capturing (and
+they acquire numbers in the usual way). There is no equivalent of this option
+in Perl.
+.sp
+  PCRE2_NO_AUTO_POSSESS
+.sp
+If this option is set, it disables "auto-possessification", which is an
+optimization that, for example, turns a+b into a++b in order to avoid
+backtracks into a+ that can never be successful. However, if callouts are in
+use, auto-possessification means that some callouts are never taken. You can
+set this option if you want the matching functions to do a full unoptimized
+search and run all the callouts, but it is mainly provided for testing
+purposes.
+.sp
+  PCRE2_NO_DOTSTAR_ANCHOR
+.sp
+If this option is set, it disables an optimization that is applied when .* is
+the first significant item in a top-level branch of a pattern, and all the
+other branches also start with .* or with \eA or \eG or ^. The optimization is
+automatically disabled for .* if it is inside an atomic group or a capturing
+group that is the subject of a back reference, or if the pattern contains
+(*PRUNE) or (*SKIP). When the optimization is not disabled, such a pattern is
+automatically anchored if PCRE2_DOTALL is set for all the .* items and
+PCRE2_MULTILINE is not set for any ^ items. Otherwise, the fact that any match
+must start either at the start of the subject or following a newline is
+remembered. Like other optimizations, this can cause callouts to be skipped.
+.sp
+  PCRE2_NO_START_OPTIMIZE
+.sp
+This is an option whose main effect is at matching time. It does not change
+what \fBpcre2_compile()\fP generates, but it does affect the output of the JIT
+compiler.
+.P
+There are a number of optimizations that may occur at the start of a match, in
+order to speed up the process. For example, if it is known that an unanchored
+match must start with a specific character, the matching code searches the
+subject for that character, and fails immediately if it cannot find it, without
+actually running the main matching function. This means that a special item
+such as (*COMMIT) at the start of a pattern is not considered until after a
+suitable starting point for the match has been found. Also, when callouts or
+(*MARK) items are in use, these "start-up" optimizations can cause them to be
+skipped if the pattern is never actually used. The start-up optimizations are
+in effect a pre-scan of the subject that takes place before the pattern is run.
+.P
+The PCRE2_NO_START_OPTIMIZE option disables the start-up optimizations,
+possibly causing performance to suffer, but ensuring that in cases where the
+result is "no match", the callouts do occur, and that items such as (*COMMIT)
+and (*MARK) are considered at every possible starting position in the subject
+string.
+.P
+Setting PCRE2_NO_START_OPTIMIZE may change the outcome of a matching operation.
+Consider the pattern
+.sp
+  (*COMMIT)ABC
+.sp
+When this is compiled, PCRE2 records the fact that a match must start with the
+character "A". Suppose the subject string is "DEFABC". The start-up
+optimization scans along the subject, finds "A" and runs the first match
+attempt from there. The (*COMMIT) item means that the pattern must match the
+current starting position, which in this case, it does. However, if the same
+match is run with PCRE2_NO_START_OPTIMIZE set, the initial scan along the
+subject string does not happen. The first match attempt is run starting from
+"D" and when this fails, (*COMMIT) prevents any further matches being tried, so
+the overall result is "no match". There are also other start-up optimizations.
+For example, a minimum length for the subject may be recorded. Consider the
+pattern
+.sp
+  (*MARK:A)(X|Y)
+.sp
+The minimum length for a match is one character. If the subject is "ABC", there
+will be attempts to match "ABC", "BC", and "C". An attempt to match an empty
+string at the end of the subject does not take place, because PCRE2 knows that
+the subject is now too short, and so the (*MARK) is never encountered. In this
+case, the optimization does not affect the overall match result, which is still
+"no match", but it does affect the auxiliary information that is returned.
+.sp
+  PCRE2_NO_UTF_CHECK
+.sp
+When PCRE2_UTF is set, the validity of the pattern as a UTF string is
+automatically checked. There are discussions about the validity of
+.\" HTML <a href="pcre2unicode.html#utf8strings">
+.\" </a>
+UTF-8 strings,
+.\"
+.\" HTML <a href="pcre2unicode.html#utf16strings">
+.\" </a>
+UTF-16 strings,
+.\"
+and
+.\" HTML <a href="pcre2unicode.html#utf32strings">
+.\" </a>
+UTF-32 strings
+.\"
+in the
+.\" HREF
+\fBpcre2unicode\fP
+.\"
+document.
+If an invalid UTF sequence is found, \fBpcre2_compile()\fP returns a negative
+error code.
+.P
+If you know that your pattern is valid, and you want to skip this check for
+performance reasons, you can set the PCRE2_NO_UTF_CHECK option. When it is set,
+the effect of passing an invalid UTF string as a pattern is undefined. It may
+cause your program to crash or loop. Note that this option can also be passed
+to \fBpcre2_match()\fP and \fBpcre_dfa_match()\fP, to suppress validity
+checking of the subject string.
+.sp
+  PCRE2_UCP
+.sp
+This option changes the way PCRE2 processes \eB, \eb, \eD, \ed, \eS, \es, \eW,
+\ew, and some of the POSIX character classes. By default, only ASCII characters
+are recognized, but if PCRE2_UCP is set, Unicode properties are used instead to
+classify characters. More details are given in the section on
+.\" HTML <a href="pcre2pattern.html#genericchartypes">
+.\" </a>
+generic character types
+.\"
+in the
+.\" HREF
+\fBpcre2pattern\fP
+.\"
+page. If you set PCRE2_UCP, matching one of the items it affects takes much
+longer. The option is available only if PCRE2 has been compiled with Unicode
+support.
+.sp
+  PCRE2_UNGREEDY
+.sp
+This option inverts the "greediness" of the quantifiers so that they are not
+greedy by default, but become greedy if followed by "?". It is not compatible
+with Perl. It can also be set by a (?U) option setting within the pattern.
+.sp
+  PCRE2_USE_OFFSET_LIMIT
+.sp
+This option must be set for \fBpcre2_compile()\fP if
+\fBpcre2_set_offset_limit()\fP is going to be used to set a non-default offset
+limit in a match context for matches that use this pattern. An error is
+generated if an offset limit is set without this option. For more details, see
+the description of \fBpcre2_set_offset_limit()\fP in the
+.\" HTML <a href="#matchcontext">
+.\" </a>
+section
+.\"
+that describes match contexts. See also the PCRE2_FIRSTLINE
+option above.
+.sp
+  PCRE2_UTF
+.sp
+This option causes PCRE2 to regard both the pattern and the subject strings
+that are subsequently processed as strings of UTF characters instead of
+single-code-unit strings. It is available when PCRE2 is built to include
+Unicode support (which is the default). If Unicode support is not available,
+the use of this option provokes an error. Details of how this option changes
+the behaviour of PCRE2 are given in the
+.\" HREF
+\fBpcre2unicode\fP
+.\"
+page.
+.
+.
+.SH "COMPILATION ERROR CODES"
+.rs
+.sp
+There are over 80 positive error codes that \fBpcre2_compile()\fP may return if
+it finds an error in the pattern. There are also some negative error codes that
+are used for invalid UTF strings. These are the same as given by
+\fBpcre2_match()\fP and \fBpcre2_dfa_match()\fP, and are described in the
+.\" HREF
+\fBpcre2unicode\fP
+.\"
+page. The \fBpcre2_get_error_message()\fP function can be called to obtain a
+textual error message from any error code.
+.
+.
+.SH "JUST-IN-TIME (JIT) COMPILATION"
+.rs
+.sp
+.nf
+.B int pcre2_jit_compile(pcre2_code *\fIcode\fP, uint32_t \fIoptions\fP);
+.sp
+.B int pcre2_jit_match(const pcre2_code *\fIcode\fP, PCRE2_SPTR \fIsubject\fP,
+.B "  PCRE2_SIZE \fIlength\fP, PCRE2_SIZE \fIstartoffset\fP,"
+.B "  uint32_t \fIoptions\fP, pcre2_match_data *\fImatch_data\fP,"
+.B "  pcre2_match_context *\fImcontext\fP);"
+.sp
+.B void pcre2_jit_free_unused_memory(pcre2_general_context *\fIgcontext\fP);
+.sp
+.B pcre2_jit_stack *pcre2_jit_stack_create(PCRE2_SIZE \fIstartsize\fP,
+.B "  PCRE2_SIZE \fImaxsize\fP, pcre2_general_context *\fIgcontext\fP);"
+.sp
+.B void pcre2_jit_stack_assign(pcre2_match_context *\fImcontext\fP,
+.B "  pcre2_jit_callback \fIcallback_function\fP, void *\fIcallback_data\fP);"
+.sp
+.B void pcre2_jit_stack_free(pcre2_jit_stack *\fIjit_stack\fP);
+.fi
+.P
+These functions provide support for JIT compilation, which, if the just-in-time
+compiler is available, further processes a compiled pattern into machine code
+that executes much faster than the \fBpcre2_match()\fP interpretive matching
+function. Full details are given in the
+.\" HREF
+\fBpcre2jit\fP
+.\"
+documentation.
+.P
+JIT compilation is a heavyweight optimization. It can take some time for
+patterns to be analyzed, and for one-off matches and simple patterns the
+benefit of faster execution might be offset by a much slower compilation time.
+Most, but not all patterns can be optimized by the JIT compiler.
+.
+.
+.\" HTML <a name="localesupport"></a>
+.SH "LOCALE SUPPORT"
+.rs
+.sp
+PCRE2 handles caseless matching, and determines whether characters are letters,
+digits, or whatever, by reference to a set of tables, indexed by character code
+point. This applies only to characters whose code points are less than 256. By
+default, higher-valued code points never match escapes such as \ew or \ed.
+However, if PCRE2 is built with UTF support, all characters can be tested with
+\ep and \eP, or, alternatively, the PCRE2_UCP option can be set when a pattern
+is compiled; this causes \ew and friends to use Unicode property support
+instead of the built-in tables.
+.P
+The use of locales with Unicode is discouraged. If you are handling characters
+with code points greater than 128, you should either use Unicode support, or
+use locales, but not try to mix the two.
+.P
+PCRE2 contains an internal set of character tables that are used by default.
+These are sufficient for many applications. Normally, the internal tables
+recognize only ASCII characters. However, when PCRE2 is built, it is possible
+to cause the internal tables to be rebuilt in the default "C" locale of the
+local system, which may cause them to be different.
+.P
+The internal tables can be overridden by tables supplied by the application
+that calls PCRE2. These may be created in a different locale from the default.
+As more and more applications change to using Unicode, the need for this locale
+support is expected to die away.
+.P
+External tables are built by calling the \fBpcre2_maketables()\fP function, in
+the relevant locale. The result can be passed to \fBpcre2_compile()\fP as often
+as necessary, by creating a compile context and calling
+\fBpcre2_set_character_tables()\fP to set the tables pointer therein. For
+example, to build and use tables that are appropriate for the French locale
+(where accented characters with values greater than 128 are treated as
+letters), the following code could be used:
+.sp
+  setlocale(LC_CTYPE, "fr_FR");
+  tables = pcre2_maketables(NULL);
+  ccontext = pcre2_compile_context_create(NULL);
+  pcre2_set_character_tables(ccontext, tables);
+  re = pcre2_compile(..., ccontext);
+.sp
+The locale name "fr_FR" is used on Linux and other Unix-like systems; if you
+are using Windows, the name for the French locale is "french". It is the
+caller's responsibility to ensure that the memory containing the tables remains
+available for as long as it is needed.
+.P
+The pointer that is passed (via the compile context) to \fBpcre2_compile()\fP
+is saved with the compiled pattern, and the same tables are used by
+\fBpcre2_match()\fP and \fBpcre_dfa_match()\fP. Thus, for any single pattern,
+compilation, and matching all happen in the same locale, but different patterns
+can be processed in different locales.
+.
+.
+.\" HTML <a name="infoaboutpattern"></a>
+.SH "INFORMATION ABOUT A COMPILED PATTERN"
+.rs
+.sp
+.nf
+.B int pcre2_pattern_info(const pcre2 *\fIcode\fP, uint32_t \fIwhat\fP, void *\fIwhere\fP);
+.fi
+.P
+The \fBpcre2_pattern_info()\fP function returns general information about a
+compiled pattern. For information about callouts, see the
+.\" HTML <a href="pcre2pattern.html#infoaboutcallouts">
+.\" </a>
+next section.
+.\"
+The first argument for \fBpcre2_pattern_info()\fP is a pointer to the compiled
+pattern. The second argument specifies which piece of information is required,
+and the third argument is a pointer to a variable to receive the data. If the
+third argument is NULL, the first argument is ignored, and the function returns
+the size in bytes of the variable that is required for the information
+requested. Otherwise, The yield of the function is zero for success, or one of
+the following negative numbers:
+.sp
+  PCRE2_ERROR_NULL           the argument \fIcode\fP was NULL
+  PCRE2_ERROR_BADMAGIC       the "magic number" was not found
+  PCRE2_ERROR_BADOPTION      the value of \fIwhat\fP was invalid
+  PCRE2_ERROR_UNSET          the requested field is not set
+.sp
+The "magic number" is placed at the start of each compiled pattern as an simple
+check against passing an arbitrary memory pointer. Here is a typical call of
+\fBpcre2_pattern_info()\fP, to obtain the length of the compiled pattern:
+.sp
+  int rc;
+  size_t length;
+  rc = pcre2_pattern_info(
+    re,               /* result of pcre2_compile() */
+    PCRE2_INFO_SIZE,  /* what is required */
+    &length);         /* where to put the data */
+.sp
+The possible values for the second argument are defined in \fBpcre2.h\fP, and
+are as follows:
+.sp
+  PCRE2_INFO_ALLOPTIONS
+  PCRE2_INFO_ARGOPTIONS
+.sp
+Return a copy of the pattern's options. The third argument should point to a
+\fBuint32_t\fP variable. PCRE2_INFO_ARGOPTIONS returns exactly the options that
+were passed to \fBpcre2_compile()\fP, whereas PCRE2_INFO_ALLOPTIONS returns
+the compile options as modified by any top-level option settings such as (*UTF)
+at the start of the pattern itself. For example, if the pattern /(*UTF)abc/ is
+compiled with the PCRE2_EXTENDED option, the result is PCRE2_EXTENDED and
+PCRE2_UTF.
+.P
+A pattern compiled without PCRE2_ANCHORED is automatically anchored by PCRE2 if
+the first significant item in every top-level branch is one of the following:
+.sp
+  ^     unless PCRE2_MULTILINE is set
+  \eA    always
+  \eG    always
+  .*    sometimes - see below
+.sp
+When .* is the first significant item, anchoring is possible only when all the
+following are true:
+.sp
+  .* is not in an atomic group
+.\" JOIN
+  .* is not in a capturing group that is the subject
+       of a back reference
+  PCRE2_DOTALL is in force for .*
+  Neither (*PRUNE) nor (*SKIP) appears in the pattern.
+  PCRE2_NO_DOTSTAR_ANCHOR is not set.
+.sp
+For patterns that are auto-anchored, the PCRE2_ANCHORED bit is set in the
+options returned for PCRE2_INFO_ALLOPTIONS.
+.sp
+  PCRE2_INFO_BACKREFMAX
+.sp
+Return the number of the highest back reference in the pattern. The third
+argument should point to an \fBuint32_t\fP variable. Named subpatterns acquire
+numbers as well as names, and these count towards the highest back reference.
+Back references such as \e4 or \eg{12} match the captured characters of the
+given group, but in addition, the check that a capturing group is set in a
+conditional subpattern such as (?(3)a|b) is also a back reference. Zero is
+returned if there are no back references.
+.sp
+  PCRE2_INFO_BSR
+.sp
+The output is a uint32_t whose value indicates what character sequences the \eR
+escape sequence matches. A value of PCRE2_BSR_UNICODE means that \eR matches
+any Unicode line ending sequence; a value of PCRE2_BSR_ANYCRLF means that \eR
+matches only CR, LF, or CRLF.
+.sp
+  PCRE2_INFO_CAPTURECOUNT
+.sp
+Return the highest capturing subpattern number in the pattern. In patterns
+where (?| is not used, this is also the total number of capturing subpatterns.
+The third argument should point to an \fBuint32_t\fP variable.
+.sp
+  PCRE2_INFO_FIRSTBITMAP
+.sp
+In the absence of a single first code unit for a non-anchored pattern,
+\fBpcre2_compile()\fP may construct a 256-bit table that defines a fixed set of
+values for the first code unit in any match. For example, a pattern that starts
+with [abc] results in a table with three bits set. When code unit values
+greater than 255 are supported, the flag bit for 255 means "any code unit of
+value 255 or above". If such a table was constructed, a pointer to it is
+returned. Otherwise NULL is returned. The third argument should point to an
+\fBconst uint8_t *\fP variable.
+.sp
+  PCRE2_INFO_FIRSTCODETYPE
+.sp
+Return information about the first code unit of any matched string, for a
+non-anchored pattern. The third argument should point to an \fBuint32_t\fP
+variable. If there is a fixed first value, for example, the letter "c" from a
+pattern such as (cat|cow|coyote), 1 is returned, and the character value can be
+retrieved using PCRE2_INFO_FIRSTCODEUNIT. If there is no fixed first value, but
+it is known that a match can occur only at the start of the subject or
+following a newline in the subject, 2 is returned. Otherwise, and for anchored
+patterns, 0 is returned.
+.sp
+  PCRE2_INFO_FIRSTCODEUNIT
+.sp
+Return the value of the first code unit of any matched string in the situation
+where PCRE2_INFO_FIRSTCODETYPE returns 1; otherwise return 0. The third
+argument should point to an \fBuint32_t\fP variable. In the 8-bit library, the
+value is always less than 256. In the 16-bit library the value can be up to
+0xffff. In the 32-bit library in UTF-32 mode the value can be up to 0x10ffff,
+and up to 0xffffffff when not using UTF-32 mode.
+.sp
+  PCRE2_INFO_HASBACKSLASHC
+.sp
+Return 1 if the pattern contains any instances of \eC, otherwise 0. The third
+argument should point to an \fBuint32_t\fP variable.
+.sp
+  PCRE2_INFO_HASCRORLF
+.sp
+Return 1 if the pattern contains any explicit matches for CR or LF characters,
+otherwise 0. The third argument should point to an \fBuint32_t\fP variable. An
+explicit match is either a literal CR or LF character, or \er or \en.
+.sp
+  PCRE2_INFO_JCHANGED
+.sp
+Return 1 if the (?J) or (?-J) option setting is used in the pattern, otherwise
+0. The third argument should point to an \fBuint32_t\fP variable. (?J) and
+(?-J) set and unset the local PCRE2_DUPNAMES option, respectively.
+.sp
+  PCRE2_INFO_JITSIZE
+.sp
+If the compiled pattern was successfully processed by
+\fBpcre2_jit_compile()\fP, return the size of the JIT compiled code, otherwise
+return zero. The third argument should point to a \fBsize_t\fP variable.
+.sp
+  PCRE2_INFO_LASTCODETYPE
+.sp
+Returns 1 if there is a rightmost literal code unit that must exist in any
+matched string, other than at its start. The third argument should  point to an
+\fBuint32_t\fP variable. If there is no such value, 0 is returned. When 1 is
+returned, the code unit value itself can be retrieved using
+PCRE2_INFO_LASTCODEUNIT. For anchored patterns, a last literal value is
+recorded only if it follows something of variable length. For example, for the
+pattern /^a\ed+z\ed+/ the returned value is 1 (with "z" returned from
+PCRE2_INFO_LASTCODEUNIT), but for /^a\edz\ed/ the returned value is 0.
+.sp
+  PCRE2_INFO_LASTCODEUNIT
+.sp
+Return the value of the rightmost literal data unit that must exist in any
+matched string, other than at its start, if such a value has been recorded. The
+third argument should point to an \fBuint32_t\fP variable. If there is no such
+value, 0 is returned.
+.sp
+  PCRE2_INFO_MATCHEMPTY
+.sp
+Return 1 if the pattern might match an empty string, otherwise 0. The third
+argument should point to an \fBuint32_t\fP variable. When a pattern contains
+recursive subroutine calls it is not always possible to determine whether or
+not it can match an empty string. PCRE2 takes a cautious approach and returns 1
+in such cases.
+.sp
+  PCRE2_INFO_MATCHLIMIT
+.sp
+If the pattern set a match limit by including an item of the form
+(*LIMIT_MATCH=nnnn) at the start, the value is returned. The third argument
+should point to an unsigned 32-bit integer. If no such value has been set, the
+call to \fBpcre2_pattern_info()\fP returns the error PCRE2_ERROR_UNSET.
+.sp
+  PCRE2_INFO_MAXLOOKBEHIND
+.sp
+Return the number of characters (not code units) in the longest lookbehind
+assertion in the pattern. The third argument should point to an unsigned 32-bit
+integer. This information is useful when doing multi-segment matching using the
+partial matching facilities. Note that the simple assertions \eb and \eB
+require a one-character lookbehind. \eA also registers a one-character
+lookbehind, though it does not actually inspect the previous character. This is
+to ensure that at least one character from the old segment is retained when a
+new segment is processed. Otherwise, if there are no lookbehinds in the
+pattern, \eA might match incorrectly at the start of a new segment.
+.sp
+  PCRE2_INFO_MINLENGTH
+.sp
+If a minimum length for matching subject strings was computed, its value is
+returned. Otherwise the returned value is 0. The value is a number of
+characters, which in UTF mode may be different from the number of code units.
+The third argument should point to an \fBuint32_t\fP variable. The value is a
+lower bound to the length of any matching string. There may not be any strings
+of that length that do actually match, but every string that does match is at
+least that long.
+.sp
+  PCRE2_INFO_NAMECOUNT
+  PCRE2_INFO_NAMEENTRYSIZE
+  PCRE2_INFO_NAMETABLE
+.sp
+PCRE2 supports the use of named as well as numbered capturing parentheses. The
+names are just an additional way of identifying the parentheses, which still
+acquire numbers. Several convenience functions such as
+\fBpcre2_substring_get_byname()\fP are provided for extracting captured
+substrings by name. It is also possible to extract the data directly, by first
+converting the name to a number in order to access the correct pointers in the
+output vector (described with \fBpcre2_match()\fP below). To do the conversion,
+you need to use the name-to-number map, which is described by these three
+values.
+.P
+The map consists of a number of fixed-size entries. PCRE2_INFO_NAMECOUNT gives
+the number of entries, and PCRE2_INFO_NAMEENTRYSIZE gives the size of each
+entry in code units; both of these return a \fBuint32_t\fP value. The entry
+size depends on the length of the longest name.
+.P
+PCRE2_INFO_NAMETABLE returns a pointer to the first entry of the table. This is
+a PCRE2_SPTR pointer to a block of code units. In the 8-bit library, the first
+two bytes of each entry are the number of the capturing parenthesis, most
+significant byte first. In the 16-bit library, the pointer points to 16-bit
+code units, the first of which contains the parenthesis number. In the 32-bit
+library, the pointer points to 32-bit code units, the first of which contains
+the parenthesis number. The rest of the entry is the corresponding name, zero
+terminated.
+.P
+The names are in alphabetical order. If (?| is used to create multiple groups
+with the same number, as described in the
+.\" HTML <a href="pcre2pattern.html#dupsubpatternnumber">
+.\" </a>
+section on duplicate subpattern numbers
+.\"
+in the
+.\" HREF
+\fBpcre2pattern\fP
+.\"
+page, the groups may be given the same name, but there is only one entry in the
+table. Different names for groups of the same number are not permitted.
+.P
+Duplicate names for subpatterns with different numbers are permitted, but only
+if PCRE2_DUPNAMES is set. They appear in the table in the order in which they
+were found in the pattern. In the absence of (?| this is the order of
+increasing number; when (?| is used this is not necessarily the case because
+later subpatterns may have lower numbers.
+.P
+As a simple example of the name/number table, consider the following pattern
+after compilation by the 8-bit library (assume PCRE2_EXTENDED is set, so white
+space - including newlines - is ignored):
+.sp
+.\" JOIN
+  (?<date> (?<year>(\ed\ed)?\ed\ed) -
+  (?<month>\ed\ed) - (?<day>\ed\ed) )
+.sp
+There are four named subpatterns, so the table has four entries, and each entry
+in the table is eight bytes long. The table is as follows, with non-printing
+bytes shows in hexadecimal, and undefined bytes shown as ??:
+.sp
+  00 01 d  a  t  e  00 ??
+  00 05 d  a  y  00 ?? ??
+  00 04 m  o  n  t  h  00
+  00 02 y  e  a  r  00 ??
+.sp
+When writing code to extract data from named subpatterns using the
+name-to-number map, remember that the length of the entries is likely to be
+different for each compiled pattern.
+.sp
+  PCRE2_INFO_NEWLINE
+.sp
+The output is a \fBuint32_t\fP with one of the following values:
+.sp
+  PCRE2_NEWLINE_CR       Carriage return (CR)
+  PCRE2_NEWLINE_LF       Linefeed (LF)
+  PCRE2_NEWLINE_CRLF     Carriage return, linefeed (CRLF)
+  PCRE2_NEWLINE_ANY      Any Unicode line ending
+  PCRE2_NEWLINE_ANYCRLF  Any of CR, LF, or CRLF
+.sp
+This specifies the default character sequence that will be recognized as
+meaning "newline" while matching.
+.sp
+  PCRE2_INFO_RECURSIONLIMIT
+.sp
+If the pattern set a recursion limit by including an item of the form
+(*LIMIT_RECURSION=nnnn) at the start, the value is returned. The third
+argument should point to an unsigned 32-bit integer. If no such value has been
+set, the call to \fBpcre2_pattern_info()\fP returns the error PCRE2_ERROR_UNSET.
+.sp
+  PCRE2_INFO_SIZE
+.sp
+Return the size of the compiled pattern in bytes (for all three libraries). The
+third argument should point to a \fBsize_t\fP variable. This value includes the
+size of the general data block that precedes the code units of the compiled
+pattern itself. The value that is used when \fBpcre2_compile()\fP is getting
+memory in which to place the compiled pattern may be slightly larger than the
+value returned by this option, because there are cases where the code that
+calculates the size has to over-estimate. Processing a pattern with the JIT
+compiler does not alter the value returned by this option.
+.
+.
+.\" HTML <a name="infoaboutcallouts"></a>
+.SH "INFORMATION ABOUT A PATTERN'S CALLOUTS"
+.rs
+.sp
+.nf
+.B int pcre2_callout_enumerate(const pcre2_code *\fIcode\fP,
+.B "  int (*\fIcallback\fP)(pcre2_callout_enumerate_block *, void *),"
+.B "  void *\fIuser_data\fP);"
+.fi
+.sp
+A script language that supports the use of string arguments in callouts might
+like to scan all the callouts in a pattern before running the match. This can
+be done by calling \fBpcre2_callout_enumerate()\fP. The first argument is a
+pointer to a compiled pattern, the second points to a callback function, and
+the third is arbitrary user data. The callback function is called for every
+callout in the pattern in the order in which they appear. Its first argument is
+a pointer to a callout enumeration block, and its second argument is the
+\fIuser_data\fP value that was passed to \fBpcre2_callout_enumerate()\fP. The
+contents of the callout enumeration block are described in the
+.\" HREF
+\fBpcre2callout\fP
+.\"
+documentation, which also gives further details about callouts.
+.
+.
+.SH "SERIALIZATION AND PRECOMPILING"
+.rs
+.sp
+It is possible to save compiled patterns on disc or elsewhere, and reload them
+later, subject to a number of restrictions. The functions whose names begin
+with \fBpcre2_serialize_\fP are used for this purpose. They are described in
+the
+.\" HREF
+\fBpcre2serialize\fP
+.\"
+documentation.
+.
+.
+.\" HTML <a name="matchdatablock"></a>
+.SH "THE MATCH DATA BLOCK"
+.rs
+.sp
+.nf
+.B pcre2_match_data *pcre2_match_data_create(uint32_t \fIovecsize\fP,
+.B "  pcre2_general_context *\fIgcontext\fP);"
+.sp
+.B pcre2_match_data *pcre2_match_data_create_from_pattern(
+.B "  const pcre2_code *\fIcode\fP, pcre2_general_context *\fIgcontext\fP);"
+.sp
+.B void pcre2_match_data_free(pcre2_match_data *\fImatch_data\fP);
+.fi
+.P
+Information about a successful or unsuccessful match is placed in a match
+data block, which is an opaque structure that is accessed by function calls. In
+particular, the match data block contains a vector of offsets into the subject
+string that define the matched part of the subject and any substrings that were
+captured. This is know as the \fIovector\fP.
+.P
+Before calling \fBpcre2_match()\fP, \fBpcre2_dfa_match()\fP, or
+\fBpcre2_jit_match()\fP you must create a match data block by calling one of
+the creation functions above. For \fBpcre2_match_data_create()\fP, the first
+argument is the number of pairs of offsets in the \fIovector\fP. One pair of
+offsets is required to identify the string that matched the whole pattern, with
+another pair for each captured substring. For example, a value of 4 creates
+enough space to record the matched portion of the subject plus three captured
+substrings. A minimum of at least 1 pair is imposed by
+\fBpcre2_match_data_create()\fP, so it is always possible to return the overall
+matched string.
+.P
+The second argument of \fBpcre2_match_data_create()\fP is a pointer to a
+general context, which can specify custom memory management for obtaining the
+memory for the match data block. If you are not using custom memory management,
+pass NULL, which causes \fBmalloc()\fP to be used.
+.P
+For \fBpcre2_match_data_create_from_pattern()\fP, the first argument is a
+pointer to a compiled pattern. The ovector is created to be exactly the right
+size to hold all the substrings a pattern might capture. The second argument is
+again a pointer to a general context, but in this case if NULL is passed, the
+memory is obtained using the same allocator that was used for the compiled
+pattern (custom or default).
+.P
+A match data block can be used many times, with the same or different compiled
+patterns. You can extract information from a match data block after a match
+operation has finished, using functions that are described in the sections on
+.\" HTML <a href="#matchedstrings">
+.\" </a>
+matched strings
+.\"
+and
+.\" HTML <a href="#matchotherdata">
+.\" </a>
+other match data
+.\"
+below.
+.P
+When a call of \fBpcre2_match()\fP fails, valid data is available in the match
+block only when the error is PCRE2_ERROR_NOMATCH, PCRE2_ERROR_PARTIAL, or one
+of the error codes for an invalid UTF string. Exactly what is available depends
+on the error, and is detailed below.
+.P
+When one of the matching functions is called, pointers to the compiled pattern
+and the subject string are set in the match data block so that they can be
+referenced by the extraction functions. After running a match, you must not
+free a compiled pattern or a subject string until after all operations on the
+match data block (for that match) have taken place.
+.P
+When a match data block itself is no longer needed, it should be freed by
+calling \fBpcre2_match_data_free()\fP.
+.
+.
+.SH "MATCHING A PATTERN: THE TRADITIONAL FUNCTION"
+.rs
+.sp
+.nf
+.B int pcre2_match(const pcre2_code *\fIcode\fP, PCRE2_SPTR \fIsubject\fP,
+.B "  PCRE2_SIZE \fIlength\fP, PCRE2_SIZE \fIstartoffset\fP,"
+.B "  uint32_t \fIoptions\fP, pcre2_match_data *\fImatch_data\fP,"
+.B "  pcre2_match_context *\fImcontext\fP);"
+.fi
+.P
+The function \fBpcre2_match()\fP is called to match a subject string against a
+compiled pattern, which is passed in the \fIcode\fP argument. You can call
+\fBpcre2_match()\fP with the same \fIcode\fP argument as many times as you
+like, in order to find multiple matches in the subject string or to match
+different subject strings with the same pattern.
+.P
+This function is the main matching facility of the library, and it operates in
+a Perl-like manner. For specialist use there is also an alternative matching
+function, which is described
+.\" HTML <a href="#dfamatch">
+.\" </a>
+below
+.\"
+in the section about the \fBpcre2_dfa_match()\fP function.
+.P
+Here is an example of a simple call to \fBpcre2_match()\fP:
+.sp
+  pcre2_match_data *md = pcre2_match_data_create(4, NULL);
+  int rc = pcre2_match(
+    re,             /* result of pcre2_compile() */
+    "some string",  /* the subject string */
+    11,             /* the length of the subject string */
+    0,              /* start at offset 0 in the subject */
+    0,              /* default options */
+    match_data,     /* the match data block */
+    NULL);          /* a match context; NULL means use defaults */
+.sp
+If the subject string is zero-terminated, the length can be given as
+PCRE2_ZERO_TERMINATED. A match context must be provided if certain less common
+matching parameters are to be changed. For details, see the section on
+.\" HTML <a href="#matchcontext">
+.\" </a>
+the match context
+.\"
+above.
+.
+.
+.SS "The string to be matched by \fBpcre2_match()\fP"
+.rs
+.sp
+The subject string is passed to \fBpcre2_match()\fP as a pointer in
+\fIsubject\fP, a length in \fIlength\fP, and a starting offset in
+\fIstartoffset\fP. The length and offset are in code units, not characters.
+That is, they are in bytes for the 8-bit library, 16-bit code units for the
+16-bit library, and 32-bit code units for the 32-bit library, whether or not
+UTF processing is enabled.
+.P
+If \fIstartoffset\fP is greater than the length of the subject,
+\fBpcre2_match()\fP returns PCRE2_ERROR_BADOFFSET. When the starting offset is
+zero, the search for a match starts at the beginning of the subject, and this
+is by far the most common case. In UTF-8 or UTF-16 mode, the starting offset
+must point to the start of a character, or to the end of the subject (in UTF-32
+mode, one code unit equals one character, so all offsets are valid). Like the
+pattern string, the subject may contain binary zeroes.
+.P
+A non-zero starting offset is useful when searching for another match in the
+same subject by calling \fBpcre2_match()\fP again after a previous success.
+Setting \fIstartoffset\fP differs from passing over a shortened string and
+setting PCRE2_NOTBOL in the case of a pattern that begins with any kind of
+lookbehind. For example, consider the pattern
+.sp
+  \eBiss\eB
+.sp
+which finds occurrences of "iss" in the middle of words. (\eB matches only if
+the current position in the subject is not a word boundary.) When applied to
+the string "Mississipi" the first call to \fBpcre2_match()\fP finds the first
+occurrence. If \fBpcre2_match()\fP is called again with just the remainder of
+the subject, namely "issipi", it does not match, because \eB is always false at
+the start of the subject, which is deemed to be a word boundary. However, if
+\fBpcre2_match()\fP is passed the entire string again, but with
+\fIstartoffset\fP set to 4, it finds the second occurrence of "iss" because it
+is able to look behind the starting point to discover that it is preceded by a
+letter.
+.P
+Finding all the matches in a subject is tricky when the pattern can match an
+empty string. It is possible to emulate Perl's /g behaviour by first trying the
+match again at the same offset, with the PCRE2_NOTEMPTY_ATSTART and
+PCRE2_ANCHORED options, and then if that fails, advancing the starting offset
+and trying an ordinary match again. There is some code that demonstrates how to
+do this in the
+.\" HREF
+\fBpcre2demo\fP
+.\"
+sample program. In the most general case, you have to check to see if the
+newline convention recognizes CRLF as a newline, and if so, and the current
+character is CR followed by LF, advance the starting offset by two characters
+instead of one.
+.P
+If a non-zero starting offset is passed when the pattern is anchored, one
+attempt to match at the given offset is made. This can only succeed if the
+pattern does not require the match to be at the start of the subject.
+.
+.
+.\" HTML <a name="matchoptions"></a>
+.SS "Option bits for \fBpcre2_match()\fP"
+.rs
+.sp
+The unused bits of the \fIoptions\fP argument for \fBpcre2_match()\fP must be
+zero. The only bits that may be set are PCRE2_ANCHORED, PCRE2_NOTBOL,
+PCRE2_NOTEOL, PCRE2_NOTEMPTY, PCRE2_NOTEMPTY_ATSTART, PCRE2_NO_UTF_CHECK,
+PCRE2_PARTIAL_HARD, and PCRE2_PARTIAL_SOFT. Their action is described below.
+.P
+Setting PCRE2_ANCHORED at match time is not supported by the just-in-time (JIT)
+compiler. If it is set, JIT matching is disabled and the normal interpretive
+code in \fBpcre2_match()\fP is run. The remaining options are supported for JIT
+matching.
+.sp
+  PCRE2_ANCHORED
+.sp
+The PCRE2_ANCHORED option limits \fBpcre2_match()\fP to matching at the first
+matching position. If a pattern was compiled with PCRE2_ANCHORED, or turned out
+to be anchored by virtue of its contents, it cannot be made unachored at
+matching time. Note that setting the option at match time disables JIT
+matching.
+.sp
+  PCRE2_NOTBOL
+.sp
+This option specifies that first character of the subject string is not the
+beginning of a line, so the circumflex metacharacter should not match before
+it. Setting this without having set PCRE2_MULTILINE at compile time causes
+circumflex never to match. This option affects only the behaviour of the
+circumflex metacharacter. It does not affect \eA.
+.sp
+  PCRE2_NOTEOL
+.sp
+This option specifies that the end of the subject string is not the end of a
+line, so the dollar metacharacter should not match it nor (except in multiline
+mode) a newline immediately before it. Setting this without having set
+PCRE2_MULTILINE at compile time causes dollar never to match. This option
+affects only the behaviour of the dollar metacharacter. It does not affect \eZ
+or \ez.
+.sp
+  PCRE2_NOTEMPTY
+.sp
+An empty string is not considered to be a valid match if this option is set. If
+there are alternatives in the pattern, they are tried. If all the alternatives
+match the empty string, the entire match fails. For example, if the pattern
+.sp
+  a?b?
+.sp
+is applied to a string not beginning with "a" or "b", it matches an empty
+string at the start of the subject. With PCRE2_NOTEMPTY set, this match is not
+valid, so \fBpcre2_match()\fP searches further into the string for occurrences
+of "a" or "b".
+.sp
+  PCRE2_NOTEMPTY_ATSTART
+.sp
+This is like PCRE2_NOTEMPTY, except that it locks out an empty string match
+only at the first matching position, that is, at the start of the subject plus
+the starting offset. An empty string match later in the subject is permitted.
+If the pattern is anchored, such a match can occur only if the pattern contains
+\eK.
+.sp
+  PCRE2_NO_UTF_CHECK
+.sp
+When PCRE2_UTF is set at compile time, the validity of the subject as a UTF
+string is checked by default when \fBpcre2_match()\fP is subsequently called.
+If a non-zero starting offset is given, the check is applied only to that part
+of the subject that could be inspected during matching, and there is a check
+that the starting offset points to the first code unit of a character or to the
+end of the subject. If there are no lookbehind assertions in the pattern, the
+check starts at the starting offset. Otherwise, it starts at the length of the
+longest lookbehind before the starting offset, or at the start of the subject
+if there are not that many characters before the starting offset. Note that the
+sequences \eb and \eB are one-character lookbehinds.
+.P
+The check is carried out before any other processing takes place, and a
+negative error code is returned if the check fails. There are several UTF error
+codes for each code unit width, corresponding to different problems with the
+code unit sequence. There are discussions about the validity of
+.\" HTML <a href="pcre2unicode.html#utf8strings">
+.\" </a>
+UTF-8 strings,
+.\"
+.\" HTML <a href="pcre2unicode.html#utf16strings">
+.\" </a>
+UTF-16 strings,
+.\"
+and
+.\" HTML <a href="pcre2unicode.html#utf32strings">
+.\" </a>
+UTF-32 strings
+.\"
+in the
+.\" HREF
+\fBpcre2unicode\fP
+.\"
+page.
+.P
+If you know that your subject is valid, and you want to skip these checks for
+performance reasons, you can set the PCRE2_NO_UTF_CHECK option when calling
+\fBpcre2_match()\fP. You might want to do this for the second and subsequent
+calls to \fBpcre2_match()\fP if you are making repeated calls to find all the
+matches in a single subject string.
+.P
+NOTE: When PCRE2_NO_UTF_CHECK is set, the effect of passing an invalid string
+as a subject, or an invalid value of \fIstartoffset\fP, is undefined. Your
+program may crash or loop indefinitely.
+.sp
+  PCRE2_PARTIAL_HARD
+  PCRE2_PARTIAL_SOFT
+.sp
+These options turn on the partial matching feature. A partial match occurs if
+the end of the subject string is reached successfully, but there are not enough
+subject characters to complete the match. If this happens when
+PCRE2_PARTIAL_SOFT (but not PCRE2_PARTIAL_HARD) is set, matching continues by
+testing any remaining alternatives. Only if no complete match can be found is
+PCRE2_ERROR_PARTIAL returned instead of PCRE2_ERROR_NOMATCH. In other words,
+PCRE2_PARTIAL_SOFT specifies that the caller is prepared to handle a partial
+match, but only if no complete match can be found.
+.P
+If PCRE2_PARTIAL_HARD is set, it overrides PCRE2_PARTIAL_SOFT. In this case, if
+a partial match is found, \fBpcre2_match()\fP immediately returns
+PCRE2_ERROR_PARTIAL, without considering any other alternatives. In other
+words, when PCRE2_PARTIAL_HARD is set, a partial match is considered to be more
+important that an alternative complete match.
+.P
+There is a more detailed discussion of partial and multi-segment matching, with
+examples, in the
+.\" HREF
+\fBpcre2partial\fP
+.\"
+documentation.
+.
+.
+.
+.SH "NEWLINE HANDLING WHEN MATCHING"
+.rs
+.sp
+When PCRE2 is built, a default newline convention is set; this is usually the
+standard convention for the operating system. The default can be overridden in
+a
+.\" HTML <a href="#compilecontext">
+.\" </a>
+compile context
+.\"
+by calling \fBpcre2_set_newline()\fP. It can also be overridden by starting a
+pattern string with, for example, (*CRLF), as described in the
+.\" HTML <a href="pcre2pattern.html#newlines">
+.\" </a>
+section on newline conventions
+.\"
+in the
+.\" HREF
+\fBpcre2pattern\fP
+.\"
+page. During matching, the newline choice affects the behaviour of the dot,
+circumflex, and dollar metacharacters. It may also alter the way the match
+starting position is advanced after a match failure for an unanchored pattern.
+.P
+When PCRE2_NEWLINE_CRLF, PCRE2_NEWLINE_ANYCRLF, or PCRE2_NEWLINE_ANY is set as
+the newline convention, and a match attempt for an unanchored pattern fails
+when the current starting position is at a CRLF sequence, and the pattern
+contains no explicit matches for CR or LF characters, the match position is
+advanced by two characters instead of one, in other words, to after the CRLF.
+.P
+The above rule is a compromise that makes the most common cases work as
+expected. For example, if the pattern is .+A (and the PCRE2_DOTALL option is
+not set), it does not match the string "\er\enA" because, after failing at the
+start, it skips both the CR and the LF before retrying. However, the pattern
+[\er\en]A does match that string, because it contains an explicit CR or LF
+reference, and so advances only by one character after the first failure.
+.P
+An explicit match for CR of LF is either a literal appearance of one of those
+characters in the pattern, or one of the \er or \en escape sequences. Implicit
+matches such as [^X] do not count, nor does \es, even though it includes CR and
+LF in the characters that it matches.
+.P
+Notwithstanding the above, anomalous effects may still occur when CRLF is a
+valid newline sequence and explicit \er or \en escapes appear in the pattern.
+.
+.
+.\" HTML <a name="matchedstrings"></a>
+.SH "HOW PCRE2_MATCH() RETURNS A STRING AND CAPTURED SUBSTRINGS"
+.rs
+.sp
+.nf
+.B uint32_t pcre2_get_ovector_count(pcre2_match_data *\fImatch_data\fP);
+.sp
+.B PCRE2_SIZE *pcre2_get_ovector_pointer(pcre2_match_data *\fImatch_data\fP);
+.fi
+.P
+In general, a pattern matches a certain portion of the subject, and in
+addition, further substrings from the subject may be picked out by
+parenthesized parts of the pattern. Following the usage in Jeffrey Friedl's
+book, this is called "capturing" in what follows, and the phrase "capturing
+subpattern" or "capturing group" is used for a fragment of a pattern that picks
+out a substring. PCRE2 supports several other kinds of parenthesized subpattern
+that do not cause substrings to be captured. The \fBpcre2_pattern_info()\fP
+function can be used to find out how many capturing subpatterns there are in a
+compiled pattern.
+.P
+You can use auxiliary functions for accessing captured substrings
+.\" HTML <a href="#extractbynumber">
+.\" </a>
+by number
+.\"
+or
+.\" HTML <a href="#extractbyname">
+.\" </a>
+by name,
+.\"
+as described in sections below.
+.P
+Alternatively, you can make direct use of the vector of PCRE2_SIZE values,
+called the \fBovector\fP, which contains the offsets of captured strings. It is
+part of the
+.\" HTML <a href="#matchdatablock">
+.\" </a>
+match data block.
+.\"
+The function \fBpcre2_get_ovector_pointer()\fP returns the address of the
+ovector, and \fBpcre2_get_ovector_count()\fP returns the number of pairs of
+values it contains.
+.P
+Within the ovector, the first in each pair of values is set to the offset of
+the first code unit of a substring, and the second is set to the offset of the
+first code unit after the end of a substring. These values are always code unit
+offsets, not character offsets. That is, they are byte offsets in the 8-bit
+library, 16-bit offsets in the 16-bit library, and 32-bit offsets in the 32-bit
+library.
+.P
+After a partial match (error return PCRE2_ERROR_PARTIAL), only the first pair
+of offsets (that is, \fIovector[0]\fP and \fIovector[1]\fP) are set. They
+identify the part of the subject that was partially matched. See the
+.\" HREF
+\fBpcre2partial\fP
+.\"
+documentation for details of partial matching.
+.P
+After a successful match, the first pair of offsets identifies the portion of
+the subject string that was matched by the entire pattern. The next pair is
+used for the first capturing subpattern, and so on. The value returned by
+\fBpcre2_match()\fP is one more than the highest numbered pair that has been
+set. For example, if two substrings have been captured, the returned value is
+3. If there are no capturing subpatterns, the return value from a successful
+match is 1, indicating that just the first pair of offsets has been set.
+.P
+If a pattern uses the \eK escape sequence within a positive assertion, the
+reported start of a successful match can be greater than the end of the match.
+For example, if the pattern (?=ab\eK) is matched against "ab", the start and
+end offset values for the match are 2 and 0.
+.P
+If a capturing subpattern group is matched repeatedly within a single match
+operation, it is the last portion of the subject that it matched that is
+returned.
+.P
+If the ovector is too small to hold all the captured substring offsets, as much
+as possible is filled in, and the function returns a value of zero. If captured
+substrings are not of interest, \fBpcre2_match()\fP may be called with a match
+data block whose ovector is of minimum length (that is, one pair). However, if
+the pattern contains back references and the \fIovector\fP is not big enough to
+remember the related substrings, PCRE2 has to get additional memory for use
+during matching. Thus it is usually advisable to set up a match data block
+containing an ovector of reasonable size.
+.P
+It is possible for capturing subpattern number \fIn+1\fP to match some part of
+the subject when subpattern \fIn\fP has not been used at all. For example, if
+the string "abc" is matched against the pattern (a|(z))(bc) the return from the
+function is 4, and subpatterns 1 and 3 are matched, but 2 is not. When this
+happens, both values in the offset pairs corresponding to unused subpatterns
+are set to PCRE2_UNSET.
+.P
+Offset values that correspond to unused subpatterns at the end of the
+expression are also set to PCRE2_UNSET. For example, if the string "abc" is
+matched against the pattern (abc)(x(yz)?)? subpatterns 2 and 3 are not matched.
+The return from the function is 2, because the highest used capturing
+subpattern number is 1. The offsets for for the second and third capturing
+subpatterns (assuming the vector is large enough, of course) are set to
+PCRE2_UNSET.
+.P
+Elements in the ovector that do not correspond to capturing parentheses in the
+pattern are never changed. That is, if a pattern contains \fIn\fP capturing
+parentheses, no more than \fIovector[0]\fP to \fIovector[2n+1]\fP are set by
+\fBpcre2_match()\fP. The other elements retain whatever values they previously
+had.
+.
+.
+.\" HTML <a name="matchotherdata"></a>
+.SH "OTHER INFORMATION ABOUT A MATCH"
+.rs
+.sp
+.nf
+.B PCRE2_SPTR pcre2_get_mark(pcre2_match_data *\fImatch_data\fP);
+.sp
+.B PCRE2_SIZE pcre2_get_startchar(pcre2_match_data *\fImatch_data\fP);
+.fi
+.P
+As well as the offsets in the ovector, other information about a match is
+retained in the match data block and can be retrieved by the above functions in
+appropriate circumstances. If they are called at other times, the result is
+undefined.
+.P
+After a successful match, a partial match (PCRE2_ERROR_PARTIAL), or a failure
+to match (PCRE2_ERROR_NOMATCH), a (*MARK) name may be available, and
+\fBpcre2_get_mark()\fP can be called. It returns a pointer to the
+zero-terminated name, which is within the compiled pattern. Otherwise NULL is
+returned. The length of the (*MARK) name (excluding the terminating zero) is
+stored in the code unit that preceeds the name. You should use this instead of
+relying on the terminating zero if the (*MARK) name might contain a binary
+zero.
+.P
+After a successful match, the (*MARK) name that is returned is the
+last one encountered on the matching path through the pattern. After a "no
+match" or a partial match, the last encountered (*MARK) name is returned. For
+example, consider this pattern:
+.sp
+  ^(*MARK:A)((*MARK:B)a|b)c
+.sp
+When it matches "bc", the returned mark is A. The B mark is "seen" in the first
+branch of the group, but it is not on the matching path. On the other hand,
+when this pattern fails to match "bx", the returned mark is B.
+.P
+After a successful match, a partial match, or one of the invalid UTF errors
+(for example, PCRE2_ERROR_UTF8_ERR5), \fBpcre2_get_startchar()\fP can be
+called. After a successful or partial match it returns the code unit offset of
+the character at which the match started. For a non-partial match, this can be
+different to the value of \fIovector[0]\fP if the pattern contains the \eK
+escape sequence. After a partial match, however, this value is always the same
+as \fIovector[0]\fP because \eK does not affect the result of a partial match.
+.P
+After a UTF check failure, \fBpcre2_get_startchar()\fP can be used to obtain
+the code unit offset of the invalid UTF character. Details are given in the
+.\" HREF
+\fBpcre2unicode\fP
+.\"
+page.
+.
+.
+.\" HTML <a name="errorlist"></a>
+.SH "ERROR RETURNS FROM \fBpcre2_match()\fP"
+.rs
+.sp
+If \fBpcre2_match()\fP fails, it returns a negative number. This can be
+converted to a text string by calling \fBpcre2_get_error_message()\fP. Negative
+error codes are also returned by other functions, and are documented with them.
+The codes are given names in the header file. If UTF checking is in force and
+an invalid UTF subject string is detected, one of a number of UTF-specific
+negative error codes is returned. Details are given in the
+.\" HREF
+\fBpcre2unicode\fP
+.\"
+page. The following are the other errors that may be returned by
+\fBpcre2_match()\fP:
+.sp
+  PCRE2_ERROR_NOMATCH
+.sp
+The subject string did not match the pattern.
+.sp
+  PCRE2_ERROR_PARTIAL
+.sp
+The subject string did not match, but it did match partially. See the
+.\" HREF
+\fBpcre2partial\fP
+.\"
+documentation for details of partial matching.
+.sp
+  PCRE2_ERROR_BADMAGIC
+.sp
+PCRE2 stores a 4-byte "magic number" at the start of the compiled code, to
+catch the case when it is passed a junk pointer. This is the error that is
+returned when the magic number is not present.
+.sp
+  PCRE2_ERROR_BADMODE
+.sp
+This error is given when a pattern that was compiled by the 8-bit library is
+passed to a 16-bit or 32-bit library function, or vice versa.
+.sp
+  PCRE2_ERROR_BADOFFSET
+.sp
+The value of \fIstartoffset\fP was greater than the length of the subject.
+.sp
+  PCRE2_ERROR_BADOPTION
+.sp
+An unrecognized bit was set in the \fIoptions\fP argument.
+.sp
+  PCRE2_ERROR_BADUTFOFFSET
+.sp
+The UTF code unit sequence that was passed as a subject was checked and found
+to be valid (the PCRE2_NO_UTF_CHECK option was not set), but the value of
+\fIstartoffset\fP did not point to the beginning of a UTF character or the end
+of the subject.
+.sp
+  PCRE2_ERROR_CALLOUT
+.sp
+This error is never generated by \fBpcre2_match()\fP itself. It is provided for
+use by callout functions that want to cause \fBpcre2_match()\fP or
+\fBpcre2_callout_enumerate()\fP to return a distinctive error code. See the
+.\" HREF
+\fBpcre2callout\fP
+.\"
+documentation for details.
+.sp
+  PCRE2_ERROR_INTERNAL
+.sp
+An unexpected internal error has occurred. This error could be caused by a bug
+in PCRE2 or by overwriting of the compiled pattern.
+.sp
+  PCRE2_ERROR_JIT_BADOPTION
+.sp
+This error is returned when a pattern that was successfully studied using JIT
+is being matched, but the matching mode (partial or complete match) does not
+correspond to any JIT compilation mode. When the JIT fast path function is
+used, this error may be also given for invalid options. See the
+.\" HREF
+\fBpcre2jit\fP
+.\"
+documentation for more details.
+.sp
+  PCRE2_ERROR_JIT_STACKLIMIT
+.sp
+This error is returned when a pattern that was successfully studied using JIT
+is being matched, but the memory available for the just-in-time processing
+stack is not large enough. See the
+.\" HREF
+\fBpcre2jit\fP
+.\"
+documentation for more details.
+.sp
+  PCRE2_ERROR_MATCHLIMIT
+.sp
+The backtracking limit was reached.
+.sp
+  PCRE2_ERROR_NOMEMORY
+.sp
+If a pattern contains back references, but the ovector is not big enough to
+remember the referenced substrings, PCRE2 gets a block of memory at the start
+of matching to use for this purpose. There are some other special cases where
+extra memory is needed during matching. This error is given when memory cannot
+be obtained.
+.sp
+  PCRE2_ERROR_NULL
+.sp
+Either the \fIcode\fP, \fIsubject\fP, or \fImatch_data\fP argument was passed
+as NULL.
+.sp
+  PCRE2_ERROR_RECURSELOOP
+.sp
+This error is returned when \fBpcre2_match()\fP detects a recursion loop within
+the pattern. Specifically, it means that either the whole pattern or a
+subpattern has been called recursively for the second time at the same position
+in the subject string. Some simple patterns that might do this are detected and
+faulted at compile time, but more complicated cases, in particular mutual
+recursions between two different subpatterns, cannot be detected until matching
+is attempted.
+.sp
+  PCRE2_ERROR_RECURSIONLIMIT
+.sp
+The internal recursion limit was reached.
+.
+.
+.\" HTML <a name="extractbynumber"></a>
+.SH "EXTRACTING CAPTURED SUBSTRINGS BY NUMBER"
+.rs
+.sp
+.nf
+.B int pcre2_substring_length_bynumber(pcre2_match_data *\fImatch_data\fP,
+.B "  uint32_t \fInumber\fP, PCRE2_SIZE *\fIlength\fP);"
+.sp
+.B int pcre2_substring_copy_bynumber(pcre2_match_data *\fImatch_data\fP,
+.B "  uint32_t \fInumber\fP, PCRE2_UCHAR *\fIbuffer\fP,"
+.B "  PCRE2_SIZE *\fIbufflen\fP);"
+.sp
+.B int pcre2_substring_get_bynumber(pcre2_match_data *\fImatch_data\fP,
+.B "  uint32_t \fInumber\fP, PCRE2_UCHAR **\fIbufferptr\fP,"
+.B "  PCRE2_SIZE *\fIbufflen\fP);"
+.sp
+.B void pcre2_substring_free(PCRE2_UCHAR *\fIbuffer\fP);
+.fi
+.P
+Captured substrings can be accessed directly by using the ovector as described
+.\" HTML <a href="#matchedstrings">
+.\" </a>
+above.
+.\"
+For convenience, auxiliary functions are provided for extracting captured
+substrings as new, separate, zero-terminated strings. A substring that contains
+a binary zero is correctly extracted and has a further zero added on the end,
+but the result is not, of course, a C string.
+.P
+The functions in this section identify substrings by number. The number zero
+refers to the entire matched substring, with higher numbers referring to
+substrings captured by parenthesized groups. After a partial match, only
+substring zero is available. An attempt to extract any other substring gives
+the error PCRE2_ERROR_PARTIAL. The next section describes similar functions for
+extracting captured substrings by name.
+.P
+If a pattern uses the \eK escape sequence within a positive assertion, the
+reported start of a successful match can be greater than the end of the match.
+For example, if the pattern (?=ab\eK) is matched against "ab", the start and
+end offset values for the match are 2 and 0. In this situation, calling these
+functions with a zero substring number extracts a zero-length empty string.
+.P
+You can find the length in code units of a captured substring without
+extracting it by calling \fBpcre2_substring_length_bynumber()\fP. The first
+argument is a pointer to the match data block, the second is the group number,
+and the third is a pointer to a variable into which the length is placed. If
+you just want to know whether or not the substring has been captured, you can
+pass the third argument as NULL.
+.P
+The \fBpcre2_substring_copy_bynumber()\fP function copies a captured substring
+into a supplied buffer, whereas \fBpcre2_substring_get_bynumber()\fP copies it
+into new memory, obtained using the same memory allocation function that was
+used for the match data block. The first two arguments of these functions are a
+pointer to the match data block and a capturing group number.
+.P
+The final arguments of \fBpcre2_substring_copy_bynumber()\fP are a pointer to
+the buffer and a pointer to a variable that contains its length in code units.
+This is updated to contain the actual number of code units used for the
+extracted substring, excluding the terminating zero.
+.P
+For \fBpcre2_substring_get_bynumber()\fP the third and fourth arguments point
+to variables that are updated with a pointer to the new memory and the number
+of code units that comprise the substring, again excluding the terminating
+zero. When the substring is no longer needed, the memory should be freed by
+calling \fBpcre2_substring_free()\fP.
+.P
+The return value from all these functions is zero for success, or a negative
+error code. If the pattern match failed, the match failure code is returned.
+If a substring number greater than zero is used after a partial match,
+PCRE2_ERROR_PARTIAL is returned. Other possible error codes are:
+.sp
+  PCRE2_ERROR_NOMEMORY
+.sp
+The buffer was too small for \fBpcre2_substring_copy_bynumber()\fP, or the
+attempt to get memory failed for \fBpcre2_substring_get_bynumber()\fP.
+.sp
+  PCRE2_ERROR_NOSUBSTRING
+.sp
+There is no substring with that number in the pattern, that is, the number is
+greater than the number of capturing parentheses.
+.sp
+  PCRE2_ERROR_UNAVAILABLE
+.sp
+The substring number, though not greater than the number of captures in the
+pattern, is greater than the number of slots in the ovector, so the substring
+could not be captured.
+.sp
+  PCRE2_ERROR_UNSET
+.sp
+The substring did not participate in the match. For example, if the pattern is
+(abc)|(def) and the subject is "def", and the ovector contains at least two
+capturing slots, substring number 1 is unset.
+.
+.
+.SH "EXTRACTING A LIST OF ALL CAPTURED SUBSTRINGS"
+.rs
+.sp
+.nf
+.B int pcre2_substring_list_get(pcre2_match_data *\fImatch_data\fP,
+.B "  PCRE2_UCHAR ***\fIlistptr\fP, PCRE2_SIZE **\fIlengthsptr\fP);
+.sp
+.B void pcre2_substring_list_free(PCRE2_SPTR *\fIlist\fP);
+.fi
+.P
+The \fBpcre2_substring_list_get()\fP function extracts all available substrings
+and builds a list of pointers to them. It also (optionally) builds a second
+list that contains their lengths (in code units), excluding a terminating zero
+that is added to each of them. All this is done in a single block of memory
+that is obtained using the same memory allocation function that was used to get
+the match data block.
+.P
+This function must be called only after a successful match. If called after a
+partial match, the error code PCRE2_ERROR_PARTIAL is returned.
+.P
+The address of the memory block is returned via \fIlistptr\fP, which is also
+the start of the list of string pointers. The end of the list is marked by a
+NULL pointer. The address of the list of lengths is returned via
+\fIlengthsptr\fP. If your strings do not contain binary zeros and you do not
+therefore need the lengths, you may supply NULL as the \fBlengthsptr\fP
+argument to disable the creation of a list of lengths. The yield of the
+function is zero if all went well, or PCRE2_ERROR_NOMEMORY if the memory block
+could not be obtained. When the list is no longer needed, it should be freed by
+calling \fBpcre2_substring_list_free()\fP.
+.P
+If this function encounters a substring that is unset, which can happen when
+capturing subpattern number \fIn+1\fP matches some part of the subject, but
+subpattern \fIn\fP has not been used at all, it returns an empty string. This
+can be distinguished from a genuine zero-length substring by inspecting the
+appropriate offset in the ovector, which contain PCRE2_UNSET for unset
+substrings, or by calling \fBpcre2_substring_length_bynumber()\fP.
+.
+.
+.\" HTML <a name="extractbyname"></a>
+.SH "EXTRACTING CAPTURED SUBSTRINGS BY NAME"
+.rs
+.sp
+.nf
+.B int pcre2_substring_number_from_name(const pcre2_code *\fIcode\fP,
+.B "  PCRE2_SPTR \fIname\fP);"
+.sp
+.B int pcre2_substring_length_byname(pcre2_match_data *\fImatch_data\fP,
+.B "  PCRE2_SPTR \fIname\fP, PCRE2_SIZE *\fIlength\fP);"
+.sp
+.B int pcre2_substring_copy_byname(pcre2_match_data *\fImatch_data\fP,
+.B "  PCRE2_SPTR \fIname\fP, PCRE2_UCHAR *\fIbuffer\fP, PCRE2_SIZE *\fIbufflen\fP);"
+.sp
+.B int pcre2_substring_get_byname(pcre2_match_data *\fImatch_data\fP,
+.B "  PCRE2_SPTR \fIname\fP, PCRE2_UCHAR **\fIbufferptr\fP, PCRE2_SIZE *\fIbufflen\fP);"
+.sp
+.B void pcre2_substring_free(PCRE2_UCHAR *\fIbuffer\fP);
+.fi
+.P
+To extract a substring by name, you first have to find associated number.
+For example, for this pattern:
+.sp
+  (a+)b(?<xxx>\ed+)...
+.sp
+the number of the subpattern called "xxx" is 2. If the name is known to be
+unique (PCRE2_DUPNAMES was not set), you can find the number from the name by
+calling \fBpcre2_substring_number_from_name()\fP. The first argument is the
+compiled pattern, and the second is the name. The yield of the function is the
+subpattern number, PCRE2_ERROR_NOSUBSTRING if there is no subpattern of that
+name, or PCRE2_ERROR_NOUNIQUESUBSTRING if there is more than one subpattern of
+that name. Given the number, you can extract the substring directly, or use one
+of the functions described above.
+.P
+For convenience, there are also "byname" functions that correspond to the
+"bynumber" functions, the only difference being that the second argument is a
+name instead of a number. If PCRE2_DUPNAMES is set and there are duplicate
+names, these functions scan all the groups with the given name, and return the
+first named string that is set.
+.P
+If there are no groups with the given name, PCRE2_ERROR_NOSUBSTRING is
+returned. If all groups with the name have numbers that are greater than the
+number of slots in the ovector, PCRE2_ERROR_UNAVAILABLE is returned. If there
+is at least one group with a slot in the ovector, but no group is found to be
+set, PCRE2_ERROR_UNSET is returned.
+.P
+\fBWarning:\fP If the pattern uses the (?| feature to set up multiple
+subpatterns with the same number, as described in the
+.\" HTML <a href="pcre2pattern.html#dupsubpatternnumber">
+.\" </a>
+section on duplicate subpattern numbers
+.\"
+in the
+.\" HREF
+\fBpcre2pattern\fP
+.\"
+page, you cannot use names to distinguish the different subpatterns, because
+names are not included in the compiled code. The matching process uses only
+numbers. For this reason, the use of different names for subpatterns of the
+same number causes an error at compile time.
+.
+.
+.SH "CREATING A NEW STRING WITH SUBSTITUTIONS"
+.rs
+.sp
+.nf
+.B int pcre2_substitute(const pcre2_code *\fIcode\fP, PCRE2_SPTR \fIsubject\fP,
+.B "  PCRE2_SIZE \fIlength\fP, PCRE2_SIZE \fIstartoffset\fP,"
+.B "  uint32_t \fIoptions\fP, pcre2_match_data *\fImatch_data\fP,"
+.B "  pcre2_match_context *\fImcontext\fP, PCRE2_SPTR \fIreplacement\fP,"
+.B "  PCRE2_SIZE \fIrlength\fP, PCRE2_UCHAR *\fIoutputbuffer\zfP,"
+.B "  PCRE2_SIZE *\fIoutlengthptr\fP);"
+.fi
+.P
+This function calls \fBpcre2_match()\fP and then makes a copy of the subject
+string in \fIoutputbuffer\fP, replacing the part that was matched with the
+\fIreplacement\fP string, whose length is supplied in \fBrlength\fP. This can
+be given as PCRE2_ZERO_TERMINATED for a zero-terminated string. Matches in
+which a \eK item in a lookahead in the pattern causes the match to end before
+it starts are not supported, and give rise to an error return.
+.P
+The first seven arguments of \fBpcre2_substitute()\fP are the same as for
+\fBpcre2_match()\fP, except that the partial matching options are not
+permitted, and \fImatch_data\fP may be passed as NULL, in which case a match
+data block is obtained and freed within this function, using memory management
+functions from the match context, if provided, or else those that were used to
+allocate memory for the compiled code.
+.P
+The \fIoutlengthptr\fP argument must point to a variable that contains the
+length, in code units, of the output buffer. If the function is successful, the
+value is updated to contain the length of the new string, excluding the
+trailing zero that is automatically added.
+.P
+If the function is not successful, the value set via \fIoutlengthptr\fP depends
+on the type of error. For syntax errors in the replacement string, the value is
+the offset in the replacement string where the error was detected. For other
+errors, the value is PCRE2_UNSET by default. This includes the case of the
+output buffer being too small, unless PCRE2_SUBSTITUTE_OVERFLOW_LENGTH is set
+(see below), in which case the value is the minimum length needed, including
+space for the trailing zero. Note that in order to compute the required length,
+\fBpcre2_substitute()\fP has to simulate all the matching and copying, instead
+of giving an error return as soon as the buffer overflows. Note also that the
+length is in code units, not bytes.
+.P
+In the replacement string, which is interpreted as a UTF string in UTF mode,
+and is checked for UTF validity unless the PCRE2_NO_UTF_CHECK option is set, a
+dollar character is an escape character that can specify the insertion of
+characters from capturing groups or (*MARK) items in the pattern. The following
+forms are always recognized:
+.sp
+  $$                  insert a dollar character
+  $<n> or ${<n>}      insert the contents of group <n>
+  $*MARK or ${*MARK}  insert the name of the last (*MARK) encountered
+.sp
+Either a group number or a group name can be given for <n>. Curly brackets are
+required only if the following character would be interpreted as part of the
+number or name. The number may be zero to include the entire matched string.
+For example, if the pattern a(b)c is matched with "=abc=" and the replacement
+string "+$1$0$1+", the result is "=+babcb+=".
+.P
+The facility for inserting a (*MARK) name can be used to perform simple
+simultaneous substitutions, as this \fBpcre2test\fP example shows:
+.sp
+  /(*:pear)apple|(*:orange)lemon/g,replace=${*MARK}
+      apple lemon
+   2: pear orange
+.sp
+As well as the usual options for \fBpcre2_match()\fP, a number of additional
+options can be set in the \fIoptions\fP argument.
+.P
+PCRE2_SUBSTITUTE_GLOBAL causes the function to iterate over the subject string,
+replacing every matching substring. If this is not set, only the first matching
+substring is replaced. If any matched substring has zero length, after the
+substitution has happened, an attempt to find a non-empty match at the same
+position is performed. If this is not successful, the current position is
+advanced by one character except when CRLF is a valid newline sequence and the
+next two characters are CR, LF. In this case, the current position is advanced
+by two characters.
+.P
+PCRE2_SUBSTITUTE_OVERFLOW_LENGTH changes what happens when the output buffer is
+too small. The default action is to return PCRE2_ERROR_NOMEMORY immediately. If
+this option is set, however, \fBpcre2_substitute()\fP continues to go through
+the motions of matching and substituting (without, of course, writing anything)
+in order to compute the size of buffer that is needed. This value is passed
+back via the \fIoutlengthptr\fP variable, with the result of the function still
+being PCRE2_ERROR_NOMEMORY.
+.P
+Passing a buffer size of zero is a permitted way of finding out how much memory
+is needed for given substitution. However, this does mean that the entire
+operation is carried out twice. Depending on the application, it may be more
+efficient to allocate a large buffer and free the excess afterwards, instead of
+using PCRE2_SUBSTITUTE_OVERFLOW_LENGTH.
+.P
+PCRE2_SUBSTITUTE_UNKNOWN_UNSET causes references to capturing groups that do
+not appear in the pattern to be treated as unset groups. This option should be
+used with care, because it means that a typo in a group name or number no
+longer causes the PCRE2_ERROR_NOSUBSTRING error.
+.P
+PCRE2_SUBSTITUTE_UNSET_EMPTY causes unset capturing groups (including unknown
+groups when PCRE2_SUBSTITUTE_UNKNOWN_UNSET is set) to be treated as empty
+strings when inserted as described above. If this option is not set, an attempt
+to insert an unset group causes the PCRE2_ERROR_UNSET error. This option does
+not influence the extended substitution syntax described below.
+.P
+PCRE2_SUBSTITUTE_EXTENDED causes extra processing to be applied to the
+replacement string. Without this option, only the dollar character is special,
+and only the group insertion forms listed above are valid. When
+PCRE2_SUBSTITUTE_EXTENDED is set, two things change:
+.P
+Firstly, backslash in a replacement string is interpreted as an escape
+character. The usual forms such as \en or \ex{ddd} can be used to specify
+particular character codes, and backslash followed by any non-alphanumeric
+character quotes that character. Extended quoting can be coded using \eQ...\eE,
+exactly as in pattern strings.
+.P
+There are also four escape sequences for forcing the case of inserted letters.
+The insertion mechanism has three states: no case forcing, force upper case,
+and force lower case. The escape sequences change the current state: \eU and
+\eL change to upper or lower case forcing, respectively, and \eE (when not
+terminating a \eQ quoted sequence) reverts to no case forcing. The sequences
+\eu and \el force the next character (if it is a letter) to upper or lower
+case, respectively, and then the state automatically reverts to no case
+forcing. Case forcing applies to all inserted  characters, including those from
+captured groups and letters within \eQ...\eE quoted sequences.
+.P
+Note that case forcing sequences such as \eU...\eE do not nest. For example,
+the result of processing "\eUaa\eLBB\eEcc\eE" is "AAbbcc"; the final \eE has no
+effect.
+.P
+The second effect of setting PCRE2_SUBSTITUTE_EXTENDED is to add more
+flexibility to group substitution. The syntax is similar to that used by Bash:
+.sp
+  ${<n>:-<string>}
+  ${<n>:+<string1>:<string2>}
+.sp
+As before, <n> may be a group number or a name. The first form specifies a
+default value. If group <n> is set, its value is inserted; if not, <string> is
+expanded and the result inserted. The second form specifies strings that are
+expanded and inserted when group <n> is set or unset, respectively. The first
+form is just a convenient shorthand for
+.sp
+  ${<n>:+${<n>}:<string>}
+.sp
+Backslash can be used to escape colons and closing curly brackets in the
+replacement strings. A change of the case forcing state within a replacement
+string remains in force afterwards, as shown in this \fBpcre2test\fP example:
+.sp
+  /(some)?(body)/substitute_extended,replace=${1:+\eU:\eL}HeLLo
+      body
+   1: hello
+      somebody
+   1: HELLO
+.sp
+The PCRE2_SUBSTITUTE_UNSET_EMPTY option does not affect these extended
+substitutions. However, PCRE2_SUBSTITUTE_UNKNOWN_UNSET does cause unknown
+groups in the extended syntax forms to be treated as unset.
+.P
+If successful, \fBpcre2_substitute()\fP returns the number of replacements that
+were made. This may be zero if no matches were found, and is never greater than
+1 unless PCRE2_SUBSTITUTE_GLOBAL is set.
+.P
+In the event of an error, a negative error code is returned. Except for
+PCRE2_ERROR_NOMATCH (which is never returned), errors from \fBpcre2_match()\fP
+are passed straight back.
+.P
+PCRE2_ERROR_NOSUBSTRING is returned for a non-existent substring insertion,
+unless PCRE2_SUBSTITUTE_UNKNOWN_UNSET is set.
+.P
+PCRE2_ERROR_UNSET is returned for an unset substring insertion (including an
+unknown substring when PCRE2_SUBSTITUTE_UNKNOWN_UNSET is set) when the simple
+(non-extended) syntax is used and PCRE2_SUBSTITUTE_UNSET_EMPTY is not set.
+.P
+PCRE2_ERROR_NOMEMORY is returned if the output buffer is not big enough. If the
+PCRE2_SUBSTITUTE_OVERFLOW_LENGTH option is set, the size of buffer that is
+needed is returned via \fIoutlengthptr\fP. Note that this does not happen by
+default.
+.P
+PCRE2_ERROR_BADREPLACEMENT is used for miscellaneous syntax errors in the
+replacement string, with more particular errors being PCRE2_ERROR_BADREPESCAPE
+(invalid escape sequence), PCRE2_ERROR_REPMISSING_BRACE (closing curly bracket
+not found), PCRE2_BADSUBSTITUTION (syntax error in extended group
+substitution), and PCRE2_BADSUBPATTERN (the pattern match ended before it
+started, which can happen if \eK is used in an assertion).
+.P
+As for all PCRE2 errors, a text message that describes the error can be
+obtained by calling \fBpcre2_get_error_message()\fP.
+.
+.
+.SH "DUPLICATE SUBPATTERN NAMES"
+.rs
+.sp
+.nf
+.B int pcre2_substring_nametable_scan(const pcre2_code *\fIcode\fP,
+.B "  PCRE2_SPTR \fIname\fP, PCRE2_SPTR *\fIfirst\fP, PCRE2_SPTR *\fIlast\fP);"
+.fi
+.P
+When a pattern is compiled with the PCRE2_DUPNAMES option, names for
+subpatterns are not required to be unique. Duplicate names are always allowed
+for subpatterns with the same number, created by using the (?| feature. Indeed,
+if such subpatterns are named, they are required to use the same names.
+.P
+Normally, patterns with duplicate names are such that in any one match, only
+one of the named subpatterns participates. An example is shown in the
+.\" HREF
+\fBpcre2pattern\fP
+.\"
+documentation.
+.P
+When duplicates are present, \fBpcre2_substring_copy_byname()\fP and
+\fBpcre2_substring_get_byname()\fP return the first substring corresponding to
+the given name that is set. Only if none are set is PCRE2_ERROR_UNSET is
+returned. The \fBpcre2_substring_number_from_name()\fP function returns the
+error PCRE2_ERROR_NOUNIQUESUBSTRING when there are duplicate names.
+.P
+If you want to get full details of all captured substrings for a given name,
+you must use the \fBpcre2_substring_nametable_scan()\fP function. The first
+argument is the compiled pattern, and the second is the name. If the third and
+fourth arguments are NULL, the function returns a group number for a unique
+name, or PCRE2_ERROR_NOUNIQUESUBSTRING otherwise.
+.P
+When the third and fourth arguments are not NULL, they must be pointers to
+variables that are updated by the function. After it has run, they point to the
+first and last entries in the name-to-number table for the given name, and the
+function returns the length of each entry in code units. In both cases,
+PCRE2_ERROR_NOSUBSTRING is returned if there are no entries for the given name.
+.P
+The format of the name table is described
+.\" HTML <a href="#infoaboutpattern">
+.\" </a>
+above
+.\"
+in the section entitled \fIInformation about a pattern\fP. Given all the
+relevant entries for the name, you can extract each of their numbers, and hence
+the captured data.
+.
+.
+.SH "FINDING ALL POSSIBLE MATCHES AT ONE POSITION"
+.rs
+.sp
+The traditional matching function uses a similar algorithm to Perl, which stops
+when it finds the first match at a given point in the subject. If you want to
+find all possible matches, or the longest possible match at a given position,
+consider using the alternative matching function (see below) instead. If you
+cannot use the alternative function, you can kludge it up by making use of the
+callout facility, which is described in the
+.\" HREF
+\fBpcre2callout\fP
+.\"
+documentation.
+.P
+What you have to do is to insert a callout right at the end of the pattern.
+When your callout function is called, extract and save the current matched
+substring. Then return 1, which forces \fBpcre2_match()\fP to backtrack and try
+other alternatives. Ultimately, when it runs out of matches,
+\fBpcre2_match()\fP will yield PCRE2_ERROR_NOMATCH.
+.
+.
+.\" HTML <a name="dfamatch"></a>
+.SH "MATCHING A PATTERN: THE ALTERNATIVE FUNCTION"
+.rs
+.sp
+.nf
+.B int pcre2_dfa_match(const pcre2_code *\fIcode\fP, PCRE2_SPTR \fIsubject\fP,
+.B "  PCRE2_SIZE \fIlength\fP, PCRE2_SIZE \fIstartoffset\fP,"
+.B "  uint32_t \fIoptions\fP, pcre2_match_data *\fImatch_data\fP,"
+.B "  pcre2_match_context *\fImcontext\fP,"
+.B "  int *\fIworkspace\fP, PCRE2_SIZE \fIwscount\fP);"
+.fi
+.P
+The function \fBpcre2_dfa_match()\fP is called to match a subject string
+against a compiled pattern, using a matching algorithm that scans the subject
+string just once, and does not backtrack. This has different characteristics to
+the normal algorithm, and is not compatible with Perl. Some of the features of
+PCRE2 patterns are not supported. Nevertheless, there are times when this kind
+of matching can be useful. For a discussion of the two matching algorithms, and
+a list of features that \fBpcre2_dfa_match()\fP does not support, see the
+.\" HREF
+\fBpcre2matching\fP
+.\"
+documentation.
+.P
+The arguments for the \fBpcre2_dfa_match()\fP function are the same as for
+\fBpcre2_match()\fP, plus two extras. The ovector within the match data block
+is used in a different way, and this is described below. The other common
+arguments are used in the same way as for \fBpcre2_match()\fP, so their
+description is not repeated here.
+.P
+The two additional arguments provide workspace for the function. The workspace
+vector should contain at least 20 elements. It is used for keeping track of
+multiple paths through the pattern tree. More workspace is needed for patterns
+and subjects where there are a lot of potential matches.
+.P
+Here is an example of a simple call to \fBpcre2_dfa_match()\fP:
+.sp
+  int wspace[20];
+  pcre2_match_data *md = pcre2_match_data_create(4, NULL);
+  int rc = pcre2_dfa_match(
+    re,             /* result of pcre2_compile() */
+    "some string",  /* the subject string */
+    11,             /* the length of the subject string */
+    0,              /* start at offset 0 in the subject */
+    0,              /* default options */
+    match_data,     /* the match data block */
+    NULL,           /* a match context; NULL means use defaults */
+    wspace,         /* working space vector */
+    20);            /* number of elements (NOT size in bytes) */
+.
+.SS "Option bits for \fBpcre_dfa_match()\fP"
+.rs
+.sp
+The unused bits of the \fIoptions\fP argument for \fBpcre2_dfa_match()\fP must
+be zero. The only bits that may be set are PCRE2_ANCHORED, PCRE2_NOTBOL,
+PCRE2_NOTEOL, PCRE2_NOTEMPTY, PCRE2_NOTEMPTY_ATSTART, PCRE2_NO_UTF_CHECK,
+PCRE2_PARTIAL_HARD, PCRE2_PARTIAL_SOFT, PCRE2_DFA_SHORTEST, and
+PCRE2_DFA_RESTART. All but the last four of these are exactly the same as for
+\fBpcre2_match()\fP, so their description is not repeated here.
+.sp
+  PCRE2_PARTIAL_HARD
+  PCRE2_PARTIAL_SOFT
+.sp
+These have the same general effect as they do for \fBpcre2_match()\fP, but the
+details are slightly different. When PCRE2_PARTIAL_HARD is set for
+\fBpcre2_dfa_match()\fP, it returns PCRE2_ERROR_PARTIAL if the end of the
+subject is reached and there is still at least one matching possibility that
+requires additional characters. This happens even if some complete matches have
+already been found. When PCRE2_PARTIAL_SOFT is set, the return code
+PCRE2_ERROR_NOMATCH is converted into PCRE2_ERROR_PARTIAL if the end of the
+subject is reached, there have been no complete matches, but there is still at
+least one matching possibility. The portion of the string that was inspected
+when the longest partial match was found is set as the first matching string in
+both cases. There is a more detailed discussion of partial and multi-segment
+matching, with examples, in the
+.\" HREF
+\fBpcre2partial\fP
+.\"
+documentation.
+.sp
+  PCRE2_DFA_SHORTEST
+.sp
+Setting the PCRE2_DFA_SHORTEST option causes the matching algorithm to stop as
+soon as it has found one match. Because of the way the alternative algorithm
+works, this is necessarily the shortest possible match at the first possible
+matching point in the subject string.
+.sp
+  PCRE2_DFA_RESTART
+.sp
+When \fBpcre2_dfa_match()\fP returns a partial match, it is possible to call it
+again, with additional subject characters, and have it continue with the same
+match. The PCRE2_DFA_RESTART option requests this action; when it is set, the
+\fIworkspace\fP and \fIwscount\fP options must reference the same vector as
+before because data about the match so far is left in them after a partial
+match. There is more discussion of this facility in the
+.\" HREF
+\fBpcre2partial\fP
+.\"
+documentation.
+.
+.
+.SS "Successful returns from \fBpcre2_dfa_match()\fP"
+.rs
+.sp
+When \fBpcre2_dfa_match()\fP succeeds, it may have matched more than one
+substring in the subject. Note, however, that all the matches from one run of
+the function start at the same point in the subject. The shorter matches are
+all initial substrings of the longer matches. For example, if the pattern
+.sp
+  <.*>
+.sp
+is matched against the string
+.sp
+  This is <something> <something else> <something further> no more
+.sp
+the three matched strings are
+.sp
+  <something> <something else> <something further>
+  <something> <something else>
+  <something>
+.sp
+On success, the yield of the function is a number greater than zero, which is
+the number of matched substrings. The offsets of the substrings are returned in
+the ovector, and can be extracted by number in the same way as for
+\fBpcre2_match()\fP, but the numbers bear no relation to any capturing groups
+that may exist in the pattern, because DFA matching does not support group
+capture.
+.P
+Calls to the convenience functions that extract substrings by name
+return the error PCRE2_ERROR_DFA_UFUNC (unsupported function) if used after a
+DFA match. The convenience functions that extract substrings by number never
+return PCRE2_ERROR_NOSUBSTRING, and the meanings of some other errors are
+slightly different:
+.sp
+  PCRE2_ERROR_UNAVAILABLE
+.sp
+The ovector is not big enough to include a slot for the given substring number.
+.sp
+  PCRE2_ERROR_UNSET
+.sp
+There is a slot in the ovector for this substring, but there were insufficient
+matches to fill it.
+.P
+The matched strings are stored in the ovector in reverse order of length; that
+is, the longest matching string is first. If there were too many matches to fit
+into the ovector, the yield of the function is zero, and the vector is filled
+with the longest matches.
+.P
+NOTE: PCRE2's "auto-possessification" optimization usually applies to character
+repeats at the end of a pattern (as well as internally). For example, the
+pattern "a\ed+" is compiled as if it were "a\ed++". For DFA matching, this
+means that only one possible match is found. If you really do want multiple
+matches in such cases, either use an ungreedy repeat auch as "a\ed+?" or set
+the PCRE2_NO_AUTO_POSSESS option when compiling.
+.
+.
+.SS "Error returns from \fBpcre2_dfa_match()\fP"
+.rs
+.sp
+The \fBpcre2_dfa_match()\fP function returns a negative number when it fails.
+Many of the errors are the same as for \fBpcre2_match()\fP, as described
+.\" HTML <a href="#errorlist">
+.\" </a>
+above.
+.\"
+There are in addition the following errors that are specific to
+\fBpcre2_dfa_match()\fP:
+.sp
+  PCRE2_ERROR_DFA_UITEM
+.sp
+This return is given if \fBpcre2_dfa_match()\fP encounters an item in the
+pattern that it does not support, for instance, the use of \eC in a UTF mode or
+a back reference.
+.sp
+  PCRE2_ERROR_DFA_UCOND
+.sp
+This return is given if \fBpcre2_dfa_match()\fP encounters a condition item
+that uses a back reference for the condition, or a test for recursion in a
+specific group. These are not supported.
+.sp
+  PCRE2_ERROR_DFA_WSSIZE
+.sp
+This return is given if \fBpcre2_dfa_match()\fP runs out of space in the
+\fIworkspace\fP vector.
+.sp
+  PCRE2_ERROR_DFA_RECURSE
+.sp
+When a recursive subpattern is processed, the matching function calls itself
+recursively, using private memory for the ovector and \fIworkspace\fP. This
+error is given if the internal ovector is not large enough. This should be
+extremely rare, as a vector of size 1000 is used.
+.sp
+  PCRE2_ERROR_DFA_BADRESTART
+.sp
+When \fBpcre2_dfa_match()\fP is called with the \fBPCRE2_DFA_RESTART\fP option,
+some plausibility checks are made on the contents of the workspace, which
+should contain data about the previous partial match. If any of these checks
+fail, this error is given.
+.
+.
+.SH "SEE ALSO"
+.rs
+.sp
+\fBpcre2build\fP(3), \fBpcre2callout\fP(3), \fBpcre2demo(3)\fP,
+\fBpcre2matching\fP(3), \fBpcre2partial\fP(3), \fBpcre2posix\fP(3),
+\fBpcre2sample\fP(3), \fBpcre2stack\fP(3), \fBpcre2unicode\fP(3).
+.
+.
+.SH AUTHOR
+.rs
+.sp
+.nf
+Philip Hazel
+University Computing Service
+Cambridge, England.
+.fi
+.
+.
+.SH REVISION
+.rs
+.sp
+.nf
+Last updated: 16 December 2015
+Copyright (c) 1997-2015 University of Cambridge.
+.fi
diff --git a/dist2/doc/pcre2build.3 b/dist2/doc/pcre2build.3
new file mode 100644
index 0000000..a90f1b2
--- /dev/null
+++ b/dist2/doc/pcre2build.3
@@ -0,0 +1,524 @@
+.TH PCRE2BUILD 3 "16 October 2015" "PCRE2 10.21"
+.SH NAME
+PCRE2 - Perl-compatible regular expressions (revised API)
+.
+.
+.SH "BUILDING PCRE2"
+.rs
+.sp
+PCRE2 is distributed with a \fBconfigure\fP script that can be used to build
+the library in Unix-like environments using the applications known as
+Autotools. Also in the distribution are files to support building using
+\fBCMake\fP instead of \fBconfigure\fP. The text file
+.\" HTML <a href="README.txt">
+.\" </a>
+\fBREADME\fP
+.\"
+contains general information about building with Autotools (some of which is
+repeated below), and also has some comments about building on various operating
+systems. There is a lot more information about building PCRE2 without using
+Autotools (including information about using \fBCMake\fP and building "by
+hand") in the text file called
+.\" HTML <a href="NON-AUTOTOOLS-BUILD.txt">
+.\" </a>
+\fBNON-AUTOTOOLS-BUILD\fP.
+.\"
+You should consult this file as well as the
+.\" HTML <a href="README.txt">
+.\" </a>
+\fBREADME\fP
+.\"
+file if you are building in a non-Unix-like environment.
+.
+.
+.SH "PCRE2 BUILD-TIME OPTIONS"
+.rs
+.sp
+The rest of this document describes the optional features of PCRE2 that can be
+selected when the library is compiled. It assumes use of the \fBconfigure\fP
+script, where the optional features are selected or deselected by providing
+options to \fBconfigure\fP before running the \fBmake\fP command. However, the
+same options can be selected in both Unix-like and non-Unix-like environments
+if you are using \fBCMake\fP instead of \fBconfigure\fP to build PCRE2.
+.P
+If you are not using Autotools or \fBCMake\fP, option selection can be done by
+editing the \fBconfig.h\fP file, or by passing parameter settings to the
+compiler, as described in
+.\" HTML <a href="NON-AUTOTOOLS-BUILD.txt">
+.\" </a>
+\fBNON-AUTOTOOLS-BUILD\fP.
+.\"
+.P
+The complete list of options for \fBconfigure\fP (which includes the standard
+ones such as the selection of the installation directory) can be obtained by
+running
+.sp
+  ./configure --help
+.sp
+The following sections include descriptions of options whose names begin with
+--enable or --disable. These settings specify changes to the defaults for the
+\fBconfigure\fP command. Because of the way that \fBconfigure\fP works,
+--enable and --disable always come in pairs, so the complementary option always
+exists as well, but as it specifies the default, it is not described.
+.
+.
+.SH "BUILDING 8-BIT, 16-BIT AND 32-BIT LIBRARIES"
+.rs
+.sp
+By default, a library called \fBlibpcre2-8\fP is built, containing functions
+that take string arguments contained in vectors of bytes, interpreted either as
+single-byte characters, or UTF-8 strings. You can also build two other
+libraries, called \fBlibpcre2-16\fP and \fBlibpcre2-32\fP, which process
+strings that are contained in vectors of 16-bit and 32-bit code units,
+respectively. These can be interpreted either as single-unit characters or
+UTF-16/UTF-32 strings. To build these additional libraries, add one or both of
+the following to the \fBconfigure\fP command:
+.sp
+  --enable-pcre2-16
+  --enable-pcre2-32
+.sp
+If you do not want the 8-bit library, add
+.sp
+  --disable-pcre2-8
+.sp
+as well. At least one of the three libraries must be built. Note that the POSIX
+wrapper is for the 8-bit library only, and that \fBpcre2grep\fP is an 8-bit
+program. Neither of these are built if you select only the 16-bit or 32-bit
+libraries.
+.
+.
+.SH "BUILDING SHARED AND STATIC LIBRARIES"
+.rs
+.sp
+The Autotools PCRE2 building process uses \fBlibtool\fP to build both shared
+and static libraries by default. You can suppress an unwanted library by adding
+one of
+.sp
+  --disable-shared
+  --disable-static
+.sp
+to the \fBconfigure\fP command.
+.
+.
+.SH "UNICODE AND UTF SUPPORT"
+.rs
+.sp
+By default, PCRE2 is built with support for Unicode and UTF character strings.
+To build it without Unicode support, add
+.sp
+  --disable-unicode
+.sp
+to the \fBconfigure\fP command. This setting applies to all three libraries. It
+is not possible to build one library with Unicode support, and another without,
+in the same configuration.
+.P
+Of itself, Unicode support does not make PCRE2 treat strings as UTF-8, UTF-16
+or UTF-32. To do that, applications that use the library can set the PCRE2_UTF
+option when they call \fBpcre2_compile()\fP to compile a pattern.
+Alternatively, patterns may be started with (*UTF) unless the application has
+locked this out by setting PCRE2_NEVER_UTF.
+.P
+UTF support allows the libraries to process character code points up to
+0x10ffff in the strings that they handle. It also provides support for
+accessing the Unicode properties of such characters, using pattern escapes such
+as \eP, \ep, and \eX. Only the general category properties such as \fILu\fP and
+\fINd\fP are supported. Details are given in the
+.\" HREF
+\fBpcre2pattern\fP
+.\"
+documentation.
+.P
+Pattern escapes such as \ed and \ew do not by default make use of Unicode
+properties. The application can request that they do by setting the PCRE2_UCP
+option. Unless the application has set PCRE2_NEVER_UCP, a pattern may also
+request this by starting with (*UCP).
+.
+.
+.SH "DISABLING THE USE OF \eC"
+.rs
+.sp
+The \eC escape sequence, which matches a single code unit, even in a UTF mode,
+can cause unpredictable behaviour because it may leave the current matching
+point in the middle of a multi-code-unit character. The application can lock it
+out by setting the PCRE2_NEVER_BACKSLASH_C option when calling
+\fBpcre2_compile()\fP. There is also a build-time option
+.sp
+  --enable-never-backslash-C
+.sp
+(note the upper case C) which locks out the use of \eC entirely.
+.
+.
+.SH "JUST-IN-TIME COMPILER SUPPORT"
+.rs
+.sp
+Just-in-time compiler support is included in the build by specifying
+.sp
+  --enable-jit
+.sp
+This support is available only for certain hardware architectures. If this
+option is set for an unsupported architecture, a building error occurs.
+See the
+.\" HREF
+\fBpcre2jit\fP
+.\"
+documentation for a discussion of JIT usage. When JIT support is enabled,
+pcre2grep automatically makes use of it, unless you add
+.sp
+  --disable-pcre2grep-jit
+.sp
+to the "configure" command.
+.
+.
+.SH "NEWLINE RECOGNITION"
+.rs
+.sp
+By default, PCRE2 interprets the linefeed (LF) character as indicating the end
+of a line. This is the normal newline character on Unix-like systems. You can
+compile PCRE2 to use carriage return (CR) instead, by adding
+.sp
+  --enable-newline-is-cr
+.sp
+to the \fBconfigure\fP command. There is also an --enable-newline-is-lf option,
+which explicitly specifies linefeed as the newline character.
+.P
+Alternatively, you can specify that line endings are to be indicated by the
+two-character sequence CRLF (CR immediately followed by LF). If you want this,
+add
+.sp
+  --enable-newline-is-crlf
+.sp
+to the \fBconfigure\fP command. There is a fourth option, specified by
+.sp
+  --enable-newline-is-anycrlf
+.sp
+which causes PCRE2 to recognize any of the three sequences CR, LF, or CRLF as
+indicating a line ending. Finally, a fifth option, specified by
+.sp
+  --enable-newline-is-any
+.sp
+causes PCRE2 to recognize any Unicode newline sequence. The Unicode newline
+sequences are the three just mentioned, plus the single characters VT (vertical
+tab, U+000B), FF (form feed, U+000C), NEL (next line, U+0085), LS (line
+separator, U+2028), and PS (paragraph separator, U+2029).
+.P
+Whatever default line ending convention is selected when PCRE2 is built can be
+overridden by applications that use the library. At build time it is
+conventional to use the standard for your operating system.
+.
+.
+.SH "WHAT \eR MATCHES"
+.rs
+.sp
+By default, the sequence \eR in a pattern matches any Unicode newline sequence,
+independently of what has been selected as the line ending sequence. If you
+specify
+.sp
+  --enable-bsr-anycrlf
+.sp
+the default is changed so that \eR matches only CR, LF, or CRLF. Whatever is
+selected when PCRE2 is built can be overridden by applications that use the
+called.
+.
+.
+.SH "HANDLING VERY LARGE PATTERNS"
+.rs
+.sp
+Within a compiled pattern, offset values are used to point from one part to
+another (for example, from an opening parenthesis to an alternation
+metacharacter). By default, in the 8-bit and 16-bit libraries, two-byte values
+are used for these offsets, leading to a maximum size for a compiled pattern of
+around 64K code units. This is sufficient to handle all but the most gigantic
+patterns. Nevertheless, some people do want to process truly enormous patterns,
+so it is possible to compile PCRE2 to use three-byte or four-byte offsets by
+adding a setting such as
+.sp
+  --with-link-size=3
+.sp
+to the \fBconfigure\fP command. The value given must be 2, 3, or 4. For the
+16-bit library, a value of 3 is rounded up to 4. In these libraries, using
+longer offsets slows down the operation of PCRE2 because it has to load
+additional data when handling them. For the 32-bit library the value is always
+4 and cannot be overridden; the value of --with-link-size is ignored.
+.
+.
+.SH "AVOIDING EXCESSIVE STACK USAGE"
+.rs
+.sp
+When matching with the \fBpcre2_match()\fP function, PCRE2 implements
+backtracking by making recursive calls to an internal function called
+\fBmatch()\fP. In environments where the size of the stack is limited, this can
+severely limit PCRE2's operation. (The Unix environment does not usually suffer
+from this problem, but it may sometimes be necessary to increase the maximum
+stack size. There is a discussion in the
+.\" HREF
+\fBpcre2stack\fP
+.\"
+documentation.) An alternative approach to recursion that uses memory from the
+heap to remember data, instead of using recursive function calls, has been
+implemented to work round the problem of limited stack size. If you want to
+build a version of PCRE2 that works this way, add
+.sp
+  --disable-stack-for-recursion
+.sp
+to the \fBconfigure\fP command. By default, the system functions \fBmalloc()\fP
+and \fBfree()\fP are called to manage the heap memory that is required, but
+custom memory management functions can be called instead. PCRE2 runs noticeably
+more slowly when built in this way. This option affects only the
+\fBpcre2_match()\fP function; it is not relevant for \fBpcre2_dfa_match()\fP.
+.
+.
+.SH "LIMITING PCRE2 RESOURCE USAGE"
+.rs
+.sp
+Internally, PCRE2 has a function called \fBmatch()\fP, which it calls
+repeatedly (sometimes recursively) when matching a pattern with the
+\fBpcre2_match()\fP function. By controlling the maximum number of times this
+function may be called during a single matching operation, a limit can be
+placed on the resources used by a single call to \fBpcre2_match()\fP. The limit
+can be changed at run time, as described in the
+.\" HREF
+\fBpcre2api\fP
+.\"
+documentation. The default is 10 million, but this can be changed by adding a
+setting such as
+.sp
+  --with-match-limit=500000
+.sp
+to the \fBconfigure\fP command. This setting has no effect on the
+\fBpcre2_dfa_match()\fP matching function.
+.P
+In some environments it is desirable to limit the depth of recursive calls of
+\fBmatch()\fP more strictly than the total number of calls, in order to
+restrict the maximum amount of stack (or heap, if --disable-stack-for-recursion
+is specified) that is used. A second limit controls this; it defaults to the
+value that is set for --with-match-limit, which imposes no additional
+constraints. However, you can set a lower limit by adding, for example,
+.sp
+  --with-match-limit-recursion=10000
+.sp
+to the \fBconfigure\fP command. This value can also be overridden at run time.
+.
+.
+.SH "CREATING CHARACTER TABLES AT BUILD TIME"
+.rs
+.sp
+PCRE2 uses fixed tables for processing characters whose code points are less
+than 256. By default, PCRE2 is built with a set of tables that are distributed
+in the file \fIsrc/pcre2_chartables.c.dist\fP. These tables are for ASCII codes
+only. If you add
+.sp
+  --enable-rebuild-chartables
+.sp
+to the \fBconfigure\fP command, the distributed tables are no longer used.
+Instead, a program called \fBdftables\fP is compiled and run. This outputs the
+source for new set of tables, created in the default locale of your C run-time
+system. (This method of replacing the tables does not work if you are cross
+compiling, because \fBdftables\fP is run on the local host. If you need to
+create alternative tables when cross compiling, you will have to do so "by
+hand".)
+.
+.
+.SH "USING EBCDIC CODE"
+.rs
+.sp
+PCRE2 assumes by default that it will run in an environment where the character
+code is ASCII or Unicode, which is a superset of ASCII. This is the case for
+most computer operating systems. PCRE2 can, however, be compiled to run in an
+8-bit EBCDIC environment by adding
+.sp
+  --enable-ebcdic --disable-unicode
+.sp
+to the \fBconfigure\fP command. This setting implies
+--enable-rebuild-chartables. You should only use it if you know that you are in
+an EBCDIC environment (for example, an IBM mainframe operating system).
+.P
+It is not possible to support both EBCDIC and UTF-8 codes in the same version
+of the library. Consequently, --enable-unicode and --enable-ebcdic are mutually
+exclusive.
+.P
+The EBCDIC character that corresponds to an ASCII LF is assumed to have the
+value 0x15 by default. However, in some EBCDIC environments, 0x25 is used. In
+such an environment you should use
+.sp
+  --enable-ebcdic-nl25
+.sp
+as well as, or instead of, --enable-ebcdic. The EBCDIC character for CR has the
+same value as in ASCII, namely, 0x0d. Whichever of 0x15 and 0x25 is \fInot\fP
+chosen as LF is made to correspond to the Unicode NEL character (which, in
+Unicode, is 0x85).
+.P
+The options that select newline behaviour, such as --enable-newline-is-cr,
+and equivalent run-time options, refer to these character values in an EBCDIC
+environment.
+.
+.
+.SH "PCRE2GREP OPTIONS FOR COMPRESSED FILE SUPPORT"
+.rs
+.sp
+By default, \fBpcre2grep\fP reads all files as plain text. You can build it so
+that it recognizes files whose names end in \fB.gz\fP or \fB.bz2\fP, and reads
+them with \fBlibz\fP or \fBlibbz2\fP, respectively, by adding one or both of
+.sp
+  --enable-pcre2grep-libz
+  --enable-pcre2grep-libbz2
+.sp
+to the \fBconfigure\fP command. These options naturally require that the
+relevant libraries are installed on your system. Configuration will fail if
+they are not.
+.
+.
+.SH "PCRE2GREP BUFFER SIZE"
+.rs
+.sp
+\fBpcre2grep\fP uses an internal buffer to hold a "window" on the file it is
+scanning, in order to be able to output "before" and "after" lines when it
+finds a match. The size of the buffer is controlled by a parameter whose
+default value is 20K. The buffer itself is three times this size, but because
+of the way it is used for holding "before" lines, the longest line that is
+guaranteed to be processable is the parameter size. You can change the default
+parameter value by adding, for example,
+.sp
+  --with-pcre2grep-bufsize=50K
+.sp
+to the \fBconfigure\fP command. The caller of \fPpcre2grep\fP can override this
+value by using --buffer-size on the command line..
+.
+.
+.SH "PCRE2TEST OPTION FOR LIBREADLINE SUPPORT"
+.rs
+.sp
+If you add one of
+.sp
+  --enable-pcre2test-libreadline
+  --enable-pcre2test-libedit
+.sp
+to the \fBconfigure\fP command, \fBpcre2test\fP is linked with the
+\fBlibreadline\fP or\fBlibedit\fP library, respectively, and when its input is
+from a terminal, it reads it using the \fBreadline()\fP function. This provides
+line-editing and history facilities. Note that \fBlibreadline\fP is
+GPL-licensed, so if you distribute a binary of \fBpcre2test\fP linked in this
+way, there may be licensing issues. These can be avoided by linking instead
+with \fBlibedit\fP, which has a BSD licence.
+.P
+Setting --enable-pcre2test-libreadline causes the \fB-lreadline\fP option to be
+added to the \fBpcre2test\fP build. In many operating environments with a
+sytem-installed readline library this is sufficient. However, in some
+environments (e.g. if an unmodified distribution version of readline is in
+use), some extra configuration may be necessary. The INSTALL file for
+\fBlibreadline\fP says this:
+.sp
+  "Readline uses the termcap functions, but does not link with
+  the termcap or curses library itself, allowing applications
+  which link with readline the to choose an appropriate library."
+.sp
+If your environment has not been set up so that an appropriate library is
+automatically included, you may need to add something like
+.sp
+  LIBS="-ncurses"
+.sp
+immediately before the \fBconfigure\fP command.
+.
+.
+.SH "INCLUDING DEBUGGING CODE"
+.rs
+.sp
+If you add
+.sp
+  --enable-debug
+.sp
+to the \fBconfigure\fP command, additional debugging code is included in the
+build. This feature is intended for use by the PCRE2 maintainers.
+.
+.
+.SH "DEBUGGING WITH VALGRIND SUPPORT"
+.rs
+.sp
+If you add
+.sp
+  --enable-valgrind
+.sp
+to the \fBconfigure\fP command, PCRE2 will use valgrind annotations to mark
+certain memory regions as unaddressable. This allows it to detect invalid
+memory accesses, and is mostly useful for debugging PCRE2 itself.
+.
+.
+.SH "CODE COVERAGE REPORTING"
+.rs
+.sp
+If your C compiler is gcc, you can build a version of PCRE2 that can generate a
+code coverage report for its test suite. To enable this, you must install
+\fBlcov\fP version 1.6 or above. Then specify
+.sp
+  --enable-coverage
+.sp
+to the \fBconfigure\fP command and build PCRE2 in the usual way.
+.P
+Note that using \fBccache\fP (a caching C compiler) is incompatible with code
+coverage reporting. If you have configured \fBccache\fP to run automatically
+on your system, you must set the environment variable
+.sp
+  CCACHE_DISABLE=1
+.sp
+before running \fBmake\fP to build PCRE2, so that \fBccache\fP is not used.
+.P
+When --enable-coverage is used, the following addition targets are added to the
+\fIMakefile\fP:
+.sp
+  make coverage
+.sp
+This creates a fresh coverage report for the PCRE2 test suite. It is equivalent
+to running "make coverage-reset", "make coverage-baseline", "make check", and
+then "make coverage-report".
+.sp
+  make coverage-reset
+.sp
+This zeroes the coverage counters, but does nothing else.
+.sp
+  make coverage-baseline
+.sp
+This captures baseline coverage information.
+.sp
+  make coverage-report
+.sp
+This creates the coverage report.
+.sp
+  make coverage-clean-report
+.sp
+This removes the generated coverage report without cleaning the coverage data
+itself.
+.sp
+  make coverage-clean-data
+.sp
+This removes the captured coverage data without removing the coverage files
+created at compile time (*.gcno).
+.sp
+  make coverage-clean
+.sp
+This cleans all coverage data including the generated coverage report. For more
+information about code coverage, see the \fBgcov\fP and \fBlcov\fP
+documentation.
+.
+.
+.SH "SEE ALSO"
+.rs
+.sp
+\fBpcre2api\fP(3), \fBpcre2-config\fP(3).
+.
+.
+.SH AUTHOR
+.rs
+.sp
+.nf
+Philip Hazel
+University Computing Service
+Cambridge, England.
+.fi
+.
+.
+.SH REVISION
+.rs
+.sp
+.nf
+Last updated: 16 October 2015
+Copyright (c) 1997-2015 University of Cambridge.
+.fi
diff --git a/dist2/doc/pcre2callout.3 b/dist2/doc/pcre2callout.3
new file mode 100644
index 0000000..6919f5a
--- /dev/null
+++ b/dist2/doc/pcre2callout.3
@@ -0,0 +1,387 @@
+.TH PCRE2CALLOUT 3 "23 March 2015" "PCRE2 10.20"
+.SH NAME
+PCRE2 - Perl-compatible regular expressions (revised API)
+.SH SYNOPSIS
+.rs
+.sp
+.B #include <pcre2.h>
+.PP
+.SM
+.nf
+.B int (*pcre2_callout)(pcre2_callout_block *, void *);
+.sp
+.B int pcre2_callout_enumerate(const pcre2_code *\fIcode\fP,
+.B "  int (*\fIcallback\fP)(pcre2_callout_enumerate_block *, void *),"
+.B "  void *\fIuser_data\fP);"
+.fi
+.
+.SH DESCRIPTION
+.rs
+.sp
+PCRE2 provides a feature called "callout", which is a means of temporarily
+passing control to the caller of PCRE2 in the middle of pattern matching. The
+caller of PCRE2 provides an external function by putting its entry point in
+a match context (see \fBpcre2_set_callout()\fP in the
+.\" HREF
+\fBpcre2api\fP
+.\"
+documentation).
+.P
+Within a regular expression, (?C<arg>) indicates a point at which the external
+function is to be called. Different callout points can be identified by putting
+a number less than 256 after the letter C. The default value is zero.
+Alternatively, the argument may be a delimited string. The starting delimiter
+must be one of ` ' " ^ % # $ { and the ending delimiter is the same as the
+start, except for {, where the ending delimiter is }. If the ending delimiter
+is needed within the string, it must be doubled. For example, this pattern has
+two callout points:
+.sp
+  (?C1)abc(?C"some ""arbitrary"" text")def
+.sp
+If the PCRE2_AUTO_CALLOUT option bit is set when a pattern is compiled, PCRE2
+automatically inserts callouts, all with number 255, before each item in the
+pattern. For example, if PCRE2_AUTO_CALLOUT is used with the pattern
+.sp
+  A(\ed{2}|--)
+.sp
+it is processed as if it were
+.sp
+(?C255)A(?C255)((?C255)\ed{2}(?C255)|(?C255)-(?C255)-(?C255))(?C255)
+.sp
+Notice that there is a callout before and after each parenthesis and
+alternation bar. If the pattern contains a conditional group whose condition is
+an assertion, an automatic callout is inserted immediately before the
+condition. Such a callout may also be inserted explicitly, for example:
+.sp
+  (?(?C9)(?=a)ab|de)  (?(?C%text%)(?!=d)ab|de)
+.sp
+This applies only to assertion conditions (because they are themselves
+independent groups).
+.P
+Callouts can be useful for tracking the progress of pattern matching. The
+.\" HREF
+\fBpcre2test\fP
+.\"
+program has a pattern qualifier (/auto_callout) that sets automatic callouts.
+When any callouts are present, the output from \fBpcre2test\fP indicates how
+the pattern is being matched. This is useful information when you are trying to
+optimize the performance of a particular pattern.
+.
+.
+.SH "MISSING CALLOUTS"
+.rs
+.sp
+You should be aware that, because of optimizations in the way PCRE2 compiles
+and matches patterns, callouts sometimes do not happen exactly as you might
+expect.
+.
+.
+.SS "Auto-possessification"
+.rs
+.sp
+At compile time, PCRE2 "auto-possessifies" repeated items when it knows that
+what follows cannot be part of the repeat. For example, a+[bc] is compiled as
+if it were a++[bc]. The \fBpcre2test\fP output when this pattern is compiled
+with PCRE2_ANCHORED and PCRE2_AUTO_CALLOUT and then applied to the string
+"aaaa" is:
+.sp
+  --->aaaa
+   +0 ^        a+
+   +2 ^   ^    [bc]
+  No match
+.sp
+This indicates that when matching [bc] fails, there is no backtracking into a+
+and therefore the callouts that would be taken for the backtracks do not occur.
+You can disable the auto-possessify feature by passing PCRE2_NO_AUTO_POSSESS to
+\fBpcre2_compile()\fP, or starting the pattern with (*NO_AUTO_POSSESS). In this
+case, the output changes to this:
+.sp
+  --->aaaa
+   +0 ^        a+
+   +2 ^   ^    [bc]
+   +2 ^  ^     [bc]
+   +2 ^ ^      [bc]
+   +2 ^^       [bc]
+  No match
+.sp
+This time, when matching [bc] fails, the matcher backtracks into a+ and tries
+again, repeatedly, until a+ itself fails.
+.
+.
+.SS "Automatic .* anchoring"
+.rs
+.sp
+By default, an optimization is applied when .* is the first significant item in
+a pattern. If PCRE2_DOTALL is set, so that the dot can match any character, the
+pattern is automatically anchored. If PCRE2_DOTALL is not set, a match can
+start only after an internal newline or at the beginning of the subject, and
+\fBpcre2_compile()\fP remembers this. This optimization is disabled, however,
+if .* is in an atomic group or if there is a back reference to the capturing
+group in which it appears. It is also disabled if the pattern contains (*PRUNE)
+or (*SKIP). However, the presence of callouts does not affect it.
+.P
+For example, if the pattern .*\ed is compiled with PCRE2_AUTO_CALLOUT and
+applied to the string "aa", the \fBpcre2test\fP output is:
+.sp
+  --->aa
+   +0 ^      .*
+   +2 ^ ^    \ed
+   +2 ^^     \ed
+   +2 ^      \ed
+  No match
+.sp
+This shows that all match attempts start at the beginning of the subject. In
+other words, the pattern is anchored. You can disable this optimization by
+passing PCRE2_NO_DOTSTAR_ANCHOR to \fBpcre2_compile()\fP, or starting the
+pattern with (*NO_DOTSTAR_ANCHOR). In this case, the output changes to:
+.sp
+  --->aa
+   +0 ^      .*
+   +2 ^ ^    \ed
+   +2 ^^     \ed
+   +2 ^      \ed
+   +0  ^     .*
+   +2  ^^    \ed
+   +2  ^     \ed
+  No match
+.sp
+This shows more match attempts, starting at the second subject character.
+Another optimization, described in the next section, means that there is no
+subsequent attempt to match with an empty subject.
+.P
+If a pattern has more than one top-level branch, automatic anchoring occurs if
+all branches are anchorable.
+.
+.
+.SS "Other optimizations"
+.rs
+.sp
+Other optimizations that provide fast "no match" results also affect callouts.
+For example, if the pattern is
+.sp
+  ab(?C4)cd
+.sp
+PCRE2 knows that any matching string must contain the letter "d". If the
+subject string is "abyz", the lack of "d" means that matching doesn't ever
+start, and the callout is never reached. However, with "abyd", though the
+result is still no match, the callout is obeyed.
+.P
+PCRE2 also knows the minimum length of a matching string, and will immediately
+give a "no match" return without actually running a match if the subject is not
+long enough, or, for unanchored patterns, if it has been scanned far enough.
+.P
+You can disable these optimizations by passing the PCRE2_NO_START_OPTIMIZE
+option to \fBpcre2_compile()\fP, or by starting the pattern with
+(*NO_START_OPT). This slows down the matching process, but does ensure that
+callouts such as the example above are obeyed.
+.
+.
+.\" HTML <a name="calloutinterface"></a>
+.SH "THE CALLOUT INTERFACE"
+.rs
+.sp
+During matching, when PCRE2 reaches a callout point, if an external function is
+set in the match context, it is called. This applies to both normal and DFA
+matching. The first argument to the callout function is a pointer to a
+\fBpcre2_callout\fP block. The second argument is the void * callout data that
+was supplied when the callout was set up by calling \fBpcre2_set_callout()\fP
+(see the
+.\" HREF
+\fBpcre2api\fP
+.\"
+documentation). The callout block structure contains the following fields:
+.sp
+  uint32_t      \fIversion\fP;
+  uint32_t      \fIcallout_number\fP;
+  uint32_t      \fIcapture_top\fP;
+  uint32_t      \fIcapture_last\fP;
+  PCRE2_SIZE   *\fIoffset_vector\fP;
+  PCRE2_SPTR    \fImark\fP;
+  PCRE2_SPTR    \fIsubject\fP;
+  PCRE2_SIZE    \fIsubject_length\fP;
+  PCRE2_SIZE    \fIstart_match\fP;
+  PCRE2_SIZE    \fIcurrent_position\fP;
+  PCRE2_SIZE    \fIpattern_position\fP;
+  PCRE2_SIZE    \fInext_item_length\fP;
+  PCRE2_SIZE    \fIcallout_string_offset\fP;
+  PCRE2_SIZE    \fIcallout_string_length\fP;
+  PCRE2_SPTR    \fIcallout_string\fP;
+.sp
+The \fIversion\fP field contains the version number of the block format. The
+current version is 1; the three callout string fields were added for this
+version. If you are writing an application that might use an earlier release of
+PCRE2, you should check the version number before accessing any of these
+fields. The version number will increase in future if more fields are added,
+but the intention is never to remove any of the existing fields.
+.
+.
+.SS "Fields for numerical callouts"
+.rs
+.sp
+For a numerical callout, \fIcallout_string\fP is NULL, and \fIcallout_number\fP
+contains the number of the callout, in the range 0-255. This is the number
+that follows (?C for manual callouts; it is 255 for automatically generated
+callouts.
+.
+.
+.SS "Fields for string callouts"
+.rs
+.sp
+For callouts with string arguments, \fIcallout_number\fP is always zero, and
+\fIcallout_string\fP points to the string that is contained within the compiled
+pattern. Its length is given by \fIcallout_string_length\fP. Duplicated ending
+delimiters that were present in the original pattern string have been turned
+into single characters, but there is no other processing of the callout string
+argument. An additional code unit containing binary zero is present after the
+string, but is not included in the length. The delimiter that was used to start
+the string is also stored within the pattern, immediately before the string
+itself. You can access this delimiter as \fIcallout_string\fP[-1] if you need
+it.
+.P
+The \fIcallout_string_offset\fP field is the code unit offset to the start of
+the callout argument string within the original pattern string. This is
+provided for the benefit of applications such as script languages that might
+need to report errors in the callout string within the pattern.
+.
+.
+.SS "Fields for all callouts"
+.rs
+.sp
+The remaining fields in the callout block are the same for both kinds of
+callout.
+.P
+The \fIoffset_vector\fP field is a pointer to the vector of capturing offsets
+(the "ovector") that was passed to the matching function in the match data
+block. When \fBpcre2_match()\fP is used, the contents can be inspected in
+order to extract substrings that have been matched so far, in the same way as
+for extracting substrings after a match has completed. For the DFA matching
+function, this field is not useful.
+.P
+The \fIsubject\fP and \fIsubject_length\fP fields contain copies of the values
+that were passed to the matching function.
+.P
+The \fIstart_match\fP field normally contains the offset within the subject at
+which the current match attempt started. However, if the escape sequence \eK
+has been encountered, this value is changed to reflect the modified starting
+point. If the pattern is not anchored, the callout function may be called
+several times from the same point in the pattern for different starting points
+in the subject.
+.P
+The \fIcurrent_position\fP field contains the offset within the subject of the
+current match pointer.
+.P
+When the \fBpcre2_match()\fP is used, the \fIcapture_top\fP field contains one
+more than the number of the highest numbered captured substring so far. If no
+substrings have been captured, the value of \fIcapture_top\fP is one. This is
+always the case when the DFA functions are used, because they do not support
+captured substrings.
+.P
+The \fIcapture_last\fP field contains the number of the most recently captured
+substring. However, when a recursion exits, the value reverts to what it was
+outside the recursion, as do the values of all captured substrings. If no
+substrings have been captured, the value of \fIcapture_last\fP is 0. This is
+always the case for the DFA matching functions.
+.P
+The \fIpattern_position\fP field contains the offset in the pattern string to
+the next item to be matched.
+.P
+The \fInext_item_length\fP field contains the length of the next item to be
+matched in the pattern string. When the callout immediately precedes an
+alternation bar, a closing parenthesis, or the end of the pattern, the length
+is zero. When the callout precedes an opening parenthesis, the length is that
+of the entire subpattern.
+.P
+The \fIpattern_position\fP and \fInext_item_length\fP fields are intended to
+help in distinguishing between different automatic callouts, which all have the
+same callout number. However, they are set for all callouts, and are used by
+\fBpcre2test\fP to show the next item to be matched when displaying callout
+information.
+.P
+In callouts from \fBpcre2_match()\fP the \fImark\fP field contains a pointer to
+the zero-terminated name of the most recently passed (*MARK), (*PRUNE), or
+(*THEN) item in the match, or NULL if no such items have been passed. Instances
+of (*PRUNE) or (*THEN) without a name do not obliterate a previous (*MARK). In
+callouts from the DFA matching function this field always contains NULL.
+.
+.
+.SH "RETURN VALUES FROM CALLOUTS"
+.rs
+.sp
+The external callout function returns an integer to PCRE2. If the value is
+zero, matching proceeds as normal. If the value is greater than zero, matching
+fails at the current point, but the testing of other matching possibilities
+goes ahead, just as if a lookahead assertion had failed. If the value is less
+than zero, the match is abandoned, and the matching function returns the
+negative value.
+.P
+Negative values should normally be chosen from the set of PCRE2_ERROR_xxx
+values. In particular, PCRE2_ERROR_NOMATCH forces a standard "no match"
+failure. The error number PCRE2_ERROR_CALLOUT is reserved for use by callout
+functions; it will never be used by PCRE2 itself.
+.
+.
+.SH "CALLOUT ENUMERATION"
+.rs
+.sp
+.nf
+.B int pcre2_callout_enumerate(const pcre2_code *\fIcode\fP,
+.B "  int (*\fIcallback\fP)(pcre2_callout_enumerate_block *, void *),"
+.B "  void *\fIuser_data\fP);"
+.fi
+.sp
+A script language that supports the use of string arguments in callouts might
+like to scan all the callouts in a pattern before running the match. This can
+be done by calling \fBpcre2_callout_enumerate()\fP. The first argument is a
+pointer to a compiled pattern, the second points to a callback function, and
+the third is arbitrary user data. The callback function is called for every
+callout in the pattern in the order in which they appear. Its first argument is
+a pointer to a callout enumeration block, and its second argument is the
+\fIuser_data\fP value that was passed to \fBpcre2_callout_enumerate()\fP. The
+data block contains the following fields:
+.sp
+  \fIversion\fP                Block version number
+  \fIpattern_position\fP       Offset to next item in pattern
+  \fInext_item_length\fP       Length of next item in pattern
+  \fIcallout_number\fP         Number for numbered callouts
+  \fIcallout_string_offset\fP  Offset to string within pattern
+  \fIcallout_string_length\fP  Length of callout string
+  \fIcallout_string\fP         Points to callout string or is NULL
+.sp
+The version number is currently 0. It will increase if new fields are ever
+added to the block. The remaining fields are the same as their namesakes in the
+\fBpcre2_callout\fP block that is used for callouts during matching, as
+described
+.\" HTML <a href="#calloutinterface">
+.\" </a>
+above.
+.\"
+.P
+Note that the value of \fIpattern_position\fP is unique for each callout.
+However, if a callout occurs inside a group that is quantified with a non-zero
+minimum or a fixed maximum, the group is replicated inside the compiled
+pattern. For example, a pattern such as /(a){2}/ is compiled as if it were
+/(a)(a)/. This means that the callout will be enumerated more than once, but
+with the same value for \fIpattern_position\fP in each case.
+.P
+The callback function should normally return zero. If it returns a non-zero
+value, scanning the pattern stops, and that value is returned from
+\fBpcre2_callout_enumerate()\fP.
+.
+.
+.SH AUTHOR
+.rs
+.sp
+.nf
+Philip Hazel
+University Computing Service
+Cambridge, England.
+.fi
+.
+.
+.SH REVISION
+.rs
+.sp
+.nf
+Last updated: 23 March 2015
+Copyright (c) 1997-2015 University of Cambridge.
+.fi
diff --git a/dist2/doc/pcre2compat.3 b/dist2/doc/pcre2compat.3
new file mode 100644
index 0000000..a3306d7
--- /dev/null
+++ b/dist2/doc/pcre2compat.3
@@ -0,0 +1,190 @@
+.TH PCRE2COMPAT 3 "15 March 2015" "PCRE2 10.20"
+.SH NAME
+PCRE2 - Perl-compatible regular expressions (revised API)
+.SH "DIFFERENCES BETWEEN PCRE2 AND PERL"
+.rs
+.sp
+This document describes the differences in the ways that PCRE2 and Perl handle
+regular expressions. The differences described here are with respect to Perl
+versions 5.10 and above.
+.P
+1. PCRE2 has only a subset of Perl's Unicode support. Details of what it does
+have are given in the
+.\" HREF
+\fBpcre2unicode\fP
+.\"
+page.
+.P
+2. PCRE2 allows repeat quantifiers only on parenthesized assertions, but they
+do not mean what you might think. For example, (?!a){3} does not assert that
+the next three characters are not "a". It just asserts that the next character
+is not "a" three times (in principle: PCRE2 optimizes this to run the assertion
+just once). Perl allows repeat quantifiers on other assertions such as \eb, but
+these do not seem to have any use.
+.P
+3. Capturing subpatterns that occur inside negative lookahead assertions are
+counted, but their entries in the offsets vector are never set. Perl sometimes
+(but not always) sets its numerical variables from inside negative assertions.
+.P
+4. The following Perl escape sequences are not supported: \el, \eu, \eL,
+\eU, and \eN when followed by a character name or Unicode value. (\eN on its
+own, matching a non-newline character, is supported.) In fact these are
+implemented by Perl's general string-handling and are not part of its pattern
+matching engine. If any of these are encountered by PCRE2, an error is
+generated by default. However, if the PCRE2_ALT_BSUX option is set,
+\eU and \eu are interpreted as ECMAScript interprets them.
+.P
+5. The Perl escape sequences \ep, \eP, and \eX are supported only if PCRE2 is
+built with Unicode support. The properties that can be tested with \ep and \eP
+are limited to the general category properties such as Lu and Nd, script names
+such as Greek or Han, and the derived properties Any and L&. PCRE2 does support
+the Cs (surrogate) property, which Perl does not; the Perl documentation says
+"Because Perl hides the need for the user to understand the internal
+representation of Unicode characters, there is no need to implement the
+somewhat messy concept of surrogates."
+.P
+6. PCRE2 does support the \eQ...\eE escape for quoting substrings. Characters
+in between are treated as literals. This is slightly different from Perl in
+that $ and @ are also handled as literals inside the quotes. In Perl, they
+cause variable interpolation (but of course PCRE2 does not have variables).
+Note the following examples:
+.sp
+    Pattern            PCRE2 matches      Perl matches
+.sp
+.\" JOIN
+    \eQabc$xyz\eE        abc$xyz           abc followed by the
+                                           contents of $xyz
+    \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.
+.P
+7. Fairly obviously, PCRE2 does not support the (?{code}) and (??{code})
+constructions. However, there is support for recursive patterns. This is not
+available in Perl 5.8, but it is in Perl 5.10. Also, the PCRE2 "callout"
+feature allows an external function to be called during pattern matching. See
+the
+.\" HREF
+\fBpcre2callout\fP
+.\"
+documentation for details.
+.P
+8. Subroutine calls (whether recursive or not) are treated as atomic groups.
+Atomic recursion is like Python, but unlike Perl. Captured values that are set
+outside a subroutine call can be referenced from inside in PCRE2, but not in
+Perl. There is a discussion that explains these differences in more detail in
+the
+.\" HTML <a href="pcre2pattern.html#recursiondifference">
+.\" </a>
+section on recursion differences from Perl
+.\"
+in the
+.\" HREF
+\fBpcre2pattern\fP
+.\"
+page.
+.P
+9. If any of the backtracking control verbs are used in a subpattern that is
+called as a subroutine (whether or not recursively), their effect is confined
+to that subpattern; it does not extend to the surrounding pattern. This is not
+always the case in Perl. In particular, if (*THEN) is present in a group that
+is called as a subroutine, its action is limited to that group, even if the
+group does not contain any | characters. Note that such subpatterns are
+processed as anchored at the point where they are tested.
+.P
+10. If a pattern contains more than one backtracking control verb, the first
+one that is backtracked onto acts. For example, in the pattern
+A(*COMMIT)B(*PRUNE)C a failure in B triggers (*COMMIT), but a failure in C
+triggers (*PRUNE). Perl's behaviour is more complex; in many cases it is the
+same as PCRE2, but there are examples where it differs.
+.P
+11. Most backtracking verbs in assertions have their normal actions. They are
+not confined to the assertion.
+.P
+12. There are some differences that are concerned with the settings of captured
+strings when part of a pattern is repeated. For example, matching "aba" against
+the pattern /^(a(b)?)+$/ in Perl leaves $2 unset, but in PCRE2 it is set to
+"b".
+.P
+13. PCRE2's handling of duplicate subpattern numbers and duplicate subpattern
+names is not as general as Perl's. This is a consequence of the fact the PCRE2
+works internally just with numbers, using an external table to translate
+between numbers and names. In particular, a pattern such as (?|(?<a>A)|(?<b)B),
+where the two capturing parentheses have the same number but different names,
+is not supported, and causes an error at compile time. If it were allowed, it
+would not be possible to distinguish which parentheses matched, because both
+names map to capturing subpattern number 1. To avoid this confusing situation,
+an error is given at compile time.
+.P
+14. Perl recognizes comments in some places that PCRE2 does not, for example,
+between the ( and ? at the start of a subpattern. If the /x modifier is set,
+Perl allows white space between ( and ? (though current Perls warn that this is
+deprecated) but PCRE2 never does, even if the PCRE2_EXTENDED option is set.
+.P
+15. Perl, when in warning mode, gives warnings for character classes such as
+[A-\ed] or [a-[:digit:]]. It then treats the hyphens as literals. PCRE2 has no
+warning features, so it gives an error in these cases because they are almost
+certainly user mistakes.
+.P
+16. In PCRE2, the upper/lower case character properties Lu and Ll are not
+affected when case-independent matching is specified. For example, \ep{Lu}
+always matches an upper case letter. I think Perl has changed in this respect;
+in the release at the time of writing (5.16), \ep{Lu} and \ep{Ll} match all
+letters, regardless of case, when case independence is specified.
+.P
+17. PCRE2 provides some extensions to the Perl regular expression facilities.
+Perl 5.10 includes new features that are not in earlier versions of Perl, some
+of which (such as named parentheses) have been in PCRE2 for some time. This
+list is with respect to Perl 5.10:
+.sp
+(a) Although lookbehind assertions in PCRE2 must match fixed length strings,
+each alternative branch of a lookbehind assertion can match a different length
+of string. Perl requires them all to have the same length.
+.sp
+(b) If PCRE2_DOLLAR_ENDONLY is set and PCRE2_MULTILINE is not set, the $
+meta-character matches only at the very end of the string.
+.sp
+(c) A backslash followed by a letter with no special meaning is faulted. (Perl
+can be made to issue a warning.)
+.sp
+(d) If PCRE2_UNGREEDY is set, the greediness of the repetition quantifiers is
+inverted, that is, by default they are not greedy, but if followed by a
+question mark they are.
+.sp
+(e) PCRE2_ANCHORED can be used at matching time to force a pattern to be tried
+only at the first matching position in the subject string.
+.sp
+(f) The PCRE2_NOTBOL, PCRE2_NOTEOL, PCRE2_NOTEMPTY, PCRE2_NOTEMPTY_ATSTART, and
+PCRE2_NO_AUTO_CAPTURE options have no Perl equivalents.
+.sp
+(g) The \eR escape sequence can be restricted to match only CR, LF, or CRLF
+by the PCRE2_BSR_ANYCRLF option.
+.sp
+(h) The callout facility is PCRE2-specific.
+.sp
+(i) The partial matching facility is PCRE2-specific.
+.sp
+(j) The alternative matching function (\fBpcre2_dfa_match()\fP matches in a
+different way and is not Perl-compatible.
+.sp
+(k) PCRE2 recognizes some special sequences such as (*CR) at the start of
+a pattern that set overall options that cannot be changed within the pattern.
+.
+.
+.SH AUTHOR
+.rs
+.sp
+.nf
+Philip Hazel
+University Computing Service
+Cambridge, England.
+.fi
+.
+.
+.SH REVISION
+.rs
+.sp
+.nf
+Last updated: 15 March 2015
+Copyright (c) 1997-2015 University of Cambridge.
+.fi
diff --git a/dist2/doc/pcre2demo.3 b/dist2/doc/pcre2demo.3
new file mode 100644
index 0000000..5deed0a
--- /dev/null
+++ b/dist2/doc/pcre2demo.3
@@ -0,0 +1,441 @@
+.\" Start example.
+.de EX
+.  nr mE \\n(.f
+.  nf
+.  nh
+.  ft CW
+..
+.
+.
+.\" End example.
+.de EE
+.  ft \\n(mE
+.  fi
+.  hy \\n(HY
+..
+.
+.EX
+/*************************************************
+*           PCRE2 DEMONSTRATION PROGRAM          *
+*************************************************/
+
+/* This is a demonstration program to illustrate a straightforward way of
+calling the PCRE2 regular expression library from a C program. See the
+pcre2sample documentation for a short discussion ("man pcre2sample" if you have
+the PCRE2 man pages installed). PCRE2 is a revised API for the library, and is
+incompatible with the original PCRE API.
+
+There are actually three libraries, each supporting a different code unit
+width. This demonstration program uses the 8-bit library.
+
+In Unix-like environments, if PCRE2 is installed in your standard system
+libraries, you should be able to compile this program using this command:
+
+gcc -Wall pcre2demo.c -lpcre2-8 -o pcre2demo
+
+If PCRE2 is not installed in a standard place, it is likely to be installed
+with support for the pkg-config mechanism. If you have pkg-config, you can
+compile this program using this command:
+
+gcc -Wall pcre2demo.c `pkg-config --cflags --libs libpcre2-8` -o pcre2demo
+
+If you do not have pkg-config, you may have to use this:
+
+gcc -Wall pcre2demo.c -I/usr/local/include -L/usr/local/lib \e
+  -R/usr/local/lib -lpcre2-8 -o pcre2demo
+
+Replace "/usr/local/include" and "/usr/local/lib" with wherever the include and
+library files for PCRE2 are installed on your system. Only some operating
+systems (Solaris is one) use the -R option.
+
+Building under Windows:
+
+If you want to statically link this program against a non-dll .a file, you must
+define PCRE2_STATIC before including pcre2.h, so in this environment, uncomment
+the following line. */
+
+/* #define PCRE2_STATIC */
+
+/* This macro must be defined before including pcre2.h. For a program that uses
+only one code unit width, it makes it possible to use generic function names
+such as pcre2_compile(). */
+
+#define PCRE2_CODE_UNIT_WIDTH 8
+
+#include <stdio.h>
+#include <string.h>
+#include <pcre2.h>
+
+
+/**************************************************************************
+* Here is the program. The API includes the concept of "contexts" for     *
+* setting up unusual interface requirements for compiling and matching,   *
+* such as custom memory managers and non-standard newline definitions.    *
+* This program does not do any of this, so it makes no use of contexts,   *
+* always passing NULL where a context could be given.                     *
+**************************************************************************/
+
+int main(int argc, char **argv)
+{
+pcre2_code *re;
+PCRE2_SPTR pattern;     /* PCRE2_SPTR is a pointer to unsigned code units of */
+PCRE2_SPTR subject;     /* the appropriate width (8, 16, or 32 bits). */
+PCRE2_SPTR name_table;
+
+int crlf_is_newline;
+int errornumber;
+int find_all;
+int i;
+int namecount;
+int name_entry_size;
+int rc;
+int utf8;
+
+uint32_t option_bits;
+uint32_t newline;
+
+PCRE2_SIZE erroroffset;
+PCRE2_SIZE *ovector;
+
+size_t subject_length;
+pcre2_match_data *match_data;
+
+
+
+/**************************************************************************
+* 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++)
+  {
+  if (strcmp(argv[i], "-g") == 0) find_all = 1;
+    else break;
+  }
+
+/* After the options, we require exactly two arguments, which are the pattern,
+and the subject string. */
+
+if (argc - i != 2)
+  {
+  printf("Two arguments required: a regex and a subject string\en");
+  return 1;
+  }
+
+/* As pattern and subject are char arguments, they can be straightforwardly
+cast to PCRE2_SPTR as we are working in 8-bit code units. */
+
+pattern = (PCRE2_SPTR)argv[i];
+subject = (PCRE2_SPTR)argv[i+1];
+subject_length = strlen((char *)subject);
+
+
+/*************************************************************************
+* Now we are going to compile the regular expression pattern, and handle *
+* any errors that are detected.                                          *
+*************************************************************************/
+
+re = pcre2_compile(
+  pattern,               /* the pattern */
+  PCRE2_ZERO_TERMINATED, /* indicates pattern is zero-terminated */
+  0,                     /* default options */
+  &errornumber,          /* for error number */
+  &erroroffset,          /* for error offset */
+  NULL);                 /* use default compile context */
+
+/* Compilation failed: print the error message and exit. */
+
+if (re == NULL)
+  {
+  PCRE2_UCHAR buffer[256];
+  pcre2_get_error_message(errornumber, buffer, sizeof(buffer));
+  printf("PCRE2 compilation failed at offset %d: %s\en", (int)erroroffset,
+    buffer);
+  return 1;
+  }
+
+
+/*************************************************************************
+* If the compilation succeeded, we call PCRE again, in order to do a     *
+* pattern match against the subject string. This does just ONE match. If *
+* further matching is needed, it will be done below. Before running the  *
+* match we must set up a match_data block for holding the result.        *
+*************************************************************************/
+
+/* Using this function ensures that the block is exactly the right size for
+the number of capturing parentheses in the pattern. */
+
+match_data = pcre2_match_data_create_from_pattern(re, NULL);
+
+rc = pcre2_match(
+  re,                   /* the compiled pattern */
+  subject,              /* the subject string */
+  subject_length,       /* the length of the subject */
+  0,                    /* start at offset 0 in the subject */
+  0,                    /* default options */
+  match_data,           /* block for storing the result */
+  NULL);                /* use default match context */
+
+/* Matching failed: handle error cases */
+
+if (rc < 0)
+  {
+  switch(rc)
+    {
+    case PCRE2_ERROR_NOMATCH: printf("No match\en"); break;
+    /*
+    Handle other special cases if you like
+    */
+    default: printf("Matching error %d\en", rc); break;
+    }
+  pcre2_match_data_free(match_data);   /* Release memory used for the match */
+  pcre2_code_free(re);                 /* data and the compiled pattern. */
+  return 1;
+  }
+
+/* Match succeded. Get a pointer to the output vector, where string offsets are
+stored. */
+
+ovector = pcre2_get_ovector_pointer(match_data);
+printf("\enMatch succeeded at offset %d\en", (int)ovector[0]);
+
+
+/*************************************************************************
+* We have found the first match within the subject string. If the output *
+* vector wasn't big enough, say so. Then output any substrings that were *
+* captured.                                                              *
+*************************************************************************/
+
+/* The output vector wasn't big enough. This should not happen, because we used
+pcre2_match_data_create_from_pattern() above. */
+
+if (rc == 0)
+  printf("ovector was not big enough for all the captured substrings\en");
+
+/* Show substrings stored in the output vector by number. Obviously, in a real
+application you might want to do things other than print them. */
+
+for (i = 0; i < rc; i++)
+  {
+  PCRE2_SPTR substring_start = subject + ovector[2*i];
+  size_t substring_length = ovector[2*i+1] - ovector[2*i];
+  printf("%2d: %.*s\en", i, (int)substring_length, (char *)substring_start);
+  }
+
+
+/**************************************************************************
+* That concludes the basic part of this demonstration program. We have    *
+* compiled a pattern, and performed a single match. The code that follows *
+* shows first 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. */
+
+(void)pcre2_pattern_info(
+  re,                   /* the compiled pattern */
+  PCRE2_INFO_NAMECOUNT, /* get the number of named substrings */
+  &namecount);          /* where to put the answer */
+
+if (namecount <= 0) printf("No named substrings\en"); else
+  {
+  PCRE2_SPTR tabptr;
+  printf("Named substrings\en");
+
+  /* Before we can access the substrings, we must extract the table for
+  translating names to numbers, and the size of each entry in the table. */
+
+  (void)pcre2_pattern_info(
+    re,                       /* the compiled pattern */
+    PCRE2_INFO_NAMETABLE,     /* address of the table */
+    &name_table);             /* where to put the answer */
+
+  (void)pcre2_pattern_info(
+    re,                       /* the compiled pattern */
+    PCRE2_INFO_NAMEENTRYSIZE, /* size of each entry in the table */
+    &name_entry_size);        /* where to put the answer */
+
+  /* Now we can scan the table and, for each entry, print the number, the name,
+  and the substring itself. In the 8-bit library the number is held in two
+  bytes, most significant first. */
+
+  tabptr = name_table;
+  for (i = 0; i < namecount; i++)
+    {
+    int n = (tabptr[0] << 8) | tabptr[1];
+    printf("(%d) %*s: %.*s\en", n, name_entry_size - 3, tabptr + 2,
+      (int)(ovector[2*n+1] - ovector[2*n]), subject + ovector[2*n]);
+    tabptr += name_entry_size;
+    }
+  }
+
+
+/*************************************************************************
+* If the "-g" option was given on the command line, we want to continue  *
+* to search for additional matches in the subject string, in a similar   *
+* way to the /g option in Perl. This turns out to be trickier than you   *
+* might think because of the possibility of matching an empty string.    *
+* What happens is as follows:                                            *
+*                                                                        *
+* If the previous match was NOT for an empty string, we can just start   *
+* the next match at the end of the previous one.                         *
+*                                                                        *
+* If the previous match WAS for an empty string, we can't do that, as it *
+* would lead to an infinite loop. Instead, a call of pcre2_match() is    *
+* made with the PCRE2_NOTEMPTY_ATSTART and PCRE2_ANCHORED flags set. The *
+* first of these tells PCRE2 that an empty string at the start of the    *
+* subject is not a valid match; other possibilities must be tried. The   *
+* second flag restricts PCRE2 to one match attempt at the initial string *
+* position. If this match succeeds, an alternative to the empty string   *
+* match has been found, and we can print it and proceed round the loop,  *
+* advancing by the length of whatever was found. If this match does not  *
+* succeed, we still stay in the loop, advancing by just one character.   *
+* In UTF-8 mode, which can be set by (*UTF) in the pattern, this may be  *
+* more than one byte.                                                    *
+*                                                                        *
+* However, there is a complication concerned with newlines. When the     *
+* newline convention is such that CRLF is a valid newline, we must       *
+* advance by two characters rather than one. The newline convention can  *
+* be set in the regex by (*CR), etc.; if not, we must find the default.  *
+*************************************************************************/
+
+if (!find_all)     /* Check for -g */
+  {
+  pcre2_match_data_free(match_data);  /* Release the memory that was used */
+  pcre2_code_free(re);                /* for the match data and the pattern. */
+  return 0;                           /* Exit the program. */
+  }
+
+/* Before running the loop, check for UTF-8 and whether CRLF is a valid newline
+sequence. First, find the options with which the regex was compiled and extract
+the UTF state. */
+
+(void)pcre2_pattern_info(re, PCRE2_INFO_ALLOPTIONS, &option_bits);
+utf8 = (option_bits & PCRE2_UTF) != 0;
+
+/* Now find the newline convention and see whether CRLF is a valid newline
+sequence. */
+
+(void)pcre2_pattern_info(re, PCRE2_INFO_NEWLINE, &newline);
+crlf_is_newline = newline == PCRE2_NEWLINE_ANY ||
+                  newline == PCRE2_NEWLINE_CRLF ||
+                  newline == PCRE2_NEWLINE_ANYCRLF;
+
+/* Loop for second and subsequent matches */
+
+for (;;)
+  {
+  uint32_t options = 0;                    /* Normally no options */
+  PCRE2_SIZE start_offset = ovector[1];  /* Start at end of previous match */
+
+  /* If the previous match was for an empty string, we are finished if we are
+  at the end of the subject. Otherwise, arrange to run another match at the
+  same point to see if a non-empty match can be found. */
+
+  if (ovector[0] == ovector[1])
+    {
+    if (ovector[0] == subject_length) break;
+    options = PCRE2_NOTEMPTY_ATSTART | PCRE2_ANCHORED;
+    }
+
+  /* Run the next matching operation */
+
+  rc = pcre2_match(
+    re,                   /* the compiled pattern */
+    subject,              /* the subject string */
+    subject_length,       /* the length of the subject */
+    start_offset,         /* starting offset in the subject */
+    options,              /* options */
+    match_data,           /* block for storing the result */
+    NULL);                /* use default match context */
+
+  /* This time, a result of NOMATCH isn't an error. If the value in "options"
+  is zero, it just means we have found all possible matches, so the loop ends.
+  Otherwise, it means we have failed to find a non-empty-string match at a
+  point where there was a previous empty-string match. In this case, we do what
+  Perl does: advance the matching position by one character, and continue. We
+  do this by setting the "end of previous match" offset, because that is picked
+  up at the top of the loop as the point at which to start again.
+
+  There are two complications: (a) When CRLF is a valid newline sequence, and
+  the current position is just before it, advance by an extra byte. (b)
+  Otherwise we must ensure that we skip an entire UTF character if we are in
+  UTF mode. */
+
+  if (rc == PCRE2_ERROR_NOMATCH)
+    {
+    if (options == 0) break;                    /* All matches found */
+    ovector[1] = start_offset + 1;              /* Advance one code unit */
+    if (crlf_is_newline &&                      /* If CRLF is newline & */
+        start_offset < subject_length - 1 &&    /* we are at CRLF, */
+        subject[start_offset] == '\er' &&
+        subject[start_offset + 1] == '\en')
+      ovector[1] += 1;                          /* Advance by one more. */
+    else if (utf8)                              /* Otherwise, ensure we */
+      {                                         /* advance a whole UTF-8 */
+      while (ovector[1] < subject_length)       /* character. */
+        {
+        if ((subject[ovector[1]] & 0xc0) != 0x80) break;
+        ovector[1] += 1;
+        }
+      }
+    continue;    /* Go round the loop again */
+    }
+
+  /* Other matching errors are not recoverable. */
+
+  if (rc < 0)
+    {
+    printf("Matching error %d\en", rc);
+    pcre2_match_data_free(match_data);
+    pcre2_code_free(re);
+    return 1;
+    }
+
+  /* Match succeded */
+
+  printf("\enMatch succeeded again at offset %d\en", (int)ovector[0]);
+
+  /* The match succeeded, but the output vector wasn't big enough. This
+  should not happen. */
+
+  if (rc == 0)
+    printf("ovector was not big enough for all the captured substrings\en");
+
+  /* As before, show substrings stored in the output vector by number, and then
+  also any named substrings. */
+
+  for (i = 0; i < rc; i++)
+    {
+    PCRE2_SPTR substring_start = subject + ovector[2*i];
+    size_t substring_length = ovector[2*i+1] - ovector[2*i];
+    printf("%2d: %.*s\en", i, (int)substring_length, (char *)substring_start);
+    }
+
+  if (namecount <= 0) printf("No named substrings\en"); else
+    {
+    PCRE2_SPTR tabptr = name_table;
+    printf("Named substrings\en");
+    for (i = 0; i < namecount; i++)
+      {
+      int n = (tabptr[0] << 8) | tabptr[1];
+      printf("(%d) %*s: %.*s\en", n, name_entry_size - 3, tabptr + 2,
+        (int)(ovector[2*n+1] - ovector[2*n]), subject + ovector[2*n]);
+      tabptr += name_entry_size;
+      }
+    }
+  }      /* End of loop to find second and subsequent matches */
+
+printf("\en");
+pcre2_match_data_free(match_data);
+pcre2_code_free(re);
+return 0;
+}
+
+/* End of pcre2demo.c */
+.EE
diff --git a/dist/doc/pcregrep.1 b/dist2/doc/pcre2grep.1
similarity index 77%
rename from dist/doc/pcregrep.1
rename to dist2/doc/pcre2grep.1
index 9886675..028a91e 100644
--- a/dist/doc/pcregrep.1
+++ b/dist2/doc/pcre2grep.1
@@ -1,29 +1,29 @@
-.TH PCREGREP 1 "03 April 2014" "PCRE 8.35"
+.TH PCRE2GREP 1 "03 January 2015" "PCRE2 10.00"
 .SH NAME
-pcregrep - a grep with Perl-compatible regular expressions.
+pcre2grep - a grep with Perl-compatible regular expressions.
 .SH SYNOPSIS
-.B pcregrep [options] [long options] [pattern] [path1 path2 ...]
+.B pcre2grep [options] [long options] [pattern] [path1 path2 ...]
 .
 .SH DESCRIPTION
 .rs
 .sp
-\fBpcregrep\fP searches files for character patterns, in the same way as other
-grep commands do, but it uses the PCRE regular expression library to support
+\fBpcre2grep\fP searches files for character patterns, in the same way as other
+grep commands do, but it uses the PCRE2 regular expression library to support
 patterns that are compatible with the regular expressions of Perl 5. See
 .\" HREF
-\fBpcresyntax\fP(3)
+\fBpcre2syntax\fP(3)
 .\"
 for a quick-reference summary of pattern syntax, or
 .\" HREF
-\fBpcrepattern\fP(3)
+\fBpcre2pattern\fP(3)
 .\"
 for a full description of the syntax and semantics of the regular expressions
-that PCRE supports.
+that PCRE2 supports.
 .P
 Patterns, whether supplied on the command line or in a separate file, are given
 without delimiters. For example:
 .sp
-  pcregrep Thursday /etc/motd
+  pcre2grep Thursday /etc/motd
 .sp
 If you attempt to use delimiters (for example, by surrounding a pattern with
 slashes, as is common in Perl scripts), they are interpreted as part of the
@@ -37,25 +37,26 @@
 arguments are treated as path names. At least one of \fB-e\fP, \fB-f\fP, or an
 argument pattern must be provided.
 .P
-If no files are specified, \fBpcregrep\fP reads the standard input. The
+If no files are specified, \fBpcre2grep\fP reads the standard input. The
 standard input can also be referenced by a name consisting of a single hyphen.
 For example:
 .sp
-  pcregrep some-pattern /file1 - /file3
+  pcre2grep some-pattern file1 - file3
 .sp
-By default, each line that matches a pattern is copied to the standard
-output, and if there is more than one file, the file name is output at the
-start of each line, followed by a colon. However, there are options that can
-change how \fBpcregrep\fP behaves. In particular, the \fB-M\fP option makes it
-possible to search for patterns that span line boundaries. What defines a line
-boundary is controlled by the \fB-N\fP (\fB--newline\fP) option.
+Input files are searched line by line. By default, each line that matches a
+pattern is copied to the standard output, and if there is more than one file,
+the file name is output at the start of each line, followed by a colon.
+However, there are options that can change how \fBpcre2grep\fP behaves. In
+particular, the \fB-M\fP option makes it possible to search for strings that
+span line boundaries. What defines a line boundary is controlled by the
+\fB-N\fP (\fB--newline\fP) option.
 .P
 The amount of memory used for buffering files that are being scanned is
 controlled by a parameter that can be set by the \fB--buffer-size\fP option.
-The default value for this parameter is specified when \fBpcregrep\fP is built,
-with the default default being 20K. A block of memory three times this size is
-used (to allow for buffering "before" and "after" lines). An error occurs if a
-line overflows the buffer.
+The default value for this parameter is specified when \fBpcre2grep\fP is
+built, with the default default being 20K. A block of memory three times this
+size is used (to allow for buffering "before" and "after" lines). An error
+occurs if a line overflows the buffer.
 .P
 Patterns can be no longer than 8K or BUFSIZ bytes, whichever is the greater.
 BUFSIZ is defined in \fB<stdio.h>\fP. When there is more than one pattern
@@ -85,14 +86,14 @@
 the matching substrings are being shown.
 .P
 If the \fBLC_ALL\fP or \fBLC_CTYPE\fP environment variable is set,
-\fBpcregrep\fP uses the value to set a locale when calling the PCRE library.
+\fBpcre2grep\fP uses the value to set a locale when calling the PCRE2 library.
 The \fB--locale\fP option can be used to override this.
 .
 .
 .SH "SUPPORT FOR COMPRESSED FILES"
 .rs
 .sp
-It is possible to compile \fBpcregrep\fP so that it uses \fBlibz\fP or
+It is possible to compile \fBpcre2grep\fP so that it uses \fBlibz\fP or
 \fBlibbz2\fP to read files whose names end in \fB.gz\fP or \fB.bz2\fP,
 respectively. You can find out whether your binary has support for one or both
 of these file types by running it with the \fB--help\fP option. If the
@@ -122,14 +123,14 @@
 \fB--\fP
 This terminates the list of options. It is useful if the next item on the
 command line starts with a hyphen but is not an option. This allows for the
-processing of patterns and filenames that start with hyphens.
+processing of patterns and file names that start with hyphens.
 .TP
 \fB-A\fP \fInumber\fP, \fB--after-context=\fP\fInumber\fP
-Output \fInumber\fP lines of context after each matching line. If filenames
+Output \fInumber\fP lines of context after each matching line. If file names
 and/or line numbers are being output, a hyphen separator is used instead of a
 colon for the context lines. A line containing "--" is output between each
 group of lines, unless they are in fact contiguous in the input file. The value
-of \fInumber\fP is expected to be relatively small. However, \fBpcregrep\fP
+of \fInumber\fP is expected to be relatively small. However, \fBpcre2grep\fP
 guarantees to have up to 8K of following text available for context output.
 .TP
 \fB-a\fP, \fB--text\fP
@@ -137,11 +138,11 @@
 \fB--binary-files\fP=\fItext\fP.
 .TP
 \fB-B\fP \fInumber\fP, \fB--before-context=\fP\fInumber\fP
-Output \fInumber\fP lines of context before each matching line. If filenames
+Output \fInumber\fP lines of context before each matching line. If file names
 and/or line numbers are being output, a hyphen separator is used instead of a
 colon for the context lines. A line containing "--" is output between each
 group of lines, unless they are in fact contiguous in the input file. The value
-of \fInumber\fP is expected to be relatively small. However, \fBpcregrep\fP
+of \fInumber\fP is expected to be relatively small. However, \fBpcre2grep\fP
 guarantees to have up to 8K of preceding text available for context output.
 .TP
 \fB--binary-files=\fP\fIword\fP
@@ -153,7 +154,8 @@
 succeeds, the output may be binary garbage, which can have nasty effects if
 sent to a terminal. If the word is "without-match", which is equivalent to the
 \fB-I\fP option, binary files are not processed at all; they are assumed not to
-be of interest.
+be of interest and are skipped without causing any output or affecting the
+return code.
 .TP
 \fB--buffer-size=\fP\fInumber\fP
 Set the parameter that controls how much memory is used for buffering files
@@ -164,10 +166,14 @@
 This is equivalent to setting both \fB-A\fP and \fB-B\fP to the same value.
 .TP
 \fB-c\fP, \fB--count\fP
-Do not output individual lines from the files that are being scanned; instead
-output the number of lines that would otherwise have been shown. If no lines
-are selected, the number zero is output. If several files are are being
-scanned, a count is output for each of them. However, if the
+Do not output lines from the files that are being scanned; instead output the
+number of matches (or non-matches if \fB-v\fP is used) that would otherwise
+have caused lines to be shown. By default, this count is the same as the number
+of suppressed lines, but if the \fB-M\fP (multiline) option is used (without
+\fB-v\fP), there may be more suppressed lines than the number of matches.
+.sp
+If no lines are selected, the number zero is output. If several files are are
+being scanned, a count is output for each of them. However, if the
 \fB--files-with-matches\fP option is also used, only those files whose counts
 are greater than zero are listed. When \fB-c\fP is used, the \fB-A\fP,
 \fB-B\fP, and \fB-C\fP options are ignored.
@@ -183,11 +189,11 @@
 coloured. The value (which is optional, see above) may be "never", "always", or
 "auto". In the latter case, colouring happens only if the standard output is
 connected to a terminal. More resources are used when colouring is enabled,
-because \fBpcregrep\fP has to search for all possible matches in a line, not
+because \fBpcre2grep\fP has to search for all possible matches in a line, not
 just one, in order to colour them all.
 .sp
 The colour that is used can be specified by setting the environment variable
-PCREGREP_COLOUR or PCREGREP_COLOR. The value of this variable should be a
+PCRE2GREP_COLOUR or PCRE2GREP_COLOR. The value of this variable should be a
 string of two numbers, separated by a semicolon. They are copied directly into
 the control string for setting colour on a terminal, so it is your
 responsibility to ensure that they make sense. If neither of the environment
@@ -220,7 +226,7 @@
 these options are specified. Note that multiple use of \fB-e\fP is not the same
 as a single pattern with alternatives. For example, X|Y finds the first
 character in a line that is X or Y, whereas if the two patterns are given
-separately, with X first, \fBpcregrep\fP finds X if it is present, even if it
+separately, with X first, \fBpcre2grep\fP finds X if it is present, even if it
 follows Y in the line. It finds Y only if there is no X in the line. This
 matters only if you are using \fB-o\fP or \fB--colo(u)r\fP to show the part(s)
 of the line that matched.
@@ -229,10 +235,10 @@
 Files (but not directories) whose names match the pattern are skipped without
 being processed. This applies to all files, whether listed on the command line,
 obtained from \fB--file-list\fP, or by scanning a directory. The pattern is a
-PCRE regular expression, and is matched against the final component of the file
-name, not the entire path. The \fB-F\fP, \fB-w\fP, and \fB-x\fP options do not
-apply to this pattern. The option may be given any number of times in order to
-specify multiple patterns. If a file name matches both an \fB--include\fP
+PCRE2 regular expression, and is matched against the final component of the
+file name, not the entire path. The \fB-F\fP, \fB-w\fP, and \fB-x\fP options do
+not apply to this pattern. The option may be given any number of times in order
+to specify multiple patterns. If a file name matches both an \fB--include\fP
 and an \fB--exclude\fP pattern, it is excluded. There is no short form for this
 option.
 .TP
@@ -247,7 +253,7 @@
 Directories whose names match the pattern are skipped without being processed,
 whatever the setting of the \fB--recursive\fP option. This applies to all
 directories, whether listed on the command line, obtained from
-\fB--file-list\fP, or by scanning a parent directory. The pattern is a PCRE
+\fB--file-list\fP, or by scanning a parent directory. The pattern is a PCRE2
 regular expression, and is matched against the final component of the directory
 name, not the entire path. The \fB-F\fP, \fB-w\fP, and \fB-x\fP options do not
 apply to this pattern. The option may be given any number of times in order to
@@ -276,7 +282,7 @@
 alternatives in the description of \fB-e\fP above.
 .sp
 If this option is given more than once, all the specified files are
-read. A data line is output if any of the patterns match it. A filename can
+read. A data line is output if any of the patterns match it. A file name can
 be given as "-" to refer to the standard input. When \fB-f\fP is used, patterns
 specified on the command line using \fB-e\fP may also be present; they are
 tested before the file's patterns. However, no other pattern is taken from the
@@ -286,7 +292,7 @@
 Read a list of files and/or directories that are to be scanned from the given
 file, one per line. Trailing white space is removed from each line, and blank
 lines are ignored. These paths are processed before any that are listed on the
-command line. The filename can be given as "-" to refer to the standard input.
+command line. The file name can be given as "-" to refer to the standard input.
 If \fB--file\fP and \fB--file-list\fP are both specified as "-", patterns are
 read first. This is useful only when the standard input is a terminal, from
 which further lines (the list of files) can be read after an end-of-file
@@ -302,16 +308,17 @@
 and \fB--only-matching\fP.
 .TP
 \fB-H\fP, \fB--with-filename\fP
-Force the inclusion of the filename at the start of output lines when searching
-a single file. By default, the filename is not shown in this case. For matching
-lines, the filename is followed by a colon; for context lines, a hyphen
-separator is used. If a line number is also being output, it follows the file
-name.
+Force the inclusion of the file name at the start of output lines when
+searching a single file. By default, the file name is not shown in this case.
+For matching lines, the file name is followed by a colon; for context lines, a
+hyphen separator is used. If a line number is also being output, it follows the
+file name. When the \fB-M\fP option causes a pattern to match more than one
+line, only the first is preceded by the file name.
 .TP
 \fB-h\fP, \fB--no-filename\fP
-Suppress the output filenames when searching multiple files. By default,
-filenames are shown when multiple files are searched. For matching lines, the
-filename is followed by a colon; for context lines, a hyphen separator is used.
+Suppress the output file names when searching multiple files. By default,
+file names are shown when multiple files are searched. For matching lines, the
+file name is followed by a colon; for context lines, a hyphen separator is used.
 If a line number is also being output, it follows the file name.
 .TP
 \fB--help\fP
@@ -320,7 +327,7 @@
 ignored.
 .TP
 \fB-I\fP
-Treat binary files as never matching. This is equivalent to
+Ignore binary files. This is equivalent to
 \fB--binary-files\fP=\fIwithout-match\fP.
 .TP
 \fB-i\fP, \fB--ignore-case\fP
@@ -331,7 +338,7 @@
 processed are those that match one of the patterns (and do not match an
 \fB--exclude\fP pattern). This option does not affect directories, but it
 applies to all files, whether listed on the command line, obtained from
-\fB--file-list\fP, or by scanning a directory. The pattern is a PCRE regular
+\fB--file-list\fP, or by scanning a directory. The pattern is a PCRE2 regular
 expression, and is matched against the final component of the file name, not
 the entire path. The \fB-F\fP, \fB-w\fP, and \fB-x\fP options do not apply to
 this pattern. The option may be given any number of times. If a file name
@@ -349,8 +356,8 @@
 are processed are those that match one of the patterns (and do not match an
 \fB--exclude-dir\fP pattern). This applies to all directories, whether listed
 on the command line, obtained from \fB--file-list\fP, or by scanning a parent
-directory. The pattern is a PCRE regular expression, and is matched against the
-final component of the directory name, not the entire path. The \fB-F\fP,
+directory. The pattern is a PCRE2 regular expression, and is matched against
+the final component of the directory name, not the entire path. The \fB-F\fP,
 \fB-w\fP, and \fB-x\fP options do not apply to this pattern. The option may be
 given any number of times. If a directory matches both \fB--include-dir\fP and
 \fB--exclude-dir\fP, it is excluded. There is no short form for this option.
@@ -377,12 +384,12 @@
 \fB--line-buffered\fP
 When this option is given, input is read and processed line by line, and the
 output is flushed after each write. By default, input is read in large chunks,
-unless \fBpcregrep\fP can determine that it is reading from a terminal (which
+unless \fBpcre2grep\fP can determine that it is reading from a terminal (which
 is currently possible only in Unix-like environments). Output to terminal is
 normally automatically flushed by the operating system. This option can be
 useful when the input or output is attached to a pipe and you do not want
-\fBpcregrep\fP to buffer up large amounts of data. However, its use will affect
-performance, and the \fB-M\fP (multiline) option ceases to work.
+\fBpcre2grep\fP to buffer up large amounts of data. However, its use will
+affect performance, and the \fB-M\fP (multiline) option ceases to work.
 .TP
 \fB--line-offsets\fP
 Instead of showing lines or parts of lines that match, show each match as a
@@ -396,20 +403,20 @@
 \fB--locale\fP=\fIlocale-name\fP
 This option specifies a locale to be used for pattern matching. It overrides
 the value in the \fBLC_ALL\fP or \fBLC_CTYPE\fP environment variables. If no
-locale is specified, the PCRE library's default (usually the "C" locale) is
+locale is specified, the PCRE2 library's default (usually the "C" locale) is
 used. There is no short form for this option.
 .TP
 \fB--match-limit\fP=\fInumber\fP
 Processing some regular expression patterns can require a very large amount of
 memory, leading in some cases to a program crash if not enough is available.
 Other patterns may take a very long time to search for all possible matching
-strings. The \fBpcre_exec()\fP function that is called by \fBpcregrep\fP to do
-the matching has two parameters that can limit the resources that it uses.
+strings. The \fBpcre2_match()\fP function that is called by \fBpcre2grep\fP to
+do the matching has two parameters that can limit the resources that it uses.
 .sp
 The \fB--match-limit\fP option provides a means of limiting resource usage
 when processing patterns that are not going to match, but which have a very
 large number of possibilities in their search trees. The classic example is a
-pattern that uses nested unlimited repeats. Internally, PCRE uses a function
+pattern that uses nested unlimited repeats. Internally, PCRE2 uses a function
 called \fBmatch()\fP which it calls repeatedly (sometimes recursively). The
 limit set by \fB--match-limit\fP is imposed on the number of times this
 function is called during a match, which has the effect of limiting the amount
@@ -423,26 +430,40 @@
 of use only if it is set smaller than \fB--match-limit\fP.
 .sp
 There are no short forms for these options. The default settings are specified
-when the PCRE library is compiled, with the default default being 10 million.
+when the PCRE2 library is compiled, with the default default being 10 million.
 .TP
 \fB-M\fP, \fB--multiline\fP
 Allow patterns to match more than one line. When this option is given, patterns
 may usefully contain literal newline characters and internal occurrences of ^
 and $ characters. The output for a successful match may consist of more than
-one line, the last of which is the one in which the match ended. If the matched
-string ends with a newline sequence the output ends at the end of that line.
+one line. The first is the line in which the match started, and the last is the
+line in which the match ended. If the matched string ends with a newline
+sequence the output ends at the end of that line.
 .sp
-When this option is set, the PCRE library is called in "multiline" mode.
+When this option is set, the PCRE2 library is called in "multiline" mode.
+However, \fBpcre2grep\fP still processes the input line by line. The difference
+is that a matched string may extend past the end of a line and continue on
+one or more subsequent lines. The newline sequence must be matched as part of
+the pattern. For example, to find the phrase "regular expression" in a file
+where "regular" might be at the end of a line and "expression" at the start of
+the next line, you could use this command:
+.sp
+  pcre2grep -M 'regular\es+expression' <file>
+.sp
+The \es escape sequence matches any white space character, including newlines,
+and is followed by + so as to match trailing white space on the first line as
+well as possibly handling a two-character newline sequence.
+.sp
 There is a limit to the number of lines that can be matched, imposed by the way
-that \fBpcregrep\fP buffers the input file as it scans it. However,
-\fBpcregrep\fP ensures that at least 8K characters or the rest of the document
+that \fBpcre2grep\fP buffers the input file as it scans it. However,
+\fBpcre2grep\fP ensures that at least 8K characters or the rest of the file
 (whichever is the shorter) are available for forward matching, and similarly
 the previous 8K characters (or all the previous characters, if fewer than 8K)
-are guaranteed to be available for lookbehind assertions. This option does not
-work when input is read line by line (see \fP--line-buffered\fP.)
+are guaranteed to be available for lookbehind assertions. The \fB-M\fP option
+does not work when input is read line by line (see \fP--line-buffered\fP.)
 .TP
 \fB-N\fP \fInewline-type\fP, \fB--newline\fP=\fInewline-type\fP
-The PCRE library supports five different conventions for indicating
+The PCRE2 library supports five different conventions for indicating
 the ends of lines. They are the single-character sequences CR (carriage return)
 and LF (linefeed), the two-character sequence CRLF, an "anycrlf" convention,
 which recognizes any of the preceding three types, and an "any" convention, in
@@ -451,27 +472,28 @@
 (form feed, U+000C), NEL (next line, U+0085), LS (line separator, U+2028), and
 PS (paragraph separator, U+2029).
 .sp
-When the PCRE library is built, a default line-ending sequence is specified.
+When the PCRE2 library is built, a default line-ending sequence is specified.
 This is normally the standard sequence for the operating system. Unless
-otherwise specified by this option, \fBpcregrep\fP uses the library's default.
+otherwise specified by this option, \fBpcre2grep\fP uses the library's default.
 The possible values for this option are CR, LF, CRLF, ANYCRLF, or ANY. This
-makes it possible to use \fBpcregrep\fP to scan files that have come from other
-environments without having to modify their line endings. If the data that is
-being scanned does not agree with the convention set by this option,
-\fBpcregrep\fP may behave in strange ways. Note that this option does not
+makes it possible to use \fBpcre2grep\fP to scan files that have come from
+other environments without having to modify their line endings. If the data
+that is being scanned does not agree with the convention set by this option,
+\fBpcre2grep\fP may behave in strange ways. Note that this option does not
 apply to files specified by the \fB-f\fP, \fB--exclude-from\fP, or
 \fB--include-from\fP options, which are expected to use the operating system's
 standard newline sequence.
 .TP
 \fB-n\fP, \fB--line-number\fP
 Precede each output line by its line number in the file, followed by a colon
-for matching lines or a hyphen for context lines. If the filename is also being
-output, it precedes the line number. This option is forced if
-\fB--line-offsets\fP is used.
+for matching lines or a hyphen for context lines. If the file name is also
+being output, it precedes the line number. When the \fB-M\fP option causes a
+pattern to match more than one line, only the first is preceded by its line
+number. This option is forced if \fB--line-offsets\fP is used.
 .TP
 \fB--no-jit\fP
-If the PCRE library is built with support for just-in-time compiling (which
-speeds up matching), \fBpcregrep\fP automatically makes use of this, unless it
+If the PCRE2 library is built with support for just-in-time compiling (which
+speeds up matching), \fBpcre2grep\fP automatically makes use of this, unless it
 was explicitly disabled at build time. This option can be used to disable the
 use of JIT at run time. It is provided for testing and working round problems.
 It should never be needed in normal use.
@@ -495,7 +517,7 @@
 the same shell item, for example, -o3 or --only-matching=2. The comments given
 for the non-argument case above also apply to this case. If the specified
 capturing parentheses do not exist in the pattern, or were not set in the
-match, nothing is output unless the file name or line number are being printed.
+match, nothing is output unless the file name or line number are being output.
 .sp
 If this option is given multiple times, multiple substrings are output, in the
 order the options are given. For example, -o3 -o1 -o3 causes the substrings
@@ -526,13 +548,13 @@
 found in other files.
 .TP
 \fB-u\fP, \fB--utf-8\fP
-Operate in UTF-8 mode. This option is available only if PCRE has been compiled
+Operate in UTF-8 mode. This option is available only if PCRE2 has been compiled
 with UTF-8 support. All patterns (including those for any \fB--exclude\fP and
 \fB--include\fP options) and all subject lines that are scanned must be valid
 strings of UTF-8 characters.
 .TP
 \fB-V\fP, \fB--version\fP
-Write the version numbers of \fBpcregrep\fP and the PCRE library to the
+Write the version numbers of \fBpcre2grep\fP and the PCRE2 library to the
 standard output and then exit. Anything else on the command line is
 ignored.
 .TP
@@ -549,10 +571,10 @@
 \fB-x\fP, \fB--line-regex\fP, \fB--line-regexp\fP
 Force the patterns to be anchored (each must start matching at the beginning of
 a line) and in addition, require them to match entire lines. This is equivalent
-to having ^ and $ characters at the start and end of each alternative branch in
-every pattern. This option applies only to the patterns that are matched
-against the contents of files; it does not apply to patterns specified by any
-of the \fB--include\fP or \fB--exclude\fP options.
+to having ^ and $ characters at the start and end of each alternative top-level
+branch in every pattern. This option applies only to the patterns that are
+matched against the contents of files; it does not apply to patterns specified
+by any of the \fB--include\fP or \fB--exclude\fP options.
 .
 .
 .SH "ENVIRONMENT VARIABLES"
@@ -560,21 +582,21 @@
 .sp
 The environment variables \fBLC_ALL\fP and \fBLC_CTYPE\fP are examined, in that
 order, for a locale. The first one that is set is used. This can be overridden
-by the \fB--locale\fP option. If no locale is set, the PCRE library's default
+by the \fB--locale\fP option. If no locale is set, the PCRE2 library's default
 (usually the "C" locale) is used.
 .
 .
 .SH "NEWLINES"
 .rs
 .sp
-The \fB-N\fP (\fB--newline\fP) option allows \fBpcregrep\fP to scan files with
+The \fB-N\fP (\fB--newline\fP) option allows \fBpcre2grep\fP to scan files with
 different newline conventions from the default. Any parts of the input files
 that are written to the standard output are copied identically, with whatever
 newline sequences they have in the input. However, the setting of this option
 does not affect the interpretation of files specified by the \fB-f\fP,
 \fB--exclude-from\fP, or \fB--include-from\fP options, which are assumed to use
 the operating system's standard newline sequence, nor does it affect the way in
-which \fBpcregrep\fP writes informational messages to the standard error and
+which \fBpcre2grep\fP writes informational messages to the standard error and
 output streams. For these it uses the string "\en" to indicate newlines,
 relying on the C I/O library to convert this to an appropriate sequence.
 .
@@ -582,21 +604,21 @@
 .SH "OPTIONS COMPATIBILITY"
 .rs
 .sp
-Many of the short and long forms of \fBpcregrep\fP's options are the same
+Many of the short and long forms of \fBpcre2grep\fP's options are the same
 as in the GNU \fBgrep\fP program. Any long option of the form
 \fB--xxx-regexp\fP (GNU terminology) is also available as \fB--xxx-regex\fP
-(PCRE terminology). However, the \fB--file-list\fP, \fB--file-offsets\fP,
+(PCRE2 terminology). However, the \fB--file-list\fP, \fB--file-offsets\fP,
 \fB--include-dir\fP, \fB--line-offsets\fP, \fB--locale\fP, \fB--match-limit\fP,
 \fB-M\fP, \fB--multiline\fP, \fB-N\fP, \fB--newline\fP, \fB--om-separator\fP,
 \fB--recursion-limit\fP, \fB-u\fP, and \fB--utf-8\fP options are specific to
-\fBpcregrep\fP, as is the use of the \fB--only-matching\fP option with a
+\fBpcre2grep\fP, as is the use of the \fB--only-matching\fP option with a
 capturing parentheses number.
 .P
 Although most of the common options work the same way, a few are different in
-\fBpcregrep\fP. For example, the \fB--include\fP option's argument is a glob
-for GNU \fBgrep\fP, but a regular expression for \fBpcregrep\fP. If both the
+\fBpcre2grep\fP. For example, the \fB--include\fP option's argument is a glob
+for GNU \fBgrep\fP, but a regular expression for \fBpcre2grep\fP. If both the
 \fB-c\fP and \fB-l\fP options are given, GNU grep lists only file names,
-without counts, but \fBpcregrep\fP gives the counts.
+without counts, but \fBpcre2grep\fP gives the counts as well.
 .
 .
 .SH "OPTIONS WITH DATA"
@@ -628,7 +650,7 @@
 The exceptions to the above are the \fB--colour\fP (or \fB--color\fP) and
 \fB--only-matching\fP options, for which the data is optional. If one of these
 options does have data, it must be given in the first form, using an equals
-character. Otherwise \fBpcregrep\fP will assume that it has no data.
+character. Otherwise \fBpcre2grep\fP will assume that it has no data.
 .
 .
 .SH "MATCHING ERRORS"
@@ -637,14 +659,14 @@
 It is possible to supply a regular expression that takes a very long time to
 fail to match certain lines. Such patterns normally involve nested indefinite
 repeats, for example: (a+)*\ed when matched against a line of a's with no final
-digit. The PCRE matching function has a resource limit that causes it to abort
-in these circumstances. If this happens, \fBpcregrep\fP outputs an error
+digit. The PCRE2 matching function has a resource limit that causes it to abort
+in these circumstances. If this happens, \fBpcre2grep\fP outputs an error
 message and the line that caused the problem to the standard error stream. If
-there are more than 20 such errors, \fBpcregrep\fP gives up.
+there are more than 20 such errors, \fBpcre2grep\fP gives up.
 .P
-The \fB--match-limit\fP option of \fBpcregrep\fP can be used to set the overall
-resource limit; there is a second option called \fB--recursion-limit\fP that
-sets a limit on the amount of memory (usually stack) that is used (see the
+The \fB--match-limit\fP option of \fBpcre2grep\fP can be used to set the
+overall resource limit; there is a second option called \fB--recursion-limit\fP
+that sets a limit on the amount of memory (usually stack) that is used (see the
 discussion of these options above).
 .
 .
@@ -661,7 +683,7 @@
 .SH "SEE ALSO"
 .rs
 .sp
-\fBpcrepattern\fP(3), \fBpcresyntax\fP(3), \fBpcretest\fP(1).
+\fBpcre2pattern\fP(3), \fBpcre2syntax\fP(3).
 .
 .
 .SH AUTHOR
@@ -670,7 +692,7 @@
 .nf
 Philip Hazel
 University Computing Service
-Cambridge CB2 3QH, England.
+Cambridge, England.
 .fi
 .
 .
@@ -678,6 +700,6 @@
 .rs
 .sp
 .nf
-Last updated: 03 April 2014
-Copyright (c) 1997-2014 University of Cambridge.
+Last updated: 03 January 2015
+Copyright (c) 1997-2015 University of Cambridge.
 .fi
diff --git a/dist2/doc/pcre2grep.txt b/dist2/doc/pcre2grep.txt
new file mode 100644
index 0000000..29cd75c
--- /dev/null
+++ b/dist2/doc/pcre2grep.txt
@@ -0,0 +1,769 @@
+PCRE2GREP(1)                General Commands Manual               PCRE2GREP(1)
+
+
+
+NAME
+       pcre2grep - a grep with Perl-compatible regular expressions.
+
+SYNOPSIS
+       pcre2grep [options] [long options] [pattern] [path1 path2 ...]
+
+
+DESCRIPTION
+
+       pcre2grep  searches  files  for  character patterns, in the same way as
+       other grep commands do,  but  it  uses  the  PCRE2  regular  expression
+       library  to  support  patterns  that  are  compatible  with the regular
+       expressions of Perl 5. See pcre2syntax(3) for a quick-reference summary
+       of  pattern  syntax,  or  pcre2pattern(3) for a full description of the
+       syntax and semantics of the regular expressions that PCRE2 supports.
+
+       Patterns, whether supplied on the command line or in a  separate  file,
+       are given without delimiters. For example:
+
+         pcre2grep Thursday /etc/motd
+
+       If you attempt to use delimiters (for example, by surrounding a pattern
+       with slashes, as is common in Perl scripts), they  are  interpreted  as
+       part  of  the pattern. Quotes can of course be used to delimit patterns
+       on the command line because they are  interpreted  by  the  shell,  and
+       indeed  quotes  are required if a pattern contains white space or shell
+       metacharacters.
+
+       The first argument that follows any option settings is treated  as  the
+       single  pattern  to be matched when neither -e nor -f is present.  Con-
+       versely, when one or both of these options are  used  to  specify  pat-
+       terns, all arguments are treated as path names. At least one of -e, -f,
+       or an argument pattern must be provided.
+
+       If no files are specified, pcre2grep  reads  the  standard  input.  The
+       standard  input can also be referenced by a name consisting of a single
+       hyphen.  For example:
+
+         pcre2grep some-pattern file1 - file3
+
+       Input files are searched line by  line.  By  default,  each  line  that
+       matches  a  pattern  is  copied to the standard output, and if there is
+       more than one file, the file name is output at the start of each  line,
+       followed  by  a  colon.  However, there are options that can change how
+       pcre2grep behaves. In particular, the -M option makes  it  possible  to
+       search  for  strings  that  span  line  boundaries. What defines a line
+       boundary is controlled by the -N (--newline) option.
+
+       The amount of memory used for buffering files that are being scanned is
+       controlled  by a parameter that can be set by the --buffer-size option.
+       The default value for this parameter is  specified  when  pcre2grep  is
+       built,  with  the  default  default  being 20K. A block of memory three
+       times this size is used (to allow for buffering  "before"  and  "after"
+       lines). An error occurs if a line overflows the buffer.
+
+       Patterns  can  be  no  longer than 8K or BUFSIZ bytes, whichever is the
+       greater.  BUFSIZ is defined in <stdio.h>. When there is more  than  one
+       pattern (specified by the use of -e and/or -f), each pattern is applied
+       to each line in the order in which they are defined,  except  that  all
+       the -e patterns are tried before the -f patterns.
+
+       By  default, as soon as one pattern matches a line, no further patterns
+       are considered. However, if --colour (or --color) is used to colour the
+       matching  substrings, or if --only-matching, --file-offsets, or --line-
+       offsets is used to output only  the  part  of  the  line  that  matched
+       (either shown literally, or as an offset), scanning resumes immediately
+       following the match, so that further matches on the same  line  can  be
+       found.  If  there  are  multiple  patterns,  they  are all tried on the
+       remainder of the line, but patterns that follow the  one  that  matched
+       are not tried on the earlier part of the line.
+
+       This  behaviour  means  that  the  order in which multiple patterns are
+       specified can affect the output when one of the above options is  used.
+       This  is no longer the same behaviour as GNU grep, which now manages to
+       display earlier matches for later patterns (as  long  as  there  is  no
+       overlap).
+
+       Patterns  that can match an empty string are accepted, but empty string
+       matches   are   never   recognized.   An   example   is   the   pattern
+       "(super)?(man)?",  in  which  all components are optional. This pattern
+       finds all occurrences of both "super" and  "man";  the  output  differs
+       from  matching  with  "super|man" when only the matching substrings are
+       being shown.
+
+       If the LC_ALL or LC_CTYPE environment variable is set,  pcre2grep  uses
+       the value to set a locale when calling the PCRE2 library.  The --locale
+       option can be used to override this.
+
+
+SUPPORT FOR COMPRESSED FILES
+
+       It is possible to compile pcre2grep so that it uses libz or  libbz2  to
+       read  files  whose names end in .gz or .bz2, respectively. You can find
+       out whether your binary has support for one or both of these file types
+       by running it with the --help option. If the appropriate support is not
+       present, files are treated as plain text. The standard input is  always
+       so treated.
+
+
+BINARY FILES
+
+       By  default,  a  file that contains a binary zero byte within the first
+       1024 bytes is identified as a binary file, and is processed  specially.
+       (GNU  grep  also  identifies  binary  files  in  this  manner.) See the
+       --binary-files option for a means of changing the way binary files  are
+       handled.
+
+
+OPTIONS
+
+       The  order  in  which some of the options appear can affect the output.
+       For example, both the -h and -l options affect  the  printing  of  file
+       names.  Whichever  comes later in the command line will be the one that
+       takes effect. Similarly, except where noted  below,  if  an  option  is
+       given  twice,  the  later setting is used. Numerical values for options
+       may be followed by K  or  M,  to  signify  multiplication  by  1024  or
+       1024*1024 respectively.
+
+       --        This terminates the list of options. It is useful if the next
+                 item on the command line starts with a hyphen but is  not  an
+                 option.  This  allows for the processing of patterns and file
+                 names that start with hyphens.
+
+       -A number, --after-context=number
+                 Output number lines of context after each matching  line.  If
+                 file  names  and/or  line  numbers are being output, a hyphen
+                 separator is used instead of a colon for the context lines. A
+                 line  containing  "--" is output between each group of lines,
+                 unless they are in fact contiguous in  the  input  file.  The
+                 value  of number is expected to be relatively small. However,
+                 pcre2grep guarantees to have  up  to  8K  of  following  text
+                 available for context output.
+
+       -a, --text
+                 Treat  binary  files as text. This is equivalent to --binary-
+                 files=text.
+
+       -B number, --before-context=number
+                 Output number lines of context before each matching line.  If
+                 file  names  and/or  line  numbers are being output, a hyphen
+                 separator is used instead of a colon for the context lines. A
+                 line  containing  "--" is output between each group of lines,
+                 unless they are in fact contiguous in  the  input  file.  The
+                 value  of number is expected to be relatively small. However,
+                 pcre2grep guarantees to have  up  to  8K  of  preceding  text
+                 available for context output.
+
+       --binary-files=word
+                 Specify  how binary files are to be processed. If the word is
+                 "binary" (the default),  pattern  matching  is  performed  on
+                 binary  files,  but  the  only  output is "Binary file <name>
+                 matches" when a match succeeds. If the word is "text",  which
+                 is  equivalent  to  the -a or --text option, binary files are
+                 processed in the same way as any other file.  In  this  case,
+                 when  a  match  succeeds,  the  output may be binary garbage,
+                 which can have nasty effects if sent to a  terminal.  If  the
+                 word  is  "without-match",  which  is  equivalent  to  the -I
+                 option, binary files are  not  processed  at  all;  they  are
+                 assumed not to be of interest and are skipped without causing
+                 any output or affecting the return code.
+
+       --buffer-size=number
+                 Set the parameter that controls how much memory is  used  for
+                 buffering files that are being scanned.
+
+       -C number, --context=number
+                 Output  number  lines  of  context both before and after each
+                 matching line.  This is equivalent to setting both -A and  -B
+                 to the same value.
+
+       -c, --count
+                 Do  not  output  lines from the files that are being scanned;
+                 instead output the number of matches (or non-matches if -v is
+                 used)  that would otherwise have caused lines to be shown. By
+                 default, this count is the same as the number  of  suppressed
+                 lines, but if the -M (multiline) option is used (without -v),
+                 there may  be  more  suppressed  lines  than  the  number  of
+                 matches.
+
+                 If  no lines are selected, the number zero is output. If sev-
+                 eral files are are being scanned, a count is output for  each
+                 of  them. However, if the --files-with-matches option is also
+                 used, only those files whose counts are greater than zero are
+                 listed.  When  -c  is  used,  the  -A, -B, and -C options are
+                 ignored.
+
+       --colour, --color
+                 If this option is given without any data, it is equivalent to
+                 "--colour=auto".   If  data  is required, it must be given in
+                 the same shell item, separated by an equals sign.
+
+       --colour=value, --color=value
+                 This option specifies under what circumstances the parts of a
+                 line that matched a pattern should be coloured in the output.
+                 By default, the output is not coloured. The value  (which  is
+                 optional,  see above) may be "never", "always", or "auto". In
+                 the latter case, colouring happens only if the standard  out-
+                 put  is connected to a terminal. More resources are used when
+                 colouring is enabled, because pcre2grep has to search for all
+                 possible  matches in a line, not just one, in order to colour
+                 them all.
+
+                 The colour that is used can be specified by setting the envi-
+                 ronment  variable  PCRE2GREP_COLOUR  or  PCRE2GREP_COLOR. The
+                 value of this variable should be a  string  of  two  numbers,
+                 separated  by  a semicolon. They are copied directly into the
+                 control string for setting colour on a  terminal,  so  it  is
+                 your  responsibility  to ensure that they make sense. If nei-
+                 ther of the environment variables  is  set,  the  default  is
+                 "1;31", which gives red.
+
+       -D action, --devices=action
+                 If  an  input  path  is  not  a  regular file or a directory,
+                 "action" specifies how it is to be  processed.  Valid  values
+                 are "read" (the default) or "skip" (silently skip the path).
+
+       -d action, --directories=action
+                 If an input path is a directory, "action" specifies how it is
+                 to be processed.  Valid values are  "read"  (the  default  in
+                 non-Windows  environments,  for compatibility with GNU grep),
+                 "recurse" (equivalent to the -r option), or "skip"  (silently
+                 skip  the  path, the default in Windows environments). In the
+                 "read" case, directories are read as if  they  were  ordinary
+                 files.  In  some  operating  systems  the effect of reading a
+                 directory like this is an immediate end-of-file; in others it
+                 may provoke an error.
+
+       -e pattern, --regex=pattern, --regexp=pattern
+                 Specify a pattern to be matched. This option can be used mul-
+                 tiple times in order to specify several patterns. It can also
+                 be  used  as a way of specifying a single pattern that starts
+                 with a hyphen. When -e is used, no argument pattern is  taken
+                 from  the  command  line;  all  arguments are treated as file
+                 names. There is no limit to the number of patterns. They  are
+                 applied  to  each line in the order in which they are defined
+                 until one matches.
+
+                 If -f is used with -e, the command line patterns are  matched
+                 first, followed by the patterns from the file(s), independent
+                 of the order in which these options are specified. Note  that
+                 multiple  use  of -e is not the same as a single pattern with
+                 alternatives. For example, X|Y finds the first character in a
+                 line  that  is  X or Y, whereas if the two patterns are given
+                 separately, with X first, pcre2grep finds X if it is present,
+                 even if it follows Y in the line. It finds Y only if there is
+                 no X in the line. This matters only if you are  using  -o  or
+                 --colo(u)r to show the part(s) of the line that matched.
+
+       --exclude=pattern
+                 Files (but not directories) whose names match the pattern are
+                 skipped without being processed. This applies to  all  files,
+                 whether  listed  on  the  command line, obtained from --file-
+                 list, or by scanning a directory. The pattern is a PCRE2 reg-
+                 ular  expression,  and is matched against the final component
+                 of the file name, not the entire path. The  -F,  -w,  and  -x
+                 options do not apply to this pattern. The option may be given
+                 any number of times in order to specify multiple patterns. If
+                 a  file  name matches both an --include and an --exclude pat-
+                 tern, it is excluded. There is no short form for this option.
+
+       --exclude-from=filename
+                 Treat each non-empty line of the file  as  the  data  for  an
+                 --exclude option. What constitutes a newline when reading the
+                 file is the operating system's default. The --newline  option
+                 has  no  effect on this option. This option may be given more
+                 than once in order to specify a number of files to read.
+
+       --exclude-dir=pattern
+                 Directories whose names match the pattern are skipped without
+                 being  processed,  whatever  the  setting  of the --recursive
+                 option. This applies to all directories,  whether  listed  on
+                 the command line, obtained from --file-list, or by scanning a
+                 parent directory. The pattern is a PCRE2 regular  expression,
+                 and  is  matched against the final component of the directory
+                 name, not the entire path. The -F, -w, and -x options do  not
+                 apply  to this pattern. The option may be given any number of
+                 times in order to specify more than one pattern. If a  direc-
+                 tory  matches  both  --include-dir  and  --exclude-dir, it is
+                 excluded. There is no short form for this option.
+
+       -F, --fixed-strings
+                 Interpret each data-matching  pattern  as  a  list  of  fixed
+                 strings,  separated  by  newlines,  instead  of  as a regular
+                 expression. What constitutes a newline for  this  purpose  is
+                 controlled  by the --newline option. The -w (match as a word)
+                 and -x (match whole line) options can be used with -F.   They
+                 apply to each of the fixed strings. A line is selected if any
+                 of the fixed strings are found in it (subject to -w or -x, if
+                 present).  This  option applies only to the patterns that are
+                 matched against the contents of files; it does not  apply  to
+                 patterns  specified  by  any  of  the  --include or --exclude
+                 options.
+
+       -f filename, --file=filename
+                 Read patterns from the file, one per  line,  and  match  them
+                 against  each  line of input. What constitutes a newline when
+                 reading the file  is  the  operating  system's  default.  The
+                 --newline option has no effect on this option. Trailing white
+                 space is removed from each line, and blank lines are ignored.
+                 An  empty  file  contains  no  patterns and therefore matches
+                 nothing. See also the comments about multiple patterns versus
+                 a  single  pattern with alternatives in the description of -e
+                 above.
+
+                 If this option is given more than  once,  all  the  specified
+                 files  are read. A data line is output if any of the patterns
+                 match it. A file name can be given as "-"  to  refer  to  the
+                 standard  input.  When  -f is used, patterns specified on the
+                 command line using -e may also be present;  they  are  tested
+                 before  the  file's  patterns.  However,  no other pattern is
+                 taken from the command line; all arguments are treated as the
+                 names of paths to be searched.
+
+       --file-list=filename
+                 Read  a  list  of  files  and/or  directories  that are to be
+                 scanned from the given file, one  per  line.  Trailing  white
+                 space is removed from each line, and blank lines are ignored.
+                 These paths are processed before any that are listed  on  the
+                 command  line.  The file name can be given as "-" to refer to
+                 the standard input.  If --file and --file-list are both spec-
+                 ified  as  "-",  patterns are read first. This is useful only
+                 when the standard input is a  terminal,  from  which  further
+                 lines  (the  list  of files) can be read after an end-of-file
+                 indication. If this option is given more than once,  all  the
+                 specified files are read.
+
+       --file-offsets
+                 Instead  of  showing lines or parts of lines that match, show
+                 each match as an offset from the start  of  the  file  and  a
+                 length,  separated  by  a  comma. In this mode, no context is
+                 shown. That is, the -A, -B, and -C options  are  ignored.  If
+                 there is more than one match in a line, each of them is shown
+                 separately. This option is mutually  exclusive  with  --line-
+                 offsets and --only-matching.
+
+       -H, --with-filename
+                 Force  the  inclusion of the file name at the start of output
+                 lines when searching a single file. By default, the file name
+                 is not shown in this case.  For matching lines, the file name
+                 is followed by a colon; for context lines, a hyphen separator
+                 is  used.  If  a line number is also being output, it follows
+                 the file name. When the -M option causes a pattern  to  match
+                 more  than  one  line, only the first is preceded by the file
+                 name.
+
+       -h, --no-filename
+                 Suppress the output file names when searching multiple files.
+                 By  default,  file  names  are  shown when multiple files are
+                 searched. For matching lines, the file name is followed by  a
+                 colon;  for  context lines, a hyphen separator is used.  If a
+                 line number is also being output, it follows the file name.
+
+       --help    Output a help message, giving brief details  of  the  command
+                 options  and  file type support, and then exit. Anything else
+                 on the command line is ignored.
+
+       -I        Ignore  binary  files.  This  is  equivalent   to   --binary-
+                 files=without-match.
+
+       -i, --ignore-case
+                 Ignore upper/lower case distinctions during comparisons.
+
+       --include=pattern
+                 If  any --include patterns are specified, the only files that
+                 are processed are those that match one of the  patterns  (and
+                 do  not  match  an  --exclude  pattern). This option does not
+                 affect directories, but it  applies  to  all  files,  whether
+                 listed  on the command line, obtained from --file-list, or by
+                 scanning a directory. The pattern is a PCRE2 regular  expres-
+                 sion,  and is matched against the final component of the file
+                 name, not the entire path. The -F, -w, and -x options do  not
+                 apply  to this pattern. The option may be given any number of
+                 times. If a file  name  matches  both  an  --include  and  an
+                 --exclude  pattern,  it  is excluded.  There is no short form
+                 for this option.
+
+       --include-from=filename
+                 Treat each non-empty line of the file  as  the  data  for  an
+                 --include option. What constitutes a newline for this purpose
+                 is the operating system's default. The --newline  option  has
+                 no effect on this option. This option may be given any number
+                 of times; all the files are read.
+
+       --include-dir=pattern
+                 If any --include-dir patterns are specified, the only  direc-
+                 tories  that  are  processed  are those that match one of the
+                 patterns (and do not match an  --exclude-dir  pattern).  This
+                 applies  to  all  directories,  whether listed on the command
+                 line, obtained from --file-list,  or  by  scanning  a  parent
+                 directory.  The pattern is a PCRE2 regular expression, and is
+                 matched against the final component of  the  directory  name,
+                 not  the entire path. The -F, -w, and -x options do not apply
+                 to this pattern. The option may be given any number of times.
+                 If  a directory matches both --include-dir and --exclude-dir,
+                 it is excluded. There is no short form for this option.
+
+       -L, --files-without-match
+                 Instead of outputting lines from the files, just  output  the
+                 names  of  the files that do not contain any lines that would
+                 have been output. Each file name is output once, on  a  sepa-
+                 rate line.
+
+       -l, --files-with-matches
+                 Instead  of  outputting lines from the files, just output the
+                 names of the files containing lines that would have been out-
+                 put.  Each  file  name  is  output  once, on a separate line.
+                 Searching normally stops as soon as a matching line is  found
+                 in  a  file.  However, if the -c (count) option is also used,
+                 matching continues in order to obtain the correct count,  and
+                 those  files  that  have  at least one match are listed along
+                 with their counts. Using this option with -c is a way of sup-
+                 pressing the listing of files with no matches.
+
+       --label=name
+                 This option supplies a name to be used for the standard input
+                 when file names are being output. If not supplied, "(standard
+                 input)" is used. There is no short form for this option.
+
+       --line-buffered
+                 When  this  option is given, input is read and processed line
+                 by line, and the output  is  flushed  after  each  write.  By
+                 default,  input is read in large chunks, unless pcre2grep can
+                 determine that it is reading from a terminal (which  is  cur-
+                 rently  possible  only  in Unix-like environments). Output to
+                 terminal is normally automatically flushed by  the  operating
+                 system. This option can be useful when the input or output is
+                 attached to a pipe and you do not want pcre2grep to buffer up
+                 large  amounts  of data. However, its use will affect perfor-
+                 mance, and the -M (multiline) option ceases to work.
+
+       --line-offsets
+                 Instead of showing lines or parts of lines that  match,  show
+                 each match as a line number, the offset from the start of the
+                 line, and a length. The line number is terminated by a  colon
+                 (as  usual; see the -n option), and the offset and length are
+                 separated by a comma. In this  mode,  no  context  is  shown.
+                 That  is, the -A, -B, and -C options are ignored. If there is
+                 more than one match in a line, each of them  is  shown  sepa-
+                 rately. This option is mutually exclusive with --file-offsets
+                 and --only-matching.
+
+       --locale=locale-name
+                 This option specifies a locale to be used for pattern  match-
+                 ing.  It  overrides the value in the LC_ALL or LC_CTYPE envi-
+                 ronment variables. If  no  locale  is  specified,  the  PCRE2
+                 library's  default (usually the "C" locale) is used. There is
+                 no short form for this option.
+
+       --match-limit=number
+                 Processing some regular expression  patterns  can  require  a
+                 very  large amount of memory, leading in some cases to a pro-
+                 gram crash if not enough is available.   Other  patterns  may
+                 take  a  very  long  time to search for all possible matching
+                 strings.  The  pcre2_match()  function  that  is  called   by
+                 pcre2grep  to  do  the  matching  has two parameters that can
+                 limit the resources that it uses.
+
+                 The  --match-limit  option  provides  a  means  of   limiting
+                 resource usage when processing patterns that are not going to
+                 match, but which have a very large number of possibilities in
+                 their  search  trees.  The  classic example is a pattern that
+                 uses nested unlimited repeats. Internally, PCRE2 uses a func-
+                 tion  called  match()  which  it  calls repeatedly (sometimes
+                 recursively). The limit set by --match-limit  is  imposed  on
+                 the  number  of times this function is called during a match,
+                 which has the effect of limiting the amount  of  backtracking
+                 that can take place.
+
+                 The --recursion-limit option is similar to --match-limit, but
+                 instead of limiting the total number of times that match() is
+                 called, it limits the depth of recursive calls, which in turn
+                 limits the amount of memory that can be used.  The  recursion
+                 depth  is  a  smaller  number than the total number of calls,
+                 because not all calls to match() are recursive. This limit is
+                 of use only if it is set smaller than --match-limit.
+
+                 There  are no short forms for these options. The default set-
+                 tings are specified when the PCRE2 library is compiled,  with
+                 the default default being 10 million.
+
+       -M, --multiline
+                 Allow  patterns to match more than one line. When this option
+                 is given, patterns may usefully contain literal newline char-
+                 acters  and  internal  occurrences of ^ and $ characters. The
+                 output for a successful match may consist of  more  than  one
+                 line.  The  first is the line in which the match started, and
+                 the last is the line in which the match ended. If the matched
+                 string  ends  with  a newline sequence the output ends at the
+                 end of that line.
+
+                 When this option is set, the PCRE2 library is called in "mul-
+                 tiline"  mode.   However, pcre2grep still processes the input
+                 line by line. The difference is that  a  matched  string  may
+                 extend  past  the  end  of a line and continue on one or more
+                 subsequent lines. The newline sequence  must  be  matched  as
+                 part of the pattern. For example, to find the phrase "regular
+                 expression" in a file where "regular" might be at the end  of
+                 a  line  and  "expression" at the start of the next line, you
+                 could use this command:
+
+                   pcre2grep -M 'regular\s+expression' <file>
+
+                 The \s escape sequence matches  any  white  space  character,
+                 including  newlines,  and  is  followed  by  + so as to match
+                 trailing white space on the first line as  well  as  possibly
+                 handling a two-character newline sequence.
+
+                 There  is a limit to the number of lines that can be matched,
+                 imposed by the way that pcre2grep buffers the input  file  as
+                 it  scans  it.  However,  pcre2grep  ensures that at least 8K
+                 characters or the rest of the file (whichever is the shorter)
+                 are  available for forward matching, and similarly the previ-
+                 ous 8K characters (or all the previous characters,  if  fewer
+                 than 8K) are guaranteed to be available for lookbehind asser-
+                 tions. The -M option does not work when input is read line by
+                 line (see --line-buffered.)
+
+       -N newline-type, --newline=newline-type
+                 The  PCRE2  library  supports  five different conventions for
+                 indicating the ends of lines. They are  the  single-character
+                 sequences  CR  (carriage  return) and LF (linefeed), the two-
+                 character sequence CRLF, an "anycrlf" convention, which  rec-
+                 ognizes  any  of the preceding three types, and an "any" con-
+                 vention, in which any Unicode line ending sequence is assumed
+                 to  end a line. The Unicode sequences are the three just men-
+                 tioned, plus  VT  (vertical  tab,  U+000B),  FF  (form  feed,
+                 U+000C),   NEL  (next  line,  U+0085),  LS  (line  separator,
+                 U+2028), and PS (paragraph separator, U+2029).
+
+                 When the  PCRE2  library  is  built,  a  default  line-ending
+                 sequence   is  specified.   This  is  normally  the  standard
+                 sequence for the operating system. Unless otherwise specified
+                 by  this  option,  pcre2grep uses the library's default.  The
+                 possible values for this option are CR, LF, CRLF, ANYCRLF, or
+                 ANY.  This  makes  it possible to use pcre2grep to scan files
+                 that have come from other environments without having to mod-
+                 ify  their  line  endings.  If the data that is being scanned
+                 does not agree  with  the  convention  set  by  this  option,
+                 pcre2grep  may  behave in strange ways. Note that this option
+                 does not apply to files specified by the -f,  --exclude-from,
+                 or  --include-from  options,  which  are  expected to use the
+                 operating system's standard newline sequence.
+
+       -n, --line-number
+                 Precede each output line by its line number in the file, fol-
+                 lowed  by  a colon for matching lines or a hyphen for context
+                 lines. If the file name is also being output, it precedes the
+                 line  number.  When  the  -M option causes a pattern to match
+                 more than one line, only the first is preceded  by  its  line
+                 number. This option is forced if --line-offsets is used.
+
+       --no-jit  If  the  PCRE2 library is built with support for just-in-time
+                 compiling (which speeds up matching), pcre2grep automatically
+                 makes use of this, unless it was explicitly disabled at build
+                 time. This option can be used to disable the use  of  JIT  at
+                 run  time. It is provided for testing and working round prob-
+                 lems.  It should never be needed in normal use.
+
+       -o, --only-matching
+                 Show only the part of the line that matched a pattern instead
+                 of  the  whole  line. In this mode, no context is shown. That
+                 is, the -A, -B, and -C options are ignored. If there is  more
+                 than  one  match in a line, each of them is shown separately.
+                 If -o is combined with -v (invert the sense of the  match  to
+                 find  non-matching  lines),  no  output is generated, but the
+                 return code is set appropriately. If the matched  portion  of
+                 the  line is empty, nothing is output unless the file name or
+                 line number are being printed, in which case they  are  shown
+                 on an otherwise empty line. This option is mutually exclusive
+                 with --file-offsets and --line-offsets.
+
+       -onumber, --only-matching=number
+                 Show only the part of the line  that  matched  the  capturing
+                 parentheses of the given number. Up to 32 capturing parenthe-
+                 ses are supported, and -o0 is equivalent to -o without a num-
+                 ber.  Because  these options can be given without an argument
+                 (see above), if an argument is present, it must be  given  in
+                 the  same  shell item, for example, -o3 or --only-matching=2.
+                 The comments given for the non-argument case above also apply
+                 to  this  case. If the specified capturing parentheses do not
+                 exist in the pattern, or were not set in the  match,  nothing
+                 is  output unless the file name or line number are being out-
+                 put.
+
+                 If this option is given multiple times,  multiple  substrings
+                 are  output, in the order the options are given. For example,
+                 -o3 -o1 -o3 causes the substrings matched by capturing paren-
+                 theses  3  and  1  and then 3 again to be output. By default,
+                 there is no separator (but see the next option).
+
+       --om-separator=text
+                 Specify a separating string for multiple occurrences  of  -o.
+                 The  default is an empty string. Separating strings are never
+                 coloured.
+
+       -q, --quiet
+                 Work quietly, that is, display nothing except error messages.
+                 The  exit  status  indicates  whether or not any matches were
+                 found.
+
+       -r, --recursive
+                 If any given path is a directory, recursively scan the  files
+                 it  contains, taking note of any --include and --exclude set-
+                 tings. By default, a directory is read as a normal  file;  in
+                 some  operating  systems this gives an immediate end-of-file.
+                 This option is a shorthand  for  setting  the  -d  option  to
+                 "recurse".
+
+       --recursion-limit=number
+                 See --match-limit above.
+
+       -s, --no-messages
+                 Suppress  error  messages  about  non-existent  or unreadable
+                 files. Such files are quietly skipped.  However,  the  return
+                 code is still 2, even if matches were found in other files.
+
+       -u, --utf-8
+                 Operate in UTF-8 mode. This option is available only if PCRE2
+                 has been compiled with UTF-8 support. All patterns (including
+                 those  for  any --exclude and --include options) and all sub-
+                 ject lines that are scanned must be valid  strings  of  UTF-8
+                 characters.
+
+       -V, --version
+                 Write  the version numbers of pcre2grep and the PCRE2 library
+                 to the standard output and then exit. Anything  else  on  the
+                 command line is ignored.
+
+       -v, --invert-match
+                 Invert  the  sense  of  the match, so that lines which do not
+                 match any of the patterns are the ones that are found.
+
+       -w, --word-regex, --word-regexp
+                 Force the patterns to match only whole words. This is equiva-
+                 lent  to  having \b at the start and end of the pattern. This
+                 option applies only to the patterns that are matched  against
+                 the  contents  of files; it does not apply to patterns speci-
+                 fied by any of the --include or --exclude options.
+
+       -x, --line-regex, --line-regexp
+                 Force the patterns to be anchored (each must  start  matching
+                 at  the beginning of a line) and in addition, require them to
+                 match entire lines. This is equivalent  to  having  ^  and  $
+                 characters at the start and end of each alternative top-level
+                 branch in every pattern. This option applies only to the pat-
+                 terns that are matched against the contents of files; it does
+                 not apply to patterns specified by any of  the  --include  or
+                 --exclude options.
+
+
+ENVIRONMENT VARIABLES
+
+       The  environment  variables  LC_ALL  and LC_CTYPE are examined, in that
+       order, for a locale. The first one that is set is  used.  This  can  be
+       overridden  by  the  --locale  option.  If  no locale is set, the PCRE2
+       library's default (usually the "C" locale) is used.
+
+
+NEWLINES
+
+       The -N (--newline) option allows pcre2grep to scan files with different
+       newline conventions from the default. Any parts of the input files that
+       are written to the standard output are copied identically,  with  what-
+       ever  newline sequences they have in the input. However, the setting of
+       this option does not affect the interpretation of  files  specified  by
+       the -f, --exclude-from, or --include-from options, which are assumed to
+       use the operating system's  standard  newline  sequence,  nor  does  it
+       affect  the way in which pcre2grep writes informational messages to the
+       standard error and output streams. For these it uses the string "\n" to
+       indicate  newlines,  relying on the C I/O library to convert this to an
+       appropriate sequence.
+
+
+OPTIONS COMPATIBILITY
+
+       Many of the short and long forms of pcre2grep's options are the same as
+       in  the GNU grep program. Any long option of the form --xxx-regexp (GNU
+       terminology) is also available as --xxx-regex (PCRE2 terminology). How-
+       ever,  the  --file-list, --file-offsets, --include-dir, --line-offsets,
+       --locale, --match-limit, -M, --multiline, -N,  --newline,  --om-separa-
+       tor,  --recursion-limit,  -u,  and  --utf-8  options  are  specific  to
+       pcre2grep, as is the use of the --only-matching option with a capturing
+       parentheses number.
+
+       Although  most  of the common options work the same way, a few are dif-
+       ferent in pcre2grep. For example, the --include option's argument is  a
+       glob  for GNU grep, but a regular expression for pcre2grep. If both the
+       -c and -l options are given, GNU grep lists only  file  names,  without
+       counts, but pcre2grep gives the counts as well.
+
+
+OPTIONS WITH DATA
+
+       There are four different ways in which an option with data can be spec-
+       ified.  If a short form option is used, the  data  may  follow  immedi-
+       ately, or (with one exception) in the next command line item. For exam-
+       ple:
+
+         -f/some/file
+         -f /some/file
+
+       The exception is the -o option, which may appear with or without  data.
+       Because  of this, if data is present, it must follow immediately in the
+       same item, for example -o3.
+
+       If a long form option is used, the data may appear in the same  command
+       line  item,  separated by an equals character, or (with two exceptions)
+       it may appear in the next command line item. For example:
+
+         --file=/some/file
+         --file /some/file
+
+       Note, however, that if you want to supply a file name beginning with  ~
+       as  data  in  a  shell  command,  and have the shell expand ~ to a home
+       directory, you must separate the file name from the option, because the
+       shell does not treat ~ specially unless it is at the start of an item.
+
+       The  exceptions  to the above are the --colour (or --color) and --only-
+       matching options, for which the data  is  optional.  If  one  of  these
+       options  does  have  data, it must be given in the first form, using an
+       equals character. Otherwise pcre2grep will assume that it has no data.
+
+
+MATCHING ERRORS
+
+       It is possible to supply a regular expression that takes  a  very  long
+       time  to  fail  to  match certain lines. Such patterns normally involve
+       nested indefinite repeats, for example: (a+)*\d when matched against  a
+       line  of  a's  with  no  final digit. The PCRE2 matching function has a
+       resource limit that causes it to abort in these circumstances. If  this
+       happens,  pcre2grep  outputs  an error message and the line that caused
+       the problem to the standard error stream. If there  are  more  than  20
+       such errors, pcre2grep gives up.
+
+       The  --match-limit  option  of pcre2grep can be used to set the overall
+       resource limit; there is a second option called --recursion-limit  that
+       sets  a limit on the amount of memory (usually stack) that is used (see
+       the discussion of these options above).
+
+
+DIAGNOSTICS
+
+       Exit status is 0 if any matches were found, 1 if no matches were found,
+       and  2  for syntax errors, overlong lines, non-existent or inaccessible
+       files (even if matches were found in other files) or too many  matching
+       errors. Using the -s option to suppress error messages about inaccessi-
+       ble files does not affect the return code.
+
+
+SEE ALSO
+
+       pcre2pattern(3), pcre2syntax(3).
+
+
+AUTHOR
+
+       Philip Hazel
+       University Computing Service
+       Cambridge, England.
+
+
+REVISION
+
+       Last updated: 03 January 2015
+       Copyright (c) 1997-2015 University of Cambridge.
diff --git a/dist2/doc/pcre2jit.3 b/dist2/doc/pcre2jit.3
new file mode 100644
index 0000000..a2117ea
--- /dev/null
+++ b/dist2/doc/pcre2jit.3
@@ -0,0 +1,415 @@
+.TH PCRE2JIT 3 "14 November 2015" "PCRE2 10.21"
+.SH NAME
+PCRE2 - Perl-compatible regular expressions (revised API)
+.SH "PCRE2 JUST-IN-TIME COMPILER SUPPORT"
+.rs
+.sp
+Just-in-time compiling is a heavyweight optimization that can greatly speed up
+pattern matching. However, it comes at the cost of extra processing before the
+match is performed, so it is of most benefit when the same pattern is going to
+be matched many times. This does not necessarily mean many calls of a matching
+function; if the pattern is not anchored, matching attempts may take place many
+times at various positions in the subject, even for a single call. Therefore,
+if the subject string is very long, it may still pay to use JIT even for
+one-off matches. JIT support is available for all of the 8-bit, 16-bit and
+32-bit PCRE2 libraries.
+.P
+JIT support applies only to the traditional Perl-compatible matching function.
+It does not apply when the DFA matching function is being used. The code for
+this support was written by Zoltan Herczeg.
+.
+.
+.SH "AVAILABILITY OF JIT SUPPORT"
+.rs
+.sp
+JIT support is an optional feature of PCRE2. The "configure" option
+--enable-jit (or equivalent CMake option) must be set when PCRE2 is built if
+you want to use JIT. The support is limited to the following hardware
+platforms:
+.sp
+  ARM 32-bit (v5, v7, and Thumb2)
+  ARM 64-bit
+  Intel x86 32-bit and 64-bit
+  MIPS 32-bit and 64-bit
+  Power PC 32-bit and 64-bit
+  SPARC 32-bit
+.sp
+If --enable-jit is set on an unsupported platform, compilation fails.
+.P
+A program can tell if JIT support is available by calling \fBpcre2_config()\fP
+with the PCRE2_CONFIG_JIT option. The result is 1 when JIT is available, and 0
+otherwise. However, a simple program does not need to check this in order to
+use JIT. The API is implemented in a way that falls back to the interpretive
+code if JIT is not available. For programs that need the best possible
+performance, there is also a "fast path" API that is JIT-specific.
+.
+.
+.SH "SIMPLE USE OF JIT"
+.rs
+.sp
+To make use of the JIT support in the simplest way, all you have to do is to
+call \fBpcre2_jit_compile()\fP after successfully compiling a pattern with
+\fBpcre2_compile()\fP. This function has two arguments: the first is the
+compiled pattern pointer that was returned by \fBpcre2_compile()\fP, and the
+second is zero or more of the following option bits: PCRE2_JIT_COMPLETE,
+PCRE2_JIT_PARTIAL_HARD, or PCRE2_JIT_PARTIAL_SOFT.
+.P
+If JIT support is not available, a call to \fBpcre2_jit_compile()\fP does
+nothing and returns PCRE2_ERROR_JIT_BADOPTION. Otherwise, the compiled pattern
+is passed to the JIT compiler, which turns it into machine code that executes
+much faster than the normal interpretive code, but yields exactly the same
+results. The returned value from \fBpcre2_jit_compile()\fP is zero on success,
+or a negative error code.
+.P
+There is a limit to the size of pattern that JIT supports, imposed by the size
+of machine stack that it uses. The exact rules are not documented because they
+may change at any time, in particular, when new optimizations are introduced.
+If a pattern is too big, a call to \fBpcre2_jit_compile()\fB returns
+PCRE2_ERROR_NOMEMORY.
+.P
+PCRE2_JIT_COMPLETE requests the JIT compiler to generate code for complete
+matches. If you want to run partial matches using the PCRE2_PARTIAL_HARD or
+PCRE2_PARTIAL_SOFT options of \fBpcre2_match()\fP, you should set one or both
+of the other options as well as, or instead of PCRE2_JIT_COMPLETE. The JIT
+compiler generates different optimized code for each of the three modes
+(normal, soft partial, hard partial). When \fBpcre2_match()\fP is called, the
+appropriate code is run if it is available. Otherwise, the pattern is matched
+using interpretive code.
+.P
+You can call \fBpcre2_jit_compile()\fP multiple times for the same compiled
+pattern. It does nothing if it has previously compiled code for any of the
+option bits. For example, you can call it once with PCRE2_JIT_COMPLETE and
+(perhaps later, when you find you need partial matching) again with
+PCRE2_JIT_COMPLETE and PCRE2_JIT_PARTIAL_HARD. This time it will ignore
+PCRE2_JIT_COMPLETE and just compile code for partial matching. If
+\fBpcre2_jit_compile()\fP is called with no option bits set, it immediately
+returns zero. This is an alternative way of testing whether JIT is available.
+.P
+At present, it is not possible to free JIT compiled code except when the entire
+compiled pattern is freed by calling \fBpcre2_code_free()\fP.
+.P
+In some circumstances you may need to call additional functions. These are
+described in the section entitled
+.\" HTML <a href="#stackcontrol">
+.\" </a>
+"Controlling the JIT stack"
+.\"
+below.
+.P
+There are some \fBpcre2_match()\fP options that are not supported by JIT, and
+there are also some pattern items that JIT cannot handle. Details are given
+below. In both cases, matching automatically falls back to the interpretive
+code. If you want to know whether JIT was actually used for a particular match,
+you should arrange for a JIT callback function to be set up as described in the
+section entitled
+.\" HTML <a href="#stackcontrol">
+.\" </a>
+"Controlling the JIT stack"
+.\"
+below, even if you do not need to supply a non-default JIT stack. Such a
+callback function is called whenever JIT code is about to be obeyed. If the
+match-time options are not right for JIT execution, the callback function is
+not obeyed.
+.P
+If the JIT compiler finds an unsupported item, no JIT data is generated. You
+can find out if JIT matching is available after compiling a pattern by calling
+\fBpcre2_pattern_info()\fP with the PCRE2_INFO_JITSIZE option. A non-zero
+result means that JIT compilation was successful. A result of 0 means that JIT
+support is not available, or the pattern was not processed by
+\fBpcre2_jit_compile()\fP, or the JIT compiler was not able to handle the
+pattern.
+.
+.
+.SH "UNSUPPORTED OPTIONS AND PATTERN ITEMS"
+.rs
+.sp
+The \fBpcre2_match()\fP options that are supported for JIT matching are
+PCRE2_NOTBOL, PCRE2_NOTEOL, PCRE2_NOTEMPTY, PCRE2_NOTEMPTY_ATSTART,
+PCRE2_NO_UTF_CHECK, PCRE2_PARTIAL_HARD, and PCRE2_PARTIAL_SOFT. The
+PCRE2_ANCHORED option is not supported at match time.
+.P
+The only unsupported pattern items are \eC (match a single data unit) when
+running in a UTF mode, and a callout immediately before an assertion condition
+in a conditional group.
+.
+.
+.SH "RETURN VALUES FROM JIT MATCHING"
+.rs
+.sp
+When a pattern is matched using JIT matching, the return values are the same
+as those given by the interpretive \fBpcre2_match()\fP code, with the addition
+of one new error code: PCRE2_ERROR_JIT_STACKLIMIT. This means that the memory
+used for the JIT stack was insufficient. See
+.\" HTML <a href="#stackcontrol">
+.\" </a>
+"Controlling the JIT stack"
+.\"
+below for a discussion of JIT stack usage.
+.P
+The error code PCRE2_ERROR_MATCHLIMIT is returned by the JIT code if searching
+a very large pattern tree goes on for too long, as it is in the same
+circumstance when JIT is not used, but the details of exactly what is counted
+are not the same. The PCRE2_ERROR_RECURSIONLIMIT error code is never returned
+when JIT matching is used.
+.
+.
+.\" HTML <a name="stackcontrol"></a>
+.SH "CONTROLLING THE JIT STACK"
+.rs
+.sp
+When the compiled JIT code runs, it needs a block of memory to use as a stack.
+By default, it uses 32K on the machine stack. However, some large or
+complicated patterns need more than this. The error PCRE2_ERROR_JIT_STACKLIMIT
+is given when there is not enough stack. Three functions are provided for
+managing blocks of memory for use as JIT stacks. There is further discussion
+about the use of JIT stacks in the section entitled
+.\" HTML <a href="#stackfaq">
+.\" </a>
+"JIT stack FAQ"
+.\"
+below.
+.P
+The \fBpcre2_jit_stack_create()\fP function creates a JIT stack. Its arguments
+are a starting size, a maximum size, and a general context (for memory
+allocation functions, or NULL for standard memory allocation). It returns a
+pointer to an opaque structure of type \fBpcre2_jit_stack\fP, or NULL if there
+is an error. The \fBpcre2_jit_stack_free()\fP function is used to free a stack
+that is no longer needed. (For the technically minded: the address space is
+allocated by mmap or VirtualAlloc.)
+.P
+JIT uses far less memory for recursion than the interpretive code,
+and a maximum stack size of 512K to 1M should be more than enough for any
+pattern.
+.P
+The \fBpcre2_jit_stack_assign()\fP function specifies which stack JIT code
+should use. Its arguments are as follows:
+.sp
+  pcre2_match_context  *mcontext
+  pcre2_jit_callback    callback
+  void                 *data
+.sp
+The first argument is a pointer to a match context. When this is subsequently
+passed to a matching function, its information determines which JIT stack is
+used. There are three cases for the values of the other two options:
+.sp
+  (1) If \fIcallback\fP is NULL and \fIdata\fP is NULL, an internal 32K block
+      on the machine stack is used. This is the default when a match
+      context is created.
+.sp
+  (2) If \fIcallback\fP is NULL and \fIdata\fP is not NULL, \fIdata\fP must be
+      a pointer to a valid JIT stack, the result of calling
+      \fBpcre2_jit_stack_create()\fP.
+.sp
+  (3) If \fIcallback\fP is not NULL, it must point to a function that is
+      called with \fIdata\fP as an argument at the start of matching, in
+      order to set up a JIT stack. If the return from the callback
+      function is NULL, the internal 32K stack is used; otherwise the
+      return value must be a valid JIT stack, the result of calling
+      \fBpcre2_jit_stack_create()\fP.
+.sp
+A callback function is obeyed whenever JIT code is about to be run; it is not
+obeyed when \fBpcre2_match()\fP is called with options that are incompatible
+for JIT matching. A callback function can therefore be used to determine
+whether a match operation was executed by JIT or by the interpreter.
+.P
+You may safely use the same JIT stack for more than one pattern (either by
+assigning directly or by callback), as long as the patterns are matched
+sequentially in the same thread. Currently, the only way to set up
+non-sequential matches in one thread is to use callouts: if a callout function
+starts another match, that match must use a different JIT stack to the one used
+for currently suspended match(es).
+.P
+In a multithread application, if you do not
+specify a JIT stack, or if you assign or pass back NULL from a callback, that
+is thread-safe, because each thread has its own machine stack. However, if you
+assign or pass back a non-NULL JIT stack, this must be a different stack for
+each thread so that the application is thread-safe.
+.P
+Strictly speaking, even more is allowed. You can assign the same non-NULL stack
+to a match context that is used by any number of patterns, as long as they are
+not used for matching by multiple threads at the same time. For example, you
+could use the same stack in all compiled patterns, with a global mutex in the
+callback to wait until the stack is available for use. However, this is an
+inefficient solution, and not recommended.
+.P
+This is a suggestion for how a multithreaded program that needs to set up
+non-default JIT stacks might operate:
+.sp
+  During thread initalization
+    thread_local_var = pcre2_jit_stack_create(...)
+.sp
+  During thread exit
+    pcre2_jit_stack_free(thread_local_var)
+.sp
+  Use a one-line callback function
+    return thread_local_var
+.sp
+All the functions described in this section do nothing if JIT is not available.
+.
+.
+.\" HTML <a name="stackfaq"></a>
+.SH "JIT STACK FAQ"
+.rs
+.sp
+(1) Why do we need JIT stacks?
+.sp
+PCRE2 (and JIT) is a recursive, depth-first engine, so it needs a stack where
+the local data of the current node is pushed before checking its child nodes.
+Allocating real machine stack on some platforms is difficult. For example, the
+stack chain needs to be updated every time if we extend the stack on PowerPC.
+Although it is possible, its updating time overhead decreases performance. So
+we do the recursion in memory.
+.P
+(2) Why don't we simply allocate blocks of memory with \fBmalloc()\fP?
+.sp
+Modern operating systems have a nice feature: they can reserve an address space
+instead of allocating memory. We can safely allocate memory pages inside this
+address space, so the stack could grow without moving memory data (this is
+important because of pointers). Thus we can allocate 1M address space, and use
+only a single memory page (usually 4K) if that is enough. However, we can still
+grow up to 1M anytime if needed.
+.P
+(3) Who "owns" a JIT stack?
+.sp
+The owner of the stack is the user program, not the JIT studied pattern or
+anything else. The user program must ensure that if a stack is being used by
+\fBpcre2_match()\fP, (that is, it is assigned to a match context that is passed
+to the pattern currently running), that stack must not be used by any other
+threads (to avoid overwriting the same memory area). The best practice for
+multithreaded programs is to allocate a stack for each thread, and return this
+stack through the JIT callback function.
+.P
+(4) When should a JIT stack be freed?
+.sp
+You can free a JIT stack at any time, as long as it will not be used by
+\fBpcre2_match()\fP again. When you assign the stack to a match context, only a
+pointer is set. There is no reference counting or any other magic. You can free
+compiled patterns, contexts, and stacks in any order, anytime. Just \fIdo
+not\fP call \fBpcre2_match()\fP with a match context pointing to an already
+freed stack, as that will cause SEGFAULT. (Also, do not free a stack currently
+used by \fBpcre2_match()\fP in another thread). You can also replace the stack
+in a context at any time when it is not in use. You should free the previous
+stack before assigning a replacement.
+.P
+(5) Should I allocate/free a stack every time before/after calling
+\fBpcre2_match()\fP?
+.sp
+No, because this is too costly in terms of resources. However, you could
+implement some clever idea which release the stack if it is not used in let's
+say two minutes. The JIT callback can help to achieve this without keeping a
+list of patterns.
+.P
+(6) OK, the stack is for long term memory allocation. But what happens if a
+pattern causes stack overflow with a stack of 1M? Is that 1M kept until the
+stack is freed?
+.sp
+Especially on embedded sytems, it might be a good idea to release memory
+sometimes without freeing the stack. There is no API for this at the moment.
+Probably a function call which returns with the currently allocated memory for
+any stack and another which allows releasing memory (shrinking the stack) would
+be a good idea if someone needs this.
+.P
+(7) This is too much of a headache. Isn't there any better solution for JIT
+stack handling?
+.sp
+No, thanks to Windows. If POSIX threads were used everywhere, we could throw
+out this complicated API.
+.
+.
+.SH "FREEING JIT SPECULATIVE MEMORY"
+.rs
+.sp
+.nf
+.B void pcre2_jit_free_unused_memory(pcre2_general_context *\fIgcontext\fP);
+.fi
+.P
+The JIT executable allocator does not free all memory when it is possible.
+It expects new allocations, and keeps some free memory around to improve
+allocation speed. However, in low memory conditions, it might be better to free
+all possible memory. You can cause this to happen by calling
+pcre2_jit_free_unused_memory(). Its argument is a general context, for custom
+memory management, or NULL for standard memory management.
+.
+.
+.SH "EXAMPLE CODE"
+.rs
+.sp
+This is a single-threaded example that specifies a JIT stack without using a
+callback. A real program should include error checking after all the function
+calls.
+.sp
+  int rc;
+  pcre2_code *re;
+  pcre2_match_data *match_data;
+  pcre2_match_context *mcontext;
+  pcre2_jit_stack *jit_stack;
+.sp
+  re = pcre2_compile(pattern, PCRE2_ZERO_TERMINATED, 0,
+    &errornumber, &erroffset, NULL);
+  rc = pcre2_jit_compile(re, PCRE2_JIT_COMPLETE);
+  mcontext = pcre2_match_context_create(NULL);
+  jit_stack = pcre2_jit_stack_create(32*1024, 512*1024, NULL);
+  pcre2_jit_stack_assign(mcontext, NULL, jit_stack);
+  match_data = pcre2_match_data_create(re, 10);
+  rc = pcre2_match(re, subject, length, 0, 0, match_data, mcontext);
+  /* Process result */
+.sp
+  pcre2_code_free(re);
+  pcre2_match_data_free(match_data);
+  pcre2_match_context_free(mcontext);
+  pcre2_jit_stack_free(jit_stack);
+.sp
+.
+.
+.SH "JIT FAST PATH API"
+.rs
+.sp
+Because the API described above falls back to interpreted matching when JIT is
+not available, it is convenient for programs that are written for general use
+in many environments. However, calling JIT via \fBpcre2_match()\fP does have a
+performance impact. Programs that are written for use where JIT is known to be
+available, and which need the best possible performance, can instead use a
+"fast path" API to call JIT matching directly instead of calling
+\fBpcre2_match()\fP (obviously only for patterns that have been successfully
+processed by \fBpcre2_jit_compile()\fP).
+.P
+The fast path function is called \fBpcre2_jit_match()\fP, and it takes exactly
+the same arguments as \fBpcre2_match()\fP. The return values are also the same,
+plus PCRE2_ERROR_JIT_BADOPTION if a matching mode (partial or complete) is
+requested that was not compiled. Unsupported option bits (for example,
+PCRE2_ANCHORED) are ignored.
+.P
+When you call \fBpcre2_match()\fP, as well as testing for invalid options, a
+number of other sanity checks are performed on the arguments. For example, if
+the subject pointer is NULL, an immediate error is given. Also, unless
+PCRE2_NO_UTF_CHECK is set, a UTF subject string is tested for validity. In the
+interests of speed, these checks do not happen on the JIT fast path, and if
+invalid data is passed, the result is undefined.
+.P
+Bypassing the sanity checks and the \fBpcre2_match()\fP wrapping can give
+speedups of more than 10%.
+.
+.
+.SH "SEE ALSO"
+.rs
+.sp
+\fBpcre2api\fP(3)
+.
+.
+.SH AUTHOR
+.rs
+.sp
+.nf
+Philip Hazel (FAQ by Zoltan Herczeg)
+University Computing Service
+Cambridge, England.
+.fi
+.
+.
+.SH REVISION
+.rs
+.sp
+.nf
+Last updated: 14 November 2015
+Copyright (c) 1997-2015 University of Cambridge.
+.fi
diff --git a/dist2/doc/pcre2limits.3 b/dist2/doc/pcre2limits.3
new file mode 100644
index 0000000..a5bab81
--- /dev/null
+++ b/dist2/doc/pcre2limits.3
@@ -0,0 +1,80 @@
+.TH PCRE2LIMITS 3 "05 November 2015" "PCRE2 10.21"
+.SH NAME
+PCRE2 - Perl-compatible regular expressions (revised API)
+.SH "SIZE AND OTHER LIMITATIONS"
+.rs
+.sp
+There are some size limitations in PCRE2 but it is hoped that they will never
+in practice be relevant.
+.P
+The maximum size of a compiled pattern is approximately 64K code units for the
+8-bit and 16-bit libraries if PCRE2 is compiled with the default internal
+linkage size, which is 2 bytes for these libraries. If you want to process
+regular expressions that are truly enormous, you can compile PCRE2 with an
+internal linkage size of 3 or 4 (when building the 16-bit library, 3 is rounded
+up to 4). See the \fBREADME\fP file in the source distribution and the
+.\" HREF
+\fBpcre2build\fP
+.\"
+documentation for details. In these cases the limit is substantially larger.
+However, the speed of execution is slower. In the 32-bit library, the internal
+linkage size is always 4.
+.P
+The maximum length of a source pattern string is essentially unlimited; it is
+the largest number a PCRE2_SIZE variable can hold. However, the program that
+calls \fBpcre2_compile()\fP can specify a smaller limit.
+.P
+The maximum length (in code units) of a subject string is one less than the
+largest number a PCRE2_SIZE variable can hold. PCRE2_SIZE is an unsigned
+integer type, usually defined as size_t. Its maximum value (that is
+~(PCRE2_SIZE)0) is reserved as a special indicator for zero-terminated strings
+and unset offsets.
+.P
+Note that when using the traditional matching function, PCRE2 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. For a discussion of stack issues, see the
+.\" HREF
+\fBpcre2stack\fP
+.\"
+documentation.
+.P
+All values in repeating quantifiers must be less than 65536.
+.P
+The maximum length of a lookbehind assertion is 65535 characters.
+.P
+There is no limit to the number of parenthesized subpatterns, but there can be
+no more than 65535 capturing subpatterns. There is, however, a limit to the
+depth of nesting of parenthesized subpatterns of all kinds. This is imposed in
+order to limit the amount of system stack used at compile time. The limit can
+be specified when PCRE2 is built; the default is 250.
+.P
+There is a limit to the number of forward references to subsequent subpatterns
+of around 200,000. Repeated forward references with fixed upper limits, for
+example, (?2){0,100} when subpattern number 2 is to the right, are included in
+the count. There is no limit to the number of backward references.
+.P
+The maximum length of name for a named subpattern is 32 code units, and the
+maximum number of named subpatterns is 10000.
+.P
+The maximum length of a name in a (*MARK), (*PRUNE), (*SKIP), or (*THEN) verb
+is 255 for the 8-bit library and 65535 for the 16-bit and 32-bit libraries.
+.
+.
+.SH AUTHOR
+.rs
+.sp
+.nf
+Philip Hazel
+University Computing Service
+Cambridge, England.
+.fi
+.
+.
+.SH REVISION
+.rs
+.sp
+.nf
+Last updated: 05 November 2015
+Copyright (c) 1997-2015 University of Cambridge.
+.fi
diff --git a/dist/doc/pcrematching.3 b/dist2/doc/pcre2matching.3
similarity index 72%
rename from dist/doc/pcrematching.3
rename to dist2/doc/pcre2matching.3
index 268baf9..3a885e5 100644
--- a/dist/doc/pcrematching.3
+++ b/dist2/doc/pcre2matching.3
@@ -1,25 +1,24 @@
-.TH PCREMATCHING 3 "12 November 2013" "PCRE 8.34"
+.TH PCRE2MATCHING 3 "29 September 2014" "PCRE2 10.00"
 .SH NAME
-PCRE - Perl-compatible regular expressions
-.SH "PCRE MATCHING ALGORITHMS"
+PCRE2 - Perl-compatible regular expressions (revised API)
+.SH "PCRE2 MATCHING ALGORITHMS"
 .rs
 .sp
-This document describes the two different algorithms that are available in PCRE
-for matching a compiled regular expression against a given subject string. The
-"standard" algorithm is the one provided by the \fBpcre_exec()\fP,
-\fBpcre16_exec()\fP and \fBpcre32_exec()\fP functions. These work in the same
-as as Perl's matching function, and provide a Perl-compatible matching operation.
-The just-in-time (JIT) optimization that is described in the
+This document describes the two different algorithms that are available in
+PCRE2 for matching a compiled regular expression against a given subject
+string. The "standard" algorithm is the one provided by the \fBpcre2_match()\fP
+function. This works in the same as as Perl's matching function, and provide a
+Perl-compatible matching operation. The just-in-time (JIT) optimization that is
+described in the
 .\" HREF
-\fBpcrejit\fP
+\fBpcre2jit\fP
 .\"
-documentation is compatible with these functions.
+documentation is compatible with this function.
 .P
-An alternative algorithm is provided by the \fBpcre_dfa_exec()\fP,
-\fBpcre16_dfa_exec()\fP and \fBpcre32_dfa_exec()\fP functions; they operate in
-a different way, and are not Perl-compatible. This alternative has advantages
-and disadvantages compared with the standard algorithm, and these are described
-below.
+An alternative algorithm is provided by the \fBpcre2_dfa_match()\fP function;
+it operates in a different way, and is not Perl-compatible. This alternative
+has advantages and disadvantages compared with the standard algorithm, and
+these are described below.
 .P
 When there is only one possible way in which a given subject string can match a
 pattern, the two algorithms give the same answer. A difference arises, however,
@@ -43,22 +42,21 @@
 infinite size, but it is still a tree. Matching the pattern to a given subject
 string (from a given starting point) can be thought of as a search of the tree.
 There are two ways to search a tree: depth-first and breadth-first, and these
-correspond to the two matching algorithms provided by PCRE.
+correspond to the two matching algorithms provided by PCRE2.
 .
 .
 .SH "THE STANDARD MATCHING ALGORITHM"
 .rs
 .sp
-In the terminology of Jeffrey Friedl's book "Mastering Regular
-Expressions", the standard algorithm is an "NFA algorithm". It conducts a
-depth-first search of the pattern tree. That is, it proceeds along a single
-path through the tree, checking that the subject matches what is required. When
-there is a mismatch, the algorithm tries any alternatives at the current point,
-and if they all fail, it backs up to the previous branch point in the tree, and
-tries the next alternative branch at that level. This often involves backing up
-(moving to the left) in the subject string as well. The order in which
-repetition branches are tried is controlled by the greedy or ungreedy nature of
-the quantifier.
+In the terminology of Jeffrey Friedl's book "Mastering Regular Expressions",
+the standard algorithm is an "NFA algorithm". It conducts a depth-first search
+of the pattern tree. That is, it proceeds along a single path through the tree,
+checking that the subject matches what is required. When there is a mismatch,
+the algorithm tries any alternatives at the current point, and if they all
+fail, it backs up to the previous branch point in the tree, and tries the next
+alternative branch at that level. This often involves backing up (moving to the
+left) in the subject string as well. The order in which repetition branches are
+tried is controlled by the greedy or ungreedy nature of the quantifier.
 .P
 If a leaf node is reached, a matching string has been found, and at that point
 the algorithm stops. Thus, if there is more than one possible match, this
@@ -101,24 +99,25 @@
 .sp
   cat(er(pillar)?)?
 .sp
-is matched against the string "the caterpillar catchment", the result will be
-the three strings "caterpillar", "cater", and "cat" that start at the fifth
+is matched against the string "the caterpillar catchment", the result is the
+three strings "caterpillar", "cater", and "cat" that start at the fifth
 character of the subject. The algorithm does not automatically move on to find
 matches that start at later positions.
 .P
-PCRE's "auto-possessification" optimization usually applies to character
+PCRE2's "auto-possessification" optimization usually applies to character
 repeats at the end of a pattern (as well as internally). For example, the
 pattern "a\ed+" is compiled as if it were "a\ed++" because there is no point
 even considering the possibility of backtracking into the repeated digits. For
 DFA matching, this means that only one possible match is found. If you really
 do want multiple matches in such cases, either use an ungreedy repeat
-("a\ed+?") or set the PCRE_NO_AUTO_POSSESS option when compiling.
+("a\ed+?") or set the PCRE2_NO_AUTO_POSSESS option when compiling.
 .P
-There are a number of features of PCRE regular expressions that are not
+There are a number of features of PCRE2 regular expressions that are not
 supported by the alternative matching algorithm. They are as follows:
 .P
 1. Because the algorithm finds all possible matches, the greedy or ungreedy
-nature of repetition quantifiers is not relevant. Greedy and ungreedy
+nature of repetition quantifiers is not relevant (though it may affect
+auto-possessification, as just described). During matching, greedy and ungreedy
 quantifiers are treated in exactly the same way. However, possessive
 quantifiers can make a difference when what follows could also match what is
 quantified, for example in a pattern like this:
@@ -132,7 +131,7 @@
 .P
 2. When dealing with multiple paths through the tree simultaneously, it is not
 straightforward to keep track of captured substrings for the different matching
-possibilities, and PCRE's implementation of this algorithm does not attempt to
+possibilities, and PCRE2's implementation of this algorithm does not attempt to
 do this. This means that no captured substrings are available.
 .P
 3. Because no substrings are captured, back references within the pattern are
@@ -146,12 +145,12 @@
 and not on others), is not supported. It causes an error if encountered.
 .P
 6. Callouts are supported, but the value of the \fIcapture_top\fP field is
-always 1, and the value of the \fIcapture_last\fP field is always -1.
+always 1, and the value of the \fIcapture_last\fP field is always 0.
 .P
 7. The \eC escape sequence, which (in the standard algorithm) always matches a
-single data unit, even in UTF-8, UTF-16 or UTF-32 modes, is not supported in
-these modes, because the alternative algorithm moves through the subject string
-one character (not data unit) at a time, for all active paths through the tree.
+single code unit, even in a UTF mode, is not supported in these modes, because
+the alternative algorithm moves through the subject string one character (not
+code unit) at a time, for all active paths through the tree.
 .P
 8. Except for (*FAIL), the backtracking control verbs such as (*PRUNE) are not
 supported. (*FAIL) is supported, and behaves like a failing negative assertion.
@@ -170,11 +169,11 @@
 2. Because the alternative algorithm scans the subject string just once, and
 never needs to backtrack (except for lookbehinds), it is possible to pass very
 long subject strings to the matching function in several pieces, checking for
-partial matching each time. Although it is possible to do multi-segment
-matching using the standard algorithm by retaining partially matched
+partial matching each time. Although it is also possible to do multi-segment
+matching using the standard algorithm, by retaining partially matched
 substrings, it is more complicated. The
 .\" HREF
-\fBpcrepartial\fP
+\fBpcre2partial\fP
 .\"
 documentation gives details of partial matching and discusses multi-segment
 matching.
@@ -201,7 +200,7 @@
 .nf
 Philip Hazel
 University Computing Service
-Cambridge CB2 3QH, England.
+Cambridge, England.
 .fi
 .
 .
@@ -209,6 +208,6 @@
 .rs
 .sp
 .nf
-Last updated: 12 November 2013
-Copyright (c) 1997-2012 University of Cambridge.
+Last updated: 29 September 2014
+Copyright (c) 1997-2014 University of Cambridge.
 .fi
diff --git a/dist2/doc/pcre2partial.3 b/dist2/doc/pcre2partial.3
new file mode 100644
index 0000000..72a12ed
--- /dev/null
+++ b/dist2/doc/pcre2partial.3
@@ -0,0 +1,434 @@
+.TH PCRE2PARTIAL 3 "22 December 2014" "PCRE2 10.00"
+.SH NAME
+PCRE2 - Perl-compatible regular expressions
+.SH "PARTIAL MATCHING IN PCRE2"
+.rs
+.sp
+In normal use of PCRE2, if the subject string that is passed to a matching
+function matches as far as it goes, but is too short to match the entire
+pattern, PCRE2_ERROR_NOMATCH is returned. There are circumstances where it
+might be helpful to distinguish this case from other cases in which there is no
+match.
+.P
+Consider, for example, an application where a human is required to type in data
+for a field with specific formatting requirements. An example might be a date
+in the form \fIddmmmyy\fP, defined by this pattern:
+.sp
+  ^\ed?\ed(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\ed\ed$
+.sp
+If the application sees the user's keystrokes one by one, and can check that
+what has been typed so far is potentially valid, it is able to raise an error
+as soon as a mistake is made, by beeping and not reflecting the character that
+has been typed, for example. This immediate feedback is likely to be a better
+user interface than a check that is delayed until the entire string has been
+entered. Partial matching can also be useful when the subject string is very
+long and is not all available at once.
+.P
+PCRE2 supports partial matching by means of the PCRE2_PARTIAL_SOFT and
+PCRE2_PARTIAL_HARD options, which can be set when calling a matching function.
+The difference between the two options is whether or not a partial match is
+preferred to an alternative complete match, though the details differ between
+the two types of matching function. If both options are set, PCRE2_PARTIAL_HARD
+takes precedence.
+.P
+If you want to use partial matching with just-in-time optimized code, you must
+call \fBpcre2_jit_compile()\fP with one or both of these options:
+.sp
+  PCRE2_JIT_PARTIAL_SOFT
+  PCRE2_JIT_PARTIAL_HARD
+.sp
+PCRE2_JIT_COMPLETE should also be set if you are going to run non-partial
+matches on the same pattern. If the appropriate JIT mode has not been compiled,
+interpretive matching code is used.
+.P
+Setting a partial matching option disables two of PCRE2's standard
+optimizations. PCRE2 remembers the last literal code unit in a pattern, and
+abandons matching immediately if it is not present in the subject string. This
+optimization cannot be used for a subject string that might match only
+partially. PCRE2 also knows the minimum length of a matching string, and does
+not bother to run the matching function on shorter strings. This optimization
+is also disabled for partial matching.
+.
+.
+.SH "PARTIAL MATCHING USING pcre2_match()"
+.rs
+.sp
+A partial match occurs during a call to \fBpcre2_match()\fP when the end of the
+subject string is reached successfully, but matching cannot continue because
+more characters are needed. However, at least one character in the subject must
+have been inspected. This character need not form part of the final matched
+string; lookbehind assertions and the \eK escape sequence provide ways of
+inspecting characters before the start of a matched string. The requirement for
+inspecting at least one character exists because an empty string can always be
+matched; without such a restriction there would always be a partial match of an
+empty string at the end of the subject.
+.P
+When a partial match is returned, the first two elements in the ovector point
+to the portion of the subject that was matched, but the values in the rest of
+the ovector are undefined. The appearance of \eK in the pattern has no effect
+for a partial match. Consider this pattern:
+.sp
+  /abc\eK123/
+.sp
+If it is matched against "456abc123xyz" the result is a complete match, and the
+ovector defines the matched string as "123", because \eK resets the "start of
+match" point. However, if a partial match is requested and the subject string
+is "456abc12", a partial match is found for the string "abc12", because all
+these characters are needed for a subsequent re-match with additional
+characters.
+.P
+What happens when a partial match is identified depends on which of the two
+partial matching options are set.
+.
+.
+.SS "PCRE2_PARTIAL_SOFT WITH pcre2_match()"
+.rs
+.sp
+If PCRE2_PARTIAL_SOFT is set when \fBpcre2_match()\fP identifies a partial
+match, the partial match is remembered, but matching continues as normal, and
+other alternatives in the pattern are tried. If no complete match can be found,
+PCRE2_ERROR_PARTIAL is returned instead of PCRE2_ERROR_NOMATCH.
+.P
+This option is "soft" because it prefers a complete match over a partial match.
+All the various matching items in a pattern behave as if the subject string is
+potentially complete. For example, \ez, \eZ, and $ match at the end of the
+subject, as normal, and for \eb and \eB the end of the subject is treated as a
+non-alphanumeric.
+.P
+If there is more than one partial match, the first one that was found provides
+the data that is returned. Consider this pattern:
+.sp
+  /123\ew+X|dogY/
+.sp
+If this is matched against the subject string "abc123dog", both
+alternatives fail to match, but the end of the subject is reached during
+matching, so PCRE2_ERROR_PARTIAL is returned. The offsets are set to 3 and 9,
+identifying "123dog" as the first partial match that was found. (In this
+example, there are two partial matches, because "dog" on its own partially
+matches the second alternative.)
+.
+.
+.SS "PCRE2_PARTIAL_HARD WITH pcre2_match()"
+.rs
+.sp
+If PCRE2_PARTIAL_HARD is set for \fBpcre2_match()\fP, PCRE2_ERROR_PARTIAL is
+returned as soon as a partial match is found, without continuing to search for
+possible complete matches. This option is "hard" because it prefers an earlier
+partial match over a later complete match. For this reason, the assumption is
+made that the end of the supplied subject string may not be the true end of the
+available data, and so, if \ez, \eZ, \eb, \eB, or $ are encountered at the end
+of the subject, the result is PCRE2_ERROR_PARTIAL, provided that at least one
+character in the subject has been inspected.
+.
+.
+.SS "Comparing hard and soft partial matching"
+.rs
+.sp
+The difference between the two partial matching options can be illustrated by a
+pattern such as:
+.sp
+  /dog(sbody)?/
+.sp
+This matches either "dog" or "dogsbody", greedily (that is, it prefers the
+longer string if possible). If it is matched against the string "dog" with
+PCRE2_PARTIAL_SOFT, it yields a complete match for "dog". However, if
+PCRE2_PARTIAL_HARD is set, the result is PCRE2_ERROR_PARTIAL. On the other
+hand, if the pattern is made ungreedy the result is different:
+.sp
+  /dog(sbody)??/
+.sp
+In this case the result is always a complete match because that is found first,
+and matching never continues after finding a complete match. It might be easier
+to follow this explanation by thinking of the two patterns like this:
+.sp
+  /dog(sbody)?/    is the same as  /dogsbody|dog/
+  /dog(sbody)??/   is the same as  /dog|dogsbody/
+.sp
+The second pattern will never match "dogsbody", because it will always find the
+shorter match first.
+.
+.
+.SH "PARTIAL MATCHING USING pcre2_dfa_match()"
+.rs
+.sp
+The DFA functions move along the subject string character by character, without
+backtracking, searching for all possible matches simultaneously. If the end of
+the subject is reached before the end of the pattern, there is the possibility
+of a partial match, again provided that at least one character has been
+inspected.
+.P
+When PCRE2_PARTIAL_SOFT is set, PCRE2_ERROR_PARTIAL is returned only if there
+have been no complete matches. Otherwise, the complete matches are returned.
+However, if PCRE2_PARTIAL_HARD is set, a partial match takes precedence over
+any complete matches. The portion of the string that was matched when the
+longest partial match was found is set as the first matching string.
+.P
+Because the DFA functions always search for all possible matches, and there is
+no difference between greedy and ungreedy repetition, their behaviour is
+different from the standard functions when PCRE2_PARTIAL_HARD is set. Consider
+the string "dog" matched against the ungreedy pattern shown above:
+.sp
+  /dog(sbody)??/
+.sp
+Whereas the standard function stops as soon as it finds the complete match for
+"dog", the DFA function also finds the partial match for "dogsbody", and so
+returns that when PCRE2_PARTIAL_HARD is set.
+.
+.
+.SH "PARTIAL MATCHING AND WORD BOUNDARIES"
+.rs
+.sp
+If a pattern ends with one of sequences \eb or \eB, which test for word
+boundaries, partial matching with PCRE2_PARTIAL_SOFT can give counter-intuitive
+results. Consider this pattern:
+.sp
+  /\ebcat\eb/
+.sp
+This matches "cat", provided there is a word boundary at either end. If the
+subject string is "the cat", the comparison of the final "t" with a following
+character cannot take place, so a partial match is found. However, normal
+matching carries on, and \eb matches at the end of the subject when the last
+character is a letter, so a complete match is found. The result, therefore, is
+\fInot\fP PCRE2_ERROR_PARTIAL. Using PCRE2_PARTIAL_HARD in this case does yield
+PCRE2_ERROR_PARTIAL, because then the partial match takes precedence.
+.
+.
+.SH "EXAMPLE OF PARTIAL MATCHING USING PCRE2TEST"
+.rs
+.sp
+If the \fBpartial_soft\fP (or \fBps\fP) modifier is present on a
+\fBpcre2test\fP data line, the PCRE2_PARTIAL_SOFT option is used for the match.
+Here is a run of \fBpcre2test\fP that uses the date example quoted above:
+.sp
+    re> /^\ed?\ed(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\ed\ed$/
+  data> 25jun04\e=ps
+   0: 25jun04
+   1: jun
+  data> 25dec3\e=ps
+  Partial match: 23dec3
+  data> 3ju\e=ps
+  Partial match: 3ju
+  data> 3juj\e=ps
+  No match
+  data> j\e=ps
+  No match
+.sp
+The first data string is matched completely, so \fBpcre2test\fP shows the
+matched substrings. The remaining four strings do not match the complete
+pattern, but the first two are partial matches. Similar output is obtained
+if DFA matching is used.
+.P
+If the \fBpartial_hard\fP (or \fBph\fP) modifier is present on a
+\fBpcre2test\fP data line, the PCRE2_PARTIAL_HARD option is set for the match.
+.
+.
+.SH "MULTI-SEGMENT MATCHING WITH pcre2_dfa_match()"
+.rs
+.sp
+When a partial match has been found using a DFA matching function, it is
+possible to continue the match by providing additional subject data and calling
+the function again with the same compiled regular expression, this time setting
+the PCRE2_DFA_RESTART option. You must pass the same working space as before,
+because this is where details of the previous partial match are stored. Here is
+an example using \fBpcre2test\fP:
+.sp
+    re> /^\ed?\ed(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\ed\ed$/
+  data> 23ja\e=dfa,ps
+  Partial match: 23ja
+  data> n05\e=dfa,dfa_restart
+   0: n05
+.sp
+The first call has "23ja" as the subject, and requests partial matching; the
+second call has "n05" as the subject for the continued (restarted) match.
+Notice that when the match is complete, only the last part is shown; PCRE2 does
+not retain the previously partially-matched string. It is up to the calling
+program to do that if it needs to.
+.P
+That means that, for an unanchored pattern, if a continued match fails, it is
+not possible to try again at a new starting point. All this facility is capable
+of doing is continuing with the previous match attempt. In the previous
+example, if the second set of data is "ug23" the result is no match, even
+though there would be a match for "aug23" if the entire string were given at
+once. Depending on the application, this may or may not be what you want.
+The only way to allow for starting again at the next character is to retain the
+matched part of the subject and try a new complete match.
+.P
+You can set the PCRE2_PARTIAL_SOFT or PCRE2_PARTIAL_HARD options with
+PCRE2_DFA_RESTART to continue partial matching over multiple segments. This
+facility can be used to pass very long subject strings to the DFA matching
+functions.
+.
+.
+.SH "MULTI-SEGMENT MATCHING WITH pcre2_match()"
+.rs
+.sp
+Unlike the DFA function, it is not possible to restart the previous match with
+a new segment of data when using \fBpcre2_match()\fP. Instead, new data must be
+added to the previous subject string, and the entire match re-run, starting
+from the point where the partial match occurred. Earlier data can be discarded.
+.P
+It is best to use PCRE2_PARTIAL_HARD in this situation, because it does not
+treat the end of a segment as the end of the subject when matching \ez, \eZ,
+\eb, \eB, and $. Consider an unanchored pattern that matches dates:
+.sp
+    re> /\ed?\ed(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\ed\ed/
+  data> The date is 23ja\e=ph
+  Partial match: 23ja
+.sp
+At this stage, an application could discard the text preceding "23ja", add on
+text from the next segment, and call the matching function again. Unlike the
+DFA matching function, the entire matching string must always be available,
+and the complete matching process occurs for each call, so more memory and more
+processing time is needed.
+.
+.
+.SH "ISSUES WITH MULTI-SEGMENT MATCHING"
+.rs
+.sp
+Certain types of pattern may give problems with multi-segment matching,
+whichever matching function is used.
+.P
+1. If the pattern contains a test for the beginning of a line, you need to pass
+the PCRE2_NOTBOL option when the subject string for any call does start at the
+beginning of a line. There is also a PCRE2_NOTEOL option, but in practice when
+doing multi-segment matching you should be using PCRE2_PARTIAL_HARD, which
+includes the effect of PCRE2_NOTEOL.
+.P
+2. If a pattern contains a lookbehind assertion, characters that precede the
+start of the partial match may have been inspected during the matching process.
+When using \fBpcre2_match()\fP, sufficient characters must be retained for the
+next match attempt. You can ensure that enough characters are retained by doing
+the following:
+.P
+Before doing any matching, find the length of the longest lookbehind in the
+pattern by calling \fBpcre2_pattern_info()\fP with the PCRE2_INFO_MAXLOOKBEHIND
+option. Note that the resulting count is in characters, not code units. After a
+partial match, moving back from the ovector[0] offset in the subject by the
+number of characters given for the maximum lookbehind gets you to the earliest
+character that must be retained. In a non-UTF or a 32-bit situation, moving
+back is just a subtraction, but in UTF-8 or UTF-16 you have to count characters
+while moving back through the code units.
+.P
+Characters before the point you have now reached can be discarded, and after
+the next segment has been added to what is retained, you should run the next
+match with the \fBstartoffset\fP argument set so that the match begins at the
+same point as before.
+.P
+For example, if the pattern "(?<=123)abc" is partially matched against the
+string "xx123ab", the ovector offsets are 5 and 7 ("ab"). The maximum
+lookbehind count is 3, so all characters before offset 2 can be discarded. The
+value of \fBstartoffset\fP for the next match should be 3. When \fBpcre2test\fP
+displays a partial match, it indicates the lookbehind characters with '<'
+characters:
+.sp
+    re> "(?<=123)abc"
+  data> xx123ab\e=ph
+  Partial match: 123ab
+                 <<<
+.P
+3. Because a partial match must always contain at least one character, what
+might be considered a partial match of an empty string actually gives a "no
+match" result. For example:
+.sp
+    re> /c(?<=abc)x/
+  data> ab\e=ps
+  No match
+.sp
+If the next segment begins "cx", a match should be found, but this will only
+happen if characters from the previous segment are retained. For this reason, a
+"no match" result should be interpreted as "partial match of an empty string"
+when the pattern contains lookbehinds.
+.P
+4. Matching a subject string that is split into multiple segments may not
+always produce exactly the same result as matching over one single long string,
+especially when PCRE2_PARTIAL_SOFT is used. The section "Partial Matching and
+Word Boundaries" above describes an issue that arises if the pattern ends with
+\eb or \eB. Another kind of difference may occur when there are multiple
+matching possibilities, because (for PCRE2_PARTIAL_SOFT) a partial match result
+is given only when there are no completed matches. This means that as soon as
+the shortest match has been found, continuation to a new subject segment is no
+longer possible. Consider this \fBpcre2test\fP example:
+.sp
+    re> /dog(sbody)?/
+  data> dogsb\e=ps
+   0: dog
+  data> do\e=ps,dfa
+  Partial match: do
+  data> gsb\e=ps,dfa,dfa_restart
+   0: g
+  data> dogsbody\e=dfa
+   0: dogsbody
+   1: dog
+.sp
+The first data line passes the string "dogsb" to a standard matching function,
+setting the PCRE2_PARTIAL_SOFT option. Although the string is a partial match
+for "dogsbody", the result is not PCRE2_ERROR_PARTIAL, because the shorter
+string "dog" is a complete match. Similarly, when the subject is presented to
+a DFA matching function in several parts ("do" and "gsb" being the first two)
+the match stops when "dog" has been found, and it is not possible to continue.
+On the other hand, if "dogsbody" is presented as a single string, a DFA
+matching function finds both matches.
+.P
+Because of these problems, it is best to use PCRE2_PARTIAL_HARD when matching
+multi-segment data. The example above then behaves differently:
+.sp
+    re> /dog(sbody)?/
+  data> dogsb\e=ph
+  Partial match: dogsb
+  data> do\e=ps,dfa
+  Partial match: do
+  data> gsb\e=ph,dfa,dfa_restart
+  Partial match: gsb
+.sp
+5. Patterns that contain alternatives at the top level which do not all start
+with the same pattern item may not work as expected when PCRE2_DFA_RESTART is
+used. For example, consider this pattern:
+.sp
+  1234|3789
+.sp
+If the first part of the subject is "ABC123", a partial match of the first
+alternative is found at offset 3. There is no partial match for the second
+alternative, because such a match does not start at the same point in the
+subject string. Attempting to continue with the string "7890" does not yield a
+match because only those alternatives that match at one point in the subject
+are remembered. The problem arises because the start of the second alternative
+matches within the first alternative. There is no problem with anchored
+patterns or patterns such as:
+.sp
+  1234|ABCD
+.sp
+where no string can be a partial match for both alternatives. This is not a
+problem if a standard matching function is used, because the entire match has
+to be rerun each time:
+.sp
+    re> /1234|3789/
+  data> ABC123\e=ph
+  Partial match: 123
+  data> 1237890
+   0: 3789
+.sp
+Of course, instead of using PCRE2_DFA_RESTART, the same technique of re-running
+the entire match can also be used with the DFA matching function. Another
+possibility is to work with two buffers. If a partial match at offset \fIn\fP
+in the first buffer is followed by "no match" when PCRE2_DFA_RESTART is used on
+the second buffer, you can then try a new match starting at offset \fIn+1\fP in
+the first buffer.
+.
+.
+.SH AUTHOR
+.rs
+.sp
+.nf
+Philip Hazel
+University Computing Service
+Cambridge, England.
+.fi
+.
+.
+.SH REVISION
+.rs
+.sp
+.nf
+Last updated: 22 December 2014
+Copyright (c) 1997-2014 University of Cambridge.
+.fi
diff --git a/dist/doc/pcrepattern.3 b/dist2/doc/pcre2pattern.3
similarity index 73%
rename from dist/doc/pcrepattern.3
rename to dist2/doc/pcre2pattern.3
index 3b8c639..8d0e9df 100644
--- a/dist/doc/pcrepattern.3
+++ b/dist2/doc/pcre2pattern.3
@@ -1,35 +1,34 @@
-.TH PCREPATTERN 3 "14 June 2015" "PCRE 8.38"
+.TH PCRE2PATTERN 3 "13 November 2015" "PCRE2 10.21"
 .SH NAME
-PCRE - Perl-compatible regular expressions
-.SH "PCRE REGULAR EXPRESSION DETAILS"
+PCRE2 - Perl-compatible regular expressions (revised API)
+.SH "PCRE2 REGULAR EXPRESSION DETAILS"
 .rs
 .sp
-The syntax and semantics of the regular expressions that are supported by PCRE
+The syntax and semantics of the regular expressions that are supported by PCRE2
 are described in detail below. There is a quick-reference syntax summary in the
 .\" HREF
-\fBpcresyntax\fP
+\fBpcre2syntax\fP
 .\"
-page. PCRE tries to match Perl syntax and semantics as closely as it can. PCRE
-also supports some alternative regular expression syntax (which does not
+page. PCRE2 tries to match Perl syntax and semantics as closely as it can.
+PCRE2 also supports some alternative regular expression syntax (which does not
 conflict with the Perl syntax) in order to provide some compatibility with
 regular expressions in Python, .NET, and Oniguruma.
 .P
-Perl's regular expressions are described in its own documentation, and
-regular expressions in general are covered 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.
+Perl's regular expressions are described in its own documentation, and regular
+expressions in general are covered 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
+PCRE2's regular expressions is intended as reference material.
 .P
-This document discusses the patterns that are supported by PCRE when one its
-main matching functions, \fBpcre_exec()\fP (8-bit) or \fBpcre[16|32]_exec()\fP
-(16- or 32-bit), is used. PCRE also has alternative matching functions,
-\fBpcre_dfa_exec()\fP and \fBpcre[16|32_dfa_exec()\fP, which match using a
-different algorithm that is not Perl-compatible. Some of the features discussed
-below are not available when DFA matching is used. The advantages and
-disadvantages of the alternative functions, and how they differ from the normal
-functions, are discussed in the
+This document discusses the patterns that are supported by PCRE2 when its main
+matching function, \fBpcre2_match()\fP, is used. PCRE2 also has an alternative
+matching function, \fBpcre2_dfa_match()\fP, which matches using a different
+algorithm that is not Perl-compatible. Some of the features discussed below are
+not available when DFA matching is used. The advantages and disadvantages of
+the alternative function, and how it differs from the normal function, are
+discussed in the
 .\" HREF
-\fBpcrematching\fP
+\fBpcre2matching\fP
 .\"
 page.
 .
@@ -37,7 +36,7 @@
 .SH "SPECIAL START-OF-PATTERN ITEMS"
 .rs
 .sp
-A number of options that can be passed to \fBpcre_compile()\fP can also be set
+A number of options that can be passed to \fBpcre2_compile()\fP can also be set
 by special items at the start of a pattern. These are not Perl-compatible, but
 are provided to make these options accessible to pattern writers who are not
 able to change the program that processes the pattern. Any number of these
@@ -48,54 +47,60 @@
 .SS "UTF support"
 .rs
 .sp
-The original operation of PCRE was on strings of one-byte characters. However,
-there is now also support for UTF-8 strings in the original library, an
-extra library that supports 16-bit and UTF-16 character strings, and a
-third library that supports 32-bit and UTF-32 character strings. To use these
-features, PCRE must be built to include appropriate support. When using UTF
-strings you must either call the compiling function with the PCRE_UTF8,
-PCRE_UTF16, or PCRE_UTF32 option, or the pattern must start with one of
-these special sequences:
-.sp
-  (*UTF8)
-  (*UTF16)
-  (*UTF32)
-  (*UTF)
-.sp
-(*UTF) is a generic sequence that can be used with any of the libraries.
-Starting a pattern with such a sequence is equivalent to setting the relevant
-option. How setting a UTF mode affects pattern matching is mentioned in several
-places below. There is also a summary of features in the
+In the 8-bit and 16-bit PCRE2 libraries, characters may be coded either as
+single code units, or as multiple UTF-8 or UTF-16 code units. UTF-32 can be
+specified for the 32-bit library, in which case it constrains the character
+values to valid Unicode code points. To process UTF strings, PCRE2 must be
+built to include Unicode support (which is the default). When using UTF strings
+you must either call the compiling function with the PCRE2_UTF option, or the
+pattern must start with the special sequence (*UTF), which is equivalent to
+setting the relevant option. How setting a UTF mode affects pattern matching is
+mentioned in several places below. There is also a summary of features in the
 .\" HREF
-\fBpcreunicode\fP
+\fBpcre2unicode\fP
 .\"
 page.
 .P
 Some applications that allow their users to supply patterns may wish to
-restrict them to non-UTF data for security reasons. If the PCRE_NEVER_UTF
-option is set at compile time, (*UTF) etc. are not allowed, and their
-appearance causes an error.
+restrict them to non-UTF data for security reasons. If the PCRE2_NEVER_UTF
+option is passed to \fBpcre2_compile()\fP, (*UTF) is not allowed, and its
+appearance in a pattern causes an error.
 .
 .
 .SS "Unicode property support"
 .rs
 .sp
 Another special sequence that may appear at the start of a pattern is (*UCP).
-This has the same effect as setting the PCRE_UCP option: it causes sequences
+This has the same effect as setting the PCRE2_UCP option: it causes sequences
 such as \ed and \ew to use Unicode properties to determine character types,
-instead of recognizing only characters with codes less than 128 via a lookup
+instead of recognizing only characters with codes less than 256 via a lookup
 table.
+.P
+Some applications that allow their users to supply patterns may wish to
+restrict them for security reasons. If the PCRE2_NEVER_UCP option is passed to
+\fBpcre2_compile()\fP, (*UCP) is not allowed, and its appearance in a pattern
+causes an error.
+.
+.
+.SS "Locking out empty string matching"
+.rs
+.sp
+Starting a pattern with (*NOTEMPTY) or (*NOTEMPTY_ATSTART) has the same effect
+as passing the PCRE2_NOTEMPTY or PCRE2_NOTEMPTY_ATSTART option to whichever
+matching function is subsequently called to match the pattern. These options
+lock out the matching of empty strings, either entirely, or only at the start
+of the subject.
 .
 .
 .SS "Disabling auto-possessification"
 .rs
 .sp
 If a pattern starts with (*NO_AUTO_POSSESS), it has the same effect as setting
-the PCRE_NO_AUTO_POSSESS option at compile time. This stops PCRE from making
-quantifiers possessive when what follows cannot match the repeated item. For
-example, by default a+b is treated as a++b. For more details, see the
+the PCRE2_NO_AUTO_POSSESS option. This stops PCRE2 from making quantifiers
+possessive when what follows cannot match the repeated item. For example, by
+default a+b is treated as a++b. For more details, see the
 .\" HREF
-\fBpcreapi\fP
+\fBpcre2api\fP
 .\"
 documentation.
 .
@@ -104,33 +109,75 @@
 .rs
 .sp
 If a pattern starts with (*NO_START_OPT), it has the same effect as setting the
-PCRE_NO_START_OPTIMIZE option either at compile or matching time. This disables
-several optimizations for quickly reaching "no match" results. For more
-details, see the
+PCRE2_NO_START_OPTIMIZE option. This disables several optimizations for quickly
+reaching "no match" results. For more details, see the
 .\" HREF
-\fBpcreapi\fP
+\fBpcre2api\fP
 .\"
 documentation.
 .
 .
+.SS "Disabling automatic anchoring"
+.rs
+.sp
+If a pattern starts with (*NO_DOTSTAR_ANCHOR), it has the same effect as
+setting the PCRE2_NO_DOTSTAR_ANCHOR option. This disables optimizations that
+apply to patterns whose top-level branches all start with .* (match any number
+of arbitrary characters). For more details, see the
+.\" HREF
+\fBpcre2api\fP
+.\"
+documentation.
+.
+.
+.SS "Disabling JIT compilation"
+.rs
+.sp
+If a pattern that starts with (*NO_JIT) is successfully compiled, an attempt by
+the application to apply the JIT optimization by calling
+\fBpcre2_jit_compile()\fP is ignored.
+.
+.
+.SS "Setting match and recursion limits"
+.rs
+.sp
+The caller of \fBpcre2_match()\fP can set a limit on the number of times the
+internal \fBmatch()\fP function is called and on the maximum depth of
+recursive calls. These facilities are provided to catch runaway matches that
+are provoked by patterns with huge matching trees (a typical example is a
+pattern with nested unlimited repeats) and to avoid running out of system stack
+by too much recursion. When one of these limits is reached, \fBpcre2_match()\fP
+gives an error return. The limits can also be set by items at the start of the
+pattern of the form
+.sp
+  (*LIMIT_MATCH=d)
+  (*LIMIT_RECURSION=d)
+.sp
+where d is any number of decimal digits. However, the value of the setting must
+be less than the value set (or defaulted) by the caller of \fBpcre2_match()\fP
+for it to have any effect. In other words, the pattern writer can lower the
+limits set by the programmer, but not raise them. If there is more than one
+setting of one of these limits, the lower value is used.
+.
+.
 .\" HTML <a name="newlines"></a>
 .SS "Newline conventions"
 .rs
 .sp
-PCRE supports five different conventions for indicating line breaks in
+PCRE2 supports five different conventions for indicating line breaks in
 strings: a single CR (carriage return) character, a single LF (linefeed)
 character, the two-character sequence CRLF, any of the three preceding, or any
 Unicode newline sequence. The
 .\" HREF
-\fBpcreapi\fP
+\fBpcre2api\fP
 .\"
 page has
-.\" HTML <a href="pcreapi.html#newlines">
+.\" HTML <a href="pcre2api.html#newlines">
 .\" </a>
 further discussion
 .\"
-about newlines, and shows how to set the newline convention in the
-\fIoptions\fP arguments for the compiling and matching functions.
+about newlines, and shows how to set the newline convention when calling
+\fBpcre2_compile()\fP.
 .P
 It is also possible to specify a newline convention by starting a pattern
 string with one of the following five sequences:
@@ -152,7 +199,7 @@
 .P
 The newline convention affects where the circumflex and dollar assertions are
 true. It also affects the interpretation of the dot metacharacter when
-PCRE_DOTALL is not set, and the behaviour of \eN. However, it does not affect
+PCRE2_DOTALL is not set, and the behaviour of \eN. However, it does not affect
 what the \eR escape sequence matches. By default, this is any Unicode newline
 sequence, for Perl compatibility. However, this can be changed; see the
 description of \eR in the section entitled
@@ -164,34 +211,22 @@
 convention.
 .
 .
-.SS "Setting match and recursion limits"
+.SS "Specifying what \eR matches"
 .rs
 .sp
-The caller of \fBpcre_exec()\fP can set a limit on the number of times the
-internal \fBmatch()\fP function is called and on the maximum depth of
-recursive calls. These facilities are provided to catch runaway matches that
-are provoked by patterns with huge matching trees (a typical example is a
-pattern with nested unlimited repeats) and to avoid running out of system stack
-by too much recursion. When one of these limits is reached, \fBpcre_exec()\fP
-gives an error return. The limits can also be set by items at the start of the
-pattern of the form
-.sp
-  (*LIMIT_MATCH=d)
-  (*LIMIT_RECURSION=d)
-.sp
-where d is any number of decimal digits. However, the value of the setting must
-be less than the value set (or defaulted) by the caller of \fBpcre_exec()\fP
-for it to have any effect. In other words, the pattern writer can lower the
-limits set by the programmer, but not raise them. If there is more than one
-setting of one of these limits, the lower value is used.
+It is possible to restrict \eR to match only CR, LF, or CRLF (instead of the
+complete set of Unicode line endings) by setting the option PCRE2_BSR_ANYCRLF
+at compile time. This effect can also be achieved by starting a pattern with
+(*BSR_ANYCRLF). For completeness, (*BSR_UNICODE) is also recognized,
+corresponding to PCRE2_BSR_UNICODE.
 .
 .
 .SH "EBCDIC CHARACTER CODES"
 .rs
 .sp
-PCRE can be compiled to run in an environment that uses EBCDIC as its character
-code rather than ASCII or Unicode (typically a mainframe system). In the
-sections below, character code values are ASCII or Unicode; in an EBCDIC
+PCRE2 can be compiled to run in an environment that uses EBCDIC as its
+character code rather than ASCII or Unicode (typically a mainframe system). In
+the sections below, character code values are ASCII or Unicode; in an EBCDIC
 environment these characters may have different code values, and there are no
 code points greater than 255.
 .
@@ -206,14 +241,8 @@
   The quick brown fox
 .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 a UTF 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 support.
+caseless matching is specified (the PCRE2_CASELESS option), letters are matched
+independently of case.
 .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
@@ -273,18 +302,18 @@
 backslash. All other characters (in particular, those whose codepoints are
 greater than 127) are treated as literals.
 .P
-If a pattern is compiled with the PCRE_EXTENDED option, most white space in the
-pattern (other than in a character class), and characters between a # outside a
-character class and the next newline, inclusive, are ignored. An escaping
-backslash can be used to include a white space or # character as part of the
-pattern.
+If a pattern is compiled with the PCRE2_EXTENDED option, most white space in
+the pattern (other than in a character class), and characters between a #
+outside a character class and the next newline, inclusive, are ignored. An
+escaping backslash can be used to include a white space 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 \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:
+that $ and @ are handled as literals in \eQ...\eE sequences in PCRE2, whereas
+in Perl, $ and @ cause variable interpolation. Note the following examples:
 .sp
-  Pattern            PCRE matches   Perl matches
+  Pattern            PCRE2 matches   Perl matches
 .sp
 .\" JOIN
   \eQabc$xyz\eE        abc$xyz        abc followed by the
@@ -306,13 +335,13 @@
 .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 often easier to use
-one of the following escape sequences than the binary character it represents.
-In an ASCII or Unicode environment, these escapes are as follows:
+non-printing characters in a pattern, but when a pattern is being prepared by
+text editing, it is often easier to use one of the following escape sequences
+than the binary character it represents. In an ASCII or Unicode environment,
+these escapes are as follows:
 .sp
   \ea        alarm, that is, the BEL character (hex 07)
-  \ecx       "control-x", where x is any ASCII character
+  \ecx       "control-x", where x is any printable ASCII character
   \ee        escape (hex 1B)
   \ef        form feed (hex 0C)
   \en        linefeed (hex 0A)
@@ -322,17 +351,18 @@
   \eddd      character with octal code ddd, or back reference
   \eo{ddd..} character with octal code ddd..
   \exhh      character with hex code hh
-  \ex{hhh..} character with hex code hhh.. (non-JavaScript mode)
-  \euhhhh    character with hex code hhhh (JavaScript mode only)
+  \ex{hhh..} character with hex code hhh.. (default mode)
+  \euhhhh    character with hex code hhhh (when PCRE2_ALT_BSUX is set)
 .sp
 The precise effect of \ecx on ASCII characters 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 \ecA to \ecZ become hex 01 to hex 1A (A is 41, Z is 5A),
 but \ec{ becomes hex 3B ({ is 7B), and \ec; becomes hex 7B (; is 3B). If the
-data item (byte or 16-bit value) following \ec has a value greater than 127, a
-compile-time error occurs. This locks out non-ASCII characters in all modes.
+code unit following \ec has a value less than 32 or greater than 126, a
+compile-time error occurs. This locks out non-printable ASCII characters in all
+modes.
 .P
-When PCRE is compiled in EBCDIC mode, \ea, \ee, \ef, \en, \er, and \et
+When PCRE2 is compiled in EBCDIC mode, \ea, \ee, \ef, \en, \er, and \et
 generate the appropriate EBCDIC code values. The \ec escape is processed
 as specified for Perl in the \fBperlebcdic\fP document. The only characters
 that are allowed after \ec are A-Z, a-z, or one of @, [, \e, ], ^, _, or ?. Any
@@ -351,7 +381,7 @@
 APC character. Unfortunately, there are several variants of EBCDIC. In most of
 them the APC character has the value 255 (hex FF), but in the one Perl calls
 POSIX-BC its value is 95 (hex 5F). If certain other characters have POSIX-BC
-values, PCRE makes \e? generate 95; otherwise it generates 255.
+values, PCRE2 makes \e? generate 95; otherwise it generates 255.
 .P
 After \e0 up to two further octal digits are read. If there are fewer than two
 digits, just those that are present are used. Thus the sequence \e0\ex\e015
@@ -371,11 +401,13 @@
 describe the old, ambiguous syntax.
 .P
 The handling of a backslash followed by a digit other than 0 is complicated,
-and Perl has changed in recent releases, causing PCRE also to change. Outside a
-character class, PCRE reads the digit and any following digits as a decimal
-number. If the number is less than 8, 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\fP. A description of how this works is given
+and Perl has changed over time, causing PCRE2 also to change.
+.P
+Outside a character class, PCRE2 reads the digit and any following digits as a
+decimal number. If the number is less than 10, begins with the digit 8 or 9, or
+if there are at least that many previous capturing left parentheses in the
+expression, the entire sequence is taken as a \fIback reference\fP. A
+description of how this works is given
 .\" HTML <a href="#backreferences">
 .\" </a>
 later,
@@ -385,12 +417,12 @@
 .\" </a>
 parenthesized subpatterns.
 .\"
+Otherwise, up to three octal digits are read to form a character code.
 .P
-Inside a character class, or if the decimal number following \e is greater than
-7 and there have not been that many capturing subpatterns, PCRE handles \e8 and
-\e9 as the literal characters "8" and "9", and otherwise re-reads up to three
-octal digits following the backslash, using them to generate a data character.
-Any subsequent digits stand for themselves. For example:
+Inside a character class, PCRE2 handles \e8 and \e9 as the literal characters
+"8" and "9", and otherwise reads up to three octal digits following the
+backslash, using them to generate a data character. Any subsequent digits stand
+for themselves. For example, outside a character class:
 .sp
   \e040   is another way of writing an ASCII space
 .\" JOIN
@@ -409,8 +441,7 @@
   \e377   might be a back reference, otherwise
             the value 255 (decimal)
 .\" JOIN
-  \e81    is either a back reference, or the two
-            characters "8" and "1"
+  \e81    is always a back reference
 .sp
 Note that octal values of 100 or greater that are specified using this syntax
 must not be introduced by a leading zero, because no more than three octal
@@ -422,16 +453,16 @@
 a hexadecimal digit appears between \ex{ and }, or if there is no terminating
 }, an error occurs.
 .P
-If the PCRE_JAVASCRIPT_COMPAT option is set, the interpretation of \ex is
-as just described only when it is followed by two hexadecimal digits.
-Otherwise, it matches a literal "x" character. In JavaScript mode, support for
-code points greater than 256 is provided by \eu, which must be followed by
-four hexadecimal digits; otherwise it matches a literal "u" character.
+If the PCRE2_ALT_BSUX option is set, the interpretation of \ex is as just
+described only when it is followed by two hexadecimal digits. Otherwise, it
+matches a literal "x" character. In this mode mode, support for code points
+greater than 256 is provided by \eu, which must be followed by four hexadecimal
+digits; otherwise it matches a literal "u" character.
 .P
 Characters whose value is less than 256 can be defined by either of the two
-syntaxes for \ex (or by \eu in JavaScript mode). There is no difference in the
-way they are handled. For example, \exdc is exactly the same as \ex{dc} (or
-\eu00dc in JavaScript mode).
+syntaxes for \ex (or by \eu in PCRE2_ALT_BSUX mode). There is no difference in
+the way they are handled. For example, \exdc is exactly the same as \ex{dc} (or
+\eu00dc in PCRE2_ALT_BSUX mode).
 .
 .
 .SS "Constraints on character values"
@@ -459,20 +490,19 @@
 interpreted as the backspace character (hex 08).
 .P
 \eN is not allowed in a character class. \eB, \eR, and \eX are not special
-inside a character class. Like other unrecognized escape sequences, they are
-treated as the literal characters "B", "R", and "X" by default, but cause an
-error if the PCRE_EXTRA option is set. Outside a character class, these
-sequences have different meanings.
+inside a character class. Like other unrecognized alphabetic escape sequences,
+they cause an error. Outside a character class, these sequences have different
+meanings.
 .
 .
 .SS "Unsupported escape sequences"
 .rs
 .sp
 In Perl, the sequences \el, \eL, \eu, and \eU are recognized by its string
-handler and used to modify the case of following characters. By default, PCRE
-does not support these escape sequences. However, if the PCRE_JAVASCRIPT_COMPAT
-option is set, \eU matches a "U" character, and \eu can be used to define a
-character by code point, as described in the previous section.
+handler and used to modify the case of following characters. By default, PCRE2
+does not support these escape sequences. However, if the PCRE2_ALT_BSUX option
+is set, \eU matches a "U" character, and \eu can be used to define a character
+by code point, as described in the previous section.
 .
 .
 .SS "Absolute and relative back references"
@@ -534,8 +564,8 @@
 .\" </a>
 the "." metacharacter
 .\"
-when PCRE_DOTALL is not set. Perl also uses \eN to match characters by name;
-PCRE does not support this.
+when PCRE2_DOTALL is not set. Perl also uses \eN to match characters by name;
+PCRE2 does not support this.
 .P
 Each pair of lower and upper case escape sequences partitions the complete set
 of characters into two disjoint sets. Any given character matches one, and only
@@ -544,26 +574,23 @@
 matching point is at the end of the subject string, all of them fail, because
 there is no character to match.
 .P
-For compatibility with Perl, \es did not used to match the VT character (code
-11), which made it different from the the POSIX "space" class. However, Perl
-added VT at release 5.18, and PCRE followed suit at release 8.34. The default
-\es characters are now HT (9), LF (10), VT (11), FF (12), CR (13), and space
-(32), which are defined as white space in the "C" locale. This list may vary if
-locale-specific matching is taking place. For example, in some locales the
-"non-breaking space" character (\exA0) is recognized as white space, and in
+The default \es characters are HT (9), LF (10), VT (11), FF (12), CR (13), and
+space (32), which are defined as white space in the "C" locale. This list may
+vary if locale-specific matching is taking place. For example, in some locales
+the "non-breaking space" character (\exA0) is recognized as white space, and in
 others the VT character is not.
 .P
 A "word" character is an underscore or any character that is a letter or digit.
-By default, the definition of letters and digits is controlled by PCRE's
+By default, the definition of letters and digits is controlled by PCRE2's
 low-valued character tables, and may vary if locale-specific matching is taking
 place (see
-.\" HTML <a href="pcreapi.html#localesupport">
+.\" HTML <a href="pcre2api.html#localesupport">
 .\" </a>
 "Locale support"
 .\"
 in the
 .\" HREF
-\fBpcreapi\fP
+\fBpcre2api\fP
 .\"
 page). For example, in a French locale such as "fr_FR" in Unix-like systems,
 or "french" in Windows, some character codes greater than 127 are used for
@@ -571,13 +598,12 @@
 Unicode is discouraged.
 .P
 By default, characters whose code points are greater than 127 never match \ed,
-\es, or \ew, and always match \eD, \eS, and \eW, although this may vary for
-characters in the range 128-255 when locale-specific matching is happening.
+\es, or \ew, and always match \eD, \eS, and \eW, although this may be different
+for characters in the range 128-255 when locale-specific matching is happening.
 These escape sequences retain their original meanings from before Unicode
-support was available, mainly for efficiency reasons. If PCRE is compiled with
-Unicode property support, and the PCRE_UCP option is set, the behaviour is
-changed so that Unicode properties are used to determine character types, as
-follows:
+support was available, mainly for efficiency reasons. If the PCRE2_UCP option
+is set, the behaviour is changed so that Unicode properties are used to
+determine character types, as follows:
 .sp
   \ed  any character that matches \ep{Nd} (decimal digit)
   \es  any character that matches \ep{Z} or \eh or \ev
@@ -585,14 +611,13 @@
 .sp
 The upper case escapes match the inverse sets of characters. Note that \ed
 matches only decimal digits, whereas \ew matches any Unicode digit, as well as
-any Unicode letter, and underscore. Note also that PCRE_UCP affects \eb, and
+any Unicode letter, and underscore. Note also that PCRE2_UCP affects \eb, and
 \eB because they are defined in terms of \ew and \eW. Matching these sequences
-is noticeably slower when PCRE_UCP is set.
+is noticeably slower when PCRE2_UCP is set.
 .P
-The sequences \eh, \eH, \ev, and \eV are features that were added to Perl at
-release 5.10. In contrast to the other sequences, which match only ASCII
-characters by default, these always match certain high-valued code points,
-whether or not PCRE_UCP is set. The horizontal space characters are:
+The sequences \eh, \eH, \ev, and \eV, in contrast to the other sequences, which
+match only ASCII characters by default, always match a specific list of code
+points, whether or not PCRE2_UCP is set. The horizontal space characters are:
 .sp
   U+0009     Horizontal tab (HT)
   U+0020     Space
@@ -624,8 +649,8 @@
   U+2028     Line separator
   U+2029     Paragraph separator
 .sp
-In 8-bit, non-UTF-8 mode, only the characters with codepoints less than 256 are
-relevant.
+In 8-bit, non-UTF-8 mode, only the characters with code points less than 256
+are relevant.
 .
 .
 .\" HTML <a name="newlineseq"></a>
@@ -646,47 +671,44 @@
 This particular group matches either the two-character sequence CR followed by
 LF, or one of the single characters LF (linefeed, U+000A), VT (vertical tab,
 U+000B), FF (form feed, U+000C), CR (carriage return, U+000D), or NEL (next
-line, U+0085). The two-character sequence is treated as a single unit that
-cannot be split.
+line, U+0085). Because this is an atomic group, the two-character sequence is
+treated as a single unit that cannot be split.
 .P
 In other modes, two additional characters whose codepoints are greater than 255
 are added: LS (line separator, U+2028) and PS (paragraph separator, U+2029).
-Unicode character property support is not needed for these characters to be
-recognized.
+Unicode support is not needed for these characters to be recognized.
 .P
 It is possible to restrict \eR to match only CR, LF, or CRLF (instead of the
-complete set of Unicode line endings) by setting the option PCRE_BSR_ANYCRLF
-either at compile time or when the pattern is matched. (BSR is an abbrevation
-for "backslash R".) This can be made the default when PCRE is built; if this is
-the case, the other behaviour can be requested via the PCRE_BSR_UNICODE option.
-It is also possible to specify these settings by starting a pattern string with
-one of the following sequences:
+complete set of Unicode line endings) by setting the option PCRE2_BSR_ANYCRLF
+at compile time. (BSR is an abbrevation for "backslash R".) This can be made
+the default when PCRE2 is built; if this is the case, the other behaviour can
+be requested via the PCRE2_BSR_UNICODE option. It is also possible to specify
+these settings by starting a pattern string with one of the following
+sequences:
 .sp
   (*BSR_ANYCRLF)   CR, LF, or CRLF only
   (*BSR_UNICODE)   any Unicode newline sequence
 .sp
-These override the default and the options given to the compiling function, but
-they can themselves be overridden by options given to a matching function. Note
-that these special settings, which are not Perl-compatible, are recognized only
-at the very start of a pattern, and that they must be in upper case. If more
-than one of them is present, the last one is used. They can be combined with a
-change of newline convention; for example, a pattern can start with:
+These override the default and the options given to the compiling function.
+Note that these special settings, which are not Perl-compatible, are recognized
+only at the very start of a pattern, and that they must be in upper case. If
+more than one of them is present, the last one is used. They can be combined
+with a change of newline convention; for example, a pattern can start with:
 .sp
   (*ANY)(*BSR_ANYCRLF)
 .sp
-They can also be combined with the (*UTF8), (*UTF16), (*UTF32), (*UTF) or
-(*UCP) special sequences. Inside a character class, \eR is treated as an
-unrecognized escape sequence, and so matches the letter "R" by default, but
-causes an error if PCRE_EXTRA is set.
+They can also be combined with the (*UTF) or (*UCP) special sequences. Inside a
+character class, \eR is treated as an unrecognized escape sequence, and causes
+an error.
 .
 .
 .\" HTML <a name="uniextseq"></a>
 .SS Unicode character properties
 .rs
 .sp
-When PCRE is built with Unicode character property support, three additional
-escape sequences that match characters with specific properties are available.
-When in 8-bit non-UTF-8 mode, these sequences are of course limited to testing
+When PCRE2 is built with Unicode support (the default), three additional escape
+sequences that match characters with specific properties are available. In
+8-bit non-UTF-8 mode, these sequences are of course limited to testing
 characters whose codepoints are less than 256, but they do work in this mode.
 The extra escape sequences are:
 .sp
@@ -696,15 +718,15 @@
 .sp
 The property names represented by \fIxx\fP above are limited to the Unicode
 script names, the general category properties, "Any", which matches any
-character (including newline), and some special PCRE properties (described
+character (including newline), and some special PCRE2 properties (described
 in the
 .\" HTML <a href="#extraprops">
 .\" </a>
 next section).
 .\"
-Other Perl properties such as "InMusicalSymbols" are not currently supported by
-PCRE. Note that \eP{Any} does not match any characters, so always causes a
-match failure.
+Other Perl properties such as "InMusicalSymbols" are not supported by PCRE2.
+Note that \eP{Any} does not match any characters, so always causes a match
+failure.
 .P
 Sets of Unicode characters are defined as belonging to certain scripts. A
 character from one of these sets can be matched using a script name. For
@@ -716,6 +738,8 @@
 Those that are not part of an identified script are lumped together as
 "Common". The current list of scripts is:
 .P
+Ahom,
+Anatolian_Hieroglyphs,
 Arabic,
 Armenian,
 Avestan,
@@ -756,6 +780,7 @@
 Han,
 Hangul,
 Hanunoo,
+Hatran,
 Hebrew,
 Hiragana,
 Imperial_Aramaic,
@@ -792,12 +817,14 @@
 Modi,
 Mongolian,
 Mro,
+Multani,
 Myanmar,
 Nabataean,
 New_Tai_Lue,
 Nko,
 Ogham,
 Ol_Chiki,
+Old_Hungarian,
 Old_Italic,
 Old_North_Arabian,
 Old_Permic,
@@ -819,6 +846,7 @@
 Sharada,
 Shavian,
 Siddham,
+SignWriting,
 Sinhala,
 Sora_Sompeng,
 Sundanese,
@@ -907,16 +935,15 @@
 .P
 The Cs (Surrogate) property applies only to characters in the range U+D800 to
 U+DFFF. Such characters are not valid in Unicode strings and so
-cannot be tested by PCRE, unless UTF validity checking has been turned off
-(see the discussion of PCRE_NO_UTF8_CHECK, PCRE_NO_UTF16_CHECK and
-PCRE_NO_UTF32_CHECK in the
+cannot be tested by PCRE2, unless UTF validity checking has been turned off
+(see the discussion of PCRE2_NO_UTF_CHECK in the
 .\" HREF
-\fBpcreapi\fP
+\fBpcre2api\fP
 .\"
 page). Perl does not support the Cs property.
 .P
 The long synonyms for property names that Perl supports (such as \ep{Letter})
-are not supported by PCRE, nor is it permitted to prefix any of these
+are not supported by PCRE2, nor is it permitted to prefix any of these
 properties with "Is".
 .P
 No character that is in the Unicode table has the Cn (unassigned) property.
@@ -927,11 +954,11 @@
 example, \ep{Lu} always matches only upper case letters. This is different from
 the behaviour of current versions of Perl.
 .P
-Matching characters by Unicode property is not fast, because PCRE has to do a
+Matching characters by Unicode property is not fast, because PCRE2 has to do a
 multistage table lookup in order to find a character's property. That is why
 the traditional escape sequences such as \ed and \ew do not use Unicode
-properties in PCRE by default, though you can make them do so by setting the
-PCRE_UCP option or by starting the pattern with (*UCP).
+properties in PCRE2 by default, though you can make them do so by setting the
+PCRE2_UCP option or by starting the pattern with (*UCP).
 .
 .
 .SS Extended grapheme clusters
@@ -943,23 +970,11 @@
 .\" </a>
 (see below).
 .\"
-Up to and including release 8.31, PCRE matched an earlier, simpler definition
-that was equivalent to
-.sp
-  (?>\ePM\epM*)
-.sp
-That is, it matched a character without the "mark" property, followed by zero
-or more characters with the "mark" property. Characters with the "mark"
-property are typically non-spacing accents that affect the preceding character.
-.P
-This simple definition was extended in Unicode to include more complicated
-kinds of composite character by giving each character a grapheme breaking
-property, and creating rules that use these properties to define the boundaries
-of extended grapheme clusters. In releases of PCRE later than 8.31, \eX matches
-one of these clusters.
-.P
-\eX always matches at least one character. Then it decides whether to add
-additional characters according to the following rules for ending a cluster:
+Unicode supports various kinds of composite character by giving each character
+a grapheme breaking property, and having rules that use these properties to
+define the boundaries of extended grapheme clusters. \eX always matches at
+least one character. Then it decides whether to add additional characters
+according to the following rules for ending a cluster:
 .P
 1. End at the end of the subject string.
 .P
@@ -979,13 +994,13 @@
 .
 .
 .\" HTML <a name="extraprops"></a>
-.SS PCRE's additional properties
+.SS PCRE2's additional properties
 .rs
 .sp
-As well as the standard Unicode properties described above, PCRE supports four
+As well as the standard Unicode properties described above, PCRE2 supports four
 more that make it possible to convert traditional escape sequences such as \ew
-and \es to use Unicode properties. PCRE uses these non-standard, non-Perl
-properties internally when PCRE_UCP is set. However, they may also be used
+and \es to use Unicode properties. PCRE2 uses these non-standard, non-Perl
+properties internally when PCRE2_UCP is set. However, they may also be used
 explicitly. These properties are:
 .sp
   Xan   Any alphanumeric character
@@ -996,9 +1011,9 @@
 Xan matches characters that have either the L (letter) or the N (number)
 property. Xps matches the characters tab, linefeed, vertical tab, form feed, or
 carriage return, and any other character that has the Z (separator) property.
-Xsp is the same as Xps; it used to exclude vertical tab, for Perl
-compatibility, but Perl changed, and so PCRE followed at release 8.34. Xwd
-matches the same characters as Xan, plus underscore.
+Xsp is the same as Xps; in PCRE1 it used to exclude vertical tab, for Perl
+compatibility, but Perl changed. Xwd matches the same characters as Xan, plus
+underscore.
 .P
 There is another non-standard property, Xuc, which matches any character that
 can be represented by a Universal Character Name in C++ and other programming
@@ -1039,7 +1054,7 @@
 matches "foobar", the first substring is still set to "foo".
 .P
 Perl documents that the use of \eK within assertions is "not well defined". In
-PCRE, \eK is acted upon when it occurs inside positive assertions, but is
+PCRE2, \eK is acted upon when it occurs inside positive assertions, but is
 ignored in negative assertions. Note that when a pattern such as (?=ab\eK)
 matches, the reported start of the match can be greater than the end of the
 match.
@@ -1068,17 +1083,15 @@
   \eG     matches at the first matching position in the subject
 .sp
 Inside a character class, \eb has a different meaning; it matches the backspace
-character. If any other of these assertions appears in a character class, by
-default it matches the corresponding literal character (for example, \eB
-matches the letter B). However, if the PCRE_EXTRA option is set, an "invalid
-escape sequence" error is generated instead.
+character. If any other of these assertions appears in a character class, an
+"invalid escape sequence" error is generated.
 .P
 A word boundary is a position in the subject string where the current character
 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. In a UTF mode, the meanings
-of \ew and \eW can be changed by setting the PCRE_UCP option. When this is
-done, it also affects \eb and \eB. Neither PCRE nor Perl has a separate "start
+of \ew and \eW can be changed by setting the PCRE2_UCP option. When this is
+done, it also affects \eb and \eB. Neither PCRE2 nor Perl has a separate "start
 of word" or "end of word" metasequence. However, whatever follows \eb normally
 determines which it is. For example, the fragment \eba matches "a" at the start
 of a word.
@@ -1087,24 +1100,25 @@
 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
+PCRE2_NOTBOL or PCRE2_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 at the end
-of the string as well as at the very end, whereas \ez matches only at the end.
+argument of \fBpcre2_match()\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 at the
+end of the string as well as at the very end, 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
+\fBpcre2_match()\fP. It differs from \eA when the value of \fIstartoffset\fP is
+non-zero. By calling \fBpcre2_match()\fP multiple times with appropriate
 arguments, you can mimic Perl's /g option, and it is in this kind of
 implementation where \eG can be useful.
 .P
-Note, however, that PCRE's interpretation of \eG, as the start of the current
+Note, however, that PCRE2'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
+string was empty. Because PCRE2 does just one match at a time, it cannot
 reproduce this behaviour.
 .P
 If all the alternatives of a pattern begin with \eG, the expression is anchored
@@ -1117,14 +1131,18 @@
 .sp
 The circumflex and dollar metacharacters are zero-width assertions. That is,
 they test for a particular condition being true without consuming any
-characters from the subject string.
+characters from the subject string. These two metacharacters are concerned with
+matching the starts and ends of lines. If the newline convention is set so that
+only the two-character sequence CRLF is recognized as a newline, isolated CR
+and LF characters are treated as ordinary data characters, and are not
+recognized as newlines.
 .P
 Outside a character class, in the default matching mode, the circumflex
 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
+\fBpcre2_match()\fP is non-zero, or if PCRE2_NOTBOL is set, circumflex can
+never match if the PCRE2_MULTILINE option is unset. Inside a character class,
+circumflex has an entirely different meaning
 .\" HTML <a href="#characterclass">
 .\" </a>
 (see below).
@@ -1140,33 +1158,46 @@
 .P
 The 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 at
-the end of the string (by default). Note, however, that it does not actually
-match the newline. 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.
+the end of the string (by default), unless PCRE2_NOTEOL is set. Note, however,
+that it does not actually match the newline. 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
+the string, by setting the PCRE2_DOLLAR_ENDONLY option at compile time. This
 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, a circumflex matches
-immediately after internal newlines as well as at the start of the subject
-string. It does not match after a newline that ends the string. A dollar
-matches before any newlines in the string, as well as at the very end, when
-PCRE_MULTILINE is set. When newline is specified as the two-character
-sequence CRLF, isolated CR and LF characters do not indicate newlines.
+The meanings of the circumflex and dollar metacharacters are changed if the
+PCRE2_MULTILINE option is set. When this is the case, a dollar character
+matches before any newlines in the string, as well as at the very end, and a
+circumflex matches immediately after internal newlines as well as at the start
+of the subject string. It does not match after a newline that ends the string,
+for compatibility with Perl. However, this can be changed by setting the
+PCRE2_ALT_CIRCUMFLEX option.
 .P
 For example, the pattern /^abc$/ matches the subject string "def\enabc" (where
 \en represents a newline) 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.
+when the \fIstartoffset\fP argument of \fBpcre2_match()\fP is non-zero. The
+PCRE2_DOLLAR_ENDONLY option is ignored if PCRE2_MULTILINE is set.
+.P
+When the newline convention (see
+.\" HTML <a href="#newlines">
+.\" </a>
+"Newline conventions"
+.\"
+below) recognizes the two-character sequence CRLF as a newline, this is
+preferred, even if the single characters CR and LF are also recognized as
+newlines. For example, if the newline convention is "any", a multiline mode
+circumflex matches before "xyz" in the string "abc\er\enxyz" rather than after
+CR, even though CR on its own is a valid newline. (It also matches at the very
+start of the string, of course.)
 .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
-\eA it is always anchored, whether or not PCRE_MULTILINE is set.
+\eA it is always anchored, whether or not PCRE2_MULTILINE is set.
 .
 .
 .\" HTML <a name="fullstopdot"></a>
@@ -1184,57 +1215,65 @@
 recognized, dot does not match CR or LF or any of the other line ending
 characters.
 .P
-The behaviour of dot with regard to newlines can be changed. If the PCRE_DOTALL
-option is set, a dot matches any one character, without exception. If the
-two-character sequence CRLF is present in the subject string, it takes two dots
-to match it.
+The behaviour of dot with regard to newlines can be changed. If the
+PCRE2_DOTALL option is set, a dot matches any one character, without exception.
+If the two-character sequence CRLF is present in the subject string, it takes
+two dots to match it.
 .P
 The handling of dot is entirely independent of the handling of circumflex and
 dollar, the only relationship being that they both involve newlines. Dot has no
 special meaning in a character class.
 .P
 The escape sequence \eN behaves like a dot, except that it is not affected by
-the PCRE_DOTALL option. In other words, it matches any character except one
+the PCRE2_DOTALL option. In other words, it matches any character except one
 that signifies the end of a line. Perl also uses \eN to match characters by
-name; PCRE does not support this.
+name; PCRE2 does not support this.
 .
 .
-.SH "MATCHING A SINGLE DATA UNIT"
+.SH "MATCHING A SINGLE CODE UNIT"
 .rs
 .sp
-Outside a character class, the escape sequence \eC matches any one data unit,
-whether or not a UTF mode is set. In the 8-bit library, one data unit is one
-byte; in the 16-bit library it is a 16-bit unit; in the 32-bit library it is
-a 32-bit unit. Unlike a dot, \eC always
-matches line-ending characters. The feature is provided in Perl in order to
-match individual bytes in UTF-8 mode, but it is unclear how it can usefully be
-used. Because \eC breaks up characters into individual data units, matching one
-unit with \eC in a UTF mode means that the rest of the string may start with a
-malformed UTF character. This has undefined results, because PCRE assumes that
-it is dealing with valid UTF strings (and by default it checks this at the
-start of processing unless the PCRE_NO_UTF8_CHECK, PCRE_NO_UTF16_CHECK or
-PCRE_NO_UTF32_CHECK option is used).
+Outside a character class, the escape sequence \eC matches any one code unit,
+whether or not a UTF mode is set. In the 8-bit library, one code unit is one
+byte; in the 16-bit library it is a 16-bit unit; in the 32-bit library it is a
+32-bit unit. Unlike a dot, \eC always matches line-ending characters. The
+feature is provided in Perl in order to match individual bytes in UTF-8 mode,
+but it is unclear how it can usefully be used.
 .P
-PCRE does not allow \eC to appear in lookbehind assertions
+Because \eC breaks up characters into individual code units, matching one unit
+with \eC in UTF-8 or UTF-16 mode means that the rest of the string may start
+with a malformed UTF character. This has undefined results, because PCRE2
+assumes that it is matching character by character in a valid UTF string (by
+default it checks the subject string's validity at the start of processing
+unless the PCRE2_NO_UTF_CHECK option is used).
+.P
+An application can lock out the use of \eC by setting the
+PCRE2_NEVER_BACKSLASH_C option when compiling a pattern. It is also possible to
+build PCRE2 with the use of \eC permanently disabled.
+.P
+PCRE2 does not allow \eC to appear in lookbehind assertions
 .\" HTML <a href="#lookbehind">
 .\" </a>
 (described below)
 .\"
 in a UTF mode, because this would make it impossible to calculate the length of
-the lookbehind.
+the lookbehind. Neither the alternative matching function
+\fBpcre2_dfa_match()\fP not the JIT optimizer support \eC in a UTF mode. The
+former gives a match-time error; the latter fails to optimize and so the match
+is always run using the interpreter.
 .P
-In general, the \eC escape sequence is best avoided. However, one
-way of using it that avoids the problem of malformed UTF characters is to use a
-lookahead to check the length of the next character, as in this pattern, which
-could be used with a UTF-8 string (ignore white space and line breaks):
+In general, the \eC escape sequence is best avoided. However, one way of using
+it that avoids the problem of malformed UTF characters is to use a lookahead to
+check the length of the next character, as in this pattern, which could be used
+with a UTF-8 string (ignore white space and line breaks):
 .sp
   (?| (?=[\ex00-\ex7f])(\eC) |
       (?=[\ex80-\ex{7ff}])(\eC)(\eC) |
       (?=[\ex{800}-\ex{ffff}])(\eC)(\eC)(\eC) |
       (?=[\ex{10000}-\ex{1fffff}])(\eC)(\eC)(\eC)(\eC))
 .sp
-A group that starts with (?| resets the capturing parentheses numbers in each
-alternative (see
+In this example, a group that starts with (?| resets the capturing parentheses
+numbers in each alternative (see
 .\" HTML <a href="#dupsubpatternnumber">
 .\" </a>
 "Duplicate Subpattern Numbers"
@@ -1242,7 +1281,7 @@
 below). The assertions at the start of each branch check the next UTF-8
 character for values whose encoding uses 1, 2, 3, or 4 bytes, respectively. The
 character's individual bytes are then captured by the appropriate number of
-groups.
+\eC groups.
 .
 .
 .\" HTML <a name="characterclass"></a>
@@ -1251,18 +1290,18 @@
 .sp
 An opening square bracket introduces a character class, terminated by a closing
 square bracket. A closing square bracket on its own is not special by default.
-However, if the PCRE_JAVASCRIPT_COMPAT option is set, a lone closing square
-bracket causes a compile-time error. If a 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.
+If a 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. This means that, by default, an empty class cannot
+be defined. However, if the PCRE2_ALLOW_EMPTY_CLASS option is set, a closing
+square bracket at the start does end the (empty) class.
 .P
-A character class matches a single character in the subject. In a UTF mode, the
-character may be more than one data unit long. A matched character must be in
-the set of characters defined by the class, unless the first character in the
-class definition is a circumflex, in which case the subject character must not
-be in 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.
+A character class matches a single character in the subject. A matched
+character must be in the set of characters defined by the class, unless the
+first character in the class definition is a circumflex, in which case the
+subject character must not be in 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
@@ -1272,25 +1311,15 @@
 string, and therefore it fails if the current pointer is at the end of the
 string.
 .P
-In UTF-8 (UTF-16, UTF-32) mode, characters with values greater than 255 (0xffff)
-can be included in a class as a literal string of data units, 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. In a UTF 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 in a UTF mode for characters 128 and
-above, you must ensure that PCRE is compiled with Unicode property support as
-well as with UTF support.
+caseful version would.
 .P
 Characters that might indicate line breaks are never treated in any special way
 when matching character classes, whatever line-ending sequence is in use, and
-whatever setting of the PCRE_DOTALL and PCRE_MULTILINE options is used. A class
-such as [^a] always matches one of these characters.
+whatever setting of the PCRE2_DOTALL and PCRE2_MULTILINE options is used. A
+class such as [^a] always matches one of these characters.
 .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,
@@ -1313,22 +1342,29 @@
 where a range ending character is expected. For example, [z-\exff] is valid,
 but [A-\ed] and [A-[:digit:]] are not.
 .P
-Ranges operate in the collating sequence of character values. They can also be
-used for characters specified numerically, for example [\e000-\e037]. Ranges
-can include any characters that are valid for the current mode.
+Ranges normally include all code points between the start and end characters,
+inclusive. They can also be used for code points specified numerically, for
+example [\e000-\e037]. Ranges can include any characters that are valid for the
+current mode.
+.P
+There is a special case in EBCDIC environments for ranges whose end points are
+both specified as literal letters in the same case. For compatibility with
+Perl, EBCDIC code points within the range that are not letters are omitted. For
+example, [h-k] matches only four characters, even though the codes for h and k
+are 0x88 and 0x92, a range of 11 code points. However, if the range is
+specified numerically, for example, [\ex88-\ex92] or [h-\ex92], all code points
+are included.
 .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
 [][\e\e^_`wxyzabc], matched caselessly, and in a non-UTF mode, if character
 tables for a French locale are in use, [\exc8-\excb] matches accented E
-characters in both cases. In UTF modes, PCRE supports the concept of case for
-characters with values greater than 128 only when it is compiled with Unicode
-property support.
+characters in both cases.
 .P
 The character escape sequences \ed, \eD, \eh, \eH, \ep, \eP, \es, \eS, \ev,
 \eV, \ew, and \eW may appear in a character class, and add the characters that
 they match to the class. For example, [\edABCDEF] matches any hexadecimal
-digit. In UTF modes, the PCRE_UCP option affects the meanings of \ed, \es, \ew
+digit. In UTF modes, the PCRE2_UCP option affects the meanings of \ed, \es, \ew
 and their upper case partners, just as it does when they appear outside a
 character class, as described in the section entitled
 .\" HTML <a href="#genericchartypes">
@@ -1338,8 +1374,7 @@
 above. The escape sequence \eb has a different meaning inside a character
 class; it matches the backspace character. The sequences \eB, \eN, \eR, and \eX
 are not special inside a character class. Like any other unrecognized escape
-sequences, they are treated as the literal characters "B", "N", "R", and "X" by
-default, but cause an error if the PCRE_EXTRA option is set.
+sequences, they cause an error.
 .P
 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.
@@ -1360,7 +1395,7 @@
 .rs
 .sp
 Perl supports the POSIX notation for character classes. This uses names
-enclosed by [: and :] within the enclosing square brackets. PCRE also supports
+enclosed by [: and :] within the enclosing square brackets. PCRE2 also supports
 this notation. For example,
 .sp
   [01[:alpha:]%]
@@ -1378,17 +1413,15 @@
   lower    lower case letters
   print    printing characters, including space
   punct    printing characters, excluding letters and digits and space
-  space    white space (the same as \es from PCRE 8.34)
+  space    white space (the same as \es from PCRE2 8.34)
   upper    upper case letters
   word     "word" characters (same as \ew)
   xdigit   hexadecimal digits
 .sp
 The default "space" characters are HT (9), LF (10), VT (11), FF (12), CR (13),
 and space (32). If locale-specific matching is taking place, the list of space
-characters may be different; there may be fewer or more of them. "Space" used
-to be different to \es, which did not include VT, for Perl compatibility.
-However, Perl changed at release 5.18, and PCRE followed at release 8.34.
-"Space" and \es now match the same set of characters.
+characters may be different; there may be fewer or more of them. "Space" and
+\es match the same set of characters.
 .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
@@ -1396,19 +1429,21 @@
 .sp
   [12[:^digit:]]
 .sp
-matches "1", "2", or any non-digit. PCRE (and Perl) also recognize the POSIX
+matches "1", "2", or any non-digit. PCRE2 (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.
 .P
-By default, characters with values greater than 128 do not match any of the
-POSIX character classes. However, if the PCRE_UCP option is passed to
-\fBpcre_compile()\fP, some of the classes are changed so that Unicode character
-properties are used. This is achieved by replacing certain POSIX classes by
-other sequences, as follows:
+By default, characters with values greater than 127 do not match any of the
+POSIX character classes, although this may be different for characters in the
+range 128-255 when locale-specific matching is happening. However, if the
+PCRE2_UCP option is passed to \fBpcre2_compile()\fP, some of the classes are
+changed so that Unicode character properties are used. This is achieved by
+replacing certain POSIX classes with other sequences, as follows:
 .sp
   [:alnum:]  becomes  \ep{Xan}
   [:alpha:]  becomes  \ep{L}
   [:blank:]  becomes  \eh
+  [:cntrl:]  becomes  \ep{Cc}
   [:digit:]  becomes  \ep{Nd}
   [:lower:]  becomes  \ep{Ll}
   [:space:]  becomes  \ep{Xps}
@@ -1434,11 +1469,11 @@
 .TP 10
 [:punct:]
 This matches all characters that have the Unicode P (punctuation) property,
-plus those characters whose code points are less than 128 that have the S
-(Symbol) property.
+plus those characters with code points less than 256 that have the S (Symbol)
+property.
 .P
 The other POSIX classes are unchanged, and match only characters with code
-points less than 128.
+points less than 256.
 .
 .
 .SH "COMPATIBILITY FEATURE FOR WORD BOUNDARIES"
@@ -1446,7 +1481,7 @@
 .sp
 In the POSIX.2 compliant library that was included in 4.4BSD Unix, the ugly
 syntax [[:<:]] and [[:>:]] is used for matching "start of word" and "end of
-word". PCRE treats these items as follows:
+word". PCRE2 treats these items as follows:
 .sp
   [[:<:]]  is converted to  \eb(?=\ew)
   [[:>:]]  is converted to  \eb(?<=\ew)
@@ -1488,39 +1523,40 @@
 .SH "INTERNAL OPTION SETTING"
 .rs
 .sp
-The settings of the PCRE_CASELESS, PCRE_MULTILINE, PCRE_DOTALL, and
-PCRE_EXTENDED options (which are Perl-compatible) can be changed from within
+The settings of the PCRE2_CASELESS, PCRE2_MULTILINE, PCRE2_DOTALL, and
+PCRE2_EXTENDED options (which are Perl-compatible) 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
+  i  for PCRE2_CASELESS
+  m  for PCRE2_MULTILINE
+  s  for PCRE2_DOTALL
+  x  for PCRE2_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
+setting and unsetting such as (?im-sx), which sets PCRE2_CASELESS and
+PCRE2_MULTILINE while unsetting PCRE2_DOTALL and PCRE2_EXTENDED, is also
 permitted. If a letter appears both before and after the hyphen, the option is
-unset.
+unset. An empty options setting "(?)" is allowed. Needless to say, it has no
+effect.
 .P
-The PCRE-specific options PCRE_DUPNAMES, PCRE_UNGREEDY, and PCRE_EXTRA can be
-changed in the same way as the Perl-compatible options by using the characters
-J, U and X respectively.
+The PCRE2-specific options PCRE2_DUPNAMES and PCRE2_UNGREEDY can be changed in
+the same way as the Perl-compatible options by using the characters J and U
+respectively.
 .P
 When one of these option changes 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
+that follows. If the change is placed right at the start of a pattern, PCRE2
 extracts it into the global options (and it will therefore show up in data
-extracted by the \fBpcre_fullinfo()\fP function).
+extracted by the \fBpcre2_pattern_info()\fP function).
 .P
 An option change within a subpattern (see below for a description of
 subpatterns) affects only that part of the subpattern that follows it, so
 .sp
   (a(?i)b)c
 .sp
-matches abc and aBc and no other strings (assuming PCRE_CASELESS is not used).
+matches abc and aBc and no other strings (assuming PCRE2_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,
@@ -1532,21 +1568,28 @@
 option settings happen at compile time. There would be some very weird
 behaviour otherwise.
 .P
-\fBNote:\fP There are other PCRE-specific options that can be set by the
-application when the compiling or matching functions are called. In some cases
-the pattern can contain special leading sequences such as (*CRLF) to override
-what the application has set or what has been defaulted. Details are given in
-the section entitled
+As a convenient shorthand, if any option settings are required at the start of
+a non-capturing subpattern (see the next section), 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.
+.P
+\fBNote:\fP There are other PCRE2-specific options that can be set by the
+application when the compiling function is called. The pattern can contain
+special leading sequences such as (*CRLF) to override what the application has
+set or what has been defaulted. Details are given in the section entitled
 .\" HTML <a href="#newlineseq">
 .\" </a>
 "Newline sequences"
 .\"
-above. There are also the (*UTF8), (*UTF16),(*UTF32), and (*UCP) leading
-sequences that can be used to set UTF and Unicode property modes; they are
-equivalent to setting the PCRE_UTF8, PCRE_UTF16, PCRE_UTF32 and the PCRE_UCP
-options, respectively. The (*UTF) sequence is a generic version that can be
-used with any of the libraries. However, the application can set the
-PCRE_NEVER_UTF option, which locks out the use of the (*UTF) sequences.
+above. There are also the (*UTF) and (*UCP) leading sequences that can be used
+to set UTF and Unicode property modes; they are equivalent to setting the
+PCRE2_UTF and PCRE2_UCP options, respectively. However, the application can set
+the PCRE2_NEVER_UTF and PCRE2_NEVER_UCP options, which lock out the use of the
+(*UTF) and (*UCP) sequences.
 .
 .
 .\" HTML <a name="subpattern"></a>
@@ -1564,10 +1607,10 @@
 match "cataract", "erpillar" or an empty string.
 .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 the
-matching function. (This applies only to the traditional matching functions;
-the DFA matching functions do not support capturing.)
+the whole pattern matches, the portion of the subject string that matched the
+subpattern is passed back to the caller, separately from the portion that
+matched the whole pattern. (This applies only to the traditional matching
+function; the DFA matching function does not support capturing.)
 .P
 Opening parentheses are counted from left to right (starting from 1) to obtain
 numbers for the capturing subpatterns. For example, if the string "the red
@@ -1640,6 +1683,9 @@
 .sp
   /(?|(abc)|(def))(?1)/
 .sp
+A relative reference such as (?-1) is no different: it is just a convenient way
+of computing an absolute group number.
+.P
 If a
 .\" HTML <a href="#conditions">
 .\" </a>
@@ -1658,13 +1704,13 @@
 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 this
-difficulty, PCRE supports the naming of subpatterns. This feature was not
-added to Perl until release 5.10. Python had the feature earlier, and PCRE
-introduced it at release 4.0, using the Python syntax. PCRE now supports both
-the Perl and the Python syntax. Perl allows identically numbered subpatterns to
-have different names, but PCRE does not.
+difficulty, PCRE2 supports the naming of subpatterns. This feature was not
+added to Perl until release 5.10. Python had the feature earlier, and PCRE1
+introduced it at release 4.0, using the Python syntax. PCRE2 supports both the
+Perl and the Python syntax. Perl allows identically numbered subpatterns to
+have different names, but PCRE2 does not.
 .P
-In PCRE, a subpattern can be named in one of three ways: (?<name>...) or
+In PCRE2, a subpattern can be named in one of three ways: (?<name>...) or
 (?'name'...) as in Perl, or (?P<name>...) as in Python. References to capturing
 parentheses from other parts of the pattern, such as
 .\" HTML <a href="#backreferences">
@@ -1684,19 +1730,19 @@
 .P
 Names consist of up to 32 alphanumeric characters and underscores, but must
 start with a non-digit. Named capturing parentheses are still allocated numbers
-as well as names, exactly as if the names were not present. The PCRE API
+as well as names, exactly as if the names were not present. The PCRE2 API
 provides function calls for extracting the name-to-number translation table
-from a compiled pattern. There is also a convenience function for extracting a
+from a compiled pattern. There are also convenience functions for extracting a
 captured substring by name.
 .P
 By default, a name must be unique within a pattern, but it is possible to relax
-this constraint by setting the PCRE_DUPNAMES option at compile time. (Duplicate
-names are also always permitted for subpatterns with the same number, set up as
-described in the previous section.) Duplicate names can be useful for patterns
-where only one instance of the named parentheses can match. Suppose you want to
-match the name of a weekday, either as a 3-letter abbreviation or as the full
-name, and in both cases you want to extract the abbreviation. This pattern
-(ignoring the line breaks) does the job:
+this constraint by setting the PCRE2_DUPNAMES option at compile time.
+(Duplicate names are also always permitted for subpatterns with the same
+number, set up as described in the previous section.) Duplicate names can be
+useful for patterns where only one instance of the named parentheses can match.
+Suppose you want to match the name of a weekday, either as a 3-letter
+abbreviation or as the full name, and in both cases you want to extract the
+abbreviation. This pattern (ignoring the line breaks) does the job:
 .sp
   (?<DN>Mon|Fri|Sun)(?:day)?|
   (?<DN>Tue)(?:sday)?|
@@ -1708,7 +1754,7 @@
 (An alternative way of solving this problem is to use a "branch reset"
 subpattern, as described in the previous section.)
 .P
-The convenience function for extracting the data by name returns the substring
+The convenience functions for extracting the data by name returns the substring
 for the first (and in this example, the only) subpattern of that name that
 matched. This saves searching to find which numbered subpattern it was.
 .P
@@ -1739,15 +1785,15 @@
 behaviour as testing by number. For further details of the interfaces for
 handling named subpatterns, see the
 .\" HREF
-\fBpcreapi\fP
+\fBpcre2api\fP
 .\"
 documentation.
 .P
 \fBWarning:\fP You cannot use different names to distinguish between two
-subpatterns with the same number because PCRE uses only the numbers when
+subpatterns with the same number because PCRE2 uses only the numbers when
 matching. For this reason, an error is given at compile time if different names
 are given to subpatterns with the same number. However, you can always give the
-same name to subpatterns with the same number, even when PCRE_DUPNAMES is not
+same name to subpatterns with the same number, even when PCRE2_DUPNAMES is not
 set.
 .
 .
@@ -1764,8 +1810,8 @@
   the \eR escape sequence
   an escape such as \ed or \epL that matches a single character
   a character class
-  a back reference (see next section)
-  a parenthesized subpattern (including assertions)
+  a back reference
+  a parenthesized subpattern (including most assertions)
   a subroutine call to a subpattern (recursive or otherwise)
 .sp
 The general repetition quantifier specifies a minimum and maximum number of
@@ -1782,7 +1828,7 @@
 .sp
   [aeiou]{3,}
 .sp
-matches at least 3 successive vowels, but may match many more, while
+matches at least 3 successive vowels, but may match many more, whereas
 .sp
   \ed{8}
 .sp
@@ -1791,11 +1837,11 @@
 quantifier, is taken as a literal character. For example, {,6} is not a
 quantifier, but a literal string of four characters.
 .P
-In UTF modes, quantifiers apply to characters rather than to individual data
+In UTF modes, quantifiers apply to characters rather than to individual code
 units. Thus, for example, \ex{100}{2} matches two characters, each of
 which is represented by a two-byte sequence in a UTF-8 string. Similarly,
 \eX{3} matches three Unicode extended grapheme clusters, each of which may be
-several data units long (and they may be of different lengths).
+several code units 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. This may be useful for
@@ -1824,7 +1870,7 @@
 .sp
   (a?)*
 .sp
-Earlier versions of Perl and PCRE used to give an error at compile time for
+Earlier versions of Perl and PCRE1 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.
@@ -1845,9 +1891,8 @@
 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
+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
@@ -1861,7 +1906,7 @@
 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 that is not available in Perl),
+If the PCRE2_UNGREEDY option is set (an option that 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.
@@ -1870,16 +1915,16 @@
 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
+If a pattern starts with .* or .{0,} and the PCRE2_DOTALL option (equivalent
 to Perl's /s) is set, thus allowing the dot 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
+overall match at any position after the first. PCRE2 normally treats such 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.
+worth setting PCRE2_DOTALL in order to obtain this optimization, or
+alternatively, using ^ to indicate anchoring explicitly.
 .P
 However, there are some cases where the optimization cannot be used. When .*
 is inside capturing parentheses that are the subject of a back reference
@@ -1898,7 +1943,8 @@
   (?>.*?a)b
 .sp
 It matches "ab" in the subject "aab". The use of the backtracking control verbs
-(*PRUNE) and (*SKIP) also disable this optimization.
+(*PRUNE) and (*SKIP) also disable this optimization, and there is an option,
+PCRE2_NO_DOTSTAR_ANCHOR, to do so explicitly.
 .P
 When a capturing subpattern is repeated, the value captured is the substring
 that matched the final iteration. For example, after
@@ -1910,7 +1956,7 @@
 corresponding captured values may have been set in previous iterations. For
 example, after
 .sp
-  /(a|(b))+/
+  (a|(b))+
 .sp
 matches "aba" the value of the second captured substring is "b".
 .
@@ -1947,9 +1993,9 @@
 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.
+An alternative description is that a subpattern of this type matches exactly
+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
@@ -1971,7 +2017,7 @@
 .sp
   (abc|xyz){2,3}+
 .sp
-Possessive quantifiers are always greedy; the setting of the PCRE_UNGREEDY
+Possessive quantifiers are always greedy; the setting of the PCRE2_UNGREEDY
 option is ignored. They are a convenient notation for the simpler forms of
 atomic group. However, there is no difference in the meaning of a possessive
 quantifier and the equivalent atomic group, though there may be a performance
@@ -1980,12 +2026,14 @@
 The possessive quantifier syntax is an extension to the Perl 5.8 syntax.
 Jeffrey Friedl originated the idea (and the name) in the first edition of his
 book. Mike McCloskey liked it, so implemented it when he built Sun's Java
-package, and PCRE copied it from there. It ultimately found its way into Perl
+package, and PCRE1 copied it from there. It ultimately found its way into Perl
 at release 5.10.
 .P
-PCRE has an optimization that automatically "possessifies" certain simple
+PCRE2 has an optimization that automatically "possessifies" certain simple
 pattern constructs. For example, the sequence A+B is treated as A++B because
 there is no point in backtracking into a sequence of A's when B must follow.
+This feature can be disabled by the PCRE2_NO_AUTOPOSSESS option, or starting
+the pattern with (*NO_AUTO_POSSESS).
 .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
@@ -2003,7 +2051,7 @@
 it takes a long time before reporting failure. This is because the string can
 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
+than a single character at the end, because both PCRE2 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
@@ -2023,16 +2071,16 @@
 (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
+However, if the decimal number following the backslash is less than 8, 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. A "forward back reference" of this type can make sense
+numbers less than 8. A "forward back reference" of this type can make sense
 when a repetition is involved and the subpattern to the right has participated
 in an earlier iteration.
 .P
 It is not possible to have a numerical "forward back reference" to a subpattern
-whose number is 10 or more using this syntax because a sequence such as \e50 is
+whose number is 8 or more using this syntax because a sequence such as \e50 is
 interpreted as a character defined in octal. See the subsection entitled
 "Non-printing characters"
 .\" HTML <a href="#digitsafterbackslash">
@@ -2107,13 +2155,13 @@
   (a|(bc))\e2
 .sp
 always fails if it starts to match "a" rather than "bc". However, if the
-PCRE_JAVASCRIPT_COMPAT option is set at compile time, a back reference to an
+PCRE2_MATCH_UNSET_BACKREF option is set at compile time, a back reference to an
 unset value matches an empty string.
 .P
 Because there may be many capturing parentheses in a pattern, all digits
 following a 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
+terminate the back reference. If the PCRE2_EXTENDED option is set, this can be
 white space. Otherwise, the \eg{ syntax or an empty comment (see
 .\" HTML <a href="#comments">
 .\" </a>
@@ -2121,6 +2169,7 @@
 .\"
 below) can be used.
 .
+.
 .SS "Recursive back references"
 .rs
 .sp
@@ -2153,8 +2202,8 @@
 .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 \eb, \eB, \eA, \eG, \eZ, \ez, ^ and $ are described
+matching point that does not consume any characters. The simple assertions
+coded as \eb, \eB, \eA, \eG, \eZ, \ez, ^ and $ are described
 .\" HTML <a href="#smallassertions">
 .\" </a>
 above.
@@ -2171,10 +2220,11 @@
 capturing is carried out only for positive assertions. (Perl sometimes, but not
 always, does do capturing in negative assertions.)
 .P
-For compatibility with Perl, assertion subpatterns may be repeated; though
+For compatibility with Perl, most assertion subpatterns may be repeated; though
 it makes no sense to assert the same thing several times, the side effect of
-capturing parentheses may occasionally be useful. In practice, there only three
-cases:
+capturing parentheses may occasionally be useful. However, an assertion that
+forms the condition for a conditional subpattern may not be quantified. In
+practice, for other assertions, there only three cases:
 .sp
 (1) If the quantifier is {0}, the assertion is never obeyed during matching.
 However, it may contain internal capturing parenthesized groups that are called
@@ -2249,7 +2299,7 @@
   (?<=ab(c|de))
 .sp
 is not permitted, because its single top-level branch can match two different
-lengths, but it is acceptable to PCRE if rewritten to use two top-level
+lengths, but it is acceptable to PCRE2 if rewritten to use two top-level
 branches:
 .sp
   (?<=abc|abde)
@@ -2267,10 +2317,10 @@
 match. If there are insufficient characters before the current position, the
 assertion fails.
 .P
-In a UTF mode, PCRE does not allow the \eC escape (which matches a single data
+In a UTF mode, PCRE2 does not allow the \eC escape (which matches a single code
 unit even in a UTF mode) to appear in lookbehind assertions, because it makes
 it impossible to calculate the length of the lookbehind. The \eX and \eR
-escapes, which can match different numbers of data units, are also not
+escapes, which can match different numbers of code units, are also not
 permitted.
 .P
 .\" HTML <a href="#subpatternsassubroutines">
@@ -2292,7 +2342,7 @@
   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
+from left to right, PCRE2 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$
@@ -2305,10 +2355,11 @@
 .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.
+there can be no backtracking for the .*+ item because of the possessive
+quantifier; 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"
@@ -2368,8 +2419,9 @@
   (?(1) (A|B|C) | (D | (?(2)E|F) | E) )
 .sp
 .P
-There are four kinds of condition: references to subpatterns, references to
-recursion, a pseudo-condition called DEFINE, and assertions.
+There are five kinds of condition: references to subpatterns, references to
+recursion, two pseudo-conditions called DEFINE and VERSION, and assertions.
+.
 .
 .SS "Checking for a used subpattern by number"
 .rs
@@ -2392,7 +2444,7 @@
 zero in any of these forms is not used; it provokes a compile-time error.)
 .P
 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
+make it more readable (assume the PCRE2_EXTENDED option) and to divide it into
 three parts for ease of discussion:
 .sp
   ( \e( )?    [^()]+    (?(1) \e) )
@@ -2414,11 +2466,12 @@
 .sp
 This makes the fragment independent of the parentheses in the larger pattern.
 .
+.
 .SS "Checking for a used subpattern by name"
 .rs
 .sp
 Perl uses the syntax (?(<name>)...) or (?('name')...) to test for a used
-subpattern by name. For compatibility with earlier versions of PCRE, which had
+subpattern by name. For compatibility with earlier versions of PCRE1, which had
 this facility before Perl, the syntax (?(name)...) is also recognized.
 .P
 Rewriting the above example to use a named subpattern gives this:
@@ -2429,6 +2482,7 @@
 applied to all subpatterns of the same name, and is true if any one of them has
 matched.
 .
+.
 .SS "Checking for pattern recursion"
 .rs
 .sp
@@ -2452,6 +2506,7 @@
 .\"
 is described below.
 .
+.
 .\" HTML <a name="subdefine"></a>
 .SS "Defining subpatterns for use by reference only"
 .rs
@@ -2479,6 +2534,25 @@
 pattern uses references to the named group to match the four dot-separated
 components of an IPv4 address, insisting on a word boundary at each end.
 .
+.
+.SS "Checking the PCRE2 version"
+.rs
+.sp
+Programs that link with a PCRE2 library can check the version by calling
+\fBpcre2_config()\fP with appropriate arguments. Users of applications that do
+not have access to the underlying code cannot do this. A special "condition"
+called VERSION exists to allow such users to discover which version of PCRE2
+they are dealing with by using this condition to match a string such as
+"yesno". VERSION must be followed either by "=" or ">=" and a version number.
+For example:
+.sp
+  (?(VERSION>=10.4)yes|no)
+.sp
+This pattern matches "yes" if the PCRE2 version is greater or equal to 10.4, or
+"no" otherwise. The fractional part of the version number may not contain more
+than two digits.
+.
+.
 .SS "Assertion conditions"
 .rs
 .sp
@@ -2503,30 +2577,31 @@
 .rs
 .sp
 There are two ways of including comments in patterns that are processed by
-PCRE. In both cases, the start of the comment must not be in a character class,
-nor in the middle of any other sequence of related characters such as (?: or a
-subpattern name or number. The characters that make up a comment play no part
-in the pattern matching.
+PCRE2. In both cases, the start of the comment must not be in a character
+class, nor in the middle of any other sequence of related characters such as
+(?: or a subpattern name or number. The characters that make up a comment play
+no part in the pattern matching.
 .P
 The sequence (?# marks the start of a comment that continues up to the next
-closing parenthesis. Nested parentheses are not permitted. If the PCRE_EXTENDED
-option is set, an unescaped # character also introduces a comment, which in
-this case continues to immediately after the next newline character or
-character sequence in the pattern. Which characters are interpreted as newlines
-is controlled by the options passed to a compiling function or by a special
-sequence at the start of the pattern, as described in the section entitled
+closing parenthesis. Nested parentheses are not permitted. If the
+PCRE2_EXTENDED option is set, an unescaped # character also introduces a
+comment, which in this case continues to immediately after the next newline
+character or character sequence in the pattern. Which characters are
+interpreted as newlines is controlled by an option passed to the compiling
+function or by a special sequence at the start of the pattern, as described in
+the section entitled
 .\" HTML <a href="#newlines">
 .\" </a>
 "Newline conventions"
 .\"
 above. Note that the end of this type of comment is a literal newline sequence
 in the pattern; escape sequences that happen to represent a newline do not
-count. For example, consider this pattern when PCRE_EXTENDED is set, and the
-default newline convention is in force:
+count. For example, consider this pattern when PCRE2_EXTENDED is set, and the
+default newline convention (a single linefeed character) is in force:
 .sp
   abc #comment \en still comment
 .sp
-On encountering the # character, \fBpcre_compile()\fP skips along, looking for
+On encountering the # character, \fBpcre2_compile()\fP skips along, looking for
 a newline in the pattern. The sequence \en is still literal at this stage, so
 it does not terminate the comment. Only an actual character with the code value
 0x0a (the default newline) does so.
@@ -2552,9 +2627,9 @@
 The (?p{...}) item interpolates Perl code at run time, and in this case refers
 recursively to the pattern in which it appears.
 .P
-Obviously, PCRE cannot support the interpolation of Perl code. Instead, it
+Obviously, PCRE2 cannot support the interpolation of Perl code. Instead, it
 supports special syntax for recursion of the entire pattern, and also for
-individual subpattern recursion. After its introduction in PCRE and Python,
+individual subpattern recursion. After its introduction in PCRE1 and Python,
 this kind of recursion was subsequently introduced into Perl at release 5.10.
 .P
 A special item that consists of (? followed by a number greater than zero and a
@@ -2567,8 +2642,8 @@
 call, which is described in the next section.) The special item (?R) or (?0) is
 a recursive call of the entire regular expression.
 .P
-This PCRE pattern solves the nested parentheses problem (assume the
-PCRE_EXTENDED option is set so that white space is ignored):
+This PCRE2 pattern solves the nested parentheses problem (assume the
+PCRE2_EXTENDED option is set so that white space is ignored):
 .sp
   \e( ( [^()]++ | (?R) )* \e)
 .sp
@@ -2592,6 +2667,23 @@
 parentheses preceding the recursion. In other words, a negative number counts
 capturing parentheses leftwards from the point at which it is encountered.
 .P
+Be aware however, that if
+.\" HTML <a href="#dupsubpatternnumber">
+.\" </a>
+duplicate subpattern numbers
+.\"
+are in use, relative references refer to the earliest subpattern with the
+appropriate number. Consider, for example:
+.sp
+  (?|(a)|(b)) (c) (?-2)
+.sp
+The first two capturing groups (a) and (b) are both numbered 1, and group (c)
+is number 2. When the reference (?-2) is encountered, the second most recently
+opened parentheses has the number 1, but it is the first such group (the (a)
+group) to which the recursion refers. This would be the same if an absolute
+reference (?1) was used. In other words, relative references are just a
+shorthand for computing a group number.
+.P
 It is also possible to refer to subsequently opened parentheses, by writing
 references such as (?+2). However, these cannot be recursive because the
 reference is not inside the parentheses that are referenced. They are always
@@ -2601,19 +2693,19 @@
 .\"
 calls, as described in the next section.
 .P
-An alternative approach is to use named parentheses instead. The Perl syntax
-for this is (?&name); PCRE's earlier syntax (?P>name) is also supported. We
-could rewrite the above example as follows:
+An alternative approach is to use named parentheses. The Perl syntax for this
+is (?&name); PCRE1's earlier syntax (?P>name) is also supported. We could
+rewrite the above example as follows:
 .sp
   (?<pn> \e( ( [^()]++ | (?&pn) )* \e) )
 .sp
 If there is more than one subpattern with the same name, the earliest one is
 used.
 .P
-This particular example pattern that we have been looking at contains nested
-unlimited repeats, and so the use of a possessive quantifier 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
+The example pattern that we have been looking at contains nested unlimited
+repeats, and so the use of a possessive quantifier 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
@@ -2626,7 +2718,7 @@
 the outermost level. If you want to obtain intermediate values, a callout
 function can be used (see below and the
 .\" HREF
-\fBpcrecallout\fP
+\fBpcre2callout\fP
 .\"
 documentation). If the pattern above is matched against
 .sp
@@ -2637,10 +2729,9 @@
 matched at the top level, its final captured value is unset, even if it was
 (temporarily) set at a deeper level during the matching process.
 .P
-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\fP, freeing it via \fBpcre_free\fP afterwards. If no memory can
-be obtained, the match fails with the PCRE_ERROR_NOMEMORY error.
+If there are more than 15 capturing parentheses in a pattern, PCRE2 has to
+obtain extra memory from the heap to store data during a recursion. If no
+memory can be obtained, the match fails with the PCRE2_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
@@ -2655,10 +2746,10 @@
 .
 .
 .\" HTML <a name="recursiondifference"></a>
-.SS "Differences in recursion processing between PCRE and Perl"
+.SS "Differences in recursion processing between PCRE2 and Perl"
 .rs
 .sp
-Recursion processing in PCRE differs from Perl in two important ways. In PCRE
+Recursion processing in PCRE2 differs from Perl in two important ways. In PCRE2
 (like Python, but unlike Perl), a recursive subpattern call is always treated
 as an atomic group. That is, once it has matched some of the subject string, it
 is never re-entered, even if it contains untried alternatives and there is a
@@ -2669,7 +2760,7 @@
   ^(.|(.)(?1)\e2)$
 .sp
 The idea is that it either matches a single character, or two identical
-characters surrounding a sub-palindrome. In Perl, this pattern works; in PCRE
+characters surrounding a sub-palindrome. In Perl, this pattern works; in PCRE2
 it does not if the pattern is longer than three characters. Consider the
 subject string "abcba":
 .P
@@ -2692,7 +2783,7 @@
 until it runs out of characters, at which point the recursion fails. But this
 time we do have another alternative to try at the higher level. That is the big
 difference: in the previous case the remaining alternative is at a deeper
-recursion level, which PCRE cannot use.
+recursion level, which PCRE2 cannot use.
 .P
 To change the pattern so that it matches all palindromic strings, not just
 those with an odd number of characters, it is tempting to change the pattern to
@@ -2700,7 +2791,7 @@
 .sp
   ^((.)(?1)\e2|.?)$
 .sp
-Again, this works in Perl, but not in PCRE, and for the same reason. When a
+Again, this works in Perl, but not in PCRE2, and for the same reason. When a
 deeper recursion has matched a single character, it cannot be entered again in
 order to match an empty string. The solution is to separate the two cases, and
 write out the odd and even cases as alternatives at the higher level:
@@ -2712,29 +2803,29 @@
 .sp
   ^\eW*+(?:((.)\eW*+(?1)\eW*+\e2|)|((.)\eW*+(?3)\eW*+\e4|\eW*+.\eW*+))\eW*+$
 .sp
-If run with the PCRE_CASELESS option, this pattern matches phrases such as "A
-man, a plan, a canal: Panama!" and it works well in both PCRE and Perl. Note
-the use of the possessive quantifier *+ to avoid backtracking into sequences of
-non-word characters. Without this, PCRE takes a great deal longer (ten times or
-more) to match typical phrases, and Perl takes so long that you think it has
+If run with the PCRE2_CASELESS option, this pattern matches phrases such as "A
+man, a plan, a canal: Panama!" and it works in both PCRE2 and Perl. Note the
+use of the possessive quantifier *+ to avoid backtracking into sequences of
+non-word characters. Without this, PCRE2 takes a great deal longer (ten times
+or more) to match typical phrases, and Perl takes so long that you think it has
 gone into a loop.
 .P
 \fBWARNING\fP: The palindrome-matching patterns above work only if the subject
 string does not start with a palindrome that is shorter than the entire string.
 For example, although "abcba" is correctly matched, if the subject is "ababa",
-PCRE finds the palindrome "aba" at the start, then fails at top level because
+PCRE2 finds the palindrome "aba" at the start, then fails at top level because
 the end of the string does not follow. Once again, it cannot jump back into the
 recursion to try other alternatives, so the entire match fails.
 .P
-The second way in which PCRE and Perl differ in their recursion processing is
+The second way in which PCRE2 and Perl differ in their recursion processing is
 in the handling of captured values. In Perl, when a subpattern is called
 recursively or as a subpattern (see the next section), it has no access to any
-values that were captured outside the recursion, whereas in PCRE these values
+values that were captured outside the recursion, whereas in PCRE2 these values
 can be referenced. Consider this pattern:
 .sp
   ^(.)(\e1|a(?2))
 .sp
-In PCRE, this pattern matches "bab". The first capturing parentheses match "b",
+In PCRE2, this pattern matches "bab". The first capturing parentheses match "b",
 then in the second group, when the back reference \e1 fails to match "b", the
 second alternative matches "a" and then recurses. In the recursion, \e1 does
 now match "b" and so the whole match succeeds. In Perl, the pattern fails to
@@ -2796,7 +2887,7 @@
   (?<pn> \e( ( (?>[^()]+) | \eg<pn> )* \e) )
   (sens|respons)e and \eg'1'ibility
 .sp
-PCRE supports an extension to Oniguruma: if a number is preceded by a
+PCRE2 supports an extension to Oniguruma: if a number is preceded by a
 plus or a minus sign it is taken as a relative reference. For example:
 .sp
   (abc)(?i:\eg<-1>)
@@ -2813,45 +2904,72 @@
 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\fP
-(8-bit library) or \fIpcre[16|32]_callout\fP (16-bit or 32-bit library).
-By default, this variable contains NULL, which disables all calling out.
+PCRE2 provides a similar feature, but of course it cannot obey arbitrary Perl
+code. The feature is called "callout". The caller of PCRE2 provides an external
+function by putting its entry point in a match context using the function
+\fBpcre2_set_callout()\fP, and then passing that context to \fBpcre2_match()\fP
+or \fBpcre2_dfa_match()\fP. If no match context is passed, or if the callout
+entry point is set to NULL, callouts are disabled.
 .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:
+Within a regular expression, (?C<arg>) indicates a point at which the external
+function is to be called. There are two kinds of callout: those with a
+numerical argument and those with a string argument. (?C) on its own with no
+argument is treated as (?C0). A numerical argument allows the application to
+distinguish between different callouts. String arguments were added for release
+10.20 to make it possible for script languages that use PCRE2 to embed short
+scripts within patterns in a similar way to Perl.
+.P
+During matching, when PCRE2 reaches a callout point, the external function is
+called. It is provided with the number or string argument of the callout, the
+position in the pattern, and one item of data that is also set in the match
+block. The callout function may cause matching to proceed, to backtrack, or to
+fail.
+.P
+By default, PCRE2 implements a number of optimizations at matching time, and
+one side-effect is that sometimes callouts are skipped. If you need all
+possible callouts to happen, you need to set options that disable the relevant
+optimizations. More details, including a complete description of the
+programming interface to the callout function, are given in the
+.\" HREF
+\fBpcre2callout\fP
+.\"
+documentation.
+.
+.
+.SS "Callouts with numerical arguments"
+.rs
+.sp
+If you just want to have a means of identifying different callout points, put a
+number less than 256 after the letter C. For example, this pattern has two
+callout points:
 .sp
   (?C1)abc(?C2)def
 .sp
-If the PCRE_AUTO_CALLOUT flag is passed to a compiling function, callouts are
-automatically installed before each item in the pattern. They are all numbered
-255. If there is a conditional group in the pattern whose condition is an
-assertion, an additional callout is inserted just before the condition. An
-explicit callout may also be set at this position, as in this example:
+If the PCRE2_AUTO_CALLOUT flag is passed to \fBpcre2_compile()\fP, numerical
+callouts are automatically installed before each item in the pattern. They are
+all numbered 255. If there is a conditional group in the pattern whose
+condition is an assertion, an additional callout is inserted just before the
+condition. An explicit callout may also be set at this position, as in this
+example:
 .sp
   (?(?C9)(?=a)abc|def)
 .sp
 Note that this applies only to assertion conditions, not to other types of
 condition.
-.P
-During matching, when PCRE reaches a callout point, the external function is
-called. It is provided with the number of the callout, the position in the
-pattern, and, optionally, one item of data originally supplied by the caller of
-the matching function. The callout function may cause matching to proceed, to
-backtrack, or to fail altogether.
-.P
-By default, PCRE implements a number of optimizations at compile time and
-matching time, and one side-effect is that sometimes callouts are skipped. If
-you need all possible callouts to happen, you need to set options that disable
-the relevant optimizations. More details, and a complete description of the
-interface to the callout function, are given in the
-.\" HREF
-\fBpcrecallout\fP
-.\"
-documentation.
+.
+.
+.SS "Callouts with string arguments"
+.rs
+.sp
+A delimited string may be used instead of a number as a callout argument. The
+starting delimiter must be one of ` ' " ^ % # $ { and the ending delimiter is
+the same as the start, except for {, where the ending delimiter is }. If the
+ending delimiter is needed within the string, it must be doubled. For
+example:
+.sp
+  (?C'ab ''c'' d')xyz(?C{any text})pqr
+.sp
+The doubling is removed before the string is passed to the callout function.
 .
 .
 .\" HTML <a name="backtrackcontrol"></a>
@@ -2862,24 +2980,33 @@
 are still described in the Perl documentation as "experimental and subject to
 change or removal in a future version of Perl". It goes on to say: "Their usage
 in production code should be noted to avoid problems during upgrades." The same
-remarks apply to the PCRE features described in this section.
+remarks apply to the PCRE2 features described in this section.
 .P
 The new verbs make use of what was previously invalid syntax: an opening
-parenthesis followed by an asterisk. They are generally of the form
-(*VERB) or (*VERB:NAME). Some may take either form, possibly behaving
-differently depending on whether or not a name is present. A name is any
-sequence of characters that does not include a closing parenthesis. The maximum
-length of name is 255 in the 8-bit library and 65535 in the 16-bit and 32-bit
-libraries. If the name is empty, that is, if the closing parenthesis
-immediately follows the colon, the effect is as if the colon were not there.
-Any number of these verbs may occur in a pattern.
+parenthesis followed by an asterisk. They are generally of the form (*VERB) or
+(*VERB:NAME). Some verbs take either form, possibly behaving differently
+depending on whether or not a name is present.
+.P
+By default, for compatibility with Perl, a name is any sequence of characters
+that does not include a closing parenthesis. The name is not processed in
+any way, and it is not possible to include a closing parenthesis in the name.
+However, if the PCRE2_ALT_VERBNAMES option is set, normal backslash processing
+is applied to verb names and only an unescaped closing parenthesis terminates
+the name. A closing parenthesis can be included in a name either as \e) or
+between \eQ and \eE. If the PCRE2_EXTENDED option is set, unescaped whitespace
+in verb names is skipped and #-comments are recognized, exactly as in the rest
+of the pattern.
+.P
+The maximum length of a name is 255 in the 8-bit library and 65535 in the
+16-bit and 32-bit libraries. If the name is empty, that is, if the closing
+parenthesis immediately follows the colon, the effect is as if the colon were
+not there. Any number of these verbs may occur in a pattern.
 .P
 Since these verbs are specifically related to backtracking, most of them can be
-used only when the pattern is to be matched using one of the traditional
-matching functions, because these use a backtracking algorithm. With the
-exception of (*FAIL), which behaves like a failing negative assertion, the
-backtracking control verbs cause an error if encountered by a DFA matching
-function.
+used only when the pattern is to be matched using the traditional matching
+function, because these use a backtracking algorithm. With the exception of
+(*FAIL), which behaves like a failing negative assertion, the backtracking
+control verbs cause an error if encountered by the DFA matching function.
 .P
 The behaviour of these verbs in
 .\" HTML <a href="#btrepeat">
@@ -2902,22 +3029,22 @@
 .SS "Optimizations that affect backtracking verbs"
 .rs
 .sp
-PCRE contains some optimizations that are used to speed up matching by running
+PCRE2 contains some optimizations that are used to speed up matching by running
 some checks at the start of each match attempt. For example, it may know the
 minimum length of matching subject, or that a particular character must be
 present. When one of these optimizations bypasses the running of a match, any
 included backtracking verbs will not, of course, be processed. You can suppress
-the start-of-match optimizations by setting the PCRE_NO_START_OPTIMIZE option
-when calling \fBpcre_compile()\fP or \fBpcre_exec()\fP, or by starting the
-pattern with (*NO_START_OPT). There is more discussion of this option in the
-section entitled
-.\" HTML <a href="pcreapi.html#execoptions">
+the start-of-match optimizations by setting the PCRE2_NO_START_OPTIMIZE option
+when calling \fBpcre2_compile()\fP, or by starting the pattern with
+(*NO_START_OPT). There is more discussion of this option in the section
+entitled
+.\" HTML <a href="pcre2api.html#compiling">
 .\" </a>
-"Option bits for \fBpcre_exec()\fP"
+"Compiling a pattern"
 .\"
 in the
 .\" HREF
-\fBpcreapi\fP
+\fBpcre2api\fP
 .\"
 documentation.
 .P
@@ -2952,7 +3079,7 @@
 This verb causes a matching failure, forcing backtracking to occur. It is
 equivalent to (?!) but easier to read. The Perl documentation notes that it is
 probably useful only when combined with (?{}) or (??{}). Those are, of course,
-Perl features that are not present in PCRE. The nearest equivalent is the
+Perl features that are not present in PCRE2. The nearest equivalent is the
 callout feature, as for example in this pattern:
 .sp
   a+(?C)(*FAIL)
@@ -2976,18 +3103,18 @@
 When a match succeeds, the name of the last-encountered (*MARK:NAME),
 (*PRUNE:NAME), or (*THEN:NAME) on the matching path is passed back to the
 caller as described in the section entitled
-.\" HTML <a href="pcreapi.html#extradata">
+.\" HTML <a href="pcre2api.html#matchotherdata">
 .\" </a>
-"Extra data for \fBpcre_exec()\fP"
+"Other information about the match"
 .\"
 in the
 .\" HREF
-\fBpcreapi\fP
+\fBpcre2api\fP
 .\"
-documentation. Here is an example of \fBpcretest\fP output, where the /K
+documentation. Here is an example of \fBpcre2test\fP output, where the "mark"
 modifier requests the retrieval and outputting of (*MARK) data:
 .sp
-    re> /X(*MARK:A)Y|X(*MARK:B)Z/K
+    re> /X(*MARK:A)Y|X(*MARK:B)Z/mark
   data> XY
    0: XY
   MK: A
@@ -3007,7 +3134,7 @@
 After a partial match or a failed match, the last encountered name in the
 entire match process is returned. For example:
 .sp
-    re> /X(*MARK:A)Y|X(*MARK:B)Z/K
+    re> /X(*MARK:A)Y|X(*MARK:B)Z/mark
   data> XP
   No match, mark = B
 .sp
@@ -3017,7 +3144,7 @@
 (*MARK) item, but nevertheless do not reset it.
 .P
 If you are interested in (*MARK) values after failed matches, you should
-probably set the PCRE_NO_START_OPTIMIZE option
+probably set the PCRE2_NO_START_OPTIMIZE option
 .\" HTML <a href="#nooptimize">
 .\" </a>
 (see above)
@@ -3031,12 +3158,11 @@
 The following verbs do nothing when they are encountered. Matching continues
 with what follows, but if there is no subsequent match, causing a backtrack to
 the verb, a failure is forced. That is, backtracking cannot pass to the left of
-the verb. However, when one of these verbs appears inside an atomic group or an
-assertion that is true, its effect is confined to that group, because once the
-group has been matched, there is never any backtracking into it. In this
-situation, backtracking can "jump back" to the left of the entire atomic group
-or assertion. (Remember also, as stated above, that this localization also
-applies in subroutine calls.)
+the verb. However, when one of these verbs appears inside an atomic group
+(which includes any group that is called as a subroutine) or in an assertion
+that is true, its effect is confined to that group, because once the group has
+been matched, there is never any backtracking into it. In this situation,
+backtracking has to jump to the left of the entire atomic group or assertion.
 .P
 These verbs differ in exactly what kind of failure occurs when backtracking
 reaches them. The behaviour described below is what happens when the verb is
@@ -3049,7 +3175,7 @@
 outright if there is a later matching failure that causes backtracking to reach
 it. Even if the pattern is unanchored, no further attempts to find a match by
 advancing the starting point take place. If (*COMMIT) is the only backtracking
-verb that is encountered, once it has been passed \fBpcre_exec()\fP is
+verb that is encountered, once it has been passed \fBpcre2_match()\fP is
 committed to finding a match at the current starting point, or not at all. For
 example:
 .sp
@@ -3065,23 +3191,23 @@
 match does not always guarantee that a match must be at this starting point.
 .P
 Note that (*COMMIT) at the start of a pattern is not the same as an anchor,
-unless PCRE's start-of-match optimizations are turned off, as shown in this
-output from \fBpcretest\fP:
+unless PCRE2's start-of-match optimizations are turned off, as shown in this
+output from \fBpcre2test\fP:
 .sp
     re> /(*COMMIT)abc/
   data> xyzabc
    0: abc
-  data> xyzabc\eY
+  data>
+  re> /(*COMMIT)abc/no_start_optimize
+  data> xyzabc
   No match
 .sp
-For this pattern, PCRE knows that any match must start with "a", so the
+For the first pattern, PCRE2 knows that any match must start with "a", so the
 optimization skips along the subject to "a" before applying the pattern to the
-first set of data. The match attempt then succeeds. In the second set of data,
-the escape sequence \eY is interpreted by the \fBpcretest\fP program. It causes
-the PCRE_NO_START_OPTIMIZE option to be set when \fBpcre_exec()\fP is called.
-This disables the optimization that skips along to the first character. The
-pattern is now applied starting at "x", and so the (*COMMIT) causes the match
-to fail without trying any other starting points.
+first set of data. The match attempt then succeeds. The second pattern disables
+the optimization that skips along to the first character. The pattern is now
+applied starting at "x", and so the (*COMMIT) causes the match to fail without
+trying any other starting points.
 .sp
   (*PRUNE) or (*PRUNE:NAME)
 .sp
@@ -3098,7 +3224,8 @@
 .P
 The behaviour of (*PRUNE:NAME) is the not the same as (*MARK:NAME)(*PRUNE).
 It is like (*MARK:NAME) in that the name is remembered for passing back to the
-caller. However, (*SKIP:NAME) searches only for names set with (*MARK).
+caller. However, (*SKIP:NAME) searches only for names set with (*MARK),
+ignoring those set by (*PRUNE) or (*THEN).
 .sp
   (*SKIP)
 .sp
@@ -3147,7 +3274,8 @@
 .P
 The behaviour of (*THEN:NAME) is the not the same as (*MARK:NAME)(*THEN).
 It is like (*MARK:NAME) in that the name is remembered for passing back to the
-caller. However, (*SKIP:NAME) searches only for names set with (*MARK).
+caller. However, (*SKIP:NAME) searches only for names set with (*MARK),
+ignoring those set by (*PRUNE) and (*THEN).
 .P
 A subpattern that does not contain a | character is just a part of the
 enclosing alternative; it is not a nested alternation with only one
@@ -3220,20 +3348,21 @@
 .SS "Backtracking verbs in repeated groups"
 .rs
 .sp
-PCRE differs from Perl in its handling of backtracking verbs in repeated
+PCRE2 differs from Perl in its handling of backtracking verbs in repeated
 groups. For example, consider:
 .sp
   /(a(*COMMIT)b)+ac/
 .sp
-If the subject is "abac", Perl matches, but PCRE fails because the (*COMMIT) in
-the second repeat of the group acts.
+If the subject is "abac", Perl matches, but PCRE2 fails because the (*COMMIT)
+in the second repeat of the group acts.
 .
 .
 .\" HTML <a name="btassert"></a>
 .SS "Backtracking verbs in assertions"
 .rs
 .sp
-(*FAIL) in an assertion has its normal effect: it forces an immediate backtrack.
+(*FAIL) in an assertion has its normal effect: it forces an immediate
+backtrack.
 .P
 (*ACCEPT) in a positive assertion causes the assertion to succeed without any
 further processing. In a negative assertion, (*ACCEPT) causes the assertion to
@@ -3278,8 +3407,8 @@
 .SH "SEE ALSO"
 .rs
 .sp
-\fBpcreapi\fP(3), \fBpcrecallout\fP(3), \fBpcrematching\fP(3),
-\fBpcresyntax\fP(3), \fBpcre\fP(3), \fBpcre16(3)\fP, \fBpcre32(3)\fP.
+\fBpcre2api\fP(3), \fBpcre2callout\fP(3), \fBpcre2matching\fP(3),
+\fBpcre2syntax\fP(3), \fBpcre2\fP(3).
 .
 .
 .SH AUTHOR
@@ -3288,7 +3417,7 @@
 .nf
 Philip Hazel
 University Computing Service
-Cambridge CB2 3QH, England.
+Cambridge, England.
 .fi
 .
 .
@@ -3296,6 +3425,6 @@
 .rs
 .sp
 .nf
-Last updated: 14 June 2015
+Last updated: 13 November 2015
 Copyright (c) 1997-2015 University of Cambridge.
 .fi
diff --git a/dist/doc/pcreperform.3 b/dist2/doc/pcre2perform.3
similarity index 61%
rename from dist/doc/pcreperform.3
rename to dist2/doc/pcre2perform.3
index fb2aa95..ec86fe7 100644
--- a/dist/doc/pcreperform.3
+++ b/dist2/doc/pcre2perform.3
@@ -1,7 +1,7 @@
-.TH PCREPERFORM 3 "09 January 2012" "PCRE 8.30"
+.TH PCRE2PERFORM 3 "02 January 2015" "PCRE2 10.00"
 .SH NAME
-PCRE - Perl-compatible regular expressions
-.SH "PCRE PERFORMANCE"
+PCRE2 - Perl-compatible regular expressions (revised API)
+.SH "PCRE2 PERFORMANCE"
 .rs
 .sp
 Two aspects of performance are discussed below: memory usage and processing
@@ -11,8 +11,8 @@
 .SH "COMPILED PATTERN MEMORY USAGE"
 .rs
 .sp
-Patterns are compiled by PCRE into a reasonably efficient interpretive code, so
-that most simple patterns do not use much memory. However, there is one case
+Patterns are compiled by PCRE2 into a reasonably efficient interpretive code,
+so that most simple patterns do not use much memory. However, there is one case
 where the memory usage of a compiled pattern can be unexpectedly large. If a
 parenthesized subpattern has a quantifier with a minimum greater than 1 and/or
 a limited maximum, the whole subpattern is repeated in the compiled code. For
@@ -34,15 +34,17 @@
 .sp
   ((ab){1,1000}c){1,3}
 .sp
-uses 51K bytes when compiled using the 8-bit library. When PCRE is compiled
+uses 51K bytes when compiled using the 8-bit library. When PCRE2 is compiled
 with its default internal pointer size of two bytes, the size limit on a
-compiled pattern is 64K data units, and this is reached with the above pattern
-if the outer repetition is increased from 3 to 4. PCRE can be compiled to use
-larger internal pointers and thus handle larger compiled patterns, but it is
-better to try to rewrite your pattern to use less memory if you can.
+compiled pattern is 64K code units in the 8-bit and 16-bit libraries, and this
+is reached with the above pattern if the outer repetition is increased from 3
+to 4. PCRE2 can be compiled to use larger internal pointers and thus handle
+larger compiled patterns, but it is better to try to rewrite your pattern to
+use less memory if you can.
 .P
-One way of reducing the memory usage for such patterns is to make use of PCRE's
-.\" HTML <a href="pcrepattern.html#subpatternsassubroutines">
+One way of reducing the memory usage for such patterns is to make use of
+PCRE2's
+.\" HTML <a href="pcre2pattern.html#subpatternsassubroutines">
 .\" </a>
 "subroutine"
 .\"
@@ -53,28 +55,27 @@
 reduces the memory requirements to 18K, and indeed it remains under 20K even
 with the outer repetition increased to 100. However, this pattern is not
 exactly equivalent, because the "subroutine" calls are treated as
-.\" HTML <a href="pcrepattern.html#atomicgroup">
+.\" HTML <a href="pcre2pattern.html#atomicgroup">
 .\" </a>
 atomic groups
 .\"
 into which there can be no backtracking if there is a subsequent matching
-failure. Therefore, PCRE cannot do this kind of rewriting automatically.
+failure. Therefore, PCRE2 cannot do this kind of rewriting automatically.
 Furthermore, there is a noticeable loss of speed when executing the modified
 pattern. Nevertheless, if the atomic grouping is not a problem and the loss of
 speed is acceptable, this kind of rewriting will allow you to process patterns
-that PCRE cannot otherwise handle.
+that PCRE2 cannot otherwise handle.
 .
 .
 .SH "STACK USAGE AT RUN TIME"
 .rs
 .sp
-When \fBpcre_exec()\fP or \fBpcre[16|32]_exec()\fP is used for matching, certain
-kinds of pattern can cause it to use large amounts of the process stack. In
-some environments the default process stack is quite small, and if it runs out
-the result is often SIGSEGV. This issue is probably the most frequently raised
-problem with PCRE. Rewriting your pattern can often help. The
+When \fBpcre2_match()\fP is used for matching, certain kinds of pattern can
+cause it to use large amounts of the process stack. In some environments the
+default process stack is quite small, and if it runs out the result is often
+SIGSEGV. Rewriting your pattern can often help. The
 .\" HREF
-\fBpcrestack\fP
+\fBpcre2stack\fP
 .\"
 documentation discusses this issue in detail.
 .
@@ -88,40 +89,44 @@
 simplest construction that provides the required behaviour is usually the most
 efficient. Jeffrey Friedl's book contains a lot of useful general discussion
 about optimizing regular expressions for efficient performance. This document
-contains a few observations about PCRE.
+contains a few observations about PCRE2.
 .P
 Using Unicode character properties (the \ep, \eP, and \eX escapes) is slow,
-because PCRE has to use a multi-stage table lookup whenever it needs a
+because PCRE2 has to use a multi-stage table lookup whenever it needs a
 character's property. If you can find an alternative pattern that does not use
 character properties, it will probably be faster.
 .P
 By default, the escape sequences \eb, \ed, \es, and \ew, and the POSIX
 character classes such as [:alpha:] do not use Unicode properties, partly for
 backwards compatibility, and partly for performance reasons. However, you can
-set PCRE_UCP if you want Unicode character properties to be used. This can
-double the matching time for items such as \ed, when matched with
-a traditional matching function; the performance loss is less with
-a DFA matching function, and in both cases there is not much difference for
-\eb.
+set the PCRE2_UCP option or start the pattern with (*UCP) if you want Unicode
+character properties to be used. This can double the matching time for items
+such as \ed, when matched with \fBpcre2_match()\fP; the performance loss is
+less with a DFA matching function, and in both cases there is not much
+difference for \eb.
 .P
-When a pattern begins with .* not in parentheses, or in parentheses that are
-not the subject of a backreference, and the PCRE_DOTALL option is set, the
-pattern is implicitly anchored by PCRE, since it can match only at the start of
-a subject string. However, if PCRE_DOTALL is not set, PCRE cannot make this
-optimization, because the . metacharacter does not then match a newline, and if
-the subject string contains newlines, the pattern may match from the character
-immediately following one of them instead of from the very start. For example,
-the pattern
+When a pattern begins with .* not in atomic parentheses, nor in parentheses
+that are the subject of a backreference, and the PCRE2_DOTALL option is set,
+the pattern is implicitly anchored by PCRE2, since it can match only at the
+start of a subject string. If the pattern has multiple top-level branches, they
+must all be anchorable. The optimization can be disabled by the
+PCRE2_NO_DOTSTAR_ANCHOR option, and is automatically disabled if the pattern
+contains (*PRUNE) or (*SKIP).
+.P
+If PCRE2_DOTALL is not set, PCRE2 cannot make this optimization, because the
+dot metacharacter does not then match a newline, and if the subject string
+contains newlines, the pattern may match from the character immediately
+following one of them instead of from the very start. For example, the pattern
 .sp
   .*second
 .sp
 matches the subject "first\enand second" (where \en stands for a newline
 character), with the match starting at the seventh character. In order to do
-this, PCRE has to retry the match starting after every newline in the subject.
+this, PCRE2 has to retry the match starting after every newline in the subject.
 .P
 If you are using such a pattern with subject strings that do not contain
-newlines, the best performance is obtained by setting PCRE_DOTALL, or starting
-the pattern with ^.* or ^.*? to indicate explicit anchoring. That saves PCRE
+newlines, the best performance is obtained by setting PCRE2_DOTALL, or starting
+the pattern with ^.* or ^.*? to indicate explicit anchoring. That saves PCRE2
 from having to scan along the subject looking for a newline to restart at.
 .P
 Beware of patterns that contain nested indefinite repeats. These can take a
@@ -134,7 +139,7 @@
 rapidly as the string gets longer. (The * repeat can match 0, 1, 2, 3, or 4
 times, and for each of those cases other than 0 or 4, the + repeats can match
 different numbers of times.) When the remainder of the pattern is such that the
-entire match is going to fail, PCRE has in principle to try every possible
+entire match is going to fail, PCRE2 has in principle to try every possible
 variation, and this can take an extremely long time, even for relatively short
 strings.
 .P
@@ -143,7 +148,7 @@
   (a+)*b
 .sp
 where a literal character follows. Before embarking on the standard matching
-procedure, PCRE checks that there is a "b" later in the subject string, and if
+procedure, PCRE2 checks that there is a "b" later in the subject string, and if
 there is not, it fails the match immediately. However, when there is no
 following literal this optimization cannot be used. You can see the difference
 by comparing the behaviour of
@@ -164,7 +169,7 @@
 .nf
 Philip Hazel
 University Computing Service
-Cambridge CB2 3QH, England.
+Cambridge, England.
 .fi
 .
 .
@@ -172,6 +177,6 @@
 .rs
 .sp
 .nf
-Last updated: 25 August 2012
-Copyright (c) 1997-2012 University of Cambridge.
+Last updated: 02 January 2015
+Copyright (c) 1997-2015 University of Cambridge.
 .fi
diff --git a/dist/doc/pcreposix.3 b/dist2/doc/pcre2posix.3
similarity index 62%
rename from dist/doc/pcreposix.3
rename to dist2/doc/pcre2posix.3
index 77890f3..833e96c 100644
--- a/dist/doc/pcreposix.3
+++ b/dist2/doc/pcre2posix.3
@@ -1,18 +1,19 @@
-.TH PCREPOSIX 3 "09 January 2012" "PCRE 8.30"
+.TH PCRE2POSIX 3 "29 November 2015" "PCRE2 10.21"
 .SH NAME
-PCRE - Perl-compatible regular expressions.
+PCRE2 - Perl-compatible regular expressions (revised API)
 .SH "SYNOPSIS"
 .rs
 .sp
-.B #include <pcreposix.h>
+.B #include <pcre2posix.h>
 .PP
 .nf
 .B int regcomp(regex_t *\fIpreg\fP, const char *\fIpattern\fP,
 .B "     int \fIcflags\fP);"
 .sp
-.B int regexec(regex_t *\fIpreg\fP, const char *\fIstring\fP,
+.B int regexec(const regex_t *\fIpreg\fP, const char *\fIstring\fP,
 .B "     size_t \fInmatch\fP, regmatch_t \fIpmatch\fP[], int \fIeflags\fP);"
-.B "     size_t regerror(int \fIerrcode\fP, const regex_t *\fIpreg\fP,"
+.sp
+.B "size_t regerror(int \fIerrcode\fP, const regex_t *\fIpreg\fP,"
 .B "     char *\fIerrbuf\fP, size_t \fIerrbuf_size\fP);"
 .sp
 .B void regfree(regex_t *\fIpreg\fP);
@@ -21,40 +22,40 @@
 .SH DESCRIPTION
 .rs
 .sp
-This set of functions provides a POSIX-style API for the PCRE regular
+This set of functions provides a POSIX-style API for the PCRE2 regular
 expression 8-bit library. See the
 .\" HREF
-\fBpcreapi\fP
+\fBpcre2api\fP
 .\"
-documentation for a description of PCRE's native API, which contains much
-additional functionality. There is no POSIX-style wrapper for PCRE's 16-bit
-and 32-bit library.
+documentation for a description of PCRE2's native API, which contains much
+additional functionality. There is no POSIX-style wrapper for PCRE2's 16-bit
+and 32-bit libraries.
 .P
 The functions described here are just wrapper functions that ultimately call
-the PCRE native API. Their prototypes are defined in the \fBpcreposix.h\fP
+the PCRE2 native API. Their prototypes are defined in the \fBpcre2posix.h\fP
 header file, and on Unix systems the library itself is called
-\fBpcreposix.a\fP, so can be accessed by adding \fB-lpcreposix\fP to the
+\fBlibpcre2-posix.a\fP, so can be accessed by adding \fB-lpcre2-posix\fP to the
 command for linking an application that uses them. Because the POSIX functions
-call the native ones, it is also necessary to add \fB-lpcre\fP.
+call the native ones, it is also necessary to add \fB-lpcre2-8\fP.
 .P
-I have implemented only those POSIX option bits that can be reasonably mapped
-to PCRE native options. In addition, the option REG_EXTENDED is defined with
-the value zero. This has no effect, but since programs that are written to the
-POSIX interface often use it, this makes it easier to slot in PCRE as a
+Those POSIX option bits that can reasonably be mapped to PCRE2 native options
+have been implemented. In addition, the option REG_EXTENDED is defined with the
+value zero. This has no effect, but since programs that are written to the
+POSIX interface often use it, this makes it easier to slot in PCRE2 as a
 replacement library. Other POSIX options are not even defined.
 .P
 There are also some other options that are not defined by POSIX. These have
 been added at the request of users who want to make use of certain
-PCRE-specific features via the POSIX calling interface.
+PCRE2-specific features via the POSIX calling interface.
 .P
-When PCRE is called via these functions, it is only the API that is POSIX-like
+When PCRE2 is called via these functions, it is only the API that is POSIX-like
 in style. The syntax and semantics of the regular expressions themselves are
-still those of Perl, subject to the setting of various PCRE options, as
+still those of Perl, subject to the setting of various PCRE2 options, as
 described below. "POSIX-like in style" means that the API approximates to the
-POSIX definition; it is not fully POSIX-compatible, and in multi-byte encoding
+POSIX definition; it is not fully POSIX-compatible, and in multi-unit encoding
 domains it is probably even less compatible.
 .P
-The header for these functions is supplied as \fBpcreposix.h\fP to avoid any
+The header for these functions is supplied as \fBpcre2posix.h\fP to avoid any
 potential clash with other POSIX libraries. It can, of course, be renamed or
 aliased as \fBregex.h\fP, which is the "correct" name. It provides two
 structure types, \fIregex_t\fP for compiled internal forms, and
@@ -77,24 +78,24 @@
 .sp
   REG_DOTALL
 .sp
-The PCRE_DOTALL option is set when the regular expression is passed for
+The PCRE2_DOTALL option is set when the regular expression is passed for
 compilation to the native function. Note that REG_DOTALL is not part of the
 POSIX standard.
 .sp
   REG_ICASE
 .sp
-The PCRE_CASELESS option is set when the regular expression is passed for
+The PCRE2_CASELESS option is set when the regular expression is passed for
 compilation to the native function.
 .sp
   REG_NEWLINE
 .sp
-The PCRE_MULTILINE option is set when the regular expression is passed for
+The PCRE2_MULTILINE option is set when the regular expression is passed for
 compilation to the native function. Note that this does \fInot\fP mimic the
 defined POSIX behaviour for REG_NEWLINE (see the following section).
 .sp
   REG_NOSUB
 .sp
-The PCRE_NO_AUTO_CAPTURE option is set when the regular expression is passed
+The PCRE2_NO_AUTO_CAPTURE option is set when the regular expression is passed
 for compilation to the native function. In addition, when a pattern that is
 compiled with this flag is passed to \fBregexec()\fP for matching, the
 \fInmatch\fP and \fIpmatch\fP arguments are ignored, and no captured strings
@@ -102,31 +103,31 @@
 .sp
   REG_UCP
 .sp
-The PCRE_UCP option is set when the regular expression is passed for
-compilation to the native function. This causes PCRE to use Unicode properties
+The PCRE2_UCP option is set when the regular expression is passed for
+compilation to the native function. This causes PCRE2 to use Unicode properties
 when matchine \ed, \ew, etc., instead of just recognizing ASCII values. Note
-that REG_UTF8 is not part of the POSIX standard.
+that REG_UCP is not part of the POSIX standard.
 .sp
   REG_UNGREEDY
 .sp
-The PCRE_UNGREEDY option is set when the regular expression is passed for
+The PCRE2_UNGREEDY option is set when the regular expression is passed for
 compilation to the native function. Note that REG_UNGREEDY is not part of the
 POSIX standard.
 .sp
-  REG_UTF8
+  REG_UTF
 .sp
-The PCRE_UTF8 option is set when the regular expression is passed for
+The PCRE2_UTF option is set when the regular expression is passed for
 compilation to the native function. This causes the pattern itself and all data
-strings used for matching it to be treated as UTF-8 strings. Note that REG_UTF8
+strings used for matching it to be treated as UTF-8 strings. Note that REG_UTF
 is not part of the POSIX standard.
 .P
 In the absence of these flags, no options are passed to the native function.
-This means the the regex is compiled with PCRE default semantics. In
+This means the the regex is compiled with PCRE2 default semantics. In
 particular, the way it handles newline characters in the subject string is the
-Perl way, not the POSIX way. Note that setting PCRE_MULTILINE has only
+Perl way, not the POSIX way. Note that setting PCRE2_MULTILINE has only
 \fIsome\fP of the effects specified for REG_NEWLINE. It does not affect the way
-newlines are matched by . (they are not) or by a negative class such as [^a]
-(they are).
+newlines are matched by the dot metacharacter (they are not) or by a negative
+class such as [^a] (they are).
 .P
 The yield of \fBregcomp()\fP is zero on success, and non-zero otherwise. The
 \fIpreg\fP structure is filled in on success, and one member of the structure
@@ -142,19 +143,19 @@
 .rs
 .sp
 This area is not simple, because POSIX and Perl take different views of things.
-It is not possible to get PCRE to obey POSIX semantics, but then PCRE was never
-intended to be a POSIX engine. The following table lists the different
-possibilities for matching newline characters in PCRE:
+It is not possible to get PCRE2 to obey POSIX semantics, but then PCRE2 was
+never intended to be a POSIX engine. The following table lists the different
+possibilities for matching newline characters in Perl and PCRE2:
 .sp
                           Default   Change with
 .sp
-  . matches newline          no     PCRE_DOTALL
+  . matches newline          no     PCRE2_DOTALL
   newline matches [^a]       yes    not changeable
-  $ matches \en at end        yes    PCRE_DOLLARENDONLY
-  $ matches \en in middle     no     PCRE_MULTILINE
-  ^ matches \en in middle     no     PCRE_MULTILINE
+  $ matches \en at end        yes    PCRE2_DOLLAR_ENDONLY
+  $ matches \en in middle     no     PCRE2_MULTILINE
+  ^ matches \en in middle     no     PCRE2_MULTILINE
 .sp
-This is the equivalent table for POSIX:
+This is the equivalent table for a POSIX-compatible pattern matcher:
 .sp
                           Default   Change with
 .sp
@@ -164,13 +165,17 @@
   $ matches \en in middle     no     REG_NEWLINE
   ^ matches \en in middle     no     REG_NEWLINE
 .sp
-PCRE's behaviour is the same as Perl's, except that there is no equivalent for
-PCRE_DOLLAR_ENDONLY in Perl. In both PCRE and Perl, there is no way to stop
-newline from matching [^a].
+This behaviour is not what happens when PCRE2 is called via its POSIX
+API. By default, PCRE2's behaviour is the same as Perl's, except that there is
+no equivalent for PCRE2_DOLLAR_ENDONLY in Perl. In both PCRE2 and Perl, there
+is no way to stop newline from matching [^a].
 .P
-The default POSIX newline handling can be obtained by setting PCRE_DOTALL and
-PCRE_DOLLAR_ENDONLY, but there is no way to make PCRE behave exactly as for the
-REG_NEWLINE action.
+Default POSIX newline handling can be obtained by setting PCRE2_DOTALL and
+PCRE2_DOLLAR_ENDONLY when calling \fBpcre2_compile()\fP directly, but there is
+no way to make PCRE2 behave exactly as for the REG_NEWLINE action. When using
+the POSIX API, passing REG_NEWLINE to PCRE2's \fBregcomp()\fP function
+causes PCRE2_MULTILINE to be passed to \fBpcre2_compile()\fP, and REG_DOTALL
+passes PCRE2_DOTALL. There is no way to pass PCRE2_DOLLAR_ENDONLY.
 .
 .
 .SH "MATCHING A PATTERN"
@@ -183,18 +188,18 @@
 .sp
   REG_NOTBOL
 .sp
-The PCRE_NOTBOL option is set when calling the underlying PCRE matching
+The PCRE2_NOTBOL option is set when calling the underlying PCRE2 matching
 function.
 .sp
   REG_NOTEMPTY
 .sp
-The PCRE_NOTEMPTY option is set when calling the underlying PCRE matching
+The PCRE2_NOTEMPTY option is set when calling the underlying PCRE2 matching
 function. Note that REG_NOTEMPTY is not part of the POSIX standard. However,
 setting this option can give more POSIX-like behaviour in some situations.
 .sp
   REG_NOTEOL
 .sp
-The PCRE_NOTEOL option is set when calling the underlying PCRE matching
+The PCRE2_NOTEOL option is set when calling the underlying PCRE2 matching
 function.
 .sp
   REG_STARTEND
@@ -206,7 +211,8 @@
 IEEE Standard 1003.2 (POSIX.2), and should be used with caution in software
 intended to be portable to other systems. Note that a non-zero \fIrm_so\fP does
 not imply REG_NOTBOL; REG_STARTEND affects only the location of the string, not
-how it is matched.
+how it is matched. Setting REG_STARTEND and passing \fIpmatch\fP as NULL are
+mutually exclusive; the error REG_INVARG is returned.
 .P
 If the pattern was compiled with the REG_NOSUB flag, no data about any matched
 strings is returned. The \fInmatch\fP and \fIpmatch\fP arguments of
@@ -218,7 +224,7 @@
 Otherwise,the portion of the string that was matched, and also any captured
 substrings, are returned via the \fIpmatch\fP argument, which points to an
 array of \fInmatch\fP structures of type \fIregmatch_t\fP, containing the
-members \fIrm_so\fP and \fIrm_eo\fP. These contain the offset to the first
+members \fIrm_so\fP and \fIrm_eo\fP. These contain the byte offset to the first
 character of each substring and the offset to the first character after the end
 of each substring, respectively. The 0th element of the vector relates to the
 entire portion of \fIstring\fP that was matched; subsequent elements relate to
@@ -235,9 +241,11 @@
 The \fBregerror()\fP function maps a non-zero errorcode from either
 \fBregcomp()\fP or \fBregexec()\fP to a printable message. If \fIpreg\fP is not
 NULL, the error should have arisen from the use of that structure. A message
-terminated by a binary zero is placed in \fIerrbuf\fP. The length of the
-message, including the zero, is limited to \fIerrbuf_size\fP. The yield of the
-function is the size of buffer needed to hold the whole message.
+terminated by a binary zero is placed in \fIerrbuf\fP. If the buffer is too
+short, only the first \fIerrbuf_size\fP - 1 characters of the error message are
+used. The yield of the function is the size of buffer needed to hold the whole
+message, including the terminating zero. This value is greater than
+\fIerrbuf_size\fP if the message was truncated.
 .
 .
 .SH MEMORY USAGE
@@ -254,7 +262,7 @@
 .nf
 Philip Hazel
 University Computing Service
-Cambridge CB2 3QH, England.
+Cambridge, England.
 .fi
 .
 .
@@ -262,6 +270,6 @@
 .rs
 .sp
 .nf
-Last updated: 09 January 2012
-Copyright (c) 1997-2012 University of Cambridge.
+Last updated: 29 November 2015
+Copyright (c) 1997-2015 University of Cambridge.
 .fi
diff --git a/dist2/doc/pcre2sample.3 b/dist2/doc/pcre2sample.3
new file mode 100644
index 0000000..7b46935
--- /dev/null
+++ b/dist2/doc/pcre2sample.3
@@ -0,0 +1,94 @@
+.TH PCRE2SAMPLE 3 "20 October 2014" "PCRE2 10.00"
+.SH NAME
+PCRE2 - Perl-compatible regular expressions (revised API)
+.SH "PCRE2 SAMPLE PROGRAM"
+.rs
+.sp
+A simple, complete demonstration program to get you started with using PCRE2 is
+supplied in the file \fIpcre2demo.c\fP in the \fBsrc\fP directory in the PCRE2
+distribution. A listing of this program is given in the
+.\" HREF
+\fBpcre2demo\fP
+.\"
+documentation. If you do not have a copy of the PCRE2 distribution, you can
+save this listing to re-create the contents of \fIpcre2demo.c\fP.
+.P
+The demonstration program, which uses the PCRE2 8-bit library, compiles the
+regular expression that is its first argument, and matches it against the
+subject string in its second argument. No PCRE2 options are set, and default
+character tables are used. If matching succeeds, the program outputs the
+portion of the subject that matched, together with the contents of any captured
+substrings.
+.P
+If the -g option is given on the command line, the program then goes on to
+check for further matches of the same regular expression in the same subject
+string. The logic is a little bit tricky because of the possibility of matching
+an empty string. Comments in the code explain what is going on.
+.P
+If PCRE2 is installed in the standard include and library directories for your
+operating system, you should be able to compile the demonstration program using
+this command:
+.sp
+  gcc -o pcre2demo pcre2demo.c -lpcre2-8
+.sp
+If PCRE2 is installed elsewhere, you may need to add additional options to the
+command line. For example, on a Unix-like system that has PCRE2 installed in
+\fI/usr/local\fP, you can compile the demonstration program using a command
+like this:
+.sp
+.\" JOINSH
+  gcc -o pcre2demo -I/usr/local/include pcre2demo.c \e
+      -L/usr/local/lib -lpcre2-8
+.sp
+.P
+Once you have compiled and linked the demonstration program, you can run simple
+tests like this:
+.sp
+  ./pcre2demo 'cat|dog' 'the cat sat on the mat'
+  ./pcre2demo -g 'cat|dog' 'the dog sat on the cat'
+.sp
+Note that there is a much more comprehensive test program, called
+.\" HREF
+\fBpcre2test\fP,
+.\"
+which supports many more facilities for testing regular expressions using the
+PCRE2 libraries. The
+.\" HREF
+\fBpcre2demo\fP
+.\"
+program is provided as a simple coding example.
+.P
+If you try to run
+.\" HREF
+\fBpcre2demo\fP
+.\"
+when PCRE2 is not installed in the standard library directory, you may get an
+error like this on some operating systems (e.g. Solaris):
+.sp
+  ld.so.1: a.out: fatal: libpcre2.so.0: open failed: No such file or directory
+.sp
+This is caused by the way shared library support works on those systems. You
+need to add
+.sp
+  -R/usr/local/lib
+.sp
+(for example) to the compile command to get round this problem.
+.
+.
+.SH AUTHOR
+.rs
+.sp
+.nf
+Philip Hazel
+University Computing Service
+Cambridge, England.
+.fi
+.
+.
+.SH REVISION
+.rs
+.sp
+.nf
+Last updated: 20 October 2014
+Copyright (c) 1997-2014 University of Cambridge.
+.fi
diff --git a/dist2/doc/pcre2serialize.3 b/dist2/doc/pcre2serialize.3
new file mode 100644
index 0000000..69bcb18
--- /dev/null
+++ b/dist2/doc/pcre2serialize.3
@@ -0,0 +1,175 @@
+.TH PCRE2SERIALIZE 3 "03 November 2015" "PCRE2 10.21"
+.SH NAME
+PCRE2 - Perl-compatible regular expressions (revised API)
+.SH "SAVING AND RE-USING PRECOMPILED PCRE2 PATTERNS"
+.rs
+.sp
+.nf
+.B int32_t pcre2_serialize_decode(pcre2_code **\fIcodes\fP,
+.B "  int32_t \fInumber_of_codes\fP, const uint32_t *\fIbytes\fP,"
+.B "  pcre2_general_context *\fIgcontext\fP);"
+.sp
+.B int32_t pcre2_serialize_encode(pcre2_code **\fIcodes\fP,
+.B "  int32_t \fInumber_of_codes\fP, uint32_t **\fIserialized_bytes\fP,"
+.B "  PCRE2_SIZE *\fIserialized_size\fP, pcre2_general_context *\fIgcontext\fP);"
+.sp
+.B void pcre2_serialize_free(uint8_t *\fIbytes\fP);
+.sp
+.B int32_t pcre2_serialize_get_number_of_codes(const uint8_t *\fIbytes\fP);
+.fi
+.sp
+If you are running an application that uses a large number of regular
+expression patterns, it may be useful to store them in a precompiled form
+instead of having to compile them every time the application is run. However,
+if you are using the just-in-time optimization feature, it is not possible to
+save and reload the JIT data, because it is position-dependent. The host on
+which the patterns are reloaded must be running the same version of PCRE2, with
+the same code unit width, and must also have the same endianness, pointer width
+and PCRE2_SIZE type. For example, patterns compiled on a 32-bit system using
+PCRE2's 16-bit library cannot be reloaded on a 64-bit system, nor can they be
+reloaded using the 8-bit library.
+.
+.
+.SH "SAVING COMPILED PATTERNS"
+.rs
+.sp
+Before compiled patterns can be saved they must be serialized, that is,
+converted to a stream of bytes. A single byte stream may contain any number of
+compiled patterns, but they must all use the same character tables. A single
+copy of the tables is included in the byte stream (its size is 1088 bytes). For
+more details of character tables, see the
+.\" HTML <a href="pcre2api.html#localesupport">
+.\" </a>
+section on locale support
+.\"
+in the
+.\" HREF
+\fBpcre2api\fP
+.\"
+documentation.
+.P
+The function \fBpcre2_serialize_encode()\fP creates a serialized byte stream
+from a list of compiled patterns. Its first two arguments specify the list,
+being a pointer to a vector of pointers to compiled patterns, and the length of
+the vector. The third and fourth arguments point to variables which are set to
+point to the created byte stream and its length, respectively. The final
+argument is a pointer to a general context, which can be used to specify custom
+memory mangagement functions. If this argument is NULL, \fBmalloc()\fP is used
+to obtain memory for the byte stream. The yield of the function is the number
+of serialized patterns, or one of the following negative error codes:
+.sp
+  PCRE2_ERROR_BADDATA      the number of patterns is zero or less
+  PCRE2_ERROR_BADMAGIC     mismatch of id bytes in one of the patterns
+  PCRE2_ERROR_MEMORY       memory allocation failed
+  PCRE2_ERROR_MIXEDTABLES  the patterns do not all use the same tables
+  PCRE2_ERROR_NULL         the 1st, 3rd, or 4th argument is NULL
+.sp
+PCRE2_ERROR_BADMAGIC means either that a pattern's code has been corrupted, or
+that a slot in the vector does not point to a compiled pattern.
+.P
+Once a set of patterns has been serialized you can save the data in any
+appropriate manner. Here is sample code that compiles two patterns and writes
+them to a file. It assumes that the variable \fIfd\fP refers to a file that is
+open for output. The error checking that should be present in a real
+application has been omitted for simplicity.
+.sp
+  int errorcode;
+  uint8_t *bytes;
+  PCRE2_SIZE erroroffset;
+  PCRE2_SIZE bytescount;
+  pcre2_code *list_of_codes[2];
+  list_of_codes[0] = pcre2_compile("first pattern",
+    PCRE2_ZERO_TERMINATED, 0, &errorcode, &erroroffset, NULL);
+  list_of_codes[1] = pcre2_compile("second pattern",
+    PCRE2_ZERO_TERMINATED, 0, &errorcode, &erroroffset, NULL);
+  errorcode = pcre2_serialize_encode(list_of_codes, 2, &bytes,
+    &bytescount, NULL);
+  errorcode = fwrite(bytes, 1, bytescount, fd);
+.sp
+Note that the serialized data is binary data that may contain any of the 256
+possible byte values. On systems that make a distinction between binary and
+non-binary data, be sure that the file is opened for binary output.
+.P
+Serializing a set of patterns leaves the original data untouched, so they can
+still be used for matching. Their memory must eventually be freed in the usual
+way by calling \fBpcre2_code_free()\fP. When you have finished with the byte
+stream, it too must be freed by calling \fBpcre2_serialize_free()\fP.
+.
+.
+.SH "RE-USING PRECOMPILED PATTERNS"
+.rs
+.sp
+In order to re-use a set of saved patterns you must first make the serialized
+byte stream available in main memory (for example, by reading from a file). The
+management of this memory block is up to the application. You can use the
+\fBpcre2_serialize_get_number_of_codes()\fP function to find out how many
+compiled patterns are in the serialized data without actually decoding the
+patterns:
+.sp
+  uint8_t *bytes = <serialized data>;
+  int32_t number_of_codes = pcre2_serialize_get_number_of_codes(bytes);
+.sp
+The \fBpcre2_serialize_decode()\fP function reads a byte stream and recreates
+the compiled patterns in new memory blocks, setting pointers to them in a
+vector. The first two arguments are a pointer to a suitable vector and its
+length, and the third argument points to a byte stream. The final argument is a
+pointer to a general context, which can be used to specify custom memory
+mangagement functions for the decoded patterns. If this argument is NULL,
+\fBmalloc()\fP and \fBfree()\fP are used. After deserialization, the byte
+stream is no longer needed and can be discarded.
+.sp
+  int32_t number_of_codes;
+  pcre2_code *list_of_codes[2];
+  uint8_t *bytes = <serialized data>;
+  int32_t number_of_codes =
+    pcre2_serialize_decode(list_of_codes, 2, bytes, NULL);
+.sp
+If the vector is not large enough for all the patterns in the byte stream, it
+is filled with those that fit, and the remainder are ignored. The yield of the
+function is the number of decoded patterns, or one of the following negative
+error codes:
+.sp
+  PCRE2_ERROR_BADDATA   second argument is zero or less
+  PCRE2_ERROR_BADMAGIC  mismatch of id bytes in the data
+  PCRE2_ERROR_BADMODE   mismatch of variable unit size or PCRE2 version
+  PCRE2_ERROR_MEMORY    memory allocation failed
+  PCRE2_ERROR_NULL      first or third argument is NULL
+.sp
+PCRE2_ERROR_BADMAGIC may mean that the data is corrupt, or that it was compiled
+on a system with different endianness.
+.P
+Decoded patterns can be used for matching in the usual way, and must be freed
+by calling \fBpcre2_code_free()\fP. However, be aware that there is a potential
+race issue if you are using multiple patterns that were decoded from a single
+byte stream in a multithreaded application. A single copy of the character
+tables is used by all the decoded patterns and a reference count is used to
+arrange for its memory to be automatically freed when the last pattern is
+freed, but there is no locking on this reference count. Therefore, if you want
+to call \fBpcre2_code_free()\fP for these patterns in different threads, you
+must arrange your own locking, and ensure that \fBpcre2_code_free()\fP cannot
+be called by two threads at the same time.
+.P
+If a pattern was processed by \fBpcre2_jit_compile()\fP before being
+serialized, the JIT data is discarded and so is no longer available after a
+save/restore cycle. You can, however, process a restored pattern with
+\fBpcre2_jit_compile()\fP if you wish.
+.
+.
+.
+.SH AUTHOR
+.rs
+.sp
+.nf
+Philip Hazel
+University Computing Service
+Cambridge, England.
+.fi
+.
+.
+.SH REVISION
+.rs
+.sp
+.nf
+Last updated: 03 November 2015
+Copyright (c) 1997-2015 University of Cambridge.
+.fi
diff --git a/dist2/doc/pcre2stack.3 b/dist2/doc/pcre2stack.3
new file mode 100644
index 0000000..8711263
--- /dev/null
+++ b/dist2/doc/pcre2stack.3
@@ -0,0 +1,202 @@
+.TH PCRE2STACK 3 "21 November 2014" "PCRE2 10.00"
+.SH NAME
+PCRE2 - Perl-compatible regular expressions (revised API)
+.SH "PCRE2 DISCUSSION OF STACK USAGE"
+.rs
+.sp
+When you call \fBpcre2_match()\fP, it makes use of an internal function called
+\fBmatch()\fP. This calls itself recursively at branch points in the pattern,
+in order to remember the state of the match so that it can back up and try a
+different alternative after a failure. As matching proceeds deeper and deeper
+into the tree of possibilities, the recursion depth increases. The
+\fBmatch()\fP function is also called in other circumstances, for example,
+whenever a parenthesized sub-pattern is entered, and in certain cases of
+repetition.
+.P
+Not all calls of \fBmatch()\fP increase the recursion depth; for an item such
+as a* it may be called several times at the same level, after matching
+different numbers of a's. Furthermore, in a number of cases where the result of
+the recursive call would immediately be passed back as the result of the
+current call (a "tail recursion"), the function is just restarted instead.
+.P
+Each time the internal \fBmatch()\fP function is called recursively, it uses
+memory from the process stack. For certain kinds of pattern and data, very
+large amounts of stack may be needed, despite the recognition of "tail
+recursion". Note that if PCRE2 is compiled with the -fsanitize=address option
+of the GCC compiler, the stack requirements are greatly increased.
+.P
+The above comments apply when \fBpcre2_match()\fP is run in its normal
+interpretive manner. If the compiled pattern was processed by
+\fBpcre2_jit_compile()\fP, and just-in-time compiling was successful, and the
+options passed to \fBpcre2_match()\fP were not incompatible, the matching
+process uses the JIT-compiled code instead of the \fBmatch()\fP function. In
+this case, the memory requirements are handled entirely differently. See the
+.\" HREF
+\fBpcre2jit\fP
+.\"
+documentation for details.
+.P
+The \fBpcre2_dfa_match()\fP function operates in a different way to
+\fBpcre2_match()\fP, and uses recursion only when there is a regular expression
+recursion or subroutine call in the pattern. This includes the processing of
+assertion and "once-only" subpatterns, which are handled like subroutine calls.
+Normally, these are never very deep, and the limit on the complexity of
+\fBpcre2_dfa_match()\fP is controlled by the amount of workspace it is given.
+However, it is possible to write patterns with runaway infinite recursions;
+such patterns will cause \fBpcre2_dfa_match()\fP to run out of stack. At
+present, there is no protection against this.
+.P
+The comments that follow do NOT apply to \fBpcre2_dfa_match()\fP; they are
+relevant only for \fBpcre2_match()\fP without the JIT optimization.
+.
+.
+.SS "Reducing \fBpcre2_match()\fP's stack usage"
+.rs
+.sp
+You can often reduce the amount of recursion, and therefore the
+amount of stack used, by modifying the pattern that is being matched. Consider,
+for example, this pattern:
+.sp
+  ([^<]|<(?!inet))+
+.sp
+It matches from wherever it starts until it encounters "<inet" or the end of
+the data, and is the kind of pattern that might be used when processing an XML
+file. Each iteration of the outer parentheses matches either one character that
+is not "<" or a "<" that is not followed by "inet". However, each time a
+parenthesis is processed, a recursion occurs, so this formulation uses a stack
+frame for each matched character. For a long string, a lot of stack is
+required. Consider now this rewritten pattern, which matches exactly the same
+strings:
+.sp
+  ([^<]++|<(?!inet))+
+.sp
+This uses very much less stack, because runs of characters that do not contain
+"<" are "swallowed" in one item inside the parentheses. Recursion happens only
+when a "<" character that is not followed by "inet" is encountered (and we
+assume this is relatively rare). A possessive quantifier is used to stop any
+backtracking into the runs of non-"<" characters, but that is not related to
+stack usage.
+.P
+This example shows that one way of avoiding stack problems when matching long
+subject strings is to write repeated parenthesized subpatterns to match more
+than one character whenever possible.
+.
+.
+.SS "Compiling PCRE2 to use heap instead of stack for \fBpcre2_match()\fP"
+.rs
+.sp
+In environments where stack memory is constrained, you might want to compile
+PCRE2 to use heap memory instead of stack for remembering back-up points when
+\fBpcre2_match()\fP is running. This makes it run more slowly, however. Details
+of how to do this are given in the
+.\" HREF
+\fBpcre2build\fP
+.\"
+documentation. When built in this way, instead of using the stack, PCRE2
+gets memory for remembering backup points from the heap. By default, the memory
+is obtained by calling the system \fBmalloc()\fP function, but you can arrange
+to supply your own memory management function. For details, see the section
+entitled
+.\" HTML <a href="pcre2api.html#matchcontext">
+.\" </a>
+"The match context"
+.\"
+in the
+.\" HREF
+\fBpcre2api\fP
+.\"
+documentation. Since the block sizes are always the same, it may be possible to
+implement customized a memory handler that is more efficient than the standard
+function. The memory blocks obtained for this purpose are retained and re-used
+if possible while \fBpcre2_match()\fP is running. They are all freed just
+before it exits.
+.
+.
+.SS "Limiting \fBpcre2_match()\fP's stack usage"
+.rs
+.sp
+You can set limits on the number of times the internal \fBmatch()\fP function
+is called, both in total and recursively. If a limit is exceeded,
+\fBpcre2_match()\fP returns an error code. Setting suitable limits should
+prevent it from running out of stack. The default values of the limits are very
+large, and unlikely ever to operate. They can be changed when PCRE2 is built,
+and they can also be set when \fBpcre2_match()\fP is called. For details of
+these interfaces, see the
+.\" HREF
+\fBpcre2build\fP
+.\"
+documentation and the section entitled
+.\" HTML <a href="pcre2api.html#matchcontext">
+.\" </a>
+"The match context"
+.\"
+in the
+.\" HREF
+\fBpcre2api\fP
+.\"
+documentation.
+.P
+As a very rough rule of thumb, you should reckon on about 500 bytes per
+recursion. Thus, if you want to limit your stack usage to 8Mb, you should set
+the limit at 16000 recursions. A 64Mb stack, on the other hand, can support
+around 128000 recursions.
+.P
+The \fBpcre2test\fP test program has a modifier called "find_limits" which, if
+applied to a subject line, causes it to find the smallest limits that allow a a
+pattern to match. This is done by calling \fBpcre2_match()\fP repeatedly with
+different limits.
+.
+.
+.SS "Changing stack size in Unix-like systems"
+.rs
+.sp
+In Unix-like environments, there is not often a problem with the stack unless
+very long strings are involved, though the default limit on stack size varies
+from system to system. Values from 8Mb to 64Mb are common. You can find your
+default limit by running the command:
+.sp
+  ulimit -s
+.sp
+Unfortunately, the effect of running out of stack is often SIGSEGV, though
+sometimes a more explicit error message is given. You can normally increase the
+limit on stack size by code such as this:
+.sp
+  struct rlimit rlim;
+  getrlimit(RLIMIT_STACK, &rlim);
+  rlim.rlim_cur = 100*1024*1024;
+  setrlimit(RLIMIT_STACK, &rlim);
+.sp
+This reads the current limits (soft and hard) using \fBgetrlimit()\fP, then
+attempts to increase the soft limit to 100Mb using \fBsetrlimit()\fP. You must
+do this before calling \fBpcre2_match()\fP.
+.
+.
+.SS "Changing stack size in Mac OS X"
+.rs
+.sp
+Using \fBsetrlimit()\fP, as described above, should also work on Mac OS X. It
+is also possible to set a stack size when linking a program. There is a
+discussion about stack sizes in Mac OS X at this web site:
+.\" HTML <a href="http://developer.apple.com/qa/qa2005/qa1419.html">
+.\" </a>
+http://developer.apple.com/qa/qa2005/qa1419.html.
+.\"
+.
+.
+.SH AUTHOR
+.rs
+.sp
+.nf
+Philip Hazel
+University Computing Service
+Cambridge, England.
+.fi
+.
+.
+.SH REVISION
+.rs
+.sp
+.nf
+Last updated: 21 November 2014
+Copyright (c) 1997-2014 University of Cambridge.
+.fi
diff --git a/dist/doc/pcresyntax.3 b/dist2/doc/pcre2syntax.3
similarity index 70%
rename from dist/doc/pcresyntax.3
rename to dist2/doc/pcre2syntax.3
index 0850369..8be8b92 100644
--- a/dist/doc/pcresyntax.3
+++ b/dist2/doc/pcre2syntax.3
@@ -1,13 +1,13 @@
-.TH PCRESYNTAX 3 "08 January 2014" "PCRE 8.35"
+.TH PCRE2SYNTAX 3 "16 October 2015" "PCRE2 10.21"
 .SH NAME
-PCRE - Perl-compatible regular expressions
-.SH "PCRE REGULAR EXPRESSION SYNTAX SUMMARY"
+PCRE2 - Perl-compatible regular expressions (revised API)
+.SH "PCRE2 REGULAR EXPRESSION SYNTAX SUMMARY"
 .rs
 .sp
 The full syntax and semantics of the regular expressions that are supported by
-PCRE are described in the
+PCRE2 are described in the
 .\" HREF
-\fBpcrepattern\fP
+\fBpcre2pattern\fP
 .\"
 documentation. This document contains a quick-reference summary of the syntax.
 .
@@ -19,11 +19,13 @@
   \eQ...\eE    treat enclosed characters as literal
 .
 .
-.SH "CHARACTERS"
+.SH "ESCAPED CHARACTERS"
 .rs
 .sp
+This table applies to ASCII and Unicode environments.
+.sp
   \ea         alarm, that is, the BEL character (hex 07)
-  \ecx        "control-x", where x is any ASCII character
+  \ecx        "control-x", where x is any ASCII printing character
   \ee         escape (hex 1B)
   \ef         form feed (hex 0C)
   \en         newline (hex 0A)
@@ -32,11 +34,29 @@
   \e0dd       character with octal code 0dd
   \eddd       character with octal code ddd, or backreference
   \eo{ddd..}  character with octal code ddd..
+  \eU         "U" if PCRE2_ALT_BSUX is set (otherwise is an error)
+  \euhhhh     character with hex code hhhh (if PCRE2_ALT_BSUX is set)
   \exhh       character with hex code hh
   \ex{hhh..}  character with hex code hhh..
 .sp
-Note that \e0dd is always an octal code, and that \e8 and \e9 are the literal
-characters "8" and "9".
+Note that \e0dd is always an octal code. The treatment of backslash followed by
+a non-zero digit is complicated; for details see the section
+.\" HTML <a href="pcre2pattern.html#digitsafterbackslash">
+.\" </a>
+"Non-printing characters"
+.\"
+in the
+.\" HREF
+\fBpcre2pattern\fP
+.\"
+documentation, where details of escape processing in EBCDIC environments are
+also given.
+.P
+When \ex is not followed by {, from zero to two hexadecimal digits are read,
+but if PCRE2_ALT_BSUX is set, \ex must be followed by two hexadecimal digits to
+be recognized as a hexadecimal escape; otherwise it matches a literal "x".
+Likewise, if \eu (in ALT_BSUX mode) is not followed by four hexadecimal digits,
+it matches a literal "u".
 .
 .
 .SH "CHARACTER TYPES"
@@ -44,7 +64,7 @@
 .sp
   .          any character except newline;
                in dotall mode, any character whatsoever
-  \eC         one data unit, even in UTF mode (best avoided)
+  \eC         one code unit, even in UTF mode (best avoided)
   \ed         a decimal digit
   \eD         a character that is not a decimal digit
   \eh         a horizontal white space character
@@ -61,11 +81,17 @@
   \eW         a "non-word" character
   \eX         a Unicode extended grapheme cluster
 .sp
+\eC is dangerous because it may leave the current matching point in the middle
+of a UTF-8 or UTF-16 character. The application can lock out the use of \eC by
+setting the PCRE2_NEVER_BACKSLASH_C option. It is also possible to build PCRE2
+with the use of \eC permanently disabled.
+.P
 By default, \ed, \es, and \ew match only ASCII characters, even in UTF-8 mode
-or in the 16- bit and 32-bit libraries. However, if locale-specific matching is
+or in the 16-bit and 32-bit libraries. However, if locale-specific matching is
 happening, \es and \ew may also match characters with code points in the range
-128-255. If the PCRE_UCP option is set, the behaviour of these escape sequences
-is changed to use Unicode properties and they match many more characters.
+128-255. If the PCRE2_UCP option is set, the behaviour of these escape
+sequences is changed to use Unicode properties and they match many more
+characters.
 .
 .
 .SH "GENERAL CATEGORY PROPERTIES FOR \ep and \eP"
@@ -117,7 +143,7 @@
   Zs         Space separator
 .
 .
-.SH "PCRE SPECIAL CATEGORY PROPERTIES FOR \ep and \eP"
+.SH "PCRE2 SPECIAL CATEGORY PROPERTIES FOR \ep and \eP"
 .rs
 .sp
   Xan        Alphanumeric: union of properties L and N
@@ -128,12 +154,14 @@
   Xwd        Perl word: property Xan or underscore
 .sp
 Perl and POSIX space are now the same. Perl added VT to its space character set
-at release 5.18 and PCRE changed at release 8.34.
+at release 5.18.
 .
 .
 .SH "SCRIPT NAMES FOR \ep AND \eP"
 .rs
 .sp
+Ahom,
+Anatolian_Hieroglyphs,
 Arabic,
 Armenian,
 Avestan,
@@ -174,6 +202,7 @@
 Han,
 Hangul,
 Hanunoo,
+Hatran,
 Hebrew,
 Hiragana,
 Imperial_Aramaic,
@@ -210,12 +239,14 @@
 Modi,
 Mongolian,
 Mro,
+Multani,
 Myanmar,
 Nabataean,
 New_Tai_Lue,
 Nko,
 Ogham,
 Ol_Chiki,
+Old_Hungarian,
 Old_Italic,
 Old_North_Arabian,
 Old_Permic,
@@ -237,6 +268,7 @@
 Sharada,
 Shavian,
 Siddham,
+SignWriting,
 Sinhala,
 Sora_Sompeng,
 Sundanese,
@@ -285,8 +317,8 @@
   word        same as \ew
   xdigit      hexadecimal digit
 .sp
-In PCRE, POSIX character set names recognize only ASCII characters by default,
-but some of them use Unicode properties if PCRE_UCP is set. You can use
+In PCRE2, POSIX character set names recognize only ASCII characters by default,
+but some of them use Unicode properties if PCRE2_UCP is set. You can use
 \eQ...\eE inside a character class.
 .
 .
@@ -317,13 +349,14 @@
   \eb          word boundary
   \eB          not a word boundary
   ^           start of subject
-               also after internal newline in multiline mode
+                also after an internal newline in multiline mode
+                (after any newline if PCRE2_ALT_CIRCUMFLEX is set)
   \eA          start of subject
   $           end of subject
-               also before newline at end of subject
-               also before internal newline in multiline mode
+                also before newline at end of subject
+                also before internal newline in multiline mode
   \eZ          end of subject
-               also before newline at end of subject
+                also before newline at end of subject
   \ez          end of subject
   \eG          first matching position in subject
 .
@@ -385,16 +418,19 @@
 .sp
   (*LIMIT_MATCH=d) set the match limit to d (decimal number)
   (*LIMIT_RECURSION=d) set the recursion limit to d (decimal number)
-  (*NO_AUTO_POSSESS) no auto-possessification (PCRE_NO_AUTO_POSSESS)
-  (*NO_START_OPT) no start-match optimization (PCRE_NO_START_OPTIMIZE)
-  (*UTF8)         set UTF-8 mode: 8-bit library (PCRE_UTF8)
-  (*UTF16)        set UTF-16 mode: 16-bit library (PCRE_UTF16)
-  (*UTF32)        set UTF-32 mode: 32-bit library (PCRE_UTF32)
+  (*NOTEMPTY)     set PCRE2_NOTEMPTY when matching
+  (*NOTEMPTY_ATSTART) set PCRE2_NOTEMPTY_ATSTART when matching
+  (*NO_AUTO_POSSESS) no auto-possessification (PCRE2_NO_AUTO_POSSESS)
+  (*NO_DOTSTAR_ANCHOR) no .* anchoring (PCRE2_NO_DOTSTAR_ANCHOR)
+  (*NO_JIT)       disable JIT optimization
+  (*NO_START_OPT) no start-match optimization (PCRE2_NO_START_OPTIMIZE)
   (*UTF)          set appropriate UTF mode for the library in use
-  (*UCP)          set PCRE_UCP (use Unicode properties for \ed etc)
+  (*UCP)          set PCRE2_UCP (use Unicode properties for \ed etc)
 .sp
 Note that LIMIT_MATCH and LIMIT_RECURSION can only reduce the value of the
-limits set by the caller of pcre_exec(), not increase them.
+limits set by the caller of pcre2_match(), not increase them. The application
+can lock out the use of (*UTF) and (*UCP) by setting the PCRE2_NEVER_UTF or
+PCRE2_NEVER_UCP options, respectively, at compile time.
 .
 .
 .SH "NEWLINE CONVENTION"
@@ -458,10 +494,10 @@
   \eg'name'        call subpattern by name (Oniguruma)
   \eg<n>           call subpattern by absolute number (Oniguruma)
   \eg'n'           call subpattern by absolute number (Oniguruma)
-  \eg<+n>          call subpattern by relative number (PCRE extension)
-  \eg'+n'          call subpattern by relative number (PCRE extension)
-  \eg<-n>          call subpattern by relative number (PCRE extension)
-  \eg'-n'          call subpattern by relative number (PCRE extension)
+  \eg<+n>          call subpattern by relative number (PCRE2 extension)
+  \eg'+n'          call subpattern by relative number (PCRE2 extension)
+  \eg<-n>          call subpattern by relative number (PCRE2 extension)
+  \eg'-n'          call subpattern by relative number (PCRE2 extension)
 .
 .
 .SH "CONDITIONAL PATTERNS"
@@ -470,17 +506,18 @@
   (?(condition)yes-pattern)
   (?(condition)yes-pattern|no-pattern)
 .sp
-  (?(n)...        absolute reference condition
-  (?(+n)...       relative reference condition
-  (?(-n)...       relative reference condition
-  (?(<name>)...   named reference condition (Perl)
-  (?('name')...   named reference condition (Perl)
-  (?(name)...     named reference condition (PCRE)
-  (?(R)...        overall recursion condition
-  (?(Rn)...       specific group recursion condition
-  (?(R&name)...   specific recursion condition
-  (?(DEFINE)...   define subpattern for reference
-  (?(assert)...   assertion condition
+  (?(n)               absolute reference condition
+  (?(+n)              relative reference condition
+  (?(-n)              relative reference condition
+  (?(<name>)          named reference condition (Perl)
+  (?('name')          named reference condition (Perl)
+  (?(name)            named reference condition (PCRE2)
+  (?(R)               overall recursion condition
+  (?(Rn)              specific group recursion condition
+  (?(R&name)          specific recursion condition
+  (?(DEFINE)          define subpattern for reference
+  (?(VERSION[>]=n.m)  test PCRE2 version
+  (?(assert)          assertion condition
 .
 .
 .SH "BACKTRACKING CONTROL"
@@ -510,15 +547,20 @@
 .SH "CALLOUTS"
 .rs
 .sp
-  (?C)      callout
-  (?Cn)     callout with data n
+  (?C)            callout (assumed number 0)
+  (?Cn)           callout with numerical data n
+  (?C"text")      callout with string data
+.sp
+The allowed string delimiters are ` ' " ^ % # $ (which are the same for the
+start and the end), and the starting delimiter { matched with the ending
+delimiter }. To encode the ending delimiter within the string, double it.
 .
 .
 .SH "SEE ALSO"
 .rs
 .sp
-\fBpcrepattern\fP(3), \fBpcreapi\fP(3), \fBpcrecallout\fP(3),
-\fBpcrematching\fP(3), \fBpcre\fP(3).
+\fBpcre2pattern\fP(3), \fBpcre2api\fP(3), \fBpcre2callout\fP(3),
+\fBpcre2matching\fP(3), \fBpcre2\fP(3).
 .
 .
 .SH AUTHOR
@@ -527,7 +569,7 @@
 .nf
 Philip Hazel
 University Computing Service
-Cambridge CB2 3QH, England.
+Cambridge, England.
 .fi
 .
 .
@@ -535,6 +577,6 @@
 .rs
 .sp
 .nf
-Last updated: 08 January 2014
-Copyright (c) 1997-2014 University of Cambridge.
+Last updated: 16 October 2015
+Copyright (c) 1997-2015 University of Cambridge.
 .fi
diff --git a/dist2/doc/pcre2test.1 b/dist2/doc/pcre2test.1
new file mode 100644
index 0000000..b8eef93
--- /dev/null
+++ b/dist2/doc/pcre2test.1
@@ -0,0 +1,1645 @@
+.TH PCRE2TEST 1 "12 December 2015" "PCRE 10.21"
+.SH NAME
+pcre2test - a program for testing Perl-compatible regular expressions.
+.SH SYNOPSIS
+.rs
+.sp
+.B pcre2test "[options] [input file [output file]]"
+.sp
+\fBpcre2test\fP is a test program for the PCRE2 regular expression libraries,
+but it can also be used for experimenting with regular expressions. This
+document describes the features of the test program; for details of the regular
+expressions themselves, see the
+.\" HREF
+\fBpcre2pattern\fP
+.\"
+documentation. For details of the PCRE2 library function calls and their
+options, see the
+.\" HREF
+\fBpcre2api\fP
+.\"
+documentation.
+.P
+The input for \fBpcre2test\fP is a sequence of regular expression patterns and
+subject strings to be matched. There are also command lines for setting
+defaults and controlling some special actions. The output shows the result of
+each match attempt. Modifiers on external or internal command lines, the
+patterns, and the subject lines specify PCRE2 function options, control how the
+subject is processed, and what output is produced.
+.P
+As the original fairly simple PCRE library evolved, it acquired many different
+features, and as a result, the original \fBpcretest\fP program ended up with a
+lot of options in a messy, arcane syntax, for testing all the features. The
+move to the new PCRE2 API provided an opportunity to re-implement the test
+program as \fBpcre2test\fP, with a cleaner modifier syntax. Nevertheless, there
+are still many obscure modifiers, some of which are specifically designed for
+use in conjunction with the test script and data files that are distributed as
+part of PCRE2. All the modifiers are documented here, some without much
+justification, but many of them are unlikely to be of use except when testing
+the libraries.
+.
+.
+.SH "PCRE2's 8-BIT, 16-BIT AND 32-BIT LIBRARIES"
+.rs
+.sp
+Different versions of the PCRE2 library can be built to support character
+strings that are encoded in 8-bit, 16-bit, or 32-bit code units. One, two, or
+all three of these libraries may be simultaneously installed. The
+\fBpcre2test\fP program can be used to test all the libraries. However, its own
+input and output are always in 8-bit format. When testing the 16-bit or 32-bit
+libraries, patterns and subject strings are converted to 16- or 32-bit format
+before being passed to the library functions. Results are converted back to
+8-bit code units for output.
+.P
+In the rest of this document, the names of library functions and structures
+are given in generic form, for example, \fBpcre_compile()\fP. The actual
+names used in the libraries have a suffix _8, _16, or _32, as appropriate.
+.
+.
+.SH "INPUT ENCODING"
+.rs
+.sp
+Input to \fBpcre2test\fP is processed line by line, either by calling the C
+library's \fBfgets()\fP function, or via the \fBlibreadline\fP library (see
+below). The input is processed using using C's string functions, so must not
+contain binary zeroes, even though in Unix-like environments, \fBfgets()\fP
+treats any bytes other than newline as data characters. In some Windows
+environments character 26 (hex 1A) causes an immediate end of file, and no
+further data is read.
+.P
+For maximum portability, therefore, it is safest to avoid non-printing
+characters in \fBpcre2test\fP input files. There is a facility for specifying a
+pattern's characters as hexadecimal pairs, thus making it possible to include
+binary zeroes in a pattern for testing purposes. Subject lines are processed
+for backslash escapes, which makes it possible to include any data value.
+.
+.
+.SH "COMMAND LINE OPTIONS"
+.rs
+.TP 10
+\fB-8\fP
+If the 8-bit library has been built, this option causes it to be used (this is
+the default). If the 8-bit library has not been built, this option causes an
+error.
+.TP 10
+\fB-16\fP
+If the 16-bit library has been built, this option causes it to be used. If only
+the 16-bit library has been built, this is the default. If the 16-bit library
+has not been built, this option causes an error.
+.TP 10
+\fB-32\fP
+If the 32-bit library has been built, this option causes it to be used. If only
+the 32-bit library has been built, this is the default. If the 32-bit library
+has not been built, this option causes an error.
+.TP 10
+\fB-b\fP
+Behave as if each pattern has the \fB/fullbincode\fP modifier; the full
+internal binary form of the pattern is output after compilation.
+.TP 10
+\fB-C\fP
+Output the version number of the PCRE2 library, and all available information
+about the optional features that are included, and then exit with zero exit
+code. All other options are ignored.
+.TP 10
+\fB-C\fP \fIoption\fP
+Output information about a specific build-time option, then exit. This
+functionality is intended for use in scripts such as \fBRunTest\fP. The
+following options output the value and set the exit code as indicated:
+.sp
+  ebcdic-nl  the code for LF (= NL) in an EBCDIC environment:
+               0x15 or 0x25
+               0 if used in an ASCII environment
+               exit code is always 0
+  linksize   the configured internal link size (2, 3, or 4)
+               exit code is set to the link size
+  newline    the default newline setting:
+               CR, LF, CRLF, ANYCRLF, or ANY
+               exit code is always 0
+  bsr        the default setting for what \eR matches:
+               ANYCRLF or ANY
+               exit code is always 0
+.sp
+The following options output 1 for true or 0 for false, and set the exit code
+to the same value:
+.sp
+  backslash-C  \eC is supported (not locked out)
+  ebcdic       compiled for an EBCDIC environment
+  jit          just-in-time support is available
+  pcre2-16     the 16-bit library was built
+  pcre2-32     the 32-bit library was built
+  pcre2-8      the 8-bit library was built
+  unicode      Unicode support is available
+.sp
+If an unknown option is given, an error message is output; the exit code is 0.
+.TP 10
+\fB-d\fP
+Behave as if each pattern has the \fBdebug\fP modifier; the internal
+form and information about the compiled pattern is output after compilation;
+\fB-d\fP is equivalent to \fB-b -i\fP.
+.TP 10
+\fB-dfa\fP
+Behave as if each subject line has the \fBdfa\fP modifier; matching is done
+using the \fBpcre2_dfa_match()\fP function instead of the default
+\fBpcre2_match()\fP.
+.TP 10
+\fB-help\fP
+Output a brief summary these options and then exit.
+.TP 10
+\fB-i\fP
+Behave as if each pattern has the \fB/info\fP modifier; information about the
+compiled pattern is given after compilation.
+.TP 10
+\fB-jit\fP
+Behave as if each pattern line has the \fBjit\fP modifier; after successful
+compilation, each pattern is passed to the just-in-time compiler, if available.
+.TP 10
+\fB-pattern\fB \fImodifier-list\fP
+Behave as if each pattern line contains the given modifiers.
+.TP 10
+\fB-q\fP
+Do not output the version number of \fBpcre2test\fP at the start of execution.
+.TP 10
+\fB-S\fP \fIsize\fP
+On Unix-like systems, set the size of the run-time stack to \fIsize\fP
+megabytes.
+.TP 10
+\fB-subject\fP \fImodifier-list\fP
+Behave as if each subject line contains the given modifiers.
+.TP 10
+\fB-t\fP
+Run each compile and match many times with a timer, and output the resulting
+times per compile or match. When JIT is used, separate times are given for the
+initial compile and the JIT compile. You can control the number of iterations
+that are used for timing by following \fB-t\fP with a number (as a separate
+item on the command line). For example, "-t 1000" iterates 1000 times. The
+default is to iterate 500,000 times.
+.TP 10
+\fB-tm\fP
+This is like \fB-t\fP except that it times only the matching phase, not the
+compile phase.
+.TP 10
+\fB-T\fP \fB-TM\fP
+These behave like \fB-t\fP and \fB-tm\fP, but in addition, at the end of a run,
+the total times for all compiles and matches are output.
+.TP 10
+\fB-version\fP
+Output the PCRE2 version number and then exit.
+.
+.
+.SH "DESCRIPTION"
+.rs
+.sp
+If \fBpcre2test\fP is given two filename arguments, it reads from the first and
+writes to the second. If the first name is "-", input is taken from the
+standard input. If \fBpcre2test\fP is given only one argument, it reads from
+that file and writes to stdout. Otherwise, it reads from stdin and writes to
+stdout.
+.P
+When \fBpcre2test\fP is built, a configuration option can specify that it
+should be linked with the \fBlibreadline\fP or \fBlibedit\fP library. When this
+is done, if the input is from a terminal, it is read using the \fBreadline()\fP
+function. This provides line-editing and history facilities. The output from
+the \fB-help\fP option states whether or not \fBreadline()\fP will be used.
+.P
+The program handles any number of tests, each of which consists of a set of
+input lines. Each set starts with a regular expression pattern, followed by any
+number of subject lines to be matched against that pattern. In between sets of
+test data, command lines that begin with # may appear. This file format, with
+some restrictions, can also be processed by the \fBperltest.sh\fP script that
+is distributed with PCRE2 as a means of checking that the behaviour of PCRE2
+and Perl is the same.
+.P
+When the input is a terminal, \fBpcre2test\fP prompts for each line of input,
+using "re>" to prompt for regular expression patterns, and "data>" to prompt
+for subject lines. Command lines starting with # can be entered only in
+response to the "re>" prompt.
+.P
+Each subject line is matched separately and independently. If you want to do
+multi-line matches, you have to use the \en escape sequence (or \er or \er\en,
+etc., depending on the newline setting) in a single line of input to encode the
+newline sequences. There is no limit on the length of subject lines; the input
+buffer is automatically extended if it is too small. There are replication
+features that makes it possible to generate long repetitive pattern or subject
+lines without having to supply them explicitly.
+.P
+An empty line or the end of the file signals the end of the subject lines for a
+test, at which point a new pattern or command line is expected if there is
+still input to be read.
+.
+.
+.SH "COMMAND LINES"
+.rs
+.sp
+In between sets of test data, a line that begins with # is interpreted as a
+command line. If the first character is followed by white space or an
+exclamation mark, the line is treated as a comment, and ignored. Otherwise, the
+following commands are recognized:
+.sp
+  #forbid_utf
+.sp
+Subsequent patterns automatically have the PCRE2_NEVER_UTF and PCRE2_NEVER_UCP
+options set, which locks out the use of the PCRE2_UTF and PCRE2_UCP options and
+the use of (*UTF) and (*UCP) at the start of patterns. This command also forces
+an error if a subsequent pattern contains any occurrences of \eP, \ep, or \eX,
+which are still supported when PCRE2_UTF is not set, but which require Unicode
+property support to be included in the library.
+.P
+This is a trigger guard that is used in test files to ensure that UTF or
+Unicode property tests are not accidentally added to files that are used when
+Unicode support is not included in the library. Setting PCRE2_NEVER_UTF and
+PCRE2_NEVER_UCP as a default can also be obtained by the use of \fB#pattern\fP;
+the difference is that \fB#forbid_utf\fP cannot be unset, and the automatic
+options are not displayed in pattern information, to avoid cluttering up test
+output.
+.sp
+  #load <filename>
+.sp
+This command is used to load a set of precompiled patterns from a file, as
+described in the section entitled "Saving and restoring compiled patterns"
+.\" HTML <a href="#saverestore">
+.\" </a>
+below.
+.\"
+.sp
+  #newline_default [<newline-list>]
+.sp
+When PCRE2 is built, a default newline convention can be specified. This
+determines which characters and/or character pairs are recognized as indicating
+a newline in a pattern or subject string. The default can be overridden when a
+pattern is compiled. The standard test files contain tests of various newline
+conventions, but the majority of the tests expect a single linefeed to be
+recognized as a newline by default. Without special action the tests would fail
+when PCRE2 is compiled with either CR or CRLF as the default newline.
+.P
+The #newline_default command specifies a list of newline types that are
+acceptable as the default. The types must be one of CR, LF, CRLF, ANYCRLF, or
+ANY (in upper or lower case), for example:
+.sp
+  #newline_default LF Any anyCRLF
+.sp
+If the default newline is in the list, this command has no effect. Otherwise,
+except when testing the POSIX API, a \fBnewline\fP modifier that specifies the
+first newline convention in the list (LF in the above example) is added to any
+pattern that does not already have a \fBnewline\fP modifier. If the newline
+list is empty, the feature is turned off. This command is present in a number
+of the standard test input files.
+.P
+When the POSIX API is being tested there is no way to override the default
+newline convention, though it is possible to set the newline convention from
+within the pattern. A warning is given if the \fBposix\fP modifier is used when
+\fB#newline_default\fP would set a default for the non-POSIX API.
+.sp
+  #pattern <modifier-list>
+.sp
+This command sets a default modifier list that applies to all subsequent
+patterns. Modifiers on a pattern can change these settings.
+.sp
+  #perltest
+.sp
+The appearance of this line causes all subsequent modifier settings to be
+checked for compatibility with the \fBperltest.sh\fP script, which is used to
+confirm that Perl gives the same results as PCRE2. Also, apart from comment
+lines, none of the other command lines are permitted, because they and many
+of the modifiers are specific to \fBpcre2test\fP, and should not be used in
+test files that are also processed by \fBperltest.sh\fP. The \fB#perltest\fP
+command helps detect tests that are accidentally put in the wrong file.
+.sp
+  #pop [<modifiers>]
+.sp
+This command is used to manipulate the stack of compiled patterns, as described
+in the section entitled "Saving and restoring compiled patterns"
+.\" HTML <a href="#saverestore">
+.\" </a>
+below.
+.\"
+.sp
+  #save <filename>
+.sp
+This command is used to save a set of compiled patterns to a file, as described
+in the section entitled "Saving and restoring compiled patterns"
+.\" HTML <a href="#saverestore">
+.\" </a>
+below.
+.\"
+.sp
+  #subject <modifier-list>
+.sp
+This command sets a default modifier list that applies to all subsequent
+subject lines. Modifiers on a subject line can change these settings.
+.
+.
+.SH "MODIFIER SYNTAX"
+.rs
+.sp
+Modifier lists are used with both pattern and subject lines. Items in a list
+are separated by commas followed by optional white space. Trailing whitespace
+in a modifier list is ignored. Some modifiers may be given for both patterns
+and subject lines, whereas others are valid only for one or the other. Each
+modifier has a long name, for example "anchored", and some of them must be
+followed by an equals sign and a value, for example, "offset=12". Values cannot
+contain comma characters, but may contain spaces. Modifiers that do not take
+values may be preceded by a minus sign to turn off a previous setting.
+.P
+A few of the more common modifiers can also be specified as single letters, for
+example "i" for "caseless". In documentation, following the Perl convention,
+these are written with a slash ("the /i modifier") for clarity. Abbreviated
+modifiers must all be concatenated in the first item of a modifier list. If the
+first item is not recognized as a long modifier name, it is interpreted as a
+sequence of these abbreviations. For example:
+.sp
+  /abc/ig,newline=cr,jit=3
+.sp
+This is a pattern line whose modifier list starts with two one-letter modifiers
+(/i and /g). The lower-case abbreviated modifiers are the same as used in Perl.
+.
+.
+.SH "PATTERN SYNTAX"
+.rs
+.sp
+A pattern line must start with one of the following characters (common symbols,
+excluding pattern meta-characters):
+.sp
+  / ! " ' ` - = _ : ; , % & @ ~
+.sp
+This is interpreted as the pattern's delimiter. A regular expression may be
+continued over several input lines, in which case the newline characters are
+included within it. It is possible to include the delimiter within the pattern
+by escaping it with a backslash, for example
+.sp
+  /abc\e/def/
+.sp
+If you do this, the escape and the delimiter form part of the pattern, but
+since the delimiters are all non-alphanumeric, this does not affect its
+interpretation. If the terminating delimiter is immediately followed by a
+backslash, for example,
+.sp
+  /abc/\e
+.sp
+then a backslash is added to the end of the pattern. This is done to provide a
+way of testing the error condition that arises if a pattern finishes with a
+backslash, because
+.sp
+  /abc\e/
+.sp
+is interpreted as the first line of a pattern that starts with "abc/", causing
+pcre2test to read the next line as a continuation of the regular expression.
+.P
+A pattern can be followed by a modifier list (details below).
+.
+.
+.SH "SUBJECT LINE SYNTAX"
+.rs
+.sp
+Before each subject line is passed to \fBpcre2_match()\fP or
+\fBpcre2_dfa_match()\fP, leading and trailing white space is removed, and the
+line is scanned for backslash escapes. The following provide a means of
+encoding non-printing characters in a visible way:
+.sp
+  \ea         alarm (BEL, \ex07)
+  \eb         backspace (\ex08)
+  \ee         escape (\ex27)
+  \ef         form feed (\ex0c)
+  \en         newline (\ex0a)
+  \er         carriage return (\ex0d)
+  \et         tab (\ex09)
+  \ev         vertical tab (\ex0b)
+  \ennn       octal character (up to 3 octal digits); always
+               a byte unless > 255 in UTF-8 or 16-bit or 32-bit mode
+  \eo{dd...}  octal character (any number of octal digits}
+  \exhh       hexadecimal byte (up to 2 hex digits)
+  \ex{hh...}  hexadecimal character (any number of hex digits)
+.sp
+The use of \ex{hh...} is not dependent on the use of the \fButf\fP modifier on
+the pattern. It is recognized always. There may be any number of hexadecimal
+digits inside the braces; invalid values provoke error messages.
+.P
+Note that \exhh specifies one byte rather than one character in UTF-8 mode;
+this makes it possible to construct invalid UTF-8 sequences for testing
+purposes. On the other hand, \ex{hh} is interpreted as a UTF-8 character in
+UTF-8 mode, generating more than one byte if the value is greater than 127.
+When testing the 8-bit library not in UTF-8 mode, \ex{hh} generates one byte
+for values less than 256, and causes an error for greater values.
+.P
+In UTF-16 mode, all 4-digit \ex{hhhh} values are accepted. This makes it
+possible to construct invalid UTF-16 sequences for testing purposes.
+.P
+In UTF-32 mode, all 4- to 8-digit \ex{...} values are accepted. This makes it
+possible to construct invalid UTF-32 sequences for testing purposes.
+.P
+There is a special backslash sequence that specifies replication of one or more
+characters:
+.sp
+  \e[<characters>]{<count>}
+.sp
+This makes it possible to test long strings without having to provide them as
+part of the file. For example:
+.sp
+  \e[abc]{4}
+.sp
+is converted to "abcabcabcabc". This feature does not support nesting. To
+include a closing square bracket in the characters, code it as \ex5D.
+.P
+A backslash followed by an equals sign marks the end of the subject string and
+the start of a modifier list. For example:
+.sp
+  abc\e=notbol,notempty
+.sp
+If the subject string is empty and \e= is followed by whitespace, the line is
+treated as a comment line, and is not used for matching. For example:
+.sp
+  \e= This is a comment.
+  abc\e= This is an invalid modifier list.
+.sp
+A backslash followed by any other non-alphanumeric character just escapes that
+character. A backslash followed by anything else causes an error. However, if
+the very last character in the line is a backslash (and there is no modifier
+list), it is ignored. This gives a way of passing an empty line as data, since
+a real empty line terminates the data input.
+.
+.
+.SH "PATTERN MODIFIERS"
+.rs
+.sp
+There are several types of modifier that can appear in pattern lines. Except
+where noted below, they may also be used in \fB#pattern\fP commands. A
+pattern's modifier list can add to or override default modifiers that were set
+by a previous \fB#pattern\fP command.
+.
+.
+.\" HTML <a name="optionmodifiers"></a>
+.SS "Setting compilation options"
+.rs
+.sp
+The following modifiers set options for \fBpcre2_compile()\fP. The most common
+ones have single-letter abbreviations. See
+.\" HREF
+\fBpcre2api\fP
+.\"
+for a description of their effects.
+.sp
+      allow_empty_class         set PCRE2_ALLOW_EMPTY_CLASS
+      alt_bsux                  set PCRE2_ALT_BSUX
+      alt_circumflex            set PCRE2_ALT_CIRCUMFLEX
+      alt_verbnames             set PCRE2_ALT_VERBNAMES
+      anchored                  set PCRE2_ANCHORED
+      auto_callout              set PCRE2_AUTO_CALLOUT
+  /i  caseless                  set PCRE2_CASELESS
+      dollar_endonly            set PCRE2_DOLLAR_ENDONLY
+  /s  dotall                    set PCRE2_DOTALL
+      dupnames                  set PCRE2_DUPNAMES
+  /x  extended                  set PCRE2_EXTENDED
+      firstline                 set PCRE2_FIRSTLINE
+      match_unset_backref       set PCRE2_MATCH_UNSET_BACKREF
+  /m  multiline                 set PCRE2_MULTILINE
+      never_backslash_c         set PCRE2_NEVER_BACKSLASH_C
+      never_ucp                 set PCRE2_NEVER_UCP
+      never_utf                 set PCRE2_NEVER_UTF
+      no_auto_capture           set PCRE2_NO_AUTO_CAPTURE
+      no_auto_possess           set PCRE2_NO_AUTO_POSSESS
+      no_dotstar_anchor         set PCRE2_NO_DOTSTAR_ANCHOR
+      no_start_optimize         set PCRE2_NO_START_OPTIMIZE
+      no_utf_check              set PCRE2_NO_UTF_CHECK
+      ucp                       set PCRE2_UCP
+      ungreedy                  set PCRE2_UNGREEDY
+      use_offset_limit          set PCRE2_USE_OFFSET_LIMIT
+      utf                       set PCRE2_UTF
+.sp
+As well as turning on the PCRE2_UTF option, the \fButf\fP modifier causes all
+non-printing characters in output strings to be printed using the \ex{hh...}
+notation. Otherwise, those less than 0x100 are output in hex without the curly
+brackets.
+.
+.
+.\" HTML <a name="controlmodifiers"></a>
+.SS "Setting compilation controls"
+.rs
+.sp
+The following modifiers affect the compilation process or request information
+about the pattern:
+.sp
+      bsr=[anycrlf|unicode]     specify \eR handling
+  /B  bincode                   show binary code without lengths
+      callout_info              show callout information
+      debug                     same as info,fullbincode
+      fullbincode               show binary code with lengths
+  /I  info                      show info about compiled pattern
+      hex                       pattern is coded in hexadecimal
+      jit[=<number>]            use JIT
+      jitfast                   use JIT fast path
+      jitverify                 verify JIT use
+      locale=<name>             use this locale
+      max_pattern_length=<n>    set the maximum pattern length
+      memory                    show memory used
+      newline=<type>            set newline type
+      null_context              compile with a NULL context
+      parens_nest_limit=<n>     set maximum parentheses depth
+      posix                     use the POSIX API
+      push                      push compiled pattern onto the stack
+      stackguard=<number>       test the stackguard feature
+      tables=[0|1|2]            select internal tables
+.sp
+The effects of these modifiers are described in the following sections.
+.
+.
+.SS "Newline and \eR handling"
+.rs
+.sp
+The \fBbsr\fP modifier specifies what \eR in a pattern should match. If it is
+set to "anycrlf", \eR matches CR, LF, or CRLF only. If it is set to "unicode",
+\eR matches any Unicode newline sequence. The default is specified when PCRE2
+is built, with the default default being Unicode.
+.P
+The \fBnewline\fP modifier specifies which characters are to be interpreted as
+newlines, both in the pattern and in subject lines. The type must be one of CR,
+LF, CRLF, ANYCRLF, or ANY (in upper or lower case).
+.
+.
+.SS "Information about a pattern"
+.rs
+.sp
+The \fBdebug\fP modifier is a shorthand for \fBinfo,fullbincode\fP, requesting
+all available information.
+.P
+The \fBbincode\fP modifier causes a representation of the compiled code to be
+output after compilation. This information does not contain length and offset
+values, which ensures that the same output is generated for different internal
+link sizes and different code unit widths. By using \fBbincode\fP, the same
+regression tests can be used in different environments.
+.P
+The \fBfullbincode\fP modifier, by contrast, \fIdoes\fP include length and
+offset values. This is used in a few special tests that run only for specific
+code unit widths and link sizes, and is also useful for one-off tests.
+.P
+The \fBinfo\fP modifier requests information about the compiled pattern
+(whether it is anchored, has a fixed first character, and so on). The
+information is obtained from the \fBpcre2_pattern_info()\fP function. Here are
+some typical examples:
+.sp
+    re> /(?i)(^a|^b)/m,info
+  Capturing subpattern count = 1
+  Compile options: multiline
+  Overall options: caseless multiline
+  First code unit at start or follows newline
+  Subject length lower bound = 1
+.sp
+    re> /(?i)abc/info
+  Capturing subpattern count = 0
+  Compile options: <none>
+  Overall options: caseless
+  First code unit = 'a' (caseless)
+  Last code unit = 'c' (caseless)
+  Subject length lower bound = 3
+.sp
+"Compile options" are those specified by modifiers; "overall options" have
+added options that are taken or deduced from the pattern. If both sets of
+options are the same, just a single "options" line is output; if there are no
+options, the line is omitted. "First code unit" is where any match must start;
+if there is more than one they are listed as "starting code units". "Last code
+unit" is the last literal code unit that must be present in any match. This is
+not necessarily the last character. These lines are omitted if no starting or
+ending code units are recorded.
+.P
+The \fBcallout_info\fP modifier requests information about all the callouts in
+the pattern. A list of them is output at the end of any other information that
+is requested. For each callout, either its number or string is given, followed
+by the item that follows it in the pattern.
+.
+.
+.SS "Passing a NULL context"
+.rs
+.sp
+Normally, \fBpcre2test\fP passes a context block to \fBpcre2_compile()\fP. If
+the \fBnull_context\fP modifier is set, however, NULL is passed. This is for
+testing that \fBpcre2_compile()\fP behaves correctly in this case (it uses
+default values).
+.
+.
+.SS "Specifying a pattern in hex"
+.rs
+.sp
+The \fBhex\fP modifier specifies that the characters of the pattern are to be
+interpreted as pairs of hexadecimal digits. White space is permitted between
+pairs. For example:
+.sp
+  /ab 32 59/hex
+.sp
+This feature is provided as a way of creating patterns that contain binary zero
+and other non-printing characters. By default, \fBpcre2test\fP passes patterns
+as zero-terminated strings to \fBpcre2_compile()\fP, giving the length as
+PCRE2_ZERO_TERMINATED. However, for patterns specified in hexadecimal, the
+actual length of the pattern is passed.
+.
+.
+.SS "Generating long repetitive patterns"
+.rs
+.sp
+Some tests use long patterns that are very repetitive. Instead of creating a
+very long input line for such a pattern, you can use a special repetition
+feature, similar to the one described for subject lines above. If the
+\fBexpand\fP modifier is present on a pattern, parts of the pattern that have
+the form
+.sp
+  \e[<characters>]{<count>}
+.sp
+are expanded before the pattern is passed to \fBpcre2_compile()\fP. For
+example, \e[AB]{6000} is expanded to "ABAB..." 6000 times. This construction
+cannot be nested. An initial "\e[" sequence is recognized only if "]{" followed
+by decimal digits and "}" is found later in the pattern. If not, the characters
+remain in the pattern unaltered.
+.P
+If part of an expanded pattern looks like an expansion, but is really part of
+the actual pattern, unwanted expansion can be avoided by giving two values in
+the quantifier. For example, \e[AB]{6000,6000} is not recognized as an
+expansion item.
+.P
+If the \fBinfo\fP modifier is set on an expanded pattern, the result of the
+expansion is included in the information that is output.
+.
+.
+.SS "JIT compilation"
+.rs
+.sp
+Just-in-time (JIT) compiling is a heavyweight optimization that can greatly
+speed up pattern matching. See the
+.\" HREF
+\fBpcre2jit\fP
+.\"
+documentation for details. JIT compiling happens, optionally, after a pattern
+has been successfully compiled into an internal form. The JIT compiler converts
+this to optimized machine code. It needs to know whether the match-time options
+PCRE2_PARTIAL_HARD and PCRE2_PARTIAL_SOFT are going to be used, because
+different code is generated for the different cases. See the \fBpartial\fP
+modifier in "Subject Modifiers"
+.\" HTML <a href="#subjectmodifiers">
+.\" </a>
+below
+.\"
+for details of how these options are specified for each match attempt.
+.P
+JIT compilation is requested by the \fB/jit\fP pattern modifier, which may
+optionally be followed by an equals sign and a number in the range 0 to 7.
+The three bits that make up the number specify which of the three JIT operating
+modes are to be compiled:
+.sp
+  1  compile JIT code for non-partial matching
+  2  compile JIT code for soft partial matching
+  4  compile JIT code for hard partial matching
+.sp
+The possible values for the \fB/jit\fP modifier are therefore:
+.sp
+  0  disable JIT
+  1  normal matching only
+  2  soft partial matching only
+  3  normal and soft partial matching
+  4  hard partial matching only
+  6  soft and hard partial matching only
+  7  all three modes
+.sp
+If no number is given, 7 is assumed. The phrase "partial matching" means a call
+to \fBpcre2_match()\fP with either the PCRE2_PARTIAL_SOFT or the
+PCRE2_PARTIAL_HARD option set. Note that such a call may return a complete
+match; the options enable the possibility of a partial match, but do not
+require it. Note also that if you request JIT compilation only for partial
+matching (for example, /jit=2) but do not set the \fBpartial\fP modifier on a
+subject line, that match will not use JIT code because none was compiled for
+non-partial matching.
+.P
+If JIT compilation is successful, the compiled JIT code will automatically be
+used when an appropriate type of match is run, except when incompatible
+run-time options are specified. For more details, see the
+.\" HREF
+\fBpcre2jit\fP
+.\"
+documentation. See also the \fBjitstack\fP modifier below for a way of
+setting the size of the JIT stack.
+.P
+If the \fBjitfast\fP modifier is specified, matching is done using the JIT
+"fast path" interface, \fBpcre2_jit_match()\fP, which skips some of the sanity
+checks that are done by \fBpcre2_match()\fP, and of course does not work when
+JIT is not supported. If \fBjitfast\fP is specified without \fBjit\fP, jit=7 is
+assumed.
+.P
+If the \fBjitverify\fP modifier is specified, information about the compiled
+pattern shows whether JIT compilation was or was not successful. If
+\fBjitverify\fP is specified without \fBjit\fP, jit=7 is assumed. If JIT
+compilation is successful when \fBjitverify\fP is set, the text "(JIT)" is
+added to the first output line after a match or non match when JIT-compiled
+code was actually used in the match.
+.
+.
+.SS "Setting a locale"
+.rs
+.sp
+The \fB/locale\fP modifier must specify the name of a locale, for example:
+.sp
+  /pattern/locale=fr_FR
+.sp
+The given locale is set, \fBpcre2_maketables()\fP is called to build a set of
+character tables for the locale, and this is then passed to
+\fBpcre2_compile()\fP when compiling the regular expression. The same tables
+are used when matching the following subject lines. The \fB/locale\fP modifier
+applies only to the pattern on which it appears, but can be given in a
+\fB#pattern\fP command if a default is needed. Setting a locale and alternate
+character tables are mutually exclusive.
+.
+.
+.SS "Showing pattern memory"
+.rs
+.sp
+The \fB/memory\fP modifier causes the size in bytes of the memory used to hold
+the compiled pattern to be output. This does not include the size of the
+\fBpcre2_code\fP block; it is just the actual compiled data. If the pattern is
+subsequently passed to the JIT compiler, the size of the JIT compiled code is
+also output. Here is an example:
+.sp
+    re> /a(b)c/jit,memory
+  Memory allocation (code space): 21
+  Memory allocation (JIT code): 1910
+.sp
+.
+.
+.SS "Limiting nested parentheses"
+.rs
+.sp
+The \fBparens_nest_limit\fP modifier sets a limit on the depth of nested
+parentheses in a pattern. Breaching the limit causes a compilation error.
+The default for the library is set when PCRE2 is built, but \fBpcre2test\fP
+sets its own default of 220, which is required for running the standard test
+suite.
+.
+.
+.SS "Limiting the pattern length"
+.rs
+.sp
+The \fBmax_pattern_length\fP modifier sets a limit, in code units, to the
+length of pattern that \fBpcre2_compile()\fP will accept. Breaching the limit
+causes a compilation error. The default is the largest number a PCRE2_SIZE
+variable can hold (essentially unlimited).
+.
+.
+.SS "Using the POSIX wrapper API"
+.rs
+.sp
+The \fB/posix\fP modifier causes \fBpcre2test\fP to call PCRE2 via the POSIX
+wrapper API rather than its native API. This supports only the 8-bit library.
+Note that it does not imply POSIX matching semantics; for more detail see the
+.\" HREF
+\fBpcre2posix\fP
+.\"
+documentation. When the POSIX API is being used, the following pattern
+modifiers set options for the \fBregcomp()\fP function:
+.sp
+  caseless           REG_ICASE
+  multiline          REG_NEWLINE
+  no_auto_capture    REG_NOSUB
+  dotall             REG_DOTALL     )
+  ungreedy           REG_UNGREEDY   ) These options are not part of
+  ucp                REG_UCP        )   the POSIX standard
+  utf                REG_UTF8       )
+.sp
+The \fBregerror_buffsize\fP modifier specifies a size for the error buffer that
+is passed to \fBregerror()\fP in the event of a compilation error. For example:
+.sp
+  /abc/posix,regerror_buffsize=20
+.sp
+This provides a means of testing the behaviour of \fBregerror()\fP when the
+buffer is too small for the error message. If this modifier has not been set, a
+large buffer is used.
+.P
+The \fBaftertext\fP and \fBallaftertext\fP subject modifiers work as described
+below. All other modifiers cause an error.
+.
+.
+.SS "Testing the stack guard feature"
+.rs
+.sp
+The \fB/stackguard\fP modifier is used to test the use of
+\fBpcre2_set_compile_recursion_guard()\fP, a function that is provided to
+enable stack availability to be checked during compilation (see the
+.\" HREF
+\fBpcre2api\fP
+.\"
+documentation for details). If the number specified by the modifier is greater
+than zero, \fBpcre2_set_compile_recursion_guard()\fP is called to set up
+callback from \fBpcre2_compile()\fP to a local function. The argument it
+receives is the current nesting parenthesis depth; if this is greater than the
+value given by the modifier, non-zero is returned, causing the compilation to
+be aborted.
+.
+.
+.SS "Using alternative character tables"
+.rs
+.sp
+The value specified for the \fB/tables\fP modifier must be one of the digits 0,
+1, or 2. It causes a specific set of built-in character tables to be passed to
+\fBpcre2_compile()\fP. This is used in the PCRE2 tests to check behaviour with
+different character tables. The digit specifies the tables as follows:
+.sp
+  0   do not pass any special character tables
+  1   the default ASCII tables, as distributed in
+        pcre2_chartables.c.dist
+  2   a set of tables defining ISO 8859 characters
+.sp
+In table 2, some characters whose codes are greater than 128 are identified as
+letters, digits, spaces, etc. Setting alternate character tables and a locale
+are mutually exclusive.
+.
+.
+.SS "Setting certain match controls"
+.rs
+.sp
+The following modifiers are really subject modifiers, and are described below.
+However, they may be included in a pattern's modifier list, in which case they
+are applied to every subject line that is processed with that pattern. They may
+not appear in \fB#pattern\fP commands. These modifiers do not affect the
+compilation process.
+.sp
+      aftertext                  show text after match
+      allaftertext               show text after captures
+      allcaptures                show all captures
+      allusedtext                show all consulted text
+  /g  global                     global matching
+      mark                       show mark values
+      replace=<string>           specify a replacement string
+      startchar                  show starting character when relevant
+      substitute_extended        use PCRE2_SUBSTITUTE_EXTENDED
+      substitute_overflow_length use PCRE2_SUBSTITUTE_OVERFLOW_LENGTH
+      substitute_unknown_unset   use PCRE2_SUBSTITUTE_UNKNOWN_UNSET
+      substitute_unset_empty     use PCRE2_SUBSTITUTE_UNSET_EMPTY
+.sp
+These modifiers may not appear in a \fB#pattern\fP command. If you want them as
+defaults, set them in a \fB#subject\fP command.
+.
+.
+.SS "Saving a compiled pattern"
+.rs
+.sp
+When a pattern with the \fBpush\fP modifier is successfully compiled, it is
+pushed onto a stack of compiled patterns, and \fBpcre2test\fP expects the next
+line to contain a new pattern (or a command) instead of a subject line. This
+facility is used when saving compiled patterns to a file, as described in the
+section entitled "Saving and restoring compiled patterns"
+.\" HTML <a href="#saverestore">
+.\" </a>
+below.
+.\"
+The \fBpush\fP modifier is incompatible with compilation modifiers such as
+\fBglobal\fP that act at match time. Any that are specified are ignored, with a
+warning message, except for \fBreplace\fP, which causes an error. Note that,
+\fBjitverify\fP, which is allowed, does not carry through to any subsequent
+matching that uses this pattern.
+.
+.
+.\" HTML <a name="subjectmodifiers"></a>
+.SH "SUBJECT MODIFIERS"
+.rs
+.sp
+The modifiers that can appear in subject lines and the \fB#subject\fP
+command are of two types.
+.
+.
+.SS "Setting match options"
+.rs
+.sp
+The following modifiers set options for \fBpcre2_match()\fP or
+\fBpcre2_dfa_match()\fP. See
+.\" HREF
+\fBpcreapi\fP
+.\"
+for a description of their effects.
+.sp
+      anchored                  set PCRE2_ANCHORED
+      dfa_restart               set PCRE2_DFA_RESTART
+      dfa_shortest              set PCRE2_DFA_SHORTEST
+      no_utf_check              set PCRE2_NO_UTF_CHECK
+      notbol                    set PCRE2_NOTBOL
+      notempty                  set PCRE2_NOTEMPTY
+      notempty_atstart          set PCRE2_NOTEMPTY_ATSTART
+      noteol                    set PCRE2_NOTEOL
+      partial_hard (or ph)      set PCRE2_PARTIAL_HARD
+      partial_soft (or ps)      set PCRE2_PARTIAL_SOFT
+.sp
+The partial matching modifiers are provided with abbreviations because they
+appear frequently in tests.
+.P
+If the \fB/posix\fP modifier was present on the pattern, causing the POSIX
+wrapper API to be used, the only option-setting modifiers that have any effect
+are \fBnotbol\fP, \fBnotempty\fP, and \fBnoteol\fP, causing REG_NOTBOL,
+REG_NOTEMPTY, and REG_NOTEOL, respectively, to be passed to \fBregexec()\fP.
+Any other modifiers cause an error.
+.
+.
+.SS "Setting match controls"
+.rs
+.sp
+The following modifiers affect the matching process or request additional
+information. Some of them may also be specified on a pattern line (see above),
+in which case they apply to every subject line that is matched against that
+pattern.
+.sp
+      aftertext                  show text after match
+      allaftertext               show text after captures
+      allcaptures                show all captures
+      allusedtext                show all consulted text (non-JIT only)
+      altglobal                  alternative global matching
+      callout_capture            show captures at callout time
+      callout_data=<n>           set a value to pass via callouts
+      callout_fail=<n>[:<m>]     control callout failure
+      callout_none               do not supply a callout function
+      copy=<number or name>      copy captured substring
+      dfa                        use \fBpcre2_dfa_match()\fP
+      find_limits                find match and recursion limits
+      get=<number or name>       extract captured substring
+      getall                     extract all captured substrings
+  /g  global                     global matching
+      jitstack=<n>               set size of JIT stack
+      mark                       show mark values
+      match_limit=<n>            set a match limit
+      memory                     show memory usage
+      null_context               match with a NULL context
+      offset=<n>                 set starting offset
+      offset_limit=<n>           set offset limit
+      ovector=<n>                set size of output vector
+      recursion_limit=<n>        set a recursion limit
+      replace=<string>           specify a replacement string
+      startchar                  show startchar when relevant
+      startoffset=<n>            same as offset=<n>
+      substitute_extedded        use PCRE2_SUBSTITUTE_EXTENDED
+      substitute_overflow_length use PCRE2_SUBSTITUTE_OVERFLOW_LENGTH
+      substitute_unknown_unset   use PCRE2_SUBSTITUTE_UNKNOWN_UNSET
+      substitute_unset_empty     use PCRE2_SUBSTITUTE_UNSET_EMPTY
+      zero_terminate             pass the subject as zero-terminated
+.sp
+The effects of these modifiers are described in the following sections.
+.
+.
+.SS "Showing more text"
+.rs
+.sp
+The \fBaftertext\fP modifier requests that as well as outputting the part of
+the subject string that matched the entire pattern, \fBpcre2test\fP should in
+addition output the remainder of the subject string. This is useful for tests
+where the subject contains multiple copies of the same substring. The
+\fBallaftertext\fP modifier requests the same action for captured substrings as
+well as the main matched substring. In each case the remainder is output on the
+following line with a plus character following the capture number.
+.P
+The \fBallusedtext\fP modifier requests that all the text that was consulted
+during a successful pattern match by the interpreter should be shown. This
+feature is not supported for JIT matching, and if requested with JIT it is
+ignored (with a warning message). Setting this modifier affects the output if
+there is a lookbehind at the start of a match, or a lookahead at the end, or if
+\eK is used in the pattern. Characters that precede or follow the start and end
+of the actual match are indicated in the output by '<' or '>' characters
+underneath them. Here is an example:
+.sp
+    re> /(?<=pqr)abc(?=xyz)/
+  data> 123pqrabcxyz456\e=allusedtext
+   0: pqrabcxyz
+      <<<   >>>
+.sp
+This shows that the matched string is "abc", with the preceding and following
+strings "pqr" and "xyz" having been consulted during the match (when processing
+the assertions).
+.P
+The \fBstartchar\fP modifier requests that the starting character for the match
+be indicated, if it is different to the start of the matched string. The only
+time when this occurs is when \eK has been processed as part of the match. In
+this situation, the output for the matched string is displayed from the
+starting character instead of from the match point, with circumflex characters
+under the earlier characters. For example:
+.sp
+    re> /abc\eKxyz/
+  data> abcxyz\e=startchar
+   0: abcxyz
+      ^^^
+.sp
+Unlike \fBallusedtext\fP, the \fBstartchar\fP modifier can be used with JIT.
+However, these two modifiers are mutually exclusive.
+.
+.
+.SS "Showing the value of all capture groups"
+.rs
+.sp
+The \fBallcaptures\fP modifier requests that the values of all potential
+captured parentheses be output after a match. By default, only those up to the
+highest one actually used in the match are output (corresponding to the return
+code from \fBpcre2_match()\fP). Groups that did not take part in the match
+are output as "<unset>".
+.
+.
+.SS "Testing callouts"
+.rs
+.sp
+A callout function is supplied when \fBpcre2test\fP calls the library matching
+functions, unless \fBcallout_none\fP is specified. If \fBcallout_capture\fP is
+set, the current captured groups are output when a callout occurs.
+.P
+The \fBcallout_fail\fP modifier can be given one or two numbers. If there is
+only one number, 1 is returned instead of 0 when a callout of that number is
+reached. If two numbers are given, 1 is returned when callout <n> is reached
+for the <m>th time. Note that callouts with string arguments are always given
+the number zero. See "Callouts" below for a description of the output when a
+callout it taken.
+.P
+The \fBcallout_data\fP modifier can be given an unsigned or a negative number.
+This is set as the "user data" that is passed to the matching function, and
+passed back when the callout function is invoked. Any value other than zero is
+used as a return from \fBpcre2test\fP's callout function.
+.
+.
+.SS "Finding all matches in a string"
+.rs
+.sp
+Searching for all possible matches within a subject can be requested by the
+\fBglobal\fP or \fB/altglobal\fP modifier. After finding a match, the matching
+function is called again to search the remainder of the subject. The difference
+between \fBglobal\fP and \fBaltglobal\fP is that the former uses the
+\fIstart_offset\fP argument to \fBpcre2_match()\fP or \fBpcre2_dfa_match()\fP
+to start searching at a new point within the entire string (which is what Perl
+does), whereas the latter passes over a shortened subject. This makes a
+difference to the matching process if the pattern begins with a lookbehind
+assertion (including \eb or \eB).
+.P
+If an empty string is matched, the next match is done with the
+PCRE2_NOTEMPTY_ATSTART and PCRE2_ANCHORED flags set, in order to search for
+another, non-empty, match at the same point in the subject. If this match
+fails, the start offset is advanced, and the normal match is retried. This
+imitates the way Perl handles such cases when using the \fB/g\fP modifier or
+the \fBsplit()\fP function. Normally, the start offset is advanced by one
+character, but if the newline convention recognizes CRLF as a newline, and the
+current character is CR followed by LF, an advance of two characters occurs.
+.
+.
+.SS "Testing substring extraction functions"
+.rs
+.sp
+The \fBcopy\fP and \fBget\fP modifiers can be used to test the
+\fBpcre2_substring_copy_xxx()\fP and \fBpcre2_substring_get_xxx()\fP functions.
+They can be given more than once, and each can specify a group name or number,
+for example:
+.sp
+   abcd\e=copy=1,copy=3,get=G1
+.sp
+If the \fB#subject\fP command is used to set default copy and/or get lists,
+these can be unset by specifying a negative number to cancel all numbered
+groups and an empty name to cancel all named groups.
+.P
+The \fBgetall\fP modifier tests \fBpcre2_substring_list_get()\fP, which
+extracts all captured substrings.
+.P
+If the subject line is successfully matched, the substrings extracted by the
+convenience functions are output with C, G, or L after the string number
+instead of a colon. This is in addition to the normal full list. The string
+length (that is, the return from the extraction function) is given in
+parentheses after each substring, followed by the name when the extraction was
+by name.
+.
+.
+.SS "Testing the substitution function"
+.rs
+.sp
+If the \fBreplace\fP modifier is set, the \fBpcre2_substitute()\fP function is
+called instead of one of the matching functions. Note that replacement strings
+cannot contain commas, because a comma signifies the end of a modifier. This is
+not thought to be an issue in a test program.
+.P
+Unlike subject strings, \fBpcre2test\fP does not process replacement strings
+for escape sequences. In UTF mode, a replacement string is checked to see if it
+is a valid UTF-8 string. If so, it is correctly converted to a UTF string of
+the appropriate code unit width. If it is not a valid UTF-8 string, the
+individual code units are copied directly. This provides a means of passing an
+invalid UTF-8 string for testing purposes.
+.P
+The following modifiers set options (in additional to the normal match options)
+for \fBpcre2_substitute()\fP:
+.sp
+  global                      PCRE2_SUBSTITUTE_GLOBAL
+  substitute_extended         PCRE2_SUBSTITUTE_EXTENDED
+  substitute_overflow_length  PCRE2_SUBSTITUTE_OVERFLOW_LENGTH
+  substitute_unknown_unset    PCRE2_SUBSTITUTE_UNKNOWN_UNSET
+  substitute_unset_empty      PCRE2_SUBSTITUTE_UNSET_EMPTY
+.sp
+.P
+After a successful substitution, the modified string is output, preceded by the
+number of replacements. This may be zero if there were no matches. Here is a
+simple example of a substitution test:
+.sp
+  /abc/replace=xxx
+      =abc=abc=
+   1: =xxx=abc=
+      =abc=abc=\e=global
+   2: =xxx=xxx=
+.sp
+Subject and replacement strings should be kept relatively short (fewer than 256
+characters) for substitution tests, as fixed-size buffers are used. To make it
+easy to test for buffer overflow, if the replacement string starts with a
+number in square brackets, that number is passed to \fBpcre2_substitute()\fP as
+the size of the output buffer, with the replacement string starting at the next
+character. Here is an example that tests the edge case:
+.sp
+  /abc/
+      123abc123\e=replace=[10]XYZ
+   1: 123XYZ123
+      123abc123\e=replace=[9]XYZ
+  Failed: error -47: no more memory
+.sp
+The default action of \fBpcre2_substitute()\fP is to return
+PCRE2_ERROR_NOMEMORY when the output buffer is too small. However, if the
+PCRE2_SUBSTITUTE_OVERFLOW_LENGTH option is set (by using the
+\fBsubstitute_overflow_length\fP modifier), \fBpcre2_substitute()\fP continues
+to go through the motions of matching and substituting, in order to compute the
+size of buffer that is required. When this happens, \fBpcre2test\fP shows the
+required buffer length (which includes space for the trailing zero) as part of
+the error message. For example:
+.sp
+  /abc/substitute_overflow_length
+      123abc123\e=replace=[9]XYZ
+  Failed: error -47: no more memory: 10 code units are needed
+.sp
+A replacement string is ignored with POSIX and DFA matching. Specifying partial
+matching provokes an error return ("bad option value") from
+\fBpcre2_substitute()\fP.
+.
+.
+.SS "Setting the JIT stack size"
+.rs
+.sp
+The \fBjitstack\fP modifier provides a way of setting the maximum stack size
+that is used by the just-in-time optimization code. It is ignored if JIT
+optimization is not being used. The value is a number of kilobytes. Providing a
+stack that is larger than the default 32K is necessary only for very
+complicated patterns.
+.
+.
+.SS "Setting match and recursion limits"
+.rs
+.sp
+The \fBmatch_limit\fP and \fBrecursion_limit\fP modifiers set the appropriate
+limits in the match context. These values are ignored when the
+\fBfind_limits\fP modifier is specified.
+.
+.
+.SS "Finding minimum limits"
+.rs
+.sp
+If the \fBfind_limits\fP modifier is present, \fBpcre2test\fP calls
+\fBpcre2_match()\fP several times, setting different values in the match
+context via \fBpcre2_set_match_limit()\fP and \fBpcre2_set_recursion_limit()\fP
+until it finds the minimum values for each parameter that allow
+\fBpcre2_match()\fP to complete without error.
+.P
+If JIT is being used, only the match limit is relevant. If DFA matching is
+being used, neither limit is relevant, and this modifier is ignored (with a
+warning message).
+.P
+The \fImatch_limit\fP number is a measure of the amount of backtracking
+that takes place, and learning the minimum value can be instructive. For most
+simple matches, the number is quite small, but for patterns with very large
+numbers of matching possibilities, it can become large very quickly with
+increasing length of subject string. The \fImatch_limit_recursion\fP number is
+a measure of how much stack (or, if PCRE2 is compiled with NO_RECURSE, how much
+heap) memory is needed to complete the match attempt.
+.
+.
+.SS "Showing MARK names"
+.rs
+.sp
+.P
+The \fBmark\fP modifier causes the names from backtracking control verbs that
+are returned from calls to \fBpcre2_match()\fP to be displayed. If a mark is
+returned for a match, non-match, or partial match, \fBpcre2test\fP shows it.
+For a match, it is on a line by itself, tagged with "MK:". Otherwise, it
+is added to the non-match message.
+.
+.
+.SS "Showing memory usage"
+.rs
+.sp
+The \fBmemory\fP modifier causes \fBpcre2test\fP to log all memory allocation
+and freeing calls that occur during a match operation.
+.
+.
+.SS "Setting a starting offset"
+.rs
+.sp
+The \fBoffset\fP modifier sets an offset in the subject string at which
+matching starts. Its value is a number of code units, not characters.
+.
+.
+.SS "Setting an offset limit"
+.rs
+.sp
+The \fBoffset_limit\fP modifier sets a limit for unanchored matches. If a match
+cannot be found starting at or before this offset in the subject, a "no match"
+return is given. The data value is a number of code units, not characters. When
+this modifier is used, the \fBuse_offset_limit\fP modifier must have been set
+for the pattern; if not, an error is generated.
+.
+.
+.SS "Setting the size of the output vector"
+.rs
+.sp
+The \fBovector\fP modifier applies only to the subject line in which it
+appears, though of course it can also be used to set a default in a
+\fB#subject\fP command. It specifies the number of pairs of offsets that are
+available for storing matching information. The default is 15.
+.P
+A value of zero is useful when testing the POSIX API because it causes
+\fBregexec()\fP to be called with a NULL capture vector. When not testing the
+POSIX API, a value of zero is used to cause
+\fBpcre2_match_data_create_from_pattern()\fP to be called, in order to create a
+match block of exactly the right size for the pattern. (It is not possible to
+create a match block with a zero-length ovector; there is always at least one
+pair of offsets.)
+.
+.
+.SS "Passing the subject as zero-terminated"
+.rs
+.sp
+By default, the subject string is passed to a native API matching function with
+its correct length. In order to test the facility for passing a zero-terminated
+string, the \fBzero_terminate\fP modifier is provided. It causes the length to
+be passed as PCRE2_ZERO_TERMINATED. (When matching via the POSIX interface,
+this modifier has no effect, as there is no facility for passing a length.)
+.P
+When testing \fBpcre2_substitute()\fP, this modifier also has the effect of
+passing the replacement string as zero-terminated.
+.
+.
+.SS "Passing a NULL context"
+.rs
+.sp
+Normally, \fBpcre2test\fP passes a context block to \fBpcre2_match()\fP,
+\fBpcre2_dfa_match()\fP or \fBpcre2_jit_match()\fP. If the \fBnull_context\fP
+modifier is set, however, NULL is passed. This is for testing that the matching
+functions behave correctly in this case (they use default values). This
+modifier cannot be used with the \fBfind_limits\fP modifier or when testing the
+substitution function.
+.
+.
+.SH "THE ALTERNATIVE MATCHING FUNCTION"
+.rs
+.sp
+By default, \fBpcre2test\fP uses the standard PCRE2 matching function,
+\fBpcre2_match()\fP to match each subject line. PCRE2 also supports an
+alternative matching function, \fBpcre2_dfa_match()\fP, which operates in a
+different way, and has some restrictions. The differences between the two
+functions are described in the
+.\" HREF
+\fBpcre2matching\fP
+.\"
+documentation.
+.P
+If the \fBdfa\fP modifier is set, the alternative matching function is used.
+This function finds all possible matches at a given point in the subject. If,
+however, the \fBdfa_shortest\fP modifier is set, processing stops after the
+first match is found. This is always the shortest possible match.
+.
+.
+.SH "DEFAULT OUTPUT FROM pcre2test"
+.rs
+.sp
+This section describes the output when the normal matching function,
+\fBpcre2_match()\fP, is being used.
+.P
+When a match succeeds, \fBpcre2test\fP outputs the list of captured substrings,
+starting with number 0 for the string that matched the whole pattern.
+Otherwise, it outputs "No match" when the return is PCRE2_ERROR_NOMATCH, or
+"Partial match:" followed by the partially matching substring when the
+return is PCRE2_ERROR_PARTIAL. (Note that this is the
+entire substring that was inspected during the partial match; it may include
+characters before the actual match start if a lookbehind assertion, \eK, \eb,
+or \eB was involved.)
+.P
+For any other return, \fBpcre2test\fP outputs the PCRE2 negative error number
+and a short descriptive phrase. If the error is a failed UTF string check, the
+code unit offset of the start of the failing character is also output. Here is
+an example of an interactive \fBpcre2test\fP run.
+.sp
+  $ pcre2test
+  PCRE2 version 9.00 2014-05-10
+.sp
+    re> /^abc(\ed+)/
+  data> abc123
+   0: abc123
+   1: 123
+  data> xyz
+  No match
+.sp
+Unset capturing substrings that are not followed by one that is set are not
+shown by \fBpcre2test\fP unless the \fBallcaptures\fP modifier is specified. In
+the following example, there are two capturing substrings, but when the first
+data line is matched, the second, unset substring is not shown. An "internal"
+unset substring is shown as "<unset>", as for the second data line.
+.sp
+    re> /(a)|(b)/
+  data> a
+   0: a
+   1: a
+  data> b
+   0: b
+   1: <unset>
+   2: b
+.sp
+If the strings contain any non-printing characters, they are output as \exhh
+escapes if the value is less than 256 and UTF mode is not set. Otherwise they
+are output as \ex{hh...} escapes. See below for the definition of non-printing
+characters. If the \fB/aftertext\fP modifier is set, the output for substring
+0 is followed by the the rest of the subject string, identified by "0+" like
+this:
+.sp
+    re> /cat/aftertext
+  data> cataract
+   0: cat
+   0+ aract
+.sp
+If global matching is requested, the results of successive matching attempts
+are output in sequence, like this:
+.sp
+    re> /\eBi(\ew\ew)/g
+  data> Mississippi
+   0: iss
+   1: ss
+   0: iss
+   1: ss
+   0: ipp
+   1: pp
+.sp
+"No match" is output only if the first match attempt fails. Here is an example
+of a failure message (the offset 4 that is specified by the \fBoffset\fP
+modifier is past the end of the subject string):
+.sp
+    re> /xyz/
+  data> xyz\e=offset=4
+  Error -24 (bad offset value)
+.P
+Note that whereas patterns can be continued over several lines (a plain ">"
+prompt is used for continuations), subject lines may not. However newlines can
+be included in a subject by means of the \en escape (or \er, \er\en, etc.,
+depending on the newline sequence setting).
+.
+.
+.
+.SH "OUTPUT FROM THE ALTERNATIVE MATCHING FUNCTION"
+.rs
+.sp
+When the alternative matching function, \fBpcre2_dfa_match()\fP, is used, the
+output consists of a list of all the matches that start at the first point in
+the subject where there is at least one match. For example:
+.sp
+    re> /(tang|tangerine|tan)/
+  data> yellow tangerine\e=dfa
+   0: tangerine
+   1: tang
+   2: tan
+.sp
+Using the normal matching function on this data finds only "tang". The
+longest matching string is always given first (and numbered zero). After a
+PCRE2_ERROR_PARTIAL return, the output is "Partial match:", followed by the
+partially matching substring. Note that this is the entire substring that was
+inspected during the partial match; it may include characters before the actual
+match start if a lookbehind assertion, \eb, or \eB was involved. (\eK is not
+supported for DFA matching.)
+.P
+If global matching is requested, the search for further matches resumes
+at the end of the longest match. For example:
+.sp
+    re> /(tang|tangerine|tan)/g
+  data> yellow tangerine and tangy sultana\e=dfa
+   0: tangerine
+   1: tang
+   2: tan
+   0: tang
+   1: tan
+   0: tan
+.sp
+The alternative matching function does not support substring capture, so the
+modifiers that are concerned with captured substrings are not relevant.
+.
+.
+.SH "RESTARTING AFTER A PARTIAL MATCH"
+.rs
+.sp
+When the alternative matching function has given the PCRE2_ERROR_PARTIAL
+return, indicating that the subject partially matched the pattern, you can
+restart the match with additional subject data by means of the
+\fBdfa_restart\fP modifier. For example:
+.sp
+    re> /^\ed?\ed(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\ed\ed$/
+  data> 23ja\e=P,dfa
+  Partial match: 23ja
+  data> n05\e=dfa,dfa_restart
+   0: n05
+.sp
+For further information about partial matching, see the
+.\" HREF
+\fBpcre2partial\fP
+.\"
+documentation.
+.
+.
+.SH CALLOUTS
+.rs
+.sp
+If the pattern contains any callout requests, \fBpcre2test\fP's callout
+function is called during matching unless \fBcallout_none\fP is specified.
+This works with both matching functions.
+.P
+The callout function in \fBpcre2test\fP returns zero (carry on matching) by
+default, but you can use a \fBcallout_fail\fP modifier in a subject line (as
+described above) to change this and other parameters of the callout.
+.P
+Inserting callouts can be helpful when using \fBpcre2test\fP to check
+complicated regular expressions. For further information about callouts, see
+the
+.\" HREF
+\fBpcre2callout\fP
+.\"
+documentation.
+.P
+The output for callouts with numerical arguments and those with string
+arguments is slightly different.
+.
+.
+.SS "Callouts with numerical arguments"
+.rs
+.sp
+By default, the callout function displays the callout number, the start and
+current positions in the subject text at the callout time, and the next pattern
+item to be tested. For example:
+.sp
+  --->pqrabcdef
+    0    ^  ^     \ed
+.sp
+This output indicates that callout number 0 occurred for a match attempt
+starting at the fourth character of the subject string, when the pointer was at
+the seventh character, and when the next pattern item was \ed. Just
+one circumflex is output if the start and current positions are the same.
+.P
+Callouts numbered 255 are assumed to be automatic callouts, inserted as a
+result of the \fB/auto_callout\fP pattern modifier. In this case, instead of
+showing the callout number, the offset in the pattern, preceded by a plus, is
+output. For example:
+.sp
+    re> /\ed?[A-E]\e*/auto_callout
+  data> E*
+  --->E*
+   +0 ^      \ed?
+   +3 ^      [A-E]
+   +8 ^^     \e*
+  +10 ^ ^
+   0: E*
+.sp
+If a pattern contains (*MARK) items, an additional line is output whenever
+a change of latest mark is passed to the callout function. For example:
+.sp
+    re> /a(*MARK:X)bc/auto_callout
+  data> abc
+  --->abc
+   +0 ^       a
+   +1 ^^      (*MARK:X)
+  +10 ^^      b
+  Latest Mark: X
+  +11 ^ ^     c
+  +12 ^  ^
+   0: abc
+.sp
+The mark changes between matching "a" and "b", but stays the same for the rest
+of the match, so nothing more is output. If, as a result of backtracking, the
+mark reverts to being unset, the text "<unset>" is output.
+.
+.
+.SS "Callouts with string arguments"
+.rs
+.sp
+The output for a callout with a string argument is similar, except that instead
+of outputting a callout number before the position indicators, the callout
+string and its offset in the pattern string are output before the reflection of
+the subject string, and the subject string is reflected for each callout. For
+example:
+.sp
+    re> /^ab(?C'first')cd(?C"second")ef/
+  data> abcdefg
+  Callout (7): 'first'
+  --->abcdefg
+      ^ ^         c
+  Callout (20): "second"
+  --->abcdefg
+      ^   ^       e
+   0: abcdef
+.sp
+.
+.
+.
+.SH "NON-PRINTING CHARACTERS"
+.rs
+.sp
+When \fBpcre2test\fP is outputting text in the compiled version of a pattern,
+bytes other than 32-126 are always treated as non-printing characters and are
+therefore shown as hex escapes.
+.P
+When \fBpcre2test\fP is outputting text that is a matched part of a subject
+string, it behaves in the same way, unless a different locale has been set for
+the pattern (using the \fB/locale\fP modifier). In this case, the
+\fBisprint()\fP function is used to distinguish printing and non-printing
+characters.
+.
+.
+.
+.\" HTML <a name="saverestore"></a>
+.SH "SAVING AND RESTORING COMPILED PATTERNS"
+.rs
+.sp
+It is possible to save compiled patterns on disc or elsewhere, and reload them
+later, subject to a number of restrictions. JIT data cannot be saved. The host
+on which the patterns are reloaded must be running the same version of PCRE2,
+with the same code unit width, and must also have the same endianness, pointer
+width and PCRE2_SIZE type. Before compiled patterns can be saved they must be
+serialized, that is, converted to a stream of bytes. A single byte stream may
+contain any number of compiled patterns, but they must all use the same
+character tables. A single copy of the tables is included in the byte stream
+(its size is 1088 bytes).
+.P
+The functions whose names begin with \fBpcre2_serialize_\fP are used
+for serializing and de-serializing. They are described in the
+.\" HREF
+\fBpcre2serialize\fP
+.\"
+documentation. In this section we describe the features of \fBpcre2test\fP that
+can be used to test these functions.
+.P
+When a pattern with \fBpush\fP modifier is successfully compiled, it is pushed
+onto a stack of compiled patterns, and \fBpcre2test\fP expects the next line to
+contain a new pattern (or command) instead of a subject line. By this means, a
+number of patterns can be compiled and retained. The \fBpush\fP modifier is
+incompatible with \fBposix\fP, and control modifiers that act at match time are
+ignored (with a message). The \fBjitverify\fP modifier applies only at compile
+time. The command
+.sp
+  #save <filename>
+.sp
+causes all the stacked patterns to be serialized and the result written to the
+named file. Afterwards, all the stacked patterns are freed. The command
+.sp
+  #load <filename>
+.sp
+reads the data in the file, and then arranges for it to be de-serialized, with
+the resulting compiled patterns added to the pattern stack. The pattern on the
+top of the stack can be retrieved by the #pop command, which must be followed
+by lines of subjects that are to be matched with the pattern, terminated as
+usual by an empty line or end of file. This command may be followed by a
+modifier list containing only
+.\" HTML <a href="#controlmodifiers">
+.\" </a>
+control modifiers
+.\"
+that act after a pattern has been compiled. In particular, \fBhex\fP,
+\fBposix\fP, and \fBpush\fP are not allowed, nor are any
+.\" HTML <a href="#optionmodifiers">
+.\" </a>
+option-setting modifiers.
+.\"
+The JIT modifiers are, however permitted. Here is an example that saves and
+reloads two patterns.
+.sp
+  /abc/push
+  /xyz/push
+  #save tempfile
+  #load tempfile
+  #pop info
+  xyz
+.sp
+  #pop jit,bincode
+  abc
+.sp
+If \fBjitverify\fP is used with #pop, it does not automatically imply
+\fBjit\fP, which is different behaviour from when it is used on a pattern.
+.
+.
+.
+.SH "SEE ALSO"
+.rs
+.sp
+\fBpcre2\fP(3), \fBpcre2api\fP(3), \fBpcre2callout\fP(3),
+\fBpcre2jit\fP, \fBpcre2matching\fP(3), \fBpcre2partial\fP(d),
+\fBpcre2pattern\fP(3), \fBpcre2serialize\fP(3).
+.
+.
+.SH AUTHOR
+.rs
+.sp
+.nf
+Philip Hazel
+University Computing Service
+Cambridge, England.
+.fi
+.
+.
+.SH REVISION
+.rs
+.sp
+.nf
+Last updated: 12 December 2015
+Copyright (c) 1997-2015 University of Cambridge.
+.fi
diff --git a/dist2/doc/pcre2test.txt b/dist2/doc/pcre2test.txt
new file mode 100644
index 0000000..d9dbc4d
--- /dev/null
+++ b/dist2/doc/pcre2test.txt
@@ -0,0 +1,1509 @@
+PCRE2TEST(1)                General Commands Manual               PCRE2TEST(1)
+
+
+
+NAME
+       pcre2test - a program for testing Perl-compatible regular expressions.
+
+SYNOPSIS
+
+       pcre2test [options] [input file [output file]]
+
+       pcre2test is a test program for the PCRE2 regular expression libraries,
+       but it can also be used for  experimenting  with  regular  expressions.
+       This  document  describes the features of the test program; for details
+       of the regular expressions themselves, see the pcre2pattern  documenta-
+       tion.  For  details  of  the  PCRE2  library  function  calls and their
+       options, see the pcre2api documentation.
+
+       The input for pcre2test is a sequence of  regular  expression  patterns
+       and  subject  strings  to  be matched. There are also command lines for
+       setting defaults and controlling some special actions. The output shows
+       the  result  of  each  match attempt. Modifiers on external or internal
+       command lines, the patterns, and the subject lines specify PCRE2  func-
+       tion  options, control how the subject is processed, and what output is
+       produced.
+
+       As the original fairly simple PCRE library evolved,  it  acquired  many
+       different  features,  and  as  a  result, the original pcretest program
+       ended up with a lot of options in a messy, arcane syntax,  for  testing
+       all the features. The move to the new PCRE2 API provided an opportunity
+       to re-implement the test program as pcre2test, with a cleaner  modifier
+       syntax.  Nevertheless,  there are still many obscure modifiers, some of
+       which are specifically designed for use in conjunction  with  the  test
+       script  and  data  files that are distributed as part of PCRE2. All the
+       modifiers are documented here, some  without  much  justification,  but
+       many  of  them  are  unlikely  to  be  of  use  except when testing the
+       libraries.
+
+
+PCRE2's 8-BIT, 16-BIT AND 32-BIT LIBRARIES
+
+       Different versions of the PCRE2 library can be built to support charac-
+       ter  strings  that  are encoded in 8-bit, 16-bit, or 32-bit code units.
+       One, two, or  all  three  of  these  libraries  may  be  simultaneously
+       installed. The pcre2test program can be used to test all the libraries.
+       However, its own input and output are  always  in  8-bit  format.  When
+       testing  the  16-bit  or 32-bit libraries, patterns and subject strings
+       are converted to 16- or  32-bit  format  before  being  passed  to  the
+       library  functions.  Results are converted back to 8-bit code units for
+       output.
+
+       In the rest of this document, the names of library functions and struc-
+       tures  are  given  in  generic  form,  for example, pcre_compile(). The
+       actual names used in the libraries have a suffix _8, _16,  or  _32,  as
+       appropriate.
+
+
+INPUT ENCODING
+
+       Input  to  pcre2test is processed line by line, either by calling the C
+       library's fgets() function, or via the libreadline library (see below).
+       The  input  is  processed using using C's string functions, so must not
+       contain binary zeroes, even though in Unix-like  environments,  fgets()
+       treats any bytes other than newline as data characters. In some Windows
+       environments character 26 (hex 1A) causes an immediate end of file, and
+       no further data is read.
+
+       For  maximum portability, therefore, it is safest to avoid non-printing
+       characters in pcre2test input files. There is a facility for specifying
+       a pattern's characters as hexadecimal pairs, thus making it possible to
+       include binary zeroes in a pattern for testing purposes. Subject  lines
+       are processed for backslash escapes, which makes it possible to include
+       any data value.
+
+
+COMMAND LINE OPTIONS
+
+       -8        If the 8-bit library has been built, this option causes it to
+                 be  used  (this is the default). If the 8-bit library has not
+                 been built, this option causes an error.
+
+       -16       If the 16-bit library has been built, this option  causes  it
+                 to  be  used. If only the 16-bit library has been built, this
+                 is the default. If the 16-bit library  has  not  been  built,
+                 this option causes an error.
+
+       -32       If  the  32-bit library has been built, this option causes it
+                 to be used. If only the 32-bit library has been  built,  this
+                 is  the  default.  If  the 32-bit library has not been built,
+                 this option causes an error.
+
+       -b        Behave as if each pattern has the /fullbincode modifier;  the
+                 full internal binary form of the pattern is output after com-
+                 pilation.
+
+       -C        Output the version number  of  the  PCRE2  library,  and  all
+                 available  information  about  the optional features that are
+                 included, and then  exit  with  zero  exit  code.  All  other
+                 options are ignored.
+
+       -C option Output  information  about a specific build-time option, then
+                 exit. This functionality is intended for use in scripts  such
+                 as  RunTest.  The  following options output the value and set
+                 the exit code as indicated:
+
+                   ebcdic-nl  the code for LF (= NL) in an EBCDIC environment:
+                                0x15 or 0x25
+                                0 if used in an ASCII environment
+                                exit code is always 0
+                   linksize   the configured internal link size (2, 3, or 4)
+                                exit code is set to the link size
+                   newline    the default newline setting:
+                                CR, LF, CRLF, ANYCRLF, or ANY
+                                exit code is always 0
+                   bsr        the default setting for what \R matches:
+                                ANYCRLF or ANY
+                                exit code is always 0
+
+                 The following options output 1 for true or 0 for  false,  and
+                 set the exit code to the same value:
+
+                   backslash-C  \C is supported (not locked out)
+                   ebcdic       compiled for an EBCDIC environment
+                   jit          just-in-time support is available
+                   pcre2-16     the 16-bit library was built
+                   pcre2-32     the 32-bit library was built
+                   pcre2-8      the 8-bit library was built
+                   unicode      Unicode support is available
+
+                 If  an  unknown  option is given, an error message is output;
+                 the exit code is 0.
+
+       -d        Behave as if each pattern has the debug modifier; the  inter-
+                 nal form and information about the compiled pattern is output
+                 after compilation; -d is equivalent to -b -i.
+
+       -dfa      Behave as if each subject line has the dfa modifier; matching
+                 is  done  using the pcre2_dfa_match() function instead of the
+                 default pcre2_match().
+
+       -help     Output a brief summary these options and then exit.
+
+       -i        Behave as if each pattern has the /info modifier; information
+                 about the compiled pattern is given after compilation.
+
+       -jit      Behave  as  if  each pattern line has the jit modifier; after
+                 successful compilation, each pattern is passed to  the  just-
+                 in-time compiler, if available.
+
+       -pattern modifier-list
+                 Behave as if each pattern line contains the given modifiers.
+
+       -q        Do not output the version number of pcre2test at the start of
+                 execution.
+
+       -S size   On Unix-like systems, set the size of the run-time  stack  to
+                 size megabytes.
+
+       -subject modifier-list
+                 Behave as if each subject line contains the given modifiers.
+
+       -t        Run  each compile and match many times with a timer, and out-
+                 put the resulting times per compile or  match.  When  JIT  is
+                 used,  separate  times  are given for the initial compile and
+                 the JIT compile. You can control  the  number  of  iterations
+                 that  are used for timing by following -t with a number (as a
+                 separate item on the command line). For  example,  "-t  1000"
+                 iterates 1000 times. The default is to iterate 500,000 times.
+
+       -tm       This is like -t except that it times only the matching phase,
+                 not the compile phase.
+
+       -T -TM    These behave like -t and -tm, but in addition, at the end  of
+                 a  run, the total times for all compiles and matches are out-
+                 put.
+
+       -version  Output the PCRE2 version number and then exit.
+
+
+DESCRIPTION
+
+       If pcre2test is given two filename arguments, it reads from  the  first
+       and writes to the second. If the first name is "-", input is taken from
+       the standard input. If pcre2test is given only one argument,  it  reads
+       from that file and writes to stdout. Otherwise, it reads from stdin and
+       writes to stdout.
+
+       When pcre2test is built, a configuration option  can  specify  that  it
+       should  be linked with the libreadline or libedit library. When this is
+       done, if the input is from a terminal, it is read using the  readline()
+       function. This provides line-editing and history facilities. The output
+       from the -help option states whether or not readline() will be used.
+
+       The program handles any number of tests, each of which  consists  of  a
+       set  of input lines. Each set starts with a regular expression pattern,
+       followed by any number of subject lines to be matched against that pat-
+       tern. In between sets of test data, command lines that begin with # may
+       appear. This file format, with some restrictions, can also be processed
+       by  the perltest.sh script that is distributed with PCRE2 as a means of
+       checking that the behaviour of PCRE2 and Perl is the same.
+
+       When the input is a terminal, pcre2test prompts for each line of input,
+       using  "re>"  to prompt for regular expression patterns, and "data>" to
+       prompt for subject lines. Command lines starting with # can be  entered
+       only in response to the "re>" prompt.
+
+       Each  subject line is matched separately and independently. If you want
+       to do multi-line matches, you have to use the \n escape sequence (or \r
+       or  \r\n,  etc.,  depending on the newline setting) in a single line of
+       input to encode the newline sequences. There is no limit on the  length
+       of  subject  lines; the input buffer is automatically extended if it is
+       too small. There are replication features that  makes  it  possible  to
+       generate  long  repetitive  pattern  or subject lines without having to
+       supply them explicitly.
+
+       An empty line or the end of the file signals the  end  of  the  subject
+       lines  for  a  test,  at  which  point a new pattern or command line is
+       expected if there is still input to be read.
+
+
+COMMAND LINES
+
+       In between sets of test data, a line that begins with # is  interpreted
+       as a command line. If the first character is followed by white space or
+       an exclamation mark, the line is treated as  a  comment,  and  ignored.
+       Otherwise, the following commands are recognized:
+
+         #forbid_utf
+
+       Subsequent   patterns   automatically   have  the  PCRE2_NEVER_UTF  and
+       PCRE2_NEVER_UCP options set, which locks out the use of  the  PCRE2_UTF
+       and  PCRE2_UCP options and the use of (*UTF) and (*UCP) at the start of
+       patterns. This command also forces an error  if  a  subsequent  pattern
+       contains  any  occurrences  of \P, \p, or \X, which are still supported
+       when PCRE2_UTF is not set, but which require Unicode  property  support
+       to be included in the library.
+
+       This  is  a trigger guard that is used in test files to ensure that UTF
+       or Unicode property tests are not accidentally added to files that  are
+       used  when  Unicode  support  is  not  included in the library. Setting
+       PCRE2_NEVER_UTF and PCRE2_NEVER_UCP as a default can also  be  obtained
+       by  the  use  of #pattern; the difference is that #forbid_utf cannot be
+       unset, and the automatic options are not displayed in pattern  informa-
+       tion, to avoid cluttering up test output.
+
+         #load <filename>
+
+       This command is used to load a set of precompiled patterns from a file,
+       as described in the section entitled  "Saving  and  restoring  compiled
+       patterns" below.
+
+         #newline_default [<newline-list>]
+
+       When  PCRE2  is  built,  a default newline convention can be specified.
+       This determines which characters and/or character pairs are  recognized
+       as indicating a newline in a pattern or subject string. The default can
+       be overridden when a pattern is compiled. The standard test files  con-
+       tain  tests  of  various  newline  conventions, but the majority of the
+       tests expect a single  linefeed  to  be  recognized  as  a  newline  by
+       default. Without special action the tests would fail when PCRE2 is com-
+       piled with either CR or CRLF as the default newline.
+
+       The #newline_default command specifies a list of newline types that are
+       acceptable  as the default. The types must be one of CR, LF, CRLF, ANY-
+       CRLF, or ANY (in upper or lower case), for example:
+
+         #newline_default LF Any anyCRLF
+
+       If the default newline is in the list, this command has no effect. Oth-
+       erwise,  except  when  testing  the  POSIX API, a newline modifier that
+       specifies the first newline convention in the list  (LF  in  the  above
+       example)  is  added to any pattern that does not already have a newline
+       modifier. If the newline list is empty, the feature is turned off. This
+       command is present in a number of the standard test input files.
+
+       When  the  POSIX  API  is  being tested there is no way to override the
+       default newline convention, though it is possible to  set  the  newline
+       convention  from  within  the  pattern. A warning is given if the posix
+       modifier is used when #newline_default would set a default for the non-
+       POSIX API.
+
+         #pattern <modifier-list>
+
+       This  command  sets  a default modifier list that applies to all subse-
+       quent patterns. Modifiers on a pattern can change these settings.
+
+         #perltest
+
+       The appearance of this line causes all subsequent modifier settings  to
+       be checked for compatibility with the perltest.sh script, which is used
+       to confirm that Perl gives the same results as PCRE2. Also, apart  from
+       comment  lines,  none of the other command lines are permitted, because
+       they and many of the modifiers are specific to  pcre2test,  and  should
+       not  be  used in test files that are also processed by perltest.sh. The
+       #perltest command helps detect tests that are accidentally put  in  the
+       wrong file.
+
+         #pop [<modifiers>]
+
+       This  command  is used to manipulate the stack of compiled patterns, as
+       described in the section entitled "Saving and restoring  compiled  pat-
+       terns" below.
+
+         #save <filename>
+
+       This  command  is used to save a set of compiled patterns to a file, as
+       described in the section entitled "Saving and restoring  compiled  pat-
+       terns" below.
+
+         #subject <modifier-list>
+
+       This  command  sets  a default modifier list that applies to all subse-
+       quent subject lines. Modifiers on a subject line can change these  set-
+       tings.
+
+
+MODIFIER SYNTAX
+
+       Modifier lists are used with both pattern and subject lines. Items in a
+       list are separated by commas followed by optional white space. Trailing
+       whitespace  in  a modifier list is ignored. Some modifiers may be given
+       for both patterns and subject lines, whereas others are valid only  for
+       one  or  the  other.  Each  modifier  has  a  long  name,  for  example
+       "anchored", and some of them must be followed by an equals sign  and  a
+       value,  for  example,  "offset=12". Values cannot contain comma charac-
+       ters, but may contain spaces. Modifiers that do not take values may  be
+       preceded by a minus sign to turn off a previous setting.
+
+       A few of the more common modifiers can also be specified as single let-
+       ters, for example "i" for "caseless". In documentation,  following  the
+       Perl convention, these are written with a slash ("the /i modifier") for
+       clarity. Abbreviated modifiers must all be concatenated  in  the  first
+       item  of a modifier list. If the first item is not recognized as a long
+       modifier name, it is interpreted as a sequence of these  abbreviations.
+       For example:
+
+         /abc/ig,newline=cr,jit=3
+
+       This  is  a pattern line whose modifier list starts with two one-letter
+       modifiers (/i and /g). The lower-case  abbreviated  modifiers  are  the
+       same as used in Perl.
+
+
+PATTERN SYNTAX
+
+       A  pattern line must start with one of the following characters (common
+       symbols, excluding pattern meta-characters):
+
+         / ! " ' ` - = _ : ; , % & @ ~
+
+       This is interpreted as the pattern's delimiter.  A  regular  expression
+       may  be  continued  over several input lines, in which case the newline
+       characters are included within it. It is possible to include the delim-
+       iter within the pattern by escaping it with a backslash, for example
+
+         /abc\/def/
+
+       If  you do this, the escape and the delimiter form part of the pattern,
+       but since the delimiters are all non-alphanumeric, this does not affect
+       its  interpretation.  If  the terminating delimiter is immediately fol-
+       lowed by a backslash, for example,
+
+         /abc/\
+
+       then a backslash is added to the end of the pattern. This  is  done  to
+       provide  a  way of testing the error condition that arises if a pattern
+       finishes with a backslash, because
+
+         /abc\/
+
+       is interpreted as the first line of a pattern that starts with  "abc/",
+       causing  pcre2test to read the next line as a continuation of the regu-
+       lar expression.
+
+       A pattern can be followed by a modifier list (details below).
+
+
+SUBJECT LINE SYNTAX
+
+       Before   each   subject   line   is   passed   to   pcre2_match()    or
+       pcre2_dfa_match(), leading and trailing white space is removed, and the
+       line is scanned for backslash escapes. The following provide a means of
+       encoding non-printing characters in a visible way:
+
+         \a         alarm (BEL, \x07)
+         \b         backspace (\x08)
+         \e         escape (\x27)
+         \f         form feed (\x0c)
+         \n         newline (\x0a)
+         \r         carriage return (\x0d)
+         \t         tab (\x09)
+         \v         vertical tab (\x0b)
+         \nnn       octal character (up to 3 octal digits); always
+                      a byte unless > 255 in UTF-8 or 16-bit or 32-bit mode
+         \o{dd...}  octal character (any number of octal digits}
+         \xhh       hexadecimal byte (up to 2 hex digits)
+         \x{hh...}  hexadecimal character (any number of hex digits)
+
+       The use of \x{hh...} is not dependent on the use of the utf modifier on
+       the pattern. It is recognized always. There may be any number of  hexa-
+       decimal  digits  inside  the  braces; invalid values provoke error mes-
+       sages.
+
+       Note that \xhh specifies one byte rather than one  character  in  UTF-8
+       mode;  this  makes it possible to construct invalid UTF-8 sequences for
+       testing purposes. On the other hand, \x{hh} is interpreted as  a  UTF-8
+       character  in UTF-8 mode, generating more than one byte if the value is
+       greater than 127.  When testing the 8-bit library not  in  UTF-8  mode,
+       \x{hh} generates one byte for values less than 256, and causes an error
+       for greater values.
+
+       In UTF-16 mode, all 4-digit \x{hhhh} values are accepted. This makes it
+       possible to construct invalid UTF-16 sequences for testing purposes.
+
+       In  UTF-32  mode,  all  4- to 8-digit \x{...} values are accepted. This
+       makes it possible to construct invalid  UTF-32  sequences  for  testing
+       purposes.
+
+       There is a special backslash sequence that specifies replication of one
+       or more characters:
+
+         \[<characters>]{<count>}
+
+       This makes it possible to test long strings without having  to  provide
+       them as part of the file. For example:
+
+         \[abc]{4}
+
+       is  converted to "abcabcabcabc". This feature does not support nesting.
+       To include a closing square bracket in the characters, code it as \x5D.
+
+       A backslash followed by an equals sign marks the  end  of  the  subject
+       string and the start of a modifier list. For example:
+
+         abc\=notbol,notempty
+
+       If  the  subject  string is empty and \= is followed by whitespace, the
+       line is treated as a comment line, and is not used  for  matching.  For
+       example:
+
+         \= This is a comment.
+         abc\= This is an invalid modifier list.
+
+       A  backslash  followed  by  any  other  non-alphanumeric character just
+       escapes that character. A backslash followed by anything else causes an
+       error.  However,  if the very last character in the line is a backslash
+       (and there is no modifier list), it is ignored. This  gives  a  way  of
+       passing  an  empty line as data, since a real empty line terminates the
+       data input.
+
+
+PATTERN MODIFIERS
+
+       There are several types of modifier that can appear in  pattern  lines.
+       Except where noted below, they may also be used in #pattern commands. A
+       pattern's modifier list can add to or override default  modifiers  that
+       were set by a previous #pattern command.
+
+   Setting compilation options
+
+       The  following modifiers set options for pcre2_compile(). The most com-
+       mon ones have single-letter abbreviations. See pcre2api for a  descrip-
+       tion of their effects.
+
+             allow_empty_class         set PCRE2_ALLOW_EMPTY_CLASS
+             alt_bsux                  set PCRE2_ALT_BSUX
+             alt_circumflex            set PCRE2_ALT_CIRCUMFLEX
+             alt_verbnames             set PCRE2_ALT_VERBNAMES
+             anchored                  set PCRE2_ANCHORED
+             auto_callout              set PCRE2_AUTO_CALLOUT
+         /i  caseless                  set PCRE2_CASELESS
+             dollar_endonly            set PCRE2_DOLLAR_ENDONLY
+         /s  dotall                    set PCRE2_DOTALL
+             dupnames                  set PCRE2_DUPNAMES
+         /x  extended                  set PCRE2_EXTENDED
+             firstline                 set PCRE2_FIRSTLINE
+             match_unset_backref       set PCRE2_MATCH_UNSET_BACKREF
+         /m  multiline                 set PCRE2_MULTILINE
+             never_backslash_c         set PCRE2_NEVER_BACKSLASH_C
+             never_ucp                 set PCRE2_NEVER_UCP
+             never_utf                 set PCRE2_NEVER_UTF
+             no_auto_capture           set PCRE2_NO_AUTO_CAPTURE
+             no_auto_possess           set PCRE2_NO_AUTO_POSSESS
+             no_dotstar_anchor         set PCRE2_NO_DOTSTAR_ANCHOR
+             no_start_optimize         set PCRE2_NO_START_OPTIMIZE
+             no_utf_check              set PCRE2_NO_UTF_CHECK
+             ucp                       set PCRE2_UCP
+             ungreedy                  set PCRE2_UNGREEDY
+             use_offset_limit          set PCRE2_USE_OFFSET_LIMIT
+             utf                       set PCRE2_UTF
+
+       As well as turning on the PCRE2_UTF option, the utf modifier causes all
+       non-printing characters in output  strings  to  be  printed  using  the
+       \x{hh...}  notation. Otherwise, those less than 0x100 are output in hex
+       without the curly brackets.
+
+   Setting compilation controls
+
+       The following modifiers  affect  the  compilation  process  or  request
+       information about the pattern:
+
+             bsr=[anycrlf|unicode]     specify \R handling
+         /B  bincode                   show binary code without lengths
+             callout_info              show callout information
+             debug                     same as info,fullbincode
+             fullbincode               show binary code with lengths
+         /I  info                      show info about compiled pattern
+             hex                       pattern is coded in hexadecimal
+             jit[=<number>]            use JIT
+             jitfast                   use JIT fast path
+             jitverify                 verify JIT use
+             locale=<name>             use this locale
+             max_pattern_length=<n>    set the maximum pattern length
+             memory                    show memory used
+             newline=<type>            set newline type
+             null_context              compile with a NULL context
+             parens_nest_limit=<n>     set maximum parentheses depth
+             posix                     use the POSIX API
+             push                      push compiled pattern onto the stack
+             stackguard=<number>       test the stackguard feature
+             tables=[0|1|2]            select internal tables
+
+       The effects of these modifiers are described in the following sections.
+
+   Newline and \R handling
+
+       The  bsr modifier specifies what \R in a pattern should match. If it is
+       set to "anycrlf", \R matches CR, LF, or CRLF only.  If  it  is  set  to
+       "unicode",  \R  matches  any  Unicode  newline sequence. The default is
+       specified when PCRE2 is built, with the default default being Unicode.
+
+       The newline modifier specifies which characters are to  be  interpreted
+       as newlines, both in the pattern and in subject lines. The type must be
+       one of CR, LF, CRLF, ANYCRLF, or ANY (in upper or lower case).
+
+   Information about a pattern
+
+       The debug modifier is a shorthand for info,fullbincode, requesting  all
+       available information.
+
+       The bincode modifier causes a representation of the compiled code to be
+       output after compilation. This information does not contain length  and
+       offset values, which ensures that the same output is generated for dif-
+       ferent internal link sizes and different code  unit  widths.  By  using
+       bincode,  the  same  regression tests can be used in different environ-
+       ments.
+
+       The fullbincode modifier, by contrast, does include length  and  offset
+       values.  This is used in a few special tests that run only for specific
+       code unit widths and link sizes, and is also useful for one-off tests.
+
+       The info modifier  requests  information  about  the  compiled  pattern
+       (whether  it  is anchored, has a fixed first character, and so on). The
+       information is obtained from the  pcre2_pattern_info()  function.  Here
+       are some typical examples:
+
+           re> /(?i)(^a|^b)/m,info
+         Capturing subpattern count = 1
+         Compile options: multiline
+         Overall options: caseless multiline
+         First code unit at start or follows newline
+         Subject length lower bound = 1
+
+           re> /(?i)abc/info
+         Capturing subpattern count = 0
+         Compile options: <none>
+         Overall options: caseless
+         First code unit = 'a' (caseless)
+         Last code unit = 'c' (caseless)
+         Subject length lower bound = 3
+
+       "Compile  options"  are those specified by modifiers; "overall options"
+       have added options that are taken or deduced from the pattern. If  both
+       sets  of  options are the same, just a single "options" line is output;
+       if there are no options, the line is  omitted.  "First  code  unit"  is
+       where  any  match must start; if there is more than one they are listed
+       as "starting code units". "Last code unit" is  the  last  literal  code
+       unit  that  must  be  present in any match. This is not necessarily the
+       last character. These lines are omitted if no starting or  ending  code
+       units are recorded.
+
+       The  callout_info  modifier requests information about all the callouts
+       in the pattern. A list of them is output at the end of any other infor-
+       mation that is requested. For each callout, either its number or string
+       is given, followed by the item that follows it in the pattern.
+
+   Passing a NULL context
+
+       Normally, pcre2test passes a context block to pcre2_compile().  If  the
+       null_context  modifier  is  set,  however,  NULL is passed. This is for
+       testing that pcre2_compile() behaves correctly in this  case  (it  uses
+       default values).
+
+   Specifying a pattern in hex
+
+       The hex modifier specifies that the characters of the pattern are to be
+       interpreted as pairs of hexadecimal digits. White  space  is  permitted
+       between pairs. For example:
+
+         /ab 32 59/hex
+
+       This  feature  is  provided  as a way of creating patterns that contain
+       binary zero and other non-printing characters.  By  default,  pcre2test
+       passes  patterns  as zero-terminated strings to pcre2_compile(), giving
+       the length as PCRE2_ZERO_TERMINATED. However, for patterns specified in
+       hexadecimal, the actual length of the pattern is passed.
+
+   Generating long repetitive patterns
+
+       Some  tests use long patterns that are very repetitive. Instead of cre-
+       ating a very long input line for such a pattern, you can use a  special
+       repetition  feature,  similar  to  the  one described for subject lines
+       above. If the expand modifier is present on a  pattern,  parts  of  the
+       pattern that have the form
+
+         \[<characters>]{<count>}
+
+       are expanded before the pattern is passed to pcre2_compile(). For exam-
+       ple, \[AB]{6000} is expanded to "ABAB..." 6000 times. This construction
+       cannot  be  nested. An initial "\[" sequence is recognized only if "]{"
+       followed by decimal digits and "}" is found later in  the  pattern.  If
+       not, the characters remain in the pattern unaltered.
+
+       If  part  of an expanded pattern looks like an expansion, but is really
+       part of the actual pattern, unwanted expansion can be avoided by giving
+       two values in the quantifier. For example, \[AB]{6000,6000} is not rec-
+       ognized as an expansion item.
+
+       If the info modifier is set on an expanded pattern, the result  of  the
+       expansion is included in the information that is output.
+
+   JIT compilation
+
+       Just-in-time  (JIT)  compiling  is  a heavyweight optimization that can
+       greatly speed up pattern matching. See the pcre2jit  documentation  for
+       details.  JIT  compiling  happens, optionally, after a pattern has been
+       successfully compiled into an internal form. The JIT compiler  converts
+       this to optimized machine code. It needs to know whether the match-time
+       options PCRE2_PARTIAL_HARD and PCRE2_PARTIAL_SOFT are going to be used,
+       because  different  code  is generated for the different cases. See the
+       partial modifier in "Subject Modifiers" below for details of how  these
+       options are specified for each match attempt.
+
+       JIT  compilation  is  requested by the /jit pattern modifier, which may
+       optionally be followed by an equals sign and a number in the range 0 to
+       7.   The  three bits that make up the number specify which of the three
+       JIT operating modes are to be compiled:
+
+         1  compile JIT code for non-partial matching
+         2  compile JIT code for soft partial matching
+         4  compile JIT code for hard partial matching
+
+       The possible values for the /jit modifier are therefore:
+
+         0  disable JIT
+         1  normal matching only
+         2  soft partial matching only
+         3  normal and soft partial matching
+         4  hard partial matching only
+         6  soft and hard partial matching only
+         7  all three modes
+
+       If no number is given, 7 is  assumed.  The  phrase  "partial  matching"
+       means a call to pcre2_match() with either the PCRE2_PARTIAL_SOFT or the
+       PCRE2_PARTIAL_HARD option set. Note that such a call may return a  com-
+       plete match; the options enable the possibility of a partial match, but
+       do not require it. Note also that if you request JIT  compilation  only
+       for  partial  matching (for example, /jit=2) but do not set the partial
+       modifier on a subject line, that match will not use  JIT  code  because
+       none was compiled for non-partial matching.
+
+       If  JIT compilation is successful, the compiled JIT code will automati-
+       cally be used when an appropriate type of match  is  run,  except  when
+       incompatible  run-time options are specified. For more details, see the
+       pcre2jit documentation. See also the jitstack modifier below for a  way
+       of setting the size of the JIT stack.
+
+       If  the  jitfast  modifier is specified, matching is done using the JIT
+       "fast path" interface, pcre2_jit_match(), which skips some of the  san-
+       ity  checks that are done by pcre2_match(), and of course does not work
+       when JIT is not supported. If jitfast is specified without  jit,  jit=7
+       is assumed.
+
+       If  the jitverify modifier is specified, information about the compiled
+       pattern shows whether JIT compilation was or  was  not  successful.  If
+       jitverify  is  specified without jit, jit=7 is assumed. If JIT compila-
+       tion is successful when jitverify is set, the text "(JIT)" is added  to
+       the first output line after a match or non match when JIT-compiled code
+       was actually used in the match.
+
+   Setting a locale
+
+       The /locale modifier must specify the name of a locale, for example:
+
+         /pattern/locale=fr_FR
+
+       The given locale is set, pcre2_maketables() is called to build a set of
+       character  tables for the locale, and this is then passed to pcre2_com-
+       pile() when compiling the regular expression. The same tables are  used
+       when matching the following subject lines. The /locale modifier applies
+       only to the pattern on which it appears, but can be given in a #pattern
+       command  if a default is needed. Setting a locale and alternate charac-
+       ter tables are mutually exclusive.
+
+   Showing pattern memory
+
+       The /memory modifier causes the size in bytes of  the  memory  used  to
+       hold  the compiled pattern to be output. This does not include the size
+       of the pcre2_code block; it is just the actual compiled  data.  If  the
+       pattern is subsequently passed to the JIT compiler, the size of the JIT
+       compiled code is also output. Here is an example:
+
+           re> /a(b)c/jit,memory
+         Memory allocation (code space): 21
+         Memory allocation (JIT code): 1910
+
+
+   Limiting nested parentheses
+
+       The parens_nest_limit modifier sets a limit  on  the  depth  of  nested
+       parentheses  in  a  pattern.  Breaching  the limit causes a compilation
+       error.  The default for the library is set when  PCRE2  is  built,  but
+       pcre2test  sets  its  own default of 220, which is required for running
+       the standard test suite.
+
+   Limiting the pattern length
+
+       The max_pattern_length modifier sets a limit, in  code  units,  to  the
+       length of pattern that pcre2_compile() will accept. Breaching the limit
+       causes a compilation  error.  The  default  is  the  largest  number  a
+       PCRE2_SIZE variable can hold (essentially unlimited).
+
+   Using the POSIX wrapper API
+
+       The  /posix modifier causes pcre2test to call PCRE2 via the POSIX wrap-
+       per API rather than its  native  API.  This  supports  only  the  8-bit
+       library.   Note  that  it  does not imply POSIX matching semantics; for
+       more detail see the pcre2posix documentation. When  the  POSIX  API  is
+       being  used,  the  following pattern modifiers set options for the reg-
+       comp() function:
+
+         caseless           REG_ICASE
+         multiline          REG_NEWLINE
+         no_auto_capture    REG_NOSUB
+         dotall             REG_DOTALL     )
+         ungreedy           REG_UNGREEDY   ) These options are not part of
+         ucp                REG_UCP        )   the POSIX standard
+         utf                REG_UTF8       )
+
+       The regerror_buffsize modifier specifies a size for  the  error  buffer
+       that  is  passed to regerror() in the event of a compilation error. For
+       example:
+
+         /abc/posix,regerror_buffsize=20
+
+       This provides a means of testing the behaviour of regerror()  when  the
+       buffer  is  too  small  for the error message. If this modifier has not
+       been set, a large buffer is used.
+
+       The aftertext and allaftertext  subject  modifiers  work  as  described
+       below. All other modifiers cause an error.
+
+   Testing the stack guard feature
+
+       The  /stackguard  modifier  is  used  to test the use of pcre2_set_com-
+       pile_recursion_guard(), a function that is  provided  to  enable  stack
+       availability  to  be checked during compilation (see the pcre2api docu-
+       mentation for details). If the number  specified  by  the  modifier  is
+       greater than zero, pcre2_set_compile_recursion_guard() is called to set
+       up callback from pcre2_compile() to a local function. The  argument  it
+       receives  is  the current nesting parenthesis depth; if this is greater
+       than the value given by the modifier, non-zero is returned, causing the
+       compilation to be aborted.
+
+   Using alternative character tables
+
+       The  value specified for the /tables modifier must be one of the digits
+       0, 1, or 2. It causes a specific set of built-in character tables to be
+       passed to pcre2_compile(). This is used in the PCRE2 tests to check be-
+       haviour with different character tables. The digit specifies the tables
+       as follows:
+
+         0   do not pass any special character tables
+         1   the default ASCII tables, as distributed in
+               pcre2_chartables.c.dist
+         2   a set of tables defining ISO 8859 characters
+
+       In  table 2, some characters whose codes are greater than 128 are iden-
+       tified as letters, digits, spaces,  etc.  Setting  alternate  character
+       tables and a locale are mutually exclusive.
+
+   Setting certain match controls
+
+       The following modifiers are really subject modifiers, and are described
+       below.  However, they may be included in a pattern's modifier list,  in
+       which  case  they  are  applied to every subject line that is processed
+       with that pattern. They may not appear in #pattern commands. These mod-
+       ifiers do not affect the compilation process.
+
+             aftertext                  show text after match
+             allaftertext               show text after captures
+             allcaptures                show all captures
+             allusedtext                show all consulted text
+         /g  global                     global matching
+             mark                       show mark values
+             replace=<string>           specify a replacement string
+             startchar                  show starting character when relevant
+             substitute_extended        use PCRE2_SUBSTITUTE_EXTENDED
+             substitute_overflow_length use PCRE2_SUBSTITUTE_OVERFLOW_LENGTH
+             substitute_unknown_unset   use PCRE2_SUBSTITUTE_UNKNOWN_UNSET
+             substitute_unset_empty     use PCRE2_SUBSTITUTE_UNSET_EMPTY
+
+       These  modifiers may not appear in a #pattern command. If you want them
+       as defaults, set them in a #subject command.
+
+   Saving a compiled pattern
+
+       When a pattern with the push modifier is successfully compiled,  it  is
+       pushed  onto  a  stack  of compiled patterns, and pcre2test expects the
+       next line to contain a new pattern (or a command) instead of a  subject
+       line. This facility is used when saving compiled patterns to a file, as
+       described in the section entitled "Saving and restoring  compiled  pat-
+       terns" below.  The push modifier is incompatible with compilation modi-
+       fiers such as global that act at match time. Any that are specified are
+       ignored,  with  a  warning message, except for replace, which causes an
+       error. Note that, jitverify, which is allowed, does not  carry  through
+       to any subsequent matching that uses this pattern.
+
+
+SUBJECT MODIFIERS
+
+       The modifiers that can appear in subject lines and the #subject command
+       are of two types.
+
+   Setting match options
+
+       The   following   modifiers   set   options   for   pcre2_match()    or
+       pcre2_dfa_match(). See pcreapi for a description of their effects.
+
+             anchored                  set PCRE2_ANCHORED
+             dfa_restart               set PCRE2_DFA_RESTART
+             dfa_shortest              set PCRE2_DFA_SHORTEST
+             no_utf_check              set PCRE2_NO_UTF_CHECK
+             notbol                    set PCRE2_NOTBOL
+             notempty                  set PCRE2_NOTEMPTY
+             notempty_atstart          set PCRE2_NOTEMPTY_ATSTART
+             noteol                    set PCRE2_NOTEOL
+             partial_hard (or ph)      set PCRE2_PARTIAL_HARD
+             partial_soft (or ps)      set PCRE2_PARTIAL_SOFT
+
+       The  partial matching modifiers are provided with abbreviations because
+       they appear frequently in tests.
+
+       If the /posix modifier was present on the pattern,  causing  the  POSIX
+       wrapper API to be used, the only option-setting modifiers that have any
+       effect  are  notbol,  notempty,   and   noteol,   causing   REG_NOTBOL,
+       REG_NOTEMPTY,  and REG_NOTEOL, respectively, to be passed to regexec().
+       Any other modifiers cause an error.
+
+   Setting match controls
+
+       The following modifiers affect the matching process  or  request  addi-
+       tional  information.  Some  of  them may also be specified on a pattern
+       line (see above), in which case they apply to every subject  line  that
+       is matched against that pattern.
+
+             aftertext                  show text after match
+             allaftertext               show text after captures
+             allcaptures                show all captures
+             allusedtext                show all consulted text (non-JIT only)
+             altglobal                  alternative global matching
+             callout_capture            show captures at callout time
+             callout_data=<n>           set a value to pass via callouts
+             callout_fail=<n>[:<m>]     control callout failure
+             callout_none               do not supply a callout function
+             copy=<number or name>      copy captured substring
+             dfa                        use pcre2_dfa_match()
+             find_limits                find match and recursion limits
+             get=<number or name>       extract captured substring
+             getall                     extract all captured substrings
+         /g  global                     global matching
+             jitstack=<n>               set size of JIT stack
+             mark                       show mark values
+             match_limit=<n>            set a match limit
+             memory                     show memory usage
+             null_context               match with a NULL context
+             offset=<n>                 set starting offset
+             offset_limit=<n>           set offset limit
+             ovector=<n>                set size of output vector
+             recursion_limit=<n>        set a recursion limit
+             replace=<string>           specify a replacement string
+             startchar                  show startchar when relevant
+             startoffset=<n>            same as offset=<n>
+             substitute_extedded        use PCRE2_SUBSTITUTE_EXTENDED
+             substitute_overflow_length use PCRE2_SUBSTITUTE_OVERFLOW_LENGTH
+             substitute_unknown_unset   use PCRE2_SUBSTITUTE_UNKNOWN_UNSET
+             substitute_unset_empty     use PCRE2_SUBSTITUTE_UNSET_EMPTY
+             zero_terminate             pass the subject as zero-terminated
+
+       The effects of these modifiers are described in the following sections.
+
+   Showing more text
+
+       The  aftertext modifier requests that as well as outputting the part of
+       the subject string that matched the entire pattern, pcre2test should in
+       addition output the remainder of the subject string. This is useful for
+       tests where the subject contains multiple copies of the same substring.
+       The  allaftertext  modifier  requests the same action for captured sub-
+       strings as well as the main matched substring. In each case the remain-
+       der is output on the following line with a plus character following the
+       capture number.
+
+       The allusedtext modifier requests that all the text that was  consulted
+       during  a  successful pattern match by the interpreter should be shown.
+       This feature is not supported for JIT matching, and if  requested  with
+       JIT  it  is  ignored  (with  a  warning message). Setting this modifier
+       affects the output if there is a lookbehind at the start of a match, or
+       a  lookahead  at  the  end, or if \K is used in the pattern. Characters
+       that precede or follow the start and end of the actual match are  indi-
+       cated  in  the output by '<' or '>' characters underneath them. Here is
+       an example:
+
+           re> /(?<=pqr)abc(?=xyz)/
+         data> 123pqrabcxyz456\=allusedtext
+          0: pqrabcxyz
+             <<<   >>>
+
+       This shows that the matched string is "abc",  with  the  preceding  and
+       following  strings  "pqr"  and  "xyz"  having been consulted during the
+       match (when processing the assertions).
+
+       The startchar modifier requests that the  starting  character  for  the
+       match  be  indicated,  if  it  is different to the start of the matched
+       string. The only time when this occurs is when \K has been processed as
+       part of the match. In this situation, the output for the matched string
+       is displayed from the starting character  instead  of  from  the  match
+       point,  with  circumflex  characters  under the earlier characters. For
+       example:
+
+           re> /abc\Kxyz/
+         data> abcxyz\=startchar
+          0: abcxyz
+             ^^^
+
+       Unlike allusedtext, the startchar modifier can be used with JIT.   How-
+       ever, these two modifiers are mutually exclusive.
+
+   Showing the value of all capture groups
+
+       The allcaptures modifier requests that the values of all potential cap-
+       tured parentheses be output after a match. By default, only those up to
+       the highest one actually used in the match are output (corresponding to
+       the return code from pcre2_match()). Groups that did not take  part  in
+       the match are output as "<unset>".
+
+   Testing callouts
+
+       A  callout function is supplied when pcre2test calls the library match-
+       ing functions, unless callout_none is specified. If callout_capture  is
+       set, the current captured groups are output when a callout occurs.
+
+       The  callout_fail modifier can be given one or two numbers. If there is
+       only one number, 1 is returned instead of 0 when a callout of that num-
+       ber  is  reached.  If two numbers are given, 1 is returned when callout
+       <n> is reached for the <m>th time. Note that callouts with string argu-
+       ments  are  always  given  the  number zero. See "Callouts" below for a
+       description of the output when a callout it taken.
+
+       The callout_data modifier can be given an unsigned or a  negative  num-
+       ber.   This  is  set  as the "user data" that is passed to the matching
+       function, and passed back when the callout  function  is  invoked.  Any
+       value  other  than  zero  is  used as a return from pcre2test's callout
+       function.
+
+   Finding all matches in a string
+
+       Searching for all possible matches within a subject can be requested by
+       the  global or /altglobal modifier. After finding a match, the matching
+       function is called again to search the remainder of  the  subject.  The
+       difference  between  global  and  altglobal is that the former uses the
+       start_offset argument to pcre2_match() or  pcre2_dfa_match()  to  start
+       searching  at  a new point within the entire string (which is what Perl
+       does), whereas the latter passes over a shortened subject. This makes a
+       difference to the matching process if the pattern begins with a lookbe-
+       hind assertion (including \b or \B).
+
+       If an empty string  is  matched,  the  next  match  is  done  with  the
+       PCRE2_NOTEMPTY_ATSTART and PCRE2_ANCHORED flags set, in order to search
+       for another, non-empty, match at the same point in the subject. If this
+       match  fails,  the  start  offset  is advanced, and the normal match is
+       retried. This imitates the way Perl handles such cases when  using  the
+       /g  modifier  or  the  split()  function. Normally, the start offset is
+       advanced by one character, but if  the  newline  convention  recognizes
+       CRLF  as  a newline, and the current character is CR followed by LF, an
+       advance of two characters occurs.
+
+   Testing substring extraction functions
+
+       The copy  and  get  modifiers  can  be  used  to  test  the  pcre2_sub-
+       string_copy_xxx() and pcre2_substring_get_xxx() functions.  They can be
+       given more than once, and each can specify a group name or number,  for
+       example:
+
+          abcd\=copy=1,copy=3,get=G1
+
+       If  the  #subject command is used to set default copy and/or get lists,
+       these can be unset by specifying a negative number to cancel  all  num-
+       bered groups and an empty name to cancel all named groups.
+
+       The  getall  modifier  tests pcre2_substring_list_get(), which extracts
+       all captured substrings.
+
+       If the subject line is successfully matched, the  substrings  extracted
+       by  the  convenience  functions  are  output  with C, G, or L after the
+       string number instead of a colon. This is in  addition  to  the  normal
+       full  list.  The string length (that is, the return from the extraction
+       function) is given in parentheses after each substring, followed by the
+       name when the extraction was by name.
+
+   Testing the substitution function
+
+       If  the  replace  modifier  is  set, the pcre2_substitute() function is
+       called instead of one of the matching functions. Note that  replacement
+       strings  cannot  contain commas, because a comma signifies the end of a
+       modifier. This is not thought to be an issue in a test program.
+
+       Unlike subject strings, pcre2test does not process replacement  strings
+       for  escape  sequences. In UTF mode, a replacement string is checked to
+       see if it is a valid UTF-8 string. If so, it is correctly converted  to
+       a  UTF  string of the appropriate code unit width. If it is not a valid
+       UTF-8 string, the individual code units are copied directly. This  pro-
+       vides a means of passing an invalid UTF-8 string for testing purposes.
+
+       The  following modifiers set options (in additional to the normal match
+       options) for pcre2_substitute():
+
+         global                      PCRE2_SUBSTITUTE_GLOBAL
+         substitute_extended         PCRE2_SUBSTITUTE_EXTENDED
+         substitute_overflow_length  PCRE2_SUBSTITUTE_OVERFLOW_LENGTH
+         substitute_unknown_unset    PCRE2_SUBSTITUTE_UNKNOWN_UNSET
+         substitute_unset_empty      PCRE2_SUBSTITUTE_UNSET_EMPTY
+
+
+       After a successful substitution, the modified string  is  output,  pre-
+       ceded  by the number of replacements. This may be zero if there were no
+       matches. Here is a simple example of a substitution test:
+
+         /abc/replace=xxx
+             =abc=abc=
+          1: =xxx=abc=
+             =abc=abc=\=global
+          2: =xxx=xxx=
+
+       Subject and replacement strings should be kept relatively short  (fewer
+       than  256 characters) for substitution tests, as fixed-size buffers are
+       used. To make it easy to test for buffer overflow, if  the  replacement
+       string  starts  with a number in square brackets, that number is passed
+       to pcre2_substitute() as the  size  of  the  output  buffer,  with  the
+       replacement  string  starting at the next character. Here is an example
+       that tests the edge case:
+
+         /abc/
+             123abc123\=replace=[10]XYZ
+          1: 123XYZ123
+             123abc123\=replace=[9]XYZ
+         Failed: error -47: no more memory
+
+       The   default   action   of    pcre2_substitute()    is    to    return
+       PCRE2_ERROR_NOMEMORY  when  the output buffer is too small. However, if
+       the PCRE2_SUBSTITUTE_OVERFLOW_LENGTH option is set (by using  the  sub-
+       stitute_overflow_length  modifier),  pcre2_substitute() continues to go
+       through the motions of matching and substituting, in order  to  compute
+       the size of buffer that is required. When this happens, pcre2test shows
+       the required buffer length (which includes space for the trailing zero)
+       as part of the error message. For example:
+
+         /abc/substitute_overflow_length
+             123abc123\=replace=[9]XYZ
+         Failed: error -47: no more memory: 10 code units are needed
+
+       A replacement string is ignored with POSIX and DFA matching. Specifying
+       partial matching provokes an error return  ("bad  option  value")  from
+       pcre2_substitute().
+
+   Setting the JIT stack size
+
+       The  jitstack modifier provides a way of setting the maximum stack size
+       that is used by the just-in-time optimization code. It  is  ignored  if
+       JIT optimization is not being used. The value is a number of kilobytes.
+       Providing a stack that is larger than the default 32K is necessary only
+       for very complicated patterns.
+
+   Setting match and recursion limits
+
+       The  match_limit and recursion_limit modifiers set the appropriate lim-
+       its in the match context. These values are ignored when the find_limits
+       modifier is specified.
+
+   Finding minimum limits
+
+       If  the  find_limits modifier is present, pcre2test calls pcre2_match()
+       several times, setting  different  values  in  the  match  context  via
+       pcre2_set_match_limit()  and pcre2_set_recursion_limit() until it finds
+       the minimum values for each parameter that allow pcre2_match() to  com-
+       plete without error.
+
+       If JIT is being used, only the match limit is relevant. If DFA matching
+       is being used, neither limit is relevant, and this modifier is  ignored
+       (with a warning message).
+
+       The  match_limit number is a measure of the amount of backtracking that
+       takes place, and learning the minimum value  can  be  instructive.  For
+       most  simple  matches, the number is quite small, but for patterns with
+       very large numbers of matching possibilities, it can become large  very
+       quickly    with    increasing    length    of   subject   string.   The
+       match_limit_recursion number is a measure of how  much  stack  (or,  if
+       PCRE2  is  compiled with NO_RECURSE, how much heap) memory is needed to
+       complete the match attempt.
+
+   Showing MARK names
+
+
+       The mark modifier causes the names from backtracking control verbs that
+       are  returned from calls to pcre2_match() to be displayed. If a mark is
+       returned for a match, non-match, or partial match, pcre2test shows  it.
+       For  a  match, it is on a line by itself, tagged with "MK:". Otherwise,
+       it is added to the non-match message.
+
+   Showing memory usage
+
+       The memory modifier causes pcre2test to log all memory  allocation  and
+       freeing calls that occur during a match operation.
+
+   Setting a starting offset
+
+       The  offset  modifier  sets  an  offset  in the subject string at which
+       matching starts. Its value is a number of code units, not characters.
+
+   Setting an offset limit
+
+       The offset_limit modifier sets a limit for  unanchored  matches.  If  a
+       match cannot be found starting at or before this offset in the subject,
+       a "no match" return is given. The data value is a number of code units,
+       not  characters. When this modifier is used, the use_offset_limit modi-
+       fier must have been set for the pattern; if not, an error is generated.
+
+   Setting the size of the output vector
+
+       The ovector modifier applies only to  the  subject  line  in  which  it
+       appears,  though  of  course  it can also be used to set a default in a
+       #subject command. It specifies the number of pairs of offsets that  are
+       available for storing matching information. The default is 15.
+
+       A  value of zero is useful when testing the POSIX API because it causes
+       regexec() to be called with a NULL capture vector. When not testing the
+       POSIX  API,  a  value  of  zero  is used to cause pcre2_match_data_cre-
+       ate_from_pattern() to be called, in order to create a  match  block  of
+       exactly the right size for the pattern. (It is not possible to create a
+       match block with a zero-length ovector; there is always  at  least  one
+       pair of offsets.)
+
+   Passing the subject as zero-terminated
+
+       By default, the subject string is passed to a native API matching func-
+       tion with its correct length. In order to test the facility for passing
+       a  zero-terminated  string, the zero_terminate modifier is provided. It
+       causes the length to be passed as PCRE2_ZERO_TERMINATED. (When matching
+       via  the  POSIX  interface, this modifier has no effect, as there is no
+       facility for passing a length.)
+
+       When testing pcre2_substitute(), this modifier also has the  effect  of
+       passing the replacement string as zero-terminated.
+
+   Passing a NULL context
+
+       Normally,   pcre2test   passes   a   context  block  to  pcre2_match(),
+       pcre2_dfa_match() or pcre2_jit_match(). If the null_context modifier is
+       set,  however,  NULL  is  passed. This is for testing that the matching
+       functions behave correctly in this case (they use default values). This
+       modifier  cannot  be used with the find_limits modifier or when testing
+       the substitution function.
+
+
+THE ALTERNATIVE MATCHING FUNCTION
+
+       By default,  pcre2test  uses  the  standard  PCRE2  matching  function,
+       pcre2_match() to match each subject line. PCRE2 also supports an alter-
+       native matching function, pcre2_dfa_match(), which operates in  a  dif-
+       ferent  way, and has some restrictions. The differences between the two
+       functions are described in the pcre2matching documentation.
+
+       If the dfa modifier is set, the alternative matching function is  used.
+       This  function  finds all possible matches at a given point in the sub-
+       ject. If, however, the dfa_shortest modifier is set,  processing  stops
+       after  the  first  match is found. This is always the shortest possible
+       match.
+
+
+DEFAULT OUTPUT FROM pcre2test
+
+       This section describes the output when the  normal  matching  function,
+       pcre2_match(), is being used.
+
+       When  a  match  succeeds,  pcre2test  outputs the list of captured sub-
+       strings, starting with number 0 for the string that matched  the  whole
+       pattern.    Otherwise,  it  outputs  "No  match"  when  the  return  is
+       PCRE2_ERROR_NOMATCH, or "Partial  match:"  followed  by  the  partially
+       matching  substring  when the return is PCRE2_ERROR_PARTIAL. (Note that
+       this is the entire substring that  was  inspected  during  the  partial
+       match;  it  may  include  characters before the actual match start if a
+       lookbehind assertion, \K, \b, or \B was involved.)
+
+       For any other return, pcre2test outputs the PCRE2 negative error number
+       and  a  short  descriptive  phrase. If the error is a failed UTF string
+       check, the code unit offset of the start of the  failing  character  is
+       also output. Here is an example of an interactive pcre2test run.
+
+         $ pcre2test
+         PCRE2 version 9.00 2014-05-10
+
+           re> /^abc(\d+)/
+         data> abc123
+          0: abc123
+          1: 123
+         data> xyz
+         No match
+
+       Unset capturing substrings that are not followed by one that is set are
+       not shown by pcre2test unless the allcaptures modifier is specified. In
+       the following example, there are two capturing substrings, but when the
+       first data line is matched, the second, unset substring is  not  shown.
+       An  "internal" unset substring is shown as "<unset>", as for the second
+       data line.
+
+           re> /(a)|(b)/
+         data> a
+          0: a
+          1: a
+         data> b
+          0: b
+          1: <unset>
+          2: b
+
+       If the strings contain any non-printing characters, they are output  as
+       \xhh  escapes  if  the  value is less than 256 and UTF mode is not set.
+       Otherwise they are output as \x{hh...} escapes. See below for the defi-
+       nition  of  non-printing characters. If the /aftertext modifier is set,
+       the output for substring 0 is followed by the the rest of  the  subject
+       string, identified by "0+" like this:
+
+           re> /cat/aftertext
+         data> cataract
+          0: cat
+          0+ aract
+
+       If  global  matching  is  requested, the results of successive matching
+       attempts are output in sequence, like this:
+
+           re> /\Bi(\w\w)/g
+         data> Mississippi
+          0: iss
+          1: ss
+          0: iss
+          1: ss
+          0: ipp
+          1: pp
+
+       "No match" is output only if the first match attempt fails. Here is  an
+       example  of  a  failure  message (the offset 4 that is specified by the
+       offset modifier is past the end of the subject string):
+
+           re> /xyz/
+         data> xyz\=offset=4
+         Error -24 (bad offset value)
+
+       Note that whereas patterns can be continued over several lines (a plain
+       ">"  prompt  is used for continuations), subject lines may not. However
+       newlines can be included in a subject by means of the \n escape (or \r,
+       \r\n, etc., depending on the newline sequence setting).
+
+
+OUTPUT FROM THE ALTERNATIVE MATCHING FUNCTION
+
+       When the alternative matching function, pcre2_dfa_match(), is used, the
+       output consists of a list of all the matches that start  at  the  first
+       point in the subject where there is at least one match. For example:
+
+           re> /(tang|tangerine|tan)/
+         data> yellow tangerine\=dfa
+          0: tangerine
+          1: tang
+          2: tan
+
+       Using  the normal matching function on this data finds only "tang". The
+       longest matching string is always  given  first  (and  numbered  zero).
+       After  a  PCRE2_ERROR_PARTIAL  return,  the output is "Partial match:",
+       followed by the partially matching substring. Note  that  this  is  the
+       entire  substring  that  was inspected during the partial match; it may
+       include characters before the actual match start if a lookbehind asser-
+       tion, \b, or \B was involved. (\K is not supported for DFA matching.)
+
+       If global matching is requested, the search for further matches resumes
+       at the end of the longest match. For example:
+
+           re> /(tang|tangerine|tan)/g
+         data> yellow tangerine and tangy sultana\=dfa
+          0: tangerine
+          1: tang
+          2: tan
+          0: tang
+          1: tan
+          0: tan
+
+       The alternative matching function does not support  substring  capture,
+       so  the  modifiers  that are concerned with captured substrings are not
+       relevant.
+
+
+RESTARTING AFTER A PARTIAL MATCH
+
+       When the alternative matching function has given  the  PCRE2_ERROR_PAR-
+       TIAL return, indicating that the subject partially matched the pattern,
+       you can restart the match with additional subject data by means of  the
+       dfa_restart modifier. For example:
+
+           re> /^\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d$/
+         data> 23ja\=P,dfa
+         Partial match: 23ja
+         data> n05\=dfa,dfa_restart
+          0: n05
+
+       For  further  information  about partial matching, see the pcre2partial
+       documentation.
+
+
+CALLOUTS
+
+       If the pattern contains any callout requests, pcre2test's callout func-
+       tion  is called during matching unless callout_none is specified.  This
+       works with both matching functions.
+
+       The callout function in pcre2test returns zero (carry on  matching)  by
+       default,  but you can use a callout_fail modifier in a subject line (as
+       described above) to change this and other parameters of the callout.
+
+       Inserting callouts can be helpful when using pcre2test to check compli-
+       cated  regular expressions. For further information about callouts, see
+       the pcre2callout documentation.
+
+       The output for callouts with numerical arguments and those with  string
+       arguments is slightly different.
+
+   Callouts with numerical arguments
+
+       By default, the callout function displays the callout number, the start
+       and current positions in the subject text at the callout time, and  the
+       next pattern item to be tested. For example:
+
+         --->pqrabcdef
+           0    ^  ^     \d
+
+       This  output  indicates  that  callout  number  0  occurred for a match
+       attempt starting at the fourth character of the  subject  string,  when
+       the  pointer  was  at  the seventh character, and when the next pattern
+       item was \d. Just one circumflex is output if  the  start  and  current
+       positions are the same.
+
+       Callouts numbered 255 are assumed to be automatic callouts, inserted as
+       a result of the /auto_callout pattern modifier. In this  case,  instead
+       of showing the callout number, the offset in the pattern, preceded by a
+       plus, is output. For example:
+
+           re> /\d?[A-E]\*/auto_callout
+         data> E*
+         --->E*
+          +0 ^      \d?
+          +3 ^      [A-E]
+          +8 ^^     \*
+         +10 ^ ^
+          0: E*
+
+       If a pattern contains (*MARK) items, an additional line is output when-
+       ever  a  change  of  latest mark is passed to the callout function. For
+       example:
+
+           re> /a(*MARK:X)bc/auto_callout
+         data> abc
+         --->abc
+          +0 ^       a
+          +1 ^^      (*MARK:X)
+         +10 ^^      b
+         Latest Mark: X
+         +11 ^ ^     c
+         +12 ^  ^
+          0: abc
+
+       The mark changes between matching "a" and "b", but stays the  same  for
+       the  rest  of  the match, so nothing more is output. If, as a result of
+       backtracking, the mark reverts to being unset, the  text  "<unset>"  is
+       output.
+
+   Callouts with string arguments
+
+       The output for a callout with a string argument is similar, except that
+       instead of outputting a callout number before the position  indicators,
+       the  callout  string  and  its  offset in the pattern string are output
+       before the reflection of the subject string, and the subject string  is
+       reflected for each callout. For example:
+
+           re> /^ab(?C'first')cd(?C"second")ef/
+         data> abcdefg
+         Callout (7): 'first'
+         --->abcdefg
+             ^ ^         c
+         Callout (20): "second"
+         --->abcdefg
+             ^   ^       e
+          0: abcdef
+
+
+NON-PRINTING CHARACTERS
+
+       When pcre2test is outputting text in the compiled version of a pattern,
+       bytes other than 32-126 are always treated as  non-printing  characters
+       and are therefore shown as hex escapes.
+
+       When  pcre2test  is outputting text that is a matched part of a subject
+       string, it behaves in the same way, unless a different locale has  been
+       set  for  the  pattern  (using the /locale modifier). In this case, the
+       isprint() function is used to  distinguish  printing  and  non-printing
+       characters.
+
+
+SAVING AND RESTORING COMPILED PATTERNS
+
+       It  is  possible  to  save  compiled patterns on disc or elsewhere, and
+       reload them later, subject to a number of restrictions. JIT data cannot
+       be  saved.  The host on which the patterns are reloaded must be running
+       the same version of PCRE2, with the same code unit width, and must also
+       have  the  same  endianness,  pointer width and PCRE2_SIZE type. Before
+       compiled patterns can be saved they must be serialized, that  is,  con-
+       verted  to a stream of bytes. A single byte stream may contain any num-
+       ber of compiled patterns, but they must  all  use  the  same  character
+       tables. A single copy of the tables is included in the byte stream (its
+       size is 1088 bytes).
+
+       The functions whose names begin  with  pcre2_serialize_  are  used  for
+       serializing  and de-serializing. They are described in the pcre2serial-
+       ize  documentation.  In  this  section  we  describe  the  features  of
+       pcre2test that can be used to test these functions.
+
+       When  a  pattern  with  push  modifier  is successfully compiled, it is
+       pushed onto a stack of compiled patterns,  and  pcre2test  expects  the
+       next  line  to  contain a new pattern (or command) instead of a subject
+       line. By this means, a number of patterns can be compiled and retained.
+       The  push  modifier  is  incompatible with posix, and control modifiers
+       that act at match time are ignored (with a message). The jitverify mod-
+       ifier applies only at compile time. The command
+
+         #save <filename>
+
+       causes all the stacked patterns to be serialized and the result written
+       to the named file. Afterwards, all the stacked patterns are freed.  The
+       command
+
+         #load <filename>
+
+       reads  the  data in the file, and then arranges for it to be de-serial-
+       ized, with the resulting compiled patterns added to the pattern  stack.
+       The  pattern  on the top of the stack can be retrieved by the #pop com-
+       mand, which must be followed by  lines  of  subjects  that  are  to  be
+       matched  with  the pattern, terminated as usual by an empty line or end
+       of file. This command may be followed by  a  modifier  list  containing
+       only  control  modifiers that act after a pattern has been compiled. In
+       particular, hex, posix, and push are not allowed, nor are  any  option-
+       setting  modifiers.   The JIT modifiers are, however permitted. Here is
+       an example that saves and reloads two patterns.
+
+         /abc/push
+         /xyz/push
+         #save tempfile
+         #load tempfile
+         #pop info
+         xyz
+
+         #pop jit,bincode
+         abc
+
+       If jitverify is used with #pop, it does not  automatically  imply  jit,
+       which is different behaviour from when it is used on a pattern.
+
+
+SEE ALSO
+
+       pcre2(3),  pcre2api(3),  pcre2callout(3),  pcre2jit,  pcre2matching(3),
+       pcre2partial(d), pcre2pattern(3), pcre2serialize(3).
+
+
+AUTHOR
+
+       Philip Hazel
+       University Computing Service
+       Cambridge, England.
+
+
+REVISION
+
+       Last updated: 12 December 2015
+       Copyright (c) 1997-2015 University of Cambridge.
diff --git a/dist2/doc/pcre2unicode.3 b/dist2/doc/pcre2unicode.3
new file mode 100644
index 0000000..59e226e
--- /dev/null
+++ b/dist2/doc/pcre2unicode.3
@@ -0,0 +1,268 @@
+.TH PCRE2UNICODE 3 "16 October 2015" "PCRE2 10.21"
+.SH NAME
+PCRE - Perl-compatible regular expressions (revised API)
+.SH "UNICODE AND UTF SUPPORT"
+.rs
+.sp
+When PCRE2 is built with Unicode support (which is the default), it has
+knowledge of Unicode character properties and can process text strings in
+UTF-8, UTF-16, or UTF-32 format (depending on the code unit width). However, by
+default, PCRE2 assumes that one code unit is one character. To process a
+pattern as a UTF string, where a character may require more than one code unit,
+you must call
+.\" HREF
+\fBpcre2_compile()\fP
+.\"
+with the PCRE2_UTF option flag, or the pattern must start with the sequence
+(*UTF). When either of these is the case, both the pattern and any subject
+strings that are matched against it are treated as UTF strings instead of
+strings of individual one-code-unit characters.
+.P
+If you do not need Unicode support you can build PCRE2 without it, in which
+case the library will be smaller.
+.
+.
+.SH "UNICODE PROPERTY SUPPORT"
+.rs
+.sp
+When PCRE2 is built with Unicode support, the escape sequences \ep{..},
+\eP{..}, and \eX can be used. The Unicode 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, the Unicode script names such as Arabic or Han, and
+the derived properties Any and L&. Full lists are given in the
+.\" HREF
+\fBpcre2pattern\fP
+.\"
+and
+.\" HREF
+\fBpcre2syntax\fP
+.\"
+documentation. Only the short names for properties are supported. For example,
+\ep{L} matches a letter. Its Perl synonym, \ep{Letter}, is not supported.
+Furthermore, in Perl, many properties may optionally be prefixed by "Is", for
+compatibility with Perl 5.6. PCRE does not support this.
+.
+.
+.SH "WIDE CHARACTERS AND UTF MODES"
+.rs
+.sp
+Codepoints less than 256 can be specified in patterns by either braced or
+unbraced hexadecimal escape sequences (for example, \ex{b3} or \exb3). Larger
+values have to use braced sequences. Unbraced octal code points up to \e777 are
+also recognized; larger ones can be coded using \eo{...}.
+.P
+In UTF modes, repeat quantifiers apply to complete UTF characters, not to
+individual code units.
+.P
+In UTF modes, the dot metacharacter matches one UTF character instead of a
+single code unit.
+.P
+The escape sequence \eC can be used to match a single code unit, in a UTF mode,
+but its use can lead to some strange effects because it breaks up multi-unit
+characters (see the description of \eC in the
+.\" HREF
+\fBpcre2pattern\fP
+.\"
+documentation). The use of \eC is not supported by the alternative matching
+function \fBpcre2_dfa_match()\fP when in UTF mode. Its use provokes a
+match-time error. The JIT optimization also does not support \eC in UTF mode.
+If JIT optimization is requested for a UTF pattern that contains \eC, it will
+not succeed, and so the matching will be carried out by the normal interpretive
+function.
+.P
+The character escapes \eb, \eB, \ed, \eD, \es, \eS, \ew, and \eW correctly test
+characters of any code value, but, by default, the characters that PCRE2
+recognizes as digits, spaces, or word characters remain the same set as in
+non-UTF mode, all with code points less than 256. This remains true even when
+PCRE2 is built to include Unicode support, because to do otherwise would slow
+down matching in many common cases. Note that this also applies to \eb
+and \eB, because they are defined in terms of \ew and \eW. If you want
+to test for a wider sense of, say, "digit", you can use explicit Unicode
+property tests such as \ep{Nd}. Alternatively, if you set the PCRE2_UCP option,
+the way that the character escapes work is changed so that Unicode properties
+are used to determine which characters match. There are more details in the
+section on
+.\" HTML <a href="pcre2pattern.html#genericchartypes">
+.\" </a>
+generic character types
+.\"
+in the
+.\" HREF
+\fBpcre2pattern\fP
+.\"
+documentation.
+.P
+Similarly, characters that match the POSIX named character classes are all
+low-valued characters, unless the PCRE2_UCP option is set.
+.P
+However, the special horizontal and vertical white space matching escapes (\eh,
+\eH, \ev, and \eV) do match all the appropriate Unicode characters, whether or
+not PCRE2_UCP is set.
+.P
+Case-insensitive matching in UTF mode makes use of Unicode properties. A few
+Unicode characters such as Greek sigma have more than two codepoints that are
+case-equivalent, and these are treated as such.
+.
+.
+.SH "VALIDITY OF UTF STRINGS"
+.rs
+.sp
+When the PCRE2_UTF option is set, the strings passed as patterns and subjects
+are (by default) checked for validity on entry to the relevant functions.
+If an invalid UTF string is passed, an negative error code is returned. The
+code unit offset to the offending character can be extracted from the match
+data block by calling \fBpcre2_get_startchar()\fP, which is used for this
+purpose after a UTF error.
+.P
+UTF-16 and UTF-32 strings can indicate their endianness by special code knows
+as a byte-order mark (BOM). The PCRE2 functions do not handle this, expecting
+strings to be in host byte order.
+.P
+A UTF string is checked before any other processing takes place. In the case of
+\fBpcre2_match()\fP and \fBpcre2_dfa_match()\fP calls with a non-zero starting
+offset, the check is applied only to that part of the subject that could be
+inspected during matching, and there is a check that the starting offset points
+to the first code unit of a character or to the end of the subject. If there
+are no lookbehind assertions in the pattern, the check starts at the starting
+offset. Otherwise, it starts at the length of the longest lookbehind before the
+starting offset, or at the start of the subject if there are not that many
+characters before the starting offset. Note that the sequences \eb and \eB are
+one-character lookbehinds.
+.P
+In addition to checking the format of the string, there is a check to ensure
+that all code points lie in the range U+0 to U+10FFFF, excluding the surrogate
+area. The so-called "non-character" code points are not excluded because
+Unicode corrigendum #9 makes it clear that they should not be.
+.P
+Characters in the "Surrogate Area" of Unicode are reserved for use by UTF-16,
+where they are used in pairs to encode code points with values greater than
+0xFFFF. The code points that are encoded by UTF-16 pairs are available
+independently in the UTF-8 and UTF-32 encodings. (In other words, the whole
+surrogate thing is a fudge for UTF-16 which unfortunately messes up UTF-8 and
+UTF-32.)
+.P
+In some situations, you may already know that your strings are valid, and
+therefore want to skip these checks in order to improve performance, for
+example in the case of a long subject string that is being scanned repeatedly.
+If you set the PCRE2_NO_UTF_CHECK option at compile time or at match time,
+PCRE2 assumes that the pattern or subject it is given (respectively) contains
+only valid UTF code unit sequences.
+.P
+Passing PCRE2_NO_UTF_CHECK to \fBpcre2_compile()\fP just disables the check for
+the pattern; it does not also apply to subject strings. If you want to disable
+the check for a subject string you must pass this option to \fBpcre2_match()\fP
+or \fBpcre2_dfa_match()\fP.
+.P
+If you pass an invalid UTF string when PCRE2_NO_UTF_CHECK is set, the result
+is undefined and your program may crash or loop indefinitely.
+.
+.
+.\" HTML <a name="utf8strings"></a>
+.SS "Errors in UTF-8 strings"
+.rs
+.sp
+The following negative error codes are given for invalid UTF-8 strings:
+.sp
+  PCRE2_ERROR_UTF8_ERR1
+  PCRE2_ERROR_UTF8_ERR2
+  PCRE2_ERROR_UTF8_ERR3
+  PCRE2_ERROR_UTF8_ERR4
+  PCRE2_ERROR_UTF8_ERR5
+.sp
+The string ends with a truncated UTF-8 character; the code specifies how many
+bytes are missing (1 to 5). Although RFC 3629 restricts UTF-8 characters to be
+no longer than 4 bytes, the encoding scheme (originally defined by RFC 2279)
+allows for up to 6 bytes, and this is checked first; hence the possibility of
+4 or 5 missing bytes.
+.sp
+  PCRE2_ERROR_UTF8_ERR6
+  PCRE2_ERROR_UTF8_ERR7
+  PCRE2_ERROR_UTF8_ERR8
+  PCRE2_ERROR_UTF8_ERR9
+  PCRE2_ERROR_UTF8_ERR10
+.sp
+The two most significant bits of the 2nd, 3rd, 4th, 5th, or 6th byte of the
+character do not have the binary value 0b10 (that is, either the most
+significant bit is 0, or the next bit is 1).
+.sp
+  PCRE2_ERROR_UTF8_ERR11
+  PCRE2_ERROR_UTF8_ERR12
+.sp
+A character that is valid by the RFC 2279 rules is either 5 or 6 bytes long;
+these code points are excluded by RFC 3629.
+.sp
+  PCRE2_ERROR_UTF8_ERR13
+.sp
+A 4-byte character has a value greater than 0x10fff; these code points are
+excluded by RFC 3629.
+.sp
+  PCRE2_ERROR_UTF8_ERR14
+.sp
+A 3-byte character has a value in the range 0xd800 to 0xdfff; this range of
+code points are reserved by RFC 3629 for use with UTF-16, and so are excluded
+from UTF-8.
+.sp
+  PCRE2_ERROR_UTF8_ERR15
+  PCRE2_ERROR_UTF8_ERR16
+  PCRE2_ERROR_UTF8_ERR17
+  PCRE2_ERROR_UTF8_ERR18
+  PCRE2_ERROR_UTF8_ERR19
+.sp
+A 2-, 3-, 4-, 5-, or 6-byte character is "overlong", that is, it codes for a
+value that can be represented by fewer bytes, which is invalid. For example,
+the two bytes 0xc0, 0xae give the value 0x2e, whose correct coding uses just
+one byte.
+.sp
+  PCRE2_ERROR_UTF8_ERR20
+.sp
+The two most significant bits of the first byte of a character have the binary
+value 0b10 (that is, the most significant bit is 1 and the second is 0). Such a
+byte can only validly occur as the second or subsequent byte of a multi-byte
+character.
+.sp
+  PCRE2_ERROR_UTF8_ERR21
+.sp
+The first byte of a character has the value 0xfe or 0xff. These values can
+never occur in a valid UTF-8 string.
+.
+.
+.\" HTML <a name="utf16strings"></a>
+.SS "Errors in UTF-16 strings"
+.rs
+.sp
+The following negative error codes are given for invalid UTF-16 strings:
+.sp
+  PCRE_UTF16_ERR1  Missing low surrogate at end of string
+  PCRE_UTF16_ERR2  Invalid low surrogate follows high surrogate
+  PCRE_UTF16_ERR3  Isolated low surrogate
+.sp
+.
+.
+.\" HTML <a name="utf32strings"></a>
+.SS "Errors in UTF-32 strings"
+.rs
+.sp
+The following negative error codes are given for invalid UTF-32 strings:
+.sp
+  PCRE_UTF32_ERR1  Surrogate character (range from 0xd800 to 0xdfff)
+  PCRE_UTF32_ERR2  Code point is greater than 0x10ffff
+.sp
+.
+.
+.SH AUTHOR
+.rs
+.sp
+.nf
+Philip Hazel
+University Computing Service
+Cambridge, England.
+.fi
+.
+.
+.SH REVISION
+.rs
+.sp
+.nf
+Last updated: 16 October 2015
+Copyright (c) 1997-2015 University of Cambridge.
+.fi
diff --git a/dist/install-sh b/dist2/install-sh
similarity index 100%
rename from dist/install-sh
rename to dist2/install-sh
diff --git a/dist2/libpcre2-16.pc.in b/dist2/libpcre2-16.pc.in
new file mode 100644
index 0000000..978040d
--- /dev/null
+++ b/dist2/libpcre2-16.pc.in
@@ -0,0 +1,13 @@
+# Package Information for pkg-config
+
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: libpcre2-16
+Description: PCRE2 - Perl compatible regular expressions C library (2nd API) with 16 bit character support
+Version: @PACKAGE_VERSION@
+Libs: -L${libdir} -lpcre2-16
+Libs.private: @PTHREAD_CFLAGS@ @PTHREAD_LIBS@
+Cflags: -I${includedir} @PCRE2_STATIC_CFLAG@
diff --git a/dist2/libpcre2-32.pc.in b/dist2/libpcre2-32.pc.in
new file mode 100644
index 0000000..d8fb187
--- /dev/null
+++ b/dist2/libpcre2-32.pc.in
@@ -0,0 +1,13 @@
+# Package Information for pkg-config
+
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: libpcre2-32
+Description: PCRE2 - Perl compatible regular expressions C library (2nd API) with 32 bit character support
+Version: @PACKAGE_VERSION@
+Libs: -L${libdir} -lpcre2-32
+Libs.private: @PTHREAD_CFLAGS@ @PTHREAD_LIBS@
+Cflags: -I${includedir} @PCRE2_STATIC_CFLAG@
diff --git a/dist2/libpcre2-8.pc.in b/dist2/libpcre2-8.pc.in
new file mode 100644
index 0000000..5c872d0
--- /dev/null
+++ b/dist2/libpcre2-8.pc.in
@@ -0,0 +1,13 @@
+# Package Information for pkg-config
+
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: libpcre2-8
+Description: PCRE2 - Perl compatible regular expressions C library (2nd API) with 8 bit character support
+Version: @PACKAGE_VERSION@
+Libs: -L${libdir} -lpcre2-8
+Libs.private: @PTHREAD_CFLAGS@ @PTHREAD_LIBS@
+Cflags: -I${includedir} @PCRE2_STATIC_CFLAG@
diff --git a/dist2/libpcre2-posix.pc.in b/dist2/libpcre2-posix.pc.in
new file mode 100644
index 0000000..9641555
--- /dev/null
+++ b/dist2/libpcre2-posix.pc.in
@@ -0,0 +1,13 @@
+# Package Information for pkg-config
+
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: libpcre2-posix
+Description: Posix compatible interface to libpcre2-8
+Version: @PACKAGE_VERSION@
+Libs: -L${libdir} -lpcre2-posix
+Cflags: -I${includedir} @PCRE2_STATIC_CFLAG@
+Requires.private: libpcre2-8
diff --git a/dist/ltmain.sh b/dist2/ltmain.sh
similarity index 100%
rename from dist/ltmain.sh
rename to dist2/ltmain.sh
diff --git a/dist/m4/ax_pthread.m4 b/dist2/m4/ax_pthread.m4
similarity index 100%
rename from dist/m4/ax_pthread.m4
rename to dist2/m4/ax_pthread.m4
diff --git a/dist/m4/libtool.m4 b/dist2/m4/libtool.m4
similarity index 100%
rename from dist/m4/libtool.m4
rename to dist2/m4/libtool.m4
diff --git a/dist/m4/ltoptions.m4 b/dist2/m4/ltoptions.m4
similarity index 100%
rename from dist/m4/ltoptions.m4
rename to dist2/m4/ltoptions.m4
diff --git a/dist/m4/ltsugar.m4 b/dist2/m4/ltsugar.m4
similarity index 100%
rename from dist/m4/ltsugar.m4
rename to dist2/m4/ltsugar.m4
diff --git a/dist/m4/ltversion.m4 b/dist2/m4/ltversion.m4
similarity index 100%
rename from dist/m4/ltversion.m4
rename to dist2/m4/ltversion.m4
diff --git a/dist/m4/lt~obsolete.m4 b/dist2/m4/lt~obsolete.m4
similarity index 100%
rename from dist/m4/lt~obsolete.m4
rename to dist2/m4/lt~obsolete.m4
diff --git a/dist/m4/pcre_visibility.m4 b/dist2/m4/pcre2_visibility.m4
similarity index 68%
rename from dist/m4/pcre_visibility.m4
rename to dist2/m4/pcre2_visibility.m4
index 30aff87..480f2ee 100644
--- a/dist/m4/pcre_visibility.m4
+++ b/dist2/m4/pcre2_visibility.m4
@@ -21,8 +21,9 @@
 dnl Defines and sets the variable HAVE_VISIBILITY.
 
 dnl Modified to fit with PCRE build environment by Cristian Rodríguez.
+dnl Adjusted for PCRE2 by PH
 
-AC_DEFUN([PCRE_VISIBILITY],
+AC_DEFUN([PCRE2_VISIBILITY],
 [
   AC_REQUIRE([AC_PROG_CC])
   VISIBILITY_CFLAGS=
@@ -33,26 +34,26 @@
     dnl whether it leads to an error because of some other option that the
     dnl user has put into $CC $CFLAGS $CPPFLAGS.
     AC_MSG_CHECKING([whether the -Werror option is usable])
-    AC_CACHE_VAL([pcre_cv_cc_vis_werror], [
-      pcre_save_CFLAGS="$CFLAGS"
+    AC_CACHE_VAL([pcre2_cv_cc_vis_werror], [
+      pcre2_save_CFLAGS="$CFLAGS"
       CFLAGS="$CFLAGS -Werror"
       AC_COMPILE_IFELSE(
         [AC_LANG_PROGRAM([[]], [[]])],
-        [pcre_cv_cc_vis_werror=yes],
-        [pcre_cv_cc_vis_werror=no])
-      CFLAGS="$pcre_save_CFLAGS"])
-    AC_MSG_RESULT([$pcre_cv_cc_vis_werror])
+        [pcre2_cv_cc_vis_werror=yes],
+        [pcre2_cv_cc_vis_werror=no])
+      CFLAGS="$pcre2_save_CFLAGS"])
+    AC_MSG_RESULT([$pcre2_cv_cc_vis_werror])
     dnl Now check whether visibility declarations are supported.
     AC_MSG_CHECKING([for simple visibility declarations])
-    AC_CACHE_VAL([pcre_cv_cc_visibility], [
-      pcre_save_CFLAGS="$CFLAGS"
+    AC_CACHE_VAL([pcre2_cv_cc_visibility], [
+      pcre2_save_CFLAGS="$CFLAGS"
       CFLAGS="$CFLAGS -fvisibility=hidden"
       dnl We use the option -Werror and a function dummyfunc, because on some
       dnl platforms (Cygwin 1.7) the use of -fvisibility triggers a warning
       dnl "visibility attribute not supported in this configuration; ignored"
       dnl at the first function definition in every compilation unit, and we
       dnl don't want to use the option in this case.
-      if test $pcre_cv_cc_vis_werror = yes; then
+      if test $pcre2_cv_cc_vis_werror = yes; then
         CFLAGS="$CFLAGS -Werror"
       fi
       AC_COMPILE_IFELSE(
@@ -64,21 +65,18 @@
              void dummyfunc (void) {}
            ]],
            [[]])],
-        [pcre_cv_cc_visibility=yes],
-        [pcre_cv_cc_visibility=no])
-      CFLAGS="$pcre_save_CFLAGS"])
-    AC_MSG_RESULT([$pcre_cv_cc_visibility])
-    if test $pcre_cv_cc_visibility = yes; then
+        [pcre2_cv_cc_visibility=yes],
+        [pcre2_cv_cc_visibility=no])
+      CFLAGS="$pcre2_save_CFLAGS"])
+    AC_MSG_RESULT([$pcre2_cv_cc_visibility])
+    if test $pcre2_cv_cc_visibility = yes; then
       VISIBILITY_CFLAGS="-fvisibility=hidden"
       VISIBILITY_CXXFLAGS="-fvisibility=hidden -fvisibility-inlines-hidden"
       HAVE_VISIBILITY=1
-      AC_DEFINE(PCRE_EXP_DECL, [extern __attribute__ ((visibility ("default")))], [to make a symbol visible])
-      AC_DEFINE(PCRE_EXP_DEFN, [__attribute__ ((visibility ("default")))], [to make a symbol visible])
-      AC_DEFINE(PCRE_EXP_DATA_DEFN, [__attribute__ ((visibility ("default")))], [to make a symbol visible])
-      AC_DEFINE(PCREPOSIX_EXP_DECL, [extern __attribute__ ((visibility ("default")))], [to make a symbol visible])
-      AC_DEFINE(PCREPOSIX_EXP_DEFN, [extern __attribute__ ((visibility ("default")))], [to make a symbol visible])
-      AC_DEFINE(PCRECPP_EXP_DECL, [extern __attribute__ ((visibility ("default")))], [to make a symbol visible])
-      AC_DEFINE(PCRECPP_EXP_DEFN, [__attribute__ ((visibility ("default")))], [to make a symbol visible])
+      AC_DEFINE(PCRE2_EXP_DECL, [extern __attribute__ ((visibility ("default")))], [to make a symbol visible])
+      AC_DEFINE(PCRE2_EXP_DEFN, [__attribute__ ((visibility ("default")))], [to make a symbol visible])
+      AC_DEFINE(PCRE2POSIX_EXP_DECL, [extern __attribute__ ((visibility ("default")))], [to make a symbol visible])
+      AC_DEFINE(PCRE2POSIX_EXP_DEFN, [extern __attribute__ ((visibility ("default")))], [to make a symbol visible])
     fi
   fi
   AC_SUBST([VISIBILITY_CFLAGS])
diff --git a/dist/missing b/dist2/missing
similarity index 100%
rename from dist/missing
rename to dist2/missing
diff --git a/dist/pcre-config.in b/dist2/pcre2-config.in
similarity index 63%
rename from dist/pcre-config.in
rename to dist2/pcre2-config.in
index ac06a33..932160e 100644
--- a/dist/pcre-config.in
+++ b/dist2/pcre2-config.in
@@ -5,27 +5,22 @@
 exec_prefix_set=no
 
 cflags="[--cflags]"
+libs=
 
-if test @enable_cpp@ = yes ; then
-  libs="[--libs-cpp]"
-else
-  libs=
-fi
-
-if test @enable_pcre16@ = yes ; then
+if test @enable_pcre2_16@ = yes ; then
   libs="[--libs16] $libs"
 fi
 
-if test @enable_pcre32@ = yes ; then
+if test @enable_pcre2_32@ = yes ; then
   libs="[--libs32] $libs"
 fi
 
-if test @enable_pcre8@ = yes ; then
-  libs="[--libs] [--libs-posix] $libs"
+if test @enable_pcre2_8@ = yes ; then
+  libs="[--libs8] [--libs-posix] $libs"
   cflags="$cflags [--cflags-posix]"
 fi
 
-usage="Usage: pcre-config [--prefix] [--exec-prefix] [--version] $libs $cflags"
+usage="Usage: pcre2-config [--prefix] [--exec-prefix] [--version] $libs $cflags"
 
 if test $# -eq 0; then
       echo "${usage}" 1>&2
@@ -77,49 +72,42 @@
       if test @includedir@ != /usr/include ; then
         includes=-I@includedir@
       fi
-      echo $includes @PCRE_STATIC_CFLAG@
+      echo $includes @PCRE2_STATIC_CFLAG@
       ;;
     --cflags-posix)
-      if test @enable_pcre8@ = yes ; then
+      if test @enable_pcre2_8@ = yes ; then
         if test @includedir@ != /usr/include ; then
           includes=-I@includedir@
         fi
-        echo $includes @PCRE_STATIC_CFLAG@
+        echo $includes @PCRE2_STATIC_CFLAG@
       else
         echo "${usage}" 1>&2
       fi
       ;;
     --libs-posix)
-      if test @enable_pcre8@ = yes ; then
-        echo $libS$libR -lpcreposix -lpcre
+      if test @enable_pcre2_8@ = yes ; then
+        echo $libS$libR -lpcre2posix -lpcre2-8
       else
         echo "${usage}" 1>&2
       fi
       ;;
-    --libs)
-      if test @enable_pcre8@ = yes ; then
-        echo $libS$libR -lpcre
+    --libs8)
+      if test @enable_pcre2_8@ = yes ; then
+        echo $libS$libR -lpcre2-8
       else
         echo "${usage}" 1>&2
       fi
       ;;
     --libs16)
-      if test @enable_pcre16@ = yes ; then
-        echo $libS$libR -lpcre16
+      if test @enable_pcre2_16@ = yes ; then
+        echo $libS$libR -lpcre2-16
       else
         echo "${usage}" 1>&2
       fi
       ;;
     --libs32)
-      if test @enable_pcre32@ = yes ; then
-        echo $libS$libR -lpcre32
-      else
-        echo "${usage}" 1>&2
-      fi
-      ;;
-    --libs-cpp)
-      if test @enable_cpp@ = yes ; then
-        echo $libS$libR -lpcrecpp -lpcre
+      if test @enable_pcre2_32@ = yes ; then
+        echo $libS$libR -lpcre2-32
       else
         echo "${usage}" 1>&2
       fi
diff --git a/dist2/perltest.sh b/dist2/perltest.sh
new file mode 100755
index 0000000..9cf7b17
--- /dev/null
+++ b/dist2/perltest.sh
@@ -0,0 +1,297 @@
+#! /bin/sh
+
+# Script for testing regular expressions with perl to check that PCRE2 handles
+# them the same. The Perl code has to have "use utf8" and "require Encode" at
+# the start when running UTF-8 tests, but *not* for non-utf8 tests. (The
+# "require" would actually be OK for non-utf8-tests, but is not always
+# installed, so this way the script will always run for these tests.)
+#
+# The desired effect is achieved by making this a shell script that passes the
+# Perl script to Perl through a pipe. If the first argument is "-utf8", a
+# suitable prefix is set up.
+#
+# The remaining arguments, if any, are passed to Perl. They are an input file
+# and an output file. If there is one argument, the output is written to
+# STDOUT. If Perl receives no arguments, it opens /dev/tty as input, and writes
+# output to STDOUT. (I haven't found a way of getting it to use STDIN, because
+# of the contorted piping input.)
+
+perl=perl
+prefix=''
+if [ $# -gt 0 -a "$1" = "-utf8" ] ; then
+  prefix="use utf8; require Encode;"
+  shift
+fi
+
+
+# The Perl script that follows has a similar specification to pcre2test, and so
+# can be given identical input, except that input patterns can be followed only
+# by Perl's lower case modifiers and certain other pcre2test modifiers that are
+# either handled or ignored:
+#
+#   aftertext          interpreted as "print $' afterwards"
+#   afteralltext       ignored
+#   dupnames           ignored (Perl always allows)
+#   mark               ignored
+#   no_auto_possess    ignored
+#   no_start_optimize  ignored
+#   ucp                sets Perl's /u modifier
+#   utf                invoke UTF-8 functionality
+#
+# The data lines must not have any pcre2test modifiers. They are processed as
+# Perl double-quoted strings, so if they contain " $ or @ characters, these
+# have to be escaped. For this reason, all such characters in the
+# Perl-compatible testinput1 and testinput4 files are escaped so that they can
+# be used for perltest as well as for pcre2test. The output from this script
+# should be same as from pcre2test, apart from the initial identifying banner.
+#
+# The other testinput files are not suitable for feeding to perltest.sh,
+# because they make use of the special modifiers that pcre2test uses for
+# testing features of PCRE2. Some of these files also contain malformed regular
+# expressions, in order to check that PCRE2 diagnoses them correctly.
+
+(echo "$prefix" ; cat <<'PERLEND'
+
+# Function for turning a string into a string of printing chars.
+
+sub pchars {
+my($t) = "";
+if ($utf8)
+  {
+  @p = unpack('U*', $_[0]);
+  foreach $c (@p)
+    {
+    if ($c >= 32 && $c < 127) { $t .= chr $c; }
+      else { $t .= sprintf("\\x{%02x}", $c);
+      }
+    }
+  }
+else
+  {
+  foreach $c (split(//, $_[0]))
+    {
+    if (ord $c >= 32 && ord $c < 127) { $t .= $c; }
+      else { $t .= sprintf("\\x%02x", ord $c); }
+    }
+  }
+$t;
+}
+
+
+# Read lines from a named file or stdin and write to a named file or stdout;
+# lines consist of a regular expression, in delimiters and optionally followed
+# by options, followed by a set of test data, terminated by an empty line.
+
+# Sort out the input and output files
+
+if (@ARGV > 0)
+  {
+  open(INFILE, "<$ARGV[0]") || die "Failed to open $ARGV[0]\n";
+  $infile = "INFILE";
+  $interact = 0;
+  }
+else
+  {
+  open(INFILE, "</dev/tty") || die "Failed to open /dev/tty\n";
+  $infile = "INFILE";
+  $interact = 1;
+  }
+
+if (@ARGV > 1)
+  {
+  open(OUTFILE, ">$ARGV[1]") || die "Failed to open $ARGV[1]\n";
+  $outfile = "OUTFILE";
+  }
+else { $outfile = "STDOUT"; }
+
+printf($outfile "Perl $] Regular Expressions\n\n");
+
+# Main loop
+
+NEXT_RE:
+for (;;)
+  {
+  printf "  re> " if $interact;
+  last if ! ($_ = <$infile>);
+  printf $outfile "$_" if ! $interact;
+  next if ($_ =~ /^\s*$/ || $_ =~ /^#/);
+
+  $pattern = $_;
+
+  while ($pattern !~ /^\s*(.).*\1/s)
+    {
+    printf "    > " if $interact;
+    last if ! ($_ = <$infile>);
+    printf $outfile "$_" if ! $interact;
+    $pattern .= $_;
+    }
+
+  chomp($pattern);
+  $pattern =~ s/\s+$//;
+
+  # Split the pattern from the modifiers and adjust them as necessary.
+
+  $pattern =~ /^\s*((.).*\2)(.*)$/s;
+  $pat = $1;
+  $mod = $3;
+
+  # The private "aftertext" modifier means "print $' afterwards".
+
+  $showrest = ($mod =~ s/aftertext,?//);
+
+  # "allaftertext" is used by pcre2test to print remainders after captures
+
+  $mod =~ s/allaftertext,?//;
+
+  # Detect utf
+
+  $utf8 = $mod =~ s/utf,?//;
+
+  # Remove "dupnames".
+
+  $mod =~ s/dupnames,?//;
+
+  # Remove "mark" (asks pcre2test to check MARK data) */
+
+  $mod =~ s/mark,?//;
+
+  # "ucp" asks pcre2test to set PCRE2_UCP; change this to /u for Perl
+
+  $mod =~ s/ucp,?/u/;
+
+  # Remove "no_auto_possess" and "no_start_optimize" (disable PCRE2 optimizations)
+
+  $mod =~ s/no_auto_possess,?//;
+  $mod =~ s/no_start_optimize,?//;
+
+  # Add back retained modifiers and check that the pattern is valid.
+
+  $mod =~ s/,//g;
+  $pattern = "$pat$mod";
+  eval "\$_ =~ ${pattern}";
+  if ($@)
+    {
+    printf $outfile "Error: $@";
+    if (! $interact)
+      {
+      for (;;)
+        {
+        last if ! ($_ = <$infile>);
+        last if $_ =~ /^\s*$/;
+        }
+      }
+    next NEXT_RE;
+    }
+
+  # If the /g modifier is present, we want to put a loop round the matching;
+  # otherwise just a single "if".
+
+  $cmd = ($pattern =~ /g[a-z]*$/)? "while" : "if";
+
+  # If the pattern is actually the null string, Perl uses the most recently
+  # executed (and successfully compiled) regex is used instead. This is a
+  # nasty trap for the unwary! The PCRE2 test suite does contain null strings
+  # in places - if they are allowed through here all sorts of weird and
+  # unexpected effects happen. To avoid this, we replace such patterns with
+  # a non-null pattern that has the same effect.
+
+  $pattern = "/(?#)/$2" if ($pattern =~ /^(.)\1(.*)$/);
+
+  # Read data lines and test them
+
+  for (;;)
+    {
+    printf "data> " if $interact;
+    last NEXT_RE if ! ($_ = <$infile>);
+    chomp;
+    printf $outfile "%s", "$_\n" if ! $interact;
+
+    s/\s+$//;  # Remove trailing space
+    s/^\s+//;  # Remove leading space
+
+    last if ($_ eq "");
+    next if $_ =~ /^\\=(?:\s|$)/;   # Comment line
+
+    $x = eval "\"$_\"";   # To get escapes processed
+
+    # Empty array for holding results, ensure $REGERROR and $REGMARK are
+    # unset, then do the matching.
+
+    @subs = ();
+
+    $pushes = "push \@subs,\$&;" .
+         "push \@subs,\$1;" .
+         "push \@subs,\$2;" .
+         "push \@subs,\$3;" .
+         "push \@subs,\$4;" .
+         "push \@subs,\$5;" .
+         "push \@subs,\$6;" .
+         "push \@subs,\$7;" .
+         "push \@subs,\$8;" .
+         "push \@subs,\$9;" .
+         "push \@subs,\$10;" .
+         "push \@subs,\$11;" .
+         "push \@subs,\$12;" .
+         "push \@subs,\$13;" .
+         "push \@subs,\$14;" .
+         "push \@subs,\$15;" .
+         "push \@subs,\$16;" .
+         "push \@subs,\$'; }";
+
+    undef $REGERROR;
+    undef $REGMARK;
+
+    eval "${cmd} (\$x =~ ${pattern}) {" . $pushes;
+
+    if ($@)
+      {
+      printf $outfile "Error: $@\n";
+      next NEXT_RE;
+      }
+    elsif (scalar(@subs) == 0)
+      {
+      printf $outfile "No match";
+      if (defined $REGERROR && $REGERROR != 1)
+        { printf $outfile (", mark = %s", &pchars($REGERROR)); }
+      printf $outfile "\n";
+      }
+    else
+      {
+      while (scalar(@subs) != 0)
+        {
+        printf $outfile (" 0: %s\n", &pchars($subs[0]));
+        printf $outfile (" 0+ %s\n", &pchars($subs[17])) if $showrest;
+        $last_printed = 0;
+        for ($i = 1; $i <= 16; $i++)
+          {
+          if (defined $subs[$i])
+            {
+            while ($last_printed++ < $i-1)
+              { printf $outfile ("%2d: <unset>\n", $last_printed); }
+            printf $outfile ("%2d: %s\n", $i, &pchars($subs[$i]));
+            $last_printed = $i;
+            }
+          }
+        splice(@subs, 0, 18);
+        }
+
+      # It seems that $REGMARK is not marked as UTF-8 even when use utf8 is
+      # set and the input pattern was a UTF-8 string. We can, however, force
+      # it to be so marked.
+
+      if (defined $REGMARK && $REGMARK != 1)
+        {
+        $xx = $REGMARK;
+        $xx = Encode::decode_utf8($xx) if $utf8;
+        printf $outfile ("MK: %s\n", &pchars($xx));
+        }
+      }
+    }
+  }
+
+# printf $outfile "\n";
+
+PERLEND
+) | $perl - $@
+
+# End
diff --git a/dist2/src/config.h.generic b/dist2/src/config.h.generic
new file mode 100644
index 0000000..744f198
--- /dev/null
+++ b/dist2/src/config.h.generic
@@ -0,0 +1,306 @@
+/* src/config.h.  Generated from config.h.in by configure.  */
+/* src/config.h.in.  Generated from configure.ac by autoheader.  */
+
+/* PCRE2 is written in Standard C, but there are a few non-standard things it
+can cope with, allowing it to run on SunOS4 and other "close to standard"
+systems.
+
+In environments that support the GNU autotools, config.h.in is converted into
+config.h by the "configure" script. In environments that use CMake,
+config-cmake.in is converted into config.h. If you are going to build PCRE2 "by
+hand" without using "configure" or CMake, you should copy the distributed
+config.h.generic to config.h, and edit the macro definitions to be the way you
+need them. You must then add -DHAVE_CONFIG_H to all of your compile commands,
+so that config.h is included at the start of every source.
+
+Alternatively, you can avoid editing by using -D on the compiler command line
+to set the macro values. In this case, you do not have to set -DHAVE_CONFIG_H,
+but if you do, default values will be taken from config.h for non-boolean
+macros that are not defined on the command line.
+
+Boolean macros such as HAVE_STDLIB_H and SUPPORT_PCRE2_8 should either be defined
+(conventionally to 1) for TRUE, and not defined at all for FALSE. All such
+macros are listed as a commented #undef in config.h.generic. Macros such as
+MATCH_LIMIT, whose actual value is relevant, have defaults defined, but are
+surrounded by #ifndef/#endif lines so that the value can be overridden by -D.
+
+PCRE2 uses memmove() if HAVE_MEMMOVE is defined; otherwise it uses bcopy() if
+HAVE_BCOPY is defined. If your system has neither bcopy() nor memmove(), make
+sure both macros are undefined; an emulation function will then be used. */
+
+/* By default, the \R escape sequence matches any Unicode line ending
+   character or sequence of characters. If BSR_ANYCRLF is defined (to any
+   value), this is changed so that backslash-R matches only CR, LF, or CRLF.
+   The build-time default can be overridden by the user of PCRE2 at runtime.
+   */
+/* #undef BSR_ANYCRLF */
+
+/* If you are compiling for a system that uses EBCDIC instead of ASCII
+   character codes, define this macro to any value. When EBCDIC is set, PCRE2
+   assumes that all input strings are in EBCDIC. If you do not define this
+   macro, PCRE2 will assume input strings are ASCII or UTF-8/16/32 Unicode. It
+   is not possible to build a version of PCRE2 that supports both EBCDIC and
+   UTF-8/16/32. */
+/* #undef EBCDIC */
+
+/* In an EBCDIC environment, define this macro to any value to arrange for the
+   NL character to be 0x25 instead of the default 0x15. NL plays the role that
+   LF does in an ASCII/Unicode environment. */
+/* #undef EBCDIC_NL25 */
+
+/* Define to 1 if you have the `bcopy' function. */
+/* #undef HAVE_BCOPY */
+
+/* Define to 1 if you have the <bzlib.h> header file. */
+/* #undef HAVE_BZLIB_H */
+
+/* Define to 1 if you have the <dirent.h> header file. */
+/* #undef HAVE_DIRENT_H */
+
+/* Define to 1 if you have the <dlfcn.h> header file. */
+/* #undef HAVE_DLFCN_H */
+
+/* Define to 1 if you have the <editline/readline.h> header file. */
+/* #undef HAVE_EDITLINE_READLINE_H */
+
+/* Define to 1 if you have the <edit/readline/readline.h> header file. */
+/* #undef HAVE_EDIT_READLINE_READLINE_H */
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+/* #undef HAVE_INTTYPES_H */
+
+/* Define to 1 if you have the <limits.h> header file. */
+/* #undef HAVE_LIMITS_H */
+
+/* Define to 1 if you have the `memmove' function. */
+/* #undef HAVE_MEMMOVE */
+
+/* Define to 1 if you have the <memory.h> header file. */
+/* #undef HAVE_MEMORY_H */
+
+/* Define if you have POSIX threads libraries and header files. */
+/* #undef HAVE_PTHREAD */
+
+/* Have PTHREAD_PRIO_INHERIT. */
+/* #undef HAVE_PTHREAD_PRIO_INHERIT */
+
+/* Define to 1 if you have the <readline/history.h> header file. */
+/* #undef HAVE_READLINE_HISTORY_H */
+
+/* Define to 1 if you have the <readline/readline.h> header file. */
+/* #undef HAVE_READLINE_READLINE_H */
+
+/* Define to 1 if you have the <stdint.h> header file. */
+/* #undef HAVE_STDINT_H */
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+/* #undef HAVE_STDLIB_H */
+
+/* Define to 1 if you have the `strerror' function. */
+/* #undef HAVE_STRERROR */
+
+/* Define to 1 if you have the <strings.h> header file. */
+/* #undef HAVE_STRINGS_H */
+
+/* Define to 1 if you have the <string.h> header file. */
+/* #undef HAVE_STRING_H */
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+/* #undef HAVE_SYS_STAT_H */
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+/* #undef HAVE_SYS_TYPES_H */
+
+/* Define to 1 if you have the <unistd.h> header file. */
+/* #undef HAVE_UNISTD_H */
+
+/* Define to 1 if the compiler supports simple visibility declarations. */
+/* #undef HAVE_VISIBILITY */
+
+/* Define to 1 if you have the <windows.h> header file. */
+/* #undef HAVE_WINDOWS_H */
+
+/* Define to 1 if you have the <zlib.h> header file. */
+/* #undef HAVE_ZLIB_H */
+
+/* PCRE2 uses recursive function calls to handle backtracking while matching.
+   This can sometimes be a problem on systems that have stacks of limited
+   size. Define HEAP_MATCH_RECURSE to any value to get a version that doesn't
+   use recursion in the match() function; instead it creates its own stack by
+   steam using memory from the heap. For more detail, see the comments and
+   other stuff just above the match() function. */
+/* #undef HEAP_MATCH_RECURSE */
+
+/* The value of LINK_SIZE determines the number of bytes used to store links
+   as offsets within the compiled regex. The default is 2, which allows for
+   compiled patterns up to 64K long. This covers the vast majority of cases.
+   However, PCRE2 can also be compiled to use 3 or 4 bytes instead. This
+   allows for longer patterns in extreme cases. */
+#ifndef LINK_SIZE
+#define LINK_SIZE 2
+#endif
+
+/* Define to the sub-directory where libtool stores uninstalled libraries. */
+/* This is ignored unless you are using libtool. */
+#ifndef LT_OBJDIR
+#define LT_OBJDIR ".libs/"
+#endif
+
+/* The value of MATCH_LIMIT determines the default number of times the
+   internal match() function can be called during a single execution of
+   pcre2_match(). There is a runtime interface for setting a different limit.
+   The limit exists in order to catch runaway regular expressions that take
+   for ever to determine that they do not match. The default is set very large
+   so that it does not accidentally catch legitimate cases. */
+#ifndef MATCH_LIMIT
+#define MATCH_LIMIT 10000000
+#endif
+
+/* The above limit applies to all calls of match(), whether or not they
+   increase the recursion depth. In some environments it is desirable to limit
+   the depth of recursive calls of match() more strictly, in order to restrict
+   the maximum amount of stack (or heap, if HEAP_MATCH_RECURSE is defined)
+   that is used. The value of MATCH_LIMIT_RECURSION applies only to recursive
+   calls of match(). To have any useful effect, it must be less than the value
+   of MATCH_LIMIT. The default is to use the same value as MATCH_LIMIT. There
+   is a runtime method for setting a different limit. */
+#ifndef MATCH_LIMIT_RECURSION
+#define MATCH_LIMIT_RECURSION MATCH_LIMIT
+#endif
+
+/* This limit is parameterized just in case anybody ever wants to change it.
+   Care must be taken if it is increased, because it guards against integer
+   overflow caused by enormously large patterns. */
+#ifndef MAX_NAME_COUNT
+#define MAX_NAME_COUNT 10000
+#endif
+
+/* This limit is parameterized just in case anybody ever wants to change it.
+   Care must be taken if it is increased, because it guards against integer
+   overflow caused by enormously large patterns. */
+#ifndef MAX_NAME_SIZE
+#define MAX_NAME_SIZE 32
+#endif
+
+/* Defining NEVER_BACKSLASH_C locks out the use of \C in all patterns. */
+/* #undef NEVER_BACKSLASH_C */
+
+/* The value of NEWLINE_DEFAULT determines the default newline character
+   sequence. PCRE2 client programs can override this by selecting other values
+   at run time. The valid values are 1 (CR), 2 (LF), 3 (CRLF), 4 (ANY), and 5
+   (ANYCRLF). */
+#ifndef NEWLINE_DEFAULT
+#define NEWLINE_DEFAULT 2
+#endif
+
+/* Name of package */
+#define PACKAGE "pcre2"
+
+/* Define to the address where bug reports for this package should be sent. */
+#define PACKAGE_BUGREPORT ""
+
+/* Define to the full name of this package. */
+#define PACKAGE_NAME "PCRE2"
+
+/* Define to the full name and version of this package. */
+#define PACKAGE_STRING "PCRE2 10.21"
+
+/* Define to the one symbol short name of this package. */
+#define PACKAGE_TARNAME "pcre2"
+
+/* Define to the home page for this package. */
+#define PACKAGE_URL ""
+
+/* Define to the version of this package. */
+#define PACKAGE_VERSION "10.21"
+
+/* The value of PARENS_NEST_LIMIT specifies the maximum depth of nested
+   parentheses (of any kind) in a pattern. This limits the amount of system
+   stack that is used while compiling a pattern. */
+#ifndef PARENS_NEST_LIMIT
+#define PARENS_NEST_LIMIT 250
+#endif
+
+/* The value of PCRE2GREP_BUFSIZE determines the size of buffer used by
+   pcre2grep to hold parts of the file it is searching. This is also the
+   minimum value. The actual amount of memory used by pcre2grep is three times
+   this number, because it allows for the buffering of "before" and "after"
+   lines. */
+#ifndef PCRE2GREP_BUFSIZE
+#define PCRE2GREP_BUFSIZE 20480
+#endif
+
+/* Define to any value to include debugging code. */
+/* #undef PCRE2_DEBUG */
+
+/* If you are compiling for a system other than a Unix-like system or
+   Win32, and it needs some magic to be inserted before the definition
+   of a function that is exported by the library, define this macro to
+   contain the relevant magic. If you do not define this macro, a suitable
+    __declspec value is used for Windows systems; in other environments
+   "extern" is used for a C compiler and "extern C" for a C++ compiler.
+   This macro apears at the start of every exported function that is part
+   of the external API. It does not appear on functions that are "external"
+   in the C sense, but which are internal to the library. */
+/* #undef PCRE2_EXP_DEFN */
+
+/* Define to any value if linking statically (TODO: make nice with Libtool) */
+/* #undef PCRE2_STATIC */
+
+/* Define to necessary symbol if this constant uses a non-standard name on
+   your system. */
+/* #undef PTHREAD_CREATE_JOINABLE */
+
+/* Define to 1 if you have the ANSI C header files. */
+/* #undef STDC_HEADERS */
+
+/* Define to any value to enable support for Just-In-Time compiling. */
+/* #undef SUPPORT_JIT */
+
+/* Define to any value to allow pcre2grep to be linked with libbz2, so that it
+   is able to handle .bz2 files. */
+/* #undef SUPPORT_LIBBZ2 */
+
+/* Define to any value to allow pcre2test to be linked with libedit. */
+/* #undef SUPPORT_LIBEDIT */
+
+/* Define to any value to allow pcre2test to be linked with libreadline. */
+/* #undef SUPPORT_LIBREADLINE */
+
+/* Define to any value to allow pcre2grep to be linked with libz, so that it
+   is able to handle .gz files. */
+/* #undef SUPPORT_LIBZ */
+
+/* Define to any value to enable JIT support in pcre2grep. */
+/* #undef SUPPORT_PCRE2GREP_JIT */
+
+/* Define to any value to enable the 16 bit PCRE2 library. */
+/* #undef SUPPORT_PCRE2_16 */
+
+/* Define to any value to enable the 32 bit PCRE2 library. */
+/* #undef SUPPORT_PCRE2_32 */
+
+/* Define to any value to enable the 8 bit PCRE2 library. */
+/* #undef SUPPORT_PCRE2_8 */
+
+/* Define to any value to enable support for Unicode and UTF encoding. This
+   will work even in an EBCDIC environment, but it is incompatible with the
+   EBCDIC macro. That is, PCRE2 can support *either* EBCDIC code *or*
+   ASCII/Unicode, but not both at once. */
+/* #undef SUPPORT_UNICODE */
+
+/* Define to any value for valgrind support to find invalid memory reads. */
+/* #undef SUPPORT_VALGRIND */
+
+/* Version number of package */
+#define VERSION "10.21"
+
+/* Define to empty if `const' does not conform to ANSI C. */
+/* #undef const */
+
+/* Define to the type of a signed integer type of width exactly 64 bits if
+   such a type exists and the standard includes do not define it. */
+/* #undef int64_t */
+
+/* Define to `unsigned int' if <sys/types.h> does not define. */
+/* #undef size_t */
diff --git a/dist2/src/config.h.in b/dist2/src/config.h.in
new file mode 100644
index 0000000..e55d0a0
--- /dev/null
+++ b/dist2/src/config.h.in
@@ -0,0 +1,297 @@
+/* src/config.h.in.  Generated from configure.ac by autoheader.  */
+
+
+/* PCRE2 is written in Standard C, but there are a few non-standard things it
+can cope with, allowing it to run on SunOS4 and other "close to standard"
+systems.
+
+In environments that support the GNU autotools, config.h.in is converted into
+config.h by the "configure" script. In environments that use CMake,
+config-cmake.in is converted into config.h. If you are going to build PCRE2 "by
+hand" without using "configure" or CMake, you should copy the distributed
+config.h.generic to config.h, and edit the macro definitions to be the way you
+need them. You must then add -DHAVE_CONFIG_H to all of your compile commands,
+so that config.h is included at the start of every source.
+
+Alternatively, you can avoid editing by using -D on the compiler command line
+to set the macro values. In this case, you do not have to set -DHAVE_CONFIG_H,
+but if you do, default values will be taken from config.h for non-boolean
+macros that are not defined on the command line.
+
+Boolean macros such as HAVE_STDLIB_H and SUPPORT_PCRE2_8 should either be defined
+(conventionally to 1) for TRUE, and not defined at all for FALSE. All such
+macros are listed as a commented #undef in config.h.generic. Macros such as
+MATCH_LIMIT, whose actual value is relevant, have defaults defined, but are
+surrounded by #ifndef/#endif lines so that the value can be overridden by -D.
+
+PCRE2 uses memmove() if HAVE_MEMMOVE is defined; otherwise it uses bcopy() if
+HAVE_BCOPY is defined. If your system has neither bcopy() nor memmove(), make
+sure both macros are undefined; an emulation function will then be used. */
+
+/* By default, the \R escape sequence matches any Unicode line ending
+   character or sequence of characters. If BSR_ANYCRLF is defined (to any
+   value), this is changed so that backslash-R matches only CR, LF, or CRLF.
+   The build-time default can be overridden by the user of PCRE2 at runtime.
+   */
+#undef BSR_ANYCRLF
+
+/* If you are compiling for a system that uses EBCDIC instead of ASCII
+   character codes, define this macro to any value. When EBCDIC is set, PCRE2
+   assumes that all input strings are in EBCDIC. If you do not define this
+   macro, PCRE2 will assume input strings are ASCII or UTF-8/16/32 Unicode. It
+   is not possible to build a version of PCRE2 that supports both EBCDIC and
+   UTF-8/16/32. */
+#undef EBCDIC
+
+/* In an EBCDIC environment, define this macro to any value to arrange for the
+   NL character to be 0x25 instead of the default 0x15. NL plays the role that
+   LF does in an ASCII/Unicode environment. */
+#undef EBCDIC_NL25
+
+/* Define to 1 if you have the `bcopy' function. */
+#undef HAVE_BCOPY
+
+/* Define to 1 if you have the <bzlib.h> header file. */
+#undef HAVE_BZLIB_H
+
+/* Define to 1 if you have the <dirent.h> header file. */
+#undef HAVE_DIRENT_H
+
+/* Define to 1 if you have the <dlfcn.h> header file. */
+#undef HAVE_DLFCN_H
+
+/* Define to 1 if you have the <editline/readline.h> header file. */
+#undef HAVE_EDITLINE_READLINE_H
+
+/* Define to 1 if you have the <edit/readline/readline.h> header file. */
+#undef HAVE_EDIT_READLINE_READLINE_H
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#undef HAVE_INTTYPES_H
+
+/* Define to 1 if you have the <limits.h> header file. */
+#undef HAVE_LIMITS_H
+
+/* Define to 1 if you have the `memmove' function. */
+#undef HAVE_MEMMOVE
+
+/* Define to 1 if you have the <memory.h> header file. */
+#undef HAVE_MEMORY_H
+
+/* Define if you have POSIX threads libraries and header files. */
+#undef HAVE_PTHREAD
+
+/* Have PTHREAD_PRIO_INHERIT. */
+#undef HAVE_PTHREAD_PRIO_INHERIT
+
+/* Define to 1 if you have the <readline/history.h> header file. */
+#undef HAVE_READLINE_HISTORY_H
+
+/* Define to 1 if you have the <readline/readline.h> header file. */
+#undef HAVE_READLINE_READLINE_H
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#undef HAVE_STDLIB_H
+
+/* Define to 1 if you have the `strerror' function. */
+#undef HAVE_STRERROR
+
+/* Define to 1 if you have the <strings.h> header file. */
+#undef HAVE_STRINGS_H
+
+/* Define to 1 if you have the <string.h> header file. */
+#undef HAVE_STRING_H
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#undef HAVE_SYS_STAT_H
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#undef HAVE_SYS_TYPES_H
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* Define to 1 if the compiler supports simple visibility declarations. */
+#undef HAVE_VISIBILITY
+
+/* Define to 1 if you have the <windows.h> header file. */
+#undef HAVE_WINDOWS_H
+
+/* Define to 1 if you have the <zlib.h> header file. */
+#undef HAVE_ZLIB_H
+
+/* PCRE2 uses recursive function calls to handle backtracking while matching.
+   This can sometimes be a problem on systems that have stacks of limited
+   size. Define HEAP_MATCH_RECURSE to any value to get a version that doesn't
+   use recursion in the match() function; instead it creates its own stack by
+   steam using memory from the heap. For more detail, see the comments and
+   other stuff just above the match() function. */
+#undef HEAP_MATCH_RECURSE
+
+/* The value of LINK_SIZE determines the number of bytes used to store links
+   as offsets within the compiled regex. The default is 2, which allows for
+   compiled patterns up to 64K long. This covers the vast majority of cases.
+   However, PCRE2 can also be compiled to use 3 or 4 bytes instead. This
+   allows for longer patterns in extreme cases. */
+#undef LINK_SIZE
+
+/* Define to the sub-directory where libtool stores uninstalled libraries. */
+#undef LT_OBJDIR
+
+/* The value of MATCH_LIMIT determines the default number of times the
+   internal match() function can be called during a single execution of
+   pcre2_match(). There is a runtime interface for setting a different limit.
+   The limit exists in order to catch runaway regular expressions that take
+   for ever to determine that they do not match. The default is set very large
+   so that it does not accidentally catch legitimate cases. */
+#undef MATCH_LIMIT
+
+/* The above limit applies to all calls of match(), whether or not they
+   increase the recursion depth. In some environments it is desirable to limit
+   the depth of recursive calls of match() more strictly, in order to restrict
+   the maximum amount of stack (or heap, if HEAP_MATCH_RECURSE is defined)
+   that is used. The value of MATCH_LIMIT_RECURSION applies only to recursive
+   calls of match(). To have any useful effect, it must be less than the value
+   of MATCH_LIMIT. The default is to use the same value as MATCH_LIMIT. There
+   is a runtime method for setting a different limit. */
+#undef MATCH_LIMIT_RECURSION
+
+/* This limit is parameterized just in case anybody ever wants to change it.
+   Care must be taken if it is increased, because it guards against integer
+   overflow caused by enormously large patterns. */
+#undef MAX_NAME_COUNT
+
+/* This limit is parameterized just in case anybody ever wants to change it.
+   Care must be taken if it is increased, because it guards against integer
+   overflow caused by enormously large patterns. */
+#undef MAX_NAME_SIZE
+
+/* Defining NEVER_BACKSLASH_C locks out the use of \C in all patterns. */
+#undef NEVER_BACKSLASH_C
+
+/* The value of NEWLINE_DEFAULT determines the default newline character
+   sequence. PCRE2 client programs can override this by selecting other values
+   at run time. The valid values are 1 (CR), 2 (LF), 3 (CRLF), 4 (ANY), and 5
+   (ANYCRLF). */
+#undef NEWLINE_DEFAULT
+
+/* Name of package */
+#undef PACKAGE
+
+/* Define to the address where bug reports for this package should be sent. */
+#undef PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#undef PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#undef PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME
+
+/* Define to the home page for this package. */
+#undef PACKAGE_URL
+
+/* Define to the version of this package. */
+#undef PACKAGE_VERSION
+
+/* The value of PARENS_NEST_LIMIT specifies the maximum depth of nested
+   parentheses (of any kind) in a pattern. This limits the amount of system
+   stack that is used while compiling a pattern. */
+#undef PARENS_NEST_LIMIT
+
+/* The value of PCRE2GREP_BUFSIZE determines the size of buffer used by
+   pcre2grep to hold parts of the file it is searching. This is also the
+   minimum value. The actual amount of memory used by pcre2grep is three times
+   this number, because it allows for the buffering of "before" and "after"
+   lines. */
+#undef PCRE2GREP_BUFSIZE
+
+/* to make a symbol visible */
+#undef PCRE2POSIX_EXP_DECL
+
+/* to make a symbol visible */
+#undef PCRE2POSIX_EXP_DEFN
+
+/* Define to any value to include debugging code. */
+#undef PCRE2_DEBUG
+
+/* to make a symbol visible */
+#undef PCRE2_EXP_DECL
+
+
+/* If you are compiling for a system other than a Unix-like system or
+   Win32, and it needs some magic to be inserted before the definition
+   of a function that is exported by the library, define this macro to
+   contain the relevant magic. If you do not define this macro, a suitable
+    __declspec value is used for Windows systems; in other environments
+   "extern" is used for a C compiler and "extern C" for a C++ compiler.
+   This macro apears at the start of every exported function that is part
+   of the external API. It does not appear on functions that are "external"
+   in the C sense, but which are internal to the library. */
+#undef PCRE2_EXP_DEFN
+
+/* Define to any value if linking statically (TODO: make nice with Libtool) */
+#undef PCRE2_STATIC
+
+/* Define to necessary symbol if this constant uses a non-standard name on
+   your system. */
+#undef PTHREAD_CREATE_JOINABLE
+
+/* Define to 1 if you have the ANSI C header files. */
+#undef STDC_HEADERS
+
+/* Define to any value to enable support for Just-In-Time compiling. */
+#undef SUPPORT_JIT
+
+/* Define to any value to allow pcre2grep to be linked with libbz2, so that it
+   is able to handle .bz2 files. */
+#undef SUPPORT_LIBBZ2
+
+/* Define to any value to allow pcre2test to be linked with libedit. */
+#undef SUPPORT_LIBEDIT
+
+/* Define to any value to allow pcre2test to be linked with libreadline. */
+#undef SUPPORT_LIBREADLINE
+
+/* Define to any value to allow pcre2grep to be linked with libz, so that it
+   is able to handle .gz files. */
+#undef SUPPORT_LIBZ
+
+/* Define to any value to enable JIT support in pcre2grep. */
+#undef SUPPORT_PCRE2GREP_JIT
+
+/* Define to any value to enable the 16 bit PCRE2 library. */
+#undef SUPPORT_PCRE2_16
+
+/* Define to any value to enable the 32 bit PCRE2 library. */
+#undef SUPPORT_PCRE2_32
+
+/* Define to any value to enable the 8 bit PCRE2 library. */
+#undef SUPPORT_PCRE2_8
+
+/* Define to any value to enable support for Unicode and UTF encoding. This
+   will work even in an EBCDIC environment, but it is incompatible with the
+   EBCDIC macro. That is, PCRE2 can support *either* EBCDIC code *or*
+   ASCII/Unicode, but not both at once. */
+#undef SUPPORT_UNICODE
+
+/* Define to any value for valgrind support to find invalid memory reads. */
+#undef SUPPORT_VALGRIND
+
+/* Version number of package */
+#undef VERSION
+
+/* Define to empty if `const' does not conform to ANSI C. */
+#undef const
+
+/* Define to the type of a signed integer type of width exactly 64 bits if
+   such a type exists and the standard includes do not define it. */
+#undef int64_t
+
+/* Define to `unsigned int' if <sys/types.h> does not define. */
+#undef size_t
diff --git a/dist/dftables.c b/dist2/src/dftables.c
similarity index 86%
rename from dist/dftables.c
rename to dist2/src/dftables.c
index 1fdc8e0..dfb90b5 100644
--- a/dist/dftables.c
+++ b/dist2/src/dftables.c
@@ -6,7 +6,8 @@
 and semantics are as close as possible to those of the Perl 5 language.
 
                        Written by Philip Hazel
-           Copyright (c) 1997-2012 University of Cambridge
+     Original API code Copyright (c) 1997-2012 University of Cambridge
+         New API code Copyright (c) 2016 University of Cambridge
 
 -----------------------------------------------------------------------------
 Redistribution and use in source and binary forms, with or without
@@ -39,9 +40,9 @@
 
 
 /* This is a freestanding support program to generate a file containing
-character tables for PCRE. The tables are built according to the current
-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. */
+character tables for PCRE2. The tables are built according to the current
+locale using the pcre2_maketables() function, which is part of the PCRE2 API.
+*/
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -52,11 +53,11 @@
 #include <string.h>
 #include <locale.h>
 
-#include "pcre_internal.h"
+#define PCRE2_CODE_UNIT_WIDTH 0   /* Must be set, but not relevant here */
+#include "pcre2_internal.h"
 
-#define DFTABLES          /* pcre_maketables.c notices this */
-#include "pcre_maketables.c"
-
+#define DFTABLES     /* pcre2_maketables.c notices this */
+#include "pcre2_maketables.c"
 
 int main(int argc, char **argv)
 {
@@ -81,7 +82,7 @@
   return 1;
   }
 
-tables = pcre_maketables();
+tables = maketables();
 base_of_tables = tables;
 
 f = fopen(argv[i], "wb");
@@ -100,15 +101,8 @@
   "*************************************************/\n\n"
   "/* This file was automatically written by the dftables auxiliary\n"
   "program. It contains character tables that are used when no external\n"
-  "tables are passed to PCRE by the application that calls it. The tables\n"
-  "are used only for characters whose code values are less than 256.\n\n");
-fprintf(f,
-  "The following #includes are present because without them gcc 4.x may remove\n"
-  "the array definition from the final binary if PCRE is built into a static\n"
-  "library and dead code stripping is activated. This leads to link errors.\n"
-  "Pulling in the header ensures that the array gets flagged as \"someone\n"
-  "outside this compilation unit might reference this\" and so it will always\n"
-  "be supplied to the linker. */\n\n");
+  "tables are passed to PCRE2 by the application that calls it. The tables\n"
+  "are used only for characters whose code values are less than 256. */\n\n");
 
 /* Force config.h in z/OS */
 
@@ -121,13 +115,21 @@
 #endif
 
 fprintf(f,
+  "/* The following #includes are present because without them gcc 4.x may remove\n"
+  "the array definition from the final binary if PCRE2 is built into a static\n"
+  "library and dead code stripping is activated. This leads to link errors.\n"
+  "Pulling in the header ensures that the array gets flagged as \"someone\n"
+  "outside this compilation unit might reference this\" and so it will always\n"
+  "be supplied to the linker. */\n\n");
+
+fprintf(f,
   "#ifdef HAVE_CONFIG_H\n"
   "#include \"config.h\"\n"
   "#endif\n\n"
-  "#include \"pcre_internal.h\"\n\n");
+  "#include \"pcre2_internal.h\"\n\n");
 
 fprintf(f,
-  "const pcre_uint8 PRIV(default_tables)[] = {\n\n"
+  "const uint8_t PRIV(default_tables)[] = {\n\n"
   "/* This table is a lower casing table. */\n\n");
 
 fprintf(f, "  ");
@@ -202,7 +204,7 @@
   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 pcre_chartables.c */\n");
+fprintf(f, " */\n\n/* End of pcre2_chartables.c */\n");
 
 fclose(f);
 free((void *)base_of_tables);
diff --git a/dist2/src/pcre2.h.generic b/dist2/src/pcre2.h.generic
new file mode 100644
index 0000000..7f9ba4f
--- /dev/null
+++ b/dist2/src/pcre2.h.generic
@@ -0,0 +1,722 @@
+/*************************************************
+*       Perl-Compatible Regular Expressions      *
+*************************************************/
+
+/* This is the public header file for the PCRE library, second API, to be
+#included by applications that call PCRE2 functions.
+
+           Copyright (c) 2016 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 _PCRE2_H
+#define _PCRE2_H
+
+/* The current PCRE version information. */
+
+#define PCRE2_MAJOR          10
+#define PCRE2_MINOR          21
+#define PCRE2_PRERELEASE     
+#define PCRE2_DATE           2016-01-12
+
+/* When an application links to a PCRE DLL in Windows, the symbols that are
+imported have to be identified as such. When building PCRE2, the appropriate
+export setting is defined in pcre2_internal.h, which includes this file. So we
+don't change existing definitions of PCRE2_EXP_DECL. */
+
+#if defined(_WIN32) && !defined(PCRE2_STATIC)
+#  ifndef PCRE2_EXP_DECL
+#    define PCRE2_EXP_DECL  extern __declspec(dllimport)
+#  endif
+#endif
+
+/* By default, we use the standard "extern" declarations. */
+
+#ifndef PCRE2_EXP_DECL
+#  ifdef __cplusplus
+#    define PCRE2_EXP_DECL  extern "C"
+#  else
+#    define PCRE2_EXP_DECL  extern
+#  endif
+#endif
+
+/* Have to include limits.h, stdlib.h and stdint.h to ensure that size_t and
+uint8_t, UCHAR_MAX, etc are defined. */
+
+#include <limits.h>
+#include <stdlib.h>
+#include <stdint.h>
+
+/* Allow for C++ users compiling this directly. */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* The following option bits can be passed to pcre2_compile(), pcre2_match(),
+or pcre2_dfa_match(). PCRE2_NO_UTF_CHECK affects only the function to which it
+is passed. Put these bits at the most significant end of the options word so
+others can be added next to them */
+
+#define PCRE2_ANCHORED            0x80000000u
+#define PCRE2_NO_UTF_CHECK        0x40000000u
+
+/* The following option bits can be passed only to pcre2_compile(). However,
+they may affect compilation, JIT compilation, and/or interpretive execution.
+The following tags indicate which:
+
+C   alters what is compiled by pcre2_compile()
+J   alters what is compiled by pcre2_jit_compile()
+M   is inspected during pcre2_match() execution
+D   is inspected during pcre2_dfa_match() execution
+*/
+
+#define PCRE2_ALLOW_EMPTY_CLASS   0x00000001u  /* C       */
+#define PCRE2_ALT_BSUX            0x00000002u  /* C       */
+#define PCRE2_AUTO_CALLOUT        0x00000004u  /* C       */
+#define PCRE2_CASELESS            0x00000008u  /* C       */
+#define PCRE2_DOLLAR_ENDONLY      0x00000010u  /*   J M D */
+#define PCRE2_DOTALL              0x00000020u  /* C       */
+#define PCRE2_DUPNAMES            0x00000040u  /* C       */
+#define PCRE2_EXTENDED            0x00000080u  /* C       */
+#define PCRE2_FIRSTLINE           0x00000100u  /*   J M D */
+#define PCRE2_MATCH_UNSET_BACKREF 0x00000200u  /* C J M   */
+#define PCRE2_MULTILINE           0x00000400u  /* C       */
+#define PCRE2_NEVER_UCP           0x00000800u  /* C       */
+#define PCRE2_NEVER_UTF           0x00001000u  /* C       */
+#define PCRE2_NO_AUTO_CAPTURE     0x00002000u  /* C       */
+#define PCRE2_NO_AUTO_POSSESS     0x00004000u  /* C       */
+#define PCRE2_NO_DOTSTAR_ANCHOR   0x00008000u  /* C       */
+#define PCRE2_NO_START_OPTIMIZE   0x00010000u  /*   J M D */
+#define PCRE2_UCP                 0x00020000u  /* C J M D */
+#define PCRE2_UNGREEDY            0x00040000u  /* C       */
+#define PCRE2_UTF                 0x00080000u  /* C J M D */
+#define PCRE2_NEVER_BACKSLASH_C   0x00100000u  /* C       */
+#define PCRE2_ALT_CIRCUMFLEX      0x00200000u  /*   J M D */
+#define PCRE2_ALT_VERBNAMES       0x00400000u  /* C       */
+#define PCRE2_USE_OFFSET_LIMIT    0x00800000u  /*   J M D */
+
+/* These are for pcre2_jit_compile(). */
+
+#define PCRE2_JIT_COMPLETE        0x00000001u  /* For full matching */
+#define PCRE2_JIT_PARTIAL_SOFT    0x00000002u
+#define PCRE2_JIT_PARTIAL_HARD    0x00000004u
+
+/* These are for pcre2_match(), pcre2_dfa_match(), and pcre2_jit_match(). Note
+that PCRE2_ANCHORED and PCRE2_NO_UTF_CHECK can also be passed to these
+functions (though pcre2_jit_match() ignores the latter since it bypasses all
+sanity checks). */
+
+#define PCRE2_NOTBOL              0x00000001u
+#define PCRE2_NOTEOL              0x00000002u
+#define PCRE2_NOTEMPTY            0x00000004u  /* ) These two must be kept */
+#define PCRE2_NOTEMPTY_ATSTART    0x00000008u  /* ) adjacent to each other. */
+#define PCRE2_PARTIAL_SOFT        0x00000010u
+#define PCRE2_PARTIAL_HARD        0x00000020u
+
+/* These are additional options for pcre2_dfa_match(). */
+
+#define PCRE2_DFA_RESTART         0x00000040u
+#define PCRE2_DFA_SHORTEST        0x00000080u
+
+/* These are additional options for pcre2_substitute(). */
+
+#define PCRE2_SUBSTITUTE_GLOBAL           0x00000100u
+#define PCRE2_SUBSTITUTE_EXTENDED         0x00000200u
+#define PCRE2_SUBSTITUTE_UNSET_EMPTY      0x00000400u
+#define PCRE2_SUBSTITUTE_UNKNOWN_UNSET    0x00000800u
+#define PCRE2_SUBSTITUTE_OVERFLOW_LENGTH  0x00001000u
+
+/* Newline and \R settings, for use in compile contexts. The newline values
+must be kept in step with values set in config.h and both sets must all be
+greater than zero. */
+
+#define PCRE2_NEWLINE_CR          1
+#define PCRE2_NEWLINE_LF          2
+#define PCRE2_NEWLINE_CRLF        3
+#define PCRE2_NEWLINE_ANY         4
+#define PCRE2_NEWLINE_ANYCRLF     5
+
+#define PCRE2_BSR_UNICODE         1
+#define PCRE2_BSR_ANYCRLF         2
+
+/* Error codes: no match and partial match are "expected" errors. */
+
+#define PCRE2_ERROR_NOMATCH          (-1)
+#define PCRE2_ERROR_PARTIAL          (-2)
+
+/* Error codes for UTF-8 validity checks */
+
+#define PCRE2_ERROR_UTF8_ERR1        (-3)
+#define PCRE2_ERROR_UTF8_ERR2        (-4)
+#define PCRE2_ERROR_UTF8_ERR3        (-5)
+#define PCRE2_ERROR_UTF8_ERR4        (-6)
+#define PCRE2_ERROR_UTF8_ERR5        (-7)
+#define PCRE2_ERROR_UTF8_ERR6        (-8)
+#define PCRE2_ERROR_UTF8_ERR7        (-9)
+#define PCRE2_ERROR_UTF8_ERR8       (-10)
+#define PCRE2_ERROR_UTF8_ERR9       (-11)
+#define PCRE2_ERROR_UTF8_ERR10      (-12)
+#define PCRE2_ERROR_UTF8_ERR11      (-13)
+#define PCRE2_ERROR_UTF8_ERR12      (-14)
+#define PCRE2_ERROR_UTF8_ERR13      (-15)
+#define PCRE2_ERROR_UTF8_ERR14      (-16)
+#define PCRE2_ERROR_UTF8_ERR15      (-17)
+#define PCRE2_ERROR_UTF8_ERR16      (-18)
+#define PCRE2_ERROR_UTF8_ERR17      (-19)
+#define PCRE2_ERROR_UTF8_ERR18      (-20)
+#define PCRE2_ERROR_UTF8_ERR19      (-21)
+#define PCRE2_ERROR_UTF8_ERR20      (-22)
+#define PCRE2_ERROR_UTF8_ERR21      (-23)
+
+/* Error codes for UTF-16 validity checks */
+
+#define PCRE2_ERROR_UTF16_ERR1      (-24)
+#define PCRE2_ERROR_UTF16_ERR2      (-25)
+#define PCRE2_ERROR_UTF16_ERR3      (-26)
+
+/* Error codes for UTF-32 validity checks */
+
+#define PCRE2_ERROR_UTF32_ERR1      (-27)
+#define PCRE2_ERROR_UTF32_ERR2      (-28)
+
+/* Error codes for pcre2[_dfa]_match(), substring extraction functions, context
+functions, and serializing functions. They are in numerical order. Originally
+they were in alphabetical order too, but now that PCRE2 is released, the
+numbers must not be changed. */
+
+#define PCRE2_ERROR_BADDATA           (-29)
+#define PCRE2_ERROR_MIXEDTABLES       (-30)  /* Name was changed */
+#define PCRE2_ERROR_BADMAGIC          (-31)
+#define PCRE2_ERROR_BADMODE           (-32)
+#define PCRE2_ERROR_BADOFFSET         (-33)
+#define PCRE2_ERROR_BADOPTION         (-34)
+#define PCRE2_ERROR_BADREPLACEMENT    (-35)
+#define PCRE2_ERROR_BADUTFOFFSET      (-36)
+#define PCRE2_ERROR_CALLOUT           (-37)  /* Never used by PCRE2 itself */
+#define PCRE2_ERROR_DFA_BADRESTART    (-38)
+#define PCRE2_ERROR_DFA_RECURSE       (-39)
+#define PCRE2_ERROR_DFA_UCOND         (-40)
+#define PCRE2_ERROR_DFA_UFUNC         (-41)
+#define PCRE2_ERROR_DFA_UITEM         (-42)
+#define PCRE2_ERROR_DFA_WSSIZE        (-43)
+#define PCRE2_ERROR_INTERNAL          (-44)
+#define PCRE2_ERROR_JIT_BADOPTION     (-45)
+#define PCRE2_ERROR_JIT_STACKLIMIT    (-46)
+#define PCRE2_ERROR_MATCHLIMIT        (-47)
+#define PCRE2_ERROR_NOMEMORY          (-48)
+#define PCRE2_ERROR_NOSUBSTRING       (-49)
+#define PCRE2_ERROR_NOUNIQUESUBSTRING (-50)
+#define PCRE2_ERROR_NULL              (-51)
+#define PCRE2_ERROR_RECURSELOOP       (-52)
+#define PCRE2_ERROR_RECURSIONLIMIT    (-53)
+#define PCRE2_ERROR_UNAVAILABLE       (-54)
+#define PCRE2_ERROR_UNSET             (-55)
+#define PCRE2_ERROR_BADOFFSETLIMIT    (-56)
+#define PCRE2_ERROR_BADREPESCAPE      (-57)
+#define PCRE2_ERROR_REPMISSINGBRACE   (-58)
+#define PCRE2_ERROR_BADSUBSTITUTION   (-59)
+#define PCRE2_ERROR_BADSUBSPATTERN    (-60)
+#define PCRE2_ERROR_TOOMANYREPLACE    (-61)
+
+/* Request types for pcre2_pattern_info() */
+
+#define PCRE2_INFO_ALLOPTIONS            0
+#define PCRE2_INFO_ARGOPTIONS            1
+#define PCRE2_INFO_BACKREFMAX            2
+#define PCRE2_INFO_BSR                   3
+#define PCRE2_INFO_CAPTURECOUNT          4
+#define PCRE2_INFO_FIRSTCODEUNIT         5
+#define PCRE2_INFO_FIRSTCODETYPE         6
+#define PCRE2_INFO_FIRSTBITMAP           7
+#define PCRE2_INFO_HASCRORLF             8
+#define PCRE2_INFO_JCHANGED              9
+#define PCRE2_INFO_JITSIZE              10
+#define PCRE2_INFO_LASTCODEUNIT         11
+#define PCRE2_INFO_LASTCODETYPE         12
+#define PCRE2_INFO_MATCHEMPTY           13
+#define PCRE2_INFO_MATCHLIMIT           14
+#define PCRE2_INFO_MAXLOOKBEHIND        15
+#define PCRE2_INFO_MINLENGTH            16
+#define PCRE2_INFO_NAMECOUNT            17
+#define PCRE2_INFO_NAMEENTRYSIZE        18
+#define PCRE2_INFO_NAMETABLE            19
+#define PCRE2_INFO_NEWLINE              20
+#define PCRE2_INFO_RECURSIONLIMIT       21
+#define PCRE2_INFO_SIZE                 22
+#define PCRE2_INFO_HASBACKSLASHC        23
+
+/* Request types for pcre2_config(). */
+
+#define PCRE2_CONFIG_BSR                     0
+#define PCRE2_CONFIG_JIT                     1
+#define PCRE2_CONFIG_JITTARGET               2
+#define PCRE2_CONFIG_LINKSIZE                3
+#define PCRE2_CONFIG_MATCHLIMIT              4
+#define PCRE2_CONFIG_NEWLINE                 5
+#define PCRE2_CONFIG_PARENSLIMIT             6
+#define PCRE2_CONFIG_RECURSIONLIMIT          7
+#define PCRE2_CONFIG_STACKRECURSE            8
+#define PCRE2_CONFIG_UNICODE                 9
+#define PCRE2_CONFIG_UNICODE_VERSION        10
+#define PCRE2_CONFIG_VERSION                11
+
+/* Types for code units in patterns and subject strings. */
+
+typedef uint8_t  PCRE2_UCHAR8;
+typedef uint16_t PCRE2_UCHAR16;
+typedef uint32_t PCRE2_UCHAR32;
+
+typedef const PCRE2_UCHAR8  *PCRE2_SPTR8;
+typedef const PCRE2_UCHAR16 *PCRE2_SPTR16;
+typedef const PCRE2_UCHAR32 *PCRE2_SPTR32;
+
+/* The PCRE2_SIZE type is used for all string lengths and offsets in PCRE2,
+including pattern offsets for errors and subject offsets after a match. We
+define special values to indicate zero-terminated strings and unset offsets in
+the offset vector (ovector). */
+
+#define PCRE2_SIZE            size_t
+#define PCRE2_SIZE_MAX        SIZE_MAX
+#define PCRE2_ZERO_TERMINATED (~(PCRE2_SIZE)0)
+#define PCRE2_UNSET           (~(PCRE2_SIZE)0)
+
+/* Generic types for opaque structures and JIT callback functions. These
+declarations are defined in a macro that is expanded for each width later. */
+
+#define PCRE2_TYPES_LIST \
+struct pcre2_real_general_context; \
+typedef struct pcre2_real_general_context pcre2_general_context; \
+\
+struct pcre2_real_compile_context; \
+typedef struct pcre2_real_compile_context pcre2_compile_context; \
+\
+struct pcre2_real_match_context; \
+typedef struct pcre2_real_match_context pcre2_match_context; \
+\
+struct pcre2_real_code; \
+typedef struct pcre2_real_code pcre2_code; \
+\
+struct pcre2_real_match_data; \
+typedef struct pcre2_real_match_data pcre2_match_data; \
+\
+struct pcre2_real_jit_stack; \
+typedef struct pcre2_real_jit_stack pcre2_jit_stack; \
+\
+typedef pcre2_jit_stack *(*pcre2_jit_callback)(void *);
+
+
+/* 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. Define the generic version in a macro; the width-specific
+versions are generated from this macro below. */
+
+#define PCRE2_STRUCTURE_LIST \
+typedef struct pcre2_callout_block { \
+  uint32_t      version;           /* Identifies version of block */ \
+  /* ------------------------ Version 0 ------------------------------- */ \
+  uint32_t      callout_number;    /* Number compiled into pattern */ \
+  uint32_t      capture_top;       /* Max current capture */ \
+  uint32_t      capture_last;      /* Most recently closed capture */ \
+  PCRE2_SIZE   *offset_vector;     /* The offset vector */ \
+  PCRE2_SPTR    mark;              /* Pointer to current mark or NULL */ \
+  PCRE2_SPTR    subject;           /* The subject being matched */ \
+  PCRE2_SIZE    subject_length;    /* The length of the subject */ \
+  PCRE2_SIZE    start_match;       /* Offset to start of this match attempt */ \
+  PCRE2_SIZE    current_position;  /* Where we currently are in the subject */ \
+  PCRE2_SIZE    pattern_position;  /* Offset to next item in the pattern */ \
+  PCRE2_SIZE    next_item_length;  /* Length of next item in the pattern */ \
+  /* ------------------- Added for Version 1 -------------------------- */ \
+  PCRE2_SIZE    callout_string_offset; /* Offset to string within pattern */ \
+  PCRE2_SIZE    callout_string_length; /* Length of string compiled into pattern */ \
+  PCRE2_SPTR    callout_string;    /* String compiled into pattern */ \
+  /* ------------------------------------------------------------------ */ \
+} pcre2_callout_block; \
+\
+typedef struct pcre2_callout_enumerate_block { \
+  uint32_t      version;           /* Identifies version of block */ \
+  /* ------------------------ Version 0 ------------------------------- */ \
+  PCRE2_SIZE    pattern_position;  /* Offset to next item in the pattern */ \
+  PCRE2_SIZE    next_item_length;  /* Length of next item in the pattern */ \
+  uint32_t      callout_number;    /* Number compiled into pattern */ \
+  PCRE2_SIZE    callout_string_offset; /* Offset to string within pattern */ \
+  PCRE2_SIZE    callout_string_length; /* Length of string compiled into pattern */ \
+  PCRE2_SPTR    callout_string;    /* String compiled into pattern */ \
+  /* ------------------------------------------------------------------ */ \
+} pcre2_callout_enumerate_block;
+
+
+/* List the generic forms of all other functions in macros, which will be
+expanded for each width below. Start with functions that give general
+information. */
+
+#define PCRE2_GENERAL_INFO_FUNCTIONS \
+PCRE2_EXP_DECL int       pcre2_config(uint32_t, void *);
+
+
+/* Functions for manipulating contexts. */
+
+#define PCRE2_GENERAL_CONTEXT_FUNCTIONS \
+PCRE2_EXP_DECL \
+  pcre2_general_context *pcre2_general_context_copy(pcre2_general_context *); \
+PCRE2_EXP_DECL \
+  pcre2_general_context *pcre2_general_context_create( \
+                           void *(*)(PCRE2_SIZE, void *), \
+                           void (*)(void *, void *), void *); \
+PCRE2_EXP_DECL void      pcre2_general_context_free(pcre2_general_context *);
+
+#define PCRE2_COMPILE_CONTEXT_FUNCTIONS \
+PCRE2_EXP_DECL \
+  pcre2_compile_context *pcre2_compile_context_copy(pcre2_compile_context *); \
+PCRE2_EXP_DECL \
+  pcre2_compile_context *pcre2_compile_context_create(pcre2_general_context *);\
+PCRE2_EXP_DECL void      pcre2_compile_context_free(pcre2_compile_context *); \
+PCRE2_EXP_DECL int       pcre2_set_bsr(pcre2_compile_context *, uint32_t); \
+PCRE2_EXP_DECL int       pcre2_set_character_tables(pcre2_compile_context *, \
+                           const unsigned char *); \
+PCRE2_EXP_DECL int       pcre2_set_max_pattern_length(pcre2_compile_context *, \
+                           PCRE2_SIZE); \
+PCRE2_EXP_DECL int       pcre2_set_newline(pcre2_compile_context *, uint32_t); \
+PCRE2_EXP_DECL int       pcre2_set_parens_nest_limit(pcre2_compile_context *, \
+                           uint32_t); \
+PCRE2_EXP_DECL int       pcre2_set_compile_recursion_guard(\
+                           pcre2_compile_context *, int (*)(uint32_t, void *), \
+                           void *);
+
+#define PCRE2_MATCH_CONTEXT_FUNCTIONS \
+PCRE2_EXP_DECL \
+  pcre2_match_context   *pcre2_match_context_copy(pcre2_match_context *); \
+PCRE2_EXP_DECL \
+  pcre2_match_context   *pcre2_match_context_create(pcre2_general_context *); \
+PCRE2_EXP_DECL void      pcre2_match_context_free(pcre2_match_context *); \
+PCRE2_EXP_DECL int       pcre2_set_callout(pcre2_match_context *, \
+                           int (*)(pcre2_callout_block *, void *), void *); \
+PCRE2_EXP_DECL int       pcre2_set_match_limit(pcre2_match_context *, \
+                           uint32_t); \
+PCRE2_EXP_DECL int       pcre2_set_offset_limit(pcre2_match_context *, \
+                           PCRE2_SIZE); \
+PCRE2_EXP_DECL int       pcre2_set_recursion_limit(pcre2_match_context *, \
+                           uint32_t); \
+PCRE2_EXP_DECL int       pcre2_set_recursion_memory_management( \
+                           pcre2_match_context *, void *(*)(PCRE2_SIZE, void *), \
+                           void (*)(void *, void *), void *);
+
+
+/* Functions concerned with compiling a pattern to PCRE internal code. */
+
+#define PCRE2_COMPILE_FUNCTIONS \
+PCRE2_EXP_DECL \
+  pcre2_code            *pcre2_compile(PCRE2_SPTR, PCRE2_SIZE, uint32_t, \
+                           int *, PCRE2_SIZE *, pcre2_compile_context *); \
+PCRE2_EXP_DECL void      pcre2_code_free(pcre2_code *);
+
+
+/* Functions that give information about a compiled pattern. */
+
+#define PCRE2_PATTERN_INFO_FUNCTIONS \
+PCRE2_EXP_DECL int       pcre2_pattern_info(const pcre2_code *, uint32_t, \
+                           void *); \
+PCRE2_EXP_DECL int       pcre2_callout_enumerate(const pcre2_code *, \
+                           int (*)(pcre2_callout_enumerate_block *, void *), \
+                           void *);
+
+
+/* Functions for running a match and inspecting the result. */
+
+#define PCRE2_MATCH_FUNCTIONS \
+PCRE2_EXP_DECL \
+  pcre2_match_data        *pcre2_match_data_create(uint32_t, \
+                             pcre2_general_context *); \
+PCRE2_EXP_DECL \
+  pcre2_match_data        *pcre2_match_data_create_from_pattern(\
+                             const pcre2_code *, \
+                             pcre2_general_context *); \
+PCRE2_EXP_DECL int         pcre2_dfa_match(const pcre2_code *, PCRE2_SPTR, \
+                             PCRE2_SIZE, PCRE2_SIZE, uint32_t, \
+                             pcre2_match_data *, pcre2_match_context *, int *, \
+                             PCRE2_SIZE); \
+PCRE2_EXP_DECL int         pcre2_match(const pcre2_code *, \
+                             PCRE2_SPTR, PCRE2_SIZE, PCRE2_SIZE, uint32_t, \
+                             pcre2_match_data *, pcre2_match_context *); \
+PCRE2_EXP_DECL void        pcre2_match_data_free(pcre2_match_data *); \
+PCRE2_EXP_DECL PCRE2_SPTR  pcre2_get_mark(pcre2_match_data *); \
+PCRE2_EXP_DECL uint32_t    pcre2_get_ovector_count(pcre2_match_data *); \
+PCRE2_EXP_DECL PCRE2_SIZE *pcre2_get_ovector_pointer(pcre2_match_data *); \
+PCRE2_EXP_DECL PCRE2_SIZE  pcre2_get_startchar(pcre2_match_data *);
+
+
+/* Convenience functions for handling matched substrings. */
+
+#define PCRE2_SUBSTRING_FUNCTIONS \
+PCRE2_EXP_DECL int       pcre2_substring_copy_byname(pcre2_match_data *, \
+                           PCRE2_SPTR, PCRE2_UCHAR *, PCRE2_SIZE *); \
+PCRE2_EXP_DECL int       pcre2_substring_copy_bynumber(pcre2_match_data *, \
+                           uint32_t, PCRE2_UCHAR *, PCRE2_SIZE *); \
+PCRE2_EXP_DECL void      pcre2_substring_free(PCRE2_UCHAR *); \
+PCRE2_EXP_DECL int       pcre2_substring_get_byname(pcre2_match_data *, \
+                           PCRE2_SPTR, PCRE2_UCHAR **, PCRE2_SIZE *); \
+PCRE2_EXP_DECL int       pcre2_substring_get_bynumber(pcre2_match_data *, \
+                           uint32_t, PCRE2_UCHAR **, PCRE2_SIZE *); \
+PCRE2_EXP_DECL int       pcre2_substring_length_byname(pcre2_match_data *, \
+                           PCRE2_SPTR, PCRE2_SIZE *); \
+PCRE2_EXP_DECL int       pcre2_substring_length_bynumber(pcre2_match_data *, \
+                           uint32_t, PCRE2_SIZE *); \
+PCRE2_EXP_DECL int       pcre2_substring_nametable_scan(const pcre2_code *, \
+                           PCRE2_SPTR, PCRE2_SPTR *, PCRE2_SPTR *); \
+PCRE2_EXP_DECL int       pcre2_substring_number_from_name(\
+                           const pcre2_code *, PCRE2_SPTR); \
+PCRE2_EXP_DECL void      pcre2_substring_list_free(PCRE2_SPTR *); \
+PCRE2_EXP_DECL int       pcre2_substring_list_get(pcre2_match_data *, \
+                           PCRE2_UCHAR ***, PCRE2_SIZE **);
+
+/* Functions for serializing / deserializing compiled patterns. */
+
+#define PCRE2_SERIALIZE_FUNCTIONS \
+PCRE2_EXP_DECL int32_t   pcre2_serialize_encode(const pcre2_code **, \
+                           int32_t, uint8_t **, PCRE2_SIZE *, \
+                           pcre2_general_context *); \
+PCRE2_EXP_DECL int32_t   pcre2_serialize_decode(pcre2_code **, int32_t, \
+                           const uint8_t *, pcre2_general_context *); \
+PCRE2_EXP_DECL int32_t   pcre2_serialize_get_number_of_codes(const uint8_t *); \
+PCRE2_EXP_DECL void      pcre2_serialize_free(uint8_t *);
+
+
+/* Convenience function for match + substitute. */
+
+#define PCRE2_SUBSTITUTE_FUNCTION \
+PCRE2_EXP_DECL int       pcre2_substitute(const pcre2_code *, \
+                           PCRE2_SPTR, PCRE2_SIZE, PCRE2_SIZE, uint32_t, \
+                           pcre2_match_data *, pcre2_match_context *, \
+                           PCRE2_SPTR, PCRE2_SIZE, PCRE2_UCHAR *, \
+                           PCRE2_SIZE *);
+
+
+/* Functions for JIT processing */
+
+#define PCRE2_JIT_FUNCTIONS \
+PCRE2_EXP_DECL int       pcre2_jit_compile(pcre2_code *, uint32_t); \
+PCRE2_EXP_DECL int       pcre2_jit_match(const pcre2_code *, \
+                           PCRE2_SPTR, PCRE2_SIZE, PCRE2_SIZE, uint32_t, \
+                           pcre2_match_data *, pcre2_match_context *); \
+PCRE2_EXP_DECL void      pcre2_jit_free_unused_memory(pcre2_general_context *); \
+PCRE2_EXP_DECL \
+  pcre2_jit_stack       *pcre2_jit_stack_create(PCRE2_SIZE, PCRE2_SIZE, \
+                           pcre2_general_context *); \
+PCRE2_EXP_DECL void      pcre2_jit_stack_assign(pcre2_match_context *, \
+                           pcre2_jit_callback, void *); \
+PCRE2_EXP_DECL void      pcre2_jit_stack_free(pcre2_jit_stack *);
+
+
+/* Other miscellaneous functions. */
+
+#define PCRE2_OTHER_FUNCTIONS \
+PCRE2_EXP_DECL int       pcre2_get_error_message(int, PCRE2_UCHAR *, PCRE2_SIZE); \
+PCRE2_EXP_DECL \
+  const uint8_t         *pcre2_maketables(pcre2_general_context *); \
+
+
+/* Define macros that generate width-specific names from generic versions. The
+three-level macro scheme is necessary to get the macros expanded when we want
+them to be. First we get the width from PCRE2_LOCAL_WIDTH, which is used for
+generating three versions of everything below. After that, PCRE2_SUFFIX will be
+re-defined to use PCRE2_CODE_UNIT_WIDTH, for use when macros such as
+pcre2_compile are called by application code. */
+
+#define PCRE2_JOIN(a,b) a ## b
+#define PCRE2_GLUE(a,b) PCRE2_JOIN(a,b)
+#define PCRE2_SUFFIX(a) PCRE2_GLUE(a,PCRE2_LOCAL_WIDTH)
+
+
+/* Data types */
+
+#define PCRE2_UCHAR                 PCRE2_SUFFIX(PCRE2_UCHAR)
+#define PCRE2_SPTR                  PCRE2_SUFFIX(PCRE2_SPTR)
+
+#define pcre2_code                  PCRE2_SUFFIX(pcre2_code_)
+#define pcre2_jit_callback          PCRE2_SUFFIX(pcre2_jit_callback_)
+#define pcre2_jit_stack             PCRE2_SUFFIX(pcre2_jit_stack_)
+
+#define pcre2_real_code             PCRE2_SUFFIX(pcre2_real_code_)
+#define pcre2_real_general_context  PCRE2_SUFFIX(pcre2_real_general_context_)
+#define pcre2_real_compile_context  PCRE2_SUFFIX(pcre2_real_compile_context_)
+#define pcre2_real_match_context    PCRE2_SUFFIX(pcre2_real_match_context_)
+#define pcre2_real_jit_stack        PCRE2_SUFFIX(pcre2_real_jit_stack_)
+#define pcre2_real_match_data       PCRE2_SUFFIX(pcre2_real_match_data_)
+
+
+/* Data blocks */
+
+#define pcre2_callout_block            PCRE2_SUFFIX(pcre2_callout_block_)
+#define pcre2_callout_enumerate_block  PCRE2_SUFFIX(pcre2_callout_enumerate_block_)
+#define pcre2_general_context          PCRE2_SUFFIX(pcre2_general_context_)
+#define pcre2_compile_context          PCRE2_SUFFIX(pcre2_compile_context_)
+#define pcre2_match_context            PCRE2_SUFFIX(pcre2_match_context_)
+#define pcre2_match_data               PCRE2_SUFFIX(pcre2_match_data_)
+
+
+/* Functions: the complete list in alphabetical order */
+
+#define pcre2_callout_enumerate               PCRE2_SUFFIX(pcre2_callout_enumerate_)
+#define pcre2_code_free                       PCRE2_SUFFIX(pcre2_code_free_)
+#define pcre2_compile                         PCRE2_SUFFIX(pcre2_compile_)
+#define pcre2_compile_context_copy            PCRE2_SUFFIX(pcre2_compile_context_copy_)
+#define pcre2_compile_context_create          PCRE2_SUFFIX(pcre2_compile_context_create_)
+#define pcre2_compile_context_free            PCRE2_SUFFIX(pcre2_compile_context_free_)
+#define pcre2_config                          PCRE2_SUFFIX(pcre2_config_)
+#define pcre2_dfa_match                       PCRE2_SUFFIX(pcre2_dfa_match_)
+#define pcre2_general_context_copy            PCRE2_SUFFIX(pcre2_general_context_copy_)
+#define pcre2_general_context_create          PCRE2_SUFFIX(pcre2_general_context_create_)
+#define pcre2_general_context_free            PCRE2_SUFFIX(pcre2_general_context_free_)
+#define pcre2_get_error_message               PCRE2_SUFFIX(pcre2_get_error_message_)
+#define pcre2_get_mark                        PCRE2_SUFFIX(pcre2_get_mark_)
+#define pcre2_get_ovector_pointer             PCRE2_SUFFIX(pcre2_get_ovector_pointer_)
+#define pcre2_get_ovector_count               PCRE2_SUFFIX(pcre2_get_ovector_count_)
+#define pcre2_get_startchar                   PCRE2_SUFFIX(pcre2_get_startchar_)
+#define pcre2_jit_compile                     PCRE2_SUFFIX(pcre2_jit_compile_)
+#define pcre2_jit_match                       PCRE2_SUFFIX(pcre2_jit_match_)
+#define pcre2_jit_free_unused_memory          PCRE2_SUFFIX(pcre2_jit_free_unused_memory_)
+#define pcre2_jit_stack_assign                PCRE2_SUFFIX(pcre2_jit_stack_assign_)
+#define pcre2_jit_stack_create                PCRE2_SUFFIX(pcre2_jit_stack_create_)
+#define pcre2_jit_stack_free                  PCRE2_SUFFIX(pcre2_jit_stack_free_)
+#define pcre2_maketables                      PCRE2_SUFFIX(pcre2_maketables_)
+#define pcre2_match                           PCRE2_SUFFIX(pcre2_match_)
+#define pcre2_match_context_copy              PCRE2_SUFFIX(pcre2_match_context_copy_)
+#define pcre2_match_context_create            PCRE2_SUFFIX(pcre2_match_context_create_)
+#define pcre2_match_context_free              PCRE2_SUFFIX(pcre2_match_context_free_)
+#define pcre2_match_data_create               PCRE2_SUFFIX(pcre2_match_data_create_)
+#define pcre2_match_data_create_from_pattern  PCRE2_SUFFIX(pcre2_match_data_create_from_pattern_)
+#define pcre2_match_data_free                 PCRE2_SUFFIX(pcre2_match_data_free_)
+#define pcre2_pattern_info                    PCRE2_SUFFIX(pcre2_pattern_info_)
+#define pcre2_serialize_decode                PCRE2_SUFFIX(pcre2_serialize_decode_)
+#define pcre2_serialize_encode                PCRE2_SUFFIX(pcre2_serialize_encode_)
+#define pcre2_serialize_free                  PCRE2_SUFFIX(pcre2_serialize_free_)
+#define pcre2_serialize_get_number_of_codes   PCRE2_SUFFIX(pcre2_serialize_get_number_of_codes_)
+#define pcre2_set_bsr                         PCRE2_SUFFIX(pcre2_set_bsr_)
+#define pcre2_set_callout                     PCRE2_SUFFIX(pcre2_set_callout_)
+#define pcre2_set_character_tables            PCRE2_SUFFIX(pcre2_set_character_tables_)
+#define pcre2_set_compile_recursion_guard     PCRE2_SUFFIX(pcre2_set_compile_recursion_guard_)
+#define pcre2_set_match_limit                 PCRE2_SUFFIX(pcre2_set_match_limit_)
+#define pcre2_set_max_pattern_length          PCRE2_SUFFIX(pcre2_set_max_pattern_length_)
+#define pcre2_set_newline                     PCRE2_SUFFIX(pcre2_set_newline_)
+#define pcre2_set_parens_nest_limit           PCRE2_SUFFIX(pcre2_set_parens_nest_limit_)
+#define pcre2_set_offset_limit                PCRE2_SUFFIX(pcre2_set_offset_limit_)
+#define pcre2_set_recursion_limit             PCRE2_SUFFIX(pcre2_set_recursion_limit_)
+#define pcre2_set_recursion_memory_management PCRE2_SUFFIX(pcre2_set_recursion_memory_management_)
+#define pcre2_substitute                      PCRE2_SUFFIX(pcre2_substitute_)
+#define pcre2_substring_copy_byname           PCRE2_SUFFIX(pcre2_substring_copy_byname_)
+#define pcre2_substring_copy_bynumber         PCRE2_SUFFIX(pcre2_substring_copy_bynumber_)
+#define pcre2_substring_free                  PCRE2_SUFFIX(pcre2_substring_free_)
+#define pcre2_substring_get_byname            PCRE2_SUFFIX(pcre2_substring_get_byname_)
+#define pcre2_substring_get_bynumber          PCRE2_SUFFIX(pcre2_substring_get_bynumber_)
+#define pcre2_substring_length_byname         PCRE2_SUFFIX(pcre2_substring_length_byname_)
+#define pcre2_substring_length_bynumber       PCRE2_SUFFIX(pcre2_substring_length_bynumber_)
+#define pcre2_substring_list_get              PCRE2_SUFFIX(pcre2_substring_list_get_)
+#define pcre2_substring_list_free             PCRE2_SUFFIX(pcre2_substring_list_free_)
+#define pcre2_substring_nametable_scan        PCRE2_SUFFIX(pcre2_substring_nametable_scan_)
+#define pcre2_substring_number_from_name      PCRE2_SUFFIX(pcre2_substring_number_from_name_)
+
+
+/* Now generate all three sets of width-specific structures and function
+prototypes. */
+
+#define PCRE2_TYPES_STRUCTURES_AND_FUNCTIONS \
+PCRE2_TYPES_LIST \
+PCRE2_STRUCTURE_LIST \
+PCRE2_GENERAL_INFO_FUNCTIONS \
+PCRE2_GENERAL_CONTEXT_FUNCTIONS \
+PCRE2_COMPILE_CONTEXT_FUNCTIONS \
+PCRE2_MATCH_CONTEXT_FUNCTIONS \
+PCRE2_COMPILE_FUNCTIONS \
+PCRE2_PATTERN_INFO_FUNCTIONS \
+PCRE2_MATCH_FUNCTIONS \
+PCRE2_SUBSTRING_FUNCTIONS \
+PCRE2_SERIALIZE_FUNCTIONS \
+PCRE2_SUBSTITUTE_FUNCTION \
+PCRE2_JIT_FUNCTIONS \
+PCRE2_OTHER_FUNCTIONS
+
+#define PCRE2_LOCAL_WIDTH 8
+PCRE2_TYPES_STRUCTURES_AND_FUNCTIONS
+#undef PCRE2_LOCAL_WIDTH
+
+#define PCRE2_LOCAL_WIDTH 16
+PCRE2_TYPES_STRUCTURES_AND_FUNCTIONS
+#undef PCRE2_LOCAL_WIDTH
+
+#define PCRE2_LOCAL_WIDTH 32
+PCRE2_TYPES_STRUCTURES_AND_FUNCTIONS
+#undef PCRE2_LOCAL_WIDTH
+
+/* Undefine the list macros; they are no longer needed. */
+
+#undef PCRE2_TYPES_LIST
+#undef PCRE2_STRUCTURE_LIST
+#undef PCRE2_GENERAL_INFO_FUNCTIONS
+#undef PCRE2_GENERAL_CONTEXT_FUNCTIONS
+#undef PCRE2_COMPILE_CONTEXT_FUNCTIONS
+#undef PCRE2_MATCH_CONTEXT_FUNCTIONS
+#undef PCRE2_COMPILE_FUNCTIONS
+#undef PCRE2_PATTERN_INFO_FUNCTIONS
+#undef PCRE2_MATCH_FUNCTIONS
+#undef PCRE2_SUBSTRING_FUNCTIONS
+#undef PCRE2_SERIALIZE_FUNCTIONS
+#undef PCRE2_SUBSTITUTE_FUNCTION
+#undef PCRE2_JIT_FUNCTIONS
+#undef PCRE2_OTHER_FUNCTIONS
+#undef PCRE2_TYPES_STRUCTURES_AND_FUNCTIONS
+
+/* PCRE2_CODE_UNIT_WIDTH must be defined. If it is 8, 16, or 32, redefine
+PCRE2_SUFFIX to use it. If it is 0, undefine the other macros and make
+PCRE2_SUFFIX a no-op. Otherwise, generate an error. */
+
+#undef PCRE2_SUFFIX
+#ifndef PCRE2_CODE_UNIT_WIDTH
+#error PCRE2_CODE_UNIT_WIDTH must be defined before including pcre2.h.
+#error Use 8, 16, or 32; or 0 for a multi-width application.
+#else  /* PCRE2_CODE_UNIT_WIDTH is defined */
+#if PCRE2_CODE_UNIT_WIDTH == 8 || \
+    PCRE2_CODE_UNIT_WIDTH == 16 || \
+    PCRE2_CODE_UNIT_WIDTH == 32
+#define PCRE2_SUFFIX(a) PCRE2_GLUE(a, PCRE2_CODE_UNIT_WIDTH)
+#elif PCRE2_CODE_UNIT_WIDTH == 0
+#undef PCRE2_JOIN
+#undef PCRE2_GLUE
+#define PCRE2_SUFFIX(a) a
+#else
+#error PCRE2_CODE_UNIT_WIDTH must be 0, 8, 16, or 32.
+#endif
+#endif  /* PCRE2_CODE_UNIT_WIDTH is defined */
+
+#ifdef __cplusplus
+}  /* extern "C" */
+#endif
+
+#endif /* End of pcre2.h */
diff --git a/dist2/src/pcre2.h.in b/dist2/src/pcre2.h.in
new file mode 100644
index 0000000..49f1909
--- /dev/null
+++ b/dist2/src/pcre2.h.in
@@ -0,0 +1,722 @@
+/*************************************************
+*       Perl-Compatible Regular Expressions      *
+*************************************************/
+
+/* This is the public header file for the PCRE library, second API, to be
+#included by applications that call PCRE2 functions.
+
+           Copyright (c) 2016 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 _PCRE2_H
+#define _PCRE2_H
+
+/* The current PCRE version information. */
+
+#define PCRE2_MAJOR          @PCRE2_MAJOR@
+#define PCRE2_MINOR          @PCRE2_MINOR@
+#define PCRE2_PRERELEASE     @PCRE2_PRERELEASE@
+#define PCRE2_DATE           @PCRE2_DATE@
+
+/* When an application links to a PCRE DLL in Windows, the symbols that are
+imported have to be identified as such. When building PCRE2, the appropriate
+export setting is defined in pcre2_internal.h, which includes this file. So we
+don't change existing definitions of PCRE2_EXP_DECL. */
+
+#if defined(_WIN32) && !defined(PCRE2_STATIC)
+#  ifndef PCRE2_EXP_DECL
+#    define PCRE2_EXP_DECL  extern __declspec(dllimport)
+#  endif
+#endif
+
+/* By default, we use the standard "extern" declarations. */
+
+#ifndef PCRE2_EXP_DECL
+#  ifdef __cplusplus
+#    define PCRE2_EXP_DECL  extern "C"
+#  else
+#    define PCRE2_EXP_DECL  extern
+#  endif
+#endif
+
+/* Have to include limits.h, stdlib.h and stdint.h to ensure that size_t and
+uint8_t, UCHAR_MAX, etc are defined. */
+
+#include <limits.h>
+#include <stdlib.h>
+#include <stdint.h>
+
+/* Allow for C++ users compiling this directly. */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* The following option bits can be passed to pcre2_compile(), pcre2_match(),
+or pcre2_dfa_match(). PCRE2_NO_UTF_CHECK affects only the function to which it
+is passed. Put these bits at the most significant end of the options word so
+others can be added next to them */
+
+#define PCRE2_ANCHORED            0x80000000u
+#define PCRE2_NO_UTF_CHECK        0x40000000u
+
+/* The following option bits can be passed only to pcre2_compile(). However,
+they may affect compilation, JIT compilation, and/or interpretive execution.
+The following tags indicate which:
+
+C   alters what is compiled by pcre2_compile()
+J   alters what is compiled by pcre2_jit_compile()
+M   is inspected during pcre2_match() execution
+D   is inspected during pcre2_dfa_match() execution
+*/
+
+#define PCRE2_ALLOW_EMPTY_CLASS   0x00000001u  /* C       */
+#define PCRE2_ALT_BSUX            0x00000002u  /* C       */
+#define PCRE2_AUTO_CALLOUT        0x00000004u  /* C       */
+#define PCRE2_CASELESS            0x00000008u  /* C       */
+#define PCRE2_DOLLAR_ENDONLY      0x00000010u  /*   J M D */
+#define PCRE2_DOTALL              0x00000020u  /* C       */
+#define PCRE2_DUPNAMES            0x00000040u  /* C       */
+#define PCRE2_EXTENDED            0x00000080u  /* C       */
+#define PCRE2_FIRSTLINE           0x00000100u  /*   J M D */
+#define PCRE2_MATCH_UNSET_BACKREF 0x00000200u  /* C J M   */
+#define PCRE2_MULTILINE           0x00000400u  /* C       */
+#define PCRE2_NEVER_UCP           0x00000800u  /* C       */
+#define PCRE2_NEVER_UTF           0x00001000u  /* C       */
+#define PCRE2_NO_AUTO_CAPTURE     0x00002000u  /* C       */
+#define PCRE2_NO_AUTO_POSSESS     0x00004000u  /* C       */
+#define PCRE2_NO_DOTSTAR_ANCHOR   0x00008000u  /* C       */
+#define PCRE2_NO_START_OPTIMIZE   0x00010000u  /*   J M D */
+#define PCRE2_UCP                 0x00020000u  /* C J M D */
+#define PCRE2_UNGREEDY            0x00040000u  /* C       */
+#define PCRE2_UTF                 0x00080000u  /* C J M D */
+#define PCRE2_NEVER_BACKSLASH_C   0x00100000u  /* C       */
+#define PCRE2_ALT_CIRCUMFLEX      0x00200000u  /*   J M D */
+#define PCRE2_ALT_VERBNAMES       0x00400000u  /* C       */
+#define PCRE2_USE_OFFSET_LIMIT    0x00800000u  /*   J M D */
+
+/* These are for pcre2_jit_compile(). */
+
+#define PCRE2_JIT_COMPLETE        0x00000001u  /* For full matching */
+#define PCRE2_JIT_PARTIAL_SOFT    0x00000002u
+#define PCRE2_JIT_PARTIAL_HARD    0x00000004u
+
+/* These are for pcre2_match(), pcre2_dfa_match(), and pcre2_jit_match(). Note
+that PCRE2_ANCHORED and PCRE2_NO_UTF_CHECK can also be passed to these
+functions (though pcre2_jit_match() ignores the latter since it bypasses all
+sanity checks). */
+
+#define PCRE2_NOTBOL              0x00000001u
+#define PCRE2_NOTEOL              0x00000002u
+#define PCRE2_NOTEMPTY            0x00000004u  /* ) These two must be kept */
+#define PCRE2_NOTEMPTY_ATSTART    0x00000008u  /* ) adjacent to each other. */
+#define PCRE2_PARTIAL_SOFT        0x00000010u
+#define PCRE2_PARTIAL_HARD        0x00000020u
+
+/* These are additional options for pcre2_dfa_match(). */
+
+#define PCRE2_DFA_RESTART         0x00000040u
+#define PCRE2_DFA_SHORTEST        0x00000080u
+
+/* These are additional options for pcre2_substitute(). */
+
+#define PCRE2_SUBSTITUTE_GLOBAL           0x00000100u
+#define PCRE2_SUBSTITUTE_EXTENDED         0x00000200u
+#define PCRE2_SUBSTITUTE_UNSET_EMPTY      0x00000400u
+#define PCRE2_SUBSTITUTE_UNKNOWN_UNSET    0x00000800u
+#define PCRE2_SUBSTITUTE_OVERFLOW_LENGTH  0x00001000u
+
+/* Newline and \R settings, for use in compile contexts. The newline values
+must be kept in step with values set in config.h and both sets must all be
+greater than zero. */
+
+#define PCRE2_NEWLINE_CR          1
+#define PCRE2_NEWLINE_LF          2
+#define PCRE2_NEWLINE_CRLF        3
+#define PCRE2_NEWLINE_ANY         4
+#define PCRE2_NEWLINE_ANYCRLF     5
+
+#define PCRE2_BSR_UNICODE         1
+#define PCRE2_BSR_ANYCRLF         2
+
+/* Error codes: no match and partial match are "expected" errors. */
+
+#define PCRE2_ERROR_NOMATCH          (-1)
+#define PCRE2_ERROR_PARTIAL          (-2)
+
+/* Error codes for UTF-8 validity checks */
+
+#define PCRE2_ERROR_UTF8_ERR1        (-3)
+#define PCRE2_ERROR_UTF8_ERR2        (-4)
+#define PCRE2_ERROR_UTF8_ERR3        (-5)
+#define PCRE2_ERROR_UTF8_ERR4        (-6)
+#define PCRE2_ERROR_UTF8_ERR5        (-7)
+#define PCRE2_ERROR_UTF8_ERR6        (-8)
+#define PCRE2_ERROR_UTF8_ERR7        (-9)
+#define PCRE2_ERROR_UTF8_ERR8       (-10)
+#define PCRE2_ERROR_UTF8_ERR9       (-11)
+#define PCRE2_ERROR_UTF8_ERR10      (-12)
+#define PCRE2_ERROR_UTF8_ERR11      (-13)
+#define PCRE2_ERROR_UTF8_ERR12      (-14)
+#define PCRE2_ERROR_UTF8_ERR13      (-15)
+#define PCRE2_ERROR_UTF8_ERR14      (-16)
+#define PCRE2_ERROR_UTF8_ERR15      (-17)
+#define PCRE2_ERROR_UTF8_ERR16      (-18)
+#define PCRE2_ERROR_UTF8_ERR17      (-19)
+#define PCRE2_ERROR_UTF8_ERR18      (-20)
+#define PCRE2_ERROR_UTF8_ERR19      (-21)
+#define PCRE2_ERROR_UTF8_ERR20      (-22)
+#define PCRE2_ERROR_UTF8_ERR21      (-23)
+
+/* Error codes for UTF-16 validity checks */
+
+#define PCRE2_ERROR_UTF16_ERR1      (-24)
+#define PCRE2_ERROR_UTF16_ERR2      (-25)
+#define PCRE2_ERROR_UTF16_ERR3      (-26)
+
+/* Error codes for UTF-32 validity checks */
+
+#define PCRE2_ERROR_UTF32_ERR1      (-27)
+#define PCRE2_ERROR_UTF32_ERR2      (-28)
+
+/* Error codes for pcre2[_dfa]_match(), substring extraction functions, context
+functions, and serializing functions. They are in numerical order. Originally
+they were in alphabetical order too, but now that PCRE2 is released, the
+numbers must not be changed. */
+
+#define PCRE2_ERROR_BADDATA           (-29)
+#define PCRE2_ERROR_MIXEDTABLES       (-30)  /* Name was changed */
+#define PCRE2_ERROR_BADMAGIC          (-31)
+#define PCRE2_ERROR_BADMODE           (-32)
+#define PCRE2_ERROR_BADOFFSET         (-33)
+#define PCRE2_ERROR_BADOPTION         (-34)
+#define PCRE2_ERROR_BADREPLACEMENT    (-35)
+#define PCRE2_ERROR_BADUTFOFFSET      (-36)
+#define PCRE2_ERROR_CALLOUT           (-37)  /* Never used by PCRE2 itself */
+#define PCRE2_ERROR_DFA_BADRESTART    (-38)
+#define PCRE2_ERROR_DFA_RECURSE       (-39)
+#define PCRE2_ERROR_DFA_UCOND         (-40)
+#define PCRE2_ERROR_DFA_UFUNC         (-41)
+#define PCRE2_ERROR_DFA_UITEM         (-42)
+#define PCRE2_ERROR_DFA_WSSIZE        (-43)
+#define PCRE2_ERROR_INTERNAL          (-44)
+#define PCRE2_ERROR_JIT_BADOPTION     (-45)
+#define PCRE2_ERROR_JIT_STACKLIMIT    (-46)
+#define PCRE2_ERROR_MATCHLIMIT        (-47)
+#define PCRE2_ERROR_NOMEMORY          (-48)
+#define PCRE2_ERROR_NOSUBSTRING       (-49)
+#define PCRE2_ERROR_NOUNIQUESUBSTRING (-50)
+#define PCRE2_ERROR_NULL              (-51)
+#define PCRE2_ERROR_RECURSELOOP       (-52)
+#define PCRE2_ERROR_RECURSIONLIMIT    (-53)
+#define PCRE2_ERROR_UNAVAILABLE       (-54)
+#define PCRE2_ERROR_UNSET             (-55)
+#define PCRE2_ERROR_BADOFFSETLIMIT    (-56)
+#define PCRE2_ERROR_BADREPESCAPE      (-57)
+#define PCRE2_ERROR_REPMISSINGBRACE   (-58)
+#define PCRE2_ERROR_BADSUBSTITUTION   (-59)
+#define PCRE2_ERROR_BADSUBSPATTERN    (-60)
+#define PCRE2_ERROR_TOOMANYREPLACE    (-61)
+
+/* Request types for pcre2_pattern_info() */
+
+#define PCRE2_INFO_ALLOPTIONS            0
+#define PCRE2_INFO_ARGOPTIONS            1
+#define PCRE2_INFO_BACKREFMAX            2
+#define PCRE2_INFO_BSR                   3
+#define PCRE2_INFO_CAPTURECOUNT          4
+#define PCRE2_INFO_FIRSTCODEUNIT         5
+#define PCRE2_INFO_FIRSTCODETYPE         6
+#define PCRE2_INFO_FIRSTBITMAP           7
+#define PCRE2_INFO_HASCRORLF             8
+#define PCRE2_INFO_JCHANGED              9
+#define PCRE2_INFO_JITSIZE              10
+#define PCRE2_INFO_LASTCODEUNIT         11
+#define PCRE2_INFO_LASTCODETYPE         12
+#define PCRE2_INFO_MATCHEMPTY           13
+#define PCRE2_INFO_MATCHLIMIT           14
+#define PCRE2_INFO_MAXLOOKBEHIND        15
+#define PCRE2_INFO_MINLENGTH            16
+#define PCRE2_INFO_NAMECOUNT            17
+#define PCRE2_INFO_NAMEENTRYSIZE        18
+#define PCRE2_INFO_NAMETABLE            19
+#define PCRE2_INFO_NEWLINE              20
+#define PCRE2_INFO_RECURSIONLIMIT       21
+#define PCRE2_INFO_SIZE                 22
+#define PCRE2_INFO_HASBACKSLASHC        23
+
+/* Request types for pcre2_config(). */
+
+#define PCRE2_CONFIG_BSR                     0
+#define PCRE2_CONFIG_JIT                     1
+#define PCRE2_CONFIG_JITTARGET               2
+#define PCRE2_CONFIG_LINKSIZE                3
+#define PCRE2_CONFIG_MATCHLIMIT              4
+#define PCRE2_CONFIG_NEWLINE                 5
+#define PCRE2_CONFIG_PARENSLIMIT             6
+#define PCRE2_CONFIG_RECURSIONLIMIT          7
+#define PCRE2_CONFIG_STACKRECURSE            8
+#define PCRE2_CONFIG_UNICODE                 9
+#define PCRE2_CONFIG_UNICODE_VERSION        10
+#define PCRE2_CONFIG_VERSION                11
+
+/* Types for code units in patterns and subject strings. */
+
+typedef uint8_t  PCRE2_UCHAR8;
+typedef uint16_t PCRE2_UCHAR16;
+typedef uint32_t PCRE2_UCHAR32;
+
+typedef const PCRE2_UCHAR8  *PCRE2_SPTR8;
+typedef const PCRE2_UCHAR16 *PCRE2_SPTR16;
+typedef const PCRE2_UCHAR32 *PCRE2_SPTR32;
+
+/* The PCRE2_SIZE type is used for all string lengths and offsets in PCRE2,
+including pattern offsets for errors and subject offsets after a match. We
+define special values to indicate zero-terminated strings and unset offsets in
+the offset vector (ovector). */
+
+#define PCRE2_SIZE            size_t
+#define PCRE2_SIZE_MAX        SIZE_MAX
+#define PCRE2_ZERO_TERMINATED (~(PCRE2_SIZE)0)
+#define PCRE2_UNSET           (~(PCRE2_SIZE)0)
+
+/* Generic types for opaque structures and JIT callback functions. These
+declarations are defined in a macro that is expanded for each width later. */
+
+#define PCRE2_TYPES_LIST \
+struct pcre2_real_general_context; \
+typedef struct pcre2_real_general_context pcre2_general_context; \
+\
+struct pcre2_real_compile_context; \
+typedef struct pcre2_real_compile_context pcre2_compile_context; \
+\
+struct pcre2_real_match_context; \
+typedef struct pcre2_real_match_context pcre2_match_context; \
+\
+struct pcre2_real_code; \
+typedef struct pcre2_real_code pcre2_code; \
+\
+struct pcre2_real_match_data; \
+typedef struct pcre2_real_match_data pcre2_match_data; \
+\
+struct pcre2_real_jit_stack; \
+typedef struct pcre2_real_jit_stack pcre2_jit_stack; \
+\
+typedef pcre2_jit_stack *(*pcre2_jit_callback)(void *);
+
+
+/* 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. Define the generic version in a macro; the width-specific
+versions are generated from this macro below. */
+
+#define PCRE2_STRUCTURE_LIST \
+typedef struct pcre2_callout_block { \
+  uint32_t      version;           /* Identifies version of block */ \
+  /* ------------------------ Version 0 ------------------------------- */ \
+  uint32_t      callout_number;    /* Number compiled into pattern */ \
+  uint32_t      capture_top;       /* Max current capture */ \
+  uint32_t      capture_last;      /* Most recently closed capture */ \
+  PCRE2_SIZE   *offset_vector;     /* The offset vector */ \
+  PCRE2_SPTR    mark;              /* Pointer to current mark or NULL */ \
+  PCRE2_SPTR    subject;           /* The subject being matched */ \
+  PCRE2_SIZE    subject_length;    /* The length of the subject */ \
+  PCRE2_SIZE    start_match;       /* Offset to start of this match attempt */ \
+  PCRE2_SIZE    current_position;  /* Where we currently are in the subject */ \
+  PCRE2_SIZE    pattern_position;  /* Offset to next item in the pattern */ \
+  PCRE2_SIZE    next_item_length;  /* Length of next item in the pattern */ \
+  /* ------------------- Added for Version 1 -------------------------- */ \
+  PCRE2_SIZE    callout_string_offset; /* Offset to string within pattern */ \
+  PCRE2_SIZE    callout_string_length; /* Length of string compiled into pattern */ \
+  PCRE2_SPTR    callout_string;    /* String compiled into pattern */ \
+  /* ------------------------------------------------------------------ */ \
+} pcre2_callout_block; \
+\
+typedef struct pcre2_callout_enumerate_block { \
+  uint32_t      version;           /* Identifies version of block */ \
+  /* ------------------------ Version 0 ------------------------------- */ \
+  PCRE2_SIZE    pattern_position;  /* Offset to next item in the pattern */ \
+  PCRE2_SIZE    next_item_length;  /* Length of next item in the pattern */ \
+  uint32_t      callout_number;    /* Number compiled into pattern */ \
+  PCRE2_SIZE    callout_string_offset; /* Offset to string within pattern */ \
+  PCRE2_SIZE    callout_string_length; /* Length of string compiled into pattern */ \
+  PCRE2_SPTR    callout_string;    /* String compiled into pattern */ \
+  /* ------------------------------------------------------------------ */ \
+} pcre2_callout_enumerate_block;
+
+
+/* List the generic forms of all other functions in macros, which will be
+expanded for each width below. Start with functions that give general
+information. */
+
+#define PCRE2_GENERAL_INFO_FUNCTIONS \
+PCRE2_EXP_DECL int       pcre2_config(uint32_t, void *);
+
+
+/* Functions for manipulating contexts. */
+
+#define PCRE2_GENERAL_CONTEXT_FUNCTIONS \
+PCRE2_EXP_DECL \
+  pcre2_general_context *pcre2_general_context_copy(pcre2_general_context *); \
+PCRE2_EXP_DECL \
+  pcre2_general_context *pcre2_general_context_create( \
+                           void *(*)(PCRE2_SIZE, void *), \
+                           void (*)(void *, void *), void *); \
+PCRE2_EXP_DECL void      pcre2_general_context_free(pcre2_general_context *);
+
+#define PCRE2_COMPILE_CONTEXT_FUNCTIONS \
+PCRE2_EXP_DECL \
+  pcre2_compile_context *pcre2_compile_context_copy(pcre2_compile_context *); \
+PCRE2_EXP_DECL \
+  pcre2_compile_context *pcre2_compile_context_create(pcre2_general_context *);\
+PCRE2_EXP_DECL void      pcre2_compile_context_free(pcre2_compile_context *); \
+PCRE2_EXP_DECL int       pcre2_set_bsr(pcre2_compile_context *, uint32_t); \
+PCRE2_EXP_DECL int       pcre2_set_character_tables(pcre2_compile_context *, \
+                           const unsigned char *); \
+PCRE2_EXP_DECL int       pcre2_set_max_pattern_length(pcre2_compile_context *, \
+                           PCRE2_SIZE); \
+PCRE2_EXP_DECL int       pcre2_set_newline(pcre2_compile_context *, uint32_t); \
+PCRE2_EXP_DECL int       pcre2_set_parens_nest_limit(pcre2_compile_context *, \
+                           uint32_t); \
+PCRE2_EXP_DECL int       pcre2_set_compile_recursion_guard(\
+                           pcre2_compile_context *, int (*)(uint32_t, void *), \
+                           void *);
+
+#define PCRE2_MATCH_CONTEXT_FUNCTIONS \
+PCRE2_EXP_DECL \
+  pcre2_match_context   *pcre2_match_context_copy(pcre2_match_context *); \
+PCRE2_EXP_DECL \
+  pcre2_match_context   *pcre2_match_context_create(pcre2_general_context *); \
+PCRE2_EXP_DECL void      pcre2_match_context_free(pcre2_match_context *); \
+PCRE2_EXP_DECL int       pcre2_set_callout(pcre2_match_context *, \
+                           int (*)(pcre2_callout_block *, void *), void *); \
+PCRE2_EXP_DECL int       pcre2_set_match_limit(pcre2_match_context *, \
+                           uint32_t); \
+PCRE2_EXP_DECL int       pcre2_set_offset_limit(pcre2_match_context *, \
+                           PCRE2_SIZE); \
+PCRE2_EXP_DECL int       pcre2_set_recursion_limit(pcre2_match_context *, \
+                           uint32_t); \
+PCRE2_EXP_DECL int       pcre2_set_recursion_memory_management( \
+                           pcre2_match_context *, void *(*)(PCRE2_SIZE, void *), \
+                           void (*)(void *, void *), void *);
+
+
+/* Functions concerned with compiling a pattern to PCRE internal code. */
+
+#define PCRE2_COMPILE_FUNCTIONS \
+PCRE2_EXP_DECL \
+  pcre2_code            *pcre2_compile(PCRE2_SPTR, PCRE2_SIZE, uint32_t, \
+                           int *, PCRE2_SIZE *, pcre2_compile_context *); \
+PCRE2_EXP_DECL void      pcre2_code_free(pcre2_code *);
+
+
+/* Functions that give information about a compiled pattern. */
+
+#define PCRE2_PATTERN_INFO_FUNCTIONS \
+PCRE2_EXP_DECL int       pcre2_pattern_info(const pcre2_code *, uint32_t, \
+                           void *); \
+PCRE2_EXP_DECL int       pcre2_callout_enumerate(const pcre2_code *, \
+                           int (*)(pcre2_callout_enumerate_block *, void *), \
+                           void *);
+
+
+/* Functions for running a match and inspecting the result. */
+
+#define PCRE2_MATCH_FUNCTIONS \
+PCRE2_EXP_DECL \
+  pcre2_match_data        *pcre2_match_data_create(uint32_t, \
+                             pcre2_general_context *); \
+PCRE2_EXP_DECL \
+  pcre2_match_data        *pcre2_match_data_create_from_pattern(\
+                             const pcre2_code *, \
+                             pcre2_general_context *); \
+PCRE2_EXP_DECL int         pcre2_dfa_match(const pcre2_code *, PCRE2_SPTR, \
+                             PCRE2_SIZE, PCRE2_SIZE, uint32_t, \
+                             pcre2_match_data *, pcre2_match_context *, int *, \
+                             PCRE2_SIZE); \
+PCRE2_EXP_DECL int         pcre2_match(const pcre2_code *, \
+                             PCRE2_SPTR, PCRE2_SIZE, PCRE2_SIZE, uint32_t, \
+                             pcre2_match_data *, pcre2_match_context *); \
+PCRE2_EXP_DECL void        pcre2_match_data_free(pcre2_match_data *); \
+PCRE2_EXP_DECL PCRE2_SPTR  pcre2_get_mark(pcre2_match_data *); \
+PCRE2_EXP_DECL uint32_t    pcre2_get_ovector_count(pcre2_match_data *); \
+PCRE2_EXP_DECL PCRE2_SIZE *pcre2_get_ovector_pointer(pcre2_match_data *); \
+PCRE2_EXP_DECL PCRE2_SIZE  pcre2_get_startchar(pcre2_match_data *);
+
+
+/* Convenience functions for handling matched substrings. */
+
+#define PCRE2_SUBSTRING_FUNCTIONS \
+PCRE2_EXP_DECL int       pcre2_substring_copy_byname(pcre2_match_data *, \
+                           PCRE2_SPTR, PCRE2_UCHAR *, PCRE2_SIZE *); \
+PCRE2_EXP_DECL int       pcre2_substring_copy_bynumber(pcre2_match_data *, \
+                           uint32_t, PCRE2_UCHAR *, PCRE2_SIZE *); \
+PCRE2_EXP_DECL void      pcre2_substring_free(PCRE2_UCHAR *); \
+PCRE2_EXP_DECL int       pcre2_substring_get_byname(pcre2_match_data *, \
+                           PCRE2_SPTR, PCRE2_UCHAR **, PCRE2_SIZE *); \
+PCRE2_EXP_DECL int       pcre2_substring_get_bynumber(pcre2_match_data *, \
+                           uint32_t, PCRE2_UCHAR **, PCRE2_SIZE *); \
+PCRE2_EXP_DECL int       pcre2_substring_length_byname(pcre2_match_data *, \
+                           PCRE2_SPTR, PCRE2_SIZE *); \
+PCRE2_EXP_DECL int       pcre2_substring_length_bynumber(pcre2_match_data *, \
+                           uint32_t, PCRE2_SIZE *); \
+PCRE2_EXP_DECL int       pcre2_substring_nametable_scan(const pcre2_code *, \
+                           PCRE2_SPTR, PCRE2_SPTR *, PCRE2_SPTR *); \
+PCRE2_EXP_DECL int       pcre2_substring_number_from_name(\
+                           const pcre2_code *, PCRE2_SPTR); \
+PCRE2_EXP_DECL void      pcre2_substring_list_free(PCRE2_SPTR *); \
+PCRE2_EXP_DECL int       pcre2_substring_list_get(pcre2_match_data *, \
+                           PCRE2_UCHAR ***, PCRE2_SIZE **);
+
+/* Functions for serializing / deserializing compiled patterns. */
+
+#define PCRE2_SERIALIZE_FUNCTIONS \
+PCRE2_EXP_DECL int32_t   pcre2_serialize_encode(const pcre2_code **, \
+                           int32_t, uint8_t **, PCRE2_SIZE *, \
+                           pcre2_general_context *); \
+PCRE2_EXP_DECL int32_t   pcre2_serialize_decode(pcre2_code **, int32_t, \
+                           const uint8_t *, pcre2_general_context *); \
+PCRE2_EXP_DECL int32_t   pcre2_serialize_get_number_of_codes(const uint8_t *); \
+PCRE2_EXP_DECL void      pcre2_serialize_free(uint8_t *);
+
+
+/* Convenience function for match + substitute. */
+
+#define PCRE2_SUBSTITUTE_FUNCTION \
+PCRE2_EXP_DECL int       pcre2_substitute(const pcre2_code *, \
+                           PCRE2_SPTR, PCRE2_SIZE, PCRE2_SIZE, uint32_t, \
+                           pcre2_match_data *, pcre2_match_context *, \
+                           PCRE2_SPTR, PCRE2_SIZE, PCRE2_UCHAR *, \
+                           PCRE2_SIZE *);
+
+
+/* Functions for JIT processing */
+
+#define PCRE2_JIT_FUNCTIONS \
+PCRE2_EXP_DECL int       pcre2_jit_compile(pcre2_code *, uint32_t); \
+PCRE2_EXP_DECL int       pcre2_jit_match(const pcre2_code *, \
+                           PCRE2_SPTR, PCRE2_SIZE, PCRE2_SIZE, uint32_t, \
+                           pcre2_match_data *, pcre2_match_context *); \
+PCRE2_EXP_DECL void      pcre2_jit_free_unused_memory(pcre2_general_context *); \
+PCRE2_EXP_DECL \
+  pcre2_jit_stack       *pcre2_jit_stack_create(PCRE2_SIZE, PCRE2_SIZE, \
+                           pcre2_general_context *); \
+PCRE2_EXP_DECL void      pcre2_jit_stack_assign(pcre2_match_context *, \
+                           pcre2_jit_callback, void *); \
+PCRE2_EXP_DECL void      pcre2_jit_stack_free(pcre2_jit_stack *);
+
+
+/* Other miscellaneous functions. */
+
+#define PCRE2_OTHER_FUNCTIONS \
+PCRE2_EXP_DECL int       pcre2_get_error_message(int, PCRE2_UCHAR *, PCRE2_SIZE); \
+PCRE2_EXP_DECL \
+  const uint8_t         *pcre2_maketables(pcre2_general_context *); \
+
+
+/* Define macros that generate width-specific names from generic versions. The
+three-level macro scheme is necessary to get the macros expanded when we want
+them to be. First we get the width from PCRE2_LOCAL_WIDTH, which is used for
+generating three versions of everything below. After that, PCRE2_SUFFIX will be
+re-defined to use PCRE2_CODE_UNIT_WIDTH, for use when macros such as
+pcre2_compile are called by application code. */
+
+#define PCRE2_JOIN(a,b) a ## b
+#define PCRE2_GLUE(a,b) PCRE2_JOIN(a,b)
+#define PCRE2_SUFFIX(a) PCRE2_GLUE(a,PCRE2_LOCAL_WIDTH)
+
+
+/* Data types */
+
+#define PCRE2_UCHAR                 PCRE2_SUFFIX(PCRE2_UCHAR)
+#define PCRE2_SPTR                  PCRE2_SUFFIX(PCRE2_SPTR)
+
+#define pcre2_code                  PCRE2_SUFFIX(pcre2_code_)
+#define pcre2_jit_callback          PCRE2_SUFFIX(pcre2_jit_callback_)
+#define pcre2_jit_stack             PCRE2_SUFFIX(pcre2_jit_stack_)
+
+#define pcre2_real_code             PCRE2_SUFFIX(pcre2_real_code_)
+#define pcre2_real_general_context  PCRE2_SUFFIX(pcre2_real_general_context_)
+#define pcre2_real_compile_context  PCRE2_SUFFIX(pcre2_real_compile_context_)
+#define pcre2_real_match_context    PCRE2_SUFFIX(pcre2_real_match_context_)
+#define pcre2_real_jit_stack        PCRE2_SUFFIX(pcre2_real_jit_stack_)
+#define pcre2_real_match_data       PCRE2_SUFFIX(pcre2_real_match_data_)
+
+
+/* Data blocks */
+
+#define pcre2_callout_block            PCRE2_SUFFIX(pcre2_callout_block_)
+#define pcre2_callout_enumerate_block  PCRE2_SUFFIX(pcre2_callout_enumerate_block_)
+#define pcre2_general_context          PCRE2_SUFFIX(pcre2_general_context_)
+#define pcre2_compile_context          PCRE2_SUFFIX(pcre2_compile_context_)
+#define pcre2_match_context            PCRE2_SUFFIX(pcre2_match_context_)
+#define pcre2_match_data               PCRE2_SUFFIX(pcre2_match_data_)
+
+
+/* Functions: the complete list in alphabetical order */
+
+#define pcre2_callout_enumerate               PCRE2_SUFFIX(pcre2_callout_enumerate_)
+#define pcre2_code_free                       PCRE2_SUFFIX(pcre2_code_free_)
+#define pcre2_compile                         PCRE2_SUFFIX(pcre2_compile_)
+#define pcre2_compile_context_copy            PCRE2_SUFFIX(pcre2_compile_context_copy_)
+#define pcre2_compile_context_create          PCRE2_SUFFIX(pcre2_compile_context_create_)
+#define pcre2_compile_context_free            PCRE2_SUFFIX(pcre2_compile_context_free_)
+#define pcre2_config                          PCRE2_SUFFIX(pcre2_config_)
+#define pcre2_dfa_match                       PCRE2_SUFFIX(pcre2_dfa_match_)
+#define pcre2_general_context_copy            PCRE2_SUFFIX(pcre2_general_context_copy_)
+#define pcre2_general_context_create          PCRE2_SUFFIX(pcre2_general_context_create_)
+#define pcre2_general_context_free            PCRE2_SUFFIX(pcre2_general_context_free_)
+#define pcre2_get_error_message               PCRE2_SUFFIX(pcre2_get_error_message_)
+#define pcre2_get_mark                        PCRE2_SUFFIX(pcre2_get_mark_)
+#define pcre2_get_ovector_pointer             PCRE2_SUFFIX(pcre2_get_ovector_pointer_)
+#define pcre2_get_ovector_count               PCRE2_SUFFIX(pcre2_get_ovector_count_)
+#define pcre2_get_startchar                   PCRE2_SUFFIX(pcre2_get_startchar_)
+#define pcre2_jit_compile                     PCRE2_SUFFIX(pcre2_jit_compile_)
+#define pcre2_jit_match                       PCRE2_SUFFIX(pcre2_jit_match_)
+#define pcre2_jit_free_unused_memory          PCRE2_SUFFIX(pcre2_jit_free_unused_memory_)
+#define pcre2_jit_stack_assign                PCRE2_SUFFIX(pcre2_jit_stack_assign_)
+#define pcre2_jit_stack_create                PCRE2_SUFFIX(pcre2_jit_stack_create_)
+#define pcre2_jit_stack_free                  PCRE2_SUFFIX(pcre2_jit_stack_free_)
+#define pcre2_maketables                      PCRE2_SUFFIX(pcre2_maketables_)
+#define pcre2_match                           PCRE2_SUFFIX(pcre2_match_)
+#define pcre2_match_context_copy              PCRE2_SUFFIX(pcre2_match_context_copy_)
+#define pcre2_match_context_create            PCRE2_SUFFIX(pcre2_match_context_create_)
+#define pcre2_match_context_free              PCRE2_SUFFIX(pcre2_match_context_free_)
+#define pcre2_match_data_create               PCRE2_SUFFIX(pcre2_match_data_create_)
+#define pcre2_match_data_create_from_pattern  PCRE2_SUFFIX(pcre2_match_data_create_from_pattern_)
+#define pcre2_match_data_free                 PCRE2_SUFFIX(pcre2_match_data_free_)
+#define pcre2_pattern_info                    PCRE2_SUFFIX(pcre2_pattern_info_)
+#define pcre2_serialize_decode                PCRE2_SUFFIX(pcre2_serialize_decode_)
+#define pcre2_serialize_encode                PCRE2_SUFFIX(pcre2_serialize_encode_)
+#define pcre2_serialize_free                  PCRE2_SUFFIX(pcre2_serialize_free_)
+#define pcre2_serialize_get_number_of_codes   PCRE2_SUFFIX(pcre2_serialize_get_number_of_codes_)
+#define pcre2_set_bsr                         PCRE2_SUFFIX(pcre2_set_bsr_)
+#define pcre2_set_callout                     PCRE2_SUFFIX(pcre2_set_callout_)
+#define pcre2_set_character_tables            PCRE2_SUFFIX(pcre2_set_character_tables_)
+#define pcre2_set_compile_recursion_guard     PCRE2_SUFFIX(pcre2_set_compile_recursion_guard_)
+#define pcre2_set_match_limit                 PCRE2_SUFFIX(pcre2_set_match_limit_)
+#define pcre2_set_max_pattern_length          PCRE2_SUFFIX(pcre2_set_max_pattern_length_)
+#define pcre2_set_newline                     PCRE2_SUFFIX(pcre2_set_newline_)
+#define pcre2_set_parens_nest_limit           PCRE2_SUFFIX(pcre2_set_parens_nest_limit_)
+#define pcre2_set_offset_limit                PCRE2_SUFFIX(pcre2_set_offset_limit_)
+#define pcre2_set_recursion_limit             PCRE2_SUFFIX(pcre2_set_recursion_limit_)
+#define pcre2_set_recursion_memory_management PCRE2_SUFFIX(pcre2_set_recursion_memory_management_)
+#define pcre2_substitute                      PCRE2_SUFFIX(pcre2_substitute_)
+#define pcre2_substring_copy_byname           PCRE2_SUFFIX(pcre2_substring_copy_byname_)
+#define pcre2_substring_copy_bynumber         PCRE2_SUFFIX(pcre2_substring_copy_bynumber_)
+#define pcre2_substring_free                  PCRE2_SUFFIX(pcre2_substring_free_)
+#define pcre2_substring_get_byname            PCRE2_SUFFIX(pcre2_substring_get_byname_)
+#define pcre2_substring_get_bynumber          PCRE2_SUFFIX(pcre2_substring_get_bynumber_)
+#define pcre2_substring_length_byname         PCRE2_SUFFIX(pcre2_substring_length_byname_)
+#define pcre2_substring_length_bynumber       PCRE2_SUFFIX(pcre2_substring_length_bynumber_)
+#define pcre2_substring_list_get              PCRE2_SUFFIX(pcre2_substring_list_get_)
+#define pcre2_substring_list_free             PCRE2_SUFFIX(pcre2_substring_list_free_)
+#define pcre2_substring_nametable_scan        PCRE2_SUFFIX(pcre2_substring_nametable_scan_)
+#define pcre2_substring_number_from_name      PCRE2_SUFFIX(pcre2_substring_number_from_name_)
+
+
+/* Now generate all three sets of width-specific structures and function
+prototypes. */
+
+#define PCRE2_TYPES_STRUCTURES_AND_FUNCTIONS \
+PCRE2_TYPES_LIST \
+PCRE2_STRUCTURE_LIST \
+PCRE2_GENERAL_INFO_FUNCTIONS \
+PCRE2_GENERAL_CONTEXT_FUNCTIONS \
+PCRE2_COMPILE_CONTEXT_FUNCTIONS \
+PCRE2_MATCH_CONTEXT_FUNCTIONS \
+PCRE2_COMPILE_FUNCTIONS \
+PCRE2_PATTERN_INFO_FUNCTIONS \
+PCRE2_MATCH_FUNCTIONS \
+PCRE2_SUBSTRING_FUNCTIONS \
+PCRE2_SERIALIZE_FUNCTIONS \
+PCRE2_SUBSTITUTE_FUNCTION \
+PCRE2_JIT_FUNCTIONS \
+PCRE2_OTHER_FUNCTIONS
+
+#define PCRE2_LOCAL_WIDTH 8
+PCRE2_TYPES_STRUCTURES_AND_FUNCTIONS
+#undef PCRE2_LOCAL_WIDTH
+
+#define PCRE2_LOCAL_WIDTH 16
+PCRE2_TYPES_STRUCTURES_AND_FUNCTIONS
+#undef PCRE2_LOCAL_WIDTH
+
+#define PCRE2_LOCAL_WIDTH 32
+PCRE2_TYPES_STRUCTURES_AND_FUNCTIONS
+#undef PCRE2_LOCAL_WIDTH
+
+/* Undefine the list macros; they are no longer needed. */
+
+#undef PCRE2_TYPES_LIST
+#undef PCRE2_STRUCTURE_LIST
+#undef PCRE2_GENERAL_INFO_FUNCTIONS
+#undef PCRE2_GENERAL_CONTEXT_FUNCTIONS
+#undef PCRE2_COMPILE_CONTEXT_FUNCTIONS
+#undef PCRE2_MATCH_CONTEXT_FUNCTIONS
+#undef PCRE2_COMPILE_FUNCTIONS
+#undef PCRE2_PATTERN_INFO_FUNCTIONS
+#undef PCRE2_MATCH_FUNCTIONS
+#undef PCRE2_SUBSTRING_FUNCTIONS
+#undef PCRE2_SERIALIZE_FUNCTIONS
+#undef PCRE2_SUBSTITUTE_FUNCTION
+#undef PCRE2_JIT_FUNCTIONS
+#undef PCRE2_OTHER_FUNCTIONS
+#undef PCRE2_TYPES_STRUCTURES_AND_FUNCTIONS
+
+/* PCRE2_CODE_UNIT_WIDTH must be defined. If it is 8, 16, or 32, redefine
+PCRE2_SUFFIX to use it. If it is 0, undefine the other macros and make
+PCRE2_SUFFIX a no-op. Otherwise, generate an error. */
+
+#undef PCRE2_SUFFIX
+#ifndef PCRE2_CODE_UNIT_WIDTH
+#error PCRE2_CODE_UNIT_WIDTH must be defined before including pcre2.h.
+#error Use 8, 16, or 32; or 0 for a multi-width application.
+#else  /* PCRE2_CODE_UNIT_WIDTH is defined */
+#if PCRE2_CODE_UNIT_WIDTH == 8 || \
+    PCRE2_CODE_UNIT_WIDTH == 16 || \
+    PCRE2_CODE_UNIT_WIDTH == 32
+#define PCRE2_SUFFIX(a) PCRE2_GLUE(a, PCRE2_CODE_UNIT_WIDTH)
+#elif PCRE2_CODE_UNIT_WIDTH == 0
+#undef PCRE2_JOIN
+#undef PCRE2_GLUE
+#define PCRE2_SUFFIX(a) a
+#else
+#error PCRE2_CODE_UNIT_WIDTH must be 0, 8, 16, or 32.
+#endif
+#endif  /* PCRE2_CODE_UNIT_WIDTH is defined */
+
+#ifdef __cplusplus
+}  /* extern "C" */
+#endif
+
+#endif /* End of pcre2.h */
diff --git a/dist2/src/pcre2_auto_possess.c b/dist2/src/pcre2_auto_possess.c
new file mode 100644
index 0000000..d4d2334
--- /dev/null
+++ b/dist2/src/pcre2_auto_possess.c
@@ -0,0 +1,1287 @@
+/*************************************************
+*      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
+     Original API code Copyright (c) 1997-2012 University of Cambridge
+         New API code Copyright (c) 2016 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 functions that scan a compiled pattern and change
+repeats into possessive repeats where possible. */
+
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+
+#include "pcre2_internal.h"
+
+
+/*************************************************
+*        Tables for auto-possessification        *
+*************************************************/
+
+/* This table is used to check whether auto-possessification is possible
+between adjacent character-type opcodes. The left-hand (repeated) opcode is
+used to select the row, and the right-hand opcode is use to select the column.
+A value of 1 means that auto-possessification is OK. For example, the second
+value in the first row means that \D+\d can be turned into \D++\d.
+
+The Unicode property types (\P and \p) have to be present to fill out the table
+because of what their opcode values are, but the table values should always be
+zero because property types are handled separately in the code. The last four
+columns apply to items that cannot be repeated, so there is no need to have
+rows for them. Note that OP_DIGIT etc. are generated only when PCRE_UCP is
+*not* set. When it is set, \d etc. are converted into OP_(NOT_)PROP codes. */
+
+#define APTROWS (LAST_AUTOTAB_LEFT_OP - FIRST_AUTOTAB_OP + 1)
+#define APTCOLS (LAST_AUTOTAB_RIGHT_OP - FIRST_AUTOTAB_OP + 1)
+
+static const uint8_t autoposstab[APTROWS][APTCOLS] = {
+/* \D \d \S \s \W \w  . .+ \C \P \p \R \H \h \V \v \X \Z \z  $ $M */
+  { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 },  /* \D */
+  { 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1 },  /* \d */
+  { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1 },  /* \S */
+  { 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 },  /* \s */
+  { 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 },  /* \W */
+  { 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1 },  /* \w */
+  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0 },  /* .  */
+  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 },  /* .+ */
+  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 },  /* \C */
+  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },  /* \P */
+  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },  /* \p */
+  { 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0 },  /* \R */
+  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0 },  /* \H */
+  { 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0 },  /* \h */
+  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0 },  /* \V */
+  { 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0 },  /* \v */
+  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 }   /* \X */
+};
+
+/* This table is used to check whether auto-possessification is possible
+between adjacent Unicode property opcodes (OP_PROP and OP_NOTPROP). The
+left-hand (repeated) opcode is used to select the row, and the right-hand
+opcode is used to select the column. The values are as follows:
+
+  0   Always return FALSE (never auto-possessify)
+  1   Character groups are distinct (possessify if both are OP_PROP)
+  2   Check character categories in the same group (general or particular)
+  3   TRUE if the two opcodes are not the same (PROP vs NOTPROP)
+
+  4   Check left general category vs right particular category
+  5   Check right general category vs left particular category
+
+  6   Left alphanum vs right general category
+  7   Left space vs right general category
+  8   Left word vs right general category
+
+  9   Right alphanum vs left general category
+ 10   Right space vs left general category
+ 11   Right word vs left general category
+
+ 12   Left alphanum vs right particular category
+ 13   Left space vs right particular category
+ 14   Left word vs right particular category
+
+ 15   Right alphanum vs left particular category
+ 16   Right space vs left particular category
+ 17   Right word vs left particular category
+*/
+
+static const uint8_t propposstab[PT_TABSIZE][PT_TABSIZE] = {
+/* ANY LAMP GC  PC  SC ALNUM SPACE PXSPACE WORD CLIST UCNC */
+  { 0,  0,  0,  0,  0,    0,    0,      0,   0,    0,   0 },  /* PT_ANY */
+  { 0,  3,  0,  0,  0,    3,    1,      1,   0,    0,   0 },  /* PT_LAMP */
+  { 0,  0,  2,  4,  0,    9,   10,     10,  11,    0,   0 },  /* PT_GC */
+  { 0,  0,  5,  2,  0,   15,   16,     16,  17,    0,   0 },  /* PT_PC */
+  { 0,  0,  0,  0,  2,    0,    0,      0,   0,    0,   0 },  /* PT_SC */
+  { 0,  3,  6, 12,  0,    3,    1,      1,   0,    0,   0 },  /* PT_ALNUM */
+  { 0,  1,  7, 13,  0,    1,    3,      3,   1,    0,   0 },  /* PT_SPACE */
+  { 0,  1,  7, 13,  0,    1,    3,      3,   1,    0,   0 },  /* PT_PXSPACE */
+  { 0,  0,  8, 14,  0,    0,    1,      1,   3,    0,   0 },  /* PT_WORD */
+  { 0,  0,  0,  0,  0,    0,    0,      0,   0,    0,   0 },  /* PT_CLIST */
+  { 0,  0,  0,  0,  0,    0,    0,      0,   0,    0,   3 }   /* PT_UCNC */
+};
+
+/* This table is used to check whether auto-possessification is possible
+between adjacent Unicode property opcodes (OP_PROP and OP_NOTPROP) when one
+specifies a general category and the other specifies a particular category. The
+row is selected by the general category and the column by the particular
+category. The value is 1 if the particular category is not part of the general
+category. */
+
+static const uint8_t catposstab[7][30] = {
+/* Cc Cf Cn Co Cs Ll Lm Lo Lt Lu Mc Me Mn Nd Nl No Pc Pd Pe Pf Pi Po Ps Sc Sk Sm So Zl Zp Zs */
+  { 0, 0, 0, 0, 0, 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 },  /* C */
+  { 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },  /* L */
+  { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },  /* M */
+  { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },  /* N */
+  { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1 },  /* P */
+  { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1 },  /* S */
+  { 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, 0, 0, 0 }   /* Z */
+};
+
+/* This table is used when checking ALNUM, (PX)SPACE, SPACE, and WORD against
+a general or particular category. The properties in each row are those
+that apply to the character set in question. Duplication means that a little
+unnecessary work is done when checking, but this keeps things much simpler
+because they can all use the same code. For more details see the comment where
+this table is used.
+
+Note: SPACE and PXSPACE used to be different because Perl excluded VT from
+"space", but from Perl 5.18 it's included, so both categories are treated the
+same here. */
+
+static const uint8_t posspropstab[3][4] = {
+  { ucp_L, ucp_N, ucp_N, ucp_Nl },  /* ALNUM, 3rd and 4th values redundant */
+  { ucp_Z, ucp_Z, ucp_C, ucp_Cc },  /* SPACE and PXSPACE, 2nd value redundant */
+  { ucp_L, ucp_N, ucp_P, ucp_Po }   /* WORD */
+};
+
+
+
+#ifdef SUPPORT_UNICODE
+/*************************************************
+*        Check a character and a property        *
+*************************************************/
+
+/* This function is called by compare_opcodes() when a property item is
+adjacent to a fixed character.
+
+Arguments:
+  c            the character
+  ptype        the property type
+  pdata        the data for the type
+  negated      TRUE if it's a negated property (\P or \p{^)
+
+Returns:       TRUE if auto-possessifying is OK
+*/
+
+static BOOL
+check_char_prop(uint32_t c, unsigned int ptype, unsigned int pdata,
+  BOOL negated)
+{
+const uint32_t *p;
+const ucd_record *prop = GET_UCD(c);
+
+switch(ptype)
+  {
+  case PT_LAMP:
+  return (prop->chartype == ucp_Lu ||
+          prop->chartype == ucp_Ll ||
+          prop->chartype == ucp_Lt) == negated;
+
+  case PT_GC:
+  return (pdata == PRIV(ucp_gentype)[prop->chartype]) == negated;
+
+  case PT_PC:
+  return (pdata == prop->chartype) == negated;
+
+  case PT_SC:
+  return (pdata == prop->script) == negated;
+
+  /* These are specials */
+
+  case PT_ALNUM:
+  return (PRIV(ucp_gentype)[prop->chartype] == ucp_L ||
+          PRIV(ucp_gentype)[prop->chartype] == ucp_N) == negated;
+
+  /* Perl space used to exclude VT, but from Perl 5.18 it is included, which
+  means that Perl space and POSIX space are now identical. PCRE was changed
+  at release 8.34. */
+
+  case PT_SPACE:    /* Perl space */
+  case PT_PXSPACE:  /* POSIX space */
+  switch(c)
+    {
+    HSPACE_CASES:
+    VSPACE_CASES:
+    return negated;
+
+    default:
+    return (PRIV(ucp_gentype)[prop->chartype] == ucp_Z) == negated;
+    }
+  break;  /* Control never reaches here */
+
+  case PT_WORD:
+  return (PRIV(ucp_gentype)[prop->chartype] == ucp_L ||
+          PRIV(ucp_gentype)[prop->chartype] == ucp_N ||
+          c == CHAR_UNDERSCORE) == negated;
+
+  case PT_CLIST:
+  p = PRIV(ucd_caseless_sets) + prop->caseset;
+  for (;;)
+    {
+    if (c < *p) return !negated;
+    if (c == *p++) return negated;
+    }
+  break;  /* Control never reaches here */
+  }
+
+return FALSE;
+}
+#endif  /* SUPPORT_UNICODE */
+
+
+
+/*************************************************
+*        Base opcode of repeated opcodes         *
+*************************************************/
+
+/* Returns the base opcode for repeated single character type opcodes. If the
+opcode is not a repeated character type, it returns with the original value.
+
+Arguments:  c opcode
+Returns:    base opcode for the type
+*/
+
+static PCRE2_UCHAR
+get_repeat_base(PCRE2_UCHAR c)
+{
+return (c > OP_TYPEPOSUPTO)? c :
+       (c >= OP_TYPESTAR)?   OP_TYPESTAR :
+       (c >= OP_NOTSTARI)?   OP_NOTSTARI :
+       (c >= OP_NOTSTAR)?    OP_NOTSTAR :
+       (c >= OP_STARI)?      OP_STARI :
+                             OP_STAR;
+}
+
+
+/*************************************************
+*        Fill the character property list        *
+*************************************************/
+
+/* Checks whether the code points to an opcode that can take part in auto-
+possessification, and if so, fills a list with its properties.
+
+Arguments:
+  code        points to start of expression
+  utf         TRUE if in UTF mode
+  fcc         points to the case-flipping table
+  list        points to output list
+              list[0] will be filled with the opcode
+              list[1] will be non-zero if this opcode
+                can match an empty character string
+              list[2..7] depends on the opcode
+
+Returns:      points to the start of the next opcode if *code is accepted
+              NULL if *code is not accepted
+*/
+
+static PCRE2_SPTR
+get_chr_property_list(PCRE2_SPTR code, BOOL utf, const uint8_t *fcc,
+  uint32_t *list)
+{
+PCRE2_UCHAR c = *code;
+PCRE2_UCHAR base;
+PCRE2_SPTR end;
+uint32_t chr;
+
+#ifdef SUPPORT_UNICODE
+uint32_t *clist_dest;
+const uint32_t *clist_src;
+#else
+(void)utf;    /* Suppress "unused parameter" compiler warning */
+#endif
+
+list[0] = c;
+list[1] = FALSE;
+code++;
+
+if (c >= OP_STAR && c <= OP_TYPEPOSUPTO)
+  {
+  base = get_repeat_base(c);
+  c -= (base - OP_STAR);
+
+  if (c == OP_UPTO || c == OP_MINUPTO || c == OP_EXACT || c == OP_POSUPTO)
+    code += IMM2_SIZE;
+
+  list[1] = (c != OP_PLUS && c != OP_MINPLUS && c != OP_EXACT &&
+             c != OP_POSPLUS);
+
+  switch(base)
+    {
+    case OP_STAR:
+    list[0] = OP_CHAR;
+    break;
+
+    case OP_STARI:
+    list[0] = OP_CHARI;
+    break;
+
+    case OP_NOTSTAR:
+    list[0] = OP_NOT;
+    break;
+
+    case OP_NOTSTARI:
+    list[0] = OP_NOTI;
+    break;
+
+    case OP_TYPESTAR:
+    list[0] = *code;
+    code++;
+    break;
+    }
+  c = list[0];
+  }
+
+switch(c)
+  {
+  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_ALLANY:
+  case OP_ANYNL:
+  case OP_NOT_HSPACE:
+  case OP_HSPACE:
+  case OP_NOT_VSPACE:
+  case OP_VSPACE:
+  case OP_EXTUNI:
+  case OP_EODN:
+  case OP_EOD:
+  case OP_DOLL:
+  case OP_DOLLM:
+  return code;
+
+  case OP_CHAR:
+  case OP_NOT:
+  GETCHARINCTEST(chr, code);
+  list[2] = chr;
+  list[3] = NOTACHAR;
+  return code;
+
+  case OP_CHARI:
+  case OP_NOTI:
+  list[0] = (c == OP_CHARI) ? OP_CHAR : OP_NOT;
+  GETCHARINCTEST(chr, code);
+  list[2] = chr;
+
+#ifdef SUPPORT_UNICODE
+  if (chr < 128 || (chr < 256 && !utf))
+    list[3] = fcc[chr];
+  else
+    list[3] = UCD_OTHERCASE(chr);
+#elif defined SUPPORT_WIDE_CHARS
+  list[3] = (chr < 256) ? fcc[chr] : chr;
+#else
+  list[3] = fcc[chr];
+#endif
+
+  /* The othercase might be the same value. */
+
+  if (chr == list[3])
+    list[3] = NOTACHAR;
+  else
+    list[4] = NOTACHAR;
+  return code;
+
+#ifdef SUPPORT_UNICODE
+  case OP_PROP:
+  case OP_NOTPROP:
+  if (code[0] != PT_CLIST)
+    {
+    list[2] = code[0];
+    list[3] = code[1];
+    return code + 2;
+    }
+
+  /* Convert only if we have enough space. */
+
+  clist_src = PRIV(ucd_caseless_sets) + code[1];
+  clist_dest = list + 2;
+  code += 2;
+
+  do {
+     if (clist_dest >= list + 8)
+       {
+       /* Early return if there is not enough space. This should never
+       happen, since all clists are shorter than 5 character now. */
+       list[2] = code[0];
+       list[3] = code[1];
+       return code;
+       }
+     *clist_dest++ = *clist_src;
+     }
+  while(*clist_src++ != NOTACHAR);
+
+  /* All characters are stored. The terminating NOTACHAR is copied from the
+  clist itself. */
+
+  list[0] = (c == OP_PROP) ? OP_CHAR : OP_NOT;
+  return code;
+#endif
+
+  case OP_NCLASS:
+  case OP_CLASS:
+#ifdef SUPPORT_WIDE_CHARS
+  case OP_XCLASS:
+  if (c == OP_XCLASS)
+    end = code + GET(code, 0) - 1;
+  else
+#endif
+    end = code + 32 / sizeof(PCRE2_UCHAR);
+
+  switch(*end)
+    {
+    case OP_CRSTAR:
+    case OP_CRMINSTAR:
+    case OP_CRQUERY:
+    case OP_CRMINQUERY:
+    case OP_CRPOSSTAR:
+    case OP_CRPOSQUERY:
+    list[1] = TRUE;
+    end++;
+    break;
+
+    case OP_CRPLUS:
+    case OP_CRMINPLUS:
+    case OP_CRPOSPLUS:
+    end++;
+    break;
+
+    case OP_CRRANGE:
+    case OP_CRMINRANGE:
+    case OP_CRPOSRANGE:
+    list[1] = (GET2(end, 1) == 0);
+    end += 1 + 2 * IMM2_SIZE;
+    break;
+    }
+  list[2] = (uint32_t)(end - code);
+  return end;
+  }
+return NULL;    /* Opcode not accepted */
+}
+
+
+
+/*************************************************
+*    Scan further character sets for match       *
+*************************************************/
+
+/* Checks whether the base and the current opcode have a common character, in
+which case the base cannot be possessified.
+
+Arguments:
+  code        points to the byte code
+  utf         TRUE in UTF mode
+  cb          compile data block
+  base_list   the data list of the base opcode
+  base_end    the end of the data list
+  rec_limit   points to recursion depth counter
+
+Returns:      TRUE if the auto-possessification is possible
+*/
+
+static BOOL
+compare_opcodes(PCRE2_SPTR code, BOOL utf, const compile_block *cb,
+  const uint32_t *base_list, PCRE2_SPTR base_end, int *rec_limit)
+{
+PCRE2_UCHAR c;
+uint32_t list[8];
+const uint32_t *chr_ptr;
+const uint32_t *ochr_ptr;
+const uint32_t *list_ptr;
+PCRE2_SPTR next_code;
+#ifdef SUPPORT_WIDE_CHARS
+PCRE2_SPTR xclass_flags;
+#endif
+const uint8_t *class_bitset;
+const uint8_t *set1, *set2, *set_end;
+uint32_t chr;
+BOOL accepted, invert_bits;
+BOOL entered_a_group = FALSE;
+
+if (--(*rec_limit) <= 0) return FALSE;  /* Recursion has gone too deep */
+
+/* Note: the base_list[1] contains whether the current opcode has a greedy
+(represented by a non-zero value) quantifier. This is a different from
+other character type lists, which store here that the character iterator
+matches to an empty string (also represented by a non-zero value). */
+
+for(;;)
+  {
+  /* All operations move the code pointer forward.
+  Therefore infinite recursions are not possible. */
+
+  c = *code;
+
+  /* Skip over callouts */
+
+  if (c == OP_CALLOUT)
+    {
+    code += PRIV(OP_lengths)[c];
+    continue;
+    }
+
+  if (c == OP_CALLOUT_STR)
+    {
+    code += GET(code, 1 + 2*LINK_SIZE);
+    continue;
+    }
+
+  if (c == OP_ALT)
+    {
+    do code += GET(code, 1); while (*code == OP_ALT);
+    c = *code;
+    }
+
+  switch(c)
+    {
+    case OP_END:
+    case OP_KETRPOS:
+    /* TRUE only in greedy case. The non-greedy case could be replaced by
+    an OP_EXACT, but it is probably not worth it. (And note that OP_EXACT
+    uses more memory, which we cannot get at this stage.) */
+
+    return base_list[1] != 0;
+
+    case OP_KET:
+    /* If the bracket is capturing, and referenced by an OP_RECURSE, or
+    it is an atomic sub-pattern (assert, once, etc.) the non-greedy case
+    cannot be converted to a possessive form. */
+
+    if (base_list[1] == 0) return FALSE;
+
+    switch(*(code - GET(code, 1)))
+      {
+      case OP_ASSERT:
+      case OP_ASSERT_NOT:
+      case OP_ASSERTBACK:
+      case OP_ASSERTBACK_NOT:
+      case OP_ONCE:
+      case OP_ONCE_NC:
+      /* Atomic sub-patterns and assertions can always auto-possessify their
+      last iterator. However, if the group was entered as a result of checking
+      a previous iterator, this is not possible. */
+
+      return !entered_a_group;
+      }
+
+    code += PRIV(OP_lengths)[c];
+    continue;
+
+    case OP_ONCE:
+    case OP_ONCE_NC:
+    case OP_BRA:
+    case OP_CBRA:
+    next_code = code + GET(code, 1);
+    code += PRIV(OP_lengths)[c];
+
+    while (*next_code == OP_ALT)
+      {
+      if (!compare_opcodes(code, utf, cb, base_list, base_end, rec_limit))
+        return FALSE;
+      code = next_code + 1 + LINK_SIZE;
+      next_code += GET(next_code, 1);
+      }
+
+    entered_a_group = TRUE;
+    continue;
+
+    case OP_BRAZERO:
+    case OP_BRAMINZERO:
+
+    next_code = code + 1;
+    if (*next_code != OP_BRA && *next_code != OP_CBRA
+        && *next_code != OP_ONCE && *next_code != OP_ONCE_NC) return FALSE;
+
+    do next_code += GET(next_code, 1); while (*next_code == OP_ALT);
+
+    /* The bracket content will be checked by the OP_BRA/OP_CBRA case above. */
+
+    next_code += 1 + LINK_SIZE;
+    if (!compare_opcodes(next_code, utf, cb, base_list, base_end, rec_limit))
+      return FALSE;
+
+    code += PRIV(OP_lengths)[c];
+    continue;
+
+    default:
+    break;
+    }
+
+  /* Check for a supported opcode, and load its properties. */
+
+  code = get_chr_property_list(code, utf, cb->fcc, list);
+  if (code == NULL) return FALSE;    /* Unsupported */
+
+  /* If either opcode is a small character list, set pointers for comparing
+  characters from that list with another list, or with a property. */
+
+  if (base_list[0] == OP_CHAR)
+    {
+    chr_ptr = base_list + 2;
+    list_ptr = list;
+    }
+  else if (list[0] == OP_CHAR)
+    {
+    chr_ptr = list + 2;
+    list_ptr = base_list;
+    }
+
+  /* Character bitsets can also be compared to certain opcodes. */
+
+  else if (base_list[0] == OP_CLASS || list[0] == OP_CLASS
+#if PCRE2_CODE_UNIT_WIDTH == 8
+      /* In 8 bit, non-UTF mode, OP_CLASS and OP_NCLASS are the same. */
+      || (!utf && (base_list[0] == OP_NCLASS || list[0] == OP_NCLASS))
+#endif
+      )
+    {
+#if PCRE2_CODE_UNIT_WIDTH == 8
+    if (base_list[0] == OP_CLASS || (!utf && base_list[0] == OP_NCLASS))
+#else
+    if (base_list[0] == OP_CLASS)
+#endif
+      {
+      set1 = (uint8_t *)(base_end - base_list[2]);
+      list_ptr = list;
+      }
+    else
+      {
+      set1 = (uint8_t *)(code - list[2]);
+      list_ptr = base_list;
+      }
+
+    invert_bits = FALSE;
+    switch(list_ptr[0])
+      {
+      case OP_CLASS:
+      case OP_NCLASS:
+      set2 = (uint8_t *)
+        ((list_ptr == list ? code : base_end) - list_ptr[2]);
+      break;
+
+#ifdef SUPPORT_WIDE_CHARS
+      case OP_XCLASS:
+      xclass_flags = (list_ptr == list ? code : base_end) - list_ptr[2] + LINK_SIZE;
+      if ((*xclass_flags & XCL_HASPROP) != 0) return FALSE;
+      if ((*xclass_flags & XCL_MAP) == 0)
+        {
+        /* No bits are set for characters < 256. */
+        if (list[1] == 0) return TRUE;
+        /* Might be an empty repeat. */
+        continue;
+        }
+      set2 = (uint8_t *)(xclass_flags + 1);
+      break;
+#endif
+
+      case OP_NOT_DIGIT:
+      invert_bits = TRUE;
+      /* Fall through */
+      case OP_DIGIT:
+      set2 = (uint8_t *)(cb->cbits + cbit_digit);
+      break;
+
+      case OP_NOT_WHITESPACE:
+      invert_bits = TRUE;
+      /* Fall through */
+      case OP_WHITESPACE:
+      set2 = (uint8_t *)(cb->cbits + cbit_space);
+      break;
+
+      case OP_NOT_WORDCHAR:
+      invert_bits = TRUE;
+      /* Fall through */
+      case OP_WORDCHAR:
+      set2 = (uint8_t *)(cb->cbits + cbit_word);
+      break;
+
+      default:
+      return FALSE;
+      }
+
+    /* Because the bit sets are unaligned bytes, we need to perform byte
+    comparison here. */
+
+    set_end = set1 + 32;
+    if (invert_bits)
+      {
+      do
+        {
+        if ((*set1++ & ~(*set2++)) != 0) return FALSE;
+        }
+      while (set1 < set_end);
+      }
+    else
+      {
+      do
+        {
+        if ((*set1++ & *set2++) != 0) return FALSE;
+        }
+      while (set1 < set_end);
+      }
+
+    if (list[1] == 0) return TRUE;
+    /* Might be an empty repeat. */
+    continue;
+    }
+
+  /* Some property combinations also acceptable. Unicode property opcodes are
+  processed specially; the rest can be handled with a lookup table. */
+
+  else
+    {
+    uint32_t leftop, rightop;
+
+    leftop = base_list[0];
+    rightop = list[0];
+
+#ifdef SUPPORT_UNICODE
+    accepted = FALSE; /* Always set in non-unicode case. */
+    if (leftop == OP_PROP || leftop == OP_NOTPROP)
+      {
+      if (rightop == OP_EOD)
+        accepted = TRUE;
+      else if (rightop == OP_PROP || rightop == OP_NOTPROP)
+        {
+        int n;
+        const uint8_t *p;
+        BOOL same = leftop == rightop;
+        BOOL lisprop = leftop == OP_PROP;
+        BOOL risprop = rightop == OP_PROP;
+        BOOL bothprop = lisprop && risprop;
+
+        /* There's a table that specifies how each combination is to be
+        processed:
+          0   Always return FALSE (never auto-possessify)
+          1   Character groups are distinct (possessify if both are OP_PROP)
+          2   Check character categories in the same group (general or particular)
+          3   Return TRUE if the two opcodes are not the same
+          ... see comments below
+        */
+
+        n = propposstab[base_list[2]][list[2]];
+        switch(n)
+          {
+          case 0: break;
+          case 1: accepted = bothprop; break;
+          case 2: accepted = (base_list[3] == list[3]) != same; break;
+          case 3: accepted = !same; break;
+
+          case 4:  /* Left general category, right particular category */
+          accepted = risprop && catposstab[base_list[3]][list[3]] == same;
+          break;
+
+          case 5:  /* Right general category, left particular category */
+          accepted = lisprop && catposstab[list[3]][base_list[3]] == same;
+          break;
+
+          /* This code is logically tricky. Think hard before fiddling with it.
+          The posspropstab table has four entries per row. Each row relates to
+          one of PCRE's special properties such as ALNUM or SPACE or WORD.
+          Only WORD actually needs all four entries, but using repeats for the
+          others means they can all use the same code below.
+
+          The first two entries in each row are Unicode general categories, and
+          apply always, because all the characters they include are part of the
+          PCRE character set. The third and fourth entries are a general and a
+          particular category, respectively, that include one or more relevant
+          characters. One or the other is used, depending on whether the check
+          is for a general or a particular category. However, in both cases the
+          category contains more characters than the specials that are defined
+          for the property being tested against. Therefore, it cannot be used
+          in a NOTPROP case.
+
+          Example: the row for WORD contains ucp_L, ucp_N, ucp_P, ucp_Po.
+          Underscore is covered by ucp_P or ucp_Po. */
+
+          case 6:  /* Left alphanum vs right general category */
+          case 7:  /* Left space vs right general category */
+          case 8:  /* Left word vs right general category */
+          p = posspropstab[n-6];
+          accepted = risprop && lisprop ==
+            (list[3] != p[0] &&
+             list[3] != p[1] &&
+            (list[3] != p[2] || !lisprop));
+          break;
+
+          case 9:   /* Right alphanum vs left general category */
+          case 10:  /* Right space vs left general category */
+          case 11:  /* Right word vs left general category */
+          p = posspropstab[n-9];
+          accepted = lisprop && risprop ==
+            (base_list[3] != p[0] &&
+             base_list[3] != p[1] &&
+            (base_list[3] != p[2] || !risprop));
+          break;
+
+          case 12:  /* Left alphanum vs right particular category */
+          case 13:  /* Left space vs right particular category */
+          case 14:  /* Left word vs right particular category */
+          p = posspropstab[n-12];
+          accepted = risprop && lisprop ==
+            (catposstab[p[0]][list[3]] &&
+             catposstab[p[1]][list[3]] &&
+            (list[3] != p[3] || !lisprop));
+          break;
+
+          case 15:  /* Right alphanum vs left particular category */
+          case 16:  /* Right space vs left particular category */
+          case 17:  /* Right word vs left particular category */
+          p = posspropstab[n-15];
+          accepted = lisprop && risprop ==
+            (catposstab[p[0]][base_list[3]] &&
+             catposstab[p[1]][base_list[3]] &&
+            (base_list[3] != p[3] || !risprop));
+          break;
+          }
+        }
+      }
+
+    else
+#endif  /* SUPPORT_UNICODE */
+
+    accepted = leftop >= FIRST_AUTOTAB_OP && leftop <= LAST_AUTOTAB_LEFT_OP &&
+           rightop >= FIRST_AUTOTAB_OP && rightop <= LAST_AUTOTAB_RIGHT_OP &&
+           autoposstab[leftop - FIRST_AUTOTAB_OP][rightop - FIRST_AUTOTAB_OP];
+
+    if (!accepted) return FALSE;
+
+    if (list[1] == 0) return TRUE;
+    /* Might be an empty repeat. */
+    continue;
+    }
+
+  /* Control reaches here only if one of the items is a small character list.
+  All characters are checked against the other side. */
+
+  do
+    {
+    chr = *chr_ptr;
+
+    switch(list_ptr[0])
+      {
+      case OP_CHAR:
+      ochr_ptr = list_ptr + 2;
+      do
+        {
+        if (chr == *ochr_ptr) return FALSE;
+        ochr_ptr++;
+        }
+      while(*ochr_ptr != NOTACHAR);
+      break;
+
+      case OP_NOT:
+      ochr_ptr = list_ptr + 2;
+      do
+        {
+        if (chr == *ochr_ptr)
+          break;
+        ochr_ptr++;
+        }
+      while(*ochr_ptr != NOTACHAR);
+      if (*ochr_ptr == NOTACHAR) return FALSE;   /* Not found */
+      break;
+
+      /* Note that OP_DIGIT etc. are generated only when PCRE2_UCP is *not*
+      set. When it is set, \d etc. are converted into OP_(NOT_)PROP codes. */
+
+      case OP_DIGIT:
+      if (chr < 256 && (cb->ctypes[chr] & ctype_digit) != 0) return FALSE;
+      break;
+
+      case OP_NOT_DIGIT:
+      if (chr > 255 || (cb->ctypes[chr] & ctype_digit) == 0) return FALSE;
+      break;
+
+      case OP_WHITESPACE:
+      if (chr < 256 && (cb->ctypes[chr] & ctype_space) != 0) return FALSE;
+      break;
+
+      case OP_NOT_WHITESPACE:
+      if (chr > 255 || (cb->ctypes[chr] & ctype_space) == 0) return FALSE;
+      break;
+
+      case OP_WORDCHAR:
+      if (chr < 255 && (cb->ctypes[chr] & ctype_word) != 0) return FALSE;
+      break;
+
+      case OP_NOT_WORDCHAR:
+      if (chr > 255 || (cb->ctypes[chr] & ctype_word) == 0) return FALSE;
+      break;
+
+      case OP_HSPACE:
+      switch(chr)
+        {
+        HSPACE_CASES: return FALSE;
+        default: break;
+        }
+      break;
+
+      case OP_NOT_HSPACE:
+      switch(chr)
+        {
+        HSPACE_CASES: break;
+        default: return FALSE;
+        }
+      break;
+
+      case OP_ANYNL:
+      case OP_VSPACE:
+      switch(chr)
+        {
+        VSPACE_CASES: return FALSE;
+        default: break;
+        }
+      break;
+
+      case OP_NOT_VSPACE:
+      switch(chr)
+        {
+        VSPACE_CASES: break;
+        default: return FALSE;
+        }
+      break;
+
+      case OP_DOLL:
+      case OP_EODN:
+      switch (chr)
+        {
+        case CHAR_CR:
+        case CHAR_LF:
+        case CHAR_VT:
+        case CHAR_FF:
+        case CHAR_NEL:
+#ifndef EBCDIC
+        case 0x2028:
+        case 0x2029:
+#endif  /* Not EBCDIC */
+        return FALSE;
+        }
+      break;
+
+      case OP_EOD:    /* Can always possessify before \z */
+      break;
+
+#ifdef SUPPORT_UNICODE
+      case OP_PROP:
+      case OP_NOTPROP:
+      if (!check_char_prop(chr, list_ptr[2], list_ptr[3],
+            list_ptr[0] == OP_NOTPROP))
+        return FALSE;
+      break;
+#endif
+
+      case OP_NCLASS:
+      if (chr > 255) return FALSE;
+      /* Fall through */
+
+      case OP_CLASS:
+      if (chr > 255) break;
+      class_bitset = (uint8_t *)
+        ((list_ptr == list ? code : base_end) - list_ptr[2]);
+      if ((class_bitset[chr >> 3] & (1 << (chr & 7))) != 0) return FALSE;
+      break;
+
+#ifdef SUPPORT_WIDE_CHARS
+      case OP_XCLASS:
+      if (PRIV(xclass)(chr, (list_ptr == list ? code : base_end) -
+          list_ptr[2] + LINK_SIZE, utf)) return FALSE;
+      break;
+#endif
+
+      default:
+      return FALSE;
+      }
+
+    chr_ptr++;
+    }
+  while(*chr_ptr != NOTACHAR);
+
+  /* At least one character must be matched from this opcode. */
+
+  if (list[1] == 0) return TRUE;
+  }
+
+/* Control never reaches here. There used to be a fail-save return FALSE; here,
+but some compilers complain about an unreachable statement. */
+}
+
+
+
+/*************************************************
+*    Scan compiled regex for auto-possession     *
+*************************************************/
+
+/* Replaces single character iterations with their possessive alternatives
+if appropriate. This function modifies the compiled opcode! Hitting a
+non-existant opcode may indicate a bug in PCRE2, but it can also be caused if a
+bad UTF string was compiled with PCRE2_NO_UTF_CHECK.
+
+Arguments:
+  code        points to start of the byte code
+  utf         TRUE in UTF mode
+  cb          compile data block
+
+Returns:      0 for success
+              -1 if a non-existant opcode is encountered
+*/
+
+int
+PRIV(auto_possessify)(PCRE2_UCHAR *code, BOOL utf, const compile_block *cb)
+{
+register PCRE2_UCHAR c;
+PCRE2_SPTR end;
+PCRE2_UCHAR *repeat_opcode;
+uint32_t list[8];
+int rec_limit;
+
+for (;;)
+  {
+  c = *code;
+
+  if (c > OP_TABLE_LENGTH) return -1;   /* Something gone wrong */
+
+  if (c >= OP_STAR && c <= OP_TYPEPOSUPTO)
+    {
+    c -= get_repeat_base(c) - OP_STAR;
+    end = (c <= OP_MINUPTO) ?
+      get_chr_property_list(code, utf, cb->fcc, list) : NULL;
+    list[1] = c == OP_STAR || c == OP_PLUS || c == OP_QUERY || c == OP_UPTO;
+
+    rec_limit = 1000;
+    if (end != NULL && compare_opcodes(end, utf, cb, list, end, &rec_limit))
+      {
+      switch(c)
+        {
+        case OP_STAR:
+        *code += OP_POSSTAR - OP_STAR;
+        break;
+
+        case OP_MINSTAR:
+        *code += OP_POSSTAR - OP_MINSTAR;
+        break;
+
+        case OP_PLUS:
+        *code += OP_POSPLUS - OP_PLUS;
+        break;
+
+        case OP_MINPLUS:
+        *code += OP_POSPLUS - OP_MINPLUS;
+        break;
+
+        case OP_QUERY:
+        *code += OP_POSQUERY - OP_QUERY;
+        break;
+
+        case OP_MINQUERY:
+        *code += OP_POSQUERY - OP_MINQUERY;
+        break;
+
+        case OP_UPTO:
+        *code += OP_POSUPTO - OP_UPTO;
+        break;
+
+        case OP_MINUPTO:
+        *code += OP_POSUPTO - OP_MINUPTO;
+        break;
+        }
+      }
+    c = *code;
+    }
+  else if (c == OP_CLASS || c == OP_NCLASS || c == OP_XCLASS)
+    {
+#ifdef SUPPORT_WIDE_CHARS
+    if (c == OP_XCLASS)
+      repeat_opcode = code + GET(code, 1);
+    else
+#endif
+      repeat_opcode = code + 1 + (32 / sizeof(PCRE2_UCHAR));
+
+    c = *repeat_opcode;
+    if (c >= OP_CRSTAR && c <= OP_CRMINRANGE)
+      {
+      /* end must not be NULL. */
+      end = get_chr_property_list(code, utf, cb->fcc, list);
+
+      list[1] = (c & 1) == 0;
+
+      rec_limit = 1000;
+      if (compare_opcodes(end, utf, cb, list, end, &rec_limit))
+        {
+        switch (c)
+          {
+          case OP_CRSTAR:
+          case OP_CRMINSTAR:
+          *repeat_opcode = OP_CRPOSSTAR;
+          break;
+
+          case OP_CRPLUS:
+          case OP_CRMINPLUS:
+          *repeat_opcode = OP_CRPOSPLUS;
+          break;
+
+          case OP_CRQUERY:
+          case OP_CRMINQUERY:
+          *repeat_opcode = OP_CRPOSQUERY;
+          break;
+
+          case OP_CRRANGE:
+          case OP_CRMINRANGE:
+          *repeat_opcode = OP_CRPOSRANGE;
+          break;
+          }
+        }
+      }
+    c = *code;
+    }
+
+  switch(c)
+    {
+    case OP_END:
+    return 0;
+
+    case OP_TYPESTAR:
+    case OP_TYPEMINSTAR:
+    case OP_TYPEPLUS:
+    case OP_TYPEMINPLUS:
+    case OP_TYPEQUERY:
+    case OP_TYPEMINQUERY:
+    case OP_TYPEPOSSTAR:
+    case OP_TYPEPOSPLUS:
+    case OP_TYPEPOSQUERY:
+    if (code[1] == OP_PROP || code[1] == OP_NOTPROP) code += 2;
+    break;
+
+    case OP_TYPEUPTO:
+    case OP_TYPEMINUPTO:
+    case OP_TYPEEXACT:
+    case OP_TYPEPOSUPTO:
+    if (code[1 + IMM2_SIZE] == OP_PROP || code[1 + IMM2_SIZE] == OP_NOTPROP)
+      code += 2;
+    break;
+
+    case OP_CALLOUT_STR:
+    code += GET(code, 1 + 2*LINK_SIZE);
+    break;
+
+#ifdef SUPPORT_WIDE_CHARS
+    case OP_XCLASS:
+    code += GET(code, 1);
+    break;
+#endif
+
+    case OP_MARK:
+    case OP_PRUNE_ARG:
+    case OP_SKIP_ARG:
+    case OP_THEN_ARG:
+    code += code[1];
+    break;
+    }
+
+  /* Add in the fixed length from the table */
+
+  code += PRIV(OP_lengths)[c];
+
+  /* In UTF-8 and UTF-16 modes, 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 arrange to skip the extra code units. */
+
+#ifdef MAYBE_UTF_MULTI
+  if (utf) switch(c)
+    {
+    case OP_CHAR:
+    case OP_CHARI:
+    case OP_NOT:
+    case OP_NOTI:
+    case OP_STAR:
+    case OP_MINSTAR:
+    case OP_PLUS:
+    case OP_MINPLUS:
+    case OP_QUERY:
+    case OP_MINQUERY:
+    case OP_UPTO:
+    case OP_MINUPTO:
+    case OP_EXACT:
+    case OP_POSSTAR:
+    case OP_POSPLUS:
+    case OP_POSQUERY:
+    case OP_POSUPTO:
+    case OP_STARI:
+    case OP_MINSTARI:
+    case OP_PLUSI:
+    case OP_MINPLUSI:
+    case OP_QUERYI:
+    case OP_MINQUERYI:
+    case OP_UPTOI:
+    case OP_MINUPTOI:
+    case OP_EXACTI:
+    case OP_POSSTARI:
+    case OP_POSPLUSI:
+    case OP_POSQUERYI:
+    case OP_POSUPTOI:
+    case OP_NOTSTAR:
+    case OP_NOTMINSTAR:
+    case OP_NOTPLUS:
+    case OP_NOTMINPLUS:
+    case OP_NOTQUERY:
+    case OP_NOTMINQUERY:
+    case OP_NOTUPTO:
+    case OP_NOTMINUPTO:
+    case OP_NOTEXACT:
+    case OP_NOTPOSSTAR:
+    case OP_NOTPOSPLUS:
+    case OP_NOTPOSQUERY:
+    case OP_NOTPOSUPTO:
+    case OP_NOTSTARI:
+    case OP_NOTMINSTARI:
+    case OP_NOTPLUSI:
+    case OP_NOTMINPLUSI:
+    case OP_NOTQUERYI:
+    case OP_NOTMINQUERYI:
+    case OP_NOTUPTOI:
+    case OP_NOTMINUPTOI:
+    case OP_NOTEXACTI:
+    case OP_NOTPOSSTARI:
+    case OP_NOTPOSPLUSI:
+    case OP_NOTPOSQUERYI:
+    case OP_NOTPOSUPTOI:
+    if (HAS_EXTRALEN(code[-1])) code += GET_EXTRALEN(code[-1]);
+    break;
+    }
+#else
+  (void)(utf);  /* Keep compiler happy by referencing function argument */
+#endif  /* SUPPORT_WIDE_CHARS */
+  }
+}
+
+/* End of pcre2_auto_possess.c */
diff --git a/dist2/src/pcre2_chartables.c b/dist2/src/pcre2_chartables.c
new file mode 120000
index 0000000..aca471c
--- /dev/null
+++ b/dist2/src/pcre2_chartables.c
@@ -0,0 +1 @@
+pcre2_chartables.c.dist
\ No newline at end of file
diff --git a/dist/pcre_chartables.c.dist b/dist2/src/pcre2_chartables.c.dist
similarity index 94%
rename from dist/pcre_chartables.c.dist
rename to dist2/src/pcre2_chartables.c.dist
index 1e20ec2..203cb1a 100644
--- a/dist/pcre_chartables.c.dist
+++ b/dist2/src/pcre2_chartables.c.dist
@@ -3,19 +3,19 @@
 *************************************************/
 
 /* This file contains character tables that are used when no external tables
-are passed to PCRE by the application that calls it. The tables are used only
+are passed to PCRE2 by the application that calls it. The tables are used only
 for characters whose code values are less than 256.
 
 This is a default version of the tables that assumes ASCII encoding. A program
-called dftables (which is distributed with PCRE) can be used to build
+called dftables (which is distributed with PCRE2) can be used to build
 alternative versions of this file. This is necessary if you are running in an
 EBCDIC environment, or if you want to default to a different encoding, for
 example ISO-8859-1. When dftables is run, it creates these tables in the
-current locale. If PCRE is configured with --enable-rebuild-chartables, this
+current locale. If PCRE2 is configured with --enable-rebuild-chartables, this
 happens automatically.
 
 The following #includes are present because without them gcc 4.x may remove the
-array definition from the final binary if PCRE is built into a static library
+array definition from the final binary if PCRE2 is built into a static library
 and dead code stripping is activated. This leads to link errors. Pulling in the
 header ensures that the array gets flagged as "someone outside this compilation
 unit might reference this" and so it will always be supplied to the linker. */
@@ -24,9 +24,9 @@
 #include "config.h"
 #endif
 
-#include "pcre_internal.h"
+#include "pcre2_internal.h"
 
-const pcre_uint8 PRIV(default_tables)[] = {
+const uint8_t PRIV(default_tables)[] = {
 
 /* This table is a lower casing table. */
 
@@ -195,4 +195,4 @@
   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 240-247 */
   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};/* 248-255 */
 
-/* End of pcre_chartables.c */
+/* End of pcre2_chartables.c */
diff --git a/dist2/src/pcre2_compile.c b/dist2/src/pcre2_compile.c
new file mode 100644
index 0000000..d852837
--- /dev/null
+++ b/dist2/src/pcre2_compile.c
@@ -0,0 +1,9008 @@
+/*************************************************
+*      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
+     Original API code Copyright (c) 1997-2012 University of Cambridge
+         New API code Copyright (c) 2016 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.
+-----------------------------------------------------------------------------
+*/
+
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#define NLBLOCK cb             /* Block containing newline information */
+#define PSSTART start_pattern  /* Field containing processed string start */
+#define PSEND   end_pattern    /* Field containing processed string end */
+
+#include "pcre2_internal.h"
+
+/* In rare error cases debugging might require calling pcre2_printint(). */
+
+#if 0
+#ifdef EBCDIC
+#define PRINTABLE(c) ((c) >= 64 && (c) < 255)
+#else
+#define PRINTABLE(c) ((c) >= 32 && (c) < 127)
+#endif
+#include "pcre2_printint.c"
+#define CALL_PRINTINT
+#endif
+
+/* There are a few things that vary with different code unit sizes. Handle them
+by defining macros in order to minimize #if usage. */
+
+#if PCRE2_CODE_UNIT_WIDTH == 8
+#define STRING_UTFn_RIGHTPAR     STRING_UTF8_RIGHTPAR, 5
+#define XDIGIT(c)                xdigitab[c]
+
+#else  /* Either 16-bit or 32-bit */
+#define XDIGIT(c)                (MAX_255(c)? xdigitab[c] : 0xff)
+
+#if PCRE2_CODE_UNIT_WIDTH == 16
+#define STRING_UTFn_RIGHTPAR     STRING_UTF16_RIGHTPAR, 6
+
+#else  /* 32-bit */
+#define STRING_UTFn_RIGHTPAR     STRING_UTF32_RIGHTPAR, 6
+#endif
+#endif
+
+/* Function definitions to allow mutual recursion */
+
+static int
+  add_list_to_class(uint8_t *, PCRE2_UCHAR **, uint32_t, compile_block *,
+    const uint32_t *, unsigned int);
+
+static BOOL
+  compile_regex(uint32_t, PCRE2_UCHAR **, PCRE2_SPTR *, int *, BOOL, BOOL,
+    uint32_t, int, uint32_t *, int32_t *, uint32_t *, int32_t *,
+    branch_chain *, compile_block *, size_t *);
+
+
+
+/*************************************************
+*      Code parameters and static tables         *
+*************************************************/
+
+/* This value specifies the size of stack workspace, which is used in different
+ways in the different pattern scans. The group-identifying pre-scan uses it to
+handle nesting, and needs it to be 16-bit aligned.
+
+During the first compiling phase, when determining how much memory is required,
+the regex is partly compiled into this space, but the compiled parts are
+discarded as soon as they can be, so that hopefully there will never be an
+overrun. The code does, however, check for an overrun, which can occur for
+pathological patterns. The size of the workspace depends on LINK_SIZE because
+the length of compiled items varies with this.
+
+In the real compile phase, the workspace is used for remembering data about
+numbered groups, provided there are not too many of them (if there are, extra
+memory is acquired). For this phase the memory must be 32-bit aligned. Having
+defined the size in code units, we set up C32_WORK_SIZE as the number of
+elements in the 32-bit vector. */
+
+#define COMPILE_WORK_SIZE (2048*LINK_SIZE)   /* Size in code units */
+
+#define C32_WORK_SIZE \
+  ((COMPILE_WORK_SIZE * sizeof(PCRE2_UCHAR))/sizeof(uint32_t))
+
+/* The overrun tests check for a slightly smaller size so that they detect the
+overrun before it actually does run off the end of the data block. */
+
+#define WORK_SIZE_SAFETY_MARGIN (100)
+
+/* This value determines the size of the initial vector that is used for
+remembering named groups during the pre-compile. It is allocated on the stack,
+but if it is too small, it is expanded, in a similar way to the workspace. The
+value is the number of slots in the list. */
+
+#define NAMED_GROUP_LIST_SIZE  20
+
+/* The original PCRE required patterns to be zero-terminated, and it simplifies
+the compiling code if it is guaranteed that there is a zero code unit at the
+end of the pattern, because this means that tests for coding sequences such as
+(*SKIP) or even just (?<= can check a sequence of code units without having to
+keep checking for the end of the pattern. The new PCRE2 API allows zero code
+units within patterns if a positive length is given, but in order to keep most
+of the compiling code as it was, we copy such patterns and add a zero on the
+end. This value determines the size of space on the stack that is used if the
+pattern fits; if not, heap memory is used. */
+
+#define COPIED_PATTERN_SIZE 1024
+
+/* Maximum length value to check against when making sure that the variable
+that holds the compiled pattern length does not overflow. We make it a bit less
+than INT_MAX to allow for adding in group terminating bytes, so that we don't
+have to check them every time. */
+
+#define OFLOW_MAX (INT_MAX - 20)
+
+/* Macro for setting individual bits in class bitmaps. */
+
+#define SETBIT(a,b) a[(b)/8] |= (1 << ((b)&7))
+
+/* Private flags added to firstcu and reqcu. */
+
+#define REQ_CASELESS    (1 << 0)        /* Indicates caselessness */
+#define REQ_VARY        (1 << 1)        /* reqcu followed non-literal item */
+/* Negative values for the firstcu and reqcu flags */
+#define REQ_UNSET       (-2)            /* Not yet found anything */
+#define REQ_NONE        (-1)            /* Found not fixed char */
+
+/* These flags are used in the groupinfo vector. */
+
+#define GI_SET_COULD_BE_EMPTY  0x80000000u
+#define GI_COULD_BE_EMPTY      0x40000000u
+#define GI_NOT_FIXED_LENGTH    0x20000000u
+#define GI_SET_FIXED_LENGTH    0x10000000u
+#define GI_FIXED_LENGTH_MASK   0x0000ffffu
+
+/* This bit (which is greater than any UTF value) is used to indicate that a
+variable contains a number of code units instead of an actual code point. */
+
+#define UTF_LENGTH     0x10000000l
+
+/* This simple test for a decimal digit works for both ASCII/Unicode and EBCDIC
+and is fast (a good compiler can turn it into a subtraction and unsigned
+comparison). */
+
+#define IS_DIGIT(x) ((x) >= CHAR_0 && (x) <= CHAR_9)
+
+/* Table to identify hex digits. The tables in chartables are dependent on the
+locale, and may mark arbitrary characters as digits. We want to recognize only
+0-9, a-z, and A-Z as hex digits, which 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. The value in the table is
+the binary hex digit value, or 0xff for non-hex digits. */
+
+/* This is the "normal" case, for ASCII systems, and EBCDIC systems running in
+UTF-8 mode. */
+
+#ifndef EBCDIC
+static const uint8_t xdigitab[] =
+  {
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, /*   0-  7 */
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, /*   8- 15 */
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, /*  16- 23 */
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, /*  24- 31 */
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, /*    - '  */
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, /*  ( - /  */
+  0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07, /*  0 - 7  */
+  0x08,0x09,0xff,0xff,0xff,0xff,0xff,0xff, /*  8 - ?  */
+  0xff,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0xff, /*  @ - G  */
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, /*  H - O  */
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, /*  P - W  */
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, /*  X - _  */
+  0xff,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0xff, /*  ` - g  */
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, /*  h - o  */
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, /*  p - w  */
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, /*  x -127 */
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, /* 128-135 */
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, /* 136-143 */
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, /* 144-151 */
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, /* 152-159 */
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, /* 160-167 */
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, /* 168-175 */
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, /* 176-183 */
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, /* 184-191 */
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, /* 192-199 */
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, /* 2ff-207 */
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, /* 208-215 */
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, /* 216-223 */
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, /* 224-231 */
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, /* 232-239 */
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, /* 240-247 */
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};/* 248-255 */
+
+#else
+
+/* This is the "abnormal" case, for EBCDIC systems not running in UTF-8 mode. */
+
+static const uint8_t xdigitab[] =
+  {
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, /*   0-  7  0 */
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, /*   8- 15    */
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, /*  16- 23 10 */
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, /*  24- 31    */
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, /*  32- 39 20 */
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, /*  40- 47    */
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, /*  48- 55 30 */
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, /*  56- 63    */
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, /*    - 71 40 */
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, /*  72- |     */
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, /*  & - 87 50 */
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, /*  88- 95    */
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, /*  - -103 60 */
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, /* 104- ?     */
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, /* 112-119 70 */
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, /* 120- "     */
+  0xff,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0xff, /* 128- g  80 */
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, /*  h -143    */
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, /* 144- p  90 */
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, /*  q -159    */
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, /* 160- x  A0 */
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, /*  y -175    */
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, /*  ^ -183 B0 */
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, /* 184-191    */
+  0xff,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0xff, /*  { - G  C0 */
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, /*  H -207    */
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, /*  } - P  D0 */
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, /*  Q -223    */
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, /*  \ - X  E0 */
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, /*  Y -239    */
+  0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07, /*  0 - 7  F0 */
+  0x08,0x09,0xff,0xff,0xff,0xff,0xff,0xff};/*  8 -255    */
+#endif  /* EBCDIC */
+
+
+/* Table for handling alphanumeric escaped characters. 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. */
+
+/* This is the "normal" table for ASCII systems or for EBCDIC systems running
+in UTF-8 mode. It runs from '0' to 'z'. */
+
+#ifndef EBCDIC
+#define ESCAPES_FIRST       CHAR_0
+#define ESCAPES_LAST        CHAR_z
+#define UPPER_CASE(c)       (c-32)
+
+static const short int escapes[] = {
+     0,                       0,
+     0,                       0,
+     0,                       0,
+     0,                       0,
+     0,                       0,
+     CHAR_COLON,              CHAR_SEMICOLON,
+     CHAR_LESS_THAN_SIGN,     CHAR_EQUALS_SIGN,
+     CHAR_GREATER_THAN_SIGN,  CHAR_QUESTION_MARK,
+     CHAR_COMMERCIAL_AT,      -ESC_A,
+     -ESC_B,                  -ESC_C,
+     -ESC_D,                  -ESC_E,
+     0,                       -ESC_G,
+     -ESC_H,                  0,
+     0,                       -ESC_K,
+     0,                       0,
+     -ESC_N,                  0,
+     -ESC_P,                  -ESC_Q,
+     -ESC_R,                  -ESC_S,
+     0,                       0,
+     -ESC_V,                  -ESC_W,
+     -ESC_X,                  0,
+     -ESC_Z,                  CHAR_LEFT_SQUARE_BRACKET,
+     CHAR_BACKSLASH,          CHAR_RIGHT_SQUARE_BRACKET,
+     CHAR_CIRCUMFLEX_ACCENT,  CHAR_UNDERSCORE,
+     CHAR_GRAVE_ACCENT,       ESC_a,
+     -ESC_b,                  0,
+     -ESC_d,                  ESC_e,
+     ESC_f,                   0,
+     -ESC_h,                  0,
+     0,                       -ESC_k,
+     0,                       0,
+     ESC_n,                   0,
+     -ESC_p,                  0,
+     ESC_r,                   -ESC_s,
+     ESC_tee,                 0,
+     -ESC_v,                  -ESC_w,
+     0,                       0,
+     -ESC_z
+};
+
+#else
+
+/* This is the "abnormal" table for EBCDIC systems without UTF-8 support.
+It runs from 'a' to '9'. For some minimal testing of EBCDIC features, the code
+is sometimes compiled on an ASCII system. In this case, we must not use CHAR_a
+because it is defined as 'a', which of course picks up the ASCII value. */
+
+#if 'a' == 0x81                    /* Check for a real EBCDIC environment */
+#define ESCAPES_FIRST       CHAR_a
+#define ESCAPES_LAST        CHAR_9
+#define UPPER_CASE(c)       (c+64)
+#else                              /* Testing in an ASCII environment */
+#define ESCAPES_FIRST  ((unsigned char)'\x81')   /* EBCDIC 'a' */
+#define ESCAPES_LAST   ((unsigned char)'\xf9')   /* EBCDIC '9' */
+#define UPPER_CASE(c)  (c-32)
+#endif
+
+static const short int escapes[] = {
+/*  80 */        ESC_a, -ESC_b,       0, -ESC_d, ESC_e,  ESC_f,      0,
+/*  88 */-ESC_h,     0,      0,     '{',      0,     0,      0,      0,
+/*  90 */     0,     0, -ESC_k,       0,      0, ESC_n,      0, -ESC_p,
+/*  98 */     0, ESC_r,      0,     '}',      0,     0,      0,      0,
+/*  A0 */     0,   '~', -ESC_s, ESC_tee,      0,-ESC_v, -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 */-ESC_H,     0,      0,       0,      0,     0,      0,      0,
+/*  D0 */   '}',     0, -ESC_K,       0,      0,-ESC_N,      0, -ESC_P,
+/*  D8 */-ESC_Q,-ESC_R,      0,       0,      0,     0,      0,      0,
+/*  E0 */  '\\',     0, -ESC_S,       0,      0,-ESC_V, -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
+};
+
+/* We also need a table of characters that may follow \c in an EBCDIC
+environment for characters 0-31. */
+
+static unsigned char ebcdic_escape_c[] = "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_";
+
+#endif   /* EBCDIC */
+
+
+/* Table of special "verbs" like (*PRUNE). This is a short table, so it is
+searched linearly. Put all the names into a single string, in order to reduce
+the number of relocations when a shared library is dynamically linked. The
+string is built from string macros so that it works in UTF-8 mode on EBCDIC
+platforms. */
+
+typedef struct verbitem {
+  int   len;                 /* Length of verb name */
+  int   op;                  /* Op when no arg, or -1 if arg mandatory */
+  int   op_arg;              /* Op when arg present, or -1 if not allowed */
+} verbitem;
+
+static const char verbnames[] =
+  "\0"                       /* Empty name is a shorthand for MARK */
+  STRING_MARK0
+  STRING_ACCEPT0
+  STRING_COMMIT0
+  STRING_F0
+  STRING_FAIL0
+  STRING_PRUNE0
+  STRING_SKIP0
+  STRING_THEN;
+
+static const verbitem verbs[] = {
+  { 0, -1,        OP_MARK },
+  { 4, -1,        OP_MARK },
+  { 6, OP_ACCEPT, -1 },
+  { 6, OP_COMMIT, -1 },
+  { 1, OP_FAIL,   -1 },
+  { 4, OP_FAIL,   -1 },
+  { 5, OP_PRUNE,  OP_PRUNE_ARG },
+  { 4, OP_SKIP,   OP_SKIP_ARG  },
+  { 4, OP_THEN,   OP_THEN_ARG  }
+};
+
+static const int verbcount = sizeof(verbs)/sizeof(verbitem);
+
+
+/* Substitutes for [[:<:]] and [[:>:]], which mean start and end of word in
+another regex library. */
+
+static const PCRE2_UCHAR sub_start_of_word[] = {
+  CHAR_BACKSLASH, CHAR_b, CHAR_LEFT_PARENTHESIS, CHAR_QUESTION_MARK,
+  CHAR_EQUALS_SIGN, CHAR_BACKSLASH, CHAR_w, CHAR_RIGHT_PARENTHESIS, '\0' };
+
+static const PCRE2_UCHAR sub_end_of_word[] = {
+  CHAR_BACKSLASH, CHAR_b, CHAR_LEFT_PARENTHESIS, CHAR_QUESTION_MARK,
+  CHAR_LESS_THAN_SIGN, CHAR_EQUALS_SIGN, CHAR_BACKSLASH, CHAR_w,
+  CHAR_RIGHT_PARENTHESIS, '\0' };
+
+
+/* Tables of names of POSIX character classes and their lengths. The names are
+now all in a single string, to reduce the number of relocations when a shared
+library is dynamically loaded. The list of lengths is terminated by a zero
+length entry. The first three must be alpha, lower, upper, as this is assumed
+for handling case independence. The indices for graph, print, and punct are
+needed, so identify them. */
+
+static const char posix_names[] =
+  STRING_alpha0 STRING_lower0 STRING_upper0 STRING_alnum0
+  STRING_ascii0 STRING_blank0 STRING_cntrl0 STRING_digit0
+  STRING_graph0 STRING_print0 STRING_punct0 STRING_space0
+  STRING_word0  STRING_xdigit;
+
+static const uint8_t posix_name_lengths[] = {
+  5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 6, 0 };
+
+#define PC_GRAPH  8
+#define PC_PRINT  9
+#define PC_PUNCT 10
+
+
+/* Table of class bit maps for each POSIX class. Each class is formed from a
+base map, with an optional addition or removal of another map. Then, for some
+classes, there is some additional tweaking: for [:blank:] the vertical space
+characters are removed, and for [:alpha:] and [:alnum:] the underscore
+character is removed. The triples in the table consist of the base map offset,
+second map offset or -1 if no second map, and a non-negative value for map
+addition or a negative value for map subtraction (if there are two maps). The
+absolute value of the third field has these meanings: 0 => no tweaking, 1 =>
+remove vertical space characters, 2 => remove underscore. */
+
+static const int posix_class_maps[] = {
+  cbit_word,  cbit_digit, -2,             /* alpha */
+  cbit_lower, -1,          0,             /* lower */
+  cbit_upper, -1,          0,             /* upper */
+  cbit_word,  -1,          2,             /* alnum - word without underscore */
+  cbit_print, cbit_cntrl,  0,             /* ascii */
+  cbit_space, -1,          1,             /* blank - a GNU extension */
+  cbit_cntrl, -1,          0,             /* cntrl */
+  cbit_digit, -1,          0,             /* digit */
+  cbit_graph, -1,          0,             /* graph */
+  cbit_print, -1,          0,             /* print */
+  cbit_punct, -1,          0,             /* punct */
+  cbit_space, -1,          0,             /* space */
+  cbit_word,  -1,          0,             /* word - a Perl extension */
+  cbit_xdigit,-1,          0              /* xdigit */
+};
+
+/* Table of substitutes for \d etc when PCRE2_UCP is set. They are replaced by
+Unicode property escapes. */
+
+#ifdef SUPPORT_UNICODE
+static const PCRE2_UCHAR string_PNd[]  = {
+  CHAR_BACKSLASH, CHAR_P, CHAR_LEFT_CURLY_BRACKET,
+  CHAR_N, CHAR_d, CHAR_RIGHT_CURLY_BRACKET, '\0' };
+static const PCRE2_UCHAR string_pNd[]  = {
+  CHAR_BACKSLASH, CHAR_p, CHAR_LEFT_CURLY_BRACKET,
+  CHAR_N, CHAR_d, CHAR_RIGHT_CURLY_BRACKET, '\0' };
+static const PCRE2_UCHAR string_PXsp[] = {
+  CHAR_BACKSLASH, CHAR_P, CHAR_LEFT_CURLY_BRACKET,
+  CHAR_X, CHAR_s, CHAR_p, CHAR_RIGHT_CURLY_BRACKET, '\0' };
+static const PCRE2_UCHAR string_pXsp[] = {
+  CHAR_BACKSLASH, CHAR_p, CHAR_LEFT_CURLY_BRACKET,
+  CHAR_X, CHAR_s, CHAR_p, CHAR_RIGHT_CURLY_BRACKET, '\0' };
+static const PCRE2_UCHAR string_PXwd[] = {
+  CHAR_BACKSLASH, CHAR_P, CHAR_LEFT_CURLY_BRACKET,
+  CHAR_X, CHAR_w, CHAR_d, CHAR_RIGHT_CURLY_BRACKET, '\0' };
+static const PCRE2_UCHAR string_pXwd[] = {
+  CHAR_BACKSLASH, CHAR_p, CHAR_LEFT_CURLY_BRACKET,
+  CHAR_X, CHAR_w, CHAR_d, CHAR_RIGHT_CURLY_BRACKET, '\0' };
+
+static PCRE2_SPTR substitutes[] = {
+  string_PNd,           /* \D */
+  string_pNd,           /* \d */
+  string_PXsp,          /* \S */   /* Xsp is Perl space, but from 8.34, Perl */
+  string_pXsp,          /* \s */   /* space and POSIX space are the same. */
+  string_PXwd,          /* \W */
+  string_pXwd           /* \w */
+};
+
+/* The POSIX class substitutes must be in the order of the POSIX class names,
+defined above, and there are both positive and negative cases. NULL means no
+general substitute of a Unicode property escape (\p or \P). However, for some
+POSIX classes (e.g. graph, print, punct) a special property code is compiled
+directly. */
+
+static const PCRE2_UCHAR string_pCc[] =  {
+  CHAR_BACKSLASH, CHAR_p, CHAR_LEFT_CURLY_BRACKET,
+  CHAR_C, CHAR_c, CHAR_RIGHT_CURLY_BRACKET, '\0' };
+static const PCRE2_UCHAR string_pL[] =   {
+  CHAR_BACKSLASH, CHAR_p, CHAR_LEFT_CURLY_BRACKET,
+  CHAR_L, CHAR_RIGHT_CURLY_BRACKET, '\0' };
+static const PCRE2_UCHAR string_pLl[] =  {
+  CHAR_BACKSLASH, CHAR_p, CHAR_LEFT_CURLY_BRACKET,
+  CHAR_L, CHAR_l, CHAR_RIGHT_CURLY_BRACKET, '\0' };
+static const PCRE2_UCHAR string_pLu[] =  {
+  CHAR_BACKSLASH, CHAR_p, CHAR_LEFT_CURLY_BRACKET,
+  CHAR_L, CHAR_u, CHAR_RIGHT_CURLY_BRACKET, '\0' };
+static const PCRE2_UCHAR string_pXan[] = {
+  CHAR_BACKSLASH, CHAR_p, CHAR_LEFT_CURLY_BRACKET,
+  CHAR_X, CHAR_a, CHAR_n, CHAR_RIGHT_CURLY_BRACKET, '\0' };
+static const PCRE2_UCHAR string_h[] =    {
+  CHAR_BACKSLASH, CHAR_h, '\0' };
+static const PCRE2_UCHAR string_pXps[] = {
+  CHAR_BACKSLASH, CHAR_p, CHAR_LEFT_CURLY_BRACKET,
+  CHAR_X, CHAR_p, CHAR_s, CHAR_RIGHT_CURLY_BRACKET, '\0' };
+static const PCRE2_UCHAR string_PCc[] =  {
+  CHAR_BACKSLASH, CHAR_P, CHAR_LEFT_CURLY_BRACKET,
+  CHAR_C, CHAR_c, CHAR_RIGHT_CURLY_BRACKET, '\0' };
+static const PCRE2_UCHAR string_PL[] =   {
+  CHAR_BACKSLASH, CHAR_P, CHAR_LEFT_CURLY_BRACKET,
+  CHAR_L, CHAR_RIGHT_CURLY_BRACKET, '\0' };
+static const PCRE2_UCHAR string_PLl[] =  {
+  CHAR_BACKSLASH, CHAR_P, CHAR_LEFT_CURLY_BRACKET,
+  CHAR_L, CHAR_l, CHAR_RIGHT_CURLY_BRACKET, '\0' };
+static const PCRE2_UCHAR string_PLu[] =  {
+  CHAR_BACKSLASH, CHAR_P, CHAR_LEFT_CURLY_BRACKET,
+  CHAR_L, CHAR_u, CHAR_RIGHT_CURLY_BRACKET, '\0' };
+static const PCRE2_UCHAR string_PXan[] = {
+  CHAR_BACKSLASH, CHAR_P, CHAR_LEFT_CURLY_BRACKET,
+  CHAR_X, CHAR_a, CHAR_n, CHAR_RIGHT_CURLY_BRACKET, '\0' };
+static const PCRE2_UCHAR string_H[] =    {
+  CHAR_BACKSLASH, CHAR_H, '\0' };
+static const PCRE2_UCHAR string_PXps[] = {
+  CHAR_BACKSLASH, CHAR_P, CHAR_LEFT_CURLY_BRACKET,
+  CHAR_X, CHAR_p, CHAR_s, CHAR_RIGHT_CURLY_BRACKET, '\0' };
+
+static PCRE2_SPTR posix_substitutes[] = {
+  string_pL,            /* alpha */
+  string_pLl,           /* lower */
+  string_pLu,           /* upper */
+  string_pXan,          /* alnum */
+  NULL,                 /* ascii */
+  string_h,             /* blank */
+  string_pCc,           /* cntrl */
+  string_pNd,           /* digit */
+  NULL,                 /* graph */
+  NULL,                 /* print */
+  NULL,                 /* punct */
+  string_pXps,          /* space */   /* Xps is POSIX space, but from 8.34 */
+  string_pXwd,          /* word  */   /* Perl and POSIX space are the same */
+  NULL,                 /* xdigit */
+  /* Negated cases */
+  string_PL,            /* ^alpha */
+  string_PLl,           /* ^lower */
+  string_PLu,           /* ^upper */
+  string_PXan,          /* ^alnum */
+  NULL,                 /* ^ascii */
+  string_H,             /* ^blank */
+  string_PCc,           /* ^cntrl */
+  string_PNd,           /* ^digit */
+  NULL,                 /* ^graph */
+  NULL,                 /* ^print */
+  NULL,                 /* ^punct */
+  string_PXps,          /* ^space */  /* Xps is POSIX space, but from 8.34 */
+  string_PXwd,          /* ^word */   /* Perl and POSIX space are the same */
+  NULL                  /* ^xdigit */
+};
+#define POSIX_SUBSIZE (sizeof(posix_substitutes) / sizeof(PCRE2_UCHAR *))
+#endif  /* SUPPORT_UNICODE */
+
+/* Masks for checking option settings. */
+
+#define PUBLIC_COMPILE_OPTIONS \
+  (PCRE2_ANCHORED|PCRE2_ALLOW_EMPTY_CLASS|PCRE2_ALT_BSUX|PCRE2_ALT_CIRCUMFLEX| \
+   PCRE2_ALT_VERBNAMES|PCRE2_AUTO_CALLOUT|PCRE2_CASELESS|PCRE2_DOLLAR_ENDONLY| \
+   PCRE2_DOTALL|PCRE2_DUPNAMES|PCRE2_EXTENDED|PCRE2_FIRSTLINE| \
+   PCRE2_MATCH_UNSET_BACKREF|PCRE2_MULTILINE|PCRE2_NEVER_BACKSLASH_C| \
+   PCRE2_NEVER_UCP|PCRE2_NEVER_UTF|PCRE2_NO_AUTO_CAPTURE| \
+   PCRE2_NO_AUTO_POSSESS|PCRE2_NO_DOTSTAR_ANCHOR|PCRE2_NO_START_OPTIMIZE| \
+   PCRE2_NO_UTF_CHECK|PCRE2_UCP|PCRE2_UNGREEDY|PCRE2_USE_OFFSET_LIMIT| \
+   PCRE2_UTF)
+
+/* Compile time error code numbers. They are given names so that they can more
+easily be tracked. When a new number is added, the tables called eint1 and
+eint2 in pcre2posix.c may need to be updated, and a new error text must be
+added to compile_error_texts in pcre2_error.c. */
+
+enum { ERR0 = COMPILE_ERROR_BASE,
+       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, ERR48, ERR49, ERR50,
+       ERR51, ERR52, ERR53, ERR54, ERR55, ERR56, ERR57, ERR58, ERR59, ERR60,
+       ERR61, ERR62, ERR63, ERR64, ERR65, ERR66, ERR67, ERR68, ERR69, ERR70,
+       ERR71, ERR72, ERR73, ERR74, ERR75, ERR76, ERR77, ERR78, ERR79, ERR80,
+       ERR81, ERR82, ERR83, ERR84, ERR85, ERR86, ERR87, ERR88 };
+
+/* Error codes that correspond to negative error codes returned by
+find_fixedlength(). */
+
+static int fixed_length_errors[] =
+  {
+  ERR0,    /* Not an error */
+  ERR0,    /* Not an error; -1 is used for "process later" */
+  ERR25,   /* Lookbehind is not fixed length */
+  ERR36,   /* \C in lookbehind is not allowed */
+  ERR87,   /* Lookbehind is too long */
+  ERR86,   /* Pattern too complicated */
+  ERR70    /* Internal error: unknown opcode encountered */
+  };
+
+/* This is a table of start-of-pattern options such as (*UTF) and settings such
+as (*LIMIT_MATCH=nnnn) and (*CRLF). For completeness and backward
+compatibility, (*UTFn) is supported in the relevant libraries, but (*UTF) is
+generic and always supported. */
+
+enum { PSO_OPT,     /* Value is an option bit */
+       PSO_FLG,     /* Value is a flag bit */
+       PSO_NL,      /* Value is a newline type */
+       PSO_BSR,     /* Value is a \R type */
+       PSO_LIMM,    /* Read integer value for match limit */
+       PSO_LIMR };  /* Read integer value for recursion limit */
+
+typedef struct pso {
+  const uint8_t *name;
+  uint16_t length;
+  uint16_t type;
+  uint32_t value;
+} pso;
+
+/* NB: STRING_UTFn_RIGHTPAR contains the length as well */
+
+static pso pso_list[] = {
+  { (uint8_t *)STRING_UTFn_RIGHTPAR,                  PSO_OPT, PCRE2_UTF },
+  { (uint8_t *)STRING_UTF_RIGHTPAR,                4, PSO_OPT, PCRE2_UTF },
+  { (uint8_t *)STRING_UCP_RIGHTPAR,                4, PSO_OPT, PCRE2_UCP },
+  { (uint8_t *)STRING_NOTEMPTY_RIGHTPAR,           9, PSO_FLG, PCRE2_NOTEMPTY_SET },
+  { (uint8_t *)STRING_NOTEMPTY_ATSTART_RIGHTPAR,  17, PSO_FLG, PCRE2_NE_ATST_SET },
+  { (uint8_t *)STRING_NO_AUTO_POSSESS_RIGHTPAR,   16, PSO_OPT, PCRE2_NO_AUTO_POSSESS },
+  { (uint8_t *)STRING_NO_DOTSTAR_ANCHOR_RIGHTPAR, 18, PSO_OPT, PCRE2_NO_DOTSTAR_ANCHOR },
+  { (uint8_t *)STRING_NO_JIT_RIGHTPAR,             7, PSO_FLG, PCRE2_NOJIT },
+  { (uint8_t *)STRING_NO_START_OPT_RIGHTPAR,      13, PSO_OPT, PCRE2_NO_START_OPTIMIZE },
+  { (uint8_t *)STRING_LIMIT_MATCH_EQ,             12, PSO_LIMM, 0 },
+  { (uint8_t *)STRING_LIMIT_RECURSION_EQ,         16, PSO_LIMR, 0 },
+  { (uint8_t *)STRING_CR_RIGHTPAR,                 3, PSO_NL,  PCRE2_NEWLINE_CR },
+  { (uint8_t *)STRING_LF_RIGHTPAR,                 3, PSO_NL,  PCRE2_NEWLINE_LF },
+  { (uint8_t *)STRING_CRLF_RIGHTPAR,               5, PSO_NL,  PCRE2_NEWLINE_CRLF },
+  { (uint8_t *)STRING_ANY_RIGHTPAR,                4, PSO_NL,  PCRE2_NEWLINE_ANY },
+  { (uint8_t *)STRING_ANYCRLF_RIGHTPAR,            8, PSO_NL,  PCRE2_NEWLINE_ANYCRLF },
+  { (uint8_t *)STRING_BSR_ANYCRLF_RIGHTPAR,       12, PSO_BSR, PCRE2_BSR_ANYCRLF },
+  { (uint8_t *)STRING_BSR_UNICODE_RIGHTPAR,       12, PSO_BSR, PCRE2_BSR_UNICODE }
+};
+
+/* This table is used when converting repeating opcodes into possessified
+versions as a result of an explicit possessive quantifier such as ++. A zero
+value means there is no possessified version - in those cases the item in
+question must be wrapped in ONCE brackets. The table is truncated at OP_CALLOUT
+because all relevant opcodes are less than that. */
+
+static const uint8_t opcode_possessify[] = {
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   /* 0 - 15  */
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   /* 16 - 31 */
+
+  0,                       /* NOTI */
+  OP_POSSTAR, 0,           /* STAR, MINSTAR */
+  OP_POSPLUS, 0,           /* PLUS, MINPLUS */
+  OP_POSQUERY, 0,          /* QUERY, MINQUERY */
+  OP_POSUPTO, 0,           /* UPTO, MINUPTO */
+  0,                       /* EXACT */
+  0, 0, 0, 0,              /* POS{STAR,PLUS,QUERY,UPTO} */
+
+  OP_POSSTARI, 0,          /* STARI, MINSTARI */
+  OP_POSPLUSI, 0,          /* PLUSI, MINPLUSI */
+  OP_POSQUERYI, 0,         /* QUERYI, MINQUERYI */
+  OP_POSUPTOI, 0,          /* UPTOI, MINUPTOI */
+  0,                       /* EXACTI */
+  0, 0, 0, 0,              /* POS{STARI,PLUSI,QUERYI,UPTOI} */
+
+  OP_NOTPOSSTAR, 0,        /* NOTSTAR, NOTMINSTAR */
+  OP_NOTPOSPLUS, 0,        /* NOTPLUS, NOTMINPLUS */
+  OP_NOTPOSQUERY, 0,       /* NOTQUERY, NOTMINQUERY */
+  OP_NOTPOSUPTO, 0,        /* NOTUPTO, NOTMINUPTO */
+  0,                       /* NOTEXACT */
+  0, 0, 0, 0,              /* NOTPOS{STAR,PLUS,QUERY,UPTO} */
+
+  OP_NOTPOSSTARI, 0,       /* NOTSTARI, NOTMINSTARI */
+  OP_NOTPOSPLUSI, 0,       /* NOTPLUSI, NOTMINPLUSI */
+  OP_NOTPOSQUERYI, 0,      /* NOTQUERYI, NOTMINQUERYI */
+  OP_NOTPOSUPTOI, 0,       /* NOTUPTOI, NOTMINUPTOI */
+  0,                       /* NOTEXACTI */
+  0, 0, 0, 0,              /* NOTPOS{STARI,PLUSI,QUERYI,UPTOI} */
+
+  OP_TYPEPOSSTAR, 0,       /* TYPESTAR, TYPEMINSTAR */
+  OP_TYPEPOSPLUS, 0,       /* TYPEPLUS, TYPEMINPLUS */
+  OP_TYPEPOSQUERY, 0,      /* TYPEQUERY, TYPEMINQUERY */
+  OP_TYPEPOSUPTO, 0,       /* TYPEUPTO, TYPEMINUPTO */
+  0,                       /* TYPEEXACT */
+  0, 0, 0, 0,              /* TYPEPOS{STAR,PLUS,QUERY,UPTO} */
+
+  OP_CRPOSSTAR, 0,         /* CRSTAR, CRMINSTAR */
+  OP_CRPOSPLUS, 0,         /* CRPLUS, CRMINPLUS */
+  OP_CRPOSQUERY, 0,        /* CRQUERY, CRMINQUERY */
+  OP_CRPOSRANGE, 0,        /* CRRANGE, CRMINRANGE */
+  0, 0, 0, 0,              /* CRPOS{STAR,PLUS,QUERY,RANGE} */
+
+  0, 0, 0,                 /* CLASS, NCLASS, XCLASS */
+  0, 0,                    /* REF, REFI */
+  0, 0,                    /* DNREF, DNREFI */
+  0, 0                     /* RECURSE, CALLOUT */
+};
+
+
+
+/*************************************************
+*               Free compiled code               *
+*************************************************/
+
+PCRE2_EXP_DEFN void PCRE2_CALL_CONVENTION
+pcre2_code_free(pcre2_code *code)
+{
+PCRE2_SIZE* ref_count;
+
+if (code != NULL)
+  {
+  if (code->executable_jit != NULL)
+    PRIV(jit_free)(code->executable_jit, &code->memctl);
+
+  if ((code->flags & PCRE2_DEREF_TABLES) != 0)
+    {
+    /* Decoded tables belong to the codes after deserialization, and they must
+    be freed when there are no more reference to them. The *ref_count should
+    always be > 0. */
+
+    ref_count = (PCRE2_SIZE *)(code->tables + tables_length);
+    if (*ref_count > 0)
+      {
+      (*ref_count)--;
+      if (*ref_count == 0)
+        code->memctl.free((void *)code->tables, code->memctl.memory_data);
+      }
+    }
+
+  code->memctl.free(code, code->memctl.memory_data);
+  }
+}
+
+
+
+/*************************************************
+*        Insert an automatic callout point       *
+*************************************************/
+
+/* This function is called when the PCRE2_AUTO_CALLOUT option is set, to insert
+callout points before each pattern item.
+
+Arguments:
+  code           current code pointer
+  ptr            current pattern pointer
+  cb             general compile-time data
+
+Returns:         new code pointer
+*/
+
+static PCRE2_UCHAR *
+auto_callout(PCRE2_UCHAR *code, PCRE2_SPTR ptr, compile_block *cb)
+{
+code[0] = OP_CALLOUT;
+PUT(code, 1, ptr - cb->start_pattern);  /* Pattern offset */
+PUT(code, 1 + LINK_SIZE, 0);            /* Default length */
+code[1 + 2*LINK_SIZE] = 255;
+return code + PRIV(OP_lengths)[OP_CALLOUT];
+}
+
+
+
+/*************************************************
+*         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
+  cb                 general compile-time data
+
+Returns:             nothing
+*/
+
+static void
+complete_callout(PCRE2_UCHAR *previous_callout, PCRE2_SPTR ptr,
+  compile_block *cb)
+{
+size_t length = ptr - cb->start_pattern - GET(previous_callout, 1);
+PUT(previous_callout, 1 + LINK_SIZE, length);
+}
+
+
+
+/*************************************************
+*        Find the fixed length of a branch       *
+*************************************************/
+
+/* Scan a branch and compute the fixed length of subject that will match it, if
+the length is fixed. This is needed for dealing with lookbehind assertions. In
+UTF mode, the result is in code units rather than bytes. The branch is
+temporarily terminated with OP_END when this function is called.
+
+This function is called when a lookbehind assertion is encountered, so that if
+it fails, the error message can point to the correct place in the pattern.
+However, we cannot do this when the assertion contains subroutine calls,
+because they can be forward references. We solve this by remembering this case
+and doing the check at the end; a flag specifies which mode we are running in.
+
+Lookbehind lengths are held in 16-bit fields and the maximum value is defined
+as LOOKBEHIND_MAX.
+
+Arguments:
+  code        points to the start of the pattern (the bracket)
+  utf         TRUE in UTF mode
+  atend       TRUE if called when the pattern is complete
+  cb          the "compile data" structure
+  recurses    chain of recurse_check to catch mutual recursion
+  countptr    pointer to counter, to catch over-complexity
+
+Returns:   if non-negative, the fixed length,
+             or -1 if an OP_RECURSE item was encountered and atend is FALSE
+             or -2 if there is no fixed length,
+             or -3 if \C was encountered (in UTF-8 mode only)
+             or -4 length is too long
+             or -5 if an unknown opcode was encountered (internal error)
+*/
+
+#define FFL_LATER           (-1)
+#define FFL_NOTFIXED        (-2)
+#define FFL_BACKSLASHC      (-3)
+#define FFL_TOOLONG         (-4)
+#define FFL_TOOCOMPLICATED  (-5)
+#define FFL_UNKNOWNOP       (-6)
+
+static int
+find_fixedlength(PCRE2_UCHAR *code, BOOL utf, BOOL atend, compile_block *cb,
+  recurse_check *recurses, int *countptr)
+{
+int length = -1;
+uint32_t group = 0;
+uint32_t groupinfo = 0;
+recurse_check this_recurse;
+register int branchlength = 0;
+register PCRE2_UCHAR *cc = code + 1 + LINK_SIZE;
+
+/* If this is a capturing group, we may have the answer cached, but we can only
+use this information if there are no (?| groups in the pattern, because
+otherwise group numbers are not unique. */
+
+if (*code == OP_CBRA || *code == OP_CBRAPOS || *code == OP_SCBRA ||
+    *code == OP_SCBRAPOS)
+  {
+  group = GET2(cc, 0);
+  cc += IMM2_SIZE;
+  groupinfo = cb->groupinfo[group];
+  if ((cb->external_flags & PCRE2_DUPCAPUSED) == 0)
+    {
+    if ((groupinfo & GI_NOT_FIXED_LENGTH) != 0) return FFL_NOTFIXED;
+    if ((groupinfo & GI_SET_FIXED_LENGTH) != 0)
+      return groupinfo & GI_FIXED_LENGTH_MASK;
+    }
+  }
+
+/* A large and/or complex regex can take too long to process. This can happen
+more often when (?| groups are present in the pattern. */
+
+if ((*countptr)++ > 2000) return FFL_TOOCOMPLICATED;
+
+/* 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;
+  PCRE2_UCHAR *ce, *cs;
+  register PCRE2_UCHAR op = *cc;
+
+  if (branchlength > LOOKBEHIND_MAX) return FFL_TOOLONG;
+
+  switch (op)
+    {
+    /* We only need to continue for OP_CBRA (normal capturing bracket) and
+    OP_BRA (normal non-capturing bracket) because the other variants of these
+    opcodes are all concerned with unlimited repeated groups, which of course
+    are not of fixed length. */
+
+    case OP_CBRA:
+    case OP_BRA:
+    case OP_ONCE:
+    case OP_ONCE_NC:
+    case OP_COND:
+    d = find_fixedlength(cc, utf, atend, cb, recurses, countptr);
+    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. An ACCEPT is effectively
+    an ALT. If it is END it's the end of the outer call. All can be handled by
+    the same code. Note that we must not include the OP_KETRxxx opcodes here,
+    because they all imply an unlimited repeat. */
+
+    case OP_ALT:
+    case OP_KET:
+    case OP_END:
+    case OP_ACCEPT:
+    case OP_ASSERT_ACCEPT:
+    if (length < 0) length = branchlength;
+      else if (length != branchlength) goto ISNOTFIXED;
+    if (*cc != OP_ALT)
+      {
+      if (group > 0)
+        {
+        groupinfo |= (GI_SET_FIXED_LENGTH | length);
+        cb->groupinfo[group] = groupinfo;
+        }
+      return length;
+      }
+    cc += 1 + LINK_SIZE;
+    branchlength = 0;
+    break;
+
+    /* A true recursion implies not fixed length, but a subroutine call may
+    be OK. If the subroutine is a forward reference, we can't deal with
+    it until the end of the pattern, so return FFL_LATER. */
+
+    case OP_RECURSE:
+    if (!atend) return FFL_LATER;
+    cs = ce = (PCRE2_UCHAR *)cb->start_code + GET(cc, 1); /* Start subpattern */
+    do ce += GET(ce, 1); while (*ce == OP_ALT);           /* End subpattern */
+    if (cc > cs && cc < ce) goto ISNOTFIXED;          /* Recursion */
+    else   /* Check for mutual recursion */
+      {
+      recurse_check *r = recurses;
+      for (r = recurses; r != NULL; r = r->prev) if (r->group == cs) break;
+      if (r != NULL) goto ISNOTFIXED;   /* Mutual recursion */
+      }
+    this_recurse.prev = recurses;
+    this_recurse.group = cs;
+    d = find_fixedlength(cs, utf, atend, cb, &this_recurse, countptr);
+    if (d < 0) return d;
+    branchlength += d;
+    cc += 1 + LINK_SIZE;
+    break;
+
+    /* Skip over assertive subpatterns. Note that we must increment cc by
+    1 + LINK_SIZE at the end, not by OP_length[*cc] because in a recursive
+    situation this assertion may be the one that is ultimately being checked
+    for having a fixed length, in which case its terminating OP_KET will have
+    been temporarily replaced by OP_END. */
+
+    case OP_ASSERT:
+    case OP_ASSERT_NOT:
+    case OP_ASSERTBACK:
+    case OP_ASSERTBACK_NOT:
+    do cc += GET(cc, 1); while (*cc == OP_ALT);
+    cc += 1 + LINK_SIZE;
+    break;
+
+    /* Skip over things that don't match chars */
+
+    case OP_MARK:
+    case OP_PRUNE_ARG:
+    case OP_SKIP_ARG:
+    case OP_THEN_ARG:
+    cc += cc[1] + PRIV(OP_lengths)[*cc];
+    break;
+
+    case OP_CALLOUT:
+    case OP_CIRC:
+    case OP_CIRCM:
+    case OP_CLOSE:
+    case OP_COMMIT:
+    case OP_CREF:
+    case OP_FALSE:
+    case OP_TRUE:
+    case OP_DNCREF:
+    case OP_DNRREF:
+    case OP_DOLL:
+    case OP_DOLLM:
+    case OP_EOD:
+    case OP_EODN:
+    case OP_FAIL:
+    case OP_NOT_WORD_BOUNDARY:
+    case OP_PRUNE:
+    case OP_REVERSE:
+    case OP_RREF:
+    case OP_SET_SOM:
+    case OP_SKIP:
+    case OP_SOD:
+    case OP_SOM:
+    case OP_THEN:
+    case OP_WORD_BOUNDARY:
+    cc += PRIV(OP_lengths)[*cc];
+    break;
+
+    case OP_CALLOUT_STR:
+    cc += GET(cc, 1 + 2*LINK_SIZE);
+    break;
+
+    /* Handle literal characters */
+
+    case OP_CHAR:
+    case OP_CHARI:
+    case OP_NOT:
+    case OP_NOTI:
+    branchlength++;
+    cc += 2;
+#ifdef SUPPORT_UNICODE
+    if (utf && HAS_EXTRALEN(cc[-1])) cc += GET_EXTRALEN(cc[-1]);
+#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:
+    case OP_EXACTI:
+    case OP_NOTEXACT:
+    case OP_NOTEXACTI:
+    branchlength += (int)GET2(cc,1);
+    cc += 2 + IMM2_SIZE;
+#ifdef SUPPORT_UNICODE
+    if (utf && HAS_EXTRALEN(cc[-1])) cc += GET_EXTRALEN(cc[-1]);
+#endif
+    break;
+
+    case OP_TYPEEXACT:
+    branchlength += GET2(cc,1);
+    if (cc[1 + IMM2_SIZE] == OP_PROP || cc[1 + IMM2_SIZE] == OP_NOTPROP)
+      cc += 2;
+    cc += 1 + IMM2_SIZE + 1;
+    break;
+
+    /* Handle single-char matchers */
+
+    case OP_PROP:
+    case OP_NOTPROP:
+    cc += 2;
+    /* Fall through */
+
+    case OP_HSPACE:
+    case OP_VSPACE:
+    case OP_NOT_HSPACE:
+    case OP_NOT_VSPACE:
+    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_ALLANY:
+    branchlength++;
+    cc++;
+    break;
+
+    /* The single-byte matcher isn't allowed. This only happens in UTF-8 mode;
+    otherwise \C is coded as OP_ALLANY. */
+
+    case OP_ANYBYTE:
+    return FFL_BACKSLASHC;
+
+    /* Check a class for variable quantification */
+
+    case OP_CLASS:
+    case OP_NCLASS:
+#ifdef SUPPORT_WIDE_CHARS
+    case OP_XCLASS:
+    /* The original code caused an unsigned overflow in 64 bit systems,
+    so now we use a conditional statement. */
+    if (op == OP_XCLASS)
+      cc += GET(cc, 1);
+    else
+      cc += PRIV(OP_lengths)[OP_CLASS];
+#else
+    cc += PRIV(OP_lengths)[OP_CLASS];
+#endif
+
+    switch (*cc)
+      {
+      case OP_CRSTAR:
+      case OP_CRMINSTAR:
+      case OP_CRPLUS:
+      case OP_CRMINPLUS:
+      case OP_CRQUERY:
+      case OP_CRMINQUERY:
+      case OP_CRPOSSTAR:
+      case OP_CRPOSPLUS:
+      case OP_CRPOSQUERY:
+      goto ISNOTFIXED;
+
+      case OP_CRRANGE:
+      case OP_CRMINRANGE:
+      case OP_CRPOSRANGE:
+      if (GET2(cc,1) != GET2(cc,1+IMM2_SIZE)) goto ISNOTFIXED;
+      branchlength += (int)GET2(cc,1);
+      cc += 1 + 2 * IMM2_SIZE;
+      break;
+
+      default:
+      branchlength++;
+      }
+    break;
+
+    /* Anything else is variable length */
+
+    case OP_ANYNL:
+    case OP_BRAMINZERO:
+    case OP_BRAPOS:
+    case OP_BRAPOSZERO:
+    case OP_BRAZERO:
+    case OP_CBRAPOS:
+    case OP_EXTUNI:
+    case OP_KETRMAX:
+    case OP_KETRMIN:
+    case OP_KETRPOS:
+    case OP_MINPLUS:
+    case OP_MINPLUSI:
+    case OP_MINQUERY:
+    case OP_MINQUERYI:
+    case OP_MINSTAR:
+    case OP_MINSTARI:
+    case OP_MINUPTO:
+    case OP_MINUPTOI:
+    case OP_NOTMINPLUS:
+    case OP_NOTMINPLUSI:
+    case OP_NOTMINQUERY:
+    case OP_NOTMINQUERYI:
+    case OP_NOTMINSTAR:
+    case OP_NOTMINSTARI:
+    case OP_NOTMINUPTO:
+    case OP_NOTMINUPTOI:
+    case OP_NOTPLUS:
+    case OP_NOTPLUSI:
+    case OP_NOTPOSPLUS:
+    case OP_NOTPOSPLUSI:
+    case OP_NOTPOSQUERY:
+    case OP_NOTPOSQUERYI:
+    case OP_NOTPOSSTAR:
+    case OP_NOTPOSSTARI:
+    case OP_NOTPOSUPTO:
+    case OP_NOTPOSUPTOI:
+    case OP_NOTQUERY:
+    case OP_NOTQUERYI:
+    case OP_NOTSTAR:
+    case OP_NOTSTARI:
+    case OP_NOTUPTO:
+    case OP_NOTUPTOI:
+    case OP_PLUS:
+    case OP_PLUSI:
+    case OP_POSPLUS:
+    case OP_POSPLUSI:
+    case OP_POSQUERY:
+    case OP_POSQUERYI:
+    case OP_POSSTAR:
+    case OP_POSSTARI:
+    case OP_POSUPTO:
+    case OP_POSUPTOI:
+    case OP_QUERY:
+    case OP_QUERYI:
+    case OP_REF:
+    case OP_REFI:
+    case OP_DNREF:
+    case OP_DNREFI:
+    case OP_SBRA:
+    case OP_SBRAPOS:
+    case OP_SCBRA:
+    case OP_SCBRAPOS:
+    case OP_SCOND:
+    case OP_SKIPZERO:
+    case OP_STAR:
+    case OP_STARI:
+    case OP_TYPEMINPLUS:
+    case OP_TYPEMINQUERY:
+    case OP_TYPEMINSTAR:
+    case OP_TYPEMINUPTO:
+    case OP_TYPEPLUS:
+    case OP_TYPEPOSPLUS:
+    case OP_TYPEPOSQUERY:
+    case OP_TYPEPOSSTAR:
+    case OP_TYPEPOSUPTO:
+    case OP_TYPEQUERY:
+    case OP_TYPESTAR:
+    case OP_TYPEUPTO:
+    case OP_UPTO:
+    case OP_UPTOI:
+    goto ISNOTFIXED;
+
+    /* Catch unrecognized opcodes so that when new ones are added they
+    are not forgotten, as has happened in the past. */
+
+    default:
+    return FFL_UNKNOWNOP;
+    }
+  }
+/* Control never gets here except by goto. */
+
+ISNOTFIXED:
+if (group > 0)
+  {
+  groupinfo |= GI_NOT_FIXED_LENGTH;
+  cb->groupinfo[group] = groupinfo;
+  }
+return FFL_NOTFIXED;
+}
+
+
+
+/*************************************************
+*      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, 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
+  skipassert   TRUE if certain assertions are to be skipped
+
+Returns:       pointer to the first significant opcode
+*/
+
+static const PCRE2_UCHAR*
+first_significant_code(PCRE2_SPTR code, BOOL skipassert)
+{
+for (;;)
+  {
+  switch ((int)*code)
+    {
+    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 += PRIV(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_DNCREF:
+    case OP_RREF:
+    case OP_DNRREF:
+    case OP_FALSE:
+    case OP_TRUE:
+    code += PRIV(OP_lengths)[*code];
+    break;
+
+    case OP_CALLOUT_STR:
+    code += GET(code, 1 + 2*LINK_SIZE);
+    break;
+
+    default:
+    return code;
+    }
+  }
+/* Control never reaches here */
+}
+
+
+
+/*************************************************
+*    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. It is called at the end of compiling to check the
+entire pattern, and from compile_branch() when checking for an unlimited repeat
+of a group that can match nothing. In the latter case it is called only when
+doing the real compile, not during the pre-compile that measures the size of
+the compiled pattern.
+
+Note that first_significant_code() skips over backward and negative forward
+assertions when its final argument is TRUE. 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
+  utf         TRUE if in UTF mode
+  cb          compile data
+  atend       TRUE if being called to check an entire pattern
+  recurses    chain of recurse_check to catch mutual recursion
+  countptr    pointer to count to catch over-complicated pattern
+
+Returns:      0 if what is matched cannot be empty
+              1 if what is matched could be empty
+             -1 if the pattern is too complicated
+*/
+
+#define CBE_NOTEMPTY          0
+#define CBE_EMPTY             1
+#define CBE_TOOCOMPLICATED  (-1)
+
+
+static int
+could_be_empty_branch(PCRE2_SPTR code, PCRE2_SPTR endcode, BOOL utf,
+  compile_block *cb, BOOL atend, recurse_check *recurses, int *countptr)
+{
+uint32_t group = 0;
+uint32_t groupinfo = 0;
+register PCRE2_UCHAR c;
+recurse_check this_recurse;
+
+/* If what we are checking has already been set as "could be empty", we know
+the answer. */
+
+if (*code >= OP_SBRA && *code <= OP_SCOND) return CBE_EMPTY;
+
+/* If this is a capturing group, we may have the answer cached, but we can only
+use this information if there are no (?| groups in the pattern, because
+otherwise group numbers are not unique. */
+
+if ((cb->external_flags & PCRE2_DUPCAPUSED) == 0 &&
+    (*code == OP_CBRA || *code == OP_CBRAPOS))
+  {
+  group = GET2(code, 1 + LINK_SIZE);
+  groupinfo = cb->groupinfo[group];
+  if ((groupinfo & GI_SET_COULD_BE_EMPTY) != 0)
+    return ((groupinfo & GI_COULD_BE_EMPTY) != 0)? CBE_EMPTY : CBE_NOTEMPTY;
+  }
+
+/* A large and/or complex regex can take too long to process. We have to assume
+it can match an empty string. This can happen more often when (?| groups are
+present in the pattern and the caching is disabled. Setting the cap at 1100
+allows the test for more than 1023 capturing patterns to work. */
+
+if ((*countptr)++ > 1100) return CBE_TOOCOMPLICATED;
+
+/* Scan the opcodes for this branch. */
+
+for (code = first_significant_code(code + PRIV(OP_lengths)[*code], TRUE);
+     code < endcode;
+     code = first_significant_code(code + PRIV(OP_lengths)[c], TRUE))
+  {
+  PCRE2_SPTR ccode;
+
+  c = *code;
+
+  /* Skip over forward assertions; the other assertions are skipped by
+  first_significant_code() with a TRUE final argument. */
+
+  if (c == OP_ASSERT)
+    {
+    do code += GET(code, 1); while (*code == OP_ALT);
+    c = *code;
+    continue;
+    }
+
+  /* For a recursion/subroutine call we can scan the recursion when this
+  function is called at the end, to check a complete pattern. Before then,
+  recursions just have the group number as their argument and in any case may
+  be forward references. In that situation, we return CBE_EMPTY, just in case.
+  It means that unlimited repeats of groups that contain recursions are always
+  treated as "could be empty" - which just adds a bit more processing time
+  because of the runtime check. */
+
+  if (c == OP_RECURSE)
+    {
+    PCRE2_SPTR scode, endgroup;
+    BOOL empty_branch;
+
+    if (!atend) goto ISTRUE;
+    scode = cb->start_code + GET(code, 1);
+    endgroup = scode;
+
+    /* We need to detect whether this is a recursive call, as otherwise there
+    will be an infinite loop. If it is a recursion, just skip over it. Simple
+    recursions are easily detected. For mutual recursions we keep a chain on
+    the stack. */
+
+    do endgroup += GET(endgroup, 1); while (*endgroup == OP_ALT);
+    if (code >= scode && code <= endgroup) continue;  /* Simple recursion */
+    else
+      {
+      recurse_check *r = recurses;
+      for (r = recurses; r != NULL; r = r->prev)
+        if (r->group == scode) break;
+      if (r != NULL) continue;   /* Mutual recursion */
+      }
+
+    /* Scan the referenced group, remembering it on the stack chain to detect
+    mutual recursions. */
+
+    empty_branch = FALSE;
+    this_recurse.prev = recurses;
+    this_recurse.group = scode;
+
+    do
+      {
+      int rc = could_be_empty_branch(scode, endcode, utf, cb, atend,
+        &this_recurse, countptr);
+      if (rc < 0) return rc;
+      if (rc > 0)
+        {
+        empty_branch = TRUE;
+        break;
+        }
+      scode += GET(scode, 1);
+      }
+    while (*scode == OP_ALT);
+
+    if (!empty_branch) goto ISFALSE;  /* All branches are non-empty */
+    continue;
+    }
+
+  /* Groups with zero repeats can of course be empty; skip them. */
+
+  if (c == OP_BRAZERO || c == OP_BRAMINZERO || c == OP_SKIPZERO ||
+      c == OP_BRAPOSZERO)
+    {
+    code += PRIV(OP_lengths)[c];
+    do code += GET(code, 1); while (*code == OP_ALT);
+    c = *code;
+    continue;
+    }
+
+  /* A nested group that is already marked as "could be empty" can just be
+  skipped. */
+
+  if (c == OP_SBRA  || c == OP_SBRAPOS ||
+      c == OP_SCBRA || c == OP_SCBRAPOS)
+    {
+    do code += GET(code, 1); while (*code == OP_ALT);
+    c = *code;
+    continue;
+    }
+
+  /* For other groups, scan the branches. */
+
+  if (c == OP_BRA  || c == OP_BRAPOS ||
+      c == OP_CBRA || c == OP_CBRAPOS ||
+      c == OP_ONCE || c == OP_ONCE_NC ||
+      c == OP_COND || c == OP_SCOND)
+    {
+    BOOL empty_branch;
+    if (GET(code, 1) == 0) goto ISTRUE;    /* Hit unclosed bracket */
+
+    /* If a conditional group has only one branch, there is a second, implied,
+    empty branch, so just skip over the conditional, because it could be empty.
+    Otherwise, scan the individual branches of the group. */
+
+    if (c == OP_COND && code[GET(code, 1)] != OP_ALT)
+      code += GET(code, 1);
+    else
+      {
+      empty_branch = FALSE;
+      do
+        {
+        if (!empty_branch)
+          {
+          int rc = could_be_empty_branch(code, endcode, utf, cb, atend,
+            recurses, countptr);
+          if (rc < 0) return rc;
+          if (rc > 0) empty_branch = TRUE;
+          }
+        code += GET(code, 1);
+        }
+      while (*code == OP_ALT);
+      if (!empty_branch) goto ISFALSE;   /* All branches are non-empty */
+      }
+
+    c = *code;
+    continue;
+    }
+
+  /* Handle the other opcodes */
+
+  switch (c)
+    {
+    /* Check for quantifiers after a class. XCLASS is used for classes that
+    cannot be represented just by a bit map. This includes negated single
+    high-valued characters. The length in PRIV(OP_lengths)[] is zero; the
+    actual length is stored in the compiled code, so we must update "code"
+    here. */
+
+#if defined SUPPORT_UNICODE || PCRE2_CODE_UNIT_WIDTH != 8
+    case OP_XCLASS:
+    ccode = code += GET(code, 1);
+    goto CHECK_CLASS_REPEAT;
+#endif
+
+    case OP_CLASS:
+    case OP_NCLASS:
+    ccode = code + PRIV(OP_lengths)[OP_CLASS];
+
+#if defined SUPPORT_UNICODE || PCRE2_CODE_UNIT_WIDTH != 8
+    CHECK_CLASS_REPEAT:
+#endif
+
+    switch (*ccode)
+      {
+      case OP_CRSTAR:            /* These could be empty; continue */
+      case OP_CRMINSTAR:
+      case OP_CRQUERY:
+      case OP_CRMINQUERY:
+      case OP_CRPOSSTAR:
+      case OP_CRPOSQUERY:
+      break;
+
+      default:                   /* Non-repeat => class must match */
+      case OP_CRPLUS:            /* These repeats aren't empty */
+      case OP_CRMINPLUS:
+      case OP_CRPOSPLUS:
+      goto ISFALSE;
+
+      case OP_CRRANGE:
+      case OP_CRMINRANGE:
+      case OP_CRPOSRANGE:
+      if (GET2(ccode, 1) > 0) goto ISFALSE;  /* Minimum > 0 */
+      break;
+      }
+    break;
+
+    /* Opcodes that must match a character */
+
+    case OP_ANY:
+    case OP_ALLANY:
+    case OP_ANYBYTE:
+
+    case OP_PROP:
+    case OP_NOTPROP:
+    case OP_ANYNL:
+
+    case OP_NOT_HSPACE:
+    case OP_HSPACE:
+    case OP_NOT_VSPACE:
+    case OP_VSPACE:
+    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_CHAR:
+    case OP_CHARI:
+    case OP_NOT:
+    case OP_NOTI:
+
+    case OP_PLUS:
+    case OP_PLUSI:
+    case OP_MINPLUS:
+    case OP_MINPLUSI:
+
+    case OP_NOTPLUS:
+    case OP_NOTPLUSI:
+    case OP_NOTMINPLUS:
+    case OP_NOTMINPLUSI:
+
+    case OP_POSPLUS:
+    case OP_POSPLUSI:
+    case OP_NOTPOSPLUS:
+    case OP_NOTPOSPLUSI:
+
+    case OP_EXACT:
+    case OP_EXACTI:
+    case OP_NOTEXACT:
+    case OP_NOTEXACTI:
+
+    case OP_TYPEPLUS:
+    case OP_TYPEMINPLUS:
+    case OP_TYPEPOSPLUS:
+    case OP_TYPEEXACT:
+    goto ISFALSE;
+
+    /* These are going to continue, as they may be empty, but we have to
+    fudge the length for the \p and \P cases. */
+
+    case OP_TYPESTAR:
+    case OP_TYPEMINSTAR:
+    case OP_TYPEPOSSTAR:
+    case OP_TYPEQUERY:
+    case OP_TYPEMINQUERY:
+    case OP_TYPEPOSQUERY:
+    if (code[1] == OP_PROP || code[1] == OP_NOTPROP) code += 2;
+    break;
+
+    /* Same for these */
+
+    case OP_TYPEUPTO:
+    case OP_TYPEMINUPTO:
+    case OP_TYPEPOSUPTO:
+    if (code[1 + IMM2_SIZE] == OP_PROP || code[1 + IMM2_SIZE] == OP_NOTPROP)
+      code += 2;
+    break;
+
+    /* End of branch */
+
+    case OP_KET:
+    case OP_KETRMAX:
+    case OP_KETRMIN:
+    case OP_KETRPOS:
+    case OP_ALT:
+    goto ISTRUE;
+
+    /* In UTF-8 or UTF-16 mode, STAR, MINSTAR, POSSTAR, QUERY, MINQUERY,
+    POSQUERY, UPTO, MINUPTO, and POSUPTO and their caseless and negative
+    versions may be followed by a multibyte character. */
+
+#ifdef MAYBE_UTF_MULTI
+    case OP_STAR:
+    case OP_STARI:
+    case OP_NOTSTAR:
+    case OP_NOTSTARI:
+
+    case OP_MINSTAR:
+    case OP_MINSTARI:
+    case OP_NOTMINSTAR:
+    case OP_NOTMINSTARI:
+
+    case OP_POSSTAR:
+    case OP_POSSTARI:
+    case OP_NOTPOSSTAR:
+    case OP_NOTPOSSTARI:
+
+    case OP_QUERY:
+    case OP_QUERYI:
+    case OP_NOTQUERY:
+    case OP_NOTQUERYI:
+
+    case OP_MINQUERY:
+    case OP_MINQUERYI:
+    case OP_NOTMINQUERY:
+    case OP_NOTMINQUERYI:
+
+    case OP_POSQUERY:
+    case OP_POSQUERYI:
+    case OP_NOTPOSQUERY:
+    case OP_NOTPOSQUERYI:
+    if (utf && HAS_EXTRALEN(code[1])) code += GET_EXTRALEN(code[1]);
+    break;
+
+    case OP_UPTO:
+    case OP_UPTOI:
+    case OP_NOTUPTO:
+    case OP_NOTUPTOI:
+
+    case OP_MINUPTO:
+    case OP_MINUPTOI:
+    case OP_NOTMINUPTO:
+    case OP_NOTMINUPTOI:
+
+    case OP_POSUPTO:
+    case OP_POSUPTOI:
+    case OP_NOTPOSUPTO:
+    case OP_NOTPOSUPTOI:
+    if (utf && HAS_EXTRALEN(code[1 + IMM2_SIZE])) code += GET_EXTRALEN(code[1 + IMM2_SIZE]);
+    break;
+#endif  /* MAYBE_UTF_MULTI */
+
+    /* MARK, and PRUNE/SKIP/THEN with an argument must skip over the argument
+    string. */
+
+    case OP_MARK:
+    case OP_PRUNE_ARG:
+    case OP_SKIP_ARG:
+    case OP_THEN_ARG:
+    code += code[1];
+    break;
+
+    /* None of the remaining opcodes are required to match a character. */
+
+    default:
+    break;
+    }
+  }
+
+ISTRUE:
+groupinfo |= GI_COULD_BE_EMPTY;
+
+ISFALSE:
+if (group > 0) cb->groupinfo[group] = groupinfo | GI_SET_COULD_BE_EMPTY;
+
+return ((groupinfo & GI_COULD_BE_EMPTY) != 0)? CBE_EMPTY : CBE_NOTEMPTY;
+}
+
+
+
+/*************************************************
+*            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, that
+is, one of the forms {ddd} {ddd,} or {ddd,ddd} where the ddds are digits.
+
+Argument:   pointer to the first char after '{'
+Returns:    TRUE or FALSE
+*/
+
+static BOOL
+is_counted_repeat(PCRE2_SPTR p)
+{
+if (!IS_DIGIT(*p)) return FALSE;
+p++;
+while (IS_DIGIT(*p)) p++;
+if (*p == CHAR_RIGHT_CURLY_BRACKET) return TRUE;
+
+if (*p++ != CHAR_COMMA) return FALSE;
+if (*p == CHAR_RIGHT_CURLY_BRACKET) return TRUE;
+
+if (!IS_DIGIT(*p)) return FALSE;
+p++;
+while (IS_DIGIT(*p)) p++;
+
+return (*p == CHAR_RIGHT_CURLY_BRACKET);
+}
+
+
+
+/*************************************************
+*            Handle escapes                      *
+*************************************************/
+
+/* This function is called when a \ has been encountered. It either returns a
+positive value for a simple escape such as \d, or 0 for a data character, which
+is placed in chptr. A backreference to group n is returned as negative n. On
+entry, ptr is pointing at the \. On exit, it points the final code unit of the
+escape sequence.
+
+This function is also called from pcre2_substitute() to handle escape sequences
+in replacement strings. In this case, the cb argument is NULL, and only
+sequences that define a data character are recognised. The isclass argument is
+not relevant, but the options argument is the final value of the compiled
+pattern's options.
+
+There is one "trick" case: when a sequence such as [[:>:]] or \s in UCP mode is
+processed, it is replaced by a nested alternative sequence. If this contains a
+backslash (which is usually does), ptrend does not point to its end - it still
+points to the end of the whole pattern. However, we can detect this case
+because cb->nestptr[0] will be non-NULL. The nested sequences are all zero-
+terminated and there are only ever two levels of nesting.
+
+Arguments:
+  ptrptr         points to the input position pointer
+  ptrend         points to the end of the input
+  chptr          points to a returned data character
+  errorcodeptr   points to the errorcode variable (containing zero)
+  options        the current options bits
+  isclass        TRUE if inside a character class
+  cb             compile data block
+
+Returns:         zero => a data character
+                 positive => a special escape sequence
+                 negative => a back reference
+                 on error, errorcodeptr is set non-zero
+*/
+
+int
+PRIV(check_escape)(PCRE2_SPTR *ptrptr, PCRE2_SPTR ptrend, uint32_t *chptr,
+  int *errorcodeptr, uint32_t options, BOOL isclass, compile_block *cb)
+{
+BOOL utf = (options & PCRE2_UTF) != 0;
+PCRE2_SPTR ptr = *ptrptr + 1;
+register uint32_t c, cc;
+int escape = 0;
+int i;
+
+/* Find the end of a nested insert. */
+
+if (cb != NULL && cb->nestptr[0] != NULL)
+  ptrend = ptr + PRIV(strlen)(ptr);
+
+/* If backslash is at the end of the string, it's an error. */
+
+if (ptr >= ptrend)
+  {
+  *errorcodeptr = ERR1;
+  return 0;
+  }
+
+GETCHARINCTEST(c, ptr);         /* Get character value, increment pointer */
+ptr--;                          /* Set pointer back to the last code unit */
+
+/* Non-alphanumerics are literals, so we just leave the value in c. An initial
+value test saves a memory lookup for code points outside the alphanumeric
+range. Otherwise, do a table lookup. A non-zero result is something that can be
+returned immediately. Otherwise further processing is required. */
+
+if (c < ESCAPES_FIRST || c > ESCAPES_LAST) {}  /* Definitely literal */
+
+else if ((i = escapes[c - ESCAPES_FIRST]) != 0)
+  {
+  if (i > 0) c = (uint32_t)i; else  /* Positive is a data character */
+    {
+    escape = -i;                    /* Else return a special escape */
+    if (escape == ESC_P || escape == ESC_p || escape == ESC_X)
+      cb->external_flags |= PCRE2_HASBKPORX;   /* Note \P, \p, or \X */
+    }
+  }
+
+/* Escapes that need further processing, including those that are unknown.
+When called from pcre2_substitute(), only \c, \o, and \x are recognized (and \u
+when BSUX is set). */
+
+else
+  {
+  PCRE2_SPTR oldptr;
+  BOOL braced, negated, overflow;
+  unsigned int s;
+
+  /* Filter calls from pcre2_substitute(). */
+
+  if (cb == NULL && c != CHAR_c && c != CHAR_o && c != CHAR_x &&
+      (c != CHAR_u || (options & PCRE2_ALT_BSUX) != 0))
+    {
+    *errorcodeptr = ERR3;
+    return 0;
+    }
+
+  switch (c)
+    {
+    /* A number of Perl escapes are not handled by PCRE. We give an explicit
+    error. */
+
+    case CHAR_l:
+    case CHAR_L:
+    *errorcodeptr = ERR37;
+    break;
+
+    /* \u is unrecognized when PCRE2_ALT_BSUX is not set. When it is treated
+    specially, \u must be followed by four hex digits. Otherwise it is a
+    lowercase u letter. */
+
+    case CHAR_u:
+    if ((options & PCRE2_ALT_BSUX) == 0) *errorcodeptr = ERR37; else
+      {
+      uint32_t xc;
+      if ((cc = XDIGIT(ptr[1])) == 0xff) break;  /* Not a hex digit */
+      if ((xc = XDIGIT(ptr[2])) == 0xff) break;  /* Not a hex digit */
+      cc = (cc << 4) | xc;
+      if ((xc = XDIGIT(ptr[3])) == 0xff) break;  /* Not a hex digit */
+      cc = (cc << 4) | xc;
+      if ((xc = XDIGIT(ptr[4])) == 0xff) break;  /* Not a hex digit */
+      c = (cc << 4) | xc;
+      ptr += 4;
+      if (utf)
+        {
+        if (c > 0x10ffffU) *errorcodeptr = ERR77;
+          else if (c >= 0xd800 && c <= 0xdfff) *errorcodeptr = ERR73;
+        }
+      else if (c > MAX_NON_UTF_CHAR) *errorcodeptr = ERR77;
+      }
+    break;
+
+    case CHAR_U:
+    /* \U is unrecognized unless PCRE2_ALT_BSUX is set, in which case it is an
+    upper case letter. */
+    if ((options & PCRE2_ALT_BSUX) == 0) *errorcodeptr = ERR37;
+    break;
+
+    /* In a character class, \g is just a literal "g". Outside a character
+    class, \g must be followed by one of a number of specific things:
+
+    (1) A number, either plain or braced. If positive, it is an absolute
+    backreference. If negative, it is a relative backreference. This is a Perl
+    5.10 feature.
+
+    (2) Perl 5.10 also supports \g{name} as a reference to a named group. This
+    is part of Perl's movement towards a unified syntax for back references. As
+    this is synonymous with \k{name}, we fudge it up by pretending it really
+    was \k.
+
+    (3) For Oniguruma compatibility we also support \g followed by a name or a
+    number either in angle brackets or in single quotes. However, these are
+    (possibly recursive) subroutine calls, _not_ backreferences. Just return
+    the ESC_g code (cf \k). */
+
+    case CHAR_g:
+    if (isclass) break;
+    if (ptr[1] == CHAR_LESS_THAN_SIGN || ptr[1] == CHAR_APOSTROPHE)
+      {
+      escape = ESC_g;
+      break;
+      }
+
+    /* Handle the Perl-compatible cases */
+
+    if (ptr[1] == CHAR_LEFT_CURLY_BRACKET)
+      {
+      PCRE2_SPTR p;
+      for (p = ptr+2; *p != CHAR_NULL && *p != CHAR_RIGHT_CURLY_BRACKET; p++)
+        if (*p != CHAR_MINUS && !IS_DIGIT(*p)) break;
+      if (*p != CHAR_NULL && *p != CHAR_RIGHT_CURLY_BRACKET)
+        {
+        escape = ESC_k;
+        break;
+        }
+      braced = TRUE;
+      ptr++;
+      }
+    else braced = FALSE;
+
+    if (ptr[1] == CHAR_MINUS)
+      {
+      negated = TRUE;
+      ptr++;
+      }
+    else negated = FALSE;
+
+    /* The integer range is limited by the machine's int representation. */
+    s = 0;
+    overflow = FALSE;
+    while (IS_DIGIT(ptr[1]))
+      {
+      if (s > INT_MAX / 10 - 1) /* Integer overflow */
+        {
+        overflow = TRUE;
+        break;
+        }
+      s = s * 10 + (int)(*(++ptr) - CHAR_0);
+      }
+    if (overflow) /* Integer overflow */
+      {
+      while (IS_DIGIT(ptr[1])) ptr++;
+      *errorcodeptr = ERR61;
+      break;
+      }
+
+    if (braced && *(++ptr) != CHAR_RIGHT_CURLY_BRACKET)
+      {
+      *errorcodeptr = ERR57;
+      break;
+      }
+
+    if (s == 0)
+      {
+      *errorcodeptr = ERR58;
+      break;
+      }
+
+    if (negated)
+      {
+      if (s > cb->bracount)
+        {
+        *errorcodeptr = ERR15;
+        break;
+        }
+      s = cb->bracount - (s - 1);
+      }
+
+    escape = -(int)s;
+    break;
+
+    /* The handling of escape sequences consisting of a string of digits
+    starting with one that is not zero is not straightforward. Perl has changed
+    over the years. Nowadays \g{} for backreferences and \o{} for octal are
+    recommended to avoid the ambiguities in the old syntax.
+
+    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, it is a back reference. Otherwise, up to three octal digits are
+    read to form an escaped character code. Thus \123 is likely to be octal 123
+    (cf \0123, which is octal 012 followed by the literal 3).
+
+    Inside a character class, \ followed by a digit is always either a literal
+    8 or 9 or an octal number. */
+
+    case CHAR_1: case CHAR_2: case CHAR_3: case CHAR_4: case CHAR_5:
+    case CHAR_6: case CHAR_7: case CHAR_8: case CHAR_9:
+
+    if (!isclass)
+      {
+      oldptr = ptr;
+      /* The integer range is limited by the machine's int representation. */
+      s = c - CHAR_0;
+      overflow = FALSE;
+      while (IS_DIGIT(ptr[1]))
+        {
+        if (s > INT_MAX / 10 - 1) /* Integer overflow */
+          {
+          overflow = TRUE;
+          break;
+          }
+        s = s * 10 + (int)(*(++ptr) - CHAR_0);
+        }
+      if (overflow) /* Integer overflow */
+        {
+        while (IS_DIGIT(ptr[1])) ptr++;
+        *errorcodeptr = ERR61;
+        break;
+        }
+
+      /* \1 to \9 are always back references. \8x and \9x are too; \1x to \7x
+      are octal escapes if there are not that many previous captures. */
+
+      if (s < 10 || *oldptr >= CHAR_8 || s <= cb->bracount)
+        {
+        escape = -(int)s;     /* Indicates a back reference */
+        break;
+        }
+      ptr = oldptr;      /* Put the pointer back and fall through */
+      }
+
+    /* Handle a digit following \ when the number is not a back reference, or
+    we are within a character class. If the first digit is 8 or 9, Perl used to
+    generate a binary zero byte and then treat the digit as a following
+    literal. At least by Perl 5.18 this changed so as not to insert the binary
+    zero. */
+
+    if ((c = *ptr) >= CHAR_8) break;
+
+    /* Fall through with a digit less than 8 */
+
+    /* \0 always starts an octal number, but we may drop through to here with a
+    larger first octal digit. The original code used just to take the least
+    significant 8 bits of octal numbers (I think this is what early Perls used
+    to do). Nowadays we allow for larger numbers in UTF-8 mode and 16-bit mode,
+    but no more than 3 octal digits. */
+
+    case CHAR_0:
+    c -= CHAR_0;
+    while(i++ < 2 && ptr[1] >= CHAR_0 && ptr[1] <= CHAR_7)
+        c = c * 8 + *(++ptr) - CHAR_0;
+#if PCRE2_CODE_UNIT_WIDTH == 8
+    if (!utf && c > 0xff) *errorcodeptr = ERR51;
+#endif
+    break;
+
+    /* \o is a relatively new Perl feature, supporting a more general way of
+    specifying character codes in octal. The only supported form is \o{ddd}. */
+
+    case CHAR_o:
+    if (ptr[1] != CHAR_LEFT_CURLY_BRACKET) *errorcodeptr = ERR55; else
+    if (ptr[2] == CHAR_RIGHT_CURLY_BRACKET) *errorcodeptr = ERR78; else
+      {
+      ptr += 2;
+      c = 0;
+      overflow = FALSE;
+      while (*ptr >= CHAR_0 && *ptr <= CHAR_7)
+        {
+        cc = *ptr++;
+        if (c == 0 && cc == CHAR_0) continue;     /* Leading zeroes */
+#if PCRE2_CODE_UNIT_WIDTH == 32
+        if (c >= 0x20000000l) { overflow = TRUE; break; }
+#endif
+        c = (c << 3) + (cc - CHAR_0);
+#if PCRE2_CODE_UNIT_WIDTH == 8
+        if (c > (utf ? 0x10ffffU : 0xffU)) { overflow = TRUE; break; }
+#elif PCRE2_CODE_UNIT_WIDTH == 16
+        if (c > (utf ? 0x10ffffU : 0xffffU)) { overflow = TRUE; break; }
+#elif PCRE2_CODE_UNIT_WIDTH == 32
+        if (utf && c > 0x10ffffU) { overflow = TRUE; break; }
+#endif
+        }
+      if (overflow)
+        {
+        while (*ptr >= CHAR_0 && *ptr <= CHAR_7) ptr++;
+        *errorcodeptr = ERR34;
+        }
+      else if (*ptr == CHAR_RIGHT_CURLY_BRACKET)
+        {
+        if (utf && c >= 0xd800 && c <= 0xdfff) *errorcodeptr = ERR73;
+        }
+      else *errorcodeptr = ERR64;
+      }
+    break;
+
+    /* \x is complicated. When PCRE2_ALT_BSUX is set, \x must be followed by
+    two hexadecimal digits. Otherwise it is a lowercase x letter. */
+
+    case CHAR_x:
+    if ((options & PCRE2_ALT_BSUX) != 0)
+      {
+      uint32_t xc;
+      if ((cc = XDIGIT(ptr[1])) == 0xff) break;  /* Not a hex digit */
+      if ((xc = XDIGIT(ptr[2])) == 0xff) break;  /* Not a hex digit */
+      c = (cc << 4) | xc;
+      ptr += 2;
+      }    /* End PCRE2_ALT_BSUX handling */
+
+    /* Handle \x in Perl's style. \x{ddd} is a character number which can be
+    greater than 0xff in UTF-8 or non-8bit mode, but only if the ddd are hex
+    digits. If not, { used to be treated as a data character. However, Perl
+    seems to read hex digits up to the first non-such, and ignore the rest, so
+    that, for example \x{zz} matches a binary zero. This seems crazy, so PCRE
+    now gives an error. */
+
+    else
+      {
+      if (ptr[1] == CHAR_LEFT_CURLY_BRACKET)
+        {
+        ptr += 2;
+        if (*ptr == CHAR_RIGHT_CURLY_BRACKET)
+          {
+          *errorcodeptr = ERR78;
+          break;
+          }
+        c = 0;
+        overflow = FALSE;
+
+        while ((cc = XDIGIT(*ptr)) != 0xff)
+          {
+          ptr++;
+          if (c == 0 && cc == 0) continue;   /* Leading zeroes */
+#if PCRE2_CODE_UNIT_WIDTH == 32
+          if (c >= 0x10000000l) { overflow = TRUE; break; }
+#endif
+          c = (c << 4) | cc;
+          if ((utf && c > 0x10ffffU) || (!utf && c > MAX_NON_UTF_CHAR))
+            {
+            overflow = TRUE;
+            break;
+            }
+          }
+
+        if (overflow)
+          {
+          while (XDIGIT(*ptr) != 0xff) ptr++;
+          *errorcodeptr = ERR34;
+          }
+        else if (*ptr == CHAR_RIGHT_CURLY_BRACKET)
+          {
+          if (utf && c >= 0xd800 && c <= 0xdfff) *errorcodeptr = ERR73;
+          }
+
+        /* If the sequence of hex digits does not end with '}', give an error.
+        We used just to recognize this construct and fall through to the normal
+        \x handling, but nowadays Perl gives an error, which seems much more
+        sensible, so we do too. */
+
+        else *errorcodeptr = ERR67;
+        }   /* End of \x{} processing */
+
+      /* Read a single-byte hex-defined char (up to two hex digits after \x) */
+
+      else
+        {
+        c = 0;
+        if ((cc = XDIGIT(ptr[1])) == 0xff) break;  /* Not a hex digit */
+        ptr++;
+        c = cc;
+        if ((cc = XDIGIT(ptr[1])) == 0xff) break;  /* Not a hex digit */
+        ptr++;
+        c = (c << 4) | cc;
+        }     /* End of \xdd handling */
+      }       /* End of Perl-style \x handling */
+    break;
+
+    /* The handling of \c is different in ASCII and EBCDIC environments. In an
+    ASCII (or Unicode) environment, an error is given if the character
+    following \c is not a printable ASCII character. Otherwise, the following
+    character is upper-cased if it is a letter, and after that the 0x40 bit is
+    flipped. The result is the value of the escape.
+
+    In an EBCDIC environment the handling of \c is compatible with the
+    specification in the perlebcdic document. The following character must be
+    a letter or one of small number of special characters. These provide a
+    means of defining the character values 0-31.
+
+    For testing the EBCDIC handling of \c in an ASCII environment, recognize
+    the EBCDIC value of 'c' explicitly. */
+
+#if defined EBCDIC && 'a' != 0x81
+    case 0x83:
+#else
+    case CHAR_c:
+#endif
+
+    c = *(++ptr);
+    if (c >= CHAR_a && c <= CHAR_z) c = UPPER_CASE(c);
+    if (c == CHAR_NULL && ptr >= ptrend)
+      {
+      *errorcodeptr = ERR2;
+      break;
+      }
+
+    /* Handle \c in an ASCII/Unicode environment. */
+
+#ifndef EBCDIC    /* ASCII/UTF-8 coding */
+    if (c < 32 || c > 126)  /* Excludes all non-printable ASCII */
+      {
+      *errorcodeptr = ERR68;
+      break;
+      }
+    c ^= 0x40;
+
+    /* Handle \c in an EBCDIC environment. The special case \c? is converted to
+    255 (0xff) or 95 (0x5f) if other character suggest we are using th POSIX-BC
+    encoding. (This is the way Perl indicates that it handles \c?.) The other
+    valid sequences correspond to a list of specific characters. */
+
+#else
+    if (c == CHAR_QUESTION_MARK)
+      c = ('\\' == 188 && '`' == 74)? 0x5f : 0xff;
+    else
+      {
+      for (i = 0; i < 32; i++)
+        {
+        if (c == ebcdic_escape_c[i]) break;
+        }
+      if (i < 32) c = i; else *errorcodeptr = ERR68;
+      }
+#endif  /* EBCDIC */
+
+    break;
+
+    /* Any other alphanumeric following \ is an error. Perl gives an error only
+    if in warning mode, but PCRE doesn't have a warning mode. */
+
+    default:
+    *errorcodeptr = ERR3;
+    break;
+    }
+  }
+
+/* Perl supports \N{name} for character names, as well as plain \N for "not
+newline". PCRE does not support \N{name}. However, it does support
+quantification such as \N{2,3}. */
+
+if (escape == ESC_N && ptr[1] == CHAR_LEFT_CURLY_BRACKET &&
+     !is_counted_repeat(ptr+2))
+  *errorcodeptr = ERR37;
+
+/* If PCRE2_UCP is set, we change the values for \d etc. */
+
+if ((options & PCRE2_UCP) != 0 && escape >= ESC_D && escape <= ESC_w)
+  escape += (ESC_DU - ESC_D);
+
+/* Set the pointer to the final character before returning. */
+
+*ptrptr = ptr;
+*chptr = c;
+return escape;
+}
+
+
+
+#ifdef SUPPORT_UNICODE
+/*************************************************
+*               Handle \P and \p                 *
+*************************************************/
+
+/* This function is called after \P or \p has been encountered, provided that
+PCRE2 is compiled with support for UTF and Unicode properties. On entry, the
+contents of ptrptr are pointing at the P or p. On exit, it is left pointing at
+the final code unit of the escape sequence.
+
+Arguments:
+  ptrptr         the pattern position pointer
+  negptr         a boolean that is set TRUE for negation else FALSE
+  ptypeptr       an unsigned int that is set to the type value
+  pdataptr       an unsigned int that is set to the detailed property value
+  errorcodeptr   the error code variable
+  cb             the compile data
+
+Returns:         TRUE if the type value was found, or FALSE for an invalid type
+*/
+
+static BOOL
+get_ucp(PCRE2_SPTR *ptrptr, BOOL *negptr, unsigned int *ptypeptr,
+  unsigned int *pdataptr, int *errorcodeptr, compile_block *cb)
+{
+register PCRE2_UCHAR c;
+int i, bot, top;
+PCRE2_SPTR ptr = *ptrptr;
+PCRE2_UCHAR name[32];
+
+*negptr = FALSE;
+c = *(++ptr);
+
+/* \P or \p can be followed by a name in {}, optionally preceded by ^ for
+negation. */
+
+if (c == CHAR_LEFT_CURLY_BRACKET)
+  {
+  if (ptr[1] == CHAR_CIRCUMFLEX_ACCENT)
+    {
+    *negptr = TRUE;
+    ptr++;
+    }
+  for (i = 0; i < (int)(sizeof(name) / sizeof(PCRE2_UCHAR)) - 1; i++)
+    {
+    c = *(++ptr);
+    if (c == CHAR_NULL) goto ERROR_RETURN;
+    if (c == CHAR_RIGHT_CURLY_BRACKET) break;
+    name[i] = c;
+    }
+  if (c != CHAR_RIGHT_CURLY_BRACKET) goto ERROR_RETURN;
+  name[i] = 0;
+  }
+
+/* Otherwise there is just one following character, which must be an ASCII
+letter. */
+
+else if (MAX_255(c) && (cb->ctypes[c] & ctype_letter) != 0)
+  {
+  name[0] = c;
+  name[1] = 0;
+  }
+else goto ERROR_RETURN;
+
+*ptrptr = ptr;
+
+/* Search for a recognized property name using binary chop. */
+
+bot = 0;
+top = PRIV(utt_size);
+
+while (bot < top)
+  {
+  int r;
+  i = (bot + top) >> 1;
+  r = PRIV(strcmp_c8)(name, PRIV(utt_names) + PRIV(utt)[i].name_offset);
+  if (r == 0)
+    {
+    *ptypeptr = PRIV(utt)[i].type;
+    *pdataptr = PRIV(utt)[i].value;
+    return TRUE;
+    }
+  if (r > 0) bot = i + 1; else top = i;
+  }
+*errorcodeptr = ERR47;   /* Unrecognized name */
+return FALSE;
+
+ERROR_RETURN:            /* Malformed \P or \p */
+*errorcodeptr = ERR46;
+*ptrptr = ptr;
+return FALSE;
+}
+#endif
+
+
+
+/*************************************************
+*         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 PCRE2_SPTR
+read_repeat_counts(PCRE2_SPTR p, int *minp, int *maxp, int *errorcodeptr)
+{
+int min = 0;
+int max = -1;
+
+while (IS_DIGIT(*p))
+  {
+  min = min * 10 + (int)(*p++ - CHAR_0);
+  if (min > 65535)
+    {
+    *errorcodeptr = ERR5;
+    return p;
+    }
+  }
+
+if (*p == CHAR_RIGHT_CURLY_BRACKET) max = min; else
+  {
+  if (*(++p) != CHAR_RIGHT_CURLY_BRACKET)
+    {
+    max = 0;
+    while(IS_DIGIT(*p))
+      {
+      max = max * 10 + (int)(*p++ - CHAR_0);
+      if (max > 65535)
+        {
+        *errorcodeptr = ERR5;
+        return p;
+        }
+      }
+    if (max < min)
+      {
+      *errorcodeptr = ERR4;
+      return p;
+      }
+    }
+  }
+
+*minp = min;
+*maxp = max;
+return p;
+}
+
+
+
+/*************************************************
+*   Scan compiled regex for recursion reference  *
+*************************************************/
+
+/* This function scans through a compiled pattern until it finds an instance of
+OP_RECURSE.
+
+Arguments:
+  code        points to start of expression
+  utf         TRUE in UTF mode
+
+Returns:      pointer to the opcode for OP_RECURSE, or NULL if not found
+*/
+
+static PCRE2_SPTR
+find_recurse(PCRE2_SPTR code, BOOL utf)
+{
+for (;;)
+  {
+  register PCRE2_UCHAR c = *code;
+  if (c == OP_END) return NULL;
+  if (c == OP_RECURSE) return code;
+
+  /* XCLASS is used for classes that cannot be represented just by a bit map.
+  This includes negated single high-valued characters. CALLOUT_STR is used for
+  callouts with string arguments. In both cases the length in the table is
+  zero; the actual length is stored in the compiled code. */
+
+  if (c == OP_XCLASS) code += GET(code, 1);
+    else if (c == OP_CALLOUT_STR) code += GET(code, 1 + 2*LINK_SIZE);
+
+  /* Otherwise, we can get the item's length from the table, except that for
+  repeated character types, we have to test for \p and \P, which have an extra
+  two bytes of parameters, and for MARK/PRUNE/SKIP/THEN with an argument, we
+  must add in its length. */
+
+  else
+    {
+    switch(c)
+      {
+      case OP_TYPESTAR:
+      case OP_TYPEMINSTAR:
+      case OP_TYPEPLUS:
+      case OP_TYPEMINPLUS:
+      case OP_TYPEQUERY:
+      case OP_TYPEMINQUERY:
+      case OP_TYPEPOSSTAR:
+      case OP_TYPEPOSPLUS:
+      case OP_TYPEPOSQUERY:
+      if (code[1] == OP_PROP || code[1] == OP_NOTPROP) code += 2;
+      break;
+
+      case OP_TYPEPOSUPTO:
+      case OP_TYPEUPTO:
+      case OP_TYPEMINUPTO:
+      case OP_TYPEEXACT:
+      if (code[1 + IMM2_SIZE] == OP_PROP || code[1 + IMM2_SIZE] == OP_NOTPROP)
+        code += 2;
+      break;
+
+      case OP_MARK:
+      case OP_PRUNE_ARG:
+      case OP_SKIP_ARG:
+      case OP_THEN_ARG:
+      code += code[1];
+      break;
+      }
+
+    /* Add in the fixed length from the table */
+
+    code += PRIV(OP_lengths)[c];
+
+    /* In UTF-8 and UTF-16 modes, opcodes that are followed by a character may
+    be followed by a multi-unit character. The length in the table is a
+    minimum, so we have to arrange to skip the extra units. */
+
+#ifdef MAYBE_UTF_MULTI
+    if (utf) switch(c)
+      {
+      case OP_CHAR:
+      case OP_CHARI:
+      case OP_NOT:
+      case OP_NOTI:
+      case OP_EXACT:
+      case OP_EXACTI:
+      case OP_NOTEXACT:
+      case OP_NOTEXACTI:
+      case OP_UPTO:
+      case OP_UPTOI:
+      case OP_NOTUPTO:
+      case OP_NOTUPTOI:
+      case OP_MINUPTO:
+      case OP_MINUPTOI:
+      case OP_NOTMINUPTO:
+      case OP_NOTMINUPTOI:
+      case OP_POSUPTO:
+      case OP_POSUPTOI:
+      case OP_NOTPOSUPTO:
+      case OP_NOTPOSUPTOI:
+      case OP_STAR:
+      case OP_STARI:
+      case OP_NOTSTAR:
+      case OP_NOTSTARI:
+      case OP_MINSTAR:
+      case OP_MINSTARI:
+      case OP_NOTMINSTAR:
+      case OP_NOTMINSTARI:
+      case OP_POSSTAR:
+      case OP_POSSTARI:
+      case OP_NOTPOSSTAR:
+      case OP_NOTPOSSTARI:
+      case OP_PLUS:
+      case OP_PLUSI:
+      case OP_NOTPLUS:
+      case OP_NOTPLUSI:
+      case OP_MINPLUS:
+      case OP_MINPLUSI:
+      case OP_NOTMINPLUS:
+      case OP_NOTMINPLUSI:
+      case OP_POSPLUS:
+      case OP_POSPLUSI:
+      case OP_NOTPOSPLUS:
+      case OP_NOTPOSPLUSI:
+      case OP_QUERY:
+      case OP_QUERYI:
+      case OP_NOTQUERY:
+      case OP_NOTQUERYI:
+      case OP_MINQUERY:
+      case OP_MINQUERYI:
+      case OP_NOTMINQUERY:
+      case OP_NOTMINQUERYI:
+      case OP_POSQUERY:
+      case OP_POSQUERYI:
+      case OP_NOTPOSQUERY:
+      case OP_NOTPOSQUERYI:
+      if (HAS_EXTRALEN(code[-1])) code += GET_EXTRALEN(code[-1]);
+      break;
+      }
+#else
+    (void)(utf);  /* Keep compiler happy by referencing function argument */
+#endif  /* MAYBE_UTF_MULTI */
+    }
+  }
+}
+
+
+
+/*************************************************
+*           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 a
+sequence of characters terminated by a matching ":]" or ".]" or "=]". If we
+reach an unescaped ']' without the special preceding character, return FALSE.
+
+Originally, this function only recognized a sequence of letters between the
+terminators, but it seems that Perl recognizes any sequence of characters,
+though of course unknown POSIX names are subsequently rejected. Perl gives an
+"Unknown POSIX class" error for [:f\oo:] for example, where previously PCRE
+didn't consider this to be a POSIX class. Likewise for [:1234:].
+
+The problem in trying to be exactly like Perl is in the handling of escapes. We
+have to be sure that [abc[:x\]pqr] is *not* treated as containing a POSIX
+class, but [abc[:x\]pqr:]] is (so that an error can be generated). The code
+below handles the special cases \\ and \], but does not try to do any other
+escape processing. This makes it different from Perl for cases such as
+[:l\ower:] where Perl recognizes it as the POSIX class "lower" but PCRE does
+not recognize "l\ower". This is a lesser evil than not diagnosing bad classes
+when Perl does, I think.
+
+A user pointed out that PCRE was rejecting [:a[:digit:]] whereas Perl was not.
+It seems that the appearance of a nested POSIX class supersedes an apparent
+external class. For example, [:a[:digit:]b:] matches "a", "b", ":", or
+a digit. This is handled by returning FALSE if the start of a new group with
+the same terminator is encountered, since the next closing sequence must close
+the nested group, not the outer one.
+
+In Perl, unescaped square brackets may also appear as part of class names. For
+example, [:a[:abc]b:] gives unknown POSIX class "[:abc]b:]". However, for
+[:a[:abc]b][b:] it gives unknown POSIX class "[:abc]b][b:]", which does not
+seem right at all. PCRE does not allow closing square brackets in POSIX class
+names.
+
+Arguments:
+  ptr      pointer to the initial [
+  endptr   where to return a pointer to the terminating ':', '.', or '='
+
+Returns:   TRUE or FALSE
+*/
+
+static BOOL
+check_posix_syntax(PCRE2_SPTR ptr, PCRE2_SPTR *endptr)
+{
+PCRE2_UCHAR terminator;  /* Don't combine these lines; the Solaris cc */
+terminator = *(++ptr);   /* compiler warns about "non-constant" initializer. */
+
+for (++ptr; *ptr != CHAR_NULL; ptr++)
+  {
+  if (*ptr == CHAR_BACKSLASH &&
+      (ptr[1] == CHAR_RIGHT_SQUARE_BRACKET || ptr[1] == CHAR_BACKSLASH))
+    ptr++;
+  else if ((*ptr == CHAR_LEFT_SQUARE_BRACKET && ptr[1] == terminator) ||
+            *ptr == CHAR_RIGHT_SQUARE_BRACKET) return FALSE;
+  else if (*ptr == terminator && ptr[1] == CHAR_RIGHT_SQUARE_BRACKET)
+    {
+    *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(PCRE2_SPTR ptr, int len)
+{
+const char *pn = posix_names;
+register int yield = 0;
+while (posix_name_lengths[yield] != 0)
+  {
+  if (len == posix_name_lengths[yield] &&
+    PRIV(strncmp_c8)(ptr, pn, (unsigned int)len) == 0) return yield;
+  pn += posix_name_lengths[yield] + 1;
+  yield++;
+  }
+return -1;
+}
+
+
+
+#ifdef SUPPORT_UNICODE
+/*************************************************
+*           Get othercase range                  *
+*************************************************/
+
+/* This function is passed the start and end of a class range in UCT mode. It
+searches up the characters, looking for ranges of characters in the "other"
+case. Each call returns the next one, updating the start address. A character
+with multiple other cases is returned on its own with a special return value.
+
+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:        -1 when no more
+               0 when a range is returned
+              >0 the CASESET offset for char with multiple other cases
+                in this case, ocptr contains the original
+*/
+
+static int
+get_othercase_range(uint32_t *cptr, uint32_t d, uint32_t *ocptr,
+  uint32_t *odptr)
+{
+uint32_t c, othercase, next;
+unsigned int co;
+
+/* Find the first character that has an other case. If it has multiple other
+cases, return its case offset value. */
+
+for (c = *cptr; c <= d; c++)
+  {
+  if ((co = UCD_CASESET(c)) != 0)
+    {
+    *ocptr = c++;   /* Character that has the set */
+    *cptr = c;      /* Rest of input range */
+    return (int)co;
+    }
+  if ((othercase = UCD_OTHERCASE(c)) != c) break;
+  }
+
+if (c > d) return -1;  /* Reached end of range */
+
+/* Found a character that has a single other case. Search for the end of the
+range, which is either the end of the input range, or a character that has zero
+or more than one other cases. */
+
+*ocptr = othercase;
+next = othercase + 1;
+
+for (++c; c <= d; c++)
+  {
+  if ((co = UCD_CASESET(c)) != 0 || UCD_OTHERCASE(c) != next) break;
+  next++;
+  }
+
+*odptr = next - 1;     /* End of othercase range */
+*cptr = c;             /* Rest of input range */
+return 0;
+}
+#endif  /* SUPPORT_UNICODE */
+
+
+
+/*************************************************
+*        Add a character or range to a class     *
+*************************************************/
+
+/* This function packages up the logic of adding a character or range of
+characters to a class. The character values in the arguments will be within the
+valid values for the current mode (8-bit, 16-bit, UTF, etc). This function is
+mutually recursive with the function immediately below.
+
+Arguments:
+  classbits     the bit map for characters < 256
+  uchardptr     points to the pointer for extra data
+  options       the options word
+  cb            compile data
+  start         start of range character
+  end           end of range character
+
+Returns:        the number of < 256 characters added
+                the pointer to extra data is updated
+*/
+
+static int
+add_to_class(uint8_t *classbits, PCRE2_UCHAR **uchardptr, uint32_t options,
+  compile_block *cb, uint32_t start, uint32_t end)
+{
+uint32_t c;
+uint32_t classbits_end = (end <= 0xff ? end : 0xff);
+int n8 = 0;
+
+/* If caseless matching is required, scan the range and process alternate
+cases. In Unicode, there are 8-bit characters that have alternate cases that
+are greater than 255 and vice-versa. Sometimes we can just extend the original
+range. */
+
+if ((options & PCRE2_CASELESS) != 0)
+  {
+#ifdef SUPPORT_UNICODE
+  if ((options & PCRE2_UTF) != 0)
+    {
+    int rc;
+    uint32_t oc, od;
+
+    options &= ~PCRE2_CASELESS;   /* Remove for recursive calls */
+    c = start;
+
+    while ((rc = get_othercase_range(&c, end, &oc, &od)) >= 0)
+      {
+      /* Handle a single character that has more than one other case. */
+
+      if (rc > 0) n8 += add_list_to_class(classbits, uchardptr, options, cb,
+        PRIV(ucd_caseless_sets) + rc, oc);
+
+      /* Do nothing if the other case range is within the original range. */
+
+      else if (oc >= start && od <= end) continue;
+
+      /* Extend the original range if there is overlap, noting that if oc < c, we
+      can't have od > end because a subrange is always shorter than the basic
+      range. Otherwise, use a recursive call to add the additional range. */
+
+      else if (oc < start && od >= start - 1) start = oc; /* Extend downwards */
+      else if (od > end && oc <= end + 1)
+        {
+        end = od;       /* Extend upwards */
+        if (end > classbits_end) classbits_end = (end <= 0xff ? end : 0xff);
+        }
+      else n8 += add_to_class(classbits, uchardptr, options, cb, oc, od);
+      }
+    }
+  else
+#endif  /* SUPPORT_UNICODE */
+
+  /* Not UTF mode */
+
+  for (c = start; c <= classbits_end; c++)
+    {
+    SETBIT(classbits, cb->fcc[c]);
+    n8++;
+    }
+  }
+
+/* Now handle the original range. Adjust the final value according to the bit
+length - this means that the same lists of (e.g.) horizontal spaces can be used
+in all cases. */
+
+if ((options & PCRE2_UTF) == 0 && end > MAX_NON_UTF_CHAR)
+  end = MAX_NON_UTF_CHAR;
+
+/* Use the bitmap for characters < 256. Otherwise use extra data.*/
+
+for (c = start; c <= classbits_end; c++)
+  {
+  /* Regardless of start, c will always be <= 255. */
+  SETBIT(classbits, c);
+  n8++;
+  }
+
+#ifdef SUPPORT_WIDE_CHARS
+if (start <= 0xff) start = 0xff + 1;
+
+if (end >= start)
+  {
+  PCRE2_UCHAR *uchardata = *uchardptr;
+
+#ifdef SUPPORT_UNICODE
+  if ((options & PCRE2_UTF) != 0)
+    {
+    if (start < end)
+      {
+      *uchardata++ = XCL_RANGE;
+      uchardata += PRIV(ord2utf)(start, uchardata);
+      uchardata += PRIV(ord2utf)(end, uchardata);
+      }
+    else if (start == end)
+      {
+      *uchardata++ = XCL_SINGLE;
+      uchardata += PRIV(ord2utf)(start, uchardata);
+      }
+    }
+  else
+#endif  /* SUPPORT_UNICODE */
+
+  /* Without UTF support, character values are constrained by the bit length,
+  and can only be > 256 for 16-bit and 32-bit libraries. */
+
+#if PCRE2_CODE_UNIT_WIDTH == 8
+    {}
+#else
+  if (start < end)
+    {
+    *uchardata++ = XCL_RANGE;
+    *uchardata++ = start;
+    *uchardata++ = end;
+    }
+  else if (start == end)
+    {
+    *uchardata++ = XCL_SINGLE;
+    *uchardata++ = start;
+    }
+#endif
+  *uchardptr = uchardata;   /* Updata extra data pointer */
+  }
+#else
+  (void)uchardptr;          /* Avoid compiler warning */
+#endif /* SUPPORT_WIDE_CHARS */
+
+return n8;    /* Number of 8-bit characters */
+}
+
+
+
+/*************************************************
+*        Add a list of characters to a class     *
+*************************************************/
+
+/* This function is used for adding a list of case-equivalent characters to a
+class, and also for adding a list of horizontal or vertical whitespace. If the
+list is in order (which it should be), ranges of characters are detected and
+handled appropriately. This function is mutually recursive with the function
+above.
+
+Arguments:
+  classbits     the bit map for characters < 256
+  uchardptr     points to the pointer for extra data
+  options       the options word
+  cb            contains pointers to tables etc.
+  p             points to row of 32-bit values, terminated by NOTACHAR
+  except        character to omit; this is used when adding lists of
+                  case-equivalent characters to avoid including the one we
+                  already know about
+
+Returns:        the number of < 256 characters added
+                the pointer to extra data is updated
+*/
+
+static int
+add_list_to_class(uint8_t *classbits, PCRE2_UCHAR **uchardptr, uint32_t options,
+  compile_block *cb, const uint32_t *p, unsigned int except)
+{
+int n8 = 0;
+while (p[0] < NOTACHAR)
+  {
+  int n = 0;
+  if (p[0] != except)
+    {
+    while(p[n+1] == p[0] + n + 1) n++;
+    n8 += add_to_class(classbits, uchardptr, options, cb, p[0], p[n]);
+    }
+  p += n + 1;
+  }
+return n8;
+}
+
+
+
+/*************************************************
+*    Add characters not in a list to a class     *
+*************************************************/
+
+/* This function is used for adding the complement of a list of horizontal or
+vertical whitespace to a class. The list must be in order.
+
+Arguments:
+  classbits     the bit map for characters < 256
+  uchardptr     points to the pointer for extra data
+  options       the options word
+  cb            contains pointers to tables etc.
+  p             points to row of 32-bit values, terminated by NOTACHAR
+
+Returns:        the number of < 256 characters added
+                the pointer to extra data is updated
+*/
+
+static int
+add_not_list_to_class(uint8_t *classbits, PCRE2_UCHAR **uchardptr,
+  uint32_t options, compile_block *cb, const uint32_t *p)
+{
+BOOL utf = (options & PCRE2_UTF) != 0;
+int n8 = 0;
+if (p[0] > 0)
+  n8 += add_to_class(classbits, uchardptr, options, cb, 0, p[0] - 1);
+while (p[0] < NOTACHAR)
+  {
+  while (p[1] == p[0] + 1) p++;
+  n8 += add_to_class(classbits, uchardptr, options, cb, p[0] + 1,
+    (p[1] == NOTACHAR) ? (utf ? 0x10ffffu : 0xffffffffu) : p[1] - 1);
+  p++;
+  }
+return n8;
+}
+
+
+
+/*************************************************
+*       Process (*VERB) name for escapes         *
+*************************************************/
+
+/* This function is called when the PCRE2_ALT_VERBNAMES option is set, to
+process the characters in a verb's name argument. It is called twice, once with
+codeptr == NULL, to find out the length of the processed name, and again to put
+the name into memory.
+
+Arguments:
+  ptrptr        pointer to the input pointer
+  codeptr       pointer to the compiled code pointer
+  errorcodeptr  pointer to the error code
+  options       the options bits
+  utf           TRUE if processing UTF
+  cb            compile data block
+
+Returns:        length of the processed name, or < 0 on error
+*/
+
+static int
+process_verb_name(PCRE2_SPTR *ptrptr, PCRE2_UCHAR **codeptr, int *errorcodeptr,
+  uint32_t options, BOOL utf, compile_block *cb)
+{
+int32_t arglen = 0;
+BOOL inescq = FALSE;
+PCRE2_SPTR ptr = *ptrptr;
+PCRE2_UCHAR *code = (codeptr == NULL)? NULL : *codeptr;
+
+for (; ptr < cb->end_pattern; ptr++)
+  {
+  uint32_t x = *ptr;
+
+  /* Skip over literals */
+
+  if (inescq)
+    {
+    if (x == CHAR_BACKSLASH && ptr[1] == CHAR_E)
+      {
+      inescq = FALSE;
+      ptr++;;
+      continue;
+      }
+    }
+
+  else  /* Not a literal character */
+    {
+    if (x == CHAR_RIGHT_PARENTHESIS) break;
+
+    /* Skip over comments and whitespace in extended mode. */
+
+    if ((options & PCRE2_EXTENDED) != 0)
+      {
+      PCRE2_SPTR wscptr = ptr;
+      while (MAX_255(x) && (cb->ctypes[x] & ctype_space) != 0) x = *(++ptr);
+      if (x == CHAR_NUMBER_SIGN)
+        {
+        ptr++;
+        while (*ptr != CHAR_NULL || ptr < cb->end_pattern)
+          {
+          if (IS_NEWLINE(ptr))       /* For non-fixed-length newline cases, */
+            {                        /* IS_NEWLINE sets cb->nllen. */
+            ptr += cb->nllen;
+            break;
+            }
+          ptr++;
+#ifdef SUPPORT_UNICODE
+          if (utf) FORWARDCHAR(ptr);
+#endif
+          }
+        }
+
+      /* If we have skipped any characters, restart the loop. */
+
+      if (ptr > wscptr)
+        {
+        ptr--;
+        continue;
+        }
+      }
+
+    /* Process escapes */
+
+    if (x == '\\')
+      {
+      int rc;
+      *errorcodeptr = 0;
+      rc = PRIV(check_escape)(&ptr, cb->end_pattern, &x, errorcodeptr, options,
+        FALSE, cb);
+      *ptrptr = ptr;   /* For possible error */
+      if (*errorcodeptr != 0) return -1;
+      if (rc != 0)
+        {
+        if (rc == ESC_Q)
+          {
+          inescq = TRUE;
+          continue;
+          }
+        if (rc == ESC_E) continue;
+        *errorcodeptr = ERR40;
+        return -1;
+        }
+      }
+    }
+
+  /* We have the next character in the name. */
+
+#ifdef SUPPORT_UNICODE
+  if (utf)
+    {
+    if (code == NULL)   /* Just want the length */
+      {
+#if PCRE2_CODE_UNIT_WIDTH == 8
+      int i;
+      for (i = 0; i < PRIV(utf8_table1_size); i++)
+        if ((int)x <= PRIV(utf8_table1)[i]) break;
+      arglen += i;
+#elif PCRE2_CODE_UNIT_WIDTH == 16
+      if (x > 0xffff) arglen++;
+#endif
+      }
+    else
+      {
+      PCRE2_UCHAR cbuff[8];
+      x = PRIV(ord2utf)(x, cbuff);
+      memcpy(code, cbuff, CU2BYTES(x));
+      code += x;
+      }
+    }
+  else
+#endif  /* SUPPORT_UNICODE */
+
+  /* Not UTF */
+    {
+    if (code != NULL) *code++ = x;
+    }
+
+  arglen++;
+
+  if ((unsigned int)arglen > MAX_MARK)
+    {
+    *errorcodeptr = ERR76;
+    *ptrptr = ptr;
+    return -1;
+    }
+  }
+
+/* Update the pointers before returning. */
+
+*ptrptr = ptr;
+if (codeptr != NULL) *codeptr = code;
+return arglen;
+}
+
+
+
+/*************************************************
+*          Macro for the next two functions      *
+*************************************************/
+
+/* Both scan_for_captures() and compile_branch() use this macro to generate a
+fragment of code that reads the characters of a name and sets its length
+(checking for not being too long). Count the characters dynamically, to avoid
+the possibility of integer overflow. The same macro is used for reading *VERB
+names. */
+
+#define READ_NAME(ctype, errno, errset)                      \
+  namelen = 0;                                               \
+  while (MAX_255(*ptr) && (cb->ctypes[*ptr] & ctype) != 0)   \
+    {                                                        \
+    ptr++;                                                   \
+    namelen++;                                               \
+    if (namelen > MAX_NAME_SIZE)                             \
+      {                                                      \
+      errset = errno;                                        \
+      goto FAILED;                                           \
+      }                                                      \
+    }
+
+
+
+/*************************************************
+*      Scan regex to identify named groups       *
+*************************************************/
+
+/* This function is called first of all, to scan for named capturing groups so
+that information about them is fully available to both the compiling scans.
+It skips over everything except parenthesized items.
+
+Arguments:
+  ptrptr   points to pointer to the start of the pattern
+  options  compiling dynamic options
+  cb       pointer to the compile data block
+
+Returns:   zero on success or a non-zero error code, with pointer updated
+*/
+
+typedef struct nest_save {
+  uint16_t  nest_depth;
+  uint16_t  reset_group;
+  uint16_t  max_group;
+  uint16_t  flags;
+} nest_save;
+
+#define NSF_RESET    0x0001u
+#define NSF_EXTENDED 0x0002u
+#define NSF_DUPNAMES 0x0004u
+
+static uint32_t scan_for_captures(PCRE2_SPTR *ptrptr, uint32_t options,
+  compile_block *cb)
+{
+uint32_t c;
+uint32_t delimiter;
+uint32_t nest_depth = 0;
+uint32_t set, unset, *optset;
+int errorcode = 0;
+int escape;
+int namelen;
+int i;
+BOOL inescq = FALSE;
+BOOL isdupname;
+BOOL skiptoket = FALSE;
+BOOL utf = (options & PCRE2_UTF) != 0;
+BOOL negate_class;
+PCRE2_SPTR name;
+PCRE2_SPTR start;
+PCRE2_SPTR ptr = *ptrptr;
+named_group *ng;
+nest_save *top_nest = NULL;
+nest_save *end_nests = (nest_save *)(cb->start_workspace + cb->workspace_size);
+
+/* The size of the nest_save structure might not be a factor of the size of the
+workspace. Therefore we must round down end_nests so as to correctly avoid
+creating a nest_save that spans the end of the workspace. */
+
+end_nests = (nest_save *)((char *)end_nests -
+  ((cb->workspace_size * sizeof(PCRE2_UCHAR)) % sizeof(nest_save)));
+
+/* Now scan the pattern */
+
+for (; ptr < cb->end_pattern; ptr++)
+  {
+  c = *ptr;
+
+  /* Parenthesized groups set skiptoket when all following characters up to the
+  next closing parenthesis must be ignored. The parenthesis itself must be
+  processed (to end the nested parenthesized item). */
+
+  if (skiptoket)
+    {
+    if (c != CHAR_RIGHT_PARENTHESIS) continue;
+    skiptoket = FALSE;
+    }
+
+  /* Skip over literals */
+
+  if (inescq)
+    {
+    if (c == CHAR_BACKSLASH && ptr[1] == CHAR_E)
+      {
+      inescq = FALSE;
+      ptr++;
+      }
+    continue;
+    }
+
+  /* Skip over comments and whitespace in extended mode. Need a loop to handle
+  whitespace after a comment. */
+
+  if ((options & PCRE2_EXTENDED) != 0)
+    {
+    for (;;)
+      {
+      while (MAX_255(c) && (cb->ctypes[c] & ctype_space) != 0) c = *(++ptr);
+      if (c != CHAR_NUMBER_SIGN) break;
+      ptr++;
+      while (*ptr != CHAR_NULL)
+        {
+        if (IS_NEWLINE(ptr))         /* For non-fixed-length newline cases, */
+          {                          /* IS_NEWLINE sets cb->nllen. */
+          ptr += cb->nllen;
+          break;
+          }
+        ptr++;
+#ifdef SUPPORT_UNICODE
+        if (utf) FORWARDCHAR(ptr);
+#endif
+        }
+      c = *ptr;     /* Either NULL or the char after a newline */
+      }
+    }
+
+  /* Process the next pattern item. */
+
+  switch(c)
+    {
+    default:              /* Most characters are just skipped */
+    break;
+
+    /* Skip escapes except for \Q */
+
+    case CHAR_BACKSLASH:
+    errorcode = 0;
+    escape = PRIV(check_escape)(&ptr, cb->end_pattern, &c, &errorcode, options,
+      FALSE, cb);
+    if (errorcode != 0) goto FAILED;
+    if (escape == ESC_Q) inescq = TRUE;
+    break;
+
+    /* Skip a character class. The syntax is complicated so we have to
+    replicate some of what happens when a class is processed for real. */
+
+    case CHAR_LEFT_SQUARE_BRACKET:
+    if (PRIV(strncmp_c8)(ptr+1, STRING_WEIRD_STARTWORD, 6) == 0 ||
+        PRIV(strncmp_c8)(ptr+1, STRING_WEIRD_ENDWORD, 6) == 0)
+      {
+      ptr += 6;
+      break;
+      }
+
+    /* If the first character is '^', set the negation flag (not actually used
+    here, except to recognize only one ^) and skip it. If the first few
+    characters (either before or after ^) are \Q\E or \E we skip them too. This
+    makes for compatibility with Perl. */
+
+    negate_class = FALSE;
+    for (;;)
+      {
+      c = *(++ptr);   /* First character in class */
+      if (c == CHAR_BACKSLASH)
+        {
+        if (ptr[1] == CHAR_E)
+          ptr++;
+        else if (PRIV(strncmp_c8)(ptr + 1, STR_Q STR_BACKSLASH STR_E, 3) == 0)
+          ptr += 3;
+        else
+          break;
+        }
+      else if (!negate_class && c == CHAR_CIRCUMFLEX_ACCENT)
+        negate_class = TRUE;
+      else break;
+      }
+
+    if (c == CHAR_RIGHT_SQUARE_BRACKET &&
+        (cb->external_options & PCRE2_ALLOW_EMPTY_CLASS) != 0)
+      break;
+
+    /* Loop for the contents of the class */
+
+    for (;;)
+      {
+      PCRE2_SPTR tempptr;
+
+      if (c == CHAR_NULL && ptr >= cb->end_pattern)
+        {
+        errorcode = ERR6;  /* Missing terminating ']' */
+        goto FAILED;
+        }
+
+#ifdef SUPPORT_UNICODE
+      if (utf && HAS_EXTRALEN(c))
+        {                           /* 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 == CHAR_BACKSLASH && ptr[1] == CHAR_E)  /* If we are at \E */
+          {
+          inescq = FALSE;                   /* Reset literal state */
+          ptr++;                            /* Skip the 'E' */
+          }
+        goto CONTINUE_CLASS;
+        }
+
+      /* Skip POSIX class names. */
+      if (c == CHAR_LEFT_SQUARE_BRACKET &&
+          (ptr[1] == CHAR_COLON || ptr[1] == CHAR_DOT ||
+           ptr[1] == CHAR_EQUALS_SIGN) && check_posix_syntax(ptr, &tempptr))
+        {
+        ptr = tempptr + 1;
+        }
+      else if (c == CHAR_BACKSLASH)
+        {
+        errorcode = 0;
+        escape = PRIV(check_escape)(&ptr, cb->end_pattern, &c, &errorcode,
+          options, TRUE, cb);
+        if (errorcode != 0) goto FAILED;
+        if (escape == ESC_Q) inescq = TRUE;
+        }
+
+      CONTINUE_CLASS:
+      c = *(++ptr);
+      if (c == CHAR_RIGHT_SQUARE_BRACKET && !inescq) break;
+      }     /* End of class-processing loop */
+    break;
+
+    /* This is the real work of this function - handling parentheses. */
+
+    case CHAR_LEFT_PARENTHESIS:
+    nest_depth++;
+
+    if (ptr[1] != CHAR_QUESTION_MARK)
+      {
+      if (ptr[1] != CHAR_ASTERISK)
+        {
+        if ((options & PCRE2_NO_AUTO_CAPTURE) == 0) cb->bracount++;
+        }
+
+      /* (*something) - just skip to closing ket unless PCRE2_ALT_VERBNAMES is
+      set, in which case we have to process escapes in the string after the
+      name. */
+
+      else
+        {
+        ptr += 2;
+        while (MAX_255(*ptr) && (cb->ctypes[*ptr] & ctype_word) != 0) ptr++;
+        if (*ptr == CHAR_COLON)
+          {
+          ptr++;
+          if ((options & PCRE2_ALT_VERBNAMES) != 0)
+            {
+            if (process_verb_name(&ptr, NULL, &errorcode, options, utf, cb) < 0)
+              goto FAILED;
+            }
+          else
+            {
+            while (ptr < cb->end_pattern && *ptr != CHAR_RIGHT_PARENTHESIS)
+              ptr++;
+            }
+          }
+        nest_depth--;
+        }
+      }
+
+    /* Handle (?...) groups */
+
+    else switch(ptr[2])
+      {
+      default:
+      ptr += 2;
+      if (ptr[0] == CHAR_R ||                           /* (?R) */
+          ptr[0] == CHAR_NUMBER_SIGN ||                 /* (?#) */
+          IS_DIGIT(ptr[0]) ||                           /* (?n) */
+          (ptr[0] == CHAR_MINUS && IS_DIGIT(ptr[1])))   /* (?-n) */
+        {
+        skiptoket = TRUE;
+        break;
+        }
+
+      /* Handle (?| and (?imsxJU: which are the only other valid forms. Both
+      need a new block on the nest stack. */
+
+      if (top_nest == NULL) top_nest = (nest_save *)(cb->start_workspace);
+      else if (++top_nest >= end_nests)
+        {
+        errorcode = ERR84;
+        goto FAILED;
+        }
+      top_nest->nest_depth = nest_depth;
+      top_nest->flags = 0;
+      if ((options & PCRE2_EXTENDED) != 0) top_nest->flags |= NSF_EXTENDED;
+      if ((options & PCRE2_DUPNAMES) != 0) top_nest->flags |= NSF_DUPNAMES;
+
+      if (*ptr == CHAR_VERTICAL_LINE)
+        {
+        top_nest->reset_group = cb->bracount;
+        top_nest->max_group = cb->bracount;
+        top_nest->flags |= NSF_RESET;
+        cb->external_flags |= PCRE2_DUPCAPUSED;
+        break;
+        }
+
+      /* Scan options */
+
+      top_nest->reset_group = 0;
+      top_nest->max_group = 0;
+
+      set = unset = 0;
+      optset = &set;
+
+      /* Need only track (?x: and (?J: at this stage */
+
+      while (*ptr != CHAR_RIGHT_PARENTHESIS && *ptr != CHAR_COLON)
+        {
+        switch (*ptr++)
+          {
+          case CHAR_MINUS: optset = &unset; break;
+
+          case CHAR_x: *optset |= PCRE2_EXTENDED; break;
+
+          case CHAR_J:
+          *optset |= PCRE2_DUPNAMES;
+          cb->external_flags |= PCRE2_JCHANGED;
+          break;
+
+          case CHAR_i:
+          case CHAR_m:
+          case CHAR_s:
+          case CHAR_U:
+          break;
+
+          default:  errorcode = ERR11;
+                    ptr--;    /* Correct the offset */
+                    goto FAILED;
+          }
+        }
+
+      options = (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. If the
+      previous level set up a nest block, discard the one we have just created.
+      Otherwise adjust it for the previous level. */
+
+      if (*ptr == CHAR_RIGHT_PARENTHESIS)
+        {
+        nest_depth--;
+        if (top_nest > (nest_save *)(cb->start_workspace) &&
+            (top_nest-1)->nest_depth == nest_depth) top_nest --;
+        else top_nest->nest_depth = nest_depth;
+        }
+      break;
+
+      /* Skip over a numerical or string argument for a callout. */
+
+      case CHAR_C:
+      ptr += 2;
+      if (ptr[1] == CHAR_RIGHT_PARENTHESIS) break;
+      if (IS_DIGIT(ptr[1]))
+        {
+        while (IS_DIGIT(ptr[1])) ptr++;
+        }
+
+      /* Handle a string argument */
+
+      else
+        {
+        ptr++;
+        delimiter = 0;
+        for (i = 0; PRIV(callout_start_delims)[i] != 0; i++)
+          {
+          if (*ptr == PRIV(callout_start_delims)[i])
+            {
+            delimiter = PRIV(callout_end_delims)[i];
+            break;
+            }
+          }
+
+        if (delimiter == 0)
+          {
+          errorcode = ERR82;
+          goto FAILED;
+          }
+
+        start = ptr;
+        do
+          {
+          if (++ptr >= cb->end_pattern)
+            {
+            errorcode = ERR81;
+            ptr = start;   /* To give a more useful message */
+            goto FAILED;
+            }
+          if (ptr[0] == delimiter && ptr[1] == delimiter) ptr += 2;
+          }
+        while (ptr[0] != delimiter);
+        }
+
+      /* Check terminating ) */
+
+      if (ptr[1] != CHAR_RIGHT_PARENTHESIS)
+        {
+        errorcode = ERR39;
+        ptr++;
+        goto FAILED;
+        }
+      break;
+
+      /* Conditional group */
+
+      case CHAR_LEFT_PARENTHESIS:
+      if (ptr[3] != CHAR_QUESTION_MARK)   /* Not assertion or callout */
+        {
+        nest_depth++;
+        ptr += 2;
+        break;
+        }
+
+      /* Must be an assertion or a callout */
+
+      switch(ptr[4])
+       {
+       case CHAR_LESS_THAN_SIGN:
+       if (ptr[5] != CHAR_EXCLAMATION_MARK && ptr[5] != CHAR_EQUALS_SIGN)
+         goto MISSING_ASSERTION;
+       /* Fall through */
+
+       case CHAR_C:
+       case CHAR_EXCLAMATION_MARK:
+       case CHAR_EQUALS_SIGN:
+       ptr++;
+       break;
+
+       default:
+       MISSING_ASSERTION:
+       ptr += 3;            /* To improve error message */
+       errorcode = ERR28;
+       goto FAILED;
+       }
+      break;
+
+      case CHAR_COLON:
+      case CHAR_GREATER_THAN_SIGN:
+      case CHAR_EQUALS_SIGN:
+      case CHAR_EXCLAMATION_MARK:
+      case CHAR_AMPERSAND:
+      case CHAR_PLUS:
+      ptr += 2;
+      break;
+
+      case CHAR_P:
+      if (ptr[3] != CHAR_LESS_THAN_SIGN)
+        {
+        ptr += 3;
+        break;
+        }
+      ptr++;
+      c = CHAR_GREATER_THAN_SIGN;   /* Terminator */
+      goto DEFINE_NAME;
+
+      case CHAR_LESS_THAN_SIGN:
+      if (ptr[3] == CHAR_EQUALS_SIGN || ptr[3] == CHAR_EXCLAMATION_MARK)
+        {
+        ptr += 3;
+        break;
+        }
+      c = CHAR_GREATER_THAN_SIGN;   /* Terminator */
+      goto DEFINE_NAME;
+
+      case CHAR_APOSTROPHE:
+      c = CHAR_APOSTROPHE;    /* Terminator */
+
+      DEFINE_NAME:
+      name = ptr = ptr + 3;
+
+      if (*ptr == c)          /* Empty name */
+        {
+        errorcode = ERR62;
+        goto FAILED;
+        }
+
+      if (IS_DIGIT(*ptr))
+        {
+        errorcode = ERR44;   /* Group name must start with non-digit */
+        goto FAILED;
+        }
+
+      if (MAX_255(*ptr) && (cb->ctypes[*ptr] & ctype_word) == 0)
+        {
+        errorcode = ERR24;
+        goto FAILED;
+        }
+
+      /* Advance ptr, set namelen and check its length. */
+      READ_NAME(ctype_word, ERR48, errorcode);
+
+      if (*ptr != c)
+        {
+        errorcode = ERR42;
+        goto FAILED;
+        }
+
+      if (cb->names_found >= MAX_NAME_COUNT)
+        {
+        errorcode = ERR49;
+        goto FAILED;
+        }
+
+      if (namelen + IMM2_SIZE + 1 > cb->name_entry_size)
+        cb->name_entry_size = namelen + IMM2_SIZE + 1;
+
+      /* We have a valid name for this capturing group. */
+
+      cb->bracount++;
+
+      /* Scan the list to check for duplicates. For duplicate names, if the
+      number is the same, break the loop, which causes the name to be
+      discarded; otherwise, if DUPNAMES is not set, give an error.
+      If it is set, allow the name with a different number, but continue
+      scanning in case this is a duplicate with the same number. For
+      non-duplicate names, give an error if the number is duplicated. */
+
+      isdupname = FALSE;
+      ng = cb->named_groups;
+      for (i = 0; i < cb->names_found; i++, ng++)
+        {
+        if (namelen == ng->length &&
+            PRIV(strncmp)(name, ng->name, namelen) == 0)
+          {
+          if (ng->number == cb->bracount) break;
+          if ((options & PCRE2_DUPNAMES) == 0)
+            {
+            errorcode = ERR43;
+            goto FAILED;
+            }
+          isdupname = ng->isdup = TRUE;     /* Mark as a duplicate */
+          cb->dupnames = TRUE;              /* Duplicate names exist */
+          }
+        else if (ng->number == cb->bracount)
+          {
+          errorcode = ERR65;
+          goto FAILED;
+          }
+        }
+
+      if (i < cb->names_found) break;   /* Ignore duplicate with same number */
+
+      /* Increase the list size if necessary */
+
+      if (cb->names_found >= cb->named_group_list_size)
+        {
+        int newsize = cb->named_group_list_size * 2;
+        named_group *newspace =
+          cb->cx->memctl.malloc(newsize * sizeof(named_group),
+          cb->cx->memctl.memory_data);
+        if (newspace == NULL)
+          {
+          errorcode = ERR21;
+          goto FAILED;
+          }
+
+        memcpy(newspace, cb->named_groups,
+          cb->named_group_list_size * sizeof(named_group));
+        if (cb->named_group_list_size > NAMED_GROUP_LIST_SIZE)
+          cb->cx->memctl.free((void *)cb->named_groups,
+          cb->cx->memctl.memory_data);
+        cb->named_groups = newspace;
+        cb->named_group_list_size = newsize;
+        }
+
+      /* Add this name to the list */
+
+      cb->named_groups[cb->names_found].name = name;
+      cb->named_groups[cb->names_found].length = namelen;
+      cb->named_groups[cb->names_found].number = cb->bracount;
+      cb->named_groups[cb->names_found].isdup = isdupname;
+      cb->names_found++;
+      break;
+      }        /* End of (? switch */
+    break;     /* End of ( handling */
+
+    /* At an alternation, reset the capture count if we are in a (?| group. */
+
+    case CHAR_VERTICAL_LINE:
+    if (top_nest != NULL && top_nest->nest_depth == nest_depth &&
+        (top_nest->flags & NSF_RESET) != 0)
+      {
+      if (cb->bracount > top_nest->max_group)
+        top_nest->max_group = cb->bracount;
+      cb->bracount = top_nest->reset_group;
+      }
+    break;
+
+    /* At a right parenthesis, reset the capture count to the maximum if we
+    are in a (?| group and/or reset the extended option. */
+
+    case CHAR_RIGHT_PARENTHESIS:
+    if (top_nest != NULL && top_nest->nest_depth == nest_depth)
+      {
+      if ((top_nest->flags & NSF_RESET) != 0 &&
+          top_nest->max_group > cb->bracount)
+        cb->bracount = top_nest->max_group;
+      if ((top_nest->flags & NSF_EXTENDED) != 0) options |= PCRE2_EXTENDED;
+        else options &= ~PCRE2_EXTENDED;
+      if ((top_nest->flags & NSF_DUPNAMES) != 0) options |= PCRE2_DUPNAMES;
+        else options &= ~PCRE2_DUPNAMES;
+      if (top_nest == (nest_save *)(cb->start_workspace)) top_nest = NULL;
+        else top_nest--;
+      }
+    if (nest_depth > 0) nest_depth--;  /* Can be 0 for unmatched ) */
+    break;
+    }
+  }
+
+cb->final_bracount = cb->bracount;
+return 0;
+
+FAILED:
+*ptrptr = ptr;
+return errorcode;
+}
+
+
+
+/*************************************************
+*           Compile one branch                   *
+*************************************************/
+
+/* Scan the pattern, compiling it into the a vector. If the options are
+changed during the branch, the pointer is used to change the external options
+bits. This function is used during the pre-compile phase when we are trying
+to find out the amount of memory needed, as well as during the real compile
+phase. The value of lengthptr distinguishes the two phases.
+
+Arguments:
+  optionsptr        pointer to the option bits
+  codeptr           points to the pointer to the current code point
+  ptrptr            points to the current pattern pointer
+  errorcodeptr      points to error code variable
+  firstcuptr        place to put the first required code unit
+  firstcuflagsptr   place to put the first code unit flags, or a negative number
+  reqcuptr          place to put the last required code unit
+  reqcuflagsptr     place to put the last required code unit flags, or a negative number
+  bcptr             points to current branch chain
+  cond_depth        conditional nesting depth
+  cb                contains pointers to tables etc.
+  lengthptr         NULL during the real compile phase
+                    points to length accumulator during pre-compile phase
+
+Returns:            TRUE on success
+                    FALSE, with *errorcodeptr set non-zero on error
+*/
+
+static BOOL
+compile_branch(uint32_t *optionsptr, PCRE2_UCHAR **codeptr,
+  PCRE2_SPTR *ptrptr, int *errorcodeptr,
+  uint32_t *firstcuptr, int32_t *firstcuflagsptr,
+  uint32_t *reqcuptr, int32_t *reqcuflagsptr,
+  branch_chain *bcptr, int cond_depth,
+  compile_block *cb, size_t *lengthptr)
+{
+int repeat_min = 0, repeat_max = 0;      /* To please picky compilers */
+int bravalue = 0;
+uint32_t greedy_default, greedy_non_default;
+uint32_t repeat_type, op_type;
+uint32_t options = *optionsptr;               /* May change dynamically */
+uint32_t firstcu, reqcu;
+int32_t firstcuflags, reqcuflags;
+uint32_t zeroreqcu, zerofirstcu;
+int32_t zeroreqcuflags, zerofirstcuflags;
+int32_t req_caseopt, reqvary, tempreqvary;
+int after_manual_callout = 0;
+int escape;
+size_t length_prevgroup = 0;
+register uint32_t c;
+register PCRE2_UCHAR *code = *codeptr;
+PCRE2_UCHAR *last_code = code;
+PCRE2_UCHAR *orig_code = code;
+PCRE2_UCHAR *tempcode;
+BOOL inescq = FALSE;
+BOOL groupsetfirstcu = FALSE;
+PCRE2_SPTR ptr = *ptrptr;
+PCRE2_SPTR tempptr;
+PCRE2_UCHAR *previous = NULL;
+PCRE2_UCHAR *previous_callout = NULL;
+uint8_t classbits[32];
+
+/* We can fish out the UTF setting once and for all into a BOOL, but we must
+not do this for other options (e.g. PCRE2_EXTENDED) because they may change
+dynamically as we process the pattern. */
+
+#ifdef SUPPORT_UNICODE
+BOOL utf = (options & PCRE2_UTF) != 0;
+#if PCRE2_CODE_UNIT_WIDTH != 32
+PCRE2_UCHAR utf_units[6];      /* For setting up multi-cu chars */
+#endif
+
+#else  /* No UTF support */
+BOOL utf = FALSE;
+#endif
+
+/* Helper variables for OP_XCLASS opcode (for characters > 255). We define
+class_uchardata always so that it can be passed to add_to_class() always,
+though it will not be used in non-UTF 8-bit cases. This avoids having to supply
+alternative calls for the different cases. */
+
+PCRE2_UCHAR *class_uchardata;
+#ifdef SUPPORT_WIDE_CHARS
+BOOL xclass;
+PCRE2_UCHAR *class_uchardata_base;
+#endif
+
+/* Set up the default and non-default settings for greediness */
+
+greedy_default = ((options & PCRE2_UNGREEDY) != 0);
+greedy_non_default = greedy_default ^ 1;
+
+/* Initialize no first unit, no required unit. REQ_UNSET means "no char
+matching encountered yet". It gets changed to REQ_NONE if we hit something that
+matches a non-fixed first unit; reqcu 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
+zerofirstcu and zeroreqcu when such a repeat is encountered. The individual
+item types that can be repeated set these backoff variables appropriately. */
+
+firstcu = reqcu = zerofirstcu = zeroreqcu = 0;
+firstcuflags = reqcuflags = zerofirstcuflags = zeroreqcuflags = REQ_UNSET;
+
+/* The variable req_caseopt contains either the REQ_CASELESS value or zero,
+according to the current setting of the caseless flag. The REQ_CASELESS value
+leaves the lower 28 bit empty. It is added into the firstcu or reqcu variables
+to record the case status of the value. This is used only for ASCII characters.
+*/
+
+req_caseopt = ((options & PCRE2_CASELESS) != 0)? REQ_CASELESS:0;
+
+/* Switch on next character until the end of the branch */
+
+for (;; ptr++)
+  {
+  BOOL negate_class;
+  BOOL should_flip_negation;
+  BOOL match_all_or_no_wide_chars;
+  BOOL possessive_quantifier;
+  BOOL is_quantifier;
+  BOOL is_recurse;
+  BOOL is_dupname;
+  BOOL reset_bracount;
+  int class_has_8bitchar;
+  int class_one_char;
+#ifdef SUPPORT_WIDE_CHARS
+  BOOL xclass_has_prop;
+#endif
+  int recno;                               /* Must be signed */
+  int refsign;                             /* Must be signed */
+  int terminator;                          /* Must be signed */
+  unsigned int mclength;
+  unsigned int tempbracount;
+  uint32_t ec;
+  uint32_t newoptions;
+  uint32_t skipunits;
+  uint32_t subreqcu, subfirstcu;
+  int32_t subreqcuflags, subfirstcuflags;  /* Must be signed */
+  PCRE2_UCHAR mcbuffer[8];
+
+  /* Get next character in the pattern */
+
+  c = *ptr;
+
+  /* If we are at the end of a nested substitution, revert to the outer level
+  string. Nesting only happens one or two levels deep, and the inserted string
+  is always zero terminated. */
+
+  if (c == CHAR_NULL && cb->nestptr[0] != NULL)
+    {
+    ptr = cb->nestptr[0];
+    cb->nestptr[0] = cb->nestptr[1];
+    cb->nestptr[1] = NULL;
+    c = *ptr;
+    }
+
+  /* If we are in the pre-compile phase, accumulate the length used for the
+  previous cycle of this loop. */
+
+  if (lengthptr != NULL)
+    {
+    if (code > cb->start_workspace + cb->workspace_size -
+        WORK_SIZE_SAFETY_MARGIN)                       /* Check for overrun */
+      {
+      *errorcodeptr = (code >= cb->start_workspace + cb->workspace_size)?
+        ERR52 : ERR86;
+      goto FAILED;
+      }
+
+    /* There is at least one situation where code goes backwards: this is the
+    case of a zero quantifier after a class (e.g. [ab]{0}). At compile time,
+    the class is simply eliminated. However, it is created first, so we have to
+    allow memory for it. Therefore, don't ever reduce the length at this point.
+    */
+
+    if (code < last_code) code = last_code;
+
+    /* Paranoid check for integer overflow */
+
+    if (OFLOW_MAX - *lengthptr < (size_t)(code - last_code))
+      {
+      *errorcodeptr = ERR20;
+      goto FAILED;
+      }
+    *lengthptr += code - last_code;
+
+    /* If "previous" is set and it is not at the start of the work space, move
+    it back to there, in order to avoid filling up the work space. Otherwise,
+    if "previous" is NULL, reset the current code pointer to the start. */
+
+    if (previous != NULL)
+      {
+      if (previous > orig_code)
+        {
+        memmove(orig_code, previous, CU2BYTES(code - previous));
+        code -= previous - orig_code;
+        previous = orig_code;
+        }
+      }
+    else code = orig_code;
+
+    /* Remember where this code item starts so we can pick up the length
+    next time round. */
+
+    last_code = code;
+    }
+
+  /* Before doing anything else we must handle all the special items that do
+  nothing, and which may come between an item and its quantifier. Otherwise,
+  when auto-callouts are enabled, a callout gets incorrectly inserted before
+  the quantifier is recognized. After recognizing a "do nothing" item, restart
+  the loop in case another one follows. */
+
+  /* If c is not NULL we are not at the end of the pattern. If it is NULL, we
+  may still be in the pattern with a NULL data item. In these cases, if we are
+  in \Q...\E, check for the \E that ends the literal string; if not, we have a
+  literal character. If not in \Q...\E, an isolated \E is ignored. */
+
+  if (c != CHAR_NULL || ptr < cb->end_pattern)
+    {
+    if (c == CHAR_BACKSLASH && ptr[1] == CHAR_E)
+      {
+      inescq = FALSE;
+      ptr++;
+      continue;
+      }
+    else if (inescq)   /* Literal character */
+      {
+      if (previous_callout != NULL)
+        {
+        if (lengthptr == NULL)  /* Don't attempt in pre-compile phase */
+          complete_callout(previous_callout, ptr, cb);
+        previous_callout = NULL;
+        }
+      if ((options & PCRE2_AUTO_CALLOUT) != 0)
+        {
+        previous_callout = code;
+        code = auto_callout(code, ptr, cb);
+        }
+      goto NORMAL_CHAR;
+      }
+
+    /* Check for the start of a \Q...\E sequence. We must do this here rather
+    than later in case it is immediately followed by \E, which turns it into a
+    "do nothing" sequence. */
+
+    if (c == CHAR_BACKSLASH && ptr[1] == CHAR_Q)
+      {
+      inescq = TRUE;
+      ptr++;
+      continue;
+      }
+    }
+
+  /* In extended mode, skip white space and #-comments that end at newline. */
+
+  if ((options & PCRE2_EXTENDED) != 0)
+    {
+    PCRE2_SPTR wscptr = ptr;
+    while (MAX_255(c) && (cb->ctypes[c] & ctype_space) != 0) c = *(++ptr);
+    if (c == CHAR_NUMBER_SIGN)
+      {
+      ptr++;
+      while (ptr < cb->end_pattern)
+        {
+        if (IS_NEWLINE(ptr))         /* For non-fixed-length newline cases, */
+          {                          /* IS_NEWLINE sets cb->nllen. */
+          ptr += cb->nllen;
+          break;
+          }
+        ptr++;
+#ifdef SUPPORT_UNICODE
+        if (utf) FORWARDCHAR(ptr);
+#endif
+        }
+      }
+
+    /* If we skipped any characters, restart the loop. Otherwise, we didn't see
+    a comment. */
+
+    if (ptr > wscptr)
+      {
+      ptr--;
+      continue;
+      }
+    }
+
+  /* Skip over (?# comments. */
+
+  if (c == CHAR_LEFT_PARENTHESIS && ptr[1] == CHAR_QUESTION_MARK &&
+      ptr[2] == CHAR_NUMBER_SIGN)
+    {
+    ptr += 3;
+    while (ptr < cb->end_pattern && *ptr != CHAR_RIGHT_PARENTHESIS) ptr++;
+    if (*ptr != CHAR_RIGHT_PARENTHESIS)
+      {
+      *errorcodeptr = ERR18;
+      goto FAILED;
+      }
+    continue;
+    }
+
+  /* End of processing "do nothing" items. See if the next thing is a
+  quantifier. */
+
+  is_quantifier =
+    c == CHAR_ASTERISK || c == CHAR_PLUS || c == CHAR_QUESTION_MARK ||
+     (c == CHAR_LEFT_CURLY_BRACKET && is_counted_repeat(ptr+1));
+
+  /* Fill in length of a previous callout and create an auto callout if
+  required, except when the next thing is a quantifier or when processing a
+  property substitution string for \w etc in UCP mode. */
+
+  if (!is_quantifier && cb->nestptr[0] == NULL)
+    {
+    if (previous_callout != NULL && after_manual_callout-- <= 0)
+      {
+      if (lengthptr == NULL)      /* Don't attempt in pre-compile phase */
+        complete_callout(previous_callout, ptr, cb);
+      previous_callout = NULL;
+      }
+
+    if ((options & PCRE2_AUTO_CALLOUT) != 0)
+      {
+      previous_callout = code;
+      code = auto_callout(code, ptr, cb);
+      }
+    }
+
+  /* Process the next pattern item. */
+
+  switch(c)
+    {
+    /* ===================================================================*/
+    /* The branch terminates at string end or | or ) */
+
+    case CHAR_NULL:
+    if (ptr < cb->end_pattern) goto NORMAL_CHAR;   /* Zero data character */
+    /* Fall through */
+
+    case CHAR_VERTICAL_LINE:
+    case CHAR_RIGHT_PARENTHESIS:
+    *firstcuptr = firstcu;
+    *firstcuflagsptr = firstcuflags;
+    *reqcuptr = reqcu;
+    *reqcuflagsptr = reqcuflags;
+    *codeptr = code;
+    *ptrptr = ptr;
+    if (lengthptr != NULL)
+      {
+      if (OFLOW_MAX - *lengthptr < (size_t)(code - last_code))
+        {
+        *errorcodeptr = ERR20;
+        goto FAILED;
+        }
+      *lengthptr += code - last_code;   /* To include callout length */
+      }
+    return TRUE;
+
+
+    /* ===================================================================*/
+    /* Handle single-character metacharacters. In multiline mode, ^ disables
+    the setting of any following char as a first character. */
+
+    case CHAR_CIRCUMFLEX_ACCENT:
+    previous = NULL;
+    if ((options & PCRE2_MULTILINE) != 0)
+      {
+      if (firstcuflags == REQ_UNSET)
+        zerofirstcuflags = firstcuflags = REQ_NONE;
+      *code++ = OP_CIRCM;
+      }
+    else *code++ = OP_CIRC;
+    break;
+
+    case CHAR_DOLLAR_SIGN:
+    previous = NULL;
+    *code++ = ((options & PCRE2_MULTILINE) != 0)? OP_DOLLM : OP_DOLL;
+    break;
+
+    /* There can never be a first char if '.' is first, whatever happens about
+    repeats. The value of reqcu doesn't change either. */
+
+    case CHAR_DOT:
+    if (firstcuflags == REQ_UNSET) firstcuflags = REQ_NONE;
+    zerofirstcu = firstcu;
+    zerofirstcuflags = firstcuflags;
+    zeroreqcu = reqcu;
+    zeroreqcuflags = reqcuflags;
+    previous = code;
+    *code++ = ((options & PCRE2_DOTALL) != 0)? OP_ALLANY: OP_ANY;
+    break;
+
+
+    /* ===================================================================*/
+    /* Character classes. If the included characters are all < 256, 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.
+
+    An isolated ']' character is not treated specially, so is just another data
+    character. In earlier versions of PCRE that used the original API there was
+    a "JavaScript compatibility mode" in which it gave an error. However,
+    JavaScript itself has changed in this respect so there is no longer any
+    need for this special handling.
+
+    In another (POSIX) regex library, the ugly syntax [[:<:]] and [[:>:]] is
+    used for "start of word" and "end of word". As these are otherwise illegal
+    sequences, we don't break anything by recognizing them. They are replaced
+    by \b(?=\w) and \b(?<=\w) respectively. This can only happen at the top
+    nesting level, as no other inserted sequences will contains these oddities.
+    Sequences like [a[:<:]] are erroneous and are handled by the normal code
+    below. */
+
+    case CHAR_LEFT_SQUARE_BRACKET:
+    if (PRIV(strncmp_c8)(ptr+1, STRING_WEIRD_STARTWORD, 6) == 0)
+      {
+      cb->nestptr[0] = ptr + 7;
+      ptr = sub_start_of_word;  /* Do not combine these statements; clang's */
+      ptr--;                    /* sanitizer moans about a negative index. */
+      continue;
+      }
+
+    if (PRIV(strncmp_c8)(ptr+1, STRING_WEIRD_ENDWORD, 6) == 0)
+      {
+      cb->nestptr[0] = ptr + 7;
+      ptr = sub_end_of_word;    /* Do not combine these statements; clang's */
+      ptr--;                    /* sanitizer moans about a negative index. */
+      continue;
+      }
+
+    /* Handle a real character class. */
+
+    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] == CHAR_COLON || ptr[1] == CHAR_DOT ||
+         ptr[1] == CHAR_EQUALS_SIGN) &&
+        check_posix_syntax(ptr, &tempptr))
+      {
+      *errorcodeptr = (ptr[1] == CHAR_COLON)? ERR12 : ERR13;
+      goto FAILED;
+      }
+
+    /* If the first character is '^', set the negation flag and skip it. Also,
+    if the first few characters (either before or after ^) are \Q\E or \E we
+    skip them too. This makes for compatibility with Perl. */
+
+    negate_class = FALSE;
+    for (;;)
+      {
+      c = *(++ptr);
+      if (c == CHAR_BACKSLASH)
+        {
+        if (ptr[1] == CHAR_E)
+          ptr++;
+        else if (PRIV(strncmp_c8)(ptr + 1, STR_Q STR_BACKSLASH STR_E, 3) == 0)
+          ptr += 3;
+        else
+          break;
+        }
+      else if (!negate_class && c == CHAR_CIRCUMFLEX_ACCENT)
+        negate_class = TRUE;
+      else break;
+      }
+
+    /* Empty classes are allowed if PCRE2_ALLOW_EMPTY_CLASS is set. Otherwise,
+    an initial ']' is taken as a data character -- the code below handles
+    that. When empty classes are allowed, [] must always fail, so generate
+    OP_FAIL, whereas [^] must match any character, so generate OP_ALLANY. */
+
+    if (c == CHAR_RIGHT_SQUARE_BRACKET &&
+        (cb->external_options & PCRE2_ALLOW_EMPTY_CLASS) != 0)
+      {
+      *code++ = negate_class? OP_ALLANY : OP_FAIL;
+      if (firstcuflags == REQ_UNSET) firstcuflags = REQ_NONE;
+      zerofirstcu = firstcu;
+      zerofirstcuflags = firstcuflags;
+      break;
+      }
+
+    /* If a non-extended class contains a negative special such as \S, we need
+    to flip the negation flag at the end, so that support for characters > 255
+    works correctly (they are all included in the class). An extended class may
+    need to insert specific matching or non-matching code for wide characters.
+    */
+
+    should_flip_negation = match_all_or_no_wide_chars = FALSE;
+
+    /* Extended class (xclass) will be used when characters > 255
+    might match. */
+
+#ifdef SUPPORT_WIDE_CHARS
+    xclass = FALSE;
+    class_uchardata = code + LINK_SIZE + 2;   /* For XCLASS items */
+    class_uchardata_base = class_uchardata;   /* Save the start */
+#endif
+
+    /* For optimization purposes, we track some properties of the class:
+    class_has_8bitchar will be non-zero if the class contains at least one 256
+    character with a code point less than 256; class_one_char will be 1 if the
+    class contains just one character; xclass_has_prop will be TRUE if Unicode
+    property checks are present in the class. */
+
+    class_has_8bitchar = 0;
+    class_one_char = 0;
+#ifdef SUPPORT_WIDE_CHARS
+    xclass_has_prop = FALSE;
+#endif
+
+    /* Initialize the 256-bit (32-byte) bit map to all zeros. We build the map
+    in a temporary bit of memory, in case the class contains fewer than two
+    8-bit characters because in that case the compiled code doesn't use the bit
+    map. */
+
+    memset(classbits, 0, 32 * sizeof(uint8_t));
+
+    /* Process characters until ] is reached. As the test is at the end of the
+    loop, an initial ] is taken as a data character. At the start of the loop,
+    c contains the first code unit of the character. If it is zero, check for
+    the end of the pattern, to allow binary zero as data. */
+
+    for(;;)
+      {
+      PCRE2_SPTR oldptr;
+#ifdef EBCDIC
+      BOOL range_is_literal = TRUE;
+#endif
+
+      if (c == CHAR_NULL && ptr >= cb->end_pattern)
+        {
+        *errorcodeptr = ERR6;  /* Missing terminating ']' */
+        goto FAILED;
+        }
+
+#ifdef SUPPORT_UNICODE
+      if (utf && HAS_EXTRALEN(c))
+        {                           /* 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 == CHAR_BACKSLASH && ptr[1] == CHAR_E)  /* If we are at \E */
+          {
+          inescq = FALSE;                   /* Reset literal state */
+          ptr++;                            /* Skip the 'E' */
+          goto CONTINUE_CLASS;              /* Carry on with next char */
+          }
+        goto CHECK_RANGE;                   /* Could be range if \E follows */
+        }
+
+      /* 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 == CHAR_LEFT_SQUARE_BRACKET &&
+          (ptr[1] == CHAR_COLON || ptr[1] == CHAR_DOT ||
+           ptr[1] == CHAR_EQUALS_SIGN) && check_posix_syntax(ptr, &tempptr))
+        {
+        BOOL local_negate = FALSE;
+        int posix_class, taboffset, tabopt;
+        register const uint8_t *cbits = cb->cbits;
+        uint8_t pbits[32];
+
+        if (ptr[1] != CHAR_COLON)
+          {
+          *errorcodeptr = ERR13;
+          goto FAILED;
+          }
+
+        ptr += 2;
+        if (*ptr == CHAR_CIRCUMFLEX_ACCENT)
+          {
+          local_negate = TRUE;
+          should_flip_negation = TRUE;  /* Note negative special */
+          ptr++;
+          }
+
+        posix_class = check_posix_name(ptr, (int)(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 & PCRE2_CASELESS) != 0 && posix_class <= 2)
+          posix_class = 0;
+
+        /* When PCRE2_UCP is set, some of the POSIX classes are converted to
+        different escape sequences that use Unicode properties \p or \P. Others
+        that are not available via \p or \P generate XCL_PROP/XCL_NOTPROP
+        directly. UCP support is not available unless UTF support is.*/
+
+#ifdef SUPPORT_UNICODE
+        if ((options & PCRE2_UCP) != 0)
+          {
+          unsigned int ptype = 0;
+          int pc = posix_class + ((local_negate)? POSIX_SUBSIZE/2 : 0);
+
+          /* The posix_substitutes table specifies which POSIX classes can be
+          converted to \p or \P items. This can only happen at top nestling
+          level, as there will never be a POSIX class in a string that is
+          substituted for something else. */
+
+          if (posix_substitutes[pc] != NULL)
+            {
+            cb->nestptr[0] = tempptr + 1;
+            ptr = posix_substitutes[pc] - 1;
+            goto CONTINUE_CLASS;
+            }
+
+          /* There are three other classes that generate special property calls
+          that are recognized only in an XCLASS. */
+
+          else switch(posix_class)
+            {
+            case PC_GRAPH:
+            ptype = PT_PXGRAPH;
+            /* Fall through */
+            case PC_PRINT:
+            if (ptype == 0) ptype = PT_PXPRINT;
+            /* Fall through */
+            case PC_PUNCT:
+            if (ptype == 0) ptype = PT_PXPUNCT;
+            *class_uchardata++ = local_negate? XCL_NOTPROP : XCL_PROP;
+            *class_uchardata++ = ptype;
+            *class_uchardata++ = 0;
+            xclass_has_prop = TRUE;
+            ptr = tempptr + 1;
+            goto CONTINUE_CLASS;
+
+            /* For the other POSIX classes (ascii, xdigit) we are going to fall
+            through to the non-UCP case and build a bit map for characters with
+            code points less than 256. However, if we are in a negated POSIX
+            class, characters with code points greater than 255 must either all
+            match or all not match, depending on whether the whole class is not
+            or is negated. For example, for [[:^ascii:]... they must all match,
+            whereas for [^[:^xdigit:]... they must not.
+
+            In the special case where there are no xclass items, this is
+            automatically handled by the use of OP_CLASS or OP_NCLASS, but an
+            explicit range is needed for OP_XCLASS. Setting a flag here causes
+            the range to be generated later when it is known that OP_XCLASS is
+            required. */
+
+            default:
+            match_all_or_no_wide_chars |= local_negate;
+            break;
+            }
+          }
+#endif  /* SUPPORT_UNICODE */
+
+        /* In the non-UCP case, or when UCP makes no difference, we build the
+        bit map for the POSIX class in a chunk of local store because we may be
+        adding and subtracting from it, and we don't want to subtract bits that
+        may be in the main map already. At the end we or the result into the
+        bit map that is being built. */
+
+        posix_class *= 3;
+
+        /* Copy in the first table (always present) */
+
+        memcpy(pbits, cbits + posix_class_maps[posix_class],
+          32 * sizeof(uint8_t));
+
+        /* If there is a second table, add or remove it as required. */
+
+        taboffset = posix_class_maps[posix_class + 1];
+        tabopt = posix_class_maps[posix_class + 2];
+
+        if (taboffset >= 0)
+          {
+          if (tabopt >= 0)
+            for (c = 0; c < 32; c++) pbits[c] |= cbits[c + taboffset];
+          else
+            for (c = 0; c < 32; c++) pbits[c] &= ~cbits[c + taboffset];
+          }
+
+        /* Now see if we need to remove any special characters. An option
+        value of 1 removes vertical space and 2 removes underscore. */
+
+        if (tabopt < 0) tabopt = -tabopt;
+        if (tabopt == 1) pbits[1] &= ~0x3c;
+          else if (tabopt == 2) pbits[11] &= 0x7f;
+
+        /* Add the POSIX table or its complement into the main table that is
+        being built and we are done. */
+
+        if (local_negate)
+          for (c = 0; c < 32; c++) classbits[c] |= ~pbits[c];
+        else
+          for (c = 0; c < 32; c++) classbits[c] |= pbits[c];
+
+        ptr = tempptr + 1;
+        /* Every class contains at least one < 256 character. */
+        class_has_8bitchar = 1;
+        /* Every class contains at least two characters. */
+        class_one_char = 2;
+        goto CONTINUE_CLASS;    /* End of POSIX syntax handling */
+        }
+
+      /* Backslash may introduce a single character, or it may introduce one
+      of the specials, which just set a flag. The sequence \b is a special
+      case. Inside a class (and only there) it is treated as backspace. We
+      assume that other escapes have more than one character in them, so
+      speculatively set both class_has_8bitchar and class_one_char bigger
+      than one. Unrecognized escapes fall through and are faulted. */
+
+      if (c == CHAR_BACKSLASH)
+        {
+        escape = PRIV(check_escape)(&ptr, cb->end_pattern, &ec, errorcodeptr,
+          options, TRUE, cb);
+        if (*errorcodeptr != 0) goto FAILED;
+        if (escape == 0)    /* Escaped single char */
+          {
+          c = ec;
+#ifdef EBCDIC
+          range_is_literal = FALSE;
+#endif
+          }
+        else if (escape == ESC_b) c = CHAR_BS; /* \b is backspace in a class */
+        else if (escape == ESC_N)          /* \N is not supported in a class */
+          {
+          *errorcodeptr = ERR71;
+          goto FAILED;
+          }
+        else if (escape == ESC_Q)            /* Handle start of quoted string */
+          {
+          if (ptr[1] == CHAR_BACKSLASH && ptr[2] == CHAR_E)
+            {
+            ptr += 2; /* avoid empty string */
+            }
+          else inescq = TRUE;
+          goto CONTINUE_CLASS;
+          }
+        else if (escape == ESC_E) goto CONTINUE_CLASS;  /* Ignore orphan \E */
+
+        else  /* Handle \d-type escapes */
+          {
+          register const uint8_t *cbits = cb->cbits;
+          /* Every class contains at least two < 256 characters. */
+          class_has_8bitchar++;
+          /* Every class contains at least two characters. */
+          class_one_char += 2;
+
+          switch (escape)
+            {
+#ifdef SUPPORT_UNICODE
+            case ESC_du:     /* These are the values given for \d etc */
+            case ESC_DU:     /* when PCRE2_UCP is set. We replace the */
+            case ESC_wu:     /* escape sequence with an appropriate \p */
+            case ESC_WU:     /* or \P to test Unicode properties instead */
+            case ESC_su:     /* of the default ASCII testing. This might be */
+            case ESC_SU:     /* a 2nd-level nesting for [[:<:]] or [[:>:]]. */
+            cb->nestptr[1] = cb->nestptr[0];
+            cb->nestptr[0] = ptr;
+            ptr = substitutes[escape - ESC_DU] - 1;  /* Just before substitute */
+            class_has_8bitchar--;                /* Undo! */
+            break;
+#endif
+            case ESC_d:
+            for (c = 0; c < 32; c++) classbits[c] |= cbits[c+cbit_digit];
+            break;
+
+            case ESC_D:
+            should_flip_negation = TRUE;
+            for (c = 0; c < 32; c++) classbits[c] |= ~cbits[c+cbit_digit];
+            break;
+
+            case ESC_w:
+            for (c = 0; c < 32; c++) classbits[c] |= cbits[c+cbit_word];
+            break;
+
+            case ESC_W:
+            should_flip_negation = TRUE;
+            for (c = 0; c < 32; c++) classbits[c] |= ~cbits[c+cbit_word];
+            break;
+
+            /* Perl 5.004 onwards omitted VT from \s, but restored it at Perl
+            5.18. Before PCRE 8.34, we had to preserve the VT bit if it was
+            previously set by something earlier in the character class.
+            Luckily, the value of CHAR_VT is 0x0b in both ASCII and EBCDIC, so
+            we could just adjust the appropriate bit. From PCRE 8.34 we no
+            longer treat \s and \S specially. */
+
+            case ESC_s:
+            for (c = 0; c < 32; c++) classbits[c] |= cbits[c+cbit_space];
+            break;
+
+            case ESC_S:
+            should_flip_negation = TRUE;
+            for (c = 0; c < 32; c++) classbits[c] |= ~cbits[c+cbit_space];
+            break;
+
+            /* The rest apply in both UCP and non-UCP cases. */
+
+            case ESC_h:
+            (void)add_list_to_class(classbits, &class_uchardata, options, cb,
+              PRIV(hspace_list), NOTACHAR);
+            break;
+
+            case ESC_H:
+            (void)add_not_list_to_class(classbits, &class_uchardata, options,
+              cb, PRIV(hspace_list));
+            break;
+
+            case ESC_v:
+            (void)add_list_to_class(classbits, &class_uchardata, options, cb,
+              PRIV(vspace_list), NOTACHAR);
+            break;
+
+            case ESC_V:
+            (void)add_not_list_to_class(classbits, &class_uchardata, options,
+              cb, PRIV(vspace_list));
+            break;
+
+            case ESC_p:
+            case ESC_P:
+#ifdef SUPPORT_UNICODE
+              {
+              BOOL negated;
+              unsigned int ptype = 0, pdata = 0;
+              if (!get_ucp(&ptr, &negated, &ptype, &pdata, errorcodeptr, cb))
+                goto FAILED;
+              *class_uchardata++ = ((escape == ESC_p) != negated)?
+                XCL_PROP : XCL_NOTPROP;
+              *class_uchardata++ = ptype;
+              *class_uchardata++ = pdata;
+              xclass_has_prop = TRUE;
+              class_has_8bitchar--;                /* Undo! */
+              }
+            break;
+#else
+            *errorcodeptr = ERR45;
+            goto FAILED;
+#endif
+            /* Unrecognized escapes are faulted. */
+
+            default:
+            *errorcodeptr = ERR7;
+            goto FAILED;
+            }
+
+          /* Handled \d-type escape */
+
+          goto CONTINUE_CLASS;
+          }
+
+        /* Control gets here if the escape just defined a single character.
+        This is in c and may be greater than 256. */
+
+        escape = 0;
+        }   /* End of backslash handling */
+
+      /* A character may be followed by '-' to form a range. However, Perl does
+      not permit ']' to be the end of the range. A '-' character at the end is
+      treated as a literal. Perl ignores orphaned \E sequences entirely. The
+      code for handling \Q and \E is messy. */
+
+      CHECK_RANGE:
+      while (ptr[1] == CHAR_BACKSLASH && ptr[2] == CHAR_E)
+        {
+        inescq = FALSE;
+        ptr += 2;
+        }
+      oldptr = ptr;
+
+      /* Remember if \r or \n were explicitly used */
+
+      if (c == CHAR_CR || c == CHAR_NL) cb->external_flags |= PCRE2_HASCRORLF;
+
+      /* Check for range */
+
+      if (!inescq && ptr[1] == CHAR_MINUS)
+        {
+        uint32_t d;
+        ptr += 2;
+        while (*ptr == CHAR_BACKSLASH && ptr[1] == CHAR_E) ptr += 2;
+
+        /* If we hit \Q (not followed by \E) at this point, go into escaped
+        mode. */
+
+        while (*ptr == CHAR_BACKSLASH && ptr[1] == CHAR_Q)
+          {
+          ptr += 2;
+          if (*ptr == CHAR_BACKSLASH && ptr[1] == CHAR_E)
+            { ptr += 2; continue; }
+          inescq = TRUE;
+          break;
+          }
+
+        /* Minus (hyphen) at the end of a class is treated as a literal, so put
+        back the pointer and jump to handle the character that preceded it. */
+
+        if (*ptr == CHAR_NULL || (!inescq && *ptr == CHAR_RIGHT_SQUARE_BRACKET))
+          {
+          ptr = oldptr;
+          goto CLASS_SINGLE_CHARACTER;
+          }
+
+        /* Otherwise, we have a potential range; pick up the next character */
+
+#ifdef SUPPORT_UNICODE
+        if (utf)
+          {                           /* Braces are required because the */
+          GETCHARLEN(d, ptr, ptr);    /* macro generates multiple statements */
+          }
+        else
+#endif
+        d = *ptr;  /* Not UTF mode */
+
+        /* The second part of a range can be a single-character escape
+        sequence, but not any of the other escapes. Perl treats a hyphen as a
+        literal in such circumstances. However, in Perl's warning mode, a
+        warning is given, so PCRE now faults it as it is almost certainly a
+        mistake on the user's part. */
+
+        if (!inescq)
+          {
+          if (d == CHAR_BACKSLASH)
+            {
+            int descape;
+            descape = PRIV(check_escape)(&ptr, cb->end_pattern, &d,
+              errorcodeptr, options, TRUE, cb);
+            if (*errorcodeptr != 0) goto FAILED;
+#ifdef EBCDIC
+            range_is_literal = FALSE;
+#endif
+            /* 0 means a character was put into d; \b is backspace; any other
+            special causes an error. */
+
+            if (descape != 0)
+              {
+              if (descape == ESC_b) d = CHAR_BS; else
+                {
+                *errorcodeptr = ERR50;
+                goto FAILED;
+                }
+              }
+            }
+
+          /* A hyphen followed by a POSIX class is treated in the same way. */
+
+          else if (d == CHAR_LEFT_SQUARE_BRACKET &&
+                   (ptr[1] == CHAR_COLON || ptr[1] == CHAR_DOT ||
+                    ptr[1] == CHAR_EQUALS_SIGN) &&
+                   check_posix_syntax(ptr, &tempptr))
+            {
+            *errorcodeptr = ERR50;
+            goto FAILED;
+            }
+          }
+
+        /* Check that the two values are in the correct order. Optimize
+        one-character ranges. */
+
+        if (d < c)
+          {
+          *errorcodeptr = ERR8;
+          goto FAILED;
+          }
+        if (d == c) goto CLASS_SINGLE_CHARACTER;  /* A few lines below */
+
+        /* We have found a character range, so single character optimizations
+        cannot be done anymore. Any value greater than 1 indicates that there
+        is more than one character. */
+
+        class_one_char = 2;
+
+        /* Remember an explicit \r or \n, and add the range to the class. */
+
+        if (d == CHAR_CR || d == CHAR_NL) cb->external_flags |= PCRE2_HASCRORLF;
+
+        /* In an EBCDIC environment, Perl treats alphabetic ranges specially
+        because there are holes in the encoding, and simply using the range A-Z
+        (for example) would include the characters in the holes. This applies
+        only to literal ranges; [\xC1-\xE9] is different to [A-Z]. */
+
+#ifdef EBCDIC
+        if (range_is_literal &&
+             (cb->ctypes[c] & ctype_letter) != 0 &&
+             (cb->ctypes[d] & ctype_letter) != 0 &&
+             (c <= CHAR_z) == (d <= CHAR_z))
+          {
+          uint32_t uc = (c <= CHAR_z)? 0 : 64;
+          uint32_t C = c - uc;
+          uint32_t D = d - uc;
+
+          if (C <= CHAR_i)
+            {
+            class_has_8bitchar +=
+              add_to_class(classbits, &class_uchardata, options, cb, C + uc,
+                ((D < CHAR_i)? D : CHAR_i) + uc);
+            C = CHAR_j;
+            }
+
+          if (C <= D && C <= CHAR_r)
+            {
+            class_has_8bitchar +=
+              add_to_class(classbits, &class_uchardata, options, cb, C + uc,
+                ((D < CHAR_r)? D : CHAR_r) + uc);
+            C = CHAR_s;
+            }
+
+          if (C <= D)
+            {
+            class_has_8bitchar +=
+              add_to_class(classbits, &class_uchardata, options, cb, C + uc,
+                D + uc);
+            }
+          }
+        else
+#endif
+        class_has_8bitchar +=
+          add_to_class(classbits, &class_uchardata, options, cb, c, d);
+        goto CONTINUE_CLASS;   /* Go get the next char in the class */
+        }
+
+      /* Handle a 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. Only the value 1 matters for class_one_char, so don't
+      increase it if it is already 2 or more ... just in case there's a class
+      with a zillion characters in it. */
+
+      CLASS_SINGLE_CHARACTER:
+      if (class_one_char < 2) class_one_char++;
+
+      /* If class_one_char is 1 and xclass_has_prop is false, we have the first
+      single character in the class, and there have been no prior ranges, or
+      XCLASS items generated by escapes. If this is the final character in the
+      class, we can optimize by turning the item into a 1-character OP_CHAR[I]
+      if it's positive, or OP_NOT[I] if it's negative. In the positive case, it
+      can cause firstcu to be set. Otherwise, there can be no first char if
+      this item is first, whatever repeat count may follow. In the case of
+      reqcu, save the previous value for reinstating. */
+
+      if (!inescq &&
+#ifdef SUPPORT_UNICODE
+          !xclass_has_prop &&
+#endif
+          class_one_char == 1 && ptr[1] == CHAR_RIGHT_SQUARE_BRACKET)
+        {
+        ptr++;
+        zeroreqcu = reqcu;
+        zeroreqcuflags = reqcuflags;
+
+        if (negate_class)
+          {
+#ifdef SUPPORT_UNICODE
+          int d;
+#endif
+          if (firstcuflags == REQ_UNSET) firstcuflags = REQ_NONE;
+          zerofirstcu = firstcu;
+          zerofirstcuflags = firstcuflags;
+
+          /* For caseless UTF mode, check whether this character has more than
+          one other case. If so, generate a special OP_NOTPROP item instead of
+          OP_NOTI. */
+
+#ifdef SUPPORT_UNICODE
+          if (utf && (options & PCRE2_CASELESS) != 0 &&
+              (d = UCD_CASESET(c)) != 0)
+            {
+            *code++ = OP_NOTPROP;
+            *code++ = PT_CLIST;
+            *code++ = d;
+            }
+          else
+#endif
+          /* Char has only one other case, or UCP not available */
+
+            {
+            *code++ = ((options & PCRE2_CASELESS) != 0)? OP_NOTI: OP_NOT;
+            code += PUTCHAR(c, code);
+            }
+
+          /* We are finished with this character class */
+
+          goto END_CLASS;
+          }
+
+        /* For a single, positive character, get the value into mcbuffer, and
+        then we can handle this with the normal one-character code. */
+
+        mclength = PUTCHAR(c, mcbuffer);
+        goto ONE_CHAR;
+        }       /* End of 1-char optimization */
+
+      /* There is more than one character in the class, or an XCLASS item
+      has been generated. Add this character to the class. */
+
+      class_has_8bitchar +=
+        add_to_class(classbits, &class_uchardata, options, cb, c, c);
+
+      /* Continue to the next character in the class. Closing square bracket
+      not within \Q..\E ends the class. A NULL character terminates a
+      nested substitution string, but may be a data character in the main
+      pattern (tested at the start of this loop). */
+
+      CONTINUE_CLASS:
+      c = *(++ptr);
+      if (c == CHAR_NULL && cb->nestptr[0] != NULL)
+        {
+        ptr = cb->nestptr[0];
+        cb->nestptr[0] = cb->nestptr[1];
+        cb->nestptr[1] = NULL;
+        c = *(++ptr);
+        }
+
+#ifdef SUPPORT_WIDE_CHARS
+      /* If any wide characters have been encountered, set xclass = TRUE. Then,
+      in the pre-compile phase, accumulate the length of the wide characters
+      and reset the pointer. This is so that very large classes that contain a
+      zillion wide characters do not overwrite the work space (which is on the
+      stack). */
+
+      if (class_uchardata > class_uchardata_base)
+        {
+        xclass = TRUE;
+        if (lengthptr != NULL)
+          {
+          *lengthptr += class_uchardata - class_uchardata_base;
+          class_uchardata = class_uchardata_base;
+          }
+        }
+#endif
+      /* An unescaped ] ends the class */
+
+      if (c == CHAR_RIGHT_SQUARE_BRACKET && !inescq) break;
+      }   /* End of main class-processing loop */
+
+    /* If this is the first thing in the branch, there can be no first char
+    setting, whatever the repeat count. Any reqcu setting must remain
+    unchanged after any kind of repeat. */
+
+    if (firstcuflags == REQ_UNSET) firstcuflags = REQ_NONE;
+    zerofirstcu = firstcu;
+    zerofirstcuflags = firstcuflags;
+    zeroreqcu = reqcu;
+    zeroreqcuflags = reqcuflags;
+
+    /* If there are characters with values > 255, or Unicode property settings
+    (\p or \P), we have to compile an extended class, with its own opcode,
+    unless there were no property settings and there was a negated special such
+    as \S in the class, and PCRE2_UCP is not set, because in that case all
+    characters > 255 are in or not in the class, so any that were explicitly
+    given as well can be ignored.
+
+    In the UCP case, if certain negated POSIX classes ([:^ascii:] or
+    [^:xdigit:]) were present in a class, we either have to match or not match
+    all wide characters (depending on whether the whole class is or is not
+    negated). This requirement is indicated by match_all_or_no_wide_chars being
+    true. We do this by including an explicit range, which works in both cases.
+
+    If, when generating an xclass, there are no characters < 256, we can omit
+    the bitmap in the actual compiled code. */
+
+#ifdef SUPPORT_WIDE_CHARS
+#ifdef SUPPORT_UNICODE
+    if (xclass && (xclass_has_prop || !should_flip_negation ||
+         (options & PCRE2_UCP) != 0))
+#elif PCRE2_CODE_UNIT_WIDTH != 8
+    if (xclass && (xclass_has_prop || !should_flip_negation))
+#endif
+      {
+      if (match_all_or_no_wide_chars)
+        {
+        *class_uchardata++ = XCL_RANGE;
+        class_uchardata += PRIV(ord2utf)(0x100, class_uchardata);
+        class_uchardata += PRIV(ord2utf)(MAX_UTF_CODE_POINT, class_uchardata);
+        }
+      *class_uchardata++ = XCL_END;    /* Marks the end of extra data */
+      *code++ = OP_XCLASS;
+      code += LINK_SIZE;
+      *code = negate_class? XCL_NOT:0;
+      if (xclass_has_prop) *code |= XCL_HASPROP;
+
+      /* If the map is required, move up the extra data to make room for it;
+      otherwise just move the code pointer to the end of the extra data. */
+
+      if (class_has_8bitchar > 0)
+        {
+        *code++ |= XCL_MAP;
+        memmove(code + (32 / sizeof(PCRE2_UCHAR)), code,
+          CU2BYTES(class_uchardata - code));
+        if (negate_class && !xclass_has_prop)
+          for (c = 0; c < 32; c++) classbits[c] = ~classbits[c];
+        memcpy(code, classbits, 32);
+        code = class_uchardata + (32 / sizeof(PCRE2_UCHAR));
+        }
+      else code = class_uchardata;
+
+      /* Now fill in the complete length of the item */
+
+      PUT(previous, 1, (int)(code - previous));
+      break;   /* End of class handling */
+      }
+#endif
+
+    /* If there are no characters > 255, or they are all to be included or
+    excluded, set the opcode to OP_CLASS or OP_NCLASS, depending on whether the
+    whole class was negated and whether there were negative specials such as \S
+    (non-UCP) in the class. Then copy the 32-byte map into the code vector,
+    negating it if necessary. */
+
+    *code++ = (negate_class == should_flip_negation) ? OP_CLASS : OP_NCLASS;
+    if (lengthptr == NULL)    /* Save time in the pre-compile phase */
+      {
+      if (negate_class)
+        for (c = 0; c < 32; c++) classbits[c] = ~classbits[c];
+      memcpy(code, classbits, 32);
+      }
+    code += 32 / sizeof(PCRE2_UCHAR);
+
+    END_CLASS:
+    break;
+
+
+    /* ===================================================================*/
+    /* Various kinds of repeat; '{' is not necessarily a quantifier, but this
+    has been tested above. */
+
+    case CHAR_LEFT_CURLY_BRACKET:
+    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 CHAR_ASTERISK:
+    repeat_min = 0;
+    repeat_max = -1;
+    goto REPEAT;
+
+    case CHAR_PLUS:
+    repeat_min = 1;
+    repeat_max = -1;
+    goto REPEAT;
+
+    case CHAR_QUESTION_MARK:
+    repeat_min = 0;
+    repeat_max = 1;
+
+    REPEAT:
+    if (previous == NULL)
+      {
+      *errorcodeptr = ERR9;
+      goto FAILED;
+      }
+
+    if (repeat_min == 0)
+      {
+      firstcu = zerofirstcu;    /* Adjust for zero repeat */
+      firstcuflags = zerofirstcuflags;
+      reqcu = zeroreqcu;        /* Ditto */
+      reqcuflags = zeroreqcuflags;
+      }
+
+    /* 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 in order to
+    insert something before it. */
+
+    tempcode = previous;
+
+    /* Before checking for a possessive quantifier, we must skip over
+    whitespace and comments in extended mode because Perl allows white space at
+    this point. */
+
+    if ((options & PCRE2_EXTENDED) != 0)
+      {
+      ptr++;
+      for (;;)
+        {
+        while (MAX_255(*ptr) && (cb->ctypes[*ptr] & ctype_space) != 0) ptr++;
+        if (*ptr != CHAR_NUMBER_SIGN) break;
+        ptr++;
+        while (ptr < cb->end_pattern)
+          {
+          if (IS_NEWLINE(ptr))         /* For non-fixed-length newline cases, */
+            {                        /* IS_NEWLINE sets cb->nllen. */
+            ptr += cb->nllen;
+            break;
+            }
+          ptr++;
+#ifdef SUPPORT_UNICODE
+          if (utf) FORWARDCHAR(ptr);
+#endif
+          }           /* Loop for comment characters */
+        }             /* Loop for multiple comments */
+      ptr--;          /* Last code unit of previous character. */
+      }
+
+    /* If the next character is '+', we have a possessive quantifier. This
+    implies greediness, whatever the setting of the PCRE2_UNGREEDY option.
+    If the next character is '?' this is a minimizing repeat, by default,
+    but if PCRE2_UNGREEDY is set, it works the other way round. We change the
+    repeat type to the non-default. */
+
+    if (ptr[1] == CHAR_PLUS)
+      {
+      repeat_type = 0;                  /* Force greedy */
+      possessive_quantifier = TRUE;
+      ptr++;
+      }
+    else if (ptr[1] == CHAR_QUESTION_MARK)
+      {
+      repeat_type = greedy_non_default;
+      ptr++;
+      }
+    else repeat_type = greedy_default;
+
+    /* If the repeat is {1} we can ignore it. */
+
+    if (repeat_max == 1 && repeat_min == 1) goto END_REPEAT;
+
+    /* If previous was a recursion call, wrap it in atomic brackets so that
+    previous becomes the atomic group. All recursions were so wrapped in the
+    past, but it no longer happens for non-repeated recursions. In fact, the
+    repeated ones could be re-implemented independently so as not to need this,
+    but for the moment we rely on the code for repeating groups. */
+
+    if (*previous == OP_RECURSE)
+      {
+      memmove(previous + 1 + LINK_SIZE, previous, CU2BYTES(1 + LINK_SIZE));
+      *previous = OP_ONCE;
+      PUT(previous, 1, 2 + 2*LINK_SIZE);
+      previous[2 + 2*LINK_SIZE] = OP_KET;
+      PUT(previous, 3 + 2*LINK_SIZE, 2 + 2*LINK_SIZE);
+      code += 2 + 2 * LINK_SIZE;
+      length_prevgroup = 3 + 3*LINK_SIZE;
+      }
+
+    /* Now handle repetition for the different types of item. */
+
+    /* If previous was a character or negated character match, abolish the item
+    and generate a repeat item instead. If a char item has a minimum of more
+    than one, ensure that it is set in reqcu - 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 firstcu instead.  */
+
+    if (*previous == OP_CHAR || *previous == OP_CHARI
+        || *previous == OP_NOT || *previous == OP_NOTI)
+      {
+      switch (*previous)
+        {
+        default: /* Make compiler happy. */
+        case OP_CHAR:  op_type = OP_STAR - OP_STAR; break;
+        case OP_CHARI: op_type = OP_STARI - OP_STAR; break;
+        case OP_NOT:   op_type = OP_NOTSTAR - OP_STAR; break;
+        case OP_NOTI:  op_type = OP_NOTSTARI - OP_STAR; break;
+        }
+
+      /* Deal with UTF characters that take up more than one code unit. It's
+      easier to write this out separately than try to macrify it. Use c to
+      hold the length of the character in code units, plus UTF_LENGTH to flag
+      that it's a length rather than a small character. */
+
+#ifdef MAYBE_UTF_MULTI
+      if (utf && NOT_FIRSTCU(code[-1]))
+        {
+        PCRE2_UCHAR *lastchar = code - 1;
+        BACKCHAR(lastchar);
+        c = (int)(code - lastchar);               /* Length of UTF character */
+        memcpy(utf_units, lastchar, CU2BYTES(c)); /* Save the char */
+        c |= UTF_LENGTH;                          /* Flag c as a length */
+        }
+      else
+#endif  /* MAYBE_UTF_MULTI */
+
+      /* Handle the case of a single charater - either with no UTF support, or
+      with UTF disabled, or for a single-code-unit UTF character. */
+        {
+        c = code[-1];
+        if (*previous <= OP_CHARI && repeat_min > 1)
+          {
+          reqcu = c;
+          reqcuflags = req_caseopt | cb->req_varyopt;
+          }
+        }
+
+      goto OUTPUT_SINGLE_REPEAT;   /* Code shared with single character types */
+      }
+
+    /* 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_UNICODE 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)
+      {
+      PCRE2_UCHAR *oldcode;
+      int prop_type, prop_value;
+      op_type = OP_TYPESTAR - OP_STAR;      /* Use type opcodes */
+      c = *previous;                        /* Save previous opcode */
+      if (c == OP_PROP || c == OP_NOTPROP)
+        {
+        prop_type = previous[1];
+        prop_value = previous[2];
+        }
+      else
+        {
+        /* Come here from just above with a character in c */
+        OUTPUT_SINGLE_REPEAT:
+        prop_type = prop_value = -1;
+        }
+
+      /* At this point we either have prop_type == prop_value == -1 and either
+      a code point or a character type that is not OP_[NOT]PROP in c, or we
+      have OP_[NOT]PROP in c and prop_type/prop_value not negative. */
+
+      oldcode = code;                   /* Save where we were */
+      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;
+
+      /* 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 is
+      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 or STAR or QUERY. */
+
+      else
+        {
+        *code++ = OP_EXACT + op_type;  /* NB EXACT doesn't have repeat_type */
+        PUT2INC(code, 0, repeat_min);
+
+        /* Unless repeat_max equals repeat_min, fill in the data for EXACT, and
+        then generate the second opcode. In UTF mode, multi-code-unit
+        characters have their length in c, with the UTF_LENGTH bit as a flag,
+        and the code units in utf_units. For a repeated Unicode property match,
+        there are two extra values that define the required property, and c
+        never has the UTF_LENGTH bit set. */
+
+        if (repeat_max != repeat_min)
+          {
+#ifdef MAYBE_UTF_MULTI
+          if (utf && (c & UTF_LENGTH) != 0)
+            {
+            memcpy(code, utf_units, CU2BYTES(c & 7));
+            code += c & 7;
+            }
+          else
+#endif  /* MAYBE_UTF_MULTI */
+            {
+            *code++ = c;
+            if (prop_type >= 0)
+              {
+              *code++ = prop_type;
+              *code++ = prop_value;
+              }
+            }
+
+          /* Now set up the following opcode */
+
+          if (repeat_max < 0) *code++ = OP_STAR + repeat_type; else
+            {
+            repeat_max -= repeat_min;
+            if (repeat_max == 1)
+              {
+              *code++ = OP_QUERY + repeat_type;
+              }
+            else
+              {
+              *code++ = OP_UPTO + repeat_type;
+              PUT2INC(code, 0, repeat_max);
+              }
+            }
+          }
+        }
+
+      /* Fill in the character or character type for the final opcode. */
+
+#ifdef MAYBE_UTF_MULTI
+      if (utf && (c & UTF_LENGTH) != 0)
+        {
+        memcpy(code, utf_units, CU2BYTES(c & 7));
+        code += c & 7;
+        }
+      else
+#endif  /* MAYBEW_UTF_MULTI */
+        {
+        *code++ = c;
+        if (prop_type >= 0)
+          {
+          *code++ = prop_type;
+          *code++ = prop_value;
+          }
+        }
+      }
+
+    /* 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_WIDE_CHARS
+             *previous == OP_XCLASS ||
+#endif
+             *previous == OP_REF   || *previous == OP_REFI ||
+             *previous == OP_DNREF || *previous == OP_DNREFI)
+      {
+      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. Note that at this point we can encounter only the "basic" bracket
+    opcodes such as BRA and CBRA, as this is the place where they get converted
+    into the more special varieties such as BRAPOS and SBRA. A test for >=
+    OP_ASSERT and <= OP_COND includes ASSERT, ASSERT_NOT, ASSERTBACK,
+    ASSERTBACK_NOT, ONCE, ONCE_NC, BRA, BRAPOS, CBRA, CBRAPOS, and COND.
+    Originally, PCRE did not allow repetition of assertions, but now it does,
+    for Perl compatibility. */
+
+    else if (*previous >= OP_ASSERT && *previous <= OP_COND)
+      {
+      register int i;
+      int len = (int)(code - previous);
+      PCRE2_UCHAR *bralink = NULL;
+      PCRE2_UCHAR *brazeroptr = NULL;
+
+      /* Repeating a DEFINE group (or any group where the condition is always
+      FALSE and there is only one branch) is pointless, but Perl allows the
+      syntax, so we just ignore the repeat. */
+
+      if (*previous == OP_COND && previous[LINK_SIZE+1] == OP_FALSE &&
+          previous[GET(previous, 1)] != OP_ALT)
+        goto END_REPEAT;
+
+      /* There is no sense in actually repeating assertions. The only potential
+      use of repetition is in cases when the assertion is optional. Therefore,
+      if the minimum is greater than zero, just ignore the repeat. If the
+      maximum is not zero or one, set it to 1. */
+
+      if (*previous < OP_ONCE)    /* Assertion */
+        {
+        if (repeat_min > 0) goto END_REPEAT;
+        if (repeat_max < 0 || repeat_max > 1) repeat_max = 1;
+        }
+
+      /* 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 used to just omit the group from the
+        output altogether, like this:
+
+        ** if (repeat_max == 0)
+        **   {
+        **   code = previous;
+        **   goto END_REPEAT;
+        **   }
+
+        However, that fails when a group or a subgroup within it is referenced
+        as a subroutine from elsewhere in the pattern, so now we stick in
+        OP_SKIPZERO in front of it so that it is skipped on execution. As we
+        don't have a list of which groups are referenced, we cannot do this
+        selectively.
+
+        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)    /* Covers 0, 1, and unlimited */
+          {
+          memmove(previous + 1, previous, CU2BYTES(len));
+          code++;
+          if (repeat_max == 0)
+            {
+            *previous++ = OP_SKIPZERO;
+            goto END_REPEAT;
+            }
+          brazeroptr = previous;    /* Save for possessive optimizing */
+          *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. */
+
+        else
+          {
+          int offset;
+          memmove(previous + 2 + LINK_SIZE, previous, CU2BYTES(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 : (int)(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. */
+
+      else
+        {
+        if (repeat_min > 1)
+          {
+          /* In the pre-compile phase, we don't actually do the replication. We
+          just adjust the length as if we had. Do some paranoid checks for
+          potential integer overflow. The INT64_OR_DOUBLE type is a 64-bit
+          integer type when available, otherwise double. */
+
+          if (lengthptr != NULL)
+            {
+            size_t delta = (repeat_min - 1)*length_prevgroup;
+            if ((INT64_OR_DOUBLE)(repeat_min - 1)*
+                  (INT64_OR_DOUBLE)length_prevgroup >
+                    (INT64_OR_DOUBLE)INT_MAX ||
+                OFLOW_MAX - *lengthptr < delta)
+              {
+              *errorcodeptr = ERR20;
+              goto FAILED;
+              }
+            *lengthptr += delta;
+            }
+
+          /* This is compiling for real. If there is a set first byte for
+          the group, and we have not yet set a "required byte", set it. */
+
+          else
+            {
+            if (groupsetfirstcu && reqcuflags < 0)
+              {
+              reqcu = firstcu;
+              reqcuflags = firstcuflags;
+              }
+            for (i = 1; i < repeat_min; i++)
+              {
+              memcpy(code, previous, CU2BYTES(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. Again, we must remember to
+      replicate entries on the forward reference list. */
+
+      if (repeat_max >= 0)
+        {
+        /* In the pre-compile phase, we don't actually do the replication. We
+        just adjust the length as if we had. For each repetition we must add 1
+        to the length for BRAZERO and for all but the last repetition we must
+        add 2 + 2*LINKSIZE to allow for the nesting that occurs. Do some
+        paranoid checks to avoid integer overflow. The INT64_OR_DOUBLE type is
+        a 64-bit integer type when available, otherwise double. */
+
+        if (lengthptr != NULL && repeat_max > 0)
+          {
+          size_t delta = repeat_max*(length_prevgroup + 1 + 2 + 2*LINK_SIZE) -
+                      2 - 2*LINK_SIZE;   /* Last one doesn't nest */
+          if ((INT64_OR_DOUBLE)repeat_max *
+                (INT64_OR_DOUBLE)(length_prevgroup + 1 + 2 + 2*LINK_SIZE)
+                  > (INT64_OR_DOUBLE)INT_MAX ||
+              OFLOW_MAX - *lengthptr < delta)
+            {
+            *errorcodeptr = ERR20;
+            goto FAILED;
+            }
+          *lengthptr += delta;
+          }
+
+        /* This is compiling for real */
+
+        else 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 : (int)(code - bralink);
+            bralink = code;
+            PUTINC(code, 0, offset);
+            }
+
+          memcpy(code, previous, CU2BYTES(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 = (int)(code - bralink + 1);
+          PCRE2_UCHAR *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. For
+      ONCE brackets, that's all we need to do. However, possessively repeated
+      ONCE brackets can be converted into non-capturing brackets, as the
+      behaviour of (?:xx)++ is the same as (?>xx)++ and this saves having to
+      deal with possessive ONCEs specially.
+
+      Otherwise, when we are doing the actual compile phase, check to see
+      whether this group is one that could match an empty string. If so,
+      convert the initial operator to the S form (e.g. OP_BRA -> OP_SBRA) so
+      that runtime checking can be done. [This check is also applied to ONCE
+      groups at runtime, but in a different way.]
+
+      Then, if the quantifier was possessive and the bracket is not a
+      conditional, we convert the BRA code to the POS form, and the KET code to
+      KETRPOS. (It turns out to be convenient at runtime to detect this kind of
+      subpattern at both the start and at the end.) The use of special opcodes
+      makes it possible to reduce greatly the stack usage in pcre2_match(). If
+      the group is preceded by OP_BRAZERO, convert this to OP_BRAPOSZERO.
+
+      Then, if the minimum number of matches is 1 or 0, cancel the possessive
+      flag so that the default action below, of wrapping everything inside
+      atomic brackets, does not happen. When the minimum is greater than 1,
+      there will be earlier copies of the group, and so we still have to wrap
+      the whole thing. */
+
+      else
+        {
+        PCRE2_UCHAR *ketcode = code - 1 - LINK_SIZE;
+        PCRE2_UCHAR *bracode = ketcode - GET(ketcode, 1);
+
+        /* Convert possessive ONCE brackets to non-capturing */
+
+        if ((*bracode == OP_ONCE || *bracode == OP_ONCE_NC) &&
+            possessive_quantifier) *bracode = OP_BRA;
+
+        /* For non-possessive ONCE brackets, all we need to do is to
+        set the KET. */
+
+        if (*bracode == OP_ONCE || *bracode == OP_ONCE_NC)
+          *ketcode = OP_KETRMAX + repeat_type;
+
+        /* Handle non-ONCE brackets and possessive ONCEs (which have been
+        converted to non-capturing above). */
+
+        else
+          {
+          /* In the compile phase, check whether the group could match an empty
+          string. */
+
+          if (lengthptr == NULL)
+            {
+            PCRE2_UCHAR *scode = bracode;
+            do
+              {
+              int count = 0;
+              int rc = could_be_empty_branch(scode, ketcode, utf, cb, FALSE,
+                NULL, &count);
+              if (rc < 0)
+                {
+                *errorcodeptr = ERR86;
+                goto FAILED;
+                }
+              if (rc > 0)
+                {
+                *bracode += OP_SBRA - OP_BRA;
+                break;
+                }
+              scode += GET(scode, 1);
+              }
+            while (*scode == OP_ALT);
+
+            /* A conditional group with only one branch has an implicit empty
+            alternative branch. */
+
+            if (*bracode == OP_COND && bracode[GET(bracode,1)] != OP_ALT)
+              *bracode = OP_SCOND;
+            }
+
+          /* Handle possessive quantifiers. */
+
+          if (possessive_quantifier)
+            {
+            /* For COND brackets, we wrap the whole thing in a possessively
+            repeated non-capturing bracket, because we have not invented POS
+            versions of the COND opcodes. */
+
+            if (*bracode == OP_COND || *bracode == OP_SCOND)
+              {
+              int nlen = (int)(code - bracode);
+              memmove(bracode + 1 + LINK_SIZE, bracode, CU2BYTES(nlen));
+              code += 1 + LINK_SIZE;
+              nlen += 1 + LINK_SIZE;
+              *bracode = (*bracode == OP_COND)? OP_BRAPOS : OP_SBRAPOS;
+              *code++ = OP_KETRPOS;
+              PUTINC(code, 0, nlen);
+              PUT(bracode, 1, nlen);
+              }
+
+            /* For non-COND brackets, we modify the BRA code and use KETRPOS. */
+
+            else
+              {
+              *bracode += 1;              /* Switch to xxxPOS opcodes */
+              *ketcode = OP_KETRPOS;
+              }
+
+            /* If the minimum is zero, mark it as possessive, then unset the
+            possessive flag when the minimum is 0 or 1. */
+
+            if (brazeroptr != NULL) *brazeroptr = OP_BRAPOSZERO;
+            if (repeat_min < 2) possessive_quantifier = FALSE;
+            }
+
+          /* Non-possessive quantifier */
+
+          else *ketcode = OP_KETRMAX + repeat_type;
+          }
+        }
+      }
+
+    /* If previous is OP_FAIL, it was generated by an empty class []
+    (PCRE2_ALLOW_EMPTY_CLASS is set). The other ways in which OP_FAIL can be
+    generated, that is by (*FAIL) or (?!), set previous to NULL, which gives a
+    "nothing to repeat" error above. We can just ignore the repeat in empty
+    class case. */
+
+    else if (*previous == OP_FAIL) goto END_REPEAT;
+
+    /* Else there's some kind of shambles */
+
+    else
+      {
+      *errorcodeptr = ERR10;
+      goto FAILED;
+      }
+
+    /* If the character following a repeat is '+', possessive_quantifier is
+    TRUE. For some opcodes, there are special alternative opcodes for this
+    case. For anything else, we wrap the entire repeated item inside OP_ONCE
+    brackets. Logically, the '+' notation is just syntactic sugar, taken from
+    Sun's Java package, but the special opcodes can optimize it.
+
+    Some (but not all) possessively repeated subpatterns have already been
+    completely handled in the code just above. For them, possessive_quantifier
+    is always FALSE at this stage. Note that the repeated item starts at
+    tempcode, not at previous, which might be the first part of a string whose
+    (former) last char we repeated. */
+
+    if (possessive_quantifier)
+      {
+      int len;
+
+      /* Possessifying an EXACT quantifier has no effect, so we can ignore it.
+      However, QUERY, STAR, or UPTO may follow (for quantifiers such as {5,6},
+      {5,}, or {5,10}). We skip over an EXACT item; if the length of what
+      remains is greater than zero, there's a further opcode that can be
+      handled. If not, do nothing, leaving the EXACT alone. */
+
+      switch(*tempcode)
+        {
+        case OP_TYPEEXACT:
+        tempcode += PRIV(OP_lengths)[*tempcode] +
+          ((tempcode[1 + IMM2_SIZE] == OP_PROP
+          || tempcode[1 + IMM2_SIZE] == OP_NOTPROP)? 2 : 0);
+        break;
+
+        /* CHAR opcodes are used for exacts whose count is 1. */
+
+        case OP_CHAR:
+        case OP_CHARI:
+        case OP_NOT:
+        case OP_NOTI:
+        case OP_EXACT:
+        case OP_EXACTI:
+        case OP_NOTEXACT:
+        case OP_NOTEXACTI:
+        tempcode += PRIV(OP_lengths)[*tempcode];
+#ifdef SUPPORT_UNICODE
+        if (utf && HAS_EXTRALEN(tempcode[-1]))
+          tempcode += GET_EXTRALEN(tempcode[-1]);
+#endif
+        break;
+
+        /* For the class opcodes, the repeat operator appears at the end;
+        adjust tempcode to point to it. */
+
+        case OP_CLASS:
+        case OP_NCLASS:
+        tempcode += 1 + 32/sizeof(PCRE2_UCHAR);
+        break;
+
+#ifdef SUPPORT_WIDE_CHARS
+        case OP_XCLASS:
+        tempcode += GET(tempcode, 1);
+        break;
+#endif
+        }
+
+      /* If tempcode is equal to code (which points to the end of the repeated
+      item), it means we have skipped an EXACT item but there is no following
+      QUERY, STAR, or UPTO; the value of len will be 0, and we do nothing. In
+      all other cases, tempcode will be pointing to the repeat opcode, and will
+      be less than code, so the value of len will be greater than 0. */
+
+      len = (int)(code - tempcode);
+      if (len > 0)
+        {
+        unsigned int repcode = *tempcode;
+
+        /* There is a table for possessifying opcodes, all of which are less
+        than OP_CALLOUT. A zero entry means there is no possessified version.
+        */
+
+        if (repcode < OP_CALLOUT && opcode_possessify[repcode] > 0)
+          *tempcode = opcode_possessify[repcode];
+
+        /* For opcode without a special possessified version, wrap the item in
+        ONCE brackets. */
+
+        else
+          {
+          memmove(tempcode + 1 + LINK_SIZE, tempcode, CU2BYTES(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 reqcus if
+    it isn't already set and we have just passed a varying length item. */
+
+    END_REPEAT:
+    previous = NULL;
+    cb->req_varyopt |= reqvary;
+    break;
+
+
+    /* ===================================================================*/
+    /* Start of nested parenthesized sub-expression, or lookahead or lookbehind
+    or option setting or condition or all the other extended parenthesis forms.
+    We must save the current high-water-mark for the forward reference list so
+    that we know where they start for this group. However, because the list may
+    be extended when there are very many forward references (usually the result
+    of a replicated inner group), we must use an offset rather than an absolute
+    address. Note that (?# comments are dealt with at the top of the loop;
+    they do not get this far. */
+
+    case CHAR_LEFT_PARENTHESIS:
+    ptr++;
+
+    /* Deal with various "verbs" that can be introduced by '*'. */
+
+    if (ptr[0] == CHAR_ASTERISK && (ptr[1] == ':'
+         || (MAX_255(ptr[1]) && ((cb->ctypes[ptr[1]] & ctype_letter) != 0))))
+      {
+      int i, namelen;
+      int arglen = 0;
+      const char *vn = verbnames;
+      PCRE2_SPTR name = ptr + 1;
+      PCRE2_SPTR arg = NULL;
+      previous = NULL;
+      ptr++;
+
+      /* Increment ptr, set namelen, check length */
+
+      READ_NAME(ctype_letter, ERR60, *errorcodeptr);
+
+      /* It appears that Perl allows any characters whatsoever, other than
+      a closing parenthesis, to appear in arguments, so we no longer insist on
+      letters, digits, and underscores. Perl does not, however, do any
+      interpretation within arguments, and has no means of including a closing
+      parenthesis. PCRE supports escape processing but only when it is
+      requested by an option. Note that check_escape() will not return values
+      greater than the code unit maximum when not in UTF mode. */
+
+      if (*ptr == CHAR_COLON)
+        {
+        arg = ++ptr;
+
+        if ((options & PCRE2_ALT_VERBNAMES) == 0)
+          {
+          arglen = 0;
+          while (ptr < cb->end_pattern && *ptr != CHAR_RIGHT_PARENTHESIS)
+            {
+            ptr++;                                /* Check length as we go */
+            arglen++;                             /* along, to avoid the   */
+            if ((unsigned int)arglen > MAX_MARK)  /* possibility of overflow. */
+              {
+              *errorcodeptr = ERR76;
+              goto FAILED;
+              }
+            }
+          }
+        else
+          {
+          /* The length check is in process_verb_names() */
+          arglen = process_verb_name(&ptr, NULL, errorcodeptr, options,
+            utf, cb);
+          if (arglen < 0) goto FAILED;
+          }
+        }
+
+      if (*ptr != CHAR_RIGHT_PARENTHESIS)
+        {
+        *errorcodeptr = ERR60;
+        goto FAILED;
+        }
+
+      /* Scan the table of verb names */
+
+      for (i = 0; i < verbcount; i++)
+        {
+        if (namelen == verbs[i].len &&
+            PRIV(strncmp_c8)(name, vn, namelen) == 0)
+          {
+          int setverb;
+
+          /* Check for open captures before ACCEPT and convert it to
+          ASSERT_ACCEPT if in an assertion. */
+
+          if (verbs[i].op == OP_ACCEPT)
+            {
+            open_capitem *oc;
+            if (arglen != 0)
+              {
+              *errorcodeptr = ERR59;
+              goto FAILED;
+              }
+            cb->had_accept = TRUE;
+            for (oc = cb->open_caps; oc != NULL; oc = oc->next)
+              {
+              *code++ = OP_CLOSE;
+              PUT2INC(code, 0, oc->number);
+              }
+            setverb = *code++ =
+              (cb->assert_depth > 0)? OP_ASSERT_ACCEPT : OP_ACCEPT;
+
+            /* Do not set firstcu after *ACCEPT */
+            if (firstcuflags == REQ_UNSET) firstcuflags = REQ_NONE;
+            }
+
+          /* Handle other cases with/without an argument */
+
+          else if (arglen == 0)    /* There is no argument */
+            {
+            if (verbs[i].op < 0)   /* Argument is mandatory */
+              {
+              *errorcodeptr = ERR66;
+              goto FAILED;
+              }
+            setverb = *code++ = verbs[i].op;
+            }
+
+          else                        /* An argument is present */
+            {
+            if (verbs[i].op_arg < 0)  /* Argument is forbidden */
+              {
+              *errorcodeptr = ERR59;
+              goto FAILED;
+              }
+            setverb = *code++ = verbs[i].op_arg;
+
+            /* Arguments can be very long, especially in 16- and 32-bit modes,
+            and can overflow the workspace in the first pass. Instead of
+            putting the argument into memory, we just update the length counter
+            and set up an empty argument. */
+
+            if (lengthptr != NULL)
+              {
+              *lengthptr += arglen;
+              *code++ = 0;
+              }
+            else
+              {
+              *code++ = arglen;
+              if ((options & PCRE2_ALT_VERBNAMES) != 0)
+                {
+                PCRE2_UCHAR *memcode = code;  /* code is "register" */
+                (void)process_verb_name(&arg, &memcode, errorcodeptr, options,
+                  utf, cb);
+                code = memcode;
+                }
+              else   /* No argument processing */
+                {
+                memcpy(code, arg, CU2BYTES(arglen));
+                code += arglen;
+                }
+              }
+
+            *code++ = 0;
+            }
+
+          switch (setverb)
+            {
+            case OP_THEN:
+            case OP_THEN_ARG:
+            cb->external_flags |= PCRE2_HASTHEN;
+            break;
+
+            case OP_PRUNE:
+            case OP_PRUNE_ARG:
+            case OP_SKIP:
+            case OP_SKIP_ARG:
+            cb->had_pruneorskip = TRUE;
+            break;
+            }
+
+          break;  /* Found verb, exit loop */
+          }
+
+        vn += verbs[i].len + 1;
+        }
+
+      if (i < verbcount) continue;    /* Successfully handled a verb */
+      *errorcodeptr = ERR60;          /* Verb not recognized */
+      goto FAILED;
+      }
+
+    /* Initialization for "real" parentheses */
+
+    newoptions = options;
+    skipunits = 0;
+    bravalue = OP_CBRA;
+    reset_bracount = FALSE;
+
+    /* Deal with the extended parentheses; all are introduced by '?', and the
+    appearance of any of them means that this is not a capturing group. */
+
+    if (*ptr == CHAR_QUESTION_MARK)
+      {
+      int i, count;
+      int namelen;                /* Must be signed */
+      uint32_t index;
+      uint32_t set, unset, *optset;
+      named_group *ng;
+      PCRE2_SPTR name;
+      PCRE2_UCHAR *slot;
+
+      switch (*(++ptr))
+        {
+        /* ------------------------------------------------------------ */
+        case CHAR_VERTICAL_LINE:  /* Reset capture count for each branch */
+        reset_bracount = TRUE;
+        /* Fall through */
+
+        /* ------------------------------------------------------------ */
+        case CHAR_COLON:          /* Non-capturing bracket */
+        bravalue = OP_BRA;
+        ptr++;
+        break;
+
+        /* ------------------------------------------------------------ */
+        case CHAR_LEFT_PARENTHESIS:
+        bravalue = OP_COND;       /* Conditional group */
+        tempptr = ptr;
+
+        /* A condition can be an assertion, a number (referring to a numbered
+        group's having been set), a name (referring to a named group), or 'R',
+        referring to recursion. R<digits> and R&name are also permitted for
+        recursion tests.
+
+        There are ways of testing a named group: (?(name)) is used by Python;
+        Perl 5.10 onwards uses (?(<name>) or (?('name')).
+
+        There is one unfortunate ambiguity, caused by history. 'R' can be the
+        recursive thing or the name 'R' (and similarly for 'R' followed by
+        digits). We look for a name first; if not found, we try the other case.
+
+        For compatibility with auto-callouts, we allow a callout to be
+        specified before a condition that is an assertion. First, check for the
+        syntax of a callout; if found, adjust the temporary pointer that is
+        used to check for an assertion condition. That's all that is needed! */
+
+        if (ptr[1] == CHAR_QUESTION_MARK && ptr[2] == CHAR_C)
+          {
+          if (IS_DIGIT(ptr[3]) || ptr[3] == CHAR_RIGHT_PARENTHESIS)
+            {
+            for (i = 3;; i++) if (!IS_DIGIT(ptr[i])) break;
+            if (ptr[i] == CHAR_RIGHT_PARENTHESIS)
+              tempptr += i + 1;
+            }
+          else
+            {
+            uint32_t delimiter = 0;
+            for (i = 0; PRIV(callout_start_delims)[i] != 0; i++)
+              {
+              if (ptr[3] == PRIV(callout_start_delims)[i])
+                {
+                delimiter = PRIV(callout_end_delims)[i];
+                break;
+                }
+              }
+            if (delimiter != 0)
+              {
+              for (i = 4; ptr + i < cb->end_pattern; i++)
+                {
+                if (ptr[i] == delimiter)
+                  {
+                  if (ptr[i+1] == delimiter) i++;
+                  else
+                    {
+                    if (ptr[i+1] == CHAR_RIGHT_PARENTHESIS) tempptr += i + 2;
+                    break;
+                    }
+                  }
+                }
+              }
+            }
+
+          /* tempptr should now be pointing to the opening parenthesis of the
+          assertion condition. */
+
+          if (*tempptr != CHAR_LEFT_PARENTHESIS)
+            {
+            *errorcodeptr = ERR28;
+            goto FAILED;
+            }
+          }
+
+        /* For conditions that are assertions, check the syntax, and then exit
+        the switch. This will take control down to where bracketed groups
+        are processed. The assertion will be handled as part of the group,
+        but we need to identify this case because the conditional assertion may
+        not be quantifier. */
+
+        if (tempptr[1] == CHAR_QUESTION_MARK &&
+              (tempptr[2] == CHAR_EQUALS_SIGN ||
+               tempptr[2] == CHAR_EXCLAMATION_MARK ||
+                 (tempptr[2] == CHAR_LESS_THAN_SIGN &&
+                   (tempptr[3] == CHAR_EQUALS_SIGN ||
+                    tempptr[3] == CHAR_EXCLAMATION_MARK))))
+          {
+          cb->iscondassert = TRUE;
+          break;
+          }
+
+        /* Other conditions use OP_CREF/OP_DNCREF/OP_RREF/OP_DNRREF, and all
+        need to skip at least 1+IMM2_SIZE bytes at the start of the group. */
+
+        code[1+LINK_SIZE] = OP_CREF;
+        skipunits = 1+IMM2_SIZE;
+        refsign = -1;     /* => not a number */
+        namelen = -1;     /* => not a name; must set to avoid warning */
+        name = NULL;      /* Always set to avoid warning */
+        recno = 0;        /* Always set to avoid warning */
+
+        /* Point at character after (?( */
+
+        ptr++;
+
+        /* Check for (?(VERSION[>]=n.m), which is a facility whereby indirect
+        users of PCRE2 via an application can discover which release of PCRE2
+        is being used. */
+
+        if (PRIV(strncmp_c8)(ptr, STRING_VERSION, 7) == 0 &&
+            ptr[7] != CHAR_RIGHT_PARENTHESIS)
+          {
+          BOOL ge = FALSE;
+          int major = 0;
+          int minor = 0;
+
+          ptr += 7;
+          if (*ptr == CHAR_GREATER_THAN_SIGN)
+            {
+            ge = TRUE;
+            ptr++;
+            }
+
+          /* NOTE: cannot write IS_DIGIT(*(++ptr)) here because IS_DIGIT
+          references its argument twice. */
+
+          if (*ptr != CHAR_EQUALS_SIGN || (ptr++, !IS_DIGIT(*ptr)))
+            {
+            *errorcodeptr = ERR79;
+            goto FAILED;
+            }
+
+          while (IS_DIGIT(*ptr)) major = major * 10 + *ptr++ - '0';
+          if (*ptr == CHAR_DOT)
+            {
+            ptr++;
+            while (IS_DIGIT(*ptr)) minor = minor * 10 + *ptr++ - '0';
+            if (minor < 10) minor *= 10;
+            }
+
+          if (*ptr != CHAR_RIGHT_PARENTHESIS || minor > 99)
+            {
+            *errorcodeptr = ERR79;
+            goto FAILED;
+            }
+
+          if (ge)
+            code[1+LINK_SIZE] = ((PCRE2_MAJOR > major) ||
+              (PCRE2_MAJOR == major && PCRE2_MINOR >= minor))?
+                OP_TRUE : OP_FALSE;
+          else
+            code[1+LINK_SIZE] = (PCRE2_MAJOR == major && PCRE2_MINOR == minor)?
+              OP_TRUE : OP_FALSE;
+
+          ptr++;
+          skipunits = 1;
+          break;  /* End of condition processing */
+          }
+
+        /* Check for a test for recursion in a named group. */
+
+        if (*ptr == CHAR_R && ptr[1] == CHAR_AMPERSAND)
+          {
+          terminator = -1;
+          ptr += 2;
+          code[1+LINK_SIZE] = OP_RREF;    /* Change the type of test */
+          }
+
+        /* Check for a test for a named group's having been set, using the Perl
+        syntax (?(<name>) or (?('name'), and also allow for the original PCRE
+        syntax of (?(name) or for (?(+n), (?(-n), and just (?(n). */
+
+        else if (*ptr == CHAR_LESS_THAN_SIGN)
+          {
+          terminator = CHAR_GREATER_THAN_SIGN;
+          ptr++;
+          }
+        else if (*ptr == CHAR_APOSTROPHE)
+          {
+          terminator = CHAR_APOSTROPHE;
+          ptr++;
+          }
+        else
+          {
+          terminator = CHAR_NULL;
+          if (*ptr == CHAR_MINUS || *ptr == CHAR_PLUS) refsign = *ptr++;
+            else if (IS_DIGIT(*ptr)) refsign = 0;
+          }
+
+        /* Handle a number */
+
+        if (refsign >= 0)
+          {
+          while (IS_DIGIT(*ptr))
+            {
+            if (recno > INT_MAX / 10 - 1)  /* Integer overflow */
+              {
+              while (IS_DIGIT(*ptr)) ptr++;
+              *errorcodeptr = ERR61;
+              goto FAILED;
+              }
+            recno = recno * 10 + (int)(*ptr - CHAR_0);
+            ptr++;
+            }
+          }
+
+        /* Otherwise we expect to read a name; anything else is an error. When
+        the referenced name is one of a number of duplicates, a different
+        opcode is used and it needs more memory. Unfortunately we cannot tell
+        whether this is the case in the first pass, so we have to allow for
+        more memory always. In the second pass, the additional to skipunits
+        happens later. */
+
+        else
+          {
+          if (IS_DIGIT(*ptr))
+            {
+            *errorcodeptr = ERR44;  /* Group name must start with non-digit */
+            goto FAILED;
+            }
+          if (!MAX_255(*ptr) || (cb->ctypes[*ptr] & ctype_word) == 0)
+            {
+            *errorcodeptr = ERR28;   /* Assertion expected */
+            goto FAILED;
+            }
+          name = ptr;
+          /* Increment ptr, set namelen, check length */
+          READ_NAME(ctype_word, ERR48, *errorcodeptr);
+          if (lengthptr != NULL) skipunits += IMM2_SIZE;
+          }
+
+        /* Check the terminator */
+
+        if ((terminator > 0 && *ptr++ != (PCRE2_UCHAR)terminator) ||
+            *ptr++ != CHAR_RIGHT_PARENTHESIS)
+          {
+          ptr--;                  /* Error offset */
+          *errorcodeptr = ERR26;  /* Malformed number or name */
+          goto FAILED;
+          }
+
+        /* Do no further checking in the pre-compile phase. */
+
+        if (lengthptr != NULL) break;
+
+        /* In the real compile we do the work of looking for the actual
+        reference. If refsign is not negative, it means we have a number in
+        recno. */
+
+        if (refsign >= 0)
+          {
+          if (recno <= 0)
+            {
+            *errorcodeptr = ERR35;
+            goto FAILED;
+            }
+          if (refsign != 0) recno = (refsign == CHAR_MINUS)?
+            (cb->bracount + 1) - recno : recno + cb->bracount;
+          if (recno <= 0 || (uint32_t)recno > cb->final_bracount)
+            {
+            *errorcodeptr = ERR15;
+            goto FAILED;
+            }
+          PUT2(code, 2+LINK_SIZE, recno);
+          if ((uint32_t)recno > cb->top_backref) cb->top_backref = recno;
+          break;
+          }
+
+        /* Otherwise look for the name. */
+
+        slot = cb->name_table;
+        for (i = 0; i < cb->names_found; i++)
+          {
+          if (PRIV(strncmp)(name, slot+IMM2_SIZE, namelen) == 0) break;
+          slot += cb->name_entry_size;
+          }
+
+        /* Found the named subpattern. If the name is duplicated, add one to
+        the opcode to change CREF/RREF into DNCREF/DNRREF and insert
+        appropriate data values. Otherwise, just insert the unique subpattern
+        number. */
+
+        if (i < cb->names_found)
+          {
+          int offset = i;            /* Offset of first name found */
+
+          count = 0;
+          for (;;)
+            {
+            recno = GET2(slot, 0);   /* Number for last found */
+            if ((uint32_t)recno > cb->top_backref) cb->top_backref = recno;
+            count++;
+            if (++i >= cb->names_found) break;
+            slot += cb->name_entry_size;
+            if (PRIV(strncmp)(name, slot+IMM2_SIZE, namelen) != 0 ||
+              (slot+IMM2_SIZE)[namelen] != 0) break;
+            }
+
+          if (count > 1)
+            {
+            PUT2(code, 2+LINK_SIZE, offset);
+            PUT2(code, 2+LINK_SIZE+IMM2_SIZE, count);
+            skipunits += IMM2_SIZE;
+            code[1+LINK_SIZE]++;
+            }
+          else  /* Not a duplicated name */
+            {
+            PUT2(code, 2+LINK_SIZE, recno);
+            }
+          }
+
+        /* If terminator == CHAR_NULL it means that the name followed directly
+        after the opening parenthesis [e.g. (?(abc)...] and in this case there
+        are some further alternatives to try. For the cases where terminator !=
+        CHAR_NULL [things like (?(<name>... or (?('name')... or (?(R&name)... ]
+        we have now checked all the possibilities, so give an error. */
+
+        else if (terminator != CHAR_NULL)
+          {
+          *errorcodeptr = ERR15;
+          goto FAILED;
+          }
+
+        /* Check for (?(R) for recursion. Allow digits after R to specify a
+        specific group number. */
+
+        else if (*name == CHAR_R)
+          {
+          recno = 0;
+          for (i = 1; i < namelen; i++)
+            {
+            if (!IS_DIGIT(name[i]))
+              {
+              *errorcodeptr = ERR15;        /* Non-existent subpattern */
+              goto FAILED;
+              }
+            if (recno > INT_MAX / 10 - 1)   /* Integer overflow */
+              {
+              *errorcodeptr = ERR61;
+              goto FAILED;
+              }
+            recno = recno * 10 + name[i] - CHAR_0;
+            }
+          if (recno == 0) recno = RREF_ANY;
+          code[1+LINK_SIZE] = OP_RREF;      /* Change test type */
+          PUT2(code, 2+LINK_SIZE, recno);
+          }
+
+        /* Similarly, check for the (?(DEFINE) "condition", which is always
+        false. During compilation we set OP_DEFINE to distinguish this from
+        other OP_FALSE conditions so that it can be checked for having only one
+        branch, but after that the opcode is changed to OP_FALSE. */
+
+        else if (namelen == 6 && PRIV(strncmp_c8)(name, STRING_DEFINE, 6) == 0)
+          {
+          code[1+LINK_SIZE] = OP_DEFINE;
+          skipunits = 1;
+          }
+
+        /* Reference to an unidentified subpattern. */
+
+        else
+          {
+          *errorcodeptr = ERR15;
+          goto FAILED;
+          }
+        break;
+
+
+        /* ------------------------------------------------------------ */
+        case CHAR_EQUALS_SIGN:                 /* Positive lookahead */
+        bravalue = OP_ASSERT;
+        cb->assert_depth += 1;
+        ptr++;
+        break;
+
+        /* Optimize (?!) to (*FAIL) unless it is quantified - which is a weird
+        thing to do, but Perl allows all assertions to be quantified, and when
+        they contain capturing parentheses there may be a potential use for
+        this feature. Not that that applies to a quantified (?!) but we allow
+        it for uniformity. */
+
+        /* ------------------------------------------------------------ */
+        case CHAR_EXCLAMATION_MARK:            /* Negative lookahead */
+        ptr++;
+        if (*ptr == CHAR_RIGHT_PARENTHESIS && ptr[1] != CHAR_ASTERISK &&
+             ptr[1] != CHAR_PLUS && ptr[1] != CHAR_QUESTION_MARK &&
+            (ptr[1] != CHAR_LEFT_CURLY_BRACKET || !is_counted_repeat(ptr+2)))
+          {
+          *code++ = OP_FAIL;
+          previous = NULL;
+          continue;
+          }
+        bravalue = OP_ASSERT_NOT;
+        cb->assert_depth += 1;
+        break;
+
+
+        /* ------------------------------------------------------------ */
+        case CHAR_LESS_THAN_SIGN:              /* Lookbehind or named define */
+        switch (ptr[1])
+          {
+          case CHAR_EQUALS_SIGN:               /* Positive lookbehind */
+          bravalue = OP_ASSERTBACK;
+          cb->assert_depth += 1;
+          ptr += 2;
+          break;
+
+          case CHAR_EXCLAMATION_MARK:          /* Negative lookbehind */
+          bravalue = OP_ASSERTBACK_NOT;
+          cb->assert_depth += 1;
+          ptr += 2;
+          break;
+
+          /* Must be a name definition - as the syntax was checked in the
+          pre-pass, we can assume here that it is valid. Skip over the name
+          and go to handle the numbered group. */
+
+          default:
+          while (*(++ptr) != CHAR_GREATER_THAN_SIGN);
+          ptr++;
+          goto NUMBERED_GROUP;
+          }
+        break;
+
+
+        /* ------------------------------------------------------------ */
+        case CHAR_GREATER_THAN_SIGN:           /* One-time brackets */
+        bravalue = OP_ONCE;
+        ptr++;
+        break;
+
+
+        /* ------------------------------------------------------------ */
+        case CHAR_C:                 /* Callout */
+        previous_callout = code;     /* Save for later completion */
+        after_manual_callout = 1;    /* Skip one item before completing */
+        ptr++;                       /* Character after (?C */
+
+        /* A callout may have a string argument, delimited by one of a fixed
+        number of characters, or an undelimited numerical argument, or no
+        argument, which is the same as (?C0). Different opcodes are used for
+        the two cases. */
+
+        if (*ptr != CHAR_RIGHT_PARENTHESIS && !IS_DIGIT(*ptr))
+          {
+          uint32_t delimiter = 0;
+
+          for (i = 0; PRIV(callout_start_delims)[i] != 0; i++)
+            {
+            if (*ptr == PRIV(callout_start_delims)[i])
+              {
+              delimiter = PRIV(callout_end_delims)[i];
+              break;
+              }
+            }
+
+          if (delimiter == 0)
+            {
+            *errorcodeptr = ERR82;
+            goto FAILED;
+            }
+
+          /* During the pre-compile phase, we parse the string and update the
+          length. There is no need to generate any code. (In fact, the string
+          has already been parsed in the pre-pass that looks for named
+          parentheses, but it does no harm to leave this code in.) */
+
+          if (lengthptr != NULL)     /* Only check the string */
+            {
+            PCRE2_SPTR start = ptr;
+            do
+              {
+              if (++ptr >= cb->end_pattern)
+                {
+                *errorcodeptr = ERR81;
+                ptr = start;   /* To give a more useful message */
+                goto FAILED;
+                }
+              if (ptr[0] == delimiter && ptr[1] == delimiter) ptr += 2;
+              }
+            while (ptr[0] != delimiter);
+
+            /* Start points to the opening delimiter, ptr points to the
+            closing delimiter. We must allow for including the delimiter and
+            for the terminating zero. Any doubled delimiters within the string
+            make this an overestimate, but it is not worth bothering about. */
+
+            (*lengthptr) += (ptr - start) + 2 + (1 + 4*LINK_SIZE);
+            }
+
+          /* In the real compile we can copy the string, knowing that it is
+          syntactically OK. The starting delimiter is included so that the
+          client can discover it if they want. We also pass the start offset to
+          help a script language give better error messages. */
+
+          else
+            {
+            PCRE2_UCHAR *callout_string = code + (1 + 4*LINK_SIZE);
+            *callout_string++ = *ptr++;
+            PUT(code, 1 + 3*LINK_SIZE, (int)(ptr - cb->start_pattern)); /* Start offset */
+            for(;;)
+              {
+              if (*ptr == delimiter)
+                {
+                if (ptr[1] == delimiter) ptr++; else break;
+                }
+              *callout_string++ = *ptr++;
+              }
+            *callout_string++ = CHAR_NULL;
+            code[0] = OP_CALLOUT_STR;
+            PUT(code, 1, (int)(ptr + 2 - cb->start_pattern)); /* Next offset */
+            PUT(code, 1 + LINK_SIZE, 0);      /* Default length */
+            PUT(code, 1 + 2*LINK_SIZE,        /* Compute size */
+                (int)(callout_string - code));
+            code = callout_string;
+            }
+
+          /* Advance to what should be the closing parenthesis, which is
+          checked below. */
+
+          ptr++;
+          }
+
+        /* Handle a callout with an optional numerical argument, which must be
+        less than or equal to 255. A missing argument gives 0. */
+
+        else
+          {
+          int n = 0;
+          code[0] = OP_CALLOUT;     /* Numerical callout */
+          while (IS_DIGIT(*ptr))
+            {
+            n = n * 10 + *ptr++ - CHAR_0;
+            if (n > 255)
+              {
+              *errorcodeptr = ERR38;
+              goto FAILED;
+              }
+            }
+          PUT(code, 1, (int)(ptr - cb->start_pattern + 1));  /* Next offset */
+          PUT(code, 1 + LINK_SIZE, 0);                    /* Default length */
+          code[1 + 2*LINK_SIZE] = n;                      /* Callout number */
+          code += PRIV(OP_lengths)[OP_CALLOUT];
+          }
+
+        /* Both formats must have a closing parenthesis */
+
+        if (*ptr != CHAR_RIGHT_PARENTHESIS)
+          {
+          *errorcodeptr = ERR39;
+          goto FAILED;
+          }
+
+        /* Callouts cannot be quantified. */
+
+        previous = NULL;
+        continue;
+
+
+        /* ------------------------------------------------------------ */
+        case CHAR_P:              /* Python-style named subpattern handling */
+        if (*(++ptr) == CHAR_EQUALS_SIGN ||
+            *ptr == CHAR_GREATER_THAN_SIGN)  /* Reference or recursion */
+          {
+          is_recurse = *ptr == CHAR_GREATER_THAN_SIGN;
+          terminator = CHAR_RIGHT_PARENTHESIS;
+          goto NAMED_REF_OR_RECURSE;
+          }
+        else if (*ptr != CHAR_LESS_THAN_SIGN)  /* Test for Python-style defn */
+          {
+          *errorcodeptr = ERR41;
+          goto FAILED;
+          }
+        /* Fall through to handle (?P< as (?< is handled */
+
+
+        /* ------------------------------------------------------------ */
+        case CHAR_APOSTROPHE:   /* Define a name - note fall through above */
+
+        /* The syntax was checked and the list of names was set up in the
+        pre-pass, so there is nothing to be done now except to skip over the
+        name. */
+
+        terminator = (*ptr == CHAR_LESS_THAN_SIGN)?
+                  CHAR_GREATER_THAN_SIGN : CHAR_APOSTROPHE;
+        while (*(++ptr) != (unsigned int)terminator);
+        ptr++;
+        goto NUMBERED_GROUP;      /* Set up numbered group */
+
+
+        /* ------------------------------------------------------------ */
+        case CHAR_AMPERSAND:            /* Perl recursion/subroutine syntax */
+        terminator = CHAR_RIGHT_PARENTHESIS;
+        is_recurse = TRUE;
+        /* Fall through */
+
+        /* We come here from the Python syntax above that handles both
+        references (?P=name) and recursion (?P>name), as well as falling
+        through from the Perl recursion syntax (?&name). We also come here from
+        the Perl \k<name> or \k'name' back reference syntax and the \k{name}
+        .NET syntax, and the Oniguruma \g<...> and \g'...' subroutine syntax. */
+
+        NAMED_REF_OR_RECURSE:
+        name = ++ptr;
+        if (IS_DIGIT(*ptr))
+          {
+          *errorcodeptr = ERR44;   /* Group name must start with non-digit */
+          goto FAILED;
+          }
+        /* Increment ptr, set namelen, check length */
+        READ_NAME(ctype_word, ERR48, *errorcodeptr);
+
+        /* In the pre-compile phase, do a syntax check. */
+
+        if (lengthptr != NULL)
+          {
+          if (namelen == 0)
+            {
+            *errorcodeptr = ERR62;
+            goto FAILED;
+            }
+          if (*ptr != (PCRE2_UCHAR)terminator)
+            {
+            *errorcodeptr = ERR42;
+            goto FAILED;
+            }
+          }
+
+        /* Scan the list of names generated in the pre-pass in order to get
+        a number and whether or not this name is duplicated. */
+
+        recno = 0;
+        is_dupname = FALSE;
+        ng = cb->named_groups;
+
+        for (i = 0; i < cb->names_found; i++, ng++)
+          {
+          if (namelen == ng->length &&
+              PRIV(strncmp)(name, ng->name, namelen) == 0)
+            {
+            open_capitem *oc;
+            is_dupname = ng->isdup;
+            recno = ng->number;
+
+            /* For a recursion, that's all that is needed. We can now go to the
+            code that handles numerical recursion. */
+
+            if (is_recurse) goto HANDLE_RECURSION;
+
+            /* For a back reference, update the back reference map and the
+            maximum back reference. Then for each group we must check to see if
+            it is recursive, that is, it is inside the group that it
+            references. A flag is set so that the group can be made atomic. */
+
+            cb->backref_map |= (recno < 32)? (1u << recno) : 1;
+            if ((uint32_t)recno > cb->top_backref) cb->top_backref = recno;
+
+            for (oc = cb->open_caps; oc != NULL; oc = oc->next)
+              {
+              if (oc->number == recno)
+                {
+                oc->flag = TRUE;
+                break;
+                }
+              }
+            }
+          }
+
+        /* If the name was not found we have a bad reference. */
+
+        if (recno == 0)
+          {
+          *errorcodeptr = ERR15;
+          goto FAILED;
+          }
+
+        /* If a back reference name is not duplicated, we can handle it as a
+        numerical reference. */
+
+        if (!is_dupname) goto HANDLE_REFERENCE;
+
+        /* If a back reference name is duplicated, we generate a different
+        opcode to a numerical back reference. In the second pass we must search
+        for the index and count in the final name table. */
+
+        count = 0;
+        index = 0;
+
+        if (lengthptr == NULL)
+          {
+          slot = cb->name_table;
+          for (i = 0; i < cb->names_found; i++)
+            {
+            if (PRIV(strncmp)(name, slot+IMM2_SIZE, namelen) == 0 &&
+                slot[IMM2_SIZE+namelen] == 0)
+              {
+              if (count == 0) index = i;
+              count++;
+              }
+            slot += cb->name_entry_size;
+            }
+
+          if (count == 0)
+            {
+            *errorcodeptr = ERR15;
+            goto FAILED;
+            }
+          }
+
+        if (firstcuflags == REQ_UNSET) firstcuflags = REQ_NONE;
+        previous = code;
+        *code++ = ((options & PCRE2_CASELESS) != 0)? OP_DNREFI : OP_DNREF;
+        PUT2INC(code, 0, index);
+        PUT2INC(code, 0, count);
+        continue;  /* End of back ref handling */
+
+
+        /* ------------------------------------------------------------ */
+        case CHAR_R:              /* Recursion, same as (?0) */
+        recno = 0;
+        if (*(++ptr) != CHAR_RIGHT_PARENTHESIS)
+          {
+          *errorcodeptr = ERR29;
+          goto FAILED;
+          }
+        goto HANDLE_RECURSION;
+
+
+        /* ------------------------------------------------------------ */
+        case CHAR_MINUS: case CHAR_PLUS:  /* Recursion or subroutine */
+        case CHAR_0: case CHAR_1: case CHAR_2: case CHAR_3: case CHAR_4:
+        case CHAR_5: case CHAR_6: case CHAR_7: case CHAR_8: case CHAR_9:
+          {
+          terminator = CHAR_RIGHT_PARENTHESIS;
+
+          /* Come here from the \g<...> and \g'...' code (Oniguruma
+          compatibility). However, the syntax has been checked to ensure that
+          the ... are a (signed) number, so that neither ERR63 nor ERR29 will
+          be called on this path, nor with the jump to OTHER_CHAR_AFTER_QUERY
+          ever be taken. */
+
+          HANDLE_NUMERICAL_RECURSION:
+
+          if ((refsign = *ptr) == CHAR_PLUS)
+            {
+            ptr++;
+            if (!IS_DIGIT(*ptr))
+              {
+              *errorcodeptr = ERR63;
+              goto FAILED;
+              }
+            }
+          else if (refsign == CHAR_MINUS)
+            {
+            if (!IS_DIGIT(ptr[1]))
+              goto OTHER_CHAR_AFTER_QUERY;
+            ptr++;
+            }
+
+          recno = 0;
+          while (IS_DIGIT(*ptr))
+            {
+            if (recno > INT_MAX / 10 - 1) /* Integer overflow */
+              {
+              while (IS_DIGIT(*ptr)) ptr++;
+              *errorcodeptr = ERR61;
+              goto FAILED;
+              }
+            recno = recno * 10 + *ptr++ - CHAR_0;
+            }
+
+          if (*ptr != (PCRE2_UCHAR)terminator)
+            {
+            *errorcodeptr = ERR29;
+            goto FAILED;
+            }
+
+          if (refsign == CHAR_MINUS)
+            {
+            if (recno == 0)
+              {
+              *errorcodeptr = ERR58;
+              goto FAILED;
+              }
+            recno = (int)(cb->bracount + 1) - recno;
+            if (recno <= 0)
+              {
+              *errorcodeptr = ERR15;
+              goto FAILED;
+              }
+            }
+          else if (refsign == CHAR_PLUS)
+            {
+            if (recno == 0)
+              {
+              *errorcodeptr = ERR58;
+              goto FAILED;
+              }
+            recno += cb->bracount;
+            }
+
+          if ((uint32_t)recno > cb->final_bracount)
+            {
+            *errorcodeptr = ERR15;
+            goto FAILED;
+            }
+
+          /* Come here from code above that handles a named recursion.
+          We insert the number of the called group after OP_RECURSE. At the
+          end of compiling the pattern is scanned and these numbers are
+          replaced by offsets within the pattern. It is done like this to avoid
+          problems with forward references and adjusting offsets when groups
+          are duplicated and moved (as discovered in previous implementations).
+          Note that a recursion does not have a set first character (relevant
+          if it is repeated, because it will then be wrapped with ONCE
+          brackets). */
+
+          HANDLE_RECURSION:
+          previous = code;
+          *code = OP_RECURSE;
+          PUT(code, 1, recno);
+          code += 1 + LINK_SIZE;
+          groupsetfirstcu = FALSE;
+          cb->had_recurse = TRUE;
+          }
+
+        /* Can't determine a first byte now */
+
+        if (firstcuflags == REQ_UNSET) firstcuflags = REQ_NONE;
+        continue;
+
+
+        /* ------------------------------------------------------------ */
+        default:              /* Other characters: check option setting */
+        OTHER_CHAR_AFTER_QUERY:
+        set = unset = 0;
+        optset = &set;
+
+        while (*ptr != CHAR_RIGHT_PARENTHESIS && *ptr != CHAR_COLON)
+          {
+          switch (*ptr++)
+            {
+            case CHAR_MINUS: optset = &unset; break;
+
+            case CHAR_J:    /* Record that it changed in the external options */
+            *optset |= PCRE2_DUPNAMES;
+            cb->external_flags |= PCRE2_JCHANGED;
+            break;
+
+            case CHAR_i: *optset |= PCRE2_CASELESS; break;
+            case CHAR_m: *optset |= PCRE2_MULTILINE; break;
+            case CHAR_s: *optset |= PCRE2_DOTALL; break;
+            case CHAR_x: *optset |= PCRE2_EXTENDED; break;
+            case CHAR_U: *optset |= PCRE2_UNGREEDY; break;
+
+            default:  *errorcodeptr = ERR11;
+                      ptr--;    /* Correct the offset */
+                      goto FAILED;
+            }
+          }
+
+        /* 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. They
+        must also be passed back for use in subsequent branches. Reset the
+        greedy defaults and the case value for firstcu and reqcu. */
+
+        if (*ptr == CHAR_RIGHT_PARENTHESIS)
+          {
+          *optionsptr = options = newoptions;
+          greedy_default = ((newoptions & PCRE2_UNGREEDY) != 0);
+          greedy_non_default = greedy_default ^ 1;
+          req_caseopt = ((newoptions & PCRE2_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++;
+        }     /* End of switch for character following (? */
+      }       /* End of (? handling */
+
+    /* Opening parenthesis not followed by '*' or '?'. If PCRE2_NO_AUTO_CAPTURE
+    is set, all unadorned brackets become non-capturing and behave like (?:...)
+    brackets. */
+
+    else if ((options & PCRE2_NO_AUTO_CAPTURE) != 0)
+      {
+      bravalue = OP_BRA;
+      }
+
+    /* Else we have a capturing group. */
+
+    else
+      {
+      NUMBERED_GROUP:
+      cb->bracount += 1;
+      PUT2(code, 1+LINK_SIZE, cb->bracount);
+      skipunits = IMM2_SIZE;
+      }
+
+    /* Process nested bracketed regex. First check for parentheses nested too
+    deeply. */
+
+    if ((cb->parens_depth += 1) > (int)(cb->cx->parens_nest_limit))
+      {
+      *errorcodeptr = ERR19;
+      goto FAILED;
+      }
+
+    /* All assertions used not to be repeatable, but this was changed for Perl
+    compatibility. All kinds can now be repeated except for assertions that are
+    conditions (Perl also forbids these to be repeated). We copy code into a
+    non-register variable (tempcode) in order to be able to pass its address
+    because some compilers complain otherwise. At the start of a conditional
+    group whose condition is an assertion, cb->iscondassert is set. We unset it
+    here so as to allow assertions later in the group to be quantified. */
+
+    if (bravalue >= OP_ASSERT && bravalue <= OP_ASSERTBACK_NOT &&
+        cb->iscondassert)
+      {
+      previous = NULL;
+      cb->iscondassert = FALSE;
+      }
+    else
+      {
+      previous = code;
+      }
+
+    *code = bravalue;
+    tempcode = code;
+    tempreqvary = cb->req_varyopt;        /* Save value before bracket */
+    tempbracount = cb->bracount;          /* Save value before bracket */
+    length_prevgroup = 0;                 /* Initialize for pre-compile phase */
+
+    if (!compile_regex(
+         newoptions,                      /* The complete new option state */
+         &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 */
+         reset_bracount,                  /* True if (?| group */
+         skipunits,                       /* Skip over bracket number */
+         cond_depth +
+           ((bravalue == OP_COND)?1:0),   /* Depth of condition subpatterns */
+         &subfirstcu,                     /* For possible first char */
+         &subfirstcuflags,
+         &subreqcu,                       /* For possible last char */
+         &subreqcuflags,
+         bcptr,                           /* Current branch chain */
+         cb,                              /* Compile data block */
+         (lengthptr == NULL)? NULL :      /* Actual compile phase */
+           &length_prevgroup              /* Pre-compile phase */
+         ))
+      goto FAILED;
+
+    cb->parens_depth -= 1;
+
+    /* If this was an atomic group and there are no capturing groups within it,
+    generate OP_ONCE_NC instead of OP_ONCE. */
+
+    if (bravalue == OP_ONCE && cb->bracount <= tempbracount)
+      *code = OP_ONCE_NC;
+
+    if (bravalue >= OP_ASSERT && bravalue <= OP_ASSERTBACK_NOT)
+      cb->assert_depth -= 1;
+
+    /* 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.
+    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, or just one if it's a DEFINE group. We do this
+    in the real compile phase, not in the pre-pass, where the whole group may
+    not be available. */
+
+    if (bravalue == OP_COND && lengthptr == NULL)
+      {
+      PCRE2_UCHAR *tc = code;
+      int condcount = 0;
+
+      do {
+         condcount++;
+         tc += GET(tc,1);
+         }
+      while (*tc != OP_KET);
+
+      /* A DEFINE group is never obeyed inline (the "condition" is always
+      false). It must have only one branch. Having checked this, change the
+      opcode to OP_FALSE. */
+
+      if (code[LINK_SIZE+1] == OP_DEFINE)
+        {
+        if (condcount > 1)
+          {
+          *errorcodeptr = ERR54;
+          goto FAILED;
+          }
+        code[LINK_SIZE+1] = OP_FALSE;
+        bravalue = OP_DEFINE;   /* Just a flag to suppress char handling below */
+        }
+
+      /* A "normal" conditional group. If there is just one branch, we must not
+      make use of its firstcu or reqcu, because this is equivalent to an
+      empty second branch. */
+
+      else
+        {
+        if (condcount > 2)
+          {
+          *errorcodeptr = ERR27;
+          goto FAILED;
+          }
+        if (condcount == 1) subfirstcuflags = subreqcuflags = REQ_NONE;
+        }
+      }
+
+    /* Error if hit end of pattern */
+
+    if (*ptr != CHAR_RIGHT_PARENTHESIS)
+      {
+      *errorcodeptr = ERR14;
+      goto FAILED;
+      }
+
+    /* In the pre-compile phase, update the length by the length of the group,
+    less the brackets at either end. Then reduce the compiled code to just a
+    set of non-capturing brackets so that it doesn't use much memory if it is
+    duplicated by a quantifier.*/
+
+    if (lengthptr != NULL)
+      {
+      if (OFLOW_MAX - *lengthptr < length_prevgroup - 2 - 2*LINK_SIZE)
+        {
+        *errorcodeptr = ERR20;
+        goto FAILED;
+        }
+      *lengthptr += length_prevgroup - 2 - 2*LINK_SIZE;
+      code++;   /* This already contains bravalue */
+      PUTINC(code, 0, 1 + LINK_SIZE);
+      *code++ = OP_KET;
+      PUTINC(code, 0, 1 + LINK_SIZE);
+      break;    /* No need to waste time with special character handling */
+      }
+
+    /* Otherwise update the main code pointer to the end of the group. */
+
+    code = tempcode;
+
+    /* For a DEFINE group, required and first character settings are not
+    relevant. */
+
+    if (bravalue == OP_DEFINE) break;
+
+    /* Handle updating of the required and first characters for other types of
+    group. 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 zeroreqcu and
+    zerofirstcu outside the main loop so that they can be accessed for the
+    back off. */
+
+    zeroreqcu = reqcu;
+    zeroreqcuflags = reqcuflags;
+    zerofirstcu = firstcu;
+    zerofirstcuflags = firstcuflags;
+    groupsetfirstcu = FALSE;
+
+    if (bravalue >= OP_ONCE)
+      {
+      /* If we have not yet set a firstcu 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 reqcu if necessary. If the subpattern has
+      no firstcu, set "none" for the whole branch. In both cases, a zero
+      repeat forces firstcu to "none". */
+
+      if (firstcuflags == REQ_UNSET && subfirstcuflags != REQ_UNSET)
+        {
+        if (subfirstcuflags >= 0)
+          {
+          firstcu = subfirstcu;
+          firstcuflags = subfirstcuflags;
+          groupsetfirstcu = TRUE;
+          }
+        else firstcuflags = REQ_NONE;
+        zerofirstcuflags = REQ_NONE;
+        }
+
+      /* If firstcu was previously set, convert the subpattern's firstcu
+      into reqcu if there wasn't one, using the vary flag that was in
+      existence beforehand. */
+
+      else if (subfirstcuflags >= 0 && subreqcuflags < 0)
+        {
+        subreqcu = subfirstcu;
+        subreqcuflags = subfirstcuflags | 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 (subreqcuflags >= 0)
+        {
+        reqcu = subreqcu;
+        reqcuflags = subreqcuflags;
+        }
+      }
+
+    /* For a forward assertion, we take the reqcu, 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 firstcu
+    for an assertion, however because it leads to incorrect effect for patterns
+    such as /(?=a)a.+/ when the "real" "a" would then become a reqcu instead
+    of a firstcu. This is overcome by a scan at the end if there's no
+    firstcu, looking for an asserted first char. */
+
+    else if (bravalue == OP_ASSERT && subreqcuflags >= 0)
+      {
+      reqcu = subreqcu;
+      reqcuflags = subreqcuflags;
+      }
+    break;     /* End of processing '(' */
+
+
+    /* ===================================================================*/
+    /* Handle metasequences introduced by \. For ones like \d, the ESC_ values
+    are arranged to be the negation of the corresponding OP_values in the
+    default case when PCRE2_UCP is not set. For the back references, the values
+    are negative 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.
+
+    Note: \Q and \E are handled at the start of the character-processing loop,
+    not here. */
+
+    case CHAR_BACKSLASH:
+    tempptr = ptr;
+    escape = PRIV(check_escape)(&ptr, cb->end_pattern, &ec, errorcodeptr,
+      options, FALSE, cb);
+    if (*errorcodeptr != 0) goto FAILED;
+
+    if (escape == 0)                  /* The escape coded a single character */
+      c = ec;
+    else
+      {
+      /* For metasequences that actually match a character, we disable the
+      setting of a first character if it hasn't already been set. */
+
+      if (firstcuflags == REQ_UNSET && escape > ESC_b && escape < ESC_Z)
+        firstcuflags = REQ_NONE;
+
+      /* Set values to reset to if this is followed by a zero repeat. */
+
+      zerofirstcu = firstcu;
+      zerofirstcuflags = firstcuflags;
+      zeroreqcu = reqcu;
+      zeroreqcuflags = reqcuflags;
+
+      /* \g<name> or \g'name' is a subroutine call by name and \g<n> or \g'n'
+      is a subroutine call by number (Oniguruma syntax). In fact, the value
+      ESC_g is returned only for these cases. So we don't need to check for <
+      or ' if the value is ESC_g. For the Perl syntax \g{n} the value is
+      -n, and for the Perl syntax \g{name} the result is ESC_k (as
+      that is a synonym for a named back reference). */
+
+      if (escape == ESC_g)
+        {
+        PCRE2_SPTR p;
+        uint32_t cf;
+
+        terminator = (*(++ptr) == CHAR_LESS_THAN_SIGN)?
+          CHAR_GREATER_THAN_SIGN : CHAR_APOSTROPHE;
+
+        /* These two statements stop the compiler for warning about possibly
+        unset variables caused by the jump to HANDLE_NUMERICAL_RECURSION. In
+        fact, because we do the check for a number below, the paths that
+        would actually be in error are never taken. */
+
+        skipunits = 0;
+        reset_bracount = FALSE;
+
+        /* If it's not a signed or unsigned number, treat it as a name. */
+
+        cf = ptr[1];
+        if (cf != CHAR_PLUS && cf != CHAR_MINUS && !IS_DIGIT(cf))
+          {
+          is_recurse = TRUE;
+          goto NAMED_REF_OR_RECURSE;
+          }
+
+        /* Signed or unsigned number (cf = ptr[1]) is known to be plus or minus
+        or a digit. */
+
+        p = ptr + 2;
+        while (IS_DIGIT(*p)) p++;
+        if (*p != (PCRE2_UCHAR)terminator)
+          {
+          *errorcodeptr = ERR57;
+          goto FAILED;
+          }
+        ptr++;
+        goto HANDLE_NUMERICAL_RECURSION;
+        }
+
+      /* \k<name> or \k'name' is a back reference by name (Perl syntax).
+      We also support \k{name} (.NET syntax).  */
+
+      if (escape == ESC_k)
+        {
+        if ((ptr[1] != CHAR_LESS_THAN_SIGN &&
+          ptr[1] != CHAR_APOSTROPHE && ptr[1] != CHAR_LEFT_CURLY_BRACKET))
+          {
+          *errorcodeptr = ERR69;
+          goto FAILED;
+          }
+        is_recurse = FALSE;
+        terminator = (*(++ptr) == CHAR_LESS_THAN_SIGN)?
+          CHAR_GREATER_THAN_SIGN : (*ptr == CHAR_APOSTROPHE)?
+          CHAR_APOSTROPHE : CHAR_RIGHT_CURLY_BRACKET;
+        goto NAMED_REF_OR_RECURSE;
+        }
+
+      /* Back references are handled specially; must disable firstcu if
+      not set to cope with cases like (?=(\w+))\1: which would otherwise set
+      ':' later. */
+
+      if (escape < 0)
+        {
+        open_capitem *oc;
+        recno = -escape;
+
+        /* Come here from named backref handling when the reference is to a
+        single group (i.e. not to a duplicated name). */
+
+        HANDLE_REFERENCE:
+        if (recno > (int)cb->final_bracount)
+          {
+          *errorcodeptr = ERR15;
+          goto FAILED;
+          }
+        if (firstcuflags == REQ_UNSET) firstcuflags = REQ_NONE;
+        previous = code;
+        *code++ = ((options & PCRE2_CASELESS) != 0)? OP_REFI : OP_REF;
+        PUT2INC(code, 0, recno);
+        cb->backref_map |= (recno < 32)? (1u << recno) : 1;
+        if ((uint32_t)recno > cb->top_backref) cb->top_backref = recno;
+
+        /* Check to see if this back reference is recursive, that it, it
+        is inside the group that it references. A flag is set so that the
+        group can be made atomic. */
+
+        for (oc = cb->open_caps; oc != NULL; oc = oc->next)
+          {
+          if (oc->number == recno)
+            {
+            oc->flag = TRUE;
+            break;
+            }
+          }
+        }
+
+      /* So are Unicode property matches, if supported. */
+
+#ifdef SUPPORT_UNICODE
+      else if (escape == ESC_P || escape == ESC_p)
+        {
+        BOOL negated;
+        unsigned int ptype = 0, pdata = 0;
+        if (!get_ucp(&ptr, &negated, &ptype, &pdata, errorcodeptr, cb))
+          goto FAILED;
+        previous = code;
+        *code++ = ((escape == ESC_p) != negated)? OP_PROP : OP_NOTPROP;
+        *code++ = ptype;
+        *code++ = pdata;
+        }
+#else
+
+      /* If Unicode properties are not supported, \X, \P, and \p are not
+      allowed. */
+
+      else if (escape == ESC_X || escape == ESC_P || escape == ESC_p)
+        {
+        *errorcodeptr = ERR45;
+        goto FAILED;
+        }
+#endif
+
+      /* The use of \C can be locked out. */
+
+#ifdef NEVER_BACKSLASH_C
+      else if (escape == ESC_C)
+        {
+        *errorcodeptr = ERR85;
+        goto FAILED;
+        }
+#else
+      else if (escape == ESC_C && (options & PCRE2_NEVER_BACKSLASH_C) != 0)
+        {
+        *errorcodeptr = ERR83;
+        goto FAILED;
+        }
+#endif
+
+      /* For the rest (including \X when Unicode properties are supported), we
+      can obtain the OP value by negating the escape value in the default
+      situation when PCRE2_UCP is not set. When it *is* set, we substitute
+      Unicode property tests. Note that \b and \B do a one-character
+      lookbehind, and \A also behaves as if it does. */
+
+      else
+        {
+        if (escape == ESC_C) cb->external_flags |= PCRE2_HASBKC; /* Record */
+        if ((escape == ESC_b || escape == ESC_B || escape == ESC_A) &&
+             cb->max_lookbehind == 0)
+          cb->max_lookbehind = 1;
+#ifdef SUPPORT_UNICODE
+        if (escape >= ESC_DU && escape <= ESC_wu)
+          {
+          cb->nestptr[1] = cb->nestptr[0];         /* Back up if at 2nd level */
+          cb->nestptr[0] = ptr + 1;                /* Where to resume */
+          ptr = substitutes[escape - ESC_DU] - 1;  /* Just before substitute */
+          }
+        else
+#endif
+        /* In non-UTF mode, we turn \C into OP_ALLANY instead of OP_ANYBYTE
+        so that it works in DFA mode and in lookbehinds. */
+
+          {
+          previous = (escape > ESC_b && escape < ESC_Z)? code : NULL;
+          *code++ = (!utf && escape == ESC_C)? OP_ALLANY : escape;
+          }
+        }
+      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. */
+
+    mclength = PUTCHAR(c, mcbuffer);
+    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 a UTF mode, it may be a
+    multi-unit literal character. */
+
+    default:
+    NORMAL_CHAR:
+    mclength = 1;
+    mcbuffer[0] = c;
+
+#ifdef SUPPORT_UNICODE
+    if (utf && HAS_EXTRALEN(c))
+      ACROSSCHAR(TRUE, ptr[1], mcbuffer[mclength++] = *(++ptr));
+#endif
+
+    /* At this point we have the character's bytes in mcbuffer, and the length
+    in mclength. When not in UTF mode, the length is always 1. */
+
+    ONE_CHAR:
+    previous = code;
+
+    /* For caseless UTF mode, check whether this character has more than one
+    other case. If so, generate a special OP_PROP item instead of OP_CHARI. */
+
+#ifdef SUPPORT_UNICODE
+    if (utf && (options & PCRE2_CASELESS) != 0)
+      {
+      GETCHAR(c, mcbuffer);
+      if ((c = UCD_CASESET(c)) != 0)
+        {
+        *code++ = OP_PROP;
+        *code++ = PT_CLIST;
+        *code++ = c;
+        if (firstcuflags == REQ_UNSET)
+          firstcuflags = zerofirstcuflags = REQ_NONE;
+        break;
+        }
+      }
+#endif
+
+    /* Caseful matches, or not one of the multicase characters. */
+
+    *code++ = ((options & PCRE2_CASELESS) != 0)? OP_CHARI : OP_CHAR;
+    for (c = 0; c < mclength; c++) *code++ = mcbuffer[c];
+
+    /* Remember if \r or \n were seen */
+
+    if (mcbuffer[0] == CHAR_CR || mcbuffer[0] == CHAR_NL)
+      cb->external_flags |= PCRE2_HASCRORLF;
+
+    /* 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 firstcu value alone, and don't change it on a zero
+    repeat. */
+
+    if (firstcuflags == REQ_UNSET)
+      {
+      zerofirstcuflags = REQ_NONE;
+      zeroreqcu = reqcu;
+      zeroreqcuflags = reqcuflags;
+
+      /* If the character is more than one byte long, we can set firstcu
+      only if it is not to be matched caselessly. */
+
+      if (mclength == 1 || req_caseopt == 0)
+        {
+        firstcu = mcbuffer[0] | req_caseopt;
+        firstcu = mcbuffer[0];
+        firstcuflags = req_caseopt;
+
+        if (mclength != 1)
+          {
+          reqcu = code[-1];
+          reqcuflags = cb->req_varyopt;
+          }
+        }
+      else firstcuflags = reqcuflags = REQ_NONE;
+      }
+
+    /* firstcu was previously set; we can set reqcu only if the length is
+    1 or the matching is caseful. */
+
+    else
+      {
+      zerofirstcu = firstcu;
+      zerofirstcuflags = firstcuflags;
+      zeroreqcu = reqcu;
+      zeroreqcuflags = reqcuflags;
+      if (mclength == 1 || req_caseopt == 0)
+        {
+        reqcu = code[-1];
+        reqcuflags = req_caseopt | cb->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 regex: a 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.
+This function is used during the pre-compile phase when we are trying to find
+out the amount of memory needed, as well as during the real compile phase. The
+value of lengthptr distinguishes the two phases.
+
+Arguments:
+  options           option bits, including any changes for this subpattern
+  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
+  reset_bracount    TRUE to reset the count for each branch
+  skipunits         skip this many code units at start (for brackets and OP_COND)
+  cond_depth        depth of nesting for conditional subpatterns
+  firstcuptr        place to put the first required code unit
+  firstcuflagsptr   place to put the first code unit flags, or a negative number
+  reqcuptr          place to put the last required code unit
+  reqcuflagsptr     place to put the last required code unit flags, or a negative number
+  bcptr             pointer to the chain of currently open branches
+  cb                points to the data block with tables pointers etc.
+  lengthptr         NULL during the real compile phase
+                    points to length accumulator during pre-compile phase
+
+Returns:            TRUE on success
+*/
+
+static BOOL
+compile_regex(uint32_t options, PCRE2_UCHAR **codeptr, PCRE2_SPTR *ptrptr,
+  int *errorcodeptr, BOOL lookbehind, BOOL reset_bracount, uint32_t skipunits,
+  int cond_depth, uint32_t *firstcuptr, int32_t *firstcuflagsptr,
+  uint32_t *reqcuptr, int32_t *reqcuflagsptr, branch_chain *bcptr,
+  compile_block *cb, size_t *lengthptr)
+{
+PCRE2_SPTR ptr = *ptrptr;
+PCRE2_UCHAR *code = *codeptr;
+PCRE2_UCHAR *last_branch = code;
+PCRE2_UCHAR *start_bracket = code;
+PCRE2_UCHAR *reverse_count = NULL;
+open_capitem capitem;
+int capnumber = 0;
+uint32_t firstcu, reqcu;
+int32_t firstcuflags, reqcuflags;
+uint32_t branchfirstcu, branchreqcu;
+int32_t branchfirstcuflags, branchreqcuflags;
+size_t length;
+unsigned int orig_bracount;
+unsigned int max_bracount;
+branch_chain bc;
+
+/* If set, call the external function that checks for stack availability. */
+
+if (cb->cx->stack_guard != NULL &&
+    cb->cx->stack_guard(cb->parens_depth, cb->cx->stack_guard_data))
+  {
+  *errorcodeptr= ERR33;
+  return FALSE;
+  }
+
+/* Miscellaneous initialization */
+
+bc.outer = bcptr;
+bc.current_branch = code;
+
+firstcu = reqcu = 0;
+firstcuflags = reqcuflags = REQ_UNSET;
+
+/* Accumulate the length for use in the pre-compile phase. Start with the
+length of the BRA and KET and any extra code units that are required at the
+beginning. We accumulate in a local variable to save frequent testing of
+lengthptr for NULL. We cannot do this by looking at the value of 'code' at the
+start and end of each alternative, because compiled items are discarded during
+the pre-compile phase so that the work space is not exceeded. */
+
+length = 2 + 2*LINK_SIZE + skipunits;
+
+/* WARNING: If the above line is changed for any reason, you must also change
+the code that abstracts option settings at the start of the pattern and makes
+them global. It tests the value of length for (2 + 2*LINK_SIZE) in the
+pre-compile phase to find out whether or not anything has yet been compiled.
+
+If this is a capturing subpattern, add to the chain of open capturing items
+so that we can detect them if (*ACCEPT) is encountered. This is also used to
+detect groups that contain recursive back references to themselves. Note that
+only OP_CBRA need be tested here; changing this opcode to one of its variants,
+e.g. OP_SCBRAPOS, happens later, after the group has been compiled. */
+
+if (*code == OP_CBRA)
+  {
+  capnumber = GET2(code, 1 + LINK_SIZE);
+  capitem.number = capnumber;
+  capitem.next = cb->open_caps;
+  capitem.flag = FALSE;
+  cb->open_caps = &capitem;
+  }
+
+/* Offset is set zero to mark that this bracket is still open */
+
+PUT(code, 1, 0);
+code += 1 + LINK_SIZE + skipunits;
+
+/* Loop for each alternative branch */
+
+orig_bracount = max_bracount = cb->bracount;
+
+for (;;)
+  {
+  /* For a (?| group, reset the capturing bracket count so that each branch
+  uses the same numbers. */
+
+  if (reset_bracount) cb->bracount = orig_bracount;
+
+  /* Set up dummy OP_REVERSE if lookbehind assertion */
+
+  if (lookbehind)
+    {
+    *code++ = OP_REVERSE;
+    reverse_count = code;
+    PUTINC(code, 0, 0);
+    length += 1 + LINK_SIZE;
+    }
+
+  /* Now compile the branch; in the pre-compile phase its length gets added
+  into the length. */
+
+  if (!compile_branch(&options, &code, &ptr, errorcodeptr, &branchfirstcu,
+        &branchfirstcuflags, &branchreqcu, &branchreqcuflags, &bc,
+        cond_depth, cb, (lengthptr == NULL)? NULL : &length))
+    {
+    *ptrptr = ptr;
+    return FALSE;
+    }
+
+  /* Keep the highest bracket count in case (?| was used and some branch
+  has fewer than the rest. */
+
+  if (cb->bracount > max_bracount) max_bracount = cb->bracount;
+
+  /* In the real compile phase, there is some post-processing to be done. */
+
+  if (lengthptr == NULL)
+    {
+    /* If this is the first branch, the firstcu and reqcu values for the
+    branch become the values for the regex. */
+
+    if (*last_branch != OP_ALT)
+      {
+      firstcu = branchfirstcu;
+      firstcuflags = branchfirstcuflags;
+      reqcu = branchreqcu;
+      reqcuflags = branchreqcuflags;
+      }
+
+    /* If this is not the first branch, the first char and reqcu have to
+    match the values from all the previous branches, except that if the
+    previous value for reqcu didn't have REQ_VARY set, it can still match,
+    and we set REQ_VARY for the regex. */
+
+    else
+      {
+      /* If we previously had a firstcu, but it doesn't match the new branch,
+      we have to abandon the firstcu for the regex, but if there was
+      previously no reqcu, it takes on the value of the old firstcu. */
+
+      if (firstcuflags != branchfirstcuflags || firstcu != branchfirstcu)
+        {
+        if (firstcuflags >= 0)
+          {
+          if (reqcuflags < 0)
+            {
+            reqcu = firstcu;
+            reqcuflags = firstcuflags;
+            }
+          }
+        firstcuflags = REQ_NONE;
+        }
+
+      /* If we (now or from before) have no firstcu, a firstcu from the
+      branch becomes a reqcu if there isn't a branch reqcu. */
+
+      if (firstcuflags < 0 && branchfirstcuflags >= 0 &&
+          branchreqcuflags < 0)
+        {
+        branchreqcu = branchfirstcu;
+        branchreqcuflags = branchfirstcuflags;
+        }
+
+      /* Now ensure that the reqcus match */
+
+      if (((reqcuflags & ~REQ_VARY) != (branchreqcuflags & ~REQ_VARY)) ||
+          reqcu != branchreqcu)
+        reqcuflags = REQ_NONE;
+      else
+        {
+        reqcu = branchreqcu;
+        reqcuflags |= branchreqcuflags; /* 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 the branch contains OP_RECURSE, the result is
+    FFL_LATER (a negative value) because there may be forward references that
+    we can't check here. Set a flag to cause another lookbehind check at the
+    end. Why not do it all at the end? Because common errors can be picked up
+    here and the offset of the problem can be shown. */
+
+    if (lookbehind)
+      {
+      int fixed_length;
+      int count = 0;
+      *code = OP_END;
+      fixed_length = find_fixedlength(last_branch,  (options & PCRE2_UTF) != 0,
+        FALSE, cb, NULL, &count);
+      if (fixed_length == FFL_LATER)
+        {
+        cb->check_lookbehind = TRUE;
+        }
+      else if (fixed_length < 0)
+        {
+        *errorcodeptr = fixed_length_errors[-fixed_length];
+        *ptrptr = ptr;
+        return FALSE;
+        }
+      else
+        {
+        if (fixed_length > cb->max_lookbehind)
+          cb->max_lookbehind = fixed_length;
+        PUT(reverse_count, 0, fixed_length);
+        }
+      }
+    }
+
+  /* Reached end of expression, either ')' or end of pattern. In the real
+  compile phase, 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. Return leaving the pointer at the terminating char. */
+
+  if (*ptr != CHAR_VERTICAL_LINE)
+    {
+    if (lengthptr == NULL)
+      {
+      size_t branch_length = code - last_branch;
+      do
+        {
+        size_t prev_length = GET(last_branch, 1);
+        PUT(last_branch, 1, branch_length);
+        branch_length = prev_length;
+        last_branch -= branch_length;
+        }
+      while (branch_length > 0);
+      }
+
+    /* Fill in the ket */
+
+    *code = OP_KET;
+    PUT(code, 1, (int)(code - start_bracket));
+    code += 1 + LINK_SIZE;
+
+    /* If it was a capturing subpattern, check to see if it contained any
+    recursive back references. If so, we must wrap it in atomic brackets. In
+    any event, remove the block from the chain. */
+
+    if (capnumber > 0)
+      {
+      if (cb->open_caps->flag)
+        {
+        memmove(start_bracket + 1 + LINK_SIZE, start_bracket,
+          CU2BYTES(code - start_bracket));
+        *start_bracket = OP_ONCE;
+        code += 1 + LINK_SIZE;
+        PUT(start_bracket, 1, (int)(code - start_bracket));
+        *code = OP_KET;
+        PUT(code, 1, (int)(code - start_bracket));
+        code += 1 + LINK_SIZE;
+        length += 2 + 2*LINK_SIZE;
+        }
+      cb->open_caps = cb->open_caps->next;
+      }
+
+    /* Retain the highest bracket number, in case resetting was used. */
+
+    cb->bracount = max_bracount;
+
+    /* Set values to pass back */
+
+    *codeptr = code;
+    *ptrptr = ptr;
+    *firstcuptr = firstcu;
+    *firstcuflagsptr = firstcuflags;
+    *reqcuptr = reqcu;
+    *reqcuflagsptr = reqcuflags;
+    if (lengthptr != NULL)
+      {
+      if (OFLOW_MAX - *lengthptr < length)
+        {
+        *errorcodeptr = ERR20;
+        return FALSE;
+        }
+      *lengthptr += length;
+      }
+    return TRUE;
+    }
+
+  /* Another branch follows. In the pre-compile phase, we can move the code
+  pointer back to where it was for the start of the first branch. (That is,
+  pretend that each branch is the only one.)
+
+  In the real compile phase, insert an ALT 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. */
+
+  if (lengthptr != NULL)
+    {
+    code = *codeptr + 1 + LINK_SIZE + skipunits;
+    length += 1 + LINK_SIZE;
+    }
+  else
+    {
+    *code = OP_ALT;
+    PUT(code, 1, (int)(code - last_branch));
+    bc.current_branch = last_branch = code;
+    code += 1 + LINK_SIZE;
+    }
+
+  /* Advance past the vertical bar */
+
+  ptr++;
+  }
+/* Control never reaches here */
+}
+
+
+
+/*************************************************
+*          Check for anchored pattern            *
+*************************************************/
+
+/* 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 will
+be found, because ^ generates OP_CIRCM in that mode.
+
+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.
+
+... A second exception is when the .* appears inside an atomic group, because
+this prevents the number of characters it matches from being adjusted.
+
+Arguments:
+  code           points to start of the compiled pattern
+  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
+  cb             points to the compile data block
+  atomcount      atomic group level
+
+Returns:     TRUE or FALSE
+*/
+
+static BOOL
+is_anchored(register PCRE2_SPTR code, unsigned int bracket_map,
+  compile_block *cb, int atomcount)
+{
+do {
+   PCRE2_SPTR scode = first_significant_code(
+     code + PRIV(OP_lengths)[*code], FALSE);
+   register int op = *scode;
+
+   /* Non-capturing brackets */
+
+   if (op == OP_BRA  || op == OP_BRAPOS ||
+       op == OP_SBRA || op == OP_SBRAPOS)
+     {
+     if (!is_anchored(scode, bracket_map, cb, atomcount)) return FALSE;
+     }
+
+   /* Capturing brackets */
+
+   else if (op == OP_CBRA  || op == OP_CBRAPOS ||
+            op == OP_SCBRA || op == OP_SCBRAPOS)
+     {
+     int n = GET2(scode, 1+LINK_SIZE);
+     int new_map = bracket_map | ((n < 32)? (1u << n) : 1);
+     if (!is_anchored(scode, new_map, cb, atomcount)) return FALSE;
+     }
+
+   /* Positive forward assertions and conditions */
+
+   else if (op == OP_ASSERT || op == OP_COND)
+     {
+     if (!is_anchored(scode, bracket_map, cb, atomcount)) return FALSE;
+     }
+
+   /* Atomic groups */
+
+   else if (op == OP_ONCE || op == OP_ONCE_NC)
+     {
+     if (!is_anchored(scode, bracket_map, cb, atomcount + 1))
+       return FALSE;
+     }
+
+   /* .* is not anchored unless DOTALL is set (which generates OP_ALLANY) and
+   it isn't in brackets that are or may be referenced or inside an atomic
+   group. There is also an option that disables auto-anchoring. */
+
+   else if ((op == OP_TYPESTAR || op == OP_TYPEMINSTAR ||
+             op == OP_TYPEPOSSTAR))
+     {
+     if (scode[1] != OP_ALLANY || (bracket_map & cb->backref_map) != 0 ||
+         atomcount > 0 || cb->had_pruneorskip ||
+         (cb->external_options & PCRE2_NO_DOTSTAR_ANCHOR) != 0)
+       return FALSE;
+     }
+
+   /* Check for explicit anchoring */
+
+   else if (op != OP_SOD && op != OP_SOM && 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. Also, the appearance of .*
+inside atomic brackets or in a pattern that contains *PRUNE or *SKIP does not
+count, because once again the assumption no longer holds.
+
+Arguments:
+  code           points to start of the compiled pattern or a group
+  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
+  cb             points to the compile data
+  atomcount      atomic group level
+
+Returns:         TRUE or FALSE
+*/
+
+static BOOL
+is_startline(PCRE2_SPTR code, unsigned int bracket_map, compile_block *cb,
+  int atomcount)
+{
+do {
+   PCRE2_SPTR scode = first_significant_code(
+     code + PRIV(OP_lengths)[*code], FALSE);
+   register int op = *scode;
+
+   /* If we are at the start of a conditional assertion group, *both* the
+   conditional assertion *and* what follows the condition must satisfy the test
+   for start of line. Other kinds of condition fail. Note that there may be an
+   auto-callout at the start of a condition. */
+
+   if (op == OP_COND)
+     {
+     scode += 1 + LINK_SIZE;
+
+     if (*scode == OP_CALLOUT) scode += PRIV(OP_lengths)[OP_CALLOUT];
+       else if (*scode == OP_CALLOUT_STR) scode += GET(scode, 1 + 2*LINK_SIZE);
+
+     switch (*scode)
+       {
+       case OP_CREF:
+       case OP_DNCREF:
+       case OP_RREF:
+       case OP_DNRREF:
+       case OP_FAIL:
+       case OP_FALSE:
+       case OP_TRUE:
+       return FALSE;
+
+       default:     /* Assertion */
+       if (!is_startline(scode, bracket_map, cb, atomcount)) return FALSE;
+       do scode += GET(scode, 1); while (*scode == OP_ALT);
+       scode += 1 + LINK_SIZE;
+       break;
+       }
+     scode = first_significant_code(scode, FALSE);
+     op = *scode;
+     }
+
+   /* Non-capturing brackets */
+
+   if (op == OP_BRA  || op == OP_BRAPOS ||
+       op == OP_SBRA || op == OP_SBRAPOS)
+     {
+     if (!is_startline(scode, bracket_map, cb, atomcount)) return FALSE;
+     }
+
+   /* Capturing brackets */
+
+   else if (op == OP_CBRA  || op == OP_CBRAPOS ||
+            op == OP_SCBRA || op == OP_SCBRAPOS)
+     {
+     int n = GET2(scode, 1+LINK_SIZE);
+     int new_map = bracket_map | ((n < 32)? (1u << n) : 1);
+     if (!is_startline(scode, new_map, cb, atomcount)) return FALSE;
+     }
+
+   /* Positive forward assertions */
+
+   else if (op == OP_ASSERT)
+     {
+     if (!is_startline(scode, bracket_map, cb, atomcount)) return FALSE;
+     }
+
+   /* Atomic brackets */
+
+   else if (op == OP_ONCE || op == OP_ONCE_NC)
+     {
+     if (!is_startline(scode, bracket_map, cb, atomcount + 1)) return FALSE;
+     }
+
+   /* .* means "start at start or after \n" if it isn't in atomic brackets or
+   brackets that may be referenced, as long as the pattern does not contain
+   *PRUNE or *SKIP, because these break the feature. Consider, for example,
+   /.*?a(*PRUNE)b/ with the subject "aab", which matches "ab", i.e. not at the
+   start of a line. There is also an option that disables this optimization. */
+
+   else if (op == OP_TYPESTAR || op == OP_TYPEMINSTAR || op == OP_TYPEPOSSTAR)
+     {
+     if (scode[1] != OP_ANY || (bracket_map & cb->backref_map) != 0 ||
+         atomcount > 0 || cb->had_pruneorskip ||
+         (cb->external_options & PCRE2_NO_DOTSTAR_ANCHOR) != 0)
+       return FALSE;
+     }
+
+   /* Check for explicit circumflex; anything else gives a FALSE result. Note
+   in particular that this includes atomic brackets OP_ONCE and OP_ONCE_NC
+   because the number of characters matched by .* cannot be adjusted inside
+   them. */
+
+   else if (op != OP_CIRC && op != OP_CIRCM) 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 code unit    *
+*************************************************/
+
+/* During compilation, the "first code unit" settings from forward assertions
+are discarded, because they can cause conflicts with actual literals that
+follow. However, if we end up without a first code unit setting for an
+unanchored pattern, it is worth scanning the regex to see if there is an
+initial asserted first code unit. If all branches start with the same asserted
+code unit, or with a non-conditional bracket all of whose alternatives start
+with the same asserted code unit (recurse ad lib), then we return that code
+unit, with the flags set to zero or REQ_CASELESS; otherwise return zero with
+REQ_NONE in the flags.
+
+Arguments:
+  code       points to start of compiled pattern
+  flags      points to the first code unit flags
+  inassert   TRUE if in an assertion
+
+Returns:     the fixed first code unit, or 0 with REQ_NONE in flags
+*/
+
+static uint32_t
+find_firstassertedcu(PCRE2_SPTR code, int32_t *flags, BOOL inassert)
+{
+register uint32_t c = 0;
+int cflags = REQ_NONE;
+
+*flags = REQ_NONE;
+do {
+   uint32_t d;
+   int dflags;
+   int xl = (*code == OP_CBRA || *code == OP_SCBRA ||
+             *code == OP_CBRAPOS || *code == OP_SCBRAPOS)? IMM2_SIZE:0;
+   PCRE2_SPTR scode = first_significant_code(code + 1+LINK_SIZE + xl, TRUE);
+   register PCRE2_UCHAR op = *scode;
+
+   switch(op)
+     {
+     default:
+     return 0;
+
+     case OP_BRA:
+     case OP_BRAPOS:
+     case OP_CBRA:
+     case OP_SCBRA:
+     case OP_CBRAPOS:
+     case OP_SCBRAPOS:
+     case OP_ASSERT:
+     case OP_ONCE:
+     case OP_ONCE_NC:
+     d = find_firstassertedcu(scode, &dflags, op == OP_ASSERT);
+     if (dflags < 0)
+       return 0;
+     if (cflags < 0) { c = d; cflags = dflags; }
+       else if (c != d || cflags != dflags) return 0;
+     break;
+
+     case OP_EXACT:
+     scode += IMM2_SIZE;
+     /* Fall through */
+
+     case OP_CHAR:
+     case OP_PLUS:
+     case OP_MINPLUS:
+     case OP_POSPLUS:
+     if (!inassert) return 0;
+     if (cflags < 0) { c = scode[1]; cflags = 0; }
+       else if (c != scode[1]) return 0;
+     break;
+
+     case OP_EXACTI:
+     scode += IMM2_SIZE;
+     /* Fall through */
+
+     case OP_CHARI:
+     case OP_PLUSI:
+     case OP_MINPLUSI:
+     case OP_POSPLUSI:
+     if (!inassert) return 0;
+     if (cflags < 0) { c = scode[1]; cflags = REQ_CASELESS; }
+       else if (c != scode[1]) return 0;
+     break;
+     }
+
+   code += GET(code, 1);
+   }
+while (*code == OP_ALT);
+
+*flags = cflags;
+return c;
+}
+
+
+
+/*************************************************
+*     Add an entry to the name/number table      *
+*************************************************/
+
+/* This function is called between compiling passes to add an entry to the
+name/number table, maintaining alphabetical order. Checking for permitted
+and forbidden duplicates has already been done.
+
+Arguments:
+  cb           the compile data block
+  name         the name to add
+  length       the length of the name
+  groupno      the group number
+
+Returns:       nothing
+*/
+
+static void
+add_name_to_table(compile_block *cb, PCRE2_SPTR name, int length,
+  unsigned int groupno)
+{
+int i;
+PCRE2_UCHAR *slot = cb->name_table;
+
+for (i = 0; i < cb->names_found; i++)
+  {
+  int crc = memcmp(name, slot+IMM2_SIZE, CU2BYTES(length));
+  if (crc == 0 && slot[IMM2_SIZE+length] != 0)
+    crc = -1; /* Current name is a substring */
+
+  /* Make space in the table and break the loop for an earlier name. For a
+  duplicate or later name, carry on. We do this for duplicates so that in the
+  simple case (when ?(| is not used) they are in order of their numbers. In all
+  cases they are in the order in which they appear in the pattern. */
+
+  if (crc < 0)
+    {
+    memmove(slot + cb->name_entry_size, slot,
+      CU2BYTES((cb->names_found - i) * cb->name_entry_size));
+    break;
+    }
+
+  /* Continue the loop for a later or duplicate name */
+
+  slot += cb->name_entry_size;
+  }
+
+PUT2(slot, 0, groupno);
+memcpy(slot + IMM2_SIZE, name, CU2BYTES(length));
+cb->names_found++;
+
+/* Add a terminating zero and fill the rest of the slot with zeroes so that
+the memory is all initialized. Otherwise valgrind moans about uninitialized
+memory when saving serialized compiled patterns. */
+
+memset(slot + IMM2_SIZE + length, 0,
+  CU2BYTES(cb->name_entry_size - length - IMM2_SIZE));
+}
+
+
+
+/*************************************************
+*     External function to compile a pattern     *
+*************************************************/
+
+/* This function reads a regular expression in the form of a string and returns
+a pointer to a block of store holding a compiled version of the expression.
+
+Arguments:
+  pattern       the regular expression
+  patlen        the length of the pattern, or PCRE2_ZERO_TERMINATED
+  options       option bits
+  errorptr      pointer to errorcode
+  erroroffset   pointer to error offset
+  ccontext      points to a compile context or is NULL
+
+Returns:        pointer to compiled data block, or NULL on error,
+                with errorcode and erroroffset set
+*/
+
+PCRE2_EXP_DEFN pcre2_code * PCRE2_CALL_CONVENTION
+pcre2_compile(PCRE2_SPTR pattern, PCRE2_SIZE patlen, uint32_t options,
+   int *errorptr, PCRE2_SIZE *erroroffset, pcre2_compile_context *ccontext)
+{
+BOOL utf;                               /* Set TRUE for UTF mode */
+pcre2_real_code *re = NULL;             /* What we will return */
+compile_block cb;                       /* "Static" compile-time data */
+const uint8_t *tables;                  /* Char tables base pointer */
+
+PCRE2_UCHAR *code;                      /* Current pointer in compiled code */
+PCRE2_SPTR codestart;                   /* Start of compiled code */
+PCRE2_SPTR ptr;                         /* Current pointer in pattern */
+
+size_t length = 1;                      /* Allow or final END opcode */
+size_t usedlength;                      /* Actual length used */
+size_t re_blocksize;                    /* Size of memory block */
+
+int32_t firstcuflags, reqcuflags;       /* Type of first/req code unit */
+uint32_t firstcu, reqcu;                /* Value of first/req code unit */
+uint32_t setflags = 0;                  /* NL and BSR set flags */
+
+uint32_t skipatstart;                   /* When checking (*UTF) etc */
+uint32_t limit_match = UINT32_MAX;      /* Unset match limits */
+uint32_t limit_recursion = UINT32_MAX;
+
+int newline = 0;                        /* Unset; can be set by the pattern */
+int bsr = 0;                            /* Unset; can be set by the pattern */
+int errorcode = 0;                      /* Initialize to avoid compiler warn */
+
+/* Comments at the head of this file explain about these variables. */
+
+PCRE2_UCHAR *copied_pattern = NULL;
+PCRE2_UCHAR stack_copied_pattern[COPIED_PATTERN_SIZE];
+named_group named_groups[NAMED_GROUP_LIST_SIZE];
+
+/* The workspace is used in different ways in the different compiling phases.
+It needs to be 16-bit aligned for the preliminary group scan, and 32-bit
+aligned for the group information cache. */
+
+uint32_t c32workspace[C32_WORK_SIZE];
+PCRE2_UCHAR *cworkspace = (PCRE2_UCHAR *)c32workspace;
+
+
+/* -------------- Check arguments and set up the pattern ----------------- */
+
+/* There must be error code and offset pointers. */
+
+if (errorptr == NULL || erroroffset == NULL) return NULL;
+*errorptr = ERR0;
+*erroroffset = 0;
+
+/* There must be a pattern! */
+
+if (pattern == NULL)
+  {
+  *errorptr = ERR16;
+  return NULL;
+  }
+
+/* Check that all undefined public option bits are zero. */
+
+if ((options & ~PUBLIC_COMPILE_OPTIONS) != 0)
+  {
+  *errorptr = ERR17;
+  return NULL;
+  }
+
+/* A NULL compile context means "use a default context" */
+
+if (ccontext == NULL)
+  ccontext = (pcre2_compile_context *)(&PRIV(default_compile_context));
+
+/* A zero-terminated pattern is indicated by the special length value
+PCRE2_ZERO_TERMINATED. Otherwise, we make a copy of the pattern and add a zero,
+to ensure that it is always possible to look one code unit beyond the end of
+the pattern's characters. In both cases, check that the pattern is overlong. */
+
+if (patlen == PCRE2_ZERO_TERMINATED)
+  {
+  patlen = PRIV(strlen)(pattern);
+  if (patlen > ccontext->max_pattern_length)
+    {
+    *errorptr = ERR88;
+    return NULL;
+    }
+  }
+else
+  {
+  if (patlen > ccontext->max_pattern_length)
+    {
+    *errorptr = ERR88;
+    return NULL;
+    }
+  if (patlen < COPIED_PATTERN_SIZE)
+    copied_pattern = stack_copied_pattern;
+  else
+    {
+    copied_pattern = ccontext->memctl.malloc(CU2BYTES(patlen + 1),
+      ccontext->memctl.memory_data);
+    if (copied_pattern == NULL)
+      {
+      *errorptr = ERR21;
+      return NULL;
+      }
+    }
+  memcpy(copied_pattern, pattern, CU2BYTES(patlen));
+  copied_pattern[patlen] = 0;
+  pattern = copied_pattern;
+  }
+
+/* ------------ Initialize the "static" compile data -------------- */
+
+tables = (ccontext->tables != NULL)? ccontext->tables : PRIV(default_tables);
+
+cb.lcc = tables + lcc_offset;          /* Individual */
+cb.fcc = tables + fcc_offset;          /*   character */
+cb.cbits = tables + cbits_offset;      /*      tables */
+cb.ctypes = tables + ctypes_offset;
+
+cb.assert_depth = 0;
+cb.bracount = cb.final_bracount = 0;
+cb.cx = ccontext;
+cb.dupnames = FALSE;
+cb.end_pattern = pattern + patlen;
+cb.nestptr[0] = cb.nestptr[1] = NULL;
+cb.external_flags = 0;
+cb.external_options = options;
+cb.groupinfo = c32workspace;
+cb.had_recurse = FALSE;
+cb.iscondassert = FALSE;
+cb.max_lookbehind = 0;
+cb.name_entry_size = 0;
+cb.name_table = NULL;
+cb.named_groups = named_groups;
+cb.named_group_list_size = NAMED_GROUP_LIST_SIZE;
+cb.names_found = 0;
+cb.open_caps = NULL;
+cb.parens_depth = 0;
+cb.req_varyopt = 0;
+cb.start_code = cworkspace;
+cb.start_pattern = pattern;
+cb.start_workspace = cworkspace;
+cb.workspace_size = COMPILE_WORK_SIZE;
+
+/* Maximum back reference and backref bitmap. The bitmap records up to 31 back
+references to help in deciding whether (.*) can be treated as anchored or not.
+*/
+
+cb.top_backref = 0;
+cb.backref_map = 0;
+
+/* --------------- Start looking at the pattern --------------- */
+
+/* Check for global one-time option settings at the start of the pattern, and
+remember the offset to the actual regex. */
+
+ptr = pattern;
+skipatstart = 0;
+
+while (ptr[skipatstart] == CHAR_LEFT_PARENTHESIS &&
+       ptr[skipatstart+1] == CHAR_ASTERISK)
+  {
+  unsigned int i;
+  for (i = 0; i < sizeof(pso_list)/sizeof(pso); i++)
+    {
+    pso *p = pso_list + i;
+
+    if (PRIV(strncmp_c8)(ptr+skipatstart+2, (char *)(p->name), p->length) == 0)
+      {
+      uint32_t c, pp;
+
+      skipatstart += p->length + 2;
+      switch(p->type)
+        {
+        case PSO_OPT:
+        cb.external_options |= p->value;
+        break;
+
+        case PSO_FLG:
+        setflags |= p->value;
+        break;
+
+        case PSO_NL:
+        newline = p->value;
+        setflags |= PCRE2_NL_SET;
+        break;
+
+        case PSO_BSR:
+        bsr = p->value;
+        setflags |= PCRE2_BSR_SET;
+        break;
+
+        case PSO_LIMM:
+        case PSO_LIMR:
+        c = 0;
+        pp = skipatstart;
+        if (!IS_DIGIT(ptr[pp]))
+          {
+          errorcode = ERR60;
+          ptr += pp;
+          goto HAD_ERROR;
+          }
+        while (IS_DIGIT(ptr[pp]))
+          {
+          if (c > UINT32_MAX / 10 - 1) break;   /* Integer overflow */
+          c = c*10 + (ptr[pp++] - CHAR_0);
+          }
+        if (ptr[pp++] != CHAR_RIGHT_PARENTHESIS)
+          {
+          errorcode = ERR60;
+          ptr += pp;
+          goto HAD_ERROR;
+          }
+        if (p->type == PSO_LIMM) limit_match = c;
+          else limit_recursion = c;
+        skipatstart += pp - skipatstart;
+        break;
+        }
+      break;   /* Out of the table scan loop */
+      }
+    }
+  if (i >= sizeof(pso_list)/sizeof(pso)) break;   /* Out of pso loop */
+  }
+
+/* End of pattern-start options; advance to start of real regex. */
+
+ptr += skipatstart;
+
+/* Can't support UTF or UCP unless PCRE2 has been compiled with UTF support. */
+
+#ifndef SUPPORT_UNICODE
+if ((cb.external_options & (PCRE2_UTF|PCRE2_UCP)) != 0)
+  {
+  errorcode = ERR32;
+  goto HAD_ERROR;
+  }
+#endif
+
+/* Check UTF. We have the original options in 'options', with that value as
+modified by (*UTF) etc in cb->external_options. */
+
+utf = (cb.external_options & PCRE2_UTF) != 0;
+if (utf)
+  {
+  if ((options & PCRE2_NEVER_UTF) != 0)
+    {
+    errorcode = ERR74;
+    goto HAD_ERROR;
+    }
+  if ((options & PCRE2_NO_UTF_CHECK) == 0 &&
+       (errorcode = PRIV(valid_utf)(pattern, patlen, erroroffset)) != 0)
+    goto HAD_UTF_ERROR;
+  }
+
+/* Check UCP lockout. */
+
+if ((cb.external_options & (PCRE2_UCP|PCRE2_NEVER_UCP)) ==
+    (PCRE2_UCP|PCRE2_NEVER_UCP))
+  {
+  errorcode = ERR75;
+  goto HAD_ERROR;
+  }
+
+/* Process the BSR setting. */
+
+if (bsr == 0) bsr = ccontext->bsr_convention;
+
+/* Process the newline setting. */
+
+if (newline == 0) newline = ccontext->newline_convention;
+cb.nltype = NLTYPE_FIXED;
+switch(newline)
+  {
+  case PCRE2_NEWLINE_CR:
+  cb.nllen = 1;
+  cb.nl[0] = CHAR_CR;
+  break;
+
+  case PCRE2_NEWLINE_LF:
+  cb.nllen = 1;
+  cb.nl[0] = CHAR_NL;
+  break;
+
+  case PCRE2_NEWLINE_CRLF:
+  cb.nllen = 2;
+  cb.nl[0] = CHAR_CR;
+  cb.nl[1] = CHAR_NL;
+  break;
+
+  case PCRE2_NEWLINE_ANY:
+  cb.nltype = NLTYPE_ANY;
+  break;
+
+  case PCRE2_NEWLINE_ANYCRLF:
+  cb.nltype = NLTYPE_ANYCRLF;
+  break;
+
+  default:
+  errorcode = ERR56;
+  goto HAD_ERROR;
+  }
+
+/* Before we do anything else, do a pre-scan of the pattern in order to
+discover the named groups and their numerical equivalents, so that this
+information is always available for the remaining processing. */
+
+errorcode = scan_for_captures(&ptr, cb.external_options, &cb);
+if (errorcode != 0) goto HAD_ERROR;
+
+/* For obscure debugging this code can be enabled. */
+
+#if 0
+  {
+  int i;
+  named_group *ng = cb.named_groups;
+  fprintf(stderr, "+++Captures: %d\n", cb.final_bracount);
+  for (i = 0; i < cb.names_found; i++, ng++)
+    {
+    fprintf(stderr, "+++%3d %.*s\n", ng->number, ng->length, ng->name);
+    }
+  }
+#endif
+
+/* Reset current bracket count to zero and current pointer to the start of the
+pattern. */
+
+cb.bracount = 0;
+ptr = pattern + skipatstart;
+
+/* Pretend to compile the pattern while actually just accumulating the amount
+of memory required in the 'length' variable. This behaviour is triggered by
+passing a non-NULL final argument to compile_regex(). We pass a block of
+workspace (cworkspace) for it to compile parts of the pattern into; the
+compiled code is discarded when it is no longer needed, so hopefully this
+workspace will never overflow, though there is a test for its doing so.
+
+On error, errorcode will be set non-zero, so we don't need to look at the
+result of the function. The initial options have been put into the cb block so
+that they can be changed if an option setting is found within the regex right
+at the beginning. Bringing initial option settings outside can help speed up
+starting point checks. We still have to pass a separate options variable (the
+first argument) because that may change as the pattern is processed. */
+
+code = cworkspace;
+*code = OP_BRA;
+
+(void)compile_regex(cb.external_options, &code, &ptr, &errorcode, FALSE,
+  FALSE, 0, 0, &firstcu, &firstcuflags, &reqcu, &reqcuflags, NULL,
+  &cb, &length);
+
+if (errorcode != 0) goto HAD_ERROR;
+if (length > MAX_PATTERN_SIZE)
+  {
+  errorcode = ERR20;
+  goto HAD_ERROR;
+  }
+
+/* Compute the size of, and then get and initialize, the data block for storing
+the compiled pattern and names table. Integer overflow should no longer be
+possible because nowadays we limit the maximum value of cb.names_found and
+cb.name_entry_size. */
+
+re_blocksize = sizeof(pcre2_real_code) +
+  CU2BYTES(length + cb.names_found * cb.name_entry_size);
+re = (pcre2_real_code *)
+  ccontext->memctl.malloc(re_blocksize, ccontext->memctl.memory_data);
+if (re == NULL)
+  {
+  errorcode = ERR21;
+  goto HAD_ERROR;
+  }
+
+re->memctl = ccontext->memctl;
+re->tables = tables;
+re->executable_jit = NULL;
+memset(re->start_bitmap, 0, 32 * sizeof(uint8_t));
+re->blocksize = re_blocksize;
+re->magic_number = MAGIC_NUMBER;
+re->compile_options = options;
+re->overall_options = cb.external_options;
+re->flags = PCRE2_CODE_UNIT_WIDTH/8 | cb.external_flags | setflags;
+re->limit_match = limit_match;
+re->limit_recursion = limit_recursion;
+re->first_codeunit = 0;
+re->last_codeunit = 0;
+re->bsr_convention = bsr;
+re->newline_convention = newline;
+re->max_lookbehind = 0;
+re->minlength = 0;
+re->top_bracket = 0;
+re->top_backref = 0;
+re->name_entry_size = cb.name_entry_size;
+re->name_count = cb.names_found;
+
+/* The basic block is immediately followed by the name table, and the compiled
+code follows after that. */
+
+codestart = (PCRE2_SPTR)((uint8_t *)re + sizeof(pcre2_real_code)) +
+  re->name_entry_size * re->name_count;
+
+/* Workspace is needed to remember information about numbered groups: whether a
+group can match an empty string and what its fixed length is. This is done to
+avoid the possibility of recursive references causing very long compile times
+when checking these features. Unnumbered groups do not have this exposure since
+they cannot be referenced. We use an indexed vector for this purpose. If there
+are sufficiently few groups, it can be the c32workspace vector, as set up
+above. Otherwise we have to get/free a special vector. The vector must be
+initialized to zero. */
+
+if (cb.final_bracount >= C32_WORK_SIZE)
+  {
+  cb.groupinfo = ccontext->memctl.malloc(
+    (cb.final_bracount + 1)*sizeof(uint32_t), ccontext->memctl.memory_data);
+  if (cb.groupinfo == NULL)
+    {
+    errorcode = ERR21;
+    goto HAD_ERROR;
+    }
+  }
+memset(cb.groupinfo, 0, (cb.final_bracount + 1) * sizeof(uint32_t));
+
+/* Update the compile data block for the actual compile. The starting points of
+the name/number translation table and of the code are passed around in the
+compile data block. The start/end pattern and initial options are already set
+from the pre-compile phase, as is the name_entry_size field. Reset the bracket
+count and the names_found field. */
+
+cb.parens_depth = 0;
+cb.assert_depth = 0;
+cb.bracount = 0;
+cb.max_lookbehind = 0;
+cb.name_table = (PCRE2_UCHAR *)((uint8_t *)re + sizeof(pcre2_real_code));
+cb.start_code = codestart;
+cb.iscondassert = FALSE;
+cb.req_varyopt = 0;
+cb.had_accept = FALSE;
+cb.had_pruneorskip = FALSE;
+cb.check_lookbehind = FALSE;
+cb.open_caps = NULL;
+
+/* If any named groups were found, create the name/number table from the list
+created in the pre-pass. */
+
+if (cb.names_found > 0)
+  {
+  int i = cb.names_found;
+  named_group *ng = cb.named_groups;
+  cb.names_found = 0;
+  for (; i > 0; i--, ng++)
+    add_name_to_table(&cb, ng->name, ng->length, ng->number);
+  }
+
+/* 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 = pattern + skipatstart;
+code = (PCRE2_UCHAR *)codestart;
+*code = OP_BRA;
+(void)compile_regex(re->overall_options, &code, &ptr, &errorcode, FALSE, FALSE,
+   0, 0, &firstcu, &firstcuflags, &reqcu, &reqcuflags, NULL, &cb, NULL);
+
+re->top_bracket = cb.bracount;
+re->top_backref = cb.top_backref;
+re->max_lookbehind = cb.max_lookbehind;
+
+if (cb.had_accept)
+  {
+  reqcu = 0;              /* Must disable after (*ACCEPT) */
+  reqcuflags = REQ_NONE;
+  }
+
+/* If we have not reached end of pattern after a successful compile, there's an
+excess bracket. Fill in the final opcode and check for disastrous overflow.
+If no overflow, but the estimated length exceeds the really used length, adjust
+the value of re->blocksize, and if valgrind support is configured, mark the
+extra allocated memory as unaddressable, so that any out-of-bound reads can be
+detected. */
+
+if (errorcode == 0 && ptr < cb.end_pattern) errorcode = ERR22;
+*code++ = OP_END;
+usedlength = code - codestart;
+if (usedlength > length) errorcode = ERR23; else
+  {
+  re->blocksize -= CU2BYTES(length - usedlength);
+#ifdef SUPPORT_VALGRIND
+  VALGRIND_MAKE_MEM_NOACCESS(code, CU2BYTES(length - usedlength));
+#endif
+  }
+
+/* Scan the pattern for recursion/subroutine calls and convert the group
+numbers into offsets. Maintain a small cache so that repeated groups containing
+recursions are efficiently handled. */
+
+#define RSCAN_CACHE_SIZE 8
+
+if (errorcode == 0 && cb.had_recurse)
+  {
+  PCRE2_UCHAR *rcode;
+  PCRE2_SPTR rgroup;
+  int ccount = 0;
+  int start = RSCAN_CACHE_SIZE;
+  recurse_cache rc[RSCAN_CACHE_SIZE];
+
+  for (rcode = (PCRE2_UCHAR *)find_recurse(codestart, utf);
+       rcode != NULL;
+       rcode = (PCRE2_UCHAR *)find_recurse(rcode + 1 + LINK_SIZE, utf))
+    {
+    int i, p, recno;
+
+    recno = (int)GET(rcode, 1);
+    if (recno == 0) rgroup = codestart; else
+      {
+      PCRE2_SPTR search_from = codestart;
+      rgroup = NULL;
+      for (i = 0, p = start; i < ccount; i++, p = (p + 1) & 7)
+        {
+        if (recno == rc[p].recno)
+          {
+          rgroup = rc[p].group;
+          break;
+          }
+
+        /* Group n+1 must always start to the right of group n, so we can save
+        search time below when the new group number is greater than any of the
+        previously found groups. */
+
+        if (recno > rc[p].recno) search_from = rc[p].group;
+        }
+
+      if (rgroup == NULL)
+        {
+        rgroup = PRIV(find_bracket)(search_from, utf, recno);
+        if (rgroup == NULL)
+          {
+          errorcode = ERR53;
+          break;
+          }
+        if (--start < 0) start = RSCAN_CACHE_SIZE - 1;
+        rc[start].recno = recno;
+        rc[start].group = rgroup;
+        if (ccount < RSCAN_CACHE_SIZE) ccount++;
+        }
+      }
+
+    PUT(rcode, 1, rgroup - codestart);
+    }
+  }
+
+/* In rare debugging situations we sometimes need to look at the compiled code
+at this stage. */
+
+#ifdef CALL_PRINTINT
+pcre2_printint(re, stderr, TRUE);
+fprintf(stderr, "Length=%lu Used=%lu\n", length, usedlength);
+#endif
+
+/* After a successful compile, give an error if there's back reference to a
+non-existent capturing subpattern. Then, unless disabled, check whether any
+single character iterators can be auto-possessified. The function overwrites
+the appropriate opcode values, so the type of the pointer must be cast. NOTE:
+the intermediate variable "temp" is used in this code because at least one
+compiler gives a warning about loss of "const" attribute if the cast
+(PCRE2_UCHAR *)codestart is used directly in the function call. */
+
+if (errorcode == 0)
+  {
+  if (re->top_backref > re->top_bracket) errorcode = ERR15;
+  else if ((re->overall_options & PCRE2_NO_AUTO_POSSESS) == 0)
+    {
+    PCRE2_UCHAR *temp = (PCRE2_UCHAR *)codestart;
+    if (PRIV(auto_possessify)(temp, utf, &cb) != 0) errorcode = ERR80;
+    }
+  }
+
+/* If there were any lookbehind assertions that contained OP_RECURSE
+(recursions or subroutine calls), a flag is set for them to be checked here,
+because they may contain forward references. Actual recursions cannot be fixed
+length, but subroutine calls can. It is done like this so that those without
+OP_RECURSE that are not fixed length get a diagnosic with a useful offset. The
+exceptional ones forgo this. We scan the pattern to check that they are fixed
+length, and set their lengths. */
+
+if (errorcode == 0 && cb.check_lookbehind)
+  {
+  PCRE2_UCHAR *cc = (PCRE2_UCHAR *)codestart;
+
+  /* Loop, searching for OP_REVERSE items, and process those that do not have
+  their length set. (Actually, it will also re-process any that have a length
+  of zero, but that is a pathological case, and it does no harm.) When we find
+  one, we temporarily terminate the branch it is in while we scan it. Note that
+  calling find_bracket() with a negative group number returns a pointer to the
+  OP_REVERSE item, not the actual lookbehind. */
+
+  for (cc = (PCRE2_UCHAR *)PRIV(find_bracket)(codestart, utf, -1);
+       cc != NULL;
+       cc = (PCRE2_UCHAR *)PRIV(find_bracket)(cc, utf, -1))
+    {
+    if (GET(cc, 1) == 0)
+      {
+      int fixed_length;
+      int count = 0;
+      PCRE2_UCHAR *be = cc - 1 - LINK_SIZE + GET(cc, -LINK_SIZE);
+      int end_op = *be;
+      *be = OP_END;
+      fixed_length = find_fixedlength(cc, utf, TRUE, &cb, NULL, &count);
+      *be = end_op;
+      if (fixed_length < 0)
+        {
+        errorcode = fixed_length_errors[-fixed_length];
+        break;
+        }
+      if (fixed_length > cb.max_lookbehind) cb.max_lookbehind = fixed_length;
+      PUT(cc, 1, fixed_length);
+      }
+    cc += 1 + LINK_SIZE;
+    }
+
+  /* The previous value of the maximum lookbehind was transferred to the
+  compiled regex block above. We could have updated this value in the loop
+  above, but keep the two values in step, just in case some later code below
+  uses the cb value. */
+
+  re->max_lookbehind = cb.max_lookbehind;
+  }
+
+/* Failed to compile, or error while post-processing. Earlier errors get here
+via the dreaded goto. */
+
+if (errorcode != 0)
+  {
+  HAD_ERROR:
+  *erroroffset = (int)(ptr - pattern);
+  HAD_UTF_ERROR:
+  *errorptr = errorcode;
+  pcre2_code_free(re);
+  re = NULL;
+  goto EXIT;
+  }
+
+/* Successful compile. If the anchored option was not passed, set it if
+we can determine that the pattern is anchored by virtue of ^ characters or \A
+or anything else, such as starting with non-atomic .* when DOTALL is set and
+there are no occurrences of *PRUNE or *SKIP (though there is an option to
+disable this case). */
+
+if ((re->overall_options & PCRE2_ANCHORED) == 0 &&
+     is_anchored(codestart, 0, &cb, 0))
+  re->overall_options |= PCRE2_ANCHORED;
+
+/* If the pattern is still not anchored and we do not have a first code unit,
+see if there is one that is asserted (these are not saved during the compile
+because they can cause conflicts with actual literals that follow). This code
+need not be obeyed if PCRE2_NO_START_OPTIMIZE is set, as the data it would
+create will not be used. */
+
+if ((re->overall_options & (PCRE2_ANCHORED|PCRE2_NO_START_OPTIMIZE)) == 0)
+  {
+  if (firstcuflags < 0)
+    firstcu = find_firstassertedcu(codestart, &firstcuflags, FALSE);
+
+  /* Save the data for a first code unit. */
+
+  if (firstcuflags >= 0)
+    {
+    re->first_codeunit = firstcu;
+    re->flags |= PCRE2_FIRSTSET;
+
+    /* Handle caseless first code units. */
+
+    if ((firstcuflags & REQ_CASELESS) != 0)
+      {
+      if (firstcu < 128 || (!utf && firstcu < 255))
+        {
+        if (cb.fcc[firstcu] != firstcu) re->flags |= PCRE2_FIRSTCASELESS;
+        }
+
+      /* The first code unit is > 128 in UTF mode, or > 255 otherwise. In
+      8-bit UTF mode, codepoints in the range 128-255 are introductory code
+      points and cannot have another case. In 16-bit and 32-bit modes, we can
+      check wide characters when UTF (and therefore UCP) is supported. */
+
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 8
+      else if (firstcu <= MAX_UTF_CODE_POINT &&
+               UCD_OTHERCASE(firstcu) != firstcu)
+        re->flags |= PCRE2_FIRSTCASELESS;
+#endif
+      }
+    }
+
+  /* When there is no first code unit, see if we can set the PCRE2_STARTLINE
+  flag. This is helpful for multiline matches when all branches start with ^
+  and also when all branches start with non-atomic .* for non-DOTALL matches
+  when *PRUNE and SKIP are not present. (There is an option that disables this
+  case.) */
+
+  else if (is_startline(codestart, 0, &cb, 0)) re->flags |= PCRE2_STARTLINE;
+  }
+
+/* Handle the "required code unit", if one is set. In the case of an anchored
+pattern, do this only if it follows a variable length item in the pattern.
+Again, skip this if PCRE2_NO_START_OPTIMIZE is set. */
+
+if (reqcuflags >= 0 &&
+     ((re->overall_options & (PCRE2_ANCHORED|PCRE2_NO_START_OPTIMIZE)) == 0 ||
+      (reqcuflags & REQ_VARY) != 0))
+  {
+  re->last_codeunit = reqcu;
+  re->flags |= PCRE2_LASTSET;
+
+  /* Handle caseless required code units as for first code units (above). */
+
+  if ((reqcuflags & REQ_CASELESS) != 0)
+    {
+    if (reqcu < 128 || (!utf && reqcu < 255))
+      {
+      if (cb.fcc[reqcu] != reqcu) re->flags |= PCRE2_LASTCASELESS;
+      }
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 8
+    else if (reqcu <= MAX_UTF_CODE_POINT && UCD_OTHERCASE(reqcu) != reqcu)
+      re->flags |= PCRE2_LASTCASELESS;
+#endif
+    }
+  }
+
+/* Check for a pattern than can match an empty string, so that this information
+can be provided to applications. */
+
+do
+  {
+  int count = 0;
+  int rc = could_be_empty_branch(codestart, code, utf, &cb, TRUE, NULL, &count);
+  if (rc < 0)
+    {
+    errorcode = ERR86;
+    goto HAD_ERROR;
+    }
+  if (rc > 0)
+    {
+    re->flags |= PCRE2_MATCH_EMPTY;
+    break;
+    }
+  codestart += GET(codestart, 1);
+  }
+while (*codestart == OP_ALT);
+
+/* Finally, unless PCRE2_NO_START_OPTIMIZE is set, study the compiled pattern
+to set up information such as a bitmap of starting code units and a minimum
+matching length. */
+
+if ((re->overall_options & PCRE2_NO_START_OPTIMIZE) == 0 &&
+    PRIV(study)(re) != 0)
+  {
+  errorcode = ERR31;
+  goto HAD_ERROR;
+  }
+
+/* Control ends up here in all cases. If memory was obtained for a
+zero-terminated copy of the pattern, remember to free it before returning. Also
+free the list of named groups if a larger one had to be obtained, and likewise
+the group information vector. */
+
+EXIT:
+if (copied_pattern != stack_copied_pattern)
+  ccontext->memctl.free(copied_pattern, ccontext->memctl.memory_data);
+if (cb.named_group_list_size > NAMED_GROUP_LIST_SIZE)
+  ccontext->memctl.free((void *)cb.named_groups, ccontext->memctl.memory_data);
+if (cb.groupinfo != c32workspace)
+  ccontext->memctl.free((void *)cb.groupinfo, ccontext->memctl.memory_data);
+
+return re;    /* Will be NULL after an error */
+}
+
+/* End of pcre2_compile.c */
diff --git a/dist2/src/pcre2_config.c b/dist2/src/pcre2_config.c
new file mode 100644
index 0000000..9218459
--- /dev/null
+++ b/dist2/src/pcre2_config.c
@@ -0,0 +1,217 @@
+/*************************************************
+*      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
+     Original API code Copyright (c) 1997-2012 University of Cambridge
+         New API code Copyright (c) 2016 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.
+-----------------------------------------------------------------------------
+*/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+/* Save the configured link size, which is in bytes. In 16-bit and 32-bit modes
+its value gets changed by pcre2_internal.h to be in code units. */
+
+static int configured_link_size = LINK_SIZE;
+
+#include "pcre2_internal.h"
+
+/* These macros are the standard way of turning unquoted text into C strings.
+They allow macros like PCRE2_MAJOR to be defined without quotes, which is
+convenient for user programs that want to test their values. */
+
+#define STRING(a)  # a
+#define XSTRING(s) STRING(s)
+
+
+/*************************************************
+* Return info about what features are configured *
+*************************************************/
+
+/*
+Arguments:
+  what             what information is required
+  where            where to put the information
+
+Returns:           0 if data returned
+                   >= 0 if where is NULL, giving length required
+                   PCRE2_ERROR_BADOPTION if "where" not recognized
+                   or JIT target requested when JIT not enabled
+*/
+
+PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION
+pcre2_config(uint32_t what, void *where)
+{
+if (where == NULL)  /* Requests a length */
+  {
+  switch(what)
+    {
+    default:
+    return PCRE2_ERROR_BADOPTION;
+
+    case PCRE2_CONFIG_BSR:
+    case PCRE2_CONFIG_JIT:
+    case PCRE2_CONFIG_LINKSIZE:
+    case PCRE2_CONFIG_MATCHLIMIT:
+    case PCRE2_CONFIG_NEWLINE:
+    case PCRE2_CONFIG_PARENSLIMIT:
+    case PCRE2_CONFIG_RECURSIONLIMIT:
+    case PCRE2_CONFIG_STACKRECURSE:
+    case PCRE2_CONFIG_UNICODE:
+    return sizeof(uint32_t);
+
+    /* These are handled below */
+
+    case PCRE2_CONFIG_JITTARGET:
+    case PCRE2_CONFIG_UNICODE_VERSION:
+    case PCRE2_CONFIG_VERSION:
+    break;
+    }
+  }
+
+switch (what)
+  {
+  default:
+  return PCRE2_ERROR_BADOPTION;
+
+  case PCRE2_CONFIG_BSR:
+#ifdef BSR_ANYCRLF
+  *((uint32_t *)where) = PCRE2_BSR_ANYCRLF;
+#else
+  *((uint32_t *)where) = PCRE2_BSR_UNICODE;
+#endif
+  break;
+
+  case PCRE2_CONFIG_JIT:
+#ifdef SUPPORT_JIT
+  *((uint32_t *)where) = 1;
+#else
+  *((uint32_t *)where) = 0;
+#endif
+  break;
+
+  case PCRE2_CONFIG_JITTARGET:
+#ifdef SUPPORT_JIT
+    {
+    const char *v = PRIV(jit_get_target)();
+    return 1 + ((where == NULL)?
+      strlen(v) : PRIV(strcpy_c8)((PCRE2_UCHAR *)where, v));
+    }
+#else
+  return PCRE2_ERROR_BADOPTION;
+#endif
+
+  case PCRE2_CONFIG_LINKSIZE:
+  *((uint32_t *)where) = configured_link_size;
+  break;
+
+  case PCRE2_CONFIG_MATCHLIMIT:
+  *((uint32_t *)where) = MATCH_LIMIT;
+  break;
+
+  case PCRE2_CONFIG_NEWLINE:
+  *((uint32_t *)where) = NEWLINE_DEFAULT;
+  break;
+
+  case PCRE2_CONFIG_PARENSLIMIT:
+  *((uint32_t *)where) = PARENS_NEST_LIMIT;
+  break;
+
+  case PCRE2_CONFIG_RECURSIONLIMIT:
+  *((uint32_t *)where) = MATCH_LIMIT_RECURSION;
+  break;
+
+  case PCRE2_CONFIG_STACKRECURSE:
+#ifdef HEAP_MATCH_RECURSE
+  *((uint32_t *)where) = 0;
+#else
+  *((uint32_t *)where) = 1;
+#endif
+  break;
+
+  case PCRE2_CONFIG_UNICODE_VERSION:
+    {
+#if defined SUPPORT_UNICODE
+    const char *v = PRIV(unicode_version);
+#else
+    const char *v = "Unicode not supported";
+#endif
+    return 1 + ((where == NULL)?
+      strlen(v): PRIV(strcpy_c8)((PCRE2_UCHAR *)where, v));
+   }
+  break;
+
+  case PCRE2_CONFIG_UNICODE:
+#if defined SUPPORT_UNICODE
+  *((uint32_t *)where) = 1;
+#else
+  *((uint32_t *)where) = 0;
+#endif
+  break;
+
+  /* The hackery in setting "v" below is to cope with the case when
+  PCRE2_PRERELEASE is set to an empty string (which it is for real releases).
+  If the second alternative is used in this case, it does not leave a space
+  before the date. On the other hand, if all four macros are put into a single
+  XSTRING when PCRE2_PRERELEASE is not empty, an unwanted space is inserted.
+  There are problems using an "obvious" approach like this:
+
+     XSTRING(PCRE2_MAJOR) "." XSTRING(PCRE_MINOR)
+     XSTRING(PCRE2_PRERELEASE) " " XSTRING(PCRE_DATE)
+
+  because, when PCRE2_PRERELEASE is empty, this leads to an attempted expansion
+  of STRING(). The C standard states: "If (before argument substitution) any
+  argument consists of no preprocessing tokens, the behavior is undefined." It
+  turns out the gcc treats this case as a single empty string - which is what
+  we really want - but Visual C grumbles about the lack of an argument for the
+  macro. Unfortunately, both are within their rights. As there seems to be no
+  way to test for a macro's value being empty at compile time, we have to
+  resort to a runtime test. */
+
+  case PCRE2_CONFIG_VERSION:
+    {
+    const char *v = (XSTRING(Z PCRE2_PRERELEASE)[1] == 0)?
+      XSTRING(PCRE2_MAJOR.PCRE2_MINOR PCRE2_DATE) :
+      XSTRING(PCRE2_MAJOR.PCRE2_MINOR) XSTRING(PCRE2_PRERELEASE PCRE2_DATE);
+    return 1 + ((where == NULL)?
+      strlen(v) : PRIV(strcpy_c8)((PCRE2_UCHAR *)where, v));
+    }
+  }
+
+return 0;
+}
+
+/* End of pcre2_config.c */
diff --git a/dist2/src/pcre2_context.c b/dist2/src/pcre2_context.c
new file mode 100644
index 0000000..ae050fe
--- /dev/null
+++ b/dist2/src/pcre2_context.c
@@ -0,0 +1,391 @@
+/*************************************************
+*      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
+     Original API code Copyright (c) 1997-2012 University of Cambridge
+         New API code Copyright (c) 2016 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.
+-----------------------------------------------------------------------------
+*/
+
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "pcre2_internal.h"
+
+
+
+/*************************************************
+*          Default malloc/free functions         *
+*************************************************/
+
+/* Ignore the "user data" argument in each case. */
+
+static void *default_malloc(size_t size, void *data)
+{
+(void)data;
+return malloc(size);
+}
+
+
+static void default_free(void *block, void *data)
+{
+(void)data;
+free(block);
+}
+
+
+
+/*************************************************
+*        Get a block and save memory control     *
+*************************************************/
+
+/* This internal function is called to get a block of memory in which the
+memory control data is to be stored at the start for future use.
+
+Arguments:
+  size        amount of memory required
+  memctl      pointer to a memctl block or NULL
+
+Returns:      pointer to memory or NULL on failure
+*/
+
+extern void *
+PRIV(memctl_malloc)(size_t size, pcre2_memctl *memctl)
+{
+pcre2_memctl *newmemctl;
+void *yield = (memctl == NULL)? malloc(size) :
+  memctl->malloc(size, memctl->memory_data);
+if (yield == NULL) return NULL;
+newmemctl = (pcre2_memctl *)yield;
+if (memctl == NULL)
+  {
+  newmemctl->malloc = default_malloc;
+  newmemctl->free = default_free;
+  newmemctl->memory_data = NULL;
+  }
+else *newmemctl = *memctl;
+return yield;
+}
+
+
+
+/*************************************************
+*          Create and initialize contexts        *
+*************************************************/
+
+/* Initializing for compile and match contexts is done in separate, private
+functions so that these can be called from functions such as pcre2_compile()
+when an external context is not supplied. The initializing functions have an
+option to set up default memory management. */
+
+PCRE2_EXP_DEFN pcre2_general_context * PCRE2_CALL_CONVENTION
+pcre2_general_context_create(void *(*private_malloc)(size_t, void *),
+  void (*private_free)(void *, void *), void *memory_data)
+{
+pcre2_general_context *gcontext;
+if (private_malloc == NULL) private_malloc = default_malloc;
+if (private_free == NULL) private_free = default_free;
+gcontext = private_malloc(sizeof(pcre2_real_general_context), memory_data);
+if (gcontext == NULL) return NULL;
+gcontext->memctl.malloc = private_malloc;
+gcontext->memctl.free = private_free;
+gcontext->memctl.memory_data = memory_data;
+return gcontext;
+}
+
+
+/* A default compile context is set up to save having to initialize at run time
+when no context is supplied to the compile function. */
+
+const pcre2_compile_context PRIV(default_compile_context) = {
+  { default_malloc, default_free, NULL },    /* Default memory handling */
+  NULL,                                      /* Stack guard */
+  NULL,                                      /* Stack guard data */
+  PRIV(default_tables),                      /* Character tables */
+  PCRE2_UNSET,                               /* Max pattern length */
+  BSR_DEFAULT,                               /* Backslash R default */
+  NEWLINE_DEFAULT,                           /* Newline convention */
+  PARENS_NEST_LIMIT };                       /* As it says */
+
+/* The create function copies the default into the new memory, but must
+override the default memory handling functions if a gcontext was provided. */
+
+PCRE2_EXP_DEFN pcre2_compile_context * PCRE2_CALL_CONVENTION
+pcre2_compile_context_create(pcre2_general_context *gcontext)
+{
+pcre2_compile_context *ccontext = PRIV(memctl_malloc)(
+  sizeof(pcre2_real_compile_context), (pcre2_memctl *)gcontext);
+if (ccontext == NULL) return NULL;
+*ccontext = PRIV(default_compile_context);
+if (gcontext != NULL)
+  *((pcre2_memctl *)ccontext) = *((pcre2_memctl *)gcontext);
+return ccontext;
+}
+
+
+/* A default match context is set up to save having to initialize at run time
+when no context is supplied to a match function. */
+
+const pcre2_match_context PRIV(default_match_context) = {
+  { default_malloc, default_free, NULL },
+#ifdef HEAP_MATCH_RECURSE
+  { default_malloc, default_free, NULL },
+#endif
+#ifdef SUPPORT_JIT
+  NULL,
+  NULL,
+#endif
+  NULL,
+  NULL,
+  PCRE2_UNSET,   /* Offset limit */
+  MATCH_LIMIT,
+  MATCH_LIMIT_RECURSION };
+
+/* The create function copies the default into the new memory, but must
+override the default memory handling functions if a gcontext was provided. */
+
+PCRE2_EXP_DEFN pcre2_match_context * PCRE2_CALL_CONVENTION
+pcre2_match_context_create(pcre2_general_context *gcontext)
+{
+pcre2_match_context *mcontext = PRIV(memctl_malloc)(
+  sizeof(pcre2_real_match_context), (pcre2_memctl *)gcontext);
+if (mcontext == NULL) return NULL;
+*mcontext = PRIV(default_match_context);
+if (gcontext != NULL)
+  *((pcre2_memctl *)mcontext) = *((pcre2_memctl *)gcontext);
+return mcontext;
+}
+
+
+/*************************************************
+*              Context copy functions            *
+*************************************************/
+
+PCRE2_EXP_DEFN pcre2_general_context * PCRE2_CALL_CONVENTION
+pcre2_general_context_copy(pcre2_general_context *gcontext)
+{
+pcre2_general_context *new =
+  gcontext->memctl.malloc(sizeof(pcre2_real_general_context),
+  gcontext->memctl.memory_data);
+if (new == NULL) return NULL;
+memcpy(new, gcontext, sizeof(pcre2_real_general_context));
+return new;
+}
+
+
+PCRE2_EXP_DEFN pcre2_compile_context * PCRE2_CALL_CONVENTION
+pcre2_compile_context_copy(pcre2_compile_context *ccontext)
+{
+pcre2_compile_context *new =
+  ccontext->memctl.malloc(sizeof(pcre2_real_compile_context),
+  ccontext->memctl.memory_data);
+if (new == NULL) return NULL;
+memcpy(new, ccontext, sizeof(pcre2_real_compile_context));
+return new;
+}
+
+
+PCRE2_EXP_DEFN pcre2_match_context * PCRE2_CALL_CONVENTION
+pcre2_match_context_copy(pcre2_match_context *mcontext)
+{
+pcre2_match_context *new =
+  mcontext->memctl.malloc(sizeof(pcre2_real_match_context),
+  mcontext->memctl.memory_data);
+if (new == NULL) return NULL;
+memcpy(new, mcontext, sizeof(pcre2_real_match_context));
+return new;
+}
+
+
+
+/*************************************************
+*              Context free functions            *
+*************************************************/
+
+
+PCRE2_EXP_DEFN void PCRE2_CALL_CONVENTION
+pcre2_general_context_free(pcre2_general_context *gcontext)
+{
+if (gcontext != NULL)
+  gcontext->memctl.free(gcontext, gcontext->memctl.memory_data);
+}
+
+
+PCRE2_EXP_DEFN void PCRE2_CALL_CONVENTION
+pcre2_compile_context_free(pcre2_compile_context *ccontext)
+{
+if (ccontext != NULL)
+  ccontext->memctl.free(ccontext, ccontext->memctl.memory_data);
+}
+
+
+PCRE2_EXP_DEFN void PCRE2_CALL_CONVENTION
+pcre2_match_context_free(pcre2_match_context *mcontext)
+{
+if (mcontext != NULL)
+  mcontext->memctl.free(mcontext, mcontext->memctl.memory_data);
+}
+
+
+
+
+/*************************************************
+*             Set values in contexts             *
+*************************************************/
+
+/* All these functions return 0 for success or PCRE2_ERROR_BADDATA if invalid
+data is given. Only some of the functions are able to test the validity of the
+data. */
+
+
+/* ------------ Compile contexts ------------ */
+
+PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION
+pcre2_set_character_tables(pcre2_compile_context *ccontext,
+  const unsigned char *tables)
+{
+ccontext->tables = tables;
+return 0;
+}
+
+PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION
+pcre2_set_bsr(pcre2_compile_context *ccontext, uint32_t value)
+{
+switch(value)
+  {
+  case PCRE2_BSR_ANYCRLF:
+  case PCRE2_BSR_UNICODE:
+  ccontext->bsr_convention = value;
+  return 0;
+
+  default:
+  return PCRE2_ERROR_BADDATA;
+  }
+}
+
+PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION
+pcre2_set_max_pattern_length(pcre2_compile_context *ccontext, PCRE2_SIZE length)
+{
+ccontext->max_pattern_length = length;
+return 0;
+}
+
+PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION
+pcre2_set_newline(pcre2_compile_context *ccontext, uint32_t newline)
+{
+switch(newline)
+  {
+  case PCRE2_NEWLINE_CR:
+  case PCRE2_NEWLINE_LF:
+  case PCRE2_NEWLINE_CRLF:
+  case PCRE2_NEWLINE_ANY:
+  case PCRE2_NEWLINE_ANYCRLF:
+  ccontext->newline_convention = newline;
+  return 0;
+
+  default:
+  return PCRE2_ERROR_BADDATA;
+  }
+}
+
+PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION
+pcre2_set_parens_nest_limit(pcre2_compile_context *ccontext, uint32_t limit)
+{
+ccontext->parens_nest_limit = limit;
+return 0;
+}
+
+PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION
+pcre2_set_compile_recursion_guard(pcre2_compile_context *ccontext,
+  int (*guard)(uint32_t, void *), void *user_data)
+{
+ccontext->stack_guard = guard;
+ccontext->stack_guard_data = user_data;
+return 0;
+}
+
+
+/* ------------ Match contexts ------------ */
+
+PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION
+pcre2_set_callout(pcre2_match_context *mcontext,
+  int (*callout)(pcre2_callout_block *, void *), void *callout_data)
+{
+mcontext->callout = callout;
+mcontext->callout_data = callout_data;
+return 0;
+}
+
+PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION
+pcre2_set_match_limit(pcre2_match_context *mcontext, uint32_t limit)
+{
+mcontext->match_limit = limit;
+return 0;
+}
+
+PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION
+pcre2_set_offset_limit(pcre2_match_context *mcontext, PCRE2_SIZE limit)
+{
+mcontext->offset_limit = limit;
+return 0;
+}
+
+PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION
+pcre2_set_recursion_limit(pcre2_match_context *mcontext, uint32_t limit)
+{
+mcontext->recursion_limit = limit;
+return 0;
+}
+
+PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION
+pcre2_set_recursion_memory_management(pcre2_match_context *mcontext,
+  void *(*mymalloc)(size_t, void *), void (*myfree)(void *, void *),
+  void *mydata)
+{
+#ifdef HEAP_MATCH_RECURSE
+mcontext->stack_memctl.malloc = mymalloc;
+mcontext->stack_memctl.free = myfree;
+mcontext->stack_memctl.memory_data = mydata;
+#else
+(void)mcontext;
+(void)mymalloc;
+(void)myfree;
+(void)mydata;
+#endif
+return 0;
+}
+
+/* End of pcre2_context.c */
diff --git a/dist/pcre_dfa_exec.c b/dist2/src/pcre2_dfa_match.c
similarity index 75%
rename from dist/pcre_dfa_exec.c
rename to dist2/src/pcre2_dfa_match.c
index 170ce6a..76bc085 100644
--- a/dist/pcre_dfa_exec.c
+++ b/dist2/src/pcre2_dfa_match.c
@@ -3,11 +3,11 @@
 *************************************************/
 
 /* 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 (but see
-below for why this module is different).
+and semantics are as close as possible to those of the Perl 5 language.
 
                        Written by Philip Hazel
-           Copyright (c) 1997-2014 University of Cambridge
+     Original API code Copyright (c) 1997-2012 University of Cambridge
+         New API code Copyright (c) 2016 University of Cambridge
 
 -----------------------------------------------------------------------------
 Redistribution and use in source and binary forms, with or without
@@ -38,7 +38,8 @@
 -----------------------------------------------------------------------------
 */
 
-/* This module contains the external function pcre_dfa_exec(), which is an
+
+/* This module contains the external function pcre2_dfa_match(), which is an
 alternative matching function that uses a sort of DFA algorithm (not a true
 FSM). This is NOT Perl-compatible, but it has advantages in certain
 applications. */
@@ -64,28 +65,27 @@
 pattern for certain subject strings, but on other strings and on many of the
 simpler patterns in the test suite it did worse. The major problem, I think,
 was the extra time to initialize the index. This had to be done for each call
-of internal_dfa_exec(). (The supplied patch used a static vector, initialized
+of internal_dfa_match(). (The supplied patch used a static vector, initialized
 only once - I suspect this was the cause of the problems with the tests.)
 
 Overall, I concluded that the gains in some cases did not outweigh the losses
 in others, so I abandoned this code. */
 
 
-
 #ifdef HAVE_CONFIG_H
 #include "config.h"
 #endif
 
-#define NLBLOCK md             /* Block containing newline information */
+#define NLBLOCK mb             /* Block containing newline information */
 #define PSSTART start_subject  /* Field containing processed string start */
 #define PSEND   end_subject    /* Field containing processed string end */
 
-#include "pcre_internal.h"
+#include "pcre2_internal.h"
 
-
-/* For use to indent debugging output */
-
-#define SP "                   "
+#define PUBLIC_DFA_MATCH_OPTIONS \
+  (PCRE2_ANCHORED|PCRE2_NOTBOL|PCRE2_NOTEOL|PCRE2_NOTEMPTY| \
+   PCRE2_NOTEMPTY_ATSTART|PCRE2_NO_UTF_CHECK|PCRE2_PARTIAL_HARD| \
+   PCRE2_PARTIAL_SOFT|PCRE2_DFA_SHORTEST|PCRE2_DFA_RESTART)
 
 
 /*************************************************
@@ -112,7 +112,7 @@
 the character is to be found. ***NOTE*** If the start of this table is
 modified, the three tables that follow must also be modified. */
 
-static const pcre_uint8 coptable[] = {
+static const uint8_t coptable[] = {
   0,                             /* End                                    */
   0, 0, 0, 0, 0,                 /* \A, \G, \K, \B, \b                     */
   0, 0, 0, 0, 0, 0,              /* \D, \d, \S, \s, \W, \w                 */
@@ -161,6 +161,7 @@
   0,                             /* DNREFI                                 */
   0,                             /* RECURSE                                */
   0,                             /* CALLOUT                                */
+  0,                             /* CALLOUT_STR                            */
   0,                             /* Alt                                    */
   0,                             /* Ket                                    */
   0,                             /* KetRmax                                */
@@ -176,12 +177,12 @@
   0, 0, 0, 0, 0,                 /* SBRA, SBRAPOS, SCBRA, SCBRAPOS, SCOND  */
   0, 0,                          /* CREF, DNCREF                           */
   0, 0,                          /* RREF, DNRREF                           */
-  0,                             /* DEF                                    */
+  0, 0,                          /* FALSE, TRUE                            */
   0, 0, 0,                       /* BRAZERO, BRAMINZERO, BRAPOSZERO        */
   0, 0, 0,                       /* MARK, PRUNE, PRUNE_ARG                 */
   0, 0, 0, 0,                    /* SKIP, SKIP_ARG, THEN, THEN_ARG         */
   0, 0, 0, 0,                    /* COMMIT, FAIL, ACCEPT, ASSERT_ACCEPT    */
-  0, 0                           /* CLOSE, SKIPZERO  */
+  0, 0, 0                        /* CLOSE, SKIPZERO, DEFINE                */
 };
 
 /* This table identifies those opcodes that inspect a character. It is used to
@@ -189,7 +190,7 @@
 the subject is reached. ***NOTE*** If the start of this table is modified, the
 two tables that follow must also be modified. */
 
-static const pcre_uint8 poptable[] = {
+static const uint8_t poptable[] = {
   0,                             /* End                                    */
   0, 0, 0, 1, 1,                 /* \A, \G, \K, \B, \b                     */
   1, 1, 1, 1, 1, 1,              /* \D, \d, \S, \s, \W, \w                 */
@@ -233,6 +234,7 @@
   0,                             /* DNREFI                                 */
   0,                             /* RECURSE                                */
   0,                             /* CALLOUT                                */
+  0,                             /* CALLOUT_STR                            */
   0,                             /* Alt                                    */
   0,                             /* Ket                                    */
   0,                             /* KetRmax                                */
@@ -248,18 +250,18 @@
   0, 0, 0, 0, 0,                 /* SBRA, SBRAPOS, SCBRA, SCBRAPOS, SCOND  */
   0, 0,                          /* CREF, DNCREF                           */
   0, 0,                          /* RREF, DNRREF                           */
-  0,                             /* DEF                                    */
+  0, 0,                          /* FALSE, TRUE                            */
   0, 0, 0,                       /* BRAZERO, BRAMINZERO, BRAPOSZERO        */
   0, 0, 0,                       /* MARK, PRUNE, PRUNE_ARG                 */
   0, 0, 0, 0,                    /* SKIP, SKIP_ARG, THEN, THEN_ARG         */
   0, 0, 0, 0,                    /* COMMIT, FAIL, ACCEPT, ASSERT_ACCEPT    */
-  0, 0                           /* CLOSE, SKIPZERO                        */
+  0, 0, 0                        /* CLOSE, SKIPZERO, DEFINE                */
 };
 
 /* These 2 tables allow for compact code for testing for \D, \d, \S, \s, \W,
 and \w */
 
-static const pcre_uint8 toptable1[] = {
+static const uint8_t toptable1[] = {
   0, 0, 0, 0, 0, 0,
   ctype_digit, ctype_digit,
   ctype_space, ctype_space,
@@ -267,7 +269,7 @@
   0, 0                            /* OP_ANY, OP_ALLANY */
 };
 
-static const pcre_uint8 toptable2[] = {
+static const uint8_t toptable2[] = {
   0, 0, 0, 0, 0, 0,
   ctype_digit, 0,
   ctype_space, 0,
@@ -282,7 +284,7 @@
 these structures in, is a vector of ints. */
 
 typedef struct stateblock {
-  int offset;                     /* Offset to opcode */
+  int offset;                     /* Offset to opcode (-ve has meaning) */
   int count;                      /* Count for repeats */
   int data;                       /* Some use extra data */
 } stateblock;
@@ -290,39 +292,9 @@
 #define INTS_PER_STATEBLOCK  (int)(sizeof(stateblock)/sizeof(int))
 
 
-#ifdef PCRE_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(const pcre_uchar *p, int length, FILE *f)
-{
-pcre_uint32 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   *
+*     Match a Regular Expression - DFA engine    *
 *************************************************/
 
 /* This internal function applies a compiled pattern to a subject string,
@@ -331,7 +303,7 @@
 function calls itself recursively for some kinds of subpattern.
 
 Arguments:
-  md                the match_data block with fixed information
+  mb                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
@@ -355,9 +327,8 @@
     next_active_state->offset = (x); \
     next_active_state->count  = (y); \
     next_active_state++; \
-    DPRINTF(("%.*sADD_ACTIVE(%d,%d)\n", rlevel*2-2, SP, (x), (y))); \
     } \
-  else return PCRE_ERROR_DFA_WSSIZE
+  else return PCRE2_ERROR_DFA_WSSIZE
 
 #define ADD_ACTIVE_DATA(x,y,z) \
   if (active_count++ < wscount) \
@@ -366,9 +337,8 @@
     next_active_state->count  = (y); \
     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
+  else return PCRE2_ERROR_DFA_WSSIZE
 
 #define ADD_NEW(x,y) \
   if (new_count++ < wscount) \
@@ -376,9 +346,8 @@
     next_new_state->offset = (x); \
     next_new_state->count  = (y); \
     next_new_state++; \
-    DPRINTF(("%.*sADD_NEW(%d,%d)\n", rlevel*2-2, SP, (x), (y))); \
     } \
-  else return PCRE_ERROR_DFA_WSSIZE
+  else return PCRE2_ERROR_DFA_WSSIZE
 
 #define ADD_NEW_DATA(x,y,z) \
   if (new_count++ < wscount) \
@@ -387,21 +356,19 @@
     next_new_state->count  = (y); \
     next_new_state->data   = (z); \
     next_new_state++; \
-    DPRINTF(("%.*sADD_NEW_DATA(%d,%d,%d) line %d\n", rlevel*2-2, SP, \
-      (x), (y), (z), __LINE__)); \
     } \
-  else return PCRE_ERROR_DFA_WSSIZE
+  else return PCRE2_ERROR_DFA_WSSIZE
 
 /* And now, here is the code */
 
 static int
-internal_dfa_exec(
-  dfa_match_data *md,
-  const pcre_uchar *this_start_code,
-  const pcre_uchar *current_subject,
-  int start_offset,
-  int *offsets,
-  int offsetcount,
+internal_dfa_match(
+  dfa_match_block *mb,
+  PCRE2_SPTR this_start_code,
+  PCRE2_SPTR current_subject,
+  PCRE2_SIZE start_offset,
+  PCRE2_SIZE *offsets,
+  uint32_t offsetcount,
   int *workspace,
   int wscount,
   int  rlevel)
@@ -409,23 +376,24 @@
 stateblock *active_states, *new_states, *temp_states;
 stateblock *next_active_state, *next_new_state;
 
-const pcre_uint8 *ctypes, *lcc, *fcc;
-const pcre_uchar *ptr;
-const pcre_uchar *end_code, *first_op;
+const uint8_t *ctypes, *lcc, *fcc;
+PCRE2_SPTR ptr;
+PCRE2_SPTR end_code;
+PCRE2_SPTR first_op;
 
 dfa_recursion_info new_recursive;
 
 int active_count, new_count, match_count;
 
-/* Some fields in the md block are frequently referenced, so we load them into
+/* Some fields in the mb block are frequently referenced, so we load them into
 independent variables in the hope that this will perform better. */
 
-const pcre_uchar *start_subject = md->start_subject;
-const pcre_uchar *end_subject = md->end_subject;
-const pcre_uchar *start_code = md->start_code;
+PCRE2_SPTR start_subject = mb->start_subject;
+PCRE2_SPTR end_subject = mb->end_subject;
+PCRE2_SPTR start_code = mb->start_code;
 
-#ifdef SUPPORT_UTF
-BOOL utf = (md->poptions & PCRE_UTF8) != 0;
+#ifdef SUPPORT_UNICODE
+BOOL utf = (mb->poptions & PCRE2_UTF) != 0;
 #else
 BOOL utf = FALSE;
 #endif
@@ -439,15 +407,11 @@
 wscount = (wscount - (wscount % (INTS_PER_STATEBLOCK * 2))) /
           (2 * INTS_PER_STATEBLOCK);
 
-DPRINTF(("\n%.*s---------------------\n"
-  "%.*sCall to internal_dfa_exec f=%d\n",
-  rlevel*2-2, SP, rlevel*2-2, SP, rlevel));
+ctypes = mb->tables + ctypes_offset;
+lcc = mb->tables + lcc_offset;
+fcc = mb->tables + fcc_offset;
 
-ctypes = md->tables + ctypes_offset;
-lcc = md->tables + lcc_offset;
-fcc = md->tables + fcc_offset;
-
-match_count = PCRE_ERROR_NOMATCH;   /* A negative number */
+match_count = PCRE2_ERROR_NOMATCH;   /* A negative number */
 
 active_states = (stateblock *)(workspace + 2);
 next_new_state = new_states = active_states + wscount;
@@ -469,13 +433,13 @@
 
 if (*first_op == OP_REVERSE)
   {
-  int max_back = 0;
-  int gone_back;
+  size_t max_back = 0;
+  size_t gone_back;
 
   end_code = this_start_code;
   do
     {
-    int back = GET(end_code, 2+LINK_SIZE);
+    size_t back = GET(end_code, 2+LINK_SIZE);
     if (back > max_back) max_back = back;
     end_code += GET(end_code, 1);
     }
@@ -484,7 +448,7 @@
   /* 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_UTF
+#ifdef SUPPORT_UNICODE
   /* In character mode we have to step back character by character */
 
   if (utf)
@@ -502,22 +466,22 @@
   /* In byte-mode we can do this quickly. */
 
     {
-    gone_back = (current_subject - max_back < start_subject)?
-      (int)(current_subject - start_subject) : max_back;
+    size_t current_offset = (size_t)(current_subject - start_subject);
+    gone_back = (current_offset < max_back)? current_offset : max_back;
     current_subject -= gone_back;
     }
 
   /* Save the earliest consulted character */
 
-  if (current_subject < md->start_used_ptr)
-    md->start_used_ptr = current_subject;
+  if (current_subject < mb->start_used_ptr)
+    mb->start_used_ptr = current_subject;
 
   /* Now we can process the individual branches. */
 
   end_code = this_start_code;
   do
     {
-    int back = GET(end_code, 2+LINK_SIZE);
+    size_t back = GET(end_code, 2+LINK_SIZE);
     if (back <= gone_back)
       {
       int bstate = (int)(end_code - start_code + 2 + 2*LINK_SIZE);
@@ -540,7 +504,7 @@
 
   /* Restarting */
 
-  if (rlevel == 1 && (md->moptions & PCRE_DFA_RESTART) != 0)
+  if (rlevel == 1 && (mb->moptions & PCRE2_DFA_RESTART) != 0)
     {
     do { end_code += GET(end_code, 1); } while (*end_code == OP_ALT);
     new_count = workspace[1];
@@ -568,8 +532,6 @@
 
 workspace[0] = 0;    /* Bit indicating which vector is current */
 
-DPRINTF(("%.*sEnd state = %d\n", rlevel*2-2, SP, (int)(end_code - start_code)));
-
 /* Loop for scanning the subject */
 
 ptr = current_subject;
@@ -577,12 +539,14 @@
   {
   int i, j;
   int clen, dlen;
-  pcre_uint32 c, d;
+  uint32_t c, d;
   int forced_fail = 0;
   BOOL partial_newline = FALSE;
   BOOL could_continue = reset_could_continue;
   reset_could_continue = FALSE;
 
+  if (ptr > mb->last_used_ptr) mb->last_used_ptr = ptr;
+
   /* Make the new state list into the active state list and empty the
   new state list. */
 
@@ -595,17 +559,6 @@
   workspace[0] ^= 1;              /* Remember for the restarting feature */
   workspace[1] = active_count;
 
-#ifdef PCRE_DEBUG
-  printf("%.*sNext character: rest of subject = \"", rlevel*2-2, SP);
-  pchars(ptr, STRLEN_UC(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;
@@ -618,11 +571,11 @@
   if (ptr < end_subject)
     {
     clen = 1;        /* Number of data items in the character */
-#ifdef SUPPORT_UTF
+#ifdef SUPPORT_UNICODE
     GETCHARLENTEST(c, ptr, clen);
 #else
     c = *ptr;
-#endif  /* SUPPORT_UTF */
+#endif  /* SUPPORT_UNICODE */
     }
   else
     {
@@ -639,18 +592,11 @@
     {
     stateblock *current_state = active_states + i;
     BOOL caseless = FALSE;
-    const pcre_uchar *code;
+    PCRE2_SPTR code;
     int state_offset = current_state->offset;
     int codevalue, rrc;
     int count;
 
-#ifdef PCRE_DEBUG
-    printf ("%.*sProcessing state %d c=", rlevel*2-2, SP, state_offset);
-    if (clen == 0) printf("EOL\n");
-      else if (c > 32 && c < 127) printf("'%c'\n", c);
-        else printf("0x%02x\n", c);
-#endif
-
     /* 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 the could_continue flag was passed over from a previous
@@ -660,7 +606,6 @@
       {
       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);
         if (could_continue) reset_could_continue = TRUE;
@@ -680,10 +625,7 @@
       {
       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 */
@@ -711,15 +653,15 @@
     if (coptable[codevalue] > 0)
       {
       dlen = 1;
-#ifdef SUPPORT_UTF
+#ifdef SUPPORT_UNICODE
       if (utf) { GETCHARLEN(d, (code + coptable[codevalue]), dlen); } else
-#endif  /* SUPPORT_UTF */
+#endif  /* SUPPORT_UNICODE */
       d = code[coptable[codevalue]];
       if (codevalue >= OP_TYPESTAR)
         {
         switch(d)
           {
-          case OP_ANYBYTE: return PCRE_ERROR_DFA_UITEM;
+          case OP_ANYBYTE: return PCRE2_ERROR_DFA_UITEM;
           case OP_NOTPROP:
           case OP_PROP: codevalue += OP_PROP_EXTRA; break;
           case OP_ANYNL: codevalue += OP_ANYNL_EXTRA; break;
@@ -764,7 +706,7 @@
       using recursive calls. Thus, it never adds any new states.
 
       At the end of the (sub)pattern, unless we have an empty string and
-      PCRE_NOTEMPTY is set, or PCRE_NOTEMPTY_ATSTART is set and we are at the
+      PCRE2_NOTEMPTY is set, or PCRE2_NOTEMPTY_ATSTART is set and we are at the
       start of the subject, save the match data, shifting up all previous
       matches so we always have the longest first. */
 
@@ -783,29 +725,21 @@
       else
         {
         if (ptr > current_subject ||
-            ((md->moptions & PCRE_NOTEMPTY) == 0 &&
-              ((md->moptions & PCRE_NOTEMPTY_ATSTART) == 0 ||
-                current_subject > start_subject + md->start_offset)))
+            ((mb->moptions & PCRE2_NOTEMPTY) == 0 &&
+              ((mb->moptions & PCRE2_NOTEMPTY_ATSTART) == 0 ||
+                current_subject > start_subject + mb->start_offset)))
           {
           if (match_count < 0) match_count = (offsetcount >= 2)? 1 : 0;
-            else if (match_count > 0 && ++match_count * 2 > offsetcount)
+            else if (match_count > 0 && ++match_count * 2 > (int)offsetcount)
               match_count = 0;
-          count = ((match_count == 0)? offsetcount : match_count * 2) - 2;
-          if (count > 0) memmove(offsets + 2, offsets, count * sizeof(int));
+          count = ((match_count == 0)? (int)offsetcount : match_count * 2) - 2;
+          if (count > 0) memmove(offsets + 2, offsets, count * sizeof(PCRE2_SIZE));
           if (offsetcount >= 2)
             {
             offsets[0] = (int)(current_subject - start_subject);
             offsets[1] = (int)(ptr - start_subject);
-            DPRINTF(("%.*sSet matched string = \"%.*s\"\n", rlevel*2-2, SP,
-              offsets[1] - offsets[0], (char *)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;
-            }
+          if ((mb->moptions & PCRE2_DFA_SHORTEST) != 0) return match_count;
           }
         }
       break;
@@ -861,14 +795,15 @@
 
       /*-----------------------------------------------------------------*/
       case OP_CIRC:
-      if (ptr == start_subject && (md->moptions & PCRE_NOTBOL) == 0)
+      if (ptr == start_subject && (mb->moptions & PCRE2_NOTBOL) == 0)
         { ADD_ACTIVE(state_offset + 1, 0); }
       break;
 
       /*-----------------------------------------------------------------*/
       case OP_CIRCM:
-      if ((ptr == start_subject && (md->moptions & PCRE_NOTBOL) == 0) ||
-          (ptr != end_subject && WAS_NEWLINE(ptr)))
+      if ((ptr == start_subject && (mb->moptions & PCRE2_NOTBOL) == 0) ||
+          ((ptr != end_subject || (mb->poptions & PCRE2_ALT_CIRCUMFLEX) != 0 )
+            && WAS_NEWLINE(ptr)))
         { ADD_ACTIVE(state_offset + 1, 0); }
       break;
 
@@ -876,7 +811,7 @@
       case OP_EOD:
       if (ptr >= end_subject)
         {
-        if ((md->moptions & PCRE_PARTIAL_HARD) != 0)
+        if ((mb->moptions & PCRE2_PARTIAL_HARD) != 0)
           could_continue = TRUE;
         else { ADD_ACTIVE(state_offset + 1, 0); }
         }
@@ -903,8 +838,8 @@
       case OP_ANY:
       if (clen > 0 && !IS_NEWLINE(ptr))
         {
-        if (ptr + 1 >= md->end_subject &&
-            (md->moptions & (PCRE_PARTIAL_HARD)) != 0 &&
+        if (ptr + 1 >= mb->end_subject &&
+            (mb->moptions & (PCRE2_PARTIAL_HARD)) != 0 &&
             NLBLOCK->nltype == NLTYPE_FIXED &&
             NLBLOCK->nllen == 2 &&
             c == NLBLOCK->nl[0])
@@ -926,30 +861,30 @@
 
       /*-----------------------------------------------------------------*/
       case OP_EODN:
-      if (clen == 0 && (md->moptions & PCRE_PARTIAL_HARD) != 0)
+      if (clen == 0 && (mb->moptions & PCRE2_PARTIAL_HARD) != 0)
         could_continue = TRUE;
-      else if (clen == 0 || (IS_NEWLINE(ptr) && ptr == end_subject - md->nllen))
+      else if (clen == 0 || (IS_NEWLINE(ptr) && ptr == end_subject - mb->nllen))
         { ADD_ACTIVE(state_offset + 1, 0); }
       break;
 
       /*-----------------------------------------------------------------*/
       case OP_DOLL:
-      if ((md->moptions & PCRE_NOTEOL) == 0)
+      if ((mb->moptions & PCRE2_NOTEOL) == 0)
         {
-        if (clen == 0 && (md->moptions & PCRE_PARTIAL_HARD) != 0)
+        if (clen == 0 && (mb->moptions & PCRE2_PARTIAL_HARD) != 0)
           could_continue = TRUE;
         else if (clen == 0 ||
-            ((md->poptions & PCRE_DOLLAR_ENDONLY) == 0 && IS_NEWLINE(ptr) &&
-               (ptr == end_subject - md->nllen)
+            ((mb->poptions & PCRE2_DOLLAR_ENDONLY) == 0 && IS_NEWLINE(ptr) &&
+               (ptr == end_subject - mb->nllen)
             ))
           { ADD_ACTIVE(state_offset + 1, 0); }
-        else if (ptr + 1 >= md->end_subject &&
-                 (md->moptions & (PCRE_PARTIAL_HARD|PCRE_PARTIAL_SOFT)) != 0 &&
+        else if (ptr + 1 >= mb->end_subject &&
+                 (mb->moptions & (PCRE2_PARTIAL_HARD|PCRE2_PARTIAL_SOFT)) != 0 &&
                  NLBLOCK->nltype == NLTYPE_FIXED &&
                  NLBLOCK->nllen == 2 &&
                  c == NLBLOCK->nl[0])
           {
-          if ((md->moptions & PCRE_PARTIAL_HARD) != 0)
+          if ((mb->moptions & PCRE2_PARTIAL_HARD) != 0)
             {
             reset_could_continue = TRUE;
             ADD_NEW_DATA(-(state_offset + 1), 0, 1);
@@ -961,20 +896,20 @@
 
       /*-----------------------------------------------------------------*/
       case OP_DOLLM:
-      if ((md->moptions & PCRE_NOTEOL) == 0)
+      if ((mb->moptions & PCRE2_NOTEOL) == 0)
         {
-        if (clen == 0 && (md->moptions & PCRE_PARTIAL_HARD) != 0)
+        if (clen == 0 && (mb->moptions & PCRE2_PARTIAL_HARD) != 0)
           could_continue = TRUE;
         else if (clen == 0 ||
-            ((md->poptions & PCRE_DOLLAR_ENDONLY) == 0 && IS_NEWLINE(ptr)))
+            ((mb->poptions & PCRE2_DOLLAR_ENDONLY) == 0 && IS_NEWLINE(ptr)))
           { ADD_ACTIVE(state_offset + 1, 0); }
-        else if (ptr + 1 >= md->end_subject &&
-                 (md->moptions & (PCRE_PARTIAL_HARD|PCRE_PARTIAL_SOFT)) != 0 &&
+        else if (ptr + 1 >= mb->end_subject &&
+                 (mb->moptions & (PCRE2_PARTIAL_HARD|PCRE2_PARTIAL_SOFT)) != 0 &&
                  NLBLOCK->nltype == NLTYPE_FIXED &&
                  NLBLOCK->nllen == 2 &&
                  c == NLBLOCK->nl[0])
           {
-          if ((md->moptions & PCRE_PARTIAL_HARD) != 0)
+          if ((mb->moptions & PCRE2_PARTIAL_HARD) != 0)
             {
             reset_could_continue = TRUE;
             ADD_NEW_DATA(-(state_offset + 1), 0, 1);
@@ -1013,14 +948,14 @@
 
         if (ptr > start_subject)
           {
-          const pcre_uchar *temp = ptr - 1;
-          if (temp < md->start_used_ptr) md->start_used_ptr = temp;
-#if defined SUPPORT_UTF && !defined COMPILE_PCRE32
+          PCRE2_SPTR temp = ptr - 1;
+          if (temp < mb->start_used_ptr) mb->start_used_ptr = temp;
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
           if (utf) { BACKCHAR(temp); }
 #endif
           GETCHARTEST(d, temp);
-#ifdef SUPPORT_UCP
-          if ((md->poptions & PCRE_UCP) != 0)
+#ifdef SUPPORT_UNICODE
+          if ((mb->poptions & PCRE2_UCP) != 0)
             {
             if (d == '_') left_word = TRUE; else
               {
@@ -1036,8 +971,16 @@
 
         if (clen > 0)
           {
-#ifdef SUPPORT_UCP
-          if ((md->poptions & PCRE_UCP) != 0)
+          if (ptr >= mb->last_used_ptr)
+            {
+            PCRE2_SPTR temp = ptr + 1;
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
+            if (utf) { FORWARDCHARTEST(temp, mb->end_subject); }
+#endif
+            mb->last_used_ptr = temp;
+            }
+#ifdef SUPPORT_UNICODE
+          if ((mb->poptions & PCRE2_UCP) != 0)
             {
             if (c == '_') right_word = TRUE; else
               {
@@ -1062,13 +1005,13 @@
       if the support is in the binary; otherwise a compile-time error occurs.
       */
 
-#ifdef SUPPORT_UCP
+#ifdef SUPPORT_UNICODE
       case OP_PROP:
       case OP_NOTPROP:
       if (clen > 0)
         {
         BOOL OK;
-        const pcre_uint32 *cp;
+        const uint32_t *cp;
         const ucd_record * prop = GET_UCD(c);
         switch(code[1])
           {
@@ -1167,8 +1110,8 @@
       if (count > 0) { ADD_ACTIVE(state_offset + 2, 0); }
       if (clen > 0)
         {
-        if (d == OP_ANY && ptr + 1 >= md->end_subject &&
-            (md->moptions & (PCRE_PARTIAL_HARD)) != 0 &&
+        if (d == OP_ANY && ptr + 1 >= mb->end_subject &&
+            (mb->moptions & (PCRE2_PARTIAL_HARD)) != 0 &&
             NLBLOCK->nltype == NLTYPE_FIXED &&
             NLBLOCK->nllen == 2 &&
             c == NLBLOCK->nl[0])
@@ -1198,8 +1141,8 @@
       ADD_ACTIVE(state_offset + 2, 0);
       if (clen > 0)
         {
-        if (d == OP_ANY && ptr + 1 >= md->end_subject &&
-            (md->moptions & (PCRE_PARTIAL_HARD)) != 0 &&
+        if (d == OP_ANY && ptr + 1 >= mb->end_subject &&
+            (mb->moptions & (PCRE2_PARTIAL_HARD)) != 0 &&
             NLBLOCK->nltype == NLTYPE_FIXED &&
             NLBLOCK->nllen == 2 &&
             c == NLBLOCK->nl[0])
@@ -1228,8 +1171,8 @@
       ADD_ACTIVE(state_offset + 2, 0);
       if (clen > 0)
         {
-        if (d == OP_ANY && ptr + 1 >= md->end_subject &&
-            (md->moptions & (PCRE_PARTIAL_HARD)) != 0 &&
+        if (d == OP_ANY && ptr + 1 >= mb->end_subject &&
+            (mb->moptions & (PCRE2_PARTIAL_HARD)) != 0 &&
             NLBLOCK->nltype == NLTYPE_FIXED &&
             NLBLOCK->nllen == 2 &&
             c == NLBLOCK->nl[0])
@@ -1256,8 +1199,8 @@
       count = current_state->count;  /* Number already matched */
       if (clen > 0)
         {
-        if (d == OP_ANY && ptr + 1 >= md->end_subject &&
-            (md->moptions & (PCRE_PARTIAL_HARD)) != 0 &&
+        if (d == OP_ANY && ptr + 1 >= mb->end_subject &&
+            (mb->moptions & (PCRE2_PARTIAL_HARD)) != 0 &&
             NLBLOCK->nltype == NLTYPE_FIXED &&
             NLBLOCK->nllen == 2 &&
             c == NLBLOCK->nl[0])
@@ -1285,8 +1228,8 @@
       count = current_state->count;  /* Number already matched */
       if (clen > 0)
         {
-        if (d == OP_ANY && ptr + 1 >= md->end_subject &&
-            (md->moptions & (PCRE_PARTIAL_HARD)) != 0 &&
+        if (d == OP_ANY && ptr + 1 >= mb->end_subject &&
+            (mb->moptions & (PCRE2_PARTIAL_HARD)) != 0 &&
             NLBLOCK->nltype == NLTYPE_FIXED &&
             NLBLOCK->nllen == 2 &&
             c == NLBLOCK->nl[0])
@@ -1317,7 +1260,7 @@
       argument. It keeps the code above fast for the other cases. The argument
       is in the d variable. */
 
-#ifdef SUPPORT_UCP
+#ifdef SUPPORT_UNICODE
       case OP_PROP_EXTRA + OP_TYPEPLUS:
       case OP_PROP_EXTRA + OP_TYPEMINPLUS:
       case OP_PROP_EXTRA + OP_TYPEPOSPLUS:
@@ -1326,7 +1269,7 @@
       if (clen > 0)
         {
         BOOL OK;
-        const pcre_uint32 *cp;
+        const uint32_t *cp;
         const ucd_record * prop = GET_UCD(c);
         switch(code[2])
           {
@@ -1427,7 +1370,7 @@
       if (clen > 0)
         {
         int lgb, rgb;
-        const pcre_uchar *nptr = ptr + clen;
+        PCRE2_SPTR nptr = ptr + clen;
         int ncount = 0;
         if (count > 0 && codevalue == OP_EXTUNI_EXTRA + OP_TYPEPOSPLUS)
           {
@@ -1469,7 +1412,7 @@
           case 0x2028:
           case 0x2029:
 #endif  /* Not EBCDIC */
-          if ((md->moptions & PCRE_BSR_ANYCRLF) != 0) break;
+          if (mb->bsr_convention == PCRE2_BSR_ANYCRLF) break;
           goto ANYNL01;
 
           case CHAR_CR:
@@ -1560,7 +1503,7 @@
       break;
 
       /*-----------------------------------------------------------------*/
-#ifdef SUPPORT_UCP
+#ifdef SUPPORT_UNICODE
       case OP_PROP_EXTRA + OP_TYPEQUERY:
       case OP_PROP_EXTRA + OP_TYPEMINQUERY:
       case OP_PROP_EXTRA + OP_TYPEPOSQUERY:
@@ -1578,7 +1521,7 @@
       if (clen > 0)
         {
         BOOL OK;
-        const pcre_uint32 *cp;
+        const uint32_t *cp;
         const ucd_record * prop = GET_UCD(c);
         switch(code[2])
           {
@@ -1688,7 +1631,7 @@
       if (clen > 0)
         {
         int lgb, rgb;
-        const pcre_uchar *nptr = ptr + clen;
+        PCRE2_SPTR nptr = ptr + clen;
         int ncount = 0;
         if (codevalue == OP_EXTUNI_EXTRA + OP_TYPEPOSSTAR ||
             codevalue == OP_EXTUNI_EXTRA + OP_TYPEPOSQUERY)
@@ -1738,7 +1681,7 @@
           case 0x2028:
           case 0x2029:
 #endif  /* Not EBCDIC */
-          if ((md->moptions & PCRE_BSR_ANYCRLF) != 0) break;
+          if (mb->bsr_convention == PCRE2_BSR_ANYCRLF) break;
           goto ANYNL02;
 
           case CHAR_CR:
@@ -1844,7 +1787,7 @@
       break;
 
       /*-----------------------------------------------------------------*/
-#ifdef SUPPORT_UCP
+#ifdef SUPPORT_UNICODE
       case OP_PROP_EXTRA + OP_TYPEEXACT:
       case OP_PROP_EXTRA + OP_TYPEUPTO:
       case OP_PROP_EXTRA + OP_TYPEMINUPTO:
@@ -1855,7 +1798,7 @@
       if (clen > 0)
         {
         BOOL OK;
-        const pcre_uint32 *cp;
+        const uint32_t *cp;
         const ucd_record * prop = GET_UCD(c);
         switch(code[1 + IMM2_SIZE + 1])
           {
@@ -1960,7 +1903,7 @@
       if (clen > 0)
         {
         int lgb, rgb;
-        const pcre_uchar *nptr = ptr + clen;
+        PCRE2_SPTR nptr = ptr + clen;
         int ncount = 0;
         if (codevalue == OP_EXTUNI_EXTRA + OP_TYPEPOSUPTO)
           {
@@ -1978,7 +1921,7 @@
           lgb = rgb;
           nptr += dlen;
           }
-        if (nptr >= end_subject && (md->moptions & PCRE_PARTIAL_HARD) != 0)
+        if (nptr >= end_subject && (mb->moptions & PCRE2_PARTIAL_HARD) != 0)
             reset_could_continue = TRUE;
         if (++count >= (int)GET2(code, 1))
           { ADD_NEW_DATA(-(state_offset + 2 + IMM2_SIZE), 0, ncount); }
@@ -2008,7 +1951,7 @@
           case 0x2028:
           case 0x2029:
 #endif  /* Not EBCDIC */
-          if ((md->moptions & PCRE_BSR_ANYCRLF) != 0) break;
+          if (mb->bsr_convention == PCRE2_BSR_ANYCRLF) break;
           goto ANYNL03;
 
           case CHAR_CR:
@@ -2122,7 +2065,7 @@
       case OP_CHARI:
       if (clen == 0) break;
 
-#ifdef SUPPORT_UTF
+#ifdef SUPPORT_UNICODE
       if (utf)
         {
         if (c == d) { ADD_NEW(state_offset + dlen + 1, 0); } else
@@ -2131,19 +2074,12 @@
           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. */
-#ifdef SUPPORT_UCP
             othercase = UCD_OTHERCASE(c);
-#else
-            othercase = NOTACHAR;
-#endif
-
           if (d == othercase) { ADD_NEW(state_offset + dlen + 1, 0); }
           }
         }
       else
-#endif  /* SUPPORT_UTF */
+#endif  /* SUPPORT_UNICODE */
       /* Not UTF mode */
         {
         if (TABLE_GET(c, lcc, c) == TABLE_GET(d, lcc, d))
@@ -2152,7 +2088,7 @@
       break;
 
 
-#ifdef SUPPORT_UCP
+#ifdef SUPPORT_UNICODE
       /*-----------------------------------------------------------------*/
       /* 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
@@ -2162,7 +2098,7 @@
       if (clen > 0)
         {
         int lgb, rgb;
-        const pcre_uchar *nptr = ptr + clen;
+        PCRE2_SPTR nptr = ptr + clen;
         int ncount = 0;
         lgb = UCD_GRAPHBREAK(c);
         while (nptr < end_subject)
@@ -2175,7 +2111,7 @@
           lgb = rgb;
           nptr += dlen;
           }
-        if (nptr >= end_subject && (md->moptions & PCRE_PARTIAL_HARD) != 0)
+        if (nptr >= end_subject && (mb->moptions & PCRE2_PARTIAL_HARD) != 0)
             reset_could_continue = TRUE;
         ADD_NEW_DATA(-(state_offset + 1), 0, ncount);
         }
@@ -2197,7 +2133,7 @@
         case 0x2028:
         case 0x2029:
 #endif  /* Not EBCDIC */
-        if ((md->moptions & PCRE_BSR_ANYCRLF) != 0) break;
+        if (mb->bsr_convention == PCRE2_BSR_ANYCRLF) break;
 
         case CHAR_LF:
         ADD_NEW(state_offset + 1, 0);
@@ -2207,7 +2143,7 @@
         if (ptr + 1 >= end_subject)
           {
           ADD_NEW(state_offset + 1, 0);
-          if ((md->moptions & PCRE_PARTIAL_HARD) != 0)
+          if ((mb->moptions & PCRE2_PARTIAL_HARD) != 0)
             reset_could_continue = TRUE;
           }
         else if (UCHAR21TEST(ptr + 1) == CHAR_LF)
@@ -2288,15 +2224,11 @@
       if (clen > 0)
         {
         unsigned int otherd;
-#ifdef SUPPORT_UTF
+#ifdef SUPPORT_UNICODE
         if (utf && d >= 128)
-          {
-#ifdef SUPPORT_UCP
           otherd = UCD_OTHERCASE(d);
-#endif  /* SUPPORT_UCP */
-          }
         else
-#endif  /* SUPPORT_UTF */
+#endif  /* SUPPORT_UNICODE */
         otherd = TABLE_GET(d, fcc, d);
         if (c != d && c != otherd)
           { ADD_NEW(state_offset + dlen + 1, 0); }
@@ -2324,18 +2256,14 @@
       if (count > 0) { ADD_ACTIVE(state_offset + dlen + 1, 0); }
       if (clen > 0)
         {
-        pcre_uint32 otherd = NOTACHAR;
+        uint32_t otherd = NOTACHAR;
         if (caseless)
           {
-#ifdef SUPPORT_UTF
+#ifdef SUPPORT_UNICODE
           if (utf && d >= 128)
-            {
-#ifdef SUPPORT_UCP
             otherd = UCD_OTHERCASE(d);
-#endif  /* SUPPORT_UCP */
-            }
           else
-#endif  /* SUPPORT_UTF */
+#endif  /* SUPPORT_UNICODE */
           otherd = TABLE_GET(d, fcc, d);
           }
         if ((c == d || c == otherd) == (codevalue < OP_NOTSTAR))
@@ -2371,18 +2299,14 @@
       ADD_ACTIVE(state_offset + dlen + 1, 0);
       if (clen > 0)
         {
-        pcre_uint32 otherd = NOTACHAR;
+        uint32_t otherd = NOTACHAR;
         if (caseless)
           {
-#ifdef SUPPORT_UTF
+#ifdef SUPPORT_UNICODE
           if (utf && d >= 128)
-            {
-#ifdef SUPPORT_UCP
             otherd = UCD_OTHERCASE(d);
-#endif  /* SUPPORT_UCP */
-            }
           else
-#endif  /* SUPPORT_UTF */
+#endif  /* SUPPORT_UNICODE */
           otherd = TABLE_GET(d, fcc, d);
           }
         if ((c == d || c == otherd) == (codevalue < OP_NOTSTAR))
@@ -2416,18 +2340,14 @@
       ADD_ACTIVE(state_offset + dlen + 1, 0);
       if (clen > 0)
         {
-        pcre_uint32 otherd = NOTACHAR;
+        uint32_t otherd = NOTACHAR;
         if (caseless)
           {
-#ifdef SUPPORT_UTF
+#ifdef SUPPORT_UNICODE
           if (utf && d >= 128)
-            {
-#ifdef SUPPORT_UCP
             otherd = UCD_OTHERCASE(d);
-#endif  /* SUPPORT_UCP */
-            }
           else
-#endif  /* SUPPORT_UTF */
+#endif  /* SUPPORT_UNICODE */
           otherd = TABLE_GET(d, fcc, d);
           }
         if ((c == d || c == otherd) == (codevalue < OP_NOTSTAR))
@@ -2453,18 +2373,14 @@
       count = current_state->count;  /* Number already matched */
       if (clen > 0)
         {
-        pcre_uint32 otherd = NOTACHAR;
+        uint32_t otherd = NOTACHAR;
         if (caseless)
           {
-#ifdef SUPPORT_UTF
+#ifdef SUPPORT_UNICODE
           if (utf && d >= 128)
-            {
-#ifdef SUPPORT_UCP
             otherd = UCD_OTHERCASE(d);
-#endif  /* SUPPORT_UCP */
-            }
           else
-#endif  /* SUPPORT_UTF */
+#endif  /* SUPPORT_UNICODE */
           otherd = TABLE_GET(d, fcc, d);
           }
         if ((c == d || c == otherd) == (codevalue < OP_NOTSTAR))
@@ -2497,18 +2413,14 @@
       count = current_state->count;  /* Number already matched */
       if (clen > 0)
         {
-        pcre_uint32 otherd = NOTACHAR;
+        uint32_t otherd = NOTACHAR;
         if (caseless)
           {
-#ifdef SUPPORT_UTF
+#ifdef SUPPORT_UNICODE
           if (utf && d >= 128)
-            {
-#ifdef SUPPORT_UCP
             otherd = UCD_OTHERCASE(d);
-#endif  /* SUPPORT_UCP */
-            }
           else
-#endif  /* SUPPORT_UTF */
+#endif  /* SUPPORT_UNICODE */
           otherd = TABLE_GET(d, fcc, d);
           }
         if ((c == d || c == otherd) == (codevalue < OP_NOTSTAR))
@@ -2536,18 +2448,18 @@
         {
         BOOL isinclass = FALSE;
         int next_state_offset;
-        const pcre_uchar *ecode;
+        PCRE2_SPTR 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 + 1 + (32 / sizeof(pcre_uchar));
+          ecode = code + 1 + (32 / sizeof(PCRE2_UCHAR));
           if (clen > 0)
             {
             isinclass = (c > 255)? (codevalue == OP_NCLASS) :
-              ((((pcre_uint8 *)(code + 1))[c/8] & (1 << (c&7))) != 0);
+              ((((uint8_t *)(code + 1))[c/8] & (1 << (c&7))) != 0);
             }
           }
 
@@ -2659,25 +2571,25 @@
       case OP_ASSERTBACK:
       case OP_ASSERTBACK_NOT:
         {
+        PCRE2_SPTR endasscode = code + GET(code, 1);
+        PCRE2_SIZE local_offsets[2];
         int rc;
-        int local_offsets[2];
         int local_workspace[1000];
-        const pcre_uchar *endasscode = code + GET(code, 1);
 
         while (*endasscode == OP_ALT) endasscode += GET(endasscode, 1);
 
-        rc = internal_dfa_exec(
-          md,                                   /* static match data */
+        rc = internal_dfa_match(
+          mb,                                   /* static match data */
           code,                                 /* this subexpression's code */
           ptr,                                  /* where we currently are */
           (int)(ptr - start_subject),           /* start offset */
           local_offsets,                        /* offset vector */
-          sizeof(local_offsets)/sizeof(int),    /* size of same */
+          sizeof(local_offsets)/sizeof(PCRE2_SIZE), /* size of same */
           local_workspace,                      /* workspace vector */
           sizeof(local_workspace)/sizeof(int),  /* size of same */
           rlevel);                              /* function recursion level */
 
-        if (rc == PCRE_ERROR_DFA_UITEM) return rc;
+        if (rc == PCRE2_ERROR_DFA_UITEM) return rc;
         if ((rc >= 0) == (codevalue == OP_ASSERT || codevalue == OP_ASSERTBACK))
             { ADD_ACTIVE((int)(endasscode + LINK_SIZE + 1 - start_code), 0); }
         }
@@ -2687,7 +2599,7 @@
       case OP_COND:
       case OP_SCOND:
         {
-        int local_offsets[1000];
+        PCRE2_SIZE local_offsets[1000];
         int local_workspace[1000];
         int codelink = GET(code, 1);
         int condcode;
@@ -2696,35 +2608,48 @@
         is inserted between OP_COND and an assertion condition. This does not
         happen for the other conditions. */
 
-        if (code[LINK_SIZE+1] == OP_CALLOUT)
+        if (code[LINK_SIZE + 1] == OP_CALLOUT
+            || code[LINK_SIZE + 1] == OP_CALLOUT_STR)
           {
+          unsigned int callout_length = (code[LINK_SIZE + 1] == OP_CALLOUT)
+              ? PRIV(OP_lengths)[OP_CALLOUT] : GET(code, 2 + 3*LINK_SIZE);
           rrc = 0;
-          if (PUBL(callout) != NULL)
+          if (mb->callout != NULL)
             {
-            PUBL(callout_block) cb;
-            cb.version          = 1;   /* Version 1 of the callout block */
-            cb.callout_number   = code[LINK_SIZE+2];
-            cb.offset_vector    = offsets;
-#if defined COMPILE_PCRE8
-            cb.subject          = (PCRE_SPTR)start_subject;
-#elif defined COMPILE_PCRE16
-            cb.subject          = (PCRE_SPTR16)start_subject;
-#elif defined COMPILE_PCRE32
-            cb.subject          = (PCRE_SPTR32)start_subject;
-#endif
-            cb.subject_length   = (int)(end_subject - start_subject);
-            cb.start_match      = (int)(current_subject - start_subject);
-            cb.current_position = (int)(ptr - start_subject);
-            cb.pattern_position = GET(code, LINK_SIZE + 3);
-            cb.next_item_length = GET(code, 3 + 2*LINK_SIZE);
+            pcre2_callout_block cb;
+            cb.version          = 1;
             cb.capture_top      = 1;
-            cb.capture_last     = -1;
-            cb.callout_data     = md->callout_data;
+            cb.capture_last     = 0;
+            cb.offset_vector    = offsets;
             cb.mark             = NULL;   /* No (*MARK) support */
-            if ((rrc = (*PUBL(callout))(&cb)) < 0) return rrc;   /* Abandon */
+            cb.subject          = start_subject;
+            cb.subject_length   = (PCRE2_SIZE)(end_subject - start_subject);
+            cb.start_match      = (PCRE2_SIZE)(current_subject - start_subject);
+            cb.current_position = (PCRE2_SIZE)(ptr - start_subject);
+            cb.pattern_position = GET(code, LINK_SIZE + 2);
+            cb.next_item_length = GET(code, LINK_SIZE + 2 + LINK_SIZE);
+
+            if (code[LINK_SIZE + 1] == OP_CALLOUT)
+              {
+              cb.callout_number = code[2 + 3*LINK_SIZE];
+              cb.callout_string_offset = 0;
+              cb.callout_string = NULL;
+              cb.callout_string_length = 0;
+              }
+            else
+              {
+              cb.callout_number = 0;
+              cb.callout_string_offset = GET(code, 2 + 4*LINK_SIZE);
+              cb.callout_string = code + (2 + 5*LINK_SIZE) + 1;
+              cb.callout_string_length =
+                callout_length - (1 + 4*LINK_SIZE) - 2;
+              }
+
+            if ((rrc = (mb->callout)(&cb, mb->callout_data)) < 0)
+              return rrc;   /* Abandon */
             }
           if (rrc > 0) break;                      /* Fail this thread */
-          code += PRIV(OP_lengths)[OP_CALLOUT];    /* Skip callout data */
+          code += callout_length;                  /* Skip callout data */
           }
 
         condcode = code[LINK_SIZE+1];
@@ -2734,14 +2659,19 @@
 
         if (condcode == OP_CREF || condcode == OP_DNCREF ||
             condcode == OP_DNRREF)
-          return PCRE_ERROR_DFA_UCOND;
+          return PCRE2_ERROR_DFA_UCOND;
 
         /* The DEFINE condition is always false, and the assertion (?!) is
         converted to OP_FAIL. */
 
-        if (condcode == OP_DEF || condcode == OP_FAIL)
+        if (condcode == OP_FALSE || condcode == OP_FAIL)
           { ADD_ACTIVE(state_offset + codelink + LINK_SIZE + 1, 0); }
 
+        /* There is also an always-true condition */
+
+        else if (condcode == OP_TRUE)
+          { ADD_ACTIVE(state_offset + LINK_SIZE + 2 + IMM2_SIZE, 0); }
+
         /* The only supported version of OP_RREF is for the value RREF_ANY,
         which means "test if in any recursion". We can't test for specifically
         recursed groups. */
@@ -2749,8 +2679,8 @@
         else if (condcode == OP_RREF)
           {
           int value = GET2(code, LINK_SIZE + 2);
-          if (value != RREF_ANY) return PCRE_ERROR_DFA_UCOND;
-          if (md->recursive != NULL)
+          if (value != RREF_ANY) return PCRE2_ERROR_DFA_UCOND;
+          if (mb->recursive != NULL)
             { ADD_ACTIVE(state_offset + LINK_SIZE + 2 + IMM2_SIZE, 0); }
           else { ADD_ACTIVE(state_offset + codelink + LINK_SIZE + 1, 0); }
           }
@@ -2760,23 +2690,23 @@
         else
           {
           int rc;
-          const pcre_uchar *asscode = code + LINK_SIZE + 1;
-          const pcre_uchar *endasscode = asscode + GET(asscode, 1);
+          PCRE2_SPTR asscode = code + LINK_SIZE + 1;
+          PCRE2_SPTR endasscode = asscode + GET(asscode, 1);
 
           while (*endasscode == OP_ALT) endasscode += GET(endasscode, 1);
 
-          rc = internal_dfa_exec(
-            md,                                   /* fixed match data */
+          rc = internal_dfa_match(
+            mb,                                   /* fixed match data */
             asscode,                              /* this subexpression's code */
             ptr,                                  /* where we currently are */
             (int)(ptr - start_subject),           /* start offset */
             local_offsets,                        /* offset vector */
-            sizeof(local_offsets)/sizeof(int),    /* size of same */
+            sizeof(local_offsets)/sizeof(PCRE2_SIZE), /* size of same */
             local_workspace,                      /* workspace vector */
             sizeof(local_workspace)/sizeof(int),  /* size of same */
             rlevel);                              /* function recursion level */
 
-          if (rc == PCRE_ERROR_DFA_UITEM) return rc;
+          if (rc == PCRE2_ERROR_DFA_UITEM) return rc;
           if ((rc >= 0) ==
                 (condcode == OP_ASSERT || condcode == OP_ASSERTBACK))
             { ADD_ACTIVE((int)(endasscode + LINK_SIZE + 1 - start_code), 0); }
@@ -2790,50 +2720,45 @@
       case OP_RECURSE:
         {
         dfa_recursion_info *ri;
-        int local_offsets[1000];
+        PCRE2_SIZE local_offsets[1000];
         int local_workspace[1000];
-        const pcre_uchar *callpat = start_code + GET(code, 1);
-        int recno = (callpat == md->start_code)? 0 :
+        PCRE2_SPTR callpat = start_code + GET(code, 1);
+        uint32_t recno = (callpat == mb->start_code)? 0 :
           GET2(callpat, 1 + LINK_SIZE);
         int rc;
 
-        DPRINTF(("%.*sStarting regex recursion\n", rlevel*2-2, SP));
-
         /* Check for repeating a recursion without advancing the subject
         pointer. This should catch convoluted mutual recursions. (Some simple
         cases are caught at compile time.) */
 
-        for (ri = md->recursive; ri != NULL; ri = ri->prevrec)
+        for (ri = mb->recursive; ri != NULL; ri = ri->prevrec)
           if (recno == ri->group_num && ptr == ri->subject_position)
-            return PCRE_ERROR_RECURSELOOP;
+            return PCRE2_ERROR_RECURSELOOP;
 
         /* Remember this recursion and where we started it so as to
         catch infinite loops. */
 
         new_recursive.group_num = recno;
         new_recursive.subject_position = ptr;
-        new_recursive.prevrec = md->recursive;
-        md->recursive = &new_recursive;
+        new_recursive.prevrec = mb->recursive;
+        mb->recursive = &new_recursive;
 
-        rc = internal_dfa_exec(
-          md,                                   /* fixed match data */
+        rc = internal_dfa_match(
+          mb,                                   /* fixed match data */
           callpat,                              /* this subexpression's code */
           ptr,                                  /* where we currently are */
           (int)(ptr - start_subject),           /* start offset */
           local_offsets,                        /* offset vector */
-          sizeof(local_offsets)/sizeof(int),    /* size of same */
+          sizeof(local_offsets)/sizeof(PCRE2_SIZE), /* size of same */
           local_workspace,                      /* workspace vector */
           sizeof(local_workspace)/sizeof(int),  /* size of same */
           rlevel);                              /* function recursion level */
 
-        md->recursive = new_recursive.prevrec;  /* Done this recursion */
-
-        DPRINTF(("%.*sReturn from regex recursion: rc=%d\n", rlevel*2-2, SP,
-          rc));
+        mb->recursive = new_recursive.prevrec;  /* Done this recursion */
 
         /* Ran out of internal offsets */
 
-        if (rc == 0) return PCRE_ERROR_DFA_RECURSE;
+        if (rc == 0) return PCRE2_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
@@ -2844,12 +2769,12 @@
           for (rc = rc*2 - 2; rc >= 0; rc -= 2)
             {
             int charcount = local_offsets[rc+1] - local_offsets[rc];
-#if defined SUPPORT_UTF && !defined COMPILE_PCRE32
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
             if (utf)
               {
-              const pcre_uchar *p = start_subject + local_offsets[rc];
-              const pcre_uchar *pp = start_subject + local_offsets[rc+1];
-              while (p < pp) if (NOT_FIRSTCHAR(*p++)) charcount--;
+              PCRE2_SPTR p = start_subject + local_offsets[rc];
+              PCRE2_SPTR pp = start_subject + local_offsets[rc+1];
+              while (p < pp) if (NOT_FIRSTCU(*p++)) charcount--;
               }
 #endif
             if (charcount > 0)
@@ -2862,7 +2787,7 @@
               }
             }
           }
-        else if (rc != PCRE_ERROR_NOMATCH) return rc;
+        else if (rc != PCRE2_ERROR_NOMATCH) return rc;
         }
       break;
 
@@ -2874,7 +2799,7 @@
       case OP_BRAPOSZERO:
         {
         int charcount, matched_count;
-        const pcre_uchar *local_ptr = ptr;
+        PCRE2_SPTR local_ptr = ptr;
         BOOL allow_zero;
 
         if (codevalue == OP_BRAPOSZERO)
@@ -2889,16 +2814,16 @@
 
         for (matched_count = 0;; matched_count++)
           {
-          int local_offsets[2];
+          PCRE2_SIZE local_offsets[2];
           int local_workspace[1000];
 
-          int rc = internal_dfa_exec(
-            md,                                   /* fixed match data */
+          int rc = internal_dfa_match(
+            mb,                                   /* fixed match data */
             code,                                 /* this subexpression's code */
             local_ptr,                            /* where we currently are */
             (int)(ptr - start_subject),           /* start offset */
             local_offsets,                        /* offset vector */
-            sizeof(local_offsets)/sizeof(int),    /* size of same */
+            sizeof(local_offsets)/sizeof(PCRE2_SIZE), /* size of same */
             local_workspace,                      /* workspace vector */
             sizeof(local_workspace)/sizeof(int),  /* size of same */
             rlevel);                              /* function recursion level */
@@ -2907,7 +2832,7 @@
 
           if (rc < 0)
             {
-            if (rc != PCRE_ERROR_NOMATCH) return rc;
+            if (rc != PCRE2_ERROR_NOMATCH) return rc;
             break;
             }
 
@@ -2924,7 +2849,7 @@
 
         if (matched_count > 0 || allow_zero)
           {
-          const pcre_uchar *end_subpattern = code;
+          PCRE2_SPTR end_subpattern = code;
           int next_state_offset;
 
           do { end_subpattern += GET(end_subpattern, 1); }
@@ -2945,11 +2870,11 @@
             }
           else
             {
-            const pcre_uchar *p = ptr;
-            const pcre_uchar *pp = local_ptr;
+            PCRE2_SPTR p = ptr;
+            PCRE2_SPTR pp = local_ptr;
             charcount = (int)(pp - p);
-#if defined SUPPORT_UTF && !defined COMPILE_PCRE32
-            if (utf) while (p < pp) if (NOT_FIRSTCHAR(*p++)) charcount--;
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
+            if (utf) while (p < pp) if (NOT_FIRSTCU(*p++)) charcount--;
 #endif
             ADD_NEW_DATA(-next_state_offset, 0, (charcount - 1));
             }
@@ -2961,23 +2886,23 @@
       case OP_ONCE:
       case OP_ONCE_NC:
         {
-        int local_offsets[2];
+        PCRE2_SIZE local_offsets[2];
         int local_workspace[1000];
 
-        int rc = internal_dfa_exec(
-          md,                                   /* fixed match data */
+        int rc = internal_dfa_match(
+          mb,                                   /* fixed match data */
           code,                                 /* this subexpression's code */
           ptr,                                  /* where we currently are */
           (int)(ptr - start_subject),           /* start offset */
           local_offsets,                        /* offset vector */
-          sizeof(local_offsets)/sizeof(int),    /* size of same */
+          sizeof(local_offsets)/sizeof(PCRE2_SIZE), /* size of same */
           local_workspace,                      /* workspace vector */
           sizeof(local_workspace)/sizeof(int),  /* size of same */
           rlevel);                              /* function recursion level */
 
         if (rc >= 0)
           {
-          const pcre_uchar *end_subpattern = code;
+          PCRE2_SPTR end_subpattern = code;
           int charcount = local_offsets[1] - local_offsets[0];
           int next_state_offset, repeat_state_offset;
 
@@ -3030,12 +2955,12 @@
             }
           else
             {
-#if defined SUPPORT_UTF && !defined COMPILE_PCRE32
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
             if (utf)
               {
-              const pcre_uchar *p = start_subject + local_offsets[0];
-              const pcre_uchar *pp = start_subject + local_offsets[1];
-              while (p < pp) if (NOT_FIRSTCHAR(*p++)) charcount--;
+              PCRE2_SPTR p = start_subject + local_offsets[0];
+              PCRE2_SPTR pp = start_subject + local_offsets[1];
+              while (p < pp) if (NOT_FIRSTCU(*p++)) charcount--;
               }
 #endif
             ADD_NEW_DATA(-next_state_offset, 0, (charcount - 1));
@@ -3043,7 +2968,7 @@
               { ADD_NEW_DATA(-repeat_state_offset, 0, (charcount - 1)); }
             }
           }
-        else if (rc != PCRE_ERROR_NOMATCH) return rc;
+        else if (rc != PCRE2_ERROR_NOMATCH) return rc;
         }
       break;
 
@@ -3052,39 +2977,55 @@
       /* Handle callouts */
 
       case OP_CALLOUT:
-      rrc = 0;
-      if (PUBL(callout) != NULL)
+      case OP_CALLOUT_STR:
         {
-        PUBL(callout_block) cb;
-        cb.version          = 1;   /* Version 1 of the callout block */
-        cb.callout_number   = code[1];
-        cb.offset_vector    = offsets;
-#if defined COMPILE_PCRE8
-        cb.subject          = (PCRE_SPTR)start_subject;
-#elif defined COMPILE_PCRE16
-        cb.subject          = (PCRE_SPTR16)start_subject;
-#elif defined COMPILE_PCRE32
-        cb.subject          = (PCRE_SPTR32)start_subject;
-#endif
-        cb.subject_length   = (int)(end_subject - start_subject);
-        cb.start_match      = (int)(current_subject - start_subject);
-        cb.current_position = (int)(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;
-        cb.mark             = NULL;   /* No (*MARK) support */
-        if ((rrc = (*PUBL(callout))(&cb)) < 0) return rrc;   /* Abandon */
+        unsigned int callout_length = (*code == OP_CALLOUT)
+            ? PRIV(OP_lengths)[OP_CALLOUT] : GET(code, 1 + 2*LINK_SIZE);
+        rrc = 0;
+
+        if (mb->callout != NULL)
+          {
+          pcre2_callout_block cb;
+          cb.version          = 1;
+          cb.capture_top      = 1;
+          cb.capture_last     = 0;
+          cb.offset_vector    = offsets;
+          cb.mark             = NULL;   /* No (*MARK) support */
+          cb.subject          = start_subject;
+          cb.subject_length   = (PCRE2_SIZE)(end_subject - start_subject);
+          cb.start_match      = (PCRE2_SIZE)(current_subject - start_subject);
+          cb.current_position = (PCRE2_SIZE)(ptr - start_subject);
+          cb.pattern_position = GET(code, 1);
+          cb.next_item_length = GET(code, 1 + LINK_SIZE);
+
+          if (*code == OP_CALLOUT)
+            {
+            cb.callout_number = code[1 + 2*LINK_SIZE];
+            cb.callout_string_offset = 0;
+            cb.callout_string = NULL;
+            cb.callout_string_length = 0;
+            }
+          else
+            {
+            cb.callout_number = 0;
+            cb.callout_string_offset = GET(code, 1 + 3*LINK_SIZE);
+            cb.callout_string = code + (1 + 4*LINK_SIZE) + 1;
+            cb.callout_string_length =
+              callout_length - (1 + 4*LINK_SIZE) - 2;
+            }
+
+          if ((rrc = (mb->callout)(&cb, mb->callout_data)) < 0)
+            return rrc;   /* Abandon */
+          }
+        if (rrc == 0)
+          { ADD_ACTIVE(state_offset + callout_length, 0); }
         }
-      if (rrc == 0)
-        { ADD_ACTIVE(state_offset + PRIV(OP_lengths)[OP_CALLOUT], 0); }
       break;
 
 
 /* ========================================================================== */
       default:        /* Unsupported opcode */
-      return PCRE_ERROR_DFA_UITEM;
+      return PCRE2_ERROR_DFA_UITEM;
       }
 
     NEXT_ACTIVE_STATE: continue;
@@ -3110,22 +3051,19 @@
         could_continue &&                            /* Some could go on, and */
         forced_fail != workspace[1] &&               /* Not all forced fail & */
         (                                            /* either... */
-        (md->moptions & PCRE_PARTIAL_HARD) != 0      /* Hard partial */
+        (mb->moptions & PCRE2_PARTIAL_HARD) != 0      /* Hard partial */
         ||                                           /* or... */
-        ((md->moptions & PCRE_PARTIAL_SOFT) != 0 &&  /* Soft partial and */
+        ((mb->moptions & PCRE2_PARTIAL_SOFT) != 0 &&  /* Soft partial and */
          match_count < 0)                            /* no matches */
         ) &&                                         /* And... */
         (
         partial_newline ||                           /* Either partial NL */
           (                                          /* or ... */
           ptr >= end_subject &&                /* End of subject and */
-          ptr > md->start_used_ptr)            /* Inspected non-empty string */
+          ptr > mb->start_used_ptr)            /* Inspected non-empty string */
           )
         )
-      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));
+      match_count = PCRE2_ERROR_PARTIAL;
     break;        /* In effect, "return", but see the comment below */
     }
 
@@ -3145,285 +3083,287 @@
 
 
 
-
 /*************************************************
-*    Execute a Regular Expression - DFA engine   *
+*     Match a pattern using the DFA algorithm    *
 *************************************************/
 
-/* 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.
+/* This function matches a compiled pattern to a subject string, using the
+alternate matching algorithm that finds all matches at once.
 
 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         vector of match offsets
-  offsetcount     size of same
-  workspace       workspace vector
-  wscount         size of same
+  code          points to the compiled pattern
+  subject       subject string
+  length        length of subject string
+  startoffset   where to start matching in the subject
+  options       option bits
+  match_data    points to a match data structure
+  gcontext      points to a match context
+  workspace     pointer to workspace
+  wscount       size of workspace
 
-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
+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
 */
 
-#if defined COMPILE_PCRE8
-PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
-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)
-#elif defined COMPILE_PCRE16
-PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
-pcre16_dfa_exec(const pcre16 *argument_re, const pcre16_extra *extra_data,
-  PCRE_SPTR16 subject, int length, int start_offset, int options, int *offsets,
-  int offsetcount, int *workspace, int wscount)
-#elif defined COMPILE_PCRE32
-PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
-pcre32_dfa_exec(const pcre32 *argument_re, const pcre32_extra *extra_data,
-  PCRE_SPTR32 subject, int length, int start_offset, int options, int *offsets,
-  int offsetcount, int *workspace, int wscount)
-#endif
+PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION
+pcre2_dfa_match(const pcre2_code *code, PCRE2_SPTR subject, PCRE2_SIZE length,
+  PCRE2_SIZE start_offset, uint32_t options, pcre2_match_data *match_data,
+  pcre2_match_context *mcontext, int *workspace, size_t wscount)
 {
-REAL_PCRE *re = (REAL_PCRE *)argument_re;
-dfa_match_data match_block;
-dfa_match_data *md = &match_block;
-BOOL utf, anchored, startline, firstline;
-const pcre_uchar *current_subject, *end_subject;
-const pcre_study_data *study = NULL;
+const pcre2_real_code *re = (const pcre2_real_code *)code;
 
-const pcre_uchar *req_char_ptr;
-const pcre_uint8 *start_bits = NULL;
-BOOL has_first_char = FALSE;
-BOOL has_req_char = FALSE;
-pcre_uchar first_char = 0;
-pcre_uchar first_char2 = 0;
-pcre_uchar req_char = 0;
-pcre_uchar req_char2 = 0;
-int newline;
+PCRE2_SPTR start_match;
+PCRE2_SPTR end_subject;
+PCRE2_SPTR bumpalong_limit;
+PCRE2_SPTR req_cu_ptr;
+
+BOOL utf, anchored, startline, firstline;
+
+BOOL has_first_cu = FALSE;
+BOOL has_req_cu = FALSE;
+PCRE2_UCHAR first_cu = 0;
+PCRE2_UCHAR first_cu2 = 0;
+PCRE2_UCHAR req_cu = 0;
+PCRE2_UCHAR req_cu2 = 0;
+
+const uint8_t *start_bits = NULL;
+
+/* We need to have mb pointing to a match block, because the IS_NEWLINE macro
+is used below, and it expects NLBLOCK to be defined as a pointer. */
+
+dfa_match_block actual_match_block;
+dfa_match_block *mb = &actual_match_block;
+
+/* A length equal to PCRE2_ZERO_TERMINATED implies a zero-terminated
+subject string. */
+
+if (length == PCRE2_ZERO_TERMINATED) length = PRIV(strlen)(subject);
 
 /* 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;
-if (length < 0) return PCRE_ERROR_BADLENGTH;
-if (start_offset < 0 || start_offset > length) return PCRE_ERROR_BADOFFSET;
+if ((options & ~PUBLIC_DFA_MATCH_OPTIONS) != 0) return PCRE2_ERROR_BADOPTION;
+if (re == NULL || subject == NULL || workspace == NULL || match_data == NULL)
+  return PCRE2_ERROR_NULL;
+if (wscount < 20) return PCRE2_ERROR_DFA_WSSIZE;
+if (start_offset > length) return PCRE2_ERROR_BADOFFSET;
 
 /* Check that the first field in the block is the magic number. If it is not,
-return with PCRE_ERROR_BADMAGIC. However, if the magic number is equal to
-REVERSED_MAGIC_NUMBER we return with PCRE_ERROR_BADENDIANNESS, which
-means that the pattern is likely compiled with different endianness. */
+return with PCRE2_ERROR_BADMAGIC. */
 
-if (re->magic_number != MAGIC_NUMBER)
-  return re->magic_number == REVERSED_MAGIC_NUMBER?
-    PCRE_ERROR_BADENDIANNESS:PCRE_ERROR_BADMAGIC;
-if ((re->flags & PCRE_MODE) == 0) return PCRE_ERROR_BADMODE;
+if (re->magic_number != MAGIC_NUMBER) return PCRE2_ERROR_BADMAGIC;
+
+/* Check the code unit width. */
+
+if ((re->flags & PCRE2_MODE_MASK) != PCRE2_CODE_UNIT_WIDTH/8)
+  return PCRE2_ERROR_BADMODE;
+
+/* PCRE2_NOTEMPTY and PCRE2_NOTEMPTY_ATSTART are match-time flags in the
+options variable for this function. Users of PCRE2 who are not calling the
+function directly would like to have a way of setting these flags, in the same
+way that they can set pcre2_compile() flags like PCRE2_NO_AUTOPOSSESS with
+constructions like (*NO_AUTOPOSSESS). To enable this, (*NOTEMPTY) and
+(*NOTEMPTY_ATSTART) set bits in the pattern's "flag" function which can now be
+transferred to the options for this function. The bits are guaranteed to be
+adjacent, but do not have the same values. This bit of Boolean trickery assumes
+that the match-time bits are not more significant than the flag bits. If by
+accident this is not the case, a compile-time division by zero error will
+occur. */
+
+#define FF (PCRE2_NOTEMPTY_SET|PCRE2_NE_ATST_SET)
+#define OO (PCRE2_NOTEMPTY|PCRE2_NOTEMPTY_ATSTART)
+options |= (re->flags & FF) / ((FF & (~FF+1)) / (OO & (~OO+1)));
+#undef FF
+#undef OO
 
 /* If restarting after a partial match, do some sanity checks on the contents
 of the workspace. */
 
-if ((options & PCRE_DFA_RESTART) != 0)
+if ((options & PCRE2_DFA_RESTART) != 0)
   {
   if ((workspace[0] & (-2)) != 0 || workspace[1] < 1 ||
-    workspace[1] > (wscount - 2)/INTS_PER_STATEBLOCK)
-      return PCRE_ERROR_DFA_BADRESTART;
-  }
-
-/* Set up study, callout, and table data */
-
-md->tables = re->tables;
-md->callout_data = NULL;
-
-if (extra_data != NULL)
-  {
-  unsigned long 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_MATCH_LIMIT_RECURSION) != 0)
-    return PCRE_ERROR_DFA_UMLIMIT;
-  if ((flags & PCRE_EXTRA_CALLOUT_DATA) != 0)
-    md->callout_data = extra_data->callout_data;
-  if ((flags & PCRE_EXTRA_TABLES) != 0)
-    md->tables = extra_data->tables;
+    workspace[1] > (int)((wscount - 2)/INTS_PER_STATEBLOCK))
+      return PCRE2_ERROR_DFA_BADRESTART;
   }
 
 /* Set some local values */
 
-current_subject = (const pcre_uchar *)subject + start_offset;
-end_subject = (const pcre_uchar *)subject + length;
-req_char_ptr = current_subject - 1;
-
-#ifdef SUPPORT_UTF
-/* PCRE_UTF(16|32) have the same value as PCRE_UTF8. */
-utf = (re->options & PCRE_UTF8) != 0;
-#else
-utf = FALSE;
-#endif
-
-anchored = (options & (PCRE_ANCHORED|PCRE_DFA_RESTART)) != 0 ||
-  (re->options & PCRE_ANCHORED) != 0;
-
-/* The remaining fixed data for passing around. */
-
-md->start_code = (const pcre_uchar *)argument_re +
-    re->name_table_offset + re->name_count * re->name_entry_size;
-md->start_subject = (const pcre_uchar *)subject;
-md->end_subject = end_subject;
-md->start_offset = start_offset;
-md->moptions = options;
-md->poptions = re->options;
-
-/* If the BSR option is not set at match time, copy what was set
-at compile time. */
-
-if ((md->moptions & (PCRE_BSR_ANYCRLF|PCRE_BSR_UNICODE)) == 0)
-  {
-  if ((re->options & (PCRE_BSR_ANYCRLF|PCRE_BSR_UNICODE)) != 0)
-    md->moptions |= re->options & (PCRE_BSR_ANYCRLF|PCRE_BSR_UNICODE);
-#ifdef BSR_ANYCRLF
-  else md->moptions |= PCRE_BSR_ANYCRLF;
-#endif
-  }
-
-/* Handle different types of newline. The three bits give eight cases. If
-nothing is set at run time, whatever was used at compile time applies. */
-
-switch ((((options & PCRE_NEWLINE_BITS) == 0)? re->options : (pcre_uint32)options) &
-         PCRE_NEWLINE_BITS)
-  {
-  case 0: newline = NEWLINE; break;   /* Compile-time default */
-  case PCRE_NEWLINE_CR: newline = CHAR_CR; break;
-  case PCRE_NEWLINE_LF: newline = CHAR_NL; break;
-  case PCRE_NEWLINE_CR+
-       PCRE_NEWLINE_LF: newline = (CHAR_CR << 8) | CHAR_NL; break;
-  case PCRE_NEWLINE_ANY: newline = -1; break;
-  case PCRE_NEWLINE_ANYCRLF: newline = -2; break;
-  default: return PCRE_ERROR_BADNEWLINE;
-  }
-
-if (newline == -2)
-  {
-  md->nltype = NLTYPE_ANYCRLF;
-  }
-else if (newline < 0)
-  {
-  md->nltype = NLTYPE_ANY;
-  }
-else
-  {
-  md->nltype = NLTYPE_FIXED;
-  if (newline > 255)
-    {
-    md->nllen = 2;
-    md->nl[0] = (newline >> 8) & 255;
-    md->nl[1] = newline & 255;
-    }
-  else
-    {
-    md->nllen = 1;
-    md->nl[0] = newline;
-    }
-  }
-
-/* Check a UTF-8 string if required. Unfortunately there's no way of passing
-back the character offset. */
-
-#ifdef SUPPORT_UTF
-if (utf && (options & PCRE_NO_UTF8_CHECK) == 0)
-  {
-  int erroroffset;
-  int errorcode = PRIV(valid_utf)((pcre_uchar *)subject, length, &erroroffset);
-  if (errorcode != 0)
-    {
-    if (offsetcount >= 2)
-      {
-      offsets[0] = erroroffset;
-      offsets[1] = errorcode;
-      }
-#if defined COMPILE_PCRE8
-    return (errorcode <= PCRE_UTF8_ERR5 && (options & PCRE_PARTIAL_HARD) != 0) ?
-      PCRE_ERROR_SHORTUTF8 : PCRE_ERROR_BADUTF8;
-#elif defined COMPILE_PCRE16
-    return (errorcode <= PCRE_UTF16_ERR1 && (options & PCRE_PARTIAL_HARD) != 0) ?
-      PCRE_ERROR_SHORTUTF16 : PCRE_ERROR_BADUTF16;
-#elif defined COMPILE_PCRE32
-    return PCRE_ERROR_BADUTF32;
-#endif
-    }
-#if defined COMPILE_PCRE8 || defined COMPILE_PCRE16
-  if (start_offset > 0 && start_offset < length &&
-        NOT_FIRSTCHAR(((PCRE_PUCHAR)subject)[start_offset]))
-    return PCRE_ERROR_BADUTF8_OFFSET;
-#endif
-  }
-#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 (md->tables == NULL) md->tables = PRIV(default_tables);
+utf = (re->overall_options & PCRE2_UTF) != 0;
+start_match = subject + start_offset;
+end_subject = subject + length;
+req_cu_ptr = start_match - 1;
+anchored = (options & (PCRE2_ANCHORED|PCRE2_DFA_RESTART)) != 0 ||
+  (re->overall_options & PCRE2_ANCHORED) != 0;
 
 /* The "must be at the start of a line" flags are used in a loop when finding
 where to start. */
 
-startline = (re->flags & PCRE_STARTLINE) != 0;
-firstline = (re->options & PCRE_FIRSTLINE) != 0;
+startline = (re->flags & PCRE2_STARTLINE) != 0;
+firstline = (re->overall_options & PCRE2_FIRSTLINE) != 0;
+bumpalong_limit = end_subject;
 
-/* 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. */
+/* Get data from the match context, if present, and fill in the fields in the
+match block. It is an error to set an offset limit without setting the flag at
+compile time. */
+
+if (mcontext == NULL)
+  {
+  mb->callout = NULL;
+  mb->memctl = re->memctl;
+  }
+else
+  {
+  if (mcontext->offset_limit != PCRE2_UNSET)
+    {
+    if ((re->overall_options & PCRE2_USE_OFFSET_LIMIT) == 0)
+      return PCRE2_ERROR_BADOFFSETLIMIT;
+    bumpalong_limit = subject + mcontext->offset_limit;
+    }
+  mb->callout = mcontext->callout;
+  mb->callout_data = mcontext->callout_data;
+  mb->memctl = mcontext->memctl;
+  }
+
+mb->start_code = (PCRE2_UCHAR *)((uint8_t *)re + sizeof(pcre2_real_code)) +
+  re->name_count * re->name_entry_size;
+mb->tables = re->tables;
+mb->start_subject = subject;
+mb->end_subject = end_subject;
+mb->start_offset = start_offset;
+mb->moptions = options;
+mb->poptions = re->overall_options;
+
+/* Process the \R and newline settings. */
+
+mb->bsr_convention = re->bsr_convention;
+mb->nltype = NLTYPE_FIXED;
+switch(re->newline_convention)
+  {
+  case PCRE2_NEWLINE_CR:
+  mb->nllen = 1;
+  mb->nl[0] = CHAR_CR;
+  break;
+
+  case PCRE2_NEWLINE_LF:
+  mb->nllen = 1;
+  mb->nl[0] = CHAR_NL;
+  break;
+
+  case PCRE2_NEWLINE_CRLF:
+  mb->nllen = 2;
+  mb->nl[0] = CHAR_CR;
+  mb->nl[1] = CHAR_NL;
+  break;
+
+  case PCRE2_NEWLINE_ANY:
+  mb->nltype = NLTYPE_ANY;
+  break;
+
+  case PCRE2_NEWLINE_ANYCRLF:
+  mb->nltype = NLTYPE_ANYCRLF;
+  break;
+
+  default: return PCRE2_ERROR_INTERNAL;
+  }
+
+/* Check a UTF string for validity if required. For 8-bit and 16-bit strings,
+we must also check that a starting offset does not point into the middle of a
+multiunit character. We check only the portion of the subject that is going to
+be inspected during matching - from the offset minus the maximum back reference
+to the given length. This saves time when a small part of a large subject is
+being matched by the use of a starting offset. Note that the maximum lookbehind
+is a number of characters, not code units. */
+
+#ifdef SUPPORT_UNICODE
+if (utf && (options & PCRE2_NO_UTF_CHECK) == 0)
+  {
+  PCRE2_SPTR check_subject = start_match;  /* start_match includes offset */
+
+  if (start_offset > 0)
+    {
+#if PCRE2_CODE_UNIT_WIDTH != 32
+    unsigned int i;
+    if (start_match < end_subject && NOT_FIRSTCU(*start_match))
+      return PCRE2_ERROR_BADUTFOFFSET;
+    for (i = re->max_lookbehind; i > 0 && check_subject > subject; i--)
+      {
+      check_subject--;
+      while (check_subject > subject &&
+#if PCRE2_CODE_UNIT_WIDTH == 8
+      (*check_subject & 0xc0) == 0x80)
+#else  /* 16-bit */
+      (*check_subject & 0xfc00) == 0xdc00)
+#endif /* PCRE2_CODE_UNIT_WIDTH == 8 */
+        check_subject--;
+      }
+#else   /* In the 32-bit library, one code unit equals one character. */
+    check_subject -= re->max_lookbehind;
+    if (check_subject < subject) check_subject = subject;
+#endif  /* PCRE2_CODE_UNIT_WIDTH != 32 */
+    }
+
+  /* Validate the relevant portion of the subject. After an error, adjust the
+  offset to be an absolute offset in the whole string. */
+
+  match_data->rc = PRIV(valid_utf)(check_subject,
+    length - (check_subject - subject), &(match_data->startchar));
+  if (match_data->rc != 0)
+    {
+    match_data->startchar += check_subject - subject;
+    return match_data->rc;
+    }
+  }
+#endif  /* SUPPORT_UNICODE */
+
+/* Set up the first code unit to match, if available. The first_codeunit 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 code unit may
+be unset for an unanchored pattern, of course. If there's no first code unit
+there may be a bitmap of possible first characters. */
 
 if (!anchored)
   {
-  if ((re->flags & PCRE_FIRSTSET) != 0)
+  if ((re->flags & PCRE2_FIRSTSET) != 0)
     {
-    has_first_char = TRUE;
-    first_char = first_char2 = (pcre_uchar)(re->first_char);
-    if ((re->flags & PCRE_FCH_CASELESS) != 0)
+    has_first_cu = TRUE;
+    first_cu = first_cu2 = (PCRE2_UCHAR)(re->first_codeunit);
+    if ((re->flags & PCRE2_FIRSTCASELESS) != 0)
       {
-      first_char2 = TABLE_GET(first_char, md->tables + fcc_offset, first_char);
-#if defined SUPPORT_UCP && !(defined COMPILE_PCRE8)
-      if (utf && first_char > 127)
-        first_char2 = UCD_OTHERCASE(first_char);
+      first_cu2 = TABLE_GET(first_cu, mb->tables + fcc_offset, first_cu);
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 8
+      if (utf && first_cu > 127) first_cu2 = UCD_OTHERCASE(first_cu);
 #endif
       }
     }
   else
-    {
-    if (!startline && study != NULL &&
-         (study->flags & PCRE_STUDY_MAPPED) != 0)
-      start_bits = study->start_bits;
-    }
+    if (!startline && (re->flags & PCRE2_FIRSTMAPSET) != 0)
+      start_bits = re->start_bitmap;
   }
 
 /* For anchored or unanchored matches, there may be a "last known required
 character" set. */
 
-if ((re->flags & PCRE_REQCHSET) != 0)
+if ((re->flags & PCRE2_LASTSET) != 0)
   {
-  has_req_char = TRUE;
-  req_char = req_char2 = (pcre_uchar)(re->req_char);
-  if ((re->flags & PCRE_RCH_CASELESS) != 0)
+  has_req_cu = TRUE;
+  req_cu = req_cu2 = (PCRE2_UCHAR)(re->last_codeunit);
+  if ((re->flags & PCRE2_LASTCASELESS) != 0)
     {
-    req_char2 = TABLE_GET(req_char, md->tables + fcc_offset, req_char);
-#if defined SUPPORT_UCP && !(defined COMPILE_PCRE8)
-    if (utf && req_char > 127)
-      req_char2 = UCD_OTHERCASE(req_char);
+    req_cu2 = TABLE_GET(req_cu, mb->tables + fcc_offset, req_cu);
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 8
+    if (utf && req_cu > 127) req_cu2 = UCD_OTHERCASE(req_cu);
 #endif
     }
   }
 
+/* Fill in fields that are always returned in the match data. */
+
+match_data->code = re;
+match_data->subject = subject;
+match_data->mark = NULL;
+match_data->matchedby = PCRE2_MATCHEDBY_DFA_INTERPRETER;
+
 /* Call the main matching function, looping for a non-anchored regex after a
 failed match. If not restarting, perform certain optimizations at the start of
 a match. */
@@ -3432,22 +3372,32 @@
   {
   int rc;
 
-  if ((options & PCRE_DFA_RESTART) == 0)
+  /* ----------------- Start of match optimizations ---------------- */
+
+  /* There are some optimizations that avoid running the match if a known
+  starting point is not found, or if a known later code unit is not present.
+  However, there is an option (settable at compile time) that disables
+  these, for testing and for ensuring that all callouts do actually occur.
+  The optimizations must also be avoided when restarting a DFA match. */
+
+  if ((re->overall_options & PCRE2_NO_START_OPTIMIZE) == 0 &&
+      (options & PCRE2_DFA_RESTART) == 0)
     {
-    const pcre_uchar *save_end_subject = end_subject;
+    PCRE2_SPTR save_end_subject = end_subject;
 
     /* 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. */
+    line of a multiline string. That is, the match must be before or at the
+    first newline. Implement this by temporarily adjusting end_subject so that
+    we stop the optimization scans at a newline. If the match fails at the
+    newline, later code breaks this loop. */
 
     if (firstline)
       {
-      PCRE_PUCHAR t = current_subject;
-#ifdef SUPPORT_UTF
+      PCRE2_SPTR t = start_match;
+#ifdef SUPPORT_UNICODE
       if (utf)
         {
-        while (t < md->end_subject && !IS_NEWLINE(t))
+        while (t < mb->end_subject && !IS_NEWLINE(t))
           {
           t++;
           ACROSSCHAR(t < end_subject, *t, t++);
@@ -3455,82 +3405,71 @@
         }
       else
 #endif
-      while (t < md->end_subject && !IS_NEWLINE(t)) t++;
+      while (t < mb->end_subject && !IS_NEWLINE(t)) t++;
       end_subject = t;
       }
 
-    /* There are some optimizations that avoid running the match if a known
-    starting point is not found. However, there is an option that disables
-    these, for testing and for ensuring that all callouts do actually occur.
-    The option can be set in the regex by (*NO_START_OPT) or passed in
-    match-time options. */
+    /* Advance to a unique first code unit if there is one. */
 
-    if (((options | re->options) & PCRE_NO_START_OPTIMIZE) == 0)
+    if (has_first_cu)
       {
-      /* Advance to a known first pcre_uchar (i.e. data item) */
+      PCRE2_UCHAR smc;
+      if (first_cu != first_cu2)
+        while (start_match < end_subject &&
+          (smc = UCHAR21TEST(start_match)) != first_cu && smc != first_cu2)
+          start_match++;
+      else
+        while (start_match < end_subject && UCHAR21TEST(start_match) != first_cu)
+          start_match++;
+      }
 
-      if (has_first_char)
+    /* Or to just after a linebreak for a multiline match */
+
+    else if (startline)
+      {
+      if (start_match > mb->start_subject + start_offset)
         {
-        if (first_char != first_char2)
+#ifdef SUPPORT_UNICODE
+        if (utf)
           {
-          pcre_uchar csc;
-          while (current_subject < end_subject &&
-                 (csc = UCHAR21TEST(current_subject)) != first_char && csc != first_char2)
-            current_subject++;
+          while (start_match < end_subject && !WAS_NEWLINE(start_match))
+            {
+            start_match++;
+            ACROSSCHAR(start_match < end_subject, *start_match,
+              start_match++);
+            }
           }
         else
-          while (current_subject < end_subject &&
-                 UCHAR21TEST(current_subject) != first_char)
-            current_subject++;
-        }
-
-      /* Or to just after a linebreak for a multiline match if possible */
-
-      else if (startline)
-        {
-        if (current_subject > md->start_subject + start_offset)
-          {
-#ifdef SUPPORT_UTF
-          if (utf)
-            {
-            while (current_subject < end_subject &&
-                   !WAS_NEWLINE(current_subject))
-              {
-              current_subject++;
-              ACROSSCHAR(current_subject < end_subject, *current_subject,
-                current_subject++);
-              }
-            }
-          else
 #endif
-          while (current_subject < end_subject && !WAS_NEWLINE(current_subject))
-            current_subject++;
+        while (start_match < end_subject && !WAS_NEWLINE(start_match))
+          start_match++;
 
-          /* If we have just passed a CR and the newline option is ANY or
-          ANYCRLF, and we are now at a LF, advance the match position by one
-          more character. */
+        /* If we have just passed a CR and the newline option is ANY or
+        ANYCRLF, and we are now at a LF, advance the match position by one more
+        code unit. */
 
-          if (UCHAR21TEST(current_subject - 1) == CHAR_CR &&
-               (md->nltype == NLTYPE_ANY || md->nltype == NLTYPE_ANYCRLF) &&
-               current_subject < end_subject &&
-               UCHAR21TEST(current_subject) == CHAR_NL)
-            current_subject++;
-          }
+        if (start_match[-1] == CHAR_CR &&
+             (mb->nltype == NLTYPE_ANY || mb->nltype == NLTYPE_ANYCRLF) &&
+             start_match < end_subject &&
+             UCHAR21TEST(start_match) == CHAR_NL)
+          start_match++;
         }
+      }
 
-      /* Advance to a non-unique first pcre_uchar after study */
+    /* Or to a non-unique first code unit if any have been identified. The
+    bitmap contains only 256 bits. When code units are 16 or 32 bits wide, all
+    code units greater than 254 set the 255 bit. */
 
-      else if (start_bits != NULL)
+    else if (start_bits != NULL)
+      {
+      while (start_match < end_subject)
         {
-        while (current_subject < end_subject)
-          {
-          register pcre_uint32 c = UCHAR21TEST(current_subject);
-#ifndef COMPILE_PCRE8
-          if (c > 255) c = 255;
+        register uint32_t c = UCHAR21TEST(start_match);
+#if PCRE2_CODE_UNIT_WIDTH != 8
+        if (c > 255) c = 255;
 #endif
-          if ((start_bits[c/8] & (1 << (c&7))) != 0) break;
-          current_subject++;
-          }
+        if ((start_bits[c/8] & (1 << (c&7))) != 0) break;
+        start_match++;
         }
       }
 
@@ -3538,137 +3477,142 @@
 
     end_subject = save_end_subject;
 
-    /* The following two optimizations are disabled for partial matching or if
-    disabling is explicitly requested (and of course, by the test above, this
-    code is not obeyed when restarting after a partial match). */
+    /* The following two optimizations are disabled for partial matching. */
 
-    if (((options | re->options) & PCRE_NO_START_OPTIMIZE) == 0 &&
-        (options & (PCRE_PARTIAL_HARD|PCRE_PARTIAL_SOFT)) == 0)
+    if ((mb->moptions & (PCRE2_PARTIAL_HARD|PCRE2_PARTIAL_SOFT)) == 0)
       {
-      /* If the pattern was studied, a minimum subject length may be set. This
-      is a lower bound; no actual string of that length may actually match the
-      pattern. Although the value is, strictly, in characters, we treat it as
-      in pcre_uchar units to avoid spending too much time in this optimization.
-      */
+      /* The minimum matching length is a lower bound; no actual string of that
+      length may actually match the pattern. Although the value is, strictly,
+      in characters, we treat it as code units to avoid spending too much time
+      in this optimization. */
 
-      if (study != NULL && (study->flags & PCRE_STUDY_MINLEN) != 0 &&
-          (pcre_uint32)(end_subject - current_subject) < study->minlength)
-        return PCRE_ERROR_NOMATCH;
+      if (end_subject - start_match < re->minlength) return PCRE2_ERROR_NOMATCH;
 
-      /* If req_char is set, we know that that pcre_uchar must appear in the
-      subject for the match to succeed. If the first pcre_uchar is set,
-      req_char 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.
+      /* If req_cu is set, we know that that code unit must appear in the
+      subject for the match to succeed. If the first code unit is set, req_cu
+      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. */
+      patterns. This showed up when somebody was matching something like
+      /^\d+C/ on a 32-megabyte string... so we don't do this when the string is
+      sufficiently long. */
 
-      if (has_req_char && end_subject - current_subject < REQ_BYTE_MAX)
+      if (has_req_cu && end_subject - start_match < REQ_CU_MAX)
         {
-        register PCRE_PUCHAR p = current_subject + (has_first_char? 1:0);
+        register PCRE2_SPTR p = start_match + (has_first_cu? 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_char_ptr)
+        if (p > req_cu_ptr)
           {
-          if (req_char != req_char2)
+          if (req_cu != req_cu2)
             {
             while (p < end_subject)
               {
-              register pcre_uint32 pp = UCHAR21INCTEST(p);
-              if (pp == req_char || pp == req_char2) { p--; break; }
+              register uint32_t pp = UCHAR21INCTEST(p);
+              if (pp == req_cu || pp == req_cu2) { p--; break; }
               }
             }
           else
             {
             while (p < end_subject)
               {
-              if (UCHAR21INCTEST(p) == req_char) { p--; break; }
+              if (UCHAR21INCTEST(p) == req_cu) { p--; break; }
               }
             }
 
-          /* If we can't find the required pcre_uchar, break the matching loop,
-          which will cause a return or PCRE_ERROR_NOMATCH. */
+          /* If we can't find the required code unit, break the matching loop,
+          forcing a match failure. */
 
           if (p >= end_subject) break;
 
-          /* If we have found the required pcre_uchar, save the point where we
+          /* If we have found the required code unit, 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 point yet. */
+          the start hasn't passed this code unit yet. */
 
-          req_char_ptr = p;
+          req_cu_ptr = p;
           }
         }
       }
-    }   /* End of optimizations that are done when not restarting */
+    }
+
+  /* ------------ End of start of match optimizations ------------ */
+
+  /* Give no match if we have passed the bumpalong limit. */
+
+  if (start_match > bumpalong_limit) break;
 
   /* OK, now we can do the business */
 
-  md->start_used_ptr = current_subject;
-  md->recursive = NULL;
+  mb->start_used_ptr = start_match;
+  mb->last_used_ptr = start_match;
+  mb->recursive = NULL;
 
-  rc = internal_dfa_exec(
-    md,                                /* fixed match data */
-    md->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 */
-    0);                                /* function recurse level */
+  rc = internal_dfa_match(
+    mb,                           /* fixed match data */
+    mb->start_code,               /* this subexpression's code */
+    start_match,                  /* where we currently are */
+    start_offset,                 /* start offset in subject */
+    match_data->ovector,          /* offset vector */
+    match_data->oveccount * 2,    /* actual size of same */
+    workspace,                    /* workspace vector */
+    wscount,                      /* size of same */
+    0);                           /* function 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)
+  if (rc != PCRE2_ERROR_NOMATCH || anchored)
     {
-    if (rc == PCRE_ERROR_PARTIAL && offsetcount >= 2)
+    if (rc == PCRE2_ERROR_PARTIAL && match_data->oveccount > 0)
       {
-      offsets[0] = (int)(md->start_used_ptr - (PCRE_PUCHAR)subject);
-      offsets[1] = (int)(end_subject - (PCRE_PUCHAR)subject);
-      if (offsetcount > 2)
-        offsets[2] = (int)(current_subject - (PCRE_PUCHAR)subject);
+      match_data->ovector[0] = (PCRE2_SIZE)(start_match - subject);
+      match_data->ovector[1] = (PCRE2_SIZE)(end_subject - subject);
       }
+    match_data->leftchar = (PCRE2_SIZE)(mb->start_used_ptr - subject);
+    match_data->rightchar = mb->last_used_ptr - subject;
+    match_data->startchar = (PCRE2_SIZE)(start_match - subject);
+    match_data->rc = rc;
     return rc;
     }
 
   /* Advance to the next subject character unless we are at the end of a line
   and firstline is set. */
 
-  if (firstline && IS_NEWLINE(current_subject)) break;
-  current_subject++;
-#ifdef SUPPORT_UTF
+  if (firstline && IS_NEWLINE(start_match)) break;
+  start_match++;
+#ifdef SUPPORT_UNICODE
   if (utf)
     {
-    ACROSSCHAR(current_subject < end_subject, *current_subject,
-      current_subject++);
+    ACROSSCHAR(start_match < end_subject, *start_match,
+      start_match++);
     }
 #endif
-  if (current_subject > end_subject) break;
+  if (start_match > end_subject) break;
 
   /* If we have just passed a CR and we are now at a LF, and the pattern does
   not contain any explicit matches for \r or \n, and the newline option is CRLF
   or ANY or ANYCRLF, advance the match position by one more character. */
 
-  if (UCHAR21TEST(current_subject - 1) == CHAR_CR &&
-      current_subject < end_subject &&
-      UCHAR21TEST(current_subject) == CHAR_NL &&
-      (re->flags & PCRE_HASCRORLF) == 0 &&
-        (md->nltype == NLTYPE_ANY ||
-         md->nltype == NLTYPE_ANYCRLF ||
-         md->nllen == 2))
-    current_subject++;
+  if (UCHAR21TEST(start_match - 1) == CHAR_CR &&
+      start_match < end_subject &&
+      UCHAR21TEST(start_match) == CHAR_NL &&
+      (re->flags & PCRE2_HASCRORLF) == 0 &&
+        (mb->nltype == NLTYPE_ANY ||
+         mb->nltype == NLTYPE_ANYCRLF ||
+         mb->nllen == 2))
+    start_match++;
 
   }   /* "Bumpalong" loop */
 
-return PCRE_ERROR_NOMATCH;
+
+return PCRE2_ERROR_NOMATCH;
 }
 
-/* End of pcre_dfa_exec.c */
+/* End of pcre2_dfa_match.c */
diff --git a/dist2/src/pcre2_error.c b/dist2/src/pcre2_error.c
new file mode 100644
index 0000000..6b4756a
--- /dev/null
+++ b/dist2/src/pcre2_error.c
@@ -0,0 +1,321 @@
+/*************************************************
+*      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
+     Original API code Copyright (c) 1997-2012 University of Cambridge
+         New API code Copyright (c) 2016 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.
+-----------------------------------------------------------------------------
+*/
+
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "pcre2_internal.h"
+
+#define STRING(a)  # a
+#define XSTRING(s) STRING(s)
+
+/* The texts of compile-time error messages. Compile-time error numbers start
+at COMPILE_ERROR_BASE (100).
+
+This used to be a table of strings, but in order to reduce the number of
+relocations needed when a shared library is loaded dynamically, it is now one
+long string. We cannot use a table of offsets, because the lengths of inserts
+such as XSTRING(MAX_NAME_SIZE) are not known. Instead,
+pcre2_get_error_message() counts through to the one it wants - this isn't a
+performance issue because these strings are used only when there is an error.
+
+Each substring ends with \0 to insert a null character. This includes the final
+substring, so that the whole string ends with \0\0, which can be detected when
+counting through. */
+
+static const char compile_error_texts[] =
+  "no error\0"
+  "\\ at end of pattern\0"
+  "\\c at end of pattern\0"
+  "unrecognized character follows \\\0"
+  "numbers out of order in {} quantifier\0"
+  /* 5 */
+  "number too big in {} quantifier\0"
+  "missing terminating ] for character class\0"
+  "invalid escape sequence in character class\0"
+  "range out of order in character class\0"
+  "quantifier does not follow a repeatable item\0"
+  /* 10 */
+  "internal error: unexpected repeat\0"
+  "unrecognized character after (? or (?-\0"
+  "POSIX named classes are supported only within a class\0"
+  "POSIX collating elements are not supported\0"
+  "missing closing parenthesis\0"
+  /* 15 */
+  "reference to non-existent subpattern\0"
+  "pattern passed as NULL\0"
+  "unrecognised compile-time option bit(s)\0"
+  "missing ) after (?# comment\0"
+  "parentheses are too deeply nested\0"
+  /* 20 */
+  "regular expression is too large\0"
+  "failed to allocate heap memory\0"
+  "unmatched closing parenthesis\0"
+  "internal error: code overflow\0"
+  "letter or underscore expected after (?< or (?'\0"
+  /* 25 */
+  "lookbehind assertion is not fixed length\0"
+  "malformed number or name after (?(\0"
+  "conditional group contains more than two branches\0"
+  "assertion expected after (?( or (?(?C)\0"
+  "(?R or (?[+-]digits must be followed by )\0"
+  /* 30 */
+  "unknown POSIX class name\0"
+  "internal error in pcre2_study(): should not occur\0"
+  "this version of PCRE2 does not have Unicode support\0"
+  "parentheses are too deeply nested (stack check)\0"
+  "character code point value in \\x{} or \\o{} is too large\0"
+  /* 35 */
+  "invalid condition (?(0)\0"
+  "\\C is not allowed in a lookbehind assertion\0"
+  "PCRE does not support \\L, \\l, \\N{name}, \\U, or \\u\0"
+  "number after (?C is greater than 255\0"
+  "closing parenthesis for (?C expected\0"
+  /* 40 */
+  "invalid escape sequence in (*VERB) name\0"
+  "unrecognized character after (?P\0"
+  "syntax error in subpattern name (missing terminator)\0"
+  "two named subpatterns have the same name (PCRE2_DUPNAMES not set)\0"
+  "group name must start with a non-digit\0"
+  /* 45 */
+  "this version of PCRE2 does not have support for \\P, \\p, or \\X\0"
+  "malformed \\P or \\p sequence\0"
+  "unknown property name after \\P or \\p\0"
+  "subpattern name is too long (maximum " XSTRING(MAX_NAME_SIZE) " characters)\0"
+  "too many named subpatterns (maximum " XSTRING(MAX_NAME_COUNT) ")\0"
+  /* 50 */
+  "invalid range in character class\0"
+  "octal value is greater than \\377 in 8-bit non-UTF-8 mode\0"
+  "internal error: overran compiling workspace\0"
+  "internal error: previously-checked referenced subpattern not found\0"
+  "DEFINE group contains more than one branch\0"
+  /* 55 */
+  "missing opening brace after \\o\0"
+  "internal error: unknown newline setting\0"
+  "\\g is not followed by a braced, angle-bracketed, or quoted name/number or by a plain number\0"
+  "a numbered reference must not be zero\0"
+  "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)\0"
+  /* 60 */
+  "(*VERB) not recognized or malformed\0"
+  "number is too big\0"
+  "subpattern name expected\0"
+  "digit expected after (?+\0"
+  "non-octal character in \\o{} (closing brace missing?)\0"
+  /* 65 */
+  "different names for subpatterns of the same number are not allowed\0"
+  "(*MARK) must have an argument\0"
+  "non-hex character in \\x{} (closing brace missing?)\0"
+#ifndef EBCDIC
+  "\\c must be followed by a printable ASCII character\0"
+#else
+  "\\c must be followed by a letter or one of [\\]^_?\0"
+#endif
+  "\\k is not followed by a braced, angle-bracketed, or quoted name\0"
+  /* 70 */
+  "internal error: unknown opcode in find_fixedlength()\0"
+  "\\N is not supported in a class\0"
+  "SPARE ERROR\0"
+  "disallowed Unicode code point (>= 0xd800 && <= 0xdfff)\0"
+  "using UTF is disabled by the application\0"
+  /* 75 */
+  "using UCP is disabled by the application\0"
+  "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)\0"
+  "character code point value in \\u.... sequence is too large\0"
+  "digits missing in \\x{} or \\o{}\0"
+  "syntax error in (?(VERSION condition\0"
+  /* 80 */
+  "internal error: unknown opcode in auto_possessify()\0"
+  "missing terminating delimiter for callout with string argument\0"
+  "unrecognized string delimiter follows (?C\0"
+  "using \\C is disabled by the application\0"
+  "(?| and/or (?J: or (?x: parentheses are too deeply nested\0"
+  /* 85 */
+  "using \\C is disabled in this PCRE2 library\0"
+  "regular expression is too complicated\0"
+  "lookbehind assertion is too long\0"
+  "pattern string is longer than the limit set by the application\0"
+  ;
+
+/* Match-time and UTF error texts are in the same format. */
+
+static const char match_error_texts[] =
+  "no error\0"
+  "no match\0"
+  "partial match\0"
+  "UTF-8 error: 1 byte missing at end\0"
+  "UTF-8 error: 2 bytes missing at end\0"
+  /* 5 */
+  "UTF-8 error: 3 bytes missing at end\0"
+  "UTF-8 error: 4 bytes missing at end\0"
+  "UTF-8 error: 5 bytes missing at end\0"
+  "UTF-8 error: byte 2 top bits not 0x80\0"
+  "UTF-8 error: byte 3 top bits not 0x80\0"
+  /* 10 */
+  "UTF-8 error: byte 4 top bits not 0x80\0"
+  "UTF-8 error: byte 5 top bits not 0x80\0"
+  "UTF-8 error: byte 6 top bits not 0x80\0"
+  "UTF-8 error: 5-byte character is not allowed (RFC 3629)\0"
+  "UTF-8 error: 6-byte character is not allowed (RFC 3629)\0"
+  /* 15 */
+  "UTF-8 error: code points greater than 0x10ffff are not defined\0"
+  "UTF-8 error: code points 0xd800-0xdfff are not defined\0"
+  "UTF-8 error: overlong 2-byte sequence\0"
+  "UTF-8 error: overlong 3-byte sequence\0"
+  "UTF-8 error: overlong 4-byte sequence\0"
+  /* 20 */
+  "UTF-8 error: overlong 5-byte sequence\0"
+  "UTF-8 error: overlong 6-byte sequence\0"
+  "UTF-8 error: isolated byte with 0x80 bit set\0"
+  "UTF-8 error: illegal byte (0xfe or 0xff)\0"
+  "UTF-16 error: missing low surrogate at end\0"
+  /* 25 */
+  "UTF-16 error: invalid low surrogate\0"
+  "UTF-16 error: isolated low surrogate\0"
+  "UTF-32 error: code points 0xd800-0xdfff are not defined\0"
+  "UTF-32 error: code points greater than 0x10ffff are not defined\0"
+  "bad data value\0"
+  /* 30 */
+  "patterns do not all use the same character tables\0"
+  "magic number missing\0"
+  "pattern compiled in wrong mode: 8/16/32-bit error\0"
+  "bad offset value\0"
+  "bad option value\0"
+  /* 35 */
+  "invalid replacement string\0"
+  "bad offset into UTF string\0"
+  "callout error code\0"              /* Never returned by PCRE2 itself */
+  "invalid data in workspace for DFA restart\0"
+  "too much recursion for DFA matching\0"
+  /* 40 */
+  "backreference condition or recursion test is not supported for DFA matching\0"
+  "function is not supported for DFA matching\0"
+  "pattern contains an item that is not supported for DFA matching\0"
+  "workspace size exceeded in DFA matching\0"
+  "internal error - pattern overwritten?\0"
+  /* 45 */
+  "bad JIT option\0"
+  "JIT stack limit reached\0"
+  "match limit exceeded\0"
+  "no more memory\0"
+  "unknown substring\0"
+  /* 50 */
+  "non-unique substring name\0"
+  "NULL argument passed\0"
+  "nested recursion at the same subject position\0"
+  "recursion limit exceeded\0"
+  "requested value is not available\0"
+  /* 55 */
+  "requested value is not set\0"
+  "offset limit set without PCRE2_USE_OFFSET_LIMIT\0"
+  "bad escape sequence in replacement string\0"
+  "expected closing curly bracket in replacement string\0"
+  "bad substitution in replacement string\0"
+  /* 60 */
+  "match with end before start is not supported\0"
+  "too many replacements (more than INT_MAX)\0"
+  ;
+
+
+/*************************************************
+*            Return error message                *
+*************************************************/
+
+/* This function copies an error message into a buffer whose units are of an
+appropriate width. Error numbers are positive for compile-time errors, and
+negative for match-time errors (except for UTF errors), but the numbers are all
+distinct.
+
+Arguments:
+  enumber       error number
+  buffer        where to put the message (zero terminated)
+  size          size of the buffer
+
+Returns:        length of message if all is well
+                negative on error
+*/
+
+PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION
+pcre2_get_error_message(int enumber, PCRE2_UCHAR *buffer, size_t size)
+{
+char xbuff[128];
+const char *message;
+size_t i;
+uint32_t n;
+
+if (size == 0) return PCRE2_ERROR_NOMEMORY;
+
+if (enumber > COMPILE_ERROR_BASE)  /* Compile error */
+  {
+  message = compile_error_texts;
+  n = enumber - COMPILE_ERROR_BASE;
+  }
+else                               /* Match or UTF error */
+  {
+  message = match_error_texts;
+  n = -enumber;
+  }
+
+for (; n > 0; n--)
+  {
+  while (*message++ != CHAR_NULL) {};
+  if (*message == CHAR_NULL)
+    {
+    sprintf(xbuff, "No text for error %d", enumber);
+    break;
+    }
+  }
+
+for (i = 0; *message != 0; i++)
+  {
+  if (i >= size - 1)
+    {
+    buffer[i] = 0;     /* Terminate partial message */
+    return PCRE2_ERROR_NOMEMORY;
+    }
+  buffer[i] = *message++;
+  }
+
+buffer[i] = 0;
+return i;
+}
+
+/* End of pcre2_error.c */
diff --git a/dist2/src/pcre2_find_bracket.c b/dist2/src/pcre2_find_bracket.c
new file mode 100644
index 0000000..803e719
--- /dev/null
+++ b/dist2/src/pcre2_find_bracket.c
@@ -0,0 +1,218 @@
+/*************************************************
+*      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
+     Original API code Copyright (c) 1997-2012 University of Cambridge
+         New API code Copyright (c) 2016 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 single function that scans through a compiled pattern
+until it finds a capturing bracket with the given number, or, if the number is
+negative, an instance of OP_REVERSE for a lookbehind. The function is called
+from pcre2_compile.c and also from pcre2_study.c when finding the minimum
+matching length. */
+
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "pcre2_internal.h"
+
+
+/*************************************************
+*    Scan compiled regex for specific bracket    *
+*************************************************/
+
+/*
+Arguments:
+  code        points to start of expression
+  utf         TRUE in UTF mode
+  number      the required bracket number or negative to find a lookbehind
+
+Returns:      pointer to the opcode for the bracket, or NULL if not found
+*/
+
+PCRE2_SPTR
+PRIV(find_bracket)(PCRE2_SPTR code, BOOL utf, int number)
+{
+for (;;)
+  {
+  register PCRE2_UCHAR c = *code;
+
+  if (c == OP_END) return NULL;
+
+  /* XCLASS is used for classes that cannot be represented just by a bit map.
+  This includes negated single high-valued characters. CALLOUT_STR is used for
+  callouts with string arguments. In both cases the length in the table is
+  zero; the actual length is stored in the compiled code. */
+
+  if (c == OP_XCLASS) code += GET(code, 1);
+    else if (c == OP_CALLOUT_STR) code += GET(code, 1 + 2*LINK_SIZE);
+
+  /* Handle lookbehind */
+
+  else if (c == OP_REVERSE)
+    {
+    if (number < 0) return (PCRE2_UCHAR *)code;
+    code += PRIV(OP_lengths)[c];
+    }
+
+  /* Handle capturing bracket */
+
+  else if (c == OP_CBRA || c == OP_SCBRA ||
+           c == OP_CBRAPOS || c == OP_SCBRAPOS)
+    {
+    int n = (int)GET2(code, 1+LINK_SIZE);
+    if (n == number) return (PCRE2_UCHAR *)code;
+    code += PRIV(OP_lengths)[c];
+    }
+
+  /* Otherwise, we can get the item's length from the table, except that for
+  repeated character types, we have to test for \p and \P, which have an extra
+  two bytes of parameters, and for MARK/PRUNE/SKIP/THEN with an argument, we
+  must add in its length. */
+
+  else
+    {
+    switch(c)
+      {
+      case OP_TYPESTAR:
+      case OP_TYPEMINSTAR:
+      case OP_TYPEPLUS:
+      case OP_TYPEMINPLUS:
+      case OP_TYPEQUERY:
+      case OP_TYPEMINQUERY:
+      case OP_TYPEPOSSTAR:
+      case OP_TYPEPOSPLUS:
+      case OP_TYPEPOSQUERY:
+      if (code[1] == OP_PROP || code[1] == OP_NOTPROP) code += 2;
+      break;
+
+      case OP_TYPEUPTO:
+      case OP_TYPEMINUPTO:
+      case OP_TYPEEXACT:
+      case OP_TYPEPOSUPTO:
+      if (code[1 + IMM2_SIZE] == OP_PROP || code[1 + IMM2_SIZE] == OP_NOTPROP)
+        code += 2;
+      break;
+
+      case OP_MARK:
+      case OP_PRUNE_ARG:
+      case OP_SKIP_ARG:
+      case OP_THEN_ARG:
+      code += code[1];
+      break;
+      }
+
+    /* Add in the fixed length from the table */
+
+    code += PRIV(OP_lengths)[c];
+
+  /* In UTF-8 and UTF-16 modes, 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 arrange to skip the extra bytes. */
+
+#ifdef MAYBE_UTF_MULTI
+    if (utf) switch(c)
+      {
+      case OP_CHAR:
+      case OP_CHARI:
+      case OP_NOT:
+      case OP_NOTI:
+      case OP_EXACT:
+      case OP_EXACTI:
+      case OP_NOTEXACT:
+      case OP_NOTEXACTI:
+      case OP_UPTO:
+      case OP_UPTOI:
+      case OP_NOTUPTO:
+      case OP_NOTUPTOI:
+      case OP_MINUPTO:
+      case OP_MINUPTOI:
+      case OP_NOTMINUPTO:
+      case OP_NOTMINUPTOI:
+      case OP_POSUPTO:
+      case OP_POSUPTOI:
+      case OP_NOTPOSUPTO:
+      case OP_NOTPOSUPTOI:
+      case OP_STAR:
+      case OP_STARI:
+      case OP_NOTSTAR:
+      case OP_NOTSTARI:
+      case OP_MINSTAR:
+      case OP_MINSTARI:
+      case OP_NOTMINSTAR:
+      case OP_NOTMINSTARI:
+      case OP_POSSTAR:
+      case OP_POSSTARI:
+      case OP_NOTPOSSTAR:
+      case OP_NOTPOSSTARI:
+      case OP_PLUS:
+      case OP_PLUSI:
+      case OP_NOTPLUS:
+      case OP_NOTPLUSI:
+      case OP_MINPLUS:
+      case OP_MINPLUSI:
+      case OP_NOTMINPLUS:
+      case OP_NOTMINPLUSI:
+      case OP_POSPLUS:
+      case OP_POSPLUSI:
+      case OP_NOTPOSPLUS:
+      case OP_NOTPOSPLUSI:
+      case OP_QUERY:
+      case OP_QUERYI:
+      case OP_NOTQUERY:
+      case OP_NOTQUERYI:
+      case OP_MINQUERY:
+      case OP_MINQUERYI:
+      case OP_NOTMINQUERY:
+      case OP_NOTMINQUERYI:
+      case OP_POSQUERY:
+      case OP_POSQUERYI:
+      case OP_NOTPOSQUERY:
+      case OP_NOTPOSQUERYI:
+      if (HAS_EXTRALEN(code[-1])) code += GET_EXTRALEN(code[-1]);
+      break;
+      }
+#else
+    (void)(utf);  /* Keep compiler happy by referencing function argument */
+#endif  /* MAYBE_UTF_MULTI */
+    }
+  }
+}
+
+/* End of pcre2_find_bracket.c */
diff --git a/dist2/src/pcre2_internal.h b/dist2/src/pcre2_internal.h
new file mode 100644
index 0000000..7c9f66c
--- /dev/null
+++ b/dist2/src/pcre2_internal.h
@@ -0,0 +1,1944 @@
+/*************************************************
+*      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
+     Original API code Copyright (c) 1997-2012 University of Cambridge
+         New API code Copyright (c) 2016 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.
+-----------------------------------------------------------------------------
+*/
+
+/* We do not support both EBCDIC and Unicode at the same time. The "configure"
+script prevents both being selected, but not everybody uses "configure". EBCDIC
+is only supported for the 8-bit library, but the check for this has to be later
+in this file, because the first part is not width-dependent, and is included by
+pcre2test.c with CODE_UNIT_WIDTH == 0. */
+
+#if defined EBCDIC && defined SUPPORT_UNICODE
+#error The use of both EBCDIC and SUPPORT_UNICODE is not supported.
+#endif
+
+/* Standard C headers */
+
+#include <ctype.h>
+#include <limits.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+/* Macros to make boolean values more obvious. The #ifndef is to pacify
+compiler warnings in environments where these macros are defined elsewhere.
+Unfortunately, there is no way to do the same for the typedef. */
+
+typedef int BOOL;
+#ifndef FALSE
+#define FALSE   0
+#define TRUE    1
+#endif
+
+/* Valgrind (memcheck) support */
+
+#ifdef SUPPORT_VALGRIND
+#include <valgrind/memcheck.h>
+#endif
+
+/* When compiling a DLL for Windows, the exported symbols have to be declared
+using some MS magic. I found some useful information on this web page:
+http://msdn2.microsoft.com/en-us/library/y4h7bcy6(VS.80).aspx. According to the
+information there, using __declspec(dllexport) without "extern" we have a
+definition; with "extern" we have a declaration. The settings here override the
+setting in pcre2.h (which is included below); it defines only PCRE2_EXP_DECL,
+which is all that is needed for applications (they just import the symbols). We
+use:
+
+  PCRE2_EXP_DECL    for declarations
+  PCRE2_EXP_DEFN    for definitions
+
+The reason for wrapping this in #ifndef PCRE2_EXP_DECL is so that pcre2test,
+which is an application, but needs to import this file in order to "peek" at
+internals, can #include pcre2.h first to get an application's-eye view.
+
+In principle, people compiling for non-Windows, non-Unix-like (i.e. uncommon,
+special-purpose environments) might want to stick other stuff in front of
+exported symbols. That's why, in the non-Windows case, we set PCRE2_EXP_DEFN
+only if it is not already set. */
+
+#ifndef PCRE2_EXP_DECL
+#  ifdef _WIN32
+#    ifndef PCRE2_STATIC
+#      define PCRE2_EXP_DECL       extern __declspec(dllexport)
+#      define PCRE2_EXP_DEFN       __declspec(dllexport)
+#    else
+#      define PCRE2_EXP_DECL       extern
+#      define PCRE2_EXP_DEFN
+#    endif
+#  else
+#    ifdef __cplusplus
+#      define PCRE2_EXP_DECL       extern "C"
+#    else
+#      define PCRE2_EXP_DECL       extern
+#    endif
+#    ifndef PCRE2_EXP_DEFN
+#      define PCRE2_EXP_DEFN       PCRE2_EXP_DECL
+#    endif
+#  endif
+#endif
+
+/* Include the public PCRE2 header and the definitions of UCP character
+property values. This must follow the setting of PCRE2_EXP_DECL above. */
+
+#include "pcre2.h"
+#include "pcre2_ucp.h"
+
+/* When PCRE2 is compiled as a C++ library, the subject pointer can be replaced
+with a custom type. This makes it possible, for example, to allow pcre2_match()
+to process subject strings that are discontinuous by using a smart pointer
+class. It must always be possible to inspect all of the subject string in
+pcre2_match() because of the way it backtracks. */
+
+/* WARNING: This is as yet untested for PCRE2. */
+
+#ifdef CUSTOM_SUBJECT_PTR
+#undef PCRE2_SPTR
+#define PCRE2_SPTR CUSTOM_SUBJECT_PTR
+#endif
+
+/* When compiling with the MSVC compiler, it is sometimes necessary to include
+a "calling convention" before exported function names. (This is secondhand
+information; I know nothing about MSVC myself). For example, something like
+
+  void __cdecl function(....)
+
+might be needed. In order so make this easy, all the exported functions have
+PCRE2_CALL_CONVENTION just before their names. It is rarely needed; if not
+set, we ensure here that it has no effect. */
+
+#ifndef PCRE2_CALL_CONVENTION
+#define PCRE2_CALL_CONVENTION
+#endif
+
+/* When checking for integer overflow in pcre2_compile(), we need to handle
+large integers. If a 64-bit integer type is available, we can use that.
+Otherwise we have to cast to double, which of course requires floating point
+arithmetic. Handle this by defining a macro for the appropriate type. If
+stdint.h is available, include it; it may define INT64_MAX. Systems that do not
+have stdint.h (e.g. Solaris) may have inttypes.h. The macro int64_t may be set
+by "configure". */
+
+#if defined HAVE_STDINT_H
+#include <stdint.h>
+#elif defined HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+
+#if defined INT64_MAX || defined int64_t
+#define INT64_OR_DOUBLE int64_t
+#else
+#define INT64_OR_DOUBLE double
+#endif
+
+/* 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 strlen(s)        _strlen(s)
+#define strncmp(s1,s2,m) _strncmp(s1,s2,m)
+#define memcmp(s,c,n)    _memcmp(s,c,n)
+#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). */
+
+#ifndef HAVE_MEMMOVE
+#undef  memmove        /* some systems may have a macro */
+#ifdef HAVE_BCOPY
+#define memmove(a, b, c) bcopy(b, a, c)
+#else  /* HAVE_BCOPY */
+static void *
+pcre_memmove(void *d, const void *s, size_t n)
+{
+size_t i;
+unsigned char *dest = (unsigned char *)d;
+const unsigned char *src = (const unsigned char *)s;
+if (dest > src)
+  {
+  dest += n;
+  src += n;
+  for (i = 0; i < n; ++i) *(--dest) = *(--src);
+  return (void *)dest;
+  }
+else
+  {
+  for (i = 0; i < n; ++i) *dest++ = *src++;
+  return (void *)(dest - n);
+  }
+}
+#define memmove(a, b, c) pcre_memmove(a, b, c)
+#endif   /* not HAVE_BCOPY */
+#endif   /* not HAVE_MEMMOVE */
+#endif   /* not VPCOMPAT */
+
+/* External (in the C sense) functions and tables that are private to the
+libraries are always referenced using the PRIV macro. This makes it possible
+for pcre2test.c to include some of the source files from the libraries using a
+different PRIV definition to avoid name clashes. It also makes it clear in the
+code that a non-static object is being referenced. */
+
+#ifndef PRIV
+#define PRIV(name) _pcre2_##name
+#endif
+
+/* This is an unsigned int value that no UTF character can ever have, as
+Unicode doesn't go beyond 0x0010ffff. */
+
+#define NOTACHAR 0xffffffff
+
+/* This is the largest valid UTF/Unicode code point. */
+
+#define MAX_UTF_CODE_POINT 0x10ffff
+
+/* Compile-time errors are added to this value. As they are documented, it
+should probably never be changed. */
+
+#define COMPILE_ERROR_BASE 100
+
+/* Define the default BSR convention. */
+
+#ifdef BSR_ANYCRLF
+#define BSR_DEFAULT PCRE2_BSR_ANYCRLF
+#else
+#define BSR_DEFAULT PCRE2_BSR_UNICODE
+#endif
+
+
+/* ---------------- Basic UTF-8 macros ---------------- */
+
+/* These UTF-8 macros are always defined because they are used in pcre2test for
+handling wide characters in 16-bit and 32-bit modes, even if an 8-bit library
+is not supported. */
+
+/* Tests whether a UTF-8 code point needs extra bytes to decode. */
+
+#define HASUTF8EXTRALEN(c) ((c) >= 0xc0)
+
+/* The following macros were originally written in the form of loops that used
+data from the tables whose names start with PRIV(utf8_table). They were
+rewritten by a user so as not to use loops, because in some environments this
+gives a significant performance advantage, and it seems never to do any harm.
+*/
+
+/* Base macro to pick up the remaining bytes of a UTF-8 character, not
+advancing the pointer. */
+
+#define GETUTF8(c, eptr) \
+    { \
+    if ((c & 0x20) == 0) \
+      c = ((c & 0x1f) << 6) | (eptr[1] & 0x3f); \
+    else if ((c & 0x10) == 0) \
+      c = ((c & 0x0f) << 12) | ((eptr[1] & 0x3f) << 6) | (eptr[2] & 0x3f); \
+    else if ((c & 0x08) == 0) \
+      c = ((c & 0x07) << 18) | ((eptr[1] & 0x3f) << 12) | \
+      ((eptr[2] & 0x3f) << 6) | (eptr[3] & 0x3f); \
+    else if ((c & 0x04) == 0) \
+      c = ((c & 0x03) << 24) | ((eptr[1] & 0x3f) << 18) | \
+          ((eptr[2] & 0x3f) << 12) | ((eptr[3] & 0x3f) << 6) | \
+          (eptr[4] & 0x3f); \
+    else \
+      c = ((c & 0x01) << 30) | ((eptr[1] & 0x3f) << 24) | \
+          ((eptr[2] & 0x3f) << 18) | ((eptr[3] & 0x3f) << 12) | \
+          ((eptr[4] & 0x3f) << 6) | (eptr[5] & 0x3f); \
+    }
+
+/* Base macro to pick up the remaining bytes of a UTF-8 character, advancing
+the pointer. */
+
+#define GETUTF8INC(c, eptr) \
+    { \
+    if ((c & 0x20) == 0) \
+      c = ((c & 0x1f) << 6) | (*eptr++ & 0x3f); \
+    else if ((c & 0x10) == 0) \
+      { \
+      c = ((c & 0x0f) << 12) | ((*eptr & 0x3f) << 6) | (eptr[1] & 0x3f); \
+      eptr += 2; \
+      } \
+    else if ((c & 0x08) == 0) \
+      { \
+      c = ((c & 0x07) << 18) | ((*eptr & 0x3f) << 12) | \
+          ((eptr[1] & 0x3f) << 6) | (eptr[2] & 0x3f); \
+      eptr += 3; \
+      } \
+    else if ((c & 0x04) == 0) \
+      { \
+      c = ((c & 0x03) << 24) | ((*eptr & 0x3f) << 18) | \
+          ((eptr[1] & 0x3f) << 12) | ((eptr[2] & 0x3f) << 6) | \
+          (eptr[3] & 0x3f); \
+      eptr += 4; \
+      } \
+    else \
+      { \
+      c = ((c & 0x01) << 30) | ((*eptr & 0x3f) << 24) | \
+          ((eptr[1] & 0x3f) << 18) | ((eptr[2] & 0x3f) << 12) | \
+          ((eptr[3] & 0x3f) << 6) | (eptr[4] & 0x3f); \
+      eptr += 5; \
+      } \
+    }
+
+/* Base macro to pick up the remaining bytes of a UTF-8 character, not
+advancing the pointer, incrementing the length. */
+
+#define GETUTF8LEN(c, eptr, len) \
+    { \
+    if ((c & 0x20) == 0) \
+      { \
+      c = ((c & 0x1f) << 6) | (eptr[1] & 0x3f); \
+      len++; \
+      } \
+    else if ((c & 0x10)  == 0) \
+      { \
+      c = ((c & 0x0f) << 12) | ((eptr[1] & 0x3f) << 6) | (eptr[2] & 0x3f); \
+      len += 2; \
+      } \
+    else if ((c & 0x08)  == 0) \
+      {\
+      c = ((c & 0x07) << 18) | ((eptr[1] & 0x3f) << 12) | \
+          ((eptr[2] & 0x3f) << 6) | (eptr[3] & 0x3f); \
+      len += 3; \
+      } \
+    else if ((c & 0x04)  == 0) \
+      { \
+      c = ((c & 0x03) << 24) | ((eptr[1] & 0x3f) << 18) | \
+          ((eptr[2] & 0x3f) << 12) | ((eptr[3] & 0x3f) << 6) | \
+          (eptr[4] & 0x3f); \
+      len += 4; \
+      } \
+    else \
+      {\
+      c = ((c & 0x01) << 30) | ((eptr[1] & 0x3f) << 24) | \
+          ((eptr[2] & 0x3f) << 18) | ((eptr[3] & 0x3f) << 12) | \
+          ((eptr[4] & 0x3f) << 6) | (eptr[5] & 0x3f); \
+      len += 5; \
+      } \
+    }
+
+/* --------------- Whitespace macros ---------------- */
+
+/* Tests for Unicode horizontal and vertical whitespace characters must check a
+number of different values. Using a switch statement for this generates the
+fastest code (no loop, no memory access), and there are several places in the
+interpreter code where this happens. In order to ensure that all the case lists
+remain in step, we use macros so that there is only one place where the lists
+are defined.
+
+These values are also required as lists in pcre2_compile.c when processing \h,
+\H, \v and \V in a character class. The lists are defined in pcre2_tables.c,
+but macros that define the values are here so that all the definitions are
+together. The lists must be in ascending character order, terminated by
+NOTACHAR (which is 0xffffffff).
+
+Any changes should ensure that the various macros are kept in step with each
+other. NOTE: The values also appear in pcre2_jit_compile.c. */
+
+/* -------------- ASCII/Unicode environments -------------- */
+
+#ifndef EBCDIC
+
+/* Character U+180E (Mongolian Vowel Separator) is not included in the list of
+spaces in the Unicode file PropList.txt, and Perl does not recognize it as a
+space. However, in many other sources it is listed as a space and has been in
+PCRE for a long time. */
+
+#define HSPACE_LIST \
+  CHAR_HT, CHAR_SPACE, CHAR_NBSP, \
+  0x1680, 0x180e, 0x2000, 0x2001, 0x2002, 0x2003, 0x2004, 0x2005, \
+  0x2006, 0x2007, 0x2008, 0x2009, 0x200A, 0x202f, 0x205f, 0x3000, \
+  NOTACHAR
+
+#define HSPACE_MULTIBYTE_CASES \
+  case 0x1680:  /* OGHAM SPACE MARK */ \
+  case 0x180e:  /* MONGOLIAN VOWEL SEPARATOR */ \
+  case 0x2000:  /* EN QUAD */ \
+  case 0x2001:  /* EM QUAD */ \
+  case 0x2002:  /* EN SPACE */ \
+  case 0x2003:  /* EM SPACE */ \
+  case 0x2004:  /* THREE-PER-EM SPACE */ \
+  case 0x2005:  /* FOUR-PER-EM SPACE */ \
+  case 0x2006:  /* SIX-PER-EM SPACE */ \
+  case 0x2007:  /* FIGURE SPACE */ \
+  case 0x2008:  /* PUNCTUATION SPACE */ \
+  case 0x2009:  /* THIN SPACE */ \
+  case 0x200A:  /* HAIR SPACE */ \
+  case 0x202f:  /* NARROW NO-BREAK SPACE */ \
+  case 0x205f:  /* MEDIUM MATHEMATICAL SPACE */ \
+  case 0x3000   /* IDEOGRAPHIC SPACE */
+
+#define HSPACE_BYTE_CASES \
+  case CHAR_HT: \
+  case CHAR_SPACE: \
+  case CHAR_NBSP
+
+#define HSPACE_CASES \
+  HSPACE_BYTE_CASES: \
+  HSPACE_MULTIBYTE_CASES
+
+#define VSPACE_LIST \
+  CHAR_LF, CHAR_VT, CHAR_FF, CHAR_CR, CHAR_NEL, 0x2028, 0x2029, NOTACHAR
+
+#define VSPACE_MULTIBYTE_CASES \
+  case 0x2028:    /* LINE SEPARATOR */ \
+  case 0x2029     /* PARAGRAPH SEPARATOR */
+
+#define VSPACE_BYTE_CASES \
+  case CHAR_LF: \
+  case CHAR_VT: \
+  case CHAR_FF: \
+  case CHAR_CR: \
+  case CHAR_NEL
+
+#define VSPACE_CASES \
+  VSPACE_BYTE_CASES: \
+  VSPACE_MULTIBYTE_CASES
+
+/* -------------- EBCDIC environments -------------- */
+
+#else
+#define HSPACE_LIST CHAR_HT, CHAR_SPACE, CHAR_NBSP, NOTACHAR
+
+#define HSPACE_BYTE_CASES \
+  case CHAR_HT: \
+  case CHAR_SPACE: \
+  case CHAR_NBSP
+
+#define HSPACE_CASES HSPACE_BYTE_CASES
+
+#ifdef EBCDIC_NL25
+#define VSPACE_LIST \
+  CHAR_VT, CHAR_FF, CHAR_CR, CHAR_NEL, CHAR_LF, NOTACHAR
+#else
+#define VSPACE_LIST \
+  CHAR_VT, CHAR_FF, CHAR_CR, CHAR_LF, CHAR_NEL, NOTACHAR
+#endif
+
+#define VSPACE_BYTE_CASES \
+  case CHAR_LF: \
+  case CHAR_VT: \
+  case CHAR_FF: \
+  case CHAR_CR: \
+  case CHAR_NEL
+
+#define VSPACE_CASES VSPACE_BYTE_CASES
+#endif  /* EBCDIC */
+
+/* -------------- End of whitespace macros -------------- */
+
+
+/* PCRE2 is able to support several different kinds of newline (CR, LF, CRLF,
+"any" and "anycrlf" at present). The following macros are used to package up
+testing for newlines. NLBLOCK, PSSTART, and PSEND are defined in the various
+modules to indicate in which datablock the parameters exist, and what the
+start/end of string field names are. */
+
+#define NLTYPE_FIXED    0     /* Newline is a fixed length string */
+#define NLTYPE_ANY      1     /* Newline is any Unicode line ending */
+#define NLTYPE_ANYCRLF  2     /* Newline is CR, LF, or CRLF */
+
+/* This macro checks for a newline at the given position */
+
+#define IS_NEWLINE(p) \
+  ((NLBLOCK->nltype != NLTYPE_FIXED)? \
+    ((p) < NLBLOCK->PSEND && \
+     PRIV(is_newline)((p), NLBLOCK->nltype, NLBLOCK->PSEND, \
+       &(NLBLOCK->nllen), utf)) \
+    : \
+    ((p) <= NLBLOCK->PSEND - NLBLOCK->nllen && \
+     UCHAR21TEST(p) == NLBLOCK->nl[0] && \
+     (NLBLOCK->nllen == 1 || UCHAR21TEST(p+1) == NLBLOCK->nl[1])       \
+    ) \
+  )
+
+/* This macro checks for a newline immediately preceding the given position */
+
+#define WAS_NEWLINE(p) \
+  ((NLBLOCK->nltype != NLTYPE_FIXED)? \
+    ((p) > NLBLOCK->PSSTART && \
+     PRIV(was_newline)((p), NLBLOCK->nltype, NLBLOCK->PSSTART, \
+       &(NLBLOCK->nllen), utf)) \
+    : \
+    ((p) >= NLBLOCK->PSSTART + NLBLOCK->nllen && \
+     UCHAR21TEST(p - NLBLOCK->nllen) == NLBLOCK->nl[0] &&              \
+     (NLBLOCK->nllen == 1 || UCHAR21TEST(p - NLBLOCK->nllen + 1) == NLBLOCK->nl[1]) \
+    ) \
+  )
+
+/* Private flags containing information about the compiled pattern. The first
+three must not be changed, because whichever is set is actually the number of
+bytes in a code unit in that mode. */
+
+#define PCRE2_MODE8         0x00000001  /* compiled in 8 bit mode */
+#define PCRE2_MODE16        0x00000002  /* compiled in 16 bit mode */
+#define PCRE2_MODE32        0x00000004  /* compiled in 32 bit mode */
+#define PCRE2_FIRSTSET      0x00000010  /* first_code unit is set */
+#define PCRE2_FIRSTCASELESS 0x00000020  /* caseless first code unit */
+#define PCRE2_FIRSTMAPSET   0x00000040  /* bitmap of first code units is set */
+#define PCRE2_LASTSET       0x00000080  /* last code unit is set */
+#define PCRE2_LASTCASELESS  0x00000100  /* caseless last code unit */
+#define PCRE2_STARTLINE     0x00000200  /* start after \n for multiline */
+#define PCRE2_JCHANGED      0x00000400  /* j option used in pattern */
+#define PCRE2_HASCRORLF     0x00000800  /* explicit \r or \n in pattern */
+#define PCRE2_HASTHEN       0x00001000  /* pattern contains (*THEN) */
+#define PCRE2_MATCH_EMPTY   0x00002000  /* pattern can match empty string */
+#define PCRE2_BSR_SET       0x00004000  /* BSR was set in the pattern */
+#define PCRE2_NL_SET        0x00008000  /* newline was set in the pattern */
+#define PCRE2_NOTEMPTY_SET  0x00010000  /* (*NOTEMPTY) used        ) keep */
+#define PCRE2_NE_ATST_SET   0x00020000  /* (*NOTEMPTY_ATSTART) used) together */
+#define PCRE2_DEREF_TABLES  0x00040000  /* release character tables */
+#define PCRE2_NOJIT         0x00080000  /* (*NOJIT) used */
+#define PCRE2_HASBKPORX     0x00100000  /* contains \P, \p, or \X */
+#define PCRE2_DUPCAPUSED    0x00200000  /* contains (?| */
+#define PCRE2_HASBKC        0x00400000  /* contains \C */
+
+#define PCRE2_MODE_MASK     (PCRE2_MODE8 | PCRE2_MODE16 | PCRE2_MODE32)
+
+/* Values for the matchedby field in a match data block. */
+
+enum { PCRE2_MATCHEDBY_INTERPRETER,     /* pcre2_match() */
+       PCRE2_MATCHEDBY_DFA_INTERPRETER, /* pcre2_dfa_match() */
+       PCRE2_MATCHEDBY_JIT };           /* pcre2_jit_match() */
+
+/* Magic number to provide a small check against being handed junk. */
+
+#define MAGIC_NUMBER  0x50435245UL   /* 'PCRE' */
+
+/* The maximum remaining length of subject we are prepared to search for a
+req_unit match. */
+
+#define REQ_CU_MAX 1000
+
+/* 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    /* alphanumeric 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)
+
+
+/* -------------------- Character and string names ------------------------ */
+
+/* If PCRE is to support UTF-8 on EBCDIC platforms, we cannot use normal
+character constants like '*' because the compiler would emit their EBCDIC code,
+which is different from their ASCII/UTF-8 code. Instead we define macros for
+the characters so that they always use the ASCII/UTF-8 code when UTF-8 support
+is enabled. When UTF-8 support is not enabled, the definitions use character
+literals. Both character and string versions of each character are needed, and
+there are some longer strings as well.
+
+This means that, on EBCDIC platforms, the PCRE library can handle either
+EBCDIC, or UTF-8, but not both. To support both in the same compiled library
+would need different lookups depending on whether PCRE2_UTF was set or not.
+This would make it impossible to use characters in switch/case statements,
+which would reduce performance. For a theoretical use (which nobody has asked
+for) in a minority area (EBCDIC platforms), this is not sensible. Any
+application that did need both could compile two versions of the library, using
+macros to give the functions distinct names. */
+
+#ifndef SUPPORT_UNICODE
+
+/* UTF-8 support is not enabled; use the platform-dependent character literals
+so that PCRE works in both ASCII and EBCDIC environments, but only in non-UTF
+mode. Newline characters are problematic in EBCDIC. Though it has CR and LF
+characters, a common practice has been to use its NL (0x15) character as the
+line terminator in C-like processing environments. However, sometimes the LF
+(0x25) character is used instead, according to this Unicode document:
+
+http://unicode.org/standard/reports/tr13/tr13-5.html
+
+PCRE defaults EBCDIC NL to 0x15, but has a build-time option to select 0x25
+instead. Whichever is *not* chosen is defined as NEL.
+
+In both ASCII and EBCDIC environments, CHAR_NL and CHAR_LF are synonyms for the
+same code point. */
+
+#ifdef EBCDIC
+
+#ifndef EBCDIC_NL25
+#define CHAR_NL                     '\x15'
+#define CHAR_NEL                    '\x25'
+#define STR_NL                      "\x15"
+#define STR_NEL                     "\x25"
+#else
+#define CHAR_NL                     '\x25'
+#define CHAR_NEL                    '\x15'
+#define STR_NL                      "\x25"
+#define STR_NEL                     "\x15"
+#endif
+
+#define CHAR_LF                     CHAR_NL
+#define STR_LF                      STR_NL
+
+#define CHAR_ESC                    '\047'
+#define CHAR_DEL                    '\007'
+#define CHAR_NBSP                   ((unsigned char)'\x41')
+#define STR_ESC                     "\047"
+#define STR_DEL                     "\007"
+
+#else  /* Not EBCDIC */
+
+/* In ASCII/Unicode, linefeed is '\n' and we equate this to NL for
+compatibility. NEL is the Unicode newline character; make sure it is
+a positive value. */
+
+#define CHAR_LF                     '\n'
+#define CHAR_NL                     CHAR_LF
+#define CHAR_NEL                    ((unsigned char)'\x85')
+#define CHAR_ESC                    '\033'
+#define CHAR_DEL                    '\177'
+#define CHAR_NBSP                   ((unsigned char)'\xa0')
+
+#define STR_LF                      "\n"
+#define STR_NL                      STR_LF
+#define STR_NEL                     "\x85"
+#define STR_ESC                     "\033"
+#define STR_DEL                     "\177"
+
+#endif  /* EBCDIC */
+
+/* The remaining definitions work in both environments. */
+
+#define CHAR_NULL                   '\0'
+#define CHAR_HT                     '\t'
+#define CHAR_VT                     '\v'
+#define CHAR_FF                     '\f'
+#define CHAR_CR                     '\r'
+#define CHAR_BS                     '\b'
+#define CHAR_BEL                    '\a'
+
+#define CHAR_SPACE                  ' '
+#define CHAR_EXCLAMATION_MARK       '!'
+#define CHAR_QUOTATION_MARK         '"'
+#define CHAR_NUMBER_SIGN            '#'
+#define CHAR_DOLLAR_SIGN            '$'
+#define CHAR_PERCENT_SIGN           '%'
+#define CHAR_AMPERSAND              '&'
+#define CHAR_APOSTROPHE             '\''
+#define CHAR_LEFT_PARENTHESIS       '('
+#define CHAR_RIGHT_PARENTHESIS      ')'
+#define CHAR_ASTERISK               '*'
+#define CHAR_PLUS                   '+'
+#define CHAR_COMMA                  ','
+#define CHAR_MINUS                  '-'
+#define CHAR_DOT                    '.'
+#define CHAR_SLASH                  '/'
+#define CHAR_0                      '0'
+#define CHAR_1                      '1'
+#define CHAR_2                      '2'
+#define CHAR_3                      '3'
+#define CHAR_4                      '4'
+#define CHAR_5                      '5'
+#define CHAR_6                      '6'
+#define CHAR_7                      '7'
+#define CHAR_8                      '8'
+#define CHAR_9                      '9'
+#define CHAR_COLON                  ':'
+#define CHAR_SEMICOLON              ';'
+#define CHAR_LESS_THAN_SIGN         '<'
+#define CHAR_EQUALS_SIGN            '='
+#define CHAR_GREATER_THAN_SIGN      '>'
+#define CHAR_QUESTION_MARK          '?'
+#define CHAR_COMMERCIAL_AT          '@'
+#define CHAR_A                      'A'
+#define CHAR_B                      'B'
+#define CHAR_C                      'C'
+#define CHAR_D                      'D'
+#define CHAR_E                      'E'
+#define CHAR_F                      'F'
+#define CHAR_G                      'G'
+#define CHAR_H                      'H'
+#define CHAR_I                      'I'
+#define CHAR_J                      'J'
+#define CHAR_K                      'K'
+#define CHAR_L                      'L'
+#define CHAR_M                      'M'
+#define CHAR_N                      'N'
+#define CHAR_O                      'O'
+#define CHAR_P                      'P'
+#define CHAR_Q                      'Q'
+#define CHAR_R                      'R'
+#define CHAR_S                      'S'
+#define CHAR_T                      'T'
+#define CHAR_U                      'U'
+#define CHAR_V                      'V'
+#define CHAR_W                      'W'
+#define CHAR_X                      'X'
+#define CHAR_Y                      'Y'
+#define CHAR_Z                      'Z'
+#define CHAR_LEFT_SQUARE_BRACKET    '['
+#define CHAR_BACKSLASH              '\\'
+#define CHAR_RIGHT_SQUARE_BRACKET   ']'
+#define CHAR_CIRCUMFLEX_ACCENT      '^'
+#define CHAR_UNDERSCORE             '_'
+#define CHAR_GRAVE_ACCENT           '`'
+#define CHAR_a                      'a'
+#define CHAR_b                      'b'
+#define CHAR_c                      'c'
+#define CHAR_d                      'd'
+#define CHAR_e                      'e'
+#define CHAR_f                      'f'
+#define CHAR_g                      'g'
+#define CHAR_h                      'h'
+#define CHAR_i                      'i'
+#define CHAR_j                      'j'
+#define CHAR_k                      'k'
+#define CHAR_l                      'l'
+#define CHAR_m                      'm'
+#define CHAR_n                      'n'
+#define CHAR_o                      'o'
+#define CHAR_p                      'p'
+#define CHAR_q                      'q'
+#define CHAR_r                      'r'
+#define CHAR_s                      's'
+#define CHAR_t                      't'
+#define CHAR_u                      'u'
+#define CHAR_v                      'v'
+#define CHAR_w                      'w'
+#define CHAR_x                      'x'
+#define CHAR_y                      'y'
+#define CHAR_z                      'z'
+#define CHAR_LEFT_CURLY_BRACKET     '{'
+#define CHAR_VERTICAL_LINE          '|'
+#define CHAR_RIGHT_CURLY_BRACKET    '}'
+#define CHAR_TILDE                  '~'
+
+#define STR_HT                      "\t"
+#define STR_VT                      "\v"
+#define STR_FF                      "\f"
+#define STR_CR                      "\r"
+#define STR_BS                      "\b"
+#define STR_BEL                     "\a"
+
+#define STR_SPACE                   " "
+#define STR_EXCLAMATION_MARK        "!"
+#define STR_QUOTATION_MARK          "\""
+#define STR_NUMBER_SIGN             "#"
+#define STR_DOLLAR_SIGN             "$"
+#define STR_PERCENT_SIGN            "%"
+#define STR_AMPERSAND               "&"
+#define STR_APOSTROPHE              "'"
+#define STR_LEFT_PARENTHESIS        "("
+#define STR_RIGHT_PARENTHESIS       ")"
+#define STR_ASTERISK                "*"
+#define STR_PLUS                    "+"
+#define STR_COMMA                   ","
+#define STR_MINUS                   "-"
+#define STR_DOT                     "."
+#define STR_SLASH                   "/"
+#define STR_0                       "0"
+#define STR_1                       "1"
+#define STR_2                       "2"
+#define STR_3                       "3"
+#define STR_4                       "4"
+#define STR_5                       "5"
+#define STR_6                       "6"
+#define STR_7                       "7"
+#define STR_8                       "8"
+#define STR_9                       "9"
+#define STR_COLON                   ":"
+#define STR_SEMICOLON               ";"
+#define STR_LESS_THAN_SIGN          "<"
+#define STR_EQUALS_SIGN             "="
+#define STR_GREATER_THAN_SIGN       ">"
+#define STR_QUESTION_MARK           "?"
+#define STR_COMMERCIAL_AT           "@"
+#define STR_A                       "A"
+#define STR_B                       "B"
+#define STR_C                       "C"
+#define STR_D                       "D"
+#define STR_E                       "E"
+#define STR_F                       "F"
+#define STR_G                       "G"
+#define STR_H                       "H"
+#define STR_I                       "I"
+#define STR_J                       "J"
+#define STR_K                       "K"
+#define STR_L                       "L"
+#define STR_M                       "M"
+#define STR_N                       "N"
+#define STR_O                       "O"
+#define STR_P                       "P"
+#define STR_Q                       "Q"
+#define STR_R                       "R"
+#define STR_S                       "S"
+#define STR_T                       "T"
+#define STR_U                       "U"
+#define STR_V                       "V"
+#define STR_W                       "W"
+#define STR_X                       "X"
+#define STR_Y                       "Y"
+#define STR_Z                       "Z"
+#define STR_LEFT_SQUARE_BRACKET     "["
+#define STR_BACKSLASH               "\\"
+#define STR_RIGHT_SQUARE_BRACKET    "]"
+#define STR_CIRCUMFLEX_ACCENT       "^"
+#define STR_UNDERSCORE              "_"
+#define STR_GRAVE_ACCENT            "`"
+#define STR_a                       "a"
+#define STR_b                       "b"
+#define STR_c                       "c"
+#define STR_d                       "d"
+#define STR_e                       "e"
+#define STR_f                       "f"
+#define STR_g                       "g"
+#define STR_h                       "h"
+#define STR_i                       "i"
+#define STR_j                       "j"
+#define STR_k                       "k"
+#define STR_l                       "l"
+#define STR_m                       "m"
+#define STR_n                       "n"
+#define STR_o                       "o"
+#define STR_p                       "p"
+#define STR_q                       "q"
+#define STR_r                       "r"
+#define STR_s                       "s"
+#define STR_t                       "t"
+#define STR_u                       "u"
+#define STR_v                       "v"
+#define STR_w                       "w"
+#define STR_x                       "x"
+#define STR_y                       "y"
+#define STR_z                       "z"
+#define STR_LEFT_CURLY_BRACKET      "{"
+#define STR_VERTICAL_LINE           "|"
+#define STR_RIGHT_CURLY_BRACKET     "}"
+#define STR_TILDE                   "~"
+
+#define STRING_ACCEPT0              "ACCEPT\0"
+#define STRING_COMMIT0              "COMMIT\0"
+#define STRING_F0                   "F\0"
+#define STRING_FAIL0                "FAIL\0"
+#define STRING_MARK0                "MARK\0"
+#define STRING_PRUNE0               "PRUNE\0"
+#define STRING_SKIP0                "SKIP\0"
+#define STRING_THEN                 "THEN"
+
+#define STRING_alpha0               "alpha\0"
+#define STRING_lower0               "lower\0"
+#define STRING_upper0               "upper\0"
+#define STRING_alnum0               "alnum\0"
+#define STRING_ascii0               "ascii\0"
+#define STRING_blank0               "blank\0"
+#define STRING_cntrl0               "cntrl\0"
+#define STRING_digit0               "digit\0"
+#define STRING_graph0               "graph\0"
+#define STRING_print0               "print\0"
+#define STRING_punct0               "punct\0"
+#define STRING_space0               "space\0"
+#define STRING_word0                "word\0"
+#define STRING_xdigit               "xdigit"
+
+#define STRING_DEFINE               "DEFINE"
+#define STRING_VERSION              "VERSION"
+#define STRING_WEIRD_STARTWORD      "[:<:]]"
+#define STRING_WEIRD_ENDWORD        "[:>:]]"
+
+#define STRING_CR_RIGHTPAR                "CR)"
+#define STRING_LF_RIGHTPAR                "LF)"
+#define STRING_CRLF_RIGHTPAR              "CRLF)"
+#define STRING_ANY_RIGHTPAR               "ANY)"
+#define STRING_ANYCRLF_RIGHTPAR           "ANYCRLF)"
+#define STRING_BSR_ANYCRLF_RIGHTPAR       "BSR_ANYCRLF)"
+#define STRING_BSR_UNICODE_RIGHTPAR       "BSR_UNICODE)"
+#define STRING_UTF8_RIGHTPAR              "UTF8)"
+#define STRING_UTF16_RIGHTPAR             "UTF16)"
+#define STRING_UTF32_RIGHTPAR             "UTF32)"
+#define STRING_UTF_RIGHTPAR               "UTF)"
+#define STRING_UCP_RIGHTPAR               "UCP)"
+#define STRING_NO_AUTO_POSSESS_RIGHTPAR   "NO_AUTO_POSSESS)"
+#define STRING_NO_DOTSTAR_ANCHOR_RIGHTPAR "NO_DOTSTAR_ANCHOR)"
+#define STRING_NO_JIT_RIGHTPAR            "NO_JIT)"
+#define STRING_NO_START_OPT_RIGHTPAR      "NO_START_OPT)"
+#define STRING_NOTEMPTY_RIGHTPAR          "NOTEMPTY)"
+#define STRING_NOTEMPTY_ATSTART_RIGHTPAR  "NOTEMPTY_ATSTART)"
+#define STRING_LIMIT_MATCH_EQ             "LIMIT_MATCH="
+#define STRING_LIMIT_RECURSION_EQ         "LIMIT_RECURSION="
+#define STRING_MARK                       "MARK"
+
+#else  /* SUPPORT_UNICODE */
+
+/* UTF-8 support is enabled; always use UTF-8 (=ASCII) character codes. This
+works in both modes non-EBCDIC platforms, and on EBCDIC platforms in UTF-8 mode
+only. */
+
+#define CHAR_HT                     '\011'
+#define CHAR_VT                     '\013'
+#define CHAR_FF                     '\014'
+#define CHAR_CR                     '\015'
+#define CHAR_LF                     '\012'
+#define CHAR_NL                     CHAR_LF
+#define CHAR_NEL                    ((unsigned char)'\x85')
+#define CHAR_BS                     '\010'
+#define CHAR_BEL                    '\007'
+#define CHAR_ESC                    '\033'
+#define CHAR_DEL                    '\177'
+
+#define CHAR_NULL                   '\0'
+#define CHAR_SPACE                  '\040'
+#define CHAR_EXCLAMATION_MARK       '\041'
+#define CHAR_QUOTATION_MARK         '\042'
+#define CHAR_NUMBER_SIGN            '\043'
+#define CHAR_DOLLAR_SIGN            '\044'
+#define CHAR_PERCENT_SIGN           '\045'
+#define CHAR_AMPERSAND              '\046'
+#define CHAR_APOSTROPHE             '\047'
+#define CHAR_LEFT_PARENTHESIS       '\050'
+#define CHAR_RIGHT_PARENTHESIS      '\051'
+#define CHAR_ASTERISK               '\052'
+#define CHAR_PLUS                   '\053'
+#define CHAR_COMMA                  '\054'
+#define CHAR_MINUS                  '\055'
+#define CHAR_DOT                    '\056'
+#define CHAR_SLASH                  '\057'
+#define CHAR_0                      '\060'
+#define CHAR_1                      '\061'
+#define CHAR_2                      '\062'
+#define CHAR_3                      '\063'
+#define CHAR_4                      '\064'
+#define CHAR_5                      '\065'
+#define CHAR_6                      '\066'
+#define CHAR_7                      '\067'
+#define CHAR_8                      '\070'
+#define CHAR_9                      '\071'
+#define CHAR_COLON                  '\072'
+#define CHAR_SEMICOLON              '\073'
+#define CHAR_LESS_THAN_SIGN         '\074'
+#define CHAR_EQUALS_SIGN            '\075'
+#define CHAR_GREATER_THAN_SIGN      '\076'
+#define CHAR_QUESTION_MARK          '\077'
+#define CHAR_COMMERCIAL_AT          '\100'
+#define CHAR_A                      '\101'
+#define CHAR_B                      '\102'
+#define CHAR_C                      '\103'
+#define CHAR_D                      '\104'
+#define CHAR_E                      '\105'
+#define CHAR_F                      '\106'
+#define CHAR_G                      '\107'
+#define CHAR_H                      '\110'
+#define CHAR_I                      '\111'
+#define CHAR_J                      '\112'
+#define CHAR_K                      '\113'
+#define CHAR_L                      '\114'
+#define CHAR_M                      '\115'
+#define CHAR_N                      '\116'
+#define CHAR_O                      '\117'
+#define CHAR_P                      '\120'
+#define CHAR_Q                      '\121'
+#define CHAR_R                      '\122'
+#define CHAR_S                      '\123'
+#define CHAR_T                      '\124'
+#define CHAR_U                      '\125'
+#define CHAR_V                      '\126'
+#define CHAR_W                      '\127'
+#define CHAR_X                      '\130'
+#define CHAR_Y                      '\131'
+#define CHAR_Z                      '\132'
+#define CHAR_LEFT_SQUARE_BRACKET    '\133'
+#define CHAR_BACKSLASH              '\134'
+#define CHAR_RIGHT_SQUARE_BRACKET   '\135'
+#define CHAR_CIRCUMFLEX_ACCENT      '\136'
+#define CHAR_UNDERSCORE             '\137'
+#define CHAR_GRAVE_ACCENT           '\140'
+#define CHAR_a                      '\141'
+#define CHAR_b                      '\142'
+#define CHAR_c                      '\143'
+#define CHAR_d                      '\144'
+#define CHAR_e                      '\145'
+#define CHAR_f                      '\146'
+#define CHAR_g                      '\147'
+#define CHAR_h                      '\150'
+#define CHAR_i                      '\151'
+#define CHAR_j                      '\152'
+#define CHAR_k                      '\153'
+#define CHAR_l                      '\154'
+#define CHAR_m                      '\155'
+#define CHAR_n                      '\156'
+#define CHAR_o                      '\157'
+#define CHAR_p                      '\160'
+#define CHAR_q                      '\161'
+#define CHAR_r                      '\162'
+#define CHAR_s                      '\163'
+#define CHAR_t                      '\164'
+#define CHAR_u                      '\165'
+#define CHAR_v                      '\166'
+#define CHAR_w                      '\167'
+#define CHAR_x                      '\170'
+#define CHAR_y                      '\171'
+#define CHAR_z                      '\172'
+#define CHAR_LEFT_CURLY_BRACKET     '\173'
+#define CHAR_VERTICAL_LINE          '\174'
+#define CHAR_RIGHT_CURLY_BRACKET    '\175'
+#define CHAR_TILDE                  '\176'
+#define CHAR_NBSP                   ((unsigned char)'\xa0')
+
+#define STR_HT                      "\011"
+#define STR_VT                      "\013"
+#define STR_FF                      "\014"
+#define STR_CR                      "\015"
+#define STR_NL                      "\012"
+#define STR_BS                      "\010"
+#define STR_BEL                     "\007"
+#define STR_ESC                     "\033"
+#define STR_DEL                     "\177"
+
+#define STR_SPACE                   "\040"
+#define STR_EXCLAMATION_MARK        "\041"
+#define STR_QUOTATION_MARK          "\042"
+#define STR_NUMBER_SIGN             "\043"
+#define STR_DOLLAR_SIGN             "\044"
+#define STR_PERCENT_SIGN            "\045"
+#define STR_AMPERSAND               "\046"
+#define STR_APOSTROPHE              "\047"
+#define STR_LEFT_PARENTHESIS        "\050"
+#define STR_RIGHT_PARENTHESIS       "\051"
+#define STR_ASTERISK                "\052"
+#define STR_PLUS                    "\053"
+#define STR_COMMA                   "\054"
+#define STR_MINUS                   "\055"
+#define STR_DOT                     "\056"
+#define STR_SLASH                   "\057"
+#define STR_0                       "\060"
+#define STR_1                       "\061"
+#define STR_2                       "\062"
+#define STR_3                       "\063"
+#define STR_4                       "\064"
+#define STR_5                       "\065"
+#define STR_6                       "\066"
+#define STR_7                       "\067"
+#define STR_8                       "\070"
+#define STR_9                       "\071"
+#define STR_COLON                   "\072"
+#define STR_SEMICOLON               "\073"
+#define STR_LESS_THAN_SIGN          "\074"
+#define STR_EQUALS_SIGN             "\075"
+#define STR_GREATER_THAN_SIGN       "\076"
+#define STR_QUESTION_MARK           "\077"
+#define STR_COMMERCIAL_AT           "\100"
+#define STR_A                       "\101"
+#define STR_B                       "\102"
+#define STR_C                       "\103"
+#define STR_D                       "\104"
+#define STR_E                       "\105"
+#define STR_F                       "\106"
+#define STR_G                       "\107"
+#define STR_H                       "\110"
+#define STR_I                       "\111"
+#define STR_J                       "\112"
+#define STR_K                       "\113"
+#define STR_L                       "\114"
+#define STR_M                       "\115"
+#define STR_N                       "\116"
+#define STR_O                       "\117"
+#define STR_P                       "\120"
+#define STR_Q                       "\121"
+#define STR_R                       "\122"
+#define STR_S                       "\123"
+#define STR_T                       "\124"
+#define STR_U                       "\125"
+#define STR_V                       "\126"
+#define STR_W                       "\127"
+#define STR_X                       "\130"
+#define STR_Y                       "\131"
+#define STR_Z                       "\132"
+#define STR_LEFT_SQUARE_BRACKET     "\133"
+#define STR_BACKSLASH               "\134"
+#define STR_RIGHT_SQUARE_BRACKET    "\135"
+#define STR_CIRCUMFLEX_ACCENT       "\136"
+#define STR_UNDERSCORE              "\137"
+#define STR_GRAVE_ACCENT            "\140"
+#define STR_a                       "\141"
+#define STR_b                       "\142"
+#define STR_c                       "\143"
+#define STR_d                       "\144"
+#define STR_e                       "\145"
+#define STR_f                       "\146"
+#define STR_g                       "\147"
+#define STR_h                       "\150"
+#define STR_i                       "\151"
+#define STR_j                       "\152"
+#define STR_k                       "\153"
+#define STR_l                       "\154"
+#define STR_m                       "\155"
+#define STR_n                       "\156"
+#define STR_o                       "\157"
+#define STR_p                       "\160"
+#define STR_q                       "\161"
+#define STR_r                       "\162"
+#define STR_s                       "\163"
+#define STR_t                       "\164"
+#define STR_u                       "\165"
+#define STR_v                       "\166"
+#define STR_w                       "\167"
+#define STR_x                       "\170"
+#define STR_y                       "\171"
+#define STR_z                       "\172"
+#define STR_LEFT_CURLY_BRACKET      "\173"
+#define STR_VERTICAL_LINE           "\174"
+#define STR_RIGHT_CURLY_BRACKET     "\175"
+#define STR_TILDE                   "\176"
+
+#define STRING_ACCEPT0              STR_A STR_C STR_C STR_E STR_P STR_T "\0"
+#define STRING_COMMIT0              STR_C STR_O STR_M STR_M STR_I STR_T "\0"
+#define STRING_F0                   STR_F "\0"
+#define STRING_FAIL0                STR_F STR_A STR_I STR_L "\0"
+#define STRING_MARK0                STR_M STR_A STR_R STR_K "\0"
+#define STRING_PRUNE0               STR_P STR_R STR_U STR_N STR_E "\0"
+#define STRING_SKIP0                STR_S STR_K STR_I STR_P "\0"
+#define STRING_THEN                 STR_T STR_H STR_E STR_N
+
+#define STRING_alpha0               STR_a STR_l STR_p STR_h STR_a "\0"
+#define STRING_lower0               STR_l STR_o STR_w STR_e STR_r "\0"
+#define STRING_upper0               STR_u STR_p STR_p STR_e STR_r "\0"
+#define STRING_alnum0               STR_a STR_l STR_n STR_u STR_m "\0"
+#define STRING_ascii0               STR_a STR_s STR_c STR_i STR_i "\0"
+#define STRING_blank0               STR_b STR_l STR_a STR_n STR_k "\0"
+#define STRING_cntrl0               STR_c STR_n STR_t STR_r STR_l "\0"
+#define STRING_digit0               STR_d STR_i STR_g STR_i STR_t "\0"
+#define STRING_graph0               STR_g STR_r STR_a STR_p STR_h "\0"
+#define STRING_print0               STR_p STR_r STR_i STR_n STR_t "\0"
+#define STRING_punct0               STR_p STR_u STR_n STR_c STR_t "\0"
+#define STRING_space0               STR_s STR_p STR_a STR_c STR_e "\0"
+#define STRING_word0                STR_w STR_o STR_r STR_d       "\0"
+#define STRING_xdigit               STR_x STR_d STR_i STR_g STR_i STR_t
+
+#define STRING_DEFINE               STR_D STR_E STR_F STR_I STR_N STR_E
+#define STRING_VERSION              STR_V STR_E STR_R STR_S STR_I STR_O STR_N
+#define STRING_WEIRD_STARTWORD      STR_LEFT_SQUARE_BRACKET STR_COLON STR_LESS_THAN_SIGN STR_COLON STR_RIGHT_SQUARE_BRACKET STR_RIGHT_SQUARE_BRACKET
+#define STRING_WEIRD_ENDWORD        STR_LEFT_SQUARE_BRACKET STR_COLON STR_GREATER_THAN_SIGN STR_COLON STR_RIGHT_SQUARE_BRACKET STR_RIGHT_SQUARE_BRACKET
+
+#define STRING_CR_RIGHTPAR                STR_C STR_R STR_RIGHT_PARENTHESIS
+#define STRING_LF_RIGHTPAR                STR_L STR_F STR_RIGHT_PARENTHESIS
+#define STRING_CRLF_RIGHTPAR              STR_C STR_R STR_L STR_F STR_RIGHT_PARENTHESIS
+#define STRING_ANY_RIGHTPAR               STR_A STR_N STR_Y STR_RIGHT_PARENTHESIS
+#define STRING_ANYCRLF_RIGHTPAR           STR_A STR_N STR_Y STR_C STR_R STR_L STR_F STR_RIGHT_PARENTHESIS
+#define STRING_BSR_ANYCRLF_RIGHTPAR       STR_B STR_S STR_R STR_UNDERSCORE STR_A STR_N STR_Y STR_C STR_R STR_L STR_F STR_RIGHT_PARENTHESIS
+#define STRING_BSR_UNICODE_RIGHTPAR       STR_B STR_S STR_R STR_UNDERSCORE STR_U STR_N STR_I STR_C STR_O STR_D STR_E STR_RIGHT_PARENTHESIS
+#define STRING_UTF8_RIGHTPAR              STR_U STR_T STR_F STR_8 STR_RIGHT_PARENTHESIS
+#define STRING_UTF16_RIGHTPAR             STR_U STR_T STR_F STR_1 STR_6 STR_RIGHT_PARENTHESIS
+#define STRING_UTF32_RIGHTPAR             STR_U STR_T STR_F STR_3 STR_2 STR_RIGHT_PARENTHESIS
+#define STRING_UTF_RIGHTPAR               STR_U STR_T STR_F STR_RIGHT_PARENTHESIS
+#define STRING_UCP_RIGHTPAR               STR_U STR_C STR_P STR_RIGHT_PARENTHESIS
+#define STRING_NO_AUTO_POSSESS_RIGHTPAR   STR_N STR_O STR_UNDERSCORE STR_A STR_U STR_T STR_O STR_UNDERSCORE STR_P STR_O STR_S STR_S STR_E STR_S STR_S STR_RIGHT_PARENTHESIS
+#define STRING_NO_DOTSTAR_ANCHOR_RIGHTPAR STR_N STR_O STR_UNDERSCORE STR_D STR_O STR_T STR_S STR_T STR_A STR_R STR_UNDERSCORE STR_A STR_N STR_C STR_H STR_O STR_R STR_RIGHT_PARENTHESIS
+#define STRING_NO_JIT_RIGHTPAR            STR_N STR_O STR_UNDERSCORE STR_J STR_I STR_T STR_RIGHT_PARENTHESIS
+#define STRING_NO_START_OPT_RIGHTPAR      STR_N STR_O STR_UNDERSCORE STR_S STR_T STR_A STR_R STR_T STR_UNDERSCORE STR_O STR_P STR_T STR_RIGHT_PARENTHESIS
+#define STRING_NOTEMPTY_RIGHTPAR          STR_N STR_O STR_T STR_E STR_M STR_P STR_T STR_Y STR_RIGHT_PARENTHESIS
+#define STRING_NOTEMPTY_ATSTART_RIGHTPAR  STR_N STR_O STR_T STR_E STR_M STR_P STR_T STR_Y STR_UNDERSCORE STR_A STR_T STR_S STR_T STR_A STR_R STR_T STR_RIGHT_PARENTHESIS
+#define STRING_LIMIT_MATCH_EQ             STR_L STR_I STR_M STR_I STR_T STR_UNDERSCORE STR_M STR_A STR_T STR_C STR_H STR_EQUALS_SIGN
+#define STRING_LIMIT_RECURSION_EQ         STR_L STR_I STR_M STR_I STR_T STR_UNDERSCORE STR_R STR_E STR_C STR_U STR_R STR_S STR_I STR_O STR_N STR_EQUALS_SIGN
+#define STRING_MARK                       STR_M STR_A STR_R STR_K
+
+#endif  /* SUPPORT_UNICODE */
+
+/* -------------------- End of character and string names -------------------*/
+
+/* -------------------- Definitions for compiled patterns -------------------*/
+
+/* Codes for different types of Unicode property */
+
+#define PT_ANY        0    /* Any property - matches all chars */
+#define PT_LAMP       1    /* L& - the union of Lu, Ll, Lt */
+#define PT_GC         2    /* Specified general characteristic (e.g. L) */
+#define PT_PC         3    /* Specified particular characteristic (e.g. Lu) */
+#define PT_SC         4    /* Script (e.g. Han) */
+#define PT_ALNUM      5    /* Alphanumeric - the union of L and N */
+#define PT_SPACE      6    /* Perl space - Z plus 9,10,12,13 */
+#define PT_PXSPACE    7    /* POSIX space - Z plus 9,10,11,12,13 */
+#define PT_WORD       8    /* Word - L plus N plus underscore */
+#define PT_CLIST      9    /* Pseudo-property: match character list */
+#define PT_UCNC      10    /* Universal Character nameable character */
+#define PT_TABSIZE   11    /* Size of square table for autopossessify tests */
+
+/* The following special properties are used only in XCLASS items, when POSIX
+classes are specified and PCRE_UCP is set - in other words, for Unicode
+handling of these classes. They are not available via the \p or \P escapes like
+those in the above list, and so they do not take part in the autopossessifying
+table. */
+
+#define PT_PXGRAPH   11    /* [:graph:] - characters that mark the paper */
+#define PT_PXPRINT   12    /* [:print:] - [:graph:] plus non-control spaces */
+#define PT_PXPUNCT   13    /* [:punct:] - punctuation characters */
+
+/* Flag bits and data types for the extended class (OP_XCLASS) for classes that
+contain 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_HASPROP   0x04    /* Flag: property checks are 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 (2-byte property code follows) */
+#define XCL_NOTPROP   4    /* Unicode inverted property (ditto) */
+
+/* Escape items that are just an encoding of a particular data value. These
+appear in the escapes[] table in pcre2_compile.c as positive numbers. */
+
+#ifndef ESC_a
+#define ESC_a CHAR_BEL
+#endif
+
+#ifndef ESC_e
+#define ESC_e CHAR_ESC
+#endif
+
+#ifndef ESC_f
+#define ESC_f CHAR_FF
+#endif
+
+#ifndef ESC_n
+#define ESC_n CHAR_LF
+#endif
+
+#ifndef ESC_r
+#define ESC_r CHAR_CR
+#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 CHAR_HT
+#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 0
+for a data character. In the escapes[] table in pcre2_compile.c their values
+are negated in order to distinguish them from data values.
+
+They must appear here in the same order as in the opcode definitions below, up
+to ESC_z. There's a dummy for OP_ALLANY because it corresponds to "." in DOTALL
+mode rather than an escape sequence. It is also used for [^] in JavaScript
+compatibility mode, and for \C in non-utf mode. In non-DOTALL mode, "." behaves
+like \N.
+
+The special values ESC_DU, ESC_du, etc. are used instead of ESC_D, ESC_d, etc.
+when PCRE_UCP is set and replacement of \d etc by \p sequences is required.
+They must be contiguous, and remain in order so that the replacements can be
+looked up from a table.
+
+Negative numbers are used to encode a backreference (\1, \2, \3, etc.) in
+check_escape(). There 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_K, ESC_B, ESC_b, ESC_D, ESC_d, ESC_S, ESC_s,
+       ESC_W, ESC_w, ESC_N, ESC_dum, ESC_C, ESC_P, ESC_p, ESC_R, ESC_H,
+       ESC_h, ESC_V, ESC_v, ESC_X, ESC_Z, ESC_z,
+       ESC_E, ESC_Q, ESC_g, ESC_k,
+       ESC_DU, ESC_du, ESC_SU, ESC_su, ESC_WU, ESC_wu };
+
+
+/********************** Opcode definitions ******************/
+
+/****** NOTE NOTE NOTE ******
+
+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. Furthermore, values up to
+OP_DOLLM must not be changed without adjusting the table called autoposstab in
+pcre_compile.c
+
+Whenever this list is updated, the two macro definitions that follow must be
+updated to match. The possessification table called "opcode_possessify" in
+pcre_compile.c must also be updated, and also the tables called "coptable"
+and "poptable" in pcre_dfa_exec.c.
+
+****** NOTE NOTE NOTE ******/
+
+
+/* The values between FIRST_AUTOTAB_OP and LAST_AUTOTAB_RIGHT_OP, inclusive,
+are used in a table for deciding whether a repeated character type can be
+auto-possessified. */
+
+#define FIRST_AUTOTAB_OP       OP_NOT_DIGIT
+#define LAST_AUTOTAB_LEFT_OP   OP_EXTUNI
+#define LAST_AUTOTAB_RIGHT_OP  OP_DOLLM
+
+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_SET_SOM,        /* 3 Set start of match (\K) */
+  OP_NOT_WORD_BOUNDARY,  /*  4 \B */
+  OP_WORD_BOUNDARY,      /*  5 \b */
+  OP_NOT_DIGIT,          /*  6 \D */
+  OP_DIGIT,              /*  7 \d */
+  OP_NOT_WHITESPACE,     /*  8 \S */
+  OP_WHITESPACE,         /*  9 \s */
+  OP_NOT_WORDCHAR,       /* 10 \W */
+  OP_WORDCHAR,           /* 11 \w */
+
+  OP_ANY,            /* 12 Match any character except newline (\N) */
+  OP_ALLANY,         /* 13 Match any character */
+  OP_ANYBYTE,        /* 14 Match any byte (\C); different to OP_ANY for UTF-8 */
+  OP_NOTPROP,        /* 15 \P (not Unicode property) */
+  OP_PROP,           /* 16 \p (Unicode property) */
+  OP_ANYNL,          /* 17 \R (any newline sequence) */
+  OP_NOT_HSPACE,     /* 18 \H (not horizontal whitespace) */
+  OP_HSPACE,         /* 19 \h (horizontal whitespace) */
+  OP_NOT_VSPACE,     /* 20 \V (not vertical whitespace) */
+  OP_VSPACE,         /* 21 \v (vertical whitespace) */
+  OP_EXTUNI,         /* 22 \X (extended Unicode sequence */
+  OP_EODN,           /* 23 End of data or \n at end of data (\Z) */
+  OP_EOD,            /* 24 End of data (\z) */
+
+  /* Line end assertions */
+
+  OP_DOLL,           /* 25 End of line - not multiline */
+  OP_DOLLM,          /* 26 End of line - multiline */
+  OP_CIRC,           /* 27 Start of line - not multiline */
+  OP_CIRCM,          /* 28 Start of line - multiline */
+
+  /* Single characters; caseful must precede the caseless ones */
+
+  OP_CHAR,           /* 29 Match one character, casefully */
+  OP_CHARI,          /* 30 Match one character, caselessly */
+  OP_NOT,            /* 31 Match one character, not the given one, casefully */
+  OP_NOTI,           /* 32 Match one character, not the given one, caselessly */
+
+  /* The following sets of 13 opcodes must always be kept in step because
+  the offset from the first one is used to generate the others. */
+
+  /* Repeated characters; caseful must precede the caseless ones */
+
+  OP_STAR,           /* 33 The maximizing and minimizing versions of */
+  OP_MINSTAR,        /* 34 these six opcodes must come in pairs, with */
+  OP_PLUS,           /* 35 the minimizing one second. */
+  OP_MINPLUS,        /* 36 */
+  OP_QUERY,          /* 37 */
+  OP_MINQUERY,       /* 38 */
+
+  OP_UPTO,           /* 39 From 0 to n matches of one character, caseful*/
+  OP_MINUPTO,        /* 40 */
+  OP_EXACT,          /* 41 Exactly n matches */
+
+  OP_POSSTAR,        /* 42 Possessified star, caseful */
+  OP_POSPLUS,        /* 43 Possessified plus, caseful */
+  OP_POSQUERY,       /* 44 Posesssified query, caseful */
+  OP_POSUPTO,        /* 45 Possessified upto, caseful */
+
+  /* Repeated characters; caseless must follow the caseful ones */
+
+  OP_STARI,          /* 46 */
+  OP_MINSTARI,       /* 47 */
+  OP_PLUSI,          /* 48 */
+  OP_MINPLUSI,       /* 49 */
+  OP_QUERYI,         /* 50 */
+  OP_MINQUERYI,      /* 51 */
+
+  OP_UPTOI,          /* 52 From 0 to n matches of one character, caseless */
+  OP_MINUPTOI,       /* 53 */
+  OP_EXACTI,         /* 54 */
+
+  OP_POSSTARI,       /* 55 Possessified star, caseless */
+  OP_POSPLUSI,       /* 56 Possessified plus, caseless */
+  OP_POSQUERYI,      /* 57 Posesssified query, caseless */
+  OP_POSUPTOI,       /* 58 Possessified upto, caseless */
+
+  /* The negated ones must follow the non-negated ones, and match them */
+  /* Negated repeated character, caseful; must precede the caseless ones */
+
+  OP_NOTSTAR,        /* 59 The maximizing and minimizing versions of */
+  OP_NOTMINSTAR,     /* 60 these six opcodes must come in pairs, with */
+  OP_NOTPLUS,        /* 61 the minimizing one second. They must be in */
+  OP_NOTMINPLUS,     /* 62 exactly the same order as those above. */
+  OP_NOTQUERY,       /* 63 */
+  OP_NOTMINQUERY,    /* 64 */
+
+  OP_NOTUPTO,        /* 65 From 0 to n matches, caseful */
+  OP_NOTMINUPTO,     /* 66 */
+  OP_NOTEXACT,       /* 67 Exactly n matches */
+
+  OP_NOTPOSSTAR,     /* 68 Possessified versions, caseful */
+  OP_NOTPOSPLUS,     /* 69 */
+  OP_NOTPOSQUERY,    /* 70 */
+  OP_NOTPOSUPTO,     /* 71 */
+
+  /* Negated repeated character, caseless; must follow the caseful ones */
+
+  OP_NOTSTARI,       /* 72 */
+  OP_NOTMINSTARI,    /* 73 */
+  OP_NOTPLUSI,       /* 74 */
+  OP_NOTMINPLUSI,    /* 75 */
+  OP_NOTQUERYI,      /* 76 */
+  OP_NOTMINQUERYI,   /* 77 */
+
+  OP_NOTUPTOI,       /* 78 From 0 to n matches, caseless */
+  OP_NOTMINUPTOI,    /* 79 */
+  OP_NOTEXACTI,      /* 80 Exactly n matches */
+
+  OP_NOTPOSSTARI,    /* 81 Possessified versions, caseless */
+  OP_NOTPOSPLUSI,    /* 82 */
+  OP_NOTPOSQUERYI,   /* 83 */
+  OP_NOTPOSUPTOI,    /* 84 */
+
+  /* Character types */
+
+  OP_TYPESTAR,       /* 85 The maximizing and minimizing versions of */
+  OP_TYPEMINSTAR,    /* 86 these six opcodes must come in pairs, with */
+  OP_TYPEPLUS,       /* 87 the minimizing one second. These codes must */
+  OP_TYPEMINPLUS,    /* 88 be in exactly the same order as those above. */
+  OP_TYPEQUERY,      /* 89 */
+  OP_TYPEMINQUERY,   /* 90 */
+
+  OP_TYPEUPTO,       /* 91 From 0 to n matches */
+  OP_TYPEMINUPTO,    /* 92 */
+  OP_TYPEEXACT,      /* 93 Exactly n matches */
+
+  OP_TYPEPOSSTAR,    /* 94 Possessified versions */
+  OP_TYPEPOSPLUS,    /* 95 */
+  OP_TYPEPOSQUERY,   /* 96 */
+  OP_TYPEPOSUPTO,    /* 97 */
+
+  /* These are used for character classes and back references; only the
+  first six are the same as the sets above. */
+
+  OP_CRSTAR,         /* 98 The maximizing and minimizing versions of */
+  OP_CRMINSTAR,      /* 99 all these opcodes must come in pairs, with */
+  OP_CRPLUS,         /* 100 the minimizing one second. These codes must */
+  OP_CRMINPLUS,      /* 101 be in exactly the same order as those above. */
+  OP_CRQUERY,        /* 102 */
+  OP_CRMINQUERY,     /* 103 */
+
+  OP_CRRANGE,        /* 104 These are different to the three sets above. */
+  OP_CRMINRANGE,     /* 105 */
+
+  OP_CRPOSSTAR,      /* 106 Possessified versions */
+  OP_CRPOSPLUS,      /* 107 */
+  OP_CRPOSQUERY,     /* 108 */
+  OP_CRPOSRANGE,     /* 109 */
+
+  /* End of quantifier opcodes */
+
+  OP_CLASS,          /* 110 Match a character class, chars < 256 only */
+  OP_NCLASS,         /* 111 Same, but the bitmap was created from a negative
+                              class - the difference is relevant only when a
+                              character > 255 is encountered. */
+  OP_XCLASS,         /* 112 Extended class for handling > 255 chars within the
+                              class. This does both positive and negative. */
+  OP_REF,            /* 113 Match a back reference, casefully */
+  OP_REFI,           /* 114 Match a back reference, caselessly */
+  OP_DNREF,          /* 115 Match a duplicate name backref, casefully */
+  OP_DNREFI,         /* 116 Match a duplicate name backref, caselessly */
+  OP_RECURSE,        /* 117 Match a numbered subpattern (possibly recursive) */
+  OP_CALLOUT,        /* 118 Call out to external function if provided */
+  OP_CALLOUT_STR,    /* 119 Call out with string argument */
+
+  OP_ALT,            /* 120 Start of alternation */
+  OP_KET,            /* 121 End of group that doesn't have an unbounded repeat */
+  OP_KETRMAX,        /* 122 These two must remain together and in this */
+  OP_KETRMIN,        /* 123 order. They are for groups the repeat for ever. */
+  OP_KETRPOS,        /* 124 Possessive unlimited repeat. */
+
+  /* The assertions must come before BRA, CBRA, ONCE, and COND, and the four
+  asserts must remain in order. */
+
+  OP_REVERSE,        /* 125 Move pointer back - used in lookbehind assertions */
+  OP_ASSERT,         /* 126 Positive lookahead */
+  OP_ASSERT_NOT,     /* 127 Negative lookahead */
+  OP_ASSERTBACK,     /* 128 Positive lookbehind */
+  OP_ASSERTBACK_NOT, /* 129 Negative lookbehind */
+
+  /* ONCE, ONCE_NC, BRA, BRAPOS, CBRA, CBRAPOS, and COND must come immediately
+  after the assertions, with ONCE first, as there's a test for >= ONCE for a
+  subpattern that isn't an assertion. The POS versions must immediately follow
+  the non-POS versions in each case. */
+
+  OP_ONCE,           /* 130 Atomic group, contains captures */
+  OP_ONCE_NC,        /* 131 Atomic group containing no captures */
+  OP_BRA,            /* 132 Start of non-capturing bracket */
+  OP_BRAPOS,         /* 133 Ditto, with unlimited, possessive repeat */
+  OP_CBRA,           /* 134 Start of capturing bracket */
+  OP_CBRAPOS,        /* 135 Ditto, with unlimited, possessive repeat */
+  OP_COND,           /* 136 Conditional group */
+
+  /* These five must follow the previous five, in the same order. There's a
+  check for >= SBRA to distinguish the two sets. */
+
+  OP_SBRA,           /* 137 Start of non-capturing bracket, check empty  */
+  OP_SBRAPOS,        /* 138 Ditto, with unlimited, possessive repeat */
+  OP_SCBRA,          /* 139 Start of capturing bracket, check empty */
+  OP_SCBRAPOS,       /* 140 Ditto, with unlimited, possessive repeat */
+  OP_SCOND,          /* 141 Conditional group, check empty */
+
+  /* The next two pairs must (respectively) be kept together. */
+
+  OP_CREF,           /* 142 Used to hold a capture number as condition */
+  OP_DNCREF,         /* 143 Used to point to duplicate names as a condition */
+  OP_RREF,           /* 144 Used to hold a recursion number as condition */
+  OP_DNRREF,         /* 145 Used to point to duplicate names as a condition */
+  OP_FALSE,          /* 146 Always false (used by DEFINE and VERSION) */
+  OP_TRUE,           /* 147 Always true (used by VERSION) */
+
+  OP_BRAZERO,        /* 148 These two must remain together and in this */
+  OP_BRAMINZERO,     /* 149 order. */
+  OP_BRAPOSZERO,     /* 150 */
+
+  /* These are backtracking control verbs */
+
+  OP_MARK,           /* 151 always has an argument */
+  OP_PRUNE,          /* 152 */
+  OP_PRUNE_ARG,      /* 153 same, but with argument */
+  OP_SKIP,           /* 154 */
+  OP_SKIP_ARG,       /* 155 same, but with argument */
+  OP_THEN,           /* 156 */
+  OP_THEN_ARG,       /* 157 same, but with argument */
+  OP_COMMIT,         /* 158 */
+
+  /* These are forced failure and success verbs */
+
+  OP_FAIL,           /* 159 */
+  OP_ACCEPT,         /* 160 */
+  OP_ASSERT_ACCEPT,  /* 161 Used inside assertions */
+  OP_CLOSE,          /* 162 Used before OP_ACCEPT to close open captures */
+
+  /* This is used to skip a subpattern with a {0} quantifier */
+
+  OP_SKIPZERO,       /* 163 */
+
+  /* This is used to identify a DEFINE group during compilation so that it can
+  be checked for having only one branch. It is changed to OP_FALSE before
+  compilation finishes. */
+
+  OP_DEFINE,         /* 164 */
+
+  /* This is not an opcode, but is used to check that tables indexed by opcode
+  are the correct length, in order to catch updating errors - there have been
+  some in the past. */
+
+  OP_TABLE_LENGTH
+
+};
+
+/* *** NOTE NOTE NOTE *** Whenever the list above is updated, the two macro
+definitions that follow must also be updated to match. There are also tables
+called "opcode_possessify" in pcre2_compile.c and "coptable" and "poptable" in
+pcre2_dfa_exec.c that must be updated. */
+
+
+/* This macro defines textual names for all the opcodes. These are used only
+for debugging, and some of them are only partial names. The macro is referenced
+only in pcre2_printint.c, which fills out the full names in many cases (and in
+some cases doesn't actually use these names at all). */
+
+#define OP_NAME_LIST \
+  "End", "\\A", "\\G", "\\K", "\\B", "\\b", "\\D", "\\d",         \
+  "\\S", "\\s", "\\W", "\\w", "Any", "AllAny", "Anybyte",         \
+  "notprop", "prop", "\\R", "\\H", "\\h", "\\V", "\\v",           \
+  "extuni",  "\\Z", "\\z",                                        \
+  "$", "$", "^", "^", "char", "chari", "not", "noti",             \
+  "*", "*?", "+", "+?", "?", "??",                                \
+  "{", "{", "{",                                                  \
+  "*+","++", "?+", "{",                                           \
+  "*", "*?", "+", "+?", "?", "??",                                \
+  "{", "{", "{",                                                  \
+  "*+","++", "?+", "{",                                           \
+  "*", "*?", "+", "+?", "?", "??",                                \
+  "{", "{", "{",                                                  \
+  "*+","++", "?+", "{",                                           \
+  "*", "*?", "+", "+?", "?", "??",                                \
+  "{", "{", "{",                                                  \
+  "*+","++", "?+", "{",                                           \
+  "*", "*?", "+", "+?", "?", "??", "{", "{", "{",                 \
+  "*+","++", "?+", "{",                                           \
+  "*", "*?", "+", "+?", "?", "??", "{", "{",                      \
+  "*+","++", "?+", "{",                                           \
+  "class", "nclass", "xclass", "Ref", "Refi", "DnRef", "DnRefi",  \
+  "Recurse", "Callout", "CalloutStr",                             \
+  "Alt", "Ket", "KetRmax", "KetRmin", "KetRpos",                  \
+  "Reverse", "Assert", "Assert not", "AssertB", "AssertB not",    \
+  "Once", "Once_NC",                                              \
+  "Bra", "BraPos", "CBra", "CBraPos",                             \
+  "Cond",                                                         \
+  "SBra", "SBraPos", "SCBra", "SCBraPos",                         \
+  "SCond",                                                        \
+  "Cond ref", "Cond dnref", "Cond rec", "Cond dnrec",             \
+  "Cond false", "Cond true",                                      \
+  "Brazero", "Braminzero", "Braposzero",                          \
+  "*MARK", "*PRUNE", "*PRUNE", "*SKIP", "*SKIP",                  \
+  "*THEN", "*THEN", "*COMMIT", "*FAIL",                           \
+  "*ACCEPT", "*ASSERT_ACCEPT",                                    \
+  "Close", "Skip zero", "Define"
+
+
+/* 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,                 /* \A, \G, \K, \B, \b                     */ \
+  1, 1, 1, 1, 1, 1,              /* \D, \d, \S, \s, \W, \w                 */ \
+  1, 1, 1,                       /* Any, AllAny, Anybyte                   */ \
+  3, 3,                          /* \P, \p                                 */ \
+  1, 1, 1, 1, 1,                 /* \R, \H, \h, \V, \v                     */ \
+  1,                             /* \X                                     */ \
+  1, 1, 1, 1, 1, 1,              /* \Z, \z, $, $M ^, ^M                    */ \
+  2,                             /* Char  - the minimum length             */ \
+  2,                             /* Chari  - the minimum length            */ \
+  2,                             /* not                                    */ \
+  2,                             /* noti                                   */ \
+  /* Positive single-char repeats                             ** These are */ \
+  2, 2, 2, 2, 2, 2,              /* *, *?, +, +?, ?, ??       ** minima in */ \
+  2+IMM2_SIZE, 2+IMM2_SIZE,      /* upto, minupto             ** mode      */ \
+  2+IMM2_SIZE,                   /* exact                                  */ \
+  2, 2, 2, 2+IMM2_SIZE,          /* *+, ++, ?+, upto+                      */ \
+  2, 2, 2, 2, 2, 2,              /* *I, *?I, +I, +?I, ?I, ??I ** UTF-8     */ \
+  2+IMM2_SIZE, 2+IMM2_SIZE,      /* upto I, minupto I                      */ \
+  2+IMM2_SIZE,                   /* exact I                                */ \
+  2, 2, 2, 2+IMM2_SIZE,          /* *+I, ++I, ?+I, upto+I                  */ \
+  /* Negative single-char repeats - only for chars < 256                   */ \
+  2, 2, 2, 2, 2, 2,              /* NOT *, *?, +, +?, ?, ??                */ \
+  2+IMM2_SIZE, 2+IMM2_SIZE,      /* NOT upto, minupto                      */ \
+  2+IMM2_SIZE,                   /* NOT exact                              */ \
+  2, 2, 2, 2+IMM2_SIZE,          /* Possessive NOT *, +, ?, upto           */ \
+  2, 2, 2, 2, 2, 2,              /* NOT *I, *?I, +I, +?I, ?I, ??I          */ \
+  2+IMM2_SIZE, 2+IMM2_SIZE,      /* NOT upto I, minupto I                  */ \
+  2+IMM2_SIZE,                   /* NOT exact I                            */ \
+  2, 2, 2, 2+IMM2_SIZE,          /* Possessive NOT *I, +I, ?I, upto I      */ \
+  /* Positive type repeats                                                 */ \
+  2, 2, 2, 2, 2, 2,              /* Type *, *?, +, +?, ?, ??               */ \
+  2+IMM2_SIZE, 2+IMM2_SIZE,      /* Type upto, minupto                     */ \
+  2+IMM2_SIZE,                   /* Type exact                             */ \
+  2, 2, 2, 2+IMM2_SIZE,          /* Possessive *+, ++, ?+, upto+           */ \
+  /* Character class & ref repeats                                         */ \
+  1, 1, 1, 1, 1, 1,              /* *, *?, +, +?, ?, ??                    */ \
+  1+2*IMM2_SIZE, 1+2*IMM2_SIZE,  /* CRRANGE, CRMINRANGE                    */ \
+  1, 1, 1, 1+2*IMM2_SIZE,        /* Possessive *+, ++, ?+, CRPOSRANGE      */ \
+  1+(32/sizeof(PCRE2_UCHAR)),    /* CLASS                                  */ \
+  1+(32/sizeof(PCRE2_UCHAR)),    /* NCLASS                                 */ \
+  0,                             /* XCLASS - variable length               */ \
+  1+IMM2_SIZE,                   /* REF                                    */ \
+  1+IMM2_SIZE,                   /* REFI                                   */ \
+  1+2*IMM2_SIZE,                 /* DNREF                                  */ \
+  1+2*IMM2_SIZE,                 /* DNREFI                                 */ \
+  1+LINK_SIZE,                   /* RECURSE                                */ \
+  1+2*LINK_SIZE+1,               /* CALLOUT                                */ \
+  0,                             /* CALLOUT_STR - variable length          */ \
+  1+LINK_SIZE,                   /* Alt                                    */ \
+  1+LINK_SIZE,                   /* Ket                                    */ \
+  1+LINK_SIZE,                   /* KetRmax                                */ \
+  1+LINK_SIZE,                   /* KetRmin                                */ \
+  1+LINK_SIZE,                   /* KetRpos                                */ \
+  1+LINK_SIZE,                   /* Reverse                                */ \
+  1+LINK_SIZE,                   /* Assert                                 */ \
+  1+LINK_SIZE,                   /* Assert not                             */ \
+  1+LINK_SIZE,                   /* Assert behind                          */ \
+  1+LINK_SIZE,                   /* Assert behind not                      */ \
+  1+LINK_SIZE,                   /* ONCE                                   */ \
+  1+LINK_SIZE,                   /* ONCE_NC                                */ \
+  1+LINK_SIZE,                   /* BRA                                    */ \
+  1+LINK_SIZE,                   /* BRAPOS                                 */ \
+  1+LINK_SIZE+IMM2_SIZE,         /* CBRA                                   */ \
+  1+LINK_SIZE+IMM2_SIZE,         /* CBRAPOS                                */ \
+  1+LINK_SIZE,                   /* COND                                   */ \
+  1+LINK_SIZE,                   /* SBRA                                   */ \
+  1+LINK_SIZE,                   /* SBRAPOS                                */ \
+  1+LINK_SIZE+IMM2_SIZE,         /* SCBRA                                  */ \
+  1+LINK_SIZE+IMM2_SIZE,         /* SCBRAPOS                               */ \
+  1+LINK_SIZE,                   /* SCOND                                  */ \
+  1+IMM2_SIZE, 1+2*IMM2_SIZE,    /* CREF, DNCREF                           */ \
+  1+IMM2_SIZE, 1+2*IMM2_SIZE,    /* RREF, DNRREF                           */ \
+  1, 1,                          /* FALSE, TRUE                            */ \
+  1, 1, 1,                       /* BRAZERO, BRAMINZERO, BRAPOSZERO        */ \
+  3, 1, 3,                       /* MARK, PRUNE, PRUNE_ARG                 */ \
+  1, 3,                          /* SKIP, SKIP_ARG                         */ \
+  1, 3,                          /* THEN, THEN_ARG                         */ \
+  1, 1, 1, 1,                    /* COMMIT, FAIL, ACCEPT, ASSERT_ACCEPT    */ \
+  1+IMM2_SIZE, 1,                /* CLOSE, SKIPZERO                        */ \
+  1                              /* DEFINE                                 */
+
+/* A magic value for OP_RREF to indicate the "any recursion" condition. */
+
+#define RREF_ANY  0xffff
+
+
+/* ---------- Private structures that are mode-independent. ---------- */
+
+/* Structure to hold data for custom memory management. */
+
+typedef struct pcre2_memctl {
+  void *    (*malloc)(size_t, void *);
+  void      (*free)(void *, void *);
+  void      *memory_data;
+} pcre2_memctl;
+
+/* Structure for building a chain of open capturing subpatterns during
+compiling, so that instructions to close them can be compiled when (*ACCEPT) is
+encountered. This is also used to identify subpatterns that contain recursive
+back references to themselves, so that they can be made atomic. */
+
+typedef struct open_capitem {
+  struct open_capitem *next;    /* Chain link */
+  uint16_t number;              /* Capture number */
+  uint16_t flag;                /* Set TRUE if recursive back ref */
+} open_capitem;
+
+/* Layout of the UCP type table that translates property names into types and
+codes. Each entry used to point directly to a name, but to reduce the number of
+relocations in shared libraries, it now has an offset into a single string
+instead. */
+
+typedef struct {
+  uint16_t name_offset;
+  uint16_t type;
+  uint16_t value;
+} ucp_type_table;
+
+/* Unicode character database (UCD) record format */
+
+typedef struct {
+  uint8_t script;     /* ucp_Arabic, etc. */
+  uint8_t chartype;   /* ucp_Cc, etc. (general categories) */
+  uint8_t gbprop;     /* ucp_gbControl, etc. (grapheme break property) */
+  uint8_t caseset;    /* offset to multichar other cases or zero */
+  int32_t other_case; /* offset to other case, or zero if none */
+} ucd_record;
+
+/* UCD access macros */
+
+#define UCD_BLOCK_SIZE 128
+#define GET_UCD(ch) (PRIV(ucd_records) + \
+        PRIV(ucd_stage2)[PRIV(ucd_stage1)[(int)(ch) / UCD_BLOCK_SIZE] * \
+        UCD_BLOCK_SIZE + (int)(ch) % UCD_BLOCK_SIZE])
+
+#define UCD_CHARTYPE(ch)    GET_UCD(ch)->chartype
+#define UCD_SCRIPT(ch)      GET_UCD(ch)->script
+#define UCD_CATEGORY(ch)    PRIV(ucp_gentype)[UCD_CHARTYPE(ch)]
+#define UCD_GRAPHBREAK(ch)  GET_UCD(ch)->gbprop
+#define UCD_CASESET(ch)     GET_UCD(ch)->caseset
+#define UCD_OTHERCASE(ch)   ((uint32_t)((int)ch + (int)(GET_UCD(ch)->other_case)))
+
+/* Header for serialized pcre2 codes. */
+
+typedef struct pcre2_serialized_data {
+  uint32_t magic;
+  uint32_t version;
+  uint32_t config;
+  int32_t  number_of_codes;
+} pcre2_serialized_data;
+
+
+
+/* ----------------- Items that need PCRE2_CODE_UNIT_WIDTH ----------------- */
+
+/* When this file is included by pcre2test, PCRE2_CODE_UNIT_WIDTH is defined as
+0, so the following items are omitted. */
+
+#if defined PCRE2_CODE_UNIT_WIDTH && PCRE2_CODE_UNIT_WIDTH != 0
+
+/* EBCDIC is supported only for the 8-bit library. */
+
+#if defined EBCDIC && PCRE2_CODE_UNIT_WIDTH != 8
+#error EBCDIC is not supported for the 16-bit or 32-bit libraries
+#endif
+
+/* This is the largest non-UTF code point. */
+
+#define MAX_NON_UTF_CHAR (0xffffffffU >> (32 - PCRE2_CODE_UNIT_WIDTH))
+
+/* Internal shared data tables and variables. These 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 PCRE2 public API. Although the data for some of them is
+identical in all libraries, they must have different names so that multiple
+libraries can be simultaneously linked to a single application. However, UTF-8
+tables are needed only when compiling the 8-bit library. */
+
+#if PCRE2_CODE_UNIT_WIDTH == 8
+extern const int              PRIV(utf8_table1)[];
+extern const int              PRIV(utf8_table1_size);
+extern const int              PRIV(utf8_table2)[];
+extern const int              PRIV(utf8_table3)[];
+extern const uint8_t          PRIV(utf8_table4)[];
+#endif
+
+#define _pcre2_OP_lengths              PCRE2_SUFFIX(_pcre2_OP_lengths_)
+#define _pcre2_callout_end_delims      PCRE2_SUFFIX(_pcre2_callout_end_delims_)
+#define _pcre2_callout_start_delims    PCRE2_SUFFIX(_pcre2_callout_start_delims_)
+#define _pcre2_default_compile_context PCRE2_SUFFIX(_pcre2_default_compile_context_)
+#define _pcre2_default_match_context   PCRE2_SUFFIX(_pcre2_default_match_context_)
+#define _pcre2_default_tables          PCRE2_SUFFIX(_pcre2_default_tables_)
+#define _pcre2_hspace_list             PCRE2_SUFFIX(_pcre2_hspace_list_)
+#define _pcre2_vspace_list             PCRE2_SUFFIX(_pcre2_vspace_list_)
+#define _pcre2_ucd_caseless_sets       PCRE2_SUFFIX(_pcre2_ucd_caseless_sets_)
+#define _pcre2_ucd_records             PCRE2_SUFFIX(_pcre2_ucd_records_)
+#define _pcre2_ucd_stage1              PCRE2_SUFFIX(_pcre2_ucd_stage1_)
+#define _pcre2_ucd_stage2              PCRE2_SUFFIX(_pcre2_ucd_stage2_)
+#define _pcre2_ucp_gbtable             PCRE2_SUFFIX(_pcre2_ucp_gbtable_)
+#define _pcre2_ucp_gentype             PCRE2_SUFFIX(_pcre2_ucp_gentype_)
+#define _pcre2_ucp_typerange           PCRE2_SUFFIX(_pcre2_ucp_typerange_)
+#define _pcre2_unicode_version         PCRE2_SUFFIX(_pcre2_unicode_version_)
+#define _pcre2_utt                     PCRE2_SUFFIX(_pcre2_utt_)
+#define _pcre2_utt_names               PCRE2_SUFFIX(_pcre2_utt_names_)
+#define _pcre2_utt_size                PCRE2_SUFFIX(_pcre2_utt_size_)
+
+extern const uint8_t                   PRIV(OP_lengths)[];
+extern const uint32_t                  PRIV(callout_end_delims)[];
+extern const uint32_t                  PRIV(callout_start_delims)[];
+extern const pcre2_compile_context     PRIV(default_compile_context);
+extern const pcre2_match_context       PRIV(default_match_context);
+extern const uint8_t                   PRIV(default_tables)[];
+extern const uint32_t                  PRIV(hspace_list)[];
+extern const uint32_t                  PRIV(vspace_list)[];
+extern const uint32_t                  PRIV(ucd_caseless_sets)[];
+extern const ucd_record                PRIV(ucd_records)[];
+extern const uint8_t                   PRIV(ucd_stage1)[];
+extern const uint16_t                  PRIV(ucd_stage2)[];
+extern const uint32_t                  PRIV(ucp_gbtable)[];
+extern const uint32_t                  PRIV(ucp_gentype)[];
+#ifdef SUPPORT_JIT
+extern const int                       PRIV(ucp_typerange)[];
+#endif
+extern const char                     *PRIV(unicode_version);
+extern const ucp_type_table            PRIV(utt)[];
+extern const char                      PRIV(utt_names)[];
+extern const size_t                    PRIV(utt_size);
+
+/* Mode-dependent macros and hidden and private structures are defined in a
+separate file so that pcre2test can include them at all supported widths. When
+compiling the library, PCRE2_CODE_UNIT_WIDTH will be defined, and we can
+include them at the appropriate width, after setting up suffix macros for the
+private structures. */
+
+#define branch_chain                 PCRE2_SUFFIX(branch_chain_)
+#define compile_block                PCRE2_SUFFIX(compile_block_)
+#define dfa_match_block              PCRE2_SUFFIX(dfa_match_block_)
+#define match_block                  PCRE2_SUFFIX(match_block_)
+#define named_group                  PCRE2_SUFFIX(named_group_)
+
+#include "pcre2_intmodedep.h"
+
+/* Private "external" functions. These are internal functions that are called
+from modules other than the one in which they are defined. They have to be
+"external" in the C sense, but are not part of the PCRE public API. They are
+not referenced from pcre2test, and must not be defined when no code unit width
+is available. */
+
+#define _pcre2_auto_possessify       PCRE2_SUFFIX(_pcre2_auto_possessify_)
+#define _pcre2_check_escape          PCRE2_SUFFIX(_pcre2_check_escape_)
+#define _pcre2_find_bracket          PCRE2_SUFFIX(_pcre2_find_bracket_)
+#define _pcre2_is_newline            PCRE2_SUFFIX(_pcre2_is_newline_)
+#define _pcre2_jit_free_rodata       PCRE2_SUFFIX(_pcre2_jit_free_rodata_)
+#define _pcre2_jit_free              PCRE2_SUFFIX(_pcre2_jit_free_)
+#define _pcre2_jit_get_size          PCRE2_SUFFIX(_pcre2_jit_get_size_)
+#define _pcre2_jit_get_target        PCRE2_SUFFIX(_pcre2_jit_get_target_)
+#define _pcre2_memctl_malloc         PCRE2_SUFFIX(_pcre2_memctl_malloc_)
+#define _pcre2_ord2utf               PCRE2_SUFFIX(_pcre2_ord2utf_)
+#define _pcre2_strcmp                PCRE2_SUFFIX(_pcre2_strcmp_)
+#define _pcre2_strcmp_c8             PCRE2_SUFFIX(_pcre2_strcmp_c8_)
+#define _pcre2_strcpy_c8             PCRE2_SUFFIX(_pcre2_strcpy_c8_)
+#define _pcre2_strlen                PCRE2_SUFFIX(_pcre2_strlen_)
+#define _pcre2_strncmp               PCRE2_SUFFIX(_pcre2_strncmp_)
+#define _pcre2_strncmp_c8            PCRE2_SUFFIX(_pcre2_strncmp_c8_)
+#define _pcre2_study                 PCRE2_SUFFIX(_pcre2_study_)
+#define _pcre2_valid_utf             PCRE2_SUFFIX(_pcre2_valid_utf_)
+#define _pcre2_was_newline           PCRE2_SUFFIX(_pcre2_was_newline_)
+#define _pcre2_xclass                PCRE2_SUFFIX(_pcre2_xclass_)
+
+extern int          _pcre2_auto_possessify(PCRE2_UCHAR *, BOOL,
+                      const compile_block *);
+extern int          _pcre2_check_escape(PCRE2_SPTR *, PCRE2_SPTR, uint32_t *,
+                      int *, uint32_t, BOOL, compile_block *);
+extern PCRE2_SPTR   _pcre2_find_bracket(PCRE2_SPTR, BOOL, int);
+extern BOOL         _pcre2_is_newline(PCRE2_SPTR, uint32_t, PCRE2_SPTR,
+                      uint32_t *, BOOL);
+extern void         _pcre2_jit_free_rodata(void *, void *);
+extern void         _pcre2_jit_free(void *, pcre2_memctl *);
+extern size_t       _pcre2_jit_get_size(void *);
+const char *        _pcre2_jit_get_target(void);
+extern void *       _pcre2_memctl_malloc(size_t, pcre2_memctl *);
+extern unsigned int _pcre2_ord2utf(uint32_t, PCRE2_UCHAR *);
+extern int          _pcre2_strcmp(PCRE2_SPTR, PCRE2_SPTR);
+extern int          _pcre2_strcmp_c8(PCRE2_SPTR, const char *);
+extern PCRE2_SIZE   _pcre2_strcpy_c8(PCRE2_UCHAR *, const char *);
+extern PCRE2_SIZE   _pcre2_strlen(PCRE2_SPTR);
+extern int          _pcre2_strncmp(PCRE2_SPTR, PCRE2_SPTR, size_t);
+extern int          _pcre2_strncmp_c8(PCRE2_SPTR, const char *, size_t);
+extern int          _pcre2_study(pcre2_real_code *);
+extern int          _pcre2_valid_utf(PCRE2_SPTR, PCRE2_SIZE, PCRE2_SIZE *);
+extern BOOL         _pcre2_was_newline(PCRE2_SPTR, uint32_t, PCRE2_SPTR,
+                      uint32_t *, BOOL);
+extern BOOL         _pcre2_xclass(uint32_t, PCRE2_SPTR, BOOL);
+#endif  /* PCRE2_CODE_UNIT_WIDTH */
+
+/* End of pcre2_internal.h */
diff --git a/dist2/src/pcre2_intmodedep.h b/dist2/src/pcre2_intmodedep.h
new file mode 100644
index 0000000..90b7959
--- /dev/null
+++ b/dist2/src/pcre2_intmodedep.h
@@ -0,0 +1,852 @@
+/*************************************************
+*      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
+     Original API code Copyright (c) 1997-2012 University of Cambridge
+         New API code Copyright (c) 2016 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 mode-dependent macro and structure definitions. The
+file is #included by pcre2_internal.h if PCRE2_CODE_UNIT_WIDTH is defined.
+These mode-dependent items are kept in a separate file so that they can also be
+#included multiple times for different code unit widths by pcre2test in order
+to have access to the hidden structures at all supported widths.
+
+Some of the mode-dependent macros are required at different widths for
+different parts of the pcre2test code (in particular, the included
+pcre_printint.c file). We undefine them here so that they can be re-defined for
+multiple inclusions. Not all of these are used in pcre2test, but it's easier
+just to undefine them all. */
+
+#undef ACROSSCHAR
+#undef BACKCHAR
+#undef BYTES2CU
+#undef CU2BYTES
+#undef FORWARDCHAR
+#undef FORWARDCHARTEST
+#undef GET
+#undef GET2
+#undef GETCHAR
+#undef GETCHARINC
+#undef GETCHARINCTEST
+#undef GETCHARLEN
+#undef GETCHARLENTEST
+#undef GETCHARTEST
+#undef GET_EXTRALEN
+#undef HAS_EXTRALEN
+#undef IMM2_SIZE
+#undef MAX_255
+#undef MAX_MARK
+#undef MAX_PATTERN_SIZE
+#undef MAX_UTF_SINGLE_CU
+#undef NOT_FIRSTCU
+#undef PUT
+#undef PUT2
+#undef PUT2INC
+#undef PUTCHAR
+#undef PUTINC
+#undef TABLE_GET
+
+
+
+/* -------------------------- MACROS ----------------------------- */
+
+/* PCRE keeps offsets in its compiled code as at least 16-bit quantities
+(always stored in big-endian order in 8-bit mode) by default. These are used,
+for example, to link from the start of a subpattern to its alternatives and its
+end. The use of 16 bits per offset limits the size of an 8-bit 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 compiled code
+unit 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, but
+values of 2 or 4 are also supported. */
+
+/* ------------------- 8-bit support  ------------------ */
+
+#if PCRE2_CODE_UNIT_WIDTH == 8
+
+#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 2, 3, or 4
+#endif
+
+
+/* ------------------- 16-bit support  ------------------ */
+
+#elif PCRE2_CODE_UNIT_WIDTH == 16
+
+#if LINK_SIZE == 2
+#undef LINK_SIZE
+#define LINK_SIZE 1
+#define PUT(a,n,d)   \
+  (a[n] = (d))
+#define GET(a,n) \
+  (a[n])
+#define MAX_PATTERN_SIZE (1 << 16)
+
+#elif LINK_SIZE == 3 || LINK_SIZE == 4
+#undef LINK_SIZE
+#define LINK_SIZE 2
+#define PUT(a,n,d)   \
+  (a[n] = (d) >> 16), \
+  (a[(n)+1] = (d) & 65535)
+#define GET(a,n) \
+  (((a)[n] << 16) | (a)[(n)+1])
+#define MAX_PATTERN_SIZE (1 << 30)  /* Keep it positive */
+
+#else
+#error LINK_SIZE must be 2, 3, or 4
+#endif
+
+
+/* ------------------- 32-bit support  ------------------ */
+
+#elif PCRE2_CODE_UNIT_WIDTH == 32
+#undef LINK_SIZE
+#define LINK_SIZE 1
+#define PUT(a,n,d)   \
+  (a[n] = (d))
+#define GET(a,n) \
+  (a[n])
+#define MAX_PATTERN_SIZE (1 << 30)  /* Keep it positive */
+
+#else
+#error Unsupported compiling mode
+#endif
+
+
+/* --------------- Other mode-specific macros ----------------- */
+
+/* PCRE uses some other (at least) 16-bit 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 the number of code units required to hold a 16-bit count/offset, and
+macros to load and store such a value. For reasons that I do not understand,
+the expression in the 8-bit GET2 macro is treated by gcc as a signed
+expression, even when a is declared as unsigned. It seems that any kind of
+arithmetic results in a signed value. Hence the cast. */
+
+#if PCRE2_CODE_UNIT_WIDTH == 8
+#define IMM2_SIZE 2
+#define GET2(a,n) (unsigned int)(((a)[n] << 8) | (a)[(n)+1])
+#define PUT2(a,n,d) a[n] = (d) >> 8, a[(n)+1] = (d) & 255
+
+#else  /* Code units are 16 or 32 bits */
+#define IMM2_SIZE 1
+#define GET2(a,n) a[n]
+#define PUT2(a,n,d) a[n] = d
+#endif
+
+/* Other macros that are different for 8-bit mode. The MAX_255 macro checks
+whether its argument is less than 256. The maximum length of a MARK name must
+fit in one code unit; currently it is set to 255 or 65535. The TABLE_GET macro
+is used to access elements of tables containing exactly 256 items. When code
+points can be greater than 255, a check is needed before accessing these
+tables. */
+
+#if PCRE2_CODE_UNIT_WIDTH == 8
+#define MAX_255(c) TRUE
+#define MAX_MARK ((1u << 8) - 1)
+#ifdef SUPPORT_UNICODE
+#define SUPPORT_WIDE_CHARS
+#endif  /* SUPPORT_UNICODE */
+#define TABLE_GET(c, table, default) ((table)[c])
+
+#else  /* Code units are 16 or 32 bits */
+#define MAX_255(c) ((c) <= 255u)
+#define MAX_MARK ((1u << 16) - 1)
+#define SUPPORT_WIDE_CHARS
+#define TABLE_GET(c, table, default) (MAX_255(c)? ((table)[c]):(default))
+#endif
+
+
+
+/* ----------------- Character-handling macros ----------------- */
+
+/* There is a proposed future special "UTF-21" mode, in which only the lowest
+21 bits of a 32-bit character are interpreted as UTF, with the remaining 11
+high-order bits available to the application for other uses. In preparation for
+the future implementation of this mode, there are macros that load a data item
+and, if in this special mode, mask it to 21 bits. These macros all have names
+starting with UCHAR21. In all other modes, including the normal 32-bit
+library, the macros all have the same simple definitions. When the new mode is
+implemented, it is expected that these definitions will be varied appropriately
+using #ifdef when compiling the library that supports the special mode. */
+
+#define UCHAR21(eptr)        (*(eptr))
+#define UCHAR21TEST(eptr)    (*(eptr))
+#define UCHAR21INC(eptr)     (*(eptr)++)
+#define UCHAR21INCTEST(eptr) (*(eptr)++)
+
+/* When UTF encoding is being used, a character is no longer just a single
+byte in 8-bit mode or a single short in 16-bit mode. The macros for character
+handling generate simple sequences when used in the basic mode, and more
+complicated ones for UTF characters. GETCHARLENTEST and other macros are not
+used when UTF is not supported. To make sure they can never even appear when
+UTF support is omitted, we don't even define them. */
+
+#ifndef SUPPORT_UNICODE
+
+/* #define MAX_UTF_SINGLE_CU */
+/* #define HAS_EXTRALEN(c) */
+/* #define GET_EXTRALEN(c) */
+/* #define NOT_FIRSTCU(c) */
+#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 PUTCHAR(c, p) (*p = c, 1)
+/* #define GETCHARLENTEST(c, eptr, len) */
+/* #define BACKCHAR(eptr) */
+/* #define FORWARDCHAR(eptr) */
+/* #define FORWARCCHARTEST(eptr,end) */
+/* #define ACROSSCHAR(condition, eptr, action) */
+
+#else   /* SUPPORT_UNICODE */
+
+/* ------------------- 8-bit support  ------------------ */
+
+#if PCRE2_CODE_UNIT_WIDTH == 8
+#define MAYBE_UTF_MULTI          /* UTF chars may use multiple code units */
+
+/* The largest UTF code point that can be encoded as a single code unit. */
+
+#define MAX_UTF_SINGLE_CU 127
+
+/* Tests whether the code point needs extra characters to decode. */
+
+#define HAS_EXTRALEN(c) HASUTF8EXTRALEN(c)
+
+/* Returns with the additional number of characters if IS_MULTICHAR(c) is TRUE.
+Otherwise it has an undefined behaviour. */
+
+#define GET_EXTRALEN(c) (PRIV(utf8_table4)[(c) & 0x3f])
+
+/* Returns TRUE, if the given value is not the first code unit of a UTF
+sequence. */
+
+#define NOT_FIRSTCU(c) (((c) & 0xc0) == 0x80)
+
+/* 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) GETUTF8(c, eptr);
+
+/* Get the next UTF-8 character, testing for UTF-8 mode, and not advancing the
+pointer. */
+
+#define GETCHARTEST(c, eptr) \
+  c = *eptr; \
+  if (utf && c >= 0xc0) GETUTF8(c, eptr);
+
+/* 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) GETUTF8INC(c, eptr);
+
+/* Get the next character, testing for UTF-8 mode, and advancing the pointer.
+This is called when we don't know if we are in UTF-8 mode. */
+
+#define GETCHARINCTEST(c, eptr) \
+  c = *eptr++; \
+  if (utf && c >= 0xc0) GETUTF8INC(c, eptr);
+
+/* 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) GETUTF8LEN(c, eptr, len);
+
+/* Get the next UTF-8 character, testing for UTF-8 mode, not advancing the
+pointer, incrementing length if there are extra bytes. This is called when we
+do not know if we are in UTF-8 mode. */
+
+#define GETCHARLENTEST(c, eptr, len) \
+  c = *eptr; \
+  if (utf && c >= 0xc0) GETUTF8LEN(c, eptr, len);
+
+/* If the pointer is not at the start of a character, move it back until
+it is. This is called only in UTF-8 mode - we don't put a test within the macro
+because almost all calls are already within a block of UTF-8 only code. */
+
+#define BACKCHAR(eptr) while((*eptr & 0xc0) == 0x80) eptr--
+
+/* Same as above, just in the other direction. */
+#define FORWARDCHAR(eptr) while((*eptr & 0xc0) == 0x80) eptr++
+#define FORWARDCHARTEST(eptr,end) while(eptr < end && (*eptr & 0xc0) == 0x80) eptr++
+
+/* Same as above, but it allows a fully customizable form. */
+#define ACROSSCHAR(condition, eptr, action) \
+  while((condition) && ((eptr) & 0xc0) == 0x80) action
+
+/* Deposit a character into memory, returning the number of code units. */
+
+#define PUTCHAR(c, p) ((utf && c > MAX_UTF_SINGLE_CU)? \
+  PRIV(ord2utf)(c,p) : (*p = c, 1))
+
+
+/* ------------------- 16-bit support  ------------------ */
+
+#elif PCRE2_CODE_UNIT_WIDTH == 16
+#define MAYBE_UTF_MULTI          /* UTF chars may use multiple code units */
+
+/* The largest UTF code point that can be encoded as a single code unit. */
+
+#define MAX_UTF_SINGLE_CU 65535
+
+/* Tests whether the code point needs extra characters to decode. */
+
+#define HAS_EXTRALEN(c) (((c) & 0xfc00) == 0xd800)
+
+/* Returns with the additional number of characters if IS_MULTICHAR(c) is TRUE.
+Otherwise it has an undefined behaviour. */
+
+#define GET_EXTRALEN(c) 1
+
+/* Returns TRUE, if the given value is not the first code unit of a UTF
+sequence. */
+
+#define NOT_FIRSTCU(c) (((c) & 0xfc00) == 0xdc00)
+
+/* Base macro to pick up the low surrogate of a UTF-16 character, not
+advancing the pointer. */
+
+#define GETUTF16(c, eptr) \
+   { c = (((c & 0x3ff) << 10) | (eptr[1] & 0x3ff)) + 0x10000; }
+
+/* Get the next UTF-16 character, not advancing the pointer. This is called when
+we know we are in UTF-16 mode. */
+
+#define GETCHAR(c, eptr) \
+  c = *eptr; \
+  if ((c & 0xfc00) == 0xd800) GETUTF16(c, eptr);
+
+/* Get the next UTF-16 character, testing for UTF-16 mode, and not advancing the
+pointer. */
+
+#define GETCHARTEST(c, eptr) \
+  c = *eptr; \
+  if (utf && (c & 0xfc00) == 0xd800) GETUTF16(c, eptr);
+
+/* Base macro to pick up the low surrogate of a UTF-16 character, advancing
+the pointer. */
+
+#define GETUTF16INC(c, eptr) \
+   { c = (((c & 0x3ff) << 10) | (*eptr++ & 0x3ff)) + 0x10000; }
+
+/* Get the next UTF-16 character, advancing the pointer. This is called when we
+know we are in UTF-16 mode. */
+
+#define GETCHARINC(c, eptr) \
+  c = *eptr++; \
+  if ((c & 0xfc00) == 0xd800) GETUTF16INC(c, eptr);
+
+/* Get the next character, testing for UTF-16 mode, and advancing the pointer.
+This is called when we don't know if we are in UTF-16 mode. */
+
+#define GETCHARINCTEST(c, eptr) \
+  c = *eptr++; \
+  if (utf && (c & 0xfc00) == 0xd800) GETUTF16INC(c, eptr);
+
+/* Base macro to pick up the low surrogate of a UTF-16 character, not
+advancing the pointer, incrementing the length. */
+
+#define GETUTF16LEN(c, eptr, len) \
+   { c = (((c & 0x3ff) << 10) | (eptr[1] & 0x3ff)) + 0x10000; len++; }
+
+/* Get the next UTF-16 character, not advancing the pointer, incrementing
+length if there is a low surrogate. This is called when we know we are in
+UTF-16 mode. */
+
+#define GETCHARLEN(c, eptr, len) \
+  c = *eptr; \
+  if ((c & 0xfc00) == 0xd800) GETUTF16LEN(c, eptr, len);
+
+/* Get the next UTF-816character, testing for UTF-16 mode, not advancing the
+pointer, incrementing length if there is a low surrogate. This is called when
+we do not know if we are in UTF-16 mode. */
+
+#define GETCHARLENTEST(c, eptr, len) \
+  c = *eptr; \
+  if (utf && (c & 0xfc00) == 0xd800) GETUTF16LEN(c, eptr, len);
+
+/* If the pointer is not at the start of a character, move it back until
+it is. This is called only in UTF-16 mode - we don't put a test within the
+macro because almost all calls are already within a block of UTF-16 only
+code. */
+
+#define BACKCHAR(eptr) if ((*eptr & 0xfc00) == 0xdc00) eptr--
+
+/* Same as above, just in the other direction. */
+#define FORWARDCHAR(eptr) if ((*eptr & 0xfc00) == 0xdc00) eptr++
+#define FORWARDCHARTEST(eptr,end) if (eptr < end && (*eptr & 0xfc00) == 0xdc00) eptr++
+
+/* Same as above, but it allows a fully customizable form. */
+#define ACROSSCHAR(condition, eptr, action) \
+  if ((condition) && ((eptr) & 0xfc00) == 0xdc00) action
+
+/* Deposit a character into memory, returning the number of code units. */
+
+#define PUTCHAR(c, p) ((utf && c > MAX_UTF_SINGLE_CU)? \
+  PRIV(ord2utf)(c,p) : (*p = c, 1))
+
+
+/* ------------------- 32-bit support  ------------------ */
+
+#else
+
+/* These are trivial for the 32-bit library, since all UTF-32 characters fit
+into one PCRE2_UCHAR unit. */
+
+#define MAX_UTF_SINGLE_CU (0x10ffffu)
+#define HAS_EXTRALEN(c) (0)
+#define GET_EXTRALEN(c) (0)
+#define NOT_FIRSTCU(c) (0)
+
+/* Get the next UTF-32 character, not advancing the pointer. This is called when
+we know we are in UTF-32 mode. */
+
+#define GETCHAR(c, eptr) \
+  c = *(eptr);
+
+/* Get the next UTF-32 character, testing for UTF-32 mode, and not advancing the
+pointer. */
+
+#define GETCHARTEST(c, eptr) \
+  c = *(eptr);
+
+/* Get the next UTF-32 character, advancing the pointer. This is called when we
+know we are in UTF-32 mode. */
+
+#define GETCHARINC(c, eptr) \
+  c = *((eptr)++);
+
+/* Get the next character, testing for UTF-32 mode, and advancing the pointer.
+This is called when we don't know if we are in UTF-32 mode. */
+
+#define GETCHARINCTEST(c, eptr) \
+  c = *((eptr)++);
+
+/* Get the next UTF-32 character, not advancing the pointer, not incrementing
+length (since all UTF-32 is of length 1). This is called when we know we are in
+UTF-32 mode. */
+
+#define GETCHARLEN(c, eptr, len) \
+  GETCHAR(c, eptr)
+
+/* Get the next UTF-32character, testing for UTF-32 mode, not advancing the
+pointer, not incrementing the length (since all UTF-32 is of length 1).
+This is called when we do not know if we are in UTF-32 mode. */
+
+#define GETCHARLENTEST(c, eptr, len) \
+  GETCHARTEST(c, eptr)
+
+/* If the pointer is not at the start of a character, move it back until
+it is. This is called only in UTF-32 mode - we don't put a test within the
+macro because almost all calls are already within a block of UTF-32 only
+code.
+
+These are all no-ops since all UTF-32 characters fit into one pcre_uchar. */
+
+#define BACKCHAR(eptr) do { } while (0)
+
+/* Same as above, just in the other direction. */
+
+#define FORWARDCHAR(eptr) do { } while (0)
+#define FORWARDCHARTEST(eptr,end) do { } while (0)
+
+/* Same as above, but it allows a fully customizable form. */
+
+#define ACROSSCHAR(condition, eptr, action) do { } while (0)
+
+/* Deposit a character into memory, returning the number of code units. */
+
+#define PUTCHAR(c, p) (*p = c, 1)
+
+#endif  /* UTF-32 character handling */
+#endif  /* SUPPORT_UNICODE */
+
+
+/* Mode-dependent macros that have the same definition in all modes. */
+
+#define CU2BYTES(x)     ((x)*((PCRE2_CODE_UNIT_WIDTH/8)))
+#define BYTES2CU(x)     ((x)/((PCRE2_CODE_UNIT_WIDTH/8)))
+#define PUTINC(a,n,d)   PUT(a,n,d), a += LINK_SIZE
+#define PUT2INC(a,n,d)  PUT2(a,n,d), a += IMM2_SIZE
+
+
+/* ----------------------- HIDDEN STRUCTURES ----------------------------- */
+
+/* NOTE: All these structures *must* start with a pcre2_memctl structure. The
+code that uses them is simpler because it assumes this. */
+
+/* The real general context structure. At present it holds only data for custom
+memory control. */
+
+typedef struct pcre2_real_general_context {
+  pcre2_memctl memctl;
+} pcre2_real_general_context;
+
+/* The real compile context structure */
+
+typedef struct pcre2_real_compile_context {
+  pcre2_memctl memctl;
+  int (*stack_guard)(uint32_t, void *);
+  void *stack_guard_data;
+  const uint8_t *tables;
+  PCRE2_SIZE max_pattern_length;
+  uint16_t bsr_convention;
+  uint16_t newline_convention;
+  uint32_t parens_nest_limit;
+} pcre2_real_compile_context;
+
+/* The real match context structure. */
+
+typedef struct pcre2_real_match_context {
+  pcre2_memctl memctl;
+#ifdef HEAP_MATCH_RECURSE
+  pcre2_memctl stack_memctl;
+#endif
+#ifdef SUPPORT_JIT
+  pcre2_jit_callback jit_callback;
+  void *jit_callback_data;
+#endif
+  int    (*callout)(pcre2_callout_block *, void *);
+  void    *callout_data;
+  PCRE2_SIZE offset_limit;
+  uint32_t match_limit;
+  uint32_t recursion_limit;
+} pcre2_real_match_context;
+
+/* The real compiled code structure. The type for the blocksize field is
+defined specially because it is required in pcre2_serialize_decode() when
+copying the size from possibly unaligned memory into a variable of the same
+type. Use a macro rather than a typedef to avoid compiler warnings when this
+file is included multiple times by pcre2test. LOOKBEHIND_MAX specifies the
+largest lookbehind that is supported. (OP_REVERSE in a pattern has a 16-bit
+argument in 8-bit and 16-bit modes, so we need no more than a 16-bit field
+here.) */
+
+#undef  CODE_BLOCKSIZE_TYPE
+#define CODE_BLOCKSIZE_TYPE size_t
+
+#undef  LOOKBEHIND_MAX
+#define LOOKBEHIND_MAX UINT16_MAX
+
+typedef struct pcre2_real_code {
+  pcre2_memctl memctl;            /* Memory control fields */
+  const uint8_t *tables;          /* The character tables */
+  void    *executable_jit;        /* Pointer to JIT code */
+  uint8_t  start_bitmap[32];      /* Bitmap for starting code unit < 256 */
+  CODE_BLOCKSIZE_TYPE blocksize;  /* Total (bytes) that was malloc-ed */
+  uint32_t magic_number;          /* Paranoid and endianness check */
+  uint32_t compile_options;       /* Options passed to pcre2_compile() */
+  uint32_t overall_options;       /* Options after processing the pattern */
+  uint32_t flags;                 /* Various state flags */
+  uint32_t limit_match;           /* Limit set in the pattern */
+  uint32_t limit_recursion;       /* Limit set in the pattern */
+  uint32_t first_codeunit;        /* Starting code unit */
+  uint32_t last_codeunit;         /* This codeunit must be seen */
+  uint16_t bsr_convention;        /* What \R matches */
+  uint16_t newline_convention;    /* What is a newline? */
+  uint16_t max_lookbehind;        /* Longest lookbehind (characters) */
+  uint16_t minlength;             /* Minimum length of match */
+  uint16_t top_bracket;           /* Highest numbered group */
+  uint16_t top_backref;           /* Highest numbered back reference */
+  uint16_t name_entry_size;       /* Size (code units) of table entries */
+  uint16_t name_count;            /* Number of name entries in the table */
+} pcre2_real_code;
+
+/* The real match data structure. */
+
+typedef struct pcre2_real_match_data {
+  pcre2_memctl     memctl;
+  const pcre2_real_code *code;    /* The pattern used for the match */
+  PCRE2_SPTR       subject;       /* The subject that was matched */
+  PCRE2_SPTR       mark;          /* Pointer to last mark */
+  PCRE2_SIZE       leftchar;      /* Offset to leftmost code unit */
+  PCRE2_SIZE       rightchar;     /* Offset to rightmost code unit */
+  PCRE2_SIZE       startchar;     /* Offset to starting code unit */
+  uint16_t         matchedby;     /* Type of match (normal, JIT, DFA) */
+  uint16_t         oveccount;     /* Number of pairs */
+  int              rc;            /* The return code from the match */
+  PCRE2_SIZE       ovector[1];    /* The first field */
+} pcre2_real_match_data;
+
+
+/* ----------------------- PRIVATE STRUCTURES ----------------------------- */
+
+/* These structures are not needed for pcre2test. */
+
+#ifndef PCRE2_PCRE2TEST
+
+/* Structure for checking for mutual recursion when scanning compiled code. */
+
+typedef struct recurse_check {
+  struct recurse_check *prev;
+  PCRE2_SPTR group;
+} recurse_check;
+
+/* Structure for building a cache when filling in recursion offsets. */
+
+typedef struct recurse_cache {
+  PCRE2_SPTR group;
+  int recno;
+} recurse_cache;
+
+/* Structure for maintaining a chain of pointers to the currently incomplete
+branches, for testing for left recursion while compiling. */
+
+typedef struct branch_chain {
+  struct branch_chain *outer;
+  PCRE2_UCHAR *current_branch;
+} branch_chain;
+
+/* Structure for building a list of named groups during the first pass of
+compiling. */
+
+typedef struct named_group {
+  PCRE2_SPTR   name;          /* Points to the name in the pattern */
+  uint32_t     number;        /* Group number */
+  uint16_t     length;        /* Length of the name */
+  uint16_t     isdup;         /* TRUE if a duplicate */
+} named_group;
+
+/* Structure for passing "static" information around between the functions
+doing the compiling, so that they are thread-safe. */
+
+typedef struct compile_block {
+  pcre2_real_compile_context *cx;  /* Points to the compile context */
+  const uint8_t *lcc;              /* Points to lower casing table */
+  const uint8_t *fcc;              /* Points to case-flipping table */
+  const uint8_t *cbits;            /* Points to character type table */
+  const uint8_t *ctypes;           /* Points to table of type maps */
+  PCRE2_SPTR start_workspace;      /* The start of working space */
+  PCRE2_SPTR start_code;           /* The start of the compiled code */
+  PCRE2_SPTR start_pattern;        /* The start of the pattern */
+  PCRE2_SPTR end_pattern;          /* The end of the pattern */
+  PCRE2_SPTR nestptr[2];           /* Pointer(s) saved for string substitution */
+  PCRE2_UCHAR *name_table;         /* The name/number table */
+  size_t workspace_size;           /* Size of workspace */
+  uint16_t names_found;            /* Number of entries so far */
+  uint16_t name_entry_size;        /* Size of each entry */
+  open_capitem *open_caps;         /* Chain of open capture items */
+  named_group *named_groups;       /* Points to vector in pre-compile */
+  uint32_t named_group_list_size;  /* Number of entries in the list */
+  uint32_t external_options;       /* External (initial) options */
+  uint32_t external_flags;         /* External flag bits to be set */
+  uint32_t bracount;               /* Count of capturing parens as we compile */
+  uint32_t final_bracount;         /* Saved value after first pass */
+  uint32_t *groupinfo;             /* Group info vector */
+  uint32_t top_backref;            /* Maximum back reference */
+  uint32_t backref_map;            /* Bitmap of low back refs */
+  uint32_t nltype;                 /* Newline type */
+  uint32_t nllen;                  /* Newline string length */
+  PCRE2_UCHAR nl[4];               /* Newline string when fixed length */
+  int  max_lookbehind;             /* Maximum lookbehind (characters) */
+  int  parens_depth;               /* Depth of nested parentheses */
+  int  assert_depth;               /* Depth of nested assertions */
+  int  req_varyopt;                /* "After variable item" flag for reqbyte */
+  BOOL had_accept;                 /* (*ACCEPT) encountered */
+  BOOL had_pruneorskip;            /* (*PRUNE) or (*SKIP) encountered */
+  BOOL had_recurse;                /* Had a recursion or subroutine call */
+  BOOL check_lookbehind;           /* Lookbehinds need later checking */
+  BOOL dupnames;                   /* Duplicate names exist */
+  BOOL iscondassert;               /* Next assert is a condition */
+} compile_block;
+
+/* Structure for keeping the properties of the in-memory stack used
+by the JIT matcher. */
+
+typedef struct pcre2_real_jit_stack {
+  pcre2_memctl memctl;
+  void* stack;
+} pcre2_real_jit_stack;
+
+/* Structure for keeping a chain of heap blocks used for saving ovectors
+during pattern recursion when the ovector is larger than can be saved on
+the system stack. */
+
+typedef struct ovecsave_frame {
+  struct ovecsave_frame *next;     /* Next frame on free chain */
+  PCRE2_SIZE saved_ovec[1];        /* First vector element */
+} ovecsave_frame;
+
+/* Structure for items in a linked list that represents an explicit recursive
+call within the pattern; used by pcre_match(). */
+
+typedef struct recursion_info {
+  struct recursion_info *prevrec;  /* Previous recursion record (or NULL) */
+  unsigned int group_num;          /* Number of group that was called */
+  PCRE2_SIZE *ovec_save;           /* Pointer to saved ovector frame */
+  uint32_t saved_capture_last;     /* Last capture number */
+  PCRE2_SPTR subject_position;     /* Position at start of recursion */
+} recursion_info;
+
+/* A similar structure for pcre_dfa_match(). */
+
+typedef struct dfa_recursion_info {
+  struct dfa_recursion_info *prevrec;
+  PCRE2_SPTR subject_position;
+  uint32_t group_num;
+} dfa_recursion_info;
+
+/* Structure for building a chain of data 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; used by
+pcre2_match(). */
+
+typedef struct eptrblock {
+  struct eptrblock *epb_prev;
+  PCRE2_SPTR epb_saved_eptr;
+} eptrblock;
+
+/* Structure for passing "static" information around between the functions
+doing traditional NFA matching (pcre2_match() and friends). */
+
+typedef struct match_block {
+  pcre2_memctl memctl;            /* For general use */
+#ifdef HEAP_MATCH_RECURSE
+  pcre2_memctl stack_memctl;      /* For "stack" frames */
+#endif
+  uint32_t match_call_count;      /* As it says */
+  uint32_t match_limit;           /* As it says */
+  uint32_t match_limit_recursion; /* As it says */
+  BOOL hitend;                    /* Hit the end of the subject at some point */
+  BOOL hasthen;                   /* Pattern contains (*THEN) */
+  const uint8_t *lcc;             /* Points to lower casing table */
+  const uint8_t *fcc;             /* Points to case-flipping table */
+  const uint8_t *ctypes;          /* Points to table of type maps */
+  PCRE2_SIZE *ovector;            /* Pointer to the offset vector */
+  PCRE2_SIZE offset_end;          /* One past the end */
+  PCRE2_SIZE offset_max;          /* The maximum usable for return data */
+  PCRE2_SIZE start_offset;        /* The start offset value */
+  PCRE2_SIZE end_offset_top;      /* Highwater mark at end of match */
+  uint16_t partial;               /* PARTIAL options */
+  uint16_t bsr_convention;        /* \R interpretation */
+  uint16_t name_count;            /* Number of names in name table */
+  uint16_t name_entry_size;       /* Size of entry in names table */
+  PCRE2_SPTR name_table;          /* Table of group names */
+  PCRE2_SPTR start_code;          /* For use when recursing */
+  PCRE2_SPTR start_subject;       /* Start of the subject string */
+  PCRE2_SPTR end_subject;         /* End of the subject string */
+  PCRE2_SPTR start_match_ptr;     /* Start of matched string */
+  PCRE2_SPTR end_match_ptr;       /* Subject position at end match */
+  PCRE2_SPTR start_used_ptr;      /* Earliest consulted character */
+  PCRE2_SPTR last_used_ptr;       /* Latest consulted character */
+  PCRE2_SPTR mark;                /* Mark pointer to pass back on success */
+  PCRE2_SPTR nomatch_mark;        /* Mark pointer to pass back on failure */
+  PCRE2_SPTR once_target;         /* Where to back up to for atomic groups */
+  uint32_t moptions;              /* Match options */
+  uint32_t poptions;              /* Pattern options */
+  uint32_t capture_last;          /* Most recent capture number + overflow flag */
+  uint32_t skip_arg_count;        /* For counting SKIP_ARGs */
+  uint32_t ignore_skip_arg;       /* For re-run when SKIP arg name not found */
+  uint32_t match_function_type;   /* Set for certain special calls of match() */
+  uint32_t nltype;                /* Newline type */
+  uint32_t nllen;                 /* Newline string length */
+  PCRE2_UCHAR nl[4];              /* Newline string when fixed */
+  eptrblock *eptrchain;           /* Chain of eptrblocks for tail recursions */
+  recursion_info *recursive;      /* Linked list of recursion data */
+  ovecsave_frame *ovecsave_chain; /* Linked list of free ovecsave blocks */
+  void  *callout_data;            /* To pass back to callouts */
+  int (*callout)(pcre2_callout_block *,void *);  /* Callout function or NULL */
+#ifdef HEAP_MATCH_RECURSE
+  void  *match_frames_base;       /* For remembering malloc'd frames */
+#endif
+} match_block;
+
+/* A similar structure is used for the same purpose by the DFA matching
+functions. */
+
+typedef struct dfa_match_block {
+  pcre2_memctl memctl;            /* For general use */
+  PCRE2_SPTR start_code;          /* Start of the compiled pattern */
+  PCRE2_SPTR start_subject ;      /* Start of the subject string */
+  PCRE2_SPTR end_subject;         /* End of subject string */
+  PCRE2_SPTR start_used_ptr;      /* Earliest consulted character */
+  PCRE2_SPTR last_used_ptr;       /* Latest consulted character */
+  const uint8_t *tables;          /* Character tables */
+  PCRE2_SIZE start_offset;        /* The start offset value */
+  uint32_t moptions;              /* Match options */
+  uint32_t poptions;              /* Pattern options */
+  uint32_t nltype;                /* Newline type */
+  uint32_t nllen;                 /* Newline string length */
+  PCRE2_UCHAR nl[4];              /* Newline string when fixed */
+  uint16_t bsr_convention;        /* \R interpretation */
+  void *callout_data;             /* To pass back to callouts */
+  int (*callout)(pcre2_callout_block *,void *);  /* Callout function or NULL */
+  dfa_recursion_info *recursive;  /* Linked list of recursion data */
+} dfa_match_block;
+
+#endif  /* PCRE2_PCRE2TEST */
+
+/* End of pcre2_intmodedep.h */
diff --git a/dist/pcre_jit_compile.c b/dist2/src/pcre2_jit_compile.c
similarity index 77%
rename from dist/pcre_jit_compile.c
rename to dist2/src/pcre2_jit_compile.c
index 445de0c..b46f4e3 100644
--- a/dist/pcre_jit_compile.c
+++ b/dist2/src/pcre2_jit_compile.c
@@ -6,10 +6,8 @@
 and semantics are as close as possible to those of the Perl 5 language.
 
                        Written by Philip Hazel
-           Copyright (c) 1997-2013 University of Cambridge
-
-  The machine code generator part (this module) was written by Zoltan Herczeg
-                      Copyright (c) 2010-2013
+     Original API code Copyright (c) 1997-2012 University of Cambridge
+         New API code Copyright (c) 2016 University of Cambridge
 
 -----------------------------------------------------------------------------
 Redistribution and use in source and binary forms, with or without
@@ -40,24 +38,43 @@
 -----------------------------------------------------------------------------
 */
 
+
 #ifdef HAVE_CONFIG_H
 #include "config.h"
 #endif
 
-#include "pcre_internal.h"
+#include "pcre2_internal.h"
 
-#if defined SUPPORT_JIT
+#ifdef SUPPORT_JIT
 
 /* All-in-one: Since we use the JIT compiler only from here,
 we just include it. This way we don't need to touch the build
 system files. */
 
-#define SLJIT_MALLOC(size, allocator_data) (PUBL(malloc))(size)
-#define SLJIT_FREE(ptr, allocator_data) (PUBL(free))(ptr)
 #define SLJIT_CONFIG_AUTO 1
 #define SLJIT_CONFIG_STATIC 1
 #define SLJIT_VERBOSE 0
+
+#ifdef PCRE2_DEBUG
+#define SLJIT_DEBUG 1
+#else
 #define SLJIT_DEBUG 0
+#endif
+
+#define SLJIT_MALLOC(size, allocator_data) pcre2_jit_malloc(size, allocator_data)
+#define SLJIT_FREE(ptr, allocator_data) pcre2_jit_free(ptr, allocator_data)
+
+static void * pcre2_jit_malloc(size_t size, void *allocator_data)
+{
+pcre2_memctl *allocator = ((pcre2_memctl*)allocator_data);
+return allocator->malloc(size, allocator->memory_data);
+}
+
+static void pcre2_jit_free(void *ptr, void *allocator_data)
+{
+pcre2_memctl *allocator = ((pcre2_memctl*)allocator_data);
+allocator->free(ptr, allocator->memory_data);
+}
 
 #include "sljit/sljitLir.c"
 
@@ -160,31 +177,29 @@
 typedef struct jit_arguments {
   /* Pointers first. */
   struct sljit_stack *stack;
-  const pcre_uchar *str;
-  const pcre_uchar *begin;
-  const pcre_uchar *end;
-  int *offsets;
-  pcre_uchar *uchar_ptr;
-  pcre_uchar *mark_ptr;
+  PCRE2_SPTR str;
+  PCRE2_SPTR begin;
+  PCRE2_SPTR end;
+  pcre2_match_data *match_data;
+  PCRE2_SPTR startchar_ptr;
+  PCRE2_UCHAR *mark_ptr;
+  int (*callout)(pcre2_callout_block *, void *);
   void *callout_data;
   /* Everything else after. */
-  pcre_uint32 limit_match;
-  int real_offset_count;
-  int offset_count;
-  pcre_uint8 notbol;
-  pcre_uint8 noteol;
-  pcre_uint8 notempty;
-  pcre_uint8 notempty_atstart;
+  sljit_uw offset_limit;
+  sljit_ui limit_match;
+  uint32_t oveccount;
+  uint32_t options;
 } jit_arguments;
 
+#define JIT_NUMBER_OF_COMPILE_MODES 3
+
 typedef struct executable_functions {
   void *executable_funcs[JIT_NUMBER_OF_COMPILE_MODES];
   void *read_only_data_heads[JIT_NUMBER_OF_COMPILE_MODES];
   sljit_uw executable_sizes[JIT_NUMBER_OF_COMPILE_MODES];
-  PUBL(jit_callback) callback;
-  void *userdata;
-  pcre_uint32 top_bracket;
-  pcre_uint32 limit_match;
+  sljit_ui top_bracket;
+  sljit_ui limit_match;
 } executable_functions;
 
 typedef struct jump_list {
@@ -228,7 +243,7 @@
   struct backtrack_common *top;
   jump_list *topbacktracks;
   /* Opcode pointer. */
-  pcre_uchar *cc;
+  PCRE2_SPTR cc;
 } backtrack_common;
 
 typedef struct assert_backtrack {
@@ -277,11 +292,25 @@
   struct sljit_label *matchingpath;
 } braminzero_backtrack;
 
-typedef struct iterator_backtrack {
+typedef struct char_iterator_backtrack {
   backtrack_common common;
   /* Next iteration. */
   struct sljit_label *matchingpath;
-} iterator_backtrack;
+  union {
+    jump_list *backtracks;
+    struct {
+      unsigned int othercasebit;
+      PCRE2_UCHAR chr;
+      BOOL enabled;
+    } charpos;
+  } u;
+} char_iterator_backtrack;
+
+typedef struct ref_iterator_backtrack {
+  backtrack_common common;
+  /* Next iteration. */
+  struct sljit_label *matchingpath;
+} ref_iterator_backtrack;
 
 typedef struct recurse_entry {
   struct recurse_entry *next;
@@ -319,44 +348,50 @@
   /* The sljit ceneric compiler. */
   struct sljit_compiler *compiler;
   /* First byte code. */
-  pcre_uchar *start;
+  PCRE2_SPTR start;
   /* Maps private data offset to each opcode. */
   sljit_si *private_data_ptrs;
   /* Chain list of read-only data ptrs. */
   void *read_only_data_head;
   /* Tells whether the capturing bracket is optimized. */
-  pcre_uint8 *optimized_cbracket;
+  sljit_ub *optimized_cbracket;
   /* Tells whether the starting offset is a target of then. */
-  pcre_uint8 *then_offsets;
+  sljit_ub *then_offsets;
   /* Current position where a THEN must jump. */
   then_trap_backtrack *then_trap;
   /* Starting offset of private data for capturing brackets. */
-  int cbra_ptr;
+  sljit_si cbra_ptr;
   /* Output vector starting point. Must be divisible by 2. */
-  int ovector_start;
+  sljit_si ovector_start;
+  /* Points to the starting character of the current match. */
+  sljit_si start_ptr;
   /* Last known position of the requested byte. */
-  int req_char_ptr;
+  sljit_si req_char_ptr;
   /* Head of the last recursion. */
-  int recursive_head_ptr;
-  /* First inspected character for partial matching. */
-  int start_used_ptr;
+  sljit_si recursive_head_ptr;
+  /* First inspected character for partial matching.
+     (Needed for avoiding zero length partial matches.) */
+  sljit_si start_used_ptr;
   /* Starting pointer for partial soft matches. */
-  int hit_start;
-  /* End pointer of the first line. */
-  int first_line_end;
+  sljit_si hit_start;
+  /* Pointer of the match end position. */
+  sljit_si match_end_ptr;
   /* Points to the marked string. */
-  int mark_ptr;
+  sljit_si mark_ptr;
   /* Recursive control verb management chain. */
-  int control_head_ptr;
+  sljit_si control_head_ptr;
   /* Points to the last matched capture block index. */
-  int capture_last_ptr;
-  /* Points to the starting position of the current match. */
-  int start_ptr;
+  sljit_si capture_last_ptr;
+  /* Fast forward skipping byte code pointer. */
+  PCRE2_SPTR fast_forward_bc_ptr;
+  /* Locals used by fast fail optimization. */
+  sljit_si fast_fail_start_ptr;
+  sljit_si fast_fail_end_ptr;
 
   /* Flipped and lower case tables. */
-  const pcre_uint8 *fcc;
+  const sljit_ub *fcc;
   sljit_sw lcc;
-  /* Mode can be PCRE_STUDY_JIT_COMPILE and others. */
+  /* Mode can be PCRE2_JIT_COMPLETE and others. */
   int mode;
   /* TRUE, when minlength is greater than 0. */
   BOOL might_be_empty;
@@ -366,26 +401,26 @@
   BOOL has_skip_arg;
   /* (*THEN) is found in the pattern. */
   BOOL has_then;
-  /* Needs to know the start position anytime. */
-  BOOL needs_start_ptr;
+  /* (*SKIP) or (*SKIP:arg) is found in lookbehind assertion. */
+  BOOL has_skip_in_assert_back;
   /* Currently in recurse or negative assert. */
   BOOL local_exit;
   /* Currently in a positive assert. */
   BOOL positive_assert;
   /* Newline control. */
   int nltype;
-  pcre_uint32 nlmax;
-  pcre_uint32 nlmin;
+  sljit_ui nlmax;
+  sljit_ui nlmin;
   int newline;
   int bsr_nltype;
-  pcre_uint32 bsr_nlmax;
-  pcre_uint32 bsr_nlmin;
+  sljit_ui bsr_nlmax;
+  sljit_ui bsr_nlmin;
   /* Dollar endonly. */
   int endonly;
   /* Tables. */
   sljit_sw ctypes;
   /* Named capturing brackets. */
-  pcre_uchar *name_table;
+  PCRE2_SPTR name_table;
   sljit_sw name_count;
   sljit_sw name_entry_size;
 
@@ -414,21 +449,18 @@
   jump_list *casefulcmp;
   jump_list *caselesscmp;
   jump_list *reset_match;
-  BOOL jscript_compat;
-#ifdef SUPPORT_UTF
+  BOOL unset_backref;
+  BOOL alt_circumflex;
+#ifdef SUPPORT_UNICODE
   BOOL utf;
-#ifdef SUPPORT_UCP
   BOOL use_ucp;
-#endif
-#ifdef COMPILE_PCRE8
+  jump_list *getucd;
+#if PCRE2_CODE_UNIT_WIDTH == 8
   jump_list *utfreadchar;
   jump_list *utfreadchar16;
   jump_list *utfreadtype8;
 #endif
-#endif /* SUPPORT_UTF */
-#ifdef SUPPORT_UCP
-  jump_list *getucd;
-#endif
+#endif /* SUPPORT_UNICODE */
 } compiler_common;
 
 /* For byte_sequence_compare. */
@@ -441,24 +473,24 @@
   union {
     sljit_si asint;
     sljit_uh asushort;
-#if defined COMPILE_PCRE8
+#if PCRE2_CODE_UNIT_WIDTH == 8
     sljit_ub asbyte;
     sljit_ub asuchars[4];
-#elif defined COMPILE_PCRE16
+#elif PCRE2_CODE_UNIT_WIDTH == 16
     sljit_uh asuchars[2];
-#elif defined COMPILE_PCRE32
+#elif PCRE2_CODE_UNIT_WIDTH == 32
     sljit_ui asuchars[1];
 #endif
   } c;
   union {
     sljit_si asint;
     sljit_uh asushort;
-#if defined COMPILE_PCRE8
+#if PCRE2_CODE_UNIT_WIDTH == 8
     sljit_ub asbyte;
     sljit_ub asuchars[4];
-#elif defined COMPILE_PCRE16
+#elif PCRE2_CODE_UNIT_WIDTH == 16
     sljit_uh asuchars[2];
-#elif defined COMPILE_PCRE32
+#elif PCRE2_CODE_UNIT_WIDTH == 32
     sljit_ui asuchars[1];
 #endif
   } oc;
@@ -500,15 +532,20 @@
 #define OVECTOR_PRIV(i)  (common->cbra_ptr + (i) * (sljit_sw)sizeof(sljit_sw))
 #define PRIVATE_DATA(cc) (common->private_data_ptrs[(cc) - common->start])
 
-#if defined COMPILE_PCRE8
+#if PCRE2_CODE_UNIT_WIDTH == 8
 #define MOV_UCHAR  SLJIT_MOV_UB
 #define MOVU_UCHAR SLJIT_MOVU_UB
-#elif defined COMPILE_PCRE16
+#define IN_UCHARS(x) (x)
+#elif PCRE2_CODE_UNIT_WIDTH == 16
 #define MOV_UCHAR  SLJIT_MOV_UH
 #define MOVU_UCHAR SLJIT_MOVU_UH
-#elif defined COMPILE_PCRE32
+#define UCHAR_SHIFT (1)
+#define IN_UCHARS(x) ((x) << UCHAR_SHIFT)
+#elif PCRE2_CODE_UNIT_WIDTH == 32
 #define MOV_UCHAR  SLJIT_MOV_UI
 #define MOVU_UCHAR SLJIT_MOVU_UI
+#define UCHAR_SHIFT (2)
+#define IN_UCHARS(x) ((x) << UCHAR_SHIFT)
 #else
 #error Unsupported compiling mode
 #endif
@@ -541,7 +578,7 @@
 
 #define READ_CHAR_MAX 0x7fffffff
 
-static pcre_uchar *bracketend(pcre_uchar *cc)
+static PCRE2_SPTR bracketend(PCRE2_SPTR cc)
 {
 SLJIT_ASSERT((*cc >= OP_ASSERT && *cc <= OP_ASSERTBACK_NOT) || (*cc >= OP_ONCE && *cc <= OP_SCOND));
 do cc += GET(cc, 1); while (*cc == OP_ALT);
@@ -550,7 +587,7 @@
 return cc;
 }
 
-static int no_alternatives(pcre_uchar *cc)
+static int no_alternatives(PCRE2_SPTR cc)
 {
 int count = 0;
 SLJIT_ASSERT((*cc >= OP_ASSERT && *cc <= OP_ASSERTBACK_NOT) || (*cc >= OP_ONCE && *cc <= OP_SCOND));
@@ -564,11 +601,6 @@
 return count;
 }
 
-static int ones_in_half_byte[16] = {
-  /* 0 */ 0, 1, 1, 2, /* 4 */ 1, 2, 2, 3,
-  /* 8 */ 1, 2, 2, 3, /* 12 */ 2, 3, 3, 4
-};
-
 /* Functions whose might need modification for all new supported opcodes:
  next_opcode
  check_opcode_types
@@ -581,7 +613,7 @@
  compile_backtrackingpath
 */
 
-static pcre_uchar *next_opcode(compiler_common *common, pcre_uchar *cc)
+static PCRE2_SPTR next_opcode(compiler_common *common, PCRE2_SPTR cc)
 {
 SLJIT_UNUSED_ARG(common);
 switch(*cc)
@@ -659,7 +691,8 @@
   case OP_DNCREF:
   case OP_RREF:
   case OP_DNRREF:
-  case OP_DEF:
+  case OP_FALSE:
+  case OP_TRUE:
   case OP_BRAZERO:
   case OP_BRAMINZERO:
   case OP_BRAPOSZERO:
@@ -731,7 +764,7 @@
   case OP_NOTPOSQUERYI:
   case OP_NOTPOSUPTOI:
   cc += PRIV(OP_lengths)[*cc];
-#ifdef SUPPORT_UTF
+#ifdef SUPPORT_UNICODE
   if (common->utf && HAS_EXTRALEN(cc[-1])) cc += GET_EXTRALEN(cc[-1]);
 #endif
   return cc;
@@ -753,12 +786,15 @@
   return cc + PRIV(OP_lengths)[*cc] - 1;
 
   case OP_ANYBYTE:
-#ifdef SUPPORT_UTF
+#ifdef SUPPORT_UNICODE
   if (common->utf) return NULL;
 #endif
   return cc + 1;
 
-#if defined SUPPORT_UTF || !defined COMPILE_PCRE8
+  case OP_CALLOUT_STR:
+  return cc + GET(cc, 1 + 2*LINK_SIZE);
+
+#if defined SUPPORT_UNICODE || PCRE2_CODE_UNIT_WIDTH != 8
   case OP_XCLASS:
   return cc + GET(cc, 1);
 #endif
@@ -776,10 +812,11 @@
   }
 }
 
-static BOOL check_opcode_types(compiler_common *common, pcre_uchar *cc, pcre_uchar *ccend)
+static BOOL check_opcode_types(compiler_common *common, PCRE2_SPTR cc, PCRE2_SPTR ccend)
 {
 int count;
-pcre_uchar *slot;
+PCRE2_SPTR slot;
+PCRE2_SPTR assert_back_end = cc - 1;
 
 /* Calculate important variables (like stack size) and checks whether all opcodes are supported. */
 while (cc < ccend)
@@ -808,7 +845,7 @@
     case OP_SCOND:
     /* Only AUTO_CALLOUT can insert this opcode. We do
        not intend to support this case. */
-    if (cc[1 + LINK_SIZE] == OP_CALLOUT)
+    if (cc[1 + LINK_SIZE] == OP_CALLOUT || cc[1 + LINK_SIZE] == OP_CALLOUT_STR)
       return FALSE;
     cc += 1 + LINK_SIZE;
     break;
@@ -842,12 +879,20 @@
     break;
 
     case OP_CALLOUT:
+    case OP_CALLOUT_STR:
     if (common->capture_last_ptr == 0)
       {
       common->capture_last_ptr = common->ovector_start;
       common->ovector_start += sizeof(sljit_sw);
       }
-    cc += 2 + 2 * LINK_SIZE;
+    cc += (*cc == OP_CALLOUT) ? PRIV(OP_lengths)[OP_CALLOUT] : GET(cc, 1 + 2*LINK_SIZE);
+    break;
+
+    case OP_ASSERTBACK:
+    slot = bracketend(cc);
+    if (slot > assert_back_end)
+      assert_back_end = slot;
+    cc += 1 + LINK_SIZE;
     break;
 
     case OP_THEN_ARG:
@@ -856,9 +901,6 @@
     /* Fall through. */
 
     case OP_PRUNE_ARG:
-    common->needs_start_ptr = TRUE;
-    /* Fall through. */
-
     case OP_MARK:
     if (common->mark_ptr == 0)
       {
@@ -871,17 +913,20 @@
     case OP_THEN:
     common->has_then = TRUE;
     common->control_head_ptr = 1;
-    /* Fall through. */
+    cc += 1;
+    break;
 
-    case OP_PRUNE:
     case OP_SKIP:
-    common->needs_start_ptr = TRUE;
+    if (cc < assert_back_end)
+      common->has_skip_in_assert_back = TRUE;
     cc += 1;
     break;
 
     case OP_SKIP_ARG:
     common->control_head_ptr = 1;
     common->has_skip_arg = TRUE;
+    if (cc < assert_back_end)
+      common->has_skip_in_assert_back = TRUE;
     cc += 1 + 2 + cc[1];
     break;
 
@@ -895,10 +940,191 @@
 return TRUE;
 }
 
-static int get_class_iterator_size(pcre_uchar *cc)
+static BOOL is_accelerated_repeat(PCRE2_SPTR cc)
 {
 switch(*cc)
   {
+  case OP_TYPESTAR:
+  case OP_TYPEMINSTAR:
+  case OP_TYPEPLUS:
+  case OP_TYPEMINPLUS:
+  case OP_TYPEPOSSTAR:
+  case OP_TYPEPOSPLUS:
+  return (cc[1] != OP_ANYNL && cc[1] != OP_EXTUNI);
+
+  case OP_STAR:
+  case OP_MINSTAR:
+  case OP_PLUS:
+  case OP_MINPLUS:
+  case OP_POSSTAR:
+  case OP_POSPLUS:
+
+  case OP_STARI:
+  case OP_MINSTARI:
+  case OP_PLUSI:
+  case OP_MINPLUSI:
+  case OP_POSSTARI:
+  case OP_POSPLUSI:
+
+  case OP_NOTSTAR:
+  case OP_NOTMINSTAR:
+  case OP_NOTPLUS:
+  case OP_NOTMINPLUS:
+  case OP_NOTPOSSTAR:
+  case OP_NOTPOSPLUS:
+
+  case OP_NOTSTARI:
+  case OP_NOTMINSTARI:
+  case OP_NOTPLUSI:
+  case OP_NOTMINPLUSI:
+  case OP_NOTPOSSTARI:
+  case OP_NOTPOSPLUSI:
+  return TRUE;
+
+  case OP_CLASS:
+  case OP_NCLASS:
+#if defined SUPPORT_UNICODE || PCRE2_CODE_UNIT_WIDTH != 8
+  case OP_XCLASS:
+  cc += (*cc == OP_XCLASS) ? GET(cc, 1) : (int)(1 + (32 / sizeof(PCRE2_UCHAR)));
+#else
+  cc += (1 + (32 / sizeof(PCRE2_UCHAR)));
+#endif
+
+  switch(*cc)
+    {
+    case OP_CRSTAR:
+    case OP_CRMINSTAR:
+    case OP_CRPLUS:
+    case OP_CRMINPLUS:
+    case OP_CRPOSSTAR:
+    case OP_CRPOSPLUS:
+    return TRUE;
+    }
+  break;
+  }
+return FALSE;
+}
+
+static SLJIT_INLINE BOOL detect_fast_forward_skip(compiler_common *common, int *private_data_start)
+{
+PCRE2_SPTR cc = common->start;
+PCRE2_SPTR end;
+
+/* Skip not repeated brackets. */
+while (TRUE)
+  {
+  switch(*cc)
+    {
+    case OP_SOD:
+    case OP_SOM:
+    case OP_SET_SOM:
+    case OP_NOT_WORD_BOUNDARY:
+    case OP_WORD_BOUNDARY:
+    case OP_EODN:
+    case OP_EOD:
+    case OP_CIRC:
+    case OP_CIRCM:
+    case OP_DOLL:
+    case OP_DOLLM:
+    /* Zero width assertions. */
+    cc++;
+    continue;
+    }
+
+  if (*cc != OP_BRA && *cc != OP_CBRA)
+    break;
+
+  end = cc + GET(cc, 1);
+  if (*end != OP_KET || PRIVATE_DATA(end) != 0)
+    return FALSE;
+  if (*cc == OP_CBRA)
+    {
+    if (common->optimized_cbracket[GET2(cc, 1 + LINK_SIZE)] == 0)
+      return FALSE;
+    cc += IMM2_SIZE;
+    }
+  cc += 1 + LINK_SIZE;
+  }
+
+if (is_accelerated_repeat(cc))
+  {
+  common->fast_forward_bc_ptr = cc;
+  common->private_data_ptrs[(cc + 1) - common->start] = *private_data_start;
+  *private_data_start += sizeof(sljit_sw);
+  return TRUE;
+  }
+return FALSE;
+}
+
+static SLJIT_INLINE void detect_fast_fail(compiler_common *common, PCRE2_SPTR cc, int *private_data_start, sljit_si depth)
+{
+  PCRE2_SPTR next_alt;
+
+  SLJIT_ASSERT(*cc == OP_BRA || *cc == OP_CBRA);
+
+  if (*cc == OP_CBRA && common->optimized_cbracket[GET2(cc, 1 + LINK_SIZE)] == 0)
+    return;
+
+  next_alt = bracketend(cc) - (1 + LINK_SIZE);
+  if (*next_alt != OP_KET || PRIVATE_DATA(next_alt) != 0)
+    return;
+
+  do
+    {
+    next_alt = cc + GET(cc, 1);
+
+    cc += 1 + LINK_SIZE + ((*cc == OP_CBRA) ? IMM2_SIZE : 0);
+
+    while (TRUE)
+      {
+      switch(*cc)
+        {
+        case OP_SOD:
+        case OP_SOM:
+        case OP_SET_SOM:
+        case OP_NOT_WORD_BOUNDARY:
+        case OP_WORD_BOUNDARY:
+        case OP_EODN:
+        case OP_EOD:
+        case OP_CIRC:
+        case OP_CIRCM:
+        case OP_DOLL:
+        case OP_DOLLM:
+        /* Zero width assertions. */
+        cc++;
+        continue;
+        }
+      break;
+      }
+
+    if (depth > 0 && (*cc == OP_BRA || *cc == OP_CBRA))
+      detect_fast_fail(common, cc, private_data_start, depth - 1);
+
+    if (is_accelerated_repeat(cc))
+      {
+      common->private_data_ptrs[(cc + 1) - common->start] = *private_data_start;
+
+      if (common->fast_fail_start_ptr == 0)
+        common->fast_fail_start_ptr = *private_data_start;
+
+      *private_data_start += sizeof(sljit_sw);
+      common->fast_fail_end_ptr = *private_data_start;
+
+      if (*private_data_start > SLJIT_MAX_LOCAL_SIZE)
+        return;
+      }
+
+    cc = next_alt;
+    }
+  while (*cc == OP_ALT);
+}
+
+static int get_class_iterator_size(PCRE2_SPTR cc)
+{
+sljit_ui min;
+sljit_ui max;
+switch(*cc)
+  {
   case OP_CRSTAR:
   case OP_CRPLUS:
   return 2;
@@ -911,24 +1137,29 @@
 
   case OP_CRRANGE:
   case OP_CRMINRANGE:
-  if (GET2(cc, 1) == GET2(cc, 1 + IMM2_SIZE))
-    return 0;
-  return 2;
+  min = GET2(cc, 1);
+  max = GET2(cc, 1 + IMM2_SIZE);
+  if (max == 0)
+    return (*cc == OP_CRRANGE) ? 2 : 1;
+  max -= min;
+  if (max > 2)
+    max = 2;
+  return max;
 
   default:
   return 0;
   }
 }
 
-static BOOL detect_repeat(compiler_common *common, pcre_uchar *begin)
+static BOOL detect_repeat(compiler_common *common, PCRE2_SPTR begin)
 {
-pcre_uchar *end = bracketend(begin);
-pcre_uchar *next;
-pcre_uchar *next_end;
-pcre_uchar *max_end;
-pcre_uchar type;
+PCRE2_SPTR end = bracketend(begin);
+PCRE2_SPTR next;
+PCRE2_SPTR next_end;
+PCRE2_SPTR max_end;
+PCRE2_UCHAR type;
 sljit_sw length = end - begin;
-int min, max, i;
+sljit_si min, max, i;
 
 /* Detect fixed iterations first. */
 if (end[-(1 + LINK_SIZE)] != OP_KET)
@@ -1057,11 +1288,11 @@
     case OP_TYPEUPTO: \
     case OP_TYPEMINUPTO:
 
-static void set_private_data_ptrs(compiler_common *common, int *private_data_start, pcre_uchar *ccend)
+static void set_private_data_ptrs(compiler_common *common, int *private_data_start, PCRE2_SPTR ccend)
 {
-pcre_uchar *cc = common->start;
-pcre_uchar *alternative;
-pcre_uchar *end = NULL;
+PCRE2_SPTR cc = common->start;
+PCRE2_SPTR alternative;
+PCRE2_SPTR end = NULL;
 int private_data_ptr = *private_data_start;
 int space, size, bracketlen;
 BOOL repeat_check = TRUE;
@@ -1186,11 +1417,11 @@
 
     case OP_CLASS:
     case OP_NCLASS:
-    size += 1 + 32 / sizeof(pcre_uchar);
+    size = 1 + 32 / sizeof(PCRE2_UCHAR);
     space = get_class_iterator_size(cc + size);
     break;
 
-#if defined SUPPORT_UTF || !defined COMPILE_PCRE8
+#if defined SUPPORT_UNICODE || PCRE2_CODE_UNIT_WIDTH != 8
     case OP_XCLASS:
     size = GET(cc, 1);
     space = get_class_iterator_size(cc + size);
@@ -1216,7 +1447,7 @@
     if (size < 0)
       {
       cc += -size;
-#ifdef SUPPORT_UTF
+#ifdef SUPPORT_UNICODE
       if (common->utf && HAS_EXTRALEN(cc[-1])) cc += GET_EXTRALEN(cc[-1]);
 #endif
       }
@@ -1239,7 +1470,7 @@
 }
 
 /* Returns with a frame_types (always < 0) if no need for frame. */
-static int get_framesize(compiler_common *common, pcre_uchar *cc, pcre_uchar *ccend, BOOL recursive, BOOL *needs_control_head)
+static int get_framesize(compiler_common *common, PCRE2_SPTR cc, PCRE2_SPTR ccend, BOOL recursive, BOOL *needs_control_head)
 {
 int length = 0;
 int possessive = 0;
@@ -1407,6 +1638,9 @@
     case OP_NCLASS:
     case OP_XCLASS:
 
+    case OP_CALLOUT:
+    case OP_CALLOUT_STR:
+
     cc = next_opcode(common, cc);
     SLJIT_ASSERT(cc != NULL);
     break;
@@ -1421,7 +1655,7 @@
 return stack_restore ? no_frame : no_stack;
 }
 
-static void init_frame(compiler_common *common, pcre_uchar *cc, pcre_uchar *ccend, int stackpos, int stacktop, BOOL recursive)
+static void init_frame(compiler_common *common, PCRE2_SPTR cc, PCRE2_SPTR ccend, int stackpos, int stacktop, BOOL recursive)
 {
 DEFINE_COMPILER;
 BOOL setsom_found = recursive;
@@ -1543,11 +1777,11 @@
 SLJIT_ASSERT(stackpos == STACK(stacktop));
 }
 
-static SLJIT_INLINE int get_private_data_copy_length(compiler_common *common, pcre_uchar *cc, pcre_uchar *ccend, BOOL needs_control_head)
+static SLJIT_INLINE int get_private_data_copy_length(compiler_common *common, PCRE2_SPTR cc, PCRE2_SPTR ccend, BOOL needs_control_head)
 {
 int private_data_length = needs_control_head ? 3 : 2;
 int size;
-pcre_uchar *alternative;
+PCRE2_SPTR alternative;
 /* Calculate the sum of the private machine words. */
 while (cc < ccend)
   {
@@ -1604,7 +1838,7 @@
     if (PRIVATE_DATA(cc))
       private_data_length++;
     cc += 2;
-#ifdef SUPPORT_UTF
+#ifdef SUPPORT_UNICODE
     if (common->utf && HAS_EXTRALEN(cc[-1])) cc += GET_EXTRALEN(cc[-1]);
 #endif
     break;
@@ -1613,7 +1847,7 @@
     if (PRIVATE_DATA(cc))
       private_data_length += 2;
     cc += 2;
-#ifdef SUPPORT_UTF
+#ifdef SUPPORT_UNICODE
     if (common->utf && HAS_EXTRALEN(cc[-1])) cc += GET_EXTRALEN(cc[-1]);
 #endif
     break;
@@ -1622,7 +1856,7 @@
     if (PRIVATE_DATA(cc))
       private_data_length += 2;
     cc += 2 + IMM2_SIZE;
-#ifdef SUPPORT_UTF
+#ifdef SUPPORT_UNICODE
     if (common->utf && HAS_EXTRALEN(cc[-1])) cc += GET_EXTRALEN(cc[-1]);
 #endif
     break;
@@ -1647,11 +1881,11 @@
 
     case OP_CLASS:
     case OP_NCLASS:
-#if defined SUPPORT_UTF || !defined COMPILE_PCRE8
+#if defined SUPPORT_UNICODE || PCRE2_CODE_UNIT_WIDTH != 8
     case OP_XCLASS:
-    size = (*cc == OP_XCLASS) ? GET(cc, 1) : 1 + 32 / (int)sizeof(pcre_uchar);
+    size = (*cc == OP_XCLASS) ? GET(cc, 1) : 1 + 32 / (int)sizeof(PCRE2_UCHAR);
 #else
-    size = 1 + 32 / (int)sizeof(pcre_uchar);
+    size = 1 + 32 / (int)sizeof(PCRE2_UCHAR);
 #endif
     if (PRIVATE_DATA(cc))
       private_data_length += get_class_iterator_size(cc + size);
@@ -1668,7 +1902,7 @@
 return private_data_length;
 }
 
-static void copy_private_data(compiler_common *common, pcre_uchar *cc, pcre_uchar *ccend,
+static void copy_private_data(compiler_common *common, PCRE2_SPTR cc, PCRE2_SPTR ccend,
   BOOL save, int stackptr, int stacktop, BOOL needs_control_head)
 {
 DEFINE_COMPILER;
@@ -1677,7 +1911,7 @@
 BOOL tmp1next = TRUE;
 BOOL tmp1empty = TRUE;
 BOOL tmp2empty = TRUE;
-pcre_uchar *alternative;
+PCRE2_SPTR alternative;
 enum {
   start,
   loop,
@@ -1798,7 +2032,7 @@
         srcw[0] = PRIVATE_DATA(cc);
         }
       cc += 2;
-#ifdef SUPPORT_UTF
+#ifdef SUPPORT_UNICODE
       if (common->utf && HAS_EXTRALEN(cc[-1])) cc += GET_EXTRALEN(cc[-1]);
 #endif
       break;
@@ -1811,7 +2045,7 @@
         srcw[1] = PRIVATE_DATA(cc) + sizeof(sljit_sw);
         }
       cc += 2;
-#ifdef SUPPORT_UTF
+#ifdef SUPPORT_UNICODE
       if (common->utf && HAS_EXTRALEN(cc[-1])) cc += GET_EXTRALEN(cc[-1]);
 #endif
       break;
@@ -1824,7 +2058,7 @@
         srcw[1] = PRIVATE_DATA(cc) + sizeof(sljit_sw);
         }
       cc += 2 + IMM2_SIZE;
-#ifdef SUPPORT_UTF
+#ifdef SUPPORT_UNICODE
       if (common->utf && HAS_EXTRALEN(cc[-1])) cc += GET_EXTRALEN(cc[-1]);
 #endif
       break;
@@ -1860,11 +2094,11 @@
 
       case OP_CLASS:
       case OP_NCLASS:
-#if defined SUPPORT_UTF || !defined COMPILE_PCRE8
+#if defined SUPPORT_UNICODE || PCRE2_CODE_UNIT_WIDTH != 8
       case OP_XCLASS:
-      size = (*cc == OP_XCLASS) ? GET(cc, 1) : 1 + 32 / (int)sizeof(pcre_uchar);
+      size = (*cc == OP_XCLASS) ? GET(cc, 1) : 1 + 32 / (int)sizeof(PCRE2_UCHAR);
 #else
-      size = 1 + 32 / (int)sizeof(pcre_uchar);
+      size = 1 + 32 / (int)sizeof(PCRE2_UCHAR);
 #endif
       if (PRIVATE_DATA(cc))
         switch(get_class_iterator_size(cc + size))
@@ -1990,9 +2224,9 @@
 SLJIT_ASSERT(cc == ccend && stackptr == stacktop && (save || (tmp1empty && tmp2empty)));
 }
 
-static SLJIT_INLINE pcre_uchar *set_then_offsets(compiler_common *common, pcre_uchar *cc, pcre_uint8 *current_offset)
+static SLJIT_INLINE PCRE2_SPTR set_then_offsets(compiler_common *common, PCRE2_SPTR cc, sljit_ub *current_offset)
 {
-pcre_uchar *end = bracketend(cc);
+PCRE2_SPTR end = bracketend(cc);
 BOOL has_alternatives = cc[GET(cc, 1)] == OP_ALT;
 
 /* Assert captures then. */
@@ -2113,6 +2347,7 @@
 /* May destroy all locals and registers except TMP2. */
 DEFINE_COMPILER;
 
+SLJIT_ASSERT(size > 0);
 OP2(SLJIT_ADD, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, size * sizeof(sljit_sw));
 #ifdef DESTROY_REGISTERS
 OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, 12345);
@@ -2127,6 +2362,7 @@
 static SLJIT_INLINE void free_stack(compiler_common *common, int size)
 {
 DEFINE_COMPILER;
+SLJIT_ASSERT(size > 0);
 OP2(SLJIT_SUB, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, size * sizeof(sljit_sw));
 }
 
@@ -2150,25 +2386,11 @@
 return result + 1;
 }
 
-static void free_read_only_data(void *current, void *allocator_data)
-{
-void *next;
-
-SLJIT_UNUSED_ARG(allocator_data);
-
-while (current != NULL)
-  {
-  next = *(void**)current;
-  SLJIT_FREE(current, allocator_data);
-  current = next;
-  }
-}
-
 static SLJIT_INLINE void reset_ovector(compiler_common *common, int length)
 {
 DEFINE_COMPILER;
 struct sljit_label *loop;
-int i;
+sljit_si i;
 
 /* At this point we can freely use all temporary registers. */
 SLJIT_ASSERT(length > 1);
@@ -2190,6 +2412,18 @@
   }
 }
 
+static SLJIT_INLINE void reset_fast_fail(compiler_common *common)
+{
+DEFINE_COMPILER;
+sljit_si i;
+
+SLJIT_ASSERT(common->fast_fail_start_ptr < common->fast_fail_end_ptr);
+
+OP2(SLJIT_SUB, TMP1, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
+for (i = common->fast_fail_start_ptr; i < common->fast_fail_end_ptr; i += sizeof(sljit_sw))
+  OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), i, TMP1, 0);
+}
+
 static SLJIT_INLINE void do_reset_match(compiler_common *common, int length)
 {
 DEFINE_COMPILER;
@@ -2225,7 +2459,7 @@
 OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(STACK_TOP), SLJIT_OFFSETOF(struct sljit_stack, base));
 }
 
-static sljit_sw SLJIT_CALL do_search_mark(sljit_sw *current, const pcre_uchar *skip_arg)
+static sljit_sw SLJIT_CALL do_search_mark(sljit_sw *current, PCRE2_SPTR skip_arg)
 {
 while (current != NULL)
   {
@@ -2235,7 +2469,7 @@
     break;
 
     case type_mark:
-    if (STRCMP_UC_UC(skip_arg, (pcre_uchar *)current[-3]) == 0)
+    if (PRIV(strcmp)(skip_arg, (PCRE2_SPTR)current[-3]) == 0)
       return current[-4];
     break;
 
@@ -2253,34 +2487,39 @@
 {
 DEFINE_COMPILER;
 struct sljit_label *loop;
-struct sljit_jump *early_quit;
 
 /* At this point we can freely use all registers. */
 OP1(SLJIT_MOV, SLJIT_S2, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(1));
 OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), OVECTOR(1), STR_PTR, 0);
 
 OP1(SLJIT_MOV, SLJIT_R0, 0, ARGUMENTS, 0);
+OP1(SLJIT_MOV, SLJIT_S0, 0, SLJIT_MEM1(SLJIT_SP), common->start_ptr);
 if (common->mark_ptr != 0)
   OP1(SLJIT_MOV, SLJIT_R2, 0, SLJIT_MEM1(SLJIT_SP), common->mark_ptr);
-OP1(SLJIT_MOV_SI, SLJIT_R1, 0, SLJIT_MEM1(SLJIT_R0), SLJIT_OFFSETOF(jit_arguments, offset_count));
+OP1(SLJIT_MOV_UI, SLJIT_R1, 0, SLJIT_MEM1(SLJIT_R0), SLJIT_OFFSETOF(jit_arguments, oveccount));
+OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_R0), SLJIT_OFFSETOF(jit_arguments, startchar_ptr), SLJIT_S0, 0);
 if (common->mark_ptr != 0)
   OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_R0), SLJIT_OFFSETOF(jit_arguments, mark_ptr), SLJIT_R2, 0);
-OP2(SLJIT_SUB, SLJIT_R2, 0, SLJIT_MEM1(SLJIT_R0), SLJIT_OFFSETOF(jit_arguments, offsets), SLJIT_IMM, sizeof(int));
-OP1(SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM1(SLJIT_R0), SLJIT_OFFSETOF(jit_arguments, begin));
+OP2(SLJIT_ADD, SLJIT_R2, 0, SLJIT_MEM1(SLJIT_R0), SLJIT_OFFSETOF(jit_arguments, match_data),
+  SLJIT_IMM, SLJIT_OFFSETOF(pcre2_match_data, ovector) - sizeof(PCRE2_SIZE));
+
 GET_LOCAL_BASE(SLJIT_S0, 0, OVECTOR_START);
-/* Unlikely, but possible */
-early_quit = CMP(SLJIT_EQUAL, SLJIT_R1, 0, SLJIT_IMM, 0);
+OP1(SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM1(SLJIT_R0), SLJIT_OFFSETOF(jit_arguments, begin));
+
 loop = LABEL();
 OP2(SLJIT_SUB, SLJIT_S1, 0, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_R0, 0);
 OP2(SLJIT_ADD, SLJIT_S0, 0, SLJIT_S0, 0, SLJIT_IMM, sizeof(sljit_sw));
 /* Copy the integer value to the output buffer */
-#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32
+#if PCRE2_CODE_UNIT_WIDTH == 16 || PCRE2_CODE_UNIT_WIDTH == 32
 OP2(SLJIT_ASHR, SLJIT_S1, 0, SLJIT_S1, 0, SLJIT_IMM, UCHAR_SHIFT);
 #endif
-OP1(SLJIT_MOVU_SI, SLJIT_MEM1(SLJIT_R2), sizeof(int), SLJIT_S1, 0);
+SLJIT_ASSERT(sizeof(PCRE2_SIZE) == 4 || sizeof(PCRE2_SIZE) == 8);
+if (sizeof(PCRE2_SIZE) == 4)
+  OP1(SLJIT_MOVU_UI, SLJIT_MEM1(SLJIT_R2), sizeof(PCRE2_SIZE), SLJIT_S1, 0);
+else
+  OP1(SLJIT_MOVU, SLJIT_MEM1(SLJIT_R2), sizeof(PCRE2_SIZE), SLJIT_S1, 0);
 OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_R1, 0, SLJIT_R1, 0, SLJIT_IMM, 1);
 JUMPTO(SLJIT_NOT_ZERO, loop);
-JUMPHERE(early_quit);
 
 /* Calculate the return value, which is the maximum ovector value. */
 if (topbracket > 1)
@@ -2302,41 +2541,35 @@
 static SLJIT_INLINE void return_with_partial_match(compiler_common *common, struct sljit_label *quit)
 {
 DEFINE_COMPILER;
-struct sljit_jump *jump;
+sljit_si mov_opcode;
 
 SLJIT_COMPILE_ASSERT(STR_END == SLJIT_S1, str_end_must_be_saved_reg2);
 SLJIT_ASSERT(common->start_used_ptr != 0 && common->start_ptr != 0
-  && (common->mode == JIT_PARTIAL_SOFT_COMPILE ? common->hit_start != 0 : common->hit_start == 0));
+  && (common->mode == PCRE2_JIT_PARTIAL_SOFT ? common->hit_start != 0 : common->hit_start == 0));
 
 OP1(SLJIT_MOV, SLJIT_R1, 0, ARGUMENTS, 0);
-OP1(SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_IMM, PCRE_ERROR_PARTIAL);
-OP1(SLJIT_MOV_SI, SLJIT_R2, 0, SLJIT_MEM1(SLJIT_R1), SLJIT_OFFSETOF(jit_arguments, real_offset_count));
-CMPTO(SLJIT_SIG_LESS, SLJIT_R2, 0, SLJIT_IMM, 2, quit);
+OP1(SLJIT_MOV, SLJIT_R2, 0, SLJIT_MEM1(SLJIT_SP),
+  common->mode == PCRE2_JIT_PARTIAL_SOFT ? common->hit_start : common->start_ptr);
+OP1(SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_IMM, PCRE2_ERROR_PARTIAL);
 
 /* Store match begin and end. */
 OP1(SLJIT_MOV, SLJIT_S0, 0, SLJIT_MEM1(SLJIT_R1), SLJIT_OFFSETOF(jit_arguments, begin));
-OP1(SLJIT_MOV, SLJIT_R1, 0, SLJIT_MEM1(SLJIT_R1), SLJIT_OFFSETOF(jit_arguments, offsets));
+OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_R1), SLJIT_OFFSETOF(jit_arguments, startchar_ptr), SLJIT_R2, 0);
+OP1(SLJIT_MOV, SLJIT_R1, 0, SLJIT_MEM1(SLJIT_R1), SLJIT_OFFSETOF(jit_arguments, match_data));
 
-jump = CMP(SLJIT_SIG_LESS, SLJIT_R2, 0, SLJIT_IMM, 3);
-OP2(SLJIT_SUB, SLJIT_R2, 0, SLJIT_MEM1(SLJIT_SP), common->mode == JIT_PARTIAL_HARD_COMPILE ? common->start_ptr : (common->hit_start + (int)sizeof(sljit_sw)), SLJIT_S0, 0);
-#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32
-OP2(SLJIT_ASHR, SLJIT_R2, 0, SLJIT_R2, 0, SLJIT_IMM, UCHAR_SHIFT);
-#endif
-OP1(SLJIT_MOV_SI, SLJIT_MEM1(SLJIT_R1), 2 * sizeof(int), SLJIT_R2, 0);
-JUMPHERE(jump);
-
-OP1(SLJIT_MOV, SLJIT_R2, 0, SLJIT_MEM1(SLJIT_SP), common->mode == JIT_PARTIAL_HARD_COMPILE ? common->start_used_ptr : common->hit_start);
-OP2(SLJIT_SUB, SLJIT_S1, 0, STR_END, 0, SLJIT_S0, 0);
-#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32
-OP2(SLJIT_ASHR, SLJIT_S1, 0, SLJIT_S1, 0, SLJIT_IMM, UCHAR_SHIFT);
-#endif
-OP1(SLJIT_MOV_SI, SLJIT_MEM1(SLJIT_R1), sizeof(int), SLJIT_S1, 0);
+mov_opcode = (sizeof(PCRE2_SIZE) == 4) ? SLJIT_MOV_UI : SLJIT_MOV;
 
 OP2(SLJIT_SUB, SLJIT_R2, 0, SLJIT_R2, 0, SLJIT_S0, 0);
-#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32
+#if PCRE2_CODE_UNIT_WIDTH == 16 || PCRE2_CODE_UNIT_WIDTH == 32
 OP2(SLJIT_ASHR, SLJIT_R2, 0, SLJIT_R2, 0, SLJIT_IMM, UCHAR_SHIFT);
 #endif
-OP1(SLJIT_MOV_SI, SLJIT_MEM1(SLJIT_R1), 0, SLJIT_R2, 0);
+OP1(mov_opcode, SLJIT_MEM1(SLJIT_R1), SLJIT_OFFSETOF(pcre2_match_data, ovector), SLJIT_R2, 0);
+
+OP2(SLJIT_SUB, STR_END, 0, STR_END, 0, SLJIT_S0, 0);
+#if PCRE2_CODE_UNIT_WIDTH == 16 || PCRE2_CODE_UNIT_WIDTH == 32
+OP2(SLJIT_ASHR, STR_END, 0, STR_END, 0, SLJIT_IMM, UCHAR_SHIFT);
+#endif
+OP1(mov_opcode, SLJIT_MEM1(SLJIT_R1), SLJIT_OFFSETOF(pcre2_match_data, ovector) + sizeof(PCRE2_SIZE), STR_END, 0);
 
 JUMPTO(SLJIT_JUMP, quit);
 }
@@ -2347,7 +2580,7 @@
 DEFINE_COMPILER;
 struct sljit_jump *jump;
 
-if (common->mode == JIT_PARTIAL_SOFT_COMPILE)
+if (common->mode == PCRE2_JIT_PARTIAL_SOFT)
   {
   /* The value of -1 must be kept for start_used_ptr! */
   OP2(SLJIT_ADD, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->start_used_ptr, SLJIT_IMM, 1);
@@ -2357,7 +2590,7 @@
   OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->start_used_ptr, STR_PTR, 0);
   JUMPHERE(jump);
   }
-else if (common->mode == JIT_PARTIAL_HARD_COMPILE)
+else if (common->mode == PCRE2_JIT_PARTIAL_HARD)
   {
   jump = CMP(SLJIT_LESS_EQUAL, SLJIT_MEM1(SLJIT_SP), common->start_used_ptr, STR_PTR, 0);
   OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->start_used_ptr, STR_PTR, 0);
@@ -2365,24 +2598,20 @@
   }
 }
 
-static SLJIT_INLINE BOOL char_has_othercase(compiler_common *common, pcre_uchar *cc)
+static SLJIT_INLINE BOOL char_has_othercase(compiler_common *common, PCRE2_SPTR cc)
 {
 /* Detects if the character has an othercase. */
 unsigned int c;
 
-#ifdef SUPPORT_UTF
+#ifdef SUPPORT_UNICODE
 if (common->utf)
   {
   GETCHAR(c, cc);
   if (c > 127)
     {
-#ifdef SUPPORT_UCP
     return c != UCD_OTHERCASE(c);
-#else
-    return FALSE;
-#endif
     }
-#ifndef COMPILE_PCRE8
+#if PCRE2_CODE_UNIT_WIDTH != 8
   return common->fcc[c] != c;
 #endif
   }
@@ -2395,28 +2624,24 @@
 static SLJIT_INLINE unsigned int char_othercase(compiler_common *common, unsigned int c)
 {
 /* Returns with the othercase. */
-#ifdef SUPPORT_UTF
+#ifdef SUPPORT_UNICODE
 if (common->utf && c > 127)
   {
-#ifdef SUPPORT_UCP
   return UCD_OTHERCASE(c);
-#else
-  return c;
-#endif
   }
 #endif
 return TABLE_GET(c, common->fcc, c);
 }
 
-static unsigned int char_get_othercase_bit(compiler_common *common, pcre_uchar *cc)
+static unsigned int char_get_othercase_bit(compiler_common *common, PCRE2_SPTR cc)
 {
 /* Detects if the character and its othercase has only 1 bit difference. */
 unsigned int c, oc, bit;
-#if defined SUPPORT_UTF && defined COMPILE_PCRE8
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH == 8
 int n;
 #endif
 
-#ifdef SUPPORT_UTF
+#ifdef SUPPORT_UNICODE
 if (common->utf)
   {
   GETCHAR(c, cc);
@@ -2424,11 +2649,7 @@
     oc = common->fcc[c];
   else
     {
-#ifdef SUPPORT_UCP
     oc = UCD_OTHERCASE(c);
-#else
-    oc = c;
-#endif
     }
   }
 else
@@ -2452,9 +2673,9 @@
 if (!is_powerof2(bit))
   return 0;
 
-#if defined COMPILE_PCRE8
+#if PCRE2_CODE_UNIT_WIDTH == 8
 
-#ifdef SUPPORT_UTF
+#ifdef SUPPORT_UNICODE
 if (common->utf && c > 127)
   {
   n = GET_EXTRALEN(*cc);
@@ -2465,12 +2686,12 @@
     }
   return (n << 8) | bit;
   }
-#endif /* SUPPORT_UTF */
+#endif /* SUPPORT_UNICODE */
 return (0 << 8) | bit;
 
-#elif defined COMPILE_PCRE16 || defined COMPILE_PCRE32
+#elif PCRE2_CODE_UNIT_WIDTH == 16 || PCRE2_CODE_UNIT_WIDTH == 32
 
-#ifdef SUPPORT_UTF
+#ifdef SUPPORT_UNICODE
 if (common->utf && c > 65535)
   {
   if (bit >= (1 << 10))
@@ -2478,10 +2699,10 @@
   else
     return (bit < 256) ? ((2 << 8) | bit) : ((3 << 8) | (bit >> 8));
   }
-#endif /* SUPPORT_UTF */
+#endif /* SUPPORT_UNICODE */
 return (bit < 256) ? ((0 << 8) | bit) : ((1 << 8) | (bit >> 8));
 
-#endif /* COMPILE_PCRE[8|16|32] */
+#endif /* PCRE2_CODE_UNIT_WIDTH == [8|16|32] */
 }
 
 static void check_partial(compiler_common *common, BOOL force)
@@ -2490,17 +2711,17 @@
 DEFINE_COMPILER;
 struct sljit_jump *jump = NULL;
 
-SLJIT_ASSERT(!force || common->mode != JIT_COMPILE);
+SLJIT_ASSERT(!force || common->mode != PCRE2_JIT_COMPLETE);
 
-if (common->mode == JIT_COMPILE)
+if (common->mode == PCRE2_JIT_COMPLETE)
   return;
 
 if (!force)
   jump = CMP(SLJIT_GREATER_EQUAL, SLJIT_MEM1(SLJIT_SP), common->start_used_ptr, STR_PTR, 0);
-else if (common->mode == JIT_PARTIAL_SOFT_COMPILE)
+else if (common->mode == PCRE2_JIT_PARTIAL_SOFT)
   jump = CMP(SLJIT_EQUAL, SLJIT_MEM1(SLJIT_SP), common->start_used_ptr, SLJIT_IMM, -1);
 
-if (common->mode == JIT_PARTIAL_SOFT_COMPILE)
+if (common->mode == PCRE2_JIT_PARTIAL_SOFT)
   OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->hit_start, SLJIT_IMM, 0);
 else
   {
@@ -2520,14 +2741,14 @@
 DEFINE_COMPILER;
 struct sljit_jump *jump;
 
-if (common->mode == JIT_COMPILE)
+if (common->mode == PCRE2_JIT_COMPLETE)
   {
   add_jump(compiler, end_reached, CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0));
   return;
   }
 
 jump = CMP(SLJIT_LESS, STR_PTR, 0, STR_END, 0);
-if (common->mode == JIT_PARTIAL_SOFT_COMPILE)
+if (common->mode == PCRE2_JIT_PARTIAL_SOFT)
   {
   add_jump(compiler, end_reached, CMP(SLJIT_GREATER_EQUAL, SLJIT_MEM1(SLJIT_SP), common->start_used_ptr, STR_PTR, 0));
   OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->hit_start, SLJIT_IMM, 0);
@@ -2549,7 +2770,7 @@
 DEFINE_COMPILER;
 struct sljit_jump *jump;
 
-if (common->mode == JIT_COMPILE)
+if (common->mode == PCRE2_JIT_COMPLETE)
   {
   add_jump(compiler, backtracks, CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0));
   return;
@@ -2558,7 +2779,7 @@
 /* Partial matching mode. */
 jump = CMP(SLJIT_LESS, STR_PTR, 0, STR_END, 0);
 add_jump(compiler, backtracks, CMP(SLJIT_GREATER_EQUAL, SLJIT_MEM1(SLJIT_SP), common->start_used_ptr, STR_PTR, 0));
-if (common->mode == JIT_PARTIAL_SOFT_COMPILE)
+if (common->mode == PCRE2_JIT_PARTIAL_SOFT)
   {
   OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->hit_start, SLJIT_IMM, 0);
   add_jump(compiler, backtracks, JUMP(SLJIT_JUMP));
@@ -2573,19 +2794,19 @@
 JUMPHERE(jump);
 }
 
-static void peek_char(compiler_common *common, pcre_uint32 max)
+static void peek_char(compiler_common *common, sljit_ui max)
 {
 /* Reads the character into TMP1, keeps STR_PTR.
 Does not check STR_END. TMP2 Destroyed. */
 DEFINE_COMPILER;
-#if defined SUPPORT_UTF && !defined COMPILE_PCRE32
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
 struct sljit_jump *jump;
 #endif
 
 SLJIT_UNUSED_ARG(max);
 
 OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), 0);
-#if defined SUPPORT_UTF && defined COMPILE_PCRE8
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH == 8
 if (common->utf)
   {
   if (max < 128) return;
@@ -2596,9 +2817,9 @@
   OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, TMP2, 0);
   JUMPHERE(jump);
   }
-#endif /* SUPPORT_UTF && !COMPILE_PCRE32 */
+#endif /* SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32 */
 
-#if defined SUPPORT_UTF && defined COMPILE_PCRE16
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH == 16
 if (common->utf)
   {
   if (max < 0xd800) return;
@@ -2616,14 +2837,14 @@
 #endif
 }
 
-#if defined SUPPORT_UTF && defined COMPILE_PCRE8
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH == 8
 
-static BOOL is_char7_bitset(const pcre_uint8 *bitset, BOOL nclass)
+static BOOL is_char7_bitset(const sljit_ub *bitset, BOOL nclass)
 {
 /* Tells whether the character codes below 128 are enough
 to determine a match. */
-const pcre_uint8 value = nclass ? 0xff : 0;
-const pcre_uint8 *end = bitset + 32;
+const sljit_ub value = nclass ? 0xff : 0;
+const sljit_ub *end = bitset + 32;
 
 bitset += 16;
 do
@@ -2659,18 +2880,18 @@
   }
 }
 
-#endif /* SUPPORT_UTF && COMPILE_PCRE8 */
+#endif /* SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH == 8 */
 
-static void read_char_range(compiler_common *common, pcre_uint32 min, pcre_uint32 max, BOOL update_str_ptr)
+static void read_char_range(compiler_common *common, sljit_ui min, sljit_ui max, BOOL update_str_ptr)
 {
 /* Reads the precise value of a character into TMP1, if the character is
 between min and max (c >= min && c <= max). Otherwise it returns with a value
 outside the range. Does not check STR_END. */
 DEFINE_COMPILER;
-#if defined SUPPORT_UTF && !defined COMPILE_PCRE32
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
 struct sljit_jump *jump;
 #endif
-#if defined SUPPORT_UTF && defined COMPILE_PCRE8
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH == 8
 struct sljit_jump *jump2;
 #endif
 
@@ -2682,7 +2903,7 @@
 OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0));
 OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
 
-#if defined SUPPORT_UTF && defined COMPILE_PCRE8
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH == 8
 if (common->utf)
   {
   if (max < 128 && !update_str_ptr) return;
@@ -2757,7 +2978,7 @@
   }
 #endif
 
-#if defined SUPPORT_UTF && defined COMPILE_PCRE16
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH == 16
 if (common->utf)
   {
   if (max >= 0x10000)
@@ -2798,10 +3019,10 @@
 {
 /* Reads the character type into TMP1, updates STR_PTR. Does not check STR_END. */
 DEFINE_COMPILER;
-#if defined SUPPORT_UTF || !defined COMPILE_PCRE8
+#if defined SUPPORT_UNICODE || PCRE2_CODE_UNIT_WIDTH != 8
 struct sljit_jump *jump;
 #endif
-#if defined SUPPORT_UTF && defined COMPILE_PCRE8
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH == 8
 struct sljit_jump *jump2;
 #endif
 
@@ -2810,7 +3031,7 @@
 OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), 0);
 OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
 
-#if defined SUPPORT_UTF && defined COMPILE_PCRE8
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH == 8
 if (common->utf)
   {
   /* This can be an extra read in some situations, but hopefully
@@ -2835,19 +3056,19 @@
   JUMPHERE(jump);
   return;
   }
-#endif /* SUPPORT_UTF && COMPILE_PCRE8 */
+#endif /* SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH == 8 */
 
-#if !defined COMPILE_PCRE8
+#if PCRE2_CODE_UNIT_WIDTH != 8
 /* The ctypes array contains only 256 values. */
 OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, 0);
 jump = CMP(SLJIT_GREATER, TMP2, 0, SLJIT_IMM, 255);
 #endif
 OP1(SLJIT_MOV_UB, TMP1, 0, SLJIT_MEM1(TMP2), common->ctypes);
-#if !defined COMPILE_PCRE8
+#if PCRE2_CODE_UNIT_WIDTH != 8
 JUMPHERE(jump);
 #endif
 
-#if defined SUPPORT_UTF && defined COMPILE_PCRE16
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH == 16
 if (common->utf && update_str_ptr)
   {
   /* Skip low surrogate if necessary. */
@@ -2856,15 +3077,15 @@
   OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
   JUMPHERE(jump);
   }
-#endif /* SUPPORT_UTF && COMPILE_PCRE16 */
+#endif /* SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH == 16 */
 }
 
 static void skip_char_back(compiler_common *common)
 {
 /* Goes one character back. Affects STR_PTR and TMP1. Does not check begin. */
 DEFINE_COMPILER;
-#if defined SUPPORT_UTF && !defined COMPILE_PCRE32
-#if defined COMPILE_PCRE8
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
+#if PCRE2_CODE_UNIT_WIDTH == 8
 struct sljit_label *label;
 
 if (common->utf)
@@ -2876,7 +3097,7 @@
   CMPTO(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, 0x80, label);
   return;
   }
-#elif defined COMPILE_PCRE16
+#elif PCRE2_CODE_UNIT_WIDTH == 16
 if (common->utf)
   {
   OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), -IN_UCHARS(1));
@@ -2889,8 +3110,8 @@
   OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, TMP1, 0);
   return;
   }
-#endif /* COMPILE_PCRE[8|16] */
-#endif /* SUPPORT_UTF && !COMPILE_PCRE32 */
+#endif /* PCRE2_CODE_UNIT_WIDTH == [8|16] */
+#endif /* SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32 */
 OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
 }
 
@@ -2926,9 +3147,9 @@
   }
 }
 
-#ifdef SUPPORT_UTF
+#ifdef SUPPORT_UNICODE
 
-#if defined COMPILE_PCRE8
+#if PCRE2_CODE_UNIT_WIDTH == 8
 static void do_utfreadchar(compiler_common *common)
 {
 /* Fast decoding a UTF-8 character. TMP1 contains the first byte
@@ -3049,11 +3270,7 @@
 sljit_emit_fast_return(compiler, RETURN_ADDR, 0);
 }
 
-#endif /* COMPILE_PCRE8 */
-
-#endif /* SUPPORT_UTF */
-
-#ifdef SUPPORT_UCP
+#endif /* PCRE2_CODE_UNIT_WIDTH == 8 */
 
 /* UCD_BLOCK_SIZE must be 128 (see the assert below). */
 #define UCD_BLOCK_MASK 127
@@ -3079,31 +3296,34 @@
 OP1(SLJIT_MOV_UB, TMP1, 0, SLJIT_MEM2(TMP1, TMP2), 3);
 sljit_emit_fast_return(compiler, RETURN_ADDR, 0);
 }
-#endif
 
-static SLJIT_INLINE struct sljit_label *mainloop_entry(compiler_common *common, BOOL hascrorlf, BOOL firstline)
+#endif /* SUPPORT_UNICODE */
+
+static SLJIT_INLINE struct sljit_label *mainloop_entry(compiler_common *common, BOOL hascrorlf, uint32_t overall_options)
 {
 DEFINE_COMPILER;
 struct sljit_label *mainloop;
 struct sljit_label *newlinelabel = NULL;
 struct sljit_jump *start;
 struct sljit_jump *end = NULL;
-struct sljit_jump *nl = NULL;
-#if defined SUPPORT_UTF && !defined COMPILE_PCRE32
+struct sljit_jump *end2 = NULL;
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
 struct sljit_jump *singlechar;
 #endif
 jump_list *newline = NULL;
 BOOL newlinecheck = FALSE;
 BOOL readuchar = FALSE;
 
-if (!(hascrorlf || firstline) && (common->nltype == NLTYPE_ANY ||
-    common->nltype == NLTYPE_ANYCRLF || common->newline > 255))
+if (!(hascrorlf || (overall_options & PCRE2_FIRSTLINE) != 0)
+    && (common->nltype == NLTYPE_ANY || common->nltype == NLTYPE_ANYCRLF || common->newline > 255))
   newlinecheck = TRUE;
 
-if (firstline)
+SLJIT_ASSERT(common->forced_quit_label == NULL);
+
+if ((overall_options & PCRE2_FIRSTLINE) != 0)
   {
   /* Search for the end of the first line. */
-  SLJIT_ASSERT(common->first_line_end != 0);
+  SLJIT_ASSERT(common->match_end_ptr != 0);
   OP1(SLJIT_MOV, TMP3, 0, STR_PTR, 0);
 
   if (common->nltype == NLTYPE_FIXED && common->newline > 255)
@@ -3116,24 +3336,49 @@
     CMPTO(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, (common->newline >> 8) & 0xff, mainloop);
     CMPTO(SLJIT_NOT_EQUAL, TMP2, 0, SLJIT_IMM, common->newline & 0xff, mainloop);
     JUMPHERE(end);
-    OP2(SLJIT_SUB, SLJIT_MEM1(SLJIT_SP), common->first_line_end, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
+    OP2(SLJIT_SUB, SLJIT_MEM1(SLJIT_SP), common->match_end_ptr, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
     }
   else
     {
     end = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0);
     mainloop = LABEL();
     /* Continual stores does not cause data dependency. */
-    OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->first_line_end, STR_PTR, 0);
+    OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->match_end_ptr, STR_PTR, 0);
     read_char_range(common, common->nlmin, common->nlmax, TRUE);
     check_newlinechar(common, common->nltype, &newline, TRUE);
     CMPTO(SLJIT_LESS, STR_PTR, 0, STR_END, 0, mainloop);
     JUMPHERE(end);
-    OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->first_line_end, STR_PTR, 0);
+    OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->match_end_ptr, STR_PTR, 0);
     set_jumps(newline, LABEL());
     }
 
   OP1(SLJIT_MOV, STR_PTR, 0, TMP3, 0);
   }
+else if ((overall_options & PCRE2_USE_OFFSET_LIMIT) != 0)
+  {
+  /* Check whether offset limit is set and valid. */
+  SLJIT_ASSERT(common->match_end_ptr != 0);
+
+  OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0);
+  OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, offset_limit));
+  OP1(SLJIT_MOV, TMP2, 0, STR_END, 0);
+  end = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, (sljit_sw) PCRE2_UNSET);
+  OP1(SLJIT_MOV, TMP2, 0, ARGUMENTS, 0);
+#if PCRE2_CODE_UNIT_WIDTH == 16
+  OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 1);
+#elif PCRE2_CODE_UNIT_WIDTH == 32
+  OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 2);
+#endif
+  OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(jit_arguments, begin));
+  OP2(SLJIT_ADD, TMP2, 0, TMP2, 0, TMP1, 0);
+  end2 = CMP(SLJIT_LESS_EQUAL, TMP2, 0, STR_END, 0);
+  OP1(SLJIT_MOV, TMP2, 0, STR_END, 0);
+  JUMPHERE(end2);
+  OP1(SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_IMM, PCRE2_ERROR_NOMATCH);
+  add_jump(compiler, &common->forced_quit, CMP(SLJIT_LESS, TMP2, 0, STR_PTR, 0));
+  JUMPHERE(end);
+  OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->match_end_ptr, TMP2, 0);
+  }
 
 start = JUMP(SLJIT_JUMP);
 
@@ -3145,17 +3390,17 @@
   OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), 0);
   OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, common->newline & 0xff);
   OP_FLAGS(SLJIT_MOV, TMP1, 0, SLJIT_UNUSED, 0, SLJIT_EQUAL);
-#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32
+#if PCRE2_CODE_UNIT_WIDTH == 16 || PCRE2_CODE_UNIT_WIDTH == 32
   OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, UCHAR_SHIFT);
 #endif
   OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0);
-  nl = JUMP(SLJIT_JUMP);
+  end2 = JUMP(SLJIT_JUMP);
   }
 
 mainloop = LABEL();
 
 /* Increasing the STR_PTR here requires one less jump in the most common case. */
-#ifdef SUPPORT_UTF
+#ifdef SUPPORT_UNICODE
 if (common->utf) readuchar = TRUE;
 #endif
 if (newlinecheck) readuchar = TRUE;
@@ -3167,8 +3412,8 @@
   CMPTO(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, (common->newline >> 8) & 0xff, newlinelabel);
 
 OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
-#if defined SUPPORT_UTF && !defined COMPILE_PCRE32
-#if defined COMPILE_PCRE8
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
+#if PCRE2_CODE_UNIT_WIDTH == 8
 if (common->utf)
   {
   singlechar = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0xc0);
@@ -3176,7 +3421,7 @@
   OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0);
   JUMPHERE(singlechar);
   }
-#elif defined COMPILE_PCRE16
+#elif PCRE2_CODE_UNIT_WIDTH == 16
 if (common->utf)
   {
   singlechar = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0xd800);
@@ -3187,65 +3432,66 @@
   OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0);
   JUMPHERE(singlechar);
   }
-#endif /* COMPILE_PCRE[8|16] */
-#endif /* SUPPORT_UTF && !COMPILE_PCRE32 */
+#endif /* PCRE2_CODE_UNIT_WIDTH == [8|16] */
+#endif /* SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32 */
 JUMPHERE(start);
 
 if (newlinecheck)
   {
   JUMPHERE(end);
-  JUMPHERE(nl);
+  JUMPHERE(end2);
   }
 
 return mainloop;
 }
 
 #define MAX_N_CHARS 16
-#define MAX_N_BYTES 8
+#define MAX_DIFF_CHARS 6
 
-static SLJIT_INLINE void add_prefix_byte(pcre_uint8 byte, pcre_uint8 *bytes)
+static SLJIT_INLINE void add_prefix_char(PCRE2_UCHAR chr, PCRE2_UCHAR *chars)
 {
-pcre_uint8 len = bytes[0];
-int i;
+PCRE2_UCHAR i, len;
 
+len = chars[0];
 if (len == 255)
   return;
 
 if (len == 0)
   {
-  bytes[0] = 1;
-  bytes[1] = byte;
+  chars[0] = 1;
+  chars[1] = chr;
   return;
   }
 
 for (i = len; i > 0; i--)
-  if (bytes[i] == byte)
+  if (chars[i] == chr)
     return;
 
-if (len >= MAX_N_BYTES - 1)
+if (len >= MAX_DIFF_CHARS - 1)
   {
-  bytes[0] = 255;
+  chars[0] = 255;
   return;
   }
 
 len++;
-bytes[len] = byte;
-bytes[0] = len;
+chars[len] = chr;
+chars[0] = len;
 }
 
-static int scan_prefix(compiler_common *common, pcre_uchar *cc, pcre_uint32 *chars, pcre_uint8 *bytes, int max_chars, pcre_uint32 *rec_count)
+static int scan_prefix(compiler_common *common, PCRE2_SPTR cc, PCRE2_UCHAR *chars, int max_chars, uint32_t *rec_count)
 {
 /* Recursive function, which scans prefix literals. */
-BOOL last, any, caseless;
+BOOL last, any, class, caseless;
 int len, repeat, len_save, consumed = 0;
-pcre_uint32 chr, mask;
-pcre_uchar *alternative, *cc_save, *oc;
-#if defined SUPPORT_UTF && defined COMPILE_PCRE8
-pcre_uchar othercase[8];
-#elif defined SUPPORT_UTF && defined COMPILE_PCRE16
-pcre_uchar othercase[2];
+sljit_ui chr; /* Any unicode character. */
+sljit_ub *bytes, *bytes_end, byte;
+PCRE2_SPTR alternative, cc_save, oc;
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH == 8
+PCRE2_UCHAR othercase[8];
+#elif defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH == 16
+PCRE2_UCHAR othercase[2];
 #else
-pcre_uchar othercase[1];
+PCRE2_UCHAR othercase[1];
 #endif
 
 repeat = 1;
@@ -3257,6 +3503,7 @@
 
   last = TRUE;
   any = FALSE;
+  class = FALSE;
   caseless = FALSE;
 
   switch (*cc)
@@ -3317,10 +3564,10 @@
     case OP_POSQUERY:
     len = 1;
     cc++;
-#ifdef SUPPORT_UTF
+#ifdef SUPPORT_UNICODE
     if (common->utf && HAS_EXTRALEN(*cc)) len += GET_EXTRALEN(*cc);
 #endif
-    max_chars = scan_prefix(common, cc + len, chars, bytes, max_chars, rec_count);
+    max_chars = scan_prefix(common, cc + len, chars, max_chars, rec_count);
     if (max_chars == 0)
       return consumed;
     last = FALSE;
@@ -3343,7 +3590,7 @@
     alternative = cc + GET(cc, 1);
     while (*alternative == OP_ALT)
       {
-      max_chars = scan_prefix(common, alternative + 1 + LINK_SIZE, chars, bytes, max_chars, rec_count);
+      max_chars = scan_prefix(common, alternative + 1 + LINK_SIZE, chars, max_chars, rec_count);
       if (max_chars == 0)
         return consumed;
       alternative += GET(alternative, 1);
@@ -3355,24 +3602,22 @@
     continue;
 
     case OP_CLASS:
-#if defined SUPPORT_UTF && defined COMPILE_PCRE8
-    if (common->utf && !is_char7_bitset((const pcre_uint8 *)(cc + 1), FALSE)) return consumed;
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH == 8
+    if (common->utf && !is_char7_bitset((const sljit_ub *)(cc + 1), FALSE)) return consumed;
 #endif
-    any = TRUE;
-    cc += 1 + 32 / sizeof(pcre_uchar);
+    class = TRUE;
     break;
 
     case OP_NCLASS:
-#if defined SUPPORT_UTF && !defined COMPILE_PCRE32
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
     if (common->utf) return consumed;
 #endif
-    any = TRUE;
-    cc += 1 + 32 / sizeof(pcre_uchar);
+    class = TRUE;
     break;
 
-#if defined SUPPORT_UTF || !defined COMPILE_PCRE8
+#if defined SUPPORT_UNICODE || PCRE2_CODE_UNIT_WIDTH != 8
     case OP_XCLASS:
-#if defined SUPPORT_UTF && !defined COMPILE_PCRE32
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
     if (common->utf) return consumed;
 #endif
     any = TRUE;
@@ -3381,8 +3626,8 @@
 #endif
 
     case OP_DIGIT:
-#if defined SUPPORT_UTF && defined COMPILE_PCRE8
-    if (common->utf && !is_char7_bitset((const pcre_uint8 *)common->ctypes - cbit_length + cbit_digit, FALSE))
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH == 8
+    if (common->utf && !is_char7_bitset((const sljit_ub *)common->ctypes - cbit_length + cbit_digit, FALSE))
       return consumed;
 #endif
     any = TRUE;
@@ -3390,8 +3635,8 @@
     break;
 
     case OP_WHITESPACE:
-#if defined SUPPORT_UTF && defined COMPILE_PCRE8
-    if (common->utf && !is_char7_bitset((const pcre_uint8 *)common->ctypes - cbit_length + cbit_space, FALSE))
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH == 8
+    if (common->utf && !is_char7_bitset((const sljit_ub *)common->ctypes - cbit_length + cbit_space, FALSE))
       return consumed;
 #endif
     any = TRUE;
@@ -3399,8 +3644,8 @@
     break;
 
     case OP_WORDCHAR:
-#if defined SUPPORT_UTF && defined COMPILE_PCRE8
-    if (common->utf && !is_char7_bitset((const pcre_uint8 *)common->ctypes - cbit_length + cbit_word, FALSE))
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH == 8
+    if (common->utf && !is_char7_bitset((const sljit_ub *)common->ctypes - cbit_length + cbit_word, FALSE))
       return consumed;
 #endif
     any = TRUE;
@@ -3416,17 +3661,17 @@
     case OP_NOT_WORDCHAR:
     case OP_ANY:
     case OP_ALLANY:
-#if defined SUPPORT_UTF && !defined COMPILE_PCRE32
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
     if (common->utf) return consumed;
 #endif
     any = TRUE;
     cc++;
     break;
 
-#ifdef SUPPORT_UCP
+#ifdef SUPPORT_UNICODE
     case OP_NOTPROP:
     case OP_PROP:
-#if defined SUPPORT_UTF && !defined COMPILE_PCRE32
+#if PCRE2_CODE_UNIT_WIDTH != 32
     if (common->utf) return consumed;
 #endif
     any = TRUE;
@@ -3441,7 +3686,7 @@
 
     case OP_NOTEXACT:
     case OP_NOTEXACTI:
-#if defined SUPPORT_UTF && !defined COMPILE_PCRE32
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
     if (common->utf) return consumed;
 #endif
     any = TRUE;
@@ -3455,27 +3700,14 @@
 
   if (any)
     {
-#if defined COMPILE_PCRE8
-    mask = 0xff;
-#elif defined COMPILE_PCRE16
-    mask = 0xffff;
-#elif defined COMPILE_PCRE32
-    mask = 0xffffffff;
-#else
-    SLJIT_ASSERT_STOP();
-#endif
-
     do
       {
-      chars[0] = mask;
-      chars[1] = mask;
-      bytes[0] = 255;
+      chars[0] = 255;
 
       consumed++;
       if (--max_chars == 0)
         return consumed;
-      chars += 2;
-      bytes += MAX_N_BYTES;
+      chars += MAX_DIFF_CHARS;
       }
     while (--repeat > 0);
 
@@ -3483,14 +3715,111 @@
     continue;
     }
 
+  if (class)
+    {
+    bytes = (sljit_ub*) (cc + 1);
+    cc += 1 + 32 / sizeof(PCRE2_UCHAR);
+
+    switch (*cc)
+      {
+      case OP_CRSTAR:
+      case OP_CRMINSTAR:
+      case OP_CRPOSSTAR:
+      case OP_CRQUERY:
+      case OP_CRMINQUERY:
+      case OP_CRPOSQUERY:
+      max_chars = scan_prefix(common, cc + 1, chars, max_chars, rec_count);
+      if (max_chars == 0)
+        return consumed;
+      break;
+
+      default:
+      case OP_CRPLUS:
+      case OP_CRMINPLUS:
+      case OP_CRPOSPLUS:
+      break;
+
+      case OP_CRRANGE:
+      case OP_CRMINRANGE:
+      case OP_CRPOSRANGE:
+      repeat = GET2(cc, 1);
+      if (repeat <= 0)
+        return consumed;
+      break;
+      }
+
+    do
+      {
+      if (bytes[31] & 0x80)
+        chars[0] = 255;
+      else if (chars[0] != 255)
+        {
+        bytes_end = bytes + 32;
+        chr = 0;
+        do
+          {
+          byte = *bytes++;
+          SLJIT_ASSERT((chr & 0x7) == 0);
+          if (byte == 0)
+            chr += 8;
+          else
+            {
+            do
+              {
+              if ((byte & 0x1) != 0)
+                add_prefix_char(chr, chars);
+              byte >>= 1;
+              chr++;
+              }
+            while (byte != 0);
+            chr = (chr + 7) & ~7;
+            }
+          }
+        while (chars[0] != 255 && bytes < bytes_end);
+        bytes = bytes_end - 32;
+        }
+
+      consumed++;
+      if (--max_chars == 0)
+        return consumed;
+      chars += MAX_DIFF_CHARS;
+      }
+    while (--repeat > 0);
+
+    switch (*cc)
+      {
+      case OP_CRSTAR:
+      case OP_CRMINSTAR:
+      case OP_CRPOSSTAR:
+      return consumed;
+
+      case OP_CRQUERY:
+      case OP_CRMINQUERY:
+      case OP_CRPOSQUERY:
+      cc++;
+      break;
+
+      case OP_CRRANGE:
+      case OP_CRMINRANGE:
+      case OP_CRPOSRANGE:
+      if (GET2(cc, 1) != GET2(cc, 1 + IMM2_SIZE))
+        return consumed;
+      cc += 1 + 2 * IMM2_SIZE;
+      break;
+      }
+
+    repeat = 1;
+    continue;
+    }
+
   len = 1;
-#ifdef SUPPORT_UTF
+#ifdef SUPPORT_UNICODE
   if (common->utf && HAS_EXTRALEN(*cc)) len += GET_EXTRALEN(*cc);
 #endif
 
   if (caseless && char_has_othercase(common, cc))
     {
-#ifdef SUPPORT_UTF
+#ifdef SUPPORT_UNICODE
     if (common->utf)
       {
       GETCHAR(chr, cc);
@@ -3505,7 +3834,10 @@
       }
     }
   else
+    {
     caseless = FALSE;
+    othercase[0] = 0; /* Stops compiler warning - PH */
+    }
 
   len_save = len;
   cc_save = cc;
@@ -3515,43 +3847,16 @@
     do
       {
       chr = *cc;
-#ifdef COMPILE_PCRE32
-      if (SLJIT_UNLIKELY(chr == NOTACHAR))
-        return consumed;
-#endif
-      add_prefix_byte((pcre_uint8)chr, bytes);
+      add_prefix_char(*cc, chars);
 
-      mask = 0;
       if (caseless)
-        {
-        add_prefix_byte((pcre_uint8)*oc, bytes);
-        mask = *cc ^ *oc;
-        chr |= mask;
-        }
-
-#ifdef COMPILE_PCRE32
-      if (chars[0] == NOTACHAR && chars[1] == 0)
-#else
-      if (chars[0] == NOTACHAR)
-#endif
-        {
-        chars[0] = chr;
-        chars[1] = mask;
-        }
-      else
-        {
-        mask |= chars[0] ^ chr;
-        chr |= mask;
-        chars[0] = chr;
-        chars[1] |= mask;
-        }
+        add_prefix_char(*oc, chars);
 
       len--;
       consumed++;
       if (--max_chars == 0)
         return consumed;
-      chars += 2;
-      bytes += MAX_N_BYTES;
+      chars += MAX_DIFF_CHARS;
       cc++;
       oc++;
       }
@@ -3570,67 +3875,504 @@
   }
 }
 
-static SLJIT_INLINE BOOL fast_forward_first_n_chars(compiler_common *common, BOOL firstline)
+#if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86)
+
+static sljit_si character_to_int32(PCRE2_UCHAR chr)
+{
+sljit_si value = (sljit_si)chr;
+#if PCRE2_CODE_UNIT_WIDTH == 8
+#define SSE2_COMPARE_TYPE_INDEX 0
+return (value << 24) | (value << 16) | (value << 8) | value;
+#elif PCRE2_CODE_UNIT_WIDTH == 16
+#define SSE2_COMPARE_TYPE_INDEX 1
+return (value << 16) | value;
+#elif PCRE2_CODE_UNIT_WIDTH == 32
+#define SSE2_COMPARE_TYPE_INDEX 2
+return value;
+#else
+#error "Unsupported unit width"
+#endif
+}
+
+static SLJIT_INLINE void fast_forward_first_char2_sse2(compiler_common *common, PCRE2_UCHAR char1, PCRE2_UCHAR char2)
+{
+DEFINE_COMPILER;
+struct sljit_label *start;
+struct sljit_jump *quit[3];
+struct sljit_jump *nomatch;
+sljit_ub instruction[8];
+sljit_si tmp1_ind = sljit_get_register_index(TMP1);
+sljit_si tmp2_ind = sljit_get_register_index(TMP2);
+sljit_si str_ptr_ind = sljit_get_register_index(STR_PTR);
+BOOL load_twice = FALSE;
+PCRE2_UCHAR bit;
+
+bit = char1 ^ char2;
+if (!is_powerof2(bit))
+  bit = 0;
+
+if ((char1 != char2) && bit == 0)
+  load_twice = TRUE;
+
+quit[0] = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0);
+
+/* First part (unaligned start) */
+
+OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, character_to_int32(char1 | bit));
+
+SLJIT_ASSERT(tmp1_ind < 8 && tmp2_ind == 1);
+
+/* MOVD xmm, r/m32 */
+instruction[0] = 0x66;
+instruction[1] = 0x0f;
+instruction[2] = 0x6e;
+instruction[3] = 0xc0 | (2 << 3) | tmp1_ind;
+sljit_emit_op_custom(compiler, instruction, 4);
+
+if (char1 != char2)
+  {
+  OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, character_to_int32(bit != 0 ? bit : char2));
+
+  /* MOVD xmm, r/m32 */
+  instruction[3] = 0xc0 | (3 << 3) | tmp1_ind;
+  sljit_emit_op_custom(compiler, instruction, 4);
+  }
+
+/* PSHUFD xmm1, xmm2/m128, imm8 */
+instruction[2] = 0x70;
+instruction[3] = 0xc0 | (2 << 3) | 2;
+instruction[4] = 0;
+sljit_emit_op_custom(compiler, instruction, 5);
+
+if (char1 != char2)
+  {
+  /* PSHUFD xmm1, xmm2/m128, imm8 */
+  instruction[3] = 0xc0 | (3 << 3) | 3;
+  instruction[4] = 0;
+  sljit_emit_op_custom(compiler, instruction, 5);
+  }
+
+OP2(SLJIT_AND, TMP2, 0, STR_PTR, 0, SLJIT_IMM, 0xf);
+OP2(SLJIT_AND, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, ~0xf);
+
+/* MOVDQA xmm1, xmm2/m128 */
+#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
+
+if (str_ptr_ind < 8)
+  {
+  instruction[2] = 0x6f;
+  instruction[3] = (0 << 3) | str_ptr_ind;
+  sljit_emit_op_custom(compiler, instruction, 4);
+
+  if (load_twice)
+    {
+    instruction[3] = (1 << 3) | str_ptr_ind;
+    sljit_emit_op_custom(compiler, instruction, 4);
+    }
+  }
+else
+  {
+  instruction[1] = 0x41;
+  instruction[2] = 0x0f;
+  instruction[3] = 0x6f;
+  instruction[4] = (0 << 3) | (str_ptr_ind & 0x7);
+  sljit_emit_op_custom(compiler, instruction, 5);
+
+  if (load_twice)
+    {
+    instruction[4] = (1 << 3) | str_ptr_ind;
+    sljit_emit_op_custom(compiler, instruction, 5);
+    }
+  instruction[1] = 0x0f;
+  }
+
+#else
+
+instruction[2] = 0x6f;
+instruction[3] = (0 << 3) | str_ptr_ind;
+sljit_emit_op_custom(compiler, instruction, 4);
+
+if (load_twice)
+  {
+  instruction[3] = (1 << 3) | str_ptr_ind;
+  sljit_emit_op_custom(compiler, instruction, 4);
+  }
+
+#endif
+
+if (bit != 0)
+  {
+  /* POR xmm1, xmm2/m128 */
+  instruction[2] = 0xeb;
+  instruction[3] = 0xc0 | (0 << 3) | 3;
+  sljit_emit_op_custom(compiler, instruction, 4);
+  }
+
+/* PCMPEQB/W/D xmm1, xmm2/m128 */
+instruction[2] = 0x74 + SSE2_COMPARE_TYPE_INDEX;
+instruction[3] = 0xc0 | (0 << 3) | 2;
+sljit_emit_op_custom(compiler, instruction, 4);
+
+if (load_twice)
+  {
+  instruction[3] = 0xc0 | (1 << 3) | 3;
+  sljit_emit_op_custom(compiler, instruction, 4);
+  }
+
+/* PMOVMSKB reg, xmm */
+instruction[2] = 0xd7;
+instruction[3] = 0xc0 | (tmp1_ind << 3) | 0;
+sljit_emit_op_custom(compiler, instruction, 4);
+
+if (load_twice)
+  {
+  OP1(SLJIT_MOV, TMP3, 0, TMP2, 0);
+  instruction[3] = 0xc0 | (tmp2_ind << 3) | 1;
+  sljit_emit_op_custom(compiler, instruction, 4);
+
+  OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0);
+  OP1(SLJIT_MOV, TMP2, 0, TMP3, 0);
+  }
+
+OP2(SLJIT_ASHR, TMP1, 0, TMP1, 0, TMP2, 0);
+
+/* BSF r32, r/m32 */
+instruction[0] = 0x0f;
+instruction[1] = 0xbc;
+instruction[2] = 0xc0 | (tmp1_ind << 3) | tmp1_ind;
+sljit_emit_op_custom(compiler, instruction, 3);
+
+nomatch = JUMP(SLJIT_ZERO);
+
+OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP2, 0);
+OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0);
+quit[1] = JUMP(SLJIT_JUMP);
+
+JUMPHERE(nomatch);
+
+start = LABEL();
+OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, 16);
+quit[2] = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0);
+
+/* Second part (aligned) */
+
+instruction[0] = 0x66;
+instruction[1] = 0x0f;
+
+/* MOVDQA xmm1, xmm2/m128 */
+#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
+
+if (str_ptr_ind < 8)
+  {
+  instruction[2] = 0x6f;
+  instruction[3] = (0 << 3) | str_ptr_ind;
+  sljit_emit_op_custom(compiler, instruction, 4);
+
+  if (load_twice)
+    {
+    instruction[3] = (1 << 3) | str_ptr_ind;
+    sljit_emit_op_custom(compiler, instruction, 4);
+    }
+  }
+else
+  {
+  instruction[1] = 0x41;
+  instruction[2] = 0x0f;
+  instruction[3] = 0x6f;
+  instruction[4] = (0 << 3) | (str_ptr_ind & 0x7);
+  sljit_emit_op_custom(compiler, instruction, 5);
+
+  if (load_twice)
+    {
+    instruction[4] = (1 << 3) | str_ptr_ind;
+    sljit_emit_op_custom(compiler, instruction, 5);
+    }
+  instruction[1] = 0x0f;
+  }
+
+#else
+
+instruction[2] = 0x6f;
+instruction[3] = (0 << 3) | str_ptr_ind;
+sljit_emit_op_custom(compiler, instruction, 4);
+
+if (load_twice)
+  {
+  instruction[3] = (1 << 3) | str_ptr_ind;
+  sljit_emit_op_custom(compiler, instruction, 4);
+  }
+
+#endif
+
+if (bit != 0)
+  {
+  /* POR xmm1, xmm2/m128 */
+  instruction[2] = 0xeb;
+  instruction[3] = 0xc0 | (0 << 3) | 3;
+  sljit_emit_op_custom(compiler, instruction, 4);
+  }
+
+/* PCMPEQB/W/D xmm1, xmm2/m128 */
+instruction[2] = 0x74 + SSE2_COMPARE_TYPE_INDEX;
+instruction[3] = 0xc0 | (0 << 3) | 2;
+sljit_emit_op_custom(compiler, instruction, 4);
+
+if (load_twice)
+  {
+  instruction[3] = 0xc0 | (1 << 3) | 3;
+  sljit_emit_op_custom(compiler, instruction, 4);
+  }
+
+/* PMOVMSKB reg, xmm */
+instruction[2] = 0xd7;
+instruction[3] = 0xc0 | (tmp1_ind << 3) | 0;
+sljit_emit_op_custom(compiler, instruction, 4);
+
+if (load_twice)
+  {
+  instruction[3] = 0xc0 | (tmp2_ind << 3) | 1;
+  sljit_emit_op_custom(compiler, instruction, 4);
+
+  OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0);
+  }
+
+/* BSF r32, r/m32 */
+instruction[0] = 0x0f;
+instruction[1] = 0xbc;
+instruction[2] = 0xc0 | (tmp1_ind << 3) | tmp1_ind;
+sljit_emit_op_custom(compiler, instruction, 3);
+
+JUMPTO(SLJIT_ZERO, start);
+
+OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0);
+
+start = LABEL();
+SET_LABEL(quit[0], start);
+SET_LABEL(quit[1], start);
+SET_LABEL(quit[2], start);
+}
+
+#undef SSE2_COMPARE_TYPE_INDEX
+
+#endif
+
+static void fast_forward_first_char2(compiler_common *common, PCRE2_UCHAR char1, PCRE2_UCHAR char2, sljit_si offset)
 {
 DEFINE_COMPILER;
 struct sljit_label *start;
 struct sljit_jump *quit;
-pcre_uint32 chars[MAX_N_CHARS * 2];
-pcre_uint8 bytes[MAX_N_CHARS * MAX_N_BYTES];
-pcre_uint8 ones[MAX_N_CHARS];
-int offsets[3];
-pcre_uint32 mask;
-pcre_uint8 *byte_set, *byte_set_end;
-int i, max, from;
-int range_right = -1, range_len = 3 - 1;
-sljit_ub *update_table = NULL;
-BOOL in_range;
-pcre_uint32 rec_count;
+struct sljit_jump *found;
+PCRE2_UCHAR mask;
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
+struct sljit_label *utf_start = NULL;
+struct sljit_jump *utf_quit = NULL;
+#endif
+BOOL has_match_end = (common->match_end_ptr != 0);
 
-for (i = 0; i < MAX_N_CHARS; i++)
+if (offset > 0)
+  OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(offset));
+
+if (has_match_end)
   {
-  chars[i << 1] = NOTACHAR;
-  chars[(i << 1) + 1] = 0;
-  bytes[i * MAX_N_BYTES] = 0;
-  }
+  OP1(SLJIT_MOV, TMP3, 0, STR_END, 0);
 
-rec_count = 10000;
-max = scan_prefix(common, common->start, chars, bytes, MAX_N_CHARS, &rec_count);
-
-if (max <= 1)
-  return FALSE;
-
-for (i = 0; i < max; i++)
-  {
-  mask = chars[(i << 1) + 1];
-  ones[i] = ones_in_half_byte[mask & 0xf];
-  mask >>= 4;
-  while (mask != 0)
+  OP2(SLJIT_ADD, STR_END, 0, SLJIT_MEM1(SLJIT_SP), common->match_end_ptr, SLJIT_IMM, IN_UCHARS(offset + 1));
+#if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86)
+  if (sljit_x86_is_cmov_available())
     {
-    ones[i] += ones_in_half_byte[mask & 0xf];
-    mask >>= 4;
+    OP2(SLJIT_SUB | SLJIT_SET_U, SLJIT_UNUSED, 0, STR_END, 0, TMP3, 0);
+    sljit_x86_emit_cmov(compiler, SLJIT_GREATER, STR_END, TMP3, 0);
+    }
+#endif
+    {
+    quit = CMP(SLJIT_LESS_EQUAL, STR_END, 0, TMP3, 0);
+    OP1(SLJIT_MOV, STR_END, 0, TMP3, 0);
+    JUMPHERE(quit);
     }
   }
 
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
+if (common->utf && offset > 0)
+  utf_start = LABEL();
+#endif
+
+#if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86)
+
+/* SSE2 accelerated first character search. */
+
+if (sljit_x86_is_sse2_available())
+  {
+  fast_forward_first_char2_sse2(common, char1, char2);
+
+  SLJIT_ASSERT(common->mode == PCRE2_JIT_COMPLETE || offset == 0);
+  if (common->mode == PCRE2_JIT_COMPLETE)
+    {
+    /* In complete mode, we don't need to run a match when STR_PTR == STR_END. */
+    SLJIT_ASSERT(common->forced_quit_label == NULL);
+    OP1(SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_IMM, PCRE2_ERROR_NOMATCH);
+    add_jump(compiler, &common->forced_quit, CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0));
+
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
+    if (common->utf && offset > 0)
+      {
+      SLJIT_ASSERT(common->mode == PCRE2_JIT_COMPLETE);
+
+      OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-offset));
+      OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
+#if PCRE2_CODE_UNIT_WIDTH == 8
+      OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xc0);
+      CMPTO(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, 0x80, utf_start);
+#elif PCRE2_CODE_UNIT_WIDTH == 16
+      OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xfc00);
+      CMPTO(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, 0xdc00, utf_start);
+#else
+#error "Unknown code width"
+#endif
+      OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
+      }
+#endif
+
+    if (offset > 0)
+      OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(offset));
+    }
+  else if (sljit_x86_is_cmov_available())
+    {
+    OP2(SLJIT_SUB | SLJIT_SET_U, SLJIT_UNUSED, 0, STR_PTR, 0, STR_END, 0);
+    sljit_x86_emit_cmov(compiler, SLJIT_GREATER_EQUAL, STR_PTR, has_match_end ? SLJIT_MEM1(SLJIT_SP) : STR_END, has_match_end ? common->match_end_ptr : 0);
+    }
+  else
+    {
+    quit = CMP(SLJIT_LESS, STR_PTR, 0, STR_END, 0);
+    OP1(SLJIT_MOV, STR_PTR, 0, has_match_end ? SLJIT_MEM1(SLJIT_SP) : STR_END, has_match_end ? common->match_end_ptr : 0);
+    JUMPHERE(quit);
+    }
+
+  if (has_match_end)
+    OP1(SLJIT_MOV, STR_END, 0, TMP3, 0);
+  return;
+  }
+
+#endif
+
+quit = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0);
+
+start = LABEL();
+OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), 0);
+
+if (char1 == char2)
+  found = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, char1);
+else
+  {
+  mask = char1 ^ char2;
+  if (is_powerof2(mask))
+    {
+    OP2(SLJIT_OR, TMP1, 0, TMP1, 0, SLJIT_IMM, mask);
+    found = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, char1 | mask);
+    }
+  else
+    {
+    OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, char1);
+    OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_UNUSED, 0, SLJIT_EQUAL);
+    OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, char2);
+    OP_FLAGS(SLJIT_OR | SLJIT_SET_E, TMP2, 0, TMP2, 0, SLJIT_EQUAL);
+    found = JUMP(SLJIT_NOT_ZERO);
+    }
+  }
+
+OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
+CMPTO(SLJIT_LESS, STR_PTR, 0, STR_END, 0, start);
+
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
+if (common->utf && offset > 0)
+  utf_quit = JUMP(SLJIT_JUMP);
+#endif
+
+JUMPHERE(found);
+
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
+if (common->utf && offset > 0)
+  {
+  OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-offset));
+  OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
+#if PCRE2_CODE_UNIT_WIDTH == 8
+  OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xc0);
+  CMPTO(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, 0x80, utf_start);
+#elif PCRE2_CODE_UNIT_WIDTH == 16
+  OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xfc00);
+  CMPTO(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, 0xdc00, utf_start);
+#else
+#error "Unknown code width"
+#endif
+  OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
+  JUMPHERE(utf_quit);
+  }
+#endif
+
+JUMPHERE(quit);
+
+if (has_match_end)
+  {
+  quit = CMP(SLJIT_LESS, STR_PTR, 0, STR_END, 0);
+  OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP), common->match_end_ptr);
+  if (offset > 0)
+    OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(offset));
+  JUMPHERE(quit);
+  OP1(SLJIT_MOV, STR_END, 0, TMP3, 0);
+  }
+
+if (offset > 0)
+  OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(offset));
+}
+
+static SLJIT_INLINE BOOL fast_forward_first_n_chars(compiler_common *common)
+{
+DEFINE_COMPILER;
+struct sljit_label *start;
+struct sljit_jump *quit;
+struct sljit_jump *match;
+/* bytes[0] represent the number of characters between 0
+and MAX_N_BYTES - 1, 255 represents any character. */
+PCRE2_UCHAR chars[MAX_N_CHARS * MAX_DIFF_CHARS];
+sljit_si offset;
+PCRE2_UCHAR mask;
+PCRE2_UCHAR *char_set, *char_set_end;
+int i, max, from;
+int range_right = -1, range_len;
+sljit_ub *update_table = NULL;
+BOOL in_range;
+uint32_t rec_count;
+
+for (i = 0; i < MAX_N_CHARS; i++)
+  chars[i * MAX_DIFF_CHARS] = 0;
+
+rec_count = 10000;
+max = scan_prefix(common, common->start, chars, MAX_N_CHARS, &rec_count);
+
+if (max < 1)
+  return FALSE;
+
 in_range = FALSE;
-from = 0;   /* Prevent compiler "uninitialized" warning */
+/* Prevent compiler "uninitialized" warning */
+from = 0;
+range_len = 4 /* minimum length */ - 1;
 for (i = 0; i <= max; i++)
   {
-  if (in_range && (i - from) > range_len && (bytes[(i - 1) * MAX_N_BYTES] <= 4))
+  if (in_range && (i - from) > range_len && (chars[(i - 1) * MAX_DIFF_CHARS] < 255))
     {
     range_len = i - from;
     range_right = i - 1;
     }
 
-  if (i < max && bytes[i * MAX_N_BYTES] < 255)
+  if (i < max && chars[i * MAX_DIFF_CHARS] < 255)
     {
+    SLJIT_ASSERT(chars[i * MAX_DIFF_CHARS] > 0);
     if (!in_range)
       {
       in_range = TRUE;
       from = i;
       }
     }
-  else if (in_range)
+  else
     in_range = FALSE;
   }
 
@@ -3643,90 +4385,66 @@
 
   for (i = 0; i < range_len; i++)
     {
-    byte_set = bytes + ((range_right - i) * MAX_N_BYTES);
-    SLJIT_ASSERT(byte_set[0] > 0 && byte_set[0] < 255);
-    byte_set_end = byte_set + byte_set[0];
-    byte_set++;
-    while (byte_set <= byte_set_end)
+    char_set = chars + ((range_right - i) * MAX_DIFF_CHARS);
+    SLJIT_ASSERT(char_set[0] > 0 && char_set[0] < 255);
+    char_set_end = char_set + char_set[0];
+    char_set++;
+    while (char_set <= char_set_end)
       {
-      if (update_table[*byte_set] > IN_UCHARS(i))
-        update_table[*byte_set] = IN_UCHARS(i);
-      byte_set++;
+      if (update_table[(*char_set) & 0xff] > IN_UCHARS(i))
+        update_table[(*char_set) & 0xff] = IN_UCHARS(i);
+      char_set++;
       }
     }
   }
 
-offsets[0] = -1;
+offset = -1;
 /* Scan forward. */
 for (i = 0; i < max; i++)
-  if (ones[i] <= 2) {
-    offsets[0] = i;
-    break;
-  }
-
-if (offsets[0] < 0 && range_right < 0)
-  return FALSE;
-
-if (offsets[0] >= 0)
   {
-  /* Scan backward. */
-  offsets[1] = -1;
-  for (i = max - 1; i > offsets[0]; i--)
-    if (ones[i] <= 2 && i != range_right)
-      {
-      offsets[1] = i;
-      break;
-      }
-
-  /* This case is handled better by fast_forward_first_char. */
-  if (offsets[1] == -1 && offsets[0] == 0 && range_right < 0)
-    return FALSE;
-
-  offsets[2] = -1;
-  /* We only search for a middle character if there is no range check. */
-  if (offsets[1] >= 0 && range_right == -1)
+  if (offset == -1)
     {
-    /* Scan from middle. */
-    for (i = (offsets[0] + offsets[1]) / 2 + 1; i < offsets[1]; i++)
-      if (ones[i] <= 2)
+    if (chars[i * MAX_DIFF_CHARS] <= 2)
+      offset = i;
+    }
+  else if (chars[offset * MAX_DIFF_CHARS] == 2 && chars[i * MAX_DIFF_CHARS] <= 2)
+    {
+    if (chars[i * MAX_DIFF_CHARS] == 1)
+      offset = i;
+    else
+      {
+      mask = chars[offset * MAX_DIFF_CHARS + 1] ^ chars[offset * MAX_DIFF_CHARS + 2];
+      if (!is_powerof2(mask))
         {
-        offsets[2] = i;
-        break;
+        mask = chars[i * MAX_DIFF_CHARS + 1] ^ chars[i * MAX_DIFF_CHARS + 2];
+        if (is_powerof2(mask))
+          offset = i;
         }
-
-    if (offsets[2] == -1)
-      {
-      for (i = (offsets[0] + offsets[1]) / 2; i > offsets[0]; i--)
-        if (ones[i] <= 2)
-          {
-          offsets[2] = i;
-          break;
-          }
       }
     }
-
-  SLJIT_ASSERT(offsets[1] == -1 || (offsets[0] < offsets[1]));
-  SLJIT_ASSERT(offsets[2] == -1 || (offsets[0] < offsets[2] && offsets[1] > offsets[2]));
-
-  chars[0] = chars[offsets[0] << 1];
-  chars[1] = chars[(offsets[0] << 1) + 1];
-  if (offsets[2] >= 0)
-    {
-    chars[2] = chars[offsets[2] << 1];
-    chars[3] = chars[(offsets[2] << 1) + 1];
-    }
-  if (offsets[1] >= 0)
-    {
-    chars[4] = chars[offsets[1] << 1];
-    chars[5] = chars[(offsets[1] << 1) + 1];
-    }
   }
 
+if (range_right < 0)
+  {
+  if (offset < 0)
+    return FALSE;
+  SLJIT_ASSERT(chars[offset * MAX_DIFF_CHARS] >= 1 && chars[offset * MAX_DIFF_CHARS] <= 2);
+  /* Works regardless the value is 1 or 2. */
+  mask = chars[offset * MAX_DIFF_CHARS + chars[offset * MAX_DIFF_CHARS]];
+  fast_forward_first_char2(common, chars[offset * MAX_DIFF_CHARS + 1], mask, offset);
+  return TRUE;
+  }
+
+if (range_right == offset)
+  offset = -1;
+
+SLJIT_ASSERT(offset == -1 || (chars[offset * MAX_DIFF_CHARS] >= 1 && chars[offset * MAX_DIFF_CHARS] <= 2));
+
 max -= 1;
-if (firstline)
+SLJIT_ASSERT(max > 0);
+if (common->match_end_ptr != 0)
   {
-  SLJIT_ASSERT(common->first_line_end != 0);
-  OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->first_line_end);
+  OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->match_end_ptr);
   OP1(SLJIT_MOV, TMP3, 0, STR_END, 0);
   OP2(SLJIT_SUB, STR_END, 0, STR_END, 0, SLJIT_IMM, IN_UCHARS(max));
   quit = CMP(SLJIT_LESS_EQUAL, STR_END, 0, TMP1, 0);
@@ -3736,68 +4454,86 @@
 else
   OP2(SLJIT_SUB, STR_END, 0, STR_END, 0, SLJIT_IMM, IN_UCHARS(max));
 
+SLJIT_ASSERT(range_right >= 0);
+
 #if !(defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
-if (range_right >= 0)
-  OP1(SLJIT_MOV, RETURN_ADDR, 0, SLJIT_IMM, (sljit_sw)update_table);
+OP1(SLJIT_MOV, RETURN_ADDR, 0, SLJIT_IMM, (sljit_sw)update_table);
 #endif
 
 start = LABEL();
 quit = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0);
 
-SLJIT_ASSERT(range_right >= 0 || offsets[0] >= 0);
-
-if (range_right >= 0)
-  {
-#if defined COMPILE_PCRE8 || (defined SLJIT_LITTLE_ENDIAN && SLJIT_LITTLE_ENDIAN)
-  OP1(SLJIT_MOV_UB, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(range_right));
+#if PCRE2_CODE_UNIT_WIDTH == 8 || (defined SLJIT_LITTLE_ENDIAN && SLJIT_LITTLE_ENDIAN)
+OP1(SLJIT_MOV_UB, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(range_right));
 #else
-  OP1(SLJIT_MOV_UB, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(range_right + 1) - 1);
+OP1(SLJIT_MOV_UB, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(range_right + 1) - 1);
 #endif
 
 #if !(defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
-  OP1(SLJIT_MOV_UB, TMP1, 0, SLJIT_MEM2(RETURN_ADDR, TMP1), 0);
+OP1(SLJIT_MOV_UB, TMP1, 0, SLJIT_MEM2(RETURN_ADDR, TMP1), 0);
 #else
-  OP1(SLJIT_MOV_UB, TMP1, 0, SLJIT_MEM1(TMP1), (sljit_sw)update_table);
+OP1(SLJIT_MOV_UB, TMP1, 0, SLJIT_MEM1(TMP1), (sljit_sw)update_table);
 #endif
-  OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0);
-  CMPTO(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, 0, start);
-  }
+OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0);
+CMPTO(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, 0, start);
 
-if (offsets[0] >= 0)
+if (offset >= 0)
   {
-  OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(offsets[0]));
-  if (offsets[1] >= 0)
-    OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(offsets[1]));
+  OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(offset));
   OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
 
-  if (chars[1] != 0)
-    OP2(SLJIT_OR, TMP1, 0, TMP1, 0, SLJIT_IMM, chars[1]);
-  CMPTO(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, chars[0], start);
-  if (offsets[2] >= 0)
-    OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(offsets[2] - 1));
-
-  if (offsets[1] >= 0)
+  if (chars[offset * MAX_DIFF_CHARS] == 1)
+    CMPTO(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, chars[offset * MAX_DIFF_CHARS + 1], start);
+  else
     {
-    if (chars[5] != 0)
-      OP2(SLJIT_OR, TMP2, 0, TMP2, 0, SLJIT_IMM, chars[5]);
-    CMPTO(SLJIT_NOT_EQUAL, TMP2, 0, SLJIT_IMM, chars[4], start);
+    mask = chars[offset * MAX_DIFF_CHARS + 1] ^ chars[offset * MAX_DIFF_CHARS + 2];
+    if (is_powerof2(mask))
+      {
+      OP2(SLJIT_OR, TMP1, 0, TMP1, 0, SLJIT_IMM, mask);
+      CMPTO(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, chars[offset * MAX_DIFF_CHARS + 1] | mask, start);
+      }
+    else
+      {
+      match = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, chars[offset * MAX_DIFF_CHARS + 1]);
+      CMPTO(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, chars[offset * MAX_DIFF_CHARS + 2], start);
+      JUMPHERE(match);
+      }
     }
-
-  if (offsets[2] >= 0)
-    {
-    if (chars[3] != 0)
-      OP2(SLJIT_OR, TMP1, 0, TMP1, 0, SLJIT_IMM, chars[3]);
-    CMPTO(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, chars[2], start);
-    }
-  OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
   }
 
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
+if (common->utf && offset != 0)
+  {
+  if (offset < 0)
+    {
+    OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), 0);
+    OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
+    }
+  else
+    OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-1));
+#if PCRE2_CODE_UNIT_WIDTH == 8
+  OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xc0);
+  CMPTO(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, 0x80, start);
+#elif PCRE2_CODE_UNIT_WIDTH == 16
+  OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xfc00);
+  CMPTO(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, 0xdc00, start);
+#else
+#error "Unknown code width"
+#endif
+  if (offset < 0)
+    OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
+  }
+#endif
+
+if (offset >= 0)
+  OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
+
 JUMPHERE(quit);
 
-if (firstline)
+if (common->match_end_ptr != 0)
   {
   if (range_right >= 0)
-    OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->first_line_end);
+    OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->match_end_ptr);
   OP1(SLJIT_MOV, STR_END, 0, TMP3, 0);
   if (range_right >= 0)
     {
@@ -3814,64 +4550,24 @@
 #undef MAX_N_CHARS
 #undef MAX_N_BYTES
 
-static SLJIT_INLINE void fast_forward_first_char(compiler_common *common, pcre_uchar first_char, BOOL caseless, BOOL firstline)
+static SLJIT_INLINE void fast_forward_first_char(compiler_common *common, PCRE2_UCHAR first_char, BOOL caseless)
 {
-DEFINE_COMPILER;
-struct sljit_label *start;
-struct sljit_jump *quit;
-struct sljit_jump *found;
-pcre_uchar oc, bit;
-
-if (firstline)
-  {
-  SLJIT_ASSERT(common->first_line_end != 0);
-  OP1(SLJIT_MOV, TMP3, 0, STR_END, 0);
-  OP1(SLJIT_MOV, STR_END, 0, SLJIT_MEM1(SLJIT_SP), common->first_line_end);
-  }
-
-start = LABEL();
-quit = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0);
-OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), 0);
+PCRE2_UCHAR oc;
 
 oc = first_char;
 if (caseless)
   {
   oc = TABLE_GET(first_char, common->fcc, first_char);
-#if defined SUPPORT_UCP && !(defined COMPILE_PCRE8)
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 8
   if (first_char > 127 && common->utf)
     oc = UCD_OTHERCASE(first_char);
 #endif
   }
-if (first_char == oc)
-  found = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, first_char);
-else
-  {
-  bit = first_char ^ oc;
-  if (is_powerof2(bit))
-    {
-    OP2(SLJIT_OR, TMP2, 0, TMP1, 0, SLJIT_IMM, bit);
-    found = CMP(SLJIT_EQUAL, TMP2, 0, SLJIT_IMM, first_char | bit);
-    }
-  else
-    {
-    OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, first_char);
-    OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_UNUSED, 0, SLJIT_EQUAL);
-    OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, oc);
-    OP_FLAGS(SLJIT_OR | SLJIT_SET_E, TMP2, 0, TMP2, 0, SLJIT_EQUAL);
-    found = JUMP(SLJIT_NOT_ZERO);
-    }
-  }
 
-OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
-JUMPTO(SLJIT_JUMP, start);
-JUMPHERE(found);
-JUMPHERE(quit);
-
-if (firstline)
-  OP1(SLJIT_MOV, STR_END, 0, TMP3, 0);
+fast_forward_first_char2(common, first_char, oc, 0);
 }
 
-static SLJIT_INLINE void fast_forward_newline(compiler_common *common, BOOL firstline)
+static SLJIT_INLINE void fast_forward_newline(compiler_common *common)
 {
 DEFINE_COMPILER;
 struct sljit_label *loop;
@@ -3882,11 +4578,10 @@
 struct sljit_jump *notfoundnl;
 jump_list *newline = NULL;
 
-if (firstline)
+if (common->match_end_ptr != 0)
   {
-  SLJIT_ASSERT(common->first_line_end != 0);
   OP1(SLJIT_MOV, TMP3, 0, STR_END, 0);
-  OP1(SLJIT_MOV, STR_END, 0, SLJIT_MEM1(SLJIT_SP), common->first_line_end);
+  OP1(SLJIT_MOV, STR_END, 0, SLJIT_MEM1(SLJIT_SP), common->match_end_ptr);
   }
 
 if (common->nltype == NLTYPE_FIXED && common->newline > 255)
@@ -3900,7 +4595,7 @@
   OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, IN_UCHARS(2));
   OP2(SLJIT_SUB | SLJIT_SET_U, SLJIT_UNUSED, 0, STR_PTR, 0, TMP1, 0);
   OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_UNUSED, 0, SLJIT_GREATER_EQUAL);
-#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32
+#if PCRE2_CODE_UNIT_WIDTH == 16 || PCRE2_CODE_UNIT_WIDTH == 32
   OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, UCHAR_SHIFT);
 #endif
   OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, TMP2, 0);
@@ -3917,7 +4612,7 @@
   JUMPHERE(firstchar);
   JUMPHERE(lastchar);
 
-  if (firstline)
+  if (common->match_end_ptr != 0)
     OP1(SLJIT_MOV, STR_END, 0, TMP3, 0);
   return;
   }
@@ -3945,7 +4640,7 @@
   OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), 0);
   OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, CHAR_NL);
   OP_FLAGS(SLJIT_MOV, TMP1, 0, SLJIT_UNUSED, 0, SLJIT_EQUAL);
-#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32
+#if PCRE2_CODE_UNIT_WIDTH == 16 || PCRE2_CODE_UNIT_WIDTH == 32
   OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, UCHAR_SHIFT);
 #endif
   OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0);
@@ -3955,41 +4650,40 @@
 JUMPHERE(lastchar);
 JUMPHERE(firstchar);
 
-if (firstline)
+if (common->match_end_ptr != 0)
   OP1(SLJIT_MOV, STR_END, 0, TMP3, 0);
 }
 
-static BOOL check_class_ranges(compiler_common *common, const pcre_uint8 *bits, BOOL nclass, BOOL invert, jump_list **backtracks);
+static BOOL check_class_ranges(compiler_common *common, const sljit_ub *bits, BOOL nclass, BOOL invert, jump_list **backtracks);
 
-static SLJIT_INLINE void fast_forward_start_bits(compiler_common *common, pcre_uint8 *start_bits, BOOL firstline)
+static SLJIT_INLINE void fast_forward_start_bits(compiler_common *common, const sljit_ub *start_bits)
 {
 DEFINE_COMPILER;
 struct sljit_label *start;
 struct sljit_jump *quit;
 struct sljit_jump *found = NULL;
 jump_list *matches = NULL;
-#ifndef COMPILE_PCRE8
+#if PCRE2_CODE_UNIT_WIDTH != 8
 struct sljit_jump *jump;
 #endif
 
-if (firstline)
+if (common->match_end_ptr != 0)
   {
-  SLJIT_ASSERT(common->first_line_end != 0);
   OP1(SLJIT_MOV, RETURN_ADDR, 0, STR_END, 0);
-  OP1(SLJIT_MOV, STR_END, 0, SLJIT_MEM1(SLJIT_SP), common->first_line_end);
+  OP1(SLJIT_MOV, STR_END, 0, SLJIT_MEM1(SLJIT_SP), common->match_end_ptr);
   }
 
 start = LABEL();
 quit = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0);
 OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), 0);
-#ifdef SUPPORT_UTF
+#ifdef SUPPORT_UNICODE
 if (common->utf)
   OP1(SLJIT_MOV, TMP3, 0, TMP1, 0);
 #endif
 
 if (!check_class_ranges(common, start_bits, (start_bits[31] & 0x80) != 0, TRUE, &matches))
   {
-#ifndef COMPILE_PCRE8
+#if PCRE2_CODE_UNIT_WIDTH != 8
   jump = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 255);
   OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, 255);
   JUMPHERE(jump);
@@ -4002,20 +4696,20 @@
   found = JUMP(SLJIT_NOT_ZERO);
   }
 
-#ifdef SUPPORT_UTF
+#ifdef SUPPORT_UNICODE
 if (common->utf)
   OP1(SLJIT_MOV, TMP1, 0, TMP3, 0);
 #endif
 OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
-#ifdef SUPPORT_UTF
-#if defined COMPILE_PCRE8
+#ifdef SUPPORT_UNICODE
+#if PCRE2_CODE_UNIT_WIDTH == 8
 if (common->utf)
   {
   CMPTO(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0xc0, start);
   OP1(SLJIT_MOV_UB, TMP1, 0, SLJIT_MEM1(TMP1), (sljit_sw)PRIV(utf8_table4) - 0xc0);
   OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0);
   }
-#elif defined COMPILE_PCRE16
+#elif PCRE2_CODE_UNIT_WIDTH == 16
 if (common->utf)
   {
   CMPTO(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0xd800, start);
@@ -4025,8 +4719,8 @@
   OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 1);
   OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0);
   }
-#endif /* COMPILE_PCRE[8|16] */
-#endif /* SUPPORT_UTF */
+#endif /* PCRE2_CODE_UNIT_WIDTH == [8|16] */
+#endif /* SUPPORT_UNICODE */
 JUMPTO(SLJIT_JUMP, start);
 if (found != NULL)
   JUMPHERE(found);
@@ -4034,11 +4728,11 @@
   set_jumps(matches, LABEL());
 JUMPHERE(quit);
 
-if (firstline)
+if (common->match_end_ptr != 0)
   OP1(SLJIT_MOV, STR_END, 0, RETURN_ADDR, 0);
 }
 
-static SLJIT_INLINE struct sljit_jump *search_requested_char(compiler_common *common, pcre_uchar req_char, BOOL caseless, BOOL has_firstchar)
+static SLJIT_INLINE struct sljit_jump *search_requested_char(compiler_common *common, PCRE2_UCHAR req_char, BOOL caseless, BOOL has_firstchar)
 {
 DEFINE_COMPILER;
 struct sljit_label *loop;
@@ -4047,11 +4741,11 @@
 struct sljit_jump *found;
 struct sljit_jump *foundoc = NULL;
 struct sljit_jump *notfound;
-pcre_uint32 oc, bit;
+sljit_ui oc, bit;
 
 SLJIT_ASSERT(common->req_char_ptr != 0);
 OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), common->req_char_ptr);
-OP2(SLJIT_ADD, TMP1, 0, STR_PTR, 0, SLJIT_IMM, REQ_BYTE_MAX);
+OP2(SLJIT_ADD, TMP1, 0, STR_PTR, 0, SLJIT_IMM, REQ_CU_MAX);
 toolong = CMP(SLJIT_LESS, TMP1, 0, STR_END, 0);
 alreadyfound = CMP(SLJIT_LESS, STR_PTR, 0, TMP2, 0);
 
@@ -4068,7 +4762,7 @@
 if (caseless)
   {
   oc = TABLE_GET(req_char, common->fcc, req_char);
-#if defined SUPPORT_UCP && !(defined COMPILE_PCRE8)
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 8
   if (req_char > 127 && common->utf)
     oc = UCD_OTHERCASE(req_char);
 #endif
@@ -4141,7 +4835,7 @@
 DEFINE_COMPILER;
 struct sljit_jump *skipread;
 jump_list *skipread_list = NULL;
-#if !(defined COMPILE_PCRE8) || defined SUPPORT_UTF
+#if PCRE2_CODE_UNIT_WIDTH != 8 || defined SUPPORT_UNICODE
 struct sljit_jump *jump;
 #endif
 
@@ -4158,7 +4852,7 @@
 read_char(common);
 
 /* Testing char type. */
-#ifdef SUPPORT_UCP
+#ifdef SUPPORT_UNICODE
 if (common->use_ucp)
   {
   OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, 1);
@@ -4176,24 +4870,24 @@
 else
 #endif
   {
-#ifndef COMPILE_PCRE8
+#if PCRE2_CODE_UNIT_WIDTH != 8
   jump = CMP(SLJIT_GREATER, TMP1, 0, SLJIT_IMM, 255);
-#elif defined SUPPORT_UTF
+#elif defined SUPPORT_UNICODE
   /* Here LOCALS1 has already been zeroed. */
   jump = NULL;
   if (common->utf)
     jump = CMP(SLJIT_GREATER, TMP1, 0, SLJIT_IMM, 255);
-#endif /* COMPILE_PCRE8 */
+#endif /* PCRE2_CODE_UNIT_WIDTH == 8 */
   OP1(SLJIT_MOV_UB, TMP1, 0, SLJIT_MEM1(TMP1), common->ctypes);
   OP2(SLJIT_LSHR, TMP1, 0, TMP1, 0, SLJIT_IMM, 4 /* ctype_word */);
   OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 1);
   OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LOCALS1, TMP1, 0);
-#ifndef COMPILE_PCRE8
+#if PCRE2_CODE_UNIT_WIDTH != 8
   JUMPHERE(jump);
-#elif defined SUPPORT_UTF
+#elif defined SUPPORT_UNICODE
   if (jump != NULL)
     JUMPHERE(jump);
-#endif /* COMPILE_PCRE8 */
+#endif /* PCRE2_CODE_UNIT_WIDTH == 8 */
   }
 JUMPHERE(skipread);
 
@@ -4202,7 +4896,7 @@
 peek_char(common, READ_CHAR_MAX);
 
 /* Testing char type. This is a code duplication. */
-#ifdef SUPPORT_UCP
+#ifdef SUPPORT_UNICODE
 if (common->use_ucp)
   {
   OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, 1);
@@ -4219,11 +4913,11 @@
 else
 #endif
   {
-#ifndef COMPILE_PCRE8
+#if PCRE2_CODE_UNIT_WIDTH != 8
   /* TMP2 may be destroyed by peek_char. */
   OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, 0);
   jump = CMP(SLJIT_GREATER, TMP1, 0, SLJIT_IMM, 255);
-#elif defined SUPPORT_UTF
+#elif defined SUPPORT_UNICODE
   OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, 0);
   jump = NULL;
   if (common->utf)
@@ -4232,12 +4926,12 @@
   OP1(SLJIT_MOV_UB, TMP2, 0, SLJIT_MEM1(TMP1), common->ctypes);
   OP2(SLJIT_LSHR, TMP2, 0, TMP2, 0, SLJIT_IMM, 4 /* ctype_word */);
   OP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, 1);
-#ifndef COMPILE_PCRE8
+#if PCRE2_CODE_UNIT_WIDTH != 8
   JUMPHERE(jump);
-#elif defined SUPPORT_UTF
+#elif defined SUPPORT_UNICODE
   if (jump != NULL)
     JUMPHERE(jump);
-#endif /* COMPILE_PCRE8 */
+#endif /* PCRE2_CODE_UNIT_WIDTH == 8 */
   }
 set_jumps(skipread_list, LABEL());
 
@@ -4245,11 +4939,12 @@
 sljit_emit_fast_return(compiler, SLJIT_MEM1(SLJIT_SP), LOCALS0);
 }
 
-static BOOL check_class_ranges(compiler_common *common, const pcre_uint8 *bits, BOOL nclass, BOOL invert, jump_list **backtracks)
+static BOOL check_class_ranges(compiler_common *common, const sljit_ub *bits, BOOL nclass, BOOL invert, jump_list **backtracks)
 {
+/* May destroy TMP1. */
 DEFINE_COMPILER;
 int ranges[MAX_RANGE_SIZE];
-pcre_uint8 bit, cbit, all;
+sljit_ub bit, cbit, all;
 int i, byte, length = 0;
 
 bit = bits[0] & 0x1;
@@ -4407,18 +5102,18 @@
 OP2(SLJIT_SUB | SLJIT_SET_U, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x0d - 0x0a);
 OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_UNUSED, 0, SLJIT_LESS_EQUAL);
 OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x85 - 0x0a);
-#if defined SUPPORT_UTF || defined COMPILE_PCRE16 || defined COMPILE_PCRE32
-#ifdef COMPILE_PCRE8
+#if defined SUPPORT_UNICODE || PCRE2_CODE_UNIT_WIDTH == 16 || PCRE2_CODE_UNIT_WIDTH == 32
+#if PCRE2_CODE_UNIT_WIDTH == 8
 if (common->utf)
   {
 #endif
   OP_FLAGS(SLJIT_OR, TMP2, 0, TMP2, 0, SLJIT_EQUAL);
   OP2(SLJIT_OR, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x1);
   OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x2029 - 0x0a);
-#ifdef COMPILE_PCRE8
+#if PCRE2_CODE_UNIT_WIDTH == 8
   }
 #endif
-#endif /* SUPPORT_UTF || COMPILE_PCRE16 || COMPILE_PCRE32 */
+#endif /* SUPPORT_UNICODE || PCRE2_CODE_UNIT_WIDTH == [16|32] */
 OP_FLAGS(SLJIT_OR | SLJIT_SET_E, TMP2, 0, TMP2, 0, SLJIT_EQUAL);
 sljit_emit_fast_return(compiler, RETURN_ADDR, 0);
 }
@@ -4435,8 +5130,8 @@
 OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x20);
 OP_FLAGS(SLJIT_OR, TMP2, 0, TMP2, 0, SLJIT_EQUAL);
 OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0xa0);
-#if defined SUPPORT_UTF || defined COMPILE_PCRE16 || defined COMPILE_PCRE32
-#ifdef COMPILE_PCRE8
+#if defined SUPPORT_UNICODE || PCRE2_CODE_UNIT_WIDTH == 16 || PCRE2_CODE_UNIT_WIDTH == 32
+#if PCRE2_CODE_UNIT_WIDTH == 8
 if (common->utf)
   {
 #endif
@@ -4453,10 +5148,10 @@
   OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x205f - 0x2000);
   OP_FLAGS(SLJIT_OR, TMP2, 0, TMP2, 0, SLJIT_EQUAL);
   OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x3000 - 0x2000);
-#ifdef COMPILE_PCRE8
+#if PCRE2_CODE_UNIT_WIDTH == 8
   }
 #endif
-#endif /* SUPPORT_UTF || COMPILE_PCRE16 || COMPILE_PCRE32 */
+#endif /* SUPPORT_UNICODE || PCRE2_CODE_UNIT_WIDTH == [16|32] */
 OP_FLAGS(SLJIT_OR | SLJIT_SET_E, TMP2, 0, TMP2, 0, SLJIT_EQUAL);
 
 sljit_emit_fast_return(compiler, RETURN_ADDR, 0);
@@ -4473,18 +5168,18 @@
 OP2(SLJIT_SUB | SLJIT_SET_U, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x0d - 0x0a);
 OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_UNUSED, 0, SLJIT_LESS_EQUAL);
 OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x85 - 0x0a);
-#if defined SUPPORT_UTF || defined COMPILE_PCRE16 || defined COMPILE_PCRE32
-#ifdef COMPILE_PCRE8
+#if defined SUPPORT_UNICODE || PCRE2_CODE_UNIT_WIDTH == 16 || PCRE2_CODE_UNIT_WIDTH == 32
+#if PCRE2_CODE_UNIT_WIDTH == 8
 if (common->utf)
   {
 #endif
   OP_FLAGS(SLJIT_OR | SLJIT_SET_E, TMP2, 0, TMP2, 0, SLJIT_EQUAL);
   OP2(SLJIT_OR, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x1);
   OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x2029 - 0x0a);
-#ifdef COMPILE_PCRE8
+#if PCRE2_CODE_UNIT_WIDTH == 8
   }
 #endif
-#endif /* SUPPORT_UTF || COMPILE_PCRE16 || COMPILE_PCRE32 */
+#endif /* SUPPORT_UNICODE || PCRE2_CODE_UNIT_WIDTH == [16|32] */
 OP_FLAGS(SLJIT_OR | SLJIT_SET_E, TMP2, 0, TMP2, 0, SLJIT_EQUAL);
 
 sljit_emit_fast_return(compiler, RETURN_ADDR, 0);
@@ -4541,16 +5236,16 @@
 label = LABEL();
 OP1(MOVU_UCHAR, CHAR1, 0, SLJIT_MEM1(TMP1), IN_UCHARS(1));
 OP1(MOVU_UCHAR, CHAR2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(1));
-#ifndef COMPILE_PCRE8
+#if PCRE2_CODE_UNIT_WIDTH != 8
 jump = CMP(SLJIT_GREATER, CHAR1, 0, SLJIT_IMM, 255);
 #endif
 OP1(SLJIT_MOV_UB, CHAR1, 0, SLJIT_MEM2(LCC_TABLE, CHAR1), 0);
-#ifndef COMPILE_PCRE8
+#if PCRE2_CODE_UNIT_WIDTH != 8
 JUMPHERE(jump);
 jump = CMP(SLJIT_GREATER, CHAR2, 0, SLJIT_IMM, 255);
 #endif
 OP1(SLJIT_MOV_UB, CHAR2, 0, SLJIT_MEM2(LCC_TABLE, CHAR2), 0);
-#ifndef COMPILE_PCRE8
+#if PCRE2_CODE_UNIT_WIDTH != 8
 JUMPHERE(jump);
 #endif
 jump = CMP(SLJIT_NOT_EQUAL, CHAR1, 0, CHAR2, 0);
@@ -4569,21 +5264,21 @@
 #undef CHAR1
 #undef CHAR2
 
-#if defined SUPPORT_UTF && defined SUPPORT_UCP
+#if defined SUPPORT_UNICODE
 
-static const pcre_uchar * SLJIT_CALL do_utf_caselesscmp(pcre_uchar *src1, jit_arguments *args, pcre_uchar *end1)
+static PCRE2_SPTR SLJIT_CALL do_utf_caselesscmp(PCRE2_SPTR src1, jit_arguments *args, PCRE2_SPTR end1)
 {
 /* This function would be ineffective to do in JIT level. */
-pcre_uint32 c1, c2;
-const pcre_uchar *src2 = args->uchar_ptr;
-const pcre_uchar *end2 = args->end;
+sljit_ui c1, c2;
+PCRE2_SPTR src2 = args->startchar_ptr;
+PCRE2_SPTR end2 = args->end;
 const ucd_record *ur;
-const pcre_uint32 *pp;
+const sljit_ui *pp;
 
 while (src1 < end1)
   {
   if (src2 >= end2)
-    return (pcre_uchar*)1;
+    return (PCRE2_SPTR)1;
   GETCHARINC(c1, src1);
   GETCHARINC(c2, src2);
   ur = GET_UCD(c2);
@@ -4600,15 +5295,17 @@
 return src2;
 }
 
-#endif /* SUPPORT_UTF && SUPPORT_UCP */
+#endif /* SUPPORT_UNICODE */
 
-static pcre_uchar *byte_sequence_compare(compiler_common *common, BOOL caseless, pcre_uchar *cc,
+static PCRE2_SPTR compile_char1_matchingpath(compiler_common *common, PCRE2_UCHAR type, PCRE2_SPTR cc, jump_list **backtracks, BOOL check_str_ptr);
+
+static PCRE2_SPTR byte_sequence_compare(compiler_common *common, BOOL caseless, PCRE2_SPTR cc,
     compare_context *context, jump_list **backtracks)
 {
 DEFINE_COMPILER;
 unsigned int othercasebit = 0;
-pcre_uchar *othercasechar = NULL;
-#ifdef SUPPORT_UTF
+PCRE2_SPTR othercasechar = NULL;
+#ifdef SUPPORT_UNICODE
 int utflength;
 #endif
 
@@ -4617,25 +5314,25 @@
   othercasebit = char_get_othercase_bit(common, cc);
   SLJIT_ASSERT(othercasebit);
   /* Extracting bit difference info. */
-#if defined COMPILE_PCRE8
+#if PCRE2_CODE_UNIT_WIDTH == 8
   othercasechar = cc + (othercasebit >> 8);
   othercasebit &= 0xff;
-#elif defined COMPILE_PCRE16 || defined COMPILE_PCRE32
+#elif PCRE2_CODE_UNIT_WIDTH == 16 || PCRE2_CODE_UNIT_WIDTH == 32
   /* Note that this code only handles characters in the BMP. If there
   ever are characters outside the BMP whose othercase differs in only one
   bit from itself (there currently are none), this code will need to be
-  revised for COMPILE_PCRE32. */
+  revised for PCRE2_CODE_UNIT_WIDTH == 32. */
   othercasechar = cc + (othercasebit >> 9);
   if ((othercasebit & 0x100) != 0)
     othercasebit = (othercasebit & 0xff) << 8;
   else
     othercasebit &= 0xff;
-#endif /* COMPILE_PCRE[8|16|32] */
+#endif /* PCRE2_CODE_UNIT_WIDTH == [8|16|32] */
   }
 
 if (context->sourcereg == -1)
   {
-#if defined COMPILE_PCRE8
+#if PCRE2_CODE_UNIT_WIDTH == 8
 #if defined SLJIT_UNALIGNED && SLJIT_UNALIGNED
   if (context->length >= 4)
     OP1(SLJIT_MOV_SI, TMP1, 0, SLJIT_MEM1(STR_PTR), -context->length);
@@ -4644,20 +5341,20 @@
   else
 #endif
     OP1(SLJIT_MOV_UB, TMP1, 0, SLJIT_MEM1(STR_PTR), -context->length);
-#elif defined COMPILE_PCRE16
+#elif PCRE2_CODE_UNIT_WIDTH == 16
 #if defined SLJIT_UNALIGNED && SLJIT_UNALIGNED
   if (context->length >= 4)
     OP1(SLJIT_MOV_SI, TMP1, 0, SLJIT_MEM1(STR_PTR), -context->length);
   else
 #endif
     OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), -context->length);
-#elif defined COMPILE_PCRE32
+#elif PCRE2_CODE_UNIT_WIDTH == 32
   OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), -context->length);
-#endif /* COMPILE_PCRE[8|16|32] */
+#endif /* PCRE2_CODE_UNIT_WIDTH == [8|16|32] */
   context->sourcereg = TMP2;
   }
 
-#ifdef SUPPORT_UTF
+#ifdef SUPPORT_UNICODE
 utflength = 1;
 if (common->utf && HAS_EXTRALEN(*cc))
   utflength += GET_EXTRALEN(*cc);
@@ -4667,7 +5364,7 @@
 #endif
 
   context->length -= IN_UCHARS(1);
-#if (defined SLJIT_UNALIGNED && SLJIT_UNALIGNED) && (defined COMPILE_PCRE8 || defined COMPILE_PCRE16)
+#if (defined SLJIT_UNALIGNED && SLJIT_UNALIGNED) && (PCRE2_CODE_UNIT_WIDTH == 8 || PCRE2_CODE_UNIT_WIDTH == 16)
 
   /* Unaligned read is supported. */
   if (othercasebit != 0 && othercasechar == cc)
@@ -4682,7 +5379,7 @@
     }
   context->ucharptr++;
 
-#if defined COMPILE_PCRE8
+#if PCRE2_CODE_UNIT_WIDTH == 8
   if (context->ucharptr >= 4 || context->length == 0 || (context->ucharptr == 2 && context->length == 1))
 #else
   if (context->ucharptr >= 2 || context->length == 0)
@@ -4692,27 +5389,27 @@
       OP1(SLJIT_MOV_SI, context->sourcereg, 0, SLJIT_MEM1(STR_PTR), -context->length);
     else if (context->length >= 2)
       OP1(SLJIT_MOV_UH, context->sourcereg, 0, SLJIT_MEM1(STR_PTR), -context->length);
-#if defined COMPILE_PCRE8
+#if PCRE2_CODE_UNIT_WIDTH == 8
     else if (context->length >= 1)
       OP1(SLJIT_MOV_UB, context->sourcereg, 0, SLJIT_MEM1(STR_PTR), -context->length);
-#endif /* COMPILE_PCRE8 */
+#endif /* PCRE2_CODE_UNIT_WIDTH == 8 */
     context->sourcereg = context->sourcereg == TMP1 ? TMP2 : TMP1;
 
     switch(context->ucharptr)
       {
-      case 4 / sizeof(pcre_uchar):
+      case 4 / sizeof(PCRE2_UCHAR):
       if (context->oc.asint != 0)
         OP2(SLJIT_OR, context->sourcereg, 0, context->sourcereg, 0, SLJIT_IMM, context->oc.asint);
       add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, context->sourcereg, 0, SLJIT_IMM, context->c.asint | context->oc.asint));
       break;
 
-      case 2 / sizeof(pcre_uchar):
+      case 2 / sizeof(PCRE2_UCHAR):
       if (context->oc.asushort != 0)
         OP2(SLJIT_OR, context->sourcereg, 0, context->sourcereg, 0, SLJIT_IMM, context->oc.asushort);
       add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, context->sourcereg, 0, SLJIT_IMM, context->c.asushort | context->oc.asushort));
       break;
 
-#ifdef COMPILE_PCRE8
+#if PCRE2_CODE_UNIT_WIDTH == 8
       case 1:
       if (context->oc.asbyte != 0)
         OP2(SLJIT_OR, context->sourcereg, 0, context->sourcereg, 0, SLJIT_IMM, context->oc.asbyte);
@@ -4746,7 +5443,7 @@
 #endif
 
   cc++;
-#ifdef SUPPORT_UTF
+#ifdef SUPPORT_UNICODE
   utflength--;
   }
 while (utflength > 0);
@@ -4755,7 +5452,7 @@
 return cc;
 }
 
-#if defined SUPPORT_UTF || !defined COMPILE_PCRE8
+#if defined SUPPORT_UNICODE || PCRE2_CODE_UNIT_WIDTH != 8
 
 #define SET_TYPE_OFFSET(value) \
   if ((value) != typeoffset) \
@@ -4777,24 +5474,24 @@
     } \
   charoffset = (value);
 
-static void compile_xclass_matchingpath(compiler_common *common, pcre_uchar *cc, jump_list **backtracks)
+static void compile_xclass_matchingpath(compiler_common *common, PCRE2_SPTR cc, jump_list **backtracks)
 {
 DEFINE_COMPILER;
 jump_list *found = NULL;
 jump_list **list = (cc[0] & XCL_NOT) == 0 ? &found : backtracks;
 sljit_uw c, charoffset, max = 256, min = READ_CHAR_MAX;
 struct sljit_jump *jump = NULL;
-pcre_uchar *ccbegin;
+PCRE2_SPTR ccbegin;
 int compares, invertcmp, numberofcmps;
-#if defined SUPPORT_UTF && (defined COMPILE_PCRE8 || defined COMPILE_PCRE16)
+#if defined SUPPORT_UNICODE && (PCRE2_CODE_UNIT_WIDTH == 8 || PCRE2_CODE_UNIT_WIDTH == 16)
 BOOL utf = common->utf;
 #endif
 
-#ifdef SUPPORT_UCP
+#ifdef SUPPORT_UNICODE
 BOOL needstype = FALSE, needsscript = FALSE, needschar = FALSE;
 BOOL charsaved = FALSE;
-int typereg = TMP1, scriptreg = TMP1;
-const pcre_uint32 *other_cases;
+int typereg = TMP1;
+const sljit_ui *other_cases;
 sljit_uw typeoffset;
 #endif
 
@@ -4802,10 +5499,11 @@
 cc++;
 ccbegin = cc;
 compares = 0;
+
 if (cc[-1] & XCL_MAP)
   {
   min = 0;
-  cc += 32 / sizeof(pcre_uchar);
+  cc += 32 / sizeof(PCRE2_UCHAR);
   }
 
 while (*cc != XCL_END)
@@ -4817,7 +5515,7 @@
     GETCHARINCTEST(c, cc);
     if (c > max) max = c;
     if (c < min) min = c;
-#ifdef SUPPORT_UCP
+#ifdef SUPPORT_UNICODE
     needschar = TRUE;
 #endif
     }
@@ -4828,11 +5526,11 @@
     if (c < min) min = c;
     GETCHARINCTEST(c, cc);
     if (c > max) max = c;
-#ifdef SUPPORT_UCP
+#ifdef SUPPORT_UNICODE
     needschar = TRUE;
 #endif
     }
-#ifdef SUPPORT_UCP
+#ifdef SUPPORT_UNICODE
   else
     {
     SLJIT_ASSERT(*cc == XCL_PROP || *cc == XCL_NOTPROP);
@@ -4856,6 +5554,14 @@
     switch(*cc)
       {
       case PT_ANY:
+      /* Any either accepts everything or ignored. */
+      if (cc[-1] == XCL_PROP)
+        {
+        compile_char1_matchingpath(common, OP_ALLANY, cc, backtracks, FALSE);
+        if (list == backtracks)
+          add_jump(compiler, backtracks, JUMP(SLJIT_JUMP));
+        return;
+        }
       break;
 
       case PT_LAMP:
@@ -4892,10 +5598,10 @@
     }
 #endif
   }
+SLJIT_ASSERT(compares > 0);
 
 /* We are not necessary in utf mode even in 8 bit mode. */
 cc = ccbegin;
-detect_partial_match(common, backtracks);
 read_char_range(common, min, max, (cc[-1] & XCL_NOT) != 0);
 
 if ((cc[-1] & XCL_HASPROP) == 0)
@@ -4903,7 +5609,7 @@
   if ((cc[-1] & XCL_MAP) != 0)
     {
     jump = CMP(SLJIT_GREATER, TMP1, 0, SLJIT_IMM, 255);
-    if (!check_class_ranges(common, (const pcre_uint8 *)cc, (((const pcre_uint8 *)cc)[31] & 0x80) != 0, TRUE, &found))
+    if (!check_class_ranges(common, (const sljit_ub *)cc, (((const sljit_ub *)cc)[31] & 0x80) != 0, TRUE, &found))
       {
       OP2(SLJIT_AND, TMP2, 0, TMP1, 0, SLJIT_IMM, 0x7);
       OP2(SLJIT_LSHR, TMP1, 0, TMP1, 0, SLJIT_IMM, 3);
@@ -4916,7 +5622,7 @@
     add_jump(compiler, backtracks, JUMP(SLJIT_JUMP));
     JUMPHERE(jump);
 
-    cc += 32 / sizeof(pcre_uchar);
+    cc += 32 / sizeof(PCRE2_UCHAR);
     }
   else
     {
@@ -4926,13 +5632,13 @@
   }
 else if ((cc[-1] & XCL_MAP) != 0)
   {
-  OP1(SLJIT_MOV, TMP3, 0, TMP1, 0);
-#ifdef SUPPORT_UCP
+  OP1(SLJIT_MOV, RETURN_ADDR, 0, TMP1, 0);
+#ifdef SUPPORT_UNICODE
   charsaved = TRUE;
 #endif
-  if (!check_class_ranges(common, (const pcre_uint8 *)cc, FALSE, TRUE, list))
+  if (!check_class_ranges(common, (const sljit_ub *)cc, FALSE, TRUE, list))
     {
-#ifdef COMPILE_PCRE8
+#if PCRE2_CODE_UNIT_WIDTH == 8
     jump = NULL;
     if (common->utf)
 #endif
@@ -4945,51 +5651,88 @@
     OP2(SLJIT_AND | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, TMP2, 0);
     add_jump(compiler, list, JUMP(SLJIT_NOT_ZERO));
 
-#ifdef COMPILE_PCRE8
+#if PCRE2_CODE_UNIT_WIDTH == 8
     if (common->utf)
 #endif
       JUMPHERE(jump);
     }
 
-  OP1(SLJIT_MOV, TMP1, 0, TMP3, 0);
-  cc += 32 / sizeof(pcre_uchar);
+  OP1(SLJIT_MOV, TMP1, 0, RETURN_ADDR, 0);
+  cc += 32 / sizeof(PCRE2_UCHAR);
   }
 
-#ifdef SUPPORT_UCP
-/* Simple register allocation. TMP1 is preferred if possible. */
+#ifdef SUPPORT_UNICODE
 if (needstype || needsscript)
   {
   if (needschar && !charsaved)
-    OP1(SLJIT_MOV, TMP3, 0, TMP1, 0);
-  add_jump(compiler, &common->getucd, JUMP(SLJIT_FAST_CALL));
-  if (needschar)
-    {
-    if (needstype)
-      {
-      OP1(SLJIT_MOV, RETURN_ADDR, 0, TMP1, 0);
-      typereg = RETURN_ADDR;
-      }
+    OP1(SLJIT_MOV, RETURN_ADDR, 0, TMP1, 0);
 
-    if (needsscript)
-      scriptreg = TMP3;
-    OP1(SLJIT_MOV, TMP1, 0, TMP3, 0);
-    }
-  else if (needstype && needsscript)
-    scriptreg = TMP3;
-  /* In all other cases only one of them was specified, and that can goes to TMP1. */
+  OP2(SLJIT_LSHR, TMP2, 0, TMP1, 0, SLJIT_IMM, UCD_BLOCK_SHIFT);
+  OP1(SLJIT_MOV_UB, TMP2, 0, SLJIT_MEM1(TMP2), (sljit_sw)PRIV(ucd_stage1));
+  OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, UCD_BLOCK_MASK);
+  OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, UCD_BLOCK_SHIFT);
+  OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, TMP2, 0);
+  OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, (sljit_sw)PRIV(ucd_stage2));
+  OP1(SLJIT_MOV_UH, TMP2, 0, SLJIT_MEM2(TMP2, TMP1), 1);
 
+  /* Before anything else, we deal with scripts. */
   if (needsscript)
     {
-    if (scriptreg == TMP1)
+    OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, (sljit_sw)PRIV(ucd_records) + SLJIT_OFFSETOF(ucd_record, script));
+    OP1(SLJIT_MOV_UB, TMP1, 0, SLJIT_MEM2(TMP1, TMP2), 3);
+
+    ccbegin = cc;
+
+    while (*cc != XCL_END)
       {
-      OP1(SLJIT_MOV, scriptreg, 0, SLJIT_IMM, (sljit_sw)PRIV(ucd_records) + SLJIT_OFFSETOF(ucd_record, script));
-      OP1(SLJIT_MOV_UB, scriptreg, 0, SLJIT_MEM2(scriptreg, TMP2), 3);
+      if (*cc == XCL_SINGLE)
+        {
+        cc ++;
+        GETCHARINCTEST(c, cc);
+        }
+      else if (*cc == XCL_RANGE)
+        {
+        cc ++;
+        GETCHARINCTEST(c, cc);
+        GETCHARINCTEST(c, cc);
+        }
+      else
+        {
+        SLJIT_ASSERT(*cc == XCL_PROP || *cc == XCL_NOTPROP);
+        cc++;
+        if (*cc == PT_SC)
+          {
+          compares--;
+          invertcmp = (compares == 0 && list != backtracks);
+          if (cc[-1] == XCL_NOTPROP)
+            invertcmp ^= 0x1;
+          jump = CMP(SLJIT_EQUAL ^ invertcmp, TMP1, 0, SLJIT_IMM, (int)cc[1]);
+          add_jump(compiler, compares > 0 ? list : backtracks, jump);
+          }
+        cc += 2;
+        }
+      }
+
+    cc = ccbegin;
+    }
+
+  if (needschar)
+    {
+    OP1(SLJIT_MOV, TMP1, 0, RETURN_ADDR, 0);
+    }
+
+  if (needstype)
+    {
+    if (!needschar)
+      {
+      OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, (sljit_sw)PRIV(ucd_records) + SLJIT_OFFSETOF(ucd_record, chartype));
+      OP1(SLJIT_MOV_UB, TMP1, 0, SLJIT_MEM2(TMP1, TMP2), 3);
       }
     else
       {
       OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 3);
-      OP2(SLJIT_ADD, TMP2, 0, TMP2, 0, SLJIT_IMM, (sljit_sw)PRIV(ucd_records) + SLJIT_OFFSETOF(ucd_record, script));
-      OP1(SLJIT_MOV_UB, scriptreg, 0, SLJIT_MEM1(TMP2), 0);
+      OP1(SLJIT_MOV_UB, RETURN_ADDR, 0, SLJIT_MEM1(TMP2), (sljit_sw)PRIV(ucd_records) + SLJIT_OFFSETOF(ucd_record, chartype));
+      typereg = RETURN_ADDR;
       }
     }
   }
@@ -4998,7 +5741,7 @@
 /* Generating code. */
 charoffset = 0;
 numberofcmps = 0;
-#ifdef SUPPORT_UCP
+#ifdef SUPPORT_UNICODE
 typeoffset = 0;
 #endif
 
@@ -5058,23 +5801,18 @@
       numberofcmps = 0;
       }
     }
-#ifdef SUPPORT_UCP
+#ifdef SUPPORT_UNICODE
   else
     {
+    SLJIT_ASSERT(*cc == XCL_PROP || *cc == XCL_NOTPROP);
     if (*cc == XCL_NOTPROP)
       invertcmp ^= 0x1;
     cc++;
     switch(*cc)
       {
       case PT_ANY:
-      if (list != backtracks)
-        {
-        if ((cc[-1] == XCL_NOTPROP && compares > 0) || (cc[-1] == XCL_PROP && compares == 0))
-          continue;
-        }
-      else if (cc[-1] == XCL_NOTPROP)
-        continue;
-      jump = JUMP(SLJIT_JUMP);
+      if (!invertcmp)
+        jump = JUMP(SLJIT_JUMP);
       break;
 
       case PT_LAMP:
@@ -5098,7 +5836,8 @@
       break;
 
       case PT_SC:
-      jump = CMP(SLJIT_EQUAL ^ invertcmp, scriptreg, 0, SLJIT_IMM, (int)cc[1]);
+      compares++;
+      /* Do nothing. */
       break;
 
       case PT_SPACE:
@@ -5264,6 +6003,10 @@
       OP_FLAGS(SLJIT_OR | SLJIT_SET_E, TMP2, 0, TMP2, 0, SLJIT_LESS_EQUAL);
       jump = JUMP(SLJIT_NOT_ZERO ^ invertcmp);
       break;
+
+      default:
+      SLJIT_ASSERT_STOP();
+      break;
       }
     cc += 2;
     }
@@ -5282,20 +6025,14 @@
 
 #endif
 
-static pcre_uchar *compile_char1_matchingpath(compiler_common *common, pcre_uchar type, pcre_uchar *cc, jump_list **backtracks)
+static PCRE2_SPTR compile_simple_assertion_matchingpath(compiler_common *common, PCRE2_UCHAR type, PCRE2_SPTR cc, jump_list **backtracks)
 {
 DEFINE_COMPILER;
 int length;
-unsigned int c, oc, bit;
-compare_context context;
 struct sljit_jump *jump[4];
-jump_list *end_list;
-#ifdef SUPPORT_UTF
+#ifdef SUPPORT_UNICODE
 struct sljit_label *label;
-#ifdef SUPPORT_UCP
-pcre_uchar propdata[5];
-#endif
-#endif /* SUPPORT_UTF */
+#endif /* SUPPORT_UNICODE */
 
 switch(type)
   {
@@ -5317,191 +6054,6 @@
   add_jump(compiler, backtracks, JUMP(type == OP_NOT_WORD_BOUNDARY ? SLJIT_NOT_ZERO : SLJIT_ZERO));
   return cc;
 
-  case OP_NOT_DIGIT:
-  case OP_DIGIT:
-  /* Digits are usually 0-9, so it is worth to optimize them. */
-  detect_partial_match(common, backtracks);
-#if defined SUPPORT_UTF && defined COMPILE_PCRE8
-  if (common->utf && is_char7_bitset((const pcre_uint8*)common->ctypes - cbit_length + cbit_digit, FALSE))
-    read_char7_type(common, type == OP_NOT_DIGIT);
-  else
-#endif
-    read_char8_type(common, type == OP_NOT_DIGIT);
-    /* Flip the starting bit in the negative case. */
-  OP2(SLJIT_AND | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, ctype_digit);
-  add_jump(compiler, backtracks, JUMP(type == OP_DIGIT ? SLJIT_ZERO : SLJIT_NOT_ZERO));
-  return cc;
-
-  case OP_NOT_WHITESPACE:
-  case OP_WHITESPACE:
-  detect_partial_match(common, backtracks);
-#if defined SUPPORT_UTF && defined COMPILE_PCRE8
-  if (common->utf && is_char7_bitset((const pcre_uint8*)common->ctypes - cbit_length + cbit_space, FALSE))
-    read_char7_type(common, type == OP_NOT_WHITESPACE);
-  else
-#endif
-    read_char8_type(common, type == OP_NOT_WHITESPACE);
-  OP2(SLJIT_AND | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, ctype_space);
-  add_jump(compiler, backtracks, JUMP(type == OP_WHITESPACE ? SLJIT_ZERO : SLJIT_NOT_ZERO));
-  return cc;
-
-  case OP_NOT_WORDCHAR:
-  case OP_WORDCHAR:
-  detect_partial_match(common, backtracks);
-#if defined SUPPORT_UTF && defined COMPILE_PCRE8
-  if (common->utf && is_char7_bitset((const pcre_uint8*)common->ctypes - cbit_length + cbit_word, FALSE))
-    read_char7_type(common, type == OP_NOT_WORDCHAR);
-  else
-#endif
-    read_char8_type(common, type == OP_NOT_WORDCHAR);
-  OP2(SLJIT_AND | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, ctype_word);
-  add_jump(compiler, backtracks, JUMP(type == OP_WORDCHAR ? SLJIT_ZERO : SLJIT_NOT_ZERO));
-  return cc;
-
-  case OP_ANY:
-  detect_partial_match(common, backtracks);
-  read_char_range(common, common->nlmin, common->nlmax, TRUE);
-  if (common->nltype == NLTYPE_FIXED && common->newline > 255)
-    {
-    jump[0] = CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, (common->newline >> 8) & 0xff);
-    end_list = NULL;
-    if (common->mode != JIT_PARTIAL_HARD_COMPILE)
-      add_jump(compiler, &end_list, CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0));
-    else
-      check_str_end(common, &end_list);
-
-    OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), 0);
-    add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, common->newline & 0xff));
-    set_jumps(end_list, LABEL());
-    JUMPHERE(jump[0]);
-    }
-  else
-    check_newlinechar(common, common->nltype, backtracks, TRUE);
-  return cc;
-
-  case OP_ALLANY:
-  detect_partial_match(common, backtracks);
-#ifdef SUPPORT_UTF
-  if (common->utf)
-    {
-    OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), 0);
-    OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
-#if defined COMPILE_PCRE8 || defined COMPILE_PCRE16
-#if defined COMPILE_PCRE8
-    jump[0] = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0xc0);
-    OP1(SLJIT_MOV_UB, TMP1, 0, SLJIT_MEM1(TMP1), (sljit_sw)PRIV(utf8_table4) - 0xc0);
-    OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0);
-#elif defined COMPILE_PCRE16
-    jump[0] = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0xd800);
-    OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xfc00);
-    OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0xd800);
-    OP_FLAGS(SLJIT_MOV, TMP1, 0, SLJIT_UNUSED, 0, SLJIT_EQUAL);
-    OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 1);
-    OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0);
-#endif
-    JUMPHERE(jump[0]);
-#endif /* COMPILE_PCRE[8|16] */
-    return cc;
-    }
-#endif
-  OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
-  return cc;
-
-  case OP_ANYBYTE:
-  detect_partial_match(common, backtracks);
-  OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
-  return cc;
-
-#ifdef SUPPORT_UTF
-#ifdef SUPPORT_UCP
-  case OP_NOTPROP:
-  case OP_PROP:
-  propdata[0] = XCL_HASPROP;
-  propdata[1] = type == OP_NOTPROP ? XCL_NOTPROP : XCL_PROP;
-  propdata[2] = cc[0];
-  propdata[3] = cc[1];
-  propdata[4] = XCL_END;
-  compile_xclass_matchingpath(common, propdata, backtracks);
-  return cc + 2;
-#endif
-#endif
-
-  case OP_ANYNL:
-  detect_partial_match(common, backtracks);
-  read_char_range(common, common->bsr_nlmin, common->bsr_nlmax, FALSE);
-  jump[0] = CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, CHAR_CR);
-  /* We don't need to handle soft partial matching case. */
-  end_list = NULL;
-  if (common->mode != JIT_PARTIAL_HARD_COMPILE)
-    add_jump(compiler, &end_list, CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0));
-  else
-    check_str_end(common, &end_list);
-  OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), 0);
-  jump[1] = CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, CHAR_NL);
-  OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
-  jump[2] = JUMP(SLJIT_JUMP);
-  JUMPHERE(jump[0]);
-  check_newlinechar(common, common->bsr_nltype, backtracks, FALSE);
-  set_jumps(end_list, LABEL());
-  JUMPHERE(jump[1]);
-  JUMPHERE(jump[2]);
-  return cc;
-
-  case OP_NOT_HSPACE:
-  case OP_HSPACE:
-  detect_partial_match(common, backtracks);
-  read_char_range(common, 0x9, 0x3000, type == OP_NOT_HSPACE);
-  add_jump(compiler, &common->hspace, JUMP(SLJIT_FAST_CALL));
-  add_jump(compiler, backtracks, JUMP(type == OP_NOT_HSPACE ? SLJIT_NOT_ZERO : SLJIT_ZERO));
-  return cc;
-
-  case OP_NOT_VSPACE:
-  case OP_VSPACE:
-  detect_partial_match(common, backtracks);
-  read_char_range(common, 0xa, 0x2029, type == OP_NOT_VSPACE);
-  add_jump(compiler, &common->vspace, JUMP(SLJIT_FAST_CALL));
-  add_jump(compiler, backtracks, JUMP(type == OP_NOT_VSPACE ? SLJIT_NOT_ZERO : SLJIT_ZERO));
-  return cc;
-
-#ifdef SUPPORT_UCP
-  case OP_EXTUNI:
-  detect_partial_match(common, backtracks);
-  read_char(common);
-  add_jump(compiler, &common->getucd, JUMP(SLJIT_FAST_CALL));
-  OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, (sljit_sw)PRIV(ucd_records) + SLJIT_OFFSETOF(ucd_record, gbprop));
-  /* Optimize register allocation: use a real register. */
-  OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LOCALS0, STACK_TOP, 0);
-  OP1(SLJIT_MOV_UB, STACK_TOP, 0, SLJIT_MEM2(TMP1, TMP2), 3);
-
-  label = LABEL();
-  jump[0] = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0);
-  OP1(SLJIT_MOV, TMP3, 0, STR_PTR, 0);
-  read_char(common);
-  add_jump(compiler, &common->getucd, JUMP(SLJIT_FAST_CALL));
-  OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, (sljit_sw)PRIV(ucd_records) + SLJIT_OFFSETOF(ucd_record, gbprop));
-  OP1(SLJIT_MOV_UB, TMP2, 0, SLJIT_MEM2(TMP1, TMP2), 3);
-
-  OP2(SLJIT_SHL, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, 2);
-  OP1(SLJIT_MOV_UI, TMP1, 0, SLJIT_MEM1(STACK_TOP), (sljit_sw)PRIV(ucp_gbtable));
-  OP1(SLJIT_MOV, STACK_TOP, 0, TMP2, 0);
-  OP2(SLJIT_SHL, TMP2, 0, SLJIT_IMM, 1, TMP2, 0);
-  OP2(SLJIT_AND | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, TMP2, 0);
-  JUMPTO(SLJIT_NOT_ZERO, label);
-
-  OP1(SLJIT_MOV, STR_PTR, 0, TMP3, 0);
-  JUMPHERE(jump[0]);
-  OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), LOCALS0);
-
-  if (common->mode == JIT_PARTIAL_HARD_COMPILE)
-    {
-    jump[0] = CMP(SLJIT_LESS, STR_PTR, 0, STR_END, 0);
-    /* Since we successfully read a char above, partial matching must occure. */
-    check_partial(common, TRUE);
-    JUMPHERE(jump[0]);
-    }
-  return cc;
-#endif
-
   case OP_EODN:
   /* Requires rather complex checks. */
   jump[0] = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0);
@@ -5509,7 +6061,7 @@
     {
     OP2(SLJIT_ADD, TMP2, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(2));
     OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0));
-    if (common->mode == JIT_COMPILE)
+    if (common->mode == PCRE2_JIT_COMPLETE)
       add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, TMP2, 0, STR_END, 0));
     else
       {
@@ -5579,20 +6131,22 @@
   OP1(SLJIT_MOV, TMP2, 0, ARGUMENTS, 0);
   OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(jit_arguments, begin));
   add_jump(compiler, backtracks, CMP(SLJIT_GREATER, STR_PTR, 0, TMP1, 0));
-  OP1(SLJIT_MOV_UB, TMP2, 0, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(jit_arguments, notbol));
-  add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, TMP2, 0, SLJIT_IMM, 0));
+  OP2(SLJIT_IAND | SLJIT_SET_E, SLJIT_UNUSED, 0, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(jit_arguments, options), SLJIT_IMM, PCRE2_NOTBOL);
+  add_jump(compiler, backtracks, JUMP(SLJIT_NOT_ZERO));
   return cc;
 
   case OP_CIRCM:
   OP1(SLJIT_MOV, TMP2, 0, ARGUMENTS, 0);
   OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(jit_arguments, begin));
   jump[1] = CMP(SLJIT_GREATER, STR_PTR, 0, TMP1, 0);
-  OP1(SLJIT_MOV_UB, TMP2, 0, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(jit_arguments, notbol));
-  add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, TMP2, 0, SLJIT_IMM, 0));
+  OP2(SLJIT_IAND | SLJIT_SET_E, SLJIT_UNUSED, 0, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(jit_arguments, options), SLJIT_IMM, PCRE2_NOTBOL);
+  add_jump(compiler, backtracks, JUMP(SLJIT_NOT_ZERO));
   jump[0] = JUMP(SLJIT_JUMP);
   JUMPHERE(jump[1]);
 
-  add_jump(compiler, backtracks, CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0));
+  if (!common->alt_circumflex)
+    add_jump(compiler, backtracks, CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0));
+
   if (common->nltype == NLTYPE_FIXED && common->newline > 255)
     {
     OP2(SLJIT_SUB, TMP2, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(2));
@@ -5613,11 +6167,11 @@
 
   case OP_DOLL:
   OP1(SLJIT_MOV, TMP2, 0, ARGUMENTS, 0);
-  OP1(SLJIT_MOV_UB, TMP2, 0, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(jit_arguments, noteol));
-  add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, TMP2, 0, SLJIT_IMM, 0));
+  OP2(SLJIT_IAND | SLJIT_SET_E, SLJIT_UNUSED, 0, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(jit_arguments, options), SLJIT_IMM, PCRE2_NOTEOL);
+  add_jump(compiler, backtracks, JUMP(SLJIT_NOT_ZERO));
 
   if (!common->endonly)
-    compile_char1_matchingpath(common, OP_EODN, cc, backtracks);
+    compile_simple_assertion_matchingpath(common, OP_EODN, cc, backtracks);
   else
     {
     add_jump(compiler, backtracks, CMP(SLJIT_LESS, STR_PTR, 0, STR_END, 0));
@@ -5628,8 +6182,8 @@
   case OP_DOLLM:
   jump[1] = CMP(SLJIT_LESS, STR_PTR, 0, STR_END, 0);
   OP1(SLJIT_MOV, TMP2, 0, ARGUMENTS, 0);
-  OP1(SLJIT_MOV_UB, TMP2, 0, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(jit_arguments, noteol));
-  add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, TMP2, 0, SLJIT_IMM, 0));
+  OP2(SLJIT_IAND | SLJIT_SET_E, SLJIT_UNUSED, 0, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(jit_arguments, options), SLJIT_IMM, PCRE2_NOTEOL);
+  add_jump(compiler, backtracks, JUMP(SLJIT_NOT_ZERO));
   check_partial(common, FALSE);
   jump[0] = JUMP(SLJIT_JUMP);
   JUMPHERE(jump[1]);
@@ -5638,7 +6192,7 @@
     {
     OP2(SLJIT_ADD, TMP2, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(2));
     OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0));
-    if (common->mode == JIT_COMPILE)
+    if (common->mode == PCRE2_JIT_COMPLETE)
       add_jump(compiler, backtracks, CMP(SLJIT_GREATER, TMP2, 0, STR_END, 0));
     else
       {
@@ -5662,13 +6216,254 @@
   JUMPHERE(jump[0]);
   return cc;
 
+  case OP_REVERSE:
+  length = GET(cc, 0);
+  if (length == 0)
+    return cc + LINK_SIZE;
+  OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0);
+#ifdef SUPPORT_UNICODE
+  if (common->utf)
+    {
+    OP1(SLJIT_MOV, TMP3, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, begin));
+    OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, length);
+    label = LABEL();
+    add_jump(compiler, backtracks, CMP(SLJIT_LESS_EQUAL, STR_PTR, 0, TMP3, 0));
+    skip_char_back(common);
+    OP2(SLJIT_SUB | SLJIT_SET_E, TMP2, 0, TMP2, 0, SLJIT_IMM, 1);
+    JUMPTO(SLJIT_NOT_ZERO, label);
+    }
+  else
+#endif
+    {
+    OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, begin));
+    OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(length));
+    add_jump(compiler, backtracks, CMP(SLJIT_LESS, STR_PTR, 0, TMP1, 0));
+    }
+  check_start_used_ptr(common);
+  return cc + LINK_SIZE;
+  }
+SLJIT_ASSERT_STOP();
+return cc;
+}
+
+static PCRE2_SPTR compile_char1_matchingpath(compiler_common *common, PCRE2_UCHAR type, PCRE2_SPTR cc, jump_list **backtracks, BOOL check_str_ptr)
+{
+DEFINE_COMPILER;
+int length;
+unsigned int c, oc, bit;
+compare_context context;
+struct sljit_jump *jump[3];
+jump_list *end_list;
+#ifdef SUPPORT_UNICODE
+struct sljit_label *label;
+PCRE2_UCHAR propdata[5];
+#endif /* SUPPORT_UNICODE */
+
+switch(type)
+  {
+  case OP_NOT_DIGIT:
+  case OP_DIGIT:
+  /* Digits are usually 0-9, so it is worth to optimize them. */
+  if (check_str_ptr)
+    detect_partial_match(common, backtracks);
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH == 8
+  if (common->utf && is_char7_bitset((const sljit_ub*)common->ctypes - cbit_length + cbit_digit, FALSE))
+    read_char7_type(common, type == OP_NOT_DIGIT);
+  else
+#endif
+    read_char8_type(common, type == OP_NOT_DIGIT);
+    /* Flip the starting bit in the negative case. */
+  OP2(SLJIT_AND | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, ctype_digit);
+  add_jump(compiler, backtracks, JUMP(type == OP_DIGIT ? SLJIT_ZERO : SLJIT_NOT_ZERO));
+  return cc;
+
+  case OP_NOT_WHITESPACE:
+  case OP_WHITESPACE:
+  if (check_str_ptr)
+    detect_partial_match(common, backtracks);
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH == 8
+  if (common->utf && is_char7_bitset((const sljit_ub*)common->ctypes - cbit_length + cbit_space, FALSE))
+    read_char7_type(common, type == OP_NOT_WHITESPACE);
+  else
+#endif
+    read_char8_type(common, type == OP_NOT_WHITESPACE);
+  OP2(SLJIT_AND | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, ctype_space);
+  add_jump(compiler, backtracks, JUMP(type == OP_WHITESPACE ? SLJIT_ZERO : SLJIT_NOT_ZERO));
+  return cc;
+
+  case OP_NOT_WORDCHAR:
+  case OP_WORDCHAR:
+  if (check_str_ptr)
+    detect_partial_match(common, backtracks);
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH == 8
+  if (common->utf && is_char7_bitset((const sljit_ub*)common->ctypes - cbit_length + cbit_word, FALSE))
+    read_char7_type(common, type == OP_NOT_WORDCHAR);
+  else
+#endif
+    read_char8_type(common, type == OP_NOT_WORDCHAR);
+  OP2(SLJIT_AND | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, ctype_word);
+  add_jump(compiler, backtracks, JUMP(type == OP_WORDCHAR ? SLJIT_ZERO : SLJIT_NOT_ZERO));
+  return cc;
+
+  case OP_ANY:
+  if (check_str_ptr)
+    detect_partial_match(common, backtracks);
+  read_char_range(common, common->nlmin, common->nlmax, TRUE);
+  if (common->nltype == NLTYPE_FIXED && common->newline > 255)
+    {
+    jump[0] = CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, (common->newline >> 8) & 0xff);
+    end_list = NULL;
+    if (common->mode != PCRE2_JIT_PARTIAL_HARD)
+      add_jump(compiler, &end_list, CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0));
+    else
+      check_str_end(common, &end_list);
+
+    OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), 0);
+    add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, common->newline & 0xff));
+    set_jumps(end_list, LABEL());
+    JUMPHERE(jump[0]);
+    }
+  else
+    check_newlinechar(common, common->nltype, backtracks, TRUE);
+  return cc;
+
+  case OP_ALLANY:
+  if (check_str_ptr)
+    detect_partial_match(common, backtracks);
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
+  if (common->utf)
+    {
+    OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), 0);
+    OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
+#if PCRE2_CODE_UNIT_WIDTH == 8 || PCRE2_CODE_UNIT_WIDTH == 16
+#if PCRE2_CODE_UNIT_WIDTH == 8
+    jump[0] = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0xc0);
+    OP1(SLJIT_MOV_UB, TMP1, 0, SLJIT_MEM1(TMP1), (sljit_sw)PRIV(utf8_table4) - 0xc0);
+    OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0);
+#elif PCRE2_CODE_UNIT_WIDTH == 16
+    jump[0] = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0xd800);
+    OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xfc00);
+    OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0xd800);
+    OP_FLAGS(SLJIT_MOV, TMP1, 0, SLJIT_UNUSED, 0, SLJIT_EQUAL);
+    OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 1);
+    OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0);
+#endif
+    JUMPHERE(jump[0]);
+#endif /* PCRE2_CODE_UNIT_WIDTH == [8|16] */
+    return cc;
+    }
+#endif
+  OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
+  return cc;
+
+  case OP_ANYBYTE:
+  if (check_str_ptr)
+    detect_partial_match(common, backtracks);
+  OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
+  return cc;
+
+#ifdef SUPPORT_UNICODE
+  case OP_NOTPROP:
+  case OP_PROP:
+  propdata[0] = XCL_HASPROP;
+  propdata[1] = type == OP_NOTPROP ? XCL_NOTPROP : XCL_PROP;
+  propdata[2] = cc[0];
+  propdata[3] = cc[1];
+  propdata[4] = XCL_END;
+  if (check_str_ptr)
+    detect_partial_match(common, backtracks);
+  compile_xclass_matchingpath(common, propdata, backtracks);
+  return cc + 2;
+#endif
+
+  case OP_ANYNL:
+  if (check_str_ptr)
+    detect_partial_match(common, backtracks);
+  read_char_range(common, common->bsr_nlmin, common->bsr_nlmax, FALSE);
+  jump[0] = CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, CHAR_CR);
+  /* We don't need to handle soft partial matching case. */
+  end_list = NULL;
+  if (common->mode != PCRE2_JIT_PARTIAL_HARD)
+    add_jump(compiler, &end_list, CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0));
+  else
+    check_str_end(common, &end_list);
+  OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), 0);
+  jump[1] = CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, CHAR_NL);
+  OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
+  jump[2] = JUMP(SLJIT_JUMP);
+  JUMPHERE(jump[0]);
+  check_newlinechar(common, common->bsr_nltype, backtracks, FALSE);
+  set_jumps(end_list, LABEL());
+  JUMPHERE(jump[1]);
+  JUMPHERE(jump[2]);
+  return cc;
+
+  case OP_NOT_HSPACE:
+  case OP_HSPACE:
+  if (check_str_ptr)
+    detect_partial_match(common, backtracks);
+  read_char_range(common, 0x9, 0x3000, type == OP_NOT_HSPACE);
+  add_jump(compiler, &common->hspace, JUMP(SLJIT_FAST_CALL));
+  add_jump(compiler, backtracks, JUMP(type == OP_NOT_HSPACE ? SLJIT_NOT_ZERO : SLJIT_ZERO));
+  return cc;
+
+  case OP_NOT_VSPACE:
+  case OP_VSPACE:
+  if (check_str_ptr)
+    detect_partial_match(common, backtracks);
+  read_char_range(common, 0xa, 0x2029, type == OP_NOT_VSPACE);
+  add_jump(compiler, &common->vspace, JUMP(SLJIT_FAST_CALL));
+  add_jump(compiler, backtracks, JUMP(type == OP_NOT_VSPACE ? SLJIT_NOT_ZERO : SLJIT_ZERO));
+  return cc;
+
+#ifdef SUPPORT_UNICODE
+  case OP_EXTUNI:
+  if (check_str_ptr)
+    detect_partial_match(common, backtracks);
+  read_char(common);
+  add_jump(compiler, &common->getucd, JUMP(SLJIT_FAST_CALL));
+  OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, (sljit_sw)PRIV(ucd_records) + SLJIT_OFFSETOF(ucd_record, gbprop));
+  /* Optimize register allocation: use a real register. */
+  OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LOCALS0, STACK_TOP, 0);
+  OP1(SLJIT_MOV_UB, STACK_TOP, 0, SLJIT_MEM2(TMP1, TMP2), 3);
+
+  label = LABEL();
+  jump[0] = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0);
+  OP1(SLJIT_MOV, TMP3, 0, STR_PTR, 0);
+  read_char(common);
+  add_jump(compiler, &common->getucd, JUMP(SLJIT_FAST_CALL));
+  OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, (sljit_sw)PRIV(ucd_records) + SLJIT_OFFSETOF(ucd_record, gbprop));
+  OP1(SLJIT_MOV_UB, TMP2, 0, SLJIT_MEM2(TMP1, TMP2), 3);
+
+  OP2(SLJIT_SHL, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, 2);
+  OP1(SLJIT_MOV_UI, TMP1, 0, SLJIT_MEM1(STACK_TOP), (sljit_sw)PRIV(ucp_gbtable));
+  OP1(SLJIT_MOV, STACK_TOP, 0, TMP2, 0);
+  OP2(SLJIT_SHL, TMP2, 0, SLJIT_IMM, 1, TMP2, 0);
+  OP2(SLJIT_AND | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, TMP2, 0);
+  JUMPTO(SLJIT_NOT_ZERO, label);
+
+  OP1(SLJIT_MOV, STR_PTR, 0, TMP3, 0);
+  JUMPHERE(jump[0]);
+  OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), LOCALS0);
+
+  if (common->mode == PCRE2_JIT_PARTIAL_HARD)
+    {
+    jump[0] = CMP(SLJIT_LESS, STR_PTR, 0, STR_END, 0);
+    /* Since we successfully read a char above, partial matching must occure. */
+    check_partial(common, TRUE);
+    JUMPHERE(jump[0]);
+    }
+  return cc;
+#endif
+
   case OP_CHAR:
   case OP_CHARI:
   length = 1;
-#ifdef SUPPORT_UTF
+#ifdef SUPPORT_UNICODE
   if (common->utf && HAS_EXTRALEN(*cc)) length += GET_EXTRALEN(*cc);
 #endif
-  if (common->mode == JIT_COMPILE && (type == OP_CHAR || !char_has_othercase(common, cc) || char_get_othercase_bit(common, cc) != 0))
+  if (common->mode == PCRE2_JIT_COMPLETE && check_str_ptr
+      && (type == OP_CHAR || !char_has_othercase(common, cc) || char_get_othercase_bit(common, cc) != 0))
     {
     OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(length));
     add_jump(compiler, backtracks, CMP(SLJIT_GREATER, STR_PTR, 0, STR_END, 0));
@@ -5681,8 +6476,9 @@
     return byte_sequence_compare(common, type == OP_CHARI, cc, &context, backtracks);
     }
 
-  detect_partial_match(common, backtracks);
-#ifdef SUPPORT_UTF
+  if (check_str_ptr)
+    detect_partial_match(common, backtracks);
+#ifdef SUPPORT_UNICODE
   if (common->utf)
     {
     GETCHAR(c, cc);
@@ -5713,12 +6509,14 @@
 
   case OP_NOT:
   case OP_NOTI:
-  detect_partial_match(common, backtracks);
+  if (check_str_ptr)
+    detect_partial_match(common, backtracks);
+
   length = 1;
-#ifdef SUPPORT_UTF
+#ifdef SUPPORT_UNICODE
   if (common->utf)
     {
-#ifdef COMPILE_PCRE8
+#if PCRE2_CODE_UNIT_WIDTH == 8
     c = *cc;
     if (c < 128)
       {
@@ -5740,13 +6538,13 @@
       return cc + 1;
       }
     else
-#endif /* COMPILE_PCRE8 */
+#endif /* PCRE2_CODE_UNIT_WIDTH == 8 */
       {
       GETCHARLEN(c, cc, length);
       }
     }
   else
-#endif /* SUPPORT_UTF */
+#endif /* SUPPORT_UNICODE */
     c = *cc;
 
   if (type == OP_NOT || !char_has_othercase(common, cc))
@@ -5774,19 +6572,20 @@
 
   case OP_CLASS:
   case OP_NCLASS:
-  detect_partial_match(common, backtracks);
+  if (check_str_ptr)
+    detect_partial_match(common, backtracks);
 
-#if defined SUPPORT_UTF && defined COMPILE_PCRE8
-  bit = (common->utf && is_char7_bitset((const pcre_uint8 *)cc, type == OP_NCLASS)) ? 127 : 255;
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH == 8
+  bit = (common->utf && is_char7_bitset((const sljit_ub *)cc, type == OP_NCLASS)) ? 127 : 255;
   read_char_range(common, 0, bit, type == OP_NCLASS);
 #else
   read_char_range(common, 0, 255, type == OP_NCLASS);
 #endif
 
-  if (check_class_ranges(common, (const pcre_uint8 *)cc, type == OP_NCLASS, FALSE, backtracks))
-    return cc + 32 / sizeof(pcre_uchar);
+  if (check_class_ranges(common, (const sljit_ub *)cc, type == OP_NCLASS, FALSE, backtracks))
+    return cc + 32 / sizeof(PCRE2_UCHAR);
 
-#if defined SUPPORT_UTF && defined COMPILE_PCRE8
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH == 8
   jump[0] = NULL;
   if (common->utf)
     {
@@ -5797,14 +6596,14 @@
       jump[0] = NULL;
       }
     }
-#elif !defined COMPILE_PCRE8
+#elif PCRE2_CODE_UNIT_WIDTH != 8
   jump[0] = CMP(SLJIT_GREATER, TMP1, 0, SLJIT_IMM, 255);
   if (type == OP_CLASS)
     {
     add_jump(compiler, backtracks, jump[0]);
     jump[0] = NULL;
     }
-#endif /* SUPPORT_UTF && COMPILE_PCRE8 */
+#endif /* SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH == 8 */
 
   OP2(SLJIT_AND, TMP2, 0, TMP1, 0, SLJIT_IMM, 0x7);
   OP2(SLJIT_LSHR, TMP1, 0, TMP1, 0, SLJIT_IMM, 3);
@@ -5813,55 +6612,30 @@
   OP2(SLJIT_AND | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, TMP2, 0);
   add_jump(compiler, backtracks, JUMP(SLJIT_ZERO));
 
-#if defined SUPPORT_UTF || !defined COMPILE_PCRE8
+#if defined SUPPORT_UNICODE || PCRE2_CODE_UNIT_WIDTH != 8
   if (jump[0] != NULL)
     JUMPHERE(jump[0]);
 #endif
+  return cc + 32 / sizeof(PCRE2_UCHAR);
 
-  return cc + 32 / sizeof(pcre_uchar);
-
-#if defined SUPPORT_UTF || defined COMPILE_PCRE16 || defined COMPILE_PCRE32
+#if defined SUPPORT_UNICODE || PCRE2_CODE_UNIT_WIDTH == 16 || PCRE2_CODE_UNIT_WIDTH == 32
   case OP_XCLASS:
+  if (check_str_ptr)
+    detect_partial_match(common, backtracks);
   compile_xclass_matchingpath(common, cc + LINK_SIZE, backtracks);
   return cc + GET(cc, 0) - 1;
 #endif
-
-  case OP_REVERSE:
-  length = GET(cc, 0);
-  if (length == 0)
-    return cc + LINK_SIZE;
-  OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0);
-#ifdef SUPPORT_UTF
-  if (common->utf)
-    {
-    OP1(SLJIT_MOV, TMP3, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, begin));
-    OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, length);
-    label = LABEL();
-    add_jump(compiler, backtracks, CMP(SLJIT_LESS_EQUAL, STR_PTR, 0, TMP3, 0));
-    skip_char_back(common);
-    OP2(SLJIT_SUB | SLJIT_SET_E, TMP2, 0, TMP2, 0, SLJIT_IMM, 1);
-    JUMPTO(SLJIT_NOT_ZERO, label);
-    }
-  else
-#endif
-    {
-    OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, begin));
-    OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(length));
-    add_jump(compiler, backtracks, CMP(SLJIT_LESS, STR_PTR, 0, TMP1, 0));
-    }
-  check_start_used_ptr(common);
-  return cc + LINK_SIZE;
   }
 SLJIT_ASSERT_STOP();
 return cc;
 }
 
-static SLJIT_INLINE pcre_uchar *compile_charn_matchingpath(compiler_common *common, pcre_uchar *cc, pcre_uchar *ccend, jump_list **backtracks)
+static SLJIT_INLINE PCRE2_SPTR compile_charn_matchingpath(compiler_common *common, PCRE2_SPTR cc, PCRE2_SPTR ccend, jump_list **backtracks)
 {
 /* This function consumes at least one input character. */
 /* To decrease the number of length checks, we try to concatenate the fixed length character sequences. */
 DEFINE_COMPILER;
-pcre_uchar *ccbegin = cc;
+PCRE2_SPTR ccbegin = cc;
 compare_context context;
 int size;
 
@@ -5874,7 +6648,7 @@
   if (*cc == OP_CHAR)
     {
     size = 1;
-#ifdef SUPPORT_UTF
+#ifdef SUPPORT_UNICODE
     if (common->utf && HAS_EXTRALEN(cc[1]))
       size += GET_EXTRALEN(cc[1]);
 #endif
@@ -5882,7 +6656,7 @@
   else if (*cc == OP_CHARI)
     {
     size = 1;
-#ifdef SUPPORT_UTF
+#ifdef SUPPORT_UNICODE
     if (common->utf)
       {
       if (char_has_othercase(common, cc + 1) && char_get_othercase_bit(common, cc + 1) == 0)
@@ -5919,11 +6693,11 @@
   }
 
 /* A non-fixed length character will be checked if length == 0. */
-return compile_char1_matchingpath(common, *cc, cc + 1, backtracks);
+return compile_char1_matchingpath(common, *cc, cc + 1, backtracks, TRUE);
 }
 
 /* Forward definitions. */
-static void compile_matchingpath(compiler_common *, pcre_uchar *, pcre_uchar *, backtrack_common *);
+static void compile_matchingpath(compiler_common *, PCRE2_SPTR, PCRE2_SPTR, backtrack_common *);
 static void compile_backtrackingpath(compiler_common *, struct backtrack_common *);
 
 #define PUSH_BACKTRACK(size, ccstart, error) \
@@ -5954,12 +6728,12 @@
 
 #define BACKTRACK_AS(type) ((type *)backtrack)
 
-static void compile_dnref_search(compiler_common *common, pcre_uchar *cc, jump_list **backtracks)
+static void compile_dnref_search(compiler_common *common, PCRE2_SPTR cc, jump_list **backtracks)
 {
 /* The OVECTOR offset goes to TMP2. */
 DEFINE_COMPILER;
 int count = GET2(cc, 1 + IMM2_SIZE);
-pcre_uchar *slot = common->name_table + GET2(cc, 1) * common->name_entry_size;
+PCRE2_SPTR slot = common->name_table + GET2(cc, 1) * common->name_entry_size;
 unsigned int offset;
 jump_list *found = NULL;
 
@@ -5978,13 +6752,13 @@
 
 offset = GET2(slot, 0) << 1;
 GET_LOCAL_BASE(TMP2, 0, OVECTOR(offset));
-if (backtracks != NULL && !common->jscript_compat)
+if (backtracks != NULL && !common->unset_backref)
   add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset), TMP1, 0));
 
 set_jumps(found, LABEL());
 }
 
-static void compile_ref_matchingpath(compiler_common *common, pcre_uchar *cc, jump_list **backtracks, BOOL withchecks, BOOL emptyfail)
+static void compile_ref_matchingpath(compiler_common *common, PCRE2_SPTR cc, jump_list **backtracks, BOOL withchecks, BOOL emptyfail)
 {
 DEFINE_COMPILER;
 BOOL ref = (*cc == OP_REF || *cc == OP_REFI);
@@ -5998,13 +6772,13 @@
   offset = GET2(cc, 1) << 1;
   OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset));
   /* OVECTOR(1) contains the "string begin - 1" constant. */
-  if (withchecks && !common->jscript_compat)
+  if (withchecks && !common->unset_backref)
     add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(1)));
   }
 else
   OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP2), 0);
 
-#if defined SUPPORT_UTF && defined SUPPORT_UCP
+#if defined SUPPORT_UNICODE
 if (common->utf && *cc == OP_REFI)
   {
   SLJIT_ASSERT(TMP1 == SLJIT_R0 && STACK_TOP == SLJIT_R1 && TMP2 == SLJIT_R2);
@@ -6019,10 +6793,10 @@
   /* Needed to save important temporary registers. */
   OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LOCALS0, STACK_TOP, 0);
   OP1(SLJIT_MOV, SLJIT_R1, 0, ARGUMENTS, 0);
-  OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_R1), SLJIT_OFFSETOF(jit_arguments, uchar_ptr), STR_PTR, 0);
+  OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_R1), SLJIT_OFFSETOF(jit_arguments, startchar_ptr), STR_PTR, 0);
   sljit_emit_ijump(compiler, SLJIT_CALL3, SLJIT_IMM, SLJIT_FUNC_OFFSET(do_utf_caselesscmp));
   OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), LOCALS0);
-  if (common->mode == JIT_COMPILE)
+  if (common->mode == PCRE2_JIT_COMPLETE)
     add_jump(compiler, backtracks, CMP(SLJIT_LESS_EQUAL, SLJIT_RETURN_REG, 0, SLJIT_IMM, 1));
   else
     {
@@ -6035,7 +6809,7 @@
   OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_RETURN_REG, 0);
   }
 else
-#endif /* SUPPORT_UTF && SUPPORT_UCP */
+#endif /* SUPPORT_UNICODE */
   {
   if (ref)
     OP2(SLJIT_SUB | SLJIT_SET_E, TMP2, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset + 1), TMP1, 0);
@@ -6047,13 +6821,13 @@
 
   OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP2, 0);
   partial = CMP(SLJIT_GREATER, STR_PTR, 0, STR_END, 0);
-  if (common->mode == JIT_COMPILE)
+  if (common->mode == PCRE2_JIT_COMPLETE)
     add_jump(compiler, backtracks, partial);
 
   add_jump(compiler, *cc == OP_REF ? &common->casefulcmp : &common->caselesscmp, JUMP(SLJIT_FAST_CALL));
   add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, TMP2, 0, SLJIT_IMM, 0));
 
-  if (common->mode != JIT_COMPILE)
+  if (common->mode != PCRE2_JIT_COMPLETE)
     {
     nopartial = JUMP(SLJIT_JUMP);
     JUMPHERE(partial);
@@ -6080,21 +6854,21 @@
   }
 }
 
-static SLJIT_INLINE pcre_uchar *compile_ref_iterator_matchingpath(compiler_common *common, pcre_uchar *cc, backtrack_common *parent)
+static SLJIT_INLINE PCRE2_SPTR compile_ref_iterator_matchingpath(compiler_common *common, PCRE2_SPTR cc, backtrack_common *parent)
 {
 DEFINE_COMPILER;
 BOOL ref = (*cc == OP_REF || *cc == OP_REFI);
 backtrack_common *backtrack;
-pcre_uchar type;
+PCRE2_UCHAR type;
 int offset = 0;
 struct sljit_label *label;
 struct sljit_jump *zerolength;
 struct sljit_jump *jump = NULL;
-pcre_uchar *ccbegin = cc;
+PCRE2_SPTR ccbegin = cc;
 int min = 0, max = 0;
 BOOL minimize;
 
-PUSH_BACKTRACK(sizeof(iterator_backtrack), cc, NULL);
+PUSH_BACKTRACK(sizeof(ref_iterator_backtrack), cc, NULL);
 
 if (ref)
   offset = GET2(cc, 1) << 1;
@@ -6214,7 +6988,7 @@
     }
 
   JUMPHERE(zerolength);
-  BACKTRACK_AS(iterator_backtrack)->matchingpath = LABEL();
+  BACKTRACK_AS(ref_iterator_backtrack)->matchingpath = LABEL();
 
   count_match(common);
   return cc;
@@ -6260,7 +7034,7 @@
     }
   }
 
-BACKTRACK_AS(iterator_backtrack)->matchingpath = LABEL();
+BACKTRACK_AS(ref_iterator_backtrack)->matchingpath = LABEL();
 if (max > 0)
   add_jump(compiler, &backtrack->topbacktracks, CMP(SLJIT_GREATER_EQUAL, SLJIT_MEM1(STACK_TOP), STACK(1), SLJIT_IMM, max));
 
@@ -6274,7 +7048,7 @@
   OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(1));
   OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, 1);
   OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(1), TMP1, 0);
-  CMPTO(SLJIT_LESS, TMP1, 0, SLJIT_IMM, min, BACKTRACK_AS(iterator_backtrack)->matchingpath);
+  CMPTO(SLJIT_LESS, TMP1, 0, SLJIT_IMM, min, BACKTRACK_AS(ref_iterator_backtrack)->matchingpath);
   }
 else if (max > 0)
   OP2(SLJIT_ADD, SLJIT_MEM1(STACK_TOP), STACK(1), SLJIT_MEM1(STACK_TOP), STACK(1), SLJIT_IMM, 1);
@@ -6287,14 +7061,14 @@
 return cc;
 }
 
-static SLJIT_INLINE pcre_uchar *compile_recurse_matchingpath(compiler_common *common, pcre_uchar *cc, backtrack_common *parent)
+static SLJIT_INLINE PCRE2_SPTR compile_recurse_matchingpath(compiler_common *common, PCRE2_SPTR cc, backtrack_common *parent)
 {
 DEFINE_COMPILER;
 backtrack_common *backtrack;
 recurse_entry *entry = common->entries;
 recurse_entry *prev = NULL;
 sljit_sw start = GET(cc, 1);
-pcre_uchar *start_cc;
+PCRE2_SPTR start_cc;
 BOOL needs_control_head;
 
 PUSH_BACKTRACK(sizeof(recurse_backtrack), cc, NULL);
@@ -6356,61 +7130,58 @@
 return cc + 1 + LINK_SIZE;
 }
 
-static int SLJIT_CALL do_callout(struct jit_arguments *arguments, PUBL(callout_block) *callout_block, pcre_uchar **jit_ovector)
+static int SLJIT_CALL do_callout(struct jit_arguments *arguments, pcre2_callout_block *callout_block, PCRE2_SPTR *jit_ovector)
 {
-const pcre_uchar *begin = arguments->begin;
-int *offset_vector = arguments->offsets;
-int offset_count = arguments->offset_count;
-int i;
+PCRE2_SPTR begin = arguments->begin;
+PCRE2_SIZE *ovector = arguments->match_data->ovector;
+uint32_t oveccount = arguments->oveccount;
+uint32_t i;
 
-if (PUBL(callout) == NULL)
+if (arguments->callout == NULL)
   return 0;
 
-callout_block->version = 2;
-callout_block->callout_data = arguments->callout_data;
+callout_block->version = 1;
 
 /* Offsets in subject. */
 callout_block->subject_length = arguments->end - arguments->begin;
-callout_block->start_match = (pcre_uchar*)callout_block->subject - arguments->begin;
-callout_block->current_position = (pcre_uchar*)callout_block->offset_vector - arguments->begin;
-#if defined COMPILE_PCRE8
-callout_block->subject = (PCRE_SPTR)begin;
-#elif defined COMPILE_PCRE16
-callout_block->subject = (PCRE_SPTR16)begin;
-#elif defined COMPILE_PCRE32
-callout_block->subject = (PCRE_SPTR32)begin;
-#endif
+callout_block->start_match = (PCRE2_SPTR)callout_block->subject - arguments->begin;
+callout_block->current_position = (PCRE2_SPTR)callout_block->offset_vector - arguments->begin;
+callout_block->subject = begin;
 
-/* Convert and copy the JIT offset vector to the offset_vector array. */
+/* Convert and copy the JIT offset vector to the ovector array. */
 callout_block->capture_top = 0;
-callout_block->offset_vector = offset_vector;
-for (i = 2; i < offset_count; i += 2)
+callout_block->offset_vector = ovector;
+for (i = 2; i < oveccount; i += 2)
   {
-  offset_vector[i] = jit_ovector[i] - begin;
-  offset_vector[i + 1] = jit_ovector[i + 1] - begin;
+  ovector[i] = jit_ovector[i] - begin;
+  ovector[i + 1] = jit_ovector[i + 1] - begin;
   if (jit_ovector[i] >= begin)
     callout_block->capture_top = i;
   }
 
 callout_block->capture_top = (callout_block->capture_top >> 1) + 1;
-if (offset_count > 0)
-  offset_vector[0] = -1;
-if (offset_count > 1)
-  offset_vector[1] = -1;
-return (*PUBL(callout))(callout_block);
+ovector[0] = PCRE2_UNSET;
+ovector[1] = PCRE2_UNSET;
+return (arguments->callout)(callout_block, arguments->callout_data);
 }
 
 /* Aligning to 8 byte. */
 #define CALLOUT_ARG_SIZE \
-    (((int)sizeof(PUBL(callout_block)) + 7) & ~7)
+    (((int)sizeof(pcre2_callout_block) + 7) & ~7)
 
 #define CALLOUT_ARG_OFFSET(arg) \
-    (-CALLOUT_ARG_SIZE + SLJIT_OFFSETOF(PUBL(callout_block), arg))
+    (-CALLOUT_ARG_SIZE + SLJIT_OFFSETOF(pcre2_callout_block, arg))
 
-static SLJIT_INLINE pcre_uchar *compile_callout_matchingpath(compiler_common *common, pcre_uchar *cc, backtrack_common *parent)
+static SLJIT_INLINE PCRE2_SPTR compile_callout_matchingpath(compiler_common *common, PCRE2_SPTR cc, backtrack_common *parent)
 {
 DEFINE_COMPILER;
 backtrack_common *backtrack;
+sljit_si mov_opcode;
+unsigned int callout_length = (*cc == OP_CALLOUT)
+    ? PRIV(OP_lengths)[OP_CALLOUT] : GET(cc, 1 + 2 * LINK_SIZE);
+sljit_sw value1;
+sljit_sw value2;
+sljit_sw value3;
 
 PUSH_BACKTRACK(sizeof(backtrack_common), cc, NULL);
 
@@ -6419,8 +7190,9 @@
 SLJIT_ASSERT(common->capture_last_ptr != 0);
 OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), common->capture_last_ptr);
 OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0);
-OP1(SLJIT_MOV_SI, SLJIT_MEM1(STACK_TOP), CALLOUT_ARG_OFFSET(callout_number), SLJIT_IMM, cc[1]);
-OP1(SLJIT_MOV_SI, SLJIT_MEM1(STACK_TOP), CALLOUT_ARG_OFFSET(capture_last), TMP2, 0);
+value1 = (*cc == OP_CALLOUT) ? cc[1 + 2 * LINK_SIZE] : 0;
+OP1(SLJIT_MOV_UI, SLJIT_MEM1(STACK_TOP), CALLOUT_ARG_OFFSET(callout_number), SLJIT_IMM, value1);
+OP1(SLJIT_MOV_UI, SLJIT_MEM1(STACK_TOP), CALLOUT_ARG_OFFSET(capture_last), TMP2, 0);
 
 /* These pointer sized fields temporarly stores internal variables. */
 OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(0));
@@ -6429,8 +7201,26 @@
 
 if (common->mark_ptr != 0)
   OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, mark_ptr));
-OP1(SLJIT_MOV_SI, SLJIT_MEM1(STACK_TOP), CALLOUT_ARG_OFFSET(pattern_position), SLJIT_IMM, GET(cc, 2));
-OP1(SLJIT_MOV_SI, SLJIT_MEM1(STACK_TOP), CALLOUT_ARG_OFFSET(next_item_length), SLJIT_IMM, GET(cc, 2 + LINK_SIZE));
+mov_opcode = (sizeof(PCRE2_SIZE) == 4) ? SLJIT_MOV_UI : SLJIT_MOV;
+OP1(mov_opcode, SLJIT_MEM1(STACK_TOP), CALLOUT_ARG_OFFSET(pattern_position), SLJIT_IMM, GET(cc, 1));
+OP1(mov_opcode, SLJIT_MEM1(STACK_TOP), CALLOUT_ARG_OFFSET(next_item_length), SLJIT_IMM, GET(cc, 1 + LINK_SIZE));
+
+if (*cc == OP_CALLOUT)
+  {
+  value1 = 0;
+  value2 = 0;
+  value3 = 0;
+  }
+else
+  {
+  value1 = (sljit_sw) (cc + (1 + 4*LINK_SIZE) + 1);
+  value2 = (callout_length - (1 + 4*LINK_SIZE + 2));
+  value3 = (sljit_sw) (GET(cc, 1 + 3*LINK_SIZE));
+  }
+
+OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), CALLOUT_ARG_OFFSET(callout_string), SLJIT_IMM, value1);
+OP1(mov_opcode, SLJIT_MEM1(STACK_TOP), CALLOUT_ARG_OFFSET(callout_string_length), SLJIT_IMM, value2);
+OP1(mov_opcode, SLJIT_MEM1(STACK_TOP), CALLOUT_ARG_OFFSET(callout_string_offset), SLJIT_IMM, value3);
 OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), CALLOUT_ARG_OFFSET(mark), (common->mark_ptr != 0) ? TMP2 : SLJIT_IMM, 0);
 
 /* Needed to save important temporary registers. */
@@ -6449,13 +7239,39 @@
   add_jump(compiler, &common->forced_quit, JUMP(SLJIT_SIG_LESS));
 else
   JUMPTO(SLJIT_SIG_LESS, common->forced_quit_label);
-return cc + 2 + 2 * LINK_SIZE;
+return cc + callout_length;
 }
 
 #undef CALLOUT_ARG_SIZE
 #undef CALLOUT_ARG_OFFSET
 
-static pcre_uchar *compile_assert_matchingpath(compiler_common *common, pcre_uchar *cc, assert_backtrack *backtrack, BOOL conditional)
+static SLJIT_INLINE BOOL assert_needs_str_ptr_saving(PCRE2_SPTR cc)
+{
+while (TRUE)
+  {
+  switch (*cc)
+    {
+    case OP_CALLOUT_STR:
+    cc += GET(cc, 1 + 2*LINK_SIZE);
+    break;
+
+    case OP_NOT_WORD_BOUNDARY:
+    case OP_WORD_BOUNDARY:
+    case OP_CALLOUT:
+    case OP_ALT:
+    cc += PRIV(OP_lengths)[*cc];
+    break;
+
+    case OP_KET:
+    return FALSE;
+
+    default:
+    return TRUE;
+    }
+  }
+}
+
+static PCRE2_SPTR compile_assert_matchingpath(compiler_common *common, PCRE2_SPTR cc, assert_backtrack *backtrack, BOOL conditional)
 {
 DEFINE_COMPILER;
 int framesize;
@@ -6463,9 +7279,9 @@
 BOOL needs_control_head;
 int private_data_ptr;
 backtrack_common altbacktrack;
-pcre_uchar *ccbegin;
-pcre_uchar opcode;
-pcre_uchar bra = OP_BRA;
+PCRE2_SPTR ccbegin;
+PCRE2_UCHAR opcode;
+PCRE2_UCHAR bra = OP_BRA;
 jump_list *tmp = NULL;
 jump_list **target = (conditional) ? &backtrack->condfailed : &backtrack->common.topbacktracks;
 jump_list **found;
@@ -6511,15 +7327,28 @@
 
 if (framesize < 0)
   {
-  extrasize = needs_control_head ? 2 : 1;
+  extrasize = 1;
+  if (bra == OP_BRA && !assert_needs_str_ptr_saving(ccbegin + 1 + LINK_SIZE))
+    extrasize = 0;
+
+  if (needs_control_head)
+    extrasize++;
+
   if (framesize == no_frame)
     OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), private_data_ptr, STACK_TOP, 0);
-  allocate_stack(common, extrasize);
+
+  if (extrasize > 0)
+    allocate_stack(common, extrasize);
+
   if (needs_control_head)
     OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr);
-  OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0);
+
+  if (extrasize > 0)
+    OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0);
+
   if (needs_control_head)
     {
+    SLJIT_ASSERT(extrasize == 2);
     OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr, SLJIT_IMM, 0);
     OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(1), TMP1, 0);
     }
@@ -6528,12 +7357,14 @@
   {
   extrasize = needs_control_head ? 3 : 2;
   allocate_stack(common, framesize + extrasize);
+
   OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr);
   OP2(SLJIT_SUB, TMP2, 0, STACK_TOP, 0, SLJIT_IMM, (framesize + extrasize) * sizeof(sljit_sw));
   OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), private_data_ptr, TMP2, 0);
   if (needs_control_head)
     OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr);
   OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0);
+
   if (needs_control_head)
     {
     OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(2), TMP1, 0);
@@ -6542,6 +7373,7 @@
     }
   else
     OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(1), TMP1, 0);
+
   init_frame(common, ccbegin, NULL, framesize + extrasize - 1, extrasize, FALSE);
   }
 
@@ -6565,7 +7397,7 @@
   altbacktrack.top = NULL;
   altbacktrack.topbacktracks = NULL;
 
-  if (*ccbegin == OP_ALT)
+  if (*ccbegin == OP_ALT && extrasize > 0)
     OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0));
 
   altbacktrack.cc = ccbegin;
@@ -6594,8 +7426,9 @@
     {
     if (framesize == no_frame)
       OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr);
-    else
+    else if (extrasize > 0)
       free_stack(common, extrasize);
+
     if (needs_control_head)
       OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr, SLJIT_MEM1(STACK_TOP), 0);
     }
@@ -6621,7 +7454,10 @@
     {
     /* We know that STR_PTR was stored on the top of the stack. */
     if (conditional)
-      OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), needs_control_head ? sizeof(sljit_sw) : 0);
+      {
+      if (extrasize > 0)
+        OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), needs_control_head ? sizeof(sljit_sw) : 0);
+      }
     else if (bra == OP_BRAZERO)
       {
       if (framesize < 0)
@@ -6698,7 +7534,7 @@
 if (opcode == OP_ASSERT || opcode == OP_ASSERTBACK)
   {
   /* Assert is failed. */
-  if (conditional || bra == OP_BRAZERO)
+  if ((conditional && extrasize > 0) || bra == OP_BRAZERO)
     OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0));
 
   if (framesize < 0)
@@ -6710,7 +7546,7 @@
         free_stack(common, 1);
       OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), SLJIT_IMM, 0);
       }
-    else
+    else if (extrasize > 0)
       free_stack(common, extrasize);
     }
   else
@@ -6735,7 +7571,9 @@
   if (framesize < 0)
     {
     /* We know that STR_PTR was stored on the top of the stack. */
-    OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), (extrasize - 1) * sizeof(sljit_sw));
+    if (extrasize > 0)
+      OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), (extrasize - 1) * sizeof(sljit_sw));
+
     /* Keep the STR_PTR on the top of the stack. */
     if (bra == OP_BRAZERO)
       {
@@ -6798,14 +7636,16 @@
   /* AssertNot is successful. */
   if (framesize < 0)
     {
-    OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0));
+    if (extrasize > 0)
+      OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0));
+
     if (bra != OP_BRA)
       {
       if (extrasize == 2)
         free_stack(common, 1);
       OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), SLJIT_IMM, 0);
       }
-    else
+    else if (extrasize > 0)
       free_stack(common, extrasize);
     }
   else
@@ -6853,7 +7693,7 @@
 return cc + 1 + LINK_SIZE;
 }
 
-static SLJIT_INLINE void match_once_common(compiler_common *common, pcre_uchar ket, int framesize, int private_data_ptr, BOOL has_alternatives, BOOL needs_control_head)
+static SLJIT_INLINE void match_once_common(compiler_common *common, PCRE2_UCHAR ket, int framesize, int private_data_ptr, BOOL has_alternatives, BOOL needs_control_head)
 {
 DEFINE_COMPILER;
 int stacksize;
@@ -6867,7 +7707,9 @@
     stacksize = needs_control_head ? 1 : 0;
     if (ket != OP_KET || has_alternatives)
       stacksize++;
-    free_stack(common, stacksize);
+
+    if (stacksize > 0)
+      free_stack(common, stacksize);
     }
 
   if (needs_control_head)
@@ -6978,21 +7820,21 @@
                                           Or nothing, if trace is unnecessary
 */
 
-static pcre_uchar *compile_bracket_matchingpath(compiler_common *common, pcre_uchar *cc, backtrack_common *parent)
+static PCRE2_SPTR compile_bracket_matchingpath(compiler_common *common, PCRE2_SPTR cc, backtrack_common *parent)
 {
 DEFINE_COMPILER;
 backtrack_common *backtrack;
-pcre_uchar opcode;
+PCRE2_UCHAR opcode;
 int private_data_ptr = 0;
 int offset = 0;
 int i, stacksize;
 int repeat_ptr = 0, repeat_length = 0;
 int repeat_type = 0, repeat_count = 0;
-pcre_uchar *ccbegin;
-pcre_uchar *matchingpath;
-pcre_uchar *slot;
-pcre_uchar bra = OP_BRA;
-pcre_uchar ket;
+PCRE2_SPTR ccbegin;
+PCRE2_SPTR matchingpath;
+PCRE2_SPTR slot;
+PCRE2_UCHAR bra = OP_BRA;
+PCRE2_UCHAR ket;
 assert_backtrack *assert;
 BOOL has_alternatives;
 BOOL needs_control_head = FALSE;
@@ -7027,13 +7869,6 @@
     ket = OP_KETRMIN;
   }
 
-if ((opcode == OP_COND || opcode == OP_SCOND) && cc[1 + LINK_SIZE] == OP_DEF)
-  {
-  /* Drop this bracket_backtrack. */
-  parent->top = backtrack->prev;
-  return matchingpath + 1 + LINK_SIZE + repeat_length;
-  }
-
 matchingpath = ccbegin + 1 + LINK_SIZE;
 SLJIT_ASSERT(ket == OP_KET || ket == OP_KETRMAX || ket == OP_KETRMIN);
 SLJIT_ASSERT(!((bra == OP_BRAZERO && ket == OP_KETRMIN) || (bra == OP_BRAMINZERO && ket == OP_KETRMAX)));
@@ -7041,7 +7876,11 @@
 
 has_alternatives = *cc == OP_ALT;
 if (SLJIT_UNLIKELY(opcode == OP_COND || opcode == OP_SCOND))
-  has_alternatives = (*matchingpath == OP_RREF || *matchingpath == OP_DNRREF || *matchingpath == OP_FAIL) ? FALSE : TRUE;
+  {
+  SLJIT_COMPILE_ASSERT(OP_DNRREF == OP_RREF + 1 && OP_FALSE == OP_RREF + 2 && OP_TRUE == OP_RREF + 3,
+    compile_time_checks_must_be_grouped_together);
+  has_alternatives = ((*matchingpath >= OP_RREF && *matchingpath <= OP_TRUE) || *matchingpath == OP_FAIL) ? FALSE : TRUE;
+  }
 
 if (SLJIT_UNLIKELY(opcode == OP_COND) && (*cc == OP_KETRMAX || *cc == OP_KETRMIN))
   opcode = OP_SCOND;
@@ -7299,15 +8138,20 @@
     add_jump(compiler, &(BACKTRACK_AS(bracket_backtrack)->u.condfailed), JUMP(SLJIT_ZERO));
     matchingpath += 1 + 2 * IMM2_SIZE;
     }
-  else if (*matchingpath == OP_RREF || *matchingpath == OP_DNRREF || *matchingpath == OP_FAIL)
+  else if ((*matchingpath >= OP_RREF && *matchingpath <= OP_TRUE) || *matchingpath == OP_FAIL)
     {
     /* Never has other case. */
     BACKTRACK_AS(bracket_backtrack)->u.condfailed = NULL;
     SLJIT_ASSERT(!has_alternatives);
 
-    if (*matchingpath == OP_FAIL)
+    if (*matchingpath == OP_TRUE)
+      {
+      stacksize = 1;
+      matchingpath++;
+      }
+    else if (*matchingpath == OP_FALSE || *matchingpath == OP_FAIL)
       stacksize = 0;
-    if (*matchingpath == OP_RREF)
+    else if (*matchingpath == OP_RREF)
       {
       stacksize = GET2(matchingpath, 1);
       if (common->currententry == NULL)
@@ -7513,17 +8357,21 @@
   cc += GET(cc, 1);
 cc += 1 + LINK_SIZE;
 
-/* Temporarily encoding the needs_control_head in framesize. */
 if (opcode == OP_ONCE)
+  {
+  /* We temporarily encode the needs_control_head in the lowest bit.
+     Note: on the target architectures of SLJIT the ((x << 1) >> 1) returns
+     the same value for small signed numbers (including negative numbers). */
   BACKTRACK_AS(bracket_backtrack)->u.framesize = (BACKTRACK_AS(bracket_backtrack)->u.framesize << 1) | (needs_control_head ? 1 : 0);
+  }
 return cc + repeat_length;
 }
 
-static pcre_uchar *compile_bracketpos_matchingpath(compiler_common *common, pcre_uchar *cc, backtrack_common *parent)
+static PCRE2_SPTR compile_bracketpos_matchingpath(compiler_common *common, PCRE2_SPTR cc, backtrack_common *parent)
 {
 DEFINE_COMPILER;
 backtrack_common *backtrack;
-pcre_uchar opcode;
+PCRE2_UCHAR opcode;
 int private_data_ptr;
 int cbraprivptr = 0;
 BOOL needs_control_head;
@@ -7531,7 +8379,7 @@
 int stacksize;
 int offset = 0;
 BOOL zero = FALSE;
-pcre_uchar *ccbegin = NULL;
+PCRE2_SPTR ccbegin = NULL;
 int stack; /* Also contains the offset of control head. */
 struct sljit_label *loop = NULL;
 struct jump_list *emptymatch = NULL;
@@ -7802,11 +8650,13 @@
 return cc + 1 + LINK_SIZE;
 }
 
-static SLJIT_INLINE pcre_uchar *get_iterator_parameters(compiler_common *common, pcre_uchar *cc, pcre_uchar *opcode, pcre_uchar *type, int *max, int *min, pcre_uchar **end)
+static SLJIT_INLINE PCRE2_SPTR get_iterator_parameters(compiler_common *common, PCRE2_SPTR cc, PCRE2_UCHAR *opcode, PCRE2_UCHAR *type, sljit_ui *max, sljit_ui *exact, PCRE2_SPTR *end)
 {
 int class_len;
 
 *opcode = *cc;
+*exact = 0;
+
 if (*opcode >= OP_STAR && *opcode <= OP_POSUPTO)
   {
   cc++;
@@ -7834,81 +8684,132 @@
   {
   cc++;
   *opcode -= OP_TYPESTAR - OP_STAR;
-  *type = 0;
+  *type = OP_END;
   }
 else
   {
   SLJIT_ASSERT(*opcode == OP_CLASS || *opcode == OP_NCLASS || *opcode == OP_XCLASS);
   *type = *opcode;
   cc++;
-  class_len = (*type < OP_XCLASS) ? (int)(1 + (32 / sizeof(pcre_uchar))) : GET(cc, 0);
+  class_len = (*type < OP_XCLASS) ? (int)(1 + (32 / sizeof(PCRE2_UCHAR))) : GET(cc, 0);
   *opcode = cc[class_len - 1];
+
   if (*opcode >= OP_CRSTAR && *opcode <= OP_CRMINQUERY)
     {
     *opcode -= OP_CRSTAR - OP_STAR;
-    if (end != NULL)
-      *end = cc + class_len;
+    *end = cc + class_len;
+
+    if (*opcode == OP_PLUS || *opcode == OP_MINPLUS)
+      {
+      *exact = 1;
+      *opcode -= OP_PLUS - OP_STAR;
+      }
     }
   else if (*opcode >= OP_CRPOSSTAR && *opcode <= OP_CRPOSQUERY)
     {
     *opcode -= OP_CRPOSSTAR - OP_POSSTAR;
-    if (end != NULL)
-      *end = cc + class_len;
+    *end = cc + class_len;
+
+    if (*opcode == OP_POSPLUS)
+      {
+      *exact = 1;
+      *opcode = OP_POSSTAR;
+      }
     }
   else
     {
     SLJIT_ASSERT(*opcode == OP_CRRANGE || *opcode == OP_CRMINRANGE || *opcode == OP_CRPOSRANGE);
     *max = GET2(cc, (class_len + IMM2_SIZE));
-    *min = GET2(cc, class_len);
+    *exact = GET2(cc, class_len);
 
-    if (*min == 0)
+    if (*max == 0)
       {
-      SLJIT_ASSERT(*max != 0);
-      *opcode = (*opcode == OP_CRRANGE) ? OP_UPTO : (*opcode == OP_CRMINRANGE ? OP_MINUPTO : OP_POSUPTO);
+      if (*opcode == OP_CRPOSRANGE)
+        *opcode = OP_POSSTAR;
+      else
+        *opcode -= OP_CRRANGE - OP_STAR;
       }
-    if (*max == *min)
-      *opcode = OP_EXACT;
-
-    if (end != NULL)
-      *end = cc + class_len + 2 * IMM2_SIZE;
+    else
+      {
+      *max -= *exact;
+      if (*max == 0)
+        *opcode = OP_EXACT;
+      else if (*max == 1)
+        {
+        if (*opcode == OP_CRPOSRANGE)
+          *opcode = OP_POSQUERY;
+        else
+          *opcode -= OP_CRRANGE - OP_QUERY;
+        }
+      else
+        {
+        if (*opcode == OP_CRPOSRANGE)
+          *opcode = OP_POSUPTO;
+        else
+          *opcode -= OP_CRRANGE - OP_UPTO;
+        }
+      }
+    *end = cc + class_len + 2 * IMM2_SIZE;
     }
   return cc;
   }
 
-if (*opcode == OP_UPTO || *opcode == OP_MINUPTO || *opcode == OP_EXACT || *opcode == OP_POSUPTO)
+switch(*opcode)
   {
+  case OP_EXACT:
+  *exact = GET2(cc, 0);
+  cc += IMM2_SIZE;
+  break;
+
+  case OP_PLUS:
+  case OP_MINPLUS:
+  *exact = 1;
+  *opcode -= OP_PLUS - OP_STAR;
+  break;
+
+  case OP_POSPLUS:
+  *exact = 1;
+  *opcode = OP_POSSTAR;
+  break;
+
+  case OP_UPTO:
+  case OP_MINUPTO:
+  case OP_POSUPTO:
   *max = GET2(cc, 0);
   cc += IMM2_SIZE;
+  break;
   }
 
-if (*type == 0)
+if (*type == OP_END)
   {
   *type = *cc;
-  if (end != NULL)
-    *end = next_opcode(common, cc);
+  *end = next_opcode(common, cc);
   cc++;
   return cc;
   }
 
-if (end != NULL)
-  {
-  *end = cc + 1;
-#ifdef SUPPORT_UTF
-  if (common->utf && HAS_EXTRALEN(*cc)) *end += GET_EXTRALEN(*cc);
+*end = cc + 1;
+#ifdef SUPPORT_UNICODE
+if (common->utf && HAS_EXTRALEN(*cc)) *end += GET_EXTRALEN(*cc);
 #endif
-  }
 return cc;
 }
 
-static pcre_uchar *compile_iterator_matchingpath(compiler_common *common, pcre_uchar *cc, backtrack_common *parent)
+static PCRE2_SPTR compile_iterator_matchingpath(compiler_common *common, PCRE2_SPTR cc, backtrack_common *parent)
 {
 DEFINE_COMPILER;
 backtrack_common *backtrack;
-pcre_uchar opcode;
-pcre_uchar type;
-int max = -1, min = -1;
-pcre_uchar *end;
-jump_list *nomatch = NULL;
+PCRE2_UCHAR opcode;
+PCRE2_UCHAR type;
+sljit_ui max = 0, exact;
+BOOL fast_fail;
+sljit_si fast_str_ptr;
+BOOL charpos_enabled;
+PCRE2_UCHAR charpos_char;
+unsigned int charpos_othercasebit;
+PCRE2_SPTR end;
+jump_list *no_match = NULL;
+jump_list *no_char1_match = NULL;
 struct sljit_jump *jump = NULL;
 struct sljit_label *label;
 int private_data_ptr = PRIVATE_DATA(cc);
@@ -7917,83 +8818,92 @@
 int offset1 = (private_data_ptr == 0) ? STACK(1) : private_data_ptr + (int)sizeof(sljit_sw);
 int tmp_base, tmp_offset;
 
-PUSH_BACKTRACK(sizeof(iterator_backtrack), cc, NULL);
+PUSH_BACKTRACK(sizeof(char_iterator_backtrack), cc, NULL);
 
-cc = get_iterator_parameters(common, cc, &opcode, &type, &max, &min, &end);
+fast_str_ptr = PRIVATE_DATA(cc + 1);
+fast_fail = TRUE;
 
-switch(type)
+SLJIT_ASSERT(common->fast_forward_bc_ptr == NULL || fast_str_ptr == 0 || cc == common->fast_forward_bc_ptr);
+
+if (cc == common->fast_forward_bc_ptr)
+  fast_fail = FALSE;
+else if (common->fast_fail_start_ptr == 0)
+  fast_str_ptr = 0;
+
+SLJIT_ASSERT(common->fast_forward_bc_ptr != NULL || fast_str_ptr == 0
+  || (fast_str_ptr >= common->fast_fail_start_ptr && fast_str_ptr <= common->fast_fail_end_ptr));
+
+cc = get_iterator_parameters(common, cc, &opcode, &type, &max, &exact, &end);
+
+if (type != 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_ALLANY:
-  case OP_ANYBYTE:
-  case OP_ANYNL:
-  case OP_NOT_HSPACE:
-  case OP_HSPACE:
-  case OP_NOT_VSPACE:
-  case OP_VSPACE:
-  case OP_CHAR:
-  case OP_CHARI:
-  case OP_NOT:
-  case OP_NOTI:
-  case OP_CLASS:
-  case OP_NCLASS:
   tmp_base = TMP3;
   tmp_offset = 0;
-  break;
-
-  default:
-  SLJIT_ASSERT_STOP();
-  /* Fall through. */
-
-  case OP_EXTUNI:
-  case OP_XCLASS:
-  case OP_NOTPROP:
-  case OP_PROP:
+  }
+else
+  {
   tmp_base = SLJIT_MEM1(SLJIT_SP);
   tmp_offset = POSSESSIVE0;
-  break;
   }
 
+if (fast_fail && fast_str_ptr != 0)
+  add_jump(compiler, &backtrack->topbacktracks, CMP(SLJIT_LESS_EQUAL, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP), fast_str_ptr));
+
+/* Handle fixed part first. */
+if (exact > 1)
+  {
+  SLJIT_ASSERT(fast_str_ptr == 0);
+  if (common->mode == PCRE2_JIT_COMPLETE
+#ifdef SUPPORT_UNICODE
+      && !common->utf
+#endif
+      )
+    {
+    OP2(SLJIT_ADD, TMP1, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(exact));
+    add_jump(compiler, &backtrack->topbacktracks, CMP(SLJIT_GREATER, TMP1, 0, STR_END, 0));
+    OP1(SLJIT_MOV, tmp_base, tmp_offset, SLJIT_IMM, exact);
+    label = LABEL();
+    compile_char1_matchingpath(common, type, cc, &backtrack->topbacktracks, FALSE);
+    OP2(SLJIT_SUB | SLJIT_SET_E, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1);
+    JUMPTO(SLJIT_NOT_ZERO, label);
+    }
+  else
+    {
+    OP1(SLJIT_MOV, tmp_base, tmp_offset, SLJIT_IMM, exact);
+    label = LABEL();
+    compile_char1_matchingpath(common, type, cc, &backtrack->topbacktracks, TRUE);
+    OP2(SLJIT_SUB | SLJIT_SET_E, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1);
+    JUMPTO(SLJIT_NOT_ZERO, label);
+    }
+  }
+else if (exact == 1)
+  compile_char1_matchingpath(common, type, cc, &backtrack->topbacktracks, TRUE);
+
 switch(opcode)
   {
   case OP_STAR:
-  case OP_PLUS:
   case OP_UPTO:
-  case OP_CRRANGE:
+  SLJIT_ASSERT(fast_str_ptr == 0 || opcode == OP_STAR);
+
   if (type == OP_ANYNL || type == OP_EXTUNI)
     {
     SLJIT_ASSERT(private_data_ptr == 0);
-    if (opcode == OP_STAR || opcode == OP_UPTO)
-      {
-      allocate_stack(common, 2);
-      OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0);
-      OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(1), SLJIT_IMM, 0);
-      }
-    else
-      {
-      allocate_stack(common, 1);
-      OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), SLJIT_IMM, 0);
-      }
+    SLJIT_ASSERT(fast_str_ptr == 0);
 
-    if (opcode == OP_UPTO || opcode == OP_CRRANGE)
-      OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), POSSESSIVE0, SLJIT_IMM, 0);
+    allocate_stack(common, 2);
+    OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0);
+    OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(1), SLJIT_IMM, 0);
+
+    if (opcode == OP_UPTO)
+      OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), POSSESSIVE0, SLJIT_IMM, max);
 
     label = LABEL();
-    compile_char1_matchingpath(common, type, cc, &backtrack->topbacktracks);
-    if (opcode == OP_UPTO || opcode == OP_CRRANGE)
+    compile_char1_matchingpath(common, type, cc, &BACKTRACK_AS(char_iterator_backtrack)->u.backtracks, TRUE);
+    if (opcode == OP_UPTO)
       {
       OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), POSSESSIVE0);
-      OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, 1);
-      if (opcode == OP_CRRANGE && min > 0)
-        CMPTO(SLJIT_LESS, TMP1, 0, SLJIT_IMM, min, label);
-      if (opcode == OP_UPTO || (opcode == OP_CRRANGE && max > 0))
-        jump = CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, max);
+      OP2(SLJIT_SUB | SLJIT_SET_E, TMP1, 0, TMP1, 0, SLJIT_IMM, 1);
+      jump = JUMP(SLJIT_ZERO);
       OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), POSSESSIVE0, TMP1, 0);
       }
 
@@ -8006,134 +8916,270 @@
     }
   else
     {
-    if (opcode == OP_PLUS)
-      compile_char1_matchingpath(common, type, cc, &backtrack->topbacktracks);
-    if (private_data_ptr == 0)
-      allocate_stack(common, 2);
-    OP1(SLJIT_MOV, base, offset0, STR_PTR, 0);
-    if (opcode <= OP_PLUS)
+    charpos_enabled = FALSE;
+    charpos_char = 0;
+    charpos_othercasebit = 0;
+
+    if ((type != OP_CHAR && type != OP_CHARI) && (*end == OP_CHAR || *end == OP_CHARI))
+      {
+      charpos_enabled = TRUE;
+#ifdef SUPPORT_UNICODE
+      charpos_enabled = !common->utf || !HAS_EXTRALEN(end[1]);
+#endif
+      if (charpos_enabled && *end == OP_CHARI && char_has_othercase(common, end + 1))
+        {
+        charpos_othercasebit = char_get_othercase_bit(common, end + 1);
+        if (charpos_othercasebit == 0)
+          charpos_enabled = FALSE;
+        }
+
+      if (charpos_enabled)
+        {
+        charpos_char = end[1];
+        /* Consumpe the OP_CHAR opcode. */
+        end += 2;
+#if PCRE2_CODE_UNIT_WIDTH == 8
+        SLJIT_ASSERT((charpos_othercasebit >> 8) == 0);
+#elif PCRE2_CODE_UNIT_WIDTH == 16 || PCRE2_CODE_UNIT_WIDTH == 32
+        SLJIT_ASSERT((charpos_othercasebit >> 9) == 0);
+        if ((charpos_othercasebit & 0x100) != 0)
+          {
+          charpos_othercasebit = (charpos_othercasebit & 0xff) << 8;
+          }
+#endif
+        if (charpos_othercasebit != 0)
+          charpos_char |= charpos_othercasebit;
+
+        BACKTRACK_AS(char_iterator_backtrack)->u.charpos.enabled = TRUE;
+        BACKTRACK_AS(char_iterator_backtrack)->u.charpos.chr = charpos_char;
+        BACKTRACK_AS(char_iterator_backtrack)->u.charpos.othercasebit = charpos_othercasebit;
+        }
+      }
+
+    if (charpos_enabled)
+      {
+      if (opcode == OP_UPTO)
+        OP1(SLJIT_MOV, tmp_base, tmp_offset, SLJIT_IMM, max + 1);
+
+      /* Search the first instance of charpos_char. */
+      jump = JUMP(SLJIT_JUMP);
+      label = LABEL();
+      if (opcode == OP_UPTO)
+        {
+        OP2(SLJIT_SUB | SLJIT_SET_E, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1);
+        add_jump(compiler, &backtrack->topbacktracks, JUMP(SLJIT_ZERO));
+        }
+      compile_char1_matchingpath(common, type, cc, &backtrack->topbacktracks, FALSE);
+      if (fast_str_ptr != 0)
+        OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), fast_str_ptr, STR_PTR, 0);
+      JUMPHERE(jump);
+
+      detect_partial_match(common, &backtrack->topbacktracks);
+      OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0));
+      if (charpos_othercasebit != 0)
+        OP2(SLJIT_OR, TMP1, 0, TMP1, 0, SLJIT_IMM, charpos_othercasebit);
+      CMPTO(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, charpos_char, label);
+
+      if (private_data_ptr == 0)
+        allocate_stack(common, 2);
+      OP1(SLJIT_MOV, base, offset0, STR_PTR, 0);
       OP1(SLJIT_MOV, base, offset1, STR_PTR, 0);
-    else
-      OP1(SLJIT_MOV, base, offset1, SLJIT_IMM, 1);
-    label = LABEL();
-    compile_char1_matchingpath(common, type, cc, &nomatch);
-    OP1(SLJIT_MOV, base, offset0, STR_PTR, 0);
-    if (opcode <= OP_PLUS)
-      JUMPTO(SLJIT_JUMP, label);
-    else if (opcode == OP_CRRANGE && max == 0)
-      {
-      OP2(SLJIT_ADD, base, offset1, base, offset1, SLJIT_IMM, 1);
-      JUMPTO(SLJIT_JUMP, label);
+      if (opcode == OP_UPTO)
+        {
+        OP2(SLJIT_SUB | SLJIT_SET_E, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1);
+        add_jump(compiler, &no_match, JUMP(SLJIT_ZERO));
+        }
+
+      /* Search the last instance of charpos_char. */
+      label = LABEL();
+      compile_char1_matchingpath(common, type, cc, &no_match, FALSE);
+      if (fast_str_ptr != 0)
+        OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), fast_str_ptr, STR_PTR, 0);
+      detect_partial_match(common, &no_match);
+      OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0));
+      if (charpos_othercasebit != 0)
+        OP2(SLJIT_OR, TMP1, 0, TMP1, 0, SLJIT_IMM, charpos_othercasebit);
+      if (opcode == OP_STAR)
+        {
+        CMPTO(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, charpos_char, label);
+        OP1(SLJIT_MOV, base, offset0, STR_PTR, 0);
+        }
+      else
+        {
+        jump = CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, charpos_char);
+        OP1(SLJIT_MOV, base, offset0, STR_PTR, 0);
+        JUMPHERE(jump);
+        }
+
+      if (opcode == OP_UPTO)
+        {
+        OP2(SLJIT_SUB | SLJIT_SET_E, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1);
+        JUMPTO(SLJIT_NOT_ZERO, label);
+        }
+      else
+        JUMPTO(SLJIT_JUMP, label);
+
+      set_jumps(no_match, LABEL());
+      OP1(SLJIT_MOV, STR_PTR, 0, base, offset0);
+      OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
+      OP1(SLJIT_MOV, base, offset0, STR_PTR, 0);
       }
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
+    else if (common->utf)
+      {
+      if (private_data_ptr == 0)
+        allocate_stack(common, 2);
+
+      OP1(SLJIT_MOV, base, offset0, STR_PTR, 0);
+      OP1(SLJIT_MOV, base, offset1, STR_PTR, 0);
+
+      if (opcode == OP_UPTO)
+        OP1(SLJIT_MOV, tmp_base, tmp_offset, SLJIT_IMM, max);
+
+      label = LABEL();
+      compile_char1_matchingpath(common, type, cc, &no_match, TRUE);
+      OP1(SLJIT_MOV, base, offset0, STR_PTR, 0);
+
+      if (opcode == OP_UPTO)
+        {
+        OP2(SLJIT_SUB | SLJIT_SET_E, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1);
+        JUMPTO(SLJIT_NOT_ZERO, label);
+        }
+      else
+        JUMPTO(SLJIT_JUMP, label);
+
+      set_jumps(no_match, LABEL());
+      OP1(SLJIT_MOV, STR_PTR, 0, base, offset0);
+      if (fast_str_ptr != 0)
+        OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), fast_str_ptr, STR_PTR, 0);
+      }
+#endif
     else
       {
-      OP1(SLJIT_MOV, TMP1, 0, base, offset1);
-      OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, 1);
-      OP1(SLJIT_MOV, base, offset1, TMP1, 0);
-      CMPTO(SLJIT_LESS, TMP1, 0, SLJIT_IMM, max + 1, label);
+      if (private_data_ptr == 0)
+        allocate_stack(common, 2);
+
+      OP1(SLJIT_MOV, base, offset1, STR_PTR, 0);
+      if (opcode == OP_UPTO)
+        OP1(SLJIT_MOV, tmp_base, tmp_offset, SLJIT_IMM, max);
+
+      label = LABEL();
+      detect_partial_match(common, &no_match);
+      compile_char1_matchingpath(common, type, cc, &no_char1_match, FALSE);
+      if (opcode == OP_UPTO)
+        {
+        OP2(SLJIT_SUB | SLJIT_SET_E, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1);
+        JUMPTO(SLJIT_NOT_ZERO, label);
+        OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
+        }
+      else
+        JUMPTO(SLJIT_JUMP, label);
+
+      set_jumps(no_char1_match, LABEL());
+      OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
+      set_jumps(no_match, LABEL());
+      OP1(SLJIT_MOV, base, offset0, STR_PTR, 0);
+      if (fast_str_ptr != 0)
+        OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), fast_str_ptr, STR_PTR, 0);
       }
-    set_jumps(nomatch, LABEL());
-    if (opcode == OP_CRRANGE)
-      add_jump(compiler, &backtrack->topbacktracks, CMP(SLJIT_LESS, base, offset1, SLJIT_IMM, min + 1));
-    OP1(SLJIT_MOV, STR_PTR, 0, base, offset0);
     }
-  BACKTRACK_AS(iterator_backtrack)->matchingpath = LABEL();
+  BACKTRACK_AS(char_iterator_backtrack)->matchingpath = LABEL();
   break;
 
   case OP_MINSTAR:
-  case OP_MINPLUS:
-  if (opcode == OP_MINPLUS)
-    compile_char1_matchingpath(common, type, cc, &backtrack->topbacktracks);
   if (private_data_ptr == 0)
     allocate_stack(common, 1);
   OP1(SLJIT_MOV, base, offset0, STR_PTR, 0);
-  BACKTRACK_AS(iterator_backtrack)->matchingpath = LABEL();
+  BACKTRACK_AS(char_iterator_backtrack)->matchingpath = LABEL();
+  if (fast_str_ptr != 0)
+    OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), fast_str_ptr, STR_PTR, 0);
   break;
 
   case OP_MINUPTO:
-  case OP_CRMINRANGE:
+  SLJIT_ASSERT(fast_str_ptr == 0);
   if (private_data_ptr == 0)
     allocate_stack(common, 2);
   OP1(SLJIT_MOV, base, offset0, STR_PTR, 0);
-  OP1(SLJIT_MOV, base, offset1, SLJIT_IMM, 1);
-  if (opcode == OP_CRMINRANGE)
-    add_jump(compiler, &backtrack->topbacktracks, JUMP(SLJIT_JUMP));
-  BACKTRACK_AS(iterator_backtrack)->matchingpath = LABEL();
+  OP1(SLJIT_MOV, base, offset1, SLJIT_IMM, max + 1);
+  BACKTRACK_AS(char_iterator_backtrack)->matchingpath = LABEL();
   break;
 
   case OP_QUERY:
   case OP_MINQUERY:
+  SLJIT_ASSERT(fast_str_ptr == 0);
   if (private_data_ptr == 0)
     allocate_stack(common, 1);
   OP1(SLJIT_MOV, base, offset0, STR_PTR, 0);
   if (opcode == OP_QUERY)
-    compile_char1_matchingpath(common, type, cc, &backtrack->topbacktracks);
-  BACKTRACK_AS(iterator_backtrack)->matchingpath = LABEL();
+    compile_char1_matchingpath(common, type, cc, &BACKTRACK_AS(char_iterator_backtrack)->u.backtracks, TRUE);
+  BACKTRACK_AS(char_iterator_backtrack)->matchingpath = LABEL();
   break;
 
   case OP_EXACT:
-  OP1(SLJIT_MOV, tmp_base, tmp_offset, SLJIT_IMM, max);
-  label = LABEL();
-  compile_char1_matchingpath(common, type, cc, &backtrack->topbacktracks);
-  OP2(SLJIT_SUB | SLJIT_SET_E, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1);
-  JUMPTO(SLJIT_NOT_ZERO, label);
   break;
 
   case OP_POSSTAR:
-  case OP_POSPLUS:
-  case OP_POSUPTO:
-  if (opcode == OP_POSPLUS)
-    compile_char1_matchingpath(common, type, cc, &backtrack->topbacktracks);
-  if (opcode == OP_POSUPTO)
-    OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), POSSESSIVE1, SLJIT_IMM, max);
-  OP1(SLJIT_MOV, tmp_base, tmp_offset, STR_PTR, 0);
-  label = LABEL();
-  compile_char1_matchingpath(common, type, cc, &nomatch);
-  OP1(SLJIT_MOV, tmp_base, tmp_offset, STR_PTR, 0);
-  if (opcode != OP_POSUPTO)
-    JUMPTO(SLJIT_JUMP, label);
-  else
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
+  if (common->utf)
     {
-    OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_MEM1(SLJIT_SP), POSSESSIVE1, SLJIT_MEM1(SLJIT_SP), POSSESSIVE1, SLJIT_IMM, 1);
-    JUMPTO(SLJIT_NOT_ZERO, label);
+    OP1(SLJIT_MOV, tmp_base, tmp_offset, STR_PTR, 0);
+    label = LABEL();
+    compile_char1_matchingpath(common, type, cc, &no_match, TRUE);
+    OP1(SLJIT_MOV, tmp_base, tmp_offset, STR_PTR, 0);
+    JUMPTO(SLJIT_JUMP, label);
+    set_jumps(no_match, LABEL());
+    OP1(SLJIT_MOV, STR_PTR, 0, tmp_base, tmp_offset);
+    if (fast_str_ptr != 0)
+      OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), fast_str_ptr, STR_PTR, 0);
+    break;
     }
-  set_jumps(nomatch, LABEL());
-  OP1(SLJIT_MOV, STR_PTR, 0, tmp_base, tmp_offset);
+#endif
+  label = LABEL();
+  detect_partial_match(common, &no_match);
+  compile_char1_matchingpath(common, type, cc, &no_char1_match, FALSE);
+  JUMPTO(SLJIT_JUMP, label);
+  set_jumps(no_char1_match, LABEL());
+  OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
+  set_jumps(no_match, LABEL());
+  if (fast_str_ptr != 0)
+    OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), fast_str_ptr, STR_PTR, 0);
+  break;
+
+  case OP_POSUPTO:
+  SLJIT_ASSERT(fast_str_ptr == 0);
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
+  if (common->utf)
+    {
+    OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), POSSESSIVE1, STR_PTR, 0);
+    OP1(SLJIT_MOV, tmp_base, tmp_offset, SLJIT_IMM, max);
+    label = LABEL();
+    compile_char1_matchingpath(common, type, cc, &no_match, TRUE);
+    OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), POSSESSIVE1, STR_PTR, 0);
+    OP2(SLJIT_SUB | SLJIT_SET_E, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1);
+    JUMPTO(SLJIT_NOT_ZERO, label);
+    set_jumps(no_match, LABEL());
+    OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP), POSSESSIVE1);
+    break;
+    }
+#endif
+  OP1(SLJIT_MOV, tmp_base, tmp_offset, SLJIT_IMM, max);
+  label = LABEL();
+  detect_partial_match(common, &no_match);
+  compile_char1_matchingpath(common, type, cc, &no_char1_match, FALSE);
+  OP2(SLJIT_SUB | SLJIT_SET_E, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1);
+  JUMPTO(SLJIT_NOT_ZERO, label);
+  OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
+  set_jumps(no_char1_match, LABEL());
+  OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
+  set_jumps(no_match, LABEL());
   break;
 
   case OP_POSQUERY:
+  SLJIT_ASSERT(fast_str_ptr == 0);
   OP1(SLJIT_MOV, tmp_base, tmp_offset, STR_PTR, 0);
-  compile_char1_matchingpath(common, type, cc, &nomatch);
+  compile_char1_matchingpath(common, type, cc, &no_match, TRUE);
   OP1(SLJIT_MOV, tmp_base, tmp_offset, STR_PTR, 0);
-  set_jumps(nomatch, LABEL());
-  OP1(SLJIT_MOV, STR_PTR, 0, tmp_base, tmp_offset);
-  break;
-
-  case OP_CRPOSRANGE:
-  /* Combination of OP_EXACT and OP_POSSTAR or OP_POSUPTO */
-  OP1(SLJIT_MOV, tmp_base, tmp_offset, SLJIT_IMM, min);
-  label = LABEL();
-  compile_char1_matchingpath(common, type, cc, &backtrack->topbacktracks);
-  OP2(SLJIT_SUB | SLJIT_SET_E, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1);
-  JUMPTO(SLJIT_NOT_ZERO, label);
-
-  if (max != 0)
-    {
-    SLJIT_ASSERT(max - min > 0);
-    OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), POSSESSIVE1, SLJIT_IMM, max - min);
-    }
-  OP1(SLJIT_MOV, tmp_base, tmp_offset, STR_PTR, 0);
-  label = LABEL();
-  compile_char1_matchingpath(common, type, cc, &nomatch);
-  OP1(SLJIT_MOV, tmp_base, tmp_offset, STR_PTR, 0);
-  if (max == 0)
-    JUMPTO(SLJIT_JUMP, label);
-  else
-    {
-    OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_MEM1(SLJIT_SP), POSSESSIVE1, SLJIT_MEM1(SLJIT_SP), POSSESSIVE1, SLJIT_IMM, 1);
-    JUMPTO(SLJIT_NOT_ZERO, label);
-    }
-  set_jumps(nomatch, LABEL());
+  set_jumps(no_match, LABEL());
   OP1(SLJIT_MOV, STR_PTR, 0, tmp_base, tmp_offset);
   break;
 
@@ -8146,7 +9192,7 @@
 return end;
 }
 
-static SLJIT_INLINE pcre_uchar *compile_fail_accept_matchingpath(compiler_common *common, pcre_uchar *cc, backtrack_common *parent)
+static SLJIT_INLINE PCRE2_SPTR compile_fail_accept_matchingpath(compiler_common *common, PCRE2_SPTR cc, backtrack_common *parent)
 {
 DEFINE_COMPILER;
 backtrack_common *backtrack;
@@ -8174,13 +9220,14 @@
 else
   CMPTO(SLJIT_NOT_EQUAL, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(0), common->accept_label);
 OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0);
-OP1(SLJIT_MOV_UB, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, notempty));
-add_jump(compiler, &backtrack->topbacktracks, CMP(SLJIT_NOT_EQUAL, TMP2, 0, SLJIT_IMM, 0));
-OP1(SLJIT_MOV_UB, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, notempty_atstart));
+OP1(SLJIT_MOV_UI, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, options));
+OP2(SLJIT_AND | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP2, 0, SLJIT_IMM, PCRE2_NOTEMPTY);
+add_jump(compiler, &backtrack->topbacktracks, JUMP(SLJIT_NOT_ZERO));
+OP2(SLJIT_AND | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP2, 0, SLJIT_IMM, PCRE2_NOTEMPTY_ATSTART);
 if (common->accept_label == NULL)
-  add_jump(compiler, &common->accept, CMP(SLJIT_EQUAL, TMP2, 0, SLJIT_IMM, 0));
+  add_jump(compiler, &common->accept, JUMP(SLJIT_ZERO));
 else
-  CMPTO(SLJIT_EQUAL, TMP2, 0, SLJIT_IMM, 0, common->accept_label);
+  JUMPTO(SLJIT_ZERO, common->accept_label);
 OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, str));
 if (common->accept_label == NULL)
   add_jump(compiler, &common->accept, CMP(SLJIT_NOT_EQUAL, TMP2, 0, STR_PTR, 0));
@@ -8190,7 +9237,7 @@
 return cc + 1;
 }
 
-static SLJIT_INLINE pcre_uchar *compile_close_matchingpath(compiler_common *common, pcre_uchar *cc)
+static SLJIT_INLINE PCRE2_SPTR compile_close_matchingpath(compiler_common *common, PCRE2_SPTR cc)
 {
 DEFINE_COMPILER;
 int offset = GET2(cc, 1);
@@ -8209,12 +9256,12 @@
 return cc + 1 + IMM2_SIZE;
 }
 
-static SLJIT_INLINE pcre_uchar *compile_control_verb_matchingpath(compiler_common *common, pcre_uchar *cc, backtrack_common *parent)
+static SLJIT_INLINE PCRE2_SPTR compile_control_verb_matchingpath(compiler_common *common, PCRE2_SPTR cc, backtrack_common *parent)
 {
 DEFINE_COMPILER;
 backtrack_common *backtrack;
-pcre_uchar opcode = *cc;
-pcre_uchar *ccend = cc + 1;
+PCRE2_UCHAR opcode = *cc;
+PCRE2_SPTR ccend = cc + 1;
 
 if (opcode == OP_PRUNE_ARG || opcode == OP_SKIP_ARG || opcode == OP_THEN_ARG)
   ccend += 2 + cc[1];
@@ -8239,9 +9286,9 @@
 return ccend;
 }
 
-static pcre_uchar then_trap_opcode[1] = { OP_THEN_TRAP };
+static PCRE2_UCHAR then_trap_opcode[1] = { OP_THEN_TRAP };
 
-static SLJIT_INLINE void compile_then_trap_matchingpath(compiler_common *common, pcre_uchar *cc, pcre_uchar *ccend, backtrack_common *parent)
+static SLJIT_INLINE void compile_then_trap_matchingpath(compiler_common *common, PCRE2_SPTR cc, PCRE2_SPTR ccend, backtrack_common *parent)
 {
 DEFINE_COMPILER;
 backtrack_common *backtrack;
@@ -8272,7 +9319,7 @@
   init_frame(common, cc, ccend, size - 1, 0, FALSE);
 }
 
-static void compile_matchingpath(compiler_common *common, pcre_uchar *cc, pcre_uchar *ccend, backtrack_common *parent)
+static void compile_matchingpath(compiler_common *common, PCRE2_SPTR cc, PCRE2_SPTR ccend, backtrack_common *parent)
 {
 DEFINE_COMPILER;
 backtrack_common *backtrack;
@@ -8298,6 +9345,16 @@
     case OP_SOM:
     case OP_NOT_WORD_BOUNDARY:
     case OP_WORD_BOUNDARY:
+    case OP_EODN:
+    case OP_EOD:
+    case OP_CIRC:
+    case OP_CIRCM:
+    case OP_DOLL:
+    case OP_DOLLM:
+    case OP_REVERSE:
+    cc = compile_simple_assertion_matchingpath(common, *cc, cc + 1, parent->top != NULL ? &parent->top->nextbacktracks : &parent->topbacktracks);
+    break;
+
     case OP_NOT_DIGIT:
     case OP_DIGIT:
     case OP_NOT_WHITESPACE:
@@ -8315,16 +9372,9 @@
     case OP_NOT_VSPACE:
     case OP_VSPACE:
     case OP_EXTUNI:
-    case OP_EODN:
-    case OP_EOD:
-    case OP_CIRC:
-    case OP_CIRCM:
-    case OP_DOLL:
-    case OP_DOLLM:
     case OP_NOT:
     case OP_NOTI:
-    case OP_REVERSE:
-    cc = compile_char1_matchingpath(common, *cc, cc + 1, parent->top != NULL ? &parent->top->nextbacktracks : &parent->topbacktracks);
+    cc = compile_char1_matchingpath(common, *cc, cc + 1, parent->top != NULL ? &parent->top->nextbacktracks : &parent->topbacktracks, TRUE);
     break;
 
     case OP_SET_SOM:
@@ -8338,10 +9388,10 @@
 
     case OP_CHAR:
     case OP_CHARI:
-    if (common->mode == JIT_COMPILE)
+    if (common->mode == PCRE2_JIT_COMPLETE)
       cc = compile_charn_matchingpath(common, cc, ccend, parent->top != NULL ? &parent->top->nextbacktracks : &parent->topbacktracks);
     else
-      cc = compile_char1_matchingpath(common, *cc, cc + 1, parent->top != NULL ? &parent->top->nextbacktracks : &parent->topbacktracks);
+      cc = compile_char1_matchingpath(common, *cc, cc + 1, parent->top != NULL ? &parent->top->nextbacktracks : &parent->topbacktracks, TRUE);
     break;
 
     case OP_STAR:
@@ -8414,18 +9464,18 @@
 
     case OP_CLASS:
     case OP_NCLASS:
-    if (cc[1 + (32 / sizeof(pcre_uchar))] >= OP_CRSTAR && cc[1 + (32 / sizeof(pcre_uchar))] <= OP_CRPOSRANGE)
+    if (cc[1 + (32 / sizeof(PCRE2_UCHAR))] >= OP_CRSTAR && cc[1 + (32 / sizeof(PCRE2_UCHAR))] <= OP_CRPOSRANGE)
       cc = compile_iterator_matchingpath(common, cc, parent);
     else
-      cc = compile_char1_matchingpath(common, *cc, cc + 1, parent->top != NULL ? &parent->top->nextbacktracks : &parent->topbacktracks);
+      cc = compile_char1_matchingpath(common, *cc, cc + 1, parent->top != NULL ? &parent->top->nextbacktracks : &parent->topbacktracks, TRUE);
     break;
 
-#if defined SUPPORT_UTF || defined COMPILE_PCRE16 || defined COMPILE_PCRE32
+#if defined SUPPORT_UNICODE || PCRE2_CODE_UNIT_WIDTH == 16 || PCRE2_CODE_UNIT_WIDTH == 32
     case OP_XCLASS:
     if (*(cc + GET(cc, 1)) >= OP_CRSTAR && *(cc + GET(cc, 1)) <= OP_CRPOSRANGE)
       cc = compile_iterator_matchingpath(common, cc, parent);
     else
-      cc = compile_char1_matchingpath(common, *cc, cc + 1, parent->top != NULL ? &parent->top->nextbacktracks : &parent->topbacktracks);
+      cc = compile_char1_matchingpath(common, *cc, cc + 1, parent->top != NULL ? &parent->top->nextbacktracks : &parent->topbacktracks, TRUE);
     break;
 #endif
 
@@ -8457,6 +9507,7 @@
     break;
 
     case OP_CALLOUT:
+    case OP_CALLOUT_STR:
     cc = compile_callout_matchingpath(common, cc, parent);
     break;
 
@@ -8598,98 +9649,85 @@
 static void compile_iterator_backtrackingpath(compiler_common *common, struct backtrack_common *current)
 {
 DEFINE_COMPILER;
-pcre_uchar *cc = current->cc;
-pcre_uchar opcode;
-pcre_uchar type;
-int max = -1, min = -1;
+PCRE2_SPTR cc = current->cc;
+PCRE2_UCHAR opcode;
+PCRE2_UCHAR type;
+sljit_ui max = 0, exact;
 struct sljit_label *label = NULL;
 struct sljit_jump *jump = NULL;
 jump_list *jumplist = NULL;
+PCRE2_SPTR end;
 int private_data_ptr = PRIVATE_DATA(cc);
 int base = (private_data_ptr == 0) ? SLJIT_MEM1(STACK_TOP) : SLJIT_MEM1(SLJIT_SP);
 int offset0 = (private_data_ptr == 0) ? STACK(0) : private_data_ptr;
 int offset1 = (private_data_ptr == 0) ? STACK(1) : private_data_ptr + (int)sizeof(sljit_sw);
 
-cc = get_iterator_parameters(common, cc, &opcode, &type, &max, &min, NULL);
+cc = get_iterator_parameters(common, cc, &opcode, &type, &max, &exact, &end);
 
 switch(opcode)
   {
   case OP_STAR:
-  case OP_PLUS:
   case OP_UPTO:
-  case OP_CRRANGE:
   if (type == OP_ANYNL || type == OP_EXTUNI)
     {
     SLJIT_ASSERT(private_data_ptr == 0);
-    set_jumps(current->topbacktracks, LABEL());
+    set_jumps(CURRENT_AS(char_iterator_backtrack)->u.backtracks, LABEL());
     OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0));
     free_stack(common, 1);
-    CMPTO(SLJIT_NOT_EQUAL, STR_PTR, 0, SLJIT_IMM, 0, CURRENT_AS(iterator_backtrack)->matchingpath);
+    CMPTO(SLJIT_NOT_EQUAL, STR_PTR, 0, SLJIT_IMM, 0, CURRENT_AS(char_iterator_backtrack)->matchingpath);
     }
   else
     {
-    if (opcode == OP_UPTO)
-      min = 0;
-    if (opcode <= OP_PLUS)
+    if (CURRENT_AS(char_iterator_backtrack)->u.charpos.enabled)
       {
       OP1(SLJIT_MOV, STR_PTR, 0, base, offset0);
-      jump = CMP(SLJIT_LESS_EQUAL, STR_PTR, 0, base, offset1);
+      OP1(SLJIT_MOV, TMP2, 0, base, offset1);
+      OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
+
+      jump = CMP(SLJIT_LESS_EQUAL, STR_PTR, 0, TMP2, 0);
+      label = LABEL();
+      OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-1));
+      OP1(SLJIT_MOV, base, offset0, STR_PTR, 0);
+      if (CURRENT_AS(char_iterator_backtrack)->u.charpos.othercasebit != 0)
+        OP2(SLJIT_OR, TMP1, 0, TMP1, 0, SLJIT_IMM, CURRENT_AS(char_iterator_backtrack)->u.charpos.othercasebit);
+      CMPTO(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, CURRENT_AS(char_iterator_backtrack)->u.charpos.chr, CURRENT_AS(char_iterator_backtrack)->matchingpath);
+      skip_char_back(common);
+      CMPTO(SLJIT_GREATER, STR_PTR, 0, TMP2, 0, label);
       }
     else
       {
-      OP1(SLJIT_MOV, TMP1, 0, base, offset1);
       OP1(SLJIT_MOV, STR_PTR, 0, base, offset0);
-      jump = CMP(SLJIT_LESS_EQUAL, TMP1, 0, SLJIT_IMM, min + 1);
-      OP2(SLJIT_SUB, base, offset1, TMP1, 0, SLJIT_IMM, 1);
+      jump = CMP(SLJIT_LESS_EQUAL, STR_PTR, 0, base, offset1);
+      skip_char_back(common);
+      OP1(SLJIT_MOV, base, offset0, STR_PTR, 0);
+      JUMPTO(SLJIT_JUMP, CURRENT_AS(char_iterator_backtrack)->matchingpath);
       }
-    skip_char_back(common);
-    OP1(SLJIT_MOV, base, offset0, STR_PTR, 0);
-    JUMPTO(SLJIT_JUMP, CURRENT_AS(iterator_backtrack)->matchingpath);
-    if (opcode == OP_CRRANGE)
-      set_jumps(current->topbacktracks, LABEL());
     JUMPHERE(jump);
     if (private_data_ptr == 0)
       free_stack(common, 2);
-    if (opcode == OP_PLUS)
-      set_jumps(current->topbacktracks, LABEL());
     }
   break;
 
   case OP_MINSTAR:
-  case OP_MINPLUS:
   OP1(SLJIT_MOV, STR_PTR, 0, base, offset0);
-  compile_char1_matchingpath(common, type, cc, &jumplist);
+  compile_char1_matchingpath(common, type, cc, &jumplist, TRUE);
   OP1(SLJIT_MOV, base, offset0, STR_PTR, 0);
-  JUMPTO(SLJIT_JUMP, CURRENT_AS(iterator_backtrack)->matchingpath);
+  JUMPTO(SLJIT_JUMP, CURRENT_AS(char_iterator_backtrack)->matchingpath);
   set_jumps(jumplist, LABEL());
   if (private_data_ptr == 0)
     free_stack(common, 1);
-  if (opcode == OP_MINPLUS)
-    set_jumps(current->topbacktracks, LABEL());
   break;
 
   case OP_MINUPTO:
-  case OP_CRMINRANGE:
-  if (opcode == OP_CRMINRANGE)
-    {
-    label = LABEL();
-    set_jumps(current->topbacktracks, label);
-    }
-  OP1(SLJIT_MOV, STR_PTR, 0, base, offset0);
-  compile_char1_matchingpath(common, type, cc, &jumplist);
-
   OP1(SLJIT_MOV, TMP1, 0, base, offset1);
-  OP1(SLJIT_MOV, base, offset0, STR_PTR, 0);
-  OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, 1);
+  OP1(SLJIT_MOV, STR_PTR, 0, base, offset0);
+  OP2(SLJIT_SUB | SLJIT_SET_E, TMP1, 0, TMP1, 0, SLJIT_IMM, 1);
+  add_jump(compiler, &jumplist, JUMP(SLJIT_ZERO));
+
   OP1(SLJIT_MOV, base, offset1, TMP1, 0);
-
-  if (opcode == OP_CRMINRANGE)
-    CMPTO(SLJIT_LESS, TMP1, 0, SLJIT_IMM, min + 1, label);
-
-  if (opcode == OP_CRMINRANGE && max == 0)
-    JUMPTO(SLJIT_JUMP, CURRENT_AS(iterator_backtrack)->matchingpath);
-  else
-    CMPTO(SLJIT_LESS, TMP1, 0, SLJIT_IMM, max + 2, CURRENT_AS(iterator_backtrack)->matchingpath);
+  compile_char1_matchingpath(common, type, cc, &jumplist, TRUE);
+  OP1(SLJIT_MOV, base, offset0, STR_PTR, 0);
+  JUMPTO(SLJIT_JUMP, CURRENT_AS(char_iterator_backtrack)->matchingpath);
 
   set_jumps(jumplist, LABEL());
   if (private_data_ptr == 0)
@@ -8699,12 +9737,12 @@
   case OP_QUERY:
   OP1(SLJIT_MOV, STR_PTR, 0, base, offset0);
   OP1(SLJIT_MOV, base, offset0, SLJIT_IMM, 0);
-  CMPTO(SLJIT_NOT_EQUAL, STR_PTR, 0, SLJIT_IMM, 0, CURRENT_AS(iterator_backtrack)->matchingpath);
+  CMPTO(SLJIT_NOT_EQUAL, STR_PTR, 0, SLJIT_IMM, 0, CURRENT_AS(char_iterator_backtrack)->matchingpath);
   jump = JUMP(SLJIT_JUMP);
-  set_jumps(current->topbacktracks, LABEL());
+  set_jumps(CURRENT_AS(char_iterator_backtrack)->u.backtracks, LABEL());
   OP1(SLJIT_MOV, STR_PTR, 0, base, offset0);
   OP1(SLJIT_MOV, base, offset0, SLJIT_IMM, 0);
-  JUMPTO(SLJIT_JUMP, CURRENT_AS(iterator_backtrack)->matchingpath);
+  JUMPTO(SLJIT_JUMP, CURRENT_AS(char_iterator_backtrack)->matchingpath);
   JUMPHERE(jump);
   if (private_data_ptr == 0)
     free_stack(common, 1);
@@ -8714,8 +9752,8 @@
   OP1(SLJIT_MOV, STR_PTR, 0, base, offset0);
   OP1(SLJIT_MOV, base, offset0, SLJIT_IMM, 0);
   jump = CMP(SLJIT_EQUAL, STR_PTR, 0, SLJIT_IMM, 0);
-  compile_char1_matchingpath(common, type, cc, &jumplist);
-  JUMPTO(SLJIT_JUMP, CURRENT_AS(iterator_backtrack)->matchingpath);
+  compile_char1_matchingpath(common, type, cc, &jumplist, TRUE);
+  JUMPTO(SLJIT_JUMP, CURRENT_AS(char_iterator_backtrack)->matchingpath);
   set_jumps(jumplist, LABEL());
   JUMPHERE(jump);
   if (private_data_ptr == 0)
@@ -8723,11 +9761,6 @@
   break;
 
   case OP_EXACT:
-  case OP_POSPLUS:
-  case OP_CRPOSRANGE:
-  set_jumps(current->topbacktracks, LABEL());
-  break;
-
   case OP_POSSTAR:
   case OP_POSQUERY:
   case OP_POSUPTO:
@@ -8737,14 +9770,16 @@
   SLJIT_ASSERT_STOP();
   break;
   }
+
+  set_jumps(current->topbacktracks, LABEL());
 }
 
 static SLJIT_INLINE void compile_ref_iterator_backtrackingpath(compiler_common *common, struct backtrack_common *current)
 {
 DEFINE_COMPILER;
-pcre_uchar *cc = current->cc;
+PCRE2_SPTR cc = current->cc;
 BOOL ref = (*cc == OP_REF || *cc == OP_REFI);
-pcre_uchar type;
+PCRE2_UCHAR type;
 
 type = cc[ref ? 1 + IMM2_SIZE : 1 + 2 * IMM2_SIZE];
 
@@ -8754,12 +9789,12 @@
   set_jumps(current->topbacktracks, LABEL());
   OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0));
   free_stack(common, 1);
-  CMPTO(SLJIT_NOT_EQUAL, STR_PTR, 0, SLJIT_IMM, 0, CURRENT_AS(iterator_backtrack)->matchingpath);
+  CMPTO(SLJIT_NOT_EQUAL, STR_PTR, 0, SLJIT_IMM, 0, CURRENT_AS(ref_iterator_backtrack)->matchingpath);
   return;
   }
 
 OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0));
-CMPTO(SLJIT_NOT_EQUAL, STR_PTR, 0, SLJIT_IMM, 0, CURRENT_AS(iterator_backtrack)->matchingpath);
+CMPTO(SLJIT_NOT_EQUAL, STR_PTR, 0, SLJIT_IMM, 0, CURRENT_AS(ref_iterator_backtrack)->matchingpath);
 set_jumps(current->topbacktracks, LABEL());
 free_stack(common, ref ? 2 : 3);
 }
@@ -8793,8 +9828,8 @@
 static void compile_assert_backtrackingpath(compiler_common *common, struct backtrack_common *current)
 {
 DEFINE_COMPILER;
-pcre_uchar *cc = current->cc;
-pcre_uchar bra = OP_BRA;
+PCRE2_SPTR cc = current->cc;
+PCRE2_UCHAR bra = OP_BRA;
 struct sljit_jump *brajump = NULL;
 
 SLJIT_ASSERT(*cc != OP_BRAMINZERO);
@@ -8864,11 +9899,11 @@
 int offset = 0;
 int private_data_ptr = CURRENT_AS(bracket_backtrack)->private_data_ptr;
 int repeat_ptr = 0, repeat_type = 0, repeat_count = 0;
-pcre_uchar *cc = current->cc;
-pcre_uchar *ccbegin;
-pcre_uchar *ccprev;
-pcre_uchar bra = OP_BRA;
-pcre_uchar ket;
+PCRE2_SPTR cc = current->cc;
+PCRE2_SPTR ccbegin;
+PCRE2_SPTR ccprev;
+PCRE2_UCHAR bra = OP_BRA;
+PCRE2_UCHAR ket;
 assert_backtrack *assert;
 sljit_uw *next_update_addr = NULL;
 BOOL has_alternatives;
@@ -9258,7 +10293,9 @@
     /* The STR_PTR must be released. */
     stacksize++;
     }
-  free_stack(common, stacksize);
+
+  if (stacksize > 0)
+    free_stack(common, stacksize);
 
   JUMPHERE(once);
   /* Restore previous private_data_ptr */
@@ -9383,7 +10420,7 @@
 static SLJIT_INLINE void compile_control_verb_backtrackingpath(compiler_common *common, struct backtrack_common *current)
 {
 DEFINE_COMPILER;
-pcre_uchar opcode = *current->cc;
+PCRE2_UCHAR opcode = *current->cc;
 struct sljit_label *loop;
 struct sljit_jump *jump;
 
@@ -9557,7 +10594,7 @@
     case OP_TYPEPOSUPTO:
     case OP_CLASS:
     case OP_NCLASS:
-#if defined SUPPORT_UTF || !defined COMPILE_PCRE8
+#if defined SUPPORT_UNICODE || PCRE2_CODE_UNIT_WIDTH != 8
     case OP_XCLASS:
 #endif
     compile_iterator_backtrackingpath(common, current);
@@ -9632,7 +10669,7 @@
 
     case OP_COMMIT:
     if (!common->local_exit)
-      OP1(SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_IMM, PCRE_ERROR_NOMATCH);
+      OP1(SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_IMM, PCRE2_ERROR_NOMATCH);
     if (common->quit_label == NULL)
       add_jump(compiler, &common->quit, JUMP(SLJIT_JUMP));
     else
@@ -9640,6 +10677,7 @@
     break;
 
     case OP_CALLOUT:
+    case OP_CALLOUT_STR:
     case OP_FAIL:
     case OP_ACCEPT:
     case OP_ASSERT_ACCEPT:
@@ -9663,9 +10701,9 @@
 static SLJIT_INLINE void compile_recurse(compiler_common *common)
 {
 DEFINE_COMPILER;
-pcre_uchar *cc = common->start + common->currententry->start;
-pcre_uchar *ccbegin = cc + 1 + LINK_SIZE + (*cc == OP_BRA ? 0 : IMM2_SIZE);
-pcre_uchar *ccend = bracketend(cc) - (1 + LINK_SIZE);
+PCRE2_SPTR cc = common->start + common->currententry->start;
+PCRE2_SPTR ccbegin = cc + 1 + LINK_SIZE + (*cc == OP_BRA ? 0 : IMM2_SIZE);
+PCRE2_SPTR ccend = bracketend(cc) - (1 + LINK_SIZE);
 BOOL needs_control_head;
 int framesize = get_framesize(common, cc, NULL, TRUE, &needs_control_head);
 int private_data_size = get_private_data_copy_length(common, ccbegin, ccend, needs_control_head);
@@ -9688,8 +10726,8 @@
 set_jumps(common->currententry->calls, common->currententry->entry);
 
 sljit_emit_fast_enter(compiler, TMP2, 0);
-allocate_stack(common, private_data_size + framesize + alternativesize);
 count_match(common);
+allocate_stack(common, private_data_size + framesize + alternativesize);
 OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(private_data_size + framesize + alternativesize - 1), TMP2, 0);
 copy_private_data(common, ccbegin, ccend, TRUE, private_data_size + framesize + alternativesize, framesize + alternativesize, needs_control_head);
 if (needs_control_head)
@@ -9788,17 +10826,17 @@
 #undef COMPILE_BACKTRACKINGPATH
 #undef CURRENT_AS
 
-void
-PRIV(jit_compile)(const REAL_PCRE *re, PUBL(extra) *extra, int mode)
+static int jit_compile(pcre2_code *code, uint32_t mode)
 {
+pcre2_real_code *re = (pcre2_real_code *)code;
 struct sljit_compiler *compiler;
 backtrack_common rootbacktrack;
 compiler_common common_data;
 compiler_common *common = &common_data;
-const pcre_uint8 *tables = re->tables;
-pcre_study_data *study;
+const sljit_ub *tables = re->tables;
+void *allocator_data = &re->memctl;
 int private_data_size;
-pcre_uchar *ccend;
+PCRE2_SPTR ccend;
 executable_functions *functions;
 void *executable_func;
 sljit_uw executable_size;
@@ -9815,48 +10853,35 @@
 struct sljit_jump *reqbyte_notfound = NULL;
 struct sljit_jump *empty_match = NULL;
 
-SLJIT_ASSERT((extra->flags & PCRE_EXTRA_STUDY_DATA) != 0);
-study = extra->study_data;
-
-if (!tables)
-  tables = PRIV(default_tables);
+SLJIT_ASSERT(tables);
 
 memset(&rootbacktrack, 0, sizeof(backtrack_common));
 memset(common, 0, sizeof(compiler_common));
-rootbacktrack.cc = (pcre_uchar *)re + re->name_table_offset + re->name_count * re->name_entry_size;
+common->name_table = (PCRE2_SPTR)((uint8_t *)re + sizeof(pcre2_real_code));
+rootbacktrack.cc = common->name_table + re->name_count * re->name_entry_size;
 
 common->start = rootbacktrack.cc;
 common->read_only_data_head = NULL;
 common->fcc = tables + fcc_offset;
 common->lcc = (sljit_sw)(tables + lcc_offset);
 common->mode = mode;
-common->might_be_empty = study->minlength == 0;
+common->might_be_empty = re->minlength == 0;
 common->nltype = NLTYPE_FIXED;
-switch(re->options & PCRE_NEWLINE_BITS)
+switch(re->newline_convention)
   {
-  case 0:
-  /* Compile-time default */
-  switch(NEWLINE)
-    {
-    case -1: common->newline = (CHAR_CR << 8) | CHAR_NL; common->nltype = NLTYPE_ANY; break;
-    case -2: common->newline = (CHAR_CR << 8) | CHAR_NL; common->nltype = NLTYPE_ANYCRLF; break;
-    default: common->newline = NEWLINE; break;
-    }
-  break;
-  case PCRE_NEWLINE_CR: common->newline = CHAR_CR; break;
-  case PCRE_NEWLINE_LF: common->newline = CHAR_NL; break;
-  case PCRE_NEWLINE_CR+
-       PCRE_NEWLINE_LF: common->newline = (CHAR_CR << 8) | CHAR_NL; break;
-  case PCRE_NEWLINE_ANY: common->newline = (CHAR_CR << 8) | CHAR_NL; common->nltype = NLTYPE_ANY; break;
-  case PCRE_NEWLINE_ANYCRLF: common->newline = (CHAR_CR << 8) | CHAR_NL; common->nltype = NLTYPE_ANYCRLF; break;
-  default: return;
+  case PCRE2_NEWLINE_CR: common->newline = CHAR_CR; break;
+  case PCRE2_NEWLINE_LF: common->newline = CHAR_NL; break;
+  case PCRE2_NEWLINE_CRLF: common->newline = (CHAR_CR << 8) | CHAR_NL; break;
+  case PCRE2_NEWLINE_ANY: common->newline = (CHAR_CR << 8) | CHAR_NL; common->nltype = NLTYPE_ANY; break;
+  case PCRE2_NEWLINE_ANYCRLF: common->newline = (CHAR_CR << 8) | CHAR_NL; common->nltype = NLTYPE_ANYCRLF; break;
+  default: return PCRE2_ERROR_INTERNAL;
   }
 common->nlmax = READ_CHAR_MAX;
 common->nlmin = 0;
-if ((re->options & PCRE_BSR_ANYCRLF) != 0)
-  common->bsr_nltype = NLTYPE_ANYCRLF;
-else if ((re->options & PCRE_BSR_UNICODE) != 0)
+if (re->bsr_convention == PCRE2_BSR_UNICODE)
   common->bsr_nltype = NLTYPE_ANY;
+else if (re->bsr_convention == PCRE2_BSR_ANYCRLF)
+  common->bsr_nltype = NLTYPE_ANYCRLF;
 else
   {
 #ifdef BSR_ANYCRLF
@@ -9867,18 +10892,16 @@
   }
 common->bsr_nlmax = READ_CHAR_MAX;
 common->bsr_nlmin = 0;
-common->endonly = (re->options & PCRE_DOLLAR_ENDONLY) != 0;
+common->endonly = (re->overall_options & PCRE2_DOLLAR_ENDONLY) != 0;
 common->ctypes = (sljit_sw)(tables + ctypes_offset);
-common->name_table = ((pcre_uchar *)re) + re->name_table_offset;
 common->name_count = re->name_count;
 common->name_entry_size = re->name_entry_size;
-common->jscript_compat = (re->options & PCRE_JAVASCRIPT_COMPAT) != 0;
-#ifdef SUPPORT_UTF
+common->unset_backref = (re->overall_options & PCRE2_MATCH_UNSET_BACKREF) != 0;
+common->alt_circumflex = (re->overall_options & PCRE2_ALT_CIRCUMFLEX) != 0;
+#ifdef SUPPORT_UNICODE
 /* PCRE_UTF[16|32] have the same value as PCRE_UTF8. */
-common->utf = (re->options & PCRE_UTF8) != 0;
-#ifdef SUPPORT_UCP
-common->use_ucp = (re->options & PCRE_UCP) != 0;
-#endif
+common->utf = (re->overall_options & PCRE2_UTF) != 0;
+common->use_ucp = (re->overall_options & PCRE2_UCP) != 0;
 if (common->utf)
   {
   if (common->nltype == NLTYPE_ANY)
@@ -9902,14 +10925,14 @@
     common->bsr_nlmax = (CHAR_CR > CHAR_NL) ? CHAR_CR : CHAR_NL;
   common->bsr_nlmin = (CHAR_CR < CHAR_NL) ? CHAR_CR : CHAR_NL;
   }
-#endif /* SUPPORT_UTF */
+#endif /* SUPPORT_UNICODE */
 ccend = bracketend(common->start);
 
 /* Calculate the local space size on the stack. */
 common->ovector_start = LIMIT_MATCH + sizeof(sljit_sw);
-common->optimized_cbracket = (pcre_uint8 *)SLJIT_MALLOC(re->top_bracket + 1, compiler->allocator_data);
+common->optimized_cbracket = (sljit_ub *)SLJIT_MALLOC(re->top_bracket + 1, allocator_data);
 if (!common->optimized_cbracket)
-  return;
+  return PCRE2_ERROR_NOMEMORY;
 #if defined DEBUG_FORCE_UNOPTIMIZED_CBRAS && DEBUG_FORCE_UNOPTIMIZED_CBRAS == 1
 memset(common->optimized_cbracket, 0, re->top_bracket + 1);
 #else
@@ -9923,34 +10946,29 @@
 #endif
 if (!check_opcode_types(common, common->start, ccend))
   {
-  SLJIT_FREE(common->optimized_cbracket, compiler->allocator_data);
-  return;
+  SLJIT_FREE(common->optimized_cbracket, allocator_data);
+  return PCRE2_ERROR_NOMEMORY;
   }
 
 /* Checking flags and updating ovector_start. */
-if (mode == JIT_COMPILE && (re->flags & PCRE_REQCHSET) != 0 && (re->options & PCRE_NO_START_OPTIMIZE) == 0)
+if (mode == PCRE2_JIT_COMPLETE && (re->flags & PCRE2_LASTSET) != 0 && (re->overall_options & PCRE2_NO_START_OPTIMIZE) == 0)
   {
   common->req_char_ptr = common->ovector_start;
   common->ovector_start += sizeof(sljit_sw);
   }
-if (mode != JIT_COMPILE)
+if (mode != PCRE2_JIT_COMPLETE)
   {
   common->start_used_ptr = common->ovector_start;
   common->ovector_start += sizeof(sljit_sw);
-  if (mode == JIT_PARTIAL_SOFT_COMPILE)
+  if (mode == PCRE2_JIT_PARTIAL_SOFT)
     {
     common->hit_start = common->ovector_start;
-    common->ovector_start += 2 * sizeof(sljit_sw);
-    }
-  else
-    {
-    SLJIT_ASSERT(mode == JIT_PARTIAL_HARD_COMPILE);
-    common->needs_start_ptr = TRUE;
+    common->ovector_start += sizeof(sljit_sw);
     }
   }
-if ((re->options & PCRE_FIRSTLINE) != 0)
+if ((re->overall_options & (PCRE2_FIRSTLINE | PCRE2_USE_OFFSET_LIMIT)) != 0)
   {
-  common->first_line_end = common->ovector_start;
+  common->match_end_ptr = common->ovector_start;
   common->ovector_start += sizeof(sljit_sw);
   }
 #if defined DEBUG_FORCE_CONTROL_HEAD && DEBUG_FORCE_CONTROL_HEAD
@@ -9961,14 +10979,12 @@
   common->control_head_ptr = common->ovector_start;
   common->ovector_start += sizeof(sljit_sw);
   }
-if (common->needs_start_ptr && common->has_set_som)
+if (common->has_set_som)
   {
   /* Saving the real start pointer is necessary. */
   common->start_ptr = common->ovector_start;
   common->ovector_start += sizeof(sljit_sw);
   }
-else
-  common->needs_start_ptr = FALSE;
 
 /* Aligning ovector to even number of sljit words. */
 if ((common->ovector_start & sizeof(sljit_sw)) != 0)
@@ -9985,36 +11001,44 @@
 common->cbra_ptr = OVECTOR_START + (re->top_bracket + 1) * 2 * sizeof(sljit_sw);
 
 total_length = ccend - common->start;
-common->private_data_ptrs = (sljit_si *)SLJIT_MALLOC(total_length * (sizeof(sljit_si) + (common->has_then ? 1 : 0)), compiler->allocator_data);
+common->private_data_ptrs = (sljit_si *)SLJIT_MALLOC(total_length * (sizeof(sljit_si) + (common->has_then ? 1 : 0)), allocator_data);
 if (!common->private_data_ptrs)
   {
-  SLJIT_FREE(common->optimized_cbracket, compiler->allocator_data);
-  return;
+  SLJIT_FREE(common->optimized_cbracket, allocator_data);
+  return PCRE2_ERROR_NOMEMORY;
   }
 memset(common->private_data_ptrs, 0, total_length * sizeof(sljit_si));
 
 private_data_size = common->cbra_ptr + (re->top_bracket + 1) * sizeof(sljit_sw);
 set_private_data_ptrs(common, &private_data_size, ccend);
+if ((re->overall_options & PCRE2_ANCHORED) == 0 && (re->overall_options & PCRE2_NO_START_OPTIMIZE) == 0)
+  {
+  if (!detect_fast_forward_skip(common, &private_data_size) && !common->has_skip_in_assert_back)
+    detect_fast_fail(common, common->start, &private_data_size, 4);
+  }
+
+SLJIT_ASSERT(common->fast_fail_start_ptr <= common->fast_fail_end_ptr);
+
 if (private_data_size > SLJIT_MAX_LOCAL_SIZE)
   {
-  SLJIT_FREE(common->private_data_ptrs, compiler->allocator_data);
-  SLJIT_FREE(common->optimized_cbracket, compiler->allocator_data);
-  return;
+  SLJIT_FREE(common->private_data_ptrs, allocator_data);
+  SLJIT_FREE(common->optimized_cbracket, allocator_data);
+  return PCRE2_ERROR_NOMEMORY;
   }
 
 if (common->has_then)
   {
-  common->then_offsets = (pcre_uint8 *)(common->private_data_ptrs + total_length);
+  common->then_offsets = (sljit_ub *)(common->private_data_ptrs + total_length);
   memset(common->then_offsets, 0, total_length);
   set_then_offsets(common, common->start, NULL);
   }
 
-compiler = sljit_create_compiler(NULL);
+compiler = sljit_create_compiler(allocator_data);
 if (!compiler)
   {
-  SLJIT_FREE(common->optimized_cbracket, compiler->allocator_data);
-  SLJIT_FREE(common->private_data_ptrs, compiler->allocator_data);
-  return;
+  SLJIT_FREE(common->optimized_cbracket, allocator_data);
+  SLJIT_FREE(common->private_data_ptrs, allocator_data);
+  return PCRE2_ERROR_NOMEMORY;
   }
 common->compiler = compiler;
 
@@ -10037,7 +11061,10 @@
 OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, 1);
 OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LIMIT_MATCH, TMP1, 0);
 
-if (mode == JIT_PARTIAL_SOFT_COMPILE)
+if (common->fast_fail_start_ptr < common->fast_fail_end_ptr)
+  reset_fast_fail(common);
+
+if (mode == PCRE2_JIT_PARTIAL_SOFT)
   OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->hit_start, SLJIT_IMM, -1);
 if (common->mark_ptr != 0)
   OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->mark_ptr, SLJIT_IMM, 0);
@@ -10045,69 +11072,65 @@
   OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr, SLJIT_IMM, 0);
 
 /* Main part of the matching */
-if ((re->options & PCRE_ANCHORED) == 0)
+if ((re->overall_options & PCRE2_ANCHORED) == 0)
   {
-  mainloop_label = mainloop_entry(common, (re->flags & PCRE_HASCRORLF) != 0, (re->options & PCRE_FIRSTLINE) != 0);
+  mainloop_label = mainloop_entry(common, (re->flags & PCRE2_HASCRORLF) != 0, re->overall_options);
   continue_match_label = LABEL();
   /* Forward search if possible. */
-  if ((re->options & PCRE_NO_START_OPTIMIZE) == 0)
+  if ((re->overall_options & PCRE2_NO_START_OPTIMIZE) == 0)
     {
-    if (mode == JIT_COMPILE && fast_forward_first_n_chars(common, (re->options & PCRE_FIRSTLINE) != 0))
+    if (mode == PCRE2_JIT_COMPLETE && fast_forward_first_n_chars(common))
       ;
-    else if ((re->flags & PCRE_FIRSTSET) != 0)
-      fast_forward_first_char(common, (pcre_uchar)re->first_char, (re->flags & PCRE_FCH_CASELESS) != 0, (re->options & PCRE_FIRSTLINE) != 0);
-    else if ((re->flags & PCRE_STARTLINE) != 0)
-      fast_forward_newline(common, (re->options & PCRE_FIRSTLINE) != 0);
-    else if (study != NULL && (study->flags & PCRE_STUDY_MAPPED) != 0)
-      fast_forward_start_bits(common, study->start_bits, (re->options & PCRE_FIRSTLINE) != 0);
+    else if ((re->flags & PCRE2_FIRSTSET) != 0)
+      fast_forward_first_char(common, (PCRE2_UCHAR)(re->first_codeunit), (re->flags & PCRE2_FIRSTCASELESS) != 0);
+    else if ((re->flags & PCRE2_STARTLINE) != 0)
+      fast_forward_newline(common);
+    else if ((re->flags & PCRE2_FIRSTMAPSET) != 0)
+      fast_forward_start_bits(common, re->start_bitmap);
     }
   }
 else
   continue_match_label = LABEL();
 
-if (mode == JIT_COMPILE && study->minlength > 0 && (re->options & PCRE_NO_START_OPTIMIZE) == 0)
+if (mode == PCRE2_JIT_COMPLETE && re->minlength > 0 && (re->overall_options & PCRE2_NO_START_OPTIMIZE) == 0)
   {
-  OP1(SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_IMM, PCRE_ERROR_NOMATCH);
-  OP2(SLJIT_ADD, TMP2, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(study->minlength));
+  OP1(SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_IMM, PCRE2_ERROR_NOMATCH);
+  OP2(SLJIT_ADD, TMP2, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(re->minlength));
   minlength_check_failed = CMP(SLJIT_GREATER, TMP2, 0, STR_END, 0);
   }
 if (common->req_char_ptr != 0)
-  reqbyte_notfound = search_requested_char(common, (pcre_uchar)re->req_char, (re->flags & PCRE_RCH_CASELESS) != 0, (re->flags & PCRE_FIRSTSET) != 0);
+  reqbyte_notfound = search_requested_char(common, (PCRE2_UCHAR)(re->last_codeunit), (re->flags & PCRE2_LASTCASELESS) != 0, (re->flags & PCRE2_FIRSTSET) != 0);
 
 /* Store the current STR_PTR in OVECTOR(0). */
 OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), OVECTOR(0), STR_PTR, 0);
 /* Copy the limit of allowed recursions. */
 OP1(SLJIT_MOV, COUNT_MATCH, 0, SLJIT_MEM1(SLJIT_SP), LIMIT_MATCH);
 if (common->capture_last_ptr != 0)
-  OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->capture_last_ptr, SLJIT_IMM, -1);
+  OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->capture_last_ptr, SLJIT_IMM, 0);
+if (common->fast_forward_bc_ptr != NULL)
+  OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), PRIVATE_DATA(common->fast_forward_bc_ptr + 1), STR_PTR, 0);
 
-if (common->needs_start_ptr)
-  {
-  SLJIT_ASSERT(common->start_ptr != OVECTOR(0));
+if (common->start_ptr != OVECTOR(0))
   OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->start_ptr, STR_PTR, 0);
-  }
-else
-  SLJIT_ASSERT(common->start_ptr == OVECTOR(0));
 
 /* Copy the beginning of the string. */
-if (mode == JIT_PARTIAL_SOFT_COMPILE)
+if (mode == PCRE2_JIT_PARTIAL_SOFT)
   {
   jump = CMP(SLJIT_NOT_EQUAL, SLJIT_MEM1(SLJIT_SP), common->hit_start, SLJIT_IMM, -1);
   OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->start_used_ptr, STR_PTR, 0);
-  OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->hit_start + sizeof(sljit_sw), STR_PTR, 0);
   JUMPHERE(jump);
   }
-else if (mode == JIT_PARTIAL_HARD_COMPILE)
+else if (mode == PCRE2_JIT_PARTIAL_HARD)
   OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->start_used_ptr, STR_PTR, 0);
 
 compile_matchingpath(common, common->start, ccend, &rootbacktrack);
 if (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler)))
   {
   sljit_free_compiler(compiler);
-  SLJIT_FREE(common->optimized_cbracket, compiler->allocator_data);
-  SLJIT_FREE(common->private_data_ptrs, compiler->allocator_data);
-  free_read_only_data(common->read_only_data_head, compiler->allocator_data);
-  return;
+  SLJIT_FREE(common->optimized_cbracket, allocator_data);
+  SLJIT_FREE(common->private_data_ptrs, allocator_data);
+  PRIV(jit_free_rodata)(common->read_only_data_head, compiler->allocator_data);
+  return PCRE2_ERROR_NOMEMORY;
   }
 
 if (common->might_be_empty)
@@ -10131,7 +11154,7 @@
   SET_LABEL(minlength_check_failed, common->forced_quit_label);
 sljit_emit_return(compiler, SLJIT_MOV, SLJIT_RETURN_REG, 0);
 
-if (mode != JIT_COMPILE)
+if (mode != PCRE2_JIT_COMPLETE)
   {
   common->partialmatchlabel = LABEL();
   set_jumps(common->partialmatch, common->partialmatchlabel);
@@ -10144,48 +11167,57 @@
 if (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler)))
   {
   sljit_free_compiler(compiler);
-  SLJIT_FREE(common->optimized_cbracket, compiler->allocator_data);
-  SLJIT_FREE(common->private_data_ptrs, compiler->allocator_data);
-  free_read_only_data(common->read_only_data_head, compiler->allocator_data);
-  return;
+  SLJIT_FREE(common->optimized_cbracket, allocator_data);
+  SLJIT_FREE(common->private_data_ptrs, allocator_data);
+  PRIV(jit_free_rodata)(common->read_only_data_head, compiler->allocator_data);
+  return PCRE2_ERROR_NOMEMORY;
   }
 
 SLJIT_ASSERT(rootbacktrack.prev == NULL);
 reset_match_label = LABEL();
 
-if (mode == JIT_PARTIAL_SOFT_COMPILE)
+if (mode == PCRE2_JIT_PARTIAL_SOFT)
   {
   /* Update hit_start only in the first time. */
   jump = CMP(SLJIT_NOT_EQUAL, SLJIT_MEM1(SLJIT_SP), common->hit_start, SLJIT_IMM, 0);
-  OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->start_used_ptr);
+  OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->start_ptr);
   OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->start_used_ptr, SLJIT_IMM, -1);
   OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->hit_start, TMP1, 0);
   JUMPHERE(jump);
   }
 
 /* Check we have remaining characters. */
-if ((re->options & PCRE_ANCHORED) == 0 && (re->options & PCRE_FIRSTLINE) != 0)
+if ((re->overall_options & PCRE2_ANCHORED) == 0 && common->match_end_ptr != 0)
   {
-  SLJIT_ASSERT(common->first_line_end != 0);
-  OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->first_line_end);
+  OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->match_end_ptr);
   }
 
-OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP), common->start_ptr);
+if (common->fast_forward_bc_ptr != NULL)
+  OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP), PRIVATE_DATA(common->fast_forward_bc_ptr + 1));
+else
+  OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP), common->start_ptr);
 
-if ((re->options & PCRE_ANCHORED) == 0)
+if ((re->overall_options & PCRE2_ANCHORED) == 0)
   {
   if (common->ff_newline_shortcut != NULL)
     {
-    if ((re->options & PCRE_FIRSTLINE) == 0)
-      CMPTO(SLJIT_LESS, STR_PTR, 0, STR_END, 0, common->ff_newline_shortcut);
-    /* There cannot be more newlines here. */
+    /* There cannot be more newlines if PCRE2_FIRSTLINE is set. */
+    if ((re->overall_options & PCRE2_FIRSTLINE) == 0)
+      {
+      if (common->match_end_ptr != 0)
+        {
+        OP1(SLJIT_MOV, TMP3, 0, STR_END, 0);
+        OP1(SLJIT_MOV, STR_END, 0, TMP1, 0);
+        CMPTO(SLJIT_LESS, STR_PTR, 0, TMP1, 0, common->ff_newline_shortcut);
+        OP1(SLJIT_MOV, STR_END, 0, TMP3, 0);
+        }
+      else
+        CMPTO(SLJIT_LESS, STR_PTR, 0, STR_END, 0, common->ff_newline_shortcut);
+      }
     }
   else
     {
-    if ((re->options & PCRE_FIRSTLINE) == 0)
-      CMPTO(SLJIT_LESS, STR_PTR, 0, STR_END, 0, mainloop_label);
-    else
-      CMPTO(SLJIT_LESS, STR_PTR, 0, TMP1, 0, mainloop_label);
+    CMPTO(SLJIT_LESS, STR_PTR, 0, (common->match_end_ptr == 0) ? STR_END : TMP1, 0, mainloop_label);
     }
   }
 
@@ -10193,10 +11225,10 @@
 if (reqbyte_notfound != NULL)
   JUMPHERE(reqbyte_notfound);
 
-if (mode == JIT_PARTIAL_SOFT_COMPILE)
+if (mode == PCRE2_JIT_PARTIAL_SOFT)
   CMPTO(SLJIT_NOT_EQUAL, SLJIT_MEM1(SLJIT_SP), common->hit_start, SLJIT_IMM, -1, common->partialmatchlabel);
 
-OP1(SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_IMM, PCRE_ERROR_NOMATCH);
+OP1(SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_IMM, PCRE2_ERROR_NOMATCH);
 JUMPTO(SLJIT_JUMP, common->quit_label);
 
 flush_stubs(common);
@@ -10205,15 +11237,19 @@
   {
   JUMPHERE(empty_match);
   OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0);
-  OP1(SLJIT_MOV_UB, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, notempty));
-  CMPTO(SLJIT_NOT_EQUAL, TMP2, 0, SLJIT_IMM, 0, empty_match_backtrack_label);
-  OP1(SLJIT_MOV_UB, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, notempty_atstart));
-  CMPTO(SLJIT_EQUAL, TMP2, 0, SLJIT_IMM, 0, empty_match_found_label);
+  OP1(SLJIT_MOV_UI, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, options));
+  OP2(SLJIT_AND | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP2, 0, SLJIT_IMM, PCRE2_NOTEMPTY);
+  JUMPTO(SLJIT_NOT_ZERO, empty_match_backtrack_label);
+  OP2(SLJIT_AND | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP2, 0, SLJIT_IMM, PCRE2_NOTEMPTY_ATSTART);
+  JUMPTO(SLJIT_ZERO, empty_match_found_label);
   OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, str));
   CMPTO(SLJIT_NOT_EQUAL, TMP2, 0, STR_PTR, 0, empty_match_found_label);
   JUMPTO(SLJIT_JUMP, empty_match_backtrack_label);
   }
 
+common->fast_forward_bc_ptr = NULL;
+common->fast_fail_start_ptr = 0;
+common->fast_fail_end_ptr = 0;
 common->currententry = common->entries;
 common->local_exit = TRUE;
 quit_label = common->quit_label;
@@ -10224,10 +11260,10 @@
   if (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler)))
     {
     sljit_free_compiler(compiler);
-    SLJIT_FREE(common->optimized_cbracket, compiler->allocator_data);
-    SLJIT_FREE(common->private_data_ptrs, compiler->allocator_data);
-    free_read_only_data(common->read_only_data_head, compiler->allocator_data);
-    return;
+    SLJIT_FREE(common->optimized_cbracket, allocator_data);
+    SLJIT_FREE(common->private_data_ptrs, allocator_data);
+    PRIV(jit_free_rodata)(common->read_only_data_head, compiler->allocator_data);
+    return PCRE2_ERROR_NOMEMORY;
     }
   flush_stubs(common);
   common->currententry = common->currententry->next;
@@ -10258,12 +11294,12 @@
 /* Allocation failed. */
 JUMPHERE(jump);
 /* We break the return address cache here, but this is a really rare case. */
-OP1(SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_IMM, PCRE_ERROR_JIT_STACKLIMIT);
+OP1(SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_IMM, PCRE2_ERROR_JIT_STACKLIMIT);
 JUMPTO(SLJIT_JUMP, common->quit_label);
 
 /* Call limit reached. */
 set_jumps(common->calllimit, LABEL());
-OP1(SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_IMM, PCRE_ERROR_MATCHLIMIT);
+OP1(SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_IMM, PCRE2_ERROR_MATCHLIMIT);
 JUMPTO(SLJIT_JUMP, common->quit_label);
 
 if (common->revertframes != NULL)
@@ -10309,8 +11345,8 @@
   OP1(SLJIT_MOV, STR_PTR, 0, TMP1, 0);
   JUMPTO(SLJIT_JUMP, reset_match_label);
   }
-#ifdef SUPPORT_UTF
-#ifdef COMPILE_PCRE8
+#ifdef SUPPORT_UNICODE
+#if PCRE2_CODE_UNIT_WIDTH == 8
 if (common->utfreadchar != NULL)
   {
   set_jumps(common->utfreadchar, LABEL());
@@ -10326,18 +11362,16 @@
   set_jumps(common->utfreadtype8, LABEL());
   do_utfreadtype8(common);
   }
-#endif /* COMPILE_PCRE8 */
-#endif /* SUPPORT_UTF */
-#ifdef SUPPORT_UCP
+#endif /* PCRE2_CODE_UNIT_WIDTH == 8 */
 if (common->getucd != NULL)
   {
   set_jumps(common->getucd, LABEL());
   do_getucd(common);
   }
-#endif
+#endif /* SUPPORT_UNICODE */
 
-SLJIT_FREE(common->optimized_cbracket, compiler->allocator_data);
-SLJIT_FREE(common->private_data_ptrs, compiler->allocator_data);
+SLJIT_FREE(common->optimized_cbracket, allocator_data);
+SLJIT_FREE(common->private_data_ptrs, allocator_data);
 
 executable_func = sljit_generate_code(compiler);
 executable_size = sljit_get_generated_code_size(compiler);
@@ -10350,384 +11384,120 @@
 sljit_free_compiler(compiler);
 if (executable_func == NULL)
   {
-  free_read_only_data(common->read_only_data_head, compiler->allocator_data);
-  return;
+  PRIV(jit_free_rodata)(common->read_only_data_head, compiler->allocator_data);
+  return PCRE2_ERROR_NOMEMORY;
   }
 
 /* Reuse the function descriptor if possible. */
-if ((extra->flags & PCRE_EXTRA_EXECUTABLE_JIT) != 0 && extra->executable_jit != NULL)
-  functions = (executable_functions *)extra->executable_jit;
+if (re->executable_jit != NULL)
+  functions = (executable_functions *)re->executable_jit;
 else
   {
-  /* Note: If your memory-checker has flagged the allocation below as a
-   * memory leak, it is probably because you either forgot to call
-   * pcre_free_study() (or pcre16_free_study()) on the pcre_extra (or
-   * pcre16_extra) object, or you called said function after having
-   * cleared the PCRE_EXTRA_EXECUTABLE_JIT bit from the "flags" field
-   * of the object. (The function will only free the JIT data if the
-   * bit remains set, as the bit indicates that the pointer to the data
-   * is valid.)
-   */
-  functions = SLJIT_MALLOC(sizeof(executable_functions), compiler->allocator_data);
+  functions = SLJIT_MALLOC(sizeof(executable_functions), allocator_data);
   if (functions == NULL)
     {
     /* This case is highly unlikely since we just recently
     freed a lot of memory. Not impossible though. */
     sljit_free_code(executable_func);
-    free_read_only_data(common->read_only_data_head, compiler->allocator_data);
-    return;
+    PRIV(jit_free_rodata)(common->read_only_data_head, compiler->allocator_data);
+    return PCRE2_ERROR_NOMEMORY;
     }
   memset(functions, 0, sizeof(executable_functions));
-  functions->top_bracket = (re->top_bracket + 1) * 2;
-  functions->limit_match = (re->flags & PCRE_MLSET) != 0 ? re->limit_match : 0;
-  extra->executable_jit = functions;
-  extra->flags |= PCRE_EXTRA_EXECUTABLE_JIT;
+  functions->top_bracket = re->top_bracket + 1;
+  functions->limit_match = re->limit_match;
+  re->executable_jit = functions;
   }
 
+/* Turn mode into an index. */
+if (mode == PCRE2_JIT_COMPLETE)
+  mode = 0;
+else
+  mode = (mode == PCRE2_JIT_PARTIAL_SOFT) ? 1 : 2;
+
+SLJIT_ASSERT(mode < JIT_NUMBER_OF_COMPILE_MODES);
 functions->executable_funcs[mode] = executable_func;
 functions->read_only_data_heads[mode] = common->read_only_data_head;
 functions->executable_sizes[mode] = executable_size;
+return 0;
 }
 
-static SLJIT_NOINLINE int jit_machine_stack_exec(jit_arguments *arguments, void *executable_func)
-{
-union {
-   void *executable_func;
-   jit_function call_executable_func;
-} convert_executable_func;
-pcre_uint8 local_space[MACHINE_STACK_SIZE];
-struct sljit_stack local_stack;
-
-local_stack.top = (sljit_sw)&local_space;
-local_stack.base = local_stack.top;
-local_stack.limit = local_stack.base + MACHINE_STACK_SIZE;
-local_stack.max_limit = local_stack.limit;
-arguments->stack = &local_stack;
-convert_executable_func.executable_func = executable_func;
-return convert_executable_func.call_executable_func(arguments);
-}
-
-int
-PRIV(jit_exec)(const PUBL(extra) *extra_data, const pcre_uchar *subject,
-  int length, int start_offset, int options, int *offsets, int offset_count)
-{
-executable_functions *functions = (executable_functions *)extra_data->executable_jit;
-union {
-   void *executable_func;
-   jit_function call_executable_func;
-} convert_executable_func;
-jit_arguments arguments;
-int max_offset_count;
-int retval;
-int mode = JIT_COMPILE;
-
-if ((options & PCRE_PARTIAL_HARD) != 0)
-  mode = JIT_PARTIAL_HARD_COMPILE;
-else if ((options & PCRE_PARTIAL_SOFT) != 0)
-  mode = JIT_PARTIAL_SOFT_COMPILE;
-
-if (functions->executable_funcs[mode] == NULL)
-  return PCRE_ERROR_JIT_BADOPTION;
-
-/* Sanity checks should be handled by pcre_exec. */
-arguments.str = subject + start_offset;
-arguments.begin = subject;
-arguments.end = subject + length;
-arguments.mark_ptr = NULL;
-/* JIT decreases this value less frequently than the interpreter. */
-arguments.limit_match = ((extra_data->flags & PCRE_EXTRA_MATCH_LIMIT) == 0) ? MATCH_LIMIT : (pcre_uint32)(extra_data->match_limit);
-if (functions->limit_match != 0 && functions->limit_match < arguments.limit_match)
-  arguments.limit_match = functions->limit_match;
-arguments.notbol = (options & PCRE_NOTBOL) != 0;
-arguments.noteol = (options & PCRE_NOTEOL) != 0;
-arguments.notempty = (options & PCRE_NOTEMPTY) != 0;
-arguments.notempty_atstart = (options & PCRE_NOTEMPTY_ATSTART) != 0;
-arguments.offsets = offsets;
-arguments.callout_data = (extra_data->flags & PCRE_EXTRA_CALLOUT_DATA) != 0 ? extra_data->callout_data : NULL;
-arguments.real_offset_count = offset_count;
-
-/* pcre_exec() rounds offset_count to a multiple of 3, and then uses only 2/3 of
-the output vector for storing captured strings, with the remainder used as
-workspace. We don't need the workspace here. For compatibility, we limit the
-number of captured strings in the same way as pcre_exec(), so that the user
-gets the same result with and without JIT. */
-
-if (offset_count != 2)
-  offset_count = ((offset_count - (offset_count % 3)) * 2) / 3;
-max_offset_count = functions->top_bracket;
-if (offset_count > max_offset_count)
-  offset_count = max_offset_count;
-arguments.offset_count = offset_count;
-
-if (functions->callback)
-  arguments.stack = (struct sljit_stack *)functions->callback(functions->userdata);
-else
-  arguments.stack = (struct sljit_stack *)functions->userdata;
-
-if (arguments.stack == NULL)
-  retval = jit_machine_stack_exec(&arguments, functions->executable_funcs[mode]);
-else
-  {
-  convert_executable_func.executable_func = functions->executable_funcs[mode];
-  retval = convert_executable_func.call_executable_func(&arguments);
-  }
-
-if (retval * 2 > offset_count)
-  retval = 0;
-if ((extra_data->flags & PCRE_EXTRA_MARK) != 0)
-  *(extra_data->mark) = arguments.mark_ptr;
-
-return retval;
-}
-
-#if defined COMPILE_PCRE8
-PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
-pcre_jit_exec(const pcre *argument_re, const pcre_extra *extra_data,
-  PCRE_SPTR subject, int length, int start_offset, int options,
-  int *offsets, int offset_count, pcre_jit_stack *stack)
-#elif defined COMPILE_PCRE16
-PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
-pcre16_jit_exec(const pcre16 *argument_re, const pcre16_extra *extra_data,
-  PCRE_SPTR16 subject, int length, int start_offset, int options,
-  int *offsets, int offset_count, pcre16_jit_stack *stack)
-#elif defined COMPILE_PCRE32
-PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
-pcre32_jit_exec(const pcre32 *argument_re, const pcre32_extra *extra_data,
-  PCRE_SPTR32 subject, int length, int start_offset, int options,
-  int *offsets, int offset_count, pcre32_jit_stack *stack)
 #endif
+
+/*************************************************
+*        JIT compile a Regular Expression        *
+*************************************************/
+
+/* This function used JIT to convert a previously-compiled pattern into machine
+code.
+
+Arguments:
+  code          a compiled pattern
+  options       JIT option bits
+
+Returns:        0: success or (*NOJIT) was used
+               <0: an error code
+*/
+
+#define PUBLIC_JIT_COMPILE_OPTIONS \
+  (PCRE2_JIT_COMPLETE|PCRE2_JIT_PARTIAL_SOFT|PCRE2_JIT_PARTIAL_HARD)
+
+PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION
+pcre2_jit_compile(pcre2_code *code, uint32_t options)
 {
-pcre_uchar *subject_ptr = (pcre_uchar *)subject;
-executable_functions *functions = (executable_functions *)extra_data->executable_jit;
-union {
-   void *executable_func;
-   jit_function call_executable_func;
-} convert_executable_func;
-jit_arguments arguments;
-int max_offset_count;
-int retval;
-int mode = JIT_COMPILE;
+#ifndef SUPPORT_JIT
 
-SLJIT_UNUSED_ARG(argument_re);
-
-/* Plausibility checks */
-if ((options & ~PUBLIC_JIT_EXEC_OPTIONS) != 0) return PCRE_ERROR_JIT_BADOPTION;
-
-if ((options & PCRE_PARTIAL_HARD) != 0)
-  mode = JIT_PARTIAL_HARD_COMPILE;
-else if ((options & PCRE_PARTIAL_SOFT) != 0)
-  mode = JIT_PARTIAL_SOFT_COMPILE;
-
-if (functions->executable_funcs[mode] == NULL)
-  return PCRE_ERROR_JIT_BADOPTION;
-
-/* Sanity checks should be handled by pcre_exec. */
-arguments.stack = (struct sljit_stack *)stack;
-arguments.str = subject_ptr + start_offset;
-arguments.begin = subject_ptr;
-arguments.end = subject_ptr + length;
-arguments.mark_ptr = NULL;
-/* JIT decreases this value less frequently than the interpreter. */
-arguments.limit_match = ((extra_data->flags & PCRE_EXTRA_MATCH_LIMIT) == 0) ? MATCH_LIMIT : (pcre_uint32)(extra_data->match_limit);
-if (functions->limit_match != 0 && functions->limit_match < arguments.limit_match)
-  arguments.limit_match = functions->limit_match;
-arguments.notbol = (options & PCRE_NOTBOL) != 0;
-arguments.noteol = (options & PCRE_NOTEOL) != 0;
-arguments.notempty = (options & PCRE_NOTEMPTY) != 0;
-arguments.notempty_atstart = (options & PCRE_NOTEMPTY_ATSTART) != 0;
-arguments.offsets = offsets;
-arguments.callout_data = (extra_data->flags & PCRE_EXTRA_CALLOUT_DATA) != 0 ? extra_data->callout_data : NULL;
-arguments.real_offset_count = offset_count;
-
-/* pcre_exec() rounds offset_count to a multiple of 3, and then uses only 2/3 of
-the output vector for storing captured strings, with the remainder used as
-workspace. We don't need the workspace here. For compatibility, we limit the
-number of captured strings in the same way as pcre_exec(), so that the user
-gets the same result with and without JIT. */
-
-if (offset_count != 2)
-  offset_count = ((offset_count - (offset_count % 3)) * 2) / 3;
-max_offset_count = functions->top_bracket;
-if (offset_count > max_offset_count)
-  offset_count = max_offset_count;
-arguments.offset_count = offset_count;
-
-convert_executable_func.executable_func = functions->executable_funcs[mode];
-retval = convert_executable_func.call_executable_func(&arguments);
-
-if (retval * 2 > offset_count)
-  retval = 0;
-if ((extra_data->flags & PCRE_EXTRA_MARK) != 0)
-  *(extra_data->mark) = arguments.mark_ptr;
-
-return retval;
-}
-
-void
-PRIV(jit_free)(void *executable_funcs)
-{
-int i;
-executable_functions *functions = (executable_functions *)executable_funcs;
-for (i = 0; i < JIT_NUMBER_OF_COMPILE_MODES; i++)
-  {
-  if (functions->executable_funcs[i] != NULL)
-    sljit_free_code(functions->executable_funcs[i]);
-  free_read_only_data(functions->read_only_data_heads[i], NULL);
-  }
-SLJIT_FREE(functions, compiler->allocator_data);
-}
-
-int
-PRIV(jit_get_size)(void *executable_funcs)
-{
-int i;
-sljit_uw size = 0;
-sljit_uw *executable_sizes = ((executable_functions *)executable_funcs)->executable_sizes;
-for (i = 0; i < JIT_NUMBER_OF_COMPILE_MODES; i++)
-  size += executable_sizes[i];
-return (int)size;
-}
-
-const char*
-PRIV(jit_get_target)(void)
-{
-return sljit_get_platform_name();
-}
-
-#if defined COMPILE_PCRE8
-PCRE_EXP_DECL pcre_jit_stack *
-pcre_jit_stack_alloc(int startsize, int maxsize)
-#elif defined COMPILE_PCRE16
-PCRE_EXP_DECL pcre16_jit_stack *
-pcre16_jit_stack_alloc(int startsize, int maxsize)
-#elif defined COMPILE_PCRE32
-PCRE_EXP_DECL pcre32_jit_stack *
-pcre32_jit_stack_alloc(int startsize, int maxsize)
-#endif
-{
-if (startsize < 1 || maxsize < 1)
-  return NULL;
-if (startsize > maxsize)
-  startsize = maxsize;
-startsize = (startsize + STACK_GROWTH_RATE - 1) & ~(STACK_GROWTH_RATE - 1);
-maxsize = (maxsize + STACK_GROWTH_RATE - 1) & ~(STACK_GROWTH_RATE - 1);
-return (PUBL(jit_stack)*)sljit_allocate_stack(startsize, maxsize, NULL);
-}
-
-#if defined COMPILE_PCRE8
-PCRE_EXP_DECL void
-pcre_jit_stack_free(pcre_jit_stack *stack)
-#elif defined COMPILE_PCRE16
-PCRE_EXP_DECL void
-pcre16_jit_stack_free(pcre16_jit_stack *stack)
-#elif defined COMPILE_PCRE32
-PCRE_EXP_DECL void
-pcre32_jit_stack_free(pcre32_jit_stack *stack)
-#endif
-{
-sljit_free_stack((struct sljit_stack *)stack, NULL);
-}
-
-#if defined COMPILE_PCRE8
-PCRE_EXP_DECL void
-pcre_assign_jit_stack(pcre_extra *extra, pcre_jit_callback callback, void *userdata)
-#elif defined COMPILE_PCRE16
-PCRE_EXP_DECL void
-pcre16_assign_jit_stack(pcre16_extra *extra, pcre16_jit_callback callback, void *userdata)
-#elif defined COMPILE_PCRE32
-PCRE_EXP_DECL void
-pcre32_assign_jit_stack(pcre32_extra *extra, pcre32_jit_callback callback, void *userdata)
-#endif
-{
-executable_functions *functions;
-if (extra != NULL &&
-    (extra->flags & PCRE_EXTRA_EXECUTABLE_JIT) != 0 &&
-    extra->executable_jit != NULL)
-  {
-  functions = (executable_functions *)extra->executable_jit;
-  functions->callback = callback;
-  functions->userdata = userdata;
-  }
-}
-
-#if defined COMPILE_PCRE8
-PCRE_EXP_DECL void
-pcre_jit_free_unused_memory(void)
-#elif defined COMPILE_PCRE16
-PCRE_EXP_DECL void
-pcre16_jit_free_unused_memory(void)
-#elif defined COMPILE_PCRE32
-PCRE_EXP_DECL void
-pcre32_jit_free_unused_memory(void)
-#endif
-{
-sljit_free_unused_memory_exec();
-}
+(void)code;
+(void)options;
+return PCRE2_ERROR_JIT_BADOPTION;
 
 #else  /* SUPPORT_JIT */
 
-/* These are dummy functions to avoid linking errors when JIT support is not
-being compiled. */
+pcre2_real_code *re = (pcre2_real_code *)code;
+executable_functions *functions;
+int result;
 
-#if defined COMPILE_PCRE8
-PCRE_EXP_DECL pcre_jit_stack *
-pcre_jit_stack_alloc(int startsize, int maxsize)
-#elif defined COMPILE_PCRE16
-PCRE_EXP_DECL pcre16_jit_stack *
-pcre16_jit_stack_alloc(int startsize, int maxsize)
-#elif defined COMPILE_PCRE32
-PCRE_EXP_DECL pcre32_jit_stack *
-pcre32_jit_stack_alloc(int startsize, int maxsize)
-#endif
-{
-(void)startsize;
-(void)maxsize;
-return NULL;
+if (code == NULL)
+  return PCRE2_ERROR_NULL;
+
+if ((options & ~PUBLIC_JIT_COMPILE_OPTIONS) != 0)
+  return PCRE2_ERROR_JIT_BADOPTION;
+
+if ((re->flags & PCRE2_NOJIT) != 0) return 0;
+
+functions = (executable_functions *)re->executable_jit;
+
+if ((options & PCRE2_JIT_COMPLETE) != 0 && (functions == NULL
+    || functions->executable_funcs[0] == NULL)) {
+  result = jit_compile(code, PCRE2_JIT_COMPLETE);
+  if (result != 0)
+    return result;
+  }
+
+if ((options & PCRE2_JIT_PARTIAL_SOFT) != 0 && (functions == NULL
+    || functions->executable_funcs[1] == NULL)) {
+  result = jit_compile(code, PCRE2_JIT_PARTIAL_SOFT);
+  if (result != 0)
+    return result;
+  }
+
+if ((options & PCRE2_JIT_PARTIAL_HARD) != 0 && (functions == NULL
+    || functions->executable_funcs[2] == NULL)) {
+  result = jit_compile(code, PCRE2_JIT_PARTIAL_HARD);
+  if (result != 0)
+    return result;
+  }
+
+return 0;
+
+#endif  /* SUPPORT_JIT */
 }
 
-#if defined COMPILE_PCRE8
-PCRE_EXP_DECL void
-pcre_jit_stack_free(pcre_jit_stack *stack)
-#elif defined COMPILE_PCRE16
-PCRE_EXP_DECL void
-pcre16_jit_stack_free(pcre16_jit_stack *stack)
-#elif defined COMPILE_PCRE32
-PCRE_EXP_DECL void
-pcre32_jit_stack_free(pcre32_jit_stack *stack)
-#endif
-{
-(void)stack;
-}
+/* JIT compiler uses an all-in-one approach. This improves security,
+   since the code generator functions are not exported. */
 
-#if defined COMPILE_PCRE8
-PCRE_EXP_DECL void
-pcre_assign_jit_stack(pcre_extra *extra, pcre_jit_callback callback, void *userdata)
-#elif defined COMPILE_PCRE16
-PCRE_EXP_DECL void
-pcre16_assign_jit_stack(pcre16_extra *extra, pcre16_jit_callback callback, void *userdata)
-#elif defined COMPILE_PCRE32
-PCRE_EXP_DECL void
-pcre32_assign_jit_stack(pcre32_extra *extra, pcre32_jit_callback callback, void *userdata)
-#endif
-{
-(void)extra;
-(void)callback;
-(void)userdata;
-}
+#define INCLUDED_FROM_PCRE2_JIT_COMPILE
 
-#if defined COMPILE_PCRE8
-PCRE_EXP_DECL void
-pcre_jit_free_unused_memory(void)
-#elif defined COMPILE_PCRE16
-PCRE_EXP_DECL void
-pcre16_jit_free_unused_memory(void)
-#elif defined COMPILE_PCRE32
-PCRE_EXP_DECL void
-pcre32_jit_free_unused_memory(void)
-#endif
-{
-}
+#include "pcre2_jit_match.c"
+#include "pcre2_jit_misc.c"
 
-#endif
-
-/* End of pcre_jit_compile.c */
+/* End of pcre2_jit_compile.c */
diff --git a/dist2/src/pcre2_jit_match.c b/dist2/src/pcre2_jit_match.c
new file mode 100644
index 0000000..d804cfe
--- /dev/null
+++ b/dist2/src/pcre2_jit_match.c
@@ -0,0 +1,189 @@
+/*************************************************
+*      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
+     Original API code Copyright (c) 1997-2012 University of Cambridge
+         New API code Copyright (c) 2016 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 INCLUDED_FROM_PCRE2_JIT_COMPILE
+#error This file must be included from pcre2_jit_compile.c.
+#endif
+
+#ifdef SUPPORT_JIT
+
+static SLJIT_NOINLINE int jit_machine_stack_exec(jit_arguments *arguments, jit_function executable_func)
+{
+sljit_ub local_space[MACHINE_STACK_SIZE];
+struct sljit_stack local_stack;
+
+local_stack.top = (sljit_sw)&local_space;
+local_stack.base = local_stack.top;
+local_stack.limit = local_stack.base + MACHINE_STACK_SIZE;
+local_stack.max_limit = local_stack.limit;
+arguments->stack = &local_stack;
+return executable_func(arguments);
+}
+
+#endif
+
+
+/*************************************************
+*              Do a JIT pattern match            *
+*************************************************/
+
+/* This function runs a JIT pattern match.
+
+Arguments:
+  code            points to the compiled expression
+  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
+  match_data      points to a match_data block
+  mcontext        points to a match context
+  jit_stack       points to a JIT stack
+
+Returns:          > 0 => success; value is the number of ovector pairs filled
+                  = 0 => success, but ovector is not big enough
+                   -1 => failed to match (PCRE_ERROR_NOMATCH)
+                 < -1 => some kind of unexpected problem
+*/
+
+PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION
+pcre2_jit_match(const pcre2_code *code, PCRE2_SPTR subject, PCRE2_SIZE length,
+  PCRE2_SIZE start_offset, uint32_t options, pcre2_match_data *match_data,
+  pcre2_match_context *mcontext)
+{
+#ifndef SUPPORT_JIT
+
+(void)code;
+(void)subject;
+(void)length;
+(void)start_offset;
+(void)options;
+(void)match_data;
+(void)mcontext;
+return PCRE2_ERROR_JIT_BADOPTION;
+
+#else  /* SUPPORT_JIT */
+
+pcre2_real_code *re = (pcre2_real_code *)code;
+executable_functions *functions = (executable_functions *)re->executable_jit;
+pcre2_jit_stack *jit_stack;
+uint32_t oveccount = match_data->oveccount;
+uint32_t max_oveccount;
+union {
+   void *executable_func;
+   jit_function call_executable_func;
+} convert_executable_func;
+jit_arguments arguments;
+int rc;
+int index = 0;
+
+if ((options & PCRE2_PARTIAL_HARD) != 0)
+  index = 2;
+else if ((options & PCRE2_PARTIAL_SOFT) != 0)
+  index = 1;
+
+if (functions->executable_funcs[index] == NULL)
+  return PCRE2_ERROR_JIT_BADOPTION;
+
+/* Sanity checks should be handled by pcre_exec. */
+arguments.str = subject + start_offset;
+arguments.begin = subject;
+arguments.end = subject + length;
+arguments.match_data = match_data;
+arguments.startchar_ptr = subject;
+arguments.mark_ptr = NULL;
+arguments.options = options;
+
+if (mcontext != NULL)
+  {
+  arguments.callout = mcontext->callout;
+  arguments.callout_data = mcontext->callout_data;
+  arguments.offset_limit = mcontext->offset_limit;
+  arguments.limit_match = (mcontext->match_limit < re->limit_match)?
+    mcontext->match_limit : re->limit_match;
+  if (mcontext->jit_callback != NULL)
+    jit_stack = mcontext->jit_callback(mcontext->jit_callback_data);
+  else
+    jit_stack = (pcre2_jit_stack *)mcontext->jit_callback_data;
+  }
+else
+  {
+  arguments.callout = NULL;
+  arguments.callout_data = NULL;
+  arguments.offset_limit = PCRE2_UNSET;
+  arguments.limit_match = (MATCH_LIMIT < re->limit_match)?
+    MATCH_LIMIT : re->limit_match;
+  jit_stack = NULL;
+  }
+
+/* JIT only need two offsets for each ovector entry. Hence
+   the last 1/3 of the ovector will never be touched. */
+
+max_oveccount = functions->top_bracket;
+if (oveccount > max_oveccount)
+  oveccount = max_oveccount;
+arguments.oveccount = oveccount << 1;
+
+
+convert_executable_func.executable_func = functions->executable_funcs[index];
+if (jit_stack != NULL)
+  {
+  arguments.stack = (struct sljit_stack *)(jit_stack->stack);
+  rc = convert_executable_func.call_executable_func(&arguments);
+  }
+else
+  rc = jit_machine_stack_exec(&arguments, convert_executable_func.call_executable_func);
+
+if (rc > (int)oveccount)
+  rc = 0;
+match_data->code = re;
+match_data->subject = subject;
+match_data->rc = rc;
+match_data->startchar = arguments.startchar_ptr - subject;
+match_data->leftchar = 0;
+match_data->rightchar = 0;
+match_data->mark = arguments.mark_ptr;
+match_data->matchedby = PCRE2_MATCHEDBY_JIT;
+
+return match_data->rc;
+
+#endif  /* SUPPORT_JIT */
+}
+
+/* End of pcre2_jit_match.c */
diff --git a/dist2/src/pcre2_jit_misc.c b/dist2/src/pcre2_jit_misc.c
new file mode 100644
index 0000000..efdb055
--- /dev/null
+++ b/dist2/src/pcre2_jit_misc.c
@@ -0,0 +1,227 @@
+/*************************************************
+*      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
+     Original API code Copyright (c) 1997-2012 University of Cambridge
+         New API code Copyright (c) 2016 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 INCLUDED_FROM_PCRE2_JIT_COMPILE
+#error This file must be included from pcre2_jit_compile.c.
+#endif
+
+
+
+/*************************************************
+*           Free JIT read-only data              *
+*************************************************/
+
+void
+PRIV(jit_free_rodata)(void *current, void *allocator_data)
+{
+#ifndef SUPPORT_JIT
+(void)current;
+(void)allocator_data;
+#else  /* SUPPORT_JIT */
+void *next;
+
+SLJIT_UNUSED_ARG(allocator_data);
+
+while (current != NULL)
+  {
+  next = *(void**)current;
+  SLJIT_FREE(current, allocator_data);
+  current = next;
+  }
+
+#endif /* SUPPORT_JIT */
+}
+
+/*************************************************
+*           Free JIT compiled code               *
+*************************************************/
+
+void
+PRIV(jit_free)(void *executable_jit, pcre2_memctl *memctl)
+{
+#ifndef SUPPORT_JIT
+(void)executable_jit;
+(void)memctl;
+#else  /* SUPPORT_JIT */
+
+executable_functions *functions = (executable_functions *)executable_jit;
+void *allocator_data = memctl;
+int i;
+
+for (i = 0; i < JIT_NUMBER_OF_COMPILE_MODES; i++)
+  {
+  if (functions->executable_funcs[i] != NULL)
+    sljit_free_code(functions->executable_funcs[i]);
+  PRIV(jit_free_rodata)(functions->read_only_data_heads[i], allocator_data);
+  }
+
+SLJIT_FREE(functions, allocator_data);
+
+#endif /* SUPPORT_JIT */
+}
+
+
+/*************************************************
+*            Free unused JIT memory              *
+*************************************************/
+
+PCRE2_EXP_DEFN void PCRE2_CALL_CONVENTION
+pcre2_jit_free_unused_memory(pcre2_general_context *gcontext)
+{
+#ifndef SUPPORT_JIT
+(void)gcontext;     /* Suppress warning */
+#else  /* SUPPORT_JIT */
+SLJIT_UNUSED_ARG(gcontext);
+sljit_free_unused_memory_exec();
+#endif  /* SUPPORT_JIT */
+}
+
+
+
+/*************************************************
+*            Allocate a JIT stack                *
+*************************************************/
+
+PCRE2_EXP_DEFN pcre2_jit_stack * PCRE2_CALL_CONVENTION
+pcre2_jit_stack_create(size_t startsize, size_t maxsize,
+  pcre2_general_context *gcontext)
+{
+#ifndef SUPPORT_JIT
+
+(void)gcontext;
+(void)startsize;
+(void)maxsize;
+return NULL;
+
+#else  /* SUPPORT_JIT */
+
+pcre2_jit_stack *jit_stack;
+
+if (startsize < 1 || maxsize < 1)
+  return NULL;
+if (startsize > maxsize)
+  startsize = maxsize;
+startsize = (startsize + STACK_GROWTH_RATE - 1) & ~(STACK_GROWTH_RATE - 1);
+maxsize = (maxsize + STACK_GROWTH_RATE - 1) & ~(STACK_GROWTH_RATE - 1);
+
+jit_stack = PRIV(memctl_malloc)(sizeof(pcre2_real_jit_stack), (pcre2_memctl *)gcontext);
+if (jit_stack == NULL) return NULL;
+jit_stack->stack = sljit_allocate_stack(startsize, maxsize, &jit_stack->memctl);
+return jit_stack;
+
+#endif
+}
+
+
+/*************************************************
+*         Assign a JIT stack to a pattern        *
+*************************************************/
+
+PCRE2_EXP_DEFN void PCRE2_CALL_CONVENTION
+pcre2_jit_stack_assign(pcre2_match_context *mcontext, pcre2_jit_callback callback,
+  void *callback_data)
+{
+#ifndef SUPPORT_JIT
+(void)mcontext;
+(void)callback;
+(void)callback_data;
+#else  /* SUPPORT_JIT */
+
+if (mcontext == NULL) return;
+mcontext->jit_callback = callback;
+mcontext->jit_callback_data = callback_data;
+
+#endif  /* SUPPORT_JIT */
+}
+
+
+/*************************************************
+*               Free a JIT stack                 *
+*************************************************/
+
+PCRE2_EXP_DEFN void PCRE2_CALL_CONVENTION
+pcre2_jit_stack_free(pcre2_jit_stack *jit_stack)
+{
+#ifndef SUPPORT_JIT
+(void)jit_stack;
+#else  /* SUPPORT_JIT */
+if (jit_stack != NULL)
+  {
+  sljit_free_stack((struct sljit_stack *)(jit_stack->stack), &jit_stack->memctl);
+  jit_stack->memctl.free(jit_stack, jit_stack->memctl.memory_data);
+  }
+#endif  /* SUPPORT_JIT */
+}
+
+
+/*************************************************
+*               Get target CPU type              *
+*************************************************/
+
+const char*
+PRIV(jit_get_target)(void)
+{
+#ifndef SUPPORT_JIT
+return "JIT is not supported";
+#else  /* SUPPORT_JIT */
+return sljit_get_platform_name();
+#endif  /* SUPPORT_JIT */
+}
+
+
+/*************************************************
+*              Get size of JIT code              *
+*************************************************/
+
+size_t
+PRIV(jit_get_size)(void *executable_jit)
+{
+#ifndef SUPPORT_JIT
+(void)executable_jit;
+return 0;
+#else  /* SUPPORT_JIT */
+sljit_uw *executable_sizes = ((executable_functions *)executable_jit)->executable_sizes;
+SLJIT_COMPILE_ASSERT(JIT_NUMBER_OF_COMPILE_MODES == 3, number_of_compile_modes_changed);
+return executable_sizes[0] + executable_sizes[1] + executable_sizes[2];
+#endif
+}
+
+/* End of pcre2_jit_misc.c */
diff --git a/dist2/src/pcre2_jit_test.c b/dist2/src/pcre2_jit_test.c
new file mode 100644
index 0000000..78837cf
--- /dev/null
+++ b/dist2/src/pcre2_jit_test.c
@@ -0,0 +1,1735 @@
+/*************************************************
+*      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
+     Original API code Copyright (c) 1997-2012 University of Cambridge
+         New API code Copyright (c) 2016 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.
+-----------------------------------------------------------------------------
+*/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdio.h>
+#include <string.h>
+
+#define PCRE2_CODE_UNIT_WIDTH 0
+#include "pcre2.h"
+
+/*
+ Letter characters:
+   \xe6\x92\xad = 0x64ad = 25773 (kanji)
+ Non-letter characters:
+   \xc2\xa1 = 0xa1 =  (Inverted Exclamation Mark)
+   \xf3\xa9\xb7\x80 = 0xe9dc0 = 957888
+   \xed\xa0\x80 = 55296 = 0xd800 (Invalid UTF character)
+   \xed\xb0\x80 = 56320 = 0xdc00 (Invalid UTF character)
+ Newlines:
+   \xc2\x85 = 0x85 = 133 (NExt Line = NEL)
+   \xe2\x80\xa8 = 0x2028 = 8232 (Line Separator)
+ Othercase pairs:
+   \xc3\xa9 = 0xe9 = 233 (e')
+      \xc3\x89 = 0xc9 = 201 (E')
+   \xc3\xa1 = 0xe1 = 225 (a')
+      \xc3\x81 = 0xc1 = 193 (A')
+   \x53 = 0x53 = S
+     \x73 = 0x73 = s
+     \xc5\xbf = 0x17f = 383 (long S)
+   \xc8\xba = 0x23a = 570
+      \xe2\xb1\xa5 = 0x2c65 = 11365
+   \xe1\xbd\xb8 = 0x1f78 = 8056
+      \xe1\xbf\xb8 = 0x1ff8 = 8184
+   \xf0\x90\x90\x80 = 0x10400 = 66560
+      \xf0\x90\x90\xa8 = 0x10428 = 66600
+   \xc7\x84 = 0x1c4 = 452
+     \xc7\x85 = 0x1c5 = 453
+     \xc7\x86 = 0x1c6 = 454
+ Caseless sets:
+   ucp_Armenian - \x{531}-\x{556} -> \x{561}-\x{586}
+   ucp_Coptic - \x{2c80}-\x{2ce3} -> caseless: XOR 0x1
+   ucp_Latin - \x{ff21}-\x{ff3a} -> \x{ff41]-\x{ff5a}
+
+ Mark property:
+   \xcc\x8d = 0x30d = 781
+ Special:
+   \xc2\x80 = 0x80 = 128 (lowest 2 byte character)
+   \xdf\xbf = 0x7ff = 2047 (highest 2 byte character)
+   \xe0\xa0\x80 = 0x800 = 2048 (lowest 2 byte character)
+   \xef\xbf\xbf = 0xffff = 65535 (highest 3 byte character)
+   \xf0\x90\x80\x80 = 0x10000 = 65536 (lowest 4 byte character)
+   \xf4\x8f\xbf\xbf = 0x10ffff = 1114111 (highest allowed utf character)
+*/
+
+static int regression_tests(void);
+
+int main(void)
+{
+	int jit = 0;
+#if defined SUPPORT_PCRE2_8
+	pcre2_config_8(PCRE2_CONFIG_JIT, &jit);
+#elif defined SUPPORT_PCRE2_16
+	pcre2_config_16(PCRE2_CONFIG_JIT, &jit);
+#elif defined SUPPORT_PCRE2_32
+	pcre2_config_32(PCRE2_CONFIG_JIT, &jit);
+#endif
+	if (!jit) {
+		printf("JIT must be enabled to run pcre_jit_test\n");
+		return 1;
+	}
+	return regression_tests();
+}
+
+/* --------------------------------------------------------------------------------------- */
+
+#if !(defined SUPPORT_PCRE2_8) && !(defined SUPPORT_PCRE2_16) && !(defined SUPPORT_PCRE2_32)
+#error SUPPORT_PCRE2_8 or SUPPORT_PCRE2_16 or SUPPORT_PCRE2_32 must be defined
+#endif
+
+#define MU	(PCRE2_MULTILINE | PCRE2_UTF)
+#define MUP	(PCRE2_MULTILINE | PCRE2_UTF | PCRE2_UCP)
+#define CMU	(PCRE2_CASELESS | PCRE2_MULTILINE | PCRE2_UTF)
+#define CMUP	(PCRE2_CASELESS | PCRE2_MULTILINE | PCRE2_UTF | PCRE2_UCP)
+#define M	(PCRE2_MULTILINE)
+#define MP	(PCRE2_MULTILINE | PCRE2_UCP)
+#define U	(PCRE2_UTF)
+#define CM	(PCRE2_CASELESS | PCRE2_MULTILINE)
+
+#define BSR(x)	((x) << 16)
+#define A	PCRE2_NEWLINE_ANYCRLF
+
+#define GET_NEWLINE(x)	((x) & 0xffff)
+#define GET_BSR(x)	((x) >> 16)
+
+#define OFFSET_MASK	0x00ffff
+#define F_NO8		0x010000
+#define F_NO16		0x020000
+#define F_NO32		0x020000
+#define F_NOMATCH	0x040000
+#define F_DIFF		0x080000
+#define F_FORCECONV	0x100000
+#define F_PROPERTY	0x200000
+#define F_STUDY		0x400000
+
+struct regression_test_case {
+	int compile_options;
+	int newline;
+	int match_options;
+	int start_offset;
+	const char *pattern;
+	const char *input;
+};
+
+static struct regression_test_case regression_test_cases[] = {
+	/* Constant strings. */
+	{ MU, A, 0, 0, "AbC", "AbAbC" },
+	{ MU, A, 0, 0, "ACCEPT", "AACACCACCEACCEPACCEPTACCEPTT" },
+	{ CMU, A, 0, 0, "aA#\xc3\xa9\xc3\x81", "aA#Aa#\xc3\x89\xc3\xa1" },
+	{ M, A, 0, 0, "[^a]", "aAbB" },
+	{ CM, A, 0, 0, "[^m]", "mMnN" },
+	{ M, A, 0, 0, "a[^b][^#]", "abacd" },
+	{ CM, A, 0, 0, "A[^B][^E]", "abacd" },
+	{ CMU, A, 0, 0, "[^x][^#]", "XxBll" },
+	{ MU, A, 0, 0, "[^a]", "aaa\xc3\xa1#Ab" },
+	{ CMU, A, 0, 0, "[^A]", "aA\xe6\x92\xad" },
+	{ MU, A, 0, 0, "\\W(\\W)?\\w", "\r\n+bc" },
+	{ MU, A, 0, 0, "\\W(\\W)?\\w", "\n\r+bc" },
+	{ MU, A, 0, 0, "\\W(\\W)?\\w", "\r\r+bc" },
+	{ MU, A, 0, 0, "\\W(\\W)?\\w", "\n\n+bc" },
+	{ MU, A, 0, 0, "[axd]", "sAXd" },
+	{ CMU, A, 0, 0, "[axd]", "sAXd" },
+	{ CMU, A, 0, 0 | F_NOMATCH, "[^axd]", "DxA" },
+	{ MU, A, 0, 0, "[a-dA-C]", "\xe6\x92\xad\xc3\xa9.B" },
+	{ MU, A, 0, 0, "[^a-dA-C]", "\xe6\x92\xad\xc3\xa9" },
+	{ CMU, A, 0, 0, "[^\xc3\xa9]", "\xc3\xa9\xc3\x89." },
+	{ MU, A, 0, 0, "[^\xc3\xa9]", "\xc3\xa9\xc3\x89." },
+	{ MU, A, 0, 0, "[^a]", "\xc2\x80[]" },
+	{ CMU, A, 0, 0, "\xf0\x90\x90\xa7", "\xf0\x90\x91\x8f" },
+	{ CM, A, 0, 0, "1a2b3c4", "1a2B3c51A2B3C4" },
+	{ PCRE2_CASELESS, 0, 0, 0, "\xff#a", "\xff#\xff\xfe##\xff#A" },
+	{ PCRE2_CASELESS, 0, 0, 0, "\xfe", "\xff\xfc#\xfe\xfe" },
+	{ PCRE2_CASELESS, 0, 0, 0, "a1", "Aa1" },
+	{ M, A, 0, 0, "\\Ca", "cda" },
+	{ CM, A, 0, 0, "\\Ca", "CDA" },
+	{ M, A, 0, 0 | F_NOMATCH, "\\Cx", "cda" },
+	{ CM, A, 0, 0 | F_NOMATCH, "\\Cx", "CDA" },
+	{ CMUP, A, 0, 0, "\xf0\x90\x90\x80\xf0\x90\x90\xa8", "\xf0\x90\x90\xa8\xf0\x90\x90\x80" },
+	{ CMUP, A, 0, 0, "\xf0\x90\x90\x80{2}", "\xf0\x90\x90\x80#\xf0\x90\x90\xa8\xf0\x90\x90\x80" },
+	{ CMUP, A, 0, 0, "\xf0\x90\x90\xa8{2}", "\xf0\x90\x90\x80#\xf0\x90\x90\xa8\xf0\x90\x90\x80" },
+	{ CMUP, A, 0, 0, "\xe1\xbd\xb8\xe1\xbf\xb8", "\xe1\xbf\xb8\xe1\xbd\xb8" },
+	{ M, A, 0, 0, "[3-57-9]", "5" },
+
+	/* Assertions. */
+	{ MU, A, 0, 0, "\\b[^A]", "A_B#" },
+	{ M, A, 0, 0 | F_NOMATCH, "\\b\\W", "\n*" },
+	{ MU, A, 0, 0, "\\B[^,]\\b[^s]\\b", "#X" },
+	{ MP, A, 0, 0, "\\B", "_\xa1" },
+	{ MP, A, 0, 0 | F_PROPERTY, "\\b_\\b[,A]\\B", "_," },
+	{ MUP, A, 0, 0, "\\b", "\xe6\x92\xad!" },
+	{ MUP, A, 0, 0, "\\B", "_\xc2\xa1\xc3\xa1\xc2\x85" },
+	{ MUP, A, 0, 0, "\\b[^A]\\B[^c]\\b[^_]\\B", "_\xc3\xa1\xe2\x80\xa8" },
+	{ MUP, A, 0, 0, "\\b\\w+\\B", "\xc3\x89\xc2\xa1\xe6\x92\xad\xc3\x81\xc3\xa1" },
+	{ MU, A, 0, 0 | F_NOMATCH, "\\b.", "\xcd\xbe" },
+	{ CMUP, A, 0, 0, "\\By", "\xf0\x90\x90\xa8y" },
+	{ M, A, 0, 0 | F_NOMATCH, "\\R^", "\n" },
+	{ M, A, 0, 1 | F_NOMATCH, "^", "\n" },
+	{ 0, 0, 0, 0, "^ab", "ab" },
+	{ 0, 0, 0, 0 | F_NOMATCH, "^ab", "aab" },
+	{ M, PCRE2_NEWLINE_CRLF, 0, 0, "^a", "\r\raa\n\naa\r\naa" },
+	{ MU, A, 0, 0, "^-", "\xe2\x80\xa8--\xc2\x85-\r\n-" },
+	{ M, PCRE2_NEWLINE_ANY, 0, 0, "^-", "a--b--\x85--" },
+	{ MU, PCRE2_NEWLINE_ANY, 0, 0, "^-", "a--\xe2\x80\xa8--" },
+	{ MU, PCRE2_NEWLINE_ANY, 0, 0, "^-", "a--\xc2\x85--" },
+	{ 0, 0, 0, 0, "ab$", "ab" },
+	{ 0, 0, 0, 0 | F_NOMATCH, "ab$", "abab\n\n" },
+	{ PCRE2_DOLLAR_ENDONLY, 0, 0, 0 | F_NOMATCH, "ab$", "abab\r\n" },
+	{ M, PCRE2_NEWLINE_CRLF, 0, 0, "a$", "\r\raa\n\naa\r\naa" },
+	{ M, PCRE2_NEWLINE_ANY, 0, 0, "a$", "aaa" },
+	{ MU, PCRE2_NEWLINE_ANYCRLF, 0, 0, "#$", "#\xc2\x85###\r#" },
+	{ MU, PCRE2_NEWLINE_ANY, 0, 0, "#$", "#\xe2\x80\xa9" },
+	{ 0, PCRE2_NEWLINE_ANY, PCRE2_NOTBOL, 0 | F_NOMATCH, "^a", "aa\naa" },
+	{ M, PCRE2_NEWLINE_ANY, PCRE2_NOTBOL, 0, "^a", "aa\naa" },
+	{ 0, PCRE2_NEWLINE_ANY, PCRE2_NOTEOL, 0 | F_NOMATCH, "a$", "aa\naa" },
+	{ 0, PCRE2_NEWLINE_ANY, PCRE2_NOTEOL, 0 | F_NOMATCH, "a$", "aa\r\n" },
+	{ U | PCRE2_DOLLAR_ENDONLY, PCRE2_NEWLINE_ANY, 0, 0 | F_PROPERTY, "\\p{Any}{2,}$", "aa\r\n" },
+	{ M, PCRE2_NEWLINE_ANY, PCRE2_NOTEOL, 0, "a$", "aa\naa" },
+	{ 0, PCRE2_NEWLINE_CR, 0, 0, ".\\Z", "aaa" },
+	{ U, PCRE2_NEWLINE_CR, 0, 0, "a\\Z", "aaa\r" },
+	{ 0, PCRE2_NEWLINE_CR, 0, 0, ".\\Z", "aaa\n" },
+	{ 0, PCRE2_NEWLINE_CRLF, 0, 0, ".\\Z", "aaa\r" },
+	{ U, PCRE2_NEWLINE_CRLF, 0, 0, ".\\Z", "aaa\n" },
+	{ 0, PCRE2_NEWLINE_CRLF, 0, 0, ".\\Z", "aaa\r\n" },
+	{ U, PCRE2_NEWLINE_ANYCRLF, 0, 0, ".\\Z", "aaa" },
+	{ U, PCRE2_NEWLINE_ANYCRLF, 0, 0, ".\\Z", "aaa\r" },
+	{ U, PCRE2_NEWLINE_ANYCRLF, 0, 0, ".\\Z", "aaa\n" },
+	{ U, PCRE2_NEWLINE_ANYCRLF, 0, 0, ".\\Z", "aaa\r\n" },
+	{ U, PCRE2_NEWLINE_ANYCRLF, 0, 0, ".\\Z", "aaa\xe2\x80\xa8" },
+	{ U, PCRE2_NEWLINE_ANYCRLF, 0, 0, ".\\Z", "aaa" },
+	{ U, PCRE2_NEWLINE_ANYCRLF, 0, 0, ".\\Z", "aaa\r" },
+	{ U, PCRE2_NEWLINE_ANYCRLF, 0, 0, ".\\Z", "aaa\n" },
+	{ U, PCRE2_NEWLINE_ANYCRLF, 0, 0, ".\\Z", "aaa\r\n" },
+	{ U, PCRE2_NEWLINE_ANY, 0, 0, ".\\Z", "aaa\xc2\x85" },
+	{ U, PCRE2_NEWLINE_ANY, 0, 0, ".\\Z", "aaa\xe2\x80\xa8" },
+	{ M, A, 0, 0, "\\Aa", "aaa" },
+	{ M, A, 0, 1 | F_NOMATCH, "\\Aa", "aaa" },
+	{ M, A, 0, 1, "\\Ga", "aaa" },
+	{ M, A, 0, 1 | F_NOMATCH, "\\Ga", "aba" },
+	{ M, A, 0, 0, "a\\z", "aaa" },
+	{ M, A, 0, 0 | F_NOMATCH, "a\\z", "aab" },
+
+	/* Brackets and alternatives. */
+	{ MU, A, 0, 0, "(ab|bb|cd)", "bacde" },
+	{ MU, A, 0, 0, "(?:ab|a)(bc|c)", "ababc" },
+	{ MU, A, 0, 0, "((ab|(cc))|(bb)|(?:cd|efg))", "abac" },
+	{ CMU, A, 0, 0, "((aB|(Cc))|(bB)|(?:cd|EFg))", "AcCe" },
+	{ MU, A, 0, 0, "((ab|(cc))|(bb)|(?:cd|ebg))", "acebebg" },
+	{ MU, A, 0, 0, "(?:(a)|(?:b))(cc|(?:d|e))(a|b)k", "accabdbbccbk" },
+	{ MU, A, 0, 0, "\xc7\x82|\xc6\x82", "\xf1\x83\x82\x82\xc7\x82\xc7\x83" },
+	{ MU, A, 0, 0, "=\xc7\x82|#\xc6\x82", "\xf1\x83\x82\x82=\xc7\x82\xc7\x83" },
+	{ MU, A, 0, 0, "\xc7\x82\xc7\x83|\xc6\x82\xc6\x82", "\xf1\x83\x82\x82\xc7\x82\xc7\x83" },
+	{ MU, A, 0, 0, "\xc6\x82\xc6\x82|\xc7\x83\xc7\x83|\xc8\x84\xc8\x84", "\xf1\x83\x82\x82\xc8\x84\xc8\x84" },
+
+	/* Greedy and non-greedy ? operators. */
+	{ MU, A, 0, 0, "(?:a)?a", "laab" },
+	{ CMU, A, 0, 0, "(A)?A", "llaab" },
+	{ MU, A, 0, 0, "(a)?\?a", "aab" }, /* ?? is the prefix of trygraphs in GCC. */
+	{ MU, A, 0, 0, "(a)?a", "manm" },
+	{ CMU, A, 0, 0, "(a|b)?\?d((?:e)?)", "ABABdx" },
+	{ MU, A, 0, 0, "(a|b)?\?d((?:e)?)", "abcde" },
+	{ MU, A, 0, 0, "((?:ab)?\?g|b(?:g(nn|d)?\?)?)?\?(?:n)?m", "abgnbgnnbgdnmm" },
+
+	/* Greedy and non-greedy + operators */
+	{ MU, A, 0, 0, "(aa)+aa", "aaaaaaa" },
+	{ MU, A, 0, 0, "(aa)+?aa", "aaaaaaa" },
+	{ MU, A, 0, 0, "(?:aba|ab|a)+l", "ababamababal" },
+	{ MU, A, 0, 0, "(?:aba|ab|a)+?l", "ababamababal" },
+	{ MU, A, 0, 0, "(a(?:bc|cb|b|c)+?|ss)+e", "accssabccbcacbccbbXaccssabccbcacbccbbe" },
+	{ MU, A, 0, 0, "(a(?:bc|cb|b|c)+|ss)+?e", "accssabccbcacbccbbXaccssabccbcacbccbbe" },
+	{ MU, A, 0, 0, "(?:(b(c)+?)+)?\?(?:(bc)+|(cb)+)+(?:m)+", "bccbcccbcbccbcbPbccbcccbcbccbcbmmn" },
+
+	/* Greedy and non-greedy * operators */
+	{ CMU, A, 0, 0, "(?:AA)*AB", "aaaaaaamaaaaaaab" },
+	{ MU, A, 0, 0, "(?:aa)*?ab", "aaaaaaamaaaaaaab" },
+	{ MU, A, 0, 0, "(aa|ab)*ab", "aaabaaab" },
+	{ CMU, A, 0, 0, "(aa|Ab)*?aB", "aaabaaab" },
+	{ MU, A, 0, 0, "(a|b)*(?:a)*(?:b)*m", "abbbaaababanabbbaaababamm" },
+	{ MU, A, 0, 0, "(a|b)*?(?:a)*?(?:b)*?m", "abbbaaababanabbbaaababamm" },
+	{ M, A, 0, 0, "a(a(\\1*)a|(b)b+){0}a", "aa" },
+	{ M, A, 0, 0, "((?:a|)*){0}a", "a" },
+
+	/* Combining ? + * operators */
+	{ MU, A, 0, 0, "((bm)+)?\?(?:a)*(bm)+n|((am)+?)?(?:a)+(am)*n", "bmbmabmamaaamambmaman" },
+	{ MU, A, 0, 0, "(((ab)?cd)*ef)+g", "abcdcdefcdefefmabcdcdefcdefefgg" },
+	{ MU, A, 0, 0, "(((ab)?\?cd)*?ef)+?g", "abcdcdefcdefefmabcdcdefcdefefgg" },
+	{ MU, A, 0, 0, "(?:(ab)?c|(?:ab)+?d)*g", "ababcdccababddg" },
+	{ MU, A, 0, 0, "(?:(?:ab)?\?c|(ab)+d)*?g", "ababcdccababddg" },
+
+	/* Single character iterators. */
+	{ MU, A, 0, 0, "(a+aab)+aaaab", "aaaabcaaaabaabcaabcaaabaaaab" },
+	{ MU, A, 0, 0, "(a*a*aab)+x", "aaaaabaabaaabmaabx" },
+	{ MU, A, 0, 0, "(a*?(b|ab)a*?)+x", "aaaabcxbbaabaacbaaabaabax" },
+	{ MU, A, 0, 0, "(a+(ab|ad)a+)+x", "aaabaaaadaabaaabaaaadaaax" },
+	{ MU, A, 0, 0, "(a?(a)a?)+(aaa)", "abaaabaaaaaaaa" },
+	{ MU, A, 0, 0, "(a?\?(a)a?\?)+(b)", "aaaacaaacaacacbaaab" },
+	{ MU, A, 0, 0, "(a{0,4}(b))+d", "aaaaaabaabcaaaaabaaaaabd" },
+	{ MU, A, 0, 0, "(a{0,4}?[^b])+d+(a{0,4}[^b])d+", "aaaaadaaaacaadddaaddd" },
+	{ MU, A, 0, 0, "(ba{2})+c", "baabaaabacbaabaac" },
+	{ MU, A, 0, 0, "(a*+bc++)+", "aaabbcaaabcccab" },
+	{ MU, A, 0, 0, "(a?+[^b])+", "babaacacb" },
+	{ MU, A, 0, 0, "(a{0,3}+b)(a{0,3}+b)(a{0,3}+)[^c]", "abaabaaacbaabaaaac" },
+	{ CMU, A, 0, 0, "([a-c]+[d-f]+?)+?g", "aBdacdehAbDaFgA" },
+	{ CMU, A, 0, 0, "[c-f]+k", "DemmFke" },
+	{ MU, A, 0, 0, "([DGH]{0,4}M)+", "GGDGHDGMMHMDHHGHM" },
+	{ MU, A, 0, 0, "([a-c]{4,}s)+", "abasabbasbbaabsbba" },
+	{ CMU, A, 0, 0, "[ace]{3,7}", "AcbDAcEEcEd" },
+	{ CMU, A, 0, 0, "[ace]{3,7}?", "AcbDAcEEcEd" },
+	{ CMU, A, 0, 0, "[ace]{3,}", "AcbDAcEEcEd" },
+	{ CMU, A, 0, 0, "[ace]{3,}?", "AcbDAcEEcEd" },
+	{ MU, A, 0, 0, "[ckl]{2,}?g", "cdkkmlglglkcg" },
+	{ CMU, A, 0, 0, "[ace]{5}?", "AcCebDAcEEcEd" },
+	{ MU, A, 0, 0, "([AbC]{3,5}?d)+", "BACaAbbAEAACCbdCCbdCCAAbb" },
+	{ MU, A, 0, 0, "([^ab]{0,}s){2}", "abaabcdsABamsDDs" },
+	{ MU, A, 0, 0, "\\b\\w+\\B", "x,a_cd" },
+	{ MUP, A, 0, 0, "\\b[^\xc2\xa1]+\\B", "\xc3\x89\xc2\xa1\xe6\x92\xad\xc3\x81\xc3\xa1" },
+	{ CMU, A, 0, 0, "[^b]+(a*)([^c]?d{3})", "aaaaddd" },
+	{ CMUP, A, 0, 0, "\xe1\xbd\xb8{2}", "\xe1\xbf\xb8#\xe1\xbf\xb8\xe1\xbd\xb8" },
+	{ CMU, A, 0, 0, "[^\xf0\x90\x90\x80]{2,4}@", "\xf0\x90\x90\xa8\xf0\x90\x90\x80###\xf0\x90\x90\x80@@@" },
+	{ CMU, A, 0, 0, "[^\xe1\xbd\xb8][^\xc3\xa9]", "\xe1\xbd\xb8\xe1\xbf\xb8\xc3\xa9\xc3\x89#" },
+	{ MU, A, 0, 0, "[^\xe1\xbd\xb8][^\xc3\xa9]", "\xe1\xbd\xb8\xe1\xbf\xb8\xc3\xa9\xc3\x89#" },
+	{ MU, A, 0, 0, "[^\xe1\xbd\xb8]{3,}?", "##\xe1\xbd\xb8#\xe1\xbd\xb8#\xc3\x89#\xe1\xbd\xb8" },
+	{ MU, A, 0, 0, "\\d+123", "987654321,01234" },
+	{ MU, A, 0, 0, "abcd*|\\w+xy", "aaaaa,abxyz" },
+	{ MU, A, 0, 0, "(?:abc|((?:amc|\\b\\w*xy)))", "aaaaa,abxyz" },
+	{ MU, A, 0, 0, "a(?R)|([a-z]++)#", ".abcd.abcd#."},
+	{ MU, A, 0, 0, "a(?R)|([a-z]++)#", ".abcd.mbcd#."},
+	{ MU, A, 0, 0, ".[ab]*.", "xx" },
+	{ MU, A, 0, 0, ".[ab]*a", "xxa" },
+	{ MU, A, 0, 0, ".[ab]?.", "xx" },
+
+	/* Bracket repeats with limit. */
+	{ MU, A, 0, 0, "(?:(ab){2}){5}M", "abababababababababababM" },
+	{ MU, A, 0, 0, "(?:ab|abab){1,5}M", "abababababababababababM" },
+	{ MU, A, 0, 0, "(?>ab|abab){1,5}M", "abababababababababababM" },
+	{ MU, A, 0, 0, "(?:ab|abab){1,5}?M", "abababababababababababM" },
+	{ MU, A, 0, 0, "(?>ab|abab){1,5}?M", "abababababababababababM" },
+	{ MU, A, 0, 0, "(?:(ab){1,4}?){1,3}?M", "abababababababababababababM" },
+	{ MU, A, 0, 0, "(?:(ab){1,4}){1,3}abababababababababababM", "ababababababababababababM" },
+	{ MU, A, 0, 0 | F_NOMATCH, "(?:(ab){1,4}){1,3}abababababababababababM", "abababababababababababM" },
+	{ MU, A, 0, 0, "(ab){4,6}?M", "abababababababM" },
+
+	/* Basic character sets. */
+	{ MU, A, 0, 0, "(?:\\s)+(?:\\S)+", "ab \t\xc3\xa9\xe6\x92\xad " },
+	{ MU, A, 0, 0, "(\\w)*(k)(\\W)?\?", "abcdef abck11" },
+	{ MU, A, 0, 0, "\\((\\d)+\\)\\D", "a() (83 (8)2 (9)ab" },
+	{ MU, A, 0, 0, "\\w(\\s|(?:\\d)*,)+\\w\\wb", "a 5, 4,, bb 5, 4,, aab" },
+	{ MU, A, 0, 0, "(\\v+)(\\V+)", "\x0e\xc2\x85\xe2\x80\xa8\x0b\x09\xe2\x80\xa9" },
+	{ MU, A, 0, 0, "(\\h+)(\\H+)", "\xe2\x80\xa8\xe2\x80\x80\x20\xe2\x80\x8a\xe2\x81\x9f\xe3\x80\x80\x09\x20\xc2\xa0\x0a" },
+	{ MU, A, 0, 0, "x[bcef]+", "xaxdxecbfg" },
+	{ MU, A, 0, 0, "x[bcdghij]+", "xaxexfxdgbjk" },
+	{ MU, A, 0, 0, "x[^befg]+", "xbxexacdhg" },
+	{ MU, A, 0, 0, "x[^bcdl]+", "xlxbxaekmd" },
+	{ MU, A, 0, 0, "x[^bcdghi]+", "xbxdxgxaefji" },
+	{ MU, A, 0, 0, "x[B-Fb-f]+", "xaxAxgxbfBFG" },
+	{ CMU, A, 0, 0, "\\x{e9}+", "#\xf0\x90\x90\xa8\xc3\xa8\xc3\xa9\xc3\x89\xc3\x88" },
+	{ CMU, A, 0, 0, "[^\\x{e9}]+", "\xc3\xa9#\xf0\x90\x90\xa8\xc3\xa8\xc3\x88\xc3\x89" },
+	{ MU, A, 0, 0, "[\\x02\\x7e]+", "\xc3\x81\xe1\xbf\xb8\xf0\x90\x90\xa8\x01\x02\x7e\x7f" },
+	{ MU, A, 0, 0, "[^\\x02\\x7e]+", "\x02\xc3\x81\xe1\xbf\xb8\xf0\x90\x90\xa8\x01\x7f\x7e" },
+	{ MU, A, 0, 0, "[\\x{81}-\\x{7fe}]+", "#\xe1\xbf\xb8\xf0\x90\x90\xa8\xc2\x80\xc2\x81\xdf\xbe\xdf\xbf" },
+	{ MU, A, 0, 0, "[^\\x{81}-\\x{7fe}]+", "\xc2\x81#\xe1\xbf\xb8\xf0\x90\x90\xa8\xc2\x80\xdf\xbf\xdf\xbe" },
+	{ MU, A, 0, 0, "[\\x{801}-\\x{fffe}]+", "#\xc3\xa9\xf0\x90\x90\x80\xe0\xa0\x80\xe0\xa0\x81\xef\xbf\xbe\xef\xbf\xbf" },
+	{ MU, A, 0, 0, "[^\\x{801}-\\x{fffe}]+", "\xe0\xa0\x81#\xc3\xa9\xf0\x90\x90\x80\xe0\xa0\x80\xef\xbf\xbf\xef\xbf\xbe" },
+	{ MU, A, 0, 0, "[\\x{10001}-\\x{10fffe}]+", "#\xc3\xa9\xe2\xb1\xa5\xf0\x90\x80\x80\xf0\x90\x80\x81\xf4\x8f\xbf\xbe\xf4\x8f\xbf\xbf" },
+	{ MU, A, 0, 0, "[^\\x{10001}-\\x{10fffe}]+", "\xf0\x90\x80\x81#\xc3\xa9\xe2\xb1\xa5\xf0\x90\x80\x80\xf4\x8f\xbf\xbf\xf4\x8f\xbf\xbe" },
+
+	/* Unicode properties. */
+	{ MUP, A, 0, 0, "[1-5\xc3\xa9\\w]", "\xc3\xa1_" },
+	{ MUP, A, 0, 0 | F_PROPERTY, "[\xc3\x81\\p{Ll}]", "A_\xc3\x89\xc3\xa1" },
+	{ MUP, A, 0, 0, "[\\Wd-h_x-z]+", "a\xc2\xa1#_yhzdxi" },
+	{ MUP, A, 0, 0 | F_NOMATCH | F_PROPERTY, "[\\P{Any}]", "abc" },
+	{ MUP, A, 0, 0 | F_NOMATCH | F_PROPERTY, "[^\\p{Any}]", "abc" },
+	{ MUP, A, 0, 0 | F_NOMATCH | F_PROPERTY, "[\\P{Any}\xc3\xa1-\xc3\xa8]", "abc" },
+	{ MUP, A, 0, 0 | F_NOMATCH | F_PROPERTY, "[^\\p{Any}\xc3\xa1-\xc3\xa8]", "abc" },
+	{ MUP, A, 0, 0 | F_NOMATCH | F_PROPERTY, "[\xc3\xa1-\xc3\xa8\\P{Any}]", "abc" },
+	{ MUP, A, 0, 0 | F_NOMATCH | F_PROPERTY, "[^\xc3\xa1-\xc3\xa8\\p{Any}]", "abc" },
+	{ MUP, A, 0, 0 | F_PROPERTY, "[\xc3\xa1-\xc3\xa8\\p{Any}]", "abc" },
+	{ MUP, A, 0, 0 | F_PROPERTY, "[^\xc3\xa1-\xc3\xa8\\P{Any}]", "abc" },
+	{ MUP, A, 0, 0, "[b-\xc3\xa9\\s]", "a\xc\xe6\x92\xad" },
+	{ CMUP, A, 0, 0, "[\xc2\x85-\xc2\x89\xc3\x89]", "\xc2\x84\xc3\xa9" },
+	{ MUP, A, 0, 0, "[^b-d^&\\s]{3,}", "db^ !a\xe2\x80\xa8_ae" },
+	{ MUP, A, 0, 0 | F_PROPERTY, "[^\\S\\P{Any}][\\sN]{1,3}[\\P{N}]{4}", "\xe2\x80\xaa\xa N\x9\xc3\xa9_0" },
+	{ MU, A, 0, 0 | F_PROPERTY, "[^\\P{L}\x9!D-F\xa]{2,3}", "\x9,.DF\xa.CG\xc3\x81" },
+	{ CMUP, A, 0, 0, "[\xc3\xa1-\xc3\xa9_\xe2\x80\xa0-\xe2\x80\xaf]{1,5}[^\xe2\x80\xa0-\xe2\x80\xaf]", "\xc2\xa1\xc3\x89\xc3\x89\xe2\x80\xaf_\xe2\x80\xa0" },
+	{ MUP, A, 0, 0 | F_PROPERTY, "[\xc3\xa2-\xc3\xa6\xc3\x81-\xc3\x84\xe2\x80\xa8-\xe2\x80\xa9\xe6\x92\xad\\p{Zs}]{2,}", "\xe2\x80\xa7\xe2\x80\xa9\xe6\x92\xad \xe6\x92\xae" },
+	{ MUP, A, 0, 0 | F_PROPERTY, "[\\P{L&}]{2}[^\xc2\x85-\xc2\x89\\p{Ll}\\p{Lu}]{2}", "\xc3\xa9\xe6\x92\xad.a\xe6\x92\xad|\xc2\x8a#" },
+	{ PCRE2_UCP, 0, 0, 0 | F_PROPERTY, "[a-b\\s]{2,5}[^a]", "AB  baaa" },
+
+	/* Possible empty brackets. */
+	{ MU, A, 0, 0, "(?:|ab||bc|a)+d", "abcxabcabd" },
+	{ MU, A, 0, 0, "(|ab||bc|a)+d", "abcxabcabd" },
+	{ MU, A, 0, 0, "(?:|ab||bc|a)*d", "abcxabcabd" },
+	{ MU, A, 0, 0, "(|ab||bc|a)*d", "abcxabcabd" },
+	{ MU, A, 0, 0, "(?:|ab||bc|a)+?d", "abcxabcabd" },
+	{ MU, A, 0, 0, "(|ab||bc|a)+?d", "abcxabcabd" },
+	{ MU, A, 0, 0, "(?:|ab||bc|a)*?d", "abcxabcabd" },
+	{ MU, A, 0, 0, "(|ab||bc|a)*?d", "abcxabcabd" },
+	{ MU, A, 0, 0, "(((a)*?|(?:ba)+)+?|(?:|c|ca)*)*m", "abaacaccabacabalabaacaccabacabamm" },
+	{ MU, A, 0, 0, "(?:((?:a)*|(ba)+?)+|(|c|ca)*?)*?m", "abaacaccabacabalabaacaccabacabamm" },
+
+	/* Start offset. */
+	{ MU, A, 0, 3, "(\\d|(?:\\w)*\\w)+", "0ac01Hb" },
+	{ MU, A, 0, 4 | F_NOMATCH, "(\\w\\W\\w)+", "ab#d" },
+	{ MU, A, 0, 2 | F_NOMATCH, "(\\w\\W\\w)+", "ab#d" },
+	{ MU, A, 0, 1, "(\\w\\W\\w)+", "ab#d" },
+
+	/* Newline. */
+	{ M, PCRE2_NEWLINE_CRLF, 0, 0, "\\W{0,2}[^#]{3}", "\r\n#....." },
+	{ M, PCRE2_NEWLINE_CR, 0, 0, "\\W{0,2}[^#]{3}", "\r\n#....." },
+	{ M, PCRE2_NEWLINE_CRLF, 0, 0, "\\W{1,3}[^#]", "\r\n##...." },
+	{ MU, A, PCRE2_NO_UTF_CHECK, 1, "^.a", "\n\x80\nxa" },
+	{ MU, A, 0, 1, "^", "\r\n" },
+	{ M, PCRE2_NEWLINE_CRLF, 0, 1 | F_NOMATCH, "^", "\r\n" },
+	{ M, PCRE2_NEWLINE_CRLF, 0, 1, "^", "\r\na" },
+
+	/* Any character except newline or any newline. */
+	{ 0, PCRE2_NEWLINE_CRLF, 0, 0, ".", "\r" },
+	{ U, PCRE2_NEWLINE_CRLF, 0, 0, ".(.).", "a\xc3\xa1\r\n\n\r\r" },
+	{ 0, PCRE2_NEWLINE_ANYCRLF, 0, 0, ".(.)", "a\rb\nc\r\n\xc2\x85\xe2\x80\xa8" },
+	{ U, PCRE2_NEWLINE_ANYCRLF, 0, 0, ".(.)", "a\rb\nc\r\n\xc2\x85\xe2\x80\xa8" },
+	{ U, PCRE2_NEWLINE_ANY, 0, 0, "(.).", "a\rb\nc\r\n\xc2\x85\xe2\x80\xa9$de" },
+	{ U, PCRE2_NEWLINE_ANYCRLF, 0, 0 | F_NOMATCH, ".(.).", "\xe2\x80\xa8\nb\r" },
+	{ 0, PCRE2_NEWLINE_ANY, 0, 0, "(.)(.)", "#\x85#\r#\n#\r\n#\x84" },
+	{ U, PCRE2_NEWLINE_ANY, 0, 0, "(.+)#", "#\rMn\xc2\x85#\n###" },
+	{ 0, BSR(PCRE2_BSR_ANYCRLF), 0, 0, "\\R", "\r" },
+	{ 0, BSR(PCRE2_BSR_ANYCRLF), 0, 0, "\\R", "\x85#\r\n#" },
+	{ U, BSR(PCRE2_BSR_UNICODE), 0, 0, "\\R", "ab\xe2\x80\xa8#c" },
+	{ U, BSR(PCRE2_BSR_UNICODE), 0, 0, "\\R", "ab\r\nc" },
+	{ U, PCRE2_NEWLINE_CRLF | BSR(PCRE2_BSR_UNICODE), 0, 0, "(\\R.)+", "\xc2\x85\r\n#\xe2\x80\xa8\n\r\n\r" },
+	{ MU, A, 0, 0 | F_NOMATCH, "\\R+", "ab" },
+	{ MU, A, 0, 0, "\\R+", "ab\r\n\r" },
+	{ MU, A, 0, 0, "\\R*", "ab\r\n\r" },
+	{ MU, A, 0, 0, "\\R*", "\r\n\r" },
+	{ MU, A, 0, 0, "\\R{2,4}", "\r\nab\r\r" },
+	{ MU, A, 0, 0, "\\R{2,4}", "\r\nab\n\n\n\r\r\r" },
+	{ MU, A, 0, 0, "\\R{2,}", "\r\nab\n\n\n\r\r\r" },
+	{ MU, A, 0, 0, "\\R{0,3}", "\r\n\r\n\r\n\r\n\r\n" },
+	{ MU, A, 0, 0 | F_NOMATCH, "\\R+\\R\\R", "\r\n\r\n" },
+	{ MU, A, 0, 0, "\\R+\\R\\R", "\r\r\r" },
+	{ MU, A, 0, 0, "\\R*\\R\\R", "\n\r" },
+	{ MU, A, 0, 0 | F_NOMATCH, "\\R{2,4}\\R\\R", "\r\r\r" },
+	{ MU, A, 0, 0, "\\R{2,4}\\R\\R", "\r\r\r\r" },
+
+	/* Atomic groups (no fallback from "next" direction). */
+	{ MU, A, 0, 0 | F_NOMATCH, "(?>ab)ab", "bab" },
+	{ MU, A, 0, 0 | F_NOMATCH, "(?>(ab))ab", "bab" },
+	{ MU, A, 0, 0, "(?>ab)+abc(?>de)*def(?>gh)?ghe(?>ij)+?k(?>lm)*?n(?>op)?\?op",
+			"bababcdedefgheijijklmlmnop" },
+	{ MU, A, 0, 0, "(?>a(b)+a|(ab)?\?(b))an", "abban" },
+	{ MU, A, 0, 0, "(?>ab+a|(?:ab)?\?b)an", "abban" },
+	{ MU, A, 0, 0, "((?>ab|ad|)*?)(?>|c)*abad", "abababcababad" },
+	{ MU, A, 0, 0, "(?>(aa|b|)*+(?>(##)|###)*d|(aa)(?>(baa)?)m)", "aabaa#####da" },
+	{ MU, A, 0, 0, "((?>a|)+?)b", "aaacaaab" },
+	{ MU, A, 0, 0, "(?>x|)*$", "aaa" },
+	{ MU, A, 0, 0, "(?>(x)|)*$", "aaa" },
+	{ MU, A, 0, 0, "(?>x|())*$", "aaa" },
+	{ MU, A, 0, 0, "((?>[cxy]a|[a-d])*?)b", "aaa+ aaab" },
+	{ MU, A, 0, 0, "((?>[cxy](a)|[a-d])*?)b", "aaa+ aaab" },
+	{ MU, A, 0, 0, "(?>((?>(a+))))bab|(?>((?>(a+))))bb", "aaaabaaabaabab" },
+	{ MU, A, 0, 0, "(?>(?>a+))bab|(?>(?>a+))bb", "aaaabaaabaabab" },
+	{ MU, A, 0, 0, "(?>(a)c|(?>(c)|(a))a)b*?bab", "aaaabaaabaabab" },
+	{ MU, A, 0, 0, "(?>ac|(?>c|a)a)b*?bab", "aaaabaaabaabab" },
+	{ MU, A, 0, 0, "(?>(b)b|(a))*b(?>(c)|d)?x", "ababcaaabdbx" },
+	{ MU, A, 0, 0, "(?>bb|a)*b(?>c|d)?x", "ababcaaabdbx" },
+	{ MU, A, 0, 0, "(?>(bb)|a)*b(?>c|(d))?x", "ababcaaabdbx" },
+	{ MU, A, 0, 0, "(?>(a))*?(?>(a))+?(?>(a))??x", "aaaaaacccaaaaabax" },
+	{ MU, A, 0, 0, "(?>a)*?(?>a)+?(?>a)??x", "aaaaaacccaaaaabax" },
+	{ MU, A, 0, 0, "(?>(a)|)*?(?>(a)|)+?(?>(a)|)??x", "aaaaaacccaaaaabax" },
+	{ MU, A, 0, 0, "(?>a|)*?(?>a|)+?(?>a|)??x", "aaaaaacccaaaaabax" },
+	{ MU, A, 0, 0, "(?>a(?>(a{0,2}))*?b|aac)+b", "aaaaaaacaaaabaaaaacaaaabaacaaabb" },
+	{ CM, A, 0, 0, "(?>((?>a{32}|b+|(a*))?(?>c+|d*)?\?)+e)+?f", "aaccebbdde bbdaaaccebbdee bbdaaaccebbdeef" },
+	{ MU, A, 0, 0, "(?>(?:(?>aa|a||x)+?b|(?>aa|a||(x))+?c)?(?>[ad]{0,2})*?d)+d", "aaacdbaabdcabdbaaacd aacaabdbdcdcaaaadaabcbaadd" },
+	{ MU, A, 0, 0, "(?>(?:(?>aa|a||(x))+?b|(?>aa|a||x)+?c)?(?>[ad]{0,2})*?d)+d", "aaacdbaabdcabdbaaacd aacaabdbdcdcaaaadaabcbaadd" },
+	{ MU, A, 0, 0 | F_PROPERTY, "\\X", "\xcc\x8d\xcc\x8d" },
+	{ MU, A, 0, 0 | F_PROPERTY, "\\X", "\xcc\x8d\xcc\x8d#\xcc\x8d\xcc\x8d" },
+	{ MU, A, 0, 0 | F_PROPERTY, "\\X+..", "\xcc\x8d#\xcc\x8d#\xcc\x8d\xcc\x8d" },
+	{ MU, A, 0, 0 | F_PROPERTY, "\\X{2,4}", "abcdef" },
+	{ MU, A, 0, 0 | F_PROPERTY, "\\X{2,4}?", "abcdef" },
+	{ MU, A, 0, 0 | F_NOMATCH | F_PROPERTY, "\\X{2,4}..", "#\xcc\x8d##" },
+	{ MU, A, 0, 0 | F_PROPERTY, "\\X{2,4}..", "#\xcc\x8d#\xcc\x8d##" },
+	{ MU, A, 0, 0, "(c(ab)?+ab)+", "cabcababcab" },
+	{ MU, A, 0, 0, "(?>(a+)b)+aabab", "aaaabaaabaabab" },
+
+	/* Possessive quantifiers. */
+	{ MU, A, 0, 0, "(?:a|b)++m", "mababbaaxababbaam" },
+	{ MU, A, 0, 0, "(?:a|b)*+m", "mababbaaxababbaam" },
+	{ MU, A, 0, 0, "(?:a|b)*+m", "ababbaaxababbaam" },
+	{ MU, A, 0, 0, "(a|b)++m", "mababbaaxababbaam" },
+	{ MU, A, 0, 0, "(a|b)*+m", "mababbaaxababbaam" },
+	{ MU, A, 0, 0, "(a|b)*+m", "ababbaaxababbaam" },
+	{ MU, A, 0, 0, "(a|b(*ACCEPT))++m", "maaxab" },
+	{ MU, A, 0, 0, "(?:b*)++m", "bxbbxbbbxm" },
+	{ MU, A, 0, 0, "(?:b*)++m", "bxbbxbbbxbbm" },
+	{ MU, A, 0, 0, "(?:b*)*+m", "bxbbxbbbxm" },
+	{ MU, A, 0, 0, "(?:b*)*+m", "bxbbxbbbxbbm" },
+	{ MU, A, 0, 0, "(b*)++m", "bxbbxbbbxm" },
+	{ MU, A, 0, 0, "(b*)++m", "bxbbxbbbxbbm" },
+	{ MU, A, 0, 0, "(b*)*+m", "bxbbxbbbxm" },
+	{ MU, A, 0, 0, "(b*)*+m", "bxbbxbbbxbbm" },
+	{ MU, A, 0, 0, "(?:a|(b))++m", "mababbaaxababbaam" },
+	{ MU, A, 0, 0, "(?:(a)|b)*+m", "mababbaaxababbaam" },
+	{ MU, A, 0, 0, "(?:(a)|(b))*+m", "ababbaaxababbaam" },
+	{ MU, A, 0, 0, "(a|(b))++m", "mababbaaxababbaam" },
+	{ MU, A, 0, 0, "((a)|b)*+m", "mababbaaxababbaam" },
+	{ MU, A, 0, 0, "((a)|(b))*+m", "ababbaaxababbaam" },
+	{ MU, A, 0, 0, "(a|(b)(*ACCEPT))++m", "maaxab" },
+	{ MU, A, 0, 0, "(?:(b*))++m", "bxbbxbbbxm" },
+	{ MU, A, 0, 0, "(?:(b*))++m", "bxbbxbbbxbbm" },
+	{ MU, A, 0, 0, "(?:(b*))*+m", "bxbbxbbbxm" },
+	{ MU, A, 0, 0, "(?:(b*))*+m", "bxbbxbbbxbbm" },
+	{ MU, A, 0, 0, "((b*))++m", "bxbbxbbbxm" },
+	{ MU, A, 0, 0, "((b*))++m", "bxbbxbbbxbbm" },
+	{ MU, A, 0, 0, "((b*))*+m", "bxbbxbbbxm" },
+	{ MU, A, 0, 0, "((b*))*+m", "bxbbxbbbxbbm" },
+	{ MU, A, 0, 0 | F_NOMATCH, "(?>(b{2,4}))(?:(?:(aa|c))++m|(?:(aa|c))+n)", "bbaacaaccaaaacxbbbmbn" },
+	{ MU, A, 0, 0, "((?:b)++a)+(cd)*+m", "bbababbacdcdnbbababbacdcdm" },
+	{ MU, A, 0, 0, "((?:(b))++a)+((c)d)*+m", "bbababbacdcdnbbababbacdcdm" },
+	{ MU, A, 0, 0, "(?:(?:(?:ab)*+k)++(?:n(?:cd)++)*+)*+m", "ababkkXababkkabkncXababkkabkncdcdncdXababkkabkncdcdncdkkabkncdXababkkabkncdcdncdkkabkncdm" },
+	{ MU, A, 0, 0, "(?:((ab)*+(k))++(n(?:c(d))++)*+)*+m", "ababkkXababkkabkncXababkkabkncdcdncdXababkkabkncdcdncdkkabkncdXababkkabkncdcdncdkkabkncdm" },
+
+	/* Back references. */
+	{ MU, A, 0, 0, "(aa|bb)(\\1*)(ll|)(\\3*)bbbbbbc", "aaaaaabbbbbbbbc" },
+	{ CMU, A, 0, 0, "(aa|bb)(\\1+)(ll|)(\\3+)bbbbbbc", "bBbbBbCbBbbbBbbcbbBbbbBBbbC" },
+	{ CM, A, 0, 0, "(a{2,4})\\1", "AaAaaAaA" },
+	{ MU, A, 0, 0, "(aa|bb)(\\1?)aa(\\1?)(ll|)(\\4+)bbc", "aaaaaaaabbaabbbbaabbbbc" },
+	{ MU, A, 0, 0, "(aa|bb)(\\1{0,5})(ll|)(\\3{0,5})cc", "bbxxbbbbxxaaaaaaaaaaaaaaaacc" },
+	{ MU, A, 0, 0, "(aa|bb)(\\1{3,5})(ll|)(\\3{3,5})cc", "bbbbbbbbbbbbaaaaaaccbbbbbbbbbbbbbbcc" },
+	{ MU, A, 0, 0, "(aa|bb)(\\1{3,})(ll|)(\\3{3,})cc", "bbbbbbbbbbbbaaaaaaccbbbbbbbbbbbbbbcc" },
+	{ MU, A, 0, 0, "(\\w+)b(\\1+)c", "GabGaGaDbGaDGaDc" },
+	{ MU, A, 0, 0, "(?:(aa)|b)\\1?b", "bb" },
+	{ CMU, A, 0, 0, "(aa|bb)(\\1*?)aa(\\1+?)", "bBBbaaAAaaAAaa" },
+	{ MU, A, 0, 0, "(aa|bb)(\\1*?)(dd|)cc(\\3+?)", "aaaaaccdd" },
+	{ CMU, A, 0, 0, "(?:(aa|bb)(\\1?\?)cc){2}(\\1?\?)", "aAaABBbbAAaAcCaAcCaA" },
+	{ MU, A, 0, 0, "(?:(aa|bb)(\\1{3,5}?)){2}(dd|)(\\3{3,5}?)", "aaaaaabbbbbbbbbbaaaaaaaaaaaaaa" },
+	{ CM, A, 0, 0, "(?:(aa|bb)(\\1{3,}?)){2}(dd|)(\\3{3,}?)", "aaaaaabbbbbbbbbbaaaaaaaaaaaaaa" },
+	{ MU, A, 0, 0, "(?:(aa|bb)(\\1{0,3}?)){2}(dd|)(\\3{0,3}?)b(\\1{0,3}?)(\\1{0,3})", "aaaaaaaaaaaaaaabaaaaa" },
+	{ MU, A, 0, 0, "(a(?:\\1|)a){3}b", "aaaaaaaaaaab" },
+	{ M, A, 0, 0, "(a?)b(\\1\\1*\\1+\\1?\\1*?\\1+?\\1??\\1*+\\1++\\1?+\\1{4}\\1{3,5}\\1{4,}\\1{0,5}\\1{3,5}?\\1{4,}?\\1{0,5}?\\1{3,5}+\\1{4,}+\\1{0,5}+#){2}d", "bb#b##d" },
+	{ MUP, A, 0, 0 | F_PROPERTY, "(\\P{N})\\1{2,}", ".www." },
+	{ MUP, A, 0, 0 | F_PROPERTY, "(\\P{N})\\1{0,2}", "wwwww." },
+	{ MUP, A, 0, 0 | F_PROPERTY, "(\\P{N})\\1{1,2}ww", "wwww" },
+	{ MUP, A, 0, 0 | F_PROPERTY, "(\\P{N})\\1{1,2}ww", "wwwww" },
+	{ PCRE2_UCP, 0, 0, 0 | F_PROPERTY, "(\\P{N})\\1{2,}", ".www." },
+	{ CMUP, A, 0, 0, "(\xf0\x90\x90\x80)\\1", "\xf0\x90\x90\xa8\xf0\x90\x90\xa8" },
+	{ MU | PCRE2_DUPNAMES, A, 0, 0 | F_NOMATCH, "\\k<A>{1,3}(?<A>aa)(?<A>bb)", "aabb" },
+	{ MU | PCRE2_DUPNAMES | PCRE2_MATCH_UNSET_BACKREF, A, 0, 0, "\\k<A>{1,3}(?<A>aa)(?<A>bb)", "aabb" },
+	{ MU | PCRE2_DUPNAMES | PCRE2_MATCH_UNSET_BACKREF, A, 0, 0, "\\k<A>*(?<A>aa)(?<A>bb)", "aabb" },
+	{ MU | PCRE2_DUPNAMES, A, 0, 0, "(?<A>aa)(?<A>bb)\\k<A>{0,3}aaaaaa", "aabbaaaaaa" },
+	{ MU | PCRE2_DUPNAMES, A, 0, 0, "(?<A>aa)(?<A>bb)\\k<A>{2,5}bb", "aabbaaaabb" },
+	{ MU | PCRE2_DUPNAMES, A, 0, 0, "(?:(?<A>aa)|(?<A>bb))\\k<A>{0,3}m", "aaaaaaaabbbbaabbbbm" },
+	{ MU | PCRE2_DUPNAMES, A, 0, 0 | F_NOMATCH, "\\k<A>{1,3}?(?<A>aa)(?<A>bb)", "aabb" },
+	{ MU | PCRE2_DUPNAMES | PCRE2_MATCH_UNSET_BACKREF, A, 0, 0, "\\k<A>{1,3}?(?<A>aa)(?<A>bb)", "aabb" },
+	{ MU | PCRE2_DUPNAMES, A, 0, 0, "\\k<A>*?(?<A>aa)(?<A>bb)", "aabb" },
+	{ MU | PCRE2_DUPNAMES, A, 0, 0, "(?:(?<A>aa)|(?<A>bb))\\k<A>{0,3}?m", "aaaaaabbbbbbaabbbbbbbbbbm" },
+	{ MU | PCRE2_DUPNAMES, A, 0, 0, "(?:(?<A>aa)|(?<A>bb))\\k<A>*?m", "aaaaaabbbbbbaabbbbbbbbbbm" },
+	{ MU | PCRE2_DUPNAMES, A, 0, 0, "(?:(?<A>aa)|(?<A>bb))\\k<A>{2,3}?", "aaaabbbbaaaabbbbbbbbbb" },
+	{ CMU | PCRE2_DUPNAMES, A, 0, 0, "(?:(?<A>AA)|(?<A>BB))\\k<A>{0,3}M", "aaaaaaaabbbbaabbbbm" },
+	{ CMU | PCRE2_DUPNAMES, A, 0, 0, "(?:(?<A>AA)|(?<A>BB))\\k<A>{1,3}M", "aaaaaaaabbbbaabbbbm" },
+	{ CMU | PCRE2_DUPNAMES, A, 0, 0, "(?:(?<A>AA)|(?<A>BB))\\k<A>{0,3}?M", "aaaaaabbbbbbaabbbbbbbbbbm" },
+	{ CMU | PCRE2_DUPNAMES, A, 0, 0, "(?:(?<A>AA)|(?<A>BB))\\k<A>{2,3}?", "aaaabbbbaaaabbbbbbbbbb" },
+
+	/* Assertions. */
+	{ MU, A, 0, 0, "(?=xx|yy|zz)\\w{4}", "abczzdefg" },
+	{ MU, A, 0, 0, "(?=((\\w+)b){3}|ab)", "dbbbb ab" },
+	{ MU, A, 0, 0, "(?!ab|bc|cd)[a-z]{2}", "Xabcdef" },
+	{ MU, A, 0, 0, "(?<=aaa|aa|a)a", "aaa" },
+	{ MU, A, 0, 2, "(?<=aaa|aa|a)a", "aaa" },
+	{ M, A, 0, 0, "(?<=aaa|aa|a)a", "aaa" },
+	{ M, A, 0, 2, "(?<=aaa|aa|a)a", "aaa" },
+	{ MU, A, 0, 0, "(\\d{2})(?!\\w+c|(((\\w?)m){2}n)+|\\1)", "x5656" },
+	{ MU, A, 0, 0, "((?=((\\d{2,6}\\w){2,}))\\w{5,20}K){2,}", "567v09708K12l00M00 567v09708K12l00M00K45K" },
+	{ MU, A, 0, 0, "(?=(?:(?=\\S+a)\\w*(b)){3})\\w+\\d", "bba bbab nbbkba nbbkba0kl" },
+	{ MU, A, 0, 0, "(?>a(?>(b+))a(?=(..)))*?k", "acabbcabbaabacabaabbakk" },
+	{ MU, A, 0, 0, "((?(?=(a))a)+k)", "bbak" },
+	{ MU, A, 0, 0, "((?(?=a)a)+k)", "bbak" },
+	{ MU, A, 0, 0 | F_NOMATCH, "(?=(?>(a))m)amk", "a k" },
+	{ MU, A, 0, 0 | F_NOMATCH, "(?!(?>(a))m)amk", "a k" },
+	{ MU, A, 0, 0 | F_NOMATCH, "(?>(?=(a))am)amk", "a k" },
+	{ MU, A, 0, 0, "(?=(?>a|(?=(?>(b+))a|c)[a-c]+)*?m)[a-cm]+k", "aaam bbam baaambaam abbabba baaambaamk" },
+	{ MU, A, 0, 0, "(?> ?\?\\b(?(?=\\w{1,4}(a))m)\\w{0,8}bc){2,}?", "bca ssbc mabd ssbc mabc" },
+	{ MU, A, 0, 0, "(?:(?=ab)?[^n][^n])+m", "ababcdabcdcdabnababcdabcdcdabm" },
+	{ MU, A, 0, 0, "(?:(?=a(b))?[^n][^n])+m", "ababcdabcdcdabnababcdabcdcdabm" },
+	{ MU, A, 0, 0, "(?:(?=.(.))??\\1.)+m", "aabbbcbacccanaabbbcbacccam" },
+	{ MU, A, 0, 0, "(?:(?=.)??[a-c])+m", "abacdcbacacdcaccam" },
+	{ MU, A, 0, 0, "((?!a)?(?!([^a]))?)+$", "acbab" },
+	{ MU, A, 0, 0, "((?!a)?\?(?!([^a]))?\?)+$", "acbab" },
+	{ MU, A, 0, 0, "a(?=(?C)\\B(?C`x`))b", "ab" },
+	{ MU, A, 0, 0, "a(?!(?C)\\B(?C`x`))bb|ab", "abb" },
+	{ MU, A, 0, 0, "a(?=\\b|(?C)\\B(?C`x`))b", "ab" },
+	{ MU, A, 0, 0, "a(?!\\b|(?C)\\B(?C`x`))bb|ab", "abb" },
+	{ MU, A, 0, 0, "c(?(?=(?C)\\B(?C`x`))ab|a)", "cab" },
+	{ MU, A, 0, 0, "c(?(?!(?C)\\B(?C`x`))ab|a)", "cab" },
+	{ MU, A, 0, 0, "c(?(?=\\b|(?C)\\B(?C`x`))ab|a)", "cab" },
+	{ MU, A, 0, 0, "c(?(?!\\b|(?C)\\B(?C`x`))ab|a)", "cab" },
+	{ MU, A, 0, 0, "a(?=)b", "ab" },
+	{ MU, A, 0, 0 | F_NOMATCH, "a(?!)b", "ab" },
+
+	/* Not empty, ACCEPT, FAIL */
+	{ MU, A, PCRE2_NOTEMPTY, 0 | F_NOMATCH, "a*", "bcx" },
+	{ MU, A, PCRE2_NOTEMPTY, 0, "a*", "bcaad" },
+	{ MU, A, PCRE2_NOTEMPTY, 0, "a*?", "bcaad" },
+	{ MU, A, PCRE2_NOTEMPTY_ATSTART, 0, "a*", "bcaad" },
+	{ MU, A, 0, 0, "a(*ACCEPT)b", "ab" },
+	{ MU, A, PCRE2_NOTEMPTY, 0 | F_NOMATCH, "a*(*ACCEPT)b", "bcx" },
+	{ MU, A, PCRE2_NOTEMPTY, 0, "a*(*ACCEPT)b", "bcaad" },
+	{ MU, A, PCRE2_NOTEMPTY, 0, "a*?(*ACCEPT)b", "bcaad" },
+	{ MU, A, PCRE2_NOTEMPTY, 0 | F_NOMATCH, "(?:z|a*(*ACCEPT)b)", "bcx" },
+	{ MU, A, PCRE2_NOTEMPTY, 0, "(?:z|a*(*ACCEPT)b)", "bcaad" },
+	{ MU, A, PCRE2_NOTEMPTY, 0, "(?:z|a*?(*ACCEPT)b)", "bcaad" },
+	{ MU, A, PCRE2_NOTEMPTY_ATSTART, 0, "a*(*ACCEPT)b", "bcx" },
+	{ MU, A, PCRE2_NOTEMPTY_ATSTART, 0 | F_NOMATCH, "a*(*ACCEPT)b", "" },
+	{ MU, A, 0, 0, "((a(*ACCEPT)b))", "ab" },
+	{ MU, A, 0, 0, "(a(*FAIL)a|a)", "aaa" },
+	{ MU, A, 0, 0, "(?=ab(*ACCEPT)b)a", "ab" },
+	{ MU, A, 0, 0, "(?=(?:x|ab(*ACCEPT)b))", "ab" },
+	{ MU, A, 0, 0, "(?=(a(b(*ACCEPT)b)))a", "ab" },
+	{ MU, A, PCRE2_NOTEMPTY, 0, "(?=a*(*ACCEPT))c", "c" },
+
+	/* Conditional blocks. */
+	{ MU, A, 0, 0, "(?(?=(a))a|b)+k", "ababbalbbadabak" },
+	{ MU, A, 0, 0, "(?(?!(b))a|b)+k", "ababbalbbadabak" },
+	{ MU, A, 0, 0, "(?(?=a)a|b)+k", "ababbalbbadabak" },
+	{ MU, A, 0, 0, "(?(?!b)a|b)+k", "ababbalbbadabak" },
+	{ MU, A, 0, 0, "(?(?=(a))a*|b*)+k", "ababbalbbadabak" },
+	{ MU, A, 0, 0, "(?(?!(b))a*|b*)+k", "ababbalbbadabak" },
+	{ MU, A, 0, 0, "(?(?!(b))(?:aaaaaa|a)|(?:bbbbbb|b))+aaaak", "aaaaaaaaaaaaaa bbbbbbbbbbbbbbb aaaaaaak" },
+	{ MU, A, 0, 0, "(?(?!b)(?:aaaaaa|a)|(?:bbbbbb|b))+aaaak", "aaaaaaaaaaaaaa bbbbbbbbbbbbbbb aaaaaaak" },
+	{ MU, A, 0, 0 | F_DIFF, "(?(?!(b))(?:aaaaaa|a)|(?:bbbbbb|b))+bbbbk", "aaaaaaaaaaaaaa bbbbbbbbbbbbbbb bbbbbbbk" },
+	{ MU, A, 0, 0, "(?(?!b)(?:aaaaaa|a)|(?:bbbbbb|b))+bbbbk", "aaaaaaaaaaaaaa bbbbbbbbbbbbbbb bbbbbbbk" },
+	{ MU, A, 0, 0, "(?(?=a)a*|b*)+k", "ababbalbbadabak" },
+	{ MU, A, 0, 0, "(?(?!b)a*|b*)+k", "ababbalbbadabak" },
+	{ MU, A, 0, 0, "(?(?=a)ab)", "a" },
+	{ MU, A, 0, 0, "(?(?<!b)c)", "b" },
+	{ MU, A, 0, 0, "(?(DEFINE)a(b))", "a" },
+	{ MU, A, 0, 0, "a(?(DEFINE)(?:b|(?:c?)+)*)", "a" },
+	{ MU, A, 0, 0, "(?(?=.[a-c])[k-l]|[A-D])", "kdB" },
+	{ MU, A, 0, 0, "(?(?!.{0,4}[cd])(aa|bb)|(cc|dd))+", "aabbccddaa" },
+	{ MU, A, 0, 0, "(?(?=[^#@]*@)(aaab|aa|aba)|(aba|aab)){3,}", "aaabaaaba#aaabaaaba#aaabaaaba@" },
+	{ MU, A, 0, 0, "((?=\\w{5})\\w(?(?=\\w*k)\\d|[a-f_])*\\w\\s)+", "mol m10kk m088k _f_a_ mbkkl" },
+	{ MU, A, 0, 0, "(c)?\?(?(1)a|b)", "cdcaa" },
+	{ MU, A, 0, 0, "(c)?\?(?(1)a|b)", "cbb" },
+	{ MU, A, 0, 0 | F_DIFF, "(?(?=(a))(aaaa|a?))+aak", "aaaaab aaaaak" },
+	{ MU, A, 0, 0, "(?(?=a)(aaaa|a?))+aak", "aaaaab aaaaak" },
+	{ MU, A, 0, 0, "(?(?!(b))(aaaa|a?))+aak", "aaaaab aaaaak" },
+	{ MU, A, 0, 0, "(?(?!b)(aaaa|a?))+aak", "aaaaab aaaaak" },
+	{ MU, A, 0, 0 | F_DIFF, "(?(?=(a))a*)+aak", "aaaaab aaaaak" },
+	{ MU, A, 0, 0, "(?(?=a)a*)+aak", "aaaaab aaaaak" },
+	{ MU, A, 0, 0, "(?(?!(b))a*)+aak", "aaaaab aaaaak" },
+	{ MU, A, 0, 0, "(?(?!b)a*)+aak", "aaaaab aaaaak" },
+	{ MU, A, 0, 0, "(?(?=(?=(?!(x))a)aa)aaa|(?(?=(?!y)bb)bbb))*k", "abaabbaaabbbaaabbb abaabbaaabbbaaabbbk" },
+	{ MU, A, 0, 0, "(?P<Name>a)?(?P<Name2>b)?(?(Name)c|d)*l", "bc ddd abccabccl" },
+	{ MU, A, 0, 0, "(?P<Name>a)?(?P<Name2>b)?(?(Name)c|d)+?dd", "bcabcacdb bdddd" },
+	{ MU, A, 0, 0, "(?P<Name>a)?(?P<Name2>b)?(?(Name)c|d)+l", "ababccddabdbccd abcccl" },
+	{ MU, A, 0, 0, "((?:a|aa)(?(1)aaa))x", "aax" },
+	{ MU, A, 0, 0, "(?(?!)a|b)", "ab" },
+	{ MU, A, 0, 0, "(?(?!)a)", "ab" },
+	{ MU, A, 0, 0 | F_NOMATCH, "(?(?!)a|b)", "ac" },
+
+	/* Set start of match. */
+	{ MU, A, 0, 0, "(?:\\Ka)*aaaab", "aaaaaaaa aaaaaaabb" },
+	{ MU, A, 0, 0, "(?>\\Ka\\Ka)*aaaab", "aaaaaaaa aaaaaaaaaabb" },
+	{ MU, A, 0, 0, "a+\\K(?<=\\Gaa)a", "aaaaaa" },
+	{ MU, A, PCRE2_NOTEMPTY, 0 | F_NOMATCH, "a\\K(*ACCEPT)b", "aa" },
+	{ MU, A, PCRE2_NOTEMPTY_ATSTART, 0, "a\\K(*ACCEPT)b", "aa" },
+
+	/* First line. */
+	{ MU | PCRE2_FIRSTLINE, A, 0, 0 | F_PROPERTY, "\\p{Any}a", "bb\naaa" },
+	{ MU | PCRE2_FIRSTLINE, A, 0, 0 | F_NOMATCH | F_PROPERTY, "\\p{Any}a", "bb\r\naaa" },
+	{ MU | PCRE2_FIRSTLINE, A, 0, 0, "(?<=a)", "a" },
+	{ MU | PCRE2_FIRSTLINE, A, 0, 0 | F_NOMATCH, "[^a][^b]", "ab" },
+	{ MU | PCRE2_FIRSTLINE, A, 0, 0 | F_NOMATCH, "a", "\na" },
+	{ MU | PCRE2_FIRSTLINE, A, 0, 0 | F_NOMATCH, "[abc]", "\na" },
+	{ MU | PCRE2_FIRSTLINE, A, 0, 0 | F_NOMATCH, "^a", "\na" },
+	{ MU | PCRE2_FIRSTLINE, A, 0, 0 | F_NOMATCH, "^(?<=\n)", "\na" },
+	{ MU | PCRE2_FIRSTLINE, A, 0, 0, "\xf0\x90\x90\x80", "\xf0\x90\x90\x80" },
+	{ MU | PCRE2_FIRSTLINE, PCRE2_NEWLINE_ANY, 0, 0 | F_NOMATCH, "#", "\xc2\x85#" },
+	{ M | PCRE2_FIRSTLINE, PCRE2_NEWLINE_ANY, 0, 0 | F_NOMATCH, "#", "\x85#" },
+	{ MU | PCRE2_FIRSTLINE, PCRE2_NEWLINE_ANY, 0, 0 | F_NOMATCH, "^#", "\xe2\x80\xa8#" },
+	{ MU | PCRE2_FIRSTLINE, PCRE2_NEWLINE_CRLF, 0, 0 | F_PROPERTY, "\\p{Any}", "\r\na" },
+	{ MU | PCRE2_FIRSTLINE, PCRE2_NEWLINE_CRLF, 0, 0, ".", "\r" },
+	{ MU | PCRE2_FIRSTLINE, PCRE2_NEWLINE_CRLF, 0, 0, "a", "\ra" },
+	{ MU | PCRE2_FIRSTLINE, PCRE2_NEWLINE_CRLF, 0, 0 | F_NOMATCH, "ba", "bbb\r\nba" },
+	{ MU | PCRE2_FIRSTLINE, PCRE2_NEWLINE_CRLF, 0, 0 | F_NOMATCH | F_PROPERTY, "\\p{Any}{4}|a", "\r\na" },
+	{ MU | PCRE2_FIRSTLINE, PCRE2_NEWLINE_CRLF, 0, 1, ".", "\r\n" },
+	{ PCRE2_FIRSTLINE | PCRE2_DOTALL, PCRE2_NEWLINE_LF, 0, 0 | F_NOMATCH, "ab.", "ab" },
+	{ MU | PCRE2_FIRSTLINE, A, 0, 1 | F_NOMATCH, "^[a-d0-9]", "\nxx\nd" },
+	{ PCRE2_FIRSTLINE | PCRE2_DOTALL, PCRE2_NEWLINE_ANY, 0, 0, "....a", "012\n0a" },
+
+	/* Recurse. */
+	{ MU, A, 0, 0, "(a)(?1)", "aa" },
+	{ MU, A, 0, 0, "((a))(?1)", "aa" },
+	{ MU, A, 0, 0, "(b|a)(?1)", "aa" },
+	{ MU, A, 0, 0, "(b|(a))(?1)", "aa" },
+	{ MU, A, 0, 0 | F_NOMATCH, "((a)(b)(?:a*))(?1)", "aba" },
+	{ MU, A, 0, 0, "((a)(b)(?:a*))(?1)", "abab" },
+	{ MU, A, 0, 0, "((a+)c(?2))b(?1)", "aacaabaca" },
+	{ MU, A, 0, 0, "((?2)b|(a)){2}(?1)", "aabab" },
+	{ MU, A, 0, 0, "(?1)(a)*+(?2)(b(?1))", "aababa" },
+	{ MU, A, 0, 0, "(?1)(((a(*ACCEPT)))b)", "axaa" },
+	{ MU, A, 0, 0, "(?1)(?(DEFINE) (((ac(*ACCEPT)))b) )", "akaac" },
+	{ MU, A, 0, 0, "(a+)b(?1)b\\1", "abaaabaaaaa" },
+	{ MU, A, 0, 0 | F_NOMATCH, "(?(DEFINE)(aa|a))(?1)ab", "aab" },
+	{ MU, A, 0, 0, "(?(DEFINE)(a\\Kb))(?1)+ababc", "abababxabababc" },
+	{ MU, A, 0, 0, "(a\\Kb)(?1)+ababc", "abababxababababc" },
+	{ MU, A, 0, 0 | F_NOMATCH, "(a\\Kb)(?1)+ababc", "abababxababababxc" },
+	{ MU, A, 0, 0, "b|<(?R)*>", "<<b>" },
+	{ MU, A, 0, 0, "(a\\K){0}(?:(?1)b|ac)", "ac" },
+	{ MU, A, 0, 0, "(?(DEFINE)(a(?2)|b)(b(?1)|(a)))(?:(?1)|(?2))m", "ababababnababababaam" },
+	{ MU, A, 0, 0, "(a)((?(R)a|b))(?2)", "aabbabaa" },
+	{ MU, A, 0, 0, "(a)((?(R2)a|b))(?2)", "aabbabaa" },
+	{ MU, A, 0, 0, "(a)((?(R1)a|b))(?2)", "ababba" },
+	{ MU, A, 0, 0, "(?(R0)aa|bb(?R))", "abba aabb bbaa" },
+	{ MU, A, 0, 0, "((?(R)(?:aaaa|a)|(?:(aaaa)|(a)))+)(?1)$", "aaaaaaaaaa aaaa" },
+	{ MU, A, 0, 0, "(?P<Name>a(?(R&Name)a|b))(?1)", "aab abb abaa" },
+	{ MU, A, 0, 0, "((?(R)a|(?1)){3})", "XaaaaaaaaaX" },
+	{ MU, A, 0, 0, "((?:(?(R)a|(?1))){3})", "XaaaaaaaaaX" },
+	{ MU, A, 0, 0, "((?(R)a|(?1)){1,3})aaaaaa", "aaaaaaaaXaaaaaaaaa" },
+	{ MU, A, 0, 0, "((?(R)a|(?1)){1,3}?)M", "aaaM" },
+
+	/* 16 bit specific tests. */
+	{ CM, A, 0, 0 | F_FORCECONV, "\xc3\xa1", "\xc3\x81\xc3\xa1" },
+	{ CM, A, 0, 0 | F_FORCECONV, "\xe1\xbd\xb8", "\xe1\xbf\xb8\xe1\xbd\xb8" },
+	{ CM, A, 0, 0 | F_FORCECONV, "[\xc3\xa1]", "\xc3\x81\xc3\xa1" },
+	{ CM, A, 0, 0 | F_FORCECONV, "[\xe1\xbd\xb8]", "\xe1\xbf\xb8\xe1\xbd\xb8" },
+	{ CM, A, 0, 0 | F_FORCECONV, "[a-\xed\xb0\x80]", "A" },
+	{ CM, A, 0, 0 | F_NO8 | F_FORCECONV, "[a-\\x{dc00}]", "B" },
+	{ CM, A, 0, 0 | F_NO8 | F_NOMATCH | F_FORCECONV, "[b-\\x{dc00}]", "a" },
+	{ CM, A, 0, 0 | F_NO8 | F_FORCECONV, "\xed\xa0\x80\\x{d800}\xed\xb0\x80\\x{dc00}", "\xed\xa0\x80\xed\xa0\x80\xed\xb0\x80\xed\xb0\x80" },
+	{ CM, A, 0, 0 | F_NO8 | F_FORCECONV, "[\xed\xa0\x80\\x{d800}]{1,2}?[\xed\xb0\x80\\x{dc00}]{1,2}?#", "\xed\xa0\x80\xed\xa0\x80\xed\xb0\x80\xed\xb0\x80#" },
+	{ CM, A, 0, 0 | F_FORCECONV, "[\xed\xa0\x80\xed\xb0\x80#]{0,3}(?<=\xed\xb0\x80.)", "\xed\xa0\x80#\xed\xa0\x80##\xed\xb0\x80\xed\xa0\x80" },
+	{ CM, A, 0, 0 | F_FORCECONV, "[\xed\xa0\x80-\xed\xb3\xbf]", "\xed\x9f\xbf\xed\xa0\x83" },
+	{ CM, A, 0, 0 | F_FORCECONV, "[\xed\xa0\x80-\xed\xb3\xbf]", "\xed\xb4\x80\xed\xb3\xb0" },
+	{ CM, A, 0, 0 | F_NO8 | F_FORCECONV, "[\\x{d800}-\\x{dcff}]", "\xed\x9f\xbf\xed\xa0\x83" },
+	{ CM, A, 0, 0 | F_NO8 | F_FORCECONV, "[\\x{d800}-\\x{dcff}]", "\xed\xb4\x80\xed\xb3\xb0" },
+	{ CM, A, 0, 0 | F_FORCECONV, "[\xed\xa0\x80-\xef\xbf\xbf]+[\x1-\xed\xb0\x80]+#", "\xed\xa0\x85\xc3\x81\xed\xa0\x85\xef\xbf\xb0\xc2\x85\xed\xa9\x89#" },
+	{ CM, A, 0, 0 | F_FORCECONV, "[\xed\xa0\x80][\xed\xb0\x80]{2,}", "\xed\xa0\x80\xed\xb0\x80\xed\xa0\x80\xed\xb0\x80\xed\xb0\x80\xed\xb0\x80" },
+	{ M, A, 0, 0 | F_FORCECONV, "[^\xed\xb0\x80]{3,}?", "##\xed\xb0\x80#\xed\xb0\x80#\xc3\x89#\xed\xb0\x80" },
+	{ M, A, 0, 0 | F_NO8 | F_FORCECONV, "[^\\x{dc00}]{3,}?", "##\xed\xb0\x80#\xed\xb0\x80#\xc3\x89#\xed\xb0\x80" },
+	{ CM, A, 0, 0 | F_FORCECONV, ".\\B.", "\xed\xa0\x80\xed\xb0\x80" },
+	{ CM, A, 0, 0 | F_FORCECONV, "\\D+(?:\\d+|.)\\S+(?:\\s+|.)\\W+(?:\\w+|.)\xed\xa0\x80\xed\xa0\x80", "\xed\xa0\x80\xed\xa0\x80\xed\xa0\x80\xed\xa0\x80\xed\xa0\x80\xed\xa0\x80\xed\xa0\x80\xed\xa0\x80" },
+	{ CM, A, 0, 0 | F_FORCECONV, "\\d*\\s*\\w*\xed\xa0\x80\xed\xa0\x80", "\xed\xa0\x80\xed\xa0\x80" },
+	{ CM, A, 0, 0 | F_FORCECONV | F_NOMATCH, "\\d*?\\D*?\\s*?\\S*?\\w*?\\W*?##", "\xed\xa0\x80\xed\xa0\x80\xed\xa0\x80\xed\xa0\x80#" },
+	{ CM | PCRE2_EXTENDED, A, 0, 0 | F_FORCECONV, "\xed\xa0\x80 \xed\xb0\x80 !", "\xed\xa0\x80\xed\xb0\x80!" },
+	{ CM, A, 0, 0 | F_FORCECONV, "\xed\xa0\x80+#[^#]+\xed\xa0\x80", "\xed\xa0\x80#a\xed\xa0\x80" },
+	{ CM, A, 0, 0 | F_FORCECONV, "(\xed\xa0\x80+)#\\1", "\xed\xa0\x80\xed\xa0\x80#\xed\xa0\x80\xed\xa0\x80" },
+	{ M, PCRE2_NEWLINE_ANY, 0, 0 | F_NO8 | F_FORCECONV, "^-", "a--\xe2\x80\xa8--" },
+	{ 0, BSR(PCRE2_BSR_UNICODE), 0, 0 | F_NO8 | F_FORCECONV, "\\R", "ab\xe2\x80\xa8" },
+	{ 0, 0, 0, 0 | F_NO8 | F_FORCECONV, "\\v", "ab\xe2\x80\xa9" },
+	{ 0, 0, 0, 0 | F_NO8 | F_FORCECONV, "\\h", "ab\xe1\xa0\x8e" },
+	{ 0, 0, 0, 0 | F_NO8 | F_FORCECONV, "\\v+?\\V+?#", "\xe2\x80\xa9\xe2\x80\xa9\xef\xbf\xbf\xef\xbf\xbf#" },
+	{ 0, 0, 0, 0 | F_NO8 | F_FORCECONV, "\\h+?\\H+?#", "\xe1\xa0\x8e\xe1\xa0\x8e\xef\xbf\xbf\xef\xbf\xbf#" },
+
+	/* Partial matching. */
+	{ MU, A, PCRE2_PARTIAL_SOFT, 0, "ab", "a" },
+	{ MU, A, PCRE2_PARTIAL_SOFT, 0, "ab|a", "a" },
+	{ MU, A, PCRE2_PARTIAL_HARD, 0, "ab|a", "a" },
+	{ MU, A, PCRE2_PARTIAL_SOFT, 0, "\\b#", "a" },
+	{ MU, A, PCRE2_PARTIAL_SOFT, 0, "(?<=a)b", "a" },
+	{ MU, A, PCRE2_PARTIAL_SOFT, 0, "abc|(?<=xxa)bc", "xxab" },
+	{ MU, A, PCRE2_PARTIAL_SOFT, 0, "a\\B", "a" },
+	{ MU, A, PCRE2_PARTIAL_HARD, 0, "a\\b", "a" },
+
+	/* (*MARK) verb. */
+	{ MU, A, 0, 0, "a(*MARK:aa)a", "ababaa" },
+	{ MU, A, 0, 0 | F_NOMATCH, "a(*:aa)a", "abab" },
+	{ MU, A, 0, 0, "a(*:aa)(b(*:bb)b|bc)", "abc" },
+	{ MU, A, 0, 0 | F_NOMATCH, "a(*:1)x|b(*:2)y", "abc" },
+	{ MU, A, 0, 0, "(?>a(*:aa))b|ac", "ac" },
+	{ MU, A, 0, 0, "(?(DEFINE)(a(*:aa)))(?1)", "a" },
+	{ MU, A, 0, 0 | F_NOMATCH, "(?(DEFINE)((a)(*:aa)))(?1)b", "aa" },
+	{ MU, A, 0, 0, "(?(DEFINE)(a(*:aa)))a(?1)b|aac", "aac" },
+	{ MU, A, 0, 0, "(a(*:aa)){0}(?:b(?1)b|c)+c", "babbab cc" },
+	{ MU, A, 0, 0, "(a(*:aa)){0}(?:b(?1)b)+", "babba" },
+	{ MU, A, 0, 0 | F_NOMATCH | F_STUDY, "(a(*:aa)){0}(?:b(?1)b)+", "ba" },
+	{ MU, A, 0, 0, "(a\\K(*:aa)){0}(?:b(?1)b|c)+c", "babbab cc" },
+	{ MU, A, 0, 0, "(a\\K(*:aa)){0}(?:b(?1)b)+", "babba" },
+	{ MU, A, 0, 0 | F_NOMATCH | F_STUDY, "(a\\K(*:aa)){0}(?:b(?1)b)+", "ba" },
+	{ MU, A, 0, 0 | F_NOMATCH | F_STUDY, "(*:mark)m", "a" },
+
+	/* (*COMMIT) verb. */
+	{ MU, A, 0, 0 | F_NOMATCH, "a(*COMMIT)b", "ac" },
+	{ MU, A, 0, 0, "aa(*COMMIT)b", "xaxaab" },
+	{ MU, A, 0, 0 | F_NOMATCH, "a(*COMMIT)(*:msg)b|ac", "ac" },
+	{ MU, A, 0, 0 | F_NOMATCH, "(a(*COMMIT)b)++", "abac" },
+	{ MU, A, 0, 0 | F_NOMATCH, "((a)(*COMMIT)b)++", "abac" },
+	{ MU, A, 0, 0 | F_NOMATCH, "(?=a(*COMMIT)b)ab|ad", "ad" },
+
+	/* (*PRUNE) verb. */
+	{ MU, A, 0, 0, "aa\\K(*PRUNE)b", "aaab" },
+	{ MU, A, 0, 0, "aa(*PRUNE:bb)b|a", "aa" },
+	{ MU, A, 0, 0, "(a)(a)(*PRUNE)b|(a)", "aa" },
+	{ MU, A, 0, 0, "(a)(a)(a)(a)(a)(a)(a)(a)(*PRUNE)b|(a)", "aaaaaaaa" },
+	{ MU, A, PCRE2_PARTIAL_SOFT, 0, "a(*PRUNE)a|", "a" },
+	{ MU, A, PCRE2_PARTIAL_SOFT, 0, "a(*PRUNE)a|m", "a" },
+	{ MU, A, 0, 0 | F_NOMATCH, "(?=a(*PRUNE)b)ab|ad", "ad" },
+	{ MU, A, 0, 0, "a(*COMMIT)(*PRUNE)d|bc", "abc" },
+	{ MU, A, 0, 0, "(?=a(*COMMIT)b)a(*PRUNE)c|bc", "abc" },
+	{ MU, A, 0, 0 | F_NOMATCH, "(*COMMIT)(?=a(*COMMIT)b)a(*PRUNE)c|bc", "abc" },
+	{ MU, A, 0, 0, "(?=(a)(*COMMIT)b)a(*PRUNE)c|bc", "abc" },
+	{ MU, A, 0, 0 | F_NOMATCH, "(*COMMIT)(?=(a)(*COMMIT)b)a(*PRUNE)c|bc", "abc" },
+	{ MU, A, 0, 0, "(a(*COMMIT)b){0}a(?1)(*PRUNE)c|bc", "abc" },
+	{ MU, A, 0, 0 | F_NOMATCH, "(a(*COMMIT)b){0}a(*COMMIT)(?1)(*PRUNE)c|bc", "abc" },
+	{ MU, A, 0, 0, "(a(*COMMIT)b)++(*PRUNE)d|c", "ababc" },
+	{ MU, A, 0, 0 | F_NOMATCH, "(*COMMIT)(a(*COMMIT)b)++(*PRUNE)d|c", "ababc" },
+	{ MU, A, 0, 0, "((a)(*COMMIT)b)++(*PRUNE)d|c", "ababc" },
+	{ MU, A, 0, 0 | F_NOMATCH, "(*COMMIT)((a)(*COMMIT)b)++(*PRUNE)d|c", "ababc" },
+	{ MU, A, 0, 0, "(?>a(*COMMIT)b)*abab(*PRUNE)d|ba", "ababab" },
+	{ MU, A, 0, 0 | F_NOMATCH, "(*COMMIT)(?>a(*COMMIT)b)*abab(*PRUNE)d|ba", "ababab" },
+	{ MU, A, 0, 0, "(?>a(*COMMIT)b)+abab(*PRUNE)d|ba", "ababab" },
+	{ MU, A, 0, 0 | F_NOMATCH, "(*COMMIT)(?>a(*COMMIT)b)+abab(*PRUNE)d|ba", "ababab" },
+	{ MU, A, 0, 0, "(?>a(*COMMIT)b)?ab(*PRUNE)d|ba", "aba" },
+	{ MU, A, 0, 0 | F_NOMATCH, "(*COMMIT)(?>a(*COMMIT)b)?ab(*PRUNE)d|ba", "aba" },
+	{ MU, A, 0, 0, "(?>a(*COMMIT)b)*?n(*PRUNE)d|ba", "abababn" },
+	{ MU, A, 0, 0 | F_NOMATCH, "(*COMMIT)(?>a(*COMMIT)b)*?n(*PRUNE)d|ba", "abababn" },
+	{ MU, A, 0, 0, "(?>a(*COMMIT)b)+?n(*PRUNE)d|ba", "abababn" },
+	{ MU, A, 0, 0 | F_NOMATCH, "(*COMMIT)(?>a(*COMMIT)b)+?n(*PRUNE)d|ba", "abababn" },
+	{ MU, A, 0, 0, "(?>a(*COMMIT)b)??n(*PRUNE)d|bn", "abn" },
+	{ MU, A, 0, 0 | F_NOMATCH, "(*COMMIT)(?>a(*COMMIT)b)??n(*PRUNE)d|bn", "abn" },
+
+	/* (*SKIP) verb. */
+	{ MU, A, 0, 0 | F_NOMATCH, "(?=a(*SKIP)b)ab|ad", "ad" },
+	{ MU, A, 0, 0, "(\\w+(*SKIP)#)", "abcd,xyz#," },
+	{ MU, A, 0, 0, "\\w+(*SKIP)#|mm", "abcd,xyz#," },
+	{ MU, A, 0, 0 | F_NOMATCH, "b+(?<=(*SKIP)#c)|b+", "#bbb" },
+
+	/* (*THEN) verb. */
+	{ MU, A, 0, 0, "((?:a(*THEN)|aab)(*THEN)c|a+)+m", "aabcaabcaabcaabcnacm" },
+	{ MU, A, 0, 0 | F_NOMATCH, "((?:a(*THEN)|aab)(*THEN)c|a+)+m", "aabcm" },
+	{ MU, A, 0, 0, "((?:a(*THEN)|aab)c|a+)+m", "aabcaabcnmaabcaabcm" },
+	{ MU, A, 0, 0, "((?:a|aab)(*THEN)c|a+)+m", "aam" },
+	{ MU, A, 0, 0, "((?:a(*COMMIT)|aab)(*THEN)c|a+)+m", "aam" },
+	{ MU, A, 0, 0, "(?(?=a(*THEN)b)ab|ad)", "ad" },
+	{ MU, A, 0, 0, "(?(?!a(*THEN)b)ad|add)", "add" },
+	{ MU, A, 0, 0 | F_NOMATCH, "(?(?=a)a(*THEN)b|ad)", "ad" },
+	{ MU, A, 0, 0, "(?!(?(?=a)ab|b(*THEN)d))bn|bnn", "bnn" },
+
+	/* Deep recursion. */
+	{ MU, A, 0, 0, "((((?:(?:(?:\\w)+)?)*|(?>\\w)+?)+|(?>\\w)?\?)*)?\\s", "aaaaa+ " },
+	{ MU, A, 0, 0, "(?:((?:(?:(?:\\w*?)+)??|(?>\\w)?|\\w*+)*)+)+?\\s", "aa+ " },
+	{ MU, A, 0, 0, "((a?)+)+b", "aaaaaaaaaaaa b" },
+
+	/* Deep recursion: Stack limit reached. */
+	{ M, A, 0, 0 | F_NOMATCH, "a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?aaaaaaaaaaaaaaaaaaaaaaa", "aaaaaaaaaaaaaaaaaaaaaaa" },
+	{ M, A, 0, 0 | F_NOMATCH, "(?:a+)+b", "aaaaaaaaaaaaaaaaaaaaaaaa b" },
+	{ M, A, 0, 0 | F_NOMATCH, "(?:a+?)+?b", "aaaaaaaaaaaaaaaaaaaaaaaa b" },
+	{ M, A, 0, 0 | F_NOMATCH, "(?:a*)*b", "aaaaaaaaaaaaaaaaaaaaaaaa b" },
+	{ M, A, 0, 0 | F_NOMATCH, "(?:a*?)*?b", "aaaaaaaaaaaaaaaaaaaaaaaa b" },
+
+	{ 0, 0, 0, 0, NULL, NULL }
+};
+
+#ifdef SUPPORT_PCRE2_8
+static pcre2_jit_stack_8* callback8(void *arg)
+{
+	return (pcre2_jit_stack_8 *)arg;
+}
+#endif
+
+#ifdef SUPPORT_PCRE2_16
+static pcre2_jit_stack_16* callback16(void *arg)
+{
+	return (pcre2_jit_stack_16 *)arg;
+}
+#endif
+
+#ifdef SUPPORT_PCRE2_32
+static pcre2_jit_stack_32* callback32(void *arg)
+{
+	return (pcre2_jit_stack_32 *)arg;
+}
+#endif
+
+#ifdef SUPPORT_PCRE2_8
+static pcre2_jit_stack_8 *stack8;
+
+static pcre2_jit_stack_8 *getstack8(void)
+{
+	if (!stack8)
+		stack8 = pcre2_jit_stack_create_8(1, 1024 * 1024, NULL);
+	return stack8;
+}
+
+static void setstack8(pcre2_match_context_8 *mcontext)
+{
+	if (!mcontext) {
+		if (stack8)
+			pcre2_jit_stack_free_8(stack8);
+		stack8 = NULL;
+		return;
+	}
+
+	pcre2_jit_stack_assign_8(mcontext, callback8, getstack8());
+}
+#endif /* SUPPORT_PCRE2_8 */
+
+#ifdef SUPPORT_PCRE2_16
+static pcre2_jit_stack_16 *stack16;
+
+static pcre2_jit_stack_16 *getstack16(void)
+{
+	if (!stack16)
+		stack16 = pcre2_jit_stack_create_16(1, 1024 * 1024, NULL);
+	return stack16;
+}
+
+static void setstack16(pcre2_match_context_16 *mcontext)
+{
+	if (!mcontext) {
+		if (stack16)
+			pcre2_jit_stack_free_16(stack16);
+		stack16 = NULL;
+		return;
+	}
+
+	pcre2_jit_stack_assign_16(mcontext, callback16, getstack16());
+}
+#endif /* SUPPORT_PCRE2_16 */
+
+#ifdef SUPPORT_PCRE2_32
+static pcre2_jit_stack_32 *stack32;
+
+static pcre2_jit_stack_32 *getstack32(void)
+{
+	if (!stack32)
+		stack32 = pcre2_jit_stack_create_32(1, 1024 * 1024, NULL);
+	return stack32;
+}
+
+static void setstack32(pcre2_match_context_32 *mcontext)
+{
+	if (!mcontext) {
+		if (stack32)
+			pcre2_jit_stack_free_32(stack32);
+		stack32 = NULL;
+		return;
+	}
+
+	pcre2_jit_stack_assign_32(mcontext, callback32, getstack32());
+}
+#endif /* SUPPORT_PCRE2_32 */
+
+#ifdef SUPPORT_PCRE2_16
+
+static int convert_utf8_to_utf16(PCRE2_SPTR8 input, PCRE2_UCHAR16 *output, int *offsetmap, int max_length)
+{
+	PCRE2_SPTR8 iptr = input;
+	PCRE2_UCHAR16 *optr = output;
+	unsigned int c;
+
+	if (max_length == 0)
+		return 0;
+
+	while (*iptr && max_length > 1) {
+		c = 0;
+		if (offsetmap)
+			*offsetmap++ = (int)(iptr - (unsigned char*)input);
+
+		if (*iptr < 0xc0)
+			c = *iptr++;
+		else if (!(*iptr & 0x20)) {
+			c = ((iptr[0] & 0x1f) << 6) | (iptr[1] & 0x3f);
+			iptr += 2;
+		} else if (!(*iptr & 0x10)) {
+			c = ((iptr[0] & 0x0f) << 12) | ((iptr[1] & 0x3f) << 6) | (iptr[2] & 0x3f);
+			iptr += 3;
+		} else if (!(*iptr & 0x08)) {
+			c = ((iptr[0] & 0x07) << 18) | ((iptr[1] & 0x3f) << 12) | ((iptr[2] & 0x3f) << 6) | (iptr[3] & 0x3f);
+			iptr += 4;
+		}
+
+		if (c < 65536) {
+			*optr++ = c;
+			max_length--;
+		} else if (max_length <= 2) {
+			*optr = '\0';
+			return (int)(optr - output);
+		} else {
+			c -= 0x10000;
+			*optr++ = 0xd800 | ((c >> 10) & 0x3ff);
+			*optr++ = 0xdc00 | (c & 0x3ff);
+			max_length -= 2;
+			if (offsetmap)
+				offsetmap++;
+		}
+	}
+	if (offsetmap)
+		*offsetmap = (int)(iptr - (unsigned char*)input);
+	*optr = '\0';
+	return (int)(optr - output);
+}
+
+static int copy_char8_to_char16(PCRE2_SPTR8 input, PCRE2_UCHAR16 *output, int max_length)
+{
+	PCRE2_SPTR8 iptr = input;
+	PCRE2_UCHAR16 *optr = output;
+
+	if (max_length == 0)
+		return 0;
+
+	while (*iptr && max_length > 1) {
+		*optr++ = *iptr++;
+		max_length--;
+	}
+	*optr = '\0';
+	return (int)(optr - output);
+}
+
+#define REGTEST_MAX_LENGTH16 4096
+static PCRE2_UCHAR16 regtest_buf16[REGTEST_MAX_LENGTH16];
+static int regtest_offsetmap16[REGTEST_MAX_LENGTH16];
+
+#endif /* SUPPORT_PCRE2_16 */
+
+#ifdef SUPPORT_PCRE2_32
+
+static int convert_utf8_to_utf32(PCRE2_SPTR8 input, PCRE2_UCHAR32 *output, int *offsetmap, int max_length)
+{
+	PCRE2_SPTR8 iptr = input;
+	PCRE2_UCHAR32 *optr = output;
+	unsigned int c;
+
+	if (max_length == 0)
+		return 0;
+
+	while (*iptr && max_length > 1) {
+		c = 0;
+		if (offsetmap)
+			*offsetmap++ = (int)(iptr - (unsigned char*)input);
+
+		if (*iptr < 0xc0)
+			c = *iptr++;
+		else if (!(*iptr & 0x20)) {
+			c = ((iptr[0] & 0x1f) << 6) | (iptr[1] & 0x3f);
+			iptr += 2;
+		} else if (!(*iptr & 0x10)) {
+			c = ((iptr[0] & 0x0f) << 12) | ((iptr[1] & 0x3f) << 6) | (iptr[2] & 0x3f);
+			iptr += 3;
+		} else if (!(*iptr & 0x08)) {
+			c = ((iptr[0] & 0x07) << 18) | ((iptr[1] & 0x3f) << 12) | ((iptr[2] & 0x3f) << 6) | (iptr[3] & 0x3f);
+			iptr += 4;
+		}
+
+		*optr++ = c;
+		max_length--;
+	}
+	if (offsetmap)
+		*offsetmap = (int)(iptr - (unsigned char*)input);
+	*optr = 0;
+	return (int)(optr - output);
+}
+
+static int copy_char8_to_char32(PCRE2_SPTR8 input, PCRE2_UCHAR32 *output, int max_length)
+{
+	PCRE2_SPTR8 iptr = input;
+	PCRE2_UCHAR32 *optr = output;
+
+	if (max_length == 0)
+		return 0;
+
+	while (*iptr && max_length > 1) {
+		*optr++ = *iptr++;
+		max_length--;
+	}
+	*optr = '\0';
+	return (int)(optr - output);
+}
+
+#define REGTEST_MAX_LENGTH32 4096
+static PCRE2_UCHAR32 regtest_buf32[REGTEST_MAX_LENGTH32];
+static int regtest_offsetmap32[REGTEST_MAX_LENGTH32];
+
+#endif /* SUPPORT_PCRE2_32 */
+
+static int check_ascii(const char *input)
+{
+	const unsigned char *ptr = (unsigned char *)input;
+	while (*ptr) {
+		if (*ptr > 127)
+			return 0;
+		ptr++;
+	}
+	return 1;
+}
+
+#define OVECTOR_SIZE 15
+
+static int regression_tests(void)
+{
+	struct regression_test_case *current = regression_test_cases;
+	int error;
+	PCRE2_SIZE err_offs;
+	int is_successful;
+	int is_ascii;
+	int total = 0;
+	int successful = 0;
+	int successful_row = 0;
+	int counter = 0;
+	int jit_compile_mode;
+	int utf = 0;
+	int disabled_options = 0;
+	int i;
+#ifdef SUPPORT_PCRE2_8
+	pcre2_code_8 *re8;
+	pcre2_compile_context_8 *ccontext8;
+	pcre2_match_data_8 *mdata8_1;
+	pcre2_match_data_8 *mdata8_2;
+	pcre2_match_context_8 *mcontext8;
+	PCRE2_SIZE *ovector8_1 = NULL;
+	PCRE2_SIZE *ovector8_2 = NULL;
+	int return_value8[2];
+#endif
+#ifdef SUPPORT_PCRE2_16
+	pcre2_code_16 *re16;
+	pcre2_compile_context_16 *ccontext16;
+	pcre2_match_data_16 *mdata16_1;
+	pcre2_match_data_16 *mdata16_2;
+	pcre2_match_context_16 *mcontext16;
+	PCRE2_SIZE *ovector16_1 = NULL;
+	PCRE2_SIZE *ovector16_2 = NULL;
+	int return_value16[2];
+	int length16;
+#endif
+#ifdef SUPPORT_PCRE2_32
+	pcre2_code_32 *re32;
+	pcre2_compile_context_32 *ccontext32;
+	pcre2_match_data_32 *mdata32_1;
+	pcre2_match_data_32 *mdata32_2;
+	pcre2_match_context_32 *mcontext32;
+	PCRE2_SIZE *ovector32_1 = NULL;
+	PCRE2_SIZE *ovector32_2 = NULL;
+	int return_value32[2];
+	int length32;
+#endif
+
+#if defined SUPPORT_PCRE2_8
+	PCRE2_UCHAR8 cpu_info[128];
+#elif defined SUPPORT_PCRE2_16
+	PCRE2_UCHAR16 cpu_info[128];
+#elif defined SUPPORT_PCRE2_32
+	PCRE2_UCHAR32 cpu_info[128];
+#endif
+#if defined SUPPORT_UTF && ((defined(SUPPORT_PCRE2_8) + defined(SUPPORT_PCRE2_16) + defined(SUPPORT_PCRE2_32)) >= 2)
+	int return_value;
+#endif
+
+	/* This test compares the behaviour of interpreter and JIT. Although disabling
+	utf or ucp may make tests fail, if the pcre_exec result is the SAME, it is
+	still considered successful from pcre_jit_test point of view. */
+
+#if defined SUPPORT_PCRE2_8
+	pcre2_config_8(PCRE2_CONFIG_JITTARGET, &cpu_info);
+#elif defined SUPPORT_PCRE2_16
+	pcre2_config_16(PCRE2_CONFIG_JITTARGET, &cpu_info);
+#elif defined SUPPORT_PCRE2_32
+	pcre2_config_32(PCRE2_CONFIG_JITTARGET, &cpu_info);
+#endif
+
+	printf("Running JIT regression tests\n");
+	printf("  target CPU of SLJIT compiler: ");
+	for (i = 0; cpu_info[i]; i++)
+		printf("%c", (char)(cpu_info[i]));
+	printf("\n");
+
+#if defined SUPPORT_PCRE2_8
+	pcre2_config_8(PCRE2_CONFIG_UNICODE, &utf);
+#elif defined SUPPORT_PCRE2_16
+	pcre2_config_16(PCRE2_CONFIG_UNICODE, &utf);
+#elif defined SUPPORT_PCRE2_32
+	pcre2_config_32(PCRE2_CONFIG_UNICODE, &utf);
+#endif
+
+	if (!utf)
+		disabled_options |= PCRE2_UTF;
+#ifdef SUPPORT_PCRE2_8
+	printf("  in  8 bit mode with UTF-8  %s:\n", utf ? "enabled" : "disabled");
+#endif
+#ifdef SUPPORT_PCRE2_16
+	printf("  in 16 bit mode with UTF-16 %s:\n", utf ? "enabled" : "disabled");
+#endif
+#ifdef SUPPORT_PCRE2_32
+	printf("  in 32 bit mode with UTF-32 %s:\n", utf ? "enabled" : "disabled");
+#endif
+
+	while (current->pattern) {
+		/* printf("\nPattern: %s :\n", current->pattern); */
+		total++;
+		is_ascii = 0;
+		if (!(current->start_offset & F_PROPERTY))
+			is_ascii = check_ascii(current->pattern) && check_ascii(current->input);
+
+		if (current->match_options & PCRE2_PARTIAL_SOFT)
+			jit_compile_mode = PCRE2_JIT_PARTIAL_SOFT;
+		else if (current->match_options & PCRE2_PARTIAL_HARD)
+			jit_compile_mode = PCRE2_JIT_PARTIAL_HARD;
+		else
+			jit_compile_mode = PCRE2_JIT_COMPLETE;
+		error = 0;
+#ifdef SUPPORT_PCRE2_8
+		re8 = NULL;
+		ccontext8 = pcre2_compile_context_create_8(NULL);
+		if (ccontext8) {
+			if (GET_NEWLINE(current->newline))
+				pcre2_set_newline_8(ccontext8, GET_NEWLINE(current->newline));
+			if (GET_BSR(current->newline))
+				pcre2_set_bsr_8(ccontext8, GET_BSR(current->newline));
+
+			if (!(current->start_offset & F_NO8)) {
+				re8 = pcre2_compile_8((PCRE2_SPTR8)current->pattern, PCRE2_ZERO_TERMINATED,
+					current->compile_options & ~disabled_options,
+					&error, &err_offs, ccontext8);
+
+				if (!re8 && (utf || is_ascii))
+					printf("\n8 bit: Cannot compile pattern \"%s\": %d\n", current->pattern, error);
+			}
+			pcre2_compile_context_free_8(ccontext8);
+		}
+		else
+			printf("\n8 bit: Cannot allocate compile context\n");
+#endif
+#ifdef SUPPORT_PCRE2_16
+		if ((current->compile_options & PCRE2_UTF) || (current->start_offset & F_FORCECONV))
+			convert_utf8_to_utf16((PCRE2_SPTR8)current->pattern, regtest_buf16, NULL, REGTEST_MAX_LENGTH16);
+		else
+			copy_char8_to_char16((PCRE2_SPTR8)current->pattern, regtest_buf16, REGTEST_MAX_LENGTH16);
+
+		re16 = NULL;
+		ccontext16 = pcre2_compile_context_create_16(NULL);
+		if (ccontext16) {
+			if (GET_NEWLINE(current->newline))
+				pcre2_set_newline_16(ccontext16, GET_NEWLINE(current->newline));
+			if (GET_BSR(current->newline))
+				pcre2_set_bsr_16(ccontext16, GET_BSR(current->newline));
+
+			if (!(current->start_offset & F_NO16)) {
+				re16 = pcre2_compile_16(regtest_buf16, PCRE2_ZERO_TERMINATED,
+					current->compile_options & ~disabled_options,
+					&error, &err_offs, ccontext16);
+
+				if (!re16 && (utf || is_ascii))
+					printf("\n16 bit: Cannot compile pattern \"%s\": %d\n", current->pattern, error);
+			}
+			pcre2_compile_context_free_16(ccontext16);
+		}
+		else
+			printf("\n16 bit: Cannot allocate compile context\n");
+#endif
+#ifdef SUPPORT_PCRE2_32
+		if ((current->compile_options & PCRE2_UTF) || (current->start_offset & F_FORCECONV))
+			convert_utf8_to_utf32((PCRE2_SPTR8)current->pattern, regtest_buf32, NULL, REGTEST_MAX_LENGTH32);
+		else
+			copy_char8_to_char32((PCRE2_SPTR8)current->pattern, regtest_buf32, REGTEST_MAX_LENGTH32);
+
+		re32 = NULL;
+		ccontext32 = pcre2_compile_context_create_32(NULL);
+		if (ccontext32) {
+			if (GET_NEWLINE(current->newline))
+				pcre2_set_newline_32(ccontext32, GET_NEWLINE(current->newline));
+			if (GET_BSR(current->newline))
+				pcre2_set_bsr_32(ccontext32, GET_BSR(current->newline));
+
+			if (!(current->start_offset & F_NO32)) {
+				re32 = pcre2_compile_32(regtest_buf32, PCRE2_ZERO_TERMINATED,
+					current->compile_options & ~disabled_options,
+					&error, &err_offs, ccontext32);
+
+				if (!re32 && (utf || is_ascii))
+					printf("\n32 bit: Cannot compile pattern \"%s\": %d\n", current->pattern, error);
+			}
+			pcre2_compile_context_free_32(ccontext32);
+		}
+		else
+			printf("\n32 bit: Cannot allocate compile context\n");
+#endif
+
+		counter++;
+		if ((counter & 0x3) != 0) {
+#ifdef SUPPORT_PCRE2_8
+			setstack8(NULL);
+#endif
+#ifdef SUPPORT_PCRE2_16
+			setstack16(NULL);
+#endif
+#ifdef SUPPORT_PCRE2_32
+			setstack32(NULL);
+#endif
+		}
+
+#ifdef SUPPORT_PCRE2_8
+		return_value8[0] = -1000;
+		return_value8[1] = -1000;
+		mdata8_1 = pcre2_match_data_create_8(OVECTOR_SIZE, NULL);
+		mdata8_2 = pcre2_match_data_create_8(OVECTOR_SIZE, NULL);
+		mcontext8 = pcre2_match_context_create_8(NULL);
+		if (!mdata8_1 || !mdata8_2 || !mcontext8) {
+			printf("\n8 bit: Cannot allocate match data\n");
+			pcre2_match_data_free_8(mdata8_1);
+			pcre2_match_data_free_8(mdata8_2);
+			pcre2_match_context_free_8(mcontext8);
+			pcre2_code_free_8(re8);
+			re8 = NULL;
+		} else {
+			ovector8_1 = pcre2_get_ovector_pointer_8(mdata8_1);
+			ovector8_2 = pcre2_get_ovector_pointer_8(mdata8_2);
+			for (i = 0; i < OVECTOR_SIZE * 3; ++i)
+				ovector8_1[i] = -2;
+			for (i = 0; i < OVECTOR_SIZE * 3; ++i)
+				ovector8_2[i] = -2;
+		}
+		if (re8) {
+			return_value8[1] = pcre2_match_8(re8, (PCRE2_SPTR8)current->input, strlen(current->input),
+				current->start_offset & OFFSET_MASK, current->match_options, mdata8_2, NULL);
+
+			if (pcre2_jit_compile_8(re8, jit_compile_mode)) {
+				printf("\n8 bit: JIT compiler does not support \"%s\"\n", current->pattern);
+			} else if ((counter & 0x1) != 0) {
+				setstack8(mcontext8);
+				return_value8[0] = pcre2_match_8(re8, (PCRE2_SPTR8)current->input, strlen(current->input),
+					current->start_offset & OFFSET_MASK, current->match_options, mdata8_1, mcontext8);
+			} else {
+				pcre2_jit_stack_assign_8(mcontext8, NULL, getstack8());
+				return_value8[0] = pcre2_jit_match_8(re8, (PCRE2_SPTR8)current->input, strlen(current->input),
+					current->start_offset & OFFSET_MASK, current->match_options, mdata8_1, mcontext8);
+			}
+		}
+#endif
+
+#ifdef SUPPORT_PCRE2_16
+		return_value16[0] = -1000;
+		return_value16[1] = -1000;
+		mdata16_1 = pcre2_match_data_create_16(OVECTOR_SIZE, NULL);
+		mdata16_2 = pcre2_match_data_create_16(OVECTOR_SIZE, NULL);
+		mcontext16 = pcre2_match_context_create_16(NULL);
+		if (!mdata16_1 || !mdata16_2 || !mcontext16) {
+			printf("\n16 bit: Cannot allocate match data\n");
+			pcre2_match_data_free_16(mdata16_1);
+			pcre2_match_data_free_16(mdata16_2);
+			pcre2_match_context_free_16(mcontext16);
+			pcre2_code_free_16(re16);
+			re16 = NULL;
+		} else {
+			ovector16_1 = pcre2_get_ovector_pointer_16(mdata16_1);
+			ovector16_2 = pcre2_get_ovector_pointer_16(mdata16_2);
+			for (i = 0; i < OVECTOR_SIZE * 3; ++i)
+				ovector16_1[i] = -2;
+			for (i = 0; i < OVECTOR_SIZE * 3; ++i)
+				ovector16_2[i] = -2;
+		}
+		if (re16) {
+			if ((current->compile_options & PCRE2_UTF) || (current->start_offset & F_FORCECONV))
+				length16 = convert_utf8_to_utf16((PCRE2_SPTR8)current->input, regtest_buf16, regtest_offsetmap16, REGTEST_MAX_LENGTH16);
+			else
+				length16 = copy_char8_to_char16((PCRE2_SPTR8)current->input, regtest_buf16, REGTEST_MAX_LENGTH16);
+
+			return_value16[1] = pcre2_match_16(re16, regtest_buf16, length16,
+				current->start_offset & OFFSET_MASK, current->match_options, mdata16_2, NULL);
+
+			if (pcre2_jit_compile_16(re16, jit_compile_mode)) {
+				printf("\n16 bit: JIT compiler does not support \"%s\"\n", current->pattern);
+			} else if ((counter & 0x1) != 0) {
+				setstack16(mcontext16);
+				return_value16[0] = pcre2_match_16(re16, regtest_buf16, length16,
+					current->start_offset & OFFSET_MASK, current->match_options, mdata16_1, mcontext16);
+			} else {
+				pcre2_jit_stack_assign_16(mcontext16, NULL, getstack16());
+				return_value16[0] = pcre2_jit_match_16(re16, regtest_buf16, length16,
+					current->start_offset & OFFSET_MASK, current->match_options, mdata16_1, mcontext16);
+			}
+		}
+#endif
+
+#ifdef SUPPORT_PCRE2_32
+		return_value32[0] = -1000;
+		return_value32[1] = -1000;
+		mdata32_1 = pcre2_match_data_create_32(OVECTOR_SIZE, NULL);
+		mdata32_2 = pcre2_match_data_create_32(OVECTOR_SIZE, NULL);
+		mcontext32 = pcre2_match_context_create_32(NULL);
+		if (!mdata32_1 || !mdata32_2 || !mcontext32) {
+			printf("\n32 bit: Cannot allocate match data\n");
+			pcre2_match_data_free_32(mdata32_1);
+			pcre2_match_data_free_32(mdata32_2);
+			pcre2_match_context_free_32(mcontext32);
+			pcre2_code_free_32(re32);
+			re32 = NULL;
+		} else {
+			ovector32_1 = pcre2_get_ovector_pointer_32(mdata32_1);
+			ovector32_2 = pcre2_get_ovector_pointer_32(mdata32_2);
+			for (i = 0; i < OVECTOR_SIZE * 3; ++i)
+				ovector32_1[i] = -2;
+			for (i = 0; i < OVECTOR_SIZE * 3; ++i)
+				ovector32_2[i] = -2;
+		}
+		if (re32) {
+			if ((current->compile_options & PCRE2_UTF) || (current->start_offset & F_FORCECONV))
+				length32 = convert_utf8_to_utf32((PCRE2_SPTR8)current->input, regtest_buf32, regtest_offsetmap32, REGTEST_MAX_LENGTH32);
+			else
+				length32 = copy_char8_to_char32((PCRE2_SPTR8)current->input, regtest_buf32, REGTEST_MAX_LENGTH32);
+
+			return_value32[1] = pcre2_match_32(re32, regtest_buf32, length32,
+				current->start_offset & OFFSET_MASK, current->match_options, mdata32_2, NULL);
+
+			if (pcre2_jit_compile_32(re32, jit_compile_mode)) {
+				printf("\n32 bit: JIT compiler does not support \"%s\"\n", current->pattern);
+			} else if ((counter & 0x1) != 0) {
+				setstack32(mcontext32);
+				return_value32[0] = pcre2_match_32(re32, regtest_buf32, length32,
+					current->start_offset & OFFSET_MASK, current->match_options, mdata32_1, mcontext32);
+			} else {
+				pcre2_jit_stack_assign_32(mcontext32, NULL, getstack32());
+				return_value32[0] = pcre2_jit_match_32(re32, regtest_buf32, length32,
+					current->start_offset & OFFSET_MASK, current->match_options, mdata32_1, mcontext32);
+			}
+		}
+#endif
+
+		/* printf("[%d-%d-%d|%d-%d|%d-%d|%d-%d]%s",
+			return_value8[0], return_value16[0], return_value32[0],
+			(int)ovector8_1[0], (int)ovector8_1[1],
+			(int)ovector16_1[0], (int)ovector16_1[1],
+			(int)ovector32_1[0], (int)ovector32_1[1],
+			(current->compile_options & PCRE2_CASELESS) ? "C" : ""); */
+
+		/* If F_DIFF is set, just run the test, but do not compare the results.
+		Segfaults can still be captured. */
+
+		is_successful = 1;
+		if (!(current->start_offset & F_DIFF)) {
+#if defined SUPPORT_UTF && ((defined(SUPPORT_PCRE2_8) + defined(SUPPORT_PCRE2_16) + defined(SUPPORT_PCRE2_32)) >= 2)
+			if (!(current->start_offset & F_FORCECONV)) {
+
+				/* All results must be the same. */
+#ifdef SUPPORT_PCRE2_8
+				if ((return_value = return_value8[0]) != return_value8[1]) {
+					printf("\n8 bit: Return value differs(J8:%d,I8:%d): [%d] '%s' @ '%s'\n",
+						return_value8[0], return_value8[1], total, current->pattern, current->input);
+					is_successful = 0;
+				} else
+#endif
+#ifdef SUPPORT_PCRE2_16
+				if ((return_value = return_value16[0]) != return_value16[1]) {
+					printf("\n16 bit: Return value differs(J16:%d,I16:%d): [%d] '%s' @ '%s'\n",
+						return_value16[0], return_value16[1], total, current->pattern, current->input);
+					is_successful = 0;
+				} else
+#endif
+#ifdef SUPPORT_PCRE2_32
+				if ((return_value = return_value32[0]) != return_value32[1]) {
+					printf("\n32 bit: Return value differs(J32:%d,I32:%d): [%d] '%s' @ '%s'\n",
+						return_value32[0], return_value32[1], total, current->pattern, current->input);
+					is_successful = 0;
+				} else
+#endif
+#if defined SUPPORT_PCRE2_8 && defined SUPPORT_PCRE2_16
+				if (return_value8[0] != return_value16[0]) {
+					printf("\n8 and 16 bit: Return value differs(J8:%d,J16:%d): [%d] '%s' @ '%s'\n",
+						return_value8[0], return_value16[0],
+						total, current->pattern, current->input);
+					is_successful = 0;
+				} else
+#endif
+#if defined SUPPORT_PCRE2_8 && defined SUPPORT_PCRE2_32
+				if (return_value8[0] != return_value32[0]) {
+					printf("\n8 and 32 bit: Return value differs(J8:%d,J32:%d): [%d] '%s' @ '%s'\n",
+						return_value8[0], return_value32[0],
+						total, current->pattern, current->input);
+					is_successful = 0;
+				} else
+#endif
+#if defined SUPPORT_PCRE2_16 && defined SUPPORT_PCRE2_32
+				if (return_value16[0] != return_value32[0]) {
+					printf("\n16 and 32 bit: Return value differs(J16:%d,J32:%d): [%d] '%s' @ '%s'\n",
+						return_value16[0], return_value32[0],
+						total, current->pattern, current->input);
+					is_successful = 0;
+				} else
+#endif
+				if (return_value >= 0 || return_value == PCRE_ERROR_PARTIAL) {
+					if (return_value == PCRE_ERROR_PARTIAL) {
+						return_value = 2;
+					} else {
+						return_value *= 2;
+					}
+#ifdef SUPPORT_PCRE2_8
+					return_value8[0] = return_value;
+#endif
+#ifdef SUPPORT_PCRE2_16
+					return_value16[0] = return_value;
+#endif
+#ifdef SUPPORT_PCRE2_32
+					return_value32[0] = return_value;
+#endif
+					/* Transform back the results. */
+					if (current->flags & PCRE_UTF8) {
+#ifdef SUPPORT_PCRE2_16
+						for (i = 0; i < return_value; ++i) {
+							if (ovector16_1[i] >= 0)
+								ovector16_1[i] = regtest_offsetmap16[ovector16_1[i]];
+							if (ovector16_2[i] >= 0)
+								ovector16_2[i] = regtest_offsetmap16[ovector16_2[i]];
+						}
+#endif
+#ifdef SUPPORT_PCRE2_32
+						for (i = 0; i < return_value; ++i) {
+							if (ovector32_1[i] >= 0)
+								ovector32_1[i] = regtest_offsetmap32[ovector32_1[i]];
+							if (ovector32_2[i] >= 0)
+								ovector32_2[i] = regtest_offsetmap32[ovector32_2[i]];
+						}
+#endif
+					}
+
+					for (i = 0; i < return_value; ++i) {
+#if defined SUPPORT_PCRE2_8 && defined SUPPORT_PCRE2_16
+						if (ovector8_1[i] != ovector8_2[i] || ovector8_1[i] != ovector16_1[i] || ovector8_1[i] != ovector16_2[i]) {
+							printf("\n8 and 16 bit: Ovector[%d] value differs(J8:%d,I8:%d,J16:%d,I16:%d): [%d] '%s' @ '%s' \n",
+								i, ovector8_1[i], ovector8_2[i], ovector16_1[i], ovector16_2[i],
+								total, current->pattern, current->input);
+							is_successful = 0;
+						}
+#endif
+#if defined SUPPORT_PCRE2_8 && defined SUPPORT_PCRE2_32
+						if (ovector8_1[i] != ovector8_2[i] || ovector8_1[i] != ovector32_1[i] || ovector8_1[i] != ovector32_2[i]) {
+							printf("\n8 and 32 bit: Ovector[%d] value differs(J8:%d,I8:%d,J32:%d,I32:%d): [%d] '%s' @ '%s' \n",
+								i, ovector8_1[i], ovector8_2[i], ovector32_1[i], ovector32_2[i],
+								total, current->pattern, current->input);
+							is_successful = 0;
+						}
+#endif
+#if defined SUPPORT_PCRE2_16 && defined SUPPORT_PCRE2_16
+						if (ovector16_1[i] != ovector16_2[i] || ovector16_1[i] != ovector16_1[i] || ovector16_1[i] != ovector16_2[i]) {
+							printf("\n16 and 16 bit: Ovector[%d] value differs(J16:%d,I16:%d,J32:%d,I32:%d): [%d] '%s' @ '%s' \n",
+								i, ovector16_1[i], ovector16_2[i], ovector16_1[i], ovector16_2[i],
+								total, current->pattern, current->input);
+							is_successful = 0;
+						}
+#endif
+					}
+				}
+			} else
+#endif /* more than one of SUPPORT_PCRE2_8, SUPPORT_PCRE2_16 and SUPPORT_PCRE2_32 */
+			{
+#ifdef SUPPORT_PCRE2_8
+				if (return_value8[0] != return_value8[1]) {
+					printf("\n8 bit: Return value differs(%d:%d): [%d] '%s' @ '%s'\n",
+						return_value8[0], return_value8[1], total, current->pattern, current->input);
+					is_successful = 0;
+				} else if (return_value8[0] >= 0 || return_value8[0] == PCRE2_ERROR_PARTIAL) {
+					if (return_value8[0] == PCRE2_ERROR_PARTIAL)
+						return_value8[0] = 2;
+					else
+						return_value8[0] *= 2;
+
+					for (i = 0; i < return_value8[0]; ++i)
+						if (ovector8_1[i] != ovector8_2[i]) {
+							printf("\n8 bit: Ovector[%d] value differs(%d:%d): [%d] '%s' @ '%s'\n",
+								i, (int)ovector8_1[i], (int)ovector8_2[i], total, current->pattern, current->input);
+							is_successful = 0;
+						}
+				}
+#endif
+
+#ifdef SUPPORT_PCRE2_16
+				if (return_value16[0] != return_value16[1]) {
+					printf("\n16 bit: Return value differs(%d:%d): [%d] '%s' @ '%s'\n",
+						return_value16[0], return_value16[1], total, current->pattern, current->input);
+					is_successful = 0;
+				} else if (return_value16[0] >= 0 || return_value16[0] == PCRE2_ERROR_PARTIAL) {
+					if (return_value16[0] == PCRE2_ERROR_PARTIAL)
+						return_value16[0] = 2;
+					else
+						return_value16[0] *= 2;
+
+					for (i = 0; i < return_value16[0]; ++i)
+						if (ovector16_1[i] != ovector16_2[i]) {
+							printf("\n16 bit: Ovector[%d] value differs(%d:%d): [%d] '%s' @ '%s'\n",
+								i, (int)ovector16_1[i], (int)ovector16_2[i], total, current->pattern, current->input);
+							is_successful = 0;
+						}
+				}
+#endif
+
+#ifdef SUPPORT_PCRE2_32
+				if (return_value32[0] != return_value32[1]) {
+					printf("\n32 bit: Return value differs(%d:%d): [%d] '%s' @ '%s'\n",
+						return_value32[0], return_value32[1], total, current->pattern, current->input);
+					is_successful = 0;
+				} else if (return_value32[0] >= 0 || return_value32[0] == PCRE2_ERROR_PARTIAL) {
+					if (return_value32[0] == PCRE2_ERROR_PARTIAL)
+						return_value32[0] = 2;
+					else
+						return_value32[0] *= 2;
+
+					for (i = 0; i < return_value32[0]; ++i)
+						if (ovector32_1[i] != ovector32_2[i]) {
+							printf("\n32 bit: Ovector[%d] value differs(%d:%d): [%d] '%s' @ '%s'\n",
+								i, (int)ovector32_1[i], (int)ovector32_2[i], total, current->pattern, current->input);
+							is_successful = 0;
+						}
+				}
+#endif
+			}
+		}
+
+		if (is_successful) {
+#ifdef SUPPORT_PCRE2_8
+			if (!(current->start_offset & F_NO8) && (utf || is_ascii)) {
+				if (return_value8[0] < 0 && !(current->start_offset & F_NOMATCH)) {
+					printf("8 bit: Test should match: [%d] '%s' @ '%s'\n",
+						total, current->pattern, current->input);
+					is_successful = 0;
+				}
+
+				if (return_value8[0] >= 0 && (current->start_offset & F_NOMATCH)) {
+					printf("8 bit: Test should not match: [%d] '%s' @ '%s'\n",
+						total, current->pattern, current->input);
+					is_successful = 0;
+				}
+			}
+#endif
+#ifdef SUPPORT_PCRE2_16
+			if (!(current->start_offset & F_NO16) && (utf || is_ascii)) {
+				if (return_value16[0] < 0 && !(current->start_offset & F_NOMATCH)) {
+					printf("16 bit: Test should match: [%d] '%s' @ '%s'\n",
+						total, current->pattern, current->input);
+					is_successful = 0;
+				}
+
+				if (return_value16[0] >= 0 && (current->start_offset & F_NOMATCH)) {
+					printf("16 bit: Test should not match: [%d] '%s' @ '%s'\n",
+						total, current->pattern, current->input);
+					is_successful = 0;
+				}
+			}
+#endif
+#ifdef SUPPORT_PCRE2_32
+			if (!(current->start_offset & F_NO32) && (utf || is_ascii)) {
+				if (return_value32[0] < 0 && !(current->start_offset & F_NOMATCH)) {
+					printf("32 bit: Test should match: [%d] '%s' @ '%s'\n",
+						total, current->pattern, current->input);
+					is_successful = 0;
+				}
+
+				if (return_value32[0] >= 0 && (current->start_offset & F_NOMATCH)) {
+					printf("32 bit: Test should not match: [%d] '%s' @ '%s'\n",
+						total, current->pattern, current->input);
+					is_successful = 0;
+				}
+			}
+#endif
+		}
+
+		if (is_successful) {
+#ifdef SUPPORT_PCRE2_8
+			if (re8 && !(current->start_offset & F_NO8) && pcre2_get_mark_8(mdata8_1) != pcre2_get_mark_8(mdata8_2)) {
+				printf("8 bit: Mark value mismatch: [%d] '%s' @ '%s'\n",
+					total, current->pattern, current->input);
+				is_successful = 0;
+			}
+#endif
+#ifdef SUPPORT_PCRE2_16
+			if (re16 && !(current->start_offset & F_NO16) && pcre2_get_mark_16(mdata16_1) != pcre2_get_mark_16(mdata16_2)) {
+				printf("16 bit: Mark value mismatch: [%d] '%s' @ '%s'\n",
+					total, current->pattern, current->input);
+				is_successful = 0;
+			}
+#endif
+#ifdef SUPPORT_PCRE2_32
+			if (re32 && !(current->start_offset & F_NO32) && pcre2_get_mark_32(mdata32_1) != pcre2_get_mark_32(mdata32_2)) {
+				printf("32 bit: Mark value mismatch: [%d] '%s' @ '%s'\n",
+					total, current->pattern, current->input);
+				is_successful = 0;
+			}
+#endif
+		}
+
+#ifdef SUPPORT_PCRE2_8
+		pcre2_code_free_8(re8);
+		pcre2_match_data_free_8(mdata8_1);
+		pcre2_match_data_free_8(mdata8_2);
+		pcre2_match_context_free_8(mcontext8);
+#endif
+#ifdef SUPPORT_PCRE2_16
+		pcre2_code_free_16(re16);
+		pcre2_match_data_free_16(mdata16_1);
+		pcre2_match_data_free_16(mdata16_2);
+		pcre2_match_context_free_16(mcontext16);
+#endif
+#ifdef SUPPORT_PCRE2_32
+		pcre2_code_free_32(re32);
+		pcre2_match_data_free_32(mdata32_1);
+		pcre2_match_data_free_32(mdata32_2);
+		pcre2_match_context_free_32(mcontext32);
+#endif
+
+		if (is_successful) {
+			successful++;
+			successful_row++;
+			printf(".");
+			if (successful_row >= 60) {
+				successful_row = 0;
+				printf("\n");
+			}
+		} else
+			successful_row = 0;
+
+		fflush(stdout);
+		current++;
+	}
+#ifdef SUPPORT_PCRE2_8
+	setstack8(NULL);
+#endif
+#ifdef SUPPORT_PCRE2_16
+	setstack16(NULL);
+#endif
+#ifdef SUPPORT_PCRE2_32
+	setstack32(NULL);
+#endif
+
+	if (total == successful) {
+		printf("\nAll JIT regression tests are successfully passed.\n");
+		return 0;
+	} else {
+		printf("\nSuccessful test ratio: %d%% (%d failed)\n", successful * 100 / total, total - successful);
+		return 1;
+	}
+}
+
+/* End of pcre2_jit_test.c */
diff --git a/dist/pcre_maketables.c b/dist2/src/pcre2_maketables.c
similarity index 78%
rename from dist/pcre_maketables.c
rename to dist2/src/pcre2_maketables.c
index a44a6ea..2c7ae84 100644
--- a/dist/pcre_maketables.c
+++ b/dist2/src/pcre2_maketables.c
@@ -6,7 +6,8 @@
 and semantics are as close as possible to those of the Perl 5 language.
 
                        Written by Philip Hazel
-           Copyright (c) 1997-2012 University of Cambridge
+     Original API code Copyright (c) 1997-2012 University of Cambridge
+         New API code Copyright (c) 2016 University of Cambridge
 
 -----------------------------------------------------------------------------
 Redistribution and use in source and binary forms, with or without
@@ -38,53 +39,53 @@
 */
 
 
-/* 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
+/* This module contains the external function pcre2_maketables(), which builds
+character tables for PCRE2 in the current locale. The file is compiled on its
+own as part of the PCRE2 library. However, it is also included in the
 compilation of dftables.c, in which case the macro DFTABLES is defined. */
 
-
 #ifndef DFTABLES
 #  ifdef HAVE_CONFIG_H
 #  include "config.h"
 #  endif
-#  include "pcre_internal.h"
+#  include "pcre2_internal.h"
 #endif
 
 
+
 /*************************************************
-*           Create PCRE character tables         *
+*           Create PCRE2 character tables        *
 *************************************************/
 
-/* This function builds a set of character tables for use by PCRE and returns
+/* This function builds a set of character tables for use by PCRE2 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 PUBL(malloc)(), but when
-compiled inside dftables, use malloc().
+part of the library, the store is obtained via a general context malloc, if
+supplied, but when DFTABLES is defined (when compiling the dftables auxiliary
+program) malloc() is used, and the function has a different name so as not to
+clash with the prototype in pcre2.h.
 
-Arguments:   none
+Arguments:   none when DFTABLES is defined
+             else a PCRE2 general context or NULL
 Returns:     pointer to the contiguous block of data
 */
 
-#if defined COMPILE_PCRE8
-const unsigned char *
-pcre_maketables(void)
-#elif defined COMPILE_PCRE16
-const unsigned char *
-pcre16_maketables(void)
-#elif defined COMPILE_PCRE32
-const unsigned char *
-pcre32_maketables(void)
-#endif
+#ifdef DFTABLES  /* Included in freestanding dftables.c program */
+static const uint8_t *maketables(void)
 {
-unsigned char *yield, *p;
-int i;
+uint8_t *yield = (uint8_t *)malloc(tables_length);
 
-#ifndef DFTABLES
-yield = (unsigned char*)(PUBL(malloc))(tables_length);
-#else
-yield = (unsigned char*)malloc(tables_length);
-#endif
+#else  /* Not DFTABLES, compiling the library */
+PCRE2_EXP_DEFN const uint8_t * PCRE2_CALL_CONVENTION
+pcre2_maketables(pcre2_general_context *gcontext)
+{
+uint8_t *yield = (uint8_t *)((gcontext != NULL)?
+  gcontext->memctl.malloc(tables_length, gcontext->memctl.memory_data) :
+  malloc(tables_length));
+#endif  /* DFTABLES */
+
+int i;
+uint8_t *p;
 
 if (yield == NULL) return NULL;
 p = yield;
@@ -153,4 +154,4 @@
 return yield;
 }
 
-/* End of pcre_maketables.c */
+/* End of pcre2_maketables.c */
diff --git a/dist/pcre_exec.c b/dist2/src/pcre2_match.c
similarity index 65%
rename from dist/pcre_exec.c
rename to dist2/src/pcre2_match.c
index 24b23ca..f5275c7 100644
--- a/dist/pcre_exec.c
+++ b/dist2/src/pcre2_match.c
@@ -6,7 +6,8 @@
 and semantics are as close as possible to those of the Perl 5 language.
 
                        Written by Philip Hazel
-           Copyright (c) 1997-2014 University of Cambridge
+     Original API code Copyright (c) 1997-2012 University of Cambridge
+         New API code Copyright (c) 2016 University of Cambridge
 
 -----------------------------------------------------------------------------
 Redistribution and use in source and binary forms, with or without
@@ -37,26 +38,30 @@
 -----------------------------------------------------------------------------
 */
 
-/* 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. */
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
 #endif
 
-#define NLBLOCK md             /* Block containing newline information */
+#define NLBLOCK mb             /* Block containing newline information */
 #define PSSTART start_subject  /* Field containing processed string start */
 #define PSEND   end_subject    /* Field containing processed string end */
 
-#include "pcre_internal.h"
+#include "pcre2_internal.h"
 
-/* Undefine some potentially clashing cpp symbols */
+/* Masks for identifying the public options that are permitted at match time.
+*/
 
-#undef min
-#undef max
+#define PUBLIC_MATCH_OPTIONS \
+  (PCRE2_ANCHORED|PCRE2_NOTBOL|PCRE2_NOTEOL|PCRE2_NOTEMPTY| \
+   PCRE2_NOTEMPTY_ATSTART|PCRE2_NO_UTF_CHECK|PCRE2_PARTIAL_HARD| \
+   PCRE2_PARTIAL_SOFT)
 
-/* The md->capture_last field uses the lower 16 bits for the last captured
+#define PUBLIC_JIT_MATCH_OPTIONS \
+   (PCRE2_NO_UTF_CHECK|PCRE2_NOTBOL|PCRE2_NOTEOL|PCRE2_NOTEMPTY|\
+    PCRE2_NOTEMPTY_ATSTART|PCRE2_PARTIAL_SOFT|PCRE2_PARTIAL_HARD)
+
+/* The mb->capture_last field uses the lower 16 bits for the last captured
 substring (which can never be greater than 65535) and a bit in the top half
 to mean "capture vector overflowed". This odd way of doing things was
 implemented when it was realized that preserving and restoring the overflow bit
@@ -70,7 +75,7 @@
 #define OVFLMASK    0xffff0000    /* The bits used for the overflow flag */
 #define OVFLBIT     0x00010000    /* The bit that is set for overflow */
 
-/* Values for setting in md->match_function_type to indicate two special types
+/* Bits for setting in mb->match_function_type to indicate two special types
 of call to match(). We do it this way to save on using another stack variable,
 as stack usage is to be discouraged. */
 
@@ -78,7 +83,7 @@
 #define MATCH_CBEGROUP       2  /* Could-be-empty unlimited repeat group */
 
 /* Non-error returns from the match() function. Error returns are externally
-defined PCRE_ERROR_xxx codes, which are all negative. */
+defined PCRE2_ERROR_xxx codes, which are all negative. */
 
 #define MATCH_MATCH        1
 #define MATCH_NOMATCH      0
@@ -99,44 +104,17 @@
 #define MATCH_BACKTRACK_MAX MATCH_THEN
 #define MATCH_BACKTRACK_MIN MATCH_COMMIT
 
-/* 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, 0, 0, 0, 1, 0, };
 static const char rep_max[] = { 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, };
 
-#ifdef PCRE_DEBUG
-/*************************************************
-*        Debugging function to print chars       *
-*************************************************/
+/* Maximum number of ovector elements that can be saved on the system stack
+when processing OP_RECURSE in non-HEAP_MATCH_RECURSE mode. If the ovector is
+bigger, malloc() is used. This value should be a multiple of 3, because the
+ovector length is always a multiple of 3. */
 
-/* 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 pcre_uchar *p, int length, BOOL is_subject, match_data *md)
-{
-pcre_uint32 c;
-BOOL utf = md->utf;
-if (is_subject && length > md->end_subject - p) length = md->end_subject - p;
-while (length-- > 0)
-  if (isprint(c = UCHAR21INCTEST(p))) printf("%c", (char)c); else printf("\\x{%02x}", c);
-}
-#endif
+#define OP_RECURSE_STACK_SAVE_MAX 45
 
 
 
@@ -144,62 +122,62 @@
 *          Match a back-reference                *
 *************************************************/
 
-/* Normally, if a back reference hasn't been set, the length that is passed is
-negative, so the match always fails. However, in JavaScript compatibility mode,
-the length passed is zero. Note that in caseless UTF-8 mode, the number of
-subject bytes matched may be different to the number of reference bytes.
+/* This function is called only when it is known that the offset lies within
+the offsets that have so far been used in the match. Note that in caseless
+UTF-8 mode, the number of subject bytes matched may be different to the number
+of reference bytes. (In theory this could also happen in UTF-16 mode, but it
+seems unlikely.)
 
 Arguments:
   offset      index into the offset vector
+  offset_top  top of the used offset vector
   eptr        pointer into the subject
-  length      length of reference to be matched (number of bytes)
-  md          points to match data block
+  mb          points to match block
   caseless    TRUE if caseless
+  lengthptr   pointer for returning the length matched
 
-Returns:      >= 0 the number of subject bytes matched
-              -1 no match
-              -2 partial match; always given if at end subject
+Returns:      = 0 sucessful match; number of code units matched is set
+              < 0 no match
+              > 0 partial match
 */
 
 static int
-match_ref(int offset, register PCRE_PUCHAR eptr, int length, match_data *md,
-  BOOL caseless)
+match_ref(PCRE2_SIZE offset, PCRE2_SIZE offset_top, register PCRE2_SPTR eptr,
+  match_block *mb, BOOL caseless, PCRE2_SIZE *lengthptr)
 {
-PCRE_PUCHAR eptr_start = eptr;
-register PCRE_PUCHAR p = md->start_subject + md->offset_vector[offset];
-#if defined SUPPORT_UTF && defined SUPPORT_UCP
-BOOL utf = md->utf;
+#if defined SUPPORT_UNICODE
+BOOL utf = (mb->poptions & PCRE2_UTF) != 0;
 #endif
 
-#ifdef PCRE_DEBUG
-if (eptr >= md->end_subject)
-  printf("matching subject <null>");
-else
+register PCRE2_SPTR p;
+PCRE2_SIZE length;
+PCRE2_SPTR eptr_start = eptr;
+
+/* Deal with an unset group. The default is no match, but there is an option to
+match an empty string. */
+
+if (offset >= offset_top || mb->ovector[offset] == PCRE2_UNSET)
   {
-  printf("matching subject ");
-  pchars(eptr, length, TRUE, md);
+  if ((mb->poptions & PCRE2_MATCH_UNSET_BACKREF) != 0)
+    {
+    *lengthptr = 0;
+    return 0;      /* Match */
+    }
+  else return -1;  /* No match */
   }
-printf(" against backref ");
-pchars(p, length, FALSE, md);
-printf("\n");
-#endif
 
-/* Always fail if reference not set (and not JavaScript compatible - in that
-case the length is passed as zero). */
+/* Separate the caseless and UTF cases for speed. */
 
-if (length < 0) return -1;
-
-/* Separate the caseless case for speed. In UTF-8 mode we can only do this
-properly if Unicode properties are supported. Otherwise, we can check only
-ASCII characters. */
+p = mb->start_subject + mb->ovector[offset];
+length = mb->ovector[offset+1] - mb->ovector[offset];
 
 if (caseless)
   {
-#if defined SUPPORT_UTF && defined SUPPORT_UCP
+#if defined SUPPORT_UNICODE
   if (utf)
     {
     /* Match characters up to the end of the reference. NOTE: the number of
-    data units matched may differ, because in UTF-8 there are some characters
+    code units matched may differ, because in UTF-8 there are some characters
     whose upper and lower case versions code have different numbers of bytes.
     For example, U+023A (2 bytes in UTF-8) is the upper case version of U+2C65
     (3 bytes in UTF-8); a sequence of 3 of the former uses 6 bytes, as does a
@@ -207,21 +185,21 @@
     length along the reference, not along the subject (earlier code did this
     wrong). */
 
-    PCRE_PUCHAR endptr = p + length;
+    PCRE2_SPTR endptr = p + length;
     while (p < endptr)
       {
-      pcre_uint32 c, d;
+      uint32_t c, d;
       const ucd_record *ur;
-      if (eptr >= md->end_subject) return -2;   /* Partial match */
+      if (eptr >= mb->end_subject) return 1;   /* Partial match */
       GETCHARINC(c, eptr);
       GETCHARINC(d, p);
       ur = GET_UCD(d);
-      if (c != d && c != d + ur->other_case)
+      if (c != d && c != (uint32_t)((int)d + ur->other_case))
         {
-        const pcre_uint32 *pp = PRIV(ucd_caseless_sets) + ur->caseset;
+        const uint32_t *pp = PRIV(ucd_caseless_sets) + ur->caseset;
         for (;;)
           {
-          if (c < *pp) return -1;
+          if (c < *pp) return -1;  /* No match */
           if (c == *pp++) break;
           }
         }
@@ -230,35 +208,37 @@
   else
 #endif
 
-  /* The same code works when not in UTF-8 mode and in UTF-8 mode when there
-  is no UCP support. */
+    /* Not in UTF mode */
+
     {
-    while (length-- > 0)
+    for (; length > 0; length--)
       {
-      pcre_uint32 cc, cp;
-      if (eptr >= md->end_subject) return -2;   /* Partial match */
+      uint32_t cc, cp;
+      if (eptr >= mb->end_subject) return 1;   /* Partial match */
       cc = UCHAR21TEST(eptr);
       cp = UCHAR21TEST(p);
-      if (TABLE_GET(cp, md->lcc, cp) != TABLE_GET(cc, md->lcc, cc)) return -1;
+      if (TABLE_GET(cp, mb->lcc, cp) != TABLE_GET(cc, mb->lcc, cc))
+        return -1;  /* No match */
       p++;
       eptr++;
       }
     }
   }
 
-/* In the caseful case, we can just compare the bytes, whether or not we
-are in UTF-8 mode. */
+/* In the caseful case, we can just compare the code units, whether or not we
+are in UTF mode. */
 
 else
   {
-  while (length-- > 0)
+  for (; length > 0; length--)
     {
-    if (eptr >= md->end_subject) return -2;   /* Partial match */
-    if (UCHAR21INCTEST(p) != UCHAR21INCTEST(eptr)) return -1;
+    if (eptr >= mb->end_subject) return 1;   /* Partial match */
+    if (UCHAR21INCTEST(p) != UCHAR21INCTEST(eptr)) return -1;  /*No match */
     }
   }
 
-return (int)(eptr - eptr_start);
+*lengthptr = eptr - eptr_start;
+return 0;  /* Match */
 }
 
 
@@ -268,7 +248,7 @@
                    RECURSION IN THE match() FUNCTION
 
 The match() function is highly recursive, though not every recursive call
-increases the recursive depth. Nevertheless, some regular expressions can cause
+increases the recursion depth. Nevertheless, some regular expressions can cause
 it to recurse to a great depth. 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
@@ -279,9 +259,9 @@
 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
+There is a fudge, triggered by defining HEAP_MATCH_RECURSE, which avoids
+recursive calls by keeping local variables that need to be preserved in blocks
+of memory on the heap 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.
 
@@ -310,38 +290,20 @@
        RM31,  RM32, RM33, RM34, RM35, RM36, RM37, RM38, RM39, RM40,
        RM41,  RM42, RM43, RM44, RM45, RM46, RM47, RM48, RM49, RM50,
        RM51,  RM52, RM53, RM54, RM55, RM56, RM57, RM58, RM59, RM60,
-       RM61,  RM62, RM63, RM64, RM65, RM66, RM67 };
+       RM61,  RM62, RM63, RM64, RM65, RM66, RM67, RM68 };
 
-/* These versions of the macros use the stack, as normal. There are debugging
-versions and production versions. Note that the "rw" argument of RMATCH isn't
-actually used in this definition. */
+/* These versions of the macros use the stack, as normal. Note that the "rw"
+argument of RMATCH isn't actually used in this definition. */
 
-#ifndef NO_RECURSE
+#ifndef HEAP_MATCH_RECURSE
 #define REGISTER register
-
-#ifdef PCRE_DEBUG
-#define RMATCH(ra,rb,rc,rd,re,rw) \
-  { \
-  printf("match() called in line %d\n", __LINE__); \
-  rrc = match(ra,rb,mstart,rc,rd,re,rdepth+1); \
-  printf("to line %d\n", __LINE__); \
-  }
-#define RRETURN(ra) \
-  { \
-  printf("match() returned %d from line %d\n", ra, __LINE__); \
-  return ra; \
-  }
-#else
 #define RMATCH(ra,rb,rc,rd,re,rw) \
   rrc = match(ra,rb,mstart,rc,rd,re,rdepth+1)
 #define RRETURN(ra) return ra
-#endif
-
 #else
 
-
 /* These versions of the macros manage a private stack on the heap. Note that
-the "rd" argument of RMATCH isn't actually used in this definition. It's the md
+the "rd" argument of RMATCH isn't actually used in this definition. It's the mb
 argument of match(), which never changes. */
 
 #define REGISTER
@@ -351,8 +313,9 @@
   heapframe *newframe = frame->Xnextframe;\
   if (newframe == NULL)\
     {\
-    newframe = (heapframe *)(PUBL(stack_malloc))(sizeof(heapframe));\
-    if (newframe == NULL) RRETURN(PCRE_ERROR_NOMEMORY);\
+    newframe = (heapframe *)(mb->stack_memctl.malloc)\
+      (sizeof(heapframe), mb->stack_memctl.memory_data);\
+    if (newframe == NULL) RRETURN(PCRE2_ERROR_NOMEMORY);\
     newframe->Xnextframe = NULL;\
     frame->Xnextframe = newframe;\
     }\
@@ -365,10 +328,8 @@
   newframe->Xrdepth = frame->Xrdepth + 1;\
   newframe->Xprevframe = frame;\
   frame = newframe;\
-  DPRINTF(("restarting from line %d\n", __LINE__));\
   goto HEAP_RECURSE;\
-  L_##rw:\
-  DPRINTF(("jumped back to line %d\n", __LINE__));\
+  L_##rw:;\
   }
 
 #define RRETURN(ra)\
@@ -384,67 +345,63 @@
   }
 
 
-/* Structure for remembering the local variables in a private frame */
+/* Structure for remembering the local variables in a private frame. Arrange it
+so as to minimize the number of holes. */
 
 typedef struct heapframe {
   struct heapframe *Xprevframe;
   struct heapframe *Xnextframe;
 
-  /* Function arguments that may change */
-
-  PCRE_PUCHAR Xeptr;
-  const pcre_uchar *Xecode;
-  PCRE_PUCHAR Xmstart;
-  int Xoffset_top;
-  eptrblock *Xeptrb;
-  unsigned int Xrdepth;
-
-  /* Function local variables */
-
-  PCRE_PUCHAR Xcallpat;
-#ifdef SUPPORT_UTF
-  PCRE_PUCHAR Xcharptr;
+#ifdef SUPPORT_UNICODE
+  PCRE2_SPTR Xcharptr;
 #endif
-  PCRE_PUCHAR Xdata;
-  PCRE_PUCHAR Xnext;
-  PCRE_PUCHAR Xpp;
-  PCRE_PUCHAR Xprev;
-  PCRE_PUCHAR Xsaved_eptr;
+  PCRE2_SPTR Xeptr;
+  PCRE2_SPTR Xecode;
+  PCRE2_SPTR Xmstart;
+  PCRE2_SPTR Xcallpat;
+  PCRE2_SPTR Xdata;
+  PCRE2_SPTR Xnext_ecode;
+  PCRE2_SPTR Xpp;
+  PCRE2_SPTR Xprev;
+  PCRE2_SPTR Xsaved_eptr;
 
-  recursion_info Xnew_recursive;
+  eptrblock *Xeptrb;
 
-  BOOL Xcur_is_word;
-  BOOL Xcondition;
-  BOOL Xprev_is_word;
+  PCRE2_SIZE Xlength;
+  PCRE2_SIZE Xoffset;
+  PCRE2_SIZE Xoffset_top;
+  PCRE2_SIZE Xsave_offset1, Xsave_offset2, Xsave_offset3;
 
-#ifdef SUPPORT_UCP
+  uint32_t Xfc;
+  uint32_t Xnumber;
+  uint32_t Xrdepth;
+  uint32_t Xop;
+  uint32_t Xsave_capture_last;
+
+#ifdef SUPPORT_UNICODE
+  uint32_t Xprop_value;
   int Xprop_type;
-  unsigned int Xprop_value;
   int Xprop_fail_result;
   int Xoclength;
-  pcre_uchar Xocchars[6];
 #endif
 
   int Xcodelink;
   int Xctype;
-  unsigned int Xfc;
   int Xfi;
-  int Xlength;
   int Xmax;
   int Xmin;
-  unsigned int Xnumber;
-  int Xoffset;
-  unsigned int Xop;
-  pcre_int32 Xsave_capture_last;
-  int Xsave_offset1, Xsave_offset2, Xsave_offset3;
-  int Xstacksave[REC_STACK_SAVE_MAX];
+  int Xwhere;    /* Where to jump back to */
+
+  BOOL Xcondition;
+  BOOL Xcur_is_word;
+  BOOL Xprev_is_word;
 
   eptrblock Xnewptrb;
+  recursion_info Xnew_recursive;
 
-  /* Where to jump back to */
-
-  int Xwhere;
-
+#ifdef SUPPORT_UNICODE
+  PCRE2_UCHAR Xocchars[6];
+#endif
 } heapframe;
 
 #endif
@@ -454,6 +411,115 @@
 ***************************************************************************/
 
 
+/* When HEAP_MATCH_RECURSE is not defined, the match() function implements
+backtrack points by calling itself recursively in all but one case. The one
+special case is when processing OP_RECURSE, which specifies recursion in the
+pattern. The entire ovector must be saved and restored while processing
+OP_RECURSE. If the ovector is small enough, instead of calling match()
+directly, op_recurse_ovecsave() is called. This function uses the system stack
+to save the ovector while calling match() to process the pattern recursion. */
+
+#ifndef HEAP_MATCH_RECURSE
+
+/* We need a prototype for match() because it is mutually recursive with
+op_recurse_ovecsave(). */
+
+static int
+match(REGISTER PCRE2_SPTR eptr, REGISTER PCRE2_SPTR ecode, PCRE2_SPTR mstart,
+  PCRE2_SIZE offset_top, match_block *mb, eptrblock *eptrb, uint32_t rdepth);
+
+
+/*************************************************
+*      Process OP_RECURSE, stacking ovector      *
+*************************************************/
+
+/* When this function is called, mb->recursive has already been updated to
+point to a new recursion data block, and all its fields other than ovec_save
+have been set.
+
+This function exists so that the local vector variable ovecsave is no longer
+defined in the match() function, as it was in PCRE1. It is used only when there
+is recursion in the pattern, so it wastes a lot of stack to have it defined for
+every call of match(). We now use this function as an indirect way of calling
+match() only in the case when ovecsave is needed. (David Wheeler used to say
+"All problems in computer science can be solved by another level of
+indirection.")
+
+HOWEVER: when this file is compiled by gcc in an optimizing mode, because this
+function is called only once, and only from within match(), gcc will "inline"
+it - that is, move it inside match() - and this completely negates its reason
+for existence. Therefore, we mark it as non-inline when gcc is in use.
+
+Arguments:
+  eptr        pointer to current character in subject
+  callpat     the recursion point in the pattern
+  mstart      pointer to the current match start position (can be modified
+                by encountering \K)
+  offset_top  current top pointer (highest ovector offset used + 1)
+  mb          pointer to "static" info block for the match
+  eptrb       pointer to chain of blocks containing eptr at start of
+                brackets - for testing for empty matches
+  rdepth      the recursion depth
+
+Returns:      a match() return code
+*/
+
+static int
+#ifdef __GNUC__
+__attribute__ ((noinline))
+#endif
+op_recurse_ovecsave(REGISTER PCRE2_SPTR eptr, PCRE2_SPTR callpat,
+  PCRE2_SPTR mstart, PCRE2_SIZE offset_top, match_block *mb, eptrblock *eptrb,
+  uint32_t rdepth)
+{
+register int rrc;
+BOOL cbegroup = *callpat >= OP_SBRA;
+recursion_info *new_recursive = mb->recursive;
+PCRE2_SIZE ovecsave[OP_RECURSE_STACK_SAVE_MAX];
+
+/* Save the ovector */
+
+new_recursive->ovec_save = ovecsave;
+memcpy(ovecsave, mb->ovector, mb->offset_end * sizeof(PCRE2_SIZE));
+
+/* Do the recursion. After processing each alternative, restore the ovector
+data and the last captured value. */
+
+do
+  {
+  if (cbegroup) mb->match_function_type |= MATCH_CBEGROUP;
+  rrc = match(eptr, callpat + PRIV(OP_lengths)[*callpat], mstart, offset_top,
+    mb, eptrb, rdepth + 1);
+  memcpy(mb->ovector, new_recursive->ovec_save,
+      mb->offset_end * sizeof(PCRE2_SIZE));
+  mb->capture_last = new_recursive->saved_capture_last;
+  if (rrc == MATCH_MATCH || rrc == MATCH_ACCEPT) return rrc;
+
+  /* PCRE does not allow THEN, SKIP, PRUNE or COMMIT to escape beyond a
+  recursion; they cause a NOMATCH for the entire recursion. These codes
+  are defined in a range that can be tested for. */
+
+  if (rrc >= MATCH_BACKTRACK_MIN && rrc <= MATCH_BACKTRACK_MAX)
+    return MATCH_NOMATCH;
+
+  /* Any return code other than NOMATCH is an error. Otherwise, advance to the
+  next alternative or to the end of the recursing subpattern. If there were
+  nested recursions, mb->recursive might be changed, so reset it before
+  looping. */
+
+  if (rrc != MATCH_NOMATCH) return rrc;
+  mb->recursive = new_recursive;
+  callpat += GET(callpat, 1);
+  }
+while (*callpat == OP_ALT);  /* Loop for the alternatives */
+
+/* None of the alternatives matched. */
+
+return MATCH_NOMATCH;
+}
+#endif  /* HEAP_MATCH_RECURSE */
+
+
 
 /*************************************************
 *         Match from current position            *
@@ -465,29 +531,29 @@
 
 /* These macros pack up tests that are used for partial matching, and which
 appear several times in the code. We set the "hit end" flag if the pointer is
-at the end of the subject and also past the start of the subject (i.e.
-something has been matched). For hard partial matching, we then return
-immediately. The second one is used when we already know we are past the end of
-the subject. */
+at the end of the subject and also past the earliest inspected character (i.e.
+something has been matched, even if not part of the actual matched string). For
+hard partial matching, we then return immediately. The second one is used when
+we already know we are past the end of the subject. */
 
 #define CHECK_PARTIAL()\
-  if (md->partial != 0 && eptr >= md->end_subject && \
-      eptr > md->start_used_ptr) \
+  if (mb->partial != 0 && eptr >= mb->end_subject && \
+      eptr > mb->start_used_ptr) \
     { \
-    md->hitend = TRUE; \
-    if (md->partial > 1) RRETURN(PCRE_ERROR_PARTIAL); \
+    mb->hitend = TRUE; \
+    if (mb->partial > 1) RRETURN(PCRE2_ERROR_PARTIAL); \
     }
 
 #define SCHECK_PARTIAL()\
-  if (md->partial != 0 && eptr > md->start_used_ptr) \
+  if (mb->partial != 0 && eptr > mb->start_used_ptr) \
     { \
-    md->hitend = TRUE; \
-    if (md->partial > 1) RRETURN(PCRE_ERROR_PARTIAL); \
+    mb->hitend = TRUE; \
+    if (mb->partial > 1) RRETURN(PCRE2_ERROR_PARTIAL); \
     }
 
 
 /* Performance note: It might be tempting to extract commonly used fields from
-the md structure (e.g. utf, end_subject) into individual variables to improve
+the mb structure (e.g. utf, end_subject) into individual variables to improve
 performance. Tests using gcc on a SPARC disproved this; in the first case, it
 made performance worse.
 
@@ -496,8 +562,8 @@
    ecode       pointer to current position in compiled code
    mstart      pointer to the current match start position (can be modified
                  by encountering \K)
-   offset_top  current top pointer
-   md          pointer to "static" info for the match
+   offset_top  current top pointer (highest ovector offset used + 1)
+   mb          pointer to "static" info block for the match
    eptrb       pointer to chain of blocks containing eptr at start of
                  brackets - for testing for empty matches
    rdepth      the recursion depth
@@ -505,14 +571,13 @@
 Returns:       MATCH_MATCH if matched            )  these values are >= 0
                MATCH_NOMATCH if failed to match  )
                a negative MATCH_xxx value for PRUNE, SKIP, etc
-               a negative PCRE_ERROR_xxx value if aborted by an error condition
+               a negative PCRE2_ERROR_xxx value if aborted by an error condition
                  (e.g. stopped by repeated call or recursion limit)
 */
 
 static int
-match(REGISTER PCRE_PUCHAR eptr, REGISTER const pcre_uchar *ecode,
-  PCRE_PUCHAR mstart, int offset_top, match_data *md, eptrblock *eptrb,
-  unsigned int rdepth)
+match(REGISTER PCRE2_SPTR eptr, REGISTER PCRE2_SPTR ecode, PCRE2_SPTR mstart,
+  PCRE2_SIZE offset_top, match_block *mb, eptrblock *eptrb, uint32_t rdepth)
 {
 /* These variables do not need to be preserved over recursion in this function,
 so they can be ordinary variables in all cases. Mark some of them with
@@ -520,7 +585,7 @@
 
 register int  rrc;         /* Returns from recursive calls */
 register int  i;           /* Used for loops not involving calls to RMATCH() */
-register pcre_uint32 c;    /* Character values not kept over RMATCH() calls */
+register uint32_t c;       /* Character values not kept over RMATCH() calls */
 register BOOL utf;         /* Local copy of UTF flag for speed */
 
 BOOL minimize, possessive; /* Quantifier options */
@@ -534,8 +599,8 @@
 the top-level on the stack rather than malloc-ing them all gives a performance
 boost in many cases where there is not much "recursion". */
 
-#ifdef NO_RECURSE
-heapframe *frame = (heapframe *)md->match_frames_base;
+#ifdef HEAP_MATCH_RECURSE
+heapframe *frame = (heapframe *)mb->match_frames_base;
 
 /* Copy in the original argument variables */
 
@@ -561,31 +626,26 @@
 
 /* Ditto for the local variables */
 
-#ifdef SUPPORT_UTF
+#ifdef SUPPORT_UNICODE
 #define charptr            frame->Xcharptr
+#define prop_value         frame->Xprop_value
+#define prop_type          frame->Xprop_type
+#define prop_fail_result   frame->Xprop_fail_result
+#define oclength           frame->Xoclength
+#define occhars            frame->Xocchars
 #endif
+
+
 #define callpat            frame->Xcallpat
 #define codelink           frame->Xcodelink
 #define data               frame->Xdata
-#define next               frame->Xnext
+#define next_ecode         frame->Xnext_ecode
 #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 prev_is_word       frame->Xprev_is_word
-
-#ifdef SUPPORT_UCP
-#define prop_type          frame->Xprop_type
-#define prop_value         frame->Xprop_value
-#define prop_fail_result   frame->Xprop_fail_result
-#define oclength           frame->Xoclength
-#define occhars            frame->Xocchars
-#endif
-
 #define ctype              frame->Xctype
 #define fc                 frame->Xfc
 #define fi                 frame->Xfi
@@ -599,15 +659,18 @@
 #define save_offset1       frame->Xsave_offset1
 #define save_offset2       frame->Xsave_offset2
 #define save_offset3       frame->Xsave_offset3
-#define stacksave          frame->Xstacksave
+
+#define condition          frame->Xcondition
+#define cur_is_word        frame->Xcur_is_word
+#define prev_is_word       frame->Xprev_is_word
 
 #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. */
+/* When normal stack-based recursion is being used for match(), local variables
+are allocated on the stack and get preserved during recursion in the usual way.
+In this environment, fi and i, and fc and c, can be the same variables. */
 
-#else         /* NO_RECURSE not defined */
+#else         /* HEAP_MATCH_RECURSE not defined */
 #define fi i
 #define fc c
 
@@ -619,101 +682,84 @@
 below are for variables that do not have to be preserved over a recursive call
 to RMATCH(). */
 
-#ifdef SUPPORT_UTF
-const pcre_uchar *charptr;
+#ifdef SUPPORT_UNICODE
+PCRE2_SPTR charptr;
 #endif
-const pcre_uchar *callpat;
-const pcre_uchar *data;
-const pcre_uchar *next;
-PCRE_PUCHAR       pp;
-const pcre_uchar *prev;
-PCRE_PUCHAR       saved_eptr;
+PCRE2_SPTR callpat;
+PCRE2_SPTR data;
+PCRE2_SPTR next_ecode;
+PCRE2_SPTR pp;
+PCRE2_SPTR prev;
+PCRE2_SPTR saved_eptr;
 
-recursion_info new_recursive;
+PCRE2_SIZE length;
+PCRE2_SIZE offset;
+PCRE2_SIZE save_offset1, save_offset2, save_offset3;
 
-BOOL cur_is_word;
-BOOL condition;
-BOOL prev_is_word;
+uint32_t number;
+uint32_t op;
+uint32_t save_capture_last;
 
-#ifdef SUPPORT_UCP
+#ifdef SUPPORT_UNICODE
+uint32_t prop_value;
 int prop_type;
-unsigned int prop_value;
 int prop_fail_result;
 int oclength;
-pcre_uchar occhars[6];
+PCRE2_UCHAR occhars[6];
 #endif
 
 int codelink;
 int ctype;
-int length;
 int max;
 int min;
-unsigned int number;
-int offset;
-unsigned int op;
-pcre_int32 save_capture_last;
-int save_offset1, save_offset2, save_offset3;
-int stacksave[REC_STACK_SAVE_MAX];
+
+BOOL condition;
+BOOL cur_is_word;
+BOOL prev_is_word;
 
 eptrblock newptrb;
-
-/* There is a special fudge for calling match() in a way that causes it to
-measure the size of its basic stack frame when the stack is being used for
-recursion. The second argument (ecode) being NULL triggers this behaviour. It
-cannot normally ever be NULL. The return is the negated value of the frame
-size. */
-
-if (ecode == NULL)
-  {
-  if (rdepth == 0)
-    return match((PCRE_PUCHAR)&rdepth, NULL, NULL, 0, NULL, NULL, 1);
-  else
-    {
-    int len = (char *)&rdepth - (char *)eptr;
-    return (len > 0)? -len : len;
-    }
-  }
-#endif     /* NO_RECURSE */
+recursion_info new_recursive;
+#endif  /* HEAP_MATCH_RECURSE not defined */
 
 /* To save space on the stack and in the heap frame, I have doubled up on some
 of the local variables that are used only in localised parts of the code, but
 still need to be preserved over recursive calls of match(). These macros define
 the alternative names that are used. */
 
-#define allow_zero    cur_is_word
-#define cbegroup      condition
-#define code_offset   codelink
-#define condassert    condition
-#define matched_once  prev_is_word
-#define foc           number
-#define save_mark     data
+#define allow_zero      cur_is_word
+#define cbegroup        condition
+#define code_offset     codelink
+#define condassert      condition
+#define foc             number
+#define matched_once    prev_is_word
+#define save_mark       data
 
 /* These statements are here to stop the compiler complaining about unitialized
 variables. */
 
-#ifdef SUPPORT_UCP
+#ifdef SUPPORT_UNICODE
 prop_value = 0;
 prop_fail_result = 0;
 #endif
 
 
 /* This label is used for tail recursion, which is used in a few cases even
-when NO_RECURSE is not defined, in order to reduce the amount of stack that is
-used. Thanks to Ian Taylor for noticing this possibility and sending the
-original patch. */
+when HEAP_MATCH_RECURSE is not defined, in order to reduce the amount of stack
+that is used. Thanks to Ian Taylor for noticing this possibility and sending
+the original patch. */
 
 TAIL_RECURSE:
 
 /* OK, now we can get on with the real code of the function. Recursive calls
 are specified by the macro RMATCH and RRETURN is used to return. When
-NO_RECURSE is *not* defined, these just turn into a recursive call to match()
-and a "return", respectively (possibly with some debugging if PCRE_DEBUG is
-defined). 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. */
+HEAP_MATCH_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. */
 
-#ifdef SUPPORT_UTF
-utf = md->utf;       /* Local copy of the flag */
+#ifdef SUPPORT_UNICODE
+utf = (mb->poptions & PCRE2_UTF) != 0;
 #else
 utf = FALSE;
 #endif
@@ -721,13 +767,13 @@
 /* First check that we haven't called match() too many times, or that we
 haven't exceeded the recursive call limit. */
 
-if (md->match_call_count++ >= md->match_limit) RRETURN(PCRE_ERROR_MATCHLIMIT);
-if (rdepth >= md->match_limit_recursion) RRETURN(PCRE_ERROR_RECURSIONLIMIT);
+if (mb->match_call_count++ >= mb->match_limit) RRETURN(PCRE2_ERROR_MATCHLIMIT);
+if (rdepth >= mb->match_limit_recursion) RRETURN(PCRE2_ERROR_RECURSIONLIMIT);
 
 /* At the start of a group with an unlimited repeat that may match an empty
-string, the variable md->match_function_type is set to MATCH_CBEGROUP. It is
-done this way to save having to use another function argument, which would take
-up space on the stack. See also MATCH_CONDASSERT below.
+string, the variable mb->match_function_type contains the MATCH_CBEGROUP bit.
+It is done this way to save having to use another function argument, which
+would take up space on the stack. See also MATCH_CONDASSERT below.
 
 When MATCH_CBEGROUP is set, add the current subject pointer to the chain of
 such remembered pointers, to be checked when we hit the closing ket, in order
@@ -736,15 +782,15 @@
 NOT be used with tail recursion, because the memory block that is used is on
 the stack, so a new one may be required for each match(). */
 
-if (md->match_function_type == MATCH_CBEGROUP)
+if ((mb->match_function_type & MATCH_CBEGROUP) != 0)
   {
   newptrb.epb_saved_eptr = eptr;
   newptrb.epb_prev = eptrb;
   eptrb = &newptrb;
-  md->match_function_type = 0;
+  mb->match_function_type &= ~MATCH_CBEGROUP;
   }
 
-/* Now start processing the opcodes. */
+/* Now, at last, we can start processing the opcodes. */
 
 for (;;)
   {
@@ -754,24 +800,24 @@
   switch(op)
     {
     case OP_MARK:
-    md->nomatch_mark = ecode + 2;
-    md->mark = NULL;    /* In case previously set by assertion */
-    RMATCH(eptr, ecode + PRIV(OP_lengths)[*ecode] + ecode[1], offset_top, md,
+    mb->nomatch_mark = ecode + 2;
+    mb->mark = NULL;    /* In case previously set by assertion */
+    RMATCH(eptr, ecode + PRIV(OP_lengths)[*ecode] + ecode[1], offset_top, mb,
       eptrb, RM55);
     if ((rrc == MATCH_MATCH || rrc == MATCH_ACCEPT) &&
-         md->mark == NULL) md->mark = ecode + 2;
+         mb->mark == NULL) mb->mark = ecode + 2;
 
     /* A return of MATCH_SKIP_ARG means that matching failed at SKIP with an
     argument, and we must check whether that argument matches this MARK's
-    argument. It is passed back in md->start_match_ptr (an overloading of that
+    argument. It is passed back in mb->start_match_ptr (an overloading of that
     variable). If it does match, we reset that variable to the current subject
     position and return MATCH_SKIP. Otherwise, pass back the return code
     unaltered. */
 
     else if (rrc == MATCH_SKIP_ARG &&
-        STRCMP_UC_UC_TEST(ecode + 2, md->start_match_ptr) == 0)
+        PRIV(strcmp)(ecode + 2, mb->start_match_ptr) == 0)
       {
-      md->start_match_ptr = eptr;
+      mb->start_match_ptr = eptr;
       RRETURN(MATCH_SKIP);
       }
     RRETURN(rrc);
@@ -780,32 +826,32 @@
     RRETURN(MATCH_NOMATCH);
 
     case OP_COMMIT:
-    RMATCH(eptr, ecode + PRIV(OP_lengths)[*ecode], offset_top, md,
+    RMATCH(eptr, ecode + PRIV(OP_lengths)[*ecode], offset_top, mb,
       eptrb, RM52);
     if (rrc != MATCH_NOMATCH) RRETURN(rrc);
     RRETURN(MATCH_COMMIT);
 
     case OP_PRUNE:
-    RMATCH(eptr, ecode + PRIV(OP_lengths)[*ecode], offset_top, md,
+    RMATCH(eptr, ecode + PRIV(OP_lengths)[*ecode], offset_top, mb,
       eptrb, RM51);
     if (rrc != MATCH_NOMATCH) RRETURN(rrc);
     RRETURN(MATCH_PRUNE);
 
     case OP_PRUNE_ARG:
-    md->nomatch_mark = ecode + 2;
-    md->mark = NULL;    /* In case previously set by assertion */
-    RMATCH(eptr, ecode + PRIV(OP_lengths)[*ecode] + ecode[1], offset_top, md,
+    mb->nomatch_mark = ecode + 2;
+    mb->mark = NULL;    /* In case previously set by assertion */
+    RMATCH(eptr, ecode + PRIV(OP_lengths)[*ecode] + ecode[1], offset_top, mb,
       eptrb, RM56);
     if ((rrc == MATCH_MATCH || rrc == MATCH_ACCEPT) &&
-         md->mark == NULL) md->mark = ecode + 2;
+         mb->mark == NULL) mb->mark = ecode + 2;
     if (rrc != MATCH_NOMATCH) RRETURN(rrc);
     RRETURN(MATCH_PRUNE);
 
     case OP_SKIP:
-    RMATCH(eptr, ecode + PRIV(OP_lengths)[*ecode], offset_top, md,
+    RMATCH(eptr, ecode + PRIV(OP_lengths)[*ecode], offset_top, mb,
       eptrb, RM53);
     if (rrc != MATCH_NOMATCH) RRETURN(rrc);
-    md->start_match_ptr = eptr;   /* Pass back current position */
+    mb->start_match_ptr = eptr;   /* Pass back current position */
     RRETURN(MATCH_SKIP);
 
     /* Note that, for Perl compatibility, SKIP with an argument does NOT set
@@ -813,26 +859,26 @@
     not a matching mark, we have to re-run the match, ignoring the SKIP_ARG
     that failed and any that precede it (either they also failed, or were not
     triggered). To do this, we maintain a count of executed SKIP_ARGs. If a
-    SKIP_ARG gets to top level, the match is re-run with md->ignore_skip_arg
+    SKIP_ARG gets to top level, the match is re-run with mb->ignore_skip_arg
     set to the count of the one that failed. */
 
     case OP_SKIP_ARG:
-    md->skip_arg_count++;
-    if (md->skip_arg_count <= md->ignore_skip_arg)
+    mb->skip_arg_count++;
+    if (mb->skip_arg_count <= mb->ignore_skip_arg)
       {
       ecode += PRIV(OP_lengths)[*ecode] + ecode[1];
       break;
       }
-    RMATCH(eptr, ecode + PRIV(OP_lengths)[*ecode] + ecode[1], offset_top, md,
+    RMATCH(eptr, ecode + PRIV(OP_lengths)[*ecode] + ecode[1], offset_top, mb,
       eptrb, RM57);
     if (rrc != MATCH_NOMATCH) RRETURN(rrc);
 
-    /* Pass back the current skip name by overloading md->start_match_ptr and
+    /* Pass back the current skip name by overloading mb->start_match_ptr and
     returning the special MATCH_SKIP_ARG return code. This will either be
     caught by a matching MARK, or get to the top, where it causes a rematch
-    with md->ignore_skip_arg set to the value of md->skip_arg_count. */
+    with mb->ignore_skip_arg set to the value of mb->skip_arg_count. */
 
-    md->start_match_ptr = ecode + 2;
+    mb->start_match_ptr = ecode + 2;
     RRETURN(MATCH_SKIP_ARG);
 
     /* For THEN (and THEN_ARG) we pass back the address of the opcode, so that
@@ -840,21 +886,21 @@
     match pointer to do this. */
 
     case OP_THEN:
-    RMATCH(eptr, ecode + PRIV(OP_lengths)[*ecode], offset_top, md,
+    RMATCH(eptr, ecode + PRIV(OP_lengths)[*ecode], offset_top, mb,
       eptrb, RM54);
     if (rrc != MATCH_NOMATCH) RRETURN(rrc);
-    md->start_match_ptr = ecode;
+    mb->start_match_ptr = ecode;
     RRETURN(MATCH_THEN);
 
     case OP_THEN_ARG:
-    md->nomatch_mark = ecode + 2;
-    md->mark = NULL;    /* In case previously set by assertion */
+    mb->nomatch_mark = ecode + 2;
+    mb->mark = NULL;    /* In case previously set by assertion */
     RMATCH(eptr, ecode + PRIV(OP_lengths)[*ecode] + ecode[1], offset_top,
-      md, eptrb, RM58);
+      mb, eptrb, RM58);
     if ((rrc == MATCH_MATCH || rrc == MATCH_ACCEPT) &&
-         md->mark == NULL) md->mark = ecode + 2;
+         mb->mark == NULL) mb->mark = ecode + 2;
     if (rrc != MATCH_NOMATCH) RRETURN(rrc);
-    md->start_match_ptr = ecode;
+    mb->start_match_ptr = ecode;
     RRETURN(MATCH_THEN);
 
     /* Handle an atomic group that does not contain any capturing parentheses.
@@ -873,26 +919,26 @@
     case OP_ONCE_NC:
     prev = ecode;
     saved_eptr = eptr;
-    save_mark = md->mark;
+    save_mark = mb->mark;
     do
       {
-      RMATCH(eptr, ecode + 1 + LINK_SIZE, offset_top, md, eptrb, RM64);
+      RMATCH(eptr, ecode + 1 + LINK_SIZE, offset_top, mb, eptrb, RM64);
       if (rrc == MATCH_MATCH)  /* Note: _not_ MATCH_ACCEPT */
         {
-        mstart = md->start_match_ptr;
+        mstart = mb->start_match_ptr;
         break;
         }
       if (rrc == MATCH_THEN)
         {
-        next = ecode + GET(ecode,1);
-        if (md->start_match_ptr < next &&
-            (*ecode == OP_ALT || *next == OP_ALT))
+        next_ecode = ecode + GET(ecode,1);
+        if (mb->start_match_ptr < next_ecode &&
+            (*ecode == OP_ALT || *next_ecode == OP_ALT))
           rrc = MATCH_NOMATCH;
         }
 
       if (rrc != MATCH_NOMATCH) RRETURN(rrc);
       ecode += GET(ecode,1);
-      md->mark = save_mark;
+      mb->mark = save_mark;
       }
     while (*ecode == OP_ALT);
 
@@ -905,8 +951,8 @@
 
     do ecode += GET(ecode, 1); while (*ecode == OP_ALT);
 
-    offset_top = md->end_offset_top;
-    eptr = md->end_match_ptr;
+    offset_top = mb->end_offset_top;
+    eptr = mb->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.
@@ -925,14 +971,14 @@
 
     if (*ecode == OP_KETRMIN)
       {
-      RMATCH(eptr, ecode + 1 + LINK_SIZE, offset_top, md, eptrb, RM65);
+      RMATCH(eptr, ecode + 1 + LINK_SIZE, offset_top, mb, eptrb, RM65);
       if (rrc != MATCH_NOMATCH) RRETURN(rrc);
       ecode = prev;
       goto TAIL_RECURSE;
       }
     else  /* OP_KETRMAX */
       {
-      RMATCH(eptr, prev, offset_top, md, eptrb, RM66);
+      RMATCH(eptr, prev, offset_top, mb, eptrb, RM66);
       if (rrc != MATCH_NOMATCH) RRETURN(rrc);
       ecode += 1 + LINK_SIZE;
       goto TAIL_RECURSE;
@@ -958,29 +1004,20 @@
     number = GET2(ecode, 1+LINK_SIZE);
     offset = number << 1;
 
-#ifdef PCRE_DEBUG
-    printf("start bracket %d\n", number);
-    printf("subject=");
-    pchars(eptr, 16, TRUE, md);
-    printf("\n");
-#endif
-
-    if (offset < md->offset_max)
+    if (offset < mb->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;
-      save_mark = md->mark;
+      save_offset1 = mb->ovector[offset];
+      save_offset2 = mb->ovector[offset+1];
+      save_offset3 = mb->ovector[mb->offset_end - number];
+      save_capture_last = mb->capture_last;
+      save_mark = mb->mark;
 
-      DPRINTF(("saving %d %d %d\n", save_offset1, save_offset2, save_offset3));
-      md->offset_vector[md->offset_end - number] =
-        (int)(eptr - md->start_subject);
+      mb->ovector[mb->offset_end - number] = eptr - mb->start_subject;
 
       for (;;)
         {
-        if (op >= OP_SBRA) md->match_function_type = MATCH_CBEGROUP;
-        RMATCH(eptr, ecode + PRIV(OP_lengths)[*ecode], offset_top, md,
+        if (op >= OP_SBRA) mb->match_function_type |= MATCH_CBEGROUP;
+        RMATCH(eptr, ecode + PRIV(OP_lengths)[*ecode], offset_top, mb,
           eptrb, RM1);
         if (rrc == MATCH_ONCE) break;  /* Backing up through an atomic group */
 
@@ -997,25 +1034,24 @@
 
         if (rrc == MATCH_THEN)
           {
-          next = ecode + GET(ecode,1);
-          if (md->start_match_ptr < next &&
-              (*ecode == OP_ALT || *next == OP_ALT))
+          next_ecode = ecode + GET(ecode,1);
+          if (mb->start_match_ptr < next_ecode &&
+              (*ecode == OP_ALT || *next_ecode == OP_ALT))
             rrc = MATCH_NOMATCH;
           }
 
         /* Anything other than NOMATCH is passed back. */
 
         if (rrc != MATCH_NOMATCH) RRETURN(rrc);
-        md->capture_last = save_capture_last;
+        mb->capture_last = save_capture_last;
         ecode += GET(ecode, 1);
-        md->mark = save_mark;
+        mb->mark = save_mark;
         if (*ecode != OP_ALT) break;
         }
 
-      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;
+      mb->ovector[offset] = save_offset1;
+      mb->ovector[offset+1] = save_offset2;
+      mb->ovector[mb->offset_end - number] = save_offset3;
 
       /* At this point, rrc will be one of MATCH_ONCE or MATCH_NOMATCH. */
 
@@ -1028,11 +1064,6 @@
     /* VVVVVVVVVVVVVVVVVVVVVVVVV */
     /* VVVVVVVVVVVVVVVVVVVVVVVVV */
 
-    DPRINTF(("insufficient capture room: treat as non-capturing\n"));
-
-    /* VVVVVVVVVVVVVVVVVVVVVVVVV */
-    /* VVVVVVVVVVVVVVVVVVVVVVVVV */
-
     /* Non-capturing or atomic group, except for possessive with unlimited
     repeat and ONCE group with no captures. Loop for all the alternatives.
 
@@ -1049,25 +1080,24 @@
     MATCH_ONCE is returned when the end of an atomic group is successfully
     reached, but subsequent matching fails. It passes back up the tree (causing
     captured values to be reset) until the original atomic group level is
-    reached. This is tested by comparing md->once_target with the start of the
+    reached. This is tested by comparing mb->once_target with the start of the
     group. At this point, the return is converted into MATCH_NOMATCH so that
     previous backup points can be taken. */
 
     case OP_ONCE:
     case OP_BRA:
     case OP_SBRA:
-    DPRINTF(("start non-capturing bracket\n"));
 
     for (;;)
       {
       if (op >= OP_SBRA || op == OP_ONCE)
-        md->match_function_type = MATCH_CBEGROUP;
+        mb->match_function_type |= MATCH_CBEGROUP;
 
       /* If this is not a possibly empty group, and there are no (*THEN)s in
       the pattern, and this is the final alternative, optimize as described
       above. */
 
-      else if (!md->hasthen && ecode[GET(ecode, 1)] != OP_ALT)
+      else if (!mb->hasthen && ecode[GET(ecode, 1)] != OP_ALT)
         {
         ecode += PRIV(OP_lengths)[*ecode];
         goto TAIL_RECURSE;
@@ -1075,9 +1105,9 @@
 
       /* In all other cases, we have to make another call to match(). */
 
-      save_mark = md->mark;
-      save_capture_last = md->capture_last;
-      RMATCH(eptr, ecode + PRIV(OP_lengths)[*ecode], offset_top, md, eptrb,
+      save_mark = mb->mark;
+      save_capture_last = mb->capture_last;
+      RMATCH(eptr, ecode + PRIV(OP_lengths)[*ecode], offset_top, mb, eptrb,
         RM2);
 
       /* See comment in the code for capturing groups above about handling
@@ -1085,9 +1115,9 @@
 
       if (rrc == MATCH_THEN)
         {
-        next = ecode + GET(ecode,1);
-        if (md->start_match_ptr < next &&
-            (*ecode == OP_ALT || *next == OP_ALT))
+        next_ecode = ecode + GET(ecode,1);
+        if (mb->start_match_ptr < next_ecode &&
+            (*ecode == OP_ALT || *next_ecode == OP_ALT))
           rrc = MATCH_NOMATCH;
         }
 
@@ -1095,31 +1125,32 @@
         {
         if (rrc == MATCH_ONCE)
           {
-          const pcre_uchar *scode = ecode;
+          PCRE2_SPTR scode = ecode;
           if (*scode != OP_ONCE)           /* If not at start, find it */
             {
             while (*scode == OP_ALT) scode += GET(scode, 1);
             scode -= GET(scode, 1);
             }
-          if (md->once_target == scode) rrc = MATCH_NOMATCH;
+          if (mb->once_target == scode) rrc = MATCH_NOMATCH;
           }
         RRETURN(rrc);
         }
       ecode += GET(ecode, 1);
-      md->mark = save_mark;
+      mb->mark = save_mark;
       if (*ecode != OP_ALT) break;
-      md->capture_last = save_capture_last;
+      mb->capture_last = save_capture_last;
       }
 
     RRETURN(MATCH_NOMATCH);
 
     /* Handle possessive capturing brackets with an unlimited repeat. We come
-    here from BRAZERO with allow_zero set TRUE. The offset_vector values are
+    here from BRAZERO with allow_zero set TRUE. The ovector values are
     handled similarly to the normal case above. However, the matching is
     different. The end of these brackets will always be OP_KETRPOS, which
     returns MATCH_KETRPOS without going further in the pattern. By this means
     we can handle the group by iteration rather than recursion, thereby
-    reducing the amount of stack needed. */
+    reducing the amount of stack needed. If the ovector is too small for
+    capturing, treat as non-capturing. */
 
     case OP_CBRAPOS:
     case OP_SCBRAPOS:
@@ -1128,25 +1159,15 @@
     POSSESSIVE_CAPTURE:
     number = GET2(ecode, 1+LINK_SIZE);
     offset = number << 1;
-
-#ifdef PCRE_DEBUG
-    printf("start possessive bracket %d\n", number);
-    printf("subject=");
-    pchars(eptr, 16, TRUE, md);
-    printf("\n");
-#endif
-
-    if (offset >= md->offset_max) goto POSSESSIVE_NON_CAPTURE;
+    if (offset >= mb->offset_max) goto POSSESSIVE_NON_CAPTURE;
 
     matched_once = FALSE;
-    code_offset = (int)(ecode - md->start_code);
+    code_offset = (int)(ecode - mb->start_code);
 
-    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));
+    save_offset1 = mb->ovector[offset];
+    save_offset2 = mb->ovector[offset+1];
+    save_offset3 = mb->ovector[mb->offset_end - number];
+    save_capture_last = mb->capture_last;
 
     /* Each time round the loop, save the current subject position for use
     when the group matches. For MATCH_MATCH, the group has matched, so we
@@ -1159,24 +1180,23 @@
 
     for (;;)
       {
-      md->offset_vector[md->offset_end - number] =
-        (int)(eptr - md->start_subject);
-      if (op >= OP_SBRA) md->match_function_type = MATCH_CBEGROUP;
-      RMATCH(eptr, ecode + PRIV(OP_lengths)[*ecode], offset_top, md,
+      mb->ovector[mb->offset_end - number] = eptr - mb->start_subject;
+      if (op >= OP_SBRA) mb->match_function_type |= MATCH_CBEGROUP;
+      RMATCH(eptr, ecode + PRIV(OP_lengths)[*ecode], offset_top, mb,
         eptrb, RM63);
       if (rrc == MATCH_KETRPOS)
         {
-        offset_top = md->end_offset_top;
-        ecode = md->start_code + code_offset;
-        save_capture_last = md->capture_last;
+        offset_top = mb->end_offset_top;
+        ecode = mb->start_code + code_offset;
+        save_capture_last = mb->capture_last;
         matched_once = TRUE;
-        mstart = md->start_match_ptr;    /* In case \K changed it */
-        if (eptr == md->end_match_ptr)   /* Matched an empty string */
+        mstart = mb->start_match_ptr;    /* In case \K changed it */
+        if (eptr == mb->end_match_ptr)   /* Matched an empty string */
           {
           do ecode += GET(ecode, 1); while (*ecode == OP_ALT);
           break;
           }
-        eptr = md->end_match_ptr;
+        eptr = mb->end_match_ptr;
         continue;
         }
 
@@ -1185,23 +1205,23 @@
 
       if (rrc == MATCH_THEN)
         {
-        next = ecode + GET(ecode,1);
-        if (md->start_match_ptr < next &&
-            (*ecode == OP_ALT || *next == OP_ALT))
+        next_ecode = ecode + GET(ecode,1);
+        if (mb->start_match_ptr < next_ecode &&
+            (*ecode == OP_ALT || *next_ecode == OP_ALT))
           rrc = MATCH_NOMATCH;
         }
 
       if (rrc != MATCH_NOMATCH) RRETURN(rrc);
-      md->capture_last = save_capture_last;
+      mb->capture_last = save_capture_last;
       ecode += GET(ecode, 1);
       if (*ecode != OP_ALT) break;
       }
 
     if (!matched_once)
       {
-      md->offset_vector[offset] = save_offset1;
-      md->offset_vector[offset+1] = save_offset2;
-      md->offset_vector[md->offset_end - number] = save_offset3;
+      mb->ovector[offset] = save_offset1;
+      mb->ovector[offset+1] = save_offset2;
+      mb->ovector[mb->offset_end - number] = save_offset3;
       }
 
     if (allow_zero || matched_once)
@@ -1209,7 +1229,6 @@
       ecode += 1 + LINK_SIZE;
       break;
       }
-
     RRETURN(MATCH_NOMATCH);
 
     /* Non-capturing possessive bracket with unlimited repeat. We come here
@@ -1223,26 +1242,26 @@
 
     POSSESSIVE_NON_CAPTURE:
     matched_once = FALSE;
-    code_offset = (int)(ecode - md->start_code);
-    save_capture_last = md->capture_last;
+    code_offset = (int)(ecode - mb->start_code);
+    save_capture_last = mb->capture_last;
 
     for (;;)
       {
-      if (op >= OP_SBRA) md->match_function_type = MATCH_CBEGROUP;
-      RMATCH(eptr, ecode + PRIV(OP_lengths)[*ecode], offset_top, md,
+      if (op >= OP_SBRA) mb->match_function_type |= MATCH_CBEGROUP;
+      RMATCH(eptr, ecode + PRIV(OP_lengths)[*ecode], offset_top, mb,
         eptrb, RM48);
       if (rrc == MATCH_KETRPOS)
         {
-        offset_top = md->end_offset_top;
-        ecode = md->start_code + code_offset;
+        offset_top = mb->end_offset_top;
+        ecode = mb->start_code + code_offset;
         matched_once = TRUE;
-        mstart = md->start_match_ptr;   /* In case \K reset it */
-        if (eptr == md->end_match_ptr)  /* Matched an empty string */
+        mstart = mb->start_match_ptr;   /* In case \K reset it */
+        if (eptr == mb->end_match_ptr)  /* Matched an empty string */
           {
           do ecode += GET(ecode, 1); while (*ecode == OP_ALT);
           break;
           }
-        eptr = md->end_match_ptr;
+        eptr = mb->end_match_ptr;
         continue;
         }
 
@@ -1251,16 +1270,16 @@
 
       if (rrc == MATCH_THEN)
         {
-        next = ecode + GET(ecode,1);
-        if (md->start_match_ptr < next &&
-            (*ecode == OP_ALT || *next == OP_ALT))
+        next_ecode = ecode + GET(ecode,1);
+        if (mb->start_match_ptr < next_ecode &&
+            (*ecode == OP_ALT || *next_ecode == OP_ALT))
           rrc = MATCH_NOMATCH;
         }
 
       if (rrc != MATCH_NOMATCH) RRETURN(rrc);
       ecode += GET(ecode, 1);
       if (*ecode != OP_ALT) break;
-      md->capture_last = save_capture_last;
+      mb->capture_last = save_capture_last;
       }
 
     if (matched_once || allow_zero)
@@ -1291,41 +1310,52 @@
     /* Because of the way auto-callout works during compile, a callout item is
     inserted between OP_COND and an assertion condition. */
 
-    if (*ecode == OP_CALLOUT)
+    if (*ecode == OP_CALLOUT || *ecode == OP_CALLOUT_STR)
       {
-      if (PUBL(callout) != NULL)
+      unsigned int callout_length = (*ecode == OP_CALLOUT)
+          ? PRIV(OP_lengths)[OP_CALLOUT] : GET(ecode, 1 + 2*LINK_SIZE);
+
+      if (mb->callout != NULL)
         {
-        PUBL(callout_block) cb;
-        cb.version          = 2;   /* Version 1 of the callout block */
-        cb.callout_number   = ecode[1];
-        cb.offset_vector    = md->offset_vector;
-#if defined COMPILE_PCRE8
-        cb.subject          = (PCRE_SPTR)md->start_subject;
-#elif defined COMPILE_PCRE16
-        cb.subject          = (PCRE_SPTR16)md->start_subject;
-#elif defined COMPILE_PCRE32
-        cb.subject          = (PCRE_SPTR32)md->start_subject;
-#endif
-        cb.subject_length   = (int)(md->end_subject - md->start_subject);
-        cb.start_match      = (int)(mstart - md->start_subject);
-        cb.current_position = (int)(eptr - md->start_subject);
-        cb.pattern_position = GET(ecode, 2);
-        cb.next_item_length = GET(ecode, 2 + LINK_SIZE);
+        pcre2_callout_block cb;
+        cb.version          = 1;
         cb.capture_top      = offset_top/2;
-        cb.capture_last     = md->capture_last & CAPLMASK;
-        /* Internal change requires this for API compatibility. */
-        if (cb.capture_last == 0) cb.capture_last = -1;
-        cb.callout_data     = md->callout_data;
-        cb.mark             = md->nomatch_mark;
-        if ((rrc = (*PUBL(callout))(&cb)) > 0) RRETURN(MATCH_NOMATCH);
+        cb.capture_last     = mb->capture_last & CAPLMASK;
+        cb.offset_vector    = mb->ovector;
+        cb.mark             = mb->nomatch_mark;
+        cb.subject          = mb->start_subject;
+        cb.subject_length   = (PCRE2_SIZE)(mb->end_subject - mb->start_subject);
+        cb.start_match      = (PCRE2_SIZE)(mstart - mb->start_subject);
+        cb.current_position = (PCRE2_SIZE)(eptr - mb->start_subject);
+        cb.pattern_position = GET(ecode, 1);
+        cb.next_item_length = GET(ecode, 1 + LINK_SIZE);
+
+        if (*ecode == OP_CALLOUT)
+          {
+          cb.callout_number = ecode[1 + 2*LINK_SIZE];
+          cb.callout_string_offset = 0;
+          cb.callout_string = NULL;
+          cb.callout_string_length = 0;
+          }
+        else
+          {
+          cb.callout_number = 0;
+          cb.callout_string_offset = GET(ecode, 1 + 3*LINK_SIZE);
+          cb.callout_string = ecode + (1 + 4*LINK_SIZE) + 1;
+          cb.callout_string_length =
+            callout_length - (1 + 4*LINK_SIZE) - 2;
+          }
+
+        if ((rrc = mb->callout(&cb, mb->callout_data)) > 0)
+          RRETURN(MATCH_NOMATCH);
         if (rrc < 0) RRETURN(rrc);
         }
 
       /* Advance ecode past the callout, so it now points to the condition. We
       must adjust codelink so that the value of ecode+codelink is unchanged. */
 
-      ecode += PRIV(OP_lengths)[OP_CALLOUT];
-      codelink -= PRIV(OP_lengths)[OP_CALLOUT];
+      ecode += callout_length;
+      codelink -= callout_length;
       }
 
     /* Test the various possible conditions */
@@ -1333,63 +1363,69 @@
     condition = FALSE;
     switch(condcode = *ecode)
       {
-      case OP_RREF:         /* Numbered group recursion test */
-      if (md->recursive != NULL)     /* Not recursing => FALSE */
+      case OP_RREF:                  /* Numbered group recursion test */
+      if (mb->recursive != NULL)     /* Not recursing => FALSE */
         {
-        unsigned int recno = GET2(ecode, 1);   /* Recursion group number*/
-        condition = (recno == RREF_ANY || recno == md->recursive->group_num);
+        uint32_t recno = GET2(ecode, 1);   /* Recursion group number*/
+        condition = (recno == RREF_ANY || recno == mb->recursive->group_num);
         }
       break;
 
       case OP_DNRREF:       /* Duplicate named group recursion test */
-      if (md->recursive != NULL)
+      if (mb->recursive != NULL)
         {
         int count = GET2(ecode, 1 + IMM2_SIZE);
-        pcre_uchar *slot = md->name_table + GET2(ecode, 1) * md->name_entry_size;
+        PCRE2_SPTR slot = mb->name_table + GET2(ecode, 1) * mb->name_entry_size;
         while (count-- > 0)
           {
-          unsigned int recno = GET2(slot, 0);
-          condition = recno == md->recursive->group_num;
+          uint32_t recno = GET2(slot, 0);
+          condition = recno == mb->recursive->group_num;
           if (condition) break;
-          slot += md->name_entry_size;
+          slot += mb->name_entry_size;
           }
         }
       break;
 
-      case OP_CREF:         /* Numbered group used test */
+      case OP_CREF:                  /* Numbered group used test */
       offset = GET2(ecode, 1) << 1;  /* Doubled ref number */
-      condition = offset < offset_top && md->offset_vector[offset] >= 0;
+      condition = offset < offset_top &&
+        mb->ovector[offset] != PCRE2_UNSET;
       break;
 
       case OP_DNCREF:      /* Duplicate named group used test */
         {
         int count = GET2(ecode, 1 + IMM2_SIZE);
-        pcre_uchar *slot = md->name_table + GET2(ecode, 1) * md->name_entry_size;
+        PCRE2_SPTR slot = mb->name_table + GET2(ecode, 1) * mb->name_entry_size;
         while (count-- > 0)
           {
           offset = GET2(slot, 0) << 1;
-          condition = offset < offset_top && md->offset_vector[offset] >= 0;
+          condition = offset < offset_top &&
+            mb->ovector[offset] != PCRE2_UNSET;
           if (condition) break;
-          slot += md->name_entry_size;
+          slot += mb->name_entry_size;
           }
         }
       break;
 
-      case OP_DEF:     /* DEFINE - always false */
-      case OP_FAIL:    /* From optimized (?!) condition */
+      case OP_FALSE:
+      case OP_FAIL:   /* The assertion (?!) becomes OP_FAIL */
+      break;
+
+      case OP_TRUE:
+      condition = TRUE;
       break;
 
       /* The condition is an assertion. Call match() to evaluate it - setting
-      md->match_function_type to MATCH_CONDASSERT causes it to stop at the end
-      of an assertion. */
+      the MATCH_CONDASSERT bit in mb->match_function_type causes it to stop at
+      the end of an assertion. */
 
       default:
-      md->match_function_type = MATCH_CONDASSERT;
-      RMATCH(eptr, ecode, offset_top, md, NULL, RM3);
+      mb->match_function_type |= MATCH_CONDASSERT;
+      RMATCH(eptr, ecode, offset_top, mb, NULL, RM3);
       if (rrc == MATCH_MATCH)
         {
-        if (md->end_offset_top > offset_top)
-          offset_top = md->end_offset_top;  /* Captures may have happened */
+        if (mb->end_offset_top > offset_top)
+          offset_top = mb->end_offset_top;  /* Captures may have happened */
         condition = TRUE;
 
         /* Advance ecode past the assertion to the start of the first branch,
@@ -1435,8 +1471,8 @@
         goto TAIL_RECURSE;
         }
 
-      md->match_function_type = MATCH_CBEGROUP;
-      RMATCH(eptr, ecode, offset_top, md, eptrb, RM49);
+      mb->match_function_type |= MATCH_CBEGROUP;
+      RMATCH(eptr, ecode, offset_top, mb, eptrb, RM49);
       RRETURN(rrc);
       }
 
@@ -1454,18 +1490,12 @@
     case OP_CLOSE:
     number = GET2(ecode, 1);   /* Must be less than 65536 */
     offset = number << 1;
-
-#ifdef PCRE_DEBUG
-      printf("end bracket %d at *ACCEPT", number);
-      printf("\n");
-#endif
-
-    md->capture_last = (md->capture_last & OVFLMASK) | number;
-    if (offset >= md->offset_max) md->capture_last |= OVFLBIT; else
+    mb->capture_last = (mb->capture_last & OVFLMASK) | number;
+    if (offset >= mb->offset_max) mb->capture_last |= OVFLBIT; else
       {
-      md->offset_vector[offset] =
-        md->offset_vector[md->offset_end - number];
-      md->offset_vector[offset+1] = (int)(eptr - md->start_subject);
+      mb->ovector[offset] =
+        mb->ovector[mb->offset_end - number];
+      mb->ovector[offset+1] = eptr - mb->start_subject;
 
       /* If this group is at or above the current highwater mark, ensure that
       any groups between the current high water mark and this group are marked
@@ -1473,9 +1503,9 @@
 
       if (offset >= offset_top)
         {
-        register int *iptr = md->offset_vector + offset_top;
-        register int *iend = md->offset_vector + offset;
-        while (iptr < iend) *iptr++ = -1;
+        register PCRE2_SIZE *iptr = mb->ovector + offset_top;
+        register PCRE2_SIZE *iend = mb->ovector + offset;
+        while (iptr < iend) *iptr++ = PCRE2_UNSET;
         offset_top = offset + 2;
         }
       }
@@ -1483,29 +1513,32 @@
     break;
 
 
-    /* End of the pattern, either real or forced. */
+    /* End of the pattern, either real or forced. In an assertion ACCEPT,
+    update the last used pointer. */
 
-    case OP_END:
-    case OP_ACCEPT:
     case OP_ASSERT_ACCEPT:
+    if (eptr > mb->last_used_ptr) mb->last_used_ptr = eptr;
+
+    case OP_ACCEPT:
+    case OP_END:
 
     /* If we have matched an empty string, fail if not in an assertion and not
-    in a recursion if either PCRE_NOTEMPTY is set, or if PCRE_NOTEMPTY_ATSTART
+    in a recursion if either PCRE2_NOTEMPTY is set, or if PCRE2_NOTEMPTY_ATSTART
     is set and we have matched at the start of the subject. In both cases,
     backtracking will then try other alternatives, if any. */
 
     if (eptr == mstart && op != OP_ASSERT_ACCEPT &&
-         md->recursive == NULL &&
-         (md->notempty ||
-           (md->notempty_atstart &&
-             mstart == md->start_subject + md->start_offset)))
+         mb->recursive == NULL &&
+         ((mb->moptions & PCRE2_NOTEMPTY) != 0 ||
+           ((mb->moptions & PCRE2_NOTEMPTY_ATSTART) != 0 &&
+             mstart == mb->start_subject + mb->start_offset)))
       RRETURN(MATCH_NOMATCH);
 
     /* Otherwise, we have a match. */
 
-    md->end_match_ptr = eptr;           /* Record where we ended */
-    md->end_offset_top = offset_top;    /* and how many extracts were taken */
-    md->start_match_ptr = mstart;       /* and the start (\K can modify) */
+    mb->end_match_ptr = eptr;           /* Record where we ended */
+    mb->end_offset_top = offset_top;    /* and how many extracts were taken */
+    mb->start_match_ptr = mstart;       /* and the start (\K can modify) */
 
     /* For some reason, the macros don't work properly if an expression is
     given as the argument to RRETURN when the heap is in use. */
@@ -1520,17 +1553,17 @@
     this level is identical to the lookahead case. When the assertion is part
     of a condition, we want to return immediately afterwards. The caller of
     this incarnation of the match() function will have set MATCH_CONDASSERT in
-    md->match_function type, and one of these opcodes will be the first opcode
+    mb->match_function type, and one of these opcodes will be the first opcode
     that is processed. We use a local variable that is preserved over calls to
     match() to remember this case. */
 
     case OP_ASSERT:
     case OP_ASSERTBACK:
-    save_mark = md->mark;
-    if (md->match_function_type == MATCH_CONDASSERT)
+    save_mark = mb->mark;
+    if ((mb->match_function_type & MATCH_CONDASSERT) != 0)
       {
       condassert = TRUE;
-      md->match_function_type = 0;
+      mb->match_function_type &= ~MATCH_CONDASSERT;
       }
     else condassert = FALSE;
 
@@ -1538,29 +1571,29 @@
 
     do
       {
-      RMATCH(eptr, ecode + 1 + LINK_SIZE, offset_top, md, NULL, RM4);
+      RMATCH(eptr, ecode + 1 + LINK_SIZE, offset_top, mb, NULL, RM4);
 
       /* A match means that the assertion is true; break out of the loop
       that matches its alternatives. */
 
       if (rrc == MATCH_MATCH || rrc == MATCH_ACCEPT)
         {
-        mstart = md->start_match_ptr;   /* In case \K reset it */
+        mstart = mb->start_match_ptr;   /* In case \K reset it */
         break;
         }
 
       /* If not matched, restore the previous mark setting. */
 
-      md->mark = save_mark;
+      mb->mark = save_mark;
 
       /* See comment in the code for capturing groups above about handling
       THEN. */
 
       if (rrc == MATCH_THEN)
         {
-        next = ecode + GET(ecode,1);
-        if (md->start_match_ptr < next &&
-            (*ecode == OP_ALT || *next == OP_ALT))
+        next_ecode = ecode + GET(ecode,1);
+        if (mb->start_match_ptr < next_ecode &&
+            (*ecode == OP_ALT || *next_ecode == OP_ALT))
           rrc = MATCH_NOMATCH;
         }
 
@@ -1589,7 +1622,7 @@
 
     do ecode += GET(ecode,1); while (*ecode == OP_ALT);
     ecode += 1 + LINK_SIZE;
-    offset_top = md->end_offset_top;
+    offset_top = mb->end_offset_top;
     continue;
 
     /* Negative assertion: all branches must fail to match for the assertion to
@@ -1597,11 +1630,11 @@
 
     case OP_ASSERT_NOT:
     case OP_ASSERTBACK_NOT:
-    save_mark = md->mark;
-    if (md->match_function_type == MATCH_CONDASSERT)
+    save_mark = mb->mark;
+    if ((mb->match_function_type & MATCH_CONDASSERT) != 0)
       {
       condassert = TRUE;
-      md->match_function_type = 0;
+      mb->match_function_type &= ~MATCH_CONDASSERT;
       }
     else condassert = FALSE;
 
@@ -1609,8 +1642,8 @@
 
     do
       {
-      RMATCH(eptr, ecode + 1 + LINK_SIZE, offset_top, md, NULL, RM5);
-      md->mark = save_mark;   /* Always restore the mark setting */
+      RMATCH(eptr, ecode + 1 + LINK_SIZE, offset_top, mb, NULL, RM5);
+      mb->mark = save_mark;   /* Always restore the mark setting */
 
       switch(rrc)
         {
@@ -1625,9 +1658,9 @@
         THEN. */
 
         case MATCH_THEN:
-        next = ecode + GET(ecode,1);
-        if (md->start_match_ptr < next &&
-            (*ecode == OP_ALT || *next == OP_ALT))
+        next_ecode = ecode + GET(ecode,1);
+        if (mb->start_match_ptr < next_ecode &&
+            (*ecode == OP_ALT || *next_ecode == OP_ALT))
           {
           rrc = MATCH_NOMATCH;
           break;
@@ -1671,14 +1704,14 @@
     back a number of characters, not bytes. */
 
     case OP_REVERSE:
-#ifdef SUPPORT_UTF
+    i = GET(ecode, 1);
+#ifdef SUPPORT_UNICODE
     if (utf)
       {
-      i = GET(ecode, 1);
       while (i-- > 0)
         {
+        if (eptr <= mb->start_subject) RRETURN(MATCH_NOMATCH);
         eptr--;
-        if (eptr < md->start_subject) RRETURN(MATCH_NOMATCH);
         BACKCHAR(eptr);
         }
       }
@@ -1688,13 +1721,13 @@
     /* 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);
+      if (i > eptr - mb->start_subject) RRETURN(MATCH_NOMATCH);
+      eptr -= i;
       }
 
     /* Save the earliest consulted character, then skip to next op code */
 
-    if (eptr < md->start_used_ptr) md->start_used_ptr = eptr;
+    if (eptr < mb->start_used_ptr) mb->start_used_ptr = eptr;
     ecode += 1 + LINK_SIZE;
     break;
 
@@ -1703,34 +1736,49 @@
     function is able to force a failure. */
 
     case OP_CALLOUT:
-    if (PUBL(callout) != NULL)
+    case OP_CALLOUT_STR:
       {
-      PUBL(callout_block) cb;
-      cb.version          = 2;   /* Version 1 of the callout block */
-      cb.callout_number   = ecode[1];
-      cb.offset_vector    = md->offset_vector;
-#if defined COMPILE_PCRE8
-      cb.subject          = (PCRE_SPTR)md->start_subject;
-#elif defined COMPILE_PCRE16
-      cb.subject          = (PCRE_SPTR16)md->start_subject;
-#elif defined COMPILE_PCRE32
-      cb.subject          = (PCRE_SPTR32)md->start_subject;
-#endif
-      cb.subject_length   = (int)(md->end_subject - md->start_subject);
-      cb.start_match      = (int)(mstart - md->start_subject);
-      cb.current_position = (int)(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 & CAPLMASK;
-      /* Internal change requires this for API compatibility. */
-      if (cb.capture_last == 0) cb.capture_last = -1;
-      cb.callout_data     = md->callout_data;
-      cb.mark             = md->nomatch_mark;
-      if ((rrc = (*PUBL(callout))(&cb)) > 0) RRETURN(MATCH_NOMATCH);
-      if (rrc < 0) RRETURN(rrc);
+      unsigned int callout_length = (*ecode == OP_CALLOUT)
+          ? PRIV(OP_lengths)[OP_CALLOUT] : GET(ecode, 1 + 2*LINK_SIZE);
+
+      if (mb->callout != NULL)
+        {
+        pcre2_callout_block cb;
+        cb.version          = 1;
+        cb.callout_number   = ecode[LINK_SIZE + 1];
+        cb.capture_top      = offset_top/2;
+        cb.capture_last     = mb->capture_last & CAPLMASK;
+        cb.offset_vector    = mb->ovector;
+        cb.mark             = mb->nomatch_mark;
+        cb.subject          = mb->start_subject;
+        cb.subject_length   = (PCRE2_SIZE)(mb->end_subject - mb->start_subject);
+        cb.start_match      = (PCRE2_SIZE)(mstart - mb->start_subject);
+        cb.current_position = (PCRE2_SIZE)(eptr - mb->start_subject);
+        cb.pattern_position = GET(ecode, 1);
+        cb.next_item_length = GET(ecode, 1 + LINK_SIZE);
+
+        if (*ecode == OP_CALLOUT)
+          {
+          cb.callout_number = ecode[1 + 2*LINK_SIZE];
+          cb.callout_string_offset = 0;
+          cb.callout_string = NULL;
+          cb.callout_string_length = 0;
+          }
+        else
+          {
+          cb.callout_number = 0;
+          cb.callout_string_offset = GET(ecode, 1 + 3*LINK_SIZE);
+          cb.callout_string = ecode + (1 + 4*LINK_SIZE) + 1;
+          cb.callout_string_length =
+            callout_length - (1 + 4*LINK_SIZE) - 2;
+          }
+
+        if ((rrc = mb->callout(&cb, mb->callout_data)) > 0)
+          RRETURN(MATCH_NOMATCH);
+        if (rrc < 0) RRETURN(rrc);
+        }
+      ecode += callout_length;
       }
-    ecode += 2 + 2*LINK_SIZE;
     break;
 
     /* Recursion either matches the current regex, or some subexpression. The
@@ -1743,7 +1791,7 @@
     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.
+    OP_RECURSE_STACK_SAVE_MAX values to store; otherwise malloc is used.
 
     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
@@ -1752,75 +1800,106 @@
 
     case OP_RECURSE:
       {
+      ovecsave_frame *fr;
       recursion_info *ri;
-      unsigned int recno;
+      uint32_t recno;
 
-      callpat = md->start_code + GET(ecode, 1);
-      recno = (callpat == md->start_code)? 0 :
-        GET2(callpat, 1 + LINK_SIZE);
+      callpat = mb->start_code + GET(ecode, 1);
+      recno = (callpat == mb->start_code)? 0 : GET2(callpat, 1 + LINK_SIZE);
 
-      /* Check for repeating a recursion without advancing the subject pointer.
-      This should catch convoluted mutual recursions. (Some simple cases are
-      caught at compile time.) */
+      /* Check for repeating a pattern recursion without advancing the subject
+      pointer. This should catch convoluted mutual recursions. (Some simple
+      cases are caught at compile time.) */
 
-      for (ri = md->recursive; ri != NULL; ri = ri->prevrec)
+      for (ri = mb->recursive; ri != NULL; ri = ri->prevrec)
         if (recno == ri->group_num && eptr == ri->subject_position)
-          RRETURN(PCRE_ERROR_RECURSELOOP);
+          RRETURN(PCRE2_ERROR_RECURSELOOP);
 
       /* Add to "recursing stack" */
 
       new_recursive.group_num = recno;
-      new_recursive.saved_capture_last = md->capture_last;
+      new_recursive.saved_capture_last = mb->capture_last;
       new_recursive.subject_position = eptr;
-      new_recursive.prevrec = md->recursive;
-      md->recursive = &new_recursive;
+      new_recursive.prevrec = mb->recursive;
+      mb->recursive = &new_recursive;
 
       /* Where to continue from afterwards */
 
       ecode += 1 + LINK_SIZE;
 
-      /* Now save the offset data */
+      /* When we are using the system stack for match() recursion we can call a
+      function that uses the system stack for preserving the ovector while
+      processing the pattern recursion, but only if the ovector is small
+      enough. */
 
-      new_recursive.saved_max = md->offset_end;
-      if (new_recursive.saved_max <= REC_STACK_SAVE_MAX)
-        new_recursive.offset_save = stacksave;
+#ifndef HEAP_MATCH_RECURSE
+      if (mb->offset_end <= OP_RECURSE_STACK_SAVE_MAX)
+        {
+        rrc = op_recurse_ovecsave(eptr, callpat, mstart, offset_top, mb,
+          eptrb, rdepth);
+        mb->recursive = new_recursive.prevrec;
+        if (rrc != MATCH_MATCH && rrc != MATCH_ACCEPT) RRETURN(rrc);
+
+        /* Set where we got to in the subject, and reset the start, in case
+        it was changed by \K. This *is* propagated back out of a recursion,
+        for Perl compatibility. */
+
+        eptr = mb->end_match_ptr;
+        mstart = mb->start_match_ptr;
+        break;   /* End of processing OP_RECURSE */
+        }
+#endif
+      /* If the ovector is too big, or if we are using the heap for match()
+      recursion, we have to use the heap for saving the ovector. Used ovecsave
+      frames are kept on a chain and re-used. This makes a small improvement in
+      execution time on Linux. */
+
+      if (mb->ovecsave_chain != NULL)
+        {
+        new_recursive.ovec_save = mb->ovecsave_chain->saved_ovec;
+        mb->ovecsave_chain = mb->ovecsave_chain->next;
+        }
       else
         {
-        new_recursive.offset_save =
-          (int *)(PUBL(malloc))(new_recursive.saved_max * sizeof(int));
-        if (new_recursive.offset_save == NULL) RRETURN(PCRE_ERROR_NOMEMORY);
+        fr = (ovecsave_frame *)(mb->memctl.malloc(sizeof(ovecsave_frame *) +
+          mb->offset_end * sizeof(PCRE2_SIZE), mb->memctl.memory_data));
+        if (fr == NULL) RRETURN(PCRE2_ERROR_NOMEMORY);
+        new_recursive.ovec_save = fr->saved_ovec;
         }
-      memcpy(new_recursive.offset_save, md->offset_vector,
-            new_recursive.saved_max * sizeof(int));
 
-      /* OK, now we can do the recursion. After processing each alternative,
-      restore the offset data and the last captured value. If there were nested
-      recursions, md->recursive might be changed, so reset it before looping.
-      */
+      memcpy(new_recursive.ovec_save, mb->ovector,
+        mb->offset_end * sizeof(PCRE2_SIZE));
 
-      DPRINTF(("Recursing into group %d\n", new_recursive.group_num));
+      /* Do the recursion. After processing each alternative, restore the
+      ovector data and the last captured value. This code has the same overall
+      logic as the code in the op_recurse_ovecsave() function, but is adapted
+      to use RMATCH/RRETURN and to release the heap block containing the saved
+      ovector. */
+
       cbegroup = (*callpat >= OP_SBRA);
       do
         {
-        if (cbegroup) md->match_function_type = MATCH_CBEGROUP;
+        if (cbegroup) mb->match_function_type |= MATCH_CBEGROUP;
         RMATCH(eptr, callpat + PRIV(OP_lengths)[*callpat], offset_top,
-          md, eptrb, RM6);
-        memcpy(md->offset_vector, new_recursive.offset_save,
-            new_recursive.saved_max * sizeof(int));
-        md->capture_last = new_recursive.saved_capture_last;
-        md->recursive = new_recursive.prevrec;
+          mb, eptrb, RM6);
+        memcpy(mb->ovector, new_recursive.ovec_save,
+            mb->offset_end * sizeof(PCRE2_SIZE));
+        mb->capture_last = new_recursive.saved_capture_last;
+        mb->recursive = new_recursive.prevrec;
+
         if (rrc == MATCH_MATCH || rrc == MATCH_ACCEPT)
           {
-          DPRINTF(("Recursion matched\n"));
-          if (new_recursive.offset_save != stacksave)
-            (PUBL(free))(new_recursive.offset_save);
+          fr = (ovecsave_frame *)
+            ((uint8_t *)new_recursive.ovec_save - sizeof(ovecsave_frame *));
+          fr->next = mb->ovecsave_chain;
+          mb->ovecsave_chain = fr;
 
-          /* Set where we got to in the subject, and reset the start in case
+          /* Set where we got to in the subject, and reset the start, in case
           it was changed by \K. This *is* propagated back out of a recursion,
           for Perl compatibility. */
 
-          eptr = md->end_match_ptr;
-          mstart = md->start_match_ptr;
+          eptr = mb->end_match_ptr;
+          mstart = mb->start_match_ptr;
           goto RECURSION_MATCHED;        /* Exit loop; end processing */
           }
 
@@ -1830,31 +1909,25 @@
 
         if (rrc >= MATCH_BACKTRACK_MIN && rrc <= MATCH_BACKTRACK_MAX)
           {
-          if (new_recursive.offset_save != stacksave)
-            (PUBL(free))(new_recursive.offset_save);
-          RRETURN(MATCH_NOMATCH);
+          rrc = MATCH_NOMATCH;
+          goto RECURSION_RETURN;
           }
 
         /* Any return code other than NOMATCH is an error. */
 
-        if (rrc != MATCH_NOMATCH)
-          {
-          DPRINTF(("Recursion gave error %d\n", rrc));
-          if (new_recursive.offset_save != stacksave)
-            (PUBL(free))(new_recursive.offset_save);
-          RRETURN(rrc);
-          }
-
-        md->recursive = &new_recursive;
+        if (rrc != MATCH_NOMATCH) goto RECURSION_RETURN;
+        mb->recursive = &new_recursive;
         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)
-        (PUBL(free))(new_recursive.offset_save);
-      RRETURN(MATCH_NOMATCH);
+      RECURSION_RETURN:
+      mb->recursive = new_recursive.prevrec;
+      fr = (ovecsave_frame *)
+        ((uint8_t *)new_recursive.ovec_save - sizeof(ovecsave_frame *));
+      fr->next = mb->ovecsave_chain;
+      mb->ovecsave_chain = fr;
+      RRETURN(rrc);
       }
 
     RECURSION_MATCHED:
@@ -1874,25 +1947,25 @@
     optional ones preceded by BRAZERO or BRAMINZERO. */
 
     case OP_BRAZERO:
-    next = ecode + 1;
-    RMATCH(eptr, next, offset_top, md, eptrb, RM10);
+    next_ecode = ecode + 1;
+    RMATCH(eptr, next_ecode, offset_top, mb, eptrb, RM10);
     if (rrc != MATCH_NOMATCH) RRETURN(rrc);
-    do next += GET(next, 1); while (*next == OP_ALT);
-    ecode = next + 1 + LINK_SIZE;
+    do next_ecode += GET(next_ecode, 1); while (*next_ecode == OP_ALT);
+    ecode = next_ecode + 1 + LINK_SIZE;
     break;
 
     case OP_BRAMINZERO:
-    next = ecode + 1;
-    do next += GET(next, 1); while (*next == OP_ALT);
-    RMATCH(eptr, next + 1+LINK_SIZE, offset_top, md, eptrb, RM11);
+    next_ecode = ecode + 1;
+    do next_ecode += GET(next_ecode, 1); while (*next_ecode == OP_ALT);
+    RMATCH(eptr, next_ecode + 1+LINK_SIZE, offset_top, mb, eptrb, RM11);
     if (rrc != MATCH_NOMATCH) RRETURN(rrc);
     ecode++;
     break;
 
     case OP_SKIPZERO:
-    next = ecode+1;
-    do next += GET(next,1); while (*next == OP_ALT);
-    ecode = next + 1 + LINK_SIZE;
+    next_ecode = ecode+1;
+    do next_ecode += GET(next_ecode,1); while (*next_ecode == OP_ALT);
+    ecode = next_ecode + 1 + LINK_SIZE;
     break;
 
     /* BRAPOSZERO occurs before a possessive bracket group. Don't do anything
@@ -1931,10 +2004,11 @@
     if ((*prev >= OP_ASSERT && *prev <= OP_ASSERTBACK_NOT) ||
          *prev == OP_ONCE_NC)
       {
-      md->end_match_ptr = eptr;      /* For ONCE_NC */
-      md->end_offset_top = offset_top;
-      md->start_match_ptr = mstart;
-      RRETURN(MATCH_MATCH);         /* Sets md->mark */
+      mb->end_match_ptr = eptr;      /* For ONCE_NC */
+      mb->end_offset_top = offset_top;
+      mb->start_match_ptr = mstart;
+      if (eptr > mb->last_used_ptr) mb->last_used_ptr = eptr;
+      RRETURN(MATCH_MATCH);         /* Sets mb->mark */
       }
 
     /* For capturing groups we have to check the group number back at the start
@@ -1951,24 +2025,20 @@
       number = GET2(prev, 1+LINK_SIZE);
       offset = number << 1;
 
-#ifdef PCRE_DEBUG
-      printf("end bracket %d", number);
-      printf("\n");
-#endif
-
       /* Handle a recursively called group. */
 
-      if (md->recursive != NULL && md->recursive->group_num == number)
+      if (mb->recursive != NULL && mb->recursive->group_num == number)
         {
-        md->end_match_ptr = eptr;
-        md->start_match_ptr = mstart;
+        mb->end_match_ptr = eptr;
+        mb->start_match_ptr = mstart;
+        if (eptr > mb->last_used_ptr) mb->last_used_ptr = eptr;
         RRETURN(MATCH_MATCH);
         }
 
       /* Deal with capturing */
 
-      md->capture_last = (md->capture_last & OVFLMASK) | number;
-      if (offset >= md->offset_max) md->capture_last |= OVFLBIT; else
+      mb->capture_last = (mb->capture_last & OVFLMASK) | number;
+      if (offset >= mb->offset_max) mb->capture_last |= OVFLBIT; else
         {
         /* If offset is greater than offset_top, it means that we are
         "skipping" a capturing group, and that group's offsets must be marked
@@ -1982,16 +2052,15 @@
 
         if (offset > offset_top)
           {
-          register int *iptr = md->offset_vector + offset_top;
-          register int *iend = md->offset_vector + offset;
-          while (iptr < iend) *iptr++ = -1;
+          register PCRE2_SIZE *iptr = mb->ovector + offset_top;
+          register PCRE2_SIZE *iend = mb->ovector + offset;
+          while (iptr < iend) *iptr++ = PCRE2_UNSET;
           }
 
         /* Now make the extraction */
 
-        md->offset_vector[offset] =
-          md->offset_vector[md->offset_end - number];
-        md->offset_vector[offset+1] = (int)(eptr - md->start_subject);
+        mb->ovector[offset] = mb->ovector[mb->offset_end - number];
+        mb->ovector[offset+1] = eptr - mb->start_subject;
         if (offset_top <= offset) offset_top = offset + 2;
         }
       }
@@ -2003,9 +2072,10 @@
 
     if (*ecode == OP_KETRPOS)
       {
-      md->start_match_ptr = mstart;    /* In case \K reset it */
-      md->end_match_ptr = eptr;
-      md->end_offset_top = offset_top;
+      mb->start_match_ptr = mstart;    /* In case \K reset it */
+      mb->end_match_ptr = eptr;
+      mb->end_offset_top = offset_top;
+      if (eptr > mb->last_used_ptr) mb->last_used_ptr = eptr;
       RRETURN(MATCH_KETRPOS);
       }
 
@@ -2022,9 +2092,9 @@
       {
       if (*prev == OP_ONCE)
         {
-        RMATCH(eptr, ecode + 1 + LINK_SIZE, offset_top, md, eptrb, RM12);
+        RMATCH(eptr, ecode + 1 + LINK_SIZE, offset_top, mb, eptrb, RM12);
         if (rrc != MATCH_NOMATCH) RRETURN(rrc);
-        md->once_target = prev;  /* Level at which to change to MATCH_NOMATCH */
+        mb->once_target = prev;  /* Level at which to change to MATCH_NOMATCH */
         RRETURN(MATCH_ONCE);
         }
       ecode += 1 + LINK_SIZE;    /* Carry on at this level */
@@ -2039,18 +2109,18 @@
 
     if (*ecode == OP_KETRMIN)
       {
-      RMATCH(eptr, ecode + 1 + LINK_SIZE, offset_top, md, eptrb, RM7);
+      RMATCH(eptr, ecode + 1 + LINK_SIZE, offset_top, mb, eptrb, RM7);
       if (rrc != MATCH_NOMATCH) RRETURN(rrc);
       if (*prev == OP_ONCE)
         {
-        RMATCH(eptr, prev, offset_top, md, eptrb, RM8);
+        RMATCH(eptr, prev, offset_top, mb, eptrb, RM8);
         if (rrc != MATCH_NOMATCH) RRETURN(rrc);
-        md->once_target = prev;  /* Level at which to change to MATCH_NOMATCH */
+        mb->once_target = prev;  /* Level at which to change to MATCH_NOMATCH */
         RRETURN(MATCH_ONCE);
         }
       if (*prev >= OP_SBRA)    /* Could match an empty string */
         {
-        RMATCH(eptr, prev, offset_top, md, eptrb, RM50);
+        RMATCH(eptr, prev, offset_top, mb, eptrb, RM50);
         RRETURN(rrc);
         }
       ecode = prev;
@@ -2058,14 +2128,14 @@
       }
     else  /* OP_KETRMAX */
       {
-      RMATCH(eptr, prev, offset_top, md, eptrb, RM13);
-      if (rrc == MATCH_ONCE && md->once_target == prev) rrc = MATCH_NOMATCH;
+      RMATCH(eptr, prev, offset_top, mb, eptrb, RM13);
+      if (rrc == MATCH_ONCE && mb->once_target == prev) rrc = MATCH_NOMATCH;
       if (rrc != MATCH_NOMATCH) RRETURN(rrc);
       if (*prev == OP_ONCE)
         {
-        RMATCH(eptr, ecode + 1 + LINK_SIZE, offset_top, md, eptrb, RM9);
+        RMATCH(eptr, ecode + 1 + LINK_SIZE, offset_top, mb, eptrb, RM9);
         if (rrc != MATCH_NOMATCH) RRETURN(rrc);
-        md->once_target = prev;
+        mb->once_target = prev;
         RRETURN(MATCH_ONCE);
         }
       ecode += 1 + LINK_SIZE;
@@ -2076,21 +2146,26 @@
     /* Not multiline mode: start of subject assertion, unless notbol. */
 
     case OP_CIRC:
-    if (md->notbol && eptr == md->start_subject) RRETURN(MATCH_NOMATCH);
+    if ((mb->moptions & PCRE2_NOTBOL) != 0 && eptr == mb->start_subject)
+      RRETURN(MATCH_NOMATCH);
 
     /* Start of subject assertion */
 
     case OP_SOD:
-    if (eptr != md->start_subject) RRETURN(MATCH_NOMATCH);
+    if (eptr != mb->start_subject) RRETURN(MATCH_NOMATCH);
     ecode++;
     break;
 
-    /* Multiline mode: start of subject unless notbol, or after any newline. */
+    /* Multiline mode: start of subject unless notbol, or after any newline
+    except for one at the very end, unless PCRE2_ALT_CIRCUMFLEX is set. */
 
     case OP_CIRCM:
-    if (md->notbol && eptr == md->start_subject) RRETURN(MATCH_NOMATCH);
-    if (eptr != md->start_subject &&
-        (eptr == md->end_subject || !WAS_NEWLINE(eptr)))
+    if ((mb->moptions & PCRE2_NOTBOL) != 0 && eptr == mb->start_subject)
+      RRETURN(MATCH_NOMATCH);
+    if (eptr != mb->start_subject &&
+        ((eptr == mb->end_subject &&
+           (mb->poptions & PCRE2_ALT_CIRCUMFLEX) == 0) ||
+         !WAS_NEWLINE(eptr)))
       RRETURN(MATCH_NOMATCH);
     ecode++;
     break;
@@ -2098,7 +2173,7 @@
     /* Start of match assertion */
 
     case OP_SOM:
-    if (eptr != md->start_subject + md->start_offset) RRETURN(MATCH_NOMATCH);
+    if (eptr != mb->start_subject + mb->start_offset) RRETURN(MATCH_NOMATCH);
     ecode++;
     break;
 
@@ -2113,25 +2188,25 @@
     unless noteol is set. */
 
     case OP_DOLLM:
-    if (eptr < md->end_subject)
+    if (eptr < mb->end_subject)
       {
       if (!IS_NEWLINE(eptr))
         {
-        if (md->partial != 0 &&
-            eptr + 1 >= md->end_subject &&
+        if (mb->partial != 0 &&
+            eptr + 1 >= mb->end_subject &&
             NLBLOCK->nltype == NLTYPE_FIXED &&
             NLBLOCK->nllen == 2 &&
             UCHAR21TEST(eptr) == NLBLOCK->nl[0])
           {
-          md->hitend = TRUE;
-          if (md->partial > 1) RRETURN(PCRE_ERROR_PARTIAL);
+          mb->hitend = TRUE;
+          if (mb->partial > 1) RRETURN(PCRE2_ERROR_PARTIAL);
           }
         RRETURN(MATCH_NOMATCH);
         }
       }
     else
       {
-      if (md->noteol) RRETURN(MATCH_NOMATCH);
+      if ((mb->moptions & PCRE2_NOTEOL) != 0) RRETURN(MATCH_NOMATCH);
       SCHECK_PARTIAL();
       }
     ecode++;
@@ -2141,15 +2216,15 @@
     subject unless noteol is set. */
 
     case OP_DOLL:
-    if (md->noteol) RRETURN(MATCH_NOMATCH);
-    if (!md->endonly) goto ASSERT_NL_OR_EOS;
+    if ((mb->moptions & PCRE2_NOTEOL) != 0) RRETURN(MATCH_NOMATCH);
+    if ((mb->poptions & PCRE2_DOLLAR_ENDONLY) == 0) goto ASSERT_NL_OR_EOS;
 
     /* ... else fall through for endonly */
 
     /* End of subject assertion (\z) */
 
     case OP_EOD:
-    if (eptr < md->end_subject) RRETURN(MATCH_NOMATCH);
+    if (eptr < mb->end_subject) RRETURN(MATCH_NOMATCH);
     SCHECK_PARTIAL();
     ecode++;
     break;
@@ -2158,17 +2233,17 @@
 
     case OP_EODN:
     ASSERT_NL_OR_EOS:
-    if (eptr < md->end_subject &&
-        (!IS_NEWLINE(eptr) || eptr != md->end_subject - md->nllen))
+    if (eptr < mb->end_subject &&
+        (!IS_NEWLINE(eptr) || eptr != mb->end_subject - mb->nllen))
       {
-      if (md->partial != 0 &&
-          eptr + 1 >= md->end_subject &&
+      if (mb->partial != 0 &&
+          eptr + 1 >= mb->end_subject &&
           NLBLOCK->nltype == NLTYPE_FIXED &&
           NLBLOCK->nllen == 2 &&
           UCHAR21TEST(eptr) == NLBLOCK->nl[0])
         {
-        md->hitend = TRUE;
-        if (md->partial > 1) RRETURN(PCRE_ERROR_PARTIAL);
+        mb->hitend = TRUE;
+        if (mb->partial > 1) RRETURN(PCRE2_ERROR_PARTIAL);
         }
       RRETURN(MATCH_NOMATCH);
       }
@@ -2190,19 +2265,18 @@
       be "non-word" characters. Remember the earliest consulted character for
       partial matching. */
 
-#ifdef SUPPORT_UTF
+#ifdef SUPPORT_UNICODE
       if (utf)
         {
         /* Get status of previous character */
 
-        if (eptr == md->start_subject) prev_is_word = FALSE; else
+        if (eptr == mb->start_subject) prev_is_word = FALSE; else
           {
-          PCRE_PUCHAR lastptr = eptr - 1;
+          PCRE2_SPTR lastptr = eptr - 1;
           BACKCHAR(lastptr);
-          if (lastptr < md->start_used_ptr) md->start_used_ptr = lastptr;
+          if (lastptr < mb->start_used_ptr) mb->start_used_ptr = lastptr;
           GETCHAR(c, lastptr);
-#ifdef SUPPORT_UCP
-          if (md->use_ucp)
+          if ((mb->poptions & PCRE2_UCP) != 0)
             {
             if (c == '_') prev_is_word = TRUE; else
               {
@@ -2211,22 +2285,23 @@
               }
             }
           else
-#endif
-          prev_is_word = c < 256 && (md->ctypes[c] & ctype_word) != 0;
+          prev_is_word = c < 256 && (mb->ctypes[c] & ctype_word) != 0;
           }
 
         /* Get status of next character */
 
-        if (eptr >= md->end_subject)
+        if (eptr >= mb->end_subject)
           {
           SCHECK_PARTIAL();
           cur_is_word = FALSE;
           }
         else
           {
+          PCRE2_SPTR nextptr = eptr + 1;
+          FORWARDCHARTEST(nextptr, mb->end_subject);
+          if (nextptr > mb->last_used_ptr) mb->last_used_ptr = nextptr;
           GETCHAR(c, eptr);
-#ifdef SUPPORT_UCP
-          if (md->use_ucp)
+          if ((mb->poptions & PCRE2_UCP) != 0)
             {
             if (c == '_') cur_is_word = TRUE; else
               {
@@ -2235,24 +2310,23 @@
               }
             }
           else
-#endif
-          cur_is_word = c < 256 && (md->ctypes[c] & ctype_word) != 0;
+          cur_is_word = c < 256 && (mb->ctypes[c] & ctype_word) != 0;
           }
         }
       else
-#endif
+#endif  /* SUPPORT UTF */
 
-      /* Not in UTF-8 mode, but we may still have PCRE_UCP set, and for
+      /* Not in UTF-8 mode, but we may still have PCRE2_UCP set, and for
       consistency with the behaviour of \w we do use it in this case. */
 
         {
         /* Get status of previous character */
 
-        if (eptr == md->start_subject) prev_is_word = FALSE; else
+        if (eptr == mb->start_subject) prev_is_word = FALSE; else
           {
-          if (eptr <= md->start_used_ptr) md->start_used_ptr = eptr - 1;
-#ifdef SUPPORT_UCP
-          if (md->use_ucp)
+          if (eptr <= mb->start_used_ptr) mb->start_used_ptr = eptr - 1;
+#ifdef SUPPORT_UNICODE
+          if ((mb->poptions & PCRE2_UCP) != 0)
             {
             c = eptr[-1];
             if (c == '_') prev_is_word = TRUE; else
@@ -2264,31 +2338,34 @@
           else
 #endif
           prev_is_word = MAX_255(eptr[-1])
-            && ((md->ctypes[eptr[-1]] & ctype_word) != 0);
+            && ((mb->ctypes[eptr[-1]] & ctype_word) != 0);
           }
 
         /* Get status of next character */
 
-        if (eptr >= md->end_subject)
+        if (eptr >= mb->end_subject)
           {
           SCHECK_PARTIAL();
           cur_is_word = FALSE;
           }
         else
-#ifdef SUPPORT_UCP
-        if (md->use_ucp)
           {
-          c = *eptr;
-          if (c == '_') cur_is_word = TRUE; else
+          if (eptr >= mb->last_used_ptr) mb->last_used_ptr = eptr + 1;
+#ifdef SUPPORT_UNICODE
+          if ((mb->poptions & PCRE2_UCP) != 0)
             {
-            int cat = UCD_CATEGORY(c);
-            cur_is_word = (cat == ucp_L || cat == ucp_N);
+            c = *eptr;
+            if (c == '_') cur_is_word = TRUE; else
+              {
+              int cat = UCD_CATEGORY(c);
+              cur_is_word = (cat == ucp_L || cat == ucp_N);
+              }
             }
-          }
-        else
+          else
 #endif
-        cur_is_word = MAX_255(*eptr)
-          && ((md->ctypes[*eptr] & ctype_word) != 0);
+          cur_is_word = MAX_255(*eptr)
+            && ((mb->ctypes[*eptr] & ctype_word) != 0);
+          }
         }
 
       /* Now see if the situation is what we want */
@@ -2304,14 +2381,14 @@
 
     case OP_ANY:
     if (IS_NEWLINE(eptr)) RRETURN(MATCH_NOMATCH);
-    if (md->partial != 0 &&
-        eptr + 1 >= md->end_subject &&
+    if (mb->partial != 0 &&
+        eptr + 1 >= mb->end_subject &&
         NLBLOCK->nltype == NLTYPE_FIXED &&
         NLBLOCK->nllen == 2 &&
         UCHAR21TEST(eptr) == NLBLOCK->nl[0])
       {
-      md->hitend = TRUE;
-      if (md->partial > 1) RRETURN(PCRE_ERROR_PARTIAL);
+      mb->hitend = TRUE;
+      if (mb->partial > 1) RRETURN(PCRE2_ERROR_PARTIAL);
       }
 
     /* Fall through */
@@ -2319,23 +2396,24 @@
     /* Match any single character whatsoever. */
 
     case OP_ALLANY:
-    if (eptr >= md->end_subject)   /* DO NOT merge the eptr++ here; it must */
+    if (eptr >= mb->end_subject)   /* DO NOT merge the eptr++ here; it must */
       {                            /* not be updated before SCHECK_PARTIAL. */
       SCHECK_PARTIAL();
       RRETURN(MATCH_NOMATCH);
       }
     eptr++;
-#ifdef SUPPORT_UTF
-    if (utf) ACROSSCHAR(eptr < md->end_subject, *eptr, eptr++);
+#ifdef SUPPORT_UNICODE
+    if (utf) ACROSSCHAR(eptr < mb->end_subject, *eptr, 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. */
+    /* Match a single code unit, even in UTF-8 mode. This opcode really does
+    match any code unit, even newline. (It really should be called ANYCODEUNIT,
+    of course - the byte name is from pre-16 bit days.) */
 
     case OP_ANYBYTE:
-    if (eptr >= md->end_subject)   /* DO NOT merge the eptr++ here; it must */
+    if (eptr >= mb->end_subject)   /* DO NOT merge the eptr++ here; it must */
       {                            /* not be updated before SCHECK_PARTIAL. */
       SCHECK_PARTIAL();
       RRETURN(MATCH_NOMATCH);
@@ -2345,109 +2423,109 @@
     break;
 
     case OP_NOT_DIGIT:
-    if (eptr >= md->end_subject)
+    if (eptr >= mb->end_subject)
       {
       SCHECK_PARTIAL();
       RRETURN(MATCH_NOMATCH);
       }
     GETCHARINCTEST(c, eptr);
     if (
-#if defined SUPPORT_UTF || !(defined COMPILE_PCRE8)
+#ifdef SUPPORT_WIDE_CHARS
        c < 256 &&
 #endif
-       (md->ctypes[c] & ctype_digit) != 0
+       (mb->ctypes[c] & ctype_digit) != 0
        )
       RRETURN(MATCH_NOMATCH);
     ecode++;
     break;
 
     case OP_DIGIT:
-    if (eptr >= md->end_subject)
+    if (eptr >= mb->end_subject)
       {
       SCHECK_PARTIAL();
       RRETURN(MATCH_NOMATCH);
       }
     GETCHARINCTEST(c, eptr);
     if (
-#if defined SUPPORT_UTF || !(defined COMPILE_PCRE8)
+#ifdef SUPPORT_WIDE_CHARS
        c > 255 ||
 #endif
-       (md->ctypes[c] & ctype_digit) == 0
+       (mb->ctypes[c] & ctype_digit) == 0
        )
       RRETURN(MATCH_NOMATCH);
     ecode++;
     break;
 
     case OP_NOT_WHITESPACE:
-    if (eptr >= md->end_subject)
+    if (eptr >= mb->end_subject)
       {
       SCHECK_PARTIAL();
       RRETURN(MATCH_NOMATCH);
       }
     GETCHARINCTEST(c, eptr);
     if (
-#if defined SUPPORT_UTF || !(defined COMPILE_PCRE8)
+#ifdef SUPPORT_WIDE_CHARS
        c < 256 &&
 #endif
-       (md->ctypes[c] & ctype_space) != 0
+       (mb->ctypes[c] & ctype_space) != 0
        )
       RRETURN(MATCH_NOMATCH);
     ecode++;
     break;
 
     case OP_WHITESPACE:
-    if (eptr >= md->end_subject)
+    if (eptr >= mb->end_subject)
       {
       SCHECK_PARTIAL();
       RRETURN(MATCH_NOMATCH);
       }
     GETCHARINCTEST(c, eptr);
     if (
-#if defined SUPPORT_UTF || !(defined COMPILE_PCRE8)
+#ifdef SUPPORT_WIDE_CHARS
        c > 255 ||
 #endif
-       (md->ctypes[c] & ctype_space) == 0
+       (mb->ctypes[c] & ctype_space) == 0
        )
       RRETURN(MATCH_NOMATCH);
     ecode++;
     break;
 
     case OP_NOT_WORDCHAR:
-    if (eptr >= md->end_subject)
+    if (eptr >= mb->end_subject)
       {
       SCHECK_PARTIAL();
       RRETURN(MATCH_NOMATCH);
       }
     GETCHARINCTEST(c, eptr);
     if (
-#if defined SUPPORT_UTF || !(defined COMPILE_PCRE8)
+#ifdef SUPPORT_WIDE_CHARS
        c < 256 &&
 #endif
-       (md->ctypes[c] & ctype_word) != 0
+       (mb->ctypes[c] & ctype_word) != 0
        )
       RRETURN(MATCH_NOMATCH);
     ecode++;
     break;
 
     case OP_WORDCHAR:
-    if (eptr >= md->end_subject)
+    if (eptr >= mb->end_subject)
       {
       SCHECK_PARTIAL();
       RRETURN(MATCH_NOMATCH);
       }
     GETCHARINCTEST(c, eptr);
     if (
-#if defined SUPPORT_UTF || !(defined COMPILE_PCRE8)
+#ifdef SUPPORT_WIDE_CHARS
        c > 255 ||
 #endif
-       (md->ctypes[c] & ctype_word) == 0
+       (mb->ctypes[c] & ctype_word) == 0
        )
       RRETURN(MATCH_NOMATCH);
     ecode++;
     break;
 
     case OP_ANYNL:
-    if (eptr >= md->end_subject)
+    if (eptr >= mb->end_subject)
       {
       SCHECK_PARTIAL();
       RRETURN(MATCH_NOMATCH);
@@ -2458,7 +2536,7 @@
       default: RRETURN(MATCH_NOMATCH);
 
       case CHAR_CR:
-      if (eptr >= md->end_subject)
+      if (eptr >= mb->end_subject)
         {
         SCHECK_PARTIAL();
         }
@@ -2475,14 +2553,14 @@
       case 0x2028:
       case 0x2029:
 #endif  /* Not EBCDIC */
-      if (md->bsr_anycrlf) RRETURN(MATCH_NOMATCH);
+      if (mb->bsr_convention == PCRE2_BSR_ANYCRLF) RRETURN(MATCH_NOMATCH);
       break;
       }
     ecode++;
     break;
 
     case OP_NOT_HSPACE:
-    if (eptr >= md->end_subject)
+    if (eptr >= mb->end_subject)
       {
       SCHECK_PARTIAL();
       RRETURN(MATCH_NOMATCH);
@@ -2497,7 +2575,7 @@
     break;
 
     case OP_HSPACE:
-    if (eptr >= md->end_subject)
+    if (eptr >= mb->end_subject)
       {
       SCHECK_PARTIAL();
       RRETURN(MATCH_NOMATCH);
@@ -2512,7 +2590,7 @@
     break;
 
     case OP_NOT_VSPACE:
-    if (eptr >= md->end_subject)
+    if (eptr >= mb->end_subject)
       {
       SCHECK_PARTIAL();
       RRETURN(MATCH_NOMATCH);
@@ -2527,7 +2605,7 @@
     break;
 
     case OP_VSPACE:
-    if (eptr >= md->end_subject)
+    if (eptr >= mb->end_subject)
       {
       SCHECK_PARTIAL();
       RRETURN(MATCH_NOMATCH);
@@ -2541,20 +2619,20 @@
     ecode++;
     break;
 
-#ifdef SUPPORT_UCP
+#ifdef SUPPORT_UNICODE
     /* 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)
+    if (eptr >= mb->end_subject)
       {
       SCHECK_PARTIAL();
       RRETURN(MATCH_NOMATCH);
       }
     GETCHARINCTEST(c, eptr);
       {
-      const pcre_uint32 *cp;
+      const uint32_t *cp;
       const ucd_record *prop = GET_UCD(c);
 
       switch(ecode[1])
@@ -2641,7 +2719,7 @@
         /* This should never occur */
 
         default:
-        RRETURN(PCRE_ERROR_INTERNAL);
+        RRETURN(PCRE2_ERROR_INTERNAL);
         }
 
       ecode += 3;
@@ -2652,7 +2730,7 @@
     is in the binary; otherwise a compile-time error occurs. */
 
     case OP_EXTUNI:
-    if (eptr >= md->end_subject)
+    if (eptr >= mb->end_subject)
       {
       SCHECK_PARTIAL();
       RRETURN(MATCH_NOMATCH);
@@ -2662,7 +2740,7 @@
       int lgb, rgb;
       GETCHARINCTEST(c, eptr);
       lgb = UCD_GRAPHBREAK(c);
-      while (eptr < md->end_subject)
+      while (eptr < mb->end_subject)
         {
         int len = 1;
         if (!utf) c = *eptr; else { GETCHARLEN(c, eptr, len); }
@@ -2675,26 +2753,11 @@
     CHECK_PARTIAL();
     ecode++;
     break;
-#endif  /* SUPPORT_UCP */
+#endif  /* SUPPORT_UNICODE */
 
 
     /* 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). If the reference is unset, there are two possibilities:
-
-    (a) In the default, Perl-compatible state, set the length negative;
-    this ensures that every attempt at a match fails. We can't just fail
-    here, because of the possibility of quantifiers with zero minima.
-
-    (b) If the JavaScript compatibility flag is set, set the length to zero
-    so that the back reference matches an empty string.
-
-    Otherwise, set the length to the length of what was matched by the
-    referenced subpattern.
+    item to see if there is repeat information following.
 
     The OP_REF and OP_REFI opcodes are used for a reference to a numbered group
     or to a non-duplicated named group. For a duplicated named group, OP_DNREF
@@ -2706,24 +2769,18 @@
     caseless = op == OP_DNREFI;
       {
       int count = GET2(ecode, 1+IMM2_SIZE);
-      pcre_uchar *slot = md->name_table + GET2(ecode, 1) * md->name_entry_size;
+      PCRE2_SPTR slot = mb->name_table + GET2(ecode, 1) * mb->name_entry_size;
       ecode += 1 + 2*IMM2_SIZE;
 
-      /* Setting the default length first and initializing 'offset' avoids
-      compiler warnings in the REF_REPEAT code. */
+      /* Initializing 'offset' avoids a compiler warning in the REF_REPEAT
+      code. */
 
-      length = (md->jscript_compat)? 0 : -1;
       offset = 0;
-
       while (count-- > 0)
         {
         offset = GET2(slot, 0) << 1;
-        if (offset < offset_top && md->offset_vector[offset] >= 0)
-          {
-          length = md->offset_vector[offset+1] - md->offset_vector[offset];
-          break;
-          }
-        slot += md->name_entry_size;
+        if (offset < offset_top && mb->ovector[offset] != PCRE2_UNSET) break;
+        slot += mb->name_entry_size;
         }
       }
     goto REF_REPEAT;
@@ -2733,10 +2790,6 @@
     caseless = op == OP_REFI;
     offset = GET2(ecode, 1) << 1;               /* Doubled ref number */
     ecode += 1 + IMM2_SIZE;
-    if (offset >= offset_top || md->offset_vector[offset] < 0)
-      length = (md->jscript_compat)? 0 : -1;
-    else
-      length = md->offset_vector[offset+1] - md->offset_vector[offset];
 
     /* Set up for repetition, or handle the non-repeated case */
 
@@ -2765,25 +2818,36 @@
       ecode += 1 + 2 * IMM2_SIZE;
       break;
 
-      default:               /* No repeat follows */
-      if ((length = match_ref(offset, eptr, length, md, caseless)) < 0)
+      default:                  /* No repeat follows */
         {
-        if (length == -2) eptr = md->end_subject;   /* Partial match */
-        CHECK_PARTIAL();
-        RRETURN(MATCH_NOMATCH);
+        int rc = match_ref(offset, offset_top, eptr, mb, caseless, &length);
+        if (rc != 0)
+          {
+          if (rc > 0) eptr = mb->end_subject;   /* Partial match */
+          CHECK_PARTIAL();
+          RRETURN(MATCH_NOMATCH);
+          }
         }
       eptr += length;
       continue;              /* With the main loop */
       }
 
-    /* Handle repeated back references. If the length of the reference is
-    zero, just continue with the main loop. If the length is negative, it
-    means the reference is unset in non-Java-compatible mode. If the minimum is
-    zero, we can continue at the same level without recursion. For any other
-    minimum, carrying on will result in NOMATCH. */
+    /* Handle repeated back references. If a set group has length zero, just
+    continue with the main loop, because it matches however many times. For an
+    unset reference, if the minimum is zero, we can also just continue. We an
+    also continue if PCRE2_MATCH_UNSET_BACKREF is set, because this makes unset
+    group be have as a zero-length group. For any other unset cases, carrying
+    on will result in NOMATCH. */
 
-    if (length == 0) continue;
-    if (length < 0 && min == 0) continue;
+    if (offset < offset_top && mb->ovector[offset] != PCRE2_UNSET)
+      {
+      if (mb->ovector[offset] == mb->ovector[offset + 1]) continue;
+      }
+    else  /* Group is not set */
+      {
+      if (min == 0 || (mb->poptions & PCRE2_MATCH_UNSET_BACKREF) != 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
@@ -2791,10 +2855,11 @@
 
     for (i = 1; i <= min; i++)
       {
-      int slength;
-      if ((slength = match_ref(offset, eptr, length, md, caseless)) < 0)
+      PCRE2_SIZE slength;
+      int rc = match_ref(offset, offset_top, eptr, mb, caseless, &slength);
+      if (rc != 0)
         {
-        if (slength == -2) eptr = md->end_subject;   /* Partial match */
+        if (rc > 0) eptr = mb->end_subject;   /* Partial match */
         CHECK_PARTIAL();
         RRETURN(MATCH_NOMATCH);
         }
@@ -2812,13 +2877,15 @@
       {
       for (fi = min;; fi++)
         {
-        int slength;
-        RMATCH(eptr, ecode, offset_top, md, eptrb, RM14);
+        int rc;
+        PCRE2_SIZE slength;
+        RMATCH(eptr, ecode, offset_top, mb, eptrb, RM14);
         if (rrc != MATCH_NOMATCH) RRETURN(rrc);
         if (fi >= max) RRETURN(MATCH_NOMATCH);
-        if ((slength = match_ref(offset, eptr, length, md, caseless)) < 0)
+        rc = match_ref(offset, offset_top, eptr, mb, caseless, &slength);
+        if (rc != 0)
           {
-          if (slength == -2) eptr = md->end_subject;   /* Partial match */
+          if (rc > 0) eptr = mb->end_subject;   /* Partial match */
           CHECK_PARTIAL();
           RRETURN(MATCH_NOMATCH);
           }
@@ -2827,36 +2894,76 @@
       /* Control never gets here */
       }
 
-    /* If maximizing, find the longest string and work backwards */
+    /* If maximizing, find the longest string and work backwards, as long as
+    the matched lengths for each iteration are the same. */
 
     else
       {
+      BOOL samelengths = TRUE;
       pp = eptr;
+      length = mb->ovector[offset+1] - mb->ovector[offset];
+
       for (i = min; i < max; i++)
         {
-        int slength;
-        if ((slength = match_ref(offset, eptr, length, md, caseless)) < 0)
+        PCRE2_SIZE slength;
+        int rc = match_ref(offset, offset_top, eptr, mb, caseless, &slength);
+
+        if (rc != 0)
           {
           /* Can't use CHECK_PARTIAL because we don't want to update eptr in
           the soft partial matching case. */
 
-          if (slength == -2 && md->partial != 0 &&
-              md->end_subject > md->start_used_ptr)
+          if (rc > 0 && mb->partial != 0 &&
+              mb->end_subject > mb->start_used_ptr)
             {
-            md->hitend = TRUE;
-            if (md->partial > 1) RRETURN(PCRE_ERROR_PARTIAL);
+            mb->hitend = TRUE;
+            if (mb->partial > 1) RRETURN(PCRE2_ERROR_PARTIAL);
             }
           break;
           }
+
+        if (slength != length) samelengths = FALSE;
         eptr += slength;
         }
 
-      while (eptr >= pp)
+      /* If the length matched for each repetition is the same as the length of
+      the captured group, we can easily work backwards. This is the normal
+      case. However, in caseless UTF-8 mode there are pairs of case-equivalent
+      characters whose lengths (in terms of code units) differ. However, this
+      is very rare, so we handle it by re-matching fewer and fewer times. */
+
+      if (samelengths)
         {
-        RMATCH(eptr, ecode, offset_top, md, eptrb, RM15);
-        if (rrc != MATCH_NOMATCH) RRETURN(rrc);
-        eptr -= length;
+        while (eptr >= pp)
+          {
+          RMATCH(eptr, ecode, offset_top, mb, eptrb, RM15);
+          if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+          eptr -= length;
+          }
         }
+
+      /* The rare case of non-matching lengths. Re-scan the repetition for each
+      iteration. We know that match_ref() will succeed every time. */
+
+      else
+        {
+        max = i;
+        for (;;)
+          {
+          RMATCH(eptr, ecode, offset_top, mb, eptrb, RM68);
+          if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+          if (eptr == pp) break;  /* Failed after minimal repetition */
+          eptr = pp;
+          max--;
+          for (i = min; i < max; i++)
+            {
+            PCRE2_SIZE slength;
+            (void)match_ref(offset, offset_top, eptr, mb, caseless, &slength);
+            eptr += slength;
+            }
+          }
+        }
+
       RRETURN(MATCH_NOMATCH);
       }
     /* Control never gets here */
@@ -2877,9 +2984,9 @@
       {
       /* The data variable is saved across frames, so the byte map needs to
       be stored there. */
-#define BYTE_MAP ((pcre_uint8 *)data)
+#define BYTE_MAP ((uint8_t *)data)
       data = ecode + 1;                /* Save for matching */
-      ecode += 1 + (32 / sizeof(pcre_uchar)); /* Advance past the item */
+      ecode += 1 + (32 / sizeof(PCRE2_UCHAR)); /* Advance past the item */
 
       switch (*ecode)
         {
@@ -2918,12 +3025,12 @@
 
       /* First, ensure the minimum number of matches are present. */
 
-#ifdef SUPPORT_UTF
+#ifdef SUPPORT_UNICODE
       if (utf)
         {
         for (i = 1; i <= min; i++)
           {
-          if (eptr >= md->end_subject)
+          if (eptr >= mb->end_subject)
             {
             SCHECK_PARTIAL();
             RRETURN(MATCH_NOMATCH);
@@ -2943,13 +3050,13 @@
         {
         for (i = 1; i <= min; i++)
           {
-          if (eptr >= md->end_subject)
+          if (eptr >= mb->end_subject)
             {
             SCHECK_PARTIAL();
             RRETURN(MATCH_NOMATCH);
             }
           c = *eptr++;
-#ifndef COMPILE_PCRE8
+#if PCRE2_CODE_UNIT_WIDTH != 8
           if (c > 255)
             {
             if (op == OP_CLASS) RRETURN(MATCH_NOMATCH);
@@ -2970,15 +3077,15 @@
 
       if (minimize)
         {
-#ifdef SUPPORT_UTF
+#ifdef SUPPORT_UNICODE
         if (utf)
           {
           for (fi = min;; fi++)
             {
-            RMATCH(eptr, ecode, offset_top, md, eptrb, RM16);
+            RMATCH(eptr, ecode, offset_top, mb, eptrb, RM16);
             if (rrc != MATCH_NOMATCH) RRETURN(rrc);
             if (fi >= max) RRETURN(MATCH_NOMATCH);
-            if (eptr >= md->end_subject)
+            if (eptr >= mb->end_subject)
               {
               SCHECK_PARTIAL();
               RRETURN(MATCH_NOMATCH);
@@ -2998,16 +3105,16 @@
           {
           for (fi = min;; fi++)
             {
-            RMATCH(eptr, ecode, offset_top, md, eptrb, RM17);
+            RMATCH(eptr, ecode, offset_top, mb, eptrb, RM17);
             if (rrc != MATCH_NOMATCH) RRETURN(rrc);
             if (fi >= max) RRETURN(MATCH_NOMATCH);
-            if (eptr >= md->end_subject)
+            if (eptr >= mb->end_subject)
               {
               SCHECK_PARTIAL();
               RRETURN(MATCH_NOMATCH);
               }
             c = *eptr++;
-#ifndef COMPILE_PCRE8
+#if PCRE2_CODE_UNIT_WIDTH != 8
             if (c > 255)
               {
               if (op == OP_CLASS) RRETURN(MATCH_NOMATCH);
@@ -3026,13 +3133,13 @@
         {
         pp = eptr;
 
-#ifdef SUPPORT_UTF
+#ifdef SUPPORT_UNICODE
         if (utf)
           {
           for (i = min; i < max; i++)
             {
             int len = 1;
-            if (eptr >= md->end_subject)
+            if (eptr >= mb->end_subject)
               {
               SCHECK_PARTIAL();
               break;
@@ -3051,7 +3158,7 @@
 
           for (;;)
             {
-            RMATCH(eptr, ecode, offset_top, md, eptrb, RM18);
+            RMATCH(eptr, ecode, offset_top, mb, eptrb, RM18);
             if (rrc != MATCH_NOMATCH) RRETURN(rrc);
             if (eptr-- == pp) break;        /* Stop if tried at original pos */
             BACKCHAR(eptr);
@@ -3063,13 +3170,13 @@
           {
           for (i = min; i < max; i++)
             {
-            if (eptr >= md->end_subject)
+            if (eptr >= mb->end_subject)
               {
               SCHECK_PARTIAL();
               break;
               }
             c = *eptr;
-#ifndef COMPILE_PCRE8
+#if PCRE2_CODE_UNIT_WIDTH != 8
             if (c > 255)
               {
               if (op == OP_CLASS) break;
@@ -3084,7 +3191,7 @@
 
           while (eptr >= pp)
             {
-            RMATCH(eptr, ecode, offset_top, md, eptrb, RM19);
+            RMATCH(eptr, ecode, offset_top, mb, eptrb, RM19);
             if (rrc != MATCH_NOMATCH) RRETURN(rrc);
             eptr--;
             }
@@ -3102,7 +3209,7 @@
     32-bit libraries, codepoints greater than 255 may be encountered even when
     UTF is not supported. */
 
-#if defined SUPPORT_UTF || !defined COMPILE_PCRE8
+#ifdef SUPPORT_WIDE_CHARS
     case OP_XCLASS:
       {
       data = ecode + 1 + LINK_SIZE;                /* Save for matching */
@@ -3147,7 +3254,7 @@
 
       for (i = 1; i <= min; i++)
         {
-        if (eptr >= md->end_subject)
+        if (eptr >= mb->end_subject)
           {
           SCHECK_PARTIAL();
           RRETURN(MATCH_NOMATCH);
@@ -3168,10 +3275,10 @@
         {
         for (fi = min;; fi++)
           {
-          RMATCH(eptr, ecode, offset_top, md, eptrb, RM20);
+          RMATCH(eptr, ecode, offset_top, mb, eptrb, RM20);
           if (rrc != MATCH_NOMATCH) RRETURN(rrc);
           if (fi >= max) RRETURN(MATCH_NOMATCH);
-          if (eptr >= md->end_subject)
+          if (eptr >= mb->end_subject)
             {
             SCHECK_PARTIAL();
             RRETURN(MATCH_NOMATCH);
@@ -3190,12 +3297,12 @@
         for (i = min; i < max; i++)
           {
           int len = 1;
-          if (eptr >= md->end_subject)
+          if (eptr >= mb->end_subject)
             {
             SCHECK_PARTIAL();
             break;
             }
-#ifdef SUPPORT_UTF
+#ifdef SUPPORT_UNICODE
           GETCHARLENTEST(c, eptr, len);
 #else
           c = *eptr;
@@ -3208,10 +3315,10 @@
 
         for(;;)
           {
-          RMATCH(eptr, ecode, offset_top, md, eptrb, RM21);
+          RMATCH(eptr, ecode, offset_top, mb, eptrb, RM21);
           if (rrc != MATCH_NOMATCH) RRETURN(rrc);
           if (eptr-- == pp) break;        /* Stop if tried at original pos */
-#ifdef SUPPORT_UTF
+#ifdef SUPPORT_UNICODE
           if (utf) BACKCHAR(eptr);
 #endif
           }
@@ -3225,24 +3332,27 @@
     /* Match a single character, casefully */
 
     case OP_CHAR:
-#ifdef SUPPORT_UTF
+#ifdef SUPPORT_UNICODE
     if (utf)
       {
       length = 1;
       ecode++;
       GETCHARLEN(fc, ecode, length);
-      if (length > md->end_subject - eptr)
+      if (length > (PCRE2_SIZE)(mb->end_subject - eptr))
         {
         CHECK_PARTIAL();             /* Not SCHECK_PARTIAL() */
         RRETURN(MATCH_NOMATCH);
         }
-      while (length-- > 0) if (*ecode++ != UCHAR21INC(eptr)) RRETURN(MATCH_NOMATCH);
+      for (; length > 0; length--)
+        {
+        if (*ecode++ != UCHAR21INC(eptr)) RRETURN(MATCH_NOMATCH);
+        }
       }
     else
 #endif
     /* Not UTF mode */
       {
-      if (md->end_subject - eptr < 1)
+      if (mb->end_subject - eptr < 1)
         {
         SCHECK_PARTIAL();            /* This one can use SCHECK_PARTIAL() */
         RRETURN(MATCH_NOMATCH);
@@ -3256,13 +3366,13 @@
     subject, give up immediately. */
 
     case OP_CHARI:
-    if (eptr >= md->end_subject)
+    if (eptr >= mb->end_subject)
       {
       SCHECK_PARTIAL();
       RRETURN(MATCH_NOMATCH);
       }
 
-#ifdef SUPPORT_UTF
+#ifdef SUPPORT_UNICODE
     if (utf)
       {
       length = 1;
@@ -3276,8 +3386,8 @@
 
       if (fc < 128)
         {
-        pcre_uint32 cc = UCHAR21(eptr);
-        if (md->lcc[fc] != TABLE_GET(cc, md->lcc, cc)) RRETURN(MATCH_NOMATCH);
+        uint32_t cc = UCHAR21(eptr);
+        if (mb->lcc[fc] != TABLE_GET(cc, mb->lcc, cc)) RRETURN(MATCH_NOMATCH);
         ecode++;
         eptr++;
         }
@@ -3288,7 +3398,7 @@
 
       else
         {
-        pcre_uint32 dc;
+        uint32_t dc;
         GETCHARINC(dc, eptr);
         ecode += length;
 
@@ -3297,7 +3407,7 @@
 
         if (fc != dc)
           {
-#ifdef SUPPORT_UCP
+#ifdef SUPPORT_UNICODE
           if (dc != UCD_OTHERCASE(fc))
 #endif
             RRETURN(MATCH_NOMATCH);
@@ -3305,12 +3415,12 @@
         }
       }
     else
-#endif   /* SUPPORT_UTF */
+#endif   /* SUPPORT_UNICODE */
 
     /* Not UTF mode */
       {
-      if (TABLE_GET(ecode[1], md->lcc, ecode[1])
-          != TABLE_GET(*eptr, md->lcc, *eptr)) RRETURN(MATCH_NOMATCH);
+      if (TABLE_GET(ecode[1], mb->lcc, ecode[1])
+          != TABLE_GET(*eptr, mb->lcc, *eptr)) RRETURN(MATCH_NOMATCH);
       eptr++;
       ecode += 2;
       }
@@ -3399,7 +3509,7 @@
     for speed. */
 
     REPEATCHAR:
-#ifdef SUPPORT_UTF
+#ifdef SUPPORT_UNICODE
     if (utf)
       {
       length = 1;
@@ -3412,23 +3522,19 @@
 
       if (length > 1)
         {
-#ifdef SUPPORT_UCP
-        pcre_uint32 othercase;
+        uint32_t othercase;
         if (op >= OP_STARI &&     /* Caseless */
             (othercase = UCD_OTHERCASE(fc)) != fc)
           oclength = PRIV(ord2utf)(othercase, occhars);
         else oclength = 0;
-#endif  /* SUPPORT_UCP */
 
         for (i = 1; i <= min; i++)
           {
-          if (eptr <= md->end_subject - length &&
-            memcmp(eptr, charptr, IN_UCHARS(length)) == 0) eptr += length;
-#ifdef SUPPORT_UCP
+          if (eptr <= mb->end_subject - length &&
+            memcmp(eptr, charptr, CU2BYTES(length)) == 0) eptr += length;
           else if (oclength > 0 &&
-                   eptr <= md->end_subject - oclength &&
-                   memcmp(eptr, occhars, IN_UCHARS(oclength)) == 0) eptr += oclength;
-#endif  /* SUPPORT_UCP */
+                   eptr <= mb->end_subject - oclength &&
+                   memcmp(eptr, occhars, CU2BYTES(oclength)) == 0) eptr += oclength;
           else
             {
             CHECK_PARTIAL();
@@ -3442,16 +3548,14 @@
           {
           for (fi = min;; fi++)
             {
-            RMATCH(eptr, ecode, offset_top, md, eptrb, RM22);
+            RMATCH(eptr, ecode, offset_top, mb, eptrb, RM22);
             if (rrc != MATCH_NOMATCH) RRETURN(rrc);
             if (fi >= max) RRETURN(MATCH_NOMATCH);
-            if (eptr <= md->end_subject - length &&
-              memcmp(eptr, charptr, IN_UCHARS(length)) == 0) eptr += length;
-#ifdef SUPPORT_UCP
+            if (eptr <= mb->end_subject - length &&
+              memcmp(eptr, charptr, CU2BYTES(length)) == 0) eptr += length;
             else if (oclength > 0 &&
-                     eptr <= md->end_subject - oclength &&
-                     memcmp(eptr, occhars, IN_UCHARS(oclength)) == 0) eptr += oclength;
-#endif  /* SUPPORT_UCP */
+                     eptr <= mb->end_subject - oclength &&
+                     memcmp(eptr, occhars, CU2BYTES(oclength)) == 0) eptr += oclength;
             else
               {
               CHECK_PARTIAL();
@@ -3466,13 +3570,11 @@
           pp = eptr;
           for (i = min; i < max; i++)
             {
-            if (eptr <= md->end_subject - length &&
-                memcmp(eptr, charptr, IN_UCHARS(length)) == 0) eptr += length;
-#ifdef SUPPORT_UCP
+            if (eptr <= mb->end_subject - length &&
+                memcmp(eptr, charptr, CU2BYTES(length)) == 0) eptr += length;
             else if (oclength > 0 &&
-                     eptr <= md->end_subject - oclength &&
-                     memcmp(eptr, occhars, IN_UCHARS(oclength)) == 0) eptr += oclength;
-#endif  /* SUPPORT_UCP */
+                     eptr <= mb->end_subject - oclength &&
+                     memcmp(eptr, occhars, CU2BYTES(oclength)) == 0) eptr += oclength;
             else
               {
               CHECK_PARTIAL();
@@ -3481,17 +3583,17 @@
             }
 
           if (possessive) continue;    /* No backtracking */
+
+          /* After \C in UTF mode, pp might be in the middle of a Unicode
+          character. Use <= pp to ensure backtracking doesn't go too far. */
+
           for(;;)
             {
             if (eptr <= pp) goto TAIL_RECURSE;
-            RMATCH(eptr, ecode, offset_top, md, eptrb, RM23);
+            RMATCH(eptr, ecode, offset_top, mb, eptrb, RM23);
             if (rrc != MATCH_NOMATCH) RRETURN(rrc);
-#ifdef SUPPORT_UCP
             eptr--;
             BACKCHAR(eptr);
-#else   /* without SUPPORT_UCP */
-            eptr -= length;
-#endif  /* SUPPORT_UCP */
             }
           }
         /* Control never gets here */
@@ -3502,7 +3604,8 @@
       value of fc will always be < 128. */
       }
     else
-#endif  /* SUPPORT_UTF */
+#endif  /* SUPPORT_UNICODE */
+
       /* When not in UTF-8 mode, load a single-byte character. */
       fc = *ecode++;
 
@@ -3515,32 +3618,24 @@
     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, (char *)eptr));
-
     if (op >= OP_STARI)  /* Caseless */
       {
-#ifdef COMPILE_PCRE8
+#if PCRE2_CODE_UNIT_WIDTH == 8
       /* fc must be < 128 if UTF is enabled. */
-      foc = md->fcc[fc];
+      foc = mb->fcc[fc];
 #else
-#ifdef SUPPORT_UTF
-#ifdef SUPPORT_UCP
+#ifdef SUPPORT_UNICODE
       if (utf && fc > 127)
         foc = UCD_OTHERCASE(fc);
-#else
-      if (utf && fc > 127)
-        foc = fc;
-#endif /* SUPPORT_UCP */
       else
-#endif /* SUPPORT_UTF */
-        foc = TABLE_GET(fc, md->fcc, fc);
-#endif /* COMPILE_PCRE8 */
+#endif /* SUPPORT_UNICODE */
+        foc = TABLE_GET(fc, mb->fcc, fc);
+#endif /* PCRE2_CODE_UNIT_WIDTH == 8 */
 
       for (i = 1; i <= min; i++)
         {
-        pcre_uint32 cc;                 /* Faster than pcre_uchar */
-        if (eptr >= md->end_subject)
+        uint32_t cc;                 /* Faster than PCRE2_UCHAR */
+        if (eptr >= mb->end_subject)
           {
           SCHECK_PARTIAL();
           RRETURN(MATCH_NOMATCH);
@@ -3554,11 +3649,11 @@
         {
         for (fi = min;; fi++)
           {
-          pcre_uint32 cc;               /* Faster than pcre_uchar */
-          RMATCH(eptr, ecode, offset_top, md, eptrb, RM24);
+          uint32_t cc;               /* Faster than PCRE2_UCHAR */
+          RMATCH(eptr, ecode, offset_top, mb, eptrb, RM24);
           if (rrc != MATCH_NOMATCH) RRETURN(rrc);
           if (fi >= max) RRETURN(MATCH_NOMATCH);
-          if (eptr >= md->end_subject)
+          if (eptr >= mb->end_subject)
             {
             SCHECK_PARTIAL();
             RRETURN(MATCH_NOMATCH);
@@ -3574,8 +3669,8 @@
         pp = eptr;
         for (i = min; i < max; i++)
           {
-          pcre_uint32 cc;               /* Faster than pcre_uchar */
-          if (eptr >= md->end_subject)
+          uint32_t cc;               /* Faster than PCRE2_UCHAR */
+          if (eptr >= mb->end_subject)
             {
             SCHECK_PARTIAL();
             break;
@@ -3588,7 +3683,7 @@
         for (;;)
           {
           if (eptr == pp) goto TAIL_RECURSE;
-          RMATCH(eptr, ecode, offset_top, md, eptrb, RM25);
+          RMATCH(eptr, ecode, offset_top, mb, eptrb, RM25);
           eptr--;
           if (rrc != MATCH_NOMATCH) RRETURN(rrc);
           }
@@ -3602,7 +3697,7 @@
       {
       for (i = 1; i <= min; i++)
         {
-        if (eptr >= md->end_subject)
+        if (eptr >= mb->end_subject)
           {
           SCHECK_PARTIAL();
           RRETURN(MATCH_NOMATCH);
@@ -3616,10 +3711,10 @@
         {
         for (fi = min;; fi++)
           {
-          RMATCH(eptr, ecode, offset_top, md, eptrb, RM26);
+          RMATCH(eptr, ecode, offset_top, mb, eptrb, RM26);
           if (rrc != MATCH_NOMATCH) RRETURN(rrc);
           if (fi >= max) RRETURN(MATCH_NOMATCH);
-          if (eptr >= md->end_subject)
+          if (eptr >= mb->end_subject)
             {
             SCHECK_PARTIAL();
             RRETURN(MATCH_NOMATCH);
@@ -3633,7 +3728,7 @@
         pp = eptr;
         for (i = min; i < max; i++)
           {
-          if (eptr >= md->end_subject)
+          if (eptr >= mb->end_subject)
             {
             SCHECK_PARTIAL();
             break;
@@ -3645,7 +3740,7 @@
         for (;;)
           {
           if (eptr == pp) goto TAIL_RECURSE;
-          RMATCH(eptr, ecode, offset_top, md, eptrb, RM27);
+          RMATCH(eptr, ecode, offset_top, mb, eptrb, RM27);
           eptr--;
           if (rrc != MATCH_NOMATCH) RRETURN(rrc);
           }
@@ -3659,15 +3754,15 @@
 
     case OP_NOT:
     case OP_NOTI:
-    if (eptr >= md->end_subject)
+    if (eptr >= mb->end_subject)
       {
       SCHECK_PARTIAL();
       RRETURN(MATCH_NOMATCH);
       }
-#ifdef SUPPORT_UTF
+#ifdef SUPPORT_UNICODE
     if (utf)
       {
-      register pcre_uint32 ch, och;
+      register uint32_t ch, och;
 
       ecode++;
       GETCHARINC(ch, ecode);
@@ -3679,24 +3774,19 @@
         }
       else
         {
-#ifdef SUPPORT_UCP
         if (ch > 127)
           och = UCD_OTHERCASE(ch);
-#else
-        if (ch > 127)
-          och = ch;
-#endif /* SUPPORT_UCP */
         else
-          och = TABLE_GET(ch, md->fcc, ch);
+          och = TABLE_GET(ch, mb->fcc, ch);
         if (ch == c || och == c) RRETURN(MATCH_NOMATCH);
         }
       }
     else
-#endif
+#endif  /* SUPPORT_UNICODE */
       {
-      register pcre_uint32 ch = ecode[1];
+      register uint32_t ch = ecode[1];
       c = *eptr++;
-      if (ch == c || (op == OP_NOTI && TABLE_GET(ch, md->fcc, ch) == c))
+      if (ch == c || (op == OP_NOTI && TABLE_GET(ch, mb->fcc, ch) == c))
         RRETURN(MATCH_NOMATCH);
       ecode += 2;
       }
@@ -3788,45 +3878,37 @@
     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, (char *)eptr));
-
     if (op >= OP_NOTSTARI)     /* Caseless */
       {
-#ifdef SUPPORT_UTF
-#ifdef SUPPORT_UCP
+#ifdef SUPPORT_UNICODE
       if (utf && fc > 127)
         foc = UCD_OTHERCASE(fc);
-#else
-      if (utf && fc > 127)
-        foc = fc;
-#endif /* SUPPORT_UCP */
       else
-#endif /* SUPPORT_UTF */
-        foc = TABLE_GET(fc, md->fcc, fc);
+#endif /* SUPPORT_UNICODE */
+        foc = TABLE_GET(fc, mb->fcc, fc);
 
-#ifdef SUPPORT_UTF
+#ifdef SUPPORT_UNICODE
       if (utf)
         {
-        register pcre_uint32 d;
+        register uint32_t d;
         for (i = 1; i <= min; i++)
           {
-          if (eptr >= md->end_subject)
+          if (eptr >= mb->end_subject)
             {
             SCHECK_PARTIAL();
             RRETURN(MATCH_NOMATCH);
             }
           GETCHARINC(d, eptr);
-          if (fc == d || (unsigned int)foc == d) RRETURN(MATCH_NOMATCH);
+          if (fc == d || (uint32_t)foc == d) RRETURN(MATCH_NOMATCH);
           }
         }
       else
-#endif  /* SUPPORT_UTF */
+#endif  /* SUPPORT_UNICODE */
       /* Not UTF mode */
         {
         for (i = 1; i <= min; i++)
           {
-          if (eptr >= md->end_subject)
+          if (eptr >= mb->end_subject)
             {
             SCHECK_PARTIAL();
             RRETURN(MATCH_NOMATCH);
@@ -3840,34 +3922,34 @@
 
       if (minimize)
         {
-#ifdef SUPPORT_UTF
+#ifdef SUPPORT_UNICODE
         if (utf)
           {
-          register pcre_uint32 d;
+          register uint32_t d;
           for (fi = min;; fi++)
             {
-            RMATCH(eptr, ecode, offset_top, md, eptrb, RM28);
+            RMATCH(eptr, ecode, offset_top, mb, eptrb, RM28);
             if (rrc != MATCH_NOMATCH) RRETURN(rrc);
             if (fi >= max) RRETURN(MATCH_NOMATCH);
-            if (eptr >= md->end_subject)
+            if (eptr >= mb->end_subject)
               {
               SCHECK_PARTIAL();
               RRETURN(MATCH_NOMATCH);
               }
             GETCHARINC(d, eptr);
-            if (fc == d || (unsigned int)foc == d) RRETURN(MATCH_NOMATCH);
+            if (fc == d || (uint32_t)foc == d) RRETURN(MATCH_NOMATCH);
             }
           }
         else
-#endif  /*SUPPORT_UTF */
+#endif  /*SUPPORT_UNICODE */
         /* Not UTF mode */
           {
           for (fi = min;; fi++)
             {
-            RMATCH(eptr, ecode, offset_top, md, eptrb, RM29);
+            RMATCH(eptr, ecode, offset_top, mb, eptrb, RM29);
             if (rrc != MATCH_NOMATCH) RRETURN(rrc);
             if (fi >= max) RRETURN(MATCH_NOMATCH);
-            if (eptr >= md->end_subject)
+            if (eptr >= mb->end_subject)
               {
               SCHECK_PARTIAL();
               RRETURN(MATCH_NOMATCH);
@@ -3885,39 +3967,43 @@
         {
         pp = eptr;
 
-#ifdef SUPPORT_UTF
+#ifdef SUPPORT_UNICODE
         if (utf)
           {
-          register pcre_uint32 d;
+          register uint32_t d;
           for (i = min; i < max; i++)
             {
             int len = 1;
-            if (eptr >= md->end_subject)
+            if (eptr >= mb->end_subject)
               {
               SCHECK_PARTIAL();
               break;
               }
             GETCHARLEN(d, eptr, len);
-            if (fc == d || (unsigned int)foc == d) break;
+            if (fc == d || (uint32_t)foc == d) break;
             eptr += len;
             }
           if (possessive) continue;    /* No backtracking */
+
+          /* After \C in UTF mode, pp might be in the middle of a Unicode
+          character. Use <= pp to ensure backtracking doesn't go too far. */
+
           for(;;)
             {
             if (eptr <= pp) goto TAIL_RECURSE;
-            RMATCH(eptr, ecode, offset_top, md, eptrb, RM30);
+            RMATCH(eptr, ecode, offset_top, mb, eptrb, RM30);
             if (rrc != MATCH_NOMATCH) RRETURN(rrc);
             eptr--;
             BACKCHAR(eptr);
             }
           }
         else
-#endif  /* SUPPORT_UTF */
+#endif  /* SUPPORT_UNICODE */
         /* Not UTF mode */
           {
           for (i = min; i < max; i++)
             {
-            if (eptr >= md->end_subject)
+            if (eptr >= mb->end_subject)
               {
               SCHECK_PARTIAL();
               break;
@@ -3929,7 +4015,7 @@
           for (;;)
             {
             if (eptr == pp) goto TAIL_RECURSE;
-            RMATCH(eptr, ecode, offset_top, md, eptrb, RM31);
+            RMATCH(eptr, ecode, offset_top, mb, eptrb, RM31);
             if (rrc != MATCH_NOMATCH) RRETURN(rrc);
             eptr--;
             }
@@ -3942,13 +4028,13 @@
 
     else
       {
-#ifdef SUPPORT_UTF
+#ifdef SUPPORT_UNICODE
       if (utf)
         {
-        register pcre_uint32 d;
+        register uint32_t d;
         for (i = 1; i <= min; i++)
           {
-          if (eptr >= md->end_subject)
+          if (eptr >= mb->end_subject)
             {
             SCHECK_PARTIAL();
             RRETURN(MATCH_NOMATCH);
@@ -3963,7 +4049,7 @@
         {
         for (i = 1; i <= min; i++)
           {
-          if (eptr >= md->end_subject)
+          if (eptr >= mb->end_subject)
             {
             SCHECK_PARTIAL();
             RRETURN(MATCH_NOMATCH);
@@ -3976,16 +4062,16 @@
 
       if (minimize)
         {
-#ifdef SUPPORT_UTF
+#ifdef SUPPORT_UNICODE
         if (utf)
           {
-          register pcre_uint32 d;
+          register uint32_t d;
           for (fi = min;; fi++)
             {
-            RMATCH(eptr, ecode, offset_top, md, eptrb, RM32);
+            RMATCH(eptr, ecode, offset_top, mb, eptrb, RM32);
             if (rrc != MATCH_NOMATCH) RRETURN(rrc);
             if (fi >= max) RRETURN(MATCH_NOMATCH);
-            if (eptr >= md->end_subject)
+            if (eptr >= mb->end_subject)
               {
               SCHECK_PARTIAL();
               RRETURN(MATCH_NOMATCH);
@@ -4000,10 +4086,10 @@
           {
           for (fi = min;; fi++)
             {
-            RMATCH(eptr, ecode, offset_top, md, eptrb, RM33);
+            RMATCH(eptr, ecode, offset_top, mb, eptrb, RM33);
             if (rrc != MATCH_NOMATCH) RRETURN(rrc);
             if (fi >= max) RRETURN(MATCH_NOMATCH);
-            if (eptr >= md->end_subject)
+            if (eptr >= mb->end_subject)
               {
               SCHECK_PARTIAL();
               RRETURN(MATCH_NOMATCH);
@@ -4020,14 +4106,14 @@
         {
         pp = eptr;
 
-#ifdef SUPPORT_UTF
+#ifdef SUPPORT_UNICODE
         if (utf)
           {
-          register pcre_uint32 d;
+          register uint32_t d;
           for (i = min; i < max; i++)
             {
             int len = 1;
-            if (eptr >= md->end_subject)
+            if (eptr >= mb->end_subject)
               {
               SCHECK_PARTIAL();
               break;
@@ -4037,10 +4123,14 @@
             eptr += len;
             }
           if (possessive) continue;    /* No backtracking */
+
+          /* After \C in UTF mode, pp might be in the middle of a Unicode
+          character. Use <= pp to ensure backtracking doesn't go too far. */
+
           for(;;)
             {
             if (eptr <= pp) goto TAIL_RECURSE;
-            RMATCH(eptr, ecode, offset_top, md, eptrb, RM34);
+            RMATCH(eptr, ecode, offset_top, mb, eptrb, RM34);
             if (rrc != MATCH_NOMATCH) RRETURN(rrc);
             eptr--;
             BACKCHAR(eptr);
@@ -4052,7 +4142,7 @@
           {
           for (i = min; i < max; i++)
             {
-            if (eptr >= md->end_subject)
+            if (eptr >= mb->end_subject)
               {
               SCHECK_PARTIAL();
               break;
@@ -4064,7 +4154,7 @@
           for (;;)
             {
             if (eptr == pp) goto TAIL_RECURSE;
-            RMATCH(eptr, ecode, offset_top, md, eptrb, RM35);
+            RMATCH(eptr, ecode, offset_top, mb, eptrb, RM35);
             if (rrc != MATCH_NOMATCH) RRETURN(rrc);
             eptr--;
             }
@@ -4139,7 +4229,7 @@
     REPEATTYPE:
     ctype = *ecode++;      /* Code for the character type */
 
-#ifdef SUPPORT_UCP
+#ifdef SUPPORT_UNICODE
     if (ctype == OP_PROP || ctype == OP_NOTPROP)
       {
       prop_fail_result = ctype == OP_NOTPROP;
@@ -4157,7 +4247,7 @@
 
     if (min > 0)
       {
-#ifdef SUPPORT_UCP
+#ifdef SUPPORT_UNICODE
       if (prop_type >= 0)
         {
         switch(prop_type)
@@ -4166,7 +4256,7 @@
           if (prop_fail_result) RRETURN(MATCH_NOMATCH);
           for (i = 1; i <= min; i++)
             {
-            if (eptr >= md->end_subject)
+            if (eptr >= mb->end_subject)
               {
               SCHECK_PARTIAL();
               RRETURN(MATCH_NOMATCH);
@@ -4179,7 +4269,7 @@
           for (i = 1; i <= min; i++)
             {
             int chartype;
-            if (eptr >= md->end_subject)
+            if (eptr >= mb->end_subject)
               {
               SCHECK_PARTIAL();
               RRETURN(MATCH_NOMATCH);
@@ -4196,7 +4286,7 @@
           case PT_GC:
           for (i = 1; i <= min; i++)
             {
-            if (eptr >= md->end_subject)
+            if (eptr >= mb->end_subject)
               {
               SCHECK_PARTIAL();
               RRETURN(MATCH_NOMATCH);
@@ -4210,7 +4300,7 @@
           case PT_PC:
           for (i = 1; i <= min; i++)
             {
-            if (eptr >= md->end_subject)
+            if (eptr >= mb->end_subject)
               {
               SCHECK_PARTIAL();
               RRETURN(MATCH_NOMATCH);
@@ -4224,7 +4314,7 @@
           case PT_SC:
           for (i = 1; i <= min; i++)
             {
-            if (eptr >= md->end_subject)
+            if (eptr >= mb->end_subject)
               {
               SCHECK_PARTIAL();
               RRETURN(MATCH_NOMATCH);
@@ -4239,7 +4329,7 @@
           for (i = 1; i <= min; i++)
             {
             int category;
-            if (eptr >= md->end_subject)
+            if (eptr >= mb->end_subject)
               {
               SCHECK_PARTIAL();
               RRETURN(MATCH_NOMATCH);
@@ -4259,7 +4349,7 @@
           case PT_PXSPACE:  /* POSIX space */
           for (i = 1; i <= min; i++)
             {
-            if (eptr >= md->end_subject)
+            if (eptr >= mb->end_subject)
               {
               SCHECK_PARTIAL();
               RRETURN(MATCH_NOMATCH);
@@ -4284,7 +4374,7 @@
           for (i = 1; i <= min; i++)
             {
             int category;
-            if (eptr >= md->end_subject)
+            if (eptr >= mb->end_subject)
               {
               SCHECK_PARTIAL();
               RRETURN(MATCH_NOMATCH);
@@ -4300,8 +4390,8 @@
           case PT_CLIST:
           for (i = 1; i <= min; i++)
             {
-            const pcre_uint32 *cp;
-            if (eptr >= md->end_subject)
+            const uint32_t *cp;
+            if (eptr >= mb->end_subject)
               {
               SCHECK_PARTIAL();
               RRETURN(MATCH_NOMATCH);
@@ -4321,7 +4411,7 @@
           case PT_UCNC:
           for (i = 1; i <= min; i++)
             {
-            if (eptr >= md->end_subject)
+            if (eptr >= mb->end_subject)
               {
               SCHECK_PARTIAL();
               RRETURN(MATCH_NOMATCH);
@@ -4337,7 +4427,7 @@
           /* This should not occur */
 
           default:
-          RRETURN(PCRE_ERROR_INTERNAL);
+          RRETURN(PCRE2_ERROR_INTERNAL);
           }
         }
 
@@ -4348,7 +4438,7 @@
         {
         for (i = 1; i <= min; i++)
           {
-          if (eptr >= md->end_subject)
+          if (eptr >= mb->end_subject)
             {
             SCHECK_PARTIAL();
             RRETURN(MATCH_NOMATCH);
@@ -4358,7 +4448,7 @@
             int lgb, rgb;
             GETCHARINCTEST(c, eptr);
             lgb = UCD_GRAPHBREAK(c);
-           while (eptr < md->end_subject)
+           while (eptr < mb->end_subject)
               {
               int len = 1;
               if (!utf) c = *eptr; else { GETCHARLEN(c, eptr, len); }
@@ -4373,58 +4463,58 @@
         }
 
       else
-#endif     /* SUPPORT_UCP */
+#endif     /* SUPPORT_UNICODE */
 
 /* Handle all other cases when the coding is UTF-8 */
 
-#ifdef SUPPORT_UTF
+#ifdef SUPPORT_UNICODE
       if (utf) switch(ctype)
         {
         case OP_ANY:
         for (i = 1; i <= min; i++)
           {
-          if (eptr >= md->end_subject)
+          if (eptr >= mb->end_subject)
             {
             SCHECK_PARTIAL();
             RRETURN(MATCH_NOMATCH);
             }
           if (IS_NEWLINE(eptr)) RRETURN(MATCH_NOMATCH);
-          if (md->partial != 0 &&
-              eptr + 1 >= md->end_subject &&
+          if (mb->partial != 0 &&
+              eptr + 1 >= mb->end_subject &&
               NLBLOCK->nltype == NLTYPE_FIXED &&
               NLBLOCK->nllen == 2 &&
               UCHAR21(eptr) == NLBLOCK->nl[0])
             {
-            md->hitend = TRUE;
-            if (md->partial > 1) RRETURN(PCRE_ERROR_PARTIAL);
+            mb->hitend = TRUE;
+            if (mb->partial > 1) RRETURN(PCRE2_ERROR_PARTIAL);
             }
           eptr++;
-          ACROSSCHAR(eptr < md->end_subject, *eptr, eptr++);
+          ACROSSCHAR(eptr < mb->end_subject, *eptr, eptr++);
           }
         break;
 
         case OP_ALLANY:
         for (i = 1; i <= min; i++)
           {
-          if (eptr >= md->end_subject)
+          if (eptr >= mb->end_subject)
             {
             SCHECK_PARTIAL();
             RRETURN(MATCH_NOMATCH);
             }
           eptr++;
-          ACROSSCHAR(eptr < md->end_subject, *eptr, eptr++);
+          ACROSSCHAR(eptr < mb->end_subject, *eptr, eptr++);
           }
         break;
 
         case OP_ANYBYTE:
-        if (eptr > md->end_subject - min) RRETURN(MATCH_NOMATCH);
+        if (eptr > mb->end_subject - min) RRETURN(MATCH_NOMATCH);
         eptr += min;
         break;
 
         case OP_ANYNL:
         for (i = 1; i <= min; i++)
           {
-          if (eptr >= md->end_subject)
+          if (eptr >= mb->end_subject)
             {
             SCHECK_PARTIAL();
             RRETURN(MATCH_NOMATCH);
@@ -4435,7 +4525,7 @@
             default: RRETURN(MATCH_NOMATCH);
 
             case CHAR_CR:
-            if (eptr < md->end_subject && UCHAR21(eptr) == CHAR_LF) eptr++;
+            if (eptr < mb->end_subject && UCHAR21(eptr) == CHAR_LF) eptr++;
             break;
 
             case CHAR_LF:
@@ -4448,7 +4538,7 @@
             case 0x2028:
             case 0x2029:
 #endif  /* Not EBCDIC */
-            if (md->bsr_anycrlf) RRETURN(MATCH_NOMATCH);
+            if (mb->bsr_convention == PCRE2_BSR_ANYCRLF) RRETURN(MATCH_NOMATCH);
             break;
             }
           }
@@ -4457,7 +4547,7 @@
         case OP_NOT_HSPACE:
         for (i = 1; i <= min; i++)
           {
-          if (eptr >= md->end_subject)
+          if (eptr >= mb->end_subject)
             {
             SCHECK_PARTIAL();
             RRETURN(MATCH_NOMATCH);
@@ -4474,7 +4564,7 @@
         case OP_HSPACE:
         for (i = 1; i <= min; i++)
           {
-          if (eptr >= md->end_subject)
+          if (eptr >= mb->end_subject)
             {
             SCHECK_PARTIAL();
             RRETURN(MATCH_NOMATCH);
@@ -4491,7 +4581,7 @@
         case OP_NOT_VSPACE:
         for (i = 1; i <= min; i++)
           {
-          if (eptr >= md->end_subject)
+          if (eptr >= mb->end_subject)
             {
             SCHECK_PARTIAL();
             RRETURN(MATCH_NOMATCH);
@@ -4508,7 +4598,7 @@
         case OP_VSPACE:
         for (i = 1; i <= min; i++)
           {
-          if (eptr >= md->end_subject)
+          if (eptr >= mb->end_subject)
             {
             SCHECK_PARTIAL();
             RRETURN(MATCH_NOMATCH);
@@ -4525,13 +4615,13 @@
         case OP_NOT_DIGIT:
         for (i = 1; i <= min; i++)
           {
-          if (eptr >= md->end_subject)
+          if (eptr >= mb->end_subject)
             {
             SCHECK_PARTIAL();
             RRETURN(MATCH_NOMATCH);
             }
           GETCHARINC(c, eptr);
-          if (c < 128 && (md->ctypes[c] & ctype_digit) != 0)
+          if (c < 128 && (mb->ctypes[c] & ctype_digit) != 0)
             RRETURN(MATCH_NOMATCH);
           }
         break;
@@ -4539,14 +4629,14 @@
         case OP_DIGIT:
         for (i = 1; i <= min; i++)
           {
-          pcre_uint32 cc;
-          if (eptr >= md->end_subject)
+          uint32_t cc;
+          if (eptr >= mb->end_subject)
             {
             SCHECK_PARTIAL();
             RRETURN(MATCH_NOMATCH);
             }
           cc = UCHAR21(eptr);
-          if (cc >= 128 || (md->ctypes[cc] & ctype_digit) == 0)
+          if (cc >= 128 || (mb->ctypes[cc] & ctype_digit) == 0)
             RRETURN(MATCH_NOMATCH);
           eptr++;
           /* No need to skip more bytes - we know it's a 1-byte character */
@@ -4556,31 +4646,31 @@
         case OP_NOT_WHITESPACE:
         for (i = 1; i <= min; i++)
           {
-          pcre_uint32 cc;
-          if (eptr >= md->end_subject)
+          uint32_t cc;
+          if (eptr >= mb->end_subject)
             {
             SCHECK_PARTIAL();
             RRETURN(MATCH_NOMATCH);
             }
           cc = UCHAR21(eptr);
-          if (cc < 128 && (md->ctypes[cc] & ctype_space) != 0)
+          if (cc < 128 && (mb->ctypes[cc] & ctype_space) != 0)
             RRETURN(MATCH_NOMATCH);
           eptr++;
-          ACROSSCHAR(eptr < md->end_subject, *eptr, eptr++);
+          ACROSSCHAR(eptr < mb->end_subject, *eptr, eptr++);
           }
         break;
 
         case OP_WHITESPACE:
         for (i = 1; i <= min; i++)
           {
-          pcre_uint32 cc;
-          if (eptr >= md->end_subject)
+          uint32_t cc;
+          if (eptr >= mb->end_subject)
             {
             SCHECK_PARTIAL();
             RRETURN(MATCH_NOMATCH);
             }
           cc = UCHAR21(eptr);
-          if (cc >= 128 || (md->ctypes[cc] & ctype_space) == 0)
+          if (cc >= 128 || (mb->ctypes[cc] & ctype_space) == 0)
             RRETURN(MATCH_NOMATCH);
           eptr++;
           /* No need to skip more bytes - we know it's a 1-byte character */
@@ -4590,31 +4680,31 @@
         case OP_NOT_WORDCHAR:
         for (i = 1; i <= min; i++)
           {
-          pcre_uint32 cc;
-          if (eptr >= md->end_subject)
+          uint32_t cc;
+          if (eptr >= mb->end_subject)
             {
             SCHECK_PARTIAL();
             RRETURN(MATCH_NOMATCH);
             }
           cc = UCHAR21(eptr);
-          if (cc < 128 && (md->ctypes[cc] & ctype_word) != 0)
+          if (cc < 128 && (mb->ctypes[cc] & ctype_word) != 0)
             RRETURN(MATCH_NOMATCH);
           eptr++;
-          ACROSSCHAR(eptr < md->end_subject, *eptr, eptr++);
+          ACROSSCHAR(eptr < mb->end_subject, *eptr, eptr++);
           }
         break;
 
         case OP_WORDCHAR:
         for (i = 1; i <= min; i++)
           {
-          pcre_uint32 cc;
-          if (eptr >= md->end_subject)
+          uint32_t cc;
+          if (eptr >= mb->end_subject)
             {
             SCHECK_PARTIAL();
             RRETURN(MATCH_NOMATCH);
             }
           cc = UCHAR21(eptr);
-          if (cc >= 128 || (md->ctypes[cc] & ctype_word) == 0)
+          if (cc >= 128 || (mb->ctypes[cc] & ctype_word) == 0)
             RRETURN(MATCH_NOMATCH);
           eptr++;
           /* No need to skip more bytes - we know it's a 1-byte character */
@@ -4622,11 +4712,11 @@
         break;
 
         default:
-        RRETURN(PCRE_ERROR_INTERNAL);
+        RRETURN(PCRE2_ERROR_INTERNAL);
         }  /* End switch(ctype) */
 
       else
-#endif     /* SUPPORT_UTF */
+#endif     /* SUPPORT_UNICODE */
 
       /* Code for the non-UTF-8 case for minimum matching of operators other
       than OP_PROP and OP_NOTPROP. */
@@ -4636,27 +4726,27 @@
         case OP_ANY:
         for (i = 1; i <= min; i++)
           {
-          if (eptr >= md->end_subject)
+          if (eptr >= mb->end_subject)
             {
             SCHECK_PARTIAL();
             RRETURN(MATCH_NOMATCH);
             }
           if (IS_NEWLINE(eptr)) RRETURN(MATCH_NOMATCH);
-          if (md->partial != 0 &&
-              eptr + 1 >= md->end_subject &&
+          if (mb->partial != 0 &&
+              eptr + 1 >= mb->end_subject &&
               NLBLOCK->nltype == NLTYPE_FIXED &&
               NLBLOCK->nllen == 2 &&
               *eptr == NLBLOCK->nl[0])
             {
-            md->hitend = TRUE;
-            if (md->partial > 1) RRETURN(PCRE_ERROR_PARTIAL);
+            mb->hitend = TRUE;
+            if (mb->partial > 1) RRETURN(PCRE2_ERROR_PARTIAL);
             }
           eptr++;
           }
         break;
 
         case OP_ALLANY:
-        if (eptr > md->end_subject - min)
+        if (eptr > mb->end_subject - min)
           {
           SCHECK_PARTIAL();
           RRETURN(MATCH_NOMATCH);
@@ -4665,7 +4755,7 @@
         break;
 
         case OP_ANYBYTE:
-        if (eptr > md->end_subject - min)
+        if (eptr > mb->end_subject - min)
           {
           SCHECK_PARTIAL();
           RRETURN(MATCH_NOMATCH);
@@ -4676,7 +4766,7 @@
         case OP_ANYNL:
         for (i = 1; i <= min; i++)
           {
-          if (eptr >= md->end_subject)
+          if (eptr >= mb->end_subject)
             {
             SCHECK_PARTIAL();
             RRETURN(MATCH_NOMATCH);
@@ -4686,7 +4776,7 @@
             default: RRETURN(MATCH_NOMATCH);
 
             case CHAR_CR:
-            if (eptr < md->end_subject && *eptr == CHAR_LF) eptr++;
+            if (eptr < mb->end_subject && *eptr == CHAR_LF) eptr++;
             break;
 
             case CHAR_LF:
@@ -4695,11 +4785,11 @@
             case CHAR_VT:
             case CHAR_FF:
             case CHAR_NEL:
-#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32
+#if PCRE2_CODE_UNIT_WIDTH != 8
             case 0x2028:
             case 0x2029:
 #endif
-            if (md->bsr_anycrlf) RRETURN(MATCH_NOMATCH);
+            if (mb->bsr_convention == PCRE2_BSR_ANYCRLF) RRETURN(MATCH_NOMATCH);
             break;
             }
           }
@@ -4708,7 +4798,7 @@
         case OP_NOT_HSPACE:
         for (i = 1; i <= min; i++)
           {
-          if (eptr >= md->end_subject)
+          if (eptr >= mb->end_subject)
             {
             SCHECK_PARTIAL();
             RRETURN(MATCH_NOMATCH);
@@ -4717,7 +4807,7 @@
             {
             default: break;
             HSPACE_BYTE_CASES:
-#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32
+#if PCRE2_CODE_UNIT_WIDTH != 8
             HSPACE_MULTIBYTE_CASES:
 #endif
             RRETURN(MATCH_NOMATCH);
@@ -4728,7 +4818,7 @@
         case OP_HSPACE:
         for (i = 1; i <= min; i++)
           {
-          if (eptr >= md->end_subject)
+          if (eptr >= mb->end_subject)
             {
             SCHECK_PARTIAL();
             RRETURN(MATCH_NOMATCH);
@@ -4737,7 +4827,7 @@
             {
             default: RRETURN(MATCH_NOMATCH);
             HSPACE_BYTE_CASES:
-#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32
+#if PCRE2_CODE_UNIT_WIDTH != 8
             HSPACE_MULTIBYTE_CASES:
 #endif
             break;
@@ -4748,7 +4838,7 @@
         case OP_NOT_VSPACE:
         for (i = 1; i <= min; i++)
           {
-          if (eptr >= md->end_subject)
+          if (eptr >= mb->end_subject)
             {
             SCHECK_PARTIAL();
             RRETURN(MATCH_NOMATCH);
@@ -4756,7 +4846,7 @@
           switch(*eptr++)
             {
             VSPACE_BYTE_CASES:
-#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32
+#if PCRE2_CODE_UNIT_WIDTH != 8
             VSPACE_MULTIBYTE_CASES:
 #endif
             RRETURN(MATCH_NOMATCH);
@@ -4768,7 +4858,7 @@
         case OP_VSPACE:
         for (i = 1; i <= min; i++)
           {
-          if (eptr >= md->end_subject)
+          if (eptr >= mb->end_subject)
             {
             SCHECK_PARTIAL();
             RRETURN(MATCH_NOMATCH);
@@ -4777,7 +4867,7 @@
             {
             default: RRETURN(MATCH_NOMATCH);
             VSPACE_BYTE_CASES:
-#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32
+#if PCRE2_CODE_UNIT_WIDTH != 8
             VSPACE_MULTIBYTE_CASES:
 #endif
             break;
@@ -4788,12 +4878,12 @@
         case OP_NOT_DIGIT:
         for (i = 1; i <= min; i++)
           {
-          if (eptr >= md->end_subject)
+          if (eptr >= mb->end_subject)
             {
             SCHECK_PARTIAL();
             RRETURN(MATCH_NOMATCH);
             }
-          if (MAX_255(*eptr) && (md->ctypes[*eptr] & ctype_digit) != 0)
+          if (MAX_255(*eptr) && (mb->ctypes[*eptr] & ctype_digit) != 0)
             RRETURN(MATCH_NOMATCH);
           eptr++;
           }
@@ -4802,12 +4892,12 @@
         case OP_DIGIT:
         for (i = 1; i <= min; i++)
           {
-          if (eptr >= md->end_subject)
+          if (eptr >= mb->end_subject)
             {
             SCHECK_PARTIAL();
             RRETURN(MATCH_NOMATCH);
             }
-          if (!MAX_255(*eptr) || (md->ctypes[*eptr] & ctype_digit) == 0)
+          if (!MAX_255(*eptr) || (mb->ctypes[*eptr] & ctype_digit) == 0)
             RRETURN(MATCH_NOMATCH);
           eptr++;
           }
@@ -4816,12 +4906,12 @@
         case OP_NOT_WHITESPACE:
         for (i = 1; i <= min; i++)
           {
-          if (eptr >= md->end_subject)
+          if (eptr >= mb->end_subject)
             {
             SCHECK_PARTIAL();
             RRETURN(MATCH_NOMATCH);
             }
-          if (MAX_255(*eptr) && (md->ctypes[*eptr] & ctype_space) != 0)
+          if (MAX_255(*eptr) && (mb->ctypes[*eptr] & ctype_space) != 0)
             RRETURN(MATCH_NOMATCH);
           eptr++;
           }
@@ -4830,12 +4920,12 @@
         case OP_WHITESPACE:
         for (i = 1; i <= min; i++)
           {
-          if (eptr >= md->end_subject)
+          if (eptr >= mb->end_subject)
             {
             SCHECK_PARTIAL();
             RRETURN(MATCH_NOMATCH);
             }
-          if (!MAX_255(*eptr) || (md->ctypes[*eptr] & ctype_space) == 0)
+          if (!MAX_255(*eptr) || (mb->ctypes[*eptr] & ctype_space) == 0)
             RRETURN(MATCH_NOMATCH);
           eptr++;
           }
@@ -4844,12 +4934,12 @@
         case OP_NOT_WORDCHAR:
         for (i = 1; i <= min; i++)
           {
-          if (eptr >= md->end_subject)
+          if (eptr >= mb->end_subject)
             {
             SCHECK_PARTIAL();
             RRETURN(MATCH_NOMATCH);
             }
-          if (MAX_255(*eptr) && (md->ctypes[*eptr] & ctype_word) != 0)
+          if (MAX_255(*eptr) && (mb->ctypes[*eptr] & ctype_word) != 0)
             RRETURN(MATCH_NOMATCH);
           eptr++;
           }
@@ -4858,19 +4948,19 @@
         case OP_WORDCHAR:
         for (i = 1; i <= min; i++)
           {
-          if (eptr >= md->end_subject)
+          if (eptr >= mb->end_subject)
             {
             SCHECK_PARTIAL();
             RRETURN(MATCH_NOMATCH);
             }
-          if (!MAX_255(*eptr) || (md->ctypes[*eptr] & ctype_word) == 0)
+          if (!MAX_255(*eptr) || (mb->ctypes[*eptr] & ctype_word) == 0)
             RRETURN(MATCH_NOMATCH);
           eptr++;
           }
         break;
 
         default:
-        RRETURN(PCRE_ERROR_INTERNAL);
+        RRETURN(PCRE2_ERROR_INTERNAL);
         }
       }
 
@@ -4884,7 +4974,7 @@
 
     if (minimize)
       {
-#ifdef SUPPORT_UCP
+#ifdef SUPPORT_UNICODE
       if (prop_type >= 0)
         {
         switch(prop_type)
@@ -4892,10 +4982,10 @@
           case PT_ANY:
           for (fi = min;; fi++)
             {
-            RMATCH(eptr, ecode, offset_top, md, eptrb, RM36);
+            RMATCH(eptr, ecode, offset_top, mb, eptrb, RM36);
             if (rrc != MATCH_NOMATCH) RRETURN(rrc);
             if (fi >= max) RRETURN(MATCH_NOMATCH);
-            if (eptr >= md->end_subject)
+            if (eptr >= mb->end_subject)
               {
               SCHECK_PARTIAL();
               RRETURN(MATCH_NOMATCH);
@@ -4909,10 +4999,10 @@
           for (fi = min;; fi++)
             {
             int chartype;
-            RMATCH(eptr, ecode, offset_top, md, eptrb, RM37);
+            RMATCH(eptr, ecode, offset_top, mb, eptrb, RM37);
             if (rrc != MATCH_NOMATCH) RRETURN(rrc);
             if (fi >= max) RRETURN(MATCH_NOMATCH);
-            if (eptr >= md->end_subject)
+            if (eptr >= mb->end_subject)
               {
               SCHECK_PARTIAL();
               RRETURN(MATCH_NOMATCH);
@@ -4929,10 +5019,10 @@
           case PT_GC:
           for (fi = min;; fi++)
             {
-            RMATCH(eptr, ecode, offset_top, md, eptrb, RM38);
+            RMATCH(eptr, ecode, offset_top, mb, eptrb, RM38);
             if (rrc != MATCH_NOMATCH) RRETURN(rrc);
             if (fi >= max) RRETURN(MATCH_NOMATCH);
-            if (eptr >= md->end_subject)
+            if (eptr >= mb->end_subject)
               {
               SCHECK_PARTIAL();
               RRETURN(MATCH_NOMATCH);
@@ -4946,10 +5036,10 @@
           case PT_PC:
           for (fi = min;; fi++)
             {
-            RMATCH(eptr, ecode, offset_top, md, eptrb, RM39);
+            RMATCH(eptr, ecode, offset_top, mb, eptrb, RM39);
             if (rrc != MATCH_NOMATCH) RRETURN(rrc);
             if (fi >= max) RRETURN(MATCH_NOMATCH);
-            if (eptr >= md->end_subject)
+            if (eptr >= mb->end_subject)
               {
               SCHECK_PARTIAL();
               RRETURN(MATCH_NOMATCH);
@@ -4963,10 +5053,10 @@
           case PT_SC:
           for (fi = min;; fi++)
             {
-            RMATCH(eptr, ecode, offset_top, md, eptrb, RM40);
+            RMATCH(eptr, ecode, offset_top, mb, eptrb, RM40);
             if (rrc != MATCH_NOMATCH) RRETURN(rrc);
             if (fi >= max) RRETURN(MATCH_NOMATCH);
-            if (eptr >= md->end_subject)
+            if (eptr >= mb->end_subject)
               {
               SCHECK_PARTIAL();
               RRETURN(MATCH_NOMATCH);
@@ -4981,10 +5071,10 @@
           for (fi = min;; fi++)
             {
             int category;
-            RMATCH(eptr, ecode, offset_top, md, eptrb, RM59);
+            RMATCH(eptr, ecode, offset_top, mb, eptrb, RM59);
             if (rrc != MATCH_NOMATCH) RRETURN(rrc);
             if (fi >= max) RRETURN(MATCH_NOMATCH);
-            if (eptr >= md->end_subject)
+            if (eptr >= mb->end_subject)
               {
               SCHECK_PARTIAL();
               RRETURN(MATCH_NOMATCH);
@@ -5004,10 +5094,10 @@
           case PT_PXSPACE:  /* POSIX space */
           for (fi = min;; fi++)
             {
-            RMATCH(eptr, ecode, offset_top, md, eptrb, RM61);
+            RMATCH(eptr, ecode, offset_top, mb, eptrb, RM61);
             if (rrc != MATCH_NOMATCH) RRETURN(rrc);
             if (fi >= max) RRETURN(MATCH_NOMATCH);
-            if (eptr >= md->end_subject)
+            if (eptr >= mb->end_subject)
               {
               SCHECK_PARTIAL();
               RRETURN(MATCH_NOMATCH);
@@ -5032,10 +5122,10 @@
           for (fi = min;; fi++)
             {
             int category;
-            RMATCH(eptr, ecode, offset_top, md, eptrb, RM62);
+            RMATCH(eptr, ecode, offset_top, mb, eptrb, RM62);
             if (rrc != MATCH_NOMATCH) RRETURN(rrc);
             if (fi >= max) RRETURN(MATCH_NOMATCH);
-            if (eptr >= md->end_subject)
+            if (eptr >= mb->end_subject)
               {
               SCHECK_PARTIAL();
               RRETURN(MATCH_NOMATCH);
@@ -5053,11 +5143,11 @@
           case PT_CLIST:
           for (fi = min;; fi++)
             {
-            const pcre_uint32 *cp;
-            RMATCH(eptr, ecode, offset_top, md, eptrb, RM67);
+            const uint32_t *cp;
+            RMATCH(eptr, ecode, offset_top, mb, eptrb, RM67);
             if (rrc != MATCH_NOMATCH) RRETURN(rrc);
             if (fi >= max) RRETURN(MATCH_NOMATCH);
-            if (eptr >= md->end_subject)
+            if (eptr >= mb->end_subject)
               {
               SCHECK_PARTIAL();
               RRETURN(MATCH_NOMATCH);
@@ -5077,10 +5167,10 @@
           case PT_UCNC:
           for (fi = min;; fi++)
             {
-            RMATCH(eptr, ecode, offset_top, md, eptrb, RM60);
+            RMATCH(eptr, ecode, offset_top, mb, eptrb, RM60);
             if (rrc != MATCH_NOMATCH) RRETURN(rrc);
             if (fi >= max) RRETURN(MATCH_NOMATCH);
-            if (eptr >= md->end_subject)
+            if (eptr >= mb->end_subject)
               {
               SCHECK_PARTIAL();
               RRETURN(MATCH_NOMATCH);
@@ -5095,7 +5185,7 @@
 
           /* This should never occur */
           default:
-          RRETURN(PCRE_ERROR_INTERNAL);
+          RRETURN(PCRE2_ERROR_INTERNAL);
           }
         }
 
@@ -5106,10 +5196,10 @@
         {
         for (fi = min;; fi++)
           {
-          RMATCH(eptr, ecode, offset_top, md, eptrb, RM41);
+          RMATCH(eptr, ecode, offset_top, mb, eptrb, RM41);
           if (rrc != MATCH_NOMATCH) RRETURN(rrc);
           if (fi >= max) RRETURN(MATCH_NOMATCH);
-          if (eptr >= md->end_subject)
+          if (eptr >= mb->end_subject)
             {
             SCHECK_PARTIAL();
             RRETURN(MATCH_NOMATCH);
@@ -5119,7 +5209,7 @@
             int lgb, rgb;
             GETCHARINCTEST(c, eptr);
             lgb = UCD_GRAPHBREAK(c);
-            while (eptr < md->end_subject)
+            while (eptr < mb->end_subject)
               {
               int len = 1;
               if (!utf) c = *eptr; else { GETCHARLEN(c, eptr, len); }
@@ -5133,17 +5223,17 @@
           }
         }
       else
-#endif     /* SUPPORT_UCP */
+#endif     /* SUPPORT_UNICODE */
 
-#ifdef SUPPORT_UTF
+#ifdef SUPPORT_UNICODE
       if (utf)
         {
         for (fi = min;; fi++)
           {
-          RMATCH(eptr, ecode, offset_top, md, eptrb, RM42);
+          RMATCH(eptr, ecode, offset_top, mb, eptrb, RM42);
           if (rrc != MATCH_NOMATCH) RRETURN(rrc);
           if (fi >= max) RRETURN(MATCH_NOMATCH);
-          if (eptr >= md->end_subject)
+          if (eptr >= mb->end_subject)
             {
             SCHECK_PARTIAL();
             RRETURN(MATCH_NOMATCH);
@@ -5154,14 +5244,14 @@
           switch(ctype)
             {
             case OP_ANY:               /* This is the non-NL case */
-            if (md->partial != 0 &&    /* Take care with CRLF partial */
-                eptr >= md->end_subject &&
+            if (mb->partial != 0 &&    /* Take care with CRLF partial */
+                eptr >= mb->end_subject &&
                 NLBLOCK->nltype == NLTYPE_FIXED &&
                 NLBLOCK->nllen == 2 &&
                 c == NLBLOCK->nl[0])
               {
-              md->hitend = TRUE;
-              if (md->partial > 1) RRETURN(PCRE_ERROR_PARTIAL);
+              mb->hitend = TRUE;
+              if (mb->partial > 1) RRETURN(PCRE2_ERROR_PARTIAL);
               }
             break;
 
@@ -5174,7 +5264,7 @@
               {
               default: RRETURN(MATCH_NOMATCH);
               case CHAR_CR:
-              if (eptr < md->end_subject && UCHAR21(eptr) == CHAR_LF) eptr++;
+              if (eptr < mb->end_subject && UCHAR21(eptr) == CHAR_LF) eptr++;
               break;
 
               case CHAR_LF:
@@ -5187,7 +5277,7 @@
               case 0x2028:
               case 0x2029:
 #endif  /* Not EBCDIC */
-              if (md->bsr_anycrlf) RRETURN(MATCH_NOMATCH);
+              if (mb->bsr_convention == PCRE2_BSR_ANYCRLF) RRETURN(MATCH_NOMATCH);
               break;
               }
             break;
@@ -5225,37 +5315,37 @@
             break;
 
             case OP_NOT_DIGIT:
-            if (c < 256 && (md->ctypes[c] & ctype_digit) != 0)
+            if (c < 256 && (mb->ctypes[c] & ctype_digit) != 0)
               RRETURN(MATCH_NOMATCH);
             break;
 
             case OP_DIGIT:
-            if (c >= 256 || (md->ctypes[c] & ctype_digit) == 0)
+            if (c >= 256 || (mb->ctypes[c] & ctype_digit) == 0)
               RRETURN(MATCH_NOMATCH);
             break;
 
             case OP_NOT_WHITESPACE:
-            if (c < 256 && (md->ctypes[c] & ctype_space) != 0)
+            if (c < 256 && (mb->ctypes[c] & ctype_space) != 0)
               RRETURN(MATCH_NOMATCH);
             break;
 
             case OP_WHITESPACE:
-            if (c >= 256 || (md->ctypes[c] & ctype_space) == 0)
+            if (c >= 256 || (mb->ctypes[c] & ctype_space) == 0)
               RRETURN(MATCH_NOMATCH);
             break;
 
             case OP_NOT_WORDCHAR:
-            if (c < 256 && (md->ctypes[c] & ctype_word) != 0)
+            if (c < 256 && (mb->ctypes[c] & ctype_word) != 0)
               RRETURN(MATCH_NOMATCH);
             break;
 
             case OP_WORDCHAR:
-            if (c >= 256 || (md->ctypes[c] & ctype_word) == 0)
+            if (c >= 256 || (mb->ctypes[c] & ctype_word) == 0)
               RRETURN(MATCH_NOMATCH);
             break;
 
             default:
-            RRETURN(PCRE_ERROR_INTERNAL);
+            RRETURN(PCRE2_ERROR_INTERNAL);
             }
           }
         }
@@ -5265,10 +5355,10 @@
         {
         for (fi = min;; fi++)
           {
-          RMATCH(eptr, ecode, offset_top, md, eptrb, RM43);
+          RMATCH(eptr, ecode, offset_top, mb, eptrb, RM43);
           if (rrc != MATCH_NOMATCH) RRETURN(rrc);
           if (fi >= max) RRETURN(MATCH_NOMATCH);
-          if (eptr >= md->end_subject)
+          if (eptr >= mb->end_subject)
             {
             SCHECK_PARTIAL();
             RRETURN(MATCH_NOMATCH);
@@ -5279,14 +5369,14 @@
           switch(ctype)
             {
             case OP_ANY:               /* This is the non-NL case */
-            if (md->partial != 0 &&    /* Take care with CRLF partial */
-                eptr >= md->end_subject &&
+            if (mb->partial != 0 &&    /* Take care with CRLF partial */
+                eptr >= mb->end_subject &&
                 NLBLOCK->nltype == NLTYPE_FIXED &&
                 NLBLOCK->nllen == 2 &&
                 c == NLBLOCK->nl[0])
               {
-              md->hitend = TRUE;
-              if (md->partial > 1) RRETURN(PCRE_ERROR_PARTIAL);
+              mb->hitend = TRUE;
+              if (mb->partial > 1) RRETURN(PCRE2_ERROR_PARTIAL);
               }
             break;
 
@@ -5299,7 +5389,7 @@
               {
               default: RRETURN(MATCH_NOMATCH);
               case CHAR_CR:
-              if (eptr < md->end_subject && *eptr == CHAR_LF) eptr++;
+              if (eptr < mb->end_subject && *eptr == CHAR_LF) eptr++;
               break;
 
               case CHAR_LF:
@@ -5308,11 +5398,11 @@
               case CHAR_VT:
               case CHAR_FF:
               case CHAR_NEL:
-#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32
+#if PCRE2_CODE_UNIT_WIDTH != 8
               case 0x2028:
               case 0x2029:
 #endif
-              if (md->bsr_anycrlf) RRETURN(MATCH_NOMATCH);
+              if (mb->bsr_convention == PCRE2_BSR_ANYCRLF) RRETURN(MATCH_NOMATCH);
               break;
               }
             break;
@@ -5322,7 +5412,7 @@
               {
               default: break;
               HSPACE_BYTE_CASES:
-#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32
+#if PCRE2_CODE_UNIT_WIDTH != 8
               HSPACE_MULTIBYTE_CASES:
 #endif
               RRETURN(MATCH_NOMATCH);
@@ -5334,7 +5424,7 @@
               {
               default: RRETURN(MATCH_NOMATCH);
               HSPACE_BYTE_CASES:
-#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32
+#if PCRE2_CODE_UNIT_WIDTH != 8
               HSPACE_MULTIBYTE_CASES:
 #endif
               break;
@@ -5346,7 +5436,7 @@
               {
               default: break;
               VSPACE_BYTE_CASES:
-#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32
+#if PCRE2_CODE_UNIT_WIDTH != 8
               VSPACE_MULTIBYTE_CASES:
 #endif
               RRETURN(MATCH_NOMATCH);
@@ -5358,7 +5448,7 @@
               {
               default: RRETURN(MATCH_NOMATCH);
               VSPACE_BYTE_CASES:
-#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32
+#if PCRE2_CODE_UNIT_WIDTH != 8
               VSPACE_MULTIBYTE_CASES:
 #endif
               break;
@@ -5366,31 +5456,31 @@
             break;
 
             case OP_NOT_DIGIT:
-            if (MAX_255(c) && (md->ctypes[c] & ctype_digit) != 0) RRETURN(MATCH_NOMATCH);
+            if (MAX_255(c) && (mb->ctypes[c] & ctype_digit) != 0) RRETURN(MATCH_NOMATCH);
             break;
 
             case OP_DIGIT:
-            if (!MAX_255(c) || (md->ctypes[c] & ctype_digit) == 0) RRETURN(MATCH_NOMATCH);
+            if (!MAX_255(c) || (mb->ctypes[c] & ctype_digit) == 0) RRETURN(MATCH_NOMATCH);
             break;
 
             case OP_NOT_WHITESPACE:
-            if (MAX_255(c) && (md->ctypes[c] & ctype_space) != 0) RRETURN(MATCH_NOMATCH);
+            if (MAX_255(c) && (mb->ctypes[c] & ctype_space) != 0) RRETURN(MATCH_NOMATCH);
             break;
 
             case OP_WHITESPACE:
-            if (!MAX_255(c) || (md->ctypes[c] & ctype_space) == 0) RRETURN(MATCH_NOMATCH);
+            if (!MAX_255(c) || (mb->ctypes[c] & ctype_space) == 0) RRETURN(MATCH_NOMATCH);
             break;
 
             case OP_NOT_WORDCHAR:
-            if (MAX_255(c) && (md->ctypes[c] & ctype_word) != 0) RRETURN(MATCH_NOMATCH);
+            if (MAX_255(c) && (mb->ctypes[c] & ctype_word) != 0) RRETURN(MATCH_NOMATCH);
             break;
 
             case OP_WORDCHAR:
-            if (!MAX_255(c) || (md->ctypes[c] & ctype_word) == 0) RRETURN(MATCH_NOMATCH);
+            if (!MAX_255(c) || (mb->ctypes[c] & ctype_word) == 0) RRETURN(MATCH_NOMATCH);
             break;
 
             default:
-            RRETURN(PCRE_ERROR_INTERNAL);
+            RRETURN(PCRE2_ERROR_INTERNAL);
             }
           }
         }
@@ -5405,7 +5495,7 @@
       {
       pp = eptr;  /* Remember where we started */
 
-#ifdef SUPPORT_UCP
+#ifdef SUPPORT_UNICODE
       if (prop_type >= 0)
         {
         switch(prop_type)
@@ -5414,7 +5504,7 @@
           for (i = min; i < max; i++)
             {
             int len = 1;
-            if (eptr >= md->end_subject)
+            if (eptr >= mb->end_subject)
               {
               SCHECK_PARTIAL();
               break;
@@ -5430,7 +5520,7 @@
             {
             int chartype;
             int len = 1;
-            if (eptr >= md->end_subject)
+            if (eptr >= mb->end_subject)
               {
               SCHECK_PARTIAL();
               break;
@@ -5449,7 +5539,7 @@
           for (i = min; i < max; i++)
             {
             int len = 1;
-            if (eptr >= md->end_subject)
+            if (eptr >= mb->end_subject)
               {
               SCHECK_PARTIAL();
               break;
@@ -5464,7 +5554,7 @@
           for (i = min; i < max; i++)
             {
             int len = 1;
-            if (eptr >= md->end_subject)
+            if (eptr >= mb->end_subject)
               {
               SCHECK_PARTIAL();
               break;
@@ -5479,7 +5569,7 @@
           for (i = min; i < max; i++)
             {
             int len = 1;
-            if (eptr >= md->end_subject)
+            if (eptr >= mb->end_subject)
               {
               SCHECK_PARTIAL();
               break;
@@ -5495,7 +5585,7 @@
             {
             int category;
             int len = 1;
-            if (eptr >= md->end_subject)
+            if (eptr >= mb->end_subject)
               {
               SCHECK_PARTIAL();
               break;
@@ -5517,7 +5607,7 @@
           for (i = min; i < max; i++)
             {
             int len = 1;
-            if (eptr >= md->end_subject)
+            if (eptr >= mb->end_subject)
               {
               SCHECK_PARTIAL();
               break;
@@ -5545,7 +5635,7 @@
             {
             int category;
             int len = 1;
-            if (eptr >= md->end_subject)
+            if (eptr >= mb->end_subject)
               {
               SCHECK_PARTIAL();
               break;
@@ -5562,9 +5652,9 @@
           case PT_CLIST:
           for (i = min; i < max; i++)
             {
-            const pcre_uint32 *cp;
+            const uint32_t *cp;
             int len = 1;
-            if (eptr >= md->end_subject)
+            if (eptr >= mb->end_subject)
               {
               SCHECK_PARTIAL();
               break;
@@ -5587,7 +5677,7 @@
           for (i = min; i < max; i++)
             {
             int len = 1;
-            if (eptr >= md->end_subject)
+            if (eptr >= mb->end_subject)
               {
               SCHECK_PARTIAL();
               break;
@@ -5602,16 +5692,20 @@
           break;
 
           default:
-          RRETURN(PCRE_ERROR_INTERNAL);
+          RRETURN(PCRE2_ERROR_INTERNAL);
           }
 
         /* eptr is now past the end of the maximum run */
 
         if (possessive) continue;    /* No backtracking */
+
+        /* After \C in UTF mode, pp might be in the middle of a Unicode
+        character. Use <= pp to ensure backtracking doesn't go too far. */
+
         for(;;)
           {
           if (eptr <= pp) goto TAIL_RECURSE;
-          RMATCH(eptr, ecode, offset_top, md, eptrb, RM44);
+          RMATCH(eptr, ecode, offset_top, mb, eptrb, RM44);
           if (rrc != MATCH_NOMATCH) RRETURN(rrc);
           eptr--;
           if (utf) BACKCHAR(eptr);
@@ -5625,7 +5719,7 @@
         {
         for (i = min; i < max; i++)
           {
-          if (eptr >= md->end_subject)
+          if (eptr >= mb->end_subject)
             {
             SCHECK_PARTIAL();
             break;
@@ -5635,7 +5729,7 @@
             int lgb, rgb;
             GETCHARINCTEST(c, eptr);
             lgb = UCD_GRAPHBREAK(c);
-            while (eptr < md->end_subject)
+            while (eptr < mb->end_subject)
               {
               int len = 1;
               if (!utf) c = *eptr; else { GETCHARLEN(c, eptr, len); }
@@ -5660,10 +5754,10 @@
         for(;;)
           {
           int lgb, rgb;
-          PCRE_PUCHAR fptr;
+          PCRE2_SPTR fptr;
 
           if (eptr <= pp) goto TAIL_RECURSE;   /* At start of char run */
-          RMATCH(eptr, ecode, offset_top, md, eptrb, RM45);
+          RMATCH(eptr, ecode, offset_top, mb, eptrb, RM45);
           if (rrc != MATCH_NOMATCH) RRETURN(rrc);
 
           /* Backtracking over an extended grapheme cluster involves inspecting
@@ -5696,9 +5790,9 @@
         }
 
       else
-#endif   /* SUPPORT_UCP */
+#endif   /* SUPPORT_UNICODE */
 
-#ifdef SUPPORT_UTF
+#ifdef SUPPORT_UNICODE
       if (utf)
         {
         switch(ctype)
@@ -5706,23 +5800,23 @@
           case OP_ANY:
           for (i = min; i < max; i++)
             {
-            if (eptr >= md->end_subject)
+            if (eptr >= mb->end_subject)
               {
               SCHECK_PARTIAL();
               break;
               }
             if (IS_NEWLINE(eptr)) break;
-            if (md->partial != 0 &&    /* Take care with CRLF partial */
-                eptr + 1 >= md->end_subject &&
+            if (mb->partial != 0 &&    /* Take care with CRLF partial */
+                eptr + 1 >= mb->end_subject &&
                 NLBLOCK->nltype == NLTYPE_FIXED &&
                 NLBLOCK->nllen == 2 &&
                 UCHAR21(eptr) == NLBLOCK->nl[0])
               {
-              md->hitend = TRUE;
-              if (md->partial > 1) RRETURN(PCRE_ERROR_PARTIAL);
+              mb->hitend = TRUE;
+              if (mb->partial > 1) RRETURN(PCRE2_ERROR_PARTIAL);
               }
             eptr++;
-            ACROSSCHAR(eptr < md->end_subject, *eptr, eptr++);
+            ACROSSCHAR(eptr < mb->end_subject, *eptr, eptr++);
             }
           break;
 
@@ -5731,18 +5825,18 @@
             {
             for (i = min; i < max; i++)
               {
-              if (eptr >= md->end_subject)
+              if (eptr >= mb->end_subject)
                 {
                 SCHECK_PARTIAL();
                 break;
                 }
               eptr++;
-              ACROSSCHAR(eptr < md->end_subject, *eptr, eptr++);
+              ACROSSCHAR(eptr < mb->end_subject, *eptr, eptr++);
               }
             }
           else
             {
-            eptr = md->end_subject;   /* Unlimited UTF-8 repeat */
+            eptr = mb->end_subject;   /* Unlimited UTF-8 repeat */
             SCHECK_PARTIAL();
             }
           break;
@@ -5751,9 +5845,9 @@
 
           case OP_ANYBYTE:
           c = max - min;
-          if (c > (unsigned int)(md->end_subject - eptr))
+          if (c > (uint32_t)(mb->end_subject - eptr))
             {
-            eptr = md->end_subject;
+            eptr = mb->end_subject;
             SCHECK_PARTIAL();
             }
           else eptr += c;
@@ -5763,7 +5857,7 @@
           for (i = min; i < max; i++)
             {
             int len = 1;
-            if (eptr >= md->end_subject)
+            if (eptr >= mb->end_subject)
               {
               SCHECK_PARTIAL();
               break;
@@ -5771,13 +5865,13 @@
             GETCHARLEN(c, eptr, len);
             if (c == CHAR_CR)
               {
-              if (++eptr >= md->end_subject) break;
+              if (++eptr >= mb->end_subject) break;
               if (UCHAR21(eptr) == CHAR_LF) eptr++;
               }
             else
               {
               if (c != CHAR_LF &&
-                  (md->bsr_anycrlf ||
+                  (mb->bsr_convention == PCRE2_BSR_ANYCRLF ||
                    (c != CHAR_VT && c != CHAR_FF && c != CHAR_NEL
 #ifndef EBCDIC
                     && c != 0x2028 && c != 0x2029
@@ -5795,7 +5889,7 @@
             {
             BOOL gotspace;
             int len = 1;
-            if (eptr >= md->end_subject)
+            if (eptr >= mb->end_subject)
               {
               SCHECK_PARTIAL();
               break;
@@ -5817,7 +5911,7 @@
             {
             BOOL gotspace;
             int len = 1;
-            if (eptr >= md->end_subject)
+            if (eptr >= mb->end_subject)
               {
               SCHECK_PARTIAL();
               break;
@@ -5837,13 +5931,13 @@
           for (i = min; i < max; i++)
             {
             int len = 1;
-            if (eptr >= md->end_subject)
+            if (eptr >= mb->end_subject)
               {
               SCHECK_PARTIAL();
               break;
               }
             GETCHARLEN(c, eptr, len);
-            if (c < 256 && (md->ctypes[c] & ctype_digit) != 0) break;
+            if (c < 256 && (mb->ctypes[c] & ctype_digit) != 0) break;
             eptr+= len;
             }
           break;
@@ -5852,13 +5946,13 @@
           for (i = min; i < max; i++)
             {
             int len = 1;
-            if (eptr >= md->end_subject)
+            if (eptr >= mb->end_subject)
               {
               SCHECK_PARTIAL();
               break;
               }
             GETCHARLEN(c, eptr, len);
-            if (c >= 256 ||(md->ctypes[c] & ctype_digit) == 0) break;
+            if (c >= 256 ||(mb->ctypes[c] & ctype_digit) == 0) break;
             eptr+= len;
             }
           break;
@@ -5867,13 +5961,13 @@
           for (i = min; i < max; i++)
             {
             int len = 1;
-            if (eptr >= md->end_subject)
+            if (eptr >= mb->end_subject)
               {
               SCHECK_PARTIAL();
               break;
               }
             GETCHARLEN(c, eptr, len);
-            if (c < 256 && (md->ctypes[c] & ctype_space) != 0) break;
+            if (c < 256 && (mb->ctypes[c] & ctype_space) != 0) break;
             eptr+= len;
             }
           break;
@@ -5882,13 +5976,13 @@
           for (i = min; i < max; i++)
             {
             int len = 1;
-            if (eptr >= md->end_subject)
+            if (eptr >= mb->end_subject)
               {
               SCHECK_PARTIAL();
               break;
               }
             GETCHARLEN(c, eptr, len);
-            if (c >= 256 ||(md->ctypes[c] & ctype_space) == 0) break;
+            if (c >= 256 ||(mb->ctypes[c] & ctype_space) == 0) break;
             eptr+= len;
             }
           break;
@@ -5897,13 +5991,13 @@
           for (i = min; i < max; i++)
             {
             int len = 1;
-            if (eptr >= md->end_subject)
+            if (eptr >= mb->end_subject)
               {
               SCHECK_PARTIAL();
               break;
               }
             GETCHARLEN(c, eptr, len);
-            if (c < 256 && (md->ctypes[c] & ctype_word) != 0) break;
+            if (c < 256 && (mb->ctypes[c] & ctype_word) != 0) break;
             eptr+= len;
             }
           break;
@@ -5912,26 +6006,30 @@
           for (i = min; i < max; i++)
             {
             int len = 1;
-            if (eptr >= md->end_subject)
+            if (eptr >= mb->end_subject)
               {
               SCHECK_PARTIAL();
               break;
               }
             GETCHARLEN(c, eptr, len);
-            if (c >= 256 || (md->ctypes[c] & ctype_word) == 0) break;
+            if (c >= 256 || (mb->ctypes[c] & ctype_word) == 0) break;
             eptr+= len;
             }
           break;
 
           default:
-          RRETURN(PCRE_ERROR_INTERNAL);
+          RRETURN(PCRE2_ERROR_INTERNAL);
           }
 
         if (possessive) continue;    /* No backtracking */
+
+        /* After \C in UTF mode, pp might be in the middle of a Unicode
+        character. Use <= pp to ensure backtracking doesn't go too far. */
+
         for(;;)
           {
           if (eptr <= pp) goto TAIL_RECURSE;
-          RMATCH(eptr, ecode, offset_top, md, eptrb, RM46);
+          RMATCH(eptr, ecode, offset_top, mb, eptrb, RM46);
           if (rrc != MATCH_NOMATCH) RRETURN(rrc);
           eptr--;
           BACKCHAR(eptr);
@@ -5940,7 +6038,7 @@
           }
         }
       else
-#endif  /* SUPPORT_UTF */
+#endif  /* SUPPORT_UNICODE */
       /* Not UTF mode */
         {
         switch(ctype)
@@ -5948,20 +6046,20 @@
           case OP_ANY:
           for (i = min; i < max; i++)
             {
-            if (eptr >= md->end_subject)
+            if (eptr >= mb->end_subject)
               {
               SCHECK_PARTIAL();
               break;
               }
             if (IS_NEWLINE(eptr)) break;
-            if (md->partial != 0 &&    /* Take care with CRLF partial */
-                eptr + 1 >= md->end_subject &&
+            if (mb->partial != 0 &&    /* Take care with CRLF partial */
+                eptr + 1 >= mb->end_subject &&
                 NLBLOCK->nltype == NLTYPE_FIXED &&
                 NLBLOCK->nllen == 2 &&
                 *eptr == NLBLOCK->nl[0])
               {
-              md->hitend = TRUE;
-              if (md->partial > 1) RRETURN(PCRE_ERROR_PARTIAL);
+              mb->hitend = TRUE;
+              if (mb->partial > 1) RRETURN(PCRE2_ERROR_PARTIAL);
               }
             eptr++;
             }
@@ -5970,9 +6068,9 @@
           case OP_ALLANY:
           case OP_ANYBYTE:
           c = max - min;
-          if (c > (unsigned int)(md->end_subject - eptr))
+          if (c > (uint32_t)(mb->end_subject - eptr))
             {
-            eptr = md->end_subject;
+            eptr = mb->end_subject;
             SCHECK_PARTIAL();
             }
           else eptr += c;
@@ -5981,7 +6079,7 @@
           case OP_ANYNL:
           for (i = min; i < max; i++)
             {
-            if (eptr >= md->end_subject)
+            if (eptr >= mb->end_subject)
               {
               SCHECK_PARTIAL();
               break;
@@ -5989,14 +6087,14 @@
             c = *eptr;
             if (c == CHAR_CR)
               {
-              if (++eptr >= md->end_subject) break;
+              if (++eptr >= mb->end_subject) break;
               if (*eptr == CHAR_LF) eptr++;
               }
             else
               {
-              if (c != CHAR_LF && (md->bsr_anycrlf ||
+              if (c != CHAR_LF && (mb->bsr_convention == PCRE2_BSR_ANYCRLF ||
                  (c != CHAR_VT && c != CHAR_FF && c != CHAR_NEL
-#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32
+#if PCRE2_CODE_UNIT_WIDTH != 8
                  && c != 0x2028 && c != 0x2029
 #endif
                  ))) break;
@@ -6008,7 +6106,7 @@
           case OP_NOT_HSPACE:
           for (i = min; i < max; i++)
             {
-            if (eptr >= md->end_subject)
+            if (eptr >= mb->end_subject)
               {
               SCHECK_PARTIAL();
               break;
@@ -6017,7 +6115,7 @@
               {
               default: eptr++; break;
               HSPACE_BYTE_CASES:
-#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32
+#if PCRE2_CODE_UNIT_WIDTH != 8
               HSPACE_MULTIBYTE_CASES:
 #endif
               goto ENDLOOP00;
@@ -6029,7 +6127,7 @@
           case OP_HSPACE:
           for (i = min; i < max; i++)
             {
-            if (eptr >= md->end_subject)
+            if (eptr >= mb->end_subject)
               {
               SCHECK_PARTIAL();
               break;
@@ -6038,7 +6136,7 @@
               {
               default: goto ENDLOOP01;
               HSPACE_BYTE_CASES:
-#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32
+#if PCRE2_CODE_UNIT_WIDTH != 8
               HSPACE_MULTIBYTE_CASES:
 #endif
               eptr++; break;
@@ -6050,7 +6148,7 @@
           case OP_NOT_VSPACE:
           for (i = min; i < max; i++)
             {
-            if (eptr >= md->end_subject)
+            if (eptr >= mb->end_subject)
               {
               SCHECK_PARTIAL();
               break;
@@ -6059,7 +6157,7 @@
               {
               default: eptr++; break;
               VSPACE_BYTE_CASES:
-#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32
+#if PCRE2_CODE_UNIT_WIDTH != 8
               VSPACE_MULTIBYTE_CASES:
 #endif
               goto ENDLOOP02;
@@ -6071,7 +6169,7 @@
           case OP_VSPACE:
           for (i = min; i < max; i++)
             {
-            if (eptr >= md->end_subject)
+            if (eptr >= mb->end_subject)
               {
               SCHECK_PARTIAL();
               break;
@@ -6080,7 +6178,7 @@
               {
               default: goto ENDLOOP03;
               VSPACE_BYTE_CASES:
-#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32
+#if PCRE2_CODE_UNIT_WIDTH != 8
               VSPACE_MULTIBYTE_CASES:
 #endif
               eptr++; break;
@@ -6092,12 +6190,12 @@
           case OP_NOT_DIGIT:
           for (i = min; i < max; i++)
             {
-            if (eptr >= md->end_subject)
+            if (eptr >= mb->end_subject)
               {
               SCHECK_PARTIAL();
               break;
               }
-            if (MAX_255(*eptr) && (md->ctypes[*eptr] & ctype_digit) != 0) break;
+            if (MAX_255(*eptr) && (mb->ctypes[*eptr] & ctype_digit) != 0) break;
             eptr++;
             }
           break;
@@ -6105,12 +6203,12 @@
           case OP_DIGIT:
           for (i = min; i < max; i++)
             {
-            if (eptr >= md->end_subject)
+            if (eptr >= mb->end_subject)
               {
               SCHECK_PARTIAL();
               break;
               }
-            if (!MAX_255(*eptr) || (md->ctypes[*eptr] & ctype_digit) == 0) break;
+            if (!MAX_255(*eptr) || (mb->ctypes[*eptr] & ctype_digit) == 0) break;
             eptr++;
             }
           break;
@@ -6118,12 +6216,12 @@
           case OP_NOT_WHITESPACE:
           for (i = min; i < max; i++)
             {
-            if (eptr >= md->end_subject)
+            if (eptr >= mb->end_subject)
               {
               SCHECK_PARTIAL();
               break;
               }
-            if (MAX_255(*eptr) && (md->ctypes[*eptr] & ctype_space) != 0) break;
+            if (MAX_255(*eptr) && (mb->ctypes[*eptr] & ctype_space) != 0) break;
             eptr++;
             }
           break;
@@ -6131,12 +6229,12 @@
           case OP_WHITESPACE:
           for (i = min; i < max; i++)
             {
-            if (eptr >= md->end_subject)
+            if (eptr >= mb->end_subject)
               {
               SCHECK_PARTIAL();
               break;
               }
-            if (!MAX_255(*eptr) || (md->ctypes[*eptr] & ctype_space) == 0) break;
+            if (!MAX_255(*eptr) || (mb->ctypes[*eptr] & ctype_space) == 0) break;
             eptr++;
             }
           break;
@@ -6144,12 +6242,12 @@
           case OP_NOT_WORDCHAR:
           for (i = min; i < max; i++)
             {
-            if (eptr >= md->end_subject)
+            if (eptr >= mb->end_subject)
               {
               SCHECK_PARTIAL();
               break;
               }
-            if (MAX_255(*eptr) && (md->ctypes[*eptr] & ctype_word) != 0) break;
+            if (MAX_255(*eptr) && (mb->ctypes[*eptr] & ctype_word) != 0) break;
             eptr++;
             }
           break;
@@ -6157,25 +6255,25 @@
           case OP_WORDCHAR:
           for (i = min; i < max; i++)
             {
-            if (eptr >= md->end_subject)
+            if (eptr >= mb->end_subject)
               {
               SCHECK_PARTIAL();
               break;
               }
-            if (!MAX_255(*eptr) || (md->ctypes[*eptr] & ctype_word) == 0) break;
+            if (!MAX_255(*eptr) || (mb->ctypes[*eptr] & ctype_word) == 0) break;
             eptr++;
             }
           break;
 
           default:
-          RRETURN(PCRE_ERROR_INTERNAL);
+          RRETURN(PCRE2_ERROR_INTERNAL);
           }
 
         if (possessive) continue;    /* No backtracking */
         for (;;)
           {
           if (eptr == pp) goto TAIL_RECURSE;
-          RMATCH(eptr, ecode, offset_top, md, eptrb, RM47);
+          RMATCH(eptr, ecode, offset_top, mb, eptrb, RM47);
           if (rrc != MATCH_NOMATCH) RRETURN(rrc);
           eptr--;
           if (ctype == OP_ANYNL && eptr > pp  && *eptr == CHAR_LF &&
@@ -6190,8 +6288,7 @@
     something seriously wrong in the code above or the OP_xxx definitions. */
 
     default:
-    DPRINTF(("Unknown opcode %d\n", *ecode));
-    RRETURN(PCRE_ERROR_UNKNOWN_OPCODE);
+    RRETURN(PCRE2_ERROR_INTERNAL);
     }
 
   /* Do not stick any code in here without much thought; it is assumed
@@ -6206,7 +6303,7 @@
 match(), the RRETURN() macro jumps here. The number that is saved in
 frame->Xwhere indicates which label we actually want to return to. */
 
-#ifdef NO_RECURSE
+#ifdef HEAP_MATCH_RECURSE
 #define LBL(val) case val: goto L_RM##val;
 HEAP_RETURN:
 switch (frame->Xwhere)
@@ -6216,25 +6313,22 @@
   LBL(19) LBL(24) LBL(25) LBL(26) LBL(27) LBL(29) LBL(31) LBL(33)
   LBL(35) LBL(43) LBL(47) LBL(48) LBL(49) LBL(50) LBL(51) LBL(52)
   LBL(53) LBL(54) LBL(55) LBL(56) LBL(57) LBL(58) LBL(63) LBL(64)
-  LBL(65) LBL(66)
-#if defined SUPPORT_UTF || !defined COMPILE_PCRE8
+  LBL(65) LBL(66) LBL(68)
+#ifdef SUPPORT_WIDE_CHARS
   LBL(20) LBL(21)
 #endif
-#ifdef SUPPORT_UTF
+#ifdef SUPPORT_UNICODE
   LBL(16) LBL(18)
   LBL(22) LBL(23) LBL(28) LBL(30)
   LBL(32) LBL(34) LBL(42) LBL(46)
-#ifdef SUPPORT_UCP
   LBL(36) LBL(37) LBL(38) LBL(39) LBL(40) LBL(41) LBL(44) LBL(45)
   LBL(59) LBL(60) LBL(61) LBL(62) LBL(67)
-#endif  /* SUPPORT_UCP */
-#endif  /* SUPPORT_UTF */
+#endif  /* SUPPORT_UNICODE */
   default:
-  DPRINTF(("jump error in pcre match: label %d non-existent\n", frame->Xwhere));
-  return PCRE_ERROR_INTERNAL;
+  return PCRE2_ERROR_INTERNAL;
   }
 #undef LBL
-#endif  /* NO_RECURSE */
+#endif  /* HEAP_MATCH_RECURSE */
 }
 
 
@@ -6244,7 +6338,7 @@
 
 Undefine all the macros that were defined above to handle this. */
 
-#ifdef NO_RECURSE
+#ifdef HEAP_MATCH_RECURSE
 #undef eptr
 #undef ecode
 #undef mstart
@@ -6255,7 +6349,7 @@
 #undef callpat
 #undef charptr
 #undef data
-#undef next
+#undef next_ecode
 #undef pp
 #undef prev
 #undef saved_eptr
@@ -6277,11 +6371,9 @@
 #undef save_offset1
 #undef save_offset2
 #undef save_offset3
-#undef stacksave
 
 #undef newptrb
-
-#endif
+#endif  /* HEAP_MATCH_RECURSE */
 
 /* These two are defined as macros in both cases */
 
@@ -6292,7 +6384,7 @@
 ***************************************************************************/
 
 
-#ifdef NO_RECURSE
+#ifdef HEAP_MATCH_RECURSE
 /*************************************************
 *          Release allocated heap frames         *
 *************************************************/
@@ -6300,378 +6392,336 @@
 /* This function releases all the allocated frames. The base frame is on the
 machine stack, and so must not be freed.
 
-Argument: the address of the base frame
+Argument:
+  frame_base    the address of the base frame
+  mb            the match block
+
 Returns:  nothing
 */
 
 static void
-release_match_heapframes (heapframe *frame_base)
+release_match_heapframes (heapframe *frame_base, match_block *mb)
 {
 heapframe *nextframe = frame_base->Xnextframe;
 while (nextframe != NULL)
   {
   heapframe *oldframe = nextframe;
   nextframe = nextframe->Xnextframe;
-  (PUBL(stack_free))(oldframe);
+  mb->stack_memctl.free(oldframe, mb->stack_memctl.memory_data);
   }
 }
-#endif
+#endif  /* HEAP_MATCH_RECURSE */
+
 
 
 /*************************************************
-*         Execute a Regular Expression           *
+*           Match a Regular Expression           *
 *************************************************/
 
-/* This function applies a compiled re to a subject string and picks out
+/* This function applies a compiled pattern 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
+  code            points to the compiled expression
   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
+  match_data      points to a match_data block
+  mcontext        points a PCRE2 context
 
-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
+Returns:          > 0 => success; value is the number of ovector pairs filled
+                  = 0 => success, but ovector is not big enough
+                   -1 => failed to match (PCRE2_ERROR_NOMATCH)
+                   -2 => partial match (PCRE2_ERROR_PARTIAL)
+                 < -2 => some kind of unexpected problem
 */
 
-#if defined COMPILE_PCRE8
-PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
-pcre_exec(const pcre *argument_re, const pcre_extra *extra_data,
-  PCRE_SPTR subject, int length, int start_offset, int options, int *offsets,
-  int offsetcount)
-#elif defined COMPILE_PCRE16
-PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
-pcre16_exec(const pcre16 *argument_re, const pcre16_extra *extra_data,
-  PCRE_SPTR16 subject, int length, int start_offset, int options, int *offsets,
-  int offsetcount)
-#elif defined COMPILE_PCRE32
-PCRE_EXP_DEFN int PCRE_CALL_CONVENTION
-pcre32_exec(const pcre32 *argument_re, const pcre32_extra *extra_data,
-  PCRE_SPTR32 subject, int length, int start_offset, int options, int *offsets,
-  int offsetcount)
-#endif
+PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION
+pcre2_match(const pcre2_code *code, PCRE2_SPTR subject, PCRE2_SIZE length,
+  PCRE2_SIZE start_offset, uint32_t options, pcre2_match_data *match_data,
+  pcre2_match_context *mcontext)
 {
-int rc, ocount, arg_offset_max;
-int newline;
-BOOL using_temporary_offsets = FALSE;
+int rc;
+int ocount;
+
+const uint8_t *start_bits = NULL;
+
+const pcre2_real_code *re = (const pcre2_real_code *)code;
+
 BOOL anchored;
-BOOL startline;
 BOOL firstline;
+BOOL has_first_cu = FALSE;
+BOOL has_req_cu = FALSE;
+BOOL startline;
+BOOL using_temporary_offsets = FALSE;
 BOOL utf;
-BOOL has_first_char = FALSE;
-BOOL has_req_char = FALSE;
-pcre_uchar first_char = 0;
-pcre_uchar first_char2 = 0;
-pcre_uchar req_char = 0;
-pcre_uchar req_char2 = 0;
-match_data match_block;
-match_data *md = &match_block;
-const pcre_uint8 *tables;
-const pcre_uint8 *start_bits = NULL;
-PCRE_PUCHAR start_match = (PCRE_PUCHAR)subject + start_offset;
-PCRE_PUCHAR end_subject;
-PCRE_PUCHAR start_partial = NULL;
-PCRE_PUCHAR match_partial = NULL;
-PCRE_PUCHAR req_char_ptr = start_match - 1;
 
-const pcre_study_data *study;
-const REAL_PCRE *re = (const REAL_PCRE *)argument_re;
+PCRE2_UCHAR first_cu = 0;
+PCRE2_UCHAR first_cu2 = 0;
+PCRE2_UCHAR req_cu = 0;
+PCRE2_UCHAR req_cu2 = 0;
 
-#ifdef NO_RECURSE
+PCRE2_SPTR bumpalong_limit;
+PCRE2_SPTR end_subject;
+PCRE2_SPTR start_match = subject + start_offset;
+PCRE2_SPTR req_cu_ptr = start_match - 1;
+PCRE2_SPTR start_partial = NULL;
+PCRE2_SPTR match_partial = NULL;
+
+/* We need to have mb pointing to a match block, because the IS_NEWLINE macro
+is used below, and it expects NLBLOCK to be defined as a pointer. */
+
+match_block actual_match_block;
+match_block *mb = &actual_match_block;
+
+#ifdef HEAP_MATCH_RECURSE
 heapframe frame_zero;
 frame_zero.Xprevframe = NULL;            /* Marks the top level */
 frame_zero.Xnextframe = NULL;            /* None are allocated yet */
-md->match_frames_base = &frame_zero;
+mb->match_frames_base = &frame_zero;
 #endif
 
-/* Check for the special magic call that measures the size of the stack used
-per recursive call of match(). Without the funny casting for sizeof, a Windows
-compiler gave this error: "unary minus operator applied to unsigned type,
-result still unsigned". Hopefully the cast fixes that. */
+/* A length equal to PCRE2_ZERO_TERMINATED implies a zero-terminated
+subject string. */
 
-if (re == NULL && extra_data == NULL && subject == NULL && length == -999 &&
-    start_offset == -999)
-#ifdef NO_RECURSE
-  return -((int)sizeof(heapframe));
-#else
-  return match(NULL, NULL, NULL, 0, NULL, NULL, 0);
-#endif
+if (length == PCRE2_ZERO_TERMINATED) length = PRIV(strlen)(subject);
+end_subject = subject + length;
 
 /* 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;
-if (length < 0) return PCRE_ERROR_BADLENGTH;
-if (start_offset < 0 || start_offset > length) return PCRE_ERROR_BADOFFSET;
+if ((options & ~PUBLIC_MATCH_OPTIONS) != 0) return PCRE2_ERROR_BADOPTION;
+if (code == NULL || subject == NULL || match_data == NULL)
+  return PCRE2_ERROR_NULL;
+if (start_offset > length) return PCRE2_ERROR_BADOFFSET;
 
-/* Check that the first field in the block is the magic number. If it is not,
-return with PCRE_ERROR_BADMAGIC. However, if the magic number is equal to
-REVERSED_MAGIC_NUMBER we return with PCRE_ERROR_BADENDIANNESS, which
-means that the pattern is likely compiled with different endianness. */
+/* Check that the first field in the block is the magic number. */
 
-if (re->magic_number != MAGIC_NUMBER)
-  return re->magic_number == REVERSED_MAGIC_NUMBER?
-    PCRE_ERROR_BADENDIANNESS:PCRE_ERROR_BADMAGIC;
-if ((re->flags & PCRE_MODE) == 0) return PCRE_ERROR_BADMODE;
+if (re->magic_number != MAGIC_NUMBER) return PCRE2_ERROR_BADMAGIC;
 
-/* These two settings are used in the code for checking a UTF-8 string that
-follows immediately afterwards. Other values in the md block are used only
-during "normal" pcre_exec() processing, not when the JIT support is in use,
-so they are set up later. */
+/* Check the code unit width. */
 
-/* PCRE_UTF16 has the same value as PCRE_UTF8. */
-utf = md->utf = (re->options & PCRE_UTF8) != 0;
-md->partial = ((options & PCRE_PARTIAL_HARD) != 0)? 2 :
-              ((options & PCRE_PARTIAL_SOFT) != 0)? 1 : 0;
+if ((re->flags & PCRE2_MODE_MASK) != PCRE2_CODE_UNIT_WIDTH/8)
+  return PCRE2_ERROR_BADMODE;
 
-/* Check a UTF-8 string if required. Pass back the character offset and error
-code for an invalid string if a results vector is available. */
+/* PCRE2_NOTEMPTY and PCRE2_NOTEMPTY_ATSTART are match-time flags in the
+options variable for this function. Users of PCRE2 who are not calling the
+function directly would like to have a way of setting these flags, in the same
+way that they can set pcre2_compile() flags like PCRE2_NO_AUTOPOSSESS with
+constructions like (*NO_AUTOPOSSESS). To enable this, (*NOTEMPTY) and
+(*NOTEMPTY_ATSTART) set bits in the pattern's "flag" function which can now be
+transferred to the options for this function. The bits are guaranteed to be
+adjacent, but do not have the same values. This bit of Boolean trickery assumes
+that the match-time bits are not more significant than the flag bits. If by
+accident this is not the case, a compile-time division by zero error will
+occur. */
 
-#ifdef SUPPORT_UTF
-if (utf && (options & PCRE_NO_UTF8_CHECK) == 0)
+#define FF (PCRE2_NOTEMPTY_SET|PCRE2_NE_ATST_SET)
+#define OO (PCRE2_NOTEMPTY|PCRE2_NOTEMPTY_ATSTART)
+options |= (re->flags & FF) / ((FF & (~FF+1)) / (OO & (~OO+1)));
+#undef FF
+#undef OO
+
+/* A NULL match context means "use a default context" */
+
+if (mcontext == NULL)
+  mcontext = (pcre2_match_context *)(&PRIV(default_match_context));
+
+/* These two settings are used in the code for checking a UTF string that
+follows immediately afterwards. Other values in the mb block are used only
+during interpretive pcre_match() processing, not when the JIT support is in
+use, so they are set up later. */
+
+utf = (re->overall_options & PCRE2_UTF) != 0;
+mb->partial = ((options & PCRE2_PARTIAL_HARD) != 0)? 2 :
+              ((options & PCRE2_PARTIAL_SOFT) != 0)? 1 : 0;
+
+/* Check a UTF string for validity if required. For 8-bit and 16-bit strings,
+we must also check that a starting offset does not point into the middle of a
+multiunit character. We check only the portion of the subject that is going to
+be inspected during matching - from the offset minus the maximum back reference
+to the given length. This saves time when a small part of a large subject is
+being matched by the use of a starting offset. Note that the maximum lookbehind
+is a number of characters, not code units. */
+
+#ifdef SUPPORT_UNICODE
+if (utf && (options & PCRE2_NO_UTF_CHECK) == 0)
   {
-  int erroroffset;
-  int errorcode = PRIV(valid_utf)((PCRE_PUCHAR)subject, length, &erroroffset);
-  if (errorcode != 0)
+  PCRE2_SPTR check_subject = start_match;  /* start_match includes offset */
+
+  if (start_offset > 0)
     {
-    if (offsetcount >= 2)
+#if PCRE2_CODE_UNIT_WIDTH != 32
+    unsigned int i;
+    if (start_match < end_subject && NOT_FIRSTCU(*start_match))
+      return PCRE2_ERROR_BADUTFOFFSET;
+    for (i = re->max_lookbehind; i > 0 && check_subject > subject; i--)
       {
-      offsets[0] = erroroffset;
-      offsets[1] = errorcode;
+      check_subject--;
+      while (check_subject > subject &&
+#if PCRE2_CODE_UNIT_WIDTH == 8
+      (*check_subject & 0xc0) == 0x80)
+#else  /* 16-bit */
+      (*check_subject & 0xfc00) == 0xdc00)
+#endif /* PCRE2_CODE_UNIT_WIDTH == 8 */
+        check_subject--;
       }
-#if defined COMPILE_PCRE8
-    return (errorcode <= PCRE_UTF8_ERR5 && md->partial > 1)?
-      PCRE_ERROR_SHORTUTF8 : PCRE_ERROR_BADUTF8;
-#elif defined COMPILE_PCRE16
-    return (errorcode <= PCRE_UTF16_ERR1 && md->partial > 1)?
-      PCRE_ERROR_SHORTUTF16 : PCRE_ERROR_BADUTF16;
-#elif defined COMPILE_PCRE32
-    return PCRE_ERROR_BADUTF32;
-#endif
+#else
+    /* In the 32-bit library, one code unit equals one character. However,
+    we cannot just subtract the lookbehind and then compare pointers, because
+    a very large lookbehind could create an invalid pointer. */
+
+    if (start_offset >= re->max_lookbehind)
+      check_subject -= re->max_lookbehind;
+    else
+      check_subject = subject;
+#endif  /* PCRE2_CODE_UNIT_WIDTH != 32 */
     }
-#if defined COMPILE_PCRE8 || defined COMPILE_PCRE16
-  /* Check that a start_offset points to the start of a UTF character. */
-  if (start_offset > 0 && start_offset < length &&
-      NOT_FIRSTCHAR(((PCRE_PUCHAR)subject)[start_offset]))
-    return PCRE_ERROR_BADUTF8_OFFSET;
-#endif
+
+  /* Validate the relevant portion of the subject. After an error, adjust the
+  offset to be an absolute offset in the whole string. */
+
+  match_data->rc = PRIV(valid_utf)(check_subject,
+    length - (check_subject - subject), &(match_data->startchar));
+  if (match_data->rc != 0)
+    {
+    match_data->startchar += check_subject - subject;
+    return match_data->rc;
+    }
   }
-#endif
+#endif  /* SUPPORT_UNICODE */
+
+/* It is an error to set an offset limit without setting the flag at compile
+time. */
+
+if (mcontext->offset_limit != PCRE2_UNSET &&
+     (re->overall_options & PCRE2_USE_OFFSET_LIMIT) == 0)
+  return PCRE2_ERROR_BADOFFSETLIMIT;
 
 /* If the pattern was successfully studied with JIT support, run the JIT
 executable instead of the rest of this function. Most options must be set at
 compile time for the JIT code to be usable. Fallback to the normal code path if
-an unsupported flag is set. */
+an unsupported option is set or if JIT returns BADOPTION (which means that the
+selected normal or partial matching mode was not compiled). */
 
 #ifdef SUPPORT_JIT
-if (extra_data != NULL
-    && (extra_data->flags & (PCRE_EXTRA_EXECUTABLE_JIT |
-                             PCRE_EXTRA_TABLES)) == PCRE_EXTRA_EXECUTABLE_JIT
-    && extra_data->executable_jit != NULL
-    && (options & ~PUBLIC_JIT_EXEC_OPTIONS) == 0)
+if (re->executable_jit != NULL && (options & ~PUBLIC_JIT_MATCH_OPTIONS) == 0)
   {
-  rc = PRIV(jit_exec)(extra_data, (const pcre_uchar *)subject, length,
-       start_offset, options, offsets, offsetcount);
-
-  /* PCRE_ERROR_NULL means that the selected normal or partial matching
-  mode is not compiled. In this case we simply fallback to interpreter. */
-
-  if (rc != PCRE_ERROR_JIT_BADOPTION) return rc;
+  rc = pcre2_jit_match(code, subject, length, start_offset, options,
+    match_data, mcontext);
+  if (rc != PCRE2_ERROR_JIT_BADOPTION) return rc;
   }
 #endif
 
-/* Carry on with non-JIT matching. This information is for finding all the
-numbers associated with a given name, for condition testing. */
+/* Carry on with non-JIT matching. */
 
-md->name_table = (pcre_uchar *)re + re->name_table_offset;
-md->name_count = re->name_count;
-md->name_entry_size = re->name_entry_size;
+anchored = ((re->overall_options | options) & PCRE2_ANCHORED) != 0;
+firstline = (re->overall_options & PCRE2_FIRSTLINE) != 0;
+startline = (re->flags & PCRE2_STARTLINE) != 0;
+bumpalong_limit =  (mcontext->offset_limit == PCRE2_UNSET)?
+  end_subject : subject + mcontext->offset_limit;
 
-/* Fish out the optional data from the extra_data structure, first setting
-the default values. */
+/* Fill in the fields in the match block. */
 
-study = NULL;
-md->match_limit = MATCH_LIMIT;
-md->match_limit_recursion = MATCH_LIMIT_RECURSION;
-md->callout_data = NULL;
-
-/* The table pointer is always in native byte order. */
-
-tables = re->tables;
-
-/* The two limit values override the defaults, whatever their value. */
-
-if (extra_data != NULL)
-  {
-  unsigned long 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)
-    md->match_limit = extra_data->match_limit;
-  if ((flags & PCRE_EXTRA_MATCH_LIMIT_RECURSION) != 0)
-    md->match_limit_recursion = extra_data->match_limit_recursion;
-  if ((flags & PCRE_EXTRA_CALLOUT_DATA) != 0)
-    md->callout_data = extra_data->callout_data;
-  if ((flags & PCRE_EXTRA_TABLES) != 0) tables = extra_data->tables;
-  }
-
-/* Limits in the regex override only if they are smaller. */
-
-if ((re->flags & PCRE_MLSET) != 0 && re->limit_match < md->match_limit)
-  md->match_limit = re->limit_match;
-
-if ((re->flags & PCRE_RLSET) != 0 &&
-    re->limit_recursion < md->match_limit_recursion)
-  md->match_limit_recursion = re->limit_recursion;
-
-/* 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 = PRIV(default_tables);
-
-/* Set up other data */
-
-anchored = ((re->options | options) & PCRE_ANCHORED) != 0;
-startline = (re->flags & PCRE_STARTLINE) != 0;
-firstline = (re->options & PCRE_FIRSTLINE) != 0;
-
-/* The code starts after the real_pcre block and the capture name table. */
-
-md->start_code = (const pcre_uchar *)re + re->name_table_offset +
-  re->name_count * re->name_entry_size;
-
-md->start_subject = (PCRE_PUCHAR)subject;
-md->start_offset = start_offset;
-md->end_subject = md->start_subject + length;
-end_subject = md->end_subject;
-
-md->endonly = (re->options & PCRE_DOLLAR_ENDONLY) != 0;
-md->use_ucp = (re->options & PCRE_UCP) != 0;
-md->jscript_compat = (re->options & PCRE_JAVASCRIPT_COMPAT) != 0;
-md->ignore_skip_arg = 0;
-
-/* Some options are unpacked into BOOL variables in the hope that testing
-them will be faster than individual option bits. */
-
-md->notbol = (options & PCRE_NOTBOL) != 0;
-md->noteol = (options & PCRE_NOTEOL) != 0;
-md->notempty = (options & PCRE_NOTEMPTY) != 0;
-md->notempty_atstart = (options & PCRE_NOTEMPTY_ATSTART) != 0;
-
-md->hitend = FALSE;
-md->mark = md->nomatch_mark = NULL;     /* In case never set */
-
-md->recursive = NULL;                   /* No recursion at top level */
-md->hasthen = (re->flags & PCRE_HASTHEN) != 0;
-
-md->lcc = tables + lcc_offset;
-md->fcc = tables + fcc_offset;
-md->ctypes = tables + ctypes_offset;
-
-/* Handle different \R options. */
-
-switch (options & (PCRE_BSR_ANYCRLF|PCRE_BSR_UNICODE))
-  {
-  case 0:
-  if ((re->options & (PCRE_BSR_ANYCRLF|PCRE_BSR_UNICODE)) != 0)
-    md->bsr_anycrlf = (re->options & PCRE_BSR_ANYCRLF) != 0;
-  else
-#ifdef BSR_ANYCRLF
-  md->bsr_anycrlf = TRUE;
-#else
-  md->bsr_anycrlf = FALSE;
+mb->callout = mcontext->callout;
+mb->callout_data = mcontext->callout_data;
+mb->memctl = mcontext->memctl;
+#ifdef HEAP_MATCH_RECURSE
+mb->stack_memctl = mcontext->stack_memctl;
 #endif
+
+mb->start_subject = subject;
+mb->start_offset = start_offset;
+mb->end_subject = end_subject;
+mb->hasthen = (re->flags & PCRE2_HASTHEN) != 0;
+
+mb->moptions = options;                 /* Match options */
+mb->poptions = re->overall_options;     /* Pattern options */
+
+mb->ignore_skip_arg = 0;
+mb->mark = mb->nomatch_mark = NULL;     /* In case never set */
+mb->recursive = NULL;                   /* No recursion at top level */
+mb->ovecsave_chain = NULL;              /* No ovecsave blocks yet */
+mb->hitend = FALSE;
+
+/* The name table is needed for finding all the numbers associated with a
+given name, for condition testing. The code follows the name table. */
+
+mb->name_table = (PCRE2_UCHAR *)((uint8_t *)re + sizeof(pcre2_real_code));
+mb->name_count = re->name_count;
+mb->name_entry_size = re->name_entry_size;
+mb->start_code = mb->name_table + re->name_count * re->name_entry_size;
+
+/* Limits set in the pattern override the match context only if they are
+smaller. */
+
+mb->match_limit = (mcontext->match_limit < re->limit_match)?
+                  mcontext->match_limit : re->limit_match;
+mb->match_limit_recursion = (mcontext->recursion_limit < re->limit_recursion)?
+                            mcontext->recursion_limit : re->limit_recursion;
+
+/* Pointers to the individual character tables */
+
+mb->lcc = re->tables + lcc_offset;
+mb->fcc = re->tables + fcc_offset;
+mb->ctypes = re->tables + ctypes_offset;
+
+/* Process the \R and newline settings. */
+
+mb->bsr_convention = re->bsr_convention;
+mb->nltype = NLTYPE_FIXED;
+switch(re->newline_convention)
+  {
+  case PCRE2_NEWLINE_CR:
+  mb->nllen = 1;
+  mb->nl[0] = CHAR_CR;
   break;
 
-  case PCRE_BSR_ANYCRLF:
-  md->bsr_anycrlf = TRUE;
+  case PCRE2_NEWLINE_LF:
+  mb->nllen = 1;
+  mb->nl[0] = CHAR_NL;
   break;
 
-  case PCRE_BSR_UNICODE:
-  md->bsr_anycrlf = FALSE;
+  case PCRE2_NEWLINE_CRLF:
+  mb->nllen = 2;
+  mb->nl[0] = CHAR_CR;
+  mb->nl[1] = CHAR_NL;
   break;
 
-  default: return PCRE_ERROR_BADNEWLINE;
+  case PCRE2_NEWLINE_ANY:
+  mb->nltype = NLTYPE_ANY;
+  break;
+
+  case PCRE2_NEWLINE_ANYCRLF:
+  mb->nltype = NLTYPE_ANYCRLF;
+  break;
+
+  default: return PCRE2_ERROR_INTERNAL;
   }
 
-/* Handle different types of newline. The three bits give eight cases. If
-nothing is set at run time, whatever was used at compile time applies. */
+/* If the expression has got more back references than the offsets supplied can
+hold, we get a temporary chunk of memory to use during the matching. Otherwise,
+we can use the vector supplied. The size of the ovector is three times the
+value in the oveccount field. Two-thirds of it is pairs for storing matching
+offsets, and the top third is working space. */
 
-switch ((((options & PCRE_NEWLINE_BITS) == 0)? re->options :
-        (pcre_uint32)options) & PCRE_NEWLINE_BITS)
+if (re->top_backref >= match_data->oveccount)
   {
-  case 0: newline = NEWLINE; break;   /* Compile-time default */
-  case PCRE_NEWLINE_CR: newline = CHAR_CR; break;
-  case PCRE_NEWLINE_LF: newline = CHAR_NL; break;
-  case PCRE_NEWLINE_CR+
-       PCRE_NEWLINE_LF: newline = (CHAR_CR << 8) | CHAR_NL; break;
-  case PCRE_NEWLINE_ANY: newline = -1; break;
-  case PCRE_NEWLINE_ANYCRLF: newline = -2; break;
-  default: return PCRE_ERROR_BADNEWLINE;
-  }
-
-if (newline == -2)
-  {
-  md->nltype = NLTYPE_ANYCRLF;
-  }
-else if (newline < 0)
-  {
-  md->nltype = NLTYPE_ANY;
+  ocount = re->top_backref * 3 + 3;
+  mb->ovector = (PCRE2_SIZE *)(mb->memctl.malloc(ocount * sizeof(PCRE2_SIZE),
+    mb->memctl.memory_data));
+  if (mb->ovector == NULL) return PCRE2_ERROR_NOMEMORY;
+  using_temporary_offsets = TRUE;
   }
 else
   {
-  md->nltype = NLTYPE_FIXED;
-  if (newline > 255)
-    {
-    md->nllen = 2;
-    md->nl[0] = (newline >> 8) & 255;
-    md->nl[1] = newline & 255;
-    }
-  else
-    {
-    md->nllen = 1;
-    md->nl[0] = newline;
-    }
+  ocount = 3 * match_data->oveccount;
+  mb->ovector = match_data->ovector;
   }
 
-/* Partial matching was originally supported only for a restricted set of
-regexes; from release 8.00 there are no restrictions, but the bits are still
-defined (though never set). So there's no harm in leaving this code. */
-
-if (md->partial && (re->flags & PCRE_NOPARTIAL) != 0)
-  return PCRE_ERROR_BADPARTIAL;
-
-/* 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);
-arg_offset_max = (2*ocount)/3;
-
-if (re->top_backref > 0 && re->top_backref >= ocount/3)
-  {
-  ocount = re->top_backref * 3 + 3;
-  md->offset_vector = (int *)(PUBL(malloc))(ocount * sizeof(int));
-  if (md->offset_vector == NULL) return PCRE_ERROR_NOMEMORY;
-  using_temporary_offsets = TRUE;
-  DPRINTF(("Got memory to hold back references\n"));
-  }
-else md->offset_vector = offsets;
-md->offset_end = ocount;
-md->offset_max = (2*ocount)/3;
-md->capture_last = 0;
+mb->offset_end = ocount;
+mb->offset_max = (2*ocount)/3;
 
 /* 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
@@ -6679,56 +6729,52 @@
 offsets for the matched string. This is really just for tidiness with callouts,
 in case they inspect these fields. */
 
-if (md->offset_vector != NULL)
+if (ocount > 0)
   {
-  register int *iptr = md->offset_vector + ocount;
-  register int *iend = iptr - re->top_bracket;
-  if (iend < md->offset_vector + 2) iend = md->offset_vector + 2;
-  while (--iptr >= iend) *iptr = -1;
-  if (offsetcount > 0) md->offset_vector[0] = -1;
-  if (offsetcount > 1) md->offset_vector[1] = -1;
+  register PCRE2_SIZE *iptr = mb->ovector + ocount;
+  register PCRE2_SIZE *iend = iptr - re->top_bracket;
+  if (iend < mb->ovector + 2) iend = mb->ovector + 2;
+  while (--iptr >= iend) *iptr = PCRE2_UNSET;
+  mb->ovector[0] = mb->ovector[1] = PCRE2_UNSET;
   }
 
-/* Set up the first character to match, if available. The first_char 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. */
+/* Set up the first code unit to match, if available. The first_codeunit 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 code unit may
+be unset for an unanchored pattern, of course. If there's no first code unit
+there may be a bitmap of possible first characters. */
 
 if (!anchored)
   {
-  if ((re->flags & PCRE_FIRSTSET) != 0)
+  if ((re->flags & PCRE2_FIRSTSET) != 0)
     {
-    has_first_char = TRUE;
-    first_char = first_char2 = (pcre_uchar)(re->first_char);
-    if ((re->flags & PCRE_FCH_CASELESS) != 0)
+    has_first_cu = TRUE;
+    first_cu = first_cu2 = (PCRE2_UCHAR)(re->first_codeunit);
+    if ((re->flags & PCRE2_FIRSTCASELESS) != 0)
       {
-      first_char2 = TABLE_GET(first_char, md->fcc, first_char);
-#if defined SUPPORT_UCP && !(defined COMPILE_PCRE8)
-      if (utf && first_char > 127)
-        first_char2 = UCD_OTHERCASE(first_char);
+      first_cu2 = TABLE_GET(first_cu, mb->fcc, first_cu);
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 8
+      if (utf && first_cu > 127) first_cu2 = UCD_OTHERCASE(first_cu);
 #endif
       }
     }
   else
-    if (!startline && study != NULL &&
-      (study->flags & PCRE_STUDY_MAPPED) != 0)
-        start_bits = study->start_bits;
+    if (!startline && (re->flags & PCRE2_FIRSTMAPSET) != 0)
+      start_bits = re->start_bitmap;
   }
 
 /* For anchored or unanchored matches, there may be a "last known required
 character" set. */
 
-if ((re->flags & PCRE_REQCHSET) != 0)
+if ((re->flags & PCRE2_LASTSET) != 0)
   {
-  has_req_char = TRUE;
-  req_char = req_char2 = (pcre_uchar)(re->req_char);
-  if ((re->flags & PCRE_RCH_CASELESS) != 0)
+  has_req_cu = TRUE;
+  req_cu = req_cu2 = (PCRE2_UCHAR)(re->last_codeunit);
+  if ((re->flags & PCRE2_LASTCASELESS) != 0)
     {
-    req_char2 = TABLE_GET(req_char, md->fcc, req_char);
-#if defined SUPPORT_UCP && !(defined COMPILE_PCRE8)
-    if (utf && req_char > 127)
-      req_char2 = UCD_OTHERCASE(req_char);
+    req_cu2 = TABLE_GET(req_cu, mb->fcc, req_cu);
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 8
+    if (utf && req_cu > 127) req_cu2 = UCD_OTHERCASE(req_cu);
 #endif
     }
   }
@@ -6741,63 +6787,73 @@
 
 for(;;)
   {
-  PCRE_PUCHAR save_end_subject = end_subject;
-  PCRE_PUCHAR new_start_match;
+  PCRE2_SPTR new_start_match;
+  mb->capture_last = 0;
 
-  /* If firstline is TRUE, the start of the match is constrained to the first
-  line of a multiline string. That is, the match must be before or at the first
-  newline. 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)
-    {
-    PCRE_PUCHAR t = start_match;
-#ifdef SUPPORT_UTF
-    if (utf)
-      {
-      while (t < md->end_subject && !IS_NEWLINE(t))
-        {
-        t++;
-        ACROSSCHAR(t < end_subject, *t, t++);
-        }
-      }
-    else
-#endif
-    while (t < md->end_subject && !IS_NEWLINE(t)) t++;
-    end_subject = t;
-    }
+  /* ----------------- Start of match optimizations ---------------- */
 
   /* There are some optimizations that avoid running the match if a known
-  starting point is not found, or if a known later character is not present.
-  However, there is an option that disables these, for testing and for ensuring
-  that all callouts do actually occur. The option can be set in the regex by
-  (*NO_START_OPT) or passed in match-time options. */
+  starting point is not found, or if a known later code unit is not present.
+  However, there is an option (settable at compile time) that disables these,
+  for testing and for ensuring that all callouts do actually occur. */
 
-  if (((options | re->options) & PCRE_NO_START_OPTIMIZE) == 0)
+  if ((re->overall_options & PCRE2_NO_START_OPTIMIZE) == 0)
     {
-    /* Advance to a unique first char if there is one. */
+    PCRE2_SPTR save_end_subject = end_subject;
 
-    if (has_first_char)
+    /* If firstline is TRUE, the start of the match is constrained to the first
+    line of a multiline string. That is, the match must be before or at the
+    first newline. Implement this by temporarily adjusting end_subject so that
+    we stop the optimization scans at a newline. If the match fails at the
+    newline, later code breaks this loop. */
+
+    if (firstline)
       {
-      pcre_uchar smc;
+      PCRE2_SPTR t = start_match;
+#ifdef SUPPORT_UNICODE
+      if (utf)
+        {
+        while (t < mb->end_subject && !IS_NEWLINE(t))
+          {
+          t++;
+          ACROSSCHAR(t < end_subject, *t, t++);
+          }
+        }
+      else
+#endif
+      while (t < mb->end_subject && !IS_NEWLINE(t)) t++;
+      end_subject = t;
+      }
 
-      if (first_char != first_char2)
+    /* Advance to a unique first code unit if there is one. In 8-bit mode, the
+    use of memchr() gives a big speed up. */
+
+    if (has_first_cu)
+      {
+      PCRE2_UCHAR smc;
+      if (first_cu != first_cu2)
         while (start_match < end_subject &&
-          (smc = UCHAR21TEST(start_match)) != first_char && smc != first_char2)
+          (smc = UCHAR21TEST(start_match)) != first_cu && smc != first_cu2)
           start_match++;
       else
-        while (start_match < end_subject && UCHAR21TEST(start_match) != first_char)
+        {
+#if PCRE2_CODE_UNIT_WIDTH != 8
+        while (start_match < end_subject && UCHAR21TEST(start_match) != first_cu)
           start_match++;
+#else
+        start_match = memchr(start_match, first_cu, end_subject - start_match);
+        if (start_match == NULL) start_match = end_subject;
+#endif
+        }
       }
 
     /* Or to just after a linebreak for a multiline match */
 
     else if (startline)
       {
-      if (start_match > md->start_subject + start_offset)
+      if (start_match > mb->start_subject + start_offset)
         {
-#ifdef SUPPORT_UTF
+#ifdef SUPPORT_UNICODE
         if (utf)
           {
           while (start_match < end_subject && !WAS_NEWLINE(start_match))
@@ -6812,131 +6868,137 @@
         while (start_match < end_subject && !WAS_NEWLINE(start_match))
           start_match++;
 
-        /* If we have just passed a CR and the newline option is ANY or ANYCRLF,
-        and we are now at a LF, advance the match position by one more character.
-        */
+        /* If we have just passed a CR and the newline option is ANY or
+        ANYCRLF, and we are now at a LF, advance the match position by one more
+        code unit. */
 
         if (start_match[-1] == CHAR_CR &&
-             (md->nltype == NLTYPE_ANY || md->nltype == NLTYPE_ANYCRLF) &&
+             (mb->nltype == NLTYPE_ANY || mb->nltype == NLTYPE_ANYCRLF) &&
              start_match < end_subject &&
              UCHAR21TEST(start_match) == CHAR_NL)
           start_match++;
         }
       }
 
-    /* Or to a non-unique first byte after study */
+    /* Or to a non-unique first code unit if any have been identified. The
+    bitmap contains only 256 bits. When code units are 16 or 32 bits wide, all
+    code units greater than 254 set the 255 bit. */
 
     else if (start_bits != NULL)
       {
       while (start_match < end_subject)
         {
-        register pcre_uint32 c = UCHAR21TEST(start_match);
-#ifndef COMPILE_PCRE8
+        register uint32_t c = UCHAR21TEST(start_match);
+#if PCRE2_CODE_UNIT_WIDTH != 8
         if (c > 255) c = 255;
 #endif
         if ((start_bits[c/8] & (1 << (c&7))) != 0) break;
         start_match++;
         }
       }
-    }   /* Starting optimizations */
 
-  /* Restore fudged end_subject */
+    /* Restore fudged end_subject */
 
-  end_subject = save_end_subject;
+    end_subject = save_end_subject;
 
-  /* The following two optimizations are disabled for partial matching or if
-  disabling is explicitly requested. */
+    /* The following two optimizations are disabled for partial matching. */
 
-  if (((options | re->options) & PCRE_NO_START_OPTIMIZE) == 0 && !md->partial)
-    {
-    /* If the pattern was studied, a minimum subject length may be set. This is
-    a lower bound; no actual string of that length may actually match the
-    pattern. Although the value is, strictly, in characters, we treat it as
-    bytes to avoid spending too much time in this optimization. */
-
-    if (study != NULL && (study->flags & PCRE_STUDY_MINLEN) != 0 &&
-        (pcre_uint32)(end_subject - start_match) < study->minlength)
+    if (!mb->partial)
       {
-      rc = MATCH_NOMATCH;
-      break;
-      }
+      /* The minimum matching length is a lower bound; no actual string of that
+      length may actually match the pattern. Although the value is, strictly,
+      in characters, we treat it as code units to avoid spending too much time
+      in this optimization. */
 
-    /* If req_char is set, we know that that character must appear in the
-    subject for the match to succeed. If the first character is set, req_char
-    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 something like /^\d+C/ on a
-    32-megabyte string... so we don't do this when the string is sufficiently
-    long. */
-
-    if (has_req_char && end_subject - start_match < REQ_BYTE_MAX)
-      {
-      register PCRE_PUCHAR p = start_match + (has_first_char? 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_char_ptr)
+      if (end_subject - start_match < re->minlength)
         {
-        if (req_char != req_char2)
+        rc = MATCH_NOMATCH;
+        break;
+        }
+
+      /* If req_cu is set, we know that that code unit must appear in the
+      subject for the match to succeed. If the first code unit is set, req_cu
+      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 something like
+      /^\d+C/ on a 32-megabyte string... so we don't do this when the string is
+      sufficiently long. */
+
+      if (has_req_cu && end_subject - start_match < REQ_CU_MAX)
+        {
+        register PCRE2_SPTR p = start_match + (has_first_cu? 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_cu_ptr)
           {
-          while (p < end_subject)
+          if (req_cu != req_cu2)
             {
-            register pcre_uint32 pp = UCHAR21INCTEST(p);
-            if (pp == req_char || pp == req_char2) { p--; break; }
+            while (p < end_subject)
+              {
+              register uint32_t pp = UCHAR21INCTEST(p);
+              if (pp == req_cu || pp == req_cu2) { p--; break; }
+              }
             }
-          }
-        else
-          {
-          while (p < end_subject)
+          else
             {
-            if (UCHAR21INCTEST(p) == req_char) { p--; break; }
+            while (p < end_subject)
+              {
+              if (UCHAR21INCTEST(p) == req_cu) { p--; break; }
+              }
             }
+
+          /* If we can't find the required code unit, break the matching loop,
+          forcing a match failure. */
+
+          if (p >= end_subject)
+            {
+            rc = MATCH_NOMATCH;
+            break;
+            }
+
+          /* If we have found the required code unit, 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 code unit yet. */
+
+          req_cu_ptr = p;
           }
-
-        /* If we can't find the required character, break the matching loop,
-        forcing a match failure. */
-
-        if (p >= end_subject)
-          {
-          rc = MATCH_NOMATCH;
-          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_char_ptr = p;
         }
       }
     }
 
-#ifdef PCRE_DEBUG  /* Sigh. Some compilers never learn. */
-  printf(">>>> Match against: ");
-  pchars(start_match, end_subject - start_match, TRUE, md);
-  printf("\n");
-#endif
+  /* ------------ End of start of match optimizations ------------ */
+
+  /* Give no match if we have passed the bumpalong limit. */
+
+  if (start_match > bumpalong_limit)
+    {
+    rc = MATCH_NOMATCH;
+    break;
+    }
 
   /* OK, we can now run the match. If "hitend" is set afterwards, remember the
   first starting point for which a partial match was found. */
 
-  md->start_match_ptr = start_match;
-  md->start_used_ptr = start_match;
-  md->match_call_count = 0;
-  md->match_function_type = 0;
-  md->end_offset_top = 0;
-  md->skip_arg_count = 0;
-  rc = match(start_match, md->start_code, start_match, 2, md, NULL, 0);
-  if (md->hitend && start_partial == NULL)
+  mb->start_match_ptr = start_match;
+  mb->start_used_ptr = start_match;
+  mb->last_used_ptr = start_match;
+  mb->match_call_count = 0;
+  mb->match_function_type = 0;
+  mb->end_offset_top = 0;
+  mb->skip_arg_count = 0;
+  rc = match(start_match, mb->start_code, start_match, 2, mb, NULL, 0);
+
+  if (mb->hitend && start_partial == NULL)
     {
-    start_partial = md->start_used_ptr;
+    start_partial = mb->start_used_ptr;
     match_partial = start_match;
     }
 
@@ -6951,16 +7013,16 @@
 
     case MATCH_SKIP_ARG:
     new_start_match = start_match;
-    md->ignore_skip_arg = md->skip_arg_count;
+    mb->ignore_skip_arg = mb->skip_arg_count;
     break;
 
     /* SKIP passes back the next starting point explicitly, but if it is no
     greater than the match we have just done, treat it as NOMATCH. */
 
     case MATCH_SKIP:
-    if (md->start_match_ptr > start_match)
+    if (mb->start_match_ptr > start_match)
       {
-      new_start_match = md->start_match_ptr;
+      new_start_match = mb->start_match_ptr;
       break;
       }
     /* Fall through */
@@ -6971,9 +7033,9 @@
     case MATCH_NOMATCH:
     case MATCH_PRUNE:
     case MATCH_THEN:
-    md->ignore_skip_arg = 0;
+    mb->ignore_skip_arg = 0;
     new_start_match = start_match + 1;
-#ifdef SUPPORT_UTF
+#ifdef SUPPORT_UNICODE
     if (utf)
       ACROSSCHAR(new_start_match < end_subject, *new_start_match,
         new_start_match++);
@@ -6997,7 +7059,7 @@
 
   rc = MATCH_NOMATCH;
 
-  /* If PCRE_FIRSTLINE is set, the match must happen before or at the first
+  /* If PCRE2_FIRSTLINE is set, the match must happen before or at the first
   newline in the subject (though it may continue over the newline). Therefore,
   if we have just failed to match, starting at a newline, do not continue. */
 
@@ -7014,160 +7076,168 @@
 
   /* If we have just passed a CR and we are now at a LF, and the pattern does
   not contain any explicit matches for \r or \n, and the newline option is CRLF
-  or ANY or ANYCRLF, advance the match position by one more character. In
+  or ANY or ANYCRLF, advance the match position by one more code unit. In
   normal matching start_match will aways be greater than the first position at
   this stage, but a failed *SKIP can cause a return at the same point, which is
   why the first test exists. */
 
-  if (start_match > (PCRE_PUCHAR)subject + start_offset &&
+  if (start_match > subject + start_offset &&
       start_match[-1] == CHAR_CR &&
       start_match < end_subject &&
       *start_match == CHAR_NL &&
-      (re->flags & PCRE_HASCRORLF) == 0 &&
-        (md->nltype == NLTYPE_ANY ||
-         md->nltype == NLTYPE_ANYCRLF ||
-         md->nllen == 2))
+      (re->flags & PCRE2_HASCRORLF) == 0 &&
+        (mb->nltype == NLTYPE_ANY ||
+         mb->nltype == NLTYPE_ANYCRLF ||
+         mb->nllen == 2))
     start_match++;
 
-  md->mark = NULL;   /* Reset for start of next match attempt */
+  mb->mark = NULL;   /* Reset for start of next match attempt */
   }                  /* End of for(;;) "bumpalong" loop */
 
 /* ==========================================================================*/
 
-/* We reach here when rc is not MATCH_NOMATCH, or if one of the stopping
-conditions is true:
+/* When we reach here, one of the stopping conditions is true:
 
-(1) The pattern is anchored or the match was failed by (*COMMIT);
+(1) The match succeeded, either completely, or partially;
 
-(2) We are past the end of the subject;
+(2) The pattern is anchored or the match was failed by (*COMMIT);
 
-(3) PCRE_FIRSTLINE is set and we have failed to match at a newline, because
+(3) We are past the end of the subject or the bumpalong limit;
+
+(4) PCRE2_FIRSTLINE is set and we have failed to match at a newline, because
     this option requests that a match occur at or before the first newline in
     the subject.
 
-When we have a match and the offset vector is big enough to deal with any
-backreferences, captured substring offsets will already be set up. In the case
-where we had to get some local store to hold offsets for backreference
-processing, copy those that we can. In this case there need not be overflow if
-certain parts of the pattern were not used, even though there are more
-capturing parentheses than vector slots. */
+(5) Some kind of error occurred.
+
+*/
 
 ENDLOOP:
 
+#ifdef HEAP_MATCH_RECURSE
+release_match_heapframes(&frame_zero, mb);
+#endif
+
+/* Release any frames that were saved from recursions. */
+
+while (mb->ovecsave_chain != NULL)
+  {
+  ovecsave_frame *this = mb->ovecsave_chain;
+  mb->ovecsave_chain = this->next;
+  mb->memctl.free(this, mb->memctl.memory_data);
+  }
+
+/* Fill in fields that are always returned in the match data. */
+
+match_data->code = re;
+match_data->subject = subject;
+match_data->mark = mb->mark;
+match_data->matchedby = PCRE2_MATCHEDBY_INTERPRETER;
+
+/* Handle a fully successful match. */
+
 if (rc == MATCH_MATCH || rc == MATCH_ACCEPT)
   {
+  uint32_t arg_offset_max = 2 * match_data->oveccount;
+
+  /* When the offset vector is big enough to deal with any backreferences,
+  captured substring offsets will already be set up. In the case where we had
+  to get some local memory to hold offsets for backreference processing, copy
+  those that we can. In this case there need not be overflow if certain parts
+  of the pattern were not used, even though there are more capturing
+  parentheses than vector slots. */
+
   if (using_temporary_offsets)
     {
     if (arg_offset_max >= 4)
       {
-      memcpy(offsets + 2, md->offset_vector + 2,
-        (arg_offset_max - 2) * sizeof(int));
-      DPRINTF(("Copied offsets from temporary memory\n"));
+      memcpy(match_data->ovector + 2, mb->ovector + 2,
+        (arg_offset_max - 2) * sizeof(PCRE2_SIZE));
       }
-    if (md->end_offset_top > arg_offset_max) md->capture_last |= OVFLBIT;
-    DPRINTF(("Freeing temporary memory\n"));
-    (PUBL(free))(md->offset_vector);
+    if (mb->end_offset_top > arg_offset_max) mb->capture_last |= OVFLBIT;
+    mb->memctl.free(mb->ovector, mb->memctl.memory_data);
     }
 
   /* Set the return code to the number of captured strings, or 0 if there were
-  too many to fit into the vector. */
+  too many to fit into the ovector. */
 
-  rc = ((md->capture_last & OVFLBIT) != 0 &&
-         md->end_offset_top >= arg_offset_max)?
-    0 : md->end_offset_top/2;
+  match_data->rc = ((mb->capture_last & OVFLBIT) != 0)?
+    0 : mb->end_offset_top/2;
 
-  /* If there is space in the offset vector, set any unused pairs at the end of
-  the pattern to -1 for backwards compatibility. It is documented that this
-  happens. In earlier versions, the whole set of potential capturing offsets
-  was set to -1 each time round the loop, but this is handled differently now.
-  "Gaps" are set to -1 dynamically instead (this fixes a bug). Thus, it is only
-  those at the end that need unsetting here. We can't just unset them all at
-  the start of the whole thing because they may get set in one branch that is
-  not the final matching branch. */
+  /* If there is space in the offset vector, set any pairs that follow the
+  highest-numbered captured string but are less than the number of capturing
+  groups in the pattern (and are within the ovector) to PCRE2_UNSET. It is
+  documented that this happens. In earlier versions, the whole set of potential
+  capturing offsets was initialized each time round the loop, but this is
+  handled differently now. "Gaps" are set to PCRE2_UNSET dynamically instead
+  (this fixed a bug). Thus, it is only those at the end that need setting here.
+  We can't just mark them all unset at the start of the whole thing because
+  they may get set in one branch that is not the final matching branch. */
 
-  if (md->end_offset_top/2 <= re->top_bracket && offsets != NULL)
+  if (mb->end_offset_top/2 <= re->top_bracket)
     {
-    register int *iptr, *iend;
-    int resetcount = 2 + re->top_bracket * 2;
-    if (resetcount > offsetcount) resetcount = offsetcount;
-    iptr = offsets + md->end_offset_top;
-    iend = offsets + resetcount;
-    while (iptr < iend) *iptr++ = -1;
+    register PCRE2_SIZE *iptr, *iend;
+    int resetcount = re->top_bracket + 1;
+    if (resetcount > match_data->oveccount) resetcount = match_data->oveccount;
+    iptr = match_data->ovector + mb->end_offset_top;
+    iend = match_data->ovector + 2 * resetcount;
+    while (iptr < iend) *iptr++ = PCRE2_UNSET;
     }
 
   /* If there is space, set up the whole thing as substring 0. The value of
-  md->start_match_ptr might be modified if \K was encountered on the success
+  mb->start_match_ptr might be modified if \K was encountered on the success
   matching path. */
 
-  if (offsetcount < 2) rc = 0; else
+  if (match_data->oveccount < 1) rc = 0; else
     {
-    offsets[0] = (int)(md->start_match_ptr - md->start_subject);
-    offsets[1] = (int)(md->end_match_ptr - md->start_subject);
+    match_data->ovector[0] = mb->start_match_ptr - mb->start_subject;
+    match_data->ovector[1] = mb->end_match_ptr - mb->start_subject;
     }
 
-  /* Return MARK data if requested */
+  /* Set the remaining returned values */
 
-  if (extra_data != NULL && (extra_data->flags & PCRE_EXTRA_MARK) != 0)
-    *(extra_data->mark) = (pcre_uchar *)md->mark;
-  DPRINTF((">>>> returning %d\n", rc));
-#ifdef NO_RECURSE
-  release_match_heapframes(&frame_zero);
-#endif
-  return rc;
+  match_data->startchar = start_match - subject;
+  match_data->leftchar = mb->start_used_ptr - subject;
+  match_data->rightchar = ((mb->last_used_ptr > mb->end_match_ptr)?
+    mb->last_used_ptr : mb->end_match_ptr) - subject;
+  return match_data->rc;
   }
 
-/* Control gets here if there has been an error, or if the overall match
-attempt has failed at all permitted starting positions. */
+/* Control gets here if there has been a partial match, an error, or if the
+overall match attempt has failed at all permitted starting positions. Any mark
+data is in the nomatch_mark field. */
 
-if (using_temporary_offsets)
-  {
-  DPRINTF(("Freeing temporary memory\n"));
-  (PUBL(free))(md->offset_vector);
-  }
+match_data->mark = mb->nomatch_mark;
 
 /* For anything other than nomatch or partial match, just return the code. */
 
-if (rc != MATCH_NOMATCH && rc != PCRE_ERROR_PARTIAL)
-  {
-  DPRINTF((">>>> error: returning %d\n", rc));
-#ifdef NO_RECURSE
-  release_match_heapframes(&frame_zero);
-#endif
-  return rc;
-  }
+if (rc != MATCH_NOMATCH && rc != PCRE2_ERROR_PARTIAL)
+  match_data->rc = rc;
 
-/* Handle partial matches - disable any mark data */
+/* Else handle a partial match. */
 
-if (match_partial != NULL)
+else if (match_partial != NULL)
   {
-  DPRINTF((">>>> returning PCRE_ERROR_PARTIAL\n"));
-  md->mark = NULL;
-  if (offsetcount > 1)
+  if (match_data->oveccount > 0)
     {
-    offsets[0] = (int)(start_partial - (PCRE_PUCHAR)subject);
-    offsets[1] = (int)(end_subject - (PCRE_PUCHAR)subject);
-    if (offsetcount > 2)
-      offsets[2] = (int)(match_partial - (PCRE_PUCHAR)subject);
+    match_data->ovector[0] = match_partial - subject;
+    match_data->ovector[1] = end_subject - subject;
     }
-  rc = PCRE_ERROR_PARTIAL;
+  match_data->startchar = match_partial - subject;
+  match_data->leftchar = start_partial - subject;
+  match_data->rightchar = end_subject - subject;
+  match_data->rc = PCRE2_ERROR_PARTIAL;
   }
 
-/* This is the classic nomatch case */
+/* Else this is the classic nomatch case. */
 
-else
-  {
-  DPRINTF((">>>> returning PCRE_ERROR_NOMATCH\n"));
-  rc = PCRE_ERROR_NOMATCH;
-  }
+else match_data->rc = PCRE2_ERROR_NOMATCH;
 
-/* Return the MARK data if it has been requested. */
+/* Free any temporary offsets. */
 
-if (extra_data != NULL && (extra_data->flags & PCRE_EXTRA_MARK) != 0)
-  *(extra_data->mark) = (pcre_uchar *)md->nomatch_mark;
-#ifdef NO_RECURSE
-  release_match_heapframes(&frame_zero);
-#endif
-return rc;
+if (using_temporary_offsets)
+  mb->memctl.free(mb->ovector, mb->memctl.memory_data);
+return match_data->rc;
 }
 
-/* End of pcre_exec.c */
+/* End of pcre2_match.c */
diff --git a/dist2/src/pcre2_match_data.c b/dist2/src/pcre2_match_data.c
new file mode 100644
index 0000000..85ac998
--- /dev/null
+++ b/dist2/src/pcre2_match_data.c
@@ -0,0 +1,147 @@
+/*************************************************
+*      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
+     Original API code Copyright (c) 1997-2012 University of Cambridge
+         New API code Copyright (c) 2016 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.
+-----------------------------------------------------------------------------
+*/
+
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "pcre2_internal.h"
+
+
+
+/*************************************************
+*  Create a match data block given ovector size  *
+*************************************************/
+
+/* A minimum of 1 is imposed on the number of ovector triplets. */
+
+PCRE2_EXP_DEFN pcre2_match_data * PCRE2_CALL_CONVENTION
+pcre2_match_data_create(uint32_t oveccount, pcre2_general_context *gcontext)
+{
+pcre2_match_data *yield;
+if (oveccount < 1) oveccount = 1;
+yield = PRIV(memctl_malloc)(
+  sizeof(pcre2_match_data) + 3*oveccount*sizeof(PCRE2_SIZE),
+  (pcre2_memctl *)gcontext);
+if (yield == NULL) return NULL;
+yield->oveccount = oveccount;
+return yield;
+}
+
+
+
+/*************************************************
+*  Create a match data block using pattern data  *
+*************************************************/
+
+/* If no context is supplied, use the memory allocator from the code. */
+
+PCRE2_EXP_DEFN pcre2_match_data * PCRE2_CALL_CONVENTION
+pcre2_match_data_create_from_pattern(const pcre2_code *code,
+  pcre2_general_context *gcontext)
+{
+if (gcontext == NULL) gcontext = (pcre2_general_context *)code;
+return pcre2_match_data_create(((pcre2_real_code *)code)->top_bracket + 1,
+  gcontext);
+}
+
+
+
+/*************************************************
+*            Free a match data block             *
+*************************************************/
+
+PCRE2_EXP_DEFN void PCRE2_CALL_CONVENTION
+pcre2_match_data_free(pcre2_match_data *match_data)
+{
+if (match_data != NULL)
+  match_data->memctl.free(match_data, match_data->memctl.memory_data);
+}
+
+
+
+/*************************************************
+*         Get last mark in match                 *
+*************************************************/
+
+PCRE2_EXP_DEFN PCRE2_SPTR PCRE2_CALL_CONVENTION
+pcre2_get_mark(pcre2_match_data *match_data)
+{
+return match_data->mark;
+}
+
+
+
+/*************************************************
+*          Get pointer to ovector                *
+*************************************************/
+
+PCRE2_EXP_DEFN PCRE2_SIZE * PCRE2_CALL_CONVENTION
+pcre2_get_ovector_pointer(pcre2_match_data *match_data)
+{
+return match_data->ovector;
+}
+
+
+
+/*************************************************
+*          Get number of ovector slots           *
+*************************************************/
+
+PCRE2_EXP_DEFN uint32_t PCRE2_CALL_CONVENTION
+pcre2_get_ovector_count(pcre2_match_data *match_data)
+{
+return match_data->oveccount;
+}
+
+
+
+/*************************************************
+*         Get starting code unit in match        *
+*************************************************/
+
+PCRE2_EXP_DEFN PCRE2_SIZE PCRE2_CALL_CONVENTION
+pcre2_get_startchar(pcre2_match_data *match_data)
+{
+return match_data->startchar;
+}
+
+/* End of pcre2_match_data.c */
diff --git a/dist/pcre_newline.c b/dist2/src/pcre2_newline.c
similarity index 64%
rename from dist/pcre_newline.c
rename to dist2/src/pcre2_newline.c
index b8f5a4d..6e9366d 100644
--- a/dist/pcre_newline.c
+++ b/dist2/src/pcre2_newline.c
@@ -6,7 +6,8 @@
 and semantics are as close as possible to those of the Perl 5 language.
 
                        Written by Philip Hazel
-           Copyright (c) 1997-2012 University of Cambridge
+     Original API code Copyright (c) 1997-2012 University of Cambridge
+         New API code Copyright (c) 2016 University of Cambridge
 
 -----------------------------------------------------------------------------
 Redistribution and use in source and binary forms, with or without
@@ -41,7 +42,7 @@
 /* This module contains internal functions for testing newlines when more than
 one kind of newline is to be recognized. When a newline is found, its length is
 returned. In principle, we could implement several newline "types", each
-referring to a different set of newline characters. At present, PCRE supports
+referring to a different set of newline characters. At present, PCRE2 supports
 only NLTYPE_FIXED, which gets handled without these functions, NLTYPE_ANYCRLF,
 and NLTYPE_ANY. The full list of Unicode newline characters is taken from
 http://unicode.org/unicode/reports/tr18/. */
@@ -51,7 +52,7 @@
 #include "config.h"
 #endif
 
-#include "pcre_internal.h"
+#include "pcre2_internal.h"
 
 
 
@@ -59,8 +60,10 @@
 *      Check for newline at given position       *
 *************************************************/
 
-/* It is guaranteed that the initial value of ptr is less than the end of the
-string that is being processed.
+/* This function is called only via the IS_NEWLINE macro, which does so only
+when the newline type is NLTYPE_ANY or NLTYPE_ANYCRLF. The case of a fixed
+newline (NLTYPE_FIXED) is handled inline. It is guaranteed that the code unit
+pointed to by ptr is less than the end of the string.
 
 Arguments:
   ptr          pointer to possible newline
@@ -73,28 +76,30 @@
 */
 
 BOOL
-PRIV(is_newline)(PCRE_PUCHAR ptr, int type, PCRE_PUCHAR endptr, int *lenptr,
-  BOOL utf)
+PRIV(is_newline)(PCRE2_SPTR ptr, uint32_t type, PCRE2_SPTR endptr,
+  uint32_t *lenptr, BOOL utf)
 {
-pcre_uint32 c;
-(void)utf;
-#ifdef SUPPORT_UTF
-if (utf)
-  {
-  GETCHAR(c, ptr);
-  }
-else
-#endif  /* SUPPORT_UTF */
-  c = *ptr;
+uint32_t c;
 
-/* Note that this function is called only for ANY or ANYCRLF. */
+#ifdef SUPPORT_UNICODE
+if (utf) { GETCHAR(c, ptr); } else c = *ptr;
+#else
+(void)utf;
+c = *ptr;
+#endif  /* SUPPORT_UNICODE */
 
 if (type == NLTYPE_ANYCRLF) switch(c)
   {
-  case CHAR_LF: *lenptr = 1; return TRUE;
-  case CHAR_CR: *lenptr = (ptr < endptr - 1 && ptr[1] == CHAR_LF)? 2 : 1;
-               return TRUE;
-  default: return FALSE;
+  case CHAR_LF:
+  *lenptr = 1;
+  return TRUE;
+
+  case CHAR_CR:
+  *lenptr = (ptr < endptr - 1 && ptr[1] == CHAR_LF)? 2 : 1;
+  return TRUE;
+
+  default:
+  return FALSE;
   }
 
 /* NLTYPE_ANY */
@@ -106,25 +111,36 @@
 #endif
   case CHAR_LF:
   case CHAR_VT:
-  case CHAR_FF: *lenptr = 1; return TRUE;
+  case CHAR_FF:
+  *lenptr = 1;
+  return TRUE;
 
   case CHAR_CR:
   *lenptr = (ptr < endptr - 1 && ptr[1] == CHAR_LF)? 2 : 1;
   return TRUE;
 
 #ifndef EBCDIC
-#ifdef COMPILE_PCRE8
-  case CHAR_NEL: *lenptr = utf? 2 : 1; return TRUE;
-  case 0x2028:                                       /* LS */
-  case 0x2029: *lenptr = 3; return TRUE;             /* PS */
-#else /* COMPILE_PCRE16 || COMPILE_PCRE32 */
+#if PCRE2_CODE_UNIT_WIDTH == 8
   case CHAR_NEL:
-  case 0x2028:                                       /* LS */
-  case 0x2029: *lenptr = 1; return TRUE;             /* PS */
-#endif  /* COMPILE_PCRE8 */
-#endif  /* Not EBCDIC */
+  *lenptr = utf? 2 : 1;
+  return TRUE;
 
-  default: return FALSE;
+  case 0x2028:   /* LS */
+  case 0x2029:   /* PS */
+  *lenptr = 3;
+  return TRUE;
+
+#else  /* 16-bit or 32-bit code units */
+  case CHAR_NEL:
+  case 0x2028:   /* LS */
+  case 0x2029:   /* PS */
+  *lenptr = 1;
+  return TRUE;
+#endif
+#endif /* Not EBCDIC */
+
+  default:
+  return FALSE;
   }
 }
 
@@ -134,8 +150,10 @@
 *     Check for newline at previous position     *
 *************************************************/
 
-/* It is guaranteed that the initial value of ptr is greater than the start of
-the string that is being processed.
+/* This function is called only via the WAS_NEWLINE macro, which does so only
+when the newline type is NLTYPE_ANY or NLTYPE_ANYCRLF. The case of a fixed
+newline (NLTYPE_FIXED) is handled inline. It is guaranteed that the initial
+value of ptr is greater than the start of the string that is being processed.
 
 Arguments:
   ptr          pointer to possible newline
@@ -148,23 +166,23 @@
 */
 
 BOOL
-PRIV(was_newline)(PCRE_PUCHAR ptr, int type, PCRE_PUCHAR startptr, int *lenptr,
-  BOOL utf)
+PRIV(was_newline)(PCRE2_SPTR ptr, uint32_t type, PCRE2_SPTR startptr,
+  uint32_t *lenptr, BOOL utf)
 {
-pcre_uint32 c;
-(void)utf;
+uint32_t c;
 ptr--;
-#ifdef SUPPORT_UTF
+
+#ifdef SUPPORT_UNICODE
 if (utf)
   {
   BACKCHAR(ptr);
   GETCHAR(c, ptr);
   }
-else
-#endif  /* SUPPORT_UTF */
-  c = *ptr;
-
-/* Note that this function is called only for ANY or ANYCRLF. */
+else c = *ptr;
+#else
+(void)utf;
+c = *ptr;
+#endif  /* SUPPORT_UNICODE */
 
 if (type == NLTYPE_ANYCRLF) switch(c)
   {
@@ -172,8 +190,12 @@
   *lenptr = (ptr > startptr && ptr[-1] == CHAR_CR)? 2 : 1;
   return TRUE;
 
-  case CHAR_CR: *lenptr = 1; return TRUE;
-  default: return FALSE;
+  case CHAR_CR:
+  *lenptr = 1;
+  return TRUE;
+
+  default:
+  return FALSE;
   }
 
 /* NLTYPE_ANY */
@@ -189,22 +211,33 @@
 #endif
   case CHAR_VT:
   case CHAR_FF:
-  case CHAR_CR: *lenptr = 1; return TRUE;
+  case CHAR_CR:
+  *lenptr = 1;
+  return TRUE;
 
 #ifndef EBCDIC
-#ifdef COMPILE_PCRE8
-  case CHAR_NEL: *lenptr = utf? 2 : 1; return TRUE;
-  case 0x2028:                                       /* LS */
-  case 0x2029: *lenptr = 3; return TRUE;             /* PS */
-#else /* COMPILE_PCRE16 || COMPILE_PCRE32 */
+#if PCRE2_CODE_UNIT_WIDTH == 8
   case CHAR_NEL:
-  case 0x2028:                                       /* LS */
-  case 0x2029: *lenptr = 1; return TRUE;             /* PS */
-#endif  /* COMPILE_PCRE8 */
-#endif  /* NotEBCDIC */
+  *lenptr = utf? 2 : 1;
+  return TRUE;
 
-  default: return FALSE;
+  case 0x2028:   /* LS */
+  case 0x2029:   /* PS */
+  *lenptr = 3;
+  return TRUE;
+
+#else /* 16-bit or 32-bit code units */
+  case CHAR_NEL:
+  case 0x2028:   /* LS */
+  case 0x2029:   /* PS */
+  *lenptr = 1;
+  return TRUE;
+#endif
+#endif /* Not EBCDIC */
+
+  default:
+  return FALSE;
   }
 }
 
-/* End of pcre_newline.c */
+/* End of pcre2_newline.c */
diff --git a/dist/pcre_ord2utf8.c b/dist2/src/pcre2_ord2utf.c
similarity index 65%
rename from dist/pcre_ord2utf8.c
rename to dist2/src/pcre2_ord2utf.c
index 95f1beb..75252b7 100644
--- a/dist/pcre_ord2utf8.c
+++ b/dist2/src/pcre2_ord2utf.c
@@ -6,7 +6,8 @@
 and semantics are as close as possible to those of the Perl 5 language.
 
                        Written by Philip Hazel
-           Copyright (c) 1997-2012 University of Cambridge
+     Original API code Copyright (c) 1997-2012 University of Cambridge
+         New API code Copyright (c) 2016 University of Cambridge
 
 -----------------------------------------------------------------------------
 Redistribution and use in source and binary forms, with or without
@@ -38,39 +39,51 @@
 */
 
 
-/* This file contains a private PCRE function that converts an ordinal
-character value into a UTF8 string. */
+/* This file contains a function that converts a Unicode character code point
+into a UTF string. The behaviour is different for each code unit width. */
+
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
 #endif
 
-#define COMPILE_PCRE8
+#include "pcre2_internal.h"
 
-#include "pcre_internal.h"
+
+/* If SUPPORT_UNICODE is not defined, this function will never be called.
+Supply a dummy function because some compilers do not like empty source
+modules. */
+
+#ifndef SUPPORT_UNICODE
+unsigned int
+PRIV(ord2utf)(uint32_t cvalue, PCRE2_UCHAR *buffer)
+{
+(void)(cvalue);
+(void)(buffer);
+return 0;
+}
+#else  /* SUPPORT_UNICODE */
+
 
 /*************************************************
-*       Convert character value to UTF-8         *
+*          Convert code point to UTF             *
 *************************************************/
 
-/* This function takes an integer value in the range 0 - 0x10ffff
-and encodes it as a UTF-8 character in 1 to 4 pcre_uchars.
-
+/*
 Arguments:
   cvalue     the character value
-  buffer     pointer to buffer for result - at least 6 pcre_uchars long
+  buffer     pointer to buffer for result
 
-Returns:     number of characters placed in the buffer
+Returns:     number of code units placed in the buffer
 */
 
-unsigned
-int
-PRIV(ord2utf)(pcre_uint32 cvalue, pcre_uchar *buffer)
+unsigned int
+PRIV(ord2utf)(uint32_t cvalue, PCRE2_UCHAR *buffer)
 {
-#ifdef SUPPORT_UTF
+/* Convert to UTF-8 */
 
+#if PCRE2_CODE_UNIT_WIDTH == 8
 register int i, j;
-
 for (i = 0; i < PRIV(utf8_table1_size); i++)
   if ((int)cvalue <= PRIV(utf8_table1)[i]) break;
 buffer += i;
@@ -82,13 +95,26 @@
 *buffer = PRIV(utf8_table2)[i] | cvalue;
 return i + 1;
 
+/* Convert to UTF-16 */
+
+#elif PCRE2_CODE_UNIT_WIDTH == 16
+if (cvalue <= 0xffff)
+  {
+  *buffer = (PCRE2_UCHAR)cvalue;
+  return 1;
+  }
+cvalue -= 0x10000;
+*buffer++ = 0xd800 | (cvalue >> 10);
+*buffer = 0xdc00 | (cvalue & 0x3ff);
+return 2;
+
+/* Convert to UTF-32 */
+
 #else
-
-(void)(cvalue);  /* Keep compiler happy; this function won't ever be */
-(void)(buffer);  /* called when SUPPORT_UTF is not defined. */
-return 0;
-
+*buffer = (PCRE2_UCHAR)cvalue;
+return 1;
 #endif
 }
+#endif  /* SUPPORT_UNICODE */
 
-/* End of pcre_ord2utf8.c */
+/* End of pcre_ord2utf.c */
diff --git a/dist2/src/pcre2_pattern_info.c b/dist2/src/pcre2_pattern_info.c
new file mode 100644
index 0000000..5b32a90
--- /dev/null
+++ b/dist2/src/pcre2_pattern_info.c
@@ -0,0 +1,410 @@
+/*************************************************
+*      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
+     Original API code Copyright (c) 1997-2012 University of Cambridge
+         New API code Copyright (c) 2016 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.
+-----------------------------------------------------------------------------
+*/
+
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "pcre2_internal.h"
+
+
+/*************************************************
+*        Return info about compiled pattern      *
+*************************************************/
+
+/*
+Arguments:
+  code          points to compiled code
+  what          what information is required
+  where         where to put the information; if NULL, return length
+
+Returns:        0 when data returned
+                > 0 when length requested
+                < 0 on error or unset value
+*/
+
+PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION
+pcre2_pattern_info(const pcre2_code *code, uint32_t what, void *where)
+{
+const pcre2_real_code *re = (pcre2_real_code *)code;
+
+if (where == NULL)   /* Requests field length */
+  {
+  switch(what)
+    {
+    case PCRE2_INFO_ALLOPTIONS:
+    case PCRE2_INFO_ARGOPTIONS:
+    case PCRE2_INFO_BACKREFMAX:
+    case PCRE2_INFO_BSR:
+    case PCRE2_INFO_CAPTURECOUNT:
+    case PCRE2_INFO_FIRSTCODETYPE:
+    case PCRE2_INFO_FIRSTCODEUNIT:
+    case PCRE2_INFO_HASBACKSLASHC:
+    case PCRE2_INFO_HASCRORLF:
+    case PCRE2_INFO_JCHANGED:
+    case PCRE2_INFO_LASTCODETYPE:
+    case PCRE2_INFO_LASTCODEUNIT:
+    case PCRE2_INFO_MATCHEMPTY:
+    case PCRE2_INFO_MATCHLIMIT:
+    case PCRE2_INFO_MAXLOOKBEHIND:
+    case PCRE2_INFO_MINLENGTH:
+    case PCRE2_INFO_NAMEENTRYSIZE:
+    case PCRE2_INFO_NAMECOUNT:
+    case PCRE2_INFO_NEWLINE:
+    case PCRE2_INFO_RECURSIONLIMIT:
+    return sizeof(uint32_t);
+
+    case PCRE2_INFO_FIRSTBITMAP:
+    return sizeof(const uint8_t *);
+
+    case PCRE2_INFO_JITSIZE:
+    case PCRE2_INFO_SIZE:
+    return sizeof(size_t);
+
+    case PCRE2_INFO_NAMETABLE:
+    return sizeof(PCRE2_SPTR);
+    }
+  }
+
+if (re == NULL) return PCRE2_ERROR_NULL;
+
+/* Check that the first field in the block is the magic number. If it is not,
+return with PCRE2_ERROR_BADMAGIC. */
+
+if (re->magic_number != MAGIC_NUMBER) return PCRE2_ERROR_BADMAGIC;
+
+/* Check that this pattern was compiled in the correct bit mode */
+
+if ((re->flags & (PCRE2_CODE_UNIT_WIDTH/8)) == 0) return PCRE2_ERROR_BADMODE;
+
+switch(what)
+  {
+  case PCRE2_INFO_ALLOPTIONS:
+  *((uint32_t *)where) = re->overall_options;
+  break;
+
+  case PCRE2_INFO_ARGOPTIONS:
+  *((uint32_t *)where) = re->compile_options;
+  break;
+
+  case PCRE2_INFO_BACKREFMAX:
+  *((uint32_t *)where) = re->top_backref;
+  break;
+
+  case PCRE2_INFO_BSR:
+  *((uint32_t *)where) = re->bsr_convention;
+  break;
+
+  case PCRE2_INFO_CAPTURECOUNT:
+  *((uint32_t *)where) = re->top_bracket;
+  break;
+
+  case PCRE2_INFO_FIRSTCODETYPE:
+  *((uint32_t *)where) = ((re->flags & PCRE2_FIRSTSET) != 0)? 1 :
+                         ((re->flags & PCRE2_STARTLINE) != 0)? 2 : 0;
+  break;
+
+  case PCRE2_INFO_FIRSTCODEUNIT:
+  *((uint32_t *)where) = ((re->flags & PCRE2_FIRSTSET) != 0)?
+    re->first_codeunit : 0;
+  break;
+
+  case PCRE2_INFO_FIRSTBITMAP:
+  *((const uint8_t **)where) = ((re->flags & PCRE2_FIRSTMAPSET) != 0)?
+    &(re->start_bitmap[0]) : NULL;
+  break;
+
+  case PCRE2_INFO_HASBACKSLASHC:
+  *((uint32_t *)where) = (re->flags & PCRE2_HASBKC) != 0;
+  break;
+
+  case PCRE2_INFO_HASCRORLF:
+  *((uint32_t *)where) = (re->flags & PCRE2_HASCRORLF) != 0;
+  break;
+
+  case PCRE2_INFO_JCHANGED:
+  *((uint32_t *)where) = (re->flags & PCRE2_JCHANGED) != 0;
+  break;
+
+  case PCRE2_INFO_JITSIZE:
+#ifdef SUPPORT_JIT
+  *((size_t *)where) = (re->executable_jit != NULL)?
+    PRIV(jit_get_size)(re->executable_jit) : 0;
+#else
+  *((size_t *)where) = 0;
+#endif
+  break;
+
+  case PCRE2_INFO_LASTCODETYPE:
+  *((uint32_t *)where) = ((re->flags & PCRE2_LASTSET) != 0)? 1 : 0;
+  break;
+
+  case PCRE2_INFO_LASTCODEUNIT:
+  *((uint32_t *)where) = ((re->flags & PCRE2_LASTSET) != 0)?
+    re->last_codeunit : 0;
+  break;
+
+  case PCRE2_INFO_MATCHEMPTY:
+  *((uint32_t *)where) = (re->flags & PCRE2_MATCH_EMPTY) != 0;
+  break;
+
+  case PCRE2_INFO_MATCHLIMIT:
+  *((uint32_t *)where) = re->limit_match;
+  if (re->limit_match == UINT32_MAX) return PCRE2_ERROR_UNSET;
+  break;
+
+  case PCRE2_INFO_MAXLOOKBEHIND:
+  *((uint32_t *)where) = re->max_lookbehind;
+  break;
+
+  case PCRE2_INFO_MINLENGTH:
+  *((uint32_t *)where) = re->minlength;
+  break;
+
+  case PCRE2_INFO_NAMEENTRYSIZE:
+  *((uint32_t *)where) = re->name_entry_size;
+  break;
+
+  case PCRE2_INFO_NAMECOUNT:
+  *((uint32_t *)where) = re->name_count;
+  break;
+
+  case PCRE2_INFO_NAMETABLE:
+  *((PCRE2_SPTR *)where) = (PCRE2_SPTR)((char *)re + sizeof(pcre2_real_code));
+  break;
+
+  case PCRE2_INFO_NEWLINE:
+  *((uint32_t *)where) = re->newline_convention;
+  break;
+
+  case PCRE2_INFO_RECURSIONLIMIT:
+  *((uint32_t *)where) = re->limit_recursion;
+  if (re->limit_recursion == UINT32_MAX) return PCRE2_ERROR_UNSET;
+  break;
+
+  case PCRE2_INFO_SIZE:
+  *((size_t *)where) = re->blocksize;
+  break;
+
+  default: return PCRE2_ERROR_BADOPTION;
+  }
+
+return 0;
+}
+
+
+
+/*************************************************
+*              Callout enumerator                *
+*************************************************/
+
+/*
+Arguments:
+  code          points to compiled code
+  callback      function called for each callout block
+  callout_data  user data passed to the callback
+
+Returns:        0 when successfully completed
+                < 0 on local error
+               != 0 for callback error
+*/
+
+PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION
+pcre2_callout_enumerate(const pcre2_code *code,
+  int (*callback)(pcre2_callout_enumerate_block *, void *), void *callout_data)
+{
+pcre2_real_code *re = (pcre2_real_code *)code;
+pcre2_callout_enumerate_block cb;
+PCRE2_SPTR cc;
+#ifdef SUPPORT_UNICODE
+BOOL utf = (re->overall_options & PCRE2_UTF) != 0;
+#endif
+
+if (re == NULL) return PCRE2_ERROR_NULL;
+
+/* Check that the first field in the block is the magic number. If it is not,
+return with PCRE2_ERROR_BADMAGIC. */
+
+if (re->magic_number != MAGIC_NUMBER) return PCRE2_ERROR_BADMAGIC;
+
+/* Check that this pattern was compiled in the correct bit mode */
+
+if ((re->flags & (PCRE2_CODE_UNIT_WIDTH/8)) == 0) return PCRE2_ERROR_BADMODE;
+
+cb.version = 0;
+cc = (PCRE2_SPTR)((uint8_t *)re + sizeof(pcre2_real_code))
+     + re->name_count * re->name_entry_size;
+
+while (TRUE)
+  {
+  int rc;
+  switch (*cc)
+    {
+    case OP_END:
+    return 0;
+
+    case OP_CHAR:
+    case OP_CHARI:
+    case OP_NOT:
+    case OP_NOTI:
+    case OP_STAR:
+    case OP_MINSTAR:
+    case OP_PLUS:
+    case OP_MINPLUS:
+    case OP_QUERY:
+    case OP_MINQUERY:
+    case OP_UPTO:
+    case OP_MINUPTO:
+    case OP_EXACT:
+    case OP_POSSTAR:
+    case OP_POSPLUS:
+    case OP_POSQUERY:
+    case OP_POSUPTO:
+    case OP_STARI:
+    case OP_MINSTARI:
+    case OP_PLUSI:
+    case OP_MINPLUSI:
+    case OP_QUERYI:
+    case OP_MINQUERYI:
+    case OP_UPTOI:
+    case OP_MINUPTOI:
+    case OP_EXACTI:
+    case OP_POSSTARI:
+    case OP_POSPLUSI:
+    case OP_POSQUERYI:
+    case OP_POSUPTOI:
+    case OP_NOTSTAR:
+    case OP_NOTMINSTAR:
+    case OP_NOTPLUS:
+    case OP_NOTMINPLUS:
+    case OP_NOTQUERY:
+    case OP_NOTMINQUERY:
+    case OP_NOTUPTO:
+    case OP_NOTMINUPTO:
+    case OP_NOTEXACT:
+    case OP_NOTPOSSTAR:
+    case OP_NOTPOSPLUS:
+    case OP_NOTPOSQUERY:
+    case OP_NOTPOSUPTO:
+    case OP_NOTSTARI:
+    case OP_NOTMINSTARI:
+    case OP_NOTPLUSI:
+    case OP_NOTMINPLUSI:
+    case OP_NOTQUERYI:
+    case OP_NOTMINQUERYI:
+    case OP_NOTUPTOI:
+    case OP_NOTMINUPTOI:
+    case OP_NOTEXACTI:
+    case OP_NOTPOSSTARI:
+    case OP_NOTPOSPLUSI:
+    case OP_NOTPOSQUERYI:
+    case OP_NOTPOSUPTOI:
+    cc += PRIV(OP_lengths)[*cc];
+#ifdef SUPPORT_UNICODE
+    if (utf && HAS_EXTRALEN(cc[-1])) cc += GET_EXTRALEN(cc[-1]);
+#endif
+    break;
+
+    case OP_TYPESTAR:
+    case OP_TYPEMINSTAR:
+    case OP_TYPEPLUS:
+    case OP_TYPEMINPLUS:
+    case OP_TYPEQUERY:
+    case OP_TYPEMINQUERY:
+    case OP_TYPEUPTO:
+    case OP_TYPEMINUPTO:
+    case OP_TYPEEXACT:
+    case OP_TYPEPOSSTAR:
+    case OP_TYPEPOSPLUS:
+    case OP_TYPEPOSQUERY:
+    case OP_TYPEPOSUPTO:
+    cc += PRIV(OP_lengths)[*cc];
+#ifdef SUPPORT_UNICODE
+    if (cc[-1] == OP_PROP || cc[-1] == OP_NOTPROP) cc += 2;
+#endif
+    break;
+
+#if defined SUPPORT_UNICODE || PCRE2_CODE_UNIT_WIDTH != 8
+    case OP_XCLASS:
+    cc += GET(cc, 1);
+    break;
+#endif
+
+    case OP_MARK:
+    case OP_PRUNE_ARG:
+    case OP_SKIP_ARG:
+    case OP_THEN_ARG:
+    cc += PRIV(OP_lengths)[*cc] + cc[1];
+    break;
+
+    case OP_CALLOUT:
+    cb.pattern_position = GET(cc, 1);
+    cb.next_item_length = GET(cc, 1 + LINK_SIZE);
+    cb.callout_number = cc[1 + 2*LINK_SIZE];
+    cb.callout_string_offset = 0;
+    cb.callout_string_length = 0;
+    cb.callout_string = NULL;
+    rc = callback(&cb, callout_data);
+    if (rc != 0) return rc;
+    cc += PRIV(OP_lengths)[*cc];
+    break;
+
+    case OP_CALLOUT_STR:
+    cb.pattern_position = GET(cc, 1);
+    cb.next_item_length = GET(cc, 1 + LINK_SIZE);
+    cb.callout_number = 0;
+    cb.callout_string_offset = GET(cc, 1 + 3*LINK_SIZE);
+    cb.callout_string_length =
+      GET(cc, 1 + 2*LINK_SIZE) - (1 + 4*LINK_SIZE) - 2;
+    cb.callout_string = cc + (1 + 4*LINK_SIZE) + 1;
+    rc = callback(&cb, callout_data);
+    if (rc != 0) return rc;
+    cc += GET(cc, 1 + 2*LINK_SIZE);
+    break;
+
+    default:
+    cc += PRIV(OP_lengths)[*cc];
+    break;
+    }
+  }
+}
+
+/* End of pcre2_pattern_info.c */
diff --git a/dist/pcre_printint.c b/dist2/src/pcre2_printint.c
similarity index 64%
rename from dist/pcre_printint.c
rename to dist2/src/pcre2_printint.c
index 60dcb55..40a633c 100644
--- a/dist/pcre_printint.c
+++ b/dist2/src/pcre2_printint.c
@@ -6,7 +6,8 @@
 and semantics are as close as possible to those of the Perl 5 language.
 
                        Written by Philip Hazel
-           Copyright (c) 1997-2012 University of Cambridge
+     Original API code Copyright (c) 1997-2012 University of Cambridge
+         New API code Copyright (c) 2016 University of Cambridge
 
 -----------------------------------------------------------------------------
 Redistribution and use in source and binary forms, with or without
@@ -40,104 +41,102 @@
 
 /* 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:
+local functions. This source file is #included in pcre2test.c at each supported
+code unit width, with PCRE2_SUFFIX set appropriately, just like the functions
+that comprise the library. It can also optionally be included in
+pcre2_compile.c for detailed debugging in error situations. */
 
-(1) It is #included by pcre_compile.c when it is compiled in debugging mode
-(PCRE_DEBUG defined in pcre_internal.h). It is not included in production
-compiles. In this case PCRE_INCLUDED is defined.
 
-(2) It is also compiled separately and linked with pcretest.c, which can be
-asked to print out a compiled regex for debugging purposes. */
+/* Tables of operator names. The same 8-bit table is used for all code unit
+widths, so it must be defined only once. The list itself is defined in
+pcre2_internal.h, which is #included by pcre2test before this file. */
 
-#ifndef PCRE_INCLUDED
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
+#ifndef OP_LISTS_DEFINED
+static const char *OP_names[] = { OP_NAME_LIST };
+#define OP_LISTS_DEFINED
 #endif
 
-/* For pcretest program. */
-#define PRIV(name) name
+/* The functions and tables herein must all have mode-dependent names. */
 
-/* We have to 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.
+#define OP_lengths            PCRE2_SUFFIX(OP_lengths_)
+#define get_ucpname           PCRE2_SUFFIX(get_ucpname_)
+#define pcre2_printint        PCRE2_SUFFIX(pcre2_printint_)
+#define print_char            PCRE2_SUFFIX(print_char_)
+#define print_custring        PCRE2_SUFFIX(print_custring_)
+#define print_custring_bylen  PCRE2_SUFFIX(print_custring_bylen_)
+#define print_prop            PCRE2_SUFFIX(print_prop_)
 
-Although pcre_internal.h does itself include pcre.h, we explicitly include it
-here before pcre_internal.h so that the PCRE_EXP_xxx macros get set
-appropriately for an application, not for building PCRE. */
+/* 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 pcre2_internal.h.
+The contents of the table are, however, mode-dependent. */
 
-#include "pcre.h"
-#include "pcre_internal.h"
-
-/* These are the funtions that are contained within. It doesn't seem worth
-having a separate .h file just for this. */
-
-#endif /* PCRE_INCLUDED */
-
-#ifdef PCRE_INCLUDED
-static /* Keep the following function as private. */
-#endif
-
-#if defined COMPILE_PCRE8
-void pcre_printint(pcre *external_re, FILE *f, BOOL print_lengths);
-#elif defined COMPILE_PCRE16
-void pcre16_printint(pcre *external_re, FILE *f, BOOL print_lengths);
-#elif defined COMPILE_PCRE32
-void pcre32_printint(pcre *external_re, FILE *f, BOOL print_lengths);
-#endif
-
-/* Macro that decides whether a character should be output as a literal or in
-hexadecimal. We don't use isprint() because that can vary from system to system
-(even without the use of locales) and we want the output always to be the same,
-for testing purposes. */
-
-#ifdef EBCDIC
-#define PRINTABLE(c) ((c) >= 64 && (c) < 255)
-#else
-#define PRINTABLE(c) ((c) >= 32 && (c) < 127)
-#endif
-
-/* The table of operator names. */
-
-static const char *priv_OP_names[] = { OP_NAME_LIST };
-
-/* This table of operator lengths is not actually used by the working code,
-but its size is needed for a check that ensures it is the correct size for the
-number of opcodes (thus catching update omissions). */
-
-static const pcre_uint8 priv_OP_lengths[] = { OP_LENGTHS };
+static const uint8_t OP_lengths[] = { OP_LENGTHS };
 
 
 
 /*************************************************
-*       Print single- or multi-byte character    *
+*       Print one character from a string        *
 *************************************************/
 
+/* In UTF mode the character may occupy more than one code unit.
+
+Arguments:
+  f           file to write to
+  ptr         pointer to first code unit of the character
+  utf         TRUE if string is UTF (will be FALSE if UTF is not supported)
+
+Returns:      number of additional code units used
+*/
+
 static unsigned int
-print_char(FILE *f, pcre_uchar *ptr, BOOL utf)
+print_char(FILE *f, PCRE2_SPTR ptr, BOOL utf)
 {
-pcre_uint32 c = *ptr;
+uint32_t c = *ptr;
+BOOL one_code_unit = !utf;
 
-#ifndef SUPPORT_UTF
+/* If UTF is supported and requested, check for a valid single code unit. */
 
-(void)utf;  /* Avoid compiler warning */
-if (PRINTABLE(c)) fprintf(f, "%c", (char)c);
-else if (c <= 0x80) fprintf(f, "\\x%02x", c);
-else fprintf(f, "\\x{%x}", c);
-return 0;
-
+#ifdef SUPPORT_UNICODE
+if (utf)
+  {
+#if PCRE2_CODE_UNIT_WIDTH == 8
+  one_code_unit = c < 0x80;
+#elif PCRE2_CODE_UNIT_WIDTH == 16
+  one_code_unit = (c & 0xfc00) != 0xd800;
 #else
+  one_code_unit = (c & 0xfffff800u) != 0xd800u;
+#endif  /* CODE_UNIT_WIDTH */
+  }
+#endif  /* SUPPORT_UNICODE */
 
-#if defined COMPILE_PCRE8
+/* Handle a valid one-code-unit character at any width. */
 
-if (!utf || (c & 0xc0) != 0xc0)
+if (one_code_unit)
   {
   if (PRINTABLE(c)) fprintf(f, "%c", (char)c);
   else if (c < 0x80) fprintf(f, "\\x%02x", c);
   else fprintf(f, "\\x{%02x}", c);
   return 0;
   }
+
+/* Code for invalid UTF code units and multi-unit UTF characters is different
+for each width. If UTF is not supported, control should never get here, but we
+need a return statement to keep the compiler happy. */
+
+#ifndef SUPPORT_UNICODE
+return 0;
+#else
+
+/* Malformed UTF-8 should occur only 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 PCRE2_CODE_UNIT_WIDTH == 8
+if ((c & 0xc0) != 0xc0)
+  {
+  fprintf(f, "\\X{%x}", c);       /* Invalid starting byte */
+  return 0;
+  }
 else
   {
   int i;
@@ -146,198 +145,181 @@
   c = (c & PRIV(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);
+      fprintf(f, "\\X{%x}", c);   /* Invalid secondary byte */
       return i - 1;
       }
-
-    /* The byte is OK */
-
     s -= 6;
     c |= (ptr[i] & 0x3f) << s;
     }
   fprintf(f, "\\x{%x}", c);
   return a;
-  }
+}
+#endif  /* PCRE2_CODE_UNIT_WIDTH == 8 */
 
-#elif defined COMPILE_PCRE16
+/* UTF-16: rather than swallow a low surrogate, just stop if we hit a bad one.
+Print it with \X instead of \x as an indication. */
 
-if (!utf || (c & 0xfc00) != 0xd800)
+#if PCRE2_CODE_UNIT_WIDTH == 16
+if ((ptr[1] & 0xfc00) != 0xdc00)
   {
-  if (PRINTABLE(c)) fprintf(f, "%c", (char)c);
-  else if (c <= 0x80) fprintf(f, "\\x%02x", c);
-  else fprintf(f, "\\x{%02x}", c);
-  return 0;
-  }
-else
-  {
-  /* This is a check for malformed UTF-16; it should only occur if the sanity
-  check has been turned off. Rather than swallow a low surrogate, just stop if
-  we hit a bad one. Print it with \X instead of \x as an indication. */
-
-  if ((ptr[1] & 0xfc00) != 0xdc00)
-    {
-    fprintf(f, "\\X{%x}", c);
-    return 0;
-    }
-
-  c = (((c & 0x3ff) << 10) | (ptr[1] & 0x3ff)) + 0x10000;
-  fprintf(f, "\\x{%x}", c);
-  return 1;
-  }
-
-#elif defined COMPILE_PCRE32
-
-if (!utf || (c & 0xfffff800u) != 0xd800u)
-  {
-  if (PRINTABLE(c)) fprintf(f, "%c", (char)c);
-  else if (c <= 0x80) fprintf(f, "\\x%02x", c);
-  else fprintf(f, "\\x{%x}", c);
-  return 0;
-  }
-else
-  {
-  /* This is a check for malformed UTF-32; it should only occur if the sanity
-  check has been turned off. Rather than swallow a surrogate, just stop if
-  we hit one. Print it with \X instead of \x as an indication. */
   fprintf(f, "\\X{%x}", c);
   return 0;
   }
+c = (((c & 0x3ff) << 10) | (ptr[1] & 0x3ff)) + 0x10000;
+fprintf(f, "\\x{%x}", c);
+return 1;
+#endif  /* PCRE2_CODE_UNIT_WIDTH == 16 */
 
-#endif /* COMPILE_PCRE[8|16|32] */
+/* For UTF-32 we get here only for a malformed code unit, which should only
+occur if the sanity check has been turned off. Print it with \X instead of \x
+as an indication. */
 
-#endif /* SUPPORT_UTF */
+#if PCRE2_CODE_UNIT_WIDTH == 32
+fprintf(f, "\\X{%x}", c);
+return 0;
+#endif  /* PCRE2_CODE_UNIT_WIDTH == 32 */
+#endif  /* SUPPORT_UNICODE */
 }
 
+
+
 /*************************************************
-*  Print uchar string (regardless of utf)        *
+*     Print string as a list of code units       *
 *************************************************/
 
+/* These take no account of UTF as they always print each individual code unit.
+The string is zero-terminated for print_custring(); the length is given for
+print_custring_bylen().
+
+Arguments:
+  f          file to write to
+  ptr        point to the string
+  len        length for print_custring_bylen()
+
+Returns:     nothing
+*/
+
 static void
-print_puchar(FILE *f, PCRE_PUCHAR ptr)
+print_custring(FILE *f, PCRE2_SPTR ptr)
 {
 while (*ptr != '\0')
   {
-  register pcre_uint32 c = *ptr++;
+  register uint32_t c = *ptr++;
   if (PRINTABLE(c)) fprintf(f, "%c", c); else fprintf(f, "\\x{%x}", c);
   }
 }
 
+static void
+print_custring_bylen(FILE *f, PCRE2_SPTR ptr, PCRE2_UCHAR len)
+{
+while (len-- > 0)
+  {
+  register uint32_t c = *ptr++;
+  if (PRINTABLE(c)) fprintf(f, "%c", c); else fprintf(f, "\\x{%x}", c);
+  }
+}
+
+
+
 /*************************************************
 *          Find Unicode property name            *
 *************************************************/
 
+/* When there is no UTF/UCP support, the table of names does not exist. This
+function should not be called in such configurations, because a pattern that
+tries to use Unicode properties won't compile. Rather than put lots of #ifdefs
+into the main code, however, we just put one into this function. */
+
 static const char *
 get_ucpname(unsigned int ptype, unsigned int pvalue)
 {
-#ifdef SUPPORT_UCP
+#ifdef SUPPORT_UNICODE
 int i;
 for (i = PRIV(utt_size) - 1; i >= 0; i--)
   {
   if (ptype == PRIV(utt)[i].type && pvalue == PRIV(utt)[i].value) break;
   }
 return (i >= 0)? PRIV(utt_names) + PRIV(utt)[i].name_offset : "??";
-#else
-/* It gets harder and harder to shut off unwanted compiler warnings. */
-ptype = ptype * pvalue;
-return (ptype == pvalue)? "??" : "??";
-#endif
+#else   /* No UTF support */
+(void)ptype;
+(void)pvalue;
+return "??";
+#endif  /* SUPPORT_UNICODE */
 }
 
 
+
 /*************************************************
 *       Print Unicode property value             *
 *************************************************/
 
 /* "Normal" properties can be printed from tables. The PT_CLIST property is a
 pseudo-property that contains a pointer to a list of case-equivalent
-characters. This is used only when UCP support is available and UTF mode is
-selected. It should never occur otherwise, but just in case it does, have
-something ready to print. */
+characters.
+
+Arguments:
+  f            file to write to
+  code         pointer in the compiled code
+  before       text to print before
+  after        text to print after
+
+Returns:       nothing
+*/
 
 static void
-print_prop(FILE *f, pcre_uchar *code, const char *before, const char *after)
+print_prop(FILE *f, PCRE2_SPTR code, const char *before, const char *after)
 {
 if (code[1] != PT_CLIST)
   {
-  fprintf(f, "%s%s %s%s", before, priv_OP_names[*code], get_ucpname(code[1],
+  fprintf(f, "%s%s %s%s", before, OP_names[*code], get_ucpname(code[1],
     code[2]), after);
   }
 else
   {
   const char *not = (*code == OP_PROP)? "" : "not ";
-#ifndef SUPPORT_UCP
-  fprintf(f, "%s%sclist %d%s", before, not, code[2], after);
-#else
-  const pcre_uint32 *p = PRIV(ucd_caseless_sets) + code[2];
+  const uint32_t *p = PRIV(ucd_caseless_sets) + code[2];
   fprintf (f, "%s%sclist", before, not);
   while (*p < NOTACHAR) fprintf(f, " %04x", *p++);
   fprintf(f, "%s", after);
-#endif
   }
 }
 
 
 
-
 /*************************************************
-*         Print compiled regex                   *
+*            Print compiled pattern              *
 *************************************************/
 
-/* Make this function work for a regex with integers either byte order.
-However, we assume that what we are passed is a compiled regex. The
-print_lengths flag controls whether offsets and lengths of items are printed.
-They can be turned off from pcretest so that automatic tests on bytecode can be
-written that do not depend on the value of LINK_SIZE. */
+/* The print_lengths flag controls whether offsets and lengths of items are
+printed. Lenths can be turned off from pcre2test so that automatic tests on
+bytecode can be written that do not depend on the value of LINK_SIZE.
 
-#ifdef PCRE_INCLUDED
-static /* Keep the following function as private. */
-#endif
-#if defined COMPILE_PCRE8
-void
-pcre_printint(pcre *external_re, FILE *f, BOOL print_lengths)
-#elif defined COMPILE_PCRE16
-void
-pcre16_printint(pcre *external_re, FILE *f, BOOL print_lengths)
-#elif defined COMPILE_PCRE32
-void
-pcre32_printint(pcre *external_re, FILE *f, BOOL print_lengths)
-#endif
+Arguments:
+  re              a compiled pattern
+  f               the file to write to
+  print_lengths   show various lengths
+
+Returns:          nothing
+*/
+
+static void
+pcre2_printint(pcre2_code *re, FILE *f, BOOL print_lengths)
 {
-REAL_PCRE *re = (REAL_PCRE *)external_re;
-pcre_uchar *codestart, *code;
-BOOL utf;
+PCRE2_SPTR codestart, nametable, code;
+uint32_t nesize = re->name_entry_size;
+BOOL utf = (re->overall_options & PCRE2_UTF) != 0;
 
-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 = (pcre_uchar *)re + offset + count * size;
-/* PCRE_UTF(16|32) have the same value as PCRE_UTF8. */
-utf = (options & PCRE_UTF8) != 0;
+nametable = (PCRE2_SPTR)((uint8_t *)re + sizeof(pcre2_real_code));
+code = codestart = nametable + re->name_count * re->name_entry_size;
 
 for(;;)
   {
-  pcre_uchar *ccode;
+  PCRE2_SPTR ccode;
+  uint32_t c;
+  int i;
   const char *flag = "  ";
-  pcre_uint32 c;
   unsigned int extra = 0;
 
   if (print_lengths)
@@ -356,13 +338,13 @@
 
       case OP_TABLE_LENGTH:
       case OP_TABLE_LENGTH +
-        ((sizeof(priv_OP_names)/sizeof(const char *) == OP_TABLE_LENGTH) &&
-        (sizeof(priv_OP_lengths) == OP_TABLE_LENGTH)):
+        ((sizeof(OP_names)/sizeof(const char *) == OP_TABLE_LENGTH) &&
+        (sizeof(OP_lengths) == OP_TABLE_LENGTH)):
       break;
 /* ========================================================================== */
 
     case OP_END:
-    fprintf(f, "    %s\n", priv_OP_names[*code]);
+    fprintf(f, "    %s\n", OP_names[*code]);
     fprintf(f, "------------------------------------------------------------------\n");
     return;
 
@@ -394,7 +376,7 @@
     case OP_SCBRAPOS:
     if (print_lengths) fprintf(f, "%3d ", GET(code, 1));
       else fprintf(f, "    ");
-    fprintf(f, "%s %d", priv_OP_names[*code], GET2(code, 1+LINK_SIZE));
+    fprintf(f, "%s %d", OP_names[*code], GET2(code, 1+LINK_SIZE));
     break;
 
     case OP_BRA:
@@ -417,23 +399,22 @@
     case OP_REVERSE:
     if (print_lengths) fprintf(f, "%3d ", GET(code, 1));
       else fprintf(f, "    ");
-    fprintf(f, "%s", priv_OP_names[*code]);
+    fprintf(f, "%s", OP_names[*code]);
     break;
 
     case OP_CLOSE:
-    fprintf(f, "    %s %d", priv_OP_names[*code], GET2(code, 1));
+    fprintf(f, "    %s %d", OP_names[*code], GET2(code, 1));
     break;
 
     case OP_CREF:
-    fprintf(f, "%3d %s", GET2(code,1), priv_OP_names[*code]);
+    fprintf(f, "%3d %s", GET2(code,1), OP_names[*code]);
     break;
 
     case OP_DNCREF:
       {
-      pcre_uchar *entry = (pcre_uchar *)re + offset + (GET2(code, 1) * size) +
-        IMM2_SIZE;
+      PCRE2_SPTR entry = nametable + (GET2(code, 1) * nesize) + IMM2_SIZE;
       fprintf(f, " %s Cond ref <", flag);
-      print_puchar(f, entry);
+      print_custring(f, entry);
       fprintf(f, ">%d", GET2(code, 1 + IMM2_SIZE));
       }
     break;
@@ -448,16 +429,19 @@
 
     case OP_DNRREF:
       {
-      pcre_uchar *entry = (pcre_uchar *)re + offset + (GET2(code, 1) * size) +
-        IMM2_SIZE;
+      PCRE2_SPTR entry = nametable + (GET2(code, 1) * nesize) + IMM2_SIZE;
       fprintf(f, " %s Cond recurse <", flag);
-      print_puchar(f, entry);
+      print_custring(f, entry);
       fprintf(f, ">%d", GET2(code, 1 + IMM2_SIZE));
       }
     break;
 
-    case OP_DEF:
-    fprintf(f, "    Cond def");
+    case OP_FALSE:
+    fprintf(f, "    Cond false");
+    break;
+
+    case OP_TRUE:
+    fprintf(f, "    Cond true");
     break;
 
     case OP_STARI:
@@ -490,6 +474,7 @@
     case OP_TYPEMINQUERY:
     case OP_TYPEPOSQUERY:
     fprintf(f, " %s ", flag);
+
     if (*code >= OP_TYPESTAR)
       {
       if (code[1] == OP_PROP || code[1] == OP_NOTPROP)
@@ -497,10 +482,10 @@
         print_prop(f, code + 1, "", " ");
         extra = 2;
         }
-      else fprintf(f, "%s", priv_OP_names[code[1]]);
+      else fprintf(f, "%s", OP_names[code[1]]);
       }
     else extra = print_char(f, code+1, utf);
-    fprintf(f, "%s", priv_OP_names[*code]);
+    fprintf(f, "%s", OP_names[*code]);
     break;
 
     case OP_EXACTI:
@@ -531,7 +516,7 @@
       print_prop(f, code + IMM2_SIZE + 1, "    ", " ");
       extra = 2;
       }
-    else fprintf(f, "    %s", priv_OP_names[code[1 + IMM2_SIZE]]);
+    else fprintf(f, "    %s", OP_names[code[1 + IMM2_SIZE]]);
     fprintf(f, "{");
     if (*code != OP_TYPEEXACT) fprintf(f, "0,");
     fprintf(f, "%d}", GET2(code,1));
@@ -571,7 +556,7 @@
     case OP_NOTPOSQUERY:
     fprintf(f, " %s [^", flag);
     extra = print_char(f, code + 1, utf);
-    fprintf(f, "]%s", priv_OP_names[*code]);
+    fprintf(f, "]%s", OP_names[*code]);
     break;
 
     case OP_NOTEXACTI:
@@ -598,7 +583,7 @@
     case OP_RECURSE:
     if (print_lengths) fprintf(f, "%3d ", GET(code, 1));
       else fprintf(f, "    ");
-    fprintf(f, "%s", priv_OP_names[*code]);
+    fprintf(f, "%s", OP_names[*code]);
     break;
 
     case OP_REFI:
@@ -606,7 +591,7 @@
     /* Fall through */
     case OP_REF:
     fprintf(f, " %s \\%d", flag, GET2(code,1));
-    ccode = code + priv_OP_lengths[*code];
+    ccode = code + OP_lengths[*code];
     goto CLASS_REF_REPEAT;
 
     case OP_DNREFI:
@@ -614,18 +599,32 @@
     /* Fall through */
     case OP_DNREF:
       {
-      pcre_uchar *entry = (pcre_uchar *)re + offset + (GET2(code, 1) * size) +
-        IMM2_SIZE;
+      PCRE2_SPTR entry = nametable + (GET2(code, 1) * nesize) + IMM2_SIZE;
       fprintf(f, " %s \\k<", flag);
-      print_puchar(f, entry);
+      print_custring(f, entry);
       fprintf(f, ">%d", GET2(code, 1 + IMM2_SIZE));
       }
-    ccode = code + priv_OP_lengths[*code];
+    ccode = code + OP_lengths[*code];
     goto CLASS_REF_REPEAT;
 
     case OP_CALLOUT:
-    fprintf(f, "    %s %d %d %d", priv_OP_names[*code], code[1], GET(code,2),
-      GET(code, 2 + LINK_SIZE));
+    fprintf(f, "    %s %d %d %d", OP_names[*code], code[1 + 2*LINK_SIZE],
+      GET(code, 1), GET(code, 1 + LINK_SIZE));
+    break;
+
+    case OP_CALLOUT_STR:
+    c = code[1 + 4*LINK_SIZE];
+    fprintf(f, "    %s %c", OP_names[*code], c);
+    extra = GET(code, 1 + 2*LINK_SIZE);
+    print_custring_bylen(f, code + 2 + 4*LINK_SIZE, extra - 3 - 4*LINK_SIZE);
+    for (i = 0; PRIV(callout_start_delims)[i] != 0; i++)
+      if (c == PRIV(callout_start_delims)[i])
+        {
+        c = PRIV(callout_end_delims)[i];
+        break;
+        }
+    fprintf(f, "%c %d %d %d", c, GET(code, 1 + 3*LINK_SIZE), GET(code, 1),
+      GET(code, 1 + LINK_SIZE));
     break;
 
     case OP_PROP:
@@ -641,12 +640,11 @@
     case OP_NCLASS:
     case OP_XCLASS:
       {
-      int i;
       unsigned int min, max;
       BOOL printmap;
       BOOL invertmap = FALSE;
-      pcre_uint8 *map;
-      pcre_uint8 inverted_map[32];
+      uint8_t *map;
+      uint8_t inverted_map[32];
 
       fprintf(f, "    [");
 
@@ -672,7 +670,7 @@
 
       if (printmap)
         {
-        map = (pcre_uint8 *)ccode;
+        map = (uint8_t *)ccode;
         if (invertmap)
           {
           for (i = 0; i < 32; i++) inverted_map[i] = ~map[i];
@@ -699,14 +697,14 @@
             i = j;
             }
           }
-        ccode += 32 / sizeof(pcre_uchar);
+        ccode += 32 / sizeof(PCRE2_UCHAR);
         }
 
       /* For an XCLASS there is always some additional data */
 
       if (*code == OP_XCLASS)
         {
-        pcre_uchar ch;
+        PCRE2_UCHAR ch;
         while ((ch = *ccode++) != XCL_END)
           {
           BOOL not = FALSE;
@@ -776,8 +774,8 @@
         case OP_CRPOSSTAR:
         case OP_CRPOSPLUS:
         case OP_CRPOSQUERY:
-        fprintf(f, "%s", priv_OP_names[*ccode]);
-        extra += priv_OP_lengths[*ccode];
+        fprintf(f, "%s", OP_names[*ccode]);
+        extra += OP_lengths[*ccode];
         break;
 
         case OP_CRRANGE:
@@ -789,7 +787,7 @@
         else fprintf(f, "{%u,%u}", min, max);
         if (*ccode == OP_CRMINRANGE) fprintf(f, "?");
         else if (*ccode == OP_CRPOSRANGE) fprintf(f, "+");
-        extra += priv_OP_lengths[*ccode];
+        extra += OP_lengths[*ccode];
         break;
 
         /* Do nothing if it's not a repeat; this code stops picky compilers
@@ -805,13 +803,13 @@
     case OP_PRUNE_ARG:
     case OP_SKIP_ARG:
     case OP_THEN_ARG:
-    fprintf(f, "    %s ", priv_OP_names[*code]);
-    print_puchar(f, code + 2);
+    fprintf(f, "    %s ", OP_names[*code]);
+    print_custring_bylen(f, code + 2, code[1]);
     extra += code[1];
     break;
 
     case OP_THEN:
-    fprintf(f, "    %s", priv_OP_names[*code]);
+    fprintf(f, "    %s", OP_names[*code]);
     break;
 
     case OP_CIRCM:
@@ -822,13 +820,13 @@
     /* Anything else is just an item with no data, but possibly a flag. */
 
     default:
-    fprintf(f, " %s %s", flag, priv_OP_names[*code]);
+    fprintf(f, " %s %s", flag, OP_names[*code]);
     break;
     }
 
-  code += priv_OP_lengths[*code] + extra;
+  code += OP_lengths[*code] + extra;
   fprintf(f, "\n");
   }
 }
 
-/* End of pcre_printint.src */
+/* End of pcre2_printint.c */
diff --git a/dist2/src/pcre2_serialize.c b/dist2/src/pcre2_serialize.c
new file mode 100644
index 0000000..8c44acf
--- /dev/null
+++ b/dist2/src/pcre2_serialize.c
@@ -0,0 +1,258 @@
+/*************************************************
+*      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
+     Original API code Copyright (c) 1997-2012 University of Cambridge
+         New API code Copyright (c) 2016 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 functions for serializing and deserializing
+a sequence of compiled codes. */
+
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+
+#include "pcre2_internal.h"
+
+/* Magic number to provide a small check against being handed junk. */
+
+#define SERIALIZED_DATA_MAGIC 0x50523253u
+
+/* Deserialization is limited to the current PCRE version and
+character width. */
+
+#define SERIALIZED_DATA_VERSION \
+  ((PCRE2_MAJOR) | ((PCRE2_MINOR) << 16))
+
+#define SERIALIZED_DATA_CONFIG \
+  (sizeof(PCRE2_UCHAR) | ((sizeof(void*)) << 8) | ((sizeof(PCRE2_SIZE)) << 16))
+
+
+
+/*************************************************
+*           Serialize compiled patterns          *
+*************************************************/
+
+PCRE2_EXP_DEFN int32_t PCRE2_CALL_CONVENTION
+pcre2_serialize_encode(const pcre2_code **codes, int32_t number_of_codes,
+   uint8_t **serialized_bytes, PCRE2_SIZE *serialized_size,
+   pcre2_general_context *gcontext)
+{
+uint8_t *bytes;
+uint8_t *dst_bytes;
+int32_t i;
+PCRE2_SIZE total_size;
+const pcre2_real_code *re;
+const uint8_t *tables;
+pcre2_serialized_data *data;
+
+const pcre2_memctl *memctl = (gcontext != NULL) ?
+  &gcontext->memctl : &PRIV(default_compile_context).memctl;
+
+if (codes == NULL || serialized_bytes == NULL || serialized_size == NULL)
+  return PCRE2_ERROR_NULL;
+
+if (number_of_codes <= 0) return PCRE2_ERROR_BADDATA;
+
+/* Compute total size. */
+total_size = sizeof(pcre2_serialized_data) + tables_length;
+tables = NULL;
+
+for (i = 0; i < number_of_codes; i++)
+  {
+  if (codes[i] == NULL) return PCRE2_ERROR_NULL;
+  re = (const pcre2_real_code *)(codes[i]);
+  if (re->magic_number != MAGIC_NUMBER) return PCRE2_ERROR_BADMAGIC;
+  if (tables == NULL)
+    tables = re->tables;
+  else if (tables != re->tables)
+    return PCRE2_ERROR_MIXEDTABLES;
+  total_size += re->blocksize;
+  }
+
+/* Initialize the byte stream. */
+bytes = memctl->malloc(total_size + sizeof(pcre2_memctl), memctl->memory_data);
+if (bytes == NULL) return PCRE2_ERROR_NOMEMORY;
+
+/* The controller is stored as a hidden parameter. */
+memcpy(bytes, memctl, sizeof(pcre2_memctl));
+bytes += sizeof(pcre2_memctl);
+
+data = (pcre2_serialized_data *)bytes;
+data->magic = SERIALIZED_DATA_MAGIC;
+data->version = SERIALIZED_DATA_VERSION;
+data->config = SERIALIZED_DATA_CONFIG;
+data->number_of_codes = number_of_codes;
+
+/* Copy all compiled code data. */
+dst_bytes = bytes + sizeof(pcre2_serialized_data);
+memcpy(dst_bytes, tables, tables_length);
+dst_bytes += tables_length;
+
+for (i = 0; i < number_of_codes; i++)
+  {
+  re = (const pcre2_real_code *)(codes[i]);
+  memcpy(dst_bytes, (char *)re, re->blocksize);
+  dst_bytes += re->blocksize;
+  }
+
+*serialized_bytes = bytes;
+*serialized_size = total_size;
+return number_of_codes;
+}
+
+
+/*************************************************
+*          Deserialize compiled patterns         *
+*************************************************/
+
+PCRE2_EXP_DEFN int32_t PCRE2_CALL_CONVENTION
+pcre2_serialize_decode(pcre2_code **codes, int32_t number_of_codes,
+   const uint8_t *bytes, pcre2_general_context *gcontext)
+{
+const pcre2_serialized_data *data = (const pcre2_serialized_data *)bytes;
+const pcre2_memctl *memctl = (gcontext != NULL) ?
+  &gcontext->memctl : &PRIV(default_compile_context).memctl;
+
+const uint8_t *src_bytes;
+pcre2_real_code *dst_re;
+uint8_t *tables;
+int32_t i, j;
+
+/* Sanity checks. */
+
+if (data == NULL || codes == NULL) return PCRE2_ERROR_NULL;
+if (number_of_codes <= 0) return PCRE2_ERROR_BADDATA;
+if (data->magic != SERIALIZED_DATA_MAGIC) return PCRE2_ERROR_BADMAGIC;
+if (data->version != SERIALIZED_DATA_VERSION) return PCRE2_ERROR_BADMODE;
+if (data->config != SERIALIZED_DATA_CONFIG) return PCRE2_ERROR_BADMODE;
+
+if (number_of_codes > data->number_of_codes)
+  number_of_codes = data->number_of_codes;
+
+src_bytes = bytes + sizeof(pcre2_serialized_data);
+
+/* Decode tables. The reference count for the tables is stored immediately
+following them. */
+
+tables = memctl->malloc(tables_length + sizeof(PCRE2_SIZE), memctl->memory_data);
+if (tables == NULL) return PCRE2_ERROR_NOMEMORY;
+
+memcpy(tables, src_bytes, tables_length);
+*(PCRE2_SIZE *)(tables + tables_length) = number_of_codes;
+src_bytes += tables_length;
+
+/* Decode the byte stream. We must not try to read the size from the compiled
+code block in the stream, because it might be unaligned, which causes errors on
+hardware such as Sparc-64 that doesn't like unaligned memory accesses. The type
+of the blocksize field is given its own name to ensure that it is the same here
+as in the block. */
+
+for (i = 0; i < number_of_codes; i++)
+  {
+  CODE_BLOCKSIZE_TYPE blocksize;
+  memcpy(&blocksize, src_bytes + offsetof(pcre2_real_code, blocksize),
+    sizeof(CODE_BLOCKSIZE_TYPE));
+
+  /* The allocator provided by gcontext replaces the original one. */
+
+  dst_re = (pcre2_real_code *)PRIV(memctl_malloc)(blocksize,
+    (pcre2_memctl *)gcontext);
+  if (dst_re == NULL)
+    {
+    memctl->free(tables, memctl->memory_data);
+    for (j = 0; j < i; j++)
+      {
+      memctl->free(codes[j], memctl->memory_data);
+      codes[j] = NULL;
+      }
+    return PCRE2_ERROR_NOMEMORY;
+    }
+
+  /* The new allocator must be preserved. */
+
+  memcpy(((uint8_t *)dst_re) + sizeof(pcre2_memctl),
+    src_bytes + sizeof(pcre2_memctl), blocksize - sizeof(pcre2_memctl));
+
+  /* At the moment only one table is supported. */
+
+  dst_re->tables = tables;
+  dst_re->executable_jit = NULL;
+  dst_re->flags |= PCRE2_DEREF_TABLES;
+
+  codes[i] = dst_re;
+  src_bytes += blocksize;
+  }
+
+return number_of_codes;
+}
+
+
+/*************************************************
+*    Get the number of serialized patterns       *
+*************************************************/
+
+PCRE2_EXP_DEFN int32_t PCRE2_CALL_CONVENTION
+pcre2_serialize_get_number_of_codes(const uint8_t *bytes)
+{
+const pcre2_serialized_data *data = (const pcre2_serialized_data *)bytes;
+
+if (data == NULL) return PCRE2_ERROR_NULL;
+if (data->magic != SERIALIZED_DATA_MAGIC) return PCRE2_ERROR_BADMAGIC;
+if (data->version != SERIALIZED_DATA_VERSION) return PCRE2_ERROR_BADMODE;
+if (data->config != SERIALIZED_DATA_CONFIG) return PCRE2_ERROR_BADMODE;
+
+return data->number_of_codes;
+}
+
+
+/*************************************************
+*            Free the allocated stream           *
+*************************************************/
+
+PCRE2_EXP_DEFN void PCRE2_CALL_CONVENTION
+pcre2_serialize_free(uint8_t *bytes)
+{
+if (bytes != NULL)
+  {
+  pcre2_memctl *memctl = (pcre2_memctl *)(bytes - sizeof(pcre2_memctl));
+  memctl->free(memctl, memctl->memory_data);
+  }
+}
+
+/* End of pcre2_serialize.c */
diff --git a/dist2/src/pcre2_string_utils.c b/dist2/src/pcre2_string_utils.c
new file mode 100644
index 0000000..2a1f282
--- /dev/null
+++ b/dist2/src/pcre2_string_utils.c
@@ -0,0 +1,201 @@
+/*************************************************
+*      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
+     Original API code Copyright (c) 1997-2012 University of Cambridge
+         New API code Copyright (c) 2016 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 internal functions for comparing and finding the length
+of strings. These are used instead of strcmp() etc because the standard
+functions work only on 8-bit data. */
+
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "pcre2_internal.h"
+
+
+/*************************************************
+*    Compare two zero-terminated PCRE2 strings   *
+*************************************************/
+
+/*
+Arguments:
+  str1        first string
+  str2        second string
+
+Returns:      0, 1, or -1
+*/
+
+int
+PRIV(strcmp)(PCRE2_SPTR str1, PCRE2_SPTR str2)
+{
+PCRE2_UCHAR c1, c2;
+while (*str1 != '\0' || *str2 != '\0')
+  {
+  c1 = *str1++;
+  c2 = *str2++;
+  if (c1 != c2) return ((c1 > c2) << 1) - 1;
+  }
+return 0;
+}
+
+
+/*************************************************
+*  Compare zero-terminated PCRE2 & 8-bit strings *
+*************************************************/
+
+/* As the 8-bit string is almost always a literal, its type is specified as
+const char *.
+
+Arguments:
+  str1        first string
+  str2        second string
+
+Returns:      0, 1, or -1
+*/
+
+int
+PRIV(strcmp_c8)(PCRE2_SPTR str1, const char *str2)
+{
+PCRE2_UCHAR c1, c2;
+while (*str1 != '\0' || *str2 != '\0')
+  {
+  c1 = *str1++;
+  c2 = *str2++;
+  if (c1 != c2) return ((c1 > c2) << 1) - 1;
+  }
+return 0;
+}
+
+
+/*************************************************
+*    Compare two PCRE2 strings, given a length   *
+*************************************************/
+
+/*
+Arguments:
+  str1        first string
+  str2        second string
+  len         the length
+
+Returns:      0, 1, or -1
+*/
+
+int
+PRIV(strncmp)(PCRE2_SPTR str1, PCRE2_SPTR str2, size_t len)
+{
+PCRE2_UCHAR c1, c2;
+for (; len > 0; len--)
+  {
+  c1 = *str1++;
+  c2 = *str2++;
+  if (c1 != c2) return ((c1 > c2) << 1) - 1;
+  }
+return 0;
+}
+
+
+/*************************************************
+* Compare PCRE2 string to 8-bit string by length *
+*************************************************/
+
+/* As the 8-bit string is almost always a literal, its type is specified as
+const char *.
+
+Arguments:
+  str1        first string
+  str2        second string
+  len         the length
+
+Returns:      0, 1, or -1
+*/
+
+int
+PRIV(strncmp_c8)(PCRE2_SPTR str1, const char *str2, size_t len)
+{
+PCRE2_UCHAR c1, c2;
+for (; len > 0; len--)
+  {
+  c1 = *str1++;
+  c2 = *str2++;
+  if (c1 != c2) return ((c1 > c2) << 1) - 1;
+  }
+return 0;
+}
+
+
+/*************************************************
+*        Find the length of a PCRE2 string       *
+*************************************************/
+
+/*
+Argument:    the string
+Returns:     the length
+*/
+
+PCRE2_SIZE
+PRIV(strlen)(PCRE2_SPTR str)
+{
+PCRE2_SIZE c = 0;
+while (*str++ != 0) c++;
+return c;
+}
+
+
+/*************************************************
+* Copy 8-bit 0-terminated string to PCRE2 string *
+*************************************************/
+
+/* Arguments:
+  str1     buffer to receive the string
+  str2     8-bit string to be copied
+
+Returns:   the number of code units used (excluding trailing zero)
+*/
+
+PCRE2_SIZE
+PRIV(strcpy_c8)(PCRE2_UCHAR *str1, const char *str2)
+{
+PCRE2_UCHAR *t = str1;
+while (*str2 != 0) *t++ = *str2++;
+*t = 0;
+return t - str1;
+}
+
+/* End of pcre2_string_utils.c */
diff --git a/dist2/src/pcre2_study.c b/dist2/src/pcre2_study.c
new file mode 100644
index 0000000..18932ad
--- /dev/null
+++ b/dist2/src/pcre2_study.c
@@ -0,0 +1,1575 @@
+/*************************************************
+*      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
+     Original API code Copyright (c) 1997-2012 University of Cambridge
+         New API code Copyright (c) 2016 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 functions for scanning a compiled pattern and
+collecting data (e.g. minimum matching length). */
+
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+
+#include "pcre2_internal.h"
+
+
+/* Set a bit in the starting code unit bit map. */
+
+#define SET_BIT(c) re->start_bitmap[(c)/8] |= (1 << ((c)&7))
+
+/* Returns from set_start_bits() */
+
+enum { SSB_FAIL, SSB_DONE, SSB_CONTINUE, SSB_UNKNOWN };
+
+
+/*************************************************
+*   Find the minimum subject length for a group  *
+*************************************************/
+
+/* Scan a parenthesized group and compute the minimum length of subject that
+is needed to match it. This is a lower bound; it does not mean there is a
+string of that length that matches. In UTF mode, the result is in characters
+rather than code units. The field in a compiled pattern for storing the minimum
+length is 16-bits long (on the grounds that anything longer than that is
+pathological), so we give up when we reach that amount. This also means that
+integer overflow for really crazy patterns cannot happen.
+
+Arguments:
+  re              compiled pattern block
+  code            pointer to start of group (the bracket)
+  startcode       pointer to start of the whole pattern's code
+  utf             UTF flag
+  recurses        chain of recurse_check to catch mutual recursion
+  countptr        pointer to call count (to catch over complexity)
+
+Returns:   the minimum length
+           -1 \C in UTF-8 mode
+              or (*ACCEPT)
+              or pattern too complicated
+              or back reference to duplicate name/number
+           -2 internal error (missing capturing bracket)
+           -3 internal error (opcode not listed)
+*/
+
+static int
+find_minlength(const pcre2_real_code *re, PCRE2_SPTR code,
+  PCRE2_SPTR startcode, BOOL utf, recurse_check *recurses, int *countptr)
+{
+int length = -1;
+int prev_cap_recno = -1;
+int prev_cap_d = 0;
+int prev_recurse_recno = -1;
+int prev_recurse_d = 0;
+uint32_t once_fudge = 0;
+BOOL had_recurse = FALSE;
+BOOL dupcapused = (re->flags & PCRE2_DUPCAPUSED) != 0;
+recurse_check this_recurse;
+register int branchlength = 0;
+register PCRE2_UCHAR *cc = (PCRE2_UCHAR *)code + 1 + LINK_SIZE;
+
+/* If this is a "could be empty" group, its minimum length is 0. */
+
+if (*code >= OP_SBRA && *code <= OP_SCOND) return 0;
+
+/* Skip over capturing bracket number */
+
+if (*code == OP_CBRA || *code == OP_CBRAPOS) cc += IMM2_SIZE;
+
+/* A large and/or complex regex can take too long to process. */
+
+if ((*countptr)++ > 1000) return -1;
+
+/* 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. If the accumulated length
+passes 16-bits, stop. */
+
+for (;;)
+  {
+  int d, min, recno;
+  PCRE2_UCHAR *cs, *ce;
+  register PCRE2_UCHAR op = *cc;
+
+  if (branchlength >= UINT16_MAX) return UINT16_MAX;
+
+  switch (op)
+    {
+    case OP_COND:
+    case OP_SCOND:
+
+    /* If there is only one branch in a condition, the implied branch has zero
+    length, so we don't add anything. This covers the DEFINE "condition"
+    automatically. If there are two branches we can treat it the same as any
+    other non-capturing subpattern. */
+
+    cs = cc + GET(cc, 1);
+    if (*cs != OP_ALT)
+      {
+      cc = cs + 1 + LINK_SIZE;
+      break;
+      }
+    goto PROCESS_NON_CAPTURE;
+
+    /* There's a special case of OP_ONCE, when it is wrapped round an
+    OP_RECURSE. We'd like to process the latter at this level so that
+    remembering the value works for repeated cases. So we do nothing, but
+    set a fudge value to skip over the OP_KET after the recurse. */
+
+    case OP_ONCE:
+    if (cc[1+LINK_SIZE] == OP_RECURSE && cc[2*(1+LINK_SIZE)] == OP_KET)
+      {
+      once_fudge = 1 + LINK_SIZE;
+      cc += 1 + LINK_SIZE;
+      break;
+      }
+    /* Fall through */
+
+    case OP_ONCE_NC:
+    case OP_BRA:
+    case OP_SBRA:
+    case OP_BRAPOS:
+    case OP_SBRAPOS:
+    PROCESS_NON_CAPTURE:
+    d = find_minlength(re, cc, startcode, utf, recurses, countptr);
+    if (d < 0) return d;
+    branchlength += d;
+    do cc += GET(cc, 1); while (*cc == OP_ALT);
+    cc += 1 + LINK_SIZE;
+    break;
+
+    /* To save time for repeated capturing subpatterns, we remember the
+    length of the previous one. Unfortunately we can't do the same for
+    the unnumbered ones above. Nor can we do this if (?| is present in the
+    pattern because captures with the same number are not then identical. */
+
+    case OP_CBRA:
+    case OP_SCBRA:
+    case OP_CBRAPOS:
+    case OP_SCBRAPOS:
+    recno = dupcapused? prev_cap_recno - 1 : (int)GET2(cc, 1+LINK_SIZE);
+    if (recno != prev_cap_recno)
+      {
+      prev_cap_recno = recno;
+      prev_cap_d = find_minlength(re, cc, startcode, utf, recurses, countptr);
+      if (prev_cap_d < 0) return prev_cap_d;
+      }
+    branchlength += prev_cap_d;
+    do cc += GET(cc, 1); while (*cc == OP_ALT);
+    cc += 1 + LINK_SIZE;
+    break;
+
+    /* ACCEPT makes things far too complicated; we have to give up. */
+
+    case OP_ACCEPT:
+    case OP_ASSERT_ACCEPT:
+    return -1;
+
+    /* 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. If an
+    ACCEPT was previously encountered, use the length that was in force at that
+    time, and pass back the shortest ACCEPT length. */
+
+    case OP_ALT:
+    case OP_KET:
+    case OP_KETRMAX:
+    case OP_KETRMIN:
+    case OP_KETRPOS:
+    case OP_END:
+    if (length < 0 || (!had_recurse && branchlength < length))
+      length = branchlength;
+    if (op != OP_ALT) return length;
+    cc += 1 + LINK_SIZE;
+    branchlength = 0;
+    had_recurse = FALSE;
+    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_CREF:
+    case OP_DNCREF:
+    case OP_RREF:
+    case OP_DNRREF:
+    case OP_FALSE:
+    case OP_TRUE:
+    case OP_CALLOUT:
+    case OP_SOD:
+    case OP_SOM:
+    case OP_EOD:
+    case OP_EODN:
+    case OP_CIRC:
+    case OP_CIRCM:
+    case OP_DOLL:
+    case OP_DOLLM:
+    case OP_NOT_WORD_BOUNDARY:
+    case OP_WORD_BOUNDARY:
+    cc += PRIV(OP_lengths)[*cc];
+    break;
+
+    case OP_CALLOUT_STR:
+    cc += GET(cc, 1 + 2*LINK_SIZE);
+    break;
+
+    /* Skip over a subpattern that has a {0} or {0,x} quantifier */
+
+    case OP_BRAZERO:
+    case OP_BRAMINZERO:
+    case OP_BRAPOSZERO:
+    case OP_SKIPZERO:
+    cc += PRIV(OP_lengths)[*cc];
+    do cc += GET(cc, 1); while (*cc == OP_ALT);
+    cc += 1 + LINK_SIZE;
+    break;
+
+    /* Handle literal characters and + repetitions */
+
+    case OP_CHAR:
+    case OP_CHARI:
+    case OP_NOT:
+    case OP_NOTI:
+    case OP_PLUS:
+    case OP_PLUSI:
+    case OP_MINPLUS:
+    case OP_MINPLUSI:
+    case OP_POSPLUS:
+    case OP_POSPLUSI:
+    case OP_NOTPLUS:
+    case OP_NOTPLUSI:
+    case OP_NOTMINPLUS:
+    case OP_NOTMINPLUSI:
+    case OP_NOTPOSPLUS:
+    case OP_NOTPOSPLUSI:
+    branchlength++;
+    cc += 2;
+#ifdef SUPPORT_UNICODE
+    if (utf && HAS_EXTRALEN(cc[-1])) cc += GET_EXTRALEN(cc[-1]);
+#endif
+    break;
+
+    case OP_TYPEPLUS:
+    case OP_TYPEMINPLUS:
+    case OP_TYPEPOSPLUS:
+    branchlength++;
+    cc += (cc[1] == OP_PROP || cc[1] == OP_NOTPROP)? 4 : 2;
+    break;
+
+    /* Handle exact repetitions. The count is already in characters, but we
+    may need to skip over a multibyte character in UTF mode.  */
+
+    case OP_EXACT:
+    case OP_EXACTI:
+    case OP_NOTEXACT:
+    case OP_NOTEXACTI:
+    branchlength += GET2(cc,1);
+    cc += 2 + IMM2_SIZE;
+#ifdef SUPPORT_UNICODE
+    if (utf && HAS_EXTRALEN(cc[-1])) cc += GET_EXTRALEN(cc[-1]);
+#endif
+    break;
+
+    case OP_TYPEEXACT:
+    branchlength += GET2(cc,1);
+    cc += 2 + IMM2_SIZE + ((cc[1 + IMM2_SIZE] == OP_PROP
+      || cc[1 + IMM2_SIZE] == OP_NOTPROP)? 2 : 0);
+    break;
+
+    /* Handle single-char non-literal matchers */
+
+    case OP_PROP:
+    case OP_NOTPROP:
+    cc += 2;
+    /* 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:
+    case OP_ALLANY:
+    case OP_EXTUNI:
+    case OP_HSPACE:
+    case OP_NOT_HSPACE:
+    case OP_VSPACE:
+    case OP_NOT_VSPACE:
+    branchlength++;
+    cc++;
+    break;
+
+    /* "Any newline" might match two characters, but it also might match just
+    one. */
+
+    case OP_ANYNL:
+    branchlength += 1;
+    cc++;
+    break;
+
+    /* The single-byte matcher means we can't proceed in UTF mode. (In
+    non-UTF mode \C will actually be turned into OP_ALLANY, so won't ever
+    appear, but leave the code, just in case.) */
+
+    case OP_ANYBYTE:
+#ifdef SUPPORT_UNICODE
+    if (utf) return -1;
+#endif
+    branchlength++;
+    cc++;
+    break;
+
+    /* For repeated character types, we have to test for \p and \P, which have
+    an extra two bytes of parameters. */
+
+    case OP_TYPESTAR:
+    case OP_TYPEMINSTAR:
+    case OP_TYPEQUERY:
+    case OP_TYPEMINQUERY:
+    case OP_TYPEPOSSTAR:
+    case OP_TYPEPOSQUERY:
+    if (cc[1] == OP_PROP || cc[1] == OP_NOTPROP) cc += 2;
+    cc += PRIV(OP_lengths)[op];
+    break;
+
+    case OP_TYPEUPTO:
+    case OP_TYPEMINUPTO:
+    case OP_TYPEPOSUPTO:
+    if (cc[1 + IMM2_SIZE] == OP_PROP
+      || cc[1 + IMM2_SIZE] == OP_NOTPROP) cc += 2;
+    cc += PRIV(OP_lengths)[op];
+    break;
+
+    /* Check a class for variable quantification */
+
+    case OP_CLASS:
+    case OP_NCLASS:
+#ifdef SUPPORT_WIDE_CHARS
+    case OP_XCLASS:
+    /* The original code caused an unsigned overflow in 64 bit systems,
+    so now we use a conditional statement. */
+    if (op == OP_XCLASS)
+      cc += GET(cc, 1);
+    else
+      cc += PRIV(OP_lengths)[OP_CLASS];
+#else
+    cc += PRIV(OP_lengths)[OP_CLASS];
+#endif
+
+    switch (*cc)
+      {
+      case OP_CRPLUS:
+      case OP_CRMINPLUS:
+      case OP_CRPOSPLUS:
+      branchlength++;
+      /* Fall through */
+
+      case OP_CRSTAR:
+      case OP_CRMINSTAR:
+      case OP_CRQUERY:
+      case OP_CRMINQUERY:
+      case OP_CRPOSSTAR:
+      case OP_CRPOSQUERY:
+      cc++;
+      break;
+
+      case OP_CRRANGE:
+      case OP_CRMINRANGE:
+      case OP_CRPOSRANGE:
+      branchlength += GET2(cc,1);
+      cc += 1 + 2 * IMM2_SIZE;
+      break;
+
+      default:
+      branchlength++;
+      break;
+      }
+    break;
+
+    /* Backreferences and subroutine calls (OP_RECURSE) are treated in the same
+    way: we find the minimum length for the subpattern. A recursion
+    (backreference or subroutine) causes an a flag to be set that causes the
+    length of this branch to be ignored. The logic is that a recursion can only
+    make sense if there is another alternative that stops the recursing. That
+    will provide the minimum length (when no recursion happens).
+
+    If PCRE2_MATCH_UNSET_BACKREF is set, a backreference to an unset bracket
+    matches an empty string (by default it causes a matching failure), so in
+    that case we must set the minimum length to zero. */
+
+    /* Duplicate named pattern back reference. We cannot reliably find a length
+    for this if duplicate numbers are present in the pattern. */
+
+    case OP_DNREF:
+    case OP_DNREFI:
+    if (dupcapused) return -1;
+    if ((re->overall_options & PCRE2_MATCH_UNSET_BACKREF) == 0)
+      {
+      int count = GET2(cc, 1+IMM2_SIZE);
+      PCRE2_UCHAR *slot =
+        (PCRE2_UCHAR *)((uint8_t *)re + sizeof(pcre2_real_code)) +
+          GET2(cc, 1) * re->name_entry_size;
+
+      d = INT_MAX;
+
+      /* Scan all groups with the same name */
+
+      while (count-- > 0)
+        {
+        ce = cs = (PCRE2_UCHAR *)PRIV(find_bracket)(startcode, utf, GET2(slot, 0));
+        if (cs == NULL) return -2;
+        do ce += GET(ce, 1); while (*ce == OP_ALT);
+        if (cc > cs && cc < ce)    /* Simple recursion */
+          {
+          d = 0;
+          had_recurse = TRUE;
+          break;
+          }
+        else
+          {
+          recurse_check *r = recurses;
+          for (r = recurses; r != NULL; r = r->prev) if (r->group == cs) break;
+          if (r != NULL)           /* Mutual recursion */
+            {
+            d = 0;
+            had_recurse = TRUE;
+            break;
+            }
+          else
+            {
+            int dd;
+            this_recurse.prev = recurses;
+            this_recurse.group = cs;
+            dd = find_minlength(re, cs, startcode, utf, &this_recurse, countptr);
+            if (dd < d) d = dd;
+            }
+          }
+        slot += re->name_entry_size;
+        }
+      }
+    else d = 0;
+    cc += 1 + 2*IMM2_SIZE;
+    goto REPEAT_BACK_REFERENCE;
+
+    /* Single back reference. We cannot find a length for this if duplicate
+    numbers are present in the pattern. */
+
+    case OP_REF:
+    case OP_REFI:
+    if (dupcapused) return -1;
+    if ((re->overall_options & PCRE2_MATCH_UNSET_BACKREF) == 0)
+      {
+      ce = cs = (PCRE2_UCHAR *)PRIV(find_bracket)(startcode, utf, GET2(cc, 1));
+      if (cs == NULL) return -2;
+      do ce += GET(ce, 1); while (*ce == OP_ALT);
+      if (cc > cs && cc < ce)    /* Simple recursion */
+        {
+        d = 0;
+        had_recurse = TRUE;
+        }
+      else
+        {
+        recurse_check *r = recurses;
+        for (r = recurses; r != NULL; r = r->prev) if (r->group == cs) break;
+        if (r != NULL)           /* Mutual recursion */
+          {
+          d = 0;
+          had_recurse = TRUE;
+          }
+        else
+          {
+          this_recurse.prev = recurses;
+          this_recurse.group = cs;
+          d = find_minlength(re, cs, startcode, utf, &this_recurse, countptr);
+          }
+        }
+      }
+    else d = 0;
+    cc += 1 + IMM2_SIZE;
+
+    /* Handle repeated back references */
+
+    REPEAT_BACK_REFERENCE:
+    switch (*cc)
+      {
+      case OP_CRSTAR:
+      case OP_CRMINSTAR:
+      case OP_CRQUERY:
+      case OP_CRMINQUERY:
+      case OP_CRPOSSTAR:
+      case OP_CRPOSQUERY:
+      min = 0;
+      cc++;
+      break;
+
+      case OP_CRPLUS:
+      case OP_CRMINPLUS:
+      case OP_CRPOSPLUS:
+      min = 1;
+      cc++;
+      break;
+
+      case OP_CRRANGE:
+      case OP_CRMINRANGE:
+      case OP_CRPOSRANGE:
+      min = GET2(cc, 1);
+      cc += 1 + 2 * IMM2_SIZE;
+      break;
+
+      default:
+      min = 1;
+      break;
+      }
+
+     /* Take care not to overflow: (1) min and d are ints, so check that their
+     product is not greater than INT_MAX. (2) branchlength is limited to
+     UINT16_MAX (checked at the top of the loop). */
+
+    if ((d > 0 && (INT_MAX/d) < min) || UINT16_MAX - branchlength < min*d)
+      branchlength = UINT16_MAX;
+    else branchlength += min * d;
+    break;
+
+    /* Recursion always refers to the first occurrence of a subpattern with a
+    given number. Therefore, we can always make use of caching, even when the
+    pattern contains multiple subpatterns with the same number. */
+
+    case OP_RECURSE:
+    cs = ce = (PCRE2_UCHAR *)startcode + GET(cc, 1);
+    recno = GET2(cs, 1+LINK_SIZE);
+    if (recno == prev_recurse_recno)
+      {
+      branchlength += prev_recurse_d;
+      }
+    else
+      {
+      do ce += GET(ce, 1); while (*ce == OP_ALT);
+      if (cc > cs && cc < ce)    /* Simple recursion */
+        had_recurse = TRUE;
+      else
+        {
+        recurse_check *r = recurses;
+        for (r = recurses; r != NULL; r = r->prev) if (r->group == cs) break;
+        if (r != NULL)          /* Mutual recursion */
+          had_recurse = TRUE;
+        else
+          {
+          this_recurse.prev = recurses;
+          this_recurse.group = cs;
+          prev_recurse_d = find_minlength(re, cs, startcode, utf, &this_recurse,
+            countptr);
+          if (prev_recurse_d < 0) return prev_recurse_d;
+          prev_recurse_recno = recno;
+          branchlength += prev_recurse_d;
+          }
+        }
+      }
+    cc += 1 + LINK_SIZE + once_fudge;
+    once_fudge = 0;
+    break;
+
+    /* Anything else does not or need not match a character. We can get the
+    item's length from the table, but for those that can match zero occurrences
+    of a character, we must take special action for UTF-8 characters. As it
+    happens, the "NOT" versions of these opcodes are used at present only for
+    ASCII characters, so they could be omitted from this list. However, in
+    future that may change, so we include them here so as not to leave a
+    gotcha for a future maintainer. */
+
+    case OP_UPTO:
+    case OP_UPTOI:
+    case OP_NOTUPTO:
+    case OP_NOTUPTOI:
+    case OP_MINUPTO:
+    case OP_MINUPTOI:
+    case OP_NOTMINUPTO:
+    case OP_NOTMINUPTOI:
+    case OP_POSUPTO:
+    case OP_POSUPTOI:
+    case OP_NOTPOSUPTO:
+    case OP_NOTPOSUPTOI:
+
+    case OP_STAR:
+    case OP_STARI:
+    case OP_NOTSTAR:
+    case OP_NOTSTARI:
+    case OP_MINSTAR:
+    case OP_MINSTARI:
+    case OP_NOTMINSTAR:
+    case OP_NOTMINSTARI:
+    case OP_POSSTAR:
+    case OP_POSSTARI:
+    case OP_NOTPOSSTAR:
+    case OP_NOTPOSSTARI:
+
+    case OP_QUERY:
+    case OP_QUERYI:
+    case OP_NOTQUERY:
+    case OP_NOTQUERYI:
+    case OP_MINQUERY:
+    case OP_MINQUERYI:
+    case OP_NOTMINQUERY:
+    case OP_NOTMINQUERYI:
+    case OP_POSQUERY:
+    case OP_POSQUERYI:
+    case OP_NOTPOSQUERY:
+    case OP_NOTPOSQUERYI:
+
+    cc += PRIV(OP_lengths)[op];
+#ifdef SUPPORT_UNICODE
+    if (utf && HAS_EXTRALEN(cc[-1])) cc += GET_EXTRALEN(cc[-1]);
+#endif
+    break;
+
+    /* Skip these, but we need to add in the name length. */
+
+    case OP_MARK:
+    case OP_PRUNE_ARG:
+    case OP_SKIP_ARG:
+    case OP_THEN_ARG:
+    cc += PRIV(OP_lengths)[op] + cc[1];
+    break;
+
+    /* The remaining opcodes are just skipped over. */
+
+    case OP_CLOSE:
+    case OP_COMMIT:
+    case OP_FAIL:
+    case OP_PRUNE:
+    case OP_SET_SOM:
+    case OP_SKIP:
+    case OP_THEN:
+    cc += PRIV(OP_lengths)[op];
+    break;
+
+    /* This should not occur: we list all opcodes explicitly so that when
+    new ones get added they are properly considered. */
+
+    default:
+    return -3;
+    }
+  }
+/* Control never gets here */
+}
+
+
+
+/*************************************************
+*      Set a bit and maybe its alternate case    *
+*************************************************/
+
+/* Given a character, set its first code unit's bit in the table, and also the
+corresponding bit for the other version of a letter if we are caseless.
+
+Arguments:
+  re            points to the regex block
+  p             points to the first code unit of the character
+  caseless      TRUE if caseless
+  utf           TRUE for UTF mode
+
+Returns:        pointer after the character
+*/
+
+static PCRE2_SPTR
+set_table_bit(pcre2_real_code *re, PCRE2_SPTR p, BOOL caseless, BOOL utf)
+{
+uint32_t c = *p++;   /* First code unit */
+(void)utf;           /* Stop compiler warning when UTF not supported */
+
+/* In 16-bit and 32-bit modes, code units greater than 0xff set the bit for
+0xff. */
+
+#if PCRE2_CODE_UNIT_WIDTH != 8
+if (c > 0xff) SET_BIT(0xff); else
+#endif
+
+SET_BIT(c);
+
+/* In UTF-8 or UTF-16 mode, pick up the remaining code units in order to find
+the end of the character, even when caseless. */
+
+#ifdef SUPPORT_UNICODE
+if (utf)
+  {
+#if PCRE2_CODE_UNIT_WIDTH == 8
+  if (c >= 0xc0) GETUTF8INC(c, p);
+#elif PCRE2_CODE_UNIT_WIDTH == 16
+  if ((c & 0xfc00) == 0xd800) GETUTF16INC(c, p);
+#endif
+  }
+#endif  /* SUPPORT_UNICODE */
+
+/* If caseless, handle the other case of the character. */
+
+if (caseless)
+  {
+  if (utf)
+    {
+#if PCRE2_CODE_UNIT_WIDTH == 8
+    PCRE2_UCHAR buff[6];
+    c = UCD_OTHERCASE(c);
+    (void)PRIV(ord2utf)(c, buff);
+    SET_BIT(buff[0]);
+#else  /* 16-bit or 32-bit mode */
+    c = UCD_OTHERCASE(c);
+    if (c > 0xff) SET_BIT(0xff); else SET_BIT(c);
+#endif
+    }
+
+  /* Not UTF */
+
+  else if (MAX_255(c)) SET_BIT(re->tables[fcc_offset + c]);
+  }
+
+return p;
+}
+
+
+
+/*************************************************
+*     Set bits for a positive character type     *
+*************************************************/
+
+/* This function sets starting bits for a character type. In UTF-8 mode, we can
+only do a direct setting for bytes less than 128, as otherwise there can be
+confusion with bytes in the middle of UTF-8 characters. In a "traditional"
+environment, the tables will only recognize ASCII characters anyway, but in at
+least one Windows environment, some higher bytes bits were set in the tables.
+So we deal with that case by considering the UTF-8 encoding.
+
+Arguments:
+  re             the regex block
+  cbit type      the type of character wanted
+  table_limit    32 for non-UTF-8; 16 for UTF-8
+
+Returns:         nothing
+*/
+
+static void
+set_type_bits(pcre2_real_code *re, int cbit_type, unsigned int table_limit)
+{
+register uint32_t c;
+for (c = 0; c < table_limit; c++)
+  re->start_bitmap[c] |= re->tables[c+cbits_offset+cbit_type];
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH == 8
+if (table_limit == 32) return;
+for (c = 128; c < 256; c++)
+  {
+  if ((re->tables[cbits_offset + c/8] & (1 << (c&7))) != 0)
+    {
+    PCRE2_UCHAR buff[6];
+    (void)PRIV(ord2utf)(c, buff);
+    SET_BIT(buff[0]);
+    }
+  }
+#endif  /* UTF-8 */
+}
+
+
+/*************************************************
+*     Set bits for a negative character type     *
+*************************************************/
+
+/* This function sets starting bits for a negative character type such as \D.
+In UTF-8 mode, we can only do a direct setting for bytes less than 128, as
+otherwise there can be confusion with bytes in the middle of UTF-8 characters.
+Unlike in the positive case, where we can set appropriate starting bits for
+specific high-valued UTF-8 characters, in this case we have to set the bits for
+all high-valued characters. The lowest is 0xc2, but we overkill by starting at
+0xc0 (192) for simplicity.
+
+Arguments:
+  re             the regex block
+  cbit type      the type of character wanted
+  table_limit    32 for non-UTF-8; 16 for UTF-8
+
+Returns:         nothing
+*/
+
+static void
+set_nottype_bits(pcre2_real_code *re, int cbit_type, unsigned int table_limit)
+{
+register uint32_t c;
+for (c = 0; c < table_limit; c++)
+  re->start_bitmap[c] |= ~(re->tables[c+cbits_offset+cbit_type]);
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH == 8
+if (table_limit != 32) for (c = 24; c < 32; c++) re->start_bitmap[c] = 0xff;
+#endif
+}
+
+
+
+/*************************************************
+*          Create bitmap of starting bytes       *
+*************************************************/
+
+/* This function scans a compiled unanchored expression recursively and
+attempts to build a bitmap of the set of possible starting code units whose
+values are less than 256. In 16-bit and 32-bit mode, values above 255 all cause
+the 255 bit to be set. When calling set[_not]_type_bits() in UTF-8 (sic) mode
+we pass a value of 16 rather than 32 as the final argument. (See comments in
+those functions for the reason.)
+
+The SSB_CONTINUE return is useful for parenthesized groups in patterns such as
+(a*)b where the group provides some optional starting code units but scanning
+must continue at the outer level to find at least one mandatory code unit. At
+the outermost level, this function fails unless the result is SSB_DONE.
+
+Arguments:
+  re           points to the compiled regex block
+  code         points to an expression
+  utf          TRUE if in UTF mode
+
+Returns:       SSB_FAIL     => Failed to find any starting code units
+               SSB_DONE     => Found mandatory starting code units
+               SSB_CONTINUE => Found optional starting code units
+               SSB_UNKNOWN  => Hit an unrecognized opcode
+*/
+
+static int
+set_start_bits(pcre2_real_code *re, PCRE2_SPTR code, BOOL utf)
+{
+register uint32_t c;
+int yield = SSB_DONE;
+
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH == 8
+int table_limit = utf? 16:32;
+#else
+int table_limit = 32;
+#endif
+
+do
+  {
+  BOOL try_next = TRUE;
+  PCRE2_SPTR tcode = code + 1 + LINK_SIZE;
+
+  if (*code == OP_CBRA || *code == OP_SCBRA ||
+      *code == OP_CBRAPOS || *code == OP_SCBRAPOS) tcode += IMM2_SIZE;
+
+  while (try_next)    /* Loop for items in this branch */
+    {
+    int rc;
+    uint8_t *classmap = NULL;
+
+    switch(*tcode)
+      {
+      /* If we reach something we don't understand, it means a new opcode has
+      been created that hasn't been added to this function. Hopefully this
+      problem will be discovered during testing. */
+
+      default:
+      return SSB_UNKNOWN;
+
+      /* Fail for a valid opcode that implies no starting bits. */
+
+      case OP_ACCEPT:
+      case OP_ASSERT_ACCEPT:
+      case OP_ALLANY:
+      case OP_ANY:
+      case OP_ANYBYTE:
+      case OP_CIRC:
+      case OP_CIRCM:
+      case OP_CLOSE:
+      case OP_COMMIT:
+      case OP_COND:
+      case OP_CREF:
+      case OP_FALSE:
+      case OP_TRUE:
+      case OP_DNCREF:
+      case OP_DNREF:
+      case OP_DNREFI:
+      case OP_DNRREF:
+      case OP_DOLL:
+      case OP_DOLLM:
+      case OP_END:
+      case OP_EOD:
+      case OP_EODN:
+      case OP_EXTUNI:
+      case OP_FAIL:
+      case OP_MARK:
+      case OP_NOT:
+      case OP_NOTEXACT:
+      case OP_NOTEXACTI:
+      case OP_NOTI:
+      case OP_NOTMINPLUS:
+      case OP_NOTMINPLUSI:
+      case OP_NOTMINQUERY:
+      case OP_NOTMINQUERYI:
+      case OP_NOTMINSTAR:
+      case OP_NOTMINSTARI:
+      case OP_NOTMINUPTO:
+      case OP_NOTMINUPTOI:
+      case OP_NOTPLUS:
+      case OP_NOTPLUSI:
+      case OP_NOTPOSPLUS:
+      case OP_NOTPOSPLUSI:
+      case OP_NOTPOSQUERY:
+      case OP_NOTPOSQUERYI:
+      case OP_NOTPOSSTAR:
+      case OP_NOTPOSSTARI:
+      case OP_NOTPOSUPTO:
+      case OP_NOTPOSUPTOI:
+      case OP_NOTPROP:
+      case OP_NOTQUERY:
+      case OP_NOTQUERYI:
+      case OP_NOTSTAR:
+      case OP_NOTSTARI:
+      case OP_NOTUPTO:
+      case OP_NOTUPTOI:
+      case OP_NOT_HSPACE:
+      case OP_NOT_VSPACE:
+      case OP_PRUNE:
+      case OP_PRUNE_ARG:
+      case OP_RECURSE:
+      case OP_REF:
+      case OP_REFI:
+      case OP_REVERSE:
+      case OP_RREF:
+      case OP_SCOND:
+      case OP_SET_SOM:
+      case OP_SKIP:
+      case OP_SKIP_ARG:
+      case OP_SOD:
+      case OP_SOM:
+      case OP_THEN:
+      case OP_THEN_ARG:
+      return SSB_FAIL;
+
+      /* A "real" property test implies no starting bits, but the fake property
+      PT_CLIST identifies a list of characters. These lists are short, as they
+      are used for characters with more than one "other case", so there is no
+      point in recognizing them for OP_NOTPROP. */
+
+      case OP_PROP:
+      if (tcode[1] != PT_CLIST) return SSB_FAIL;
+        {
+        const uint32_t *p = PRIV(ucd_caseless_sets) + tcode[2];
+        while ((c = *p++) < NOTACHAR)
+          {
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH == 8
+          if (utf)
+            {
+            PCRE2_UCHAR buff[6];
+            (void)PRIV(ord2utf)(c, buff);
+            c = buff[0];
+            }
+#endif
+          if (c > 0xff) SET_BIT(0xff); else SET_BIT(c);
+          }
+        }
+      try_next = FALSE;
+      break;
+
+      /* We can ignore word boundary tests. */
+
+      case OP_WORD_BOUNDARY:
+      case OP_NOT_WORD_BOUNDARY:
+      tcode++;
+      break;
+
+      /* If we hit a bracket or a positive lookahead assertion, recurse to set
+      bits from within the subpattern. If it can't find anything, we have to
+      give up. If it finds some mandatory character(s), we are done for this
+      branch. Otherwise, carry on scanning after the subpattern. */
+
+      case OP_BRA:
+      case OP_SBRA:
+      case OP_CBRA:
+      case OP_SCBRA:
+      case OP_BRAPOS:
+      case OP_SBRAPOS:
+      case OP_CBRAPOS:
+      case OP_SCBRAPOS:
+      case OP_ONCE:
+      case OP_ONCE_NC:
+      case OP_ASSERT:
+      rc = set_start_bits(re, tcode, utf);
+      if (rc == SSB_FAIL || rc == SSB_UNKNOWN) return rc;
+      if (rc == SSB_DONE) try_next = FALSE; else
+        {
+        do tcode += GET(tcode, 1); while (*tcode == OP_ALT);
+        tcode += 1 + LINK_SIZE;
+        }
+      break;
+
+      /* If we hit ALT or KET, it means we haven't found anything mandatory in
+      this branch, though we might have found something optional. For ALT, we
+      continue with the next alternative, but we have to arrange that the final
+      result from subpattern is SSB_CONTINUE rather than SSB_DONE. For KET,
+      return SSB_CONTINUE: if this is the top level, that indicates failure,
+      but after a nested subpattern, it causes scanning to continue. */
+
+      case OP_ALT:
+      yield = SSB_CONTINUE;
+      try_next = FALSE;
+      break;
+
+      case OP_KET:
+      case OP_KETRMAX:
+      case OP_KETRMIN:
+      case OP_KETRPOS:
+      return SSB_CONTINUE;
+
+      /* Skip over callout */
+
+      case OP_CALLOUT:
+      tcode += PRIV(OP_lengths)[OP_CALLOUT];
+      break;
+
+      case OP_CALLOUT_STR:
+      tcode += GET(tcode, 1 + 2*LINK_SIZE);
+      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;
+
+      /* BRAZERO does the bracket, but carries on. */
+
+      case OP_BRAZERO:
+      case OP_BRAMINZERO:
+      case OP_BRAPOSZERO:
+      rc = set_start_bits(re, ++tcode, utf);
+      if (rc == SSB_FAIL || rc == SSB_UNKNOWN) return rc;
+      do tcode += GET(tcode,1); while (*tcode == OP_ALT);
+      tcode += 1 + LINK_SIZE;
+      break;
+
+      /* SKIPZERO skips the bracket. */
+
+      case OP_SKIPZERO:
+      tcode++;
+      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_POSSTAR:
+      case OP_QUERY:
+      case OP_MINQUERY:
+      case OP_POSQUERY:
+      tcode = set_table_bit(re, tcode + 1, FALSE, utf);
+      break;
+
+      case OP_STARI:
+      case OP_MINSTARI:
+      case OP_POSSTARI:
+      case OP_QUERYI:
+      case OP_MINQUERYI:
+      case OP_POSQUERYI:
+      tcode = set_table_bit(re, tcode + 1, TRUE, utf);
+      break;
+
+      /* Single-char upto sets the bit and tries the next */
+
+      case OP_UPTO:
+      case OP_MINUPTO:
+      case OP_POSUPTO:
+      tcode = set_table_bit(re, tcode + 1 + IMM2_SIZE, FALSE, utf);
+      break;
+
+      case OP_UPTOI:
+      case OP_MINUPTOI:
+      case OP_POSUPTOI:
+      tcode = set_table_bit(re, tcode + 1 + IMM2_SIZE, TRUE, utf);
+      break;
+
+      /* At least one single char sets the bit and stops */
+
+      case OP_EXACT:
+      tcode += IMM2_SIZE;
+      /* Fall through */
+      case OP_CHAR:
+      case OP_PLUS:
+      case OP_MINPLUS:
+      case OP_POSPLUS:
+      (void)set_table_bit(re, tcode + 1, FALSE, utf);
+      try_next = FALSE;
+      break;
+
+      case OP_EXACTI:
+      tcode += IMM2_SIZE;
+      /* Fall through */
+      case OP_CHARI:
+      case OP_PLUSI:
+      case OP_MINPLUSI:
+      case OP_POSPLUSI:
+      (void)set_table_bit(re, tcode + 1, TRUE, utf);
+      try_next = FALSE;
+      break;
+
+      /* Special spacing and line-terminating items. These recognize specific
+      lists of characters. The difference between VSPACE and ANYNL is that the
+      latter can match the two-character CRLF sequence, but that is not
+      relevant for finding the first character, so their code here is
+      identical. */
+
+      case OP_HSPACE:
+      SET_BIT(CHAR_HT);
+      SET_BIT(CHAR_SPACE);
+
+      /* For the 16-bit and 32-bit libraries (which can never be EBCDIC), set
+      the bits for 0xA0 and for code units >= 255, independently of UTF. */
+
+#if PCRE2_CODE_UNIT_WIDTH != 8
+      SET_BIT(0xA0);
+      SET_BIT(0xFF);
+#else
+      /* For the 8-bit library in UTF-8 mode, set the bits for the first code
+      units of horizontal space characters. */
+
+#ifdef SUPPORT_UNICODE
+      if (utf)
+        {
+        SET_BIT(0xC2);  /* For U+00A0 */
+        SET_BIT(0xE1);  /* For U+1680, U+180E */
+        SET_BIT(0xE2);  /* For U+2000 - U+200A, U+202F, U+205F */
+        SET_BIT(0xE3);  /* For U+3000 */
+        }
+      else
+#endif
+      /* For the 8-bit library not in UTF-8 mode, set the bit for 0xA0, unless
+      the code is EBCDIC. */
+        {
+#ifndef EBCDIC
+        SET_BIT(0xA0);
+#endif  /* Not EBCDIC */
+        }
+#endif  /* 8-bit support */
+
+      try_next = FALSE;
+      break;
+
+      case OP_ANYNL:
+      case OP_VSPACE:
+      SET_BIT(CHAR_LF);
+      SET_BIT(CHAR_VT);
+      SET_BIT(CHAR_FF);
+      SET_BIT(CHAR_CR);
+
+      /* For the 16-bit and 32-bit libraries (which can never be EBCDIC), set
+      the bits for NEL and for code units >= 255, independently of UTF. */
+
+#if PCRE2_CODE_UNIT_WIDTH != 8
+      SET_BIT(CHAR_NEL);
+      SET_BIT(0xFF);
+#else
+      /* For the 8-bit library in UTF-8 mode, set the bits for the first code
+      units of vertical space characters. */
+
+#ifdef SUPPORT_UNICODE
+      if (utf)
+        {
+        SET_BIT(0xC2);  /* For U+0085 (NEL) */
+        SET_BIT(0xE2);  /* For U+2028, U+2029 */
+        }
+      else
+#endif
+      /* For the 8-bit library not in UTF-8 mode, set the bit for NEL. */
+        {
+        SET_BIT(CHAR_NEL);
+        }
+#endif  /* 8-bit support */
+
+      try_next = FALSE;
+      break;
+
+      /* Single character types set the bits and stop. Note that if PCRE2_UCP
+      is set, we do not see these op codes because \d etc are converted to
+      properties. Therefore, these apply in the case when only characters less
+      than 256 are recognized to match the types. */
+
+      case OP_NOT_DIGIT:
+      set_nottype_bits(re, cbit_digit, table_limit);
+      try_next = FALSE;
+      break;
+
+      case OP_DIGIT:
+      set_type_bits(re, cbit_digit, table_limit);
+      try_next = FALSE;
+      break;
+
+      case OP_NOT_WHITESPACE:
+      set_nottype_bits(re, cbit_space, table_limit);
+      try_next = FALSE;
+      break;
+
+      case OP_WHITESPACE:
+      set_type_bits(re, cbit_space, table_limit);
+      try_next = FALSE;
+      break;
+
+      case OP_NOT_WORDCHAR:
+      set_nottype_bits(re, cbit_word, table_limit);
+      try_next = FALSE;
+      break;
+
+      case OP_WORDCHAR:
+      set_type_bits(re, cbit_word, table_limit);
+      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:
+      case OP_TYPEPOSPLUS:
+      tcode++;
+      break;
+
+      case OP_TYPEEXACT:
+      tcode += 1 + IMM2_SIZE;
+      break;
+
+      /* Zero or more repeats of character types set the bits and then
+      try again. */
+
+      case OP_TYPEUPTO:
+      case OP_TYPEMINUPTO:
+      case OP_TYPEPOSUPTO:
+      tcode += IMM2_SIZE;  /* Fall through */
+
+      case OP_TYPESTAR:
+      case OP_TYPEMINSTAR:
+      case OP_TYPEPOSSTAR:
+      case OP_TYPEQUERY:
+      case OP_TYPEMINQUERY:
+      case OP_TYPEPOSQUERY:
+      switch(tcode[1])
+        {
+        default:
+        case OP_ANY:
+        case OP_ALLANY:
+        return SSB_FAIL;
+
+        case OP_HSPACE:
+        SET_BIT(CHAR_HT);
+        SET_BIT(CHAR_SPACE);
+
+        /* For the 16-bit and 32-bit libraries (which can never be EBCDIC), set
+        the bits for 0xA0 and for code units >= 255, independently of UTF. */
+
+#if PCRE2_CODE_UNIT_WIDTH != 8
+        SET_BIT(0xA0);
+        SET_BIT(0xFF);
+#else
+        /* For the 8-bit library in UTF-8 mode, set the bits for the first code
+        units of horizontal space characters. */
+
+#ifdef SUPPORT_UNICODE
+        if (utf)
+          {
+          SET_BIT(0xC2);  /* For U+00A0 */
+          SET_BIT(0xE1);  /* For U+1680, U+180E */
+          SET_BIT(0xE2);  /* For U+2000 - U+200A, U+202F, U+205F */
+          SET_BIT(0xE3);  /* For U+3000 */
+          }
+        else
+#endif
+        /* For the 8-bit library not in UTF-8 mode, set the bit for 0xA0, unless
+        the code is EBCDIC. */
+          {
+#ifndef EBCDIC
+          SET_BIT(0xA0);
+#endif  /* Not EBCDIC */
+          }
+#endif  /* 8-bit support */
+        break;
+
+        case OP_ANYNL:
+        case OP_VSPACE:
+        SET_BIT(CHAR_LF);
+        SET_BIT(CHAR_VT);
+        SET_BIT(CHAR_FF);
+        SET_BIT(CHAR_CR);
+
+        /* For the 16-bit and 32-bit libraries (which can never be EBCDIC), set
+        the bits for NEL and for code units >= 255, independently of UTF. */
+
+#if PCRE2_CODE_UNIT_WIDTH != 8
+        SET_BIT(CHAR_NEL);
+        SET_BIT(0xFF);
+#else
+        /* For the 8-bit library in UTF-8 mode, set the bits for the first code
+        units of vertical space characters. */
+
+#ifdef SUPPORT_UNICODE
+        if (utf)
+          {
+          SET_BIT(0xC2);  /* For U+0085 (NEL) */
+          SET_BIT(0xE2);  /* For U+2028, U+2029 */
+          }
+        else
+#endif
+        /* For the 8-bit library not in UTF-8 mode, set the bit for NEL. */
+          {
+          SET_BIT(CHAR_NEL);
+          }
+#endif  /* 8-bit support */
+        break;
+
+        case OP_NOT_DIGIT:
+        set_nottype_bits(re, cbit_digit, table_limit);
+        break;
+
+        case OP_DIGIT:
+        set_type_bits(re, cbit_digit, table_limit);
+        break;
+
+        case OP_NOT_WHITESPACE:
+        set_nottype_bits(re, cbit_space, table_limit);
+        break;
+
+        case OP_WHITESPACE:
+        set_type_bits(re, cbit_space, table_limit);
+        break;
+
+        case OP_NOT_WORDCHAR:
+        set_nottype_bits(re, cbit_word, table_limit);
+        break;
+
+        case OP_WORDCHAR:
+        set_type_bits(re, cbit_word, table_limit);
+        break;
+        }
+
+      tcode += 2;
+      break;
+
+      /* Extended class: if there are any property checks, or if this is a
+      negative XCLASS without a map, give up. If there are no property checks,
+      there must be wide characters on the XCLASS list, because otherwise an
+      XCLASS would not have been created. This means that code points >= 255
+      are always potential starters. */
+
+#ifdef SUPPORT_WIDE_CHARS
+      case OP_XCLASS:
+      if ((tcode[1 + LINK_SIZE] & XCL_HASPROP) != 0 ||
+          (tcode[1 + LINK_SIZE] & (XCL_MAP|XCL_NOT)) == XCL_NOT)
+        return SSB_FAIL;
+
+      /* We have a positive XCLASS or a negative one without a map. Set up the
+      map pointer if there is one, and fall through. */
+
+      classmap = ((tcode[1 + LINK_SIZE] & XCL_MAP) == 0)? NULL :
+        (uint8_t *)(tcode + 1 + LINK_SIZE + 1);
+#endif
+
+      /* Enter here for a negative non-XCLASS. In the 8-bit library, if we are
+      in UTF mode, any byte with a value >= 0xc4 is a potentially valid starter
+      because it starts a character with a value > 255. In 8-bit non-UTF mode,
+      there is no difference between CLASS and NCLASS. In all other wide
+      character modes, set the 0xFF bit to indicate code units >= 255. */
+
+      case OP_NCLASS:
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH == 8
+      if (utf)
+        {
+        re->start_bitmap[24] |= 0xf0;            /* Bits for 0xc4 - 0xc8 */
+        memset(re->start_bitmap+25, 0xff, 7);    /* Bits for 0xc9 - 0xff */
+        }
+#elif PCRE2_CODE_UNIT_WIDTH != 8
+      SET_BIT(0xFF);                             /* For characters >= 255 */
+#endif
+      /* Fall through */
+
+      /* Enter here for a positive non-XCLASS. If we have fallen through from
+      an XCLASS, classmap will already be set; just advance the code pointer.
+      Otherwise, set up classmap for a a non-XCLASS and advance past it. */
+
+      case OP_CLASS:
+      if (*tcode == OP_XCLASS) tcode += GET(tcode, 1); else
+        {
+        classmap = (uint8_t *)(++tcode);
+        tcode += 32 / sizeof(PCRE2_UCHAR);
+        }
+
+      /* When wide characters are supported, classmap may be NULL. In UTF-8
+      (sic) mode, the bits in a class 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 code point is
+      greater than 127. In fact, there are only two possible starting bytes for
+      characters in the range 128 - 255. */
+
+      if (classmap != NULL)
+        {
+#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH == 8
+        if (utf)
+          {
+          for (c = 0; c < 16; c++) re->start_bitmap[c] |= classmap[c];
+          for (c = 128; c < 256; c++)
+            {
+            if ((classmap[c/8] && (1 << (c&7))) != 0)
+              {
+              int d = (c >> 6) | 0xc0;            /* Set bit for this starter */
+              re->start_bitmap[d/8] |= (1 << (d&7));  /* and then skip on to the */
+              c = (c & 0xc0) + 0x40 - 1;          /* next relevant character. */
+              }
+            }
+          }
+        else
+#endif
+        /* In all modes except UTF-8, the two bit maps are compatible. */
+
+          {
+          for (c = 0; c < 32; c++) re->start_bitmap[c] |= classmap[c];
+          }
+        }
+
+      /* Act on what follows the class. For a zero minimum repeat, continue;
+      otherwise stop processing. */
+
+      switch (*tcode)
+        {
+        case OP_CRSTAR:
+        case OP_CRMINSTAR:
+        case OP_CRQUERY:
+        case OP_CRMINQUERY:
+        case OP_CRPOSSTAR:
+        case OP_CRPOSQUERY:
+        tcode++;
+        break;
+
+        case OP_CRRANGE:
+        case OP_CRMINRANGE:
+        case OP_CRPOSRANGE:
+        if (GET2(tcode, 1) == 0) tcode += 1 + 2 * IMM2_SIZE;
+          else try_next = FALSE;
+        break;
+
+        default:
+        try_next = FALSE;
+        break;
+        }
+      break; /* End of class handling case */
+      }      /* End of switch for opcodes */
+    }        /* End of try_next loop */
+
+  code += GET(code, 1);   /* Advance to next branch */
+  }
+while (*code == OP_ALT);
+
+return yield;
+}
+
+
+
+/*************************************************
+*          Study a compiled expression           *
+*************************************************/
+
+/* This function is handed a compiled expression that it must study to produce
+information that will speed up the matching.
+
+Argument:  points to the compiled expression
+Returns:   0 normally; non-zero should never normally occur
+           1 unknown opcode in set_start_bits
+           2 missing capturing bracket
+           3 unknown opcode in find_minlength
+*/
+
+int
+PRIV(study)(pcre2_real_code *re)
+{
+int min;
+int count = 0;
+PCRE2_UCHAR *code;
+BOOL utf = (re->overall_options & PCRE2_UTF) != 0;
+
+/* Find start of compiled code */
+
+code = (PCRE2_UCHAR *)((uint8_t *)re + sizeof(pcre2_real_code)) +
+  re->name_entry_size * re->name_count;
+
+/* For an anchored pattern, or an unanchored pattern that has a first code
+unit, or a multiline pattern that matches only at "line start", there is no
+point in seeking a list of starting code units. */
+
+if ((re->overall_options & PCRE2_ANCHORED) == 0 &&
+    (re->flags & (PCRE2_FIRSTSET|PCRE2_STARTLINE)) == 0)
+  {
+  int rc = set_start_bits(re, code, utf);
+  if (rc == SSB_UNKNOWN) return 1;
+  if (rc == SSB_DONE) re->flags |= PCRE2_FIRSTMAPSET;
+  }
+
+/* Find the minimum length of subject string. If it can match an empty string,
+the minimum length is already known. */
+
+if ((re->flags & PCRE2_MATCH_EMPTY) == 0)
+  {
+  switch(min = find_minlength(re, code, code, utf, NULL, &count))
+    {
+    case -1:  /* \C in UTF mode or (*ACCEPT) or over-complex regex */
+    break;    /* Leave minlength unchanged (will be zero) */
+
+    case -2:
+    return 2; /* missing capturing bracket */
+
+    case -3:
+    return 3; /* unrecognized opcode */
+
+    default:
+    if (min > UINT16_MAX) min = UINT16_MAX;
+    re->minlength = min;
+    break;
+    }
+  }
+
+return 0;
+}
+
+/* End of pcre2_study.c */
diff --git a/dist2/src/pcre2_substitute.c b/dist2/src/pcre2_substitute.c
new file mode 100644
index 0000000..0bf781e
--- /dev/null
+++ b/dist2/src/pcre2_substitute.c
@@ -0,0 +1,850 @@
+/*************************************************
+*      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
+     Original API code Copyright (c) 1997-2012 University of Cambridge
+         New API code Copyright (c) 2016 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.
+-----------------------------------------------------------------------------
+*/
+
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "pcre2_internal.h"
+
+#define PTR_STACK_SIZE 20
+
+#define SUBSTITUTE_OPTIONS \
+  (PCRE2_SUBSTITUTE_EXTENDED|PCRE2_SUBSTITUTE_GLOBAL| \
+   PCRE2_SUBSTITUTE_OVERFLOW_LENGTH|PCRE2_SUBSTITUTE_UNKNOWN_UNSET| \
+   PCRE2_SUBSTITUTE_UNSET_EMPTY)
+
+
+
+/*************************************************
+*           Find end of substitute text          *
+*************************************************/
+
+/* In extended mode, we recognize ${name:+set text:unset text} and similar
+constructions. This requires the identification of unescaped : and }
+characters. This function scans for such. It must deal with nested ${
+constructions. The pointer to the text is updated, either to the required end
+character, or to where an error was detected.
+
+Arguments:
+  code      points to the compiled expression (for options)
+  ptrptr    points to the pointer to the start of the text (updated)
+  ptrend    end of the whole string
+  last      TRUE if the last expected string (only } recognized)
+
+Returns:    0 on success
+            negative error code on failure
+*/
+
+static int
+find_text_end(const pcre2_code *code, PCRE2_SPTR *ptrptr, PCRE2_SPTR ptrend,
+  BOOL last)
+{
+int rc = 0;
+uint32_t nestlevel = 0;
+BOOL literal = FALSE;
+PCRE2_SPTR ptr = *ptrptr;
+
+for (; ptr < ptrend; ptr++)
+  {
+  if (literal)
+    {
+    if (ptr[0] == CHAR_BACKSLASH && ptr < ptrend - 1 && ptr[1] == CHAR_E)
+      {
+      literal = FALSE;
+      ptr += 1;
+      }
+    }
+
+  else if (*ptr == CHAR_RIGHT_CURLY_BRACKET)
+    {
+    if (nestlevel == 0) goto EXIT;
+    nestlevel--;
+    }
+
+  else if (*ptr == CHAR_COLON && !last && nestlevel == 0) goto EXIT;
+
+  else if (*ptr == CHAR_DOLLAR_SIGN)
+    {
+    if (ptr < ptrend - 1 && ptr[1] == CHAR_LEFT_CURLY_BRACKET)
+      {
+      nestlevel++;
+      ptr += 1;
+      }
+    }
+
+  else if (*ptr == CHAR_BACKSLASH)
+    {
+    int erc;
+    int errorcode = 0;
+    uint32_t ch;
+
+    if (ptr < ptrend - 1) switch (ptr[1])
+      {
+      case CHAR_L:
+      case CHAR_l:
+      case CHAR_U:
+      case CHAR_u:
+      ptr += 1;
+      continue;
+      }
+
+    erc = PRIV(check_escape)(&ptr, ptrend, &ch, &errorcode,
+      code->overall_options, FALSE, NULL);
+    if (errorcode != 0)
+      {
+      rc = errorcode;
+      goto EXIT;
+      }
+
+    switch(erc)
+      {
+      case 0:      /* Data character */
+      case ESC_E:  /* Isolated \E is ignored */
+      break;
+
+      case ESC_Q:
+      literal = TRUE;
+      break;
+
+      default:
+      rc = PCRE2_ERROR_BADREPESCAPE;
+      goto EXIT;
+      }
+    }
+  }
+
+rc = PCRE2_ERROR_REPMISSINGBRACE;   /* Terminator not found */
+
+EXIT:
+*ptrptr = ptr;
+return rc;
+}
+
+
+
+/*************************************************
+*              Match and substitute              *
+*************************************************/
+
+/* This function applies a compiled re to a subject string and creates a new
+string with substitutions. The first 7 arguments are the same as for
+pcre2_match(). Either string length may be PCRE2_ZERO_TERMINATED.
+
+Arguments:
+  code            points to the compiled expression
+  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
+  match_data      points to a match_data block, or is NULL
+  context         points a PCRE2 context
+  replacement     points to the replacement string
+  rlength         length of replacement string
+  buffer          where to put the substituted string
+  blength         points to length of buffer; updated to length of string
+
+Returns:          >= 0 number of substitutions made
+                  < 0 an error code
+                  PCRE2_ERROR_BADREPLACEMENT means invalid use of $
+*/
+
+/* This macro checks for space in the buffer before copying into it. On
+overflow, either give an error immediately, or keep on, accumulating the
+length. */
+
+#define CHECKMEMCPY(from,length) \
+  if (!overflowed && lengthleft < length) \
+    { \
+    if ((suboptions & PCRE2_SUBSTITUTE_OVERFLOW_LENGTH) == 0) goto NOROOM; \
+    overflowed = TRUE; \
+    extra_needed = length - lengthleft; \
+    } \
+  else if (overflowed) \
+    { \
+    extra_needed += length; \
+    }  \
+  else \
+    {  \
+    memcpy(buffer + buff_offset, from, CU2BYTES(length)); \
+    buff_offset += length; \
+    lengthleft -= length; \
+    }
+
+/* Here's the function */
+
+PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION
+pcre2_substitute(const pcre2_code *code, PCRE2_SPTR subject, PCRE2_SIZE length,
+  PCRE2_SIZE start_offset, uint32_t options, pcre2_match_data *match_data,
+  pcre2_match_context *mcontext, PCRE2_SPTR replacement, PCRE2_SIZE rlength,
+  PCRE2_UCHAR *buffer, PCRE2_SIZE *blength)
+{
+int rc;
+int subs;
+int forcecase = 0;
+int forcecasereset = 0;
+uint32_t ovector_count;
+uint32_t goptions = 0;
+uint32_t suboptions;
+BOOL match_data_created = FALSE;
+BOOL literal = FALSE;
+BOOL overflowed = FALSE;
+#ifdef SUPPORT_UNICODE
+BOOL utf = (code->overall_options & PCRE2_UTF) != 0;
+#endif
+PCRE2_UCHAR temp[6];
+PCRE2_SPTR ptr;
+PCRE2_SPTR repend;
+PCRE2_SIZE extra_needed = 0;
+PCRE2_SIZE buff_offset, buff_length, lengthleft, fraglength;
+PCRE2_SIZE *ovector;
+
+buff_offset = 0;
+lengthleft = buff_length = *blength;
+*blength = PCRE2_UNSET;
+
+/* Partial matching is not valid. */
+
+if ((options & (PCRE2_PARTIAL_HARD|PCRE2_PARTIAL_SOFT)) != 0)
+  return PCRE2_ERROR_BADOPTION;
+
+/* If no match data block is provided, create one. */
+
+if (match_data == NULL)
+  {
+  pcre2_general_context *gcontext = (mcontext == NULL)?
+    (pcre2_general_context *)code :
+    (pcre2_general_context *)mcontext;
+  match_data = pcre2_match_data_create_from_pattern(code, gcontext);
+  if (match_data == NULL) return PCRE2_ERROR_NOMEMORY;
+  match_data_created = TRUE;
+  }
+ovector = pcre2_get_ovector_pointer(match_data);
+ovector_count = pcre2_get_ovector_count(match_data);
+
+/* Find lengths of zero-terminated strings and the end of the replacement. */
+
+if (length == PCRE2_ZERO_TERMINATED) length = PRIV(strlen)(subject);
+if (rlength == PCRE2_ZERO_TERMINATED) rlength = PRIV(strlen)(replacement);
+repend = replacement + rlength;
+
+/* Check UTF replacement string if necessary. */
+
+#ifdef SUPPORT_UNICODE
+if (utf && (options & PCRE2_NO_UTF_CHECK) == 0)
+  {
+  rc = PRIV(valid_utf)(replacement, rlength, &(match_data->rightchar));
+  if (rc != 0)
+    {
+    match_data->leftchar = 0;
+    goto EXIT;
+    }
+  }
+#endif  /* SUPPORT_UNICODE */
+
+/* Save the substitute options and remove them from the match options. */
+
+suboptions = options & SUBSTITUTE_OPTIONS;
+options &= ~SUBSTITUTE_OPTIONS;
+
+/* Copy up to the start offset */
+
+CHECKMEMCPY(subject, start_offset);
+
+/* Loop for global substituting. */
+
+subs = 0;
+do
+  {
+  PCRE2_SPTR ptrstack[PTR_STACK_SIZE];
+  uint32_t ptrstackptr = 0;
+
+  rc = pcre2_match(code, subject, length, start_offset, options|goptions,
+    match_data, mcontext);
+
+#ifdef SUPPORT_UNICODE
+  if (utf) options |= PCRE2_NO_UTF_CHECK;  /* Only need to check once */
+#endif
+
+  /* Any error other than no match returns the error code. No match when not
+  doing the special after-empty-match global rematch, or when at the end of the
+  subject, breaks the global loop. Otherwise, advance the starting point by one
+  character, copying it to the output, and try again. */
+
+  if (rc < 0)
+    {
+    PCRE2_SIZE save_start;
+
+    if (rc != PCRE2_ERROR_NOMATCH) goto EXIT;
+    if (goptions == 0 || start_offset >= length) break;
+
+    /* Advance by one code point. Then, if CRLF is a valid newline sequence and
+    we have advanced into the middle of it, advance one more code point. In
+    other words, do not start in the middle of CRLF, even if CR and LF on their
+    own are valid newlines. */
+
+    save_start = start_offset++;
+    if (subject[start_offset-1] == CHAR_CR &&
+        code->newline_convention != PCRE2_NEWLINE_CR &&
+        code->newline_convention != PCRE2_NEWLINE_LF &&
+        start_offset < length &&
+        subject[start_offset] == CHAR_LF)
+      start_offset++;
+
+    /* Otherwise, in UTF mode, advance past any secondary code points. */
+
+    else if ((code->overall_options & PCRE2_UTF) != 0)
+      {
+#if PCRE2_CODE_UNIT_WIDTH == 8
+      while (start_offset < length && (subject[start_offset] & 0xc0) == 0x80)
+        start_offset++;
+#elif PCRE2_CODE_UNIT_WIDTH == 16
+      while (start_offset < length &&
+            (subject[start_offset] & 0xfc00) == 0xdc00)
+        start_offset++;
+#endif
+      }
+
+    /* Copy what we have advanced past, reset the special global options, and
+    continue to the next match. */
+
+    fraglength = start_offset - save_start;
+    CHECKMEMCPY(subject + save_start, fraglength);
+    goptions = 0;
+    continue;
+    }
+
+  /* Handle a successful match. Matches that use \K to end before they start
+  are not supported. */
+
+  if (ovector[1] < ovector[0])
+    {
+    rc = PCRE2_ERROR_BADSUBSPATTERN;
+    goto EXIT;
+    }
+
+  /* Count substitutions with a paranoid check for integer overflow; surely no
+  real call to this function would ever hit this! */
+
+  if (subs == INT_MAX)
+    {
+    rc = PCRE2_ERROR_TOOMANYREPLACE;
+    goto EXIT;
+    }
+  subs++;
+
+  /* Copy the text leading up to the match. */
+
+  if (rc == 0) rc = ovector_count;
+  fraglength = ovector[0] - start_offset;
+  CHECKMEMCPY(subject + start_offset, fraglength);
+
+  /* Process the replacement string. Literal mode is set by \Q, but only in
+  extended mode when backslashes are being interpreted. In extended mode we
+  must handle nested substrings that are to be reprocessed. */
+
+  ptr = replacement;
+  for (;;)
+    {
+    uint32_t ch;
+    unsigned int chlen;
+
+    /* If at the end of a nested substring, pop the stack. */
+
+    if (ptr >= repend)
+      {
+      if (ptrstackptr <= 0) break;       /* End of replacement string */
+      repend = ptrstack[--ptrstackptr];
+      ptr = ptrstack[--ptrstackptr];
+      continue;
+      }
+
+    /* Handle the next character */
+
+    if (literal)
+      {
+      if (ptr[0] == CHAR_BACKSLASH && ptr < repend - 1 && ptr[1] == CHAR_E)
+        {
+        literal = FALSE;
+        ptr += 2;
+        continue;
+        }
+      goto LOADLITERAL;
+      }
+
+    /* Not in literal mode. */
+
+    if (*ptr == CHAR_DOLLAR_SIGN)
+      {
+      int group, n;
+      uint32_t special = 0;
+      BOOL inparens;
+      BOOL star;
+      PCRE2_SIZE sublength;
+      PCRE2_SPTR text1_start = NULL;
+      PCRE2_SPTR text1_end = NULL;
+      PCRE2_SPTR text2_start = NULL;
+      PCRE2_SPTR text2_end = NULL;
+      PCRE2_UCHAR next;
+      PCRE2_UCHAR name[33];
+
+      if (++ptr >= repend) goto BAD;
+      if ((next = *ptr) == CHAR_DOLLAR_SIGN) goto LOADLITERAL;
+
+      group = -1;
+      n = 0;
+      inparens = FALSE;
+      star = FALSE;
+
+      if (next == CHAR_LEFT_CURLY_BRACKET)
+        {
+        if (++ptr >= repend) goto BAD;
+        next = *ptr;
+        inparens = TRUE;
+        }
+
+      if (next == CHAR_ASTERISK)
+        {
+        if (++ptr >= repend) goto BAD;
+        next = *ptr;
+        star = TRUE;
+        }
+
+      if (!star && next >= CHAR_0 && next <= CHAR_9)
+        {
+        group = next - CHAR_0;
+        while (++ptr < repend)
+          {
+          next = *ptr;
+          if (next < CHAR_0 || next > CHAR_9) break;
+          group = group * 10 + next - CHAR_0;
+
+          /* A check for a number greater than the hightest captured group
+          is sufficient here; no need for a separate overflow check. If unknown
+          groups are to be treated as unset, just skip over any remaining
+          digits and carry on. */
+
+          if (group > code->top_bracket)
+            {
+            if ((suboptions & PCRE2_SUBSTITUTE_UNKNOWN_UNSET) != 0)
+              {
+              while (++ptr < repend && *ptr >= CHAR_0 && *ptr <= CHAR_9);
+              break;
+              }
+            else
+              {
+              rc = PCRE2_ERROR_NOSUBSTRING;
+              goto PTREXIT;
+              }
+            }
+          }
+        }
+      else
+        {
+        const uint8_t *ctypes = code->tables + ctypes_offset;
+        while (MAX_255(next) && (ctypes[next] & ctype_word) != 0)
+          {
+          name[n++] = next;
+          if (n > 32) goto BAD;
+          if (++ptr >= repend) break;
+          next = *ptr;
+          }
+        if (n == 0) goto BAD;
+        name[n] = 0;
+        }
+
+      /* In extended mode we recognize ${name:+set text:unset text} and
+      ${name:-default text}. */
+
+      if (inparens)
+        {
+        if ((suboptions & PCRE2_SUBSTITUTE_EXTENDED) != 0 &&
+             !star && ptr < repend - 2 && next == CHAR_COLON)
+          {
+          special = *(++ptr);
+          if (special != CHAR_PLUS && special != CHAR_MINUS)
+            {
+            rc = PCRE2_ERROR_BADSUBSTITUTION;
+            goto PTREXIT;
+            }
+
+          text1_start = ++ptr;
+          rc = find_text_end(code, &ptr, repend, special == CHAR_MINUS);
+          if (rc != 0) goto PTREXIT;
+          text1_end = ptr;
+
+          if (special == CHAR_PLUS && *ptr == CHAR_COLON)
+            {
+            text2_start = ++ptr;
+            rc = find_text_end(code, &ptr, repend, TRUE);
+            if (rc != 0) goto PTREXIT;
+            text2_end = ptr;
+            }
+          }
+
+        else
+          {
+          if (ptr >= repend || *ptr != CHAR_RIGHT_CURLY_BRACKET)
+            {
+            rc = PCRE2_ERROR_REPMISSINGBRACE;
+            goto PTREXIT;
+            }
+          }
+
+        ptr++;
+        }
+
+      /* Have found a syntactically correct group number or name, or *name.
+      Only *MARK is currently recognized. */
+
+      if (star)
+        {
+        if (PRIV(strcmp_c8)(name, STRING_MARK) == 0)
+          {
+          PCRE2_SPTR mark = pcre2_get_mark(match_data);
+          if (mark != NULL)
+            {
+            PCRE2_SPTR mark_start = mark;
+            while (*mark != 0) mark++;
+            fraglength = mark - mark_start;
+            CHECKMEMCPY(mark_start, fraglength);
+            }
+          }
+        else goto BAD;
+        }
+
+      /* Substitute the contents of a group. We don't use substring_copy
+      functions any more, in order to support case forcing. */
+
+      else
+        {
+        PCRE2_SPTR subptr, subptrend;
+
+        /* Find a number for a named group. In case there are duplicate names,
+        search for the first one that is set. If the name is not found when
+        PCRE2_SUBSTITUTE_UNKNOWN_EMPTY is set, set the group number to a
+        non-existent group. */
+
+        if (group < 0)
+          {
+          PCRE2_SPTR first, last, entry;
+          rc = pcre2_substring_nametable_scan(code, name, &first, &last);
+          if (rc == PCRE2_ERROR_NOSUBSTRING &&
+              (suboptions & PCRE2_SUBSTITUTE_UNKNOWN_UNSET) != 0)
+            {
+            group = code->top_bracket + 1;
+            }
+          else
+            {
+            if (rc < 0) goto PTREXIT;
+            for (entry = first; entry <= last; entry += rc)
+              {
+              uint32_t ng = GET2(entry, 0);
+              if (ng < ovector_count)
+                {
+                if (group < 0) group = ng;          /* First in ovector */
+                if (ovector[ng*2] != PCRE2_UNSET)
+                  {
+                  group = ng;                       /* First that is set */
+                  break;
+                  }
+                }
+              }
+
+            /* If group is still negative, it means we did not find a group
+            that is in the ovector. Just set the first group. */
+
+            if (group < 0) group = GET2(first, 0);
+            }
+          }
+
+        /* We now have a group that is identified by number. Find the length of
+        the captured string. If a group in a non-special substitution is unset
+        when PCRE2_SUBSTITUTE_UNSET_EMPTY is set, substitute nothing. */
+
+        rc = pcre2_substring_length_bynumber(match_data, group, &sublength);
+        if (rc < 0)
+          {
+          if (rc == PCRE2_ERROR_NOSUBSTRING &&
+              (suboptions & PCRE2_SUBSTITUTE_UNKNOWN_UNSET) != 0)
+            {
+            rc = PCRE2_ERROR_UNSET;
+            }
+          if (rc != PCRE2_ERROR_UNSET) goto PTREXIT;  /* Non-unset errors */
+          if (special == 0)                           /* Plain substitution */
+            {
+            if ((suboptions & PCRE2_SUBSTITUTE_UNSET_EMPTY) != 0) continue;
+            goto PTREXIT;                             /* Else error */
+            }
+          }
+
+        /* If special is '+' we have a 'set' and possibly an 'unset' text,
+        both of which are reprocessed when used. If special is '-' we have a
+        default text for when the group is unset; it must be reprocessed. */
+
+        if (special != 0)
+          {
+          if (special == CHAR_MINUS)
+            {
+            if (rc == 0) goto LITERAL_SUBSTITUTE;
+            text2_start = text1_start;
+            text2_end = text1_end;
+            }
+
+          if (ptrstackptr >= PTR_STACK_SIZE) goto BAD;
+          ptrstack[ptrstackptr++] = ptr;
+          ptrstack[ptrstackptr++] = repend;
+
+          if (rc == 0)
+            {
+            ptr = text1_start;
+            repend = text1_end;
+            }
+          else
+            {
+            ptr = text2_start;
+            repend = text2_end;
+            }
+          continue;
+          }
+
+        /* Otherwise we have a literal substitution of a group's contents. */
+
+        LITERAL_SUBSTITUTE:
+        subptr = subject + ovector[group*2];
+        subptrend = subject + ovector[group*2 + 1];
+
+        /* Substitute a literal string, possibly forcing alphabetic case. */
+
+        while (subptr < subptrend)
+          {
+          GETCHARINCTEST(ch, subptr);
+          if (forcecase != 0)
+            {
+#ifdef SUPPORT_UNICODE
+            if (utf)
+              {
+              uint32_t type = UCD_CHARTYPE(ch);
+              if (PRIV(ucp_gentype)[type] == ucp_L &&
+                  type != ((forcecase > 0)? ucp_Lu : ucp_Ll))
+                ch = UCD_OTHERCASE(ch);
+              }
+            else
+#endif
+              {
+              if (((code->tables + cbits_offset +
+                  ((forcecase > 0)? cbit_upper:cbit_lower)
+                  )[ch/8] & (1 << (ch%8))) == 0)
+                ch = (code->tables + fcc_offset)[ch];
+              }
+            forcecase = forcecasereset;
+            }
+
+#ifdef SUPPORT_UNICODE
+          if (utf) chlen = PRIV(ord2utf)(ch, temp); else
+#endif
+            {
+            temp[0] = ch;
+            chlen = 1;
+            }
+          CHECKMEMCPY(temp, chlen);
+          }
+        }
+      }
+
+    /* Handle an escape sequence in extended mode. We can use check_escape()
+    to process \Q, \E, \c, \o, \x and \ followed by non-alphanumerics, but
+    the case-forcing escapes are not supported in pcre2_compile() so must be
+    recognized here. */
+
+    else if ((suboptions & PCRE2_SUBSTITUTE_EXTENDED) != 0 &&
+              *ptr == CHAR_BACKSLASH)
+      {
+      int errorcode = 0;
+
+      if (ptr < repend - 1) switch (ptr[1])
+        {
+        case CHAR_L:
+        forcecase = forcecasereset = -1;
+        ptr += 2;
+        continue;
+
+        case CHAR_l:
+        forcecase = -1;
+        forcecasereset = 0;
+        ptr += 2;
+        continue;
+
+        case CHAR_U:
+        forcecase = forcecasereset = 1;
+        ptr += 2;
+        continue;
+
+        case CHAR_u:
+        forcecase = 1;
+        forcecasereset = 0;
+        ptr += 2;
+        continue;
+
+        default:
+        break;
+        }
+
+      rc = PRIV(check_escape)(&ptr, repend, &ch, &errorcode,
+        code->overall_options, FALSE, NULL);
+      if (errorcode != 0) goto BADESCAPE;
+      ptr++;
+
+      switch(rc)
+        {
+        case ESC_E:
+        forcecase = forcecasereset = 0;
+        continue;
+
+        case ESC_Q:
+        literal = TRUE;
+        continue;
+
+        case 0:      /* Data character */
+        goto LITERAL;
+
+        default:
+        goto BADESCAPE;
+        }
+      }
+
+    /* Handle a literal code unit */
+
+    else
+      {
+      LOADLITERAL:
+      GETCHARINCTEST(ch, ptr);    /* Get character value, increment pointer */
+
+      LITERAL:
+      if (forcecase != 0)
+        {
+#ifdef SUPPORT_UNICODE
+        if (utf)
+          {
+          uint32_t type = UCD_CHARTYPE(ch);
+          if (PRIV(ucp_gentype)[type] == ucp_L &&
+              type != ((forcecase > 0)? ucp_Lu : ucp_Ll))
+            ch = UCD_OTHERCASE(ch);
+          }
+        else
+#endif
+          {
+          if (((code->tables + cbits_offset +
+              ((forcecase > 0)? cbit_upper:cbit_lower)
+              )[ch/8] & (1 << (ch%8))) == 0)
+            ch = (code->tables + fcc_offset)[ch];
+          }
+        forcecase = forcecasereset;
+        }
+
+#ifdef SUPPORT_UNICODE
+      if (utf) chlen = PRIV(ord2utf)(ch, temp); else
+#endif
+        {
+        temp[0] = ch;
+        chlen = 1;
+        }
+      CHECKMEMCPY(temp, chlen);
+      } /* End handling a literal code unit */
+    }   /* End of loop for scanning the replacement. */
+
+  /* The replacement has been copied to the output. Update the start offset to
+  point to the rest of the subject string. If we matched an empty string,
+  do the magic for global matches. */
+
+  start_offset = ovector[1];
+  goptions = (ovector[0] != ovector[1])? 0 :
+    PCRE2_ANCHORED|PCRE2_NOTEMPTY_ATSTART;
+  } while ((suboptions & PCRE2_SUBSTITUTE_GLOBAL) != 0);  /* Repeat "do" loop */
+
+/* Copy the rest of the subject. */
+
+fraglength = length - start_offset;
+CHECKMEMCPY(subject + start_offset, fraglength);
+temp[0] = 0;
+CHECKMEMCPY(temp , 1);
+
+/* If overflowed is set it means the PCRE2_SUBSTITUTE_OVERFLOW_LENGTH is set,
+and matching has carried on after a full buffer, in order to compute the length
+needed. Otherwise, an overflow generates an immediate error return. */
+
+if (overflowed)
+  {
+  rc = PCRE2_ERROR_NOMEMORY;
+  *blength = buff_length + extra_needed;
+  }
+
+/* After a successful execution, return the number of substitutions and set the
+length of buffer used, excluding the trailing zero. */
+
+else
+  {
+  rc = subs;
+  *blength = buff_offset - 1;
+  }
+
+EXIT:
+if (match_data_created) pcre2_match_data_free(match_data);
+  else match_data->rc = rc;
+return rc;
+
+NOROOM:
+rc = PCRE2_ERROR_NOMEMORY;
+goto EXIT;
+
+BAD:
+rc = PCRE2_ERROR_BADREPLACEMENT;
+goto PTREXIT;
+
+BADESCAPE:
+rc = PCRE2_ERROR_BADREPESCAPE;
+
+PTREXIT:
+*blength = (PCRE2_SIZE)(ptr - replacement);
+goto EXIT;
+}
+
+/* End of pcre2_substitute.c */
diff --git a/dist2/src/pcre2_substring.c b/dist2/src/pcre2_substring.c
new file mode 100644
index 0000000..58b504d
--- /dev/null
+++ b/dist2/src/pcre2_substring.c
@@ -0,0 +1,536 @@
+/*************************************************
+*      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
+     Original API code Copyright (c) 1997-2012 University of Cambridge
+         New API code Copyright (c) 2016 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.
+-----------------------------------------------------------------------------
+*/
+
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "pcre2_internal.h"
+
+
+
+/*************************************************
+*   Copy named captured string to given buffer   *
+*************************************************/
+
+/* This function copies a single captured substring into a given buffer,
+identifying it by name. If the regex permits duplicate names, the first
+substring that is set is chosen.
+
+Arguments:
+  match_data     points to the match data
+  stringname     the name of the required substring
+  buffer         where to put the substring
+  sizeptr        the size of the buffer, updated to the size of the substring
+
+Returns:         if successful: zero
+                 if not successful, a negative error code:
+                   (1) an error from nametable_scan()
+                   (2) an error from copy_bynumber()
+                   (3) PCRE2_ERROR_UNAVAILABLE: no group is in ovector
+                   (4) PCRE2_ERROR_UNSET: all named groups in ovector are unset
+*/
+
+PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION
+pcre2_substring_copy_byname(pcre2_match_data *match_data, PCRE2_SPTR stringname,
+  PCRE2_UCHAR *buffer, PCRE2_SIZE *sizeptr)
+{
+PCRE2_SPTR first, last, entry;
+int failrc, entrysize;
+if (match_data->matchedby == PCRE2_MATCHEDBY_DFA_INTERPRETER)
+  return PCRE2_ERROR_DFA_UFUNC;
+entrysize = pcre2_substring_nametable_scan(match_data->code, stringname,
+  &first, &last);
+if (entrysize < 0) return entrysize;
+failrc = PCRE2_ERROR_UNAVAILABLE;
+for (entry = first; entry <= last; entry += entrysize)
+  {
+  uint32_t n = GET2(entry, 0);
+  if (n < match_data->oveccount)
+    {
+    if (match_data->ovector[n*2] != PCRE2_UNSET)
+      return pcre2_substring_copy_bynumber(match_data, n, buffer, sizeptr);
+    failrc = PCRE2_ERROR_UNSET;
+    }
+  }
+return failrc;
+}
+
+
+
+/*************************************************
+*  Copy numbered captured string to given buffer *
+*************************************************/
+
+/* This function copies a single captured substring into a given buffer,
+identifying it by number.
+
+Arguments:
+  match_data     points to the match data
+  stringnumber   the number of the required substring
+  buffer         where to put the substring
+  sizeptr        the size of the buffer, updated to the size of the substring
+
+Returns:         if successful: 0
+                 if not successful, a negative error code:
+                   PCRE2_ERROR_NOMEMORY: buffer too small
+                   PCRE2_ERROR_NOSUBSTRING: no such substring
+                   PCRE2_ERROR_UNAVAILABLE: ovector too small
+                   PCRE2_ERROR_UNSET: substring is not set
+*/
+
+PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION
+pcre2_substring_copy_bynumber(pcre2_match_data *match_data,
+  uint32_t stringnumber, PCRE2_UCHAR *buffer, PCRE2_SIZE *sizeptr)
+{
+int rc;
+PCRE2_SIZE size;
+rc = pcre2_substring_length_bynumber(match_data, stringnumber, &size);
+if (rc < 0) return rc;
+if (size + 1 > *sizeptr) return PCRE2_ERROR_NOMEMORY;
+memcpy(buffer, match_data->subject + match_data->ovector[stringnumber*2],
+  CU2BYTES(size));
+buffer[size] = 0;
+*sizeptr = size;
+return 0;
+}
+
+
+
+/*************************************************
+*          Extract named captured string         *
+*************************************************/
+
+/* This function copies a single captured substring, identified by name, into
+new memory. If the regex permits duplicate names, the first substring that is
+set is chosen.
+
+Arguments:
+  match_data     pointer to match_data
+  stringname     the name of the required substring
+  stringptr      where to put the pointer to the new memory
+  sizeptr        where to put the length of the substring
+
+Returns:         if successful: zero
+                 if not successful, a negative value:
+                   (1) an error from nametable_scan()
+                   (2) an error from get_bynumber()
+                   (3) PCRE2_ERROR_UNAVAILABLE: no group is in ovector
+                   (4) PCRE2_ERROR_UNSET: all named groups in ovector are unset
+*/
+
+PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION
+pcre2_substring_get_byname(pcre2_match_data *match_data,
+  PCRE2_SPTR stringname, PCRE2_UCHAR **stringptr, PCRE2_SIZE *sizeptr)
+{
+PCRE2_SPTR first, last, entry;
+int failrc, entrysize;
+if (match_data->matchedby == PCRE2_MATCHEDBY_DFA_INTERPRETER)
+  return PCRE2_ERROR_DFA_UFUNC;
+entrysize = pcre2_substring_nametable_scan(match_data->code, stringname,
+  &first, &last);
+if (entrysize < 0) return entrysize;
+failrc = PCRE2_ERROR_UNAVAILABLE;
+for (entry = first; entry <= last; entry += entrysize)
+  {
+  uint32_t n = GET2(entry, 0);
+  if (n < match_data->oveccount)
+    {
+    if (match_data->ovector[n*2] != PCRE2_UNSET)
+      return pcre2_substring_get_bynumber(match_data, n, stringptr, sizeptr);
+    failrc = PCRE2_ERROR_UNSET;
+    }
+  }
+return failrc;
+}
+
+
+
+/*************************************************
+*      Extract captured string to new memory     *
+*************************************************/
+
+/* This function copies a single captured substring into a piece of new
+memory.
+
+Arguments:
+  match_data     points to match data
+  stringnumber   the number of the required substring
+  stringptr      where to put a pointer to the new memory
+  sizeptr        where to put the size of the substring
+
+Returns:         if successful: 0
+                 if not successful, a negative error code:
+                   PCRE2_ERROR_NOMEMORY: failed to get memory
+                   PCRE2_ERROR_NOSUBSTRING: no such substring
+                   PCRE2_ERROR_UNAVAILABLE: ovector too small
+                   PCRE2_ERROR_UNSET: substring is not set
+*/
+
+PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION
+pcre2_substring_get_bynumber(pcre2_match_data *match_data,
+  uint32_t stringnumber, PCRE2_UCHAR **stringptr, PCRE2_SIZE *sizeptr)
+{
+int rc;
+PCRE2_SIZE size;
+PCRE2_UCHAR *yield;
+rc = pcre2_substring_length_bynumber(match_data, stringnumber, &size);
+if (rc < 0) return rc;
+yield = PRIV(memctl_malloc)(sizeof(pcre2_memctl) +
+  (size + 1)*PCRE2_CODE_UNIT_WIDTH, (pcre2_memctl *)match_data);
+if (yield == NULL) return PCRE2_ERROR_NOMEMORY;
+yield = (PCRE2_UCHAR *)(((char *)yield) + sizeof(pcre2_memctl));
+memcpy(yield, match_data->subject + match_data->ovector[stringnumber*2],
+  CU2BYTES(size));
+yield[size] = 0;
+*stringptr = yield;
+*sizeptr = size;
+return 0;
+}
+
+
+
+/*************************************************
+*       Free memory obtained by get_substring    *
+*************************************************/
+
+/*
+Argument:     the result of a previous pcre2_substring_get_byxxx()
+Returns:      nothing
+*/
+
+PCRE2_EXP_DEFN void PCRE2_CALL_CONVENTION
+pcre2_substring_free(PCRE2_UCHAR *string)
+{
+pcre2_memctl *memctl = (pcre2_memctl *)((char *)string - sizeof(pcre2_memctl));
+memctl->free(memctl, memctl->memory_data);
+}
+
+
+
+/*************************************************
+*         Get length of a named substring        *
+*************************************************/
+
+/* This function returns the length of a named captured substring. If the regex
+permits duplicate names, the first substring that is set is chosen.
+
+Arguments:
+  match_data      pointer to match data
+  stringname      the name of the required substring
+  sizeptr         where to put the length
+
+Returns:          0 if successful, else a negative error number
+*/
+
+PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION
+pcre2_substring_length_byname(pcre2_match_data *match_data,
+  PCRE2_SPTR stringname, PCRE2_SIZE *sizeptr)
+{
+PCRE2_SPTR first, last, entry;
+int failrc, entrysize;
+if (match_data->matchedby == PCRE2_MATCHEDBY_DFA_INTERPRETER)
+  return PCRE2_ERROR_DFA_UFUNC;
+entrysize = pcre2_substring_nametable_scan(match_data->code, stringname,
+  &first, &last);
+if (entrysize < 0) return entrysize;
+failrc = PCRE2_ERROR_UNAVAILABLE;
+for (entry = first; entry <= last; entry += entrysize)
+  {
+  uint32_t n = GET2(entry, 0);
+  if (n < match_data->oveccount)
+    {
+    if (match_data->ovector[n*2] != PCRE2_UNSET)
+      return pcre2_substring_length_bynumber(match_data, n, sizeptr);
+    failrc = PCRE2_ERROR_UNSET;
+    }
+  }
+return failrc;
+}
+
+
+
+/*************************************************
+*        Get length of a numbered substring      *
+*************************************************/
+
+/* This function returns the length of a captured substring. If the start is
+beyond the end (which can happen when \K is used in an assertion), it sets the
+length to zero.
+
+Arguments:
+  match_data      pointer to match data
+  stringnumber    the number of the required substring
+  sizeptr         where to put the length, if not NULL
+
+Returns:         if successful: 0
+                 if not successful, a negative error code:
+                   PCRE2_ERROR_NOSUBSTRING: no such substring
+                   PCRE2_ERROR_UNAVAILABLE: ovector is too small
+                   PCRE2_ERROR_UNSET: substring is not set
+*/
+
+PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION
+pcre2_substring_length_bynumber(pcre2_match_data *match_data,
+  uint32_t stringnumber, PCRE2_SIZE *sizeptr)
+{
+PCRE2_SIZE left, right;
+int count = match_data->rc;
+if (count == PCRE2_ERROR_PARTIAL)
+  {
+  if (stringnumber > 0) return PCRE2_ERROR_PARTIAL;
+  count = 0;
+  }
+else if (count < 0) return count;            /* Match failed */
+
+if (match_data->matchedby != PCRE2_MATCHEDBY_DFA_INTERPRETER)
+  {
+  if (stringnumber > match_data->code->top_bracket)
+    return PCRE2_ERROR_NOSUBSTRING;
+  if (stringnumber >= match_data->oveccount)
+    return PCRE2_ERROR_UNAVAILABLE;
+  if (match_data->ovector[stringnumber*2] == PCRE2_UNSET)
+    return PCRE2_ERROR_UNSET;
+  }
+else  /* Matched using pcre2_dfa_match() */
+  {
+  if (stringnumber >= match_data->oveccount) return PCRE2_ERROR_UNAVAILABLE;
+  if (count != 0 && stringnumber >= (uint32_t)count) return PCRE2_ERROR_UNSET;
+  }
+
+left = match_data->ovector[stringnumber*2];
+right = match_data->ovector[stringnumber*2+1];
+if (sizeptr != NULL) *sizeptr = (left > right)? 0 : right - left;
+return 0;
+}
+
+
+
+/*************************************************
+*    Extract all captured strings to new memory  *
+*************************************************/
+
+/* This function gets one chunk of memory and builds a list of pointers and all
+the captured substrings in it. A NULL pointer is put on the end of the list.
+The substrings are zero-terminated, but also, if the final argument is
+non-NULL, a list of lengths is also returned. This allows binary data to be
+handled.
+
+Arguments:
+  match_data     points to the match data
+  listptr        set to point to the list of pointers
+  lengthsptr     set to point to the list of lengths (may be NULL)
+
+Returns:         if successful: 0
+                 if not successful, a negative error code:
+                   PCRE2_ERROR_NOMEMORY: failed to get memory,
+                   or a match failure code
+*/
+
+PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION
+pcre2_substring_list_get(pcre2_match_data *match_data, PCRE2_UCHAR ***listptr,
+  PCRE2_SIZE **lengthsptr)
+{
+int i, count, count2;
+PCRE2_SIZE size;
+PCRE2_SIZE *lensp;
+pcre2_memctl *memp;
+PCRE2_UCHAR **listp;
+PCRE2_UCHAR *sp;
+PCRE2_SIZE *ovector;
+
+if ((count = match_data->rc) < 0) return count;   /* Match failed */
+if (count == 0) count = match_data->oveccount;    /* Ovector too small */
+
+count2 = 2*count;
+ovector = match_data->ovector;
+size = sizeof(pcre2_memctl) + sizeof(PCRE2_UCHAR *);      /* For final NULL */
+if (lengthsptr != NULL) size += sizeof(PCRE2_SIZE) * count;  /* For lengths */
+
+for (i = 0; i < count2; i += 2)
+  {
+  size += sizeof(PCRE2_UCHAR *) + CU2BYTES(1);
+  if (ovector[i+1] > ovector[i]) size += CU2BYTES(ovector[i+1] - ovector[i]);
+  }
+
+memp = PRIV(memctl_malloc)(size, (pcre2_memctl *)match_data);
+if (memp == NULL) return PCRE2_ERROR_NOMEMORY;
+
+*listptr = listp = (PCRE2_UCHAR **)((char *)memp + sizeof(pcre2_memctl));
+lensp = (PCRE2_SIZE *)((char *)listp + sizeof(PCRE2_UCHAR *) * (count + 1));
+
+if (lengthsptr == NULL)
+  {
+  sp = (PCRE2_UCHAR *)lensp;
+  lensp = NULL;
+  }
+else
+  {
+  *lengthsptr = lensp;
+  sp = (PCRE2_UCHAR *)((char *)lensp + sizeof(PCRE2_SIZE) * count);
+  }
+
+for (i = 0; i < count2; i += 2)
+  {
+  size = (ovector[i+1] > ovector[i])? (ovector[i+1] - ovector[i]) : 0;
+  memcpy(sp, match_data->subject + ovector[i], CU2BYTES(size));
+  *listp++ = sp;
+  if (lensp != NULL) *lensp++ = size;
+  sp += size;
+  *sp++ = 0;
+  }
+
+*listp = NULL;
+return 0;
+}
+
+
+
+/*************************************************
+*   Free memory obtained by substring_list_get   *
+*************************************************/
+
+/*
+Argument:     the result of a previous pcre2_substring_list_get()
+Returns:      nothing
+*/
+
+PCRE2_EXP_DEFN void PCRE2_CALL_CONVENTION
+pcre2_substring_list_free(PCRE2_SPTR *list)
+{
+pcre2_memctl *memctl = (pcre2_memctl *)((char *)list - sizeof(pcre2_memctl));
+memctl->free(memctl, memctl->memory_data);
+}
+
+
+
+/*************************************************
+*     Find (multiple) entries for named string   *
+*************************************************/
+
+/* This function scans the nametable for a given name, using binary chop. It
+returns either two pointers to the entries in the table, or, if no pointers are
+given, the number of a unique group with the given name. If duplicate names are
+permitted, and the name is not unique, an error is generated.
+
+Arguments:
+  code        the compiled regex
+  stringname  the name whose entries required
+  firstptr    where to put the pointer to the first entry
+  lastptr     where to put the pointer to the last entry
+
+Returns:      PCRE2_ERROR_NOSUBSTRING if the name is not found
+              otherwise, if firstptr and lastptr are NULL:
+                a group number for a unique substring
+                else PCRE2_ERROR_NOUNIQUESUBSTRING
+              otherwise:
+                the length of each entry, having set firstptr and lastptr
+*/
+
+PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION
+pcre2_substring_nametable_scan(const pcre2_code *code, PCRE2_SPTR stringname,
+  PCRE2_SPTR *firstptr, PCRE2_SPTR *lastptr)
+{
+uint16_t bot = 0;
+uint16_t top = code->name_count;
+uint16_t entrysize = code->name_entry_size;
+PCRE2_SPTR nametable = (PCRE2_SPTR)((char *)code + sizeof(pcre2_real_code));
+
+while (top > bot)
+  {
+  uint16_t mid = (top + bot) / 2;
+  PCRE2_SPTR entry = nametable + entrysize*mid;
+  int c = PRIV(strcmp)(stringname, entry + IMM2_SIZE);
+  if (c == 0)
+    {
+    PCRE2_SPTR first;
+    PCRE2_SPTR last;
+    PCRE2_SPTR lastentry;
+    lastentry = nametable + entrysize * (code->name_count - 1);
+    first = last = entry;
+    while (first > nametable)
+      {
+      if (PRIV(strcmp)(stringname, (first - entrysize + IMM2_SIZE)) != 0) break;
+      first -= entrysize;
+      }
+    while (last < lastentry)
+      {
+      if (PRIV(strcmp)(stringname, (last + entrysize + IMM2_SIZE)) != 0) break;
+      last += entrysize;
+      }
+    if (firstptr == NULL) return (first == last)?
+      (int)GET2(entry, 0) : PCRE2_ERROR_NOUNIQUESUBSTRING;
+    *firstptr = first;
+    *lastptr = last;
+    return entrysize;
+    }
+  if (c > 0) bot = mid + 1; else top = mid;
+  }
+
+return PCRE2_ERROR_NOSUBSTRING;
+}
+
+
+/*************************************************
+*           Find number for named string         *
+*************************************************/
+
+/* This function is a convenience wrapper for pcre2_substring_nametable_scan()
+when it is known that names are unique. If there are duplicate names, it is not
+defined which number is returned.
+
+Arguments:
+  code        the compiled regex
+  stringname  the name whose number is required
+
+Returns:      the number of the named parenthesis, or a negative number
+                PCRE2_ERROR_NOSUBSTRING if not found
+                PCRE2_ERROR_NOUNIQUESUBSTRING if not unique
+*/
+
+PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION
+pcre2_substring_number_from_name(const pcre2_code *code,
+  PCRE2_SPTR stringname)
+{
+return pcre2_substring_nametable_scan(code, stringname, NULL, NULL);
+}
+
+/* End of pcre2_substring.c */
diff --git a/dist/pcre_tables.c b/dist2/src/pcre2_tables.c
similarity index 71%
rename from dist/pcre_tables.c
rename to dist2/src/pcre2_tables.c
index 4960af5..b945ed7 100644
--- a/dist/pcre_tables.c
+++ b/dist2/src/pcre2_tables.c
@@ -6,7 +6,8 @@
 and semantics are as close as possible to those of the Perl 5 language.
 
                        Written by Philip Hazel
-           Copyright (c) 1997-2012 University of Cambridge
+     Original API code Copyright (c) 1997-2012 University of Cambridge
+         New API code Copyright (c) 2016 University of Cambridge
 
 -----------------------------------------------------------------------------
 Redistribution and use in source and binary forms, with or without
@@ -37,47 +38,65 @@
 -----------------------------------------------------------------------------
 */
 
-#ifndef PCRE_INCLUDED
-
 /* 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. */
+PCRE code modules. The tables are also #included by the pcre2test program,
+which uses macros to change their names from _pcre2_xxx to xxxx, thereby
+avoiding name clashes with the library. In this case, PCRE2_PCRE2TEST is
+defined. */
 
-
+#ifndef PCRE2_PCRE2TEST           /* We're compiling the library */
 #ifdef HAVE_CONFIG_H
 #include "config.h"
 #endif
+#include "pcre2_internal.h"
+#endif /* PCRE2_PCRE2TEST */
 
-#include "pcre_internal.h"
-
-#endif /* PCRE_INCLUDED */
 
 /* 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 pcre_internal.h. */
+the definition is next to the definition of the opcodes in pcre2_internal.h.
+This is mode-dependent, so is skipped when this file is included by pcre2test. */
 
-const pcre_uint8 PRIV(OP_lengths)[] = { OP_LENGTHS };
+#ifndef PCRE2_PCRE2TEST
+const uint8_t PRIV(OP_lengths)[] = { OP_LENGTHS };
+#endif
 
 /* Tables of horizontal and vertical whitespace characters, suitable for
 adding to classes. */
 
-const pcre_uint32 PRIV(hspace_list)[] = { HSPACE_LIST };
-const pcre_uint32 PRIV(vspace_list)[] = { VSPACE_LIST };
+const uint32_t PRIV(hspace_list)[] = { HSPACE_LIST };
+const uint32_t PRIV(vspace_list)[] = { VSPACE_LIST };
 
+/* These tables are the pairs of delimiters that are valid for callout string
+arguments. For each starting delimiter there must be a matching ending
+delimiter, which in fact is different only for bracket-like delimiters. */
+
+const uint32_t PRIV(callout_start_delims)[] = {
+  CHAR_GRAVE_ACCENT, CHAR_APOSTROPHE, CHAR_QUOTATION_MARK,
+  CHAR_CIRCUMFLEX_ACCENT, CHAR_PERCENT_SIGN, CHAR_NUMBER_SIGN,
+  CHAR_DOLLAR_SIGN, CHAR_LEFT_CURLY_BRACKET, 0 };
+
+const uint32_t PRIV(callout_end_delims[]) = {
+  CHAR_GRAVE_ACCENT, CHAR_APOSTROPHE, CHAR_QUOTATION_MARK,
+  CHAR_CIRCUMFLEX_ACCENT, CHAR_PERCENT_SIGN, CHAR_NUMBER_SIGN,
+  CHAR_DOLLAR_SIGN, CHAR_RIGHT_CURLY_BRACKET, 0 };
 
 
 /*************************************************
 *           Tables for UTF-8 support             *
 *************************************************/
 
+/* These tables are required by pcre2test in 16- or 32-bit mode, as well
+as for the library in 8-bit mode, because pcre2test uses UTF-8 internally for
+handling wide characters. */
+
+#if defined PCRE2_PCRE2TEST || \
+   (defined SUPPORT_UNICODE && \
+    defined PCRE2_CODE_UNIT_WIDTH && \
+    PCRE2_CODE_UNIT_WIDTH == 8)
+
 /* These are the breakpoints for different numbers of bytes in a UTF-8
 character. */
 
-#if (defined SUPPORT_UTF && defined COMPILE_PCRE8) \
-  || (defined PCRE_INCLUDED && (defined SUPPORT_PCRE16 || defined SUPPORT_PCRE32))
-
-/* These tables are also required by pcretest in 16- or 32-bit mode. */
-
 const int PRIV(utf8_table1)[] =
   { 0x7f, 0x7ff, 0xffff, 0x1fffff, 0x3ffffff, 0x7fffffff};
 
@@ -92,19 +111,20 @@
 /* Table of the number of extra bytes, indexed by the first byte masked with
 0x3f. The highest number for a valid UTF-8 first byte is in fact 0x3d. */
 
-const pcre_uint8 PRIV(utf8_table4)[] = {
+const uint8_t PRIV(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 };
 
-#endif /* (SUPPORT_UTF && COMPILE_PCRE8) || (PCRE_INCLUDED && SUPPORT_PCRE[16|32])*/
+#endif /* UTF-8 support needed */
 
-#ifdef SUPPORT_UTF
+
+#ifdef SUPPORT_UNICODE
 
 /* Table to translate from particular type value to the general value. */
 
-const pcre_uint32 PRIV(ucp_gentype)[] = {
+const uint32_t PRIV(ucp_gentype)[] = {
   ucp_C, ucp_C, ucp_C, ucp_C, ucp_C,  /* Cc, Cf, Cn, Co, Cs */
   ucp_L, ucp_L, ucp_L, ucp_L, ucp_L,  /* Ll, Lu, Lm, Lo, Lt */
   ucp_M, ucp_M, ucp_M,                /* Mc, Me, Mn */
@@ -117,11 +137,11 @@
 
 /* This table encodes the rules for finding the end of an extended grapheme
 cluster. Every code point has a grapheme break property which is one of the
-ucp_gbXX values defined in ucp.h. The 2-dimensional table is indexed by the
-properties of two adjacent code points. The left property selects a word from
-the table, and the right property selects a bit from that word like this:
+ucp_gbXX values defined in pcre2_ucp.h. The 2-dimensional table is indexed by
+the properties of two adjacent code points. The left property selects a word
+from the table, and the right property selects a bit from that word like this:
 
-  ucp_gbtable[left-property] & (1 << right-property)
+  PRIV(ucp_gbtable)[left-property] & (1 << right-property)
 
 The value is non-zero if a grapheme break is NOT permitted between the relevant
 two code points. The breaking rules are as follows:
@@ -149,7 +169,7 @@
 7. Otherwise, break everywhere.
 */
 
-const pcre_uint32 PRIV(ucp_gbtable[]) = {
+const uint32_t PRIV(ucp_gbtable)[] = {
    (1<<ucp_gbLF),                                           /*  0 CR */
    0,                                                       /*  1 LF */
    0,                                                       /*  2 Control */
@@ -190,7 +210,7 @@
 };
 #endif /* SUPPORT_JIT */
 
-/* The pcre_utt[] table below translates Unicode property names into type and
+/* The PRIV(utt)[] table below translates Unicode property names into type and
 code values. It is searched by binary chop, so must be in collating sequence of
 name. Originally, the table contained pointers to the name strings in the first
 field of each entry. However, that leads to a large number of relocations when
@@ -207,6 +227,8 @@
 the regular expression pattern, we must use STR_ macros instead of literal
 strings to make sure that UTF-8 support works on EBCDIC platforms. */
 
+#define STRING_Ahom0 STR_A STR_h STR_o STR_m "\0"
+#define STRING_Anatolian_Hieroglyphs0 STR_A STR_n STR_a STR_t STR_o STR_l STR_i STR_a STR_n STR_UNDERSCORE STR_H STR_i STR_e STR_r STR_o STR_g STR_l STR_y STR_p STR_h STR_s "\0"
 #define STRING_Any0 STR_A STR_n STR_y "\0"
 #define STRING_Arabic0 STR_A STR_r STR_a STR_b STR_i STR_c "\0"
 #define STRING_Armenian0 STR_A STR_r STR_m STR_e STR_n STR_i STR_a STR_n "\0"
@@ -254,6 +276,7 @@
 #define STRING_Han0 STR_H STR_a STR_n "\0"
 #define STRING_Hangul0 STR_H STR_a STR_n STR_g STR_u STR_l "\0"
 #define STRING_Hanunoo0 STR_H STR_a STR_n STR_u STR_n STR_o STR_o "\0"
+#define STRING_Hatran0 STR_H STR_a STR_t STR_r STR_a STR_n "\0"
 #define STRING_Hebrew0 STR_H STR_e STR_b STR_r STR_e STR_w "\0"
 #define STRING_Hiragana0 STR_H STR_i STR_r STR_a STR_g STR_a STR_n STR_a "\0"
 #define STRING_Imperial_Aramaic0 STR_I STR_m STR_p STR_e STR_r STR_i STR_a STR_l STR_UNDERSCORE STR_A STR_r STR_a STR_m STR_a STR_i STR_c "\0"
@@ -301,6 +324,7 @@
 #define STRING_Modi0 STR_M STR_o STR_d STR_i "\0"
 #define STRING_Mongolian0 STR_M STR_o STR_n STR_g STR_o STR_l STR_i STR_a STR_n "\0"
 #define STRING_Mro0 STR_M STR_r STR_o "\0"
+#define STRING_Multani0 STR_M STR_u STR_l STR_t STR_a STR_n STR_i "\0"
 #define STRING_Myanmar0 STR_M STR_y STR_a STR_n STR_m STR_a STR_r "\0"
 #define STRING_N0 STR_N "\0"
 #define STRING_Nabataean0 STR_N STR_a STR_b STR_a STR_t STR_a STR_e STR_a STR_n "\0"
@@ -311,6 +335,7 @@
 #define STRING_No0 STR_N STR_o "\0"
 #define STRING_Ogham0 STR_O STR_g STR_h STR_a STR_m "\0"
 #define STRING_Ol_Chiki0 STR_O STR_l STR_UNDERSCORE STR_C STR_h STR_i STR_k STR_i "\0"
+#define STRING_Old_Hungarian0 STR_O STR_l STR_d STR_UNDERSCORE STR_H STR_u STR_n STR_g STR_a STR_r STR_i STR_a STR_n "\0"
 #define STRING_Old_Italic0 STR_O STR_l STR_d STR_UNDERSCORE STR_I STR_t STR_a STR_l STR_i STR_c "\0"
 #define STRING_Old_North_Arabian0 STR_O STR_l STR_d STR_UNDERSCORE STR_N STR_o STR_r STR_t STR_h STR_UNDERSCORE STR_A STR_r STR_a STR_b STR_i STR_a STR_n "\0"
 #define STRING_Old_Permic0 STR_O STR_l STR_d STR_UNDERSCORE STR_P STR_e STR_r STR_m STR_i STR_c "\0"
@@ -342,6 +367,7 @@
 #define STRING_Sharada0 STR_S STR_h STR_a STR_r STR_a STR_d STR_a "\0"
 #define STRING_Shavian0 STR_S STR_h STR_a STR_v STR_i STR_a STR_n "\0"
 #define STRING_Siddham0 STR_S STR_i STR_d STR_d STR_h STR_a STR_m "\0"
+#define STRING_SignWriting0 STR_S STR_i STR_g STR_n STR_W STR_r STR_i STR_t STR_i STR_n STR_g "\0"
 #define STRING_Sinhala0 STR_S STR_i STR_n STR_h STR_a STR_l STR_a "\0"
 #define STRING_Sk0 STR_S STR_k "\0"
 #define STRING_Sm0 STR_S STR_m "\0"
@@ -378,6 +404,8 @@
 #define STRING_Zs0 STR_Z STR_s "\0"
 
 const char PRIV(utt_names)[] =
+  STRING_Ahom0
+  STRING_Anatolian_Hieroglyphs0
   STRING_Any0
   STRING_Arabic0
   STRING_Armenian0
@@ -425,6 +453,7 @@
   STRING_Han0
   STRING_Hangul0
   STRING_Hanunoo0
+  STRING_Hatran0
   STRING_Hebrew0
   STRING_Hiragana0
   STRING_Imperial_Aramaic0
@@ -472,6 +501,7 @@
   STRING_Modi0
   STRING_Mongolian0
   STRING_Mro0
+  STRING_Multani0
   STRING_Myanmar0
   STRING_N0
   STRING_Nabataean0
@@ -482,6 +512,7 @@
   STRING_No0
   STRING_Ogham0
   STRING_Ol_Chiki0
+  STRING_Old_Hungarian0
   STRING_Old_Italic0
   STRING_Old_North_Arabian0
   STRING_Old_Permic0
@@ -513,6 +544,7 @@
   STRING_Sharada0
   STRING_Shavian0
   STRING_Siddham0
+  STRING_SignWriting0
   STRING_Sinhala0
   STRING_Sk0
   STRING_Sm0
@@ -549,179 +581,185 @@
   STRING_Zs0;
 
 const ucp_type_table PRIV(utt)[] = {
-  {   0, PT_ANY, 0 },
-  {   4, PT_SC, ucp_Arabic },
-  {  11, PT_SC, ucp_Armenian },
-  {  20, PT_SC, ucp_Avestan },
-  {  28, PT_SC, ucp_Balinese },
-  {  37, PT_SC, ucp_Bamum },
-  {  43, PT_SC, ucp_Bassa_Vah },
-  {  53, PT_SC, ucp_Batak },
-  {  59, PT_SC, ucp_Bengali },
-  {  67, PT_SC, ucp_Bopomofo },
-  {  76, PT_SC, ucp_Brahmi },
-  {  83, PT_SC, ucp_Braille },
-  {  91, PT_SC, ucp_Buginese },
-  { 100, PT_SC, ucp_Buhid },
-  { 106, PT_GC, ucp_C },
-  { 108, PT_SC, ucp_Canadian_Aboriginal },
-  { 128, PT_SC, ucp_Carian },
-  { 135, PT_SC, ucp_Caucasian_Albanian },
-  { 154, PT_PC, ucp_Cc },
-  { 157, PT_PC, ucp_Cf },
-  { 160, PT_SC, ucp_Chakma },
-  { 167, PT_SC, ucp_Cham },
-  { 172, PT_SC, ucp_Cherokee },
-  { 181, PT_PC, ucp_Cn },
-  { 184, PT_PC, ucp_Co },
-  { 187, PT_SC, ucp_Common },
-  { 194, PT_SC, ucp_Coptic },
-  { 201, PT_PC, ucp_Cs },
-  { 204, PT_SC, ucp_Cuneiform },
-  { 214, PT_SC, ucp_Cypriot },
-  { 222, PT_SC, ucp_Cyrillic },
-  { 231, PT_SC, ucp_Deseret },
-  { 239, PT_SC, ucp_Devanagari },
-  { 250, PT_SC, ucp_Duployan },
-  { 259, PT_SC, ucp_Egyptian_Hieroglyphs },
-  { 280, PT_SC, ucp_Elbasan },
-  { 288, PT_SC, ucp_Ethiopic },
-  { 297, PT_SC, ucp_Georgian },
-  { 306, PT_SC, ucp_Glagolitic },
-  { 317, PT_SC, ucp_Gothic },
-  { 324, PT_SC, ucp_Grantha },
-  { 332, PT_SC, ucp_Greek },
-  { 338, PT_SC, ucp_Gujarati },
-  { 347, PT_SC, ucp_Gurmukhi },
-  { 356, PT_SC, ucp_Han },
-  { 360, PT_SC, ucp_Hangul },
-  { 367, PT_SC, ucp_Hanunoo },
-  { 375, PT_SC, ucp_Hebrew },
-  { 382, PT_SC, ucp_Hiragana },
-  { 391, PT_SC, ucp_Imperial_Aramaic },
-  { 408, PT_SC, ucp_Inherited },
-  { 418, PT_SC, ucp_Inscriptional_Pahlavi },
-  { 440, PT_SC, ucp_Inscriptional_Parthian },
-  { 463, PT_SC, ucp_Javanese },
-  { 472, PT_SC, ucp_Kaithi },
-  { 479, PT_SC, ucp_Kannada },
-  { 487, PT_SC, ucp_Katakana },
-  { 496, PT_SC, ucp_Kayah_Li },
-  { 505, PT_SC, ucp_Kharoshthi },
-  { 516, PT_SC, ucp_Khmer },
-  { 522, PT_SC, ucp_Khojki },
-  { 529, PT_SC, ucp_Khudawadi },
-  { 539, PT_GC, ucp_L },
-  { 541, PT_LAMP, 0 },
-  { 544, PT_SC, ucp_Lao },
-  { 548, PT_SC, ucp_Latin },
-  { 554, PT_SC, ucp_Lepcha },
-  { 561, PT_SC, ucp_Limbu },
-  { 567, PT_SC, ucp_Linear_A },
-  { 576, PT_SC, ucp_Linear_B },
-  { 585, PT_SC, ucp_Lisu },
-  { 590, PT_PC, ucp_Ll },
-  { 593, PT_PC, ucp_Lm },
-  { 596, PT_PC, ucp_Lo },
-  { 599, PT_PC, ucp_Lt },
-  { 602, PT_PC, ucp_Lu },
-  { 605, PT_SC, ucp_Lycian },
-  { 612, PT_SC, ucp_Lydian },
-  { 619, PT_GC, ucp_M },
-  { 621, PT_SC, ucp_Mahajani },
-  { 630, PT_SC, ucp_Malayalam },
-  { 640, PT_SC, ucp_Mandaic },
-  { 648, PT_SC, ucp_Manichaean },
-  { 659, PT_PC, ucp_Mc },
-  { 662, PT_PC, ucp_Me },
-  { 665, PT_SC, ucp_Meetei_Mayek },
-  { 678, PT_SC, ucp_Mende_Kikakui },
-  { 692, PT_SC, ucp_Meroitic_Cursive },
-  { 709, PT_SC, ucp_Meroitic_Hieroglyphs },
-  { 730, PT_SC, ucp_Miao },
-  { 735, PT_PC, ucp_Mn },
-  { 738, PT_SC, ucp_Modi },
-  { 743, PT_SC, ucp_Mongolian },
-  { 753, PT_SC, ucp_Mro },
-  { 757, PT_SC, ucp_Myanmar },
-  { 765, PT_GC, ucp_N },
-  { 767, PT_SC, ucp_Nabataean },
-  { 777, PT_PC, ucp_Nd },
-  { 780, PT_SC, ucp_New_Tai_Lue },
-  { 792, PT_SC, ucp_Nko },
-  { 796, PT_PC, ucp_Nl },
-  { 799, PT_PC, ucp_No },
-  { 802, PT_SC, ucp_Ogham },
-  { 808, PT_SC, ucp_Ol_Chiki },
-  { 817, PT_SC, ucp_Old_Italic },
-  { 828, PT_SC, ucp_Old_North_Arabian },
-  { 846, PT_SC, ucp_Old_Permic },
-  { 857, PT_SC, ucp_Old_Persian },
-  { 869, PT_SC, ucp_Old_South_Arabian },
-  { 887, PT_SC, ucp_Old_Turkic },
-  { 898, PT_SC, ucp_Oriya },
-  { 904, PT_SC, ucp_Osmanya },
-  { 912, PT_GC, ucp_P },
-  { 914, PT_SC, ucp_Pahawh_Hmong },
-  { 927, PT_SC, ucp_Palmyrene },
-  { 937, PT_SC, ucp_Pau_Cin_Hau },
-  { 949, PT_PC, ucp_Pc },
-  { 952, PT_PC, ucp_Pd },
-  { 955, PT_PC, ucp_Pe },
-  { 958, PT_PC, ucp_Pf },
-  { 961, PT_SC, ucp_Phags_Pa },
-  { 970, PT_SC, ucp_Phoenician },
-  { 981, PT_PC, ucp_Pi },
-  { 984, PT_PC, ucp_Po },
-  { 987, PT_PC, ucp_Ps },
-  { 990, PT_SC, ucp_Psalter_Pahlavi },
-  { 1006, PT_SC, ucp_Rejang },
-  { 1013, PT_SC, ucp_Runic },
-  { 1019, PT_GC, ucp_S },
-  { 1021, PT_SC, ucp_Samaritan },
-  { 1031, PT_SC, ucp_Saurashtra },
-  { 1042, PT_PC, ucp_Sc },
-  { 1045, PT_SC, ucp_Sharada },
-  { 1053, PT_SC, ucp_Shavian },
-  { 1061, PT_SC, ucp_Siddham },
-  { 1069, PT_SC, ucp_Sinhala },
-  { 1077, PT_PC, ucp_Sk },
-  { 1080, PT_PC, ucp_Sm },
-  { 1083, PT_PC, ucp_So },
-  { 1086, PT_SC, ucp_Sora_Sompeng },
-  { 1099, PT_SC, ucp_Sundanese },
-  { 1109, PT_SC, ucp_Syloti_Nagri },
-  { 1122, PT_SC, ucp_Syriac },
-  { 1129, PT_SC, ucp_Tagalog },
-  { 1137, PT_SC, ucp_Tagbanwa },
-  { 1146, PT_SC, ucp_Tai_Le },
-  { 1153, PT_SC, ucp_Tai_Tham },
-  { 1162, PT_SC, ucp_Tai_Viet },
-  { 1171, PT_SC, ucp_Takri },
-  { 1177, PT_SC, ucp_Tamil },
-  { 1183, PT_SC, ucp_Telugu },
-  { 1190, PT_SC, ucp_Thaana },
-  { 1197, PT_SC, ucp_Thai },
-  { 1202, PT_SC, ucp_Tibetan },
-  { 1210, PT_SC, ucp_Tifinagh },
-  { 1219, PT_SC, ucp_Tirhuta },
-  { 1227, PT_SC, ucp_Ugaritic },
-  { 1236, PT_SC, ucp_Vai },
-  { 1240, PT_SC, ucp_Warang_Citi },
-  { 1252, PT_ALNUM, 0 },
-  { 1256, PT_PXSPACE, 0 },
-  { 1260, PT_SPACE, 0 },
-  { 1264, PT_UCNC, 0 },
-  { 1268, PT_WORD, 0 },
-  { 1272, PT_SC, ucp_Yi },
-  { 1275, PT_GC, ucp_Z },
-  { 1277, PT_PC, ucp_Zl },
-  { 1280, PT_PC, ucp_Zp },
-  { 1283, PT_PC, ucp_Zs }
+  {   0, PT_SC, ucp_Ahom },
+  {   5, PT_SC, ucp_Anatolian_Hieroglyphs },
+  {  27, PT_ANY, 0 },
+  {  31, PT_SC, ucp_Arabic },
+  {  38, PT_SC, ucp_Armenian },
+  {  47, PT_SC, ucp_Avestan },
+  {  55, PT_SC, ucp_Balinese },
+  {  64, PT_SC, ucp_Bamum },
+  {  70, PT_SC, ucp_Bassa_Vah },
+  {  80, PT_SC, ucp_Batak },
+  {  86, PT_SC, ucp_Bengali },
+  {  94, PT_SC, ucp_Bopomofo },
+  { 103, PT_SC, ucp_Brahmi },
+  { 110, PT_SC, ucp_Braille },
+  { 118, PT_SC, ucp_Buginese },
+  { 127, PT_SC, ucp_Buhid },
+  { 133, PT_GC, ucp_C },
+  { 135, PT_SC, ucp_Canadian_Aboriginal },
+  { 155, PT_SC, ucp_Carian },
+  { 162, PT_SC, ucp_Caucasian_Albanian },
+  { 181, PT_PC, ucp_Cc },
+  { 184, PT_PC, ucp_Cf },
+  { 187, PT_SC, ucp_Chakma },
+  { 194, PT_SC, ucp_Cham },
+  { 199, PT_SC, ucp_Cherokee },
+  { 208, PT_PC, ucp_Cn },
+  { 211, PT_PC, ucp_Co },
+  { 214, PT_SC, ucp_Common },
+  { 221, PT_SC, ucp_Coptic },
+  { 228, PT_PC, ucp_Cs },
+  { 231, PT_SC, ucp_Cuneiform },
+  { 241, PT_SC, ucp_Cypriot },
+  { 249, PT_SC, ucp_Cyrillic },
+  { 258, PT_SC, ucp_Deseret },
+  { 266, PT_SC, ucp_Devanagari },
+  { 277, PT_SC, ucp_Duployan },
+  { 286, PT_SC, ucp_Egyptian_Hieroglyphs },
+  { 307, PT_SC, ucp_Elbasan },
+  { 315, PT_SC, ucp_Ethiopic },
+  { 324, PT_SC, ucp_Georgian },
+  { 333, PT_SC, ucp_Glagolitic },
+  { 344, PT_SC, ucp_Gothic },
+  { 351, PT_SC, ucp_Grantha },
+  { 359, PT_SC, ucp_Greek },
+  { 365, PT_SC, ucp_Gujarati },
+  { 374, PT_SC, ucp_Gurmukhi },
+  { 383, PT_SC, ucp_Han },
+  { 387, PT_SC, ucp_Hangul },
+  { 394, PT_SC, ucp_Hanunoo },
+  { 402, PT_SC, ucp_Hatran },
+  { 409, PT_SC, ucp_Hebrew },
+  { 416, PT_SC, ucp_Hiragana },
+  { 425, PT_SC, ucp_Imperial_Aramaic },
+  { 442, PT_SC, ucp_Inherited },
+  { 452, PT_SC, ucp_Inscriptional_Pahlavi },
+  { 474, PT_SC, ucp_Inscriptional_Parthian },
+  { 497, PT_SC, ucp_Javanese },
+  { 506, PT_SC, ucp_Kaithi },
+  { 513, PT_SC, ucp_Kannada },
+  { 521, PT_SC, ucp_Katakana },
+  { 530, PT_SC, ucp_Kayah_Li },
+  { 539, PT_SC, ucp_Kharoshthi },
+  { 550, PT_SC, ucp_Khmer },
+  { 556, PT_SC, ucp_Khojki },
+  { 563, PT_SC, ucp_Khudawadi },
+  { 573, PT_GC, ucp_L },
+  { 575, PT_LAMP, 0 },
+  { 578, PT_SC, ucp_Lao },
+  { 582, PT_SC, ucp_Latin },
+  { 588, PT_SC, ucp_Lepcha },
+  { 595, PT_SC, ucp_Limbu },
+  { 601, PT_SC, ucp_Linear_A },
+  { 610, PT_SC, ucp_Linear_B },
+  { 619, PT_SC, ucp_Lisu },
+  { 624, PT_PC, ucp_Ll },
+  { 627, PT_PC, ucp_Lm },
+  { 630, PT_PC, ucp_Lo },
+  { 633, PT_PC, ucp_Lt },
+  { 636, PT_PC, ucp_Lu },
+  { 639, PT_SC, ucp_Lycian },
+  { 646, PT_SC, ucp_Lydian },
+  { 653, PT_GC, ucp_M },
+  { 655, PT_SC, ucp_Mahajani },
+  { 664, PT_SC, ucp_Malayalam },
+  { 674, PT_SC, ucp_Mandaic },
+  { 682, PT_SC, ucp_Manichaean },
+  { 693, PT_PC, ucp_Mc },
+  { 696, PT_PC, ucp_Me },
+  { 699, PT_SC, ucp_Meetei_Mayek },
+  { 712, PT_SC, ucp_Mende_Kikakui },
+  { 726, PT_SC, ucp_Meroitic_Cursive },
+  { 743, PT_SC, ucp_Meroitic_Hieroglyphs },
+  { 764, PT_SC, ucp_Miao },
+  { 769, PT_PC, ucp_Mn },
+  { 772, PT_SC, ucp_Modi },
+  { 777, PT_SC, ucp_Mongolian },
+  { 787, PT_SC, ucp_Mro },
+  { 791, PT_SC, ucp_Multani },
+  { 799, PT_SC, ucp_Myanmar },
+  { 807, PT_GC, ucp_N },
+  { 809, PT_SC, ucp_Nabataean },
+  { 819, PT_PC, ucp_Nd },
+  { 822, PT_SC, ucp_New_Tai_Lue },
+  { 834, PT_SC, ucp_Nko },
+  { 838, PT_PC, ucp_Nl },
+  { 841, PT_PC, ucp_No },
+  { 844, PT_SC, ucp_Ogham },
+  { 850, PT_SC, ucp_Ol_Chiki },
+  { 859, PT_SC, ucp_Old_Hungarian },
+  { 873, PT_SC, ucp_Old_Italic },
+  { 884, PT_SC, ucp_Old_North_Arabian },
+  { 902, PT_SC, ucp_Old_Permic },
+  { 913, PT_SC, ucp_Old_Persian },
+  { 925, PT_SC, ucp_Old_South_Arabian },
+  { 943, PT_SC, ucp_Old_Turkic },
+  { 954, PT_SC, ucp_Oriya },
+  { 960, PT_SC, ucp_Osmanya },
+  { 968, PT_GC, ucp_P },
+  { 970, PT_SC, ucp_Pahawh_Hmong },
+  { 983, PT_SC, ucp_Palmyrene },
+  { 993, PT_SC, ucp_Pau_Cin_Hau },
+  { 1005, PT_PC, ucp_Pc },
+  { 1008, PT_PC, ucp_Pd },
+  { 1011, PT_PC, ucp_Pe },
+  { 1014, PT_PC, ucp_Pf },
+  { 1017, PT_SC, ucp_Phags_Pa },
+  { 1026, PT_SC, ucp_Phoenician },
+  { 1037, PT_PC, ucp_Pi },
+  { 1040, PT_PC, ucp_Po },
+  { 1043, PT_PC, ucp_Ps },
+  { 1046, PT_SC, ucp_Psalter_Pahlavi },
+  { 1062, PT_SC, ucp_Rejang },
+  { 1069, PT_SC, ucp_Runic },
+  { 1075, PT_GC, ucp_S },
+  { 1077, PT_SC, ucp_Samaritan },
+  { 1087, PT_SC, ucp_Saurashtra },
+  { 1098, PT_PC, ucp_Sc },
+  { 1101, PT_SC, ucp_Sharada },
+  { 1109, PT_SC, ucp_Shavian },
+  { 1117, PT_SC, ucp_Siddham },
+  { 1125, PT_SC, ucp_SignWriting },
+  { 1137, PT_SC, ucp_Sinhala },
+  { 1145, PT_PC, ucp_Sk },
+  { 1148, PT_PC, ucp_Sm },
+  { 1151, PT_PC, ucp_So },
+  { 1154, PT_SC, ucp_Sora_Sompeng },
+  { 1167, PT_SC, ucp_Sundanese },
+  { 1177, PT_SC, ucp_Syloti_Nagri },
+  { 1190, PT_SC, ucp_Syriac },
+  { 1197, PT_SC, ucp_Tagalog },
+  { 1205, PT_SC, ucp_Tagbanwa },
+  { 1214, PT_SC, ucp_Tai_Le },
+  { 1221, PT_SC, ucp_Tai_Tham },
+  { 1230, PT_SC, ucp_Tai_Viet },
+  { 1239, PT_SC, ucp_Takri },
+  { 1245, PT_SC, ucp_Tamil },
+  { 1251, PT_SC, ucp_Telugu },
+  { 1258, PT_SC, ucp_Thaana },
+  { 1265, PT_SC, ucp_Thai },
+  { 1270, PT_SC, ucp_Tibetan },
+  { 1278, PT_SC, ucp_Tifinagh },
+  { 1287, PT_SC, ucp_Tirhuta },
+  { 1295, PT_SC, ucp_Ugaritic },
+  { 1304, PT_SC, ucp_Vai },
+  { 1308, PT_SC, ucp_Warang_Citi },
+  { 1320, PT_ALNUM, 0 },
+  { 1324, PT_PXSPACE, 0 },
+  { 1328, PT_SPACE, 0 },
+  { 1332, PT_UCNC, 0 },
+  { 1336, PT_WORD, 0 },
+  { 1340, PT_SC, ucp_Yi },
+  { 1343, PT_GC, ucp_Z },
+  { 1345, PT_PC, ucp_Zl },
+  { 1348, PT_PC, ucp_Zp },
+  { 1351, PT_PC, ucp_Zs }
 };
 
-const int PRIV(utt_size) = sizeof(PRIV(utt)) / sizeof(ucp_type_table);
+const size_t PRIV(utt_size) = sizeof(PRIV(utt)) / sizeof(ucp_type_table);
 
-#endif /* SUPPORT_UTF */
+#endif /* SUPPORT_UNICODE */
 
-/* End of pcre_tables.c */
+/* End of pcre2_tables.c */
diff --git a/dist2/src/pcre2_ucd.c b/dist2/src/pcre2_ucd.c
new file mode 100644
index 0000000..116f537
--- /dev/null
+++ b/dist2/src/pcre2_ucd.c
@@ -0,0 +1,3747 @@
+/* This module is generated by the maint/MultiStage2.py script.
+Do not modify it by hand. Instead modify the script and run it
+to regenerate this code.
+
+As well as being part of the PCRE2 library, this module is #included
+by the pcre2test program, which redefines the PRIV macro to change
+table names from _pcre2_xxx to xxxx, thereby avoiding name clashes
+with the library. At present, just one of these tables is actually
+needed. */
+
+#ifndef PCRE2_PCRE2TEST
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "pcre2_internal.h"
+
+#endif /* PCRE2_PCRE2TEST */
+
+/* Unicode character database. */
+/* This file was autogenerated by the MultiStage2.py script. */
+/* Total size: 75072 bytes, block size: 128. */
+
+/* The tables herein are needed only when UCP support is built,
+and in PCRE2 that happens automatically with UTF support.
+This module should not be referenced otherwise, so
+it should not matter whether it is compiled or not. However
+a comment was received about space saving - maybe the guy linked
+all the modules rather than using a library - so we include a
+condition to cut out the tables when not needed. But don't leave
+a totally empty module because some compilers barf at that.
+Instead, just supply small dummy tables. */
+
+#ifndef SUPPORT_UNICODE
+const ucd_record PRIV(ucd_records)[] = {{0,0,0,0,0 }};
+const uint8_t PRIV(ucd_stage1)[] = {0};
+const uint16_t PRIV(ucd_stage2)[] = {0};
+const uint32_t PRIV(ucd_caseless_sets)[] = {0};
+#else
+
+const char *PRIV(unicode_version) = "8.0.0";
+
+/* When recompiling tables with a new Unicode version, please check the
+types in this structure definition from pcre2_internal.h (the actual
+field names will be different):
+
+typedef struct {
+uint8_t property_0;
+uint8_t property_1;
+uint8_t property_2;
+uint8_t property_3;
+pcre_int32 property_4;
+} ucd_record;
+*/
+
+
+const uint32_t PRIV(ucd_caseless_sets)[] = {
+  NOTACHAR,
+  0x0053,   0x0073,   0x017f,   NOTACHAR,
+  0x01c4,   0x01c5,   0x01c6,   NOTACHAR,
+  0x01c7,   0x01c8,   0x01c9,   NOTACHAR,
+  0x01ca,   0x01cb,   0x01cc,   NOTACHAR,
+  0x01f1,   0x01f2,   0x01f3,   NOTACHAR,
+  0x0345,   0x0399,   0x03b9,   0x1fbe,   NOTACHAR,
+  0x00b5,   0x039c,   0x03bc,   NOTACHAR,
+  0x03a3,   0x03c2,   0x03c3,   NOTACHAR,
+  0x0392,   0x03b2,   0x03d0,   NOTACHAR,
+  0x0398,   0x03b8,   0x03d1,   0x03f4,   NOTACHAR,
+  0x03a6,   0x03c6,   0x03d5,   NOTACHAR,
+  0x03a0,   0x03c0,   0x03d6,   NOTACHAR,
+  0x039a,   0x03ba,   0x03f0,   NOTACHAR,
+  0x03a1,   0x03c1,   0x03f1,   NOTACHAR,
+  0x0395,   0x03b5,   0x03f5,   NOTACHAR,
+  0x1e60,   0x1e61,   0x1e9b,   NOTACHAR,
+  0x03a9,   0x03c9,   0x2126,   NOTACHAR,
+  0x004b,   0x006b,   0x212a,   NOTACHAR,
+  0x00c5,   0x00e5,   0x212b,   NOTACHAR,
+};
+
+/* When #included in pcre2test, we don't need this large table. */
+
+#ifndef PCRE2_PCRE2TEST
+
+const ucd_record PRIV(ucd_records)[] = { /* 5952 bytes, record size 8 */
+  {     9,      0,      2,      0,      0, }, /*   0 */
+  {     9,      0,      1,      0,      0, }, /*   1 */
+  {     9,      0,      0,      0,      0, }, /*   2 */
+  {     9,     29,     12,      0,      0, }, /*   3 */
+  {     9,     21,     12,      0,      0, }, /*   4 */
+  {     9,     23,     12,      0,      0, }, /*   5 */
+  {     9,     22,     12,      0,      0, }, /*   6 */
+  {     9,     18,     12,      0,      0, }, /*   7 */
+  {     9,     25,     12,      0,      0, }, /*   8 */
+  {     9,     17,     12,      0,      0, }, /*   9 */
+  {     9,     13,     12,      0,      0, }, /*  10 */
+  {    33,      9,     12,      0,     32, }, /*  11 */
+  {    33,      9,     12,     71,     32, }, /*  12 */
+  {    33,      9,     12,      1,     32, }, /*  13 */
+  {     9,     24,     12,      0,      0, }, /*  14 */
+  {     9,     16,     12,      0,      0, }, /*  15 */
+  {    33,      5,     12,      0,    -32, }, /*  16 */
+  {    33,      5,     12,     71,    -32, }, /*  17 */
+  {    33,      5,     12,      1,    -32, }, /*  18 */
+  {     9,     26,     12,      0,      0, }, /*  19 */
+  {    33,      7,     12,      0,      0, }, /*  20 */
+  {     9,     20,     12,      0,      0, }, /*  21 */
+  {     9,      1,      2,      0,      0, }, /*  22 */
+  {     9,     15,     12,      0,      0, }, /*  23 */
+  {     9,      5,     12,     26,    775, }, /*  24 */
+  {     9,     19,     12,      0,      0, }, /*  25 */
+  {    33,      9,     12,     75,     32, }, /*  26 */
+  {    33,      5,     12,      0,   7615, }, /*  27 */
+  {    33,      5,     12,     75,    -32, }, /*  28 */
+  {    33,      5,     12,      0,    121, }, /*  29 */
+  {    33,      9,     12,      0,      1, }, /*  30 */
+  {    33,      5,     12,      0,     -1, }, /*  31 */
+  {    33,      9,     12,      0,      0, }, /*  32 */
+  {    33,      5,     12,      0,      0, }, /*  33 */
+  {    33,      9,     12,      0,   -121, }, /*  34 */
+  {    33,      5,     12,      1,   -268, }, /*  35 */
+  {    33,      5,     12,      0,    195, }, /*  36 */
+  {    33,      9,     12,      0,    210, }, /*  37 */
+  {    33,      9,     12,      0,    206, }, /*  38 */
+  {    33,      9,     12,      0,    205, }, /*  39 */
+  {    33,      9,     12,      0,     79, }, /*  40 */
+  {    33,      9,     12,      0,    202, }, /*  41 */
+  {    33,      9,     12,      0,    203, }, /*  42 */
+  {    33,      9,     12,      0,    207, }, /*  43 */
+  {    33,      5,     12,      0,     97, }, /*  44 */
+  {    33,      9,     12,      0,    211, }, /*  45 */
+  {    33,      9,     12,      0,    209, }, /*  46 */
+  {    33,      5,     12,      0,    163, }, /*  47 */
+  {    33,      9,     12,      0,    213, }, /*  48 */
+  {    33,      5,     12,      0,    130, }, /*  49 */
+  {    33,      9,     12,      0,    214, }, /*  50 */
+  {    33,      9,     12,      0,    218, }, /*  51 */
+  {    33,      9,     12,      0,    217, }, /*  52 */
+  {    33,      9,     12,      0,    219, }, /*  53 */
+  {    33,      5,     12,      0,     56, }, /*  54 */
+  {    33,      9,     12,      5,      2, }, /*  55 */
+  {    33,      8,     12,      5,      1, }, /*  56 */
+  {    33,      5,     12,      5,     -2, }, /*  57 */
+  {    33,      9,     12,      9,      2, }, /*  58 */
+  {    33,      8,     12,      9,      1, }, /*  59 */
+  {    33,      5,     12,      9,     -2, }, /*  60 */
+  {    33,      9,     12,     13,      2, }, /*  61 */
+  {    33,      8,     12,     13,      1, }, /*  62 */
+  {    33,      5,     12,     13,     -2, }, /*  63 */
+  {    33,      5,     12,      0,    -79, }, /*  64 */
+  {    33,      9,     12,     17,      2, }, /*  65 */
+  {    33,      8,     12,     17,      1, }, /*  66 */
+  {    33,      5,     12,     17,     -2, }, /*  67 */
+  {    33,      9,     12,      0,    -97, }, /*  68 */
+  {    33,      9,     12,      0,    -56, }, /*  69 */
+  {    33,      9,     12,      0,   -130, }, /*  70 */
+  {    33,      9,     12,      0,  10795, }, /*  71 */
+  {    33,      9,     12,      0,   -163, }, /*  72 */
+  {    33,      9,     12,      0,  10792, }, /*  73 */
+  {    33,      5,     12,      0,  10815, }, /*  74 */
+  {    33,      9,     12,      0,   -195, }, /*  75 */
+  {    33,      9,     12,      0,     69, }, /*  76 */
+  {    33,      9,     12,      0,     71, }, /*  77 */
+  {    33,      5,     12,      0,  10783, }, /*  78 */
+  {    33,      5,     12,      0,  10780, }, /*  79 */
+  {    33,      5,     12,      0,  10782, }, /*  80 */
+  {    33,      5,     12,      0,   -210, }, /*  81 */
+  {    33,      5,     12,      0,   -206, }, /*  82 */
+  {    33,      5,     12,      0,   -205, }, /*  83 */
+  {    33,      5,     12,      0,   -202, }, /*  84 */
+  {    33,      5,     12,      0,   -203, }, /*  85 */
+  {    33,      5,     12,      0,  42319, }, /*  86 */
+  {    33,      5,     12,      0,  42315, }, /*  87 */
+  {    33,      5,     12,      0,   -207, }, /*  88 */
+  {    33,      5,     12,      0,  42280, }, /*  89 */
+  {    33,      5,     12,      0,  42308, }, /*  90 */
+  {    33,      5,     12,      0,   -209, }, /*  91 */
+  {    33,      5,     12,      0,   -211, }, /*  92 */
+  {    33,      5,     12,      0,  10743, }, /*  93 */
+  {    33,      5,     12,      0,  42305, }, /*  94 */
+  {    33,      5,     12,      0,  10749, }, /*  95 */
+  {    33,      5,     12,      0,   -213, }, /*  96 */
+  {    33,      5,     12,      0,   -214, }, /*  97 */
+  {    33,      5,     12,      0,  10727, }, /*  98 */
+  {    33,      5,     12,      0,   -218, }, /*  99 */
+  {    33,      5,     12,      0,  42282, }, /* 100 */
+  {    33,      5,     12,      0,    -69, }, /* 101 */
+  {    33,      5,     12,      0,   -217, }, /* 102 */
+  {    33,      5,     12,      0,    -71, }, /* 103 */
+  {    33,      5,     12,      0,   -219, }, /* 104 */
+  {    33,      5,     12,      0,  42261, }, /* 105 */
+  {    33,      5,     12,      0,  42258, }, /* 106 */
+  {    33,      6,     12,      0,      0, }, /* 107 */
+  {     9,      6,     12,      0,      0, }, /* 108 */
+  {     3,     24,     12,      0,      0, }, /* 109 */
+  {    27,     12,      3,      0,      0, }, /* 110 */
+  {    27,     12,      3,     21,    116, }, /* 111 */
+  {    19,      9,     12,      0,      1, }, /* 112 */
+  {    19,      5,     12,      0,     -1, }, /* 113 */
+  {    19,     24,     12,      0,      0, }, /* 114 */
+  {     9,      2,     12,      0,      0, }, /* 115 */
+  {    19,      6,     12,      0,      0, }, /* 116 */
+  {    19,      5,     12,      0,    130, }, /* 117 */
+  {    19,      9,     12,      0,    116, }, /* 118 */
+  {    19,      9,     12,      0,     38, }, /* 119 */
+  {    19,      9,     12,      0,     37, }, /* 120 */
+  {    19,      9,     12,      0,     64, }, /* 121 */
+  {    19,      9,     12,      0,     63, }, /* 122 */
+  {    19,      5,     12,      0,      0, }, /* 123 */
+  {    19,      9,     12,      0,     32, }, /* 124 */
+  {    19,      9,     12,     34,     32, }, /* 125 */
+  {    19,      9,     12,     59,     32, }, /* 126 */
+  {    19,      9,     12,     38,     32, }, /* 127 */
+  {    19,      9,     12,     21,     32, }, /* 128 */
+  {    19,      9,     12,     51,     32, }, /* 129 */
+  {    19,      9,     12,     26,     32, }, /* 130 */
+  {    19,      9,     12,     47,     32, }, /* 131 */
+  {    19,      9,     12,     55,     32, }, /* 132 */
+  {    19,      9,     12,     30,     32, }, /* 133 */
+  {    19,      9,     12,     43,     32, }, /* 134 */
+  {    19,      9,     12,     67,     32, }, /* 135 */
+  {    19,      5,     12,      0,    -38, }, /* 136 */
+  {    19,      5,     12,      0,    -37, }, /* 137 */
+  {    19,      5,     12,      0,    -32, }, /* 138 */
+  {    19,      5,     12,     34,    -32, }, /* 139 */
+  {    19,      5,     12,     59,    -32, }, /* 140 */
+  {    19,      5,     12,     38,    -32, }, /* 141 */
+  {    19,      5,     12,     21,   -116, }, /* 142 */
+  {    19,      5,     12,     51,    -32, }, /* 143 */
+  {    19,      5,     12,     26,   -775, }, /* 144 */
+  {    19,      5,     12,     47,    -32, }, /* 145 */
+  {    19,      5,     12,     55,    -32, }, /* 146 */
+  {    19,      5,     12,     30,      1, }, /* 147 */
+  {    19,      5,     12,     30,    -32, }, /* 148 */
+  {    19,      5,     12,     43,    -32, }, /* 149 */
+  {    19,      5,     12,     67,    -32, }, /* 150 */
+  {    19,      5,     12,      0,    -64, }, /* 151 */
+  {    19,      5,     12,      0,    -63, }, /* 152 */
+  {    19,      9,     12,      0,      8, }, /* 153 */
+  {    19,      5,     12,     34,    -30, }, /* 154 */
+  {    19,      5,     12,     38,    -25, }, /* 155 */
+  {    19,      9,     12,      0,      0, }, /* 156 */
+  {    19,      5,     12,     43,    -15, }, /* 157 */
+  {    19,      5,     12,     47,    -22, }, /* 158 */
+  {    19,      5,     12,      0,     -8, }, /* 159 */
+  {    10,      9,     12,      0,      1, }, /* 160 */
+  {    10,      5,     12,      0,     -1, }, /* 161 */
+  {    19,      5,     12,     51,    -54, }, /* 162 */
+  {    19,      5,     12,     55,    -48, }, /* 163 */
+  {    19,      5,     12,      0,      7, }, /* 164 */
+  {    19,      5,     12,      0,   -116, }, /* 165 */
+  {    19,      9,     12,     38,    -60, }, /* 166 */
+  {    19,      5,     12,     59,    -64, }, /* 167 */
+  {    19,     25,     12,      0,      0, }, /* 168 */
+  {    19,      9,     12,      0,     -7, }, /* 169 */
+  {    19,      9,     12,      0,   -130, }, /* 170 */
+  {    12,      9,     12,      0,     80, }, /* 171 */
+  {    12,      9,     12,      0,     32, }, /* 172 */
+  {    12,      5,     12,      0,    -32, }, /* 173 */
+  {    12,      5,     12,      0,    -80, }, /* 174 */
+  {    12,      9,     12,      0,      1, }, /* 175 */
+  {    12,      5,     12,      0,     -1, }, /* 176 */
+  {    12,     26,     12,      0,      0, }, /* 177 */
+  {    12,     12,      3,      0,      0, }, /* 178 */
+  {    12,     11,      3,      0,      0, }, /* 179 */
+  {    12,      9,     12,      0,     15, }, /* 180 */
+  {    12,      5,     12,      0,    -15, }, /* 181 */
+  {     1,      9,     12,      0,     48, }, /* 182 */
+  {     1,      6,     12,      0,      0, }, /* 183 */
+  {     1,     21,     12,      0,      0, }, /* 184 */
+  {     1,      5,     12,      0,    -48, }, /* 185 */
+  {     1,      5,     12,      0,      0, }, /* 186 */
+  {     1,     17,     12,      0,      0, }, /* 187 */
+  {     1,     26,     12,      0,      0, }, /* 188 */
+  {     1,     23,     12,      0,      0, }, /* 189 */
+  {    25,     12,      3,      0,      0, }, /* 190 */
+  {    25,     17,     12,      0,      0, }, /* 191 */
+  {    25,     21,     12,      0,      0, }, /* 192 */
+  {    25,      7,     12,      0,      0, }, /* 193 */
+  {     0,      1,      2,      0,      0, }, /* 194 */
+  {     0,     25,     12,      0,      0, }, /* 195 */
+  {     0,     21,     12,      0,      0, }, /* 196 */
+  {     0,     23,     12,      0,      0, }, /* 197 */
+  {     0,     26,     12,      0,      0, }, /* 198 */
+  {     0,     12,      3,      0,      0, }, /* 199 */
+  {     0,      7,     12,      0,      0, }, /* 200 */
+  {     0,     13,     12,      0,      0, }, /* 201 */
+  {     0,      6,     12,      0,      0, }, /* 202 */
+  {    49,     21,     12,      0,      0, }, /* 203 */
+  {    49,      1,      2,      0,      0, }, /* 204 */
+  {    49,      7,     12,      0,      0, }, /* 205 */
+  {    49,     12,      3,      0,      0, }, /* 206 */
+  {    55,      7,     12,      0,      0, }, /* 207 */
+  {    55,     12,      3,      0,      0, }, /* 208 */
+  {    63,     13,     12,      0,      0, }, /* 209 */
+  {    63,      7,     12,      0,      0, }, /* 210 */
+  {    63,     12,      3,      0,      0, }, /* 211 */
+  {    63,      6,     12,      0,      0, }, /* 212 */
+  {    63,     26,     12,      0,      0, }, /* 213 */
+  {    63,     21,     12,      0,      0, }, /* 214 */
+  {    89,      7,     12,      0,      0, }, /* 215 */
+  {    89,     12,      3,      0,      0, }, /* 216 */
+  {    89,      6,     12,      0,      0, }, /* 217 */
+  {    89,     21,     12,      0,      0, }, /* 218 */
+  {    94,      7,     12,      0,      0, }, /* 219 */
+  {    94,     12,      3,      0,      0, }, /* 220 */
+  {    94,     21,     12,      0,      0, }, /* 221 */
+  {    14,     12,      3,      0,      0, }, /* 222 */
+  {    14,     10,      5,      0,      0, }, /* 223 */
+  {    14,      7,     12,      0,      0, }, /* 224 */
+  {    14,     13,     12,      0,      0, }, /* 225 */
+  {    14,     21,     12,      0,      0, }, /* 226 */
+  {    14,      6,     12,      0,      0, }, /* 227 */
+  {     2,      7,     12,      0,      0, }, /* 228 */
+  {     2,     12,      3,      0,      0, }, /* 229 */
+  {     2,     10,      5,      0,      0, }, /* 230 */
+  {     2,     10,      3,      0,      0, }, /* 231 */
+  {     2,     13,     12,      0,      0, }, /* 232 */
+  {     2,     23,     12,      0,      0, }, /* 233 */
+  {     2,     15,     12,      0,      0, }, /* 234 */
+  {     2,     26,     12,      0,      0, }, /* 235 */
+  {    21,     12,      3,      0,      0, }, /* 236 */
+  {    21,     10,      5,      0,      0, }, /* 237 */
+  {    21,      7,     12,      0,      0, }, /* 238 */
+  {    21,     13,     12,      0,      0, }, /* 239 */
+  {    20,     12,      3,      0,      0, }, /* 240 */
+  {    20,     10,      5,      0,      0, }, /* 241 */
+  {    20,      7,     12,      0,      0, }, /* 242 */
+  {    20,     13,     12,      0,      0, }, /* 243 */
+  {    20,     21,     12,      0,      0, }, /* 244 */
+  {    20,     23,     12,      0,      0, }, /* 245 */
+  {    43,     12,      3,      0,      0, }, /* 246 */
+  {    43,     10,      5,      0,      0, }, /* 247 */
+  {    43,      7,     12,      0,      0, }, /* 248 */
+  {    43,     10,      3,      0,      0, }, /* 249 */
+  {    43,     13,     12,      0,      0, }, /* 250 */
+  {    43,     26,     12,      0,      0, }, /* 251 */
+  {    43,     15,     12,      0,      0, }, /* 252 */
+  {    53,     12,      3,      0,      0, }, /* 253 */
+  {    53,      7,     12,      0,      0, }, /* 254 */
+  {    53,     10,      3,      0,      0, }, /* 255 */
+  {    53,     10,      5,      0,      0, }, /* 256 */
+  {    53,     13,     12,      0,      0, }, /* 257 */
+  {    53,     15,     12,      0,      0, }, /* 258 */
+  {    53,     26,     12,      0,      0, }, /* 259 */
+  {    53,     23,     12,      0,      0, }, /* 260 */
+  {    54,     12,      3,      0,      0, }, /* 261 */
+  {    54,     10,      5,      0,      0, }, /* 262 */
+  {    54,      7,     12,      0,      0, }, /* 263 */
+  {    54,     13,     12,      0,      0, }, /* 264 */
+  {    54,     15,     12,      0,      0, }, /* 265 */
+  {    54,     26,     12,      0,      0, }, /* 266 */
+  {    28,     12,      3,      0,      0, }, /* 267 */
+  {    28,     10,      5,      0,      0, }, /* 268 */
+  {    28,      7,     12,      0,      0, }, /* 269 */
+  {    28,     10,      3,      0,      0, }, /* 270 */
+  {    28,     13,     12,      0,      0, }, /* 271 */
+  {    36,     12,      3,      0,      0, }, /* 272 */
+  {    36,     10,      5,      0,      0, }, /* 273 */
+  {    36,      7,     12,      0,      0, }, /* 274 */
+  {    36,     10,      3,      0,      0, }, /* 275 */
+  {    36,     13,     12,      0,      0, }, /* 276 */
+  {    36,     15,     12,      0,      0, }, /* 277 */
+  {    36,     26,     12,      0,      0, }, /* 278 */
+  {    47,     10,      5,      0,      0, }, /* 279 */
+  {    47,      7,     12,      0,      0, }, /* 280 */
+  {    47,     12,      3,      0,      0, }, /* 281 */
+  {    47,     10,      3,      0,      0, }, /* 282 */
+  {    47,     13,     12,      0,      0, }, /* 283 */
+  {    47,     21,     12,      0,      0, }, /* 284 */
+  {    56,      7,     12,      0,      0, }, /* 285 */
+  {    56,     12,      3,      0,      0, }, /* 286 */
+  {    56,      7,      5,      0,      0, }, /* 287 */
+  {    56,      6,     12,      0,      0, }, /* 288 */
+  {    56,     21,     12,      0,      0, }, /* 289 */
+  {    56,     13,     12,      0,      0, }, /* 290 */
+  {    32,      7,     12,      0,      0, }, /* 291 */
+  {    32,     12,      3,      0,      0, }, /* 292 */
+  {    32,      7,      5,      0,      0, }, /* 293 */
+  {    32,      6,     12,      0,      0, }, /* 294 */
+  {    32,     13,     12,      0,      0, }, /* 295 */
+  {    57,      7,     12,      0,      0, }, /* 296 */
+  {    57,     26,     12,      0,      0, }, /* 297 */
+  {    57,     21,     12,      0,      0, }, /* 298 */
+  {    57,     12,      3,      0,      0, }, /* 299 */
+  {    57,     13,     12,      0,      0, }, /* 300 */
+  {    57,     15,     12,      0,      0, }, /* 301 */
+  {    57,     22,     12,      0,      0, }, /* 302 */
+  {    57,     18,     12,      0,      0, }, /* 303 */
+  {    57,     10,      5,      0,      0, }, /* 304 */
+  {    38,      7,     12,      0,      0, }, /* 305 */
+  {    38,     10,     12,      0,      0, }, /* 306 */
+  {    38,     12,      3,      0,      0, }, /* 307 */
+  {    38,     10,      5,      0,      0, }, /* 308 */
+  {    38,     13,     12,      0,      0, }, /* 309 */
+  {    38,     21,     12,      0,      0, }, /* 310 */
+  {    38,     26,     12,      0,      0, }, /* 311 */
+  {    16,      9,     12,      0,   7264, }, /* 312 */
+  {    16,      7,     12,      0,      0, }, /* 313 */
+  {    16,      6,     12,      0,      0, }, /* 314 */
+  {    23,      7,      6,      0,      0, }, /* 315 */
+  {    23,      7,      7,      0,      0, }, /* 316 */
+  {    23,      7,      8,      0,      0, }, /* 317 */
+  {    15,      7,     12,      0,      0, }, /* 318 */
+  {    15,     12,      3,      0,      0, }, /* 319 */
+  {    15,     21,     12,      0,      0, }, /* 320 */
+  {    15,     15,     12,      0,      0, }, /* 321 */
+  {    15,     26,     12,      0,      0, }, /* 322 */
+  {     8,      9,     12,      0,  38864, }, /* 323 */
+  {     8,      9,     12,      0,      8, }, /* 324 */
+  {     8,      5,     12,      0,     -8, }, /* 325 */
+  {     7,     17,     12,      0,      0, }, /* 326 */
+  {     7,      7,     12,      0,      0, }, /* 327 */
+  {     7,     21,     12,      0,      0, }, /* 328 */
+  {    40,     29,     12,      0,      0, }, /* 329 */
+  {    40,      7,     12,      0,      0, }, /* 330 */
+  {    40,     22,     12,      0,      0, }, /* 331 */
+  {    40,     18,     12,      0,      0, }, /* 332 */
+  {    45,      7,     12,      0,      0, }, /* 333 */
+  {    45,     14,     12,      0,      0, }, /* 334 */
+  {    50,      7,     12,      0,      0, }, /* 335 */
+  {    50,     12,      3,      0,      0, }, /* 336 */
+  {    24,      7,     12,      0,      0, }, /* 337 */
+  {    24,     12,      3,      0,      0, }, /* 338 */
+  {     6,      7,     12,      0,      0, }, /* 339 */
+  {     6,     12,      3,      0,      0, }, /* 340 */
+  {    51,      7,     12,      0,      0, }, /* 341 */
+  {    51,     12,      3,      0,      0, }, /* 342 */
+  {    31,      7,     12,      0,      0, }, /* 343 */
+  {    31,     12,      3,      0,      0, }, /* 344 */
+  {    31,     10,      5,      0,      0, }, /* 345 */
+  {    31,     21,     12,      0,      0, }, /* 346 */
+  {    31,      6,     12,      0,      0, }, /* 347 */
+  {    31,     23,     12,      0,      0, }, /* 348 */
+  {    31,     13,     12,      0,      0, }, /* 349 */
+  {    31,     15,     12,      0,      0, }, /* 350 */
+  {    37,     21,     12,      0,      0, }, /* 351 */
+  {    37,     17,     12,      0,      0, }, /* 352 */
+  {    37,     12,      3,      0,      0, }, /* 353 */
+  {    37,      1,      2,      0,      0, }, /* 354 */
+  {    37,     13,     12,      0,      0, }, /* 355 */
+  {    37,      7,     12,      0,      0, }, /* 356 */
+  {    37,      6,     12,      0,      0, }, /* 357 */
+  {    34,      7,     12,      0,      0, }, /* 358 */
+  {    34,     12,      3,      0,      0, }, /* 359 */
+  {    34,     10,      5,      0,      0, }, /* 360 */
+  {    34,     26,     12,      0,      0, }, /* 361 */
+  {    34,     21,     12,      0,      0, }, /* 362 */
+  {    34,     13,     12,      0,      0, }, /* 363 */
+  {    52,      7,     12,      0,      0, }, /* 364 */
+  {    39,      7,     12,      0,      0, }, /* 365 */
+  {    39,     13,     12,      0,      0, }, /* 366 */
+  {    39,     15,     12,      0,      0, }, /* 367 */
+  {    39,     26,     12,      0,      0, }, /* 368 */
+  {    31,     26,     12,      0,      0, }, /* 369 */
+  {     5,      7,     12,      0,      0, }, /* 370 */
+  {     5,     12,      3,      0,      0, }, /* 371 */
+  {     5,     10,      5,      0,      0, }, /* 372 */
+  {     5,     21,     12,      0,      0, }, /* 373 */
+  {    90,      7,     12,      0,      0, }, /* 374 */
+  {    90,     10,      5,      0,      0, }, /* 375 */
+  {    90,     12,      3,      0,      0, }, /* 376 */
+  {    90,     10,     12,      0,      0, }, /* 377 */
+  {    90,     13,     12,      0,      0, }, /* 378 */
+  {    90,     21,     12,      0,      0, }, /* 379 */
+  {    90,      6,     12,      0,      0, }, /* 380 */
+  {    27,     11,      3,      0,      0, }, /* 381 */
+  {    61,     12,      3,      0,      0, }, /* 382 */
+  {    61,     10,      5,      0,      0, }, /* 383 */
+  {    61,      7,     12,      0,      0, }, /* 384 */
+  {    61,     13,     12,      0,      0, }, /* 385 */
+  {    61,     21,     12,      0,      0, }, /* 386 */
+  {    61,     26,     12,      0,      0, }, /* 387 */
+  {    75,     12,      3,      0,      0, }, /* 388 */
+  {    75,     10,      5,      0,      0, }, /* 389 */
+  {    75,      7,     12,      0,      0, }, /* 390 */
+  {    75,     13,     12,      0,      0, }, /* 391 */
+  {    92,      7,     12,      0,      0, }, /* 392 */
+  {    92,     12,      3,      0,      0, }, /* 393 */
+  {    92,     10,      5,      0,      0, }, /* 394 */
+  {    92,     21,     12,      0,      0, }, /* 395 */
+  {    69,      7,     12,      0,      0, }, /* 396 */
+  {    69,     10,      5,      0,      0, }, /* 397 */
+  {    69,     12,      3,      0,      0, }, /* 398 */
+  {    69,     21,     12,      0,      0, }, /* 399 */
+  {    69,     13,     12,      0,      0, }, /* 400 */
+  {    72,     13,     12,      0,      0, }, /* 401 */
+  {    72,      7,     12,      0,      0, }, /* 402 */
+  {    72,      6,     12,      0,      0, }, /* 403 */
+  {    72,     21,     12,      0,      0, }, /* 404 */
+  {    75,     21,     12,      0,      0, }, /* 405 */
+  {     9,     10,      5,      0,      0, }, /* 406 */
+  {     9,      7,     12,      0,      0, }, /* 407 */
+  {    12,      5,     12,      0,      0, }, /* 408 */
+  {    12,      6,     12,      0,      0, }, /* 409 */
+  {    33,      5,     12,      0,  35332, }, /* 410 */
+  {    33,      5,     12,      0,   3814, }, /* 411 */
+  {    33,      9,     12,     63,      1, }, /* 412 */
+  {    33,      5,     12,     63,     -1, }, /* 413 */
+  {    33,      5,     12,     63,    -58, }, /* 414 */
+  {    33,      9,     12,      0,  -7615, }, /* 415 */
+  {    19,      5,     12,      0,      8, }, /* 416 */
+  {    19,      9,     12,      0,     -8, }, /* 417 */
+  {    19,      5,     12,      0,     74, }, /* 418 */
+  {    19,      5,     12,      0,     86, }, /* 419 */
+  {    19,      5,     12,      0,    100, }, /* 420 */
+  {    19,      5,     12,      0,    128, }, /* 421 */
+  {    19,      5,     12,      0,    112, }, /* 422 */
+  {    19,      5,     12,      0,    126, }, /* 423 */
+  {    19,      8,     12,      0,     -8, }, /* 424 */
+  {    19,      5,     12,      0,      9, }, /* 425 */
+  {    19,      9,     12,      0,    -74, }, /* 426 */
+  {    19,      8,     12,      0,     -9, }, /* 427 */
+  {    19,      5,     12,     21,  -7173, }, /* 428 */
+  {    19,      9,     12,      0,    -86, }, /* 429 */
+  {    19,      9,     12,      0,   -100, }, /* 430 */
+  {    19,      9,     12,      0,   -112, }, /* 431 */
+  {    19,      9,     12,      0,   -128, }, /* 432 */
+  {    19,      9,     12,      0,   -126, }, /* 433 */
+  {    27,      1,      3,      0,      0, }, /* 434 */
+  {     9,     27,      2,      0,      0, }, /* 435 */
+  {     9,     28,      2,      0,      0, }, /* 436 */
+  {     9,      2,      2,      0,      0, }, /* 437 */
+  {     9,      9,     12,      0,      0, }, /* 438 */
+  {     9,      5,     12,      0,      0, }, /* 439 */
+  {    19,      9,     12,     67,  -7517, }, /* 440 */
+  {    33,      9,     12,     71,  -8383, }, /* 441 */
+  {    33,      9,     12,     75,  -8262, }, /* 442 */
+  {    33,      9,     12,      0,     28, }, /* 443 */
+  {    33,      5,     12,      0,    -28, }, /* 444 */
+  {    33,     14,     12,      0,     16, }, /* 445 */
+  {    33,     14,     12,      0,    -16, }, /* 446 */
+  {    33,     14,     12,      0,      0, }, /* 447 */
+  {     9,     26,     12,      0,     26, }, /* 448 */
+  {     9,     26,     12,      0,    -26, }, /* 449 */
+  {     4,     26,     12,      0,      0, }, /* 450 */
+  {    17,      9,     12,      0,     48, }, /* 451 */
+  {    17,      5,     12,      0,    -48, }, /* 452 */
+  {    33,      9,     12,      0, -10743, }, /* 453 */
+  {    33,      9,     12,      0,  -3814, }, /* 454 */
+  {    33,      9,     12,      0, -10727, }, /* 455 */
+  {    33,      5,     12,      0, -10795, }, /* 456 */
+  {    33,      5,     12,      0, -10792, }, /* 457 */
+  {    33,      9,     12,      0, -10780, }, /* 458 */
+  {    33,      9,     12,      0, -10749, }, /* 459 */
+  {    33,      9,     12,      0, -10783, }, /* 460 */
+  {    33,      9,     12,      0, -10782, }, /* 461 */
+  {    33,      9,     12,      0, -10815, }, /* 462 */
+  {    10,      5,     12,      0,      0, }, /* 463 */
+  {    10,     26,     12,      0,      0, }, /* 464 */
+  {    10,     12,      3,      0,      0, }, /* 465 */
+  {    10,     21,     12,      0,      0, }, /* 466 */
+  {    10,     15,     12,      0,      0, }, /* 467 */
+  {    16,      5,     12,      0,  -7264, }, /* 468 */
+  {    58,      7,     12,      0,      0, }, /* 469 */
+  {    58,      6,     12,      0,      0, }, /* 470 */
+  {    58,     21,     12,      0,      0, }, /* 471 */
+  {    58,     12,      3,      0,      0, }, /* 472 */
+  {    22,     26,     12,      0,      0, }, /* 473 */
+  {    22,      6,     12,      0,      0, }, /* 474 */
+  {    22,     14,     12,      0,      0, }, /* 475 */
+  {    23,     10,      3,      0,      0, }, /* 476 */
+  {    26,      7,     12,      0,      0, }, /* 477 */
+  {    26,      6,     12,      0,      0, }, /* 478 */
+  {    29,      7,     12,      0,      0, }, /* 479 */
+  {    29,      6,     12,      0,      0, }, /* 480 */
+  {     3,      7,     12,      0,      0, }, /* 481 */
+  {    23,      7,     12,      0,      0, }, /* 482 */
+  {    23,     26,     12,      0,      0, }, /* 483 */
+  {    29,     26,     12,      0,      0, }, /* 484 */
+  {    22,      7,     12,      0,      0, }, /* 485 */
+  {    60,      7,     12,      0,      0, }, /* 486 */
+  {    60,      6,     12,      0,      0, }, /* 487 */
+  {    60,     26,     12,      0,      0, }, /* 488 */
+  {    85,      7,     12,      0,      0, }, /* 489 */
+  {    85,      6,     12,      0,      0, }, /* 490 */
+  {    85,     21,     12,      0,      0, }, /* 491 */
+  {    76,      7,     12,      0,      0, }, /* 492 */
+  {    76,      6,     12,      0,      0, }, /* 493 */
+  {    76,     21,     12,      0,      0, }, /* 494 */
+  {    76,     13,     12,      0,      0, }, /* 495 */
+  {    12,      7,     12,      0,      0, }, /* 496 */
+  {    12,     21,     12,      0,      0, }, /* 497 */
+  {    78,      7,     12,      0,      0, }, /* 498 */
+  {    78,     14,     12,      0,      0, }, /* 499 */
+  {    78,     12,      3,      0,      0, }, /* 500 */
+  {    78,     21,     12,      0,      0, }, /* 501 */
+  {    33,      9,     12,      0, -35332, }, /* 502 */
+  {    33,      9,     12,      0, -42280, }, /* 503 */
+  {    33,      9,     12,      0, -42308, }, /* 504 */
+  {    33,      9,     12,      0, -42319, }, /* 505 */
+  {    33,      9,     12,      0, -42315, }, /* 506 */
+  {    33,      9,     12,      0, -42305, }, /* 507 */
+  {    33,      9,     12,      0, -42258, }, /* 508 */
+  {    33,      9,     12,      0, -42282, }, /* 509 */
+  {    33,      9,     12,      0, -42261, }, /* 510 */
+  {    33,      9,     12,      0,    928, }, /* 511 */
+  {    48,      7,     12,      0,      0, }, /* 512 */
+  {    48,     12,      3,      0,      0, }, /* 513 */
+  {    48,     10,      5,      0,      0, }, /* 514 */
+  {    48,     26,     12,      0,      0, }, /* 515 */
+  {    64,      7,     12,      0,      0, }, /* 516 */
+  {    64,     21,     12,      0,      0, }, /* 517 */
+  {    74,     10,      5,      0,      0, }, /* 518 */
+  {    74,      7,     12,      0,      0, }, /* 519 */
+  {    74,     12,      3,      0,      0, }, /* 520 */
+  {    74,     21,     12,      0,      0, }, /* 521 */
+  {    74,     13,     12,      0,      0, }, /* 522 */
+  {    68,     13,     12,      0,      0, }, /* 523 */
+  {    68,      7,     12,      0,      0, }, /* 524 */
+  {    68,     12,      3,      0,      0, }, /* 525 */
+  {    68,     21,     12,      0,      0, }, /* 526 */
+  {    73,      7,     12,      0,      0, }, /* 527 */
+  {    73,     12,      3,      0,      0, }, /* 528 */
+  {    73,     10,      5,      0,      0, }, /* 529 */
+  {    73,     21,     12,      0,      0, }, /* 530 */
+  {    83,     12,      3,      0,      0, }, /* 531 */
+  {    83,     10,      5,      0,      0, }, /* 532 */
+  {    83,      7,     12,      0,      0, }, /* 533 */
+  {    83,     21,     12,      0,      0, }, /* 534 */
+  {    83,     13,     12,      0,      0, }, /* 535 */
+  {    38,      6,     12,      0,      0, }, /* 536 */
+  {    67,      7,     12,      0,      0, }, /* 537 */
+  {    67,     12,      3,      0,      0, }, /* 538 */
+  {    67,     10,      5,      0,      0, }, /* 539 */
+  {    67,     13,     12,      0,      0, }, /* 540 */
+  {    67,     21,     12,      0,      0, }, /* 541 */
+  {    91,      7,     12,      0,      0, }, /* 542 */
+  {    91,     12,      3,      0,      0, }, /* 543 */
+  {    91,      6,     12,      0,      0, }, /* 544 */
+  {    91,     21,     12,      0,      0, }, /* 545 */
+  {    86,      7,     12,      0,      0, }, /* 546 */
+  {    86,     10,      5,      0,      0, }, /* 547 */
+  {    86,     12,      3,      0,      0, }, /* 548 */
+  {    86,     21,     12,      0,      0, }, /* 549 */
+  {    86,      6,     12,      0,      0, }, /* 550 */
+  {    33,      5,     12,      0,   -928, }, /* 551 */
+  {     8,      5,     12,      0, -38864, }, /* 552 */
+  {    86,     13,     12,      0,      0, }, /* 553 */
+  {    23,      7,      9,      0,      0, }, /* 554 */
+  {    23,      7,     10,      0,      0, }, /* 555 */
+  {     9,      4,      2,      0,      0, }, /* 556 */
+  {     9,      3,     12,      0,      0, }, /* 557 */
+  {    25,     25,     12,      0,      0, }, /* 558 */
+  {     0,     24,     12,      0,      0, }, /* 559 */
+  {     9,      6,      3,      0,      0, }, /* 560 */
+  {    35,      7,     12,      0,      0, }, /* 561 */
+  {    19,     14,     12,      0,      0, }, /* 562 */
+  {    19,     15,     12,      0,      0, }, /* 563 */
+  {    19,     26,     12,      0,      0, }, /* 564 */
+  {    70,      7,     12,      0,      0, }, /* 565 */
+  {    66,      7,     12,      0,      0, }, /* 566 */
+  {    41,      7,     12,      0,      0, }, /* 567 */
+  {    41,     15,     12,      0,      0, }, /* 568 */
+  {    18,      7,     12,      0,      0, }, /* 569 */
+  {    18,     14,     12,      0,      0, }, /* 570 */
+  {   117,      7,     12,      0,      0, }, /* 571 */
+  {   117,     12,      3,      0,      0, }, /* 572 */
+  {    59,      7,     12,      0,      0, }, /* 573 */
+  {    59,     21,     12,      0,      0, }, /* 574 */
+  {    42,      7,     12,      0,      0, }, /* 575 */
+  {    42,     21,     12,      0,      0, }, /* 576 */
+  {    42,     14,     12,      0,      0, }, /* 577 */
+  {    13,      9,     12,      0,     40, }, /* 578 */
+  {    13,      5,     12,      0,    -40, }, /* 579 */
+  {    46,      7,     12,      0,      0, }, /* 580 */
+  {    44,      7,     12,      0,      0, }, /* 581 */
+  {    44,     13,     12,      0,      0, }, /* 582 */
+  {   105,      7,     12,      0,      0, }, /* 583 */
+  {   103,      7,     12,      0,      0, }, /* 584 */
+  {   103,     21,     12,      0,      0, }, /* 585 */
+  {   109,      7,     12,      0,      0, }, /* 586 */
+  {    11,      7,     12,      0,      0, }, /* 587 */
+  {    80,      7,     12,      0,      0, }, /* 588 */
+  {    80,     21,     12,      0,      0, }, /* 589 */
+  {    80,     15,     12,      0,      0, }, /* 590 */
+  {   119,      7,     12,      0,      0, }, /* 591 */
+  {   119,     26,     12,      0,      0, }, /* 592 */
+  {   119,     15,     12,      0,      0, }, /* 593 */
+  {   115,      7,     12,      0,      0, }, /* 594 */
+  {   115,     15,     12,      0,      0, }, /* 595 */
+  {   127,      7,     12,      0,      0, }, /* 596 */
+  {   127,     15,     12,      0,      0, }, /* 597 */
+  {    65,      7,     12,      0,      0, }, /* 598 */
+  {    65,     15,     12,      0,      0, }, /* 599 */
+  {    65,     21,     12,      0,      0, }, /* 600 */
+  {    71,      7,     12,      0,      0, }, /* 601 */
+  {    71,     21,     12,      0,      0, }, /* 602 */
+  {    97,      7,     12,      0,      0, }, /* 603 */
+  {    96,      7,     12,      0,      0, }, /* 604 */
+  {    96,     15,     12,      0,      0, }, /* 605 */
+  {    30,      7,     12,      0,      0, }, /* 606 */
+  {    30,     12,      3,      0,      0, }, /* 607 */
+  {    30,     15,     12,      0,      0, }, /* 608 */
+  {    30,     21,     12,      0,      0, }, /* 609 */
+  {    87,      7,     12,      0,      0, }, /* 610 */
+  {    87,     15,     12,      0,      0, }, /* 611 */
+  {    87,     21,     12,      0,      0, }, /* 612 */
+  {   116,      7,     12,      0,      0, }, /* 613 */
+  {   116,     15,     12,      0,      0, }, /* 614 */
+  {   111,      7,     12,      0,      0, }, /* 615 */
+  {   111,     26,     12,      0,      0, }, /* 616 */
+  {   111,     12,      3,      0,      0, }, /* 617 */
+  {   111,     15,     12,      0,      0, }, /* 618 */
+  {   111,     21,     12,      0,      0, }, /* 619 */
+  {    77,      7,     12,      0,      0, }, /* 620 */
+  {    77,     21,     12,      0,      0, }, /* 621 */
+  {    82,      7,     12,      0,      0, }, /* 622 */
+  {    82,     15,     12,      0,      0, }, /* 623 */
+  {    81,      7,     12,      0,      0, }, /* 624 */
+  {    81,     15,     12,      0,      0, }, /* 625 */
+  {   120,      7,     12,      0,      0, }, /* 626 */
+  {   120,     21,     12,      0,      0, }, /* 627 */
+  {   120,     15,     12,      0,      0, }, /* 628 */
+  {    88,      7,     12,      0,      0, }, /* 629 */
+  {   129,      9,     12,      0,     64, }, /* 630 */
+  {   129,      5,     12,      0,    -64, }, /* 631 */
+  {   129,     15,     12,      0,      0, }, /* 632 */
+  {     0,     15,     12,      0,      0, }, /* 633 */
+  {    93,     10,      5,      0,      0, }, /* 634 */
+  {    93,     12,      3,      0,      0, }, /* 635 */
+  {    93,      7,     12,      0,      0, }, /* 636 */
+  {    93,     21,     12,      0,      0, }, /* 637 */
+  {    93,     15,     12,      0,      0, }, /* 638 */
+  {    93,     13,     12,      0,      0, }, /* 639 */
+  {    84,     12,      3,      0,      0, }, /* 640 */
+  {    84,     10,      5,      0,      0, }, /* 641 */
+  {    84,      7,     12,      0,      0, }, /* 642 */
+  {    84,     21,     12,      0,      0, }, /* 643 */
+  {    84,      1,      2,      0,      0, }, /* 644 */
+  {   100,      7,     12,      0,      0, }, /* 645 */
+  {   100,     13,     12,      0,      0, }, /* 646 */
+  {    95,     12,      3,      0,      0, }, /* 647 */
+  {    95,      7,     12,      0,      0, }, /* 648 */
+  {    95,     10,      5,      0,      0, }, /* 649 */
+  {    95,     13,     12,      0,      0, }, /* 650 */
+  {    95,     21,     12,      0,      0, }, /* 651 */
+  {   110,      7,     12,      0,      0, }, /* 652 */
+  {   110,     12,      3,      0,      0, }, /* 653 */
+  {   110,     21,     12,      0,      0, }, /* 654 */
+  {    99,     12,      3,      0,      0, }, /* 655 */
+  {    99,     10,      5,      0,      0, }, /* 656 */
+  {    99,      7,     12,      0,      0, }, /* 657 */
+  {    99,     21,     12,      0,      0, }, /* 658 */
+  {    99,     13,     12,      0,      0, }, /* 659 */
+  {    47,     15,     12,      0,      0, }, /* 660 */
+  {   107,      7,     12,      0,      0, }, /* 661 */
+  {   107,     10,      5,      0,      0, }, /* 662 */
+  {   107,     12,      3,      0,      0, }, /* 663 */
+  {   107,     21,     12,      0,      0, }, /* 664 */
+  {   128,      7,     12,      0,      0, }, /* 665 */
+  {   128,     21,     12,      0,      0, }, /* 666 */
+  {   108,      7,     12,      0,      0, }, /* 667 */
+  {   108,     12,      3,      0,      0, }, /* 668 */
+  {   108,     10,      5,      0,      0, }, /* 669 */
+  {   108,     13,     12,      0,      0, }, /* 670 */
+  {   106,     12,      3,      0,      0, }, /* 671 */
+  {   106,     10,      5,      0,      0, }, /* 672 */
+  {   106,      7,     12,      0,      0, }, /* 673 */
+  {   106,     10,      3,      0,      0, }, /* 674 */
+  {   123,      7,     12,      0,      0, }, /* 675 */
+  {   123,     10,      3,      0,      0, }, /* 676 */
+  {   123,     10,      5,      0,      0, }, /* 677 */
+  {   123,     12,      3,      0,      0, }, /* 678 */
+  {   123,     21,     12,      0,      0, }, /* 679 */
+  {   123,     13,     12,      0,      0, }, /* 680 */
+  {   122,      7,     12,      0,      0, }, /* 681 */
+  {   122,     10,      3,      0,      0, }, /* 682 */
+  {   122,     10,      5,      0,      0, }, /* 683 */
+  {   122,     12,      3,      0,      0, }, /* 684 */
+  {   122,     21,     12,      0,      0, }, /* 685 */
+  {   113,      7,     12,      0,      0, }, /* 686 */
+  {   113,     10,      5,      0,      0, }, /* 687 */
+  {   113,     12,      3,      0,      0, }, /* 688 */
+  {   113,     21,     12,      0,      0, }, /* 689 */
+  {   113,     13,     12,      0,      0, }, /* 690 */
+  {   101,      7,     12,      0,      0, }, /* 691 */
+  {   101,     12,      3,      0,      0, }, /* 692 */
+  {   101,     10,      5,      0,      0, }, /* 693 */
+  {   101,     13,     12,      0,      0, }, /* 694 */
+  {   125,      7,     12,      0,      0, }, /* 695 */
+  {   125,     12,      3,      0,      0, }, /* 696 */
+  {   125,     10,      5,      0,      0, }, /* 697 */
+  {   125,     13,     12,      0,      0, }, /* 698 */
+  {   125,     15,     12,      0,      0, }, /* 699 */
+  {   125,     21,     12,      0,      0, }, /* 700 */
+  {   125,     26,     12,      0,      0, }, /* 701 */
+  {   124,      9,     12,      0,     32, }, /* 702 */
+  {   124,      5,     12,      0,    -32, }, /* 703 */
+  {   124,     13,     12,      0,      0, }, /* 704 */
+  {   124,     15,     12,      0,      0, }, /* 705 */
+  {   124,      7,     12,      0,      0, }, /* 706 */
+  {   121,      7,     12,      0,      0, }, /* 707 */
+  {    62,      7,     12,      0,      0, }, /* 708 */
+  {    62,     14,     12,      0,      0, }, /* 709 */
+  {    62,     21,     12,      0,      0, }, /* 710 */
+  {    79,      7,     12,      0,      0, }, /* 711 */
+  {   126,      7,     12,      0,      0, }, /* 712 */
+  {   114,      7,     12,      0,      0, }, /* 713 */
+  {   114,     13,     12,      0,      0, }, /* 714 */
+  {   114,     21,     12,      0,      0, }, /* 715 */
+  {   102,      7,     12,      0,      0, }, /* 716 */
+  {   102,     12,      3,      0,      0, }, /* 717 */
+  {   102,     21,     12,      0,      0, }, /* 718 */
+  {   118,      7,     12,      0,      0, }, /* 719 */
+  {   118,     12,      3,      0,      0, }, /* 720 */
+  {   118,     21,     12,      0,      0, }, /* 721 */
+  {   118,     26,     12,      0,      0, }, /* 722 */
+  {   118,      6,     12,      0,      0, }, /* 723 */
+  {   118,     13,     12,      0,      0, }, /* 724 */
+  {   118,     15,     12,      0,      0, }, /* 725 */
+  {    98,      7,     12,      0,      0, }, /* 726 */
+  {    98,     10,      5,      0,      0, }, /* 727 */
+  {    98,     12,      3,      0,      0, }, /* 728 */
+  {    98,      6,     12,      0,      0, }, /* 729 */
+  {   104,      7,     12,      0,      0, }, /* 730 */
+  {   104,     26,     12,      0,      0, }, /* 731 */
+  {   104,     12,      3,      0,      0, }, /* 732 */
+  {   104,     21,     12,      0,      0, }, /* 733 */
+  {     9,     10,      3,      0,      0, }, /* 734 */
+  {    19,     12,      3,      0,      0, }, /* 735 */
+  {   130,     26,     12,      0,      0, }, /* 736 */
+  {   130,     12,      3,      0,      0, }, /* 737 */
+  {   130,     21,     12,      0,      0, }, /* 738 */
+  {   112,      7,     12,      0,      0, }, /* 739 */
+  {   112,     15,     12,      0,      0, }, /* 740 */
+  {   112,     12,      3,      0,      0, }, /* 741 */
+  {     9,     26,     11,      0,      0, }, /* 742 */
+  {    26,     26,     12,      0,      0, }, /* 743 */
+};
+
+const uint8_t PRIV(ucd_stage1)[] = { /* 8704 bytes */
+  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, /* U+0000 */
+ 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, /* U+0800 */
+ 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 41, 41, 42, 43, 44, 45, /* U+1000 */
+ 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, /* U+1800 */
+ 62, 63, 64, 65, 66, 66, 67, 68, 69, 70, 71, 72, 73, 71, 74, 75, /* U+2000 */
+ 76, 76, 66, 77, 66, 66, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, /* U+2800 */
+ 88, 89, 90, 91, 92, 93, 94, 71, 95, 95, 95, 95, 95, 95, 95, 95, /* U+3000 */
+ 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+3800 */
+ 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+4000 */
+ 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 96, 95, 95, 95, 95, /* U+4800 */
+ 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+5000 */
+ 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+5800 */
+ 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+6000 */
+ 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+6800 */
+ 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+7000 */
+ 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+7800 */
+ 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+8000 */
+ 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+8800 */
+ 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+9000 */
+ 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 97, /* U+9800 */
+ 98, 99, 99, 99, 99, 99, 99, 99, 99,100,101,101,102,103,104,105, /* U+A000 */
+106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,114, /* U+A800 */
+115,116,117,118,119,120,114,115,116,117,118,119,120,114,115,116, /* U+B000 */
+117,118,119,120,114,115,116,117,118,119,120,114,115,116,117,118, /* U+B800 */
+119,120,114,115,116,117,118,119,120,114,115,116,117,118,119,120, /* U+C000 */
+114,115,116,117,118,119,120,114,115,116,117,118,119,120,114,115, /* U+C800 */
+116,117,118,119,120,114,115,116,117,118,119,120,114,115,116,121, /* U+D000 */
+122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122, /* U+D800 */
+123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+E000 */
+123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+E800 */
+123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+F000 */
+123,123, 95, 95,124,125,126,127,128,128,129,130,131,132,133,134, /* U+F800 */
+135,136,137,138,139,140,141,142,143,144,145,139,146,146,147,139, /* U+10000 */
+148,149,150,151,152,153,154,155,156,157,139,139,158,139,139,139, /* U+10800 */
+159,160,161,162,163,164,165,139,139,166,139,167,168,169,170,139, /* U+11000 */
+139,171,139,139,139,172,139,139,139,139,139,139,139,139,139,139, /* U+11800 */
+173,173,173,173,173,173,173,174,175,173,176,139,139,139,139,139, /* U+12000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+12800 */
+177,177,177,177,177,177,177,177,178,139,139,139,139,139,139,139, /* U+13000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+13800 */
+139,139,139,139,139,139,139,139,179,179,179,179,180,139,139,139, /* U+14000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+14800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+15000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+15800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+16000 */
+181,181,181,181,182,183,184,185,139,139,139,139,139,139,186,187, /* U+16800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+17000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+17800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+18000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+18800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+19000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+19800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+1A000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+1A800 */
+188,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+1B000 */
+139,139,139,139,139,139,139,139,189,190,139,139,139,139,139,139, /* U+1B800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+1C000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+1C800 */
+ 71,191,192,193,194,139,195,139,196,197,198,199,200,201,202,203, /* U+1D000 */
+204,204,204,204,205,206,139,139,139,139,139,139,139,139,139,139, /* U+1D800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+1E000 */
+207,208,139,139,139,139,139,139,139,139,139,139,209,210,139,139, /* U+1E800 */
+211,212,213,214,215,139, 71,216, 71, 71,217,218, 71,219,220,221, /* U+1F000 */
+222,223,224,225,139,139,139,139,139,139,139,139,139,139,139,139, /* U+1F800 */
+ 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+20000 */
+ 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+20800 */
+ 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+21000 */
+ 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+21800 */
+ 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+22000 */
+ 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+22800 */
+ 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+23000 */
+ 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+23800 */
+ 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+24000 */
+ 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+24800 */
+ 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+25000 */
+ 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+25800 */
+ 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+26000 */
+ 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+26800 */
+ 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+27000 */
+ 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+27800 */
+ 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+28000 */
+ 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+28800 */
+ 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+29000 */
+ 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+29800 */
+ 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95,226, 95, 95, /* U+2A000 */
+ 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+2A800 */
+ 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95,227, 95, /* U+2B000 */
+228, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+2B800 */
+ 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+2C000 */
+ 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95,229,139,139, /* U+2C800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+2D000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+2D800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+2E000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+2E800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+2F000 */
+ 95, 95, 95, 95,230,139,139,139,139,139,139,139,139,139,139,139, /* U+2F800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+30000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+30800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+31000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+31800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+32000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+32800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+33000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+33800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+34000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+34800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+35000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+35800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+36000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+36800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+37000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+37800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+38000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+38800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+39000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+39800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+3A000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+3A800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+3B000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+3B800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+3C000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+3C800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+3D000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+3D800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+3E000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+3E800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+3F000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+3F800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+40000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+40800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+41000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+41800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+42000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+42800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+43000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+43800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+44000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+44800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+45000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+45800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+46000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+46800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+47000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+47800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+48000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+48800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+49000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+49800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+4A000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+4A800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+4B000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+4B800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+4C000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+4C800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+4D000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+4D800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+4E000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+4E800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+4F000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+4F800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+50000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+50800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+51000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+51800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+52000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+52800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+53000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+53800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+54000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+54800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+55000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+55800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+56000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+56800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+57000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+57800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+58000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+58800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+59000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+59800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+5A000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+5A800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+5B000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+5B800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+5C000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+5C800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+5D000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+5D800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+5E000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+5E800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+5F000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+5F800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+60000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+60800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+61000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+61800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+62000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+62800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+63000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+63800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+64000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+64800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+65000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+65800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+66000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+66800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+67000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+67800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+68000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+68800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+69000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+69800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+6A000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+6A800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+6B000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+6B800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+6C000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+6C800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+6D000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+6D800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+6E000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+6E800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+6F000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+6F800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+70000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+70800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+71000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+71800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+72000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+72800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+73000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+73800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+74000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+74800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+75000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+75800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+76000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+76800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+77000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+77800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+78000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+78800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+79000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+79800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+7A000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+7A800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+7B000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+7B800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+7C000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+7C800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+7D000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+7D800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+7E000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+7E800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+7F000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+7F800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+80000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+80800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+81000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+81800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+82000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+82800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+83000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+83800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+84000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+84800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+85000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+85800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+86000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+86800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+87000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+87800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+88000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+88800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+89000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+89800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+8A000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+8A800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+8B000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+8B800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+8C000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+8C800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+8D000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+8D800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+8E000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+8E800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+8F000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+8F800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+90000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+90800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+91000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+91800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+92000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+92800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+93000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+93800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+94000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+94800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+95000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+95800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+96000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+96800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+97000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+97800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+98000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+98800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+99000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+99800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+9A000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+9A800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+9B000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+9B800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+9C000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+9C800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+9D000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+9D800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+9E000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+9E800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+9F000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+9F800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+A0000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+A0800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+A1000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+A1800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+A2000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+A2800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+A3000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+A3800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+A4000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+A4800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+A5000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+A5800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+A6000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+A6800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+A7000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+A7800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+A8000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+A8800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+A9000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+A9800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+AA000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+AA800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+AB000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+AB800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+AC000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+AC800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+AD000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+AD800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+AE000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+AE800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+AF000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+AF800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+B0000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+B0800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+B1000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+B1800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+B2000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+B2800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+B3000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+B3800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+B4000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+B4800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+B5000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+B5800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+B6000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+B6800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+B7000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+B7800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+B8000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+B8800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+B9000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+B9800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+BA000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+BA800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+BB000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+BB800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+BC000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+BC800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+BD000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+BD800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+BE000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+BE800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+BF000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+BF800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+C0000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+C0800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+C1000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+C1800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+C2000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+C2800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+C3000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+C3800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+C4000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+C4800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+C5000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+C5800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+C6000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+C6800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+C7000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+C7800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+C8000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+C8800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+C9000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+C9800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+CA000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+CA800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+CB000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+CB800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+CC000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+CC800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+CD000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+CD800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+CE000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+CE800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+CF000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+CF800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+D0000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+D0800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+D1000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+D1800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+D2000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+D2800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+D3000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+D3800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+D4000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+D4800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+D5000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+D5800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+D6000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+D6800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+D7000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+D7800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+D8000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+D8800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+D9000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+D9800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+DA000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+DA800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+DB000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+DB800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+DC000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+DC800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+DD000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+DD800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+DE000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+DE800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+DF000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+DF800 */
+231,232,233,234,232,232,232,232,232,232,232,232,232,232,232,232, /* U+E0000 */
+232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232, /* U+E0800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+E1000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+E1800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+E2000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+E2800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+E3000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+E3800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+E4000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+E4800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+E5000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+E5800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+E6000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+E6800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+E7000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+E7800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+E8000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+E8800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+E9000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+E9800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+EA000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+EA800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+EB000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+EB800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+EC000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+EC800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+ED000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+ED800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+EE000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+EE800 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+EF000 */
+139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+EF800 */
+123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+F0000 */
+123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+F0800 */
+123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+F1000 */
+123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+F1800 */
+123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+F2000 */
+123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+F2800 */
+123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+F3000 */
+123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+F3800 */
+123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+F4000 */
+123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+F4800 */
+123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+F5000 */
+123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+F5800 */
+123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+F6000 */
+123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+F6800 */
+123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+F7000 */
+123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+F7800 */
+123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+F8000 */
+123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+F8800 */
+123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+F9000 */
+123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+F9800 */
+123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+FA000 */
+123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+FA800 */
+123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+FB000 */
+123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+FB800 */
+123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+FC000 */
+123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+FC800 */
+123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+FD000 */
+123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+FD800 */
+123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+FE000 */
+123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+FE800 */
+123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+FF000 */
+123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,235, /* U+FF800 */
+123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+100000 */
+123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+100800 */
+123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+101000 */
+123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+101800 */
+123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+102000 */
+123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+102800 */
+123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+103000 */
+123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+103800 */
+123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+104000 */
+123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+104800 */
+123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+105000 */
+123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+105800 */
+123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+106000 */
+123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+106800 */
+123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+107000 */
+123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+107800 */
+123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+108000 */
+123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+108800 */
+123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+109000 */
+123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+109800 */
+123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+10A000 */
+123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+10A800 */
+123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+10B000 */
+123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+10B800 */
+123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+10C000 */
+123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+10C800 */
+123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+10D000 */
+123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+10D800 */
+123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+10E000 */
+123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+10E800 */
+123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+10F000 */
+123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,235, /* U+10F800 */
+};
+
+const uint16_t PRIV(ucd_stage2)[] = { /* 60416 bytes, block = 128 */
+/* block 0 */
+  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  2,  0,  0,
+  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+  3,  4,  4,  4,  5,  4,  4,  4,  6,  7,  4,  8,  4,  9,  4,  4,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  4,  4,  8,  8,  8,  4,
+  4, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 11, 11, 11, 11,
+ 11, 11, 11, 13, 11, 11, 11, 11, 11, 11, 11,  6,  4,  7, 14, 15,
+ 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 17, 16, 16, 16, 16,
+ 16, 16, 16, 18, 16, 16, 16, 16, 16, 16, 16,  6,  8,  7,  8,  0,
+
+/* block 1 */
+  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+  3,  4,  5,  5,  5,  5, 19,  4, 14, 19, 20, 21,  8, 22, 19, 14,
+ 19,  8, 23, 23, 14, 24,  4,  4, 14, 23, 20, 25, 23, 23, 23,  4,
+ 11, 11, 11, 11, 11, 26, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11,  8, 11, 11, 11, 11, 11, 11, 11, 27,
+ 16, 16, 16, 16, 16, 28, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 16, 16,  8, 16, 16, 16, 16, 16, 16, 16, 29,
+
+/* block 2 */
+ 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,
+ 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,
+ 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,
+ 32, 33, 30, 31, 30, 31, 30, 31, 33, 30, 31, 30, 31, 30, 31, 30,
+ 31, 30, 31, 30, 31, 30, 31, 30, 31, 33, 30, 31, 30, 31, 30, 31,
+ 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,
+ 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,
+ 30, 31, 30, 31, 30, 31, 30, 31, 34, 30, 31, 30, 31, 30, 31, 35,
+
+/* block 3 */
+ 36, 37, 30, 31, 30, 31, 38, 30, 31, 39, 39, 30, 31, 33, 40, 41,
+ 42, 30, 31, 39, 43, 44, 45, 46, 30, 31, 47, 33, 45, 48, 49, 50,
+ 30, 31, 30, 31, 30, 31, 51, 30, 31, 51, 33, 33, 30, 31, 51, 30,
+ 31, 52, 52, 30, 31, 30, 31, 53, 30, 31, 33, 20, 30, 31, 33, 54,
+ 20, 20, 20, 20, 55, 56, 57, 58, 59, 60, 61, 62, 63, 30, 31, 30,
+ 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 64, 30, 31,
+ 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,
+ 33, 65, 66, 67, 30, 31, 68, 69, 30, 31, 30, 31, 30, 31, 30, 31,
+
+/* block 4 */
+ 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,
+ 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,
+ 70, 33, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,
+ 30, 31, 30, 31, 33, 33, 33, 33, 33, 33, 71, 30, 31, 72, 73, 74,
+ 74, 30, 31, 75, 76, 77, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,
+ 78, 79, 80, 81, 82, 33, 83, 83, 33, 84, 33, 85, 86, 33, 33, 33,
+ 83, 87, 33, 88, 33, 89, 90, 33, 91, 92, 33, 93, 94, 33, 33, 92,
+ 33, 95, 96, 33, 33, 97, 33, 33, 33, 33, 33, 33, 33, 98, 33, 33,
+
+/* block 5 */
+ 99, 33, 33, 99, 33, 33, 33,100, 99,101,102,102,103, 33, 33, 33,
+ 33, 33,104, 33, 20, 33, 33, 33, 33, 33, 33, 33, 33,105,106, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
+107,107,107,107,107,107,107,107,107,108,108,108,108,108,108,108,
+108,108, 14, 14, 14, 14,108,108,108,108,108,108,108,108,108,108,
+108,108, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+107,107,107,107,107, 14, 14, 14, 14, 14,109,109,108, 14,108, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+
+/* block 6 */
+110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,
+110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,
+110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,
+110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,
+110,110,110,110,110,111,110,110,110,110,110,110,110,110,110,110,
+110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,
+110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,
+112,113,112,113,108,114,112,113,115,115,116,117,117,117,  4,118,
+
+/* block 7 */
+115,115,115,115,114, 14,119,  4,120,120,120,115,121,115,122,122,
+123,124,125,124,124,126,124,124,127,128,129,124,130,124,124,124,
+131,132,115,133,124,124,134,124,124,135,124,124,136,137,137,137,
+123,138,139,138,138,140,138,138,141,142,143,138,144,138,138,138,
+145,146,147,148,138,138,149,138,138,150,138,138,151,152,152,153,
+154,155,156,156,156,157,158,159,112,113,112,113,112,113,112,113,
+112,113,160,161,160,161,160,161,160,161,160,161,160,161,160,161,
+162,163,164,165,166,167,168,112,113,169,112,113,123,170,170,170,
+
+/* block 8 */
+171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,
+172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,
+172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,
+173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,
+175,176,175,176,175,176,175,176,175,176,175,176,175,176,175,176,
+175,176,175,176,175,176,175,176,175,176,175,176,175,176,175,176,
+
+/* block 9 */
+175,176,177,178,178,110,110,178,179,179,175,176,175,176,175,176,
+175,176,175,176,175,176,175,176,175,176,175,176,175,176,175,176,
+175,176,175,176,175,176,175,176,175,176,175,176,175,176,175,176,
+175,176,175,176,175,176,175,176,175,176,175,176,175,176,175,176,
+180,175,176,175,176,175,176,175,176,175,176,175,176,175,176,181,
+175,176,175,176,175,176,175,176,175,176,175,176,175,176,175,176,
+175,176,175,176,175,176,175,176,175,176,175,176,175,176,175,176,
+175,176,175,176,175,176,175,176,175,176,175,176,175,176,175,176,
+
+/* block 10 */
+175,176,175,176,175,176,175,176,175,176,175,176,175,176,175,176,
+175,176,175,176,175,176,175,176,175,176,175,176,175,176,175,176,
+175,176,175,176,175,176,175,176,175,176,175,176,175,176,175,176,
+115,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,
+182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,
+182,182,182,182,182,182,182,115,115,183,184,184,184,184,184,184,
+115,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,
+185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,
+
+/* block 11 */
+185,185,185,185,185,185,185,186,115,  4,187,115,115,188,188,189,
+115,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,
+190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,
+190,190,190,190,190,190,190,190,190,190,190,190,190,190,191,190,
+192,190,190,192,190,190,192,190,115,115,115,115,115,115,115,115,
+193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,
+193,193,193,193,193,193,193,193,193,193,193,115,115,115,115,115,
+193,193,193,192,192,115,115,115,115,115,115,115,115,115,115,115,
+
+/* block 12 */
+194,194,194,194,194, 22,195,195,195,196,196,197,  4,196,198,198,
+199,199,199,199,199,199,199,199,199,199,199,  4, 22,115,196,  4,
+200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,
+200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,
+108,200,200,200,200,200,200,200,200,200,200,110,110,110,110,110,
+110,110,110,110,110,110,199,199,199,199,199,199,199,199,199,199,
+201,201,201,201,201,201,201,201,201,201,196,196,196,196,200,200,
+110,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,
+
+/* block 13 */
+200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,
+200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,
+200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,
+200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,
+200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,
+200,200,200,200,196,200,199,199,199,199,199,199,199, 22,198,199,
+199,199,199,199,199,202,202,199,199,198,199,199,199,199,200,200,
+201,201,201,201,201,201,201,201,201,201,200,200,200,198,198,200,
+
+/* block 14 */
+203,203,203,203,203,203,203,203,203,203,203,203,203,203,115,204,
+205,206,205,205,205,205,205,205,205,205,205,205,205,205,205,205,
+205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,
+206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,
+206,206,206,206,206,206,206,206,206,206,206,115,115,205,205,205,
+200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,
+200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,
+200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,
+
+/* block 15 */
+207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,
+207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,
+207,207,207,207,207,207,208,208,208,208,208,208,208,208,208,208,
+208,207,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+209,209,209,209,209,209,209,209,209,209,210,210,210,210,210,210,
+210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,
+210,210,210,210,210,210,210,210,210,210,210,211,211,211,211,211,
+211,211,211,211,212,212,213,214,214,214,212,115,115,115,115,115,
+
+/* block 16 */
+215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,215,
+215,215,215,215,215,215,216,216,216,216,217,216,216,216,216,216,
+216,216,216,216,217,216,216,216,217,216,216,216,216,216,115,115,
+218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,115,
+219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,
+219,219,219,219,219,219,219,219,219,220,220,220,115,115,221,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+
+/* block 17 */
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,
+200,200,200,200,200,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,199,199,199,199,199,199,199,199,199,199,199,199,199,
+199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,
+
+/* block 18 */
+222,222,222,223,224,224,224,224,224,224,224,224,224,224,224,224,
+224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
+224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
+224,224,224,224,224,224,224,224,224,224,222,223,222,224,223,223,
+223,222,222,222,222,222,222,222,222,223,223,223,223,222,223,223,
+224,110,110,222,222,222,222,222,224,224,224,224,224,224,224,224,
+224,224,222,222,  4,  4,225,225,225,225,225,225,225,225,225,225,
+226,227,224,224,224,224,224,224,224,224,224,224,224,224,224,224,
+
+/* block 19 */
+228,229,230,230,115,228,228,228,228,228,228,228,228,115,115,228,
+228,115,115,228,228,228,228,228,228,228,228,228,228,228,228,228,
+228,228,228,228,228,228,228,228,228,115,228,228,228,228,228,228,
+228,115,228,115,115,115,228,228,228,228,115,115,229,228,231,230,
+230,229,229,229,229,115,115,230,230,115,115,230,230,229,228,115,
+115,115,115,115,115,115,115,231,115,115,115,115,228,228,115,228,
+228,228,229,229,115,115,232,232,232,232,232,232,232,232,232,232,
+228,228,233,233,234,234,234,234,234,234,235,233,115,115,115,115,
+
+/* block 20 */
+115,236,236,237,115,238,238,238,238,238,238,115,115,115,115,238,
+238,115,115,238,238,238,238,238,238,238,238,238,238,238,238,238,
+238,238,238,238,238,238,238,238,238,115,238,238,238,238,238,238,
+238,115,238,238,115,238,238,115,238,238,115,115,236,115,237,237,
+237,236,236,115,115,115,115,236,236,115,115,236,236,236,115,115,
+115,236,115,115,115,115,115,115,115,238,238,238,238,115,238,115,
+115,115,115,115,115,115,239,239,239,239,239,239,239,239,239,239,
+236,236,238,238,238,236,115,115,115,115,115,115,115,115,115,115,
+
+/* block 21 */
+115,240,240,241,115,242,242,242,242,242,242,242,242,242,115,242,
+242,242,115,242,242,242,242,242,242,242,242,242,242,242,242,242,
+242,242,242,242,242,242,242,242,242,115,242,242,242,242,242,242,
+242,115,242,242,115,242,242,242,242,242,115,115,240,242,241,241,
+241,240,240,240,240,240,115,240,240,241,115,241,241,240,115,115,
+242,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+242,242,240,240,115,115,243,243,243,243,243,243,243,243,243,243,
+244,245,115,115,115,115,115,115,115,242,115,115,115,115,115,115,
+
+/* block 22 */
+115,246,247,247,115,248,248,248,248,248,248,248,248,115,115,248,
+248,115,115,248,248,248,248,248,248,248,248,248,248,248,248,248,
+248,248,248,248,248,248,248,248,248,115,248,248,248,248,248,248,
+248,115,248,248,115,248,248,248,248,248,115,115,246,248,249,246,
+247,246,246,246,246,115,115,247,247,115,115,247,247,246,115,115,
+115,115,115,115,115,115,246,249,115,115,115,115,248,248,115,248,
+248,248,246,246,115,115,250,250,250,250,250,250,250,250,250,250,
+251,248,252,252,252,252,252,252,115,115,115,115,115,115,115,115,
+
+/* block 23 */
+115,115,253,254,115,254,254,254,254,254,254,115,115,115,254,254,
+254,115,254,254,254,254,115,115,115,254,254,115,254,115,254,254,
+115,115,115,254,254,115,115,115,254,254,254,115,115,115,254,254,
+254,254,254,254,254,254,254,254,254,254,115,115,115,115,255,256,
+253,256,256,115,115,115,256,256,256,115,256,256,256,253,115,115,
+254,115,115,115,115,115,115,255,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,257,257,257,257,257,257,257,257,257,257,
+258,258,258,259,259,259,259,259,259,260,259,115,115,115,115,115,
+
+/* block 24 */
+261,262,262,262,115,263,263,263,263,263,263,263,263,115,263,263,
+263,115,263,263,263,263,263,263,263,263,263,263,263,263,263,263,
+263,263,263,263,263,263,263,263,263,115,263,263,263,263,263,263,
+263,263,263,263,263,263,263,263,263,263,115,115,115,263,261,261,
+261,262,262,262,262,115,261,261,261,115,261,261,261,261,115,115,
+115,115,115,115,115,261,261,115,263,263,263,115,115,115,115,115,
+263,263,261,261,115,115,264,264,264,264,264,264,264,264,264,264,
+115,115,115,115,115,115,115,115,265,265,265,265,265,265,265,266,
+
+/* block 25 */
+115,267,268,268,115,269,269,269,269,269,269,269,269,115,269,269,
+269,115,269,269,269,269,269,269,269,269,269,269,269,269,269,269,
+269,269,269,269,269,269,269,269,269,115,269,269,269,269,269,269,
+269,269,269,269,115,269,269,269,269,269,115,115,267,269,268,267,
+268,268,270,268,268,115,267,268,268,115,268,268,267,267,115,115,
+115,115,115,115,115,270,270,115,115,115,115,115,115,115,269,115,
+269,269,267,267,115,115,271,271,271,271,271,271,271,271,271,271,
+115,269,269,115,115,115,115,115,115,115,115,115,115,115,115,115,
+
+/* block 26 */
+115,272,273,273,115,274,274,274,274,274,274,274,274,115,274,274,
+274,115,274,274,274,274,274,274,274,274,274,274,274,274,274,274,
+274,274,274,274,274,274,274,274,274,274,274,274,274,274,274,274,
+274,274,274,274,274,274,274,274,274,274,274,115,115,274,275,273,
+273,272,272,272,272,115,273,273,273,115,273,273,273,272,274,115,
+115,115,115,115,115,115,115,275,115,115,115,115,115,115,115,274,
+274,274,272,272,115,115,276,276,276,276,276,276,276,276,276,276,
+277,277,277,277,277,277,115,115,115,278,274,274,274,274,274,274,
+
+/* block 27 */
+115,115,279,279,115,280,280,280,280,280,280,280,280,280,280,280,
+280,280,280,280,280,280,280,115,115,115,280,280,280,280,280,280,
+280,280,280,280,280,280,280,280,280,280,280,280,280,280,280,280,
+280,280,115,280,280,280,280,280,280,280,280,280,115,280,115,115,
+280,280,280,280,280,280,280,115,115,115,281,115,115,115,115,282,
+279,279,281,281,281,115,281,115,279,279,279,279,279,279,279,282,
+115,115,115,115,115,115,283,283,283,283,283,283,283,283,283,283,
+115,115,279,279,284,115,115,115,115,115,115,115,115,115,115,115,
+
+/* block 28 */
+115,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,
+285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,
+285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,
+285,286,285,287,286,286,286,286,286,286,286,115,115,115,115,  5,
+285,285,285,285,285,285,288,286,286,286,286,286,286,286,286,289,
+290,290,290,290,290,290,290,290,290,290,289,289,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+
+/* block 29 */
+115,291,291,115,291,115,115,291,291,115,291,115,115,291,115,115,
+115,115,115,115,291,291,291,291,115,291,291,291,291,291,291,291,
+115,291,291,291,115,291,115,291,115,115,291,291,115,291,291,291,
+291,292,291,293,292,292,292,292,292,292,115,292,292,291,115,115,
+291,291,291,291,291,115,294,115,292,292,292,292,292,292,115,115,
+295,295,295,295,295,295,295,295,295,295,115,115,291,291,291,291,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+
+/* block 30 */
+296,297,297,297,298,298,298,298,298,298,298,298,298,298,298,298,
+298,298,298,297,298,297,297,297,299,299,297,297,297,297,297,297,
+300,300,300,300,300,300,300,300,300,300,301,301,301,301,301,301,
+301,301,301,301,297,299,297,299,297,299,302,303,302,303,304,304,
+296,296,296,296,296,296,296,296,115,296,296,296,296,296,296,296,
+296,296,296,296,296,296,296,296,296,296,296,296,296,296,296,296,
+296,296,296,296,296,296,296,296,296,296,296,296,296,115,115,115,
+115,299,299,299,299,299,299,299,299,299,299,299,299,299,299,304,
+
+/* block 31 */
+299,299,299,299,299,298,299,299,296,296,296,296,296,299,299,299,
+299,299,299,299,299,299,299,299,115,299,299,299,299,299,299,299,
+299,299,299,299,299,299,299,299,299,299,299,299,299,299,299,299,
+299,299,299,299,299,299,299,299,299,299,299,299,299,115,297,297,
+297,297,297,297,297,297,299,297,297,297,297,297,297,115,297,297,
+298,298,298,298,298, 19, 19, 19, 19,298,298,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+
+/* block 32 */
+305,305,305,305,305,305,305,305,305,305,305,305,305,305,305,305,
+305,305,305,305,305,305,305,305,305,305,305,305,305,305,305,305,
+305,305,305,305,305,305,305,305,305,305,305,306,306,307,307,307,
+307,308,307,307,307,307,307,307,306,307,307,308,308,307,307,305,
+309,309,309,309,309,309,309,309,309,309,310,310,310,310,310,310,
+305,305,305,305,305,305,308,308,307,307,305,305,305,305,307,307,
+307,305,306,306,306,305,305,306,306,306,306,306,306,306,305,305,
+305,307,307,307,307,305,305,305,305,305,305,305,305,305,305,305,
+
+/* block 33 */
+305,305,307,306,308,307,307,306,306,306,306,306,306,307,305,306,
+309,309,309,309,309,309,309,309,309,309,306,306,306,307,311,311,
+312,312,312,312,312,312,312,312,312,312,312,312,312,312,312,312,
+312,312,312,312,312,312,312,312,312,312,312,312,312,312,312,312,
+312,312,312,312,312,312,115,312,115,115,115,115,115,312,115,115,
+313,313,313,313,313,313,313,313,313,313,313,313,313,313,313,313,
+313,313,313,313,313,313,313,313,313,313,313,313,313,313,313,313,
+313,313,313,313,313,313,313,313,313,313,313,  4,314,313,313,313,
+
+/* block 34 */
+315,315,315,315,315,315,315,315,315,315,315,315,315,315,315,315,
+315,315,315,315,315,315,315,315,315,315,315,315,315,315,315,315,
+315,315,315,315,315,315,315,315,315,315,315,315,315,315,315,315,
+315,315,315,315,315,315,315,315,315,315,315,315,315,315,315,315,
+315,315,315,315,315,315,315,315,315,315,315,315,315,315,315,315,
+315,315,315,315,315,315,315,315,315,315,315,315,315,315,315,315,
+316,316,316,316,316,316,316,316,316,316,316,316,316,316,316,316,
+316,316,316,316,316,316,316,316,316,316,316,316,316,316,316,316,
+
+/* block 35 */
+316,316,316,316,316,316,316,316,316,316,316,316,316,316,316,316,
+316,316,316,316,316,316,316,316,316,316,316,316,316,316,316,316,
+316,316,316,316,316,316,316,316,317,317,317,317,317,317,317,317,
+317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,
+317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,
+317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,
+317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,
+317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,
+
+/* block 36 */
+318,318,318,318,318,318,318,318,318,318,318,318,318,318,318,318,
+318,318,318,318,318,318,318,318,318,318,318,318,318,318,318,318,
+318,318,318,318,318,318,318,318,318,318,318,318,318,318,318,318,
+318,318,318,318,318,318,318,318,318,318,318,318,318,318,318,318,
+318,318,318,318,318,318,318,318,318,115,318,318,318,318,115,115,
+318,318,318,318,318,318,318,115,318,115,318,318,318,318,115,115,
+318,318,318,318,318,318,318,318,318,318,318,318,318,318,318,318,
+318,318,318,318,318,318,318,318,318,318,318,318,318,318,318,318,
+
+/* block 37 */
+318,318,318,318,318,318,318,318,318,115,318,318,318,318,115,115,
+318,318,318,318,318,318,318,318,318,318,318,318,318,318,318,318,
+318,318,318,318,318,318,318,318,318,318,318,318,318,318,318,318,
+318,115,318,318,318,318,115,115,318,318,318,318,318,318,318,115,
+318,115,318,318,318,318,115,115,318,318,318,318,318,318,318,318,
+318,318,318,318,318,318,318,115,318,318,318,318,318,318,318,318,
+318,318,318,318,318,318,318,318,318,318,318,318,318,318,318,318,
+318,318,318,318,318,318,318,318,318,318,318,318,318,318,318,318,
+
+/* block 38 */
+318,318,318,318,318,318,318,318,318,318,318,318,318,318,318,318,
+318,115,318,318,318,318,115,115,318,318,318,318,318,318,318,318,
+318,318,318,318,318,318,318,318,318,318,318,318,318,318,318,318,
+318,318,318,318,318,318,318,318,318,318,318,318,318,318,318,318,
+318,318,318,318,318,318,318,318,318,318,318,318,318,318,318,318,
+318,318,318,318,318,318,318,318,318,318,318,115,115,319,319,319,
+320,320,320,320,320,320,320,320,320,321,321,321,321,321,321,321,
+321,321,321,321,321,321,321,321,321,321,321,321,321,115,115,115,
+
+/* block 39 */
+318,318,318,318,318,318,318,318,318,318,318,318,318,318,318,318,
+322,322,322,322,322,322,322,322,322,322,115,115,115,115,115,115,
+323,323,323,323,323,323,323,323,323,323,323,323,323,323,323,323,
+323,323,323,323,323,323,323,323,323,323,323,323,323,323,323,323,
+323,323,323,323,323,323,323,323,323,323,323,323,323,323,323,323,
+323,323,323,323,323,323,323,323,323,323,323,323,323,323,323,323,
+323,323,323,323,323,323,323,323,323,323,323,323,323,323,323,323,
+324,324,324,324,324,324,115,115,325,325,325,325,325,325,115,115,
+
+/* block 40 */
+326,327,327,327,327,327,327,327,327,327,327,327,327,327,327,327,
+327,327,327,327,327,327,327,327,327,327,327,327,327,327,327,327,
+327,327,327,327,327,327,327,327,327,327,327,327,327,327,327,327,
+327,327,327,327,327,327,327,327,327,327,327,327,327,327,327,327,
+327,327,327,327,327,327,327,327,327,327,327,327,327,327,327,327,
+327,327,327,327,327,327,327,327,327,327,327,327,327,327,327,327,
+327,327,327,327,327,327,327,327,327,327,327,327,327,327,327,327,
+327,327,327,327,327,327,327,327,327,327,327,327,327,327,327,327,
+
+/* block 41 */
+327,327,327,327,327,327,327,327,327,327,327,327,327,327,327,327,
+327,327,327,327,327,327,327,327,327,327,327,327,327,327,327,327,
+327,327,327,327,327,327,327,327,327,327,327,327,327,327,327,327,
+327,327,327,327,327,327,327,327,327,327,327,327,327,327,327,327,
+327,327,327,327,327,327,327,327,327,327,327,327,327,327,327,327,
+327,327,327,327,327,327,327,327,327,327,327,327,327,327,327,327,
+327,327,327,327,327,327,327,327,327,327,327,327,327,327,327,327,
+327,327,327,327,327,327,327,327,327,327,327,327,327,327,327,327,
+
+/* block 42 */
+327,327,327,327,327,327,327,327,327,327,327,327,327,327,327,327,
+327,327,327,327,327,327,327,327,327,327,327,327,327,327,327,327,
+327,327,327,327,327,327,327,327,327,327,327,327,327,327,327,327,
+327,327,327,327,327,327,327,327,327,327,327,327,327,327,327,327,
+327,327,327,327,327,327,327,327,327,327,327,327,327,327,327,327,
+327,327,327,327,327,327,327,327,327,327,327,327,327,327,327,327,
+327,327,327,327,327,327,327,327,327,327,327,327,327,328,328,327,
+327,327,327,327,327,327,327,327,327,327,327,327,327,327,327,327,
+
+/* block 43 */
+329,330,330,330,330,330,330,330,330,330,330,330,330,330,330,330,
+330,330,330,330,330,330,330,330,330,330,330,331,332,115,115,115,
+333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,
+333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,
+333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,
+333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,
+333,333,333,333,333,333,333,333,333,333,333,  4,  4,  4,334,334,
+334,333,333,333,333,333,333,333,333,115,115,115,115,115,115,115,
+
+/* block 44 */
+335,335,335,335,335,335,335,335,335,335,335,335,335,115,335,335,
+335,335,336,336,336,115,115,115,115,115,115,115,115,115,115,115,
+337,337,337,337,337,337,337,337,337,337,337,337,337,337,337,337,
+337,337,338,338,338,  4,  4,115,115,115,115,115,115,115,115,115,
+339,339,339,339,339,339,339,339,339,339,339,339,339,339,339,339,
+339,339,340,340,115,115,115,115,115,115,115,115,115,115,115,115,
+341,341,341,341,341,341,341,341,341,341,341,341,341,115,341,341,
+341,115,342,342,115,115,115,115,115,115,115,115,115,115,115,115,
+
+/* block 45 */
+343,343,343,343,343,343,343,343,343,343,343,343,343,343,343,343,
+343,343,343,343,343,343,343,343,343,343,343,343,343,343,343,343,
+343,343,343,343,343,343,343,343,343,343,343,343,343,343,343,343,
+343,343,343,343,344,344,345,344,344,344,344,344,344,344,345,345,
+345,345,345,345,345,345,344,345,345,344,344,344,344,344,344,344,
+344,344,344,344,346,346,346,347,346,346,346,348,343,344,115,115,
+349,349,349,349,349,349,349,349,349,349,115,115,115,115,115,115,
+350,350,350,350,350,350,350,350,350,350,115,115,115,115,115,115,
+
+/* block 46 */
+351,351,  4,  4,351,  4,352,351,351,351,351,353,353,353,354,115,
+355,355,355,355,355,355,355,355,355,355,115,115,115,115,115,115,
+356,356,356,356,356,356,356,356,356,356,356,356,356,356,356,356,
+356,356,356,356,356,356,356,356,356,356,356,356,356,356,356,356,
+356,356,356,357,356,356,356,356,356,356,356,356,356,356,356,356,
+356,356,356,356,356,356,356,356,356,356,356,356,356,356,356,356,
+356,356,356,356,356,356,356,356,356,356,356,356,356,356,356,356,
+356,356,356,356,356,356,356,356,115,115,115,115,115,115,115,115,
+
+/* block 47 */
+356,356,356,356,356,356,356,356,356,356,356,356,356,356,356,356,
+356,356,356,356,356,356,356,356,356,356,356,356,356,356,356,356,
+356,356,356,356,356,356,356,356,356,353,356,115,115,115,115,115,
+327,327,327,327,327,327,327,327,327,327,327,327,327,327,327,327,
+327,327,327,327,327,327,327,327,327,327,327,327,327,327,327,327,
+327,327,327,327,327,327,327,327,327,327,327,327,327,327,327,327,
+327,327,327,327,327,327,327,327,327,327,327,327,327,327,327,327,
+327,327,327,327,327,327,115,115,115,115,115,115,115,115,115,115,
+
+/* block 48 */
+358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,
+358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,115,
+359,359,359,360,360,360,360,359,359,360,360,360,115,115,115,115,
+360,360,359,360,360,360,360,360,360,359,359,359,115,115,115,115,
+361,115,115,115,362,362,363,363,363,363,363,363,363,363,363,363,
+364,364,364,364,364,364,364,364,364,364,364,364,364,364,364,364,
+364,364,364,364,364,364,364,364,364,364,364,364,364,364,115,115,
+364,364,364,364,364,115,115,115,115,115,115,115,115,115,115,115,
+
+/* block 49 */
+365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,
+365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,
+365,365,365,365,365,365,365,365,365,365,365,365,115,115,115,115,
+365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,365,
+365,365,365,365,365,365,365,365,365,365,115,115,115,115,115,115,
+366,366,366,366,366,366,366,366,366,366,367,115,115,115,368,368,
+369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,
+369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,
+
+/* block 50 */
+370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,
+370,370,370,370,370,370,370,371,371,372,372,371,115,115,373,373,
+374,374,374,374,374,374,374,374,374,374,374,374,374,374,374,374,
+374,374,374,374,374,374,374,374,374,374,374,374,374,374,374,374,
+374,374,374,374,374,374,374,374,374,374,374,374,374,374,374,374,
+374,374,374,374,374,375,376,375,376,376,376,376,376,376,376,115,
+376,377,376,377,377,376,376,376,376,376,376,376,376,375,375,375,
+375,375,375,376,376,376,376,376,376,376,376,376,376,115,115,376,
+
+/* block 51 */
+378,378,378,378,378,378,378,378,378,378,115,115,115,115,115,115,
+378,378,378,378,378,378,378,378,378,378,115,115,115,115,115,115,
+379,379,379,379,379,379,379,380,379,379,379,379,379,379,115,115,
+110,110,110,110,110,110,110,110,110,110,110,110,110,110,381,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+
+/* block 52 */
+382,382,382,382,383,384,384,384,384,384,384,384,384,384,384,384,
+384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,
+384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,384,
+384,384,384,384,382,383,382,382,382,382,382,383,382,383,383,383,
+383,383,382,383,383,384,384,384,384,384,384,384,115,115,115,115,
+385,385,385,385,385,385,385,385,385,385,386,386,386,386,386,386,
+386,387,387,387,387,387,387,387,387,387,387,382,382,382,382,382,
+382,382,382,382,387,387,387,387,387,387,387,387,387,115,115,115,
+
+/* block 53 */
+388,388,389,390,390,390,390,390,390,390,390,390,390,390,390,390,
+390,390,390,390,390,390,390,390,390,390,390,390,390,390,390,390,
+390,389,388,388,388,388,389,389,388,388,389,388,388,388,390,390,
+391,391,391,391,391,391,391,391,391,391,390,390,390,390,390,390,
+392,392,392,392,392,392,392,392,392,392,392,392,392,392,392,392,
+392,392,392,392,392,392,392,392,392,392,392,392,392,392,392,392,
+392,392,392,392,392,392,393,394,393,393,394,394,394,393,394,393,
+393,393,394,394,115,115,115,115,115,115,115,115,395,395,395,395,
+
+/* block 54 */
+396,396,396,396,396,396,396,396,396,396,396,396,396,396,396,396,
+396,396,396,396,396,396,396,396,396,396,396,396,396,396,396,396,
+396,396,396,396,397,397,397,397,397,397,397,397,398,398,398,398,
+398,398,398,398,397,397,398,398,115,115,115,399,399,399,399,399,
+400,400,400,400,400,400,400,400,400,400,115,115,115,396,396,396,
+401,401,401,401,401,401,401,401,401,401,402,402,402,402,402,402,
+402,402,402,402,402,402,402,402,402,402,402,402,402,402,402,402,
+402,402,402,402,402,402,402,402,403,403,403,403,403,403,404,404,
+
+/* block 55 */
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+405,405,405,405,405,405,405,405,115,115,115,115,115,115,115,115,
+110,110,110,  4,110,110,110,110,110,110,110,110,110,110,110,110,
+110,406,110,110,110,110,110,110,110,407,407,407,407,110,407,407,
+407,407,406,406,110,407,407,115,110,110,115,115,115,115,115,115,
+
+/* block 56 */
+ 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33,123,123,123,123,123,408,107,107,107,107,
+107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,
+107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,
+107,107,107,107,107,107,107,107,107,107,107,107,107,116,116,116,
+116,116,107,107,107,107,116,116,116,116,116, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33,409,410, 33, 33, 33,411, 33, 33,
+
+/* block 57 */
+ 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,107,107,107,107,107,
+107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,
+107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,116,
+110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,
+110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,
+110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,
+110,110,110,110,110,110,115,115,115,115,115,115,110,110,110,110,
+
+/* block 58 */
+ 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,
+ 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,
+ 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,
+ 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,
+ 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,
+ 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,
+412,413, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,
+ 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,
+
+/* block 59 */
+ 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,
+ 30, 31, 30, 31, 30, 31, 33, 33, 33, 33, 33,414, 33, 33,415, 33,
+ 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,
+ 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,
+ 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,
+ 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,
+ 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,
+ 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,
+
+/* block 60 */
+416,416,416,416,416,416,416,416,417,417,417,417,417,417,417,417,
+416,416,416,416,416,416,115,115,417,417,417,417,417,417,115,115,
+416,416,416,416,416,416,416,416,417,417,417,417,417,417,417,417,
+416,416,416,416,416,416,416,416,417,417,417,417,417,417,417,417,
+416,416,416,416,416,416,115,115,417,417,417,417,417,417,115,115,
+123,416,123,416,123,416,123,416,115,417,115,417,115,417,115,417,
+416,416,416,416,416,416,416,416,417,417,417,417,417,417,417,417,
+418,418,419,419,419,419,420,420,421,421,422,422,423,423,115,115,
+
+/* block 61 */
+416,416,416,416,416,416,416,416,424,424,424,424,424,424,424,424,
+416,416,416,416,416,416,416,416,424,424,424,424,424,424,424,424,
+416,416,416,416,416,416,416,416,424,424,424,424,424,424,424,424,
+416,416,123,425,123,115,123,123,417,417,426,426,427,114,428,114,
+114,114,123,425,123,115,123,123,429,429,429,429,427,114,114,114,
+416,416,123,123,115,115,123,123,417,417,430,430,115,114,114,114,
+416,416,123,123,123,164,123,123,417,417,431,431,169,114,114,114,
+115,115,123,425,123,115,123,123,432,432,433,433,427,114,114,115,
+
+/* block 62 */
+  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3, 22,434,434, 22, 22,
+  9,  9,  9,  9,  9,  9,  4,  4, 21, 25,  6, 21, 21, 25,  6, 21,
+  4,  4,  4,  4,  4,  4,  4,  4,435,436, 22, 22, 22, 22, 22,  3,
+  4,  4,  4,  4,  4,  4,  4,  4,  4, 21, 25,  4,  4,  4,  4, 15,
+ 15,  4,  4,  4,  8,  6,  7,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+  4,  4,  8,  4, 15,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  3,
+ 22, 22, 22, 22, 22,437, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+ 23,107,115,115, 23, 23, 23, 23, 23, 23,  8,  8,  8,  6,  7,107,
+
+/* block 63 */
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,  8,  8,  8,  6,  7,115,
+107,107,107,107,107,107,107,107,107,107,107,107,107,115,115,115,
+  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+110,110,110,110,110,110,110,110,110,110,110,110,110,381,381,381,
+381,110,381,381,381,110,110,110,110,110,110,110,110,110,110,110,
+110,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+
+/* block 64 */
+ 19, 19,438, 19, 19, 19, 19,438, 19, 19,439,438,438,438,439,439,
+438,438,438,439, 19,438, 19, 19,  8,438,438,438,438,438, 19, 19,
+ 19, 19, 19, 19,438, 19,440, 19,438, 19,441,442,438,438, 19,439,
+438,438,443,438,439,407,407,407,407,439, 19, 19,439,439,438,438,
+  8,  8,  8,  8,  8,438,439,439,439,439, 19,  8, 19, 19,444, 19,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+445,445,445,445,445,445,445,445,445,445,445,445,445,445,445,445,
+446,446,446,446,446,446,446,446,446,446,446,446,446,446,446,446,
+
+/* block 65 */
+447,447,447, 30, 31,447,447,447,447, 23, 19, 19,115,115,115,115,
+  8,  8,  8,  8,  8, 19, 19, 19, 19, 19,  8,  8, 19, 19, 19, 19,
+  8, 19, 19,  8, 19, 19,  8, 19, 19, 19, 19, 19, 19, 19,  8, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,  8,  8,
+ 19, 19,  8, 19,  8, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+
+/* block 66 */
+  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+
+/* block 67 */
+ 19, 19, 19, 19, 19, 19, 19, 19,  6,  7,  6,  7, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+  8,  8, 19, 19, 19, 19, 19, 19, 19,  6,  7, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,  8, 19, 19, 19,
+
+/* block 68 */
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,  8,  8,  8,  8,  8,
+  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+  8,  8,  8,  8, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,  8,  8,  8,  8,
+  8,  8, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,115,115,115,115,115,
+
+/* block 69 */
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+
+/* block 70 */
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19,448,448,448,448,448,448,448,448,448,448,
+448,448,448,448,448,448,448,448,448,448,448,448,448,448,448,448,
+449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,
+449,449,449,449,449,449,449,449,449,449, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+
+/* block 71 */
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+
+/* block 72 */
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19,  8, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19,  8, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,  8,  8,  8,  8,  8,  8,  8,  8,
+
+/* block 73 */
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,  8,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+
+/* block 74 */
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,  6,  7,  6,  7,  6,  7,  6,  7,
+  6,  7,  6,  7,  6,  7, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+
+/* block 75 */
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+  8,  8,  8,  8,  8,  6,  7,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+  8,  8,  8,  8,  8,  8,  6,  7,  6,  7,  6,  7,  6,  7,  6,  7,
+  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+
+/* block 76 */
+450,450,450,450,450,450,450,450,450,450,450,450,450,450,450,450,
+450,450,450,450,450,450,450,450,450,450,450,450,450,450,450,450,
+450,450,450,450,450,450,450,450,450,450,450,450,450,450,450,450,
+450,450,450,450,450,450,450,450,450,450,450,450,450,450,450,450,
+450,450,450,450,450,450,450,450,450,450,450,450,450,450,450,450,
+450,450,450,450,450,450,450,450,450,450,450,450,450,450,450,450,
+450,450,450,450,450,450,450,450,450,450,450,450,450,450,450,450,
+450,450,450,450,450,450,450,450,450,450,450,450,450,450,450,450,
+
+/* block 77 */
+  8,  8,  8,  6,  7,  6,  7,  6,  7,  6,  7,  6,  7,  6,  7,  6,
+  7,  6,  7,  6,  7,  6,  7,  6,  7,  8,  8,  8,  8,  8,  8,  8,
+  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+  8,  8,  8,  8,  8,  8,  8,  8,  6,  7,  6,  7,  8,  8,  8,  8,
+  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  6,  7,  8,  8,
+
+/* block 78 */
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+  8,  8,  8,  8,  8, 19, 19,  8,  8,  8,  8,  8,  8, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19,115,115, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+
+/* block 79 */
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19,115,115, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,115,115,115, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19,115, 19, 19, 19, 19, 19, 19,
+ 19, 19,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115, 19, 19, 19, 19,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+
+/* block 80 */
+451,451,451,451,451,451,451,451,451,451,451,451,451,451,451,451,
+451,451,451,451,451,451,451,451,451,451,451,451,451,451,451,451,
+451,451,451,451,451,451,451,451,451,451,451,451,451,451,451,115,
+452,452,452,452,452,452,452,452,452,452,452,452,452,452,452,452,
+452,452,452,452,452,452,452,452,452,452,452,452,452,452,452,452,
+452,452,452,452,452,452,452,452,452,452,452,452,452,452,452,115,
+ 30, 31,453,454,455,456,457, 30, 31, 30, 31, 30, 31,458,459,460,
+461, 33, 30, 31, 33, 30, 31, 33, 33, 33, 33, 33,107,107,462,462,
+
+/* block 81 */
+160,161,160,161,160,161,160,161,160,161,160,161,160,161,160,161,
+160,161,160,161,160,161,160,161,160,161,160,161,160,161,160,161,
+160,161,160,161,160,161,160,161,160,161,160,161,160,161,160,161,
+160,161,160,161,160,161,160,161,160,161,160,161,160,161,160,161,
+160,161,160,161,160,161,160,161,160,161,160,161,160,161,160,161,
+160,161,160,161,160,161,160,161,160,161,160,161,160,161,160,161,
+160,161,160,161,463,464,464,464,464,464,464,160,161,160,161,465,
+465,465,160,161,115,115,115,115,115,466,466,466,466,467,466,466,
+
+/* block 82 */
+468,468,468,468,468,468,468,468,468,468,468,468,468,468,468,468,
+468,468,468,468,468,468,468,468,468,468,468,468,468,468,468,468,
+468,468,468,468,468,468,115,468,115,115,115,115,115,468,115,115,
+469,469,469,469,469,469,469,469,469,469,469,469,469,469,469,469,
+469,469,469,469,469,469,469,469,469,469,469,469,469,469,469,469,
+469,469,469,469,469,469,469,469,469,469,469,469,469,469,469,469,
+469,469,469,469,469,469,469,469,115,115,115,115,115,115,115,470,
+471,115,115,115,115,115,115,115,115,115,115,115,115,115,115,472,
+
+/* block 83 */
+318,318,318,318,318,318,318,318,318,318,318,318,318,318,318,318,
+318,318,318,318,318,318,318,115,115,115,115,115,115,115,115,115,
+318,318,318,318,318,318,318,115,318,318,318,318,318,318,318,115,
+318,318,318,318,318,318,318,115,318,318,318,318,318,318,318,115,
+318,318,318,318,318,318,318,115,318,318,318,318,318,318,318,115,
+318,318,318,318,318,318,318,115,318,318,318,318,318,318,318,115,
+178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,
+178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,
+
+/* block 84 */
+  4,  4, 21, 25, 21, 25,  4,  4,  4, 21, 25,  4, 21, 25,  4,  4,
+  4,  4,  4,  4,  4,  4,  4,  9,  4,  4,  9,  4, 21, 25,  4,  4,
+ 21, 25,  6,  7,  6,  7,  6,  7,  6,  7,  4,  4,  4,  4,  4,108,
+  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  9,  9,  4,  4,  4,  4,
+  9,  4,  6,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+
+/* block 85 */
+473,473,473,473,473,473,473,473,473,473,473,473,473,473,473,473,
+473,473,473,473,473,473,473,473,473,473,115,473,473,473,473,473,
+473,473,473,473,473,473,473,473,473,473,473,473,473,473,473,473,
+473,473,473,473,473,473,473,473,473,473,473,473,473,473,473,473,
+473,473,473,473,473,473,473,473,473,473,473,473,473,473,473,473,
+473,473,473,473,473,473,473,473,473,473,473,473,473,473,473,473,
+473,473,473,473,473,473,473,473,473,473,473,473,473,473,473,473,
+473,473,473,473,115,115,115,115,115,115,115,115,115,115,115,115,
+
+/* block 86 */
+473,473,473,473,473,473,473,473,473,473,473,473,473,473,473,473,
+473,473,473,473,473,473,473,473,473,473,473,473,473,473,473,473,
+473,473,473,473,473,473,473,473,473,473,473,473,473,473,473,473,
+473,473,473,473,473,473,473,473,473,473,473,473,473,473,473,473,
+473,473,473,473,473,473,473,473,473,473,473,473,473,473,473,473,
+473,473,473,473,473,473,473,473,473,473,473,473,473,473,473,473,
+473,473,473,473,473,473,473,473,473,473,473,473,473,473,473,473,
+473,473,473,473,473,473,473,473,473,473,473,473,473,473,473,473,
+
+/* block 87 */
+473,473,473,473,473,473,473,473,473,473,473,473,473,473,473,473,
+473,473,473,473,473,473,473,473,473,473,473,473,473,473,473,473,
+473,473,473,473,473,473,473,473,473,473,473,473,473,473,473,473,
+473,473,473,473,473,473,473,473,473,473,473,473,473,473,473,473,
+473,473,473,473,473,473,473,473,473,473,473,473,473,473,473,473,
+473,473,473,473,473,473,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,115,115,115,115,
+
+/* block 88 */
+  3,  4,  4,  4, 19,474,407,475,  6,  7,  6,  7,  6,  7,  6,  7,
+  6,  7, 19, 19,  6,  7,  6,  7,  6,  7,  6,  7,  9,  6,  7,  7,
+ 19,475,475,475,475,475,475,475,475,475,110,110,110,110,476,476,
+  9,108,108,108,108,108, 19, 19,475,475,475,474,407,  4, 19, 19,
+115,477,477,477,477,477,477,477,477,477,477,477,477,477,477,477,
+477,477,477,477,477,477,477,477,477,477,477,477,477,477,477,477,
+477,477,477,477,477,477,477,477,477,477,477,477,477,477,477,477,
+477,477,477,477,477,477,477,477,477,477,477,477,477,477,477,477,
+
+/* block 89 */
+477,477,477,477,477,477,477,477,477,477,477,477,477,477,477,477,
+477,477,477,477,477,477,477,115,115,110,110, 14, 14,478,478,477,
+  9,479,479,479,479,479,479,479,479,479,479,479,479,479,479,479,
+479,479,479,479,479,479,479,479,479,479,479,479,479,479,479,479,
+479,479,479,479,479,479,479,479,479,479,479,479,479,479,479,479,
+479,479,479,479,479,479,479,479,479,479,479,479,479,479,479,479,
+479,479,479,479,479,479,479,479,479,479,479,479,479,479,479,479,
+479,479,479,479,479,479,479,479,479,479,479,  4,108,480,480,479,
+
+/* block 90 */
+115,115,115,115,115,481,481,481,481,481,481,481,481,481,481,481,
+481,481,481,481,481,481,481,481,481,481,481,481,481,481,481,481,
+481,481,481,481,481,481,481,481,481,481,481,481,481,481,115,115,
+115,482,482,482,482,482,482,482,482,482,482,482,482,482,482,482,
+482,482,482,482,482,482,482,482,482,482,482,482,482,482,482,482,
+482,482,482,482,482,482,482,482,482,482,482,482,482,482,482,482,
+482,482,482,482,482,482,482,482,482,482,482,482,482,482,482,482,
+482,482,482,482,482,482,482,482,482,482,482,482,482,482,482,482,
+
+/* block 91 */
+482,482,482,482,482,482,482,482,482,482,482,482,482,482,482,115,
+ 19, 19, 23, 23, 23, 23, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+481,481,481,481,481,481,481,481,481,481,481,481,481,481,481,481,
+481,481,481,481,481,481,481,481,481,481,481,115,115,115,115,115,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19,115,115,115,115,115,115,115,115,115,115,115,115,
+479,479,479,479,479,479,479,479,479,479,479,479,479,479,479,479,
+
+/* block 92 */
+483,483,483,483,483,483,483,483,483,483,483,483,483,483,483,483,
+483,483,483,483,483,483,483,483,483,483,483,483,483,483,483,115,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 23, 23, 23, 23, 23, 23, 23, 23,
+ 19, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+483,483,483,483,483,483,483,483,483,483,483,483,483,483,483,483,
+483,483,483,483,483,483,483,483,483,483,483,483,483,483,483, 19,
+
+/* block 93 */
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,
+484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,
+484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,115,
+
+/* block 94 */
+484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,
+484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,
+484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,
+484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,
+484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,
+484,484,484,484,484,484,484,484, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+
+/* block 95 */
+485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,
+485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,
+485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,
+485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,
+485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,
+485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,
+485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,
+485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,
+
+/* block 96 */
+485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,
+485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,
+485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,
+485,485,485,485,485,485,115,115,115,115,115,115,115,115,115,115,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+
+/* block 97 */
+485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,
+485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,
+485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,
+485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,
+485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,
+485,485,485,485,485,485,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+
+/* block 98 */
+486,486,486,486,486,486,486,486,486,486,486,486,486,486,486,486,
+486,486,486,486,486,487,486,486,486,486,486,486,486,486,486,486,
+486,486,486,486,486,486,486,486,486,486,486,486,486,486,486,486,
+486,486,486,486,486,486,486,486,486,486,486,486,486,486,486,486,
+486,486,486,486,486,486,486,486,486,486,486,486,486,486,486,486,
+486,486,486,486,486,486,486,486,486,486,486,486,486,486,486,486,
+486,486,486,486,486,486,486,486,486,486,486,486,486,486,486,486,
+486,486,486,486,486,486,486,486,486,486,486,486,486,486,486,486,
+
+/* block 99 */
+486,486,486,486,486,486,486,486,486,486,486,486,486,486,486,486,
+486,486,486,486,486,486,486,486,486,486,486,486,486,486,486,486,
+486,486,486,486,486,486,486,486,486,486,486,486,486,486,486,486,
+486,486,486,486,486,486,486,486,486,486,486,486,486,486,486,486,
+486,486,486,486,486,486,486,486,486,486,486,486,486,486,486,486,
+486,486,486,486,486,486,486,486,486,486,486,486,486,486,486,486,
+486,486,486,486,486,486,486,486,486,486,486,486,486,486,486,486,
+486,486,486,486,486,486,486,486,486,486,486,486,486,486,486,486,
+
+/* block 100 */
+486,486,486,486,486,486,486,486,486,486,486,486,486,115,115,115,
+488,488,488,488,488,488,488,488,488,488,488,488,488,488,488,488,
+488,488,488,488,488,488,488,488,488,488,488,488,488,488,488,488,
+488,488,488,488,488,488,488,488,488,488,488,488,488,488,488,488,
+488,488,488,488,488,488,488,115,115,115,115,115,115,115,115,115,
+489,489,489,489,489,489,489,489,489,489,489,489,489,489,489,489,
+489,489,489,489,489,489,489,489,489,489,489,489,489,489,489,489,
+489,489,489,489,489,489,489,489,490,490,490,490,490,490,491,491,
+
+/* block 101 */
+492,492,492,492,492,492,492,492,492,492,492,492,492,492,492,492,
+492,492,492,492,492,492,492,492,492,492,492,492,492,492,492,492,
+492,492,492,492,492,492,492,492,492,492,492,492,492,492,492,492,
+492,492,492,492,492,492,492,492,492,492,492,492,492,492,492,492,
+492,492,492,492,492,492,492,492,492,492,492,492,492,492,492,492,
+492,492,492,492,492,492,492,492,492,492,492,492,492,492,492,492,
+492,492,492,492,492,492,492,492,492,492,492,492,492,492,492,492,
+492,492,492,492,492,492,492,492,492,492,492,492,492,492,492,492,
+
+/* block 102 */
+492,492,492,492,492,492,492,492,492,492,492,492,493,494,494,494,
+492,492,492,492,492,492,492,492,492,492,492,492,492,492,492,492,
+495,495,495,495,495,495,495,495,495,495,492,492,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+175,176,175,176,175,176,175,176,175,176,175,176,175,176,175,176,
+175,176,175,176,175,176,175,176,175,176,175,176,175,176,175,176,
+175,176,175,176,175,176,175,176,175,176,175,176,175,176,496,178,
+179,179,179,497,178,178,178,178,178,178,178,178,178,178,497,409,
+
+/* block 103 */
+175,176,175,176,175,176,175,176,175,176,175,176,175,176,175,176,
+175,176,175,176,175,176,175,176,175,176,175,176,409,409,178,178,
+498,498,498,498,498,498,498,498,498,498,498,498,498,498,498,498,
+498,498,498,498,498,498,498,498,498,498,498,498,498,498,498,498,
+498,498,498,498,498,498,498,498,498,498,498,498,498,498,498,498,
+498,498,498,498,498,498,498,498,498,498,498,498,498,498,498,498,
+498,498,498,498,498,498,499,499,499,499,499,499,499,499,499,499,
+500,500,501,501,501,501,501,501,115,115,115,115,115,115,115,115,
+
+/* block 104 */
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14,108,108,108,108,108,108,108,108,108,
+ 14, 14, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,
+ 33, 33, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,
+ 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,
+ 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,
+ 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,
+107, 33, 33, 33, 33, 33, 33, 33, 33, 30, 31, 30, 31,502, 30, 31,
+
+/* block 105 */
+ 30, 31, 30, 31, 30, 31, 30, 31,108, 14, 14, 30, 31,503, 33, 20,
+ 30, 31, 30, 31, 33, 33, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,
+ 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,504,505,506,507,115,115,
+508,509,510,511, 30, 31, 30, 31,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115, 20,107,107, 33, 20, 20, 20, 20, 20,
+
+/* block 106 */
+512,512,513,512,512,512,513,512,512,512,512,513,512,512,512,512,
+512,512,512,512,512,512,512,512,512,512,512,512,512,512,512,512,
+512,512,512,514,514,513,513,514,515,515,515,515,115,115,115,115,
+ 23, 23, 23, 23, 23, 23, 19, 19,  5, 19,115,115,115,115,115,115,
+516,516,516,516,516,516,516,516,516,516,516,516,516,516,516,516,
+516,516,516,516,516,516,516,516,516,516,516,516,516,516,516,516,
+516,516,516,516,516,516,516,516,516,516,516,516,516,516,516,516,
+516,516,516,516,517,517,517,517,115,115,115,115,115,115,115,115,
+
+/* block 107 */
+518,518,519,519,519,519,519,519,519,519,519,519,519,519,519,519,
+519,519,519,519,519,519,519,519,519,519,519,519,519,519,519,519,
+519,519,519,519,519,519,519,519,519,519,519,519,519,519,519,519,
+519,519,519,519,518,518,518,518,518,518,518,518,518,518,518,518,
+518,518,518,518,520,115,115,115,115,115,115,115,115,115,521,521,
+522,522,522,522,522,522,522,522,522,522,115,115,115,115,115,115,
+222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,
+222,222,224,224,224,224,224,224,226,226,226,224,226,224,115,115,
+
+/* block 108 */
+523,523,523,523,523,523,523,523,523,523,524,524,524,524,524,524,
+524,524,524,524,524,524,524,524,524,524,524,524,524,524,524,524,
+524,524,524,524,524,524,525,525,525,525,525,525,525,525,  4,526,
+527,527,527,527,527,527,527,527,527,527,527,527,527,527,527,527,
+527,527,527,527,527,527,527,528,528,528,528,528,528,528,528,528,
+528,528,529,529,115,115,115,115,115,115,115,115,115,115,115,530,
+315,315,315,315,315,315,315,315,315,315,315,315,315,315,315,315,
+315,315,315,315,315,315,315,315,315,315,315,315,315,115,115,115,
+
+/* block 109 */
+531,531,531,532,533,533,533,533,533,533,533,533,533,533,533,533,
+533,533,533,533,533,533,533,533,533,533,533,533,533,533,533,533,
+533,533,533,533,533,533,533,533,533,533,533,533,533,533,533,533,
+533,533,533,531,532,532,531,531,531,531,532,532,531,532,532,532,
+532,534,534,534,534,534,534,534,534,534,534,534,534,534,115,108,
+535,535,535,535,535,535,535,535,535,535,115,115,115,115,534,534,
+305,305,305,305,305,307,536,305,305,305,305,305,305,305,305,305,
+309,309,309,309,309,309,309,309,309,309,305,305,305,305,305,115,
+
+/* block 110 */
+537,537,537,537,537,537,537,537,537,537,537,537,537,537,537,537,
+537,537,537,537,537,537,537,537,537,537,537,537,537,537,537,537,
+537,537,537,537,537,537,537,537,537,538,538,538,538,538,538,539,
+539,538,538,539,539,538,538,115,115,115,115,115,115,115,115,115,
+537,537,537,538,537,537,537,537,537,537,537,537,538,539,115,115,
+540,540,540,540,540,540,540,540,540,540,115,115,541,541,541,541,
+305,305,305,305,305,305,305,305,305,305,305,305,305,305,305,305,
+536,305,305,305,305,305,305,311,311,311,305,306,307,306,305,305,
+
+/* block 111 */
+542,542,542,542,542,542,542,542,542,542,542,542,542,542,542,542,
+542,542,542,542,542,542,542,542,542,542,542,542,542,542,542,542,
+542,542,542,542,542,542,542,542,542,542,542,542,542,542,542,542,
+543,542,543,543,543,542,542,543,543,542,542,542,542,542,543,543,
+542,543,542,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,542,542,544,545,545,
+546,546,546,546,546,546,546,546,546,546,546,547,548,548,547,547,
+549,549,546,550,550,547,548,115,115,115,115,115,115,115,115,115,
+
+/* block 112 */
+115,318,318,318,318,318,318,115,115,318,318,318,318,318,318,115,
+115,318,318,318,318,318,318,115,115,115,115,115,115,115,115,115,
+318,318,318,318,318,318,318,115,318,318,318,318,318,318,318,115,
+ 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33,551, 33, 33, 33, 33, 33, 33, 33, 14,107,107,107,107,
+ 33, 33, 33, 33, 33,123,115,115,115,115,115,115,115,115,115,115,
+552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,
+
+/* block 113 */
+552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,
+552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,
+552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,
+552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,
+546,546,546,546,546,546,546,546,546,546,546,546,546,546,546,546,
+546,546,546,546,546,546,546,546,546,546,546,546,546,546,546,546,
+546,546,546,547,547,548,547,547,548,547,547,549,547,548,115,115,
+553,553,553,553,553,553,553,553,553,553,115,115,115,115,115,115,
+
+/* block 114 */
+554,555,555,555,555,555,555,555,555,555,555,555,555,555,555,555,
+555,555,555,555,555,555,555,555,555,555,555,555,554,555,555,555,
+555,555,555,555,555,555,555,555,555,555,555,555,555,555,555,555,
+555,555,555,555,555,555,555,555,554,555,555,555,555,555,555,555,
+555,555,555,555,555,555,555,555,555,555,555,555,555,555,555,555,
+555,555,555,555,554,555,555,555,555,555,555,555,555,555,555,555,
+555,555,555,555,555,555,555,555,555,555,555,555,555,555,555,555,
+554,555,555,555,555,555,555,555,555,555,555,555,555,555,555,555,
+
+/* block 115 */
+555,555,555,555,555,555,555,555,555,555,555,555,554,555,555,555,
+555,555,555,555,555,555,555,555,555,555,555,555,555,555,555,555,
+555,555,555,555,555,555,555,555,554,555,555,555,555,555,555,555,
+555,555,555,555,555,555,555,555,555,555,555,555,555,555,555,555,
+555,555,555,555,554,555,555,555,555,555,555,555,555,555,555,555,
+555,555,555,555,555,555,555,555,555,555,555,555,555,555,555,555,
+554,555,555,555,555,555,555,555,555,555,555,555,555,555,555,555,
+555,555,555,555,555,555,555,555,555,555,555,555,554,555,555,555,
+
+/* block 116 */
+555,555,555,555,555,555,555,555,555,555,555,555,555,555,555,555,
+555,555,555,555,555,555,555,555,554,555,555,555,555,555,555,555,
+555,555,555,555,555,555,555,555,555,555,555,555,555,555,555,555,
+555,555,555,555,554,555,555,555,555,555,555,555,555,555,555,555,
+555,555,555,555,555,555,555,555,555,555,555,555,555,555,555,555,
+554,555,555,555,555,555,555,555,555,555,555,555,555,555,555,555,
+555,555,555,555,555,555,555,555,555,555,555,555,554,555,555,555,
+555,555,555,555,555,555,555,555,555,555,555,555,555,555,555,555,
+
+/* block 117 */
+555,555,555,555,555,555,555,555,554,555,555,555,555,555,555,555,
+555,555,555,555,555,555,555,555,555,555,555,555,555,555,555,555,
+555,555,555,555,554,555,555,555,555,555,555,555,555,555,555,555,
+555,555,555,555,555,555,555,555,555,555,555,555,555,555,555,555,
+554,555,555,555,555,555,555,555,555,555,555,555,555,555,555,555,
+555,555,555,555,555,555,555,555,555,555,555,555,554,555,555,555,
+555,555,555,555,555,555,555,555,555,555,555,555,555,555,555,555,
+555,555,555,555,555,555,555,555,554,555,555,555,555,555,555,555,
+
+/* block 118 */
+555,555,555,555,555,555,555,555,555,555,555,555,555,555,555,555,
+555,555,555,555,554,555,555,555,555,555,555,555,555,555,555,555,
+555,555,555,555,555,555,555,555,555,555,555,555,555,555,555,555,
+554,555,555,555,555,555,555,555,555,555,555,555,555,555,555,555,
+555,555,555,555,555,555,555,555,555,555,555,555,554,555,555,555,
+555,555,555,555,555,555,555,555,555,555,555,555,555,555,555,555,
+555,555,555,555,555,555,555,555,554,555,555,555,555,555,555,555,
+555,555,555,555,555,555,555,555,555,555,555,555,555,555,555,555,
+
+/* block 119 */
+555,555,555,555,554,555,555,555,555,555,555,555,555,555,555,555,
+555,555,555,555,555,555,555,555,555,555,555,555,555,555,555,555,
+554,555,555,555,555,555,555,555,555,555,555,555,555,555,555,555,
+555,555,555,555,555,555,555,555,555,555,555,555,554,555,555,555,
+555,555,555,555,555,555,555,555,555,555,555,555,555,555,555,555,
+555,555,555,555,555,555,555,555,554,555,555,555,555,555,555,555,
+555,555,555,555,555,555,555,555,555,555,555,555,555,555,555,555,
+555,555,555,555,554,555,555,555,555,555,555,555,555,555,555,555,
+
+/* block 120 */
+555,555,555,555,555,555,555,555,555,555,555,555,555,555,555,555,
+554,555,555,555,555,555,555,555,555,555,555,555,555,555,555,555,
+555,555,555,555,555,555,555,555,555,555,555,555,554,555,555,555,
+555,555,555,555,555,555,555,555,555,555,555,555,555,555,555,555,
+555,555,555,555,555,555,555,555,554,555,555,555,555,555,555,555,
+555,555,555,555,555,555,555,555,555,555,555,555,555,555,555,555,
+555,555,555,555,554,555,555,555,555,555,555,555,555,555,555,555,
+555,555,555,555,555,555,555,555,555,555,555,555,555,555,555,555,
+
+/* block 121 */
+555,555,555,555,555,555,555,555,554,555,555,555,555,555,555,555,
+555,555,555,555,555,555,555,555,555,555,555,555,555,555,555,555,
+555,555,555,555,115,115,115,115,115,115,115,115,115,115,115,115,
+316,316,316,316,316,316,316,316,316,316,316,316,316,316,316,316,
+316,316,316,316,316,316,316,115,115,115,115,317,317,317,317,317,
+317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,
+317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,
+317,317,317,317,317,317,317,317,317,317,317,317,115,115,115,115,
+
+/* block 122 */
+556,556,556,556,556,556,556,556,556,556,556,556,556,556,556,556,
+556,556,556,556,556,556,556,556,556,556,556,556,556,556,556,556,
+556,556,556,556,556,556,556,556,556,556,556,556,556,556,556,556,
+556,556,556,556,556,556,556,556,556,556,556,556,556,556,556,556,
+556,556,556,556,556,556,556,556,556,556,556,556,556,556,556,556,
+556,556,556,556,556,556,556,556,556,556,556,556,556,556,556,556,
+556,556,556,556,556,556,556,556,556,556,556,556,556,556,556,556,
+556,556,556,556,556,556,556,556,556,556,556,556,556,556,556,556,
+
+/* block 123 */
+557,557,557,557,557,557,557,557,557,557,557,557,557,557,557,557,
+557,557,557,557,557,557,557,557,557,557,557,557,557,557,557,557,
+557,557,557,557,557,557,557,557,557,557,557,557,557,557,557,557,
+557,557,557,557,557,557,557,557,557,557,557,557,557,557,557,557,
+557,557,557,557,557,557,557,557,557,557,557,557,557,557,557,557,
+557,557,557,557,557,557,557,557,557,557,557,557,557,557,557,557,
+557,557,557,557,557,557,557,557,557,557,557,557,557,557,557,557,
+557,557,557,557,557,557,557,557,557,557,557,557,557,557,557,557,
+
+/* block 124 */
+485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,
+485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,
+485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,
+485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,
+485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,
+485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,
+485,485,485,485,485,485,485,485,485,485,485,485,485,485,115,115,
+485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,
+
+/* block 125 */
+485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,
+485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,
+485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,
+485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,
+485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,
+485,485,485,485,485,485,485,485,485,485,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+
+/* block 126 */
+ 33, 33, 33, 33, 33, 33, 33,115,115,115,115,115,115,115,115,115,
+115,115,115,186,186,186,186,186,115,115,115,115,115,193,190,193,
+193,193,193,193,193,193,193,193,193,558,193,193,193,193,193,193,
+193,193,193,193,193,193,193,115,193,193,193,193,193,115,193,115,
+193,193,115,193,193,115,193,193,193,193,193,193,193,193,193,193,
+200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,
+200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,
+200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,
+
+/* block 127 */
+200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,
+200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,
+200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,
+200,200,559,559,559,559,559,559,559,559,559,559,559,559,559,559,
+559,559,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,200,200,200,200,200,200,200,200,200,200,200,200,200,
+200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,
+200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,
+
+/* block 128 */
+200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,
+200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,
+200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,
+200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,
+200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,
+200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,
+200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,
+200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,
+
+/* block 129 */
+200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,
+200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,
+200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,
+200,200,200,200,200,200,200,200,200,200,200,200,200,200,  7,  6,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,
+200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,
+200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,
+
+/* block 130 */
+200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,
+115,115,200,200,200,200,200,200,200,200,200,200,200,200,200,200,
+200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,
+200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,
+200,200,200,200,200,200,200,200,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+200,200,200,200,200,200,200,200,200,200,200,200,197,198,115,115,
+
+/* block 131 */
+110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,
+  4,  4,  4,  4,  4,  4,  4,  6,  7,  4,115,115,115,115,115,115,
+110,110,110,110,110,110,110,110,110,110,110,110,110,110,178,178,
+  4,  9,  9, 15, 15,  6,  7,  6,  7,  6,  7,  6,  7,  6,  7,  6,
+  7,  6,  7,  6,  7,  4,  4,  6,  7,  4,  4,  4,  4, 15, 15, 15,
+  4,  4,  4,115,  4,  4,  4,  4,  9,  6,  7,  6,  7,  6,  7,  4,
+  4,  4,  8,  9,  8,  8,  8,115,  4,  5,  4,  4,115,115,115,115,
+200,200,200,200,200,115,200,200,200,200,200,200,200,200,200,200,
+
+/* block 132 */
+200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,
+200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,
+200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,
+200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,
+200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,
+200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,
+200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,
+200,200,200,200,200,200,200,200,200,200,200,200,200,115,115, 22,
+
+/* block 133 */
+115,  4,  4,  4,  5,  4,  4,  4,  6,  7,  4,  8,  4,  9,  4,  4,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  4,  4,  8,  8,  8,  4,
+  4, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  6,  4,  7, 14, 15,
+ 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,  6,  8,  7,  8,  6,
+  7,  4,  6,  7,  4,  4,479,479,479,479,479,479,479,479,479,479,
+108,479,479,479,479,479,479,479,479,479,479,479,479,479,479,479,
+
+/* block 134 */
+479,479,479,479,479,479,479,479,479,479,479,479,479,479,479,479,
+479,479,479,479,479,479,479,479,479,479,479,479,479,479,560,560,
+482,482,482,482,482,482,482,482,482,482,482,482,482,482,482,482,
+482,482,482,482,482,482,482,482,482,482,482,482,482,482,482,115,
+115,115,482,482,482,482,482,482,115,115,482,482,482,482,482,482,
+115,115,482,482,482,482,482,482,115,115,482,482,482,115,115,115,
+  5,  5,  8, 14, 19,  5,  5,115, 19,  8,  8,  8,  8, 19, 19,115,
+437,437,437,437,437,437,437,437,437, 22, 22, 22, 19, 19,115,115,
+
+/* block 135 */
+561,561,561,561,561,561,561,561,561,561,561,561,115,561,561,561,
+561,561,561,561,561,561,561,561,561,561,561,561,561,561,561,561,
+561,561,561,561,561,561,561,115,561,561,561,561,561,561,561,561,
+561,561,561,561,561,561,561,561,561,561,561,115,561,561,115,561,
+561,561,561,561,561,561,561,561,561,561,561,561,561,561,115,115,
+561,561,561,561,561,561,561,561,561,561,561,561,561,561,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+
+/* block 136 */
+561,561,561,561,561,561,561,561,561,561,561,561,561,561,561,561,
+561,561,561,561,561,561,561,561,561,561,561,561,561,561,561,561,
+561,561,561,561,561,561,561,561,561,561,561,561,561,561,561,561,
+561,561,561,561,561,561,561,561,561,561,561,561,561,561,561,561,
+561,561,561,561,561,561,561,561,561,561,561,561,561,561,561,561,
+561,561,561,561,561,561,561,561,561,561,561,561,561,561,561,561,
+561,561,561,561,561,561,561,561,561,561,561,561,561,561,561,561,
+561,561,561,561,561,561,561,561,561,561,561,115,115,115,115,115,
+
+/* block 137 */
+  4,  4,  4,115,115,115,115, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23,115,115,115, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+562,562,562,562,562,562,562,562,562,562,562,562,562,562,562,562,
+562,562,562,562,562,562,562,562,562,562,562,562,562,562,562,562,
+562,562,562,562,562,562,562,562,562,562,562,562,562,562,562,562,
+562,562,562,562,562,563,563,563,563,564,564,564,564,564,564,564,
+
+/* block 138 */
+564,564,564,564,564,564,564,564,564,564,563,563,564,115,115,115,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,115,115,115,115,
+564,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,110,115,115,
+
+/* block 139 */
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+
+/* block 140 */
+565,565,565,565,565,565,565,565,565,565,565,565,565,565,565,565,
+565,565,565,565,565,565,565,565,565,565,565,565,565,115,115,115,
+566,566,566,566,566,566,566,566,566,566,566,566,566,566,566,566,
+566,566,566,566,566,566,566,566,566,566,566,566,566,566,566,566,
+566,566,566,566,566,566,566,566,566,566,566,566,566,566,566,566,
+566,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+110, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,115,115,115,115,
+
+/* block 141 */
+567,567,567,567,567,567,567,567,567,567,567,567,567,567,567,567,
+567,567,567,567,567,567,567,567,567,567,567,567,567,567,567,567,
+568,568,568,568,115,115,115,115,115,115,115,115,115,115,115,115,
+569,569,569,569,569,569,569,569,569,569,569,569,569,569,569,569,
+569,570,569,569,569,569,569,569,569,569,570,115,115,115,115,115,
+571,571,571,571,571,571,571,571,571,571,571,571,571,571,571,571,
+571,571,571,571,571,571,571,571,571,571,571,571,571,571,571,571,
+571,571,571,571,571,571,572,572,572,572,572,115,115,115,115,115,
+
+/* block 142 */
+573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,
+573,573,573,573,573,573,573,573,573,573,573,573,573,573,115,574,
+575,575,575,575,575,575,575,575,575,575,575,575,575,575,575,575,
+575,575,575,575,575,575,575,575,575,575,575,575,575,575,575,575,
+575,575,575,575,115,115,115,115,575,575,575,575,575,575,575,575,
+576,577,577,577,577,577,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+
+/* block 143 */
+578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,
+578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,
+578,578,578,578,578,578,578,578,579,579,579,579,579,579,579,579,
+579,579,579,579,579,579,579,579,579,579,579,579,579,579,579,579,
+579,579,579,579,579,579,579,579,579,579,579,579,579,579,579,579,
+580,580,580,580,580,580,580,580,580,580,580,580,580,580,580,580,
+580,580,580,580,580,580,580,580,580,580,580,580,580,580,580,580,
+580,580,580,580,580,580,580,580,580,580,580,580,580,580,580,580,
+
+/* block 144 */
+581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,
+581,581,581,581,581,581,581,581,581,581,581,581,581,581,115,115,
+582,582,582,582,582,582,582,582,582,582,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+
+/* block 145 */
+583,583,583,583,583,583,583,583,583,583,583,583,583,583,583,583,
+583,583,583,583,583,583,583,583,583,583,583,583,583,583,583,583,
+583,583,583,583,583,583,583,583,115,115,115,115,115,115,115,115,
+584,584,584,584,584,584,584,584,584,584,584,584,584,584,584,584,
+584,584,584,584,584,584,584,584,584,584,584,584,584,584,584,584,
+584,584,584,584,584,584,584,584,584,584,584,584,584,584,584,584,
+584,584,584,584,115,115,115,115,115,115,115,115,115,115,115,585,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+
+/* block 146 */
+586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
+586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
+586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
+586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
+586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
+586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
+586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
+586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
+
+/* block 147 */
+586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
+586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
+586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
+586,586,586,586,586,586,586,115,115,115,115,115,115,115,115,115,
+586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,
+586,586,586,586,586,586,115,115,115,115,115,115,115,115,115,115,
+586,586,586,586,586,586,586,586,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+
+/* block 148 */
+587,587,587,587,587,587,115,115,587,115,587,587,587,587,587,587,
+587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,
+587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,
+587,587,587,587,587,587,115,587,587,115,115,115,587,115,115,587,
+588,588,588,588,588,588,588,588,588,588,588,588,588,588,588,588,
+588,588,588,588,588,588,115,589,590,590,590,590,590,590,590,590,
+591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,
+591,591,591,591,591,591,591,592,592,593,593,593,593,593,593,593,
+
+/* block 149 */
+594,594,594,594,594,594,594,594,594,594,594,594,594,594,594,594,
+594,594,594,594,594,594,594,594,594,594,594,594,594,594,594,115,
+115,115,115,115,115,115,115,595,595,595,595,595,595,595,595,595,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+596,596,596,596,596,596,596,596,596,596,596,596,596,596,596,596,
+596,596,596,115,596,596,115,115,115,115,115,597,597,597,597,597,
+
+/* block 150 */
+598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,
+598,598,598,598,598,598,599,599,599,599,599,599,115,115,115,600,
+601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,
+601,601,601,601,601,601,601,601,601,601,115,115,115,115,115,602,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+
+/* block 151 */
+603,603,603,603,603,603,603,603,603,603,603,603,603,603,603,603,
+603,603,603,603,603,603,603,603,603,603,603,603,603,603,603,603,
+604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,
+604,604,604,604,604,604,604,604,115,115,115,115,605,605,604,604,
+605,605,605,605,605,605,605,605,605,605,605,605,605,605,605,605,
+115,115,605,605,605,605,605,605,605,605,605,605,605,605,605,605,
+605,605,605,605,605,605,605,605,605,605,605,605,605,605,605,605,
+605,605,605,605,605,605,605,605,605,605,605,605,605,605,605,605,
+
+/* block 152 */
+606,607,607,607,115,607,607,115,115,115,115,115,607,607,607,607,
+606,606,606,606,115,606,606,606,115,606,606,606,606,606,606,606,
+606,606,606,606,606,606,606,606,606,606,606,606,606,606,606,606,
+606,606,606,606,115,115,115,115,607,607,607,115,115,115,115,607,
+608,608,608,608,608,608,608,608,115,115,115,115,115,115,115,115,
+609,609,609,609,609,609,609,609,609,115,115,115,115,115,115,115,
+610,610,610,610,610,610,610,610,610,610,610,610,610,610,610,610,
+610,610,610,610,610,610,610,610,610,610,610,610,610,611,611,612,
+
+/* block 153 */
+613,613,613,613,613,613,613,613,613,613,613,613,613,613,613,613,
+613,613,613,613,613,613,613,613,613,613,613,613,613,614,614,614,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+615,615,615,615,615,615,615,615,616,615,615,615,615,615,615,615,
+615,615,615,615,615,615,615,615,615,615,615,615,615,615,615,615,
+615,615,615,615,615,617,617,115,115,115,115,618,618,618,618,618,
+619,619,619,619,619,619,619,115,115,115,115,115,115,115,115,115,
+
+/* block 154 */
+620,620,620,620,620,620,620,620,620,620,620,620,620,620,620,620,
+620,620,620,620,620,620,620,620,620,620,620,620,620,620,620,620,
+620,620,620,620,620,620,620,620,620,620,620,620,620,620,620,620,
+620,620,620,620,620,620,115,115,115,621,621,621,621,621,621,621,
+622,622,622,622,622,622,622,622,622,622,622,622,622,622,622,622,
+622,622,622,622,622,622,115,115,623,623,623,623,623,623,623,623,
+624,624,624,624,624,624,624,624,624,624,624,624,624,624,624,624,
+624,624,624,115,115,115,115,115,625,625,625,625,625,625,625,625,
+
+/* block 155 */
+626,626,626,626,626,626,626,626,626,626,626,626,626,626,626,626,
+626,626,115,115,115,115,115,115,115,627,627,627,627,115,115,115,
+115,115,115,115,115,115,115,115,115,628,628,628,628,628,628,628,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+
+/* block 156 */
+629,629,629,629,629,629,629,629,629,629,629,629,629,629,629,629,
+629,629,629,629,629,629,629,629,629,629,629,629,629,629,629,629,
+629,629,629,629,629,629,629,629,629,629,629,629,629,629,629,629,
+629,629,629,629,629,629,629,629,629,629,629,629,629,629,629,629,
+629,629,629,629,629,629,629,629,629,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+
+/* block 157 */
+630,630,630,630,630,630,630,630,630,630,630,630,630,630,630,630,
+630,630,630,630,630,630,630,630,630,630,630,630,630,630,630,630,
+630,630,630,630,630,630,630,630,630,630,630,630,630,630,630,630,
+630,630,630,115,115,115,115,115,115,115,115,115,115,115,115,115,
+631,631,631,631,631,631,631,631,631,631,631,631,631,631,631,631,
+631,631,631,631,631,631,631,631,631,631,631,631,631,631,631,631,
+631,631,631,631,631,631,631,631,631,631,631,631,631,631,631,631,
+631,631,631,115,115,115,115,115,115,115,632,632,632,632,632,632,
+
+/* block 158 */
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+633,633,633,633,633,633,633,633,633,633,633,633,633,633,633,633,
+633,633,633,633,633,633,633,633,633,633,633,633,633,633,633,115,
+
+/* block 159 */
+634,635,634,636,636,636,636,636,636,636,636,636,636,636,636,636,
+636,636,636,636,636,636,636,636,636,636,636,636,636,636,636,636,
+636,636,636,636,636,636,636,636,636,636,636,636,636,636,636,636,
+636,636,636,636,636,636,636,636,635,635,635,635,635,635,635,635,
+635,635,635,635,635,635,635,637,637,637,637,637,637,637,115,115,
+115,115,638,638,638,638,638,638,638,638,638,638,638,638,638,638,
+638,638,638,638,638,638,639,639,639,639,639,639,639,639,639,639,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,635,
+
+/* block 160 */
+640,640,641,642,642,642,642,642,642,642,642,642,642,642,642,642,
+642,642,642,642,642,642,642,642,642,642,642,642,642,642,642,642,
+642,642,642,642,642,642,642,642,642,642,642,642,642,642,642,642,
+641,641,641,640,640,640,640,641,641,640,640,643,643,644,643,643,
+643,643,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+645,645,645,645,645,645,645,645,645,645,645,645,645,645,645,645,
+645,645,645,645,645,645,645,645,645,115,115,115,115,115,115,115,
+646,646,646,646,646,646,646,646,646,646,115,115,115,115,115,115,
+
+/* block 161 */
+647,647,647,648,648,648,648,648,648,648,648,648,648,648,648,648,
+648,648,648,648,648,648,648,648,648,648,648,648,648,648,648,648,
+648,648,648,648,648,648,648,647,647,647,647,647,649,647,647,647,
+647,647,647,647,647,115,650,650,650,650,650,650,650,650,650,650,
+651,651,651,651,115,115,115,115,115,115,115,115,115,115,115,115,
+652,652,652,652,652,652,652,652,652,652,652,652,652,652,652,652,
+652,652,652,652,652,652,652,652,652,652,652,652,652,652,652,652,
+652,652,652,653,654,654,652,115,115,115,115,115,115,115,115,115,
+
+/* block 162 */
+655,655,656,657,657,657,657,657,657,657,657,657,657,657,657,657,
+657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,
+657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,657,
+657,657,657,656,656,656,655,655,655,655,655,655,655,655,655,656,
+656,657,657,657,657,658,658,658,658,658,655,655,655,658,115,115,
+659,659,659,659,659,659,659,659,659,659,657,658,657,658,658,658,
+115,660,660,660,660,660,660,660,660,660,660,660,660,660,660,660,
+660,660,660,660,660,115,115,115,115,115,115,115,115,115,115,115,
+
+/* block 163 */
+661,661,661,661,661,661,661,661,661,661,661,661,661,661,661,661,
+661,661,115,661,661,661,661,661,661,661,661,661,661,661,661,661,
+661,661,661,661,661,661,661,661,661,661,661,661,662,662,662,663,
+663,663,662,662,663,662,663,663,664,664,664,664,664,664,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+
+/* block 164 */
+665,665,665,665,665,665,665,115,665,115,665,665,665,665,115,665,
+665,665,665,665,665,665,665,665,665,665,665,665,665,665,115,665,
+665,665,665,665,665,665,665,665,665,666,115,115,115,115,115,115,
+667,667,667,667,667,667,667,667,667,667,667,667,667,667,667,667,
+667,667,667,667,667,667,667,667,667,667,667,667,667,667,667,667,
+667,667,667,667,667,667,667,667,667,667,667,667,667,667,667,668,
+669,669,669,668,668,668,668,668,668,668,668,115,115,115,115,115,
+670,670,670,670,670,670,670,670,670,670,115,115,115,115,115,115,
+
+/* block 165 */
+671,671,672,672,115,673,673,673,673,673,673,673,673,115,115,673,
+673,115,115,673,673,673,673,673,673,673,673,673,673,673,673,673,
+673,673,673,673,673,673,673,673,673,115,673,673,673,673,673,673,
+673,115,673,673,115,673,673,673,673,673,115,115,671,673,674,672,
+671,672,672,672,672,115,115,672,672,115,115,672,672,672,115,115,
+673,115,115,115,115,115,115,674,115,115,115,115,115,673,673,673,
+673,673,672,672,115,115,671,671,671,671,671,671,671,115,115,115,
+671,671,671,671,671,115,115,115,115,115,115,115,115,115,115,115,
+
+/* block 166 */
+675,675,675,675,675,675,675,675,675,675,675,675,675,675,675,675,
+675,675,675,675,675,675,675,675,675,675,675,675,675,675,675,675,
+675,675,675,675,675,675,675,675,675,675,675,675,675,675,675,675,
+676,677,677,678,678,678,678,678,678,677,678,677,677,676,677,678,
+678,677,678,678,675,675,679,675,115,115,115,115,115,115,115,115,
+680,680,680,680,680,680,680,680,680,680,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+
+/* block 167 */
+681,681,681,681,681,681,681,681,681,681,681,681,681,681,681,681,
+681,681,681,681,681,681,681,681,681,681,681,681,681,681,681,681,
+681,681,681,681,681,681,681,681,681,681,681,681,681,681,681,682,
+683,683,684,684,684,684,115,115,683,683,683,683,684,684,683,684,
+684,685,685,685,685,685,685,685,685,685,685,685,685,685,685,685,
+685,685,685,685,685,685,685,685,681,681,681,681,684,684,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+
+/* block 168 */
+686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,
+686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,
+686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,
+687,687,687,688,688,688,688,688,688,688,688,687,687,688,687,688,
+688,689,689,689,686,115,115,115,115,115,115,115,115,115,115,115,
+690,690,690,690,690,690,690,690,690,690,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+
+/* block 169 */
+691,691,691,691,691,691,691,691,691,691,691,691,691,691,691,691,
+691,691,691,691,691,691,691,691,691,691,691,691,691,691,691,691,
+691,691,691,691,691,691,691,691,691,691,691,692,693,692,693,693,
+692,692,692,692,692,692,693,692,115,115,115,115,115,115,115,115,
+694,694,694,694,694,694,694,694,694,694,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+
+/* block 170 */
+695,695,695,695,695,695,695,695,695,695,695,695,695,695,695,695,
+695,695,695,695,695,695,695,695,695,695,115,115,115,696,696,696,
+697,697,696,696,696,696,697,696,696,696,696,696,115,115,115,115,
+698,698,698,698,698,698,698,698,698,698,699,699,700,700,700,701,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+
+/* block 171 */
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+702,702,702,702,702,702,702,702,702,702,702,702,702,702,702,702,
+702,702,702,702,702,702,702,702,702,702,702,702,702,702,702,702,
+703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,
+703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,
+704,704,704,704,704,704,704,704,704,704,705,705,705,705,705,705,
+705,705,705,115,115,115,115,115,115,115,115,115,115,115,115,706,
+
+/* block 172 */
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,
+707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,
+707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,
+707,707,707,707,707,707,707,707,707,115,115,115,115,115,115,115,
+
+/* block 173 */
+708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,
+708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,
+708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,
+708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,
+708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,
+708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,
+708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,
+708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,
+
+/* block 174 */
+708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,
+708,708,708,708,708,708,708,708,708,708,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+
+/* block 175 */
+709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,
+709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,
+709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,
+709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,
+709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,
+709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,
+709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,115,
+710,710,710,710,710,115,115,115,115,115,115,115,115,115,115,115,
+
+/* block 176 */
+708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,
+708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,
+708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,
+708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,
+708,708,708,708,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+
+/* block 177 */
+711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,
+711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,
+711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,
+711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,
+711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,
+711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,
+711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,
+711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,
+
+/* block 178 */
+711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,
+711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,
+711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+
+/* block 179 */
+712,712,712,712,712,712,712,712,712,712,712,712,712,712,712,712,
+712,712,712,712,712,712,712,712,712,712,712,712,712,712,712,712,
+712,712,712,712,712,712,712,712,712,712,712,712,712,712,712,712,
+712,712,712,712,712,712,712,712,712,712,712,712,712,712,712,712,
+712,712,712,712,712,712,712,712,712,712,712,712,712,712,712,712,
+712,712,712,712,712,712,712,712,712,712,712,712,712,712,712,712,
+712,712,712,712,712,712,712,712,712,712,712,712,712,712,712,712,
+712,712,712,712,712,712,712,712,712,712,712,712,712,712,712,712,
+
+/* block 180 */
+712,712,712,712,712,712,712,712,712,712,712,712,712,712,712,712,
+712,712,712,712,712,712,712,712,712,712,712,712,712,712,712,712,
+712,712,712,712,712,712,712,712,712,712,712,712,712,712,712,712,
+712,712,712,712,712,712,712,712,712,712,712,712,712,712,712,712,
+712,712,712,712,712,712,712,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+
+/* block 181 */
+498,498,498,498,498,498,498,498,498,498,498,498,498,498,498,498,
+498,498,498,498,498,498,498,498,498,498,498,498,498,498,498,498,
+498,498,498,498,498,498,498,498,498,498,498,498,498,498,498,498,
+498,498,498,498,498,498,498,498,498,498,498,498,498,498,498,498,
+498,498,498,498,498,498,498,498,498,498,498,498,498,498,498,498,
+498,498,498,498,498,498,498,498,498,498,498,498,498,498,498,498,
+498,498,498,498,498,498,498,498,498,498,498,498,498,498,498,498,
+498,498,498,498,498,498,498,498,498,498,498,498,498,498,498,498,
+
+/* block 182 */
+498,498,498,498,498,498,498,498,498,498,498,498,498,498,498,498,
+498,498,498,498,498,498,498,498,498,498,498,498,498,498,498,498,
+498,498,498,498,498,498,498,498,498,498,498,498,498,498,498,498,
+498,498,498,498,498,498,498,498,498,115,115,115,115,115,115,115,
+713,713,713,713,713,713,713,713,713,713,713,713,713,713,713,713,
+713,713,713,713,713,713,713,713,713,713,713,713,713,713,713,115,
+714,714,714,714,714,714,714,714,714,714,115,115,115,115,715,715,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+
+/* block 183 */
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+716,716,716,716,716,716,716,716,716,716,716,716,716,716,716,716,
+716,716,716,716,716,716,716,716,716,716,716,716,716,716,115,115,
+717,717,717,717,717,718,115,115,115,115,115,115,115,115,115,115,
+
+/* block 184 */
+719,719,719,719,719,719,719,719,719,719,719,719,719,719,719,719,
+719,719,719,719,719,719,719,719,719,719,719,719,719,719,719,719,
+719,719,719,719,719,719,719,719,719,719,719,719,719,719,719,719,
+720,720,720,720,720,720,720,721,721,721,721,721,722,722,722,722,
+723,723,723,723,721,722,115,115,115,115,115,115,115,115,115,115,
+724,724,724,724,724,724,724,724,724,724,115,725,725,725,725,725,
+725,725,115,719,719,719,719,719,719,719,719,719,719,719,719,719,
+719,719,719,719,719,719,719,719,115,115,115,115,115,719,719,719,
+
+/* block 185 */
+719,719,719,719,719,719,719,719,719,719,719,719,719,719,719,719,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+
+/* block 186 */
+726,726,726,726,726,726,726,726,726,726,726,726,726,726,726,726,
+726,726,726,726,726,726,726,726,726,726,726,726,726,726,726,726,
+726,726,726,726,726,726,726,726,726,726,726,726,726,726,726,726,
+726,726,726,726,726,726,726,726,726,726,726,726,726,726,726,726,
+726,726,726,726,726,115,115,115,115,115,115,115,115,115,115,115,
+726,727,727,727,727,727,727,727,727,727,727,727,727,727,727,727,
+727,727,727,727,727,727,727,727,727,727,727,727,727,727,727,727,
+727,727,727,727,727,727,727,727,727,727,727,727,727,727,727,115,
+
+/* block 187 */
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,728,
+728,728,728,729,729,729,729,729,729,729,729,729,729,729,729,729,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+
+/* block 188 */
+479,477,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+
+/* block 189 */
+730,730,730,730,730,730,730,730,730,730,730,730,730,730,730,730,
+730,730,730,730,730,730,730,730,730,730,730,730,730,730,730,730,
+730,730,730,730,730,730,730,730,730,730,730,730,730,730,730,730,
+730,730,730,730,730,730,730,730,730,730,730,730,730,730,730,730,
+730,730,730,730,730,730,730,730,730,730,730,730,730,730,730,730,
+730,730,730,730,730,730,730,730,730,730,730,730,730,730,730,730,
+730,730,730,730,730,730,730,730,730,730,730,115,115,115,115,115,
+730,730,730,730,730,730,730,730,730,730,730,730,730,115,115,115,
+
+/* block 190 */
+730,730,730,730,730,730,730,730,730,115,115,115,115,115,115,115,
+730,730,730,730,730,730,730,730,730,730,115,115,731,732,732,733,
+ 22, 22, 22, 22,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+
+/* block 191 */
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19,115,115,115,115,115,115,115,115,115,115,
+
+/* block 192 */
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19,115,115, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19,734,406,110,110,110, 19, 19, 19,406,734,734,
+734,734,734, 22, 22, 22, 22, 22, 22, 22, 22,110,110,110,110,110,
+
+/* block 193 */
+110,110,110, 19, 19,110,110,110,110,110,110,110, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,110,110,110,110, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+
+/* block 194 */
+564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,
+564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,
+564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,
+564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,
+564,564,735,735,735,564,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+
+/* block 195 */
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19,115,115,115,115,115,115,115,115,115,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+
+/* block 196 */
+438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,
+438,438,438,438,438,438,438,438,438,438,439,439,439,439,439,439,
+439,439,439,439,439,439,439,439,439,439,439,439,439,439,439,439,
+439,439,439,439,438,438,438,438,438,438,438,438,438,438,438,438,
+438,438,438,438,438,438,438,438,438,438,438,438,438,438,439,439,
+439,439,439,439,439,115,439,439,439,439,439,439,439,439,439,439,
+439,439,439,439,439,439,439,439,438,438,438,438,438,438,438,438,
+438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,
+
+/* block 197 */
+438,438,439,439,439,439,439,439,439,439,439,439,439,439,439,439,
+439,439,439,439,439,439,439,439,439,439,439,439,438,115,438,438,
+115,115,438,115,115,438,438,115,115,438,438,438,438,115,438,438,
+438,438,438,438,438,438,439,439,439,439,115,439,115,439,439,439,
+439,439,439,439,115,439,439,439,439,439,439,439,439,439,439,439,
+438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,
+438,438,438,438,438,438,438,438,438,438,439,439,439,439,439,439,
+439,439,439,439,439,439,439,439,439,439,439,439,439,439,439,439,
+
+/* block 198 */
+439,439,439,439,438,438,115,438,438,438,438,115,115,438,438,438,
+438,438,438,438,438,115,438,438,438,438,438,438,438,115,439,439,
+439,439,439,439,439,439,439,439,439,439,439,439,439,439,439,439,
+439,439,439,439,439,439,439,439,438,438,115,438,438,438,438,115,
+438,438,438,438,438,115,438,115,115,115,438,438,438,438,438,438,
+438,115,439,439,439,439,439,439,439,439,439,439,439,439,439,439,
+439,439,439,439,439,439,439,439,439,439,439,439,438,438,438,438,
+438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,
+
+/* block 199 */
+438,438,438,438,438,438,439,439,439,439,439,439,439,439,439,439,
+439,439,439,439,439,439,439,439,439,439,439,439,439,439,439,439,
+438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,
+438,438,438,438,438,438,438,438,438,438,439,439,439,439,439,439,
+439,439,439,439,439,439,439,439,439,439,439,439,439,439,439,439,
+439,439,439,439,438,438,438,438,438,438,438,438,438,438,438,438,
+438,438,438,438,438,438,438,438,438,438,438,438,438,438,439,439,
+439,439,439,439,439,439,439,439,439,439,439,439,439,439,439,439,
+
+/* block 200 */
+439,439,439,439,439,439,439,439,438,438,438,438,438,438,438,438,
+438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,
+438,438,439,439,439,439,439,439,439,439,439,439,439,439,439,439,
+439,439,439,439,439,439,439,439,439,439,439,439,438,438,438,438,
+438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,
+438,438,438,438,438,438,439,439,439,439,439,439,439,439,439,439,
+439,439,439,439,439,439,439,439,439,439,439,439,439,439,439,439,
+438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,
+
+/* block 201 */
+438,438,438,438,438,438,438,438,438,438,439,439,439,439,439,439,
+439,439,439,439,439,439,439,439,439,439,439,439,439,439,439,439,
+439,439,439,439,439,439,115,115,438,438,438,438,438,438,438,438,
+438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,
+438,  8,439,439,439,439,439,439,439,439,439,439,439,439,439,439,
+439,439,439,439,439,439,439,439,439,439,439,  8,439,439,439,439,
+439,439,438,438,438,438,438,438,438,438,438,438,438,438,438,438,
+438,438,438,438,438,438,438,438,438,438,438,  8,439,439,439,439,
+
+/* block 202 */
+439,439,439,439,439,439,439,439,439,439,439,439,439,439,439,439,
+439,439,439,439,439,  8,439,439,439,439,439,439,438,438,438,438,
+438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,
+438,438,438,438,438,  8,439,439,439,439,439,439,439,439,439,439,
+439,439,439,439,439,439,439,439,439,439,439,439,439,439,439,  8,
+439,439,439,439,439,439,438,438,438,438,438,438,438,438,438,438,
+438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,  8,
+439,439,439,439,439,439,439,439,439,439,439,439,439,439,439,439,
+
+/* block 203 */
+439,439,439,439,439,439,439,439,439,  8,439,439,439,439,439,439,
+438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,
+438,438,438,438,438,438,438,438,438,  8,439,439,439,439,439,439,
+439,439,439,439,439,439,439,439,439,439,439,439,439,439,439,439,
+439,439,439,  8,439,439,439,439,439,439,438,439,115,115, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+
+/* block 204 */
+736,736,736,736,736,736,736,736,736,736,736,736,736,736,736,736,
+736,736,736,736,736,736,736,736,736,736,736,736,736,736,736,736,
+736,736,736,736,736,736,736,736,736,736,736,736,736,736,736,736,
+736,736,736,736,736,736,736,736,736,736,736,736,736,736,736,736,
+736,736,736,736,736,736,736,736,736,736,736,736,736,736,736,736,
+736,736,736,736,736,736,736,736,736,736,736,736,736,736,736,736,
+736,736,736,736,736,736,736,736,736,736,736,736,736,736,736,736,
+736,736,736,736,736,736,736,736,736,736,736,736,736,736,736,736,
+
+/* block 205 */
+737,737,737,737,737,737,737,737,737,737,737,737,737,737,737,737,
+737,737,737,737,737,737,737,737,737,737,737,737,737,737,737,737,
+737,737,737,737,737,737,737,737,737,737,737,737,737,737,737,737,
+737,737,737,737,737,737,737,736,736,736,736,737,737,737,737,737,
+737,737,737,737,737,737,737,737,737,737,737,737,737,737,737,737,
+737,737,737,737,737,737,737,737,737,737,737,737,737,737,737,737,
+737,737,737,737,737,737,737,737,737,737,737,737,737,736,736,736,
+736,736,736,736,736,737,736,736,736,736,736,736,736,736,736,736,
+
+/* block 206 */
+736,736,736,736,737,736,736,738,738,738,738,738,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,737,737,737,737,737,
+115,737,737,737,737,737,737,737,737,737,737,737,737,737,737,737,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+
+/* block 207 */
+739,739,739,739,739,739,739,739,739,739,739,739,739,739,739,739,
+739,739,739,739,739,739,739,739,739,739,739,739,739,739,739,739,
+739,739,739,739,739,739,739,739,739,739,739,739,739,739,739,739,
+739,739,739,739,739,739,739,739,739,739,739,739,739,739,739,739,
+739,739,739,739,739,739,739,739,739,739,739,739,739,739,739,739,
+739,739,739,739,739,739,739,739,739,739,739,739,739,739,739,739,
+739,739,739,739,739,739,739,739,739,739,739,739,739,739,739,739,
+739,739,739,739,739,739,739,739,739,739,739,739,739,739,739,739,
+
+/* block 208 */
+739,739,739,739,739,739,739,739,739,739,739,739,739,739,739,739,
+739,739,739,739,739,739,739,739,739,739,739,739,739,739,739,739,
+739,739,739,739,739,739,739,739,739,739,739,739,739,739,739,739,
+739,739,739,739,739,739,739,739,739,739,739,739,739,739,739,739,
+739,739,739,739,739,115,115,740,740,740,740,740,740,740,740,740,
+741,741,741,741,741,741,741,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+
+/* block 209 */
+200,200,200,200,115,200,200,200,200,200,200,200,200,200,200,200,
+200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,
+115,200,200,115,200,115,115,200,115,200,200,200,200,200,200,200,
+200,200,200,115,200,200,200,200,115,200,115,200,115,115,115,115,
+115,115,200,115,115,115,115,200,115,200,115,200,115,200,200,200,
+115,200,200,115,200,115,115,200,115,200,115,200,115,200,115,200,
+115,200,200,115,200,115,115,200,200,200,200,115,200,200,200,200,
+200,200,200,115,200,200,200,200,115,200,200,200,200,115,200,115,
+
+/* block 210 */
+200,200,200,200,200,200,200,200,200,200,115,200,200,200,200,200,
+200,200,200,200,200,200,200,200,200,200,200,200,115,115,115,115,
+115,200,200,200,115,200,200,200,200,200,115,200,200,200,200,200,
+200,200,200,200,200,200,200,200,200,200,200,200,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+195,195,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+
+/* block 211 */
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,115,115,115,115,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+
+/* block 212 */
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19,115,115,115,115,115,115,115,115,115,115,115,115,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,115,
+115, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+115, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+115, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19,115,115,115,115,115,115,115,115,115,115,
+
+/* block 213 */
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,115,115,115,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,115,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,115,115,115,115,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+
+/* block 214 */
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,742,742,742,742,742,742,742,742,742,742,
+742,742,742,742,742,742,742,742,742,742,742,742,742,742,742,742,
+
+/* block 215 */
+743, 19, 19,115,115,115,115,115,115,115,115,115,115,115,115,115,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,115,115,115,115,115,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19,115,115,115,115,115,115,115,
+ 19, 19,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+
+/* block 216 */
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 14, 14, 14, 14, 14,
+
+/* block 217 */
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,115, 19, 19, 19, 19, 19,
+
+/* block 218 */
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19,115, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+
+/* block 219 */
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,115,115,115,
+ 19, 19, 19, 19,115,115,115,115,115,115,115,115,115,115,115,115,
+
+/* block 220 */
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19,115,115,115,115,115,115,115,115,115,115,115,115,
+
+/* block 221 */
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+
+/* block 222 */
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,115,115,115,115,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,115,115,115,115,115,115,115,115,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,115,115,115,115,115,115,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+
+/* block 223 */
+ 19, 19, 19, 19, 19, 19, 19, 19,115,115,115,115,115,115,115,115,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+
+/* block 224 */
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+
+/* block 225 */
+ 19, 19, 19, 19, 19,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+ 19,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+
+/* block 226 */
+485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,
+485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,
+485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,
+485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,
+485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,
+485,485,485,485,485,485,485,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+
+/* block 227 */
+485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,
+485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,
+485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,
+485,485,485,485,485,115,115,115,115,115,115,115,115,115,115,115,
+485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,
+485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,
+485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,
+485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,
+
+/* block 228 */
+485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,
+485,485,485,485,485,485,485,485,485,485,485,485,485,485,115,115,
+485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,
+485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,
+485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,
+485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,
+485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,
+485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,
+
+/* block 229 */
+485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,
+485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,
+485,485,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+
+/* block 230 */
+485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,
+485,485,485,485,485,485,485,485,485,485,485,485,485,485,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
+
+/* block 231 */
+437, 22,437,437,437,437,437,437,437,437,437,437,437,437,437,437,
+437,437,437,437,437,437,437,437,437,437,437,437,437,437,437,437,
+ 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+
+/* block 232 */
+437,437,437,437,437,437,437,437,437,437,437,437,437,437,437,437,
+437,437,437,437,437,437,437,437,437,437,437,437,437,437,437,437,
+437,437,437,437,437,437,437,437,437,437,437,437,437,437,437,437,
+437,437,437,437,437,437,437,437,437,437,437,437,437,437,437,437,
+437,437,437,437,437,437,437,437,437,437,437,437,437,437,437,437,
+437,437,437,437,437,437,437,437,437,437,437,437,437,437,437,437,
+437,437,437,437,437,437,437,437,437,437,437,437,437,437,437,437,
+437,437,437,437,437,437,437,437,437,437,437,437,437,437,437,437,
+
+/* block 233 */
+110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,
+110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,
+110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,
+110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,
+110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,
+110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,
+110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,
+110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,
+
+/* block 234 */
+110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,
+110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,
+110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,
+110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,
+110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,
+110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,
+110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,
+437,437,437,437,437,437,437,437,437,437,437,437,437,437,437,437,
+
+/* block 235 */
+557,557,557,557,557,557,557,557,557,557,557,557,557,557,557,557,
+557,557,557,557,557,557,557,557,557,557,557,557,557,557,557,557,
+557,557,557,557,557,557,557,557,557,557,557,557,557,557,557,557,
+557,557,557,557,557,557,557,557,557,557,557,557,557,557,557,557,
+557,557,557,557,557,557,557,557,557,557,557,557,557,557,557,557,
+557,557,557,557,557,557,557,557,557,557,557,557,557,557,557,557,
+557,557,557,557,557,557,557,557,557,557,557,557,557,557,557,557,
+557,557,557,557,557,557,557,557,557,557,557,557,557,557,115,115,
+
+};
+
+#if UCD_BLOCK_SIZE != 128
+#error Please correct UCD_BLOCK_SIZE in pcre2_internal.h
+#endif
+#endif  /* SUPPORT_UNICODE */
+
+#endif  /* PCRE2_PCRE2TEST */
diff --git a/dist/ucp.h b/dist2/src/pcre2_ucp.h
similarity index 68%
rename from dist/ucp.h
rename to dist2/src/pcre2_ucp.h
index 2fa0029..0b7553e 100644
--- a/dist/ucp.h
+++ b/dist2/src/pcre2_ucp.h
@@ -1,9 +1,46 @@
 /*************************************************
-*          Unicode Property Table handler        *
+*      Perl-Compatible Regular Expressions       *
 *************************************************/
 
-#ifndef _UCP_H
-#define _UCP_H
+/* 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
+     Original API code Copyright (c) 1997-2012 University of Cambridge
+         New API code Copyright (c) 2016 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 _PCRE2_UCP_H
+#define _PCRE2_UCP_H
 
 /* This file contains definitions of the property values that are returned by
 the UCD access macros. New values that are added for new releases of Unicode
@@ -14,7 +51,7 @@
 where the equivalent property descriptive names are listed in vectors.
 
 ALSO: The specific values of the first two enums are assumed for the table
-called catposstab in pcre_compile.c. */
+called catposstab in pcre2_compile.c. */
 
 /* These are the general character categories. */
 
@@ -216,9 +253,16 @@
   ucp_Pau_Cin_Hau,
   ucp_Siddham,
   ucp_Tirhuta,
-  ucp_Warang_Citi
+  ucp_Warang_Citi,
+  /* New for Unicode 8.0.0: */
+  ucp_Ahom,
+  ucp_Anatolian_Hieroglyphs,
+  ucp_Hatran,
+  ucp_Multani,
+  ucp_Old_Hungarian,
+  ucp_SignWriting
 };
 
 #endif
 
-/* End of ucp.h */
+/* End of pcre2_ucp.h */
diff --git a/dist2/src/pcre2_valid_utf.c b/dist2/src/pcre2_valid_utf.c
new file mode 100644
index 0000000..2dfd8df
--- /dev/null
+++ b/dist2/src/pcre2_valid_utf.c
@@ -0,0 +1,398 @@
+/*************************************************
+*      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
+     Original API code Copyright (c) 1997-2012 University of Cambridge
+         New API code Copyright (c) 2016 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 character
+strings. This file is also #included by the pcre2test program, which uses
+macros to change names from _pcre2_xxx to xxxx, thereby avoiding name clashes
+with the library. In this case, PCRE2_PCRE2TEST is defined. */
+
+#ifndef PCRE2_PCRE2TEST           /* We're compiling the library */
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+#include "pcre2_internal.h"
+#endif /* PCRE2_PCRE2TEST */
+
+
+#ifndef SUPPORT_UNICODE
+/*************************************************
+*  Dummy function when Unicode is not supported  *
+*************************************************/
+
+/* This function should never be called when Unicode is not supported. */
+
+int
+PRIV(valid_utf)(PCRE2_SPTR string, PCRE2_SIZE length, PCRE2_SIZE *erroroffset)
+{
+(void)string;
+(void)length;
+(void)erroroffset;
+return 0;
+}
+#else  /* UTF is supported */
+
+
+
+/*************************************************
+*           Validate a UTF string                *
+*************************************************/
+
+/* This function is called (optionally) at the start of compile or match, to
+check that a supposed UTF 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
+  errp         pointer to an error position offset variable
+
+Returns:       == 0    if the string is a valid UTF string
+               != 0    otherwise, setting the offset of the bad character
+*/
+
+int
+PRIV(valid_utf)(PCRE2_SPTR string, PCRE2_SIZE length, PCRE2_SIZE *erroroffset)
+{
+register PCRE2_SPTR p;
+register uint32_t c;
+
+/* ----------------- Check a UTF-8 string ----------------- */
+
+#if PCRE2_CODE_UNIT_WIDTH == 8
+
+/* Originally, this function checked according to RFC 2279, allowing for values
+in the range 0 to 0x7fffffff, up to 6 bytes long, but ensuring that they were
+in the canonical format. Once somebody had pointed out RFC 3629 to me (it
+obsoletes 2279), additional restrictions were applied. The values are now
+limited to be between 0 and 0x0010ffff, no more than 4 bytes long, and the
+subrange 0xd000 to 0xdfff is excluded. However, the format of 5-byte and 6-byte
+characters is still checked. Error returns are as follows:
+
+PCRE2_ERROR_UTF8_ERR1   Missing 1 byte at the end of the string
+PCRE2_ERROR_UTF8_ERR2   Missing 2 bytes at the end of the string
+PCRE2_ERROR_UTF8_ERR3   Missing 3 bytes at the end of the string
+PCRE2_ERROR_UTF8_ERR4   Missing 4 bytes at the end of the string
+PCRE2_ERROR_UTF8_ERR5   Missing 5 bytes at the end of the string
+PCRE2_ERROR_UTF8_ERR6   2nd-byte's two top bits are not 0x80
+PCRE2_ERROR_UTF8_ERR7   3rd-byte's two top bits are not 0x80
+PCRE2_ERROR_UTF8_ERR8   4th-byte's two top bits are not 0x80
+PCRE2_ERROR_UTF8_ERR9   5th-byte's two top bits are not 0x80
+PCRE2_ERROR_UTF8_ERR10  6th-byte's two top bits are not 0x80
+PCRE2_ERROR_UTF8_ERR11  5-byte character is not permitted by RFC 3629
+PCRE2_ERROR_UTF8_ERR12  6-byte character is not permitted by RFC 3629
+PCRE2_ERROR_UTF8_ERR13  4-byte character with value > 0x10ffff is not permitted
+PCRE2_ERROR_UTF8_ERR14  3-byte character with value 0xd800-0xdfff is not permitted
+PCRE2_ERROR_UTF8_ERR15  Overlong 2-byte sequence
+PCRE2_ERROR_UTF8_ERR16  Overlong 3-byte sequence
+PCRE2_ERROR_UTF8_ERR17  Overlong 4-byte sequence
+PCRE2_ERROR_UTF8_ERR18  Overlong 5-byte sequence (won't ever occur)
+PCRE2_ERROR_UTF8_ERR19  Overlong 6-byte sequence (won't ever occur)
+PCRE2_ERROR_UTF8_ERR20  Isolated 0x80 byte (not within UTF-8 character)
+PCRE2_ERROR_UTF8_ERR21  Byte with the illegal value 0xfe or 0xff
+*/
+
+for (p = string; length > 0; p++)
+  {
+  register uint32_t ab, d;
+
+  c = *p;
+  length--;
+
+  if (c < 128) continue;                /* ASCII character */
+
+  if (c < 0xc0)                         /* Isolated 10xx xxxx byte */
+    {
+    *erroroffset = (int)(p - string);
+    return PCRE2_ERROR_UTF8_ERR20;
+    }
+
+  if (c >= 0xfe)                        /* Invalid 0xfe or 0xff bytes */
+    {
+    *erroroffset = (int)(p - string);
+    return PCRE2_ERROR_UTF8_ERR21;
+    }
+
+  ab = PRIV(utf8_table4)[c & 0x3f];     /* Number of additional bytes (1-5) */
+  if (length < ab)                      /* Missing bytes */
+    {
+    *erroroffset = (int)(p - string);
+    switch(ab - length)
+      {
+      case 1: return PCRE2_ERROR_UTF8_ERR1;
+      case 2: return PCRE2_ERROR_UTF8_ERR2;
+      case 3: return PCRE2_ERROR_UTF8_ERR3;
+      case 4: return PCRE2_ERROR_UTF8_ERR4;
+      case 5: return PCRE2_ERROR_UTF8_ERR5;
+      }
+    }
+  length -= ab;                         /* Length remaining */
+
+  /* Check top bits in the second byte */
+
+  if (((d = *(++p)) & 0xc0) != 0x80)
+    {
+    *erroroffset = (int)(p - string) - 1;
+    return PCRE2_ERROR_UTF8_ERR6;
+    }
+
+  /* For each length, check that the remaining bytes start with the 0x80 bit
+  set and not the 0x40 bit. Then check for an overlong sequence, and for the
+  excluded range 0xd800 to 0xdfff. */
+
+  switch (ab)
+    {
+    /* 2-byte character. No further bytes to check for 0x80. Check first byte
+    for for xx00 000x (overlong sequence). */
+
+    case 1: if ((c & 0x3e) == 0)
+      {
+      *erroroffset = (int)(p - string) - 1;
+      return PCRE2_ERROR_UTF8_ERR15;
+      }
+    break;
+
+    /* 3-byte character. Check third byte for 0x80. Then check first 2 bytes
+      for 1110 0000, xx0x xxxx (overlong sequence) or
+          1110 1101, 1010 xxxx (0xd800 - 0xdfff) */
+
+    case 2:
+    if ((*(++p) & 0xc0) != 0x80)     /* Third byte */
+      {
+      *erroroffset = (int)(p - string) - 2;
+      return PCRE2_ERROR_UTF8_ERR7;
+      }
+    if (c == 0xe0 && (d & 0x20) == 0)
+      {
+      *erroroffset = (int)(p - string) - 2;
+      return PCRE2_ERROR_UTF8_ERR16;
+      }
+    if (c == 0xed && d >= 0xa0)
+      {
+      *erroroffset = (int)(p - string) - 2;
+      return PCRE2_ERROR_UTF8_ERR14;
+      }
+    break;
+
+    /* 4-byte character. Check 3rd and 4th bytes for 0x80. Then check first 2
+       bytes for for 1111 0000, xx00 xxxx (overlong sequence), then check for a
+       character greater than 0x0010ffff (f4 8f bf bf) */
+
+    case 3:
+    if ((*(++p) & 0xc0) != 0x80)     /* Third byte */
+      {
+      *erroroffset = (int)(p - string) - 2;
+      return PCRE2_ERROR_UTF8_ERR7;
+      }
+    if ((*(++p) & 0xc0) != 0x80)     /* Fourth byte */
+      {
+      *erroroffset = (int)(p - string) - 3;
+      return PCRE2_ERROR_UTF8_ERR8;
+      }
+    if (c == 0xf0 && (d & 0x30) == 0)
+      {
+      *erroroffset = (int)(p - string) - 3;
+      return PCRE2_ERROR_UTF8_ERR17;
+      }
+    if (c > 0xf4 || (c == 0xf4 && d > 0x8f))
+      {
+      *erroroffset = (int)(p - string) - 3;
+      return PCRE2_ERROR_UTF8_ERR13;
+      }
+    break;
+
+    /* 5-byte and 6-byte characters are not allowed by RFC 3629, and will be
+    rejected by the length test below. However, we do the appropriate tests
+    here so that overlong sequences get diagnosed, and also in case there is
+    ever an option for handling these larger code points. */
+
+    /* 5-byte character. Check 3rd, 4th, and 5th bytes for 0x80. Then check for
+    1111 1000, xx00 0xxx */
+
+    case 4:
+    if ((*(++p) & 0xc0) != 0x80)     /* Third byte */
+      {
+      *erroroffset = (int)(p - string) - 2;
+      return PCRE2_ERROR_UTF8_ERR7;
+      }
+    if ((*(++p) & 0xc0) != 0x80)     /* Fourth byte */
+      {
+      *erroroffset = (int)(p - string) - 3;
+      return PCRE2_ERROR_UTF8_ERR8;
+      }
+    if ((*(++p) & 0xc0) != 0x80)     /* Fifth byte */
+      {
+      *erroroffset = (int)(p - string) - 4;
+      return PCRE2_ERROR_UTF8_ERR9;
+      }
+    if (c == 0xf8 && (d & 0x38) == 0)
+      {
+      *erroroffset = (int)(p - string) - 4;
+      return PCRE2_ERROR_UTF8_ERR18;
+      }
+    break;
+
+    /* 6-byte character. Check 3rd-6th bytes for 0x80. Then check for
+    1111 1100, xx00 00xx. */
+
+    case 5:
+    if ((*(++p) & 0xc0) != 0x80)     /* Third byte */
+      {
+      *erroroffset = (int)(p - string) - 2;
+      return PCRE2_ERROR_UTF8_ERR7;
+      }
+    if ((*(++p) & 0xc0) != 0x80)     /* Fourth byte */
+      {
+      *erroroffset = (int)(p - string) - 3;
+      return PCRE2_ERROR_UTF8_ERR8;
+      }
+    if ((*(++p) & 0xc0) != 0x80)     /* Fifth byte */
+      {
+      *erroroffset = (int)(p - string) - 4;
+      return PCRE2_ERROR_UTF8_ERR9;
+      }
+    if ((*(++p) & 0xc0) != 0x80)     /* Sixth byte */
+      {
+      *erroroffset = (int)(p - string) - 5;
+      return PCRE2_ERROR_UTF8_ERR10;
+      }
+    if (c == 0xfc && (d & 0x3c) == 0)
+      {
+      *erroroffset = (int)(p - string) - 5;
+      return PCRE2_ERROR_UTF8_ERR19;
+      }
+    break;
+    }
+
+  /* Character is valid under RFC 2279, but 4-byte and 5-byte characters are
+  excluded by RFC 3629. The pointer p is currently at the last byte of the
+  character. */
+
+  if (ab > 3)
+    {
+    *erroroffset = (int)(p - string) - ab;
+    return (ab == 4)? PCRE2_ERROR_UTF8_ERR11 : PCRE2_ERROR_UTF8_ERR12;
+    }
+  }
+return 0;
+
+
+/* ----------------- Check a UTF-16 string ----------------- */
+
+#elif PCRE2_CODE_UNIT_WIDTH == 16
+
+/* There's not so much work, nor so many errors, for UTF-16.
+PCRE2_ERROR_UTF16_ERR1  Missing low surrogate at the end of the string
+PCRE2_ERROR_UTF16_ERR2  Invalid low surrogate
+PCRE2_ERROR_UTF16_ERR3  Isolated low surrogate
+*/
+
+for (p = string; length > 0; p++)
+  {
+  c = *p;
+  length--;
+
+  if ((c & 0xf800) != 0xd800)
+    {
+    /* Normal UTF-16 code point. Neither high nor low surrogate. */
+    }
+  else if ((c & 0x0400) == 0)
+    {
+    /* High surrogate. Must be a followed by a low surrogate. */
+    if (length == 0)
+      {
+      *erroroffset = p - string;
+      return PCRE2_ERROR_UTF16_ERR1;
+      }
+    p++;
+    length--;
+    if ((*p & 0xfc00) != 0xdc00)
+      {
+      *erroroffset = p - string;
+      return PCRE2_ERROR_UTF16_ERR2;
+      }
+    }
+  else
+    {
+    /* Isolated low surrogate. Always an error. */
+    *erroroffset = p - string;
+    return PCRE2_ERROR_UTF16_ERR3;
+    }
+  }
+return 0;
+
+
+
+/* ----------------- Check a UTF-32 string ----------------- */
+
+#else
+
+/* There is very little to do for a UTF-32 string.
+PCRE2_ERROR_UTF32_ERR1  Surrogate character
+PCRE2_ERROR_UTF32_ERR2  Character > 0x10ffff
+*/
+
+for (p = string; length > 0; length--, p++)
+  {
+  c = *p;
+  if ((c & 0xfffff800u) != 0xd800u)
+    {
+    /* Normal UTF-32 code point. Neither high nor low surrogate. */
+    if (c > 0x10ffffu)
+      {
+      *erroroffset = p - string;
+      return PCRE2_ERROR_UTF32_ERR2;
+      }
+    }
+  else
+    {
+    /* A surrogate */
+    *erroroffset = p - string;
+    return PCRE2_ERROR_UTF32_ERR1;
+    }
+  }
+return 0;
+#endif  /* CODE_UNIT_WIDTH */
+}
+#endif  /* SUPPORT_UNICODE */
+
+/* End of pcre2_valid_utf.c */
diff --git a/dist/pcre_xclass.c b/dist2/src/pcre2_xclass.c
similarity index 86%
rename from dist/pcre_xclass.c
rename to dist2/src/pcre2_xclass.c
index ef759a5..407d3f5 100644
--- a/dist/pcre_xclass.c
+++ b/dist2/src/pcre2_xclass.c
@@ -6,7 +6,8 @@
 and semantics are as close as possible to those of the Perl 5 language.
 
                        Written by Philip Hazel
-           Copyright (c) 1997-2013 University of Cambridge
+     Original API code Copyright (c) 1997-2012 University of Cambridge
+         New API code Copyright (c) 2016 University of Cambridge
 
 -----------------------------------------------------------------------------
 Redistribution and use in source and binary forms, with or without
@@ -37,46 +38,46 @@
 -----------------------------------------------------------------------------
 */
 
-
 /* This module contains an internal function that is used to match an extended
-class. It is used by both pcre_exec() and pcre_def_exec(). */
+class. It is used by pcre2_auto_possessify() and by both pcre2_match() and
+pcre2_def_match(). */
 
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
 #endif
 
-#include "pcre_internal.h"
 
+#include "pcre2_internal.h"
 
 /*************************************************
 *       Match character against an XCLASS        *
 *************************************************/
 
 /* This function is called to match a character against an extended class that
-might contain values > 255 and/or Unicode properties.
+might contain codepoints above 255 and/or Unicode properties.
 
 Arguments:
   c           the character
-  data        points to the flag byte of the XCLASS data
+  data        points to the flag code unit of the XCLASS data
+  utf         TRUE if in UTF mode
 
 Returns:      TRUE if character matches, else FALSE
 */
 
 BOOL
-PRIV(xclass)(pcre_uint32 c, const pcre_uchar *data, BOOL utf)
+PRIV(xclass)(uint32_t c, PCRE2_SPTR data, BOOL utf)
 {
-pcre_uchar t;
+PCRE2_UCHAR t;
 BOOL negated = (*data & XCL_NOT) != 0;
 
-(void)utf;
-#ifdef COMPILE_PCRE8
+#if PCRE2_CODE_UNIT_WIDTH == 8
 /* In 8 bit mode, this must always be TRUE. Help the compiler to know that. */
 utf = TRUE;
 #endif
 
-/* 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
+/* Code points < 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)
@@ -84,37 +85,37 @@
   if ((*data & XCL_HASPROP) == 0)
     {
     if ((*data & XCL_MAP) == 0) return negated;
-    return (((pcre_uint8 *)(data + 1))[c/8] & (1 << (c&7))) != 0;
+    return (((uint8_t *)(data + 1))[c/8] & (1 << (c&7))) != 0;
     }
   if ((*data & XCL_MAP) != 0 &&
-    (((pcre_uint8 *)(data + 1))[c/8] & (1 << (c&7))) != 0)
+    (((uint8_t *)(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. */
+encounter XCL_PROP or XCL_NOTPROP when UTF support is not compiled. */
 
-if ((*data++ & XCL_MAP) != 0) data += 32 / sizeof(pcre_uchar);
+if ((*data++ & XCL_MAP) != 0) data += 32 / sizeof(PCRE2_UCHAR);
 
 while ((t = *data++) != XCL_END)
   {
-  pcre_uint32 x, y;
+  uint32_t x, y;
   if (t == XCL_SINGLE)
     {
-#ifdef SUPPORT_UTF
+#ifdef SUPPORT_UNICODE
     if (utf)
       {
       GETCHARINC(x, data); /* macro generates multiple statements */
       }
     else
 #endif
-      x = *data++;
+    x = *data++;
     if (c == x) return !negated;
     }
   else if (t == XCL_RANGE)
     {
-#ifdef SUPPORT_UTF
+#ifdef SUPPORT_UNICODE
     if (utf)
       {
       GETCHARINC(x, data); /* macro generates multiple statements */
@@ -129,7 +130,7 @@
     if (c >= x && c <= y) return !negated;
     }
 
-#ifdef SUPPORT_UCP
+#ifdef SUPPORT_UNICODE
   else  /* XCL_PROP & XCL_NOTPROP */
     {
     const ucd_record *prop = GET_UCD(c);
@@ -259,10 +260,12 @@
 
     data += 2;
     }
-#endif  /* SUPPORT_UCP */
+#else
+  (void)utf;  /* Avoid compiler warning */
+#endif  /* SUPPORT_UNICODE */
   }
 
 return negated;   /* char did not match */
 }
 
-/* End of pcre_xclass.c */
+/* End of pcre2_xclass.c */
diff --git a/dist2/src/pcre2demo.c b/dist2/src/pcre2demo.c
new file mode 100644
index 0000000..ec51cf1
--- /dev/null
+++ b/dist2/src/pcre2demo.c
@@ -0,0 +1,423 @@
+/*************************************************
+*           PCRE2 DEMONSTRATION PROGRAM          *
+*************************************************/
+
+/* This is a demonstration program to illustrate a straightforward way of
+calling the PCRE2 regular expression library from a C program. See the
+pcre2sample documentation for a short discussion ("man pcre2sample" if you have
+the PCRE2 man pages installed). PCRE2 is a revised API for the library, and is
+incompatible with the original PCRE API.
+
+There are actually three libraries, each supporting a different code unit
+width. This demonstration program uses the 8-bit library.
+
+In Unix-like environments, if PCRE2 is installed in your standard system
+libraries, you should be able to compile this program using this command:
+
+gcc -Wall pcre2demo.c -lpcre2-8 -o pcre2demo
+
+If PCRE2 is not installed in a standard place, it is likely to be installed
+with support for the pkg-config mechanism. If you have pkg-config, you can
+compile this program using this command:
+
+gcc -Wall pcre2demo.c `pkg-config --cflags --libs libpcre2-8` -o pcre2demo
+
+If you do not have pkg-config, you may have to use this:
+
+gcc -Wall pcre2demo.c -I/usr/local/include -L/usr/local/lib \
+  -R/usr/local/lib -lpcre2-8 -o pcre2demo
+
+Replace "/usr/local/include" and "/usr/local/lib" with wherever the include and
+library files for PCRE2 are installed on your system. Only some operating
+systems (Solaris is one) use the -R option.
+
+Building under Windows:
+
+If you want to statically link this program against a non-dll .a file, you must
+define PCRE2_STATIC before including pcre2.h, so in this environment, uncomment
+the following line. */
+
+/* #define PCRE2_STATIC */
+
+/* This macro must be defined before including pcre2.h. For a program that uses
+only one code unit width, it makes it possible to use generic function names
+such as pcre2_compile(). */
+
+#define PCRE2_CODE_UNIT_WIDTH 8
+
+#include <stdio.h>
+#include <string.h>
+#include <pcre2.h>
+
+
+/**************************************************************************
+* Here is the program. The API includes the concept of "contexts" for     *
+* setting up unusual interface requirements for compiling and matching,   *
+* such as custom memory managers and non-standard newline definitions.    *
+* This program does not do any of this, so it makes no use of contexts,   *
+* always passing NULL where a context could be given.                     *
+**************************************************************************/
+
+int main(int argc, char **argv)
+{
+pcre2_code *re;
+PCRE2_SPTR pattern;     /* PCRE2_SPTR is a pointer to unsigned code units of */
+PCRE2_SPTR subject;     /* the appropriate width (8, 16, or 32 bits). */
+PCRE2_SPTR name_table;
+
+int crlf_is_newline;
+int errornumber;
+int find_all;
+int i;
+int namecount;
+int name_entry_size;
+int rc;
+int utf8;
+
+uint32_t option_bits;
+uint32_t newline;
+
+PCRE2_SIZE erroroffset;
+PCRE2_SIZE *ovector;
+
+size_t subject_length;
+pcre2_match_data *match_data;
+
+
+
+/**************************************************************************
+* 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++)
+  {
+  if (strcmp(argv[i], "-g") == 0) find_all = 1;
+    else break;
+  }
+
+/* After the options, we require exactly two arguments, which are the pattern,
+and the subject string. */
+
+if (argc - i != 2)
+  {
+  printf("Two arguments required: a regex and a subject string\n");
+  return 1;
+  }
+
+/* As pattern and subject are char arguments, they can be straightforwardly
+cast to PCRE2_SPTR as we are working in 8-bit code units. */
+
+pattern = (PCRE2_SPTR)argv[i];
+subject = (PCRE2_SPTR)argv[i+1];
+subject_length = strlen((char *)subject);
+
+
+/*************************************************************************
+* Now we are going to compile the regular expression pattern, and handle *
+* any errors that are detected.                                          *
+*************************************************************************/
+
+re = pcre2_compile(
+  pattern,               /* the pattern */
+  PCRE2_ZERO_TERMINATED, /* indicates pattern is zero-terminated */
+  0,                     /* default options */
+  &errornumber,          /* for error number */
+  &erroroffset,          /* for error offset */
+  NULL);                 /* use default compile context */
+
+/* Compilation failed: print the error message and exit. */
+
+if (re == NULL)
+  {
+  PCRE2_UCHAR buffer[256];
+  pcre2_get_error_message(errornumber, buffer, sizeof(buffer));
+  printf("PCRE2 compilation failed at offset %d: %s\n", (int)erroroffset,
+    buffer);
+  return 1;
+  }
+
+
+/*************************************************************************
+* If the compilation succeeded, we call PCRE again, in order to do a     *
+* pattern match against the subject string. This does just ONE match. If *
+* further matching is needed, it will be done below. Before running the  *
+* match we must set up a match_data block for holding the result.        *
+*************************************************************************/
+
+/* Using this function ensures that the block is exactly the right size for
+the number of capturing parentheses in the pattern. */
+
+match_data = pcre2_match_data_create_from_pattern(re, NULL);
+
+rc = pcre2_match(
+  re,                   /* the compiled pattern */
+  subject,              /* the subject string */
+  subject_length,       /* the length of the subject */
+  0,                    /* start at offset 0 in the subject */
+  0,                    /* default options */
+  match_data,           /* block for storing the result */
+  NULL);                /* use default match context */
+
+/* Matching failed: handle error cases */
+
+if (rc < 0)
+  {
+  switch(rc)
+    {
+    case PCRE2_ERROR_NOMATCH: printf("No match\n"); break;
+    /*
+    Handle other special cases if you like
+    */
+    default: printf("Matching error %d\n", rc); break;
+    }
+  pcre2_match_data_free(match_data);   /* Release memory used for the match */
+  pcre2_code_free(re);                 /* data and the compiled pattern. */
+  return 1;
+  }
+
+/* Match succeded. Get a pointer to the output vector, where string offsets are
+stored. */
+
+ovector = pcre2_get_ovector_pointer(match_data);
+printf("\nMatch succeeded at offset %d\n", (int)ovector[0]);
+
+
+/*************************************************************************
+* We have found the first match within the subject string. If the output *
+* vector wasn't big enough, say so. Then output any substrings that were *
+* captured.                                                              *
+*************************************************************************/
+
+/* The output vector wasn't big enough. This should not happen, because we used
+pcre2_match_data_create_from_pattern() above. */
+
+if (rc == 0)
+  printf("ovector was not big enough for all the captured substrings\n");
+
+/* Show substrings stored in the output vector by number. Obviously, in a real
+application you might want to do things other than print them. */
+
+for (i = 0; i < rc; i++)
+  {
+  PCRE2_SPTR substring_start = subject + ovector[2*i];
+  size_t substring_length = ovector[2*i+1] - ovector[2*i];
+  printf("%2d: %.*s\n", i, (int)substring_length, (char *)substring_start);
+  }
+
+
+/**************************************************************************
+* That concludes the basic part of this demonstration program. We have    *
+* compiled a pattern, and performed a single match. The code that follows *
+* shows first 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. */
+
+(void)pcre2_pattern_info(
+  re,                   /* the compiled pattern */
+  PCRE2_INFO_NAMECOUNT, /* get the number of named substrings */
+  &namecount);          /* where to put the answer */
+
+if (namecount <= 0) printf("No named substrings\n"); else
+  {
+  PCRE2_SPTR tabptr;
+  printf("Named substrings\n");
+
+  /* Before we can access the substrings, we must extract the table for
+  translating names to numbers, and the size of each entry in the table. */
+
+  (void)pcre2_pattern_info(
+    re,                       /* the compiled pattern */
+    PCRE2_INFO_NAMETABLE,     /* address of the table */
+    &name_table);             /* where to put the answer */
+
+  (void)pcre2_pattern_info(
+    re,                       /* the compiled pattern */
+    PCRE2_INFO_NAMEENTRYSIZE, /* size of each entry in the table */
+    &name_entry_size);        /* where to put the answer */
+
+  /* Now we can scan the table and, for each entry, print the number, the name,
+  and the substring itself. In the 8-bit library the number is held in two
+  bytes, most significant first. */
+
+  tabptr = name_table;
+  for (i = 0; i < namecount; i++)
+    {
+    int n = (tabptr[0] << 8) | tabptr[1];
+    printf("(%d) %*s: %.*s\n", n, name_entry_size - 3, tabptr + 2,
+      (int)(ovector[2*n+1] - ovector[2*n]), subject + ovector[2*n]);
+    tabptr += name_entry_size;
+    }
+  }
+
+
+/*************************************************************************
+* If the "-g" option was given on the command line, we want to continue  *
+* to search for additional matches in the subject string, in a similar   *
+* way to the /g option in Perl. This turns out to be trickier than you   *
+* might think because of the possibility of matching an empty string.    *
+* What happens is as follows:                                            *
+*                                                                        *
+* If the previous match was NOT for an empty string, we can just start   *
+* the next match at the end of the previous one.                         *
+*                                                                        *
+* If the previous match WAS for an empty string, we can't do that, as it *
+* would lead to an infinite loop. Instead, a call of pcre2_match() is    *
+* made with the PCRE2_NOTEMPTY_ATSTART and PCRE2_ANCHORED flags set. The *
+* first of these tells PCRE2 that an empty string at the start of the    *
+* subject is not a valid match; other possibilities must be tried. The   *
+* second flag restricts PCRE2 to one match attempt at the initial string *
+* position. If this match succeeds, an alternative to the empty string   *
+* match has been found, and we can print it and proceed round the loop,  *
+* advancing by the length of whatever was found. If this match does not  *
+* succeed, we still stay in the loop, advancing by just one character.   *
+* In UTF-8 mode, which can be set by (*UTF) in the pattern, this may be  *
+* more than one byte.                                                    *
+*                                                                        *
+* However, there is a complication concerned with newlines. When the     *
+* newline convention is such that CRLF is a valid newline, we must       *
+* advance by two characters rather than one. The newline convention can  *
+* be set in the regex by (*CR), etc.; if not, we must find the default.  *
+*************************************************************************/
+
+if (!find_all)     /* Check for -g */
+  {
+  pcre2_match_data_free(match_data);  /* Release the memory that was used */
+  pcre2_code_free(re);                /* for the match data and the pattern. */
+  return 0;                           /* Exit the program. */
+  }
+
+/* Before running the loop, check for UTF-8 and whether CRLF is a valid newline
+sequence. First, find the options with which the regex was compiled and extract
+the UTF state. */
+
+(void)pcre2_pattern_info(re, PCRE2_INFO_ALLOPTIONS, &option_bits);
+utf8 = (option_bits & PCRE2_UTF) != 0;
+
+/* Now find the newline convention and see whether CRLF is a valid newline
+sequence. */
+
+(void)pcre2_pattern_info(re, PCRE2_INFO_NEWLINE, &newline);
+crlf_is_newline = newline == PCRE2_NEWLINE_ANY ||
+                  newline == PCRE2_NEWLINE_CRLF ||
+                  newline == PCRE2_NEWLINE_ANYCRLF;
+
+/* Loop for second and subsequent matches */
+
+for (;;)
+  {
+  uint32_t options = 0;                    /* Normally no options */
+  PCRE2_SIZE start_offset = ovector[1];  /* Start at end of previous match */
+
+  /* If the previous match was for an empty string, we are finished if we are
+  at the end of the subject. Otherwise, arrange to run another match at the
+  same point to see if a non-empty match can be found. */
+
+  if (ovector[0] == ovector[1])
+    {
+    if (ovector[0] == subject_length) break;
+    options = PCRE2_NOTEMPTY_ATSTART | PCRE2_ANCHORED;
+    }
+
+  /* Run the next matching operation */
+
+  rc = pcre2_match(
+    re,                   /* the compiled pattern */
+    subject,              /* the subject string */
+    subject_length,       /* the length of the subject */
+    start_offset,         /* starting offset in the subject */
+    options,              /* options */
+    match_data,           /* block for storing the result */
+    NULL);                /* use default match context */
+
+  /* This time, a result of NOMATCH isn't an error. If the value in "options"
+  is zero, it just means we have found all possible matches, so the loop ends.
+  Otherwise, it means we have failed to find a non-empty-string match at a
+  point where there was a previous empty-string match. In this case, we do what
+  Perl does: advance the matching position by one character, and continue. We
+  do this by setting the "end of previous match" offset, because that is picked
+  up at the top of the loop as the point at which to start again.
+
+  There are two complications: (a) When CRLF is a valid newline sequence, and
+  the current position is just before it, advance by an extra byte. (b)
+  Otherwise we must ensure that we skip an entire UTF character if we are in
+  UTF mode. */
+
+  if (rc == PCRE2_ERROR_NOMATCH)
+    {
+    if (options == 0) break;                    /* All matches found */
+    ovector[1] = start_offset + 1;              /* Advance one code unit */
+    if (crlf_is_newline &&                      /* If CRLF is newline & */
+        start_offset < subject_length - 1 &&    /* we are at CRLF, */
+        subject[start_offset] == '\r' &&
+        subject[start_offset + 1] == '\n')
+      ovector[1] += 1;                          /* Advance by one more. */
+    else if (utf8)                              /* Otherwise, ensure we */
+      {                                         /* advance a whole UTF-8 */
+      while (ovector[1] < subject_length)       /* character. */
+        {
+        if ((subject[ovector[1]] & 0xc0) != 0x80) break;
+        ovector[1] += 1;
+        }
+      }
+    continue;    /* Go round the loop again */
+    }
+
+  /* Other matching errors are not recoverable. */
+
+  if (rc < 0)
+    {
+    printf("Matching error %d\n", rc);
+    pcre2_match_data_free(match_data);
+    pcre2_code_free(re);
+    return 1;
+    }
+
+  /* Match succeded */
+
+  printf("\nMatch succeeded again at offset %d\n", (int)ovector[0]);
+
+  /* The match succeeded, but the output vector wasn't big enough. This
+  should not happen. */
+
+  if (rc == 0)
+    printf("ovector was not big enough for all the captured substrings\n");
+
+  /* As before, show substrings stored in the output vector by number, and then
+  also any named substrings. */
+
+  for (i = 0; i < rc; i++)
+    {
+    PCRE2_SPTR substring_start = subject + ovector[2*i];
+    size_t substring_length = ovector[2*i+1] - ovector[2*i];
+    printf("%2d: %.*s\n", i, (int)substring_length, (char *)substring_start);
+    }
+
+  if (namecount <= 0) printf("No named substrings\n"); else
+    {
+    PCRE2_SPTR tabptr = name_table;
+    printf("Named substrings\n");
+    for (i = 0; i < namecount; i++)
+      {
+      int n = (tabptr[0] << 8) | tabptr[1];
+      printf("(%d) %*s: %.*s\n", n, name_entry_size - 3, tabptr + 2,
+        (int)(ovector[2*n+1] - ovector[2*n]), subject + ovector[2*n]);
+      tabptr += name_entry_size;
+      }
+    }
+  }      /* End of loop to find second and subsequent matches */
+
+printf("\n");
+pcre2_match_data_free(match_data);
+pcre2_code_free(re);
+return 0;
+}
+
+/* End of pcre2demo.c */
diff --git a/dist/pcregrep.c b/dist2/src/pcre2grep.c
similarity index 83%
rename from dist/pcregrep.c
rename to dist2/src/pcre2grep.c
index 64986b0..aadb22a 100644
--- a/dist/pcregrep.c
+++ b/dist2/src/pcre2grep.c
@@ -1,18 +1,19 @@
 /*************************************************
-*               pcregrep program                 *
+*               pcre2grep program                *
 *************************************************/
 
-/* This is a grep program that uses the PCRE regular expression library to do
-its pattern matching. On Unix-like, Windows, and native z/OS systems it can
-recurse into directories, and in z/OS it can handle PDS files.
+/* This is a grep program that uses the 8-bit PCRE regular expression library
+via the PCRE2 updated API to do its pattern matching. On Unix-like, Windows,
+and native z/OS systems it can recurse into directories, and in z/OS it can
+handle PDS files.
 
 Note that for native z/OS, in addition to defining the NATIVE_ZOS macro, an
-additional header is required. That header is not included in the main PCRE
-distribution because other apparatus is needed to compile pcregrep for z/OS.
+additional header is required. That header is not included in the main PCRE2
+distribution because other apparatus is needed to compile pcre2grep for z/OS.
 The header can be found in the special z/OS distribution, which is available
 from www.zaconsultants.net or from www.cbttape.org.
 
-           Copyright (c) 1997-2014 University of Cambridge
+           Copyright (c) 1997-2016 University of Cambridge
 
 -----------------------------------------------------------------------------
 Redistribution and use in source and binary forms, with or without
@@ -69,14 +70,15 @@
 #include <bzlib.h>
 #endif
 
-#include "pcre.h"
+#define PCRE2_CODE_UNIT_WIDTH 8
+#include "pcre2.h"
 
 #define FALSE 0
 #define TRUE 1
 
 typedef int BOOL;
 
-#define OFFSET_SIZE 99
+#define OFFSET_SIZE 33
 
 #if BUFSIZ > 8192
 #define MAXPATLEN BUFSIZ
@@ -107,10 +109,6 @@
 #define PO_LINE_MATCH     0x0002
 #define PO_FIXED_STRINGS  0x0004
 
-/* Line ending types */
-
-enum { EL_LF, EL_CR, EL_CRLF, EL_ANY, EL_ANYCRLF };
-
 /* Binary file options */
 
 enum { BIN_BINARY, BIN_NOMATCH, BIN_TEXT };
@@ -140,47 +138,50 @@
 static const char *jfriedl_postfix = "";
 #endif
 
-static int  endlinetype;
-
 static char *colour_string = (char *)"1;31";
 static char *colour_option = NULL;
 static char *dee_option = NULL;
 static char *DEE_option = NULL;
 static char *locale = NULL;
 static char *main_buffer = NULL;
-static char *newline = NULL;
+static char *newline_arg = NULL;
 static char *om_separator = (char *)"";
 static char *stdin_name = (char *)"(standard input)";
 
-static const unsigned char *pcretables = NULL;
-
 static int after_context = 0;
 static int before_context = 0;
 static int binary_files = BIN_BINARY;
 static int both_context = 0;
-static int bufthird = PCREGREP_BUFSIZE;
-static int bufsize = 3*PCREGREP_BUFSIZE;
+static int bufthird = PCRE2GREP_BUFSIZE;
+static int bufsize = 3*PCRE2GREP_BUFSIZE;
+static int endlinetype;
 
 #if defined HAVE_WINDOWS_H && HAVE_WINDOWS_H
 static int dee_action = dee_SKIP;
 #else
 static int dee_action = dee_READ;
 #endif
-
 static int DEE_action = DEE_READ;
 static int error_count = 0;
 static int filenames = FN_DEFAULT;
-static int pcre_options = 0;
-static int process_options = 0;
 
-#ifdef SUPPORT_PCREGREP_JIT
-static int study_options = PCRE_STUDY_JIT_COMPILE;
+#ifdef SUPPORT_PCRE2GREP_JIT
+static BOOL use_jit = TRUE;
 #else
-static int study_options = 0;
+static BOOL use_jit = FALSE;
 #endif
 
-static unsigned long int match_limit = 0;
-static unsigned long int match_limit_recursion = 0;
+static const uint8_t *character_tables = NULL;
+
+static uint32_t pcre2_options = 0;
+static uint32_t process_options = 0;
+static uint32_t match_limit = 0;
+static uint32_t recursion_limit = 0;
+
+static pcre2_compile_context *compile_context;
+static pcre2_match_context *match_context;
+static pcre2_match_data *match_data;
+static PCRE2_SIZE *offsets;
 
 static BOOL count_only = FALSE;
 static BOOL do_colour = FALSE;
@@ -196,7 +197,7 @@
 static BOOL quiet = FALSE;
 static BOOL show_only_matching = FALSE;
 static BOOL silent = FALSE;
-static BOOL utf8 = FALSE;
+static BOOL utf = FALSE;
 
 /* Structure for list of --only-matching capturing numbers. */
 
@@ -252,8 +253,7 @@
 typedef struct patstr {
   struct patstr *next;
   char *string;
-  pcre *compiled;
-  pcre_extra *hint;
+  pcre2_code *compiled;
 } patstr;
 
 static patstr *patterns = NULL;
@@ -289,7 +289,7 @@
 
 /* Structure for options and list of them */
 
-enum { OP_NODATA, OP_STRING, OP_OP_STRING, OP_NUMBER, OP_LONGNUMBER,
+enum { OP_NODATA, OP_STRING, OP_OP_STRING, OP_NUMBER, OP_U32NUMBER,
        OP_OP_NUMBER, OP_OP_NUMBERS, OP_PATLIST, OP_FILELIST, OP_BINFILES };
 
 typedef struct option_item {
@@ -348,10 +348,10 @@
   { OP_NODATA,     'h',      NULL,              "no-filename",   "suppress the prefixing filename on output" },
   { OP_NODATA,     'I',      NULL,              "",              "treat binary files as not matching (ignore)" },
   { OP_NODATA,     'i',      NULL,              "ignore-case",   "ignore case distinctions" },
-#ifdef SUPPORT_PCREGREP_JIT
+#ifdef SUPPORT_PCRE2GREP_JIT
   { OP_NODATA,     N_NOJIT,  NULL,              "no-jit",        "do not use just-in-time compiler optimization" },
 #else
-  { OP_NODATA,     N_NOJIT,  NULL,              "no-jit",        "ignored: this pcregrep does not support JIT" },
+  { OP_NODATA,     N_NOJIT,  NULL,              "no-jit",        "ignored: this pcre2grep does not support JIT" },
 #endif
   { 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" },
@@ -359,10 +359,10 @@
   { OP_NODATA,     N_LBUFFER, NULL,             "line-buffered", "use line buffering" },
   { OP_NODATA,     N_LOFFSETS, NULL,            "line-offsets",  "output line numbers and offsets, not text" },
   { OP_STRING,     N_LOCALE, &locale,           "locale=locale", "use the named locale" },
-  { OP_LONGNUMBER, N_M_LIMIT, &match_limit,     "match-limit=number", "set PCRE match limit option" },
-  { OP_LONGNUMBER, N_M_LIMIT_REC, &match_limit_recursion, "recursion-limit=number", "set PCRE match recursion limit option" },
+  { OP_U32NUMBER,  N_M_LIMIT, &match_limit,     "match-limit=number", "set PCRE match limit option" },
+  { OP_U32NUMBER,  N_M_LIMIT_REC, &recursion_limit, "recursion-limit=number", "set PCRE match recursion limit option" },
   { OP_NODATA,     'M',      NULL,              "multiline",     "run in multiline mode" },
-  { OP_STRING,     'N',      &newline,          "newline=type",  "set newline type (CR, LF, CRLF, ANYCRLF or ANY)" },
+  { OP_STRING,     'N',      &newline_arg,      "newline=type",  "set newline type (CR, LF, CRLF, ANYCRLF or ANY)" },
   { OP_NODATA,     'n',      NULL,              "line-number",   "print line number with output lines" },
   { OP_OP_NUMBERS, 'o',      &only_matching_data, "only-matching=n", "show only the part of the line that matched" },
   { OP_STRING,     N_OM_SEPARATOR, &om_separator, "om-separator=text", "set separator for multiple -o output" },
@@ -374,20 +374,11 @@
   { OP_PATLIST,    N_INCLUDE_DIR,&include_dir_patdata, "include-dir=pattern","include matching directories when recursing" },
   { OP_FILELIST,   N_EXCLUDE_FROM,&exclude_from_data, "exclude-from=path", "read exclude list from file" },
   { OP_FILELIST,   N_INCLUDE_FROM,&include_from_data, "include-from=path", "read include list from file" },
-
-  /* These two were accidentally implemented with underscores instead of
-  hyphens in the option names. As this was not discovered for several releases,
-  the incorrect versions are left in the table for compatibility. However, the
-  --help function misses out any option that has an underscore in its name. */
-
-  { OP_PATLIST,   N_EXCLUDE_DIR,&exclude_dir_patdata, "exclude_dir=pattern","exclude matching directories when recursing" },
-  { OP_PATLIST,   N_INCLUDE_DIR,&include_dir_patdata, "include_dir=pattern","include matching directories when recursing" },
-
 #ifdef JFRIEDL_DEBUG
   { OP_OP_NUMBER, 'S',      &S_arg,            "jeffS",         "replace matched (sub)string with X" },
 #endif
   { OP_NODATA,    's',      NULL,              "no-messages",   "suppress error messages" },
-  { OP_NODATA,    'u',      NULL,              "utf-8",         "use UTF-8 mode" },
+  { OP_NODATA,    'u',      NULL,              "utf",           "use UTF 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 patterns to match only as words"  },
@@ -395,6 +386,12 @@
   { OP_NODATA,    0,        NULL,               NULL,            NULL }
 };
 
+/* Table of names for newline types. Must be kept in step with the definitions
+of PCRE2_NEWLINE_xx in pcre2.h. */
+
+static const char *newlines[] = {
+  "DEFAULT", "CR", "LF", "CRLF", "ANY", "ANYCRLF" };
+
 /* Tables for prefixing and suffixing patterns, according to the -w, -x, and -F
 options. These set the 1, 2, and 4 bits in process_options, respectively. Note
 that the combination of -w and -x has the same effect as -x on its own, so we
@@ -421,6 +418,25 @@
 
 
 /*************************************************
+*         Case-independent string compare        *
+*************************************************/
+
+static int
+strcmpic(const char *str1, const char *str2)
+{
+unsigned int c1, c2;
+while (*str1 != '\0' || *str2 != '\0')
+  {
+  c1 = tolower(*str1++);
+  c2 = tolower(*str2++);
+  if (c1 != c2) return ((c1 > c2) << 1) - 1;
+  }
+return 0;
+}
+
+
+
+/*************************************************
 *         Exit from the program                  *
 *************************************************/
 
@@ -431,14 +447,14 @@
 */
 
 static void
-pcregrep_exit(int rc)
+pcre2grep_exit(int rc)
 {
 if (resource_error)
   {
-  fprintf(stderr, "pcregrep: Error %d, %d or %d means that a resource limit "
-    "was exceeded.\n", PCRE_ERROR_MATCHLIMIT, PCRE_ERROR_RECURSIONLIMIT,
-    PCRE_ERROR_JIT_STACKLIMIT);
-  fprintf(stderr, "pcregrep: Check your regex for nested unlimited loops.\n");
+  fprintf(stderr, "pcre2grep: Error %d, %d or %d means that a resource limit "
+    "was exceeded.\n", PCRE2_ERROR_JIT_STACKLIMIT, PCRE2_ERROR_MATCHLIMIT,
+    PCRE2_ERROR_RECURSIONLIMIT);
+  fprintf(stderr, "pcre2grep: Check your regex for nested unlimited loops.\n");
   }
 exit(rc);
 }
@@ -464,12 +480,12 @@
 patstr *p = (patstr *)malloc(sizeof(patstr));
 if (p == NULL)
   {
-  fprintf(stderr, "pcregrep: malloc failed\n");
-  pcregrep_exit(2);
+  fprintf(stderr, "pcre2grep: malloc failed\n");
+  pcre2grep_exit(2);
   }
 if (strlen(s) > MAXPATLEN)
   {
-  fprintf(stderr, "pcregrep: pattern is too long (limit is %d bytes)\n",
+  fprintf(stderr, "pcre2grep: pattern is too long (limit is %d bytes)\n",
     MAXPATLEN);
   free(p);
   return NULL;
@@ -477,7 +493,6 @@
 p->next = NULL;
 p->string = s;
 p->compiled = NULL;
-p->hint = NULL;
 
 if (after != NULL)
   {
@@ -505,8 +520,7 @@
   {
   patstr *p = pc;
   pc = p->next;
-  if (p->hint != NULL) pcre_free_study(p->hint);
-  if (p->compiled != NULL) pcre_free(p->compiled);
+  if (p->compiled != NULL) pcre2_code_free(p->compiled);
   free(p);
   }
 }
@@ -555,7 +569,7 @@
 /* However, z/OS needs the #include statements in this header */
 #include "pcrzosfs.h"
 /* That header is not included in the main PCRE distribution because
-   other apparatus is needed to compile pcregrep for z/OS. The header
+   other apparatus is needed to compile pcre2grep for z/OS. The header
    can be found in the special z/OS distribution, which is available
    from www.zaconsultants.net or from www.cbttape.org. */
 #endif
@@ -569,7 +583,7 @@
 struct stat statbuf;
 if (stat(filename, &statbuf) < 0)
   return 0;        /* In the expectation that opening as a file will fail */
-return (statbuf.st_mode & S_IFMT) == S_IFDIR;
+return S_ISDIR(statbuf.st_mode);
 }
 
 static directory_type *
@@ -606,7 +620,7 @@
 struct stat statbuf;
 if (stat(filename, &statbuf) < 0)
   return 1;        /* In the expectation that opening as a file will fail */
-return (statbuf.st_mode & S_IFMT) == S_IFREG;
+return S_ISREG(statbuf.st_mode);
 }
 
 
@@ -700,8 +714,8 @@
 dir = (directory_type *)malloc(sizeof(*dir));
 if ((pattern == NULL) || (dir == NULL))
   {
-  fprintf(stderr, "pcregrep: malloc failed\n");
-  pcregrep_exit(2);
+  fprintf(stderr, "pcre2grep: malloc failed\n");
+  pcre2grep_exit(2);
   }
 memcpy(pattern, filename, len);
 memcpy(&(pattern[len]), "\\*", 3);
@@ -849,13 +863,13 @@
 usage(int rc)
 {
 option_item *op;
-fprintf(stderr, "Usage: pcregrep [-");
+fprintf(stderr, "Usage: pcre2grep [-");
 for (op = optionlist; op->one_char != 0; op++)
   {
   if (op->one_char > 0) fprintf(stderr, "%c", op->one_char);
   }
 fprintf(stderr, "] [long options] [pattern] [files]\n");
-fprintf(stderr, "Type `pcregrep --help' for more information and the long "
+fprintf(stderr, "Type `pcre2grep --help' for more information and the long "
   "options.\n");
 return rc;
 }
@@ -871,7 +885,7 @@
 {
 option_item *op;
 
-printf("Usage: pcregrep [OPTION]... [PATTERN] [FILE1 FILE2 ...]\n");
+printf("Usage: pcre2grep [OPTION]... [PATTERN] [FILE1 FILE2 ...]\n");
 printf("Search for PATTERN in each FILE or standard input.\n");
 printf("PATTERN must be present if neither -e nor -f is used.\n");
 printf("\"-\" can be used as a file name to mean STDIN.\n");
@@ -890,7 +904,7 @@
 printf("All files are read as plain files, without any interpretation.\n\n");
 #endif
 
-printf("Example: pcregrep -i 'hello.*world' menu.h main.c\n\n");
+printf("Example: pcre2grep -i 'hello.*world' menu.h main.c\n\n");
 printf("Options:\n");
 
 for (op = optionlist; op->one_char != 0; op++)
@@ -898,16 +912,6 @@
   int n;
   char s[4];
 
-  /* Two options were accidentally implemented and documented with underscores
-  instead of hyphens in their names, something that was not noticed for quite a
-  few releases. When fixing this, I left the underscored versions in the list
-  in case people were using them. However, we don't want to display them in the
-  help data. There are no other options that contain underscores, and we do not
-  expect ever to implement such options. Therefore, just omit any option that
-  contains an underscore. */
-
-  if (strchr(op->long_name, '_') != NULL) continue;
-
   if (op->one_char > 0 && (op->long_name)[0] == 0)
     n = 31 - printf("  -%c", op->one_char);
   else
@@ -922,7 +926,7 @@
   }
 
 printf("\nNumbers may be followed by K or M, e.g. --buffer-size=100K.\n");
-printf("The default value for --buffer-size is %d.\n", PCREGREP_BUFSIZE);
+printf("The default value for --buffer-size is %d.\n", PCRE2GREP_BUFSIZE);
 printf("When reading patterns or file names from a file, trailing white\n");
 printf("space is removed and blank lines are ignored.\n");
 printf("The maximum size of any pattern is %d bytes.\n", MAXPATLEN);
@@ -951,11 +955,11 @@
 static BOOL
 test_incexc(char *path, patstr *ip, patstr *ep)
 {
-int plen = strlen(path);
+int plen = strlen((const char *)path);
 
 for (; ep != NULL; ep = ep->next)
   {
-  if (pcre_exec(ep->compiled, NULL, path, plen, 0, 0, NULL, 0) >= 0)
+  if (pcre2_match(ep->compiled, (PCRE2_SPTR)path, plen, 0, 0, match_data, NULL) >= 0)
     return FALSE;
   }
 
@@ -963,7 +967,7 @@
 
 for (; ip != NULL; ip = ip->next)
   {
-  if (pcre_exec(ip->compiled, NULL, path, plen, 0, 0, NULL, 0) >= 0)
+  if (pcre2_match(ip->compiled, (PCRE2_SPTR)path, plen, 0, 0, match_data, NULL) >= 0)
     return TRUE;
   }
 
@@ -1014,13 +1018,13 @@
     char *equals = strchr(op->long_name, '=');
     int nlen = (equals == NULL)? (int)strlen(op->long_name) :
       (int)(equals - op->long_name);
-    fprintf(stderr, "pcregrep: Malformed number \"%s\" after --%.*s\n",
+    fprintf(stderr, "pcre2grep: Malformed number \"%s\" after --%.*s\n",
       option_data, nlen, op->long_name);
     }
   else
-    fprintf(stderr, "pcregrep: Malformed number \"%s\" after -%c\n",
+    fprintf(stderr, "pcre2grep: Malformed number \"%s\" after -%c\n",
       option_data, op->one_char);
-  pcregrep_exit(usage(2));
+  pcre2grep_exit(usage(2));
   }
 
 return n;
@@ -1049,8 +1053,8 @@
 
 if (om == NULL)
   {
-  fprintf(stderr, "pcregrep: malloc failed\n");
-  pcregrep_exit(2);
+  fprintf(stderr, "pcre2grep: malloc failed\n");
+  pcre2grep_exit(2);
   }
 om->next = NULL;
 om->groupnum = n;
@@ -1121,7 +1125,7 @@
 switch(endlinetype)
   {
   default:      /* Just in case */
-  case EL_LF:
+  case PCRE2_NEWLINE_LF:
   while (p < endptr && *p != '\n') p++;
   if (p < endptr)
     {
@@ -1131,7 +1135,7 @@
   *lenptr = 0;
   return endptr;
 
-  case EL_CR:
+  case PCRE2_NEWLINE_CR:
   while (p < endptr && *p != '\r') p++;
   if (p < endptr)
     {
@@ -1141,7 +1145,7 @@
   *lenptr = 0;
   return endptr;
 
-  case EL_CRLF:
+  case PCRE2_NEWLINE_CRLF:
   for (;;)
     {
     while (p < endptr && *p != '\r') p++;
@@ -1158,13 +1162,13 @@
     }
   break;
 
-  case EL_ANYCRLF:
+  case PCRE2_NEWLINE_ANYCRLF:
   while (p < endptr)
     {
     int extra = 0;
     register int c = *((unsigned char *)p);
 
-    if (utf8 && c >= 0xc0)
+    if (utf && c >= 0xc0)
       {
       int gcii, gcss;
       extra = utf8_table4[c & 0x3f];  /* Number of additional bytes */
@@ -1202,13 +1206,13 @@
   *lenptr = 0;  /* Must have hit the end */
   return endptr;
 
-  case EL_ANY:
+  case PCRE2_NEWLINE_ANY:
   while (p < endptr)
     {
     int extra = 0;
     register int c = *((unsigned char *)p);
 
-    if (utf8 && c >= 0xc0)
+    if (utf && c >= 0xc0)
       {
       int gcii, gcss;
       extra = utf8_table4[c & 0x3f];  /* Number of additional bytes */
@@ -1242,7 +1246,7 @@
 
 #ifndef EBCDIC
       case 0x85:    /* Unicode NEL */
-      *lenptr = utf8? 2 : 1;
+      *lenptr = utf? 2 : 1;
       return p;
 
       case 0x2028:  /* Unicode LS */
@@ -1282,17 +1286,17 @@
 switch(endlinetype)
   {
   default:      /* Just in case */
-  case EL_LF:
+  case PCRE2_NEWLINE_LF:
   p--;
   while (p > startptr && p[-1] != '\n') p--;
   return p;
 
-  case EL_CR:
+  case PCRE2_NEWLINE_CR:
   p--;
   while (p > startptr && p[-1] != '\n') p--;
   return p;
 
-  case EL_CRLF:
+  case PCRE2_NEWLINE_CRLF:
   for (;;)
     {
     p -= 2;
@@ -1301,17 +1305,17 @@
     }
   /* Control can never get here */
 
-  case EL_ANY:
-  case EL_ANYCRLF:
+  case PCRE2_NEWLINE_ANY:
+  case PCRE2_NEWLINE_ANYCRLF:
   if (*(--p) == '\n' && p > startptr && p[-1] == '\r') p--;
-  if (utf8) while ((*p & 0xc0) == 0x80) p--;
+  if (utf) while ((*p & 0xc0) == 0x80) p--;
 
   while (p > startptr)
     {
     register unsigned int c;
     char *pp = p - 1;
 
-    if (utf8)
+    if (utf)
       {
       int extra = 0;
       while ((*pp & 0xc0) == 0x80) pp--;
@@ -1331,7 +1335,7 @@
       }
     else c = *((unsigned char *)pp);
 
-    if (endlinetype == EL_ANYCRLF) switch (c)
+    if (endlinetype == PCRE2_NEWLINE_ANYCRLF) switch (c)
       {
       case '\n':    /* LF */
       case '\r':    /* CR */
@@ -1422,8 +1426,7 @@
   length       the length of the subject to match
   options      options for pcre_exec
   startoffset  where to start matching
-  offsets      the offets vector to fill in
-  mrc          address of where to put the result of pcre_exec()
+  mrc          address of where to put the result of pcre2_match()
 
 Returns:      TRUE if there was a match
               FALSE if there was no match
@@ -1432,7 +1435,7 @@
 
 static BOOL
 match_patterns(char *matchptr, size_t length, unsigned int options,
-  int startoffset, int *offsets, int *mrc)
+  size_t startoffset, int *mrc)
 {
 int i;
 size_t slen = length;
@@ -1446,22 +1449,22 @@
   }
 for (i = 1; p != NULL; p = p->next, i++)
   {
-  *mrc = pcre_exec(p->compiled, p->hint, matchptr, (int)length,
-    startoffset, options, offsets, OFFSET_SIZE);
+  *mrc = pcre2_match(p->compiled, (PCRE2_SPTR)matchptr, (int)length,
+    startoffset, options, match_data, match_context);
   if (*mrc >= 0) return TRUE;
-  if (*mrc == PCRE_ERROR_NOMATCH) continue;
-  fprintf(stderr, "pcregrep: pcre_exec() gave error %d while matching ", *mrc);
+  if (*mrc == PCRE2_ERROR_NOMATCH) continue;
+  fprintf(stderr, "pcre2grep: pcre2_match() gave error %d while matching ", *mrc);
   if (patterns->next != NULL) fprintf(stderr, "pattern number %d to ", i);
   fprintf(stderr, "%s", msg);
   FWRITE(matchptr, 1, slen, stderr);   /* In case binary zero included */
   fprintf(stderr, "\n\n");
-  if (*mrc == PCRE_ERROR_MATCHLIMIT || *mrc == PCRE_ERROR_RECURSIONLIMIT ||
-      *mrc == PCRE_ERROR_JIT_STACKLIMIT)
+  if (*mrc == PCRE2_ERROR_MATCHLIMIT || *mrc == PCRE2_ERROR_RECURSIONLIMIT ||
+      *mrc == PCRE2_ERROR_JIT_STACKLIMIT)
     resource_error = TRUE;
   if (error_count++ > 20)
     {
-    fprintf(stderr, "pcregrep: Too many errors - abandoned.\n");
-    pcregrep_exit(2);
+    fprintf(stderr, "pcre2grep: Too many errors - abandoned.\n");
+    pcre2grep_exit(2);
     }
   return invert;    /* No more matching; don't show the line again */
   }
@@ -1499,14 +1502,13 @@
 */
 
 static int
-pcregrep(void *handle, int frtype, char *filename, char *printname)
+pcre2grep(void *handle, int frtype, char *filename, char *printname)
 {
 int rc = 1;
 int linenumber = 1;
 int lastmatchnumber = 0;
 int count = 0;
 int filepos = 0;
-int offsets[OFFSET_SIZE];
 char *lastmatchrestart = NULL;
 char *ptr = main_buffer;
 char *endptr;
@@ -1581,21 +1583,18 @@
   {
   int endlinelength;
   int mrc = 0;
-  int startoffset = 0;
-  int prevoffsets[2];
   unsigned int options = 0;
   BOOL match;
   char *matchptr = ptr;
   char *t = ptr;
   size_t length, linelength;
-
-  prevoffsets[0] = prevoffsets[1] = -1;
+  size_t startoffset = 0;
 
   /* 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, excluding the terminating newline. After matching, we always
-  advance by the length of the next line. In multiline mode the PCRE_FIRSTLINE
+  advance by the length of the next line. In multiline mode the PCRE2_FIRSTLINE
   option is used for compiling, so that any match is constrained to be in the
   first line. */
 
@@ -1609,8 +1608,8 @@
 
   if (endlinelength == 0 && t == main_buffer + bufsize)
     {
-    fprintf(stderr, "pcregrep: line %d%s%s is too long for the internal buffer\n"
-                    "pcregrep: check the --buffer-size option\n",
+    fprintf(stderr, "pcre2grep: line %d%s%s is too long for the internal buffer\n"
+                    "pcre2grep: check the --buffer-size option\n",
                     linenumber,
                     (filename == NULL)? "" : " of file ",
                     (filename == NULL)? "" : filename);
@@ -1635,7 +1634,7 @@
           ptr = malloc(newlen + 1);
           if (!ptr) {
                   printf("out of memory");
-                  pcregrep_exit(2);
+                  pcre2grep_exit(2);
           }
           endptr = ptr;
           strcpy(endptr, jfriedl_prefix); endptr += strlen(jfriedl_prefix);
@@ -1653,7 +1652,7 @@
 
       for (i = 0; i < jfriedl_XR; i++)
           match = (pcre_exec(patterns->compiled, patterns->hint, ptr, length, 0,
-              PCRE_NOTEMPTY, offsets, OFFSET_SIZE) >= 0);
+              PCRE2_NOTEMPTY, offsets, OFFSET_SIZE) >= 0);
 
       if (gettimeofday(&end_time, &dummy) != 0)
               perror("bad gettimeofday");
@@ -1676,11 +1675,11 @@
   /* Run through all the patterns until one matches or there is an error other
   than NOMATCH. This code is in a subroutine so that it can be re-used for
   finding subsequent matches when colouring matched lines. After finding one
-  match, set PCRE_NOTEMPTY to disable any further matches of null strings in
+  match, set PCRE2_NOTEMPTY to disable any further matches of null strings in
   this line. */
 
-  match = match_patterns(matchptr, length, options, startoffset, offsets, &mrc);
-  options = PCRE_NOTEMPTY;
+  match = match_patterns(matchptr, length, options, startoffset, &mrc);
+  options = PCRE2_NOTEMPTY;
 
   /* If it's a match or a not-match (as required), do what's wanted. */
 
@@ -1692,7 +1691,7 @@
 
     if (filenames == FN_NOMATCH_ONLY) return 1;
 
-    /* If all we want is a yes/no answer, stop now. */
+    /* If all we want is a yes/no answer, we can return immediately. */
 
     if (quiet) return 0;
 
@@ -1710,8 +1709,8 @@
       return 0;
       }
 
-    /* If all we want is a file name, there is no need to scan any more lines
-    in the file. */
+    /* Likewise, if all we want is a file name, there is no need to scan any
+    more lines in the file. */
 
     else if (filenames == FN_MATCH_ONLY)
       {
@@ -1732,84 +1731,66 @@
       {
       if (!invert)
         {
-        int oldstartoffset = startoffset;
+        size_t oldstartoffset;
 
-        /* It is possible, when a lookbehind assertion contains \K, for the
-        same string to be found again. The code below advances startoffset, but
-        until it is past the "bumpalong" offset that gave the match, the same
-        substring will be returned. The PCRE1 library does not return the
-        bumpalong offset, so all we can do is ignore repeated strings. (PCRE2
-        does this better.) */
+        if (printname != NULL) fprintf(stdout, "%s:", printname);
+        if (number) fprintf(stdout, "%d:", linenumber);
 
-        if (prevoffsets[0] != offsets[0] || prevoffsets[1] != offsets[1])
+        /* Handle --line-offsets */
+
+        if (line_offsets)
+          fprintf(stdout, "%d,%d\n", (int)(matchptr + offsets[0] - ptr),
+            (int)(offsets[1] - offsets[0]));
+
+        /* Handle --file-offsets */
+
+        else if (file_offsets)
+          fprintf(stdout, "%d,%d\n",
+            (int)(filepos + matchptr + offsets[0] - ptr),
+            (int)(offsets[1] - offsets[0]));
+
+        /* Handle --only-matching, which may occur many times */
+
+        else
           {
-          prevoffsets[0] = offsets[0];
-          prevoffsets[1] = offsets[1];
+          BOOL printed = FALSE;
+          omstr *om;
 
-          if (printname != NULL) fprintf(stdout, "%s:", printname);
-          if (number) fprintf(stdout, "%d:", linenumber);
-
-          /* Handle --line-offsets */
-
-          if (line_offsets)
-            fprintf(stdout, "%d,%d\n", (int)(matchptr + offsets[0] - ptr),
-              offsets[1] - offsets[0]);
-
-          /* Handle --file-offsets */
-
-          else if (file_offsets)
-            fprintf(stdout, "%d,%d\n",
-              (int)(filepos + matchptr + offsets[0] - ptr),
-              offsets[1] - offsets[0]);
-
-          /* Handle --only-matching, which may occur many times */
-
-          else
+          for (om = only_matching; om != NULL; om = om->next)
             {
-            BOOL printed = FALSE;
-            omstr *om;
-
-            for (om = only_matching; om != NULL; om = om->next)
+            int n = om->groupnum;
+            if (n < mrc)
               {
-              int n = om->groupnum;
-              if (n < mrc)
+              int plen = offsets[2*n + 1] - offsets[2*n];
+              if (plen > 0)
                 {
-                int plen = offsets[2*n + 1] - offsets[2*n];
-                if (plen > 0)
-                  {
-                  if (printed) fprintf(stdout, "%s", om_separator);
-                  if (do_colour) fprintf(stdout, "%c[%sm", 0x1b, colour_string);
-                  FWRITE(matchptr + offsets[n*2], 1, plen, stdout);
-                  if (do_colour) fprintf(stdout, "%c[00m", 0x1b);
-                  printed = TRUE;
-                  }
+                if (printed) fprintf(stdout, "%s", om_separator);
+                if (do_colour) fprintf(stdout, "%c[%sm", 0x1b, colour_string);
+                FWRITE(matchptr + offsets[n*2], 1, plen, stdout);
+                if (do_colour) fprintf(stdout, "%c[00m", 0x1b);
+                printed = TRUE;
                 }
               }
-
-            if (printed || printname != NULL || number) fprintf(stdout, "\n");
             }
+
+          if (printed || printname != NULL || number) fprintf(stdout, "\n");
           }
 
-        /* Prepare to repeat to find the next match. If the patterned contained
-        a lookbehind tht included \K, it is possible that the end of the match
-        might be at or before the actual strting offset we have just used. We
-        need to start one character further on. Unfortunately, for unanchored
-        patterns, the actual start offset can be greater that the one that was
-        set as a result of "bumpalong". PCRE1 does not return the actual start
-        offset, so we have to check against the original start offset. This may
-        lead to duplicates - we we need the fudge above to avoid printing them.
-        (PCRE2 does this better.) */
+        /* Prepare to repeat to find the next match. If the pattern contained a
+        lookbehind that included \K, it is possible that the end of the match
+        might be at or before the actual starting offset we have just used. In
+        this case, start one character further on. */
 
         match = FALSE;
         if (line_buffered) fflush(stdout);
         rc = 0;                      /* Had some success */
         startoffset = offsets[1];    /* Restart after the match */
+        oldstartoffset = pcre2_get_startchar(match_data);
         if (startoffset <= oldstartoffset)
           {
-          if ((size_t)startoffset >= length)
-            goto END_ONE_MATCH;              /* We were at the end */
+          if (startoffset >= length) goto END_ONE_MATCH;  /* Were at end */
           startoffset = oldstartoffset + 1;
-          if (utf8)
+          if (utf)
             while ((matchptr[startoffset] & 0xc0) == 0x80) startoffset++;
           }
         goto ONLY_MATCHING_RESTART;
@@ -1904,7 +1885,7 @@
       /* 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, but only when there actually was a match
-      (invert not set). Because the PCRE_FIRSTLINE option is set, the start of
+      (invert not set). Because the PCRE2_FIRSTLINE option is set, the start of
       the match will always be before the first newline sequence. */
 
       if (multiline & !invert)
@@ -1951,9 +1932,8 @@
         for (;;)
           {
           startoffset = offsets[1];
-          if (startoffset >= (int)linelength + endlinelength ||
-              !match_patterns(matchptr, length, options, startoffset, offsets,
-                &mrc))
+          if (startoffset >= linelength + endlinelength ||
+              !match_patterns(matchptr, length, options, startoffset, &mrc))
             break;
           FWRITE(matchptr + startoffset, 1, offsets[0] - startoffset, stdout);
           fprintf(stdout, "%c[%sm", 0x1b, colour_string);
@@ -2154,7 +2134,7 @@
 
 if (strcmp(pathname, "-") == 0)
   {
-  return pcregrep(stdin, FR_PLAIN, stdin_name,
+  return pcre2grep(stdin, FR_PLAIN, stdin_name,
     (filenames > FN_DEFAULT || (filenames == FN_DEFAULT && !only_one_at_top))?
       stdin_name : NULL);
   }
@@ -2178,7 +2158,7 @@
 
 if (zos_test_file == NULL)
    {
-   if (!silent) fprintf(stderr, "pcregrep: failed to test next file %s\n",
+   if (!silent) fprintf(stderr, "pcre2grep: failed to test next file %s\n",
      pathname, strerror(errno));
    return -1;
    }
@@ -2224,7 +2204,7 @@
     if (dir == NULL)
       {
       if (!silent)
-        fprintf(stderr, "pcregrep: Failed to open directory %s: %s\n", pathname,
+        fprintf(stderr, "pcre2grep: Failed to open directory %s: %s\n", pathname,
           strerror(errno));
       return 2;
       }
@@ -2279,7 +2259,7 @@
   if (ingz == NULL)
     {
     if (!silent)
-      fprintf(stderr, "pcregrep: Failed to open %s: %s\n", pathname,
+      fprintf(stderr, "pcre2grep: Failed to open %s: %s\n", pathname,
         strerror(errno));
     return 2;
     }
@@ -2318,14 +2298,14 @@
 if (handle == NULL)
   {
   if (!silent)
-    fprintf(stderr, "pcregrep: Failed to open %s: %s\n", pathname,
+    fprintf(stderr, "pcre2grep: Failed to open %s: %s\n", pathname,
       strerror(errno));
   return 2;
   }
 
 /* Now grep the file */
 
-rc = pcregrep(handle, frtype, pathname, (filenames > FN_DEFAULT ||
+rc = pcre2grep(handle, frtype, pathname, (filenames > FN_DEFAULT ||
   (filenames == FN_DEFAULT && !only_one_at_top))? pathname : NULL);
 
 /* Close in an appropriate manner. */
@@ -2353,7 +2333,7 @@
       goto PLAIN_FILE;
       }
     else if (!silent)
-      fprintf(stderr, "pcregrep: Failed to read %s using bzlib: %s\n",
+      fprintf(stderr, "pcre2grep: Failed to read %s using bzlib: %s\n",
         pathname, err);
     rc = 2;    /* The normal "something went wrong" code */
     }
@@ -2366,7 +2346,7 @@
 
 fclose(in);
 
-/* Pass back the yield from pcregrep(). */
+/* Pass back the yield from pcre2grep(). */
 
 return rc;
 }
@@ -2383,20 +2363,20 @@
 switch(letter)
   {
   case N_FOFFSETS: file_offsets = TRUE; break;
-  case N_HELP: help(); pcregrep_exit(0);
+  case N_HELP: help(); pcre2grep_exit(0);
   case N_LBUFFER: line_buffered = TRUE; break;
   case N_LOFFSETS: line_offsets = number = TRUE; break;
-  case N_NOJIT: study_options &= ~PCRE_STUDY_JIT_COMPILE; break;
+  case N_NOJIT: use_jit = FALSE; break;
   case 'a': binary_files = BIN_TEXT; break;
   case 'c': count_only = TRUE; break;
   case 'F': process_options |= PO_FIXED_STRINGS; break;
   case 'H': filenames = FN_FORCE; break;
   case 'I': binary_files = BIN_NOMATCH; break;
   case 'h': filenames = FN_NONE; break;
-  case 'i': options |= PCRE_CASELESS; break;
+  case 'i': options |= PCRE2_CASELESS; break;
   case 'l': omit_zero_count = TRUE; filenames = FN_MATCH_ONLY; break;
   case 'L': filenames = FN_NOMATCH_ONLY; break;
-  case 'M': multiline = TRUE; options |= PCRE_MULTILINE|PCRE_FIRSTLINE; break;
+  case 'M': multiline = TRUE; options |= PCRE2_MULTILINE|PCRE2_FIRSTLINE; break;
   case 'n': number = TRUE; break;
 
   case 'o':
@@ -2407,19 +2387,23 @@
   case 'q': quiet = TRUE; break;
   case 'r': dee_action = dee_RECURSE; break;
   case 's': silent = TRUE; break;
-  case 'u': options |= PCRE_UTF8; utf8 = TRUE; break;
+  case 'u': options |= PCRE2_UTF; utf = TRUE; break;
   case 'v': invert = TRUE; break;
   case 'w': process_options |= PO_WORD_MATCH; break;
   case 'x': process_options |= PO_LINE_MATCH; break;
 
   case 'V':
-  fprintf(stdout, "pcregrep version %s\n", pcre_version());
-  pcregrep_exit(0);
+    {
+    unsigned char buffer[128];
+    (void)pcre2_config(PCRE2_CONFIG_VERSION, buffer);
+    fprintf(stdout, "pcre2grep version %s\n", buffer);
+    }
+  pcre2grep_exit(0);
   break;
 
   default:
-  fprintf(stderr, "pcregrep: Unknown option -%c\n", letter);
-  pcregrep_exit(usage(2));
+  fprintf(stderr, "pcre2grep: Unknown option -%c\n", letter);
+  pcre2grep_exit(usage(2));
   }
 
 return options;
@@ -2437,7 +2421,7 @@
 static char *
 ordin(int n)
 {
-static char buffer[8];
+static char buffer[14];
 char *p = buffer;
 sprintf(p, "%d", n);
 while (*p != 0) p++;
@@ -2482,11 +2466,11 @@
 compile_pattern(patstr *p, int options, int popts, int fromfile,
   const char *fromtext, int count)
 {
-char buffer[PATBUFSIZE];
-const char *error;
+unsigned char buffer[PATBUFSIZE];
+PCRE2_SIZE erroffset;
 char *ps = p->string;
-int patlen = strlen(ps);
-int errptr;
+unsigned int patlen = strlen(ps);
+int errcode;
 
 if (p->compiled != NULL) return TRUE;
 
@@ -2503,28 +2487,30 @@
     }
   }
 
-sprintf(buffer, "%s%.*s%s", prefix[popts], patlen, ps, suffix[popts]);
-p->compiled = pcre_compile(buffer, options, &error, &errptr, pcretables);
+sprintf((char *)buffer, "%s%.*s%s", prefix[popts], patlen, ps, suffix[popts]);
+p->compiled = pcre2_compile(buffer, -1, options, &errcode, &erroffset,
+  compile_context);
 if (p->compiled != NULL) return TRUE;
 
 /* Handle compile errors */
 
-errptr -= (int)strlen(prefix[popts]);
-if (errptr > patlen) errptr = patlen;
+erroffset -= (int)strlen(prefix[popts]);
+if (erroffset > patlen) erroffset = patlen;
+pcre2_get_error_message(errcode, buffer, PATBUFSIZE);
 
 if (fromfile)
   {
-  fprintf(stderr, "pcregrep: Error in regex in line %d of %s "
-    "at offset %d: %s\n", count, fromtext, errptr, error);
+  fprintf(stderr, "pcre2grep: Error in regex in line %d of %s "
+    "at offset %d: %s\n", count, fromtext, (int)erroffset, buffer);
   }
 else
   {
   if (count == 0)
-    fprintf(stderr, "pcregrep: Error in %s regex at offset %d: %s\n",
-      fromtext, errptr, error);
+    fprintf(stderr, "pcre2grep: Error in %s regex at offset %d: %s\n",
+      fromtext, (int)erroffset, buffer);
   else
-    fprintf(stderr, "pcregrep: Error in %s %s regex at offset %d: %s\n",
-      ordin(count), fromtext, errptr, error);
+    fprintf(stderr, "pcre2grep: Error in %s %s regex at offset %d: %s\n",
+      ordin(count), fromtext, (int)erroffset, buffer);
   }
 
 return FALSE;
@@ -2565,7 +2551,7 @@
   f = fopen(name, "r");
   if (f == NULL)
     {
-    fprintf(stderr, "pcregrep: Failed to open %s: %s\n", name, strerror(errno));
+    fprintf(stderr, "pcre2grep: Failed to open %s: %s\n", name, strerror(errno));
     return FALSE;
     }
   filename = name;
@@ -2595,11 +2581,11 @@
   /* This loop is needed because compiling a "pattern" when -F is set may add
   on additional literal patterns if the original contains a newline. In the
   common case, it never will, because fgets() stops at a newline. However,
-  the -N option can be used to give pcregrep a different newline setting. */
+  the -N option can be used to give pcre2grep a different newline setting. */
 
   for(;;)
     {
-    if (!compile_pattern(*patlastptr, pcre_options, popts, TRUE, filename,
+    if (!compile_pattern(*patlastptr, pcre2_options, popts, TRUE, filename,
         linenumber))
       {
       if (f != stdin) fclose(f);
@@ -2632,27 +2618,17 @@
 patstr *cp;
 fnstr *fn;
 const char *locale_from = "--locale";
-const char *error;
 
-#ifdef SUPPORT_PCREGREP_JIT
-pcre_jit_stack *jit_stack = NULL;
+#ifdef SUPPORT_PCRE2GREP_JIT
+pcre2_jit_stack *jit_stack = NULL;
 #endif
 
-/* Set the default line ending value from the default in the PCRE library;
-"lf", "cr", "crlf", and "any" are supported. Anything else is treated as "lf".
-Note that the return values from pcre_config(), though derived from the ASCII
-codes, are the same in EBCDIC environments, so we must use the actual values
-rather than escapes such as as '\r'. */
+/* Set up a default compile and match contexts and a match data block. */
 
-(void)pcre_config(PCRE_CONFIG_NEWLINE, &i);
-switch(i)
-  {
-  default:               newline = (char *)"lf"; break;
-  case 13:               newline = (char *)"cr"; break;
-  case (13 << 8) | 10:   newline = (char *)"crlf"; break;
-  case -1:               newline = (char *)"any"; break;
-  case -2:               newline = (char *)"anycrlf"; break;
-  }
+compile_context = pcre2_compile_context_create(NULL);
+match_context = pcre2_match_context_create(NULL);
+match_data = pcre2_match_data_create(OFFSET_SIZE, NULL);
+offsets = pcre2_get_ovector_pointer(match_data);
 
 /* Process the options */
 
@@ -2671,7 +2647,7 @@
   if (argv[i][1] == 0)
     {
     if (pattern_files != NULL || patterns != NULL) break;
-      else pcregrep_exit(usage(2));
+      else pcre2grep_exit(usage(2));
     }
 
   /* Handle a long name option, or -- to terminate the options */
@@ -2761,8 +2737,8 @@
 
     if (op->one_char == 0)
       {
-      fprintf(stderr, "pcregrep: Unknown option %s\n", argv[i]);
-      pcregrep_exit(usage(2));
+      fprintf(stderr, "pcre2grep: Unknown option %s\n", argv[i]);
+      pcre2grep_exit(usage(2));
       }
     }
 
@@ -2805,9 +2781,9 @@
         }
       if (op->one_char == 0)
         {
-        fprintf(stderr, "pcregrep: Unknown option letter '%c' in \"%s\"\n",
+        fprintf(stderr, "pcre2grep: Unknown option letter '%c' in \"%s\"\n",
           *s, argv[i]);
-        pcregrep_exit(usage(2));
+        pcre2grep_exit(usage(2));
         }
 
       option_data = s+1;
@@ -2834,7 +2810,7 @@
       /* Handle a single-character option with no data, then loop for the
       next character in the string. */
 
-      pcre_options = handle_option(*s++, pcre_options);
+      pcre2_options = handle_option(*s++, pcre2_options);
       }
     }
 
@@ -2844,7 +2820,7 @@
 
   if (op->type == OP_NODATA)
     {
-    pcre_options = handle_option(op->one_char, pcre_options);
+    pcre2_options = handle_option(op->one_char, pcre2_options);
     continue;
     }
 
@@ -2883,8 +2859,8 @@
     {
     if (i >= argc - 1 || longopwasequals)
       {
-      fprintf(stderr, "pcregrep: Data missing after %s\n", argv[i]);
-      pcregrep_exit(usage(2));
+      fprintf(stderr, "pcre2grep: Data missing after %s\n", argv[i]);
+      pcre2grep_exit(usage(2));
       }
     option_data = argv[++i];
     }
@@ -2921,7 +2897,7 @@
     fn = (fnstr *)malloc(sizeof(fnstr));
     if (fn == NULL)
       {
-      fprintf(stderr, "pcregrep: malloc failed\n");
+      fprintf(stderr, "pcre2grep: malloc failed\n");
       goto EXIT2;
       }
     fn->next = NULL;
@@ -2945,15 +2921,15 @@
       binary_files = BIN_TEXT;
     else
       {
-      fprintf(stderr, "pcregrep: unknown value \"%s\" for binary-files\n",
+      fprintf(stderr, "pcre2grep: unknown value \"%s\" for binary-files\n",
         option_data);
-      pcregrep_exit(usage(2));
+      pcre2grep_exit(usage(2));
       }
     }
 
   /* Otherwise, deal with a single string or numeric data value. */
 
-  else if (op->type != OP_NUMBER && op->type != OP_LONGNUMBER &&
+  else if (op->type != OP_NUMBER && op->type != OP_U32NUMBER &&
            op->type != OP_OP_NUMBER)
     {
     *((char **)op->dataptr) = option_data;
@@ -2961,7 +2937,7 @@
   else
     {
     unsigned long int n = decode_number(option_data, op, longop);
-    if (op->type == OP_LONGNUMBER) *((unsigned long int *)op->dataptr) = n;
+    if (op->type == OP_U32NUMBER) *((uint32_t *)op->dataptr) = n;
       else *((int *)op->dataptr) = n;
     }
   }
@@ -2982,11 +2958,16 @@
 if ((only_matching != NULL && (file_offsets || line_offsets)) ||
     (file_offsets && line_offsets))
   {
-  fprintf(stderr, "pcregrep: Cannot mix --only-matching, --file-offsets "
+  fprintf(stderr, "pcre2grep: Cannot mix --only-matching, --file-offsets "
     "and/or --line-offsets\n");
-  pcregrep_exit(usage(2));
+  pcre2grep_exit(usage(2));
   }
 
+/* Put limits into the match data block. */
+
+if (match_limit > 0) pcre2_set_match_limit(match_context, match_limit);
+if (recursion_limit > 0) pcre2_set_recursion_limit(match_context, recursion_limit);
+
 if (only_matching != NULL || file_offsets || line_offsets)
   show_only_matching = TRUE;
 
@@ -3005,18 +2986,19 @@
   locale_from = "LC_CTYPE";
   }
 
-/* If a locale is set, use it to generate the tables the PCRE needs. Otherwise,
-pcretables==NULL, which causes the use of default tables. */
+/* If a locale is set, use it to generate the tables the PCRE needs. Passing
+NULL to pcre2_maketables() means that malloc() is used to get the memory. */
 
 if (locale != NULL)
   {
   if (setlocale(LC_CTYPE, locale) == NULL)
     {
-    fprintf(stderr, "pcregrep: Failed to set locale %s (obtained from %s)\n",
+    fprintf(stderr, "pcre2grep: Failed to set locale %s (obtained from %s)\n",
       locale, locale_from);
     goto EXIT2;
     }
-  pcretables = pcre_maketables();
+  character_tables = pcre2_maketables(NULL);
+  pcre2_set_character_tables(compile_context, character_tables);
   }
 
 /* Sort out colouring */
@@ -3027,49 +3009,42 @@
   else if (strcmp(colour_option, "auto") == 0) do_colour = is_stdout_tty();
   else
     {
-    fprintf(stderr, "pcregrep: Unknown colour setting \"%s\"\n",
+    fprintf(stderr, "pcre2grep: Unknown colour setting \"%s\"\n",
       colour_option);
     goto EXIT2;
     }
   if (do_colour)
     {
-    char *cs = getenv("PCREGREP_COLOUR");
-    if (cs == NULL) cs = getenv("PCREGREP_COLOR");
+    char *cs = getenv("PCRE2GREP_COLOUR");
+    if (cs == NULL) cs = getenv("PCRE2GREP_COLOR");
     if (cs != NULL) colour_string = cs;
     }
   }
 
-/* Interpret the newline type; the default settings are Unix-like. */
+/* Sort out a newline setting. */
 
-if (strcmp(newline, "cr") == 0 || strcmp(newline, "CR") == 0)
+if (newline_arg != NULL)
   {
-  pcre_options |= PCRE_NEWLINE_CR;
-  endlinetype = EL_CR;
+  for (endlinetype = 1; endlinetype < (int)(sizeof(newlines)/sizeof(char *));
+       endlinetype++)
+    {
+    if (strcmpic(newline_arg, newlines[endlinetype]) == 0) break;
+    }
+  if (endlinetype < (int)(sizeof(newlines)/sizeof(char *)))
+    pcre2_set_newline(compile_context, endlinetype);
+  else
+    {
+    fprintf(stderr, "pcre2grep: Invalid newline specifier \"%s\"\n",
+      newline_arg);
+    goto EXIT2;
+    }
   }
-else if (strcmp(newline, "lf") == 0 || strcmp(newline, "LF") == 0)
-  {
-  pcre_options |= PCRE_NEWLINE_LF;
-  endlinetype = EL_LF;
-  }
-else if (strcmp(newline, "crlf") == 0 || strcmp(newline, "CRLF") == 0)
-  {
-  pcre_options |= PCRE_NEWLINE_CRLF;
-  endlinetype = EL_CRLF;
-  }
-else if (strcmp(newline, "any") == 0 || strcmp(newline, "ANY") == 0)
-  {
-  pcre_options |= PCRE_NEWLINE_ANY;
-  endlinetype = EL_ANY;
-  }
-else if (strcmp(newline, "anycrlf") == 0 || strcmp(newline, "ANYCRLF") == 0)
-  {
-  pcre_options |= PCRE_NEWLINE_ANYCRLF;
-  endlinetype = EL_ANYCRLF;
-  }
+
+/* Find default newline convention */
+
 else
   {
-  fprintf(stderr, "pcregrep: Invalid newline specifier \"%s\"\n", newline);
-  goto EXIT2;
+  (void)pcre2_config(PCRE2_CONFIG_NEWLINE, &endlinetype);
   }
 
 /* Interpret the text values for -d and -D */
@@ -3081,7 +3056,7 @@
   else if (strcmp(dee_option, "skip") == 0) dee_action = dee_SKIP;
   else
     {
-    fprintf(stderr, "pcregrep: Invalid value \"%s\" for -d\n", dee_option);
+    fprintf(stderr, "pcre2grep: Invalid value \"%s\" for -d\n", dee_option);
     goto EXIT2;
     }
   }
@@ -3092,7 +3067,7 @@
   else if (strcmp(DEE_option, "skip") == 0) DEE_action = DEE_SKIP;
   else
     {
-    fprintf(stderr, "pcregrep: Invalid value \"%s\" for -D\n", DEE_option);
+    fprintf(stderr, "pcre2grep: Invalid value \"%s\" for -D\n", DEE_option);
     goto EXIT2;
     }
   }
@@ -3102,7 +3077,7 @@
 #ifdef JFRIEDL_DEBUG
 if (S_arg > 9)
   {
-  fprintf(stderr, "pcregrep: bad value for -S option\n");
+  fprintf(stderr, "pcre2grep: bad value for -S option\n");
   return 2;
   }
 if (jfriedl_XT != 0 || jfriedl_XR != 0)
@@ -3119,7 +3094,7 @@
 
 if (main_buffer == NULL)
   {
-  fprintf(stderr, "pcregrep: malloc failed\n");
+  fprintf(stderr, "pcre2grep: malloc failed\n");
   goto EXIT2;
   }
 
@@ -3141,7 +3116,7 @@
 
 for (j = 1, cp = patterns; cp != NULL; j++, cp = cp->next)
   {
-  if (!compile_pattern(cp, pcre_options, process_options, FALSE, "command-line",
+  if (!compile_pattern(cp, pcre2_options, process_options, FALSE, "command-line",
        (j == 1 && patterns->next == NULL)? 0 : j))
     goto EXIT2;
   }
@@ -3154,55 +3129,21 @@
     goto EXIT2;
   }
 
-/* Study the regular expressions, as we will be running them many times. If an
-extra block is needed for a limit, set PCRE_STUDY_EXTRA_NEEDED so that one is
-returned, even if studying produces no data. */
-
-if (match_limit > 0 || match_limit_recursion > 0)
-  study_options |= PCRE_STUDY_EXTRA_NEEDED;
-
 /* Unless JIT has been explicitly disabled, arrange a stack for it to use. */
 
-#ifdef SUPPORT_PCREGREP_JIT
-if ((study_options & PCRE_STUDY_JIT_COMPILE) != 0)
-  jit_stack = pcre_jit_stack_alloc(32*1024, 1024*1024);
+#ifdef SUPPORT_PCRE2GREP_JIT
+if (use_jit)
+  jit_stack = pcre2_jit_stack_create(32*1024, 1024*1024, NULL);
 #endif
 
 for (j = 1, cp = patterns; cp != NULL; j++, cp = cp->next)
   {
-  cp->hint = pcre_study(cp->compiled, study_options, &error);
-  if (error != NULL)
-    {
-    char s[16];
-    if (patterns->next == NULL) s[0] = 0; else sprintf(s, " number %d", j);
-    fprintf(stderr, "pcregrep: Error while studying regex%s: %s\n", s, error);
-    goto EXIT2;
-    }
-#ifdef SUPPORT_PCREGREP_JIT
-  if (jit_stack != NULL && cp->hint != NULL)
-    pcre_assign_jit_stack(cp->hint, NULL, jit_stack);
+#ifdef SUPPORT_PCRE2GREP_JIT
+  if (jit_stack != NULL && cp->compiled != NULL)
+    pcre2_jit_stack_assign(match_context, NULL, jit_stack);
 #endif
   }
 
-/* If --match-limit or --recursion-limit was set, put the value(s) into the
-pcre_extra block for each pattern. There will always be an extra block because
-of the use of PCRE_STUDY_EXTRA_NEEDED above. */
-
-for (cp = patterns; cp != NULL; cp = cp->next)
-  {
-  if (match_limit > 0)
-    {
-    cp->hint->flags |= PCRE_EXTRA_MATCH_LIMIT;
-    cp->hint->match_limit = match_limit;
-    }
-
-  if (match_limit_recursion > 0)
-    {
-    cp->hint->flags |= PCRE_EXTRA_MATCH_LIMIT_RECURSION;
-    cp->hint->match_limit_recursion = match_limit_recursion;
-    }
-  }
-
 /* If there are include or exclude patterns read from the command line, compile
 them. -F, -w, and -x do not apply, so the third argument of compile_pattern is
 0. */
@@ -3212,7 +3153,7 @@
   int k;
   for (k = 1, cp = *(incexlist[j]); cp != NULL; k++, cp = cp->next)
     {
-    if (!compile_pattern(cp, pcre_options, 0, FALSE, incexname[j],
+    if (!compile_pattern(cp, pcre2_options, 0, FALSE, incexname[j],
          (k == 1 && cp->next == NULL)? 0 : k))
       goto EXIT2;
     }
@@ -3237,7 +3178,7 @@
 
 if (file_lists == NULL && i >= argc)
   {
-  rc = pcregrep(stdin, FR_PLAIN, stdin_name,
+  rc = pcre2grep(stdin, FR_PLAIN, stdin_name,
     (filenames > FN_DEFAULT)? stdin_name : NULL);
   goto EXIT;
   }
@@ -3254,7 +3195,7 @@
     fl = fopen(fn->name, "rb");
     if (fl == NULL)
       {
-      fprintf(stderr, "pcregrep: Failed to open %s: %s\n", fn->name,
+      fprintf(stderr, "pcre2grep: Failed to open %s: %s\n", fn->name,
         strerror(errno));
       goto EXIT2;
       }
@@ -3290,12 +3231,16 @@
   }
 
 EXIT:
-#ifdef SUPPORT_PCREGREP_JIT
-if (jit_stack != NULL) pcre_jit_stack_free(jit_stack);
+#ifdef SUPPORT_PCRE2GREP_JIT
+if (jit_stack != NULL) pcre2_jit_stack_free(jit_stack);
 #endif
 
 free(main_buffer);
-free((void *)pcretables);
+free((void *)character_tables);
+
+pcre2_compile_context_free(compile_context);
+pcre2_match_context_free(match_context);
+pcre2_match_data_free(match_data);
 
 free_pattern_chain(patterns);
 free_pattern_chain(include_patterns);
@@ -3315,11 +3260,11 @@
   free(this);
   }
 
-pcregrep_exit(rc);
+pcre2grep_exit(rc);
 
 EXIT2:
 rc = 2;
 goto EXIT;
 }
 
-/* End of pcregrep */
+/* End of pcre2grep */
diff --git a/dist2/src/pcre2posix.c b/dist2/src/pcre2posix.c
new file mode 100644
index 0000000..1d6e5b7
--- /dev/null
+++ b/dist2/src/pcre2posix.c
@@ -0,0 +1,335 @@
+/*************************************************
+*      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
+     Original API code Copyright (c) 1997-2012 University of Cambridge
+         New API code Copyright (c) 2016 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 is a wrapper that provides a POSIX API to the underlying PCRE2
+functions. */
+
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+
+/* Ensure that the PCRE2POSIX_EXP_xxx macros are set appropriately for
+compiling these functions. This must come before including pcre2posix.h, where
+they are set for an application (using these functions) if they have not
+previously been set. */
+
+#if defined(_WIN32) && !defined(PCRE2_STATIC)
+#  define PCRE2POSIX_EXP_DECL extern __declspec(dllexport)
+#  define PCRE2POSIX_EXP_DEFN __declspec(dllexport)
+#endif
+
+/* We include pcre2.h before pcre2_internal.h so that the PCRE2 library
+functions are declared as "import" for Windows by defining PCRE2_EXP_DECL as
+"import". This is needed even though pcre2_internal.h itself includes pcre2.h,
+because it does so after it has set PCRE2_EXP_DECL to "export" if it is not
+already set. */
+
+#include "pcre2.h"
+#include "pcre2_internal.h"
+#include "pcre2posix.h"
+
+/* Table to translate PCRE2 compile time error codes into POSIX error codes.
+Only a few PCRE2 errors with a value greater than 23 turn into special POSIX
+codes: most go to REG_BADPAT. The second table lists, in pairs, those that
+don't. */
+
+static const int eint1[] = {
+  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 */
+  /* 5 */
+  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 */
+  /* 10 */
+  REG_ASSERT,  /* internal error: unexpected repeat */
+  REG_BADPAT,  /* unrecognized character after (? or (?- */
+  REG_BADPAT,  /* POSIX named classes are supported only within a class */
+  REG_BADPAT,  /* POSIX collating elements are not supported */
+  REG_EPAREN,  /* missing ) */
+  /* 15 */
+  REG_ESUBREG, /* reference to non-existent subpattern */
+  REG_INVARG,  /* pattern passed as NULL */
+  REG_INVARG,  /* unknown compile-time option bit(s) */
+  REG_EPAREN,  /* missing ) after (?# comment */
+  REG_ESIZE,   /* parentheses nested too deeply */
+  /* 20 */
+  REG_ESIZE,   /* regular expression too large */
+  REG_ESPACE,  /* failed to get memory */
+  REG_EPAREN,  /* unmatched closing parenthesis */
+  REG_ASSERT   /* internal error: code overflow */
+  };
+
+static const int eint2[] = {
+  30, REG_ECTYPE,  /* unknown POSIX class name */
+  32, REG_INVARG,  /* this version of PCRE2 does not have Unicode support */
+  37, REG_EESCAPE, /* PCRE2 does not support \L, \l, \N{name}, \U, or \u */
+  56, REG_INVARG,  /* internal error: unknown newline setting */
+};
+
+/* Table of texts corresponding to POSIX error codes */
+
+static const char *const pstring[] = {
+  "",                                /* Dummy for value 0 */
+  "internal error",                  /* REG_ASSERT */
+  "invalid repeat counts in {}",     /* BADBR      */
+  "pattern error",                   /* BADPAT     */
+  "? * + invalid",                   /* BADRPT     */
+  "unbalanced {}",                   /* EBRACE     */
+  "unbalanced []",                   /* EBRACK     */
+  "collation error - not relevant",  /* ECOLLATE   */
+  "bad class",                       /* ECTYPE     */
+  "bad escape sequence",             /* EESCAPE    */
+  "empty expression",                /* EMPTY      */
+  "unbalanced ()",                   /* EPAREN     */
+  "bad range inside []",             /* ERANGE     */
+  "expression too big",              /* ESIZE      */
+  "failed to get memory",            /* ESPACE     */
+  "bad back reference",              /* ESUBREG    */
+  "bad argument",                    /* INVARG     */
+  "match failed"                     /* NOMATCH    */
+};
+
+
+
+
+/*************************************************
+*          Translate error code to string        *
+*************************************************/
+
+PCRE2POSIX_EXP_DEFN size_t PCRE2_CALL_CONVENTION
+regerror(int errcode, const regex_t *preg, char *errbuf, size_t errbuf_size)
+{
+int used;
+const char *message;
+
+message = (errcode <= 0 || errcode >= (int)(sizeof(pstring)/sizeof(char *)))?
+  "unknown error code" : pstring[errcode];
+
+if (preg != NULL && (int)preg->re_erroffset != -1)
+  {
+  used = snprintf(errbuf, errbuf_size, "%s at offset %-6d", message,
+    (int)preg->re_erroffset);
+  }
+else
+  {
+  used = snprintf(errbuf, errbuf_size, "%s", message);
+  }
+
+return used + 1;
+}
+
+
+
+
+/*************************************************
+*           Free store held by a regex           *
+*************************************************/
+
+PCRE2POSIX_EXP_DEFN void PCRE2_CALL_CONVENTION
+regfree(regex_t *preg)
+{
+pcre2_match_data_free(preg->re_match_data);
+pcre2_code_free(preg->re_pcre2_code);
+}
+
+
+
+
+/*************************************************
+*            Compile a regular expression        *
+*************************************************/
+
+/*
+Arguments:
+  preg        points to a structure for recording the compiled expression
+  pattern     the pattern to compile
+  cflags      compilation flags
+
+Returns:      0 on success
+              various non-zero codes on failure
+*/
+
+PCRE2POSIX_EXP_DEFN int PCRE2_CALL_CONVENTION
+regcomp(regex_t *preg, const char *pattern, int cflags)
+{
+PCRE2_SIZE erroffset;
+int errorcode;
+int options = 0;
+int re_nsub = 0;
+
+if ((cflags & REG_ICASE) != 0)    options |= PCRE2_CASELESS;
+if ((cflags & REG_NEWLINE) != 0)  options |= PCRE2_MULTILINE;
+if ((cflags & REG_DOTALL) != 0)   options |= PCRE2_DOTALL;
+if ((cflags & REG_NOSUB) != 0)    options |= PCRE2_NO_AUTO_CAPTURE;
+if ((cflags & REG_UTF) != 0)      options |= PCRE2_UTF;
+if ((cflags & REG_UCP) != 0)      options |= PCRE2_UCP;
+if ((cflags & REG_UNGREEDY) != 0) options |= PCRE2_UNGREEDY;
+
+preg->re_pcre2_code = pcre2_compile((PCRE2_SPTR)pattern, PCRE2_ZERO_TERMINATED,
+   options, &errorcode, &erroffset, NULL);
+preg->re_erroffset = erroffset;
+
+if (preg->re_pcre2_code == NULL)
+  {
+  unsigned int i;
+
+  /* A negative value is a UTF error; otherwise all error codes are greater
+  than COMPILE_ERROR_BASE, but check, just in case. */
+
+  if (errorcode < COMPILE_ERROR_BASE) return REG_BADPAT;
+  errorcode -= COMPILE_ERROR_BASE;
+
+  if (errorcode < (int)(sizeof(eint1)/sizeof(const int)))
+    return eint1[errorcode];
+  for (i = 0; i < sizeof(eint2)/(2*sizeof(const int)); i += 2)
+    if (errorcode == eint2[i]) return eint2[i+1];
+  return REG_BADPAT;
+  }
+
+(void)pcre2_pattern_info((const pcre2_code *)preg->re_pcre2_code,
+  PCRE2_INFO_CAPTURECOUNT, &re_nsub);
+preg->re_nsub = (size_t)re_nsub;
+if ((options & PCRE2_NO_AUTO_CAPTURE) != 0) re_nsub = -1;
+preg->re_match_data = pcre2_match_data_create(re_nsub + 1, NULL);
+
+if (preg->re_match_data == NULL)
+  {
+  pcre2_code_free(preg->re_pcre2_code);
+  return REG_ESPACE;
+  }
+
+return 0;
+}
+
+
+
+/*************************************************
+*              Match a regular expression        *
+*************************************************/
+
+/* A suitable match_data block, large enough to hold all possible captures, was
+obtained when the pattern was compiled, to save having to allocate and free it
+for each match. If REG_NOSUB was specified at compile time, the
+PCRE_NO_AUTO_CAPTURE flag will be set. When this is the case, the nmatch and
+pmatch arguments are ignored, and the only result is yes/no/error. */
+
+PCRE2POSIX_EXP_DEFN int PCRE2_CALL_CONVENTION
+regexec(const regex_t *preg, const char *string, size_t nmatch,
+  regmatch_t pmatch[], int eflags)
+{
+int rc, so, eo;
+int options = 0;
+pcre2_match_data *md = (pcre2_match_data *)preg->re_match_data;
+
+if ((eflags & REG_NOTBOL) != 0) options |= PCRE2_NOTBOL;
+if ((eflags & REG_NOTEOL) != 0) options |= PCRE2_NOTEOL;
+if ((eflags & REG_NOTEMPTY) != 0) options |= PCRE2_NOTEMPTY;
+
+((regex_t *)preg)->re_erroffset = (size_t)(-1);  /* Only has meaning after compile */
+
+/* When no string data is being returned, or no vector has been passed in which
+to put it, ensure that nmatch is zero. */
+
+if ((((pcre2_real_code *)(preg->re_pcre2_code))->compile_options &
+  PCRE2_NO_AUTO_CAPTURE) != 0 || pmatch == NULL) nmatch = 0;
+
+/* REG_STARTEND is a BSD extension, to allow for non-NUL-terminated strings.
+The man page from OS X says "REG_STARTEND affects only the location of the
+string, not how it is matched". That is why the "so" value is used to bump the
+start location rather than being passed as a PCRE2 "starting offset". */
+
+if ((eflags & REG_STARTEND) != 0)
+  {
+  if (pmatch == NULL) return REG_INVARG;
+  so = pmatch[0].rm_so;
+  eo = pmatch[0].rm_eo;
+  }
+else
+  {
+  so = 0;
+  eo = (int)strlen(string);
+  }
+
+rc = pcre2_match((const pcre2_code *)preg->re_pcre2_code,
+  (PCRE2_SPTR)string + so, (eo - so), 0, options, md, NULL);
+
+/* Successful match */
+
+if (rc >= 0)
+  {
+  size_t i;
+  if ((size_t)rc > nmatch) rc = (int)nmatch;
+  for (i = 0; i < (size_t)rc; i++)
+    {
+    pmatch[i].rm_so = md->ovector[i*2];
+    pmatch[i].rm_eo = md->ovector[i*2+1];
+    }
+  for (; i < nmatch; i++) pmatch[i].rm_so = pmatch[i].rm_eo = -1;
+  return 0;
+  }
+
+/* Unsuccessful match */
+
+if (rc <= PCRE2_ERROR_UTF8_ERR1 && rc >= PCRE2_ERROR_UTF8_ERR21)
+  return REG_INVARG;
+
+switch(rc)
+  {
+  default: return REG_ASSERT;
+  case PCRE2_ERROR_BADMODE: return REG_INVARG;
+  case PCRE2_ERROR_BADMAGIC: return REG_INVARG;
+  case PCRE2_ERROR_BADOPTION: return REG_INVARG;
+  case PCRE2_ERROR_BADUTFOFFSET: return REG_INVARG;
+  case PCRE2_ERROR_MATCHLIMIT: return REG_ESPACE;
+  case PCRE2_ERROR_NOMATCH: return REG_NOMATCH;
+  case PCRE2_ERROR_NOMEMORY: return REG_ESPACE;
+  case PCRE2_ERROR_NULL: return REG_INVARG;
+  }
+}
+
+/* End of pcre2posix.c */
diff --git a/dist2/src/pcre2posix.h b/dist2/src/pcre2posix.h
new file mode 100644
index 0000000..44a2fd8
--- /dev/null
+++ b/dist2/src/pcre2posix.h
@@ -0,0 +1,146 @@
+/*************************************************
+*      Perl-Compatible Regular Expressions       *
+*************************************************/
+
+/* PCRE2 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
+     Original API code Copyright (c) 1997-2012 University of Cambridge
+         New API code Copyright (c) 2016 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. */
+
+#include <stdlib.h>
+
+/* Allow for C++ users */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Options, mostly defined by POSIX, but with some extras. */
+
+#define REG_ICASE     0x0001  /* Maps to PCRE2_CASELESS */
+#define REG_NEWLINE   0x0002  /* Maps to PCRE2_MULTILINE */
+#define REG_NOTBOL    0x0004  /* Maps to PCRE2_NOTBOL */
+#define REG_NOTEOL    0x0008  /* Maps to PCRE2_NOTEOL */
+#define REG_DOTALL    0x0010  /* NOT defined by POSIX; maps to PCRE2_DOTALL */
+#define REG_NOSUB     0x0020  /* Maps to PCRE2_NO_AUTO_CAPTURE */
+#define REG_UTF       0x0040  /* NOT defined by POSIX; maps to PCRE2_UTF */
+#define REG_STARTEND  0x0080  /* BSD feature: pass subject string by so,eo */
+#define REG_NOTEMPTY  0x0100  /* NOT defined by POSIX; maps to PCRE2_NOTEMPTY */
+#define REG_UNGREEDY  0x0200  /* NOT defined by POSIX; maps to PCRE2_UNGREEDY */
+#define REG_UCP       0x0400  /* NOT defined by POSIX; maps to PCRE2_UCP */
+
+/* This is not used by PCRE2, but by defining it we make it easier
+to slot PCRE2 into existing programs that make POSIX calls. */
+
+#define REG_EXTENDED  0
+
+/* Error values. Not all these are relevant or used by the wrapper. */
+
+enum {
+  REG_ASSERT = 1,  /* internal error ? */
+  REG_BADBR,       /* invalid repeat counts in {} */
+  REG_BADPAT,      /* pattern error */
+  REG_BADRPT,      /* ? * + invalid */
+  REG_EBRACE,      /* unbalanced {} */
+  REG_EBRACK,      /* unbalanced [] */
+  REG_ECOLLATE,    /* collation error - not relevant */
+  REG_ECTYPE,      /* bad class */
+  REG_EESCAPE,     /* bad escape sequence */
+  REG_EMPTY,       /* empty expression */
+  REG_EPAREN,      /* unbalanced () */
+  REG_ERANGE,      /* bad range inside [] */
+  REG_ESIZE,       /* expression too big */
+  REG_ESPACE,      /* failed to get memory */
+  REG_ESUBREG,     /* bad back reference */
+  REG_INVARG,      /* bad argument */
+  REG_NOMATCH      /* match failed */
+};
+
+
+/* The structure representing a compiled regular expression. */
+
+typedef struct {
+  void *re_pcre2_code;
+  void *re_match_data;
+  size_t re_nsub;
+  size_t re_erroffset;
+} regex_t;
+
+/* The structure in which a captured offset is returned. */
+
+typedef int regoff_t;
+
+typedef struct {
+  regoff_t rm_so;
+  regoff_t rm_eo;
+} regmatch_t;
+
+/* When an application links to a PCRE2 DLL in Windows, the symbols that are
+imported have to be identified as such. When building PCRE2, the appropriate
+export settings are needed, and are set in pcre2posix.c before including this
+file. */
+
+#if defined(_WIN32) && !defined(PCRE2_STATIC) && !defined(PCRE2POSIX_EXP_DECL)
+#  define PCRE2POSIX_EXP_DECL  extern __declspec(dllimport)
+#  define PCRE2POSIX_EXP_DEFN  __declspec(dllimport)
+#endif
+
+/* By default, we use the standard "extern" declarations. */
+
+#ifndef PCRE2POSIX_EXP_DECL
+#  ifdef __cplusplus
+#    define PCRE2POSIX_EXP_DECL  extern "C"
+#    define PCRE2POSIX_EXP_DEFN  extern "C"
+#  else
+#    define PCRE2POSIX_EXP_DECL  extern
+#    define PCRE2POSIX_EXP_DEFN  extern
+#  endif
+#endif
+
+/* The functions */
+
+PCRE2POSIX_EXP_DECL int regcomp(regex_t *, const char *, int);
+PCRE2POSIX_EXP_DECL int regexec(const regex_t *, const char *, size_t,
+                     regmatch_t *, int);
+PCRE2POSIX_EXP_DECL size_t regerror(int, const regex_t *, char *, size_t);
+PCRE2POSIX_EXP_DECL void regfree(regex_t *);
+
+#ifdef __cplusplus
+}   /* extern "C" */
+#endif
+
+/* End of pcre2posix.h */
diff --git a/dist2/src/pcre2test.c b/dist2/src/pcre2test.c
new file mode 100644
index 0000000..0a5879e
--- /dev/null
+++ b/dist2/src/pcre2test.c
@@ -0,0 +1,7426 @@
+/*************************************************
+*             PCRE2 testing program              *
+*************************************************/
+
+/* PCRE2 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. In 2014
+the API was completely revised and '2' was added to the name, because the old
+API, which had lasted for 16 years, could not accommodate new requirements. At
+the same time, this testing program was re-designed because its original
+hacked-up (non-) design had also run out of steam.
+
+                       Written by Philip Hazel
+     Original code Copyright (c) 1997-2012 University of Cambridge
+         Rewritten code Copyright (c) 2016 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 program supports testing of the 8-bit, 16-bit, and 32-bit PCRE2
+libraries in a single program, though its input and output are always 8-bit.
+It is different from modules such as pcre2_compile.c in the library itself,
+which are compiled separately for each code unit width. If two widths are
+enabled, for example, pcre2_compile.c is compiled twice. In contrast,
+pcre2test.c is compiled only once, and linked with all the enabled libraries.
+Therefore, it must not make use of any of the macros from pcre2.h or
+pcre2_internal.h that depend on PCRE2_CODE_UNIT_WIDTH. It does, however, make
+use of SUPPORT_PCRE2_8, SUPPORT_PCRE2_16, and SUPPORT_PCRE2_32, to ensure that
+it references only the enabled library functions. */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <ctype.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <time.h>
+#include <locale.h>
+#include <errno.h>
+
+#if defined NATIVE_ZOS
+#include "pcrzoscs.h"
+/* That header is not included in the main PCRE2 distribution because other
+apparatus is needed to compile pcre2test for z/OS. The header can be found in
+the special z/OS distribution, which is available from www.zaconsultants.net or
+from www.cbttape.org. */
+#endif
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+/* Both libreadline and libedit are optionally supported. The user-supplied
+original patch uses readline/readline.h for libedit, but in at least one system
+it is installed as editline/readline.h, so the configuration code now looks for
+that first, falling back to readline/readline.h. */
+
+#if defined(SUPPORT_LIBREADLINE) || defined(SUPPORT_LIBEDIT)
+#if defined(SUPPORT_LIBREADLINE)
+#include <readline/readline.h>
+#include <readline/history.h>
+#else
+#if defined(HAVE_EDITLINE_READLINE_H)
+#include <editline/readline.h>
+#else
+#include <readline/readline.h>
+#endif
+#endif
+#endif
+
+/* Put the test for interactive input into a macro so that it can be changed if
+required for different environments. */
+
+#define INTERACTIVE(f) isatty(fileno(f))
+
+
+/* ---------------------- System-specific definitions ---------------------- */
+
+/* A number of things vary for Windows builds. Originally, pcretest opened its
+input and output without "b"; then I was told that "b" was needed in some
+environments, so it was added for release 5.0 to both the input and output. (It
+makes no difference on Unix-like systems.) Later I was told that it is wrong
+for the input on Windows. I've now abstracted the modes into macros that are
+set here, to make it easier to fiddle with them, and removed "b" from the input
+mode under Windows. The BINARY versions are used when saving/restoring compiled
+patterns. */
+
+#if defined(_WIN32) || defined(WIN32)
+#include <io.h>                /* For _setmode() */
+#include <fcntl.h>             /* For _O_BINARY */
+#define INPUT_MODE          "r"
+#define OUTPUT_MODE         "wb"
+#define BINARY_INPUT_MODE   "rb"
+#define BINARY_OUTPUT_MODE  "wb"
+
+#ifndef isatty
+#define isatty _isatty         /* This is what Windows calls them, I'm told, */
+#endif                         /* though in some environments they seem to   */
+                               /* be already defined, hence the #ifndefs.    */
+#ifndef fileno
+#define fileno _fileno
+#endif
+
+/* A user sent this fix for Borland Builder 5 under Windows. */
+
+#ifdef __BORLANDC__
+#define _setmode(handle, mode) setmode(handle, mode)
+#endif
+
+/* Not Windows */
+
+#else
+#include <sys/time.h>          /* These two includes are needed */
+#include <sys/resource.h>      /* for setrlimit(). */
+#if defined NATIVE_ZOS         /* z/OS uses non-binary I/O */
+#define INPUT_MODE   "r"
+#define OUTPUT_MODE  "w"
+#define BINARY_INPUT_MODE   "rb"
+#define BINARY_OUTPUT_MODE  "wb"
+#else
+#define INPUT_MODE          "rb"
+#define OUTPUT_MODE         "wb"
+#define BINARY_INPUT_MODE   "rb"
+#define BINARY_OUTPUT_MODE  "wb"
+#endif
+#endif
+
+#ifdef __VMS
+#include <ssdef.h>
+void vms_setsymbol( char *, char *, int );
+#endif
+
+/* ------------------End of system-specific definitions -------------------- */
+
+/* Glueing macros that are used in several places below. */
+
+#define glue(a,b) a##b
+#define G(a,b) glue(a,b)
+
+/* Miscellaneous parameters and manifests */
+
+#ifndef CLOCKS_PER_SEC
+#ifdef CLK_TCK
+#define CLOCKS_PER_SEC CLK_TCK
+#else
+#define CLOCKS_PER_SEC 100
+#endif
+#endif
+
+#define CFAIL_UNSET UINT32_MAX  /* Unset value for cfail fields */
+#define DFA_WS_DIMENSION 1000   /* Size of DFA workspace */
+#define DEFAULT_OVECCOUNT 15    /* Default ovector count */
+#define JUNK_OFFSET 0xdeadbeef  /* For initializing ovector */
+#define LOCALESIZE 32           /* Size of locale name */
+#define LOOPREPEAT 500000       /* Default loop count for timing */
+#define PATSTACKSIZE 20         /* Pattern stack for save/restore testing */
+#define REPLACE_MODSIZE 100     /* Field for reading 8-bit replacement */
+#define VERSION_SIZE 64         /* Size of buffer for the version strings */
+
+/* Make sure the buffer into which replacement strings are copied is big enough
+to hold them as 32-bit code units. */
+
+#define REPLACE_BUFFSIZE 1024   /* This is a byte value */
+
+/* Execution modes */
+
+#define PCRE8_MODE   8
+#define PCRE16_MODE 16
+#define PCRE32_MODE 32
+
+/* Processing returns */
+
+enum { PR_OK, PR_SKIP, PR_ABEND };
+
+/* The macro PRINTABLE determines whether to print an output character as-is or
+as a hex value when showing compiled patterns. is We use it in cases when the
+locale has not been explicitly changed, so as to get consistent output from
+systems that differ in their output from isprint() even in the "C" locale. */
+
+#ifdef EBCDIC
+#define PRINTABLE(c) ((c) >= 64 && (c) < 255)
+#else
+#define PRINTABLE(c) ((c) >= 32 && (c) < 127)
+#endif
+
+#define PRINTOK(c) ((locale_tables != NULL)? isprint(c) : PRINTABLE(c))
+
+/* We have to include some of the library source files because we need
+to use some of the macros, internal structure definitions, and other internal
+values - pcre2test has "inside information" compared to an application program
+that strictly follows the PCRE2 API.
+
+Before including pcre2_internal.h we define PRIV so that it does not get
+defined therein. This ensures that PRIV names in the included files do not
+clash with those in the libraries. Also, although pcre2_internal.h does itself
+include pcre2.h, we explicitly include it beforehand, along with pcre2posix.h,
+so that the PCRE2_EXP_xxx macros get set appropriately for an application, not
+for building the library. */
+
+#define PRIV(name) name
+#define PCRE2_CODE_UNIT_WIDTH 0
+#include "pcre2.h"
+#include "pcre2posix.h"
+#include "pcre2_internal.h"
+
+/* We need access to some of the data tables that PCRE2 uses. Defining
+PCRE2_PCRETEST makes some minor changes in the files. The previous definition
+of PRIV avoids name clashes. */
+
+#define PCRE2_PCRE2TEST
+#include "pcre2_tables.c"
+#include "pcre2_ucd.c"
+
+/* 32-bit integer values in the input are read by strtoul() or strtol(). The
+check needed for overflow depends on whether long ints are in fact longer than
+ints. They are defined not to be shorter. */
+
+#if ULONG_MAX > UINT32_MAX
+#define U32OVERFLOW(x) (x > UINT32_MAX)
+#else
+#define U32OVERFLOW(x) (x == UINT32_MAX)
+#endif
+
+#if LONG_MAX > INT32_MAX
+#define S32OVERFLOW(x) (x > INT32_MAX || x < INT32_MIN)
+#else
+#define S32OVERFLOW(x) (x == INT32_MAX || x == INT32_MIN)
+#endif
+
+/* When PCRE2_CODE_UNIT_WIDTH is zero, pcre2_internal.h does not include
+pcre2_intmodedep.h, which is where mode-dependent macros and structures are
+defined. We can now include it for each supported code unit width. Because
+PCRE2_CODE_UNIT_WIDTH was defined as zero before including pcre2.h, it will
+have left PCRE2_SUFFIX defined as a no-op. We must re-define it appropriately
+while including these files, and then restore it to a no-op. Because LINK_SIZE
+may be changed in 16-bit mode and forced to 1 in 32-bit mode, the order of
+these inclusions should not be changed. */
+
+#undef PCRE2_SUFFIX
+#undef PCRE2_CODE_UNIT_WIDTH
+
+#ifdef   SUPPORT_PCRE2_8
+#define  PCRE2_CODE_UNIT_WIDTH 8
+#define  PCRE2_SUFFIX(a) G(a,8)
+#include "pcre2_intmodedep.h"
+#include "pcre2_printint.c"
+#undef   PCRE2_CODE_UNIT_WIDTH
+#undef   PCRE2_SUFFIX
+#endif   /* SUPPORT_PCRE2_8 */
+
+#ifdef   SUPPORT_PCRE2_16
+#define  PCRE2_CODE_UNIT_WIDTH 16
+#define  PCRE2_SUFFIX(a) G(a,16)
+#include "pcre2_intmodedep.h"
+#include "pcre2_printint.c"
+#undef   PCRE2_CODE_UNIT_WIDTH
+#undef   PCRE2_SUFFIX
+#endif   /* SUPPORT_PCRE2_16 */
+
+#ifdef   SUPPORT_PCRE2_32
+#define  PCRE2_CODE_UNIT_WIDTH 32
+#define  PCRE2_SUFFIX(a) G(a,32)
+#include "pcre2_intmodedep.h"
+#include "pcre2_printint.c"
+#undef   PCRE2_CODE_UNIT_WIDTH
+#undef   PCRE2_SUFFIX
+#endif   /* SUPPORT_PCRE2_32 */
+
+#define PCRE2_SUFFIX(a) a
+
+/* We need to be able to check input text for UTF-8 validity, whatever code
+widths are actually available, because the input to pcre2test is always in
+8-bit code units. So we include the UTF validity checking function for 8-bit
+code units. */
+
+extern int valid_utf(PCRE2_SPTR8, PCRE2_SIZE, PCRE2_SIZE *);
+
+#define  PCRE2_CODE_UNIT_WIDTH 8
+#undef   PCRE2_SPTR
+#define  PCRE2_SPTR PCRE2_SPTR8
+#include "pcre2_valid_utf.c"
+#undef   PCRE2_CODE_UNIT_WIDTH
+#undef   PCRE2_SPTR
+
+/* If we have 8-bit support, default to it; if there is also 16-or 32-bit
+support, it can be selected by a command-line option. If there is no 8-bit
+support, there must be 16- or 32-bit support, so default to one of them. The
+config function, JIT stack, contexts, and version string are the same in all
+modes, so use the form of the first that is available. */
+
+#if defined SUPPORT_PCRE2_8
+#define DEFAULT_TEST_MODE PCRE8_MODE
+#define VERSION_TYPE PCRE2_UCHAR8
+#define PCRE2_CONFIG pcre2_config_8
+#define PCRE2_JIT_STACK pcre2_jit_stack_8
+#define PCRE2_REAL_GENERAL_CONTEXT pcre2_real_general_context_8
+#define PCRE2_REAL_COMPILE_CONTEXT pcre2_real_compile_context_8
+#define PCRE2_REAL_MATCH_CONTEXT pcre2_real_match_context_8
+#define VERSION_TYPE PCRE2_UCHAR8
+
+#elif defined SUPPORT_PCRE2_16
+#define DEFAULT_TEST_MODE PCRE16_MODE
+#define VERSION_TYPE PCRE2_UCHAR16
+#define PCRE2_CONFIG pcre2_config_16
+#define PCRE2_JIT_STACK pcre2_jit_stack_16
+#define PCRE2_REAL_GENERAL_CONTEXT pcre2_real_general_context_16
+#define PCRE2_REAL_COMPILE_CONTEXT pcre2_real_compile_context_16
+#define PCRE2_REAL_MATCH_CONTEXT pcre2_real_match_context_16
+
+#elif defined SUPPORT_PCRE2_32
+#define DEFAULT_TEST_MODE PCRE32_MODE
+#define VERSION_TYPE PCRE2_UCHAR32
+#define PCRE2_CONFIG pcre2_config_32
+#define PCRE2_JIT_STACK pcre2_jit_stack_32
+#define PCRE2_REAL_GENERAL_CONTEXT pcre2_real_general_context_32
+#define PCRE2_REAL_COMPILE_CONTEXT pcre2_real_compile_context_32
+#define PCRE2_REAL_MATCH_CONTEXT pcre2_real_match_context_32
+#endif
+
+/* ------------- Structure and table for handling #-commands ------------- */
+
+typedef struct cmdstruct {
+  const char *name;
+  int  value;
+} cmdstruct;
+
+enum { CMD_FORBID_UTF, CMD_LOAD, CMD_NEWLINE_DEFAULT, CMD_PATTERN,
+  CMD_PERLTEST, CMD_POP, CMD_SAVE, CMD_SUBJECT, CMD_UNKNOWN };
+
+static cmdstruct cmdlist[] = {
+  { "forbid_utf",      CMD_FORBID_UTF },
+  { "load",            CMD_LOAD },
+  { "newline_default", CMD_NEWLINE_DEFAULT },
+  { "pattern",         CMD_PATTERN },
+  { "perltest",        CMD_PERLTEST },
+  { "pop",             CMD_POP },
+  { "save",            CMD_SAVE },
+  { "subject",         CMD_SUBJECT }};
+
+#define cmdlistcount sizeof(cmdlist)/sizeof(cmdstruct)
+
+/* ------------- Structures and tables for handling modifiers -------------- */
+
+/* Table of names for newline types. Must be kept in step with the definitions
+of PCRE2_NEWLINE_xx in pcre2.h. */
+
+static const char *newlines[] = {
+  "DEFAULT", "CR", "LF", "CRLF", "ANY", "ANYCRLF" };
+
+/* Modifier types and applicability */
+
+enum { MOD_CTC,    /* Applies to a compile context */
+       MOD_CTM,    /* Applies to a match context */
+       MOD_PAT,    /* Applies to a pattern */
+       MOD_PATP,   /* Ditto, OK for Perl test */
+       MOD_DAT,    /* Applies to a data line */
+       MOD_PD,     /* Applies to a pattern or a data line */
+       MOD_PDP,    /* As MOD_PD, OK for Perl test */
+       MOD_PND,    /* As MOD_PD, but not for a default pattern */
+       MOD_PNDP,   /* As MOD_PND, OK for Perl test */
+       MOD_CTL,    /* Is a control bit */
+       MOD_BSR,    /* Is a BSR value */
+       MOD_IN2,    /* Is one or two unsigned integers */
+       MOD_INS,    /* Is a signed integer */
+       MOD_INT,    /* Is an unsigned integer */
+       MOD_IND,    /* Is an unsigned integer, but no value => default */
+       MOD_NL,     /* Is a newline value */
+       MOD_NN,     /* Is a number or a name; more than one may occur */
+       MOD_OPT,    /* Is an option bit */
+       MOD_SIZ,    /* Is a PCRE2_SIZE value */
+       MOD_STR };  /* Is a string */
+
+/* Control bits. Some apply to compiling, some to matching, but some can be set
+either on a pattern or a data line, so they must all be distinct. There are now
+so many of them that they are split into two fields. */
+
+#define CTL_AFTERTEXT                    0x00000001u
+#define CTL_ALLAFTERTEXT                 0x00000002u
+#define CTL_ALLCAPTURES                  0x00000004u
+#define CTL_ALLUSEDTEXT                  0x00000008u
+#define CTL_ALTGLOBAL                    0x00000010u
+#define CTL_BINCODE                      0x00000020u
+#define CTL_CALLOUT_CAPTURE              0x00000040u
+#define CTL_CALLOUT_INFO                 0x00000080u
+#define CTL_CALLOUT_NONE                 0x00000100u
+#define CTL_DFA                          0x00000200u
+#define CTL_EXPAND                       0x00000400u
+#define CTL_FINDLIMITS                   0x00000800u
+#define CTL_FULLBINCODE                  0x00001000u
+#define CTL_GETALL                       0x00002000u
+#define CTL_GLOBAL                       0x00004000u
+#define CTL_HEXPAT                       0x00008000u
+#define CTL_INFO                         0x00010000u
+#define CTL_JITFAST                      0x00020000u
+#define CTL_JITVERIFY                    0x00040000u
+#define CTL_MARK                         0x00080000u
+#define CTL_MEMORY                       0x00100000u
+#define CTL_NULLCONTEXT                  0x00200000u
+#define CTL_POSIX                        0x00400000u
+#define CTL_PUSH                         0x00800000u
+#define CTL_STARTCHAR                    0x01000000u
+#define CTL_ZERO_TERMINATE               0x02000000u
+/* Spare                                 0x04000000u  */
+/* Spare                                 0x08000000u  */
+/* Spare                                 0x10000000u  */
+/* Spare                                 0x20000000u  */
+#define CTL_NL_SET                       0x40000000u  /* Informational */
+#define CTL_BSR_SET                      0x80000000u  /* Informational */
+
+/* Second control word */
+
+#define CTL2_SUBSTITUTE_EXTENDED         0x00000001u
+#define CTL2_SUBSTITUTE_OVERFLOW_LENGTH  0x00000002u
+#define CTL2_SUBSTITUTE_UNKNOWN_UNSET    0x00000004u
+#define CTL2_SUBSTITUTE_UNSET_EMPTY      0x00000008u
+
+/* Combinations */
+
+#define CTL_DEBUG            (CTL_FULLBINCODE|CTL_INFO)  /* For setting */
+#define CTL_ANYINFO          (CTL_DEBUG|CTL_BINCODE|CTL_CALLOUT_INFO)
+#define CTL_ANYGLOB          (CTL_ALTGLOBAL|CTL_GLOBAL)
+
+/* These are all the controls that may be set either on a pattern or on a
+data line. */
+
+#define CTL_ALLPD  (CTL_AFTERTEXT|\
+                    CTL_ALLAFTERTEXT|\
+                    CTL_ALLCAPTURES|\
+                    CTL_ALLUSEDTEXT|\
+                    CTL_ALTGLOBAL|\
+                    CTL_GLOBAL|\
+                    CTL_MARK|\
+                    CTL_MEMORY|\
+                    CTL_STARTCHAR)
+
+#define CTL2_ALLPD (CTL2_SUBSTITUTE_EXTENDED|\
+                    CTL2_SUBSTITUTE_OVERFLOW_LENGTH|\
+                    CTL2_SUBSTITUTE_UNKNOWN_UNSET|\
+                    CTL2_SUBSTITUTE_UNSET_EMPTY)
+
+/* Structures for holding modifier information for patterns and subject strings
+(data). Fields containing modifiers that can be set either for a pattern or a
+subject must be at the start and in the same order in both cases so that the
+same offset in the big table below works for both. */
+
+typedef struct patctl {    /* Structure for pattern modifiers. */
+  uint32_t  options;       /* Must be in same position as datctl */
+  uint32_t  control;       /* Must be in same position as datctl */
+  uint32_t  control2;      /* Must be in same position as datctl */
+   uint8_t  replacement[REPLACE_MODSIZE];  /* So must this */
+  uint32_t  jit;
+  uint32_t  stackguard_test;
+  uint32_t  tables_id;
+  uint32_t  regerror_buffsize;
+   uint8_t  locale[LOCALESIZE];
+} patctl;
+
+#define MAXCPYGET 10
+#define LENCPYGET 64
+
+typedef struct datctl {    /* Structure for data line modifiers. */
+  uint32_t  options;       /* Must be in same position as patctl */
+  uint32_t  control;       /* Must be in same position as patctl */
+  uint32_t  control2;      /* Must be in same position as patctl */
+   uint8_t  replacement[REPLACE_MODSIZE];  /* So must this */
+  uint32_t  cfail[2];
+   int32_t  callout_data;
+   int32_t  copy_numbers[MAXCPYGET];
+   int32_t  get_numbers[MAXCPYGET];
+  uint32_t  jitstack;
+  uint32_t  oveccount;
+  uint32_t  offset;
+  uint8_t   copy_names[LENCPYGET];
+  uint8_t   get_names[LENCPYGET];
+} datctl;
+
+/* Ids for which context to modify. */
+
+enum { CTX_PAT,            /* Active pattern context */
+       CTX_POPPAT,         /* Ditto, for a popped pattern */
+       CTX_DEFPAT,         /* Default pattern context */
+       CTX_DAT,            /* Active data (match) context */
+       CTX_DEFDAT };       /* Default data (match) context */
+
+/* Macros to simplify the big table below. */
+
+#define CO(name) offsetof(PCRE2_REAL_COMPILE_CONTEXT, name)
+#define MO(name) offsetof(PCRE2_REAL_MATCH_CONTEXT, name)
+#define PO(name) offsetof(patctl, name)
+#define PD(name) PO(name)
+#define DO(name) offsetof(datctl, name)
+
+/* Table of all long-form modifiers. Must be in collating sequence of modifier
+name because it is searched by binary chop. */
+
+typedef struct modstruct {
+  const char   *name;
+  uint16_t      which;
+  uint16_t      type;
+  uint32_t      value;
+  PCRE2_SIZE    offset;
+} modstruct;
+
+static modstruct modlist[] = {
+  { "aftertext",                  MOD_PNDP, MOD_CTL, CTL_AFTERTEXT,              PO(control) },
+  { "allaftertext",               MOD_PNDP, MOD_CTL, CTL_ALLAFTERTEXT,           PO(control) },
+  { "allcaptures",                MOD_PND,  MOD_CTL, CTL_ALLCAPTURES,            PO(control) },
+  { "allow_empty_class",          MOD_PAT,  MOD_OPT, PCRE2_ALLOW_EMPTY_CLASS,    PO(options) },
+  { "allusedtext",                MOD_PNDP, MOD_CTL, CTL_ALLUSEDTEXT,            PO(control) },
+  { "alt_bsux",                   MOD_PAT,  MOD_OPT, PCRE2_ALT_BSUX,             PO(options) },
+  { "alt_circumflex",             MOD_PAT,  MOD_OPT, PCRE2_ALT_CIRCUMFLEX,       PO(options) },
+  { "alt_verbnames",              MOD_PAT,  MOD_OPT, PCRE2_ALT_VERBNAMES,        PO(options) },
+  { "altglobal",                  MOD_PND,  MOD_CTL, CTL_ALTGLOBAL,              PO(control) },
+  { "anchored",                   MOD_PD,   MOD_OPT, PCRE2_ANCHORED,             PD(options) },
+  { "auto_callout",               MOD_PAT,  MOD_OPT, PCRE2_AUTO_CALLOUT,         PO(options) },
+  { "bincode",                    MOD_PAT,  MOD_CTL, CTL_BINCODE,                PO(control) },
+  { "bsr",                        MOD_CTC,  MOD_BSR, 0,                          CO(bsr_convention) },
+  { "callout_capture",            MOD_DAT,  MOD_CTL, CTL_CALLOUT_CAPTURE,        DO(control) },
+  { "callout_data",               MOD_DAT,  MOD_INS, 0,                          DO(callout_data) },
+  { "callout_fail",               MOD_DAT,  MOD_IN2, 0,                          DO(cfail) },
+  { "callout_info",               MOD_PAT,  MOD_CTL, CTL_CALLOUT_INFO,           PO(control) },
+  { "callout_none",               MOD_DAT,  MOD_CTL, CTL_CALLOUT_NONE,           DO(control) },
+  { "caseless",                   MOD_PATP, MOD_OPT, PCRE2_CASELESS,             PO(options) },
+  { "copy",                       MOD_DAT,  MOD_NN,  DO(copy_numbers),           DO(copy_names) },
+  { "debug",                      MOD_PAT,  MOD_CTL, CTL_DEBUG,                  PO(control) },
+  { "dfa",                        MOD_DAT,  MOD_CTL, CTL_DFA,                    DO(control) },
+  { "dfa_restart",                MOD_DAT,  MOD_OPT, PCRE2_DFA_RESTART,          DO(options) },
+  { "dfa_shortest",               MOD_DAT,  MOD_OPT, PCRE2_DFA_SHORTEST,         DO(options) },
+  { "dollar_endonly",             MOD_PAT,  MOD_OPT, PCRE2_DOLLAR_ENDONLY,       PO(options) },
+  { "dotall",                     MOD_PATP, MOD_OPT, PCRE2_DOTALL,               PO(options) },
+  { "dupnames",                   MOD_PATP, MOD_OPT, PCRE2_DUPNAMES,             PO(options) },
+  { "expand",                     MOD_PAT,  MOD_CTL, CTL_EXPAND,                 PO(control) },
+  { "extended",                   MOD_PATP, MOD_OPT, PCRE2_EXTENDED,             PO(options) },
+  { "find_limits",                MOD_DAT,  MOD_CTL, CTL_FINDLIMITS,             DO(control) },
+  { "firstline",                  MOD_PAT,  MOD_OPT, PCRE2_FIRSTLINE,            PO(options) },
+  { "fullbincode",                MOD_PAT,  MOD_CTL, CTL_FULLBINCODE,            PO(control) },
+  { "get",                        MOD_DAT,  MOD_NN,  DO(get_numbers),            DO(get_names) },
+  { "getall",                     MOD_DAT,  MOD_CTL, CTL_GETALL,                 DO(control) },
+  { "global",                     MOD_PNDP, MOD_CTL, CTL_GLOBAL,                 PO(control) },
+  { "hex",                        MOD_PAT,  MOD_CTL, CTL_HEXPAT,                 PO(control) },
+  { "info",                       MOD_PAT,  MOD_CTL, CTL_INFO,                   PO(control) },
+  { "jit",                        MOD_PAT,  MOD_IND, 7,                          PO(jit) },
+  { "jitfast",                    MOD_PAT,  MOD_CTL, CTL_JITFAST,                PO(control) },
+  { "jitstack",                   MOD_DAT,  MOD_INT, 0,                          DO(jitstack) },
+  { "jitverify",                  MOD_PAT,  MOD_CTL, CTL_JITVERIFY,              PO(control) },
+  { "locale",                     MOD_PAT,  MOD_STR, LOCALESIZE,                 PO(locale) },
+  { "mark",                       MOD_PNDP, MOD_CTL, CTL_MARK,                   PO(control) },
+  { "match_limit",                MOD_CTM,  MOD_INT, 0,                          MO(match_limit) },
+  { "match_unset_backref",        MOD_PAT,  MOD_OPT, PCRE2_MATCH_UNSET_BACKREF,  PO(options) },
+  { "max_pattern_length",         MOD_CTC,  MOD_SIZ, 0,                          CO(max_pattern_length) },
+  { "memory",                     MOD_PD,   MOD_CTL, CTL_MEMORY,                 PD(control) },
+  { "multiline",                  MOD_PATP, MOD_OPT, PCRE2_MULTILINE,            PO(options) },
+  { "never_backslash_c",          MOD_PAT,  MOD_OPT, PCRE2_NEVER_BACKSLASH_C,    PO(options) },
+  { "never_ucp",                  MOD_PAT,  MOD_OPT, PCRE2_NEVER_UCP,            PO(options) },
+  { "never_utf",                  MOD_PAT,  MOD_OPT, PCRE2_NEVER_UTF,            PO(options) },
+  { "newline",                    MOD_CTC,  MOD_NL,  0,                          CO(newline_convention) },
+  { "no_auto_capture",            MOD_PAT,  MOD_OPT, PCRE2_NO_AUTO_CAPTURE,      PO(options) },
+  { "no_auto_possess",            MOD_PATP, MOD_OPT, PCRE2_NO_AUTO_POSSESS,      PO(options) },
+  { "no_dotstar_anchor",          MOD_PAT,  MOD_OPT, PCRE2_NO_DOTSTAR_ANCHOR,    PO(options) },
+  { "no_start_optimize",          MOD_PATP, MOD_OPT, PCRE2_NO_START_OPTIMIZE,    PO(options) },
+  { "no_utf_check",               MOD_PD,   MOD_OPT, PCRE2_NO_UTF_CHECK,         PD(options) },
+  { "notbol",                     MOD_DAT,  MOD_OPT, PCRE2_NOTBOL,               DO(options) },
+  { "notempty",                   MOD_DAT,  MOD_OPT, PCRE2_NOTEMPTY,             DO(options) },
+  { "notempty_atstart",           MOD_DAT,  MOD_OPT, PCRE2_NOTEMPTY_ATSTART,     DO(options) },
+  { "noteol",                     MOD_DAT,  MOD_OPT, PCRE2_NOTEOL,               DO(options) },
+  { "null_context",               MOD_PD,   MOD_CTL, CTL_NULLCONTEXT,            PO(control) },
+  { "offset",                     MOD_DAT,  MOD_INT, 0,                          DO(offset) },
+  { "offset_limit",               MOD_CTM,  MOD_SIZ, 0,                          MO(offset_limit)},
+  { "ovector",                    MOD_DAT,  MOD_INT, 0,                          DO(oveccount) },
+  { "parens_nest_limit",          MOD_CTC,  MOD_INT, 0,                          CO(parens_nest_limit) },
+  { "partial_hard",               MOD_DAT,  MOD_OPT, PCRE2_PARTIAL_HARD,         DO(options) },
+  { "partial_soft",               MOD_DAT,  MOD_OPT, PCRE2_PARTIAL_SOFT,         DO(options) },
+  { "ph",                         MOD_DAT,  MOD_OPT, PCRE2_PARTIAL_HARD,         DO(options) },
+  { "posix",                      MOD_PAT,  MOD_CTL, CTL_POSIX,                  PO(control) },
+  { "ps",                         MOD_DAT,  MOD_OPT, PCRE2_PARTIAL_SOFT,         DO(options) },
+  { "push",                       MOD_PAT,  MOD_CTL, CTL_PUSH,                   PO(control) },
+  { "recursion_limit",            MOD_CTM,  MOD_INT, 0,                          MO(recursion_limit) },
+  { "regerror_buffsize",          MOD_PAT,  MOD_INT, 0,                          PO(regerror_buffsize) },
+  { "replace",                    MOD_PND,  MOD_STR, REPLACE_MODSIZE,            PO(replacement) },
+  { "stackguard",                 MOD_PAT,  MOD_INT, 0,                          PO(stackguard_test) },
+  { "startchar",                  MOD_PND,  MOD_CTL, CTL_STARTCHAR,              PO(control) },
+  { "startoffset",                MOD_DAT,  MOD_INT, 0,                          DO(offset) },
+  { "substitute_extended",        MOD_PND,  MOD_CTL, CTL2_SUBSTITUTE_EXTENDED,   PO(control2) },
+  { "substitute_overflow_length", MOD_PND,  MOD_CTL, CTL2_SUBSTITUTE_OVERFLOW_LENGTH, PO(control2) },
+  { "substitute_unknown_unset",   MOD_PND,  MOD_CTL, CTL2_SUBSTITUTE_UNKNOWN_UNSET, PO(control2) },
+  { "substitute_unset_empty",     MOD_PND,  MOD_CTL, CTL2_SUBSTITUTE_UNSET_EMPTY, PO(control2) },
+  { "tables",                     MOD_PAT,  MOD_INT, 0,                          PO(tables_id) },
+  { "ucp",                        MOD_PATP, MOD_OPT, PCRE2_UCP,                  PO(options) },
+  { "ungreedy",                   MOD_PAT,  MOD_OPT, PCRE2_UNGREEDY,             PO(options) },
+  { "use_offset_limit",           MOD_PAT,  MOD_OPT, PCRE2_USE_OFFSET_LIMIT,     PO(options) },
+  { "utf",                        MOD_PATP, MOD_OPT, PCRE2_UTF,                  PO(options) },
+  { "zero_terminate",             MOD_DAT,  MOD_CTL, CTL_ZERO_TERMINATE,         DO(control) }
+};
+
+#define MODLISTCOUNT sizeof(modlist)/sizeof(modstruct)
+
+/* Controls and options that are supported for use with the POSIX interface. */
+
+#define POSIX_SUPPORTED_COMPILE_OPTIONS ( \
+  PCRE2_CASELESS|PCRE2_DOTALL|PCRE2_MULTILINE|PCRE2_NO_AUTO_CAPTURE| \
+  PCRE2_UCP|PCRE2_UTF|PCRE2_UNGREEDY)
+
+#define POSIX_SUPPORTED_COMPILE_CONTROLS ( \
+  CTL_AFTERTEXT|CTL_ALLAFTERTEXT|CTL_EXPAND|CTL_POSIX)
+
+#define POSIX_SUPPORTED_COMPILE_CONTROLS2 (0)
+
+#define POSIX_SUPPORTED_MATCH_OPTIONS ( \
+  PCRE2_NOTBOL|PCRE2_NOTEMPTY|PCRE2_NOTEOL)
+
+#define POSIX_SUPPORTED_MATCH_CONTROLS  (CTL_AFTERTEXT|CTL_ALLAFTERTEXT)
+#define POSIX_SUPPORTED_MATCH_CONTROLS2 (0)
+
+/* Control bits that are not ignored with 'push'. */
+
+#define PUSH_SUPPORTED_COMPILE_CONTROLS ( \
+  CTL_BINCODE|CTL_CALLOUT_INFO|CTL_FULLBINCODE|CTL_HEXPAT|CTL_INFO| \
+  CTL_JITVERIFY|CTL_MEMORY|CTL_PUSH|CTL_BSR_SET|CTL_NL_SET)
+
+#define PUSH_SUPPORTED_COMPILE_CONTROLS2 (0)
+
+/* Controls that apply only at compile time with 'push'. */
+
+#define PUSH_COMPILE_ONLY_CONTROLS   CTL_JITVERIFY
+#define PUSH_COMPILE_ONLY_CONTROLS2  (0)
+
+/* Controls that are forbidden with #pop. */
+
+#define NOTPOP_CONTROLS (CTL_HEXPAT|CTL_POSIX|CTL_PUSH)
+
+/* Pattern controls that are mutually exclusive. At present these are all in
+the first control word. */
+
+static uint32_t exclusive_pat_controls[] = {
+  CTL_POSIX  | CTL_HEXPAT,
+  CTL_POSIX  | CTL_PUSH,
+  CTL_EXPAND | CTL_HEXPAT };
+
+/* Data controls that are mutually exclusive. At present these are all in the
+first control word. */
+static uint32_t exclusive_dat_controls[] = {
+  CTL_ALLUSEDTEXT | CTL_STARTCHAR,
+  CTL_FINDLIMITS  | CTL_NULLCONTEXT };
+
+/* Table of single-character abbreviated modifiers. The index field is
+initialized to -1, but the first time the modifier is encountered, it is filled
+in with the index of the full entry in modlist, to save repeated searching when
+processing multiple test items. This short list is searched serially, so its
+order does not matter. */
+
+typedef struct c1modstruct {
+  const char *fullname;
+  uint32_t    onechar;
+  int         index;
+} c1modstruct;
+
+static c1modstruct c1modlist[] = {
+  { "bincode",      'B',           -1 },
+  { "info",         'I',           -1 },
+  { "global",       'g',           -1 },
+  { "caseless",     'i',           -1 },
+  { "multiline",    'm',           -1 },
+  { "dotall",       's',           -1 },
+  { "extended",     'x',           -1 }
+};
+
+#define C1MODLISTCOUNT sizeof(c1modlist)/sizeof(c1modstruct)
+
+/* Table of arguments for the -C command line option. Use macros to make the
+table itself easier to read. */
+
+#if defined SUPPORT_PCRE2_8
+#define SUPPORT_8 1
+#endif
+#if defined SUPPORT_PCRE2_16
+#define SUPPORT_16 1
+#endif
+#if defined SUPPORT_PCRE2_32
+#define SUPPORT_32 1
+#endif
+
+#ifndef SUPPORT_8
+#define SUPPORT_8 0
+#endif
+#ifndef SUPPORT_16
+#define SUPPORT_16 0
+#endif
+#ifndef SUPPORT_32
+#define SUPPORT_32 0
+#endif
+
+#ifdef EBCDIC
+#define SUPPORT_EBCDIC 1
+#define EBCDIC_NL CHAR_LF
+#else
+#define SUPPORT_EBCDIC 0
+#define EBCDIC_NL 0
+#endif
+
+#ifdef NEVER_BACKSLASH_C
+#define BACKSLASH_C 0
+#else
+#define BACKSLASH_C 1
+#endif
+
+typedef struct coptstruct {
+  const char *name;
+  uint32_t    type;
+  uint32_t    value;
+} coptstruct;
+
+enum { CONF_BSR,
+       CONF_FIX,
+       CONF_FIZ,
+       CONF_INT,
+       CONF_NL
+};
+
+static coptstruct coptlist[] = {
+  { "backslash-C", CONF_FIX, BACKSLASH_C },
+  { "bsr",         CONF_BSR, PCRE2_CONFIG_BSR },
+  { "ebcdic",      CONF_FIX, SUPPORT_EBCDIC },
+  { "ebcdic-nl",   CONF_FIZ, EBCDIC_NL },
+  { "jit",         CONF_INT, PCRE2_CONFIG_JIT },
+  { "linksize",    CONF_INT, PCRE2_CONFIG_LINKSIZE },
+  { "newline",     CONF_NL,  PCRE2_CONFIG_NEWLINE },
+  { "pcre2-16",    CONF_FIX, SUPPORT_16 },
+  { "pcre2-32",    CONF_FIX, SUPPORT_32 },
+  { "pcre2-8",     CONF_FIX, SUPPORT_8 },
+  { "unicode",     CONF_INT, PCRE2_CONFIG_UNICODE }
+};
+
+#define COPTLISTCOUNT sizeof(coptlist)/sizeof(coptstruct)
+
+#undef SUPPORT_8
+#undef SUPPORT_16
+#undef SUPPORT_32
+#undef SUPPORT_EBCDIC
+
+
+/* ----------------------- Static variables ------------------------ */
+
+static FILE *infile;
+static FILE *outfile;
+
+static const void *last_callout_mark;
+static PCRE2_JIT_STACK *jit_stack = NULL;
+static size_t jit_stack_size = 0;
+
+static BOOL first_callout;
+static BOOL jit_was_used;
+static BOOL restrict_for_perl_test = FALSE;
+static BOOL show_memory = FALSE;
+
+static int code_unit_size;                    /* Bytes */
+static int jitrc;                             /* Return from JIT compile */
+static int test_mode = DEFAULT_TEST_MODE;
+static int timeit = 0;
+static int timeitm = 0;
+
+clock_t total_compile_time = 0;
+clock_t total_jit_compile_time = 0;
+clock_t total_match_time = 0;
+
+static uint32_t dfa_matched;
+static uint32_t forbid_utf = 0;
+static uint32_t maxlookbehind;
+static uint32_t max_oveccount;
+static uint32_t callout_count;
+
+static uint16_t local_newline_default = 0;
+
+static VERSION_TYPE jittarget[VERSION_SIZE];
+static VERSION_TYPE version[VERSION_SIZE];
+static VERSION_TYPE uversion[VERSION_SIZE];
+
+static patctl def_patctl;
+static patctl pat_patctl;
+static datctl def_datctl;
+static datctl dat_datctl;
+
+static void *patstack[PATSTACKSIZE];
+static int patstacknext = 0;
+
+#ifdef SUPPORT_PCRE2_8
+static regex_t preg = { NULL, NULL, 0, 0 };
+#endif
+
+static int *dfa_workspace = NULL;
+static const uint8_t *locale_tables = NULL;
+static uint8_t locale_name[32];
+
+/* We need buffers for building 16/32-bit strings; 8-bit strings don't need
+rebuilding, but set up the same naming scheme for use in macros. The "buffer"
+buffer is where all input lines are read. Its size is the same as pbuffer8.
+Pattern lines are always copied to pbuffer8 for use in callouts, even if they
+are actually compiled from pbuffer16 or pbuffer32. */
+
+static size_t    pbuffer8_size  = 50000;        /* Initial size, bytes */
+static uint8_t  *pbuffer8 = NULL;
+static uint8_t  *buffer = NULL;
+
+/* The dbuffer is where all processed data lines are put. In non-8-bit modes it
+is cast as needed. For long data lines it grows as necessary. */
+
+static size_t dbuffer_size = 1u << 14;    /* Initial size, bytes */
+static uint8_t *dbuffer = NULL;
+
+
+/* ---------------- Mode-dependent variables -------------------*/
+
+#ifdef SUPPORT_PCRE2_8
+static pcre2_code_8             *compiled_code8;
+static pcre2_general_context_8  *general_context8, *general_context_copy8;
+static pcre2_compile_context_8  *pat_context8, *default_pat_context8;
+static pcre2_match_context_8    *dat_context8, *default_dat_context8;
+static pcre2_match_data_8       *match_data8;
+#endif
+
+#ifdef SUPPORT_PCRE2_16
+static pcre2_code_16            *compiled_code16;
+static pcre2_general_context_16 *general_context16, *general_context_copy16;
+static pcre2_compile_context_16 *pat_context16, *default_pat_context16;
+static pcre2_match_context_16   *dat_context16, *default_dat_context16;
+static pcre2_match_data_16      *match_data16;
+static PCRE2_SIZE pbuffer16_size = 0;   /* Set only when needed */
+static uint16_t *pbuffer16 = NULL;
+#endif
+
+#ifdef SUPPORT_PCRE2_32
+static pcre2_code_32            *compiled_code32;
+static pcre2_general_context_32 *general_context32, *general_context_copy32;
+static pcre2_compile_context_32 *pat_context32, *default_pat_context32;
+static pcre2_match_context_32   *dat_context32, *default_dat_context32;
+static pcre2_match_data_32      *match_data32;
+static PCRE2_SIZE pbuffer32_size = 0;   /* Set only when needed */
+static uint32_t *pbuffer32 = NULL;
+#endif
+
+
+/* ---------------- Macros that work in all modes ----------------- */
+
+#define CAST8VAR(x) CASTVAR(uint8_t *, x)
+#define SET(x,y) SETOP(x,y,=)
+#define SETPLUS(x,y) SETOP(x,y,+=)
+#define strlen8(x) strlen((char *)x)
+
+
+/* ---------------- Mode-dependent, runtime-testing macros ------------------*/
+
+/* Define macros for variables and functions that must be selected dynamically
+depending on the mode setting (8, 16, 32). These are dependent on which modes
+are supported. */
+
+#if (defined (SUPPORT_PCRE2_8) + defined (SUPPORT_PCRE2_16) + \
+     defined (SUPPORT_PCRE2_32)) >= 2
+
+/* ----- All three modes supported ----- */
+
+#if defined(SUPPORT_PCRE2_8) && defined(SUPPORT_PCRE2_16) && defined(SUPPORT_PCRE2_32)
+
+#define CASTFLD(t,a,b) ((test_mode == PCRE8_MODE)? (t)(G(a,8)->b) : \
+  (test_mode == PCRE16_MODE)? (t)(G(a,16)->b) : (t)(G(a,32)->b))
+
+#define CASTVAR(t,x) ( \
+  (test_mode == PCRE8_MODE)? (t)G(x,8) : \
+  (test_mode == PCRE16_MODE)? (t)G(x,16) : (t)G(x,32))
+
+#define CODE_UNIT(a,b) ( \
+  (test_mode == PCRE8_MODE)? (uint32_t)(((PCRE2_SPTR8)(a))[b]) : \
+  (test_mode == PCRE16_MODE)? (uint32_t)(((PCRE2_SPTR16)(a))[b]) : \
+  (uint32_t)(((PCRE2_SPTR32)(a))[b]))
+
+#define DATCTXCPY(a,b) \
+  if (test_mode == PCRE8_MODE) \
+    memcpy(G(a,8),G(b,8),sizeof(pcre2_match_context_8)); \
+  else if (test_mode == PCRE16_MODE) \
+    memcpy(G(a,16),G(b,16),sizeof(pcre2_match_context_16)); \
+  else memcpy(G(a,32),G(b,32),sizeof(pcre2_match_context_32))
+
+#define FLD(a,b) ((test_mode == PCRE8_MODE)? G(a,8)->b : \
+  (test_mode == PCRE16_MODE)? G(a,16)->b : G(a,32)->b)
+
+#define PATCTXCPY(a,b) \
+  if (test_mode == PCRE8_MODE) \
+    memcpy(G(a,8),G(b,8),sizeof(pcre2_compile_context_8)); \
+  else if (test_mode == PCRE16_MODE) \
+    memcpy(G(a,16),G(b,16),sizeof(pcre2_compile_context_16)); \
+  else memcpy(G(a,32),G(b,32),sizeof(pcre2_compile_context_32))
+
+#define PCHARS(lv, p, offset, len, utf, f) \
+  if (test_mode == PCRE32_MODE) \
+    lv = pchars32((PCRE2_SPTR32)(p)+offset, len, utf, f); \
+  else if (test_mode == PCRE16_MODE) \
+    lv = pchars16((PCRE2_SPTR16)(p)+offset, len, utf, f); \
+  else \
+    lv = pchars8((PCRE2_SPTR8)(p)+offset, len, utf, f)
+
+#define PCHARSV(p, offset, len, utf, f) \
+  if (test_mode == PCRE32_MODE) \
+    (void)pchars32((PCRE2_SPTR32)(p)+offset, len, utf, f); \
+  else if (test_mode == PCRE16_MODE) \
+    (void)pchars16((PCRE2_SPTR16)(p)+offset, len, utf, f); \
+  else \
+    (void)pchars8((PCRE2_SPTR8)(p)+offset, len, utf, f)
+
+#define PCRE2_CALLOUT_ENUMERATE(a,b,c) \
+  if (test_mode == PCRE8_MODE) \
+     a = pcre2_callout_enumerate_8(compiled_code8, \
+       (int (*)(struct pcre2_callout_enumerate_block_8 *, void *))b,c); \
+  else if (test_mode == PCRE16_MODE) \
+     a = pcre2_callout_enumerate_16(compiled_code16, \
+       (int(*)(struct pcre2_callout_enumerate_block_16 *, void *))b,c); \
+  else \
+     a = pcre2_callout_enumerate_32(compiled_code32, \
+       (int (*)(struct pcre2_callout_enumerate_block_32 *, void *))b,c)
+
+#define PCRE2_COMPILE(a,b,c,d,e,f,g) \
+  if (test_mode == PCRE8_MODE) \
+    G(a,8) = pcre2_compile_8(G(b,8),c,d,e,f,g); \
+  else if (test_mode == PCRE16_MODE) \
+    G(a,16) = pcre2_compile_16(G(b,16),c,d,e,f,g); \
+  else \
+    G(a,32) = pcre2_compile_32(G(b,32),c,d,e,f,g)
+
+#define PCRE2_DFA_MATCH(a,b,c,d,e,f,g,h,i,j) \
+  if (test_mode == PCRE8_MODE) \
+    a = pcre2_dfa_match_8(G(b,8),(PCRE2_SPTR8)c,d,e,f,G(g,8),h,i,j); \
+  else if (test_mode == PCRE16_MODE) \
+    a = pcre2_dfa_match_16(G(b,16),(PCRE2_SPTR16)c,d,e,f,G(g,16),h,i,j); \
+  else \
+    a = pcre2_dfa_match_32(G(b,32),(PCRE2_SPTR32)c,d,e,f,G(g,32),h,i,j)
+
+#define PCRE2_GET_ERROR_MESSAGE(r,a,b) \
+  if (test_mode == PCRE8_MODE) \
+    r = pcre2_get_error_message_8(a,G(b,8),G(G(b,8),_size)); \
+  else if (test_mode == PCRE16_MODE) \
+    r = pcre2_get_error_message_16(a,G(b,16),G(G(b,16),_size)); \
+  else \
+    r = pcre2_get_error_message_32(a,G(b,32),G(G(b,32),_size))
+
+#define PCRE2_GET_OVECTOR_COUNT(a,b) \
+  if (test_mode == PCRE8_MODE) \
+    a = pcre2_get_ovector_count_8(G(b,8)); \
+  else if (test_mode == PCRE16_MODE) \
+    a = pcre2_get_ovector_count_16(G(b,16)); \
+  else \
+    a = pcre2_get_ovector_count_32(G(b,32))
+
+#define PCRE2_GET_STARTCHAR(a,b) \
+  if (test_mode == PCRE8_MODE) \
+    a = pcre2_get_startchar_8(G(b,8)); \
+  else if (test_mode == PCRE16_MODE) \
+    a = pcre2_get_startchar_16(G(b,16)); \
+  else \
+    a = pcre2_get_startchar_32(G(b,32))
+
+#define PCRE2_JIT_COMPILE(r,a,b) \
+  if (test_mode == PCRE8_MODE) r = pcre2_jit_compile_8(G(a,8),b); \
+  else if (test_mode == PCRE16_MODE) r = pcre2_jit_compile_16(G(a,16),b); \
+  else r = pcre2_jit_compile_32(G(a,32),b)
+
+#define PCRE2_JIT_FREE_UNUSED_MEMORY(a) \
+  if (test_mode == PCRE8_MODE) pcre2_jit_free_unused_memory_8(G(a,8)); \
+  else if (test_mode == PCRE16_MODE) pcre2_jit_free_unused_memory_16(G(a,16)); \
+  else pcre2_jit_free_unused_memory_32(G(a,32))
+
+#define PCRE2_JIT_MATCH(a,b,c,d,e,f,g,h) \
+  if (test_mode == PCRE8_MODE) \
+    a = pcre2_jit_match_8(G(b,8),(PCRE2_SPTR8)c,d,e,f,G(g,8),h); \
+  else if (test_mode == PCRE16_MODE) \
+    a = pcre2_jit_match_16(G(b,16),(PCRE2_SPTR16)c,d,e,f,G(g,16),h); \
+  else \
+    a = pcre2_jit_match_32(G(b,32),(PCRE2_SPTR32)c,d,e,f,G(g,32),h)
+
+#define PCRE2_JIT_STACK_CREATE(a,b,c,d) \
+  if (test_mode == PCRE8_MODE) \
+    a = (PCRE2_JIT_STACK *)pcre2_jit_stack_create_8(b,c,d); \
+  else if (test_mode == PCRE16_MODE) \
+    a = (PCRE2_JIT_STACK *)pcre2_jit_stack_create_16(b,c,d); \
+  else \
+    a = (PCRE2_JIT_STACK *)pcre2_jit_stack_create_32(b,c,d);
+
+#define PCRE2_JIT_STACK_ASSIGN(a,b,c) \
+  if (test_mode == PCRE8_MODE) \
+    pcre2_jit_stack_assign_8(G(a,8),(pcre2_jit_callback_8)b,c); \
+  else if (test_mode == PCRE16_MODE) \
+    pcre2_jit_stack_assign_16(G(a,16),(pcre2_jit_callback_16)b,c); \
+  else \
+    pcre2_jit_stack_assign_32(G(a,32),(pcre2_jit_callback_32)b,c);
+
+#define PCRE2_JIT_STACK_FREE(a) \
+  if (test_mode == PCRE8_MODE) \
+    pcre2_jit_stack_free_8((pcre2_jit_stack_8 *)a); \
+  else if (test_mode == PCRE16_MODE) \
+    pcre2_jit_stack_free_16((pcre2_jit_stack_16 *)a); \
+  else \
+    pcre2_jit_stack_free_32((pcre2_jit_stack_32 *)a);
+
+#define PCRE2_MAKETABLES(a) \
+  if (test_mode == PCRE8_MODE) a = pcre2_maketables_8(NULL); \
+  else if (test_mode == PCRE16_MODE) a = pcre2_maketables_16(NULL); \
+  else a = pcre2_maketables_32(NULL)
+
+#define PCRE2_MATCH(a,b,c,d,e,f,g,h) \
+  if (test_mode == PCRE8_MODE) \
+    a = pcre2_match_8(G(b,8),(PCRE2_SPTR8)c,d,e,f,G(g,8),h); \
+  else if (test_mode == PCRE16_MODE) \
+    a = pcre2_match_16(G(b,16),(PCRE2_SPTR16)c,d,e,f,G(g,16),h); \
+  else \
+    a = pcre2_match_32(G(b,32),(PCRE2_SPTR32)c,d,e,f,G(g,32),h)
+
+#define PCRE2_MATCH_DATA_CREATE(a,b,c) \
+  if (test_mode == PCRE8_MODE) \
+    G(a,8) = pcre2_match_data_create_8(b,c); \
+  else if (test_mode == PCRE16_MODE) \
+    G(a,16) = pcre2_match_data_create_16(b,c); \
+  else \
+    G(a,32) = pcre2_match_data_create_32(b,c)
+
+#define PCRE2_MATCH_DATA_CREATE_FROM_PATTERN(a,b,c) \
+  if (test_mode == PCRE8_MODE) \
+    G(a,8) = pcre2_match_data_create_from_pattern_8(G(b,8),c); \
+  else if (test_mode == PCRE16_MODE) \
+    G(a,16) = pcre2_match_data_create_from_pattern_16(G(b,16),c); \
+  else \
+    G(a,32) = pcre2_match_data_create_from_pattern_32(G(b,32),c)
+
+#define PCRE2_MATCH_DATA_FREE(a) \
+  if (test_mode == PCRE8_MODE) \
+    pcre2_match_data_free_8(G(a,8)); \
+  else if (test_mode == PCRE16_MODE) \
+    pcre2_match_data_free_16(G(a,16)); \
+  else \
+    pcre2_match_data_free_32(G(a,32))
+
+#define PCRE2_PATTERN_INFO(a,b,c,d) \
+  if (test_mode == PCRE8_MODE) \
+    a = pcre2_pattern_info_8(G(b,8),c,d); \
+  else if (test_mode == PCRE16_MODE) \
+    a = pcre2_pattern_info_16(G(b,16),c,d); \
+  else \
+    a = pcre2_pattern_info_32(G(b,32),c,d)
+
+#define PCRE2_PRINTINT(a) \
+  if (test_mode == PCRE8_MODE) \
+    pcre2_printint_8(compiled_code8,outfile,a); \
+  else if (test_mode == PCRE16_MODE) \
+    pcre2_printint_16(compiled_code16,outfile,a); \
+  else \
+    pcre2_printint_32(compiled_code32,outfile,a)
+
+#define PCRE2_SERIALIZE_DECODE(r,a,b,c,d) \
+  if (test_mode == PCRE8_MODE) \
+    r = pcre2_serialize_decode_8((pcre2_code_8 **)a,b,c,G(d,8)); \
+  else if (test_mode == PCRE16_MODE) \
+    r = pcre2_serialize_decode_16((pcre2_code_16 **)a,b,c,G(d,16)); \
+  else \
+    r = pcre2_serialize_decode_32((pcre2_code_32 **)a,b,c,G(d,32))
+
+#define PCRE2_SERIALIZE_ENCODE(r,a,b,c,d,e) \
+  if (test_mode == PCRE8_MODE) \
+    r = pcre2_serialize_encode_8((const pcre2_code_8 **)a,b,c,d,G(e,8)); \
+  else if (test_mode == PCRE16_MODE) \
+    r = pcre2_serialize_encode_16((const pcre2_code_16 **)a,b,c,d,G(e,16)); \
+  else \
+    r = pcre2_serialize_encode_32((const pcre2_code_32 **)a,b,c,d,G(e,32))
+
+#define PCRE2_SERIALIZE_FREE(a) \
+  if (test_mode == PCRE8_MODE) \
+    pcre2_serialize_free_8(a); \
+  else if (test_mode == PCRE16_MODE) \
+    pcre2_serialize_free_16(a); \
+  else \
+    pcre2_serialize_free_32(a)
+
+#define PCRE2_SERIALIZE_GET_NUMBER_OF_CODES(r,a) \
+  if (test_mode == PCRE8_MODE) \
+    r = pcre2_serialize_get_number_of_codes_8(a); \
+  else if (test_mode == PCRE16_MODE) \
+    r = pcre2_serialize_get_number_of_codes_16(a); \
+  else \
+    r = pcre2_serialize_get_number_of_codes_32(a); \
+
+#define PCRE2_SET_CALLOUT(a,b,c) \
+  if (test_mode == PCRE8_MODE) \
+    pcre2_set_callout_8(G(a,8),(int (*)(pcre2_callout_block_8 *, void *))b,c); \
+  else if (test_mode == PCRE16_MODE) \
+    pcre2_set_callout_16(G(a,16),(int (*)(pcre2_callout_block_16 *, void *))b,c); \
+  else \
+    pcre2_set_callout_32(G(a,32),(int (*)(pcre2_callout_block_32 *, void *))b,c);
+
+#define PCRE2_SET_CHARACTER_TABLES(a,b) \
+  if (test_mode == PCRE8_MODE) \
+    pcre2_set_character_tables_8(G(a,8),b); \
+  else if (test_mode == PCRE16_MODE) \
+    pcre2_set_character_tables_16(G(a,16),b); \
+  else \
+    pcre2_set_character_tables_32(G(a,32),b)
+
+#define PCRE2_SET_COMPILE_RECURSION_GUARD(a,b,c) \
+  if (test_mode == PCRE8_MODE) \
+    pcre2_set_compile_recursion_guard_8(G(a,8),b,c); \
+  else if (test_mode == PCRE16_MODE) \
+    pcre2_set_compile_recursion_guard_16(G(a,16),b,c); \
+  else \
+    pcre2_set_compile_recursion_guard_32(G(a,32),b,c)
+
+#define PCRE2_SET_MATCH_LIMIT(a,b) \
+  if (test_mode == PCRE8_MODE) \
+    pcre2_set_match_limit_8(G(a,8),b); \
+  else if (test_mode == PCRE16_MODE) \
+    pcre2_set_match_limit_16(G(a,16),b); \
+  else \
+    pcre2_set_match_limit_32(G(a,32),b)
+
+#define PCRE2_SET_MAX_PATTERN_LENGTH(a,b) \
+  if (test_mode == PCRE8_MODE) \
+    pcre2_set_max_pattern_length_8(G(a,8),b); \
+  else if (test_mode == PCRE16_MODE) \
+    pcre2_set_max_pattern_length_16(G(a,16),b); \
+  else \
+    pcre2_set_max_pattern_length_32(G(a,32),b)
+
+#define PCRE2_SET_OFFSET_LIMIT(a,b) \
+  if (test_mode == PCRE8_MODE) \
+    pcre2_set_offset_limit_8(G(a,8),b); \
+  else if (test_mode == PCRE16_MODE) \
+    pcre2_set_offset_limit_16(G(a,16),b); \
+  else \
+    pcre2_set_offset_limit_32(G(a,32),b)
+
+#define PCRE2_SET_PARENS_NEST_LIMIT(a,b) \
+  if (test_mode == PCRE8_MODE) \
+    pcre2_set_parens_nest_limit_8(G(a,8),b); \
+  else if (test_mode == PCRE16_MODE) \
+    pcre2_set_parens_nest_limit_16(G(a,16),b); \
+  else \
+    pcre2_set_parens_nest_limit_32(G(a,32),b)
+
+#define PCRE2_SET_RECURSION_LIMIT(a,b) \
+  if (test_mode == PCRE8_MODE) \
+    pcre2_set_recursion_limit_8(G(a,8),b); \
+  else if (test_mode == PCRE16_MODE) \
+    pcre2_set_recursion_limit_16(G(a,16),b); \
+  else \
+    pcre2_set_recursion_limit_32(G(a,32),b)
+
+#define PCRE2_SUBSTITUTE(a,b,c,d,e,f,g,h,i,j,k,l) \
+  if (test_mode == PCRE8_MODE) \
+    a = pcre2_substitute_8(G(b,8),(PCRE2_SPTR8)c,d,e,f,G(g,8),G(h,8), \
+      (PCRE2_SPTR8)i,j,(PCRE2_UCHAR8 *)k,l); \
+  else if (test_mode == PCRE16_MODE) \
+    a = pcre2_substitute_16(G(b,16),(PCRE2_SPTR16)c,d,e,f,G(g,16),G(h,16), \
+      (PCRE2_SPTR16)i,j,(PCRE2_UCHAR16 *)k,l); \
+  else \
+    a = pcre2_substitute_32(G(b,32),(PCRE2_SPTR32)c,d,e,f,G(g,32),G(h,32), \
+      (PCRE2_SPTR32)i,j,(PCRE2_UCHAR32 *)k,l)
+
+#define PCRE2_SUBSTRING_COPY_BYNAME(a,b,c,d,e) \
+  if (test_mode == PCRE8_MODE) \
+    a = pcre2_substring_copy_byname_8(G(b,8),G(c,8),(PCRE2_UCHAR8 *)d,e); \
+  else if (test_mode == PCRE16_MODE) \
+    a = pcre2_substring_copy_byname_16(G(b,16),G(c,16),(PCRE2_UCHAR16 *)d,e); \
+  else \
+    a = pcre2_substring_copy_byname_32(G(b,32),G(c,32),(PCRE2_UCHAR32 *)d,e)
+
+#define PCRE2_SUBSTRING_COPY_BYNUMBER(a,b,c,d,e) \
+  if (test_mode == PCRE8_MODE) \
+    a = pcre2_substring_copy_bynumber_8(G(b,8),c,(PCRE2_UCHAR8 *)d,e); \
+  else if (test_mode == PCRE16_MODE) \
+    a = pcre2_substring_copy_bynumber_16(G(b,16),c,(PCRE2_UCHAR16 *)d,e); \
+  else \
+    a = pcre2_substring_copy_bynumber_32(G(b,32),c,(PCRE2_UCHAR32 *)d,e)
+
+#define PCRE2_SUBSTRING_FREE(a) \
+  if (test_mode == PCRE8_MODE) pcre2_substring_free_8((PCRE2_UCHAR8 *)a); \
+  else if (test_mode == PCRE16_MODE) \
+    pcre2_substring_free_16((PCRE2_UCHAR16 *)a); \
+  else pcre2_substring_free_32((PCRE2_UCHAR32 *)a)
+
+#define PCRE2_SUBSTRING_GET_BYNAME(a,b,c,d,e) \
+  if (test_mode == PCRE8_MODE) \
+    a = pcre2_substring_get_byname_8(G(b,8),G(c,8),(PCRE2_UCHAR8 **)d,e); \
+  else if (test_mode == PCRE16_MODE) \
+    a = pcre2_substring_get_byname_16(G(b,16),G(c,16),(PCRE2_UCHAR16 **)d,e); \
+  else \
+    a = pcre2_substring_get_byname_32(G(b,32),G(c,32),(PCRE2_UCHAR32 **)d,e)
+
+#define PCRE2_SUBSTRING_GET_BYNUMBER(a,b,c,d,e) \
+  if (test_mode == PCRE8_MODE) \
+    a = pcre2_substring_get_bynumber_8(G(b,8),c,(PCRE2_UCHAR8 **)d,e); \
+  else if (test_mode == PCRE16_MODE) \
+    a = pcre2_substring_get_bynumber_16(G(b,16),c,(PCRE2_UCHAR16 **)d,e); \
+  else \
+    a = pcre2_substring_get_bynumber_32(G(b,32),c,(PCRE2_UCHAR32 **)d,e)
+
+#define PCRE2_SUBSTRING_LENGTH_BYNAME(a,b,c,d) \
+  if (test_mode == PCRE8_MODE) \
+    a = pcre2_substring_length_byname_8(G(b,8),G(c,8),d); \
+  else if (test_mode == PCRE16_MODE) \
+    a = pcre2_substring_length_byname_16(G(b,16),G(c,16),d); \
+  else \
+    a = pcre2_substring_length_byname_32(G(b,32),G(c,32),d)
+
+#define PCRE2_SUBSTRING_LENGTH_BYNUMBER(a,b,c,d) \
+  if (test_mode == PCRE8_MODE) \
+    a = pcre2_substring_length_bynumber_8(G(b,8),c,d); \
+  else if (test_mode == PCRE16_MODE) \
+    a = pcre2_substring_length_bynumber_16(G(b,16),c,d); \
+  else \
+    a = pcre2_substring_length_bynumber_32(G(b,32),c,d)
+
+#define PCRE2_SUBSTRING_LIST_GET(a,b,c,d) \
+  if (test_mode == PCRE8_MODE) \
+    a = pcre2_substring_list_get_8(G(b,8),(PCRE2_UCHAR8 ***)c,d); \
+  else if (test_mode == PCRE16_MODE) \
+    a = pcre2_substring_list_get_16(G(b,16),(PCRE2_UCHAR16 ***)c,d); \
+  else \
+    a = pcre2_substring_list_get_32(G(b,32),(PCRE2_UCHAR32 ***)c,d)
+
+#define PCRE2_SUBSTRING_LIST_FREE(a) \
+  if (test_mode == PCRE8_MODE) \
+    pcre2_substring_list_free_8((PCRE2_SPTR8 *)a); \
+  else if (test_mode == PCRE16_MODE) \
+    pcre2_substring_list_free_16((PCRE2_SPTR16 *)a); \
+  else \
+    pcre2_substring_list_free_32((PCRE2_SPTR32 *)a)
+
+#define PCRE2_SUBSTRING_NUMBER_FROM_NAME(a,b,c) \
+  if (test_mode == PCRE8_MODE) \
+    a = pcre2_substring_number_from_name_8(G(b,8),G(c,8)); \
+  else if (test_mode == PCRE16_MODE) \
+    a = pcre2_substring_number_from_name_16(G(b,16),G(c,16)); \
+  else \
+    a = pcre2_substring_number_from_name_32(G(b,32),G(c,32))
+
+#define PTR(x) ( \
+  (test_mode == PCRE8_MODE)? (void *)G(x,8) : \
+  (test_mode == PCRE16_MODE)? (void *)G(x,16) : \
+  (void *)G(x,32))
+
+#define SETFLD(x,y,z) \
+  if (test_mode == PCRE8_MODE) G(x,8)->y = z; \
+  else if (test_mode == PCRE16_MODE) G(x,16)->y = z; \
+  else G(x,32)->y = z
+
+#define SETFLDVEC(x,y,v,z) \
+  if (test_mode == PCRE8_MODE) G(x,8)->y[v] = z; \
+  else if (test_mode == PCRE16_MODE) G(x,16)->y[v] = z; \
+  else G(x,32)->y[v] = z
+
+#define SETOP(x,y,z) \
+  if (test_mode == PCRE8_MODE) G(x,8) z y; \
+  else if (test_mode == PCRE16_MODE) G(x,16) z y; \
+  else G(x,32) z y
+
+#define SETCASTPTR(x,y) \
+  if (test_mode == PCRE8_MODE) \
+    G(x,8) = (uint8_t *)(y); \
+  else if (test_mode == PCRE16_MODE) \
+    G(x,16) = (uint16_t *)(y); \
+  else \
+    G(x,32) = (uint32_t *)(y)
+
+#define STRLEN(p) ((test_mode == PCRE8_MODE)? ((int)strlen((char *)p)) : \
+  (test_mode == PCRE16_MODE)? ((int)strlen16((PCRE2_SPTR16)p)) : \
+  ((int)strlen32((PCRE2_SPTR32)p)))
+
+#define SUB1(a,b) \
+  if (test_mode == PCRE8_MODE) G(a,8)(G(b,8)); \
+  else if (test_mode == PCRE16_MODE) G(a,16)(G(b,16)); \
+  else G(a,32)(G(b,32))
+
+#define SUB2(a,b,c) \
+  if (test_mode == PCRE8_MODE) G(a,8)(G(b,8),G(c,8)); \
+  else if (test_mode == PCRE16_MODE) G(a,16)(G(b,16),G(c,16)); \
+  else G(a,32)(G(b,32),G(c,32))
+
+#define TEST(x,r,y) ( \
+  (test_mode == PCRE8_MODE && G(x,8) r (y)) || \
+  (test_mode == PCRE16_MODE && G(x,16) r (y)) || \
+  (test_mode == PCRE32_MODE && G(x,32) r (y)))
+
+#define TESTFLD(x,f,r,y) ( \
+  (test_mode == PCRE8_MODE && G(x,8)->f r (y)) || \
+  (test_mode == PCRE16_MODE && G(x,16)->f r (y)) || \
+  (test_mode == PCRE32_MODE && G(x,32)->f r (y)))
+
+
+
+/* ----- Two out of three modes are supported ----- */
+
+#else
+
+/* We can use some macro trickery to make a single set of definitions work in
+the three different cases. */
+
+/* ----- 32-bit and 16-bit but not 8-bit supported ----- */
+
+#if defined(SUPPORT_PCRE2_32) && defined(SUPPORT_PCRE2_16)
+#define BITONE 32
+#define BITTWO 16
+
+/* ----- 32-bit and 8-bit but not 16-bit supported ----- */
+
+#elif defined(SUPPORT_PCRE2_32) && defined(SUPPORT_PCRE2_8)
+#define BITONE 32
+#define BITTWO 8
+
+/* ----- 16-bit and 8-bit but not 32-bit supported ----- */
+
+#else
+#define BITONE 16
+#define BITTWO 8
+#endif
+
+
+/* ----- Common macros for two-mode cases ----- */
+
+#define CASTFLD(t,a,b) \
+  ((test_mode == G(G(PCRE,BITONE),_MODE))? (t)(G(a,BITONE)->b) : \
+    (t)(G(a,BITTWO)->b))
+
+#define CASTVAR(t,x) ( \
+  (test_mode == G(G(PCRE,BITONE),_MODE))? \
+    (t)G(x,BITONE) : (t)G(x,BITTWO))
+
+#define CODE_UNIT(a,b) ( \
+  (test_mode == G(G(PCRE,BITONE),_MODE))? \
+  (uint32_t)(((G(PCRE2_SPTR,BITONE))(a))[b]) : \
+  (uint32_t)(((G(PCRE2_SPTR,BITTWO))(a))[b]))
+
+#define DATCTXCPY(a,b) \
+  if (test_mode == G(G(PCRE,BITONE),_MODE)) \
+    memcpy(G(a,BITONE),G(b,BITONE),sizeof(G(pcre2_match_context_,BITONE))); \
+  else \
+    memcpy(G(a,BITTWO),G(b,BITTWO),sizeof(G(pcre2_match_context_,BITTWO)))
+
+#define FLD(a,b) \
+  ((test_mode == G(G(PCRE,BITONE),_MODE))? G(a,BITONE)->b : G(a,BITTWO)->b)
+
+#define PATCTXCPY(a,b) \
+  if (test_mode == G(G(PCRE,BITONE),_MODE)) \
+    memcpy(G(a,BITONE),G(b,BITONE),sizeof(G(pcre2_compile_context_,BITONE))); \
+  else \
+    memcpy(G(a,BITTWO),G(b,BITTWO),sizeof(G(pcre2_compile_context_,BITTWO)))
+
+#define PCHARS(lv, p, offset, len, utf, f) \
+  if (test_mode == G(G(PCRE,BITONE),_MODE)) \
+    lv = G(pchars,BITONE)((G(PCRE2_SPTR,BITONE))(p)+offset, len, utf, f); \
+  else \
+    lv = G(pchars,BITTWO)((G(PCRE2_SPTR,BITTWO))(p)+offset, len, utf, f)
+
+#define PCHARSV(p, offset, len, utf, f) \
+  if (test_mode == G(G(PCRE,BITONE),_MODE)) \
+    (void)G(pchars,BITONE)((G(PCRE2_SPTR,BITONE))(p)+offset, len, utf, f); \
+  else \
+    (void)G(pchars,BITTWO)((G(PCRE2_SPTR,BITTWO))(p)+offset, len, utf, f)
+
+#define PCRE2_CALLOUT_ENUMERATE(a,b,c) \
+  if (test_mode == G(G(PCRE,BITONE),_MODE)) \
+     a = G(pcre2_callout_enumerate,BITONE)(G(compiled_code,BITONE), \
+       (int (*)(struct G(pcre2_callout_enumerate_block_,BITONE) *, void *))b,c); \
+  else \
+     a = G(pcre2_callout_enumerate,BITTWO)(G(compiled_code,BITTWO), \
+       (int (*)(struct G(pcre2_callout_enumerate_block_,BITTWO) *, void *))b,c)
+
+#define PCRE2_COMPILE(a,b,c,d,e,f,g) \
+  if (test_mode == G(G(PCRE,BITONE),_MODE)) \
+    G(a,BITONE) = G(pcre2_compile_,BITONE)(G(b,BITONE),c,d,e,f,g); \
+  else \
+    G(a,BITTWO) = G(pcre2_compile_,BITTWO)(G(b,BITTWO),c,d,e,f,g)
+
+#define PCRE2_DFA_MATCH(a,b,c,d,e,f,g,h,i,j) \
+  if (test_mode == G(G(PCRE,BITONE),_MODE)) \
+    a = G(pcre2_dfa_match_,BITONE)(G(b,BITONE),(G(PCRE2_SPTR,BITONE))c,d,e,f, \
+      G(g,BITONE),h,i,j); \
+  else \
+    a = G(pcre2_dfa_match_,BITTWO)(G(b,BITTWO),(G(PCRE2_SPTR,BITTWO))c,d,e,f, \
+      G(g,BITTWO),h,i,j)
+
+#define PCRE2_GET_ERROR_MESSAGE(r,a,b) \
+  if (test_mode == G(G(PCRE,BITONE),_MODE)) \
+    r = G(pcre2_get_error_message_,BITONE)(a,G(b,BITONE),G(G(b,BITONE),_size)); \
+  else \
+    r = G(pcre2_get_error_message_,BITTWO)(a,G(b,BITTWO),G(G(b,BITTWO),_size))
+
+#define PCRE2_GET_OVECTOR_COUNT(a,b) \
+  if (test_mode == G(G(PCRE,BITONE),_MODE)) \
+    a = G(pcre2_get_ovector_count_,BITONE)(G(b,BITONE)); \
+  else \
+    a = G(pcre2_get_ovector_count_,BITTWO)(G(b,BITTWO))
+
+#define PCRE2_GET_STARTCHAR(a,b) \
+  if (test_mode == G(G(PCRE,BITONE),_MODE)) \
+    a = G(pcre2_get_startchar_,BITONE)(G(b,BITONE)); \
+  else \
+    a = G(pcre2_get_startchar_,BITTWO)(G(b,BITTWO))
+
+#define PCRE2_JIT_COMPILE(r,a,b) \
+  if (test_mode == G(G(PCRE,BITONE),_MODE)) \
+    r = G(pcre2_jit_compile_,BITONE)(G(a,BITONE),b); \
+  else \
+    r = G(pcre2_jit_compile_,BITTWO)(G(a,BITTWO),b)
+
+#define PCRE2_JIT_FREE_UNUSED_MEMORY(a) \
+  if (test_mode == G(G(PCRE,BITONE),_MODE)) \
+    G(pcre2_jit_free_unused_memory_,BITONE)(G(a,BITONE)); \
+  else \
+    G(pcre2_jit_free_unused_memory_,BITTWO)(G(a,BITTWO))
+
+#define PCRE2_JIT_MATCH(a,b,c,d,e,f,g,h) \
+  if (test_mode == G(G(PCRE,BITONE),_MODE)) \
+    a = G(pcre2_jit_match_,BITONE)(G(b,BITONE),(G(PCRE2_SPTR,BITONE))c,d,e,f, \
+      G(g,BITONE),h); \
+  else \
+    a = G(pcre2_jit_match_,BITTWO)(G(b,BITTWO),(G(PCRE2_SPTR,BITTWO))c,d,e,f, \
+      G(g,BITTWO),h)
+
+#define PCRE2_JIT_STACK_CREATE(a,b,c,d) \
+  if (test_mode == G(G(PCRE,BITONE),_MODE)) \
+    a = (PCRE2_JIT_STACK *)G(pcre2_jit_stack_create_,BITONE)(b,c,d); \
+  else \
+    a = (PCRE2_JIT_STACK *)G(pcre2_jit_stack_create_,BITTWO)(b,c,d); \
+
+#define PCRE2_JIT_STACK_ASSIGN(a,b,c) \
+  if (test_mode == G(G(PCRE,BITONE),_MODE)) \
+    G(pcre2_jit_stack_assign_,BITONE)(G(a,BITONE),(G(pcre2_jit_callback_,BITONE))b,c); \
+  else \
+    G(pcre2_jit_stack_assign_,BITTWO)(G(a,BITTWO),(G(pcre2_jit_callback_,BITTWO))b,c);
+
+#define PCRE2_JIT_STACK_FREE(a) \
+  if (test_mode == G(G(PCRE,BITONE),_MODE)) \
+    G(pcre2_jit_stack_free_,BITONE)((G(pcre2_jit_stack_,BITONE) *)a); \
+  else \
+    G(pcre2_jit_stack_free_,BITTWO)((G(pcre2_jit_stack_,BITTWO) *)a);
+
+#define PCRE2_MAKETABLES(a) \
+  if (test_mode == G(G(PCRE,BITONE),_MODE)) \
+    a = G(pcre2_maketables_,BITONE)(NULL); \
+  else \
+    a = G(pcre2_maketables_,BITTWO)(NULL)
+
+#define PCRE2_MATCH(a,b,c,d,e,f,g,h) \
+  if (test_mode == G(G(PCRE,BITONE),_MODE)) \
+    a = G(pcre2_match_,BITONE)(G(b,BITONE),(G(PCRE2_SPTR,BITONE))c,d,e,f, \
+      G(g,BITONE),h); \
+  else \
+    a = G(pcre2_match_,BITTWO)(G(b,BITTWO),(G(PCRE2_SPTR,BITTWO))c,d,e,f, \
+      G(g,BITTWO),h)
+
+#define PCRE2_MATCH_DATA_CREATE(a,b,c) \
+  if (test_mode == G(G(PCRE,BITONE),_MODE)) \
+    G(a,BITONE) = G(pcre2_match_data_create_,BITONE)(b,c); \
+  else \
+    G(a,BITTWO) = G(pcre2_match_data_create_,BITTWO)(b,c)
+
+#define PCRE2_MATCH_DATA_CREATE_FROM_PATTERN(a,b,c) \
+  if (test_mode == G(G(PCRE,BITONE),_MODE)) \
+    G(a,BITONE) = G(pcre2_match_data_create_from_pattern_,BITONE)(G(b,BITONE),c); \
+  else \
+    G(a,BITTWO) = G(pcre2_match_data_create_from_pattern_,BITTWO)(G(b,BITTWO),c)
+
+#define PCRE2_MATCH_DATA_FREE(a) \
+  if (test_mode == G(G(PCRE,BITONE),_MODE)) \
+    G(pcre2_match_data_free_,BITONE)(G(a,BITONE)); \
+  else \
+    G(pcre2_match_data_free_,BITTWO)(G(a,BITTWO))
+
+#define PCRE2_PATTERN_INFO(a,b,c,d) \
+  if (test_mode == G(G(PCRE,BITONE),_MODE)) \
+    a = G(pcre2_pattern_info_,BITONE)(G(b,BITONE),c,d); \
+  else \
+    a = G(pcre2_pattern_info_,BITTWO)(G(b,BITTWO),c,d)
+
+#define PCRE2_PRINTINT(a) \
+ if (test_mode == G(G(PCRE,BITONE),_MODE)) \
+    G(pcre2_printint_,BITONE)(G(compiled_code,BITONE),outfile,a); \
+  else \
+    G(pcre2_printint_,BITTWO)(G(compiled_code,BITTWO),outfile,a)
+
+#define PCRE2_SERIALIZE_DECODE(r,a,b,c,d) \
+ if (test_mode == G(G(PCRE,BITONE),_MODE)) \
+    r = G(pcre2_serialize_decode_,BITONE)((G(pcre2_code_,BITONE) **)a,b,c,G(d,BITONE)); \
+  else \
+    r = G(pcre2_serialize_decode_,BITTWO)((G(pcre2_code_,BITTWO) **)a,b,c,G(d,BITTWO))
+
+#define PCRE2_SERIALIZE_ENCODE(r,a,b,c,d,e) \
+ if (test_mode == G(G(PCRE,BITONE),_MODE)) \
+    r = G(pcre2_serialize_encode_,BITONE)((G(const pcre2_code_,BITONE) **)a,b,c,d,G(e,BITONE)); \
+  else \
+    r = G(pcre2_serialize_encode_,BITTWO)((G(const pcre2_code_,BITTWO) **)a,b,c,d,G(e,BITTWO))
+
+#define PCRE2_SERIALIZE_FREE(a) \
+ if (test_mode == G(G(PCRE,BITONE),_MODE)) \
+    G(pcre2_serialize_free_,BITONE)(a); \
+  else \
+    G(pcre2_serialize_free_,BITTWO)(a)
+
+#define PCRE2_SERIALIZE_GET_NUMBER_OF_CODES(r,a) \
+ if (test_mode == G(G(PCRE,BITONE),_MODE)) \
+    r = G(pcre2_serialize_get_number_of_codes_,BITONE)(a); \
+  else \
+    r = G(pcre2_serialize_get_number_of_codes_,BITTWO)(a)
+
+#define PCRE2_SET_CALLOUT(a,b,c) \
+  if (test_mode == G(G(PCRE,BITONE),_MODE)) \
+    G(pcre2_set_callout_,BITONE)(G(a,BITONE), \
+      (int (*)(G(pcre2_callout_block_,BITONE) *, void *))b,c); \
+  else \
+    G(pcre2_set_callout_,BITTWO)(G(a,BITTWO), \
+      (int (*)(G(pcre2_callout_block_,BITTWO) *, void *))b,c);
+
+#define PCRE2_SET_CHARACTER_TABLES(a,b) \
+  if (test_mode == G(G(PCRE,BITONE),_MODE)) \
+    G(pcre2_set_character_tables_,BITONE)(G(a,BITONE),b); \
+  else \
+    G(pcre2_set_character_tables_,BITTWO)(G(a,BITTWO),b)
+
+#define PCRE2_SET_COMPILE_RECURSION_GUARD(a,b,c) \
+  if (test_mode == G(G(PCRE,BITONE),_MODE)) \
+    G(pcre2_set_compile_recursion_guard_,BITONE)(G(a,BITONE),b,c); \
+  else \
+    G(pcre2_set_compile_recursion_guard_,BITTWO)(G(a,BITTWO),b,c)
+
+#define PCRE2_SET_MATCH_LIMIT(a,b) \
+  if (test_mode == G(G(PCRE,BITONE),_MODE)) \
+    G(pcre2_set_match_limit_,BITONE)(G(a,BITONE),b); \
+  else \
+    G(pcre2_set_match_limit_,BITTWO)(G(a,BITTWO),b)
+
+#define PCRE2_SET_MAX_PATTERN_LENGTH(a,b) \
+  if (test_mode == G(G(PCRE,BITONE),_MODE)) \
+    G(pcre2_set_max_pattern_length_,BITONE)(G(a,BITONE),b); \
+  else \
+    G(pcre2_set_max_pattern_length_,BITTWO)(G(a,BITTWO),b)
+
+#define PCRE2_SET_OFFSET_LIMIT(a,b) \
+  if (test_mode == G(G(PCRE,BITONE),_MODE)) \
+    G(pcre2_set_offset_limit_,BITONE)(G(a,BITONE),b); \
+  else \
+    G(pcre2_set_offset_limit_,BITTWO)(G(a,BITTWO),b)
+
+#define PCRE2_SET_PARENS_NEST_LIMIT(a,b) \
+  if (test_mode == G(G(PCRE,BITONE),_MODE)) \
+    G(pcre2_set_parens_nest_limit_,BITONE)(G(a,BITONE),b); \
+  else \
+    G(pcre2_set_parens_nest_limit_,BITTWO)(G(a,BITTWO),b)
+
+#define PCRE2_SET_RECURSION_LIMIT(a,b) \
+  if (test_mode == G(G(PCRE,BITONE),_MODE)) \
+    G(pcre2_set_recursion_limit_,BITONE)(G(a,BITONE),b); \
+  else \
+    G(pcre2_set_recursion_limit_,BITTWO)(G(a,BITTWO),b)
+
+#define PCRE2_SUBSTITUTE(a,b,c,d,e,f,g,h,i,j,k,l) \
+  if (test_mode == G(G(PCRE,BITONE),_MODE)) \
+    a = G(pcre2_substitute_,BITONE)(G(b,BITONE),(G(PCRE2_SPTR,BITONE))c,d,e,f, \
+      G(g,BITONE),G(h,BITONE),(G(PCRE2_SPTR,BITONE))i,j, \
+      (G(PCRE2_UCHAR,BITONE) *)k,l); \
+  else \
+    a = G(pcre2_substitute_,BITTWO)(G(b,BITTWO),(G(PCRE2_SPTR,BITTWO))c,d,e,f, \
+      G(g,BITTWO),G(h,BITTWO),(G(PCRE2_SPTR,BITTWO))i,j, \
+      (G(PCRE2_UCHAR,BITTWO) *)k,l)
+
+#define PCRE2_SUBSTRING_COPY_BYNAME(a,b,c,d,e) \
+  if (test_mode == G(G(PCRE,BITONE),_MODE)) \
+    a = G(pcre2_substring_copy_byname_,BITONE)(G(b,BITONE),G(c,BITONE),\
+      (G(PCRE2_UCHAR,BITONE) *)d,e); \
+  else \
+    a = G(pcre2_substring_copy_byname_,BITTWO)(G(b,BITTWO),G(c,BITTWO),\
+      (G(PCRE2_UCHAR,BITTWO) *)d,e)
+
+#define PCRE2_SUBSTRING_COPY_BYNUMBER(a,b,c,d,e) \
+  if (test_mode == G(G(PCRE,BITONE),_MODE)) \
+    a = G(pcre2_substring_copy_bynumber_,BITONE)(G(b,BITONE),c,\
+      (G(PCRE2_UCHAR,BITONE) *)d,e); \
+  else \
+    a = G(pcre2_substring_copy_bynumber_,BITTWO)(G(b,BITTWO),c,\
+      (G(PCRE2_UCHAR,BITTWO) *)d,e)
+
+#define PCRE2_SUBSTRING_FREE(a) \
+  if (test_mode == G(G(PCRE,BITONE),_MODE)) \
+    G(pcre2_substring_free_,BITONE)((G(PCRE2_UCHAR,BITONE) *)a); \
+  else G(pcre2_substring_free_,BITTWO)((G(PCRE2_UCHAR,BITTWO) *)a)
+
+#define PCRE2_SUBSTRING_GET_BYNAME(a,b,c,d,e) \
+  if (test_mode == G(G(PCRE,BITONE),_MODE)) \
+    a = G(pcre2_substring_get_byname_,BITONE)(G(b,BITONE),G(c,BITONE),\
+      (G(PCRE2_UCHAR,BITONE) **)d,e); \
+  else \
+    a = G(pcre2_substring_get_byname_,BITTWO)(G(b,BITTWO),G(c,BITTWO),\
+      (G(PCRE2_UCHAR,BITTWO) **)d,e)
+
+#define PCRE2_SUBSTRING_GET_BYNUMBER(a,b,c,d,e) \
+  if (test_mode == G(G(PCRE,BITONE),_MODE)) \
+    a = G(pcre2_substring_get_bynumber_,BITONE)(G(b,BITONE),c,\
+      (G(PCRE2_UCHAR,BITONE) **)d,e); \
+  else \
+    a = G(pcre2_substring_get_bynumber_,BITTWO)(G(b,BITTWO),c,\
+      (G(PCRE2_UCHAR,BITTWO) **)d,e)
+
+#define PCRE2_SUBSTRING_LENGTH_BYNAME(a,b,c,d) \
+  if (test_mode == G(G(PCRE,BITONE),_MODE)) \
+    a = G(pcre2_substring_length_byname_,BITONE)(G(b,BITONE),G(c,BITONE),d); \
+  else \
+    a = G(pcre2_substring_length_byname_,BITTWO)(G(b,BITTWO),G(c,BITTWO),d)
+
+#define PCRE2_SUBSTRING_LENGTH_BYNUMBER(a,b,c,d) \
+  if (test_mode == G(G(PCRE,BITONE),_MODE)) \
+    a = G(pcre2_substring_length_bynumber_,BITONE)(G(b,BITONE),c,d); \
+  else \
+    a = G(pcre2_substring_length_bynumber_,BITTWO)(G(b,BITTWO),c,d)
+
+#define PCRE2_SUBSTRING_LIST_GET(a,b,c,d) \
+  if (test_mode == G(G(PCRE,BITONE),_MODE)) \
+    a = G(pcre2_substring_list_get_,BITONE)(G(b,BITONE), \
+      (G(PCRE2_UCHAR,BITONE) ***)c,d); \
+  else \
+    a = G(pcre2_substring_list_get_,BITTWO)(G(b,BITTWO), \
+      (G(PCRE2_UCHAR,BITTWO) ***)c,d)
+
+#define PCRE2_SUBSTRING_LIST_FREE(a) \
+  if (test_mode == G(G(PCRE,BITONE),_MODE)) \
+    G(pcre2_substring_list_free_,BITONE)((G(PCRE2_SPTR,BITONE) *)a); \
+  else \
+    G(pcre2_substring_list_free_,BITTWO)((G(PCRE2_SPTR,BITTWO) *)a)
+
+#define PCRE2_SUBSTRING_NUMBER_FROM_NAME(a,b,c) \
+  if (test_mode == G(G(PCRE,BITONE),_MODE)) \
+    a = G(pcre2_substring_number_from_name_,BITONE)(G(b,BITONE),G(c,BITONE)); \
+  else \
+    a = G(pcre2_substring_number_from_name_,BITTWO)(G(b,BITTWO),G(c,BITTWO))
+
+#define PTR(x) ( \
+  (test_mode == G(G(PCRE,BITONE),_MODE))? (void *)G(x,BITONE) : \
+  (void *)G(x,BITTWO))
+
+#define SETFLD(x,y,z) \
+  if (test_mode == G(G(PCRE,BITONE),_MODE)) G(x,BITONE)->y = z; \
+  else G(x,BITTWO)->y = z
+
+#define SETFLDVEC(x,y,v,z) \
+  if (test_mode == G(G(PCRE,BITONE),_MODE)) G(x,BITONE)->y[v] = z; \
+  else G(x,BITTWO)->y[v] = z
+
+#define SETOP(x,y,z) \
+  if (test_mode == G(G(PCRE,BITONE),_MODE)) G(x,BITONE) z y; \
+  else G(x,BITTWO) z y
+
+#define SETCASTPTR(x,y) \
+  if (test_mode == G(G(PCRE,BITONE),_MODE)) \
+    G(x,BITONE) = (G(G(uint,BITONE),_t) *)(y); \
+  else \
+    G(x,BITTWO) = (G(G(uint,BITTWO),_t) *)(y)
+
+#define STRLEN(p) ((test_mode == G(G(PCRE,BITONE),_MODE))? \
+  G(strlen,BITONE)((G(PCRE2_SPTR,BITONE))p) : \
+  G(strlen,BITTWO)((G(PCRE2_SPTR,BITTWO))p))
+
+#define SUB1(a,b) \
+  if (test_mode == G(G(PCRE,BITONE),_MODE)) \
+    G(a,BITONE)(G(b,BITONE)); \
+  else \
+    G(a,BITTWO)(G(b,BITTWO))
+
+#define SUB2(a,b,c) \
+  if (test_mode == G(G(PCRE,BITONE),_MODE)) \
+    G(a,BITONE))(G(b,BITONE),G(c,BITONE)); \
+  else \
+    G(a,BITTWO))(G(b,BITTWO),G(c,BITTWO))
+
+#define TEST(x,r,y) ( \
+  (test_mode == G(G(PCRE,BITONE),_MODE) && G(x,BITONE) r (y)) || \
+  (test_mode == G(G(PCRE,BITTWO),_MODE) && G(x,BITTWO) r (y)))
+
+#define TESTFLD(x,f,r,y) ( \
+  (test_mode == G(G(PCRE,BITONE),_MODE) && G(x,BITONE)->f r (y)) || \
+  (test_mode == G(G(PCRE,BITTWO),_MODE) && G(x,BITTWO)->f r (y)))
+
+
+#endif  /* Two out of three modes */
+
+/* ----- End of cases where more than one mode is supported ----- */
+
+
+/* ----- Only 8-bit mode is supported ----- */
+
+#elif defined SUPPORT_PCRE2_8
+#define CASTFLD(t,a,b) (t)(G(a,8)->b)
+#define CASTVAR(t,x) (t)G(x,8)
+#define CODE_UNIT(a,b) (uint32_t)(((PCRE2_SPTR8)(a))[b])
+#define DATCTXCPY(a,b) memcpy(G(a,8),G(b,8),sizeof(pcre2_match_context_8))
+#define FLD(a,b) G(a,8)->b
+#define PATCTXCPY(a,b) memcpy(G(a,8),G(b,8),sizeof(pcre2_compile_context_8))
+#define PCHARS(lv, p, offset, len, utf, f) \
+  lv = pchars8((PCRE2_SPTR8)(p)+offset, len, utf, f)
+#define PCHARSV(p, offset, len, utf, f) \
+  (void)pchars8((PCRE2_SPTR8)(p)+offset, len, utf, f)
+#define PCRE2_CALLOUT_ENUMERATE(a,b,c) \
+   a = pcre2_callout_enumerate_8(compiled_code8, \
+     (int (*)(struct pcre2_callout_enumerate_block_8 *, void *))b,c)
+#define PCRE2_COMPILE(a,b,c,d,e,f,g) \
+  G(a,8) = pcre2_compile_8(G(b,8),c,d,e,f,g)
+#define PCRE2_DFA_MATCH(a,b,c,d,e,f,g,h,i,j) \
+  a = pcre2_dfa_match_8(G(b,8),(PCRE2_SPTR8)c,d,e,f,G(g,8),h,i,j)
+#define PCRE2_GET_ERROR_MESSAGE(r,a,b) \
+  r = pcre2_get_error_message_8(a,G(b,8),G(G(b,8),_size))
+#define PCRE2_GET_OVECTOR_COUNT(a,b) a = pcre2_get_ovector_count_8(G(b,8))
+#define PCRE2_GET_STARTCHAR(a,b) a = pcre2_get_startchar_8(G(b,8))
+#define PCRE2_JIT_COMPILE(r,a,b) r = pcre2_jit_compile_8(G(a,8),b)
+#define PCRE2_JIT_FREE_UNUSED_MEMORY(a) pcre2_jit_free_unused_memory_8(G(a,8))
+#define PCRE2_JIT_MATCH(a,b,c,d,e,f,g,h) \
+  a = pcre2_jit_match_8(G(b,8),(PCRE2_SPTR8)c,d,e,f,G(g,8),h)
+#define PCRE2_JIT_STACK_CREATE(a,b,c,d) \
+  a = (PCRE2_JIT_STACK *)pcre2_jit_stack_create_8(b,c,d);
+#define PCRE2_JIT_STACK_ASSIGN(a,b,c) \
+  pcre2_jit_stack_assign_8(G(a,8),(pcre2_jit_callback_8)b,c);
+#define PCRE2_JIT_STACK_FREE(a) pcre2_jit_stack_free_8((pcre2_jit_stack_8 *)a);
+#define PCRE2_MAKETABLES(a) a = pcre2_maketables_8(NULL)
+#define PCRE2_MATCH(a,b,c,d,e,f,g,h) \
+  a = pcre2_match_8(G(b,8),(PCRE2_SPTR8)c,d,e,f,G(g,8),h)
+#define PCRE2_MATCH_DATA_CREATE(a,b,c) G(a,8) = pcre2_match_data_create_8(b,c)
+#define PCRE2_MATCH_DATA_CREATE_FROM_PATTERN(a,b,c) \
+  G(a,8) = pcre2_match_data_create_from_pattern_8(G(b,8),c)
+#define PCRE2_MATCH_DATA_FREE(a) pcre2_match_data_free_8(G(a,8))
+#define PCRE2_PATTERN_INFO(a,b,c,d) a = pcre2_pattern_info_8(G(b,8),c,d)
+#define PCRE2_PRINTINT(a) pcre2_printint_8(compiled_code8,outfile,a)
+#define PCRE2_SERIALIZE_DECODE(r,a,b,c,d) \
+  r = pcre2_serialize_decode_8((pcre2_code_8 **)a,b,c,G(d,8))
+#define PCRE2_SERIALIZE_ENCODE(r,a,b,c,d,e) \
+  r = pcre2_serialize_encode_8((const pcre2_code_8 **)a,b,c,d,G(e,8))
+#define PCRE2_SERIALIZE_FREE(a) pcre2_serialize_free_8(a)
+#define PCRE2_SERIALIZE_GET_NUMBER_OF_CODES(r,a) \
+  r = pcre2_serialize_get_number_of_codes_8(a)
+#define PCRE2_SET_CALLOUT(a,b,c) \
+  pcre2_set_callout_8(G(a,8),(int (*)(pcre2_callout_block_8 *, void *))b,c)
+#define PCRE2_SET_CHARACTER_TABLES(a,b) pcre2_set_character_tables_8(G(a,8),b)
+#define PCRE2_SET_COMPILE_RECURSION_GUARD(a,b,c) \
+  pcre2_set_compile_recursion_guard_8(G(a,8),b,c)
+#define PCRE2_SET_MATCH_LIMIT(a,b) pcre2_set_match_limit_8(G(a,8),b)
+#define PCRE2_SET_MAX_PATTERN_LENGTH(a,b) pcre2_set_max_pattern_length_8(G(a,8),b)
+#define PCRE2_SET_OFFSET_LIMIT(a,b) pcre2_set_offset_limit_8(G(a,8),b)
+#define PCRE2_SET_PARENS_NEST_LIMIT(a,b) pcre2_set_parens_nest_limit_8(G(a,8),b)
+#define PCRE2_SET_RECURSION_LIMIT(a,b) pcre2_set_recursion_limit_8(G(a,8),b)
+#define PCRE2_SUBSTITUTE(a,b,c,d,e,f,g,h,i,j,k,l) \
+  a = pcre2_substitute_8(G(b,8),(PCRE2_SPTR8)c,d,e,f,G(g,8),G(h,8), \
+    (PCRE2_SPTR8)i,j,(PCRE2_UCHAR8 *)k,l)
+#define PCRE2_SUBSTRING_COPY_BYNAME(a,b,c,d,e) \
+  a = pcre2_substring_copy_byname_8(G(b,8),G(c,8),(PCRE2_UCHAR8 *)d,e)
+#define PCRE2_SUBSTRING_COPY_BYNUMBER(a,b,c,d,e) \
+  a = pcre2_substring_copy_bynumber_8(G(b,8),c,(PCRE2_UCHAR8 *)d,e)
+#define PCRE2_SUBSTRING_FREE(a) pcre2_substring_free_8((PCRE2_UCHAR8 *)a)
+#define PCRE2_SUBSTRING_GET_BYNAME(a,b,c,d,e) \
+  a = pcre2_substring_get_byname_8(G(b,8),G(c,8),(PCRE2_UCHAR8 **)d,e)
+#define PCRE2_SUBSTRING_GET_BYNUMBER(a,b,c,d,e) \
+  a = pcre2_substring_get_bynumber_8(G(b,8),c,(PCRE2_UCHAR8 **)d,e)
+#define PCRE2_SUBSTRING_LENGTH_BYNAME(a,b,c,d) \
+    a = pcre2_substring_length_byname_8(G(b,8),G(c,8),d)
+#define PCRE2_SUBSTRING_LENGTH_BYNUMBER(a,b,c,d) \
+    a = pcre2_substring_length_bynumber_8(G(b,8),c,d)
+#define PCRE2_SUBSTRING_LIST_GET(a,b,c,d) \
+  a = pcre2_substring_list_get_8(G(b,8),(PCRE2_UCHAR8 ***)c,d)
+#define PCRE2_SUBSTRING_LIST_FREE(a) \
+  pcre2_substring_list_free_8((PCRE2_SPTR8 *)a)
+#define PCRE2_SUBSTRING_NUMBER_FROM_NAME(a,b,c) \
+  a = pcre2_substring_number_from_name_8(G(b,8),G(c,8));
+#define PTR(x) (void *)G(x,8)
+#define SETFLD(x,y,z) G(x,8)->y = z
+#define SETFLDVEC(x,y,v,z) G(x,8)->y[v] = z
+#define SETOP(x,y,z) G(x,8) z y
+#define SETCASTPTR(x,y) G(x,8) = (uint8_t *)(y)
+#define STRLEN(p) (int)strlen((char *)p)
+#define SUB1(a,b) G(a,8)(G(b,8))
+#define SUB2(a,b,c) G(a,8)(G(b,8),G(c,8))
+#define TEST(x,r,y) (G(x,8) r (y))
+#define TESTFLD(x,f,r,y) (G(x,8)->f r (y))
+
+
+/* ----- Only 16-bit mode is supported ----- */
+
+#elif defined SUPPORT_PCRE2_16
+#define CASTFLD(t,a,b) (t)(G(a,16)->b)
+#define CASTVAR(t,x) (t)G(x,16)
+#define CODE_UNIT(a,b) (uint32_t)(((PCRE2_SPTR16)(a))[b])
+#define DATCTXCPY(a,b) memcpy(G(a,16),G(b,16),sizeof(pcre2_match_context_16))
+#define FLD(a,b) G(a,16)->b
+#define PATCTXCPY(a,b) memcpy(G(a,16),G(b,16),sizeof(pcre2_compile_context_16))
+#define PCHARS(lv, p, offset, len, utf, f) \
+  lv = pchars16((PCRE2_SPTR16)(p)+offset, len, utf, f)
+#define PCHARSV(p, offset, len, utf, f) \
+  (void)pchars16((PCRE2_SPTR16)(p)+offset, len, utf, f)
+#define PCRE2_CALLOUT_ENUMERATE(a,b,c) \
+   a = pcre2_callout_enumerate_16(compiled_code16, \
+     (int (*)(struct pcre2_callout_enumerate_block_16 *, void *))b,c)
+#define PCRE2_COMPILE(a,b,c,d,e,f,g) \
+  G(a,16) = pcre2_compile_16(G(b,16),c,d,e,f,g)
+#define PCRE2_DFA_MATCH(a,b,c,d,e,f,g,h,i,j) \
+  a = pcre2_dfa_match_16(G(b,16),(PCRE2_SPTR16)c,d,e,f,G(g,16),h,i,j)
+#define PCRE2_GET_ERROR_MESSAGE(r,a,b) \
+  r = pcre2_get_error_message_16(a,G(b,16),G(G(b,16),_size))
+#define PCRE2_GET_OVECTOR_COUNT(a,b) a = pcre2_get_ovector_count_16(G(b,16))
+#define PCRE2_GET_STARTCHAR(a,b) a = pcre2_get_startchar_16(G(b,16))
+#define PCRE2_JIT_COMPILE(r,a,b) r = pcre2_jit_compile_16(G(a,16),b)
+#define PCRE2_JIT_FREE_UNUSED_MEMORY(a) pcre2_jit_free_unused_memory_16(G(a,16))
+#define PCRE2_JIT_MATCH(a,b,c,d,e,f,g,h) \
+  a = pcre2_jit_match_16(G(b,16),(PCRE2_SPTR16)c,d,e,f,G(g,16),h)
+#define PCRE2_JIT_STACK_CREATE(a,b,c,d) \
+  a = (PCRE2_JIT_STACK *)pcre2_jit_stack_create_16(b,c,d);
+#define PCRE2_JIT_STACK_ASSIGN(a,b,c) \
+  pcre2_jit_stack_assign_16(G(a,16),(pcre2_jit_callback_16)b,c);
+#define PCRE2_JIT_STACK_FREE(a) pcre2_jit_stack_free_16((pcre2_jit_stack_16 *)a);
+#define PCRE2_MAKETABLES(a) a = pcre2_maketables_16(NULL)
+#define PCRE2_MATCH(a,b,c,d,e,f,g,h) \
+  a = pcre2_match_16(G(b,16),(PCRE2_SPTR16)c,d,e,f,G(g,16),h)
+#define PCRE2_MATCH_DATA_CREATE(a,b,c) G(a,16) = pcre2_match_data_create_16(b,c)
+#define PCRE2_MATCH_DATA_CREATE_FROM_PATTERN(a,b,c) \
+  G(a,16) = pcre2_match_data_create_from_pattern_16(G(b,16),c)
+#define PCRE2_MATCH_DATA_FREE(a) pcre2_match_data_free_16(G(a,16))
+#define PCRE2_PATTERN_INFO(a,b,c,d) a = pcre2_pattern_info_16(G(b,16),c,d)
+#define PCRE2_PRINTINT(a) pcre2_printint_16(compiled_code16,outfile,a)
+#define PCRE2_SERIALIZE_DECODE(r,a,b,c,d) \
+  r = pcre2_serialize_decode_16((pcre2_code_16 **)a,b,c,G(d,16))
+#define PCRE2_SERIALIZE_ENCODE(r,a,b,c,d,e) \
+  r = pcre2_serialize_encode_16((const pcre2_code_16 **)a,b,c,d,G(e,16))
+#define PCRE2_SERIALIZE_FREE(a) pcre2_serialize_free_16(a)
+#define PCRE2_SERIALIZE_GET_NUMBER_OF_CODES(r,a) \
+  r = pcre2_serialize_get_number_of_codes_16(a)
+#define PCRE2_SET_CALLOUT(a,b,c) \
+  pcre2_set_callout_16(G(a,16),(int (*)(pcre2_callout_block_16 *, void *))b,c);
+#define PCRE2_SET_CHARACTER_TABLES(a,b) pcre2_set_character_tables_16(G(a,16),b)
+#define PCRE2_SET_COMPILE_RECURSION_GUARD(a,b,c) \
+  pcre2_set_compile_recursion_guard_16(G(a,16),b,c)
+#define PCRE2_SET_MATCH_LIMIT(a,b) pcre2_set_match_limit_16(G(a,16),b)
+#define PCRE2_SET_MAX_PATTERN_LENGTH(a,b) pcre2_set_max_pattern_length_16(G(a,16),b)
+#define PCRE2_SET_OFFSET_LIMIT(a,b) pcre2_set_offset_limit_16(G(a,16),b)
+#define PCRE2_SET_PARENS_NEST_LIMIT(a,b) pcre2_set_parens_nest_limit_16(G(a,16),b)
+#define PCRE2_SET_RECURSION_LIMIT(a,b) pcre2_set_recursion_limit_16(G(a,16),b)
+#define PCRE2_SUBSTITUTE(a,b,c,d,e,f,g,h,i,j,k,l) \
+  a = pcre2_substitute_16(G(b,16),(PCRE2_SPTR16)c,d,e,f,G(g,16),G(h,16), \
+    (PCRE2_SPTR16)i,j,(PCRE2_UCHAR16 *)k,l)
+#define PCRE2_SUBSTRING_COPY_BYNAME(a,b,c,d,e) \
+  a = pcre2_substring_copy_byname_16(G(b,16),G(c,16),(PCRE2_UCHAR16 *)d,e)
+#define PCRE2_SUBSTRING_COPY_BYNUMBER(a,b,c,d,e) \
+  a = pcre2_substring_copy_bynumber_16(G(b,16),c,(PCRE2_UCHAR16 *)d,e)
+#define PCRE2_SUBSTRING_FREE(a) pcre2_substring_free_16((PCRE2_UCHAR16 *)a)
+#define PCRE2_SUBSTRING_GET_BYNAME(a,b,c,d,e) \
+  a = pcre2_substring_get_byname_16(G(b,16),G(c,16),(PCRE2_UCHAR16 **)d,e)
+#define PCRE2_SUBSTRING_GET_BYNUMBER(a,b,c,d,e) \
+  a = pcre2_substring_get_bynumber_16(G(b,16),c,(PCRE2_UCHAR16 **)d,e)
+#define PCRE2_SUBSTRING_LENGTH_BYNAME(a,b,c,d) \
+    a = pcre2_substring_length_byname_16(G(b,16),G(c,16),d)
+#define PCRE2_SUBSTRING_LENGTH_BYNUMBER(a,b,c,d) \
+    a = pcre2_substring_length_bynumber_16(G(b,16),c,d)
+#define PCRE2_SUBSTRING_LIST_GET(a,b,c,d) \
+  a = pcre2_substring_list_get_16(G(b,16),(PCRE2_UCHAR16 ***)c,d)
+#define PCRE2_SUBSTRING_LIST_FREE(a) \
+  pcre2_substring_list_free_16((PCRE2_SPTR16 *)a)
+#define PCRE2_SUBSTRING_NUMBER_FROM_NAME(a,b,c) \
+  a = pcre2_substring_number_from_name_16(G(b,16),G(c,16));
+#define PTR(x) (void *)G(x,16)
+#define SETFLD(x,y,z) G(x,16)->y = z
+#define SETFLDVEC(x,y,v,z) G(x,16)->y[v] = z
+#define SETOP(x,y,z) G(x,16) z y
+#define SETCASTPTR(x,y) G(x,16) = (uint16_t *)(y)
+#define STRLEN(p) (int)strlen16((PCRE2_SPTR16)p)
+#define SUB1(a,b) G(a,16)(G(b,16))
+#define SUB2(a,b,c) G(a,16)(G(b,16),G(c,16))
+#define TEST(x,r,y) (G(x,16) r (y))
+#define TESTFLD(x,f,r,y) (G(x,16)->f r (y))
+
+
+/* ----- Only 32-bit mode is supported ----- */
+
+#elif defined SUPPORT_PCRE2_32
+#define CASTFLD(t,a,b) (t)(G(a,32)->b)
+#define CASTVAR(t,x) (t)G(x,32)
+#define CODE_UNIT(a,b) (uint32_t)(((PCRE2_SPTR32)(a))[b])
+#define DATCTXCPY(a,b) memcpy(G(a,32),G(b,32),sizeof(pcre2_match_context_32))
+#define FLD(a,b) G(a,32)->b
+#define PATCTXCPY(a,b) memcpy(G(a,32),G(b,32),sizeof(pcre2_compile_context_32))
+#define PCHARS(lv, p, offset, len, utf, f) \
+  lv = pchars32((PCRE2_SPTR32)(p)+offset, len, utf, f)
+#define PCHARSV(p, offset, len, utf, f) \
+  (void)pchars32((PCRE2_SPTR32)(p)+offset, len, utf, f)
+#define PCRE2_CALLOUT_ENUMERATE(a,b,c) \
+   a = pcre2_callout_enumerate_32(compiled_code32, \
+     (int (*)(struct pcre2_callout_enumerate_block_32 *, void *))b,c)
+#define PCRE2_COMPILE(a,b,c,d,e,f,g) \
+  G(a,32) = pcre2_compile_32(G(b,32),c,d,e,f,g)
+#define PCRE2_DFA_MATCH(a,b,c,d,e,f,g,h,i,j) \
+  a = pcre2_dfa_match_32(G(b,32),(PCRE2_SPTR32)c,d,e,f,G(g,32),h,i,j)
+#define PCRE2_GET_ERROR_MESSAGE(r,a,b) \
+  r = pcre2_get_error_message_32(a,G(b,32),G(G(b,32),_size))
+#define PCRE2_GET_OVECTOR_COUNT(a,b) a = pcre2_get_ovector_count_32(G(b,32))
+#define PCRE2_GET_STARTCHAR(a,b) a = pcre2_get_startchar_32(G(b,32))
+#define PCRE2_JIT_COMPILE(r,a,b) r = pcre2_jit_compile_32(G(a,32),b)
+#define PCRE2_JIT_FREE_UNUSED_MEMORY(a) pcre2_jit_free_unused_memory_32(G(a,32))
+#define PCRE2_JIT_MATCH(a,b,c,d,e,f,g,h) \
+  a = pcre2_jit_match_32(G(b,32),(PCRE2_SPTR32)c,d,e,f,G(g,32),h)
+#define PCRE2_JIT_STACK_CREATE(a,b,c,d) \
+  a = (PCRE2_JIT_STACK *)pcre2_jit_stack_create_32(b,c,d);
+#define PCRE2_JIT_STACK_ASSIGN(a,b,c) \
+  pcre2_jit_stack_assign_32(G(a,32),(pcre2_jit_callback_32)b,c);
+#define PCRE2_JIT_STACK_FREE(a) pcre2_jit_stack_free_32((pcre2_jit_stack_32 *)a);
+#define PCRE2_MAKETABLES(a) a = pcre2_maketables_32(NULL)
+#define PCRE2_MATCH(a,b,c,d,e,f,g,h) \
+  a = pcre2_match_32(G(b,32),(PCRE2_SPTR32)c,d,e,f,G(g,32),h)
+#define PCRE2_MATCH_DATA_CREATE(a,b,c) G(a,32) = pcre2_match_data_create_32(b,c)
+#define PCRE2_MATCH_DATA_CREATE_FROM_PATTERN(a,b,c) \
+  G(a,32) = pcre2_match_data_create_from_pattern_32(G(b,32),c)
+#define PCRE2_MATCH_DATA_FREE(a) pcre2_match_data_free_32(G(a,32))
+#define PCRE2_PATTERN_INFO(a,b,c,d) a = pcre2_pattern_info_32(G(b,32),c,d)
+#define PCRE2_PRINTINT(a) pcre2_printint_32(compiled_code32,outfile,a)
+#define PCRE2_SERIALIZE_DECODE(r,a,b,c,d) \
+  r = pcre2_serialize_decode_32((pcre2_code_32 **)a,b,c,G(d,32))
+#define PCRE2_SERIALIZE_ENCODE(r,a,b,c,d,e) \
+  r = pcre2_serialize_encode_32((const pcre2_code_32 **)a,b,c,d,G(e,32))
+#define PCRE2_SERIALIZE_FREE(a) pcre2_serialize_free_32(a)
+#define PCRE2_SERIALIZE_GET_NUMBER_OF_CODES(r,a) \
+  r = pcre2_serialize_get_number_of_codes_32(a)
+#define PCRE2_SET_CALLOUT(a,b,c) \
+  pcre2_set_callout_32(G(a,32),(int (*)(pcre2_callout_block_32 *, void *))b,c);
+#define PCRE2_SET_CHARACTER_TABLES(a,b) pcre2_set_character_tables_32(G(a,32),b)
+#define PCRE2_SET_COMPILE_RECURSION_GUARD(a,b,c) \
+  pcre2_set_compile_recursion_guard_32(G(a,32),b,c)
+#define PCRE2_SET_MATCH_LIMIT(a,b) pcre2_set_match_limit_32(G(a,32),b)
+#define PCRE2_SET_MAX_PATTERN_LENGTH(a,b) pcre2_set_max_pattern_length_32(G(a,32),b)
+#define PCRE2_SET_OFFSET_LIMIT(a,b) pcre2_set_offset_limit_32(G(a,32),b)
+#define PCRE2_SET_PARENS_NEST_LIMIT(a,b) pcre2_set_parens_nest_limit_32(G(a,32),b)
+#define PCRE2_SET_RECURSION_LIMIT(a,b) pcre2_set_recursion_limit_32(G(a,32),b)
+#define PCRE2_SUBSTITUTE(a,b,c,d,e,f,g,h,i,j,k,l) \
+  a = pcre2_substitute_32(G(b,32),(PCRE2_SPTR32)c,d,e,f,G(g,32),G(h,32), \
+    (PCRE2_SPTR32)i,j,(PCRE2_UCHAR32 *)k,l)
+#define PCRE2_SUBSTRING_COPY_BYNAME(a,b,c,d,e) \
+  a = pcre2_substring_copy_byname_32(G(b,32),G(c,32),(PCRE2_UCHAR32 *)d,e)
+#define PCRE2_SUBSTRING_COPY_BYNUMBER(a,b,c,d,e) \
+  a = pcre2_substring_copy_bynumber_32(G(b,32),c,(PCRE2_UCHAR32 *)d,e);
+#define PCRE2_SUBSTRING_FREE(a) pcre2_substring_free_32((PCRE2_UCHAR32 *)a)
+#define PCRE2_SUBSTRING_GET_BYNAME(a,b,c,d,e) \
+  a = pcre2_substring_get_byname_32(G(b,32),G(c,32),(PCRE2_UCHAR32 **)d,e)
+#define PCRE2_SUBSTRING_GET_BYNUMBER(a,b,c,d,e) \
+  a = pcre2_substring_get_bynumber_32(G(b,32),c,(PCRE2_UCHAR32 **)d,e)
+#define PCRE2_SUBSTRING_LENGTH_BYNAME(a,b,c,d) \
+    a = pcre2_substring_length_byname_32(G(b,32),G(c,32),d)
+#define PCRE2_SUBSTRING_LENGTH_BYNUMBER(a,b,c,d) \
+    a = pcre2_substring_length_bynumber_32(G(b,32),c,d)
+#define PCRE2_SUBSTRING_LIST_GET(a,b,c,d) \
+  a = pcre2_substring_list_get_32(G(b,32),(PCRE2_UCHAR32 ***)c,d)
+#define PCRE2_SUBSTRING_LIST_FREE(a) \
+  pcre2_substring_list_free_32((PCRE2_SPTR32 *)a)
+#define PCRE2_SUBSTRING_NUMBER_FROM_NAME(a,b,c) \
+  a = pcre2_substring_number_from_name_32(G(b,32),G(c,32));
+#define PTR(x) (void *)G(x,32)
+#define SETFLD(x,y,z) G(x,32)->y = z
+#define SETFLDVEC(x,y,v,z) G(x,32)->y[v] = z
+#define SETOP(x,y,z) G(x,32) z y
+#define SETCASTPTR(x,y) G(x,32) = (uint32_t *)(y)
+#define STRLEN(p) (int)strlen32((PCRE2_SPTR32)p)
+#define SUB1(a,b) G(a,32)(G(b,32))
+#define SUB2(a,b,c) G(a,32)(G(b,32),G(c,32))
+#define TEST(x,r,y) (G(x,32) r (y))
+#define TESTFLD(x,f,r,y) (G(x,32)->f r (y))
+
+#endif
+
+/* ----- End of mode-specific function call macros ----- */
+
+
+
+
+/*************************************************
+*         Alternate character tables             *
+*************************************************/
+
+/* By default, the "tables" pointer in the compile context when calling
+pcre2_compile() is not set (= NULL), thereby using the default tables of the
+library. However, the tables modifier can be used to select alternate sets of
+tables, for different kinds of testing. Note that the locale modifier also
+adjusts the tables. */
+
+/* This is the set of tables distributed as default with PCRE2. It recognizes
+only ASCII characters. */
+
+static const uint8_t tables1[] = {
+
+/* This table is a lower casing table. */
+
+    0,  1,  2,  3,  4,  5,  6,  7,
+    8,  9, 10, 11, 12, 13, 14, 15,
+   16, 17, 18, 19, 20, 21, 22, 23,
+   24, 25, 26, 27, 28, 29, 30, 31,
+   32, 33, 34, 35, 36, 37, 38, 39,
+   40, 41, 42, 43, 44, 45, 46, 47,
+   48, 49, 50, 51, 52, 53, 54, 55,
+   56, 57, 58, 59, 60, 61, 62, 63,
+   64, 97, 98, 99,100,101,102,103,
+  104,105,106,107,108,109,110,111,
+  112,113,114,115,116,117,118,119,
+  120,121,122, 91, 92, 93, 94, 95,
+   96, 97, 98, 99,100,101,102,103,
+  104,105,106,107,108,109,110,111,
+  112,113,114,115,116,117,118,119,
+  120,121,122,123,124,125,126,127,
+  128,129,130,131,132,133,134,135,
+  136,137,138,139,140,141,142,143,
+  144,145,146,147,148,149,150,151,
+  152,153,154,155,156,157,158,159,
+  160,161,162,163,164,165,166,167,
+  168,169,170,171,172,173,174,175,
+  176,177,178,179,180,181,182,183,
+  184,185,186,187,188,189,190,191,
+  192,193,194,195,196,197,198,199,
+  200,201,202,203,204,205,206,207,
+  208,209,210,211,212,213,214,215,
+  216,217,218,219,220,221,222,223,
+  224,225,226,227,228,229,230,231,
+  232,233,234,235,236,237,238,239,
+  240,241,242,243,244,245,246,247,
+  248,249,250,251,252,253,254,255,
+
+/* This table is a case flipping table. */
+
+    0,  1,  2,  3,  4,  5,  6,  7,
+    8,  9, 10, 11, 12, 13, 14, 15,
+   16, 17, 18, 19, 20, 21, 22, 23,
+   24, 25, 26, 27, 28, 29, 30, 31,
+   32, 33, 34, 35, 36, 37, 38, 39,
+   40, 41, 42, 43, 44, 45, 46, 47,
+   48, 49, 50, 51, 52, 53, 54, 55,
+   56, 57, 58, 59, 60, 61, 62, 63,
+   64, 97, 98, 99,100,101,102,103,
+  104,105,106,107,108,109,110,111,
+  112,113,114,115,116,117,118,119,
+  120,121,122, 91, 92, 93, 94, 95,
+   96, 65, 66, 67, 68, 69, 70, 71,
+   72, 73, 74, 75, 76, 77, 78, 79,
+   80, 81, 82, 83, 84, 85, 86, 87,
+   88, 89, 90,123,124,125,126,127,
+  128,129,130,131,132,133,134,135,
+  136,137,138,139,140,141,142,143,
+  144,145,146,147,148,149,150,151,
+  152,153,154,155,156,157,158,159,
+  160,161,162,163,164,165,166,167,
+  168,169,170,171,172,173,174,175,
+  176,177,178,179,180,181,182,183,
+  184,185,186,187,188,189,190,191,
+  192,193,194,195,196,197,198,199,
+  200,201,202,203,204,205,206,207,
+  208,209,210,211,212,213,214,215,
+  216,217,218,219,220,221,222,223,
+  224,225,226,227,228,229,230,231,
+  232,233,234,235,236,237,238,239,
+  240,241,242,243,244,245,246,247,
+  248,249,250,251,252,253,254,255,
+
+/* This table contains bit maps for various character classes. Each map is 32
+bytes long and the bits run from the least significant end of each byte. The
+classes that have their own maps are: space, xdigit, digit, upper, lower, word,
+graph, print, punct, and cntrl. Other classes are built from combinations. */
+
+  0x00,0x3e,0x00,0x00,0x01,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+
+  0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x03,
+  0x7e,0x00,0x00,0x00,0x7e,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+
+  0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x03,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0xfe,0xff,0xff,0x07,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0x07,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+
+  0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x03,
+  0xfe,0xff,0xff,0x87,0xfe,0xff,0xff,0x07,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+
+  0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+
+  0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+
+  0x00,0x00,0x00,0x00,0xfe,0xff,0x00,0xfc,
+  0x01,0x00,0x00,0xf8,0x01,0x00,0x00,0x78,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+
+  0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+
+/* This table identifies various classes of character by individual bits:
+  0x01   white space character
+  0x02   letter
+  0x04   decimal digit
+  0x08   hexadecimal digit
+  0x10   alphanumeric or '_'
+  0x80   regular expression metacharacter or binary zero
+*/
+
+  0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*   0-  7 */
+  0x00,0x01,0x01,0x01,0x01,0x01,0x00,0x00, /*   8- 15 */
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  16- 23 */
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  24- 31 */
+  0x01,0x00,0x00,0x00,0x80,0x00,0x00,0x00, /*    - '  */
+  0x80,0x80,0x80,0x80,0x00,0x00,0x80,0x00, /*  ( - /  */
+  0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c, /*  0 - 7  */
+  0x1c,0x1c,0x00,0x00,0x00,0x00,0x00,0x80, /*  8 - ?  */
+  0x00,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x12, /*  @ - G  */
+  0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /*  H - O  */
+  0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /*  P - W  */
+  0x12,0x12,0x12,0x80,0x80,0x00,0x80,0x10, /*  X - _  */
+  0x00,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x12, /*  ` - g  */
+  0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /*  h - o  */
+  0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /*  p - w  */
+  0x12,0x12,0x12,0x80,0x80,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 */
+
+/* This is a set of tables that came originally from a Windows user. It seems
+to be at least an approximation of ISO 8859. In particular, there are
+characters greater than 128 that are marked as spaces, letters, etc. */
+
+static const uint8_t tables2[] = {
+0,1,2,3,4,5,6,7,
+8,9,10,11,12,13,14,15,
+16,17,18,19,20,21,22,23,
+24,25,26,27,28,29,30,31,
+32,33,34,35,36,37,38,39,
+40,41,42,43,44,45,46,47,
+48,49,50,51,52,53,54,55,
+56,57,58,59,60,61,62,63,
+64,97,98,99,100,101,102,103,
+104,105,106,107,108,109,110,111,
+112,113,114,115,116,117,118,119,
+120,121,122,91,92,93,94,95,
+96,97,98,99,100,101,102,103,
+104,105,106,107,108,109,110,111,
+112,113,114,115,116,117,118,119,
+120,121,122,123,124,125,126,127,
+128,129,130,131,132,133,134,135,
+136,137,138,139,140,141,142,143,
+144,145,146,147,148,149,150,151,
+152,153,154,155,156,157,158,159,
+160,161,162,163,164,165,166,167,
+168,169,170,171,172,173,174,175,
+176,177,178,179,180,181,182,183,
+184,185,186,187,188,189,190,191,
+224,225,226,227,228,229,230,231,
+232,233,234,235,236,237,238,239,
+240,241,242,243,244,245,246,215,
+248,249,250,251,252,253,254,223,
+224,225,226,227,228,229,230,231,
+232,233,234,235,236,237,238,239,
+240,241,242,243,244,245,246,247,
+248,249,250,251,252,253,254,255,
+0,1,2,3,4,5,6,7,
+8,9,10,11,12,13,14,15,
+16,17,18,19,20,21,22,23,
+24,25,26,27,28,29,30,31,
+32,33,34,35,36,37,38,39,
+40,41,42,43,44,45,46,47,
+48,49,50,51,52,53,54,55,
+56,57,58,59,60,61,62,63,
+64,97,98,99,100,101,102,103,
+104,105,106,107,108,109,110,111,
+112,113,114,115,116,117,118,119,
+120,121,122,91,92,93,94,95,
+96,65,66,67,68,69,70,71,
+72,73,74,75,76,77,78,79,
+80,81,82,83,84,85,86,87,
+88,89,90,123,124,125,126,127,
+128,129,130,131,132,133,134,135,
+136,137,138,139,140,141,142,143,
+144,145,146,147,148,149,150,151,
+152,153,154,155,156,157,158,159,
+160,161,162,163,164,165,166,167,
+168,169,170,171,172,173,174,175,
+176,177,178,179,180,181,182,183,
+184,185,186,187,188,189,190,191,
+224,225,226,227,228,229,230,231,
+232,233,234,235,236,237,238,239,
+240,241,242,243,244,245,246,215,
+248,249,250,251,252,253,254,223,
+192,193,194,195,196,197,198,199,
+200,201,202,203,204,205,206,207,
+208,209,210,211,212,213,214,247,
+216,217,218,219,220,221,222,255,
+0,62,0,0,1,0,0,0,
+0,0,0,0,0,0,0,0,
+32,0,0,0,1,0,0,0,
+0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,255,3,
+126,0,0,0,126,0,0,0,
+0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,255,3,
+0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,12,2,
+0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,
+254,255,255,7,0,0,0,0,
+0,0,0,0,0,0,0,0,
+255,255,127,127,0,0,0,0,
+0,0,0,0,0,0,0,0,
+0,0,0,0,254,255,255,7,
+0,0,0,0,0,4,32,4,
+0,0,0,128,255,255,127,255,
+0,0,0,0,0,0,255,3,
+254,255,255,135,254,255,255,7,
+0,0,0,0,0,4,44,6,
+255,255,127,255,255,255,127,255,
+0,0,0,0,254,255,255,255,
+255,255,255,255,255,255,255,127,
+0,0,0,0,254,255,255,255,
+255,255,255,255,255,255,255,255,
+0,2,0,0,255,255,255,255,
+255,255,255,255,255,255,255,127,
+0,0,0,0,255,255,255,255,
+255,255,255,255,255,255,255,255,
+0,0,0,0,254,255,0,252,
+1,0,0,248,1,0,0,120,
+0,0,0,0,254,255,255,255,
+0,0,128,0,0,0,128,0,
+255,255,255,255,0,0,0,0,
+0,0,0,0,0,0,0,128,
+255,255,255,255,0,0,0,0,
+0,0,0,0,0,0,0,0,
+128,0,0,0,0,0,0,0,
+0,1,1,0,1,1,0,0,
+0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,
+1,0,0,0,128,0,0,0,
+128,128,128,128,0,0,128,0,
+28,28,28,28,28,28,28,28,
+28,28,0,0,0,0,0,128,
+0,26,26,26,26,26,26,18,
+18,18,18,18,18,18,18,18,
+18,18,18,18,18,18,18,18,
+18,18,18,128,128,0,128,16,
+0,26,26,26,26,26,26,18,
+18,18,18,18,18,18,18,18,
+18,18,18,18,18,18,18,18,
+18,18,18,128,128,0,0,0,
+0,0,0,0,0,1,0,0,
+0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,
+1,0,0,0,0,0,0,0,
+0,0,18,0,0,0,0,0,
+0,0,20,20,0,18,0,0,
+0,20,18,0,0,0,0,0,
+18,18,18,18,18,18,18,18,
+18,18,18,18,18,18,18,18,
+18,18,18,18,18,18,18,0,
+18,18,18,18,18,18,18,18,
+18,18,18,18,18,18,18,18,
+18,18,18,18,18,18,18,18,
+18,18,18,18,18,18,18,0,
+18,18,18,18,18,18,18,18
+};
+
+
+
+/*************************************************
+*            Local memory functions              *
+*************************************************/
+
+/* Alternative memory functions, to test functionality. */
+
+static void *my_malloc(size_t size, void *data)
+{
+void *block = malloc(size);
+(void)data;
+if (show_memory)
+  fprintf(outfile, "malloc       %3d %p\n", (int)size, block);
+return block;
+}
+
+static void my_free(void *block, void *data)
+{
+(void)data;
+if (show_memory)
+  fprintf(outfile, "free             %p\n", block);
+free(block);
+}
+
+/* For recursion malloc/free, to test stacking calls */
+
+#ifdef HEAP_MATCH_RECURSE
+static void *my_stack_malloc(size_t size, void *data)
+{
+void *block = malloc(size);
+(void)data;
+if (show_memory)
+  fprintf(outfile, "stack_malloc %3d %p\n", (int)size, block);
+return block;
+}
+
+static void my_stack_free(void *block, void *data)
+{
+(void)data;
+if (show_memory)
+  fprintf(outfile, "stack_free       %p\n", block);
+free(block);
+}
+#endif  /* HEAP_MATCH_RECURSE */
+
+
+/*************************************************
+*       Callback function for stack guard        *
+*************************************************/
+
+/* This is set up to be called from pcre2_compile() when the stackguard=n
+modifier sets a value greater than zero. The test we do is whether the
+parenthesis nesting depth is greater than the value set by the modifier.
+
+Argument:  the current parenthesis nesting depth
+Returns:   non-zero to kill the compilation
+*/
+
+static int
+stack_guard(uint32_t depth, void *user_data)
+{
+(void)user_data;
+return depth > pat_patctl.stackguard_test;
+}
+
+
+/*************************************************
+*         JIT memory callback                    *
+*************************************************/
+
+static PCRE2_JIT_STACK*
+jit_callback(void *arg)
+{
+jit_was_used = TRUE;
+return (PCRE2_JIT_STACK *)arg;
+}
+
+
+/*************************************************
+*      Convert UTF-8 character to code point     *
+*************************************************/
+
+/* This function reads one or more bytes that represent a UTF-8 character,
+and returns the codepoint of that character. Note that the function supports
+the original UTF-8 definition of RFC 2279, allowing for values in the range 0
+to 0x7fffffff, up to 6 bytes long. This makes it possible to generate
+codepoints greater than 0x10ffff which are useful for testing PCRE2's error
+checking, and also for generating 32-bit non-UTF data values above the UTF
+limit.
+
+Argument:
+  utf8bytes   a pointer to the byte vector
+  vptr        a pointer to an int to receive the value
+
+Returns:      >  0 => the number of bytes consumed
+              -6 to 0 => malformed UTF-8 character at offset = (-return)
+*/
+
+static int
+utf82ord(PCRE2_SPTR8 utf8bytes, uint32_t *vptr)
+{
+uint32_t c = *utf8bytes++;
+uint32_t d = c;
+int i, j, s;
+
+for (i = -1; i < 6; i++)               /* i is number of additional bytes */
+  {
+  if ((d & 0x80) == 0) break;
+  d <<= 1;
+  }
+
+if (i == -1) { *vptr = c; return 1; }  /* ascii character */
+if (i == 0 || i == 6) return 0;        /* invalid UTF-8 */
+
+/* i now has a value in the range 1-5 */
+
+s = 6*i;
+d = (c & utf8_table3[i]) << s;
+
+for (j = 0; j < i; j++)
+  {
+  c = *utf8bytes++;
+  if ((c & 0xc0) != 0x80) return -(j+1);
+  s -= 6;
+  d |= (c & 0x3f) << s;
+  }
+
+/* Check that encoding was the correct unique one */
+
+for (j = 0; j < utf8_table1_size; j++)
+  if (d <= (uint32_t)utf8_table1[j]) break;
+if (j != i) return -(i+1);
+
+/* Valid value */
+
+*vptr = d;
+return i+1;
+}
+
+
+
+/*************************************************
+*             Print one character                *
+*************************************************/
+
+/* Print a single character either literally, or as a hex escape, and count how
+many printed characters are used.
+
+Arguments:
+  c            the character
+  utf          TRUE in UTF mode
+  f            the FILE to print to, or NULL just to count characters
+
+Returns:       number of characters written
+*/
+
+static int
+pchar(uint32_t c, BOOL utf, FILE *f)
+{
+int n = 0;
+if (PRINTOK(c))
+  {
+  if (f != NULL) fprintf(f, "%c", c);
+  return 1;
+  }
+
+if (c < 0x100)
+  {
+  if (utf)
+    {
+    if (f != NULL) fprintf(f, "\\x{%02x}", c);
+    return 6;
+    }
+  else
+    {
+    if (f != NULL) fprintf(f, "\\x%02x", c);
+    return 4;
+    }
+  }
+
+if (f != NULL) n = fprintf(f, "\\x{%02x}", c);
+return n >= 0 ? n : 0;
+}
+
+
+
+#ifdef SUPPORT_PCRE2_16
+/*************************************************
+*    Find length of 0-terminated 16-bit string   *
+*************************************************/
+
+static size_t strlen16(PCRE2_SPTR16 p)
+{
+PCRE2_SPTR16 pp = p;
+while (*pp != 0) pp++;
+return (int)(pp - p);
+}
+#endif  /* SUPPORT_PCRE2_16 */
+
+
+
+#ifdef SUPPORT_PCRE2_32
+/*************************************************
+*    Find length of 0-terminated 32-bit string   *
+*************************************************/
+
+static size_t strlen32(PCRE2_SPTR32 p)
+{
+PCRE2_SPTR32 pp = p;
+while (*pp != 0) pp++;
+return (int)(pp - p);
+}
+#endif  /* SUPPORT_PCRE2_32 */
+
+
+#ifdef SUPPORT_PCRE2_8
+/*************************************************
+*         Print 8-bit character string           *
+*************************************************/
+
+/* Must handle UTF-8 strings in utf8 mode. Yields number of characters printed.
+For printing *MARK strings, a negative length is given. If handed a NULL file,
+just counts chars without printing. */
+
+static int pchars8(PCRE2_SPTR8 p, int length, BOOL utf, FILE *f)
+{
+uint32_t c = 0;
+int yield = 0;
+if (length < 0) length = p[-1];
+while (length-- > 0)
+  {
+  if (utf)
+    {
+    int rc = utf82ord(p, &c);
+    if (rc > 0 && rc <= length + 1)   /* Mustn't run over the end */
+      {
+      length -= rc - 1;
+      p += rc;
+      yield += pchar(c, utf, f);
+      continue;
+      }
+    }
+  c = *p++;
+  yield += pchar(c, utf, f);
+  }
+return yield;
+}
+#endif
+
+
+#ifdef SUPPORT_PCRE2_16
+/*************************************************
+*           Print 16-bit character string        *
+*************************************************/
+
+/* Must handle UTF-16 strings in utf mode. Yields number of characters printed.
+For printing *MARK strings, a negative length is given. If handed a NULL file,
+just counts chars without printing. */
+
+static int pchars16(PCRE2_SPTR16 p, int length, BOOL utf, FILE *f)
+{
+int yield = 0;
+if (length < 0) length = p[-1];
+while (length-- > 0)
+  {
+  uint32_t c = *p++ & 0xffff;
+  if (utf && c >= 0xD800 && c < 0xDC00 && length > 0)
+    {
+    int d = *p & 0xffff;
+    if (d >= 0xDC00 && d <= 0xDFFF)
+      {
+      c = ((c & 0x3ff) << 10) + (d & 0x3ff) + 0x10000;
+      length--;
+      p++;
+      }
+    }
+  yield += pchar(c, utf, f);
+  }
+return yield;
+}
+#endif  /* SUPPORT_PCRE2_16 */
+
+
+
+#ifdef SUPPORT_PCRE2_32
+/*************************************************
+*           Print 32-bit character string        *
+*************************************************/
+
+/* Must handle UTF-32 strings in utf mode. Yields number of characters printed.
+For printing *MARK strings, a negative length is given.If handed a NULL file,
+just counts chars without printing. */
+
+static int pchars32(PCRE2_SPTR32 p, int length, BOOL utf, FILE *f)
+{
+int yield = 0;
+(void)(utf);  /* Avoid compiler warning */
+if (length < 0) length = p[-1];
+while (length-- > 0)
+  {
+  uint32_t c = *p++;
+  yield += pchar(c, utf, f);
+  }
+return yield;
+}
+#endif  /* SUPPORT_PCRE2_32 */
+
+
+
+
+#ifdef SUPPORT_PCRE2_8
+/*************************************************
+*       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
+  utf8bytes  pointer to buffer for result - at least 6 bytes long
+
+Returns:     number of characters placed in the buffer
+*/
+
+static int
+ord2utf8(uint32_t cvalue, uint8_t *utf8bytes)
+{
+register int i, j;
+if (cvalue > 0x7fffffffu)
+  return -1;
+for (i = 0; i < utf8_table1_size; i++)
+  if (cvalue <= (uint32_t)utf8_table1[i]) break;
+utf8bytes += i;
+for (j = i; j > 0; j--)
+ {
+ *utf8bytes-- = 0x80 | (cvalue & 0x3f);
+ cvalue >>= 6;
+ }
+*utf8bytes = utf8_table2[i] | cvalue;
+return i + 1;
+}
+#endif  /* SUPPORT_PCRE2_8 */
+
+
+
+#ifdef SUPPORT_PCRE2_16
+/*************************************************
+*          Convert pattern to 16-bit             *
+*************************************************/
+
+/* In UTF mode the input is always interpreted as a string of UTF-8 bytes. If
+all the input bytes are ASCII, the space needed for a 16-bit string is exactly
+double the 8-bit size. Otherwise, the size needed for a 16-bit string is no
+more than double, because up to 0xffff uses no more than 3 bytes in UTF-8 but
+possibly 4 in UTF-16. Higher values use 4 bytes in UTF-8 and up to 4 bytes in
+UTF-16. The result is always left in pbuffer16. Impose a minimum size to save
+repeated re-sizing.
+
+Note that this function does not object to surrogate values. This is
+deliberate; it makes it possible to construct UTF-16 strings that are invalid,
+for the purpose of testing that they are correctly faulted.
+
+Arguments:
+  p          points to a byte string
+  utf        non-zero if converting to UTF-16
+  lenptr     points to number of bytes in the string (excluding trailing zero)
+
+Returns:     0 on success, with the length updated to the number of 16-bit
+               data items used (excluding the trailing zero)
+             OR -1 if a UTF-8 string is malformed
+             OR -2 if a value > 0x10ffff is encountered in UTF mode
+             OR -3 if a value > 0xffff is encountered when not in UTF mode
+*/
+
+static PCRE2_SIZE
+to16(uint8_t *p, int utf, PCRE2_SIZE *lenptr)
+{
+uint16_t *pp;
+PCRE2_SIZE len = *lenptr;
+
+if (pbuffer16_size < 2*len + 2)
+  {
+  if (pbuffer16 != NULL) free(pbuffer16);
+  pbuffer16_size = 2*len + 2;
+  if (pbuffer16_size < 256) pbuffer16_size = 256;
+  pbuffer16 = (uint16_t *)malloc(pbuffer16_size);
+  if (pbuffer16 == NULL)
+    {
+    fprintf(stderr, "pcre2test: malloc(%lu) failed for pbuffer16\n",
+      (unsigned long int)pbuffer16_size);
+    exit(1);
+    }
+  }
+
+pp = pbuffer16;
+if (!utf)
+  {
+  for (; len > 0; len--) *pp++ = *p++;
+  }
+else while (len > 0)
+  {
+  uint32_t c;
+  int chlen = utf82ord(p, &c);
+  if (chlen <= 0) return -1;
+  if (c > 0x10ffff) return -2;
+  p += chlen;
+  len -= chlen;
+  if (c < 0x10000) *pp++ = c; else
+    {
+    if (!utf) return -3;
+    c -= 0x10000;
+    *pp++ = 0xD800 | (c >> 10);
+    *pp++ = 0xDC00 | (c & 0x3ff);
+    }
+  }
+
+*pp = 0;
+*lenptr = pp - pbuffer16;
+return 0;
+}
+#endif
+
+
+
+#ifdef SUPPORT_PCRE2_32
+/*************************************************
+*          Convert pattern to 32-bit             *
+*************************************************/
+
+/* In UTF mode the input is always interpreted as a string of UTF-8 bytes. If
+all the input bytes are ASCII, the space needed for a 32-bit string is exactly
+four times the 8-bit size. Otherwise, the size needed for a 32-bit string is no
+more than four times, because the number of characters must be less than the
+number of bytes. The result is always left in pbuffer32. Impose a minimum size
+to save repeated re-sizing.
+
+Note that this function does not object to surrogate values. This is
+deliberate; it makes it possible to construct UTF-32 strings that are invalid,
+for the purpose of testing that they are correctly faulted.
+
+Arguments:
+  p          points to a byte string
+  utf        true if UTF-8 (to be converted to UTF-32)
+  lenptr     points to number of bytes in the string (excluding trailing zero)
+
+Returns:     0 on success, with the length updated to the number of 32-bit
+               data items used (excluding the trailing zero)
+             OR -1 if a UTF-8 string is malformed
+             OR -2 if a value > 0x10ffff is encountered in UTF mode
+*/
+
+static PCRE2_SIZE
+to32(uint8_t *p, int utf, PCRE2_SIZE *lenptr)
+{
+uint32_t *pp;
+PCRE2_SIZE len = *lenptr;
+
+if (pbuffer32_size < 4*len + 4)
+  {
+  if (pbuffer32 != NULL) free(pbuffer32);
+  pbuffer32_size = 4*len + 4;
+  if (pbuffer32_size < 256) pbuffer32_size = 256;
+  pbuffer32 = (uint32_t *)malloc(pbuffer32_size);
+  if (pbuffer32 == NULL)
+    {
+    fprintf(stderr, "pcre2test: malloc(%lu) failed for pbuffer32\n",
+      (unsigned long int)pbuffer32_size);
+    exit(1);
+    }
+  }
+
+pp = pbuffer32;
+if (!utf)
+  {
+  for (; len > 0; len--) *pp++ = *p++;
+  }
+else while (len > 0)
+  {
+  uint32_t c;
+  int chlen = utf82ord(p, &c);
+  if (chlen <= 0) return -1;
+  if (utf && c > 0x10ffff) return -2;
+  p += chlen;
+  len -= chlen;
+  *pp++ = c;
+  }
+
+*pp = 0;
+*lenptr = pp - pbuffer32;
+return 0;
+}
+#endif /* SUPPORT_PCRE2_32 */
+
+
+
+/*************************************************
+*         Move back by so many characters        *
+*************************************************/
+
+/* Given a code unit offset in a subject string, move backwards by a number of
+characters, and return the resulting offset.
+
+Arguments:
+  subject   pointer to the string
+  offset    start offset
+  count     count to move back by
+  utf       TRUE if in UTF mode
+
+Returns:   a possibly changed offset
+*/
+
+static PCRE2_SIZE
+backchars(uint8_t *subject, PCRE2_SIZE offset, uint32_t count, BOOL utf)
+{
+if (!utf || test_mode == PCRE32_MODE)
+  return (count >= offset)? 0 : (offset - count);
+
+else if (test_mode == PCRE8_MODE)
+  {
+  PCRE2_SPTR8 pp = (PCRE2_SPTR8)subject + offset;
+  for (; count > 0 && pp > (PCRE2_SPTR8)subject; count--)
+    {
+    pp--;
+    while ((*pp & 0xc0) == 0x80) pp--;
+    }
+  return pp - (PCRE2_SPTR8)subject;
+  }
+
+else  /* 16-bit mode */
+  {
+  PCRE2_SPTR16 pp = (PCRE2_SPTR16)subject + offset;
+  for (; count > 0 && pp > (PCRE2_SPTR16)subject; count--)
+    {
+    pp--;
+    if ((*pp & 0xfc00) == 0xdc00) pp--;
+    }
+  return pp - (PCRE2_SPTR16)subject;
+  }
+}
+
+
+
+/*************************************************
+*           Expand input buffers                 *
+*************************************************/
+
+/* This function doubles the size of the input buffer and the buffer for
+keeping an 8-bit copy of patterns (pbuffer8), and copies the current buffers to
+the new ones.
+
+Arguments: none
+Returns:   nothing (aborts if malloc() fails)
+*/
+
+static void
+expand_input_buffers(void)
+{
+int new_pbuffer8_size = 2*pbuffer8_size;
+uint8_t *new_buffer = (uint8_t *)malloc(new_pbuffer8_size);
+uint8_t *new_pbuffer8 = (uint8_t *)malloc(new_pbuffer8_size);
+
+if (new_buffer == NULL || new_pbuffer8 == NULL)
+  {
+  fprintf(stderr, "pcre2test: malloc(%d) failed\n", new_pbuffer8_size);
+  exit(1);
+  }
+
+memcpy(new_buffer, buffer, pbuffer8_size);
+memcpy(new_pbuffer8, pbuffer8, pbuffer8_size);
+
+pbuffer8_size = new_pbuffer8_size;
+
+free(buffer);
+free(pbuffer8);
+
+buffer = new_buffer;
+pbuffer8 = new_pbuffer8;
+}
+
+
+
+/*************************************************
+*        Read or extend an input line            *
+*************************************************/
+
+/* Input lines are read into buffer, but both patterns and data lines can be
+continued over multiple input lines. In addition, if the buffer fills up, we
+want to automatically expand it so as to be able to handle extremely large
+lines that are needed for certain stress tests. When the input buffer is
+expanded, the other two buffers must also be expanded likewise, and the
+contents of pbuffer, which are a copy of the input for callouts, must be
+preserved (for when expansion happens for a data line). This is not the most
+optimal way of handling this, but hey, this is just a test program!
+
+Arguments:
+  f            the file to read
+  start        where in buffer to start (this *must* be within buffer)
+  prompt       for stdin or readline()
+
+Returns:       pointer to the start of new data
+               could be a copy of start, or could be moved
+               NULL if no data read and EOF reached
+*/
+
+static uint8_t *
+extend_inputline(FILE *f, uint8_t *start, const char *prompt)
+{
+uint8_t *here = start;
+
+for (;;)
+  {
+  size_t rlen = (size_t)(pbuffer8_size - (here - buffer));
+
+  if (rlen > 1000)
+    {
+    int dlen;
+
+    /* If libreadline or libedit support is required, use readline() to read a
+    line if the input is a terminal. Note that readline() removes the trailing
+    newline, so we must put it back again, to be compatible with fgets(). */
+
+#if defined(SUPPORT_LIBREADLINE) || defined(SUPPORT_LIBEDIT)
+    if (INTERACTIVE(f))
+      {
+      size_t len;
+      char *s = readline(prompt);
+      if (s == NULL) return (here == start)? NULL : start;
+      len = strlen(s);
+      if (len > 0) add_history(s);
+      if (len > rlen - 1) len = rlen - 1;
+      memcpy(here, s, len);
+      here[len] = '\n';
+      here[len+1] = 0;
+      free(s);
+      }
+    else
+#endif
+
+    /* Read the next line by normal means, prompting if the file is a tty. */
+
+      {
+      if (INTERACTIVE(f)) printf("%s", prompt);
+      if (fgets((char *)here, rlen,  f) == NULL)
+        return (here == start)? NULL : start;
+      }
+
+    dlen = (int)strlen((char *)here);
+    if (dlen > 0 && here[dlen - 1] == '\n') return start;
+    here += dlen;
+    }
+
+  else
+    {
+    size_t start_offset = start - buffer;
+    size_t here_offset = here - buffer;
+    expand_input_buffers();
+    start = buffer + start_offset;
+    here = buffer + here_offset;
+    }
+  }
+
+/* Control never gets here */
+}
+
+
+
+/*************************************************
+*         Case-independent strncmp() function    *
+*************************************************/
+
+/*
+Arguments:
+  s         first string
+  t         second string
+  n         number of characters to compare
+
+Returns:    < 0, = 0, or > 0, according to the comparison
+*/
+
+static int
+strncmpic(const uint8_t *s, const uint8_t *t, int n)
+{
+while (n--)
+  {
+  int c = tolower(*s++) - tolower(*t++);
+  if (c) return c;
+  }
+return 0;
+}
+
+
+
+/*************************************************
+*          Scan the main modifier list           *
+*************************************************/
+
+/* This function searches the modifier list for a long modifier name.
+
+Argument:
+  p         start of the name
+  lenp      length of the name
+
+Returns:    an index in the modifier list, or -1 on failure
+*/
+
+static int
+scan_modifiers(const uint8_t *p, unsigned int len)
+{
+int bot = 0;
+int top = MODLISTCOUNT;
+
+while (top > bot)
+  {
+  int mid = (bot + top)/2;
+  unsigned int mlen = strlen(modlist[mid].name);
+  int c = strncmp((char *)p, modlist[mid].name, (len < mlen)? len : mlen);
+  if (c == 0)
+    {
+    if (len == mlen) return mid;
+    c = (int)len - (int)mlen;
+    }
+  if (c > 0) bot = mid + 1; else top = mid;
+  }
+
+return -1;
+
+}
+
+
+
+/*************************************************
+*        Check a modifer and find its field      *
+*************************************************/
+
+/* This function is called when a modifier has been identified. We check that
+it is allowed here and find the field that is to be changed.
+
+Arguments:
+  m          the modifier list entry
+  ctx        CTX_PAT     => pattern context
+             CTX_POPPAT  => pattern context for popped pattern
+             CTX_DEFPAT  => default pattern context
+             CTX_DAT     => data context
+             CTX_DEFDAT  => default data context
+  pctl       point to pattern control block
+  dctl       point to data control block
+  c          a single character or 0
+
+Returns:     a field pointer or NULL
+*/
+
+static void *
+check_modifier(modstruct *m, int ctx, patctl *pctl, datctl *dctl, uint32_t c)
+{
+void *field = NULL;
+PCRE2_SIZE offset = m->offset;
+
+if (restrict_for_perl_test) switch(m->which)
+  {
+  case MOD_PNDP:
+  case MOD_PATP:
+  case MOD_PDP:
+  break;
+
+  default:
+  fprintf(outfile, "** '%s' is not allowed in a Perl-compatible test\n",
+    m->name);
+  return NULL;
+  }
+
+switch (m->which)
+  {
+  case MOD_CTC:  /* Compile context modifier */
+  if (ctx == CTX_DEFPAT) field = PTR(default_pat_context);
+    else if (ctx == CTX_PAT) field = PTR(pat_context);
+  break;
+
+  case MOD_CTM:  /* Match context modifier */
+  if (ctx == CTX_DEFDAT) field = PTR(default_dat_context);
+    else if (ctx == CTX_DAT) field = PTR(dat_context);
+  break;
+
+  case MOD_DAT:  /* Data line modifier */
+  if (dctl != NULL) field = dctl;
+  break;
+
+  case MOD_PAT:    /* Pattern modifier */
+  case MOD_PATP:   /* Allowed for Perl test */
+  if (pctl != NULL) field = pctl;
+  break;
+
+  case MOD_PD:   /* Pattern or data line modifier */
+  case MOD_PDP:  /* Ditto, allowed for Perl test */
+  case MOD_PND:  /* Ditto, but not default pattern */
+  case MOD_PNDP: /* Ditto, allowed for Perl test */
+  if (dctl != NULL) field = dctl;
+    else if (pctl != NULL && (m->which == MOD_PD || ctx != CTX_DEFPAT))
+      field = pctl;
+  break;
+  }
+
+if (field == NULL)
+  {
+  if (c == 0)
+    fprintf(outfile, "** '%s' is not valid here\n", m->name);
+  else
+    fprintf(outfile, "** /%c is not valid here\n", c);
+  return NULL;
+  }
+
+return (char *)field + offset;
+}
+
+
+
+/*************************************************
+*            Decode a modifier list              *
+*************************************************/
+
+/* A pointer to a control block is NULL when called in cases when that block is
+not relevant. They are never all relevant in one call. At least one of patctl
+and datctl is NULL. The second argument specifies which context to use for
+modifiers that apply to contexts.
+
+Arguments:
+  p          point to modifier string
+  ctx        CTX_PAT     => pattern context
+             CTX_POPPAT  => pattern context for popped pattern
+             CTX_DEFPAT  => default pattern context
+             CTX_DAT     => data context
+             CTX_DEFDAT  => default data context
+  pctl       point to pattern control block
+  dctl       point to data control block
+
+Returns: TRUE if successful decode, FALSE otherwise
+*/
+
+static BOOL
+decode_modifiers(uint8_t *p, int ctx, patctl *pctl, datctl *dctl)
+{
+uint8_t *ep, *pp;
+long li;
+unsigned long uli;
+BOOL first = TRUE;
+
+for (;;)
+  {
+  void *field;
+  modstruct *m;
+  BOOL off = FALSE;
+  unsigned int i, len;
+  int index;
+  char *endptr;
+
+  /* Skip white space and commas. */
+
+  while (isspace(*p) || *p == ',') p++;
+  if (*p == 0) break;
+
+  /* Find the end of the item; lose trailing whitespace at end of line. */
+
+  for (ep = p; *ep != 0 && *ep != ','; ep++);
+  if (*ep == 0)
+    {
+    while (ep > p && isspace(ep[-1])) ep--;
+    *ep = 0;
+    }
+
+  /* Remember if the first character is '-'. */
+
+  if (*p == '-')
+    {
+    off = TRUE;
+    p++;
+    }
+
+  /* Find the length of a full-length modifier name, and scan for it. */
+
+  pp = p;
+  while (pp < ep && *pp != '=') pp++;
+  index = scan_modifiers(p, pp - p);
+
+  /* If the first modifier is unrecognized, try to interpret it as a sequence
+  of single-character abbreviated modifiers. None of these modifiers have any
+  associated data. They just set options or control bits. */
+
+  if (index < 0)
+    {
+    uint32_t cc;
+    uint8_t *mp = p;
+
+    if (!first)
+      {
+      fprintf(outfile, "** Unrecognized modifier '%.*s'\n", (int)(ep-p), p);
+      if (ep - p == 1)
+        fprintf(outfile, "** Single-character modifiers must come first\n");
+      return FALSE;
+      }
+
+    for (cc = *p; cc != ',' && cc != '\n' && cc != 0; cc = *(++p))
+      {
+      for (i = 0; i < C1MODLISTCOUNT; i++)
+        if (cc == c1modlist[i].onechar) break;
+
+      if (i >= C1MODLISTCOUNT)
+        {
+        fprintf(outfile, "** Unrecognized modifier '%c' in '%.*s'\n",
+          *p, (int)(ep-mp), mp);
+        return FALSE;
+        }
+
+      if (c1modlist[i].index >= 0)
+        {
+        index = c1modlist[i].index;
+        }
+
+      else
+        {
+        index = scan_modifiers((uint8_t *)(c1modlist[i].fullname),
+          strlen(c1modlist[i].fullname));
+        if (index < 0)
+          {
+          fprintf(outfile, "** Internal error: single-character equivalent "
+            "modifier '%s' not found\n", c1modlist[i].fullname);
+          return FALSE;
+          }
+        c1modlist[i].index = index;     /* Cache for next time */
+        }
+
+      field = check_modifier(modlist + index, ctx, pctl, dctl, *p);
+      if (field == NULL) return FALSE;
+      *((uint32_t *)field) |= modlist[index].value;
+      }
+
+    continue;    /* With tne next (fullname) modifier */
+    }
+
+  /* We have a match on a full-name modifier. Check for the existence of data
+  when needed. */
+
+  m = modlist + index;      /* Save typing */
+  if (m->type != MOD_CTL && m->type != MOD_OPT &&
+      (m->type != MOD_IND || *pp == '='))
+    {
+    if (*pp++ != '=')
+      {
+      fprintf(outfile, "** '=' expected after '%s'\n", m->name);
+      return FALSE;
+      }
+    if (off)
+      {
+      fprintf(outfile, "** '-' is not valid for '%s'\n", m->name);
+      return FALSE;
+      }
+    }
+
+  /* These on/off types have no data. */
+
+  else if (*pp != ',' && *pp != '\n' && *pp != ' ' && *pp != 0)
+    {
+    fprintf(outfile, "** Unrecognized modifier '%.*s'\n", (int)(ep-p), p);
+    return FALSE;
+    }
+
+  /* Set the data length for those types that have data. Then find the field
+  that is to be set. If check_modifier() returns NULL, it has already output an
+  error message. */
+
+  len = ep - pp;
+  field = check_modifier(m, ctx, pctl, dctl, 0);
+  if (field == NULL) return FALSE;
+
+  /* Process according to data type. */
+
+  switch (m->type)
+    {
+    case MOD_CTL:
+    case MOD_OPT:
+    if (off) *((uint32_t *)field) &= ~m->value;
+      else *((uint32_t *)field) |= m->value;
+    break;
+
+    case MOD_BSR:
+    if (len == 7 && strncmpic(pp, (const uint8_t *)"default", 7) == 0)
+      {
+#ifdef BSR_ANYCRLF
+      *((uint16_t *)field) = PCRE2_BSR_ANYCRLF;
+#else
+      *((uint16_t *)field) = PCRE2_BSR_UNICODE;
+#endif
+      if (ctx == CTX_PAT || ctx == CTX_DEFPAT) pctl->control &= ~CTL_BSR_SET;
+        else dctl->control &= ~CTL_BSR_SET;
+      }
+    else
+      {
+      if (len == 7 && strncmpic(pp, (const uint8_t *)"anycrlf", 7) == 0)
+        *((uint16_t *)field) = PCRE2_BSR_ANYCRLF;
+      else if (len == 7 && strncmpic(pp, (const uint8_t *)"unicode", 7) == 0)
+        *((uint16_t *)field) = PCRE2_BSR_UNICODE;
+      else goto INVALID_VALUE;
+      if (ctx == CTX_PAT || ctx == CTX_DEFPAT) pctl->control |= CTL_BSR_SET;
+        else dctl->control |= CTL_BSR_SET;
+      }
+    pp = ep;
+    break;
+
+    case MOD_IN2:    /* One or two unsigned integers */
+    if (!isdigit(*pp)) goto INVALID_VALUE;
+    uli = strtoul((const char *)pp, &endptr, 10);
+    if (U32OVERFLOW(uli)) goto INVALID_VALUE;
+    ((uint32_t *)field)[0] = (uint32_t)uli;
+    if (*endptr == ':')
+      {
+      uli = strtoul((const char *)endptr+1, &endptr, 10);
+      if (U32OVERFLOW(uli)) goto INVALID_VALUE;
+      ((uint32_t *)field)[1] = (uint32_t)uli;
+      }
+    else ((uint32_t *)field)[1] = 0;
+    pp = (uint8_t *)endptr;
+    break;
+
+    /* PCRE2_SIZE_MAX is usually SIZE_MAX, which may be greater, equal to, or
+    less than ULONG_MAX. So first test for overflowing the long int, and then
+    test for overflowing PCRE2_SIZE_MAX if it is smaller than ULONG_MAX. */
+
+    case MOD_SIZ:    /* PCRE2_SIZE value */
+    if (!isdigit(*pp)) goto INVALID_VALUE;
+    uli = strtoul((const char *)pp, &endptr, 10);
+    if (uli == ULONG_MAX) goto INVALID_VALUE;
+#if ULONG_MAX > PCRE2_SIZE_MAX
+    if (uli > PCRE2_SIZE_MAX) goto INVALID_VALUE;
+#endif
+    *((PCRE2_SIZE *)field) = (PCRE2_SIZE)uli;
+    pp = (uint8_t *)endptr;
+    break;
+
+    case MOD_IND:    /* Unsigned integer with default */
+    if (len == 0)
+      {
+      *((uint32_t *)field) = (uint32_t)(m->value);
+      break;
+      }
+    /* Fall through */
+
+    case MOD_INT:    /* Unsigned integer */
+    if (!isdigit(*pp)) goto INVALID_VALUE;
+    uli = strtoul((const char *)pp, &endptr, 10);
+    if (U32OVERFLOW(uli)) goto INVALID_VALUE;
+    *((uint32_t *)field) = (uint32_t)uli;
+    pp = (uint8_t *)endptr;
+    break;
+
+    case MOD_INS:   /* Signed integer */
+    if (!isdigit(*pp) && *pp != '-') goto INVALID_VALUE;
+    li = strtol((const char *)pp, &endptr, 10);
+    if (S32OVERFLOW(li)) goto INVALID_VALUE;
+    *((int32_t *)field) = (int32_t)li;
+    pp = (uint8_t *)endptr;
+    break;
+
+    case MOD_NL:
+    for (i = 0; i < sizeof(newlines)/sizeof(char *); i++)
+      if (len == strlen(newlines[i]) &&
+        strncmpic(pp, (const uint8_t *)newlines[i], len) == 0) break;
+    if (i >= sizeof(newlines)/sizeof(char *)) goto INVALID_VALUE;
+    if (i == 0)
+      {
+      *((uint16_t *)field) = NEWLINE_DEFAULT;
+      if (ctx == CTX_PAT || ctx == CTX_DEFPAT) pctl->control &= ~CTL_NL_SET;
+        else dctl->control &= ~CTL_NL_SET;
+      }
+    else
+      {
+      *((uint16_t *)field) = i;
+      if (ctx == CTX_PAT || ctx == CTX_DEFPAT) pctl->control |= CTL_NL_SET;
+        else dctl->control |= CTL_NL_SET;
+      }
+    pp = ep;
+    break;
+
+    case MOD_NN:              /* Name or (signed) number; may be several */
+    if (isdigit(*pp) || *pp == '-')
+      {
+      int ct = MAXCPYGET - 1;
+      int32_t value;
+      li = strtol((const char *)pp, &endptr, 10);
+      if (S32OVERFLOW(li)) goto INVALID_VALUE;
+      value = (int32_t)li;
+      field = (char *)field - m->offset + m->value;      /* Adjust field ptr */
+      if (value >= 0)                                    /* Add new number */
+        {
+        while (*((int32_t *)field) >= 0 && ct-- > 0)   /* Skip previous */
+          field = (char *)field + sizeof(int32_t);
+        if (ct <= 0)
+          {
+          fprintf(outfile, "** Too many numeric '%s' modifiers\n", m->name);
+          return FALSE;
+          }
+        }
+      *((int32_t *)field) = value;
+      if (ct > 0) ((int32_t *)field)[1] = -1;
+      pp = (uint8_t *)endptr;
+      }
+
+    /* Multiple strings are put end to end. */
+
+    else
+      {
+      char *nn = (char *)field;
+      if (len > 0)                    /* Add new name */
+        {
+        while (*nn != 0) nn += strlen(nn) + 1;
+        if (nn + len + 1 - (char *)field > LENCPYGET)
+          {
+          fprintf(outfile, "** Too many named '%s' modifiers\n", m->name);
+          return FALSE;
+          }
+        memcpy(nn, pp, len);
+        }
+      nn[len] = 0 ;
+      nn[len+1] = 0;
+      pp = ep;
+      }
+    break;
+
+    case MOD_STR:
+    if (len + 1 > m->value)
+      {
+      fprintf(outfile, "** Overlong value for '%s' (max %d code units)\n",
+        m->name, m->value - 1);
+      return FALSE;
+      }
+    memcpy(field, pp, len);
+    ((uint8_t *)field)[len] = 0;
+    pp = ep;
+    break;
+    }
+
+  if (*pp != ',' && *pp != '\n' && *pp != ' ' && *pp != 0)
+    {
+    fprintf(outfile, "** Comma expected after modifier item '%s'\n", m->name);
+    return FALSE;
+    }
+
+  p = pp;
+  first = FALSE;
+
+  if (ctx == CTX_POPPAT &&
+     (pctl->options != 0 ||
+      pctl->tables_id != 0 ||
+      pctl->locale[0] != 0 ||
+      (pctl->control & NOTPOP_CONTROLS) != 0))
+    {
+    fprintf(outfile, "** '%s' is not valid here\n", m->name);
+    return FALSE;
+    }
+  }
+
+return TRUE;
+
+INVALID_VALUE:
+fprintf(outfile, "** Invalid value in '%.*s'\n", (int)(ep-p), p);
+return FALSE;
+}
+
+
+/*************************************************
+*             Get info from a pattern            *
+*************************************************/
+
+/* A wrapped call to pcre2_pattern_info(), applied to the current compiled
+pattern.
+
+Arguments:
+  what        code for the required information
+  where       where to put the answer
+  unsetok     PCRE2_ERROR_UNSET is an "expected" result
+
+Returns:      the return from pcre2_pattern_info()
+*/
+
+static int
+pattern_info(int what, void *where, BOOL unsetok)
+{
+int rc;
+PCRE2_PATTERN_INFO(rc, compiled_code, what, where);
+if (rc >= 0) return 0;
+if (rc != PCRE2_ERROR_UNSET || !unsetok)
+  {
+  fprintf(outfile, "Error %d from pcre2_pattern_info_%d(%d)\n", rc, test_mode,
+    what);
+  if (rc == PCRE2_ERROR_BADMODE)
+    fprintf(outfile, "Running in %d-bit mode but pattern was compiled in "
+      "%d-bit mode\n", test_mode,
+      8 * (FLD(compiled_code, flags) & PCRE2_MODE_MASK));
+  }
+return rc;
+}
+
+
+
+#ifdef SUPPORT_PCRE2_8
+/*************************************************
+*             Show something in a list           *
+*************************************************/
+
+/* This function just helps to keep the code that uses it tidier. It's used for
+various lists of things where there needs to be introductory text before the
+first item. As these calls are all in the POSIX-support code, they happen only
+when 8-bit mode is supported. */
+
+static void
+prmsg(const char **msg, const char *s)
+{
+fprintf(outfile, "%s %s", *msg, s);
+*msg = "";
+}
+#endif  /* SUPPORT_PCRE2_8 */
+
+
+
+/*************************************************
+*                Show control bits               *
+*************************************************/
+
+/* Called for mutually exclusive controls and for unsupported POSIX controls.
+Because the bits are unique, this can be used for both pattern and data control
+words.
+
+Arguments:
+  controls    control bits
+  controls2   more control bits
+  before      text to print before
+
+Returns:      nothing
+*/
+
+static void
+show_controls(uint32_t controls, uint32_t controls2, const char *before)
+{
+fprintf(outfile, "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s",
+  before,
+  ((controls & CTL_AFTERTEXT) != 0)? " aftertext" : "",
+  ((controls & CTL_ALLAFTERTEXT) != 0)? " allaftertext" : "",
+  ((controls & CTL_ALLCAPTURES) != 0)? " allcaptures" : "",
+  ((controls & CTL_ALLUSEDTEXT) != 0)? " allusedtext" : "",
+  ((controls & CTL_ALTGLOBAL) != 0)? " altglobal" : "",
+  ((controls & CTL_BINCODE) != 0)? " bincode" : "",
+  ((controls & CTL_BSR_SET) != 0)? " bsr" : "",
+  ((controls & CTL_CALLOUT_CAPTURE) != 0)? " callout_capture" : "",
+  ((controls & CTL_CALLOUT_INFO) != 0)? " callout_info" : "",
+  ((controls & CTL_CALLOUT_NONE) != 0)? " callout_none" : "",
+  ((controls & CTL_DFA) != 0)? " dfa" : "",
+  ((controls & CTL_EXPAND) != 0)? " expand" : "",
+  ((controls & CTL_FINDLIMITS) != 0)? " find_limits" : "",
+  ((controls & CTL_FULLBINCODE) != 0)? " fullbincode" : "",
+  ((controls & CTL_GETALL) != 0)? " getall" : "",
+  ((controls & CTL_GLOBAL) != 0)? " global" : "",
+  ((controls & CTL_HEXPAT) != 0)? " hex" : "",
+  ((controls & CTL_INFO) != 0)? " info" : "",
+  ((controls & CTL_JITFAST) != 0)? " jitfast" : "",
+  ((controls & CTL_JITVERIFY) != 0)? " jitverify" : "",
+  ((controls & CTL_MARK) != 0)? " mark" : "",
+  ((controls & CTL_MEMORY) != 0)? " memory" : "",
+  ((controls & CTL_NL_SET) != 0)? " newline" : "",
+  ((controls & CTL_NULLCONTEXT) != 0)? " null_context" : "",
+  ((controls & CTL_POSIX) != 0)? " posix" : "",
+  ((controls & CTL_PUSH) != 0)? " push" : "",
+  ((controls & CTL_STARTCHAR) != 0)? " startchar" : "",
+  ((controls2 & CTL2_SUBSTITUTE_EXTENDED) != 0)? " substitute_extended" : "",
+  ((controls2 & CTL2_SUBSTITUTE_OVERFLOW_LENGTH) != 0)? " substitute_overflow_length" : "",
+  ((controls2 & CTL2_SUBSTITUTE_UNKNOWN_UNSET) != 0)? " substitute_unknown_unset" : "",
+  ((controls2 & CTL2_SUBSTITUTE_UNSET_EMPTY) != 0)? " substitute_unset_empty" : "",
+  ((controls & CTL_ZERO_TERMINATE) != 0)? " zero_terminate" : "");
+}
+
+
+
+/*************************************************
+*                Show compile options            *
+*************************************************/
+
+/* Called from show_pattern_info() and for unsupported POSIX options.
+
+Arguments:
+  options     an options word
+  before      text to print before
+  after       text to print after
+
+Returns:      nothing
+*/
+
+static void
+show_compile_options(uint32_t options, const char *before, const char *after)
+{
+if (options == 0) fprintf(outfile, "%s <none>%s", before, after);
+else fprintf(outfile, "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s",
+  before,
+  ((options & PCRE2_ALT_BSUX) != 0)? " alt_bsux" : "",
+  ((options & PCRE2_ALT_CIRCUMFLEX) != 0)? " alt_circumflex" : "",
+  ((options & PCRE2_ALT_VERBNAMES) != 0)? " alt_verbnames" : "",
+  ((options & PCRE2_ALLOW_EMPTY_CLASS) != 0)? " allow_empty_class" : "",
+  ((options & PCRE2_ANCHORED) != 0)? " anchored" : "",
+  ((options & PCRE2_AUTO_CALLOUT) != 0)? " auto_callout" : "",
+  ((options & PCRE2_CASELESS) != 0)? " caseless" : "",
+  ((options & PCRE2_DOLLAR_ENDONLY) != 0)? " dollar_endonly" : "",
+  ((options & PCRE2_DOTALL) != 0)? " dotall" : "",
+  ((options & PCRE2_DUPNAMES) != 0)? " dupnames" : "",
+  ((options & PCRE2_EXTENDED) != 0)? " extended" : "",
+  ((options & PCRE2_FIRSTLINE) != 0)? " firstline" : "",
+  ((options & PCRE2_MATCH_UNSET_BACKREF) != 0)? " match_unset_backref" : "",
+  ((options & PCRE2_MULTILINE) != 0)? " multiline" : "",
+  ((options & PCRE2_NEVER_BACKSLASH_C) != 0)? " never_backslash_c" : "",
+  ((options & PCRE2_NEVER_UCP) != 0)? " never_ucp" : "",
+  ((options & PCRE2_NEVER_UTF) != 0)? " never_utf" : "",
+  ((options & PCRE2_NO_AUTO_CAPTURE) != 0)? " no_auto_capture" : "",
+  ((options & PCRE2_NO_AUTO_POSSESS) != 0)? " no_auto_possess" : "",
+  ((options & PCRE2_NO_DOTSTAR_ANCHOR) != 0)? " no_dotstar_anchor" : "",
+  ((options & PCRE2_NO_UTF_CHECK) != 0)? " no_utf_check" : "",
+  ((options & PCRE2_NO_START_OPTIMIZE) != 0)? " no_start_optimize" : "",
+  ((options & PCRE2_UCP) != 0)? " ucp" : "",
+  ((options & PCRE2_UNGREEDY) != 0)? " ungreedy" : "",
+  ((options & PCRE2_USE_OFFSET_LIMIT) != 0)? " use_offset_limit" : "",
+  ((options & PCRE2_UTF) != 0)? " utf" : "",
+  after);
+}
+
+
+
+#ifdef SUPPORT_PCRE2_8
+/*************************************************
+*                Show match options              *
+*************************************************/
+
+/* Called for unsupported POSIX options. */
+
+static void
+show_match_options(uint32_t options)
+{
+fprintf(outfile, "%s%s%s%s%s%s%s%s%s%s",
+  ((options & PCRE2_ANCHORED) != 0)? " anchored" : "",
+  ((options & PCRE2_DFA_RESTART) != 0)? " dfa_restart" : "",
+  ((options & PCRE2_DFA_SHORTEST) != 0)? " dfa_shortest" : "",
+  ((options & PCRE2_NO_UTF_CHECK) != 0)? " no_utf_check" : "",
+  ((options & PCRE2_NOTBOL) != 0)? " notbol" : "",
+  ((options & PCRE2_NOTEMPTY) != 0)? " notempty" : "",
+  ((options & PCRE2_NOTEMPTY_ATSTART) != 0)? " notempty_atstart" : "",
+  ((options & PCRE2_NOTEOL) != 0)? " noteol" : "",
+  ((options & PCRE2_PARTIAL_HARD) != 0)? " partial_hard" : "",
+  ((options & PCRE2_PARTIAL_SOFT) != 0)? " partial_soft" : "");
+}
+#endif  /* SUPPORT_PCRE2_8 */
+
+
+
+/*************************************************
+*      Show memory usage info for a pattern      *
+*************************************************/
+
+static void
+show_memory_info(void)
+{
+uint32_t name_count, name_entry_size;
+size_t size, cblock_size;
+
+#ifdef SUPPORT_PCRE2_8
+if (test_mode == 8) cblock_size = sizeof(pcre2_real_code_8);
+#endif
+#ifdef SUPPORT_PCRE2_16
+if (test_mode == 16) cblock_size = sizeof(pcre2_real_code_16);
+#endif
+#ifdef SUPPORT_PCRE2_32
+if (test_mode == 32) cblock_size = sizeof(pcre2_real_code_32);
+#endif
+
+(void)pattern_info(PCRE2_INFO_SIZE, &size, FALSE);
+(void)pattern_info(PCRE2_INFO_NAMECOUNT, &name_count, FALSE);
+(void)pattern_info(PCRE2_INFO_NAMEENTRYSIZE, &name_entry_size, FALSE);
+fprintf(outfile, "Memory allocation (code space): %d\n",
+  (int)(size - name_count*name_entry_size*code_unit_size - cblock_size));
+if (pat_patctl.jit != 0)
+  {
+  (void)pattern_info(PCRE2_INFO_JITSIZE, &size, FALSE);
+  fprintf(outfile, "Memory allocation (JIT code): %d\n", (int)size);
+  }
+}
+
+
+
+/*************************************************
+*     Callback function for callout enumeration  *
+*************************************************/
+
+/* The only differences in the callout emumeration block for different code
+unit widths are that the pointers to the subject, the most recent MARK, and a
+callout argument string point to strings of the appropriate width. Casts can be
+used to deal with this.
+
+Argument:
+  cb            pointer to enumerate block
+  callout_data  user data
+
+Returns:    0
+*/
+
+static int callout_callback(pcre2_callout_enumerate_block_8 *cb,
+  void *callout_data)
+{
+uint32_t i;
+BOOL utf = (FLD(compiled_code, overall_options) & PCRE2_UTF) != 0;
+
+(void)callout_data;  /* Not currently displayed */
+
+fprintf(outfile, "Callout ");
+if (cb->callout_string != NULL)
+  {
+  uint32_t delimiter = CODE_UNIT(cb->callout_string, -1);
+  fprintf(outfile, "%c", delimiter);
+  PCHARSV(cb->callout_string, 0,
+    cb->callout_string_length, utf, outfile);
+  for (i = 0; callout_start_delims[i] != 0; i++)
+    if (delimiter == callout_start_delims[i])
+      {
+      delimiter = callout_end_delims[i];
+      break;
+      }
+  fprintf(outfile, "%c  ", delimiter);
+  }
+else fprintf(outfile, "%d  ", cb->callout_number);
+
+fprintf(outfile, "%.*s\n",
+  (int)((cb->next_item_length == 0)? 1 : cb->next_item_length),
+  pbuffer8 + cb->pattern_position);
+
+return 0;
+}
+
+
+
+/*************************************************
+*        Show information about a pattern        *
+*************************************************/
+
+/* This function is called after a pattern has been compiled if any of the
+information-requesting controls have been set.
+
+Arguments:  none
+
+Returns:    PR_OK     continue processing next line
+            PR_SKIP   skip to a blank line
+            PR_ABEND  abort the pcre2test run
+*/
+
+static int
+show_pattern_info(void)
+{
+uint32_t compile_options, overall_options;
+
+if ((pat_patctl.control & (CTL_BINCODE|CTL_FULLBINCODE)) != 0)
+  {
+  fprintf(outfile, "------------------------------------------------------------------\n");
+  PCRE2_PRINTINT((pat_patctl.control & CTL_FULLBINCODE) != 0);
+  }
+
+if ((pat_patctl.control & CTL_INFO) != 0)
+  {
+  const void *nametable;
+  const uint8_t *start_bits;
+  BOOL match_limit_set, recursion_limit_set;
+  uint32_t backrefmax, bsr_convention, capture_count, first_ctype, first_cunit,
+    hasbackslashc, hascrorlf, jchanged, last_ctype, last_cunit, match_empty,
+    match_limit, minlength, nameentrysize, namecount, newline_convention,
+    recursion_limit;
+
+  /* These info requests may return PCRE2_ERROR_UNSET. */
+
+  switch(pattern_info(PCRE2_INFO_MATCHLIMIT, &match_limit, TRUE))
+    {
+    case 0:
+    match_limit_set = TRUE;
+    break;
+
+    case PCRE2_ERROR_UNSET:
+    match_limit_set = FALSE;
+    break;
+
+    default:
+    return PR_ABEND;
+    }
+
+  switch(pattern_info(PCRE2_INFO_RECURSIONLIMIT, &recursion_limit, TRUE))
+    {
+    case 0:
+    recursion_limit_set = TRUE;
+    break;
+
+    case PCRE2_ERROR_UNSET:
+    recursion_limit_set = FALSE;
+    break;
+
+    default:
+    return PR_ABEND;
+    }
+
+  /* These info requests should always succeed. */
+
+  if (pattern_info(PCRE2_INFO_BACKREFMAX, &backrefmax, FALSE) +
+      pattern_info(PCRE2_INFO_BSR, &bsr_convention, FALSE) +
+      pattern_info(PCRE2_INFO_CAPTURECOUNT, &capture_count, FALSE) +
+      pattern_info(PCRE2_INFO_FIRSTBITMAP, &start_bits, FALSE) +
+      pattern_info(PCRE2_INFO_FIRSTCODEUNIT, &first_cunit, FALSE) +
+      pattern_info(PCRE2_INFO_FIRSTCODETYPE, &first_ctype, FALSE) +
+      pattern_info(PCRE2_INFO_HASBACKSLASHC, &hasbackslashc, FALSE) +
+      pattern_info(PCRE2_INFO_HASCRORLF, &hascrorlf, FALSE) +
+      pattern_info(PCRE2_INFO_JCHANGED, &jchanged, FALSE) +
+      pattern_info(PCRE2_INFO_LASTCODEUNIT, &last_cunit, FALSE) +
+      pattern_info(PCRE2_INFO_LASTCODETYPE, &last_ctype, FALSE) +
+      pattern_info(PCRE2_INFO_MATCHEMPTY, &match_empty, FALSE) +
+      pattern_info(PCRE2_INFO_MINLENGTH, &minlength, FALSE) +
+      pattern_info(PCRE2_INFO_NAMECOUNT, &namecount, FALSE) +
+      pattern_info(PCRE2_INFO_NAMEENTRYSIZE, &nameentrysize, FALSE) +
+      pattern_info(PCRE2_INFO_NAMETABLE, &nametable, FALSE) +
+      pattern_info(PCRE2_INFO_NEWLINE, &newline_convention, FALSE)
+      != 0)
+    return PR_ABEND;
+
+  fprintf(outfile, "Capturing subpattern count = %d\n", capture_count);
+
+  if (backrefmax > 0)
+    fprintf(outfile, "Max back reference = %d\n", backrefmax);
+
+  if (maxlookbehind > 0)
+    fprintf(outfile, "Max lookbehind = %d\n", maxlookbehind);
+
+  if (match_limit_set)
+    fprintf(outfile, "Match limit = %u\n", match_limit);
+
+  if (recursion_limit_set)
+    fprintf(outfile, "Recursion limit = %u\n", recursion_limit);
+
+  if (namecount > 0)
+    {
+    fprintf(outfile, "Named capturing subpatterns:\n");
+    for (; namecount > 0; namecount--)
+      {
+      int imm2_size = test_mode == PCRE8_MODE ? 2 : 1;
+      uint32_t length = (uint32_t)STRLEN(nametable + imm2_size);
+      fprintf(outfile, "  ");
+      PCHARSV(nametable, imm2_size, length, FALSE, outfile);
+      while (length++ < nameentrysize - imm2_size) putc(' ', outfile);
+#ifdef SUPPORT_PCRE2_32
+      if (test_mode == PCRE32_MODE)
+        fprintf(outfile, "%3d\n", (int)(((PCRE2_SPTR32)nametable)[0]));
+#endif
+#ifdef SUPPORT_PCRE2_16
+      if (test_mode == PCRE16_MODE)
+        fprintf(outfile, "%3d\n", (int)(((PCRE2_SPTR16)nametable)[0]));
+#endif
+#ifdef SUPPORT_PCRE2_8
+      if (test_mode == PCRE8_MODE)
+        fprintf(outfile, "%3d\n", (int)(
+        ((((PCRE2_SPTR8)nametable)[0]) << 8) | ((PCRE2_SPTR8)nametable)[1]));
+#endif
+      nametable = (void*)((PCRE2_SPTR8)nametable + nameentrysize * code_unit_size);
+      }
+    }
+
+  if (hascrorlf)     fprintf(outfile, "Contains explicit CR or LF match\n");
+  if (hasbackslashc) fprintf(outfile, "Contains \\C\n");
+  if (match_empty)   fprintf(outfile, "May match empty string\n");
+
+  pattern_info(PCRE2_INFO_ARGOPTIONS, &compile_options, FALSE);
+  pattern_info(PCRE2_INFO_ALLOPTIONS, &overall_options, FALSE);
+
+  /* Remove UTF/UCP if they were there only because of forbid_utf. This saves
+  cluttering up the verification output of non-UTF test files. */
+
+  if ((pat_patctl.options & PCRE2_NEVER_UTF) == 0)
+    {
+    compile_options &= ~PCRE2_NEVER_UTF;
+    overall_options &= ~PCRE2_NEVER_UTF;
+    }
+
+  if ((pat_patctl.options & PCRE2_NEVER_UCP) == 0)
+    {
+    compile_options &= ~PCRE2_NEVER_UCP;
+    overall_options &= ~PCRE2_NEVER_UCP;
+    }
+
+  if ((compile_options|overall_options) != 0)
+    {
+    if (compile_options == overall_options)
+      show_compile_options(compile_options, "Options:", "\n");
+    else
+      {
+      show_compile_options(compile_options, "Compile options:", "\n");
+      show_compile_options(overall_options, "Overall options:", "\n");
+      }
+    }
+
+  if (jchanged) fprintf(outfile, "Duplicate name status changes\n");
+
+  if ((pat_patctl.control & CTL_BSR_SET) != 0 ||
+      (FLD(compiled_code, flags) & PCRE2_BSR_SET) != 0)
+    fprintf(outfile, "\\R matches %s\n", (bsr_convention == PCRE2_BSR_UNICODE)?
+      "any Unicode newline" : "CR, LF, or CRLF");
+
+  if ((FLD(compiled_code, flags) & PCRE2_NL_SET) != 0)
+    {
+    switch (newline_convention)
+      {
+      case PCRE2_NEWLINE_CR:
+      fprintf(outfile, "Forced newline is CR\n");
+      break;
+
+      case PCRE2_NEWLINE_LF:
+      fprintf(outfile, "Forced newline is LF\n");
+      break;
+
+      case PCRE2_NEWLINE_CRLF:
+      fprintf(outfile, "Forced newline is CRLF\n");
+      break;
+
+      case PCRE2_NEWLINE_ANYCRLF:
+      fprintf(outfile, "Forced newline is CR, LF, or CRLF\n");
+      break;
+
+      case PCRE2_NEWLINE_ANY:
+      fprintf(outfile, "Forced newline is any Unicode newline\n");
+      break;
+
+      default:
+      break;
+      }
+    }
+
+  if (first_ctype == 2)
+    {
+    fprintf(outfile, "First code unit at start or follows newline\n");
+    }
+  else if (first_ctype == 1)
+    {
+    const char *caseless =
+      ((FLD(compiled_code, flags) & PCRE2_FIRSTCASELESS) == 0)?
+      "" : " (caseless)";
+    if (PRINTOK(first_cunit))
+      fprintf(outfile, "First code unit = \'%c\'%s\n", first_cunit, caseless);
+    else
+      {
+      fprintf(outfile, "First code unit = ");
+      pchar(first_cunit, FALSE, outfile);
+      fprintf(outfile, "%s\n", caseless);
+      }
+    }
+  else if (start_bits != NULL)
+    {
+    int i;
+    int c = 24;
+    fprintf(outfile, "Starting code units: ");
+    for (i = 0; i < 256; i++)
+      {
+      if ((start_bits[i/8] & (1<<(i&7))) != 0)
+        {
+        if (c > 75)
+          {
+          fprintf(outfile, "\n  ");
+          c = 2;
+          }
+        if (PRINTOK(i) && i != ' ')
+          {
+          fprintf(outfile, "%c ", i);
+          c += 2;
+          }
+        else
+          {
+          fprintf(outfile, "\\x%02x ", i);
+          c += 5;
+          }
+        }
+      }
+    fprintf(outfile, "\n");
+    }
+
+  if (last_ctype != 0)
+    {
+    const char *caseless =
+      ((FLD(compiled_code, flags) & PCRE2_LASTCASELESS) == 0)?
+      "" : " (caseless)";
+    if (PRINTOK(last_cunit))
+      fprintf(outfile, "Last code unit = \'%c\'%s\n", last_cunit, caseless);
+    else
+      {
+      fprintf(outfile, "Last code unit = ");
+      pchar(last_cunit, FALSE, outfile);
+      fprintf(outfile, "%s\n", caseless);
+      }
+    }
+
+  fprintf(outfile, "Subject length lower bound = %d\n", minlength);
+
+  if (pat_patctl.jit != 0 && (pat_patctl.control & CTL_JITVERIFY) != 0)
+    {
+    if (FLD(compiled_code, executable_jit) != NULL)
+      fprintf(outfile, "JIT compilation was successful\n");
+    else
+      {
+#ifdef SUPPORT_JIT
+      int len;
+      fprintf(outfile, "JIT compilation was not successful");
+      if (jitrc != 0)
+        {
+        fprintf(outfile, " (");
+        PCRE2_GET_ERROR_MESSAGE(len, jitrc, pbuffer);
+        PCHARSV(CASTVAR(void *, pbuffer), 0, len, FALSE, outfile);
+        fprintf(outfile, ")");
+        }
+      fprintf(outfile, "\n");
+#else
+      fprintf(outfile, "JIT support is not available in this version of PCRE2\n");
+#endif
+      }
+    }
+  }
+
+if ((pat_patctl.control & CTL_CALLOUT_INFO) != 0)
+  {
+  int errorcode;
+  PCRE2_CALLOUT_ENUMERATE(errorcode, callout_callback, 0);
+  if (errorcode != 0)
+    {
+    int len;
+    fprintf(outfile, "Callout enumerate failed: error %d: ", errorcode);
+    if (errorcode < 0)
+      {
+      PCRE2_GET_ERROR_MESSAGE(len, errorcode, pbuffer);
+      PCHARSV(CASTVAR(void *, pbuffer), 0, len, FALSE, outfile);
+      }
+    fprintf(outfile, "\n");
+    return PR_SKIP;
+    }
+  }
+
+return PR_OK;
+}
+
+
+
+/*************************************************
+*              Handle serialization error        *
+*************************************************/
+
+/* Print an error message after a serialization failure.
+
+Arguments:
+  rc         the error code
+  msg        an initial message for what failed
+
+Returns:     nothing
+*/
+
+static void
+serial_error(int rc, const char *msg)
+{
+fprintf(outfile, "%s failed: error %d: ", msg, rc);
+PCRE2_GET_ERROR_MESSAGE(rc, rc, pbuffer);
+PCHARSV(CASTVAR(void *, pbuffer), 0, rc, FALSE, outfile);
+fprintf(outfile, "\n");
+}
+
+
+
+/*************************************************
+*        Open file for save/load commands        *
+*************************************************/
+
+/* This function decodes the file name and opens the file.
+
+Arguments:
+  buffptr     point after the #command
+  mode        open mode
+  fptr        points to the FILE variable
+
+Returns:      PR_OK or PR_ABEND
+*/
+
+static int
+open_file(uint8_t *buffptr, const char *mode, FILE **fptr)
+{
+char *endf;
+char *filename = (char *)buffptr;
+while (isspace(*filename)) filename++;
+endf = filename + strlen8(filename);
+while (endf > filename && isspace(endf[-1])) endf--;
+
+if (endf == filename)
+  {
+  fprintf(outfile, "** File name expected after #save\n");
+  return PR_ABEND;
+  }
+
+*endf = 0;
+*fptr = fopen((const char *)filename, mode);
+if (*fptr == NULL)
+  {
+  fprintf(outfile, "** Failed to open '%s'\n", filename);
+  return PR_ABEND;
+  }
+
+return PR_OK;
+}
+
+
+
+/*************************************************
+*               Process command line             *
+*************************************************/
+
+/* This function is called for lines beginning with # and a character that is
+not ! or whitespace, when encountered between tests, which means that there is
+no compiled pattern (compiled_code is NULL). The line is in buffer.
+
+Arguments:  none
+
+Returns:    PR_OK     continue processing next line
+            PR_SKIP   skip to a blank line
+            PR_ABEND  abort the pcre2test run
+*/
+
+static int
+process_command(void)
+{
+FILE *f;
+PCRE2_SIZE serial_size;
+size_t i;
+int rc, cmd, cmdlen;
+uint16_t first_listed_newline;
+const char *cmdname;
+uint8_t *argptr, *serial;
+
+if (restrict_for_perl_test)
+  {
+  fprintf(outfile, "** #-commands are not allowed after #perltest\n");
+  return PR_ABEND;
+  }
+
+cmd = CMD_UNKNOWN;
+cmdlen = 0;
+
+for (i = 0; i < cmdlistcount; i++)
+  {
+  cmdname = cmdlist[i].name;
+  cmdlen = strlen(cmdname);
+  if (strncmp((char *)(buffer+1), cmdname, cmdlen) == 0 &&
+      isspace(buffer[cmdlen+1]))
+    {
+    cmd = cmdlist[i].value;
+    break;
+    }
+  }
+
+argptr = buffer + cmdlen + 1;
+
+switch(cmd)
+  {
+  case CMD_UNKNOWN:
+  fprintf(outfile, "** Unknown command: %s", buffer);
+  break;
+
+  case CMD_FORBID_UTF:
+  forbid_utf = PCRE2_NEVER_UTF|PCRE2_NEVER_UCP;
+  break;
+
+  case CMD_PERLTEST:
+  restrict_for_perl_test = TRUE;
+  break;
+
+  /* Set default pattern modifiers */
+
+  case CMD_PATTERN:
+  (void)decode_modifiers(argptr, CTX_DEFPAT, &def_patctl, NULL);
+  if (def_patctl.jit == 0 && (def_patctl.control & CTL_JITVERIFY) != 0)
+    def_patctl.jit = 7;
+  break;
+
+  /* Set default subject modifiers */
+
+  case CMD_SUBJECT:
+  (void)decode_modifiers(argptr, CTX_DEFDAT, NULL, &def_datctl);
+  break;
+
+  /* Check the default newline, and if not one of those listed, set up the
+  first one to be forced. An empty list unsets. */
+
+  case CMD_NEWLINE_DEFAULT:
+  local_newline_default = 0;   /* Unset */
+  first_listed_newline = 0;
+  for (;;)
+    {
+    while (isspace(*argptr)) argptr++;
+    if (*argptr == 0) break;
+    for (i = 1; i < sizeof(newlines)/sizeof(char *); i++)
+      {
+      size_t nlen = strlen(newlines[i]);
+      if (strncmpic(argptr, (const uint8_t *)newlines[i], nlen) == 0 &&
+          isspace(argptr[nlen]))
+        {
+        if (i == NEWLINE_DEFAULT) return PR_OK;  /* Default is valid */
+        if (first_listed_newline == 0) first_listed_newline = i;
+        }
+      }
+    while (*argptr != 0 && !isspace(*argptr)) argptr++;
+    }
+  local_newline_default = first_listed_newline;
+  break;
+
+  /* Pop a compiled pattern off the stack. Modifiers that do not affect the
+  compiled pattern (e.g. to give information) are permitted. The default
+  pattern modifiers are ignored. */
+
+  case CMD_POP:
+  if (patstacknext <= 0)
+    {
+    fprintf(outfile, "** Can't pop off an empty stack\n");
+    return PR_SKIP;
+    }
+  memset(&pat_patctl, 0, sizeof(patctl));   /* Completely unset */
+  if (!decode_modifiers(argptr, CTX_POPPAT, &pat_patctl, NULL))
+    return PR_SKIP;
+  SET(compiled_code, patstack[--patstacknext]);
+  if (pat_patctl.jit != 0)
+    {
+    PCRE2_JIT_COMPILE(jitrc, compiled_code, pat_patctl.jit);
+    }
+  if ((pat_patctl.control & CTL_MEMORY) != 0) show_memory_info();
+  if ((pat_patctl.control & CTL_ANYINFO) != 0)
+    {
+    rc = show_pattern_info();
+    if (rc != PR_OK) return rc;
+    }
+  break;
+
+  /* Save the stack of compiled patterns to a file, then empty the stack. */
+
+  case CMD_SAVE:
+  if (patstacknext <= 0)
+    {
+    fprintf(outfile, "** No stacked patterns to save\n");
+    return PR_OK;
+    }
+
+  rc = open_file(argptr+1, BINARY_OUTPUT_MODE, &f);
+  if (rc != PR_OK) return rc;
+
+  PCRE2_SERIALIZE_ENCODE(rc, patstack, patstacknext, &serial, &serial_size,
+    general_context);
+  if (rc < 0)
+    {
+    serial_error(rc, "Serialization");
+    break;
+    }
+
+  /* Write the length at the start of the file to make it straightforward to
+  get the right memory when re-loading. This saves having to read the file size
+  in different operating systems. To allow for different endianness (even
+  though reloading with the opposite endianness does not work), write the
+  length byte-by-byte. */
+
+  for (i = 0; i < 4; i++) fputc((serial_size >> (i*8)) & 255, f);
+  if (fwrite(serial, 1, serial_size, f) != serial_size)
+    {
+    fprintf(outfile, "** Wrong return from fwrite()\n");
+    return PR_ABEND;
+    }
+
+  fclose(f);
+  PCRE2_SERIALIZE_FREE(serial);
+  while(patstacknext > 0)
+    {
+    SET(compiled_code, patstack[--patstacknext]);
+    SUB1(pcre2_code_free, compiled_code);
+    }
+  SET(compiled_code, NULL);
+  break;
+
+  /* Load a set of compiled patterns from a file onto the stack */
+
+  case CMD_LOAD:
+  rc = open_file(argptr+1, BINARY_INPUT_MODE, &f);
+  if (rc != PR_OK) return rc;
+
+  serial_size = 0;
+  for (i = 0; i < 4; i++) serial_size |= fgetc(f) << (i*8);
+
+  serial = malloc(serial_size);
+  if (serial == NULL)
+    {
+    fprintf(outfile, "** Failed to get memory (size %lu) for #load\n",
+      (unsigned long int)serial_size);
+    return PR_ABEND;
+    }
+
+  if (fread(serial, 1, serial_size, f) != serial_size)
+    {
+    fprintf(outfile, "** Wrong return from fread()\n");
+    return PR_ABEND;
+    }
+  fclose(f);
+
+  PCRE2_SERIALIZE_GET_NUMBER_OF_CODES(rc, serial);
+  if (rc < 0) serial_error(rc, "Get number of codes"); else
+    {
+    if (rc + patstacknext > PATSTACKSIZE)
+      {
+      fprintf(outfile, "** Not enough space on pattern stack for %d pattern%s\n",
+        rc, (rc == 1)? "" : "s");
+      rc = PATSTACKSIZE - patstacknext;
+      fprintf(outfile, "** Decoding %d pattern%s\n", rc,
+        (rc == 1)? "" : "s");
+      }
+    PCRE2_SERIALIZE_DECODE(rc, patstack + patstacknext, rc, serial,
+      general_context);
+    if (rc < 0) serial_error(rc, "Deserialization");
+      else patstacknext += rc;
+    }
+
+  free(serial);
+  break;
+  }
+
+return PR_OK;
+}
+
+
+
+/*************************************************
+*               Process pattern line             *
+*************************************************/
+
+/* This function is called when the input buffer contains the start of a
+pattern. The first character is known to be a valid delimiter. The pattern is
+read, modifiers are interpreted, and a suitable local context is set up for
+this test. The pattern is then compiled.
+
+Arguments:  none
+
+Returns:    PR_OK     continue processing next line
+            PR_SKIP   skip to a blank line
+            PR_ABEND  abort the pcre2test run
+*/
+
+static int
+process_pattern(void)
+{
+BOOL utf;
+uint32_t k;
+uint8_t *p = buffer;
+const uint8_t *use_tables;
+unsigned int delimiter = *p++;
+int errorcode;
+void *use_pat_context;
+PCRE2_SIZE patlen;
+PCRE2_SIZE erroroffset;
+
+/* Initialize the context and pattern/data controls for this test from the
+defaults. */
+
+PATCTXCPY(pat_context, default_pat_context);
+memcpy(&pat_patctl, &def_patctl, sizeof(patctl));
+
+/* Find the end of the pattern, reading more lines if necessary. */
+
+for(;;)
+  {
+  while (*p != 0)
+    {
+    if (*p == '\\' && p[1] != 0) p++;
+      else if (*p == delimiter) break;
+    p++;
+    }
+  if (*p != 0) break;
+  if ((p = extend_inputline(infile, p, "    > ")) == NULL)
+    {
+    fprintf(outfile, "** Unexpected EOF\n");
+    return PR_ABEND;
+    }
+  if (!INTERACTIVE(infile)) fprintf(outfile, "%s", (char *)p);
+  }
+
+/* If the first character after the delimiter is backslash, make the pattern
+end with backslash. This is purely to provide a way of testing for the error
+message when a pattern ends with backslash. */
+
+if (p[1] == '\\') *p++ = '\\';
+
+/* Terminate the pattern at the delimiter, and compute the length. */
+
+*p++ = 0;
+patlen = p - buffer - 2;
+
+/* Look for modifiers and options after the final delimiter. */
+
+if (!decode_modifiers(p, CTX_PAT, &pat_patctl, NULL)) return PR_SKIP;
+utf = (pat_patctl.options & PCRE2_UTF) != 0;
+
+/* Check for mutually exclusive modifiers. At present, these are all in the
+first control word. */
+
+for (k = 0; k < sizeof(exclusive_pat_controls)/sizeof(uint32_t); k++)
+  {
+  uint32_t c = pat_patctl.control & exclusive_pat_controls[k];
+  if (c != 0 && c != (c & (~c+1)))
+    {
+    show_controls(c, 0, "** Not allowed together:");
+    fprintf(outfile, "\n");
+    return PR_SKIP;
+    }
+  }
+
+/* Assume full JIT compile for jitverify and/or jitfast if nothing else was
+specified. */
+
+if (pat_patctl.jit == 0 &&
+    (pat_patctl.control & (CTL_JITVERIFY|CTL_JITFAST)) != 0)
+  pat_patctl.jit = 7;
+
+/* Now copy the pattern to pbuffer8 for use in 8-bit testing and for reflecting
+in callouts. Convert from hex if required; this must necessarily be fewer
+characters so will always fit in pbuffer8. Alternatively, process for
+repetition if requested. */
+
+if ((pat_patctl.control & CTL_HEXPAT) != 0)
+  {
+  uint8_t *pp, *pt;
+  uint32_t c, d;
+
+  pt = pbuffer8;
+  for (pp = buffer + 1; *pp != 0; pp++)
+    {
+    if (isspace(*pp)) continue;
+    c = toupper(*pp++);
+    if (*pp == 0)
+      {
+      fprintf(outfile, "** Odd number of digits in hex pattern.\n");
+      return PR_SKIP;
+      }
+    d = toupper(*pp);
+    if (!isxdigit(c) || !isxdigit(d))
+      {
+      fprintf(outfile, "** Non-hex-digit in hex pattern.\n");
+      return PR_SKIP;
+      }
+    *pt++ = ((isdigit(c)? (c - '0') : (c - 'A' + 10)) << 4) +
+             (isdigit(d)? (d - '0') : (d - 'A' + 10));
+    }
+  *pt = 0;
+  patlen = pt - pbuffer8;
+  }
+
+else if ((pat_patctl.control & CTL_EXPAND) != 0)
+  {
+  uint8_t *pp, *pt;
+
+  pt = pbuffer8;
+  for (pp = buffer + 1; *pp != 0; pp++)
+    {
+    uint8_t *pc = pp;
+    uint32_t count = 1;
+    size_t length = 1;
+
+    /* Check for replication syntax; if not found, the defaults just set will
+    prevail and one character will be copied. */
+
+    if (pp[0] == '\\' && pp[1] == '[')
+      {
+      uint8_t *pe;
+      for (pe = pp + 2; *pe != 0; pe++)
+        {
+        if (pe[0] == ']' && pe[1] == '{')
+          {
+          uint32_t clen = pe - pc - 2;
+          uint32_t i = 0;
+          pe += 2;
+          while (isdigit(*pe)) i = i * 10 + *pe++ - '0';
+          if (*pe == '}')
+            {
+            if (i == 0)
+              {
+              fprintf(outfile, "** Zero repeat not allowed\n");
+              return PR_SKIP;
+              }
+            pc += 2;
+            count = i;
+            length = clen;
+            pp = pe;
+            break;
+            }
+          }
+        }
+      }
+
+    /* Add to output. If the buffer is too small expand it. The function for
+    expanding buffers always keeps buffer and pbuffer8 in step as far as their
+    size goes. */
+
+    while (pt + count * length > pbuffer8 + pbuffer8_size)
+      {
+      size_t pc_offset = pc - buffer;
+      size_t pp_offset = pp - buffer;
+      size_t pt_offset = pt - pbuffer8;
+      expand_input_buffers();
+      pc = buffer + pc_offset;
+      pp = buffer + pp_offset;
+      pt = pbuffer8 + pt_offset;
+      }
+
+    while (count-- > 0)
+      {
+      memcpy(pt, pc, length);
+      pt += length;
+      }
+    }
+
+  *pt = 0;
+  patlen = pt - pbuffer8;
+
+  if ((pat_patctl.control & CTL_INFO) != 0)
+    fprintf(outfile, "Expanded: %s\n", pbuffer8);
+  }
+
+/* Neither hex nor expanded, just copy the input verbatim. */
+
+else
+  {
+  strncpy((char *)pbuffer8, (char *)(buffer+1), patlen + 1);
+  }
+
+/* Sort out character tables */
+
+if (pat_patctl.locale[0] != 0)
+  {
+  if (pat_patctl.tables_id != 0)
+    {
+    fprintf(outfile, "** 'Locale' and 'tables' must not both be set.\n");
+    return PR_SKIP;
+    }
+  if (setlocale(LC_CTYPE, (const char *)pat_patctl.locale) == NULL)
+    {
+    fprintf(outfile, "** Failed to set locale '%s'\n", pat_patctl.locale);
+    return PR_SKIP;
+    }
+  if (strcmp((const char *)pat_patctl.locale, (const char *)locale_name) != 0)
+    {
+    strcpy((char *)locale_name, (char *)pat_patctl.locale);
+    if (locale_tables != NULL) free((void *)locale_tables);
+    PCRE2_MAKETABLES(locale_tables);
+    }
+  use_tables = locale_tables;
+  }
+
+else switch (pat_patctl.tables_id)
+  {
+  case 0: use_tables = NULL; break;
+  case 1: use_tables = tables1; break;
+  case 2: use_tables = tables2; break;
+  default:
+  fprintf(outfile, "** 'Tables' must specify 0, 1, or 2.\n");
+  return PR_SKIP;
+  }
+
+PCRE2_SET_CHARACTER_TABLES(pat_context, use_tables);
+
+/* Set up for the stackguard test. */
+
+if (pat_patctl.stackguard_test != 0)
+  {
+  PCRE2_SET_COMPILE_RECURSION_GUARD(pat_context, stack_guard, NULL);
+  }
+
+/* Handle compiling via the POSIX interface, which doesn't support the
+timing, showing, or debugging options, nor the ability to pass over
+local character tables. Neither does it have 16-bit or 32-bit support. */
+
+if ((pat_patctl.control & CTL_POSIX) != 0)
+  {
+#ifdef SUPPORT_PCRE2_8
+  int rc;
+  int cflags = 0;
+  const char *msg = "** Ignored with POSIX interface:";
+#endif
+
+  if (test_mode != 8)
+    {
+    fprintf(outfile, "** The POSIX interface is available only in 8-bit mode\n");
+    return PR_SKIP;
+    }
+
+#ifdef SUPPORT_PCRE2_8
+  /* Check for features that the POSIX interface does not support. */
+
+  if (pat_patctl.locale[0] != 0) prmsg(&msg, "locale");
+  if (pat_patctl.replacement[0] != 0) prmsg(&msg, "replace");
+  if (pat_patctl.tables_id != 0) prmsg(&msg, "tables");
+  if (pat_patctl.stackguard_test != 0) prmsg(&msg, "stackguard");
+  if (timeit > 0) prmsg(&msg, "timing");
+  if (pat_patctl.jit != 0) prmsg(&msg, "JIT");
+
+  if ((pat_patctl.options & ~POSIX_SUPPORTED_COMPILE_OPTIONS) != 0)
+    {
+    show_compile_options(
+      pat_patctl.options & ~POSIX_SUPPORTED_COMPILE_OPTIONS, msg, "");
+    msg = "";
+    }
+  if ((pat_patctl.control & ~POSIX_SUPPORTED_COMPILE_CONTROLS) != 0 ||
+      (pat_patctl.control2 & ~POSIX_SUPPORTED_COMPILE_CONTROLS2) != 0)
+    {
+    show_controls(pat_patctl.control & ~POSIX_SUPPORTED_COMPILE_CONTROLS,
+      pat_patctl.control2 & ~POSIX_SUPPORTED_COMPILE_CONTROLS2, msg);
+    msg = "";
+    }
+
+  if (local_newline_default != 0) prmsg(&msg, "#newline_default");
+
+  if (msg[0] == 0) fprintf(outfile, "\n");
+
+  /* Translate PCRE2 options to POSIX options and then compile. On success, set
+  up a match_data block to be used for all matches. */
+
+  if (utf) cflags |= REG_UTF;
+  if ((pat_patctl.options & PCRE2_UCP) != 0) cflags |= REG_UCP;
+  if ((pat_patctl.options & PCRE2_CASELESS) != 0) cflags |= REG_ICASE;
+  if ((pat_patctl.options & PCRE2_MULTILINE) != 0) cflags |= REG_NEWLINE;
+  if ((pat_patctl.options & PCRE2_DOTALL) != 0) cflags |= REG_DOTALL;
+  if ((pat_patctl.options & PCRE2_NO_AUTO_CAPTURE) != 0) cflags |= REG_NOSUB;
+  if ((pat_patctl.options & PCRE2_UNGREEDY) != 0) cflags |= REG_UNGREEDY;
+
+  rc = regcomp(&preg, (char *)pbuffer8, cflags);
+  if (rc != 0)   /* Failure */
+    {
+    size_t bsize, usize;
+
+    preg.re_pcre2_code = NULL;     /* In case something was left in there */
+    preg.re_match_data = NULL;
+
+    bsize = (pat_patctl.regerror_buffsize != 0)?
+      pat_patctl.regerror_buffsize : pbuffer8_size;
+    if (bsize + 8 < pbuffer8_size)
+      memcpy(pbuffer8 + bsize, "DEADBEEF", 8);
+    usize = regerror(rc, &preg, (char *)pbuffer8, bsize);
+
+    fprintf(outfile, "Failed: POSIX code %d: %s\n", rc, pbuffer8);
+    if (usize > bsize)
+      {
+      fprintf(outfile, "** regerror() message truncated\n");
+      if (memcmp(pbuffer8 + bsize, "DEADBEEF", 8) != 0)
+        fprintf(outfile, "** regerror() buffer overflow\n");
+      }
+    return PR_SKIP;
+    }
+  return PR_OK;
+#endif  /* SUPPORT_PCRE2_8 */
+  }
+
+/* Handle compiling via the native interface. Controls that act later are
+ignored with "push". Replacements are locked out. */
+
+if ((pat_patctl.control & CTL_PUSH) != 0)
+  {
+  if (pat_patctl.replacement[0] != 0)
+    {
+    fprintf(outfile, "** Replacement text is not supported with 'push'.\n");
+    return PR_OK;
+    }
+  if ((pat_patctl.control & ~PUSH_SUPPORTED_COMPILE_CONTROLS) != 0 ||
+      (pat_patctl.control2 & ~PUSH_SUPPORTED_COMPILE_CONTROLS2) != 0)
+    {
+    show_controls(pat_patctl.control & ~PUSH_SUPPORTED_COMPILE_CONTROLS,
+                  pat_patctl.control2 & ~PUSH_SUPPORTED_COMPILE_CONTROLS2,
+      "** Ignored when compiled pattern is stacked with 'push':");
+    fprintf(outfile, "\n");
+    }
+  if ((pat_patctl.control & PUSH_COMPILE_ONLY_CONTROLS) != 0 ||
+      (pat_patctl.control2 & PUSH_COMPILE_ONLY_CONTROLS2) != 0)
+    {
+    show_controls(pat_patctl.control & PUSH_COMPILE_ONLY_CONTROLS,
+                  pat_patctl.control2 & PUSH_COMPILE_ONLY_CONTROLS2,
+      "** Applies only to compile when pattern is stacked with 'push':");
+    fprintf(outfile, "\n");
+    }
+  }
+
+/* Convert the input in non-8-bit modes. */
+
+#ifdef SUPPORT_PCRE2_8
+if (test_mode == PCRE8_MODE) errorcode = 0;
+#endif
+
+#ifdef SUPPORT_PCRE2_16
+if (test_mode == PCRE16_MODE) errorcode = to16(pbuffer8, utf, &patlen);
+#endif
+
+#ifdef SUPPORT_PCRE2_32
+if (test_mode == PCRE32_MODE) errorcode = to32(pbuffer8, utf, &patlen);
+#endif
+
+switch(errorcode)
+  {
+  case -1:
+  fprintf(outfile, "** Failed: invalid UTF-8 string cannot be "
+    "converted to %d-bit string\n", (test_mode == PCRE16_MODE)? 16:32);
+  return PR_SKIP;
+
+  case -2:
+  fprintf(outfile, "** Failed: character value greater than 0x10ffff "
+    "cannot be converted to UTF\n");
+  return PR_SKIP;
+
+  case -3:
+  fprintf(outfile, "** Failed: character value greater than 0xffff "
+    "cannot be converted to 16-bit in non-UTF mode\n");
+  return PR_SKIP;
+
+  default:
+  break;
+  }
+
+/* The pattern is now in pbuffer[8|16|32], with the length in patlen. By
+default, however, we pass a zero-terminated pattern. The length is passed only
+if we had a hex pattern. */
+
+if ((pat_patctl.control & CTL_HEXPAT) == 0) patlen = PCRE2_ZERO_TERMINATED;
+
+/* If #newline_default has been used and the library was not compiled with an
+appropriate default newline setting, local_newline_default will be non-zero. We
+use this if there is no explicit newline modifier. */
+
+if ((pat_patctl.control & CTL_NL_SET) == 0 && local_newline_default != 0)
+  {
+  SETFLD(pat_context, newline_convention, local_newline_default);
+  }
+
+/* The nullcontext modifier is used to test calling pcre2_compile() with a NULL
+context. */
+
+use_pat_context = ((pat_patctl.control & CTL_NULLCONTEXT) != 0)?
+  NULL : PTR(pat_context);
+
+/* Compile many times when timing. */
+
+if (timeit > 0)
+  {
+  register int i;
+  clock_t time_taken = 0;
+  for (i = 0; i < timeit; i++)
+    {
+    clock_t start_time = clock();
+    PCRE2_COMPILE(compiled_code, pbuffer, patlen,
+      pat_patctl.options|forbid_utf, &errorcode, &erroroffset, use_pat_context);
+    time_taken += clock() - start_time;
+    if (TEST(compiled_code, !=, NULL))
+      { SUB1(pcre2_code_free, compiled_code); }
+    }
+  total_compile_time += time_taken;
+  fprintf(outfile, "Compile time %.4f milliseconds\n",
+    (((double)time_taken * 1000.0) / (double)timeit) /
+      (double)CLOCKS_PER_SEC);
+  }
+
+/* A final compile that is used "for real". */
+
+PCRE2_COMPILE(compiled_code, pbuffer, patlen, pat_patctl.options|forbid_utf,
+  &errorcode, &erroroffset, use_pat_context);
+
+/* Compilation failed; go back for another re, skipping to blank line
+if non-interactive. */
+
+if (TEST(compiled_code, ==, NULL))
+  {
+  int len;
+  fprintf(outfile, "Failed: error %d at offset %d: ", errorcode,
+    (int)erroroffset);
+  PCRE2_GET_ERROR_MESSAGE(len, errorcode, pbuffer);
+  PCHARSV(CASTVAR(void *, pbuffer), 0, len, FALSE, outfile);
+  fprintf(outfile, "\n");
+  return PR_SKIP;
+  }
+
+/* If forbid_utf is non-zero, we are running a non-UTF test. UTF and UCP are
+locked out at compile time, but we must also check for occurrences of \P, \p,
+and \X, which are only supported when Unicode is supported. */
+
+if (forbid_utf != 0)
+  {
+  if ((FLD(compiled_code, flags) & PCRE2_HASBKPORX) != 0)
+    {
+    fprintf(outfile, "** \\P, \\p, and \\X are not allowed after the "
+      "#forbid_utf command\n");
+    return PR_SKIP;
+    }
+  }
+
+/* Remember the maximum lookbehind, for partial matching. */
+
+if (pattern_info(PCRE2_INFO_MAXLOOKBEHIND, &maxlookbehind, FALSE) != 0)
+  return PR_ABEND;
+
+/* Call the JIT compiler if requested. When timing, we must free and recompile
+the pattern each time because that is the only way to free the JIT compiled
+code. We know that compilation will always succeed. */
+
+if (pat_patctl.jit != 0)
+  {
+  if (timeit > 0)
+    {
+    register int i;
+    clock_t time_taken = 0;
+    for (i = 0; i < timeit; i++)
+      {
+      clock_t start_time;
+      SUB1(pcre2_code_free, compiled_code);
+      PCRE2_COMPILE(compiled_code, pbuffer, patlen,
+        pat_patctl.options|forbid_utf, &errorcode, &erroroffset,
+        use_pat_context);
+      start_time = clock();
+      PCRE2_JIT_COMPILE(jitrc,compiled_code, pat_patctl.jit);
+      time_taken += clock() - start_time;
+      }
+    total_jit_compile_time += time_taken;
+    fprintf(outfile, "JIT compile  %.4f milliseconds\n",
+      (((double)time_taken * 1000.0) / (double)timeit) /
+        (double)CLOCKS_PER_SEC);
+    }
+  else
+    {
+    PCRE2_JIT_COMPILE(jitrc, compiled_code, pat_patctl.jit);
+    }
+  }
+
+/* If an explicit newline modifier was given, set the information flag in the
+pattern so that it is preserved over push/pop. */
+
+if ((pat_patctl.control & CTL_NL_SET) != 0)
+  {
+  SETFLD(compiled_code, flags, FLD(compiled_code, flags) | PCRE2_NL_SET);
+  }
+
+/* Output code size and other information if requested. */
+
+if ((pat_patctl.control & CTL_MEMORY) != 0) show_memory_info();
+if ((pat_patctl.control & CTL_ANYINFO) != 0)
+  {
+  int rc = show_pattern_info();
+  if (rc != PR_OK) return rc;
+  }
+
+/* The "push" control requests that the compiled pattern be remembered on a
+stack. This is mainly for testing the serialization functionality. */
+
+if ((pat_patctl.control & CTL_PUSH) != 0)
+  {
+  if (patstacknext >= PATSTACKSIZE)
+    {
+    fprintf(outfile, "** Too many pushed patterns (max %d)\n", PATSTACKSIZE);
+    return PR_ABEND;
+    }
+  patstack[patstacknext++] = PTR(compiled_code);
+  SET(compiled_code, NULL);
+  }
+
+return PR_OK;
+}
+
+
+
+/*************************************************
+*        Check match or recursion limit          *
+*************************************************/
+
+static int
+check_match_limit(uint8_t *pp, size_t ulen, int errnumber, const char *msg)
+{
+int capcount;
+uint32_t min = 0;
+uint32_t mid = 64;
+uint32_t max = UINT32_MAX;
+
+PCRE2_SET_MATCH_LIMIT(dat_context, max);
+PCRE2_SET_RECURSION_LIMIT(dat_context, max);
+
+for (;;)
+  {
+  if (errnumber == PCRE2_ERROR_MATCHLIMIT)
+    {
+    PCRE2_SET_MATCH_LIMIT(dat_context, mid);
+    }
+  else
+    {
+    PCRE2_SET_RECURSION_LIMIT(dat_context, mid);
+    }
+
+  if ((pat_patctl.control & CTL_JITFAST) != 0)
+    PCRE2_JIT_MATCH(capcount, compiled_code, pp, ulen, dat_datctl.offset,
+      dat_datctl.options, match_data, PTR(dat_context));
+  else
+    PCRE2_MATCH(capcount, compiled_code, pp, ulen, dat_datctl.offset,
+      dat_datctl.options, match_data, PTR(dat_context));
+
+  if (capcount == errnumber)
+    {
+    min = mid;
+    mid = (mid == max - 1)? max : (max != UINT32_MAX)? (min + max)/2 : mid*2;
+    }
+  else if (capcount >= 0 ||
+           capcount == PCRE2_ERROR_NOMATCH ||
+           capcount == PCRE2_ERROR_PARTIAL)
+    {
+    if (mid == min + 1)
+      {
+      fprintf(outfile, "Minimum %s limit = %d\n", msg, mid);
+      break;
+      }
+    max = mid;
+    mid = (min + mid)/2;
+    }
+  else break;    /* Some other error */
+  }
+
+return capcount;
+}
+
+
+
+/*************************************************
+*              Callout function                  *
+*************************************************/
+
+/* Called from a PCRE2 library as a result of the (?C) item. We print out where
+we are in the match. Yield zero unless more callouts than the fail count, or
+the callout data is not zero. The only differences in the callout block for
+different code unit widths are that the pointers to the subject, the most
+recent MARK, and a callout argument string point to strings of the appropriate
+width. Casts can be used to deal with this.
+
+Argument:  a pointer to a callout block
+Return:
+*/
+
+static int
+callout_function(pcre2_callout_block_8 *cb, void *callout_data_ptr)
+{
+uint32_t i, pre_start, post_start, subject_length;
+BOOL utf = (FLD(compiled_code, overall_options) & PCRE2_UTF) != 0;
+BOOL callout_capture = (dat_datctl.control & CTL_CALLOUT_CAPTURE) != 0;
+
+/* This FILE is used for echoing the subject. This is done only once in simple
+cases. */
+
+FILE *f = (first_callout || callout_capture || cb->callout_string != NULL)?
+  outfile : NULL;
+
+/* For a callout with a string argument, show the string first because there
+isn't a tidy way to fit it in the rest of the data. */
+
+if (cb->callout_string != NULL)
+  {
+  uint32_t delimiter = CODE_UNIT(cb->callout_string, -1);
+  fprintf(outfile, "Callout (%lu): %c",
+    (unsigned long int)cb->callout_string_offset, delimiter);
+  PCHARSV(cb->callout_string, 0,
+    cb->callout_string_length, utf, outfile);
+  for (i = 0; callout_start_delims[i] != 0; i++)
+    if (delimiter == callout_start_delims[i])
+      {
+      delimiter = callout_end_delims[i];
+      break;
+      }
+  fprintf(outfile, "%c", delimiter);
+  if (!callout_capture) fprintf(outfile, "\n");
+  }
+
+/* Show captured strings if required */
+
+if (callout_capture)
+  {
+  if (cb->callout_string == NULL)
+    fprintf(outfile, "Callout %d:", cb->callout_number);
+  fprintf(outfile, " last capture = %d\n", cb->capture_last);
+  for (i = 0; i < cb->capture_top * 2; i += 2)
+    {
+    fprintf(outfile, "%2d: ", i/2);
+    if (cb->offset_vector[i] == PCRE2_UNSET)
+      fprintf(outfile, "<unset>");
+    else
+      {
+      PCHARSV(cb->subject, cb->offset_vector[i],
+        cb->offset_vector[i+1] - cb->offset_vector[i], utf, f);
+      }
+    fprintf(outfile, "\n");
+    }
+  }
+
+/* Re-print the subject in canonical form, the first time or if giving full
+datails. On subsequent calls in the same match, we use pchars just to find the
+printed lengths of the substrings. */
+
+if (f != NULL) fprintf(f, "--->");
+
+PCHARS(pre_start, cb->subject, 0, cb->start_match, utf, f);
+
+PCHARS(post_start, cb->subject, cb->start_match,
+  cb->current_position - cb->start_match, utf, f);
+
+PCHARS(subject_length, cb->subject, 0, cb->subject_length, utf, NULL);
+
+PCHARSV(cb->subject, cb->current_position,
+  cb->subject_length - cb->current_position, utf, f);
+
+if (f != NULL) fprintf(f, "\n");
+
+/* For automatic callouts, show the pattern offset. Otherwise, for a numerical
+callout whose number has not already been shown with captured strings, show the
+number here. A callout with a string argument has been displayed above. */
+
+if (cb->callout_number == 255)
+  {
+  fprintf(outfile, "%+3d ", (int)cb->pattern_position);
+  if (cb->pattern_position > 99) fprintf(outfile, "\n    ");
+  }
+else
+  {
+  if (callout_capture || cb->callout_string != NULL) fprintf(outfile, "    ");
+    else fprintf(outfile, "%3d ", cb->callout_number);
+  }
+
+/* Now show position indicators */
+
+for (i = 0; i < pre_start; i++) fprintf(outfile, " ");
+fprintf(outfile, "^");
+
+if (post_start > 0)
+  {
+  for (i = 0; i < post_start - 1; i++) fprintf(outfile, " ");
+  fprintf(outfile, "^");
+  }
+
+for (i = 0; i < subject_length - pre_start - post_start + 4; i++)
+  fprintf(outfile, " ");
+
+fprintf(outfile, "%.*s",
+  (int)((cb->next_item_length == 0)? 1 : cb->next_item_length),
+  pbuffer8 + cb->pattern_position);
+
+fprintf(outfile, "\n");
+first_callout = FALSE;
+
+if (cb->mark != last_callout_mark)
+  {
+  if (cb->mark == NULL)
+    fprintf(outfile, "Latest Mark: <unset>\n");
+  else
+    {
+    fprintf(outfile, "Latest Mark: ");
+    PCHARSV(cb->mark, 0, -1, utf, outfile);
+    putc('\n', outfile);
+    }
+  last_callout_mark = cb->mark;
+  }
+
+if (callout_data_ptr != NULL)
+  {
+  int callout_data = *((int32_t *)callout_data_ptr);
+  if (callout_data != 0)
+    {
+    fprintf(outfile, "Callout data = %d\n", callout_data);
+    return callout_data;
+    }
+  }
+
+return (cb->callout_number != dat_datctl.cfail[0])? 0 :
+       (++callout_count >= dat_datctl.cfail[1])? 1 : 0;
+}
+
+
+
+/*************************************************
+*       Handle *MARK and copy/get tests          *
+*************************************************/
+
+/* This function is called after complete and partial matches. It runs the
+tests for substring extraction.
+
+Arguments:
+  utf       TRUE for utf
+  capcount  return from pcre2_match()
+
+Returns:    nothing
+*/
+
+static void
+copy_and_get(BOOL utf, int capcount)
+{
+int i;
+uint8_t *nptr;
+
+/* Test copy strings by number */
+
+for (i = 0; i < MAXCPYGET && dat_datctl.copy_numbers[i] >= 0; i++)
+  {
+  int rc;
+  PCRE2_SIZE length, length2;
+  uint32_t copybuffer[256];
+  uint32_t n = (uint32_t)(dat_datctl.copy_numbers[i]);
+  length = sizeof(copybuffer)/code_unit_size;
+  PCRE2_SUBSTRING_COPY_BYNUMBER(rc, match_data, n, copybuffer, &length);
+  if (rc < 0)
+    {
+    fprintf(outfile, "Copy substring %d failed (%d): ", n, rc);
+    PCRE2_GET_ERROR_MESSAGE(rc, rc, pbuffer);
+    PCHARSV(CASTVAR(void *, pbuffer), 0, rc, FALSE, outfile);
+    fprintf(outfile, "\n");
+    }
+  else
+    {
+    PCRE2_SUBSTRING_LENGTH_BYNUMBER(rc, match_data, n, &length2);
+    if (rc < 0)
+      {
+      fprintf(outfile, "Get substring %d length failed (%d): ", n, rc);
+      PCRE2_GET_ERROR_MESSAGE(rc, rc, pbuffer);
+      PCHARSV(CASTVAR(void *, pbuffer), 0, rc, FALSE, outfile);
+      fprintf(outfile, "\n");
+      }
+    else if (length2 != length)
+      {
+      fprintf(outfile, "Mismatched substring lengths: %lu %lu\n",
+        (unsigned long int)length, (unsigned long int)length2);
+      }
+    fprintf(outfile, "%2dC ", n);
+    PCHARSV(copybuffer, 0, length, utf, outfile);
+    fprintf(outfile, " (%lu)\n", (unsigned long)length);
+    }
+  }
+
+/* Test copy strings by name */
+
+nptr = dat_datctl.copy_names;
+for (;;)
+  {
+  int rc;
+  int groupnumber;
+  PCRE2_SIZE length, length2;
+  uint32_t copybuffer[256];
+  int namelen = strlen((const char *)nptr);
+#if defined SUPPORT_PCRE2_16 || defined SUPPORT_PCRE2_32
+  PCRE2_SIZE cnl = namelen;
+#endif
+  if (namelen == 0) break;
+
+#ifdef SUPPORT_PCRE2_8
+  if (test_mode == PCRE8_MODE) strcpy((char *)pbuffer8, (char *)nptr);
+#endif
+#ifdef SUPPORT_PCRE2_16
+  if (test_mode == PCRE16_MODE)(void)to16(nptr, utf, &cnl);
+#endif
+#ifdef SUPPORT_PCRE2_32
+  if (test_mode == PCRE32_MODE)(void)to32(nptr, utf, &cnl);
+#endif
+
+  PCRE2_SUBSTRING_NUMBER_FROM_NAME(groupnumber, compiled_code, pbuffer);
+  if (groupnumber < 0 && groupnumber != PCRE2_ERROR_NOUNIQUESUBSTRING)
+    fprintf(outfile, "Number not found for group '%s'\n", nptr);
+
+  length = sizeof(copybuffer)/code_unit_size;
+  PCRE2_SUBSTRING_COPY_BYNAME(rc, match_data, pbuffer, copybuffer, &length);
+  if (rc < 0)
+    {
+    fprintf(outfile, "Copy substring '%s' failed (%d): ", nptr, rc);
+    PCRE2_GET_ERROR_MESSAGE(rc, rc, pbuffer);
+    PCHARSV(CASTVAR(void *, pbuffer), 0, rc, FALSE, outfile);
+    fprintf(outfile, "\n");
+    }
+  else
+    {
+    PCRE2_SUBSTRING_LENGTH_BYNAME(rc, match_data, pbuffer, &length2);
+    if (rc < 0)
+      {
+      fprintf(outfile, "Get substring '%s' length failed (%d): ", nptr, rc);
+      PCRE2_GET_ERROR_MESSAGE(rc, rc, pbuffer);
+      PCHARSV(CASTVAR(void *, pbuffer), 0, rc, FALSE, outfile);
+      fprintf(outfile, "\n");
+      }
+    else if (length2 != length)
+      {
+      fprintf(outfile, "Mismatched substring lengths: %lu %lu\n",
+        (unsigned long int)length, (unsigned long int)length2);
+      }
+    fprintf(outfile, "  C ");
+    PCHARSV(copybuffer, 0, length, utf, outfile);
+    fprintf(outfile, " (%lu) %s", (unsigned long)length, nptr);
+    if (groupnumber >= 0) fprintf(outfile, " (group %d)\n", groupnumber);
+      else fprintf(outfile, " (non-unique)\n");
+    }
+  nptr += namelen + 1;
+  }
+
+/* Test get strings by number */
+
+for (i = 0; i < MAXCPYGET && dat_datctl.get_numbers[i] >= 0; i++)
+  {
+  int rc;
+  PCRE2_SIZE length;
+  void *gotbuffer;
+  uint32_t n = (uint32_t)(dat_datctl.get_numbers[i]);
+  PCRE2_SUBSTRING_GET_BYNUMBER(rc, match_data, n, &gotbuffer, &length);
+  if (rc < 0)
+    {
+    fprintf(outfile, "Get substring %d failed (%d): ", n, rc);
+    PCRE2_GET_ERROR_MESSAGE(rc, rc, pbuffer);
+    PCHARSV(CASTVAR(void *, pbuffer), 0, rc, FALSE, outfile);
+    fprintf(outfile, "\n");
+    }
+  else
+    {
+    fprintf(outfile, "%2dG ", n);
+    PCHARSV(gotbuffer, 0, length, utf, outfile);
+    fprintf(outfile, " (%lu)\n", (unsigned long)length);
+    PCRE2_SUBSTRING_FREE(gotbuffer);
+    }
+  }
+
+/* Test get strings by name */
+
+nptr = dat_datctl.get_names;
+for (;;)
+  {
+  PCRE2_SIZE length;
+  void *gotbuffer;
+  int rc;
+  int groupnumber;
+  int namelen = strlen((const char *)nptr);
+#if defined SUPPORT_PCRE2_16 || defined SUPPORT_PCRE2_32
+  PCRE2_SIZE cnl = namelen;
+#endif
+  if (namelen == 0) break;
+
+#ifdef SUPPORT_PCRE2_8
+  if (test_mode == PCRE8_MODE) strcpy((char *)pbuffer8, (char *)nptr);
+#endif
+#ifdef SUPPORT_PCRE2_16
+  if (test_mode == PCRE16_MODE)(void)to16(nptr, utf, &cnl);
+#endif
+#ifdef SUPPORT_PCRE2_32
+  if (test_mode == PCRE32_MODE)(void)to32(nptr, utf, &cnl);
+#endif
+
+  PCRE2_SUBSTRING_NUMBER_FROM_NAME(groupnumber, compiled_code, pbuffer);
+  if (groupnumber < 0 && groupnumber != PCRE2_ERROR_NOUNIQUESUBSTRING)
+    fprintf(outfile, "Number not found for group '%s'\n", nptr);
+
+  PCRE2_SUBSTRING_GET_BYNAME(rc, match_data, pbuffer, &gotbuffer, &length);
+  if (rc < 0)
+    {
+    fprintf(outfile, "Get substring '%s' failed (%d): ", nptr, rc);
+    PCRE2_GET_ERROR_MESSAGE(rc, rc, pbuffer);
+    PCHARSV(CASTVAR(void *, pbuffer), 0, rc, FALSE, outfile);
+    fprintf(outfile, "\n");
+    }
+  else
+    {
+    fprintf(outfile, "  G ");
+    PCHARSV(gotbuffer, 0, length, utf, outfile);
+    fprintf(outfile, " (%lu) %s", (unsigned long)length, nptr);
+    if (groupnumber >= 0) fprintf(outfile, " (group %d)\n", groupnumber);
+      else fprintf(outfile, " (non-unique)\n");
+    PCRE2_SUBSTRING_FREE(gotbuffer);
+    }
+  nptr += namelen + 1;
+  }
+
+/* Test getting the complete list of captured strings. */
+
+if ((dat_datctl.control & CTL_GETALL) != 0)
+  {
+  int rc;
+  void **stringlist;
+  PCRE2_SIZE *lengths;
+  PCRE2_SUBSTRING_LIST_GET(rc, match_data, &stringlist, &lengths);
+  if (rc < 0)
+    {
+    fprintf(outfile, "get substring list failed (%d): ", rc);
+    PCRE2_GET_ERROR_MESSAGE(rc, rc, pbuffer);
+    PCHARSV(CASTVAR(void *, pbuffer), 0, rc, FALSE, outfile);
+    fprintf(outfile, "\n");
+    }
+  else
+    {
+    for (i = 0; i < capcount; i++)
+      {
+      fprintf(outfile, "%2dL ", i);
+      PCHARSV(stringlist[i], 0, lengths[i], utf, outfile);
+      putc('\n', outfile);
+      }
+    if (stringlist[i] != NULL)
+      fprintf(outfile, "string list not terminated by NULL\n");
+    PCRE2_SUBSTRING_LIST_FREE(stringlist);
+    }
+  }
+}
+
+
+
+/*************************************************
+*               Process a data line              *
+*************************************************/
+
+/* The line is in buffer; it will not be empty.
+
+Arguments:  none
+
+Returns:    PR_OK     continue processing next line
+            PR_SKIP   skip to a blank line
+            PR_ABEND  abort the pcre2test run
+*/
+
+static int
+process_data(void)
+{
+PCRE2_SIZE len, ulen;
+uint32_t gmatched;
+uint32_t c, k;
+uint32_t g_notempty = 0;
+uint8_t *p, *pp, *start_rep;
+size_t needlen;
+void *use_dat_context;
+BOOL utf;
+
+#ifdef SUPPORT_PCRE2_8
+uint8_t *q8 = NULL;
+#endif
+#ifdef SUPPORT_PCRE2_16
+uint16_t *q16 = NULL;
+#endif
+#ifdef SUPPORT_PCRE2_32
+uint32_t *q32 = NULL;
+#endif
+
+/* Copy the default context and data control blocks to the active ones. Then
+copy from the pattern the controls that can be set in either the pattern or the
+data. This allows them to be overridden in the data line. We do not do this for
+options because those that are common apply separately to compiling and
+matching. */
+
+DATCTXCPY(dat_context, default_dat_context);
+memcpy(&dat_datctl, &def_datctl, sizeof(datctl));
+dat_datctl.control |= (pat_patctl.control & CTL_ALLPD);
+dat_datctl.control2 |= (pat_patctl.control2 & CTL2_ALLPD);
+strcpy((char *)dat_datctl.replacement, (char *)pat_patctl.replacement);
+
+/* Initialize for scanning the data line. */
+
+#ifdef SUPPORT_PCRE2_8
+utf = ((((pat_patctl.control & CTL_POSIX) != 0)?
+  ((pcre2_real_code_8 *)preg.re_pcre2_code)->overall_options :
+  FLD(compiled_code, overall_options)) & PCRE2_UTF) != 0;
+#else
+utf = (FLD(compiled_code, overall_options) & PCRE2_UTF) != 0;
+#endif
+
+start_rep = NULL;
+len = strlen((const char *)buffer);
+while (len > 0 && isspace(buffer[len-1])) len--;
+buffer[len] = 0;
+p = buffer;
+while (isspace(*p)) p++;
+
+/* Check that the data is well-formed UTF-8 if we're in UTF mode. To create
+invalid input to pcre2_match(), you must use \x?? or \x{} sequences. */
+
+if (utf)
+  {
+  uint8_t *q;
+  uint32_t cc;
+  int n = 1;
+  for (q = p; n > 0 && *q; q += n) n = utf82ord(q, &cc);
+  if (n <= 0)
+    {
+    fprintf(outfile, "** Failed: invalid UTF-8 string cannot be used as input "
+      "in UTF mode\n");
+    return PR_OK;
+    }
+  }
+
+#ifdef SUPPORT_VALGRIND
+/* Mark the dbuffer as addressable but undefined again. */
+if (dbuffer != NULL)
+  {
+  VALGRIND_MAKE_MEM_UNDEFINED(dbuffer, dbuffer_size);
+  }
+#endif
+
+/* Allocate a buffer to hold the data line; len+1 is an upper bound on
+the number of code units that will be needed (though the buffer may have to be
+extended if replication is involved). */
+
+needlen = (size_t)((len+1) * code_unit_size);
+if (dbuffer == NULL || needlen >= dbuffer_size)
+  {
+  while (needlen >= dbuffer_size) dbuffer_size *= 2;
+  dbuffer = (uint8_t *)realloc(dbuffer, dbuffer_size);
+  if (dbuffer == NULL)
+    {
+    fprintf(stderr, "pcre2test: realloc(%d) failed\n", (int)dbuffer_size);
+    exit(1);
+    }
+  }
+SETCASTPTR(q, dbuffer);  /* Sets q8, q16, or q32, as appropriate. */
+
+/* Scan the data line, interpreting data escapes, and put the result into a
+buffer of the appropriate width. In UTF mode, input can be UTF-8. */
+
+while ((c = *p++) != 0)
+  {
+  int i = 0;
+  size_t replen;
+
+  /* ] may mark the end of a replicated sequence */
+
+  if (c == ']' && start_rep != NULL)
+    {
+    size_t qoffset = CAST8VAR(q) - dbuffer;
+    size_t rep_offset = start_rep - dbuffer;
+
+    if (*p++ != '{')
+      {
+      fprintf(outfile, "** Expected '{' after \\[....]\n");
+      return PR_OK;
+      }
+    while (isdigit(*p)) i = i * 10 + *p++ - '0';
+    if (*p++ != '}')
+      {
+      fprintf(outfile, "** Expected '}' after \\[...]{...\n");
+      return PR_OK;
+      }
+    if (i-- == 0)
+      {
+      fprintf(outfile, "** Zero repeat not allowed\n");
+      return PR_OK;
+      }
+
+    replen = CAST8VAR(q) - start_rep;
+    needlen += replen * i;
+
+    if (needlen >= dbuffer_size)
+      {
+      while (needlen >= dbuffer_size) dbuffer_size *= 2;
+      dbuffer = (uint8_t *)realloc(dbuffer, dbuffer_size);
+      if (dbuffer == NULL)
+        {
+        fprintf(stderr, "pcre2test: realloc(%d) failed\n", (int)dbuffer_size);
+        exit(1);
+        }
+      SETCASTPTR(q, dbuffer + qoffset);
+      start_rep = dbuffer + rep_offset;
+      }
+
+    while (i-- > 0)
+      {
+      memcpy(CAST8VAR(q), start_rep, replen);
+      SETPLUS(q, replen/code_unit_size);
+      }
+
+    start_rep = NULL;
+    continue;
+    }
+
+  /* Handle a non-escaped character */
+
+  if (c != '\\')
+    {
+    if (utf && HASUTF8EXTRALEN(c)) { GETUTF8INC(c, p); }
+    }
+
+  /* Handle backslash escapes */
+
+  else switch ((c = *p++))
+    {
+    case '\\': break;
+    case 'a': c = CHAR_BEL; break;
+    case 'b': c = '\b'; break;
+    case 'e': c = CHAR_ESC; break;
+    case 'f': c = '\f'; break;
+    case 'n': c = '\n'; break;
+    case 'r': c = '\r'; break;
+    case 't': c = '\t'; break;
+    case 'v': c = '\v'; break;
+
+    case '0': case '1': case '2': case '3':
+    case '4': case '5': case '6': case '7':
+    c -= '0';
+    while (i++ < 2 && isdigit(*p) && *p != '8' && *p != '9')
+      c = c * 8 + *p++ - '0';
+    break;
+
+    case 'o':
+    if (*p == '{')
+      {
+      uint8_t *pt = p;
+      c = 0;
+      for (pt++; isdigit(*pt) && *pt != '8' && *pt != '9'; pt++)
+        {
+        if (++i == 12)
+          fprintf(outfile, "** Too many octal digits in \\o{...} item; "
+                           "using only the first twelve.\n");
+        else c = c * 8 + *pt - '0';
+        }
+      if (*pt == '}') p = pt + 1;
+        else fprintf(outfile, "** Missing } after \\o{ (assumed)\n");
+      }
+    break;
+
+    case 'x':
+    if (*p == '{')
+      {
+      uint8_t *pt = p;
+      c = 0;
+
+      /* We used to have "while (isxdigit(*(++pt)))" here, but it fails
+      when isxdigit() is a macro that refers to its argument more than
+      once. This is banned by the C Standard, but apparently happens in at
+      least one MacOS environment. */
+
+      for (pt++; isxdigit(*pt); pt++)
+        {
+        if (++i == 9)
+          fprintf(outfile, "** Too many hex digits in \\x{...} item; "
+                           "using only the first eight.\n");
+        else c = c * 16 + tolower(*pt) - ((isdigit(*pt))? '0' : 'a' - 10);
+        }
+      if (*pt == '}')
+        {
+        p = pt + 1;
+        break;
+        }
+      /* Not correct form for \x{...}; fall through */
+      }
+
+    /* \x without {} always defines just one byte in 8-bit mode. This
+    allows UTF-8 characters to be constructed byte by byte, and also allows
+    invalid UTF-8 sequences to be made. Just copy the byte in UTF-8 mode.
+    Otherwise, pass it down as data. */
+
+    c = 0;
+    while (i++ < 2 && isxdigit(*p))
+      {
+      c = c * 16 + tolower(*p) - ((isdigit(*p))? '0' : 'a' - 10);
+      p++;
+      }
+#if defined SUPPORT_PCRE2_8
+    if (utf && (test_mode == PCRE8_MODE))
+      {
+      *q8++ = c;
+      continue;
+      }
+#endif
+    break;
+
+    case 0:     /* \ followed by EOF allows for an empty line */
+    p--;
+    continue;
+
+    case '=':   /* \= terminates the data, starts modifiers */
+    goto ENDSTRING;
+
+    case '[':   /* \[ introduces a replicated character sequence */
+    if (start_rep != NULL)
+      {
+      fprintf(outfile, "** Nested replication is not supported\n");
+      return PR_OK;
+      }
+    start_rep = CAST8VAR(q);
+    continue;
+
+    default:
+    if (isalnum(c))
+      {
+      fprintf(outfile, "** Unrecognized escape sequence \"\\%c\"\n", c);
+      return PR_OK;
+      }
+    }
+
+  /* We now have a character value in c that may be greater than 255.
+  In 8-bit mode we convert to UTF-8 if we are in UTF mode. Values greater
+  than 127 in UTF mode must have come from \x{...} or octal constructs
+  because values from \x.. get this far only in non-UTF mode. */
+
+#ifdef SUPPORT_PCRE2_8
+  if (test_mode == PCRE8_MODE)
+    {
+    if (utf)
+      {
+      if (c > 0x7fffffff)
+        {
+        fprintf(outfile, "** Character \\x{%x} is greater than 0x7fffffff "
+          "and so cannot be converted to UTF-8\n", c);
+        return PR_OK;
+        }
+      q8 += ord2utf8(c, q8);
+      }
+    else
+      {
+      if (c > 0xffu)
+        {
+        fprintf(outfile, "** Character \\x{%x} is greater than 255 "
+          "and UTF-8 mode is not enabled.\n", c);
+        fprintf(outfile, "** Truncation will probably give the wrong "
+          "result.\n");
+        }
+      *q8++ = c;
+      }
+    }
+#endif
+#ifdef SUPPORT_PCRE2_16
+  if (test_mode == PCRE16_MODE)
+    {
+    if (utf)
+      {
+      if (c > 0x10ffffu)
+        {
+        fprintf(outfile, "** Failed: character \\x{%x} is greater than "
+          "0x10ffff and so cannot be converted to UTF-16\n", c);
+        return PR_OK;
+        }
+      else if (c >= 0x10000u)
+        {
+        c-= 0x10000u;
+        *q16++ = 0xD800 | (c >> 10);
+        *q16++ = 0xDC00 | (c & 0x3ff);
+        }
+      else
+        *q16++ = c;
+      }
+    else
+      {
+      if (c > 0xffffu)
+        {
+        fprintf(outfile, "** Character \\x{%x} is greater than 0xffff "
+          "and UTF-16 mode is not enabled.\n", c);
+        fprintf(outfile, "** Truncation will probably give the wrong "
+          "result.\n");
+        }
+
+      *q16++ = c;
+      }
+    }
+#endif
+#ifdef SUPPORT_PCRE2_32
+  if (test_mode == PCRE32_MODE)
+    {
+    *q32++ = c;
+    }
+#endif
+  }
+
+ENDSTRING:
+SET(*q, 0);
+len = CASTVAR(uint8_t *, q) - dbuffer;    /* Length in bytes */
+ulen = len/code_unit_size;                /* Length in code units */
+
+/* If the string was terminated by \= we must now interpret modifiers. */
+
+if (p[-1] != 0 && !decode_modifiers(p, CTX_DAT, NULL, &dat_datctl))
+  return PR_OK;
+
+/* Check for mutually exclusive modifiers. At present, these are all in the
+first control word. */
+
+for (k = 0; k < sizeof(exclusive_dat_controls)/sizeof(uint32_t); k++)
+  {
+  c = dat_datctl.control & exclusive_dat_controls[k];
+  if (c != 0 && c != (c & (~c+1)))
+    {
+    show_controls(c, 0, "** Not allowed together:");
+    fprintf(outfile, "\n");
+    return PR_OK;
+    }
+  }
+
+if (pat_patctl.replacement[0] != 0 &&
+    (dat_datctl.control & CTL_NULLCONTEXT) != 0)
+  {
+  fprintf(outfile, "** Replacement text is not supported with null_context.\n");
+  return PR_OK;
+  }
+
+/* We now have the subject in dbuffer, with len containing the byte length, and
+ulen containing the code unit length. Move the data to the end of the buffer so
+that a read over the end can be caught by valgrind or other means. If we have
+explicit valgrind support, mark the unused start of the buffer unaddressable.
+If we are using the POSIX interface, or testing zero-termination, we must
+include the terminating zero in the usable data. */
+
+c = code_unit_size * (((pat_patctl.control & CTL_POSIX) +
+                       (dat_datctl.control & CTL_ZERO_TERMINATE) != 0)? 1:0);
+pp = memmove(dbuffer + dbuffer_size - len - c, dbuffer, len + c);
+#ifdef SUPPORT_VALGRIND
+  VALGRIND_MAKE_MEM_NOACCESS(dbuffer, dbuffer_size - (len + c));
+#endif
+
+/* Now pp points to the subject string. POSIX matching is only possible in
+8-bit mode, and it does not support timing or other fancy features. Some were
+checked at compile time, but we need to check the match-time settings here. */
+
+#ifdef SUPPORT_PCRE2_8
+if ((pat_patctl.control & CTL_POSIX) != 0)
+  {
+  int rc;
+  int eflags = 0;
+  regmatch_t *pmatch = NULL;
+  const char *msg = "** Ignored with POSIX interface:";
+
+  if (dat_datctl.cfail[0] != CFAIL_UNSET || dat_datctl.cfail[1] != CFAIL_UNSET)
+    prmsg(&msg, "callout_fail");
+  if (dat_datctl.copy_numbers[0] >= 0 || dat_datctl.copy_names[0] != 0)
+    prmsg(&msg, "copy");
+  if (dat_datctl.get_numbers[0] >= 0 || dat_datctl.get_names[0] != 0)
+    prmsg(&msg, "get");
+  if (dat_datctl.jitstack != 0) prmsg(&msg, "jitstack");
+
+  if ((dat_datctl.options & ~POSIX_SUPPORTED_MATCH_OPTIONS) != 0)
+    {
+    fprintf(outfile, "%s", msg);
+    show_match_options(dat_datctl.options & ~POSIX_SUPPORTED_MATCH_OPTIONS);
+    msg = "";
+    }
+  if ((dat_datctl.control & ~POSIX_SUPPORTED_MATCH_CONTROLS) != 0 ||
+      (dat_datctl.control2 & ~POSIX_SUPPORTED_MATCH_CONTROLS2) != 0)
+    {
+    show_controls(dat_datctl.control & ~POSIX_SUPPORTED_MATCH_CONTROLS,
+                  dat_datctl.control2 & ~POSIX_SUPPORTED_MATCH_CONTROLS2, msg);
+    msg = "";
+    }
+
+  if (msg[0] == 0) fprintf(outfile, "\n");
+
+  if (dat_datctl.oveccount > 0)
+    pmatch = (regmatch_t *)malloc(sizeof(regmatch_t) * dat_datctl.oveccount);
+  if ((dat_datctl.options & PCRE2_NOTBOL) != 0) eflags |= REG_NOTBOL;
+  if ((dat_datctl.options & PCRE2_NOTEOL) != 0) eflags |= REG_NOTEOL;
+  if ((dat_datctl.options & PCRE2_NOTEMPTY) != 0) eflags |= REG_NOTEMPTY;
+
+  rc = regexec(&preg, (const char *)pp + dat_datctl.offset,
+    dat_datctl.oveccount, pmatch, eflags);
+  if (rc != 0)
+    {
+    (void)regerror(rc, &preg, (char *)pbuffer8, pbuffer8_size);
+    fprintf(outfile, "No match: POSIX code %d: %s\n", rc, pbuffer8);
+    }
+  else if ((pat_patctl.options & PCRE2_NO_AUTO_CAPTURE) != 0)
+    fprintf(outfile, "Matched with REG_NOSUB\n");
+  else if (dat_datctl.oveccount == 0)
+    fprintf(outfile, "Matched without capture\n");
+  else
+    {
+    size_t i;
+    for (i = 0; i < (size_t)dat_datctl.oveccount; i++)
+      {
+      if (pmatch[i].rm_so >= 0)
+        {
+        fprintf(outfile, "%2d: ", (int)i);
+        PCHARSV(pp, pmatch[i].rm_so,
+          pmatch[i].rm_eo - pmatch[i].rm_so, utf, outfile);
+        fprintf(outfile, "\n");
+        if ((i == 0 && (dat_datctl.control & CTL_AFTERTEXT) != 0) ||
+            (dat_datctl.control & CTL_ALLAFTERTEXT) != 0)
+          {
+          fprintf(outfile, "%2d+ ", (int)i);
+          PCHARSV(pp, pmatch[i].rm_eo, len - pmatch[i].rm_eo,
+            utf, outfile);
+          fprintf(outfile, "\n");
+          }
+        }
+      }
+    }
+  free(pmatch);
+  return PR_OK;
+  }
+#endif  /* SUPPORT_PCRE2_8 */
+
+ /* Handle matching via the native interface. Check for consistency of
+modifiers. */
+
+if ((dat_datctl.control & (CTL_DFA|CTL_FINDLIMITS)) == (CTL_DFA|CTL_FINDLIMITS))
+  {
+  fprintf(outfile, "** Finding match limits is not relevant for DFA matching: ignored\n");
+  dat_datctl.control &= ~CTL_FINDLIMITS;
+  }
+
+/* ALLUSEDTEXT is not supported with JIT, but JIT is not used with DFA
+matching, even if the JIT compiler was used. */
+
+if ((dat_datctl.control & (CTL_ALLUSEDTEXT|CTL_DFA)) == CTL_ALLUSEDTEXT &&
+    FLD(compiled_code, executable_jit) != NULL)
+  {
+  fprintf(outfile, "** Showing all consulted text is not supported by JIT: ignored\n");
+  dat_datctl.control &= ~CTL_ALLUSEDTEXT;
+  }
+
+/* Handle passing the subject as zero-terminated. */
+
+if ((dat_datctl.control & CTL_ZERO_TERMINATE) != 0)
+  ulen = PCRE2_ZERO_TERMINATED;
+
+/* The nullcontext modifier is used to test calling pcre2_[jit_]match() with a
+NULL context. */
+
+use_dat_context = ((dat_datctl.control & CTL_NULLCONTEXT) != 0)?
+  NULL : PTR(dat_context);
+
+/* Enable display of malloc/free if wanted. */
+
+show_memory = (dat_datctl.control & CTL_MEMORY) != 0;
+
+/* Create and assign a JIT stack if requested. */
+
+if (dat_datctl.jitstack != 0)
+  {
+  if (dat_datctl.jitstack != jit_stack_size)
+    {
+    PCRE2_JIT_STACK_FREE(jit_stack);
+    PCRE2_JIT_STACK_CREATE(jit_stack, 1, dat_datctl.jitstack * 1024, NULL);
+    jit_stack_size = dat_datctl.jitstack;
+    }
+  PCRE2_JIT_STACK_ASSIGN(dat_context, jit_callback, jit_stack);
+  }
+
+/* Or de-assign */
+
+else if (jit_stack != NULL)
+  {
+  PCRE2_JIT_STACK_ASSIGN(dat_context, NULL, NULL);
+  PCRE2_JIT_STACK_FREE(jit_stack);
+  jit_stack = NULL;
+  jit_stack_size = 0;
+  }
+
+/* When no JIT stack is assigned, we must ensure that there is a JIT callback
+if we want to verify that JIT was actually used. */
+
+if ((pat_patctl.control & CTL_JITVERIFY) != 0 && jit_stack == NULL)
+   {
+   PCRE2_JIT_STACK_ASSIGN(dat_context, jit_callback, NULL);
+   }
+
+/* Adjust match_data according to size of offsets required. A size of zero
+causes a new match data block to be obtained that exactly fits the pattern. */
+
+if (dat_datctl.oveccount == 0)
+  {
+  PCRE2_MATCH_DATA_FREE(match_data);
+  PCRE2_MATCH_DATA_CREATE_FROM_PATTERN(match_data, compiled_code, NULL);
+  PCRE2_GET_OVECTOR_COUNT(max_oveccount, match_data);
+  }
+else if (dat_datctl.oveccount <= max_oveccount)
+  {
+  SETFLD(match_data, oveccount, dat_datctl.oveccount);
+  }
+else
+  {
+  max_oveccount = dat_datctl.oveccount;
+  PCRE2_MATCH_DATA_FREE(match_data);
+  PCRE2_MATCH_DATA_CREATE(match_data, max_oveccount, NULL);
+  }
+
+/* Replacement processing is ignored for DFA matching. */
+
+if (dat_datctl.replacement[0] != 0 && (dat_datctl.control & CTL_DFA) != 0)
+  {
+  fprintf(outfile, "** Ignored for DFA matching: replace\n");
+  dat_datctl.replacement[0] = 0;
+  }
+
+/* If a replacement string is provided, call pcre2_substitute() instead of one
+of the matching functions. First we have to convert the replacement string to
+the appropriate width. */
+
+if (dat_datctl.replacement[0] != 0)
+  {
+  int rc;
+  uint8_t *pr;
+  uint8_t rbuffer[REPLACE_BUFFSIZE];
+  uint8_t nbuffer[REPLACE_BUFFSIZE];
+  uint32_t xoptions;
+  PCRE2_SIZE rlen, nsize, erroroffset;
+  BOOL badutf = FALSE;
+
+#ifdef SUPPORT_PCRE2_8
+  uint8_t *r8 = NULL;
+#endif
+#ifdef SUPPORT_PCRE2_16
+  uint16_t *r16 = NULL;
+#endif
+#ifdef SUPPORT_PCRE2_32
+  uint32_t *r32 = NULL;
+#endif
+
+  if (timeitm)
+    fprintf(outfile, "** Timing is not supported with replace: ignored\n");
+
+  xoptions = (((dat_datctl.control & CTL_GLOBAL) == 0)? 0 :
+                PCRE2_SUBSTITUTE_GLOBAL) |
+             (((dat_datctl.control2 & CTL2_SUBSTITUTE_EXTENDED) == 0)? 0 :
+                PCRE2_SUBSTITUTE_EXTENDED) |
+             (((dat_datctl.control2 & CTL2_SUBSTITUTE_OVERFLOW_LENGTH) == 0)? 0 :
+                PCRE2_SUBSTITUTE_OVERFLOW_LENGTH) |
+             (((dat_datctl.control2 & CTL2_SUBSTITUTE_UNKNOWN_UNSET) == 0)? 0 :
+                PCRE2_SUBSTITUTE_UNKNOWN_UNSET) |
+             (((dat_datctl.control2 & CTL2_SUBSTITUTE_UNSET_EMPTY) == 0)? 0 :
+                PCRE2_SUBSTITUTE_UNSET_EMPTY);
+
+  SETCASTPTR(r, rbuffer);  /* Sets r8, r16, or r32, as appropriate. */
+  pr = dat_datctl.replacement;
+
+  /* If the replacement starts with '[<number>]' we interpret that as length
+  value for the replacement buffer. */
+
+  nsize = REPLACE_BUFFSIZE/code_unit_size;
+  if (*pr == '[')
+    {
+    PCRE2_SIZE n = 0;
+    while ((c = *(++pr)) >= CHAR_0 && c <= CHAR_9) n = n * 10 + c - CHAR_0;
+    if (*pr++ != ']')
+      {
+      fprintf(outfile, "Bad buffer size in replacement string\n");
+      return PR_OK;
+      }
+    if (n > nsize)
+      {
+      fprintf(outfile, "Replacement buffer setting (%lu) is too large "
+        "(max %lu)\n", (unsigned long int)n, (unsigned long int)nsize);
+      return PR_OK;
+      }
+    nsize = n;
+    }
+
+  /* Now copy the replacement string to a buffer of the appropriate width. No
+  escape processing is done for replacements. In UTF mode, check for an invalid
+  UTF-8 input string, and if it is invalid, just copy its code units without
+  UTF interpretation. This provides a means of checking that an invalid string
+  is detected. Otherwise, UTF-8 can be used to include wide characters in a
+  replacement. */
+
+  if (utf) badutf = valid_utf(pr, strlen((const char *)pr), &erroroffset);
+
+  /* Not UTF or invalid UTF-8: just copy the code units. */
+
+  if (!utf || badutf)
+    {
+    while ((c = *pr++) != 0)
+      {
+#ifdef SUPPORT_PCRE2_8
+      if (test_mode == PCRE8_MODE) *r8++ = c;
+#endif
+#ifdef SUPPORT_PCRE2_16
+      if (test_mode == PCRE16_MODE) *r16++ = c;
+#endif
+#ifdef SUPPORT_PCRE2_32
+      if (test_mode == PCRE32_MODE) *r32++ = c;
+#endif
+      }
+    }
+
+  /* Valid UTF-8 replacement string */
+
+  else while ((c = *pr++) != 0)
+    {
+    if (HASUTF8EXTRALEN(c)) { GETUTF8INC(c, pr); }
+
+#ifdef SUPPORT_PCRE2_8
+    if (test_mode == PCRE8_MODE) r8 += ord2utf8(c, r8);
+#endif
+
+#ifdef SUPPORT_PCRE2_16
+    if (test_mode == PCRE16_MODE)
+      {
+      if (c >= 0x10000u)
+        {
+        c-= 0x10000u;
+        *r16++ = 0xD800 | (c >> 10);
+        *r16++ = 0xDC00 | (c & 0x3ff);
+        }
+      else *r16++ = c;
+      }
+#endif
+
+#ifdef SUPPORT_PCRE2_32
+    if (test_mode == PCRE32_MODE) *r32++ = c;
+#endif
+    }
+
+  SET(*r, 0);
+  if ((dat_datctl.control & CTL_ZERO_TERMINATE) != 0)
+    rlen = PCRE2_ZERO_TERMINATED;
+  else
+    rlen = (CASTVAR(uint8_t *, r) - rbuffer)/code_unit_size;
+  PCRE2_SUBSTITUTE(rc, compiled_code, pp, ulen, dat_datctl.offset,
+    dat_datctl.options|xoptions, match_data, dat_context,
+    rbuffer, rlen, nbuffer, &nsize);
+
+  if (rc < 0)
+    {
+    PCRE2_SIZE msize;
+    fprintf(outfile, "Failed: error %d", rc);
+    if (rc != PCRE2_ERROR_NOMEMORY && nsize != PCRE2_UNSET)
+      fprintf(outfile, " at offset %ld in replacement", (long int)nsize);
+    fprintf(outfile, ": ");
+    PCRE2_GET_ERROR_MESSAGE(msize, rc, pbuffer);
+    PCHARSV(CASTVAR(void *, pbuffer), 0, msize, FALSE, outfile);
+    if (rc == PCRE2_ERROR_NOMEMORY &&
+        (xoptions & PCRE2_SUBSTITUTE_OVERFLOW_LENGTH) != 0)
+      fprintf(outfile, ": %ld code units are needed", (long int)nsize);
+    }
+  else
+    {
+    fprintf(outfile, "%2d: ", rc);
+    PCHARSV(nbuffer, 0, nsize, utf, outfile);
+    }
+
+  fprintf(outfile, "\n");
+  }   /* End of substitution handling */
+
+/* When a replacement string is not provided, run a loop for global matching
+with one of the basic matching functions. */
+
+else for (gmatched = 0;; gmatched++)
+  {
+  PCRE2_SIZE j;
+  int capcount;
+  PCRE2_SIZE *ovector;
+  PCRE2_SIZE ovecsave[2];
+
+  ovector = FLD(match_data, ovector);
+
+  /* After the first time round a global loop, for a normal global (/g)
+  iteration, save the current ovector[0,1] so that we can check that they do
+  change each time. Otherwise a matching bug that returns the same string
+  causes an infinite loop. It has happened! */
+
+  if (gmatched > 0 && (dat_datctl.control & CTL_GLOBAL) != 0)
+    {
+    ovecsave[0] = ovector[0];
+    ovecsave[1] = ovector[1];
+    }
+
+  /* For altglobal (or first time round the loop), set an "unset" value. */
+
+  else ovecsave[0] = ovecsave[1] = PCRE2_UNSET;
+
+  /* Fill the ovector with junk to detect elements that do not get set
+  when they should be. */
+
+  for (j = 0; j < 2*dat_datctl.oveccount; j++) ovector[j] = JUNK_OFFSET;
+
+  /* When matching is via pcre2_match(), we will detect the use of JIT via the
+  stack callback function. */
+
+  jit_was_used = (pat_patctl.control & CTL_JITFAST) != 0;
+
+  /* Do timing if required. */
+
+  if (timeitm > 0)
+    {
+    register int i;
+    clock_t start_time, time_taken;
+
+    if ((dat_datctl.control & CTL_DFA) != 0)
+      {
+      if ((dat_datctl.options & PCRE2_DFA_RESTART) != 0)
+        {
+        fprintf(outfile, "Timing DFA restarts is not supported\n");
+        return PR_OK;
+        }
+      if (dfa_workspace == NULL)
+        dfa_workspace = (int *)malloc(DFA_WS_DIMENSION*sizeof(int));
+      start_time = clock();
+      for (i = 0; i < timeitm; i++)
+        {
+        PCRE2_DFA_MATCH(capcount, compiled_code, pp, ulen,
+          dat_datctl.offset, dat_datctl.options | g_notempty, match_data,
+          use_dat_context, dfa_workspace, DFA_WS_DIMENSION);
+        }
+      }
+
+    else if ((pat_patctl.control & CTL_JITFAST) != 0)
+      {
+      start_time = clock();
+      for (i = 0; i < timeitm; i++)
+        {
+        PCRE2_JIT_MATCH(capcount, compiled_code, pp, ulen,
+          dat_datctl.offset, dat_datctl.options | g_notempty, match_data,
+          use_dat_context);
+        }
+      }
+
+    else
+      {
+      start_time = clock();
+      for (i = 0; i < timeitm; i++)
+        {
+        PCRE2_MATCH(capcount, compiled_code, pp, ulen,
+          dat_datctl.offset, dat_datctl.options | g_notempty, match_data,
+          use_dat_context);
+        }
+      }
+    total_match_time += (time_taken = clock() - start_time);
+    fprintf(outfile, "Match time %.4f milliseconds\n",
+      (((double)time_taken * 1000.0) / (double)timeitm) /
+        (double)CLOCKS_PER_SEC);
+    }
+
+  /* Find the match and recursion limits if requested. The recursion limit
+  is not relevant for JIT. */
+
+  if ((dat_datctl.control & CTL_FINDLIMITS) != 0)
+    {
+    capcount = check_match_limit(pp, ulen, PCRE2_ERROR_MATCHLIMIT, "match");
+    if (FLD(compiled_code, executable_jit) == NULL)
+      (void)check_match_limit(pp, ulen, PCRE2_ERROR_RECURSIONLIMIT,
+        "recursion");
+    }
+
+  /* Otherwise just run a single match, setting up a callout if required (the
+  default). */
+
+  else
+    {
+    if ((dat_datctl.control & CTL_CALLOUT_NONE) == 0)
+      {
+      PCRE2_SET_CALLOUT(dat_context, callout_function,
+        (void *)(&dat_datctl.callout_data));
+      first_callout = TRUE;
+      last_callout_mark = NULL;
+      callout_count = 0;
+      }
+    else
+      {
+      PCRE2_SET_CALLOUT(dat_context, NULL, NULL);  /* No callout */
+      }
+
+    /* Run a single DFA or NFA match. */
+
+    if ((dat_datctl.control & CTL_DFA) != 0)
+      {
+      if (dfa_workspace == NULL)
+        dfa_workspace = (int *)malloc(DFA_WS_DIMENSION*sizeof(int));
+      if (dfa_matched++ == 0)
+        dfa_workspace[0] = -1;  /* To catch bad restart */
+      PCRE2_DFA_MATCH(capcount, compiled_code, pp, ulen,
+        dat_datctl.offset, dat_datctl.options | g_notempty, match_data,
+        use_dat_context, dfa_workspace, DFA_WS_DIMENSION);
+      if (capcount == 0)
+        {
+        fprintf(outfile, "Matched, but offsets vector is too small to show all matches\n");
+        capcount = dat_datctl.oveccount;
+        }
+      }
+    else
+      {
+      if ((pat_patctl.control & CTL_JITFAST) != 0)
+        PCRE2_JIT_MATCH(capcount, compiled_code, pp, ulen, dat_datctl.offset,
+          dat_datctl.options | g_notempty, match_data, use_dat_context);
+      else
+        PCRE2_MATCH(capcount, compiled_code, pp, ulen, dat_datctl.offset,
+          dat_datctl.options | g_notempty, match_data, use_dat_context);
+      if (capcount == 0)
+        {
+        fprintf(outfile, "Matched, but too many substrings\n");
+        capcount = dat_datctl.oveccount;
+        }
+      }
+    }
+
+  /* The result of the match is now in capcount. First handle a successful
+  match. */
+
+  if (capcount >= 0)
+    {
+    int i;
+    uint32_t oveccount;
+
+    /* This is a check against a lunatic return value. */
+
+    PCRE2_GET_OVECTOR_COUNT(oveccount, match_data);
+    if (capcount > (int)oveccount)
+      {
+      fprintf(outfile,
+        "** PCRE2 error: returned count %d is too big for ovector count %d\n",
+        capcount, oveccount);
+      capcount = oveccount;
+      if ((dat_datctl.control & CTL_ANYGLOB) != 0)
+        {
+        fprintf(outfile, "** Global loop abandoned\n");
+        dat_datctl.control &= ~CTL_ANYGLOB;        /* Break g/G loop */
+        }
+      }
+
+    /* If this is not the first time round a global loop, check that the
+    returned string has changed. If not, there is a bug somewhere and we must
+    break the loop because it will go on for ever. We know that there are
+    always at least two elements in the ovector. */
+
+    if (gmatched > 0 && ovecsave[0] == ovector[0] && ovecsave[1] == ovector[1])
+      {
+      fprintf(outfile,
+        "** PCRE2 error: global repeat returned the same string as previous\n");
+      fprintf(outfile, "** Global loop abandoned\n");
+      dat_datctl.control &= ~CTL_ANYGLOB;        /* Break g/G loop */
+      }
+
+    /* "allcaptures" requests showing of all captures in the pattern, to check
+    unset ones at the end. It may be set on the pattern or the data. Implement
+    by setting capcount to the maximum. */
+
+    if ((dat_datctl.control & CTL_ALLCAPTURES) != 0)
+      {
+      uint32_t maxcapcount;
+      if (pattern_info(PCRE2_INFO_CAPTURECOUNT, &maxcapcount, FALSE) < 0)
+        return PR_SKIP;
+      capcount = maxcapcount + 1;   /* Allow for full match */
+      if (capcount > (int)oveccount) capcount = oveccount;
+      }
+
+    /* Output the captured substrings. Note that, for the matched string,
+    the use of \K in an assertion can make the start later than the end. */
+
+    for (i = 0; i < 2*capcount; i += 2)
+      {
+      PCRE2_SIZE lleft, lmiddle, lright;
+      PCRE2_SIZE start = ovector[i];
+      PCRE2_SIZE end = ovector[i+1];
+
+      if (start > end)
+        {
+        start = ovector[i+1];
+        end = ovector[i];
+        fprintf(outfile, "Start of matched string is beyond its end - "
+          "displaying from end to start.\n");
+        }
+
+      fprintf(outfile, "%2d: ", i/2);
+
+      /* Check for an unset group */
+
+      if (start == PCRE2_UNSET)
+        {
+        fprintf(outfile, "<unset>\n");
+        continue;
+        }
+
+      /* Check for silly offsets, in particular, values that have not been
+      set when they should have been. */
+
+      if (start > ulen || end > ulen)
+        {
+        fprintf(outfile, "ERROR: bad value(s) for offset(s): 0x%lx 0x%lx\n",
+          (unsigned long int)start, (unsigned long int)end);
+        continue;
+        }
+
+      /* When JIT is not being used, ALLUSEDTEXT may be set. (It if is set with
+      JIT, it is disabled above, with a comment.) When the match is done by the
+      interpreter, leftchar and rightchar are available, and if ALLUSEDTEXT is
+      set, and if the leftmost consulted character is before the start of the
+      match or the rightmost consulted character is past the end of the match,
+      we want to show all consulted characters for the main matched string, and
+      indicate which were lookarounds. */
+
+      if (i == 0)
+        {
+        BOOL showallused;
+        PCRE2_SIZE leftchar, rightchar;
+
+        if ((dat_datctl.control & CTL_ALLUSEDTEXT) != 0)
+          {
+          leftchar = FLD(match_data, leftchar);
+          rightchar = FLD(match_data, rightchar);
+          showallused = i == 0 && (leftchar < start || rightchar > end);
+          }
+        else showallused = FALSE;
+
+        if (showallused)
+          {
+          PCHARS(lleft, pp, leftchar, start - leftchar, utf, outfile);
+          PCHARS(lmiddle, pp, start, end - start, utf, outfile);
+          PCHARS(lright, pp, end, rightchar - end, utf, outfile);
+          if ((pat_patctl.control & CTL_JITVERIFY) != 0 && jit_was_used)
+            fprintf(outfile, " (JIT)");
+          fprintf(outfile, "\n    ");
+          for (j = 0; j < lleft; j++) fprintf(outfile, "<");
+          for (j = 0; j < lmiddle; j++) fprintf(outfile, " ");
+          for (j = 0; j < lright; j++) fprintf(outfile, ">");
+          }
+
+        /* When a pattern contains \K, the start of match position may be
+        different to the start of the matched string. When this is the case,
+        show it when requested. */
+
+        else if ((dat_datctl.control & CTL_STARTCHAR) != 0)
+          {
+          PCRE2_SIZE startchar;
+          PCRE2_GET_STARTCHAR(startchar, match_data);
+          PCHARS(lleft, pp, startchar, start - startchar, utf, outfile);
+          PCHARSV(pp, start, end - start, utf, outfile);
+          if ((pat_patctl.control & CTL_JITVERIFY) != 0 && jit_was_used)
+            fprintf(outfile, " (JIT)");
+          if (startchar != start)
+            {
+            fprintf(outfile, "\n    ");
+            for (j = 0; j < lleft; j++) fprintf(outfile, "^");
+            }
+          }
+
+        /* Otherwise, just show the matched string. */
+
+        else
+          {
+          PCHARSV(pp, start, end - start, utf, outfile);
+          if ((pat_patctl.control & CTL_JITVERIFY) != 0 && jit_was_used)
+            fprintf(outfile, " (JIT)");
+          }
+        }
+
+      /* Not the main matched string. Just show it unadorned. */
+
+      else
+        {
+        PCHARSV(pp, start, end - start, utf, outfile);
+        }
+
+      fprintf(outfile, "\n");
+
+      /* Note: don't use the start/end variables here because we want to
+      show the text from what is reported as the end. */
+
+      if ((dat_datctl.control & CTL_ALLAFTERTEXT) != 0 ||
+          (i == 0 && (dat_datctl.control & CTL_AFTERTEXT) != 0))
+        {
+        fprintf(outfile, "%2d+ ", i/2);
+        PCHARSV(pp, ovector[i+1], ulen - ovector[i+1], utf, outfile);
+        fprintf(outfile, "\n");
+        }
+      }
+
+    /* Output (*MARK) data if requested */
+
+    if ((dat_datctl.control & CTL_MARK) != 0 &&
+         TESTFLD(match_data, mark, !=, NULL))
+      {
+      fprintf(outfile, "MK: ");
+      PCHARSV(CASTFLD(void *, match_data, mark), 0, -1, utf, outfile);
+      fprintf(outfile, "\n");
+      }
+
+    /* Process copy/get strings */
+
+    copy_and_get(utf, capcount);
+
+    }    /* End of handling a successful match */
+
+  /* There was a partial match. The value of ovector[0] is the bumpalong point,
+  that is, startchar, not any \K point that might have been passed. */
+
+  else if (capcount == PCRE2_ERROR_PARTIAL)
+    {
+    PCRE2_SIZE poffset;
+    int backlength;
+    int rubriclength = 0;
+
+    fprintf(outfile, "Partial match");
+    if ((dat_datctl.control & CTL_MARK) != 0 &&
+         TESTFLD(match_data, mark, !=, NULL))
+      {
+      fprintf(outfile, ", mark=");
+      PCHARS(rubriclength, CASTFLD(void *, match_data, mark), 0, -1, utf,
+        outfile);
+      rubriclength += 7;
+      }
+    fprintf(outfile, ": ");
+    rubriclength += 15;
+
+    poffset = backchars(pp, ovector[0], maxlookbehind, utf);
+    PCHARS(backlength, pp, poffset, ovector[0] - poffset, utf, outfile);
+    PCHARSV(pp, ovector[0], ulen - ovector[0], utf, outfile);
+
+    if ((pat_patctl.control & CTL_JITVERIFY) != 0 && jit_was_used)
+      fprintf(outfile, " (JIT)");
+    fprintf(outfile, "\n");
+
+    if (backlength != 0)
+      {
+      int i;
+      for (i = 0; i < rubriclength; i++) fprintf(outfile, " ");
+      for (i = 0; i < backlength; i++) fprintf(outfile, "<");
+      fprintf(outfile, "\n");
+      }
+
+    /* Process copy/get strings */
+
+    copy_and_get(utf, 1);
+
+    break;  /* Out of the /g loop */
+    }       /* End of handling partial match */
+
+  /* Failed to match. If this is a /g or /G loop, we might previously have
+  set g_notempty (to PCRE2_NOTEMPTY_ATSTART|PCRE2_ANCHORED) after a null match.
+  If that is the case, this is not necessarily the end. We want to advance the
+  start offset, and continue. We won't be at the end of the string - that was
+  checked before setting g_notempty. We achieve the effect by pretending that a
+  single character was matched.
+
+  Complication arises in the case when the newline convention is "any", "crlf",
+  or "anycrlf". If the previous match was at the end of a line terminated by
+  CRLF, an advance of one character just passes the CR, whereas we should
+  prefer the longer newline sequence, as does the code in pcre2_match().
+
+  Otherwise, in the case of UTF-8 or UTF-16 matching, the advance must be one
+  character, not one byte. */
+
+  else if (g_notempty != 0)   /* There was a previous null match */
+    {
+    uint16_t nl = FLD(compiled_code, newline_convention);
+    PCRE2_SIZE start_offset = dat_datctl.offset;    /* Where the match was */
+    PCRE2_SIZE end_offset = start_offset + 1;
+
+    if ((nl == PCRE2_NEWLINE_CRLF || nl == PCRE2_NEWLINE_ANY ||
+         nl == PCRE2_NEWLINE_ANYCRLF) &&
+        start_offset < ulen - 1 &&
+        CODE_UNIT(pp, start_offset) == '\r' &&
+        CODE_UNIT(pp, end_offset) == '\n')
+      end_offset++;
+
+    else if (utf && test_mode != PCRE32_MODE)
+      {
+      if (test_mode == PCRE8_MODE)
+        {
+        for (; end_offset < ulen; end_offset++)
+          if ((((PCRE2_SPTR8)pp)[end_offset] & 0xc0) != 0x80) break;
+        }
+      else  /* 16-bit mode */
+        {
+        for (; end_offset < ulen; end_offset++)
+          if ((((PCRE2_SPTR16)pp)[end_offset] & 0xfc00) != 0xdc00) break;
+        }
+      }
+
+    SETFLDVEC(match_data, ovector, 0, start_offset);
+    SETFLDVEC(match_data, ovector, 1, end_offset);
+    }  /* End of handling null match in a global loop */
+
+  /* A "normal" match failure. There will be a negative error number in
+  capcount. */
+
+  else
+    {
+    int mlen;
+
+    switch(capcount)
+      {
+      case PCRE2_ERROR_NOMATCH:
+      if (gmatched == 0)
+        {
+        fprintf(outfile, "No match");
+        if ((dat_datctl.control & CTL_MARK) != 0 &&
+             TESTFLD(match_data, mark, !=, NULL))
+          {
+          fprintf(outfile, ", mark = ");
+          PCHARSV(CASTFLD(void *, match_data, mark), 0, -1, utf, outfile);
+          }
+        if ((pat_patctl.control & CTL_JITVERIFY) != 0 && jit_was_used)
+          fprintf(outfile, " (JIT)");
+        fprintf(outfile, "\n");
+        }
+      break;
+
+      case PCRE2_ERROR_BADUTFOFFSET:
+      fprintf(outfile, "Error %d (bad UTF-%d offset)\n", capcount, test_mode);
+      break;
+
+      default:
+      fprintf(outfile, "Failed: error %d: ", capcount);
+      PCRE2_GET_ERROR_MESSAGE(mlen, capcount, pbuffer);
+      PCHARSV(CASTVAR(void *, pbuffer), 0, mlen, FALSE, outfile);
+      if (capcount <= PCRE2_ERROR_UTF8_ERR1 &&
+          capcount >= PCRE2_ERROR_UTF32_ERR2)
+        {
+        PCRE2_SIZE startchar;
+        PCRE2_GET_STARTCHAR(startchar, match_data);
+        fprintf(outfile, " at offset %lu", (unsigned long int)startchar);
+        }
+      fprintf(outfile, "\n");
+      break;
+      }
+
+    break;  /* Out of the /g loop */
+    }       /* End of failed match handling */
+
+  /* Control reaches here in two circumstances: (a) after a match, and (b)
+  after a non-match that immediately followed a match on an empty string when
+  doing a global search. Such a match is done with PCRE2_NOTEMPTY_ATSTART and
+  PCRE2_ANCHORED set in g_notempty. The code above turns it into a fake match
+  of one character. So effectively we get here only after a match. If we
+  are not doing a global search, we are done. */
+
+  if ((dat_datctl.control & CTL_ANYGLOB) == 0) break; else
+    {
+    PCRE2_SIZE end_offset = FLD(match_data, ovector)[1];
+
+    /* We must now set up for the next iteration of a global search. If we have
+    matched an empty string, first check to see if we are at the end of the
+    subject. If so, the loop is over. Otherwise, mimic what Perl's /g option
+    does. Set PCRE2_NOTEMPTY_ATSTART and PCRE2_ANCHORED and try the match again
+    at the same point. If this fails it will be picked up above, where a fake
+    match is set up so that at this point we advance to the next character. */
+
+    if (FLD(match_data, ovector)[0] == end_offset)
+      {
+      if (end_offset == ulen) break;      /* End of subject */
+      g_notempty = PCRE2_NOTEMPTY_ATSTART | PCRE2_ANCHORED;
+      }
+
+    /* However, even after matching a non-empty string, there is still one
+    tricky case. If a pattern contains \K within a lookbehind assertion at the
+    start, the end of the matched string can be at the offset where the match
+    started. In the case of a normal /g iteration without special action, this
+    leads to a loop that keeps on returning the same substring. The loop would
+    be caught above, but we really want to move on to the next match. */
+
+    else
+      {
+      g_notempty = 0;   /* Set for a "normal" repeat */
+      if ((dat_datctl.control & CTL_GLOBAL) != 0)
+        {
+        PCRE2_SIZE startchar;
+        PCRE2_GET_STARTCHAR(startchar, match_data);
+        if (end_offset <= startchar)
+          {
+          if (startchar >= ulen) break;       /* End of subject */
+          end_offset = startchar + 1;
+          if (utf && test_mode != PCRE32_MODE)
+            {
+            if (test_mode == PCRE8_MODE)
+              {
+              for (; end_offset < ulen; end_offset++)
+                if ((((PCRE2_SPTR8)pp)[end_offset] & 0xc0) != 0x80) break;
+              }
+            else  /* 16-bit mode */
+              {
+              for (; end_offset < ulen; end_offset++)
+                if ((((PCRE2_SPTR16)pp)[end_offset] & 0xfc00) != 0xdc00) break;
+              }
+            }
+          }
+        }
+      }
+
+    /* For /g (global), update the start offset, leaving the rest alone. */
+
+    if ((dat_datctl.control & CTL_GLOBAL) != 0)
+      dat_datctl.offset = end_offset;
+
+    /* For altglobal, just update the pointer and length. */
+
+    else
+      {
+      pp += end_offset * code_unit_size;
+      len -= end_offset * code_unit_size;
+      ulen -= end_offset;
+      }
+    }
+  }  /* End of global loop */
+
+show_memory = FALSE;
+return PR_OK;
+}
+
+
+
+
+/*************************************************
+*               Print PCRE2 version              *
+*************************************************/
+
+static void
+print_version(FILE *f)
+{
+VERSION_TYPE *vp;
+fprintf(f, "PCRE2 version ");
+for (vp = version; *vp != 0; vp++) fprintf(f, "%c", *vp);
+fprintf(f, "\n");
+}
+
+
+
+/*************************************************
+*               Print Unicode version            *
+*************************************************/
+
+static void
+print_unicode_version(FILE *f)
+{
+VERSION_TYPE *vp;
+fprintf(f, "Unicode version ");
+for (vp = uversion; *vp != 0; vp++) fprintf(f, "%c", *vp);
+}
+
+
+
+/*************************************************
+*               Print JIT target                 *
+*************************************************/
+
+static void
+print_jit_target(FILE *f)
+{
+VERSION_TYPE *vp;
+for (vp = jittarget; *vp != 0; vp++) fprintf(f, "%c", *vp);
+}
+
+
+
+/*************************************************
+*       Print newline configuration              *
+*************************************************/
+
+/* Output is always to stdout.
+
+Arguments:
+  rc         the return code from PCRE2_CONFIG_NEWLINE
+  isc        TRUE if called from "-C newline"
+Returns:     nothing
+*/
+
+static void
+print_newline_config(uint32_t optval, BOOL isc)
+{
+if (!isc) printf("  Newline sequence is ");
+if (optval < sizeof(newlines)/sizeof(char *))
+  printf("%s\n", newlines[optval]);
+else
+  printf("a non-standard value: %d\n", optval);
+}
+
+
+
+/*************************************************
+*             Usage function                     *
+*************************************************/
+
+static void
+usage(void)
+{
+printf("Usage:     pcre2test [options] [<input file> [<output file>]]\n\n");
+printf("Input and output default to stdin and stdout.\n");
+#if defined(SUPPORT_LIBREADLINE) || defined(SUPPORT_LIBEDIT)
+printf("If input is a terminal, readline() is used to read from it.\n");
+#else
+printf("This version of pcre2test is not linked with readline().\n");
+#endif
+printf("\nOptions:\n");
+#ifdef SUPPORT_PCRE2_8
+printf("  -8            use the 8-bit library\n");
+#endif
+#ifdef SUPPORT_PCRE2_16
+printf("  -16           use the 16-bit library\n");
+#endif
+#ifdef SUPPORT_PCRE2_32
+printf("  -32           use the 32-bit library\n");
+#endif
+printf("  -b            set default pattern control 'fullbincode'\n");
+printf("  -C            show PCRE2 compile-time options and exit\n");
+printf("  -C arg        show a specific compile-time option and exit with its\n");
+printf("                  value if numeric (else 0). The arg can be:\n");
+printf("     backslash-C    use of \\C is enabled [0, 1]\n");
+printf("     bsr            \\R type [ANYCRLF, ANY]\n");
+printf("     ebcdic         compiled for EBCDIC character code [0,1]\n");
+printf("     ebcdic-nl      NL code if compiled for EBCDIC\n");
+printf("     jit            just-in-time compiler supported [0, 1]\n");
+printf("     linksize       internal link size [2, 3, 4]\n");
+printf("     newline        newline type [CR, LF, CRLF, ANYCRLF, ANY]\n");
+printf("     pcre2-8        8 bit library support enabled [0, 1]\n");
+printf("     pcre2-16       16 bit library support enabled [0, 1]\n");
+printf("     pcre2-32       32 bit library support enabled [0, 1]\n");
+printf("     unicode        Unicode and UTF support enabled [0, 1]\n");
+printf("  -d            set default pattern control 'debug'\n");
+printf("  -dfa          set default subject control 'dfa'\n");
+printf("  -help         show usage information\n");
+printf("  -i            set default pattern control 'info'\n");
+printf("  -jit          set default pattern control 'jit'\n");
+printf("  -q            quiet: do not output PCRE2 version number at start\n");
+printf("  -pattern <s>  set default pattern control fields\n");
+printf("  -subject <s>  set default subject control fields\n");
+printf("  -S <n>        set stack size to <n> megabytes\n");
+printf("  -t [<n>]      time compilation and execution, repeating <n> times\n");
+printf("  -tm [<n>]     time execution (matching) only, repeating <n> times\n");
+printf("  -T            same as -t, but show total times at the end\n");
+printf("  -TM           same as -tm, but show total time at the end\n");
+printf("  -version      show PCRE2 version and exit\n");
+}
+
+
+
+/*************************************************
+*             Handle -C option                   *
+*************************************************/
+
+/* This option outputs configuration options and sets an appropriate return
+code when asked for a single option. The code is abstracted into a separate
+function because of its size. Use whichever pcre2_config() function is
+available.
+
+Argument:   an option name or NULL
+Returns:    the return code
+*/
+
+static int
+c_option(const char *arg)
+{
+uint32_t optval;
+int yield = 0;
+
+if (arg != NULL)
+  {
+  unsigned int i;
+
+  for (i = 0; i < COPTLISTCOUNT; i++)
+    if (strcmp(arg, coptlist[i].name) == 0) break;
+
+  if (i >= COPTLISTCOUNT)
+    {
+    fprintf(stderr, "** Unknown -C option '%s'\n", arg);
+    return -1;
+    }
+
+  switch (coptlist[i].type)
+    {
+    case CONF_BSR:
+    (void)PCRE2_CONFIG(coptlist[i].value, &optval);
+    printf("%s\n", optval? "ANYCRLF" : "ANY");
+    break;
+
+    case CONF_FIX:
+    yield = coptlist[i].value;
+    printf("%d\n", yield);
+    break;
+
+    case CONF_FIZ:
+    optval = coptlist[i].value;
+    printf("%d\n", optval);
+    break;
+
+    case CONF_INT:
+    (void)PCRE2_CONFIG(coptlist[i].value, &yield);
+    printf("%d\n", yield);
+    break;
+
+    case CONF_NL:
+    (void)PCRE2_CONFIG(coptlist[i].value, &optval);
+    print_newline_config(optval, TRUE);
+    break;
+    }
+
+/* For VMS, return the value by setting a symbol, for certain values only. */
+
+#ifdef __VMS
+  if (copytlist[i].type == CONF_FIX || coptlist[i].type == CONF_INT)
+    {
+    char ucname[16];
+    strcpy(ucname, coptlist[i].name);
+    for (i = 0; ucname[i] != 0; i++) ucname[i] = toupper[ucname[i];
+    vms_setsymbol(ucname, 0, optval);
+    }
+#endif
+
+  return yield;
+  }
+
+/* No argument for -C: output all configuration information. */
+
+print_version(stdout);
+printf("Compiled with\n");
+
+#ifdef EBCDIC
+printf("  EBCDIC code support: LF is 0x%02x\n", CHAR_LF);
+#if defined NATIVE_ZOS
+printf("  EBCDIC code page %s or similar\n", pcrz_cpversion());
+#endif
+#endif
+
+#ifdef SUPPORT_PCRE2_8
+printf("  8-bit support\n");
+#endif
+#ifdef SUPPORT_PCRE2_16
+printf("  16-bit support\n");
+#endif
+#ifdef SUPPORT_PCRE2_32
+printf("  32-bit support\n");
+#endif
+
+(void)PCRE2_CONFIG(PCRE2_CONFIG_UNICODE, &optval);
+if (optval != 0)
+  {
+  printf("  UTF and UCP support (");
+  print_unicode_version(stdout);
+  printf(")\n");
+  }
+else printf("  No Unicode support\n");
+
+(void)PCRE2_CONFIG(PCRE2_CONFIG_JIT, &optval);
+if (optval != 0)
+  {
+  printf("  Just-in-time compiler support: ");
+  print_jit_target(stdout);
+  printf("\n");
+  }
+else
+  {
+  printf("  No just-in-time compiler support\n");
+  }
+
+(void)PCRE2_CONFIG(PCRE2_CONFIG_NEWLINE, &optval);
+print_newline_config(optval, FALSE);
+(void)PCRE2_CONFIG(PCRE2_CONFIG_BSR, &optval);
+printf("  \\R matches %s\n", optval? "CR, LF, or CRLF only" :
+                                 "all Unicode newlines");
+#ifdef NEVER_BACKSLASH_C
+printf("  \\C is not supported\n");
+#else
+printf("  \\C is supported\n");
+#endif
+(void)PCRE2_CONFIG(PCRE2_CONFIG_LINKSIZE, &optval);
+printf("  Internal link size = %d\n", optval);
+(void)PCRE2_CONFIG(PCRE2_CONFIG_PARENSLIMIT, &optval);
+printf("  Parentheses nest limit = %d\n", optval);
+(void)PCRE2_CONFIG(PCRE2_CONFIG_MATCHLIMIT, &optval);
+printf("  Default match limit = %d\n", optval);
+(void)PCRE2_CONFIG(PCRE2_CONFIG_RECURSIONLIMIT, &optval);
+printf("  Default recursion depth limit = %d\n", optval);
+(void)PCRE2_CONFIG(PCRE2_CONFIG_STACKRECURSE, &optval);
+printf("  Match recursion uses %s", optval? "stack" : "heap");
+
+printf("\n");
+return 0;
+}
+
+
+
+/*************************************************
+*                Main Program                    *
+*************************************************/
+
+int
+main(int argc, char **argv)
+{
+uint32_t yield = 0;
+uint32_t op = 1;
+uint32_t stack_size;
+BOOL notdone = TRUE;
+BOOL quiet = FALSE;
+BOOL showtotaltimes = FALSE;
+BOOL skipping = FALSE;
+char *arg_subject = NULL;
+char *arg_pattern = NULL;
+
+/* The offsets to the options and control bits fields of the pattern and data
+control blocks must be the same so that common options and controls such as
+"anchored" or "memory" can work for either of them from a single table entry.
+We cannot test this till runtime because "offsetof" does not work in the
+preprocessor. */
+
+if (PO(options) != DO(options) || PO(control) != DO(control) ||
+    PO(control2) != DO(control2))
+  {
+  fprintf(stderr, "** Coding error: "
+    "options and control offsets for pattern and data must be the same.\n");
+  return 1;
+  }
+
+/* Get the PCRE2 and Unicode version number and JIT target information, at the
+same time checking that a request for the length gives the same answer. Also
+check lengths for non-string items. */
+
+if (PCRE2_CONFIG(PCRE2_CONFIG_VERSION, NULL) !=
+    PCRE2_CONFIG(PCRE2_CONFIG_VERSION, version) ||
+
+    PCRE2_CONFIG(PCRE2_CONFIG_UNICODE_VERSION, NULL) !=
+    PCRE2_CONFIG(PCRE2_CONFIG_UNICODE_VERSION, uversion) ||
+
+    PCRE2_CONFIG(PCRE2_CONFIG_JITTARGET, NULL) !=
+    PCRE2_CONFIG(PCRE2_CONFIG_JITTARGET, jittarget) ||
+
+    PCRE2_CONFIG(PCRE2_CONFIG_UNICODE, NULL) != sizeof(uint32_t) ||
+    PCRE2_CONFIG(PCRE2_CONFIG_MATCHLIMIT, NULL) != sizeof(uint32_t))
+  {
+  fprintf(stderr, "** Error in pcre2_config(): bad length\n");
+  return 1;
+  }
+
+/* Get buffers from malloc() so that valgrind will check their misuse when
+debugging. They grow automatically when very long lines are read. The 16-
+and 32-bit buffers (pbuffer16, pbuffer32) are obtained only if needed. */
+
+buffer = (uint8_t *)malloc(pbuffer8_size);
+pbuffer8 = (uint8_t *)malloc(pbuffer8_size);
+
+/* The following  _setmode() stuff is some Windows magic that tells its runtime
+library to translate CRLF into a single LF character. At least, that's what
+I've been told: never having used Windows I take this all on trust. Originally
+it set 0x8000, but then I was advised that _O_BINARY was better. */
+
+#if defined(_WIN32) || defined(WIN32)
+_setmode( _fileno( stdout ), _O_BINARY );
+#endif
+
+/* Initialization that does not depend on the running mode. */
+
+locale_name[0] = 0;
+memset(&def_patctl, 0, sizeof(patctl));
+memset(&def_datctl, 0, sizeof(datctl));
+def_datctl.oveccount = DEFAULT_OVECCOUNT;
+def_datctl.copy_numbers[0] = -1;
+def_datctl.get_numbers[0] = -1;
+def_datctl.cfail[0] = def_datctl.cfail[1] = CFAIL_UNSET;
+
+/* Scan command line options. */
+
+while (argc > 1 && argv[op][0] == '-' && argv[op][1] != 0)
+  {
+  char *endptr;
+  char *arg = argv[op];
+  unsigned long uli;
+
+  /* Display and/or set return code for configuration options. */
+
+  if (strcmp(arg, "-C") == 0)
+    {
+    yield = c_option(argv[op + 1]);
+    goto EXIT;
+    }
+
+  /* Select operating mode */
+
+  if (strcmp(arg, "-8") == 0)
+    {
+#ifdef SUPPORT_PCRE2_8
+    test_mode = PCRE8_MODE;
+#else
+    fprintf(stderr,
+      "** This version of PCRE2 was built without 8-bit support\n");
+    exit(1);
+#endif
+    }
+  else if (strcmp(arg, "-16") == 0)
+    {
+#ifdef SUPPORT_PCRE2_16
+    test_mode = PCRE16_MODE;
+#else
+    fprintf(stderr,
+      "** This version of PCRE2 was built without 16-bit support\n");
+    exit(1);
+#endif
+    }
+  else if (strcmp(arg, "-32") == 0)
+    {
+#ifdef SUPPORT_PCRE2_32
+    test_mode = PCRE32_MODE;
+#else
+    fprintf(stderr,
+      "** This version of PCRE2 was built without 32-bit support\n");
+    exit(1);
+#endif
+    }
+
+  /* Set quiet (no version verification) */
+
+  else if (strcmp(arg, "-q") == 0) quiet = TRUE;
+
+  /* Set system stack size */
+
+  else if (strcmp(arg, "-S") == 0 && argc > 2 &&
+      ((uli = strtoul(argv[op+1], &endptr, 10)), *endptr == 0))
+    {
+#if defined(_WIN32) || defined(WIN32) || defined(__minix) || defined(NATIVE_ZOS) || defined(__VMS)
+    fprintf(stderr, "pcre2test: -S is not supported on this OS\n");
+    exit(1);
+#else
+    int rc;
+    struct rlimit rlim;
+    if (U32OVERFLOW(uli))
+      {
+      fprintf(stderr, "+++ Argument for -S is too big\n");
+      exit(1);
+      }
+    stack_size = (uint32_t)uli;
+    getrlimit(RLIMIT_STACK, &rlim);
+    rlim.rlim_cur = stack_size * 1024 * 1024;
+    if (rlim.rlim_cur > rlim.rlim_max)
+      {
+      fprintf(stderr,
+        "pcre2test: requested stack size %luM is greater than hard limit %lu\n",
+        (unsigned long int)stack_size,
+        (unsigned long int)(rlim.rlim_max));
+      exit(1);
+      }
+    rc = setrlimit(RLIMIT_STACK, &rlim);
+    if (rc != 0)
+      {
+      fprintf(stderr, "pcre2test: setting stack size %luM failed: %s\n",
+        (unsigned long int)stack_size, strerror(errno));
+      exit(1);
+      }
+    op++;
+    argc--;
+#endif
+    }
+
+  /* Set some common pattern and subject controls */
+
+  else if (strcmp(arg, "-dfa") == 0) def_datctl.control |= CTL_DFA;
+  else if (strcmp(arg, "-b") == 0) def_patctl.control |= CTL_FULLBINCODE;
+  else if (strcmp(arg, "-d") == 0) def_patctl.control |= CTL_DEBUG;
+  else if (strcmp(arg, "-i") == 0) def_patctl.control |= CTL_INFO;
+  else if (strcmp(arg, "-jit") == 0)
+    {
+    def_patctl.jit = 7;  /* full & partial */
+#ifndef SUPPORT_JIT
+    fprintf(stderr, "** Warning: JIT support is not available: "
+                    "-jit calls functions that do nothing.\n");
+#endif
+    }
+
+  /* Set timing parameters */
+
+  else if (strcmp(arg, "-t") == 0 || strcmp(arg, "-tm") == 0 ||
+           strcmp(arg, "-T") == 0 || strcmp(arg, "-TM") == 0)
+    {
+    int both = arg[2] == 0;
+    showtotaltimes = arg[1] == 'T';
+    if (argc > 2 && (uli = strtoul(argv[op+1], &endptr, 10), *endptr == 0))
+      {
+      if (U32OVERFLOW(uli))
+        {
+        fprintf(stderr, "+++ Argument for %s is too big\n", arg);
+        exit(1);
+        }
+      timeitm = (int)uli;
+      op++;
+      argc--;
+      }
+    else timeitm = LOOPREPEAT;
+    if (both) timeit = timeitm;
+    }
+
+  /* Give help */
+
+  else if (strcmp(arg, "-help") == 0 ||
+           strcmp(arg, "--help") == 0)
+    {
+    usage();
+    goto EXIT;
+    }
+
+  /* Show version */
+
+  else if (strcmp(arg, "-version") == 0 ||
+           strcmp(arg, "--version") == 0)
+    {
+    print_version(stdout);
+    goto EXIT;
+    }
+
+  /* The following options save their data for processing once we know what
+  the running mode is. */
+
+  else if (strcmp(arg, "-subject") == 0)
+    {
+    arg_subject = argv[op+1];
+    goto CHECK_VALUE_EXISTS;
+    }
+
+  else if (strcmp(arg, "-pattern") == 0)
+    {
+    arg_pattern = argv[op+1];
+    CHECK_VALUE_EXISTS:
+    if (argc <= 2)
+      {
+      fprintf(stderr, "** Missing value for %s\n", arg);
+      yield = 1;
+      goto EXIT;
+      }
+    op++;
+    argc--;
+    }
+
+  /* Unrecognized option */
+
+  else
+    {
+    fprintf(stderr, "** Unknown or malformed option '%s'\n", arg);
+    usage();
+    yield = 1;
+    goto EXIT;
+    }
+  op++;
+  argc--;
+  }
+
+/* Initialize things that cannot be done until we know which test mode we are
+running in. When HEAP_MATCH_RECURSE is undefined, calling pcre2_set_recursion_
+memory_management() is a no-op, but we call it in order to exercise it. Also
+exercise the general context copying function, which is not otherwise used. */
+
+code_unit_size = test_mode/8;
+max_oveccount = DEFAULT_OVECCOUNT;
+
+/* Use macros to save a lot of duplication. */
+
+#define CREATECONTEXTS \
+  G(general_context,BITS) = G(pcre2_general_context_create_,BITS)(&my_malloc, &my_free, NULL); \
+  G(general_context_copy,BITS) = G(pcre2_general_context_copy_,BITS)(G(general_context,BITS)); \
+  G(default_pat_context,BITS) = G(pcre2_compile_context_create_,BITS)(G(general_context,BITS)); \
+  G(pat_context,BITS) = G(pcre2_compile_context_copy_,BITS)(G(default_pat_context,BITS)); \
+  G(default_dat_context,BITS) = G(pcre2_match_context_create_,BITS)(G(general_context,BITS)); \
+  G(dat_context,BITS) = G(pcre2_match_context_copy_,BITS)(G(default_dat_context,BITS)); \
+  G(match_data,BITS) = G(pcre2_match_data_create_,BITS)(max_oveccount, G(general_context,BITS))
+
+#ifdef HEAP_MATCH_RECURSE
+#define SETRECURSEMEMMAN \
+  (void)G(pcre2_set_recursion_memory_management_,BITS) \
+    (G(default_dat_context,BITS), \
+    &my_stack_malloc, &my_stack_free, NULL)
+#else
+#define SETRECURSEMEMMAN \
+  (void)G(pcre2_set_recursion_memory_management_,BITS)(NULL, NULL, NULL, NULL)
+#endif
+
+/* Call the appropriate functions for the current mode. */
+
+#ifdef SUPPORT_PCRE2_8
+#undef BITS
+#define BITS 8
+if (test_mode == PCRE8_MODE)
+  {
+  CREATECONTEXTS;
+  SETRECURSEMEMMAN;
+  }
+#endif
+
+#ifdef SUPPORT_PCRE2_16
+#undef BITS
+#define BITS 16
+if (test_mode == PCRE16_MODE)
+  {
+  CREATECONTEXTS;
+  SETRECURSEMEMMAN;
+  }
+#endif
+
+#ifdef SUPPORT_PCRE2_32
+#undef BITS
+#define BITS 32
+if (test_mode == PCRE32_MODE)
+  {
+  CREATECONTEXTS;
+  SETRECURSEMEMMAN;
+  }
+#endif
+
+/* Set a default parentheses nest limit that is large enough to run the
+standard tests (this also exercises the function). */
+
+PCRE2_SET_PARENS_NEST_LIMIT(default_pat_context, 220);
+
+/* Handle command line modifier settings, sending any error messages to
+stderr. We need to know the mode before modifying the context, and it is tidier
+to do them all in the same way. */
+
+outfile = stderr;
+if ((arg_pattern != NULL &&
+    !decode_modifiers((uint8_t *)arg_pattern, CTX_DEFPAT, &def_patctl, NULL)) ||
+    (arg_subject != NULL &&
+    !decode_modifiers((uint8_t *)arg_subject, CTX_DEFDAT, NULL, &def_datctl)))
+  {
+  yield = 1;
+  goto EXIT;
+  }
+
+/* Sort out the input and output files, defaulting to stdin/stdout. */
+
+infile = stdin;
+outfile = stdout;
+
+if (argc > 1 && strcmp(argv[op], "-") != 0)
+  {
+  infile = fopen(argv[op], INPUT_MODE);
+  if (infile == NULL)
+    {
+    printf("** Failed to open '%s'\n", argv[op]);
+    yield = 1;
+    goto EXIT;
+    }
+  }
+
+if (argc > 2)
+  {
+  outfile = fopen(argv[op+1], OUTPUT_MODE);
+  if (outfile == NULL)
+    {
+    printf("** Failed to open '%s'\n", argv[op+1]);
+    yield = 1;
+    goto EXIT;
+    }
+  }
+
+/* Output a heading line unless quiet, then process input lines. */
+
+if (!quiet) print_version(outfile);
+
+SET(compiled_code, NULL);
+
+#ifdef SUPPORT_PCRE2_8
+preg.re_pcre2_code = NULL;
+preg.re_match_data = NULL;
+#endif
+
+while (notdone)
+  {
+  uint8_t *p;
+  int rc = PR_OK;
+  BOOL expectdata = TEST(compiled_code, !=, NULL);
+#ifdef SUPPORT_PCRE2_8
+  expectdata |= preg.re_pcre2_code != NULL;
+#endif
+
+  if (extend_inputline(infile, buffer, expectdata? "data> " : "  re> ") == NULL)
+    break;
+  if (!INTERACTIVE(infile)) fprintf(outfile, "%s", (char *)buffer);
+  fflush(outfile);
+  p = buffer;
+
+  /* If we have a pattern set up for testing, or we are skipping after a
+  compile failure, a blank line terminates this test; otherwise process the
+  line as a data line. */
+
+  if (expectdata || skipping)
+    {
+    while (isspace(*p)) p++;
+    if (*p == 0)
+      {
+#ifdef SUPPORT_PCRE2_8
+      if (preg.re_pcre2_code != NULL)
+        {
+        regfree(&preg);
+        preg.re_pcre2_code = NULL;
+        preg.re_match_data = NULL;
+        }
+#endif  /* SUPPORT_PCRE2_8 */
+      if (TEST(compiled_code, !=, NULL))
+        {
+        SUB1(pcre2_code_free, compiled_code);
+        SET(compiled_code, NULL);
+        }
+      skipping = FALSE;
+      setlocale(LC_CTYPE, "C");
+      }
+    else if (!skipping && !(p[0] == '\\' && p[1] == '=' && isspace(p[2])))
+      rc = process_data();
+    }
+
+  /* We do not have a pattern set up for testing. Lines starting with # are
+  either comments or special commands. Blank lines are ignored. Otherwise, the
+  line must start with a valid delimiter. It is then processed as a pattern
+  line. */
+
+  else if (*p == '#')
+    {
+    if (isspace(p[1]) || p[1] == '!' || p[1] == 0) continue;
+    rc = process_command();
+    }
+
+  else if (strchr("/!\"'`%&-=_:;,@~", *p) != NULL)
+    {
+    rc = process_pattern();
+    dfa_matched = 0;
+    }
+
+  else
+    {
+    while (isspace(*p)) p++;
+    if (*p != 0)
+      {
+      fprintf(outfile, "** Invalid pattern delimiter '%c' (x%x).\n", *buffer,
+        *buffer);
+      rc = PR_SKIP;
+      }
+    }
+
+  if (rc == PR_SKIP && !INTERACTIVE(infile)) skipping = TRUE;
+  else if (rc == PR_ABEND)
+    {
+    fprintf(outfile, "** pcre2test run abandoned\n");
+    yield = 1;
+    goto EXIT;
+    }
+  }
+
+/* Finish off a normal run. */
+
+if (INTERACTIVE(infile)) fprintf(outfile, "\n");
+
+if (showtotaltimes)
+  {
+  const char *pad = "";
+  fprintf(outfile, "--------------------------------------\n");
+  if (timeit > 0)
+    {
+    fprintf(outfile, "Total compile time %.4f milliseconds\n",
+      (((double)total_compile_time * 1000.0) / (double)timeit) /
+        (double)CLOCKS_PER_SEC);
+    if (total_jit_compile_time > 0)
+      fprintf(outfile, "Total JIT compile  %.4f milliseconds\n",
+        (((double)total_jit_compile_time * 1000.0) / (double)timeit) /
+          (double)CLOCKS_PER_SEC);
+    pad = "  ";
+    }
+  fprintf(outfile, "Total match time %s%.4f milliseconds\n", pad,
+    (((double)total_match_time * 1000.0) / (double)timeitm) /
+      (double)CLOCKS_PER_SEC);
+  }
+
+
+EXIT:
+
+if (infile != NULL && infile != stdin) fclose(infile);
+if (outfile != NULL && outfile != stdout) fclose(outfile);
+
+free(buffer);
+free(dbuffer);
+free(pbuffer8);
+free(dfa_workspace);
+free((void *)locale_tables);
+PCRE2_MATCH_DATA_FREE(match_data);
+SUB1(pcre2_code_free, compiled_code);
+
+while(patstacknext-- > 0)
+  {
+  SET(compiled_code, patstack[patstacknext]);
+  SUB1(pcre2_code_free, compiled_code);
+  }
+
+PCRE2_JIT_FREE_UNUSED_MEMORY(general_context);
+if (jit_stack != NULL)
+  {
+  PCRE2_JIT_STACK_FREE(jit_stack);
+  }
+
+#define FREECONTEXTS \
+  G(pcre2_general_context_free_,BITS)(G(general_context,BITS)); \
+  G(pcre2_general_context_free_,BITS)(G(general_context_copy,BITS)); \
+  G(pcre2_compile_context_free_,BITS)(G(pat_context,BITS)); \
+  G(pcre2_compile_context_free_,BITS)(G(default_pat_context,BITS)); \
+  G(pcre2_match_context_free_,BITS)(G(dat_context,BITS)); \
+  G(pcre2_match_context_free_,BITS)(G(default_dat_context,BITS))
+
+#ifdef SUPPORT_PCRE2_8
+#undef BITS
+#define BITS 8
+regfree(&preg);
+FREECONTEXTS;
+#endif
+
+#ifdef SUPPORT_PCRE2_16
+#undef BITS
+#define BITS 16
+free(pbuffer16);
+FREECONTEXTS;
+#endif
+
+#ifdef SUPPORT_PCRE2_32
+#undef BITS
+#define BITS 32
+free(pbuffer32);
+FREECONTEXTS;
+#endif
+
+#if defined(__VMS)
+  yield = SS$_NORMAL;  /* Return values via DCL symbols */
+#endif
+
+return yield;
+}
+
+/* End of pcre2test.c */
diff --git a/dist/sljit/sljitConfig.h b/dist2/src/sljit/sljitConfig.h
similarity index 100%
rename from dist/sljit/sljitConfig.h
rename to dist2/src/sljit/sljitConfig.h
diff --git a/dist/sljit/sljitConfigInternal.h b/dist2/src/sljit/sljitConfigInternal.h
similarity index 100%
rename from dist/sljit/sljitConfigInternal.h
rename to dist2/src/sljit/sljitConfigInternal.h
diff --git a/dist/sljit/sljitExecAllocator.c b/dist2/src/sljit/sljitExecAllocator.c
similarity index 100%
rename from dist/sljit/sljitExecAllocator.c
rename to dist2/src/sljit/sljitExecAllocator.c
diff --git a/dist/sljit/sljitLir.c b/dist2/src/sljit/sljitLir.c
similarity index 100%
rename from dist/sljit/sljitLir.c
rename to dist2/src/sljit/sljitLir.c
diff --git a/dist/sljit/sljitLir.h b/dist2/src/sljit/sljitLir.h
similarity index 100%
rename from dist/sljit/sljitLir.h
rename to dist2/src/sljit/sljitLir.h
diff --git a/dist/sljit/sljitNativeARM_32.c b/dist2/src/sljit/sljitNativeARM_32.c
similarity index 100%
rename from dist/sljit/sljitNativeARM_32.c
rename to dist2/src/sljit/sljitNativeARM_32.c
diff --git a/dist/sljit/sljitNativeARM_64.c b/dist2/src/sljit/sljitNativeARM_64.c
similarity index 100%
rename from dist/sljit/sljitNativeARM_64.c
rename to dist2/src/sljit/sljitNativeARM_64.c
diff --git a/dist/sljit/sljitNativeARM_T2_32.c b/dist2/src/sljit/sljitNativeARM_T2_32.c
similarity index 100%
rename from dist/sljit/sljitNativeARM_T2_32.c
rename to dist2/src/sljit/sljitNativeARM_T2_32.c
diff --git a/dist/sljit/sljitNativeMIPS_32.c b/dist2/src/sljit/sljitNativeMIPS_32.c
similarity index 100%
rename from dist/sljit/sljitNativeMIPS_32.c
rename to dist2/src/sljit/sljitNativeMIPS_32.c
diff --git a/dist/sljit/sljitNativeMIPS_64.c b/dist2/src/sljit/sljitNativeMIPS_64.c
similarity index 100%
rename from dist/sljit/sljitNativeMIPS_64.c
rename to dist2/src/sljit/sljitNativeMIPS_64.c
diff --git a/dist/sljit/sljitNativeMIPS_common.c b/dist2/src/sljit/sljitNativeMIPS_common.c
similarity index 100%
rename from dist/sljit/sljitNativeMIPS_common.c
rename to dist2/src/sljit/sljitNativeMIPS_common.c
diff --git a/dist/sljit/sljitNativePPC_32.c b/dist2/src/sljit/sljitNativePPC_32.c
similarity index 100%
rename from dist/sljit/sljitNativePPC_32.c
rename to dist2/src/sljit/sljitNativePPC_32.c
diff --git a/dist/sljit/sljitNativePPC_64.c b/dist2/src/sljit/sljitNativePPC_64.c
similarity index 100%
rename from dist/sljit/sljitNativePPC_64.c
rename to dist2/src/sljit/sljitNativePPC_64.c
diff --git a/dist/sljit/sljitNativePPC_common.c b/dist2/src/sljit/sljitNativePPC_common.c
similarity index 100%
rename from dist/sljit/sljitNativePPC_common.c
rename to dist2/src/sljit/sljitNativePPC_common.c
diff --git a/dist/sljit/sljitNativeSPARC_32.c b/dist2/src/sljit/sljitNativeSPARC_32.c
similarity index 100%
rename from dist/sljit/sljitNativeSPARC_32.c
rename to dist2/src/sljit/sljitNativeSPARC_32.c
diff --git a/dist/sljit/sljitNativeSPARC_common.c b/dist2/src/sljit/sljitNativeSPARC_common.c
similarity index 100%
rename from dist/sljit/sljitNativeSPARC_common.c
rename to dist2/src/sljit/sljitNativeSPARC_common.c
diff --git a/dist/sljit/sljitNativeTILEGX-encoder.c b/dist2/src/sljit/sljitNativeTILEGX-encoder.c
similarity index 100%
rename from dist/sljit/sljitNativeTILEGX-encoder.c
rename to dist2/src/sljit/sljitNativeTILEGX-encoder.c
diff --git a/dist/sljit/sljitNativeTILEGX_64.c b/dist2/src/sljit/sljitNativeTILEGX_64.c
similarity index 100%
rename from dist/sljit/sljitNativeTILEGX_64.c
rename to dist2/src/sljit/sljitNativeTILEGX_64.c
diff --git a/dist/sljit/sljitNativeX86_32.c b/dist2/src/sljit/sljitNativeX86_32.c
similarity index 100%
rename from dist/sljit/sljitNativeX86_32.c
rename to dist2/src/sljit/sljitNativeX86_32.c
diff --git a/dist/sljit/sljitNativeX86_64.c b/dist2/src/sljit/sljitNativeX86_64.c
similarity index 100%
rename from dist/sljit/sljitNativeX86_64.c
rename to dist2/src/sljit/sljitNativeX86_64.c
diff --git a/dist/sljit/sljitNativeX86_common.c b/dist2/src/sljit/sljitNativeX86_common.c
similarity index 100%
rename from dist/sljit/sljitNativeX86_common.c
rename to dist2/src/sljit/sljitNativeX86_common.c
diff --git a/dist/sljit/sljitUtils.c b/dist2/src/sljit/sljitUtils.c
similarity index 100%
rename from dist/sljit/sljitUtils.c
rename to dist2/src/sljit/sljitUtils.c
diff --git a/dist/test-driver b/dist2/test-driver
similarity index 100%
rename from dist/test-driver
rename to dist2/test-driver
diff --git a/dist/testdata/grepbinary b/dist2/testdata/grepbinary
similarity index 100%
rename from dist/testdata/grepbinary
rename to dist2/testdata/grepbinary
Binary files differ
diff --git a/dist/testdata/grepfilelist b/dist2/testdata/grepfilelist
similarity index 100%
rename from dist/testdata/grepfilelist
rename to dist2/testdata/grepfilelist
diff --git a/dist/testdata/grepinput b/dist2/testdata/grepinput
similarity index 100%
rename from dist/testdata/grepinput
rename to dist2/testdata/grepinput
Binary files differ
diff --git a/dist/testdata/grepinput3 b/dist2/testdata/grepinput3
similarity index 100%
rename from dist/testdata/grepinput3
rename to dist2/testdata/grepinput3
diff --git a/dist/testdata/grepinput8 b/dist2/testdata/grepinput8
similarity index 92%
rename from dist/testdata/grepinput8
rename to dist2/testdata/grepinput8
index c4b8c44..7779cdc 100644
--- a/dist/testdata/grepinput8
+++ b/dist2/testdata/grepinput8
Binary files differ
diff --git a/dist/testdata/grepinputv b/dist2/testdata/grepinputv
similarity index 100%
rename from dist/testdata/grepinputv
rename to dist2/testdata/grepinputv
diff --git a/dist/testdata/grepinputx b/dist2/testdata/grepinputx
similarity index 100%
rename from dist/testdata/grepinputx
rename to dist2/testdata/grepinputx
diff --git a/dist/testdata/greplist b/dist2/testdata/greplist
similarity index 100%
rename from dist/testdata/greplist
rename to dist2/testdata/greplist
diff --git a/dist/testdata/grepoutput b/dist2/testdata/grepoutput
similarity index 94%
rename from dist/testdata/grepoutput
rename to dist2/testdata/grepoutput
index f23dac7..3f6704c 100644
--- a/dist/testdata/grepoutput
+++ b/dist2/testdata/grepoutput
Binary files differ
diff --git a/dist/testdata/grepoutput8 b/dist2/testdata/grepoutput8
similarity index 74%
rename from dist/testdata/grepoutput8
rename to dist2/testdata/grepoutput8
index 91493bd..aaed6ae 100644
--- a/dist/testdata/grepoutput8
+++ b/dist2/testdata/grepoutput8
Binary files differ
diff --git a/dist/testdata/grepoutputN b/dist2/testdata/grepoutputN
similarity index 100%
rename from dist/testdata/grepoutputN
rename to dist2/testdata/grepoutputN
Binary files differ
diff --git a/dist/testdata/greppatN4 b/dist2/testdata/greppatN4
similarity index 100%
rename from dist/testdata/greppatN4
rename to dist2/testdata/greppatN4
diff --git a/dist/testdata/testinput1 b/dist2/testdata/testinput1
similarity index 85%
rename from dist/testdata/testinput1
rename to dist2/testdata/testinput1
index 8379ce0..6d7bc80 100644
--- a/dist/testdata/testinput1
+++ b/dist2/testdata/testinput1
@@ -1,13 +1,16 @@
-/-- This set of tests is for features that are compatible with all versions of
-    Perl >= 5.10, in non-UTF-8 mode. It should run clean for the 8-bit, 16-bit,
-    and 32-bit PCRE libraries. --/
+# This set of tests is for features that are compatible with all versions of
+# Perl >= 5.10, in non-UTF mode. It should run clean for the 8-bit, 16-bit, and
+# 32-bit PCRE libraries, and also using the perltest.pl script.
     
-< forbid 89?=ABCDEFfGILMNPTUWXZ<
+#forbid_utf
+#newline_default lf any anycrlf
+#perltest
 
 /the quick brown fox/
     the quick brown fox
-    The quick brown FOX
     What do you know about the quick brown fox?
+\= Expect no match
+    The quick brown FOX
     What do you know about THE QUICK BROWN FOX?
 
 /The quick brown fox/i
@@ -50,7 +53,7 @@
     >>>aaabxyzpqrrrabbxyyyypqAzz
     >aaaabxyzpqrrrabbxyyyypqAzz
     >>>>abcxyzpqrrrabbxyyyypqAzz
-    *** Failers
+\= Expect no match
     abxyzpqrrabbxyyyypqAzz
     abxyzpqrrrrabbxyyyypqAzz
     abxyzpqrrrabxyyyypqAzz
@@ -61,7 +64,7 @@
 /^(abc){1,2}zz/
     abczz
     abcabczz
-    *** Failers
+\= Expect no match
     zz
     abcabcabczz
     >>abczz
@@ -75,7 +78,7 @@
     aac
     abbbbbbbbbbbc
     bbbbbbbbbbbac
-    *** Failers
+\= Expect no match
     aaac
     abbbbbbbbbbbac
 
@@ -88,7 +91,7 @@
     aac
     abbbbbbbbbbbc
     bbbbbbbbbbbac
-    *** Failers
+\= Expect no match
     aaac
     abbbbbbbbbbbac
 
@@ -99,7 +102,7 @@
     babc
     bbabc
     bababc
-    *** Failers
+\= Expect no match
     bababbc
     babababc
 
@@ -107,7 +110,7 @@
     babc
     bbabc
     bababc
-    *** Failers
+\= Expect no match
     bababbc
     babababc
 
@@ -121,7 +124,7 @@
     cthing
     dthing
     ething
-    *** Failers
+\= Expect no match
     fthing
     [thing
     \\thing
@@ -131,7 +134,7 @@
     cthing
     dthing
     ething
-    *** Failers
+\= Expect no match
     athing
     fthing
 
@@ -139,7 +142,7 @@
     fthing
     [thing
     \\thing
-    *** Failers
+\= Expect no match
     athing
     bthing
     ]thing
@@ -150,7 +153,7 @@
 /^[^]cde]/
     athing
     fthing
-    *** Failers
+\= Expect no match
     ]thing
     cthing
     dthing
@@ -175,7 +178,7 @@
     9
     10
     100
-    *** Failers
+\= Expect no match
     abc
 
 /^.*nter/
@@ -186,28 +189,28 @@
 /^xxx[0-9]+$/
     xxx0
     xxx1234
-    *** Failers
+\= Expect no match
     xxx
 
 /^.+[0-9][0-9][0-9]$/
     x123
+    x1234
     xx123
     123456
-    *** Failers
+\= Expect no match
     123
-    x1234
 
 /^.+?[0-9][0-9][0-9]$/
     x123
+    x1234
     xx123
     123456
-    *** Failers
+\= Expect no match
     123
-    x1234
 
 /^([^!]+)!(.+)=apquxz\.ixr\.zzz\.ac\.uk$/
     abc!pqr=apquxz.ixr.zzz.ac.uk
-    *** Failers
+\= Expect no match
     !pqr=apquxz.ixr.zzz.ac.uk
     abc!=apquxz.ixr.zzz.ac.uk
     abc!pqr=apquxz:ixr.zzz.ac.uk
@@ -215,7 +218,8 @@
 
 /:/
     Well, we need a colon: somewhere
-    *** Fail if we don't
+\= Expect no match
+    Fail without a colon
 
 /([\da-f:]+)$/i
     0abc
@@ -226,7 +230,7 @@
     5f03:12C0::932e
     fed def
     Any old stuff
-    *** Failers
+\= Expect no match
     0zzz
     gzzz
     fed\x20
@@ -235,7 +239,7 @@
 /^.*\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/
     .1.2.3
     A.12.123.0
-    *** Failers
+\= Expect no match
     .1.2.3333
     1.2.3
     1234.2.3
@@ -243,7 +247,7 @@
 /^(\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
+\= Expect no match
     1IN SOA non-sp1 non-sp2(
 
 /^[a-zA-Z\d][a-zA-Z\d\-]*(\.[a-zA-Z\d][a-zA-z\d\-]*)*\.$/
@@ -253,7 +257,7 @@
     ab-c.pq-r.
     sxk.zzz.ac.uk.
     x-.y-.
-    *** Failers
+\= Expect no match
     -abc.peq.
 
 /^\*\.[a-z]([a-z\-\d]*[a-z\d]+)?(\.[a-z]([a-z\-\d]*[a-z\d]+)?)*$/
@@ -261,7 +265,7 @@
     *.b0-a
     *.c3-b.c
     *.c-a.b-c
-    *** Failers
+\= Expect no match
     *.0
     *.a-
     *.a-b.c-
@@ -285,29 +289,30 @@
     \"1234\"
     \"abcd\" ;
     \"\" ; rhubarb
-    *** Failers
+\= Expect no match
     \"1234\" : things
 
 /^$/
     \
-    *** Failers
+\= Expect no match
+    A non-empty line
 
 /   ^    a   (?# begins with a)  b\sc (?# then b c) $ (?# then end)/x
     ab c
-    *** Failers
+\= Expect no match
     abc
     ab cde
 
 /(?x)   ^    a   (?# begins with a)  b\sc (?# then b c) $ (?# then end)/
     ab c
-    *** Failers
+\= Expect no match
     abc
     ab cde
 
 /^   a\ b[c ]d       $/x
     a bcd
     a b d
-    *** Failers
+\= Expect no match
     abcd
     ab d
 
@@ -361,7 +366,7 @@
     1234567890
     12345678ab
     12345678__
-    *** Failers
+\= Expect no match
     1234567
 
 /^[aeiou\d]{4,5}$/
@@ -369,7 +374,7 @@
     1234
     12345
     aaaaa
-    *** Failers
+\= Expect no match
     123456
 
 /^[aeiou\d]{4,5}?/
@@ -382,7 +387,7 @@
 /\A(abc|def)=(\1){2,3}\Z/
     abc=abcabc
     def=defdefdef
-    *** Failers
+\= Expect no match
     abc=defdef
 
 /^(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\11*(\3\4)\1(?#)2$/
@@ -401,7 +406,7 @@
 /^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
+\= Expect no match
     From abcd  Sep 01 12:33:02 1997
 
 /^12.34/s
@@ -422,7 +427,7 @@
 
 /^(\D*)(?=\d)(?!123)/
     abc456
-    *** Failers
+\= Expect no match
     abc123
 
 /^1234(?# test newlines
@@ -448,12 +453,12 @@
 
 /(?!^)abc/
     the abc
-    *** Failers
+\= Expect no match
     abc
 
 /(?=^)abc/
     abc
-    *** Failers
+\= Expect no match
     the abc
 
 /^[ab]{1,3}(ab*|b)/
@@ -669,7 +674,7 @@
     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
+\= Expect no match
     The quick brown fox
 
 /[\040\t]*                    # Nab whitespace.
@@ -1261,7 +1266,7 @@
     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
+\= Expect no match
     The quick brown fox
 
 /abc\0def\00pqr\000xyz\0000AB/
@@ -1283,14 +1288,14 @@
 /A\x0{2,3}Z/
     The A\x0\x0Z
     An A\0\x0\0Z
-    *** Failers
+\= Expect no match
     A\0Z
     A\0\x0\0\x0Z
 
 /^(cow|)\1(bell)/
     cowcowbell
     bell
-    *** Failers
+\= Expect no match
     cowbell
 
 /^\s/
@@ -1299,7 +1304,7 @@
     \nabc
     \rabc
     \tabc
-    *** Failers
+\= Expect no match
     abc
 
 /^a	b
@@ -1310,27 +1315,27 @@
     ab
     aaaab
     b
-    *** Failers
+\= Expect no match
     acb
 
 /^(a|)\1+b/
     aab
     aaaab
     b
-    *** Failers
+\= Expect no match
     ab
 
 /^(a|)\1?b/
     ab
     aab
     b
-    *** Failers
+\= Expect no match
     acb
 
 /^(a|)\1{2}b/
     aaab
     b
-    *** Failers
+\= Expect no match
     ab
     aab
     aaaab
@@ -1339,7 +1344,7 @@
     aaab
     aaaab
     b
-    *** Failers
+\= Expect no match
     ab
     aab
     aaaaab
@@ -1348,7 +1353,7 @@
     abbbbc
     abbbc
     abbc
-    *** Failers
+\= Expect no match
     abc
     abbbbbc
 
@@ -1363,7 +1368,7 @@
 
 /^[W-c]+$/
     WXY_^abc
-    *** Failers
+\= Expect no match
     wxy
 
 /^[W-c]+$/i
@@ -1382,7 +1387,7 @@
 
 /^abc$/
     abc
-    *** Failers
+\= Expect no match
     qqq\nabc
     abc\nzzz
     qqq\nabc\nzzz
@@ -1390,7 +1395,7 @@
 /\Aabc\Z/m
     abc
     abc\n 
-    *** Failers
+\= Expect no match
     qqq\nabc
     abc\nzzz
     qqq\nabc\nzzz
@@ -1399,7 +1404,7 @@
     abc\ndef
 
 /\A(.)*\Z/m
-    *** Failers
+\= Expect no match
     abc\ndef
 
 /(?:b)|(?::+)/
@@ -1408,17 +1413,17 @@
 
 /[-az]+/
     az-
-    *** Failers
+\= Expect no match
     b
 
 /[az-]+/
     za-
-    *** Failers
+\= Expect no match
     b
 
 /[a\-z]+/
     a-z
-    *** Failers
+\= Expect no match
     b
 
 /[a-z]+/
@@ -1426,12 +1431,12 @@
 
 /[\d-]+/
     12-34
-    *** Failers
+\= Expect no match
     aaa
 
 /[\d-z]+/
     12-34z
-    *** Failers
+\= Expect no match
     aaa
 
 /\x5c/
@@ -1439,7 +1444,7 @@
 
 /\x20Z/
     the Zoo
-    *** Failers
+\= Expect no match
     Zulu
 
 /(abc)\1/i
@@ -1447,22 +1452,10 @@
     ABCabc
     abcABC
 
-/ab{3cd/
-    ab{3cd
-
-/ab{3,cd/
-    ab{3,cd
-
-/ab{3,4a}cd/
-    ab{3,4a}cd
-
-/{4,5a}bc/
-    {4,5a}bc
-
 /abc$/
     abc
     abc\n
-    *** Failers
+\= Expect no match
     abc\ndef
 
 /(abc)\123/
@@ -1486,17 +1479,12 @@
     abc\100\060
     abc\100\60
     
-/^A\8B\9C$/
-    A8B9C
-    *** Failers
-    A\08B\09C  
-    
 /^(A)(B)(C)(D)(E)(F)(G)(H)(I)\8\9$/
     ABCDEFGHIHI 
 
 /^[A\8B\9C]+$/
     A8B9C
-    *** Failers 
+\= Expect no match 
     A8B9C\x00
 
 /(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)(l)\12\123/
@@ -1505,9 +1493,6 @@
 /(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\12\123/
     abcdefghijk\12S
 
-/ab\idef/
-    abidef
-
 /a{0}bc/
     bc
 
@@ -1531,7 +1516,7 @@
     baNOTcccd
     baNOTccd
     bacccd
-    *** Failers
+\= Expect no match
     anything
     b\bc   
     baccd
@@ -1553,14 +1538,14 @@
    
 /[^k]$/
     abc
-    *** Failers
+\= Expect no match
     abk   
    
 /[^k]{2,3}$/
     abc
     kbc
     kabc 
-    *** Failers
+\= Expect no match
     abk
     akb
     akk 
@@ -1568,14 +1553,14 @@
 /^\d{8,}\@.+[^k]$/
     12345678\@a.b.c.d
     123456789\@x.y.z
-    *** Failers
+\= Expect no match
     12345678\@x.y.uk
     1234567\@a.b.c.d       
 
 /(a)\1{8,}/
     aaaaaaaaa
     aaaaaaaaaa
-    *** Failers
+\= Expect no match
     aaaaaaa   
 
 /[^a]/
@@ -1611,7 +1596,7 @@
 /(\.\d\d((?=0)|\d(?=\d)))/
     1.230003938      
     1.875000282
-    *** Failers 
+\= Expect no match 
     1.235 
     
 /a(?)b/
@@ -1623,7 +1608,7 @@
 /foo(.*)bar/
     The food is under the bar in the barn.
     
-/foo(.*?)bar/  
+/foo(.*?)bar/
     The food is under the bar in the barn.
 
 /(.*)(\d*)/
@@ -1655,13 +1640,13 @@
      
 /^(\D*)(?=\d)(?!123)/
     ABC445
-    *** Failers
+\= Expect no match
     ABC123
     
 /^[W-]46]/
     W46]789 
     -46]789
-    *** Failers
+\= Expect no match
     Wall
     Zebra
     42
@@ -1677,7 +1662,7 @@
     [abcd] 
     ]abcd[
     \\backslash 
-    *** Failers
+\= Expect no match
     -46]789
     well
     
@@ -1685,11 +1670,13 @@
     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 cat dog elephant mussel cow horse canary baboon snake shark otherword
+\= Expect no match
+    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
+\= Expect no match
+    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
@@ -1720,27 +1707,31 @@
     aaaaaaaa    
 
 /^(a){1,1}/
-    bcd
     abc
     aab  
+\= Expect no match
+    bcd
 
 /^(a){1,2}/
-    bcd
     abc
     aab  
+\= Expect no match
+    bcd
 
 /^(a){1,3}/
-    bcd
     abc
     aab
     aaa   
+\= Expect no match
+    bcd
 
 /^(a){1,}/
-    bcd
     abc
     aab
     aaa
     aaaaaaaa    
+\= Expect no match
+    bcd
 
 /.*\.gif/
     borfle\nbib.gif\nno
@@ -1784,7 +1775,7 @@
 /(.*X|^B)/
     abcde\n1234Xyz
     BarFoo 
-    *** Failers
+\= Expect no match
     abcde\nBar  
 
 /(.*X|^B)/m
@@ -1795,7 +1786,7 @@
 /(.*X|^B)/s
     abcde\n1234Xyz
     BarFoo 
-    *** Failers
+\= Expect no match
     abcde\nBar  
 
 /(.*X|^B)/ms
@@ -1806,17 +1797,17 @@
 /(?s)(.*X|^B)/
     abcde\n1234Xyz
     BarFoo 
-    *** Failers 
+\= Expect no match 
     abcde\nBar  
 
 /(?s:.*X|^B)/
     abcde\n1234Xyz
     BarFoo 
-    *** Failers 
+\= Expect no match 
     abcde\nBar  
 
 /^.*B/
-    **** Failers
+\= Expect no match
     abc\nB
      
 /(?s)^.*B/
@@ -1854,47 +1845,47 @@
 
 /^[abcdefghijklmnopqrstuvwxy0123456789]/
     n
-    *** Failers 
+\= Expect no match 
     z 
 
 /abcde{0,0}/
     abcd
-    *** Failers
+\= Expect no match
     abce  
 
 /ab[cd]{0,0}e/
     abe
-    *** Failers
+\= Expect no match
     abcde 
     
 /ab(c){0,0}d/
     abd
-    *** Failers
+\= Expect no match
     abcd   
 
 /a(b*)/
     a
     ab
     abbbb
-    *** Failers
+\= Expect no match
     bbbbb    
     
 /ab\d{0}e/
     abe
-    *** Failers
+\= Expect no match
     ab1e   
     
 /"([^\\"]+|\\.)*"/
     the \"quick\" brown fox
     \"the \\\"quick\\\" brown fox\" 
 
-/.*?/g+
+/.*?/g,aftertext
     abc
   
-/\b/g+
+/\b/g,aftertext
     abc 
 
-/\b/+g
+/\b/g,aftertext
     abc 
 
 //g
@@ -1909,7 +1900,7 @@
     
 /a.b/
     acb
-    *** Failers 
+\= Expect no match 
     a\nb   
     
 /a[^a]b/s
@@ -1935,12 +1926,11 @@
     bbbbbac 
     
 /(?!\A)x/m
+    a\bx\n
+    a\nx\n
+\= Expect no match     
     x\nb\n
-    a\bx\n  
     
-/\x0{ab}/
-    \0{ab} 
-
 /(A|B)*?CD/
     CD 
     
@@ -1958,46 +1948,45 @@
     catfood
     arfootle
     rfoosh
-    *** Failers
+\= Expect no match
     barfoo
     towbarfoo
 
 /\w{3}(?<!bar)foo/
     catfood
-    *** Failers
+\= Expect no match
     foo
     barfoo
     towbarfoo
 
 /(?<=(foo)a)bar/
     fooabar
-    *** Failers
+\= Expect no match
     bar
     foobbar
       
 /\Aabc\z/m
     abc
-    *** Failers
+\= Expect no match
     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
+\= Expect no match     
+    /this/is/a/very/long/line/in/deed/with/very/many/slashes/in/it/you/see/
 
 /(?>(\.\d\d[1-9]?))\d+/
     1.230003938
     1.875000282
-    *** Failers 
+\= Expect no match 
     1.235 
 
 /^((?>\w+)|(?>\s+))*$/
     now is the time for all good men to come to the aid of the party
-    *** Failers
+\= Expect no match
     this is not a line with only words and spaces!
     
 /(\d+)(\w)/
@@ -2006,7 +1995,7 @@
 
 /((?>\d+))(\w)/
     12345a
-    *** Failers
+\= Expect no match
     12345+ 
 
 /(?>a+)b/
@@ -2027,35 +2016,35 @@
 /((?>[^()]+)|\([^()]*\))+/
     ((abc(ade)ufh()()x
     
-/\(((?>[^()]+)|\([^()]+\))+\)/ 
+/\(((?>[^()]+)|\([^()]+\))+\)/
     (abc)
     (abc(def)xyz)
-    *** Failers
+\= Expect no match
     ((()aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa   
 
 /a(?-i)b/i
     ab
     Ab
-    *** Failers 
+\= Expect no match 
     aB
     AB
         
 /(a (?x)b c)d e/
     a bcd e
-    *** Failers
+\= Expect no match
     a b cd e
     abcd e   
     a bcde 
  
 /(a b(?x)c d (?-x)e f)/
     a bcde f
-    *** Failers
+\= Expect no match
     abcdef  
 
 /(a(?i)b)c/
     abc
     aBc
-    *** Failers
+\= Expect no match
     abC
     aBC  
     Abc
@@ -2066,7 +2055,7 @@
 /a(?i:b)c/
     abc
     aBc
-    *** Failers 
+\= Expect no match 
     ABC
     abC
     aBC
@@ -2074,14 +2063,14 @@
 /a(?i:b)*c/
     aBc
     aBBc
-    *** Failers 
+\= Expect no match 
     aBC
     aBBC
     
 /a(?=b(?i)c)\w\wd/
     abcd
     abCd
-    *** Failers
+\= Expect no match
     aBCd
     abcD     
     
@@ -2089,7 +2078,7 @@
     more than million
     more than MILLION
     more \n than Million 
-    *** Failers
+\= Expect no match
     MORE THAN MILLION    
     more \n than \n million 
 
@@ -2097,15 +2086,15 @@
     more than million
     more than MILLION
     more \n than Million 
-    *** Failers
+\= Expect no match
     MORE THAN MILLION    
     more \n than \n million 
     
-/(?>a(?i)b+)+c/ 
+/(?>a(?i)b+)+c/
     abc
     aBbc
     aBBc 
-    *** Failers
+\= Expect no match
     Abc
     abAb    
     abbC 
@@ -2113,7 +2102,7 @@
 /(?=a(?i)b)\w\wc/
     abc
     aBc
-    *** Failers
+\= Expect no match
     Ab 
     abC
     aBC     
@@ -2121,7 +2110,7 @@
 /(?<=a(?i)b)(\w\w)c/
     abxxc
     aBxxc
-    *** Failers
+\= Expect no match
     Abxxc
     ABxxc
     abxxC      
@@ -2129,7 +2118,7 @@
 /(?:(a)|b)(?(1)A|B)/
     aA
     bB
-    *** Failers
+\= Expect no match
     aB
     bA    
 
@@ -2137,20 +2126,23 @@
     aa
     b
     bb  
-    *** Failers
+\= Expect no match
     ab   
+    
+# Perl gets this next one wrong if the pattern ends with $; in that case it
+# fails to match "12". 
 
-/^(?(?=abc)\w{3}:|\d\d)$/
+/^(?(?=abc)\w{3}:|\d\d)/
     abc:
     12
-    *** Failers
     123
+\= Expect no match
     xyz    
 
 /^(?(?!abc)\d\d|\w{3}:)$/
     abc:
     12
-    *** Failers
+\= Expect no match
     123
     xyz    
     
@@ -2159,7 +2151,7 @@
     cat
     fcat
     focat   
-    *** Failers
+\= Expect no match
     foocat  
 
 /(?(?<!foo)cat|bar)/
@@ -2167,7 +2159,7 @@
     cat
     fcat
     focat   
-    *** Failers
+\= Expect no match
     foocat  
 
 /( \( )? [^()]+ (?(1) \) |) /x
@@ -2186,7 +2178,7 @@
     12
     12a
     12aa
-    *** Failers
+\= Expect no match
     1234    
 
 /((?i)blah)\s+\1/
@@ -2194,7 +2186,7 @@
     BLAH BLAH
     Blah Blah
     blaH blaH
-    *** Failers
+\= Expect no match
     blah BLAH
     Blah blah      
     blaH blah 
@@ -2274,13 +2266,13 @@
 /(?(?=[^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
+\= Expect no match
     sep-12-98
         
 /(?<=(foo))bar\1/
     foobarfoo
     foobarfootling 
-    *** Failers
+\= Expect no match
     foobar
     barfoo   
 
@@ -2298,7 +2290,7 @@
     aBCx
     bbx
     BBx
-    *** Failers
+\= Expect no match
     abcX
     aBCX
     bbX
@@ -2312,7 +2304,7 @@
     Europe 
     frog
     France
-    *** Failers
+\= Expect no match
     Africa     
 
 /^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)/
@@ -2322,13 +2314,13 @@
     xY
     zebra
     Zambesi
-    *** Failers
+\= Expect no match
     aCD  
     XY  
 
 /(?<=foo\n)^bar/m
     foo\nbar
-    *** Failers
+\= Expect no match
     bar
     baz\nbar   
 
@@ -2336,41 +2328,43 @@
     barbaz
     barbarbaz 
     koobarbaz 
-    *** Failers
+\= Expect no match
     baz
     foobarbaz 
 
-/The cases of aaaa and aaaaaa are missed out below because Perl does things/
-/differently. We know that odd, and maybe incorrect, things happen with/
-/recursive references in Perl, as far as 5.11.3 - see some stuff in test #2./
+# The cases of aaaa and aaaaaa are missed out below because Perl does things
+# differently. We know that odd, and maybe incorrect, things happen with
+# recursive references in Perl, as far as 5.11.3 - see some stuff in test #2.
 
 /^(a\1?){4}$/
+    aaaaa
+    aaaaaaa
+    aaaaaaaaaa
+\= Expect no match
     a
     aa
     aaa
-    aaaaa
-    aaaaaaa
     aaaaaaaa
     aaaaaaaaa
-    aaaaaaaaaa
     aaaaaaaaaaa
     aaaaaaaaaaaa
     aaaaaaaaaaaaa
     aaaaaaaaaaaaaa
     aaaaaaaaaaaaaaa
-    aaaaaaaaaaaaaaaa               
+    aaaaaaaaaaaaaaaa
 
 /^(a\1?)(a\1?)(a\2?)(a\3?)$/
-    a
-    aa
-    aaa
     aaaa
     aaaaa
     aaaaaa
     aaaaaaa
+    aaaaaaaaaa
+\= Expect no match
+    a
+    aa
+    aaa
     aaaaaaaa
     aaaaaaaaa
-    aaaaaaaaaa
     aaaaaaaaaaa
     aaaaaaaaaaaa
     aaaaaaaaaaaaa
@@ -2378,14 +2372,14 @@
     aaaaaaaaaaaaaaa
     aaaaaaaaaaaaaaaa               
 
-/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./
+# 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
+\= Expect no match
     xbc
     axc
     abx
@@ -2409,7 +2403,7 @@
 
 /ab+bc/
     abbc
-    *** Failers
+\= Expect no match
     abc
     abq
 
@@ -2428,7 +2422,7 @@
     abbbbc
 
 /ab{4,5}bc/
-    *** Failers
+\= Expect no match
     abq
     abbbbc
 
@@ -2449,7 +2443,7 @@
 
 /^abc$/
     abc
-    *** Failers
+\= Expect no match
     abbbbc
     abcc
 
@@ -2460,8 +2454,7 @@
 
 /abc$/
     aabc
-    *** Failers
-    aabc
+\= Expect no match
     aabcd
 
 /^/
@@ -2479,7 +2472,7 @@
 
 /a[bc]d/
     abd
-    *** Failers
+\= Expect no match
     axyzd
     abc
 
@@ -2503,7 +2496,7 @@
 
 /a[^bc]d/
     aed
-    *** Failers
+\= Expect no match
     abd
     abd
 
@@ -2512,8 +2505,8 @@
 
 /a[^]b]c/
     adc
-    *** Failers
     a-c
+\= Expect no match
     a]c
 
 /\ba\b/
@@ -2522,13 +2515,13 @@
     -a-
 
 /\by\b/
-    *** Failers
+\= Expect no match
     xy
     yz
     xyz
 
 /\Ba\B/
-    *** Failers
+\= Expect no match
     a-
     -a
     -a-
@@ -2547,8 +2540,7 @@
 
 /\W/
     -
-    *** Failers
-    -
+\= Expect no match
     a
 
 /a\sb/
@@ -2556,8 +2548,7 @@
 
 /a\Sb/
     a-b
-    *** Failers
-    a-b
+\= Expect no match
     a b
 
 /\d/
@@ -2565,8 +2556,7 @@
 
 /\D/
     -
-    *** Failers
-    -
+\= Expect no match
     1
 
 /[\w]/
@@ -2574,8 +2564,7 @@
 
 /[\W]/
     -
-    *** Failers
-    -
+\= Expect no match
     a
 
 /a[\s]b/
@@ -2583,8 +2572,7 @@
 
 /a[\S]b/
     a-b
-    *** Failers
-    a-b
+\= Expect no match
     a b
 
 /[\d]/
@@ -2592,8 +2580,7 @@
 
 /[\D]/
     -
-    *** Failers
-    -
+\= Expect no match
     1
 
 /ab|cd/
@@ -2613,7 +2600,7 @@
     a((b
 
 /a\\b/
-    a\b
+    a\\b
 
 /((a))/
     abc
@@ -2652,12 +2639,11 @@
     cde
 
 /abc/
-    *** Failers
+\= Expect no match
     b
-    
 
 /a*/
-    
+    \
 
 /([abc])*d/
     abbbcd
@@ -2711,7 +2697,7 @@
     adcdcde
 
 /a[bcd]+dcdcde/
-    *** Failers
+\= Expect no match
     abcde
     adcdcde
 
@@ -2731,7 +2717,7 @@
     effgz
     ij
     reffgz
-    *** Failers
+\= Expect no match
     effg
     bcdd
 
@@ -2745,7 +2731,7 @@
     a
 
 /multiple words of text/
-    *** Failers
+\= Expect no match
     aa
     uh-uh
 
@@ -2777,8 +2763,8 @@
 
 /(a)|\1/
     a
-    *** Failers
     ab
+\= Expect no match
     x
 
 /(([a-c])b*?\2)*/
@@ -2797,7 +2783,7 @@
     ABC
     XABCY
     ABABC
-    *** Failers
+\= Expect no match
     aaxabxbaxbbx
     XBC
     AXC
@@ -2820,7 +2806,7 @@
     ABBC
 
 /ab+bc/i
-    *** Failers
+\= Expect no match
     ABC
     ABQ
 
@@ -2839,7 +2825,7 @@
     ABBBBC
 
 /ab{4,5}?bc/i
-    *** Failers
+\= Expect no match
     ABQ
     ABBBBC
 
@@ -2860,7 +2846,7 @@
 
 /^abc$/i
     ABC
-    *** Failers
+\= Expect no match
     ABBBBC
     ABCC
 
@@ -2886,8 +2872,8 @@
     AXYZC
 
 /a.*c/i
-    *** Failers
     AABC
+\= Expect no match
     AXYZD
 
 /a[bc]d/i
@@ -2895,7 +2881,7 @@
 
 /a[b-d]e/i
     ACE
-    *** Failers
+\= Expect no match
     ABC
     ABD
 
@@ -2919,7 +2905,7 @@
 
 /a[^-b]c/i
     ADC
-    *** Failers
+\= Expect no match
     ABD
     A-C
 
@@ -2934,7 +2920,7 @@
     DEF
 
 /$b/i
-    *** Failers
+\= Expect no match
     A]C
     B
 
@@ -2946,7 +2932,8 @@
     A((B
 
 /a\\b/i
-    A\B
+    A\\b
+    a\\B 
 
 /((a))/i
     ABC
@@ -2993,11 +2980,6 @@
 /[^ab]*/i
     CDE
 
-/abc/i
-
-/a*/i
-    
-
 /([abc])*d/i
     ABBBCD
 
@@ -3024,6 +3006,7 @@
     HIJ
 
 /^(ab|cd)e/i
+\= Expect no match
     ABCDE
 
 /(abc|)ef/i
@@ -3068,7 +3051,7 @@
     EFFGZ
     IJ
     REFFGZ
-    *** Failers
+\= Expect no match
     ADCDCDE
     EFFG
     BCDD
@@ -3089,7 +3072,7 @@
     C
 
 /multiple words of text/i
-    *** Failers
+\= Expect no match
     AA
     UH-UH
 
@@ -3185,14 +3168,14 @@
 
 /^(a\1?){4}$/
     aaaaaaaaaa
-    *** Failers
+\= Expect no match
     AB
     aaaaaaaaa
     aaaaaaaaaaa
 
 /^(a(?(1)\1)){4}$/
     aaaaaaaaaa
-    *** Failers
+\= Expect no match
     aaaaaaaaa
     aaaaaaaaaaa
 
@@ -3201,7 +3184,7 @@
 
 /(?<=a)b/
     ab
-    *** Failers
+\= Expect no match
     cb
     b
 
@@ -3250,7 +3233,7 @@
     Ab
 
 /(?:(?i)a)b/
-    *** Failers
+\= Expect no match
     cb
     aB
 
@@ -3269,7 +3252,7 @@
     Ab
 
 /(?i:a)b/
-    *** Failers
+\= Expect no match
     aB
     aB
 
@@ -3288,25 +3271,11 @@
     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
+\= Expect no match
     Ab
     AB
 
-/((?-i)a)b/i
-
 /(?-i:a)b/i
     ab
 
@@ -3320,7 +3289,7 @@
     aB
 
 /(?-i:a)b/i
-    *** Failers
+\= Expect no match
     AB
     Ab
 
@@ -3333,14 +3302,14 @@
     aB
 
 /(?-i:a)b/i
-    *** Failers
+\= Expect no match
     Ab
     AB
 
 /((?-i:a))b/i
 
 /((?-i:a.))b/i
-    *** Failers
+\= Expect no match
     AB
     a\nB
 
@@ -3370,7 +3339,7 @@
     aaac
 
 /(?<![cd])b/
-    *** Failers
+\= Expect no match
     B\nB
     dbcb
 
@@ -3390,7 +3359,7 @@
     a
     ab
     aaa   
-    *** Failers
+\= Expect no match
     dbcb
     a--
     aa-- 
@@ -3424,7 +3393,7 @@
 /^b/
 
 /()^b/
-    *** Failers
+\= Expect no match
     a\nb\nc\n
     a\nb\nc\n
 
@@ -3432,7 +3401,7 @@
     a\nb\nc\n
 
 /(x)?(?(1)a|b)/
-    *** Failers
+\= Expect no match
     a
     a
 
@@ -3450,7 +3419,7 @@
 /^(\()?blah(?(1)(\)))$/
     (blah)
     blah
-    *** Failers
+\= Expect no match
     a
     blah)
     (blah
@@ -3458,7 +3427,7 @@
 /^(\(+)?blah(?(1)(\)))$/
     (blah)
     blah
-    *** Failers
+\= Expect no match
     blah)
     (blah
 
@@ -3468,7 +3437,7 @@
     a
 
 /(?(?=a)b|a)/
-    *** Failers
+\= Expect no match
     a
     a
 
@@ -3490,7 +3459,7 @@
     aaab
 
 /^(?=(a+?))\1ab/
-    *** Failers
+\= Expect no match
     aaab
     aaab
 
@@ -3507,7 +3476,7 @@
 /([\w:]+::)?(\w+)$/
     abcd
     xy:z:::abcd
-    *** Failers
+\= Expect no match
     abcd:
     abcd:
 
@@ -3538,7 +3507,7 @@
     ((abc(ade)ufh()()x
 
 /a\Z/
-    *** Failers
+\= Expect no match
     aaab
     a\nb\n
 
@@ -3552,7 +3521,6 @@
 
 /b\z/
     a\nb
-    *** Failers
     
 /^(?>(?(1)\.|())[^\W_](?>[a-z0-9-]*[^\W_])?)+$/
     a
@@ -3564,7 +3532,7 @@
     the.quick.brown.fox
     a100.b200.300c  
     12-ab.1245 
-    *** Failers
+\= Expect no match
     \
     .a
     -a
@@ -3582,38 +3550,40 @@
 /(?>.*)(?<=(abcd|wxyz))/
     alphabetabcd
     endingwxyz
-    *** Failers
+\= Expect no match
     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
+\= Expect no match
     word cat dog elephant mussel cow horse canary baboon snake shark
   
 /word (?>[a-zA-Z0-9]+ ){0,30}otherword/
+\= Expect no match
     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
+\= Expect no match
     123abcfoo
     
 /(?<=(?!...999)\d{3})foo/
     999foo
     123999foo 
-    *** Failers
+\= Expect no match
     123abcfoo
 
 /(?<=\d{3}(?!999)...)foo/
     123abcfoo
     123456foo 
-    *** Failers
+\= Expect no match
     123999foo  
     
 /(?<=\d{3}...)(?<!999)foo/
     123abcfoo   
     123456foo 
-    *** Failers
+\= Expect no match
     123999foo  
 
 /<a[\s]+href[\s]*=[\s]*          # find <a href=
@@ -3665,7 +3635,7 @@
     abcde
     -things
     0digit
-    *** Failers
+\= Expect no match
     bcdef    
     
 /[[:space:]]+/
@@ -3684,10 +3654,11 @@
     ab
 
 /(?!\A)x/m
-  a\nxb\n
+    a\nxb\n
 
 /(?!^)x/m
-  a\nxb\n
+\= Expect no match
+    a\nxb\n
 
 /abc\Qabc\Eabc/
     abcabcabc
@@ -3697,7 +3668,7 @@
 
 /   abc\Q abc\Eabc/x
     abc abcabc
-    *** Failers
+\= Expect no match
     abcabcabc  
     
 /abc#comment
@@ -3729,7 +3700,7 @@
 
 /\Gabc/
     abc
-    *** Failers
+\= Expect no match
     xyzabc  
 
 /\Gabc./g
@@ -3740,7 +3711,7 @@
 
 /a(?x: b c )d/
     XabcdY
-    *** Failers 
+\= Expect no match 
     Xa b c d Y 
 
 /((?x)x y z | a b c)/
@@ -3749,13 +3720,13 @@
 
 /(?i)AB(?-i)C/
     XabCY
-    *** Failers
+\= Expect no match
     XabcY  
 
 /((?i)AB(?-i)C|D)E/
     abCE
     DE
-    *** Failers
+\= Expect no match
     abcE
     abCe  
     dE
@@ -3773,9 +3744,9 @@
     abc123abc
     abc123bc  
 
-/-- This tests for an IPv6 address in the form where it can have up to
-    eight components, one and only one of which is empty. This must be
-    an internal component. --/
+# This tests for an IPv6 address in the form where it can have up to
+# eight components, one and only one of which is empty. This must be
+# an internal component. 
 
 /^(?!:)                       # colon disallowed at start
   (?:                         # start of item
@@ -3785,14 +3756,14 @@
   ){1,7}                      # end item; 1-7 of them required               
   [0-9a-f]{1,4} $             # final hex number at end of string
   (?(1)|.)                    # check that there was an empty component
-  /xi
+  /ix
     a123::a123
     a123:b342::abcd
     a123:b342::324e:abcd
     a123:ddde:b342::324e:abcd
     a123:ddde:b342::324e:dcba:abcd
     a123:ddde:9999:b342::324e:dcba:abcd
-    *** Failers
+\= Expect no match
     1:2:3:4:5:6:7:8
     a123:bce:ddde:9999:b342::324e:dcba:abcd
     a123::9999:b342::324e:dcba:abcd
@@ -3808,17 +3779,11 @@
     -
     d
     ] 
-    *** Failers
+\= Expect no match
     b     
 
-/[\z\C]/
-    z
-    C 
-    
-/\M/
-    M 
-    
 /(a+)*b/
+\= Expect no match
     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 
     
 /(?i)reg(?:ul(?:[aä]|ae)r|ex)/
@@ -3841,29 +3806,29 @@
 
 /ab cd(?x) de fg/
     ab cddefg
-    ** Failers 
+\= Expect no match 
     abcddefg
 
 /(?<![^f]oo)(bar)/
     foobarX 
-    ** Failers 
+\= Expect no match 
     boobarX
 
 /(?<![^f])X/
     offX
-    ** Failers
+\= Expect no match
     onyX  
 
 /(?<=[^f])X/
     onyX
-    ** Failers
+\= Expect no match
     offX 
 
-/^/mg
+/^/gm
     a\nb\nc\n
     \ 
     
-/(?<=C\n)^/mg
+/(?<=C\n)^/gm
     A\nC\nC\n 
 
 /(?:(?(1)a|b)(X))+/
@@ -3886,12 +3851,12 @@
     
 "(?x)(?-x: \s*#\s*)"
     A # B
-    ** Failers
+\= Expect no match
     #  
 
 "(?x-is)(?:(?-ixs) \s*#\s*) include"
     A #include
-    ** Failers
+\= Expect no match
     A#include  
     A #Include
 
@@ -3943,24 +3908,24 @@
     
 /^[\Eabc]/
     a
-    ** Failers 
+\= Expect no match 
     E 
     
 /^[a-\Ec]/
     b
-    ** Failers
+\= Expect no match
     -
     E    
 
 /^[a\E\E-\Ec]/
     b
-    ** Failers
+\= Expect no match
     -
     E    
 
 /^[\E\Qa\E-\Qz\E]+/
     b
-    ** Failers
+\= Expect no match
     -  
     
 /^[a\Q]bc\E]/
@@ -3990,30 +3955,36 @@
     D  
 
 /(a|)*\d/
-  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4
+\= Expect no match
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
 
 /(?>a|)*\d/
-  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4
+\= Expect no match
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
 
 /(?:a|)*\d/
-  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4
+\= Expect no match
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
 
 /\Z/g
   abc\n
   
 /^(?s)(?>.*)(?<!\n)/
   abc
+\= Expect no match
   abc\n  
 
 /^(?![^\n]*\n\z)/
   abc
+\= Expect no match
   abc\n 
   
 /\z(?<!\n)/
   abc
+\= Expect no match
   abc\n  
 
 /(.*(.)?)*/
@@ -4040,6 +4011,7 @@
     p    
 
 /.*[op][xyz]/
+\= Expect no match
     fooabcfoo
 
 /(?(?=.*b)b|^)/
@@ -4048,6 +4020,7 @@
 
 /(?(?=^.*b)b|^)/
    adc
+\= Expect no match
    abc 
 
 /(?(?=.*b)b|^)*/
@@ -4071,19 +4044,18 @@
     XabX
     XAbX
     CcC 
-    ** Failers
+\= Expect no match
     XABX   
 
 /[\x00-\xff\s]+/
     \x0a\x0b\x0c\x0d
 
-/^\c/
-    ?
-
 /(abc)\1/i
+\= Expect no match
    abc
 
 /(abc)\1/
+\= Expect no match
    abc
 
 /[^a]*/i
@@ -4095,12 +4067,12 @@
     12ABC
 
 /[^a]*?X/i
-    ** Failers
+\= Expect no match
     12abc
     12ABC
     
-/[^a]+?X/i   
-    ** Failers
+/[^a]+?X/i
+\= Expect no match
     12abc
     12ABC
 
@@ -4158,19 +4130,21 @@
 /(?>(?>(a))b|(a)c)/
     ac
 
-/(?:(?>([ab])))+a=/+
+/(?:(?>([ab])))+a=/aftertext
     =ba=
 
-/(?>([ab]))+a=/+
+/(?>([ab]))+a=/aftertext
     =ba=
 
 /((?>(a+)b)+(aabab))/
     aaaabaaabaabab
 
 /(?>a+|ab)+?c/
+\= Expect no match
     aabc
 
 /(?>a+|ab)+c/
+\= Expect no match
     aabc
 
 /(?:a+|ab)+c/
@@ -4183,34 +4157,36 @@
     ab
 
 /^(?:a|ab)++c/
+\= Expect no match
     aaaabc
 
 /^(?>a|ab)++c/
+\= Expect no match
     aaaabc
 
 /^(?:a|ab)+c/
     aaaabc
 
-/(?=abc){3}abc/+
+/(?=abc){3}abc/aftertext
     abcabcabc
-    ** Failers
+\= Expect no match
     xyz  
     
-/(?=abc)+abc/+
+/(?=abc)+abc/aftertext
     abcabcabc
-    ** Failers
+\= Expect no match
     xyz  
     
-/(?=abc)++abc/+
+/(?=abc)++abc/aftertext
     abcabcabc
-    ** Failers
+\= Expect no match
     xyz  
     
 /(?=abc){0}xyz/
     xyz 
 
 /(?=abc){1}xyz/
-    ** Failers
+\= Expect no match
     xyz 
     
 /(?=(a))?./
@@ -4234,7 +4210,7 @@
 
 /^[\g<a>]+/
     ggg<<<aaa>>>
-    ** Failers
+\= Expect no match
     \\ga  
     
 /^[\ga]+/
@@ -4251,12 +4227,12 @@
      
 /(?<=a{2})b/i
     xaabc
-    ** Failers
+\= Expect no match
     xabc  
 
 /(?<!a{2})b/i
     xabc
-    ** Failers
+\= Expect no match
     xaabc  
 
 /(?<=a\h)c/
@@ -4265,12 +4241,12 @@
 /(?<=[^a]{2})b/
     axxbc
     aAAbc 
-    ** Failers
+\= Expect no match
     xaabc    
 
 /(?<=[^a]{2})b/i
     axxbc  
-    ** Failers
+\= Expect no match
     aAAbc 
     xaabc    
 
@@ -4291,42 +4267,29 @@
 
 /^(a{2,3}){2,}+a/
     aaaaaaa
-    ** Failers
+\= Expect no match
     aaaaaa
     aaaaaaaaa 
 
 /^(a{2,3})++a/
-    ** Failers
+\= Expect no match
     aaaaaa
 
 /^(a{2,3})*+a/
-    ** Failers
+\= Expect no match
     aaaaaa
 
-/ab\Cde/
-    abXde
-    
-/(?<=ab\Cde)X/
-    abZdeX
-
-/a[\CD]b/
-    aCb
-    aDb 
-
-/a[\C-X]b/
-    aJb
-
 /\H\h\V\v/
     X X\x0a
     X\x09X\x0b
-    ** Failers
+\= Expect no match
     \xa0 X\x0a   
     
-/\H*\h+\V?\v{3,4}/ 
+/\H*\h+\V?\v{3,4}/
     \x09\x20\xa0X\x0a\x0b\x0c\x0d\x0a
     \x09\x20\xa0\x0a\x0b\x0c\x0d\x0a
     \x09\x20\xa0\x0a\x0b\x0c
-    ** Failers 
+\= Expect no match 
     \x09\x20\xa0\x0a\x0b
      
 /\H{3,4}/
@@ -4339,7 +4302,7 @@
 /\h*X\h?\H+Y\H?Z/
     >XNNNYZ
     >  X NYQZ
-    ** Failers
+\= Expect no match
     >XYZ   
     >  X NY Z
 
@@ -4357,21 +4320,21 @@
 /(foo\Kbar)baz/
     foobarbaz
 
-/abc\K|def\K/g+
+/abc\K|def\K/g,aftertext
     Xabcdefghi
 
-/ab\Kc|de\Kf/g+
+/ab\Kc|de\Kf/g,aftertext
     Xabcdefghi
     
-/(?=C)/g+
+/(?=C)/g,aftertext
     ABCDECBA
     
-/^abc\K/+
+/^abc\K/aftertext
     abcdef
-    ** Failers
+\= Expect no match
     defabcxyz   
 
-/^(a(b))\1\g1\g{1}\g-1\g{-1}\g{-02}Z/
+/^(a(b))\1\g1\g{1}\g-1\g{-1}\g{-2}Z/
     ababababbbabZXXXX
 
 /(?<A>tom|bon)-\g{A}/
@@ -4379,19 +4342,20 @@
     bon-bon 
     
 /(^(a|b\g{-1}))/
+\= Expect no match
     bacxxx
 
 /(?|(abc)|(xyz))\1/
     abcabc
     xyzxyz 
-    ** Failers
+\= Expect no match
     abcxyz
     xyzabc   
     
 /(?|(abc)|(xyz))(?1)/
     abcabc
     xyzabc 
-    ** Failers 
+\= Expect no match 
     xyzxyz 
  
 /^X(?5)(a)(?|(b)|(q))(c)(d)(Y)/
@@ -4406,14 +4370,14 @@
 /(?'abc'\w+):\k<abc>{2}/
     a:aaxyz
     ab:ababxyz
-    ** Failers
+\= Expect no match
     a:axyz
     ab:abxyz
 
 /(?'abc'\w+):\g{abc}{2}/
     a:aaxyz
     ab:ababxyz
-    ** Failers
+\= Expect no match
     a:axyz
     ab:abxyz
 
@@ -4441,7 +4405,7 @@
     1.2.3.4
     131.111.10.206
     10.0.0.0
-    ** Failers
+\= Expect no match
     10.6
     455.3.4.5
 
@@ -4449,18 +4413,18 @@
     1.2.3.4
     131.111.10.206
     10.0.0.0
-    ** Failers
+\= Expect no match
     10.6
     455.3.4.5
 
 /^(\w++|\s++)*$/
     now is the time for all good men to come to the aid of the party
-    *** Failers
+\= Expect no match
     this is not a line with only words and spaces!
 
 /(\d++)(\w)/
     12345a
-    *** Failers
+\= Expect no match
     12345+
 
 /a++b/
@@ -4478,14 +4442,14 @@
 /\(([^()]++|\([^()]+\))+\)/
     (abc)
     (abc(def)xyz)
-    *** Failers
+\= Expect no match
     ((()aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
 
 /^([^()]|\((?1)*\))*$/
     abc
     a(b)c
     a(b(c))d
-    *** Failers)
+\= Expect no match)
     a(b(c)d
 
 /^>abc>([^()]|\((?1)*\))*<xyz<$/
@@ -4498,20 +4462,20 @@
     Satanoscillatemymetallicsonatas
     AmanaplanacanalPanama
     AblewasIereIsawElba
-    *** Failers
+\= Expect no match
     Thequickbrownfox
 
 /^(\d+|\((?1)([+*-])(?1)\)|-(?1))$/
     12
     (((2+2)*-3)-7)
     -12
-    *** Failers
+\= Expect no match
     ((2+2)*-3)-7)
 
 /^(x(y|(?1){2})z)/
     xyz
     xxyzxyzz
-    *** Failers
+\= Expect no match
     xxyzz
     xxyzxyzxyzz
 
@@ -4522,22 +4486,27 @@
     <abc <def> hij>
     <abc<>def>
     <abc<>
-    *** Failers
+\= Expect no match
     <abc
 
 /^a+(*FAIL)/
+\= Expect no match
     aaaaaa
     
 /a+b?c+(*FAIL)/
+\= Expect no match
     aaabccc
 
 /a+b?(*PRUNE)c+(*FAIL)/
+\= Expect no match
     aaabccc
 
 /a+b?(*COMMIT)c+(*FAIL)/
+\= Expect no match
     aaabccc
     
 /a+b?(*SKIP)c+(*FAIL)/
+\= Expect no match
     aaabcccaaabccc
 
 /^(?:aaa(*THEN)\w{6}|bbb(*THEN)\w{5}|ccc(*THEN)\w{4}|\w{3})/
@@ -4559,6 +4528,7 @@
     dddddddd   
 
 /a+b?(*THEN)c+(*FAIL)/
+\= Expect no match
     aaabccc
 
 /(A (A|B(*ACCEPT)|C) D)(E)/x
@@ -4566,7 +4536,7 @@
     ABX
     AADE
     ACDE
-    ** Failers
+\= Expect no match
     AD 
         
 /^\W*+(?:((.)\W*+(?1)\W*+\2|)|((.)\W*+(?3)\W*+\4|\W*+.\W*+))\W*+$/i
@@ -4574,7 +4544,7 @@
     Satan, oscillate my metallic sonatas!
     A man, a plan, a canal: Panama!
     Able was I ere I saw Elba.
-    *** Failers
+\= Expect no match
     The quick brown fox
 
 /^((.)(?1)\2|.)$/
@@ -4584,17 +4554,18 @@
     abcdcba 
     pqaabaaqp  
     ablewasiereisawelba
+\= Expect no match     
     rhubarb
     the quick brown fox  
 
 /(a)(?<=b(?1))/
     baz
-    ** Failers
+\= Expect no match
     caz  
     
 /(?<=b(?1))(a)/
     zbaaz
-    ** Failers
+\= Expect no match
     aaa  
     
 /(?<X>a)(?<=b(?&X))/
@@ -4603,33 +4574,33 @@
 /^(?|(abc)|(def))\1/
     abcabc
     defdef 
-    ** Failers
+\= Expect no match
     abcdef
     defabc   
     
 /^(?|(abc)|(def))(?1)/
     abcabc
     defabc
-    ** Failers
+\= Expect no match
     defdef
     abcdef    
 
-/(?:a(?<quote> (?<apostrophe>')|(?<realquote>")) |b(?<quote> (?<apostrophe>')|(?<realquote>")) ) (?('quote')[a-z]+|[0-9]+)/xJ
+/(?:a(?<quote> (?<apostrophe>')|(?<realquote>")) |b(?<quote> (?<apostrophe>')|(?<realquote>")) ) (?('quote')[a-z]+|[0-9]+)/x,dupnames
     a\"aaaaa
     b\"aaaaa 
-    ** Failers 
+\= Expect no match 
     b\"11111
 
 /(?:(?1)|B)(A(*F)|C)/
     ABCD
     CCD
-    ** Failers
+\= Expect no match
     CAD   
 
 /^(?:(?1)|B)(A(*F)|C)/
     CCD
     BCD 
-    ** Failers
+\= Expect no match
     ABCD
     CAD
     BAD    
@@ -4640,7 +4611,7 @@
     BAD
     BCD
     BAX  
-    ** Failers
+\= Expect no match
     ACX
     ABC   
 
@@ -4654,12 +4625,12 @@
     (ab(cd)ef)
 
 /^(?=a(*SKIP)b|ac)/
-    ** Failers
+\= Expect no match
     ac
     
 /^(?=a(*PRUNE)b)/
     ab  
-    ** Failers 
+\= Expect no match 
     ac
 
 /^(?=a(*ACCEPT)b)/
@@ -4697,95 +4668,98 @@
     00
     0000  
 
-/--- This one does fail, as expected, in Perl. It needs the complex item at the
-     end of the pattern. A single letter instead of (B|D) makes it not fail,
-     which I think is a Perl bug. --- /
+# This one does fail, as expected, in Perl. It needs the complex item at the
+# end of the pattern. A single letter instead of (B|D) makes it not fail, which
+# I think is a Perl bug.
 
 /A(*COMMIT)(B|D)/
+\= Expect no match
     ACABX
 
-/--- Check the use of names for failure ---/
+# Check the use of names for failure
 
-/^(A(*PRUNE:A)B|C(*PRUNE:B)D)/K
-    ** Failers
+/^(A(*PRUNE:A)B|C(*PRUNE:B)D)/mark
+\= Expect no match
     AC
     CB    
     
-/--- Force no study, otherwise mark is not seen. The studied version is in
-     test 2 because it isn't Perl-compatible. ---/
-
-/(*MARK:A)(*SKIP:B)(C|X)/KSS
+/(*MARK:A)(*SKIP:B)(C|X)/mark
     C
+\= Expect no match
     D
      
-/^(A(*THEN:A)B|C(*THEN:B)D)/K
-    ** Failers
+/^(A(*THEN:A)B|C(*THEN:B)D)/mark
+\= Expect no match
     CB    
 
-/^(?:A(*THEN:A)B|C(*THEN:B)D)/K
+/^(?:A(*THEN:A)B|C(*THEN:B)D)/mark
+\= Expect no match
     CB    
     
-/^(?>A(*THEN:A)B|C(*THEN:B)D)/K
+/^(?>A(*THEN:A)B|C(*THEN:B)D)/mark
+\= Expect no match
     CB    
     
-/--- This should succeed, as the skip causes bump to offset 1 (the mark). Note
-that we have to have something complicated such as (B|Z) at the end because,
-for Perl, a simple character somehow causes an unwanted optimization to mess
-with the handling of backtracking verbs. ---/
+# This should succeed, as the skip causes bump to offset 1 (the mark). Note
+# that we have to have something complicated such as (B|Z) at the end because,
+# for Perl, a simple character somehow causes an unwanted optimization to mess
+# with the handling of backtracking verbs.
 
-/A(*MARK:A)A+(*SKIP:A)(B|Z) | AC/xK
+/A(*MARK:A)A+(*SKIP:A)(B|Z) | AC/x,mark
     AAAC
     
-/--- Test skipping over a non-matching mark. ---/
+# Test skipping over a non-matching mark.
 
-/A(*MARK:A)A+(*MARK:B)(*SKIP:A)(B|Z) | AC/xK
+/A(*MARK:A)A+(*MARK:B)(*SKIP:A)(B|Z) | AC/x,mark
     AAAC
     
-/--- Check shorthand for MARK ---/
+# Check shorthand for MARK.
 
-/A(*:A)A+(*SKIP:A)(B|Z) | AC/xK
+/A(*:A)A+(*SKIP:A)(B|Z) | AC/x,mark
     AAAC
 
-/--- Don't loop! Force no study, otherwise mark is not seen. ---/
-
-/(*:A)A+(*SKIP:A)(B|Z)/KSS
+/(*:A)A+(*SKIP:A)(B|Z)/mark
+\= Expect no match
     AAAC
 
-/--- This should succeed, as a non-existent skip name disables the skip ---/ 
+# This should succeed, as a non-existent skip name disables the skip.
 
-/A(*MARK:A)A+(*SKIP:B)(B|Z) | AC/xK
+/A(*MARK:A)A+(*SKIP:B)(B|Z) | AC/x,mark
     AAAC
 
-/A(*MARK:A)A+(*SKIP:B)(B|Z) | AC(*:B)/xK
+/A(*MARK:A)A+(*SKIP:B)(B|Z) | AC(*:B)/x,mark
     AAAC
 
-/--- COMMIT at the start of a pattern should act like an anchor. Again, 
-however, we need the complication for Perl. ---/
+# COMMIT at the start of a pattern should act like an anchor. Again, however,
+# we need the complication for Perl.
 
 /(*COMMIT)(A|P)(B|P)(C|P)/
     ABCDEFG
-    ** Failers
+\= Expect no match
     DEFGABC  
 
-/--- COMMIT inside an atomic group can't stop backtracking over the group. ---/
+# COMMIT inside an atomic group can't stop backtracking over the group.
 
 /(\w+)(?>b(*COMMIT))\w{2}/
     abbb
 
 /(\w+)b(*COMMIT)\w{2}/
+\= Expect no match
     abbb
 
-/--- Check opening parens in comment when seeking forward reference. ---/ 
+# Check opening parens in comment when seeking forward reference.
 
 /(?&t)(?#()(?(DEFINE)(?<t>a))/
     bac
 
-/--- COMMIT should override THEN ---/
+# COMMIT should override THEN.
 
 /(?>(*COMMIT)(?>yes|no)(*THEN)(*F))?/
+\= Expect no match
   yes
 
 /(?>(*COMMIT)(yes|no)(*THEN)(*F))?/
+\= Expect no match
   yes
 
 /b?(*SKIP)c/
@@ -4793,9 +4767,11 @@
     abc
    
 /(*SKIP)bc/
+\= Expect no match
     a
 
 /(*SKIP)b/
+\= Expect no match
     a 
 
 /(?P<abn>(?P=abn)xxx|)+/
@@ -4804,7 +4780,7 @@
 /(?i:([^b]))(?1)/
     aa
     aA     
-    ** Failers
+\= Expect no match
     ab
     aB
     Ba
@@ -4812,7 +4788,7 @@
 
 /^(?&t)*+(?(DEFINE)(?<t>a))\w$/
     aaaaaaX
-    ** Failers 
+\= Expect no match 
     aaaaaa 
 
 /^(?&t)*(?(DEFINE)(?<t>a))\w$/
@@ -4822,24 +4798,24 @@
 /^(a)*+(\w)/
     aaaaX
     YZ 
-    ** Failers 
+\= Expect no match 
     aaaa
 
 /^(?:a)*+(\w)/
     aaaaX
     YZ 
-    ** Failers 
+\= Expect no match 
     aaaa
 
 /^(a)++(\w)/
     aaaaX
-    ** Failers 
+\= Expect no match 
     aaaa
     YZ 
 
 /^(?:a)++(\w)/
     aaaaX
-    ** Failers 
+\= Expect no match 
     aaaa
     YZ 
 
@@ -4853,13 +4829,13 @@
 
 /^(a){2,}+(\w)/
     aaaaX
-    ** Failers
+\= Expect no match
     aaa
     YZ 
 
 /^(?:a){2,}+(\w)/
     aaaaX
-    ** Failers
+\= Expect no match
     aaa
     YZ 
 
@@ -4869,12 +4845,12 @@
     aab  
 
 /(a)++(?1)b/
-    ** Failers
+\= Expect no match
     ab 
     aab
 
 /(a)*+(?1)b/
-    ** Failers
+\= Expect no match
     ab
     aab  
 
@@ -4909,12 +4885,13 @@
     aaaab
     
 /^(a)(?1)++ab/
+\= Expect no match
     aaaab
 
-/^(?=a(*:M))aZ/K
+/^(?=a(*:M))aZ/mark
     aZbc
 
-/^(?!(*:M)b)aZ/K
+/^(?!(*:M)b)aZ/mark
     aZbc
 
 /(?(DEFINE)(a))?b(?1)/
@@ -4942,10 +4919,10 @@
     aaa
 
 /((?(R)a|(?1)))+/
-    aaa
+    aaa 
 
 /a(*:any 
-name)/K
+name)/mark
     abc
     
 /(?>(?&t)c|(?&t))(?(DEFINE)(?<t>a|b(*PRUNE)c))/
@@ -4953,11 +4930,12 @@
     ba
     bba 
     
-/--- Checking revised (*THEN) handling ---/ 
+# Checking revised (*THEN) handling.
 
-/--- Capture ---/
+# Capture
 
 /^.*? (a(*THEN)b) c/x
+\= Expect no match
     aabc
 
 /^.*? (a(*THEN)b|(*F)) c/x
@@ -4967,11 +4945,13 @@
     aabc
 
 /^.*? ( (a(*THEN)b) ) c/x
+\= Expect no match
     aabc
 
-/--- Non-capture ---/
+# Non-capture
 
 /^.*? (?:a(*THEN)b) c/x
+\= Expect no match
     aabc
 
 /^.*? (?:a(*THEN)b|(*F)) c/x
@@ -4981,11 +4961,13 @@
     aabc
 
 /^.*? (?: (?:a(*THEN)b) ) c/x
+\= Expect no match
     aabc
 
-/--- Atomic ---/
+# Atomic
 
 /^.*? (?>a(*THEN)b) c/x
+\= Expect no match
     aabc
 
 /^.*? (?>a(*THEN)b|(*F)) c/x
@@ -4995,11 +4977,13 @@
     aabc
 
 /^.*? (?> (?>a(*THEN)b) ) c/x
+\= Expect no match
     aabc
 
-/--- Possessive capture ---/
+# Possessive capture
 
 /^.*? (a(*THEN)b)++ c/x
+\= Expect no match
     aabc
 
 /^.*? (a(*THEN)b|(*F))++ c/x
@@ -5009,11 +4993,13 @@
     aabc
 
 /^.*? ( (a(*THEN)b)++ )++ c/x
+\= Expect no match
     aabc
 
-/--- Possessive non-capture ---/
+# Possessive non-capture
 
 /^.*? (?:a(*THEN)b)++ c/x
+\= Expect no match
     aabc
 
 /^.*? (?:a(*THEN)b|(*F))++ c/x
@@ -5023,35 +5009,38 @@
     aabc
 
 /^.*? (?: (?:a(*THEN)b)++ )++ c/x
+\= Expect no match
     aabc
     
-/--- Condition assertion ---/
+# Condition assertion
 
 /^(?(?=a(*THEN)b)ab|ac)/
     ac
  
-/--- Condition ---/
+# Condition
 
 /^.*?(?(?=a)a|b(*THEN)c)/
+\= Expect no match
     ba
 
 /^.*?(?:(?(?=a)a|b(*THEN)c)|d)/
     ba
 
 /^.*?(?(?=a)a(*THEN)b|c)/
+\= Expect no match
     ac
 
-/--- Assertion ---/
+# Assertion
 
-/^.*(?=a(*THEN)b)/ 
+/^.*(?=a(*THEN)b)/
     aabc
 
-/------------------------------/
+# --------------------------
 
-/(?>a(*:m))/imsxSK 
+/(?>a(*:m))/imsx,mark
     a
 
-/(?>(a)(*:m))/imsxSK 
+/(?>(a)(*:m))/imsx,mark
     a
 
 /(?<=a(*ACCEPT)b)c/
@@ -5062,14 +5051,14 @@
 
 /(?<=(a(*COMMIT)b))c/
     xabcd
-    ** Failers 
+\= Expect no match 
     xacd
     
 /(?<!a(*FAIL)b)c/
     xcd
     acd 
 
-/(?<=a(*:N)b)c/K
+/(?<=a(*:N)b)c/mark
     xabcd
     
 /(?<=a(*PRUNE)b)c/
@@ -5084,156 +5073,166 @@
 /(a)(?2){2}(.)/
     abcd
 
-/(*MARK:A)(*PRUNE:B)(C|X)/KS
+/(*MARK:A)(*PRUNE:B)(C|X)/mark
     C
+\= Expect no match
     D 
 
-/(*MARK:A)(*PRUNE:B)(C|X)/KSS
+/(*MARK:A)(*PRUNE:B)(C|X)/mark
     C
+\= Expect no match
     D 
 
-/(*MARK:A)(*THEN:B)(C|X)/KS
+/(*MARK:A)(*THEN:B)(C|X)/mark
     C
+\= Expect no match
     D 
 
-/(*MARK:A)(*THEN:B)(C|X)/KSY
+/(*MARK:A)(*THEN:B)(C|X)/mark,no_start_optimize
     C
+\= Expect no match
     D 
 
-/(*MARK:A)(*THEN:B)(C|X)/KSS
+/(*MARK:A)(*THEN:B)(C|X)/mark
     C
+\= Expect no match
     D 
 
-/--- This should fail, as the skip causes a bump to offset 3 (the skip) ---/
+# This should fail, as the skip causes a bump to offset 3 (the skip).
 
-/A(*MARK:A)A+(*SKIP)(B|Z) | AC/xK
+/A(*MARK:A)A+(*SKIP)(B|Z) | AC/x,mark
+\= Expect no match
     AAAC
 
-/--- Same --/
+# Same 
 
-/A(*MARK:A)A+(*MARK:B)(*SKIP:B)(B|Z) | AC/xK
+/A(*MARK:A)A+(*MARK:B)(*SKIP:B)(B|Z) | AC/x,mark
+\= Expect no match
     AAAC
 
-/A(*:A)A+(*SKIP)(B|Z) | AC/xK
+/A(*:A)A+(*SKIP)(B|Z) | AC/x,mark
+\= Expect no match
     AAAC
 
-/--- This should fail, as a null name is the same as no name ---/
+# This should fail, as a null name is the same as no name.
 
-/A(*MARK:A)A+(*SKIP:)(B|Z) | AC/xK
+/A(*MARK:A)A+(*SKIP:)(B|Z) | AC/x,mark
+\= Expect no match
     AAAC
 
-/--- A check on what happens after hitting a mark and them bumping along to
-something that does not even start. Perl reports tags after the failures here, 
-though it does not when the individual letters are made into something 
-more complicated. ---/
+# A check on what happens after hitting a mark and them bumping along to
+# something that does not even start. Perl reports tags after the failures
+# here, though it does not when the individual letters are made into something
+# more complicated.
 
-/A(*:A)B|XX(*:B)Y/K
+/A(*:A)B|XX(*:B)Y/mark
     AABC
     XXYZ 
-    ** Failers
+\= Expect no match
     XAQQ  
     XAQQXZZ  
     AXQQQ 
     AXXQQQ 
     
-/^(A(*THEN:A)B|C(*THEN:B)D)/K
+/^(A(*THEN:A)B|C(*THEN:B)D)/mark
     AB
     CD
-    ** Failers
+\= Expect no match
     AC
     CB    
     
-/^(A(*PRUNE:A)B|C(*PRUNE:B)D)/K
+/^(A(*PRUNE:A)B|C(*PRUNE:B)D)/mark
     AB
     CD
-    ** Failers
+\= Expect no match
     AC
     CB    
     
-/--- An empty name does not pass back an empty string. It is the same as if no
-name were given. ---/ 
+# An empty name does not pass back an empty string. It is the same as if no
+# name were given.
 
-/^(A(*PRUNE:)B|C(*PRUNE:B)D)/K
+/^(A(*PRUNE:)B|C(*PRUNE:B)D)/mark
     AB
     CD 
 
-/--- PRUNE goes to next bumpalong; COMMIT does not. ---/
+# PRUNE goes to next bumpalong; COMMIT does not.
     
-/A(*PRUNE:A)B/K
+/A(*PRUNE:A)B/mark
     ACAB
 
-/--- Mark names can be duplicated ---/
+# Mark names can be duplicated.
 
-/A(*:A)B|X(*:A)Y/K
+/A(*:A)B|X(*:A)Y/mark
     AABC
     XXYZ 
     
-/b(*:m)f|a(*:n)w/K
+/b(*:m)f|a(*:n)w/mark
     aw 
-    ** Failers 
+\= Expect no match 
     abc
 
-/b(*:m)f|aw/K
+/b(*:m)f|aw/mark
     abaw
-    ** Failers 
+\= Expect no match 
     abc
     abax 
 
-/A(*MARK:A)A+(*SKIP:B)(B|Z) | AAC/xK
+/A(*MARK:A)A+(*SKIP:B)(B|Z) | AAC/x,mark
     AAAC
 
-/a(*PRUNE:X)bc|qq/KY
-    ** Failers
+/a(*PRUNE:X)bc|qq/mark,no_start_optimize
+\= Expect no match
     axy
 
-/a(*THEN:X)bc|qq/KY
-    ** Failers
+/a(*THEN:X)bc|qq/mark,no_start_optimize
+\= Expect no match
     axy
 
-/(?=a(*MARK:A)b)..x/K
+/(?=a(*MARK:A)b)..x/mark
     abxy
-    ** Failers
+\= Expect no match
     abpq  
 
-/(?=a(*MARK:A)b)..(*:Y)x/K
+/(?=a(*MARK:A)b)..(*:Y)x/mark
     abxy
-    ** Failers
+\= Expect no match
     abpq  
 
-/(?=a(*PRUNE:A)b)..x/K
+/(?=a(*PRUNE:A)b)..x/mark
     abxy
-    ** Failers
+\= Expect no match
     abpq  
 
-/(?=a(*PRUNE:A)b)..(*:Y)x/K
+/(?=a(*PRUNE:A)b)..(*:Y)x/mark
     abxy
-    ** Failers
+\= Expect no match
     abpq  
 
-/(?=a(*THEN:A)b)..x/K
+/(?=a(*THEN:A)b)..x/mark
     abxy
-    ** Failers
+\= Expect no match
     abpq  
 
-/(?=a(*THEN:A)b)..(*:Y)x/K
+/(?=a(*THEN:A)b)..(*:Y)x/mark
     abxy
-    ** Failers
+\= Expect no match
     abpq  
 
 /(another)?(\1?)test/
     hello world test
 
 /(another)?(\1+)test/
+\= Expect no match
     hello world test
 
 /(a(*COMMIT)b){0}a(?1)|aac/
     aac
 
 /((?:a?)*)*c/
-  aac   
+    aac   
 
 /((?>a?)*)*c/
-  aac   
+    aac   
 
 /(?>.*?a)(?<=ba)/
     aba
@@ -5241,18 +5240,6 @@
 /(?:.*?a)(?<=ba)/
     aba
 
-/.*?a(*PRUNE)b/
-    aab
-
-/.*?a(*PRUNE)b/s
-    aab
-
-/^a(*PRUNE)b/s
-    aab
-
-/.*?a(*SKIP)b/
-    aab
-
 /(?>.*?a)b/s
     aab
 
@@ -5260,6 +5247,7 @@
     aab
 
 /(?>^a)b/s
+\= Expect no match
     aab
 
 /(?>.*?)(?<=(abcd)|(wxyz))/
@@ -5271,6 +5259,7 @@
     endingwxyz 
 
 "(?>.*)foo"
+\= Expect no match
     abcdfooxyz
     
 "(?>.*?)foo"
@@ -5283,33 +5272,33 @@
     ac 
 
 /(?<=(*SKIP)ac)a/
+\= Expect no match
     aa
 
-/A(*MARK:A)A+(*SKIP:B)(B|Z) | AC/xK
+/A(*MARK:A)A+(*SKIP:B)(B|Z) | AC/x,mark
     AAAC
 
-/a(*SKIP:m)x|ac(*:n)(*SKIP:n)d|ac/K
+/a(*SKIP:m)x|ac(*:n)(*SKIP:n)d|ac/mark
     acacd
 
-/A(*SKIP:m)x|A(*SKIP:n)x|AB/K
+/A(*SKIP:m)x|A(*SKIP:n)x|AB/mark
     AB
 
-/((*SKIP:r)d){0}a(*SKIP:m)x|ac(*:n)|ac/K
+/((*SKIP:r)d){0}a(*SKIP:m)x|ac(*:n)|ac/mark
     acacd
 
-/-- Tests that try to figure out how Perl works. My hypothesis is that the
-    first verb that is backtracked onto is the one that acts. This seems to be
-    the case almost all the time, but there is one exception that is perhaps a 
-    bug. --/
+# Tests that try to figure out how Perl works. My hypothesis is that the first
+# verb that is backtracked onto is the one that acts. This seems to be the case
+# almost all the time, but there is one exception that is perhaps a bug.
 
-/-- This matches "aaaac"; each PRUNE advances one character until the subject
-    no longer starts with 5 'a's. --/
+# This matches "aaaac"; each PRUNE advances one character until the subject no
+# longer starts with 5 'a's.
 
 /aaaaa(*PRUNE)b|a+c/
     aaaaaac
 
-/-- Putting SKIP in front of PRUNE makes no difference, as it is never 
-backtracked onto, whether or not it has a label. --/
+# Putting SKIP in front of PRUNE makes no difference, as it is never
+# backtracked onto, whether or not it has a label.
 
 /aaaaa(*SKIP)(*PRUNE)b|a+c/
     aaaaaac
@@ -5320,70 +5309,69 @@
 /aaaa(*:N)a(*SKIP:N)(*PRUNE)b|a+c/
     aaaaaac
 
-/-- Putting THEN in front makes no difference. */
+# Putting THEN in front makes no difference.
     
 /aaaaa(*THEN)(*PRUNE)b|a+c/
     aaaaaac
  
-/-- However, putting COMMIT in front of the prune changes it to "no match". I 
-    think this is inconsistent and possibly a bug. For the moment, running this
-    test is moved out of the Perl-compatible file. --/
+# However, putting COMMIT in front of the prune changes it to "no match". I 
+# think this is inconsistent and possibly a bug. For the moment, running this
+# test is moved out of the Perl-compatible file. 
 
 /aaaaa(*COMMIT)(*PRUNE)b|a+c/
     
+# OK, lets play the same game again using SKIP instead of PRUNE.
 
-/---- OK, lets play the same game again using SKIP instead of PRUNE. ----/
-
-/-- This matches "ac" because SKIP forces the next match to start on the
-    sixth "a". --/
+# This matches "ac" because SKIP forces the next match to start on the
+# sixth "a". 
 
 /aaaaa(*SKIP)b|a+c/
     aaaaaac
  
-/-- Putting PRUNE in front makes no difference. --/
+# Putting PRUNE in front makes no difference. 
 
 /aaaaa(*PRUNE)(*SKIP)b|a+c/
     aaaaaac
 
-/-- Putting THEN in front makes no difference. --/
+# Putting THEN in front makes no difference. 
 
 /aaaaa(*THEN)(*SKIP)b|a+c/
     aaaaaac
 
-/-- In this case, neither does COMMIT. This still matches "ac". --/
+# In this case, neither does COMMIT. This still matches "ac". 
 
 /aaaaa(*COMMIT)(*SKIP)b|a+c/
     aaaaaac
     
-/-- This gives "no match", as expected. --/
+# This gives "no match", as expected. 
 
 /aaaaa(*COMMIT)b|a+c/
+\= Expect no match
     aaaaaac
-    
 
-/------ Tests using THEN ------/
+# ---- Tests using THEN ----
 
-/-- This matches "aaaaaac", as expected. --/
+# This matches "aaaaaac", as expected. 
 
 /aaaaa(*THEN)b|a+c/
     aaaaaac
 
-/-- Putting SKIP in front makes no difference. --/
+# Putting SKIP in front makes no difference. 
 
 /aaaaa(*SKIP)(*THEN)b|a+c/
     aaaaaac
     
-/-- Putting PRUNE in front makes no difference. --/
+# Putting PRUNE in front makes no difference. 
 
 /aaaaa(*PRUNE)(*THEN)b|a+c/
     aaaaaac
     
-/-- Putting COMMIT in front makes no difference. --/
+# Putting COMMIT in front makes no difference. 
 
 /aaaaa(*COMMIT)(*THEN)b|a+c/
     aaaaaac
     
-/-- End of "priority" tests --/ 
+# End of "priority" tests  
 
 /aaaaa(*:m)(*PRUNE:m)(*SKIP:m)m|a+/
     aaaaaa
@@ -5409,7 +5397,7 @@
 /aaa(*MARK:A)a(*SKIP:A)b|a+c/
     aaaac
 
-/a(*:m)a(*COMMIT)(*SKIP:m)b|a+c/K
+/a(*:m)a(*COMMIT)(*SKIP:m)b|a+c/mark
     aaaaaac
 
 /.?(a|b(*THEN)c)/
@@ -5417,6 +5405,7 @@
 
 /(a(*COMMIT)b)c|abd/
     abc
+\= Expect no match
     abd
 
 /(?=a(*COMMIT)b)abc|abd/
@@ -5428,14 +5417,16 @@
     abd
 
 /a(?=b(*COMMIT)c)[^d]|abd/
+    abc
+\= Expect no match
     abd
-    abc 
 
 /a(?=bc).|abd/
     abd
     abc 
     
 /a(?>b(*COMMIT)c)d|abd/
+\= Expect no match
     abceabd 
 
 /a(?>bc)d|abd/
@@ -5445,16 +5436,17 @@
     abd
 
 /(?>a(*COMMIT)c)d|abd/
+\= Expect no match
     abd
 
 /((?=a(*COMMIT)b)ab|ac){0}(?:(?1)|a(c))/
     ac 
     
-/-- These tests were formerly in test 2, but changes in PCRE and Perl have
-    made them compatible. --/
+# These tests were formerly in test 2, but changes in PCRE and Perl have
+# made them compatible. 
     
 /^(a)?(?(1)a|b)+$/
-    *** Failers
+\= Expect no match
     a
 
 /(?=a\Kb)ab/
@@ -5469,76 +5461,91 @@
 /^abc(?<!b\Kq)d/
     abcd
 
-
-/A(*PRUNE:A)A+(*SKIP:A)(B|Z) | AC/xK
+/A(*PRUNE:A)A+(*SKIP:A)(B|Z) | AC/x,mark
+\= Expect no match
     AAAC
 
 /^((abc|abcx)(*THEN)y|abcd)/
     abcd
-    *** Failers 
+\= Expect no match 
     abcxy 
     
 /^((yes|no)(*THEN)(*F))?/
-  yes
+\= Expect no match
+    yes
 
 /(A (.*)   C? (*THEN)  | A D) (*FAIL)/x
-AbcdCBefgBhiBqz
+\= Expect no match
+    AbcdCBefgBhiBqz
 
 /(A (.*)   C? (*THEN)  | A D) z/x
-AbcdCBefgBhiBqz
+\= Expect no match
+    AbcdCBefgBhiBqz
 
 /(A (.*)   C? (*THEN)  | A D) \s* (*FAIL)/x
-AbcdCBefgBhiBqz
+\= Expect no match
+    AbcdCBefgBhiBqz
 
 /(A (.*)   C? (*THEN)  | A D) \s* z/x
-AbcdCBefgBhiBqz
+\= Expect no match
+    AbcdCBefgBhiBqz
 
 /(A (.*)   (?:C|) (*THEN)  | A D) (*FAIL)/x
-AbcdCBefgBhiBqz
+\= Expect no match
+    AbcdCBefgBhiBqz
 
 /(A (.*)   (?:C|) (*THEN)  | A D) z/x
-AbcdCBefgBhiBqz
+\= Expect no match
+    AbcdCBefgBhiBqz
 
 /(A (.*)   C{0,6} (*THEN)  | A D) (*FAIL)/x
-AbcdCBefgBhiBqz
+\= Expect no match
+    AbcdCBefgBhiBqz
 
 /(A (.*)   C{0,6} (*THEN)  | A D) z/x
-AbcdCBefgBhiBqz
+\= Expect no match
+    AbcdCBefgBhiBqz
 
 /(A (.*)   (CE){0,6} (*THEN)  | A D) (*FAIL)/x
-AbcdCEBefgBhiBqz
+\= Expect no match
+    AbcdCEBefgBhiBqz
 
 /(A (.*)   (CE){0,6} (*THEN)  | A D) z/x
-AbcdCEBefgBhiBqz
+\= Expect no match
+    AbcdCEBefgBhiBqz
 
 /(A (.*)   (CE*){0,6} (*THEN)  | A D) (*FAIL)/x
-AbcdCBefgBhiBqz
+\= Expect no match
+    AbcdCBefgBhiBqz
 
 /(A (.*)   (CE*){0,6} (*THEN)  | A D) z/x
-AbcdCBefgBhiBqz
+\= Expect no match
+    AbcdCBefgBhiBqz
 
 /(?=a(*COMMIT)b|ac)ac|ac/
+\= Expect no match
     ac
 
 /(?=a(*COMMIT)b|(ac)) ac | (a)c/x
+\= Expect no match
     ac
 
-/--------/
+# ----
 
 /(?(?!b(*THEN)a)bn|bnn)/
-   bnn 
+    bnn 
 
 /(?!b(*SKIP)a)bn|bnn/
     bnn
     
 /(?(?!b(*SKIP)a)bn|bnn)/
-   bnn 
+    bnn 
 
 /(?!b(*PRUNE)a)bn|bnn/
     bnn
     
 /(?(?!b(*PRUNE)a)bn|bnn)/
-   bnn 
+    bnn 
    
 /(?!b(*COMMIT)a)bn|bnn/
     bnn
@@ -5547,31 +5554,32 @@
    bnn 
 
 /(?=b(*SKIP)a)bn|bnn/
+\= Expect no match
     bnn
 
 /(?=b(*THEN)a)bn|bnn/
     bnn
     
- /^(?!a(*SKIP)b)/
-     ac
+/^(?!a(*SKIP)b)/
+    ac
 
- /^(?!a(*SKIP)b)../
-     acd
+/^(?!a(*SKIP)b)../
+    acd
 
 /(?!a(*SKIP)b)../
-     acd
+    acd
 
 /^(?(?!a(*SKIP)b))/
-     ac
+    ac
 
 /^(?!a(*PRUNE)b)../
-     acd
+    acd
 
 /(?!a(*PRUNE)b)../
-     acd
+    acd
 
- /(?!a(*COMMIT)b)ac|cd/
-     ac
+/(?!a(*COMMIT)b)ac|cd/
+    ac
 
 /\A.*?(?:a|bc)/
     ba
@@ -5579,57 +5587,58 @@
 /^(A(*THEN)B|C(*THEN)D)/
     CD           
 
-/(*:m(m)(?&y)(?(DEFINE)(?<y>b))/K
+/(*:m(m)(?&y)(?(DEFINE)(?<y>b))/mark
     abc
 
-/(*PRUNE:m(m)(?&y)(?(DEFINE)(?<y>b))/K
+/(*PRUNE:m(m)(?&y)(?(DEFINE)(?<y>b))/mark
     abc
 
-/(*SKIP:m(m)(?&y)(?(DEFINE)(?<y>b))/K
+/(*SKIP:m(m)(?&y)(?(DEFINE)(?<y>b))/mark
     abc
 
-/(*THEN:m(m)(?&y)(?(DEFINE)(?<y>b))/K
+/(*THEN:m(m)(?&y)(?(DEFINE)(?<y>b))/mark
     abc
 
 /^\d*\w{4}/
     1234
+\= Expect no match
     123 
 
 /^[^b]*\w{4}/
     aaaa
+\= Expect no match
     aaa     
 
 /^[^b]*\w{4}/i
     aaaa
+\= Expect no match
     aaa     
 
 /^a*\w{4}/
     aaaa
+\= Expect no match
     aaa     
 
 /^a*\w{4}/i
     aaaa
+\= Expect no match
     aaa     
 
-/(?(?=ab)ab)/+
-    ca
-    cd 
-
-/(?:(?<n>foo)|(?<n>bar))\k<n>/J
+/(?:(?<n>foo)|(?<n>bar))\k<n>/dupnames
     foofoo
     barbar
 
-/(?<n>A)(?:(?<n>foo)|(?<n>bar))\k<n>/J
+/(?<n>A)(?:(?<n>foo)|(?<n>bar))\k<n>/dupnames
     AfooA
     AbarA  
-    ** Failers 
+\= Expect no match 
     Afoofoo
     Abarbar
 
 /^(\d+)\s+IN\s+SOA\s+(\S+)\s+(\S+)\s*\(\s*$/
     1 IN SOA non-sp1 non-sp2(
 
-/^ (?:(?<A>A)|(?'B'B)(?<A>A)) (?('A')x) (?(<B>)y)$/xJ
+/^ (?:(?<A>A)|(?'B'B)(?<A>A)) (?('A')x) (?(<B>)y)$/x,dupnames
     Ax
     BAxy 
     
@@ -5657,22 +5666,23 @@
 / ^ ( a + ) + + \w $ /x
     aaaab 
 
-/(?:a\Kb)*+/+
+/(?:a\Kb)*+/aftertext
     ababc
 
-/(?>a\Kb)*/+
+/(?>a\Kb)*/aftertext
     ababc
 
-/(?:a\Kb)*/+
+/(?:a\Kb)*/aftertext
     ababc
 
-/(a\Kb)*+/+
+/(a\Kb)*+/aftertext
     ababc
 
-/(a\Kb)*/+
+/(a\Kb)*/aftertext
     ababc
 
 /(?:x|(?:(xx|yy)+|x|x|x|x|x)|a|a|a)bc/
+\= Expect no match
     acb
 
 '\A(?:[^\"]++|\"(?:[^\"]*+|\"\")*+\")++'
@@ -5688,21 +5698,22 @@
     NON QUOTED \"QUOT\"\"ED\" AFTER \"NOT MATCHED
 
 /^\w+(?>\s*)(?<=\w)/
-  test test
+    test test
 
-/(?P<same>a)(?P<same>b)/gJ
+/(?P<same>a)(?P<same>b)/g,dupnames
     abbaba
 
-/(?P<same>a)(?P<same>b)(?P=same)/gJ
+/(?P<same>a)(?P<same>b)(?P=same)/g,dupnames
     abbaba
 
-/(?P=same)?(?P<same>a)(?P<same>b)/gJ
+/(?P=same)?(?P<same>a)(?P<same>b)/g,dupnames
     abbaba
 
-/(?:(?P=same)?(?:(?P<same>a)|(?P<same>b))(?P=same))+/gJ
+/(?:(?P=same)?(?:(?P<same>a)|(?P<same>b))(?P=same))+/g,dupnames
     bbbaaabaabb
 
-/(?:(?P=same)?(?:(?P=same)(?P<same>a)(?P=same)|(?P=same)?(?P<same>b)(?P=same)){2}(?P=same)(?P<same>c)(?P=same)){2}(?P<same>z)?/gJ
+/(?:(?P=same)?(?:(?P=same)(?P<same>a)(?P=same)|(?P=same)?(?P<same>b)(?P=same)){2}(?P=same)(?P<same>c)(?P=same)){2}(?P<same>z)?/g,dupnames
+\= Expect no match
     bbbaaaccccaaabbbcc
 
 /(?P<Name>a)?(?P<Name2>b)?(?(<Name>)c|d)*l/
@@ -5720,9 +5731,26 @@
 /[\Q]a\E]+/
     aa]]
 
+/A((((((((a))))))))\8B/ 
+    AaaB
+
+/A(((((((((a)))))))))\9B/ 
+    AaaB
+    
+/A[\8\9]B/
+    A8B
+    A9B  
+
+/(|ab)*?d/
+   abd
+   xyd 
+
 /(?:((abcd))|(((?:(?:(?:(?:abc|(?:abcdef))))b)abcdefghi)abc)|((*ACCEPT)))/
     1234abcd
 
+/(\2|a)(\1)/
+    aaa
+
 /(\2)(\1)/
 
 "Z*(|d*){216}"
@@ -5730,7 +5758,38 @@
 "(?1)(?#?'){8}(a)"
     baaaaaaaaac
 
+/((((((((((((x))))))))))))\12/
+    xx
+
+/A[\8]B[\9]C/
+    A8B9C
+
+/(?1)()((((((\1++))\x85)+)|))/
+    \x85\x85
+
 "(?|(\k'Pm')|(?'Pm'))"
     abcd
 
-/-- End of testinput1 --/
+/(?|(aaa)|(b))\g{1}/
+    aaaaaa
+    bb 
+
+/(?|(aaa)|(b))(?1)/
+    aaaaaa
+    baaa 
+\= Expect no match 
+    bb 
+
+/(?|(aaa)|(b))/
+    xaaa
+    xbc 
+
+/(?|(?'a'aaa)|(?'a'b))\k'a'/
+    aaaaaa
+    bb 
+
+/(?|(?'a'aaa)|(?'a'b))(?'a'cccc)\k'a'/dupnames
+    aaaccccaaa
+    bccccb 
+
+# End of testinput1 
diff --git a/dist2/testdata/testinput10 b/dist2/testdata/testinput10
new file mode 100644
index 0000000..550e1c9
--- /dev/null
+++ b/dist2/testdata/testinput10
@@ -0,0 +1,448 @@
+# This set of tests is for UTF-8 support and Unicode property support, with
+# relevance only for the 8-bit library.
+
+# The next 4 patterns have UTF-8 errors
+
+/[Ã]/utf
+
+/Ã/utf
+
+/ÃÃÃxxx/utf
+
+/‚‚‚‚‚‚‚Ã/utf
+
+# Now test subjects
+
+/badutf/utf
+\= Expect UTF-8 errors
+    X\xdf
+    XX\xef
+    XXX\xef\x80
+    X\xf7
+    XX\xf7\x80
+    XXX\xf7\x80\x80
+    \xfb
+    \xfb\x80
+    \xfb\x80\x80
+    \xfb\x80\x80\x80
+    \xfd
+    \xfd\x80
+    \xfd\x80\x80
+    \xfd\x80\x80\x80
+    \xfd\x80\x80\x80\x80
+    \xdf\x7f
+    \xef\x7f\x80
+    \xef\x80\x7f
+    \xf7\x7f\x80\x80
+    \xf7\x80\x7f\x80
+    \xf7\x80\x80\x7f
+    \xfb\x7f\x80\x80\x80
+    \xfb\x80\x7f\x80\x80
+    \xfb\x80\x80\x7f\x80
+    \xfb\x80\x80\x80\x7f
+    \xfd\x7f\x80\x80\x80\x80
+    \xfd\x80\x7f\x80\x80\x80
+    \xfd\x80\x80\x7f\x80\x80
+    \xfd\x80\x80\x80\x7f\x80
+    \xfd\x80\x80\x80\x80\x7f
+    \xed\xa0\x80
+    \xc0\x8f
+    \xe0\x80\x8f
+    \xf0\x80\x80\x8f
+    \xf8\x80\x80\x80\x8f
+    \xfc\x80\x80\x80\x80\x8f
+    \x80
+    \xfe
+    \xff
+
+/badutf/utf
+\= Expect UTF-8 errors
+    XX\xfb\x80\x80\x80\x80
+    XX\xfd\x80\x80\x80\x80\x80
+    XX\xf7\xbf\xbf\xbf
+
+/shortutf/utf
+\= Expect UTF-8 errors
+    XX\xdf\=ph
+    XX\xef\=ph
+    XX\xef\x80\=ph
+    \xf7\=ph
+    \xf7\x80\=ph
+    \xf7\x80\x80\=ph
+    \xfb\=ph
+    \xfb\x80\=ph
+    \xfb\x80\x80\=ph
+    \xfb\x80\x80\x80\=ph
+    \xfd\=ph
+    \xfd\x80\=ph
+    \xfd\x80\x80\=ph
+    \xfd\x80\x80\x80\=ph
+    \xfd\x80\x80\x80\x80\=ph
+
+/anything/utf
+\= Expect UTF-8 errors
+    X\xc0\x80
+    XX\xc1\x8f
+    XXX\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
+    \xf8\x88\x80\x80\x80
+    \xf9\x87\x80\x80\x80
+    \xfc\x84\x80\x80\x80\x80
+    \xfd\x83\x80\x80\x80\x80
+\= Expect no match
+    \xc3\x8f
+    \xe0\xaf\x80
+    \xe1\x80\x80
+    \xf0\x9f\x80\x80
+    \xf1\x8f\x80\x80
+    \xf8\x88\x80\x80\x80\=no_utf_check
+    \xf9\x87\x80\x80\x80\=no_utf_check
+    \xfc\x84\x80\x80\x80\x80\=no_utf_check
+    \xfd\x83\x80\x80\x80\x80\=no_utf_check
+    
+# Similar tests with offsets
+
+/badutf/utf
+\= Expect UTF-8 errors
+    X\xdfabcd
+    X\xdfabcd\=offset=1
+\= Expect no match
+    X\xdfabcd\=offset=2
+
+/(?<=x)badutf/utf
+\= Expect UTF-8 errors
+    X\xdfabcd
+    X\xdfabcd\=offset=1
+    X\xdfabcd\=offset=2
+    X\xdfabcd\xdf\=offset=3
+\= Expect no match
+    X\xdfabcd\=offset=3
+
+/(?<=xx)badutf/utf
+\= Expect UTF-8 errors
+    X\xdfabcd
+    X\xdfabcd\=offset=1
+    X\xdfabcd\=offset=2
+    X\xdfabcd\=offset=3
+
+/(?<=xxxx)badutf/utf
+\= Expect UTF-8 errors
+    X\xdfabcd
+    X\xdfabcd\=offset=1
+    X\xdfabcd\=offset=2
+    X\xdfabcd\=offset=3
+    X\xdfabc\xdf\=offset=6
+    X\xdfabc\xdf\=offset=7
+\= Expect no match
+    X\xdfabcd\=offset=6
+ 
+/\x{100}/IB,utf
+
+/\x{1000}/IB,utf
+
+/\x{10000}/IB,utf
+
+/\x{100000}/IB,utf
+
+/\x{10ffff}/IB,utf
+
+/[\x{ff}]/IB,utf
+
+/[\x{100}]/IB,utf
+
+/\x80/IB,utf
+
+/\xff/IB,utf
+
+/\x{D55c}\x{ad6d}\x{C5B4}/IB,utf
+    \x{D55c}\x{ad6d}\x{C5B4}
+
+/\x{65e5}\x{672c}\x{8a9e}/IB,utf
+    \x{65e5}\x{672c}\x{8a9e}
+
+/\x{80}/IB,utf
+
+/\x{084}/IB,utf
+
+/\x{104}/IB,utf
+
+/\x{861}/IB,utf
+
+/\x{212ab}/IB,utf
+
+/[^ab\xC0-\xF0]/IB,utf
+    \x{f1}
+    \x{bf}
+    \x{100}
+    \x{1000}
+\= Expect no match
+    \x{c0}
+    \x{f0}
+
+/Ā{3,4}/IB,utf
+  \x{100}\x{100}\x{100}\x{100\x{100}
+
+/(\x{100}+|x)/IB,utf
+
+/(\x{100}*a|x)/IB,utf
+
+/(\x{100}{0,2}a|x)/IB,utf
+
+/(\x{100}{1,2}a|x)/IB,utf
+
+/\x{100}/IB,utf
+
+/a\x{100}\x{101}*/IB,utf
+
+/a\x{100}\x{101}+/IB,utf
+
+/[^\x{c4}]/IB
+
+/[\x{100}]/IB,utf
+    \x{100}
+    Z\x{100}
+    \x{100}Z
+
+/[\xff]/IB,utf
+    >\x{ff}<
+
+/[^\xff]/IB,utf
+
+/\x{100}abc(xyz(?1))/IB,utf
+
+/\777/I,utf
+  \x{1ff}
+  \777
+
+/\x{100}+\x{200}/IB,utf
+
+/\x{100}+X/IB,utf
+
+/^[\QĀ\E-\QŐ\E/B,utf
+
+# This tests the stricter UTF-8 check according to RFC 3629.
+
+/X/utf
+\= Expect UTF-8 errors
+    \x{d800}
+    \x{da00}
+    \x{dfff}
+    \x{110000}
+    \x{2000000}
+    \x{7fffffff}
+\= Expect no match
+    \x{d800}\=no_utf_check
+    \x{da00}\=no_utf_check
+    \x{dfff}\=no_utf_check
+    \x{110000}\=no_utf_check
+    \x{2000000}\=no_utf_check
+    \x{7fffffff}\=no_utf_check
+
+/(*UTF8)\x{1234}/
+    abcd\x{1234}pqr
+
+/(*CRLF)(*UTF)(*BSR_UNICODE)a\Rb/I
+
+/\h/I,utf
+    ABC\x{09}
+    ABC\x{20}
+    ABC\x{a0}
+    ABC\x{1680}
+    ABC\x{180e}
+    ABC\x{2000}
+    ABC\x{202f}
+    ABC\x{205f}
+    ABC\x{3000}
+
+/\v/I,utf
+    ABC\x{0a}
+    ABC\x{0b}
+    ABC\x{0c}
+    ABC\x{0d}
+    ABC\x{85}
+    ABC\x{2028}
+
+/\h*A/I,utf
+    CDBABC
+
+/\v+A/I,utf
+
+/\s?xxx\s/I,utf
+
+/\sxxx\s/I,utf,tables=2
+    AB\x{85}xxx\x{a0}XYZ
+    AB\x{a0}xxx\x{85}XYZ
+
+/\S \S/I,utf,tables=2
+    \x{a2} \x{84}
+    A Z
+
+/a+/utf
+    a\x{123}aa\=offset=1
+    a\x{123}aa\=offset=3
+    a\x{123}aa\=offset=4
+\= Expect bad offset value
+    a\x{123}aa\=offset=6
+\= Expect bad UTF-8 offset     
+    a\x{123}aa\=offset=2
+\= Expect no match
+    a\x{123}aa\=offset=5
+
+/\x{1234}+/Ii,utf
+
+/\x{1234}+?/Ii,utf
+
+/\x{1234}++/Ii,utf
+
+/\x{1234}{2}/Ii,utf
+
+/[^\x{c4}]/IB,utf
+
+/X+\x{200}/IB,utf
+
+/\R/I,utf
+
+/\777/IB,utf
+
+/\w+\x{C4}/B,utf
+    a\x{C4}\x{C4}
+
+/\w+\x{C4}/B,utf,tables=2
+    a\x{C4}\x{C4}
+
+/\W+\x{C4}/B,utf
+    !\x{C4}
+
+/\W+\x{C4}/B,utf,tables=2
+    !\x{C4}
+
+/\W+\x{A1}/B,utf
+    !\x{A1}
+
+/\W+\x{A1}/B,utf,tables=2
+    !\x{A1}
+
+/X\s+\x{A0}/B,utf
+    X\x20\x{A0}\x{A0}
+
+/X\s+\x{A0}/B,utf,tables=2
+    X\x20\x{A0}\x{A0}
+
+/\S+\x{A0}/B,utf
+    X\x{A0}\x{A0}
+
+/\S+\x{A0}/B,utf,tables=2
+    X\x{A0}\x{A0}
+
+/\x{a0}+\s!/B,utf
+    \x{a0}\x20!
+
+/\x{a0}+\s!/B,utf,tables=2
+    \x{a0}\x20!
+
+/A/utf
+  \x{ff000041}
+  \x{7f000041}
+
+/(*UTF8)abc/never_utf
+
+/abc/utf,never_utf
+
+/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/IBi,utf
+
+/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/IB,utf
+
+/AB\x{1fb0}/IB,utf
+
+/AB\x{1fb0}/IBi,utf
+
+/\x{401}\x{420}\x{421}\x{422}\x{423}\x{424}\x{425}\x{426}\x{427}\x{428}\x{429}\x{42a}\x{42b}\x{42c}\x{42d}\x{42e}\x{42f}/Ii,utf
+    \x{401}\x{420}\x{421}\x{422}\x{423}\x{424}\x{425}\x{426}\x{427}\x{428}\x{429}\x{42a}\x{42b}\x{42c}\x{42d}\x{42e}\x{42f}
+    \x{451}\x{440}\x{441}\x{442}\x{443}\x{444}\x{445}\x{446}\x{447}\x{448}\x{449}\x{44a}\x{44b}\x{44c}\x{44d}\x{44e}\x{44f}
+
+/[ⱥ]/Bi,utf
+
+/[^ⱥ]/Bi,utf
+
+/\h/I
+
+/\v/I
+
+/\R/I
+
+/[[:blank:]]/B,ucp
+
+/\x{212a}+/Ii,utf
+    KKkk\x{212a}
+
+/s+/Ii,utf
+    SSss\x{17f}
+
+/\x{100}*A/IB,utf
+    A
+
+/\x{100}*\d(?R)/IB,utf
+
+/[Z\x{100}]/IB,utf
+    Z\x{100}
+    \x{100}
+    \x{100}Z
+
+/[z-\x{100}]/IB,utf
+
+/[z\Qa-d]Ā\E]/IB,utf
+    \x{100}
+    Ā 
+
+/[ab\x{100}]abc(xyz(?1))/IB,utf
+
+/\x{100}*\s/IB,utf
+
+/\x{100}*\d/IB,utf
+
+/\x{100}*\w/IB,utf
+
+/\x{100}*\D/IB,utf
+
+/\x{100}*\S/IB,utf
+
+/\x{100}*\W/IB,utf
+
+/[\x{105}-\x{109}]/IBi,utf
+    \x{104}
+    \x{105}
+    \x{109}  
+\= Expect no match
+    \x{100}
+    \x{10a} 
+    
+/[z-\x{100}]/IBi,utf
+    Z
+    z
+    \x{39c}
+    \x{178}
+    |
+    \x{80}
+    \x{ff}
+    \x{100}
+    \x{101} 
+\= Expect no match
+    \x{102}
+    Y
+    y           
+
+/[z-\x{100}]/IBi,utf
+
+/\x{3a3}B/IBi,utf
+
+/abc/utf,replace=Ã
+    abc
+
+/(?<=(a)(?-1))x/I,utf
+    a\x80zx\=offset=3
+
+# End of testinput10
diff --git a/dist/testdata/testinput14 b/dist2/testdata/testinput11
similarity index 77%
copy from dist/testdata/testinput14
copy to dist2/testdata/testinput11
index 192b8d6..2bdef9b 100644
--- a/dist/testdata/testinput14
+++ b/dist2/testdata/testinput11
@@ -1,99 +1,15 @@
-/-- This set of tests is run only with the 8-bit library. They do not require 
-    UTF-8 or Unicode property support. The file starts with all the tests of
-    the POSIX interface, because that is supported only with the 8-bit library.
-    --/
+# This set of tests is for the 16-bit and 32-bit libraries' basic (non-UTF)
+# features that are not compatible with the 8-bit library, or which give
+# different output in 16-bit or 32-bit mode. The output for the two widths is
+# different, so they have separate output files.
     
-< forbid 8W 
+#forbid_utf
+#newline_default LF ANY ANYCRLF
 
-/abc/P
-    abc
-    *** Failers
-
-/^abc|def/P
-    abcdef
-    abcdef\B
-
-/.*((abc)$|(def))/P
-    defabc
-    \Zdefabc
-
-/the quick brown fox/P
-    the quick brown fox
-    *** Failers
-    The Quick Brown Fox
-
-/the quick brown fox/Pi
-    the quick brown fox
-    The Quick Brown Fox
-
-/abc.def/P
-    *** Failers
-    abc\ndef
-
-/abc$/P
-    abc
-    abc\n
-
-/(abc)\2/P
-
-/(abc\1)/P
-    abc
-
-/a*(b+)(z)(z)/P
-    aaaabbbbzzzz
-    aaaabbbbzzzz\O0
-    aaaabbbbzzzz\O1
-    aaaabbbbzzzz\O2
-    aaaabbbbzzzz\O3
-    aaaabbbbzzzz\O4
-    aaaabbbbzzzz\O5
-
-/ab.cd/P
-    ab-cd
-    ab=cd
-    ** Failers
-    ab\ncd
-
-/ab.cd/Ps
-    ab-cd
-    ab=cd
-    ab\ncd
-
-/a(b)c/PN
-    abc
-
-/a(?P<name>b)c/PN
-    abc
-
-/a?|b?/P
-    abc
-    ** Failers
-    ddd\N   
-
-/\w+A/P
-   CDAAAAB 
-
-/\w+A/PU
-   CDAAAAB 
-   
-/\Biss\B/I+P
-    Mississippi
-
-/abc/\P
-
-/-- End of POSIX tests --/ 
-
-/a\Cb/
-    aXb
-    a\nb
-    ** Failers (too big char) 
-    A\x{123}B 
-    A\o{443}B 
+/[^\x{c4}]/IB
   
 /\x{100}/I
 
-/\o{400}/I
-
 /  (?: [\040\t] |  \(
 (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
 \)  )*                          # optional leading comment
@@ -287,59 +203,154 @@
 )  (?: [\040\t] |  \(
 (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
 \)  )*                       # optional trailing comment
-/xSI
+/Ix
 
-/-- Although this saved pattern was compiled with link-size=2, it does no harm
-to run this test with other link sizes because it is going to generated a
-"compiled in wrong mode" error as soon as it is loaded, so the link size does 
-not matter. --/
-
-<!testsaved16
-
-<!testsaved32
-
-/\h/SI
-
-/\H/SI
-
-/\v/SI
-
-/\V/SI
-
-/\R/SI
-
-/[\h]/BZ
+/[\h]/B
     >\x09<
 
-/[\h]+/BZ
+/[\h]+/B
     >\x09\x20\xa0<
 
-/[\v]/BZ
+/[\v]/B
 
-/[\H]/BZ
+/[^\h]/B
 
-/[^\h]/BZ
+/\h+/I
+    \x{1681}\x{200b}\x{1680}\x{2000}\x{202f}\x{3000}
+    \x{3001}\x{2fff}\x{200a}\xa0\x{2000}
 
-/[\V]/BZ
+/[\h\x{dc00}]+/IB
+    \x{1681}\x{200b}\x{1680}\x{2000}\x{202f}\x{3000}
+    \x{3001}\x{2fff}\x{200a}\xa0\x{2000}
 
-/[\x0a\V]/BZ
+/\H+/I
+    \x{1680}\x{180e}\x{167f}\x{1681}\x{180d}\x{180f}
+    \x{2000}\x{200a}\x{1fff}\x{200b}
+    \x{202f}\x{205f}\x{202e}\x{2030}\x{205e}\x{2060}
+    \xa0\x{3000}\x9f\xa1\x{2fff}\x{3001}
 
-/\777/I
+/[\H\x{d800}]+/
+    \x{1680}\x{180e}\x{167f}\x{1681}\x{180d}\x{180f}
+    \x{2000}\x{200a}\x{1fff}\x{200b}
+    \x{202f}\x{205f}\x{202e}\x{2030}\x{205e}\x{2060}
+    \xa0\x{3000}\x9f\xa1\x{2fff}\x{3001}
 
-/(*:0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF)XX/K
+/\v+/I
+    \x{2027}\x{2030}\x{2028}\x{2029}
+    \x09\x0e\x84\x86\x85\x0a\x0b\x0c\x0d
+
+/[\v\x{dc00}]+/IB
+    \x{2027}\x{2030}\x{2028}\x{2029}
+    \x09\x0e\x84\x86\x85\x0a\x0b\x0c\x0d
+
+/\V+/I
+    \x{2028}\x{2029}\x{2027}\x{2030}
+    \x85\x0a\x0b\x0c\x0d\x09\x0e\x84\x86
+
+/[\V\x{d800}]+/
+    \x{2028}\x{2029}\x{2027}\x{2030}
+    \x85\x0a\x0b\x0c\x0d\x09\x0e\x84\x86
+
+/\R+/I,bsr=unicode
+    \x{2027}\x{2030}\x{2028}\x{2029}
+    \x09\x0e\x84\x86\x85\x0a\x0b\x0c\x0d
+
+/\x{d800}\x{d7ff}\x{dc00}\x{dc00}\x{dcff}\x{dd00}/I
+    \x{d800}\x{d7ff}\x{dc00}\x{dc00}\x{dcff}\x{dd00}
+
+/[^\x{80}][^\x{ff}][^\x{100}][^\x{1000}][^\x{ffff}]/B
+
+/[^\x{80}][^\x{ff}][^\x{100}][^\x{1000}][^\x{ffff}]/Bi
+
+/[^\x{100}]*[^\x{1000}]+[^\x{ffff}]??[^\x{8000}]{4,}[^\x{7fff}]{2,9}?[^\x{100}]{5,6}+/B
+
+/[^\x{100}]*[^\x{1000}]+[^\x{ffff}]??[^\x{8000}]{4,}[^\x{7fff}]{2,9}?[^\x{100}]{5,6}+/Bi
+
+/(*:0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF)XX/mark
     XX
      
-/(*:0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDE)XX/K
+/(*:0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDE)XX/mark
     XX
 
-/\u0100/<JS>
+/\u0100/B,alt_bsux,allow_empty_class,match_unset_backref
 
-/[\u0100-\u0200]/<JS>
+/[\u0100-\u0200]/B,alt_bsux,allow_empty_class,match_unset_backref
 
-/[^\x00-a]{12,}[^b-\xff]*/BZ
+/\ud800/B,alt_bsux,allow_empty_class,match_unset_backref
 
-/[^\s]*\s* [^\W]+\W+ [^\d]*?\d0 [^\d\w]{4,6}?\w*A/BZ
+/^\x{ffff}+/i
+    \x{ffff}
 
-/(?'ABC'[bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar](*THEN:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))/
+/^\x{ffff}?/i
+    \x{ffff}
 
-/-- End of testinput14 --/
+/^\x{ffff}*/i
+    \x{ffff}
+
+/^\x{ffff}{3}/i
+    \x{ffff}\x{ffff}\x{ffff}
+
+/^\x{ffff}{0,3}/i
+    \x{ffff}
+
+/[^\x00-a]{12,}[^b-\xff]*/B
+
+/[^\s]*\s* [^\W]+\W+ [^\d]*?\d0 [^\d\w]{4,6}?\w*A/B
+
+/a*[b-\x{200}]?a#a*[b-\x{200}]?b#[a-f]*[g-\x{200}]*#[g-\x{200}]*[a-c]*#[g-\x{200}]*[a-h]*/B
+
+/^[\x{1234}\x{4321}]{2,4}?/
+    \x{1234}\x{1234}\x{1234}
+
+# Check maximum non-UTF character size for the 16-bit library.
+
+/\x{ffff}/
+    A\x{ffff}B
+
+/\x{10000}/
+
+/\o{20000}/
+
+# Check maximum character size for the 32-bit library. These will all give
+# errors in the 16-bit library.
+
+/\x{110000}/
+
+/\x{7fffffff}/
+
+/\x{80000000}/
+
+/\x{ffffffff}/
+
+/\x{100000000}/
+
+/\o{17777777777}/
+
+/\o{20000000000}/
+
+/\o{37777777777}/
+
+/\o{40000000000}/
+
+/\x{7fffffff}\x{7fffffff}/I
+
+/\x{80000000}\x{80000000}/I
+
+/\x{ffffffff}\x{ffffffff}/I
+
+# Non-UTF characters 
+
+/.{2,3}/
+    \x{400000}\x{400001}\x{400002}\x{400003}
+
+/\x{400000}\x{800000}/IBi
+
+# Check character ranges 
+
+/[\H]/IB
+
+/[\V]/IB
+
+/(*THEN:\[A]{65501})/expand
+
+# End of testinput11
diff --git a/dist2/testdata/testinput12 b/dist2/testdata/testinput12
new file mode 100644
index 0000000..14a7715
--- /dev/null
+++ b/dist2/testdata/testinput12
@@ -0,0 +1,346 @@
+# This set of tests is for UTF-16 and UTF-32 support, including Unicode
+# properties. It is relevant only to the 16-bit and 32-bit libraries. The
+# output is different for each library, so there are separate output files.
+
+/ÃÃÃxxx/IB,utf,no_utf_check
+
+/abc/utf
+    Ã]
+
+# Check maximum character size 
+
+/\x{ffff}/IB,utf
+
+/\x{10000}/IB,utf
+
+/\x{100}/IB,utf
+
+/\x{1000}/IB,utf
+
+/\x{10000}/IB,utf
+
+/\x{100000}/IB,utf
+
+/\x{10ffff}/IB,utf
+
+/[\x{ff}]/IB,utf
+
+/[\x{100}]/IB,utf
+
+/\x80/IB,utf
+
+/\xff/IB,utf
+
+/\x{D55c}\x{ad6d}\x{C5B4}/IB,utf
+    \x{D55c}\x{ad6d}\x{C5B4}
+
+/\x{65e5}\x{672c}\x{8a9e}/IB,utf
+    \x{65e5}\x{672c}\x{8a9e}
+
+/\x{80}/IB,utf
+
+/\x{084}/IB,utf
+
+/\x{104}/IB,utf
+
+/\x{861}/IB,utf
+
+/\x{212ab}/IB,utf
+
+/[^ab\xC0-\xF0]/IB,utf
+    \x{f1}
+    \x{bf}
+    \x{100}
+    \x{1000}
+\= Expect no match
+    \x{c0}
+    \x{f0}
+
+/Ā{3,4}/IB,utf
+  \x{100}\x{100}\x{100}\x{100\x{100}
+
+/(\x{100}+|x)/IB,utf
+
+/(\x{100}*a|x)/IB,utf
+
+/(\x{100}{0,2}a|x)/IB,utf
+
+/(\x{100}{1,2}a|x)/IB,utf
+
+/\x{100}/IB,utf
+
+/a\x{100}\x{101}*/IB,utf
+
+/a\x{100}\x{101}+/IB,utf
+
+/[^\x{c4}]/IB
+
+/[\x{100}]/IB,utf
+    \x{100}
+    Z\x{100}
+    \x{100}Z
+
+/[\xff]/IB,utf
+    >\x{ff}<
+
+/[^\xff]/IB,utf
+
+/\x{100}abc(xyz(?1))/IB,utf
+
+/\777/I,utf
+  \x{1ff}
+  \777
+
+/\x{100}+\x{200}/IB,utf
+
+/\x{100}+X/IB,utf
+
+/^[\QĀ\E-\QŐ\E/B,utf
+
+/X/utf
+    XX\x{d800}\=no_utf_check
+    XX\x{da00}\=no_utf_check
+    XX\x{dc00}\=no_utf_check
+    XX\x{de00}\=no_utf_check
+    XX\x{dfff}\=no_utf_check
+\= Expect UTF error
+    XX\x{d800}
+    XX\x{da00}
+    XX\x{dc00}
+    XX\x{de00}
+    XX\x{dfff}
+    XX\x{110000}
+    XX\x{d800}\x{1234}
+\= Expect no match
+    XX\x{d800}\=offset=3
+    
+/(?<=.)X/utf
+    XX\x{d800}\=offset=3
+
+/(*UTF16)\x{11234}/
+  abcd\x{11234}pqr
+
+/(*UTF)\x{11234}/I
+  abcd\x{11234}pqr
+
+/(*UTF-32)\x{11234}/
+  abcd\x{11234}pqr
+
+/(*UTF-32)\x{112}/
+  abcd\x{11234}pqr
+
+/(*CRLF)(*UTF16)(*BSR_UNICODE)a\Rb/I
+
+/(*CRLF)(*UTF32)(*BSR_UNICODE)a\Rb/I
+
+/\h/I,utf
+    ABC\x{09}
+    ABC\x{20}
+    ABC\x{a0}
+    ABC\x{1680}
+    ABC\x{180e}
+    ABC\x{2000}
+    ABC\x{202f}
+    ABC\x{205f}
+    ABC\x{3000}
+
+/\v/I,utf
+    ABC\x{0a}
+    ABC\x{0b}
+    ABC\x{0c}
+    ABC\x{0d}
+    ABC\x{85}
+    ABC\x{2028}
+
+/\h*A/I,utf
+    CDBABC
+    \x{2000}ABC
+
+/\R*A/I,bsr=unicode,utf
+    CDBABC
+    \x{2028}A
+
+/\v+A/I,utf
+
+/\s?xxx\s/I,utf
+
+/\sxxx\s/I,utf,tables=2
+    AB\x{85}xxx\x{a0}XYZ
+    AB\x{a0}xxx\x{85}XYZ
+
+/\S \S/I,utf,tables=2
+    \x{a2} \x{84}
+    A Z
+
+/a+/utf
+    a\x{123}aa\=offset=1
+    a\x{123}aa\=offset=2
+    a\x{123}aa\=offset=3
+\= Expect no match
+    a\x{123}aa\=offset=4
+\= Expect bad offset error     
+    a\x{123}aa\=offset=5
+    a\x{123}aa\=offset=6
+
+/\x{1234}+/Ii,utf
+
+/\x{1234}+?/Ii,utf
+
+/\x{1234}++/Ii,utf
+
+/\x{1234}{2}/Ii,utf
+
+/[^\x{c4}]/IB,utf
+
+/X+\x{200}/IB,utf
+
+/\R/I,utf
+
+# Check bad offset 
+
+/a/utf
+\= Expect bad UTF-16 offset, or no match in 32-bit
+    \x{10000}\=offset=1
+    \x{10000}ab\=offset=1
+\= Expect 16-bit match, 32-bit no match
+    \x{10000}ab\=offset=2
+\= Expect no match     
+    \x{10000}ab\=offset=3
+\= Expect no match in 16-bit, bad offset in 32-bit    
+    \x{10000}ab\=offset=4
+\= Expect bad offset     
+    \x{10000}ab\=offset=5
+
+/í¼€/utf
+
+/\w+\x{C4}/B,utf
+    a\x{C4}\x{C4}
+
+/\w+\x{C4}/B,utf,tables=2
+    a\x{C4}\x{C4}
+    
+/\W+\x{C4}/B,utf
+    !\x{C4}
+ 
+/\W+\x{C4}/B,utf,tables=2
+    !\x{C4}
+
+/\W+\x{A1}/B,utf
+    !\x{A1}
+ 
+/\W+\x{A1}/B,utf,tables=2
+    !\x{A1}
+
+/X\s+\x{A0}/B,utf
+    X\x20\x{A0}\x{A0}
+
+/X\s+\x{A0}/B,utf,tables=2
+    X\x20\x{A0}\x{A0}
+
+/\S+\x{A0}/B,utf
+    X\x{A0}\x{A0}
+
+/\S+\x{A0}/B,utf,tables=2
+    X\x{A0}\x{A0}
+
+/\x{a0}+\s!/B,utf
+    \x{a0}\x20!
+
+/\x{a0}+\s!/B,utf,tables=2
+    \x{a0}\x20!
+
+/(*UTF)abc/never_utf
+
+/abc/utf,never_utf
+
+/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/IBi,utf
+
+/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/IB,utf
+
+/AB\x{1fb0}/IB,utf
+
+/AB\x{1fb0}/IBi,utf
+
+/\x{401}\x{420}\x{421}\x{422}\x{423}\x{424}\x{425}\x{426}\x{427}\x{428}\x{429}\x{42a}\x{42b}\x{42c}\x{42d}\x{42e}\x{42f}/Ii,utf
+    \x{401}\x{420}\x{421}\x{422}\x{423}\x{424}\x{425}\x{426}\x{427}\x{428}\x{429}\x{42a}\x{42b}\x{42c}\x{42d}\x{42e}\x{42f}
+    \x{451}\x{440}\x{441}\x{442}\x{443}\x{444}\x{445}\x{446}\x{447}\x{448}\x{449}\x{44a}\x{44b}\x{44c}\x{44d}\x{44e}\x{44f}
+
+/[ⱥ]/Bi,utf
+
+/[^ⱥ]/Bi,utf
+
+/[[:blank:]]/B,ucp
+
+/\x{212a}+/Ii,utf
+    KKkk\x{212a}
+
+/s+/Ii,utf
+    SSss\x{17f}
+
+# Non-UTF characters should give errors in both 16-bit and 32-bit modes.
+
+/\x{110000}/utf
+
+/\o{4200000}/utf
+
+/\x{100}*A/IB,utf
+    A
+
+/\x{100}*\d(?R)/IB,utf
+
+/[Z\x{100}]/IB,utf
+    Z\x{100}
+    \x{100}
+    \x{100}Z
+
+/[z-\x{100}]/IB,utf
+
+/[z\Qa-d]Ā\E]/IB,utf
+    \x{100}
+    Ā 
+
+/[ab\x{100}]abc(xyz(?1))/IB,utf
+
+/\x{100}*\s/IB,utf
+
+/\x{100}*\d/IB,utf
+
+/\x{100}*\w/IB,utf
+
+/\x{100}*\D/IB,utf
+
+/\x{100}*\S/IB,utf
+
+/\x{100}*\W/IB,utf
+
+/[\x{105}-\x{109}]/IBi,utf
+    \x{104}
+    \x{105}
+    \x{109}  
+\= Expect no match
+    \x{100}
+    \x{10a} 
+    
+/[z-\x{100}]/IBi,utf
+    Z
+    z
+    \x{39c}
+    \x{178}
+    |
+    \x{80}
+    \x{ff}
+    \x{100}
+    \x{101} 
+\= Expect no match
+    \x{102}
+    Y
+    y           
+
+/[z-\x{100}]/IBi,utf
+
+/\x{3a3}B/IBi,utf
+
+/./utf
+    \x{110000}
+
+# End of testinput12
diff --git a/dist2/testdata/testinput13 b/dist2/testdata/testinput13
new file mode 100644
index 0000000..93ac25f
--- /dev/null
+++ b/dist2/testdata/testinput13
@@ -0,0 +1,22 @@
+# These DFA tests are for the handling of characters greater than 255 in
+# 16-bit or 32-bit, non-UTF mode. 
+
+#forbid_utf
+#subject dfa
+
+/^\x{ffff}+/i
+    \x{ffff}
+
+/^\x{ffff}?/i
+    \x{ffff}
+
+/^\x{ffff}*/i
+    \x{ffff}
+
+/^\x{ffff}{3}/i
+    \x{ffff}\x{ffff}\x{ffff}
+
+/^\x{ffff}{0,3}/i
+    \x{ffff}
+
+# End of testinput13
diff --git a/dist2/testdata/testinput14 b/dist2/testdata/testinput14
new file mode 100644
index 0000000..f97f3ec
--- /dev/null
+++ b/dist2/testdata/testinput14
@@ -0,0 +1,37 @@
+# These test special (mostly error) UTF features of DFA matching. They are a 
+# selection of the more comprehensive tests that are run for non-DFA matching.
+# The output is different for the different widths.
+
+#subject dfa
+
+/X/utf
+    XX\x{d800}
+    XX\x{d800}\=offset=3
+    XX\x{d800}\=no_utf_check
+    XX\x{da00}
+    XX\x{da00}\=no_utf_check
+    XX\x{dc00}
+    XX\x{dc00}\=no_utf_check
+    XX\x{de00}
+    XX\x{de00}\=no_utf_check
+    XX\x{dfff}
+    XX\x{dfff}\=no_utf_check
+    XX\x{110000}
+    XX\x{d800}\x{1234}
+          
+/badutf/utf
+    X\xdf
+    XX\xef
+    XXX\xef\x80
+    X\xf7
+    XX\xf7\x80
+    XXX\xf7\x80\x80
+
+/shortutf/utf
+    XX\xdf\=ph
+    XX\xef\=ph
+    XX\xef\x80\=ph
+    \xf7\=ph
+    \xf7\x80\=ph
+
+# End of testinput14
diff --git a/dist2/testdata/testinput15 b/dist2/testdata/testinput15
new file mode 100644
index 0000000..4ea9ffd
--- /dev/null
+++ b/dist2/testdata/testinput15
@@ -0,0 +1,163 @@
+# These are:
+#
+# (1) Tests of the match-limiting features. The results are different for
+# interpretive or JIT matching, so this test should not be run with JIT. The
+# same tests are run using JIT in test 17.
+
+# (2) Other tests that must not be run with JIT.
+
+/(a+)*zz/I
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazzbbbbbb\=find_limits
+  aaaaaaaaaaaaaz\=find_limits
+
+!((?:\s|//.*\\n|/[*](?:\\n|.)*?[*]/)*)!I
+   /* this is a C style comment */\=find_limits
+
+/^(?>a)++/
+    aa\=find_limits
+    aaaaaaaaa\=find_limits
+    
+/(a)(?1)++/
+    aa\=find_limits
+    aaaaaaaaa\=find_limits
+
+/a(?:.)*?a/ims
+    abbbbbbbbbbbbbbbbbbbbba\=find_limits
+    
+/a(?:.(*THEN))*?a/ims
+    abbbbbbbbbbbbbbbbbbbbba\=find_limits
+
+/a(?:.(*THEN:ABC))*?a/ims
+    abbbbbbbbbbbbbbbbbbbbba\=find_limits
+
+/^(?>a+)(?>b+)(?>c+)(?>d+)(?>e+)/
+     aabbccddee\=find_limits
+
+/^(?>(a+))(?>(b+))(?>(c+))(?>(d+))(?>(e+))/
+     aabbccddee\=find_limits
+
+/^(?>(a+))(?>b+)(?>(c+))(?>d+)(?>(e+))/
+     aabbccddee\=find_limits
+
+/(*LIMIT_MATCH=12bc)abc/
+
+/(*LIMIT_MATCH=4294967290)abc/
+
+/(*LIMIT_RECURSION=4294967280)abc/I
+
+/(a+)*zz/
+    aaaaaaaaaaaaaz
+    aaaaaaaaaaaaaz\=match_limit=3000
+
+/(a+)*zz/
+    aaaaaaaaaaaaaz\=recursion_limit=10
+
+/(*LIMIT_MATCH=3000)(a+)*zz/I
+    aaaaaaaaaaaaaz
+    aaaaaaaaaaaaaz\=match_limit=60000
+
+/(*LIMIT_MATCH=60000)(*LIMIT_MATCH=3000)(a+)*zz/I
+    aaaaaaaaaaaaaz
+
+/(*LIMIT_MATCH=60000)(a+)*zz/I
+    aaaaaaaaaaaaaz
+    aaaaaaaaaaaaaz\=match_limit=3000
+
+/(*LIMIT_RECURSION=10)(a+)*zz/I
+    aaaaaaaaaaaaaz
+    aaaaaaaaaaaaaz\=recursion_limit=1000
+
+/(*LIMIT_RECURSION=10)(*LIMIT_RECURSION=1000)(a+)*zz/I
+    aaaaaaaaaaaaaz
+
+/(*LIMIT_RECURSION=1000)(a+)*zz/I
+    aaaaaaaaaaaaaz
+    aaaaaaaaaaaaaz\=recursion_limit=10
+    
+# These three have infinitely nested recursions. 
+    
+/((?2))((?1))/
+    abc
+
+/((?(R2)a+|(?1)b))/
+    aaaabcde
+
+/(?(R)a*(?1)|((?R))b)/
+    aaaabcde
+    
+# The allusedtext modifier does not work with JIT, which does not maintain
+# the leftchar/rightchar data.
+
+/abc(?=xyz)/allusedtext
+    abcxyzpqr
+    abcxyzpqr\=aftertext
+    
+/(?<=pqr)abc(?=xyz)/allusedtext
+    xyzpqrabcxyzpqr
+    xyzpqrabcxyzpqr\=aftertext
+    
+/a\b/
+    a.\=allusedtext
+    a\=allusedtext  
+
+/abc\Kxyz/
+    abcxyz\=allusedtext
+
+/abc(?=xyz(*ACCEPT))/
+    abcxyz\=allusedtext
+
+/abc(?=abcde)(?=ab)/allusedtext
+    abcabcdefg
+    
+# These tests provoke recursion loops, which give a different error message
+# when JIT is used.
+
+/(?R)/I
+    abcd
+
+/(a|(?R))/I
+    abcd
+    defg 
+
+/(ab|(bc|(de|(?R))))/I
+    abcd
+    fghi 
+
+/(ab|(bc|(de|(?1))))/I
+    abcd
+    fghi 
+
+/x(ab|(bc|(de|(?1)x)x)x)/I
+    xab123
+    xfghi 
+
+/(?!\w)(?R)/
+    abcd
+    =abc 
+
+/(?=\w)(?R)/
+    =abc 
+    abcd
+
+/(?<!\w)(?R)/
+    abcd
+
+/(?<=\w)(?R)/
+    abcd
+
+/(a+|(?R)b)/
+    aaa
+    bbb 
+
+/[^\xff]((?1))/BI
+    abcd
+    
+# These tests don't behave the same with JIT 
+
+/\w+(?C1)/BI,no_auto_possess
+    abc\=callout_fail=1
+
+/(*NO_AUTO_POSSESS)\w+(?C1)/BI
+    abc\=callout_fail=1
+
+# End of testinput15
diff --git a/dist2/testdata/testinput16 b/dist2/testdata/testinput16
new file mode 100644
index 0000000..8a48207
--- /dev/null
+++ b/dist2/testdata/testinput16
@@ -0,0 +1,9 @@
+# This test is run only when JIT support is not available. It checks that an
+# attempt to use it has the expected behaviour. It also tests things that
+# are different without JIT.
+
+/abc/I,jit,jitverify
+
+/a*/I
+
+# End of testinput16
diff --git a/dist/testdata/testinput12 b/dist2/testdata/testinput17
similarity index 81%
rename from dist/testdata/testinput12
rename to dist2/testdata/testinput17
index 944be69..1474eb9 100644
--- a/dist/testdata/testinput12
+++ b/dist2/testdata/testinput17
@@ -1,107 +1,276 @@
-/-- This test is run only when JIT support is available. It checks for a
-successful and an unsuccessful JIT compile and save and restore behaviour,
-and a couple of things that are different with JIT. --/
+# This test is run only when JIT support is available. It checks JIT complete
+# and partial modes, and things that are different with JIT.
 
-/abc/S+I
+#pattern jitverify
 
-/(?(?C1)(?=a)a)/S+I
+# JIT does not support this pattern (callout at start of condition).
 
-/(?(?C1)(?=a)a)/S!+I
+/(?(?C1)(?=a)a)/I
 
-/b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*/S+I
+# The following pattern cannot be compiled by JIT.
 
-/abc/S+I>testsavedregex
+/b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*/I
 
-<testsavedregex
-    abc
+# Check that an infinite recursion loop is caught.
 
-/a*/SI
-
-/(?(R)a*(?1)|((?R))b)/S+
+/(?(R)a*(?1)|((?R))b)/
     aaaabcde
-    
-/-- Test various compile modes --/ 
-    
-/abcd/S++
-    abcd
-    xyz  
 
-/abcd/S+
+/abcd/I
     abcd
-    ab\P
-    ab\P\P
+\= Expect no match
     xyz
 
-/abcd/S++
+/(*NO_JIT)abcd/I
     abcd
-    ab\P
-    ab\P\P
+\= Expect no match
     xyz
 
-/abcd/S++1
+/abcd/
     abcd
-    ab\P
-    ab\P\P
-    xyz
-    xyz\P
-
-/abcd/S++2
-    abcd
-    ab\P
-    ab\P\P
+    ab\=ps
+    ab\=ph
+\= Expect no match
     xyz
 
-/abcd/S++3
+/abcd/jitfast
     abcd
-    ab\P
-    ab\P\P
+    ab\=ps
+    ab\=ph
+\= Expect no match
     xyz
 
-/abcd/S++4
+/abcd/jit=1
     abcd
-    ab\P
-    ab\P\P
+    ab\=ps
+    ab\=ph
+\= Expect no match
+    xyz
+    xyz\=ps
+
+/abcd/jit=1,jitfast
+    abcd
+    ab\=ps
+    ab\=ph
+    xyz\=ps
+\= Expect no match
     xyz
 
-/abcd/S++5
+/abcd/jit=2
     abcd
-    ab\P
-    ab\P\P
+    ab\=ps
+    ab\=ph
+\= Expect no match
     xyz
 
-/abcd/S++6
+/abcd/jit=2,jitfast
     abcd
-    ab\P
-    ab\P\P
+    ab\=ps
+    ab\=ph
     xyz
 
-/abcd/S++7
+/abcd/jit=3
     abcd
-    ab\P
-    ab\P\P
+    ab\=ps
+    ab\=ph
+\= Expect no match
     xyz
-    
-/abcd/S++2I 
 
-/(*NO_START_OPT)a(*:m)b/KS++
+/abcd/jit=4
+    abcd
+    ab\=ps
+    ab\=ph
+\= Expect no match
+    xyz
+
+/abcd/jit=5
+    abcd
+    ab\=ps
+    ab\=ph
+\= Expect no match
+    xyz
+
+/abcd/jit=6
+    abcd
+    ab\=ps
+    ab\=ph
+\= Expect no match
+    xyz
+
+/abcd/jit=7
+    abcd
+    ab\=ps
+    ab\=ph
+\= Expect no match
+    xyz
+
+/abcd/I,jit=2
+
+/(*NO_START_OPT)a(*:m)b/mark
+\= Expect no match
     a
 
-/^12345678abcd/mS++
+/^12345678abcd/m
     12345678abcd
+    
+# Limits tests that give different output with JIT. 
 
-/-- Test pattern compilation --/ 
+/(a+)*zz/I
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazzbbbbbb\=find_limits
+\= Expect no match
+  aaaaaaaaaaaaaz\=find_limits
 
-/(?:a|b|c|d|e)(?R)/S++
+!((?:\s|//.*\\n|/[*](?:\\n|.)*?[*]/)*)!I
+   /* this is a C style comment */\=find_limits
 
-/(?:a|b|c|d|e)(?R)(?R)/S++
+/^(?>a)++/
+    aa\=find_limits
+    aaaaaaaaa\=find_limits
+    
+/(a)(?1)++/
+    aa\=find_limits
+    aaaaaaaaa\=find_limits
 
-/(a(?:a|b|c|d|e)b){8,16}/S++
+/a(?:.)*?a/ims
+    abbbbbbbbbbbbbbbbbbbbba\=find_limits
+    
+/a(?:.(*THEN))*?a/ims
+    abbbbbbbbbbbbbbbbbbbbba\=find_limits
 
-/(?:|a|){100}x/S++
+/a(?:.(*THEN:ABC))*?a/ims
+    abbbbbbbbbbbbbbbbbbbbba\=find_limits
 
-/(x(?1)){4}/S++
+/^(?>a+)(?>b+)(?>c+)(?>d+)(?>e+)/
+     aabbccddee\=find_limits
+
+/^(?>(a+))(?>(b+))(?>(c+))(?>(d+))(?>(e+))/
+     aabbccddee\=find_limits
+
+/^(?>(a+))(?>b+)(?>(c+))(?>d+)(?>(e+))/
+     aabbccddee\=find_limits
+
+/^(?>(a+))(?>b+)(?>(c+))(?>d+)(?>(e+))/jitfast
+     aabbccddee\=find_limits
+     aabbccddee\=jitstack=1
+
+/(a+)*zz/
+\= Expect no match
+    aaaaaaaaaaaaaz
+\= Expect limit exceeded
+    aaaaaaaaaaaaaz\=match_limit=3000
+
+/(*LIMIT_MATCH=3000)(a+)*zz/I
+    aaaaaaaaaaaaaz
+    aaaaaaaaaaaaaz\=match_limit=60000
+
+/(*LIMIT_MATCH=60000)(*LIMIT_MATCH=3000)(a+)*zz/I
+    aaaaaaaaaaaaaz
+
+/(*LIMIT_MATCH=60000)(a+)*zz/I
+\= Expect no match
+    aaaaaaaaaaaaaz
+\= Expect limit exceeded
+    aaaaaaaaaaaaaz\=match_limit=3000
+
+# These three have infinitely nested recursions. 
+    
+/((?2))((?1))/
+    abc
+
+/((?(R2)a+|(?1)b))/
+    aaaabcde
+
+/(?(R)a*(?1)|((?R))b)/
+    aaaabcde
+    
+# Invalid options disable JIT when called via pcre2_match(), causing the
+# match to happen via the interpreter, but for fast JIT invalid options are
+# ignored, so an unanchored match happens.
+
+/abcd/
+    abcd\=anchored
+\= Expect no match
+    fail abcd\=anchored 
+    
+/abcd/jitfast
+    abcd\=anchored 
+    succeed abcd\=anchored 
+    
+# Push/pop does not lose the JIT information, though jitverify applies only to
+# compilation, but serializing (save/load) discards JIT data completely.
+
+/^abc\Kdef/info,push
+#pop jitverify
+    abcdef
+
+/^abc\Kdef/info,push
+#save testsaved1
+#load testsaved1
+#pop jitverify
+    abcdef
+    
+#load testsaved1
+#pop jit,jitverify
+    abcdef
+    
+# Test pattern compilation
+
+/(?:a|b|c|d|e)(?R)/jit=1
+
+/(?:a|b|c|d|e)(?R)(?R)/jit=1
+
+/(a(?:a|b|c|d|e)b){8,16}/jit=1
+
+/(?:|a|){100}x/jit=1
+
+# These tests provoke recursion loops, which give a different error message
+# when JIT is used.
+
+/(?R)/I
+    abcd
+
+/(a|(?R))/I
+    abcd
+    defg 
+
+/(ab|(bc|(de|(?R))))/I
+    abcd
+    fghi 
+
+/(ab|(bc|(de|(?1))))/I
+    abcd
+    fghi 
+
+/x(ab|(bc|(de|(?1)x)x)x)/I
+    xab123
+    xfghi 
+
+/(?!\w)(?R)/
+    abcd
+    =abc 
+
+/(?=\w)(?R)/
+    =abc 
+    abcd
+
+/(?<!\w)(?R)/
+    abcd
+
+/(?<=\w)(?R)/
+    abcd
+
+/(a+|(?R)b)/
+    aaa
+    bbb 
+
+/[^\xff]((?1))/BI
+    abcd
+
+/(x(?1)){4}/
+
+/[axm]{7}/
 
 /(.|.)*?bx/
     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabax
 
-/-- End of testinput12 --/
+# End of testinput17
diff --git a/dist2/testdata/testinput18 b/dist2/testdata/testinput18
new file mode 100644
index 0000000..c75b842
--- /dev/null
+++ b/dist2/testdata/testinput18
@@ -0,0 +1,101 @@
+# This set of tests is run only with the 8-bit library. It tests the POSIX
+# interface, which is supported only with the 8-bit library. This test should
+# not be run with JIT (which is not available for the POSIX interface).
+    
+#forbid_utf
+#pattern posix
+
+# Test invalid options
+
+/abc/auto_callout
+
+/abc/
+   abc\=find_limits
+
+/abc/
+  abc\=partial_hard
+
+# Real tests
+
+/abc/
+    abc
+
+/^abc|def/
+    abcdef
+    abcdef\=notbol
+
+/.*((abc)$|(def))/
+    defabc
+    defabc\=noteol
+
+/the quick brown fox/
+    the quick brown fox
+\= Expect no match
+    The Quick Brown Fox
+
+/the quick brown fox/i
+    the quick brown fox
+    The Quick Brown Fox
+
+/(*LF)abc.def/
+\= Expect no match
+    abc\ndef
+
+/(*LF)abc$/
+    abc
+    abc\n
+
+/(abc)\2/
+
+/(abc\1)/
+\= Expect no match
+    abc
+
+/a*(b+)(z)(z)/
+    aaaabbbbzzzz
+    aaaabbbbzzzz\=ovector=0
+    aaaabbbbzzzz\=ovector=1
+    aaaabbbbzzzz\=ovector=2
+
+/(*ANY)ab.cd/
+    ab-cd
+    ab=cd
+\= Expect no match
+    ab\ncd
+
+/ab.cd/s
+    ab-cd
+    ab=cd
+    ab\ncd
+
+/a(b)c/no_auto_capture
+    abc
+
+/a(?P<name>b)c/no_auto_capture
+    abc
+
+/a?|b?/
+    abc
+\= Expect no match
+    ddd\=notempty
+
+/\w+A/
+   CDAAAAB
+
+/\w+A/ungreedy
+   CDAAAAB
+   
+/\Biss\B/I,aftertext
+    Mississippi
+
+/abc/\
+
+"(?(?C)"
+
+/abcd/substitute_extended
+
+/\[A]{1000000}**/expand,regerror_buffsize=31
+
+/\[A]{1000000}**/expand,regerror_buffsize=32
+
+# End of testdata/testinput18
diff --git a/dist2/testdata/testinput19 b/dist2/testdata/testinput19
new file mode 100644
index 0000000..7a90f1a
--- /dev/null
+++ b/dist2/testdata/testinput19
@@ -0,0 +1,18 @@
+# This set of tests is run only with the 8-bit library. It tests the POSIX
+# interface with UTF/UCP support, which is supported only with the 8-bit
+# library. This test should not be run with JIT (which is not available for the
+# POSIX interface).
+    
+#pattern posix
+
+/a\x{1234}b/utf
+    a\x{1234}b
+
+/\w/
+\= Expect no match
+    +++\x{c2}
+
+/\w/ucp
+    +++\x{c2}
+    
+# End of testdata/testinput19
diff --git a/dist2/testdata/testinput2 b/dist2/testdata/testinput2
new file mode 100644
index 0000000..071cca1
--- /dev/null
+++ b/dist2/testdata/testinput2
@@ -0,0 +1,4803 @@
+# This set of tests is not Perl-compatible. It checks on special features
+# of PCRE2's API, error diagnostics, and the compiled code of some patterns.
+# It also checks the non-Perl syntax that PCRE2 supports (Python, .NET, 
+# Oniguruma). There are also some tests where PCRE2 and Perl differ, 
+# either because PCRE2 can't be compatible, or there is a possible Perl 
+# bug.
+
+# NOTE: This is a non-UTF set of tests. When UTF support is needed, use
+# test 5. 
+
+#forbid_utf
+#newline_default lf any anycrlf
+
+# Test binary zeroes in the pattern
+
+# /a\0B/ where 0 is a binary zero
+/61 5c 00 62/B,hex
+    a\x{0}b
+
+# /a0b/ where 0 is a binary zero
+/61 00 62/B,hex
+    a\x{0}b
+
+# /(?#B0C)DE/ where 0 is a binary zero
+/28 3f 23 42 00 43 29 44 45/B,hex
+    DE
+
+/(a)b|/I
+
+/abc/I
+    abc
+    defabc
+    abc\=anchored
+\= Expect no match
+    defabc\=anchored
+    ABC
+
+/^abc/I
+    abc
+    abc\=anchored
+\= Expect no match
+    defabc
+    defabc\=anchored
+
+/a+bc/I
+
+/a*bc/I
+
+/a{3}bc/I
+
+/(abc|a+z)/I
+
+/^abc$/I
+    abc
+\= Expect no match
+    def\nabc
+
+/ab\idef/
+
+/(?X)ab\idef/
+
+/x{5,4}/
+
+/z{65536}/
+
+/[abcd/
+
+/[\B]/B
+
+/[\R]/B
+
+/[\X]/B
+
+/[z-a]/
+
+/^*/
+
+/(abc/
+
+/(?# abc/
+
+/(?z)abc/
+
+/.*b/I
+
+/.*?b/I
+
+/cat|dog|elephant/I
+    this sentence eventually mentions a cat
+    this sentences rambles on and on for a while and then reaches elephant
+
+/cat|dog|elephant/I
+    this sentence eventually mentions a cat
+    this sentences rambles on and on for a while and then reaches elephant
+
+/cat|dog|elephant/Ii
+    this sentence eventually mentions a CAT cat
+    this sentences rambles on and on for a while to elephant ElePhant
+
+/a|[bcd]/I
+
+/(a|[^\dZ])/I
+
+/(a|b)*[\s]/I
+
+/(ab\2)/
+
+/{4,5}abc/
+
+/(a)(b)(c)\2/I
+    abcb
+    abcb\=ovector=0
+    abcb\=ovector=1
+    abcb\=ovector=2
+    abcb\=ovector=3
+    abcb\=ovector=4
+
+/(a)bc|(a)(b)\2/I
+    abc
+    abc\=ovector=0
+    abc\=ovector=1
+    abc\=ovector=2
+    aba
+    aba\=ovector=0
+    aba\=ovector=1
+    aba\=ovector=2
+    aba\=ovector=3
+    aba\=ovector=4
+
+/abc$/I,dollar_endonly
+    abc
+\= Expect no match
+    abc\n
+    abc\ndef
+
+/(a)(b)(c)(d)(e)\6/
+
+/the quick brown fox/I
+    the quick brown fox
+    this is a line with the quick brown fox
+
+/the quick brown fox/I,anchored
+    the quick brown fox
+\= Expect no match
+    this is a line with the quick brown fox
+
+/ab(?z)cd/
+
+/^abc|def/I
+    abcdef
+    abcdef\=notbol
+
+/.*((abc)$|(def))/I
+    defabc
+    defabc\=noteol
+
+/)/
+
+/a[]b/
+
+/[^aeiou ]{3,}/I
+    co-processors, and for
+
+/<.*>/I
+    abc<def>ghi<klm>nop
+
+/<.*?>/I
+    abc<def>ghi<klm>nop
+
+/<.*>/I,ungreedy
+    abc<def>ghi<klm>nop
+
+/(?U)<.*>/I
+    abc<def>ghi<klm>nop
+
+/<.*?>/I,ungreedy
+    abc<def>ghi<klm>nop
+
+/={3,}/I,ungreedy
+    abc========def
+
+/(?U)={3,}?/I
+    abc========def
+
+/(?<!bar|cattle)foo/I
+    foo
+    catfoo
+\= Expect no match
+    the barfoo
+    and cattlefoo
+
+/(?<=a+)b/
+
+/(?<=aaa|b{0,3})b/
+
+/(?<!(foo)a\1)bar/
+
+/(?i)abc/I
+
+/(a|(?m)a)/I
+
+/(?i)^1234/I
+
+/(^b|(?i)^d)/I
+
+/(?s).*/I
+
+/[abcd]/I
+
+/(?i)[abcd]/I
+
+/(?m)[xy]|(b|c)/I
+
+/(^a|^b)/Im
+
+/(?i)(^a|^b)/Im
+
+/(a)(?(1)a|b|c)/
+
+/(?(?=a)a|b|c)/
+
+/(?(1a)/
+
+/(?(1a))/
+
+/(?(?i))/
+
+/(?(abc))/
+
+/(?(?<ab))/
+
+/((?s)blah)\s+\1/I
+
+/((?i)blah)\s+\1/I
+
+/((?i)b)/IB
+
+/(a*b|(?i:c*(?-i)d))/I
+
+/a$/I
+    a
+    a\n
+\= Expect no match
+    a\=noteol
+    a\n\=noteol
+
+/a$/Im
+    a
+    a\n
+    a\n\=noteol
+\= Expect no match
+    a\=noteol
+
+/\Aabc/Im
+
+/^abc/Im
+
+/^((a+)(?U)([ab]+)(?-U)([bc]+)(\w*))/I
+  aaaaabbbbbcccccdef
+
+/(?<=foo)[ab]/I
+
+/(?<!foo)(alpha|omega)/I
+
+/(?!alphabet)[ab]/I
+
+/(?<=foo\n)^bar/Im
+    foo\nbarbar
+\= Expect no match
+    rhubarb
+    barbell
+    abc\nbarton
+
+/^(?<=foo\n)bar/Im
+    foo\nbarbar
+\= Expect no match
+    rhubarb
+    barbell
+    abc\nbarton
+
+/(?>^abc)/Im
+    abc
+    def\nabc
+\= Expect no match
+    defabc
+
+/(?<=ab(c+)d)ef/
+
+/(?<=ab(?<=c+)d)ef/
+
+/(?<=ab(c|de)f)g/
+
+/The next three are in testinput2 because they have variable length branches/
+
+/(?<=bullock|donkey)-cart/I
+    the bullock-cart
+    a donkey-cart race
+\= Expect no match
+    cart
+    horse-and-cart
+
+/(?<=ab(?i)x|y|z)/I
+
+/(?>.*)(?<=(abcd)|(xyz))/I
+    alphabetabcd
+    endingxyz
+
+/(?<=ab(?i)x(?-i)y|(?i)z|b)ZZ/I
+    abxyZZ
+    abXyZZ
+    ZZZ
+    zZZ
+    bZZ
+    BZZ
+\= Expect no match
+    ZZ
+    abXYZZ
+    zzz
+    bzz
+
+/(?<!(foo)a)bar/I
+    bar
+    foobbar
+\= Expect no match
+    fooabar
+
+# This one is here because Perl behaves differently; see also the following.
+
+/^(a\1?){4}$/I
+\= Expect no match
+    aaaa
+    aaaaaa
+    
+# Perl does not fail these two for the final subjects. Neither did PCRE until
+# release 8.01. The problem is in backtracking into a subpattern that contains
+# a recursive reference to itself. PCRE has now made these into atomic patterns.
+
+/^(xa|=?\1a){2}$/
+    xa=xaa
+\= Expect no match
+    xa=xaaa
+
+/^(xa|=?\1a)+$/
+    xa=xaa
+\= Expect no match
+    xa=xaaa
+
+# These are syntax tests from Perl 5.005
+
+/a[b-a]/
+
+/a[]b/
+
+/a[/
+
+/*a/
+
+/(*)b/
+
+/abc)/
+
+/(abc/
+
+/a**/
+
+/)(/
+
+/\1/
+
+/\2/
+
+/(a)|\2/
+
+/a[b-a]/Ii
+
+/a[]b/Ii
+
+/a[/Ii
+
+/*a/Ii
+
+/(*)b/Ii
+
+/abc)/Ii
+
+/(abc/Ii
+
+/a**/Ii
+
+/)(/Ii
+
+/:(?:/
+
+/(?<%)b/
+
+/a(?{)b/
+
+/a(?{{})b/
+
+/a(?{}})b/
+
+/a(?{"{"})b/
+
+/a(?{"{"}})b/
+
+/(?(1?)a|b)/
+
+/[a[:xyz:/
+
+/(?<=x+)y/
+
+/a{37,17}/
+
+/abc/\
+
+/abc/\i
+
+/(a)bc(d)/I
+    abcd
+    abcd\=copy=2
+    abcd\=copy=5
+
+/(.{20})/I
+    abcdefghijklmnopqrstuvwxyz
+    abcdefghijklmnopqrstuvwxyz\=copy=1
+    abcdefghijklmnopqrstuvwxyz\=get=1
+
+/(.{15})/I
+    abcdefghijklmnopqrstuvwxyz
+    abcdefghijklmnopqrstuvwxyz\=copy=1,get=1
+
+/(.{16})/I
+    abcdefghijklmnopqrstuvwxyz
+    abcdefghijklmnopqrstuvwxyz\=copy=1,get=1,getall
+
+/^(a|(bc))de(f)/I
+    adef\=get=1,get=2,get=3,get=4,getall
+    bcdef\=get=1,get=2,get=3,get=4,getall
+    adefghijk\=copy=0
+
+/^abc\00def/I
+    abc\00def\=copy=0,getall
+
+/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/I
+
+/.*X/IB
+
+/.*X/IBs
+
+/(.*X|^B)/IB
+
+/(.*X|^B)/IBs
+
+/(?s)(.*X|^B)/IB
+
+/(?s:.*X|^B)/IB
+
+/\Biss\B/I,aftertext
+    Mississippi
+
+/iss/I,aftertext,altglobal
+    Mississippi
+
+/\Biss\B/I,aftertext,altglobal
+    Mississippi
+
+/\Biss\B/Ig,aftertext
+    Mississippi
+\= Expect no match
+    Mississippi\=anchored
+
+/(?<=[Ms])iss/Ig,aftertext
+    Mississippi
+
+/(?<=[Ms])iss/I,aftertext,altglobal
+    Mississippi
+
+/^iss/Ig,aftertext
+    ississippi
+
+/.*iss/Ig,aftertext
+    abciss\nxyzisspqr
+
+/.i./Ig,aftertext
+    Mississippi
+    Mississippi\=anchored
+    Missouri river
+    Missouri river\=anchored
+
+/^.is/Ig,aftertext
+    Mississippi
+
+/^ab\n/Ig,aftertext
+    ab\nab\ncd
+
+/^ab\n/Igm,aftertext
+    ab\nab\ncd
+
+/^/gm,newline=any
+    a\rb\nc\r\nxyz\=aftertext
+
+/abc/I
+
+/abc|bac/I
+
+/(abc|bac)/I
+
+/(abc|(c|dc))/I
+
+/(abc|(d|de)c)/I
+
+/a*/I
+
+/a+/I
+
+/(baa|a+)/I
+
+/a{0,3}/I
+
+/baa{3,}/I
+
+/"([^\\"]+|\\.)*"/I
+
+/(abc|ab[cd])/I
+
+/(a|.)/I
+
+/a|ba|\w/I
+
+/abc(?=pqr)/I
+
+/...(?<=abc)/I
+
+/abc(?!pqr)/I
+
+/ab./I
+
+/ab[xyz]/I
+
+/abc*/I
+
+/ab.c*/I
+
+/a.c*/I
+
+/.c*/I
+
+/ac*/I
+
+/(a.c*|b.c*)/I
+
+/a.c*|aba/I
+
+/.+a/I
+
+/(?=abcda)a.*/I
+
+/(?=a)a.*/I
+
+/a(b)*/I
+
+/a\d*/I
+
+/ab\d*/I
+
+/a(\d)*/I
+
+/abcde{0,0}/I
+
+/ab\d+/I
+
+/a(?(1)b)(.)/I
+
+/a(?(1)bag|big)(.)/I
+
+/a(?(1)bag|big)*(.)/I
+
+/a(?(1)bag|big)+(.)/I
+
+/a(?(1)b..|b..)(.)/I
+
+/ab\d{0}e/I
+
+/a?b?/I
+    a
+    b
+    ab
+    \
+\= Expect no match
+    \=notempty
+
+/|-/I
+    abcd
+    -abc
+    ab-c\=notempty
+\= Expect no match
+    abc\=notempty
+
+/^.?abcd/I
+
+/\(             # ( at start
+  (?:           # Non-capturing bracket
+  (?>[^()]+)    # Either a sequence of non-brackets (no backtracking)
+  |             # Or
+  (?R)          # Recurse - i.e. nested bracketed string
+  )*            # Zero or more contents
+  \)            # Closing )
+  /Ix
+    (abcd)
+    (abcd)xyz
+    xyz(abcd)
+    (ab(xy)cd)pqr
+    (ab(xycd)pqr
+    () abc ()
+    12(abcde(fsh)xyz(foo(bar))lmno)89
+\= Expect no match
+    abcd
+    abcd)
+    (abcd
+
+/\(  ( (?>[^()]+) | (?R) )* \) /Igx
+    (ab(xy)cd)pqr
+    1(abcd)(x(y)z)pqr
+
+/\(  (?: (?>[^()]+) | (?R) ) \) /Ix
+    (abcd)
+    (ab(xy)cd)
+    (a(b(c)d)e)
+    ((ab))
+\= Expect no match
+    ()
+
+/\(  (?: (?>[^()]+) | (?R) )? \) /Ix
+    ()
+    12(abcde(fsh)xyz(foo(bar))lmno)89
+
+/\(  ( (?>[^()]+) | (?R) )* \) /Ix
+    (ab(xy)cd)
+
+/\( ( ( (?>[^()]+) | (?R) )* ) \) /Ix
+    (ab(xy)cd)
+
+/\( (123)? ( ( (?>[^()]+) | (?R) )* ) \) /Ix
+    (ab(xy)cd)
+    (123ab(xy)cd)
+
+/\( ( (123)? ( (?>[^()]+) | (?R) )* ) \) /Ix
+    (ab(xy)cd)
+    (123ab(xy)cd)
+
+/\( (((((((((( ( (?>[^()]+) | (?R) )* )))))))))) \) /Ix
+    (ab(xy)cd)
+
+/\( ( ( (?>[^()<>]+) | ((?>[^()]+)) | (?R) )* ) \) /Ix
+    (abcd(xyz<p>qrs)123)
+
+/\( ( ( (?>[^()]+) | ((?R)) )* ) \) /Ix
+    (ab(cd)ef)
+    (ab(cd(ef)gh)ij)
+
+/^[[:alnum:]]/IB
+
+/^[[:^alnum:]]/IB
+
+/^[[:alpha:]]/IB
+
+/^[[:^alpha:]]/IB
+
+/[_[:alpha:]]/I
+
+/^[[:ascii:]]/IB
+
+/^[[:^ascii:]]/IB
+
+/^[[:blank:]]/IB
+
+/^[[:^blank:]]/IB
+
+/[\n\x0b\x0c\x0d[:blank:]]/I
+
+/^[[:cntrl:]]/IB
+
+/^[[:digit:]]/IB
+
+/^[[:graph:]]/IB
+
+/^[[:lower:]]/IB
+
+/^[[:print:]]/IB
+
+/^[[:punct:]]/IB
+
+/^[[:space:]]/IB
+
+/^[[:upper:]]/IB
+
+/^[[:xdigit:]]/IB
+
+/^[[:word:]]/IB
+
+/^[[:^cntrl:]]/IB
+
+/^[12[:^digit:]]/IB
+
+/^[[:^blank:]]/IB
+
+/[01[:alpha:]%]/IB
+
+/[[.ch.]]/I
+
+/[[=ch=]]/I
+
+/[[:rhubarb:]]/I
+
+/[[:upper:]]/Ii
+    A
+    a
+
+/[[:lower:]]/Ii
+    A
+    a
+
+/((?-i)[[:lower:]])[[:lower:]]/Ii
+    ab
+    aB
+\= Expect no match
+    Ab
+    AB
+
+/[\200-\110]/I
+
+/^(?(0)f|b)oo/I
+
+# This one's here because of the large output vector needed
+
+/(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\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)/I
+     1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 ABC ABC\=ovector=300
+
+# This one's here because Perl does this differently and PCRE2 can't at present
+
+/(main(O)?)+/I
+    mainmain
+    mainOmain
+
+# These are all cases where Perl does it differently (nested captures)
+
+/^(a(b)?)+$/I
+    aba
+
+/^(aa(bb)?)+$/I
+    aabbaa
+
+/^(aa|aa(bb))+$/I
+    aabbaa
+
+/^(aa(bb)??)+$/I
+    aabbaa
+
+/^(?:aa(bb)?)+$/I
+    aabbaa
+
+/^(aa(b(b))?)+$/I
+    aabbaa
+
+/^(?:aa(b(b))?)+$/I
+    aabbaa
+
+/^(?:aa(b(?:b))?)+$/I
+    aabbaa
+
+/^(?:aa(bb(?:b))?)+$/I
+    aabbbaa
+
+/^(?:aa(b(?:bb))?)+$/I
+    aabbbaa
+
+/^(?:aa(?:b(b))?)+$/I
+    aabbaa
+
+/^(?:aa(?:b(bb))?)+$/I
+    aabbbaa
+
+/^(aa(b(bb))?)+$/I
+    aabbbaa
+
+/^(aa(bb(bb))?)+$/I
+    aabbbbaa
+
+# ----------------
+
+/#/IBx
+
+/a#/IBx
+
+/[\s]/IB
+
+/[\S]/IB
+
+/a(?i)b/IB
+    ab
+    aB
+\= Expect no match
+    AB
+
+/(a(?i)b)/IB
+    ab
+    aB
+\= Expect no match
+    AB
+
+/   (?i)abc/IBx
+
+/#this is a comment
+  (?i)abc/IBx
+
+/123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890/IB
+
+/\Q123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890/IB
+
+/\Q\E/IB
+    \
+
+/\Q\Ex/IB
+
+/ \Q\E/IB
+
+/a\Q\E/IB
+  abc
+  bca
+  bac
+
+/a\Q\Eb/IB
+  abc
+
+/\Q\Eabc/IB
+
+/x*+\w/IB
+\= Expect no match
+    xxxxx
+
+/x?+/IB
+
+/x++/IB
+
+/x{1,3}+/B,no_auto_possess
+
+/x{1,3}+/Bi,no_auto_possess
+
+/[^x]{1,3}+/B,no_auto_possess
+
+/[^x]{1,3}+/Bi,no_auto_possess
+
+/(x)*+/IB
+
+/^(\w++|\s++)*$/I
+    now is the time for all good men to come to the aid of the party
+\= Expect no match
+    this is not a line with only words and spaces!
+
+/(\d++)(\w)/I
+    12345a
+\= Expect no match
+    12345+
+
+/a++b/I
+    aaab
+
+/(a++b)/I
+    aaab
+
+/(a++)b/I
+    aaab
+
+/([^()]++|\([^()]*\))+/I
+    ((abc(ade)ufh()()x
+
+/\(([^()]++|\([^()]+\))+\)/I
+    (abc)
+    (abc(def)xyz)
+\= Expect no match
+    ((()aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+
+/(abc){1,3}+/IB
+
+/a+?+/I
+
+/a{2,3}?+b/I
+
+/(?U)a+?+/I
+
+/a{2,3}?+b/I,ungreedy
+
+/x(?U)a++b/IB
+    xaaaab
+
+/(?U)xa++b/IB
+    xaaaab
+
+/^((a+)(?U)([ab]+)(?-U)([bc]+)(\w*))/IB
+
+/^x(?U)a+b/IB
+
+/^x(?U)(a+)b/IB
+
+/[.x.]/I
+
+/[=x=]/I
+
+/[:x:]/I
+
+/\l/I
+
+/\L/I
+
+/\N{name}/I
+
+/\u/I
+
+/\U/I
+
+/a{1,3}b/ungreedy
+    ab
+
+/[/I
+
+/[a-/I
+
+/[[:space:]/I
+
+/[\s]/IB
+
+/[[:space:]]/IB
+
+/[[:space:]abcde]/IB
+
+/< (?: (?(R) \d++  | [^<>]*+) | (?R)) * >/Ix
+    <>
+    <abcd>
+    <abc <123> hij>
+    <abc <def> hij>
+    <abc<>def>
+    <abc<>
+\= Expect no match
+    <abc
+
+/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/IB
+
+/\$\<\.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/IB
+
+/(.*)\d+\1/I
+
+/(.*)\d+/I
+
+/(.*)\d+\1/Is
+
+/(.*)\d+/Is
+
+/(.*(xyz))\d+\2/I
+
+/((.*))\d+\1/I
+    abc123bc
+
+/a[b]/I
+
+/(?=a).*/I
+
+/(?=abc).xyz/Ii
+
+/(?=abc)(?i).xyz/I
+
+/(?=a)(?=b)/I
+
+/(?=.)a/I
+
+/((?=abcda)a)/I
+
+/((?=abcda)ab)/I
+
+/()a/I
+
+/(?:(?=.)|(?<!x))a/I
+
+/(?(1)ab|ac)(.)/I
+
+/(?(1)abz|acz)(.)/I
+
+/(?(1)abz)(.)/I
+
+/(?(1)abz)(1)23/I
+
+/(a)+/I
+
+/(a){2,3}/I
+
+/(a)*/I
+
+/[a]/I
+
+/[ab]/I
+
+/[ab]/I
+
+/[^a]/I
+
+/\d456/I
+
+/\d456/I
+
+/a^b/I
+
+/^a/Im
+  abcde
+  xy\nabc
+\= Expect no match
+  xyabc
+
+/c|abc/I
+
+/(?i)[ab]/I
+
+/[ab](?i)cd/I
+
+/abc(?C)def/I
+    abcdef
+    1234abcdef
+\= Expect no match
+    abcxyz
+    abcxyzf
+
+/abc(?C)de(?C1)f/I
+    123abcdef
+
+/(?C1)\dabc(?C2)def/I
+    1234abcdef
+\= Expect no match
+    abcdef
+
+/(?C1)\dabc(?C2)def/I
+    1234abcdef
+\= Expect no match
+    abcdef
+
+/(?C255)ab/I
+
+/(?C256)ab/I
+
+/(?Cab)xx/I
+
+/(?C12vr)x/I
+
+/abc(?C)def/I
+    \x83\x0\x61bcdef
+
+/(abc)(?C)de(?C1)f/I
+    123abcdef
+    123abcdef\=callout_capture
+    123abcdefC-\=callout_none
+\= Expect no match
+    123abcdef\=callout_fail=1
+
+/(?C0)(abc(?C1))*/I
+    abcabcabc
+    abcabc\=callout_fail=1:3
+    abcabcabc\=callout_fail=1:3
+
+/(\d{3}(?C))*/I
+    123\=callout_capture
+    123456\=callout_capture
+    123456789\=callout_capture
+
+/((xyz)(?C)p|(?C1)xyzabc)/I
+    xyzabc\=callout_capture
+
+/(X)((xyz)(?C)p|(?C1)xyzabc)/I
+    Xxyzabc\=callout_capture
+
+/(?=(abc))(?C)abcdef/I
+    abcdef\=callout_capture
+
+/(?!(abc)(?C1)d)(?C2)abcxyz/I
+    abcxyz\=callout_capture
+
+/(?<=(abc)(?C))xyz/I
+   abcxyz\=callout_capture
+
+/a(b+)(c*)(?C1)/I
+\= Expect no match
+    abbbbbccc\=callout_data=1
+
+/a(b+?)(c*?)(?C1)/I
+\= Expect no match
+    abbbbbccc\=callout_data=1
+
+/(?C)abc/I
+
+/(?C)^abc/I
+
+/(?C)a|b/I
+
+/x(ab|(bc|(de|(?R))))/I
+    xab
+    xbc
+    xde
+    xxab
+    xxxab
+\= Expect no match
+    xyab
+
+/^([^()]|\((?1)*\))*$/I
+    abc
+    a(b)c
+    a(b(c))d
+\= Expect no match)
+    a(b(c)d
+
+/^>abc>([^()]|\((?1)*\))*<xyz<$/I
+   >abc>123<xyz<
+   >abc>1(2)3<xyz<
+   >abc>(1(2)3)<xyz<
+
+/(a(?1)b)/IB
+
+/(a(?1)+b)/IB
+
+/^(\d+|\((?1)([+*-])(?1)\)|-(?1))$/I
+    12
+    (((2+2)*-3)-7)
+    -12
+\= Expect no match
+    ((2+2)*-3)-7)
+
+/^(x(y|(?1){2})z)/I
+    xyz
+    xxyzxyzz
+\= Expect no match
+    xxyzz
+    xxyzxyzxyzz
+
+/((< (?: (?(R) \d++  | [^<>]*+) | (?2)) * >))/Ix
+    <>
+    <abcd>
+    <abc <123> hij>
+    <abc <def> hij>
+    <abc<>def>
+    <abc<>
+\= Expect no match
+    <abc
+
+/(?1)/I
+
+/((?2)(abc)/I
+
+/^(abc)def(?1)/I
+    abcdefabc
+
+/^(a|b|c)=(?1)+/I
+    a=a
+    a=b
+    a=bc
+
+/^(a|b|c)=((?1))+/I
+    a=a
+    a=b
+    a=bc
+
+/a(?P<name1>b|c)d(?P<longername2>e)/IB
+    abde
+    acde
+
+/(?:a(?P<c>c(?P<d>d)))(?P<a>a)/IB
+
+/(?P<a>a)...(?P=a)bbb(?P>a)d/IB
+
+/^\W*(?:(?P<one>(?P<two>.)\W*(?P>one)\W*(?P=two)|)|(?P<three>(?P<four>.)\W*(?P>three)\W*(?P=four)|\W*.\W*))\W*$/Ii
+    1221
+    Satan, oscillate my metallic sonatas!
+    A man, a plan, a canal: Panama!
+    Able was I ere I saw Elba.
+\= Expect no match
+    The quick brown fox
+
+/((?(R)a|b))\1(?1)?/I
+  bb
+  bbaa
+
+/(.*)a/Is
+
+/(.*)a\1/Is
+
+/(.*)a(b)\2/Is
+
+/((.*)a|(.*)b)z/Is
+
+/((.*)a|(.*)b)z\1/Is
+
+/((.*)a|(.*)b)z\2/Is
+
+/((.*)a|(.*)b)z\3/Is
+
+/((.*)a|^(.*)b)z\3/Is
+
+/(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)a/Is
+
+/(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)a\31/Is
+
+/(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)a\32/Is
+
+/(a)(bc)/IB,no_auto_capture
+  abc
+
+/(?P<one>a)(bc)/IB,no_auto_capture
+  abc
+
+/(a)(?P<named>bc)/IB,no_auto_capture
+
+/(aaa(?C1)bbb|ab)/I
+   aaabbb
+   aaabbb\=callout_data=0
+   aaabbb\=callout_data=1
+\= Expect no match    
+   aaabbb\=callout_data=-1
+
+/ab(?P<one>cd)ef(?P<two>gh)/I
+    abcdefgh
+    abcdefgh\=copy=1,get=two
+    abcdefgh\=copy=one,copy=two
+    abcdefgh\=copy=three
+
+/(?P<Tes>)(?P<Test>)/IB
+
+/(?P<Test>)(?P<Tes>)/IB
+
+/(?P<Z>zz)(?P<A>aa)/I
+    zzaa\=copy=Z
+    zzaa\=copy=A
+
+/(?P<x>eks)(?P<x>eccs)/I
+
+/(?P<abc>abc(?P<def>def)(?P<abc>xyz))/I
+
+"\[((?P<elem>\d+)(,(?P>elem))*)\]"I
+    [10,20,30,5,5,4,4,2,43,23,4234]
+\= Expect no match
+    []
+
+"\[((?P<elem>\d+)(,(?P>elem))*)?\]"I
+    [10,20,30,5,5,4,4,2,43,23,4234]
+    []
+
+/(a(b(?2)c))?/IB
+
+/(a(b(?2)c))*/IB
+
+/(a(b(?2)c)){0,2}/IB
+
+/[ab]{1}+/B
+
+/()(?1){1}/B
+
+/()(?1)/B
+
+/((w\/|-|with)*(free|immediate)*.*?shipping\s*[!.-]*)/Ii
+     Baby Bjorn Active Carrier - With free SHIPPING!!
+
+/((w\/|-|with)*(free|immediate)*.*?shipping\s*[!.-]*)/Ii
+     Baby Bjorn Active Carrier - With free SHIPPING!!
+
+/a*.*b/IB
+
+/(a|b)*.?c/IB
+
+/abc(?C255)de(?C)f/IB
+
+/abcde/IB,auto_callout
+  abcde
+\= Expect no match
+  abcdfe
+
+/a*b/IB,auto_callout
+  ab
+  aaaab
+  aaaacb
+
+/a*b/IB,auto_callout
+  ab
+  aaaab
+  aaaacb
+
+/a+b/IB,auto_callout
+  ab
+  aaaab
+\= Expect no match 
+  aaaacb
+
+/(abc|def)x/IB,auto_callout
+  abcx
+  defx
+\= Expect no match 
+  abcdefzx
+
+/(abc|def)x/IB,auto_callout
+  abcx
+  defx
+\= Expect no match 
+  abcdefzx
+
+/(ab|cd){3,4}/I,auto_callout
+  ababab
+  abcdabcd
+  abcdcdcdcdcd
+
+/([ab]{,4}c|xy)/IB,auto_callout
+\= Expect no match 
+    Note: that { does NOT introduce a quantifier
+
+/([ab]{,4}c|xy)/IB,auto_callout
+\= Expect no match 
+    Note: that { does NOT introduce a quantifier
+
+/([ab]{1,4}c|xy){4,5}?123/IB,auto_callout
+    aacaacaacaacaac123
+
+/\b.*/I
+  ab cd\=offset=1
+
+/\b.*/Is
+  ab cd\=startoffset=1
+
+/(?!.bcd).*/I
+  Xbcd12345
+
+/abcde/I
+    ab\=ps
+    abc\=ps
+    abcd\=ps
+    abcde\=ps
+    the quick brown abc\=ps
+\= Expect no match\=ps
+    the quick brown abxyz fox\=ps
+
+"^(0?[1-9]|[12][0-9]|3[01])/(0?[1-9]|1[012])/(20)?\d\d$"I
+    13/05/04\=ps
+    13/5/2004\=ps
+    02/05/09\=ps
+    1\=ps
+    1/2\=ps
+    1/2/0\=ps
+    1/2/04\=ps
+    0\=ps
+    02/\=ps
+    02/0\=ps
+    02/1\=ps
+\= Expect no match\=ps
+    \=ps
+    123\=ps
+    33/4/04\=ps
+    3/13/04\=ps
+    0/1/2003\=ps
+    0/\=ps
+    02/0/\=ps
+    02/13\=ps
+
+/0{0,2}ABC/I
+
+/\d{3,}ABC/I
+
+/\d*ABC/I
+
+/[abc]+DE/I
+
+/[abc]?123/I
+    123\=ps
+    a\=ps
+    b\=ps
+    c\=ps
+    c12\=ps
+    c123\=ps
+
+/^(?:\d){3,5}X/I
+    1\=ps
+    123\=ps
+    123X
+    1234\=ps
+    1234X
+    12345\=ps
+    12345X
+\= Expect no match
+    1X
+    123456\=ps
+
+"<(\w+)/?>(.)*</(\1)>"Igms
+    <!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>\=jitstack=1024
+
+/line\nbreak/I
+    this is a line\nbreak
+    line one\nthis is a line\nbreak in the second line
+
+/line\nbreak/I,firstline
+    this is a line\nbreak
+\= Expect no match
+    line one\nthis is a line\nbreak in the second line
+
+/line\nbreak/Im,firstline
+    this is a line\nbreak
+\= Expect no match
+    line one\nthis is a line\nbreak in the second line
+
+/(?i)(?-i)AbCd/I
+    AbCd
+\= Expect no match
+    abcd
+
+/a{11111111111111111111}/I
+
+/(){64294967295}/I
+
+/(){2,4294967295}/I
+
+"(?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"I
+    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"I
+    abcdefghijklAkB
+
+"(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)(l)A\11B"I
+    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)"I
+    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)"I
+    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+
+/[^()]*(?:\((?R)\)[^()]*)*/I
+    (this(and)that
+    (this(and)that)
+    (this(and)that)stuff
+
+/[^()]*(?:\((?>(?R))\)[^()]*)*/I
+    (this(and)that
+    (this(and)that)
+
+/[^()]*(?:\((?R)\))*[^()]*/I
+    (this(and)that
+    (this(and)that)
+
+/(?:\((?R)\))*[^()]*/I
+    (this(and)that
+    (this(and)that)
+    ((this))
+
+/(?:\((?R)\))|[^()]*/I
+    (this(and)that
+    (this(and)that)
+    (this)
+    ((this))
+
+/\x{0000ff}/I
+
+/^((?P<A>a1)|(?P<A>a2)b)/I
+
+/^((?P<A>a1)|(?P<A>a2)b)/I,dupnames
+    a1b\=copy=A
+    a2b\=copy=A
+    a1b\=copy=Z,copy=A
+    
+/(?|(?<a>)(?<b>)(?<a>)|(?<a>)(?<b>)(?<a>))/I,dupnames
+
+/^(?P<A>a)(?P<A>b)/I,dupnames
+    ab\=copy=A
+
+/^(?P<A>a)(?P<A>b)|cd/I,dupnames
+    ab\=copy=A
+    cd\=copy=A
+
+/^(?P<A>a)(?P<A>b)|cd(?P<A>ef)(?P<A>gh)/I,dupnames
+    cdefgh\=copy=A
+
+/^((?P<A>a1)|(?P<A>a2)b)/I,dupnames
+    a1b\=get=A
+    a2b\=get=A
+    a1b\=get=Z,get=A
+
+/^(?P<A>a)(?P<A>b)/I,dupnames
+    ab\=get=A
+
+/^(?P<A>a)(?P<A>b)|cd/I,dupnames
+    ab\=get=A
+    cd\=get=A
+
+/^(?P<A>a)(?P<A>b)|cd(?P<A>ef)(?P<A>gh)/I,dupnames
+    cdefgh\=get=A
+
+/(?J)^((?P<A>a1)|(?P<A>a2)b)/I
+    a1b\=copy=A
+    a2b\=copy=A
+
+/^(?P<A>a) (?J:(?P<B>b)(?P<B>c)) (?P<A>d)/I
+
+# In this next test, J is not set at the outer level; consequently it isn't set
+# in the pattern's options; consequently pcre2_substring_get_byname() produces
+# a random value.
+
+/^(?P<A>a) (?J:(?P<B>b)(?P<B>c)) (?P<C>d)/I
+    a bc d\=copy=A,copy=B,copy=C
+
+/^(?P<A>a)?(?(A)a|b)/I
+    aabc
+    bc
+\= Expect no match
+    abc
+
+/(?:(?(ZZ)a|b)(?P<ZZ>X))+/I
+    bXaX
+
+/(?:(?(2y)a|b)(X))+/I
+
+/(?:(?(ZA)a|b)(?P<ZZ>X))+/I
+
+/(?:(?(ZZ)a|b)(?(ZZ)a|b)(?P<ZZ>X))+/I
+    bbXaaX
+
+/(?:(?(ZZ)a|\(b\))\\(?P<ZZ>X))+/I
+    (b)\\Xa\\X
+
+/(?P<ABC/I
+
+/(?:(?(A)(?P=A)a|b)(?P<A>X|Y))+/I
+    bXXaYYaY
+    bXYaXXaX
+
+/()()()()()()()()()(?:(?(A)(?P=A)a|b)(?P<A>X|Y))+/I
+    bXXaYYaY
+
+/\s*,\s*/I
+    \x0b,\x0b
+    \x0c,\x0d
+
+/^abc/Im,newline=lf
+    xyz\nabc
+    xyz\r\nabc
+\= Expect no match
+    xyz\rabc
+    xyzabc\r
+    xyzabc\rpqr
+    xyzabc\r\n
+    xyzabc\r\npqr
+
+/^abc/Im,newline=crlf
+    xyz\r\nabclf>
+\= Expect no match
+    xyz\nabclf
+    xyz\rabclf
+    
+/^abc/Im,newline=cr
+    xyz\rabc
+\= Expect no match
+    xyz\nabc
+    xyz\r\nabc
+
+/^abc/Im,newline=bad
+
+/.*/I,newline=lf
+    abc\ndef
+    abc\rdef
+    abc\r\ndef
+
+/.*/I,newline=cr
+    abc\ndef
+    abc\rdef
+    abc\r\ndef
+
+/.*/I,newline=crlf
+    abc\ndef
+    abc\rdef
+    abc\r\ndef
+
+/\w+(.)(.)?def/Is
+    abc\ndef
+    abc\rdef
+    abc\r\ndef
+
+/(?P<B>25[0-5]|2[0-4]\d|[01]?\d?\d)(?:\.(?P>B)){3}/I
+
+/()()()()()()()()()()()()()()()()()()()()
+ ()()()()()()()()()()()()()()()()()()()()
+ ()()()()()()()()()()()()()()()()()()()()
+ ()()()()()()()()()()()()()()()()()()()()
+ ()()()()()()()()()()()()()()()()()()()()
+ (.(.))/Ix
+    XY\=ovector=133
+
+/(a*b|(?i:c*(?-i)d))/I
+
+/()[ab]xyz/I
+
+/(|)[ab]xyz/I
+
+/(|c)[ab]xyz/I
+
+/(|c?)[ab]xyz/I
+
+/(d?|c?)[ab]xyz/I
+
+/(d?|c)[ab]xyz/I
+
+/^a*b\d/IB
+
+/^a*+b\d/IB
+
+/^a*?b\d/IB
+
+/^a+A\d/IB
+    aaaA5
+\= Expect no match
+    aaaa5
+
+/^a*A\d/IBi
+    aaaA5
+    aaaa5
+
+/(a*|b*)[cd]/I
+
+/(a+|b*)[cd]/I
+
+/(a*|b+)[cd]/I
+
+/(a+|b+)[cd]/I
+
+/((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
+ ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
+ (((
+ a
+ ))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
+ ))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
+ )))
+/Ix
+  large nest
+
+/a*\d/B
+
+/a*\D/B
+
+/0*\d/B
+
+/0*\D/B
+
+/a*\s/B
+
+/a*\S/B
+
+/ *\s/B
+
+/ *\S/B
+
+/a*\w/B
+
+/a*\W/B
+
+/=*\w/B
+
+/=*\W/B
+
+/\d*a/B
+
+/\d*2/B
+
+/\d*\d/B
+
+/\d*\D/B
+
+/\d*\s/B
+
+/\d*\S/B
+
+/\d*\w/B
+
+/\d*\W/B
+
+/\D*a/B
+
+/\D*2/B
+
+/\D*\d/B
+
+/\D*\D/B
+
+/\D*\s/B
+
+/\D*\S/B
+
+/\D*\w/B
+
+/\D*\W/B
+
+/\s*a/B
+
+/\s*2/B
+
+/\s*\d/B
+
+/\s*\D/B
+
+/\s*\s/B
+
+/\s*\S/B
+
+/\s*\w/B
+
+/\s*\W/B
+
+/\S*a/B
+
+/\S*2/B
+
+/\S*\d/B
+
+/\S*\D/B
+
+/\S*\s/B
+
+/\S*\S/B
+
+/\S*\w/B
+
+/\S*\W/B
+
+/\w*a/B
+
+/\w*2/B
+
+/\w*\d/B
+
+/\w*\D/B
+
+/\w*\s/B
+
+/\w*\S/B
+
+/\w*\w/B
+
+/\w*\W/B
+
+/\W*a/B
+
+/\W*2/B
+
+/\W*\d/B
+
+/\W*\D/B
+
+/\W*\s/B
+
+/\W*\S/B
+
+/\W*\w/B
+
+/\W*\W/B
+
+/[^a]+a/B
+
+/[^a]+a/Bi
+
+/[^a]+A/Bi
+
+/[^a]+b/B
+
+/[^a]+\d/B
+
+/a*[^a]/B
+
+/(?P<abc>x)(?P<xyz>y)/I
+    xy\=copy=abc,copy=xyz
+
+/(?<abc>x)(?'xyz'y)/I
+    xy\=copy=abc,copy=xyz
+
+/(?<abc'x)(?'xyz'y)/I
+
+/(?<abc>x)(?'xyz>y)/I
+
+/(?P'abc'x)(?P<xyz>y)/I
+
+/^(?:(?(ZZ)a|b)(?<ZZ>X))+/
+    bXaX
+    bXbX
+\= Expect no match
+    aXaX
+    aXbX
+
+/^(?P>abc)(?<abcd>xxx)/
+
+/^(?P>abc)(?<abc>x|y)/
+    xx
+    xy
+    yy
+    yx
+
+/^(?P>abc)(?P<abc>x|y)/
+    xx
+    xy
+    yy
+    yx
+
+/^((?(abc)a|b)(?<abc>x|y))+/
+    bxay
+    bxby
+\= Expect no match
+    axby
+
+/^(((?P=abc)|X)(?<abc>x|y))+/
+    XxXxxx
+    XxXyyx
+    XxXyxx
+\= Expect no match
+    x
+
+/^(?1)(abc)/
+    abcabc
+
+/^(?:(?:\1|X)(a|b))+/
+    Xaaa
+    Xaba
+
+/^[\E\Qa\E-\Qz\E]+/B
+
+/^[a\Q]bc\E]/B
+
+/^[a-\Q\E]/B
+
+/^(?P>abc)[()](?<abc>)/B
+
+/^((?(abc)y)[()](?P<abc>x))+/B
+    (xy)x
+
+/^(?P>abc)\Q()\E(?<abc>)/B
+
+/^(?P>abc)[a\Q(]\E(](?<abc>)/B
+
+/^(?P>abc) # this is (a comment)
+  (?<abc>)/Bx
+
+/^\W*(?:(?<one>(?<two>.)\W*(?&one)\W*\k<two>|)|(?<three>(?<four>.)\W*(?&three)\W*\k'four'|\W*.\W*))\W*$/Ii
+    1221
+    Satan, oscillate my metallic sonatas!
+    A man, a plan, a canal: Panama!
+    Able was I ere I saw Elba.
+\= Expect no match
+    The quick brown fox
+
+/(?=(\w+))\1:/I
+    abcd:
+
+/(?=(?'abc'\w+))\k<abc>:/I
+    abcd:
+
+/(?'abc'a|b)(?<abc>d|e)\k<abc>{2}/dupnames
+    adaa
+\= Expect no match
+    addd
+    adbb
+
+/(?'abc'a|b)(?<abc>d|e)(?&abc){2}/dupnames
+    bdaa
+    bdab
+\= Expect no match
+    bddd
+
+/(?(<bc))/
+
+/(?(''))/
+
+/(?('R')stuff)/
+
+/((abc (?(R) (?(R1)1) (?(R2)2) X  |  (?1)  (?2)   (?R) ))) /x
+    abcabc1Xabc2XabcXabcabc
+
+/(?<A> (?'B' abc (?(R) (?(R&A)1) (?(R&B)2) X  |  (?1)  (?2)   (?R) ))) /x
+    abcabc1Xabc2XabcXabcabc
+
+/(?<A> (?'B' abc (?(R) (?(R&C)1) (?(R&B)2) X  |  (?1)  (?2)   (?R) ))) /x
+
+/^(?(DEFINE) abc | xyz ) /x
+
+/(?(DEFINE) abc) xyz/Ix
+
+/(a|)*\d/
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4\=ovector=0
+\= Expect no match
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\=ovector=0
+
+/^a.b/newline=lf
+    a\rb
+\= Expect no match
+    a\nb
+
+/^a.b/newline=cr
+    a\nb
+\= Expect no match
+    a\rb
+
+/^a.b/newline=anycrlf
+    a\x85b
+\= Expect no match
+    a\rb
+
+/^a.b/newline=any
+\= Expect no match
+    a\nb
+    a\rb
+    a\x85b
+
+/^abc./gmx,newline=any
+    abc1 \x0aabc2 \x0babc3xx \x0cabc4 \x0dabc5xx \x0d\x0aabc6 \x85abc7 JUNK
+
+/abc.$/gmx,newline=any
+    abc1\x0a abc2\x0b abc3\x0c abc4\x0d abc5\x0d\x0a abc6\x85 abc7 abc9
+
+/^a\Rb/bsr=unicode
+    a\nb
+    a\rb
+    a\r\nb
+    a\x0bb
+    a\x0cb
+    a\x85b
+\= Expect no match
+    a\n\rb
+
+/^a\R*b/bsr=unicode
+    ab
+    a\nb
+    a\rb
+    a\r\nb
+    a\x0bb
+    a\x0cb
+    a\x85b
+    a\n\rb
+    a\n\r\x85\x0cb
+
+/^a\R+b/bsr=unicode
+    a\nb
+    a\rb
+    a\r\nb
+    a\x0bb
+    a\x0cb
+    a\x85b
+    a\n\rb
+    a\n\r\x85\x0cb
+\= Expect no match
+    ab
+
+/^a\R{1,3}b/bsr=unicode
+    a\nb
+    a\n\rb
+    a\n\r\x85b
+    a\r\n\r\nb
+    a\r\n\r\n\r\nb
+    a\n\r\n\rb
+    a\n\n\r\nb
+\= Expect no match
+    a\n\n\n\rb
+    a\r
+
+/(?&abc)X(?<abc>P)/I
+    abcPXP123
+
+/(?1)X(?<abc>P)/I
+    abcPXP123
+
+/(?:a(?&abc)b)*(?<abc>x)/
+    123axbaxbaxbx456
+    123axbaxbaxb456
+
+/(?:a(?&abc)b){1,5}(?<abc>x)/
+    123axbaxbaxbx456
+
+/(?:a(?&abc)b){2,5}(?<abc>x)/
+    123axbaxbaxbx456
+
+/(?:a(?&abc)b){2,}(?<abc>x)/
+    123axbaxbaxbx456
+
+/(abc)(?i:(?1))/
+    defabcabcxyz
+\= Expect no match
+    DEFabcABCXYZ
+
+/(abc)(?:(?i)(?1))/
+    defabcabcxyz
+\= Expect no match
+    DEFabcABCXYZ
+
+/^(a)\g-2/
+
+/^(a)\g/
+
+/^(a)\g{0}/
+
+/^(a)\g{3/
+
+/^(a)\g{aa}/
+
+/^a.b/newline=lf
+    a\rb
+\= Expect no match
+    a\nb
+
+/.+foo/
+    afoo
+\= Expect no match
+    \r\nfoo
+    \nfoo
+
+/.+foo/newline=crlf
+    afoo
+    \nfoo
+\= Expect no match
+    \r\nfoo
+
+/.+foo/newline=any
+    afoo
+\= Expect no match
+    \nfoo
+    \r\nfoo
+
+/.+foo/s
+    afoo
+    \r\nfoo
+    \nfoo
+    
+/^$/gm,newline=any
+    abc\r\rxyz
+    abc\n\rxyz  
+\= Expect no match 
+    abc\r\nxyz
+
+/(?m)^$/g,newline=any,aftertext
+    abc\r\n\r\n
+
+/(?m)^$|^\r\n/g,newline=any,aftertext
+    abc\r\n\r\n
+    
+/(?m)$/g,newline=any,aftertext
+    abc\r\n\r\n
+
+/abc.$/gmx,newline=anycrlf
+    abc1\x0a abc2\x0b abc3\x0c abc4\x0d abc5\x0d\x0a abc6\x85 abc9
+
+/^X/m
+    XABC
+\= Expect no match 
+    XABC\=notbol
+
+/(ab|c)(?-1)/B
+    abc
+
+/xy(?+1)(abc)/B
+    xyabcabc
+\= Expect no match
+    xyabc  
+    
+/x(?-0)y/
+
+/x(?-1)y/
+
+/x(?+0)y/
+
+/x(?+1)y/
+
+/^(abc)?(?(-1)X|Y)/B
+    abcX
+    Y
+\= Expect no match
+    abcY   
+    
+/^((?(+1)X|Y)(abc))+/B
+    YabcXabc
+    YabcXabcXabc
+\= Expect no match
+    XabcXabc  
+
+/(?(-1)a)/B
+
+/((?(-1)a))/B
+
+/((?(-2)a))/B
+
+/^(?(+1)X|Y)(.)/B
+    Y!
+
+/(?<A>tom|bon)-\k{A}/
+    tom-tom
+    bon-bon 
+\= Expect no match
+    tom-bon  
+
+/\g{A/
+
+/(?|(abc)|(xyz))/B
+   >abc<
+   >xyz< 
+
+/(x)(?|(abc)|(xyz))(x)/B
+    xabcx
+    xxyzx 
+
+/(x)(?|(abc)(pqr)|(xyz))(x)/B
+    xabcpqrx
+    xxyzx 
+
+/\H++X/B
+\= Expect no match
+    XXXX
+    
+/\H+\hY/B
+    XXXX Y 
+
+/\H+ Y/B
+
+/\h+A/B
+
+/\v*B/B
+
+/\V+\x0a/B
+
+/A+\h/B
+
+/ *\H/B
+
+/A*\v/B
+
+/\x0b*\V/B
+
+/\d+\h/B
+
+/\d*\v/B
+
+/S+\h\S+\v/B
+
+/\w{3,}\h\w+\v/B
+
+/\h+\d\h+\w\h+\S\h+\H/B
+
+/\v+\d\v+\w\v+\S\v+\V/B
+
+/\H+\h\H+\d/B
+
+/\V+\v\V+\w/B
+
+/\( (?: [^()]* | (?R) )* \)/x
+(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(00)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)\=jitstack=1024
+
+/[\E]AAA/
+
+/[\Q\E]AAA/
+
+/[^\E]AAA/
+
+/[^\Q\E]AAA/
+
+/[\E^]AAA/
+
+/[\Q\E^]AAA/
+
+/A(*PRUNE)B(*SKIP)C(*THEN)D(*COMMIT)E(*F)F(*FAIL)G(?!)H(*ACCEPT)I/B
+
+/^a+(*FAIL)/auto_callout
+\= Expect no match
+    aaaaaa
+    
+/a+b?c+(*FAIL)/auto_callout
+\= Expect no match
+    aaabccc
+
+/a+b?(*PRUNE)c+(*FAIL)/auto_callout
+\= Expect no match
+    aaabccc
+
+/a+b?(*COMMIT)c+(*FAIL)/auto_callout
+\= Expect no match
+    aaabccc
+    
+/a+b?(*SKIP)c+(*FAIL)/auto_callout
+\= Expect no match
+    aaabcccaaabccc
+
+/a+b?(*THEN)c+(*FAIL)/auto_callout
+\= Expect no match
+    aaabccc
+    
+/a(*MARK)b/
+
+/(?i:A{1,}\6666666666)/
+
+/\g6666666666/
+
+/[\g6666666666]/B
+
+/(?1)\c[/
+
+/.+A/newline=crlf
+\= Expect no match
+    \r\nA
+    
+/\nA/newline=crlf
+    \r\nA 
+
+/[\r\n]A/newline=crlf
+    \r\nA 
+
+/(\r|\n)A/newline=crlf
+    \r\nA 
+
+/a(*CR)b/
+
+/(*CR)a.b/
+    a\nb
+\= Expect no match
+    a\rb  
+
+/(*CR)a.b/newline=lf
+    a\nb
+\= Expect no match
+    a\rb  
+
+/(*LF)a.b/newline=CRLF
+    a\rb
+\= Expect no match
+    a\nb  
+
+/(*CRLF)a.b/
+    a\rb
+    a\nb  
+\= Expect no match
+    a\r\nb  
+
+/(*ANYCRLF)a.b/newline=CR
+\= Expect no match
+    a\rb
+    a\nb  
+    a\r\nb  
+
+/(*ANY)a.b/newline=cr
+\= Expect no match
+    a\rb
+    a\nb  
+    a\r\nb  
+    a\x85b 
+    
+/(*ANY).*/g
+    abc\r\ndef
+
+/(*ANYCRLF).*/g
+    abc\r\ndef
+
+/(*CRLF).*/g
+    abc\r\ndef
+
+/a\Rb/I,bsr=anycrlf
+    a\rb
+    a\nb
+    a\r\nb
+\= Expect no match
+    a\x85b
+    a\x0bb     
+
+/a\Rb/I,bsr=unicode
+    a\rb
+    a\nb
+    a\r\nb
+    a\x85b
+    a\x0bb     
+    
+/a\R?b/I,bsr=anycrlf
+    a\rb
+    a\nb
+    a\r\nb
+\= Expect no match
+    a\x85b
+    a\x0bb     
+
+/a\R?b/I,bsr=unicode
+    a\rb
+    a\nb
+    a\r\nb
+    a\x85b
+    a\x0bb     
+    
+/a\R{2,4}b/I,bsr=anycrlf
+    a\r\n\nb
+    a\n\r\rb
+    a\r\n\r\n\r\n\r\nb
+\= Expect no match
+    a\x85\x85b
+    a\x0b\x0bb     
+
+/a\R{2,4}b/I,bsr=unicode
+    a\r\rb
+    a\n\n\nb
+    a\r\n\n\r\rb
+    a\x85\x85b
+    a\x0b\x0bb     
+\= Expect no match 
+    a\r\r\r\r\rb 
+ 
+/(*BSR_ANYCRLF)a\Rb/I
+    a\nb
+    a\rb 
+
+/(*BSR_UNICODE)a\Rb/I
+    a\x85b
+
+/(*BSR_ANYCRLF)(*CRLF)a\Rb/I
+    a\nb
+    a\rb 
+
+/(*CRLF)(*BSR_UNICODE)a\Rb/I
+    a\x85b
+
+/(*CRLF)(*BSR_ANYCRLF)(*CR)ab/I
+
+/(?<a>)(?&)/
+
+/(?<abc>)(?&a)/
+
+/(?<a>)(?&aaaaaaaaaaaaaaaaaaaaaaa)/
+
+/(?+-a)/
+
+/(?-+a)/
+
+/(?(-1))/
+
+/(?(+10))/
+
+/(?(10))/
+
+/(?(+2))()()/
+
+/(?(2))()()/
+
+/\k''/
+
+/\k<>/
+
+/\k{}/
+
+/\k/
+
+/\kabc/
+
+/(?P=)/
+
+/(?P>)/
+
+/[[:foo:]]/
+
+/[[:1234:]]/
+
+/[[:f\oo:]]/
+
+/[[: :]]/
+
+/[[:...:]]/
+
+/[[:l\ower:]]/
+
+/[[:abc\:]]/
+
+/[abc[:x\]pqr:]]/
+
+/[[:a\dz:]]/
+
+/(^(a|b\g<-1'c))/
+
+/^(?+1)(?<a>x|y){0}z/
+    xzxx
+    yzyy 
+\= Expect no match
+    xxz  
+
+/(\3)(\1)(a)/
+\= Expect no match
+    cat
+
+/(\3)(\1)(a)/alt_bsux,allow_empty_class,match_unset_backref,dupnames
+    cat
+    
+/TA]/
+    The ACTA] comes 
+
+/TA]/alt_bsux,allow_empty_class,match_unset_backref,dupnames
+    The ACTA] comes 
+
+/(?2)[]a()b](abc)/
+    abcbabc
+
+/(?2)[^]a()b](abc)/
+    abcbabc
+
+/(?1)[]a()b](abc)/
+    abcbabc
+\= Expect no match 
+    abcXabc
+
+/(?1)[^]a()b](abc)/
+    abcXabc
+\= Expect no match 
+    abcbabc
+
+/(?2)[]a()b](abc)(xyz)/
+    xyzbabcxyz
+
+/(?&N)[]a(?<N>)](?<M>abc)/
+   abc<abc
+
+/(?&N)[]a(?<N>)](abc)/
+   abc<abc
+
+/a[]b/
+
+/a[^]b/
+
+/a[]b/alt_bsux,allow_empty_class,match_unset_backref,dupnames
+\= Expect no match
+    ab
+
+/a[]+b/alt_bsux,allow_empty_class,match_unset_backref,dupnames
+\= Expect no match
+    ab 
+
+/a[]*+b/alt_bsux,allow_empty_class,match_unset_backref,dupnames
+\= Expect no match
+    ab 
+
+/a[^]b/alt_bsux,allow_empty_class,match_unset_backref,dupnames
+    aXb
+    a\nb 
+\= Expect no match
+    ab  
+    
+/a[^]+b/alt_bsux,allow_empty_class,match_unset_backref,dupnames
+    aXb
+    a\nX\nXb 
+\= Expect no match
+    ab  
+
+/a(?!)b/B
+
+/(?!)?a/B
+    ab
+
+/a(*FAIL)+b/
+
+/(abc|pqr|123){0}[xyz]/I
+
+/(?(?=.*b)b|^)/I,auto_callout
+   adc
+   abc 
+   
+/(?(?=b).*b|^d)/I
+
+/(?(?=.*b).*b|^d)/I
+
+/xyz/auto_callout
+  xyz 
+  abcxyz 
+\= Expect no match 
+  abc
+  abcxypqr  
+  
+/xyz/auto_callout,no_start_optimize
+  abcxyz 
+\= Expect no match 
+  abc
+  abcxypqr  
+  
+/(*NO_START_OPT)xyz/auto_callout
+  abcxyz
+  
+/(*NO_AUTO_POSSESS)a+b/B
+
+/xyz/auto_callout,no_start_optimize
+  abcxyz 
+
+/^"((?(?=[a])[^"])|b)*"$/auto_callout
+    "ab"
+
+/^"((?(?=[a])[^"])|b)*"$/
+    "ab"
+
+/^X(?5)(a)(?|(b)|(q))(c)(d)Y/
+    XYabcdY
+
+/^X(?&N)(a)(?|(b)|(q))(c)(d)(?<N>Y)/
+    XYabcdY
+ 
+/Xa{2,4}b/
+    X\=ps
+    Xa\=ps
+    Xaa\=ps
+    Xaaa\=ps
+    Xaaaa\=ps
+    
+/Xa{2,4}?b/
+    X\=ps
+    Xa\=ps
+    Xaa\=ps
+    Xaaa\=ps
+    Xaaaa\=ps
+    
+/Xa{2,4}+b/
+    X\=ps
+    Xa\=ps
+    Xaa\=ps
+    Xaaa\=ps
+    Xaaaa\=ps
+    
+/X\d{2,4}b/
+    X\=ps
+    X3\=ps
+    X33\=ps
+    X333\=ps
+    X3333\=ps
+    
+/X\d{2,4}?b/
+    X\=ps
+    X3\=ps
+    X33\=ps
+    X333\=ps
+    X3333\=ps
+    
+/X\d{2,4}+b/
+    X\=ps
+    X3\=ps
+    X33\=ps
+    X333\=ps
+    X3333\=ps
+    
+/X\D{2,4}b/
+    X\=ps
+    Xa\=ps
+    Xaa\=ps
+    Xaaa\=ps
+    Xaaaa\=ps
+    
+/X\D{2,4}?b/
+    X\=ps
+    Xa\=ps
+    Xaa\=ps
+    Xaaa\=ps
+    Xaaaa\=ps
+    
+/X\D{2,4}+b/
+    X\=ps
+    Xa\=ps
+    Xaa\=ps
+    Xaaa\=ps
+    Xaaaa\=ps
+    
+/X[abc]{2,4}b/
+    X\=ps
+    Xa\=ps
+    Xaa\=ps
+    Xaaa\=ps
+    Xaaaa\=ps
+    
+/X[abc]{2,4}?b/
+    X\=ps
+    Xa\=ps
+    Xaa\=ps
+    Xaaa\=ps
+    Xaaaa\=ps
+    
+/X[abc]{2,4}+b/
+    X\=ps
+    Xa\=ps
+    Xaa\=ps
+    Xaaa\=ps
+    Xaaaa\=ps
+    
+/X[^a]{2,4}b/
+    X\=ps
+    Xz\=ps
+    Xzz\=ps
+    Xzzz\=ps
+    Xzzzz\=ps
+    
+/X[^a]{2,4}?b/
+    X\=ps
+    Xz\=ps
+    Xzz\=ps
+    Xzzz\=ps
+    Xzzzz\=ps
+    
+/X[^a]{2,4}+b/
+    X\=ps
+    Xz\=ps
+    Xzz\=ps
+    Xzzz\=ps
+    Xzzzz\=ps
+    
+/(Y)X\1{2,4}b/
+    YX\=ps
+    YXY\=ps
+    YXYY\=ps
+    YXYYY\=ps
+    YXYYYY\=ps
+    
+/(Y)X\1{2,4}?b/
+    YX\=ps
+    YXY\=ps
+    YXYY\=ps
+    YXYYY\=ps
+    YXYYYY\=ps
+    
+/(Y)X\1{2,4}+b/
+    YX\=ps
+    YXY\=ps
+    YXYY\=ps
+    YXYYY\=ps
+    YXYYYY\=ps
+    
+/\++\KZ|\d+X|9+Y/startchar
+    ++++123999\=ps
+    ++++123999Y\=ps
+    ++++Z1234\=ps
+
+/Z(*F)/
+\= Expect no match
+    Z\=ps
+    ZA\=ps
+    
+/Z(?!)/
+\= Expect no match
+    Z\=ps
+    ZA\=ps
+
+/dog(sbody)?/
+    dogs\=ps
+    dogs\=ph
+    
+/dog(sbody)??/
+    dogs\=ps
+    dogs\=ph
+
+/dog|dogsbody/
+    dogs\=ps
+    dogs\=ph
+ 
+/dogsbody|dog/
+    dogs\=ps
+    dogs\=ph
+
+/\bthe cat\b/
+    the cat\=ps
+    the cat\=ph
+
+/abc/
+   abc\=ps
+   abc\=ph
+   
+/abc\K123/startchar
+    xyzabc123pqr
+    xyzabc12\=ps
+    xyzabc12\=ph
+    
+/(?<=abc)123/
+    xyzabc123pqr 
+    xyzabc12\=ps
+    xyzabc12\=ph
+
+/\babc\b/
+    +++abc+++
+    +++ab\=ps
+    +++ab\=ph
+
+/(?&word)(?&element)(?(DEFINE)(?<element><[^m][^>]>[^<])(?<word>\w*+))/B
+
+/(?&word)(?&element)(?(DEFINE)(?<element><[^\d][^>]>[^<])(?<word>\w*+))/B
+
+/(ab)(x(y)z(cd(*ACCEPT)))pq/B
+
+/abc\K/aftertext,startchar
+    abcdef
+    abcdef\=notempty_atstart
+    xyzabcdef\=notempty_atstart
+\= Expect no match
+    abcdef\=notempty
+    xyzabcdef\=notempty
+    
+/^(?:(?=abc)|abc\K)/aftertext,startchar
+    abcdef
+    abcdef\=notempty_atstart
+\= Expect no match 
+    abcdef\=notempty
+
+/a?b?/aftertext
+    xyz
+    xyzabc
+    xyzabc\=notempty
+    xyzabc\=notempty_atstart
+    xyz\=notempty_atstart
+\= Expect no match 
+    xyz\=notempty
+
+/^a?b?/aftertext
+    xyz
+    xyzabc
+\= Expect no match 
+    xyzabc\=notempty
+    xyzabc\=notempty_atstart
+    xyz\=notempty_atstart
+    xyz\=notempty
+    
+/^(?<name>a|b\g<name>c)/
+    aaaa
+    bacxxx
+    bbaccxxx 
+    bbbacccxx
+
+/^(?<name>a|b\g'name'c)/
+    aaaa
+    bacxxx
+    bbaccxxx 
+    bbbacccxx
+
+/^(a|b\g<1>c)/
+    aaaa
+    bacxxx
+    bbaccxxx 
+    bbbacccxx
+
+/^(a|b\g'1'c)/
+    aaaa
+    bacxxx
+    bbaccxxx 
+    bbbacccxx
+
+/^(a|b\g'-1'c)/
+    aaaa
+    bacxxx
+    bbaccxxx 
+    bbbacccxx
+
+/(^(a|b\g<-1>c))/
+    aaaa
+    bacxxx
+    bbaccxxx 
+    bbbacccxx
+
+/(?-i:\g<name>)(?i:(?<name>a))/
+    XaaX
+    XAAX 
+
+/(?i:\g<name>)(?-i:(?<name>a))/
+    XaaX
+\= Expect no match 
+    XAAX 
+
+/(?-i:\g<+1>)(?i:(a))/
+    XaaX
+    XAAX 
+
+/(?=(?<regex>(?#simplesyntax)\$(?<name>[a-zA-Z_\x{7f}-\x{ff}][a-zA-Z0-9_\x{7f}-\x{ff}]*)(?:\[(?<index>[a-zA-Z0-9_\x{7f}-\x{ff}]+|\$\g<name>)\]|->\g<name>(\(.*?\))?)?|(?#simple syntax withbraces)\$\{(?:\g<name>(?<indices>\[(?:\g<index>|'(?:\\.|[^'\\])*'|"(?:\g<regex>|\\.|[^"\\])*")\])?|\g<complex>|\$\{\g<complex>\})\}|(?#complexsyntax)\{(?<complex>\$(?<segment>\g<name>(\g<indices>*|\(.*?\))?)(?:->\g<segment>)*|\$\g<complex>|\$\{\g<complex>\})\}))\{/
+
+/(?<n>a|b|c)\g<n>*/
+   abc
+   accccbbb 
+
+/^X(?7)(a)(?|(b)|(q)(r)(s))(c)(d)(Y)/
+    XYabcdY
+
+/(?<=b(?1)|zzz)(a)/
+    xbaax
+    xzzzax 
+
+/(a)(?<=b\1)/
+
+/(a)(?<=b+(?1))/
+
+/(a+)(?<=b(?1))/
+
+/(a(?<=b(?1)))/
+
+/(?<=b(?1))xyz/
+
+/(?<=b(?1))xyz(b+)pqrstuvew/
+
+/(a|bc)\1/I
+
+/(a|bc)\1{2,3}/I
+
+/(a|bc)(?1)/I
+
+/(a|b\1)(a|b\1)/I
+
+/(a|b\1){2}/I
+
+/(a|bbbb\1)(a|bbbb\1)/I
+
+/(a|bbbb\1){2}/I
+
+/^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]/I
+
+/<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>/Iis
+
+"(?>.*/)foo"I
+
+/(?(?=[^a-z]+[a-z])  \d{2}-[a-z]{3}-\d{2}  |  \d{2}-\d{2}-\d{2} ) /Ix
+
+/(?:(?:(?:(?:(?:(?:(?:(?:(?:(a|b|c))))))))))/Ii
+
+/(?:c|d)(?:)(?:aaaaaaaa(?:)(?:bbbbbbbb)(?:bbbbbbbb(?:))(?:bbbbbbbb(?:)(?:bbbbbbbb)))/I
+
+/<a[\s]+href[\s]*=[\s]*          # find <a href=
+ ([\"\'])?                       # find single or double quote
+ (?(1) (.*?)\1 | ([^\s]+))       # if quote found, match up to next matching
+                                 # quote, otherwise match up to next space
+/Iisx
+
+/^(?!:)                       # colon disallowed at start
+  (?:                         # start of item
+    (?: [0-9a-f]{1,4} |       # 1-4 hex digits or
+    (?(1)0 | () ) )           # if null previously matched, fail; else null
+    :                         # followed by colon
+  ){1,7}                      # end item; 1-7 of them required               
+  [0-9a-f]{1,4} $             # final hex number at end of string
+  (?(1)|.)                    # check that there was an empty component
+  /Iix
+
+/(?|(?<a>A)|(?<a>B))/I
+    AB\=copy=a
+    BA\=copy=a
+
+/(?|(?<a>A)|(?<b>B))/
+
+/(?:a(?<quote> (?<apostrophe>')|(?<realquote>")) |
+    b(?<quote> (?<apostrophe>')|(?<realquote>")) ) 
+    (?('quote')[a-z]+|[0-9]+)/Ix,dupnames
+    a"aaaaa
+    b"aaaaa 
+\= Expect no match 
+    b"11111
+    a"11111 
+    
+/^(?|(a)(b)(c)(?<D>d)|(?<D>e)) (?('D')X|Y)/IBx,dupnames
+    abcdX
+    eX
+\= Expect no match
+    abcdY
+    ey     
+    
+/(?<A>a) (b)(c)  (?<A>d  (?(R&A)$ | (?4)) )/IBx,dupnames
+    abcdd
+\= Expect no match
+    abcdde  
+
+/abcd*/
+    xxxxabcd\=ps
+    xxxxabcd\=ph
+
+/abcd*/i
+    xxxxabcd\=ps
+    xxxxabcd\=ph
+    XXXXABCD\=ps
+    XXXXABCD\=ph
+
+/abc\d*/
+    xxxxabc1\=ps
+    xxxxabc1\=ph
+
+/(a)bc\1*/
+    xxxxabca\=ps
+    xxxxabca\=ph
+
+/abc[de]*/
+    xxxxabcde\=ps
+    xxxxabcde\=ph
+
+# This is not in the Perl-compatible test because Perl seems currently to be
+# broken and not behaving as specified in that it *does* bumpalong after
+# hitting (*COMMIT). 
+
+/(?1)(A(*COMMIT)|B)D/
+    ABD
+    XABD
+    BAD
+    ABXABD  
+\= Expect no match 
+    ABX 
+    BAXBAD  
+
+/(\3)(\1)(a)/alt_bsux,allow_empty_class,match_unset_backref,dupnames
+    cat
+
+/(\3)(\1)(a)/I,alt_bsux,allow_empty_class,match_unset_backref,dupnames
+    cat
+
+/(\3)(\1)(a)/I
+\= Expect no match
+    cat
+
+/i(?(DEFINE)(?<s>a))/I
+    i
+    
+/()i(?(1)a)/I
+    ia
+
+/(?i)a(?-i)b|c/B
+    XabX
+    XAbX
+    CcC 
+\= Expect no match
+    XABX   
+
+/(?i)a(?s)b|c/B
+
+/(?i)a(?s-i)b|c/B
+
+/^(ab(c\1)d|x){2}$/B
+    xabcxd
+    
+/^(?&t)*+(?(DEFINE)(?<t>.))$/B
+
+/^(?&t)*(?(DEFINE)(?<t>.))$/B
+
+# This one is here because Perl gives the match as "b" rather than "ab". I
+# believe this to be a Perl bug.
+      
+/(?>a\Kb)z|(ab)/
+    ab\=startchar 
+
+/(?P<L1>(?P<L2>0|)|(?P>L2)(?P>L1))/
+    abcd
+    0abc 
+
+/abc(*MARK:)pqr/
+
+/abc(*:)pqr/
+
+/abc(*FAIL:123)xyz/
+
+# This should, and does, fail. In Perl, it does not, which I think is a 
+# bug because replacing the B in the pattern by (B|D) does make it fail.
+
+/A(*COMMIT)B/aftertext,mark
+\= Expect no match
+    ACABX
+
+# These should be different, but in Perl they are not, which I think
+# is a bug in Perl.
+
+/A(*THEN)B|A(*THEN)C/mark
+    AC
+
+/A(*PRUNE)B|A(*PRUNE)C/mark
+\= Expect no match
+    AC
+    
+# Mark names can be duplicated. Perl doesn't give a mark for this one,
+# though PCRE2 does.
+
+/^A(*:A)B|^X(*:A)Y/mark
+\= Expect no match
+    XAQQ
+    
+# COMMIT at the start of a pattern should be the same as an anchor. Perl 
+# optimizations defeat this. So does the PCRE2 optimization unless we disable
+# it.
+
+/(*COMMIT)ABC/
+    ABCDEFG
+    
+/(*COMMIT)ABC/no_start_optimize
+\= Expect no match
+    DEFGABC
+    
+/^(ab (c+(*THEN)cd) | xyz)/x
+\= Expect no match
+    abcccd  
+
+/^(ab (c+(*PRUNE)cd) | xyz)/x
+\= Expect no match
+    abcccd  
+
+/^(ab (c+(*FAIL)cd) | xyz)/x
+\= Expect no match
+    abcccd  
+    
+# Perl gets some of these wrong
+
+/(?>.(*ACCEPT))*?5/
+    abcde
+
+/(.(*ACCEPT))*?5/
+    abcde
+
+/(.(*ACCEPT))5/
+    abcde
+
+/(.(*ACCEPT))*5/
+    abcde
+
+/A\NB./B
+    ACBD
+\= Expect no match
+    A\nB
+    ACB\n   
+
+/A\NB./Bs
+    ACBD
+    ACB\n 
+\= Expect no match
+    A\nB  
+  
+/A\NB/newline=crlf
+    A\nB
+    A\rB
+\= Expect no match
+    A\r\nB    
+
+/\R+b/B
+
+/\R+\n/B
+
+/\R+\d/B
+
+/\d*\R/B
+
+/\s*\R/B
+    \x20\x0a
+    \x20\x0d
+    \x20\x0d\x0a
+
+/\S*\R/B
+    a\x0a
+
+/X\h*\R/B
+    X\x20\x0a
+
+/X\H*\R/B
+    X\x0d\x0a
+
+/X\H+\R/B
+    X\x0d\x0a
+
+/X\H++\R/B
+\= Expect no match
+    X\x0d\x0a
+
+/(?<=abc)def/
+    abc\=ph
+
+/abc$/
+    abc
+    abc\=ps
+    abc\=ph
+
+/abc$/m
+    abc
+    abc\n
+    abc\=ph
+    abc\n\=ph
+    abc\=ps
+    abc\n\=ps
+
+/abc\z/
+    abc
+    abc\=ps
+    abc\=ph
+
+/abc\Z/
+    abc
+    abc\=ps
+    abc\=ph
+
+/abc\b/
+    abc
+    abc\=ps
+    abc\=ph
+
+/abc\B/
+    abc\=ps
+    abc\=ph
+\= Expect no match
+    abc
+
+/.+/
+\= Bad offsets
+    abc\=offset=4
+    abc\=offset=-4 
+\= Valid data
+    abc\=offset=0
+    abc\=offset=1
+    abc\=offset=2
+\= Expect no match
+    abc\=offset=3
+
+/^\cģ/
+
+/(?P<abn>(?P=abn)xxx)/B
+
+/(a\1z)/B
+
+/(?P<abn>(?P=abn)(?<badstufxxx)/B
+
+/(?P<abn>(?P=axn)xxx)/B
+
+/(?P<abn>(?P=axn)xxx)(?<axn>yy)/B
+
+# These tests are here because Perl gets the first one wrong. 
+
+/(\R*)(.)/s
+    \r\n
+    \r\r\n\n\r 
+    \r\r\n\n\r\n 
+
+/(\R)*(.)/s
+    \r\n
+    \r\r\n\n\r 
+    \r\r\n\n\r\n 
+
+/((?>\r\n|\n|\x0b|\f|\r|\x85)*)(.)/s
+    \r\n
+    \r\r\n\n\r 
+    \r\r\n\n\r\n 
+
+# ------------- 
+
+/^abc$/B
+
+/^abc$/Bm
+
+/^(a)*+(\w)/
+    aaaaX
+\= Expect no match 
+    aaaa
+
+/^(?:a)*+(\w)/
+    aaaaX
+\= Expect no match 
+    aaaa
+
+/(a)++1234/IB
+
+/([abc])++1234/I
+
+/(?<=(abc)+)X/
+
+/(^ab)/I
+
+/(^ab)++/I
+
+/(^ab|^)+/I
+
+/(^ab|^)++/I
+
+/(?:^ab)/I
+
+/(?:^ab)++/I
+
+/(?:^ab|^)+/I
+
+/(?:^ab|^)++/I
+
+/(.*ab)/I
+
+/(.*ab)++/I
+
+/(.*ab|.*)+/I
+
+/(.*ab|.*)++/I
+
+/(?:.*ab)/I
+
+/(?:.*ab)++/I
+
+/(?:.*ab|.*)+/I
+
+/(?:.*ab|.*)++/I
+
+/(?=a)[bcd]/I
+
+/((?=a))[bcd]/I
+
+/((?=a))+[bcd]/I
+
+/((?=a))++[bcd]/I
+
+/(?=a+)[bcd]/Ii
+
+/(?=a+?)[bcd]/Ii
+
+/(?=a++)[bcd]/Ii
+
+/(?=a{3})[bcd]/Ii
+
+/(abc)\1+/
+
+# Perl doesn't get these right IMO (the 3rd is PCRE2-specific) 
+
+/(?1)(?:(b(*ACCEPT))){0}/
+    b
+
+/(?1)(?:(b(*ACCEPT))){0}c/
+    bc
+\= Expect no match 
+    b 
+
+/(?1)(?:((*ACCEPT))){0}c/
+    c
+    c\=notempty
+
+/^.*?(?(?=a)a|b(*THEN)c)/
+\= Expect no match 
+    ba
+
+/^.*?(?(?=a)a|bc)/
+    ba
+
+/^.*?(?(?=a)a(*THEN)b|c)/
+\= Expect no match 
+    ac
+
+/^.*?(?(?=a)a(*THEN)b)c/
+\= Expect no match 
+    ac
+
+/^.*?(a(*THEN)b)c/
+\= Expect no match 
+    aabc
+    
+/^.*? (?1) c (?(DEFINE)(a(*THEN)b))/x
+    aabc
+
+/^.*?(a(*THEN)b|z)c/
+    aabc
+
+/^.*?(z|a(*THEN)b)c/
+    aabc
+
+# These are here because they are not Perl-compatible; the studying means the
+# mark is not seen.
+
+/(*MARK:A)(*SKIP:B)(C|X)/mark
+    C
+\= Expect no match 
+    D
+     
+/(*:A)A+(*SKIP:A)(B|Z)/mark
+\= Expect no match 
+    AAAC
+
+# ----------------------------
+
+"(?=a*(*ACCEPT)b)c"
+    c
+    c\=notempty
+    
+/(?1)c(?(DEFINE)((*ACCEPT)b))/
+    c
+    c\=notempty
+    
+/(?>(*ACCEPT)b)c/
+    c
+\= Expect no match 
+    c\=notempty
+
+/(?:(?>(a)))+a%/allaftertext
+    %aa%
+
+/(a)b|ac/allaftertext
+    ac\=ovector=1
+    
+/(a)(b)x|abc/allaftertext
+     abc\=ovector=2
+
+/(a)bc|(a)(b)\2/
+    abc\=ovector=1
+    abc\=ovector=2
+    aba\=ovector=1
+    aba\=ovector=2
+    aba\=ovector=3
+    aba\=ovector=4
+
+/(?(DEFINE)(a(?2)|b)(b(?1)|a))(?:(?1)|(?2))/I
+
+/(a(?2)|b)(b(?1)|a)(?:(?1)|(?2))/I
+
+/(a(?2)|b)(b(?1)|a)(?1)(?2)/I
+
+/(abc)(?1)/I
+
+/(?:(foo)|(bar)|(baz))X/allcaptures
+    bazfooX
+    foobazbarX
+    barfooX
+    bazX
+    foobarbazX    
+    bazfooX\=ovector=0
+    bazfooX\=ovector=1
+    bazfooX\=ovector=2
+    bazfooX\=ovector=3
+
+/(?=abc){3}abc/B
+
+/(?=abc)+abc/B
+
+/(?=abc)++abc/B
+
+/(?=abc){0}xyz/B
+
+/(?=(a))?./B
+
+/(?=(a))??./B
+
+/^(?=(a)){0}b(?1)/B
+
+/(?(DEFINE)(a))?b(?1)/B
+
+/^(?=(?1))?[az]([abc])d/B
+
+/^(?!a){0}\w+/B
+
+/(?<=(abc))?xyz/B
+
+/[:a[:abc]b:]/B
+
+/^(a(*:A)(d|e(*:B))z|aeq)/auto_callout
+    adz
+    aez
+    aeqwerty
+
+/.(*F)/
+\= Expect no match
+    abc\=ph
+
+/\btype\b\W*?\btext\b\W*?\bjavascript\b/I
+
+/\btype\b\W*?\btext\b\W*?\bjavascript\b|\burl\b\W*?\bshell:|<input\b.*?\btype\b\W*?\bimage\b|\bonkeyup\b\W*?\=/I
+
+/a(*SKIP)c|b(*ACCEPT)|/I,aftertext
+    a
+
+/a(*SKIP)c|b(*ACCEPT)cd(*ACCEPT)|x/I
+    ax
+
+'a*(*ACCEPT)b'aftertext
+    abc\=notempty_atstart
+    bbb\=notempty_atstart
+\= Expect no match
+    \=notempty_atstart
+
+/(*ACCEPT)a/I,aftertext
+    bax
+
+/z(*ACCEPT)a/I,aftertext
+    baxzbx
+
+/^(?>a+)(?>(z+))\w/B
+    aaaazzzzb
+\= Expect no match
+    aazz  
+
+/(.)(\1|a(?2))/
+    bab
+    
+/\1|(.)(?R)\1/
+    cbbbc
+    
+/(.)((?(1)c|a)|a(?2))/
+\= Expect no match
+    baa  
+
+/(?P<abn>(?P=abn)xxx)/B
+
+/(a\1z)/B
+
+/^a\x41z/alt_bsux,allow_empty_class,match_unset_backref,dupnames
+    aAz
+\= Expect no match
+    ax41z
+
+/^a[m\x41]z/alt_bsux,allow_empty_class,match_unset_backref,dupnames
+    aAz
+
+/^a\x1z/alt_bsux,allow_empty_class,match_unset_backref,dupnames
+    ax1z
+
+/^a\u0041z/alt_bsux,allow_empty_class,match_unset_backref,dupnames
+    aAz
+\= Expect no match
+    au0041z
+
+/^a[m\u0041]z/alt_bsux,allow_empty_class,match_unset_backref,dupnames
+    aAz
+
+/^a\u041z/alt_bsux,allow_empty_class,match_unset_backref,dupnames
+    au041z
+\= Expect no match
+    aAz
+
+/^a\U0041z/alt_bsux,allow_empty_class,match_unset_backref,dupnames
+    aU0041z
+\= Expect no match
+    aAz
+
+/(?(?=c)c|d)++Y/B
+
+/(?(?=c)c|d)*+Y/B
+
+/a[\NB]c/
+    aNc
+    
+/a[B-\Nc]/
+
+/a[B\Nc]/
+
+/(a)(?2){0,1999}?(b)/
+
+/(a)(?(DEFINE)(b))(?2){0,1999}?(?2)/
+
+# This test, with something more complicated than individual letters, causes
+# different behaviour in Perl. Perhaps it disables some optimization; no tag is
+# passed back for the failures, whereas in PCRE2 there is a tag.
+    
+/(A|P)(*:A)(B|P) | (X|P)(X|P)(*:B)(Y|P)/x,mark
+    AABC
+    XXYZ 
+\= Expect no match
+    XAQQ  
+    XAQQXZZ  
+    AXQQQ 
+    AXXQQQ 
+
+# Perl doesn't give marks for these, though it does if the alternatives are
+# replaced by single letters. 
+    
+/(b|q)(*:m)f|a(*:n)w/mark
+    aw 
+\= Expect no match 
+    abc
+
+/(q|b)(*:m)f|a(*:n)w/mark
+    aw 
+\= Expect no match 
+    abc
+
+# After a partial match, the behaviour is as for a failure. 
+
+/^a(*:X)bcde/mark
+   abc\=ps
+   
+# These are here because Perl doesn't return a mark, except for the first.
+
+/(?=(*:x))(q|)/aftertext,mark
+    abc
+
+/(?=(*:x))((*:y)q|)/aftertext,mark
+    abc
+
+/(?=(*:x))(?:(*:y)q|)/aftertext,mark
+    abc
+
+/(?=(*:x))(?>(*:y)q|)/aftertext,mark
+    abc
+
+/(?=a(*:x))(?!a(*:y)c)/aftertext,mark
+    ab
+
+/(?=a(*:x))(?=a(*:y)c|)/aftertext,mark
+    ab
+
+/(..)\1/
+    ab\=ps
+    aba\=ps
+    abab\=ps
+
+/(..)\1/i
+    ab\=ps
+    abA\=ps
+    aBAb\=ps
+
+/(..)\1{2,}/
+    ab\=ps
+    aba\=ps
+    abab\=ps
+    ababa\=ps
+    ababab\=ps
+    ababab\=ph
+    abababa\=ps
+    abababa\=ph
+
+/(..)\1{2,}/i
+    ab\=ps
+    aBa\=ps
+    aBAb\=ps
+    AbaBA\=ps
+    abABAb\=ps
+    aBAbaB\=ph
+    abABabA\=ps
+    abaBABa\=ph
+
+/(..)\1{2,}?x/i
+    ab\=ps
+    abA\=ps
+    aBAb\=ps
+    abaBA\=ps
+    abAbaB\=ps
+    abaBabA\=ps
+    abAbABaBx\=ps
+
+/^(..)\1/
+    aba\=ps
+
+/^(..)\1{2,3}x/
+    aba\=ps
+    ababa\=ps
+    ababa\=ph
+    abababx
+    ababababx  
+
+/^(..)\1{2,3}?x/
+    aba\=ps
+    ababa\=ps
+    ababa\=ph
+    abababx
+    ababababx  
+    
+/^(..)(\1{2,3})ab/
+    abababab
+
+/^\R/
+    \r\=ps
+    \r\=ph
+    
+/^\R{2,3}x/
+    \r\=ps
+    \r\=ph
+    \r\r\=ps
+    \r\r\=ph
+    \r\r\r\=ps
+    \r\r\r\=ph
+    \r\rx
+    \r\r\rx    
+
+/^\R{2,3}?x/
+    \r\=ps
+    \r\=ph
+    \r\r\=ps
+    \r\r\=ph
+    \r\r\r\=ps
+    \r\r\r\=ph
+    \r\rx
+    \r\r\rx    
+    
+/^\R?x/
+    \r\=ps
+    \r\=ph
+    x
+    \rx  
+
+/^\R+x/
+    \r\=ps
+    \r\=ph
+    \r\n\=ps
+    \r\n\=ph
+    \rx  
+
+/^a$/newline=crlf
+    a\r\=ps
+    a\r\=ph
+
+/^a$/m,newline=crlf
+    a\r\=ps
+    a\r\=ph
+
+/^(a$|a\r)/newline=crlf
+    a\r\=ps
+    a\r\=ph
+
+/^(a$|a\r)/m,newline=crlf
+    a\r\=ps
+    a\r\=ph
+
+/./newline=crlf
+    \r\=ps
+    \r\=ph
+  
+/.{2,3}/newline=crlf
+    \r\=ps
+    \r\=ph
+    \r\r\=ps
+    \r\r\=ph
+    \r\r\r\=ps
+    \r\r\r\=ph
+
+/.{2,3}?/newline=crlf
+    \r\=ps
+    \r\=ph
+    \r\r\=ps
+    \r\r\=ph
+    \r\r\r\=ps
+    \r\r\r\=ph
+
+"AB(C(D))(E(F))?(?(?=\2)(?=\4))"
+    ABCDGHI\=ovector=01
+    
+# These are all run as real matches in test 1; here we are just checking the
+# settings of the anchored and startline bits.  
+
+/(?>.*?a)(?<=ba)/I
+
+/(?:.*?a)(?<=ba)/I
+
+/.*?a(*PRUNE)b/I
+
+/.*?a(*PRUNE)b/Is
+
+/^a(*PRUNE)b/Is
+
+/.*?a(*SKIP)b/I
+
+/(?>.*?a)b/Is
+
+/(?>.*?a)b/I
+
+/(?>^a)b/Is
+
+/(?>.*?)(?<=(abcd)|(wxyz))/I
+
+/(?>.*)(?<=(abcd)|(wxyz))/I
+
+"(?>.*)foo"I
+
+"(?>.*?)foo"I
+
+/(?>^abc)/Im
+
+/(?>.*abc)/Im
+
+/(?:.*abc)/Im
+
+/(?:(a)+(?C1)bb|aa(?C2)b)/
+    aab\=callout_capture
+   
+/(?:(a)++(?C1)bb|aa(?C2)b)/
+    aab\=callout_capture
+    
+/(?:(?>(a))(?C1)bb|aa(?C2)b)/
+    aab\=callout_capture
+
+/(?:(?1)(?C1)x|ab(?C2))((a)){0}/
+    aab\=callout_capture
+
+/(?1)(?C1)((a)(?C2)){0}/
+    aab\=callout_capture
+
+/(?:(a)+(?C1)bb|aa(?C2)b)++/
+    aab\=callout_capture
+    aab\=callout_capture,ovector=1
+
+/(ab)x|ab/
+    ab\=ovector=0
+    ab\=ovector=1
+  
+/(?<=123)(*MARK:xx)abc/mark
+    xxxx123a\=ph
+    xxxx123a\=ps
+    
+/123\Kabc/startchar
+    xxxx123a\=ph
+    xxxx123a\=ps
+
+/^(?(?=a)aa|bb)/auto_callout
+    bb
+
+/(?C1)^(?C2)(?(?C99)(?=(?C3)a(?C4))(?C5)a(?C6)a(?C7)|(?C8)b(?C9)b(?C10))(?C11)/
+    bb
+
+# Perl seems to have a bug with this one.
+
+/aaaaa(*COMMIT)(*PRUNE)b|a+c/
+    aaaaaac
+    
+# Here are some that Perl treats differently because of the way it handles
+# backtracking verbs. 
+
+/(?!a(*COMMIT)b)ac|ad/
+     ac
+     ad 
+
+/^(?!a(*THEN)b|ac)../
+     ad 
+\= Expect no match
+     ac
+
+/^(?=a(*THEN)b|ac)/
+    ac
+    
+/\A.*?(?:a|b(*THEN)c)/
+    ba
+
+/\A.*?(?:a|b(*THEN)c)++/
+    ba
+
+/\A.*?(?:a|b(*THEN)c|d)/
+    ba
+
+/(?:(a(*MARK:X)a+(*SKIP:X)b)){0}(?:(?1)|aac)/
+    aac 
+
+/\A.*?(a|b(*THEN)c)/
+    ba
+
+/^(A(*THEN)B|A(*THEN)D)/
+    AD           
+    
+/(?!b(*THEN)a)bn|bnn/
+    bnn
+
+/(?(?=b(*SKIP)a)bn|bnn)/
+\= Expect no match
+    bnn
+
+/(?=b(*THEN)a|)bn|bnn/
+    bnn
+
+# This test causes a segfault with Perl 5.18.0 
+
+/^(?=(a)){0}b(?1)/
+    backgammon
+
+/(?|(?<n>f)|(?<n>b))/I,dupnames
+
+/(?<a>abc)(?<a>z)\k<a>()/IB,dupnames
+
+/a*[bcd]/B
+
+/[bcd]*a/B
+
+# A complete set of tests for auto-possessification of character types, but
+# omitting \C because it might be disabled (it has its own tests).
+
+/\D+\D \D+\d \D+\S \D+\s \D+\W \D+\w \D+. \D+\R \D+\H \D+\h \D+\V \D+\v \D+\Z \D+\z \D+$/Bx
+
+/\d+\D \d+\d \d+\S \d+\s \d+\W \d+\w \d+. \d+\R \d+\H \d+\h \d+\V \d+\v \d+\Z \d+\z \d+$/Bx
+
+/\S+\D \S+\d \S+\S \S+\s \S+\W \S+\w \S+. \S+\R \S+\H \S+\h \S+\V \S+\v \S+\Z \S+\z \S+$/Bx
+
+/\s+\D \s+\d \s+\S \s+\s \s+\W \s+\w \s+. \s+\R \s+\H \s+\h \s+\V \s+\v \s+\Z \s+\z \s+$/Bx
+
+/\W+\D \W+\d \W+\S \W+\s \W+\W \W+\w \W+. \W+\R \W+\H \W+\h \W+\V \W+\v \W+\Z \W+\z \W+$/Bx
+
+/\w+\D \w+\d \w+\S \w+\s \w+\W \w+\w \w+. \w+\R \w+\H \w+\h \w+\V \w+\v \w+\Z \w+\z \w+$/Bx
+
+/\R+\D \R+\d \R+\S \R+\s \R+\W \R+\w \R+. \R+\R \R+\H \R+\h \R+\V \R+\v \R+\Z \R+\z \R+$/Bx
+
+/\H+\D \H+\d \H+\S \H+\s \H+\W \H+\w \H+. \H+\R \H+\H \H+\h \H+\V \H+\v \H+\Z \H+\z \H+$/Bx
+
+/\h+\D \h+\d \h+\S \h+\s \h+\W \h+\w \h+. \h+\R \h+\H \h+\h \h+\V \h+\v \h+\Z \h+\z \h+$/Bx
+
+/\V+\D \V+\d \V+\S \V+\s \V+\W \V+\w \V+. \V+\R \V+\H \V+\h \V+\V \V+\v \V+\Z \V+\z \V+$/Bx
+
+/\v+\D \v+\d \v+\S \v+\s \v+\W \v+\w \v+. \v+\R \v+\H \v+\h \v+\V \v+\v \v+\Z \v+\z \v+$/Bx
+
+/ a+\D  a+\d  a+\S  a+\s  a+\W  a+\w  a+.  a+\R  a+\H  a+\h  a+\V  a+\v  a+\Z  a+\z  a+$/Bx
+
+/\n+\D \n+\d \n+\S \n+\s \n+\W \n+\w \n+. \n+\R \n+\H \n+\h \n+\V \n+\v \n+\Z \n+\z \n+$/Bx
+
+/ .+\D  .+\d  .+\S  .+\s  .+\W  .+\w  .+.  .+\R  .+\H  .+\h  .+\V  .+\v  .+\Z  .+\z  .+$/Bx
+
+/ .+\D  .+\d  .+\S  .+\s  .+\W  .+\w  .+.  .+\R  .+\H  .+\h  .+\V  .+\v  .+\Z  .+\z  .+$/Bsx
+
+/ \D+$  \d+$  \S+$  \s+$  \W+$  \w+$  \R+$  \H+$  \h+$  \V+$ \v+$  a+$   \n+$  .+$  .+$/Bmx
+
+/(?=a+)a(a+)++a/B
+
+/a+(bb|cc)a+(?:bb|cc)a+(?>bb|cc)a+(?:bb|cc)+a+(aa)a+(?:bb|aa)/B
+
+/a+(bb|cc)?#a+(?:bb|cc)??#a+(?:bb|cc)?+#a+(?:bb|cc)*#a+(bb|cc)?a#a+(?:aa)?/B
+
+/a+(?:bb)?a#a+(?:|||)#a+(?:|b)a#a+(?:|||)?a/B
+
+/[ab]*/B
+    aaaa
+
+/[ab]*?/B
+    aaaa
+
+/[ab]?/B
+    aaaa
+
+/[ab]??/B
+    aaaa
+
+/[ab]+/B
+    aaaa
+
+/[ab]+?/B
+    aaaa
+
+/[ab]{2,3}/B
+    aaaa
+
+/[ab]{2,3}?/B
+    aaaa
+
+/[ab]{2,}/B
+    aaaa
+
+/[ab]{2,}?/B
+    aaaa
+
+/\d+\s{0,5}=\s*\S?=\w{0,4}\W*/B
+
+/[a-d]{5,12}[e-z0-9]*#[^a-z]+[b-y]*a[2-7]?[^0-9a-z]+/B
+
+/[a-z]*\s#[ \t]?\S#[a-c]*\S#[C-G]+?\d#[4-8]*\D#[4-9,]*\D#[!$]{0,5}\w#[M-Xf-l]+\W#[a-c,]?\W/B
+
+/a+(aa|bb)*c#a*(bb|cc)*a#a?(bb|cc)*d#[a-f]*(g|hh)*f/B
+
+/[a-f]*(g|hh|i)*i#[a-x]{4,}(y{0,6})*y#[a-k]+(ll|mm)+n/B
+
+/[a-f]*(?>gg|hh)+#[a-f]*(?>gg|hh)?#[a-f]*(?>gg|hh)*a#[a-f]*(?>gg|hh)*h/B
+
+/[a-c]*d/IB
+
+/[a-c]+d/IB
+
+/[a-c]?d/IB
+
+/[a-c]{4,6}d/IB
+
+/[a-c]{0,6}d/IB
+
+# End of special auto-possessive tests 
+
+/^A\o{1239}B/
+    A\123B
+
+/^A\oB/
+    
+/^A\x{zz}B/
+
+/^A\x{12Z/
+
+/^A\x{/
+
+/[ab]++/B,no_auto_possess
+
+/[^ab]*+/B,no_auto_possess
+
+/a{4}+/B,no_auto_possess
+
+/a{4}+/Bi,no_auto_possess
+
+/[a-[:digit:]]+/
+
+/[A-[:digit:]]+/
+
+/[a-[.xxx.]]+/
+
+/[a-[=xxx=]]+/
+
+/[a-[!xxx!]]+/
+
+/[A-[!xxx!]]+/
+    A]]]
+
+/[a-\d]+/
+
+/(?<0abc>xx)/
+
+/(?&1abc)xx(?<1abc>y)/
+
+/(?<ab-cd>xx)/
+
+/(?'0abc'xx)/
+
+/(?P<0abc>xx)/
+
+/\k<5ghj>/
+
+/\k'5ghj'/
+
+/\k{2fgh}/
+
+/(?P=8yuki)/
+
+/\g{4df}/
+
+/(?&1abc)xx(?<1abc>y)/
+
+/(?P>1abc)xx(?<1abc>y)/
+
+/\g'3gh'/
+
+/\g<5fg>/
+
+/(?(<4gh>)abc)/
+
+/(?('4gh')abc)/
+
+/(?(4gh)abc)/
+
+/(?(R&6yh)abc)/
+
+/(((a\2)|(a*)\g<-1>))*a?/B
+
+# Test the ugly "start or end of word" compatibility syntax.
+
+/[[:<:]]red[[:>:]]/B
+    little red riding hood
+    a /red/ thing 
+    red is a colour
+    put it all on red  
+\= Expect no match
+    no reduction
+    Alfred Winifred
+    
+/[a[:<:]] should give error/
+
+/(?=ab\K)/aftertext
+    abcd\=startchar
+
+/abcd/newline=lf,firstline
+\= Expect no match
+    xx\nxabcd
+    
+# Test stack guard external calls.
+
+/(((a)))/stackguard=1
+
+/(((a)))/stackguard=2
+
+/(((a)))/stackguard=3
+
+/(((((a)))))/
+
+# End stack guard tests
+
+/^\w+(?>\s*)(?<=\w)/B
+
+/\othing/
+
+/\o{}/
+
+/\o{whatever}/
+
+/\xthing/
+
+/\x{}/
+
+/\x{whatever}/
+
+/A\8B/
+
+/A\9B/
+
+# This one is here because Perl fails to match "12" for this pattern when the $ 
+# is present.
+    
+/^(?(?=abc)\w{3}:|\d\d)$/
+    abc:
+    12
+\= Expect no match
+    123
+    xyz    
+
+# Perl gets this one wrong, giving "a" as the after text for ca and failing to 
+# match for cd.
+
+/(?(?=ab)ab)/aftertext
+    abxxx
+    ca
+    cd 
+    
+# This should test both paths for processing OP_RECURSE. 
+
+/(?(R)a+|(?R)b)/
+    aaaabcde
+    aaaabcde\=ovector=100
+
+/a*?b*?/
+    ab
+
+/(*NOTEMPTY)a*?b*?/
+    ab
+    ba
+    cb  
+
+/(*NOTEMPTY_ATSTART)a*?b*?/aftertext
+    ab
+    cdab 
+
+/(?(VERSION>=10.0)yes|no)/I
+    yesno
+    
+/(?(VERSION=8)yes){3}/BI,aftertext
+    yesno
+
+/(?(VERSION=8)yes|no){3}/I
+    yesnononoyes
+\= Expect no match
+    yesno   
+
+/(?:(?<VERSION>abc)|xyz)(?(VERSION)yes|no)/I
+    abcyes
+    xyzno
+\= Expect no match
+    abcno
+    xyzyes    
+
+/(?(VERSION<10)yes|no)/
+
+/(?(VERSION>10)yes|no)/
+
+/(?(VERSION>=10.0.0)yes|no)/
+
+/(?(VERSION=10.101)yes|no)/
+
+/abcd/I
+
+/abcd/I,no_start_optimize
+
+/(|ab)*?d/I
+   abd
+   xyd 
+
+/(|ab)*?d/I,no_start_optimize
+   abd
+   xyd 
+
+/\k<A>*(?<A>aa)(?<A>bb)/match_unset_backref,dupnames
+    aabb
+
+/(((((a)))))/parens_nest_limit=2
+
+/abc/replace=XYZ
+    123123
+    123abc123
+    123abc123abc123
+    123123\=zero_terminate
+    123abc123\=zero_terminate
+    123abc123abc123\=zero_terminate
+
+/abc/g,replace=XYZ
+    123abc123
+    123abc123abc123
+
+/abc/replace=X$$Z
+    123abc123
+
+/abc/g,replace=X$$Z
+    123abc123abc123
+
+/a(b)c(d)e/replace=X$1Y${2}Z
+    "abcde"
+
+/a(b)c(d)e/replace=X$1Y${2}Z,global
+    "abcde-abcde"
+
+/a(?<ONE>b)c(?<TWO>d)e/replace=X$ONE+${TWO}Z
+    "abcde"
+
+/a(?<ONE>b)c(?<TWO>d)e/g,replace=X$ONE+${TWO}Z
+    "abcde-abcde-"
+
+/abc/replace=a$++
+    123abc
+
+/abc/replace=a$bad
+    123abc
+
+/abc/replace=a${A234567890123456789_123456789012}z
+    123abc
+
+/abc/replace=a${A23456789012345678901234567890123}z
+    123abc
+
+/abc/replace=a${bcd
+    123abc
+
+/abc/replace=a${b+d}z
+    123abc
+
+/abc/replace=[10]XYZ
+    123abc123
+
+/abc/replace=[9]XYZ
+    123abc123
+    
+/abc/replace=xyz
+    1abc2\=partial_hard
+
+/abc/replace=xyz
+    123abc456
+    123abc456\=replace=pqr
+    123abc456abc789
+    123abc456abc789\=g
+
+/(?<=abc)(|def)/g,replace=<$0>
+    123abcxyzabcdef789abcpqr
+    
+/./replace=$0
+    a
+    
+/(.)(.)/replace=$2+$1
+    abc
+    
+/(?<A>.)(?<B>.)/replace=$B+$A
+    abc
+    
+/(.)(.)/g,replace=$2$1
+    abcdefgh  
+    
+/(*:pear)apple|(*:orange)lemon|(*:strawberry)blackberry/g,replace=${*MARK}
+    apple lemon blackberry
+    apple strudel
+    fruitless  
+
+/(*:pear)apple|(*:orange)lemon|(*:strawberry)blackberry/replace=${*MARK} sauce,
+    apple lemon blackberry
+
+/(*:pear)apple|(*:orange)lemon|(*:strawberry)blackberry/g,replace=<$*MARK>
+    apple lemon blackberry
+    apple strudel
+    fruitless  
+    
+/(*:pear)apple/g,replace=${*MARKING} 
+    apple lemon blackberry
+
+/(*:pear)apple/g,replace=${*MARK-time
+    apple lemon blackberry
+
+/(*:pear)apple/g,replace=${*mark} 
+    apple lemon blackberry
+
+/(*:pear)apple|(*:orange)lemon|(*:strawberry)blackberry/g,replace=<$*MARKET>
+    apple lemon blackberry
+
+/(*:pear)apple|(*:orange)lemon|(*:strawberry)blackberry/g,replace=[22]${*MARK}
+    apple lemon blackberry
+    apple lemon blackberry\=substitute_overflow_length
+
+/(*:pear)apple|(*:orange)lemon|(*:strawberry)blackberry/g,replace=[23]${*MARK}
+    apple lemon blackberry
+
+/abc/
+    123abc123\=replace=[9]XYZ
+    123abc123\=substitute_overflow_length,replace=[9]XYZ
+    123abc123\=substitute_overflow_length,replace=[6]XYZ
+    123abc123\=substitute_overflow_length,replace=[1]XYZ
+    123abc123\=substitute_overflow_length,replace=[0]XYZ
+
+/a(b)c/
+    123abc123\=replace=[9]x$1z
+    123abc123\=substitute_overflow_length,replace=[9]x$1z
+    123abc123\=substitute_overflow_length,replace=[6]x$1z
+    123abc123\=substitute_overflow_length,replace=[1]x$1z
+    123abc123\=substitute_overflow_length,replace=[0]x$1z
+
+"((?=(?(?=(?(?=(?(?=()))))))))"
+    a
+
+"(?(?=)==)(((((((((?=)))))))))"
+\= Expect no match
+    a
+
+/(a)(b)|(c)/
+    XcX\=ovector=2,get=1,get=2,get=3,get=4,getall
+    
+/x(?=ab\K)/
+    xab\=get=0 
+    xab\=copy=0 
+    xab\=getall
+
+/(?<A>a)|(?<A>b)/dupnames
+    a\=ovector=1,copy=A,get=A,get=2
+    a\=ovector=2,copy=A,get=A,get=2
+    b\=ovector=2,copy=A,get=A,get=2
+
+/a(b)c(d)/
+    abc\=ph,copy=0,copy=1,getall
+
+/^abc/info
+
+/^abc/info,no_dotstar_anchor
+
+/.*\d/info,auto_callout
+\= Expect no match
+    aaa
+
+/.*\d/info,no_dotstar_anchor,auto_callout
+\= Expect no match
+    aaa
+
+/.*\d/dotall,info
+
+/.*\d/dotall,no_dotstar_anchor,info
+
+/(*NO_DOTSTAR_ANCHOR)(?s).*\d/info
+
+'^(?:(a)|b)(?(1)A|B)'
+    aA123\=ovector=1
+    aA123\=ovector=2
+
+'^(?:(?<AA>a)|b)(?(<AA>)A|B)'
+    aA123\=ovector=1
+    aA123\=ovector=2
+
+'^(?<AA>)(?:(?<AA>a)|b)(?(<AA>)A|B)'dupnames
+    aA123\=ovector=1
+    aA123\=ovector=2
+    aA123\=ovector=3
+
+'^(?:(?<AA>X)|)(?:(?<AA>a)|b)\k{AA}'dupnames
+    aa123\=ovector=1
+    aa123\=ovector=2
+    aa123\=ovector=3
+
+/(?<N111>(?J)(?<N111>1(111111)11|)1|1|)(?(<N111>)1)/
+
+/(?<N>(?J)(?<N>))(?-J)\k<N>/
+
+# Quantifiers are not allowed on condition assertions, but are otherwise
+# OK in conditions.
+
+/(?(?=0)?)+/
+
+/(?(?=0)(?=00)?00765)/
+     00765
+
+/(?(?=0)(?=00)?00765|(?!3).56)/
+     00765
+     456
+\= Expect no match
+     356   
+
+'^(a)*+(\w)'
+    g
+    g\=ovector=1 
+
+'^(?:a)*+(\w)'
+    g
+    g\=ovector=1 
+    
+# These two pattern showeds up compile-time bugs
+
+"((?2){0,1999}())?"
+
+/((?+1)(\1))/B
+
+# Callouts with string arguments
+
+/a(?C"/
+
+/a(?C"a/
+
+/a(?C"a"/
+
+/a(?C"a"bcde(?C"b")xyz/
+
+/a(?C"a)b""c")/B
+
+/ab(?C" any text with spaces ")cde/B
+    abcde
+    12abcde
+
+/^a(b)c(?C1)def/
+      abcdef
+
+/^a(b)c(?C"AB")def/
+      abcdef
+
+/^a(b)c(?C1)def/
+      abcdef\=callout_capture
+
+/^a(b)c(?C{AB})def/B
+      abcdef\=callout_capture
+
+/(?C`a``b`)(?C'a''b')(?C"a""b")(?C^a^^b^)(?C%a%%b%)(?C#a##b#)(?C$a$$b$)(?C{a}}b})/B,callout_info
+
+/(?:a(?C`code`)){3}/B
+
+/^(?(?C25)(?=abc)abcd|xyz)/B,callout_info
+    abcdefg
+    xyz123 
+
+/^(?(?C$abc$)(?=abc)abcd|xyz)/B
+    abcdefg
+    xyz123 
+
+/^ab(?C'first')cd(?C"second")ef/
+    abcdefg
+
+/(?:a(?C`code`)){3}X/
+    aaaXY
+
+# Binary zero in callout string
+#  a  (  ?  C  '  x     z  '  )  b
+/ 61 28 3f 43 27 78 00 7a 27 29 62/hex,callout_info
+    abcdefgh
+
+/(?(?!)^)/
+
+/(?(?!)a|b)/
+    bbb
+\= Expect no match 
+    aaa 
+
+# JIT gives a different error message for the infinite recursion
+
+"(*NO_JIT)((?2)+)((?1)){"
+    abcd{
+
+# Perl fails to diagnose the absence of an assertion
+
+"(?(?<E>.*!.*)?)"
+
+"X((?2)()*+){2}+"B
+
+"X((?2)()*+){2}"B
+
+/(?<=\bABQ(3(?-7)))/
+
+/(?<=\bABQ(3(?+7)))/
+
+";(?<=()((?3))((?2)))"
+
+# Perl loops on this (PCRE2 used to!)
+
+/(?<=\Ka)/g,aftertext
+    aaaaa
+
+/(?<=\Ka)/altglobal,aftertext
+    aaaaa
+
+/((?2){73}(?2))((?1))/info
+
+/abc/
+\= Expect no match
+    \[9x!xxx(]{9999}
+    
+/(abc)*/
+    \[abc]{5} 
+
+/^/gm
+    \n\n\n
+
+/^/gm,alt_circumflex
+    \n\n\n
+
+/((((((((x))))))))\81/
+    xx1
+
+/((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((x))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))\80/
+    xx
+
+/\80/
+
+/A\8B\9C/
+    A8B9C
+    
+/(?x:((?'a')) # comment (with parentheses) and | vertical
+(?-x:#not a comment (?'b')) # this is a comment ()
+(?'c')) # not a comment (?'d')/info
+
+/(?|(?'a')(2)(?'b')|(?'a')(?'a')(3))/I,dupnames
+    A23B
+    B32A 
+
+# These are some patterns that used to cause buffer overflows or other errors
+# while compiling. 
+
+/.((?2)(?R)|\1|$)()/B
+
+/.((?3)(?R)()(?2)|\1|$)()/B
+
+/(\9*+(?2);\3++()2|)++{/
+
+/\V\x85\9*+((?2)\3++()2)*:2/
+
+/(((?(R)){0,2}) (?'x'((?'R')((?'R')))))/dupnames
+
+/(((?(X)){0,2}) (?'x'((?'X')((?'X')))))/dupnames
+
+/(((?(R)){0,2}) (?'x'((?'X')((?'R')))))/
+
+"(?J)(?'d'(?'d'\g{d}))"
+
+"(?=!((?2)(?))({8(?<=(?1){29}8bbbb\x16\xd\xc6^($(\xa9H4){4}h}?1)B))\x15')"
+
+/A(?'')Z/
+
+"(?J:(?|(?'R')(\k'R')|((?'R'))))"
+
+/(?<=|(\,\$(?73591620449005828816)\xa8.{7}){6}\x09)/
+
+/^(?:(?(1)x|)+)+$()/B
+
+/[[:>:]](?<)/
+
+/((?x)(*:0))#(?'/
+
+/(?C$[$)(?<]/
+
+/(?C$)$)(?<]/
+
+/(?(R))*+/B
+    abcd
+
+/((?x)(?#))#(?'/
+
+/((?x)(?#))#(?'abc')/I
+
+/[[:\\](?<[::]/
+
+/[[:\\](?'abc')[a:]/I
+
+"[[[.\xe8Nq\xffq\xff\xe0\x2|||::Nq\xffq\xff\xe0\x6\x2|||::[[[:[::::::[[[[[::::::::[:[[[:[:::[[[[[[[[[[[[:::::::::::::::::[[.\xe8Nq\xffq\xff\xe0\x2|||::Nq\xffq\xff\xe0\x6\x2|||::[[[:[::::::[[[[[::::::::[:[[[:[:::[[[[[[[[[[[[[[:::E[[[:[:[[:[:::[[:::E[[[:[:[[:'[:::::E[[[:[::::::[[[:[[[[[[[::E[[[:[::::::[[[:[[[[[[[[:[[::[::::[[:::::::[[:[[[[[[[:[[::[:[[:[~"
+
+/()(?(R)0)*+/B
+
+/(?R-:(?</
+
+/(?(?C{\Q})(?!(?'/
+
+/(?(?C{\Q})(?!(?'abc')))/I
+
+/(?1){3918}(((((0(\k'R'))))(?J)(?'R'(?'R'\3){99})))/I
+
+/(?|(aaa)|(b))\g{1}/I
+
+/(?|(aaa)|(b))(?1)/I
+
+/(?|(aaa)|(b))/I
+
+/(?|(?'a'aaa)|(?'a'b))\k'a'/I
+
+/(?|(?'a'aaa)|(?'a'b))(?'a'cccc)\k'a'/I,dupnames
+
+/ab{3cd/
+    ab{3cd
+
+/ab{3,cd/
+    ab{3,cd
+
+/ab{3,4a}cd/
+    ab{3,4a}cd
+
+/{4,5a}bc/
+    {4,5a}bc
+
+/\x0{ab}/
+    \0{ab} 
+
+/^(a(b))\1\g1\g{1}\g-1\g{-1}\g{-02}Z/
+    ababababbbabZXXXX
+
+/.*?a(*PRUNE)b/
+    aab
+
+/.*?a(*PRUNE)b/s
+    aab
+
+/^a(*PRUNE)b/s
+\= Expect no match
+    aab
+
+/.*?a(*SKIP)b/
+    aab
+
+/(?(8000000000/
+
+/((?(R8000000000)))/
+
+/0(?0)|(1)(*THEN)(*SKIP:0)(*FAIL)/
+\= Expect no match
+    01
+
+/(?(1)()\983040\2)/
+
+/(*LIMIT_MATCH=)abc/
+
+/(*CRLF)(*LIMIT_MATCH=)abc/
+
+/(?:ab)?(?:ab)(?:ab)/
+    abab
+    ababab
+\= Expect no match
+    aba
+
+/((*MARK:A))++a(*SKIP:B)b/
+\= Expect no match
+    aacb
+
+/(*MARK:a\zb)z/alt_verbnames 
+    
+/(*:ab\t(d\)c)xxx/
+
+/(*:ab\t(d\)c)xxx/alt_verbnames,mark
+    cxxxz
+
+/(*:A\Qxx)x\EB)x/alt_verbnames,mark
+    x
+    
+/(*:A\ExxxB)x/alt_verbnames,mark
+    x 
+    
+/(*: A \ and #comment
+     \ B)x/x,alt_verbnames,mark
+    x  
+    
+/(*:A
+B)x/alt_verbnames,mark 
+    x
+
+/(*:abc\Qpqr)/alt_verbnames
+
+/abc/use_offset_limit
+    1234abcde\=offset_limit=100
+    1234abcde\=offset_limit=9
+    1234abcde\=offset_limit=4
+    1234abcde\=offset_limit=4,offset=4
+\= Expect no match
+    1234abcde\=offset_limit=4,offset=5
+    1234abcde\=offset_limit=3
+
+/(?<=abc)/use_offset_limit
+    1234abc\=offset_limit=7
+\= Expect no match
+    1234abc\=offset_limit=6
+    
+/A/g,replace=-,use_offset_limit
+    XAXAXAXAXA\=offset_limit=4
+
+/abc/
+\= Expect error
+    1234abcde\=offset_limit=4
+
+/^\w/m,use_offset_limit
+    \n..\naa\=offset_limit=3
+    \n..\naa\=offset_limit=4
+
+/abcd/null_context
+    abcd\=null_context
+\= Expect error     
+    abcd\=null_context,find_limits
+    abcd\=allusedtext,startchar 
+
+/abcd/replace=w\rx\x82y\o{333}z(\Q12\$34$$\x34\E5$$),substitute_extended
+    abcd
+    
+/a(bc)(DE)/replace=a\u$1\U$1\E$1\l$2\L$2\Eab\Uab\LYZ\EDone,substitute_extended
+    abcDE
+ 
+/abcd/replace=xy\kz,substitute_extended
+    abcd
+
+/a(?:(b)|(c))/substitute_extended,replace=X${1:+1:-1}X${2:+2:-2}
+    ab
+    ac
+    ab\=replace=${1:+$1\:$1:$2}
+    ac\=replace=${1:+$1\:$1:$2}
+
+/a(?:(b)|(c))/substitute_extended,replace=X${1:-1:-1}X${2:-2:-2}
+    ab
+    ac
+
+/(a)/substitute_extended,replace=>${1:+\Q$1:{}$$\E+\U$1}<
+    a
+
+/X(b)Y/substitute_extended
+    XbY\=replace=x${1:+$1\U$1}y
+    XbY\=replace=\Ux${1:+$1$1}y
+
+/a/substitute_extended,replace=${*MARK:+a:b}
+    a
+
+/(abcd)/replace=${1:+xy\kz},substitute_extended
+    abcd
+
+/(abcd)/
+    abcd\=replace=${1:+xy\kz},substitute_extended
+
+/abcd/substitute_extended,replace=>$1<
+    abcd
+
+/abcd/substitute_extended,replace=>xxx${xyz}<<<
+    abcd
+
+/(?J)(?:(?<A>a)|(?<A>b))/replace=<$A>
+    [a]
+    [b] 
+\= Expect error     
+    (a)\=ovector=1
+
+/(a)|(b)/replace=<$1>
+\= Expect error
+    b
+
+/(aa)(BB)/substitute_extended,replace=\U$1\L$2\E$1..\U$1\l$2$1
+    aaBB
+
+/^(o(\1{72}{\"{\\{00000059079}\d*){74}}){19}/I
+
+/((p(?'K/
+
+/((p(?'K/no_auto_capture
+
+/abc/replace=A$3123456789Z
+    abc
+
+/(?<!a{65535}a{5})x/I
+
+/(?<!a{65535})x/I
+
+/(?=a\K)/replace=z
+    BaCaD
+    
+/(?'abcdefghijklmnopqrstuvwxyzABCDEFG'toolong)/
+ 
+/(?'abcdefghijklmnopqrstuvwxyzABCDEF'justright)/ 
+
+# These two use zero-termination
+/abcd/max_pattern_length=3
+
+/abc/max_pattern_length=3
+
+# These two, being hex, pass the length
+/abcdefab/hex,max_pattern_length=3
+
+/abcdef/hex,max_pattern_length=3
+
+# These two patterns used to take a long time to compile
+
+"(.*)
+((?-2)(?-2))((?-2)(?-2))((?-2)(?-2))((?-2)(?-2))
+((?-2)(?-2))((?-2)(?-2))((?-2)(?-2))((?-2)(?-2))
+((?-2)(?-2))((?-2)(?-2))((?-2)(?-2))"xI
+
+"(?<=a()
+((?-2)(?-2))((?-2)(?-2))((?-2)(?-2))((?-2)(?-2))
+((?-2)(?-2))((?-2)(?-2))((?-2)(?-2))((?-2)(?-2))
+((?-2)(?-2))((?-2)(?-2))((?-2)(?-2))
+a)"xI
+
+# When (?| is used and groups of the same number may be different,
+# we have to rely on a count to catch overly complicated patterns.
+
+"(?|()|())(.*)
+((?-2)(?-2))((?-2)(?-2))((?-2)(?-2))((?-2)(?-2))
+((?-2)(?-2))((?-2)(?-2))((?-2)(?-2))((?-2)(?-2))
+((?-2)(?-2))((?-2)(?-2))((?-2)(?-2))"xI
+
+"(?|()|())(?<=a()
+((?-2)(?-2))((?-2)(?-2))((?-2)(?-2))((?-2)(?-2))
+((?-2)(?-2))((?-2)(?-2))((?-2)(?-2))((?-2)(?-2))
+((?-2)(?-2))((?-2)(?-2))((?-2)(?-2))
+a)"xI
+
+# Test the use of malloc for caching group information when there are more
+# groups than fit into the on-stack workspace.
+
+/\[()]{1024}/I,expand
+
+# Test minlength capped at 65535
+
+/(A{65000})\1{65000}/I
+
+# Test group scans when numbers are not unique
+
+/(?|()+|(a)+)/BI
+
+/(?|(a)+|()+)/BI
+
+/(?|()|(a))/BI
+
+/(?|(a)|())/BI
+
+# Test CRLF handling in empty string substitutions
+
+/^$/gm,newline=anycrlf,replace=-
+    X\r\n\r\nY
+
+/^$/gm,newline=crlf,replace=-
+    X\r\n\r\nY
+
+/^$/gm,newline=any,replace=-
+    X\r\n\r\nY
+
+"(*ANYCRLF)(?m)^(.*[^0-9\r\n].*|)$"g,replace=NaN
+    15\r\nfoo\r\n20\r\nbar\r\nbaz\r\n\r\n20
+
+/a[[:punct:]b]/bincode
+
+/a[b[:punct:]]/bincode
+
+/L(?#(|++<!(2)?/B
+
+/L(?#(|++<!(2)?/B,no_auto_possess
+
+/L(?#(|++<!(2)?/B,auto_callout
+
+/L(?#(|++<!(2)?/B,no_auto_possess,auto_callout
+
+/(A*)\E+/B,auto_callout
+
+/()\Q\E*]/B,auto_callout
+    a[bc]d
+
+/\x8a+f|;T?(*:;.'?`(\xeap ){![^()!y*''C*(?';]{1;(\x08)/B,alt_verbnames,dupnames,extended
+
+# Tests for NULL characters in comments and verb "names" and callouts
+
+# /A#B\x00C\x0aZ/
+/41 23 42 00 43 0a 5a/Bx,hex
+
+# /A+#B\x00C\x0a+/
+/41 2b 23 42 00 43 0a 2b/Bx,hex
+
+# /A(*:B\x00W#X\00Y\x0aC)Z/
+/41 28 2a 3a 42 00 57 23 58 00 59 0a 43 29 5a/Bx,hex,alt_verbnames
+
+# /A(*:B\x00W#X\00Y\x0aC)Z/
+/41 28 2a 3a 42 00 57 23 58 00 59 0a 43 29 5a/Bx,hex
+
+# /A(?C{X\x00Y})B/
+/41 28 3f 43 7b 58 00 59 7d 29 42/B,hex
+
+# /A(?#X\x00Y)B/
+/41 28 3f 23 7b 00 7d 29 42/B,hex
+
+# Tests for leading comment in extended patterns
+
+/ (?-x):?/extended
+
+/(?-x):?/extended
+
+/0b 28 3f 2d 78 29 3a/hex,extended
+
+/#comment
+(?-x):?/extended
+
+/(8(*:6^\x09x\xa6l\)6!|\xd0:[^:|)\x09d\Z\d{85*m(?'(?<1!)*\W[*\xff]!!h\w]*\xbe;/alt_bsux,alt_verbnames,allow_empty_class,dollar_endonly,extended,multiline,never_utf,no_dotstar_anchor,no_start_optimize
+
+/a|(b)c/replace=>$1<,substitute_unset_empty
+    cat
+    xbcom 
+
+/a|(b)c/
+    cat\=replace=>$1<
+    cat\=replace=>$1<,substitute_unset_empty
+    xbcom\=replace=>$1<,substitute_unset_empty
+
+/a|(b)c/substitute_extended
+    cat\=replace=>${2:-xx}<
+    cat\=replace=>${2:-xx}<,substitute_unknown_unset
+    cat\=replace=>${X:-xx}<,substitute_unknown_unset
+
+/a|(?'X'b)c/replace=>$X<,substitute_unset_empty
+    cat
+    xbcom 
+
+/a|(?'X'b)c/replace=>$Y<,substitute_unset_empty
+    cat
+    cat\=substitute_unknown_unset 
+    cat\=substitute_unknown_unset,-substitute_unset_empty 
+
+/a|(b)c/replace=>$2<,substitute_unset_empty
+    cat
+    cat\=substitute_unknown_unset 
+    cat\=substitute_unknown_unset,-substitute_unset_empty 
+
+/()()()/use_offset_limit
+    \=ovector=11000000000
+    \=callout_fail=11000000000
+    \=callout_fail=1:11000000000
+    \=callout_data=11000000000 
+    \=callout_data=-11000000000 
+    \=offset_limit=1100000000000000000000 
+    \=copy=11000000000 
+
+/(*MARK:A\x00b)/mark
+    abc
+
+/(*MARK:A\x00b)/mark,alt_verbnames
+    abc
+
+# /(*MARK:A\x00b)/
+/28 2a 4d 41 52 4b 3a 41 00 62 29/mark,hex
+    abc
+
+# /(*MARK:A\x00b)/
+/28 2a 4d 41 52 4b 3a 41 00 62 29/mark,hex,alt_verbnames
+    abc
+
+# End of testinput2 
diff --git a/dist2/testdata/testinput20 b/dist2/testdata/testinput20
new file mode 100644
index 0000000..9ec3174
--- /dev/null
+++ b/dist2/testdata/testinput20
@@ -0,0 +1,63 @@
+# This set of tests exercises the serialization/deserialization functions in
+# the library. It does not use UTF or JIT.
+
+#forbid_utf
+
+# Compile several patterns, push them onto the stack, and then write them
+# all to a file.
+
+#pattern push
+
+/(?<NAME>(?&NAME_PAT))\s+(?<ADDR>(?&ADDRESS_PAT))
+  (?(DEFINE)
+  (?<NAME_PAT>[a-z]+)
+  (?<ADDRESS_PAT>\d+)
+  )/x
+/^(?:((.)(?1)\2|)|((.)(?3)\4|.))$/i
+
+#save testsaved1
+
+# Do it again for some more patterns.
+
+/(*MARK:A)(*SKIP:B)(C|X)/mark
+/(?:(?<n>foo)|(?<n>bar))\k<n>/dupnames
+
+#save testsaved2
+#pattern -push
+
+# Reload the patterns, then pop them one by one and check them.
+
+#load testsaved1
+#load testsaved2
+
+#pop info
+    foofoo             
+    barbar
+    
+#pop mark
+    C
+\= Expect no match     
+    D 
+    
+#pop
+    AmanaplanacanalPanama   
+
+#pop info
+    metcalfe 33
+    
+# Check for an error when different tables are used.
+
+/abc/push,tables=1
+/xyz/push,tables=2
+#save testsaved1
+
+#pop
+    xyz
+
+#pop
+    abc
+
+#pop should give an error
+    pqr
+
+# End of testinput20
diff --git a/dist2/testdata/testinput21 b/dist2/testdata/testinput21
new file mode 100644
index 0000000..1d1fbed
--- /dev/null
+++ b/dist2/testdata/testinput21
@@ -0,0 +1,16 @@
+# These are tests of \C that do not involve UTF. They are not run when \C is
+# disabled by compiling with --enable-never-backslash-C.
+
+/\C+\D \C+\d \C+\S \C+\s \C+\W \C+\w \C+. \C+\R \C+\H \C+\h \C+\V \C+\v \C+\Z \C+\z \C+$/Bx
+
+/\D+\C \d+\C \S+\C \s+\C \W+\C \w+\C .+\C \R+\C \H+\C \h+\C \V+\C \v+\C a+\C \n+\C \C+\C/Bx
+
+/ab\Cde/never_backslash_c
+
+/ab\Cde/info
+    abXde
+    
+/(?<=ab\Cde)X/
+    abZdeX
+
+# End of testinput21
diff --git a/dist2/testdata/testinput22 b/dist2/testdata/testinput22
new file mode 100644
index 0000000..f684cf4
--- /dev/null
+++ b/dist2/testdata/testinput22
Binary files differ
diff --git a/dist2/testdata/testinput23 b/dist2/testdata/testinput23
new file mode 100644
index 0000000..d0a9bc4
--- /dev/null
+++ b/dist2/testdata/testinput23
@@ -0,0 +1,7 @@
+# This test is run when PCRE2 has been built with --enable-never-backslash-C,
+# which disables the use of \C. All we can do is check that it gives the 
+# correct error message.
+
+/a\Cb/
+
+# End of testinput23
diff --git a/dist2/testdata/testinput3 b/dist2/testdata/testinput3
new file mode 100644
index 0000000..71e95fe
--- /dev/null
+++ b/dist2/testdata/testinput3
@@ -0,0 +1,104 @@
+# This set of tests checks local-specific features, using the "fr_FR" locale. 
+# It is not Perl-compatible. When run via RunTest, the locale is edited to
+# be whichever of "fr_FR", "french", or "fr" is found to exist. There is
+# different version of this file called wintestinput3 for use on Windows,
+# where the locale is called "french" and the tests are run using
+# RunTest.bat. 
+
+#forbid_utf
+
+/^[\w]+/
+\= Expect no match
+    École
+
+/^[\w]+/locale=fr_FR
+    École
+
+/^[\w]+/
+\= Expect no match
+    École
+
+/^[\W]+/
+    École
+
+/^[\W]+/locale=fr_FR
+\= Expect no match
+    École
+
+/[\b]/
+    \b
+\= Expect no match
+    a
+
+/[\b]/locale=fr_FR
+    \b
+\= Expect no match
+    a
+
+/^\w+/
+\= Expect no match
+    École
+
+/^\w+/locale=fr_FR
+    École
+
+/(.+)\b(.+)/
+    École
+
+/(.+)\b(.+)/locale=fr_FR
+\= Expect no match
+    École
+
+/École/i
+    École
+\= Expect no match
+    école
+
+/École/i,locale=fr_FR
+    École
+    école
+
+/\w/I
+
+/\w/I,locale=fr_FR
+
+# All remaining tests are in the fr_FR locale, so set the default.
+
+#pattern locale=fr_FR
+
+/^[\xc8-\xc9]/i
+    École
+    école
+
+/^[\xc8-\xc9]/
+    École
+\= Expect no match
+    école
+
+/\W+/
+    >>>\xaa<<<
+    >>>\xba<<< 
+
+/[\W]+/
+    >>>\xaa<<<
+    >>>\xba<<< 
+
+/[^[:alpha:]]+/
+    >>>\xaa<<<
+    >>>\xba<<< 
+
+/\w+/
+    >>>\xaa<<<
+    >>>\xba<<< 
+
+/[\w]+/
+    >>>\xaa<<<
+    >>>\xba<<< 
+
+/[[:alpha:]]+/
+    >>>\xaa<<<
+    >>>\xba<<< 
+    
+/[[:alpha:]][[:lower:]][[:upper:]]/IB
+
+# End of testinput3 
diff --git a/dist2/testdata/testinput4 b/dist2/testdata/testinput4
new file mode 100644
index 0000000..ce9145d
--- /dev/null
+++ b/dist2/testdata/testinput4
@@ -0,0 +1,2285 @@
+# This set of tests is for UTF support, including Unicode properties. The 
+# Unicode tests are all compatible with all versions of Perl >= 5.10, but
+# some of the property tests may differ because of different versions of
+# Unicode in use by PCRE2 and Perl.
+
+#newline_default lf anycrlf any
+#perltest
+
+/a.b/utf
+    acb
+    a\x7fb
+    a\x{100}b
+\= Expect no match
+    a\nb
+
+/a(.{3})b/utf
+    a\x{4000}xyb
+    a\x{4000}\x7fyb
+    a\x{4000}\x{100}yb
+\= Expect no match
+    a\x{4000}b
+    ac\ncb
+
+/a(.*?)(.)/
+    a\xc0\x88b
+
+/a(.*?)(.)/utf
+    a\x{100}b
+
+/a(.*)(.)/
+    a\xc0\x88b
+
+/a(.*)(.)/utf
+    a\x{100}b
+
+/a(.)(.)/
+    a\xc0\x92bcd
+
+/a(.)(.)/utf
+    a\x{240}bcd
+
+/a(.?)(.)/
+    a\xc0\x92bcd
+
+/a(.?)(.)/utf
+    a\x{240}bcd
+
+/a(.??)(.)/
+    a\xc0\x92bcd
+
+/a(.??)(.)/utf
+    a\x{240}bcd
+
+/a(.{3})b/utf
+    a\x{1234}xyb
+    a\x{1234}\x{4321}yb
+    a\x{1234}\x{4321}\x{3412}b
+\= Expect no match
+    a\x{1234}b
+    ac\ncb
+
+/a(.{3,})b/utf
+    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
+\= Expect no match
+    a\x{1234}b
+
+/a(.{3,}?)b/utf
+    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
+\= Expect no match
+    a\x{1234}b
+
+/a(.{3,5})b/utf
+    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
+\= Expect no match
+    a\x{1234}b
+    axxxxxxbcdefghijb
+
+/a(.{3,5}?)b/utf
+    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
+\= Expect no match
+    a\x{1234}b
+    axxxxxxbcdefghijb
+
+/^[a\x{c0}]/utf
+\= Expect no match
+    \x{100}
+
+/(?<=aXb)cd/utf
+    aXbcd
+
+/(?<=a\x{100}b)cd/utf
+    a\x{100}bcd
+
+/(?<=a\x{100000}b)cd/utf
+    a\x{100000}bcd
+
+/(?:\x{100}){3}b/utf
+    \x{100}\x{100}\x{100}b
+\= Expect no match
+    \x{100}\x{100}b
+
+/\x{ab}/utf
+    \x{ab}
+    \xc2\xab
+\= Expect no match
+    \x00{ab}
+
+/(?<=(.))X/utf
+    WXYZ
+    \x{256}XYZ
+\= Expect no match
+    XYZ
+
+/[^a]+/g,utf
+    bcd
+    \x{100}aY\x{256}Z
+
+/^[^a]{2}/utf
+    \x{100}bc
+
+/^[^a]{2,}/utf
+    \x{100}bcAa
+
+/^[^a]{2,}?/utf
+    \x{100}bca
+
+/[^a]+/gi,utf
+    bcd
+    \x{100}aY\x{256}Z
+
+/^[^a]{2}/i,utf
+    \x{100}bc
+
+/^[^a]{2,}/i,utf
+    \x{100}bcAa
+
+/^[^a]{2,}?/i,utf
+    \x{100}bca
+
+/\x{100}{0,0}/utf
+    abcd
+
+/\x{100}?/utf
+    abcd
+    \x{100}\x{100}
+
+/\x{100}{0,3}/utf
+    \x{100}\x{100}
+    \x{100}\x{100}\x{100}\x{100}
+
+/\x{100}*/utf
+    abce
+    \x{100}\x{100}\x{100}\x{100}
+
+/\x{100}{1,1}/utf
+    abcd\x{100}\x{100}\x{100}\x{100}
+
+/\x{100}{1,3}/utf
+    abcd\x{100}\x{100}\x{100}\x{100}
+
+/\x{100}+/utf
+    abcd\x{100}\x{100}\x{100}\x{100}
+
+/\x{100}{3}/utf
+    abcd\x{100}\x{100}\x{100}XX
+
+/\x{100}{3,5}/utf
+    abcd\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}XX
+
+/\x{100}{3,}/utf
+    abcd\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}XX
+
+/(?<=a\x{100}{2}b)X/utf,aftertext
+    Xyyya\x{100}\x{100}bXzzz
+
+/\D*/utf
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+
+/\D*/utf
+  \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\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/utf
+    1X2
+    1\x{100}2
+
+/>\S/utf
+    > >X Y
+    > >\x{100} Y
+
+/\d/utf
+    \x{100}3
+
+/\s/utf
+    \x{100} X
+
+/\D+/utf
+    12abcd34
+\= Expect no match
+    1234
+
+/\D{2,3}/utf
+    12abcd34
+    12ab34
+\= Expect no match
+    1234
+    12a34
+
+/\D{2,3}?/utf
+    12abcd34
+    12ab34
+\= Expect no match
+    1234
+    12a34
+
+/\d+/utf
+    12abcd34
+
+/\d{2,3}/utf
+    12abcd34
+    1234abcd
+\= Expect no match
+    1.4
+
+/\d{2,3}?/utf
+    12abcd34
+    1234abcd
+\= Expect no match
+    1.4
+
+/\S+/utf
+    12abcd34
+\= Expect no match
+    \    \
+
+/\S{2,3}/utf
+    12abcd34
+    1234abcd
+\= Expect no match
+    \     \
+
+/\S{2,3}?/utf
+    12abcd34
+    1234abcd
+\= Expect no match
+    \     \
+
+/>\s+</utf,aftertext
+    12>      <34
+
+/>\s{2,3}</utf,aftertext
+    ab>  <cd
+    ab>   <ce
+\= Expect no match
+    ab>    <cd
+
+/>\s{2,3}?</utf,aftertext
+    ab>  <cd
+    ab>   <ce
+\= Expect no match
+    ab>    <cd
+
+/\w+/utf
+    12      34
+\= Expect no match
+    +++=*!
+
+/\w{2,3}/utf
+    ab  cd
+    abcd ce
+\= Expect no match
+    a.b.c
+
+/\w{2,3}?/utf
+    ab  cd
+    abcd ce
+\= Expect no match
+    a.b.c
+
+/\W+/utf
+    12====34
+\= Expect no match
+    abcd
+
+/\W{2,3}/utf
+    ab====cd
+    ab==cd
+\= Expect no match
+    a.b.c
+
+/\W{2,3}?/utf
+    ab====cd
+    ab==cd
+\= Expect no match
+    a.b.c
+
+/[\x{100}]/utf
+    \x{100}
+    Z\x{100}
+    \x{100}Z
+
+/[Z\x{100}]/utf
+    Z\x{100}
+    \x{100}
+    \x{100}Z
+
+/[\x{100}\x{200}]/utf
+    ab\x{100}cd
+    ab\x{200}cd
+
+/[\x{100}-\x{200}]/utf
+    ab\x{100}cd
+    ab\x{200}cd
+    ab\x{111}cd
+
+/[z-\x{200}]/utf
+    ab\x{100}cd
+    ab\x{200}cd
+    ab\x{111}cd
+    abzcd
+    ab|cd
+
+/[Q\x{100}\x{200}]/utf
+    ab\x{100}cd
+    ab\x{200}cd
+    Q?
+
+/[Q\x{100}-\x{200}]/utf
+    ab\x{100}cd
+    ab\x{200}cd
+    ab\x{111}cd
+    Q?
+
+/[Qz-\x{200}]/utf
+    ab\x{100}cd
+    ab\x{200}cd
+    ab\x{111}cd
+    abzcd
+    ab|cd
+    Q?
+
+/[\x{100}\x{200}]{1,3}/utf
+    ab\x{100}cd
+    ab\x{200}cd
+    ab\x{200}\x{100}\x{200}\x{100}cd
+
+/[\x{100}\x{200}]{1,3}?/utf
+    ab\x{100}cd
+    ab\x{200}cd
+    ab\x{200}\x{100}\x{200}\x{100}cd
+
+/[Q\x{100}\x{200}]{1,3}/utf
+    ab\x{100}cd
+    ab\x{200}cd
+    ab\x{200}\x{100}\x{200}\x{100}cd
+
+/[Q\x{100}\x{200}]{1,3}?/utf
+    ab\x{100}cd
+    ab\x{200}cd
+    ab\x{200}\x{100}\x{200}\x{100}cd
+
+/(?<=[\x{100}\x{200}])X/utf
+    abc\x{200}X
+    abc\x{100}X
+\= Expect no match
+    X
+
+/(?<=[Q\x{100}\x{200}])X/utf
+    abc\x{200}X
+    abc\x{100}X
+    abQX
+\= Expect no match
+    X
+
+/(?<=[\x{100}\x{200}]{3})X/utf
+    abc\x{100}\x{200}\x{100}X
+\= Expect no match
+    abc\x{200}X
+    X
+
+/[^\x{100}\x{200}]X/utf
+    AX
+    \x{150}X
+    \x{500}X
+\= Expect no match
+    \x{100}X
+    \x{200}X
+
+/[^Q\x{100}\x{200}]X/utf
+    AX
+    \x{150}X
+    \x{500}X
+\= Expect no match
+    \x{100}X
+    \x{200}X
+    QX
+
+/[^\x{100}-\x{200}]X/utf
+    AX
+    \x{500}X
+\= Expect no match
+    \x{100}X
+    \x{150}X
+    \x{200}X
+
+/[z-\x{100}]/i,utf
+    z
+    Z
+    \x{100}
+\= Expect no match
+    \x{102}
+    y
+
+/[\xFF]/
+    >\xff<
+
+/[\xff]/utf
+    >\x{ff}<
+
+/[^\xFF]/
+    XYZ
+
+/[^\xff]/utf
+    XYZ
+    \x{123}
+
+/^[ac]*b/utf
+\= Expect no match
+  xb
+
+/^[ac\x{100}]*b/utf
+\= Expect no match
+  xb
+
+/^[^x]*b/i,utf
+\= Expect no match
+  xb
+
+/^[^x]*b/utf
+\= Expect no match
+  xb
+
+/^\d*b/utf
+\= Expect no match
+  xb
+
+/(|a)/g,utf
+    catac
+    a\x{256}a
+
+/^\x{85}$/i,utf
+    \x{85}
+
+/^ሴ/utf
+    ሴ
+
+/^\ሴ/utf
+    ሴ
+
+"(?s)(.{1,5})"utf
+    abcdefg
+    ab
+
+/a*\x{100}*\w/utf
+    a
+
+/\S\S/g,utf
+    A\x{a3}BC
+
+/\S{2}/g,utf
+    A\x{a3}BC
+
+/\W\W/g,utf
+    +\x{a3}==
+
+/\W{2}/g,utf
+    +\x{a3}==
+
+/\S/g,utf
+    \x{442}\x{435}\x{441}\x{442}
+
+/[\S]/g,utf
+    \x{442}\x{435}\x{441}\x{442}
+
+/\D/g,utf
+    \x{442}\x{435}\x{441}\x{442}
+
+/[\D]/g,utf
+    \x{442}\x{435}\x{441}\x{442}
+
+/\W/g,utf
+    \x{2442}\x{2435}\x{2441}\x{2442}
+
+/[\W]/g,utf
+    \x{2442}\x{2435}\x{2441}\x{2442}
+
+/[\S\s]*/utf
+    abc\n\r\x{442}\x{435}\x{441}\x{442}xyz
+
+/[\x{41f}\S]/g,utf
+    \x{442}\x{435}\x{441}\x{442}
+
+/.[^\S]./g,utf
+    abc def\x{442}\x{443}xyz\npqr
+
+/.[^\S\n]./g,utf
+    abc def\x{442}\x{443}xyz\npqr
+
+/[[:^alnum:]]/g,utf
+    +\x{2442}
+
+/[[:^alpha:]]/g,utf
+    +\x{2442}
+
+/[[:^ascii:]]/g,utf
+    A\x{442}
+
+/[[:^blank:]]/g,utf
+    A\x{442}
+
+/[[:^cntrl:]]/g,utf
+    A\x{442}
+
+/[[:^digit:]]/g,utf
+    A\x{442}
+
+/[[:^graph:]]/g,utf
+    \x19\x{e01ff}
+
+/[[:^lower:]]/g,utf
+    A\x{422}
+
+/[[:^print:]]/g,utf
+    \x{19}\x{e01ff}
+
+/[[:^punct:]]/g,utf
+    A\x{442}
+
+/[[:^space:]]/g,utf
+    A\x{442}
+
+/[[:^upper:]]/g,utf
+    a\x{442}
+
+/[[:^word:]]/g,utf
+    +\x{2442}
+
+/[[:^xdigit:]]/g,utf
+    M\x{442}
+
+/[^ABCDEFGHIJKLMNOPQRSTUVWXYZÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞĀĂĄĆĈĊČĎĐĒĔĖĘĚĜĞĠĢĤĦĨĪĬĮİIJĴĶĹĻĽĿŁŃŅŇŊŌŎŐŒŔŖŘŚŜŞŠŢŤŦŨŪŬŮŰŲŴŶŸŹŻŽƁƂƄƆƇƉƊƋƎƏƐƑƓƔƖƗƘƜƝƟƠƢƤƦƧƩƬƮƯƱƲƳƵƷƸƼDŽLJNJǍǏǑǓǕǗǙǛǞǠǢǤǦǨǪǬǮDZǴǶǷǸǺǼǾȀȂȄȆȈȊȌȎȐȒȔȖȘȚȜȞȠȢȤȦȨȪȬȮȰȲȺȻȽȾɁΆΈΉΊΌΎΏΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩΪΫϒϓϔϘϚϜϞϠϢϤϦϨϪϬϮϴϷϹϺϽϾϿЀЁЂЃЄЅІЇЈЉЊЋЌЍЎЏАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯѠѢѤѦѨѪѬѮѰѲѴѶѸѺѼѾҀҊҌҎҐҒҔҖҘҚҜҞҠҢҤҦҨҪҬҮҰҲҴҶҸҺҼҾӀӁӃӅӇӉӋӍӐӒӔӖӘӚӜӞӠӢӤӦӨӪӬӮӰӲӴӶӸԀԂԄԆԈԊԌԎԱԲԳԴԵԶԷԸԹԺԻԼԽԾԿՀՁՂՃՄՅՆՇՈՉՊՋՌՍՎՏՐՑՒՓՔՕՖႠႡႢႣႤႥႦႧႨႩႪႫႬႭႮႯႰႱႲႳႴႵႶႷႸႹႺႻႼႽႾႿჀჁჂჃჄჅḀḂḄḆḈḊḌḎḐḒḔḖḘḚḜḞḠḢḤḦḨḪḬḮḰḲḴḶḸḺḼḾṀṂṄṆṈṊṌṎṐṒṔṖṘṚṜṞṠṢṤṦṨṪṬṮṰṲṴṶṸṺṼṾẀẂẄẆẈẊẌẎẐẒẔẠẢẤẦẨẪẬẮẰẲẴẶẸẺẼẾỀỂỄỆỈỊỌỎỐỒỔỖỘỚỜỞỠỢỤỦỨỪỬỮỰỲỴỶỸἈἉἊἋἌἍἎἏἘἙἚἛἜἝἨἩἪἫἬἭἮἯἸἹἺἻἼἽἾἿὈὉὊὋὌὍὙὛὝὟὨὩὪὫὬὭὮὯᾸᾹᾺΆῈΈῊΉῘῙῚΊῨῩῪΎῬῸΌῺΏabcdefghijklmnopqrstuvwxyzªµºßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿāăąćĉċčďđēĕėęěĝğġģĥħĩīĭįıijĵķĸĺļľŀłńņňʼnŋōŏőœŕŗřśŝşšţťŧũūŭůűųŵŷźżžſƀƃƅƈƌƍƒƕƙƚƛƞơƣƥƨƪƫƭưƴƶƹƺƽƾƿdžljnjǎǐǒǔǖǘǚǜǝǟǡǣǥǧǩǫǭǯǰdzǵǹǻǽǿȁȃȅȇȉȋȍȏȑȓȕȗșțȝȟȡȣȥȧȩȫȭȯȱȳȴȵȶȷȸȹȼȿɀɐɑɒɓɔɕɖɗɘəɚɛɜɝɞɟɠɡɢɣɤɥɦɧɨɩɪɫɬɭɮɯɰɱɲɳɴɵɶɷɸɹɺɻɼɽɾɿʀʁʂʃʄʅʆʇʈʉʊʋʌʍʎʏʐʑʒʓʔʕʖʗʘʙʚʛʜʝʞʟʠʡʢʣʤʥʦʧʨʩʪʫʬʭʮʯΐάέήίΰαβγδεζηθικλμνξοπρςστυφχψωϊϋόύώϐϑϕϖϗϙϛϝϟϡϣϥϧϩϫϭϯϰϱϲϳϵϸϻϼабвгдежзийклмнопрстуфхцчшщъыьэюяѐёђѓєѕіїјљњћќѝўџѡѣѥѧѩѫѭѯѱѳѵѷѹѻѽѿҁҋҍҏґғҕҗҙқҝҟҡңҥҧҩҫҭүұҳҵҷҹһҽҿӂӄӆӈӊӌӎӑӓӕӗәӛӝӟӡӣӥӧөӫӭӯӱӳӵӷӹԁԃԅԇԉԋԍԏաբգդեզէըթժիլխծկհձղճմյնշոչպջռսվտրցւփքօֆևᴀᴁᴂᴃᴄᴅᴆᴇᴈᴉᴊᴋᴌᴍᴎᴏᴐᴑᴒᴓᴔᴕᴖᴗᴘᴙᴚᴛᴜᴝᴞᴟᴠᴡᴢᴣᴤᴥᴦᴧᴨᴩᴪᴫᵢᵣᵤᵥᵦᵧᵨᵩᵪᵫᵬᵭᵮᵯᵰᵱᵲᵳᵴᵵᵶᵷᵹᵺᵻᵼᵽᵾᵿᶀᶁᶂᶃᶄᶅᶆᶇᶈᶉᶊᶋᶌᶍᶎᶏᶐᶑᶒᶓᶔᶕᶖᶗᶘᶙᶚḁḃḅḇḉḋḍḏḑḓḕḗḙḛḝḟḡḣḥḧḩḫḭḯḱḳḵḷḹḻḽḿṁṃṅṇṉṋṍṏṑṓṕṗṙṛṝṟṡṣṥṧṩṫṭṯṱṳṵṷṹṻṽṿẁẃẅẇẉẋẍẏẑẓẕẖẗẘẙẚẛạảấầẩẫậắằẳẵặẹẻẽếềểễệỉịọỏốồổỗộớờởỡợụủứừửữựỳỵỷỹἀἁἂἃἄἅἆἇἐἑἒἓἔἕἠἡἢἣἤἥἦἧἰἱἲἳἴἵἶἷὀὁὂὃὄὅὐὑὒὓὔὕὖὗὠὡὢὣὤὥὦὧὰάὲέὴήὶίὸόὺύὼώᾀᾁᾂᾃᾄᾅᾆᾇᾐᾑᾒᾓᾔᾕᾖᾗᾠᾡᾢᾣᾤᾥᾦᾧᾰᾱᾲᾳᾴᾶᾷιῂῃῄῆῇῐῑῒΐῖῗῠῡῢΰῤῥῦῧῲῳῴῶῷⲁⲃⲅⲇⲉⲋⲍⲏⲑⲓⲕⲗⲙⲛⲝⲟⲡⲣⲥⲧⲩⲫⲭⲯⲱⲳⲵⲷⲹⲻⲽⲿⳁⳃⳅⳇⳉⳋⳍⳏⳑⳓⳕⳗⳙⳛⳝⳟⳡⳣⳤⴀⴁⴂⴃⴄⴅⴆⴇⴈⴉⴊⴋⴌⴍⴎⴏⴐⴑⴒⴓⴔⴕⴖⴗⴘⴙⴚⴛⴜⴝⴞⴟⴠⴡⴢⴣⴤⴥfffiflffifflſtstﬓﬔﬕﬖﬗ\d-_^]/utf
+
+/^[^d]*?$/
+    abc
+
+/^[^d]*?$/utf
+    abc
+
+/^[^d]*?$/i
+    abc
+
+/^[^d]*?$/i,utf
+    abc
+
+/(?i)[\xc3\xa9\xc3\xbd]|[\xc3\xa9\xc3\xbdA]/utf
+
+/^[a\x{c0}]b/utf
+    \x{c0}b
+
+/^([a\x{c0}]*?)aa/utf
+    a\x{c0}aaaa/
+
+/^([a\x{c0}]*?)aa/utf
+    a\x{c0}aaaa/
+    a\x{c0}a\x{c0}aaa/
+
+/^([a\x{c0}]*)aa/utf
+    a\x{c0}aaaa/
+    a\x{c0}a\x{c0}aaa/
+
+/^([a\x{c0}]*)a\x{c0}/utf
+    a\x{c0}aaaa/
+    a\x{c0}a\x{c0}aaa/
+
+/A*/g,utf
+    AAB\x{123}BAA
+
+/(abc)\1/i,utf
+\= Expect no match
+   abc
+
+/(abc)\1/utf
+\= Expect no match
+   abc
+
+/a(*:a\x{1234}b)/utf,mark
+    abc
+
+/a(*:a£b)/utf,mark
+    abc
+
+# Noncharacters
+
+/./utf
+    \x{fffe}
+    \x{ffff}
+    \x{1fffe}
+    \x{1ffff}
+    \x{2fffe}
+    \x{2ffff}
+    \x{3fffe}
+    \x{3ffff}
+    \x{4fffe}
+    \x{4ffff}
+    \x{5fffe}
+    \x{5ffff}
+    \x{6fffe}
+    \x{6ffff}
+    \x{7fffe}
+    \x{7ffff}
+    \x{8fffe}
+    \x{8ffff}
+    \x{9fffe}
+    \x{9ffff}
+    \x{afffe}
+    \x{affff}
+    \x{bfffe}
+    \x{bffff}
+    \x{cfffe}
+    \x{cffff}
+    \x{dfffe}
+    \x{dffff}
+    \x{efffe}
+    \x{effff}
+    \x{ffffe}
+    \x{fffff}
+    \x{10fffe}
+    \x{10ffff}
+    \x{fdd0}
+    \x{fdd1}
+    \x{fdd2}
+    \x{fdd3}
+    \x{fdd4}
+    \x{fdd5}
+    \x{fdd6}
+    \x{fdd7}
+    \x{fdd8}
+    \x{fdd9}
+    \x{fdda}
+    \x{fddb}
+    \x{fddc}
+    \x{fddd}
+    \x{fdde}
+    \x{fddf}
+    \x{fde0}
+    \x{fde1}
+    \x{fde2}
+    \x{fde3}
+    \x{fde4}
+    \x{fde5}
+    \x{fde6}
+    \x{fde7}
+    \x{fde8}
+    \x{fde9}
+    \x{fdea}
+    \x{fdeb}
+    \x{fdec}
+    \x{fded}
+    \x{fdee}
+    \x{fdef}
+
+/^\d*\w{4}/utf
+    1234
+\= Expect no match     
+    123
+
+/^[^b]*\w{4}/utf
+    aaaa
+\= Expect no match     
+    aaa
+
+/^[^b]*\w{4}/i,utf
+    aaaa
+\= Expect no match     
+    aaa
+
+/^\x{100}*.{4}/utf
+    \x{100}\x{100}\x{100}\x{100}
+\= Expect no match     
+    \x{100}\x{100}\x{100}
+
+/^\x{100}*.{4}/i,utf
+    \x{100}\x{100}\x{100}\x{100}
+\= Expect no match     
+    \x{100}\x{100}\x{100}
+
+/^a+[a\x{200}]/utf
+    aa
+
+/^.\B.\B./utf
+    \x{10123}\x{10124}\x{10125}
+
+/^#[^\x{ffff}]#[^\x{ffff}]#[^\x{ffff}]#/utf
+    #\x{10000}#\x{100}#\x{10ffff}#
+    
+# Unicode property support tests 
+
+/^\pC\pL\pM\pN\pP\pS\pZ</utf
+    \x7f\x{c0}\x{30f}\x{660}\x{66c}\x{f01}\x{1680}<
+    \np\x{300}9!\$ < 
+\= Expect no match     
+    ap\x{300}9!\$ < 
+  
+/^\PC/utf
+    X
+\= Expect no match     
+    \x7f
+  
+/^\PL/utf
+    9
+\= Expect no match     
+    \x{c0}
+  
+/^\PM/utf
+    X
+\= Expect no match     
+    \x{30f}
+  
+/^\PN/utf
+    X
+\= Expect no match     
+    \x{660}
+  
+/^\PP/utf
+    X
+\= Expect no match 
+    \x{66c}
+  
+/^\PS/utf
+    X
+\= Expect no match 
+    \x{f01}
+  
+/^\PZ/utf
+    X
+\= Expect no match 
+    \x{1680}
+    
+/^\p{Cc}/utf
+    \x{017}
+    \x{09f} 
+\= Expect no match
+    \x{0600} 
+  
+/^\p{Cf}/utf
+    \x{601}
+\= Expect no match
+    \x{09f} 
+  
+/^\p{Cn}/utf
+    \x{e0000}
+\= Expect no match
+    \x{09f} 
+  
+/^\p{Co}/utf
+    \x{f8ff}
+\= Expect no match
+    \x{09f} 
+  
+/^\p{Ll}/utf
+    a
+\= Expect no match 
+    Z
+    \x{e000}  
+  
+/^\p{Lm}/utf
+    \x{2b0}
+\= Expect no match
+    a 
+  
+/^\p{Lo}/utf
+    \x{1bb}
+    \x{3400}
+    \x{3401}
+    \x{4d00}
+    \x{4db4}
+    \x{4db5}     
+\= Expect no match
+    a 
+    \x{2b0}
+    \x{4db6} 
+  
+/^\p{Lt}/utf
+    \x{1c5}
+\= Expect no match
+    a 
+    \x{2b0}
+  
+/^\p{Lu}/utf
+    A
+\= Expect no match
+    \x{2b0}
+  
+/^\p{Mc}/utf
+    \x{903}
+\= Expect no match
+    X
+    \x{300}
+       
+/^\p{Me}/utf
+    \x{488}
+\= Expect no match
+    X
+    \x{903}
+    \x{300}
+  
+/^\p{Mn}/utf
+    \x{300}
+\= Expect no match
+    X
+    \x{903}
+  
+/^\p{Nd}+/utf
+    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}
+\= Expect no match
+    X
+  
+/^\p{Nl}/utf
+    \x{16ee}
+\= Expect no match
+    X
+    \x{966}
+  
+/^\p{No}/utf
+    \x{b2}
+    \x{b3}
+\= Expect no match
+    X
+    \x{16ee}
+  
+/^\p{Pc}/utf
+    \x5f
+    \x{203f}
+\= Expect no match
+    X
+    -
+    \x{58a}
+  
+/^\p{Pd}/utf
+    -
+    \x{58a}
+\= Expect no match
+    X
+    \x{203f}
+  
+/^\p{Pe}/utf
+    )
+    ]
+    }
+    \x{f3b}
+\= Expect no match
+    X
+    \x{203f}
+    (
+    [
+    {
+    \x{f3c}
+  
+/^\p{Pf}/utf
+    \x{bb}
+    \x{2019}
+\= Expect no match
+    X
+    \x{203f}
+  
+/^\p{Pi}/utf
+    \x{ab}
+    \x{2018}
+\= Expect no match
+    X
+    \x{203f}
+  
+/^\p{Po}/utf
+    !
+    \x{37e}
+\= Expect no match
+    X
+    \x{203f}
+  
+/^\p{Ps}/utf
+    (
+    [
+    {
+    \x{f3c}
+\= Expect no match
+    X
+    )
+    ]
+    }
+    \x{f3b}
+  
+/^\p{Sk}/utf
+    \x{2c2}
+\= Expect no match
+    X
+    \x{9f2}
+  
+/^\p{Sm}+/utf
+    +<|~\x{ac}\x{2044}
+\= Expect no match
+    X
+    \x{9f2}
+  
+/^\p{So}/utf
+    \x{a6}
+    \x{482} 
+\= Expect no match
+    X
+    \x{9f2}
+  
+/^\p{Zl}/utf
+    \x{2028}
+\= Expect no match
+    X
+    \x{2029}
+  
+/^\p{Zp}/utf
+    \x{2029}
+\= Expect no match
+    X
+    \x{2028}
+  
+/\p{Nd}+(..)/utf
+    \x{660}\x{661}\x{662}ABC
+  
+/\p{Nd}+?(..)/utf
+    \x{660}\x{661}\x{662}ABC
+  
+/\p{Nd}{2,}(..)/utf
+    \x{660}\x{661}\x{662}ABC
+  
+/\p{Nd}{2,}?(..)/utf
+    \x{660}\x{661}\x{662}ABC
+  
+/\p{Nd}*(..)/utf
+    \x{660}\x{661}\x{662}ABC
+  
+/\p{Nd}*?(..)/utf
+    \x{660}\x{661}\x{662}ABC
+  
+/\p{Nd}{2}(..)/utf
+    \x{660}\x{661}\x{662}ABC
+  
+/\p{Nd}{2,3}(..)/utf
+    \x{660}\x{661}\x{662}ABC
+  
+/\p{Nd}{2,3}?(..)/utf
+    \x{660}\x{661}\x{662}ABC
+  
+/\p{Nd}?(..)/utf
+    \x{660}\x{661}\x{662}ABC
+  
+/\p{Nd}??(..)/utf
+    \x{660}\x{661}\x{662}ABC
+  
+/\p{Nd}*+(..)/utf
+    \x{660}\x{661}\x{662}ABC
+  
+/\p{Nd}*+(...)/utf
+    \x{660}\x{661}\x{662}ABC
+  
+/\p{Nd}*+(....)/utf
+\= Expect no match
+    \x{660}\x{661}\x{662}ABC
+  
+/(?<=A\p{Nd})XYZ/utf
+    A2XYZ
+    123A5XYZPQR
+    ABA\x{660}XYZpqr
+\= Expect no match
+    AXYZ
+    XYZ     
+    
+/(?<!\pL)XYZ/utf
+    1XYZ
+    AB=XYZ.. 
+    XYZ 
+\= Expect no match
+    WXYZ 
+
+/[\P{Nd}]+/utf
+    abcd
+\= Expect no match
+    1234
+
+/\D+/utf
+    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+\= Expect no match
+    11111111111111111111111111111111111111111111111111111111111111111111111
+     
+/\P{Nd}+/utf
+    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+\= Expect no match
+    11111111111111111111111111111111111111111111111111111111111111111111111
+
+/[\D]+/utf
+    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+\= Expect no match
+    11111111111111111111111111111111111111111111111111111111111111111111111
+
+/[\P{Nd}]+/utf
+    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+\= Expect no match
+    11111111111111111111111111111111111111111111111111111111111111111111111
+
+/[\D\P{Nd}]+/utf
+    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+\= Expect no match
+    11111111111111111111111111111111111111111111111111111111111111111111111
+
+/\pL/utf
+    a
+    A 
+
+/\pL/i,utf
+    a
+    A 
+    
+/\p{Lu}/utf
+    A
+    aZ
+\= Expect no match
+    abc   
+
+/\p{Ll}/utf
+    a
+    Az
+\= Expect no match
+    ABC   
+
+/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/utf
+    A\x{391}\x{10427}\x{ff3a}\x{1fb0}
+\= Expect no match
+    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}/i,utf
+    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}+/i,utf
+    \x{391}\x{3b1}\x{3b1}\x{3b1}\x{391}
+
+/\x{391}{3,5}(.)/i,utf
+    \x{391}\x{3b1}\x{3b1}\x{3b1}\x{391}X
+
+/\x{391}{3,5}?(.)/i,utf
+    \x{391}\x{3b1}\x{3b1}\x{3b1}\x{391}X
+
+/[\x{391}\x{ff3a}]/i,utf
+    \x{391}
+    \x{ff3a}
+    \x{3b1}
+    \x{ff5a}   
+    
+/^(\X*)C/utf
+    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/utf
+    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*)(.)/utf
+    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*?)(.)/utf
+    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(.)/utf
+\= Expect no match
+    A\x{300}\x{301}\x{302}
+
+/^\X{2,3}(.)/utf
+    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}?(.)/utf
+    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/utf
+    A
+    A\x{300}BC 
+    A\x{300}\x{301}\x{302}BC 
+    \x{300}  
+
+/^\p{Han}+/utf
+    \x{2e81}\x{3007}\x{2f804}\x{31a0}
+\= Expect no match
+    \x{2e7f}  
+
+/^\P{Katakana}+/utf
+    \x{3105}
+\= Expect no match
+    \x{30ff}  
+
+/^[\p{Arabic}]/utf
+    \x{06e9}
+    \x{060b}
+\= Expect no match
+    X\x{06e9}   
+
+/^[\P{Yi}]/utf
+    \x{2f800}
+\= Expect no match
+    \x{a014}
+    \x{a4c6}   
+    
+/^\p{Any}X/utf
+    AXYZ
+    \x{1234}XYZ 
+\= Expect no match
+    X  
+    
+/^\P{Any}X/utf
+\= Expect no match
+    AX
+    
+/^\p{Any}?X/utf
+    XYZ
+    AXYZ
+    \x{1234}XYZ 
+\= Expect no match
+    ABXYZ   
+
+/^\P{Any}?X/utf
+    XYZ
+\= Expect no match
+    AXYZ
+    \x{1234}XYZ 
+    ABXYZ   
+
+/^\p{Any}+X/utf
+    AXYZ
+    \x{1234}XYZ
+    A\x{1234}XYZ
+\= Expect no match
+    XYZ
+
+/^\P{Any}+X/utf
+\= Expect no match
+    AXYZ
+    \x{1234}XYZ
+    A\x{1234}XYZ
+    XYZ
+
+/^\p{Any}*X/utf
+    XYZ
+    AXYZ
+    \x{1234}XYZ
+    A\x{1234}XYZ
+
+/^\P{Any}*X/utf
+    XYZ
+\= Expect no match
+    AXYZ
+    \x{1234}XYZ
+    A\x{1234}XYZ
+
+/^[\p{Any}]X/utf
+    AXYZ
+    \x{1234}XYZ 
+\= Expect no match
+    X  
+    
+/^[\P{Any}]X/utf
+\= Expect no match
+    AX
+    
+/^[\p{Any}]?X/utf
+    XYZ
+    AXYZ
+    \x{1234}XYZ 
+\= Expect no match
+    ABXYZ   
+
+/^[\P{Any}]?X/utf
+    XYZ
+\= Expect no match
+    AXYZ
+    \x{1234}XYZ 
+    ABXYZ   
+
+/^[\p{Any}]+X/utf
+    AXYZ
+    \x{1234}XYZ
+    A\x{1234}XYZ
+\= Expect no match
+    XYZ
+
+/^[\P{Any}]+X/utf
+\= Expect no match
+    AXYZ
+    \x{1234}XYZ
+    A\x{1234}XYZ
+    XYZ
+
+/^[\p{Any}]*X/utf
+    XYZ
+    AXYZ
+    \x{1234}XYZ
+    A\x{1234}XYZ
+
+/^[\P{Any}]*X/utf
+    XYZ
+\= Expect no match
+    AXYZ
+    \x{1234}XYZ
+    A\x{1234}XYZ
+
+/^\p{Any}{3,5}?/utf
+    abcdefgh
+    \x{1234}\n\r\x{3456}xyz 
+
+/^\p{Any}{3,5}/utf
+    abcdefgh
+    \x{1234}\n\r\x{3456}xyz 
+
+/^\P{Any}{3,5}?/utf
+\= Expect no match
+    abcdefgh
+    \x{1234}\n\r\x{3456}xyz 
+
+/^\p{L&}X/utf
+     AXY
+     aXY
+     \x{1c5}XY
+\= Expect no match
+    \x{1bb}XY
+    \x{2b0}XY
+    !XY      
+
+/^[\p{L&}]X/utf
+    AXY
+    aXY
+     \x{1c5}XY
+\= Expect no match
+    \x{1bb}XY
+    \x{2b0}XY
+    !XY      
+
+/^\p{L&}+X/utf
+    AXY
+    aXY
+    AbcdeXyz 
+    \x{1c5}AbXY
+    abcDEXypqreXlmn 
+\= Expect no match
+    \x{1bb}XY
+    \x{2b0}XY
+    !XY      
+
+/^[\p{L&}]+X/utf
+    AXY
+    aXY
+    AbcdeXyz 
+    \x{1c5}AbXY
+    abcDEXypqreXlmn 
+\= Expect no match
+    \x{1bb}XY
+    \x{2b0}XY
+    !XY      
+
+/^\p{L&}+?X/utf
+    AXY
+    aXY
+    AbcdeXyz 
+    \x{1c5}AbXY
+    abcDEXypqreXlmn 
+\= Expect no match
+    \x{1bb}XY
+    \x{2b0}XY
+    !XY      
+
+/^[\p{L&}]+?X/utf
+    AXY
+    aXY
+    AbcdeXyz 
+    \x{1c5}AbXY
+    abcDEXypqreXlmn 
+\= Expect no match
+    \x{1bb}XY
+    \x{2b0}XY
+    !XY      
+
+/^\P{L&}X/utf
+    !XY
+    \x{1bb}XY
+    \x{2b0}XY
+\= Expect no match
+    \x{1c5}XY
+    AXY      
+
+/^[\P{L&}]X/utf
+    !XY
+    \x{1bb}XY
+    \x{2b0}XY
+\= Expect no match
+    \x{1c5}XY
+    AXY      
+
+/^(\p{Z}[^\p{C}\p{Z}]+)*$/
+    \xa0!
+
+/^[\pL](abc)(?1)/
+    AabcabcYZ    
+
+/([\pL]=(abc))*X/
+    L=abcX
+
+/^\p{Balinese}\p{Cuneiform}\p{Nko}\p{Phags_Pa}\p{Phoenician}/utf
+    \x{1b00}\x{12000}\x{7c0}\x{a840}\x{10900}
+
+# Check property support in non-UTF mode
+ 
+/\p{L}{4}/
+    123abcdefg
+    123abc\xc4\xc5zz
+
+/\X{1,3}\d/
+\= Expect no match
+    \x8aBCD
+  
+/\X?\d/
+\= Expect no match
+    \x8aBCD 
+
+/\P{L}?\d/
+\= Expect no match
+    \x8aBCD 
+
+/[\PPP\x8a]{1,}\x80/
+    A\x80
+
+/^[\p{Arabic}]/utf
+    \x{604}
+    \x{60e} 
+    \x{656} 
+    \x{657} 
+    \x{658} 
+    \x{659} 
+    \x{65a} 
+    \x{65b} 
+    \x{65c} 
+    \x{65d} 
+    \x{65e} 
+    \x{65f}
+    \x{66a} 
+    \x{6e9} 
+    \x{6ef}
+    \x{6fa}  
+\= Expect no match
+    \x{650}
+    \x{651}  
+    \x{652}  
+    \x{653}  
+    \x{654} 
+    \x{655} 
+    
+/^\p{Cyrillic}/utf
+    \x{1d2b} 
+    
+/^\p{Common}/utf
+    \x{589}
+    \x{60c}
+    \x{61f}  
+    \x{964}
+    \x{965}  
+
+/^\p{Inherited}/utf
+    \x{64b}
+    \x{654}
+    \x{655}
+    \x{200c} 
+\= Expect no match
+    \x{64a}
+    \x{656}     
+
+/^\p{Shavian}/utf
+    \x{10450}
+    \x{1047f}
+    
+/^\p{Deseret}/utf
+    \x{10400}
+    \x{1044f}
+    
+/^\p{Osmanya}/utf
+    \x{10480}
+    \x{1049d}
+    \x{104a0}
+    \x{104a9}
+\= Expect no match
+    \x{1049e}
+    \x{1049f}
+    \x{104aa}           
+
+/\p{Carian}\p{Cham}\p{Kayah_Li}\p{Lepcha}\p{Lycian}\p{Lydian}\p{Ol_Chiki}\p{Rejang}\p{Saurashtra}\p{Sundanese}\p{Vai}/utf
+    \x{102A4}\x{AA52}\x{A91D}\x{1C46}\x{10283}\x{1092E}\x{1C6B}\x{A93B}\x{A8BF}\x{1BA0}\x{A50A}====
+
+/\x{a77d}\x{1d79}/i,utf
+    \x{a77d}\x{1d79}
+    \x{1d79}\x{a77d} 
+
+/\x{a77d}\x{1d79}/utf
+    \x{a77d}\x{1d79}
+\= Expect no match 
+    \x{1d79}\x{a77d} 
+
+/(A)\1/i,utf
+    AA
+    Aa
+    aa
+    aA
+
+/(\x{10a})\1/i,utf
+    \x{10a}\x{10a}
+    \x{10a}\x{10b}
+    \x{10b}\x{10b}
+    \x{10b}\x{10a}
+    
+# The next two tests are for property support in non-UTF mode
+
+/(?:\p{Lu}|\x20)+/
+    \x41\x20\x50\xC2\x54\xC9\x20\x54\x4F\x44\x41\x59
+
+/[\p{Lu}\x20]+/
+    \x41\x20\x50\xC2\x54\xC9\x20\x54\x4F\x44\x41\x59
+
+/\p{Avestan}\p{Bamum}\p{Egyptian_Hieroglyphs}\p{Imperial_Aramaic}\p{Inscriptional_Pahlavi}\p{Inscriptional_Parthian}\p{Javanese}\p{Kaithi}\p{Lisu}\p{Meetei_Mayek}\p{Old_South_Arabian}\p{Old_Turkic}\p{Samaritan}\p{Tai_Tham}\p{Tai_Viet}/utf
+    \x{10b00}\x{a6ef}\x{13007}\x{10857}\x{10b78}\x{10b58}\x{a980}\x{110c1}\x{a4ff}\x{abc0}\x{10a7d}\x{10c48}\x{0800}\x{1aad}\x{aac0}
+
+/^\w+/utf,ucp
+    Az_\x{aa}\x{c0}\x{1c5}\x{2b0}\x{3b6}\x{1d7c9}\x{2fa1d}1\x{660}\x{bef}\x{16ee}
+
+/^[[:xdigit:]]*/utf,ucp
+    1a\x{660}\x{bef}\x{16ee}
+  
+/^\d+/utf,ucp
+    1\x{660}\x{bef}\x{16ee}
+  
+/^[[:digit:]]+/utf,ucp
+    1\x{660}\x{bef}\x{16ee}
+
+/^>\s+/utf,ucp
+    >\x{20}\x{a0}\x{1680}\x{2028}\x{2029}\x{202f}\x{9}\x{b} 
+  
+/^>\pZ+/utf,ucp
+    >\x{20}\x{a0}\x{1680}\x{2028}\x{2029}\x{202f}\x{9}\x{b} 
+  
+/^>[[:space:]]*/utf,ucp
+    >\x{20}\x{a0}\x{1680}\x{2028}\x{2029}\x{202f}\x{9}\x{b} 
+
+/^>[[:blank:]]*/utf,ucp
+    >\x{20}\x{a0}\x{1680}\x{2000}\x{202f}\x{9}\x{b}\x{2028} 
+
+/^[[:alpha:]]*/utf,ucp
+    Az\x{aa}\x{c0}\x{1c5}\x{2b0}\x{3b6}\x{1d7c9}\x{2fa1d}
+
+/^[[:alnum:]]*/utf,ucp
+    Az\x{aa}\x{c0}\x{1c5}\x{2b0}\x{3b6}\x{1d7c9}\x{2fa1d}1\x{660}\x{bef}\x{16ee}
+
+/^[[:cntrl:]]*/utf,ucp
+    \x{0}\x{09}\x{1f}\x{7f}\x{9f} 
+
+/^[[:graph:]]*/utf,ucp
+    A\x{a1}\x{a0}
+
+/^[[:print:]]*/utf,ucp
+    A z\x{a0}\x{a1}
+
+/^[[:punct:]]*/utf,ucp
+    .+\x{a1}\x{a0}
+
+/\p{Zs}*?\R/
+\= Expect no match
+    a\xFCb   
+
+/\p{Zs}*\R/
+\= Expect no match 
+    a\xFCb   
+
+/ⱥ/i,utf
+    ⱥ
+    Ⱥx 
+    Ⱥ 
+
+/[ⱥ]/i,utf
+    ⱥ
+    Ⱥx 
+    Ⱥ 
+
+/Ⱥ/i,utf
+    Ⱥ
+    ⱥ
+    
+# These are tests for extended grapheme clusters  
+
+/^\X/utf,aftertext
+    G\x{34e}\x{34e}X
+    \x{34e}\x{34e}X
+    \x04X
+    \x{1100}X
+    \x{1100}\x{34e}X
+    \x{1b04}\x{1b04}X 
+    *These match up to the roman letters
+    \x{1111}\x{1111}L,L
+    \x{1111}\x{1111}\x{1169}L,L,V
+    \x{1111}\x{ae4c}L, LV
+    \x{1111}\x{ad89}L, LVT
+    \x{1111}\x{ae4c}\x{1169}L, LV, V
+    \x{1111}\x{ae4c}\x{1169}\x{1169}L, LV, V, V
+    \x{1111}\x{ae4c}\x{1169}\x{11fe}L, LV, V, T
+    \x{1111}\x{ad89}\x{11fe}L, LVT, T
+    \x{1111}\x{ad89}\x{11fe}\x{11fe}L, LVT, T, T
+    \x{ad89}\x{11fe}\x{11fe}LVT, T, T
+    *These match just the first codepoint (invalid sequence)
+    \x{1111}\x{11fe}L, T
+    \x{ae4c}\x{1111}LV, L
+    \x{ae4c}\x{ae4c}LV, LV
+    \x{ae4c}\x{ad89}LV, LVT
+    \x{1169}\x{1111}V, L
+    \x{1169}\x{ae4c}V, LV
+    \x{1169}\x{ad89}V, LVT
+    \x{ad89}\x{1111}LVT, L
+    \x{ad89}\x{1169}LVT, V
+    \x{ad89}\x{ae4c}LVT, LV
+    \x{ad89}\x{ad89}LVT, LVT
+    \x{11fe}\x{1111}T, L
+    \x{11fe}\x{1169}T, V
+    \x{11fe}\x{ae4c}T, LV
+    \x{11fe}\x{ad89}T, LVT
+    *Test extend and spacing mark
+    \x{1111}\x{ae4c}\x{0711}L, LV, extend
+    \x{1111}\x{ae4c}\x{1b04}L, LV, spacing mark
+    \x{1111}\x{ae4c}\x{1b04}\x{0711}\x{1b04}L, LV, spacing mark, extend, spacing mark
+    *Test CR, LF, and control
+    \x0d\x{0711}CR, extend
+    \x0d\x{1b04}CR, spacingmark
+    \x0a\x{0711}LF, extend
+    \x0a\x{1b04}LF, spacingmark
+    \x0b\x{0711}Control, extend
+    \x09\x{1b04}Control, spacingmark
+    *There are no Prepend characters, so we can't test Prepend, CR
+    
+/^(?>\X{2})X/utf,aftertext
+    \x{1111}\x{ae4c}\x{1111}\x{ae4c}X
+    
+/^\X{2,4}X/utf,aftertext
+    \x{1111}\x{ae4c}\x{1111}\x{ae4c}X
+    \x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}X
+    \x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}X
+
+/^\X{2,4}?X/utf,aftertext
+    \x{1111}\x{ae4c}\x{1111}\x{ae4c}X
+    \x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}X
+    \x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}X
+
+/\X*Z/utf,no_start_optimize
+\= Expect no match
+    A\x{300}
+
+/\X*(.)/utf,no_start_optimize
+    A\x{1111}\x{ae4c}\x{1169}
+
+# --------------------------------------------
+
+/\x{1e9e}+/i,utf
+    \x{1e9e}\x{00df}
+
+/[z\x{1e9e}]+/i,utf
+    \x{1e9e}\x{00df}
+
+/\x{00df}+/i,utf
+    \x{1e9e}\x{00df}
+
+/[z\x{00df}]+/i,utf
+    \x{1e9e}\x{00df}
+
+/\x{1f88}+/i,utf
+    \x{1f88}\x{1f80} 
+
+/[z\x{1f88}]+/i,utf
+    \x{1f88}\x{1f80} 
+    
+# Characters with more than one other case; test in classes 
+
+/[z\x{00b5}]+/i,utf
+    \x{00b5}\x{039c}\x{03bc}
+
+/[z\x{039c}]+/i,utf
+    \x{00b5}\x{039c}\x{03bc}
+
+/[z\x{03bc}]+/i,utf
+    \x{00b5}\x{039c}\x{03bc}
+
+/[z\x{00c5}]+/i,utf
+    \x{00c5}\x{00e5}\x{212b}
+
+/[z\x{00e5}]+/i,utf
+    \x{00c5}\x{00e5}\x{212b}
+
+/[z\x{212b}]+/i,utf
+    \x{00c5}\x{00e5}\x{212b}
+
+/[z\x{01c4}]+/i,utf
+    \x{01c4}\x{01c5}\x{01c6}
+
+/[z\x{01c5}]+/i,utf
+    \x{01c4}\x{01c5}\x{01c6}
+
+/[z\x{01c6}]+/i,utf
+    \x{01c4}\x{01c5}\x{01c6}
+
+/[z\x{01c7}]+/i,utf
+    \x{01c7}\x{01c8}\x{01c9}
+
+/[z\x{01c8}]+/i,utf
+    \x{01c7}\x{01c8}\x{01c9}
+
+/[z\x{01c9}]+/i,utf
+    \x{01c7}\x{01c8}\x{01c9}
+
+/[z\x{01ca}]+/i,utf
+    \x{01ca}\x{01cb}\x{01cc}
+
+/[z\x{01cb}]+/i,utf
+    \x{01ca}\x{01cb}\x{01cc}
+
+/[z\x{01cc}]+/i,utf
+    \x{01ca}\x{01cb}\x{01cc}
+
+/[z\x{01f1}]+/i,utf
+    \x{01f1}\x{01f2}\x{01f3}
+
+/[z\x{01f2}]+/i,utf
+    \x{01f1}\x{01f2}\x{01f3}
+
+/[z\x{01f3}]+/i,utf
+    \x{01f1}\x{01f2}\x{01f3}
+
+/[z\x{0345}]+/i,utf
+    \x{0345}\x{0399}\x{03b9}\x{1fbe}
+
+/[z\x{0399}]+/i,utf
+    \x{0345}\x{0399}\x{03b9}\x{1fbe}
+
+/[z\x{03b9}]+/i,utf
+    \x{0345}\x{0399}\x{03b9}\x{1fbe}
+
+/[z\x{1fbe}]+/i,utf
+    \x{0345}\x{0399}\x{03b9}\x{1fbe}
+
+/[z\x{0392}]+/i,utf
+    \x{0392}\x{03b2}\x{03d0}
+
+/[z\x{03b2}]+/i,utf
+    \x{0392}\x{03b2}\x{03d0}
+
+/[z\x{03d0}]+/i,utf
+    \x{0392}\x{03b2}\x{03d0}
+
+/[z\x{0395}]+/i,utf
+    \x{0395}\x{03b5}\x{03f5}
+
+/[z\x{03b5}]+/i,utf
+    \x{0395}\x{03b5}\x{03f5}
+
+/[z\x{03f5}]+/i,utf
+    \x{0395}\x{03b5}\x{03f5}
+
+/[z\x{0398}]+/i,utf
+    \x{0398}\x{03b8}\x{03d1}\x{03f4}
+
+/[z\x{03b8}]+/i,utf
+    \x{0398}\x{03b8}\x{03d1}\x{03f4}
+
+/[z\x{03d1}]+/i,utf
+    \x{0398}\x{03b8}\x{03d1}\x{03f4}
+
+/[z\x{03f4}]+/i,utf
+    \x{0398}\x{03b8}\x{03d1}\x{03f4}
+
+/[z\x{039a}]+/i,utf
+    \x{039a}\x{03ba}\x{03f0}
+
+/[z\x{03ba}]+/i,utf
+    \x{039a}\x{03ba}\x{03f0}
+
+/[z\x{03f0}]+/i,utf
+    \x{039a}\x{03ba}\x{03f0}
+
+/[z\x{03a0}]+/i,utf
+    \x{03a0}\x{03c0}\x{03d6} 
+
+/[z\x{03c0}]+/i,utf
+    \x{03a0}\x{03c0}\x{03d6} 
+
+/[z\x{03d6}]+/i,utf
+    \x{03a0}\x{03c0}\x{03d6} 
+
+/[z\x{03a1}]+/i,utf
+    \x{03a1}\x{03c1}\x{03f1}
+
+/[z\x{03c1}]+/i,utf
+    \x{03a1}\x{03c1}\x{03f1}
+
+/[z\x{03f1}]+/i,utf
+    \x{03a1}\x{03c1}\x{03f1}
+
+/[z\x{03a3}]+/i,utf
+    \x{03A3}\x{03C2}\x{03C3}
+
+/[z\x{03c2}]+/i,utf
+    \x{03A3}\x{03C2}\x{03C3}
+
+/[z\x{03c3}]+/i,utf
+    \x{03A3}\x{03C2}\x{03C3}
+
+/[z\x{03a6}]+/i,utf
+    \x{03a6}\x{03c6}\x{03d5} 
+
+/[z\x{03c6}]+/i,utf
+    \x{03a6}\x{03c6}\x{03d5} 
+
+/[z\x{03d5}]+/i,utf
+    \x{03a6}\x{03c6}\x{03d5} 
+
+/[z\x{03c9}]+/i,utf
+    \x{03c9}\x{03a9}\x{2126}
+
+/[z\x{03a9}]+/i,utf
+    \x{03c9}\x{03a9}\x{2126}
+
+/[z\x{2126}]+/i,utf
+    \x{03c9}\x{03a9}\x{2126}
+
+/[z\x{1e60}]+/i,utf
+    \x{1e60}\x{1e61}\x{1e9b}
+
+/[z\x{1e61}]+/i,utf
+    \x{1e60}\x{1e61}\x{1e9b}
+
+/[z\x{1e9b}]+/i,utf
+    \x{1e60}\x{1e61}\x{1e9b}
+
+# Perl 5.12.4 gets these wrong, but 5.15.3 is OK 
+
+/[z\x{004b}]+/i,utf
+    \x{004b}\x{006b}\x{212a}
+
+/[z\x{006b}]+/i,utf
+    \x{004b}\x{006b}\x{212a}
+
+/[z\x{212a}]+/i,utf
+    \x{004b}\x{006b}\x{212a}
+
+/[z\x{0053}]+/i,utf
+    \x{0053}\x{0073}\x{017f}
+
+/[z\x{0073}]+/i,utf
+    \x{0053}\x{0073}\x{017f}
+
+/[z\x{017f}]+/i,utf
+    \x{0053}\x{0073}\x{017f}
+    
+# --------------------------------------  
+
+/(ΣΆΜΟΣ) \1/i,utf
+    ΣΆΜΟΣ ΣΆΜΟΣ
+    ΣΆΜΟΣ σάμος
+    σάμος σάμος
+    σάμος σάμοσ
+    σάμος ΣΆΜΟΣ  
+
+/(σάμος) \1/i,utf
+    ΣΆΜΟΣ ΣΆΜΟΣ
+    ΣΆΜΟΣ σάμος
+    σάμος σάμος
+    σάμος σάμοσ
+    σάμος ΣΆΜΟΣ  
+
+/(ΣΆΜΟΣ) \1*/i,utf
+    ΣΆΜΟΣ\x20
+    ΣΆΜΟΣ ΣΆΜΟΣσάμοςσάμος
+
+# Perl matches these 
+
+/\x{00b5}+/i,utf
+    \x{00b5}\x{039c}\x{03bc}
+
+/\x{039c}+/i,utf
+    \x{00b5}\x{039c}\x{03bc}
+
+/\x{03bc}+/i,utf
+    \x{00b5}\x{039c}\x{03bc}
+
+
+/\x{00c5}+/i,utf
+    \x{00c5}\x{00e5}\x{212b}
+
+/\x{00e5}+/i,utf
+    \x{00c5}\x{00e5}\x{212b}
+
+/\x{212b}+/i,utf
+    \x{00c5}\x{00e5}\x{212b}
+
+
+/\x{01c4}+/i,utf
+    \x{01c4}\x{01c5}\x{01c6}
+
+/\x{01c5}+/i,utf
+    \x{01c4}\x{01c5}\x{01c6}
+
+/\x{01c6}+/i,utf
+    \x{01c4}\x{01c5}\x{01c6}
+
+
+/\x{01c7}+/i,utf
+    \x{01c7}\x{01c8}\x{01c9}
+
+/\x{01c8}+/i,utf
+    \x{01c7}\x{01c8}\x{01c9}
+
+/\x{01c9}+/i,utf
+    \x{01c7}\x{01c8}\x{01c9}
+
+
+/\x{01ca}+/i,utf
+    \x{01ca}\x{01cb}\x{01cc}
+
+/\x{01cb}+/i,utf
+    \x{01ca}\x{01cb}\x{01cc}
+
+/\x{01cc}+/i,utf
+    \x{01ca}\x{01cb}\x{01cc}
+
+
+/\x{01f1}+/i,utf
+    \x{01f1}\x{01f2}\x{01f3}
+
+/\x{01f2}+/i,utf
+    \x{01f1}\x{01f2}\x{01f3}
+
+/\x{01f3}+/i,utf
+    \x{01f1}\x{01f2}\x{01f3}
+
+
+/\x{0345}+/i,utf
+    \x{0345}\x{0399}\x{03b9}\x{1fbe}
+
+/\x{0399}+/i,utf
+    \x{0345}\x{0399}\x{03b9}\x{1fbe}
+
+/\x{03b9}+/i,utf
+    \x{0345}\x{0399}\x{03b9}\x{1fbe}
+
+/\x{1fbe}+/i,utf
+    \x{0345}\x{0399}\x{03b9}\x{1fbe}
+
+
+/\x{0392}+/i,utf
+    \x{0392}\x{03b2}\x{03d0}
+
+/\x{03b2}+/i,utf
+    \x{0392}\x{03b2}\x{03d0}
+
+/\x{03d0}+/i,utf
+    \x{0392}\x{03b2}\x{03d0}
+    
+
+/\x{0395}+/i,utf
+    \x{0395}\x{03b5}\x{03f5}
+
+/\x{03b5}+/i,utf
+    \x{0395}\x{03b5}\x{03f5}
+
+/\x{03f5}+/i,utf
+    \x{0395}\x{03b5}\x{03f5}
+
+
+/\x{0398}+/i,utf
+    \x{0398}\x{03b8}\x{03d1}\x{03f4}
+
+/\x{03b8}+/i,utf
+    \x{0398}\x{03b8}\x{03d1}\x{03f4}
+
+/\x{03d1}+/i,utf
+    \x{0398}\x{03b8}\x{03d1}\x{03f4}
+
+/\x{03f4}+/i,utf
+    \x{0398}\x{03b8}\x{03d1}\x{03f4}
+    
+
+/\x{039a}+/i,utf
+    \x{039a}\x{03ba}\x{03f0}
+
+/\x{03ba}+/i,utf
+    \x{039a}\x{03ba}\x{03f0}
+
+/\x{03f0}+/i,utf
+    \x{039a}\x{03ba}\x{03f0}
+    
+
+/\x{03a0}+/i,utf
+    \x{03a0}\x{03c0}\x{03d6} 
+
+/\x{03c0}+/i,utf
+    \x{03a0}\x{03c0}\x{03d6} 
+
+/\x{03d6}+/i,utf
+    \x{03a0}\x{03c0}\x{03d6} 
+
+
+/\x{03a1}+/i,utf
+    \x{03a1}\x{03c1}\x{03f1}
+
+/\x{03c1}+/i,utf
+    \x{03a1}\x{03c1}\x{03f1}
+
+/\x{03f1}+/i,utf
+    \x{03a1}\x{03c1}\x{03f1}
+
+
+/\x{03a3}+/i,utf
+    \x{03A3}\x{03C2}\x{03C3}
+
+/\x{03c2}+/i,utf
+    \x{03A3}\x{03C2}\x{03C3}
+
+/\x{03c3}+/i,utf
+    \x{03A3}\x{03C2}\x{03C3}
+    
+
+/\x{03a6}+/i,utf
+    \x{03a6}\x{03c6}\x{03d5} 
+
+/\x{03c6}+/i,utf
+    \x{03a6}\x{03c6}\x{03d5} 
+
+/\x{03d5}+/i,utf
+    \x{03a6}\x{03c6}\x{03d5} 
+
+
+/\x{03c9}+/i,utf
+    \x{03c9}\x{03a9}\x{2126}
+
+/\x{03a9}+/i,utf
+    \x{03c9}\x{03a9}\x{2126}
+
+/\x{2126}+/i,utf
+    \x{03c9}\x{03a9}\x{2126}
+    
+
+/\x{1e60}+/i,utf
+    \x{1e60}\x{1e61}\x{1e9b}
+
+/\x{1e61}+/i,utf
+    \x{1e60}\x{1e61}\x{1e9b}
+
+/\x{1e9b}+/i,utf
+    \x{1e60}\x{1e61}\x{1e9b}
+    
+
+/\x{1e9e}+/i,utf
+    \x{1e9e}\x{00df}
+
+/\x{00df}+/i,utf
+    \x{1e9e}\x{00df}
+    
+
+/\x{1f88}+/i,utf
+    \x{1f88}\x{1f80} 
+
+/\x{1f80}+/i,utf
+    \x{1f88}\x{1f80} 
+
+# Perl 5.12.4 gets these wrong, but 5.15.3 is OK 
+
+/\x{004b}+/i,utf
+    \x{004b}\x{006b}\x{212a}
+
+/\x{006b}+/i,utf
+    \x{004b}\x{006b}\x{212a}
+
+/\x{212a}+/i,utf
+    \x{004b}\x{006b}\x{212a}
+
+
+/\x{0053}+/i,utf
+    \x{0053}\x{0073}\x{017f}
+
+/\x{0073}+/i,utf
+    \x{0053}\x{0073}\x{017f}
+
+/\x{017f}+/i,utf
+    \x{0053}\x{0073}\x{017f}
+
+/^\p{Any}*\d{4}/utf
+    1234
+\= Expect no match
+    123 
+
+/^\X*\w{4}/utf
+    1234
+\= Expect no match
+    123  
+
+/^A\s+Z/utf,ucp
+    A\x{2005}Z
+    A\x{85}\x{2005}Z
+
+/^A[\s]+Z/utf,ucp
+    A\x{2005}Z
+    A\x{85}\x{2005}Z
+
+/^[[:graph:]]+$/utf,ucp
+    Letter:ABC
+    Mark:\x{300}\x{1d172}\x{1d17b}
+    Number:9\x{660}
+    Punctuation:\x{66a},;
+    Symbol:\x{6de}<>\x{fffc}
+    Cf-property:\x{ad}\x{600}\x{601}\x{602}\x{603}\x{604}\x{6dd}\x{70f}
+    \x{200b}\x{200c}\x{200d}\x{200e}\x{200f}
+    \x{202a}\x{202b}\x{202c}\x{202d}\x{202e}
+    \x{2060}\x{2061}\x{2062}\x{2063}\x{2064}
+    \x{206a}\x{206b}\x{206c}\x{206d}\x{206e}\x{206f}
+    \x{feff}
+    \x{fff9}\x{fffa}\x{fffb}
+    \x{110bd}
+    \x{1d173}\x{1d174}\x{1d175}\x{1d176}\x{1d177}\x{1d178}\x{1d179}\x{1d17a}
+    \x{e0001}
+    \x{e0020}\x{e0030}\x{e0040}\x{e0050}\x{e0060}\x{e0070}\x{e007f}
+\= Expect no match
+    \x{09}
+    \x{0a}
+    \x{1D}
+    \x{20}
+    \x{85}
+    \x{a0}
+    \x{1680}
+    \x{2028}
+    \x{2029}
+    \x{202f}
+    \x{2065}
+    \x{3000}
+    \x{e0002}
+    \x{e001f}
+    \x{e0080} 
+
+/^[[:print:]]+$/utf,ucp
+    Space: \x{a0}
+    \x{1680}\x{2000}\x{2001}\x{2002}\x{2003}\x{2004}\x{2005}
+    \x{2006}\x{2007}\x{2008}\x{2009}\x{200a} 
+    \x{202f}\x{205f} 
+    \x{3000}
+    Letter:ABC
+    Mark:\x{300}\x{1d172}\x{1d17b}
+    Number:9\x{660}
+    Punctuation:\x{66a},;
+    Symbol:\x{6de}<>\x{fffc}
+    Cf-property:\x{ad}\x{600}\x{601}\x{602}\x{603}\x{604}\x{6dd}\x{70f}
+    \x{200b}\x{200c}\x{200d}\x{200e}\x{200f}
+    \x{202a}\x{202b}\x{202c}\x{202d}\x{202e}
+    \x{202f}
+    \x{2060}\x{2061}\x{2062}\x{2063}\x{2064}
+    \x{206a}\x{206b}\x{206c}\x{206d}\x{206e}\x{206f}
+    \x{feff}
+    \x{fff9}\x{fffa}\x{fffb}
+    \x{110bd}
+    \x{1d173}\x{1d174}\x{1d175}\x{1d176}\x{1d177}\x{1d178}\x{1d179}\x{1d17a}
+    \x{e0001}
+    \x{e0020}\x{e0030}\x{e0040}\x{e0050}\x{e0060}\x{e0070}\x{e007f}
+\= Expect no match
+    \x{09}
+    \x{1D}
+    \x{85}
+    \x{2028}
+    \x{2029}
+    \x{2065}
+    \x{e0002}
+    \x{e001f}
+    \x{e0080} 
+
+/^[[:punct:]]+$/utf,ucp
+    \$+<=>^`|~
+    !\"#%&'()*,-./:;?@[\\]_{}
+    \x{a1}\x{a7}  
+    \x{37e} 
+\= Expect no match
+    abcde  
+
+/^[[:^graph:]]+$/utf,ucp
+    \x{09}\x{0a}\x{1D}\x{20}\x{85}\x{a0}\x{1680}
+    \x{2028}\x{2029}\x{202f}\x{2065}
+    \x{3000}\x{e0002}\x{e001f}\x{e0080}
+\= Expect no match
+    Letter:ABC
+    Mark:\x{300}\x{1d172}\x{1d17b}
+    Number:9\x{660}
+    Punctuation:\x{66a},;
+    Symbol:\x{6de}<>\x{fffc}
+    Cf-property:\x{ad}\x{600}\x{601}\x{602}\x{603}\x{604}\x{6dd}\x{70f}
+    \x{200b}\x{200c}\x{200d}\x{200e}\x{200f}
+    \x{202a}\x{202b}\x{202c}\x{202d}\x{202e}
+    \x{2060}\x{2061}\x{2062}\x{2063}\x{2064}
+    \x{206a}\x{206b}\x{206c}\x{206d}\x{206e}\x{206f}
+    \x{feff}
+    \x{fff9}\x{fffa}\x{fffb}
+    \x{110bd}
+    \x{1d173}\x{1d174}\x{1d175}\x{1d176}\x{1d177}\x{1d178}\x{1d179}\x{1d17a}
+    \x{e0001}
+    \x{e0020}\x{e0030}\x{e0040}\x{e0050}\x{e0060}\x{e0070}\x{e007f}
+
+/^[[:^print:]]+$/utf,ucp
+    \x{09}\x{1D}\x{85}\x{2028}\x{2029}\x{2065}
+    \x{e0002}\x{e001f}\x{e0080}
+\= Expect no match
+    Space: \x{a0}
+    \x{1680}\x{2000}\x{2001}\x{2002}\x{2003}\x{2004}\x{2005}
+    \x{2006}\x{2007}\x{2008}\x{2009}\x{200a} 
+    \x{202f}\x{205f} 
+    \x{3000}
+    Letter:ABC
+    Mark:\x{300}\x{1d172}\x{1d17b}
+    Number:9\x{660}
+    Punctuation:\x{66a},;
+    Symbol:\x{6de}<>\x{fffc}
+    Cf-property:\x{ad}\x{600}\x{601}\x{602}\x{603}\x{604}\x{6dd}\x{70f}
+    \x{200b}\x{200c}\x{200d}\x{200e}\x{200f}
+    \x{202a}\x{202b}\x{202c}\x{202d}\x{202e}
+    \x{202f}
+    \x{2060}\x{2061}\x{2062}\x{2063}\x{2064}
+    \x{206a}\x{206b}\x{206c}\x{206d}\x{206e}\x{206f}
+    \x{feff}
+    \x{fff9}\x{fffa}\x{fffb}
+    \x{110bd}
+    \x{1d173}\x{1d174}\x{1d175}\x{1d176}\x{1d177}\x{1d178}\x{1d179}\x{1d17a}
+    \x{e0001}
+    \x{e0020}\x{e0030}\x{e0040}\x{e0050}\x{e0060}\x{e0070}\x{e007f}
+
+/^[[:^punct:]]+$/utf,ucp
+    abcde  
+\= Expect no match
+    \$+<=>^`|~
+    !\"#%&'()*,-./:;?@[\\]_{}
+    \x{a1}\x{a7}  
+    \x{37e} 
+
+/[RST]+/i,utf,ucp
+    Ss\x{17f}
+    
+/[R-T]+/i,utf,ucp
+    Ss\x{17f}
+
+/[q-u]+/i,utf,ucp
+    Ss\x{17f}
+
+/^s?c/im,utf
+    scat
+    
+# The next four tests are for repeated caseless back references when the 
+# code unit length of the matched text is different to that of the original
+# group in the UTF-8 case.
+
+/^(\x{23a})\1*(.)/i,utf
+    \x{23a}\x{23a}\x{23a}\x{23a}
+    \x{23a}\x{2c65}\x{2c65}\x{2c65}
+    \x{23a}\x{23a}\x{2c65}\x{23a}
+
+/^(\x{23a})\1*(..)/i,utf
+    \x{23a}\x{2c65}\x{2c65}\x{2c65}
+    \x{23a}\x{23a}\x{2c65}\x{23a}
+
+/^(\x{23a})\1*(...)/i,utf
+    \x{23a}\x{2c65}\x{2c65}\x{2c65}
+    \x{23a}\x{23a}\x{2c65}\x{23a}
+
+/^(\x{23a})\1*(....)/i,utf
+\= Expect no match
+    \x{23a}\x{2c65}\x{2c65}\x{2c65}
+    \x{23a}\x{23a}\x{2c65}\x{23a}
+
+/[A-`]/i,utf
+    abcdefghijklmno
+
+"[\S\V\H]"utf
+
+/[^\p{Any}]*+x/utf
+    x
+
+/[[:punct:]]/utf,ucp
+    \x{b4} 
+
+/[[:^ascii:]]/utf,ucp
+    \x{100}
+    \x{200}
+    \x{300}
+    \x{37e}
+\= Expect no match     
+    aa
+    99
+    
+/[[:^ascii:]\w]/utf,ucp
+    aa
+    99
+    gg
+    \x{100}
+    \x{200}
+    \x{300}
+    \x{37e}
+
+/[\w[:^ascii:]]/utf,ucp
+    aa
+    99
+    gg
+    \x{100}
+    \x{200}
+    \x{300}
+    \x{37e}
+
+/[^[:ascii:]\W]/utf,ucp
+    \x{100}
+    \x{200}
+\= Expect no match     
+    aa
+    99
+    gg
+    \x{37e}
+
+/[^[:^ascii:]\d]/utf,ucp
+    a
+    ~
+    \a
+    \x{7f}
+\= Expect no match
+    0
+    \x{389}
+    \x{20ac}
+
+# End of testinput4
diff --git a/dist2/testdata/testinput5 b/dist2/testdata/testinput5
new file mode 100644
index 0000000..2e13a7c
--- /dev/null
+++ b/dist2/testdata/testinput5
Binary files differ
diff --git a/dist/testdata/testinput8 b/dist2/testdata/testinput6
similarity index 84%
rename from dist/testdata/testinput8
rename to dist2/testdata/testinput6
index 931dd71..c24b40f 100644
--- a/dist/testdata/testinput8
+++ b/dist2/testdata/testinput6
@@ -1,8 +1,10 @@
-/-- This set of tests check the DFA matching functionality of pcre_dfa_exec(),
-    excluding UTF and Unicode property support. The -dfa flag must be used with
-    pcretest when running it. --/
+# This set of tests check the DFA matching functionality of pcre2_dfa_match(),
+# excluding UTF and Unicode property support. All matches are done using DFA,
+# forced by setting a default subject modifier at the start.
     
-< forbid 8W 
+#forbid_utf
+#subject dfa
+#newline_default lf anycrlf any
      
 /abc/
     abc
@@ -15,15 +17,15 @@
 /ab+c/
     abc
     abbbbbbc
-    *** Failers 
+\= Expect no match 
     ac
     ab
     
-/a*/O
+/a*/no_auto_possess
     a
     aaaaaaaaaaaaaaaaa
-    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 
-    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\F 
+    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\=ovector=10 
+    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\=dfa_shortest
     
 /(a|abcd|african)/
     a
@@ -32,59 +34,59 @@
     
 /^abc/
     abcdef
-    *** Failers
+\= Expect no match
     xyzabc
     xyz\nabc    
     
 /^abc/m
     abcdef
     xyz\nabc    
-    *** Failers
+\= Expect no match
     xyzabc
     
 /\Aabc/
     abcdef
-    *** Failers
+\= Expect no match
     xyzabc
     xyz\nabc    
     
 /\Aabc/m
     abcdef
-    *** Failers
+\= Expect no match
     xyzabc
     xyz\nabc    
     
 /\Gabc/
     abcdef
-    xyzabc\>3
-    *** Failers
+    xyzabc\=offset=3
+\= Expect no match
     xyzabc    
-    xyzabc\>2 
+    xyzabc\=offset=2
     
 /x\dy\Dz/
     x9yzz
     x0y+z
-    *** Failers
+\= Expect no match
     xyz
     xxy0z     
     
 /x\sy\Sz/
     x yzz
     x y+z
-    *** Failers
+\= Expect no match
     xyz
     xxyyz
     
 /x\wy\Wz/
     xxy+z
-    *** Failers
+\= Expect no match
     xxy0z
     x+y+z         
     
 /x.y/
     x+y
     x-y
-    *** Failers
+\= Expect no match
     x\ny
     
 /x.y/s
@@ -96,46 +98,45 @@
     a+bc+dp+q
     a+bc\ndp+q
     x\nyp+q 
-    *** Failers 
+\= Expect no match 
     a\nbc\ndp+q
     a+bc\ndp\nq
     x\nyp\nq 
 
 /a\d\z/
     ba0
-    *** Failers
+\= Expect no match
     ba0\n
     ba0\ncd   
 
 /a\d\z/m
     ba0
-    *** Failers
+\= Expect no match
     ba0\n
     ba0\ncd   
 
 /a\d\Z/
     ba0
     ba0\n
-    *** Failers
+\= Expect no match
     ba0\ncd   
 
 /a\d\Z/m
     ba0
     ba0\n
-    *** Failers
+\= Expect no match
     ba0\ncd   
 
 /a\d$/
     ba0
     ba0\n
-    *** Failers
+\= Expect no match
     ba0\ncd   
 
 /a\d$/m
     ba0
     ba0\n
     ba0\ncd   
-    *** Failers
 
 /abc/i
     abc
@@ -156,14 +157,14 @@
     axxyz
     axxxyzq
     axxxxyzq
-    *** Failers
+\= Expect no match
     ax
     axx     
       
 /x{3}yz/
     axxxyzq
     axxxxyzq
-    *** Failers
+\= Expect no match
     ax
     axx     
     ayzq
@@ -174,30 +175,29 @@
     axxyz
     axxxyzq
     axxxxyzq
-    *** Failers
+\= Expect no match
     ax
     axx     
     ayzq
     axyzq
       
-/[^a]+/O
+/[^a]+/no_auto_possess
     bac
     bcdefax
-    *** Failers
+\= Expect no match
     aaaaa   
 
-/[^a]*/O
+/[^a]*/no_auto_possess
     bac
     bcdefax
-    *** Failers
     aaaaa   
     
-/[^a]{3,5}/O
+/[^a]{3,5}/no_auto_possess
     xyz
     awxyza
     abcdefa
     abcdefghijk
-    *** Failers
+\= Expect no match
     axya
     axa
     aaaaa         
@@ -212,25 +212,24 @@
      
 /\d+/
     ab1234c56
-    *** Failers
+\= Expect no match
     xyz
     
 /\D+/
     ab123c56
-    *** Failers
+\= Expect no match
     789
     
 /\d?A/
     045ABC
     ABC
-    *** Failers
+\= Expect no match
     XYZ
     
 /\D?A/
     ABC
     BAC
     9ABC             
-    *** Failers
 
 /a+/
     aaaa
@@ -242,7 +241,7 @@
 /^.+xyz/
     abcdxyz
     axyz
-    *** Failers
+\= Expect no match
     xyz
     
 /^.?xyz/
@@ -252,7 +251,7 @@
 /^\d{2,3}X/
     12X
     123X
-    *** Failers
+\= Expect no match
     X
     1X
     1234X     
@@ -262,7 +261,7 @@
     b93
     c99z
     d04
-    *** Failers
+\= Expect no match
     e45
     abcd      
     abcd1234
@@ -275,7 +274,7 @@
     d04
     abcd1234
     1234  
-    *** Failers
+\= Expect no match
     e45
     abcd      
 
@@ -285,7 +284,7 @@
     c99z
     d04
     abcd1234
-    *** Failers
+\= Expect no match
     1234  
     e45
     abcd      
@@ -300,14 +299,14 @@
     c99z
     d04
     1234  
-    *** Failers
+\= Expect no match
     abcd1234
     e45
 
 /^[abcd]{2,3}\d/
     ab45
     bcd93
-    *** Failers
+\= Expect no match
     1234 
     a36 
     abcd1234
@@ -317,24 +316,23 @@
     abc45
     abcabcabc45
     42xyz 
-    *** Failers
 
 /^(abc)+\d/
     abc45
     abcabcabc45
-    *** Failers
+\= Expect no match
     42xyz 
 
 /^(abc)?\d/
     abc45
     42xyz 
-    *** Failers
+\= Expect no match
     abcabcabc45
 
 /^(abc){2,3}\d/
     abcabc45
     abcabcabc45
-    *** Failers
+\= Expect no match
     abcabcabcabc45
     abc45
     42xyz 
@@ -353,7 +351,7 @@
     abc
     a(b)c
     a(b(c))d  
-    *** Failers)
+\= Expect no match)
     a(b(c)d  
 
 /^>abc>([^()]|\((?1)*\))*<xyz<$/
@@ -363,7 +361,7 @@
 
 /^(?>a*)\d/
     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9876
-    *** Failers 
+\= Expect no match 
     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
 
 /< (?: (?(R) \d++  | [^<>]*+) | (?R)) * >/x
@@ -373,33 +371,33 @@
     <abc <def> hij>
     <abc<>def> 
     <abc<>      
-    *** Failers
+\= Expect no match
     <abc
 
-/^(?(?=abc)\w{3}:|\d\d)$/        
+/^(?(?=abc)\w{3}:|\d\d)$/
     abc:                          
     12                             
-    *** Failers                     
+\= Expect no match                     
     123                       
     xyz                        
                                 
-/^(?(?!abc)\d\d|\w{3}:)$/      
+/^(?(?!abc)\d\d|\w{3}:)$/
     abc:                        
     12         
-    *** Failers
+\= Expect no match
     123
     xyz    
 
-/^(?=abc)\w{5}:$/        
+/^(?=abc)\w{5}:$/
     abcde:                          
-    *** Failers                     
+\= Expect no match                     
     abc.. 
     123                       
     vwxyz                        
                                 
-/^(?!abc)\d\d$/      
+/^(?!abc)\d\d$/
     12         
-    *** Failers
+\= Expect no match
     abcde:
     abc..  
     123
@@ -408,13 +406,13 @@
 /(?<=abc|xy)123/
     abc12345
     wxy123z
-    *** Failers
+\= Expect no match
     123abc
 
 /(?<!abc|xy)123/
     123abc
     mno123456 
-    *** Failers
+\= Expect no match
     abc12345
     wxy123z
 
@@ -422,98 +420,92 @@
     abcxyz
     123abcxyz999 
 
-/(ab|cd){3,4}/C
+/(ab|cd){3,4}/auto_callout
   ababab
   abcdabcd
   abcdcdcdcdcd  
 
 /^abc/
     abcdef
-    *** Failers
-    abcdef\B  
+\= Expect no match
+    abcdef\=notbol
 
 /^(a*|xyz)/
     bcd
     aaabcd
     xyz
-    xyz\N  
-    *** Failers
-    bcd\N   
+    xyz\=notempty
+\= Expect no match
+    bcd\=notempty
     
 /xyz$/
     xyz
     xyz\n
-    *** Failers
-    xyz\Z
-    xyz\n\Z    
+\= Expect no match
+    xyz\=noteol
+    xyz\n\=noteol
     
 /xyz$/m
     xyz
     xyz\n 
     abcxyz\npqr 
-    abcxyz\npqr\Z 
-    xyz\n\Z    
-    *** Failers
-    xyz\Z
+    abcxyz\npqr\=noteol
+    xyz\n\=noteol
+\= Expect no match
+    xyz\=noteol
 
 /\Gabc/
     abcdef
-    defabcxyz\>3 
-    *** Failers 
+    defabcxyz\=offset=3
+\= Expect no match 
     defabcxyz
 
 /^abcdef/
-    ab\P
-    abcde\P
-    abcdef\P
-    *** Failers
-    abx\P    
+    ab\=ps
+    abcde\=ps
+    abcdef\=ps
+\= Expect no match
+    abx\=ps
 
 /^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 
+    a\=ps
+    aa\=ps
+    aa2\=ps
+    aaa\=ps
+    aaa23\=ps
+    aaaa12345\=ps
+    aa0z\=ps
+    aaaa4444444444444z\=ps
+\= Expect no match
+    az\=ps
+    aaaaa\=ps
+    a56\=ps
 
 /^abcdef/
-   abc\P
-   def\R 
+   abc\=ps
+   def\=dfa_restart
    
 /(?<=foo)bar/
-   xyzfo\P 
-   foob\P\>2 
-   foobar...\R\P\>4 
-   xyzfo\P
-   foobar\>2  
-   *** Failers
-   xyzfo\P
-   obar\R   
+   foob\=ps,offset=2
+   foobar...\=ps,dfa_restart,offset=4
+   foobar\=offset=2
+\= Expect no match
+   xyzfo\=ps
+   obar\=dfa_restart
 
 /(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    
+    lkjhlkjhlkjhlkjhabbbbbbcdaefabbbbbbbefa\=ps,notbol,noteol
+    cdabbbbbbbb\=ps,notbol,dfa_restart,noteol
+    efabbbbbbbbbbbbbbbb\=ps,notbol,dfa_restart,noteol
+    bbbbbbbbbbbbcdXyasdfadf\=ps,notbol,dfa_restart,noteol
+\= Expect no match
+    adfadadaklhlkalkajhlkjahdfasdfasdfladsfjkj\=ps,noteol
 
-/(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?
+\= Expect no match
+    The quick brown FOX
     What do you know about THE QUICK BROWN FOX?
 
 /The quick brown fox/i
@@ -556,7 +548,7 @@
     >>>aaabxyzpqrrrabbxyyyypqAzz
     >aaaabxyzpqrrrabbxyyyypqAzz
     >>>>abcxyzpqrrrabbxyyyypqAzz
-    *** Failers
+\= Expect no match
     abxyzpqrrabbxyyyypqAzz
     abxyzpqrrrrabbxyyyypqAzz
     abxyzpqrrrabxyyyypqAzz
@@ -567,7 +559,7 @@
 /^(abc){1,2}zz/
     abczz
     abcabczz
-    *** Failers
+\= Expect no match
     zz
     abcabcabczz
     >>abczz
@@ -581,7 +573,7 @@
     aac
     abbbbbbbbbbbc
     bbbbbbbbbbbac
-    *** Failers
+\= Expect no match
     aaac
     abbbbbbbbbbbac
 
@@ -594,7 +586,7 @@
     aac
     abbbbbbbbbbbc
     bbbbbbbbbbbac
-    *** Failers
+\= Expect no match
     aaac
     abbbbbbbbbbbac
 
@@ -605,7 +597,7 @@
     babc
     bbabc
     bababc
-    *** Failers
+\= Expect no match
     bababbc
     babababc
 
@@ -613,7 +605,7 @@
     babc
     bbabc
     bababc
-    *** Failers
+\= Expect no match
     bababbc
     babababc
 
@@ -627,7 +619,7 @@
     cthing
     dthing
     ething
-    *** Failers
+\= Expect no match
     fthing
     [thing
     \\thing
@@ -637,7 +629,7 @@
     cthing
     dthing
     ething
-    *** Failers
+\= Expect no match
     athing
     fthing
 
@@ -645,7 +637,7 @@
     fthing
     [thing
     \\thing
-    *** Failers
+\= Expect no match
     athing
     bthing
     ]thing
@@ -656,7 +648,7 @@
 /^[^]cde]/
     athing
     fthing
-    *** Failers
+\= Expect no match
     ]thing
     cthing
     dthing
@@ -681,7 +673,7 @@
     9
     10
     100
-    *** Failers
+\= Expect no match
     abc
 
 /^.*nter/
@@ -692,28 +684,28 @@
 /^xxx[0-9]+$/
     xxx0
     xxx1234
-    *** Failers
+\= Expect no match
     xxx
 
 /^.+[0-9][0-9][0-9]$/
     x123
     xx123
     123456
-    *** Failers
-    123
     x1234
+\= Expect no match
+    123
 
 /^.+?[0-9][0-9][0-9]$/
     x123
     xx123
     123456
-    *** Failers
-    123
     x1234
+\= Expect no match
+    123
 
 /^([^!]+)!(.+)=apquxz\.ixr\.zzz\.ac\.uk$/
     abc!pqr=apquxz.ixr.zzz.ac.uk
-    *** Failers
+\= Expect no match
     !pqr=apquxz.ixr.zzz.ac.uk
     abc!=apquxz.ixr.zzz.ac.uk
     abc!pqr=apquxz:ixr.zzz.ac.uk
@@ -721,7 +713,8 @@
 
 /:/
     Well, we need a colon: somewhere
-    *** Fail if we don't
+\= Expect no match
+    No match without a colon
 
 /([\da-f:]+)$/i
     0abc
@@ -732,7 +725,7 @@
     5f03:12C0::932e
     fed def
     Any old stuff
-    *** Failers
+\= Expect no match
     0zzz
     gzzz
     fed\x20
@@ -741,7 +734,7 @@
 /^.*\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/
     .1.2.3
     A.12.123.0
-    *** Failers
+\= Expect no match
     .1.2.3333
     1.2.3
     1234.2.3
@@ -749,7 +742,7 @@
 /^(\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
+\= Expect no match
     1IN SOA non-sp1 non-sp2(
 
 /^[a-zA-Z\d][a-zA-Z\d\-]*(\.[a-zA-Z\d][a-zA-z\d\-]*)*\.$/
@@ -759,7 +752,7 @@
     ab-c.pq-r.
     sxk.zzz.ac.uk.
     x-.y-.
-    *** Failers
+\= Expect no match
     -abc.peq.
 
 /^\*\.[a-z]([a-z\-\d]*[a-z\d]+)?(\.[a-z]([a-z\-\d]*[a-z\d]+)?)*$/
@@ -767,7 +760,7 @@
     *.b0-a
     *.c3-b.c
     *.c-a.b-c
-    *** Failers
+\= Expect no match
     *.0
     *.a-
     *.a-b.c-
@@ -791,29 +784,28 @@
     \"1234\"
     \"abcd\" ;
     \"\" ; rhubarb
-    *** Failers
+\= Expect no match
     \"1234\" : things
 
 /^$/
     \
-    *** Failers
 
 /   ^    a   (?# begins with a)  b\sc (?# then b c) $ (?# then end)/x
     ab c
-    *** Failers
+\= Expect no match
     abc
     ab cde
 
 /(?x)   ^    a   (?# begins with a)  b\sc (?# then b c) $ (?# then end)/
     ab c
-    *** Failers
+\= Expect no match
     abc
     ab cde
 
 /^   a\ b[c ]d       $/x
     a bcd
     a b d
-    *** Failers
+\= Expect no match
     abcd
     ab d
 
@@ -867,7 +859,7 @@
     1234567890
     12345678ab
     12345678__
-    *** Failers
+\= Expect no match
     1234567
 
 /^[aeiou\d]{4,5}$/
@@ -875,7 +867,7 @@
     1234
     12345
     aaaaa
-    *** Failers
+\= Expect no match
     123456
 
 /^[aeiou\d]{4,5}?/
@@ -891,7 +883,7 @@
 /^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
+\= Expect no match
     From abcd  Sep 01 12:33:02 1997
 
 /^12.34/s
@@ -912,7 +904,7 @@
 
 /^(\D*)(?=\d)(?!123)/
     abc456
-    *** Failers
+\= Expect no match
     abc123
 
 /^1234(?# test newlines
@@ -932,24 +924,24 @@
 
 /(?!^)abc/
     the abc
-    *** Failers
+\= Expect no match
     abc
 
 /(?=^)abc/
     abc
-    *** Failers
+\= Expect no match
     the abc
 
-/^[ab]{1,3}(ab*|b)/O
+/^[ab]{1,3}(ab*|b)/no_auto_possess
     aabbbbb
 
-/^[ab]{1,3}?(ab*|b)/O
+/^[ab]{1,3}?(ab*|b)/no_auto_possess
     aabbbbb
 
-/^[ab]{1,3}?(ab*?|b)/O
+/^[ab]{1,3}?(ab*?|b)/no_auto_possess
     aabbbbb
 
-/^[ab]{1,3}(ab*?|b)/O
+/^[ab]{1,3}(ab*?|b)/no_auto_possess
     aabbbbb
 
 /  (?: [\040\t] |  \(
@@ -1153,7 +1145,7 @@
     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
+\= Expect no match
     The quick brown fox
 
 /[\040\t]*                    # Nab whitespace.
@@ -1745,7 +1737,7 @@
     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
+\= Expect no match
     The quick brown fox
 
 /abc\0def\00pqr\000xyz\0000AB/
@@ -1767,7 +1759,7 @@
 /A\x0{2,3}Z/
     The A\x0\x0Z
     An A\0\x0\0Z
-    *** Failers
+\= Expect no match
     A\0Z
     A\0\x0\0\x0Z
 
@@ -1777,7 +1769,7 @@
     \nabc
     \rabc
     \tabc
-    *** Failers
+\= Expect no match
     abc
 
 /^a	b
@@ -1788,7 +1780,7 @@
     abbbbc
     abbbc
     abbc
-    *** Failers
+\= Expect no match
     abc
     abbbbbc
 
@@ -1803,7 +1795,7 @@
 
 /^[W-c]+$/
     WXY_^abc
-    *** Failers
+\= Expect no match
     wxy
 
 /^[W-c]+$/i
@@ -1822,7 +1814,7 @@
 
 /^abc$/
     abc
-    *** Failers
+\= Expect no match
     qqq\nabc
     abc\nzzz
     qqq\nabc\nzzz
@@ -1830,7 +1822,7 @@
 /\Aabc\Z/m
     abc
     abc\n 
-    *** Failers
+\= Expect no match
     qqq\nabc
     abc\nzzz
     qqq\nabc\nzzz
@@ -1839,7 +1831,7 @@
     abc\ndef
 
 /\A(.)*\Z/m
-    *** Failers
+\= Expect no match
     abc\ndef
 
 /(?:b)|(?::+)/
@@ -1848,17 +1840,17 @@
 
 /[-az]+/
     az-
-    *** Failers
+\= Expect no match
     b
 
 /[az-]+/
     za-
-    *** Failers
+\= Expect no match
     b
 
 /[a\-z]+/
     a-z
-    *** Failers
+\= Expect no match
     b
 
 /[a-z]+/
@@ -1866,12 +1858,12 @@
 
 /[\d-]+/
     12-34
-    *** Failers
+\= Expect no match
     aaa
 
 /[\d-z]+/
     12-34z
-    *** Failers
+\= Expect no match
     aaa
 
 /\x5c/
@@ -1879,7 +1871,7 @@
 
 /\x20Z/
     the Zoo
-    *** Failers
+\= Expect no match
     Zulu
 
 /ab{3cd/
@@ -1894,15 +1886,15 @@
 /{4,5a}bc/
     {4,5a}bc
 
-/^a.b/<lf>
+/^a.b/newline=lf
     a\rb
-    *** Failers
+\= Expect no match
     a\nb
 
 /abc$/
     abc
     abc\n
-    *** Failers
+\= Expect no match
     abc\ndef
 
 /(abc)\123/
@@ -1926,22 +1918,9 @@
     abc\100\060
     abc\100\60
 
-/^A\8B\9C$/
-    A8B9C
-    *** Failers
-    A\08B\09C  
-    
-/^[A\8B\9C]+$/
-    A8B9C
-    *** Failers 
-    A8B9C\x00
-    
 /(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\12\123/
     abcdefghijk\12S
 
-/ab\idef/
-    abidef
-
 /a{0}bc/
     bc
 
@@ -1965,7 +1944,7 @@
     baNOTcccd
     baNOTccd
     bacccd
-    *** Failers
+\= Expect no match
     anything
     b\bc   
     baccd
@@ -1987,14 +1966,14 @@
    
 /[^k]$/
     abc
-    *** Failers
+\= Expect no match
     abk   
    
 /[^k]{2,3}$/
     abc
     kbc
     kabc 
-    *** Failers
+\= Expect no match
     abk
     akb
     akk 
@@ -2002,7 +1981,7 @@
 /^\d{8,}\@.+[^k]$/
     12345678\@a.b.c.d
     123456789\@x.y.z
-    *** Failers
+\= Expect no match
     12345678\@x.y.uk
     1234567\@a.b.c.d       
 
@@ -2039,7 +2018,7 @@
 /(\.\d\d((?=0)|\d(?=\d)))/
     1.230003938      
     1.875000282
-    *** Failers 
+\= Expect no match 
     1.235 
     
 /a(?)b/
@@ -2051,16 +2030,16 @@
 /foo(.*)bar/
     The food is under the bar in the barn.
     
-/foo(.*?)bar/  
+/foo(.*?)bar/
     The food is under the bar in the barn.
 
-/(.*)(\d*)/O
+/(.*)(\d*)/no_auto_possess
     I have 2 numbers: 53147
     
 /(.*)(\d+)/
     I have 2 numbers: 53147
  
-/(.*?)(\d*)/O
+/(.*?)(\d*)/no_auto_possess
     I have 2 numbers: 53147
 
 /(.*?)(\d+)/
@@ -2083,13 +2062,13 @@
      
 /^(\D*)(?=\d)(?!123)/
     ABC445
-    *** Failers
+\= Expect no match
     ABC123
     
 /^[W-]46]/
     W46]789 
     -46]789
-    *** Failers
+\= Expect no match
     Wall
     Zebra
     42
@@ -2105,7 +2084,7 @@
     [abcd] 
     ]abcd[
     \\backslash 
-    *** Failers
+\= Expect no match
     -46]789
     well
     
@@ -2114,9 +2093,11 @@
 
 /word (?:[a-zA-Z0-9]+ ){0,10}otherword/
   word cat dog elephant mussel cow horse canary baboon snake shark otherword
+\= Expect no match
   word cat dog elephant mussel cow horse canary baboon snake shark
 
 /word (?:[a-zA-Z0-9]+ ){0,300}otherword/
+\= Expect no match
   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}/
@@ -2148,27 +2129,31 @@
     aaaaaaaa    
 
 /^(a){1,1}/
-    bcd
     abc
     aab  
+\= Expect no match
+    bcd
 
 /^(a){1,2}/
-    bcd
     abc
     aab  
+\= Expect no match
+    bcd
 
 /^(a){1,3}/
-    bcd
     abc
     aab
     aaa   
+\= Expect no match
+    bcd
 
 /^(a){1,}/
-    bcd
     abc
     aab
     aaa
     aaaaaaaa    
+\= Expect no match
+    bcd
 
 /.*\.gif/
     borfle\nbib.gif\nno
@@ -2212,7 +2197,7 @@
 /(.*X|^B)/
     abcde\n1234Xyz
     BarFoo 
-    *** Failers
+\= Expect no match
     abcde\nBar  
 
 /(.*X|^B)/m
@@ -2223,7 +2208,7 @@
 /(.*X|^B)/s
     abcde\n1234Xyz
     BarFoo 
-    *** Failers
+\= Expect no match
     abcde\nBar  
 
 /(.*X|^B)/ms
@@ -2234,17 +2219,17 @@
 /(?s)(.*X|^B)/
     abcde\n1234Xyz
     BarFoo 
-    *** Failers 
+\= Expect no match 
     abcde\nBar  
 
 /(?s:.*X|^B)/
     abcde\n1234Xyz
     BarFoo 
-    *** Failers 
+\= Expect no match 
     abcde\nBar  
 
 /^.*B/
-    **** Failers
+\= Expect no match
     abc\nB
      
 /(?s)^.*B/
@@ -2282,47 +2267,47 @@
 
 /^[abcdefghijklmnopqrstuvwxy0123456789]/
     n
-    *** Failers 
+\= Expect no match 
     z 
 
 /abcde{0,0}/
     abcd
-    *** Failers
+\= Expect no match
     abce  
 
 /ab[cd]{0,0}e/
     abe
-    *** Failers
+\= Expect no match
     abcde 
     
 /ab(c){0,0}d/
     abd
-    *** Failers
+\= Expect no match
     abcd   
 
 /a(b*)/
     a
     ab
     abbbb
-    *** Failers
+\= Expect no match
     bbbbb    
     
 /ab\d{0}e/
     abe
-    *** Failers
+\= Expect no match
     ab1e   
     
 /"([^\\"]+|\\.)*"/
     the \"quick\" brown fox
     \"the \\\"quick\\\" brown fox\" 
 
-/.*?/g+
+/.*?/g,aftertext
     abc
   
-/\b/g+
+/\b/g,aftertext
     abc 
 
-/\b/+g
+/\b/g,aftertext
     abc 
 
 //g
@@ -2337,7 +2322,7 @@
     
 /a.b/
     acb
-    *** Failers 
+\= Expect no match 
     a\nb   
     
 /a[^a]b/s
@@ -2363,8 +2348,9 @@
     bbbbbac 
     
 /(?!\A)x/m
-    x\nb\n
     a\bx\n  
+\= Expect no match
+    x\nb\n
     
 /\x0{ab}/
     \0{ab} 
@@ -2380,32 +2366,33 @@
     catfood
     arfootle
     rfoosh
-    *** Failers
+\= Expect no match
     barfoo
     towbarfoo
 
 /\w{3}(?<!bar)foo/
     catfood
-    *** Failers
+\= Expect no match
     foo
     barfoo
     towbarfoo
 
 /(?<=(foo)a)bar/
     fooabar
-    *** Failers
+\= Expect no match
     bar
     foobbar
       
 /\Aabc\z/m
     abc
-    *** Failers
+\= Expect no match
     abc\n   
     qqq\nabc
     abc\nzzz
     qqq\nabc\nzzz
 
 "(?>.*/)foo"
+\= Expect no match
     /this/is/a/very/long/line/in/deed/with/very/many/slashes/in/it/you/see/
 
 "(?>.*/)foo"
@@ -2414,12 +2401,12 @@
 /(?>(\.\d\d[1-9]?))\d+/
     1.230003938
     1.875000282
-    *** Failers 
+\= Expect no match 
     1.235 
 
 /^((?>\w+)|(?>\s+))*$/
     now is the time for all good men to come to the aid of the party
-    *** Failers
+\= Expect no match
     this is not a line with only words and spaces!
     
 /(\d+)(\w)/
@@ -2428,7 +2415,7 @@
 
 /((?>\d+))(\w)/
     12345a
-    *** Failers
+\= Expect no match
     12345+ 
 
 /(?>a+)b/
@@ -2452,35 +2439,35 @@
 /((?>[^()]+)|\([^()]*\))+/
     ((abc(ade)ufh()()x
     
-/\(((?>[^()]+)|\([^()]+\))+\)/ 
+/\(((?>[^()]+)|\([^()]+\))+\)/
     (abc)
     (abc(def)xyz)
-    *** Failers
+\= Expect no match
     ((()aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa   
 
 /a(?-i)b/i
     ab
     Ab
-    *** Failers 
+\= Expect no match 
     aB
     AB
         
 /(a (?x)b c)d e/
     a bcd e
-    *** Failers
+\= Expect no match
     a b cd e
     abcd e   
     a bcde 
  
 /(a b(?x)c d (?-x)e f)/
     a bcde f
-    *** Failers
+\= Expect no match
     abcdef  
 
 /(a(?i)b)c/
     abc
     aBc
-    *** Failers
+\= Expect no match
     abC
     aBC  
     Abc
@@ -2491,7 +2478,7 @@
 /a(?i:b)c/
     abc
     aBc
-    *** Failers 
+\= Expect no match 
     ABC
     abC
     aBC
@@ -2499,14 +2486,14 @@
 /a(?i:b)*c/
     aBc
     aBBc
-    *** Failers 
+\= Expect no match 
     aBC
     aBBC
     
 /a(?=b(?i)c)\w\wd/
     abcd
     abCd
-    *** Failers
+\= Expect no match
     aBCd
     abcD     
     
@@ -2514,7 +2501,7 @@
     more than million
     more than MILLION
     more \n than Million 
-    *** Failers
+\= Expect no match
     MORE THAN MILLION    
     more \n than \n million 
 
@@ -2522,15 +2509,15 @@
     more than million
     more than MILLION
     more \n than Million 
-    *** Failers
+\= Expect no match
     MORE THAN MILLION    
     more \n than \n million 
     
-/(?>a(?i)b+)+c/ 
+/(?>a(?i)b+)+c/
     abc
     aBbc
     aBBc 
-    *** Failers
+\= Expect no match
     Abc
     abAb    
     abbC 
@@ -2538,7 +2525,7 @@
 /(?=a(?i)b)\w\wc/
     abc
     aBc
-    *** Failers
+\= Expect no match
     Ab 
     abC
     aBC     
@@ -2546,7 +2533,7 @@
 /(?<=a(?i)b)(\w\w)c/
     abxxc
     aBxxc
-    *** Failers
+\= Expect no match
     Abxxc
     ABxxc
     abxxC      
@@ -2554,14 +2541,14 @@
 /^(?(?=abc)\w{3}:|\d\d)$/
     abc:
     12
-    *** Failers
+\= Expect no match
     123
     xyz    
 
 /^(?(?!abc)\d\d|\w{3}:)$/
     abc:
     12
-    *** Failers
+\= Expect no match
     123
     xyz    
     
@@ -2570,7 +2557,7 @@
     cat
     fcat
     focat   
-    *** Failers
+\= Expect no match
     foocat  
 
 /(?(?<!foo)cat|bar)/
@@ -2578,7 +2565,7 @@
     cat
     fcat
     focat   
-    *** Failers
+\= Expect no match
     foocat  
 
 /(?>a*)*/
@@ -2647,7 +2634,7 @@
 /(?(?=[^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
+\= Expect no match
     sep-12-98
         
 /(?i:saturday|sunday)/
@@ -2664,7 +2651,7 @@
     aBCx
     bbx
     BBx
-    *** Failers
+\= Expect no match
     abcX
     aBCX
     bbX
@@ -2678,7 +2665,7 @@
     Europe 
     frog
     France
-    *** Failers
+\= Expect no match
     Africa     
 
 /^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)/
@@ -2688,13 +2675,13 @@
     xY
     zebra
     Zambesi
-    *** Failers
+\= Expect no match
     aCD  
     XY  
 
 /(?<=foo\n)^bar/m
     foo\nbar
-    *** Failers
+\= Expect no match
     bar
     baz\nbar   
 
@@ -2702,18 +2689,18 @@
     barbaz
     barbarbaz 
     koobarbaz 
-    *** Failers
+\= Expect no match
     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./
+# 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
+\= Expect no match
     xbc
     axc
     abx
@@ -2737,7 +2724,7 @@
 
 /ab+bc/
     abbc
-    *** Failers
+\= Expect no match
     abc
     abq
 
@@ -2754,7 +2741,7 @@
     abbbbc
 
 /ab{4,5}bc/
-    *** Failers
+\= Expect no match
     abq
     abbbbc
 
@@ -2775,7 +2762,7 @@
 
 /^abc$/
     abc
-    *** Failers
+\= Expect no match
     abbbbc
     abcc
 
@@ -2786,8 +2773,8 @@
 
 /abc$/
     aabc
-    *** Failers
     aabc
+\= Expect no match
     aabcd
 
 /^/
@@ -2805,7 +2792,7 @@
 
 /a[bc]d/
     abd
-    *** Failers
+\= Expect no match
     axyzd
     abc
 
@@ -2829,7 +2816,7 @@
 
 /a[^bc]d/
     aed
-    *** Failers
+\= Expect no match
     abd
     abd
 
@@ -2838,8 +2825,8 @@
 
 /a[^]b]c/
     adc
-    *** Failers
     a-c
+\= Expect no match
     a]c
 
 /\ba\b/
@@ -2848,13 +2835,13 @@
     -a-
 
 /\by\b/
-    *** Failers
+\= Expect no match
     xy
     yz
     xyz
 
 /\Ba\B/
-    *** Failers
+\= Expect no match
     a-
     -a
     -a-
@@ -2873,8 +2860,7 @@
 
 /\W/
     -
-    *** Failers
-    -
+\= Expect no match
     a
 
 /a\sb/
@@ -2882,8 +2868,7 @@
 
 /a\Sb/
     a-b
-    *** Failers
-    a-b
+\= Expect no match
     a b
 
 /\d/
@@ -2891,8 +2876,7 @@
 
 /\D/
     -
-    *** Failers
-    -
+\= Expect no match
     1
 
 /[\w]/
@@ -2900,8 +2884,7 @@
 
 /[\W]/
     -
-    *** Failers
-    -
+\= Expect no match
     a
 
 /a[\s]b/
@@ -2909,8 +2892,7 @@
 
 /a[\S]b/
     a-b
-    *** Failers
-    a-b
+\= Expect no match
     a b
 
 /[\d]/
@@ -2918,8 +2900,7 @@
 
 /[\D]/
     -
-    *** Failers
-    -
+\= Expect no match
     1
 
 /ab|cd/
@@ -2939,6 +2920,8 @@
     a((b
 
 /a\\b/
+    a\\b
+\= Expect no match
     a\b
 
 /((a))/
@@ -2978,12 +2961,10 @@
     cde
 
 /abc/
-    *** Failers
+\= Expect no match
     b
-    
 
 /a*/
-    
 
 /([abc])*d/
     abbbcd
@@ -3037,7 +3018,7 @@
     adcdcde
 
 /a[bcd]+dcdcde/
-    *** Failers
+\= Expect no match
     abcde
     adcdcde
 
@@ -3057,7 +3038,7 @@
     effgz
     ij
     reffgz
-    *** Failers
+\= Expect no match
     effg
     bcdd
 
@@ -3068,7 +3049,7 @@
     a
 
 /multiple words of text/
-    *** Failers
+\= Expect no match
     aa
     uh-uh
 
@@ -3096,7 +3077,7 @@
     ABC
     XABCY
     ABABC
-    *** Failers
+\= Expect no match
     aaxabxbaxbbx
     XBC
     AXC
@@ -3119,7 +3100,7 @@
     ABBC
 
 /ab+bc/i
-    *** Failers
+\= Expect no match
     ABC
     ABQ
 
@@ -3138,7 +3119,7 @@
     ABBBBC
 
 /ab{4,5}?bc/i
-    *** Failers
+\= Expect no match
     ABQ
     ABBBBC
 
@@ -3159,7 +3140,7 @@
 
 /^abc$/i
     ABC
-    *** Failers
+\= Expect no match
     ABBBBC
     ABCC
 
@@ -3185,8 +3166,8 @@
     AXYZC
 
 /a.*c/i
-    *** Failers
     AABC
+\= Expect no match
     AXYZD
 
 /a[bc]d/i
@@ -3194,7 +3175,7 @@
 
 /a[b-d]e/i
     ACE
-    *** Failers
+\= Expect no match
     ABC
     ABD
 
@@ -3218,7 +3199,7 @@
 
 /a[^-b]c/i
     ADC
-    *** Failers
+\= Expect no match
     ABD
     A-C
 
@@ -3233,7 +3214,7 @@
     DEF
 
 /$b/i
-    *** Failers
+\= Expect no match
     A]C
     B
 
@@ -3245,7 +3226,8 @@
     A((B
 
 /a\\b/i
-    A\B
+\= Expect no match
+    A\=notbol
 
 /((a))/i
     ABC
@@ -3295,7 +3277,6 @@
 /abc/i
 
 /a*/i
-    
 
 /([abc])*d/i
     ABBBCD
@@ -3323,6 +3304,7 @@
     HIJ
 
 /^(ab|cd)e/i
+\= Expect no match
     ABCDE
 
 /(abc|)ef/i
@@ -3367,7 +3349,7 @@
     EFFGZ
     IJ
     REFFGZ
-    *** Failers
+\= Expect no match
     ADCDCDE
     EFFG
     BCDD
@@ -3385,7 +3367,7 @@
     C
 
 /multiple words of text/i
-    *** Failers
+\= Expect no match
     AA
     UH-UH
 
@@ -3478,7 +3460,7 @@
 
 /(?<=a)b/
     ab
-    *** Failers
+\= Expect no match
     cb
     b
 
@@ -3524,7 +3506,7 @@
     Ab
 
 /(?:(?i)a)b/
-    *** Failers
+\= Expect no match
     cb
     aB
 
@@ -3543,7 +3525,7 @@
     Ab
 
 /(?i:a)b/
-    *** Failers
+\= Expect no match
     aB
     aB
 
@@ -3562,8 +3544,8 @@
     aB
 
 /(?:(?-i)a)b/i
-    *** Failers
     aB
+\= Expect no match
     Ab
 
 /((?-i)a)b/i
@@ -3575,7 +3557,7 @@
     aB
 
 /(?:(?-i)a)b/i
-    *** Failers
+\= Expect no match
     Ab
     AB
 
@@ -3594,7 +3576,7 @@
     aB
 
 /(?-i:a)b/i
-    *** Failers
+\= Expect no match
     AB
     Ab
 
@@ -3607,14 +3589,14 @@
     aB
 
 /(?-i:a)b/i
-    *** Failers
+\= Expect no match
     Ab
     AB
 
 /((?-i:a))b/i
 
 /((?-i:a.))b/i
-    *** Failers
+\= Expect no match
     AB
     a\nB
 
@@ -3640,7 +3622,7 @@
     aaac
 
 /(?<![cd])b/
-    *** Failers
+\= Expect no match
     B\nB
     dbcb
 
@@ -3656,7 +3638,7 @@
     cdaccb
 
 /^(?:a?b?)*$/
-    *** Failers
+\= Expect no match
     dbcb
     a--
 
@@ -3689,7 +3671,7 @@
 /^b/
 
 /()^b/
-    *** Failers
+\= Expect no match
     a\nb\nc\n
     a\nb\nc\n
 
@@ -3702,7 +3684,7 @@
     a
 
 /(?(?=a)b|a)/
-    *** Failers
+\= Expect no match
     a
     a
 
@@ -3728,7 +3710,7 @@
 /([\w:]+::)?(\w+)$/
     abcd
     xy:z:::abcd
-    *** Failers
+\= Expect no match
     abcd:
     abcd:
 
@@ -3759,7 +3741,7 @@
     ((abc(ade)ufh()()x
 
 /a\Z/
-    *** Failers
+\= Expect no match
     aaab
     a\nb\n
 
@@ -3773,43 +3755,44 @@
 
 /b\z/
     a\nb
-    *** Failers
     
 /(?>.*)(?<=(abcd|wxyz))/
     alphabetabcd
     endingwxyz
-    *** Failers
+\= Expect no match
     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
+\= Expect no match
     word cat dog elephant mussel cow horse canary baboon snake shark
   
 /word (?>[a-zA-Z0-9]+ ){0,30}otherword/
+\= Expect no match
     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
+\= Expect no match
     123abcfoo
     
 /(?<=(?!...999)\d{3})foo/
     999foo
     123999foo 
-    *** Failers
+\= Expect no match
     123abcfoo
 
 /(?<=\d{3}(?!999)...)foo/
     123abcfoo
     123456foo 
-    *** Failers
+\= Expect no match
     123999foo  
     
 /(?<=\d{3}...)(?<!999)foo/
     123abcfoo   
     123456foo 
-    *** Failers
+\= Expect no match
     123999foo  
 
 /((Z)+|A)*/
@@ -3834,7 +3817,7 @@
     abcde
     -things
     0digit
-    *** Failers
+\= Expect no match
     bcdef    
     
 /[[:space:]]+/
@@ -3856,7 +3839,8 @@
   a\nxb\n
 
 /(?!^)x/m
-  a\nxb\n
+\= Expect no match
+    a\nxb\n
 
 /abc\Qabc\Eabc/
     abcabcabc
@@ -3866,7 +3850,7 @@
 
 /   abc\Q abc\Eabc/x
     abc abcabc
-    *** Failers
+\= Expect no match
     abcabcabc  
     
 /abc#comment
@@ -3898,7 +3882,7 @@
 
 /\Gabc/
     abc
-    *** Failers
+\= Expect no match
     xyzabc  
 
 /\Gabc./g
@@ -3909,7 +3893,7 @@
 
 /a(?x: b c )d/
     XabcdY
-    *** Failers 
+\= Expect no match 
     Xa b c d Y 
 
 /((?x)x y z | a b c)/
@@ -3918,13 +3902,13 @@
 
 /(?i)AB(?-i)C/
     XabCY
-    *** Failers
+\= Expect no match
     XabcY  
 
 /((?i)AB(?-i)C|D)E/
     abCE
     DE
-    *** Failers
+\= Expect no match
     abcE
     abCe  
     dE
@@ -3936,17 +3920,11 @@
     -
     d
     ] 
-    *** Failers
+\= Expect no match
     b     
 
-/[\z\C]/
-    z
-    C 
-    
-/\M/
-    M 
-    
 /(a+)*b/
+\= Expect no match
     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 
     
 /(?i)reg(?:ul(?:[aä]|ae)r|ex)/
@@ -3971,57 +3949,34 @@
     ac
     bbbbc
 
-/abc/SS>testsavedregex
-<testsavedregex
-    abc
-    *** Failers
-    bca
-    
-/abc/FSS>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
+/line\nbreak/firstline
     this is a line\nbreak
-    ** Failers 
+\= Expect no match 
     line one\nthis is a line\nbreak in the second line 
 
-/line\nbreak/mf
+/line\nbreak/m,firstline
     this is a line\nbreak
-    ** Failers 
+\= Expect no match 
     line one\nthis is a line\nbreak in the second line 
 
 /1234/
-    123\P
-    a4\P\R
+    123\=ps
+\= Expect no match 
+    a4\=ps,dfa_restart
 
 /1234/
-    123\P
-    4\P\R
+    123\=ps
+    4\=ps,dfa_restart
 
-/^/mg
+/^/gm
     a\nb\nc\n
     \ 
     
-/(?<=C\n)^/mg
+/(?<=C\n)^/gm
     A\nC\nC\n 
 
 /(?s)A?B/
@@ -4052,61 +4007,47 @@
 /Content-Type\x3A[^a]{6,}z/
     Content-Type:xxxyyyz
 
-/^abc/m
+/^abc/Im,newline=lf
     xyz\nabc
-    xyz\nabc\<lf>
-    xyz\r\nabc\<lf>
-    xyz\rabc\<cr>
-    xyz\r\nabc\<crlf>
-    ** Failers 
-    xyz\nabc\<cr>
-    xyz\r\nabc\<cr>
-    xyz\nabc\<crlf>
-    xyz\rabc\<crlf>
-    xyz\rabc\<lf>
+    xyz\r\nabc
+\= Expect no match
+    xyz\rabc
+    xyzabc\r
+    xyzabc\rpqr
+    xyzabc\r\n
+    xyzabc\r\npqr
+
+/^abc/Im,newline=crlf
+    xyz\r\nabclf>
+\= Expect no match
+    xyz\nabclf
+    xyz\rabclf
     
-/abc$/m<lf>
-    xyzabc
-    xyzabc\n 
-    xyzabc\npqr 
-    xyzabc\r\<cr> 
-    xyzabc\rpqr\<cr> 
-    xyzabc\r\n\<crlf> 
-    xyzabc\r\npqr\<crlf> 
-    ** Failers
-    xyzabc\r 
-    xyzabc\rpqr 
-    xyzabc\r\n 
-    xyzabc\r\npqr 
-    
-/^abc/m<cr>
-    xyz\rabcdef
-    xyz\nabcdef\<lf>
-    ** Failers  
-    xyz\nabcdef
-       
-/^abc/m<lf>
-    xyz\nabcdef
-    xyz\rabcdef\<cr>
-    ** Failers  
-    xyz\rabcdef
-       
-/^abc/m<crlf>
-    xyz\r\nabcdef
-    xyz\rabcdef\<cr>
-    ** Failers  
-    xyz\rabcdef
-    
-/.*/<lf>
+/^abc/Im,newline=cr
+    xyz\rabc
+\= Expect no match
+    xyz\nabc
+    xyz\r\nabc
+
+/.*/I,newline=lf
     abc\ndef
     abc\rdef
     abc\r\ndef
-    \<cr>abc\ndef
-    \<cr>abc\rdef
-    \<cr>abc\r\ndef
-    \<crlf>abc\ndef
-    \<crlf>abc\rdef
-    \<crlf>abc\r\ndef
+
+/.*/I,newline=cr
+    abc\ndef
+    abc\rdef
+    abc\r\ndef
+
+/.*/I,newline=crlf
+    abc\ndef
+    abc\rdef
+    abc\r\ndef
+
+/\w+(.)(.)?def/Is
+    abc\ndef
+    abc\rdef
+    abc\r\ndef
 
 /\w+(.)(.)?def/s
     abc\ndef
@@ -4129,43 +4070,58 @@
     aaaa
 
 /(a|)*\d/
-  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4
+\= Expect no match
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
 
 /(?>a|)*\d/
-  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4
+\= Expect no match
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
 
 /(?:a|)*\d/
-  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4
+\= Expect no match
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
 
-/^a.b/<lf>
+/^a.b/newline=lf
     a\rb
-    a\nb\<cr> 
-    ** Failers
+\= Expect no match
     a\nb
-    a\nb\<any>
-    a\rb\<cr>   
-    a\rb\<any>   
 
-/^abc./mgx<any>
+/^a.b/newline=cr
+    a\nb
+\= Expect no match
+    a\rb
+
+/^a.b/newline=anycrlf
+    a\x85b
+\= Expect no match
+    a\rb
+
+/^a.b/newline=any
+\= Expect no match
+    a\nb
+    a\rb
+    a\x85b
+
+/^abc./gmx,newline=any
     abc1 \x0aabc2 \x0babc3xx \x0cabc4 \x0dabc5xx \x0d\x0aabc6 \x85abc7 JUNK
 
-/abc.$/mgx<any>
+/abc.$/gmx,newline=any
     abc1\x0a abc2\x0b abc3\x0c abc4\x0d abc5\x0d\x0a abc6\x85 abc9
 
-/^a\Rb/<bsr_unicode>
+/^a\Rb/bsr=unicode
     a\nb
     a\rb
     a\r\nb
     a\x0bb
     a\x0cb
     a\x85b   
-    ** Failers
+\= Expect no match
     a\n\rb    
 
-/^a\R*b/<bsr_unicode>
+/^a\R*b/bsr=unicode
     ab
     a\nb
     a\rb
@@ -4176,7 +4132,7 @@
     a\n\rb    
     a\n\r\x85\x0cb 
 
-/^a\R+b/<bsr_unicode>
+/^a\R+b/bsr=unicode
     a\nb
     a\rb
     a\r\nb
@@ -4185,10 +4141,10 @@
     a\x85b   
     a\n\rb    
     a\n\r\x85\x0cb 
-    ** Failers
+\= Expect no match
     ab  
     
-/^a\R{1,3}b/<bsr_unicode>
+/^a\R{1,3}b/bsr=unicode
     a\nb
     a\n\rb
     a\n\r\x85b
@@ -4196,30 +4152,25 @@
     a\r\n\r\n\r\nb 
     a\n\r\n\rb
     a\n\n\r\nb 
-    ** Failers
+\= Expect no match
     a\n\n\n\rb
     a\r
 
-/^a[\R]b/<bsr_unicode>
-    aRb
-    ** Failers
-    a\nb  
-
 /.+foo/
     afoo
-    ** Failers 
+\= Expect no match 
     \r\nfoo 
     \nfoo 
 
-/.+foo/<crlf>
+/.+foo/newline=crlf
     afoo
     \nfoo 
-    ** Failers 
+\= Expect no match 
     \r\nfoo 
 
-/.+foo/<any>
+/.+foo/newline=any
     afoo
-    ** Failers 
+\= Expect no match 
     \nfoo 
     \r\nfoo 
 
@@ -4228,24 +4179,24 @@
     \r\nfoo 
     \nfoo 
 
-/^$/mg<any>
+/^$/gm,newline=any
     abc\r\rxyz
     abc\n\rxyz  
-    ** Failers 
+\= Expect no match 
     abc\r\nxyz
 
 /^X/m
     XABC
-    ** Failers 
-    XABC\B
+\= Expect no match 
+    XABC\=notbol
 
-/(?m)^$/<any>g+
+/(?m)^$/g,newline=any,aftertext
     abc\r\n\r\n
 
-/(?m)^$|^\r\n/<any>g+ 
+/(?m)^$|^\r\n/g,newline=any,aftertext
     abc\r\n\r\n
     
-/(?m)$/<any>g+ 
+/(?m)$/g,newline=any,aftertext
     abc\r\n\r\n
 
 /(?|(abc)|(xyz))/
@@ -4263,20 +4214,20 @@
 /(?|(abc)|(xyz))(?1)/
     abcabc
     xyzabc 
-    ** Failers 
+\= Expect no match 
     xyzxyz 
  
 /\H\h\V\v/
     X X\x0a
     X\x09X\x0b
-    ** Failers
+\= Expect no match
     \xa0 X\x0a   
     
-/\H*\h+\V?\v{3,4}/ 
+/\H*\h+\V?\v{3,4}/
     \x09\x20\xa0X\x0a\x0b\x0c\x0d\x0a
     \x09\x20\xa0\x0a\x0b\x0c\x0d\x0a
     \x09\x20\xa0\x0a\x0b\x0c
-    ** Failers 
+\= Expect no match 
     \x09\x20\xa0\x0a\x0b
      
 /\H{3,4}/
@@ -4289,7 +4240,7 @@
 /\h*X\h?\H+Y\H?Z/
     >XNNNYZ
     >  X NYQZ
-    ** Failers
+\= Expect no match
     >XYZ   
     >  X NY Z
 
@@ -4297,248 +4248,241 @@
     >XY\x0aZ\x0aA\x0bNN\x0c
     >\x0a\x0dX\x0aY\x0a\x0bZZZ\x0aAAA\x0bNNN\x0c
 
-/.+A/<crlf>
+/.+A/newline=crlf
+\= Expect no match
     \r\nA
     
-/\nA/<crlf>
+/\nA/newline=crlf
     \r\nA 
 
-/[\r\n]A/<crlf>
+/[\r\n]A/newline=crlf
     \r\nA 
 
-/(\r|\n)A/<crlf>
+/(\r|\n)A/newline=crlf
     \r\nA 
 
-/a\Rb/I<bsr_anycrlf>
+/a\Rb/I,bsr=anycrlf
     a\rb
     a\nb
     a\r\nb
-    ** Failers
+\= Expect no match
     a\x85b
     a\x0bb     
 
-/a\Rb/I<bsr_unicode>
+/a\Rb/I,bsr=unicode
     a\rb
     a\nb
     a\r\nb
     a\x85b
     a\x0bb     
-    ** Failers 
-    a\x85b\<bsr_anycrlf>
-    a\x0bb\<bsr_anycrlf>
     
-/a\R?b/I<bsr_anycrlf>
+/a\R?b/I,bsr=anycrlf
     a\rb
     a\nb
     a\r\nb
-    ** Failers
+\= Expect no match
     a\x85b
     a\x0bb     
 
-/a\R?b/I<bsr_unicode>
+/a\R?b/I,bsr=unicode
     a\rb
     a\nb
     a\r\nb
     a\x85b
     a\x0bb     
-    ** Failers 
-    a\x85b\<bsr_anycrlf>
-    a\x0bb\<bsr_anycrlf>
     
-/a\R{2,4}b/I<bsr_anycrlf>
+/a\R{2,4}b/I,bsr=anycrlf
     a\r\n\nb
     a\n\r\rb
     a\r\n\r\n\r\n\r\nb
-    ** Failers
-    a\x85\85b
-    a\x0b\0bb     
+\= Expect no match
+    a\x0b\x0bb     
+    a\x85\x85b
 
-/a\R{2,4}b/I<bsr_unicode>
+/a\R{2,4}b/I,bsr=unicode
     a\r\rb
     a\n\n\nb
     a\r\n\n\r\rb
-    a\x85\85b
-    a\x0b\0bb     
-    ** Failers 
+    a\x85\x85b
+    a\x0b\x0bb     
+\= Expect no match 
     a\r\r\r\r\rb 
-    a\x85\85b\<bsr_anycrlf>
-    a\x0b\0bb\<bsr_anycrlf>
     
 /a(?!)|\wbc/
     abc 
 
-/a[]b/<JS>
-    ** Failers
+/a[]b/alt_bsux,allow_empty_class,match_unset_backref,dupnames
+\= Expect no match
     ab
 
-/a[]+b/<JS>
-    ** Failers
+/a[]+b/alt_bsux,allow_empty_class,match_unset_backref,dupnames
+\= Expect no match
     ab 
 
-/a[]*+b/<JS>
-    ** Failers
+/a[]*+b/alt_bsux,allow_empty_class,match_unset_backref,dupnames
+\= Expect no match
     ab 
 
-/a[^]b/<JS>
+/a[^]b/alt_bsux,allow_empty_class,match_unset_backref,dupnames
     aXb
     a\nb 
-    ** Failers
+\= Expect no match
     ab  
     
-/a[^]+b/<JS> 
+/a[^]+b/alt_bsux,allow_empty_class,match_unset_backref,dupnames
     aXb
     a\nX\nXb 
-    ** Failers
+\= Expect no match
     ab  
 
-/X$/E
+/X$/dollar_endonly
     X
-    ** Failers 
+\= Expect no match 
     X\n 
 
 /X$/
     X
     X\n 
 
-/xyz/C
+/xyz/auto_callout
   xyz 
   abcxyz 
-  abcxyz\Y
-  ** Failers 
+\= Expect no match 
   abc
-  abc\Y
   abcxypqr  
-  abcxypqr\Y  
 
-/(*NO_START_OPT)xyz/C
+/xyz/auto_callout,no_start_optimize
+  abcxyz 
+\= Expect no match 
+  abc
+  abcxypqr  
+
+/(*NO_START_OPT)xyz/auto_callout
   abcxyz 
   
 /(?C)ab/
   ab
-  \C-ab
+  ab\=callout_none
   
-/ab/C
+/ab/auto_callout
   ab
-  \C-ab    
+  ab\=callout_none
 
-/^"((?(?=[a])[^"])|b)*"$/C
+/^"((?(?=[a])[^"])|b)*"$/auto_callout
     "ab"
-    \C-"ab"
+    "ab"\=callout_none
 
 /\d+X|9+Y/
-    ++++123999\P
-    ++++123999Y\P
+    ++++123999\=ps
+    ++++123999Y\=ps
 
 /Z(*F)/
-    Z\P
-    ZA\P 
+\= Expect no match 
+    Z\=ps
+    ZA\=ps
     
 /Z(?!)/
-    Z\P 
-    ZA\P 
+\= Expect no match 
+    Z\=ps
+    ZA\=ps
 
 /dog(sbody)?/
-    dogs\P
-    dogs\P\P 
+    dogs\=ps
+    dogs\=ph
     
 /dog(sbody)??/
-    dogs\P
-    dogs\P\P 
+    dogs\=ps
+    dogs\=ph
 
 /dog|dogsbody/
-    dogs\P
-    dogs\P\P 
+    dogs\=ps
+    dogs\=ph
  
 /dogsbody|dog/
-    dogs\P
-    dogs\P\P 
+    dogs\=ps
+    dogs\=ph
 
 /Z(*F)Q|ZXY/
-    Z\P
-    ZA\P 
-    X\P 
+    Z\=ps
+\= Expect no match 
+    ZA\=ps
+    X\=ps
 
 /\bthe cat\b/
-    the cat\P
-    the cat\P\P
+    the cat\=ps
+    the cat\=ph
 
 /dog(sbody)?/
-    dogs\D\P
-    body\D\R
+    dogs\=ps
+    body\=dfa_restart
 
 /dog(sbody)?/
-    dogs\D\P\P
-    body\D\R
+    dogs\=ph
+    body\=dfa_restart
 
 /abc/
-   abc\P
-   abc\P\P
+   abc\=ps
+   abc\=ph
 
 /abc\K123/
     xyzabc123pqr
     
 /(?<=abc)123/
     xyzabc123pqr 
-    xyzabc12\P
-    xyzabc12\P\P
+    xyzabc12\=ps
+    xyzabc12\=ph
 
 /\babc\b/
     +++abc+++
-    +++ab\P
-    +++ab\P\P  
+    +++ab\=ps
+    +++ab\=ph
 
-/(?=C)/g+
+/(?=C)/g,aftertext
     ABCDECBA
 
 /(abc|def|xyz)/I
     terhjk;abcdaadsfe
     the quick xyz brown fox 
-    \Yterhjk;abcdaadsfe
-    \Ythe quick xyz brown fox 
-    ** Failers
+\= Expect no match
     thejk;adlfj aenjl;fda asdfasd ehj;kjxyasiupd
-    \Ythejk;adlfj aenjl;fda asdfasd ehj;kjxyasiupd
 
-/(abc|def|xyz)/SI
+/(abc|def|xyz)/I,no_start_optimize
     terhjk;abcdaadsfe
-    the quick xyz brown fox 
-    \Yterhjk;abcdaadsfe
-    \Ythe quick xyz brown fox 
-    ** Failers
+    the quick xyz brown fox
+\= Expect no match
     thejk;adlfj aenjl;fda asdfasd ehj;kjxyasiupd
-    \Ythejk;adlfj aenjl;fda asdfasd ehj;kjxyasiupd
 
-/abcd*/+
-    xxxxabcd\P
-    xxxxabcd\P\P
-    dddxxx\R 
-    xxxxabcd\P\P
-    xxx\R 
+/abcd*/aftertext
+    xxxxabcd\=ps
+    xxxxabcd\=ph
+    dddxxx\=dfa_restart
+    xxxxabcd\=ph
+    xxx\=dfa_restart
 
 /abcd*/i
-    xxxxabcd\P
-    xxxxabcd\P\P
-    XXXXABCD\P
-    XXXXABCD\P\P
+    xxxxabcd\=ps
+    xxxxabcd\=ph
+    XXXXABCD\=ps
+    XXXXABCD\=ph
 
 /abc\d*/
-    xxxxabc1\P
-    xxxxabc1\P\P
+    xxxxabc1\=ps
+    xxxxabc1\=ph
 
 /abc[de]*/
-    xxxxabcde\P
-    xxxxabcde\P\P
+    xxxxabcde\=ps
+    xxxxabcde\=ph
 
 /(?:(?1)|B)(A(*F)|C)/
     ABCD
     CCD
-    ** Failers
+\= Expect no match
     CAD   
 
 /^(?:(?1)|B)(A(*F)|C)/
     CCD
     BCD 
-    ** Failers
+\= Expect no match
     ABCD
     CAD
     BAD    
@@ -4547,7 +4491,6 @@
     ac
     
 /^(?=a(*SKIP)b|ac)/
-    ** Failers
     ac
     
 /^(?=a(*THEN)b|ac)/
@@ -4555,106 +4498,107 @@
     
 /^(?=a(*PRUNE)b)/
     ab  
-    ** Failers 
-    ac
 
 /^(?(?!a(*SKIP)b))/
     ac
 
 /(?<=abc)def/
-    abc\P\P
+    abc\=ph
 
 /abc$/
     abc
-    abc\P
-    abc\P\P
+    abc\=ps
+    abc\=ph
 
 /abc$/m
     abc
     abc\n
-    abc\P\P
-    abc\n\P\P 
-    abc\P
-    abc\n\P
+    abc\=ph
+    abc\n\=ph
+    abc\=ps
+    abc\n\=ps
 
 /abc\z/
     abc
-    abc\P
-    abc\P\P
+    abc\=ps
+    abc\=ph
 
 /abc\Z/
     abc
-    abc\P
-    abc\P\P
+    abc\=ps
+    abc\=ph
 
 /abc\b/
     abc
-    abc\P
-    abc\P\P
+    abc\=ps
+    abc\=ph
 
 /abc\B/
+    abc\=ps
+    abc\=ph
+\= Expect no match 
     abc
-    abc\P
-    abc\P\P
 
 /.+/
-    abc\>0
-    abc\>1
-    abc\>2
-    abc\>3
-    abc\>4
-    abc\>-4 
+    abc\=offset=0
+    abc\=offset=1
+    abc\=offset=2
+\= Bad offsets
+    abc\=offset=4
+    abc\=offset=-4 
+\= Expect no match 
+    abc\=offset=3
 
 /^(?:a)++\w/
      aaaab
-     ** Failers 
+\= Expect no match 
      aaaa 
      bbb 
 
 /^(?:aa|(?:a)++\w)/
      aaaab
      aaaa 
-     ** Failers 
+\= Expect no match 
      bbb 
 
 /^(?:a)*+\w/
      aaaab
      bbb 
-     ** Failers 
+\= Expect no match 
      aaaa 
 
 /^(a)++\w/
      aaaab
-     ** Failers 
+\= Expect no match 
      aaaa 
      bbb 
 
 /^(a|)++\w/
      aaaab
-     ** Failers 
+\= Expect no match 
      aaaa 
      bbb 
 
-/(?=abc){3}abc/+
+/(?=abc){3}abc/aftertext
     abcabcabc
-    ** Failers
+\= Expect no match
     xyz  
     
-/(?=abc)+abc/+
+/(?=abc)+abc/aftertext
     abcabcabc
-    ** Failers
+\= Expect no match
     xyz  
     
-/(?=abc)++abc/+
+/(?=abc)++abc/aftertext
     abcabcabc
-    ** Failers
+\= Expect no match
     xyz  
     
 /(?=abc){0}xyz/
     xyz 
 
 /(?=abc){1}xyz/
-    ** Failers
+\= Expect no match
     xyz 
     
 /(?=(a))?./
@@ -4697,93 +4641,87 @@
 /(?(R)a*(?1)|((?R))b)/
     aaaabcde
 
-/(a+)/O
-    \O6aaaa
-    \O8aaaa
-
-/ab\Cde/
-    abXde
-    
-/(?<=ab\Cde)X/
-    abZdeX
+/(a+)/no_auto_possess
+    aaaa\=ovector=3
+    aaaa\=ovector=4
 
 /^\R/
-    \r\P
-    \r\P\P
+    \r\=ps
+    \r\=ph
     
 /^\R{2,3}x/
-    \r\P
-    \r\P\P
-    \r\r\P 
-    \r\r\P\P
-    \r\r\r\P  
-    \r\r\r\P\P
+    \r\=ps
+    \r\=ph
+    \r\r\=ps
+    \r\r\=ph
+    \r\r\r\=ps
+    \r\r\r\=ph
     \r\rx
     \r\r\rx    
 
 /^\R{2,3}?x/
-    \r\P
-    \r\P\P
-    \r\r\P 
-    \r\r\P\P
-    \r\r\r\P  
-    \r\r\r\P\P
+    \r\=ps
+    \r\=ph
+    \r\r\=ps
+    \r\r\=ph
+    \r\r\r\=ps
+    \r\r\r\=ph
     \r\rx
     \r\r\rx    
     
 /^\R?x/
-    \r\P
-    \r\P\P 
+    \r\=ps
+    \r\=ph
     x
     \rx  
 
 /^\R+x/
-    \r\P
-    \r\P\P 
-    \r\n\P
-    \r\n\P\P  
+    \r\=ps
+    \r\=ph
+    \r\n\=ps
+    \r\n\=ph
     \rx  
 
-/^a$/<CRLF>
-    a\r\P
-    a\r\P\P 
+/^a$/newline=crlf
+    a\r\=ps
+    a\r\=ph
 
-/^a$/m<CRLF>
-    a\r\P
-    a\r\P\P 
+/^a$/m,newline=crlf
+    a\r\=ps
+    a\r\=ph
 
-/^(a$|a\r)/<CRLF>
-    a\r\P
-    a\r\P\P 
+/^(a$|a\r)/newline=crlf
+    a\r\=ps
+    a\r\=ph
 
-/^(a$|a\r)/m<CRLF>
-    a\r\P
-    a\r\P\P 
+/^(a$|a\r)/m,newline=crlf
+    a\r\=ps
+    a\r\=ph
 
-/./<CRLF>
-    \r\P
-    \r\P\P 
+/./newline=crlf
+    \r\=ps
+    \r\=ph
   
-/.{2,3}/<CRLF>
-    \r\P 
-    \r\P\P
-    \r\r\P
-    \r\r\P\P
-    \r\r\r\P
-    \r\r\r\P\P     
+/.{2,3}/newline=crlf
+    \r\=ps
+    \r\=ph
+    \r\r\=ps
+    \r\r\=ph
+    \r\r\r\=ps
+    \r\r\r\=ph
 
-/.{2,3}?/<CRLF>
-    \r\P 
-    \r\P\P
-    \r\r\P
-    \r\r\P\P
-    \r\r\r\P
-    \r\r\r\P\P     
+/.{2,3}?/newline=crlf
+    \r\=ps
+    \r\=ph
+    \r\r\=ps
+    \r\r\=ph
+    \r\r\r\=ps
+    \r\r\r\=ph
 
-/-- Test simple validity check for restarts --/
+# Test simple validity check for restarts 
 
 /abcdef/
-   abc\R
+   abc\=dfa_restart
 
 /<H((?(?!<H|F>)(.)|(?R))++)*F>/
     text <H more text <H texting more  hexA0-"\xA0"    hex above 7F-"\xBC" F> text xxxxx <H text F> text F> text2 <H text sample F> more text.
@@ -4797,9 +4735,9 @@
     xx\xa0xxxxxabcd 
 
 /abcd/
-    abcd\O0
+    abcd\=ovector=0
 
-/-- These tests show up auto-possessification --/
+# These tests show up auto-possessification 
 
 /[ab]*/
     aaaa
@@ -4837,8 +4775,108 @@
 '\A(?:[^\"]++|\"(?:[^\"]++|\"\")*+\")++'
     NON QUOTED \"QUOT\"\"ED\" AFTER \"NOT MATCHED
 
+/abc(?=xyz)/allusedtext
+    abcxyzpqr
+    abcxyzpqr\=aftertext
+    
+/(?<=pqr)abc(?=xyz)/allusedtext
+    xyzpqrabcxyzpqr
+    xyzpqrabcxyzpqr\=aftertext
+    
+/a\b/
+    a.\=allusedtext
+    a\=allusedtext  
+
+/abc(?=abcde)(?=ab)/allusedtext
+    abcabcdefg
+
+/a*?b*?/
+    ab
+
+/(*NOTEMPTY)a*?b*?/
+    ab
+    ba
+    cb  
+
+/(*NOTEMPTY_ATSTART)a*?b*?/aftertext
+    ab
+    cdab 
+
+/(a)(b)|(c)/
+    XcX\=ovector=2,get=1,get=2,get=3,get=4,getall
+
+/(?<A>aa)/
+    aa\=get=A
+    aa\=copy=A 
+
+/a+/no_auto_possess
+    a\=ovector=2,get=1,get=2,getall
+    aaa\=ovector=2,get=1,get=2,getall
+
+/a(b)c(d)/
+    abc\=ph,copy=0,copy=1,getall
+
+/ab(?C" any text with spaces ")cde/B
+    abcde
+    12abcde
+
+/^a(b)c(?C1)def/
+      abcdef
+
+/^a(b)c(?C"AB")def/
+      abcdef
+
+/^a(b)c(?C1)def/
+      abcdef\=callout_capture
+
+/^a(b)c(?C{AB})def/B
+      abcdef\=callout_capture
+
+/^(?(?C25)(?=abc)abcd|xyz)/B
+    abcdefg
+    xyz123 
+
+/^(?(?C$abc$)(?=abc)abcd|xyz)/B
+    abcdefg
+    xyz123 
+
+/^ab(?C'first')cd(?C"second")ef/
+    abcdefg
+
+/(?:a(?C`code`)){3}X/
+    aaaXY
+
+# Binary zero in callout string
+#  a  (  ?  C  '  x     z  '  )  b
+/ 61 28 3f 43 27 78 00 7a 27 29 62/hex
+    abcdefgh
+
 /(?(?!)a|b)/
     bbb
+\= Expect no match
     aaa 
 
-/-- End of testinput8 --/
+/^/gm
+    \n\n\n
+
+/^/gm,alt_circumflex
+    \n\n\n
+
+/abc/use_offset_limit
+    1234abcde\=offset_limit=100
+    1234abcde\=offset_limit=9
+    1234abcde\=offset_limit=4
+    1234abcde\=offset_limit=4,offset=4
+\= Expect no match
+    1234abcde\=offset_limit=4,offset=5
+    1234abcde\=offset_limit=3
+
+/(?<=abc)/use_offset_limit
+    1234abc\=offset_limit=7
+\= Expect no match
+    1234abc\=offset_limit=6
+
+/abcd/null_context
+    abcd\=null_context
+
+# End of testinput6
diff --git a/dist2/testdata/testinput7 b/dist2/testdata/testinput7
new file mode 100644
index 0000000..ef30223
--- /dev/null
+++ b/dist2/testdata/testinput7
@@ -0,0 +1,2096 @@
+# This set of tests checks UTF and Unicode property support with the DFA
+# matching functionality of pcre_dfa_match(). A default subject modifier is
+# used to force DFA matching for all tests.
+
+#subject dfa
+#newline_default LF any anyCRLF
+
+/\x{100}ab/utf
+  \x{100}ab
+  
+/a\x{100}*b/utf
+    ab
+    a\x{100}b  
+    a\x{100}\x{100}b  
+    
+/a\x{100}+b/utf
+    a\x{100}b  
+    a\x{100}\x{100}b  
+\= Expect no match 
+    ab
+     
+/\bX/utf
+    Xoanon
+    +Xoanon
+    \x{300}Xoanon 
+\= Expect no match 
+    YXoanon  
+    
+/\BX/utf
+    YXoanon
+\= Expect no match
+    Xoanon
+    +Xoanon    
+    \x{300}Xoanon 
+
+/X\b/utf
+    X+oanon
+    ZX\x{300}oanon 
+    FAX 
+\= Expect no match 
+    Xoanon  
+    
+/X\B/utf
+    Xoanon  
+\= Expect no match
+    X+oanon
+    ZX\x{300}oanon 
+    FAX 
+    
+/[^a]/utf
+    abcd
+    a\x{100}   
+
+/^[abc\x{123}\x{400}-\x{402}]{2,3}\d/utf
+    ab99
+    \x{123}\x{123}45
+    \x{400}\x{401}\x{402}6  
+\= Expect no match
+    d99
+    \x{123}\x{122}4   
+    \x{400}\x{403}6  
+    \x{400}\x{401}\x{402}\x{402}6  
+
+/a.b/utf
+    acb
+    a\x7fb
+    a\x{100}b 
+\= Expect no match
+    a\nb  
+
+/a(.{3})b/utf
+    a\x{4000}xyb 
+    a\x{4000}\x7fyb 
+    a\x{4000}\x{100}yb 
+\= Expect no match
+    a\x{4000}b 
+    ac\ncb 
+
+/a(.*?)(.)/
+    a\xc0\x88b
+
+/a(.*?)(.)/utf
+    a\x{100}b
+
+/a(.*)(.)/
+    a\xc0\x88b
+
+/a(.*)(.)/utf
+    a\x{100}b
+
+/a(.)(.)/
+    a\xc0\x92bcd
+
+/a(.)(.)/utf
+    a\x{240}bcd
+
+/a(.?)(.)/
+    a\xc0\x92bcd
+
+/a(.?)(.)/utf
+    a\x{240}bcd
+
+/a(.??)(.)/
+    a\xc0\x92bcd
+
+/a(.??)(.)/utf
+    a\x{240}bcd
+
+/a(.{3})b/utf
+    a\x{1234}xyb 
+    a\x{1234}\x{4321}yb 
+    a\x{1234}\x{4321}\x{3412}b 
+\= Expect no match
+    a\x{1234}b 
+    ac\ncb 
+
+/a(.{3,})b/utf
+    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 
+\= Expect no match
+    a\x{1234}b 
+
+/a(.{3,}?)b/utf
+    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 
+\= Expect no match
+    a\x{1234}b 
+
+/a(.{3,5})b/utf
+    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 
+\= Expect no match
+    a\x{1234}b 
+    axxxxxxbcdefghijb 
+
+/a(.{3,5}?)b/utf
+    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 
+\= Expect no match
+    a\x{1234}b 
+    axxxxxxbcdefghijb 
+
+/^[a\x{c0}]/utf
+\= Expect no match
+    \x{100}
+
+/(?<=aXb)cd/utf
+    aXbcd
+
+/(?<=a\x{100}b)cd/utf
+    a\x{100}bcd
+
+/(?<=a\x{100000}b)cd/utf
+    a\x{100000}bcd
+    
+/(?:\x{100}){3}b/utf
+    \x{100}\x{100}\x{100}b
+\= Expect no match 
+    \x{100}\x{100}b
+
+/\x{ab}/utf
+    \x{ab} 
+    \xc2\xab
+\= Expect no match 
+    \x00{ab}
+
+/(?<=(.))X/utf
+    WXYZ
+    \x{256}XYZ 
+\= Expect no match
+    XYZ 
+
+/[^a]+/g,utf
+    bcd
+    \x{100}aY\x{256}Z 
+    
+/^[^a]{2}/utf
+    \x{100}bc
+ 
+/^[^a]{2,}/utf
+    \x{100}bcAa
+
+/^[^a]{2,}?/utf
+    \x{100}bca
+
+/[^a]+/gi,utf
+    bcd
+    \x{100}aY\x{256}Z 
+    
+/^[^a]{2}/i,utf
+    \x{100}bc
+ 
+/^[^a]{2,}/i,utf
+    \x{100}bcAa
+
+/^[^a]{2,}?/i,utf
+    \x{100}bca
+
+/\x{100}{0,0}/utf
+    abcd
+ 
+/\x{100}?/utf
+    abcd
+    \x{100}\x{100} 
+
+/\x{100}{0,3}/utf
+    \x{100}\x{100} 
+    \x{100}\x{100}\x{100}\x{100} 
+    
+/\x{100}*/utf
+    abce
+    \x{100}\x{100}\x{100}\x{100} 
+
+/\x{100}{1,1}/utf
+    abcd\x{100}\x{100}\x{100}\x{100} 
+
+/\x{100}{1,3}/utf
+    abcd\x{100}\x{100}\x{100}\x{100} 
+
+/\x{100}+/utf
+    abcd\x{100}\x{100}\x{100}\x{100} 
+
+/\x{100}{3}/utf
+    abcd\x{100}\x{100}\x{100}XX
+
+/\x{100}{3,5}/utf
+    abcd\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}XX
+
+/\x{100}{3,}/utf,no_auto_possess
+    abcd\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}XX
+
+/(?<=a\x{100}{2}b)X/utf
+    Xyyya\x{100}\x{100}bXzzz
+
+/\D*/utf,no_auto_possess
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+
+/\D*/utf,no_auto_possess
+  \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\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/utf
+    1X2
+    1\x{100}2 
+  
+/>\S/utf
+    > >X Y
+    > >\x{100} Y
+  
+/\d/utf
+    \x{100}3
+    
+/\s/utf
+    \x{100} X
+    
+/\D+/utf
+    12abcd34
+\= Expect no match
+    1234  
+
+/\D{2,3}/utf
+    12abcd34
+    12ab34
+\= Expect no match  
+    1234
+    12a34  
+
+/\D{2,3}?/utf
+    12abcd34
+    12ab34
+\= Expect no match  
+    1234
+    12a34  
+
+/\d+/utf
+    12abcd34
+
+/\d{2,3}/utf
+    12abcd34
+    1234abcd
+\= Expect no match  
+    1.4 
+
+/\d{2,3}?/utf
+    12abcd34
+    1234abcd
+\= Expect no match  
+    1.4 
+
+/\S+/utf
+    12abcd34
+\= Expect no match
+    \    \ 
+
+/\S{2,3}/utf
+    12abcd34
+    1234abcd
+\= Expect no match
+    \     \  
+
+/\S{2,3}?/utf
+    12abcd34
+    1234abcd
+\= Expect no match
+    \     \  
+
+/>\s+</utf
+    12>      <34
+
+/>\s{2,3}</utf
+    ab>  <cd
+    ab>   <ce
+\= Expect no match
+    ab>    <cd 
+
+/>\s{2,3}?</utf
+    ab>  <cd
+    ab>   <ce
+\= Expect no match
+    ab>    <cd 
+
+/\w+/utf
+    12      34
+\= Expect no match
+    +++=*! 
+
+/\w{2,3}/utf
+    ab  cd
+    abcd ce
+\= Expect no match
+    a.b.c
+
+/\w{2,3}?/utf
+    ab  cd
+    abcd ce
+\= Expect no match
+    a.b.c
+
+/\W+/utf
+    12====34
+\= Expect no match
+    abcd 
+
+/\W{2,3}/utf
+    ab====cd
+    ab==cd
+\= Expect no match
+    a.b.c
+
+/\W{2,3}?/utf
+    ab====cd
+    ab==cd
+\= Expect no match
+    a.b.c
+
+/[\x{100}]/utf
+    \x{100}
+    Z\x{100}
+    \x{100}Z
+
+/[Z\x{100}]/utf
+    Z\x{100}
+    \x{100}
+    \x{100}Z
+
+/[\x{100}\x{200}]/utf
+   ab\x{100}cd
+   ab\x{200}cd
+
+/[\x{100}-\x{200}]/utf
+   ab\x{100}cd
+   ab\x{200}cd
+   ab\x{111}cd 
+
+/[z-\x{200}]/utf
+   ab\x{100}cd
+   ab\x{200}cd
+   ab\x{111}cd 
+   abzcd
+   ab|cd  
+
+/[Q\x{100}\x{200}]/utf
+   ab\x{100}cd
+   ab\x{200}cd
+   Q? 
+
+/[Q\x{100}-\x{200}]/utf
+   ab\x{100}cd
+   ab\x{200}cd
+   ab\x{111}cd 
+   Q? 
+
+/[Qz-\x{200}]/utf
+   ab\x{100}cd
+   ab\x{200}cd
+   ab\x{111}cd 
+   abzcd
+   ab|cd  
+   Q? 
+
+/[\x{100}\x{200}]{1,3}/utf
+   ab\x{100}cd
+   ab\x{200}cd
+   ab\x{200}\x{100}\x{200}\x{100}cd
+
+/[\x{100}\x{200}]{1,3}?/utf
+   ab\x{100}cd
+   ab\x{200}cd
+   ab\x{200}\x{100}\x{200}\x{100}cd
+
+/[Q\x{100}\x{200}]{1,3}/utf
+   ab\x{100}cd
+   ab\x{200}cd
+   ab\x{200}\x{100}\x{200}\x{100}cd
+
+/[Q\x{100}\x{200}]{1,3}?/utf
+   ab\x{100}cd
+   ab\x{200}cd
+   ab\x{200}\x{100}\x{200}\x{100}cd
+
+/(?<=[\x{100}\x{200}])X/utf
+    abc\x{200}X
+    abc\x{100}X 
+\= Expect no match
+    X  
+
+/(?<=[Q\x{100}\x{200}])X/utf
+    abc\x{200}X
+    abc\x{100}X 
+    abQX 
+\= Expect no match
+    X  
+
+/(?<=[\x{100}\x{200}]{3})X/utf
+    abc\x{100}\x{200}\x{100}X
+\= Expect no match
+    abc\x{200}X
+    X  
+
+/[^\x{100}\x{200}]X/utf
+    AX
+    \x{150}X
+    \x{500}X 
+\= Expect no match
+    \x{100}X
+    \x{200}X   
+
+/[^Q\x{100}\x{200}]X/utf
+    AX
+    \x{150}X
+    \x{500}X 
+\= Expect no match
+    \x{100}X
+    \x{200}X   
+    QX 
+
+/[^\x{100}-\x{200}]X/utf
+    AX
+    \x{500}X 
+\= Expect no match
+    \x{100}X
+    \x{150}X
+    \x{200}X   
+
+/[z-\x{100}]/i,utf
+    z
+    Z 
+    \x{100}
+\= Expect no match
+    \x{102}
+    y    
+
+/[\xFF]/
+    >\xff<
+
+/[\xff]/utf
+    >\x{ff}<
+
+/[^\xFF]/
+    XYZ
+
+/[^\xff]/utf
+    XYZ
+    \x{123} 
+
+/^[ac]*b/utf
+\= Expect no match
+    xb
+
+/^[ac\x{100}]*b/utf
+\= Expect no match
+    xb
+
+/^[^x]*b/i,utf
+\= Expect no match
+    xb
+
+/^[^x]*b/utf
+\= Expect no match
+    xb
+  
+/^\d*b/utf
+\= Expect no match
+    xb 
+
+/(|a)/g,utf
+    catac
+    a\x{256}a 
+
+/^\x{85}$/i,utf
+    \x{85}
+
+/^abc./gmx,newline=any,utf
+    abc1 \x0aabc2 \x0babc3xx \x0cabc4 \x0dabc5xx \x0d\x0aabc6 \x{0085}abc7 \x{2028}abc8 \x{2029}abc9 JUNK
+
+/abc.$/gmx,newline=any,utf
+    abc1\x0a abc2\x0b abc3\x0c abc4\x0d abc5\x0d\x0a abc6\x{0085} abc7\x{2028} abc8\x{2029} abc9
+
+/^a\Rb/bsr=unicode,utf
+    a\nb
+    a\rb
+    a\r\nb
+    a\x0bb
+    a\x0cb
+    a\x{85}b   
+    a\x{2028}b 
+    a\x{2029}b 
+\= Expect no match
+    a\n\rb    
+
+/^a\R*b/bsr=unicode,utf
+    ab
+    a\nb
+    a\rb
+    a\r\nb
+    a\x0bb
+    a\x0c\x{2028}\x{2029}b
+    a\x{85}b   
+    a\n\rb    
+    a\n\r\x{85}\x0cb 
+
+/^a\R+b/bsr=unicode,utf
+    a\nb
+    a\rb
+    a\r\nb
+    a\x0bb
+    a\x0c\x{2028}\x{2029}b
+    a\x{85}b   
+    a\n\rb    
+    a\n\r\x{85}\x0cb 
+\= Expect no match
+    ab  
+
+/^a\R{1,3}b/bsr=unicode,utf
+    a\nb
+    a\n\rb
+    a\n\r\x{85}b
+    a\r\n\r\nb 
+    a\r\n\r\n\r\nb 
+    a\n\r\n\rb
+    a\n\n\r\nb 
+\= Expect no match
+    a\n\n\n\rb
+    a\r
+
+/\h+\V?\v{3,4}/utf,no_auto_possess
+    \x09\x20\x{a0}X\x0a\x0b\x0c\x0d\x0a
+
+/\V?\v{3,4}/utf,no_auto_possess
+    \x20\x{a0}X\x0a\x0b\x0c\x0d\x0a
+
+/\h+\V?\v{3,4}/utf,no_auto_possess
+    >\x09\x20\x{a0}X\x0a\x0a\x0a<
+
+/\V?\v{3,4}/utf,no_auto_possess
+    >\x09\x20\x{a0}X\x0a\x0a\x0a<
+
+/\H\h\V\v/utf
+    X X\x0a
+    X\x09X\x0b
+\= Expect no match
+    \x{a0} X\x0a   
+    
+/\H*\h+\V?\v{3,4}/utf,no_auto_possess
+    \x09\x20\x{a0}X\x0a\x0b\x0c\x0d\x0a
+    \x09\x20\x{a0}\x0a\x0b\x0c\x0d\x0a
+    \x09\x20\x{a0}\x0a\x0b\x0c
+\= Expect no match 
+    \x09\x20\x{a0}\x0a\x0b
+     
+/\H\h\V\v/utf
+    \x{3001}\x{3000}\x{2030}\x{2028}
+    X\x{180e}X\x{85}
+\= Expect no match
+    \x{2009} X\x0a   
+    
+/\H*\h+\V?\v{3,4}/utf,no_auto_possess
+    \x{1680}\x{180e}\x{2007}X\x{2028}\x{2029}\x0c\x0d\x0a
+    \x09\x{205f}\x{a0}\x0a\x{2029}\x0c\x{2028}\x0a
+    \x09\x20\x{202f}\x0a\x0b\x0c
+\= Expect no match 
+    \x09\x{200a}\x{a0}\x{2028}\x0b
+     
+/a\Rb/I,bsr=anycrlf,utf
+    a\rb
+    a\nb
+    a\r\nb
+\= Expect no match
+    a\x{85}b
+    a\x0bb     
+
+/a\Rb/I,bsr=unicode,utf
+    a\rb
+    a\nb
+    a\r\nb
+    a\x{85}b
+    a\x0bb     
+    
+/a\R?b/I,bsr=anycrlf,utf
+    a\rb
+    a\nb
+    a\r\nb
+\= Expect no match
+    a\x{85}b
+    a\x0bb     
+
+/a\R?b/I,bsr=unicode,utf
+    a\rb
+    a\nb
+    a\r\nb
+    a\x{85}b
+    a\x0bb     
+ 
+/X/newline=any,utf,firstline
+    A\x{1ec5}ABCXYZ
+
+/abcd*/utf
+    xxxxabcd\=ps
+    xxxxabcd\=ph
+
+/abcd*/i,utf
+    xxxxabcd\=ps
+    xxxxabcd\=ph
+    XXXXABCD\=ps
+    XXXXABCD\=ph
+
+/abc\d*/utf
+    xxxxabc1\=ps
+    xxxxabc1\=ph
+
+/abc[de]*/utf
+    xxxxabcde\=ps
+    xxxxabcde\=ph
+
+/\bthe cat\b/utf
+    the cat\=ps
+    the cat\=ph
+
+/./newline=crlf,utf
+    \r\=ps
+    \r\=ph
+  
+/.{2,3}/newline=crlf,utf
+    \r\=ps
+    \r\=ph
+    \r\r\=ps
+    \r\r\=ph
+    \r\r\r\=ps
+    \r\r\r\=ph
+
+/.{2,3}?/newline=crlf,utf
+    \r\=ps
+    \r\=ph
+    \r\r\=ps
+    \r\r\=ph
+    \r\r\r\=ps
+    \r\r\r\=ph
+
+/[^\x{100}]/utf
+    \x{100}\x{101}X
+
+/[^\x{100}]+/utf
+    \x{100}\x{101}X
+
+/\pL\P{Nd}/utf
+    AB
+\= Expect no match
+    A0
+    00
+
+/\X./utf
+    AB
+    A\x{300}BC
+    A\x{300}\x{301}\x{302}BC
+\= Expect no match
+    \x{300}
+
+/\X\X/utf
+    ABC
+    A\x{300}B\x{300}\x{301}C
+    A\x{300}\x{301}\x{302}BC
+\= Expect no match
+    \x{300}
+
+/^\pL+/utf
+    abcd
+    a
+
+/^\PL+/utf
+    1234
+    =
+\= Expect no match
+    abcd
+
+/^\X+/utf
+    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
+    \x{300}\x{301}\x{302}
+
+/\X?abc/utf
+    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
+
+/^\X?abc/utf
+    abc
+    A\x{300}abc
+    \x{300}abc
+\= Expect no match
+    A\x{300}\x{301}\x{302}A\x{300}A\x{300}A\x{300}abcxyz
+
+/\X*abc/utf
+    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
+
+/^\X*abc/utf
+    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
+
+/^\pL?=./utf
+    A=b
+    =c
+\= Expect no match
+    1=2
+    AAAA=b
+
+/^\pL*=./utf
+    AAAA=b
+    =c
+\= Expect no match
+    1=2
+
+/^\X{2,3}X/utf
+    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
+\= Expect no match
+    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</utf
+    \x7f\x{c0}\x{30f}\x{660}\x{66c}\x{f01}\x{1680}<
+    \np\x{300}9!\$ <
+\= Expect no match
+    ap\x{300}9!\$ <
+  
+/^\PC/utf
+    X
+\= Expect no match
+    \x7f
+  
+/^\PL/utf
+    9
+\= Expect no match
+    \x{c0}
+  
+/^\PM/utf
+    X
+\= Expect no match
+    \x{30f}
+  
+/^\PN/utf
+    X
+\= Expect no match
+    \x{660}
+  
+/^\PP/utf
+    X
+\= Expect no match
+    \x{66c}
+  
+/^\PS/utf
+    X
+\= Expect no match
+    \x{f01}
+  
+/^\PZ/utf
+    X
+\= Expect no match
+    \x{1680}
+    
+/^\p{Cc}/utf
+    \x{017}
+    \x{09f}
+\= Expect no match
+    \x{0600}
+  
+/^\p{Cf}/utf
+    \x{601}
+    \x{180e}
+    \x{061c}
+    \x{2066}
+    \x{2067}
+    \x{2068}
+    \x{2069}
+\= Expect no match
+    \x{09f}
+  
+/^\p{Cn}/utf
+\= Expect no match
+    \x{09f}
+  
+/^\p{Co}/utf
+    \x{f8ff}
+\= Expect no match
+    \x{09f}
+  
+/^\p{Cs}/utf
+    \x{dfff}\=no_utf_check
+\= Expect no match
+    \x{09f}
+  
+/^\p{Ll}/utf
+    a
+\= Expect no match
+    Z
+    \x{e000}
+  
+/^\p{Lm}/utf
+    \x{2b0}
+\= Expect no match
+    a
+  
+/^\p{Lo}/utf
+    \x{1bb}
+\= Expect no match
+    a
+    \x{2b0}
+  
+/^\p{Lt}/utf
+    \x{1c5}
+\= Expect no match
+    a
+    \x{2b0}
+  
+/^\p{Lu}/utf
+    A
+\= Expect no match
+    \x{2b0}
+  
+/^\p{Mc}/utf
+    \x{903}
+\= Expect no match
+    X
+    \x{300}
+       
+/^\p{Me}/utf
+    \x{488}
+\= Expect no match
+    X
+    \x{903}
+    \x{300}
+  
+/^\p{Mn}/utf
+    \x{300}
+    \x{1a1b}
+\= Expect no match
+    X
+    \x{903}
+  
+/^\p{Nd}+/utf,no_auto_possess
+    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}
+\= Expect no match
+    X
+  
+/^\p{Nl}/utf
+    \x{16ee}
+\= Expect no match
+    X
+    \x{966}
+  
+/^\p{No}/utf
+    \x{b2}
+    \x{b3}
+\= Expect no match
+    X
+    \x{16ee}
+  
+/^\p{Pc}/utf
+    \x5f
+    \x{203f}
+\= Expect no match
+    X
+    -
+    \x{58a}
+  
+/^\p{Pd}/utf
+    -
+    \x{58a}
+\= Expect no match
+    X
+    \x{203f}
+  
+/^\p{Pe}/utf
+    )
+    ]
+    }
+    \x{f3b}
+    \x{2309}
+    \x{230b}
+\= Expect no match
+    X
+    \x{203f}
+    (
+    [
+    {
+    \x{f3c}
+
+/^\p{Pf}/utf
+    \x{bb}
+    \x{2019}
+\= Expect no match
+    X
+    \x{203f}
+  
+/^\p{Pi}/utf
+    \x{ab}
+    \x{2018}
+\= Expect no match
+    X
+    \x{203f}
+  
+/^\p{Po}/utf
+    !
+    \x{37e}
+\= Expect no match
+    X
+    \x{203f}
+  
+/^\p{Ps}/utf
+    (
+    [
+    {
+    \x{f3c}
+    \x{2308}
+    \x{230a}
+\= Expect no match
+    X
+    )
+    ]
+    }
+    \x{f3b}
+  
+/^\p{Sc}+/utf
+    $\x{a2}\x{a3}\x{a4}\x{a5}\x{a6}
+    \x{9f2}
+\= Expect no match
+    X
+    \x{2c2}
+  
+/^\p{Sk}/utf
+    \x{2c2}
+\= Expect no match
+    X
+    \x{9f2}
+  
+/^\p{Sm}+/utf
+    +<|~\x{ac}\x{2044}
+\= Expect no match
+    X
+    \x{9f2}
+  
+/^\p{So}/utf
+    \x{a6}
+    \x{482}
+\= Expect no match
+    X
+    \x{9f2}
+  
+/^\p{Zl}/utf
+    \x{2028}
+\= Expect no match
+    X
+    \x{2029}
+  
+/^\p{Zp}/utf
+    \x{2029}
+\= Expect no match
+    X
+    \x{2028}
+  
+/^\p{Zs}/utf
+    \ \
+    \x{a0}
+    \x{1680}
+    \x{2000}
+    \x{2001}
+\= Expect no match
+    \x{2028}
+    \x{200d}
+  
+/\p{Nd}+(..)/utf
+      \x{660}\x{661}\x{662}ABC
+  
+/\p{Nd}+?(..)/utf
+      \x{660}\x{661}\x{662}ABC
+  
+/\p{Nd}{2,}(..)/utf
+      \x{660}\x{661}\x{662}ABC
+  
+/\p{Nd}{2,}?(..)/utf
+      \x{660}\x{661}\x{662}ABC
+  
+/\p{Nd}*(..)/utf
+      \x{660}\x{661}\x{662}ABC
+  
+/\p{Nd}*?(..)/utf
+      \x{660}\x{661}\x{662}ABC
+  
+/\p{Nd}{2}(..)/utf
+      \x{660}\x{661}\x{662}ABC
+  
+/\p{Nd}{2,3}(..)/utf
+      \x{660}\x{661}\x{662}ABC
+  
+/\p{Nd}{2,3}?(..)/utf
+      \x{660}\x{661}\x{662}ABC
+  
+/\p{Nd}?(..)/utf
+      \x{660}\x{661}\x{662}ABC
+  
+/\p{Nd}??(..)/utf
+      \x{660}\x{661}\x{662}ABC
+  
+/\p{Nd}*+(..)/utf
+      \x{660}\x{661}\x{662}ABC
+  
+/\p{Nd}*+(...)/utf
+      \x{660}\x{661}\x{662}ABC
+  
+/\p{Nd}*+(....)/utf
+\= Expect no match
+      \x{660}\x{661}\x{662}ABC
+  
+/\p{Lu}/i,utf
+    A
+    a\x{10a0}B
+\= Expect no match
+    a
+    \x{1d00}
+
+/\p{^Lu}/i,utf
+    1234
+\= Expect no match
+    ABC
+
+/\P{Lu}/i,utf
+    1234
+\= Expect no match
+    ABC
+
+/(?<=A\p{Nd})XYZ/utf
+    A2XYZ
+    123A5XYZPQR
+    ABA\x{660}XYZpqr
+\= Expect no match
+    AXYZ
+    XYZ
+    
+/(?<!\pL)XYZ/utf
+    1XYZ
+    AB=XYZ..
+    XYZ
+\= Expect no match
+    WXYZ
+
+/[\p{Nd}]/utf
+    1234
+
+/[\p{Nd}+-]+/utf
+    1234
+    12-34
+    12+\x{661}-34
+\= Expect no match
+    abcd
+
+/[\P{Nd}]+/utf
+    abcd
+\= Expect no match
+    1234
+
+/\D+/utf,no_auto_possess
+    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+\= Expect no match
+    11111111111111111111111111111111111111111111111111111111111111111111111
+     
+/\P{Nd}+/utf,no_auto_possess
+    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+\= Expect no match
+    11111111111111111111111111111111111111111111111111111111111111111111111
+
+/[\D]+/utf,no_auto_possess
+    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+\= Expect no match
+    11111111111111111111111111111111111111111111111111111111111111111111111
+
+/[\P{Nd}]+/utf,no_auto_possess
+    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+\= Expect no match
+    11111111111111111111111111111111111111111111111111111111111111111111111
+
+/[\D\P{Nd}]+/utf,no_auto_possess
+    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+\= Expect no match
+    11111111111111111111111111111111111111111111111111111111111111111111111
+
+/\pL/utf
+    a
+    A
+
+/\pL/i,utf
+    a
+    A
+    
+/\p{Lu}/utf
+    A
+    aZ
+\= Expect no match
+    abc
+
+/\p{Lu}/i,utf
+    A
+    aZ
+\= Expect no match
+    abc
+
+/\p{Ll}/utf
+    a
+    Az
+\= Expect no match
+    ABC
+
+/\p{Ll}/i,utf
+    a
+    Az
+\= Expect no match
+    ABC
+
+/^\x{c0}$/i,utf
+    \x{c0}
+    \x{e0}
+
+/^\x{e0}$/i,utf
+    \x{c0}
+    \x{e0}
+
+/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/utf
+    A\x{391}\x{10427}\x{ff3a}\x{1fb0}
+\= Expect no match
+    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}/i,utf
+    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}+/i,utf
+    \x{391}\x{3b1}\x{3b1}\x{3b1}\x{391}
+
+/\x{391}{3,5}(.)/i,utf
+    \x{391}\x{3b1}\x{3b1}\x{3b1}\x{391}X
+
+/\x{391}{3,5}?(.)/i,utf
+    \x{391}\x{3b1}\x{3b1}\x{3b1}\x{391}X
+
+/[\x{391}\x{ff3a}]/i,utf
+    \x{391}
+    \x{ff3a}
+    \x{3b1}
+    \x{ff5a}
+    
+/[\x{c0}\x{391}]/i,utf
+    \x{c0}
+    \x{e0}
+
+/[\x{105}-\x{109}]/i,utf
+    \x{104}
+    \x{105}
+    \x{109}
+\= Expect no match
+    \x{100}
+    \x{10a}
+    
+/[z-\x{100}]/i,utf
+    Z
+    z
+    \x{39c}
+    \x{178}
+    |
+    \x{80}
+    \x{ff}
+    \x{100}
+    \x{101}
+\= Expect no match
+    \x{102}
+    Y
+    y
+
+/[z-\x{100}]/i,utf
+
+/^\X/utf
+    A
+    A\x{300}BC
+    A\x{300}\x{301}\x{302}BC
+    \x{300}
+
+/^(\X*)C/utf
+    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/utf
+    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*)(.)/utf
+    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*?)(.)/utf
+    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(.)/utf
+\= Expect no match
+    A\x{300}\x{301}\x{302}
+
+/^\X{2,3}(.)/utf
+    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}?(.)/utf
+    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
+\= Expect no match
+    X
+    1X
+    1234X
+
+/\x{100}/i,utf
+    \x{100}
+    \x{101}
+    
+/^\p{Han}+/utf
+    \x{2e81}\x{3007}\x{2f804}\x{31a0}
+\= Expect no match
+    \x{2e7f}
+
+/^\P{Katakana}+/utf
+    \x{3105}
+\= Expect no match
+    \x{30ff}
+
+/^[\p{Arabic}]/utf
+    \x{06e9}
+    \x{060b}
+\= Expect no match
+    X\x{06e9}
+
+/^[\P{Yi}]/utf
+    \x{2f800}
+\= Expect no match
+    \x{a014}
+    \x{a4c6}
+
+/^\p{Any}X/utf
+    AXYZ
+    \x{1234}XYZ
+\= Expect no match
+    X
+    
+/^\P{Any}X/utf
+\= Expect no match
+    AX
+    
+/^\p{Any}?X/utf
+    XYZ
+    AXYZ
+    \x{1234}XYZ
+\= Expect no match
+    ABXYZ
+
+/^\P{Any}?X/utf
+    XYZ
+\= Expect no match
+    AXYZ
+    \x{1234}XYZ
+    ABXYZ
+
+/^\p{Any}+X/utf
+    AXYZ
+    \x{1234}XYZ
+    A\x{1234}XYZ
+\= Expect no match
+    XYZ
+
+/^\P{Any}+X/utf
+\= Expect no match
+    AXYZ
+    \x{1234}XYZ
+    A\x{1234}XYZ
+    XYZ
+
+/^\p{Any}*X/utf
+    XYZ
+    AXYZ
+    \x{1234}XYZ
+    A\x{1234}XYZ
+
+/^\P{Any}*X/utf
+    XYZ
+\= Expect no match
+    AXYZ
+    \x{1234}XYZ
+    A\x{1234}XYZ
+
+/^[\p{Any}]X/utf
+    AXYZ
+    \x{1234}XYZ
+\= Expect no match
+    X
+    
+/^[\P{Any}]X/utf
+\= Expect no match
+    AX
+    
+/^[\p{Any}]?X/utf
+    XYZ
+    AXYZ
+    \x{1234}XYZ
+\= Expect no match
+    ABXYZ
+
+/^[\P{Any}]?X/utf
+    XYZ
+\= Expect no match
+    AXYZ
+    \x{1234}XYZ
+    ABXYZ
+
+/^[\p{Any}]+X/utf
+    AXYZ
+    \x{1234}XYZ
+    A\x{1234}XYZ
+\= Expect no match
+    XYZ
+
+/^[\P{Any}]+X/utf
+\= Expect no match
+    AXYZ
+    \x{1234}XYZ
+    A\x{1234}XYZ
+    XYZ
+
+/^[\p{Any}]*X/utf
+    XYZ
+    AXYZ
+    \x{1234}XYZ
+    A\x{1234}XYZ
+
+/^[\P{Any}]*X/utf
+    XYZ
+\= Expect no match
+    AXYZ
+    \x{1234}XYZ
+    A\x{1234}XYZ
+
+/^\p{Any}{3,5}?/utf
+    abcdefgh
+    \x{1234}\n\r\x{3456}xyz
+
+/^\p{Any}{3,5}/utf
+    abcdefgh
+    \x{1234}\n\r\x{3456}xyz
+
+/^\P{Any}{3,5}?/utf
+\= Expect no match
+    abcdefgh
+    \x{1234}\n\r\x{3456}xyz
+
+/^\p{L&}X/utf
+     AXY
+     aXY
+     \x{1c5}XY
+\= Expect no match
+     \x{1bb}XY
+     \x{2b0}XY
+     !XY
+
+/^[\p{L&}]X/utf
+     AXY
+     aXY
+     \x{1c5}XY
+\= Expect no match
+     \x{1bb}XY
+     \x{2b0}XY
+     !XY
+
+/^\p{L&}+X/utf
+     AXY
+     aXY
+     AbcdeXyz
+     \x{1c5}AbXY
+     abcDEXypqreXlmn
+\= Expect no match
+     \x{1bb}XY
+     \x{2b0}XY
+     !XY
+
+/^[\p{L&}]+X/utf
+     AXY
+     aXY
+     AbcdeXyz
+     \x{1c5}AbXY
+     abcDEXypqreXlmn
+\= Expect no match
+     \x{1bb}XY
+     \x{2b0}XY
+     !XY
+
+/^\p{L&}+?X/utf
+     AXY
+     aXY
+     AbcdeXyz
+     \x{1c5}AbXY
+     abcDEXypqreXlmn
+\= Expect no match
+     \x{1bb}XY
+     \x{2b0}XY
+     !XY
+
+/^[\p{L&}]+?X/utf
+     AXY
+     aXY
+     AbcdeXyz
+     \x{1c5}AbXY
+     abcDEXypqreXlmn
+\= Expect no match
+     \x{1bb}XY
+     \x{2b0}XY
+     !XY
+
+/^\P{L&}X/utf
+     !XY
+     \x{1bb}XY
+     \x{2b0}XY
+\= Expect no match
+     \x{1c5}XY
+     AXY
+
+/^[\P{L&}]X/utf
+     !XY
+     \x{1bb}XY
+     \x{2b0}XY
+\= Expect no match
+     \x{1c5}XY
+     AXY
+
+/^\x{023a}+?(\x{0130}+)/i,utf
+  \x{023a}\x{2c65}\x{0130}
+  
+/^\x{023a}+([^X])/i,utf
+  \x{023a}\x{2c65}X
+ 
+/\x{c0}+\x{116}+/i,utf
+    \x{c0}\x{e0}\x{116}\x{117}
+
+/[\x{c0}\x{116}]+/i,utf
+    \x{c0}\x{e0}\x{116}\x{117}
+
+# Check property support in non-UTF-8 mode
+ 
+/\p{L}{4}/
+    123abcdefg
+    123abc\xc4\xc5zz
+
+/\p{Carian}\p{Cham}\p{Kayah_Li}\p{Lepcha}\p{Lycian}\p{Lydian}\p{Ol_Chiki}\p{Rejang}\p{Saurashtra}\p{Sundanese}\p{Vai}/utf
+    \x{102A4}\x{AA52}\x{A91D}\x{1C46}\x{10283}\x{1092E}\x{1C6B}\x{A93B}\x{A8BF}\x{1BA0}\x{A50A}====
+
+/\x{a77d}\x{1d79}/i,utf
+    \x{a77d}\x{1d79}
+    \x{1d79}\x{a77d}
+
+/\x{a77d}\x{1d79}/utf
+    \x{a77d}\x{1d79}
+\= Expect no match
+    \x{1d79}\x{a77d}
+
+/^\p{Xan}/utf
+    ABCD
+    1234
+    \x{6ca}
+    \x{a6c}
+    \x{10a7}
+\= Expect no match
+    _ABC
+
+/^\p{Xan}+/utf
+    ABCD1234\x{6ca}\x{a6c}\x{10a7}_
+\= Expect no match
+    _ABC
+
+/^\p{Xan}*/utf
+    ABCD1234\x{6ca}\x{a6c}\x{10a7}_
+    
+/^\p{Xan}{2,9}/utf
+    ABCD1234\x{6ca}\x{a6c}\x{10a7}_
+    
+/^[\p{Xan}]/utf
+    ABCD1234_
+    1234abcd_
+    \x{6ca}
+    \x{a6c}
+    \x{10a7}
+\= Expect no match
+    _ABC
+ 
+/^[\p{Xan}]+/utf
+    ABCD1234\x{6ca}\x{a6c}\x{10a7}_
+\= Expect no match
+    _ABC
+
+/^>\p{Xsp}/utf
+    >\x{1680}\x{2028}\x{0b}
+\= Expect no match
+    \x{0b}
+
+/^>\p{Xsp}+/utf,no_auto_possess
+    > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b}
+
+/^>\p{Xsp}*/utf,no_auto_possess
+    > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b}
+    
+/^>\p{Xsp}{2,9}/utf,no_auto_possess
+    > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b}
+    
+/^>[\p{Xsp}]/utf,no_auto_possess
+    >\x{2028}\x{0b}
+ 
+/^>[\p{Xsp}]+/utf,no_auto_possess
+    > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b}
+
+/^>\p{Xps}/utf
+    >\x{1680}\x{2028}\x{0b}
+    >\x{a0}
+\= Expect no match
+    \x{0b}
+
+/^>\p{Xps}+/utf
+    > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b}
+
+/^>\p{Xps}+?/utf
+    >\x{1680}\x{2028}\x{0b}
+
+/^>\p{Xps}*/utf
+    > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b}
+    
+/^>\p{Xps}{2,9}/utf
+    > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b}
+    
+/^>\p{Xps}{2,9}?/utf
+    > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b}
+    
+/^>[\p{Xps}]/utf
+    >\x{2028}\x{0b}
+ 
+/^>[\p{Xps}]+/utf
+    > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b}
+
+/^\p{Xwd}/utf
+    ABCD
+    1234
+    \x{6ca}
+    \x{a6c}
+    \x{10a7}
+    _ABC
+\= Expect no match
+    []
+
+/^\p{Xwd}+/utf
+    ABCD1234\x{6ca}\x{a6c}\x{10a7}_
+
+/^\p{Xwd}*/utf
+    ABCD1234\x{6ca}\x{a6c}\x{10a7}_
+    
+/^\p{Xwd}{2,9}/utf
+    A_12\x{6ca}\x{a6c}\x{10a7}
+    
+/^[\p{Xwd}]/utf
+    ABCD1234_
+    1234abcd_
+    \x{6ca}
+    \x{a6c}
+    \x{10a7}
+    _ABC
+\= Expect no match
+    []
+ 
+/^[\p{Xwd}]+/utf
+    ABCD1234\x{6ca}\x{a6c}\x{10a7}_
+
+# Unicode properties for \b abd \B 
+
+/\b...\B/utf,ucp
+    abc_
+    \x{37e}abc\x{376}
+    \x{37e}\x{376}\x{371}\x{393}\x{394}
+    !\x{c0}++\x{c1}\x{c2}
+    !\x{c0}+++++
+
+# Without PCRE_UCP, non-ASCII always fail, even if < 256  
+
+/\b...\B/utf
+    abc_
+\= Expect no match
+    \x{37e}abc\x{376}
+    \x{37e}\x{376}\x{371}\x{393}\x{394}
+    !\x{c0}++\x{c1}\x{c2}
+    !\x{c0}+++++
+
+# With PCRE_UCP, non-UTF8 chars that are < 256 still check properties  
+
+/\b...\B/ucp
+    abc_
+    !\x{c0}++\x{c1}\x{c2}
+    !\x{c0}+++++
+    
+# Caseless single negated characters > 127 need UCP support 
+
+/[^\x{100}]/i,utf
+    \x{100}\x{101}X
+
+/[^\x{100}]+/i,utf
+    \x{100}\x{101}XX
+
+/^\X/utf
+    A\=ps
+    A\=ph
+    A\x{300}\x{301}\=ps
+    A\x{300}\x{301}\=ph
+    A\x{301}\=ps
+    A\x{301}\=ph
+    
+/^\X{2,3}/utf
+    A\=ps
+    A\=ph
+    AA\=ps
+    AA\=ph
+    A\x{300}\x{301}\=ps
+    A\x{300}\x{301}\=ph
+    A\x{300}\x{301}A\x{300}\x{301}\=ps
+    A\x{300}\x{301}A\x{300}\x{301}\=ph
+
+/^\X{2}/utf
+    AA\=ps
+    AA\=ph
+    A\x{300}\x{301}A\x{300}\x{301}\=ps
+    A\x{300}\x{301}A\x{300}\x{301}\=ph
+    
+/^\X+/utf
+    AA\=ps
+    AA\=ph
+
+/^\X+?Z/utf
+    AA\=ps
+    AA\=ph
+
+# These are tests for extended grapheme clusters  
+
+/^\X/utf,aftertext
+    G\x{34e}\x{34e}X
+    \x{34e}\x{34e}X
+    \x04X
+    \x{1100}X
+    \x{1100}\x{34e}X
+    \x{1b04}\x{1b04}X
+\= These match up to the roman letters
+    \x{1111}\x{1111}L,L
+    \x{1111}\x{1111}\x{1169}L,L,V
+    \x{1111}\x{ae4c}L, LV
+    \x{1111}\x{ad89}L, LVT
+    \x{1111}\x{ae4c}\x{1169}L, LV, V
+    \x{1111}\x{ae4c}\x{1169}\x{1169}L, LV, V, V
+    \x{1111}\x{ae4c}\x{1169}\x{11fe}L, LV, V, T
+    \x{1111}\x{ad89}\x{11fe}L, LVT, T
+    \x{1111}\x{ad89}\x{11fe}\x{11fe}L, LVT, T, T
+    \x{ad89}\x{11fe}\x{11fe}LVT, T, T
+\= These match just the first codepoint (invalid sequence)
+    \x{1111}\x{11fe}L, T
+    \x{ae4c}\x{1111}LV, L
+    \x{ae4c}\x{ae4c}LV, LV
+    \x{ae4c}\x{ad89}LV, LVT
+    \x{1169}\x{1111}V, L
+    \x{1169}\x{ae4c}V, LV
+    \x{1169}\x{ad89}V, LVT
+    \x{ad89}\x{1111}LVT, L
+    \x{ad89}\x{1169}LVT, V
+    \x{ad89}\x{ae4c}LVT, LV
+    \x{ad89}\x{ad89}LVT, LVT
+    \x{11fe}\x{1111}T, L
+    \x{11fe}\x{1169}T, V
+    \x{11fe}\x{ae4c}T, LV
+    \x{11fe}\x{ad89}T, LVT
+\= Test extend and spacing mark
+    \x{1111}\x{ae4c}\x{0711}L, LV, extend
+    \x{1111}\x{ae4c}\x{1b04}L, LV, spacing mark
+    \x{1111}\x{ae4c}\x{1b04}\x{0711}\x{1b04}L, LV, spacing mark, extend, spacing mark
+\= Test CR, LF, and control
+    \x0d\x{0711}CR, extend
+    \x0d\x{1b04}CR, spacingmark
+    \x0a\x{0711}LF, extend
+    \x0a\x{1b04}LF, spacingmark
+    \x0b\x{0711}Control, extend
+    \x09\x{1b04}Control, spacingmark
+\= There are no Prepend characters, so we can't test Prepend, CR
+    
+/^(?>\X{2})X/utf,aftertext
+    \x{1111}\x{ae4c}\x{1111}\x{ae4c}X
+    
+/^\X{2,4}X/utf,aftertext
+    \x{1111}\x{ae4c}\x{1111}\x{ae4c}X
+    \x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}X
+    \x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}X
+
+/^\X{2,4}?X/utf,aftertext
+    \x{1111}\x{ae4c}\x{1111}\x{ae4c}X
+    \x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}X
+    \x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}X
+
+/\x{1e9e}+/i,utf
+    \x{1e9e}\x{00df}
+
+/[z\x{1e9e}]+/i,utf
+    \x{1e9e}\x{00df}
+
+/\x{00df}+/i,utf
+    \x{1e9e}\x{00df}
+
+/[z\x{00df}]+/i,utf
+    \x{1e9e}\x{00df}
+
+/\x{1f88}+/i,utf
+    \x{1f88}\x{1f80}
+
+/[z\x{1f88}]+/i,utf
+    \x{1f88}\x{1f80}
+
+# Perl matches these 
+
+/\x{00b5}+/i,utf
+    \x{00b5}\x{039c}\x{03bc}
+
+/\x{039c}+/i,utf
+    \x{00b5}\x{039c}\x{03bc}
+
+/\x{03bc}+/i,utf
+    \x{00b5}\x{039c}\x{03bc}
+
+
+/\x{00c5}+/i,utf
+    \x{00c5}\x{00e5}\x{212b}
+
+/\x{00e5}+/i,utf
+    \x{00c5}\x{00e5}\x{212b}
+
+/\x{212b}+/i,utf
+    \x{00c5}\x{00e5}\x{212b}
+
+/\x{01c4}+/i,utf
+    \x{01c4}\x{01c5}\x{01c6}
+
+/\x{01c5}+/i,utf
+    \x{01c4}\x{01c5}\x{01c6}
+
+/\x{01c6}+/i,utf
+    \x{01c4}\x{01c5}\x{01c6}
+
+/\x{01c7}+/i,utf
+    \x{01c7}\x{01c8}\x{01c9}
+
+/\x{01c8}+/i,utf
+    \x{01c7}\x{01c8}\x{01c9}
+
+/\x{01c9}+/i,utf
+    \x{01c7}\x{01c8}\x{01c9}
+
+
+/\x{01ca}+/i,utf
+    \x{01ca}\x{01cb}\x{01cc}
+
+/\x{01cb}+/i,utf
+    \x{01ca}\x{01cb}\x{01cc}
+
+/\x{01cc}+/i,utf
+    \x{01ca}\x{01cb}\x{01cc}
+
+/\x{01f1}+/i,utf
+    \x{01f1}\x{01f2}\x{01f3}
+
+/\x{01f2}+/i,utf
+    \x{01f1}\x{01f2}\x{01f3}
+
+/\x{01f3}+/i,utf
+    \x{01f1}\x{01f2}\x{01f3}
+
+/\x{0345}+/i,utf
+    \x{0345}\x{0399}\x{03b9}\x{1fbe}
+
+/\x{0399}+/i,utf
+    \x{0345}\x{0399}\x{03b9}\x{1fbe}
+
+/\x{03b9}+/i,utf
+    \x{0345}\x{0399}\x{03b9}\x{1fbe}
+
+/\x{1fbe}+/i,utf
+    \x{0345}\x{0399}\x{03b9}\x{1fbe}
+
+/\x{0392}+/i,utf
+    \x{0392}\x{03b2}\x{03d0}
+
+/\x{03b2}+/i,utf
+    \x{0392}\x{03b2}\x{03d0}
+
+/\x{03d0}+/i,utf
+    \x{0392}\x{03b2}\x{03d0}
+    
+
+/\x{0395}+/i,utf
+    \x{0395}\x{03b5}\x{03f5}
+
+/\x{03b5}+/i,utf
+    \x{0395}\x{03b5}\x{03f5}
+
+/\x{03f5}+/i,utf
+    \x{0395}\x{03b5}\x{03f5}
+
+/\x{0398}+/i,utf
+    \x{0398}\x{03b8}\x{03d1}\x{03f4}
+
+/\x{03b8}+/i,utf
+    \x{0398}\x{03b8}\x{03d1}\x{03f4}
+
+/\x{03d1}+/i,utf
+    \x{0398}\x{03b8}\x{03d1}\x{03f4}
+
+/\x{03f4}+/i,utf
+    \x{0398}\x{03b8}\x{03d1}\x{03f4}
+
+/\x{039a}+/i,utf
+    \x{039a}\x{03ba}\x{03f0}
+
+/\x{03ba}+/i,utf
+    \x{039a}\x{03ba}\x{03f0}
+
+/\x{03f0}+/i,utf
+    \x{039a}\x{03ba}\x{03f0}
+    
+/\x{03a0}+/i,utf
+    \x{03a0}\x{03c0}\x{03d6}
+
+/\x{03c0}+/i,utf
+    \x{03a0}\x{03c0}\x{03d6}
+
+/\x{03d6}+/i,utf
+    \x{03a0}\x{03c0}\x{03d6}
+
+/\x{03a1}+/i,utf
+    \x{03a1}\x{03c1}\x{03f1}
+
+/\x{03c1}+/i,utf
+    \x{03a1}\x{03c1}\x{03f1}
+
+/\x{03f1}+/i,utf
+    \x{03a1}\x{03c1}\x{03f1}
+
+/\x{03a3}+/i,utf
+    \x{03A3}\x{03C2}\x{03C3}
+
+/\x{03c2}+/i,utf
+    \x{03A3}\x{03C2}\x{03C3}
+
+/\x{03c3}+/i,utf
+    \x{03A3}\x{03C2}\x{03C3}
+
+/\x{03a6}+/i,utf
+    \x{03a6}\x{03c6}\x{03d5}
+
+/\x{03c6}+/i,utf
+    \x{03a6}\x{03c6}\x{03d5}
+
+/\x{03d5}+/i,utf
+    \x{03a6}\x{03c6}\x{03d5}
+
+/\x{03c9}+/i,utf
+    \x{03c9}\x{03a9}\x{2126}
+
+/\x{03a9}+/i,utf
+    \x{03c9}\x{03a9}\x{2126}
+
+/\x{2126}+/i,utf
+    \x{03c9}\x{03a9}\x{2126}
+    
+/\x{1e60}+/i,utf
+    \x{1e60}\x{1e61}\x{1e9b}
+
+/\x{1e61}+/i,utf
+    \x{1e60}\x{1e61}\x{1e9b}
+
+/\x{1e9b}+/i,utf
+    \x{1e60}\x{1e61}\x{1e9b}
+    
+/\x{1e9e}+/i,utf
+    \x{1e9e}\x{00df}
+
+/\x{00df}+/i,utf
+    \x{1e9e}\x{00df}
+    
+/\x{1f88}+/i,utf
+    \x{1f88}\x{1f80}
+
+/\x{1f80}+/i,utf
+    \x{1f88}\x{1f80}
+
+/\x{004b}+/i,utf
+    \x{004b}\x{006b}\x{212a}
+
+/\x{006b}+/i,utf
+    \x{004b}\x{006b}\x{212a}
+
+/\x{212a}+/i,utf
+    \x{004b}\x{006b}\x{212a}
+
+/\x{0053}+/i,utf
+    \x{0053}\x{0073}\x{017f}
+
+/\x{0073}+/i,utf
+    \x{0053}\x{0073}\x{017f}
+
+/\x{017f}+/i,utf
+    \x{0053}\x{0073}\x{017f}
+
+/ist/i,utf
+\= Expect no match
+    ikt
+
+/is+t/i,utf
+    iSs\x{17f}t
+\= Expect no match
+    ikt
+
+/is+?t/i,utf
+\= Expect no match
+    ikt
+
+/is?t/i,utf
+\= Expect no match
+    ikt
+
+/is{2}t/i,utf
+\= Expect no match
+    iskt
+
+/^\p{Xuc}/utf
+    $abc
+    @abc
+    `abc
+    \x{1234}abc
+\= Expect no match
+    abc
+
+/^\p{Xuc}+/utf
+    $@`\x{a0}\x{1234}\x{e000}**
+\= Expect no match
+    \x{9f}
+
+/^\p{Xuc}+?/utf
+    $@`\x{a0}\x{1234}\x{e000}**
+\= Expect no match
+    \x{9f}
+
+/^\p{Xuc}+?\*/utf
+    $@`\x{a0}\x{1234}\x{e000}**
+\= Expect no match
+    \x{9f}
+
+/^\p{Xuc}++/utf
+    $@`\x{a0}\x{1234}\x{e000}**
+\= Expect no match
+    \x{9f}
+
+/^\p{Xuc}{3,5}/utf
+    $@`\x{a0}\x{1234}\x{e000}**
+\= Expect no match
+    \x{9f}
+
+/^\p{Xuc}{3,5}?/utf
+    $@`\x{a0}\x{1234}\x{e000}**
+\= Expect no match
+    \x{9f}
+
+/^[\p{Xuc}]/utf
+    $@`\x{a0}\x{1234}\x{e000}**
+\= Expect no match
+    \x{9f}
+
+/^[\p{Xuc}]+/utf
+    $@`\x{a0}\x{1234}\x{e000}**
+\= Expect no match
+    \x{9f}
+
+/^\P{Xuc}/utf
+    abc
+\= Expect no match
+    $abc
+    @abc
+    `abc
+    \x{1234}abc
+
+/^[\P{Xuc}]/utf
+    abc
+\= Expect no match
+    $abc
+    @abc
+    `abc
+    \x{1234}abc
+
+/^A\s+Z/utf,ucp
+    A\x{2005}Z
+    A\x{85}\x{180e}\x{2005}Z
+
+/^A[\s]+Z/utf,ucp
+    A\x{2005}Z
+    A\x{85}\x{180e}\x{2005}Z
+
+/(?<=\x{100})\x{200}(?=\x{300})/utf,allusedtext
+    \x{100}\x{200}\x{300}
+
+# End of testinput7
diff --git a/dist2/testdata/testinput8 b/dist2/testdata/testinput8
new file mode 100644
index 0000000..ca3b1b9
--- /dev/null
+++ b/dist2/testdata/testinput8
@@ -0,0 +1,185 @@
+# There are two sorts of patterns in this test. A number of them are
+# representative patterns whose lengths and offsets are checked. This is just a
+# doublecheck test to ensure the sizes don't go horribly wrong when something
+# is changed. The operation of these patterns is checked in other tests.
+#
+# This file also contains tests whose output varies with code unit size and/or
+# link size. Unicode support is required for these tests. There are separate
+# output files for each code unit size and link size.
+
+#pattern fullbincode,memory
+
+/((?i)b)/
+
+/(?s)(.*X|^B)/
+
+/(?s:.*X|^B)/
+
+/^[[:alnum:]]/
+
+/#/Ix
+
+/a#/Ix
+
+/x?+/
+
+/x++/
+
+/x{1,3}+/
+
+/(x)*+/
+
+/^((a+)(?U)([ab]+)(?-U)([bc]+)(\w*))/
+
+"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"
+
+"\$\<\.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"
+
+/(a(?1)b)/
+
+/(a(?1)+b)/
+
+/a(?P<name1>b|c)d(?P<longername2>e)/
+
+/(?:a(?P<c>c(?P<d>d)))(?P<a>a)/
+
+/(?P<a>a)...(?P=a)bbb(?P>a)d/
+
+/abc(?C255)de(?C)f/
+
+/abcde/auto_callout
+
+/\x{100}/utf
+
+/\x{1000}/utf
+
+/\x{10000}/utf
+
+/\x{100000}/utf
+
+/\x{10ffff}/utf
+
+/\x{110000}/utf
+
+/[\x{ff}]/utf
+
+/[\x{100}]/utf
+
+/\x80/utf
+
+/\xff/utf
+
+/\x{0041}\x{2262}\x{0391}\x{002e}/I,utf
+
+/\x{D55c}\x{ad6d}\x{C5B4}/I,utf
+
+/\x{65e5}\x{672c}\x{8a9e}/I,utf
+
+/[\x{100}]/utf
+
+/[Z\x{100}]/utf
+
+/^[\x{100}\E-\Q\E\x{150}]/utf
+
+/^[\QĀ\E-\QŐ\E]/utf
+
+/^[\QĀ\E-\QŐ\E/utf
+
+/[\p{L}]/
+
+/[\p{^L}]/
+
+/[\P{L}]/
+
+/[\P{^L}]/
+
+/[abc\p{L}\x{0660}]/utf
+
+/[\p{Nd}]/utf
+
+/[\p{Nd}+-]+/utf
+
+/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/i,utf
+
+/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/utf
+
+/[\x{105}-\x{109}]/i,utf
+
+/( ( (?(1)0|) )*   )/x
+
+/(  (?(1)0|)*   )/x
+
+/[a]/
+
+/[a]/utf
+
+/[\xaa]/
+
+/[\xaa]/utf
+
+/[^a]/
+
+/[^a]/utf
+
+/[^\xaa]/
+
+/[^\xaa]/utf
+
+#pattern -memory
+
+/[^\d]/utf,ucp
+
+/[[:^alpha:][:^cntrl:]]+/utf,ucp
+
+/[[:^cntrl:][:^alpha:]]+/utf,ucp
+
+/[[:alpha:]]+/utf,ucp
+
+/[[:^alpha:]\S]+/utf,ucp
+
+/abc(d|e)(*THEN)x(123(*THEN)4|567(b|q)(*THEN)xx)/
+
+/(((a\2)|(a*)\g<-1>))*a?/
+
+/((?+1)(\1))/
+
+"(?1)(?#?'){2}(a)"
+
+/.((?2)(?R)|\1|$)()/
+
+/.((?3)(?R)()(?2)|\1|$)()/
+
+/(?1)()((((((\1++))\x85)+)|))/
+
+# Check the absolute limit on nesting (?| etc. This varies with code unit
+# width because the workspace is a different number of bytes. It will fail
+# with link size 2 in 8-bit and 16-bit but not in 32-bit.
+
+/(?|(?|(?J:(?|(?x:(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|
+)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
+/parens_nest_limit=1000,-fullbincode
+
+# Use "expand" to create some very long patterns with nested parentheses, in
+# order to test workspace overflow. Again, this varies with code unit width,
+# and even with it fails in two modes, the error offset differs. It also varies
+# with link size - hence multiple tests with different values.
+
+/(?'ABC'\[[bar](]{105}*THEN:\[A]{255}\[)]{106}/expand,-fullbincode
+
+/(?'ABC'\[[bar](]{106}*THEN:\[A]{255}\[)]{107}/expand,-fullbincode
+
+/(?'ABC'\[[bar](]{159}*THEN:\[A]{255}\[)]{160}/expand,-fullbincode
+
+/(?'ABC'\[[bar](]{199}*THEN:\[A]{255}\[)]{200}/expand,-fullbincode
+
+/(?'ABC'\[[bar](]{299}*THEN:\[A]{255}\[)]{300}/expand,-fullbincode
+
+/(?(1)(?1)){8,}+()/debug
+    abcd
+
+/(?(1)|a(?1)b){2,}+()/debug
+    abcde
+
+/((?1)(?2)(?3)(?4)(?5)(?6)(?7)(?8)(?9)(?9)(?8)(?7)(?6)(?5)(?4)(?3)(?2)(?1)(?0)){2,}()()()()()()()()()/debug
+
+# End of testinput8
diff --git a/dist/testdata/testinput14 b/dist2/testdata/testinput9
similarity index 79%
rename from dist/testdata/testinput14
rename to dist2/testdata/testinput9
index 192b8d6..9a26f5f 100644
--- a/dist/testdata/testinput14
+++ b/dist2/testdata/testinput9
@@ -1,94 +1,13 @@
-/-- This set of tests is run only with the 8-bit library. They do not require 
-    UTF-8 or Unicode property support. The file starts with all the tests of
-    the POSIX interface, because that is supported only with the 8-bit library.
-    --/
+# This set of tests is run only with the 8-bit library. They must not require 
+# UTF-8 or Unicode property support. */
     
-< forbid 8W 
+#forbid_utf
+#newline_default lf any anycrlf
 
-/abc/P
-    abc
-    *** Failers
-
-/^abc|def/P
-    abcdef
-    abcdef\B
-
-/.*((abc)$|(def))/P
-    defabc
-    \Zdefabc
-
-/the quick brown fox/P
-    the quick brown fox
-    *** Failers
-    The Quick Brown Fox
-
-/the quick brown fox/Pi
-    the quick brown fox
-    The Quick Brown Fox
-
-/abc.def/P
-    *** Failers
-    abc\ndef
-
-/abc$/P
-    abc
-    abc\n
-
-/(abc)\2/P
-
-/(abc\1)/P
-    abc
-
-/a*(b+)(z)(z)/P
-    aaaabbbbzzzz
-    aaaabbbbzzzz\O0
-    aaaabbbbzzzz\O1
-    aaaabbbbzzzz\O2
-    aaaabbbbzzzz\O3
-    aaaabbbbzzzz\O4
-    aaaabbbbzzzz\O5
-
-/ab.cd/P
-    ab-cd
-    ab=cd
-    ** Failers
-    ab\ncd
-
-/ab.cd/Ps
-    ab-cd
-    ab=cd
-    ab\ncd
-
-/a(b)c/PN
-    abc
-
-/a(?P<name>b)c/PN
-    abc
-
-/a?|b?/P
-    abc
-    ** Failers
-    ddd\N   
-
-/\w+A/P
-   CDAAAAB 
-
-/\w+A/PU
-   CDAAAAB 
-   
-/\Biss\B/I+P
-    Mississippi
-
-/abc/\P
-
-/-- End of POSIX tests --/ 
-
-/a\Cb/
-    aXb
-    a\nb
-    ** Failers (too big char) 
-    A\x{123}B 
-    A\o{443}B 
+/ab/
+\= Expect error message (too big char) and no match
+    A\x{123}B
+    A\o{443}B
   
 /\x{100}/I
 
@@ -287,59 +206,56 @@
 )  (?: [\040\t] |  \(
 (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
 \)  )*                       # optional trailing comment
-/xSI
+/Ix
 
-/-- Although this saved pattern was compiled with link-size=2, it does no harm
-to run this test with other link sizes because it is going to generated a
-"compiled in wrong mode" error as soon as it is loaded, so the link size does 
-not matter. --/
+/\h/I
 
-<!testsaved16
+/\H/I
 
-<!testsaved32
+/\v/I
 
-/\h/SI
+/\V/I
 
-/\H/SI
+/\R/I
 
-/\v/SI
-
-/\V/SI
-
-/\R/SI
-
-/[\h]/BZ
+/[\h]/B
     >\x09<
 
-/[\h]+/BZ
+/[\h]+/B
     >\x09\x20\xa0<
 
-/[\v]/BZ
+/[\v]/B
 
-/[\H]/BZ
+/[\H]/B
 
-/[^\h]/BZ
+/[^\h]/B
 
-/[\V]/BZ
+/[\V]/B
 
-/[\x0a\V]/BZ
+/[\x0a\V]/B
 
 /\777/I
 
-/(*:0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF)XX/K
+/(*:0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF)XX/mark
     XX
      
-/(*:0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDE)XX/K
+/(*:0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF)XX/mark,alt_verbnames
+    XX
+     
+/(*:0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDE)XX/mark
     XX
 
-/\u0100/<JS>
+/(*:0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDE)XX/mark,alt_verbnames
+    XX
 
-/[\u0100-\u0200]/<JS>
+/\u0100/alt_bsux,allow_empty_class,match_unset_backref,dupnames
 
-/[^\x00-a]{12,}[^b-\xff]*/BZ
+/[\u0100-\u0200]/alt_bsux,allow_empty_class,match_unset_backref,dupnames
 
-/[^\s]*\s* [^\W]+\W+ [^\d]*?\d0 [^\d\w]{4,6}?\w*A/BZ
+/[^\x00-a]{12,}[^b-\xff]*/B
 
-/(?'ABC'[bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar](*THEN:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))/
+/[^\s]*\s* [^\W]+\W+ [^\d]*?\d0 [^\d\w]{4,6}?\w*A/B
 
-/-- End of testinput14 --/
+/(*MARK:a\x{100}b)z/alt_verbnames 
+
+# End of testinput9
diff --git a/dist2/testdata/testinputEBC b/dist2/testdata/testinputEBC
new file mode 100644
index 0000000..36df20b
--- /dev/null
+++ b/dist2/testdata/testinputEBC
@@ -0,0 +1,137 @@
+# This is a specialized test for checking, when PCRE2 is compiled with the
+# EBCDIC option but in an ASCII environment, that newline, white space, and \c
+# functionality is working. It catches cases where explicit values such as 0x0a
+# have been used instead of names like CHAR_LF. Needless to say, it is not a
+# genuine EBCDIC test! In patterns, alphabetic characters that follow a
+# backslash must be in EBCDIC code. In data, NL, NEL, LF, ESC, and DEL must be
+# in EBCDIC, but can of course be specified as escapes.
+
+# Test default newline and variations
+
+/^A/m
+    ABC
+    12\x15ABC
+
+/^A/m,newline=any
+    12\x15ABC
+    12\x0dABC
+    12\x0d\x15ABC
+    12\x25ABC
+
+/^A/m,newline=anycrlf
+    12\x15ABC
+    12\x0dABC
+    12\x0d\x15ABC
+    ** Fail
+    12\x25ABC
+
+# Test \h
+
+/^A\ˆ/
+    A B
+    A\x41B 
+
+# Test \H
+
+/^A\È/
+    AB
+    A\x42B 
+    ** Fail
+    A B
+    A\x41B 
+
+# Test \R
+
+/^A\Ù/
+    A\x15B
+    A\x0dB
+    A\x25B
+    A\x0bB
+    A\x0cB
+    ** Fail
+    A B
+
+# Test \v
+
+/^A\¥/
+    A\x15B
+    A\x0dB
+    A\x25B
+    A\x0bB
+    A\x0cB
+    ** Fail
+    A B
+
+# Test \V
+
+/^A\å/
+    A B
+    ** Fail
+    A\x15B
+    A\x0dB
+    A\x25B
+    A\x0bB
+    A\x0cB
+    
+# For repeated items, use an atomic group so that the output is the same
+# for DFA matching (otherwise it may show multiple matches).
+
+# Test \h+
+
+/^A(?>\ˆ+)/
+    A B
+
+# Test \H+
+
+/^A(?>\È+)/
+    AB
+    ** Fail
+    A B
+
+# Test \R+
+
+/^A(?>\Ù+)/
+    A\x15B
+    A\x0dB
+    A\x25B
+    A\x0bB
+    A\x0cB
+    ** Fail
+    A B
+
+# Test \v+
+
+/^A(?>\¥+)/
+    A\x15B
+    A\x0dB
+    A\x25B
+    A\x0bB
+    A\x0cB
+    ** Fail
+    A B
+
+# Test \V+
+
+/^A(?>\å+)/
+    A B
+    ** Fail
+    A\x15B
+    A\x0dB
+    A\x25B
+    A\x0bB
+    A\x0cB
+    
+# Test \c functionality 
+    
+/\ƒ@\ƒ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/
+    \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
+
+/\ƒ[\ƒ\\ƒ]\ƒ^\ƒ_/
+    \x18\x19\x1a\x1b\x1c\x1d\x1e\x1f
+    
+/\ƒ?/
+    A\xffB
+
+/\ƒ&/
+
+# End
diff --git a/dist/testdata/testoutput1 b/dist2/testdata/testoutput1
similarity index 88%
rename from dist/testdata/testoutput1
rename to dist2/testdata/testoutput1
index e852ab9..d28bf91 100644
--- a/dist/testdata/testoutput1
+++ b/dist2/testdata/testoutput1
@@ -1,16 +1,19 @@
-/-- This set of tests is for features that are compatible with all versions of
-    Perl >= 5.10, in non-UTF-8 mode. It should run clean for the 8-bit, 16-bit,
-    and 32-bit PCRE libraries. --/
+# This set of tests is for features that are compatible with all versions of
+# Perl >= 5.10, in non-UTF mode. It should run clean for the 8-bit, 16-bit, and
+# 32-bit PCRE libraries, and also using the perltest.pl script.
     
-< forbid 89?=ABCDEFfGILMNPTUWXZ<
+#forbid_utf
+#newline_default lf any anycrlf
+#perltest
 
 /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
+\= Expect no match
+    The quick brown FOX
+No match
     What do you know about THE QUICK BROWN FOX?
 No match
 
@@ -89,8 +92,7 @@
  0: aaaabxyzpqrrrabbxyyyypqAzz
     >>>>abcxyzpqrrrabbxyyyypqAzz
  0: abcxyzpqrrrabbxyyyypqAzz
-    *** Failers
-No match
+\= Expect no match
     abxyzpqrrabbxyyyypqAzz
 No match
     abxyzpqrrrrabbxyyyypqAzz
@@ -111,8 +113,7 @@
     abcabczz
  0: abcabczz
  1: abc
-    *** Failers
-No match
+\= Expect no match
     zz
 No match
     abcabcabczz
@@ -145,8 +146,7 @@
     bbbbbbbbbbbac
  0: bbbbbbbbbbbac
  1: a
-    *** Failers
-No match
+\= Expect no match
     aaac
 No match
     abbbbbbbbbbbac
@@ -177,8 +177,7 @@
     bbbbbbbbbbbac
  0: bbbbbbbbbbbac
  1: a
-    *** Failers
-No match
+\= Expect no match
     aaac
 No match
     abbbbbbbbbbbac
@@ -199,8 +198,7 @@
     bababc
  0: bababc
  1: ba
-    *** Failers
-No match
+\= Expect no match
     bababbc
 No match
     babababc
@@ -216,8 +214,7 @@
     bababc
  0: bababc
  1: ba
-    *** Failers
-No match
+\= Expect no match
     bababbc
 No match
     babababc
@@ -240,8 +237,7 @@
  0: d
     ething
  0: e
-    *** Failers
-No match
+\= Expect no match
     fthing
 No match
     [thing
@@ -258,8 +254,7 @@
  0: d
     ething
  0: e
-    *** Failers
-No match
+\= Expect no match
     athing
 No match
     fthing
@@ -272,8 +267,7 @@
  0: [
     \\thing
  0: \
-    *** Failers
- 0: *
+\= Expect no match
     athing
 No match
     bthing
@@ -292,8 +286,7 @@
  0: a
     fthing
  0: f
-    *** Failers
- 0: *
+\= Expect no match
     ]thing
 No match
     cthing
@@ -336,8 +329,7 @@
  0: 10
     100
  0: 100
-    *** Failers
-No match
+\= Expect no match
     abc
 No match
 
@@ -354,46 +346,42 @@
  0: xxx0
     xxx1234
  0: xxx1234
-    *** Failers
-No match
+\= Expect no match
     xxx
 No match
 
 /^.+[0-9][0-9][0-9]$/
     x123
  0: x123
+    x1234
+ 0: x1234
     xx123
  0: xx123
     123456
  0: 123456
-    *** Failers
-No match
+\= Expect no match
     123
 No match
-    x1234
- 0: x1234
 
 /^.+?[0-9][0-9][0-9]$/
     x123
  0: x123
+    x1234
+ 0: x1234
     xx123
  0: xx123
     123456
  0: 123456
-    *** Failers
-No match
+\= Expect 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
  1: abc
  2: pqr
-    *** Failers
-No match
+\= Expect no match
     !pqr=apquxz.ixr.zzz.ac.uk
 No match
     abc!=apquxz.ixr.zzz.ac.uk
@@ -406,7 +394,8 @@
 /:/
     Well, we need a colon: somewhere
  0: :
-    *** Fail if we don't
+\= Expect no match
+    Fail without a colon
 No match
 
 /([\da-f:]+)$/i
@@ -434,8 +423,7 @@
     Any old stuff
  0: ff
  1: ff
-    *** Failers
-No match
+\= Expect no match
     0zzz
 No match
     gzzz
@@ -456,8 +444,7 @@
  1: 12
  2: 123
  3: 0
-    *** Failers
-No match
+\= Expect no match
     .1.2.3333
 No match
     1.2.3
@@ -476,8 +463,7 @@
  1: 1
  2: non-sp1
  3: non-sp2
-    *** Failers
-No match
+\= Expect no match
     1IN SOA non-sp1 non-sp2(
 No match
 
@@ -497,8 +483,7 @@
     x-.y-.
  0: x-.y-.
  1: .y-
-    *** Failers
-No match
+\= Expect no match
     -abc.peq.
 No match
 
@@ -517,8 +502,7 @@
  1: -a
  2: .b-c
  3: -c
-    *** Failers
-No match
+\= Expect no match
     *.0
 No match
     *.a-
@@ -569,22 +553,21 @@
     \"\" ; rhubarb
  0: "" ; rhubarb
  1: ; rhubarb
-    *** Failers
-No match
+\= Expect no match
     \"1234\" : things
 No match
 
 /^$/
     \
  0: 
-    *** Failers
+\= Expect no match
+    A non-empty line
 No match
 
 /   ^    a   (?# begins with a)  b\sc (?# then b c) $ (?# then end)/x
     ab c
  0: ab c
-    *** Failers
-No match
+\= Expect no match
     abc
 No match
     ab cde
@@ -593,8 +576,7 @@
 /(?x)   ^    a   (?# begins with a)  b\sc (?# then b c) $ (?# then end)/
     ab c
  0: ab c
-    *** Failers
-No match
+\= Expect no match
     abc
 No match
     ab cde
@@ -605,8 +587,7 @@
  0: a bcd
     a b d
  0: a b d
-    *** Failers
-No match
+\= Expect no match
     abcd
 No match
     ab d
@@ -715,8 +696,7 @@
  0: 12345678ab
     12345678__
  0: 12345678__
-    *** Failers
-No match
+\= Expect no match
     1234567
 No match
 
@@ -729,8 +709,7 @@
  0: 12345
     aaaaa
  0: aaaaa
-    *** Failers
-No match
+\= Expect no match
     123456
 No match
 
@@ -755,8 +734,7 @@
  0: def=defdefdef
  1: def
  2: def
-    *** Failers
-No match
+\= Expect no match
     abc=defdef
 No match
 
@@ -826,8 +804,7 @@
     From abcd  Mon Sep  1 12:33:02 1997
  0: From abcd  Mon Sep  1 12:33
  1: Sep  
-    *** Failers
-No match
+\= Expect no match
     From abcd  Sep 01 12:33:02 1997
 No match
 
@@ -864,8 +841,7 @@
     abc456
  0: abc
  1: abc
-    *** Failers
-No match
+\= Expect no match
     abc123
 No match
 
@@ -909,16 +885,14 @@
 /(?!^)abc/
     the abc
  0: abc
-    *** Failers
-No match
+\= Expect no match
     abc
 No match
 
 /(?=^)abc/
     abc
  0: abc
-    *** Failers
-No match
+\= Expect no match
     the abc
 No match
 
@@ -1150,8 +1124,7 @@
  0: "/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/"@x400-re.lay
     A missing angle <user\@some.where
  0: user@some.where
-    *** Failers
-No match
+\= Expect no match
     The quick brown fox
 No match
 
@@ -1751,8 +1724,7 @@
  0: "/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/"@x400-re.lay
     A missing angle <user\@some.where
  0: user@some.where
-    *** Failers
-No match
+\= Expect no match
     The quick brown fox
 No match
 
@@ -1785,8 +1757,7 @@
  0: A\x00\x00Z
     An A\0\x0\0Z
  0: A\x00\x00\x00Z
-    *** Failers
-No match
+\= Expect no match
     A\0Z
 No match
     A\0\x0\0\x0Z
@@ -1801,8 +1772,7 @@
  0: bell
  1: 
  2: bell
-    *** Failers
-No match
+\= Expect no match
     cowbell
 No match
 
@@ -1817,8 +1787,7 @@
  0: \x0d
     \tabc
  0: \x09
-    *** Failers
-No match
+\= Expect no match
     abc
 No match
 
@@ -1837,8 +1806,7 @@
     b
  0: b
  1: 
-    *** Failers
-No match
+\= Expect no match
     acb
 No match
 
@@ -1852,8 +1820,7 @@
     b
  0: b
  1: 
-    *** Failers
-No match
+\= Expect no match
     ab
 No match
 
@@ -1867,8 +1834,7 @@
     b
  0: b
  1: 
-    *** Failers
-No match
+\= Expect no match
     acb
 No match
 
@@ -1879,8 +1845,7 @@
     b
  0: b
  1: 
-    *** Failers
-No match
+\= Expect no match
     ab
 No match
     aab
@@ -1898,8 +1863,7 @@
     b
  0: b
  1: 
-    *** Failers
-No match
+\= Expect no match
     ab
 No match
     aab
@@ -1914,8 +1878,7 @@
  0: abbbc
     abbc
  0: abbc
-    *** Failers
-No match
+\= Expect no match
     abc
 No match
     abbbbbc
@@ -1945,8 +1908,7 @@
 /^[W-c]+$/
     WXY_^abc
  0: WXY_^abc
-    *** Failers
-No match
+\= Expect no match
     wxy
 No match
 
@@ -1975,8 +1937,7 @@
 /^abc$/
     abc
  0: abc
-    *** Failers
-No match
+\= Expect no match
     qqq\nabc
 No match
     abc\nzzz
@@ -1989,8 +1950,7 @@
  0: abc
     abc\n 
  0: abc
-    *** Failers
-No match
+\= Expect no match
     qqq\nabc
 No match
     abc\nzzz
@@ -2004,9 +1964,7 @@
  1: f
 
 /\A(.)*\Z/m
-    *** Failers
- 0: *** Failers
- 1: s
+\= Expect no match
     abc\ndef
 No match
 
@@ -2019,24 +1977,21 @@
 /[-az]+/
     az-
  0: az-
-    *** Failers
- 0: a
+\= Expect no match
     b
 No match
 
 /[az-]+/
     za-
  0: za-
-    *** Failers
- 0: a
+\= Expect no match
     b
 No match
 
 /[a\-z]+/
     a-z
  0: a-z
-    *** Failers
- 0: a
+\= Expect no match
     b
 No match
 
@@ -2047,16 +2002,14 @@
 /[\d-]+/
     12-34
  0: 12-34
-    *** Failers
-No match
+\= Expect no match
     aaa
 No match
 
 /[\d-z]+/
     12-34z
  0: 12-34z
-    *** Failers
-No match
+\= Expect no match
     aaa
 No match
 
@@ -2067,8 +2020,7 @@
 /\x20Z/
     the Zoo
  0:  Z
-    *** Failers
-No match
+\= Expect no match
     Zulu
 No match
 
@@ -2083,29 +2035,12 @@
  0: abcABC
  1: abc
 
-/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
-
 /abc$/
     abc
  0: abc
     abc\n
  0: abc
-    *** Failers
-No match
+\= Expect no match
     abc\ndef
 No match
 
@@ -2152,14 +2087,6 @@
  0: abc@0
  1: abc
     
-/^A\8B\9C$/
-    A8B9C
- 0: A8B9C
-    *** Failers
-No match
-    A\08B\09C  
-No match
-    
 /^(A)(B)(C)(D)(E)(F)(G)(H)(I)\8\9$/
     ABCDEFGHIHI 
  0: ABCDEFGHIHI
@@ -2176,8 +2103,7 @@
 /^[A\8B\9C]+$/
     A8B9C
  0: A8B9C
-    *** Failers 
-No match
+\= Expect no match 
     A8B9C\x00
 No match
 
@@ -2212,10 +2138,6 @@
 10: j
 11: k
 
-/ab\idef/
-    abidef
- 0: abidef
-
 /a{0}bc/
     bc
  0: bc
@@ -2266,12 +2188,7 @@
  2: a
  3: 
  4: ccc
-    *** Failers
- 0: *** Failers
- 1: *
- 2: *
- 3: * Fail
- 4: ers
+\= Expect no match
     anything
 No match
     b\bc   
@@ -2302,8 +2219,7 @@
 /[^k]$/
     abc
  0: c
-    *** Failers
- 0: s
+\= Expect no match
     abk   
 No match
    
@@ -2314,8 +2230,7 @@
  0: bc
     kabc 
  0: abc
-    *** Failers
- 0: ers
+\= Expect no match
     abk
 No match
     akb
@@ -2328,8 +2243,7 @@
  0: 12345678@a.b.c.d
     123456789\@x.y.z
  0: 123456789@x.y.z
-    *** Failers
-No match
+\= Expect no match
     12345678\@x.y.uk
 No match
     1234567\@a.b.c.d       
@@ -2342,8 +2256,7 @@
     aaaaaaaaaa
  0: aaaaaaaaaa
  1: a
-    *** Failers
-No match
+\= Expect no match
     aaaaaaa   
 No match
 
@@ -2403,8 +2316,7 @@
  0: .875
  1: .875
  2: 5
-    *** Failers 
-No match
+\= Expect no match 
     1.235 
 No match
     
@@ -2423,7 +2335,7 @@
  0: food is under the bar in the bar
  1: d is under the bar in the 
     
-/foo(.*?)bar/  
+/foo(.*?)bar/
     The food is under the bar in the barn.
  0: food is under the bar
  1: d is under the 
@@ -2484,8 +2396,7 @@
     ABC445
  0: ABC
  1: ABC
-    *** Failers
-No match
+\= Expect no match
     ABC123
 No match
     
@@ -2494,8 +2405,7 @@
  0: W46]
     -46]789
  0: -46]
-    *** Failers
-No match
+\= Expect no match
     Wall
 No match
     Zebra
@@ -2524,8 +2434,7 @@
  0: ]
     \\backslash 
  0: \
-    *** Failers
-No match
+\= Expect no match
     -46]789
 No match
     well
@@ -2536,13 +2445,15 @@
  0: 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 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
+\= Expect no match
+    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
+\= Expect no match
+    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}/
@@ -2603,28 +2514,28 @@
  1: a
 
 /^(a){1,1}/
-    bcd
-No match
     abc
  0: a
  1: a
     aab  
  0: a
  1: a
-
-/^(a){1,2}/
+\= Expect no match
     bcd
 No match
+
+/^(a){1,2}/
     abc
  0: a
  1: a
     aab  
  0: aa
  1: a
-
-/^(a){1,3}/
+\= Expect no match
     bcd
 No match
+
+/^(a){1,3}/
     abc
  0: a
  1: a
@@ -2634,10 +2545,11 @@
     aaa   
  0: aaa
  1: a
-
-/^(a){1,}/
+\= Expect no match
     bcd
 No match
+
+/^(a){1,}/
     abc
  0: a
  1: a
@@ -2650,6 +2562,9 @@
     aaaaaaaa    
  0: aaaaaaaa
  1: a
+\= Expect no match
+    bcd
+No match
 
 /.*\.gif/
     borfle\nbib.gif\nno
@@ -2710,8 +2625,7 @@
     BarFoo 
  0: B
  1: B
-    *** Failers
-No match
+\= Expect no match
     abcde\nBar  
 No match
 
@@ -2733,8 +2647,7 @@
     BarFoo 
  0: B
  1: B
-    *** Failers
-No match
+\= Expect no match
     abcde\nBar  
 No match
 
@@ -2756,8 +2669,7 @@
     BarFoo 
  0: B
  1: B
-    *** Failers 
-No match
+\= Expect no match 
     abcde\nBar  
 No match
 
@@ -2766,14 +2678,12 @@
  0: abcde\x0a1234X
     BarFoo 
  0: B
-    *** Failers 
-No match
+\= Expect no match 
     abcde\nBar  
 No match
 
 /^.*B/
-    **** Failers
-No match
+\= Expect no match
     abc\nB
 No match
      
@@ -2825,32 +2735,28 @@
 /^[abcdefghijklmnopqrstuvwxy0123456789]/
     n
  0: n
-    *** Failers 
-No match
+\= Expect no match 
     z 
 No match
 
 /abcde{0,0}/
     abcd
  0: abcd
-    *** Failers
-No match
+\= Expect no match
     abce  
 No match
 
 /ab[cd]{0,0}e/
     abe
  0: abe
-    *** Failers
-No match
+\= Expect no match
     abcde 
 No match
     
 /ab(c){0,0}d/
     abd
  0: abd
-    *** Failers
-No match
+\= Expect no match
     abcd   
 No match
 
@@ -2864,17 +2770,14 @@
     abbbb
  0: abbbb
  1: bbbb
-    *** Failers
- 0: a
- 1: 
+\= Expect no match
     bbbbb    
 No match
     
 /ab\d{0}e/
     abe
  0: abe
-    *** Failers
-No match
+\= Expect no match
     ab1e   
 No match
     
@@ -2886,7 +2789,7 @@
  0: "the \"quick\" brown fox"
  1:  brown fox
 
-/.*?/g+
+/.*?/g,aftertext
     abc
  0: 
  0+ abc
@@ -2903,14 +2806,14 @@
  0: 
  0+ 
   
-/\b/g+
+/\b/g,aftertext
     abc 
  0: 
  0+ abc
  0: 
  0+ 
 
-/\b/+g
+/\b/g,aftertext
     abc 
  0: 
  0+ abc
@@ -2948,8 +2851,7 @@
 /a.b/
     acb
  0: acb
-    *** Failers 
-No match
+\= Expect no match 
     a\nb   
 No match
     
@@ -3000,15 +2902,14 @@
  1: a
     
 /(?!\A)x/m
+    a\bx\n
+ 0: x
+    a\nx\n
+ 0: x
+\= Expect no match     
     x\nb\n
 No match
-    a\bx\n  
- 0: x
     
-/\x0{ab}/
-    \0{ab} 
- 0: \x00{ab}
-
 /(A|B)*?CD/
     CD 
  0: CD
@@ -3036,8 +2937,7 @@
  0: foo
     rfoosh
  0: foo
-    *** Failers
-No match
+\= Expect no match
     barfoo
 No match
     towbarfoo
@@ -3046,8 +2946,7 @@
 /\w{3}(?<!bar)foo/
     catfood
  0: catfoo
-    *** Failers
-No match
+\= Expect no match
     foo
 No match
     barfoo
@@ -3059,8 +2958,7 @@
     fooabar
  0: bar
  1: foo
-    *** Failers
-No match
+\= Expect no match
     bar
 No match
     foobbar
@@ -3069,8 +2967,7 @@
 /\Aabc\z/m
     abc
  0: abc
-    *** Failers
-No match
+\= Expect no match
     abc\n   
 No match
     qqq\nabc
@@ -3081,12 +2978,11 @@
 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
+\= Expect no match     
+    /this/is/a/very/long/line/in/deed/with/very/many/slashes/in/it/you/see/
+No match
 
 /(?>(\.\d\d[1-9]?))\d+/
     1.230003938
@@ -3095,8 +2991,7 @@
     1.875000282
  0: .875000282
  1: .875
-    *** Failers 
-No match
+\= Expect no match 
     1.235 
 No match
 
@@ -3104,8 +2999,7 @@
     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
  1: party
-    *** Failers
-No match
+\= Expect no match
     this is not a line with only words and spaces!
 No match
     
@@ -3124,8 +3018,7 @@
  0: 12345a
  1: 12345
  2: a
-    *** Failers
-No match
+\= Expect no match
     12345+ 
 No match
 
@@ -3156,15 +3049,14 @@
  0: abc(ade)ufh()()x
  1: x
     
-/\(((?>[^()]+)|\([^()]+\))+\)/ 
+/\(((?>[^()]+)|\([^()]+\))+\)/
     (abc)
  0: (abc)
  1: abc
     (abc(def)xyz)
  0: (abc(def)xyz)
  1: xyz
-    *** Failers
-No match
+\= Expect no match
     ((()aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa   
 No match
 
@@ -3173,8 +3065,7 @@
  0: ab
     Ab
  0: Ab
-    *** Failers 
-No match
+\= Expect no match 
     aB
 No match
     AB
@@ -3184,8 +3075,7 @@
     a bcd e
  0: a bcd e
  1: a bc
-    *** Failers
-No match
+\= Expect no match
     a b cd e
 No match
     abcd e   
@@ -3197,8 +3087,7 @@
     a bcde f
  0: a bcde f
  1: a bcde f
-    *** Failers
-No match
+\= Expect no match
     abcdef  
 No match
 
@@ -3209,8 +3098,7 @@
     aBc
  0: aBc
  1: aB
-    *** Failers
-No match
+\= Expect no match
     abC
 No match
     aBC  
@@ -3229,8 +3117,7 @@
  0: abc
     aBc
  0: aBc
-    *** Failers 
-No match
+\= Expect no match 
     ABC
 No match
     abC
@@ -3243,8 +3130,7 @@
  0: aBc
     aBBc
  0: aBBc
-    *** Failers 
-No match
+\= Expect no match 
     aBC
 No match
     aBBC
@@ -3255,8 +3141,7 @@
  0: abcd
     abCd
  0: abCd
-    *** Failers
-No match
+\= Expect no match
     aBCd
 No match
     abcD     
@@ -3269,8 +3154,7 @@
  0: more than MILLION
     more \n than Million 
  0: more \x0a than Million
-    *** Failers
-No match
+\= Expect no match
     MORE THAN MILLION    
 No match
     more \n than \n million 
@@ -3283,22 +3167,20 @@
  0: more than MILLION
     more \n than Million 
  0: more \x0a than Million
-    *** Failers
-No match
+\= Expect no match
     MORE THAN MILLION    
 No match
     more \n than \n million 
 No match
     
-/(?>a(?i)b+)+c/ 
+/(?>a(?i)b+)+c/
     abc
  0: abc
     aBbc
  0: aBbc
     aBBc 
  0: aBBc
-    *** Failers
-No match
+\= Expect no match
     Abc
 No match
     abAb    
@@ -3311,8 +3193,7 @@
  0: abc
     aBc
  0: aBc
-    *** Failers
-No match
+\= Expect no match
     Ab 
 No match
     abC
@@ -3327,8 +3208,7 @@
     aBxxc
  0: xxc
  1: xx
-    *** Failers
-No match
+\= Expect no match
     Abxxc
 No match
     ABxxc
@@ -3342,8 +3222,7 @@
  1: a
     bB
  0: bB
-    *** Failers
-No match
+\= Expect no match
     aB
 No match
     bA    
@@ -3357,20 +3236,21 @@
  0: b
     bb  
  0: bb
-    *** Failers
-No match
+\= Expect no match
     ab   
 No match
+    
+# Perl gets this next one wrong if the pattern ends with $; in that case it
+# fails to match "12". 
 
-/^(?(?=abc)\w{3}:|\d\d)$/
+/^(?(?=abc)\w{3}:|\d\d)/
     abc:
  0: abc:
     12
  0: 12
-    *** Failers
-No match
     123
-No match
+ 0: 12
+\= Expect no match
     xyz    
 No match
 
@@ -3379,8 +3259,7 @@
  0: abc:
     12
  0: 12
-    *** Failers
-No match
+\= Expect no match
     123
 No match
     xyz    
@@ -3395,8 +3274,7 @@
  0: cat
     focat   
  0: cat
-    *** Failers
-No match
+\= Expect no match
     foocat  
 No match
 
@@ -3409,8 +3287,7 @@
  0: cat
     focat   
  0: cat
-    *** Failers
-No match
+\= Expect no match
     foocat  
 No match
 
@@ -3449,8 +3326,7 @@
  0: 12aa
  1: 1
  2: 2
-    *** Failers
-No match
+\= Expect no match
     1234    
 No match
 
@@ -3467,8 +3343,7 @@
     blaH blaH
  0: blaH blaH
  1: blaH
-    *** Failers
-No match
+\= Expect no match
     blah BLAH
 No match
     Blah blah      
@@ -3636,8 +3511,7 @@
  0: 12-sep-98
     12-09-98
  0: 12-09-98
-    *** Failers
-No match
+\= Expect no match
     sep-12-98
 No match
         
@@ -3648,8 +3522,7 @@
     foobarfootling 
  0: barfoo
  1: foo
-    *** Failers
-No match
+\= Expect no match
     foobar
 No match
     barfoo   
@@ -3684,8 +3557,7 @@
     BBx
  0: BBx
  1: BB
-    *** Failers
-No match
+\= Expect no match
     abcX
 No match
     aBCX
@@ -3717,8 +3589,7 @@
     France
  0: F
  1: F
-    *** Failers
-No match
+\= Expect no match
     Africa     
 No match
 
@@ -3741,8 +3612,7 @@
     Zambesi
  0: Z
  1: Z
-    *** Failers
-No match
+\= Expect no match
     aCD  
 No match
     XY  
@@ -3751,8 +3621,7 @@
 /(?<=foo\n)^bar/m
     foo\nbar
  0: bar
-    *** Failers
-No match
+\= Expect no match
     bar
 No match
     baz\nbar   
@@ -3765,39 +3634,37 @@
  0: baz
     koobarbaz 
  0: baz
-    *** Failers
-No match
+\= Expect no match
     baz
 No match
     foobarbaz 
 No match
 
-/The cases of aaaa and aaaaaa are missed out below because Perl does things/
-/differently. We know that odd, and maybe incorrect, things happen with/
-No match
-/recursive references in Perl, as far as 5.11.3 - see some stuff in test #2./
-No match
+# The cases of aaaa and aaaaaa are missed out below because Perl does things
+# differently. We know that odd, and maybe incorrect, things happen with
+# recursive references in Perl, as far as 5.11.3 - see some stuff in test #2.
 
 /^(a\1?){4}$/
-    a
-No match
-    aa
-No match
-    aaa
-No match
     aaaaa
  0: aaaaa
  1: a
     aaaaaaa
  0: aaaaaaa
  1: a
+    aaaaaaaaaa
+ 0: aaaaaaaaaa
+ 1: aaaa
+\= Expect no match
+    a
+No match
+    aa
+No match
+    aaa
+No match
     aaaaaaaa
 No match
     aaaaaaaaa
 No match
-    aaaaaaaaaa
- 0: aaaaaaaaaa
- 1: aaaa
     aaaaaaaaaaa
 No match
     aaaaaaaaaaaa
@@ -3808,16 +3675,10 @@
 No match
     aaaaaaaaaaaaaaa
 No match
-    aaaaaaaaaaaaaaaa               
+    aaaaaaaaaaaaaaaa
 No match
 
 /^(a\1?)(a\1?)(a\2?)(a\3?)$/
-    a
-No match
-    aa
-No match
-    aaa
-No match
     aaaa
  0: aaaa
  1: a
@@ -3842,16 +3703,23 @@
  2: aa
  3: aaa
  4: a
-    aaaaaaaa
-No match
-    aaaaaaaaa
-No match
     aaaaaaaaaa
  0: aaaaaaaaaa
  1: a
  2: aa
  3: aaa
  4: aaaa
+\= Expect no match
+    a
+No match
+    aa
+No match
+    aaa
+No match
+    aaaaaaaa
+No match
+    aaaaaaaaa
+No match
     aaaaaaaaaaa
 No match
     aaaaaaaaaaaa
@@ -3865,9 +3733,8 @@
     aaaaaaaaaaaaaaaa               
 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
+# 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
@@ -3876,8 +3743,7 @@
  0: abc
     ababc
  0: abc
-    *** Failers
-No match
+\= Expect no match
     xbc
 No match
     axc
@@ -3912,8 +3778,7 @@
 /ab+bc/
     abbc
  0: abbc
-    *** Failers
-No match
+\= Expect no match
     abc
 No match
     abq
@@ -3938,8 +3803,7 @@
  0: abbbbc
 
 /ab{4,5}bc/
-    *** Failers
-No match
+\= Expect no match
     abq
 No match
     abbbbc
@@ -3968,8 +3832,7 @@
 /^abc$/
     abc
  0: abc
-    *** Failers
-No match
+\= Expect no match
     abbbbc
 No match
     abcc
@@ -3984,10 +3847,7 @@
 /abc$/
     aabc
  0: abc
-    *** Failers
-No match
-    aabc
- 0: abc
+\= Expect no match
     aabcd
 No match
 
@@ -4012,8 +3872,7 @@
 /a[bc]d/
     abd
  0: abd
-    *** Failers
-No match
+\= Expect no match
     axyzd
 No match
     abc
@@ -4046,8 +3905,7 @@
 /a[^bc]d/
     aed
  0: aed
-    *** Failers
-No match
+\= Expect no match
     abd
 No match
     abd
@@ -4060,10 +3918,9 @@
 /a[^]b]c/
     adc
  0: adc
-    *** Failers
-No match
     a-c
  0: a-c
+\= Expect no match
     a]c
 No match
 
@@ -4076,8 +3933,7 @@
  0: a
 
 /\by\b/
-    *** Failers
-No match
+\= Expect no match
     xy
 No match
     yz
@@ -4086,8 +3942,7 @@
 No match
 
 /\Ba\B/
-    *** Failers
- 0: a
+\= Expect no match
     a-
 No match
     -a
@@ -4114,10 +3969,7 @@
 /\W/
     -
  0: -
-    *** Failers
- 0: *
-    -
- 0: -
+\= Expect no match
     a
 No match
 
@@ -4128,10 +3980,7 @@
 /a\Sb/
     a-b
  0: a-b
-    *** Failers
-No match
-    a-b
- 0: a-b
+\= Expect no match
     a b
 No match
 
@@ -4142,10 +3991,7 @@
 /\D/
     -
  0: -
-    *** Failers
- 0: *
-    -
- 0: -
+\= Expect no match
     1
 No match
 
@@ -4156,10 +4002,7 @@
 /[\W]/
     -
  0: -
-    *** Failers
- 0: *
-    -
- 0: -
+\= Expect no match
     a
 No match
 
@@ -4170,10 +4013,7 @@
 /a[\S]b/
     a-b
  0: a-b
-    *** Failers
-No match
-    a-b
- 0: a-b
+\= Expect no match
     a b
 No match
 
@@ -4184,10 +4024,7 @@
 /[\D]/
     -
  0: -
-    *** Failers
- 0: *
-    -
- 0: -
+\= Expect no match
     1
 No match
 
@@ -4215,8 +4052,8 @@
  0: a((b
 
 /a\\b/
-    a\b
-No match
+    a\\b
+ 0: a\b
 
 /((a))/
     abc
@@ -4277,14 +4114,13 @@
  0: cde
 
 /abc/
-    *** Failers
-No match
+\= Expect no match
     b
 No match
-    
 
 /a*/
-    
+    \
+ 0: 
 
 /([abc])*d/
     abbbcd
@@ -4369,8 +4205,7 @@
  0: adcdcde
 
 /a[bcd]+dcdcde/
-    *** Failers
-No match
+\= Expect no match
     abcde
 No match
     adcdcde
@@ -4408,8 +4243,7 @@
     reffgz
  0: effgz
  1: effgz
-    *** Failers
-No match
+\= Expect no match
     effg
 No match
     bcdd
@@ -4457,8 +4291,7 @@
  9: a
 
 /multiple words of text/
-    *** Failers
-No match
+\= Expect no match
     aa
 No match
     uh-uh
@@ -4509,12 +4342,10 @@
     a
  0: a
  1: a
-    *** Failers
- 0: a
- 1: a
     ab
  0: a
  1: a
+\= Expect no match
     x
 No match
 
@@ -4551,8 +4382,7 @@
  0: ABC
     ABABC
  0: ABC
-    *** Failers
-No match
+\= Expect no match
     aaxabxbaxbbx
 No match
     XBC
@@ -4585,8 +4415,7 @@
  0: ABBC
 
 /ab+bc/i
-    *** Failers
-No match
+\= Expect no match
     ABC
 No match
     ABQ
@@ -4611,8 +4440,7 @@
  0: ABBBBC
 
 /ab{4,5}?bc/i
-    *** Failers
-No match
+\= Expect no match
     ABQ
 No match
     ABBBBC
@@ -4641,8 +4469,7 @@
 /^abc$/i
     ABC
  0: ABC
-    *** Failers
-No match
+\= Expect no match
     ABBBBC
 No match
     ABCC
@@ -4677,10 +4504,9 @@
  0: AXYZC
 
 /a.*c/i
-    *** Failers
-No match
     AABC
  0: AABC
+\= Expect no match
     AXYZD
 No match
 
@@ -4691,8 +4517,7 @@
 /a[b-d]e/i
     ACE
  0: ACE
-    *** Failers
-No match
+\= Expect no match
     ABC
 No match
     ABD
@@ -4725,8 +4550,7 @@
 /a[^-b]c/i
     ADC
  0: ADC
-    *** Failers
-No match
+\= Expect no match
     ABD
 No match
     A-C
@@ -4748,8 +4572,7 @@
  1: 
 
 /$b/i
-    *** Failers
-No match
+\= Expect no match
     A]C
 No match
     B
@@ -4766,8 +4589,10 @@
  0: A((B
 
 /a\\b/i
-    A\B
-No match
+    A\\b
+ 0: A\b
+    a\\B 
+ 0: a\B
 
 /((a))/i
     ABC
@@ -4839,11 +4664,6 @@
     CDE
  0: CDE
 
-/abc/i
-
-/a*/i
-    
-
 /([abc])*d/i
     ABBBCD
  0: ABBBCD
@@ -4883,6 +4703,7 @@
  0: HIJ
 
 /^(ab|cd)e/i
+\= Expect no match
     ABCDE
 No match
 
@@ -4962,8 +4783,7 @@
     REFFGZ
  0: EFFGZ
  1: EFFGZ
-    *** Failers
-No match
+\= Expect no match
     ADCDCDE
 No match
     EFFG
@@ -5023,8 +4843,7 @@
  1: C
 
 /multiple words of text/i
-    *** Failers
-No match
+\= Expect no match
     AA
 No match
     UH-UH
@@ -5182,8 +5001,7 @@
     aaaaaaaaaa
  0: aaaaaaaaaa
  1: aaaa
-    *** Failers
-No match
+\= Expect no match
     AB
 No match
     aaaaaaaaa
@@ -5195,8 +5013,7 @@
     aaaaaaaaaa
  0: aaaaaaaaaa
  1: aaaa
-    *** Failers
-No match
+\= Expect no match
     aaaaaaaaa
 No match
     aaaaaaaaaaa
@@ -5215,8 +5032,7 @@
 /(?<=a)b/
     ab
  0: b
-    *** Failers
-No match
+\= Expect no match
     cb
 No match
     b
@@ -5292,8 +5108,7 @@
  1: A
 
 /(?:(?i)a)b/
-    *** Failers
-No match
+\= Expect no match
     cb
 No match
     aB
@@ -5320,8 +5135,7 @@
  1: A
 
 /(?i:a)b/
-    *** Failers
-No match
+\= Expect no match
     aB
 No match
     aB
@@ -5348,34 +5162,14 @@
  1: a
 
 /(?:(?-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
- 1: a
-
-/(?:(?-i)a)b/i
-    *** Failers
-No match
+\= Expect no match
     Ab
 No match
     AB
 No match
 
-/((?-i)a)b/i
-
 /(?-i:a)b/i
     ab
  0: ab
@@ -5395,8 +5189,7 @@
  1: a
 
 /(?-i:a)b/i
-    *** Failers
-No match
+\= Expect no match
     AB
 No match
     Ab
@@ -5414,8 +5207,7 @@
  1: a
 
 /(?-i:a)b/i
-    *** Failers
-No match
+\= Expect no match
     Ab
 No match
     AB
@@ -5424,8 +5216,7 @@
 /((?-i:a))b/i
 
 /((?-i:a.))b/i
-    *** Failers
-No match
+\= Expect no match
     AB
 No match
     a\nB
@@ -5470,8 +5261,7 @@
  0: aaac
 
 /(?<![cd])b/
-    *** Failers
-No match
+\= Expect no match
     B\nB
 No match
     dbcb
@@ -5500,8 +5290,7 @@
  0: ab
     aaa   
  0: aaa
-    *** Failers
-No match
+\= Expect no match
     dbcb
 No match
     a--
@@ -5559,8 +5348,7 @@
 /^b/
 
 /()^b/
-    *** Failers
-No match
+\= Expect no match
     a\nb\nc\n
 No match
     a\nb\nc\n
@@ -5572,8 +5360,7 @@
  1: b
 
 /(x)?(?(1)a|b)/
-    *** Failers
-No match
+\= Expect no match
     a
 No match
     a
@@ -5601,8 +5388,7 @@
  2: )
     blah
  0: blah
-    *** Failers
-No match
+\= Expect no match
     a
 No match
     blah)
@@ -5617,8 +5403,7 @@
  2: )
     blah
  0: blah
-    *** Failers
-No match
+\= Expect no match
     blah)
 No match
     (blah
@@ -5631,8 +5416,7 @@
  0: a
 
 /(?(?=a)b|a)/
-    *** Failers
-No match
+\= Expect no match
     a
 No match
     a
@@ -5667,8 +5451,7 @@
  2: aab
 
 /^(?=(a+?))\1ab/
-    *** Failers
-No match
+\= Expect no match
     aaab
 No match
     aaab
@@ -5703,10 +5486,7 @@
  0: xy:z:::abcd
  1: xy:z:::
  2: abcd
-    *** Failers
- 0: Failers
- 1: <unset>
- 2: Failers
+\= Expect no match
     abcd:
 No match
     abcd:
@@ -5754,8 +5534,7 @@
  1: x
 
 /a\Z/
-    *** Failers
-No match
+\= Expect no match
     aaab
 No match
     a\nb\n
@@ -5774,8 +5553,6 @@
 /b\z/
     a\nb
  0: b
-    *** Failers
-No match
     
 /^(?>(?(1)\.|())[^\W_](?>[a-z0-9-]*[^\W_])?)+$/
     a
@@ -5805,8 +5582,7 @@
     12-ab.1245 
  0: 12-ab.1245
  1: 
-    *** Failers
-No match
+\= Expect no match
     \
 No match
     .a
@@ -5841,18 +5617,19 @@
     endingwxyz
  0: endingwxyz
  1: wxyz
-    *** Failers
-No match
+\= Expect 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
+\= Expect no match
     word cat dog elephant mussel cow horse canary baboon snake shark
 No match
   
 /word (?>[a-zA-Z0-9]+ ){0,30}otherword/
+\= Expect no match
     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
 
@@ -5861,8 +5638,7 @@
  0: foo
     123999foo 
  0: foo
-    *** Failers
-No match
+\= Expect no match
     123abcfoo
 No match
     
@@ -5871,8 +5647,7 @@
  0: foo
     123999foo 
  0: foo
-    *** Failers
-No match
+\= Expect no match
     123abcfoo
 No match
 
@@ -5881,8 +5656,7 @@
  0: foo
     123456foo 
  0: foo
-    *** Failers
-No match
+\= Expect no match
     123999foo  
 No match
     
@@ -5891,8 +5665,7 @@
  0: foo
     123456foo 
  0: foo
-    *** Failers
-No match
+\= Expect no match
     123999foo  
 No match
 
@@ -5998,8 +5771,7 @@
  0: -
     0digit
  0: 0
-    *** Failers
-No match
+\= Expect no match
     bcdef    
 No match
     
@@ -6024,11 +5796,12 @@
  0: ab
 
 /(?!\A)x/m
-  a\nxb\n
+    a\nxb\n
  0: x
 
 /(?!^)x/m
-  a\nxb\n
+\= Expect no match
+    a\nxb\n
 No match
 
 /abc\Qabc\Eabc/
@@ -6042,8 +5815,7 @@
 /   abc\Q abc\Eabc/x
     abc abcabc
  0: abc abcabc
-    *** Failers
-No match
+\= Expect no match
     abcabcabc  
 No match
     
@@ -6083,8 +5855,7 @@
 /\Gabc/
     abc
  0: abc
-    *** Failers
-No match
+\= Expect no match
     xyzabc  
 No match
 
@@ -6102,8 +5873,7 @@
 /a(?x: b c )d/
     XabcdY
  0: abcd
-    *** Failers 
-No match
+\= Expect no match 
     Xa b c d Y 
 No match
 
@@ -6118,8 +5888,7 @@
 /(?i)AB(?-i)C/
     XabCY
  0: abC
-    *** Failers
-No match
+\= Expect no match
     XabcY  
 No match
 
@@ -6130,8 +5899,7 @@
     DE
  0: DE
  1: D
-    *** Failers
-No match
+\= Expect no match
     abcE
 No match
     abCe  
@@ -6167,9 +5935,9 @@
  1: bc
  2: bc
 
-/-- This tests for an IPv6 address in the form where it can have up to
-    eight components, one and only one of which is empty. This must be
-    an internal component. --/
+# This tests for an IPv6 address in the form where it can have up to
+# eight components, one and only one of which is empty. This must be
+# an internal component. 
 
 /^(?!:)                       # colon disallowed at start
   (?:                         # start of item
@@ -6179,7 +5947,7 @@
   ){1,7}                      # end item; 1-7 of them required               
   [0-9a-f]{1,4} $             # final hex number at end of string
   (?(1)|.)                    # check that there was an empty component
-  /xi
+  /ix
     a123::a123
  0: a123::a123
  1: 
@@ -6198,8 +5966,7 @@
     a123:ddde:9999:b342::324e:dcba:abcd
  0: a123:ddde:9999:b342::324e:dcba:abcd
  1: 
-    *** Failers
-No match
+\= Expect no match
     1:2:3:4:5:6:7:8
 No match
     a123:bce:ddde:9999:b342::324e:dcba:abcd
@@ -6228,22 +5995,12 @@
  0: d
     ] 
  0: ]
-    *** Failers
- 0: a
+\= Expect no match
     b     
 No match
 
-/[\z\C]/
-    z
- 0: z
-    C 
- 0: C
-    
-/\M/
-    M 
- 0: M
-    
 /(a+)*b/
+\= Expect no match
     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 
 No match
     
@@ -6278,8 +6035,7 @@
 /ab cd(?x) de fg/
     ab cddefg
  0: ab cddefg
-    ** Failers 
-No match
+\= Expect no match 
     abcddefg
 No match
 
@@ -6287,28 +6043,25 @@
     foobarX 
  0: bar
  1: bar
-    ** Failers 
-No match
+\= Expect no match 
     boobarX
 No match
 
 /(?<![^f])X/
     offX
  0: X
-    ** Failers
-No match
+\= Expect no match
     onyX  
 No match
 
 /(?<=[^f])X/
     onyX
  0: X
-    ** Failers
-No match
+\= Expect no match
     offX 
 No match
 
-/^/mg
+/^/gm
     a\nb\nc\n
  0: 
  0: 
@@ -6316,7 +6069,7 @@
     \ 
  0: 
     
-/(?<=C\n)^/mg
+/(?<=C\n)^/gm
     A\nC\nC\n 
  0: 
 
@@ -6362,16 +6115,14 @@
 "(?x)(?-x: \s*#\s*)"
     A # B
  0:  # 
-    ** Failers
-No match
+\= Expect no match
     #  
 No match
 
 "(?x-is)(?:(?-ixs) \s*#\s*) include"
     A #include
  0:  #include
-    ** Failers
-No match
+\= Expect no match
     A#include  
 No match
     A #Include
@@ -6449,16 +6200,14 @@
 /^[\Eabc]/
     a
  0: a
-    ** Failers 
-No match
+\= Expect no match 
     E 
 No match
     
 /^[a-\Ec]/
     b
  0: b
-    ** Failers
-No match
+\= Expect no match
     -
 No match
     E    
@@ -6467,8 +6216,7 @@
 /^[a\E\E-\Ec]/
     b
  0: b
-    ** Failers
-No match
+\= Expect no match
     -
 No match
     E    
@@ -6477,8 +6225,7 @@
 /^[\E\Qa\E-\Qz\E]+/
     b
  0: b
-    ** Failers
-No match
+\= Expect no match
     -  
 No match
     
@@ -6530,23 +6277,26 @@
  2: 
 
 /(a|)*\d/
-  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-No match
   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4
  0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4
  1: 
+\= Expect no match
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+No match
 
 /(?>a|)*\d/
-  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-No match
   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4
  0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4
+\= Expect no match
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+No match
 
 /(?:a|)*\d/
-  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-No match
   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4
  0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4
+\= Expect no match
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+No match
 
 /\Z/g
   abc\n
@@ -6556,18 +6306,21 @@
 /^(?s)(?>.*)(?<!\n)/
   abc
  0: abc
+\= Expect no match
   abc\n  
 No match
 
 /^(?![^\n]*\n\z)/
   abc
  0: 
+\= Expect no match
   abc\n 
 No match
   
 /\z(?<!\n)/
   abc
  0: 
+\= Expect no match
   abc\n  
 No match
 
@@ -6612,6 +6365,7 @@
  0: p
 
 /.*[op][xyz]/
+\= Expect no match
     fooabcfoo
 No match
 
@@ -6624,6 +6378,7 @@
 /(?(?=^.*b)b|^)/
    adc
  0: 
+\= Expect no match
    abc 
 No match
 
@@ -6659,8 +6414,7 @@
  0: Ab
     CcC 
  0: c
-    ** Failers
-No match
+\= Expect no match
     XABX   
 No match
 
@@ -6668,15 +6422,13 @@
     \x0a\x0b\x0c\x0d
  0: \x0a\x0b\x0c\x0d
 
-/^\c/
-    ?
- 0: ?
-
 /(abc)\1/i
+\= Expect no match
    abc
 No match
 
 /(abc)\1/
+\= Expect no match
    abc
 No match
 
@@ -6693,16 +6445,14 @@
  0: 12
 
 /[^a]*?X/i
-    ** Failers
-No match
+\= Expect no match
     12abc
 No match
     12ABC
 No match
     
-/[^a]+?X/i   
-    ** Failers
-No match
+/[^a]+?X/i
+\= Expect no match
     12abc
 No match
     12ABC
@@ -6807,13 +6557,13 @@
  1: <unset>
  2: a
 
-/(?:(?>([ab])))+a=/+
+/(?:(?>([ab])))+a=/aftertext
     =ba=
  0: ba=
  0+ 
  1: b
 
-/(?>([ab]))+a=/+
+/(?>([ab]))+a=/aftertext
     =ba=
  0: ba=
  0+ 
@@ -6827,10 +6577,12 @@
  3: aabab
 
 /(?>a+|ab)+?c/
+\= Expect no match
     aabc
 No match
 
 /(?>a+|ab)+c/
+\= Expect no match
     aabc
 No match
 
@@ -6850,10 +6602,12 @@
  2: b
 
 /^(?:a|ab)++c/
+\= Expect no match
     aaaabc
 No match
 
 /^(?>a|ab)++c/
+\= Expect no match
     aaaabc
 No match
 
@@ -6861,30 +6615,27 @@
     aaaabc
  0: aaaabc
 
-/(?=abc){3}abc/+
+/(?=abc){3}abc/aftertext
     abcabcabc
  0: abc
  0+ abcabc
-    ** Failers
-No match
+\= Expect no match
     xyz  
 No match
     
-/(?=abc)+abc/+
+/(?=abc)+abc/aftertext
     abcabcabc
  0: abc
  0+ abcabc
-    ** Failers
-No match
+\= Expect no match
     xyz  
 No match
     
-/(?=abc)++abc/+
+/(?=abc)++abc/aftertext
     abcabcabc
  0: abc
  0+ abcabc
-    ** Failers
-No match
+\= Expect no match
     xyz  
 No match
     
@@ -6893,8 +6644,7 @@
  0: xyz
 
 /(?=abc){1}xyz/
-    ** Failers
-No match
+\= Expect no match
     xyz 
 No match
     
@@ -6933,8 +6683,7 @@
 /^[\g<a>]+/
     ggg<<<aaa>>>
  0: ggg<<<aaa>>>
-    ** Failers
-No match
+\= Expect no match
     \\ga  
 No match
     
@@ -6957,16 +6706,14 @@
 /(?<=a{2})b/i
     xaabc
  0: b
-    ** Failers
-No match
+\= Expect no match
     xabc  
 No match
 
 /(?<!a{2})b/i
     xabc
  0: b
-    ** Failers
-No match
+\= Expect no match
     xaabc  
 No match
 
@@ -6979,16 +6726,14 @@
  0: b
     aAAbc 
  0: b
-    ** Failers
-No match
+\= Expect no match
     xaabc    
 No match
 
 /(?<=[^a]{2})b/i
     axxbc  
  0: b
-    ** Failers
-No match
+\= Expect no match
     aAAbc 
 No match
     xaabc    
@@ -7018,62 +6763,39 @@
     aaaaaaa
  0: aaaaaaa
  1: aaa
-    ** Failers
-No match
+\= Expect no match
     aaaaaa
 No match
     aaaaaaaaa 
 No match
 
 /^(a{2,3})++a/
-    ** Failers
-No match
+\= Expect no match
     aaaaaa
 No match
 
 /^(a{2,3})*+a/
-    ** Failers
-No match
+\= Expect no match
     aaaaaa
 No match
 
-/ab\Cde/
-    abXde
- 0: abXde
-    
-/(?<=ab\Cde)X/
-    abZdeX
- 0: X
-
-/a[\CD]b/
-    aCb
- 0: aCb
-    aDb 
- 0: aDb
-
-/a[\C-X]b/
-    aJb
- 0: aJb
-
 /\H\h\V\v/
     X X\x0a
  0: X X\x0a
     X\x09X\x0b
  0: X\x09X\x0b
-    ** Failers
-No match
+\= Expect no match
     \xa0 X\x0a   
 No match
     
-/\H*\h+\V?\v{3,4}/ 
+/\H*\h+\V?\v{3,4}/
     \x09\x20\xa0X\x0a\x0b\x0c\x0d\x0a
  0: \x09 \xa0X\x0a\x0b\x0c\x0d
     \x09\x20\xa0\x0a\x0b\x0c\x0d\x0a
  0: \x09 \xa0\x0a\x0b\x0c\x0d
     \x09\x20\xa0\x0a\x0b\x0c
  0: \x09 \xa0\x0a\x0b\x0c
-    ** Failers 
-No match
+\= Expect no match 
     \x09\x20\xa0\x0a\x0b
 No match
      
@@ -7092,8 +6814,7 @@
  0: XNNNYZ
     >  X NYQZ
  0:   X NYQZ
-    ** Failers
-No match
+\= Expect no match
     >XYZ   
 No match
     >  X NY Z
@@ -7125,37 +6846,36 @@
  0: barbaz
  1: foobar
 
-/abc\K|def\K/g+
+/abc\K|def\K/g,aftertext
     Xabcdefghi
  0: 
  0+ defghi
  0: 
  0+ ghi
 
-/ab\Kc|de\Kf/g+
+/ab\Kc|de\Kf/g,aftertext
     Xabcdefghi
  0: c
  0+ defghi
  0: f
  0+ ghi
     
-/(?=C)/g+
+/(?=C)/g,aftertext
     ABCDECBA
  0: 
  0+ CDECBA
  0: 
  0+ CBA
     
-/^abc\K/+
+/^abc\K/aftertext
     abcdef
  0: 
  0+ def
-    ** Failers
-No match
+\= Expect no match
     defabcxyz   
 No match
 
-/^(a(b))\1\g1\g{1}\g-1\g{-1}\g{-02}Z/
+/^(a(b))\1\g1\g{1}\g-1\g{-1}\g{-2}Z/
     ababababbbabZXXXX
  0: ababababbbabZ
  1: ab
@@ -7170,6 +6890,7 @@
  1: bon
     
 /(^(a|b\g{-1}))/
+\= Expect no match
     bacxxx
 No match
 
@@ -7180,8 +6901,7 @@
     xyzxyz 
  0: xyzxyz
  1: xyz
-    ** Failers
-No match
+\= Expect no match
     abcxyz
 No match
     xyzabc   
@@ -7194,8 +6914,7 @@
     xyzabc 
  0: xyzabc
  1: xyz
-    ** Failers 
-No match
+\= Expect no match 
     xyzxyz 
 No match
  
@@ -7237,8 +6956,7 @@
     ab:ababxyz
  0: ab:abab
  1: ab
-    ** Failers
-No match
+\= Expect no match
     a:axyz
 No match
     ab:abxyz
@@ -7251,8 +6969,7 @@
     ab:ababxyz
  0: ab:abab
  1: ab
-    ** Failers
-No match
+\= Expect no match
     a:axyz
 No match
     ab:abxyz
@@ -7302,8 +7019,7 @@
  0: 10.0.0.0
  1: <unset>
  2: .0
-    ** Failers
-No match
+\= Expect no match
     10.6
 No match
     455.3.4.5
@@ -7319,8 +7035,7 @@
     10.0.0.0
  0: 10.0.0.0
  1: .0
-    ** Failers
-No match
+\= Expect no match
     10.6
 No match
     455.3.4.5
@@ -7330,8 +7045,7 @@
     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
  1: party
-    *** Failers
-No match
+\= Expect no match
     this is not a line with only words and spaces!
 No match
 
@@ -7340,8 +7054,7 @@
  0: 12345a
  1: 12345
  2: a
-    *** Failers
-No match
+\= Expect no match
     12345+
 No match
 
@@ -7371,8 +7084,7 @@
     (abc(def)xyz)
  0: (abc(def)xyz)
  1: xyz
-    *** Failers
-No match
+\= Expect no match
     ((()aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
 No match
 
@@ -7386,8 +7098,7 @@
     a(b(c))d
  0: a(b(c))d
  1: d
-    *** Failers)
-No match
+\= Expect no match)
     a(b(c)d
 No match
 
@@ -7425,8 +7136,7 @@
  2: <unset>
  3: AblewasIereIsawElba
  4: A
-    *** Failers
-No match
+\= Expect no match
     Thequickbrownfox
 No match
 
@@ -7441,8 +7151,7 @@
     -12
  0: -12
  1: -12
-    *** Failers
-No match
+\= Expect no match
     ((2+2)*-3)-7)
 No match
 
@@ -7455,8 +7164,7 @@
  0: xxyzxyzz
  1: xxyzxyzz
  2: xyzxyz
-    *** Failers
-No match
+\= Expect no match
     xxyzz
 No match
     xxyzxyzxyzz
@@ -7487,28 +7195,32 @@
  0: <>
  1: <>
  2: <>
-    *** Failers
-No match
+\= Expect no match
     <abc
 No match
 
 /^a+(*FAIL)/
+\= Expect no match
     aaaaaa
 No match
     
 /a+b?c+(*FAIL)/
+\= Expect no match
     aaabccc
 No match
 
 /a+b?(*PRUNE)c+(*FAIL)/
+\= Expect no match
     aaabccc
 No match
 
 /a+b?(*COMMIT)c+(*FAIL)/
+\= Expect no match
     aaabccc
 No match
     
 /a+b?(*SKIP)c+(*FAIL)/
+\= Expect no match
     aaabcccaaabccc
 No match
 
@@ -7552,6 +7264,7 @@
  1: ddd
 
 /a+b?(*THEN)c+(*FAIL)/
+\= Expect no match
     aaabccc
 No match
 
@@ -7574,8 +7287,7 @@
  1: ACD
  2: C
  3: E
-    ** Failers
-No match
+\= Expect no match
     AD 
 No match
         
@@ -7602,8 +7314,7 @@
  2: <unset>
  3: Able was I ere I saw Elba
  4: A
-    *** Failers
-No match
+\= Expect no match
     The quick brown fox
 No match
 
@@ -7631,6 +7342,7 @@
  0: ablewasiereisawelba
  1: ablewasiereisawelba
  2: a
+\= Expect no match     
     rhubarb
 No match
     the quick brown fox  
@@ -7640,8 +7352,7 @@
     baz
  0: a
  1: a
-    ** Failers
-No match
+\= Expect no match
     caz  
 No match
     
@@ -7649,8 +7360,7 @@
     zbaaz
  0: a
  1: a
-    ** Failers
-No match
+\= Expect no match
     aaa  
 No match
     
@@ -7666,8 +7376,7 @@
     defdef 
  0: defdef
  1: def
-    ** Failers
-No match
+\= Expect no match
     abcdef
 No match
     defabc   
@@ -7680,14 +7389,13 @@
     defabc
  0: defabc
  1: def
-    ** Failers
-No match
+\= Expect no match
     defdef
 No match
     abcdef    
 No match
 
-/(?:a(?<quote> (?<apostrophe>')|(?<realquote>")) |b(?<quote> (?<apostrophe>')|(?<realquote>")) ) (?('quote')[a-z]+|[0-9]+)/xJ
+/(?:a(?<quote> (?<apostrophe>')|(?<realquote>")) |b(?<quote> (?<apostrophe>')|(?<realquote>")) ) (?('quote')[a-z]+|[0-9]+)/x,dupnames
     a\"aaaaa
  0: a"aaaaa
  1: "
@@ -7701,8 +7409,7 @@
  4: "
  5: <unset>
  6: "
-    ** Failers 
-No match
+\= Expect no match 
     b\"11111
 No match
 
@@ -7713,8 +7420,7 @@
     CCD
  0: CC
  1: C
-    ** Failers
-No match
+\= Expect no match
     CAD   
 No match
 
@@ -7725,8 +7431,7 @@
     BCD 
  0: BC
  1: C
-    ** Failers
-No match
+\= Expect no match
     ABCD
 No match
     CAD
@@ -7750,8 +7455,7 @@
     BAX  
  0: BA
  1: A
-    ** Failers
-No match
+\= Expect no match
     ACX
 No match
     ABC   
@@ -7772,16 +7476,14 @@
  2: ef
 
 /^(?=a(*SKIP)b|ac)/
-    ** Failers
-No match
+\= Expect no match
     ac
 No match
     
 /^(?=a(*PRUNE)b)/
     ab  
  0: 
-    ** Failers 
-No match
+\= Expect no match 
     ac
 No match
 
@@ -7850,89 +7552,87 @@
  1: 0
  2: 0
 
-/--- This one does fail, as expected, in Perl. It needs the complex item at the
-     end of the pattern. A single letter instead of (B|D) makes it not fail,
-     which I think is a Perl bug. --- /
+# This one does fail, as expected, in Perl. It needs the complex item at the
+# end of the pattern. A single letter instead of (B|D) makes it not fail, which
+# I think is a Perl bug.
 
 /A(*COMMIT)(B|D)/
+\= Expect no match
     ACABX
 No match
 
-/--- Check the use of names for failure ---/
+# Check the use of names for failure
 
-/^(A(*PRUNE:A)B|C(*PRUNE:B)D)/K
-    ** Failers
-No match
+/^(A(*PRUNE:A)B|C(*PRUNE:B)D)/mark
+\= Expect no match
     AC
 No match, mark = A
     CB    
 No match, mark = B
     
-/--- Force no study, otherwise mark is not seen. The studied version is in
-     test 2 because it isn't Perl-compatible. ---/
-
-/(*MARK:A)(*SKIP:B)(C|X)/KSS
+/(*MARK:A)(*SKIP:B)(C|X)/mark
     C
  0: C
  1: C
 MK: A
+\= Expect no match
     D
 No match, mark = A
      
-/^(A(*THEN:A)B|C(*THEN:B)D)/K
-    ** Failers
-No match
+/^(A(*THEN:A)B|C(*THEN:B)D)/mark
+\= Expect no match
     CB    
 No match, mark = B
 
-/^(?:A(*THEN:A)B|C(*THEN:B)D)/K
+/^(?:A(*THEN:A)B|C(*THEN:B)D)/mark
+\= Expect no match
     CB    
 No match, mark = B
     
-/^(?>A(*THEN:A)B|C(*THEN:B)D)/K
+/^(?>A(*THEN:A)B|C(*THEN:B)D)/mark
+\= Expect no match
     CB    
 No match, mark = B
     
-/--- This should succeed, as the skip causes bump to offset 1 (the mark). Note
-that we have to have something complicated such as (B|Z) at the end because,
-for Perl, a simple character somehow causes an unwanted optimization to mess
-with the handling of backtracking verbs. ---/
+# This should succeed, as the skip causes bump to offset 1 (the mark). Note
+# that we have to have something complicated such as (B|Z) at the end because,
+# for Perl, a simple character somehow causes an unwanted optimization to mess
+# with the handling of backtracking verbs.
 
-/A(*MARK:A)A+(*SKIP:A)(B|Z) | AC/xK
+/A(*MARK:A)A+(*SKIP:A)(B|Z) | AC/x,mark
     AAAC
  0: AC
     
-/--- Test skipping over a non-matching mark. ---/
+# Test skipping over a non-matching mark.
 
-/A(*MARK:A)A+(*MARK:B)(*SKIP:A)(B|Z) | AC/xK
+/A(*MARK:A)A+(*MARK:B)(*SKIP:A)(B|Z) | AC/x,mark
     AAAC
  0: AC
     
-/--- Check shorthand for MARK ---/
+# Check shorthand for MARK.
 
-/A(*:A)A+(*SKIP:A)(B|Z) | AC/xK
+/A(*:A)A+(*SKIP:A)(B|Z) | AC/x,mark
     AAAC
  0: AC
 
-/--- Don't loop! Force no study, otherwise mark is not seen. ---/
-
-/(*:A)A+(*SKIP:A)(B|Z)/KSS
+/(*:A)A+(*SKIP:A)(B|Z)/mark
+\= Expect no match
     AAAC
 No match, mark = A
 
-/--- This should succeed, as a non-existent skip name disables the skip ---/ 
+# This should succeed, as a non-existent skip name disables the skip.
 
-/A(*MARK:A)A+(*SKIP:B)(B|Z) | AC/xK
+/A(*MARK:A)A+(*SKIP:B)(B|Z) | AC/x,mark
     AAAC
  0: AC
 
-/A(*MARK:A)A+(*SKIP:B)(B|Z) | AC(*:B)/xK
+/A(*MARK:A)A+(*SKIP:B)(B|Z) | AC(*:B)/x,mark
     AAAC
  0: AC
 MK: B
 
-/--- COMMIT at the start of a pattern should act like an anchor. Again, 
-however, we need the complication for Perl. ---/
+# COMMIT at the start of a pattern should act like an anchor. Again, however,
+# we need the complication for Perl.
 
 /(*COMMIT)(A|P)(B|P)(C|P)/
     ABCDEFG
@@ -7940,12 +7640,11 @@
  1: A
  2: B
  3: C
-    ** Failers
-No match
+\= Expect no match
     DEFGABC  
 No match
 
-/--- COMMIT inside an atomic group can't stop backtracking over the group. ---/
+# COMMIT inside an atomic group can't stop backtracking over the group.
 
 /(\w+)(?>b(*COMMIT))\w{2}/
     abbb
@@ -7953,22 +7652,25 @@
  1: a
 
 /(\w+)b(*COMMIT)\w{2}/
+\= Expect no match
     abbb
 No match
 
-/--- Check opening parens in comment when seeking forward reference. ---/ 
+# Check opening parens in comment when seeking forward reference.
 
 /(?&t)(?#()(?(DEFINE)(?<t>a))/
     bac
  0: a
 
-/--- COMMIT should override THEN ---/
+# COMMIT should override THEN.
 
 /(?>(*COMMIT)(?>yes|no)(*THEN)(*F))?/
+\= Expect no match
   yes
 No match
 
 /(?>(*COMMIT)(yes|no)(*THEN)(*F))?/
+\= Expect no match
   yes
 No match
 
@@ -7979,10 +7681,12 @@
  0: bc
    
 /(*SKIP)bc/
+\= Expect no match
     a
 No match
 
 /(*SKIP)b/
+\= Expect no match
     a 
 No match
 
@@ -7998,9 +7702,7 @@
     aA     
  0: aA
  1: a
-    ** Failers
- 0: **
- 1: *
+\= Expect no match
     ab
 No match
     aB
@@ -8013,8 +7715,7 @@
 /^(?&t)*+(?(DEFINE)(?<t>a))\w$/
     aaaaaaX
  0: aaaaaaX
-    ** Failers 
-No match
+\= Expect no match 
     aaaaaa 
 No match
 
@@ -8033,8 +7734,7 @@
  0: Y
  1: <unset>
  2: Y
-    ** Failers 
-No match
+\= Expect no match 
     aaaa
 No match
 
@@ -8045,8 +7745,7 @@
     YZ 
  0: Y
  1: Y
-    ** Failers 
-No match
+\= Expect no match 
     aaaa
 No match
 
@@ -8055,8 +7754,7 @@
  0: aaaaX
  1: a
  2: X
-    ** Failers 
-No match
+\= Expect no match 
     aaaa
 No match
     YZ 
@@ -8066,8 +7764,7 @@
     aaaaX
  0: aaaaX
  1: X
-    ** Failers 
-No match
+\= Expect no match 
     aaaa
 No match
     YZ 
@@ -8096,8 +7793,7 @@
  0: aaaaX
  1: a
  2: X
-    ** Failers
-No match
+\= Expect no match
     aaa
 No match
     YZ 
@@ -8107,8 +7803,7 @@
     aaaaX
  0: aaaaX
  1: X
-    ** Failers
-No match
+\= Expect no match
     aaa
 No match
     YZ 
@@ -8126,16 +7821,14 @@
  1: 
 
 /(a)++(?1)b/
-    ** Failers
-No match
+\= Expect no match
     ab 
 No match
     aab
 No match
 
 /(a)*+(?1)b/
-    ** Failers
-No match
+\= Expect no match
     ab
 No match
     aab  
@@ -8192,15 +7885,16 @@
  1: a
     
 /^(a)(?1)++ab/
+\= Expect no match
     aaaab
 No match
 
-/^(?=a(*:M))aZ/K
+/^(?=a(*:M))aZ/mark
     aZbc
  0: aZ
 MK: M
 
-/^(?!(*:M)b)aZ/K
+/^(?!(*:M)b)aZ/mark
     aZbc
  0: aZ
 
@@ -8241,12 +7935,12 @@
  1: a
 
 /((?(R)a|(?1)))+/
-    aaa
+    aaa 
  0: aaa
  1: a
 
 /a(*:any 
-name)/K
+name)/mark
     abc
  0: a
 MK: any \x0aname
@@ -8259,11 +7953,12 @@
     bba 
  0: a
     
-/--- Checking revised (*THEN) handling ---/ 
+# Checking revised (*THEN) handling.
 
-/--- Capture ---/
+# Capture
 
 /^.*? (a(*THEN)b) c/x
+\= Expect no match
     aabc
 No match
 
@@ -8279,12 +7974,14 @@
  2: ab
 
 /^.*? ( (a(*THEN)b) ) c/x
+\= Expect no match
     aabc
 No match
 
-/--- Non-capture ---/
+# Non-capture
 
 /^.*? (?:a(*THEN)b) c/x
+\= Expect no match
     aabc
 No match
 
@@ -8297,12 +7994,14 @@
  0: aabc
 
 /^.*? (?: (?:a(*THEN)b) ) c/x
+\= Expect no match
     aabc
 No match
 
-/--- Atomic ---/
+# Atomic
 
 /^.*? (?>a(*THEN)b) c/x
+\= Expect no match
     aabc
 No match
 
@@ -8315,12 +8014,14 @@
  0: aabc
 
 /^.*? (?> (?>a(*THEN)b) ) c/x
+\= Expect no match
     aabc
 No match
 
-/--- Possessive capture ---/
+# Possessive capture
 
 /^.*? (a(*THEN)b)++ c/x
+\= Expect no match
     aabc
 No match
 
@@ -8336,12 +8037,14 @@
  2: ab
 
 /^.*? ( (a(*THEN)b)++ )++ c/x
+\= Expect no match
     aabc
 No match
 
-/--- Possessive non-capture ---/
+# Possessive non-capture
 
 /^.*? (?:a(*THEN)b)++ c/x
+\= Expect no match
     aabc
 No match
 
@@ -8354,18 +8057,20 @@
  0: aabc
 
 /^.*? (?: (?:a(*THEN)b)++ )++ c/x
+\= Expect no match
     aabc
 No match
     
-/--- Condition assertion ---/
+# Condition assertion
 
 /^(?(?=a(*THEN)b)ab|ac)/
     ac
  0: ac
  
-/--- Condition ---/
+# Condition
 
 /^.*?(?(?=a)a|b(*THEN)c)/
+\= Expect no match
     ba
 No match
 
@@ -8374,23 +8079,24 @@
  0: ba
 
 /^.*?(?(?=a)a(*THEN)b|c)/
+\= Expect no match
     ac
 No match
 
-/--- Assertion ---/
+# Assertion
 
-/^.*(?=a(*THEN)b)/ 
+/^.*(?=a(*THEN)b)/
     aabc
  0: a
 
-/------------------------------/
+# --------------------------
 
-/(?>a(*:m))/imsxSK 
+/(?>a(*:m))/imsx,mark
     a
  0: a
 MK: m
 
-/(?>(a)(*:m))/imsxSK 
+/(?>(a)(*:m))/imsx,mark
     a
  0: a
  1: a
@@ -8409,8 +8115,7 @@
     xabcd
  0: c
  1: ab
-    ** Failers 
-No match
+\= Expect no match 
     xacd
 No match
     
@@ -8420,7 +8125,7 @@
     acd 
  0: c
 
-/(?<=a(*:N)b)c/K
+/(?<=a(*:N)b)c/mark
     xabcd
  0: c
 MK: N
@@ -8443,82 +8148,90 @@
  1: a
  2: d
 
-/(*MARK:A)(*PRUNE:B)(C|X)/KS
+/(*MARK:A)(*PRUNE:B)(C|X)/mark
     C
  0: C
  1: C
 MK: B
+\= Expect no match
     D 
 No match, mark = B
 
-/(*MARK:A)(*PRUNE:B)(C|X)/KSS
+/(*MARK:A)(*PRUNE:B)(C|X)/mark
     C
  0: C
  1: C
 MK: B
+\= Expect no match
     D 
 No match, mark = B
 
-/(*MARK:A)(*THEN:B)(C|X)/KS
+/(*MARK:A)(*THEN:B)(C|X)/mark
     C
  0: C
  1: C
 MK: B
+\= Expect no match
     D 
 No match, mark = B
 
-/(*MARK:A)(*THEN:B)(C|X)/KSY
+/(*MARK:A)(*THEN:B)(C|X)/mark,no_start_optimize
     C
  0: C
  1: C
 MK: B
+\= Expect no match
     D 
 No match, mark = B
 
-/(*MARK:A)(*THEN:B)(C|X)/KSS
+/(*MARK:A)(*THEN:B)(C|X)/mark
     C
  0: C
  1: C
 MK: B
+\= Expect no match
     D 
 No match, mark = B
 
-/--- This should fail, as the skip causes a bump to offset 3 (the skip) ---/
+# This should fail, as the skip causes a bump to offset 3 (the skip).
 
-/A(*MARK:A)A+(*SKIP)(B|Z) | AC/xK
+/A(*MARK:A)A+(*SKIP)(B|Z) | AC/x,mark
+\= Expect no match
     AAAC
 No match, mark = A
 
-/--- Same --/
+# Same 
 
-/A(*MARK:A)A+(*MARK:B)(*SKIP:B)(B|Z) | AC/xK
+/A(*MARK:A)A+(*MARK:B)(*SKIP:B)(B|Z) | AC/x,mark
+\= Expect no match
     AAAC
 No match, mark = B
 
-/A(*:A)A+(*SKIP)(B|Z) | AC/xK
+/A(*:A)A+(*SKIP)(B|Z) | AC/x,mark
+\= Expect no match
     AAAC
 No match, mark = A
 
-/--- This should fail, as a null name is the same as no name ---/
+# This should fail, as a null name is the same as no name.
 
-/A(*MARK:A)A+(*SKIP:)(B|Z) | AC/xK
+/A(*MARK:A)A+(*SKIP:)(B|Z) | AC/x,mark
+\= Expect no match
     AAAC
 No match, mark = A
 
-/--- A check on what happens after hitting a mark and them bumping along to
-something that does not even start. Perl reports tags after the failures here, 
-though it does not when the individual letters are made into something 
-more complicated. ---/
+# A check on what happens after hitting a mark and them bumping along to
+# something that does not even start. Perl reports tags after the failures
+# here, though it does not when the individual letters are made into something
+# more complicated.
 
-/A(*:A)B|XX(*:B)Y/K
+/A(*:A)B|XX(*:B)Y/mark
     AABC
  0: AB
 MK: A
     XXYZ 
  0: XXY
 MK: B
-    ** Failers
-No match
+\= Expect no match
     XAQQ  
 No match, mark = A
     XAQQXZZ  
@@ -8528,7 +8241,7 @@
     AXXQQQ 
 No match, mark = B
     
-/^(A(*THEN:A)B|C(*THEN:B)D)/K
+/^(A(*THEN:A)B|C(*THEN:B)D)/mark
     AB
  0: AB
  1: AB
@@ -8537,14 +8250,13 @@
  0: CD
  1: CD
 MK: B
-    ** Failers
-No match
+\= Expect no match
     AC
 No match, mark = A
     CB    
 No match, mark = B
     
-/^(A(*PRUNE:A)B|C(*PRUNE:B)D)/K
+/^(A(*PRUNE:A)B|C(*PRUNE:B)D)/mark
     AB
  0: AB
  1: AB
@@ -8553,17 +8265,16 @@
  0: CD
  1: CD
 MK: B
-    ** Failers
-No match
+\= Expect no match
     AC
 No match, mark = A
     CB    
 No match, mark = B
     
-/--- An empty name does not pass back an empty string. It is the same as if no
-name were given. ---/ 
+# An empty name does not pass back an empty string. It is the same as if no
+# name were given.
 
-/^(A(*PRUNE:)B|C(*PRUNE:B)D)/K
+/^(A(*PRUNE:)B|C(*PRUNE:B)D)/mark
     AB
  0: AB
  1: AB
@@ -8572,16 +8283,16 @@
  1: CD
 MK: B
 
-/--- PRUNE goes to next bumpalong; COMMIT does not. ---/
+# PRUNE goes to next bumpalong; COMMIT does not.
     
-/A(*PRUNE:A)B/K
+/A(*PRUNE:A)B/mark
     ACAB
  0: AB
 MK: A
 
-/--- Mark names can be duplicated ---/
+# Mark names can be duplicated.
 
-/A(*:A)B|X(*:A)Y/K
+/A(*:A)B|X(*:A)Y/mark
     AABC
  0: AB
 MK: A
@@ -8589,92 +8300,82 @@
  0: XY
 MK: A
     
-/b(*:m)f|a(*:n)w/K
+/b(*:m)f|a(*:n)w/mark
     aw 
  0: aw
 MK: n
-    ** Failers 
-No match, mark = n
+\= Expect no match 
     abc
 No match, mark = m
 
-/b(*:m)f|aw/K
+/b(*:m)f|aw/mark
     abaw
  0: aw
-    ** Failers 
-No match
+\= Expect no match 
     abc
 No match, mark = m
     abax 
 No match, mark = m
 
-/A(*MARK:A)A+(*SKIP:B)(B|Z) | AAC/xK
+/A(*MARK:A)A+(*SKIP:B)(B|Z) | AAC/x,mark
     AAAC
  0: AAC
 
-/a(*PRUNE:X)bc|qq/KY
-    ** Failers
-No match, mark = X
+/a(*PRUNE:X)bc|qq/mark,no_start_optimize
+\= Expect no match
     axy
 No match, mark = X
 
-/a(*THEN:X)bc|qq/KY
-    ** Failers
-No match, mark = X
+/a(*THEN:X)bc|qq/mark,no_start_optimize
+\= Expect no match
     axy
 No match, mark = X
 
-/(?=a(*MARK:A)b)..x/K
+/(?=a(*MARK:A)b)..x/mark
     abxy
  0: abx
 MK: A
-    ** Failers
-No match
+\= Expect no match
     abpq  
 No match
 
-/(?=a(*MARK:A)b)..(*:Y)x/K
+/(?=a(*MARK:A)b)..(*:Y)x/mark
     abxy
  0: abx
 MK: Y
-    ** Failers
-No match
+\= Expect no match
     abpq  
 No match
 
-/(?=a(*PRUNE:A)b)..x/K
+/(?=a(*PRUNE:A)b)..x/mark
     abxy
  0: abx
 MK: A
-    ** Failers
-No match
+\= Expect no match
     abpq  
 No match
 
-/(?=a(*PRUNE:A)b)..(*:Y)x/K
+/(?=a(*PRUNE:A)b)..(*:Y)x/mark
     abxy
  0: abx
 MK: Y
-    ** Failers
-No match
+\= Expect no match
     abpq  
 No match
 
-/(?=a(*THEN:A)b)..x/K
+/(?=a(*THEN:A)b)..x/mark
     abxy
  0: abx
 MK: A
-    ** Failers
-No match
+\= Expect no match
     abpq  
 No match
 
-/(?=a(*THEN:A)b)..(*:Y)x/K
+/(?=a(*THEN:A)b)..(*:Y)x/mark
     abxy
  0: abx
 MK: Y
-    ** Failers
-No match
+\= Expect no match
     abpq  
 No match
 
@@ -8685,6 +8386,7 @@
  2: 
 
 /(another)?(\1+)test/
+\= Expect no match
     hello world test
 No match
 
@@ -8693,12 +8395,12 @@
  0: aac
 
 /((?:a?)*)*c/
-  aac   
+    aac   
  0: aac
  1: 
 
 /((?>a?)*)*c/
-  aac   
+    aac   
  0: aac
  1: 
 
@@ -8710,22 +8412,6 @@
     aba
  0: aba
 
-/.*?a(*PRUNE)b/
-    aab
- 0: ab
-
-/.*?a(*PRUNE)b/s
-    aab
- 0: ab
-
-/^a(*PRUNE)b/s
-    aab
-No match
-
-/.*?a(*SKIP)b/
-    aab
- 0: ab
-
 /(?>.*?a)b/s
     aab
  0: ab
@@ -8735,6 +8421,7 @@
  0: ab
 
 /(?>^a)b/s
+\= Expect no match
     aab
 No match
 
@@ -8757,6 +8444,7 @@
  2: wxyz
 
 "(?>.*)foo"
+\= Expect no match
     abcdfooxyz
 No match
     
@@ -8773,41 +8461,41 @@
  0: ac
 
 /(?<=(*SKIP)ac)a/
+\= Expect no match
     aa
 No match
 
-/A(*MARK:A)A+(*SKIP:B)(B|Z) | AC/xK
+/A(*MARK:A)A+(*SKIP:B)(B|Z) | AC/x,mark
     AAAC
  0: AC
 
-/a(*SKIP:m)x|ac(*:n)(*SKIP:n)d|ac/K
+/a(*SKIP:m)x|ac(*:n)(*SKIP:n)d|ac/mark
     acacd
  0: acd
 MK: n
 
-/A(*SKIP:m)x|A(*SKIP:n)x|AB/K
+/A(*SKIP:m)x|A(*SKIP:n)x|AB/mark
     AB
  0: AB
 
-/((*SKIP:r)d){0}a(*SKIP:m)x|ac(*:n)|ac/K
+/((*SKIP:r)d){0}a(*SKIP:m)x|ac(*:n)|ac/mark
     acacd
  0: ac
 MK: n
 
-/-- Tests that try to figure out how Perl works. My hypothesis is that the
-    first verb that is backtracked onto is the one that acts. This seems to be
-    the case almost all the time, but there is one exception that is perhaps a 
-    bug. --/
+# Tests that try to figure out how Perl works. My hypothesis is that the first
+# verb that is backtracked onto is the one that acts. This seems to be the case
+# almost all the time, but there is one exception that is perhaps a bug.
 
-/-- This matches "aaaac"; each PRUNE advances one character until the subject
-    no longer starts with 5 'a's. --/
+# This matches "aaaac"; each PRUNE advances one character until the subject no
+# longer starts with 5 'a's.
 
 /aaaaa(*PRUNE)b|a+c/
     aaaaaac
  0: aaaac
 
-/-- Putting SKIP in front of PRUNE makes no difference, as it is never 
-backtracked onto, whether or not it has a label. --/
+# Putting SKIP in front of PRUNE makes no difference, as it is never
+# backtracked onto, whether or not it has a label.
 
 /aaaaa(*SKIP)(*PRUNE)b|a+c/
     aaaaaac
@@ -8821,80 +8509,79 @@
     aaaaaac
  0: aaaac
 
-/-- Putting THEN in front makes no difference. */
+# Putting THEN in front makes no difference.
     
 /aaaaa(*THEN)(*PRUNE)b|a+c/
     aaaaaac
  0: aaaac
  
-/-- However, putting COMMIT in front of the prune changes it to "no match". I 
-    think this is inconsistent and possibly a bug. For the moment, running this
-    test is moved out of the Perl-compatible file. --/
+# However, putting COMMIT in front of the prune changes it to "no match". I 
+# think this is inconsistent and possibly a bug. For the moment, running this
+# test is moved out of the Perl-compatible file. 
 
 /aaaaa(*COMMIT)(*PRUNE)b|a+c/
     
+# OK, lets play the same game again using SKIP instead of PRUNE.
 
-/---- OK, lets play the same game again using SKIP instead of PRUNE. ----/
-
-/-- This matches "ac" because SKIP forces the next match to start on the
-    sixth "a". --/
+# This matches "ac" because SKIP forces the next match to start on the
+# sixth "a". 
 
 /aaaaa(*SKIP)b|a+c/
     aaaaaac
  0: ac
  
-/-- Putting PRUNE in front makes no difference. --/
+# Putting PRUNE in front makes no difference. 
 
 /aaaaa(*PRUNE)(*SKIP)b|a+c/
     aaaaaac
  0: ac
 
-/-- Putting THEN in front makes no difference. --/
+# Putting THEN in front makes no difference. 
 
 /aaaaa(*THEN)(*SKIP)b|a+c/
     aaaaaac
  0: ac
 
-/-- In this case, neither does COMMIT. This still matches "ac". --/
+# In this case, neither does COMMIT. This still matches "ac". 
 
 /aaaaa(*COMMIT)(*SKIP)b|a+c/
     aaaaaac
  0: ac
     
-/-- This gives "no match", as expected. --/
+# This gives "no match", as expected. 
 
 /aaaaa(*COMMIT)b|a+c/
+\= Expect no match
     aaaaaac
 No match
-    
 
-/------ Tests using THEN ------/
+# ---- Tests using THEN ----
 
-/-- This matches "aaaaaac", as expected. --/
+# This matches "aaaaaac", as expected. 
 
 /aaaaa(*THEN)b|a+c/
     aaaaaac
  0: aaaaaac
 
-/-- Putting SKIP in front makes no difference. --/
+# Putting SKIP in front makes no difference. 
 
 /aaaaa(*SKIP)(*THEN)b|a+c/
     aaaaaac
  0: aaaaaac
     
-/-- Putting PRUNE in front makes no difference. --/
+# Putting PRUNE in front makes no difference. 
 
 /aaaaa(*PRUNE)(*THEN)b|a+c/
     aaaaaac
  0: aaaaaac
     
-/-- Putting COMMIT in front makes no difference. --/
+# Putting COMMIT in front makes no difference. 
 
 /aaaaa(*COMMIT)(*THEN)b|a+c/
     aaaaaac
  0: aaaaaac
     
-/-- End of "priority" tests --/ 
+# End of "priority" tests  
 
 /aaaaa(*:m)(*PRUNE:m)(*SKIP:m)m|a+/
     aaaaaa
@@ -8928,7 +8615,7 @@
     aaaac
  0: ac
 
-/a(*:m)a(*COMMIT)(*SKIP:m)b|a+c/K
+/a(*:m)a(*COMMIT)(*SKIP:m)b|a+c/mark
     aaaaaac
  0: ac
 
@@ -8941,6 +8628,7 @@
     abc
  0: abc
  1: ab
+\= Expect no match
     abd
 No match
 
@@ -8957,10 +8645,11 @@
  0: abd
 
 /a(?=b(*COMMIT)c)[^d]|abd/
+    abc
+ 0: ab
+\= Expect no match
     abd
 No match
-    abc 
- 0: ab
 
 /a(?=bc).|abd/
     abd
@@ -8969,6 +8658,7 @@
  0: ab
     
 /a(?>b(*COMMIT)c)d|abd/
+\= Expect no match
     abceabd 
 No match
 
@@ -8981,6 +8671,7 @@
  0: abd
 
 /(?>a(*COMMIT)c)d|abd/
+\= Expect no match
     abd
 No match
 
@@ -8990,12 +8681,11 @@
  1: <unset>
  2: c
     
-/-- These tests were formerly in test 2, but changes in PCRE and Perl have
-    made them compatible. --/
+# These tests were formerly in test 2, but changes in PCRE and Perl have
+# made them compatible. 
     
 /^(a)?(?(1)a|b)+$/
-    *** Failers
-No match
+\= Expect no match
     a
 No match
 
@@ -9015,8 +8705,8 @@
     abcd
  0: abcd
 
-
-/A(*PRUNE:A)A+(*SKIP:A)(B|Z) | AC/xK
+/A(*PRUNE:A)A+(*SKIP:A)(B|Z) | AC/x,mark
+\= Expect no match
     AAAC
 No match, mark = A
 
@@ -9024,75 +8714,89 @@
     abcd
  0: abcd
  1: abcd
-    *** Failers 
-No match
+\= Expect no match 
     abcxy 
 No match
     
 /^((yes|no)(*THEN)(*F))?/
-  yes
+\= Expect no match
+    yes
 No match
 
 /(A (.*)   C? (*THEN)  | A D) (*FAIL)/x
-AbcdCBefgBhiBqz
+\= Expect no match
+    AbcdCBefgBhiBqz
 No match
 
 /(A (.*)   C? (*THEN)  | A D) z/x
-AbcdCBefgBhiBqz
+\= Expect no match
+    AbcdCBefgBhiBqz
 No match
 
 /(A (.*)   C? (*THEN)  | A D) \s* (*FAIL)/x
-AbcdCBefgBhiBqz
+\= Expect no match
+    AbcdCBefgBhiBqz
 No match
 
 /(A (.*)   C? (*THEN)  | A D) \s* z/x
-AbcdCBefgBhiBqz
+\= Expect no match
+    AbcdCBefgBhiBqz
 No match
 
 /(A (.*)   (?:C|) (*THEN)  | A D) (*FAIL)/x
-AbcdCBefgBhiBqz
+\= Expect no match
+    AbcdCBefgBhiBqz
 No match
 
 /(A (.*)   (?:C|) (*THEN)  | A D) z/x
-AbcdCBefgBhiBqz
+\= Expect no match
+    AbcdCBefgBhiBqz
 No match
 
 /(A (.*)   C{0,6} (*THEN)  | A D) (*FAIL)/x
-AbcdCBefgBhiBqz
+\= Expect no match
+    AbcdCBefgBhiBqz
 No match
 
 /(A (.*)   C{0,6} (*THEN)  | A D) z/x
-AbcdCBefgBhiBqz
+\= Expect no match
+    AbcdCBefgBhiBqz
 No match
 
 /(A (.*)   (CE){0,6} (*THEN)  | A D) (*FAIL)/x
-AbcdCEBefgBhiBqz
+\= Expect no match
+    AbcdCEBefgBhiBqz
 No match
 
 /(A (.*)   (CE){0,6} (*THEN)  | A D) z/x
-AbcdCEBefgBhiBqz
+\= Expect no match
+    AbcdCEBefgBhiBqz
 No match
 
 /(A (.*)   (CE*){0,6} (*THEN)  | A D) (*FAIL)/x
-AbcdCBefgBhiBqz
+\= Expect no match
+    AbcdCBefgBhiBqz
 No match
 
 /(A (.*)   (CE*){0,6} (*THEN)  | A D) z/x
-AbcdCBefgBhiBqz
+\= Expect no match
+    AbcdCBefgBhiBqz
 No match
 
 /(?=a(*COMMIT)b|ac)ac|ac/
+\= Expect no match
     ac
 No match
 
 /(?=a(*COMMIT)b|(ac)) ac | (a)c/x
+\= Expect no match
     ac
 No match
 
-/--------/
+# ----
 
 /(?(?!b(*THEN)a)bn|bnn)/
-   bnn 
+    bnn 
  0: bn
 
 /(?!b(*SKIP)a)bn|bnn/
@@ -9100,7 +8804,7 @@
  0: bn
     
 /(?(?!b(*SKIP)a)bn|bnn)/
-   bnn 
+    bnn 
  0: bn
 
 /(?!b(*PRUNE)a)bn|bnn/
@@ -9108,7 +8812,7 @@
  0: bn
     
 /(?(?!b(*PRUNE)a)bn|bnn)/
-   bnn 
+    bnn 
  0: bn
    
 /(?!b(*COMMIT)a)bn|bnn/
@@ -9120,6 +8824,7 @@
  0: bn
 
 /(?=b(*SKIP)a)bn|bnn/
+\= Expect no match
     bnn
 No match
 
@@ -9127,32 +8832,32 @@
     bnn
  0: bnn
     
- /^(?!a(*SKIP)b)/
-     ac
+/^(?!a(*SKIP)b)/
+    ac
  0: 
 
- /^(?!a(*SKIP)b)../
-     acd
+/^(?!a(*SKIP)b)../
+    acd
  0: ac
 
 /(?!a(*SKIP)b)../
-     acd
+    acd
  0: ac
 
 /^(?(?!a(*SKIP)b))/
-     ac
+    ac
  0: 
 
 /^(?!a(*PRUNE)b)../
-     acd
+    acd
  0: ac
 
 /(?!a(*PRUNE)b)../
-     acd
+    acd
  0: ac
 
- /(?!a(*COMMIT)b)ac|cd/
-     ac
+/(?!a(*COMMIT)b)ac|cd/
+    ac
  0: ac
 
 /\A.*?(?:a|bc)/
@@ -9164,21 +8869,21 @@
  0: CD
  1: CD
 
-/(*:m(m)(?&y)(?(DEFINE)(?<y>b))/K
+/(*:m(m)(?&y)(?(DEFINE)(?<y>b))/mark
     abc
  0: b
 MK: m(m
 
-/(*PRUNE:m(m)(?&y)(?(DEFINE)(?<y>b))/K
+/(*PRUNE:m(m)(?&y)(?(DEFINE)(?<y>b))/mark
     abc
  0: b
 MK: m(m
 
-/(*SKIP:m(m)(?&y)(?(DEFINE)(?<y>b))/K
+/(*SKIP:m(m)(?&y)(?(DEFINE)(?<y>b))/mark
     abc
  0: b
 
-/(*THEN:m(m)(?&y)(?(DEFINE)(?<y>b))/K
+/(*THEN:m(m)(?&y)(?(DEFINE)(?<y>b))/mark
     abc
  0: b
 MK: m(m
@@ -9186,42 +8891,39 @@
 /^\d*\w{4}/
     1234
  0: 1234
+\= Expect no match
     123 
 No match
 
 /^[^b]*\w{4}/
     aaaa
  0: aaaa
+\= Expect no match
     aaa     
 No match
 
 /^[^b]*\w{4}/i
     aaaa
  0: aaaa
+\= Expect no match
     aaa     
 No match
 
 /^a*\w{4}/
     aaaa
  0: aaaa
+\= Expect no match
     aaa     
 No match
 
 /^a*\w{4}/i
     aaaa
  0: aaaa
+\= Expect no match
     aaa     
 No match
 
-/(?(?=ab)ab)/+
-    ca
- 0: 
- 0+ ca
-    cd 
- 0: 
- 0+ cd
-
-/(?:(?<n>foo)|(?<n>bar))\k<n>/J
+/(?:(?<n>foo)|(?<n>bar))\k<n>/dupnames
     foofoo
  0: foofoo
  1: foo
@@ -9230,7 +8932,7 @@
  1: <unset>
  2: bar
 
-/(?<n>A)(?:(?<n>foo)|(?<n>bar))\k<n>/J
+/(?<n>A)(?:(?<n>foo)|(?<n>bar))\k<n>/dupnames
     AfooA
  0: AfooA
  1: A
@@ -9240,8 +8942,7 @@
  1: A
  2: <unset>
  3: bar
-    ** Failers 
-No match
+\= Expect no match 
     Afoofoo
 No match
     Abarbar
@@ -9254,7 +8955,7 @@
  2: non-sp1
  3: non-sp2
 
-/^ (?:(?<A>A)|(?'B'B)(?<A>A)) (?('A')x) (?(<B>)y)$/xJ
+/^ (?:(?<A>A)|(?'B'B)(?<A>A)) (?('A')x) (?(<B>)y)$/x,dupnames
     Ax
  0: Ax
  1: A
@@ -9296,34 +8997,35 @@
  0: aaaab
  1: aaaa
 
-/(?:a\Kb)*+/+
+/(?:a\Kb)*+/aftertext
     ababc
  0: b
  0+ c
 
-/(?>a\Kb)*/+
+/(?>a\Kb)*/aftertext
     ababc
  0: b
  0+ c
 
-/(?:a\Kb)*/+
+/(?:a\Kb)*/aftertext
     ababc
  0: b
  0+ c
 
-/(a\Kb)*+/+
+/(a\Kb)*+/aftertext
     ababc
  0: b
  0+ c
  1: ab
 
-/(a\Kb)*/+
+/(a\Kb)*/aftertext
     ababc
  0: b
  0+ c
  1: ab
 
 /(?:x|(?:(xx|yy)+|x|x|x|x|x)|a|a|a)bc/
+\= Expect no match
     acb
 No match
 
@@ -9346,10 +9048,10 @@
  2: 
 
 /^\w+(?>\s*)(?<=\w)/
-  test test
+    test test
  0: tes
 
-/(?P<same>a)(?P<same>b)/gJ
+/(?P<same>a)(?P<same>b)/g,dupnames
     abbaba
  0: ab
  1: a
@@ -9358,13 +9060,13 @@
  1: a
  2: b
 
-/(?P<same>a)(?P<same>b)(?P=same)/gJ
+/(?P<same>a)(?P<same>b)(?P=same)/g,dupnames
     abbaba
  0: aba
  1: a
  2: b
 
-/(?P=same)?(?P<same>a)(?P<same>b)/gJ
+/(?P=same)?(?P<same>a)(?P<same>b)/g,dupnames
     abbaba
  0: ab
  1: a
@@ -9373,7 +9075,7 @@
  1: a
  2: b
 
-/(?:(?P=same)?(?:(?P<same>a)|(?P<same>b))(?P=same))+/gJ
+/(?:(?P=same)?(?:(?P<same>a)|(?P<same>b))(?P=same))+/g,dupnames
     bbbaaabaabb
  0: bbbaaaba
  1: a
@@ -9382,7 +9084,8 @@
  1: <unset>
  2: b
 
-/(?:(?P=same)?(?:(?P=same)(?P<same>a)(?P=same)|(?P=same)?(?P<same>b)(?P=same)){2}(?P=same)(?P<same>c)(?P=same)){2}(?P<same>z)?/gJ
+/(?:(?P=same)?(?:(?P=same)(?P<same>a)(?P=same)|(?P=same)?(?P<same>b)(?P=same)){2}(?P=same)(?P<same>c)(?P=same)){2}(?P<same>z)?/g,dupnames
+\= Expect no match
     bbbaaaccccaaabbbcc
 No match
 
@@ -9411,6 +9114,44 @@
     aa]]
  0: aa]]
 
+/A((((((((a))))))))\8B/ 
+    AaaB
+ 0: AaaB
+ 1: a
+ 2: a
+ 3: a
+ 4: a
+ 5: a
+ 6: a
+ 7: a
+ 8: a
+
+/A(((((((((a)))))))))\9B/ 
+    AaaB
+ 0: AaaB
+ 1: a
+ 2: a
+ 3: a
+ 4: a
+ 5: a
+ 6: a
+ 7: a
+ 8: a
+ 9: a
+    
+/A[\8\9]B/
+    A8B
+ 0: A8B
+    A9B  
+ 0: A9B
+
+/(|ab)*?d/
+   abd
+ 0: abd
+ 1: ab
+   xyd 
+ 0: d
+
 /(?:((abcd))|(((?:(?:(?:(?:abc|(?:abcdef))))b)abcdefghi)abc)|((*ACCEPT)))/
     1234abcd
  0: 
@@ -9420,6 +9161,12 @@
  4: <unset>
  5: 
 
+/(\2|a)(\1)/
+    aaa
+ 0: aa
+ 1: a
+ 2: a
+
 /(\2)(\1)/
 
 "Z*(|d*){216}"
@@ -9429,9 +9176,85 @@
  0: aaaaaaaaa
  1: a
 
+/((((((((((((x))))))))))))\12/
+    xx
+ 0: xx
+ 1: x
+ 2: x
+ 3: x
+ 4: x
+ 5: x
+ 6: x
+ 7: x
+ 8: x
+ 9: x
+10: x
+11: x
+12: x
+
+/A[\8]B[\9]C/
+    A8B9C
+ 0: A8B9C
+
+/(?1)()((((((\1++))\x85)+)|))/
+    \x85\x85
+ 0: \x85\x85
+ 1: 
+ 2: \x85\x85
+ 3: \x85\x85
+ 4: \x85\x85
+ 5: \x85
+ 6: 
+ 7: 
+
 "(?|(\k'Pm')|(?'Pm'))"
     abcd
  0: 
  1: 
 
-/-- End of testinput1 --/
+/(?|(aaa)|(b))\g{1}/
+    aaaaaa
+ 0: aaaaaa
+ 1: aaa
+    bb 
+ 0: bb
+ 1: b
+
+/(?|(aaa)|(b))(?1)/
+    aaaaaa
+ 0: aaaaaa
+ 1: aaa
+    baaa 
+ 0: baaa
+ 1: b
+\= Expect no match 
+    bb 
+No match
+
+/(?|(aaa)|(b))/
+    xaaa
+ 0: aaa
+ 1: aaa
+    xbc 
+ 0: b
+ 1: b
+
+/(?|(?'a'aaa)|(?'a'b))\k'a'/
+    aaaaaa
+ 0: aaaaaa
+ 1: aaa
+    bb 
+ 0: bb
+ 1: b
+
+/(?|(?'a'aaa)|(?'a'b))(?'a'cccc)\k'a'/dupnames
+    aaaccccaaa
+ 0: aaaccccaaa
+ 1: aaa
+ 2: cccc
+    bccccb 
+ 0: bccccb
+ 1: b
+ 2: cccc
+
+# End of testinput1 
diff --git a/dist2/testdata/testoutput10 b/dist2/testdata/testoutput10
new file mode 100644
index 0000000..9761f0f
--- /dev/null
+++ b/dist2/testdata/testoutput10
@@ -0,0 +1,1542 @@
+# This set of tests is for UTF-8 support and Unicode property support, with
+# relevance only for the 8-bit library.
+
+# The next 4 patterns have UTF-8 errors
+
+/[Ã]/utf
+Failed: error -8 at offset 1: UTF-8 error: byte 2 top bits not 0x80
+
+/Ã/utf
+Failed: error -3 at offset 0: UTF-8 error: 1 byte missing at end
+
+/ÃÃÃxxx/utf
+Failed: error -8 at offset 0: UTF-8 error: byte 2 top bits not 0x80
+
+/‚‚‚‚‚‚‚Ã/utf
+Failed: error -22 at offset 2: UTF-8 error: isolated byte with 0x80 bit set
+
+# Now test subjects
+
+/badutf/utf
+\= Expect UTF-8 errors
+    X\xdf
+Failed: error -3: UTF-8 error: 1 byte missing at end at offset 1
+    XX\xef
+Failed: error -4: UTF-8 error: 2 bytes missing at end at offset 2
+    XXX\xef\x80
+Failed: error -3: UTF-8 error: 1 byte missing at end at offset 3
+    X\xf7
+Failed: error -5: UTF-8 error: 3 bytes missing at end at offset 1
+    XX\xf7\x80
+Failed: error -4: UTF-8 error: 2 bytes missing at end at offset 2
+    XXX\xf7\x80\x80
+Failed: error -3: UTF-8 error: 1 byte missing at end at offset 3
+    \xfb
+Failed: error -6: UTF-8 error: 4 bytes missing at end at offset 0
+    \xfb\x80
+Failed: error -5: UTF-8 error: 3 bytes missing at end at offset 0
+    \xfb\x80\x80
+Failed: error -4: UTF-8 error: 2 bytes missing at end at offset 0
+    \xfb\x80\x80\x80
+Failed: error -3: UTF-8 error: 1 byte missing at end at offset 0
+    \xfd
+Failed: error -7: UTF-8 error: 5 bytes missing at end at offset 0
+    \xfd\x80
+Failed: error -6: UTF-8 error: 4 bytes missing at end at offset 0
+    \xfd\x80\x80
+Failed: error -5: UTF-8 error: 3 bytes missing at end at offset 0
+    \xfd\x80\x80\x80
+Failed: error -4: UTF-8 error: 2 bytes missing at end at offset 0
+    \xfd\x80\x80\x80\x80
+Failed: error -3: UTF-8 error: 1 byte missing at end at offset 0
+    \xdf\x7f
+Failed: error -8: UTF-8 error: byte 2 top bits not 0x80 at offset 0
+    \xef\x7f\x80
+Failed: error -8: UTF-8 error: byte 2 top bits not 0x80 at offset 0
+    \xef\x80\x7f
+Failed: error -9: UTF-8 error: byte 3 top bits not 0x80 at offset 0
+    \xf7\x7f\x80\x80
+Failed: error -8: UTF-8 error: byte 2 top bits not 0x80 at offset 0
+    \xf7\x80\x7f\x80
+Failed: error -9: UTF-8 error: byte 3 top bits not 0x80 at offset 0
+    \xf7\x80\x80\x7f
+Failed: error -10: UTF-8 error: byte 4 top bits not 0x80 at offset 0
+    \xfb\x7f\x80\x80\x80
+Failed: error -8: UTF-8 error: byte 2 top bits not 0x80 at offset 0
+    \xfb\x80\x7f\x80\x80
+Failed: error -9: UTF-8 error: byte 3 top bits not 0x80 at offset 0
+    \xfb\x80\x80\x7f\x80
+Failed: error -10: UTF-8 error: byte 4 top bits not 0x80 at offset 0
+    \xfb\x80\x80\x80\x7f
+Failed: error -11: UTF-8 error: byte 5 top bits not 0x80 at offset 0
+    \xfd\x7f\x80\x80\x80\x80
+Failed: error -8: UTF-8 error: byte 2 top bits not 0x80 at offset 0
+    \xfd\x80\x7f\x80\x80\x80
+Failed: error -9: UTF-8 error: byte 3 top bits not 0x80 at offset 0
+    \xfd\x80\x80\x7f\x80\x80
+Failed: error -10: UTF-8 error: byte 4 top bits not 0x80 at offset 0
+    \xfd\x80\x80\x80\x7f\x80
+Failed: error -11: UTF-8 error: byte 5 top bits not 0x80 at offset 0
+    \xfd\x80\x80\x80\x80\x7f
+Failed: error -12: UTF-8 error: byte 6 top bits not 0x80 at offset 0
+    \xed\xa0\x80
+Failed: error -16: UTF-8 error: code points 0xd800-0xdfff are not defined at offset 0
+    \xc0\x8f
+Failed: error -17: UTF-8 error: overlong 2-byte sequence at offset 0
+    \xe0\x80\x8f
+Failed: error -18: UTF-8 error: overlong 3-byte sequence at offset 0
+    \xf0\x80\x80\x8f
+Failed: error -19: UTF-8 error: overlong 4-byte sequence at offset 0
+    \xf8\x80\x80\x80\x8f
+Failed: error -20: UTF-8 error: overlong 5-byte sequence at offset 0
+    \xfc\x80\x80\x80\x80\x8f
+Failed: error -21: UTF-8 error: overlong 6-byte sequence at offset 0
+    \x80
+Failed: error -22: UTF-8 error: isolated byte with 0x80 bit set at offset 0
+    \xfe
+Failed: error -23: UTF-8 error: illegal byte (0xfe or 0xff) at offset 0
+    \xff
+Failed: error -23: UTF-8 error: illegal byte (0xfe or 0xff) at offset 0
+
+/badutf/utf
+\= Expect UTF-8 errors
+    XX\xfb\x80\x80\x80\x80
+Failed: error -13: UTF-8 error: 5-byte character is not allowed (RFC 3629) at offset 2
+    XX\xfd\x80\x80\x80\x80\x80
+Failed: error -14: UTF-8 error: 6-byte character is not allowed (RFC 3629) at offset 2
+    XX\xf7\xbf\xbf\xbf
+Failed: error -15: UTF-8 error: code points greater than 0x10ffff are not defined at offset 2
+
+/shortutf/utf
+\= Expect UTF-8 errors
+    XX\xdf\=ph
+Failed: error -3: UTF-8 error: 1 byte missing at end at offset 2
+    XX\xef\=ph
+Failed: error -4: UTF-8 error: 2 bytes missing at end at offset 2
+    XX\xef\x80\=ph
+Failed: error -3: UTF-8 error: 1 byte missing at end at offset 2
+    \xf7\=ph
+Failed: error -5: UTF-8 error: 3 bytes missing at end at offset 0
+    \xf7\x80\=ph
+Failed: error -4: UTF-8 error: 2 bytes missing at end at offset 0
+    \xf7\x80\x80\=ph
+Failed: error -3: UTF-8 error: 1 byte missing at end at offset 0
+    \xfb\=ph
+Failed: error -6: UTF-8 error: 4 bytes missing at end at offset 0
+    \xfb\x80\=ph
+Failed: error -5: UTF-8 error: 3 bytes missing at end at offset 0
+    \xfb\x80\x80\=ph
+Failed: error -4: UTF-8 error: 2 bytes missing at end at offset 0
+    \xfb\x80\x80\x80\=ph
+Failed: error -3: UTF-8 error: 1 byte missing at end at offset 0
+    \xfd\=ph
+Failed: error -7: UTF-8 error: 5 bytes missing at end at offset 0
+    \xfd\x80\=ph
+Failed: error -6: UTF-8 error: 4 bytes missing at end at offset 0
+    \xfd\x80\x80\=ph
+Failed: error -5: UTF-8 error: 3 bytes missing at end at offset 0
+    \xfd\x80\x80\x80\=ph
+Failed: error -4: UTF-8 error: 2 bytes missing at end at offset 0
+    \xfd\x80\x80\x80\x80\=ph
+Failed: error -3: UTF-8 error: 1 byte missing at end at offset 0
+
+/anything/utf
+\= Expect UTF-8 errors
+    X\xc0\x80
+Failed: error -17: UTF-8 error: overlong 2-byte sequence at offset 1
+    XX\xc1\x8f
+Failed: error -17: UTF-8 error: overlong 2-byte sequence at offset 2
+    XXX\xe0\x9f\x80
+Failed: error -18: UTF-8 error: overlong 3-byte sequence at offset 3
+    \xf0\x8f\x80\x80
+Failed: error -19: UTF-8 error: overlong 4-byte sequence at offset 0
+    \xf8\x87\x80\x80\x80
+Failed: error -20: UTF-8 error: overlong 5-byte sequence at offset 0
+    \xfc\x83\x80\x80\x80\x80
+Failed: error -21: UTF-8 error: overlong 6-byte sequence at offset 0
+    \xfe\x80\x80\x80\x80\x80
+Failed: error -23: UTF-8 error: illegal byte (0xfe or 0xff) at offset 0
+    \xff\x80\x80\x80\x80\x80
+Failed: error -23: UTF-8 error: illegal byte (0xfe or 0xff) at offset 0
+    \xf8\x88\x80\x80\x80
+Failed: error -13: UTF-8 error: 5-byte character is not allowed (RFC 3629) at offset 0
+    \xf9\x87\x80\x80\x80
+Failed: error -13: UTF-8 error: 5-byte character is not allowed (RFC 3629) at offset 0
+    \xfc\x84\x80\x80\x80\x80
+Failed: error -14: UTF-8 error: 6-byte character is not allowed (RFC 3629) at offset 0
+    \xfd\x83\x80\x80\x80\x80
+Failed: error -14: UTF-8 error: 6-byte character is not allowed (RFC 3629) at offset 0
+\= Expect no match
+    \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_utf_check
+No match
+    \xf9\x87\x80\x80\x80\=no_utf_check
+No match
+    \xfc\x84\x80\x80\x80\x80\=no_utf_check
+No match
+    \xfd\x83\x80\x80\x80\x80\=no_utf_check
+No match
+    
+# Similar tests with offsets
+
+/badutf/utf
+\= Expect UTF-8 errors
+    X\xdfabcd
+Failed: error -8: UTF-8 error: byte 2 top bits not 0x80 at offset 1
+    X\xdfabcd\=offset=1
+Failed: error -8: UTF-8 error: byte 2 top bits not 0x80 at offset 1
+\= Expect no match
+    X\xdfabcd\=offset=2
+No match
+
+/(?<=x)badutf/utf
+\= Expect UTF-8 errors
+    X\xdfabcd
+Failed: error -8: UTF-8 error: byte 2 top bits not 0x80 at offset 1
+    X\xdfabcd\=offset=1
+Failed: error -8: UTF-8 error: byte 2 top bits not 0x80 at offset 1
+    X\xdfabcd\=offset=2
+Failed: error -8: UTF-8 error: byte 2 top bits not 0x80 at offset 1
+    X\xdfabcd\xdf\=offset=3
+Failed: error -3: UTF-8 error: 1 byte missing at end at offset 6
+\= Expect no match
+    X\xdfabcd\=offset=3
+No match
+
+/(?<=xx)badutf/utf
+\= Expect UTF-8 errors
+    X\xdfabcd
+Failed: error -8: UTF-8 error: byte 2 top bits not 0x80 at offset 1
+    X\xdfabcd\=offset=1
+Failed: error -8: UTF-8 error: byte 2 top bits not 0x80 at offset 1
+    X\xdfabcd\=offset=2
+Failed: error -8: UTF-8 error: byte 2 top bits not 0x80 at offset 1
+    X\xdfabcd\=offset=3
+Failed: error -8: UTF-8 error: byte 2 top bits not 0x80 at offset 1
+
+/(?<=xxxx)badutf/utf
+\= Expect UTF-8 errors
+    X\xdfabcd
+Failed: error -8: UTF-8 error: byte 2 top bits not 0x80 at offset 1
+    X\xdfabcd\=offset=1
+Failed: error -8: UTF-8 error: byte 2 top bits not 0x80 at offset 1
+    X\xdfabcd\=offset=2
+Failed: error -8: UTF-8 error: byte 2 top bits not 0x80 at offset 1
+    X\xdfabcd\=offset=3
+Failed: error -8: UTF-8 error: byte 2 top bits not 0x80 at offset 1
+    X\xdfabc\xdf\=offset=6
+Failed: error -3: UTF-8 error: 1 byte missing at end at offset 5
+    X\xdfabc\xdf\=offset=7
+Failed: error -33: bad offset value
+\= Expect no match
+    X\xdfabcd\=offset=6
+No match
+ 
+/\x{100}/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{100}
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = \xc4
+Last code unit = \x80
+Subject length lower bound = 1
+
+/\x{1000}/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{1000}
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = \xe1
+Last code unit = \x80
+Subject length lower bound = 1
+
+/\x{10000}/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{10000}
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = \xf0
+Last code unit = \x80
+Subject length lower bound = 1
+
+/\x{100000}/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{100000}
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = \xf4
+Last code unit = \x80
+Subject length lower bound = 1
+
+/\x{10ffff}/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{10ffff}
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = \xf4
+Last code unit = \xbf
+Subject length lower bound = 1
+
+/[\x{ff}]/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{ff}
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = \xc3
+Last code unit = \xbf
+Subject length lower bound = 1
+
+/[\x{100}]/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{100}
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = \xc4
+Last code unit = \x80
+Subject length lower bound = 1
+
+/\x80/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{80}
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = \xc2
+Last code unit = \x80
+Subject length lower bound = 1
+
+/\xff/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{ff}
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = \xc3
+Last code unit = \xbf
+Subject length lower bound = 1
+
+/\x{D55c}\x{ad6d}\x{C5B4}/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{d55c}\x{ad6d}\x{c5b4}
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = \xed
+Last code unit = \xb4
+Subject length lower bound = 3
+    \x{D55c}\x{ad6d}\x{C5B4}
+ 0: \x{d55c}\x{ad6d}\x{c5b4}
+
+/\x{65e5}\x{672c}\x{8a9e}/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{65e5}\x{672c}\x{8a9e}
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = \xe6
+Last code unit = \x9e
+Subject length lower bound = 3
+    \x{65e5}\x{672c}\x{8a9e}
+ 0: \x{65e5}\x{672c}\x{8a9e}
+
+/\x{80}/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{80}
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = \xc2
+Last code unit = \x80
+Subject length lower bound = 1
+
+/\x{084}/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{84}
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = \xc2
+Last code unit = \x84
+Subject length lower bound = 1
+
+/\x{104}/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{104}
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = \xc4
+Last code unit = \x84
+Subject length lower bound = 1
+
+/\x{861}/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{861}
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = \xe0
+Last code unit = \xa1
+Subject length lower bound = 1
+
+/\x{212ab}/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{212ab}
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = \xf0
+Last code unit = \xab
+Subject length lower bound = 1
+
+/[^ab\xC0-\xF0]/IB,utf
+------------------------------------------------------------------
+        Bra
+        [\x00-`c-\xbf\xf1-\xff] (neg)
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+Starting code units: \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 
+  \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 
+Subject length lower bound = 1
+    \x{f1}
+ 0: \x{f1}
+    \x{bf}
+ 0: \x{bf}
+    \x{100}
+ 0: \x{100}
+    \x{1000}
+ 0: \x{1000}
+\= Expect no match
+    \x{c0}
+No match
+    \x{f0}
+No match
+
+/Ā{3,4}/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{100}{3}
+        \x{100}?+
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = \xc4
+Last code unit = \x80
+Subject length lower bound = 3
+  \x{100}\x{100}\x{100}\x{100\x{100}
+ 0: \x{100}\x{100}\x{100}
+
+/(\x{100}+|x)/IB,utf
+------------------------------------------------------------------
+        Bra
+        CBra 1
+        \x{100}++
+        Alt
+        x
+        Ket
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 1
+Options: utf
+Starting code units: x \xc4 
+Subject length lower bound = 1
+
+/(\x{100}*a|x)/IB,utf
+------------------------------------------------------------------
+        Bra
+        CBra 1
+        \x{100}*+
+        a
+        Alt
+        x
+        Ket
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 1
+Options: utf
+Starting code units: a x \xc4 
+Subject length lower bound = 1
+
+/(\x{100}{0,2}a|x)/IB,utf
+------------------------------------------------------------------
+        Bra
+        CBra 1
+        \x{100}{0,2}+
+        a
+        Alt
+        x
+        Ket
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 1
+Options: utf
+Starting code units: a x \xc4 
+Subject length lower bound = 1
+
+/(\x{100}{1,2}a|x)/IB,utf
+------------------------------------------------------------------
+        Bra
+        CBra 1
+        \x{100}
+        \x{100}{0,1}+
+        a
+        Alt
+        x
+        Ket
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 1
+Options: utf
+Starting code units: x \xc4 
+Subject length lower bound = 1
+
+/\x{100}/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{100}
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = \xc4
+Last code unit = \x80
+Subject length lower bound = 1
+
+/a\x{100}\x{101}*/IB,utf
+------------------------------------------------------------------
+        Bra
+        a\x{100}
+        \x{101}*+
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = 'a'
+Last code unit = \x80
+Subject length lower bound = 2
+
+/a\x{100}\x{101}+/IB,utf
+------------------------------------------------------------------
+        Bra
+        a\x{100}
+        \x{101}++
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = 'a'
+Last code unit = \x81
+Subject length lower bound = 3
+
+/[^\x{c4}]/IB
+------------------------------------------------------------------
+        Bra
+        [^\x{c4}]
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Subject length lower bound = 1
+
+/[\x{100}]/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{100}
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = \xc4
+Last code unit = \x80
+Subject length lower bound = 1
+    \x{100}
+ 0: \x{100}
+    Z\x{100}
+ 0: \x{100}
+    \x{100}Z
+ 0: \x{100}
+
+/[\xff]/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{ff}
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = \xc3
+Last code unit = \xbf
+Subject length lower bound = 1
+    >\x{ff}<
+ 0: \x{ff}
+
+/[^\xff]/IB,utf
+------------------------------------------------------------------
+        Bra
+        [^\x{ff}]
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+Subject length lower bound = 1
+
+/\x{100}abc(xyz(?1))/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{100}abc
+        CBra 1
+        xyz
+        Recurse
+        Ket
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 1
+Options: utf
+First code unit = \xc4
+Last code unit = 'z'
+Subject length lower bound = 7
+
+/\777/I,utf
+Capturing subpattern count = 0
+Options: utf
+First code unit = \xc7
+Last code unit = \xbf
+Subject length lower bound = 1
+  \x{1ff}
+ 0: \x{1ff}
+  \777
+ 0: \x{1ff}
+
+/\x{100}+\x{200}/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{100}++
+        \x{200}
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = \xc4
+Last code unit = \x80
+Subject length lower bound = 2
+
+/\x{100}+X/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{100}++
+        X
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = \xc4
+Last code unit = 'X'
+Subject length lower bound = 2
+
+/^[\QĀ\E-\QŐ\E/B,utf
+Failed: error 106 at offset 15: missing terminating ] for character class
+
+# This tests the stricter UTF-8 check according to RFC 3629.
+
+/X/utf
+\= Expect UTF-8 errors
+    \x{d800}
+Failed: error -16: UTF-8 error: code points 0xd800-0xdfff are not defined at offset 0
+    \x{da00}
+Failed: error -16: UTF-8 error: code points 0xd800-0xdfff are not defined at offset 0
+    \x{dfff}
+Failed: error -16: UTF-8 error: code points 0xd800-0xdfff are not defined at offset 0
+    \x{110000}
+Failed: error -15: UTF-8 error: code points greater than 0x10ffff are not defined at offset 0
+    \x{2000000}
+Failed: error -13: UTF-8 error: 5-byte character is not allowed (RFC 3629) at offset 0
+    \x{7fffffff}
+Failed: error -14: UTF-8 error: 6-byte character is not allowed (RFC 3629) at offset 0
+\= Expect no match
+    \x{d800}\=no_utf_check
+No match
+    \x{da00}\=no_utf_check
+No match
+    \x{dfff}\=no_utf_check
+No match
+    \x{110000}\=no_utf_check
+No match
+    \x{2000000}\=no_utf_check
+No match
+    \x{7fffffff}\=no_utf_check
+No match
+
+/(*UTF8)\x{1234}/
+    abcd\x{1234}pqr
+ 0: \x{1234}
+
+/(*CRLF)(*UTF)(*BSR_UNICODE)a\Rb/I
+Capturing subpattern count = 0
+Compile options: <none>
+Overall options: utf
+\R matches any Unicode newline
+Forced newline is CRLF
+First code unit = 'a'
+Last code unit = 'b'
+Subject length lower bound = 3
+
+/\h/I,utf
+Capturing subpattern count = 0
+Options: utf
+Starting code units: \x09 \x20 \xc2 \xe1 \xe2 \xe3 
+Subject length lower bound = 1
+    ABC\x{09}
+ 0: \x{09}
+    ABC\x{20}
+ 0:  
+    ABC\x{a0}
+ 0: \x{a0}
+    ABC\x{1680}
+ 0: \x{1680}
+    ABC\x{180e}
+ 0: \x{180e}
+    ABC\x{2000}
+ 0: \x{2000}
+    ABC\x{202f}
+ 0: \x{202f}
+    ABC\x{205f}
+ 0: \x{205f}
+    ABC\x{3000}
+ 0: \x{3000}
+
+/\v/I,utf
+Capturing subpattern count = 0
+Options: utf
+Starting code units: \x0a \x0b \x0c \x0d \xc2 \xe2 
+Subject length lower bound = 1
+    ABC\x{0a}
+ 0: \x{0a}
+    ABC\x{0b}
+ 0: \x{0b}
+    ABC\x{0c}
+ 0: \x{0c}
+    ABC\x{0d}
+ 0: \x{0d}
+    ABC\x{85}
+ 0: \x{85}
+    ABC\x{2028}
+ 0: \x{2028}
+
+/\h*A/I,utf
+Capturing subpattern count = 0
+Options: utf
+Starting code units: \x09 \x20 A \xc2 \xe1 \xe2 \xe3 
+Last code unit = 'A'
+Subject length lower bound = 1
+    CDBABC
+ 0: A
+
+/\v+A/I,utf
+Capturing subpattern count = 0
+Options: utf
+Starting code units: \x0a \x0b \x0c \x0d \xc2 \xe2 
+Last code unit = 'A'
+Subject length lower bound = 2
+
+/\s?xxx\s/I,utf
+Capturing subpattern count = 0
+Options: utf
+Starting code units: \x09 \x0a \x0b \x0c \x0d \x20 x 
+Last code unit = 'x'
+Subject length lower bound = 4
+
+/\sxxx\s/I,utf,tables=2
+Capturing subpattern count = 0
+Options: utf
+Starting code units: \x09 \x0a \x0b \x0c \x0d \x20 \xc2 
+Last code unit = 'x'
+Subject length lower bound = 5
+    AB\x{85}xxx\x{a0}XYZ
+ 0: \x{85}xxx\x{a0}
+    AB\x{a0}xxx\x{85}XYZ
+ 0: \x{a0}xxx\x{85}
+
+/\S \S/I,utf,tables=2
+Capturing subpattern count = 0
+Options: utf
+Starting code units: \x00 \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x0e \x0f 
+  \x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17 \x18 \x19 \x1a \x1b \x1c \x1d \x1e 
+  \x1f ! " # $ % & ' ( ) * + , - . / 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 { | } ~ \x7f \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 
+Last code unit = ' '
+Subject length lower bound = 3
+    \x{a2} \x{84}
+ 0: \x{a2} \x{84}
+    A Z
+ 0: A Z
+
+/a+/utf
+    a\x{123}aa\=offset=1
+ 0: aa
+    a\x{123}aa\=offset=3
+ 0: aa
+    a\x{123}aa\=offset=4
+ 0: a
+\= Expect bad offset value
+    a\x{123}aa\=offset=6
+Failed: error -33: bad offset value
+\= Expect bad UTF-8 offset     
+    a\x{123}aa\=offset=2
+Error -36 (bad UTF-8 offset)
+\= Expect no match
+    a\x{123}aa\=offset=5
+No match
+
+/\x{1234}+/Ii,utf
+Capturing subpattern count = 0
+Options: caseless utf
+Starting code units: \xe1 
+Subject length lower bound = 1
+
+/\x{1234}+?/Ii,utf
+Capturing subpattern count = 0
+Options: caseless utf
+Starting code units: \xe1 
+Subject length lower bound = 1
+
+/\x{1234}++/Ii,utf
+Capturing subpattern count = 0
+Options: caseless utf
+Starting code units: \xe1 
+Subject length lower bound = 1
+
+/\x{1234}{2}/Ii,utf
+Capturing subpattern count = 0
+Options: caseless utf
+Starting code units: \xe1 
+Subject length lower bound = 2
+
+/[^\x{c4}]/IB,utf
+------------------------------------------------------------------
+        Bra
+        [^\x{c4}]
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+Subject length lower bound = 1
+
+/X+\x{200}/IB,utf
+------------------------------------------------------------------
+        Bra
+        X++
+        \x{200}
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = 'X'
+Last code unit = \x80
+Subject length lower bound = 2
+
+/\R/I,utf
+Capturing subpattern count = 0
+Options: utf
+Starting code units: \x0a \x0b \x0c \x0d \xc2 \xe2 
+Subject length lower bound = 1
+
+/\777/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{1ff}
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = \xc7
+Last code unit = \xbf
+Subject length lower bound = 1
+
+/\w+\x{C4}/B,utf
+------------------------------------------------------------------
+        Bra
+        \w++
+        \x{c4}
+        Ket
+        End
+------------------------------------------------------------------
+    a\x{C4}\x{C4}
+ 0: a\x{c4}
+
+/\w+\x{C4}/B,utf,tables=2
+------------------------------------------------------------------
+        Bra
+        \w+
+        \x{c4}
+        Ket
+        End
+------------------------------------------------------------------
+    a\x{C4}\x{C4}
+ 0: a\x{c4}\x{c4}
+
+/\W+\x{C4}/B,utf
+------------------------------------------------------------------
+        Bra
+        \W+
+        \x{c4}
+        Ket
+        End
+------------------------------------------------------------------
+    !\x{C4}
+ 0: !\x{c4}
+
+/\W+\x{C4}/B,utf,tables=2
+------------------------------------------------------------------
+        Bra
+        \W++
+        \x{c4}
+        Ket
+        End
+------------------------------------------------------------------
+    !\x{C4}
+ 0: !\x{c4}
+
+/\W+\x{A1}/B,utf
+------------------------------------------------------------------
+        Bra
+        \W+
+        \x{a1}
+        Ket
+        End
+------------------------------------------------------------------
+    !\x{A1}
+ 0: !\x{a1}
+
+/\W+\x{A1}/B,utf,tables=2
+------------------------------------------------------------------
+        Bra
+        \W+
+        \x{a1}
+        Ket
+        End
+------------------------------------------------------------------
+    !\x{A1}
+ 0: !\x{a1}
+
+/X\s+\x{A0}/B,utf
+------------------------------------------------------------------
+        Bra
+        X
+        \s++
+        \x{a0}
+        Ket
+        End
+------------------------------------------------------------------
+    X\x20\x{A0}\x{A0}
+ 0: X \x{a0}
+
+/X\s+\x{A0}/B,utf,tables=2
+------------------------------------------------------------------
+        Bra
+        X
+        \s+
+        \x{a0}
+        Ket
+        End
+------------------------------------------------------------------
+    X\x20\x{A0}\x{A0}
+ 0: X \x{a0}\x{a0}
+
+/\S+\x{A0}/B,utf
+------------------------------------------------------------------
+        Bra
+        \S+
+        \x{a0}
+        Ket
+        End
+------------------------------------------------------------------
+    X\x{A0}\x{A0}
+ 0: X\x{a0}\x{a0}
+
+/\S+\x{A0}/B,utf,tables=2
+------------------------------------------------------------------
+        Bra
+        \S++
+        \x{a0}
+        Ket
+        End
+------------------------------------------------------------------
+    X\x{A0}\x{A0}
+ 0: X\x{a0}
+
+/\x{a0}+\s!/B,utf
+------------------------------------------------------------------
+        Bra
+        \x{a0}++
+        \s
+        !
+        Ket
+        End
+------------------------------------------------------------------
+    \x{a0}\x20!
+ 0: \x{a0} !
+
+/\x{a0}+\s!/B,utf,tables=2
+------------------------------------------------------------------
+        Bra
+        \x{a0}+
+        \s
+        !
+        Ket
+        End
+------------------------------------------------------------------
+    \x{a0}\x20!
+ 0: \x{a0} !
+
+/A/utf
+  \x{ff000041}
+** Character \x{ff000041} is greater than 0x7fffffff and so cannot be converted to UTF-8
+  \x{7f000041}
+Failed: error -14: UTF-8 error: 6-byte character is not allowed (RFC 3629) at offset 0
+
+/(*UTF8)abc/never_utf
+Failed: error 174 at offset 7: using UTF is disabled by the application
+
+/abc/utf,never_utf
+Failed: error 174 at offset 0: using UTF is disabled by the application
+
+/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/IBi,utf
+------------------------------------------------------------------
+        Bra
+     /i A\x{391}\x{10427}\x{ff3a}\x{1fb0}
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: caseless utf
+First code unit = 'A' (caseless)
+Subject length lower bound = 5
+
+/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/IB,utf
+------------------------------------------------------------------
+        Bra
+        A\x{391}\x{10427}\x{ff3a}\x{1fb0}
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = 'A'
+Last code unit = \xb0
+Subject length lower bound = 5
+
+/AB\x{1fb0}/IB,utf
+------------------------------------------------------------------
+        Bra
+        AB\x{1fb0}
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = 'A'
+Last code unit = \xb0
+Subject length lower bound = 3
+
+/AB\x{1fb0}/IBi,utf
+------------------------------------------------------------------
+        Bra
+     /i AB\x{1fb0}
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: caseless utf
+First code unit = 'A' (caseless)
+Last code unit = 'B' (caseless)
+Subject length lower bound = 3
+
+/\x{401}\x{420}\x{421}\x{422}\x{423}\x{424}\x{425}\x{426}\x{427}\x{428}\x{429}\x{42a}\x{42b}\x{42c}\x{42d}\x{42e}\x{42f}/Ii,utf
+Capturing subpattern count = 0
+Options: caseless utf
+Starting code units: \xd0 \xd1 
+Subject length lower bound = 17
+    \x{401}\x{420}\x{421}\x{422}\x{423}\x{424}\x{425}\x{426}\x{427}\x{428}\x{429}\x{42a}\x{42b}\x{42c}\x{42d}\x{42e}\x{42f}
+ 0: \x{401}\x{420}\x{421}\x{422}\x{423}\x{424}\x{425}\x{426}\x{427}\x{428}\x{429}\x{42a}\x{42b}\x{42c}\x{42d}\x{42e}\x{42f}
+    \x{451}\x{440}\x{441}\x{442}\x{443}\x{444}\x{445}\x{446}\x{447}\x{448}\x{449}\x{44a}\x{44b}\x{44c}\x{44d}\x{44e}\x{44f}
+ 0: \x{451}\x{440}\x{441}\x{442}\x{443}\x{444}\x{445}\x{446}\x{447}\x{448}\x{449}\x{44a}\x{44b}\x{44c}\x{44d}\x{44e}\x{44f}
+
+/[ⱥ]/Bi,utf
+------------------------------------------------------------------
+        Bra
+     /i \x{2c65}
+        Ket
+        End
+------------------------------------------------------------------
+
+/[^ⱥ]/Bi,utf
+------------------------------------------------------------------
+        Bra
+     /i [^\x{2c65}]
+        Ket
+        End
+------------------------------------------------------------------
+
+/\h/I
+Capturing subpattern count = 0
+Starting code units: \x09 \x20 \xa0 
+Subject length lower bound = 1
+
+/\v/I
+Capturing subpattern count = 0
+Starting code units: \x0a \x0b \x0c \x0d \x85 
+Subject length lower bound = 1
+
+/\R/I
+Capturing subpattern count = 0
+Starting code units: \x0a \x0b \x0c \x0d \x85 
+Subject length lower bound = 1
+
+/[[:blank:]]/B,ucp
+------------------------------------------------------------------
+        Bra
+        [\x09 \xa0]
+        Ket
+        End
+------------------------------------------------------------------
+
+/\x{212a}+/Ii,utf
+Capturing subpattern count = 0
+Options: caseless utf
+Starting code units: K k \xe2 
+Subject length lower bound = 1
+    KKkk\x{212a}
+ 0: KKkk\x{212a}
+
+/s+/Ii,utf
+Capturing subpattern count = 0
+Options: caseless utf
+Starting code units: S s \xc5 
+Subject length lower bound = 1
+    SSss\x{17f}
+ 0: SSss\x{17f}
+
+/\x{100}*A/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{100}*+
+        A
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+Starting code units: A \xc4 
+Last code unit = 'A'
+Subject length lower bound = 1
+    A
+ 0: A
+
+/\x{100}*\d(?R)/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{100}*+
+        \d
+        Recurse
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+Starting code units: 0 1 2 3 4 5 6 7 8 9 \xc4 
+Subject length lower bound = 1
+
+/[Z\x{100}]/IB,utf
+------------------------------------------------------------------
+        Bra
+        [Z\x{100}]
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+Starting code units: Z \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 
+Subject length lower bound = 1
+    Z\x{100}
+ 0: Z
+    \x{100}
+ 0: \x{100}
+    \x{100}Z
+ 0: \x{100}
+
+/[z-\x{100}]/IB,utf
+------------------------------------------------------------------
+        Bra
+        [z-\xff\x{100}]
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+Starting code units: z { | } ~ \x7f \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 
+Subject length lower bound = 1
+
+/[z\Qa-d]Ā\E]/IB,utf
+------------------------------------------------------------------
+        Bra
+        [\-\]adz\x{100}]
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+Starting code units: - ] a d z \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 
+Subject length lower bound = 1
+    \x{100}
+ 0: \x{100}
+    Ā 
+ 0: \x{100}
+
+/[ab\x{100}]abc(xyz(?1))/IB,utf
+------------------------------------------------------------------
+        Bra
+        [ab\x{100}]
+        abc
+        CBra 1
+        xyz
+        Recurse
+        Ket
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 1
+Options: utf
+Starting code units: a b \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 
+Last code unit = 'z'
+Subject length lower bound = 7
+
+/\x{100}*\s/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{100}*+
+        \s
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+Starting code units: \x09 \x0a \x0b \x0c \x0d \x20 \xc4 
+Subject length lower bound = 1
+
+/\x{100}*\d/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{100}*+
+        \d
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+Starting code units: 0 1 2 3 4 5 6 7 8 9 \xc4 
+Subject length lower bound = 1
+
+/\x{100}*\w/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{100}*+
+        \w
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+Starting code units: 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 
+  \xc4 
+Subject length lower bound = 1
+
+/\x{100}*\D/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{100}*
+        \D
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+Starting code units: \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 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 { | } ~ \x7f \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 
+Subject length lower bound = 1
+
+/\x{100}*\S/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{100}*
+        \S
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+Starting code units: \x00 \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x0e \x0f 
+  \x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17 \x18 \x19 \x1a \x1b \x1c \x1d \x1e 
+  \x1f ! " # $ % & ' ( ) * + , - . / 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 { | } ~ \x7f \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 
+Subject length lower bound = 1
+
+/\x{100}*\W/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{100}*
+        \W
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+Starting code units: \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 ! " # $ % & ' ( ) * + , - . / : ; < = > 
+  ? @ [ \ ] ^ ` { | } ~ \x7f \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 
+Subject length lower bound = 1
+
+/[\x{105}-\x{109}]/IBi,utf
+------------------------------------------------------------------
+        Bra
+        [\x{104}-\x{109}]
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: caseless utf
+Starting code units: \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 
+Subject length lower bound = 1
+    \x{104}
+ 0: \x{104}
+    \x{105}
+ 0: \x{105}
+    \x{109}  
+ 0: \x{109}
+\= Expect no match
+    \x{100}
+No match
+    \x{10a} 
+No match
+    
+/[z-\x{100}]/IBi,utf
+------------------------------------------------------------------
+        Bra
+        [Zz-\xff\x{39c}\x{3bc}\x{212b}\x{1e9e}\x{212b}\x{178}\x{100}-\x{101}]
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: caseless utf
+Starting code units: Z z { | } ~ \x7f \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 
+Subject length lower bound = 1
+    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}
+\= Expect no match
+    \x{102}
+No match
+    Y
+No match
+    y           
+No match
+
+/[z-\x{100}]/IBi,utf
+------------------------------------------------------------------
+        Bra
+        [Zz-\xff\x{39c}\x{3bc}\x{212b}\x{1e9e}\x{212b}\x{178}\x{100}-\x{101}]
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: caseless utf
+Starting code units: Z z { | } ~ \x7f \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 
+Subject length lower bound = 1
+
+/\x{3a3}B/IBi,utf
+------------------------------------------------------------------
+        Bra
+        clist 03a3 03c2 03c3
+     /i B
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: caseless utf
+Starting code units: \xce \xcf 
+Last code unit = 'B' (caseless)
+Subject length lower bound = 2
+
+/abc/utf,replace=Ã
+    abc
+Failed: error -3: UTF-8 error: 1 byte missing at end
+
+/(?<=(a)(?-1))x/I,utf
+Capturing subpattern count = 1
+Max lookbehind = 2
+Options: utf
+First code unit = 'x'
+Subject length lower bound = 1
+    a\x80zx\=offset=3
+Failed: error -22: UTF-8 error: isolated byte with 0x80 bit set at offset 1
+
+# End of testinput10
diff --git a/dist2/testdata/testoutput11-16 b/dist2/testdata/testoutput11-16
new file mode 100644
index 0000000..03e04bc
--- /dev/null
+++ b/dist2/testdata/testoutput11-16
@@ -0,0 +1,646 @@
+# This set of tests is for the 16-bit and 32-bit libraries' basic (non-UTF)
+# features that are not compatible with the 8-bit library, or which give
+# different output in 16-bit or 32-bit mode. The output for the two widths is
+# different, so they have separate output files.
+    
+#forbid_utf
+#newline_default LF ANY ANYCRLF
+
+/[^\x{c4}]/IB
+------------------------------------------------------------------
+        Bra
+        [^\x{c4}]
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Subject length lower bound = 1
+  
+/\x{100}/I
+Capturing subpattern count = 0
+First code unit = \x{100}
+Subject length lower bound = 1
+
+/  (?: [\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
+/Ix
+Capturing subpattern count = 0
+Contains explicit CR or LF match
+Options: extended
+Starting code units: \x09 \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 ^ _ ` 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 { | } ~ \x7f \xff 
+Subject length lower bound = 3
+
+/[\h]/B
+------------------------------------------------------------------
+        Bra
+        [\x09 \xa0\x{1680}\x{180e}\x{2000}-\x{200a}\x{202f}\x{205f}\x{3000}]
+        Ket
+        End
+------------------------------------------------------------------
+    >\x09<
+ 0: \x09
+
+/[\h]+/B
+------------------------------------------------------------------
+        Bra
+        [\x09 \xa0\x{1680}\x{180e}\x{2000}-\x{200a}\x{202f}\x{205f}\x{3000}]++
+        Ket
+        End
+------------------------------------------------------------------
+    >\x09\x20\xa0<
+ 0: \x09 \xa0
+
+/[\v]/B
+------------------------------------------------------------------
+        Bra
+        [\x0a-\x0d\x85\x{2028}-\x{2029}]
+        Ket
+        End
+------------------------------------------------------------------
+
+/[^\h]/B
+------------------------------------------------------------------
+        Bra
+        [^\x09 \xa0\x{1680}\x{180e}\x{2000}-\x{200a}\x{202f}\x{205f}\x{3000}]
+        Ket
+        End
+------------------------------------------------------------------
+
+/\h+/I
+Capturing subpattern count = 0
+Starting code units: \x09 \x20 \xa0 \xff 
+Subject length lower bound = 1
+    \x{1681}\x{200b}\x{1680}\x{2000}\x{202f}\x{3000}
+ 0: \x{1680}\x{2000}\x{202f}\x{3000}
+    \x{3001}\x{2fff}\x{200a}\xa0\x{2000}
+ 0: \x{200a}\xa0\x{2000}
+
+/[\h\x{dc00}]+/IB
+------------------------------------------------------------------
+        Bra
+        [\x09 \xa0\x{1680}\x{180e}\x{2000}-\x{200a}\x{202f}\x{205f}\x{3000}\x{dc00}]++
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Starting code units: \x09 \x20 \xa0 \xff 
+Subject length lower bound = 1
+    \x{1681}\x{200b}\x{1680}\x{2000}\x{202f}\x{3000}
+ 0: \x{1680}\x{2000}\x{202f}\x{3000}
+    \x{3001}\x{2fff}\x{200a}\xa0\x{2000}
+ 0: \x{200a}\xa0\x{2000}
+
+/\H+/I
+Capturing subpattern count = 0
+Subject length lower bound = 1
+    \x{1680}\x{180e}\x{167f}\x{1681}\x{180d}\x{180f}
+ 0: \x{167f}\x{1681}\x{180d}\x{180f}
+    \x{2000}\x{200a}\x{1fff}\x{200b}
+ 0: \x{1fff}\x{200b}
+    \x{202f}\x{205f}\x{202e}\x{2030}\x{205e}\x{2060}
+ 0: \x{202e}\x{2030}\x{205e}\x{2060}
+    \xa0\x{3000}\x9f\xa1\x{2fff}\x{3001}
+ 0: \x9f\xa1\x{2fff}\x{3001}
+
+/[\H\x{d800}]+/
+    \x{1680}\x{180e}\x{167f}\x{1681}\x{180d}\x{180f}
+ 0: \x{167f}\x{1681}\x{180d}\x{180f}
+    \x{2000}\x{200a}\x{1fff}\x{200b}
+ 0: \x{1fff}\x{200b}
+    \x{202f}\x{205f}\x{202e}\x{2030}\x{205e}\x{2060}
+ 0: \x{202e}\x{2030}\x{205e}\x{2060}
+    \xa0\x{3000}\x9f\xa1\x{2fff}\x{3001}
+ 0: \x9f\xa1\x{2fff}\x{3001}
+
+/\v+/I
+Capturing subpattern count = 0
+Starting code units: \x0a \x0b \x0c \x0d \x85 \xff 
+Subject length lower bound = 1
+    \x{2027}\x{2030}\x{2028}\x{2029}
+ 0: \x{2028}\x{2029}
+    \x09\x0e\x84\x86\x85\x0a\x0b\x0c\x0d
+ 0: \x85\x0a\x0b\x0c\x0d
+
+/[\v\x{dc00}]+/IB
+------------------------------------------------------------------
+        Bra
+        [\x0a-\x0d\x85\x{2028}-\x{2029}\x{dc00}]++
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Starting code units: \x0a \x0b \x0c \x0d \x85 \xff 
+Subject length lower bound = 1
+    \x{2027}\x{2030}\x{2028}\x{2029}
+ 0: \x{2028}\x{2029}
+    \x09\x0e\x84\x86\x85\x0a\x0b\x0c\x0d
+ 0: \x85\x0a\x0b\x0c\x0d
+
+/\V+/I
+Capturing subpattern count = 0
+Subject length lower bound = 1
+    \x{2028}\x{2029}\x{2027}\x{2030}
+ 0: \x{2027}\x{2030}
+    \x85\x0a\x0b\x0c\x0d\x09\x0e\x84\x86
+ 0: \x09\x0e\x84\x86
+
+/[\V\x{d800}]+/
+    \x{2028}\x{2029}\x{2027}\x{2030}
+ 0: \x{2027}\x{2030}
+    \x85\x0a\x0b\x0c\x0d\x09\x0e\x84\x86
+ 0: \x09\x0e\x84\x86
+
+/\R+/I,bsr=unicode
+Capturing subpattern count = 0
+\R matches any Unicode newline
+Starting code units: \x0a \x0b \x0c \x0d \x85 \xff 
+Subject length lower bound = 1
+    \x{2027}\x{2030}\x{2028}\x{2029}
+ 0: \x{2028}\x{2029}
+    \x09\x0e\x84\x86\x85\x0a\x0b\x0c\x0d
+ 0: \x85\x0a\x0b\x0c\x0d
+
+/\x{d800}\x{d7ff}\x{dc00}\x{dc00}\x{dcff}\x{dd00}/I
+Capturing subpattern count = 0
+First code unit = \x{d800}
+Last code unit = \x{dd00}
+Subject length lower bound = 6
+    \x{d800}\x{d7ff}\x{dc00}\x{dc00}\x{dcff}\x{dd00}
+ 0: \x{d800}\x{d7ff}\x{dc00}\x{dc00}\x{dcff}\x{dd00}
+
+/[^\x{80}][^\x{ff}][^\x{100}][^\x{1000}][^\x{ffff}]/B
+------------------------------------------------------------------
+        Bra
+        [^\x{80}]
+        [^\x{ff}]
+        [^\x{100}]
+        [^\x{1000}]
+        [^\x{ffff}]
+        Ket
+        End
+------------------------------------------------------------------
+
+/[^\x{80}][^\x{ff}][^\x{100}][^\x{1000}][^\x{ffff}]/Bi
+------------------------------------------------------------------
+        Bra
+     /i [^\x{80}]
+     /i [^\x{ff}]
+     /i [^\x{100}]
+     /i [^\x{1000}]
+     /i [^\x{ffff}]
+        Ket
+        End
+------------------------------------------------------------------
+
+/[^\x{100}]*[^\x{1000}]+[^\x{ffff}]??[^\x{8000}]{4,}[^\x{7fff}]{2,9}?[^\x{100}]{5,6}+/B
+------------------------------------------------------------------
+        Bra
+        [^\x{100}]*
+        [^\x{1000}]+
+        [^\x{ffff}]??
+        [^\x{8000}]{4}
+        [^\x{8000}]*
+        [^\x{7fff}]{2}
+        [^\x{7fff}]{0,7}?
+        [^\x{100}]{5}
+        [^\x{100}]?+
+        Ket
+        End
+------------------------------------------------------------------
+
+/[^\x{100}]*[^\x{1000}]+[^\x{ffff}]??[^\x{8000}]{4,}[^\x{7fff}]{2,9}?[^\x{100}]{5,6}+/Bi
+------------------------------------------------------------------
+        Bra
+     /i [^\x{100}]*
+     /i [^\x{1000}]+
+     /i [^\x{ffff}]??
+     /i [^\x{8000}]{4}
+     /i [^\x{8000}]*
+     /i [^\x{7fff}]{2}
+     /i [^\x{7fff}]{0,7}?
+     /i [^\x{100}]{5}
+     /i [^\x{100}]?+
+        Ket
+        End
+------------------------------------------------------------------
+
+/(*:0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF)XX/mark
+    XX
+ 0: XX
+MK: 0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+     
+/(*:0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDE)XX/mark
+    XX
+ 0: XX
+MK: 0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDE
+
+/\u0100/B,alt_bsux,allow_empty_class,match_unset_backref
+------------------------------------------------------------------
+        Bra
+        \x{100}
+        Ket
+        End
+------------------------------------------------------------------
+
+/[\u0100-\u0200]/B,alt_bsux,allow_empty_class,match_unset_backref
+------------------------------------------------------------------
+        Bra
+        [\x{100}-\x{200}]
+        Ket
+        End
+------------------------------------------------------------------
+
+/\ud800/B,alt_bsux,allow_empty_class,match_unset_backref
+------------------------------------------------------------------
+        Bra
+        \x{d800}
+        Ket
+        End
+------------------------------------------------------------------
+
+/^\x{ffff}+/i
+    \x{ffff}
+ 0: \x{ffff}
+
+/^\x{ffff}?/i
+    \x{ffff}
+ 0: \x{ffff}
+
+/^\x{ffff}*/i
+    \x{ffff}
+ 0: \x{ffff}
+
+/^\x{ffff}{3}/i
+    \x{ffff}\x{ffff}\x{ffff}
+ 0: \x{ffff}\x{ffff}\x{ffff}
+
+/^\x{ffff}{0,3}/i
+    \x{ffff}
+ 0: \x{ffff}
+
+/[^\x00-a]{12,}[^b-\xff]*/B
+------------------------------------------------------------------
+        Bra
+        [b-\xff] (neg){12,}
+        [\x00-a] (neg)*+
+        Ket
+        End
+------------------------------------------------------------------
+
+/[^\s]*\s* [^\W]+\W+ [^\d]*?\d0 [^\d\w]{4,6}?\w*A/B
+------------------------------------------------------------------
+        Bra
+        [\x00-\x08\x0e-\x1f!-\xff] (neg)*
+        \s*
+         
+        [0-9A-Z_a-z]++
+        \W+
+         
+        [\x00-/:-\xff] (neg)*?
+        \d
+        0 
+        [\x00-/:-@[-^`{-\xff] (neg){4,6}?
+        \w*
+        A
+        Ket
+        End
+------------------------------------------------------------------
+
+/a*[b-\x{200}]?a#a*[b-\x{200}]?b#[a-f]*[g-\x{200}]*#[g-\x{200}]*[a-c]*#[g-\x{200}]*[a-h]*/B
+------------------------------------------------------------------
+        Bra
+        a*
+        [b-\xff\x{100}-\x{200}]?+
+        a#
+        a*+
+        [b-\xff\x{100}-\x{200}]?
+        b#
+        [a-f]*+
+        [g-\xff\x{100}-\x{200}]*+
+        #
+        [g-\xff\x{100}-\x{200}]*+
+        [a-c]*+
+        #
+        [g-\xff\x{100}-\x{200}]*
+        [a-h]*+
+        Ket
+        End
+------------------------------------------------------------------
+
+/^[\x{1234}\x{4321}]{2,4}?/
+    \x{1234}\x{1234}\x{1234}
+ 0: \x{1234}\x{1234}
+
+# Check maximum non-UTF character size for the 16-bit library.
+
+/\x{ffff}/
+    A\x{ffff}B
+ 0: \x{ffff}
+
+/\x{10000}/
+Failed: error 134 at offset 8: character code point value in \x{} or \o{} is too large
+
+/\o{20000}/
+
+# Check maximum character size for the 32-bit library. These will all give
+# errors in the 16-bit library.
+
+/\x{110000}/
+Failed: error 134 at offset 9: character code point value in \x{} or \o{} is too large
+
+/\x{7fffffff}/
+Failed: error 134 at offset 11: character code point value in \x{} or \o{} is too large
+
+/\x{80000000}/
+Failed: error 134 at offset 11: character code point value in \x{} or \o{} is too large
+
+/\x{ffffffff}/
+Failed: error 134 at offset 11: character code point value in \x{} or \o{} is too large
+
+/\x{100000000}/
+Failed: error 134 at offset 12: character code point value in \x{} or \o{} is too large
+
+/\o{17777777777}/
+Failed: error 134 at offset 14: character code point value in \x{} or \o{} is too large
+
+/\o{20000000000}/
+Failed: error 134 at offset 14: character code point value in \x{} or \o{} is too large
+
+/\o{37777777777}/
+Failed: error 134 at offset 14: character code point value in \x{} or \o{} is too large
+
+/\o{40000000000}/
+Failed: error 134 at offset 14: character code point value in \x{} or \o{} is too large
+
+/\x{7fffffff}\x{7fffffff}/I
+Failed: error 134 at offset 11: character code point value in \x{} or \o{} is too large
+
+/\x{80000000}\x{80000000}/I
+Failed: error 134 at offset 11: character code point value in \x{} or \o{} is too large
+
+/\x{ffffffff}\x{ffffffff}/I
+Failed: error 134 at offset 11: character code point value in \x{} or \o{} is too large
+
+# Non-UTF characters 
+
+/.{2,3}/
+    \x{400000}\x{400001}\x{400002}\x{400003}
+** Character \x{400000} is greater than 0xffff and UTF-16 mode is not enabled.
+** Truncation will probably give the wrong result.
+** Character \x{400001} is greater than 0xffff and UTF-16 mode is not enabled.
+** Truncation will probably give the wrong result.
+** Character \x{400002} is greater than 0xffff and UTF-16 mode is not enabled.
+** Truncation will probably give the wrong result.
+** Character \x{400003} is greater than 0xffff and UTF-16 mode is not enabled.
+** Truncation will probably give the wrong result.
+ 0: \x00\x01\x02
+
+/\x{400000}\x{800000}/IBi
+Failed: error 134 at offset 9: character code point value in \x{} or \o{} is too large
+
+# Check character ranges 
+
+/[\H]/IB
+------------------------------------------------------------------
+        Bra
+        [\x00-\x08\x0a-\x1f!-\x9f\xa1-\xff\x{100}-\x{167f}\x{1681}-\x{180d}\x{180f}-\x{1fff}\x{200b}-\x{202e}\x{2030}-\x{205e}\x{2060}-\x{2fff}\x{3001}-\x{ffff}]
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Starting code units: \x00 \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x0a \x0b 
+  \x0c \x0d \x0e \x0f \x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17 \x18 \x19 \x1a 
+  \x1b \x1c \x1d \x1e \x1f ! " # $ % & ' ( ) * + , - . / 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 { | } ~ \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 \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 
+Subject length lower bound = 1
+
+/[\V]/IB
+------------------------------------------------------------------
+        Bra
+        [\x00-\x09\x0e-\x84\x86-\xff\x{100}-\x{2027}\x{202a}-\x{ffff}]
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Starting code units: \x00 \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x09 \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 [ \ ] ^ _ ` 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 { | } ~ \x7f \x80 \x81 \x82 
+  \x83 \x84 \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 
+Subject length lower bound = 1
+
+/(*THEN:\[A]{65501})/expand
+
+# End of testinput11
diff --git a/dist2/testdata/testoutput11-32 b/dist2/testdata/testoutput11-32
new file mode 100644
index 0000000..390ebe0
--- /dev/null
+++ b/dist2/testdata/testoutput11-32
@@ -0,0 +1,649 @@
+# This set of tests is for the 16-bit and 32-bit libraries' basic (non-UTF)
+# features that are not compatible with the 8-bit library, or which give
+# different output in 16-bit or 32-bit mode. The output for the two widths is
+# different, so they have separate output files.
+    
+#forbid_utf
+#newline_default LF ANY ANYCRLF
+
+/[^\x{c4}]/IB
+------------------------------------------------------------------
+        Bra
+        [^\x{c4}]
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Subject length lower bound = 1
+  
+/\x{100}/I
+Capturing subpattern count = 0
+First code unit = \x{100}
+Subject length lower bound = 1
+
+/  (?: [\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
+/Ix
+Capturing subpattern count = 0
+Contains explicit CR or LF match
+Options: extended
+Starting code units: \x09 \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 ^ _ ` 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 { | } ~ \x7f \xff 
+Subject length lower bound = 3
+
+/[\h]/B
+------------------------------------------------------------------
+        Bra
+        [\x09 \xa0\x{1680}\x{180e}\x{2000}-\x{200a}\x{202f}\x{205f}\x{3000}]
+        Ket
+        End
+------------------------------------------------------------------
+    >\x09<
+ 0: \x09
+
+/[\h]+/B
+------------------------------------------------------------------
+        Bra
+        [\x09 \xa0\x{1680}\x{180e}\x{2000}-\x{200a}\x{202f}\x{205f}\x{3000}]++
+        Ket
+        End
+------------------------------------------------------------------
+    >\x09\x20\xa0<
+ 0: \x09 \xa0
+
+/[\v]/B
+------------------------------------------------------------------
+        Bra
+        [\x0a-\x0d\x85\x{2028}-\x{2029}]
+        Ket
+        End
+------------------------------------------------------------------
+
+/[^\h]/B
+------------------------------------------------------------------
+        Bra
+        [^\x09 \xa0\x{1680}\x{180e}\x{2000}-\x{200a}\x{202f}\x{205f}\x{3000}]
+        Ket
+        End
+------------------------------------------------------------------
+
+/\h+/I
+Capturing subpattern count = 0
+Starting code units: \x09 \x20 \xa0 \xff 
+Subject length lower bound = 1
+    \x{1681}\x{200b}\x{1680}\x{2000}\x{202f}\x{3000}
+ 0: \x{1680}\x{2000}\x{202f}\x{3000}
+    \x{3001}\x{2fff}\x{200a}\xa0\x{2000}
+ 0: \x{200a}\xa0\x{2000}
+
+/[\h\x{dc00}]+/IB
+------------------------------------------------------------------
+        Bra
+        [\x09 \xa0\x{1680}\x{180e}\x{2000}-\x{200a}\x{202f}\x{205f}\x{3000}\x{dc00}]++
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Starting code units: \x09 \x20 \xa0 \xff 
+Subject length lower bound = 1
+    \x{1681}\x{200b}\x{1680}\x{2000}\x{202f}\x{3000}
+ 0: \x{1680}\x{2000}\x{202f}\x{3000}
+    \x{3001}\x{2fff}\x{200a}\xa0\x{2000}
+ 0: \x{200a}\xa0\x{2000}
+
+/\H+/I
+Capturing subpattern count = 0
+Subject length lower bound = 1
+    \x{1680}\x{180e}\x{167f}\x{1681}\x{180d}\x{180f}
+ 0: \x{167f}\x{1681}\x{180d}\x{180f}
+    \x{2000}\x{200a}\x{1fff}\x{200b}
+ 0: \x{1fff}\x{200b}
+    \x{202f}\x{205f}\x{202e}\x{2030}\x{205e}\x{2060}
+ 0: \x{202e}\x{2030}\x{205e}\x{2060}
+    \xa0\x{3000}\x9f\xa1\x{2fff}\x{3001}
+ 0: \x9f\xa1\x{2fff}\x{3001}
+
+/[\H\x{d800}]+/
+    \x{1680}\x{180e}\x{167f}\x{1681}\x{180d}\x{180f}
+ 0: \x{167f}\x{1681}\x{180d}\x{180f}
+    \x{2000}\x{200a}\x{1fff}\x{200b}
+ 0: \x{1fff}\x{200b}
+    \x{202f}\x{205f}\x{202e}\x{2030}\x{205e}\x{2060}
+ 0: \x{202e}\x{2030}\x{205e}\x{2060}
+    \xa0\x{3000}\x9f\xa1\x{2fff}\x{3001}
+ 0: \x9f\xa1\x{2fff}\x{3001}
+
+/\v+/I
+Capturing subpattern count = 0
+Starting code units: \x0a \x0b \x0c \x0d \x85 \xff 
+Subject length lower bound = 1
+    \x{2027}\x{2030}\x{2028}\x{2029}
+ 0: \x{2028}\x{2029}
+    \x09\x0e\x84\x86\x85\x0a\x0b\x0c\x0d
+ 0: \x85\x0a\x0b\x0c\x0d
+
+/[\v\x{dc00}]+/IB
+------------------------------------------------------------------
+        Bra
+        [\x0a-\x0d\x85\x{2028}-\x{2029}\x{dc00}]++
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Starting code units: \x0a \x0b \x0c \x0d \x85 \xff 
+Subject length lower bound = 1
+    \x{2027}\x{2030}\x{2028}\x{2029}
+ 0: \x{2028}\x{2029}
+    \x09\x0e\x84\x86\x85\x0a\x0b\x0c\x0d
+ 0: \x85\x0a\x0b\x0c\x0d
+
+/\V+/I
+Capturing subpattern count = 0
+Subject length lower bound = 1
+    \x{2028}\x{2029}\x{2027}\x{2030}
+ 0: \x{2027}\x{2030}
+    \x85\x0a\x0b\x0c\x0d\x09\x0e\x84\x86
+ 0: \x09\x0e\x84\x86
+
+/[\V\x{d800}]+/
+    \x{2028}\x{2029}\x{2027}\x{2030}
+ 0: \x{2027}\x{2030}
+    \x85\x0a\x0b\x0c\x0d\x09\x0e\x84\x86
+ 0: \x09\x0e\x84\x86
+
+/\R+/I,bsr=unicode
+Capturing subpattern count = 0
+\R matches any Unicode newline
+Starting code units: \x0a \x0b \x0c \x0d \x85 \xff 
+Subject length lower bound = 1
+    \x{2027}\x{2030}\x{2028}\x{2029}
+ 0: \x{2028}\x{2029}
+    \x09\x0e\x84\x86\x85\x0a\x0b\x0c\x0d
+ 0: \x85\x0a\x0b\x0c\x0d
+
+/\x{d800}\x{d7ff}\x{dc00}\x{dc00}\x{dcff}\x{dd00}/I
+Capturing subpattern count = 0
+First code unit = \x{d800}
+Last code unit = \x{dd00}
+Subject length lower bound = 6
+    \x{d800}\x{d7ff}\x{dc00}\x{dc00}\x{dcff}\x{dd00}
+ 0: \x{d800}\x{d7ff}\x{dc00}\x{dc00}\x{dcff}\x{dd00}
+
+/[^\x{80}][^\x{ff}][^\x{100}][^\x{1000}][^\x{ffff}]/B
+------------------------------------------------------------------
+        Bra
+        [^\x{80}]
+        [^\x{ff}]
+        [^\x{100}]
+        [^\x{1000}]
+        [^\x{ffff}]
+        Ket
+        End
+------------------------------------------------------------------
+
+/[^\x{80}][^\x{ff}][^\x{100}][^\x{1000}][^\x{ffff}]/Bi
+------------------------------------------------------------------
+        Bra
+     /i [^\x{80}]
+     /i [^\x{ff}]
+     /i [^\x{100}]
+     /i [^\x{1000}]
+     /i [^\x{ffff}]
+        Ket
+        End
+------------------------------------------------------------------
+
+/[^\x{100}]*[^\x{1000}]+[^\x{ffff}]??[^\x{8000}]{4,}[^\x{7fff}]{2,9}?[^\x{100}]{5,6}+/B
+------------------------------------------------------------------
+        Bra
+        [^\x{100}]*
+        [^\x{1000}]+
+        [^\x{ffff}]??
+        [^\x{8000}]{4}
+        [^\x{8000}]*
+        [^\x{7fff}]{2}
+        [^\x{7fff}]{0,7}?
+        [^\x{100}]{5}
+        [^\x{100}]?+
+        Ket
+        End
+------------------------------------------------------------------
+
+/[^\x{100}]*[^\x{1000}]+[^\x{ffff}]??[^\x{8000}]{4,}[^\x{7fff}]{2,9}?[^\x{100}]{5,6}+/Bi
+------------------------------------------------------------------
+        Bra
+     /i [^\x{100}]*
+     /i [^\x{1000}]+
+     /i [^\x{ffff}]??
+     /i [^\x{8000}]{4}
+     /i [^\x{8000}]*
+     /i [^\x{7fff}]{2}
+     /i [^\x{7fff}]{0,7}?
+     /i [^\x{100}]{5}
+     /i [^\x{100}]?+
+        Ket
+        End
+------------------------------------------------------------------
+
+/(*:0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF)XX/mark
+    XX
+ 0: XX
+MK: 0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
+     
+/(*:0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDE)XX/mark
+    XX
+ 0: XX
+MK: 0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDE
+
+/\u0100/B,alt_bsux,allow_empty_class,match_unset_backref
+------------------------------------------------------------------
+        Bra
+        \x{100}
+        Ket
+        End
+------------------------------------------------------------------
+
+/[\u0100-\u0200]/B,alt_bsux,allow_empty_class,match_unset_backref
+------------------------------------------------------------------
+        Bra
+        [\x{100}-\x{200}]
+        Ket
+        End
+------------------------------------------------------------------
+
+/\ud800/B,alt_bsux,allow_empty_class,match_unset_backref
+------------------------------------------------------------------
+        Bra
+        \x{d800}
+        Ket
+        End
+------------------------------------------------------------------
+
+/^\x{ffff}+/i
+    \x{ffff}
+ 0: \x{ffff}
+
+/^\x{ffff}?/i
+    \x{ffff}
+ 0: \x{ffff}
+
+/^\x{ffff}*/i
+    \x{ffff}
+ 0: \x{ffff}
+
+/^\x{ffff}{3}/i
+    \x{ffff}\x{ffff}\x{ffff}
+ 0: \x{ffff}\x{ffff}\x{ffff}
+
+/^\x{ffff}{0,3}/i
+    \x{ffff}
+ 0: \x{ffff}
+
+/[^\x00-a]{12,}[^b-\xff]*/B
+------------------------------------------------------------------
+        Bra
+        [b-\xff] (neg){12,}
+        [\x00-a] (neg)*+
+        Ket
+        End
+------------------------------------------------------------------
+
+/[^\s]*\s* [^\W]+\W+ [^\d]*?\d0 [^\d\w]{4,6}?\w*A/B
+------------------------------------------------------------------
+        Bra
+        [\x00-\x08\x0e-\x1f!-\xff] (neg)*
+        \s*
+         
+        [0-9A-Z_a-z]++
+        \W+
+         
+        [\x00-/:-\xff] (neg)*?
+        \d
+        0 
+        [\x00-/:-@[-^`{-\xff] (neg){4,6}?
+        \w*
+        A
+        Ket
+        End
+------------------------------------------------------------------
+
+/a*[b-\x{200}]?a#a*[b-\x{200}]?b#[a-f]*[g-\x{200}]*#[g-\x{200}]*[a-c]*#[g-\x{200}]*[a-h]*/B
+------------------------------------------------------------------
+        Bra
+        a*
+        [b-\xff\x{100}-\x{200}]?+
+        a#
+        a*+
+        [b-\xff\x{100}-\x{200}]?
+        b#
+        [a-f]*+
+        [g-\xff\x{100}-\x{200}]*+
+        #
+        [g-\xff\x{100}-\x{200}]*+
+        [a-c]*+
+        #
+        [g-\xff\x{100}-\x{200}]*
+        [a-h]*+
+        Ket
+        End
+------------------------------------------------------------------
+
+/^[\x{1234}\x{4321}]{2,4}?/
+    \x{1234}\x{1234}\x{1234}
+ 0: \x{1234}\x{1234}
+
+# Check maximum non-UTF character size for the 16-bit library.
+
+/\x{ffff}/
+    A\x{ffff}B
+ 0: \x{ffff}
+
+/\x{10000}/
+
+/\o{20000}/
+
+# Check maximum character size for the 32-bit library. These will all give
+# errors in the 16-bit library.
+
+/\x{110000}/
+
+/\x{7fffffff}/
+
+/\x{80000000}/
+
+/\x{ffffffff}/
+
+/\x{100000000}/
+Failed: error 134 at offset 12: character code point value in \x{} or \o{} is too large
+
+/\o{17777777777}/
+
+/\o{20000000000}/
+
+/\o{37777777777}/
+
+/\o{40000000000}/
+Failed: error 134 at offset 14: character code point value in \x{} or \o{} is too large
+
+/\x{7fffffff}\x{7fffffff}/I
+Capturing subpattern count = 0
+First code unit = \x{7fffffff}
+Last code unit = \x{7fffffff}
+Subject length lower bound = 2
+
+/\x{80000000}\x{80000000}/I
+Capturing subpattern count = 0
+First code unit = \x{80000000}
+Last code unit = \x{80000000}
+Subject length lower bound = 2
+
+/\x{ffffffff}\x{ffffffff}/I
+Capturing subpattern count = 0
+First code unit = \x{ffffffff}
+Last code unit = \x{ffffffff}
+Subject length lower bound = 2
+
+# Non-UTF characters 
+
+/.{2,3}/
+    \x{400000}\x{400001}\x{400002}\x{400003}
+ 0: \x{400000}\x{400001}\x{400002}
+
+/\x{400000}\x{800000}/IBi
+------------------------------------------------------------------
+        Bra
+     /i \x{400000}\x{800000}
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: caseless
+First code unit = \x{400000}
+Last code unit = \x{800000}
+Subject length lower bound = 2
+
+# Check character ranges 
+
+/[\H]/IB
+------------------------------------------------------------------
+        Bra
+        [\x00-\x08\x0a-\x1f!-\x9f\xa1-\xff\x{100}-\x{167f}\x{1681}-\x{180d}\x{180f}-\x{1fff}\x{200b}-\x{202e}\x{2030}-\x{205e}\x{2060}-\x{2fff}\x{3001}-\x{ffffffff}]
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Starting code units: \x00 \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x0a \x0b 
+  \x0c \x0d \x0e \x0f \x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17 \x18 \x19 \x1a 
+  \x1b \x1c \x1d \x1e \x1f ! " # $ % & ' ( ) * + , - . / 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 { | } ~ \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 \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 
+Subject length lower bound = 1
+
+/[\V]/IB
+------------------------------------------------------------------
+        Bra
+        [\x00-\x09\x0e-\x84\x86-\xff\x{100}-\x{2027}\x{202a}-\x{ffffffff}]
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Starting code units: \x00 \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x09 \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 [ \ ] ^ _ ` 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 { | } ~ \x7f \x80 \x81 \x82 
+  \x83 \x84 \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 
+Subject length lower bound = 1
+
+/(*THEN:\[A]{65501})/expand
+
+# End of testinput11
diff --git a/dist2/testdata/testoutput12-16 b/dist2/testdata/testoutput12-16
new file mode 100644
index 0000000..383a032
--- /dev/null
+++ b/dist2/testdata/testoutput12-16
@@ -0,0 +1,1370 @@
+# This set of tests is for UTF-16 and UTF-32 support, including Unicode
+# properties. It is relevant only to the 16-bit and 32-bit libraries. The
+# output is different for each library, so there are separate output files.
+
+/ÃÃÃxxx/IB,utf,no_utf_check
+** Failed: invalid UTF-8 string cannot be converted to 16-bit string
+
+/abc/utf
+    Ã]
+** Failed: invalid UTF-8 string cannot be used as input in UTF mode
+
+# Check maximum character size 
+
+/\x{ffff}/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{ffff}
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = \x{ffff}
+Subject length lower bound = 1
+
+/\x{10000}/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{10000}
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = \x{d800}
+Last code unit = \x{dc00}
+Subject length lower bound = 1
+
+/\x{100}/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{100}
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = \x{100}
+Subject length lower bound = 1
+
+/\x{1000}/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{1000}
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = \x{1000}
+Subject length lower bound = 1
+
+/\x{10000}/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{10000}
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = \x{d800}
+Last code unit = \x{dc00}
+Subject length lower bound = 1
+
+/\x{100000}/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{100000}
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = \x{dbc0}
+Last code unit = \x{dc00}
+Subject length lower bound = 1
+
+/\x{10ffff}/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{10ffff}
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = \x{dbff}
+Last code unit = \x{dfff}
+Subject length lower bound = 1
+
+/[\x{ff}]/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{ff}
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = \xff
+Subject length lower bound = 1
+
+/[\x{100}]/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{100}
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = \x{100}
+Subject length lower bound = 1
+
+/\x80/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{80}
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = \x80
+Subject length lower bound = 1
+
+/\xff/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{ff}
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = \xff
+Subject length lower bound = 1
+
+/\x{D55c}\x{ad6d}\x{C5B4}/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{d55c}\x{ad6d}\x{c5b4}
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = \x{d55c}
+Last code unit = \x{c5b4}
+Subject length lower bound = 3
+    \x{D55c}\x{ad6d}\x{C5B4}
+ 0: \x{d55c}\x{ad6d}\x{c5b4}
+
+/\x{65e5}\x{672c}\x{8a9e}/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{65e5}\x{672c}\x{8a9e}
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = \x{65e5}
+Last code unit = \x{8a9e}
+Subject length lower bound = 3
+    \x{65e5}\x{672c}\x{8a9e}
+ 0: \x{65e5}\x{672c}\x{8a9e}
+
+/\x{80}/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{80}
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = \x80
+Subject length lower bound = 1
+
+/\x{084}/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{84}
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = \x84
+Subject length lower bound = 1
+
+/\x{104}/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{104}
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = \x{104}
+Subject length lower bound = 1
+
+/\x{861}/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{861}
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = \x{861}
+Subject length lower bound = 1
+
+/\x{212ab}/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{212ab}
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = \x{d844}
+Last code unit = \x{deab}
+Subject length lower bound = 1
+
+/[^ab\xC0-\xF0]/IB,utf
+------------------------------------------------------------------
+        Bra
+        [\x00-`c-\xbf\xf1-\xff] (neg)
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+Starting code units: \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 \xf1 \xf2 \xf3 \xf4 \xf5 \xf6 \xf7 \xf8 \xf9 \xfa \xfb 
+  \xfc \xfd \xfe \xff 
+Subject length lower bound = 1
+    \x{f1}
+ 0: \x{f1}
+    \x{bf}
+ 0: \x{bf}
+    \x{100}
+ 0: \x{100}
+    \x{1000}
+ 0: \x{1000}
+\= Expect no match
+    \x{c0}
+No match
+    \x{f0}
+No match
+
+/Ā{3,4}/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{100}{3}
+        \x{100}?+
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = \x{100}
+Last code unit = \x{100}
+Subject length lower bound = 3
+  \x{100}\x{100}\x{100}\x{100\x{100}
+ 0: \x{100}\x{100}\x{100}
+
+/(\x{100}+|x)/IB,utf
+------------------------------------------------------------------
+        Bra
+        CBra 1
+        \x{100}++
+        Alt
+        x
+        Ket
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 1
+Options: utf
+Starting code units: x \xff 
+Subject length lower bound = 1
+
+/(\x{100}*a|x)/IB,utf
+------------------------------------------------------------------
+        Bra
+        CBra 1
+        \x{100}*+
+        a
+        Alt
+        x
+        Ket
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 1
+Options: utf
+Starting code units: a x \xff 
+Subject length lower bound = 1
+
+/(\x{100}{0,2}a|x)/IB,utf
+------------------------------------------------------------------
+        Bra
+        CBra 1
+        \x{100}{0,2}+
+        a
+        Alt
+        x
+        Ket
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 1
+Options: utf
+Starting code units: a x \xff 
+Subject length lower bound = 1
+
+/(\x{100}{1,2}a|x)/IB,utf
+------------------------------------------------------------------
+        Bra
+        CBra 1
+        \x{100}
+        \x{100}{0,1}+
+        a
+        Alt
+        x
+        Ket
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 1
+Options: utf
+Starting code units: x \xff 
+Subject length lower bound = 1
+
+/\x{100}/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{100}
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = \x{100}
+Subject length lower bound = 1
+
+/a\x{100}\x{101}*/IB,utf
+------------------------------------------------------------------
+        Bra
+        a\x{100}
+        \x{101}*+
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = 'a'
+Last code unit = \x{100}
+Subject length lower bound = 2
+
+/a\x{100}\x{101}+/IB,utf
+------------------------------------------------------------------
+        Bra
+        a\x{100}
+        \x{101}++
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = 'a'
+Last code unit = \x{101}
+Subject length lower bound = 3
+
+/[^\x{c4}]/IB
+------------------------------------------------------------------
+        Bra
+        [^\x{c4}]
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Subject length lower bound = 1
+
+/[\x{100}]/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{100}
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = \x{100}
+Subject length lower bound = 1
+    \x{100}
+ 0: \x{100}
+    Z\x{100}
+ 0: \x{100}
+    \x{100}Z
+ 0: \x{100}
+
+/[\xff]/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{ff}
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = \xff
+Subject length lower bound = 1
+    >\x{ff}<
+ 0: \x{ff}
+
+/[^\xff]/IB,utf
+------------------------------------------------------------------
+        Bra
+        [^\x{ff}]
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+Subject length lower bound = 1
+
+/\x{100}abc(xyz(?1))/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{100}abc
+        CBra 1
+        xyz
+        Recurse
+        Ket
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 1
+Options: utf
+First code unit = \x{100}
+Last code unit = 'z'
+Subject length lower bound = 7
+
+/\777/I,utf
+Capturing subpattern count = 0
+Options: utf
+First code unit = \x{1ff}
+Subject length lower bound = 1
+  \x{1ff}
+ 0: \x{1ff}
+  \777
+ 0: \x{1ff}
+
+/\x{100}+\x{200}/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{100}++
+        \x{200}
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = \x{100}
+Last code unit = \x{200}
+Subject length lower bound = 2
+
+/\x{100}+X/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{100}++
+        X
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = \x{100}
+Last code unit = 'X'
+Subject length lower bound = 2
+
+/^[\QĀ\E-\QŐ\E/B,utf
+Failed: error 106 at offset 13: missing terminating ] for character class
+
+/X/utf
+    XX\x{d800}\=no_utf_check
+ 0: X
+    XX\x{da00}\=no_utf_check
+ 0: X
+    XX\x{dc00}\=no_utf_check
+ 0: X
+    XX\x{de00}\=no_utf_check
+ 0: X
+    XX\x{dfff}\=no_utf_check
+ 0: X
+\= Expect UTF error
+    XX\x{d800}
+Failed: error -24: UTF-16 error: missing low surrogate at end at offset 2
+    XX\x{da00}
+Failed: error -24: UTF-16 error: missing low surrogate at end at offset 2
+    XX\x{dc00}
+Failed: error -26: UTF-16 error: isolated low surrogate at offset 2
+    XX\x{de00}
+Failed: error -26: UTF-16 error: isolated low surrogate at offset 2
+    XX\x{dfff}
+Failed: error -26: UTF-16 error: isolated low surrogate at offset 2
+    XX\x{110000}
+** Failed: character \x{110000} is greater than 0x10ffff and so cannot be converted to UTF-16
+    XX\x{d800}\x{1234}
+Failed: error -25: UTF-16 error: invalid low surrogate at offset 3
+\= Expect no match
+    XX\x{d800}\=offset=3
+No match
+    
+/(?<=.)X/utf
+    XX\x{d800}\=offset=3
+Failed: error -24: UTF-16 error: missing low surrogate at end at offset 2
+
+/(*UTF16)\x{11234}/
+  abcd\x{11234}pqr
+ 0: \x{11234}
+
+/(*UTF)\x{11234}/I
+Capturing subpattern count = 0
+Compile options: <none>
+Overall options: utf
+First code unit = \x{d804}
+Last code unit = \x{de34}
+Subject length lower bound = 1
+  abcd\x{11234}pqr
+ 0: \x{11234}
+
+/(*UTF-32)\x{11234}/
+Failed: error 134 at offset 17: character code point value in \x{} or \o{} is too large
+  abcd\x{11234}pqr
+
+/(*UTF-32)\x{112}/
+Failed: error 160 at offset 5: (*VERB) not recognized or malformed
+  abcd\x{11234}pqr
+
+/(*CRLF)(*UTF16)(*BSR_UNICODE)a\Rb/I
+Capturing subpattern count = 0
+Compile options: <none>
+Overall options: utf
+\R matches any Unicode newline
+Forced newline is CRLF
+First code unit = 'a'
+Last code unit = 'b'
+Subject length lower bound = 3
+
+/(*CRLF)(*UTF32)(*BSR_UNICODE)a\Rb/I
+Failed: error 160 at offset 12: (*VERB) not recognized or malformed
+
+/\h/I,utf
+Capturing subpattern count = 0
+Options: utf
+Starting code units: \x09 \x20 \xa0 \xff 
+Subject length lower bound = 1
+    ABC\x{09}
+ 0: \x{09}
+    ABC\x{20}
+ 0:  
+    ABC\x{a0}
+ 0: \x{a0}
+    ABC\x{1680}
+ 0: \x{1680}
+    ABC\x{180e}
+ 0: \x{180e}
+    ABC\x{2000}
+ 0: \x{2000}
+    ABC\x{202f}
+ 0: \x{202f}
+    ABC\x{205f}
+ 0: \x{205f}
+    ABC\x{3000}
+ 0: \x{3000}
+
+/\v/I,utf
+Capturing subpattern count = 0
+Options: utf
+Starting code units: \x0a \x0b \x0c \x0d \x85 \xff 
+Subject length lower bound = 1
+    ABC\x{0a}
+ 0: \x{0a}
+    ABC\x{0b}
+ 0: \x{0b}
+    ABC\x{0c}
+ 0: \x{0c}
+    ABC\x{0d}
+ 0: \x{0d}
+    ABC\x{85}
+ 0: \x{85}
+    ABC\x{2028}
+ 0: \x{2028}
+
+/\h*A/I,utf
+Capturing subpattern count = 0
+Options: utf
+Starting code units: \x09 \x20 A \xa0 \xff 
+Last code unit = 'A'
+Subject length lower bound = 1
+    CDBABC
+ 0: A
+    \x{2000}ABC
+ 0: \x{2000}A
+
+/\R*A/I,bsr=unicode,utf
+Capturing subpattern count = 0
+Options: utf
+\R matches any Unicode newline
+Starting code units: \x0a \x0b \x0c \x0d A \x85 \xff 
+Last code unit = 'A'
+Subject length lower bound = 1
+    CDBABC
+ 0: A
+    \x{2028}A
+ 0: \x{2028}A
+
+/\v+A/I,utf
+Capturing subpattern count = 0
+Options: utf
+Starting code units: \x0a \x0b \x0c \x0d \x85 \xff 
+Last code unit = 'A'
+Subject length lower bound = 2
+
+/\s?xxx\s/I,utf
+Capturing subpattern count = 0
+Options: utf
+Starting code units: \x09 \x0a \x0b \x0c \x0d \x20 x 
+Last code unit = 'x'
+Subject length lower bound = 4
+
+/\sxxx\s/I,utf,tables=2
+Capturing subpattern count = 0
+Options: utf
+Starting code units: \x09 \x0a \x0b \x0c \x0d \x20 \x85 \xa0 
+Last code unit = 'x'
+Subject length lower bound = 5
+    AB\x{85}xxx\x{a0}XYZ
+ 0: \x{85}xxx\x{a0}
+    AB\x{a0}xxx\x{85}XYZ
+ 0: \x{a0}xxx\x{85}
+
+/\S \S/I,utf,tables=2
+Capturing subpattern count = 0
+Options: utf
+Starting code units: \x00 \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x0e \x0f 
+  \x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17 \x18 \x19 \x1a \x1b \x1c \x1d \x1e 
+  \x1f ! " # $ % & ' ( ) * + , - . / 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 { | } ~ \x7f \x80 \x81 \x82 \x83 \x84 
+  \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 \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 
+Last code unit = ' '
+Subject length lower bound = 3
+    \x{a2} \x{84}
+ 0: \x{a2} \x{84}
+    A Z
+ 0: A Z
+
+/a+/utf
+    a\x{123}aa\=offset=1
+ 0: aa
+    a\x{123}aa\=offset=2
+ 0: aa
+    a\x{123}aa\=offset=3
+ 0: a
+\= Expect no match
+    a\x{123}aa\=offset=4
+No match
+\= Expect bad offset error     
+    a\x{123}aa\=offset=5
+Failed: error -33: bad offset value
+    a\x{123}aa\=offset=6
+Failed: error -33: bad offset value
+
+/\x{1234}+/Ii,utf
+Capturing subpattern count = 0
+Options: caseless utf
+First code unit = \x{1234}
+Subject length lower bound = 1
+
+/\x{1234}+?/Ii,utf
+Capturing subpattern count = 0
+Options: caseless utf
+First code unit = \x{1234}
+Subject length lower bound = 1
+
+/\x{1234}++/Ii,utf
+Capturing subpattern count = 0
+Options: caseless utf
+First code unit = \x{1234}
+Subject length lower bound = 1
+
+/\x{1234}{2}/Ii,utf
+Capturing subpattern count = 0
+Options: caseless utf
+First code unit = \x{1234}
+Last code unit = \x{1234}
+Subject length lower bound = 2
+
+/[^\x{c4}]/IB,utf
+------------------------------------------------------------------
+        Bra
+        [^\x{c4}]
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+Subject length lower bound = 1
+
+/X+\x{200}/IB,utf
+------------------------------------------------------------------
+        Bra
+        X++
+        \x{200}
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = 'X'
+Last code unit = \x{200}
+Subject length lower bound = 2
+
+/\R/I,utf
+Capturing subpattern count = 0
+Options: utf
+Starting code units: \x0a \x0b \x0c \x0d \x85 \xff 
+Subject length lower bound = 1
+
+# Check bad offset 
+
+/a/utf
+\= Expect bad UTF-16 offset, or no match in 32-bit
+    \x{10000}\=offset=1
+Error -36 (bad UTF-16 offset)
+    \x{10000}ab\=offset=1
+Error -36 (bad UTF-16 offset)
+\= Expect 16-bit match, 32-bit no match
+    \x{10000}ab\=offset=2
+ 0: a
+\= Expect no match     
+    \x{10000}ab\=offset=3
+No match
+\= Expect no match in 16-bit, bad offset in 32-bit    
+    \x{10000}ab\=offset=4
+No match
+\= Expect bad offset     
+    \x{10000}ab\=offset=5
+Failed: error -33: bad offset value
+
+/í¼€/utf
+Failed: error -26 at offset 0: UTF-16 error: isolated low surrogate
+
+/\w+\x{C4}/B,utf
+------------------------------------------------------------------
+        Bra
+        \w++
+        \x{c4}
+        Ket
+        End
+------------------------------------------------------------------
+    a\x{C4}\x{C4}
+ 0: a\x{c4}
+
+/\w+\x{C4}/B,utf,tables=2
+------------------------------------------------------------------
+        Bra
+        \w+
+        \x{c4}
+        Ket
+        End
+------------------------------------------------------------------
+    a\x{C4}\x{C4}
+ 0: a\x{c4}\x{c4}
+    
+/\W+\x{C4}/B,utf
+------------------------------------------------------------------
+        Bra
+        \W+
+        \x{c4}
+        Ket
+        End
+------------------------------------------------------------------
+    !\x{C4}
+ 0: !\x{c4}
+ 
+/\W+\x{C4}/B,utf,tables=2
+------------------------------------------------------------------
+        Bra
+        \W++
+        \x{c4}
+        Ket
+        End
+------------------------------------------------------------------
+    !\x{C4}
+ 0: !\x{c4}
+
+/\W+\x{A1}/B,utf
+------------------------------------------------------------------
+        Bra
+        \W+
+        \x{a1}
+        Ket
+        End
+------------------------------------------------------------------
+    !\x{A1}
+ 0: !\x{a1}
+ 
+/\W+\x{A1}/B,utf,tables=2
+------------------------------------------------------------------
+        Bra
+        \W+
+        \x{a1}
+        Ket
+        End
+------------------------------------------------------------------
+    !\x{A1}
+ 0: !\x{a1}
+
+/X\s+\x{A0}/B,utf
+------------------------------------------------------------------
+        Bra
+        X
+        \s++
+        \x{a0}
+        Ket
+        End
+------------------------------------------------------------------
+    X\x20\x{A0}\x{A0}
+ 0: X \x{a0}
+
+/X\s+\x{A0}/B,utf,tables=2
+------------------------------------------------------------------
+        Bra
+        X
+        \s+
+        \x{a0}
+        Ket
+        End
+------------------------------------------------------------------
+    X\x20\x{A0}\x{A0}
+ 0: X \x{a0}\x{a0}
+
+/\S+\x{A0}/B,utf
+------------------------------------------------------------------
+        Bra
+        \S+
+        \x{a0}
+        Ket
+        End
+------------------------------------------------------------------
+    X\x{A0}\x{A0}
+ 0: X\x{a0}\x{a0}
+
+/\S+\x{A0}/B,utf,tables=2
+------------------------------------------------------------------
+        Bra
+        \S++
+        \x{a0}
+        Ket
+        End
+------------------------------------------------------------------
+    X\x{A0}\x{A0}
+ 0: X\x{a0}
+
+/\x{a0}+\s!/B,utf
+------------------------------------------------------------------
+        Bra
+        \x{a0}++
+        \s
+        !
+        Ket
+        End
+------------------------------------------------------------------
+    \x{a0}\x20!
+ 0: \x{a0} !
+
+/\x{a0}+\s!/B,utf,tables=2
+------------------------------------------------------------------
+        Bra
+        \x{a0}+
+        \s
+        !
+        Ket
+        End
+------------------------------------------------------------------
+    \x{a0}\x20!
+ 0: \x{a0} !
+
+/(*UTF)abc/never_utf
+Failed: error 174 at offset 6: using UTF is disabled by the application
+
+/abc/utf,never_utf
+Failed: error 174 at offset 0: using UTF is disabled by the application
+
+/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/IBi,utf
+------------------------------------------------------------------
+        Bra
+     /i A\x{391}\x{10427}\x{ff3a}\x{1fb0}
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: caseless utf
+First code unit = 'A' (caseless)
+Last code unit = \x{1fb0} (caseless)
+Subject length lower bound = 5
+
+/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/IB,utf
+------------------------------------------------------------------
+        Bra
+        A\x{391}\x{10427}\x{ff3a}\x{1fb0}
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = 'A'
+Last code unit = \x{1fb0}
+Subject length lower bound = 5
+
+/AB\x{1fb0}/IB,utf
+------------------------------------------------------------------
+        Bra
+        AB\x{1fb0}
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = 'A'
+Last code unit = \x{1fb0}
+Subject length lower bound = 3
+
+/AB\x{1fb0}/IBi,utf
+------------------------------------------------------------------
+        Bra
+     /i AB\x{1fb0}
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: caseless utf
+First code unit = 'A' (caseless)
+Last code unit = \x{1fb0} (caseless)
+Subject length lower bound = 3
+
+/\x{401}\x{420}\x{421}\x{422}\x{423}\x{424}\x{425}\x{426}\x{427}\x{428}\x{429}\x{42a}\x{42b}\x{42c}\x{42d}\x{42e}\x{42f}/Ii,utf
+Capturing subpattern count = 0
+Options: caseless utf
+First code unit = \x{401} (caseless)
+Last code unit = \x{42f} (caseless)
+Subject length lower bound = 17
+    \x{401}\x{420}\x{421}\x{422}\x{423}\x{424}\x{425}\x{426}\x{427}\x{428}\x{429}\x{42a}\x{42b}\x{42c}\x{42d}\x{42e}\x{42f}
+ 0: \x{401}\x{420}\x{421}\x{422}\x{423}\x{424}\x{425}\x{426}\x{427}\x{428}\x{429}\x{42a}\x{42b}\x{42c}\x{42d}\x{42e}\x{42f}
+    \x{451}\x{440}\x{441}\x{442}\x{443}\x{444}\x{445}\x{446}\x{447}\x{448}\x{449}\x{44a}\x{44b}\x{44c}\x{44d}\x{44e}\x{44f}
+ 0: \x{451}\x{440}\x{441}\x{442}\x{443}\x{444}\x{445}\x{446}\x{447}\x{448}\x{449}\x{44a}\x{44b}\x{44c}\x{44d}\x{44e}\x{44f}
+
+/[ⱥ]/Bi,utf
+------------------------------------------------------------------
+        Bra
+     /i \x{2c65}
+        Ket
+        End
+------------------------------------------------------------------
+
+/[^ⱥ]/Bi,utf
+------------------------------------------------------------------
+        Bra
+     /i [^\x{2c65}]
+        Ket
+        End
+------------------------------------------------------------------
+
+/[[:blank:]]/B,ucp
+------------------------------------------------------------------
+        Bra
+        [\x09 \xa0\x{1680}\x{180e}\x{2000}-\x{200a}\x{202f}\x{205f}\x{3000}]
+        Ket
+        End
+------------------------------------------------------------------
+
+/\x{212a}+/Ii,utf
+Capturing subpattern count = 0
+Options: caseless utf
+Starting code units: K k \xff 
+Subject length lower bound = 1
+    KKkk\x{212a}
+ 0: KKkk\x{212a}
+
+/s+/Ii,utf
+Capturing subpattern count = 0
+Options: caseless utf
+Starting code units: S s \xff 
+Subject length lower bound = 1
+    SSss\x{17f}
+ 0: SSss\x{17f}
+
+# Non-UTF characters should give errors in both 16-bit and 32-bit modes.
+
+/\x{110000}/utf
+Failed: error 134 at offset 9: character code point value in \x{} or \o{} is too large
+
+/\o{4200000}/utf
+Failed: error 134 at offset 10: character code point value in \x{} or \o{} is too large
+
+/\x{100}*A/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{100}*+
+        A
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+Starting code units: A \xff 
+Last code unit = 'A'
+Subject length lower bound = 1
+    A
+ 0: A
+
+/\x{100}*\d(?R)/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{100}*+
+        \d
+        Recurse
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+Starting code units: 0 1 2 3 4 5 6 7 8 9 \xff 
+Subject length lower bound = 1
+
+/[Z\x{100}]/IB,utf
+------------------------------------------------------------------
+        Bra
+        [Z\x{100}]
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+Starting code units: Z \xff 
+Subject length lower bound = 1
+    Z\x{100}
+ 0: Z
+    \x{100}
+ 0: \x{100}
+    \x{100}Z
+ 0: \x{100}
+
+/[z-\x{100}]/IB,utf
+------------------------------------------------------------------
+        Bra
+        [z-\xff\x{100}]
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+Starting code units: 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 
+Subject length lower bound = 1
+
+/[z\Qa-d]Ā\E]/IB,utf
+------------------------------------------------------------------
+        Bra
+        [\-\]adz\x{100}]
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+Starting code units: - ] a d z \xff 
+Subject length lower bound = 1
+    \x{100}
+ 0: \x{100}
+    Ā 
+ 0: \x{100}
+
+/[ab\x{100}]abc(xyz(?1))/IB,utf
+------------------------------------------------------------------
+        Bra
+        [ab\x{100}]
+        abc
+        CBra 1
+        xyz
+        Recurse
+        Ket
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 1
+Options: utf
+Starting code units: a b \xff 
+Last code unit = 'z'
+Subject length lower bound = 7
+
+/\x{100}*\s/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{100}*+
+        \s
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+Starting code units: \x09 \x0a \x0b \x0c \x0d \x20 \xff 
+Subject length lower bound = 1
+
+/\x{100}*\d/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{100}*+
+        \d
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+Starting code units: 0 1 2 3 4 5 6 7 8 9 \xff 
+Subject length lower bound = 1
+
+/\x{100}*\w/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{100}*+
+        \w
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+Starting code units: 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 
+  \xff 
+Subject length lower bound = 1
+
+/\x{100}*\D/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{100}*
+        \D
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+Starting code units: \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 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 { | } ~ \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 
+Subject length lower bound = 1
+
+/\x{100}*\S/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{100}*
+        \S
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+Starting code units: \x00 \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x0e \x0f 
+  \x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17 \x18 \x19 \x1a \x1b \x1c \x1d \x1e 
+  \x1f ! " # $ % & ' ( ) * + , - . / 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 { | } ~ \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 
+Subject length lower bound = 1
+
+/\x{100}*\W/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{100}*
+        \W
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+Starting code units: \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 ! " # $ % & ' ( ) * + , - . / : ; < = > 
+  ? @ [ \ ] ^ ` { | } ~ \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 
+Subject length lower bound = 1
+
+/[\x{105}-\x{109}]/IBi,utf
+------------------------------------------------------------------
+        Bra
+        [\x{104}-\x{109}]
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: caseless utf
+Starting code units: \xff 
+Subject length lower bound = 1
+    \x{104}
+ 0: \x{104}
+    \x{105}
+ 0: \x{105}
+    \x{109}  
+ 0: \x{109}
+\= Expect no match
+    \x{100}
+No match
+    \x{10a} 
+No match
+    
+/[z-\x{100}]/IBi,utf
+------------------------------------------------------------------
+        Bra
+        [Zz-\xff\x{39c}\x{3bc}\x{212b}\x{1e9e}\x{212b}\x{178}\x{100}-\x{101}]
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: caseless utf
+Starting code units: Z 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 
+Subject length lower bound = 1
+    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}
+\= Expect no match
+    \x{102}
+No match
+    Y
+No match
+    y           
+No match
+
+/[z-\x{100}]/IBi,utf
+------------------------------------------------------------------
+        Bra
+        [Zz-\xff\x{39c}\x{3bc}\x{212b}\x{1e9e}\x{212b}\x{178}\x{100}-\x{101}]
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: caseless utf
+Starting code units: Z 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 
+Subject length lower bound = 1
+
+/\x{3a3}B/IBi,utf
+------------------------------------------------------------------
+        Bra
+        clist 03a3 03c2 03c3
+     /i B
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: caseless utf
+Starting code units: \xff 
+Last code unit = 'B' (caseless)
+Subject length lower bound = 2
+
+/./utf
+    \x{110000}
+** Failed: character \x{110000} is greater than 0x10ffff and so cannot be converted to UTF-16
+
+# End of testinput12
diff --git a/dist2/testdata/testoutput12-32 b/dist2/testdata/testoutput12-32
new file mode 100644
index 0000000..95f1834
--- /dev/null
+++ b/dist2/testdata/testoutput12-32
@@ -0,0 +1,1364 @@
+# This set of tests is for UTF-16 and UTF-32 support, including Unicode
+# properties. It is relevant only to the 16-bit and 32-bit libraries. The
+# output is different for each library, so there are separate output files.
+
+/ÃÃÃxxx/IB,utf,no_utf_check
+** Failed: invalid UTF-8 string cannot be converted to 32-bit string
+
+/abc/utf
+    Ã]
+** Failed: invalid UTF-8 string cannot be used as input in UTF mode
+
+# Check maximum character size 
+
+/\x{ffff}/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{ffff}
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = \x{ffff}
+Subject length lower bound = 1
+
+/\x{10000}/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{10000}
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = \x{10000}
+Subject length lower bound = 1
+
+/\x{100}/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{100}
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = \x{100}
+Subject length lower bound = 1
+
+/\x{1000}/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{1000}
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = \x{1000}
+Subject length lower bound = 1
+
+/\x{10000}/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{10000}
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = \x{10000}
+Subject length lower bound = 1
+
+/\x{100000}/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{100000}
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = \x{100000}
+Subject length lower bound = 1
+
+/\x{10ffff}/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{10ffff}
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = \x{10ffff}
+Subject length lower bound = 1
+
+/[\x{ff}]/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{ff}
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = \xff
+Subject length lower bound = 1
+
+/[\x{100}]/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{100}
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = \x{100}
+Subject length lower bound = 1
+
+/\x80/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{80}
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = \x80
+Subject length lower bound = 1
+
+/\xff/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{ff}
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = \xff
+Subject length lower bound = 1
+
+/\x{D55c}\x{ad6d}\x{C5B4}/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{d55c}\x{ad6d}\x{c5b4}
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = \x{d55c}
+Last code unit = \x{c5b4}
+Subject length lower bound = 3
+    \x{D55c}\x{ad6d}\x{C5B4}
+ 0: \x{d55c}\x{ad6d}\x{c5b4}
+
+/\x{65e5}\x{672c}\x{8a9e}/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{65e5}\x{672c}\x{8a9e}
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = \x{65e5}
+Last code unit = \x{8a9e}
+Subject length lower bound = 3
+    \x{65e5}\x{672c}\x{8a9e}
+ 0: \x{65e5}\x{672c}\x{8a9e}
+
+/\x{80}/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{80}
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = \x80
+Subject length lower bound = 1
+
+/\x{084}/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{84}
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = \x84
+Subject length lower bound = 1
+
+/\x{104}/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{104}
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = \x{104}
+Subject length lower bound = 1
+
+/\x{861}/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{861}
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = \x{861}
+Subject length lower bound = 1
+
+/\x{212ab}/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{212ab}
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = \x{212ab}
+Subject length lower bound = 1
+
+/[^ab\xC0-\xF0]/IB,utf
+------------------------------------------------------------------
+        Bra
+        [\x00-`c-\xbf\xf1-\xff] (neg)
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+Starting code units: \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 \xf1 \xf2 \xf3 \xf4 \xf5 \xf6 \xf7 \xf8 \xf9 \xfa \xfb 
+  \xfc \xfd \xfe \xff 
+Subject length lower bound = 1
+    \x{f1}
+ 0: \x{f1}
+    \x{bf}
+ 0: \x{bf}
+    \x{100}
+ 0: \x{100}
+    \x{1000}
+ 0: \x{1000}
+\= Expect no match
+    \x{c0}
+No match
+    \x{f0}
+No match
+
+/Ā{3,4}/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{100}{3}
+        \x{100}?+
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = \x{100}
+Last code unit = \x{100}
+Subject length lower bound = 3
+  \x{100}\x{100}\x{100}\x{100\x{100}
+ 0: \x{100}\x{100}\x{100}
+
+/(\x{100}+|x)/IB,utf
+------------------------------------------------------------------
+        Bra
+        CBra 1
+        \x{100}++
+        Alt
+        x
+        Ket
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 1
+Options: utf
+Starting code units: x \xff 
+Subject length lower bound = 1
+
+/(\x{100}*a|x)/IB,utf
+------------------------------------------------------------------
+        Bra
+        CBra 1
+        \x{100}*+
+        a
+        Alt
+        x
+        Ket
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 1
+Options: utf
+Starting code units: a x \xff 
+Subject length lower bound = 1
+
+/(\x{100}{0,2}a|x)/IB,utf
+------------------------------------------------------------------
+        Bra
+        CBra 1
+        \x{100}{0,2}+
+        a
+        Alt
+        x
+        Ket
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 1
+Options: utf
+Starting code units: a x \xff 
+Subject length lower bound = 1
+
+/(\x{100}{1,2}a|x)/IB,utf
+------------------------------------------------------------------
+        Bra
+        CBra 1
+        \x{100}
+        \x{100}{0,1}+
+        a
+        Alt
+        x
+        Ket
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 1
+Options: utf
+Starting code units: x \xff 
+Subject length lower bound = 1
+
+/\x{100}/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{100}
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = \x{100}
+Subject length lower bound = 1
+
+/a\x{100}\x{101}*/IB,utf
+------------------------------------------------------------------
+        Bra
+        a\x{100}
+        \x{101}*+
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = 'a'
+Last code unit = \x{100}
+Subject length lower bound = 2
+
+/a\x{100}\x{101}+/IB,utf
+------------------------------------------------------------------
+        Bra
+        a\x{100}
+        \x{101}++
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = 'a'
+Last code unit = \x{101}
+Subject length lower bound = 3
+
+/[^\x{c4}]/IB
+------------------------------------------------------------------
+        Bra
+        [^\x{c4}]
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Subject length lower bound = 1
+
+/[\x{100}]/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{100}
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = \x{100}
+Subject length lower bound = 1
+    \x{100}
+ 0: \x{100}
+    Z\x{100}
+ 0: \x{100}
+    \x{100}Z
+ 0: \x{100}
+
+/[\xff]/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{ff}
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = \xff
+Subject length lower bound = 1
+    >\x{ff}<
+ 0: \x{ff}
+
+/[^\xff]/IB,utf
+------------------------------------------------------------------
+        Bra
+        [^\x{ff}]
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+Subject length lower bound = 1
+
+/\x{100}abc(xyz(?1))/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{100}abc
+        CBra 1
+        xyz
+        Recurse
+        Ket
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 1
+Options: utf
+First code unit = \x{100}
+Last code unit = 'z'
+Subject length lower bound = 7
+
+/\777/I,utf
+Capturing subpattern count = 0
+Options: utf
+First code unit = \x{1ff}
+Subject length lower bound = 1
+  \x{1ff}
+ 0: \x{1ff}
+  \777
+ 0: \x{1ff}
+
+/\x{100}+\x{200}/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{100}++
+        \x{200}
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = \x{100}
+Last code unit = \x{200}
+Subject length lower bound = 2
+
+/\x{100}+X/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{100}++
+        X
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = \x{100}
+Last code unit = 'X'
+Subject length lower bound = 2
+
+/^[\QĀ\E-\QŐ\E/B,utf
+Failed: error 106 at offset 13: missing terminating ] for character class
+
+/X/utf
+    XX\x{d800}\=no_utf_check
+ 0: X
+    XX\x{da00}\=no_utf_check
+ 0: X
+    XX\x{dc00}\=no_utf_check
+ 0: X
+    XX\x{de00}\=no_utf_check
+ 0: X
+    XX\x{dfff}\=no_utf_check
+ 0: X
+\= Expect UTF error
+    XX\x{d800}
+Failed: error -27: UTF-32 error: code points 0xd800-0xdfff are not defined at offset 2
+    XX\x{da00}
+Failed: error -27: UTF-32 error: code points 0xd800-0xdfff are not defined at offset 2
+    XX\x{dc00}
+Failed: error -27: UTF-32 error: code points 0xd800-0xdfff are not defined at offset 2
+    XX\x{de00}
+Failed: error -27: UTF-32 error: code points 0xd800-0xdfff are not defined at offset 2
+    XX\x{dfff}
+Failed: error -27: UTF-32 error: code points 0xd800-0xdfff are not defined at offset 2
+    XX\x{110000}
+Failed: error -28: UTF-32 error: code points greater than 0x10ffff are not defined at offset 2
+    XX\x{d800}\x{1234}
+Failed: error -27: UTF-32 error: code points 0xd800-0xdfff are not defined at offset 2
+\= Expect no match
+    XX\x{d800}\=offset=3
+No match
+    
+/(?<=.)X/utf
+    XX\x{d800}\=offset=3
+Failed: error -27: UTF-32 error: code points 0xd800-0xdfff are not defined at offset 2
+
+/(*UTF16)\x{11234}/
+Failed: error 160 at offset 5: (*VERB) not recognized or malformed
+  abcd\x{11234}pqr
+
+/(*UTF)\x{11234}/I
+Capturing subpattern count = 0
+Compile options: <none>
+Overall options: utf
+First code unit = \x{11234}
+Subject length lower bound = 1
+  abcd\x{11234}pqr
+ 0: \x{11234}
+
+/(*UTF-32)\x{11234}/
+Failed: error 160 at offset 5: (*VERB) not recognized or malformed
+  abcd\x{11234}pqr
+
+/(*UTF-32)\x{112}/
+Failed: error 160 at offset 5: (*VERB) not recognized or malformed
+  abcd\x{11234}pqr
+
+/(*CRLF)(*UTF16)(*BSR_UNICODE)a\Rb/I
+Failed: error 160 at offset 12: (*VERB) not recognized or malformed
+
+/(*CRLF)(*UTF32)(*BSR_UNICODE)a\Rb/I
+Capturing subpattern count = 0
+Compile options: <none>
+Overall options: utf
+\R matches any Unicode newline
+Forced newline is CRLF
+First code unit = 'a'
+Last code unit = 'b'
+Subject length lower bound = 3
+
+/\h/I,utf
+Capturing subpattern count = 0
+Options: utf
+Starting code units: \x09 \x20 \xa0 \xff 
+Subject length lower bound = 1
+    ABC\x{09}
+ 0: \x{09}
+    ABC\x{20}
+ 0:  
+    ABC\x{a0}
+ 0: \x{a0}
+    ABC\x{1680}
+ 0: \x{1680}
+    ABC\x{180e}
+ 0: \x{180e}
+    ABC\x{2000}
+ 0: \x{2000}
+    ABC\x{202f}
+ 0: \x{202f}
+    ABC\x{205f}
+ 0: \x{205f}
+    ABC\x{3000}
+ 0: \x{3000}
+
+/\v/I,utf
+Capturing subpattern count = 0
+Options: utf
+Starting code units: \x0a \x0b \x0c \x0d \x85 \xff 
+Subject length lower bound = 1
+    ABC\x{0a}
+ 0: \x{0a}
+    ABC\x{0b}
+ 0: \x{0b}
+    ABC\x{0c}
+ 0: \x{0c}
+    ABC\x{0d}
+ 0: \x{0d}
+    ABC\x{85}
+ 0: \x{85}
+    ABC\x{2028}
+ 0: \x{2028}
+
+/\h*A/I,utf
+Capturing subpattern count = 0
+Options: utf
+Starting code units: \x09 \x20 A \xa0 \xff 
+Last code unit = 'A'
+Subject length lower bound = 1
+    CDBABC
+ 0: A
+    \x{2000}ABC
+ 0: \x{2000}A
+
+/\R*A/I,bsr=unicode,utf
+Capturing subpattern count = 0
+Options: utf
+\R matches any Unicode newline
+Starting code units: \x0a \x0b \x0c \x0d A \x85 \xff 
+Last code unit = 'A'
+Subject length lower bound = 1
+    CDBABC
+ 0: A
+    \x{2028}A
+ 0: \x{2028}A
+
+/\v+A/I,utf
+Capturing subpattern count = 0
+Options: utf
+Starting code units: \x0a \x0b \x0c \x0d \x85 \xff 
+Last code unit = 'A'
+Subject length lower bound = 2
+
+/\s?xxx\s/I,utf
+Capturing subpattern count = 0
+Options: utf
+Starting code units: \x09 \x0a \x0b \x0c \x0d \x20 x 
+Last code unit = 'x'
+Subject length lower bound = 4
+
+/\sxxx\s/I,utf,tables=2
+Capturing subpattern count = 0
+Options: utf
+Starting code units: \x09 \x0a \x0b \x0c \x0d \x20 \x85 \xa0 
+Last code unit = 'x'
+Subject length lower bound = 5
+    AB\x{85}xxx\x{a0}XYZ
+ 0: \x{85}xxx\x{a0}
+    AB\x{a0}xxx\x{85}XYZ
+ 0: \x{a0}xxx\x{85}
+
+/\S \S/I,utf,tables=2
+Capturing subpattern count = 0
+Options: utf
+Starting code units: \x00 \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x0e \x0f 
+  \x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17 \x18 \x19 \x1a \x1b \x1c \x1d \x1e 
+  \x1f ! " # $ % & ' ( ) * + , - . / 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 { | } ~ \x7f \x80 \x81 \x82 \x83 \x84 
+  \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 \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 
+Last code unit = ' '
+Subject length lower bound = 3
+    \x{a2} \x{84}
+ 0: \x{a2} \x{84}
+    A Z
+ 0: A Z
+
+/a+/utf
+    a\x{123}aa\=offset=1
+ 0: aa
+    a\x{123}aa\=offset=2
+ 0: aa
+    a\x{123}aa\=offset=3
+ 0: a
+\= Expect no match
+    a\x{123}aa\=offset=4
+No match
+\= Expect bad offset error     
+    a\x{123}aa\=offset=5
+Failed: error -33: bad offset value
+    a\x{123}aa\=offset=6
+Failed: error -33: bad offset value
+
+/\x{1234}+/Ii,utf
+Capturing subpattern count = 0
+Options: caseless utf
+First code unit = \x{1234}
+Subject length lower bound = 1
+
+/\x{1234}+?/Ii,utf
+Capturing subpattern count = 0
+Options: caseless utf
+First code unit = \x{1234}
+Subject length lower bound = 1
+
+/\x{1234}++/Ii,utf
+Capturing subpattern count = 0
+Options: caseless utf
+First code unit = \x{1234}
+Subject length lower bound = 1
+
+/\x{1234}{2}/Ii,utf
+Capturing subpattern count = 0
+Options: caseless utf
+First code unit = \x{1234}
+Last code unit = \x{1234}
+Subject length lower bound = 2
+
+/[^\x{c4}]/IB,utf
+------------------------------------------------------------------
+        Bra
+        [^\x{c4}]
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+Subject length lower bound = 1
+
+/X+\x{200}/IB,utf
+------------------------------------------------------------------
+        Bra
+        X++
+        \x{200}
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = 'X'
+Last code unit = \x{200}
+Subject length lower bound = 2
+
+/\R/I,utf
+Capturing subpattern count = 0
+Options: utf
+Starting code units: \x0a \x0b \x0c \x0d \x85 \xff 
+Subject length lower bound = 1
+
+# Check bad offset 
+
+/a/utf
+\= Expect bad UTF-16 offset, or no match in 32-bit
+    \x{10000}\=offset=1
+No match
+    \x{10000}ab\=offset=1
+ 0: a
+\= Expect 16-bit match, 32-bit no match
+    \x{10000}ab\=offset=2
+No match
+\= Expect no match     
+    \x{10000}ab\=offset=3
+No match
+\= Expect no match in 16-bit, bad offset in 32-bit    
+    \x{10000}ab\=offset=4
+Failed: error -33: bad offset value
+\= Expect bad offset     
+    \x{10000}ab\=offset=5
+Failed: error -33: bad offset value
+
+/í¼€/utf
+Failed: error -27 at offset 0: UTF-32 error: code points 0xd800-0xdfff are not defined
+
+/\w+\x{C4}/B,utf
+------------------------------------------------------------------
+        Bra
+        \w++
+        \x{c4}
+        Ket
+        End
+------------------------------------------------------------------
+    a\x{C4}\x{C4}
+ 0: a\x{c4}
+
+/\w+\x{C4}/B,utf,tables=2
+------------------------------------------------------------------
+        Bra
+        \w+
+        \x{c4}
+        Ket
+        End
+------------------------------------------------------------------
+    a\x{C4}\x{C4}
+ 0: a\x{c4}\x{c4}
+    
+/\W+\x{C4}/B,utf
+------------------------------------------------------------------
+        Bra
+        \W+
+        \x{c4}
+        Ket
+        End
+------------------------------------------------------------------
+    !\x{C4}
+ 0: !\x{c4}
+ 
+/\W+\x{C4}/B,utf,tables=2
+------------------------------------------------------------------
+        Bra
+        \W++
+        \x{c4}
+        Ket
+        End
+------------------------------------------------------------------
+    !\x{C4}
+ 0: !\x{c4}
+
+/\W+\x{A1}/B,utf
+------------------------------------------------------------------
+        Bra
+        \W+
+        \x{a1}
+        Ket
+        End
+------------------------------------------------------------------
+    !\x{A1}
+ 0: !\x{a1}
+ 
+/\W+\x{A1}/B,utf,tables=2
+------------------------------------------------------------------
+        Bra
+        \W+
+        \x{a1}
+        Ket
+        End
+------------------------------------------------------------------
+    !\x{A1}
+ 0: !\x{a1}
+
+/X\s+\x{A0}/B,utf
+------------------------------------------------------------------
+        Bra
+        X
+        \s++
+        \x{a0}
+        Ket
+        End
+------------------------------------------------------------------
+    X\x20\x{A0}\x{A0}
+ 0: X \x{a0}
+
+/X\s+\x{A0}/B,utf,tables=2
+------------------------------------------------------------------
+        Bra
+        X
+        \s+
+        \x{a0}
+        Ket
+        End
+------------------------------------------------------------------
+    X\x20\x{A0}\x{A0}
+ 0: X \x{a0}\x{a0}
+
+/\S+\x{A0}/B,utf
+------------------------------------------------------------------
+        Bra
+        \S+
+        \x{a0}
+        Ket
+        End
+------------------------------------------------------------------
+    X\x{A0}\x{A0}
+ 0: X\x{a0}\x{a0}
+
+/\S+\x{A0}/B,utf,tables=2
+------------------------------------------------------------------
+        Bra
+        \S++
+        \x{a0}
+        Ket
+        End
+------------------------------------------------------------------
+    X\x{A0}\x{A0}
+ 0: X\x{a0}
+
+/\x{a0}+\s!/B,utf
+------------------------------------------------------------------
+        Bra
+        \x{a0}++
+        \s
+        !
+        Ket
+        End
+------------------------------------------------------------------
+    \x{a0}\x20!
+ 0: \x{a0} !
+
+/\x{a0}+\s!/B,utf,tables=2
+------------------------------------------------------------------
+        Bra
+        \x{a0}+
+        \s
+        !
+        Ket
+        End
+------------------------------------------------------------------
+    \x{a0}\x20!
+ 0: \x{a0} !
+
+/(*UTF)abc/never_utf
+Failed: error 174 at offset 6: using UTF is disabled by the application
+
+/abc/utf,never_utf
+Failed: error 174 at offset 0: using UTF is disabled by the application
+
+/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/IBi,utf
+------------------------------------------------------------------
+        Bra
+     /i A\x{391}\x{10427}\x{ff3a}\x{1fb0}
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: caseless utf
+First code unit = 'A' (caseless)
+Last code unit = \x{1fb0} (caseless)
+Subject length lower bound = 5
+
+/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/IB,utf
+------------------------------------------------------------------
+        Bra
+        A\x{391}\x{10427}\x{ff3a}\x{1fb0}
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = 'A'
+Last code unit = \x{1fb0}
+Subject length lower bound = 5
+
+/AB\x{1fb0}/IB,utf
+------------------------------------------------------------------
+        Bra
+        AB\x{1fb0}
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = 'A'
+Last code unit = \x{1fb0}
+Subject length lower bound = 3
+
+/AB\x{1fb0}/IBi,utf
+------------------------------------------------------------------
+        Bra
+     /i AB\x{1fb0}
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: caseless utf
+First code unit = 'A' (caseless)
+Last code unit = \x{1fb0} (caseless)
+Subject length lower bound = 3
+
+/\x{401}\x{420}\x{421}\x{422}\x{423}\x{424}\x{425}\x{426}\x{427}\x{428}\x{429}\x{42a}\x{42b}\x{42c}\x{42d}\x{42e}\x{42f}/Ii,utf
+Capturing subpattern count = 0
+Options: caseless utf
+First code unit = \x{401} (caseless)
+Last code unit = \x{42f} (caseless)
+Subject length lower bound = 17
+    \x{401}\x{420}\x{421}\x{422}\x{423}\x{424}\x{425}\x{426}\x{427}\x{428}\x{429}\x{42a}\x{42b}\x{42c}\x{42d}\x{42e}\x{42f}
+ 0: \x{401}\x{420}\x{421}\x{422}\x{423}\x{424}\x{425}\x{426}\x{427}\x{428}\x{429}\x{42a}\x{42b}\x{42c}\x{42d}\x{42e}\x{42f}
+    \x{451}\x{440}\x{441}\x{442}\x{443}\x{444}\x{445}\x{446}\x{447}\x{448}\x{449}\x{44a}\x{44b}\x{44c}\x{44d}\x{44e}\x{44f}
+ 0: \x{451}\x{440}\x{441}\x{442}\x{443}\x{444}\x{445}\x{446}\x{447}\x{448}\x{449}\x{44a}\x{44b}\x{44c}\x{44d}\x{44e}\x{44f}
+
+/[ⱥ]/Bi,utf
+------------------------------------------------------------------
+        Bra
+     /i \x{2c65}
+        Ket
+        End
+------------------------------------------------------------------
+
+/[^ⱥ]/Bi,utf
+------------------------------------------------------------------
+        Bra
+     /i [^\x{2c65}]
+        Ket
+        End
+------------------------------------------------------------------
+
+/[[:blank:]]/B,ucp
+------------------------------------------------------------------
+        Bra
+        [\x09 \xa0\x{1680}\x{180e}\x{2000}-\x{200a}\x{202f}\x{205f}\x{3000}]
+        Ket
+        End
+------------------------------------------------------------------
+
+/\x{212a}+/Ii,utf
+Capturing subpattern count = 0
+Options: caseless utf
+Starting code units: K k \xff 
+Subject length lower bound = 1
+    KKkk\x{212a}
+ 0: KKkk\x{212a}
+
+/s+/Ii,utf
+Capturing subpattern count = 0
+Options: caseless utf
+Starting code units: S s \xff 
+Subject length lower bound = 1
+    SSss\x{17f}
+ 0: SSss\x{17f}
+
+# Non-UTF characters should give errors in both 16-bit and 32-bit modes.
+
+/\x{110000}/utf
+Failed: error 134 at offset 9: character code point value in \x{} or \o{} is too large
+
+/\o{4200000}/utf
+Failed: error 134 at offset 10: character code point value in \x{} or \o{} is too large
+
+/\x{100}*A/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{100}*+
+        A
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+Starting code units: A \xff 
+Last code unit = 'A'
+Subject length lower bound = 1
+    A
+ 0: A
+
+/\x{100}*\d(?R)/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{100}*+
+        \d
+        Recurse
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+Starting code units: 0 1 2 3 4 5 6 7 8 9 \xff 
+Subject length lower bound = 1
+
+/[Z\x{100}]/IB,utf
+------------------------------------------------------------------
+        Bra
+        [Z\x{100}]
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+Starting code units: Z \xff 
+Subject length lower bound = 1
+    Z\x{100}
+ 0: Z
+    \x{100}
+ 0: \x{100}
+    \x{100}Z
+ 0: \x{100}
+
+/[z-\x{100}]/IB,utf
+------------------------------------------------------------------
+        Bra
+        [z-\xff\x{100}]
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+Starting code units: 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 
+Subject length lower bound = 1
+
+/[z\Qa-d]Ā\E]/IB,utf
+------------------------------------------------------------------
+        Bra
+        [\-\]adz\x{100}]
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+Starting code units: - ] a d z \xff 
+Subject length lower bound = 1
+    \x{100}
+ 0: \x{100}
+    Ā 
+ 0: \x{100}
+
+/[ab\x{100}]abc(xyz(?1))/IB,utf
+------------------------------------------------------------------
+        Bra
+        [ab\x{100}]
+        abc
+        CBra 1
+        xyz
+        Recurse
+        Ket
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 1
+Options: utf
+Starting code units: a b \xff 
+Last code unit = 'z'
+Subject length lower bound = 7
+
+/\x{100}*\s/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{100}*+
+        \s
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+Starting code units: \x09 \x0a \x0b \x0c \x0d \x20 \xff 
+Subject length lower bound = 1
+
+/\x{100}*\d/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{100}*+
+        \d
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+Starting code units: 0 1 2 3 4 5 6 7 8 9 \xff 
+Subject length lower bound = 1
+
+/\x{100}*\w/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{100}*+
+        \w
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+Starting code units: 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 
+  \xff 
+Subject length lower bound = 1
+
+/\x{100}*\D/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{100}*
+        \D
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+Starting code units: \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 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 { | } ~ \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 
+Subject length lower bound = 1
+
+/\x{100}*\S/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{100}*
+        \S
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+Starting code units: \x00 \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x0e \x0f 
+  \x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17 \x18 \x19 \x1a \x1b \x1c \x1d \x1e 
+  \x1f ! " # $ % & ' ( ) * + , - . / 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 { | } ~ \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 
+Subject length lower bound = 1
+
+/\x{100}*\W/IB,utf
+------------------------------------------------------------------
+        Bra
+        \x{100}*
+        \W
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+Starting code units: \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 ! " # $ % & ' ( ) * + , - . / : ; < = > 
+  ? @ [ \ ] ^ ` { | } ~ \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 
+Subject length lower bound = 1
+
+/[\x{105}-\x{109}]/IBi,utf
+------------------------------------------------------------------
+        Bra
+        [\x{104}-\x{109}]
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: caseless utf
+Starting code units: \xff 
+Subject length lower bound = 1
+    \x{104}
+ 0: \x{104}
+    \x{105}
+ 0: \x{105}
+    \x{109}  
+ 0: \x{109}
+\= Expect no match
+    \x{100}
+No match
+    \x{10a} 
+No match
+    
+/[z-\x{100}]/IBi,utf
+------------------------------------------------------------------
+        Bra
+        [Zz-\xff\x{39c}\x{3bc}\x{212b}\x{1e9e}\x{212b}\x{178}\x{100}-\x{101}]
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: caseless utf
+Starting code units: Z 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 
+Subject length lower bound = 1
+    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}
+\= Expect no match
+    \x{102}
+No match
+    Y
+No match
+    y           
+No match
+
+/[z-\x{100}]/IBi,utf
+------------------------------------------------------------------
+        Bra
+        [Zz-\xff\x{39c}\x{3bc}\x{212b}\x{1e9e}\x{212b}\x{178}\x{100}-\x{101}]
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: caseless utf
+Starting code units: Z 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 
+Subject length lower bound = 1
+
+/\x{3a3}B/IBi,utf
+------------------------------------------------------------------
+        Bra
+        clist 03a3 03c2 03c3
+     /i B
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: caseless utf
+Starting code units: \xff 
+Last code unit = 'B' (caseless)
+Subject length lower bound = 2
+
+/./utf
+    \x{110000}
+Failed: error -28: UTF-32 error: code points greater than 0x10ffff are not defined at offset 0
+
+# End of testinput12
diff --git a/dist/testdata/testoutput20 b/dist2/testdata/testoutput13
similarity index 60%
rename from dist/testdata/testoutput20
rename to dist2/testdata/testoutput13
index c1b20ee..f737ebe 100644
--- a/dist/testdata/testoutput20
+++ b/dist2/testdata/testoutput13
@@ -1,5 +1,8 @@
-/-- These DFA tests are for the handling of characters greater than 255 in
-    16- or 32-bit, non-UTF mode. --/
+# These DFA tests are for the handling of characters greater than 255 in
+# 16-bit or 32-bit, non-UTF mode. 
+
+#forbid_utf
+#subject dfa
 
 /^\x{ffff}+/i
     \x{ffff}
@@ -21,4 +24,4 @@
     \x{ffff}
  0: \x{ffff}
 
-/-- End of testinput20 --/
+# End of testinput13
diff --git a/dist2/testdata/testoutput14-16 b/dist2/testdata/testoutput14-16
new file mode 100644
index 0000000..05b7d48
--- /dev/null
+++ b/dist2/testdata/testoutput14-16
@@ -0,0 +1,61 @@
+# These test special (mostly error) UTF features of DFA matching. They are a 
+# selection of the more comprehensive tests that are run for non-DFA matching.
+# The output is different for the different widths.
+
+#subject dfa
+
+/X/utf
+    XX\x{d800}
+Failed: error -24: UTF-16 error: missing low surrogate at end at offset 2
+    XX\x{d800}\=offset=3
+No match
+    XX\x{d800}\=no_utf_check
+ 0: X
+    XX\x{da00}
+Failed: error -24: UTF-16 error: missing low surrogate at end at offset 2
+    XX\x{da00}\=no_utf_check
+ 0: X
+    XX\x{dc00}
+Failed: error -26: UTF-16 error: isolated low surrogate at offset 2
+    XX\x{dc00}\=no_utf_check
+ 0: X
+    XX\x{de00}
+Failed: error -26: UTF-16 error: isolated low surrogate at offset 2
+    XX\x{de00}\=no_utf_check
+ 0: X
+    XX\x{dfff}
+Failed: error -26: UTF-16 error: isolated low surrogate at offset 2
+    XX\x{dfff}\=no_utf_check
+ 0: X
+    XX\x{110000}
+** Failed: character \x{110000} is greater than 0x10ffff and so cannot be converted to UTF-16
+    XX\x{d800}\x{1234}
+Failed: error -25: UTF-16 error: invalid low surrogate at offset 3
+          
+/badutf/utf
+    X\xdf
+No match
+    XX\xef
+No match
+    XXX\xef\x80
+No match
+    X\xf7
+No match
+    XX\xf7\x80
+No match
+    XXX\xf7\x80\x80
+No match
+
+/shortutf/utf
+    XX\xdf\=ph
+No match
+    XX\xef\=ph
+No match
+    XX\xef\x80\=ph
+No match
+    \xf7\=ph
+No match
+    \xf7\x80\=ph
+No match
+
+# End of testinput14
diff --git a/dist2/testdata/testoutput14-32 b/dist2/testdata/testoutput14-32
new file mode 100644
index 0000000..30d7fa6
--- /dev/null
+++ b/dist2/testdata/testoutput14-32
@@ -0,0 +1,61 @@
+# These test special (mostly error) UTF features of DFA matching. They are a 
+# selection of the more comprehensive tests that are run for non-DFA matching.
+# The output is different for the different widths.
+
+#subject dfa
+
+/X/utf
+    XX\x{d800}
+Failed: error -27: UTF-32 error: code points 0xd800-0xdfff are not defined at offset 2
+    XX\x{d800}\=offset=3
+No match
+    XX\x{d800}\=no_utf_check
+ 0: X
+    XX\x{da00}
+Failed: error -27: UTF-32 error: code points 0xd800-0xdfff are not defined at offset 2
+    XX\x{da00}\=no_utf_check
+ 0: X
+    XX\x{dc00}
+Failed: error -27: UTF-32 error: code points 0xd800-0xdfff are not defined at offset 2
+    XX\x{dc00}\=no_utf_check
+ 0: X
+    XX\x{de00}
+Failed: error -27: UTF-32 error: code points 0xd800-0xdfff are not defined at offset 2
+    XX\x{de00}\=no_utf_check
+ 0: X
+    XX\x{dfff}
+Failed: error -27: UTF-32 error: code points 0xd800-0xdfff are not defined at offset 2
+    XX\x{dfff}\=no_utf_check
+ 0: X
+    XX\x{110000}
+Failed: error -28: UTF-32 error: code points greater than 0x10ffff are not defined at offset 2
+    XX\x{d800}\x{1234}
+Failed: error -27: UTF-32 error: code points 0xd800-0xdfff are not defined at offset 2
+          
+/badutf/utf
+    X\xdf
+No match
+    XX\xef
+No match
+    XXX\xef\x80
+No match
+    X\xf7
+No match
+    XX\xf7\x80
+No match
+    XXX\xf7\x80\x80
+No match
+
+/shortutf/utf
+    XX\xdf\=ph
+No match
+    XX\xef\=ph
+No match
+    XX\xef\x80\=ph
+No match
+    \xf7\=ph
+No match
+    \xf7\x80\=ph
+No match
+
+# End of testinput14
diff --git a/dist2/testdata/testoutput14-8 b/dist2/testdata/testoutput14-8
new file mode 100644
index 0000000..1fb0dc1
--- /dev/null
+++ b/dist2/testdata/testoutput14-8
@@ -0,0 +1,61 @@
+# These test special (mostly error) UTF features of DFA matching. They are a 
+# selection of the more comprehensive tests that are run for non-DFA matching.
+# The output is different for the different widths.
+
+#subject dfa
+
+/X/utf
+    XX\x{d800}
+Failed: error -16: UTF-8 error: code points 0xd800-0xdfff are not defined at offset 2
+    XX\x{d800}\=offset=3
+Error -36 (bad UTF-8 offset)
+    XX\x{d800}\=no_utf_check
+ 0: X
+    XX\x{da00}
+Failed: error -16: UTF-8 error: code points 0xd800-0xdfff are not defined at offset 2
+    XX\x{da00}\=no_utf_check
+ 0: X
+    XX\x{dc00}
+Failed: error -16: UTF-8 error: code points 0xd800-0xdfff are not defined at offset 2
+    XX\x{dc00}\=no_utf_check
+ 0: X
+    XX\x{de00}
+Failed: error -16: UTF-8 error: code points 0xd800-0xdfff are not defined at offset 2
+    XX\x{de00}\=no_utf_check
+ 0: X
+    XX\x{dfff}
+Failed: error -16: UTF-8 error: code points 0xd800-0xdfff are not defined at offset 2
+    XX\x{dfff}\=no_utf_check
+ 0: X
+    XX\x{110000}
+Failed: error -15: UTF-8 error: code points greater than 0x10ffff are not defined at offset 2
+    XX\x{d800}\x{1234}
+Failed: error -16: UTF-8 error: code points 0xd800-0xdfff are not defined at offset 2
+          
+/badutf/utf
+    X\xdf
+Failed: error -3: UTF-8 error: 1 byte missing at end at offset 1
+    XX\xef
+Failed: error -4: UTF-8 error: 2 bytes missing at end at offset 2
+    XXX\xef\x80
+Failed: error -3: UTF-8 error: 1 byte missing at end at offset 3
+    X\xf7
+Failed: error -5: UTF-8 error: 3 bytes missing at end at offset 1
+    XX\xf7\x80
+Failed: error -4: UTF-8 error: 2 bytes missing at end at offset 2
+    XXX\xf7\x80\x80
+Failed: error -3: UTF-8 error: 1 byte missing at end at offset 3
+
+/shortutf/utf
+    XX\xdf\=ph
+Failed: error -3: UTF-8 error: 1 byte missing at end at offset 2
+    XX\xef\=ph
+Failed: error -4: UTF-8 error: 2 bytes missing at end at offset 2
+    XX\xef\x80\=ph
+Failed: error -3: UTF-8 error: 1 byte missing at end at offset 2
+    \xf7\=ph
+Failed: error -5: UTF-8 error: 3 bytes missing at end at offset 0
+    \xf7\x80\=ph
+Failed: error -4: UTF-8 error: 2 bytes missing at end at offset 0
+
+# End of testinput14
diff --git a/dist2/testdata/testoutput15 b/dist2/testdata/testoutput15
new file mode 100644
index 0000000..bb29a49
--- /dev/null
+++ b/dist2/testdata/testoutput15
@@ -0,0 +1,383 @@
+# These are:
+#
+# (1) Tests of the match-limiting features. The results are different for
+# interpretive or JIT matching, so this test should not be run with JIT. The
+# same tests are run using JIT in test 17.
+
+# (2) Other tests that must not be run with JIT.
+
+/(a+)*zz/I
+Capturing subpattern count = 1
+Starting code units: a z 
+Last code unit = 'z'
+Subject length lower bound = 2
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazzbbbbbb\=find_limits
+Minimum match limit = 8
+Minimum recursion limit = 6
+ 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazz
+ 1: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+  aaaaaaaaaaaaaz\=find_limits
+Minimum match limit = 32768
+Minimum recursion limit = 29
+No match
+
+!((?:\s|//.*\\n|/[*](?:\\n|.)*?[*]/)*)!I
+Capturing subpattern count = 1
+May match empty string
+Subject length lower bound = 0
+   /* this is a C style comment */\=find_limits
+Minimum match limit = 120
+Minimum recursion limit = 6
+ 0: /* this is a C style comment */
+ 1: /* this is a C style comment */
+
+/^(?>a)++/
+    aa\=find_limits
+Minimum match limit = 5
+Minimum recursion limit = 2
+ 0: aa
+    aaaaaaaaa\=find_limits
+Minimum match limit = 12
+Minimum recursion limit = 2
+ 0: aaaaaaaaa
+    
+/(a)(?1)++/
+    aa\=find_limits
+Minimum match limit = 7
+Minimum recursion limit = 4
+ 0: aa
+ 1: a
+    aaaaaaaaa\=find_limits
+Minimum match limit = 21
+Minimum recursion limit = 4
+ 0: aaaaaaaaa
+ 1: a
+
+/a(?:.)*?a/ims
+    abbbbbbbbbbbbbbbbbbbbba\=find_limits
+Minimum match limit = 65
+Minimum recursion limit = 2
+ 0: abbbbbbbbbbbbbbbbbbbbba
+    
+/a(?:.(*THEN))*?a/ims
+    abbbbbbbbbbbbbbbbbbbbba\=find_limits
+Minimum match limit = 86
+Minimum recursion limit = 45
+ 0: abbbbbbbbbbbbbbbbbbbbba
+
+/a(?:.(*THEN:ABC))*?a/ims
+    abbbbbbbbbbbbbbbbbbbbba\=find_limits
+Minimum match limit = 86
+Minimum recursion limit = 45
+ 0: abbbbbbbbbbbbbbbbbbbbba
+
+/^(?>a+)(?>b+)(?>c+)(?>d+)(?>e+)/
+     aabbccddee\=find_limits
+Minimum match limit = 7
+Minimum recursion limit = 2
+ 0: aabbccddee
+
+/^(?>(a+))(?>(b+))(?>(c+))(?>(d+))(?>(e+))/
+     aabbccddee\=find_limits
+Minimum match limit = 17
+Minimum recursion limit = 16
+ 0: aabbccddee
+ 1: aa
+ 2: bb
+ 3: cc
+ 4: dd
+ 5: ee
+
+/^(?>(a+))(?>b+)(?>(c+))(?>d+)(?>(e+))/
+     aabbccddee\=find_limits
+Minimum match limit = 13
+Minimum recursion limit = 10
+ 0: aabbccddee
+ 1: aa
+ 2: cc
+ 3: ee
+
+/(*LIMIT_MATCH=12bc)abc/
+Failed: error 160 at offset 17: (*VERB) not recognized or malformed
+
+/(*LIMIT_MATCH=4294967290)abc/
+Failed: error 160 at offset 24: (*VERB) not recognized or malformed
+
+/(*LIMIT_RECURSION=4294967280)abc/I
+Capturing subpattern count = 0
+Recursion limit = 4294967280
+First code unit = 'a'
+Last code unit = 'c'
+Subject length lower bound = 3
+
+/(a+)*zz/
+    aaaaaaaaaaaaaz
+No match
+    aaaaaaaaaaaaaz\=match_limit=3000
+Failed: error -47: match limit exceeded
+
+/(a+)*zz/
+    aaaaaaaaaaaaaz\=recursion_limit=10
+Failed: error -53: recursion limit exceeded
+
+/(*LIMIT_MATCH=3000)(a+)*zz/I
+Capturing subpattern count = 1
+Match limit = 3000
+Starting code units: a z 
+Last code unit = 'z'
+Subject length lower bound = 2
+    aaaaaaaaaaaaaz
+Failed: error -47: match limit exceeded
+    aaaaaaaaaaaaaz\=match_limit=60000
+Failed: error -47: match limit exceeded
+
+/(*LIMIT_MATCH=60000)(*LIMIT_MATCH=3000)(a+)*zz/I
+Capturing subpattern count = 1
+Match limit = 3000
+Starting code units: a z 
+Last code unit = 'z'
+Subject length lower bound = 2
+    aaaaaaaaaaaaaz
+Failed: error -47: match limit exceeded
+
+/(*LIMIT_MATCH=60000)(a+)*zz/I
+Capturing subpattern count = 1
+Match limit = 60000
+Starting code units: a z 
+Last code unit = 'z'
+Subject length lower bound = 2
+    aaaaaaaaaaaaaz
+No match
+    aaaaaaaaaaaaaz\=match_limit=3000
+Failed: error -47: match limit exceeded
+
+/(*LIMIT_RECURSION=10)(a+)*zz/I
+Capturing subpattern count = 1
+Recursion limit = 10
+Starting code units: a z 
+Last code unit = 'z'
+Subject length lower bound = 2
+    aaaaaaaaaaaaaz
+Failed: error -53: recursion limit exceeded
+    aaaaaaaaaaaaaz\=recursion_limit=1000
+Failed: error -53: recursion limit exceeded
+
+/(*LIMIT_RECURSION=10)(*LIMIT_RECURSION=1000)(a+)*zz/I
+Capturing subpattern count = 1
+Recursion limit = 1000
+Starting code units: a z 
+Last code unit = 'z'
+Subject length lower bound = 2
+    aaaaaaaaaaaaaz
+No match
+
+/(*LIMIT_RECURSION=1000)(a+)*zz/I
+Capturing subpattern count = 1
+Recursion limit = 1000
+Starting code units: a z 
+Last code unit = 'z'
+Subject length lower bound = 2
+    aaaaaaaaaaaaaz
+No match
+    aaaaaaaaaaaaaz\=recursion_limit=10
+Failed: error -53: recursion limit exceeded
+    
+# These three have infinitely nested recursions. 
+    
+/((?2))((?1))/
+    abc
+Failed: error -52: nested recursion at the same subject position
+
+/((?(R2)a+|(?1)b))/
+    aaaabcde
+Failed: error -52: nested recursion at the same subject position
+
+/(?(R)a*(?1)|((?R))b)/
+    aaaabcde
+Failed: error -52: nested recursion at the same subject position
+    
+# The allusedtext modifier does not work with JIT, which does not maintain
+# the leftchar/rightchar data.
+
+/abc(?=xyz)/allusedtext
+    abcxyzpqr
+ 0: abcxyz
+       >>>
+    abcxyzpqr\=aftertext
+ 0: abcxyz
+       >>>
+ 0+ xyzpqr
+    
+/(?<=pqr)abc(?=xyz)/allusedtext
+    xyzpqrabcxyzpqr
+ 0: pqrabcxyz
+    <<<   >>>
+    xyzpqrabcxyzpqr\=aftertext
+ 0: pqrabcxyz
+    <<<   >>>
+ 0+ xyzpqr
+    
+/a\b/
+    a.\=allusedtext
+ 0: a.
+     >
+    a\=allusedtext  
+ 0: a
+
+/abc\Kxyz/
+    abcxyz\=allusedtext
+ 0: abcxyz
+    <<<   
+
+/abc(?=xyz(*ACCEPT))/
+    abcxyz\=allusedtext
+ 0: abcxyz
+       >>>
+
+/abc(?=abcde)(?=ab)/allusedtext
+    abcabcdefg
+ 0: abcabcde
+       >>>>>
+    
+# These tests provoke recursion loops, which give a different error message
+# when JIT is used.
+
+/(?R)/I
+Capturing subpattern count = 0
+May match empty string
+Subject length lower bound = 0
+    abcd
+Failed: error -52: nested recursion at the same subject position
+
+/(a|(?R))/I
+Capturing subpattern count = 1
+May match empty string
+Subject length lower bound = 0
+    abcd
+ 0: a
+ 1: a
+    defg 
+Failed: error -52: nested recursion at the same subject position
+
+/(ab|(bc|(de|(?R))))/I
+Capturing subpattern count = 3
+May match empty string
+Subject length lower bound = 0
+    abcd
+ 0: ab
+ 1: ab
+    fghi 
+Failed: error -52: nested recursion at the same subject position
+
+/(ab|(bc|(de|(?1))))/I
+Capturing subpattern count = 3
+May match empty string
+Subject length lower bound = 0
+    abcd
+ 0: ab
+ 1: ab
+    fghi 
+Failed: error -52: nested recursion at the same subject position
+
+/x(ab|(bc|(de|(?1)x)x)x)/I
+Capturing subpattern count = 3
+First code unit = 'x'
+Subject length lower bound = 3
+    xab123
+ 0: xab
+ 1: ab
+    xfghi 
+Failed: error -52: nested recursion at the same subject position
+
+/(?!\w)(?R)/
+    abcd
+Failed: error -52: nested recursion at the same subject position
+    =abc 
+Failed: error -52: nested recursion at the same subject position
+
+/(?=\w)(?R)/
+    =abc 
+Failed: error -52: nested recursion at the same subject position
+    abcd
+Failed: error -52: nested recursion at the same subject position
+
+/(?<!\w)(?R)/
+    abcd
+Failed: error -52: nested recursion at the same subject position
+
+/(?<=\w)(?R)/
+    abcd
+Failed: error -52: nested recursion at the same subject position
+
+/(a+|(?R)b)/
+    aaa
+ 0: aaa
+ 1: aaa
+    bbb 
+Failed: error -52: nested recursion at the same subject position
+
+/[^\xff]((?1))/BI
+------------------------------------------------------------------
+        Bra
+        [^\x{ff}]
+        CBra 1
+        Recurse
+        Ket
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 1
+Subject length lower bound = 1
+    abcd
+Failed: error -52: nested recursion at the same subject position
+    
+# These tests don't behave the same with JIT 
+
+/\w+(?C1)/BI,no_auto_possess
+------------------------------------------------------------------
+        Bra
+        \w+
+        Callout 1 8 0
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: no_auto_possess
+Starting code units: 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 
+Subject length lower bound = 1
+    abc\=callout_fail=1
+--->abc
+  1 ^  ^    
+  1 ^ ^     
+  1 ^^      
+  1  ^ ^    
+  1  ^^     
+  1   ^^    
+No match
+
+/(*NO_AUTO_POSSESS)\w+(?C1)/BI
+------------------------------------------------------------------
+        Bra
+        \w+
+        Callout 1 26 0
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Compile options: <none>
+Overall options: no_auto_possess
+Starting code units: 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 
+Subject length lower bound = 1
+    abc\=callout_fail=1
+--->abc
+  1 ^  ^    
+  1 ^ ^     
+  1 ^^      
+  1  ^ ^    
+  1  ^^     
+  1   ^^    
+No match
+
+# End of testinput15
diff --git a/dist2/testdata/testoutput16 b/dist2/testdata/testoutput16
new file mode 100644
index 0000000..616567b
--- /dev/null
+++ b/dist2/testdata/testoutput16
@@ -0,0 +1,17 @@
+# This test is run only when JIT support is not available. It checks that an
+# attempt to use it has the expected behaviour. It also tests things that
+# are different without JIT.
+
+/abc/I,jit,jitverify
+Capturing subpattern count = 0
+First code unit = 'a'
+Last code unit = 'c'
+Subject length lower bound = 3
+JIT support is not available in this version of PCRE2
+
+/a*/I
+Capturing subpattern count = 0
+May match empty string
+Subject length lower bound = 0
+
+# End of testinput16
diff --git a/dist/testdata/testoutput12 b/dist2/testdata/testoutput17
similarity index 68%
rename from dist/testdata/testoutput12
rename to dist2/testdata/testoutput17
index 8791108..0def438 100644
--- a/dist/testdata/testoutput12
+++ b/dist2/testdata/testoutput17
@@ -1,204 +1,511 @@
-/-- This test is run only when JIT support is available. It checks for a
-successful and an unsuccessful JIT compile and save and restore behaviour,
-and a couple of things that are different with JIT. --/
+# This test is run only when JIT support is available. It checks JIT complete
+# and partial modes, and things that are different with JIT.
 
-/abc/S+I
-Capturing subpattern count = 0
-No options
-First char = 'a'
-Need char = 'c'
-Subject length lower bound = 3
-No starting char list
-JIT study was successful
+#pattern jitverify
 
-/(?(?C1)(?=a)a)/S+I
+# JIT does not support this pattern (callout at start of condition).
+
+/(?(?C1)(?=a)a)/I
 Capturing subpattern count = 0
 May match empty string
-No options
-No first char
-No need char
-Study returned NULL
-JIT study was not successful
+Subject length lower bound = 0
+JIT compilation was not successful (no more memory)
 
-/(?(?C1)(?=a)a)/S!+I
+# The following pattern cannot be compiled by JIT.
+
+/b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*/I
 Capturing subpattern count = 0
 May match empty string
-No options
-No first char
-No need char
-Subject length lower bound = -1
-No starting char list
-JIT study was not successful
+Subject length lower bound = 0
+JIT compilation was not successful (no more memory)
 
-/b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*/S+I
-Capturing subpattern count = 0
-May match empty string
-No options
-No first char
-No need char
-Study returned NULL
-JIT study was not successful
+# Check that an infinite recursion loop is caught.
 
-/abc/S+I>testsavedregex
-Capturing subpattern count = 0
-No options
-First char = 'a'
-Need char = 'c'
-Subject length lower bound = 3
-No starting char list
-JIT study was successful
-Compiled pattern written to testsavedregex
-Study data written to testsavedregex
-
-<testsavedregex
-Compiled pattern loaded from testsavedregex
-Study data loaded from testsavedregex
-    abc
- 0: abc
-
-/a*/SI
-Capturing subpattern count = 0
-May match empty string
-No options
-No first char
-No need char
-Study returned NULL
-
-/(?(R)a*(?1)|((?R))b)/S+
+/(?(R)a*(?1)|((?R))b)/
     aaaabcde
-Error -27 (JIT stack limit reached)
-    
-/-- Test various compile modes --/ 
-    
-/abcd/S++
-    abcd
- 0: abcd (JIT)
-    xyz  
-No match (JIT)
+Failed: error -46: JIT stack limit reached
 
-/abcd/S+
-    abcd
- 0: abcd (JIT)
-    ab\P
-Partial match: ab (JIT)
-    ab\P\P
-Partial match: ab (JIT)
-    xyz
-No match (JIT)
-
-/abcd/S++
-    abcd
- 0: abcd (JIT)
-    ab\P
-Partial match: ab (JIT)
-    ab\P\P
-Partial match: ab (JIT)
-    xyz
-No match (JIT)
-
-/abcd/S++1
-    abcd
- 0: abcd (JIT)
-    ab\P
-Partial match: ab
-    ab\P\P
-Partial match: ab
-    xyz
-No match (JIT)
-    xyz\P
-No match
-
-/abcd/S++2
-    abcd
- 0: abcd
-    ab\P
-Partial match: ab (JIT)
-    ab\P\P
-Partial match: ab
-    xyz
-No match
-
-/abcd/S++3
-    abcd
- 0: abcd (JIT)
-    ab\P
-Partial match: ab (JIT)
-    ab\P\P
-Partial match: ab
-    xyz
-No match (JIT)
-
-/abcd/S++4
-    abcd
- 0: abcd
-    ab\P
-Partial match: ab
-    ab\P\P
-Partial match: ab (JIT)
-    xyz
-No match
-
-/abcd/S++5
-    abcd
- 0: abcd (JIT)
-    ab\P
-Partial match: ab
-    ab\P\P
-Partial match: ab (JIT)
-    xyz
-No match (JIT)
-
-/abcd/S++6
-    abcd
- 0: abcd
-    ab\P
-Partial match: ab (JIT)
-    ab\P\P
-Partial match: ab (JIT)
-    xyz
-No match
-
-/abcd/S++7
-    abcd
- 0: abcd (JIT)
-    ab\P
-Partial match: ab (JIT)
-    ab\P\P
-Partial match: ab (JIT)
-    xyz
-No match (JIT)
-    
-/abcd/S++2I 
+/abcd/I
 Capturing subpattern count = 0
-No options
-First char = 'a'
-Need char = 'd'
+First code unit = 'a'
+Last code unit = 'd'
 Subject length lower bound = 4
-No starting char list
-JIT study was successful
+JIT compilation was successful
+    abcd
+ 0: abcd (JIT)
+\= Expect no match
+    xyz
+No match (JIT)
 
-/(*NO_START_OPT)a(*:m)b/KS++
+/(*NO_JIT)abcd/I
+Capturing subpattern count = 0
+First code unit = 'a'
+Last code unit = 'd'
+Subject length lower bound = 4
+JIT compilation was not successful
+    abcd
+ 0: abcd
+\= Expect no match
+    xyz
+No match
+
+/abcd/
+    abcd
+ 0: abcd (JIT)
+    ab\=ps
+Partial match: ab (JIT)
+    ab\=ph
+Partial match: ab (JIT)
+\= Expect no match
+    xyz
+No match (JIT)
+
+/abcd/jitfast
+    abcd
+ 0: abcd (JIT)
+    ab\=ps
+Partial match: ab (JIT)
+    ab\=ph
+Partial match: ab (JIT)
+\= Expect no match
+    xyz
+No match (JIT)
+
+/abcd/jit=1
+    abcd
+ 0: abcd (JIT)
+    ab\=ps
+Partial match: ab
+    ab\=ph
+Partial match: ab
+\= Expect no match
+    xyz
+No match (JIT)
+    xyz\=ps
+No match
+
+/abcd/jit=1,jitfast
+    abcd
+ 0: abcd (JIT)
+    ab\=ps
+Failed: error -45: bad JIT option
+    ab\=ph
+Failed: error -45: bad JIT option
+    xyz\=ps
+Failed: error -45: bad JIT option
+\= Expect no match
+    xyz
+No match (JIT)
+
+/abcd/jit=2
+    abcd
+ 0: abcd
+    ab\=ps
+Partial match: ab (JIT)
+    ab\=ph
+Partial match: ab
+\= Expect no match
+    xyz
+No match
+
+/abcd/jit=2,jitfast
+    abcd
+Failed: error -45: bad JIT option
+    ab\=ps
+Partial match: ab (JIT)
+    ab\=ph
+Failed: error -45: bad JIT option
+    xyz
+Failed: error -45: bad JIT option
+
+/abcd/jit=3
+    abcd
+ 0: abcd (JIT)
+    ab\=ps
+Partial match: ab (JIT)
+    ab\=ph
+Partial match: ab
+\= Expect no match
+    xyz
+No match (JIT)
+
+/abcd/jit=4
+    abcd
+ 0: abcd
+    ab\=ps
+Partial match: ab
+    ab\=ph
+Partial match: ab (JIT)
+\= Expect no match
+    xyz
+No match
+
+/abcd/jit=5
+    abcd
+ 0: abcd (JIT)
+    ab\=ps
+Partial match: ab
+    ab\=ph
+Partial match: ab (JIT)
+\= Expect no match
+    xyz
+No match (JIT)
+
+/abcd/jit=6
+    abcd
+ 0: abcd
+    ab\=ps
+Partial match: ab (JIT)
+    ab\=ph
+Partial match: ab (JIT)
+\= Expect no match
+    xyz
+No match
+
+/abcd/jit=7
+    abcd
+ 0: abcd (JIT)
+    ab\=ps
+Partial match: ab (JIT)
+    ab\=ph
+Partial match: ab (JIT)
+\= Expect no match
+    xyz
+No match (JIT)
+
+/abcd/I,jit=2
+Capturing subpattern count = 0
+First code unit = 'a'
+Last code unit = 'd'
+Subject length lower bound = 4
+JIT compilation was successful
+
+/(*NO_START_OPT)a(*:m)b/mark
+\= Expect no match
     a
 No match, mark = m (JIT)
 
-/^12345678abcd/mS++
+/^12345678abcd/m
     12345678abcd
  0: 12345678abcd (JIT)
+    
+# Limits tests that give different output with JIT. 
 
-/-- Test pattern compilation --/ 
+/(a+)*zz/I
+Capturing subpattern count = 1
+Starting code units: a z 
+Last code unit = 'z'
+Subject length lower bound = 2
+JIT compilation was successful
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazzbbbbbb\=find_limits
+Minimum match limit = 2
+ 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazz (JIT)
+ 1: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+\= Expect no match
+  aaaaaaaaaaaaaz\=find_limits
+Minimum match limit = 16383
+No match (JIT)
 
-/(?:a|b|c|d|e)(?R)/S++
+!((?:\s|//.*\\n|/[*](?:\\n|.)*?[*]/)*)!I
+Capturing subpattern count = 1
+May match empty string
+Subject length lower bound = 0
+JIT compilation was successful
+   /* this is a C style comment */\=find_limits
+Minimum match limit = 29
+ 0: /* this is a C style comment */ (JIT)
+ 1: /* this is a C style comment */
 
-/(?:a|b|c|d|e)(?R)(?R)/S++
+/^(?>a)++/
+    aa\=find_limits
+Minimum match limit = 1
+ 0: aa (JIT)
+    aaaaaaaaa\=find_limits
+Minimum match limit = 1
+ 0: aaaaaaaaa (JIT)
+    
+/(a)(?1)++/
+    aa\=find_limits
+Minimum match limit = 1
+ 0: aa (JIT)
+ 1: a
+    aaaaaaaaa\=find_limits
+Minimum match limit = 1
+ 0: aaaaaaaaa (JIT)
+ 1: a
 
-/(a(?:a|b|c|d|e)b){8,16}/S++
+/a(?:.)*?a/ims
+    abbbbbbbbbbbbbbbbbbbbba\=find_limits
+Minimum match limit = 22
+ 0: abbbbbbbbbbbbbbbbbbbbba (JIT)
+    
+/a(?:.(*THEN))*?a/ims
+    abbbbbbbbbbbbbbbbbbbbba\=find_limits
+Minimum match limit = 22
+ 0: abbbbbbbbbbbbbbbbbbbbba (JIT)
 
-/(?:|a|){100}x/S++
+/a(?:.(*THEN:ABC))*?a/ims
+    abbbbbbbbbbbbbbbbbbbbba\=find_limits
+Minimum match limit = 22
+ 0: abbbbbbbbbbbbbbbbbbbbba (JIT)
 
-/(x(?1)){4}/S++
+/^(?>a+)(?>b+)(?>c+)(?>d+)(?>e+)/
+     aabbccddee\=find_limits
+Minimum match limit = 5
+ 0: aabbccddee (JIT)
+
+/^(?>(a+))(?>(b+))(?>(c+))(?>(d+))(?>(e+))/
+     aabbccddee\=find_limits
+Minimum match limit = 5
+ 0: aabbccddee (JIT)
+ 1: aa
+ 2: bb
+ 3: cc
+ 4: dd
+ 5: ee
+
+/^(?>(a+))(?>b+)(?>(c+))(?>d+)(?>(e+))/
+     aabbccddee\=find_limits
+Minimum match limit = 5
+ 0: aabbccddee (JIT)
+ 1: aa
+ 2: cc
+ 3: ee
+
+/^(?>(a+))(?>b+)(?>(c+))(?>d+)(?>(e+))/jitfast
+     aabbccddee\=find_limits
+Minimum match limit = 5
+ 0: aabbccddee (JIT)
+ 1: aa
+ 2: cc
+ 3: ee
+     aabbccddee\=jitstack=1
+ 0: aabbccddee (JIT)
+ 1: aa
+ 2: cc
+ 3: ee
+
+/(a+)*zz/
+\= Expect no match
+    aaaaaaaaaaaaaz
+No match (JIT)
+\= Expect limit exceeded
+    aaaaaaaaaaaaaz\=match_limit=3000
+Failed: error -47: match limit exceeded
+
+/(*LIMIT_MATCH=3000)(a+)*zz/I
+Capturing subpattern count = 1
+Match limit = 3000
+Starting code units: a z 
+Last code unit = 'z'
+Subject length lower bound = 2
+JIT compilation was successful
+    aaaaaaaaaaaaaz
+Failed: error -47: match limit exceeded
+    aaaaaaaaaaaaaz\=match_limit=60000
+Failed: error -47: match limit exceeded
+
+/(*LIMIT_MATCH=60000)(*LIMIT_MATCH=3000)(a+)*zz/I
+Capturing subpattern count = 1
+Match limit = 3000
+Starting code units: a z 
+Last code unit = 'z'
+Subject length lower bound = 2
+JIT compilation was successful
+    aaaaaaaaaaaaaz
+Failed: error -47: match limit exceeded
+
+/(*LIMIT_MATCH=60000)(a+)*zz/I
+Capturing subpattern count = 1
+Match limit = 60000
+Starting code units: a z 
+Last code unit = 'z'
+Subject length lower bound = 2
+JIT compilation was successful
+\= Expect no match
+    aaaaaaaaaaaaaz
+No match (JIT)
+\= Expect limit exceeded
+    aaaaaaaaaaaaaz\=match_limit=3000
+Failed: error -47: match limit exceeded
+
+# These three have infinitely nested recursions. 
+    
+/((?2))((?1))/
+    abc
+Failed: error -46: JIT stack limit reached
+
+/((?(R2)a+|(?1)b))/
+    aaaabcde
+Failed: error -46: JIT stack limit reached
+
+/(?(R)a*(?1)|((?R))b)/
+    aaaabcde
+Failed: error -46: JIT stack limit reached
+    
+# Invalid options disable JIT when called via pcre2_match(), causing the
+# match to happen via the interpreter, but for fast JIT invalid options are
+# ignored, so an unanchored match happens.
+
+/abcd/
+    abcd\=anchored
+ 0: abcd
+\= Expect no match
+    fail abcd\=anchored 
+No match
+    
+/abcd/jitfast
+    abcd\=anchored 
+ 0: abcd (JIT)
+    succeed abcd\=anchored 
+ 0: abcd (JIT)
+    
+# Push/pop does not lose the JIT information, though jitverify applies only to
+# compilation, but serializing (save/load) discards JIT data completely.
+
+/^abc\Kdef/info,push
+** Applies only to compile when pattern is stacked with 'push': jitverify
+Capturing subpattern count = 0
+Compile options: <none>
+Overall options: anchored
+Subject length lower bound = 6
+JIT compilation was successful
+#pop jitverify
+    abcdef
+ 0: def (JIT)
+
+/^abc\Kdef/info,push
+** Applies only to compile when pattern is stacked with 'push': jitverify
+Capturing subpattern count = 0
+Compile options: <none>
+Overall options: anchored
+Subject length lower bound = 6
+JIT compilation was successful
+#save testsaved1
+#load testsaved1
+#pop jitverify
+    abcdef
+ 0: def
+    
+#load testsaved1
+#pop jit,jitverify
+    abcdef
+ 0: def (JIT)
+    
+# Test pattern compilation
+
+/(?:a|b|c|d|e)(?R)/jit=1
+
+/(?:a|b|c|d|e)(?R)(?R)/jit=1
+
+/(a(?:a|b|c|d|e)b){8,16}/jit=1
+
+/(?:|a|){100}x/jit=1
+
+# These tests provoke recursion loops, which give a different error message
+# when JIT is used.
+
+/(?R)/I
+Capturing subpattern count = 0
+May match empty string
+Subject length lower bound = 0
+JIT compilation was successful
+    abcd
+Failed: error -46: JIT stack limit reached
+
+/(a|(?R))/I
+Capturing subpattern count = 1
+May match empty string
+Subject length lower bound = 0
+JIT compilation was successful
+    abcd
+ 0: a (JIT)
+ 1: a
+    defg 
+Failed: error -46: JIT stack limit reached
+
+/(ab|(bc|(de|(?R))))/I
+Capturing subpattern count = 3
+May match empty string
+Subject length lower bound = 0
+JIT compilation was successful
+    abcd
+ 0: ab (JIT)
+ 1: ab
+    fghi 
+Failed: error -46: JIT stack limit reached
+
+/(ab|(bc|(de|(?1))))/I
+Capturing subpattern count = 3
+May match empty string
+Subject length lower bound = 0
+JIT compilation was successful
+    abcd
+ 0: ab (JIT)
+ 1: ab
+    fghi 
+Failed: error -46: JIT stack limit reached
+
+/x(ab|(bc|(de|(?1)x)x)x)/I
+Capturing subpattern count = 3
+First code unit = 'x'
+Subject length lower bound = 3
+JIT compilation was successful
+    xab123
+ 0: xab (JIT)
+ 1: ab
+    xfghi 
+Failed: error -46: JIT stack limit reached
+
+/(?!\w)(?R)/
+    abcd
+Failed: error -46: JIT stack limit reached
+    =abc 
+Failed: error -46: JIT stack limit reached
+
+/(?=\w)(?R)/
+    =abc 
+Failed: error -46: JIT stack limit reached
+    abcd
+Failed: error -46: JIT stack limit reached
+
+/(?<!\w)(?R)/
+    abcd
+Failed: error -46: JIT stack limit reached
+
+/(?<=\w)(?R)/
+    abcd
+Failed: error -46: JIT stack limit reached
+
+/(a+|(?R)b)/
+    aaa
+ 0: aaa (JIT)
+ 1: aaa
+    bbb 
+Failed: error -46: JIT stack limit reached
+
+/[^\xff]((?1))/BI
+------------------------------------------------------------------
+        Bra
+        [^\x{ff}]
+        CBra 1
+        Recurse
+        Ket
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 1
+Subject length lower bound = 1
+JIT compilation was successful
+    abcd
+Failed: error -46: JIT stack limit reached
+
+/(x(?1)){4}/
+
+/[axm]{7}/
 
 /(.|.)*?bx/
     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabax
-Error -8 (match limit exceeded)
+Failed: error -47: match limit exceeded
 
-/-- End of testinput12 --/
+# End of testinput17
diff --git a/dist2/testdata/testoutput18 b/dist2/testdata/testoutput18
new file mode 100644
index 0000000..0a5ffff
--- /dev/null
+++ b/dist2/testdata/testoutput18
@@ -0,0 +1,153 @@
+# This set of tests is run only with the 8-bit library. It tests the POSIX
+# interface, which is supported only with the 8-bit library. This test should
+# not be run with JIT (which is not available for the POSIX interface).
+    
+#forbid_utf
+#pattern posix
+
+# Test invalid options
+
+/abc/auto_callout
+** Ignored with POSIX interface: auto_callout
+
+/abc/
+   abc\=find_limits
+** Ignored with POSIX interface: find_limits
+ 0: abc
+
+/abc/
+  abc\=partial_hard
+** Ignored with POSIX interface: partial_hard
+ 0: abc
+
+# Real tests
+
+/abc/
+    abc
+ 0: abc
+
+/^abc|def/
+    abcdef
+ 0: abc
+    abcdef\=notbol
+ 0: def
+
+/.*((abc)$|(def))/
+    defabc
+ 0: defabc
+ 1: abc
+ 2: abc
+    defabc\=noteol
+ 0: def
+ 1: def
+ 3: def
+
+/the quick brown fox/
+    the quick brown fox
+ 0: the quick brown fox
+\= Expect no match
+    The Quick Brown Fox
+No match: POSIX code 17: match failed
+
+/the quick brown fox/i
+    the quick brown fox
+ 0: the quick brown fox
+    The Quick Brown Fox
+ 0: The Quick Brown Fox
+
+/(*LF)abc.def/
+\= Expect no match
+    abc\ndef
+No match: POSIX code 17: match failed
+
+/(*LF)abc$/
+    abc
+ 0: abc
+    abc\n
+ 0: abc
+
+/(abc)\2/
+Failed: POSIX code 15: bad back reference at offset 6     
+
+/(abc\1)/
+\= Expect no match
+    abc
+No match: POSIX code 17: match failed
+
+/a*(b+)(z)(z)/
+    aaaabbbbzzzz
+ 0: aaaabbbbzz
+ 1: bbbb
+ 2: z
+ 3: z
+    aaaabbbbzzzz\=ovector=0
+Matched without capture
+    aaaabbbbzzzz\=ovector=1
+ 0: aaaabbbbzz
+    aaaabbbbzzzz\=ovector=2
+ 0: aaaabbbbzz
+ 1: bbbb
+
+/(*ANY)ab.cd/
+    ab-cd
+ 0: ab-cd
+    ab=cd
+ 0: ab=cd
+\= Expect no match
+    ab\ncd
+No match: POSIX code 17: match failed
+
+/ab.cd/s
+    ab-cd
+ 0: ab-cd
+    ab=cd
+ 0: ab=cd
+    ab\ncd
+ 0: ab\x0acd
+
+/a(b)c/no_auto_capture
+    abc
+Matched with REG_NOSUB
+
+/a(?P<name>b)c/no_auto_capture
+    abc
+Matched with REG_NOSUB
+
+/a?|b?/
+    abc
+ 0: a
+\= Expect no match
+    ddd\=notempty
+No match: POSIX code 17: match failed
+
+/\w+A/
+   CDAAAAB
+ 0: CDAAAA
+
+/\w+A/ungreedy
+   CDAAAAB
+ 0: CDA
+   
+/\Biss\B/I,aftertext
+** Ignored with POSIX interface: info
+    Mississippi
+ 0: iss
+ 0+ issippi
+
+/abc/\
+Failed: POSIX code 9: bad escape sequence at offset 3     
+
+"(?(?C)"
+Failed: POSIX code 3: pattern error at offset 2     
+
+/abcd/substitute_extended
+** Ignored with POSIX interface: substitute_extended
+
+/\[A]{1000000}**/expand,regerror_buffsize=31
+Failed: POSIX code 4: ? * + invalid at offset 100000
+** regerror() message truncated
+
+/\[A]{1000000}**/expand,regerror_buffsize=32
+Failed: POSIX code 4: ? * + invalid at offset 1000001
+
+# End of testdata/testinput18
diff --git a/dist2/testdata/testoutput19 b/dist2/testdata/testoutput19
new file mode 100644
index 0000000..c4169ca
--- /dev/null
+++ b/dist2/testdata/testoutput19
@@ -0,0 +1,21 @@
+# This set of tests is run only with the 8-bit library. It tests the POSIX
+# interface with UTF/UCP support, which is supported only with the 8-bit
+# library. This test should not be run with JIT (which is not available for the
+# POSIX interface).
+    
+#pattern posix
+
+/a\x{1234}b/utf
+    a\x{1234}b
+ 0: a\x{1234}b
+
+/\w/
+\= Expect no match
+    +++\x{c2}
+No match: POSIX code 17: match failed
+
+/\w/ucp
+    +++\x{c2}
+ 0: \xc2
+    
+# End of testdata/testinput19
diff --git a/dist/testdata/testoutput2 b/dist2/testdata/testoutput2
similarity index 61%
rename from dist/testdata/testoutput2
rename to dist2/testdata/testoutput2
index 85c565d..7178410 100644
--- a/dist/testdata/testoutput2
+++ b/dist2/testdata/testoutput2
@@ -1,216 +1,209 @@
-/-- This set of tests is not Perl-compatible. It checks on special features
-    of PCRE's API, error diagnostics, and the compiled code of some patterns.
-    It also checks the non-Perl syntax the PCRE supports (Python, .NET, 
-    Oniguruma). Finally, there are some tests where PCRE and Perl differ, 
-    either because PCRE can't be compatible, or there is a possible Perl 
-    bug.
-    
-    NOTE: This is a non-UTF set of tests. When UTF support is needed, use
-    test 5, and if Unicode Property Support is needed, use test 7. --/
-    
-< forbid 8W 
-  
+# This set of tests is not Perl-compatible. It checks on special features
+# of PCRE2's API, error diagnostics, and the compiled code of some patterns.
+# It also checks the non-Perl syntax that PCRE2 supports (Python, .NET, 
+# Oniguruma). There are also some tests where PCRE2 and Perl differ, 
+# either because PCRE2 can't be compatible, or there is a possible Perl 
+# bug.
+
+# NOTE: This is a non-UTF set of tests. When UTF support is needed, use
+# test 5. 
+
+#forbid_utf
+#newline_default lf any anycrlf
+
+# Test binary zeroes in the pattern
+
+# /a\0B/ where 0 is a binary zero
+/61 5c 00 62/B,hex
+------------------------------------------------------------------
+        Bra
+        a\x00b
+        Ket
+        End
+------------------------------------------------------------------
+    a\x{0}b
+ 0: a\x00b
+
+# /a0b/ where 0 is a binary zero
+/61 00 62/B,hex
+------------------------------------------------------------------
+        Bra
+        a\x00b
+        Ket
+        End
+------------------------------------------------------------------
+    a\x{0}b
+ 0: a\x00b
+
+# /(?#B0C)DE/ where 0 is a binary zero
+/28 3f 23 42 00 43 29 44 45/B,hex
+------------------------------------------------------------------
+        Bra
+        DE
+        Ket
+        End
+------------------------------------------------------------------
+    DE
+ 0: DE
+
 /(a)b|/I
 Capturing subpattern count = 1
 May match empty string
-No options
-No first char
-No need char
+Subject length lower bound = 0
 
 /abc/I
 Capturing subpattern count = 0
-No options
-First char = 'a'
-Need char = 'c'
+First code unit = 'a'
+Last code unit = 'c'
+Subject length lower bound = 3
     abc
  0: abc
     defabc
  0: abc
-    \Aabc
+    abc\=anchored
  0: abc
-    *** Failers
-No match
-    \Adefabc
+\= Expect no match
+    defabc\=anchored
 No match
     ABC
 No match
 
 /^abc/I
 Capturing subpattern count = 0
-Options: anchored
-No first char
-No need char
+Compile options: <none>
+Overall options: anchored
+Subject length lower bound = 3
     abc
  0: abc
-    \Aabc
+    abc\=anchored
  0: abc
-    *** Failers
-No match
+\= Expect no match
     defabc
 No match
-    \Adefabc
+    defabc\=anchored
 No match
 
 /a+bc/I
 Capturing subpattern count = 0
-No options
-First char = 'a'
-Need char = 'c'
+First code unit = 'a'
+Last code unit = 'c'
+Subject length lower bound = 3
 
 /a*bc/I
 Capturing subpattern count = 0
-No options
-No first char
-Need char = 'c'
+Starting code units: a b 
+Last code unit = 'c'
+Subject length lower bound = 2
 
 /a{3}bc/I
 Capturing subpattern count = 0
-No options
-First char = 'a'
-Need char = 'c'
+First code unit = 'a'
+Last code unit = 'c'
+Subject length lower bound = 5
 
 /(abc|a+z)/I
 Capturing subpattern count = 1
-No options
-First char = 'a'
-No need char
+First code unit = 'a'
+Subject length lower bound = 2
 
 /^abc$/I
 Capturing subpattern count = 0
-Options: anchored
-No first char
-No need char
+Compile options: <none>
+Overall options: anchored
+Subject length lower bound = 3
     abc
  0: abc
-    *** Failers
-No match
+\= Expect no match
     def\nabc
 No match
 
-/ab\idef/X
-Failed: unrecognized character follows \ at offset 3
+/ab\idef/
+Failed: error 103 at offset 3: unrecognized character follows \
 
-/(?X)ab\idef/X
-Failed: unrecognized character follows \ at offset 7
+/(?X)ab\idef/
+Failed: error 111 at offset 2: unrecognized character after (? or (?-
 
 /x{5,4}/
-Failed: numbers out of order in {} quantifier at offset 5
+Failed: error 104 at offset 5: numbers out of order in {} quantifier
 
 /z{65536}/
-Failed: number too big in {} quantifier at offset 7
+Failed: error 105 at offset 7: number too big in {} quantifier
 
 /[abcd/
-Failed: missing terminating ] for character class at offset 5
+Failed: error 106 at offset 5: missing terminating ] for character class
 
-/(?X)[\B]/
-Failed: invalid escape sequence in character class at offset 6
+/[\B]/B
+Failed: error 107 at offset 2: invalid escape sequence in character class
 
-/(?X)[\R]/
-Failed: invalid escape sequence in character class at offset 6
+/[\R]/B
+Failed: error 107 at offset 2: invalid escape sequence in character class
 
-/(?X)[\X]/
-Failed: invalid escape sequence in character class at offset 6
-
-/[\B]/BZ
-------------------------------------------------------------------
-        Bra
-        B
-        Ket
-        End
-------------------------------------------------------------------
-
-/[\R]/BZ
-------------------------------------------------------------------
-        Bra
-        R
-        Ket
-        End
-------------------------------------------------------------------
-
-/[\X]/BZ
-------------------------------------------------------------------
-        Bra
-        X
-        Ket
-        End
-------------------------------------------------------------------
+/[\X]/B
+Failed: error 107 at offset 2: invalid escape sequence in character class
 
 /[z-a]/
-Failed: range out of order in character class at offset 3
+Failed: error 108 at offset 3: range out of order in character class
 
 /^*/
-Failed: nothing to repeat at offset 1
+Failed: error 109 at offset 1: quantifier does not follow a repeatable item
 
 /(abc/
-Failed: missing ) at offset 4
+Failed: error 114 at offset 4: missing closing parenthesis
 
 /(?# abc/
-Failed: missing ) after comment at offset 7
+Failed: error 118 at offset 7: missing ) after (?# comment
 
 /(?z)abc/
-Failed: unrecognized character after (? or (?- at offset 2
+Failed: error 111 at offset 2: unrecognized character after (? or (?-
 
 /.*b/I
 Capturing subpattern count = 0
-No options
-First char at start or follows newline
-Need char = 'b'
+First code unit at start or follows newline
+Last code unit = 'b'
+Subject length lower bound = 1
 
 /.*?b/I
 Capturing subpattern count = 0
-No options
-First char at start or follows newline
-Need char = 'b'
+First code unit at start or follows newline
+Last code unit = 'b'
+Subject length lower bound = 1
 
 /cat|dog|elephant/I
 Capturing subpattern count = 0
-No options
-No first char
-No need char
-    this sentence eventually mentions a cat
- 0: cat
-    this sentences rambles on and on for a while and then reaches elephant
- 0: elephant
-
-/cat|dog|elephant/IS
-Capturing subpattern count = 0
-No options
-No first char
-No need char
+Starting code units: c d e 
 Subject length lower bound = 3
-Starting chars: c d e 
     this sentence eventually mentions a cat
  0: cat
     this sentences rambles on and on for a while and then reaches elephant
  0: elephant
 
-/cat|dog|elephant/IiS
+/cat|dog|elephant/I
+Capturing subpattern count = 0
+Starting code units: c d e 
+Subject length lower bound = 3
+    this sentence eventually mentions a cat
+ 0: cat
+    this sentences rambles on and on for a while and then reaches elephant
+ 0: elephant
+
+/cat|dog|elephant/Ii
 Capturing subpattern count = 0
 Options: caseless
-No first char
-No need char
+Starting code units: C D E c d e 
 Subject length lower bound = 3
-Starting chars: 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
  0: elephant
 
-/a|[bcd]/IS
+/a|[bcd]/I
 Capturing subpattern count = 0
-No options
-No first char
-No need char
+Starting code units: a b c d 
 Subject length lower bound = 1
-Starting chars: a b c d 
 
-/(a|[^\dZ])/IS
+/(a|[^\dZ])/I
 Capturing subpattern count = 1
-No options
-No first char
-No need char
-Subject length lower bound = 1
-Starting chars: \x00 \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x09 \x0a 
+Starting code units: \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 
@@ -224,47 +217,48 @@
   \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 
-
-/(a|b)*[\s]/IS
-Capturing subpattern count = 1
-No options
-No first char
-No need char
 Subject length lower bound = 1
-Starting chars: \x09 \x0a \x0b \x0c \x0d \x20 a b 
+
+/(a|b)*[\s]/I
+Capturing subpattern count = 1
+Starting code units: \x09 \x0a \x0b \x0c \x0d \x20 a b 
+Subject length lower bound = 1
 
 /(ab\2)/
-Failed: reference to non-existent subpattern at offset 6
+Failed: error 115 at offset 4: reference to non-existent subpattern
 
 /{4,5}abc/
-Failed: nothing to repeat at offset 4
+Failed: error 109 at offset 4: quantifier does not follow a repeatable item
 
 /(a)(b)(c)\2/I
 Capturing subpattern count = 3
 Max back reference = 2
-No options
-First char = 'a'
-Need char = 'c'
+First code unit = 'a'
+Last code unit = 'c'
+Subject length lower bound = 4
     abcb
  0: abcb
  1: a
  2: b
  3: c
-    \O0abcb
-Matched, but too many substrings
-    \O3abcb
+    abcb\=ovector=0
+ 0: abcb
+ 1: a
+ 2: b
+ 3: c
+    abcb\=ovector=1
 Matched, but too many substrings
  0: abcb
-    \O6abcb
+    abcb\=ovector=2
 Matched, but too many substrings
  0: abcb
  1: a
-    \O9abcb
+    abcb\=ovector=3
 Matched, but too many substrings
  0: abcb
  1: a
  2: b
-    \O12abcb
+    abcb\=ovector=4
  0: abcb
  1: a
  2: b
@@ -273,18 +267,18 @@
 /(a)bc|(a)(b)\2/I
 Capturing subpattern count = 3
 Max back reference = 2
-No options
-First char = 'a'
-No need char
+First code unit = 'a'
+Subject length lower bound = 3
     abc
  0: abc
  1: a
-    \O0abc
-Matched, but too many substrings
-    \O3abc
+    abc\=ovector=0
+ 0: abc
+ 1: a
+    abc\=ovector=1
 Matched, but too many substrings
  0: abc
-    \O6abc
+    abc\=ovector=2
  0: abc
  1: a
     aba
@@ -292,292 +286,294 @@
  1: <unset>
  2: a
  3: b
-    \O0aba
-Matched, but too many substrings
-    \O3aba
+    aba\=ovector=0
+ 0: aba
+ 1: <unset>
+ 2: a
+ 3: b
+    aba\=ovector=1
 Matched, but too many substrings
  0: aba
-    \O6aba
+    aba\=ovector=2
 Matched, but too many substrings
  0: aba
  1: <unset>
-    \O9aba
+    aba\=ovector=3
 Matched, but too many substrings
  0: aba
  1: <unset>
  2: a
-    \O12aba
+    aba\=ovector=4
  0: aba
  1: <unset>
  2: a
  3: b
 
-/abc$/IE
+/abc$/I,dollar_endonly
 Capturing subpattern count = 0
 Options: dollar_endonly
-First char = 'a'
-Need char = 'c'
+First code unit = 'a'
+Last code unit = 'c'
+Subject length lower bound = 3
     abc
  0: abc
-    *** Failers
-No match
+\= Expect no match
     abc\n
 No match
     abc\ndef
 No match
 
 /(a)(b)(c)(d)(e)\6/
-Failed: reference to non-existent subpattern at offset 17
+Failed: error 115 at offset 16: reference to non-existent subpattern
 
 /the quick brown fox/I
 Capturing subpattern count = 0
-No options
-First char = 't'
-Need char = 'x'
+First code unit = 't'
+Last code unit = 'x'
+Subject length lower bound = 19
     the quick brown fox
  0: the quick brown fox
     this is a line with the quick brown fox
  0: the quick brown fox
 
-/the quick brown fox/IA
+/the quick brown fox/I,anchored
 Capturing subpattern count = 0
 Options: anchored
-No first char
-No need char
+Subject length lower bound = 19
     the quick brown fox
  0: the quick brown fox
-    *** Failers
-No match
+\= Expect no match
     this is a line with the quick brown fox
 No match
 
 /ab(?z)cd/
-Failed: unrecognized character after (? or (?- at offset 4
+Failed: error 111 at offset 4: unrecognized character after (? or (?-
 
 /^abc|def/I
 Capturing subpattern count = 0
-No options
-No first char
-No need char
+Subject length lower bound = 3
     abcdef
  0: abc
-    abcdef\B
+    abcdef\=notbol
  0: def
 
 /.*((abc)$|(def))/I
 Capturing subpattern count = 3
-No options
-First char at start or follows newline
-No need char
+First code unit at start or follows newline
+Subject length lower bound = 3
     defabc
  0: defabc
  1: abc
  2: abc
-    \Zdefabc
+    defabc\=noteol
  0: def
  1: def
  2: <unset>
  3: def
 
 /)/
-Failed: unmatched parentheses at offset 0
+Failed: error 122 at offset 0: unmatched closing parenthesis
 
 /a[]b/
-Failed: missing terminating ] for character class at offset 4
+Failed: error 106 at offset 4: missing terminating ] for character class
 
 /[^aeiou ]{3,}/I
 Capturing subpattern count = 0
-No options
-No first char
-No need char
+Starting code units: \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 ! " # $ % & ' ( ) * + , - . / 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 [ 
+  \ ] ^ _ ` b c d f g h j k l m n p q r s t 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 
+Subject length lower bound = 3
     co-processors, and for
  0: -pr
 
 /<.*>/I
 Capturing subpattern count = 0
-No options
-First char = '<'
-Need char = '>'
+First code unit = '<'
+Last code unit = '>'
+Subject length lower bound = 2
     abc<def>ghi<klm>nop
  0: <def>ghi<klm>
 
 /<.*?>/I
 Capturing subpattern count = 0
-No options
-First char = '<'
-Need char = '>'
+First code unit = '<'
+Last code unit = '>'
+Subject length lower bound = 2
     abc<def>ghi<klm>nop
  0: <def>
 
-/<.*>/IU
+/<.*>/I,ungreedy
 Capturing subpattern count = 0
 Options: ungreedy
-First char = '<'
-Need char = '>'
+First code unit = '<'
+Last code unit = '>'
+Subject length lower bound = 2
     abc<def>ghi<klm>nop
  0: <def>
 
 /(?U)<.*>/I
 Capturing subpattern count = 0
-Options: ungreedy
-First char = '<'
-Need char = '>'
+First code unit = '<'
+Last code unit = '>'
+Subject length lower bound = 2
     abc<def>ghi<klm>nop
  0: <def>
 
-/<.*?>/IU
+/<.*?>/I,ungreedy
 Capturing subpattern count = 0
 Options: ungreedy
-First char = '<'
-Need char = '>'
+First code unit = '<'
+Last code unit = '>'
+Subject length lower bound = 2
     abc<def>ghi<klm>nop
  0: <def>ghi<klm>
 
-/={3,}/IU
+/={3,}/I,ungreedy
 Capturing subpattern count = 0
 Options: ungreedy
-First char = '='
-Need char = '='
+First code unit = '='
+Last code unit = '='
+Subject length lower bound = 3
     abc========def
  0: ===
 
 /(?U)={3,}?/I
 Capturing subpattern count = 0
-Options: ungreedy
-First char = '='
-Need char = '='
+First code unit = '='
+Last code unit = '='
+Subject length lower bound = 3
     abc========def
  0: ========
 
 /(?<!bar|cattle)foo/I
 Capturing subpattern count = 0
 Max lookbehind = 6
-No options
-First char = 'f'
-Need char = 'o'
+First code unit = 'f'
+Last code unit = 'o'
+Subject length lower bound = 3
     foo
  0: foo
     catfoo
  0: foo
-    *** Failers
-No match
+\= Expect no match
     the barfoo
 No match
     and cattlefoo
 No match
 
 /(?<=a+)b/
-Failed: lookbehind assertion is not fixed length at offset 6
+Failed: error 125 at offset 6: lookbehind assertion is not fixed length
 
 /(?<=aaa|b{0,3})b/
-Failed: lookbehind assertion is not fixed length at offset 14
+Failed: error 125 at offset 14: lookbehind assertion is not fixed length
 
 /(?<!(foo)a\1)bar/
-Failed: lookbehind assertion is not fixed length at offset 12
+Failed: error 125 at offset 12: lookbehind assertion is not fixed length
 
 /(?i)abc/I
 Capturing subpattern count = 0
-Options: caseless
-First char = 'a' (caseless)
-Need char = 'c' (caseless)
+First code unit = 'a' (caseless)
+Last code unit = 'c' (caseless)
+Subject length lower bound = 3
 
 /(a|(?m)a)/I
 Capturing subpattern count = 1
-No options
-First char = 'a'
-No need char
+First code unit = 'a'
+Subject length lower bound = 1
 
 /(?i)^1234/I
 Capturing subpattern count = 0
-Options: anchored caseless
-No first char
-No need char
+Compile options: <none>
+Overall options: anchored
+Subject length lower bound = 4
 
 /(^b|(?i)^d)/I
 Capturing subpattern count = 1
-Options: anchored
-No first char
-No need char
+Compile options: <none>
+Overall options: anchored
+Subject length lower bound = 1
 
 /(?s).*/I
 Capturing subpattern count = 0
 May match empty string
-Options: anchored dotall
-No first char
-No need char
+Compile options: <none>
+Overall options: anchored
+Subject length lower bound = 0
 
-/[abcd]/IS
+/[abcd]/I
 Capturing subpattern count = 0
-No options
-No first char
-No need char
+Starting code units: a b c d 
 Subject length lower bound = 1
-Starting chars: a b c d 
 
-/(?i)[abcd]/IS
+/(?i)[abcd]/I
 Capturing subpattern count = 0
-Options: caseless
-No first char
-No need char
+Starting code units: A B C D a b c d 
 Subject length lower bound = 1
-Starting chars: A B C D a b c d 
 
-/(?m)[xy]|(b|c)/IS
+/(?m)[xy]|(b|c)/I
 Capturing subpattern count = 1
-Options: multiline
-No first char
-No need char
+Starting code units: b c x y 
 Subject length lower bound = 1
-Starting chars: b c x y 
 
 /(^a|^b)/Im
 Capturing subpattern count = 1
 Options: multiline
-First char at start or follows newline
-No need char
+First code unit at start or follows newline
+Subject length lower bound = 1
 
 /(?i)(^a|^b)/Im
 Capturing subpattern count = 1
-Options: caseless multiline
-First char at start or follows newline
-No need char
+Options: multiline
+First code unit at start or follows newline
+Subject length lower bound = 1
 
 /(a)(?(1)a|b|c)/
-Failed: conditional group contains more than two branches at offset 13
+Failed: error 127 at offset 13: conditional group contains more than two branches
 
 /(?(?=a)a|b|c)/
-Failed: conditional group contains more than two branches at offset 12
+Failed: error 127 at offset 12: conditional group contains more than two branches
 
 /(?(1a)/
-Failed: malformed number or name after (?( at offset 4
+Failed: error 126 at offset 4: malformed number or name after (?(
 
 /(?(1a))/
-Failed: malformed number or name after (?( at offset 4
+Failed: error 126 at offset 4: malformed number or name after (?(
 
 /(?(?i))/
-Failed: assertion expected after (?( at offset 3
+Failed: error 128 at offset 3: assertion expected after (?( or (?(?C)
 
 /(?(abc))/
-Failed: reference to non-existent subpattern at offset 7
+Failed: error 115 at offset 7: reference to non-existent subpattern
 
 /(?(?<ab))/
-Failed: assertion expected after (?( at offset 3
+Failed: error 128 at offset 3: assertion expected after (?( or (?(?C)
 
 /((?s)blah)\s+\1/I
 Capturing subpattern count = 1
 Max back reference = 1
-No options
-First char = 'b'
-Need char = 'h'
+First code unit = 'b'
+Last code unit = 'h'
+Subject length lower bound = 9
 
 /((?i)blah)\s+\1/I
 Capturing subpattern count = 1
 Max back reference = 1
-No options
-First char = 'b' (caseless)
-Need char = 'h' (caseless)
+First code unit = 'b' (caseless)
+Last code unit = 'h' (caseless)
+Subject length lower bound = 9
 
-/((?i)b)/IDZS
+/((?i)b)/IB
 ------------------------------------------------------------------
         Bra
         CBra 1
@@ -587,70 +583,62 @@
         End
 ------------------------------------------------------------------
 Capturing subpattern count = 1
-No options
-First char = 'b' (caseless)
-No need char
+First code unit = 'b' (caseless)
 Subject length lower bound = 1
-No starting char list
 
-/(a*b|(?i:c*(?-i)d))/IS
+/(a*b|(?i:c*(?-i)d))/I
 Capturing subpattern count = 1
-No options
-No first char
-No need char
+Starting code units: C a b c d 
 Subject length lower bound = 1
-Starting chars: C a b c d 
 
 /a$/I
 Capturing subpattern count = 0
-No options
-First char = 'a'
-No need char
+First code unit = 'a'
+Subject length lower bound = 1
     a
  0: a
     a\n
  0: a
-    *** Failers
+\= Expect no match
+    a\=noteol
 No match
-    \Za
-No match
-    \Za\n
+    a\n\=noteol
 No match
 
 /a$/Im
 Capturing subpattern count = 0
 Options: multiline
-First char = 'a'
-No need char
+First code unit = 'a'
+Subject length lower bound = 1
     a
  0: a
     a\n
  0: a
-    \Za\n
+    a\n\=noteol
  0: a
-    *** Failers
-No match
-    \Za
+\= Expect no match
+    a\=noteol
 No match
 
 /\Aabc/Im
 Capturing subpattern count = 0
 Max lookbehind = 1
-Options: anchored multiline
-No first char
-No need char
+Compile options: multiline
+Overall options: anchored multiline
+Subject length lower bound = 3
 
 /^abc/Im
 Capturing subpattern count = 0
 Options: multiline
-First char at start or follows newline
-Need char = 'c'
+First code unit at start or follows newline
+Last code unit = 'c'
+Subject length lower bound = 3
 
 /^((a+)(?U)([ab]+)(?-U)([bc]+)(\w*))/I
 Capturing subpattern count = 5
-Options: anchored
-No first char
-No need char
+Compile options: <none>
+Overall options: anchored
+Subject length lower bound = 3
   aaaaabbbbbcccccdef
  0: aaaaabbbbbcccccdef
  1: aaaaabbbbbcccccdef
@@ -659,43 +647,34 @@
  4: bbbbccccc
  5: def
 
-/(?<=foo)[ab]/IS
+/(?<=foo)[ab]/I
 Capturing subpattern count = 0
 Max lookbehind = 3
-No options
-No first char
-No need char
+Starting code units: a b 
 Subject length lower bound = 1
-Starting chars: a b 
 
-/(?<!foo)(alpha|omega)/IS
+/(?<!foo)(alpha|omega)/I
 Capturing subpattern count = 1
 Max lookbehind = 3
-No options
-No first char
-Need char = 'a'
+Starting code units: a o 
+Last code unit = 'a'
 Subject length lower bound = 5
-Starting chars: a o 
 
-/(?!alphabet)[ab]/IS
+/(?!alphabet)[ab]/I
 Capturing subpattern count = 0
-No options
-No first char
-No need char
+Starting code units: a b 
 Subject length lower bound = 1
-Starting chars: a b 
 
 /(?<=foo\n)^bar/Im
 Capturing subpattern count = 0
 Max lookbehind = 4
 Contains explicit CR or LF match
 Options: multiline
-No first char
-Need char = 'r'
+Last code unit = 'r'
+Subject length lower bound = 3
     foo\nbarbar
  0: bar
-    ***Failers
-No match
+\= Expect no match
     rhubarb
 No match
     barbell
@@ -708,12 +687,12 @@
 Max lookbehind = 4
 Contains explicit CR or LF match
 Options: multiline
-First char at start or follows newline
-Need char = 'r'
+First code unit at start or follows newline
+Last code unit = 'r'
+Subject length lower bound = 3
     foo\nbarbar
  0: bar
-    ***Failers
-No match
+\= Expect no match
     rhubarb
 No match
     barbell
@@ -724,40 +703,39 @@
 /(?>^abc)/Im
 Capturing subpattern count = 0
 Options: multiline
-First char at start or follows newline
-Need char = 'c'
+First code unit at start or follows newline
+Last code unit = 'c'
+Subject length lower bound = 3
     abc
  0: abc
     def\nabc
  0: abc
-    *** Failers
-No match
+\= Expect no match
     defabc
 No match
 
 /(?<=ab(c+)d)ef/
-Failed: lookbehind assertion is not fixed length at offset 11
+Failed: error 125 at offset 11: lookbehind assertion is not fixed length
 
 /(?<=ab(?<=c+)d)ef/
-Failed: lookbehind assertion is not fixed length at offset 12
+Failed: error 125 at offset 12: lookbehind assertion is not fixed length
 
 /(?<=ab(c|de)f)g/
-Failed: lookbehind assertion is not fixed length at offset 13
+Failed: error 125 at offset 13: lookbehind assertion is not fixed length
 
 /The next three are in testinput2 because they have variable length branches/
 
 /(?<=bullock|donkey)-cart/I
 Capturing subpattern count = 0
 Max lookbehind = 7
-No options
-First char = '-'
-Need char = 't'
+First code unit = '-'
+Last code unit = 't'
+Subject length lower bound = 5
     the bullock-cart
  0: -cart
     a donkey-cart race
  0: -cart
-    *** Failers
-No match
+\= Expect no match
     cart
 No match
     horse-and-cart
@@ -767,17 +745,13 @@
 Capturing subpattern count = 0
 Max lookbehind = 3
 May match empty string
-No options
-No first char
-No need char
+Subject length lower bound = 0
 
 /(?>.*)(?<=(abcd)|(xyz))/I
 Capturing subpattern count = 2
 Max lookbehind = 4
 May match empty string
-No options
-No first char
-No need char
+Subject length lower bound = 0
     alphabetabcd
  0: alphabetabcd
  1: abcd
@@ -789,9 +763,9 @@
 /(?<=ab(?i)x(?-i)y|(?i)z|b)ZZ/I
 Capturing subpattern count = 0
 Max lookbehind = 4
-No options
-First char = 'Z'
-Need char = 'Z'
+First code unit = 'Z'
+Last code unit = 'Z'
+Subject length lower bound = 2
     abxyZZ
  0: ZZ
     abXyZZ
@@ -804,8 +778,7 @@
  0: ZZ
     BZZ
  0: ZZ
-    *** Failers
-No match
+\= Expect no match
     ZZ
 No match
     abXYZZ
@@ -818,47 +791,40 @@
 /(?<!(foo)a)bar/I
 Capturing subpattern count = 1
 Max lookbehind = 4
-No options
-First char = 'b'
-Need char = 'r'
+First code unit = 'b'
+Last code unit = 'r'
+Subject length lower bound = 3
     bar
  0: bar
     foobbar
  0: bar
-    *** Failers
-No match
+\= Expect no match
     fooabar
 No match
 
-/This one is here because Perl behaves differently; see also the following/I
-Capturing subpattern count = 0
-No options
-First char = 'T'
-Need char = 'g'
+# This one is here because Perl behaves differently; see also the following.
 
 /^(a\1?){4}$/I
 Capturing subpattern count = 1
 Max back reference = 1
-Options: anchored
-No first char
-No need char
+Compile options: <none>
+Overall options: anchored
+Subject length lower bound = 4
+\= Expect no match
     aaaa
 No match
     aaaaaa
 No match
     
-/Perl does not fail these two for the final subjects. Neither did PCRE until/
-/release 8.01. The problem is in backtracking into a subpattern that contains/
-No match
-/a recursive reference to itself. PCRE has now made these into atomic patterns./
-No match
+# Perl does not fail these two for the final subjects. Neither did PCRE until
+# release 8.01. The problem is in backtracking into a subpattern that contains
+# a recursive reference to itself. PCRE has now made these into atomic patterns.
 
 /^(xa|=?\1a){2}$/
     xa=xaa
  0: xa=xaa
  1: =xaa
-    ** Failers
-No match
+\= Expect no match
     xa=xaaa
 No match
 
@@ -866,165 +832,156 @@
     xa=xaa
  0: xa=xaa
  1: =xaa
-    ** Failers
-No match
+\= Expect no match
     xa=xaaa
 No match
 
-/These are syntax tests from Perl 5.005/I
-Capturing subpattern count = 0
-No options
-First char = 'T'
-Need char = '5'
+# These are syntax tests from Perl 5.005
 
 /a[b-a]/
-Failed: range out of order in character class at offset 4
+Failed: error 108 at offset 4: range out of order in character class
 
 /a[]b/
-Failed: missing terminating ] for character class at offset 4
+Failed: error 106 at offset 4: missing terminating ] for character class
 
 /a[/
-Failed: missing terminating ] for character class at offset 2
+Failed: error 106 at offset 2: missing terminating ] for character class
 
 /*a/
-Failed: nothing to repeat at offset 0
+Failed: error 109 at offset 0: quantifier does not follow a repeatable item
 
 /(*)b/
-Failed: nothing to repeat at offset 1
+Failed: error 109 at offset 1: quantifier does not follow a repeatable item
 
 /abc)/
-Failed: unmatched parentheses at offset 3
+Failed: error 122 at offset 3: unmatched closing parenthesis
 
 /(abc/
-Failed: missing ) at offset 4
+Failed: error 114 at offset 4: missing closing parenthesis
 
 /a**/
-Failed: nothing to repeat at offset 2
+Failed: error 109 at offset 2: quantifier does not follow a repeatable item
 
 /)(/
-Failed: unmatched parentheses at offset 0
+Failed: error 122 at offset 0: unmatched closing parenthesis
 
 /\1/
-Failed: reference to non-existent subpattern at offset 2
+Failed: error 115 at offset 1: reference to non-existent subpattern
 
 /\2/
-Failed: reference to non-existent subpattern at offset 2
+Failed: error 115 at offset 1: reference to non-existent subpattern
 
 /(a)|\2/
-Failed: reference to non-existent subpattern at offset 6
+Failed: error 115 at offset 5: reference to non-existent subpattern
 
 /a[b-a]/Ii
-Failed: range out of order in character class at offset 4
+Failed: error 108 at offset 4: range out of order in character class
 
 /a[]b/Ii
-Failed: missing terminating ] for character class at offset 4
+Failed: error 106 at offset 4: missing terminating ] for character class
 
 /a[/Ii
-Failed: missing terminating ] for character class at offset 2
+Failed: error 106 at offset 2: missing terminating ] for character class
 
 /*a/Ii
-Failed: nothing to repeat at offset 0
+Failed: error 109 at offset 0: quantifier does not follow a repeatable item
 
 /(*)b/Ii
-Failed: nothing to repeat at offset 1
+Failed: error 109 at offset 1: quantifier does not follow a repeatable item
 
 /abc)/Ii
-Failed: unmatched parentheses at offset 3
+Failed: error 122 at offset 3: unmatched closing parenthesis
 
 /(abc/Ii
-Failed: missing ) at offset 4
+Failed: error 114 at offset 4: missing closing parenthesis
 
 /a**/Ii
-Failed: nothing to repeat at offset 2
+Failed: error 109 at offset 2: quantifier does not follow a repeatable item
 
 /)(/Ii
-Failed: unmatched parentheses at offset 0
+Failed: error 122 at offset 0: unmatched closing parenthesis
 
 /:(?:/
-Failed: missing ) at offset 4
+Failed: error 114 at offset 4: missing closing parenthesis
 
 /(?<%)b/
-Failed: unrecognized character after (?< at offset 3
+Failed: error 124 at offset 3: letter or underscore expected after (?< or (?'
 
 /a(?{)b/
-Failed: unrecognized character after (? or (?- at offset 3
+Failed: error 111 at offset 3: unrecognized character after (? or (?-
 
 /a(?{{})b/
-Failed: unrecognized character after (? or (?- at offset 3
+Failed: error 111 at offset 3: unrecognized character after (? or (?-
 
 /a(?{}})b/
-Failed: unrecognized character after (? or (?- at offset 3
+Failed: error 111 at offset 3: unrecognized character after (? or (?-
 
 /a(?{"{"})b/
-Failed: unrecognized character after (? or (?- at offset 3
+Failed: error 111 at offset 3: unrecognized character after (? or (?-
 
 /a(?{"{"}})b/
-Failed: unrecognized character after (? or (?- at offset 3
+Failed: error 111 at offset 3: unrecognized character after (? or (?-
 
 /(?(1?)a|b)/
-Failed: malformed number or name after (?( at offset 4
+Failed: error 126 at offset 4: malformed number or name after (?(
 
 /[a[:xyz:/
-Failed: missing terminating ] for character class at offset 8
+Failed: error 106 at offset 8: missing terminating ] for character class
 
 /(?<=x+)y/
-Failed: lookbehind assertion is not fixed length at offset 6
+Failed: error 125 at offset 6: lookbehind assertion is not fixed length
 
 /a{37,17}/
-Failed: numbers out of order in {} quantifier at offset 7
+Failed: error 104 at offset 7: numbers out of order in {} quantifier
 
 /abc/\
-Failed: \ at end of pattern at offset 4
+Failed: error 101 at offset 3: \ at end of pattern
 
 /abc/\i
-Failed: \ at end of pattern at offset 4
+Failed: error 101 at offset 3: \ at end of pattern
 
 /(a)bc(d)/I
 Capturing subpattern count = 2
-No options
-First char = 'a'
-Need char = 'd'
+First code unit = 'a'
+Last code unit = 'd'
+Subject length lower bound = 4
     abcd
  0: abcd
  1: a
  2: d
-    abcd\C2
+    abcd\=copy=2
  0: abcd
  1: a
  2: d
  2C d (1)
-    abcd\C5
+    abcd\=copy=5
  0: abcd
  1: a
  2: d
-copy substring 5 failed -7
+Copy substring 5 failed (-49): unknown substring
 
 /(.{20})/I
 Capturing subpattern count = 1
-No options
-No first char
-No need char
+Subject length lower bound = 20
     abcdefghijklmnopqrstuvwxyz
  0: abcdefghijklmnopqrst
  1: abcdefghijklmnopqrst
-    abcdefghijklmnopqrstuvwxyz\C1
+    abcdefghijklmnopqrstuvwxyz\=copy=1
  0: abcdefghijklmnopqrst
  1: abcdefghijklmnopqrst
  1C abcdefghijklmnopqrst (20)
-    abcdefghijklmnopqrstuvwxyz\G1
+    abcdefghijklmnopqrstuvwxyz\=get=1
  0: abcdefghijklmnopqrst
  1: abcdefghijklmnopqrst
  1G abcdefghijklmnopqrst (20)
 
 /(.{15})/I
 Capturing subpattern count = 1
-No options
-No first char
-No need char
+Subject length lower bound = 15
     abcdefghijklmnopqrstuvwxyz
  0: abcdefghijklmno
  1: abcdefghijklmno
-    abcdefghijklmnopqrstuvwxyz\C1\G1
+    abcdefghijklmnopqrstuvwxyz\=copy=1,get=1
  0: abcdefghijklmno
  1: abcdefghijklmno
  1C abcdefghijklmno (15)
@@ -1032,13 +989,11 @@
 
 /(.{16})/I
 Capturing subpattern count = 1
-No options
-No first char
-No need char
+Subject length lower bound = 16
     abcdefghijklmnopqrstuvwxyz
  0: abcdefghijklmnop
  1: abcdefghijklmnop
-    abcdefghijklmnopqrstuvwxyz\C1\G1\L
+    abcdefghijklmnopqrstuvwxyz\=copy=1,get=1,getall
  0: abcdefghijklmnop
  1: abcdefghijklmnop
  1C abcdefghijklmnop (16)
@@ -1048,23 +1003,23 @@
 
 /^(a|(bc))de(f)/I
 Capturing subpattern count = 3
-Options: anchored
-No first char
-No need char
-    adef\G1\G2\G3\G4\L
+Compile options: <none>
+Overall options: anchored
+Subject length lower bound = 4
+    adef\=get=1,get=2,get=3,get=4,getall
  0: adef
  1: a
  2: <unset>
  3: f
  1G a (1)
- 2G  (0)
+Get substring 2 failed (-55): requested value is not set
  3G f (1)
-get substring 4 failed -7
+Get substring 4 failed (-49): unknown substring
  0L adef
  1L a
  2L 
  3L f
-    bcdef\G1\G2\G3\G4\L
+    bcdef\=get=1,get=2,get=3,get=4,getall
  0: bcdef
  1: bc
  2: bc
@@ -1072,12 +1027,12 @@
  1G bc (2)
  2G bc (2)
  3G f (1)
-get substring 4 failed -7
+Get substring 4 failed (-49): unknown substring
  0L bcdef
  1L bc
  2L bc
  3L f
-    adefghijk\C0
+    adefghijk\=copy=0
  0: adef
  1: a
  2: <unset>
@@ -1086,24 +1041,24 @@
 
 /^abc\00def/I
 Capturing subpattern count = 0
-Options: anchored
-No first char
-No need char
-    abc\00def\L\C0
+Compile options: <none>
+Overall options: anchored
+Subject length lower bound = 7
+    abc\00def\=copy=0,getall
  0: abc\x00def
  0C abc\x00def (7)
- 0L abc
+ 0L abc\x00def
 
 /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/I
 Capturing subpattern count = 8
 Contains explicit CR or LF match
-No options
-First char = 'w'
-Need char = 'd'
+First code unit = 'w'
+Last code unit = 'd'
+Subject length lower bound = 14
 
-/.*X/IDZ
+/.*X/IB
 ------------------------------------------------------------------
         Bra
         Any*
@@ -1112,11 +1067,11 @@
         End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
-No options
-First char at start or follows newline
-Need char = 'X'
+First code unit at start or follows newline
+Last code unit = 'X'
+Subject length lower bound = 1
 
-/.*X/IDZs
+/.*X/IBs
 ------------------------------------------------------------------
         Bra
         AllAny*
@@ -1125,11 +1080,12 @@
         End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
-Options: anchored dotall
-No first char
-Need char = 'X'
+Compile options: dotall
+Overall options: anchored dotall
+Last code unit = 'X'
+Subject length lower bound = 1
 
-/(.*X|^B)/IDZ
+/(.*X|^B)/IB
 ------------------------------------------------------------------
         Bra
         CBra 1
@@ -1143,11 +1099,10 @@
         End
 ------------------------------------------------------------------
 Capturing subpattern count = 1
-No options
-First char at start or follows newline
-No need char
+First code unit at start or follows newline
+Subject length lower bound = 1
 
-/(.*X|^B)/IDZs
+/(.*X|^B)/IBs
 ------------------------------------------------------------------
         Bra
         CBra 1
@@ -1161,11 +1116,11 @@
         End
 ------------------------------------------------------------------
 Capturing subpattern count = 1
-Options: anchored dotall
-No first char
-No need char
+Compile options: dotall
+Overall options: anchored dotall
+Subject length lower bound = 1
 
-/(?s)(.*X|^B)/IDZ
+/(?s)(.*X|^B)/IB
 ------------------------------------------------------------------
         Bra
         CBra 1
@@ -1179,11 +1134,11 @@
         End
 ------------------------------------------------------------------
 Capturing subpattern count = 1
-Options: anchored dotall
-No first char
-No need char
+Compile options: <none>
+Overall options: anchored
+Subject length lower bound = 1
 
-/(?s:.*X|^B)/IDZ
+/(?s:.*X|^B)/IB
 ------------------------------------------------------------------
         Bra
         Bra
@@ -1197,104 +1152,102 @@
         End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
-Options: anchored
-No first char
-No need char
+Compile options: <none>
+Overall options: anchored
+Subject length lower bound = 1
 
-/\Biss\B/I+
+/\Biss\B/I,aftertext
 Capturing subpattern count = 0
 Max lookbehind = 1
-No options
-First char = 'i'
-Need char = 's'
+First code unit = 'i'
+Last code unit = 's'
+Subject length lower bound = 3
     Mississippi
  0: iss
  0+ issippi
 
-/iss/IG+
+/iss/I,aftertext,altglobal
 Capturing subpattern count = 0
-No options
-First char = 'i'
-Need char = 's'
+First code unit = 'i'
+Last code unit = 's'
+Subject length lower bound = 3
     Mississippi
  0: iss
  0+ issippi
  0: iss
  0+ ippi
 
-/\Biss\B/IG+
+/\Biss\B/I,aftertext,altglobal
 Capturing subpattern count = 0
 Max lookbehind = 1
-No options
-First char = 'i'
-Need char = 's'
+First code unit = 'i'
+Last code unit = 's'
+Subject length lower bound = 3
     Mississippi
  0: iss
  0+ issippi
 
-/\Biss\B/Ig+
+/\Biss\B/Ig,aftertext
 Capturing subpattern count = 0
 Max lookbehind = 1
-No options
-First char = 'i'
-Need char = 's'
+First code unit = 'i'
+Last code unit = 's'
+Subject length lower bound = 3
     Mississippi
  0: iss
  0+ issippi
  0: iss
  0+ ippi
-    *** Failers
-No match
-    Mississippi\A
+\= Expect no match
+    Mississippi\=anchored
 No match
 
-/(?<=[Ms])iss/Ig+
+/(?<=[Ms])iss/Ig,aftertext
 Capturing subpattern count = 0
 Max lookbehind = 1
-No options
-First char = 'i'
-Need char = 's'
+First code unit = 'i'
+Last code unit = 's'
+Subject length lower bound = 3
     Mississippi
  0: iss
  0+ issippi
  0: iss
  0+ ippi
 
-/(?<=[Ms])iss/IG+
+/(?<=[Ms])iss/I,aftertext,altglobal
 Capturing subpattern count = 0
 Max lookbehind = 1
-No options
-First char = 'i'
-Need char = 's'
+First code unit = 'i'
+Last code unit = 's'
+Subject length lower bound = 3
     Mississippi
  0: iss
  0+ issippi
 
-/^iss/Ig+
+/^iss/Ig,aftertext
 Capturing subpattern count = 0
-Options: anchored
-No first char
-No need char
+Compile options: <none>
+Overall options: anchored
+Subject length lower bound = 3
     ississippi
  0: iss
  0+ issippi
 
-/.*iss/Ig+
+/.*iss/Ig,aftertext
 Capturing subpattern count = 0
-No options
-First char at start or follows newline
-Need char = 's'
+First code unit at start or follows newline
+Last code unit = 's'
+Subject length lower bound = 3
     abciss\nxyzisspqr
  0: abciss
  0+ \x0axyzisspqr
  0: xyziss
  0+ pqr
 
-/.i./I+g
+/.i./Ig,aftertext
 Capturing subpattern count = 0
-No options
-No first char
-Need char = 'i'
+Last code unit = 'i'
+Subject length lower bound = 3
     Mississippi
  0: Mis
  0+ sissippi
@@ -1302,7 +1255,7 @@
  0+ sippi
  0: sip
  0+ pi
-    Mississippi\A
+    Mississippi\=anchored
  0: Mis
  0+ sissippi
  0: sis
@@ -1316,301 +1269,288 @@
  0+ river
  0: riv
  0+ er
-    Missouri river\A
+    Missouri river\=anchored
  0: Mis
  0+ souri river
 
-/^.is/I+g
+/^.is/Ig,aftertext
 Capturing subpattern count = 0
-Options: anchored
-No first char
-No need char
+Compile options: <none>
+Overall options: anchored
+Subject length lower bound = 3
     Mississippi
  0: Mis
  0+ sissippi
 
-/^ab\n/Ig+
+/^ab\n/Ig,aftertext
 Capturing subpattern count = 0
 Contains explicit CR or LF match
-Options: anchored
-No first char
-No need char
+Compile options: <none>
+Overall options: anchored
+Subject length lower bound = 3
     ab\nab\ncd
  0: ab\x0a
  0+ ab\x0acd
 
-/^ab\n/Img+
+/^ab\n/Igm,aftertext
 Capturing subpattern count = 0
 Contains explicit CR or LF match
 Options: multiline
-First char at start or follows newline
-Need char = \x0a
+First code unit at start or follows newline
+Last code unit = \x0a
+Subject length lower bound = 3
     ab\nab\ncd
  0: ab\x0a
  0+ ab\x0acd
  0: ab\x0a
  0+ cd
 
+/^/gm,newline=any
+    a\rb\nc\r\nxyz\=aftertext
+ 0: 
+ 0+ a\x0db\x0ac\x0d\x0axyz
+ 0: 
+ 0+ b\x0ac\x0d\x0axyz
+ 0: 
+ 0+ c\x0d\x0axyz
+ 0: 
+ 0+ xyz
+
 /abc/I
 Capturing subpattern count = 0
-No options
-First char = 'a'
-Need char = 'c'
+First code unit = 'a'
+Last code unit = 'c'
+Subject length lower bound = 3
 
 /abc|bac/I
 Capturing subpattern count = 0
-No options
-No first char
-Need char = 'c'
+Starting code units: a b 
+Last code unit = 'c'
+Subject length lower bound = 3
 
 /(abc|bac)/I
 Capturing subpattern count = 1
-No options
-No first char
-Need char = 'c'
+Starting code units: a b 
+Last code unit = 'c'
+Subject length lower bound = 3
 
 /(abc|(c|dc))/I
 Capturing subpattern count = 2
-No options
-No first char
-Need char = 'c'
+Starting code units: a c d 
+Last code unit = 'c'
+Subject length lower bound = 1
 
 /(abc|(d|de)c)/I
 Capturing subpattern count = 2
-No options
-No first char
-Need char = 'c'
+Starting code units: a d 
+Last code unit = 'c'
+Subject length lower bound = 2
 
 /a*/I
 Capturing subpattern count = 0
 May match empty string
-No options
-No first char
-No need char
+Subject length lower bound = 0
 
 /a+/I
 Capturing subpattern count = 0
-No options
-First char = 'a'
-No need char
+First code unit = 'a'
+Subject length lower bound = 1
 
 /(baa|a+)/I
 Capturing subpattern count = 1
-No options
-No first char
-Need char = 'a'
+Starting code units: a b 
+Last code unit = 'a'
+Subject length lower bound = 1
 
 /a{0,3}/I
 Capturing subpattern count = 0
 May match empty string
-No options
-No first char
-No need char
+Subject length lower bound = 0
 
 /baa{3,}/I
 Capturing subpattern count = 0
-No options
-First char = 'b'
-Need char = 'a'
+First code unit = 'b'
+Last code unit = 'a'
+Subject length lower bound = 5
 
 /"([^\\"]+|\\.)*"/I
 Capturing subpattern count = 1
-No options
-First char = '"'
-Need char = '"'
+First code unit = '"'
+Last code unit = '"'
+Subject length lower bound = 2
 
 /(abc|ab[cd])/I
 Capturing subpattern count = 1
-No options
-First char = 'a'
-No need char
+First code unit = 'a'
+Subject length lower bound = 3
 
 /(a|.)/I
 Capturing subpattern count = 1
-No options
-No first char
-No need char
+Subject length lower bound = 1
 
 /a|ba|\w/I
 Capturing subpattern count = 0
-No options
-No first char
-No need char
+Starting code units: 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 
+Subject length lower bound = 1
 
 /abc(?=pqr)/I
 Capturing subpattern count = 0
-No options
-First char = 'a'
-Need char = 'r'
+First code unit = 'a'
+Last code unit = 'r'
+Subject length lower bound = 3
 
 /...(?<=abc)/I
 Capturing subpattern count = 0
 Max lookbehind = 3
-No options
-No first char
-No need char
+Subject length lower bound = 3
 
 /abc(?!pqr)/I
 Capturing subpattern count = 0
-No options
-First char = 'a'
-Need char = 'c'
+First code unit = 'a'
+Last code unit = 'c'
+Subject length lower bound = 3
 
 /ab./I
 Capturing subpattern count = 0
-No options
-First char = 'a'
-Need char = 'b'
+First code unit = 'a'
+Last code unit = 'b'
+Subject length lower bound = 3
 
 /ab[xyz]/I
 Capturing subpattern count = 0
-No options
-First char = 'a'
-Need char = 'b'
+First code unit = 'a'
+Last code unit = 'b'
+Subject length lower bound = 3
 
 /abc*/I
 Capturing subpattern count = 0
-No options
-First char = 'a'
-Need char = 'b'
+First code unit = 'a'
+Last code unit = 'b'
+Subject length lower bound = 2
 
 /ab.c*/I
 Capturing subpattern count = 0
-No options
-First char = 'a'
-Need char = 'b'
+First code unit = 'a'
+Last code unit = 'b'
+Subject length lower bound = 3
 
 /a.c*/I
 Capturing subpattern count = 0
-No options
-First char = 'a'
-No need char
+First code unit = 'a'
+Subject length lower bound = 2
 
 /.c*/I
 Capturing subpattern count = 0
-No options
-No first char
-No need char
+Subject length lower bound = 1
 
 /ac*/I
 Capturing subpattern count = 0
-No options
-First char = 'a'
-No need char
+First code unit = 'a'
+Subject length lower bound = 1
 
 /(a.c*|b.c*)/I
 Capturing subpattern count = 1
-No options
-No first char
-No need char
+Starting code units: a b 
+Subject length lower bound = 2
 
 /a.c*|aba/I
 Capturing subpattern count = 0
-No options
-First char = 'a'
-No need char
+First code unit = 'a'
+Subject length lower bound = 2
 
 /.+a/I
 Capturing subpattern count = 0
-No options
-No first char
-Need char = 'a'
+Last code unit = 'a'
+Subject length lower bound = 2
 
 /(?=abcda)a.*/I
 Capturing subpattern count = 0
-No options
-First char = 'a'
-Need char = 'a'
+First code unit = 'a'
+Last code unit = 'a'
+Subject length lower bound = 1
 
 /(?=a)a.*/I
 Capturing subpattern count = 0
-No options
-First char = 'a'
-No need char
+First code unit = 'a'
+Subject length lower bound = 1
 
 /a(b)*/I
 Capturing subpattern count = 1
-No options
-First char = 'a'
-No need char
+First code unit = 'a'
+Subject length lower bound = 1
 
 /a\d*/I
 Capturing subpattern count = 0
-No options
-First char = 'a'
-No need char
+First code unit = 'a'
+Subject length lower bound = 1
 
 /ab\d*/I
 Capturing subpattern count = 0
-No options
-First char = 'a'
-Need char = 'b'
+First code unit = 'a'
+Last code unit = 'b'
+Subject length lower bound = 2
 
 /a(\d)*/I
 Capturing subpattern count = 1
-No options
-First char = 'a'
-No need char
+First code unit = 'a'
+Subject length lower bound = 1
 
 /abcde{0,0}/I
 Capturing subpattern count = 0
-No options
-First char = 'a'
-Need char = 'd'
+First code unit = 'a'
+Last code unit = 'd'
+Subject length lower bound = 4
 
 /ab\d+/I
 Capturing subpattern count = 0
-No options
-First char = 'a'
-Need char = 'b'
+First code unit = 'a'
+Last code unit = 'b'
+Subject length lower bound = 3
 
 /a(?(1)b)(.)/I
 Capturing subpattern count = 1
 Max back reference = 1
-No options
-First char = 'a'
-No need char
+First code unit = 'a'
+Subject length lower bound = 2
 
 /a(?(1)bag|big)(.)/I
 Capturing subpattern count = 1
 Max back reference = 1
-No options
-First char = 'a'
-Need char = 'g'
+First code unit = 'a'
+Last code unit = 'g'
+Subject length lower bound = 5
 
 /a(?(1)bag|big)*(.)/I
 Capturing subpattern count = 1
 Max back reference = 1
-No options
-First char = 'a'
-No need char
+First code unit = 'a'
+Subject length lower bound = 2
 
 /a(?(1)bag|big)+(.)/I
 Capturing subpattern count = 1
 Max back reference = 1
-No options
-First char = 'a'
-Need char = 'g'
+First code unit = 'a'
+Last code unit = 'g'
+Subject length lower bound = 5
 
 /a(?(1)b..|b..)(.)/I
 Capturing subpattern count = 1
 Max back reference = 1
-No options
-First char = 'a'
-Need char = 'b'
+First code unit = 'a'
+Last code unit = 'b'
+Subject length lower bound = 5
 
 /ab\d{0}e/I
 Capturing subpattern count = 0
-No options
-First char = 'a'
-Need char = 'e'
+First code unit = 'a'
+Last code unit = 'e'
+Subject length lower bound = 3
 
 /a?b?/I
 Capturing subpattern count = 0
 May match empty string
-No options
-No first char
-No need char
+Subject length lower bound = 0
     a
  0: a
     b
@@ -1619,35 +1559,30 @@
  0: ab
     \
  0: 
-    *** Failers
- 0: 
-    \N
+\= Expect no match
+    \=notempty
 No match
 
 /|-/I
 Capturing subpattern count = 0
 May match empty string
-No options
-No first char
-No need char
+Subject length lower bound = 0
     abcd
  0: 
     -abc
  0: 
-    \Nab-c
+    ab-c\=notempty
  0: -
-    *** Failers
- 0: 
-    \Nabc
+\= Expect no match
+    abc\=notempty
 No match
 
-/^.?abcd/IS
+/^.?abcd/I
 Capturing subpattern count = 0
-Options: anchored
-No first char
-Need char = 'd'
+Compile options: <none>
+Overall options: anchored
+Last code unit = 'd'
 Subject length lower bound = 4
-No starting char list
 
 /\(             # ( at start
   (?:           # Non-capturing bracket
@@ -1659,8 +1594,9 @@
   /Ix
 Capturing subpattern count = 0
 Options: extended
-First char = '('
-Need char = ')'
+First code unit = '('
+Last code unit = ')'
+Subject length lower bound = 2
     (abcd)
  0: (abcd)
     (abcd)xyz
@@ -1675,8 +1611,7 @@
  0: ()
     12(abcde(fsh)xyz(foo(bar))lmno)89
  0: (abcde(fsh)xyz(foo(bar))lmno)
-    *** Failers
-No match
+\= Expect no match
     abcd
 No match
     abcd)
@@ -1684,11 +1619,12 @@
     (abcd
 No match
 
-/\(  ( (?>[^()]+) | (?R) )* \) /Ixg
+/\(  ( (?>[^()]+) | (?R) )* \) /Igx
 Capturing subpattern count = 1
 Options: extended
-First char = '('
-Need char = ')'
+First code unit = '('
+Last code unit = ')'
+Subject length lower bound = 2
     (ab(xy)cd)pqr
  0: (ab(xy)cd)
  1: cd
@@ -1701,8 +1637,9 @@
 /\(  (?: (?>[^()]+) | (?R) ) \) /Ix
 Capturing subpattern count = 0
 Options: extended
-First char = '('
-Need char = ')'
+First code unit = '('
+Last code unit = ')'
+Subject length lower bound = 3
     (abcd)
  0: (abcd)
     (ab(xy)cd)
@@ -1711,16 +1648,16 @@
  0: (c)
     ((ab))
  0: ((ab))
-    *** Failers
-No match
+\= Expect no match
     ()
 No match
 
 /\(  (?: (?>[^()]+) | (?R) )? \) /Ix
 Capturing subpattern count = 0
 Options: extended
-First char = '('
-Need char = ')'
+First code unit = '('
+Last code unit = ')'
+Subject length lower bound = 2
     ()
  0: ()
     12(abcde(fsh)xyz(foo(bar))lmno)89
@@ -1729,8 +1666,9 @@
 /\(  ( (?>[^()]+) | (?R) )* \) /Ix
 Capturing subpattern count = 1
 Options: extended
-First char = '('
-Need char = ')'
+First code unit = '('
+Last code unit = ')'
+Subject length lower bound = 2
     (ab(xy)cd)
  0: (ab(xy)cd)
  1: cd
@@ -1738,8 +1676,9 @@
 /\( ( ( (?>[^()]+) | (?R) )* ) \) /Ix
 Capturing subpattern count = 2
 Options: extended
-First char = '('
-Need char = ')'
+First code unit = '('
+Last code unit = ')'
+Subject length lower bound = 2
     (ab(xy)cd)
  0: (ab(xy)cd)
  1: ab(xy)cd
@@ -1748,8 +1687,9 @@
 /\( (123)? ( ( (?>[^()]+) | (?R) )* ) \) /Ix
 Capturing subpattern count = 3
 Options: extended
-First char = '('
-Need char = ')'
+First code unit = '('
+Last code unit = ')'
+Subject length lower bound = 2
     (ab(xy)cd)
  0: (ab(xy)cd)
  1: <unset>
@@ -1764,8 +1704,9 @@
 /\( ( (123)? ( (?>[^()]+) | (?R) )* ) \) /Ix
 Capturing subpattern count = 3
 Options: extended
-First char = '('
-Need char = ')'
+First code unit = '('
+Last code unit = ')'
+Subject length lower bound = 2
     (ab(xy)cd)
  0: (ab(xy)cd)
  1: ab(xy)cd
@@ -1780,8 +1721,9 @@
 /\( (((((((((( ( (?>[^()]+) | (?R) )* )))))))))) \) /Ix
 Capturing subpattern count = 11
 Options: extended
-First char = '('
-Need char = ')'
+First code unit = '('
+Last code unit = ')'
+Subject length lower bound = 2
     (ab(xy)cd)
  0: (ab(xy)cd)
  1: ab(xy)cd
@@ -1799,8 +1741,9 @@
 /\( ( ( (?>[^()<>]+) | ((?>[^()]+)) | (?R) )* ) \) /Ix
 Capturing subpattern count = 3
 Options: extended
-First char = '('
-Need char = ')'
+First code unit = '('
+Last code unit = ')'
+Subject length lower bound = 2
     (abcd(xyz<p>qrs)123)
  0: (abcd(xyz<p>qrs)123)
  1: abcd(xyz<p>qrs)123
@@ -1809,8 +1752,9 @@
 /\( ( ( (?>[^()]+) | ((?R)) )* ) \) /Ix
 Capturing subpattern count = 3
 Options: extended
-First char = '('
-Need char = ')'
+First code unit = '('
+Last code unit = ')'
+Subject length lower bound = 2
     (ab(cd)ef)
  0: (ab(cd)ef)
  1: ab(cd)ef
@@ -1822,7 +1766,7 @@
  2: ij
  3: (cd(ef)gh)
 
-/^[[:alnum:]]/DZ
+/^[[:alnum:]]/IB
 ------------------------------------------------------------------
         Bra
         ^
@@ -1831,11 +1775,11 @@
         End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
-Options: anchored
-No first char
-No need char
+Compile options: <none>
+Overall options: anchored
+Subject length lower bound = 1
 
-/^[[:^alnum:]]/DZ
+/^[[:^alnum:]]/IB
 ------------------------------------------------------------------
         Bra
         ^
@@ -1844,11 +1788,11 @@
         End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
-Options: anchored
-No first char
-No need char
+Compile options: <none>
+Overall options: anchored
+Subject length lower bound = 1
 
-/^[[:alpha:]]/DZ
+/^[[:alpha:]]/IB
 ------------------------------------------------------------------
         Bra
         ^
@@ -1857,11 +1801,11 @@
         End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
-Options: anchored
-No first char
-No need char
+Compile options: <none>
+Overall options: anchored
+Subject length lower bound = 1
 
-/^[[:^alpha:]]/DZ
+/^[[:^alpha:]]/IB
 ------------------------------------------------------------------
         Bra
         ^
@@ -1870,20 +1814,17 @@
         End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
-Options: anchored
-No first char
-No need char
-
-/[_[:alpha:]]/IS
-Capturing subpattern count = 0
-No options
-No first char
-No need char
+Compile options: <none>
+Overall options: anchored
 Subject length lower bound = 1
-Starting chars: 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 
 
-/^[[:ascii:]]/DZ
+/[_[:alpha:]]/I
+Capturing subpattern count = 0
+Starting code units: 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 
+Subject length lower bound = 1
+
+/^[[:ascii:]]/IB
 ------------------------------------------------------------------
         Bra
         ^
@@ -1892,11 +1833,11 @@
         End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
-Options: anchored
-No first char
-No need char
+Compile options: <none>
+Overall options: anchored
+Subject length lower bound = 1
 
-/^[[:^ascii:]]/DZ
+/^[[:^ascii:]]/IB
 ------------------------------------------------------------------
         Bra
         ^
@@ -1905,11 +1846,11 @@
         End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
-Options: anchored
-No first char
-No need char
+Compile options: <none>
+Overall options: anchored
+Subject length lower bound = 1
 
-/^[[:blank:]]/DZ
+/^[[:blank:]]/IB
 ------------------------------------------------------------------
         Bra
         ^
@@ -1918,11 +1859,11 @@
         End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
-Options: anchored
-No first char
-No need char
+Compile options: <none>
+Overall options: anchored
+Subject length lower bound = 1
 
-/^[[:^blank:]]/DZ
+/^[[:^blank:]]/IB
 ------------------------------------------------------------------
         Bra
         ^
@@ -1931,20 +1872,17 @@
         End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
-Options: anchored
-No first char
-No need char
+Compile options: <none>
+Overall options: anchored
+Subject length lower bound = 1
 
-/[\n\x0b\x0c\x0d[:blank:]]/IS
+/[\n\x0b\x0c\x0d[:blank:]]/I
 Capturing subpattern count = 0
 Contains explicit CR or LF match
-No options
-No first char
-No need char
+Starting code units: \x09 \x0a \x0b \x0c \x0d \x20 
 Subject length lower bound = 1
-Starting chars: \x09 \x0a \x0b \x0c \x0d \x20 
 
-/^[[:cntrl:]]/DZ
+/^[[:cntrl:]]/IB
 ------------------------------------------------------------------
         Bra
         ^
@@ -1953,11 +1891,11 @@
         End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
-Options: anchored
-No first char
-No need char
+Compile options: <none>
+Overall options: anchored
+Subject length lower bound = 1
 
-/^[[:digit:]]/DZ
+/^[[:digit:]]/IB
 ------------------------------------------------------------------
         Bra
         ^
@@ -1966,11 +1904,11 @@
         End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
-Options: anchored
-No first char
-No need char
+Compile options: <none>
+Overall options: anchored
+Subject length lower bound = 1
 
-/^[[:graph:]]/DZ
+/^[[:graph:]]/IB
 ------------------------------------------------------------------
         Bra
         ^
@@ -1979,11 +1917,11 @@
         End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
-Options: anchored
-No first char
-No need char
+Compile options: <none>
+Overall options: anchored
+Subject length lower bound = 1
 
-/^[[:lower:]]/DZ
+/^[[:lower:]]/IB
 ------------------------------------------------------------------
         Bra
         ^
@@ -1992,11 +1930,11 @@
         End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
-Options: anchored
-No first char
-No need char
+Compile options: <none>
+Overall options: anchored
+Subject length lower bound = 1
 
-/^[[:print:]]/DZ
+/^[[:print:]]/IB
 ------------------------------------------------------------------
         Bra
         ^
@@ -2005,11 +1943,11 @@
         End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
-Options: anchored
-No first char
-No need char
+Compile options: <none>
+Overall options: anchored
+Subject length lower bound = 1
 
-/^[[:punct:]]/DZ
+/^[[:punct:]]/IB
 ------------------------------------------------------------------
         Bra
         ^
@@ -2018,11 +1956,11 @@
         End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
-Options: anchored
-No first char
-No need char
+Compile options: <none>
+Overall options: anchored
+Subject length lower bound = 1
 
-/^[[:space:]]/DZ
+/^[[:space:]]/IB
 ------------------------------------------------------------------
         Bra
         ^
@@ -2031,11 +1969,11 @@
         End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
-Options: anchored
-No first char
-No need char
+Compile options: <none>
+Overall options: anchored
+Subject length lower bound = 1
 
-/^[[:upper:]]/DZ
+/^[[:upper:]]/IB
 ------------------------------------------------------------------
         Bra
         ^
@@ -2044,11 +1982,11 @@
         End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
-Options: anchored
-No first char
-No need char
+Compile options: <none>
+Overall options: anchored
+Subject length lower bound = 1
 
-/^[[:xdigit:]]/DZ
+/^[[:xdigit:]]/IB
 ------------------------------------------------------------------
         Bra
         ^
@@ -2057,11 +1995,11 @@
         End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
-Options: anchored
-No first char
-No need char
+Compile options: <none>
+Overall options: anchored
+Subject length lower bound = 1
 
-/^[[:word:]]/DZ
+/^[[:word:]]/IB
 ------------------------------------------------------------------
         Bra
         ^
@@ -2070,11 +2008,11 @@
         End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
-Options: anchored
-No first char
-No need char
+Compile options: <none>
+Overall options: anchored
+Subject length lower bound = 1
 
-/^[[:^cntrl:]]/DZ
+/^[[:^cntrl:]]/IB
 ------------------------------------------------------------------
         Bra
         ^
@@ -2083,11 +2021,11 @@
         End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
-Options: anchored
-No first char
-No need char
+Compile options: <none>
+Overall options: anchored
+Subject length lower bound = 1
 
-/^[12[:^digit:]]/DZ
+/^[12[:^digit:]]/IB
 ------------------------------------------------------------------
         Bra
         ^
@@ -2096,11 +2034,11 @@
         End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
-Options: anchored
-No first char
-No need char
+Compile options: <none>
+Overall options: anchored
+Subject length lower bound = 1
 
-/^[[:^blank:]]/DZ
+/^[[:^blank:]]/IB
 ------------------------------------------------------------------
         Bra
         ^
@@ -2109,11 +2047,11 @@
         End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
-Options: anchored
-No first char
-No need char
+Compile options: <none>
+Overall options: anchored
+Subject length lower bound = 1
 
-/[01[:alpha:]%]/DZ
+/[01[:alpha:]%]/IB
 ------------------------------------------------------------------
         Bra
         [%01A-Za-z]
@@ -2121,24 +2059,25 @@
         End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
-No options
-No first char
-No need char
+Starting code units: % 0 1 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 
+Subject length lower bound = 1
 
 /[[.ch.]]/I
-Failed: POSIX collating elements are not supported at offset 1
+Failed: error 113 at offset 1: POSIX collating elements are not supported
 
 /[[=ch=]]/I
-Failed: POSIX collating elements are not supported at offset 1
+Failed: error 113 at offset 1: POSIX collating elements are not supported
 
 /[[:rhubarb:]]/I
-Failed: unknown POSIX class name at offset 3
+Failed: error 130 at offset 3: unknown POSIX class name
 
 /[[:upper:]]/Ii
 Capturing subpattern count = 0
 Options: caseless
-No first char
-No need char
+Starting code units: 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 
+Subject length lower bound = 1
     A
  0: A
     a
@@ -2147,8 +2086,9 @@
 /[[:lower:]]/Ii
 Capturing subpattern count = 0
 Options: caseless
-No first char
-No need char
+Starting code units: 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 
+Subject length lower bound = 1
     A
  0: A
     a
@@ -2157,41 +2097,34 @@
 /((?-i)[[:lower:]])[[:lower:]]/Ii
 Capturing subpattern count = 1
 Options: caseless
-No first char
-No need char
+Starting code units: 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 
+Subject length lower bound = 2
     ab
  0: ab
  1: a
     aB
  0: aB
  1: a
-    *** Failers
- 0: ai
- 1: a
+\= Expect no match
     Ab
 No match
     AB
 No match
 
 /[\200-\110]/I
-Failed: range out of order in character class at offset 9
+Failed: error 108 at offset 9: range out of order in character class
 
 /^(?(0)f|b)oo/I
-Failed: invalid condition (?(0) at offset 6
+Failed: error 135 at offset 6: invalid condition (?(0)
 
-/This one's here because of the large output vector needed/I
-Capturing subpattern count = 0
-No options
-First char = 'T'
-Need char = 'd'
+# This one's here because of the large output vector needed
 
 /(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\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)/I
 Capturing subpattern count = 271
 Max back reference = 270
-No options
-No first char
-No need char
-    \O900 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 ABC ABC
+Starting code units: 0 1 2 3 4 5 6 7 8 9 
+Subject length lower bound = 272
+     1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 ABC ABC\=ovector=300
  0: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 ABC ABC
  1: 1 
  2: 2 
@@ -2465,17 +2398,13 @@
 270: ABC
 271: ABC
 
-/This one's here because Perl does this differently and PCRE can't at present/I
-Capturing subpattern count = 0
-No options
-First char = 'T'
-Need char = 't'
+# This one's here because Perl does this differently and PCRE2 can't at present
 
 /(main(O)?)+/I
 Capturing subpattern count = 2
-No options
-First char = 'm'
-Need char = 'n'
+First code unit = 'm'
+Last code unit = 'n'
+Subject length lower bound = 4
     mainmain
  0: mainmain
  1: main
@@ -2484,17 +2413,13 @@
  1: main
  2: O
 
-/These are all cases where Perl does it differently (nested captures)/I
-Capturing subpattern count = 1
-No options
-First char = 'T'
-Need char = 's'
+# These are all cases where Perl does it differently (nested captures)
 
 /^(a(b)?)+$/I
 Capturing subpattern count = 2
-Options: anchored
-No first char
-No need char
+Compile options: <none>
+Overall options: anchored
+Subject length lower bound = 1
     aba
  0: aba
  1: a
@@ -2502,9 +2427,9 @@
 
 /^(aa(bb)?)+$/I
 Capturing subpattern count = 2
-Options: anchored
-No first char
-No need char
+Compile options: <none>
+Overall options: anchored
+Subject length lower bound = 2
     aabbaa
  0: aabbaa
  1: aa
@@ -2512,9 +2437,9 @@
 
 /^(aa|aa(bb))+$/I
 Capturing subpattern count = 2
-Options: anchored
-No first char
-No need char
+Compile options: <none>
+Overall options: anchored
+Subject length lower bound = 2
     aabbaa
  0: aabbaa
  1: aa
@@ -2522,9 +2447,9 @@
 
 /^(aa(bb)??)+$/I
 Capturing subpattern count = 2
-Options: anchored
-No first char
-No need char
+Compile options: <none>
+Overall options: anchored
+Subject length lower bound = 2
     aabbaa
  0: aabbaa
  1: aa
@@ -2532,18 +2457,18 @@
 
 /^(?:aa(bb)?)+$/I
 Capturing subpattern count = 1
-Options: anchored
-No first char
-No need char
+Compile options: <none>
+Overall options: anchored
+Subject length lower bound = 2
     aabbaa
  0: aabbaa
  1: bb
 
 /^(aa(b(b))?)+$/I
 Capturing subpattern count = 3
-Options: anchored
-No first char
-No need char
+Compile options: <none>
+Overall options: anchored
+Subject length lower bound = 2
     aabbaa
  0: aabbaa
  1: aa
@@ -2552,9 +2477,9 @@
 
 /^(?:aa(b(b))?)+$/I
 Capturing subpattern count = 2
-Options: anchored
-No first char
-No need char
+Compile options: <none>
+Overall options: anchored
+Subject length lower bound = 2
     aabbaa
  0: aabbaa
  1: bb
@@ -2562,54 +2487,54 @@
 
 /^(?:aa(b(?:b))?)+$/I
 Capturing subpattern count = 1
-Options: anchored
-No first char
-No need char
+Compile options: <none>
+Overall options: anchored
+Subject length lower bound = 2
     aabbaa
  0: aabbaa
  1: bb
 
 /^(?:aa(bb(?:b))?)+$/I
 Capturing subpattern count = 1
-Options: anchored
-No first char
-No need char
+Compile options: <none>
+Overall options: anchored
+Subject length lower bound = 2
     aabbbaa
  0: aabbbaa
  1: bbb
 
 /^(?:aa(b(?:bb))?)+$/I
 Capturing subpattern count = 1
-Options: anchored
-No first char
-No need char
+Compile options: <none>
+Overall options: anchored
+Subject length lower bound = 2
     aabbbaa
  0: aabbbaa
  1: bbb
 
 /^(?:aa(?:b(b))?)+$/I
 Capturing subpattern count = 1
-Options: anchored
-No first char
-No need char
+Compile options: <none>
+Overall options: anchored
+Subject length lower bound = 2
     aabbaa
  0: aabbaa
  1: b
 
 /^(?:aa(?:b(bb))?)+$/I
 Capturing subpattern count = 1
-Options: anchored
-No first char
-No need char
+Compile options: <none>
+Overall options: anchored
+Subject length lower bound = 2
     aabbbaa
  0: aabbbaa
  1: bb
 
 /^(aa(b(bb))?)+$/I
 Capturing subpattern count = 3
-Options: anchored
-No first char
-No need char
+Compile options: <none>
+Overall options: anchored
+Subject length lower bound = 2
     aabbbaa
  0: aabbbaa
  1: aa
@@ -2618,22 +2543,18 @@
 
 /^(aa(bb(bb))?)+$/I
 Capturing subpattern count = 3
-Options: anchored
-No first char
-No need char
+Compile options: <none>
+Overall options: anchored
+Subject length lower bound = 2
     aabbbbaa
  0: aabbbbaa
  1: aa
  2: bbbb
  3: bb
 
-/--------------------------------------------------------------------/I
-Capturing subpattern count = 0
-No options
-First char = '-'
-Need char = '-'
+# ----------------
 
-/#/IxDZ
+/#/IBx
 ------------------------------------------------------------------
         Bra
         Ket
@@ -2642,10 +2563,9 @@
 Capturing subpattern count = 0
 May match empty string
 Options: extended
-No first char
-No need char
+Subject length lower bound = 0
 
-/a#/IxDZ
+/a#/IBx
 ------------------------------------------------------------------
         Bra
         a
@@ -2654,10 +2574,10 @@
 ------------------------------------------------------------------
 Capturing subpattern count = 0
 Options: extended
-First char = 'a'
-No need char
+First code unit = 'a'
+Subject length lower bound = 1
 
-/[\s]/DZ
+/[\s]/IB
 ------------------------------------------------------------------
         Bra
         [\x09-\x0d ]
@@ -2665,11 +2585,10 @@
         End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
-No options
-No first char
-No need char
+Starting code units: \x09 \x0a \x0b \x0c \x0d \x20 
+Subject length lower bound = 1
 
-/[\S]/DZ
+/[\S]/IB
 ------------------------------------------------------------------
         Bra
         [\x00-\x08\x0e-\x1f!-\xff] (neg)
@@ -2677,11 +2596,23 @@
         End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
-No options
-No first char
-No need char
+Starting code units: \x00 \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x0e \x0f 
+  \x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17 \x18 \x19 \x1a \x1b \x1c \x1d \x1e 
+  \x1f ! " # $ % & ' ( ) * + , - . / 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 { | } ~ \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 
+Subject length lower bound = 1
 
-/a(?i)b/DZ
+/a(?i)b/IB
 ------------------------------------------------------------------
         Bra
         a
@@ -2690,19 +2621,18 @@
         End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
-No options
-First char = 'a'
-Need char = 'b' (caseless)
+First code unit = 'a'
+Last code unit = 'b' (caseless)
+Subject length lower bound = 2
     ab
  0: ab
     aB
  0: aB
-    *** Failers
-No match
+\= Expect no match
     AB
 No match
 
-/(a(?i)b)/DZ
+/(a(?i)b)/IB
 ------------------------------------------------------------------
         Bra
         CBra 1
@@ -2713,21 +2643,20 @@
         End
 ------------------------------------------------------------------
 Capturing subpattern count = 1
-No options
-First char = 'a'
-Need char = 'b' (caseless)
+First code unit = 'a'
+Last code unit = 'b' (caseless)
+Subject length lower bound = 2
     ab
  0: ab
  1: ab
     aB
  0: aB
  1: aB
-    *** Failers
-No match
+\= Expect no match
     AB
 No match
 
-/   (?i)abc/IxDZ
+/   (?i)abc/IBx
 ------------------------------------------------------------------
         Bra
      /i abc
@@ -2735,12 +2664,13 @@
         End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
-Options: caseless extended
-First char = 'a' (caseless)
-Need char = 'c' (caseless)
+Options: extended
+First code unit = 'a' (caseless)
+Last code unit = 'c' (caseless)
+Subject length lower bound = 3
 
 /#this is a comment
-  (?i)abc/IxDZ
+  (?i)abc/IBx
 ------------------------------------------------------------------
         Bra
      /i abc
@@ -2748,11 +2678,12 @@
         End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
-Options: caseless extended
-First char = 'a' (caseless)
-Need char = 'c' (caseless)
+Options: extended
+First code unit = 'a' (caseless)
+Last code unit = 'c' (caseless)
+Subject length lower bound = 3
 
-/123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890/DZ
+/123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890/IB
 ------------------------------------------------------------------
         Bra
         123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890
@@ -2760,11 +2691,11 @@
         End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
-No options
-First char = '1'
-Need char = '0'
+First code unit = '1'
+Last code unit = '0'
+Subject length lower bound = 300
 
-/\Q123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890/DZ
+/\Q123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890/IB
 ------------------------------------------------------------------
         Bra
         123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890
@@ -2772,11 +2703,11 @@
         End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
-No options
-First char = '1'
-Need char = '0'
+First code unit = '1'
+Last code unit = '0'
+Subject length lower bound = 300
 
-/\Q\E/DZ
+/\Q\E/IB
 ------------------------------------------------------------------
         Bra
         Ket
@@ -2784,13 +2715,11 @@
 ------------------------------------------------------------------
 Capturing subpattern count = 0
 May match empty string
-No options
-No first char
-No need char
+Subject length lower bound = 0
     \
  0: 
 
-/\Q\Ex/DZ
+/\Q\Ex/IB
 ------------------------------------------------------------------
         Bra
         x
@@ -2798,11 +2727,10 @@
         End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
-No options
-First char = 'x'
-No need char
+First code unit = 'x'
+Subject length lower bound = 1
 
-/ \Q\E/DZ
+/ \Q\E/IB
 ------------------------------------------------------------------
         Bra
          
@@ -2810,11 +2738,10 @@
         End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
-No options
-First char = ' '
-No need char
+First code unit = ' '
+Subject length lower bound = 1
 
-/a\Q\E/DZ
+/a\Q\E/IB
 ------------------------------------------------------------------
         Bra
         a
@@ -2822,9 +2749,8 @@
         End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
-No options
-First char = 'a'
-No need char
+First code unit = 'a'
+Subject length lower bound = 1
   abc
  0: a
   bca
@@ -2832,7 +2758,7 @@
   bac
  0: a
 
-/a\Q\Eb/DZ
+/a\Q\Eb/IB
 ------------------------------------------------------------------
         Bra
         ab
@@ -2840,13 +2766,13 @@
         End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
-No options
-First char = 'a'
-Need char = 'b'
+First code unit = 'a'
+Last code unit = 'b'
+Subject length lower bound = 2
   abc
  0: ab
 
-/\Q\Eabc/DZ
+/\Q\Eabc/IB
 ------------------------------------------------------------------
         Bra
         abc
@@ -2854,11 +2780,11 @@
         End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
-No options
-First char = 'a'
-Need char = 'c'
+First code unit = 'a'
+Last code unit = 'c'
+Subject length lower bound = 3
 
-/x*+\w/DZ
+/x*+\w/IB
 ------------------------------------------------------------------
         Bra
         x*+
@@ -2867,15 +2793,14 @@
         End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
-No options
-No first char
-No need char
-    *** Failers
- 0: F
+Starting code units: 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 
+Subject length lower bound = 1
+\= Expect no match
     xxxxx
 No match
 
-/x?+/DZ
+/x?+/IB
 ------------------------------------------------------------------
         Bra
         x?+
@@ -2884,11 +2809,9 @@
 ------------------------------------------------------------------
 Capturing subpattern count = 0
 May match empty string
-No options
-No first char
-No need char
+Subject length lower bound = 0
 
-/x++/DZ
+/x++/IB
 ------------------------------------------------------------------
         Bra
         x++
@@ -2896,11 +2819,10 @@
         End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
-No options
-First char = 'x'
-No need char
+First code unit = 'x'
+Subject length lower bound = 1
 
-/x{1,3}+/BZO
+/x{1,3}+/B,no_auto_possess
 ------------------------------------------------------------------
         Bra
         x
@@ -2909,7 +2831,7 @@
         End
 ------------------------------------------------------------------
 
-/x{1,3}+/BZOi
+/x{1,3}+/Bi,no_auto_possess
 ------------------------------------------------------------------
         Bra
      /i x
@@ -2918,7 +2840,7 @@
         End
 ------------------------------------------------------------------
 
-/[^x]{1,3}+/BZO
+/[^x]{1,3}+/B,no_auto_possess
 ------------------------------------------------------------------
         Bra
         [^x]
@@ -2927,7 +2849,7 @@
         End
 ------------------------------------------------------------------
 
-/[^x]{1,3}+/BZOi
+/[^x]{1,3}+/Bi,no_auto_possess
 ------------------------------------------------------------------
         Bra
      /i [^x]
@@ -2936,7 +2858,7 @@
         End
 ------------------------------------------------------------------
 
-/(x)*+/DZ
+/(x)*+/IB
 ------------------------------------------------------------------
         Bra
         Braposzero
@@ -2948,90 +2870,96 @@
 ------------------------------------------------------------------
 Capturing subpattern count = 1
 May match empty string
-No options
-No first char
-No need char
+Subject length lower bound = 0
 
 /^(\w++|\s++)*$/I
 Capturing subpattern count = 1
 May match empty string
-Options: anchored
-No first char
-No need char
+Compile options: <none>
+Overall options: anchored
+Subject length lower bound = 0
     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
  1: party
-    *** Failers
-No match
+\= Expect no match
     this is not a line with only words and spaces!
 No match
 
 /(\d++)(\w)/I
 Capturing subpattern count = 2
-No options
-No first char
-No need char
+Starting code units: 0 1 2 3 4 5 6 7 8 9 
+Subject length lower bound = 2
     12345a
  0: 12345a
  1: 12345
  2: a
-    *** Failers
-No match
+\= Expect no match
     12345+
 No match
 
 /a++b/I
 Capturing subpattern count = 0
-No options
-First char = 'a'
-Need char = 'b'
+First code unit = 'a'
+Last code unit = 'b'
+Subject length lower bound = 2
     aaab
  0: aaab
 
 /(a++b)/I
 Capturing subpattern count = 1
-No options
-First char = 'a'
-Need char = 'b'
+First code unit = 'a'
+Last code unit = 'b'
+Subject length lower bound = 2
     aaab
  0: aaab
  1: aaab
 
 /(a++)b/I
 Capturing subpattern count = 1
-No options
-First char = 'a'
-Need char = 'b'
+First code unit = 'a'
+Last code unit = 'b'
+Subject length lower bound = 2
     aaab
  0: aaab
  1: aaa
 
 /([^()]++|\([^()]*\))+/I
 Capturing subpattern count = 1
-No options
-No first char
-No need char
+Starting code units: \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 
+  [ \ ] ^ _ ` 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 { | } ~ \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 
+Subject length lower bound = 1
     ((abc(ade)ufh()()x
  0: abc(ade)ufh()()x
  1: x
 
 /\(([^()]++|\([^()]+\))+\)/I
 Capturing subpattern count = 1
-No options
-First char = '('
-Need char = ')'
+First code unit = '('
+Last code unit = ')'
+Subject length lower bound = 3
     (abc)
  0: (abc)
  1: abc
     (abc(def)xyz)
  0: (abc(def)xyz)
  1: xyz
-    *** Failers
-No match
+\= Expect no match
     ((()aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
 No match
 
-/(abc){1,3}+/DZ
+/(abc){1,3}+/IB
 ------------------------------------------------------------------
         Bra
         Once
@@ -3053,23 +2981,23 @@
         End
 ------------------------------------------------------------------
 Capturing subpattern count = 1
-No options
-First char = 'a'
-Need char = 'c'
+First code unit = 'a'
+Last code unit = 'c'
+Subject length lower bound = 3
 
 /a+?+/I
-Failed: nothing to repeat at offset 3
+Failed: error 109 at offset 3: quantifier does not follow a repeatable item
 
 /a{2,3}?+b/I
-Failed: nothing to repeat at offset 7
+Failed: error 109 at offset 7: quantifier does not follow a repeatable item
 
 /(?U)a+?+/I
-Failed: nothing to repeat at offset 7
+Failed: error 109 at offset 7: quantifier does not follow a repeatable item
 
-/a{2,3}?+b/IU
-Failed: nothing to repeat at offset 7
+/a{2,3}?+b/I,ungreedy
+Failed: error 109 at offset 7: quantifier does not follow a repeatable item
 
-/x(?U)a++b/DZ
+/x(?U)a++b/IB
 ------------------------------------------------------------------
         Bra
         x
@@ -3079,13 +3007,13 @@
         End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
-No options
-First char = 'x'
-Need char = 'b'
+First code unit = 'x'
+Last code unit = 'b'
+Subject length lower bound = 3
     xaaaab
  0: xaaaab
 
-/(?U)xa++b/DZ
+/(?U)xa++b/IB
 ------------------------------------------------------------------
         Bra
         x
@@ -3095,13 +3023,13 @@
         End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
-Options: ungreedy
-First char = 'x'
-Need char = 'b'
+First code unit = 'x'
+Last code unit = 'b'
+Subject length lower bound = 3
     xaaaab
  0: xaaaab
 
-/^((a+)(?U)([ab]+)(?-U)([bc]+)(\w*))/DZ
+/^((a+)(?U)([ab]+)(?-U)([bc]+)(\w*))/IB
 ------------------------------------------------------------------
         Bra
         ^
@@ -3123,11 +3051,11 @@
         End
 ------------------------------------------------------------------
 Capturing subpattern count = 5
-Options: anchored
-No first char
-No need char
+Compile options: <none>
+Overall options: anchored
+Subject length lower bound = 3
 
-/^x(?U)a+b/DZ
+/^x(?U)a+b/IB
 ------------------------------------------------------------------
         Bra
         ^
@@ -3138,11 +3066,12 @@
         End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
-Options: anchored
-No first char
-Need char = 'b'
+Compile options: <none>
+Overall options: anchored
+Last code unit = 'b'
+Subject length lower bound = 3
 
-/^x(?U)(a+)b/DZ
+/^x(?U)(a+)b/IB
 ------------------------------------------------------------------
         Bra
         ^
@@ -3155,48 +3084,49 @@
         End
 ------------------------------------------------------------------
 Capturing subpattern count = 1
-Options: anchored
-No first char
-Need char = 'b'
+Compile options: <none>
+Overall options: anchored
+Last code unit = 'b'
+Subject length lower bound = 3
 
 /[.x.]/I
-Failed: POSIX collating elements are not supported at offset 0
+Failed: error 113 at offset 0: POSIX collating elements are not supported
 
 /[=x=]/I
-Failed: POSIX collating elements are not supported at offset 0
+Failed: error 113 at offset 0: POSIX collating elements are not supported
 
 /[:x:]/I
-Failed: POSIX named classes are supported only within a class at offset 0
+Failed: error 112 at offset 0: POSIX named classes are supported only within a class
 
 /\l/I
-Failed: PCRE does not support \L, \l, \N{name}, \U, or \u at offset 1
+Failed: error 137 at offset 1: PCRE does not support \L, \l, \N{name}, \U, or \u
 
 /\L/I
-Failed: PCRE does not support \L, \l, \N{name}, \U, or \u at offset 1
+Failed: error 137 at offset 1: PCRE does not support \L, \l, \N{name}, \U, or \u
 
 /\N{name}/I
-Failed: PCRE does not support \L, \l, \N{name}, \U, or \u at offset 1
+Failed: error 137 at offset 1: PCRE does not support \L, \l, \N{name}, \U, or \u
 
 /\u/I
-Failed: PCRE does not support \L, \l, \N{name}, \U, or \u at offset 1
+Failed: error 137 at offset 1: PCRE does not support \L, \l, \N{name}, \U, or \u
 
 /\U/I
-Failed: PCRE does not support \L, \l, \N{name}, \U, or \u at offset 1
+Failed: error 137 at offset 1: PCRE does not support \L, \l, \N{name}, \U, or \u
 
-/a{1,3}b/U
+/a{1,3}b/ungreedy
     ab
  0: ab
 
 /[/I
-Failed: missing terminating ] for character class at offset 1
+Failed: error 106 at offset 1: missing terminating ] for character class
 
 /[a-/I
-Failed: missing terminating ] for character class at offset 3
+Failed: error 106 at offset 3: missing terminating ] for character class
 
 /[[:space:]/I
-Failed: missing terminating ] for character class at offset 10
+Failed: error 106 at offset 10: missing terminating ] for character class
 
-/[\s]/IDZ
+/[\s]/IB
 ------------------------------------------------------------------
         Bra
         [\x09-\x0d ]
@@ -3204,11 +3134,10 @@
         End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
-No options
-No first char
-No need char
+Starting code units: \x09 \x0a \x0b \x0c \x0d \x20 
+Subject length lower bound = 1
 
-/[[:space:]]/IDZ
+/[[:space:]]/IB
 ------------------------------------------------------------------
         Bra
         [\x09-\x0d ]
@@ -3216,11 +3145,10 @@
         End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
-No options
-No first char
-No need char
+Starting code units: \x09 \x0a \x0b \x0c \x0d \x20 
+Subject length lower bound = 1
 
-/[[:space:]abcde]/IDZ
+/[[:space:]abcde]/IB
 ------------------------------------------------------------------
         Bra
         [\x09-\x0d a-e]
@@ -3228,15 +3156,15 @@
         End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
-No options
-No first char
-No need char
+Starting code units: \x09 \x0a \x0b \x0c \x0d \x20 a b c d e 
+Subject length lower bound = 1
 
 /< (?: (?(R) \d++  | [^<>]*+) | (?R)) * >/Ix
 Capturing subpattern count = 0
 Options: extended
-First char = '<'
-Need char = '>'
+First code unit = '<'
+Last code unit = '>'
+Subject length lower bound = 2
     <>
  0: <>
     <abcd>
@@ -3249,12 +3177,11 @@
  0: <abc<>def>
     <abc<>
  0: <>
-    *** Failers
-No match
+\= Expect no match
     <abc
 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|IDZ
+/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/IB
 ------------------------------------------------------------------
         Bra
         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
@@ -3264,11 +3191,11 @@
 ------------------------------------------------------------------
 Capturing subpattern count = 0
 Max lookbehind = 1
-No options
-First char = '8'
-Need char = 'X'
+First code unit = '8'
+Last code unit = 'X'
+Subject length lower bound = 409
 
-|\$\<\.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|IDZ
+/\$\<\.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/IB
 ------------------------------------------------------------------
         Bra
         $<.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
@@ -3278,49 +3205,43 @@
 ------------------------------------------------------------------
 Capturing subpattern count = 0
 Max lookbehind = 1
-No options
-First char = '$'
-Need char = 'X'
+First code unit = '$'
+Last code unit = 'X'
+Subject length lower bound = 404
 
 /(.*)\d+\1/I
 Capturing subpattern count = 1
 Max back reference = 1
-No options
-No first char
-No need char
+Subject length lower bound = 1
 
 /(.*)\d+/I
 Capturing subpattern count = 1
-No options
-First char at start or follows newline
-No need char
+First code unit at start or follows newline
+Subject length lower bound = 1
 
 /(.*)\d+\1/Is
 Capturing subpattern count = 1
 Max back reference = 1
 Options: dotall
-No first char
-No need char
+Subject length lower bound = 1
 
 /(.*)\d+/Is
 Capturing subpattern count = 1
-Options: anchored dotall
-No first char
-No need char
+Compile options: dotall
+Overall options: anchored dotall
+Subject length lower bound = 1
 
 /(.*(xyz))\d+\2/I
 Capturing subpattern count = 2
 Max back reference = 2
-No options
-First char at start or follows newline
-Need char = 'z'
+First code unit at start or follows newline
+Last code unit = 'z'
+Subject length lower bound = 7
 
 /((.*))\d+\1/I
 Capturing subpattern count = 2
 Max back reference = 1
-No options
-No first char
-No need char
+Subject length lower bound = 1
     abc123bc
  0: bc123bc
  1: bc
@@ -3328,194 +3249,176 @@
 
 /a[b]/I
 Capturing subpattern count = 0
-No options
-First char = 'a'
-Need char = 'b'
+First code unit = 'a'
+Last code unit = 'b'
+Subject length lower bound = 2
 
 /(?=a).*/I
 Capturing subpattern count = 0
 May match empty string
-No options
-First char = 'a'
-No need char
+First code unit = 'a'
+Subject length lower bound = 0
 
-/(?=abc).xyz/IiI
+/(?=abc).xyz/Ii
 Capturing subpattern count = 0
 Options: caseless
-First char = 'a' (caseless)
-Need char = 'z' (caseless)
+First code unit = 'a' (caseless)
+Last code unit = 'z' (caseless)
+Subject length lower bound = 4
 
 /(?=abc)(?i).xyz/I
 Capturing subpattern count = 0
-No options
-First char = 'a'
-Need char = 'z' (caseless)
+First code unit = 'a'
+Last code unit = 'z' (caseless)
+Subject length lower bound = 4
 
 /(?=a)(?=b)/I
 Capturing subpattern count = 0
 May match empty string
-No options
-First char = 'a'
-No need char
+First code unit = 'a'
+Subject length lower bound = 0
 
 /(?=.)a/I
 Capturing subpattern count = 0
-No options
-First char = 'a'
-No need char
+First code unit = 'a'
+Subject length lower bound = 1
 
 /((?=abcda)a)/I
 Capturing subpattern count = 1
-No options
-First char = 'a'
-Need char = 'a'
+First code unit = 'a'
+Last code unit = 'a'
+Subject length lower bound = 1
 
 /((?=abcda)ab)/I
 Capturing subpattern count = 1
-No options
-First char = 'a'
-Need char = 'b'
+First code unit = 'a'
+Last code unit = 'b'
+Subject length lower bound = 2
 
 /()a/I
 Capturing subpattern count = 1
-No options
-No first char
-Need char = 'a'
+First code unit = 'a'
+Subject length lower bound = 1
+
+/(?:(?=.)|(?<!x))a/I
+Capturing subpattern count = 0
+Max lookbehind = 1
+First code unit = 'a'
+Subject length lower bound = 1
 
 /(?(1)ab|ac)(.)/I
 Capturing subpattern count = 1
 Max back reference = 1
-No options
-First char = 'a'
-No need char
+First code unit = 'a'
+Subject length lower bound = 3
 
 /(?(1)abz|acz)(.)/I
 Capturing subpattern count = 1
 Max back reference = 1
-No options
-First char = 'a'
-Need char = 'z'
+First code unit = 'a'
+Last code unit = 'z'
+Subject length lower bound = 4
 
 /(?(1)abz)(.)/I
 Capturing subpattern count = 1
 Max back reference = 1
-No options
-No first char
-No need char
+Subject length lower bound = 1
 
 /(?(1)abz)(1)23/I
 Capturing subpattern count = 1
 Max back reference = 1
-No options
-No first char
-Need char = '3'
+Last code unit = '3'
+Subject length lower bound = 3
 
 /(a)+/I
 Capturing subpattern count = 1
-No options
-First char = 'a'
-No need char
+First code unit = 'a'
+Subject length lower bound = 1
 
 /(a){2,3}/I
 Capturing subpattern count = 1
-No options
-First char = 'a'
-Need char = 'a'
+First code unit = 'a'
+Last code unit = 'a'
+Subject length lower bound = 2
 
 /(a)*/I
 Capturing subpattern count = 1
 May match empty string
-No options
-No first char
-No need char
+Subject length lower bound = 0
 
 /[a]/I
 Capturing subpattern count = 0
-No options
-First char = 'a'
-No need char
+First code unit = 'a'
+Subject length lower bound = 1
 
 /[ab]/I
 Capturing subpattern count = 0
-No options
-No first char
-No need char
-
-/[ab]/IS
-Capturing subpattern count = 0
-No options
-No first char
-No need char
+Starting code units: a b 
 Subject length lower bound = 1
-Starting chars: a b 
+
+/[ab]/I
+Capturing subpattern count = 0
+Starting code units: a b 
+Subject length lower bound = 1
 
 /[^a]/I
 Capturing subpattern count = 0
-No options
-No first char
-No need char
+Subject length lower bound = 1
 
 /\d456/I
 Capturing subpattern count = 0
-No options
-No first char
-Need char = '6'
-
-/\d456/IS
-Capturing subpattern count = 0
-No options
-No first char
-Need char = '6'
+Starting code units: 0 1 2 3 4 5 6 7 8 9 
+Last code unit = '6'
 Subject length lower bound = 4
-Starting chars: 0 1 2 3 4 5 6 7 8 9 
+
+/\d456/I
+Capturing subpattern count = 0
+Starting code units: 0 1 2 3 4 5 6 7 8 9 
+Last code unit = '6'
+Subject length lower bound = 4
 
 /a^b/I
 Capturing subpattern count = 0
-No options
-First char = 'a'
-Need char = 'b'
+First code unit = 'a'
+Last code unit = 'b'
+Subject length lower bound = 2
 
 /^a/Im
 Capturing subpattern count = 0
 Options: multiline
-First char at start or follows newline
-Need char = 'a'
+First code unit at start or follows newline
+Last code unit = 'a'
+Subject length lower bound = 1
   abcde
  0: a
   xy\nabc
  0: a
-  *** Failers
-No match
+\= Expect no match
   xyabc
 No match
 
 /c|abc/I
 Capturing subpattern count = 0
-No options
-No first char
-Need char = 'c'
-
-/(?i)[ab]/IS
-Capturing subpattern count = 0
-Options: caseless
-No first char
-No need char
+Starting code units: a c 
+Last code unit = 'c'
 Subject length lower bound = 1
-Starting chars: A B a b 
 
-/[ab](?i)cd/IS
+/(?i)[ab]/I
 Capturing subpattern count = 0
-No options
-No first char
-Need char = 'd' (caseless)
+Starting code units: A B a b 
+Subject length lower bound = 1
+
+/[ab](?i)cd/I
+Capturing subpattern count = 0
+Starting code units: a b 
+Last code unit = 'd' (caseless)
 Subject length lower bound = 3
-Starting chars: a b 
 
 /abc(?C)def/I
 Capturing subpattern count = 0
-No options
-First char = 'a'
-Need char = 'f'
+First code unit = 'a'
+Last code unit = 'f'
+Subject length lower bound = 6
     abcdef
 --->abcdef
   0 ^  ^       d
@@ -3524,8 +3427,7 @@
 --->1234abcdef
   0     ^  ^       d
  0: abcdef
-    *** Failers
-No match
+\= Expect no match
     abcxyz
 No match
     abcxyzf
@@ -3535,22 +3437,20 @@
 
 /abc(?C)de(?C1)f/I
 Capturing subpattern count = 0
-No options
-First char = 'a'
-Need char = 'f'
+First code unit = 'a'
+Last code unit = 'f'
+Subject length lower bound = 6
     123abcdef
 --->123abcdef
   0    ^  ^       d
   1    ^    ^     f
  0: abcdef
 
-/(?C1)\dabc(?C2)def/IS
+/(?C1)\dabc(?C2)def/I
 Capturing subpattern count = 0
-No options
-No first char
-Need char = 'f'
+Starting code units: 0 1 2 3 4 5 6 7 8 9 
+Last code unit = 'f'
 Subject length lower bound = 7
-Starting chars: 0 1 2 3 4 5 6 7 8 9 
     1234abcdef
 --->1234abcdef
   1 ^              \d
@@ -3559,16 +3459,15 @@
   1    ^           \d
   2    ^   ^       d
  0: 4abcdef
-    *** Failers
-No match
+\= Expect no match
     abcdef
 No match
 
-/(?C1)\dabc(?C2)def/ISS
+/(?C1)\dabc(?C2)def/I
 Capturing subpattern count = 0
-No options
-No first char
-Need char = 'f'
+Starting code units: 0 1 2 3 4 5 6 7 8 9 
+Last code unit = 'f'
+Subject length lower bound = 7
     1234abcdef
 --->1234abcdef
   1 ^              \d
@@ -3577,40 +3476,30 @@
   1    ^           \d
   2    ^   ^       d
  0: 4abcdef
-    *** Failers
-No match
+\= Expect no match
     abcdef
---->abcdef
-  1 ^          \d
-  1  ^         \d
-  1   ^        \d
-  1    ^       \d
-  1     ^      \d
-  1      ^     \d
 No match
 
 /(?C255)ab/I
 Capturing subpattern count = 0
-No options
-First char = 'a'
-Need char = 'b'
+First code unit = 'a'
+Last code unit = 'b'
+Subject length lower bound = 2
 
 /(?C256)ab/I
-Failed: number after (?C is > 255 at offset 6
+Failed: error 138 at offset 6: number after (?C is greater than 255
 
 /(?Cab)xx/I
-Failed: closing ) for (?C expected at offset 3
+Failed: error 182 at offset 3: unrecognized string delimiter follows (?C
 
 /(?C12vr)x/I
-Failed: closing ) for (?C expected at offset 5
+Failed: error 139 at offset 5: closing parenthesis for (?C expected
 
 /abc(?C)def/I
 Capturing subpattern count = 0
-No options
-First char = 'a'
-Need char = 'f'
-    *** Failers
-No match
+First code unit = 'a'
+Last code unit = 'f'
+Subject length lower bound = 6
     \x83\x0\x61bcdef
 --->\x83\x00abcdef
   0         ^  ^       d
@@ -3618,16 +3507,16 @@
 
 /(abc)(?C)de(?C1)f/I
 Capturing subpattern count = 1
-No options
-First char = 'a'
-Need char = 'f'
+First code unit = 'a'
+Last code unit = 'f'
+Subject length lower bound = 6
     123abcdef
 --->123abcdef
   0    ^  ^       d
   1    ^    ^     f
  0: abcdef
  1: abc
-    123abcdef\C+
+    123abcdef\=callout_capture
 Callout 0: last capture = 1
  0: <unset>
  1: abc
@@ -3640,12 +3529,11 @@
        ^    ^     f
  0: abcdef
  1: abc
-    123abcdef\C-
+    123abcdefC-\=callout_none
  0: abcdef
  1: abc
-    *** Failers
-No match
-    123abcdef\C!1
+\= Expect no match
+    123abcdef\=callout_fail=1
 --->123abcdef
   0    ^  ^       d
   1    ^    ^     f
@@ -3654,9 +3542,7 @@
 /(?C0)(abc(?C1))*/I
 Capturing subpattern count = 1
 May match empty string
-No options
-No first char
-No need char
+Subject length lower bound = 0
     abcabcabc
 --->abcabcabc
   0 ^             (abc(?C1))*
@@ -3665,18 +3551,14 @@
   1 ^        ^    )
  0: abcabcabc
  1: abc
-    abcabc\C!1!3
+    abcabc\=callout_fail=1:3
 --->abcabc
   0 ^          (abc(?C1))*
   1 ^  ^       )
   1 ^     ^    )
  0: abcabc
  1: abc
-    *** Failers
---->*** Failers
-  0 ^               (abc(?C1))*
- 0: 
-    abcabcabc\C!1!3
+    abcabcabc\=callout_fail=1:3
 --->abcabcabc
   0 ^             (abc(?C1))*
   1 ^  ^          )
@@ -3688,18 +3570,16 @@
 /(\d{3}(?C))*/I
 Capturing subpattern count = 1
 May match empty string
-No options
-No first char
-No need char
-    123\C+
-Callout 0: last capture = -1
+Subject length lower bound = 0
+    123\=callout_capture
+Callout 0: last capture = 0
  0: <unset>
 --->123
     ^  ^    )
  0: 123
  1: 123
-    123456\C+
-Callout 0: last capture = -1
+    123456\=callout_capture
+Callout 0: last capture = 0
  0: <unset>
 --->123456
     ^  ^       )
@@ -3710,8 +3590,8 @@
     ^     ^    )
  0: 123456
  1: 456
-    123456789\C+
-Callout 0: last capture = -1
+    123456789\=callout_capture
+Callout 0: last capture = 0
  0: <unset>
 --->123456789
     ^  ^          )
@@ -3730,17 +3610,16 @@
 
 /((xyz)(?C)p|(?C1)xyzabc)/I
 Capturing subpattern count = 2
-No options
-First char = 'x'
-No need char
-    xyzabc\C+
+First code unit = 'x'
+Subject length lower bound = 4
+    xyzabc\=callout_capture
 Callout 0: last capture = 2
  0: <unset>
  1: <unset>
  2: xyz
 --->xyzabc
     ^  ^       p
-Callout 1: last capture = -1
+Callout 1: last capture = 0
  0: <unset>
 --->xyzabc
     ^          x
@@ -3749,10 +3628,10 @@
 
 /(X)((xyz)(?C)p|(?C1)xyzabc)/I
 Capturing subpattern count = 3
-No options
-First char = 'X'
-Need char = 'x'
-    Xxyzabc\C+
+First code unit = 'X'
+Last code unit = 'x'
+Subject length lower bound = 5
+    Xxyzabc\=callout_capture
 Callout 0: last capture = 3
  0: <unset>
  1: X
@@ -3771,10 +3650,10 @@
 
 /(?=(abc))(?C)abcdef/I
 Capturing subpattern count = 1
-No options
-First char = 'a'
-Need char = 'f'
-    abcdef\C+
+First code unit = 'a'
+Last code unit = 'f'
+Subject length lower bound = 6
+    abcdef\=callout_capture
 Callout 0: last capture = 1
  0: <unset>
  1: abc
@@ -3785,16 +3664,16 @@
 
 /(?!(abc)(?C1)d)(?C2)abcxyz/I
 Capturing subpattern count = 1
-No options
-First char = 'a'
-Need char = 'z'
-    abcxyz\C+
+First code unit = 'a'
+Last code unit = 'z'
+Subject length lower bound = 6
+    abcxyz\=callout_capture
 Callout 1: last capture = 1
  0: <unset>
  1: abc
 --->abcxyz
     ^  ^       d
-Callout 2: last capture = -1
+Callout 2: last capture = 0
  0: <unset>
 --->abcxyz
     ^          a
@@ -3803,10 +3682,10 @@
 /(?<=(abc)(?C))xyz/I
 Capturing subpattern count = 1
 Max lookbehind = 3
-No options
-First char = 'x'
-Need char = 'z'
-   abcxyz\C+
+First code unit = 'x'
+Last code unit = 'z'
+Subject length lower bound = 3
+   abcxyz\=callout_capture
 Callout 0: last capture = 1
  0: <unset>
  1: abc
@@ -3817,10 +3696,11 @@
 
 /a(b+)(c*)(?C1)/I
 Capturing subpattern count = 2
-No options
-First char = 'a'
-Need char = 'b'
-    abbbbbccc\C*1
+First code unit = 'a'
+Last code unit = 'b'
+Subject length lower bound = 2
+\= Expect no match
+    abbbbbccc\=callout_data=1
 --->abbbbbccc
   1 ^        ^    
 Callout data = 1
@@ -3828,10 +3708,11 @@
 
 /a(b+?)(c*?)(?C1)/I
 Capturing subpattern count = 2
-No options
-First char = 'a'
-Need char = 'b'
-    abbbbbccc\C*1
+First code unit = 'a'
+Last code unit = 'b'
+Subject length lower bound = 2
+\= Expect no match
+    abbbbbccc\=callout_data=1
 --->abbbbbccc
   1 ^ ^           
 Callout data = 1
@@ -3853,38 +3734,25 @@
 
 /(?C)abc/I
 Capturing subpattern count = 0
-No options
-First char = 'a'
-Need char = 'c'
+First code unit = 'a'
+Last code unit = 'c'
+Subject length lower bound = 3
 
 /(?C)^abc/I
 Capturing subpattern count = 0
-Options: anchored
-No first char
-No need char
+Compile options: <none>
+Overall options: anchored
+Subject length lower bound = 3
 
-/(?C)a|b/IS
+/(?C)a|b/I
 Capturing subpattern count = 0
-No options
-No first char
-No need char
+Starting code units: a b 
 Subject length lower bound = 1
-Starting chars: a b 
-
-/(?R)/I
-Failed: recursive call could loop indefinitely at offset 3
-
-/(a|(?R))/I
-Failed: recursive call could loop indefinitely at offset 6
-
-/(ab|(bc|(de|(?R))))/I
-Failed: recursive call could loop indefinitely at offset 15
 
 /x(ab|(bc|(de|(?R))))/I
 Capturing subpattern count = 3
-No options
-First char = 'x'
-No need char
+First code unit = 'x'
+Subject length lower bound = 3
     xab
  0: xab
  1: ab
@@ -3907,23 +3775,16 @@
  1: xxab
  2: xxab
  3: xxab
-    *** Failers
-No match
+\= Expect no match
     xyab
 No match
 
-/(ab|(bc|(de|(?1))))/I
-Failed: recursive call could loop indefinitely at offset 15
-
-/x(ab|(bc|(de|(?1)x)x)x)/I
-Failed: recursive call could loop indefinitely at offset 16
-
 /^([^()]|\((?1)*\))*$/I
 Capturing subpattern count = 1
 May match empty string
-Options: anchored
-No first char
-No need char
+Compile options: <none>
+Overall options: anchored
+Subject length lower bound = 0
     abc
  0: abc
  1: c
@@ -3933,16 +3794,16 @@
     a(b(c))d
  0: a(b(c))d
  1: d
-    *** Failers)
-No match
+\= Expect no match)
     a(b(c)d
 No match
 
 /^>abc>([^()]|\((?1)*\))*<xyz<$/I
 Capturing subpattern count = 1
-Options: anchored
-No first char
-Need char = '<'
+Compile options: <none>
+Overall options: anchored
+Last code unit = '<'
+Subject length lower bound = 10
    >abc>123<xyz<
  0: >abc>123<xyz<
  1: 3
@@ -3953,7 +3814,7 @@
  0: >abc>(1(2)3)<xyz<
  1: (1(2)3)
 
-/(a(?1)b)/DZ
+/(a(?1)b)/IB
 ------------------------------------------------------------------
         Bra
         CBra 1
@@ -3965,11 +3826,11 @@
         End
 ------------------------------------------------------------------
 Capturing subpattern count = 1
-No options
-First char = 'a'
-Need char = 'b'
+First code unit = 'a'
+Last code unit = 'b'
+Subject length lower bound = 2
 
-/(a(?1)+b)/DZ
+/(a(?1)+b)/IB
 ------------------------------------------------------------------
         Bra
         CBra 1
@@ -3983,15 +3844,15 @@
         End
 ------------------------------------------------------------------
 Capturing subpattern count = 1
-No options
-First char = 'a'
-Need char = 'b'
+First code unit = 'a'
+Last code unit = 'b'
+Subject length lower bound = 2
 
 /^(\d+|\((?1)([+*-])(?1)\)|-(?1))$/I
 Capturing subpattern count = 2
-Options: anchored
-No first char
-No need char
+Compile options: <none>
+Overall options: anchored
+Subject length lower bound = 1
     12
  0: 12
  1: 12
@@ -4002,16 +3863,15 @@
     -12
  0: -12
  1: -12
-    *** Failers
-No match
+\= Expect no match
     ((2+2)*-3)-7)
 No match
 
 /^(x(y|(?1){2})z)/I
 Capturing subpattern count = 2
-Options: anchored
-No first char
-No need char
+Compile options: <none>
+Overall options: anchored
+Subject length lower bound = 3
     xyz
  0: xyz
  1: xyz
@@ -4020,8 +3880,7 @@
  0: xxyzxyzz
  1: xxyzxyzz
  2: xyzxyz
-    *** Failers
-No match
+\= Expect no match
     xxyzz
 No match
     xxyzxyzxyzz
@@ -4030,8 +3889,9 @@
 /((< (?: (?(R) \d++  | [^<>]*+) | (?2)) * >))/Ix
 Capturing subpattern count = 2
 Options: extended
-First char = '<'
-Need char = '>'
+First code unit = '<'
+Last code unit = '>'
+Subject length lower bound = 2
     <>
  0: <>
  1: <>
@@ -4056,31 +3916,30 @@
  0: <>
  1: <>
  2: <>
-    *** Failers
-No match
+\= Expect no match
     <abc
 No match
 
 /(?1)/I
-Failed: reference to non-existent subpattern at offset 3
+Failed: error 115 at offset 3: reference to non-existent subpattern
 
 /((?2)(abc)/I
-Failed: missing ) at offset 10
+Failed: error 114 at offset 10: missing closing parenthesis
 
 /^(abc)def(?1)/I
 Capturing subpattern count = 1
-Options: anchored
-No first char
-No need char
+Compile options: <none>
+Overall options: anchored
+Subject length lower bound = 9
     abcdefabc
  0: abcdefabc
  1: abc
 
 /^(a|b|c)=(?1)+/I
 Capturing subpattern count = 1
-Options: anchored
-No first char
-No need char
+Compile options: <none>
+Overall options: anchored
+Subject length lower bound = 3
     a=a
  0: a=a
  1: a
@@ -4093,9 +3952,9 @@
 
 /^(a|b|c)=((?1))+/I
 Capturing subpattern count = 2
-Options: anchored
-No first char
-No need char
+Compile options: <none>
+Overall options: anchored
+Subject length lower bound = 2
     a=a
  0: a=a
  1: a
@@ -4109,7 +3968,7 @@
  1: a
  2: c
 
-/a(?P<name1>b|c)d(?P<longername2>e)/DZ
+/a(?P<name1>b|c)d(?P<longername2>e)/IB
 ------------------------------------------------------------------
         Bra
         a
@@ -4129,9 +3988,9 @@
 Named capturing subpatterns:
   longername2   2
   name1         1
-No options
-First char = 'a'
-Need char = 'e'
+First code unit = 'a'
+Last code unit = 'e'
+Subject length lower bound = 4
     abde
  0: abde
  1: b
@@ -4141,7 +4000,7 @@
  1: c
  2: e
 
-/(?:a(?P<c>c(?P<d>d)))(?P<a>a)/DZ
+/(?:a(?P<c>c(?P<d>d)))(?P<a>a)/IB
 ------------------------------------------------------------------
         Bra
         Bra
@@ -4164,11 +4023,11 @@
   a   3
   c   1
   d   2
-No options
-First char = 'a'
-Need char = 'a'
+First code unit = 'a'
+Last code unit = 'a'
+Subject length lower bound = 4
 
-/(?P<a>a)...(?P=a)bbb(?P>a)d/DZ
+/(?P<a>a)...(?P=a)bbb(?P>a)d/IB
 ------------------------------------------------------------------
         Bra
         CBra 1
@@ -4188,9 +4047,9 @@
 Max back reference = 1
 Named capturing subpatterns:
   a   1
-No options
-First char = 'a'
-Need char = 'd'
+First code unit = 'a'
+Last code unit = 'd'
+Subject length lower bound = 10
 
 /^\W*(?:(?P<one>(?P<two>.)\W*(?P>one)\W*(?P=two)|)|(?P<three>(?P<four>.)\W*(?P>three)\W*(?P=four)|\W*.\W*))\W*$/Ii
 Capturing subpattern count = 4
@@ -4201,9 +4060,9 @@
   three   3
   two     2
 May match empty string
-Options: anchored caseless
-No first char
-No need char
+Compile options: caseless
+Overall options: anchored caseless
+Subject length lower bound = 0
     1221
  0: 1221
  1: 1221
@@ -4226,17 +4085,14 @@
  2: <unset>
  3: Able was I ere I saw Elba
  4: A
-    *** Failers
-No match
+\= Expect no match
     The quick brown fox
 No match
 
 /((?(R)a|b))\1(?1)?/I
 Capturing subpattern count = 1
 Max back reference = 1
-No options
-No first char
-No need char
+Subject length lower bound = 2
   bb
  0: bb
  1: b
@@ -4246,82 +4102,84 @@
 
 /(.*)a/Is
 Capturing subpattern count = 1
-Options: anchored dotall
-No first char
-Need char = 'a'
+Compile options: dotall
+Overall options: anchored dotall
+Last code unit = 'a'
+Subject length lower bound = 1
 
 /(.*)a\1/Is
 Capturing subpattern count = 1
 Max back reference = 1
 Options: dotall
-No first char
-Need char = 'a'
+Last code unit = 'a'
+Subject length lower bound = 1
 
 /(.*)a(b)\2/Is
 Capturing subpattern count = 2
 Max back reference = 2
-Options: anchored dotall
-No first char
-Need char = 'b'
+Compile options: dotall
+Overall options: anchored dotall
+Last code unit = 'b'
+Subject length lower bound = 3
 
 /((.*)a|(.*)b)z/Is
 Capturing subpattern count = 3
-Options: anchored dotall
-No first char
-Need char = 'z'
+Compile options: dotall
+Overall options: anchored dotall
+Last code unit = 'z'
+Subject length lower bound = 2
 
 /((.*)a|(.*)b)z\1/Is
 Capturing subpattern count = 3
 Max back reference = 1
 Options: dotall
-No first char
-Need char = 'z'
+Last code unit = 'z'
+Subject length lower bound = 3
 
 /((.*)a|(.*)b)z\2/Is
 Capturing subpattern count = 3
 Max back reference = 2
 Options: dotall
-No first char
-Need char = 'z'
+Last code unit = 'z'
+Subject length lower bound = 2
 
 /((.*)a|(.*)b)z\3/Is
 Capturing subpattern count = 3
 Max back reference = 3
 Options: dotall
-No first char
-Need char = 'z'
+Last code unit = 'z'
+Subject length lower bound = 2
 
 /((.*)a|^(.*)b)z\3/Is
 Capturing subpattern count = 3
 Max back reference = 3
-Options: anchored dotall
-No first char
-Need char = 'z'
+Compile options: dotall
+Overall options: anchored dotall
+Last code unit = 'z'
+Subject length lower bound = 2
 
 /(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)a/Is
 Capturing subpattern count = 31
 May match empty string
-Options: anchored dotall
-No first char
-No need char
+Compile options: dotall
+Overall options: anchored dotall
+Subject length lower bound = 0
 
 /(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)a\31/Is
 Capturing subpattern count = 31
 Max back reference = 31
 May match empty string
 Options: dotall
-No first char
-No need char
+Subject length lower bound = 0
 
 /(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)a\32/Is
 Capturing subpattern count = 32
 Max back reference = 32
 May match empty string
 Options: dotall
-No first char
-No need char
+Subject length lower bound = 0
 
-/(a)(bc)/INDZ
+/(a)(bc)/IB,no_auto_capture
 ------------------------------------------------------------------
         Bra
         Bra
@@ -4335,12 +4193,13 @@
 ------------------------------------------------------------------
 Capturing subpattern count = 0
 Options: no_auto_capture
-First char = 'a'
-Need char = 'c'
+First code unit = 'a'
+Last code unit = 'c'
+Subject length lower bound = 3
   abc
  0: abc
 
-/(?P<one>a)(bc)/INDZ
+/(?P<one>a)(bc)/IB,no_auto_capture
 ------------------------------------------------------------------
         Bra
         CBra 1
@@ -4356,13 +4215,14 @@
 Named capturing subpatterns:
   one   1
 Options: no_auto_capture
-First char = 'a'
-Need char = 'c'
+First code unit = 'a'
+Last code unit = 'c'
+Subject length lower bound = 3
   abc
  0: abc
  1: a
 
-/(a)(?P<named>bc)/INDZ
+/(a)(?P<named>bc)/IB,no_auto_capture
 ------------------------------------------------------------------
         Bra
         Bra
@@ -4378,46 +4238,33 @@
 Named capturing subpatterns:
   named   1
 Options: no_auto_capture
-First char = 'a'
-Need char = 'c'
-
-/(a+)*zz/I
-Capturing subpattern count = 1
-No options
-No first char
-Need char = 'z'
-  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazzbbbbbb\M
-Minimum match() limit = 8
-Minimum match() recursion limit = 6
- 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazz
- 1: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-  aaaaaaaaaaaaaz\M
-Minimum match() limit = 32768
-Minimum match() recursion limit = 29
-No match
+First code unit = 'a'
+Last code unit = 'c'
+Subject length lower bound = 3
 
 /(aaa(?C1)bbb|ab)/I
 Capturing subpattern count = 1
-No options
-First char = 'a'
-Need char = 'b'
+First code unit = 'a'
+Last code unit = 'b'
+Subject length lower bound = 2
    aaabbb
 --->aaabbb
   1 ^  ^       b
  0: aaabbb
  1: aaabbb
-   aaabbb\C*0
+   aaabbb\=callout_data=0
 --->aaabbb
   1 ^  ^       b
  0: aaabbb
  1: aaabbb
-   aaabbb\C*1
+   aaabbb\=callout_data=1
 --->aaabbb
   1 ^  ^       b
 Callout data = 1
  0: ab
  1: ab
-   aaabbb\C*-1
+\= Expect no match    
+   aaabbb\=callout_data=-1
 --->aaabbb
   1 ^  ^       b
 Callout data = -1
@@ -4428,33 +4275,33 @@
 Named capturing subpatterns:
   one   1
   two   2
-No options
-First char = 'a'
-Need char = 'h'
+First code unit = 'a'
+Last code unit = 'h'
+Subject length lower bound = 8
     abcdefgh
  0: abcdefgh
  1: cd
  2: gh
-    abcdefgh\C1\Gtwo
+    abcdefgh\=copy=1,get=two
  0: abcdefgh
  1: cd
  2: gh
  1C cd (2)
-  G gh (2) two
-    abcdefgh\Cone\Ctwo
+  G gh (2) two (group 2)
+    abcdefgh\=copy=one,copy=two
  0: abcdefgh
  1: cd
  2: gh
-  C cd (2) one
-  C gh (2) two
-    abcdefgh\Cthree
-no parentheses with name "three"
+  C cd (2) one (group 1)
+  C gh (2) two (group 2)
+    abcdefgh\=copy=three
  0: abcdefgh
  1: cd
  2: gh
-copy substring three failed -7
+Number not found for group 'three'
+Copy substring 'three' failed (-49): unknown substring
 
-/(?P<Tes>)(?P<Test>)/DZ
+/(?P<Tes>)(?P<Test>)/IB
 ------------------------------------------------------------------
         Bra
         CBra 1
@@ -4469,11 +4316,9 @@
   Tes    1
   Test   2
 May match empty string
-No options
-No first char
-No need char
+Subject length lower bound = 0
 
-/(?P<Test>)(?P<Tes>)/DZ
+/(?P<Test>)(?P<Tes>)/IB
 ------------------------------------------------------------------
         Bra
         CBra 1
@@ -4488,49 +4333,46 @@
   Tes    2
   Test   1
 May match empty string
-No options
-No first char
-No need char
+Subject length lower bound = 0
 
 /(?P<Z>zz)(?P<A>aa)/I
 Capturing subpattern count = 2
 Named capturing subpatterns:
   A   2
   Z   1
-No options
-First char = 'z'
-Need char = 'a'
-    zzaa\CZ
+First code unit = 'z'
+Last code unit = 'a'
+Subject length lower bound = 4
+    zzaa\=copy=Z
  0: zzaa
  1: zz
  2: aa
-  C zz (2) Z
-    zzaa\CA
+  C zz (2) Z (group 1)
+    zzaa\=copy=A
  0: zzaa
  1: zz
  2: aa
-  C aa (2) A
+  C aa (2) A (group 2)
 
 /(?P<x>eks)(?P<x>eccs)/I
-Failed: two named subpatterns have the same name at offset 15
+Failed: error 143 at offset 15: two named subpatterns have the same name (PCRE2_DUPNAMES not set)
 
 /(?P<abc>abc(?P<def>def)(?P<abc>xyz))/I
-Failed: two named subpatterns have the same name at offset 30
+Failed: error 143 at offset 30: two named subpatterns have the same name (PCRE2_DUPNAMES not set)
 
 "\[((?P<elem>\d+)(,(?P>elem))*)\]"I
 Capturing subpattern count = 3
 Named capturing subpatterns:
   elem   2
-No options
-First char = '['
-Need char = ']'
+First code unit = '['
+Last code unit = ']'
+Subject length lower bound = 3
     [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
+\= Expect no match
     []
 No match
 
@@ -4538,9 +4380,9 @@
 Capturing subpattern count = 3
 Named capturing subpatterns:
   elem   2
-No options
-First char = '['
-Need char = ']'
+First code unit = '['
+Last code unit = ']'
+Subject length lower bound = 2
     [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
@@ -4549,7 +4391,7 @@
     []
  0: []
 
-/(a(b(?2)c))?/DZ
+/(a(b(?2)c))?/IB
 ------------------------------------------------------------------
         Bra
         Brazero
@@ -4566,11 +4408,9 @@
 ------------------------------------------------------------------
 Capturing subpattern count = 2
 May match empty string
-No options
-No first char
-No need char
+Subject length lower bound = 0
 
-/(a(b(?2)c))*/DZ
+/(a(b(?2)c))*/IB
 ------------------------------------------------------------------
         Bra
         Brazero
@@ -4587,11 +4427,9 @@
 ------------------------------------------------------------------
 Capturing subpattern count = 2
 May match empty string
-No options
-No first char
-No need char
+Subject length lower bound = 0
 
-/(a(b(?2)c)){0,2}/DZ
+/(a(b(?2)c)){0,2}/IB
 ------------------------------------------------------------------
         Bra
         Brazero
@@ -4619,43 +4457,55 @@
 ------------------------------------------------------------------
 Capturing subpattern count = 2
 May match empty string
-No options
-No first char
-No need char
+Subject length lower bound = 0
 
-/[ab]{1}+/DZ
+/[ab]{1}+/B
 ------------------------------------------------------------------
         Bra
-        [ab]{1,1}+
+        [ab]
         Ket
         End
 ------------------------------------------------------------------
-Capturing subpattern count = 0
-No options
-No first char
-No need char
+
+/()(?1){1}/B
+------------------------------------------------------------------
+        Bra
+        CBra 1
+        Ket
+        Recurse
+        Ket
+        End
+------------------------------------------------------------------
+
+/()(?1)/B
+------------------------------------------------------------------
+        Bra
+        CBra 1
+        Ket
+        Recurse
+        Ket
+        End
+------------------------------------------------------------------
 
 /((w\/|-|with)*(free|immediate)*.*?shipping\s*[!.-]*)/Ii
 Capturing subpattern count = 3
 Options: caseless
-No first char
-Need char = 'g' (caseless)
+Last code unit = 'g' (caseless)
+Subject length lower bound = 8
      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*[!.-]*)/IiS
+/((w\/|-|with)*(free|immediate)*.*?shipping\s*[!.-]*)/Ii
 Capturing subpattern count = 3
 Options: caseless
-No first char
-Need char = 'g' (caseless)
+Last code unit = 'g' (caseless)
 Subject length lower bound = 8
-No starting char list
      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/ISDZ
+/a*.*b/IB
 ------------------------------------------------------------------
         Bra
         a*
@@ -4665,13 +4515,10 @@
         End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
-No options
-No first char
-Need char = 'b'
+Last code unit = 'b'
 Subject length lower bound = 1
-No starting char list
 
-/(a|b)*.?c/ISDZ
+/(a|b)*.?c/IB
 ------------------------------------------------------------------
         Bra
         Brazero
@@ -4686,13 +4533,10 @@
         End
 ------------------------------------------------------------------
 Capturing subpattern count = 1
-No options
-No first char
-Need char = 'c'
+Last code unit = 'c'
 Subject length lower bound = 1
-No starting char list
 
-/abc(?C255)de(?C)f/DZ
+/abc(?C255)de(?C)f/IB
 ------------------------------------------------------------------
         Bra
         abc
@@ -4704,11 +4548,11 @@
         End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
-No options
-First char = 'a'
-Need char = 'f'
+First code unit = 'a'
+Last code unit = 'f'
+Subject length lower bound = 6
 
-/abcde/ICDZ
+/abcde/IB,auto_callout
 ------------------------------------------------------------------
         Bra
         Callout 255 0 1
@@ -4726,9 +4570,10 @@
         End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
-Options:
-First char = 'a'
-Need char = 'e'
+Options: auto_callout
+First code unit = 'a'
+Last code unit = 'e'
+Subject length lower bound = 5
   abcde
 --->abcde
  +0 ^         a
@@ -4738,6 +4583,7 @@
  +4 ^   ^     e
  +5 ^    ^    
  0: abcde
+\= Expect no match
   abcdfe
 --->abcdfe
  +0 ^          a
@@ -4747,7 +4593,7 @@
  +4 ^   ^      e
 No match
 
-/a*b/ICDZS
+/a*b/IB,auto_callout
 ------------------------------------------------------------------
         Bra
         Callout 255 0 2
@@ -4759,11 +4605,10 @@
         End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
-Options:
-No first char
-Need char = 'b'
+Options: auto_callout
+Starting code units: a b 
+Last code unit = 'b'
 Subject length lower bound = 1
-Starting chars: a b 
   ab
 --->ab
  +0 ^      a*
@@ -4791,7 +4636,7 @@
  +3      ^^    
  0: b
 
-/a*b/ICDZSS
+/a*b/IB,auto_callout
 ------------------------------------------------------------------
         Bra
         Callout 255 0 2
@@ -4803,9 +4648,10 @@
         End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
-Options:
-No first char
-Need char = 'b'
+Options: auto_callout
+Starting code units: a b 
+Last code unit = 'b'
+Subject length lower bound = 1
   ab
 --->ab
  +0 ^      a*
@@ -4828,14 +4674,12 @@
  +2   ^ ^      b
  +0    ^       a*
  +2    ^^      b
- +0     ^      a*
- +2     ^      b
  +0      ^     a*
  +2      ^     b
  +3      ^^    
  0: b
 
-/a+b/ICDZ
+/a+b/IB,auto_callout
 ------------------------------------------------------------------
         Bra
         Callout 255 0 2
@@ -4847,9 +4691,10 @@
         End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
-Options:
-First char = 'a'
-Need char = 'b'
+Options: auto_callout
+First code unit = 'a'
+Last code unit = 'b'
+Subject length lower bound = 2
   ab
 --->ab
  +0 ^      a+
@@ -4862,6 +4707,7 @@
  +2 ^   ^     b
  +3 ^    ^    
  0: aaaab
+\= Expect no match 
   aaaacb
 --->aaaacb
  +0 ^          a+
@@ -4874,7 +4720,7 @@
  +2    ^^      b
 No match
 
-/(abc|def)x/ICDZS
+/(abc|def)x/IB,auto_callout
 ------------------------------------------------------------------
         Bra
         Callout 255 0 9
@@ -4902,11 +4748,10 @@
         End
 ------------------------------------------------------------------
 Capturing subpattern count = 1
-Options:
-No first char
-Need char = 'x'
+Options: auto_callout
+Starting code units: a d 
+Last code unit = 'x'
 Subject length lower bound = 4
-Starting chars: a d 
   abcx
 --->abcx
  +0 ^        (abc|def)
@@ -4930,8 +4775,7 @@
 +10 ^   ^    
  0: defx
  1: def
-  ** Failers 
-No match
+\= Expect no match 
   abcdefzx
 --->abcdefzx
  +0 ^            (abc|def)
@@ -4950,7 +4794,7 @@
  +9    ^  ^      x
 No match
 
-/(abc|def)x/ICDZSS
+/(abc|def)x/IB,auto_callout
 ------------------------------------------------------------------
         Bra
         Callout 255 0 9
@@ -4978,9 +4822,10 @@
         End
 ------------------------------------------------------------------
 Capturing subpattern count = 1
-Options:
-No first char
-Need char = 'x'
+Options: auto_callout
+Starting code units: a d 
+Last code unit = 'x'
+Subject length lower bound = 4
   abcx
 --->abcx
  +0 ^        (abc|def)
@@ -5004,8 +4849,7 @@
 +10 ^   ^    
  0: defx
  1: def
-  ** Failers 
-No match
+\= Expect no match 
   abcdefzx
 --->abcdefzx
  +0 ^            (abc|def)
@@ -5015,12 +4859,6 @@
  +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
@@ -5028,25 +4866,13 @@
  +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}/IC
+/(ab|cd){3,4}/I,auto_callout
 Capturing subpattern count = 1
-Options:
-No first char
-No need char
+Options: auto_callout
+Starting code units: a c 
+Subject length lower bound = 6
   ababab
 --->ababab
  +0 ^          (ab|cd){3,4}
@@ -5106,7 +4932,7 @@
  0: abcdcdcd
  1: cd
 
-/([ab]{,4}c|xy)/ICDZS
+/([ab]{,4}c|xy)/IB,auto_callout
 ------------------------------------------------------------------
         Bra
         Callout 255 0 14
@@ -5136,11 +4962,10 @@
         End
 ------------------------------------------------------------------
 Capturing subpattern count = 1
-Options:
-No first char
-No need char
+Options: auto_callout
+Starting code units: a b x 
 Subject length lower bound = 2
-Starting chars: a b x 
+\= Expect no match 
     Note: that { does NOT introduce a quantifier
 --->Note: that { does NOT introduce a quantifier
  +0         ^                                        ([ab]{,4}c|xy)
@@ -5157,7 +4982,7 @@
 +11                                     ^            x
 No match
 
-/([ab]{,4}c|xy)/ICDZSS
+/([ab]{,4}c|xy)/IB,auto_callout
 ------------------------------------------------------------------
         Bra
         Callout 255 0 14
@@ -5187,152 +5012,27 @@
         End
 ------------------------------------------------------------------
 Capturing subpattern count = 1
-Options:
-No first char
-No need char
+Options: auto_callout
+Starting code units: a b x 
+Subject length lower bound = 2
+\= Expect no match 
     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/ICDZ
+/([ab]{1,4}c|xy){4,5}?123/IB,auto_callout
 ------------------------------------------------------------------
         Bra
         Callout 255 0 21
@@ -5413,9 +5113,10 @@
         End
 ------------------------------------------------------------------
 Capturing subpattern count = 1
-Options:
-No first char
-Need char = '3'
+Options: auto_callout
+Starting code units: a b x 
+Last code unit = '3'
+Subject length lower bound = 11
     aacaacaacaacaac123
 --->aacaacaacaacaac123
  +0 ^                      ([ab]{1,4}c|xy){4,5}?
@@ -5446,10 +5147,8 @@
 Capturing subpattern count = 0
 Max lookbehind = 1
 May match empty string
-No options
-No first char
-No need char
-  ab cd\>1
+Subject length lower bound = 0
+  ab cd\=offset=1
  0:  cd
 
 /\b.*/Is
@@ -5457,397 +5156,235 @@
 Max lookbehind = 1
 May match empty string
 Options: dotall
-No first char
-No need char
-  ab cd\>1
+Subject length lower bound = 0
+  ab cd\=startoffset=1
  0:  cd
 
 /(?!.bcd).*/I
 Capturing subpattern count = 0
 May match empty string
-No options
-No first char
-No need char
+Subject length lower bound = 0
   Xbcd12345
  0: bcd12345
 
 /abcde/I
 Capturing subpattern count = 0
-No options
-First char = 'a'
-Need char = 'e'
-    ab\P
+First code unit = 'a'
+Last code unit = 'e'
+Subject length lower bound = 5
+    ab\=ps
 Partial match: ab
-    abc\P
+    abc\=ps
 Partial match: abc
-    abcd\P
+    abcd\=ps
 Partial match: abcd
-    abcde\P
+    abcde\=ps
  0: abcde
-    the quick brown abc\P
+    the quick brown abc\=ps
 Partial match: abc
-    ** Failers\P
-No match
-    the quick brown abxyz fox\P
+\= Expect no match\=ps
+    the quick brown abxyz fox\=ps
 No match
 
 "^(0?[1-9]|[12][0-9]|3[01])/(0?[1-9]|1[012])/(20)?\d\d$"I
 Capturing subpattern count = 3
-Options: anchored
-No first char
-Need char = '/'
-    13/05/04\P
+Compile options: <none>
+Overall options: anchored
+Last code unit = '/'
+Subject length lower bound = 6
+    13/05/04\=ps
  0: 13/05/04
  1: 13
  2: 05
-    13/5/2004\P
+    13/5/2004\=ps
  0: 13/5/2004
  1: 13
  2: 5
  3: 20
-    02/05/09\P
+    02/05/09\=ps
  0: 02/05/09
  1: 02
  2: 05
-    1\P
+    1\=ps
 Partial match: 1
-    1/2\P
+    1/2\=ps
 Partial match: 1/2
-    1/2/0\P
+    1/2/0\=ps
 Partial match: 1/2/0
-    1/2/04\P
+    1/2/04\=ps
  0: 1/2/04
  1: 1
  2: 2
-    0\P
+    0\=ps
 Partial match: 0
-    02/\P
+    02/\=ps
 Partial match: 02/
-    02/0\P
+    02/0\=ps
 Partial match: 02/0
-    02/1\P
+    02/1\=ps
 Partial match: 02/1
-    ** Failers\P
+\= Expect no match\=ps
+    \=ps
 No match
-    \P
+    123\=ps
 No match
-    123\P
+    33/4/04\=ps
 No match
-    33/4/04\P
+    3/13/04\=ps
 No match
-    3/13/04\P
+    0/1/2003\=ps
 No match
-    0/1/2003\P
+    0/\=ps
 No match
-    0/\P
+    02/0/\=ps
 No match
-    02/0/\P
-No match
-    02/13\P
+    02/13\=ps
 No match
 
 /0{0,2}ABC/I
 Capturing subpattern count = 0
-No options
-No first char
-Need char = 'C'
+Starting code units: 0 A 
+Last code unit = 'C'
+Subject length lower bound = 3
 
 /\d{3,}ABC/I
 Capturing subpattern count = 0
-No options
-No first char
-Need char = 'C'
+Starting code units: 0 1 2 3 4 5 6 7 8 9 
+Last code unit = 'C'
+Subject length lower bound = 6
 
 /\d*ABC/I
 Capturing subpattern count = 0
-No options
-No first char
-Need char = 'C'
+Starting code units: 0 1 2 3 4 5 6 7 8 9 A 
+Last code unit = 'C'
+Subject length lower bound = 3
 
 /[abc]+DE/I
 Capturing subpattern count = 0
-No options
-No first char
-Need char = 'E'
+Starting code units: a b c 
+Last code unit = 'E'
+Subject length lower bound = 3
 
 /[abc]?123/I
 Capturing subpattern count = 0
-No options
-No first char
-Need char = '3'
-    123\P
+Starting code units: 1 a b c 
+Last code unit = '3'
+Subject length lower bound = 3
+    123\=ps
  0: 123
-    a\P
+    a\=ps
 Partial match: a
-    b\P
+    b\=ps
 Partial match: b
-    c\P
+    c\=ps
 Partial match: c
-    c12\P
+    c12\=ps
 Partial match: c12
-    c123\P
+    c123\=ps
  0: c123
 
 /^(?:\d){3,5}X/I
 Capturing subpattern count = 0
-Options: anchored
-No first char
-Need char = 'X'
-    1\P
+Compile options: <none>
+Overall options: anchored
+Last code unit = 'X'
+Subject length lower bound = 4
+    1\=ps
 Partial match: 1
-    123\P
+    123\=ps
 Partial match: 123
     123X
  0: 123X
-    1234\P
+    1234\=ps
 Partial match: 1234
     1234X
  0: 1234X
-    12345\P
+    12345\=ps
 Partial match: 12345
     12345X
  0: 12345X
-    *** Failers
-No match
+\= Expect no match
     1X
 No match
-    123456\P
+    123456\=ps
 No match
 
-//KF>testsavedregex
-Compiled pattern written to testsavedregex
-Study data written to testsavedregex
-
-/abc/IS>testsavedregex
-Capturing subpattern count = 0
-No options
-First char = 'a'
-Need char = 'c'
-Subject length lower bound = 3
-No starting char list
-Compiled pattern written to testsavedregex
-Study data written to testsavedregex
-<testsavedregex
-Compiled pattern loaded from testsavedregex
-Study data loaded from testsavedregex
-    abc
- 0: abc
-    ** Failers
-No match
-    bca
-No match
-
-/abc/ISS>testsavedregex
-Capturing subpattern count = 0
-No options
-First char = 'a'
-Need char = 'c'
-Compiled pattern written to testsavedregex
-<testsavedregex
-Compiled pattern loaded from testsavedregex
-No study data
-    abc
- 0: abc
-    ** Failers
-No match
-    bca
-No match
-
-/abc/IFS>testsavedregex
-Capturing subpattern count = 0
-No options
-First char = 'a'
-Need char = 'c'
-Subject length lower bound = 3
-No starting char list
-Compiled pattern written to testsavedregex
-Study data written to testsavedregex
-<testsavedregex
-Compiled pattern (byte-inverted) loaded from testsavedregex
-Study data loaded from testsavedregex
-    abc
- 0: abc
-    ** Failers
-No match
-    bca
-No match
-
-/abc/IFSS>testsavedregex
-Capturing subpattern count = 0
-No options
-First char = 'a'
-Need char = 'c'
-Compiled pattern written to testsavedregex
-<testsavedregex
-Compiled pattern (byte-inverted) loaded from testsavedregex
-No study data
-    abc
- 0: abc
-    ** Failers
-No match
-    bca
-No match
-
-/(a|b)/IS>testsavedregex
-Capturing subpattern count = 1
-No options
-No first char
-No need char
-Subject length lower bound = 1
-Starting chars: a b 
-Compiled pattern written to testsavedregex
-Study data written to testsavedregex
-<testsavedregex
-Compiled pattern loaded from testsavedregex
-Study data loaded from testsavedregex
-    abc
- 0: a
- 1: a
-    ** Failers
- 0: a
- 1: a
-    def
-No match
-
-/(a|b)/ISS>testsavedregex
-Capturing subpattern count = 1
-No options
-No first char
-No need char
-Compiled pattern written to testsavedregex
-<testsavedregex
-Compiled pattern loaded from testsavedregex
-No study data
-    abc
- 0: a
- 1: a
-    ** Failers
- 0: a
- 1: a
-    def
-No match
-
-/(a|b)/ISF>testsavedregex
-Capturing subpattern count = 1
-No options
-No first char
-No need char
-Subject length lower bound = 1
-Starting chars: a b 
-Compiled pattern written to testsavedregex
-Study data written to testsavedregex
-<testsavedregex
-Compiled pattern (byte-inverted) loaded from testsavedregex
-Study data loaded from testsavedregex
-    abc
- 0: a
- 1: a
-    ** Failers
- 0: a
- 1: a
-    def
-No match
-
-/(a|b)/ISSF>testsavedregex
-Capturing subpattern count = 1
-No options
-No first char
-No need char
-Compiled pattern written to testsavedregex
-<testsavedregex
-Compiled pattern (byte-inverted) loaded from testsavedregex
-No study data
-    abc
- 0: a
- 1: a
-    ** Failers
- 0: a
- 1: a
-    def
-No match
-
-~<(\w+)/?>(.)*</(\1)>~smgI
+"<(\w+)/?>(.)*</(\1)>"Igms
 Capturing subpattern count = 3
 Max back reference = 1
-Options: multiline dotall
-First char = '<'
-Need char = '>'
-    \J1024<!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>
+Options: dotall multiline
+First code unit = '<'
+Last code unit = '>'
+Subject length lower bound = 7
+    <!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>\=jitstack=1024
  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/I
 Capturing subpattern count = 0
 Contains explicit CR or LF match
-No options
-First char = 'l'
-Need char = 'k'
+First code unit = 'l'
+Last code unit = 'k'
+Subject length lower bound = 10
     this is a line\nbreak
  0: line\x0abreak
     line one\nthis is a line\nbreak in the second line
  0: line\x0abreak
 
-/line\nbreak/If
+/line\nbreak/I,firstline
 Capturing subpattern count = 0
 Contains explicit CR or LF match
 Options: firstline
-First char = 'l'
-Need char = 'k'
+First code unit = 'l'
+Last code unit = 'k'
+Subject length lower bound = 10
     this is a line\nbreak
  0: line\x0abreak
-    ** Failers
-No match
+\= Expect no match
     line one\nthis is a line\nbreak in the second line
 No match
 
-/line\nbreak/Imf
+/line\nbreak/Im,firstline
 Capturing subpattern count = 0
 Contains explicit CR or LF match
-Options: multiline firstline
-First char = 'l'
-Need char = 'k'
+Options: firstline multiline
+First code unit = 'l'
+Last code unit = 'k'
+Subject length lower bound = 10
     this is a line\nbreak
  0: line\x0abreak
-    ** Failers
-No match
+\= Expect no match
     line one\nthis is a line\nbreak in the second line
 No match
 
 /(?i)(?-i)AbCd/I
 Capturing subpattern count = 0
-No options
-First char = 'A'
-Need char = 'd'
+First code unit = 'A'
+Last code unit = 'd'
+Subject length lower bound = 4
     AbCd
  0: AbCd
-    ** Failers
-No match
+\= Expect no match
     abcd
 No match
 
 /a{11111111111111111111}/I
-Failed: number too big in {} quantifier at offset 8
+Failed: error 105 at offset 8: number too big in {} quantifier
 
 /(){64294967295}/I
-Failed: number too big in {} quantifier at offset 9
+Failed: error 105 at offset 9: number too big in {} quantifier
 
 /(){2,4294967295}/I
-Failed: number too big in {} quantifier at offset 11
+Failed: error 105 at offset 11: number too big in {} quantifier
 
 "(?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"I
 Capturing subpattern count = 1
 Max back reference = 1
-No options
-First char = 'a' (caseless)
-Need char = 'B'
+First code unit = 'a' (caseless)
+Last code unit = 'B'
+Subject length lower bound = 15
     abcdefghijklAkB
  0: abcdefghijklAkB
  1: k
@@ -5868,9 +5405,9 @@
   n7    8
   n8    9
   n9   10
-No options
-First char = 'a'
-Need char = 'B'
+First code unit = 'a'
+Last code unit = 'B'
+Subject length lower bound = 15
     abcdefghijklAkB
  0: abcdefghijklAkB
  1: a
@@ -5889,9 +5426,9 @@
 "(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)(l)A\11B"I
 Capturing subpattern count = 12
 Max back reference = 11
-No options
-First char = 'a'
-Need char = 'B'
+First code unit = 'a'
+Last code unit = 'B'
+Subject length lower bound = 15
     abcdefghijklAkB
  0: abcdefghijklAkB
  1: a
@@ -6011,9 +5548,9 @@
   name97   98
   name98   99
   name99  100
-No options
-First char = 'a'
-Need char = 'a'
+First code unit = 'a'
+Last code unit = 'a'
+Subject length lower bound = 101
     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
 Matched, but too many substrings
  0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -6034,9 +5571,9 @@
 
 "(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)"I
 Capturing subpattern count = 101
-No options
-First char = 'a'
-Need char = 'a'
+First code unit = 'a'
+Last code unit = 'a'
+Subject length lower bound = 101
     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
 Matched, but too many substrings
  0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -6058,9 +5595,7 @@
 /[^()]*(?:\((?R)\)[^()]*)*/I
 Capturing subpattern count = 0
 May match empty string
-No options
-No first char
-No need char
+Subject length lower bound = 0
     (this(and)that
  0: 
     (this(and)that)
@@ -6071,9 +5606,7 @@
 /[^()]*(?:\((?>(?R))\)[^()]*)*/I
 Capturing subpattern count = 0
 May match empty string
-No options
-No first char
-No need char
+Subject length lower bound = 0
     (this(and)that
  0: 
     (this(and)that)
@@ -6082,9 +5615,7 @@
 /[^()]*(?:\((?R)\))*[^()]*/I
 Capturing subpattern count = 0
 May match empty string
-No options
-No first char
-No need char
+Subject length lower bound = 0
     (this(and)that
  0: 
     (this(and)that)
@@ -6093,9 +5624,7 @@
 /(?:\((?R)\))*[^()]*/I
 Capturing subpattern count = 0
 May match empty string
-No options
-No first char
-No need char
+Subject length lower bound = 0
     (this(and)that
  0: 
     (this(and)that)
@@ -6106,9 +5635,7 @@
 /(?:\((?R)\))|[^()]*/I
 Capturing subpattern count = 0
 May match empty string
-No options
-No first char
-No need char
+Subject length lower bound = 0
     (this(and)that
  0: 
     (this(and)that)
@@ -6120,43 +5647,40 @@
 
 /\x{0000ff}/I
 Capturing subpattern count = 0
-No options
-First char = \xff
-No need char
+First code unit = \xff
+Subject length lower bound = 1
 
 /^((?P<A>a1)|(?P<A>a2)b)/I
-Failed: two named subpatterns have the same name at offset 17
+Failed: error 143 at offset 17: two named subpatterns have the same name (PCRE2_DUPNAMES not set)
 
-/^((?P<A>a1)|(?P<A>a2)b)/IJ
+/^((?P<A>a1)|(?P<A>a2)b)/I,dupnames
 Capturing subpattern count = 3
 Named capturing subpatterns:
   A   2
   A   3
-Options: anchored dupnames
-No first char
-No need char
-    a1b\CA
+Compile options: dupnames
+Overall options: anchored dupnames
+Subject length lower bound = 2
+    a1b\=copy=A
  0: a1
  1: a1
  2: a1
-  C a1 (2) A
-    a2b\CA
+  C a1 (2) A (non-unique)
+    a2b\=copy=A
  0: a2b
  1: a2b
  2: <unset>
  3: a2
-  C a2 (2) A
-    ** Failers
-No match
-    a1b\CZ\CA
-no parentheses with name "Z"
+  C a2 (2) A (non-unique)
+    a1b\=copy=Z,copy=A
  0: a1
  1: a1
  2: a1
-copy substring Z failed -7
-  C a1 (2) A
+Number not found for group 'Z'
+Copy substring 'Z' failed (-49): unknown substring
+  C a1 (2) A (non-unique)
     
-/(?|(?<a>)(?<b>)(?<a>)|(?<a>)(?<b>)(?<a>))/IJ
+/(?|(?<a>)(?<b>)(?<a>)|(?<a>)(?<b>)(?<a>))/I,dupnames
 Capturing subpattern count = 3
 Named capturing subpatterns:
   a   1
@@ -6164,41 +5688,39 @@
   b   2
 May match empty string
 Options: dupnames
-No first char
-No need char
+Subject length lower bound = 0
 
-/^(?P<A>a)(?P<A>b)/IJ
+/^(?P<A>a)(?P<A>b)/I,dupnames
 Capturing subpattern count = 2
 Named capturing subpatterns:
   A   1
   A   2
-Options: anchored dupnames
-No first char
-No need char
-    ab\CA
+Compile options: dupnames
+Overall options: anchored dupnames
+Subject length lower bound = 2
+    ab\=copy=A
  0: ab
  1: a
  2: b
-  C a (1) A
+  C a (1) A (non-unique)
 
-/^(?P<A>a)(?P<A>b)|cd/IJ
+/^(?P<A>a)(?P<A>b)|cd/I,dupnames
 Capturing subpattern count = 2
 Named capturing subpatterns:
   A   1
   A   2
 Options: dupnames
-No first char
-No need char
-    ab\CA
+Subject length lower bound = 2
+    ab\=copy=A
  0: ab
  1: a
  2: b
-  C a (1) A
-    cd\CA
+  C a (1) A (non-unique)
+    cd\=copy=A
  0: cd
-copy substring A failed -7
+Copy substring 'A' failed (-55): requested value is not set
 
-/^(?P<A>a)(?P<A>b)|cd(?P<A>ef)(?P<A>gh)/IJ
+/^(?P<A>a)(?P<A>b)|cd(?P<A>ef)(?P<A>gh)/I,dupnames
 Capturing subpattern count = 4
 Named capturing subpatterns:
   A   1
@@ -6206,77 +5728,73 @@
   A   3
   A   4
 Options: dupnames
-No first char
-No need char
-    cdefgh\CA
+Subject length lower bound = 2
+    cdefgh\=copy=A
  0: cdefgh
  1: <unset>
  2: <unset>
  3: ef
  4: gh
-  C ef (2) A
+  C ef (2) A (non-unique)
 
-/^((?P<A>a1)|(?P<A>a2)b)/IJ
+/^((?P<A>a1)|(?P<A>a2)b)/I,dupnames
 Capturing subpattern count = 3
 Named capturing subpatterns:
   A   2
   A   3
-Options: anchored dupnames
-No first char
-No need char
-    a1b\GA
+Compile options: dupnames
+Overall options: anchored dupnames
+Subject length lower bound = 2
+    a1b\=get=A
  0: a1
  1: a1
  2: a1
-  G a1 (2) A
-    a2b\GA
+  G a1 (2) A (non-unique)
+    a2b\=get=A
  0: a2b
  1: a2b
  2: <unset>
  3: a2
-  G a2 (2) A
-    ** Failers
-No match
-    a1b\GZ\GA
-no parentheses with name "Z"
+  G a2 (2) A (non-unique)
+    a1b\=get=Z,get=A
  0: a1
  1: a1
  2: a1
-get substring Z failed -7
-  G a1 (2) A
+Number not found for group 'Z'
+Get substring 'Z' failed (-49): unknown substring
+  G a1 (2) A (non-unique)
 
-/^(?P<A>a)(?P<A>b)/IJ
+/^(?P<A>a)(?P<A>b)/I,dupnames
 Capturing subpattern count = 2
 Named capturing subpatterns:
   A   1
   A   2
-Options: anchored dupnames
-No first char
-No need char
-    ab\GA
+Compile options: dupnames
+Overall options: anchored dupnames
+Subject length lower bound = 2
+    ab\=get=A
  0: ab
  1: a
  2: b
-  G a (1) A
+  G a (1) A (non-unique)
 
-/^(?P<A>a)(?P<A>b)|cd/IJ
+/^(?P<A>a)(?P<A>b)|cd/I,dupnames
 Capturing subpattern count = 2
 Named capturing subpatterns:
   A   1
   A   2
 Options: dupnames
-No first char
-No need char
-    ab\GA
+Subject length lower bound = 2
+    ab\=get=A
  0: ab
  1: a
  2: b
-  G a (1) A
-    cd\GA
+  G a (1) A (non-unique)
+    cd\=get=A
  0: cd
-get substring A failed -7
+Get substring 'A' failed (-55): requested value is not set
 
-/^(?P<A>a)(?P<A>b)|cd(?P<A>ef)(?P<A>gh)/IJ
+/^(?P<A>a)(?P<A>b)|cd(?P<A>ef)(?P<A>gh)/I,dupnames
 Capturing subpattern count = 4
 Named capturing subpatterns:
   A   1
@@ -6284,47 +5802,42 @@
   A   3
   A   4
 Options: dupnames
-No first char
-No need char
-    cdefgh\GA
+Subject length lower bound = 2
+    cdefgh\=get=A
  0: cdefgh
  1: <unset>
  2: <unset>
  3: ef
  4: gh
-  G ef (2) A
+  G ef (2) A (non-unique)
 
 /(?J)^((?P<A>a1)|(?P<A>a2)b)/I
 Capturing subpattern count = 3
 Named capturing subpatterns:
   A   2
   A   3
-Options: anchored dupnames
+Compile options: <none>
+Overall options: anchored
 Duplicate name status changes
-No first char
-No need char
-    a1b\CA
+Subject length lower bound = 2
+    a1b\=copy=A
  0: a1
  1: a1
  2: a1
-  C a1 (2) A
-    a2b\CA
+  C a1 (2) A (non-unique)
+    a2b\=copy=A
  0: a2b
  1: a2b
  2: <unset>
  3: a2
-  C a2 (2) A
+  C a2 (2) A (non-unique)
 
 /^(?P<A>a) (?J:(?P<B>b)(?P<B>c)) (?P<A>d)/I
-Failed: two named subpatterns have the same name at offset 37
+Failed: error 143 at offset 37: two named subpatterns have the same name (PCRE2_DUPNAMES not set)
 
-/ In this next test, J is not set at the outer level; consequently it isn't
-set in the pattern's options; consequently pcre_get_named_substring() produces
-a random value. /Ix
-Capturing subpattern count = 1
-Options: extended
-First char = 'I'
-Need char = 'e'
+# In this next test, J is not set at the outer level; consequently it isn't set
+# in the pattern's options; consequently pcre2_substring_get_byname() produces
+# a random value.
 
 /^(?P<A>a) (?J:(?P<B>b)(?P<B>c)) (?P<C>d)/I
 Capturing subpattern count = 4
@@ -6333,35 +5846,34 @@
   B   2
   B   3
   C   4
-Options: anchored
+Compile options: <none>
+Overall options: anchored
 Duplicate name status changes
-No first char
-No need char
-    a bc d\CA\CB\CC
+Subject length lower bound = 6
+    a bc d\=copy=A,copy=B,copy=C
  0: a bc d
  1: a
  2: b
  3: c
  4: d
-  C a (1) A
-  C b (1) B
-  C d (1) C
+  C a (1) A (group 1)
+  C b (1) B (non-unique)
+  C d (1) C (group 4)
 
 /^(?P<A>a)?(?(A)a|b)/I
 Capturing subpattern count = 1
 Max back reference = 1
 Named capturing subpatterns:
   A   1
-Options: anchored
-No first char
-No need char
+Compile options: <none>
+Overall options: anchored
+Subject length lower bound = 1
     aabc
  0: aa
  1: a
     bc
  0: b
-    ** Failers
-No match
+\= Expect no match
     abc
 No match
 
@@ -6370,27 +5882,25 @@
 Max back reference = 1
 Named capturing subpatterns:
   ZZ   1
-No options
-No first char
-Need char = 'X'
+Last code unit = 'X'
+Subject length lower bound = 2
     bXaX
  0: bXaX
  1: X
 
 /(?:(?(2y)a|b)(X))+/I
-Failed: malformed number or name after (?( at offset 7
+Failed: error 126 at offset 7: malformed number or name after (?(
 
 /(?:(?(ZA)a|b)(?P<ZZ>X))+/I
-Failed: reference to non-existent subpattern at offset 9
+Failed: error 115 at offset 9: reference to non-existent subpattern
 
 /(?:(?(ZZ)a|b)(?(ZZ)a|b)(?P<ZZ>X))+/I
 Capturing subpattern count = 1
 Max back reference = 1
 Named capturing subpatterns:
   ZZ   1
-No options
-No first char
-Need char = 'X'
+Last code unit = 'X'
+Subject length lower bound = 3
     bbXaaX
  0: bbXaaX
  1: X
@@ -6400,24 +5910,21 @@
 Max back reference = 1
 Named capturing subpatterns:
   ZZ   1
-No options
-No first char
-Need char = 'X'
+Last code unit = 'X'
+Subject length lower bound = 3
     (b)\\Xa\\X
  0: (b)\Xa\X
  1: X
 
 /(?P<ABC/I
-Failed: syntax error in subpattern name (missing terminator) at offset 7
+Failed: error 142 at offset 7: syntax error in subpattern name (missing terminator)
 
 /(?:(?(A)(?P=A)a|b)(?P<A>X|Y))+/I
 Capturing subpattern count = 1
 Max back reference = 1
 Named capturing subpatterns:
   A   1
-No options
-No first char
-No need char
+Subject length lower bound = 2
     bXXaYYaY
  0: bXXaYYaY
  1: Y
@@ -6430,9 +5937,7 @@
 Max back reference = 10
 Named capturing subpatterns:
   A  10
-No options
-No first char
-No need char
+Subject length lower bound = 2
     bXXaYYaY
  0: bXXaYYaY
  1: 
@@ -6446,67 +5951,29 @@
  9: 
 10: Y
 
-/\s*,\s*/IS
+/\s*,\s*/I
 Capturing subpattern count = 0
-No options
-No first char
-Need char = ','
+Starting code units: \x09 \x0a \x0b \x0c \x0d \x20 , 
+Last code unit = ','
 Subject length lower bound = 1
-Starting chars: \x09 \x0a \x0b \x0c \x0d \x20 , 
     \x0b,\x0b
  0: \x0b,\x0b
     \x0c,\x0d
  0: \x0c,\x0d
 
-/^abc/Im
+/^abc/Im,newline=lf
 Capturing subpattern count = 0
 Options: multiline
-First char at start or follows newline
-Need char = 'c'
+Forced newline is LF
+First code unit at start or follows newline
+Last code unit = 'c'
+Subject length lower bound = 3
     xyz\nabc
  0: abc
-    xyz\nabc\<lf>
+    xyz\r\nabc
  0: abc
-    xyz\r\nabc\<lf>
- 0: abc
-    xyz\rabc\<cr>
- 0: abc
-    xyz\r\nabc\<crlf>
- 0: abc
-    ** Failers
-No match
-    xyz\nabc\<cr>
-No match
-    xyz\r\nabc\<cr>
-No match
-    xyz\nabc\<crlf>
-No match
-    xyz\rabc\<crlf>
-No match
-    xyz\rabc\<lf>
-No match
-
-/abc$/Im<lf>
-Capturing subpattern count = 0
-Options: multiline
-Forced newline sequence: LF
-First char = 'a'
-Need char = 'c'
-    xyzabc
- 0: abc
-    xyzabc\n
- 0: abc
-    xyzabc\npqr
- 0: abc
-    xyzabc\r\<cr>
- 0: abc
-    xyzabc\rpqr\<cr>
- 0: abc
-    xyzabc\r\n\<crlf>
- 0: abc
-    xyzabc\r\npqr\<crlf>
- 0: abc
-    ** Failers
+\= Expect no match
+    xyz\rabc
 No match
     xyzabc\r
 No match
@@ -6517,96 +5984,85 @@
     xyzabc\r\npqr
 No match
 
-/^abc/Im<cr>
+/^abc/Im,newline=crlf
 Capturing subpattern count = 0
 Options: multiline
-Forced newline sequence: CR
-First char at start or follows newline
-Need char = 'c'
-    xyz\rabcdef
+Forced newline is CRLF
+First code unit at start or follows newline
+Last code unit = 'c'
+Subject length lower bound = 3
+    xyz\r\nabclf>
  0: abc
-    xyz\nabcdef\<lf>
- 0: abc
-    ** Failers
+\= Expect no match
+    xyz\nabclf
 No match
-    xyz\nabcdef
+    xyz\rabclf
 No match
-
-/^abc/Im<lf>
+    
+/^abc/Im,newline=cr
 Capturing subpattern count = 0
 Options: multiline
-Forced newline sequence: LF
-First char at start or follows newline
-Need char = 'c'
-    xyz\nabcdef
+Forced newline is CR
+First code unit at start or follows newline
+Last code unit = 'c'
+Subject length lower bound = 3
+    xyz\rabc
  0: abc
-    xyz\rabcdef\<cr>
- 0: abc
-    ** Failers
+\= Expect no match
+    xyz\nabc
 No match
-    xyz\rabcdef
+    xyz\r\nabc
 No match
 
-/^abc/Im<crlf>
-Capturing subpattern count = 0
-Options: multiline
-Forced newline sequence: CRLF
-First char at start or follows newline
-Need char = 'c'
-    xyz\r\nabcdef
- 0: abc
-    xyz\rabcdef\<cr>
- 0: abc
-    ** Failers
-No match
-    xyz\rabcdef
-No match
+/^abc/Im,newline=bad
+** Invalid value in 'newline=bad'
 
-/^abc/Im<bad>
-Unknown modifier at: <bad>
-
-
-/abc/I
-Capturing subpattern count = 0
-No options
-First char = 'a'
-Need char = 'c'
-    xyz\rabc\<bad>
-Unknown escape sequence at: <bad>
-    abc
- 0: abc
-
-/.*/I<lf>
+/.*/I,newline=lf
 Capturing subpattern count = 0
 May match empty string
-Options:
-Forced newline sequence: LF
-First char at start or follows newline
-No need char
+Forced newline is LF
+First code unit at start or follows newline
+Subject length lower bound = 0
     abc\ndef
  0: abc
     abc\rdef
  0: abc\x0ddef
     abc\r\ndef
  0: abc\x0d
-    \<cr>abc\ndef
+
+/.*/I,newline=cr
+Capturing subpattern count = 0
+May match empty string
+Forced newline is CR
+First code unit at start or follows newline
+Subject length lower bound = 0
+    abc\ndef
  0: abc\x0adef
-    \<cr>abc\rdef
+    abc\rdef
  0: abc
-    \<cr>abc\r\ndef
+    abc\r\ndef
  0: abc
-    \<crlf>abc\ndef
+
+/.*/I,newline=crlf
+Capturing subpattern count = 0
+May match empty string
+Forced newline is CRLF
+First code unit at start or follows newline
+Subject length lower bound = 0
+    abc\ndef
  0: abc\x0adef
-    \<crlf>abc\rdef
+    abc\rdef
  0: abc\x0ddef
-    \<crlf>abc\r\ndef
+    abc\r\ndef
  0: abc
 
 /\w+(.)(.)?def/Is
 Capturing subpattern count = 2
 Options: dotall
-No first char
-Need char = 'f'
+Starting code units: 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 
+Last code unit = 'f'
+Subject length lower bound = 5
     abc\ndef
  0: abc\x0adef
  1: \x0a
@@ -6618,25 +6074,13 @@
  1: \x0d
  2: \x0a
 
-+((?:\s|//.*\\n|/[*](?:\\n|.)*?[*]/)*)+I
-Capturing subpattern count = 1
-May match empty string
-No options
-No first char
-No need char
-   /* this is a C style comment */\M
-Minimum match() limit = 120
-Minimum match() recursion limit = 6
- 0: /* this is a C style comment */
- 1: /* this is a C style comment */
-
 /(?P<B>25[0-5]|2[0-4]\d|[01]?\d?\d)(?:\.(?P>B)){3}/I
 Capturing subpattern count = 1
 Named capturing subpatterns:
   B   1
-No options
-No first char
-Need char = '.'
+Starting code units: 0 1 2 3 4 5 6 7 8 9 
+Last code unit = '.'
+Subject length lower bound = 7
 
 /()()()()()()()()()()()()()()()()()()()()
  ()()()()()()()()()()()()()()()()()()()()
@@ -6646,9 +6090,8 @@
  (.(.))/Ix
 Capturing subpattern count = 102
 Options: extended
-No first char
-No need char
-    XY\O400
+Subject length lower bound = 2
+    XY\=ovector=133
  0: XY
  1: 
  2: 
@@ -6753,63 +6196,48 @@
 101: XY
 102: Y
 
-/(a*b|(?i:c*(?-i)d))/IS
+/(a*b|(?i:c*(?-i)d))/I
 Capturing subpattern count = 1
-No options
-No first char
-No need char
+Starting code units: C a b c d 
 Subject length lower bound = 1
-Starting chars: C a b c d 
 
-/()[ab]xyz/IS
+/()[ab]xyz/I
 Capturing subpattern count = 1
-No options
-No first char
-Need char = 'z'
+Starting code units: a b 
+Last code unit = 'z'
 Subject length lower bound = 4
-Starting chars: a b 
 
-/(|)[ab]xyz/IS
+/(|)[ab]xyz/I
 Capturing subpattern count = 1
-No options
-No first char
-Need char = 'z'
+Starting code units: a b 
+Last code unit = 'z'
 Subject length lower bound = 4
-Starting chars: a b 
 
-/(|c)[ab]xyz/IS
+/(|c)[ab]xyz/I
 Capturing subpattern count = 1
-No options
-No first char
-Need char = 'z'
+Starting code units: a b c 
+Last code unit = 'z'
 Subject length lower bound = 4
-Starting chars: a b c 
 
-/(|c?)[ab]xyz/IS
+/(|c?)[ab]xyz/I
 Capturing subpattern count = 1
-No options
-No first char
-Need char = 'z'
+Starting code units: a b c 
+Last code unit = 'z'
 Subject length lower bound = 4
-Starting chars: a b c 
 
-/(d?|c?)[ab]xyz/IS
+/(d?|c?)[ab]xyz/I
 Capturing subpattern count = 1
-No options
-No first char
-Need char = 'z'
+Starting code units: a b c d 
+Last code unit = 'z'
 Subject length lower bound = 4
-Starting chars: a b c d 
 
-/(d?|c)[ab]xyz/IS
+/(d?|c)[ab]xyz/I
 Capturing subpattern count = 1
-No options
-No first char
-Need char = 'z'
+Starting code units: a b c d 
+Last code unit = 'z'
 Subject length lower bound = 4
-Starting chars: a b c d 
 
-/^a*b\d/DZ
+/^a*b\d/IB
 ------------------------------------------------------------------
         Bra
         ^
@@ -6820,11 +6248,12 @@
         End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
-Options: anchored
-No first char
-Need char = 'b'
+Compile options: <none>
+Overall options: anchored
+Last code unit = 'b'
+Subject length lower bound = 2
 
-/^a*+b\d/DZ
+/^a*+b\d/IB
 ------------------------------------------------------------------
         Bra
         ^
@@ -6835,11 +6264,12 @@
         End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
-Options: anchored
-No first char
-Need char = 'b'
+Compile options: <none>
+Overall options: anchored
+Last code unit = 'b'
+Subject length lower bound = 2
 
-/^a*?b\d/DZ
+/^a*?b\d/IB
 ------------------------------------------------------------------
         Bra
         ^
@@ -6850,11 +6280,12 @@
         End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
-Options: anchored
-No first char
-Need char = 'b'
+Compile options: <none>
+Overall options: anchored
+Last code unit = 'b'
+Subject length lower bound = 2
 
-/^a+A\d/DZ
+/^a+A\d/IB
 ------------------------------------------------------------------
         Bra
         ^
@@ -6865,17 +6296,17 @@
         End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
-Options: anchored
-No first char
-Need char = 'A'
+Compile options: <none>
+Overall options: anchored
+Last code unit = 'A'
+Subject length lower bound = 3
     aaaA5
  0: aaaA5
-    ** Failers
-No match
+\= Expect no match
     aaaa5
 No match
 
-/^a*A\d/IiDZ
+/^a*A\d/IBi
 ------------------------------------------------------------------
         Bra
         ^
@@ -6886,45 +6317,34 @@
         End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
-Options: anchored caseless
-No first char
-Need char = 'A' (caseless)
+Compile options: caseless
+Overall options: anchored caseless
+Last code unit = 'A' (caseless)
+Subject length lower bound = 2
     aaaA5
  0: aaaA5
     aaaa5
  0: aaaa5
 
-/(a*|b*)[cd]/IS
+/(a*|b*)[cd]/I
 Capturing subpattern count = 1
-No options
-No first char
-No need char
+Starting code units: a b c d 
 Subject length lower bound = 1
-Starting chars: a b c d 
 
-/(a+|b*)[cd]/IS
+/(a+|b*)[cd]/I
 Capturing subpattern count = 1
-No options
-No first char
-No need char
+Starting code units: a b c d 
 Subject length lower bound = 1
-Starting chars: a b c d 
 
-/(a*|b+)[cd]/IS
+/(a*|b+)[cd]/I
 Capturing subpattern count = 1
-No options
-No first char
-No need char
+Starting code units: a b c d 
 Subject length lower bound = 1
-Starting chars: a b c d 
 
-/(a+|b+)[cd]/IS
+/(a+|b+)[cd]/I
 Capturing subpattern count = 1
-No options
-No first char
-No need char
+Starting code units: a b 
 Subject length lower bound = 2
-Starting chars: a b 
 
 /((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
  ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
@@ -6936,8 +6356,8 @@
 /Ix
 Capturing subpattern count = 203
 Options: extended
-First char = 'a'
-No need char
+First code unit = 'a'
+Subject length lower bound = 1
   large nest
 Matched, but too many substrings
  0: a
@@ -6956,7 +6376,7 @@
 13: a
 14: a
 
-/a*\d/BZ
+/a*\d/B
 ------------------------------------------------------------------
         Bra
         a*+
@@ -6965,7 +6385,7 @@
         End
 ------------------------------------------------------------------
 
-/a*\D/BZ
+/a*\D/B
 ------------------------------------------------------------------
         Bra
         a*
@@ -6974,7 +6394,7 @@
         End
 ------------------------------------------------------------------
 
-/0*\d/BZ
+/0*\d/B
 ------------------------------------------------------------------
         Bra
         0*
@@ -6983,7 +6403,7 @@
         End
 ------------------------------------------------------------------
 
-/0*\D/BZ
+/0*\D/B
 ------------------------------------------------------------------
         Bra
         0*+
@@ -6992,7 +6412,7 @@
         End
 ------------------------------------------------------------------
 
-/a*\s/BZ
+/a*\s/B
 ------------------------------------------------------------------
         Bra
         a*+
@@ -7001,7 +6421,7 @@
         End
 ------------------------------------------------------------------
 
-/a*\S/BZ
+/a*\S/B
 ------------------------------------------------------------------
         Bra
         a*
@@ -7010,7 +6430,7 @@
         End
 ------------------------------------------------------------------
 
-/ *\s/BZ
+/ *\s/B
 ------------------------------------------------------------------
         Bra
          *
@@ -7019,7 +6439,7 @@
         End
 ------------------------------------------------------------------
 
-/ *\S/BZ
+/ *\S/B
 ------------------------------------------------------------------
         Bra
          *+
@@ -7028,7 +6448,7 @@
         End
 ------------------------------------------------------------------
 
-/a*\w/BZ
+/a*\w/B
 ------------------------------------------------------------------
         Bra
         a*
@@ -7037,7 +6457,7 @@
         End
 ------------------------------------------------------------------
 
-/a*\W/BZ
+/a*\W/B
 ------------------------------------------------------------------
         Bra
         a*+
@@ -7046,7 +6466,7 @@
         End
 ------------------------------------------------------------------
 
-/=*\w/BZ
+/=*\w/B
 ------------------------------------------------------------------
         Bra
         =*+
@@ -7055,7 +6475,7 @@
         End
 ------------------------------------------------------------------
 
-/=*\W/BZ
+/=*\W/B
 ------------------------------------------------------------------
         Bra
         =*
@@ -7064,7 +6484,7 @@
         End
 ------------------------------------------------------------------
 
-/\d*a/BZ
+/\d*a/B
 ------------------------------------------------------------------
         Bra
         \d*+
@@ -7073,7 +6493,7 @@
         End
 ------------------------------------------------------------------
 
-/\d*2/BZ
+/\d*2/B
 ------------------------------------------------------------------
         Bra
         \d*
@@ -7082,7 +6502,7 @@
         End
 ------------------------------------------------------------------
 
-/\d*\d/BZ
+/\d*\d/B
 ------------------------------------------------------------------
         Bra
         \d*
@@ -7091,7 +6511,7 @@
         End
 ------------------------------------------------------------------
 
-/\d*\D/BZ
+/\d*\D/B
 ------------------------------------------------------------------
         Bra
         \d*+
@@ -7100,7 +6520,7 @@
         End
 ------------------------------------------------------------------
 
-/\d*\s/BZ
+/\d*\s/B
 ------------------------------------------------------------------
         Bra
         \d*+
@@ -7109,7 +6529,7 @@
         End
 ------------------------------------------------------------------
 
-/\d*\S/BZ
+/\d*\S/B
 ------------------------------------------------------------------
         Bra
         \d*
@@ -7118,7 +6538,7 @@
         End
 ------------------------------------------------------------------
 
-/\d*\w/BZ
+/\d*\w/B
 ------------------------------------------------------------------
         Bra
         \d*
@@ -7127,7 +6547,7 @@
         End
 ------------------------------------------------------------------
 
-/\d*\W/BZ
+/\d*\W/B
 ------------------------------------------------------------------
         Bra
         \d*+
@@ -7136,7 +6556,7 @@
         End
 ------------------------------------------------------------------
 
-/\D*a/BZ
+/\D*a/B
 ------------------------------------------------------------------
         Bra
         \D*
@@ -7145,7 +6565,7 @@
         End
 ------------------------------------------------------------------
 
-/\D*2/BZ
+/\D*2/B
 ------------------------------------------------------------------
         Bra
         \D*+
@@ -7154,7 +6574,7 @@
         End
 ------------------------------------------------------------------
 
-/\D*\d/BZ
+/\D*\d/B
 ------------------------------------------------------------------
         Bra
         \D*+
@@ -7163,7 +6583,7 @@
         End
 ------------------------------------------------------------------
 
-/\D*\D/BZ
+/\D*\D/B
 ------------------------------------------------------------------
         Bra
         \D*
@@ -7172,7 +6592,7 @@
         End
 ------------------------------------------------------------------
 
-/\D*\s/BZ
+/\D*\s/B
 ------------------------------------------------------------------
         Bra
         \D*
@@ -7181,7 +6601,7 @@
         End
 ------------------------------------------------------------------
 
-/\D*\S/BZ
+/\D*\S/B
 ------------------------------------------------------------------
         Bra
         \D*
@@ -7190,7 +6610,7 @@
         End
 ------------------------------------------------------------------
 
-/\D*\w/BZ
+/\D*\w/B
 ------------------------------------------------------------------
         Bra
         \D*
@@ -7199,7 +6619,7 @@
         End
 ------------------------------------------------------------------
 
-/\D*\W/BZ
+/\D*\W/B
 ------------------------------------------------------------------
         Bra
         \D*
@@ -7208,7 +6628,7 @@
         End
 ------------------------------------------------------------------
 
-/\s*a/BZ
+/\s*a/B
 ------------------------------------------------------------------
         Bra
         \s*+
@@ -7217,7 +6637,7 @@
         End
 ------------------------------------------------------------------
 
-/\s*2/BZ
+/\s*2/B
 ------------------------------------------------------------------
         Bra
         \s*+
@@ -7226,7 +6646,7 @@
         End
 ------------------------------------------------------------------
 
-/\s*\d/BZ
+/\s*\d/B
 ------------------------------------------------------------------
         Bra
         \s*+
@@ -7235,7 +6655,7 @@
         End
 ------------------------------------------------------------------
 
-/\s*\D/BZ
+/\s*\D/B
 ------------------------------------------------------------------
         Bra
         \s*
@@ -7244,7 +6664,7 @@
         End
 ------------------------------------------------------------------
 
-/\s*\s/BZ
+/\s*\s/B
 ------------------------------------------------------------------
         Bra
         \s*
@@ -7253,7 +6673,7 @@
         End
 ------------------------------------------------------------------
 
-/\s*\S/BZ
+/\s*\S/B
 ------------------------------------------------------------------
         Bra
         \s*+
@@ -7262,7 +6682,7 @@
         End
 ------------------------------------------------------------------
 
-/\s*\w/BZ
+/\s*\w/B
 ------------------------------------------------------------------
         Bra
         \s*+
@@ -7271,7 +6691,7 @@
         End
 ------------------------------------------------------------------
 
-/\s*\W/BZ
+/\s*\W/B
 ------------------------------------------------------------------
         Bra
         \s*
@@ -7280,7 +6700,7 @@
         End
 ------------------------------------------------------------------
 
-/\S*a/BZ
+/\S*a/B
 ------------------------------------------------------------------
         Bra
         \S*
@@ -7289,7 +6709,7 @@
         End
 ------------------------------------------------------------------
 
-/\S*2/BZ
+/\S*2/B
 ------------------------------------------------------------------
         Bra
         \S*
@@ -7298,7 +6718,7 @@
         End
 ------------------------------------------------------------------
 
-/\S*\d/BZ
+/\S*\d/B
 ------------------------------------------------------------------
         Bra
         \S*
@@ -7307,7 +6727,7 @@
         End
 ------------------------------------------------------------------
 
-/\S*\D/BZ
+/\S*\D/B
 ------------------------------------------------------------------
         Bra
         \S*
@@ -7316,7 +6736,7 @@
         End
 ------------------------------------------------------------------
 
-/\S*\s/BZ
+/\S*\s/B
 ------------------------------------------------------------------
         Bra
         \S*+
@@ -7325,7 +6745,7 @@
         End
 ------------------------------------------------------------------
 
-/\S*\S/BZ
+/\S*\S/B
 ------------------------------------------------------------------
         Bra
         \S*
@@ -7334,7 +6754,7 @@
         End
 ------------------------------------------------------------------
 
-/\S*\w/BZ
+/\S*\w/B
 ------------------------------------------------------------------
         Bra
         \S*
@@ -7343,7 +6763,7 @@
         End
 ------------------------------------------------------------------
 
-/\S*\W/BZ
+/\S*\W/B
 ------------------------------------------------------------------
         Bra
         \S*
@@ -7352,7 +6772,7 @@
         End
 ------------------------------------------------------------------
 
-/\w*a/BZ
+/\w*a/B
 ------------------------------------------------------------------
         Bra
         \w*
@@ -7361,7 +6781,7 @@
         End
 ------------------------------------------------------------------
 
-/\w*2/BZ
+/\w*2/B
 ------------------------------------------------------------------
         Bra
         \w*
@@ -7370,7 +6790,7 @@
         End
 ------------------------------------------------------------------
 
-/\w*\d/BZ
+/\w*\d/B
 ------------------------------------------------------------------
         Bra
         \w*
@@ -7379,7 +6799,7 @@
         End
 ------------------------------------------------------------------
 
-/\w*\D/BZ
+/\w*\D/B
 ------------------------------------------------------------------
         Bra
         \w*
@@ -7388,7 +6808,7 @@
         End
 ------------------------------------------------------------------
 
-/\w*\s/BZ
+/\w*\s/B
 ------------------------------------------------------------------
         Bra
         \w*+
@@ -7397,7 +6817,7 @@
         End
 ------------------------------------------------------------------
 
-/\w*\S/BZ
+/\w*\S/B
 ------------------------------------------------------------------
         Bra
         \w*
@@ -7406,7 +6826,7 @@
         End
 ------------------------------------------------------------------
 
-/\w*\w/BZ
+/\w*\w/B
 ------------------------------------------------------------------
         Bra
         \w*
@@ -7415,7 +6835,7 @@
         End
 ------------------------------------------------------------------
 
-/\w*\W/BZ
+/\w*\W/B
 ------------------------------------------------------------------
         Bra
         \w*+
@@ -7424,7 +6844,7 @@
         End
 ------------------------------------------------------------------
 
-/\W*a/BZ
+/\W*a/B
 ------------------------------------------------------------------
         Bra
         \W*+
@@ -7433,7 +6853,7 @@
         End
 ------------------------------------------------------------------
 
-/\W*2/BZ
+/\W*2/B
 ------------------------------------------------------------------
         Bra
         \W*+
@@ -7442,7 +6862,7 @@
         End
 ------------------------------------------------------------------
 
-/\W*\d/BZ
+/\W*\d/B
 ------------------------------------------------------------------
         Bra
         \W*+
@@ -7451,7 +6871,7 @@
         End
 ------------------------------------------------------------------
 
-/\W*\D/BZ
+/\W*\D/B
 ------------------------------------------------------------------
         Bra
         \W*
@@ -7460,7 +6880,7 @@
         End
 ------------------------------------------------------------------
 
-/\W*\s/BZ
+/\W*\s/B
 ------------------------------------------------------------------
         Bra
         \W*
@@ -7469,7 +6889,7 @@
         End
 ------------------------------------------------------------------
 
-/\W*\S/BZ
+/\W*\S/B
 ------------------------------------------------------------------
         Bra
         \W*
@@ -7478,7 +6898,7 @@
         End
 ------------------------------------------------------------------
 
-/\W*\w/BZ
+/\W*\w/B
 ------------------------------------------------------------------
         Bra
         \W*+
@@ -7487,7 +6907,7 @@
         End
 ------------------------------------------------------------------
 
-/\W*\W/BZ
+/\W*\W/B
 ------------------------------------------------------------------
         Bra
         \W*
@@ -7496,7 +6916,7 @@
         End
 ------------------------------------------------------------------
 
-/[^a]+a/BZ
+/[^a]+a/B
 ------------------------------------------------------------------
         Bra
         [^a]++
@@ -7505,7 +6925,7 @@
         End
 ------------------------------------------------------------------
 
-/[^a]+a/BZi
+/[^a]+a/Bi
 ------------------------------------------------------------------
         Bra
      /i [^a]++
@@ -7514,7 +6934,7 @@
         End
 ------------------------------------------------------------------
 
-/[^a]+A/BZi
+/[^a]+A/Bi
 ------------------------------------------------------------------
         Bra
      /i [^a]++
@@ -7523,7 +6943,7 @@
         End
 ------------------------------------------------------------------
 
-/[^a]+b/BZ
+/[^a]+b/B
 ------------------------------------------------------------------
         Bra
         [^a]+
@@ -7532,7 +6952,7 @@
         End
 ------------------------------------------------------------------
 
-/[^a]+\d/BZ
+/[^a]+\d/B
 ------------------------------------------------------------------
         Bra
         [^a]+
@@ -7541,7 +6961,7 @@
         End
 ------------------------------------------------------------------
 
-/a*[^a]/BZ
+/a*[^a]/B
 ------------------------------------------------------------------
         Bra
         a*+
@@ -7555,39 +6975,39 @@
 Named capturing subpatterns:
   abc   1
   xyz   2
-No options
-First char = 'x'
-Need char = 'y'
-    xy\Cabc\Cxyz
+First code unit = 'x'
+Last code unit = 'y'
+Subject length lower bound = 2
+    xy\=copy=abc,copy=xyz
  0: xy
  1: x
  2: y
-  C x (1) abc
-  C y (1) xyz
+  C x (1) abc (group 1)
+  C y (1) xyz (group 2)
 
 /(?<abc>x)(?'xyz'y)/I
 Capturing subpattern count = 2
 Named capturing subpatterns:
   abc   1
   xyz   2
-No options
-First char = 'x'
-Need char = 'y'
-    xy\Cabc\Cxyz
+First code unit = 'x'
+Last code unit = 'y'
+Subject length lower bound = 2
+    xy\=copy=abc,copy=xyz
  0: xy
  1: x
  2: y
-  C x (1) abc
-  C y (1) xyz
+  C x (1) abc (group 1)
+  C y (1) xyz (group 2)
 
 /(?<abc'x)(?'xyz'y)/I
-Failed: syntax error in subpattern name (missing terminator) at offset 6
+Failed: error 142 at offset 6: syntax error in subpattern name (missing terminator)
 
 /(?<abc>x)(?'xyz>y)/I
-Failed: syntax error in subpattern name (missing terminator) at offset 15
+Failed: error 142 at offset 15: syntax error in subpattern name (missing terminator)
 
 /(?P'abc'x)(?P<xyz>y)/I
-Failed: unrecognized character after (?P at offset 3
+Failed: error 141 at offset 3: unrecognized character after (?P
 
 /^(?:(?(ZZ)a|b)(?<ZZ>X))+/
     bXaX
@@ -7596,15 +7016,14 @@
     bXbX
  0: bX
  1: X
-    ** Failers
-No match
+\= Expect no match
     aXaX
 No match
     aXbX
 No match
 
 /^(?P>abc)(?<abcd>xxx)/
-Failed: reference to non-existent subpattern at offset 8
+Failed: error 115 at offset 8: reference to non-existent subpattern
 
 /^(?P>abc)(?<abc>x|y)/
     xx
@@ -7643,8 +7062,7 @@
  0: bx
  1: bx
  2: x
-    ** Failers
-No match
+\= Expect no match
     axby
 No match
 
@@ -7664,8 +7082,7 @@
  1: Xy
  2: X
  3: y
-    ** Failers
-No match
+\= Expect no match
     x
 No match
 
@@ -7682,7 +7099,7 @@
  0: Xa
  1: a
 
-/^[\E\Qa\E-\Qz\E]+/BZ
+/^[\E\Qa\E-\Qz\E]+/B
 ------------------------------------------------------------------
         Bra
         ^
@@ -7691,7 +7108,7 @@
         End
 ------------------------------------------------------------------
 
-/^[a\Q]bc\E]/BZ
+/^[a\Q]bc\E]/B
 ------------------------------------------------------------------
         Bra
         ^
@@ -7700,7 +7117,7 @@
         End
 ------------------------------------------------------------------
 
-/^[a-\Q\E]/BZ
+/^[a-\Q\E]/B
 ------------------------------------------------------------------
         Bra
         ^
@@ -7709,7 +7126,7 @@
         End
 ------------------------------------------------------------------
 
-/^(?P>abc)[()](?<abc>)/BZ
+/^(?P>abc)[()](?<abc>)/B
 ------------------------------------------------------------------
         Bra
         ^
@@ -7721,7 +7138,7 @@
         End
 ------------------------------------------------------------------
 
-/^((?(abc)y)[()](?P<abc>x))+/BZ
+/^((?(abc)y)[()](?P<abc>x))+/B
 ------------------------------------------------------------------
         Bra
         ^
@@ -7743,7 +7160,7 @@
  1: y)x
  2: x
 
-/^(?P>abc)\Q()\E(?<abc>)/BZ
+/^(?P>abc)\Q()\E(?<abc>)/B
 ------------------------------------------------------------------
         Bra
         ^
@@ -7755,7 +7172,7 @@
         End
 ------------------------------------------------------------------
 
-/^(?P>abc)[a\Q(]\E(](?<abc>)/BZ
+/^(?P>abc)[a\Q(]\E(](?<abc>)/B
 ------------------------------------------------------------------
         Bra
         ^
@@ -7768,7 +7185,7 @@
 ------------------------------------------------------------------
 
 /^(?P>abc) # this is (a comment)
-  (?<abc>)/BZx
+  (?<abc>)/Bx
 ------------------------------------------------------------------
         Bra
         ^
@@ -7788,9 +7205,9 @@
   three   3
   two     2
 May match empty string
-Options: anchored caseless
-No first char
-No need char
+Compile options: caseless
+Overall options: anchored caseless
+Subject length lower bound = 0
     1221
  0: 1221
  1: 1221
@@ -7813,17 +7230,17 @@
  2: <unset>
  3: Able was I ere I saw Elba
  4: A
-    *** Failers
-No match
+\= Expect no match
     The quick brown fox
 No match
 
 /(?=(\w+))\1:/I
 Capturing subpattern count = 1
 Max back reference = 1
-No options
-No first char
-Need char = ':'
+Starting code units: 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 
+Last code unit = ':'
+Subject length lower bound = 2
     abcd:
  0: abcd:
  1: abcd
@@ -7833,26 +7250,26 @@
 Max back reference = 1
 Named capturing subpatterns:
   abc   1
-No options
-No first char
-Need char = ':'
+Starting code units: 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 
+Last code unit = ':'
+Subject length lower bound = 2
     abcd:
  0: abcd:
  1: abcd
 
-/(?'abc'a|b)(?<abc>d|e)\k<abc>{2}/J
+/(?'abc'a|b)(?<abc>d|e)\k<abc>{2}/dupnames
     adaa
  0: adaa
  1: a
  2: d
-    ** Failers
-No match
+\= Expect no match
     addd
 No match
     adbb
 No match
 
-/(?'abc'a|b)(?<abc>d|e)(?&abc){2}/J
+/(?'abc'a|b)(?<abc>d|e)(?&abc){2}/dupnames
     bdaa
  0: bdaa
  1: b
@@ -7861,19 +7278,18 @@
  0: bdab
  1: b
  2: d
-    ** Failers
-No match
+\= Expect no match
     bddd
 No match
 
 /(?(<bc))/
-Failed: malformed number or name after (?( at offset 6
+Failed: error 126 at offset 6: malformed number or name after (?(
 
 /(?(''))/
-Failed: assertion expected after (?( at offset 4
+Failed: error 128 at offset 4: assertion expected after (?( or (?(?C)
 
 /(?('R')stuff)/
-Failed: reference to non-existent subpattern at offset 7
+Failed: error 115 at offset 7: reference to non-existent subpattern
 
 /((abc (?(R) (?(R1)1) (?(R2)2) X  |  (?1)  (?2)   (?R) ))) /x
     abcabc1Xabc2XabcXabcabc
@@ -7888,46 +7304,57 @@
  2: abcabc1Xabc2XabcX
 
 /(?<A> (?'B' abc (?(R) (?(R&C)1) (?(R&B)2) X  |  (?1)  (?2)   (?R) ))) /x
-Failed: reference to non-existent subpattern at offset 29
+Failed: error 115 at offset 29: reference to non-existent subpattern
 
 /^(?(DEFINE) abc | xyz ) /x
-Failed: DEFINE group contains more than one branch at offset 22
+Failed: error 154 at offset 22: DEFINE group contains more than one branch
 
-/(?(DEFINE) abc) xyz/xI
+/(?(DEFINE) abc) xyz/Ix
 Capturing subpattern count = 0
 Options: extended
-First char = 'x'
-Need char = 'z'
+First code unit = 'x'
+Last code unit = 'z'
+Subject length lower bound = 3
 
 /(a|)*\d/
-  \O0aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4\=ovector=0
+ 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4
+ 1: 
+\= Expect no match
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\=ovector=0
 No match
-  \O0aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4
-Matched, but too many substrings
 
-/^a.b/<lf>
+/^a.b/newline=lf
     a\rb
  0: a\x0db
-    a\nb\<cr>
- 0: a\x0ab
-    a\x85b\<anycrlf> 
- 0: a\x85b
-    ** Failers
-No match
+\= Expect no match
     a\nb
 No match
-    a\nb\<any>
-No match
-    a\rb\<cr>
-No match
-    a\rb\<any>
-No match
-    a\x85b\<any> 
-No match
-    a\rb\<anycrlf>
+
+/^a.b/newline=cr
+    a\nb
+ 0: a\x0ab
+\= Expect no match
+    a\rb
 No match
 
-/^abc./mgx<any>
+/^a.b/newline=anycrlf
+    a\x85b
+ 0: a\x85b
+\= Expect no match
+    a\rb
+No match
+
+/^a.b/newline=any
+\= Expect no match
+    a\nb
+No match
+    a\rb
+No match
+    a\x85b
+No match
+
+/^abc./gmx,newline=any
     abc1 \x0aabc2 \x0babc3xx \x0cabc4 \x0dabc5xx \x0d\x0aabc6 \x85abc7 JUNK
  0: abc1
  0: abc2
@@ -7937,7 +7364,7 @@
  0: abc6
  0: abc7
 
-/abc.$/mgx<any>
+/abc.$/gmx,newline=any
     abc1\x0a abc2\x0b abc3\x0c abc4\x0d abc5\x0d\x0a abc6\x85 abc7 abc9
  0: abc1
  0: abc2
@@ -7947,12 +7374,7 @@
  0: abc6
  0: abc9
 
-/a/<cr><any>
-
-/a/<any><crlf>
-Failed: inconsistent NEWLINE options at offset 0
-
-/^a\Rb/<bsr_unicode>
+/^a\Rb/bsr=unicode
     a\nb
  0: a\x0ab
     a\rb
@@ -7965,12 +7387,11 @@
  0: a\x0cb
     a\x85b
  0: a\x85b
-    ** Failers
-No match
+\= Expect no match
     a\n\rb
 No match
 
-/^a\R*b/<bsr_unicode>
+/^a\R*b/bsr=unicode
     ab
  0: ab
     a\nb
@@ -7990,7 +7411,7 @@
     a\n\r\x85\x0cb
  0: a\x0a\x0d\x85\x0cb
 
-/^a\R+b/<bsr_unicode>
+/^a\R+b/bsr=unicode
     a\nb
  0: a\x0ab
     a\rb
@@ -8007,12 +7428,11 @@
  0: a\x0a\x0db
     a\n\r\x85\x0cb
  0: a\x0a\x0d\x85\x0cb
-    ** Failers
-No match
+\= Expect no match
     ab
 No match
 
-/^a\R{1,3}b/<bsr_unicode>
+/^a\R{1,3}b/bsr=unicode
     a\nb
  0: a\x0ab
     a\n\rb
@@ -8027,28 +7447,18 @@
  0: a\x0a\x0d\x0a\x0db
     a\n\n\r\nb
  0: a\x0a\x0a\x0d\x0ab
-    ** Failers
-No match
+\= Expect no match
     a\n\n\n\rb
 No match
     a\r
 No match
 
-/^a[\R]b/<bsr_unicode>
-    aRb
- 0: aRb
-    ** Failers
-No match
-    a\nb
-No match
-
 /(?&abc)X(?<abc>P)/I
 Capturing subpattern count = 1
 Named capturing subpatterns:
   abc   1
-No options
-No first char
-Need char = 'P'
+Last code unit = 'P'
+Subject length lower bound = 3
     abcPXP123
  0: PXP
  1: P
@@ -8057,9 +7467,8 @@
 Capturing subpattern count = 1
 Named capturing subpatterns:
   abc   1
-No options
-No first char
-Need char = 'P'
+Last code unit = 'P'
+Subject length lower bound = 3
     abcPXP123
  0: PXP
  1: P
@@ -8088,67 +7497,65 @@
  1: x
 
 /(abc)(?i:(?1))/
-   defabcabcxyz
+    defabcabcxyz
  0: abcabc
  1: abc
-   DEFabcABCXYZ
+\= Expect no match
+    DEFabcABCXYZ
 No match
 
 /(abc)(?:(?i)(?1))/
-   defabcabcxyz
+    defabcabcxyz
  0: abcabc
  1: abc
-   DEFabcABCXYZ
+\= Expect no match
+    DEFabcABCXYZ
 No match
 
 /^(a)\g-2/
-Failed: reference to non-existent subpattern at offset 7
+Failed: error 115 at offset 7: reference to non-existent subpattern
 
 /^(a)\g/
-Failed: a numbered reference must not be zero at offset 5
+Failed: error 158 at offset 5: a numbered reference must not be zero
 
 /^(a)\g{0}/
-Failed: a numbered reference must not be zero at offset 8
+Failed: error 158 at offset 8: a numbered reference must not be zero
 
 /^(a)\g{3/
-Failed: \g is not followed by a braced, angle-bracketed, or quoted name/number or by a plain number at offset 8
+Failed: error 157 at offset 8: \g is not followed by a braced, angle-bracketed, or quoted name/number or by a plain number
 
 /^(a)\g{aa}/
-Failed: reference to non-existent subpattern at offset 9
+Failed: error 115 at offset 9: reference to non-existent subpattern
 
-/^a.b/<lf>
+/^a.b/newline=lf
     a\rb
  0: a\x0db
-    *** Failers
-No match
+\= Expect no match
     a\nb
 No match
 
 /.+foo/
     afoo
  0: afoo
-    ** Failers
-No match
+\= Expect no match
     \r\nfoo
 No match
     \nfoo
 No match
 
-/.+foo/<crlf>
+/.+foo/newline=crlf
     afoo
  0: afoo
     \nfoo
  0: \x0afoo
-    ** Failers
-No match
+\= Expect no match
     \r\nfoo
 No match
 
-/.+foo/<any>
+/.+foo/newline=any
     afoo
  0: afoo
-    ** Failers
-No match
+\= Expect no match
     \nfoo
 No match
     \r\nfoo
@@ -8162,29 +7569,28 @@
     \nfoo
  0: \x0afoo
     
-/^$/mg<any>
+/^$/gm,newline=any
     abc\r\rxyz
  0: 
     abc\n\rxyz  
  0: 
-    ** Failers 
-No match
+\= Expect no match 
     abc\r\nxyz
 No match
 
-/(?m)^$/<any>g+
+/(?m)^$/g,newline=any,aftertext
     abc\r\n\r\n
  0: 
  0+ \x0d\x0a
 
-/(?m)^$|^\r\n/<any>g+ 
+/(?m)^$|^\r\n/g,newline=any,aftertext
     abc\r\n\r\n
  0: 
  0+ \x0d\x0a
  0: \x0d\x0a
  0+ 
     
-/(?m)$/<any>g+ 
+/(?m)$/g,newline=any,aftertext
     abc\r\n\r\n
  0: 
  0+ \x0d\x0a\x0d\x0a
@@ -8193,7 +7599,7 @@
  0: 
  0+ 
 
-/abc.$/mgx<anycrlf>
+/abc.$/gmx,newline=anycrlf
     abc1\x0a abc2\x0b abc3\x0c abc4\x0d abc5\x0d\x0a abc6\x85 abc9
  0: abc1
  0: abc4
@@ -8203,12 +7609,11 @@
 /^X/m
     XABC
  0: X
-    ** Failers 
-No match
-    XABC\B
+\= Expect no match 
+    XABC\=notbol
 No match
 
-/(ab|c)(?-1)/BZ
+/(ab|c)(?-1)/B
 ------------------------------------------------------------------
         Bra
         CBra 1
@@ -8224,7 +7629,7 @@
  0: abc
  1: ab
 
-/xy(?+1)(abc)/BZ
+/xy(?+1)(abc)/B
 ------------------------------------------------------------------
         Bra
         xy
@@ -8238,24 +7643,23 @@
     xyabcabc
  0: xyabcabc
  1: abc
-    ** Failers
-No match
+\= Expect no match
     xyabc  
 No match
     
 /x(?-0)y/
-Failed: a numbered reference must not be zero at offset 5
+Failed: error 158 at offset 5: a numbered reference must not be zero
 
 /x(?-1)y/
-Failed: reference to non-existent subpattern at offset 5
+Failed: error 115 at offset 5: reference to non-existent subpattern
 
-/x(?+0)y/ 
-Failed: a numbered reference must not be zero at offset 5
+/x(?+0)y/
+Failed: error 158 at offset 5: a numbered reference must not be zero
 
 /x(?+1)y/
-Failed: reference to non-existent subpattern at offset 5
+Failed: error 115 at offset 5: reference to non-existent subpattern
 
-/^(abc)?(?(-1)X|Y)/BZ
+/^(abc)?(?(-1)X|Y)/B
 ------------------------------------------------------------------
         Bra
         ^
@@ -8277,12 +7681,11 @@
  1: abc
     Y
  0: Y
-    ** Failers
-No match
+\= Expect no match
     abcY   
 No match
     
-/^((?(+1)X|Y)(abc))+/BZ 
+/^((?(+1)X|Y)(abc))+/B
 ------------------------------------------------------------------
         Bra
         ^
@@ -8308,15 +7711,14 @@
  0: YabcXabcXabc
  1: Xabc
  2: abc
-    ** Failers
-No match
+\= Expect no match
     XabcXabc  
 No match
 
-/(?(-1)a)/BZ
-Failed: reference to non-existent subpattern at offset 6
+/(?(-1)a)/B
+Failed: error 115 at offset 6: reference to non-existent subpattern
 
-/((?(-1)a))/BZ
+/((?(-1)a))/B
 ------------------------------------------------------------------
         Bra
         CBra 1
@@ -8329,10 +7731,10 @@
         End
 ------------------------------------------------------------------
 
-/((?(-2)a))/BZ
-Failed: reference to non-existent subpattern at offset 7
+/((?(-2)a))/B
+Failed: error 115 at offset 7: reference to non-existent subpattern
 
-/^(?(+1)X|Y)(.)/BZ
+/^(?(+1)X|Y)(.)/B
 ------------------------------------------------------------------
         Bra
         ^
@@ -8359,15 +7761,14 @@
     bon-bon 
  0: bon-bon
  1: bon
-    ** Failers
-No match
+\= Expect no match
     tom-bon  
 No match
 
-/\g{A/ 
-Failed: syntax error in subpattern name (missing terminator) at offset 4
+/\g{A/
+Failed: error 142 at offset 4: syntax error in subpattern name (missing terminator)
 
-/(?|(abc)|(xyz))/BZ
+/(?|(abc)|(xyz))/B
 ------------------------------------------------------------------
         Bra
         Bra
@@ -8389,7 +7790,7 @@
  0: xyz
  1: xyz
 
-/(x)(?|(abc)|(xyz))(x)/BZ
+/(x)(?|(abc)|(xyz))(x)/B
 ------------------------------------------------------------------
         Bra
         CBra 1
@@ -8421,7 +7822,7 @@
  2: xyz
  3: x
 
-/(x)(?|(abc)(pqr)|(xyz))(x)/BZ
+/(x)(?|(abc)(pqr)|(xyz))(x)/B
 ------------------------------------------------------------------
         Bra
         CBra 1
@@ -8458,7 +7859,7 @@
  3: <unset>
  4: x
 
-/\H++X/BZ
+/\H++X/B
 ------------------------------------------------------------------
         Bra
         \H++
@@ -8466,12 +7867,11 @@
         Ket
         End
 ------------------------------------------------------------------
-    ** Failers
-No match
+\= Expect no match
     XXXX
 No match
     
-/\H+\hY/BZ
+/\H+\hY/B
 ------------------------------------------------------------------
         Bra
         \H++
@@ -8483,7 +7883,7 @@
     XXXX Y 
  0: XXXX Y
 
-/\H+ Y/BZ
+/\H+ Y/B
 ------------------------------------------------------------------
         Bra
         \H++
@@ -8492,7 +7892,7 @@
         End
 ------------------------------------------------------------------
 
-/\h+A/BZ
+/\h+A/B
 ------------------------------------------------------------------
         Bra
         \h++
@@ -8501,7 +7901,7 @@
         End
 ------------------------------------------------------------------
 
-/\v*B/BZ
+/\v*B/B
 ------------------------------------------------------------------
         Bra
         \v*+
@@ -8510,7 +7910,7 @@
         End
 ------------------------------------------------------------------
 
-/\V+\x0a/BZ
+/\V+\x0a/B
 ------------------------------------------------------------------
         Bra
         \V++
@@ -8519,7 +7919,7 @@
         End
 ------------------------------------------------------------------
 
-/A+\h/BZ
+/A+\h/B
 ------------------------------------------------------------------
         Bra
         A++
@@ -8528,7 +7928,7 @@
         End
 ------------------------------------------------------------------
 
-/ *\H/BZ
+/ *\H/B
 ------------------------------------------------------------------
         Bra
          *+
@@ -8537,7 +7937,7 @@
         End
 ------------------------------------------------------------------
 
-/A*\v/BZ
+/A*\v/B
 ------------------------------------------------------------------
         Bra
         A*+
@@ -8546,7 +7946,7 @@
         End
 ------------------------------------------------------------------
 
-/\x0b*\V/BZ
+/\x0b*\V/B
 ------------------------------------------------------------------
         Bra
         \x0b*+
@@ -8555,7 +7955,7 @@
         End
 ------------------------------------------------------------------
 
-/\d+\h/BZ
+/\d+\h/B
 ------------------------------------------------------------------
         Bra
         \d++
@@ -8564,7 +7964,7 @@
         End
 ------------------------------------------------------------------
 
-/\d*\v/BZ
+/\d*\v/B
 ------------------------------------------------------------------
         Bra
         \d*+
@@ -8573,7 +7973,7 @@
         End
 ------------------------------------------------------------------
 
-/S+\h\S+\v/BZ
+/S+\h\S+\v/B
 ------------------------------------------------------------------
         Bra
         S++
@@ -8584,7 +7984,7 @@
         End
 ------------------------------------------------------------------
 
-/\w{3,}\h\w+\v/BZ
+/\w{3,}\h\w+\v/B
 ------------------------------------------------------------------
         Bra
         \w{3}
@@ -8596,7 +7996,7 @@
         End
 ------------------------------------------------------------------
 
-/\h+\d\h+\w\h+\S\h+\H/BZ
+/\h+\d\h+\w\h+\S\h+\H/B
 ------------------------------------------------------------------
         Bra
         \h++
@@ -8611,7 +8011,7 @@
         End
 ------------------------------------------------------------------
 
-/\v+\d\v+\w\v+\S\v+\V/BZ
+/\v+\d\v+\w\v+\S\v+\V/B
 ------------------------------------------------------------------
         Bra
         \v++
@@ -8626,7 +8026,7 @@
         End
 ------------------------------------------------------------------
 
-/\H+\h\H+\d/BZ
+/\H+\h\H+\d/B
 ------------------------------------------------------------------
         Bra
         \H++
@@ -8637,7 +8037,7 @@
         End
 ------------------------------------------------------------------
 
-/\V+\v\V+\w/BZ
+/\V+\v\V+\w/B
 ------------------------------------------------------------------
         Bra
         \V++
@@ -8649,28 +8049,28 @@
 ------------------------------------------------------------------
 
 /\( (?: [^()]* | (?R) )* \)/x
-\J1024(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(00)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)
+(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(00)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)\=jitstack=1024
  0: (0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(00)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)
 
 /[\E]AAA/
-Failed: missing terminating ] for character class at offset 7
+Failed: error 106 at offset 7: missing terminating ] for character class
 
 /[\Q\E]AAA/
-Failed: missing terminating ] for character class at offset 9
+Failed: error 106 at offset 9: missing terminating ] for character class
 
 /[^\E]AAA/
-Failed: missing terminating ] for character class at offset 8
+Failed: error 106 at offset 8: missing terminating ] for character class
 
 /[^\Q\E]AAA/
-Failed: missing terminating ] for character class at offset 10
+Failed: error 106 at offset 10: missing terminating ] for character class
 
 /[\E^]AAA/
-Failed: missing terminating ] for character class at offset 8
+Failed: error 106 at offset 8: missing terminating ] for character class
 
 /[\Q\E^]AAA/
-Failed: missing terminating ] for character class at offset 10
+Failed: error 106 at offset 10: missing terminating ] for character class
 
-/A(*PRUNE)B(*SKIP)C(*THEN)D(*COMMIT)E(*F)F(*FAIL)G(?!)H(*ACCEPT)I/BZ
+/A(*PRUNE)B(*SKIP)C(*THEN)D(*COMMIT)E(*F)F(*FAIL)G(?!)H(*ACCEPT)I/B
 ------------------------------------------------------------------
         Bra
         A
@@ -8694,7 +8094,8 @@
         End
 ------------------------------------------------------------------
 
-/^a+(*FAIL)/C
+/^a+(*FAIL)/auto_callout
+\= Expect no match
     aaaaaa
 --->aaaaaa
  +0 ^          ^
@@ -8707,7 +8108,8 @@
  +3 ^^         (*FAIL)
 No match
     
-/a+b?c+(*FAIL)/C
+/a+b?c+(*FAIL)/auto_callout
+\= Expect no match
     aaabccc
 --->aaabccc
  +0 ^           a+
@@ -8730,7 +8132,8 @@
  +6   ^  ^      (*FAIL)
 No match
 
-/a+b?(*PRUNE)c+(*FAIL)/C
+/a+b?(*PRUNE)c+(*FAIL)/auto_callout
+\= Expect no match
     aaabccc
 --->aaabccc
  +0 ^           a+
@@ -8756,7 +8159,8 @@
 +14   ^  ^      (*FAIL)
 No match
 
-/a+b?(*COMMIT)c+(*FAIL)/C
+/a+b?(*COMMIT)c+(*FAIL)/auto_callout
+\= Expect no match
     aaabccc
 --->aaabccc
  +0 ^           a+
@@ -8768,7 +8172,8 @@
 +15 ^    ^      (*FAIL)
 No match
     
-/a+b?(*SKIP)c+(*FAIL)/C
+/a+b?(*SKIP)c+(*FAIL)/auto_callout
+\= Expect no match
     aaabcccaaabccc
 --->aaabcccaaabccc
  +0 ^                  a+
@@ -8787,7 +8192,8 @@
 +13        ^    ^      (*FAIL)
 No match
 
-/a+b?(*THEN)c+(*FAIL)/C
+/a+b?(*THEN)c+(*FAIL)/auto_callout
+\= Expect no match
     aaabccc
 --->aaabccc
  +0 ^           a+
@@ -8813,16 +8219,16 @@
 +13   ^  ^      (*FAIL)
 No match
     
-/a(*MARK)b/ 
-Failed: (*MARK) must have an argument at offset 7
+/a(*MARK)b/
+Failed: error 166 at offset 7: (*MARK) must have an argument
 
 /(?i:A{1,}\6666666666)/
-Failed: number is too big at offset 19
+Failed: error 161 at offset 19: number is too big
 
 /\g6666666666/
-Failed: number is too big at offset 11
+Failed: error 161 at offset 11: number is too big
 
-/[\g6666666666]/BZ
+/[\g6666666666]/B
 ------------------------------------------------------------------
         Bra
         [6g]
@@ -8831,49 +8237,47 @@
 ------------------------------------------------------------------
 
 /(?1)\c[/
-Failed: reference to non-existent subpattern at offset 3
+Failed: error 115 at offset 3: reference to non-existent subpattern
 
-/.+A/<crlf>
+/.+A/newline=crlf
+\= Expect no match
     \r\nA
 No match
     
-/\nA/<crlf>
+/\nA/newline=crlf
     \r\nA 
  0: \x0aA
 
-/[\r\n]A/<crlf>
+/[\r\n]A/newline=crlf
     \r\nA 
  0: \x0aA
 
-/(\r|\n)A/<crlf>
+/(\r|\n)A/newline=crlf
     \r\nA 
  0: \x0aA
  1: \x0a
 
 /a(*CR)b/
-Failed: (*VERB) not recognized or malformed at offset 5
+Failed: error 160 at offset 5: (*VERB) not recognized or malformed
 
 /(*CR)a.b/
     a\nb
  0: a\x0ab
-    ** Failers
-No match
+\= Expect no match
     a\rb  
 No match
 
-/(*CR)a.b/<lf>
+/(*CR)a.b/newline=lf
     a\nb
  0: a\x0ab
-    ** Failers
-No match
+\= Expect no match
     a\rb  
 No match
 
-/(*LF)a.b/<CRLF>
+/(*LF)a.b/newline=CRLF
     a\rb
  0: a\x0db
-    ** Failers
-No match
+\= Expect no match
     a\nb  
 No match
 
@@ -8882,14 +8286,12 @@
  0: a\x0db
     a\nb  
  0: a\x0ab
-    ** Failers
-No match
+\= Expect no match
     a\r\nb  
 No match
 
-/(*ANYCRLF)a.b/<CR>
-    ** Failers
-No match
+/(*ANYCRLF)a.b/newline=CR
+\= Expect no match
     a\rb
 No match
     a\nb  
@@ -8897,9 +8299,8 @@
     a\r\nb  
 No match
 
-/(*ANY)a.b/<cr>
-    ** Failers
-No match
+/(*ANY)a.b/newline=cr
+\= Expect no match
     a\rb
 No match
     a\nb  
@@ -8930,29 +8331,30 @@
  0: def
  0: 
 
-/a\Rb/I<bsr_anycrlf>
+/a\Rb/I,bsr=anycrlf
 Capturing subpattern count = 0
-Options: bsr_anycrlf
-First char = 'a'
-Need char = 'b'
+\R matches CR, LF, or CRLF
+First code unit = 'a'
+Last code unit = 'b'
+Subject length lower bound = 3
     a\rb
  0: a\x0db
     a\nb
  0: a\x0ab
     a\r\nb
  0: a\x0d\x0ab
-    ** Failers
-No match
+\= Expect no match
     a\x85b
 No match
     a\x0bb     
 No match
 
-/a\Rb/I<bsr_unicode>
+/a\Rb/I,bsr=unicode
 Capturing subpattern count = 0
-Options: bsr_unicode
-First char = 'a'
-Need char = 'b'
+\R matches any Unicode newline
+First code unit = 'a'
+Last code unit = 'b'
+Subject length lower bound = 3
     a\rb
  0: a\x0db
     a\nb
@@ -8963,36 +8365,31 @@
  0: a\x85b
     a\x0bb     
  0: a\x0bb
-    ** Failers 
-No match
-    a\x85b\<bsr_anycrlf>
-No match
-    a\x0bb\<bsr_anycrlf>
-No match
     
-/a\R?b/I<bsr_anycrlf>
+/a\R?b/I,bsr=anycrlf
 Capturing subpattern count = 0
-Options: bsr_anycrlf
-First char = 'a'
-Need char = 'b'
+\R matches CR, LF, or CRLF
+First code unit = 'a'
+Last code unit = 'b'
+Subject length lower bound = 2
     a\rb
  0: a\x0db
     a\nb
  0: a\x0ab
     a\r\nb
  0: a\x0d\x0ab
-    ** Failers
-No match
+\= Expect no match
     a\x85b
 No match
     a\x0bb     
 No match
 
-/a\R?b/I<bsr_unicode>
+/a\R?b/I,bsr=unicode
 Capturing subpattern count = 0
-Options: bsr_unicode
-First char = 'a'
-Need char = 'b'
+\R matches any Unicode newline
+First code unit = 'a'
+Last code unit = 'b'
+Subject length lower bound = 2
     a\rb
  0: a\x0db
     a\nb
@@ -9003,60 +8400,51 @@
  0: a\x85b
     a\x0bb     
  0: a\x0bb
-    ** Failers 
-No match
-    a\x85b\<bsr_anycrlf>
-No match
-    a\x0bb\<bsr_anycrlf>
-No match
     
-/a\R{2,4}b/I<bsr_anycrlf>
+/a\R{2,4}b/I,bsr=anycrlf
 Capturing subpattern count = 0
-Options: bsr_anycrlf
-First char = 'a'
-Need char = 'b'
+\R matches CR, LF, or CRLF
+First code unit = 'a'
+Last code unit = 'b'
+Subject length lower bound = 4
     a\r\n\nb
  0: a\x0d\x0a\x0ab
     a\n\r\rb
  0: a\x0a\x0d\x0db
     a\r\n\r\n\r\n\r\nb
  0: a\x0d\x0a\x0d\x0a\x0d\x0a\x0d\x0ab
-    ** Failers
+\= Expect no match
+    a\x85\x85b
 No match
-    a\x85\85b
-No match
-    a\x0b\0bb     
+    a\x0b\x0bb     
 No match
 
-/a\R{2,4}b/I<bsr_unicode>
+/a\R{2,4}b/I,bsr=unicode
 Capturing subpattern count = 0
-Options: bsr_unicode
-First char = 'a'
-Need char = 'b'
+\R matches any Unicode newline
+First code unit = 'a'
+Last code unit = 'b'
+Subject length lower bound = 4
     a\r\rb
  0: a\x0d\x0db
     a\n\n\nb
  0: a\x0a\x0a\x0ab
     a\r\n\n\r\rb
  0: a\x0d\x0a\x0a\x0d\x0db
-    a\x85\85b
-No match
-    a\x0b\0bb     
-No match
-    ** Failers 
-No match
+    a\x85\x85b
+ 0: a\x85\x85b
+    a\x0b\x0bb     
+ 0: a\x0b\x0bb
+\= Expect no match 
     a\r\r\r\r\rb 
 No match
-    a\x85\85b\<bsr_anycrlf>
-No match
-    a\x0b\0bb\<bsr_anycrlf>
-No match
  
 /(*BSR_ANYCRLF)a\Rb/I
 Capturing subpattern count = 0
-Options: bsr_anycrlf
-First char = 'a'
-Need char = 'b'
+\R matches CR, LF, or CRLF
+First code unit = 'a'
+Last code unit = 'b'
+Subject length lower bound = 3
     a\nb
  0: a\x0ab
     a\rb 
@@ -9064,18 +8452,20 @@
 
 /(*BSR_UNICODE)a\Rb/I
 Capturing subpattern count = 0
-Options: bsr_unicode
-First char = 'a'
-Need char = 'b'
+\R matches any Unicode newline
+First code unit = 'a'
+Last code unit = 'b'
+Subject length lower bound = 3
     a\x85b
  0: a\x85b
 
 /(*BSR_ANYCRLF)(*CRLF)a\Rb/I
 Capturing subpattern count = 0
-Options: bsr_anycrlf
-Forced newline sequence: CRLF
-First char = 'a'
-Need char = 'b'
+\R matches CR, LF, or CRLF
+Forced newline is CRLF
+First code unit = 'a'
+Last code unit = 'b'
+Subject length lower bound = 3
     a\nb
  0: a\x0ab
     a\rb 
@@ -9083,126 +8473,116 @@
 
 /(*CRLF)(*BSR_UNICODE)a\Rb/I
 Capturing subpattern count = 0
-Options: bsr_unicode
-Forced newline sequence: CRLF
-First char = 'a'
-Need char = 'b'
+\R matches any Unicode newline
+Forced newline is CRLF
+First code unit = 'a'
+Last code unit = 'b'
+Subject length lower bound = 3
     a\x85b
  0: a\x85b
 
 /(*CRLF)(*BSR_ANYCRLF)(*CR)ab/I
 Capturing subpattern count = 0
-Options: bsr_anycrlf
-Forced newline sequence: CR
-First char = 'a'
-Need char = 'b'
+\R matches CR, LF, or CRLF
+Forced newline is CR
+First code unit = 'a'
+Last code unit = 'b'
+Subject length lower bound = 2
 
 /(?<a>)(?&)/
-Failed: subpattern name expected at offset 9
+Failed: error 162 at offset 9: subpattern name expected
 
 /(?<abc>)(?&a)/
-Failed: reference to non-existent subpattern at offset 12
+Failed: error 115 at offset 12: reference to non-existent subpattern
 
 /(?<a>)(?&aaaaaaaaaaaaaaaaaaaaaaa)/
-Failed: reference to non-existent subpattern at offset 32
+Failed: error 115 at offset 32: reference to non-existent subpattern
 
 /(?+-a)/
-Failed: digit expected after (?+ at offset 3
+Failed: error 163 at offset 3: digit expected after (?+
 
 /(?-+a)/
-Failed: unrecognized character after (? or (?- at offset 3
+Failed: error 111 at offset 3: unrecognized character after (? or (?-
 
 /(?(-1))/
-Failed: reference to non-existent subpattern at offset 6
+Failed: error 115 at offset 6: reference to non-existent subpattern
 
 /(?(+10))/
-Failed: reference to non-existent subpattern at offset 7
+Failed: error 115 at offset 7: reference to non-existent subpattern
 
 /(?(10))/
-Failed: reference to non-existent subpattern at offset 6
+Failed: error 115 at offset 6: reference to non-existent subpattern
 
 /(?(+2))()()/
 
 /(?(2))()()/
 
 /\k''/
-Failed: subpattern name expected at offset 3
+Failed: error 162 at offset 3: subpattern name expected
 
 /\k<>/
-Failed: subpattern name expected at offset 3
+Failed: error 162 at offset 3: subpattern name expected
 
 /\k{}/
-Failed: subpattern name expected at offset 3
+Failed: error 162 at offset 3: subpattern name expected
 
 /\k/
-Failed: \k is not followed by a braced, angle-bracketed, or quoted name at offset 1
+Failed: error 169 at offset 1: \k is not followed by a braced, angle-bracketed, or quoted name
 
 /\kabc/
-Failed: \k is not followed by a braced, angle-bracketed, or quoted name at offset 1
+Failed: error 169 at offset 1: \k is not followed by a braced, angle-bracketed, or quoted name
 
 /(?P=)/
-Failed: subpattern name expected at offset 4
+Failed: error 162 at offset 4: subpattern name expected
 
 /(?P>)/
-Failed: subpattern name expected at offset 4
-
-/(?!\w)(?R)/
-Failed: recursive call could loop indefinitely at offset 9
-
-/(?=\w)(?R)/
-Failed: recursive call could loop indefinitely at offset 9
-
-/(?<!\w)(?R)/
-Failed: recursive call could loop indefinitely at offset 10
-
-/(?<=\w)(?R)/
-Failed: recursive call could loop indefinitely at offset 10
+Failed: error 162 at offset 4: subpattern name expected
 
 /[[:foo:]]/
-Failed: unknown POSIX class name at offset 3
+Failed: error 130 at offset 3: unknown POSIX class name
 
 /[[:1234:]]/
-Failed: unknown POSIX class name at offset 3
+Failed: error 130 at offset 3: unknown POSIX class name
 
 /[[:f\oo:]]/
-Failed: unknown POSIX class name at offset 3
+Failed: error 130 at offset 3: unknown POSIX class name
 
 /[[: :]]/
-Failed: unknown POSIX class name at offset 3
+Failed: error 130 at offset 3: unknown POSIX class name
 
 /[[:...:]]/
-Failed: unknown POSIX class name at offset 3
+Failed: error 130 at offset 3: unknown POSIX class name
 
 /[[:l\ower:]]/
-Failed: unknown POSIX class name at offset 3
+Failed: error 130 at offset 3: unknown POSIX class name
 
 /[[:abc\:]]/
-Failed: unknown POSIX class name at offset 3
+Failed: error 130 at offset 3: unknown POSIX class name
 
 /[abc[:x\]pqr:]]/
-Failed: unknown POSIX class name at offset 6
+Failed: error 130 at offset 6: unknown POSIX class name
 
 /[[:a\dz:]]/
-Failed: unknown POSIX class name at offset 3
+Failed: error 130 at offset 3: unknown POSIX class name
 
 /(^(a|b\g<-1'c))/
-Failed: \g is not followed by a braced, angle-bracketed, or quoted name/number or by a plain number at offset 8
+Failed: error 157 at offset 8: \g is not followed by a braced, angle-bracketed, or quoted name/number or by a plain number
 
 /^(?+1)(?<a>x|y){0}z/
     xzxx
  0: xz
     yzyy 
  0: yz
-    ** Failers
-No match
+\= Expect no match
     xxz  
 No match
 
 /(\3)(\1)(a)/
+\= Expect no match
     cat
 No match
 
-/(\3)(\1)(a)/<JS>
+/(\3)(\1)(a)/alt_bsux,allow_empty_class,match_unset_backref,dupnames
     cat
  0: a
  1: 
@@ -9213,21 +8593,23 @@
     The ACTA] comes 
  0: TA]
 
-/TA]/<JS>
-Failed: ] is an invalid data character in JavaScript compatibility mode at offset 2
+/TA]/alt_bsux,allow_empty_class,match_unset_backref,dupnames
+    The ACTA] comes 
+ 0: TA]
 
 /(?2)[]a()b](abc)/
-Failed: reference to non-existent subpattern at offset 3
+Failed: error 115 at offset 3: reference to non-existent subpattern
+    abcbabc
 
 /(?2)[^]a()b](abc)/
-Failed: reference to non-existent subpattern at offset 3
+Failed: error 115 at offset 3: reference to non-existent subpattern
+    abcbabc
 
 /(?1)[]a()b](abc)/
     abcbabc
  0: abcbabc
  1: abc
-    ** Failers 
-No match
+\= Expect no match 
     abcXabc
 No match
 
@@ -9235,8 +8617,7 @@
     abcXabc
  0: abcXabc
  1: abc
-    ** Failers 
-No match
+\= Expect no match 
     abcbabc
 No match
 
@@ -9247,56 +8628,53 @@
  2: xyz
 
 /(?&N)[]a(?<N>)](?<M>abc)/
-Failed: reference to non-existent subpattern at offset 4
+Failed: error 115 at offset 4: reference to non-existent subpattern
+   abc<abc
 
 /(?&N)[]a(?<N>)](abc)/
-Failed: reference to non-existent subpattern at offset 4
+Failed: error 115 at offset 4: reference to non-existent subpattern
+   abc<abc
 
 /a[]b/
-Failed: missing terminating ] for character class at offset 4
+Failed: error 106 at offset 4: missing terminating ] for character class
 
 /a[^]b/
-Failed: missing terminating ] for character class at offset 5
+Failed: error 106 at offset 5: missing terminating ] for character class
 
-/a[]b/<JS>
-    ** Failers
-No match
+/a[]b/alt_bsux,allow_empty_class,match_unset_backref,dupnames
+\= Expect no match
     ab
 No match
 
-/a[]+b/<JS>
-    ** Failers
-No match
+/a[]+b/alt_bsux,allow_empty_class,match_unset_backref,dupnames
+\= Expect no match
     ab 
 No match
 
-/a[]*+b/<JS>
-    ** Failers
-No match
+/a[]*+b/alt_bsux,allow_empty_class,match_unset_backref,dupnames
+\= Expect no match
     ab 
 No match
 
-/a[^]b/<JS>
+/a[^]b/alt_bsux,allow_empty_class,match_unset_backref,dupnames
     aXb
  0: aXb
     a\nb 
  0: a\x0ab
-    ** Failers
-No match
+\= Expect no match
     ab  
 No match
     
-/a[^]+b/<JS> 
+/a[^]+b/alt_bsux,allow_empty_class,match_unset_backref,dupnames
     aXb
  0: aXb
     a\nX\nXb 
  0: a\x0aX\x0aXb
-    ** Failers
-No match
+\= Expect no match
     ab  
 No match
 
-/a(?!)b/BZ
+/a(?!)b/B
 ------------------------------------------------------------------
         Bra
         a
@@ -9306,7 +8684,7 @@
         End
 ------------------------------------------------------------------
 
-/(?!)?a/BZ
+/(?!)?a/B
 ------------------------------------------------------------------
         Bra
         Brazero
@@ -9320,22 +8698,18 @@
  0: a
 
 /a(*FAIL)+b/
-Failed: nothing to repeat at offset 8
+Failed: error 109 at offset 8: quantifier does not follow a repeatable item
 
-/(abc|pqr|123){0}[xyz]/SI
+/(abc|pqr|123){0}[xyz]/I
 Capturing subpattern count = 1
-No options
-No first char
-No need char
+Starting code units: x y z 
 Subject length lower bound = 1
-Starting chars: x y z 
 
-/(?(?=.*b)b|^)/CI
+/(?(?=.*b)b|^)/I,auto_callout
 Capturing subpattern count = 0
 May match empty string
-Options:
-No first char
-No need char
+Options: auto_callout
+Subject length lower bound = 0
    adc
 --->adc
  +0 ^       (?(?=.*b)b|^)
@@ -9373,17 +8747,14 @@
    
 /(?(?=b).*b|^d)/I
 Capturing subpattern count = 0
-No options
-No first char
-No need char
+Subject length lower bound = 1
 
 /(?(?=.*b).*b|^d)/I
 Capturing subpattern count = 0
-No options
-First char at start or follows newline
-No need char
+First code unit at start or follows newline
+Subject length lower bound = 1
 
-/xyz/C
+/xyz/auto_callout
   xyz 
 --->xyz
  +0 ^       x
@@ -9398,7 +8769,14 @@
  +2    ^ ^     z
  +3    ^  ^    
  0: xyz
-  abcxyz\Y
+\= Expect no match 
+  abc
+No match
+  abcxypqr  
+No match
+  
+/xyz/auto_callout,no_start_optimize
+  abcxyz 
 --->abcxyz
  +0 ^          x
  +0  ^         x
@@ -9408,11 +8786,8 @@
  +2    ^ ^     z
  +3    ^  ^    
  0: xyz
-  ** Failers 
-No match
+\= Expect no match 
   abc
-No match
-  abc\Y
 --->abc
  +0 ^       x
  +0  ^      x
@@ -9420,8 +8795,6 @@
  +0    ^    x
 No match
   abcxypqr  
-No match
-  abcxypqr\Y  
 --->abcxypqr
  +0 ^            x
  +0  ^           x
@@ -9436,7 +8809,7 @@
  +0         ^    x
 No match
   
-/(*NO_START_OPT)xyz/C
+/(*NO_START_OPT)xyz/auto_callout
   abcxyz
 --->abcxyz
 +15 ^          x
@@ -9448,7 +8821,7 @@
 +18    ^  ^    
  0: xyz
   
-/(*NO_AUTO_POSSESS)a+b/BZ  
+/(*NO_AUTO_POSSESS)a+b/B
 ------------------------------------------------------------------
         Bra
         a+
@@ -9457,7 +8830,7 @@
         End
 ------------------------------------------------------------------
 
-/xyz/CY
+/xyz/auto_callout,no_start_optimize
   abcxyz 
 --->abcxyz
  +0 ^          x
@@ -9469,7 +8842,7 @@
  +3    ^  ^    
  0: xyz
 
-/^"((?(?=[a])[^"])|b)*"$/C
+/^"((?(?=[a])[^"])|b)*"$/auto_callout
     "ab"
 --->"ab"
  +0 ^        ^
@@ -9505,7 +8878,8 @@
  1: 
 
 /^X(?5)(a)(?|(b)|(q))(c)(d)Y/
-Failed: reference to non-existent subpattern at offset 5
+Failed: error 115 at offset 5: reference to non-existent subpattern
+    XYabcdY
 
 /^X(?&N)(a)(?|(b)|(q))(c)(d)(?<N>Y)/
     XYabcdY
@@ -9517,308 +8891,316 @@
  5: Y
  
 /Xa{2,4}b/
-    X\P
+    X\=ps
 Partial match: X
-    Xa\P
+    Xa\=ps
 Partial match: Xa
-    Xaa\P 
+    Xaa\=ps
 Partial match: Xaa
-    Xaaa\P
+    Xaaa\=ps
 Partial match: Xaaa
-    Xaaaa\P 
+    Xaaaa\=ps
 Partial match: Xaaaa
     
 /Xa{2,4}?b/
-    X\P
+    X\=ps
 Partial match: X
-    Xa\P
+    Xa\=ps
 Partial match: Xa
-    Xaa\P 
+    Xaa\=ps
 Partial match: Xaa
-    Xaaa\P
+    Xaaa\=ps
 Partial match: Xaaa
-    Xaaaa\P 
+    Xaaaa\=ps
 Partial match: Xaaaa
     
 /Xa{2,4}+b/
-    X\P
+    X\=ps
 Partial match: X
-    Xa\P
+    Xa\=ps
 Partial match: Xa
-    Xaa\P 
+    Xaa\=ps
 Partial match: Xaa
-    Xaaa\P
+    Xaaa\=ps
 Partial match: Xaaa
-    Xaaaa\P 
+    Xaaaa\=ps
 Partial match: Xaaaa
     
 /X\d{2,4}b/
-    X\P
+    X\=ps
 Partial match: X
-    X3\P
+    X3\=ps
 Partial match: X3
-    X33\P 
+    X33\=ps
 Partial match: X33
-    X333\P
+    X333\=ps
 Partial match: X333
-    X3333\P 
+    X3333\=ps
 Partial match: X3333
     
 /X\d{2,4}?b/
-    X\P
+    X\=ps
 Partial match: X
-    X3\P
+    X3\=ps
 Partial match: X3
-    X33\P 
+    X33\=ps
 Partial match: X33
-    X333\P
+    X333\=ps
 Partial match: X333
-    X3333\P 
+    X3333\=ps
 Partial match: X3333
     
 /X\d{2,4}+b/
-    X\P
+    X\=ps
 Partial match: X
-    X3\P
+    X3\=ps
 Partial match: X3
-    X33\P 
+    X33\=ps
 Partial match: X33
-    X333\P
+    X333\=ps
 Partial match: X333
-    X3333\P 
+    X3333\=ps
 Partial match: X3333
     
 /X\D{2,4}b/
-    X\P
+    X\=ps
 Partial match: X
-    Xa\P
+    Xa\=ps
 Partial match: Xa
-    Xaa\P 
+    Xaa\=ps
 Partial match: Xaa
-    Xaaa\P
+    Xaaa\=ps
 Partial match: Xaaa
-    Xaaaa\P 
+    Xaaaa\=ps
 Partial match: Xaaaa
     
 /X\D{2,4}?b/
-    X\P
+    X\=ps
 Partial match: X
-    Xa\P
+    Xa\=ps
 Partial match: Xa
-    Xaa\P 
+    Xaa\=ps
 Partial match: Xaa
-    Xaaa\P
+    Xaaa\=ps
 Partial match: Xaaa
-    Xaaaa\P 
+    Xaaaa\=ps
 Partial match: Xaaaa
     
 /X\D{2,4}+b/
-    X\P
+    X\=ps
 Partial match: X
-    Xa\P
+    Xa\=ps
 Partial match: Xa
-    Xaa\P 
+    Xaa\=ps
 Partial match: Xaa
-    Xaaa\P
+    Xaaa\=ps
 Partial match: Xaaa
-    Xaaaa\P 
+    Xaaaa\=ps
 Partial match: Xaaaa
     
 /X[abc]{2,4}b/
-    X\P
+    X\=ps
 Partial match: X
-    Xa\P
+    Xa\=ps
 Partial match: Xa
-    Xaa\P 
+    Xaa\=ps
 Partial match: Xaa
-    Xaaa\P
+    Xaaa\=ps
 Partial match: Xaaa
-    Xaaaa\P 
+    Xaaaa\=ps
 Partial match: Xaaaa
     
 /X[abc]{2,4}?b/
-    X\P
+    X\=ps
 Partial match: X
-    Xa\P
+    Xa\=ps
 Partial match: Xa
-    Xaa\P 
+    Xaa\=ps
 Partial match: Xaa
-    Xaaa\P
+    Xaaa\=ps
 Partial match: Xaaa
-    Xaaaa\P 
+    Xaaaa\=ps
 Partial match: Xaaaa
     
 /X[abc]{2,4}+b/
-    X\P
+    X\=ps
 Partial match: X
-    Xa\P
+    Xa\=ps
 Partial match: Xa
-    Xaa\P 
+    Xaa\=ps
 Partial match: Xaa
-    Xaaa\P
+    Xaaa\=ps
 Partial match: Xaaa
-    Xaaaa\P 
+    Xaaaa\=ps
 Partial match: Xaaaa
     
 /X[^a]{2,4}b/
-    X\P
+    X\=ps
 Partial match: X
-    Xz\P
+    Xz\=ps
 Partial match: Xz
-    Xzz\P 
+    Xzz\=ps
 Partial match: Xzz
-    Xzzz\P
+    Xzzz\=ps
 Partial match: Xzzz
-    Xzzzz\P 
+    Xzzzz\=ps
 Partial match: Xzzzz
     
 /X[^a]{2,4}?b/
-    X\P
+    X\=ps
 Partial match: X
-    Xz\P
+    Xz\=ps
 Partial match: Xz
-    Xzz\P 
+    Xzz\=ps
 Partial match: Xzz
-    Xzzz\P
+    Xzzz\=ps
 Partial match: Xzzz
-    Xzzzz\P 
+    Xzzzz\=ps
 Partial match: Xzzzz
     
 /X[^a]{2,4}+b/
-    X\P
+    X\=ps
 Partial match: X
-    Xz\P
+    Xz\=ps
 Partial match: Xz
-    Xzz\P 
+    Xzz\=ps
 Partial match: Xzz
-    Xzzz\P
+    Xzzz\=ps
 Partial match: Xzzz
-    Xzzzz\P 
+    Xzzzz\=ps
 Partial match: Xzzzz
     
 /(Y)X\1{2,4}b/
-    YX\P
+    YX\=ps
 Partial match: YX
-    YXY\P
+    YXY\=ps
 Partial match: YXY
-    YXYY\P 
+    YXYY\=ps
 Partial match: YXYY
-    YXYYY\P
+    YXYYY\=ps
 Partial match: YXYYY
-    YXYYYY\P 
+    YXYYYY\=ps
 Partial match: YXYYYY
     
 /(Y)X\1{2,4}?b/
-    YX\P
+    YX\=ps
 Partial match: YX
-    YXY\P
+    YXY\=ps
 Partial match: YXY
-    YXYY\P 
+    YXYY\=ps
 Partial match: YXYY
-    YXYYY\P
+    YXYYY\=ps
 Partial match: YXYYY
-    YXYYYY\P 
+    YXYYYY\=ps
 Partial match: YXYYYY
     
 /(Y)X\1{2,4}+b/
-    YX\P
+    YX\=ps
 Partial match: YX
-    YXY\P
+    YXY\=ps
 Partial match: YXY
-    YXYY\P 
+    YXYY\=ps
 Partial match: YXYY
-    YXYYY\P
+    YXYYY\=ps
 Partial match: YXYYY
-    YXYYYY\P 
+    YXYYYY\=ps
 Partial match: YXYYYY
     
-/\++\KZ|\d+X|9+Y/
-    ++++123999\P
+/\++\KZ|\d+X|9+Y/startchar
+    ++++123999\=ps
 Partial match: 123999
-    ++++123999Y\P
+    ++++123999Y\=ps
  0: 999Y
-    ++++Z1234\P 
- 0: Z
+    ++++Z1234\=ps
+ 0: ++++Z
+    ^^^^
 
 /Z(*F)/
-    Z\P
+\= Expect no match
+    Z\=ps
 No match
-    ZA\P 
+    ZA\=ps
 No match
     
 /Z(?!)/
-    Z\P 
+\= Expect no match
+    Z\=ps
 No match
-    ZA\P 
+    ZA\=ps
 No match
 
 /dog(sbody)?/
-    dogs\P
+    dogs\=ps
  0: dog
-    dogs\P\P 
+    dogs\=ph
 Partial match: dogs
     
 /dog(sbody)??/
-    dogs\P
+    dogs\=ps
  0: dog
-    dogs\P\P 
+    dogs\=ph
  0: dog
 
 /dog|dogsbody/
-    dogs\P
+    dogs\=ps
  0: dog
-    dogs\P\P 
+    dogs\=ph
  0: dog
  
 /dogsbody|dog/
-    dogs\P
+    dogs\=ps
  0: dog
-    dogs\P\P 
+    dogs\=ph
 Partial match: dogs
 
 /\bthe cat\b/
-    the cat\P
+    the cat\=ps
  0: the cat
-    the cat\P\P
+    the cat\=ph
 Partial match: the cat
 
 /abc/
-   abc\P
+   abc\=ps
  0: abc
-   abc\P\P
+   abc\=ph
  0: abc
    
-/abc\K123/
+/abc\K123/startchar
     xyzabc123pqr
- 0: 123
-    xyzabc12\P
+ 0: abc123
+    ^^^
+    xyzabc12\=ps
 Partial match: abc12
-    xyzabc12\P\P
+    xyzabc12\=ph
 Partial match: abc12
     
 /(?<=abc)123/
     xyzabc123pqr 
  0: 123
-    xyzabc12\P
-Partial match at offset 6: abc12
-    xyzabc12\P\P
-Partial match at offset 6: abc12
+    xyzabc12\=ps
+Partial match: abc12
+               <<<
+    xyzabc12\=ph
+Partial match: abc12
+               <<<
 
 /\babc\b/
     +++abc+++
  0: abc
-    +++ab\P
-Partial match at offset 3: +ab
-    +++ab\P\P  
-Partial match at offset 3: +ab
+    +++ab\=ps
+Partial match: +ab
+               <
+    +++ab\=ph
+Partial match: +ab
+               <
 
-/(?&word)(?&element)(?(DEFINE)(?<element><[^m][^>]>[^<])(?<word>\w*+))/BZ
+/(?&word)(?&element)(?(DEFINE)(?<element><[^m][^>]>[^<])(?<word>\w*+))/B
 ------------------------------------------------------------------
         Bra
         Recurse
         Recurse
         Cond
-        Cond def
+        Cond false
         CBra 1
         <
         [^m]
@@ -9834,13 +9216,13 @@
         End
 ------------------------------------------------------------------
 
-/(?&word)(?&element)(?(DEFINE)(?<element><[^\d][^>]>[^<])(?<word>\w*+))/BZ
+/(?&word)(?&element)(?(DEFINE)(?<element><[^\d][^>]>[^<])(?<word>\w*+))/B
 ------------------------------------------------------------------
         Bra
         Recurse
         Recurse
         Cond
-        Cond def
+        Cond false
         CBra 1
         <
         [\x00-/:-\xff] (neg)
@@ -9856,7 +9238,7 @@
         End
 ------------------------------------------------------------------
 
-/(ab)(x(y)z(cd(*ACCEPT)))pq/BZ
+/(ab)(x(y)z(cd(*ACCEPT)))pq/B
 ------------------------------------------------------------------
         Bra
         CBra 1
@@ -9880,74 +9262,72 @@
         End
 ------------------------------------------------------------------
 
-/abc\K/+
+/abc\K/aftertext,startchar
     abcdef
- 0: 
+ 0: abc
+    ^^^
  0+ def
-    abcdef\N\N
- 0: 
+    abcdef\=notempty_atstart
+ 0: abc
+    ^^^
  0+ def
-    xyzabcdef\N\N
- 0: 
+    xyzabcdef\=notempty_atstart
+ 0: abc
+    ^^^
  0+ def
-    ** Failers
+\= Expect no match
+    abcdef\=notempty
 No match
-    abcdef\N 
-No match
-    xyzabcdef\N
+    xyzabcdef\=notempty
 No match
     
-/^(?:(?=abc)|abc\K)/+
+/^(?:(?=abc)|abc\K)/aftertext,startchar
     abcdef
  0: 
  0+ abcdef
-    abcdef\N\N 
- 0: 
+    abcdef\=notempty_atstart
+ 0: abc
+    ^^^
  0+ def
-    ** Failers 
-No match
-    abcdef\N 
+\= Expect no match 
+    abcdef\=notempty
 No match
 
-/a?b?/+
+/a?b?/aftertext
     xyz
  0: 
  0+ xyz
     xyzabc
  0: 
  0+ xyzabc
-    xyzabc\N
+    xyzabc\=notempty
  0: ab
  0+ c
-    xyzabc\N\N
+    xyzabc\=notempty_atstart
  0: 
  0+ yzabc
-    xyz\N\N    
+    xyz\=notempty_atstart
  0: 
  0+ yz
-    ** Failers 
- 0: 
- 0+ ** Failers
-    xyz\N 
+\= Expect no match 
+    xyz\=notempty
 No match
 
-/^a?b?/+
+/^a?b?/aftertext
     xyz
  0: 
  0+ xyz
     xyzabc
  0: 
  0+ xyzabc
-    ** Failers 
- 0: 
- 0+ ** Failers
-    xyzabc\N
+\= Expect no match 
+    xyzabc\=notempty
 No match
-    xyzabc\N\N
+    xyzabc\=notempty_atstart
 No match
-    xyz\N\N    
+    xyz\=notempty_atstart
 No match
-    xyz\N 
+    xyz\=notempty
 No match
     
 /^(?<name>a|b\g<name>c)/
@@ -10050,8 +9430,7 @@
     XaaX
  0: aa
  1: a
-    ** Failers 
-No match
+\= Expect no match 
     XAAX 
 No match
 
@@ -10093,145 +9472,112 @@
  1: a
 
 /(a)(?<=b\1)/
-Failed: lookbehind assertion is not fixed length at offset 10
+Failed: error 125 at offset 10: lookbehind assertion is not fixed length
 
 /(a)(?<=b+(?1))/
-Failed: lookbehind assertion is not fixed length at offset 13
+Failed: error 125 at offset 13: lookbehind assertion is not fixed length
 
 /(a+)(?<=b(?1))/
-Failed: lookbehind assertion is not fixed length at offset 14
+Failed: error 125 at offset 14: lookbehind assertion is not fixed length
 
 /(a(?<=b(?1)))/
-Failed: lookbehind assertion is not fixed length at offset 13
+Failed: error 125 at offset 13: lookbehind assertion is not fixed length
 
 /(?<=b(?1))xyz/
-Failed: reference to non-existent subpattern at offset 8
+Failed: error 115 at offset 8: reference to non-existent subpattern
 
 /(?<=b(?1))xyz(b+)pqrstuvew/
-Failed: lookbehind assertion is not fixed length at offset 26
+Failed: error 125 at offset 26: lookbehind assertion is not fixed length
 
-/(a|bc)\1/SI
+/(a|bc)\1/I
 Capturing subpattern count = 1
 Max back reference = 1
-No options
-No first char
-No need char
+Starting code units: a b 
 Subject length lower bound = 2
-Starting chars: a b 
 
-/(a|bc)\1{2,3}/SI
+/(a|bc)\1{2,3}/I
 Capturing subpattern count = 1
 Max back reference = 1
-No options
-No first char
-No need char
+Starting code units: a b 
 Subject length lower bound = 3
-Starting chars: a b 
 
-/(a|bc)(?1)/SI
+/(a|bc)(?1)/I
 Capturing subpattern count = 1
-No options
-No first char
-No need char
+Starting code units: a b 
 Subject length lower bound = 2
-Starting chars: a b 
 
-/(a|b\1)(a|b\1)/SI
+/(a|b\1)(a|b\1)/I
 Capturing subpattern count = 2
 Max back reference = 1
-No options
-No first char
-No need char
+Starting code units: a b 
 Subject length lower bound = 2
-Starting chars: a b 
 
-/(a|b\1){2}/SI
+/(a|b\1){2}/I
 Capturing subpattern count = 1
 Max back reference = 1
-No options
-No first char
-No need char
+Starting code units: a b 
 Subject length lower bound = 2
-Starting chars: a b 
 
-/(a|bbbb\1)(a|bbbb\1)/SI
+/(a|bbbb\1)(a|bbbb\1)/I
 Capturing subpattern count = 2
 Max back reference = 1
-No options
-No first char
-No need char
+Starting code units: a b 
 Subject length lower bound = 2
-Starting chars: a b 
 
-/(a|bbbb\1){2}/SI
+/(a|bbbb\1){2}/I
 Capturing subpattern count = 1
 Max back reference = 1
-No options
-No first char
-No need char
+Starting code units: a b 
 Subject length lower bound = 2
-Starting chars: a b 
 
-/^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]/SI
+/^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]/I
 Capturing subpattern count = 1
-Options: anchored
-No first char
-Need char = ':'
+Compile options: <none>
+Overall options: anchored
+Last code unit = ':'
 Subject length lower bound = 22
-No starting char list
 
-/<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>/isIS
+/<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>/Iis
 Capturing subpattern count = 11
 Options: caseless dotall
-First char = '<'
-Need char = '>'
+First code unit = '<'
+Last code unit = '>'
 Subject length lower bound = 47
-No starting char list
 
-"(?>.*/)foo"SI
+"(?>.*/)foo"I
 Capturing subpattern count = 0
-No options
-No first char
-Need char = 'o'
+Last code unit = 'o'
 Subject length lower bound = 4
-No starting char list
 
-/(?(?=[^a-z]+[a-z])  \d{2}-[a-z]{3}-\d{2}  |  \d{2}-\d{2}-\d{2} ) /xSI
+/(?(?=[^a-z]+[a-z])  \d{2}-[a-z]{3}-\d{2}  |  \d{2}-\d{2}-\d{2} ) /Ix
 Capturing subpattern count = 0
 Options: extended
-No first char
-Need char = '-'
+Last code unit = '-'
 Subject length lower bound = 8
-No starting char list
 
-/(?:(?:(?:(?:(?:(?:(?:(?:(?:(a|b|c))))))))))/iSI
+/(?:(?:(?:(?:(?:(?:(?:(?:(?:(a|b|c))))))))))/Ii
 Capturing subpattern count = 1
 Options: caseless
-No first char
-No need char
+Starting code units: A B C a b c 
 Subject length lower bound = 1
-Starting chars: A B C a b c 
 
-/(?:c|d)(?:)(?:aaaaaaaa(?:)(?:bbbbbbbb)(?:bbbbbbbb(?:))(?:bbbbbbbb(?:)(?:bbbbbbbb)))/SI
+/(?:c|d)(?:)(?:aaaaaaaa(?:)(?:bbbbbbbb)(?:bbbbbbbb(?:))(?:bbbbbbbb(?:)(?:bbbbbbbb)))/I
 Capturing subpattern count = 0
-No options
-No first char
-Need char = 'b'
+Starting code units: c d 
+Last code unit = 'b'
 Subject length lower bound = 41
-Starting chars: c d 
 
 /<a[\s]+href[\s]*=[\s]*          # find <a href=
  ([\"\'])?                       # find single or double quote
  (?(1) (.*?)\1 | ([^\s]+))       # if quote found, match up to next matching
                                  # quote, otherwise match up to next space
-/isxSI
+/Iisx
 Capturing subpattern count = 3
 Max back reference = 1
-Options: caseless extended dotall
-First char = '<'
-Need char = '='
+Options: caseless dotall extended
+First code unit = '<'
+Last code unit = '='
 Subject length lower bound = 9
-No starting char list
 
 /^(?!:)                       # colon disallowed at start
   (?:                         # start of item
@@ -10241,39 +9587,37 @@
   ){1,7}                      # end item; 1-7 of them required               
   [0-9a-f]{1,4} $             # final hex number at end of string
   (?(1)|.)                    # check that there was an empty component
-  /xiIS
+  /Iix
 Capturing subpattern count = 1
 Max back reference = 1
-Options: anchored caseless extended
-No first char
-Need char = ':'
+Compile options: caseless extended
+Overall options: anchored caseless extended
+Last code unit = ':'
 Subject length lower bound = 2
-No starting char list
 
 /(?|(?<a>A)|(?<a>B))/I
 Capturing subpattern count = 1
 Named capturing subpatterns:
   a   1
-No options
-No first char
-No need char
-    AB\Ca
+Starting code units: A B 
+Subject length lower bound = 1
+    AB\=copy=a
  0: A
  1: A
-  C A (1) a
-    BA\Ca
+  C A (1) a (group 1)
+    BA\=copy=a
  0: B
  1: B
-  C B (1) a
+  C B (1) a (group 1)
 
-/(?|(?<a>A)|(?<b>B))/ 
-Failed: different names for subpatterns of the same number are not allowed at offset 15
+/(?|(?<a>A)|(?<b>B))/
+Failed: error 165 at offset 15: different names for subpatterns of the same number are not allowed
 
 /(?:a(?<quote> (?<apostrophe>')|(?<realquote>")) |
     b(?<quote> (?<apostrophe>')|(?<realquote>")) ) 
-    (?('quote')[a-z]+|[0-9]+)/JIx
+    (?('quote')[a-z]+|[0-9]+)/Ix,dupnames
 Capturing subpattern count = 6
-Max back reference = 1
+Max back reference = 4
 Named capturing subpatterns:
   apostrophe   2
   apostrophe   5
@@ -10281,9 +9625,9 @@
   quote        4
   realquote    3
   realquote    6
-Options: extended dupnames
-No first char
-No need char
+Options: dupnames extended
+Starting code units: a b 
+Subject length lower bound = 3
     a"aaaaa
  0: a"aaaaa
  1: "
@@ -10297,14 +9641,13 @@
  4: "
  5: <unset>
  6: "
-    ** Failers 
-No match
+\= Expect no match 
     b"11111
 No match
     a"11111 
 No match
     
-/^(?|(a)(b)(c)(?<D>d)|(?<D>e)) (?('D')X|Y)/JDZx
+/^(?|(a)(b)(c)(?<D>d)|(?<D>e)) (?('D')X|Y)/IBx,dupnames
 ------------------------------------------------------------------
         Bra
         ^
@@ -10340,9 +9683,9 @@
 Named capturing subpatterns:
   D   4
   D   1
-Options: anchored extended dupnames
-No first char
-No need char
+Compile options: dupnames extended
+Overall options: anchored dupnames extended
+Subject length lower bound = 2
     abcdX
  0: abcdX
  1: a
@@ -10352,14 +9695,13 @@
     eX
  0: eX
  1: e
-    ** Failers
-No match
+\= Expect no match
     abcdY
 No match
     ey     
 No match
     
-/(?<A>a) (b)(c)  (?<A>d  (?(R&A)$ | (?4)) )/JDZx
+/(?<A>a) (b)(c)  (?<A>d  (?(R&A)$ | (?4)) )/IBx,dupnames
 ------------------------------------------------------------------
         Bra
         CBra 1
@@ -10384,62 +9726,62 @@
         End
 ------------------------------------------------------------------
 Capturing subpattern count = 4
-Max back reference = 1
+Max back reference = 4
 Named capturing subpatterns:
   A   1
   A   4
-Options: extended dupnames
-First char = 'a'
-Need char = 'd'
+Options: dupnames extended
+First code unit = 'a'
+Last code unit = 'd'
+Subject length lower bound = 4
     abcdd
  0: abcdd
  1: a
  2: b
  3: c
  4: dd
-    ** Failers
-No match
+\= Expect no match
     abcdde  
 No match
 
 /abcd*/
-    xxxxabcd\P
+    xxxxabcd\=ps
  0: abcd
-    xxxxabcd\P\P
+    xxxxabcd\=ph
 Partial match: abcd
 
 /abcd*/i
-    xxxxabcd\P
+    xxxxabcd\=ps
  0: abcd
-    xxxxabcd\P\P
+    xxxxabcd\=ph
 Partial match: abcd
-    XXXXABCD\P
+    XXXXABCD\=ps
  0: ABCD
-    XXXXABCD\P\P
+    XXXXABCD\=ph
 Partial match: ABCD
 
 /abc\d*/
-    xxxxabc1\P
+    xxxxabc1\=ps
  0: abc1
-    xxxxabc1\P\P
+    xxxxabc1\=ph
 Partial match: abc1
 
 /(a)bc\1*/
-    xxxxabca\P
+    xxxxabca\=ps
  0: abca
  1: a
-    xxxxabca\P\P
+    xxxxabca\=ph
 Partial match: abca
 
 /abc[de]*/
-    xxxxabcde\P
+    xxxxabcde\=ps
  0: abcde
-    xxxxabcde\P\P
+    xxxxabcde\=ph
 Partial match: abcde
 
-/-- This is not in the Perl-compatible test because Perl seems currently to be
-    broken and not behaving as specified in that it *does* bumpalong after
-    hitting (*COMMIT). --/
+# This is not in the Perl-compatible test because Perl seems currently to be
+# broken and not behaving as specified in that it *does* bumpalong after
+# hitting (*COMMIT). 
 
 /(?1)(A(*COMMIT)|B)D/
     ABD
@@ -10454,70 +9796,59 @@
     ABXABD  
  0: ABD
  1: B
-    ** Failers 
-No match
+\= Expect no match 
     ABX 
 No match
     BAXBAD  
 No match
 
-/(\3)(\1)(a)/<JS>
+/(\3)(\1)(a)/alt_bsux,allow_empty_class,match_unset_backref,dupnames
     cat
  0: a
  1: 
  2: 
  3: a
 
-/(\3)(\1)(a)/SI<JS>
+/(\3)(\1)(a)/I,alt_bsux,allow_empty_class,match_unset_backref,dupnames
 Capturing subpattern count = 3
 Max back reference = 3
-Options:
-No first char
-Need char = 'a'
+Options: alt_bsux allow_empty_class dupnames match_unset_backref
+Last code unit = 'a'
 Subject length lower bound = 1
-No starting char list
     cat
  0: a
  1: 
  2: 
  3: a
 
-/(\3)(\1)(a)/SI
+/(\3)(\1)(a)/I
 Capturing subpattern count = 3
 Max back reference = 3
-No options
-No first char
-Need char = 'a'
+Last code unit = 'a'
 Subject length lower bound = 3
-No starting char list
+\= Expect no match
     cat
 No match
 
-/i(?(DEFINE)(?<s>a))/SI
+/i(?(DEFINE)(?<s>a))/I
 Capturing subpattern count = 1
 Named capturing subpatterns:
   s   1
-No options
-First char = 'i'
-No need char
+First code unit = 'i'
 Subject length lower bound = 1
-No starting char list
     i
  0: i
     
-/()i(?(1)a)/SI 
+/()i(?(1)a)/I
 Capturing subpattern count = 1
 Max back reference = 1
-No options
-No first char
-Need char = 'i'
+First code unit = 'i'
 Subject length lower bound = 1
-Starting chars: i 
     ia
  0: ia
  1: 
 
-/(?i)a(?-i)b|c/BZ
+/(?i)a(?-i)b|c/B
 ------------------------------------------------------------------
         Bra
      /i a
@@ -10533,12 +9864,11 @@
  0: Ab
     CcC 
  0: c
-    ** Failers
-No match
+\= Expect no match
     XABX   
 No match
 
-/(?i)a(?s)b|c/BZ
+/(?i)a(?s)b|c/B
 ------------------------------------------------------------------
         Bra
      /i ab
@@ -10548,7 +9878,7 @@
         End
 ------------------------------------------------------------------
 
-/(?i)a(?s-i)b|c/BZ
+/(?i)a(?s-i)b|c/B
 ------------------------------------------------------------------
         Bra
      /i a
@@ -10559,7 +9889,7 @@
         End
 ------------------------------------------------------------------
 
-/^(ab(c\1)d|x){2}$/BZ
+/^(ab(c\1)d|x){2}$/B
 ------------------------------------------------------------------
         Bra
         ^
@@ -10596,7 +9926,7 @@
  1: abcxd
  2: cx
     
-/^(?&t)*+(?(DEFINE)(?<t>.))$/BZ
+/^(?&t)*+(?(DEFINE)(?<t>.))$/B
 ------------------------------------------------------------------
         Bra
         ^
@@ -10605,7 +9935,7 @@
         Recurse
         KetRpos
         Cond
-        Cond def
+        Cond false
         CBra 1
         Any
         Ket
@@ -10615,7 +9945,7 @@
         End
 ------------------------------------------------------------------
 
-/^(?&t)*(?(DEFINE)(?<t>.))$/BZ
+/^(?&t)*(?(DEFINE)(?<t>.))$/B
 ------------------------------------------------------------------
         Bra
         ^
@@ -10624,7 +9954,7 @@
         Recurse
         KetRmax
         Cond
-        Cond def
+        Cond false
         CBra 1
         Any
         Ket
@@ -10634,78 +9964,90 @@
         End
 ------------------------------------------------------------------
 
-/ -- This one is here because Perl gives the match as "b" rather than "ab". I
-     believe this to be a Perl bug. --/  
+# This one is here because Perl gives the match as "b" rather than "ab". I
+# believe this to be a Perl bug.
       
 /(?>a\Kb)z|(ab)/
-    ab 
+    ab\=startchar 
  0: ab
  1: ab
 
 /(?P<L1>(?P<L2>0|)|(?P>L2)(?P>L1))/
-Failed: recursive call could loop indefinitely at offset 31
+    abcd
+ 0: 
+ 1: 
+ 2: 
+    0abc 
+ 0: 0
+ 1: 0
+ 2: 0
 
 /abc(*MARK:)pqr/
-Failed: (*MARK) must have an argument at offset 10
+Failed: error 166 at offset 10: (*MARK) must have an argument
 
 /abc(*:)pqr/
-Failed: (*MARK) must have an argument at offset 6
+Failed: error 166 at offset 6: (*MARK) must have an argument
 
 /abc(*FAIL:123)xyz/
-Failed: an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT) at offset 13
+Failed: error 159 at offset 13: an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)
 
-/--- This should, and does, fail. In Perl, it does not, which I think is a 
-     bug because replacing the B in the pattern by (B|D) does make it fail. ---/
+# This should, and does, fail. In Perl, it does not, which I think is a 
+# bug because replacing the B in the pattern by (B|D) does make it fail.
 
-/A(*COMMIT)B/+K
+/A(*COMMIT)B/aftertext,mark
+\= Expect no match
     ACABX
 No match
 
-/--- These should be different, but in Perl they are not, which I think
-     is a bug in Perl. ---/
+# These should be different, but in Perl they are not, which I think
+# is a bug in Perl.
 
-/A(*THEN)B|A(*THEN)C/K
+/A(*THEN)B|A(*THEN)C/mark
     AC
  0: AC
 
-/A(*PRUNE)B|A(*PRUNE)C/K
+/A(*PRUNE)B|A(*PRUNE)C/mark
+\= Expect no match
     AC
 No match
     
-/--- Mark names can be duplicated. Perl doesn't give a mark for this one,
-though PCRE does. ---/
+# Mark names can be duplicated. Perl doesn't give a mark for this one,
+# though PCRE2 does.
 
-/^A(*:A)B|^X(*:A)Y/K
-    ** Failers
-No match
+/^A(*:A)B|^X(*:A)Y/mark
+\= Expect no match
     XAQQ
 No match, mark = A
     
-/--- COMMIT at the start of a pattern should be the same as an anchor. Perl 
-optimizations defeat this. So does the PCRE optimization unless we disable it 
-with \Y. ---/
+# COMMIT at the start of a pattern should be the same as an anchor. Perl 
+# optimizations defeat this. So does the PCRE2 optimization unless we disable
+# it.
 
 /(*COMMIT)ABC/
     ABCDEFG
  0: ABC
-    ** Failers
-No match
-    DEFGABC\Y  
+    
+/(*COMMIT)ABC/no_start_optimize
+\= Expect no match
+    DEFGABC
 No match
     
 /^(ab (c+(*THEN)cd) | xyz)/x
+\= Expect no match
     abcccd  
 No match
 
 /^(ab (c+(*PRUNE)cd) | xyz)/x
+\= Expect no match
     abcccd  
 No match
 
 /^(ab (c+(*FAIL)cd) | xyz)/x
+\= Expect no match
     abcccd  
 No match
     
-/--- Perl gets some of these wrong ---/ 
+# Perl gets some of these wrong
 
 /(?>.(*ACCEPT))*?5/
     abcde
@@ -10726,7 +10068,7 @@
  0: a
  1: a
 
-/A\NB./BZ
+/A\NB./B
 ------------------------------------------------------------------
         Bra
         A
@@ -10738,14 +10080,13 @@
 ------------------------------------------------------------------
     ACBD
  0: ACBD
-    *** Failers
-No match
+\= Expect no match
     A\nB
 No match
     ACB\n   
 No match
 
-/A\NB./sBZ
+/A\NB./Bs
 ------------------------------------------------------------------
         Bra
         A
@@ -10759,22 +10100,20 @@
  0: ACBD
     ACB\n 
  0: ACB\x0a
-    *** Failers
-No match
+\= Expect no match
     A\nB  
 No match
   
-/A\NB/<crlf>
+/A\NB/newline=crlf
     A\nB
  0: A\x0aB
     A\rB
  0: A\x0dB
-    ** Failers
-No match
+\= Expect no match
     A\r\nB    
 No match
 
-/\R+b/BZ
+/\R+b/B
 ------------------------------------------------------------------
         Bra
         \R++
@@ -10783,7 +10122,7 @@
         End
 ------------------------------------------------------------------
 
-/\R+\n/BZ
+/\R+\n/B
 ------------------------------------------------------------------
         Bra
         \R+
@@ -10792,7 +10131,7 @@
         End
 ------------------------------------------------------------------
 
-/\R+\d/BZ
+/\R+\d/B
 ------------------------------------------------------------------
         Bra
         \R++
@@ -10801,7 +10140,7 @@
         End
 ------------------------------------------------------------------
 
-/\d*\R/BZ
+/\d*\R/B
 ------------------------------------------------------------------
         Bra
         \d*+
@@ -10810,7 +10149,7 @@
         End
 ------------------------------------------------------------------
 
-/\s*\R/BZ
+/\s*\R/B
 ------------------------------------------------------------------
         Bra
         \s*
@@ -10825,7 +10164,7 @@
     \x20\x0d\x0a
  0:  \x0d\x0a
 
-/\S*\R/BZ
+/\S*\R/B
 ------------------------------------------------------------------
         Bra
         \S*+
@@ -10836,7 +10175,7 @@
     a\x0a
  0: a\x0a
 
-/X\h*\R/BZ
+/X\h*\R/B
 ------------------------------------------------------------------
         Bra
         X
@@ -10848,7 +10187,7 @@
     X\x20\x0a
  0: X \x0a
 
-/X\H*\R/BZ
+/X\H*\R/B
 ------------------------------------------------------------------
         Bra
         X
@@ -10860,7 +10199,7 @@
     X\x0d\x0a
  0: X\x0d\x0a
 
-/X\H+\R/BZ
+/X\H+\R/B
 ------------------------------------------------------------------
         Bra
         X
@@ -10872,7 +10211,7 @@
     X\x0d\x0a
  0: X\x0d\x0a
 
-/X\H++\R/BZ
+/X\H++\R/B
 ------------------------------------------------------------------
         Bra
         X
@@ -10881,19 +10220,21 @@
         Ket
         End
 ------------------------------------------------------------------
+\= Expect no match
     X\x0d\x0a
 No match
 
 /(?<=abc)def/
-    abc\P\P
-Partial match at offset 3: abc
+    abc\=ph
+Partial match: abc
+               <<<
 
 /abc$/
     abc
  0: abc
-    abc\P
+    abc\=ps
  0: abc
-    abc\P\P
+    abc\=ph
 Partial match: abc
 
 /abc$/m
@@ -10901,65 +10242,69 @@
  0: abc
     abc\n
  0: abc
-    abc\P\P
+    abc\=ph
 Partial match: abc
-    abc\n\P\P 
+    abc\n\=ph
  0: abc
-    abc\P
+    abc\=ps
  0: abc
-    abc\n\P
+    abc\n\=ps
  0: abc
 
 /abc\z/
     abc
  0: abc
-    abc\P
+    abc\=ps
  0: abc
-    abc\P\P
+    abc\=ph
 Partial match: abc
 
 /abc\Z/
     abc
  0: abc
-    abc\P
+    abc\=ps
  0: abc
-    abc\P\P
+    abc\=ph
 Partial match: abc
 
 /abc\b/
     abc
  0: abc
-    abc\P
+    abc\=ps
  0: abc
-    abc\P\P
+    abc\=ph
 Partial match: abc
 
 /abc\B/
+    abc\=ps
+Partial match: abc
+    abc\=ph
+Partial match: abc
+\= Expect no match
     abc
 No match
-    abc\P
-Partial match: abc
-    abc\P\P
-Partial match: abc
 
 /.+/
-    abc\>0
+\= Bad offsets
+    abc\=offset=4
+Failed: error -33: bad offset value
+    abc\=offset=-4 
+** Invalid value in 'offset=-4'
+\= Valid data
+    abc\=offset=0
  0: abc
-    abc\>1
+    abc\=offset=1
  0: bc
-    abc\>2
+    abc\=offset=2
  0: c
-    abc\>3
+\= Expect no match
+    abc\=offset=3
 No match
-    abc\>4
-Error -24 (bad offset value)
-    abc\>-4 
-Error -24 (bad offset value)
 
 /^\cģ/
-Failed: \c must be followed by an ASCII character at offset 3
+Failed: error 168 at offset 3: \c must be followed by a printable ASCII character
 
-/(?P<abn>(?P=abn)xxx)/BZ
+/(?P<abn>(?P=abn)xxx)/B
 ------------------------------------------------------------------
         Bra
         Once
@@ -10972,7 +10317,7 @@
         End
 ------------------------------------------------------------------
 
-/(a\1z)/BZ
+/(a\1z)/B
 ------------------------------------------------------------------
         Bra
         Once
@@ -10986,13 +10331,13 @@
         End
 ------------------------------------------------------------------
 
-/(?P<abn>(?P=abn)(?<badstufxxx)/BZ
-Failed: syntax error in subpattern name (missing terminator) at offset 29
+/(?P<abn>(?P=abn)(?<badstufxxx)/B
+Failed: error 142 at offset 29: syntax error in subpattern name (missing terminator)
 
-/(?P<abn>(?P=axn)xxx)/BZ
-Failed: reference to non-existent subpattern at offset 15
+/(?P<abn>(?P=axn)xxx)/B
+Failed: error 115 at offset 15: reference to non-existent subpattern
 
-/(?P<abn>(?P=axn)xxx)(?<axn>yy)/BZ
+/(?P<abn>(?P=axn)xxx)(?<axn>yy)/B
 ------------------------------------------------------------------
         Bra
         CBra 1
@@ -11006,7 +10351,7 @@
         End
 ------------------------------------------------------------------
 
-/-- These tests are here because Perl gets the first one wrong. --/
+# These tests are here because Perl gets the first one wrong. 
 
 /(\R*)(.)/s
     \r\n
@@ -11050,9 +10395,9 @@
  1: \x0d\x0d\x0a\x0a
  2: \x0d
 
-/-- --/
+# ------------- 
 
-/^abc$/BZ
+/^abc$/B
 ------------------------------------------------------------------
         Bra
         ^
@@ -11062,7 +10407,7 @@
         End
 ------------------------------------------------------------------
 
-/^abc$/BZm
+/^abc$/Bm
 ------------------------------------------------------------------
         Bra
      /m ^
@@ -11072,26 +10417,24 @@
         End
 ------------------------------------------------------------------
 
-/^(a)*+(\w)/S
+/^(a)*+(\w)/
     aaaaX
  0: aaaaX
  1: a
  2: X
-    ** Failers 
-No match
+\= Expect no match 
     aaaa
 No match
 
-/^(?:a)*+(\w)/S
+/^(?:a)*+(\w)/
     aaaaX
  0: aaaaX
  1: X
-    ** Failers 
-No match
+\= Expect no match 
     aaaa
 No match
 
-/(a)++1234/SDZ
+/(a)++1234/IB
 ------------------------------------------------------------------
         Bra
         CBraPos 1
@@ -11102,178 +10445,167 @@
         End
 ------------------------------------------------------------------
 Capturing subpattern count = 1
-No options
-First char = 'a'
-Need char = '4'
+First code unit = 'a'
+Last code unit = '4'
 Subject length lower bound = 5
-No starting char list
 
-/([abc])++1234/SI
+/([abc])++1234/I
 Capturing subpattern count = 1
-No options
-No first char
-Need char = '4'
+Starting code units: a b c 
+Last code unit = '4'
 Subject length lower bound = 5
-Starting chars: a b c 
 
 /(?<=(abc)+)X/
-Failed: lookbehind assertion is not fixed length at offset 10
+Failed: error 125 at offset 10: lookbehind assertion is not fixed length
 
 /(^ab)/I
 Capturing subpattern count = 1
-Options: anchored
-No first char
-No need char
+Compile options: <none>
+Overall options: anchored
+Subject length lower bound = 2
 
 /(^ab)++/I
 Capturing subpattern count = 1
-Options: anchored
-No first char
-No need char
+Compile options: <none>
+Overall options: anchored
+Subject length lower bound = 2
 
 /(^ab|^)+/I
 Capturing subpattern count = 1
 May match empty string
-Options: anchored
-No first char
-No need char
+Compile options: <none>
+Overall options: anchored
+Subject length lower bound = 0
 
 /(^ab|^)++/I
 Capturing subpattern count = 1
 May match empty string
-Options: anchored
-No first char
-No need char
+Compile options: <none>
+Overall options: anchored
+Subject length lower bound = 0
 
 /(?:^ab)/I
 Capturing subpattern count = 0
-Options: anchored
-No first char
-No need char
+Compile options: <none>
+Overall options: anchored
+Subject length lower bound = 2
 
 /(?:^ab)++/I
 Capturing subpattern count = 0
-Options: anchored
-No first char
-No need char
+Compile options: <none>
+Overall options: anchored
+Subject length lower bound = 2
 
 /(?:^ab|^)+/I
 Capturing subpattern count = 0
 May match empty string
-Options: anchored
-No first char
-No need char
+Compile options: <none>
+Overall options: anchored
+Subject length lower bound = 0
 
 /(?:^ab|^)++/I
 Capturing subpattern count = 0
 May match empty string
-Options: anchored
-No first char
-No need char
+Compile options: <none>
+Overall options: anchored
+Subject length lower bound = 0
 
 /(.*ab)/I
 Capturing subpattern count = 1
-No options
-First char at start or follows newline
-Need char = 'b'
+First code unit at start or follows newline
+Last code unit = 'b'
+Subject length lower bound = 2
 
 /(.*ab)++/I
 Capturing subpattern count = 1
-No options
-First char at start or follows newline
-Need char = 'b'
+First code unit at start or follows newline
+Last code unit = 'b'
+Subject length lower bound = 2
 
 /(.*ab|.*)+/I
 Capturing subpattern count = 1
 May match empty string
-No options
-First char at start or follows newline
-No need char
+First code unit at start or follows newline
+Subject length lower bound = 0
 
 /(.*ab|.*)++/I
 Capturing subpattern count = 1
 May match empty string
-No options
-First char at start or follows newline
-No need char
+First code unit at start or follows newline
+Subject length lower bound = 0
 
 /(?:.*ab)/I
 Capturing subpattern count = 0
-No options
-First char at start or follows newline
-Need char = 'b'
+First code unit at start or follows newline
+Last code unit = 'b'
+Subject length lower bound = 2
 
 /(?:.*ab)++/I
 Capturing subpattern count = 0
-No options
-First char at start or follows newline
-Need char = 'b'
+First code unit at start or follows newline
+Last code unit = 'b'
+Subject length lower bound = 2
 
 /(?:.*ab|.*)+/I
 Capturing subpattern count = 0
 May match empty string
-No options
-First char at start or follows newline
-No need char
+First code unit at start or follows newline
+Subject length lower bound = 0
 
 /(?:.*ab|.*)++/I
 Capturing subpattern count = 0
 May match empty string
-No options
-First char at start or follows newline
-No need char
+First code unit at start or follows newline
+Subject length lower bound = 0
 
 /(?=a)[bcd]/I
 Capturing subpattern count = 0
-No options
-First char = 'a'
-No need char
+First code unit = 'a'
+Subject length lower bound = 1
 
 /((?=a))[bcd]/I
 Capturing subpattern count = 1
-No options
-First char = 'a'
-No need char
+First code unit = 'a'
+Subject length lower bound = 1
 
 /((?=a))+[bcd]/I
 Capturing subpattern count = 1
-No options
-First char = 'a'
-No need char
+First code unit = 'a'
+Subject length lower bound = 1
 
 /((?=a))++[bcd]/I
 Capturing subpattern count = 1
-No options
-First char = 'a'
-No need char
+First code unit = 'a'
+Subject length lower bound = 1
 
-/(?=a+)[bcd]/iI
+/(?=a+)[bcd]/Ii
 Capturing subpattern count = 0
 Options: caseless
-First char = 'a' (caseless)
-No need char
+First code unit = 'a' (caseless)
+Subject length lower bound = 1
 
-/(?=a+?)[bcd]/iI
+/(?=a+?)[bcd]/Ii
 Capturing subpattern count = 0
 Options: caseless
-First char = 'a' (caseless)
-No need char
+First code unit = 'a' (caseless)
+Subject length lower bound = 1
 
-/(?=a++)[bcd]/iI
+/(?=a++)[bcd]/Ii
 Capturing subpattern count = 0
 Options: caseless
-First char = 'a' (caseless)
-No need char
+First code unit = 'a' (caseless)
+Subject length lower bound = 1
 
-/(?=a{3})[bcd]/iI
+/(?=a{3})[bcd]/Ii
 Capturing subpattern count = 0
 Options: caseless
-First char = 'a' (caseless)
-Need char = 'a' (caseless)
+First code unit = 'a' (caseless)
+Last code unit = 'a' (caseless)
+Subject length lower bound = 1
 
-/(abc)\1+/S
+/(abc)\1+/
 
-/-- Perl doesn't get these right IMO (the 3rd is PCRE-specific) --/
+# Perl doesn't get these right IMO (the 3rd is PCRE2-specific) 
 
 /(?1)(?:(b(*ACCEPT))){0}/
     b
@@ -11282,18 +10614,18 @@
 /(?1)(?:(b(*ACCEPT))){0}c/
     bc
  0: bc
-    ** Failers 
-No match
+\= Expect no match 
     b 
 No match
 
 /(?1)(?:((*ACCEPT))){0}c/
     c
  0: c
-    c\N 
+    c\=notempty
  0: c
 
 /^.*?(?(?=a)a|b(*THEN)c)/
+\= Expect no match 
     ba
 No match
 
@@ -11302,14 +10634,17 @@
  0: ba
 
 /^.*?(?(?=a)a(*THEN)b|c)/
+\= Expect no match 
     ac
 No match
 
 /^.*?(?(?=a)a(*THEN)b)c/
+\= Expect no match 
     ac
 No match
 
 /^.*?(a(*THEN)b)c/
+\= Expect no match 
     aabc
 No match
     
@@ -11327,123 +10662,107 @@
  0: aabc
  1: ab
 
-/-- --/
+# These are here because they are not Perl-compatible; the studying means the
+# mark is not seen.
 
-/-- These studied versions are here because they are not Perl-compatible; the
-    studying means the mark is not seen. --/
-
-/(*MARK:A)(*SKIP:B)(C|X)/KS
+/(*MARK:A)(*SKIP:B)(C|X)/mark
     C
  0: C
  1: C
 MK: A
+\= Expect no match 
     D
 No match, mark = A
      
-/(*:A)A+(*SKIP:A)(B|Z)/KS
+/(*:A)A+(*SKIP:A)(B|Z)/mark
+\= Expect no match 
     AAAC
 No match, mark = A
 
-/-- --/
+# ----------------------------
 
 "(?=a*(*ACCEPT)b)c"
     c
  0: c
-    c\N 
+    c\=notempty
  0: c
     
 /(?1)c(?(DEFINE)((*ACCEPT)b))/
     c
  0: c
-    c\N  
+    c\=notempty
  0: c
     
 /(?>(*ACCEPT)b)c/
     c
  0: 
-    c\N  
+\= Expect no match 
+    c\=notempty
 No match
 
-/(?:(?>(a)))+a%/++
+/(?:(?>(a)))+a%/allaftertext
     %aa%
  0: aa%
  0+ 
  1: a
  1+ a%
 
-/(a)b|ac/++SS
-    ac\O3
+/(a)b|ac/allaftertext
+    ac\=ovector=1
  0: ac
  0+ 
     
-/(a)(b)x|abc/++
-     abc\O6
+/(a)(b)x|abc/allaftertext
+     abc\=ovector=2
  0: abc
  0+ 
 
 /(a)bc|(a)(b)\2/
-    \O3abc
+    abc\=ovector=1
 Matched, but too many substrings
  0: abc
-    \O4abc 
-Matched, but too many substrings
+    abc\=ovector=2
  0: abc
+ 1: a
+    aba\=ovector=1
+Matched, but too many substrings
+ 0: aba
+    aba\=ovector=2
+Matched, but too many substrings
+ 0: aba
+ 1: <unset>
+    aba\=ovector=3
+Matched, but too many substrings
+ 0: aba
+ 1: <unset>
+ 2: a
+    aba\=ovector=4
+ 0: aba
+ 1: <unset>
+ 2: a
+ 3: b
 
-/(?(DEFINE)(a(?2)|b)(b(?1)|a))(?:(?1)|(?2))/SI
+/(?(DEFINE)(a(?2)|b)(b(?1)|a))(?:(?1)|(?2))/I
 Capturing subpattern count = 2
-No options
-No first char
-No need char
 Subject length lower bound = 1
-No starting char list
 
-/(a(?2)|b)(b(?1)|a)(?:(?1)|(?2))/SI
+/(a(?2)|b)(b(?1)|a)(?:(?1)|(?2))/I
 Capturing subpattern count = 2
-No options
-No first char
-No need char
+Starting code units: a b 
 Subject length lower bound = 3
-Starting chars: a b 
 
-/(a(?2)|b)(b(?1)|a)(?1)(?2)/SI
+/(a(?2)|b)(b(?1)|a)(?1)(?2)/I
 Capturing subpattern count = 2
-No options
-No first char
-No need char
+Starting code units: a b 
 Subject length lower bound = 4
-Starting chars: a b 
 
-/(abc)(?1)/SI
+/(abc)(?1)/I
 Capturing subpattern count = 1
-No options
-First char = 'a'
-Need char = 'c'
+First code unit = 'a'
+Last code unit = 'c'
 Subject length lower bound = 6
-No starting char list
 
-/^(?>a)++/
-    aa\M
-Minimum match() limit = 5
-Minimum match() recursion limit = 2
- 0: aa
-    aaaaaaaaa\M 
-Minimum match() limit = 12
-Minimum match() recursion limit = 2
- 0: aaaaaaaaa
-    
-/(a)(?1)++/
-    aa\M
-Minimum match() limit = 7
-Minimum match() recursion limit = 4
- 0: aa
- 1: a
-    aaaaaaaaa\M  
-Minimum match() limit = 21
-Minimum match() recursion limit = 4
- 0: aaaaaaaaa
- 1: a
-
-/(?:(foo)|(bar)|(baz))X/SS=
+/(?:(foo)|(bar)|(baz))X/allcaptures
     bazfooX
  0: fooX
  1: foo
@@ -11469,33 +10788,23 @@
  1: <unset>
  2: <unset>
  3: baz
-    bazfooX\O0
-Matched, but too many substrings
-    bazfooX\O2
-Matched, but too many substrings
- 0: fooX
-    bazfooX\O4
-Matched, but too many substrings
- 0: fooX
- 1: <unset>
-    bazfooX\O6
-Matched, but too many substrings
- 0: fooX
- 1: foo
- 2: <unset>
-    bazfooX\O8
-Matched, but too many substrings
+    bazfooX\=ovector=0
  0: fooX
  1: foo
  2: <unset>
  3: <unset>
-    bazfooX\O10
+    bazfooX\=ovector=1
+Matched, but too many substrings
+ 0: fooX
+    bazfooX\=ovector=2
+ 0: fooX
+ 1: foo
+    bazfooX\=ovector=3
  0: fooX
  1: foo
  2: <unset>
- 3: <unset>
 
-/(?=abc){3}abc/BZ
+/(?=abc){3}abc/B
 ------------------------------------------------------------------
         Bra
         Assert
@@ -11506,7 +10815,7 @@
         End
 ------------------------------------------------------------------
 
-/(?=abc)+abc/BZ
+/(?=abc)+abc/B
 ------------------------------------------------------------------
         Bra
         Assert
@@ -11517,7 +10826,7 @@
         End
 ------------------------------------------------------------------
 
-/(?=abc)++abc/BZ
+/(?=abc)++abc/B
 ------------------------------------------------------------------
         Bra
         Assert
@@ -11528,7 +10837,7 @@
         End
 ------------------------------------------------------------------
 
-/(?=abc){0}xyz/BZ
+/(?=abc){0}xyz/B
 ------------------------------------------------------------------
         Bra
         Skip zero
@@ -11540,7 +10849,7 @@
         End
 ------------------------------------------------------------------
 
-/(?=(a))?./BZ
+/(?=(a))?./B
 ------------------------------------------------------------------
         Bra
         Brazero
@@ -11554,7 +10863,7 @@
         End
 ------------------------------------------------------------------
 
-/(?=(a))??./BZ
+/(?=(a))??./B
 ------------------------------------------------------------------
         Bra
         Braminzero
@@ -11568,7 +10877,7 @@
         End
 ------------------------------------------------------------------
 
-/^(?=(a)){0}b(?1)/BZ
+/^(?=(a)){0}b(?1)/B
 ------------------------------------------------------------------
         Bra
         ^
@@ -11584,11 +10893,11 @@
         End
 ------------------------------------------------------------------
 
-/(?(DEFINE)(a))?b(?1)/BZ
+/(?(DEFINE)(a))?b(?1)/B
 ------------------------------------------------------------------
         Bra
         Cond
-        Cond def
+        Cond false
         CBra 1
         a
         Ket
@@ -11599,7 +10908,7 @@
         End
 ------------------------------------------------------------------
 
-/^(?=(?1))?[az]([abc])d/BZ
+/^(?=(?1))?[az]([abc])d/B
 ------------------------------------------------------------------
         Bra
         ^
@@ -11616,7 +10925,7 @@
         End
 ------------------------------------------------------------------
 
-/^(?!a){0}\w+/BZ
+/^(?!a){0}\w+/B
 ------------------------------------------------------------------
         Bra
         ^
@@ -11629,7 +10938,7 @@
         End
 ------------------------------------------------------------------
 
-/(?<=(abc))?xyz/BZ
+/(?<=(abc))?xyz/B
 ------------------------------------------------------------------
         Bra
         Brazero
@@ -11644,7 +10953,7 @@
         End
 ------------------------------------------------------------------
 
-/[:a[:abc]b:]/BZ
+/[:a[:abc]b:]/B
 ------------------------------------------------------------------
         Bra
         [:[a-c]
@@ -11653,22 +10962,7 @@
         End
 ------------------------------------------------------------------
 
-/((?2))((?1))/SS
-    abc
-Error -26 (nested recursion at the same subject position)
-
-/((?(R2)a+|(?1)b))/SS
-    aaaabcde
-Error -26 (nested recursion at the same subject position)
-
-/(?(R)a*(?1)|((?R))b)/SS
-    aaaabcde
-Error -26 (nested recursion at the same subject position)
-
-/(a+|(?R)b)/
-Failed: recursive call could loop indefinitely at offset 7
-
-/^(a(*:A)(d|e(*:B))z|aeq)/C
+/^(a(*:A)(d|e(*:B))z|aeq)/auto_callout
     adz
 --->adz
  +0 ^       ^
@@ -11727,96 +11021,65 @@
  1: aeq
 
 /.(*F)/
-    \P\Pabc
+\= Expect no match
+    abc\=ph
 No match
 
-/\btype\b\W*?\btext\b\W*?\bjavascript\b/IS
+/\btype\b\W*?\btext\b\W*?\bjavascript\b/I
 Capturing subpattern count = 0
 Max lookbehind = 1
-No options
-First char = 't'
-Need char = 't'
+First code unit = 't'
+Last code unit = 't'
 Subject length lower bound = 18
-No starting char list
 
-/\btype\b\W*?\btext\b\W*?\bjavascript\b|\burl\b\W*?\bshell:|<input\b.*?\btype\b\W*?\bimage\b|\bonkeyup\b\W*?\=/IS
+/\btype\b\W*?\btext\b\W*?\bjavascript\b|\burl\b\W*?\bshell:|<input\b.*?\btype\b\W*?\bimage\b|\bonkeyup\b\W*?\=/I
 Capturing subpattern count = 0
 Max lookbehind = 1
-No options
-No first char
-No need char
+Starting code units: < o t u 
 Subject length lower bound = 8
-Starting chars: < o t u 
 
-/a(*SKIP)c|b(*ACCEPT)|/+S!I
+/a(*SKIP)c|b(*ACCEPT)|/I,aftertext
 Capturing subpattern count = 0
 May match empty string
-No options
-No first char
-No need char
-Subject length lower bound = -1
-No starting char list
+Subject length lower bound = 0
     a
  0: 
  0+ 
 
-/a(*SKIP)c|b(*ACCEPT)cd(*ACCEPT)|x/SI
+/a(*SKIP)c|b(*ACCEPT)cd(*ACCEPT)|x/I
 Capturing subpattern count = 0
-No options
-No first char
-No need char
-Subject length lower bound = -1
-Starting chars: a b x 
+Starting code units: a b x 
+Subject length lower bound = 0
     ax
  0: x
 
-'a*(*ACCEPT)b'+
-    \N\N
-No match
-    abc\N\N
+'a*(*ACCEPT)b'aftertext
+    abc\=notempty_atstart
  0: a
  0+ bc
-    bbb\N\N 
+    bbb\=notempty_atstart
  0: 
  0+ bb
+\= Expect no match
+    \=notempty_atstart
+No match
 
-/(*ACCEPT)a/+I
+/(*ACCEPT)a/I,aftertext
 Capturing subpattern count = 0
-No options
-No first char
-No need char
+Subject length lower bound = 0
     bax
  0: 
  0+ bax
 
-/z(*ACCEPT)a/+I
+/z(*ACCEPT)a/I,aftertext
 Capturing subpattern count = 0
-No options
-First char = 'z'
-No need char
+First code unit = 'z'
+Subject length lower bound = 0
     baxzbx
  0: z
  0+ bx
 
-/a(?:.)*?a/ims                                                                  
-    \Mabbbbbbbbbbbbbbbbbbbbba
-Minimum match() limit = 65
-Minimum match() recursion limit = 2
- 0: abbbbbbbbbbbbbbbbbbbbba
-    
-/a(?:.(*THEN))*?a/ims
-    \Mabbbbbbbbbbbbbbbbbbbbba
-Minimum match() limit = 86
-Minimum match() recursion limit = 45
- 0: abbbbbbbbbbbbbbbbbbbbba
-
-/a(?:.(*THEN:ABC))*?a/ims
-    \Mabbbbbbbbbbbbbbbbbbbbba
-Minimum match() limit = 86
-Minimum match() recursion limit = 45
- 0: abbbbbbbbbbbbbbbbbbbbba
-
-/^(?>a+)(?>(z+))\w/BZ
+/^(?>a+)(?>(z+))\w/B
 ------------------------------------------------------------------
         Bra
         ^
@@ -11835,8 +11098,7 @@
     aaaazzzzb
  0: aaaazzzzb
  1: zzzz
-    ** Failers
-No match
+\= Expect no match
     aazz  
 No match
 
@@ -11852,10 +11114,11 @@
  1: c
     
 /(.)((?(1)c|a)|a(?2))/
+\= Expect no match
     baa  
 No match
 
-/(?P<abn>(?P=abn)xxx)/BZ
+/(?P<abn>(?P=abn)xxx)/B
 ------------------------------------------------------------------
         Bra
         Once
@@ -11868,7 +11131,7 @@
         End
 ------------------------------------------------------------------
 
-/(a\1z)/BZ
+/(a\1z)/B
 ------------------------------------------------------------------
         Bra
         Once
@@ -11882,77 +11145,47 @@
         End
 ------------------------------------------------------------------
 
-/^(?>a+)(?>b+)(?>c+)(?>d+)(?>e+)/
-     \Maabbccddee
-Minimum match() limit = 7
-Minimum match() recursion limit = 2
- 0: aabbccddee
-
-/^(?>(a+))(?>(b+))(?>(c+))(?>(d+))(?>(e+))/
-     \Maabbccddee
-Minimum match() limit = 17
-Minimum match() recursion limit = 16
- 0: aabbccddee
- 1: aa
- 2: bb
- 3: cc
- 4: dd
- 5: ee
-
-/^(?>(a+))(?>b+)(?>(c+))(?>d+)(?>(e+))/
-     \Maabbccddee
-Minimum match() limit = 13
-Minimum match() recursion limit = 10
- 0: aabbccddee
- 1: aa
- 2: cc
- 3: ee
-
-/^a\x41z/<JS>
+/^a\x41z/alt_bsux,allow_empty_class,match_unset_backref,dupnames
     aAz
  0: aAz
-    *** Failers
-No match
+\= Expect no match
     ax41z
 No match
 
-/^a[m\x41]z/<JS>
+/^a[m\x41]z/alt_bsux,allow_empty_class,match_unset_backref,dupnames
     aAz
  0: aAz
 
-/^a\x1z/<JS>
+/^a\x1z/alt_bsux,allow_empty_class,match_unset_backref,dupnames
     ax1z
  0: ax1z
 
-/^a\u0041z/<JS>
+/^a\u0041z/alt_bsux,allow_empty_class,match_unset_backref,dupnames
     aAz
  0: aAz
-    *** Failers
-No match
+\= Expect no match
     au0041z
 No match
 
-/^a[m\u0041]z/<JS>
+/^a[m\u0041]z/alt_bsux,allow_empty_class,match_unset_backref,dupnames
     aAz
  0: aAz
 
-/^a\u041z/<JS>
+/^a\u041z/alt_bsux,allow_empty_class,match_unset_backref,dupnames
     au041z
  0: au041z
-    *** Failers
-No match
+\= Expect no match
     aAz
 No match
 
-/^a\U0041z/<JS>
+/^a\U0041z/alt_bsux,allow_empty_class,match_unset_backref,dupnames
     aU0041z
  0: aU0041z
-    *** Failers
-No match
+\= Expect no match
     aAz
 No match
 
-/(?(?=c)c|d)++Y/BZ
+/(?(?=c)c|d)++Y/B
 ------------------------------------------------------------------
         Bra
         BraPos
@@ -11970,7 +11203,7 @@
         End
 ------------------------------------------------------------------
 
-/(?(?=c)c|d)*+Y/BZ
+/(?(?=c)c|d)*+Y/B
 ------------------------------------------------------------------
         Bra
         Braposzero
@@ -11990,23 +11223,24 @@
 ------------------------------------------------------------------
 
 /a[\NB]c/
-Failed: \N is not supported in a class at offset 3
+Failed: error 171 at offset 3: \N is not supported in a class
+    aNc
+    
+/a[B-\Nc]/
+Failed: error 150 at offset 5: invalid range in character class
 
-/a[B-\Nc]/ 
-Failed: invalid range in character class at offset 5
-
-/a[B\Nc]/ 
-Failed: \N is not supported in a class at offset 4
+/a[B\Nc]/
+Failed: error 171 at offset 4: \N is not supported in a class
 
 /(a)(?2){0,1999}?(b)/
 
 /(a)(?(DEFINE)(b))(?2){0,1999}?(?2)/
 
-/--- This test, with something more complicated than individual letters, causes
-different behaviour in Perl. Perhaps it disables some optimization; no tag is
-passed back for the failures, whereas in PCRE there is a tag. ---/
+# This test, with something more complicated than individual letters, causes
+# different behaviour in Perl. Perhaps it disables some optimization; no tag is
+# passed back for the failures, whereas in PCRE2 there is a tag.
     
-/(A|P)(*:A)(B|P) | (X|P)(X|P)(*:B)(Y|P)/xK
+/(A|P)(*:A)(B|P) | (X|P)(X|P)(*:B)(Y|P)/x,mark
     AABC
  0: AB
  1: A
@@ -12020,8 +11254,7 @@
  4: X
  5: Y
 MK: B
-    ** Failers
-No match
+\= Expect no match
     XAQQ  
 No match, mark = A
     XAQQXZZ  
@@ -12031,158 +11264,156 @@
     AXXQQQ 
 No match, mark = B
 
-/-- Perl doesn't give marks for these, though it does if the alternatives are
-replaced by single letters. --/
+# Perl doesn't give marks for these, though it does if the alternatives are
+# replaced by single letters. 
     
-/(b|q)(*:m)f|a(*:n)w/K
+/(b|q)(*:m)f|a(*:n)w/mark
     aw 
  0: aw
 MK: n
-    ** Failers 
-No match, mark = n
+\= Expect no match 
     abc
 No match, mark = m
 
-/(q|b)(*:m)f|a(*:n)w/K
+/(q|b)(*:m)f|a(*:n)w/mark
     aw 
  0: aw
 MK: n
-    ** Failers 
-No match, mark = n
+\= Expect no match 
     abc
 No match, mark = m
 
-/-- After a partial match, the behaviour is as for a failure. --/
+# After a partial match, the behaviour is as for a failure. 
 
-/^a(*:X)bcde/K
-   abc\P
+/^a(*:X)bcde/mark
+   abc\=ps
 Partial match, mark=X: abc
    
-/-- These are here because Perl doesn't return a mark, except for the first --/
+# These are here because Perl doesn't return a mark, except for the first.
 
-/(?=(*:x))(q|)/K+
+/(?=(*:x))(q|)/aftertext,mark
     abc
  0: 
  0+ abc
  1: 
 MK: x
 
-/(?=(*:x))((*:y)q|)/K+
+/(?=(*:x))((*:y)q|)/aftertext,mark
     abc
  0: 
  0+ abc
  1: 
 MK: x
 
-/(?=(*:x))(?:(*:y)q|)/K+
+/(?=(*:x))(?:(*:y)q|)/aftertext,mark
     abc
  0: 
  0+ abc
 MK: x
 
-/(?=(*:x))(?>(*:y)q|)/K+
+/(?=(*:x))(?>(*:y)q|)/aftertext,mark
     abc
  0: 
  0+ abc
 MK: x
 
-/(?=a(*:x))(?!a(*:y)c)/K+
+/(?=a(*:x))(?!a(*:y)c)/aftertext,mark
     ab
  0: 
  0+ ab
 MK: x
 
-/(?=a(*:x))(?=a(*:y)c|)/K+
+/(?=a(*:x))(?=a(*:y)c|)/aftertext,mark
     ab
  0: 
  0+ ab
 MK: x
 
 /(..)\1/
-    ab\P
+    ab\=ps
 Partial match: ab
-    aba\P
+    aba\=ps
 Partial match: aba
-    abab\P
+    abab\=ps
  0: abab
  1: ab
 
 /(..)\1/i
-    ab\P
+    ab\=ps
 Partial match: ab
-    abA\P
+    abA\=ps
 Partial match: abA
-    aBAb\P
+    aBAb\=ps
  0: aBAb
  1: aB
 
 /(..)\1{2,}/
-    ab\P
+    ab\=ps
 Partial match: ab
-    aba\P
+    aba\=ps
 Partial match: aba
-    abab\P
+    abab\=ps
 Partial match: abab
-    ababa\P
+    ababa\=ps
 Partial match: ababa
-    ababab\P
+    ababab\=ps
  0: ababab
  1: ab
-    ababab\P\P
+    ababab\=ph
 Partial match: ababab
-    abababa\P
+    abababa\=ps
  0: ababab
  1: ab
-    abababa\P\P
+    abababa\=ph
 Partial match: abababa
 
 /(..)\1{2,}/i
-    ab\P
+    ab\=ps
 Partial match: ab
-    aBa\P
+    aBa\=ps
 Partial match: aBa
-    aBAb\P
+    aBAb\=ps
 Partial match: aBAb
-    AbaBA\P
+    AbaBA\=ps
 Partial match: AbaBA
-    abABAb\P
+    abABAb\=ps
  0: abABAb
  1: ab
-    aBAbaB\P\P
+    aBAbaB\=ph
 Partial match: aBAbaB
-    abABabA\P
+    abABabA\=ps
  0: abABab
  1: ab
-    abaBABa\P\P
+    abaBABa\=ph
 Partial match: abaBABa
 
 /(..)\1{2,}?x/i
-    ab\P
+    ab\=ps
 Partial match: ab
-    abA\P
+    abA\=ps
 Partial match: abA
-    aBAb\P
+    aBAb\=ps
 Partial match: aBAb
-    abaBA\P
+    abaBA\=ps
 Partial match: abaBA
-    abAbaB\P
+    abAbaB\=ps
 Partial match: abAbaB
-    abaBabA\P
+    abaBabA\=ps
 Partial match: abaBabA
-    abAbABaBx\P
+    abAbABaBx\=ps
  0: abAbABaBx
  1: ab
 
 /^(..)\1/
-    aba\P
+    aba\=ps
 Partial match: aba
 
 /^(..)\1{2,3}x/
-    aba\P
+    aba\=ps
 Partial match: aba
-    ababa\P
+    ababa\=ps
 Partial match: ababa
-    ababa\P\P
+    ababa\=ph
 Partial match: ababa
     abababx
  0: abababx
@@ -12192,11 +11423,11 @@
  1: ab
 
 /^(..)\1{2,3}?x/
-    aba\P
+    aba\=ps
 Partial match: aba
-    ababa\P
+    ababa\=ps
 Partial match: ababa
-    ababa\P\P
+    ababa\=ph
 Partial match: ababa
     abababx
  0: abababx
@@ -12212,23 +11443,23 @@
  2: abab
 
 /^\R/
-    \r\P
+    \r\=ps
  0: \x0d
-    \r\P\P
+    \r\=ph
 Partial match: \x0d
     
 /^\R{2,3}x/
-    \r\P
+    \r\=ps
 Partial match: \x0d
-    \r\P\P
+    \r\=ph
 Partial match: \x0d
-    \r\r\P 
+    \r\r\=ps
 Partial match: \x0d\x0d
-    \r\r\P\P
+    \r\r\=ph
 Partial match: \x0d\x0d
-    \r\r\r\P  
+    \r\r\r\=ps
 Partial match: \x0d\x0d\x0d
-    \r\r\r\P\P
+    \r\r\r\=ph
 Partial match: \x0d\x0d\x0d
     \r\rx
  0: \x0d\x0dx
@@ -12236,17 +11467,17 @@
  0: \x0d\x0d\x0dx
 
 /^\R{2,3}?x/
-    \r\P
+    \r\=ps
 Partial match: \x0d
-    \r\P\P
+    \r\=ph
 Partial match: \x0d
-    \r\r\P 
+    \r\r\=ps
 Partial match: \x0d\x0d
-    \r\r\P\P
+    \r\r\=ph
 Partial match: \x0d\x0d
-    \r\r\r\P  
+    \r\r\r\=ps
 Partial match: \x0d\x0d\x0d
-    \r\r\r\P\P
+    \r\r\r\=ph
 Partial match: \x0d\x0d\x0d
     \r\rx
  0: \x0d\x0dx
@@ -12254,9 +11485,9 @@
  0: \x0d\x0d\x0dx
     
 /^\R?x/
-    \r\P
+    \r\=ps
 Partial match: \x0d
-    \r\P\P 
+    \r\=ph
 Partial match: \x0d
     x
  0: x
@@ -12264,208 +11495,181 @@
  0: \x0dx
 
 /^\R+x/
-    \r\P
+    \r\=ps
 Partial match: \x0d
-    \r\P\P 
+    \r\=ph
 Partial match: \x0d
-    \r\n\P
+    \r\n\=ps
 Partial match: \x0d\x0a
-    \r\n\P\P  
+    \r\n\=ph
 Partial match: \x0d\x0a
     \rx  
  0: \x0dx
 
-/^a$/<CRLF>
-    a\r\P
+/^a$/newline=crlf
+    a\r\=ps
 Partial match: a\x0d
-    a\r\P\P 
+    a\r\=ph
 Partial match: a\x0d
 
-/^a$/m<CRLF>
-    a\r\P
+/^a$/m,newline=crlf
+    a\r\=ps
 Partial match: a\x0d
-    a\r\P\P 
+    a\r\=ph
 Partial match: a\x0d
 
-/^(a$|a\r)/<CRLF>
-    a\r\P
+/^(a$|a\r)/newline=crlf
+    a\r\=ps
  0: a\x0d
  1: a\x0d
-    a\r\P\P 
+    a\r\=ph
 Partial match: a\x0d
 
-/^(a$|a\r)/m<CRLF>
-    a\r\P
+/^(a$|a\r)/m,newline=crlf
+    a\r\=ps
  0: a\x0d
  1: a\x0d
-    a\r\P\P 
+    a\r\=ph
 Partial match: a\x0d
 
-/./<CRLF>
-    \r\P
+/./newline=crlf
+    \r\=ps
  0: \x0d
-    \r\P\P 
+    \r\=ph
 Partial match: \x0d
   
-/.{2,3}/<CRLF>
-    \r\P 
+/.{2,3}/newline=crlf
+    \r\=ps
 Partial match: \x0d
-    \r\P\P
+    \r\=ph
 Partial match: \x0d
-    \r\r\P
+    \r\r\=ps
  0: \x0d\x0d
-    \r\r\P\P
+    \r\r\=ph
 Partial match: \x0d\x0d
-    \r\r\r\P
+    \r\r\r\=ps
  0: \x0d\x0d\x0d
-    \r\r\r\P\P     
+    \r\r\r\=ph
 Partial match: \x0d\x0d\x0d
 
-/.{2,3}?/<CRLF>
-    \r\P 
+/.{2,3}?/newline=crlf
+    \r\=ps
 Partial match: \x0d
-    \r\P\P
+    \r\=ph
 Partial match: \x0d
-    \r\r\P
+    \r\r\=ps
  0: \x0d\x0d
-    \r\r\P\P
+    \r\r\=ph
 Partial match: \x0d\x0d
-    \r\r\r\P
+    \r\r\r\=ps
  0: \x0d\x0d
-    \r\r\r\P\P     
+    \r\r\r\=ph
  0: \x0d\x0d
 
 "AB(C(D))(E(F))?(?(?=\2)(?=\4))"
-    ABCDGHI\O03
+    ABCDGHI\=ovector=01
 Matched, but too many substrings
  0: ABCD
     
-/-- These are all run as real matches in test 1; here we are just checking the
-settings of the anchored and startline bits. --/ 
+# These are all run as real matches in test 1; here we are just checking the
+# settings of the anchored and startline bits.  
 
 /(?>.*?a)(?<=ba)/I
 Capturing subpattern count = 0
 Max lookbehind = 2
-No options
-No first char
-Need char = 'a'
+Last code unit = 'a'
+Subject length lower bound = 1
 
 /(?:.*?a)(?<=ba)/I
 Capturing subpattern count = 0
 Max lookbehind = 2
-No options
-First char at start or follows newline
-Need char = 'a'
+First code unit at start or follows newline
+Last code unit = 'a'
+Subject length lower bound = 1
 
 /.*?a(*PRUNE)b/I
 Capturing subpattern count = 0
-No options
-No first char
-Need char = 'b'
+Last code unit = 'b'
+Subject length lower bound = 2
 
-/.*?a(*PRUNE)b/sI
+/.*?a(*PRUNE)b/Is
 Capturing subpattern count = 0
 Options: dotall
-No first char
-Need char = 'b'
+Last code unit = 'b'
+Subject length lower bound = 2
 
-/^a(*PRUNE)b/sI
+/^a(*PRUNE)b/Is
 Capturing subpattern count = 0
-Options: anchored dotall
-No first char
-No need char
+Compile options: dotall
+Overall options: anchored dotall
+Subject length lower bound = 2
 
 /.*?a(*SKIP)b/I
 Capturing subpattern count = 0
-No options
-No first char
-Need char = 'b'
+Last code unit = 'b'
+Subject length lower bound = 2
 
-/(?>.*?a)b/sI
+/(?>.*?a)b/Is
 Capturing subpattern count = 0
 Options: dotall
-No first char
-Need char = 'b'
+Last code unit = 'b'
+Subject length lower bound = 2
 
 /(?>.*?a)b/I
 Capturing subpattern count = 0
-No options
-No first char
-Need char = 'b'
+Last code unit = 'b'
+Subject length lower bound = 2
 
-/(?>^a)b/sI
+/(?>^a)b/Is
 Capturing subpattern count = 0
-Options: anchored dotall
-No first char
-No need char
+Compile options: dotall
+Overall options: anchored dotall
+Subject length lower bound = 2
 
 /(?>.*?)(?<=(abcd)|(wxyz))/I
 Capturing subpattern count = 2
 Max lookbehind = 4
 May match empty string
-No options
-No first char
-No need char
+Subject length lower bound = 0
 
 /(?>.*)(?<=(abcd)|(wxyz))/I
 Capturing subpattern count = 2
 Max lookbehind = 4
 May match empty string
-No options
-No first char
-No need char
+Subject length lower bound = 0
 
 "(?>.*)foo"I
 Capturing subpattern count = 0
-No options
-No first char
-Need char = 'o'
+Last code unit = 'o'
+Subject length lower bound = 3
 
 "(?>.*?)foo"I
 Capturing subpattern count = 0
-No options
-No first char
-Need char = 'o'
+Last code unit = 'o'
+Subject length lower bound = 3
 
-/(?>^abc)/mI
+/(?>^abc)/Im
 Capturing subpattern count = 0
 Options: multiline
-First char at start or follows newline
-Need char = 'c'
+First code unit at start or follows newline
+Last code unit = 'c'
+Subject length lower bound = 3
 
-/(?>.*abc)/mI
+/(?>.*abc)/Im
 Capturing subpattern count = 0
 Options: multiline
-No first char
-Need char = 'c'
+Last code unit = 'c'
+Subject length lower bound = 3
 
-/(?:.*abc)/mI
+/(?:.*abc)/Im
 Capturing subpattern count = 0
 Options: multiline
-First char at start or follows newline
-Need char = 'c'
-
-/-- Check PCRE_STUDY_EXTRA_NEEDED --/
-
-/.?/S-I
-Capturing subpattern count = 0
-May match empty string
-No options
-No first char
-No need char
-Study returned NULL
-
-/.?/S!I
-Capturing subpattern count = 0
-May match empty string
-No options
-No first char
-No need char
-Subject length lower bound = -1
-No starting char list
+First code unit at start or follows newline
+Last code unit = 'c'
+Subject length lower bound = 3
 
 /(?:(a)+(?C1)bb|aa(?C2)b)/
-    aab\C+
+    aab\=callout_capture
 Callout 1: last capture = 1
  0: <unset>
  1: a
@@ -12476,70 +11680,70 @@
  1: a
 --->aab
     ^^      b
-Callout 2: last capture = -1
+Callout 2: last capture = 0
  0: <unset>
 --->aab
     ^ ^     b
  0: aab
    
 /(?:(a)++(?C1)bb|aa(?C2)b)/
-    aab\C+ 
+    aab\=callout_capture
 Callout 1: last capture = 1
  0: <unset>
  1: a
 --->aab
     ^ ^     b
-Callout 2: last capture = -1
+Callout 2: last capture = 0
  0: <unset>
 --->aab
     ^ ^     b
  0: aab
     
 /(?:(?>(a))(?C1)bb|aa(?C2)b)/
-    aab\C+ 
+    aab\=callout_capture
 Callout 1: last capture = 1
  0: <unset>
  1: a
 --->aab
     ^^      b
-Callout 2: last capture = -1
+Callout 2: last capture = 0
  0: <unset>
 --->aab
     ^ ^     b
  0: aab
 
-/(?:(?1)(?C1)x|ab(?C2))((a)){0}/                                                
-    aab\C+ 
-Callout 1: last capture = -1
+/(?:(?1)(?C1)x|ab(?C2))((a)){0}/
+    aab\=callout_capture
+Callout 1: last capture = 0
  0: <unset>
 --->aab
     ^^      x
-Callout 1: last capture = -1
+Callout 1: last capture = 0
  0: <unset>
 --->aab
      ^^     x
-Callout 2: last capture = -1
+Callout 2: last capture = 0
  0: <unset>
 --->aab
      ^ ^    )
  0: ab
 
-/(?1)(?C1)((a)(?C2)){0}/   
-    aab\C+ 
+/(?1)(?C1)((a)(?C2)){0}/
+    aab\=callout_capture
 Callout 2: last capture = 2
  0: <unset>
  1: <unset>
  2: a
 --->aab
     ^^      )
-Callout 1: last capture = -1
+Callout 1: last capture = 0
  0: <unset>
 --->aab
     ^^      ((a)(?C2)){0}
  0: a
 
 /(?:(a)+(?C1)bb|aa(?C2)b)++/
-    aab\C+
+    aab\=callout_capture
 Callout 1: last capture = 1
  0: <unset>
  1: a
@@ -12550,12 +11754,12 @@
  1: a
 --->aab
     ^^      b
-Callout 2: last capture = -1
+Callout 2: last capture = 0
  0: <unset>
 --->aab
     ^ ^     b
  0: aab
-    aab\C+\O2
+    aab\=callout_capture,ovector=1
 Callout 1: last capture = 1
  0: <unset>
 --->aab
@@ -12564,39 +11768,33 @@
  0: <unset>
 --->aab
     ^^      b
-Callout 2: last capture = -1
+Callout 2: last capture = 0
  0: <unset>
 --->aab
     ^ ^     b
  0: aab
 
 /(ab)x|ab/
-    ab\O3
+    ab\=ovector=0
  0: ab
-    ab\O2 
+    ab\=ovector=1
  0: ab
   
-/(ab)/
-    ab\O3
-Matched, but too many substrings
- 0: ab
-    ab\O2 
-Matched, but too many substrings
- 0: ab
+/(?<=123)(*MARK:xx)abc/mark
+    xxxx123a\=ph
+Partial match, mark=xx: 123a
+                        <<<
+    xxxx123a\=ps
+Partial match, mark=xx: 123a
+                        <<<
     
-/(?<=123)(*MARK:xx)abc/K
-    xxxx123a\P\P
-Partial match at offset 7, mark=xx: 123a
-    xxxx123a\P
-Partial match at offset 7, mark=xx: 123a
-    
-/123\Kabc/
-    xxxx123a\P\P
+/123\Kabc/startchar
+    xxxx123a\=ph
 Partial match: 123a
-    xxxx123a\P
+    xxxx123a\=ps
 Partial match: 123a
 
-/^(?(?=a)aa|bb)/C
+/^(?(?=a)aa|bb)/auto_callout
     bb
 --->bb
  +0 ^      ^
@@ -12622,26 +11820,27 @@
  11 ^ ^    
  0: bb
 
-/-- Perl seems to have a bug with this one --/
+# Perl seems to have a bug with this one.
 
 /aaaaa(*COMMIT)(*PRUNE)b|a+c/
     aaaaaac
  0: aaaac
     
-/-- Here are some that Perl treats differently because of the way it handles
-backtracking verbs. --/
+# Here are some that Perl treats differently because of the way it handles
+# backtracking verbs. 
 
- /(?!a(*COMMIT)b)ac|ad/
+/(?!a(*COMMIT)b)ac|ad/
      ac
  0: ac
      ad 
  0: ad
 
 /^(?!a(*THEN)b|ac)../
-     ac
-No match
      ad 
  0: ad
+\= Expect no match
+     ac
+No match
 
 /^(?=a(*THEN)b|ac)/
     ac
@@ -12678,6 +11877,7 @@
  0: bn
 
 /(?(?=b(*SKIP)a)bn|bnn)/
+\= Expect no match
     bnn
 No match
 
@@ -12685,114 +11885,21 @@
     bnn
  0: bn
 
-/-------------------------/ 
-
-/(*LIMIT_MATCH=12bc)abc/
-Failed: (*VERB) not recognized or malformed at offset 7
-
-/(*LIMIT_MATCH=4294967290)abc/
-Failed: (*VERB) not recognized or malformed at offset 7
-
-/(*LIMIT_RECURSION=4294967280)abc/I
-Capturing subpattern count = 0
-Recursion limit = 4294967280
-No options
-First char = 'a'
-Need char = 'c'
-
-/(a+)*zz/
-    aaaaaaaaaaaaaz
-No match
-    aaaaaaaaaaaaaz\q3000
-Error -8 (match limit exceeded)
-
-/(a+)*zz/S-
-    aaaaaaaaaaaaaz\Q10 
-Error -21 (recursion limit exceeded)
-
-/(*LIMIT_MATCH=3000)(a+)*zz/I
-Capturing subpattern count = 1
-Match limit = 3000
-No options
-No first char
-Need char = 'z'
-    aaaaaaaaaaaaaz
-Error -8 (match limit exceeded)
-    aaaaaaaaaaaaaz\q60000
-Error -8 (match limit exceeded)
-
-/(*LIMIT_MATCH=60000)(*LIMIT_MATCH=3000)(a+)*zz/I
-Capturing subpattern count = 1
-Match limit = 3000
-No options
-No first char
-Need char = 'z'
-    aaaaaaaaaaaaaz
-Error -8 (match limit exceeded)
-
-/(*LIMIT_MATCH=60000)(a+)*zz/I
-Capturing subpattern count = 1
-Match limit = 60000
-No options
-No first char
-Need char = 'z'
-    aaaaaaaaaaaaaz
-No match
-    aaaaaaaaaaaaaz\q3000
-Error -8 (match limit exceeded)
-
-/(*LIMIT_RECURSION=10)(a+)*zz/IS-
-Capturing subpattern count = 1
-Recursion limit = 10
-No options
-No first char
-Need char = 'z'
-Subject length lower bound = 2
-Starting chars: a z 
-    aaaaaaaaaaaaaz
-Error -21 (recursion limit exceeded)
-    aaaaaaaaaaaaaz\Q1000
-Error -21 (recursion limit exceeded)
-
-/(*LIMIT_RECURSION=10)(*LIMIT_RECURSION=1000)(a+)*zz/IS-
-Capturing subpattern count = 1
-Recursion limit = 10
-No options
-No first char
-Need char = 'z'
-Subject length lower bound = 2
-Starting chars: a z 
-    aaaaaaaaaaaaaz
-Error -21 (recursion limit exceeded)
-
-/(*LIMIT_RECURSION=1000)(a+)*zz/IS-
-Capturing subpattern count = 1
-Recursion limit = 1000
-No options
-No first char
-Need char = 'z'
-Subject length lower bound = 2
-Starting chars: a z 
-    aaaaaaaaaaaaaz
-No match
-    aaaaaaaaaaaaaz\Q10
-Error -21 (recursion limit exceeded)
-
-/-- This test causes a segfault with Perl 5.18.0 --/
+# This test causes a segfault with Perl 5.18.0 
 
 /^(?=(a)){0}b(?1)/
     backgammon
  0: ba
 
-/(?|(?<n>f)|(?<n>b))/JI
+/(?|(?<n>f)|(?<n>b))/I,dupnames
 Capturing subpattern count = 1
 Named capturing subpatterns:
   n   1
 Options: dupnames
-No first char
-No need char
+Starting code units: b f 
+Subject length lower bound = 1
 
-/(?<a>abc)(?<a>z)\k<a>()/JDZS
+/(?<a>abc)(?<a>z)\k<a>()/IB,dupnames
 ------------------------------------------------------------------
         Bra
         CBra 1
@@ -12813,12 +11920,11 @@
   a   1
   a   2
 Options: dupnames
-First char = 'a'
-Need char = 'z'
+First code unit = 'a'
+Last code unit = 'z'
 Subject length lower bound = 5
-No starting char list
 
-/a*[bcd]/BZ
+/a*[bcd]/B
 ------------------------------------------------------------------
         Bra
         a*+
@@ -12827,7 +11933,7 @@
         End
 ------------------------------------------------------------------
 
-/[bcd]*a/BZ
+/[bcd]*a/B
 ------------------------------------------------------------------
         Bra
         [b-d]*+
@@ -12836,9 +11942,10 @@
         End
 ------------------------------------------------------------------
 
-/-- A complete set of tests for auto-possessification of character types --/
+# A complete set of tests for auto-possessification of character types, but
+# omitting \C because it might be disabled (it has its own tests).
 
-/\D+\D \D+\d \D+\S \D+\s \D+\W \D+\w \D+. \D+\C \D+\R \D+\H \D+\h \D+\V \D+\v \D+\Z \D+\z \D+$/BZx
+/\D+\D \D+\d \D+\S \D+\s \D+\W \D+\w \D+. \D+\R \D+\H \D+\h \D+\V \D+\v \D+\Z \D+\z \D+$/Bx
 ------------------------------------------------------------------
         Bra
         \D+
@@ -12856,8 +11963,6 @@
         \D+
         Any
         \D+
-        AllAny
-        \D+
         \R
         \D+
         \H
@@ -12877,7 +11982,7 @@
         End
 ------------------------------------------------------------------
 
-/\d+\D \d+\d \d+\S \d+\s \d+\W \d+\w \d+. \d+\C \d+\R \d+\H \d+\h \d+\V \d+\v \d+\Z \d+\z \d+$/BZx
+/\d+\D \d+\d \d+\S \d+\s \d+\W \d+\w \d+. \d+\R \d+\H \d+\h \d+\V \d+\v \d+\Z \d+\z \d+$/Bx
 ------------------------------------------------------------------
         Bra
         \d++
@@ -12894,8 +11999,6 @@
         \w
         \d+
         Any
-        \d+
-        AllAny
         \d++
         \R
         \d+
@@ -12916,7 +12019,7 @@
         End
 ------------------------------------------------------------------
 
-/\S+\D \S+\d \S+\S \S+\s \S+\W \S+\w \S+. \S+\C \S+\R \S+\H \S+\h \S+\V \S+\v \S+\Z \S+\z \S+$/BZx
+/\S+\D \S+\d \S+\S \S+\s \S+\W \S+\w \S+. \S+\R \S+\H \S+\h \S+\V \S+\v \S+\Z \S+\z \S+$/Bx
 ------------------------------------------------------------------
         Bra
         \S+
@@ -12933,8 +12036,6 @@
         \w
         \S+
         Any
-        \S+
-        AllAny
         \S++
         \R
         \S+
@@ -12955,7 +12056,7 @@
         End
 ------------------------------------------------------------------
 
-/\s+\D \s+\d \s+\S \s+\s \s+\W \s+\w \s+. \s+\C \s+\R \s+\H \s+\h \s+\V \s+\v \s+\Z \s+\z \s+$/BZx
+/\s+\D \s+\d \s+\S \s+\s \s+\W \s+\w \s+. \s+\R \s+\H \s+\h \s+\V \s+\v \s+\Z \s+\z \s+$/Bx
 ------------------------------------------------------------------
         Bra
         \s+
@@ -12973,8 +12074,6 @@
         \s+
         Any
         \s+
-        AllAny
-        \s+
         \R
         \s+
         \H
@@ -12994,7 +12093,7 @@
         End
 ------------------------------------------------------------------
 
-/\W+\D \W+\d \W+\S \W+\s \W+\W \W+\w \W+. \W+\C \W+\R \W+\H \W+\h \W+\V \W+\v \W+\Z \W+\z \W+$/BZx
+/\W+\D \W+\d \W+\S \W+\s \W+\W \W+\w \W+. \W+\R \W+\H \W+\h \W+\V \W+\v \W+\Z \W+\z \W+$/Bx
 ------------------------------------------------------------------
         Bra
         \W+
@@ -13012,8 +12111,6 @@
         \W+
         Any
         \W+
-        AllAny
-        \W+
         \R
         \W+
         \H
@@ -13033,7 +12130,7 @@
         End
 ------------------------------------------------------------------
 
-/\w+\D \w+\d \w+\S \w+\s \w+\W \w+\w \w+. \w+\C \w+\R \w+\H \w+\h \w+\V \w+\v \w+\Z \w+\z \w+$/BZx
+/\w+\D \w+\d \w+\S \w+\s \w+\W \w+\w \w+. \w+\R \w+\H \w+\h \w+\V \w+\v \w+\Z \w+\z \w+$/Bx
 ------------------------------------------------------------------
         Bra
         \w+
@@ -13050,8 +12147,6 @@
         \w
         \w+
         Any
-        \w+
-        AllAny
         \w++
         \R
         \w+
@@ -13072,7 +12167,303 @@
         End
 ------------------------------------------------------------------
 
-/\C+\D \C+\d \C+\S \C+\s \C+\W \C+\w \C+. \C+\C \C+\R \C+\H \C+\h \C+\V \C+\v \C+\Z \C+\z \C+$/BZx
+/\R+\D \R+\d \R+\S \R+\s \R+\W \R+\w \R+. \R+\R \R+\H \R+\h \R+\V \R+\v \R+\Z \R+\z \R+$/Bx
+------------------------------------------------------------------
+        Bra
+        \R+
+        \D
+        \R++
+        \d
+        \R+
+        \S
+        \R++
+        \s
+        \R+
+        \W
+        \R++
+        \w
+        \R++
+        Any
+        \R+
+        \R
+        \R+
+        \H
+        \R++
+        \h
+        \R+
+        \V
+        \R+
+        \v
+        \R+
+        \Z
+        \R++
+        \z
+        \R+
+        $
+        Ket
+        End
+------------------------------------------------------------------
+
+/\H+\D \H+\d \H+\S \H+\s \H+\W \H+\w \H+. \H+\R \H+\H \H+\h \H+\V \H+\v \H+\Z \H+\z \H+$/Bx
+------------------------------------------------------------------
+        Bra
+        \H+
+        \D
+        \H+
+        \d
+        \H+
+        \S
+        \H+
+        \s
+        \H+
+        \W
+        \H+
+        \w
+        \H+
+        Any
+        \H+
+        \R
+        \H+
+        \H
+        \H++
+        \h
+        \H+
+        \V
+        \H+
+        \v
+        \H+
+        \Z
+        \H++
+        \z
+        \H+
+        $
+        Ket
+        End
+------------------------------------------------------------------
+
+/\h+\D \h+\d \h+\S \h+\s \h+\W \h+\w \h+. \h+\R \h+\H \h+\h \h+\V \h+\v \h+\Z \h+\z \h+$/Bx
+------------------------------------------------------------------
+        Bra
+        \h+
+        \D
+        \h++
+        \d
+        \h++
+        \S
+        \h+
+        \s
+        \h+
+        \W
+        \h++
+        \w
+        \h+
+        Any
+        \h++
+        \R
+        \h++
+        \H
+        \h+
+        \h
+        \h+
+        \V
+        \h++
+        \v
+        \h+
+        \Z
+        \h++
+        \z
+        \h+
+        $
+        Ket
+        End
+------------------------------------------------------------------
+
+/\V+\D \V+\d \V+\S \V+\s \V+\W \V+\w \V+. \V+\R \V+\H \V+\h \V+\V \V+\v \V+\Z \V+\z \V+$/Bx
+------------------------------------------------------------------
+        Bra
+        \V+
+        \D
+        \V+
+        \d
+        \V+
+        \S
+        \V+
+        \s
+        \V+
+        \W
+        \V+
+        \w
+        \V+
+        Any
+        \V++
+        \R
+        \V+
+        \H
+        \V+
+        \h
+        \V+
+        \V
+        \V++
+        \v
+        \V+
+        \Z
+        \V++
+        \z
+        \V+
+        $
+        Ket
+        End
+------------------------------------------------------------------
+
+/\v+\D \v+\d \v+\S \v+\s \v+\W \v+\w \v+. \v+\R \v+\H \v+\h \v+\V \v+\v \v+\Z \v+\z \v+$/Bx
+------------------------------------------------------------------
+        Bra
+        \v+
+        \D
+        \v++
+        \d
+        \v++
+        \S
+        \v+
+        \s
+        \v+
+        \W
+        \v++
+        \w
+        \v+
+        Any
+        \v+
+        \R
+        \v+
+        \H
+        \v++
+        \h
+        \v++
+        \V
+        \v+
+        \v
+        \v+
+        \Z
+        \v++
+        \z
+        \v+
+        $
+        Ket
+        End
+------------------------------------------------------------------
+
+/ a+\D  a+\d  a+\S  a+\s  a+\W  a+\w  a+.  a+\R  a+\H  a+\h  a+\V  a+\v  a+\Z  a+\z  a+$/Bx
+------------------------------------------------------------------
+        Bra
+        a+
+        \D
+        a++
+        \d
+        a+
+        \S
+        a++
+        \s
+        a++
+        \W
+        a+
+        \w
+        a+
+        Any
+        a++
+        \R
+        a+
+        \H
+        a++
+        \h
+        a+
+        \V
+        a++
+        \v
+        a++
+        \Z
+        a++
+        \z
+        a++
+        $
+        Ket
+        End
+------------------------------------------------------------------
+
+/\n+\D \n+\d \n+\S \n+\s \n+\W \n+\w \n+. \n+\R \n+\H \n+\h \n+\V \n+\v \n+\Z \n+\z \n+$/Bx
+------------------------------------------------------------------
+        Bra
+        \x0a+
+        \D
+        \x0a++
+        \d
+        \x0a++
+        \S
+        \x0a+
+        \s
+        \x0a+
+        \W
+        \x0a++
+        \w
+        \x0a+
+        Any
+        \x0a+
+        \R
+        \x0a+
+        \H
+        \x0a++
+        \h
+        \x0a++
+        \V
+        \x0a+
+        \v
+        \x0a+
+        \Z
+        \x0a++
+        \z
+        \x0a+
+        $
+        Ket
+        End
+------------------------------------------------------------------
+
+/ .+\D  .+\d  .+\S  .+\s  .+\W  .+\w  .+.  .+\R  .+\H  .+\h  .+\V  .+\v  .+\Z  .+\z  .+$/Bx
+------------------------------------------------------------------
+        Bra
+        Any+
+        \D
+        Any+
+        \d
+        Any+
+        \S
+        Any+
+        \s
+        Any+
+        \W
+        Any+
+        \w
+        Any+
+        Any
+        Any++
+        \R
+        Any+
+        \H
+        Any+
+        \h
+        Any+
+        \V
+        Any+
+        \v
+        Any+
+        \Z
+        Any++
+        \z
+        Any+
+        $
+        Ket
+        End
+------------------------------------------------------------------
+
+/ .+\D  .+\d  .+\S  .+\s  .+\W  .+\w  .+.  .+\R  .+\H  .+\h  .+\V  .+\v  .+\Z  .+\z  .+$/Bsx
 ------------------------------------------------------------------
         Bra
         AllAny+
@@ -13088,8 +12479,6 @@
         AllAny+
         \w
         AllAny+
-        Any
-        AllAny+
         AllAny
         AllAny+
         \R
@@ -13111,358 +12500,7 @@
         End
 ------------------------------------------------------------------
 
-/\R+\D \R+\d \R+\S \R+\s \R+\W \R+\w \R+. \R+\C \R+\R \R+\H \R+\h \R+\V \R+\v \R+\Z \R+\z \R+$/BZx
-------------------------------------------------------------------
-        Bra
-        \R+
-        \D
-        \R++
-        \d
-        \R+
-        \S
-        \R++
-        \s
-        \R+
-        \W
-        \R++
-        \w
-        \R++
-        Any
-        \R+
-        AllAny
-        \R+
-        \R
-        \R+
-        \H
-        \R++
-        \h
-        \R+
-        \V
-        \R+
-        \v
-        \R+
-        \Z
-        \R++
-        \z
-        \R+
-        $
-        Ket
-        End
-------------------------------------------------------------------
-
-/\H+\D \H+\d \H+\S \H+\s \H+\W \H+\w \H+. \H+\C \H+\R \H+\H \H+\h \H+\V \H+\v \H+\Z \H+\z \H+$/BZx
-------------------------------------------------------------------
-        Bra
-        \H+
-        \D
-        \H+
-        \d
-        \H+
-        \S
-        \H+
-        \s
-        \H+
-        \W
-        \H+
-        \w
-        \H+
-        Any
-        \H+
-        AllAny
-        \H+
-        \R
-        \H+
-        \H
-        \H++
-        \h
-        \H+
-        \V
-        \H+
-        \v
-        \H+
-        \Z
-        \H++
-        \z
-        \H+
-        $
-        Ket
-        End
-------------------------------------------------------------------
-
-/\h+\D \h+\d \h+\S \h+\s \h+\W \h+\w \h+. \h+\C \h+\R \h+\H \h+\h \h+\V \h+\v \h+\Z \h+\z \h+$/BZx
-------------------------------------------------------------------
-        Bra
-        \h+
-        \D
-        \h++
-        \d
-        \h++
-        \S
-        \h+
-        \s
-        \h+
-        \W
-        \h++
-        \w
-        \h+
-        Any
-        \h+
-        AllAny
-        \h++
-        \R
-        \h++
-        \H
-        \h+
-        \h
-        \h+
-        \V
-        \h++
-        \v
-        \h+
-        \Z
-        \h++
-        \z
-        \h+
-        $
-        Ket
-        End
-------------------------------------------------------------------
-
-/\V+\D \V+\d \V+\S \V+\s \V+\W \V+\w \V+. \V+\C \V+\R \V+\H \V+\h \V+\V \V+\v \V+\Z \V+\z \V+$/BZx
-------------------------------------------------------------------
-        Bra
-        \V+
-        \D
-        \V+
-        \d
-        \V+
-        \S
-        \V+
-        \s
-        \V+
-        \W
-        \V+
-        \w
-        \V+
-        Any
-        \V+
-        AllAny
-        \V++
-        \R
-        \V+
-        \H
-        \V+
-        \h
-        \V+
-        \V
-        \V++
-        \v
-        \V+
-        \Z
-        \V++
-        \z
-        \V+
-        $
-        Ket
-        End
-------------------------------------------------------------------
-
-/\v+\D \v+\d \v+\S \v+\s \v+\W \v+\w \v+. \v+\C \v+\R \v+\H \v+\h \v+\V \v+\v \v+\Z \v+\z \v+$/BZx
-------------------------------------------------------------------
-        Bra
-        \v+
-        \D
-        \v++
-        \d
-        \v++
-        \S
-        \v+
-        \s
-        \v+
-        \W
-        \v++
-        \w
-        \v+
-        Any
-        \v+
-        AllAny
-        \v+
-        \R
-        \v+
-        \H
-        \v++
-        \h
-        \v++
-        \V
-        \v+
-        \v
-        \v+
-        \Z
-        \v++
-        \z
-        \v+
-        $
-        Ket
-        End
-------------------------------------------------------------------
-
-/ a+\D  a+\d  a+\S  a+\s  a+\W  a+\w  a+.  a+\C  a+\R  a+\H  a+\h  a+\V  a+\v  a+\Z  a+\z  a+$/BZx
-------------------------------------------------------------------
-        Bra
-        a+
-        \D
-        a++
-        \d
-        a+
-        \S
-        a++
-        \s
-        a++
-        \W
-        a+
-        \w
-        a+
-        Any
-        a+
-        AllAny
-        a++
-        \R
-        a+
-        \H
-        a++
-        \h
-        a+
-        \V
-        a++
-        \v
-        a++
-        \Z
-        a++
-        \z
-        a++
-        $
-        Ket
-        End
-------------------------------------------------------------------
-
-/\n+\D \n+\d \n+\S \n+\s \n+\W \n+\w \n+. \n+\C \n+\R \n+\H \n+\h \n+\V \n+\v \n+\Z \n+\z \n+$/BZx
-------------------------------------------------------------------
-        Bra
-        \x0a+
-        \D
-        \x0a++
-        \d
-        \x0a++
-        \S
-        \x0a+
-        \s
-        \x0a+
-        \W
-        \x0a++
-        \w
-        \x0a+
-        Any
-        \x0a+
-        AllAny
-        \x0a+
-        \R
-        \x0a+
-        \H
-        \x0a++
-        \h
-        \x0a++
-        \V
-        \x0a+
-        \v
-        \x0a+
-        \Z
-        \x0a++
-        \z
-        \x0a+
-        $
-        Ket
-        End
-------------------------------------------------------------------
-
-/ .+\D  .+\d  .+\S  .+\s  .+\W  .+\w  .+.  .+\C  .+\R  .+\H  .+\h  .+\V  .+\v  .+\Z  .+\z  .+$/BZx
-------------------------------------------------------------------
-        Bra
-        Any+
-        \D
-        Any+
-        \d
-        Any+
-        \S
-        Any+
-        \s
-        Any+
-        \W
-        Any+
-        \w
-        Any+
-        Any
-        Any+
-        AllAny
-        Any++
-        \R
-        Any+
-        \H
-        Any+
-        \h
-        Any+
-        \V
-        Any+
-        \v
-        Any+
-        \Z
-        Any++
-        \z
-        Any+
-        $
-        Ket
-        End
-------------------------------------------------------------------
-
-/ .+\D  .+\d  .+\S  .+\s  .+\W  .+\w  .+.  .+\C  .+\R  .+\H  .+\h  .+\V  .+\v  .+\Z  .+\z  .+$/BZxs
-------------------------------------------------------------------
-        Bra
-        AllAny+
-        \D
-        AllAny+
-        \d
-        AllAny+
-        \S
-        AllAny+
-        \s
-        AllAny+
-        \W
-        AllAny+
-        \w
-        AllAny+
-        AllAny
-        AllAny+
-        AllAny
-        AllAny+
-        \R
-        AllAny+
-        \H
-        AllAny+
-        \h
-        AllAny+
-        \V
-        AllAny+
-        \v
-        AllAny+
-        \Z
-        AllAny++
-        \z
-        AllAny+
-        $
-        Ket
-        End
-------------------------------------------------------------------
-
-/\D+$  \d+$  \S+$  \s+$  \W+$  \w+$  \C+$  \R+$  \H+$  \h+$  \V+$  \v+$   a+$  \n+$   .+$  .+$/BZxm
+/ \D+$  \d+$  \S+$  \s+$  \W+$  \w+$  \R+$  \H+$  \h+$  \V+$ \v+$  a+$   \n+$  .+$  .+$/Bmx
 ------------------------------------------------------------------
         Bra
         \D+
@@ -13477,8 +12515,6 @@
      /m $
         \w++
      /m $
-        AllAny+
-     /m $
         \R+
      /m $
         \H+
@@ -13501,7 +12537,7 @@
         End
 ------------------------------------------------------------------
 
-/(?=a+)a(a+)++a/BZ
+/(?=a+)a(a+)++a/B
 ------------------------------------------------------------------
         Bra
         Assert
@@ -13516,7 +12552,7 @@
         End
 ------------------------------------------------------------------
 
-/a+(bb|cc)a+(?:bb|cc)a+(?>bb|cc)a+(?:bb|cc)+a+(aa)a+(?:bb|aa)/BZ
+/a+(bb|cc)a+(?:bb|cc)a+(?>bb|cc)a+(?:bb|cc)+a+(aa)a+(?:bb|aa)/B
 ------------------------------------------------------------------
         Bra
         a++
@@ -13557,7 +12593,7 @@
         End
 ------------------------------------------------------------------
 
-/a+(bb|cc)?#a+(?:bb|cc)??#a+(?:bb|cc)?+#a+(?:bb|cc)*#a+(bb|cc)?a#a+(?:aa)?/BZ
+/a+(bb|cc)?#a+(?:bb|cc)??#a+(?:bb|cc)?+#a+(?:bb|cc)*#a+(bb|cc)?a#a+(?:aa)?/B
 ------------------------------------------------------------------
         Bra
         a++
@@ -13611,7 +12647,7 @@
         End
 ------------------------------------------------------------------
 
-/a+(?:bb)?a#a+(?:|||)#a+(?:|b)a#a+(?:|||)?a/BZ
+/a+(?:bb)?a#a+(?:|||)#a+(?:|b)a#a+(?:|||)?a/B
 ------------------------------------------------------------------
         Bra
         a+
@@ -13645,7 +12681,7 @@
         End
 ------------------------------------------------------------------
 
-/[ab]*/BZ
+/[ab]*/B
 ------------------------------------------------------------------
         Bra
         [ab]*+
@@ -13655,7 +12691,7 @@
     aaaa
  0: aaaa
 
-/[ab]*?/BZ
+/[ab]*?/B
 ------------------------------------------------------------------
         Bra
         [ab]*?
@@ -13665,7 +12701,7 @@
     aaaa
  0: 
 
-/[ab]?/BZ
+/[ab]?/B
 ------------------------------------------------------------------
         Bra
         [ab]?+
@@ -13675,7 +12711,7 @@
     aaaa
  0: a
 
-/[ab]??/BZ
+/[ab]??/B
 ------------------------------------------------------------------
         Bra
         [ab]??
@@ -13685,7 +12721,7 @@
     aaaa
  0: 
 
-/[ab]+/BZ
+/[ab]+/B
 ------------------------------------------------------------------
         Bra
         [ab]++
@@ -13695,7 +12731,7 @@
     aaaa
  0: aaaa
 
-/[ab]+?/BZ
+/[ab]+?/B
 ------------------------------------------------------------------
         Bra
         [ab]+?
@@ -13705,7 +12741,7 @@
     aaaa
  0: a
 
-/[ab]{2,3}/BZ
+/[ab]{2,3}/B
 ------------------------------------------------------------------
         Bra
         [ab]{2,3}+
@@ -13715,7 +12751,7 @@
     aaaa
  0: aaa
 
-/[ab]{2,3}?/BZ
+/[ab]{2,3}?/B
 ------------------------------------------------------------------
         Bra
         [ab]{2,3}?
@@ -13725,7 +12761,7 @@
     aaaa
  0: aa
 
-/[ab]{2,}/BZ
+/[ab]{2,}/B
 ------------------------------------------------------------------
         Bra
         [ab]{2,}+
@@ -13735,7 +12771,7 @@
     aaaa
  0: aaaa
 
-/[ab]{2,}?/BZ
+/[ab]{2,}?/B
 ------------------------------------------------------------------
         Bra
         [ab]{2,}?
@@ -13745,7 +12781,7 @@
     aaaa
  0: aa
 
-/\d+\s{0,5}=\s*\S?=\w{0,4}\W*/BZ
+/\d+\s{0,5}=\s*\S?=\w{0,4}\W*/B
 ------------------------------------------------------------------
         Bra
         \d++
@@ -13760,7 +12796,7 @@
         End
 ------------------------------------------------------------------
 
-/[a-d]{5,12}[e-z0-9]*#[^a-z]+[b-y]*a[2-7]?[^0-9a-z]+/BZ
+/[a-d]{5,12}[e-z0-9]*#[^a-z]+[b-y]*a[2-7]?[^0-9a-z]+/B
 ------------------------------------------------------------------
         Bra
         [a-d]{5,12}+
@@ -13775,7 +12811,7 @@
         End
 ------------------------------------------------------------------
 
-/[a-z]*\s#[ \t]?\S#[a-c]*\S#[C-G]+?\d#[4-8]*\D#[4-9,]*\D#[!$]{0,5}\w#[M-Xf-l]+\W#[a-c,]?\W/BZ
+/[a-z]*\s#[ \t]?\S#[a-c]*\S#[C-G]+?\d#[4-8]*\D#[4-9,]*\D#[!$]{0,5}\w#[M-Xf-l]+\W#[a-c,]?\W/B
 ------------------------------------------------------------------
         Bra
         [a-z]*+
@@ -13808,7 +12844,7 @@
         End
 ------------------------------------------------------------------
 
-/a+(aa|bb)*c#a*(bb|cc)*a#a?(bb|cc)*d#[a-f]*(g|hh)*f/BZ
+/a+(aa|bb)*c#a*(bb|cc)*a#a?(bb|cc)*d#[a-f]*(g|hh)*f/B
 ------------------------------------------------------------------
         Bra
         a+
@@ -13847,7 +12883,7 @@
         End
 ------------------------------------------------------------------
 
-/[a-f]*(g|hh|i)*i#[a-x]{4,}(y{0,6})*y#[a-k]+(ll|mm)+n/BZ
+/[a-f]*(g|hh|i)*i#[a-x]{4,}(y{0,6})*y#[a-k]+(ll|mm)+n/B
 ------------------------------------------------------------------
         Bra
         [a-f]*+
@@ -13877,7 +12913,7 @@
         End
 ------------------------------------------------------------------
 
-/[a-f]*(?>gg|hh)+#[a-f]*(?>gg|hh)?#[a-f]*(?>gg|hh)*a#[a-f]*(?>gg|hh)*h/BZ
+/[a-f]*(?>gg|hh)+#[a-f]*(?>gg|hh)?#[a-f]*(?>gg|hh)*a#[a-f]*(?>gg|hh)*h/B
 ------------------------------------------------------------------
         Bra
         [a-f]*+
@@ -13915,7 +12951,7 @@
         End
 ------------------------------------------------------------------
 
-/[a-c]*d/DZS
+/[a-c]*d/IB
 ------------------------------------------------------------------
         Bra
         [a-c]*+
@@ -13924,13 +12960,11 @@
         End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
-No options
-No first char
-Need char = 'd'
+Starting code units: a b c d 
+Last code unit = 'd'
 Subject length lower bound = 1
-Starting chars: a b c d 
 
-/[a-c]+d/DZS
+/[a-c]+d/IB
 ------------------------------------------------------------------
         Bra
         [a-c]++
@@ -13939,13 +12973,11 @@
         End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
-No options
-No first char
-Need char = 'd'
+Starting code units: a b c 
+Last code unit = 'd'
 Subject length lower bound = 2
-Starting chars: a b c 
 
-/[a-c]?d/DZS
+/[a-c]?d/IB
 ------------------------------------------------------------------
         Bra
         [a-c]?+
@@ -13954,13 +12986,11 @@
         End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
-No options
-No first char
-Need char = 'd'
+Starting code units: a b c d 
+Last code unit = 'd'
 Subject length lower bound = 1
-Starting chars: a b c d 
 
-/[a-c]{4,6}d/DZS
+/[a-c]{4,6}d/IB
 ------------------------------------------------------------------
         Bra
         [a-c]{4,6}+
@@ -13969,13 +12999,11 @@
         End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
-No options
-No first char
-Need char = 'd'
+Starting code units: a b c 
+Last code unit = 'd'
 Subject length lower bound = 5
-Starting chars: a b c 
 
-/[a-c]{0,6}d/DZS
+/[a-c]{0,6}d/IB
 ------------------------------------------------------------------
         Bra
         [a-c]{0,6}+
@@ -13984,30 +13012,29 @@
         End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
-No options
-No first char
-Need char = 'd'
+Starting code units: a b c d 
+Last code unit = 'd'
 Subject length lower bound = 1
-Starting chars: a b c d 
 
-/-- End of special auto-possessive tests --/
+# End of special auto-possessive tests 
 
 /^A\o{1239}B/
-Failed: non-octal character in \o{} (closing brace missing?) at offset 8
+Failed: error 164 at offset 8: non-octal character in \o{} (closing brace missing?)
+    A\123B
 
 /^A\oB/
-Failed: missing opening brace after \o at offset 3
-
-/^A\x{zz}B/ 
-Failed: non-hex character in \x{} (closing brace missing?) at offset 5
+Failed: error 155 at offset 3: missing opening brace after \o
+    
+/^A\x{zz}B/
+Failed: error 167 at offset 5: non-hex character in \x{} (closing brace missing?)
 
 /^A\x{12Z/
-Failed: non-hex character in \x{} (closing brace missing?) at offset 7
+Failed: error 167 at offset 7: non-hex character in \x{} (closing brace missing?)
 
 /^A\x{/
-Failed: non-hex character in \x{} (closing brace missing?) at offset 5
+Failed: error 167 at offset 5: non-hex character in \x{} (closing brace missing?)
 
-/[ab]++/BZO
+/[ab]++/B,no_auto_possess
 ------------------------------------------------------------------
         Bra
         [ab]++
@@ -14015,7 +13042,7 @@
         End
 ------------------------------------------------------------------
 
-/[^ab]*+/BZO
+/[^ab]*+/B,no_auto_possess
 ------------------------------------------------------------------
         Bra
         [\x00-`c-\xff] (neg)*+
@@ -14023,7 +13050,7 @@
         End
 ------------------------------------------------------------------
 
-/a{4}+/BZO
+/a{4}+/B,no_auto_possess
 ------------------------------------------------------------------
         Bra
         a{4}
@@ -14031,7 +13058,7 @@
         End
 ------------------------------------------------------------------
 
-/a{4}+/BZOi
+/a{4}+/Bi,no_auto_possess
 ------------------------------------------------------------------
         Bra
      /i a{4}
@@ -14040,82 +13067,82 @@
 ------------------------------------------------------------------
 
 /[a-[:digit:]]+/
-Failed: invalid range in character class at offset 3
+Failed: error 150 at offset 3: invalid range in character class
 
 /[A-[:digit:]]+/
-Failed: invalid range in character class at offset 3
+Failed: error 150 at offset 3: invalid range in character class
 
 /[a-[.xxx.]]+/
-Failed: invalid range in character class at offset 3
+Failed: error 150 at offset 3: invalid range in character class
 
 /[a-[=xxx=]]+/
-Failed: invalid range in character class at offset 3
+Failed: error 150 at offset 3: invalid range in character class
 
 /[a-[!xxx!]]+/
-Failed: range out of order in character class at offset 3
+Failed: error 108 at offset 3: range out of order in character class
 
 /[A-[!xxx!]]+/
     A]]]
  0: A]]]
 
 /[a-\d]+/
-Failed: invalid range in character class at offset 4
+Failed: error 150 at offset 4: invalid range in character class
 
 /(?<0abc>xx)/
-Failed: group name must start with a non-digit at offset 3
+Failed: error 144 at offset 3: group name must start with a non-digit
 
 /(?&1abc)xx(?<1abc>y)/
-Failed: group name must start with a non-digit at offset 3
+Failed: error 144 at offset 13: group name must start with a non-digit
 
 /(?<ab-cd>xx)/
-Failed: syntax error in subpattern name (missing terminator) at offset 5
+Failed: error 142 at offset 5: syntax error in subpattern name (missing terminator)
 
 /(?'0abc'xx)/
-Failed: group name must start with a non-digit at offset 3
+Failed: error 144 at offset 3: group name must start with a non-digit
 
 /(?P<0abc>xx)/
-Failed: group name must start with a non-digit at offset 4
+Failed: error 144 at offset 4: group name must start with a non-digit
 
 /\k<5ghj>/
-Failed: group name must start with a non-digit at offset 3
+Failed: error 144 at offset 3: group name must start with a non-digit
 
 /\k'5ghj'/
-Failed: group name must start with a non-digit at offset 3
+Failed: error 144 at offset 3: group name must start with a non-digit
 
 /\k{2fgh}/
-Failed: group name must start with a non-digit at offset 3
+Failed: error 144 at offset 3: group name must start with a non-digit
 
 /(?P=8yuki)/
-Failed: group name must start with a non-digit at offset 4
+Failed: error 144 at offset 4: group name must start with a non-digit
 
 /\g{4df}/
-Failed: group name must start with a non-digit at offset 3
+Failed: error 144 at offset 3: group name must start with a non-digit
 
 /(?&1abc)xx(?<1abc>y)/
-Failed: group name must start with a non-digit at offset 3
+Failed: error 144 at offset 13: group name must start with a non-digit
 
 /(?P>1abc)xx(?<1abc>y)/
-Failed: group name must start with a non-digit at offset 4
+Failed: error 144 at offset 14: group name must start with a non-digit
 
 /\g'3gh'/
-Failed: \g is not followed by a braced, angle-bracketed, or quoted name/number or by a plain number at offset 2
+Failed: error 157 at offset 2: \g is not followed by a braced, angle-bracketed, or quoted name/number or by a plain number
 
 /\g<5fg>/
-Failed: \g is not followed by a braced, angle-bracketed, or quoted name/number or by a plain number at offset 2
+Failed: error 157 at offset 2: \g is not followed by a braced, angle-bracketed, or quoted name/number or by a plain number
 
 /(?(<4gh>)abc)/
-Failed: group name must start with a non-digit at offset 4
+Failed: error 144 at offset 4: group name must start with a non-digit
 
 /(?('4gh')abc)/
-Failed: group name must start with a non-digit at offset 4
+Failed: error 144 at offset 4: group name must start with a non-digit
 
 /(?(4gh)abc)/
-Failed: malformed number or name after (?( at offset 4
+Failed: error 126 at offset 4: malformed number or name after (?(
 
 /(?(R&6yh)abc)/
-Failed: group name must start with a non-digit at offset 5
+Failed: error 144 at offset 5: group name must start with a non-digit
 
-/(((a\2)|(a*)\g<-1>))*a?/BZ
+/(((a\2)|(a*)\g<-1>))*a?/B
 ------------------------------------------------------------------
         Bra
         Brazero
@@ -14139,9 +13166,9 @@
         End
 ------------------------------------------------------------------
 
-/-- Test the ugly "start or end of word" compatibility syntax --/
+# Test the ugly "start or end of word" compatibility syntax.
 
-/[[:<:]]red[[:>:]]/BZ
+/[[:<:]]red[[:>:]]/B
 ------------------------------------------------------------------
         Bra
         \b
@@ -14165,37 +13192,41 @@
  0: red
     put it all on red  
  0: red
-    ** Failers
-No match
+\= Expect no match
     no reduction
 No match
     Alfred Winifred
 No match
     
-/[a[:<:]] should give error/ 
-Failed: unknown POSIX class name at offset 4
+/[a[:<:]] should give error/
+Failed: error 130 at offset 4: unknown POSIX class name
 
-/(?=ab\K)/+
-    abcd
+/(?=ab\K)/aftertext
+    abcd\=startchar
 Start of matched string is beyond its end - displaying from end to start.
  0: ab
  0+ abcd
 
-/abcd/f<lf>
+/abcd/newline=lf,firstline
+\= Expect no match
     xx\nxabcd
 No match
     
-/ -- Test stack check external calls --/ 
+# Test stack guard external calls.
 
-/(((((a)))))/Q0
+/(((a)))/stackguard=1
+Failed: error 133 at offset 2: parentheses are too deeply nested (stack check)
 
-/(((((a)))))/Q1
-Failed: parentheses are too deeply nested (stack check) at offset 0
+/(((a)))/stackguard=2
+Failed: error 133 at offset 3: parentheses are too deeply nested (stack check)
 
-/(((((a)))))/Q
-** Missing 0 or 1 after /Q
+/(((a)))/stackguard=3
 
-/^\w+(?>\s*)(?<=\w)/BZ
+/(((((a)))))/
+
+# End stack guard tests
+
+/^\w+(?>\s*)(?<=\w)/B
 ------------------------------------------------------------------
         Bra
         ^
@@ -14212,21 +13243,367 @@
 ------------------------------------------------------------------
 
 /\othing/
-Failed: missing opening brace after \o at offset 1
+Failed: error 155 at offset 1: missing opening brace after \o
 
 /\o{}/
-Failed: digits missing in \x{} or \o{} at offset 1
+Failed: error 178 at offset 1: digits missing in \x{} or \o{}
 
 /\o{whatever}/
-Failed: non-octal character in \o{} (closing brace missing?) at offset 3
+Failed: error 164 at offset 3: non-octal character in \o{} (closing brace missing?)
 
 /\xthing/
 
 /\x{}/
-Failed: digits missing in \x{} or \o{} at offset 3
+Failed: error 178 at offset 3: digits missing in \x{} or \o{}
 
 /\x{whatever}/
-Failed: non-hex character in \x{} (closing brace missing?) at offset 3
+Failed: error 167 at offset 3: non-hex character in \x{} (closing brace missing?)
+
+/A\8B/
+Failed: error 115 at offset 2: reference to non-existent subpattern
+
+/A\9B/
+Failed: error 115 at offset 2: reference to non-existent subpattern
+
+# This one is here because Perl fails to match "12" for this pattern when the $ 
+# is present.
+    
+/^(?(?=abc)\w{3}:|\d\d)$/
+    abc:
+ 0: abc:
+    12
+ 0: 12
+\= Expect no match
+    123
+No match
+    xyz    
+No match
+
+# Perl gets this one wrong, giving "a" as the after text for ca and failing to 
+# match for cd.
+
+/(?(?=ab)ab)/aftertext
+    abxxx
+ 0: ab
+ 0+ xxx
+    ca
+ 0: 
+ 0+ ca
+    cd 
+ 0: 
+ 0+ cd
+    
+# This should test both paths for processing OP_RECURSE. 
+
+/(?(R)a+|(?R)b)/
+    aaaabcde
+ 0: aaaab
+    aaaabcde\=ovector=100
+ 0: aaaab
+
+/a*?b*?/
+    ab
+ 0: 
+
+/(*NOTEMPTY)a*?b*?/
+    ab
+ 0: a
+    ba
+ 0: b
+    cb  
+ 0: b
+
+/(*NOTEMPTY_ATSTART)a*?b*?/aftertext
+    ab
+ 0: a
+ 0+ b
+    cdab 
+ 0: 
+ 0+ dab
+
+/(?(VERSION>=10.0)yes|no)/I
+Capturing subpattern count = 0
+Subject length lower bound = 2
+    yesno
+ 0: yes
+    
+/(?(VERSION=8)yes){3}/BI,aftertext
+------------------------------------------------------------------
+        Bra
+        Cond
+        Cond false
+        yes
+        Ket
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+May match empty string
+Subject length lower bound = 0
+    yesno
+ 0: 
+ 0+ yesno
+
+/(?(VERSION=8)yes|no){3}/I
+Capturing subpattern count = 0
+Subject length lower bound = 6
+    yesnononoyes
+ 0: nonono
+\= Expect no match
+    yesno   
+No match
+
+/(?:(?<VERSION>abc)|xyz)(?(VERSION)yes|no)/I
+Capturing subpattern count = 1
+Max back reference = 1
+Named capturing subpatterns:
+  VERSION   1
+Starting code units: a x 
+Subject length lower bound = 5
+    abcyes
+ 0: abcyes
+ 1: abc
+    xyzno
+ 0: xyzno
+\= Expect no match
+    abcno
+No match
+    xyzyes    
+No match
+
+/(?(VERSION<10)yes|no)/
+Failed: error 179 at offset 10: syntax error in (?(VERSION condition
+
+/(?(VERSION>10)yes|no)/
+Failed: error 179 at offset 11: syntax error in (?(VERSION condition
+
+/(?(VERSION>=10.0.0)yes|no)/
+Failed: error 179 at offset 16: syntax error in (?(VERSION condition
+
+/(?(VERSION=10.101)yes|no)/
+Failed: error 179 at offset 17: syntax error in (?(VERSION condition
+
+/abcd/I
+Capturing subpattern count = 0
+First code unit = 'a'
+Last code unit = 'd'
+Subject length lower bound = 4
+
+/abcd/I,no_start_optimize
+Capturing subpattern count = 0
+Options: no_start_optimize
+Subject length lower bound = 0
+
+/(|ab)*?d/I
+Capturing subpattern count = 1
+Starting code units: a d 
+Last code unit = 'd'
+Subject length lower bound = 1
+   abd
+ 0: abd
+ 1: ab
+   xyd 
+ 0: d
+
+/(|ab)*?d/I,no_start_optimize
+Capturing subpattern count = 1
+Options: no_start_optimize
+Last code unit = 'd'
+Subject length lower bound = 0
+   abd
+ 0: abd
+ 1: ab
+   xyd 
+ 0: d
+
+/\k<A>*(?<A>aa)(?<A>bb)/match_unset_backref,dupnames
+    aabb
+ 0: aabb
+ 1: aa
+ 2: bb
+
+/(((((a)))))/parens_nest_limit=2
+Failed: error 119 at offset 3: parentheses are too deeply nested
+
+/abc/replace=XYZ
+    123123
+ 0: 123123
+    123abc123
+ 1: 123XYZ123
+    123abc123abc123
+ 1: 123XYZ123abc123
+    123123\=zero_terminate
+ 0: 123123
+    123abc123\=zero_terminate
+ 1: 123XYZ123
+    123abc123abc123\=zero_terminate
+ 1: 123XYZ123abc123
+
+/abc/g,replace=XYZ
+    123abc123
+ 1: 123XYZ123
+    123abc123abc123
+ 2: 123XYZ123XYZ123
+
+/abc/replace=X$$Z
+    123abc123
+ 1: 123X$Z123
+
+/abc/g,replace=X$$Z
+    123abc123abc123
+ 2: 123X$Z123X$Z123
+
+/a(b)c(d)e/replace=X$1Y${2}Z
+    "abcde"
+ 1: "XbYdZ"
+
+/a(b)c(d)e/replace=X$1Y${2}Z,global
+    "abcde-abcde"
+ 2: "XbYdZ-XbYdZ"
+
+/a(?<ONE>b)c(?<TWO>d)e/replace=X$ONE+${TWO}Z
+    "abcde"
+ 1: "Xb+dZ"
+
+/a(?<ONE>b)c(?<TWO>d)e/g,replace=X$ONE+${TWO}Z
+    "abcde-abcde-"
+ 2: "Xb+dZ-Xb+dZ-"
+
+/abc/replace=a$++
+    123abc
+Failed: error -35 at offset 2 in replacement: invalid replacement string
+
+/abc/replace=a$bad
+    123abc
+Failed: error -49 at offset 5 in replacement: unknown substring
+
+/abc/replace=a${A234567890123456789_123456789012}z
+    123abc
+Failed: error -49 at offset 36 in replacement: unknown substring
+
+/abc/replace=a${A23456789012345678901234567890123}z
+    123abc
+Failed: error -35 at offset 35 in replacement: invalid replacement string
+
+/abc/replace=a${bcd
+    123abc
+Failed: error -58 at offset 6 in replacement: expected closing curly bracket in replacement string
+
+/abc/replace=a${b+d}z
+    123abc
+Failed: error -58 at offset 4 in replacement: expected closing curly bracket in replacement string
+
+/abc/replace=[10]XYZ
+    123abc123
+ 1: 123XYZ123
+
+/abc/replace=[9]XYZ
+    123abc123
+Failed: error -48: no more memory
+    
+/abc/replace=xyz
+    1abc2\=partial_hard
+Failed: error -34: bad option value
+
+/abc/replace=xyz
+    123abc456
+ 1: 123xyz456
+    123abc456\=replace=pqr
+ 1: 123pqr456
+    123abc456abc789
+ 1: 123xyz456abc789
+    123abc456abc789\=g
+ 2: 123xyz456xyz789
+
+/(?<=abc)(|def)/g,replace=<$0>
+    123abcxyzabcdef789abcpqr
+ 4: 123abc<>xyzabc<><def>789abc<>pqr
+    
+/./replace=$0
+    a
+ 1: a
+    
+/(.)(.)/replace=$2+$1
+    abc
+ 1: b+ac
+    
+/(?<A>.)(?<B>.)/replace=$B+$A
+    abc
+ 1: b+ac
+    
+/(.)(.)/g,replace=$2$1
+    abcdefgh  
+ 4: badcfehg
+    
+/(*:pear)apple|(*:orange)lemon|(*:strawberry)blackberry/g,replace=${*MARK}
+    apple lemon blackberry
+ 3: pear orange strawberry
+    apple strudel
+ 1: pear strudel
+    fruitless  
+ 0: fruitless
+
+/(*:pear)apple|(*:orange)lemon|(*:strawberry)blackberry/replace=${*MARK} sauce,
+    apple lemon blackberry
+ 1: pear sauce lemon blackberry
+
+/(*:pear)apple|(*:orange)lemon|(*:strawberry)blackberry/g,replace=<$*MARK>
+    apple lemon blackberry
+ 3: <pear> <orange> <strawberry>
+    apple strudel
+ 1: <pear> strudel
+    fruitless  
+ 0: fruitless
+    
+/(*:pear)apple/g,replace=${*MARKING} 
+    apple lemon blackberry
+Failed: error -35 at offset 11 in replacement: invalid replacement string
+
+/(*:pear)apple/g,replace=${*MARK-time
+    apple lemon blackberry
+Failed: error -58 at offset 7 in replacement: expected closing curly bracket in replacement string
+
+/(*:pear)apple/g,replace=${*mark} 
+    apple lemon blackberry
+Failed: error -35 at offset 8 in replacement: invalid replacement string
+
+/(*:pear)apple|(*:orange)lemon|(*:strawberry)blackberry/g,replace=<$*MARKET>
+    apple lemon blackberry
+Failed: error -35 at offset 9 in replacement: invalid replacement string
+
+/(*:pear)apple|(*:orange)lemon|(*:strawberry)blackberry/g,replace=[22]${*MARK}
+    apple lemon blackberry
+Failed: error -48: no more memory
+    apple lemon blackberry\=substitute_overflow_length
+Failed: error -48: no more memory: 23 code units are needed
+
+/(*:pear)apple|(*:orange)lemon|(*:strawberry)blackberry/g,replace=[23]${*MARK}
+    apple lemon blackberry
+ 3: pear orange strawberry
+
+/abc/
+    123abc123\=replace=[9]XYZ
+Failed: error -48: no more memory
+    123abc123\=substitute_overflow_length,replace=[9]XYZ
+Failed: error -48: no more memory: 10 code units are needed
+    123abc123\=substitute_overflow_length,replace=[6]XYZ
+Failed: error -48: no more memory: 10 code units are needed
+    123abc123\=substitute_overflow_length,replace=[1]XYZ
+Failed: error -48: no more memory: 10 code units are needed
+    123abc123\=substitute_overflow_length,replace=[0]XYZ
+Failed: error -48: no more memory: 10 code units are needed
+
+/a(b)c/
+    123abc123\=replace=[9]x$1z
+Failed: error -48: no more memory
+    123abc123\=substitute_overflow_length,replace=[9]x$1z
+Failed: error -48: no more memory: 10 code units are needed
+    123abc123\=substitute_overflow_length,replace=[6]x$1z
+Failed: error -48: no more memory: 10 code units are needed
+    123abc123\=substitute_overflow_length,replace=[1]x$1z
+Failed: error -48: no more memory: 10 code units are needed
+    123abc123\=substitute_overflow_length,replace=[0]x$1z
+Failed: error -48: no more memory: 10 code units are needed
 
 "((?=(?(?=(?(?=(?(?=()))))))))"
     a
@@ -14235,52 +13612,180 @@
  2: 
 
 "(?(?=)==)(((((((((?=)))))))))"
+\= Expect no match
     a
 No match
 
-/^(?:(a)|b)(?(1)A|B)/I
-Capturing subpattern count = 1
-Max back reference = 1
-Options: anchored
-No first char
-No need char
-    aA123\O3
+/(a)(b)|(c)/
+    XcX\=ovector=2,get=1,get=2,get=3,get=4,getall
+Matched, but too many substrings
+ 0: c
+ 1: <unset>
+Get substring 1 failed (-55): requested value is not set
+Get substring 2 failed (-54): requested value is not available
+Get substring 3 failed (-54): requested value is not available
+Get substring 4 failed (-49): unknown substring
+ 0L c
+ 1L 
+    
+/x(?=ab\K)/
+    xab\=get=0 
+Start of matched string is beyond its end - displaying from end to start.
+ 0: ab
+ 0G  (0)
+    xab\=copy=0 
+Start of matched string is beyond its end - displaying from end to start.
+ 0: ab
+ 0C  (0)
+    xab\=getall
+Start of matched string is beyond its end - displaying from end to start.
+ 0: ab
+ 0L 
+
+/(?<A>a)|(?<A>b)/dupnames
+    a\=ovector=1,copy=A,get=A,get=2
+Matched, but too many substrings
+ 0: a
+Copy substring 'A' failed (-54): requested value is not available
+Get substring 2 failed (-54): requested value is not available
+Get substring 'A' failed (-54): requested value is not available
+    a\=ovector=2,copy=A,get=A,get=2
+ 0: a
+ 1: a
+  C a (1) A (non-unique)
+Get substring 2 failed (-54): requested value is not available
+  G a (1) A (non-unique)
+    b\=ovector=2,copy=A,get=A,get=2
+Matched, but too many substrings
+ 0: b
+ 1: <unset>
+Copy substring 'A' failed (-55): requested value is not set
+Get substring 2 failed (-54): requested value is not available
+Get substring 'A' failed (-55): requested value is not set
+
+/a(b)c(d)/
+    abc\=ph,copy=0,copy=1,getall
+Partial match: abc
+ 0C abc (3)
+Copy substring 1 failed (-2): partial match
+get substring list failed (-2): partial match
+
+/^abc/info
+Capturing subpattern count = 0
+Compile options: <none>
+Overall options: anchored
+Subject length lower bound = 3
+
+/^abc/info,no_dotstar_anchor
+Capturing subpattern count = 0
+Compile options: no_dotstar_anchor
+Overall options: anchored no_dotstar_anchor
+Subject length lower bound = 3
+
+/.*\d/info,auto_callout
+Capturing subpattern count = 0
+Options: auto_callout
+First code unit at start or follows newline
+Subject length lower bound = 1
+\= Expect no match
+    aaa
+--->aaa
+ +0 ^       .*
+ +2 ^  ^    \d
+ +2 ^ ^     \d
+ +2 ^^      \d
+ +2 ^       \d
+No match
+
+/.*\d/info,no_dotstar_anchor,auto_callout
+Capturing subpattern count = 0
+Options: auto_callout no_dotstar_anchor
+Subject length lower bound = 1
+\= Expect no match
+    aaa
+--->aaa
+ +0 ^       .*
+ +2 ^  ^    \d
+ +2 ^ ^     \d
+ +2 ^^      \d
+ +2 ^       \d
+ +0  ^      .*
+ +2  ^ ^    \d
+ +2  ^^     \d
+ +2  ^      \d
+ +0   ^     .*
+ +2   ^^    \d
+ +2   ^     \d
+No match
+
+/.*\d/dotall,info
+Capturing subpattern count = 0
+Compile options: dotall
+Overall options: anchored dotall
+Subject length lower bound = 1
+
+/.*\d/dotall,no_dotstar_anchor,info
+Capturing subpattern count = 0
+Options: dotall no_dotstar_anchor
+Subject length lower bound = 1
+
+/(*NO_DOTSTAR_ANCHOR)(?s).*\d/info
+Capturing subpattern count = 0
+Compile options: <none>
+Overall options: no_dotstar_anchor
+Subject length lower bound = 1
+
+'^(?:(a)|b)(?(1)A|B)'
+    aA123\=ovector=1
 Matched, but too many substrings
  0: aA
-    aA123\O6
+    aA123\=ovector=2
  0: aA
  1: a
 
 '^(?:(?<AA>a)|b)(?(<AA>)A|B)'
-    aA123\O3
+    aA123\=ovector=1
 Matched, but too many substrings
  0: aA
-    aA123\O6
+    aA123\=ovector=2
  0: aA
  1: a
 
-'^(?<AA>)(?:(?<AA>a)|b)(?(<AA>)A|B)'J
-    aA123\O3
+'^(?<AA>)(?:(?<AA>a)|b)(?(<AA>)A|B)'dupnames
+    aA123\=ovector=1
 Matched, but too many substrings
  0: aA
-    aA123\O6
+    aA123\=ovector=2
 Matched, but too many substrings
  0: aA
  1: 
+    aA123\=ovector=3
+ 0: aA
+ 1: 
+ 2: a
 
-'^(?:(?<AA>X)|)(?:(?<AA>a)|b)\k{AA}'J
-    aa123\O3
+'^(?:(?<AA>X)|)(?:(?<AA>a)|b)\k{AA}'dupnames
+    aa123\=ovector=1
 Matched, but too many substrings
  0: aa
-    aa123\O6
+    aa123\=ovector=2
 Matched, but too many substrings
  0: aa
  1: <unset>
+    aa123\=ovector=3
+ 0: aa
+ 1: <unset>
+ 2: a
 
 /(?<N111>(?J)(?<N111>1(111111)11|)1|1|)(?(<N111>)1)/
 
+/(?<N>(?J)(?<N>))(?-J)\k<N>/
+
+# Quantifiers are not allowed on condition assertions, but are otherwise
+# OK in conditions.
+
 /(?(?=0)?)+/
-Failed: nothing to repeat at offset 7
+Failed: error 109 at offset 7: quantifier does not follow a repeatable item
 
 /(?(?=0)(?=00)?00765)/
      00765
@@ -14291,8 +13796,7 @@
  0: 00765
      456
  0: 456
-     ** Failers
-No match
+\= Expect no match
      356   
 No match
 
@@ -14301,7 +13805,7 @@
  0: g
  1: <unset>
  2: g
-    g\O3
+    g\=ovector=1 
 Matched, but too many substrings
  0: g
 
@@ -14309,20 +13813,15 @@
     g
  0: g
  1: g
-    g\O3
+    g\=ovector=1 
 Matched, but too many substrings
  0: g
-
-//C
-    \O\C+
-Callout 255: last capture = -1
---->
- +0 ^    
-Matched, but too many substrings
+    
+# These two pattern showeds up compile-time bugs
 
 "((?2){0,1999}())?"
 
-/((?+1)(\1))/BZ
+/((?+1)(\1))/B
 ------------------------------------------------------------------
         Bra
         Once
@@ -14337,18 +13836,246 @@
         End
 ------------------------------------------------------------------
 
+# Callouts with string arguments
+
+/a(?C"/
+Failed: error 181 at offset 4: missing terminating delimiter for callout with string argument
+
+/a(?C"a/
+Failed: error 181 at offset 4: missing terminating delimiter for callout with string argument
+
+/a(?C"a"/
+Failed: error 139 at offset 7: closing parenthesis for (?C expected
+
+/a(?C"a"bcde(?C"b")xyz/
+Failed: error 139 at offset 7: closing parenthesis for (?C expected
+
+/a(?C"a)b""c")/B
+------------------------------------------------------------------
+        Bra
+        a
+        CalloutStr "a)b"c" 5 13 0
+        Ket
+        End
+------------------------------------------------------------------
+
+/ab(?C" any text with spaces ")cde/B
+------------------------------------------------------------------
+        Bra
+        ab
+        CalloutStr " any text with spaces " 6 30 1
+        cde
+        Ket
+        End
+------------------------------------------------------------------
+    abcde
+Callout (6): " any text with spaces "
+--->abcde
+    ^ ^       c
+ 0: abcde
+    12abcde
+Callout (6): " any text with spaces "
+--->12abcde
+      ^ ^       c
+ 0: abcde
+
+/^a(b)c(?C1)def/
+      abcdef
+--->abcdef
+  1 ^  ^       d
+ 0: abcdef
+ 1: b
+
+/^a(b)c(?C"AB")def/
+      abcdef
+Callout (10): "AB"
+--->abcdef
+    ^  ^       d
+ 0: abcdef
+ 1: b
+
+/^a(b)c(?C1)def/
+      abcdef\=callout_capture
+Callout 1: last capture = 1
+ 0: <unset>
+ 1: b
+--->abcdef
+    ^  ^       d
+ 0: abcdef
+ 1: b
+
+/^a(b)c(?C{AB})def/B
+------------------------------------------------------------------
+        Bra
+        ^
+        a
+        CBra 1
+        b
+        Ket
+        c
+        CalloutStr {AB} 10 14 1
+        def
+        Ket
+        End
+------------------------------------------------------------------
+      abcdef\=callout_capture
+Callout (10): {AB} last capture = 1
+ 0: <unset>
+ 1: b
+--->abcdef
+    ^  ^       d
+ 0: abcdef
+ 1: b
+
+/(?C`a``b`)(?C'a''b')(?C"a""b")(?C^a^^b^)(?C%a%%b%)(?C#a##b#)(?C$a$$b$)(?C{a}}b})/B,callout_info
+------------------------------------------------------------------
+        Bra
+        CalloutStr `a`b` 4 10 0
+        CalloutStr 'a'b' 14 20 0
+        CalloutStr "a"b" 24 30 0
+        CalloutStr ^a^b^ 34 40 0
+        CalloutStr %a%b% 44 50 0
+        CalloutStr #a#b# 54 60 0
+        CalloutStr $a$b$ 64 70 0
+        CalloutStr {a}b} 74 80 0
+        Ket
+        End
+------------------------------------------------------------------
+Callout `a`b`  (
+Callout 'a'b'  (
+Callout "a"b"  (
+Callout ^a^b^  (
+Callout %a%b%  (
+Callout #a#b#  (
+Callout $a$b$  (
+Callout {a}b}  
+
+/(?:a(?C`code`)){3}/B
+------------------------------------------------------------------
+        Bra
+        Bra
+        a
+        CalloutStr `code` 8 14 0
+        Ket
+        Bra
+        a
+        CalloutStr `code` 8 14 0
+        Ket
+        Bra
+        a
+        CalloutStr `code` 8 14 0
+        Ket
+        Ket
+        End
+------------------------------------------------------------------
+
+/^(?(?C25)(?=abc)abcd|xyz)/B,callout_info
+------------------------------------------------------------------
+        Bra
+        ^
+        Cond
+        Callout 25 9 7
+        Assert
+        abc
+        Ket
+        abcd
+        Alt
+        xyz
+        Ket
+        Ket
+        End
+------------------------------------------------------------------
+Callout 25  (?=abc)
+    abcdefg
+--->abcdefg
+ 25 ^           (?=abc)
+ 0: abcd
+    xyz123 
+--->xyz123
+ 25 ^          (?=abc)
+ 0: xyz
+
+/^(?(?C$abc$)(?=abc)abcd|xyz)/B
+------------------------------------------------------------------
+        Bra
+        ^
+        Cond
+        CalloutStr $abc$ 7 12 7
+        Assert
+        abc
+        Ket
+        abcd
+        Alt
+        xyz
+        Ket
+        Ket
+        End
+------------------------------------------------------------------
+    abcdefg
+Callout (7): $abc$
+--->abcdefg
+    ^           (?=abc)
+ 0: abcd
+    xyz123 
+Callout (7): $abc$
+--->xyz123
+    ^          (?=abc)
+ 0: xyz
+
+/^ab(?C'first')cd(?C"second")ef/
+    abcdefg
+Callout (7): 'first'
+--->abcdefg
+    ^ ^         c
+Callout (20): "second"
+--->abcdefg
+    ^   ^       e
+ 0: abcdef
+
+/(?:a(?C`code`)){3}X/
+    aaaXY
+Callout (8): `code`
+--->aaaXY
+    ^^        )
+Callout (8): `code`
+--->aaaXY
+    ^ ^       )
+Callout (8): `code`
+--->aaaXY
+    ^  ^      )
+ 0: aaaX
+
+# Binary zero in callout string
+#  a  (  ?  C  '  x     z  '  )  b
+/ 61 28 3f 43 27 78 00 7a 27 29 62/hex,callout_info
+Callout 'x\x00z'  b
+    abcdefgh
+Callout (5): 'x\x00z'
+--->abcdefgh
+    ^^           b
+ 0: ab
+
+/(?(?!)^)/
+
 /(?(?!)a|b)/
     bbb
  0: b
+\= Expect no match 
     aaa 
 No match
 
-"((?2)+)((?1))"
+# JIT gives a different error message for the infinite recursion
+
+"(*NO_JIT)((?2)+)((?1)){"
+    abcd{
+Failed: error -52: nested recursion at the same subject position
+
+# Perl fails to diagnose the absence of an assertion
 
 "(?(?<E>.*!.*)?)"
-Failed: assertion expected after (?( at offset 3
+Failed: error 128 at offset 3: assertion expected after (?( or (?(?C)
 
-"X((?2)()*+){2}+"BZ
+"X((?2)()*+){2}+"B
 ------------------------------------------------------------------
         Bra
         X
@@ -14370,7 +14097,7 @@
         End
 ------------------------------------------------------------------
 
-"X((?2)()*+){2}"BZ
+"X((?2)()*+){2}"B
 ------------------------------------------------------------------
         Bra
         X
@@ -14390,25 +14117,18 @@
         End
 ------------------------------------------------------------------
 
-"(?<=((?2))((?1)))"
-Failed: lookbehind assertion is not fixed length at offset 17
+/(?<=\bABQ(3(?-7)))/
+Failed: error 115 at offset 15: reference to non-existent subpattern
 
-/(?<=\Ka)/g+
-    aaaaa
- 0: a
- 0+ aaaa
- 0: a
- 0+ aaaa
- 0: a
- 0+ aaa
- 0: a
- 0+ aa
- 0: a
- 0+ a
- 0: a
- 0+ 
+/(?<=\bABQ(3(?+7)))/
+Failed: error 115 at offset 15: reference to non-existent subpattern
 
-/(?<=\Ka)/G+
+";(?<=()((?3))((?2)))"
+Failed: error 125 at offset 20: lookbehind assertion is not fixed length
+
+# Perl loops on this (PCRE2 used to!)
+
+/(?<=\Ka)/g,aftertext
     aaaaa
  0: a
  0+ aaaa
@@ -14421,9 +14141,114 @@
  0: a
  0+ 
 
-/((?2){73}(?2))((?1))/
+/(?<=\Ka)/altglobal,aftertext
+    aaaaa
+ 0: a
+ 0+ aaaa
+ 0: a
+ 0+ aaa
+ 0: a
+ 0+ aa
+ 0: a
+ 0+ a
+ 0: a
+ 0+ 
 
-/.((?2)(?R)\1)()/BZ
+/((?2){73}(?2))((?1))/info
+Capturing subpattern count = 2
+May match empty string
+Subject length lower bound = 0
+
+/abc/
+\= Expect no match
+    \[9x!xxx(]{9999}
+No match
+    
+/(abc)*/
+    \[abc]{5} 
+ 0: abcabcabcabcabc
+ 1: abc
+
+/^/gm
+    \n\n\n
+ 0: 
+ 0: 
+ 0: 
+
+/^/gm,alt_circumflex
+    \n\n\n
+ 0: 
+ 0: 
+ 0: 
+ 0: 
+
+/((((((((x))))))))\81/
+Failed: error 115 at offset 19: reference to non-existent subpattern
+    xx1
+
+/((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((x))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))\80/
+    xx
+Matched, but too many substrings
+ 0: xx
+ 1: x
+ 2: x
+ 3: x
+ 4: x
+ 5: x
+ 6: x
+ 7: x
+ 8: x
+ 9: x
+10: x
+11: x
+12: x
+13: x
+14: x
+
+/\80/
+Failed: error 115 at offset 2: reference to non-existent subpattern
+
+/A\8B\9C/
+Failed: error 115 at offset 2: reference to non-existent subpattern
+    A8B9C
+    
+/(?x:((?'a')) # comment (with parentheses) and | vertical
+(?-x:#not a comment (?'b')) # this is a comment ()
+(?'c')) # not a comment (?'d')/info
+Capturing subpattern count = 5
+Named capturing subpatterns:
+  a   2
+  b   3
+  c   4
+  d   5
+First code unit = '#'
+Last code unit = ' '
+Subject length lower bound = 32
+
+/(?|(?'a')(2)(?'b')|(?'a')(?'a')(3))/I,dupnames
+Capturing subpattern count = 3
+Named capturing subpatterns:
+  a   1
+  a   2
+  b   3
+Options: dupnames
+Starting code units: 2 3 
+Subject length lower bound = 1
+    A23B
+ 0: 2
+ 1: 
+ 2: 2
+ 3: 
+    B32A 
+ 0: 3
+ 1: 
+ 2: 
+ 3: 3
+
+# These are some patterns that used to cause buffer overflows or other errors
+# while compiling. 
+
+/.((?2)(?R)|\1|$)()/B
 ------------------------------------------------------------------
         Bra
         Any
@@ -14431,7 +14256,10 @@
         CBra 1
         Recurse
         Recurse
+        Alt
         \1
+        Alt
+        $
         Ket
         Ket
         CBra 2
@@ -14440,35 +14268,55 @@
         End
 ------------------------------------------------------------------
 
-/(?1)()((((((\1++))\x85)+)|))/
+/.((?3)(?R)()(?2)|\1|$)()/B
+------------------------------------------------------------------
+        Bra
+        Any
+        Once
+        CBra 1
+        Recurse
+        Recurse
+        CBra 2
+        Ket
+        Recurse
+        Alt
+        \1
+        Alt
+        $
+        Ket
+        Ket
+        CBra 3
+        Ket
+        Ket
+        End
+------------------------------------------------------------------
 
 /(\9*+(?2);\3++()2|)++{/
-Failed: reference to non-existent subpattern at offset 22
+Failed: error 115 at offset 2: reference to non-existent subpattern
 
 /\V\x85\9*+((?2)\3++()2)*:2/
-Failed: reference to non-existent subpattern at offset 26
+Failed: error 115 at offset 7: reference to non-existent subpattern
 
-/(((?(R)){0,2}) (?''((?'R')((?'R')))))/J
+/(((?(R)){0,2}) (?'x'((?'R')((?'R')))))/dupnames
 
-/(((?(X)){0,2}) (?''((?'X')((?'X')))))/J
+/(((?(X)){0,2}) (?'x'((?'X')((?'X')))))/dupnames
 
-/(((?(R)){0,2}) (?''((?'X')((?'R')))))/
+/(((?(R)){0,2}) (?'x'((?'X')((?'R')))))/
 
 "(?J)(?'d'(?'d'\g{d}))"
 
-".*?\h.+.\.+\R*?\xd(?i)(?=!(?=b`b`b`\`b\xa9b!)`\a`bbbbbbbbbbbbb`bbbbbbbbbbbb*R\x85bbbbbbb\C?{((?2)(?))((
-\H){8(?<=(?1){29}\xa8bbbb\x16\xd\xc6^($(?<! )(\xa9H4){4}h}1)B))\x15')"
+"(?=!((?2)(?))({8(?<=(?1){29}8bbbb\x16\xd\xc6^($(\xa9H4){4}h}?1)B))\x15')"
+Failed: error 125 at offset 72: lookbehind assertion is not fixed length
+
+/A(?'')Z/
+Failed: error 162 at offset 4: subpattern name expected
 
 "(?J:(?|(?'R')(\k'R')|((?'R'))))"
 
 /(?<=|(\,\$(?73591620449005828816)\xa8.{7}){6}\x09)/
-Failed: number is too big at offset 32
+Failed: error 161 at offset 32: number is too big
 
-//
-\O1
-Matched, but too many substrings
-
-/^(?:(?(1)x|)+)+$()/BZ
+/^(?:(?(1)x|)+)+$()/B
 ------------------------------------------------------------------
         Bra
         ^
@@ -14486,10 +14334,19 @@
         End
 ------------------------------------------------------------------
 
-/(?=di(?<=(?1))|(?=(.))))/
-Failed: unmatched parentheses at offset 23
+/[[:>:]](?<)/
+Failed: error 124 at offset 10: letter or underscore expected after (?< or (?'
 
-/(?(R))*+/BZ
+/((?x)(*:0))#(?'/
+Failed: error 124 at offset 15: letter or underscore expected after (?< or (?'
+
+/(?C$[$)(?<]/
+Failed: error 124 at offset 10: letter or underscore expected after (?< or (?'
+
+/(?C$)$)(?<]/
+Failed: error 124 at offset 10: letter or underscore expected after (?< or (?'
+
+/(?(R))*+/B
 ------------------------------------------------------------------
         Bra
         Braposzero
@@ -14501,13 +14358,33 @@
         Ket
         End
 ------------------------------------------------------------------
+    abcd
+ 0: 
 
-/[[:\\](?'abc')[a:]/
+/((?x)(?#))#(?'/
+Failed: error 124 at offset 14: letter or underscore expected after (?< or (?'
+
+/((?x)(?#))#(?'abc')/I
+Capturing subpattern count = 2
+Named capturing subpatterns:
+  abc   2
+First code unit = '#'
+Subject length lower bound = 1
+
+/[[:\\](?<[::]/
+Failed: error 124 at offset 9: letter or underscore expected after (?< or (?'
+
+/[[:\\](?'abc')[a:]/I
+Capturing subpattern count = 1
+Named capturing subpatterns:
+  abc   1
+Starting code units: : [ \ 
+Subject length lower bound = 2
 
 "[[[.\xe8Nq\xffq\xff\xe0\x2|||::Nq\xffq\xff\xe0\x6\x2|||::[[[:[::::::[[[[[::::::::[:[[[:[:::[[[[[[[[[[[[:::::::::::::::::[[.\xe8Nq\xffq\xff\xe0\x2|||::Nq\xffq\xff\xe0\x6\x2|||::[[[:[::::::[[[[[::::::::[:[[[:[:::[[[[[[[[[[[[[[:::E[[[:[:[[:[:::[[:::E[[[:[:[[:'[:::::E[[[:[::::::[[[:[[[[[[[::E[[[:[::::::[[[:[[[[[[[[:[[::[::::[[:::::::[[:[[[[[[[:[[::[:[[:[~"
-Failed: missing terminating ] for character class at offset 353
+Failed: error 106 at offset 353: missing terminating ] for character class
 
-/()(?(R)0)*+/BZ
+/()(?(R)0)*+/B
 ------------------------------------------------------------------
         Bra
         CBra 1
@@ -14524,7 +14401,17 @@
 ------------------------------------------------------------------
 
 /(?R-:(?</
-Failed: (?R or (?[+-]digits must be followed by ) at offset 3
+Failed: error 129 at offset 3: (?R or (?[+-]digits must be followed by )
+
+/(?(?C{\Q})(?!(?'/
+Failed: error 124 at offset 16: letter or underscore expected after (?< or (?'
+
+/(?(?C{\Q})(?!(?'abc')))/I
+Capturing subpattern count = 1
+Named capturing subpatterns:
+  abc   1
+May match empty string
+Subject length lower bound = 0
 
 /(?1){3918}(((((0(\k'R'))))(?J)(?'R'(?'R'\3){99})))/I
 Capturing subpattern count = 8
@@ -14532,40 +14419,478 @@
 Named capturing subpatterns:
   R   7
   R   8
-No options
 Duplicate name status changes
-No first char
-Need char = '0'
+Last code unit = '0'
+Subject length lower bound = 65535
 
-/(?J:(?|(:(?|(?'R')(\k'R')|((?'R')))H'Rk'Rf)|s(?'R')))/
+/(?|(aaa)|(b))\g{1}/I
+Capturing subpattern count = 1
+Max back reference = 1
+Starting code units: a b 
+Subject length lower bound = 0
+
+/(?|(aaa)|(b))(?1)/I
+Capturing subpattern count = 1
+Starting code units: a b 
+Subject length lower bound = 4
+
+/(?|(aaa)|(b))/I
+Capturing subpattern count = 1
+Starting code units: a b 
+Subject length lower bound = 1
+
+/(?|(?'a'aaa)|(?'a'b))\k'a'/I
+Capturing subpattern count = 1
+Max back reference = 1
+Named capturing subpatterns:
+  a   1
+Starting code units: a b 
+Subject length lower bound = 0
+
+/(?|(?'a'aaa)|(?'a'b))(?'a'cccc)\k'a'/I,dupnames
+Capturing subpattern count = 2
+Max back reference = 2
+Named capturing subpatterns:
+  a   1
+  a   2
+Options: dupnames
+Starting code units: a b 
+Last code unit = 'c'
+Subject length lower bound = 0
+
+/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
+
+/\x0{ab}/
+    \0{ab} 
+ 0: \x00{ab}
+
+/^(a(b))\1\g1\g{1}\g-1\g{-1}\g{-02}Z/
+    ababababbbabZXXXX
+ 0: ababababbbabZ
+ 1: ab
+ 2: b
+
+/.*?a(*PRUNE)b/
+    aab
+ 0: ab
+
+/.*?a(*PRUNE)b/s
+    aab
+ 0: ab
+
+/^a(*PRUNE)b/s
+\= Expect no match
+    aab
+No match
+
+/.*?a(*SKIP)b/
+    aab
+ 0: ab
+
+/(?(8000000000/
+Failed: error 161 at offset 13: number is too big
+
+/((?(R8000000000)))/
+Failed: error 161 at offset 16: number is too big
 
 /0(?0)|(1)(*THEN)(*SKIP:0)(*FAIL)/
+\= Expect no match
     01
 No match
 
-/((?(R8000000000)))/ 
-Failed: number is too big at offset 16
+/(?(1)()\983040\2)/
+Failed: error 115 at offset 13: reference to non-existent subpattern
 
-/(?(8000000000/
-Failed: number is too big at offset 13
+/(*LIMIT_MATCH=)abc/
+Failed: error 160 at offset 14: (*VERB) not recognized or malformed
+
+/(*CRLF)(*LIMIT_MATCH=)abc/
+Failed: error 160 at offset 21: (*VERB) not recognized or malformed
 
 /(?:ab)?(?:ab)(?:ab)/
     abab
  0: abab
     ababab
  0: ababab
+\= Expect no match
     aba
 No match
 
 /((*MARK:A))++a(*SKIP:B)b/
+\= Expect no match
     aacb
 No match
 
-/(?J:(?|(:(?|(?'R')(\z(?|(?'R')(\k'R')|((?'R')))k'R')|((?'R')))H'Ak'Rf)|s(?'R')))/
+/(*MARK:a\zb)z/alt_verbnames 
+Failed: error 140 at offset 9: invalid escape sequence in (*VERB) name
+    
+/(*:ab\t(d\)c)xxx/
+Failed: error 122 at offset 12: unmatched closing parenthesis
 
-/(?&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)(?&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)(?&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)(?&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)(?&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)(?&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)(?&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)(?&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)(?&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)(?&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)(?&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)(?&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)(?&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)(?&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)(?&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)(?&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)(?&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)(?&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)(?&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)(?&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>1)/
+/(*:ab\t(d\)c)xxx/alt_verbnames,mark
+    cxxxz
+ 0: xxx
+MK: ab\x09(d)c
 
-/a[[:punct:]b]/BZ
+/(*:A\Qxx)x\EB)x/alt_verbnames,mark
+    x
+ 0: x
+MK: Axx)xB
+    
+/(*:A\ExxxB)x/alt_verbnames,mark
+    x 
+ 0: x
+MK: AxxxB
+    
+/(*: A \ and #comment
+     \ B)x/x,alt_verbnames,mark
+    x  
+ 0: x
+MK: A and B
+    
+/(*:A
+B)x/alt_verbnames,mark 
+    x
+ 0: x
+MK: A\x0aB
+
+/(*:abc\Qpqr)/alt_verbnames
+Failed: error 160 at offset 12: (*VERB) not recognized or malformed
+
+/abc/use_offset_limit
+    1234abcde\=offset_limit=100
+ 0: abc
+    1234abcde\=offset_limit=9
+ 0: abc
+    1234abcde\=offset_limit=4
+ 0: abc
+    1234abcde\=offset_limit=4,offset=4
+ 0: abc
+\= Expect no match
+    1234abcde\=offset_limit=4,offset=5
+No match
+    1234abcde\=offset_limit=3
+No match
+
+/(?<=abc)/use_offset_limit
+    1234abc\=offset_limit=7
+ 0: 
+\= Expect no match
+    1234abc\=offset_limit=6
+No match
+    
+/A/g,replace=-,use_offset_limit
+    XAXAXAXAXA\=offset_limit=4
+ 2: X-X-XAXAXA
+
+/abc/
+\= Expect error
+    1234abcde\=offset_limit=4
+Failed: error -56: offset limit set without PCRE2_USE_OFFSET_LIMIT
+
+/^\w/m,use_offset_limit
+    \n..\naa\=offset_limit=3
+No match
+    \n..\naa\=offset_limit=4
+ 0: a
+
+/abcd/null_context
+    abcd\=null_context
+ 0: abcd
+\= Expect error     
+    abcd\=null_context,find_limits
+** Not allowed together: find_limits null_context
+    abcd\=allusedtext,startchar 
+** Not allowed together: allusedtext startchar
+
+/abcd/replace=w\rx\x82y\o{333}z(\Q12\$34$$\x34\E5$$),substitute_extended
+    abcd
+ 1: w\x0dx\x82y\xdbz(12\$34$$\x345$)
+    
+/a(bc)(DE)/replace=a\u$1\U$1\E$1\l$2\L$2\Eab\Uab\LYZ\EDone,substitute_extended
+    abcDE
+ 1: aBcBCbcdEdeabAByzDone
+ 
+/abcd/replace=xy\kz,substitute_extended
+    abcd
+Failed: error -57 at offset 4 in replacement: bad escape sequence in replacement string
+
+/a(?:(b)|(c))/substitute_extended,replace=X${1:+1:-1}X${2:+2:-2}
+    ab
+ 1: X1X-2
+    ac
+ 1: X-1X2
+    ab\=replace=${1:+$1\:$1:$2}
+ 1: b:b
+    ac\=replace=${1:+$1\:$1:$2}
+ 1: c
+
+/a(?:(b)|(c))/substitute_extended,replace=X${1:-1:-1}X${2:-2:-2}
+    ab
+ 1: XbX2:-2
+    ac
+ 1: X1:-1Xc
+
+/(a)/substitute_extended,replace=>${1:+\Q$1:{}$$\E+\U$1}<
+    a
+ 1: >$1:{}$$+A<
+
+/X(b)Y/substitute_extended
+    XbY\=replace=x${1:+$1\U$1}y
+ 1: xbBY
+    XbY\=replace=\Ux${1:+$1$1}y
+ 1: XBBY
+
+/a/substitute_extended,replace=${*MARK:+a:b}
+    a
+Failed: error -58 at offset 7 in replacement: expected closing curly bracket in replacement string
+
+/(abcd)/replace=${1:+xy\kz},substitute_extended
+    abcd
+Failed: error -57 at offset 8 in replacement: bad escape sequence in replacement string
+
+/(abcd)/
+    abcd\=replace=${1:+xy\kz},substitute_extended
+Failed: error -57 at offset 8 in replacement: bad escape sequence in replacement string
+
+/abcd/substitute_extended,replace=>$1<
+    abcd
+Failed: error -49 at offset 3 in replacement: unknown substring
+
+/abcd/substitute_extended,replace=>xxx${xyz}<<<
+    abcd
+Failed: error -49 at offset 10 in replacement: unknown substring
+
+/(?J)(?:(?<A>a)|(?<A>b))/replace=<$A>
+    [a]
+ 1: [<a>]
+    [b] 
+ 1: [<b>]
+\= Expect error     
+    (a)\=ovector=1
+Failed: error -54 at offset 3 in replacement: requested value is not available
+
+/(a)|(b)/replace=<$1>
+\= Expect error
+    b
+Failed: error -55 at offset 3 in replacement: requested value is not set
+
+/(aa)(BB)/substitute_extended,replace=\U$1\L$2\E$1..\U$1\l$2$1
+    aaBB
+ 1: AAbbaa..AAbBaa
+
+/^(o(\1{72}{\"{\\{00000059079}\d*){74}}){19}/I
+Capturing subpattern count = 2
+Max back reference = 1
+Compile options: <none>
+Overall options: anchored
+Last code unit = '}'
+Subject length lower bound = 65535
+
+/((p(?'K/
+Failed: error 142 at offset 7: syntax error in subpattern name (missing terminator)
+
+/((p(?'K/no_auto_capture
+Failed: error 142 at offset 7: syntax error in subpattern name (missing terminator)
+
+/abc/replace=A$3123456789Z
+    abc
+Failed: error -49 at offset 3 in replacement: unknown substring
+
+/(?<!a{65535}a{5})x/I
+Failed: error 187 at offset 16: lookbehind assertion is too long
+
+/(?<!a{65535})x/I
+Capturing subpattern count = 0
+Max lookbehind = 65535
+First code unit = 'x'
+Subject length lower bound = 1
+
+/(?=a\K)/replace=z
+    BaCaD
+Failed: error -60: match with end before start is not supported
+    
+/(?'abcdefghijklmnopqrstuvwxyzABCDEFG'toolong)/
+Failed: error 148 at offset 36: subpattern name is too long (maximum 32 characters)
+ 
+/(?'abcdefghijklmnopqrstuvwxyzABCDEF'justright)/ 
+
+# These two use zero-termination
+/abcd/max_pattern_length=3
+Failed: error 188 at offset 0: pattern string is longer than the limit set by the application
+
+/abc/max_pattern_length=3
+
+# These two, being hex, pass the length
+/abcdefab/hex,max_pattern_length=3
+Failed: error 188 at offset 0: pattern string is longer than the limit set by the application
+
+/abcdef/hex,max_pattern_length=3
+
+# These two patterns used to take a long time to compile
+
+"(.*)
+((?-2)(?-2))((?-2)(?-2))((?-2)(?-2))((?-2)(?-2))
+((?-2)(?-2))((?-2)(?-2))((?-2)(?-2))((?-2)(?-2))
+((?-2)(?-2))((?-2)(?-2))((?-2)(?-2))"xI
+Capturing subpattern count = 12
+May match empty string
+Options: extended
+First code unit at start or follows newline
+Subject length lower bound = 0
+
+"(?<=a()
+((?-2)(?-2))((?-2)(?-2))((?-2)(?-2))((?-2)(?-2))
+((?-2)(?-2))((?-2)(?-2))((?-2)(?-2))((?-2)(?-2))
+((?-2)(?-2))((?-2)(?-2))((?-2)(?-2))
+a)"xI
+Capturing subpattern count = 12
+Max lookbehind = 2
+May match empty string
+Options: extended
+Subject length lower bound = 0
+
+# When (?| is used and groups of the same number may be different,
+# we have to rely on a count to catch overly complicated patterns.
+
+"(?|()|())(.*)
+((?-2)(?-2))((?-2)(?-2))((?-2)(?-2))((?-2)(?-2))
+((?-2)(?-2))((?-2)(?-2))((?-2)(?-2))((?-2)(?-2))
+((?-2)(?-2))((?-2)(?-2))((?-2)(?-2))"xI
+Failed: error 186 at offset 148: regular expression is too complicated
+
+"(?|()|())(?<=a()
+((?-2)(?-2))((?-2)(?-2))((?-2)(?-2))((?-2)(?-2))
+((?-2)(?-2))((?-2)(?-2))((?-2)(?-2))((?-2)(?-2))
+((?-2)(?-2))((?-2)(?-2))((?-2)(?-2))
+a)"xI
+Failed: error 186 at offset 154: regular expression is too complicated
+
+# Test the use of malloc for caching group information when there are more
+# groups than fit into the on-stack workspace.
+
+/\[()]{1024}/I,expand
+Expanded: ()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()
+Capturing subpattern count = 1024
+May match empty string
+Subject length lower bound = 0
+
+# Test minlength capped at 65535
+
+/(A{65000})\1{65000}/I
+Capturing subpattern count = 1
+Max back reference = 1
+First code unit = 'A'
+Last code unit = 'A'
+Subject length lower bound = 65535
+
+# Test group scans when numbers are not unique
+
+/(?|()+|(a)+)/BI
+------------------------------------------------------------------
+        Bra
+        Bra
+        SCBra 1
+        KetRmax
+        Alt
+        CBra 1
+        a
+        KetRmax
+        Ket
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 1
+May match empty string
+Subject length lower bound = 0
+
+/(?|(a)+|()+)/BI
+------------------------------------------------------------------
+        Bra
+        Bra
+        CBra 1
+        a
+        KetRmax
+        Alt
+        SCBra 1
+        KetRmax
+        Ket
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 1
+May match empty string
+Subject length lower bound = 0
+
+/(?|()|(a))/BI
+------------------------------------------------------------------
+        Bra
+        Bra
+        CBra 1
+        Ket
+        Alt
+        CBra 1
+        a
+        Ket
+        Ket
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 1
+May match empty string
+Subject length lower bound = 0
+
+/(?|(a)|())/BI
+------------------------------------------------------------------
+        Bra
+        Bra
+        CBra 1
+        a
+        Ket
+        Alt
+        CBra 1
+        Ket
+        Ket
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 1
+May match empty string
+Subject length lower bound = 0
+
+# Test CRLF handling in empty string substitutions
+
+/^$/gm,newline=anycrlf,replace=-
+    X\r\n\r\nY
+ 1: X\x0d\x0a-\x0d\x0aY
+
+/^$/gm,newline=crlf,replace=-
+    X\r\n\r\nY
+ 1: X\x0d\x0a-\x0d\x0aY
+
+/^$/gm,newline=any,replace=-
+    X\r\n\r\nY
+ 1: X\x0d\x0a-\x0d\x0aY
+
+"(*ANYCRLF)(?m)^(.*[^0-9\r\n].*|)$"g,replace=NaN
+    15\r\nfoo\r\n20\r\nbar\r\nbaz\r\n\r\n20
+ 4: 15\x0d\x0aNaN\x0d\x0a20\x0d\x0aNaN\x0d\x0aNaN\x0d\x0aNaN\x0d\x0a20
+
+/a[[:punct:]b]/bincode
 ------------------------------------------------------------------
         Bra
         a
@@ -14574,4 +14899,263 @@
         End
 ------------------------------------------------------------------
 
-/-- End of testinput2 --/
+/a[b[:punct:]]/bincode
+------------------------------------------------------------------
+        Bra
+        a
+        [!-/:-@[-`b{-~]
+        Ket
+        End
+------------------------------------------------------------------
+
+/L(?#(|++<!(2)?/B
+------------------------------------------------------------------
+        Bra
+        L?+
+        Ket
+        End
+------------------------------------------------------------------
+
+/L(?#(|++<!(2)?/B,no_auto_possess
+------------------------------------------------------------------
+        Bra
+        L?
+        Ket
+        End
+------------------------------------------------------------------
+
+/L(?#(|++<!(2)?/B,auto_callout
+------------------------------------------------------------------
+        Bra
+        Callout 255 0 14
+        L?+
+        Callout 255 14 0
+        Ket
+        End
+------------------------------------------------------------------
+
+/L(?#(|++<!(2)?/B,no_auto_possess,auto_callout
+------------------------------------------------------------------
+        Bra
+        Callout 255 0 14
+        L?
+        Callout 255 14 0
+        Ket
+        End
+------------------------------------------------------------------
+
+/(A*)\E+/B,auto_callout
+------------------------------------------------------------------
+        Bra
+        Callout 255 0 7
+        SCBra 1
+        Callout 255 1 2
+        A*
+        Callout 255 3 0
+        KetRmax
+        Callout 255 7 0
+        Ket
+        End
+------------------------------------------------------------------
+
+/()\Q\E*]/B,auto_callout
+------------------------------------------------------------------
+        Bra
+        Callout 255 0 7
+        Brazero
+        SCBra 1
+        Callout 255 1 0
+        KetRmax
+        Callout 255 7 1
+        ]
+        Callout 255 8 0
+        Ket
+        End
+------------------------------------------------------------------
+    a[bc]d
+--->a[bc]d
+ +0     ^      ()\Q\E*
+ +1     ^      )
+ +7     ^      ]
+ +8     ^^     
+ 0: ]
+ 1: 
+
+/\x8a+f|;T?(*:;.'?`(\xeap ){![^()!y*''C*(?';]{1;(\x08)/B,alt_verbnames,dupnames,extended
+------------------------------------------------------------------
+        Bra
+        \x{8a}++
+        f
+        Alt
+        ;
+        T?
+        *MARK ;.'?`(\x{ea}p
+        {!
+        [\x00- "-&+-:<->@-BD-xz-\xff] (neg)
+        {1;
+        CBra 1
+        \x08
+        Ket
+        Ket
+        End
+------------------------------------------------------------------
+
+# Tests for NULL characters in comments and verb "names" and callouts
+
+# /A#B\x00C\x0aZ/
+/41 23 42 00 43 0a 5a/Bx,hex
+------------------------------------------------------------------
+        Bra
+        AZ
+        Ket
+        End
+------------------------------------------------------------------
+
+# /A+#B\x00C\x0a+/
+/41 2b 23 42 00 43 0a 2b/Bx,hex
+------------------------------------------------------------------
+        Bra
+        A++
+        Ket
+        End
+------------------------------------------------------------------
+
+# /A(*:B\x00W#X\00Y\x0aC)Z/
+/41 28 2a 3a 42 00 57 23 58 00 59 0a 43 29 5a/Bx,hex,alt_verbnames
+------------------------------------------------------------------
+        Bra
+        A
+        *MARK B\x{0}WC
+        Z
+        Ket
+        End
+------------------------------------------------------------------
+
+# /A(*:B\x00W#X\00Y\x0aC)Z/
+/41 28 2a 3a 42 00 57 23 58 00 59 0a 43 29 5a/Bx,hex
+------------------------------------------------------------------
+        Bra
+        A
+        *MARK B\x{0}W#X\x{0}Y\x{a}C
+        Z
+        Ket
+        End
+------------------------------------------------------------------
+
+# /A(?C{X\x00Y})B/
+/41 28 3f 43 7b 58 00 59 7d 29 42/B,hex
+------------------------------------------------------------------
+        Bra
+        A
+        CalloutStr {X\x{0}Y} 5 10 1
+        B
+        Ket
+        End
+------------------------------------------------------------------
+
+# /A(?#X\x00Y)B/
+/41 28 3f 23 7b 00 7d 29 42/B,hex
+------------------------------------------------------------------
+        Bra
+        AB
+        Ket
+        End
+------------------------------------------------------------------
+
+# Tests for leading comment in extended patterns
+
+/ (?-x):?/extended
+
+/(?-x):?/extended
+
+/0b 28 3f 2d 78 29 3a/hex,extended
+
+/#comment
+(?-x):?/extended
+
+/(8(*:6^\x09x\xa6l\)6!|\xd0:[^:|)\x09d\Z\d{85*m(?'(?<1!)*\W[*\xff]!!h\w]*\xbe;/alt_bsux,alt_verbnames,allow_empty_class,dollar_endonly,extended,multiline,never_utf,no_dotstar_anchor,no_start_optimize
+Failed: error 124 at offset 49: letter or underscore expected after (?< or (?'
+
+/a|(b)c/replace=>$1<,substitute_unset_empty
+    cat
+ 1: c><t
+    xbcom 
+ 1: x>b<om
+
+/a|(b)c/
+    cat\=replace=>$1<
+Failed: error -55 at offset 3 in replacement: requested value is not set
+    cat\=replace=>$1<,substitute_unset_empty
+ 1: c><t
+    xbcom\=replace=>$1<,substitute_unset_empty
+ 1: x>b<om
+
+/a|(b)c/substitute_extended
+    cat\=replace=>${2:-xx}<
+Failed: error -49 at offset 9 in replacement: unknown substring
+    cat\=replace=>${2:-xx}<,substitute_unknown_unset
+ 1: c>xx<t
+    cat\=replace=>${X:-xx}<,substitute_unknown_unset
+ 1: c>xx<t
+
+/a|(?'X'b)c/replace=>$X<,substitute_unset_empty
+    cat
+ 1: c><t
+    xbcom 
+ 1: x>b<om
+
+/a|(?'X'b)c/replace=>$Y<,substitute_unset_empty
+    cat
+Failed: error -49 at offset 3 in replacement: unknown substring
+    cat\=substitute_unknown_unset 
+ 1: c><t
+    cat\=substitute_unknown_unset,-substitute_unset_empty 
+Failed: error -55 at offset 3 in replacement: requested value is not set
+
+/a|(b)c/replace=>$2<,substitute_unset_empty
+    cat
+Failed: error -49 at offset 3 in replacement: unknown substring
+    cat\=substitute_unknown_unset 
+ 1: c><t
+    cat\=substitute_unknown_unset,-substitute_unset_empty 
+Failed: error -55 at offset 3 in replacement: requested value is not set
+
+/()()()/use_offset_limit
+    \=ovector=11000000000
+** Invalid value in 'ovector=11000000000'
+    \=callout_fail=11000000000
+** Invalid value in 'callout_fail=11000000000'
+    \=callout_fail=1:11000000000
+** Invalid value in 'callout_fail=1:11000000000'
+    \=callout_data=11000000000 
+** Invalid value in 'callout_data=11000000000'
+    \=callout_data=-11000000000 
+** Invalid value in 'callout_data=-11000000000'
+    \=offset_limit=1100000000000000000000 
+** Invalid value in 'offset_limit=1100000000000000000000'
+    \=copy=11000000000 
+** Invalid value in 'copy=11000000000'
+
+/(*MARK:A\x00b)/mark
+    abc
+ 0: 
+MK: A\x00b
+
+/(*MARK:A\x00b)/mark,alt_verbnames
+    abc
+ 0: 
+MK: A\x00b
+
+# /(*MARK:A\x00b)/
+/28 2a 4d 41 52 4b 3a 41 00 62 29/mark,hex
+    abc
+ 0: 
+MK: A\x00b
+
+# /(*MARK:A\x00b)/
+/28 2a 4d 41 52 4b 3a 41 00 62 29/mark,hex,alt_verbnames
+    abc
+ 0: 
+MK: A\x00b
+
+# End of testinput2 
diff --git a/dist2/testdata/testoutput20 b/dist2/testdata/testoutput20
new file mode 100644
index 0000000..e923080
--- /dev/null
+++ b/dist2/testdata/testoutput20
@@ -0,0 +1,101 @@
+# This set of tests exercises the serialization/deserialization functions in
+# the library. It does not use UTF or JIT.
+
+#forbid_utf
+
+# Compile several patterns, push them onto the stack, and then write them
+# all to a file.
+
+#pattern push
+
+/(?<NAME>(?&NAME_PAT))\s+(?<ADDR>(?&ADDRESS_PAT))
+  (?(DEFINE)
+  (?<NAME_PAT>[a-z]+)
+  (?<ADDRESS_PAT>\d+)
+  )/x
+/^(?:((.)(?1)\2|)|((.)(?3)\4|.))$/i
+
+#save testsaved1
+
+# Do it again for some more patterns.
+
+/(*MARK:A)(*SKIP:B)(C|X)/mark
+** Ignored when compiled pattern is stacked with 'push': mark
+/(?:(?<n>foo)|(?<n>bar))\k<n>/dupnames
+
+#save testsaved2
+#pattern -push
+
+# Reload the patterns, then pop them one by one and check them.
+
+#load testsaved1
+#load testsaved2
+
+#pop info
+Capturing subpattern count = 2
+Max back reference = 2
+Named capturing subpatterns:
+  n   1
+  n   2
+Options: dupnames
+Starting code units: b f 
+Subject length lower bound = 6
+    foofoo             
+ 0: foofoo
+ 1: foo
+    barbar
+ 0: barbar
+ 1: <unset>
+ 2: bar
+    
+#pop mark
+    C
+ 0: C
+ 1: C
+MK: A
+\= Expect no match     
+    D 
+No match, mark = A
+    
+#pop
+    AmanaplanacanalPanama   
+ 0: AmanaplanacanalPanama
+ 1: <unset>
+ 2: <unset>
+ 3: AmanaplanacanalPanama
+ 4: A
+
+#pop info
+Capturing subpattern count = 4
+Named capturing subpatterns:
+  ADDR          2
+  ADDRESS_PAT   4
+  NAME          1
+  NAME_PAT      3
+Options: extended
+Subject length lower bound = 3
+    metcalfe 33
+ 0: metcalfe 33
+ 1: metcalfe
+ 2: 33
+    
+# Check for an error when different tables are used.
+
+/abc/push,tables=1
+/xyz/push,tables=2
+#save testsaved1
+Serialization failed: error -30: patterns do not all use the same character tables
+
+#pop
+    xyz
+ 0: xyz
+
+#pop
+    abc
+ 0: abc
+
+#pop should give an error
+** Can't pop off an empty stack
+    pqr
+
+# End of testinput20
diff --git a/dist2/testdata/testoutput21 b/dist2/testdata/testoutput21
new file mode 100644
index 0000000..6bf3f60
--- /dev/null
+++ b/dist2/testdata/testoutput21
@@ -0,0 +1,94 @@
+# These are tests of \C that do not involve UTF. They are not run when \C is
+# disabled by compiling with --enable-never-backslash-C.
+
+/\C+\D \C+\d \C+\S \C+\s \C+\W \C+\w \C+. \C+\R \C+\H \C+\h \C+\V \C+\v \C+\Z \C+\z \C+$/Bx
+------------------------------------------------------------------
+        Bra
+        AllAny+
+        \D
+        AllAny+
+        \d
+        AllAny+
+        \S
+        AllAny+
+        \s
+        AllAny+
+        \W
+        AllAny+
+        \w
+        AllAny+
+        Any
+        AllAny+
+        \R
+        AllAny+
+        \H
+        AllAny+
+        \h
+        AllAny+
+        \V
+        AllAny+
+        \v
+        AllAny+
+        \Z
+        AllAny++
+        \z
+        AllAny+
+        $
+        Ket
+        End
+------------------------------------------------------------------
+
+/\D+\C \d+\C \S+\C \s+\C \W+\C \w+\C .+\C \R+\C \H+\C \h+\C \V+\C \v+\C a+\C \n+\C \C+\C/Bx
+------------------------------------------------------------------
+        Bra
+        \D+
+        AllAny
+        \d+
+        AllAny
+        \S+
+        AllAny
+        \s+
+        AllAny
+        \W+
+        AllAny
+        \w+
+        AllAny
+        Any+
+        AllAny
+        \R+
+        AllAny
+        \H+
+        AllAny
+        \h+
+        AllAny
+        \V+
+        AllAny
+        \v+
+        AllAny
+        a+
+        AllAny
+        \x0a+
+        AllAny
+        AllAny+
+        AllAny
+        Ket
+        End
+------------------------------------------------------------------
+
+/ab\Cde/never_backslash_c
+Failed: error 183 at offset 3: using \C is disabled by the application
+
+/ab\Cde/info
+Capturing subpattern count = 0
+Contains \C
+First code unit = 'a'
+Last code unit = 'e'
+Subject length lower bound = 5
+    abXde
+ 0: abXde
+    
+/(?<=ab\Cde)X/
+    abZdeX
+ 0: X
+
+# End of testinput21
diff --git a/dist2/testdata/testoutput22-16 b/dist2/testdata/testoutput22-16
new file mode 100644
index 0000000..ca1fd76
--- /dev/null
+++ b/dist2/testdata/testoutput22-16
Binary files differ
diff --git a/dist2/testdata/testoutput22-32 b/dist2/testdata/testoutput22-32
new file mode 100644
index 0000000..91d0b05
--- /dev/null
+++ b/dist2/testdata/testoutput22-32
Binary files differ
diff --git a/dist2/testdata/testoutput22-8 b/dist2/testdata/testoutput22-8
new file mode 100644
index 0000000..acb31d6
--- /dev/null
+++ b/dist2/testdata/testoutput22-8
Binary files differ
diff --git a/dist2/testdata/testoutput23 b/dist2/testdata/testoutput23
new file mode 100644
index 0000000..1da1c39
--- /dev/null
+++ b/dist2/testdata/testoutput23
@@ -0,0 +1,8 @@
+# This test is run when PCRE2 has been built with --enable-never-backslash-C,
+# which disables the use of \C. All we can do is check that it gives the 
+# correct error message.
+
+/a\Cb/
+Failed: error 185 at offset 2: using \C is disabled in this PCRE2 library
+
+# End of testinput23
diff --git a/dist2/testdata/testoutput3 b/dist2/testdata/testoutput3
new file mode 100644
index 0000000..d9e8c5c
--- /dev/null
+++ b/dist2/testdata/testoutput3
@@ -0,0 +1,163 @@
+# This set of tests checks local-specific features, using the "fr_FR" locale. 
+# It is not Perl-compatible. When run via RunTest, the locale is edited to
+# be whichever of "fr_FR", "french", or "fr" is found to exist. There is
+# different version of this file called wintestinput3 for use on Windows,
+# where the locale is called "french" and the tests are run using
+# RunTest.bat. 
+
+#forbid_utf
+
+/^[\w]+/
+\= Expect no match
+    École
+No match
+
+/^[\w]+/locale=fr_FR
+    École
+ 0: École
+
+/^[\w]+/
+\= Expect no match
+    École
+No match
+
+/^[\W]+/
+    École
+ 0: \xc9
+
+/^[\W]+/locale=fr_FR
+\= Expect no match
+    École
+No match
+
+/[\b]/
+    \b
+ 0: \x08
+\= Expect no match
+    a
+No match
+
+/[\b]/locale=fr_FR
+    \b
+ 0: \x08
+\= Expect no match
+    a
+No match
+
+/^\w+/
+\= Expect no match
+    École
+No match
+
+/^\w+/locale=fr_FR
+    École
+ 0: École
+
+/(.+)\b(.+)/
+    École
+ 0: \xc9cole
+ 1: \xc9
+ 2: cole
+
+/(.+)\b(.+)/locale=fr_FR
+\= Expect no match
+    École
+No match
+
+/École/i
+    École
+ 0: \xc9cole
+\= Expect no match
+    école
+No match
+
+/École/i,locale=fr_FR
+    École
+ 0: École
+    école
+ 0: école
+
+/\w/I
+Capturing subpattern count = 0
+Starting code units: 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 
+Subject length lower bound = 1
+
+/\w/I,locale=fr_FR
+Capturing subpattern count = 0
+Starting code units: 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 
+  ª µ º À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö Ø Ù Ú Û Ü Ý Þ ß à á â 
+  ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ø ù ú û ü ý þ ÿ 
+Subject length lower bound = 1
+
+# All remaining tests are in the fr_FR locale, so set the default.
+
+#pattern locale=fr_FR
+
+/^[\xc8-\xc9]/i
+    École
+ 0: É
+    école
+ 0: é
+
+/^[\xc8-\xc9]/
+    École
+ 0: É
+\= Expect no match
+    école
+No match
+
+/\W+/
+    >>>\xaa<<<
+ 0: >>>
+    >>>\xba<<< 
+ 0: >>>
+
+/[\W]+/
+    >>>\xaa<<<
+ 0: >>>
+    >>>\xba<<< 
+ 0: >>>
+
+/[^[:alpha:]]+/
+    >>>\xaa<<<
+ 0: >>>
+    >>>\xba<<< 
+ 0: >>>
+
+/\w+/
+    >>>\xaa<<<
+ 0: ª
+    >>>\xba<<< 
+ 0: º
+
+/[\w]+/
+    >>>\xaa<<<
+ 0: ª
+    >>>\xba<<< 
+ 0: º
+
+/[[:alpha:]]+/
+    >>>\xaa<<<
+ 0: ª
+    >>>\xba<<< 
+ 0: º
+    
+/[[:alpha:]][[:lower:]][[:upper:]]/IB
+------------------------------------------------------------------
+        Bra
+        [A-Za-z\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\xff]
+        [a-z\xb5\xdf-\xf6\xf8-\xff]
+        [A-Z\xc0-\xd6\xd8-\xde]
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Starting code units: 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 ª µ º À Á Â Ã Ä Å Æ Ç 
+  È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í 
+  î ï ð ñ ò ó ô õ ö ø ù ú û ü ý þ ÿ 
+Subject length lower bound = 3
+
+# End of testinput3 
diff --git a/dist2/testdata/testoutput3A b/dist2/testdata/testoutput3A
new file mode 100644
index 0000000..9b00be8
--- /dev/null
+++ b/dist2/testdata/testoutput3A
@@ -0,0 +1,163 @@
+# This set of tests checks local-specific features, using the "fr_FR" locale. 
+# It is not Perl-compatible. When run via RunTest, the locale is edited to
+# be whichever of "fr_FR", "french", or "fr" is found to exist. There is
+# different version of this file called wintestinput3 for use on Windows,
+# where the locale is called "french" and the tests are run using
+# RunTest.bat. 
+
+#forbid_utf
+
+/^[\w]+/
+\= Expect no match
+    École
+No match
+
+/^[\w]+/locale=fr_FR
+    École
+ 0: École
+
+/^[\w]+/
+\= Expect no match
+    École
+No match
+
+/^[\W]+/
+    École
+ 0: \xc9
+
+/^[\W]+/locale=fr_FR
+\= Expect no match
+    École
+No match
+
+/[\b]/
+    \b
+ 0: \x08
+\= Expect no match
+    a
+No match
+
+/[\b]/locale=fr_FR
+    \b
+ 0: \x08
+\= Expect no match
+    a
+No match
+
+/^\w+/
+\= Expect no match
+    École
+No match
+
+/^\w+/locale=fr_FR
+    École
+ 0: École
+
+/(.+)\b(.+)/
+    École
+ 0: \xc9cole
+ 1: \xc9
+ 2: cole
+
+/(.+)\b(.+)/locale=fr_FR
+\= Expect no match
+    École
+No match
+
+/École/i
+    École
+ 0: \xc9cole
+\= Expect no match
+    école
+No match
+
+/École/i,locale=fr_FR
+    École
+ 0: École
+    école
+ 0: école
+
+/\w/I
+Capturing subpattern count = 0
+Starting code units: 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 
+Subject length lower bound = 1
+
+/\w/I,locale=fr_FR
+Capturing subpattern count = 0
+Starting code units: 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 
+  ª µ º À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö Ø Ù Ú Û Ü Ý Þ ß à á â 
+  ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ø ù ú û ü ý þ ÿ 
+Subject length lower bound = 1
+
+# All remaining tests are in the fr_FR locale, so set the default.
+
+#pattern locale=fr_FR
+
+/^[\xc8-\xc9]/i
+    École
+ 0: É
+    école
+ 0: é
+
+/^[\xc8-\xc9]/
+    École
+ 0: É
+\= Expect no match
+    école
+No match
+
+/\W+/
+    >>>\xaa<<<
+ 0: >>>
+    >>>\xba<<< 
+ 0: >>>
+
+/[\W]+/
+    >>>\xaa<<<
+ 0: >>>
+    >>>\xba<<< 
+ 0: >>>
+
+/[^[:alpha:]]+/
+    >>>\xaa<<<
+ 0: >>>
+    >>>\xba<<< 
+ 0: >>>
+
+/\w+/
+    >>>\xaa<<<
+ 0: ª
+    >>>\xba<<< 
+ 0: º
+
+/[\w]+/
+    >>>\xaa<<<
+ 0: ª
+    >>>\xba<<< 
+ 0: º
+
+/[[:alpha:]]+/
+    >>>\xaa<<<
+ 0: ª
+    >>>\xba<<< 
+ 0: º
+    
+/[[:alpha:]][[:lower:]][[:upper:]]/IB
+------------------------------------------------------------------
+        Bra
+        [A-Za-z\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\xff]
+        [a-z\xaa\xb5\xba\xdf-\xf6\xf8-\xff]
+        [A-Z\xc0-\xd6\xd8-\xde]
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Starting code units: 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 ª µ º À Á Â Ã Ä Å Æ Ç 
+  È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í 
+  î ï ð ñ ò ó ô õ ö ø ù ú û ü ý þ ÿ 
+Subject length lower bound = 3
+
+# End of testinput3 
diff --git a/dist2/testdata/testoutput3B b/dist2/testdata/testoutput3B
new file mode 100644
index 0000000..b30fc5f
--- /dev/null
+++ b/dist2/testdata/testoutput3B
@@ -0,0 +1,163 @@
+# This set of tests checks local-specific features, using the "fr_FR" locale. 
+# It is not Perl-compatible. When run via RunTest, the locale is edited to
+# be whichever of "fr_FR", "french", or "fr" is found to exist. There is
+# different version of this file called wintestinput3 for use on Windows,
+# where the locale is called "french" and the tests are run using
+# RunTest.bat. 
+
+#forbid_utf
+
+/^[\w]+/
+\= Expect no match
+    École
+No match
+
+/^[\w]+/locale=fr_FR
+    École
+ 0: École
+
+/^[\w]+/
+\= Expect no match
+    École
+No match
+
+/^[\W]+/
+    École
+ 0: \xc9
+
+/^[\W]+/locale=fr_FR
+\= Expect no match
+    École
+No match
+
+/[\b]/
+    \b
+ 0: \x08
+\= Expect no match
+    a
+No match
+
+/[\b]/locale=fr_FR
+    \b
+ 0: \x08
+\= Expect no match
+    a
+No match
+
+/^\w+/
+\= Expect no match
+    École
+No match
+
+/^\w+/locale=fr_FR
+    École
+ 0: École
+
+/(.+)\b(.+)/
+    École
+ 0: \xc9cole
+ 1: \xc9
+ 2: cole
+
+/(.+)\b(.+)/locale=fr_FR
+\= Expect no match
+    École
+No match
+
+/École/i
+    École
+ 0: \xc9cole
+\= Expect no match
+    école
+No match
+
+/École/i,locale=fr_FR
+    École
+ 0: École
+    école
+ 0: école
+
+/\w/I
+Capturing subpattern count = 0
+Starting code units: 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 
+Subject length lower bound = 1
+
+/\w/I,locale=fr_FR
+Capturing subpattern count = 0
+Starting code units: 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 
+  ª µ º À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö Ø Ù Ú Û Ü Ý Þ ß à á â 
+  ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ø ù ú û ü ý þ ÿ 
+Subject length lower bound = 1
+
+# All remaining tests are in the fr_FR locale, so set the default.
+
+#pattern locale=fr_FR
+
+/^[\xc8-\xc9]/i
+    École
+ 0: É
+    école
+ 0: é
+
+/^[\xc8-\xc9]/
+    École
+ 0: É
+\= Expect no match
+    école
+No match
+
+/\W+/
+    >>>\xaa<<<
+ 0: >>>
+    >>>\xba<<< 
+ 0: >>>
+
+/[\W]+/
+    >>>\xaa<<<
+ 0: >>>
+    >>>\xba<<< 
+ 0: >>>
+
+/[^[:alpha:]]+/
+    >>>\xaa<<<
+ 0: >>>
+    >>>\xba<<< 
+ 0: >>>
+
+/\w+/
+    >>>\xaa<<<
+ 0: ª
+    >>>\xba<<< 
+ 0: º
+
+/[\w]+/
+    >>>\xaa<<<
+ 0: ª
+    >>>\xba<<< 
+ 0: º
+
+/[[:alpha:]]+/
+    >>>\xaa<<<
+ 0: ª
+    >>>\xba<<< 
+ 0: º
+    
+/[[:alpha:]][[:lower:]][[:upper:]]/IB
+------------------------------------------------------------------
+        Bra
+        [A-Za-z\x83\x8a\x8c\x8e\x9a\x9c\x9e\x9f\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\xff]
+        [a-z\x83\x9a\x9c\x9e\xaa\xb5\xba\xdf-\xf6\xf8-\xff]
+        [A-Z\x8a\x8c\x8e\x9f\xc0-\xd6\xd8-\xde]
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Starting code units: 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 ª µ º À Á Â Ã Ä Å Æ Ç 
+  È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í 
+  î ï ð ñ ò ó ô õ ö ø ù ú û ü ý þ ÿ 
+Subject length lower bound = 3
+
+# End of testinput3 
diff --git a/dist2/testdata/testoutput4 b/dist2/testdata/testoutput4
new file mode 100644
index 0000000..701d411
--- /dev/null
+++ b/dist2/testdata/testoutput4
@@ -0,0 +1,3706 @@
+# This set of tests is for UTF support, including Unicode properties. The 
+# Unicode tests are all compatible with all versions of Perl >= 5.10, but
+# some of the property tests may differ because of different versions of
+# Unicode in use by PCRE2 and Perl.
+
+#newline_default lf anycrlf any
+#perltest
+
+/a.b/utf
+    acb
+ 0: acb
+    a\x7fb
+ 0: a\x{7f}b
+    a\x{100}b
+ 0: a\x{100}b
+\= Expect no match
+    a\nb
+No match
+
+/a(.{3})b/utf
+    a\x{4000}xyb
+ 0: a\x{4000}xyb
+ 1: \x{4000}xy
+    a\x{4000}\x7fyb
+ 0: a\x{4000}\x{7f}yb
+ 1: \x{4000}\x{7f}y
+    a\x{4000}\x{100}yb
+ 0: a\x{4000}\x{100}yb
+ 1: \x{4000}\x{100}y
+\= Expect no match
+    a\x{4000}b
+No match
+    ac\ncb
+No match
+
+/a(.*?)(.)/
+    a\xc0\x88b
+ 0: a\xc0
+ 1: 
+ 2: \xc0
+
+/a(.*?)(.)/utf
+    a\x{100}b
+ 0: a\x{100}
+ 1: 
+ 2: \x{100}
+
+/a(.*)(.)/
+    a\xc0\x88b
+ 0: a\xc0\x88b
+ 1: \xc0\x88
+ 2: b
+
+/a(.*)(.)/utf
+    a\x{100}b
+ 0: a\x{100}b
+ 1: \x{100}
+ 2: b
+
+/a(.)(.)/
+    a\xc0\x92bcd
+ 0: a\xc0\x92
+ 1: \xc0
+ 2: \x92
+
+/a(.)(.)/utf
+    a\x{240}bcd
+ 0: a\x{240}b
+ 1: \x{240}
+ 2: b
+
+/a(.?)(.)/
+    a\xc0\x92bcd
+ 0: a\xc0\x92
+ 1: \xc0
+ 2: \x92
+
+/a(.?)(.)/utf
+    a\x{240}bcd
+ 0: a\x{240}b
+ 1: \x{240}
+ 2: b
+
+/a(.??)(.)/
+    a\xc0\x92bcd
+ 0: a\xc0
+ 1: 
+ 2: \xc0
+
+/a(.??)(.)/utf
+    a\x{240}bcd
+ 0: a\x{240}
+ 1: 
+ 2: \x{240}
+
+/a(.{3})b/utf
+    a\x{1234}xyb
+ 0: a\x{1234}xyb
+ 1: \x{1234}xy
+    a\x{1234}\x{4321}yb
+ 0: a\x{1234}\x{4321}yb
+ 1: \x{1234}\x{4321}y
+    a\x{1234}\x{4321}\x{3412}b
+ 0: a\x{1234}\x{4321}\x{3412}b
+ 1: \x{1234}\x{4321}\x{3412}
+\= Expect no match
+    a\x{1234}b
+No match
+    ac\ncb
+No match
+
+/a(.{3,})b/utf
+    a\x{1234}xyb
+ 0: a\x{1234}xyb
+ 1: \x{1234}xy
+    a\x{1234}\x{4321}yb
+ 0: a\x{1234}\x{4321}yb
+ 1: \x{1234}\x{4321}y
+    a\x{1234}\x{4321}\x{3412}b
+ 0: a\x{1234}\x{4321}\x{3412}b
+ 1: \x{1234}\x{4321}\x{3412}
+    axxxxbcdefghijb
+ 0: axxxxbcdefghijb
+ 1: xxxxbcdefghij
+    a\x{1234}\x{4321}\x{3412}\x{3421}b
+ 0: a\x{1234}\x{4321}\x{3412}\x{3421}b
+ 1: \x{1234}\x{4321}\x{3412}\x{3421}
+\= Expect no match
+    a\x{1234}b
+No match
+
+/a(.{3,}?)b/utf
+    a\x{1234}xyb
+ 0: a\x{1234}xyb
+ 1: \x{1234}xy
+    a\x{1234}\x{4321}yb
+ 0: a\x{1234}\x{4321}yb
+ 1: \x{1234}\x{4321}y
+    a\x{1234}\x{4321}\x{3412}b
+ 0: a\x{1234}\x{4321}\x{3412}b
+ 1: \x{1234}\x{4321}\x{3412}
+    axxxxbcdefghijb
+ 0: axxxxb
+ 1: xxxx
+    a\x{1234}\x{4321}\x{3412}\x{3421}b
+ 0: a\x{1234}\x{4321}\x{3412}\x{3421}b
+ 1: \x{1234}\x{4321}\x{3412}\x{3421}
+\= Expect no match
+    a\x{1234}b
+No match
+
+/a(.{3,5})b/utf
+    a\x{1234}xyb
+ 0: a\x{1234}xyb
+ 1: \x{1234}xy
+    a\x{1234}\x{4321}yb
+ 0: a\x{1234}\x{4321}yb
+ 1: \x{1234}\x{4321}y
+    a\x{1234}\x{4321}\x{3412}b
+ 0: a\x{1234}\x{4321}\x{3412}b
+ 1: \x{1234}\x{4321}\x{3412}
+    axxxxbcdefghijb
+ 0: axxxxb
+ 1: xxxx
+    a\x{1234}\x{4321}\x{3412}\x{3421}b
+ 0: a\x{1234}\x{4321}\x{3412}\x{3421}b
+ 1: \x{1234}\x{4321}\x{3412}\x{3421}
+    axbxxbcdefghijb
+ 0: axbxxb
+ 1: xbxx
+    axxxxxbcdefghijb
+ 0: axxxxxb
+ 1: xxxxx
+\= Expect no match
+    a\x{1234}b
+No match
+    axxxxxxbcdefghijb
+No match
+
+/a(.{3,5}?)b/utf
+    a\x{1234}xyb
+ 0: a\x{1234}xyb
+ 1: \x{1234}xy
+    a\x{1234}\x{4321}yb
+ 0: a\x{1234}\x{4321}yb
+ 1: \x{1234}\x{4321}y
+    a\x{1234}\x{4321}\x{3412}b
+ 0: a\x{1234}\x{4321}\x{3412}b
+ 1: \x{1234}\x{4321}\x{3412}
+    axxxxbcdefghijb
+ 0: axxxxb
+ 1: xxxx
+    a\x{1234}\x{4321}\x{3412}\x{3421}b
+ 0: a\x{1234}\x{4321}\x{3412}\x{3421}b
+ 1: \x{1234}\x{4321}\x{3412}\x{3421}
+    axbxxbcdefghijb
+ 0: axbxxb
+ 1: xbxx
+    axxxxxbcdefghijb
+ 0: axxxxxb
+ 1: xxxxx
+\= Expect no match
+    a\x{1234}b
+No match
+    axxxxxxbcdefghijb
+No match
+
+/^[a\x{c0}]/utf
+\= Expect no match
+    \x{100}
+No match
+
+/(?<=aXb)cd/utf
+    aXbcd
+ 0: cd
+
+/(?<=a\x{100}b)cd/utf
+    a\x{100}bcd
+ 0: cd
+
+/(?<=a\x{100000}b)cd/utf
+    a\x{100000}bcd
+ 0: cd
+
+/(?:\x{100}){3}b/utf
+    \x{100}\x{100}\x{100}b
+ 0: \x{100}\x{100}\x{100}b
+\= Expect no match
+    \x{100}\x{100}b
+No match
+
+/\x{ab}/utf
+    \x{ab}
+ 0: \x{ab}
+    \xc2\xab
+ 0: \x{ab}
+\= Expect no match
+    \x00{ab}
+No match
+
+/(?<=(.))X/utf
+    WXYZ
+ 0: X
+ 1: W
+    \x{256}XYZ
+ 0: X
+ 1: \x{256}
+\= Expect no match
+    XYZ
+No match
+
+/[^a]+/g,utf
+    bcd
+ 0: bcd
+    \x{100}aY\x{256}Z
+ 0: \x{100}
+ 0: Y\x{256}Z
+
+/^[^a]{2}/utf
+    \x{100}bc
+ 0: \x{100}b
+
+/^[^a]{2,}/utf
+    \x{100}bcAa
+ 0: \x{100}bcA
+
+/^[^a]{2,}?/utf
+    \x{100}bca
+ 0: \x{100}b
+
+/[^a]+/gi,utf
+    bcd
+ 0: bcd
+    \x{100}aY\x{256}Z
+ 0: \x{100}
+ 0: Y\x{256}Z
+
+/^[^a]{2}/i,utf
+    \x{100}bc
+ 0: \x{100}b
+
+/^[^a]{2,}/i,utf
+    \x{100}bcAa
+ 0: \x{100}bc
+
+/^[^a]{2,}?/i,utf
+    \x{100}bca
+ 0: \x{100}b
+
+/\x{100}{0,0}/utf
+    abcd
+ 0: 
+
+/\x{100}?/utf
+    abcd
+ 0: 
+    \x{100}\x{100}
+ 0: \x{100}
+
+/\x{100}{0,3}/utf
+    \x{100}\x{100}
+ 0: \x{100}\x{100}
+    \x{100}\x{100}\x{100}\x{100}
+ 0: \x{100}\x{100}\x{100}
+
+/\x{100}*/utf
+    abce
+ 0: 
+    \x{100}\x{100}\x{100}\x{100}
+ 0: \x{100}\x{100}\x{100}\x{100}
+
+/\x{100}{1,1}/utf
+    abcd\x{100}\x{100}\x{100}\x{100}
+ 0: \x{100}
+
+/\x{100}{1,3}/utf
+    abcd\x{100}\x{100}\x{100}\x{100}
+ 0: \x{100}\x{100}\x{100}
+
+/\x{100}+/utf
+    abcd\x{100}\x{100}\x{100}\x{100}
+ 0: \x{100}\x{100}\x{100}\x{100}
+
+/\x{100}{3}/utf
+    abcd\x{100}\x{100}\x{100}XX
+ 0: \x{100}\x{100}\x{100}
+
+/\x{100}{3,5}/utf
+    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}{3,}/utf
+    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}
+
+/(?<=a\x{100}{2}b)X/utf,aftertext
+    Xyyya\x{100}\x{100}bXzzz
+ 0: X
+ 0+ zzz
+
+/\D*/utf
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+
+/\D*/utf
+  \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}
+ 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}
+
+/\D/utf
+    1X2
+ 0: X
+    1\x{100}2
+ 0: \x{100}
+
+/>\S/utf
+    > >X Y
+ 0: >X
+    > >\x{100} Y
+ 0: >\x{100}
+
+/\d/utf
+    \x{100}3
+ 0: 3
+
+/\s/utf
+    \x{100} X
+ 0:  
+
+/\D+/utf
+    12abcd34
+ 0: abcd
+\= Expect no match
+    1234
+No match
+
+/\D{2,3}/utf
+    12abcd34
+ 0: abc
+    12ab34
+ 0: ab
+\= Expect no match
+    1234
+No match
+    12a34
+No match
+
+/\D{2,3}?/utf
+    12abcd34
+ 0: ab
+    12ab34
+ 0: ab
+\= Expect no match
+    1234
+No match
+    12a34
+No match
+
+/\d+/utf
+    12abcd34
+ 0: 12
+
+/\d{2,3}/utf
+    12abcd34
+ 0: 12
+    1234abcd
+ 0: 123
+\= Expect no match
+    1.4
+No match
+
+/\d{2,3}?/utf
+    12abcd34
+ 0: 12
+    1234abcd
+ 0: 12
+\= Expect no match
+    1.4
+No match
+
+/\S+/utf
+    12abcd34
+ 0: 12abcd34
+\= Expect no match
+    \    \
+No match
+
+/\S{2,3}/utf
+    12abcd34
+ 0: 12a
+    1234abcd
+ 0: 123
+\= Expect no match
+    \     \
+No match
+
+/\S{2,3}?/utf
+    12abcd34
+ 0: 12
+    1234abcd
+ 0: 12
+\= Expect no match
+    \     \
+No match
+
+/>\s+</utf,aftertext
+    12>      <34
+ 0: >      <
+ 0+ 34
+
+/>\s{2,3}</utf,aftertext
+    ab>  <cd
+ 0: >  <
+ 0+ cd
+    ab>   <ce
+ 0: >   <
+ 0+ ce
+\= Expect no match
+    ab>    <cd
+No match
+
+/>\s{2,3}?</utf,aftertext
+    ab>  <cd
+ 0: >  <
+ 0+ cd
+    ab>   <ce
+ 0: >   <
+ 0+ ce
+\= Expect no match
+    ab>    <cd
+No match
+
+/\w+/utf
+    12      34
+ 0: 12
+\= Expect no match
+    +++=*!
+No match
+
+/\w{2,3}/utf
+    ab  cd
+ 0: ab
+    abcd ce
+ 0: abc
+\= Expect no match
+    a.b.c
+No match
+
+/\w{2,3}?/utf
+    ab  cd
+ 0: ab
+    abcd ce
+ 0: ab
+\= Expect no match
+    a.b.c
+No match
+
+/\W+/utf
+    12====34
+ 0: ====
+\= Expect no match
+    abcd
+No match
+
+/\W{2,3}/utf
+    ab====cd
+ 0: ===
+    ab==cd
+ 0: ==
+\= Expect no match
+    a.b.c
+No match
+
+/\W{2,3}?/utf
+    ab====cd
+ 0: ==
+    ab==cd
+ 0: ==
+\= Expect no match
+    a.b.c
+No match
+
+/[\x{100}]/utf
+    \x{100}
+ 0: \x{100}
+    Z\x{100}
+ 0: \x{100}
+    \x{100}Z
+ 0: \x{100}
+
+/[Z\x{100}]/utf
+    Z\x{100}
+ 0: Z
+    \x{100}
+ 0: \x{100}
+    \x{100}Z
+ 0: \x{100}
+
+/[\x{100}\x{200}]/utf
+    ab\x{100}cd
+ 0: \x{100}
+    ab\x{200}cd
+ 0: \x{200}
+
+/[\x{100}-\x{200}]/utf
+    ab\x{100}cd
+ 0: \x{100}
+    ab\x{200}cd
+ 0: \x{200}
+    ab\x{111}cd
+ 0: \x{111}
+
+/[z-\x{200}]/utf
+    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\x{100}\x{200}]/utf
+    ab\x{100}cd
+ 0: \x{100}
+    ab\x{200}cd
+ 0: \x{200}
+    Q?
+ 0: Q
+
+/[Q\x{100}-\x{200}]/utf
+    ab\x{100}cd
+ 0: \x{100}
+    ab\x{200}cd
+ 0: \x{200}
+    ab\x{111}cd
+ 0: \x{111}
+    Q?
+ 0: Q
+
+/[Qz-\x{200}]/utf
+    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
+
+/[\x{100}\x{200}]{1,3}/utf
+    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}
+
+/[\x{100}\x{200}]{1,3}?/utf
+    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}
+
+/[Q\x{100}\x{200}]{1,3}/utf
+    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}
+
+/[Q\x{100}\x{200}]{1,3}?/utf
+    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}])X/utf
+    abc\x{200}X
+ 0: X
+    abc\x{100}X
+ 0: X
+\= Expect no match
+    X
+No match
+
+/(?<=[Q\x{100}\x{200}])X/utf
+    abc\x{200}X
+ 0: X
+    abc\x{100}X
+ 0: X
+    abQX
+ 0: X
+\= Expect no match
+    X
+No match
+
+/(?<=[\x{100}\x{200}]{3})X/utf
+    abc\x{100}\x{200}\x{100}X
+ 0: X
+\= Expect no match
+    abc\x{200}X
+No match
+    X
+No match
+
+/[^\x{100}\x{200}]X/utf
+    AX
+ 0: AX
+    \x{150}X
+ 0: \x{150}X
+    \x{500}X
+ 0: \x{500}X
+\= Expect no match
+    \x{100}X
+No match
+    \x{200}X
+No match
+
+/[^Q\x{100}\x{200}]X/utf
+    AX
+ 0: AX
+    \x{150}X
+ 0: \x{150}X
+    \x{500}X
+ 0: \x{500}X
+\= Expect no match
+    \x{100}X
+No match
+    \x{200}X
+No match
+    QX
+No match
+
+/[^\x{100}-\x{200}]X/utf
+    AX
+ 0: AX
+    \x{500}X
+ 0: \x{500}X
+\= Expect no match
+    \x{100}X
+No match
+    \x{150}X
+No match
+    \x{200}X
+No match
+
+/[z-\x{100}]/i,utf
+    z
+ 0: z
+    Z
+ 0: Z
+    \x{100}
+ 0: \x{100}
+\= Expect no match
+    \x{102}
+No match
+    y
+No match
+
+/[\xFF]/
+    >\xff<
+ 0: \xff
+
+/[\xff]/utf
+    >\x{ff}<
+ 0: \x{ff}
+
+/[^\xFF]/
+    XYZ
+ 0: X
+
+/[^\xff]/utf
+    XYZ
+ 0: X
+    \x{123}
+ 0: \x{123}
+
+/^[ac]*b/utf
+\= Expect no match
+  xb
+No match
+
+/^[ac\x{100}]*b/utf
+\= Expect no match
+  xb
+No match
+
+/^[^x]*b/i,utf
+\= Expect no match
+  xb
+No match
+
+/^[^x]*b/utf
+\= Expect no match
+  xb
+No match
+
+/^\d*b/utf
+\= Expect no match
+  xb
+No match
+
+/(|a)/g,utf
+    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}$/i,utf
+    \x{85}
+ 0: \x{85}
+
+/^ሴ/utf
+    ሴ
+ 0: \x{1234}
+
+/^\ሴ/utf
+    ሴ
+ 0: \x{1234}
+
+"(?s)(.{1,5})"utf
+    abcdefg
+ 0: abcde
+ 1: abcde
+    ab
+ 0: ab
+ 1: ab
+
+/a*\x{100}*\w/utf
+    a
+ 0: a
+
+/\S\S/g,utf
+    A\x{a3}BC
+ 0: A\x{a3}
+ 0: BC
+
+/\S{2}/g,utf
+    A\x{a3}BC
+ 0: A\x{a3}
+ 0: BC
+
+/\W\W/g,utf
+    +\x{a3}==
+ 0: +\x{a3}
+ 0: ==
+
+/\W{2}/g,utf
+    +\x{a3}==
+ 0: +\x{a3}
+ 0: ==
+
+/\S/g,utf
+    \x{442}\x{435}\x{441}\x{442}
+ 0: \x{442}
+ 0: \x{435}
+ 0: \x{441}
+ 0: \x{442}
+
+/[\S]/g,utf
+    \x{442}\x{435}\x{441}\x{442}
+ 0: \x{442}
+ 0: \x{435}
+ 0: \x{441}
+ 0: \x{442}
+
+/\D/g,utf
+    \x{442}\x{435}\x{441}\x{442}
+ 0: \x{442}
+ 0: \x{435}
+ 0: \x{441}
+ 0: \x{442}
+
+/[\D]/g,utf
+    \x{442}\x{435}\x{441}\x{442}
+ 0: \x{442}
+ 0: \x{435}
+ 0: \x{441}
+ 0: \x{442}
+
+/\W/g,utf
+    \x{2442}\x{2435}\x{2441}\x{2442}
+ 0: \x{2442}
+ 0: \x{2435}
+ 0: \x{2441}
+ 0: \x{2442}
+
+/[\W]/g,utf
+    \x{2442}\x{2435}\x{2441}\x{2442}
+ 0: \x{2442}
+ 0: \x{2435}
+ 0: \x{2441}
+ 0: \x{2442}
+
+/[\S\s]*/utf
+    abc\n\r\x{442}\x{435}\x{441}\x{442}xyz
+ 0: abc\x{0a}\x{0d}\x{442}\x{435}\x{441}\x{442}xyz
+
+/[\x{41f}\S]/g,utf
+    \x{442}\x{435}\x{441}\x{442}
+ 0: \x{442}
+ 0: \x{435}
+ 0: \x{441}
+ 0: \x{442}
+
+/.[^\S]./g,utf
+    abc def\x{442}\x{443}xyz\npqr
+ 0: c d
+ 0: z\x{0a}p
+
+/.[^\S\n]./g,utf
+    abc def\x{442}\x{443}xyz\npqr
+ 0: c d
+
+/[[:^alnum:]]/g,utf
+    +\x{2442}
+ 0: +
+ 0: \x{2442}
+
+/[[:^alpha:]]/g,utf
+    +\x{2442}
+ 0: +
+ 0: \x{2442}
+
+/[[:^ascii:]]/g,utf
+    A\x{442}
+ 0: \x{442}
+
+/[[:^blank:]]/g,utf
+    A\x{442}
+ 0: A
+ 0: \x{442}
+
+/[[:^cntrl:]]/g,utf
+    A\x{442}
+ 0: A
+ 0: \x{442}
+
+/[[:^digit:]]/g,utf
+    A\x{442}
+ 0: A
+ 0: \x{442}
+
+/[[:^graph:]]/g,utf
+    \x19\x{e01ff}
+ 0: \x{19}
+ 0: \x{e01ff}
+
+/[[:^lower:]]/g,utf
+    A\x{422}
+ 0: A
+ 0: \x{422}
+
+/[[:^print:]]/g,utf
+    \x{19}\x{e01ff}
+ 0: \x{19}
+ 0: \x{e01ff}
+
+/[[:^punct:]]/g,utf
+    A\x{442}
+ 0: A
+ 0: \x{442}
+
+/[[:^space:]]/g,utf
+    A\x{442}
+ 0: A
+ 0: \x{442}
+
+/[[:^upper:]]/g,utf
+    a\x{442}
+ 0: a
+ 0: \x{442}
+
+/[[:^word:]]/g,utf
+    +\x{2442}
+ 0: +
+ 0: \x{2442}
+
+/[[:^xdigit:]]/g,utf
+    M\x{442}
+ 0: M
+ 0: \x{442}
+
+/[^ABCDEFGHIJKLMNOPQRSTUVWXYZÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞĀĂĄĆĈĊČĎĐĒĔĖĘĚĜĞĠĢĤĦĨĪĬĮİIJĴĶĹĻĽĿŁŃŅŇŊŌŎŐŒŔŖŘŚŜŞŠŢŤŦŨŪŬŮŰŲŴŶŸŹŻŽƁƂƄƆƇƉƊƋƎƏƐƑƓƔƖƗƘƜƝƟƠƢƤƦƧƩƬƮƯƱƲƳƵƷƸƼDŽLJNJǍǏǑǓǕǗǙǛǞǠǢǤǦǨǪǬǮDZǴǶǷǸǺǼǾȀȂȄȆȈȊȌȎȐȒȔȖȘȚȜȞȠȢȤȦȨȪȬȮȰȲȺȻȽȾɁΆΈΉΊΌΎΏΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩΪΫϒϓϔϘϚϜϞϠϢϤϦϨϪϬϮϴϷϹϺϽϾϿЀЁЂЃЄЅІЇЈЉЊЋЌЍЎЏАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯѠѢѤѦѨѪѬѮѰѲѴѶѸѺѼѾҀҊҌҎҐҒҔҖҘҚҜҞҠҢҤҦҨҪҬҮҰҲҴҶҸҺҼҾӀӁӃӅӇӉӋӍӐӒӔӖӘӚӜӞӠӢӤӦӨӪӬӮӰӲӴӶӸԀԂԄԆԈԊԌԎԱԲԳԴԵԶԷԸԹԺԻԼԽԾԿՀՁՂՃՄՅՆՇՈՉՊՋՌՍՎՏՐՑՒՓՔՕՖႠႡႢႣႤႥႦႧႨႩႪႫႬႭႮႯႰႱႲႳႴႵႶႷႸႹႺႻႼႽႾႿჀჁჂჃჄჅḀḂḄḆḈḊḌḎḐḒḔḖḘḚḜḞḠḢḤḦḨḪḬḮḰḲḴḶḸḺḼḾṀṂṄṆṈṊṌṎṐṒṔṖṘṚṜṞṠṢṤṦṨṪṬṮṰṲṴṶṸṺṼṾẀẂẄẆẈẊẌẎẐẒẔẠẢẤẦẨẪẬẮẰẲẴẶẸẺẼẾỀỂỄỆỈỊỌỎỐỒỔỖỘỚỜỞỠỢỤỦỨỪỬỮỰỲỴỶỸἈἉἊἋἌἍἎἏἘἙἚἛἜἝἨἩἪἫἬἭἮἯἸἹἺἻἼἽἾἿὈὉὊὋὌὍὙὛὝὟὨὩὪὫὬὭὮὯᾸᾹᾺΆῈΈῊΉῘῙῚΊῨῩῪΎῬῸΌῺΏabcdefghijklmnopqrstuvwxyzªµºßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿāăąćĉċčďđēĕėęěĝğġģĥħĩīĭįıijĵķĸĺļľŀłńņňʼnŋōŏőœŕŗřśŝşšţťŧũūŭůűųŵŷźżžſƀƃƅƈƌƍƒƕƙƚƛƞơƣƥƨƪƫƭưƴƶƹƺƽƾƿdžljnjǎǐǒǔǖǘǚǜǝǟǡǣǥǧǩǫǭǯǰdzǵǹǻǽǿȁȃȅȇȉȋȍȏȑȓȕȗșțȝȟȡȣȥȧȩȫȭȯȱȳȴȵȶȷȸȹȼȿɀɐɑɒɓɔɕɖɗɘəɚɛɜɝɞɟɠɡɢɣɤɥɦɧɨɩɪɫɬɭɮɯɰɱɲɳɴɵɶɷɸɹɺɻɼɽɾɿʀʁʂʃʄʅʆʇʈʉʊʋʌʍʎʏʐʑʒʓʔʕʖʗʘʙʚʛʜʝʞʟʠʡʢʣʤʥʦʧʨʩʪʫʬʭʮʯΐάέήίΰαβγδεζηθικλμνξοπρςστυφχψωϊϋόύώϐϑϕϖϗϙϛϝϟϡϣϥϧϩϫϭϯϰϱϲϳϵϸϻϼабвгдежзийклмнопрстуфхцчшщъыьэюяѐёђѓєѕіїјљњћќѝўџѡѣѥѧѩѫѭѯѱѳѵѷѹѻѽѿҁҋҍҏґғҕҗҙқҝҟҡңҥҧҩҫҭүұҳҵҷҹһҽҿӂӄӆӈӊӌӎӑӓӕӗәӛӝӟӡӣӥӧөӫӭӯӱӳӵӷӹԁԃԅԇԉԋԍԏաբգդեզէըթժիլխծկհձղճմյնշոչպջռսվտրցւփքօֆևᴀᴁᴂᴃᴄᴅᴆᴇᴈᴉᴊᴋᴌᴍᴎᴏᴐᴑᴒᴓᴔᴕᴖᴗᴘᴙᴚᴛᴜᴝᴞᴟᴠᴡᴢᴣᴤᴥᴦᴧᴨᴩᴪᴫᵢᵣᵤᵥᵦᵧᵨᵩᵪᵫᵬᵭᵮᵯᵰᵱᵲᵳᵴᵵᵶᵷᵹᵺᵻᵼᵽᵾᵿᶀᶁᶂᶃᶄᶅᶆᶇᶈᶉᶊᶋᶌᶍᶎᶏᶐᶑᶒᶓᶔᶕᶖᶗᶘᶙᶚḁḃḅḇḉḋḍḏḑḓḕḗḙḛḝḟḡḣḥḧḩḫḭḯḱḳḵḷḹḻḽḿṁṃṅṇṉṋṍṏṑṓṕṗṙṛṝṟṡṣṥṧṩṫṭṯṱṳṵṷṹṻṽṿẁẃẅẇẉẋẍẏẑẓẕẖẗẘẙẚẛạảấầẩẫậắằẳẵặẹẻẽếềểễệỉịọỏốồổỗộớờởỡợụủứừửữựỳỵỷỹἀἁἂἃἄἅἆἇἐἑἒἓἔἕἠἡἢἣἤἥἦἧἰἱἲἳἴἵἶἷὀὁὂὃὄὅὐὑὒὓὔὕὖὗὠὡὢὣὤὥὦὧὰάὲέὴήὶίὸόὺύὼώᾀᾁᾂᾃᾄᾅᾆᾇᾐᾑᾒᾓᾔᾕᾖᾗᾠᾡᾢᾣᾤᾥᾦᾧᾰᾱᾲᾳᾴᾶᾷιῂῃῄῆῇῐῑῒΐῖῗῠῡῢΰῤῥῦῧῲῳῴῶῷⲁⲃⲅⲇⲉⲋⲍⲏⲑⲓⲕⲗⲙⲛⲝⲟⲡⲣⲥⲧⲩⲫⲭⲯⲱⲳⲵⲷⲹⲻⲽⲿⳁⳃⳅⳇⳉⳋⳍⳏⳑⳓⳕⳗⳙⳛⳝⳟⳡⳣⳤⴀⴁⴂⴃⴄⴅⴆⴇⴈⴉⴊⴋⴌⴍⴎⴏⴐⴑⴒⴓⴔⴕⴖⴗⴘⴙⴚⴛⴜⴝⴞⴟⴠⴡⴢⴣⴤⴥfffiflffifflſtstﬓﬔﬕﬖﬗ\d-_^]/utf
+
+/^[^d]*?$/
+    abc
+ 0: abc
+
+/^[^d]*?$/utf
+    abc
+ 0: abc
+
+/^[^d]*?$/i
+    abc
+ 0: abc
+
+/^[^d]*?$/i,utf
+    abc
+ 0: abc
+
+/(?i)[\xc3\xa9\xc3\xbd]|[\xc3\xa9\xc3\xbdA]/utf
+
+/^[a\x{c0}]b/utf
+    \x{c0}b
+ 0: \x{c0}b
+
+/^([a\x{c0}]*?)aa/utf
+    a\x{c0}aaaa/
+ 0: a\x{c0}aa
+ 1: a\x{c0}
+
+/^([a\x{c0}]*?)aa/utf
+    a\x{c0}aaaa/
+ 0: a\x{c0}aa
+ 1: a\x{c0}
+    a\x{c0}a\x{c0}aaa/
+ 0: a\x{c0}a\x{c0}aa
+ 1: a\x{c0}a\x{c0}
+
+/^([a\x{c0}]*)aa/utf
+    a\x{c0}aaaa/
+ 0: a\x{c0}aaaa
+ 1: a\x{c0}aa
+    a\x{c0}a\x{c0}aaa/
+ 0: a\x{c0}a\x{c0}aaa
+ 1: a\x{c0}a\x{c0}a
+
+/^([a\x{c0}]*)a\x{c0}/utf
+    a\x{c0}aaaa/
+ 0: a\x{c0}
+ 1: 
+    a\x{c0}a\x{c0}aaa/
+ 0: a\x{c0}a\x{c0}
+ 1: a\x{c0}
+
+/A*/g,utf
+    AAB\x{123}BAA
+ 0: AA
+ 0: 
+ 0: 
+ 0: 
+ 0: AA
+ 0: 
+
+/(abc)\1/i,utf
+\= Expect no match
+   abc
+No match
+
+/(abc)\1/utf
+\= Expect no match
+   abc
+No match
+
+/a(*:a\x{1234}b)/utf,mark
+    abc
+ 0: a
+MK: a\x{1234}b
+
+/a(*:a£b)/utf,mark
+    abc
+ 0: a
+MK: a\x{a3}b
+
+# Noncharacters
+
+/./utf
+    \x{fffe}
+ 0: \x{fffe}
+    \x{ffff}
+ 0: \x{ffff}
+    \x{1fffe}
+ 0: \x{1fffe}
+    \x{1ffff}
+ 0: \x{1ffff}
+    \x{2fffe}
+ 0: \x{2fffe}
+    \x{2ffff}
+ 0: \x{2ffff}
+    \x{3fffe}
+ 0: \x{3fffe}
+    \x{3ffff}
+ 0: \x{3ffff}
+    \x{4fffe}
+ 0: \x{4fffe}
+    \x{4ffff}
+ 0: \x{4ffff}
+    \x{5fffe}
+ 0: \x{5fffe}
+    \x{5ffff}
+ 0: \x{5ffff}
+    \x{6fffe}
+ 0: \x{6fffe}
+    \x{6ffff}
+ 0: \x{6ffff}
+    \x{7fffe}
+ 0: \x{7fffe}
+    \x{7ffff}
+ 0: \x{7ffff}
+    \x{8fffe}
+ 0: \x{8fffe}
+    \x{8ffff}
+ 0: \x{8ffff}
+    \x{9fffe}
+ 0: \x{9fffe}
+    \x{9ffff}
+ 0: \x{9ffff}
+    \x{afffe}
+ 0: \x{afffe}
+    \x{affff}
+ 0: \x{affff}
+    \x{bfffe}
+ 0: \x{bfffe}
+    \x{bffff}
+ 0: \x{bffff}
+    \x{cfffe}
+ 0: \x{cfffe}
+    \x{cffff}
+ 0: \x{cffff}
+    \x{dfffe}
+ 0: \x{dfffe}
+    \x{dffff}
+ 0: \x{dffff}
+    \x{efffe}
+ 0: \x{efffe}
+    \x{effff}
+ 0: \x{effff}
+    \x{ffffe}
+ 0: \x{ffffe}
+    \x{fffff}
+ 0: \x{fffff}
+    \x{10fffe}
+ 0: \x{10fffe}
+    \x{10ffff}
+ 0: \x{10ffff}
+    \x{fdd0}
+ 0: \x{fdd0}
+    \x{fdd1}
+ 0: \x{fdd1}
+    \x{fdd2}
+ 0: \x{fdd2}
+    \x{fdd3}
+ 0: \x{fdd3}
+    \x{fdd4}
+ 0: \x{fdd4}
+    \x{fdd5}
+ 0: \x{fdd5}
+    \x{fdd6}
+ 0: \x{fdd6}
+    \x{fdd7}
+ 0: \x{fdd7}
+    \x{fdd8}
+ 0: \x{fdd8}
+    \x{fdd9}
+ 0: \x{fdd9}
+    \x{fdda}
+ 0: \x{fdda}
+    \x{fddb}
+ 0: \x{fddb}
+    \x{fddc}
+ 0: \x{fddc}
+    \x{fddd}
+ 0: \x{fddd}
+    \x{fdde}
+ 0: \x{fdde}
+    \x{fddf}
+ 0: \x{fddf}
+    \x{fde0}
+ 0: \x{fde0}
+    \x{fde1}
+ 0: \x{fde1}
+    \x{fde2}
+ 0: \x{fde2}
+    \x{fde3}
+ 0: \x{fde3}
+    \x{fde4}
+ 0: \x{fde4}
+    \x{fde5}
+ 0: \x{fde5}
+    \x{fde6}
+ 0: \x{fde6}
+    \x{fde7}
+ 0: \x{fde7}
+    \x{fde8}
+ 0: \x{fde8}
+    \x{fde9}
+ 0: \x{fde9}
+    \x{fdea}
+ 0: \x{fdea}
+    \x{fdeb}
+ 0: \x{fdeb}
+    \x{fdec}
+ 0: \x{fdec}
+    \x{fded}
+ 0: \x{fded}
+    \x{fdee}
+ 0: \x{fdee}
+    \x{fdef}
+ 0: \x{fdef}
+
+/^\d*\w{4}/utf
+    1234
+ 0: 1234
+\= Expect no match     
+    123
+No match
+
+/^[^b]*\w{4}/utf
+    aaaa
+ 0: aaaa
+\= Expect no match     
+    aaa
+No match
+
+/^[^b]*\w{4}/i,utf
+    aaaa
+ 0: aaaa
+\= Expect no match     
+    aaa
+No match
+
+/^\x{100}*.{4}/utf
+    \x{100}\x{100}\x{100}\x{100}
+ 0: \x{100}\x{100}\x{100}\x{100}
+\= Expect no match     
+    \x{100}\x{100}\x{100}
+No match
+
+/^\x{100}*.{4}/i,utf
+    \x{100}\x{100}\x{100}\x{100}
+ 0: \x{100}\x{100}\x{100}\x{100}
+\= Expect no match     
+    \x{100}\x{100}\x{100}
+No match
+
+/^a+[a\x{200}]/utf
+    aa
+ 0: aa
+
+/^.\B.\B./utf
+    \x{10123}\x{10124}\x{10125}
+ 0: \x{10123}\x{10124}\x{10125}
+
+/^#[^\x{ffff}]#[^\x{ffff}]#[^\x{ffff}]#/utf
+    #\x{10000}#\x{100}#\x{10ffff}#
+ 0: #\x{10000}#\x{100}#\x{10ffff}#
+    
+# Unicode property support tests 
+
+/^\pC\pL\pM\pN\pP\pS\pZ</utf
+    \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!$ <
+\= Expect no match     
+    ap\x{300}9!\$ < 
+No match
+  
+/^\PC/utf
+    X
+ 0: X
+\= Expect no match     
+    \x7f
+No match
+  
+/^\PL/utf
+    9
+ 0: 9
+\= Expect no match     
+    \x{c0}
+No match
+  
+/^\PM/utf
+    X
+ 0: X
+\= Expect no match     
+    \x{30f}
+No match
+  
+/^\PN/utf
+    X
+ 0: X
+\= Expect no match     
+    \x{660}
+No match
+  
+/^\PP/utf
+    X
+ 0: X
+\= Expect no match 
+    \x{66c}
+No match
+  
+/^\PS/utf
+    X
+ 0: X
+\= Expect no match 
+    \x{f01}
+No match
+  
+/^\PZ/utf
+    X
+ 0: X
+\= Expect no match 
+    \x{1680}
+No match
+    
+/^\p{Cc}/utf
+    \x{017}
+ 0: \x{17}
+    \x{09f} 
+ 0: \x{9f}
+\= Expect no match
+    \x{0600} 
+No match
+  
+/^\p{Cf}/utf
+    \x{601}
+ 0: \x{601}
+\= Expect no match
+    \x{09f} 
+No match
+  
+/^\p{Cn}/utf
+    \x{e0000}
+ 0: \x{e0000}
+\= Expect no match
+    \x{09f} 
+No match
+  
+/^\p{Co}/utf
+    \x{f8ff}
+ 0: \x{f8ff}
+\= Expect no match
+    \x{09f} 
+No match
+  
+/^\p{Ll}/utf
+    a
+ 0: a
+\= Expect no match 
+    Z
+No match
+    \x{e000}  
+No match
+  
+/^\p{Lm}/utf
+    \x{2b0}
+ 0: \x{2b0}
+\= Expect no match
+    a 
+No match
+  
+/^\p{Lo}/utf
+    \x{1bb}
+ 0: \x{1bb}
+    \x{3400}
+ 0: \x{3400}
+    \x{3401}
+ 0: \x{3401}
+    \x{4d00}
+ 0: \x{4d00}
+    \x{4db4}
+ 0: \x{4db4}
+    \x{4db5}     
+ 0: \x{4db5}
+\= Expect no match
+    a 
+No match
+    \x{2b0}
+No match
+    \x{4db6} 
+No match
+  
+/^\p{Lt}/utf
+    \x{1c5}
+ 0: \x{1c5}
+\= Expect no match
+    a 
+No match
+    \x{2b0}
+No match
+  
+/^\p{Lu}/utf
+    A
+ 0: A
+\= Expect no match
+    \x{2b0}
+No match
+  
+/^\p{Mc}/utf
+    \x{903}
+ 0: \x{903}
+\= Expect no match
+    X
+No match
+    \x{300}
+No match
+       
+/^\p{Me}/utf
+    \x{488}
+ 0: \x{488}
+\= Expect no match
+    X
+No match
+    \x{903}
+No match
+    \x{300}
+No match
+  
+/^\p{Mn}/utf
+    \x{300}
+ 0: \x{300}
+\= Expect no match
+    X
+No match
+    \x{903}
+No match
+  
+/^\p{Nd}+/utf
+    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}
+\= Expect no match
+    X
+No match
+  
+/^\p{Nl}/utf
+    \x{16ee}
+ 0: \x{16ee}
+\= Expect no match
+    X
+No match
+    \x{966}
+No match
+  
+/^\p{No}/utf
+    \x{b2}
+ 0: \x{b2}
+    \x{b3}
+ 0: \x{b3}
+\= Expect no match
+    X
+No match
+    \x{16ee}
+No match
+  
+/^\p{Pc}/utf
+    \x5f
+ 0: _
+    \x{203f}
+ 0: \x{203f}
+\= Expect no match
+    X
+No match
+    -
+No match
+    \x{58a}
+No match
+  
+/^\p{Pd}/utf
+    -
+ 0: -
+    \x{58a}
+ 0: \x{58a}
+\= Expect no match
+    X
+No match
+    \x{203f}
+No match
+  
+/^\p{Pe}/utf
+    )
+ 0: )
+    ]
+ 0: ]
+    }
+ 0: }
+    \x{f3b}
+ 0: \x{f3b}
+\= Expect no match
+    X
+No match
+    \x{203f}
+No match
+    (
+No match
+    [
+No match
+    {
+No match
+    \x{f3c}
+No match
+  
+/^\p{Pf}/utf
+    \x{bb}
+ 0: \x{bb}
+    \x{2019}
+ 0: \x{2019}
+\= Expect no match
+    X
+No match
+    \x{203f}
+No match
+  
+/^\p{Pi}/utf
+    \x{ab}
+ 0: \x{ab}
+    \x{2018}
+ 0: \x{2018}
+\= Expect no match
+    X
+No match
+    \x{203f}
+No match
+  
+/^\p{Po}/utf
+    !
+ 0: !
+    \x{37e}
+ 0: \x{37e}
+\= Expect no match
+    X
+No match
+    \x{203f}
+No match
+  
+/^\p{Ps}/utf
+    (
+ 0: (
+    [
+ 0: [
+    {
+ 0: {
+    \x{f3c}
+ 0: \x{f3c}
+\= Expect no match
+    X
+No match
+    )
+No match
+    ]
+No match
+    }
+No match
+    \x{f3b}
+No match
+  
+/^\p{Sk}/utf
+    \x{2c2}
+ 0: \x{2c2}
+\= Expect no match
+    X
+No match
+    \x{9f2}
+No match
+  
+/^\p{Sm}+/utf
+    +<|~\x{ac}\x{2044}
+ 0: +<|~\x{ac}\x{2044}
+\= Expect no match
+    X
+No match
+    \x{9f2}
+No match
+  
+/^\p{So}/utf
+    \x{a6}
+ 0: \x{a6}
+    \x{482} 
+ 0: \x{482}
+\= Expect no match
+    X
+No match
+    \x{9f2}
+No match
+  
+/^\p{Zl}/utf
+    \x{2028}
+ 0: \x{2028}
+\= Expect no match
+    X
+No match
+    \x{2029}
+No match
+  
+/^\p{Zp}/utf
+    \x{2029}
+ 0: \x{2029}
+\= Expect no match
+    X
+No match
+    \x{2028}
+No match
+  
+/\p{Nd}+(..)/utf
+    \x{660}\x{661}\x{662}ABC
+ 0: \x{660}\x{661}\x{662}AB
+ 1: AB
+  
+/\p{Nd}+?(..)/utf
+    \x{660}\x{661}\x{662}ABC
+ 0: \x{660}\x{661}\x{662}
+ 1: \x{661}\x{662}
+  
+/\p{Nd}{2,}(..)/utf
+    \x{660}\x{661}\x{662}ABC
+ 0: \x{660}\x{661}\x{662}AB
+ 1: AB
+  
+/\p{Nd}{2,}?(..)/utf
+    \x{660}\x{661}\x{662}ABC
+ 0: \x{660}\x{661}\x{662}A
+ 1: \x{662}A
+  
+/\p{Nd}*(..)/utf
+    \x{660}\x{661}\x{662}ABC
+ 0: \x{660}\x{661}\x{662}AB
+ 1: AB
+  
+/\p{Nd}*?(..)/utf
+    \x{660}\x{661}\x{662}ABC
+ 0: \x{660}\x{661}
+ 1: \x{660}\x{661}
+  
+/\p{Nd}{2}(..)/utf
+    \x{660}\x{661}\x{662}ABC
+ 0: \x{660}\x{661}\x{662}A
+ 1: \x{662}A
+  
+/\p{Nd}{2,3}(..)/utf
+    \x{660}\x{661}\x{662}ABC
+ 0: \x{660}\x{661}\x{662}AB
+ 1: AB
+  
+/\p{Nd}{2,3}?(..)/utf
+    \x{660}\x{661}\x{662}ABC
+ 0: \x{660}\x{661}\x{662}A
+ 1: \x{662}A
+  
+/\p{Nd}?(..)/utf
+    \x{660}\x{661}\x{662}ABC
+ 0: \x{660}\x{661}\x{662}
+ 1: \x{661}\x{662}
+  
+/\p{Nd}??(..)/utf
+    \x{660}\x{661}\x{662}ABC
+ 0: \x{660}\x{661}
+ 1: \x{660}\x{661}
+  
+/\p{Nd}*+(..)/utf
+    \x{660}\x{661}\x{662}ABC
+ 0: \x{660}\x{661}\x{662}AB
+ 1: AB
+  
+/\p{Nd}*+(...)/utf
+    \x{660}\x{661}\x{662}ABC
+ 0: \x{660}\x{661}\x{662}ABC
+ 1: ABC
+  
+/\p{Nd}*+(....)/utf
+\= Expect no match
+    \x{660}\x{661}\x{662}ABC
+No match
+  
+/(?<=A\p{Nd})XYZ/utf
+    A2XYZ
+ 0: XYZ
+    123A5XYZPQR
+ 0: XYZ
+    ABA\x{660}XYZpqr
+ 0: XYZ
+\= Expect no match
+    AXYZ
+No match
+    XYZ     
+No match
+    
+/(?<!\pL)XYZ/utf
+    1XYZ
+ 0: XYZ
+    AB=XYZ.. 
+ 0: XYZ
+    XYZ 
+ 0: XYZ
+\= Expect no match
+    WXYZ 
+No match
+
+/[\P{Nd}]+/utf
+    abcd
+ 0: abcd
+\= Expect no match
+    1234
+No match
+
+/\D+/utf
+    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+\= Expect no match
+    11111111111111111111111111111111111111111111111111111111111111111111111
+No match
+     
+/\P{Nd}+/utf
+    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+\= Expect no match
+    11111111111111111111111111111111111111111111111111111111111111111111111
+No match
+
+/[\D]+/utf
+    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+\= Expect no match
+    11111111111111111111111111111111111111111111111111111111111111111111111
+No match
+
+/[\P{Nd}]+/utf
+    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+\= Expect no match
+    11111111111111111111111111111111111111111111111111111111111111111111111
+No match
+
+/[\D\P{Nd}]+/utf
+    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+\= Expect no match
+    11111111111111111111111111111111111111111111111111111111111111111111111
+No match
+
+/\pL/utf
+    a
+ 0: a
+    A 
+ 0: A
+
+/\pL/i,utf
+    a
+ 0: a
+    A 
+ 0: A
+    
+/\p{Lu}/utf
+    A
+ 0: A
+    aZ
+ 0: Z
+\= Expect no match
+    abc   
+No match
+
+/\p{Ll}/utf
+    a
+ 0: a
+    Az
+ 0: z
+\= Expect no match
+    ABC   
+No match
+
+/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/utf
+    A\x{391}\x{10427}\x{ff3a}\x{1fb0}
+ 0: A\x{391}\x{10427}\x{ff3a}\x{1fb0}
+\= Expect 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}/i,utf
+    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}+/i,utf
+    \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}(.)/i,utf
+    \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}?(.)/i,utf
+    \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}]/i,utf
+    \x{391}
+ 0: \x{391}
+    \x{ff3a}
+ 0: \x{ff3a}
+    \x{3b1}
+ 0: \x{3b1}
+    \x{ff5a}   
+ 0: \x{ff5a}
+    
+/^(\X*)C/utf
+    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/utf
+    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*)(.)/utf
+    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*?)(.)/utf
+    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(.)/utf
+\= Expect no match
+    A\x{300}\x{301}\x{302}
+No match
+
+/^\X{2,3}(.)/utf
+    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}?(.)/utf
+    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
+
+/^\X/utf
+    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}
+    \x{300}  
+ 0: \x{300}
+
+/^\p{Han}+/utf
+    \x{2e81}\x{3007}\x{2f804}\x{31a0}
+ 0: \x{2e81}\x{3007}\x{2f804}
+\= Expect no match
+    \x{2e7f}  
+No match
+
+/^\P{Katakana}+/utf
+    \x{3105}
+ 0: \x{3105}
+\= Expect no match
+    \x{30ff}  
+No match
+
+/^[\p{Arabic}]/utf
+    \x{06e9}
+ 0: \x{6e9}
+    \x{060b}
+ 0: \x{60b}
+\= Expect no match
+    X\x{06e9}   
+No match
+
+/^[\P{Yi}]/utf
+    \x{2f800}
+ 0: \x{2f800}
+\= Expect no match
+    \x{a014}
+No match
+    \x{a4c6}   
+No match
+    
+/^\p{Any}X/utf
+    AXYZ
+ 0: AX
+    \x{1234}XYZ 
+ 0: \x{1234}X
+\= Expect no match
+    X  
+No match
+    
+/^\P{Any}X/utf
+\= Expect no match
+    AX
+No match
+    
+/^\p{Any}?X/utf
+    XYZ
+ 0: X
+    AXYZ
+ 0: AX
+    \x{1234}XYZ 
+ 0: \x{1234}X
+\= Expect no match
+    ABXYZ   
+No match
+
+/^\P{Any}?X/utf
+    XYZ
+ 0: X
+\= Expect no match
+    AXYZ
+No match
+    \x{1234}XYZ 
+No match
+    ABXYZ   
+No match
+
+/^\p{Any}+X/utf
+    AXYZ
+ 0: AX
+    \x{1234}XYZ
+ 0: \x{1234}X
+    A\x{1234}XYZ
+ 0: A\x{1234}X
+\= Expect no match
+    XYZ
+No match
+
+/^\P{Any}+X/utf
+\= Expect no match
+    AXYZ
+No match
+    \x{1234}XYZ
+No match
+    A\x{1234}XYZ
+No match
+    XYZ
+No match
+
+/^\p{Any}*X/utf
+    XYZ
+ 0: X
+    AXYZ
+ 0: AX
+    \x{1234}XYZ
+ 0: \x{1234}X
+    A\x{1234}XYZ
+ 0: A\x{1234}X
+
+/^\P{Any}*X/utf
+    XYZ
+ 0: X
+\= Expect no match
+    AXYZ
+No match
+    \x{1234}XYZ
+No match
+    A\x{1234}XYZ
+No match
+
+/^[\p{Any}]X/utf
+    AXYZ
+ 0: AX
+    \x{1234}XYZ 
+ 0: \x{1234}X
+\= Expect no match
+    X  
+No match
+    
+/^[\P{Any}]X/utf
+\= Expect no match
+    AX
+No match
+    
+/^[\p{Any}]?X/utf
+    XYZ
+ 0: X
+    AXYZ
+ 0: AX
+    \x{1234}XYZ 
+ 0: \x{1234}X
+\= Expect no match
+    ABXYZ   
+No match
+
+/^[\P{Any}]?X/utf
+    XYZ
+ 0: X
+\= Expect no match
+    AXYZ
+No match
+    \x{1234}XYZ 
+No match
+    ABXYZ   
+No match
+
+/^[\p{Any}]+X/utf
+    AXYZ
+ 0: AX
+    \x{1234}XYZ
+ 0: \x{1234}X
+    A\x{1234}XYZ
+ 0: A\x{1234}X
+\= Expect no match
+    XYZ
+No match
+
+/^[\P{Any}]+X/utf
+\= Expect no match
+    AXYZ
+No match
+    \x{1234}XYZ
+No match
+    A\x{1234}XYZ
+No match
+    XYZ
+No match
+
+/^[\p{Any}]*X/utf
+    XYZ
+ 0: X
+    AXYZ
+ 0: AX
+    \x{1234}XYZ
+ 0: \x{1234}X
+    A\x{1234}XYZ
+ 0: A\x{1234}X
+
+/^[\P{Any}]*X/utf
+    XYZ
+ 0: X
+\= Expect no match
+    AXYZ
+No match
+    \x{1234}XYZ
+No match
+    A\x{1234}XYZ
+No match
+
+/^\p{Any}{3,5}?/utf
+    abcdefgh
+ 0: abc
+    \x{1234}\n\r\x{3456}xyz 
+ 0: \x{1234}\x{0a}\x{0d}
+
+/^\p{Any}{3,5}/utf
+    abcdefgh
+ 0: abcde
+    \x{1234}\n\r\x{3456}xyz 
+ 0: \x{1234}\x{0a}\x{0d}\x{3456}x
+
+/^\P{Any}{3,5}?/utf
+\= Expect no match
+    abcdefgh
+No match
+    \x{1234}\n\r\x{3456}xyz 
+No match
+
+/^\p{L&}X/utf
+     AXY
+ 0: AX
+     aXY
+ 0: aX
+     \x{1c5}XY
+ 0: \x{1c5}X
+\= Expect no match
+    \x{1bb}XY
+No match
+    \x{2b0}XY
+No match
+    !XY      
+No match
+
+/^[\p{L&}]X/utf
+    AXY
+ 0: AX
+    aXY
+ 0: aX
+     \x{1c5}XY
+ 0: \x{1c5}X
+\= Expect no match
+    \x{1bb}XY
+No match
+    \x{2b0}XY
+No match
+    !XY      
+No match
+
+/^\p{L&}+X/utf
+    AXY
+ 0: AX
+    aXY
+ 0: aX
+    AbcdeXyz 
+ 0: AbcdeX
+    \x{1c5}AbXY
+ 0: \x{1c5}AbX
+    abcDEXypqreXlmn 
+ 0: abcDEXypqreX
+\= Expect no match
+    \x{1bb}XY
+No match
+    \x{2b0}XY
+No match
+    !XY      
+No match
+
+/^[\p{L&}]+X/utf
+    AXY
+ 0: AX
+    aXY
+ 0: aX
+    AbcdeXyz 
+ 0: AbcdeX
+    \x{1c5}AbXY
+ 0: \x{1c5}AbX
+    abcDEXypqreXlmn 
+ 0: abcDEXypqreX
+\= Expect no match
+    \x{1bb}XY
+No match
+    \x{2b0}XY
+No match
+    !XY      
+No match
+
+/^\p{L&}+?X/utf
+    AXY
+ 0: AX
+    aXY
+ 0: aX
+    AbcdeXyz 
+ 0: AbcdeX
+    \x{1c5}AbXY
+ 0: \x{1c5}AbX
+    abcDEXypqreXlmn 
+ 0: abcDEX
+\= Expect no match
+    \x{1bb}XY
+No match
+    \x{2b0}XY
+No match
+    !XY      
+No match
+
+/^[\p{L&}]+?X/utf
+    AXY
+ 0: AX
+    aXY
+ 0: aX
+    AbcdeXyz 
+ 0: AbcdeX
+    \x{1c5}AbXY
+ 0: \x{1c5}AbX
+    abcDEXypqreXlmn 
+ 0: abcDEX
+\= Expect no match
+    \x{1bb}XY
+No match
+    \x{2b0}XY
+No match
+    !XY      
+No match
+
+/^\P{L&}X/utf
+    !XY
+ 0: !X
+    \x{1bb}XY
+ 0: \x{1bb}X
+    \x{2b0}XY
+ 0: \x{2b0}X
+\= Expect no match
+    \x{1c5}XY
+No match
+    AXY      
+No match
+
+/^[\P{L&}]X/utf
+    !XY
+ 0: !X
+    \x{1bb}XY
+ 0: \x{1bb}X
+    \x{2b0}XY
+ 0: \x{2b0}X
+\= Expect no match
+    \x{1c5}XY
+No match
+    AXY      
+No match
+
+/^(\p{Z}[^\p{C}\p{Z}]+)*$/
+    \xa0!
+ 0: \xa0!
+ 1: \xa0!
+
+/^[\pL](abc)(?1)/
+    AabcabcYZ    
+ 0: Aabcabc
+ 1: abc
+
+/([\pL]=(abc))*X/
+    L=abcX
+ 0: L=abcX
+ 1: L=abc
+ 2: abc
+
+/^\p{Balinese}\p{Cuneiform}\p{Nko}\p{Phags_Pa}\p{Phoenician}/utf
+    \x{1b00}\x{12000}\x{7c0}\x{a840}\x{10900}
+ 0: \x{1b00}\x{12000}\x{7c0}\x{a840}\x{10900}
+
+# Check property support in non-UTF mode
+ 
+/\p{L}{4}/
+    123abcdefg
+ 0: abcd
+    123abc\xc4\xc5zz
+ 0: abc\xc4
+
+/\X{1,3}\d/
+\= Expect no match
+    \x8aBCD
+No match
+  
+/\X?\d/
+\= Expect no match
+    \x8aBCD 
+No match
+
+/\P{L}?\d/
+\= Expect no match
+    \x8aBCD 
+No match
+
+/[\PPP\x8a]{1,}\x80/
+    A\x80
+ 0: A\x80
+
+/^[\p{Arabic}]/utf
+    \x{604}
+ 0: \x{604}
+    \x{60e} 
+ 0: \x{60e}
+    \x{656} 
+ 0: \x{656}
+    \x{657} 
+ 0: \x{657}
+    \x{658} 
+ 0: \x{658}
+    \x{659} 
+ 0: \x{659}
+    \x{65a} 
+ 0: \x{65a}
+    \x{65b} 
+ 0: \x{65b}
+    \x{65c} 
+ 0: \x{65c}
+    \x{65d} 
+ 0: \x{65d}
+    \x{65e} 
+ 0: \x{65e}
+    \x{65f}
+ 0: \x{65f}
+    \x{66a} 
+ 0: \x{66a}
+    \x{6e9} 
+ 0: \x{6e9}
+    \x{6ef}
+ 0: \x{6ef}
+    \x{6fa}  
+ 0: \x{6fa}
+\= Expect no match
+    \x{650}
+No match
+    \x{651}  
+No match
+    \x{652}  
+No match
+    \x{653}  
+No match
+    \x{654} 
+No match
+    \x{655} 
+No match
+    
+/^\p{Cyrillic}/utf
+    \x{1d2b} 
+ 0: \x{1d2b}
+    
+/^\p{Common}/utf
+    \x{589}
+ 0: \x{589}
+    \x{60c}
+ 0: \x{60c}
+    \x{61f}  
+ 0: \x{61f}
+    \x{964}
+ 0: \x{964}
+    \x{965}  
+ 0: \x{965}
+
+/^\p{Inherited}/utf
+    \x{64b}
+ 0: \x{64b}
+    \x{654}
+ 0: \x{654}
+    \x{655}
+ 0: \x{655}
+    \x{200c} 
+ 0: \x{200c}
+\= Expect no match
+    \x{64a}
+No match
+    \x{656}     
+No match
+
+/^\p{Shavian}/utf
+    \x{10450}
+ 0: \x{10450}
+    \x{1047f}
+ 0: \x{1047f}
+    
+/^\p{Deseret}/utf
+    \x{10400}
+ 0: \x{10400}
+    \x{1044f}
+ 0: \x{1044f}
+    
+/^\p{Osmanya}/utf
+    \x{10480}
+ 0: \x{10480}
+    \x{1049d}
+ 0: \x{1049d}
+    \x{104a0}
+ 0: \x{104a0}
+    \x{104a9}
+ 0: \x{104a9}
+\= Expect no match
+    \x{1049e}
+No match
+    \x{1049f}
+No match
+    \x{104aa}           
+No match
+
+/\p{Carian}\p{Cham}\p{Kayah_Li}\p{Lepcha}\p{Lycian}\p{Lydian}\p{Ol_Chiki}\p{Rejang}\p{Saurashtra}\p{Sundanese}\p{Vai}/utf
+    \x{102A4}\x{AA52}\x{A91D}\x{1C46}\x{10283}\x{1092E}\x{1C6B}\x{A93B}\x{A8BF}\x{1BA0}\x{A50A}====
+ 0: \x{102a4}\x{aa52}\x{a91d}\x{1c46}\x{10283}\x{1092e}\x{1c6b}\x{a93b}\x{a8bf}\x{1ba0}\x{a50a}
+
+/\x{a77d}\x{1d79}/i,utf
+    \x{a77d}\x{1d79}
+ 0: \x{a77d}\x{1d79}
+    \x{1d79}\x{a77d} 
+ 0: \x{1d79}\x{a77d}
+
+/\x{a77d}\x{1d79}/utf
+    \x{a77d}\x{1d79}
+ 0: \x{a77d}\x{1d79}
+\= Expect no match 
+    \x{1d79}\x{a77d} 
+No match
+
+/(A)\1/i,utf
+    AA
+ 0: AA
+ 1: A
+    Aa
+ 0: Aa
+ 1: A
+    aa
+ 0: aa
+ 1: a
+    aA
+ 0: aA
+ 1: a
+
+/(\x{10a})\1/i,utf
+    \x{10a}\x{10a}
+ 0: \x{10a}\x{10a}
+ 1: \x{10a}
+    \x{10a}\x{10b}
+ 0: \x{10a}\x{10b}
+ 1: \x{10a}
+    \x{10b}\x{10b}
+ 0: \x{10b}\x{10b}
+ 1: \x{10b}
+    \x{10b}\x{10a}
+ 0: \x{10b}\x{10a}
+ 1: \x{10b}
+    
+# The next two tests are for property support in non-UTF mode
+
+/(?:\p{Lu}|\x20)+/
+    \x41\x20\x50\xC2\x54\xC9\x20\x54\x4F\x44\x41\x59
+ 0: A P\xc2T\xc9 TODAY
+
+/[\p{Lu}\x20]+/
+    \x41\x20\x50\xC2\x54\xC9\x20\x54\x4F\x44\x41\x59
+ 0: A P\xc2T\xc9 TODAY
+
+/\p{Avestan}\p{Bamum}\p{Egyptian_Hieroglyphs}\p{Imperial_Aramaic}\p{Inscriptional_Pahlavi}\p{Inscriptional_Parthian}\p{Javanese}\p{Kaithi}\p{Lisu}\p{Meetei_Mayek}\p{Old_South_Arabian}\p{Old_Turkic}\p{Samaritan}\p{Tai_Tham}\p{Tai_Viet}/utf
+    \x{10b00}\x{a6ef}\x{13007}\x{10857}\x{10b78}\x{10b58}\x{a980}\x{110c1}\x{a4ff}\x{abc0}\x{10a7d}\x{10c48}\x{0800}\x{1aad}\x{aac0}
+ 0: \x{10b00}\x{a6ef}\x{13007}\x{10857}\x{10b78}\x{10b58}\x{a980}\x{110c1}\x{a4ff}\x{abc0}\x{10a7d}\x{10c48}\x{800}\x{1aad}\x{aac0}
+
+/^\w+/utf,ucp
+    Az_\x{aa}\x{c0}\x{1c5}\x{2b0}\x{3b6}\x{1d7c9}\x{2fa1d}1\x{660}\x{bef}\x{16ee}
+ 0: Az_\x{aa}\x{c0}\x{1c5}\x{2b0}\x{3b6}\x{1d7c9}\x{2fa1d}1\x{660}\x{bef}\x{16ee}
+
+/^[[:xdigit:]]*/utf,ucp
+    1a\x{660}\x{bef}\x{16ee}
+ 0: 1a
+  
+/^\d+/utf,ucp
+    1\x{660}\x{bef}\x{16ee}
+ 0: 1\x{660}\x{bef}
+  
+/^[[:digit:]]+/utf,ucp
+    1\x{660}\x{bef}\x{16ee}
+ 0: 1\x{660}\x{bef}
+
+/^>\s+/utf,ucp
+    >\x{20}\x{a0}\x{1680}\x{2028}\x{2029}\x{202f}\x{9}\x{b} 
+ 0: > \x{a0}\x{1680}\x{2028}\x{2029}\x{202f}\x{09}\x{0b}
+  
+/^>\pZ+/utf,ucp
+    >\x{20}\x{a0}\x{1680}\x{2028}\x{2029}\x{202f}\x{9}\x{b} 
+ 0: > \x{a0}\x{1680}\x{2028}\x{2029}\x{202f}
+  
+/^>[[:space:]]*/utf,ucp
+    >\x{20}\x{a0}\x{1680}\x{2028}\x{2029}\x{202f}\x{9}\x{b} 
+ 0: > \x{a0}\x{1680}\x{2028}\x{2029}\x{202f}\x{09}\x{0b}
+
+/^>[[:blank:]]*/utf,ucp
+    >\x{20}\x{a0}\x{1680}\x{2000}\x{202f}\x{9}\x{b}\x{2028} 
+ 0: > \x{a0}\x{1680}\x{2000}\x{202f}\x{09}
+
+/^[[:alpha:]]*/utf,ucp
+    Az\x{aa}\x{c0}\x{1c5}\x{2b0}\x{3b6}\x{1d7c9}\x{2fa1d}
+ 0: Az\x{aa}\x{c0}\x{1c5}\x{2b0}\x{3b6}\x{1d7c9}\x{2fa1d}
+
+/^[[:alnum:]]*/utf,ucp
+    Az\x{aa}\x{c0}\x{1c5}\x{2b0}\x{3b6}\x{1d7c9}\x{2fa1d}1\x{660}\x{bef}\x{16ee}
+ 0: Az\x{aa}\x{c0}\x{1c5}\x{2b0}\x{3b6}\x{1d7c9}\x{2fa1d}1\x{660}\x{bef}\x{16ee}
+
+/^[[:cntrl:]]*/utf,ucp
+    \x{0}\x{09}\x{1f}\x{7f}\x{9f} 
+ 0: \x{00}\x{09}\x{1f}\x{7f}\x{9f}
+
+/^[[:graph:]]*/utf,ucp
+    A\x{a1}\x{a0}
+ 0: A\x{a1}
+
+/^[[:print:]]*/utf,ucp
+    A z\x{a0}\x{a1}
+ 0: A z\x{a0}\x{a1}
+
+/^[[:punct:]]*/utf,ucp
+    .+\x{a1}\x{a0}
+ 0: .+\x{a1}
+
+/\p{Zs}*?\R/
+\= Expect no match
+    a\xFCb   
+No match
+
+/\p{Zs}*\R/
+\= Expect no match 
+    a\xFCb   
+No match
+
+/ⱥ/i,utf
+    ⱥ
+ 0: \x{2c65}
+    Ⱥx 
+ 0: \x{23a}
+    Ⱥ 
+ 0: \x{23a}
+
+/[ⱥ]/i,utf
+    ⱥ
+ 0: \x{2c65}
+    Ⱥx 
+ 0: \x{23a}
+    Ⱥ 
+ 0: \x{23a}
+
+/Ⱥ/i,utf
+    Ⱥ
+ 0: \x{23a}
+    ⱥ
+ 0: \x{2c65}
+    
+# These are tests for extended grapheme clusters  
+
+/^\X/utf,aftertext
+    G\x{34e}\x{34e}X
+ 0: G\x{34e}\x{34e}
+ 0+ X
+    \x{34e}\x{34e}X
+ 0: \x{34e}\x{34e}
+ 0+ X
+    \x04X
+ 0: \x{04}
+ 0+ X
+    \x{1100}X
+ 0: \x{1100}
+ 0+ X
+    \x{1100}\x{34e}X
+ 0: \x{1100}\x{34e}
+ 0+ X
+    \x{1b04}\x{1b04}X 
+ 0: \x{1b04}\x{1b04}
+ 0+ X
+    *These match up to the roman letters
+ 0: *
+ 0+ These match up to the roman letters
+    \x{1111}\x{1111}L,L
+ 0: \x{1111}\x{1111}
+ 0+ L,L
+    \x{1111}\x{1111}\x{1169}L,L,V
+ 0: \x{1111}\x{1111}\x{1169}
+ 0+ L,L,V
+    \x{1111}\x{ae4c}L, LV
+ 0: \x{1111}\x{ae4c}
+ 0+ L, LV
+    \x{1111}\x{ad89}L, LVT
+ 0: \x{1111}\x{ad89}
+ 0+ L, LVT
+    \x{1111}\x{ae4c}\x{1169}L, LV, V
+ 0: \x{1111}\x{ae4c}\x{1169}
+ 0+ L, LV, V
+    \x{1111}\x{ae4c}\x{1169}\x{1169}L, LV, V, V
+ 0: \x{1111}\x{ae4c}\x{1169}\x{1169}
+ 0+ L, LV, V, V
+    \x{1111}\x{ae4c}\x{1169}\x{11fe}L, LV, V, T
+ 0: \x{1111}\x{ae4c}\x{1169}\x{11fe}
+ 0+ L, LV, V, T
+    \x{1111}\x{ad89}\x{11fe}L, LVT, T
+ 0: \x{1111}\x{ad89}\x{11fe}
+ 0+ L, LVT, T
+    \x{1111}\x{ad89}\x{11fe}\x{11fe}L, LVT, T, T
+ 0: \x{1111}\x{ad89}\x{11fe}\x{11fe}
+ 0+ L, LVT, T, T
+    \x{ad89}\x{11fe}\x{11fe}LVT, T, T
+ 0: \x{ad89}\x{11fe}\x{11fe}
+ 0+ LVT, T, T
+    *These match just the first codepoint (invalid sequence)
+ 0: *
+ 0+ These match just the first codepoint (invalid sequence)
+    \x{1111}\x{11fe}L, T
+ 0: \x{1111}
+ 0+ \x{11fe}L, T
+    \x{ae4c}\x{1111}LV, L
+ 0: \x{ae4c}
+ 0+ \x{1111}LV, L
+    \x{ae4c}\x{ae4c}LV, LV
+ 0: \x{ae4c}
+ 0+ \x{ae4c}LV, LV
+    \x{ae4c}\x{ad89}LV, LVT
+ 0: \x{ae4c}
+ 0+ \x{ad89}LV, LVT
+    \x{1169}\x{1111}V, L
+ 0: \x{1169}
+ 0+ \x{1111}V, L
+    \x{1169}\x{ae4c}V, LV
+ 0: \x{1169}
+ 0+ \x{ae4c}V, LV
+    \x{1169}\x{ad89}V, LVT
+ 0: \x{1169}
+ 0+ \x{ad89}V, LVT
+    \x{ad89}\x{1111}LVT, L
+ 0: \x{ad89}
+ 0+ \x{1111}LVT, L
+    \x{ad89}\x{1169}LVT, V
+ 0: \x{ad89}
+ 0+ \x{1169}LVT, V
+    \x{ad89}\x{ae4c}LVT, LV
+ 0: \x{ad89}
+ 0+ \x{ae4c}LVT, LV
+    \x{ad89}\x{ad89}LVT, LVT
+ 0: \x{ad89}
+ 0+ \x{ad89}LVT, LVT
+    \x{11fe}\x{1111}T, L
+ 0: \x{11fe}
+ 0+ \x{1111}T, L
+    \x{11fe}\x{1169}T, V
+ 0: \x{11fe}
+ 0+ \x{1169}T, V
+    \x{11fe}\x{ae4c}T, LV
+ 0: \x{11fe}
+ 0+ \x{ae4c}T, LV
+    \x{11fe}\x{ad89}T, LVT
+ 0: \x{11fe}
+ 0+ \x{ad89}T, LVT
+    *Test extend and spacing mark
+ 0: *
+ 0+ Test extend and spacing mark
+    \x{1111}\x{ae4c}\x{0711}L, LV, extend
+ 0: \x{1111}\x{ae4c}\x{711}
+ 0+ L, LV, extend
+    \x{1111}\x{ae4c}\x{1b04}L, LV, spacing mark
+ 0: \x{1111}\x{ae4c}\x{1b04}
+ 0+ L, LV, spacing mark
+    \x{1111}\x{ae4c}\x{1b04}\x{0711}\x{1b04}L, LV, spacing mark, extend, spacing mark
+ 0: \x{1111}\x{ae4c}\x{1b04}\x{711}\x{1b04}
+ 0+ L, LV, spacing mark, extend, spacing mark
+    *Test CR, LF, and control
+ 0: *
+ 0+ Test CR, LF, and control
+    \x0d\x{0711}CR, extend
+ 0: \x{0d}
+ 0+ \x{711}CR, extend
+    \x0d\x{1b04}CR, spacingmark
+ 0: \x{0d}
+ 0+ \x{1b04}CR, spacingmark
+    \x0a\x{0711}LF, extend
+ 0: \x{0a}
+ 0+ \x{711}LF, extend
+    \x0a\x{1b04}LF, spacingmark
+ 0: \x{0a}
+ 0+ \x{1b04}LF, spacingmark
+    \x0b\x{0711}Control, extend
+ 0: \x{0b}
+ 0+ \x{711}Control, extend
+    \x09\x{1b04}Control, spacingmark
+ 0: \x{09}
+ 0+ \x{1b04}Control, spacingmark
+    *There are no Prepend characters, so we can't test Prepend, CR
+ 0: *
+ 0+ There are no Prepend characters, so we can't test Prepend, CR
+    
+/^(?>\X{2})X/utf,aftertext
+    \x{1111}\x{ae4c}\x{1111}\x{ae4c}X
+ 0: \x{1111}\x{ae4c}\x{1111}\x{ae4c}X
+ 0+ 
+    
+/^\X{2,4}X/utf,aftertext
+    \x{1111}\x{ae4c}\x{1111}\x{ae4c}X
+ 0: \x{1111}\x{ae4c}\x{1111}\x{ae4c}X
+ 0+ 
+    \x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}X
+ 0: \x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}X
+ 0+ 
+    \x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}X
+ 0: \x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}X
+ 0+ 
+
+/^\X{2,4}?X/utf,aftertext
+    \x{1111}\x{ae4c}\x{1111}\x{ae4c}X
+ 0: \x{1111}\x{ae4c}\x{1111}\x{ae4c}X
+ 0+ 
+    \x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}X
+ 0: \x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}X
+ 0+ 
+    \x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}X
+ 0: \x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}X
+ 0+ 
+
+/\X*Z/utf,no_start_optimize
+\= Expect no match
+    A\x{300}
+No match
+
+/\X*(.)/utf,no_start_optimize
+    A\x{1111}\x{ae4c}\x{1169}
+ 0: A\x{1111}
+ 1: \x{1111}
+
+# --------------------------------------------
+
+/\x{1e9e}+/i,utf
+    \x{1e9e}\x{00df}
+ 0: \x{1e9e}\x{df}
+
+/[z\x{1e9e}]+/i,utf
+    \x{1e9e}\x{00df}
+ 0: \x{1e9e}\x{df}
+
+/\x{00df}+/i,utf
+    \x{1e9e}\x{00df}
+ 0: \x{1e9e}\x{df}
+
+/[z\x{00df}]+/i,utf
+    \x{1e9e}\x{00df}
+ 0: \x{1e9e}\x{df}
+
+/\x{1f88}+/i,utf
+    \x{1f88}\x{1f80} 
+ 0: \x{1f88}\x{1f80}
+
+/[z\x{1f88}]+/i,utf
+    \x{1f88}\x{1f80} 
+ 0: \x{1f88}\x{1f80}
+    
+# Characters with more than one other case; test in classes 
+
+/[z\x{00b5}]+/i,utf
+    \x{00b5}\x{039c}\x{03bc}
+ 0: \x{b5}\x{39c}\x{3bc}
+
+/[z\x{039c}]+/i,utf
+    \x{00b5}\x{039c}\x{03bc}
+ 0: \x{b5}\x{39c}\x{3bc}
+
+/[z\x{03bc}]+/i,utf
+    \x{00b5}\x{039c}\x{03bc}
+ 0: \x{b5}\x{39c}\x{3bc}
+
+/[z\x{00c5}]+/i,utf
+    \x{00c5}\x{00e5}\x{212b}
+ 0: \x{c5}\x{e5}\x{212b}
+
+/[z\x{00e5}]+/i,utf
+    \x{00c5}\x{00e5}\x{212b}
+ 0: \x{c5}\x{e5}\x{212b}
+
+/[z\x{212b}]+/i,utf
+    \x{00c5}\x{00e5}\x{212b}
+ 0: \x{c5}\x{e5}\x{212b}
+
+/[z\x{01c4}]+/i,utf
+    \x{01c4}\x{01c5}\x{01c6}
+ 0: \x{1c4}\x{1c5}\x{1c6}
+
+/[z\x{01c5}]+/i,utf
+    \x{01c4}\x{01c5}\x{01c6}
+ 0: \x{1c4}\x{1c5}\x{1c6}
+
+/[z\x{01c6}]+/i,utf
+    \x{01c4}\x{01c5}\x{01c6}
+ 0: \x{1c4}\x{1c5}\x{1c6}
+
+/[z\x{01c7}]+/i,utf
+    \x{01c7}\x{01c8}\x{01c9}
+ 0: \x{1c7}\x{1c8}\x{1c9}
+
+/[z\x{01c8}]+/i,utf
+    \x{01c7}\x{01c8}\x{01c9}
+ 0: \x{1c7}\x{1c8}\x{1c9}
+
+/[z\x{01c9}]+/i,utf
+    \x{01c7}\x{01c8}\x{01c9}
+ 0: \x{1c7}\x{1c8}\x{1c9}
+
+/[z\x{01ca}]+/i,utf
+    \x{01ca}\x{01cb}\x{01cc}
+ 0: \x{1ca}\x{1cb}\x{1cc}
+
+/[z\x{01cb}]+/i,utf
+    \x{01ca}\x{01cb}\x{01cc}
+ 0: \x{1ca}\x{1cb}\x{1cc}
+
+/[z\x{01cc}]+/i,utf
+    \x{01ca}\x{01cb}\x{01cc}
+ 0: \x{1ca}\x{1cb}\x{1cc}
+
+/[z\x{01f1}]+/i,utf
+    \x{01f1}\x{01f2}\x{01f3}
+ 0: \x{1f1}\x{1f2}\x{1f3}
+
+/[z\x{01f2}]+/i,utf
+    \x{01f1}\x{01f2}\x{01f3}
+ 0: \x{1f1}\x{1f2}\x{1f3}
+
+/[z\x{01f3}]+/i,utf
+    \x{01f1}\x{01f2}\x{01f3}
+ 0: \x{1f1}\x{1f2}\x{1f3}
+
+/[z\x{0345}]+/i,utf
+    \x{0345}\x{0399}\x{03b9}\x{1fbe}
+ 0: \x{345}\x{399}\x{3b9}\x{1fbe}
+
+/[z\x{0399}]+/i,utf
+    \x{0345}\x{0399}\x{03b9}\x{1fbe}
+ 0: \x{345}\x{399}\x{3b9}\x{1fbe}
+
+/[z\x{03b9}]+/i,utf
+    \x{0345}\x{0399}\x{03b9}\x{1fbe}
+ 0: \x{345}\x{399}\x{3b9}\x{1fbe}
+
+/[z\x{1fbe}]+/i,utf
+    \x{0345}\x{0399}\x{03b9}\x{1fbe}
+ 0: \x{345}\x{399}\x{3b9}\x{1fbe}
+
+/[z\x{0392}]+/i,utf
+    \x{0392}\x{03b2}\x{03d0}
+ 0: \x{392}\x{3b2}\x{3d0}
+
+/[z\x{03b2}]+/i,utf
+    \x{0392}\x{03b2}\x{03d0}
+ 0: \x{392}\x{3b2}\x{3d0}
+
+/[z\x{03d0}]+/i,utf
+    \x{0392}\x{03b2}\x{03d0}
+ 0: \x{392}\x{3b2}\x{3d0}
+
+/[z\x{0395}]+/i,utf
+    \x{0395}\x{03b5}\x{03f5}
+ 0: \x{395}\x{3b5}\x{3f5}
+
+/[z\x{03b5}]+/i,utf
+    \x{0395}\x{03b5}\x{03f5}
+ 0: \x{395}\x{3b5}\x{3f5}
+
+/[z\x{03f5}]+/i,utf
+    \x{0395}\x{03b5}\x{03f5}
+ 0: \x{395}\x{3b5}\x{3f5}
+
+/[z\x{0398}]+/i,utf
+    \x{0398}\x{03b8}\x{03d1}\x{03f4}
+ 0: \x{398}\x{3b8}\x{3d1}\x{3f4}
+
+/[z\x{03b8}]+/i,utf
+    \x{0398}\x{03b8}\x{03d1}\x{03f4}
+ 0: \x{398}\x{3b8}\x{3d1}\x{3f4}
+
+/[z\x{03d1}]+/i,utf
+    \x{0398}\x{03b8}\x{03d1}\x{03f4}
+ 0: \x{398}\x{3b8}\x{3d1}\x{3f4}
+
+/[z\x{03f4}]+/i,utf
+    \x{0398}\x{03b8}\x{03d1}\x{03f4}
+ 0: \x{398}\x{3b8}\x{3d1}\x{3f4}
+
+/[z\x{039a}]+/i,utf
+    \x{039a}\x{03ba}\x{03f0}
+ 0: \x{39a}\x{3ba}\x{3f0}
+
+/[z\x{03ba}]+/i,utf
+    \x{039a}\x{03ba}\x{03f0}
+ 0: \x{39a}\x{3ba}\x{3f0}
+
+/[z\x{03f0}]+/i,utf
+    \x{039a}\x{03ba}\x{03f0}
+ 0: \x{39a}\x{3ba}\x{3f0}
+
+/[z\x{03a0}]+/i,utf
+    \x{03a0}\x{03c0}\x{03d6} 
+ 0: \x{3a0}\x{3c0}\x{3d6}
+
+/[z\x{03c0}]+/i,utf
+    \x{03a0}\x{03c0}\x{03d6} 
+ 0: \x{3a0}\x{3c0}\x{3d6}
+
+/[z\x{03d6}]+/i,utf
+    \x{03a0}\x{03c0}\x{03d6} 
+ 0: \x{3a0}\x{3c0}\x{3d6}
+
+/[z\x{03a1}]+/i,utf
+    \x{03a1}\x{03c1}\x{03f1}
+ 0: \x{3a1}\x{3c1}\x{3f1}
+
+/[z\x{03c1}]+/i,utf
+    \x{03a1}\x{03c1}\x{03f1}
+ 0: \x{3a1}\x{3c1}\x{3f1}
+
+/[z\x{03f1}]+/i,utf
+    \x{03a1}\x{03c1}\x{03f1}
+ 0: \x{3a1}\x{3c1}\x{3f1}
+
+/[z\x{03a3}]+/i,utf
+    \x{03A3}\x{03C2}\x{03C3}
+ 0: \x{3a3}\x{3c2}\x{3c3}
+
+/[z\x{03c2}]+/i,utf
+    \x{03A3}\x{03C2}\x{03C3}
+ 0: \x{3a3}\x{3c2}\x{3c3}
+
+/[z\x{03c3}]+/i,utf
+    \x{03A3}\x{03C2}\x{03C3}
+ 0: \x{3a3}\x{3c2}\x{3c3}
+
+/[z\x{03a6}]+/i,utf
+    \x{03a6}\x{03c6}\x{03d5} 
+ 0: \x{3a6}\x{3c6}\x{3d5}
+
+/[z\x{03c6}]+/i,utf
+    \x{03a6}\x{03c6}\x{03d5} 
+ 0: \x{3a6}\x{3c6}\x{3d5}
+
+/[z\x{03d5}]+/i,utf
+    \x{03a6}\x{03c6}\x{03d5} 
+ 0: \x{3a6}\x{3c6}\x{3d5}
+
+/[z\x{03c9}]+/i,utf
+    \x{03c9}\x{03a9}\x{2126}
+ 0: \x{3c9}\x{3a9}\x{2126}
+
+/[z\x{03a9}]+/i,utf
+    \x{03c9}\x{03a9}\x{2126}
+ 0: \x{3c9}\x{3a9}\x{2126}
+
+/[z\x{2126}]+/i,utf
+    \x{03c9}\x{03a9}\x{2126}
+ 0: \x{3c9}\x{3a9}\x{2126}
+
+/[z\x{1e60}]+/i,utf
+    \x{1e60}\x{1e61}\x{1e9b}
+ 0: \x{1e60}\x{1e61}\x{1e9b}
+
+/[z\x{1e61}]+/i,utf
+    \x{1e60}\x{1e61}\x{1e9b}
+ 0: \x{1e60}\x{1e61}\x{1e9b}
+
+/[z\x{1e9b}]+/i,utf
+    \x{1e60}\x{1e61}\x{1e9b}
+ 0: \x{1e60}\x{1e61}\x{1e9b}
+
+# Perl 5.12.4 gets these wrong, but 5.15.3 is OK 
+
+/[z\x{004b}]+/i,utf
+    \x{004b}\x{006b}\x{212a}
+ 0: Kk\x{212a}
+
+/[z\x{006b}]+/i,utf
+    \x{004b}\x{006b}\x{212a}
+ 0: Kk\x{212a}
+
+/[z\x{212a}]+/i,utf
+    \x{004b}\x{006b}\x{212a}
+ 0: Kk\x{212a}
+
+/[z\x{0053}]+/i,utf
+    \x{0053}\x{0073}\x{017f}
+ 0: Ss\x{17f}
+
+/[z\x{0073}]+/i,utf
+    \x{0053}\x{0073}\x{017f}
+ 0: Ss\x{17f}
+
+/[z\x{017f}]+/i,utf
+    \x{0053}\x{0073}\x{017f}
+ 0: Ss\x{17f}
+    
+# --------------------------------------  
+
+/(ΣΆΜΟΣ) \1/i,utf
+    ΣΆΜΟΣ ΣΆΜΟΣ
+ 0: \x{3a3}\x{386}\x{39c}\x{39f}\x{3a3} \x{3a3}\x{386}\x{39c}\x{39f}\x{3a3}
+ 1: \x{3a3}\x{386}\x{39c}\x{39f}\x{3a3}
+    ΣΆΜΟΣ σάμος
+ 0: \x{3a3}\x{386}\x{39c}\x{39f}\x{3a3} \x{3c3}\x{3ac}\x{3bc}\x{3bf}\x{3c2}
+ 1: \x{3a3}\x{386}\x{39c}\x{39f}\x{3a3}
+    σάμος σάμος
+ 0: \x{3c3}\x{3ac}\x{3bc}\x{3bf}\x{3c2} \x{3c3}\x{3ac}\x{3bc}\x{3bf}\x{3c2}
+ 1: \x{3c3}\x{3ac}\x{3bc}\x{3bf}\x{3c2}
+    σάμος σάμοσ
+ 0: \x{3c3}\x{3ac}\x{3bc}\x{3bf}\x{3c2} \x{3c3}\x{3ac}\x{3bc}\x{3bf}\x{3c3}
+ 1: \x{3c3}\x{3ac}\x{3bc}\x{3bf}\x{3c2}
+    σάμος ΣΆΜΟΣ  
+ 0: \x{3c3}\x{3ac}\x{3bc}\x{3bf}\x{3c2} \x{3a3}\x{386}\x{39c}\x{39f}\x{3a3}
+ 1: \x{3c3}\x{3ac}\x{3bc}\x{3bf}\x{3c2}
+
+/(σάμος) \1/i,utf
+    ΣΆΜΟΣ ΣΆΜΟΣ
+ 0: \x{3a3}\x{386}\x{39c}\x{39f}\x{3a3} \x{3a3}\x{386}\x{39c}\x{39f}\x{3a3}
+ 1: \x{3a3}\x{386}\x{39c}\x{39f}\x{3a3}
+    ΣΆΜΟΣ σάμος
+ 0: \x{3a3}\x{386}\x{39c}\x{39f}\x{3a3} \x{3c3}\x{3ac}\x{3bc}\x{3bf}\x{3c2}
+ 1: \x{3a3}\x{386}\x{39c}\x{39f}\x{3a3}
+    σάμος σάμος
+ 0: \x{3c3}\x{3ac}\x{3bc}\x{3bf}\x{3c2} \x{3c3}\x{3ac}\x{3bc}\x{3bf}\x{3c2}
+ 1: \x{3c3}\x{3ac}\x{3bc}\x{3bf}\x{3c2}
+    σάμος σάμοσ
+ 0: \x{3c3}\x{3ac}\x{3bc}\x{3bf}\x{3c2} \x{3c3}\x{3ac}\x{3bc}\x{3bf}\x{3c3}
+ 1: \x{3c3}\x{3ac}\x{3bc}\x{3bf}\x{3c2}
+    σάμος ΣΆΜΟΣ  
+ 0: \x{3c3}\x{3ac}\x{3bc}\x{3bf}\x{3c2} \x{3a3}\x{386}\x{39c}\x{39f}\x{3a3}
+ 1: \x{3c3}\x{3ac}\x{3bc}\x{3bf}\x{3c2}
+
+/(ΣΆΜΟΣ) \1*/i,utf
+    ΣΆΜΟΣ\x20
+ 0: \x{3a3}\x{386}\x{39c}\x{39f}\x{3a3} 
+ 1: \x{3a3}\x{386}\x{39c}\x{39f}\x{3a3}
+    ΣΆΜΟΣ ΣΆΜΟΣσάμοςσάμος
+ 0: \x{3a3}\x{386}\x{39c}\x{39f}\x{3a3} \x{3a3}\x{386}\x{39c}\x{39f}\x{3a3}\x{3c3}\x{3ac}\x{3bc}\x{3bf}\x{3c2}\x{3c3}\x{3ac}\x{3bc}\x{3bf}\x{3c2}
+ 1: \x{3a3}\x{386}\x{39c}\x{39f}\x{3a3}
+
+# Perl matches these 
+
+/\x{00b5}+/i,utf
+    \x{00b5}\x{039c}\x{03bc}
+ 0: \x{b5}\x{39c}\x{3bc}
+
+/\x{039c}+/i,utf
+    \x{00b5}\x{039c}\x{03bc}
+ 0: \x{b5}\x{39c}\x{3bc}
+
+/\x{03bc}+/i,utf
+    \x{00b5}\x{039c}\x{03bc}
+ 0: \x{b5}\x{39c}\x{3bc}
+
+
+/\x{00c5}+/i,utf
+    \x{00c5}\x{00e5}\x{212b}
+ 0: \x{c5}\x{e5}\x{212b}
+
+/\x{00e5}+/i,utf
+    \x{00c5}\x{00e5}\x{212b}
+ 0: \x{c5}\x{e5}\x{212b}
+
+/\x{212b}+/i,utf
+    \x{00c5}\x{00e5}\x{212b}
+ 0: \x{c5}\x{e5}\x{212b}
+
+
+/\x{01c4}+/i,utf
+    \x{01c4}\x{01c5}\x{01c6}
+ 0: \x{1c4}\x{1c5}\x{1c6}
+
+/\x{01c5}+/i,utf
+    \x{01c4}\x{01c5}\x{01c6}
+ 0: \x{1c4}\x{1c5}\x{1c6}
+
+/\x{01c6}+/i,utf
+    \x{01c4}\x{01c5}\x{01c6}
+ 0: \x{1c4}\x{1c5}\x{1c6}
+
+
+/\x{01c7}+/i,utf
+    \x{01c7}\x{01c8}\x{01c9}
+ 0: \x{1c7}\x{1c8}\x{1c9}
+
+/\x{01c8}+/i,utf
+    \x{01c7}\x{01c8}\x{01c9}
+ 0: \x{1c7}\x{1c8}\x{1c9}
+
+/\x{01c9}+/i,utf
+    \x{01c7}\x{01c8}\x{01c9}
+ 0: \x{1c7}\x{1c8}\x{1c9}
+
+
+/\x{01ca}+/i,utf
+    \x{01ca}\x{01cb}\x{01cc}
+ 0: \x{1ca}\x{1cb}\x{1cc}
+
+/\x{01cb}+/i,utf
+    \x{01ca}\x{01cb}\x{01cc}
+ 0: \x{1ca}\x{1cb}\x{1cc}
+
+/\x{01cc}+/i,utf
+    \x{01ca}\x{01cb}\x{01cc}
+ 0: \x{1ca}\x{1cb}\x{1cc}
+
+
+/\x{01f1}+/i,utf
+    \x{01f1}\x{01f2}\x{01f3}
+ 0: \x{1f1}\x{1f2}\x{1f3}
+
+/\x{01f2}+/i,utf
+    \x{01f1}\x{01f2}\x{01f3}
+ 0: \x{1f1}\x{1f2}\x{1f3}
+
+/\x{01f3}+/i,utf
+    \x{01f1}\x{01f2}\x{01f3}
+ 0: \x{1f1}\x{1f2}\x{1f3}
+
+
+/\x{0345}+/i,utf
+    \x{0345}\x{0399}\x{03b9}\x{1fbe}
+ 0: \x{345}\x{399}\x{3b9}\x{1fbe}
+
+/\x{0399}+/i,utf
+    \x{0345}\x{0399}\x{03b9}\x{1fbe}
+ 0: \x{345}\x{399}\x{3b9}\x{1fbe}
+
+/\x{03b9}+/i,utf
+    \x{0345}\x{0399}\x{03b9}\x{1fbe}
+ 0: \x{345}\x{399}\x{3b9}\x{1fbe}
+
+/\x{1fbe}+/i,utf
+    \x{0345}\x{0399}\x{03b9}\x{1fbe}
+ 0: \x{345}\x{399}\x{3b9}\x{1fbe}
+
+
+/\x{0392}+/i,utf
+    \x{0392}\x{03b2}\x{03d0}
+ 0: \x{392}\x{3b2}\x{3d0}
+
+/\x{03b2}+/i,utf
+    \x{0392}\x{03b2}\x{03d0}
+ 0: \x{392}\x{3b2}\x{3d0}
+
+/\x{03d0}+/i,utf
+    \x{0392}\x{03b2}\x{03d0}
+ 0: \x{392}\x{3b2}\x{3d0}
+    
+
+/\x{0395}+/i,utf
+    \x{0395}\x{03b5}\x{03f5}
+ 0: \x{395}\x{3b5}\x{3f5}
+
+/\x{03b5}+/i,utf
+    \x{0395}\x{03b5}\x{03f5}
+ 0: \x{395}\x{3b5}\x{3f5}
+
+/\x{03f5}+/i,utf
+    \x{0395}\x{03b5}\x{03f5}
+ 0: \x{395}\x{3b5}\x{3f5}
+
+
+/\x{0398}+/i,utf
+    \x{0398}\x{03b8}\x{03d1}\x{03f4}
+ 0: \x{398}\x{3b8}\x{3d1}\x{3f4}
+
+/\x{03b8}+/i,utf
+    \x{0398}\x{03b8}\x{03d1}\x{03f4}
+ 0: \x{398}\x{3b8}\x{3d1}\x{3f4}
+
+/\x{03d1}+/i,utf
+    \x{0398}\x{03b8}\x{03d1}\x{03f4}
+ 0: \x{398}\x{3b8}\x{3d1}\x{3f4}
+
+/\x{03f4}+/i,utf
+    \x{0398}\x{03b8}\x{03d1}\x{03f4}
+ 0: \x{398}\x{3b8}\x{3d1}\x{3f4}
+    
+
+/\x{039a}+/i,utf
+    \x{039a}\x{03ba}\x{03f0}
+ 0: \x{39a}\x{3ba}\x{3f0}
+
+/\x{03ba}+/i,utf
+    \x{039a}\x{03ba}\x{03f0}
+ 0: \x{39a}\x{3ba}\x{3f0}
+
+/\x{03f0}+/i,utf
+    \x{039a}\x{03ba}\x{03f0}
+ 0: \x{39a}\x{3ba}\x{3f0}
+    
+
+/\x{03a0}+/i,utf
+    \x{03a0}\x{03c0}\x{03d6} 
+ 0: \x{3a0}\x{3c0}\x{3d6}
+
+/\x{03c0}+/i,utf
+    \x{03a0}\x{03c0}\x{03d6} 
+ 0: \x{3a0}\x{3c0}\x{3d6}
+
+/\x{03d6}+/i,utf
+    \x{03a0}\x{03c0}\x{03d6} 
+ 0: \x{3a0}\x{3c0}\x{3d6}
+
+
+/\x{03a1}+/i,utf
+    \x{03a1}\x{03c1}\x{03f1}
+ 0: \x{3a1}\x{3c1}\x{3f1}
+
+/\x{03c1}+/i,utf
+    \x{03a1}\x{03c1}\x{03f1}
+ 0: \x{3a1}\x{3c1}\x{3f1}
+
+/\x{03f1}+/i,utf
+    \x{03a1}\x{03c1}\x{03f1}
+ 0: \x{3a1}\x{3c1}\x{3f1}
+
+
+/\x{03a3}+/i,utf
+    \x{03A3}\x{03C2}\x{03C3}
+ 0: \x{3a3}\x{3c2}\x{3c3}
+
+/\x{03c2}+/i,utf
+    \x{03A3}\x{03C2}\x{03C3}
+ 0: \x{3a3}\x{3c2}\x{3c3}
+
+/\x{03c3}+/i,utf
+    \x{03A3}\x{03C2}\x{03C3}
+ 0: \x{3a3}\x{3c2}\x{3c3}
+    
+
+/\x{03a6}+/i,utf
+    \x{03a6}\x{03c6}\x{03d5} 
+ 0: \x{3a6}\x{3c6}\x{3d5}
+
+/\x{03c6}+/i,utf
+    \x{03a6}\x{03c6}\x{03d5} 
+ 0: \x{3a6}\x{3c6}\x{3d5}
+
+/\x{03d5}+/i,utf
+    \x{03a6}\x{03c6}\x{03d5} 
+ 0: \x{3a6}\x{3c6}\x{3d5}
+
+
+/\x{03c9}+/i,utf
+    \x{03c9}\x{03a9}\x{2126}
+ 0: \x{3c9}\x{3a9}\x{2126}
+
+/\x{03a9}+/i,utf
+    \x{03c9}\x{03a9}\x{2126}
+ 0: \x{3c9}\x{3a9}\x{2126}
+
+/\x{2126}+/i,utf
+    \x{03c9}\x{03a9}\x{2126}
+ 0: \x{3c9}\x{3a9}\x{2126}
+    
+
+/\x{1e60}+/i,utf
+    \x{1e60}\x{1e61}\x{1e9b}
+ 0: \x{1e60}\x{1e61}\x{1e9b}
+
+/\x{1e61}+/i,utf
+    \x{1e60}\x{1e61}\x{1e9b}
+ 0: \x{1e60}\x{1e61}\x{1e9b}
+
+/\x{1e9b}+/i,utf
+    \x{1e60}\x{1e61}\x{1e9b}
+ 0: \x{1e60}\x{1e61}\x{1e9b}
+    
+
+/\x{1e9e}+/i,utf
+    \x{1e9e}\x{00df}
+ 0: \x{1e9e}\x{df}
+
+/\x{00df}+/i,utf
+    \x{1e9e}\x{00df}
+ 0: \x{1e9e}\x{df}
+    
+
+/\x{1f88}+/i,utf
+    \x{1f88}\x{1f80} 
+ 0: \x{1f88}\x{1f80}
+
+/\x{1f80}+/i,utf
+    \x{1f88}\x{1f80} 
+ 0: \x{1f88}\x{1f80}
+
+# Perl 5.12.4 gets these wrong, but 5.15.3 is OK 
+
+/\x{004b}+/i,utf
+    \x{004b}\x{006b}\x{212a}
+ 0: Kk\x{212a}
+
+/\x{006b}+/i,utf
+    \x{004b}\x{006b}\x{212a}
+ 0: Kk\x{212a}
+
+/\x{212a}+/i,utf
+    \x{004b}\x{006b}\x{212a}
+ 0: Kk\x{212a}
+
+
+/\x{0053}+/i,utf
+    \x{0053}\x{0073}\x{017f}
+ 0: Ss\x{17f}
+
+/\x{0073}+/i,utf
+    \x{0053}\x{0073}\x{017f}
+ 0: Ss\x{17f}
+
+/\x{017f}+/i,utf
+    \x{0053}\x{0073}\x{017f}
+ 0: Ss\x{17f}
+
+/^\p{Any}*\d{4}/utf
+    1234
+ 0: 1234
+\= Expect no match
+    123 
+No match
+
+/^\X*\w{4}/utf
+    1234
+ 0: 1234
+\= Expect no match
+    123  
+No match
+
+/^A\s+Z/utf,ucp
+    A\x{2005}Z
+ 0: A\x{2005}Z
+    A\x{85}\x{2005}Z
+ 0: A\x{85}\x{2005}Z
+
+/^A[\s]+Z/utf,ucp
+    A\x{2005}Z
+ 0: A\x{2005}Z
+    A\x{85}\x{2005}Z
+ 0: A\x{85}\x{2005}Z
+
+/^[[:graph:]]+$/utf,ucp
+    Letter:ABC
+ 0: Letter:ABC
+    Mark:\x{300}\x{1d172}\x{1d17b}
+ 0: Mark:\x{300}\x{1d172}\x{1d17b}
+    Number:9\x{660}
+ 0: Number:9\x{660}
+    Punctuation:\x{66a},;
+ 0: Punctuation:\x{66a},;
+    Symbol:\x{6de}<>\x{fffc}
+ 0: Symbol:\x{6de}<>\x{fffc}
+    Cf-property:\x{ad}\x{600}\x{601}\x{602}\x{603}\x{604}\x{6dd}\x{70f}
+ 0: Cf-property:\x{ad}\x{600}\x{601}\x{602}\x{603}\x{604}\x{6dd}\x{70f}
+    \x{200b}\x{200c}\x{200d}\x{200e}\x{200f}
+ 0: \x{200b}\x{200c}\x{200d}\x{200e}\x{200f}
+    \x{202a}\x{202b}\x{202c}\x{202d}\x{202e}
+ 0: \x{202a}\x{202b}\x{202c}\x{202d}\x{202e}
+    \x{2060}\x{2061}\x{2062}\x{2063}\x{2064}
+ 0: \x{2060}\x{2061}\x{2062}\x{2063}\x{2064}
+    \x{206a}\x{206b}\x{206c}\x{206d}\x{206e}\x{206f}
+ 0: \x{206a}\x{206b}\x{206c}\x{206d}\x{206e}\x{206f}
+    \x{feff}
+ 0: \x{feff}
+    \x{fff9}\x{fffa}\x{fffb}
+ 0: \x{fff9}\x{fffa}\x{fffb}
+    \x{110bd}
+ 0: \x{110bd}
+    \x{1d173}\x{1d174}\x{1d175}\x{1d176}\x{1d177}\x{1d178}\x{1d179}\x{1d17a}
+ 0: \x{1d173}\x{1d174}\x{1d175}\x{1d176}\x{1d177}\x{1d178}\x{1d179}\x{1d17a}
+    \x{e0001}
+ 0: \x{e0001}
+    \x{e0020}\x{e0030}\x{e0040}\x{e0050}\x{e0060}\x{e0070}\x{e007f}
+ 0: \x{e0020}\x{e0030}\x{e0040}\x{e0050}\x{e0060}\x{e0070}\x{e007f}
+\= Expect no match
+    \x{09}
+No match
+    \x{0a}
+No match
+    \x{1D}
+No match
+    \x{20}
+No match
+    \x{85}
+No match
+    \x{a0}
+No match
+    \x{1680}
+No match
+    \x{2028}
+No match
+    \x{2029}
+No match
+    \x{202f}
+No match
+    \x{2065}
+No match
+    \x{3000}
+No match
+    \x{e0002}
+No match
+    \x{e001f}
+No match
+    \x{e0080} 
+No match
+
+/^[[:print:]]+$/utf,ucp
+    Space: \x{a0}
+ 0: Space: \x{a0}
+    \x{1680}\x{2000}\x{2001}\x{2002}\x{2003}\x{2004}\x{2005}
+ 0: \x{1680}\x{2000}\x{2001}\x{2002}\x{2003}\x{2004}\x{2005}
+    \x{2006}\x{2007}\x{2008}\x{2009}\x{200a} 
+ 0: \x{2006}\x{2007}\x{2008}\x{2009}\x{200a}
+    \x{202f}\x{205f} 
+ 0: \x{202f}\x{205f}
+    \x{3000}
+ 0: \x{3000}
+    Letter:ABC
+ 0: Letter:ABC
+    Mark:\x{300}\x{1d172}\x{1d17b}
+ 0: Mark:\x{300}\x{1d172}\x{1d17b}
+    Number:9\x{660}
+ 0: Number:9\x{660}
+    Punctuation:\x{66a},;
+ 0: Punctuation:\x{66a},;
+    Symbol:\x{6de}<>\x{fffc}
+ 0: Symbol:\x{6de}<>\x{fffc}
+    Cf-property:\x{ad}\x{600}\x{601}\x{602}\x{603}\x{604}\x{6dd}\x{70f}
+ 0: Cf-property:\x{ad}\x{600}\x{601}\x{602}\x{603}\x{604}\x{6dd}\x{70f}
+    \x{200b}\x{200c}\x{200d}\x{200e}\x{200f}
+ 0: \x{200b}\x{200c}\x{200d}\x{200e}\x{200f}
+    \x{202a}\x{202b}\x{202c}\x{202d}\x{202e}
+ 0: \x{202a}\x{202b}\x{202c}\x{202d}\x{202e}
+    \x{202f}
+ 0: \x{202f}
+    \x{2060}\x{2061}\x{2062}\x{2063}\x{2064}
+ 0: \x{2060}\x{2061}\x{2062}\x{2063}\x{2064}
+    \x{206a}\x{206b}\x{206c}\x{206d}\x{206e}\x{206f}
+ 0: \x{206a}\x{206b}\x{206c}\x{206d}\x{206e}\x{206f}
+    \x{feff}
+ 0: \x{feff}
+    \x{fff9}\x{fffa}\x{fffb}
+ 0: \x{fff9}\x{fffa}\x{fffb}
+    \x{110bd}
+ 0: \x{110bd}
+    \x{1d173}\x{1d174}\x{1d175}\x{1d176}\x{1d177}\x{1d178}\x{1d179}\x{1d17a}
+ 0: \x{1d173}\x{1d174}\x{1d175}\x{1d176}\x{1d177}\x{1d178}\x{1d179}\x{1d17a}
+    \x{e0001}
+ 0: \x{e0001}
+    \x{e0020}\x{e0030}\x{e0040}\x{e0050}\x{e0060}\x{e0070}\x{e007f}
+ 0: \x{e0020}\x{e0030}\x{e0040}\x{e0050}\x{e0060}\x{e0070}\x{e007f}
+\= Expect no match
+    \x{09}
+No match
+    \x{1D}
+No match
+    \x{85}
+No match
+    \x{2028}
+No match
+    \x{2029}
+No match
+    \x{2065}
+No match
+    \x{e0002}
+No match
+    \x{e001f}
+No match
+    \x{e0080} 
+No match
+
+/^[[:punct:]]+$/utf,ucp
+    \$+<=>^`|~
+ 0: $+<=>^`|~
+    !\"#%&'()*,-./:;?@[\\]_{}
+ 0: !"#%&'()*,-./:;?@[\]_{}
+    \x{a1}\x{a7}  
+ 0: \x{a1}\x{a7}
+    \x{37e} 
+ 0: \x{37e}
+\= Expect no match
+    abcde  
+No match
+
+/^[[:^graph:]]+$/utf,ucp
+    \x{09}\x{0a}\x{1D}\x{20}\x{85}\x{a0}\x{1680}
+ 0: \x{09}\x{0a}\x{1d} \x{85}\x{a0}\x{1680}
+    \x{2028}\x{2029}\x{202f}\x{2065}
+ 0: \x{2028}\x{2029}\x{202f}\x{2065}
+    \x{3000}\x{e0002}\x{e001f}\x{e0080}
+ 0: \x{3000}\x{e0002}\x{e001f}\x{e0080}
+\= Expect no match
+    Letter:ABC
+No match
+    Mark:\x{300}\x{1d172}\x{1d17b}
+No match
+    Number:9\x{660}
+No match
+    Punctuation:\x{66a},;
+No match
+    Symbol:\x{6de}<>\x{fffc}
+No match
+    Cf-property:\x{ad}\x{600}\x{601}\x{602}\x{603}\x{604}\x{6dd}\x{70f}
+No match
+    \x{200b}\x{200c}\x{200d}\x{200e}\x{200f}
+No match
+    \x{202a}\x{202b}\x{202c}\x{202d}\x{202e}
+No match
+    \x{2060}\x{2061}\x{2062}\x{2063}\x{2064}
+No match
+    \x{206a}\x{206b}\x{206c}\x{206d}\x{206e}\x{206f}
+No match
+    \x{feff}
+No match
+    \x{fff9}\x{fffa}\x{fffb}
+No match
+    \x{110bd}
+No match
+    \x{1d173}\x{1d174}\x{1d175}\x{1d176}\x{1d177}\x{1d178}\x{1d179}\x{1d17a}
+No match
+    \x{e0001}
+No match
+    \x{e0020}\x{e0030}\x{e0040}\x{e0050}\x{e0060}\x{e0070}\x{e007f}
+No match
+
+/^[[:^print:]]+$/utf,ucp
+    \x{09}\x{1D}\x{85}\x{2028}\x{2029}\x{2065}
+ 0: \x{09}\x{1d}\x{85}\x{2028}\x{2029}\x{2065}
+    \x{e0002}\x{e001f}\x{e0080}
+ 0: \x{e0002}\x{e001f}\x{e0080}
+\= Expect no match
+    Space: \x{a0}
+No match
+    \x{1680}\x{2000}\x{2001}\x{2002}\x{2003}\x{2004}\x{2005}
+No match
+    \x{2006}\x{2007}\x{2008}\x{2009}\x{200a} 
+No match
+    \x{202f}\x{205f} 
+No match
+    \x{3000}
+No match
+    Letter:ABC
+No match
+    Mark:\x{300}\x{1d172}\x{1d17b}
+No match
+    Number:9\x{660}
+No match
+    Punctuation:\x{66a},;
+No match
+    Symbol:\x{6de}<>\x{fffc}
+No match
+    Cf-property:\x{ad}\x{600}\x{601}\x{602}\x{603}\x{604}\x{6dd}\x{70f}
+No match
+    \x{200b}\x{200c}\x{200d}\x{200e}\x{200f}
+No match
+    \x{202a}\x{202b}\x{202c}\x{202d}\x{202e}
+No match
+    \x{202f}
+No match
+    \x{2060}\x{2061}\x{2062}\x{2063}\x{2064}
+No match
+    \x{206a}\x{206b}\x{206c}\x{206d}\x{206e}\x{206f}
+No match
+    \x{feff}
+No match
+    \x{fff9}\x{fffa}\x{fffb}
+No match
+    \x{110bd}
+No match
+    \x{1d173}\x{1d174}\x{1d175}\x{1d176}\x{1d177}\x{1d178}\x{1d179}\x{1d17a}
+No match
+    \x{e0001}
+No match
+    \x{e0020}\x{e0030}\x{e0040}\x{e0050}\x{e0060}\x{e0070}\x{e007f}
+No match
+
+/^[[:^punct:]]+$/utf,ucp
+    abcde  
+ 0: abcde
+\= Expect no match
+    \$+<=>^`|~
+No match
+    !\"#%&'()*,-./:;?@[\\]_{}
+No match
+    \x{a1}\x{a7}  
+No match
+    \x{37e} 
+No match
+
+/[RST]+/i,utf,ucp
+    Ss\x{17f}
+ 0: Ss\x{17f}
+    
+/[R-T]+/i,utf,ucp
+    Ss\x{17f}
+ 0: Ss\x{17f}
+
+/[q-u]+/i,utf,ucp
+    Ss\x{17f}
+ 0: Ss\x{17f}
+
+/^s?c/im,utf
+    scat
+ 0: sc
+    
+# The next four tests are for repeated caseless back references when the 
+# code unit length of the matched text is different to that of the original
+# group in the UTF-8 case.
+
+/^(\x{23a})\1*(.)/i,utf
+    \x{23a}\x{23a}\x{23a}\x{23a}
+ 0: \x{23a}\x{23a}\x{23a}\x{23a}
+ 1: \x{23a}
+ 2: \x{23a}
+    \x{23a}\x{2c65}\x{2c65}\x{2c65}
+ 0: \x{23a}\x{2c65}\x{2c65}\x{2c65}
+ 1: \x{23a}
+ 2: \x{2c65}
+    \x{23a}\x{23a}\x{2c65}\x{23a}
+ 0: \x{23a}\x{23a}\x{2c65}\x{23a}
+ 1: \x{23a}
+ 2: \x{23a}
+
+/^(\x{23a})\1*(..)/i,utf
+    \x{23a}\x{2c65}\x{2c65}\x{2c65}
+ 0: \x{23a}\x{2c65}\x{2c65}\x{2c65}
+ 1: \x{23a}
+ 2: \x{2c65}\x{2c65}
+    \x{23a}\x{23a}\x{2c65}\x{23a}
+ 0: \x{23a}\x{23a}\x{2c65}\x{23a}
+ 1: \x{23a}
+ 2: \x{2c65}\x{23a}
+
+/^(\x{23a})\1*(...)/i,utf
+    \x{23a}\x{2c65}\x{2c65}\x{2c65}
+ 0: \x{23a}\x{2c65}\x{2c65}\x{2c65}
+ 1: \x{23a}
+ 2: \x{2c65}\x{2c65}\x{2c65}
+    \x{23a}\x{23a}\x{2c65}\x{23a}
+ 0: \x{23a}\x{23a}\x{2c65}\x{23a}
+ 1: \x{23a}
+ 2: \x{23a}\x{2c65}\x{23a}
+
+/^(\x{23a})\1*(....)/i,utf
+\= Expect no match
+    \x{23a}\x{2c65}\x{2c65}\x{2c65}
+No match
+    \x{23a}\x{23a}\x{2c65}\x{23a}
+No match
+
+/[A-`]/i,utf
+    abcdefghijklmno
+ 0: a
+
+"[\S\V\H]"utf
+
+/[^\p{Any}]*+x/utf
+    x
+ 0: x
+
+/[[:punct:]]/utf,ucp
+    \x{b4} 
+No match
+
+/[[:^ascii:]]/utf,ucp
+    \x{100}
+ 0: \x{100}
+    \x{200}
+ 0: \x{200}
+    \x{300}
+ 0: \x{300}
+    \x{37e}
+ 0: \x{37e}
+\= Expect no match     
+    aa
+No match
+    99
+No match
+    
+/[[:^ascii:]\w]/utf,ucp
+    aa
+ 0: a
+    99
+ 0: 9
+    gg
+ 0: g
+    \x{100}
+ 0: \x{100}
+    \x{200}
+ 0: \x{200}
+    \x{300}
+ 0: \x{300}
+    \x{37e}
+ 0: \x{37e}
+
+/[\w[:^ascii:]]/utf,ucp
+    aa
+ 0: a
+    99
+ 0: 9
+    gg
+ 0: g
+    \x{100}
+ 0: \x{100}
+    \x{200}
+ 0: \x{200}
+    \x{300}
+ 0: \x{300}
+    \x{37e}
+ 0: \x{37e}
+
+/[^[:ascii:]\W]/utf,ucp
+    \x{100}
+ 0: \x{100}
+    \x{200}
+ 0: \x{200}
+\= Expect no match     
+    aa
+No match
+    99
+No match
+    gg
+No match
+    \x{37e}
+No match
+
+/[^[:^ascii:]\d]/utf,ucp
+    a
+ 0: a
+    ~
+ 0: ~
+    \a
+ 0: \x{07}
+    \x{7f}
+ 0: \x{7f}
+\= Expect no match
+    0
+No match
+    \x{389}
+No match
+    \x{20ac}
+No match
+
+# End of testinput4
diff --git a/dist2/testdata/testoutput5 b/dist2/testdata/testoutput5
new file mode 100644
index 0000000..f19ad8c
--- /dev/null
+++ b/dist2/testdata/testoutput5
Binary files differ
diff --git a/dist/testdata/testoutput8 b/dist2/testdata/testoutput6
similarity index 83%
rename from dist/testdata/testoutput8
rename to dist2/testdata/testoutput6
index e4fa497..9ae092b 100644
--- a/dist/testdata/testoutput8
+++ b/dist2/testdata/testoutput6
@@ -1,8 +1,10 @@
-/-- This set of tests check the DFA matching functionality of pcre_dfa_exec(),
-    excluding UTF and Unicode property support. The -dfa flag must be used with
-    pcretest when running it. --/
+# This set of tests check the DFA matching functionality of pcre2_dfa_match(),
+# excluding UTF and Unicode property support. All matches are done using DFA,
+# forced by setting a default subject modifier at the start.
     
-< forbid 8W 
+#forbid_utf
+#subject dfa
+#newline_default lf anycrlf any
      
 /abc/
     abc
@@ -21,18 +23,18 @@
  0: abc
     abbbbbbc
  0: abbbbbbc
-    *** Failers 
-No match
+\= Expect no match 
     ac
 No match
     ab
 No match
     
-/a*/O
+/a*/no_auto_possess
     a
  0: a
  1: 
     aaaaaaaaaaaaaaaaa
+Matched, but offsets vector is too small to show all matches
  0: aaaaaaaaaaaaaaaaa
  1: aaaaaaaaaaaaaaaa
  2: aaaaaaaaaaaaaaa
@@ -48,10 +50,7 @@
 12: aaaaa
 13: aaaa
 14: aaa
-15: aa
-16: a
-17: 
-    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 
+    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\=ovector=10 
 Matched, but offsets vector is too small to show all matches
  0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
  1: aaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -63,19 +62,7 @@
  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 
+    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\=dfa_shortest
  0: 
     
 /(a|abcd|african)/
@@ -91,8 +78,7 @@
 /^abc/
     abcdef
  0: abc
-    *** Failers
-No match
+\= Expect no match
     xyzabc
 No match
     xyz\nabc    
@@ -103,16 +89,14 @@
  0: abc
     xyz\nabc    
  0: abc
-    *** Failers
-No match
+\= Expect no match
     xyzabc
 No match
     
 /\Aabc/
     abcdef
  0: abc
-    *** Failers
-No match
+\= Expect no match
     xyzabc
 No match
     xyz\nabc    
@@ -121,8 +105,7 @@
 /\Aabc/m
     abcdef
  0: abc
-    *** Failers
-No match
+\= Expect no match
     xyzabc
 No match
     xyz\nabc    
@@ -131,13 +114,12 @@
 /\Gabc/
     abcdef
  0: abc
-    xyzabc\>3
+    xyzabc\=offset=3
  0: abc
-    *** Failers
-No match
+\= Expect no match
     xyzabc    
 No match
-    xyzabc\>2 
+    xyzabc\=offset=2
 No match
     
 /x\dy\Dz/
@@ -145,8 +127,7 @@
  0: x9yzz
     x0y+z
  0: x0y+z
-    *** Failers
-No match
+\= Expect no match
     xyz
 No match
     xxy0z     
@@ -157,8 +138,7 @@
  0: x yzz
     x y+z
  0: x y+z
-    *** Failers
-No match
+\= Expect no match
     xyz
 No match
     xxyyz
@@ -167,8 +147,7 @@
 /x\wy\Wz/
     xxy+z
  0: xxy+z
-    *** Failers
-No match
+\= Expect no match
     xxy0z
 No match
     x+y+z         
@@ -179,8 +158,7 @@
  0: x+y
     x-y
  0: x-y
-    *** Failers
-No match
+\= Expect no match
     x\ny
 No match
     
@@ -199,8 +177,7 @@
  0: a+bc\x0adp+q
     x\nyp+q 
  0: x\x0ayp+q
-    *** Failers 
-No match
+\= Expect no match 
     a\nbc\ndp+q
 No match
     a+bc\ndp\nq
@@ -211,8 +188,7 @@
 /a\d\z/
     ba0
  0: a0
-    *** Failers
-No match
+\= Expect no match
     ba0\n
 No match
     ba0\ncd   
@@ -221,8 +197,7 @@
 /a\d\z/m
     ba0
  0: a0
-    *** Failers
-No match
+\= Expect no match
     ba0\n
 No match
     ba0\ncd   
@@ -233,8 +208,7 @@
  0: a0
     ba0\n
  0: a0
-    *** Failers
-No match
+\= Expect no match
     ba0\ncd   
 No match
 
@@ -243,8 +217,7 @@
  0: a0
     ba0\n
  0: a0
-    *** Failers
-No match
+\= Expect no match
     ba0\ncd   
 No match
 
@@ -253,8 +226,7 @@
  0: a0
     ba0\n
  0: a0
-    *** Failers
-No match
+\= Expect no match
     ba0\ncd   
 No match
 
@@ -265,8 +237,6 @@
  0: a0
     ba0\ncd   
  0: a0
-    *** Failers
-No match
 
 /abc/i
     abc
@@ -301,8 +271,7 @@
  0: xxxyz
     axxxxyzq
  0: xxxyz
-    *** Failers
-No match
+\= Expect no match
     ax
 No match
     axx     
@@ -313,8 +282,7 @@
  0: xxxyz
     axxxxyzq
  0: xxxyz
-    *** Failers
-No match
+\= Expect no match
     ax
 No match
     axx     
@@ -333,8 +301,7 @@
  0: xxxyz
     axxxxyzq
  0: xxxyz
-    *** Failers
-No match
+\= Expect no match
     ax
 No match
     axx     
@@ -344,7 +311,7 @@
     axyzq
 No match
       
-/[^a]+/O
+/[^a]+/no_auto_possess
     bac
  0: b
     bcdefax
@@ -353,16 +320,11 @@
  2: bcd
  3: bc
  4: b
-    *** Failers
- 0: *** F
- 1: *** 
- 2: ***
- 3: **
- 4: *
+\= Expect no match
     aaaaa   
 No match
 
-/[^a]*/O
+/[^a]*/no_auto_possess
     bac
  0: b
  1: 
@@ -373,17 +335,10 @@
  3: bc
  4: b
  5: 
-    *** Failers
- 0: *** F
- 1: *** 
- 2: ***
- 3: **
- 4: *
- 5: 
     aaaaa   
  0: 
     
-/[^a]{3,5}/O
+/[^a]{3,5}/no_auto_possess
     xyz
  0: xyz
     awxyza
@@ -397,10 +352,7 @@
  0: bcdef
  1: bcde
  2: bcd
-    *** Failers
- 0: *** F
- 1: *** 
- 2: ***
+\= Expect no match
     axya
 No match
     axa
@@ -423,16 +375,14 @@
 /\d+/
     ab1234c56
  0: 1234
-    *** Failers
-No match
+\= Expect no match
     xyz
 No match
     
 /\D+/
     ab123c56
  0: ab
-    *** Failers
- 0: *** Failers
+\= Expect no match
     789
 No match
     
@@ -441,8 +391,7 @@
  0: 5A
     ABC
  0: A
-    *** Failers
-No match
+\= Expect no match
     XYZ
 No match
     
@@ -453,8 +402,6 @@
  0: BA
     9ABC             
  0: A
-    *** Failers
-No match
 
 /a+/
     aaaa
@@ -471,8 +418,7 @@
  0: abcdxyz
     axyz
  0: axyz
-    *** Failers
-No match
+\= Expect no match
     xyz
 No match
     
@@ -487,8 +433,7 @@
  0: 12X
     123X
  0: 123X
-    *** Failers
-No match
+\= Expect no match
     X
 No match
     1X
@@ -505,8 +450,7 @@
  0: c9
     d04
  0: d0
-    *** Failers
-No match
+\= Expect no match
     e45
 No match
     abcd      
@@ -529,8 +473,7 @@
  0: abcd1
     1234  
  0: 1
-    *** Failers
-No match
+\= Expect no match
     e45
 No match
     abcd      
@@ -547,8 +490,7 @@
  0: d0
     abcd1234
  0: abcd1
-    *** Failers
-No match
+\= Expect no match
     1234  
 No match
     e45
@@ -573,8 +515,7 @@
  0: d0
     1234  
  0: 1
-    *** Failers
-No match
+\= Expect no match
     abcd1234
 No match
     e45
@@ -585,8 +526,7 @@
  0: ab4
     bcd93
  0: bcd9
-    *** Failers
-No match
+\= Expect no match
     1234 
 No match
     a36 
@@ -603,16 +543,13 @@
  0: abcabcabc4
     42xyz 
  0: 4
-    *** Failers
-No match
 
 /^(abc)+\d/
     abc45
  0: abc4
     abcabcabc45
  0: abcabcabc4
-    *** Failers
-No match
+\= Expect no match
     42xyz 
 No match
 
@@ -621,8 +558,7 @@
  0: abc4
     42xyz 
  0: 4
-    *** Failers
-No match
+\= Expect no match
     abcabcabc45
 No match
 
@@ -631,8 +567,7 @@
  0: abcabc4
     abcabcabc45
  0: abcabcabc4
-    *** Failers
-No match
+\= Expect no match
     abcabcabcabc45
 No match
     abc45
@@ -663,8 +598,7 @@
  0: a(b)c
     a(b(c))d  
  0: a(b(c))d
-    *** Failers)
-No match
+\= Expect no match)
     a(b(c)d  
 No match
 
@@ -679,8 +613,7 @@
 /^(?>a*)\d/
     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9876
  0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9
-    *** Failers 
-No match
+\= Expect no match 
     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
 No match
 
@@ -697,40 +630,36 @@
  0: <abc<>def>
     <abc<>      
  0: <>
-    *** Failers
-No match
+\= Expect no match
     <abc
 No match
 
-/^(?(?=abc)\w{3}:|\d\d)$/        
+/^(?(?=abc)\w{3}:|\d\d)$/
     abc:                          
  0: abc:
     12                             
  0: 12
-    *** Failers                     
-No match
+\= Expect no match                     
     123                       
 No match
     xyz                        
 No match
                                 
-/^(?(?!abc)\d\d|\w{3}:)$/      
+/^(?(?!abc)\d\d|\w{3}:)$/
     abc:                        
  0: abc:
     12         
  0: 12
-    *** Failers
-No match
+\= Expect no match
     123
 No match
     xyz    
 No match
 
-/^(?=abc)\w{5}:$/        
+/^(?=abc)\w{5}:$/
     abcde:                          
  0: abcde:
-    *** Failers                     
-No match
+\= Expect no match                     
     abc.. 
 No match
     123                       
@@ -738,11 +667,10 @@
     vwxyz                        
 No match
                                 
-/^(?!abc)\d\d$/      
+/^(?!abc)\d\d$/
     12         
  0: 12
-    *** Failers
-No match
+\= Expect no match
     abcde:
 No match
     abc..  
@@ -757,8 +685,7 @@
  0: 123
     wxy123z
  0: 123
-    *** Failers
-No match
+\= Expect no match
     123abc
 No match
 
@@ -767,8 +694,7 @@
  0: 123
     mno123456 
  0: 123
-    *** Failers
-No match
+\= Expect no match
     abc12345
 No match
     wxy123z
@@ -784,7 +710,7 @@
   1    ^  ^          x
  0: abcxyz
 
-/(ab|cd){3,4}/C
+/(ab|cd){3,4}/auto_callout
   ababab
 --->ababab
  +0 ^          (ab|cd){3,4}
@@ -854,9 +780,8 @@
 /^abc/
     abcdef
  0: abc
-    *** Failers
-No match
-    abcdef\B  
+\= Expect no match
+    abcdef\=notbol
 No match
 
 /^(a*|xyz)/
@@ -867,11 +792,10 @@
     xyz
  0: xyz
  1: 
-    xyz\N  
+    xyz\=notempty
  0: xyz
-    *** Failers
- 0: 
-    bcd\N   
+\= Expect no match
+    bcd\=notempty
 No match
     
 /xyz$/
@@ -879,11 +803,10 @@
  0: xyz
     xyz\n
  0: xyz
-    *** Failers
+\= Expect no match
+    xyz\=noteol
 No match
-    xyz\Z
-No match
-    xyz\n\Z    
+    xyz\n\=noteol
 No match
     
 /xyz$/m
@@ -893,119 +816,100 @@
  0: xyz
     abcxyz\npqr 
  0: xyz
-    abcxyz\npqr\Z 
+    abcxyz\npqr\=noteol
  0: xyz
-    xyz\n\Z    
+    xyz\n\=noteol
  0: xyz
-    *** Failers
-No match
-    xyz\Z
+\= Expect no match
+    xyz\=noteol
 No match
 
 /\Gabc/
     abcdef
  0: abc
-    defabcxyz\>3 
+    defabcxyz\=offset=3
  0: abc
-    *** Failers 
-No match
+\= Expect no match 
     defabcxyz
 No match
 
 /^abcdef/
-    ab\P
+    ab\=ps
 Partial match: ab
-    abcde\P
+    abcde\=ps
 Partial match: abcde
-    abcdef\P
+    abcdef\=ps
  0: abcdef
-    *** Failers
-No match
-    abx\P    
+\= Expect no match
+    abx\=ps
 No match
 
 /^a{2,4}\d+z/
-    a\P
+    a\=ps
 Partial match: a
-    aa\P
+    aa\=ps
 Partial match: aa
-    aa2\P 
+    aa2\=ps
 Partial match: aa2
-    aaa\P
+    aaa\=ps
 Partial match: aaa
-    aaa23\P 
+    aaa23\=ps
 Partial match: aaa23
-    aaaa12345\P
+    aaaa12345\=ps
 Partial match: aaaa12345
-    aa0z\P
+    aa0z\=ps
  0: aa0z
-    aaaa4444444444444z\P 
+    aaaa4444444444444z\=ps
  0: aaaa4444444444444z
-    *** Failers
+\= Expect no match
+    az\=ps
 No match
-    az\P 
+    aaaaa\=ps
 No match
-    aaaaa\P 
-No match
-    a56\P 
+    a56\=ps
 No match
 
 /^abcdef/
-   abc\P
+   abc\=ps
 Partial match: abc
-   def\R 
+   def\=dfa_restart
  0: def
    
 /(?<=foo)bar/
-   xyzfo\P 
-No match
-   foob\P\>2 
-Partial match at offset 3: foob
-   foobar...\R\P\>4 
+   foob\=ps,offset=2
+Partial match: foob
+               <<<
+   foobar...\=ps,dfa_restart,offset=4
  0: ar
-   xyzfo\P
-No match
-   foobar\>2  
+   foobar\=offset=2
  0: bar
-   *** Failers
+\= Expect no match
+   xyzfo\=ps
 No match
-   xyzfo\P
-No match
-   obar\R   
+   obar\=dfa_restart
 No match
 
 /(ab*(cd|ef))+X/
-    adfadadaklhlkalkajhlkjahdfasdfasdfladsfjkj\P\Z
-No match
-    lkjhlkjhlkjhlkjhabbbbbbcdaefabbbbbbbefa\P\B\Z
+    lkjhlkjhlkjhlkjhabbbbbbcdaefabbbbbbbefa\=ps,notbol,noteol
 Partial match: abbbbbbcdaefabbbbbbbefa
-    cdabbbbbbbb\P\R\B\Z
+    cdabbbbbbbb\=ps,notbol,dfa_restart,noteol
 Partial match: cdabbbbbbbb
-    efabbbbbbbbbbbbbbbb\P\R\B\Z
+    efabbbbbbbbbbbbbbbb\=ps,notbol,dfa_restart,noteol
 Partial match: efabbbbbbbbbbbbbbbb
-    bbbbbbbbbbbbcdXyasdfadf\P\R\B\Z    
+    bbbbbbbbbbbbcdXyasdfadf\=ps,notbol,dfa_restart,noteol
  0: bbbbbbbbbbbbcdX
-
-/(a|b)/SF>testsavedregex
-Compiled pattern written to testsavedregex
-Study data written to testsavedregex
-<testsavedregex
-Compiled pattern (byte-inverted) loaded from testsavedregex
-Study data loaded from testsavedregex
-    abc
- 0: a
-    ** Failers
- 0: a
-    def  
+\= Expect no match
+    adfadadaklhlkalkajhlkjahdfasdfasdfladsfjkj\=ps,noteol
 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
+\= Expect no match
+    The quick brown FOX
+No match
     What do you know about THE QUICK BROWN FOX?
 No match
 
@@ -1084,8 +988,7 @@
  0: aaaabxyzpqrrrabbxyyyypqAzz
     >>>>abcxyzpqrrrabbxyyyypqAzz
  0: abcxyzpqrrrabbxyyyypqAzz
-    *** Failers
-No match
+\= Expect no match
     abxyzpqrrabbxyyyypqAzz
 No match
     abxyzpqrrrrabbxyyyypqAzz
@@ -1104,8 +1007,7 @@
  0: abczz
     abcabczz
  0: abcabczz
-    *** Failers
-No match
+\= Expect no match
     zz
 No match
     abcabcabczz
@@ -1130,8 +1032,7 @@
  0: abbbbbbbbbbbc
     bbbbbbbbbbbac
  0: bbbbbbbbbbbac
-    *** Failers
-No match
+\= Expect no match
     aaac
 No match
     abbbbbbbbbbbac
@@ -1154,8 +1055,7 @@
  0: abbbbbbbbbbbc
     bbbbbbbbbbbac
  0: bbbbbbbbbbbac
-    *** Failers
-No match
+\= Expect no match
     aaac
 No match
     abbbbbbbbbbbac
@@ -1172,8 +1072,7 @@
  0: bbabc
     bababc
  0: bababc
-    *** Failers
-No match
+\= Expect no match
     bababbc
 No match
     babababc
@@ -1186,8 +1085,7 @@
  0: bbabc
     bababc
  0: bababc
-    *** Failers
-No match
+\= Expect no match
     bababbc
 No match
     babababc
@@ -1210,8 +1108,7 @@
  0: d
     ething
  0: e
-    *** Failers
-No match
+\= Expect no match
     fthing
 No match
     [thing
@@ -1228,8 +1125,7 @@
  0: d
     ething
  0: e
-    *** Failers
-No match
+\= Expect no match
     athing
 No match
     fthing
@@ -1242,8 +1138,7 @@
  0: [
     \\thing
  0: \
-    *** Failers
- 0: *
+\= Expect no match
     athing
 No match
     bthing
@@ -1262,8 +1157,7 @@
  0: a
     fthing
  0: f
-    *** Failers
- 0: *
+\= Expect no match
     ]thing
 No match
     cthing
@@ -1306,8 +1200,7 @@
  0: 10
     100
  0: 100
-    *** Failers
-No match
+\= Expect no match
     abc
 No match
 
@@ -1324,8 +1217,7 @@
  0: xxx0
     xxx1234
  0: xxx1234
-    *** Failers
-No match
+\= Expect no match
     xxx
 No match
 
@@ -1336,12 +1228,11 @@
  0: xx123
     123456
  0: 123456
-    *** Failers
-No match
-    123
-No match
     x1234
  0: x1234
+\= Expect no match
+    123
+No match
 
 /^.+?[0-9][0-9][0-9]$/
     x123
@@ -1350,18 +1241,16 @@
  0: xx123
     123456
  0: 123456
-    *** Failers
-No match
-    123
-No match
     x1234
  0: x1234
+\= Expect no match
+    123
+No match
 
 /^([^!]+)!(.+)=apquxz\.ixr\.zzz\.ac\.uk$/
     abc!pqr=apquxz.ixr.zzz.ac.uk
  0: abc!pqr=apquxz.ixr.zzz.ac.uk
-    *** Failers
-No match
+\= Expect no match
     !pqr=apquxz.ixr.zzz.ac.uk
 No match
     abc!=apquxz.ixr.zzz.ac.uk
@@ -1374,7 +1263,8 @@
 /:/
     Well, we need a colon: somewhere
  0: :
-    *** Fail if we don't
+\= Expect no match
+    No match without a colon
 No match
 
 /([\da-f:]+)$/i
@@ -1394,8 +1284,7 @@
  0: def
     Any old stuff
  0: ff
-    *** Failers
-No match
+\= Expect no match
     0zzz
 No match
     gzzz
@@ -1410,8 +1299,7 @@
  0: .1.2.3
     A.12.123.0
  0: A.12.123.0
-    *** Failers
-No match
+\= Expect no match
     .1.2.3333
 No match
     1.2.3
@@ -1424,8 +1312,7 @@
  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
+\= Expect no match
     1IN SOA non-sp1 non-sp2(
 No match
 
@@ -1442,8 +1329,7 @@
  0: sxk.zzz.ac.uk.
     x-.y-.
  0: x-.y-.
-    *** Failers
-No match
+\= Expect no match
     -abc.peq.
 No match
 
@@ -1456,8 +1342,7 @@
  0: *.c3-b.c
     *.c-a.b-c
  0: *.c-a.b-c
-    *** Failers
-No match
+\= Expect no match
     *.0
 No match
     *.a-
@@ -1494,22 +1379,18 @@
  0: "abcd" ;
     \"\" ; rhubarb
  0: "" ; rhubarb
-    *** Failers
-No match
+\= Expect 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
+\= Expect no match
     abc
 No match
     ab cde
@@ -1518,8 +1399,7 @@
 /(?x)   ^    a   (?# begins with a)  b\sc (?# then b c) $ (?# then end)/
     ab c
  0: ab c
-    *** Failers
-No match
+\= Expect no match
     abc
 No match
     ab cde
@@ -1530,8 +1410,7 @@
  0: a bcd
     a b d
  0: a b d
-    *** Failers
-No match
+\= Expect no match
     abcd
 No match
     ab d
@@ -1646,8 +1525,7 @@
  0: 12345678ab
     12345678__
  0: 12345678__
-    *** Failers
-No match
+\= Expect no match
     1234567
 No match
 
@@ -1660,8 +1538,7 @@
  0: 12345
     aaaaa
  0: aaaaa
-    *** Failers
-No match
+\= Expect no match
     123456
 No match
 
@@ -1689,8 +1566,7 @@
  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
+\= Expect no match
     From abcd  Sep 01 12:33:02 1997
 No match
 
@@ -1721,8 +1597,7 @@
 /^(\D*)(?=\d)(?!123)/
     abc456
  0: abc
-    *** Failers
-No match
+\= Expect no match
     abc123
 No match
 
@@ -1748,20 +1623,18 @@
 /(?!^)abc/
     the abc
  0: abc
-    *** Failers
-No match
+\= Expect no match
     abc
 No match
 
 /(?=^)abc/
     abc
  0: abc
-    *** Failers
-No match
+\= Expect no match
     the abc
 No match
 
-/^[ab]{1,3}(ab*|b)/O
+/^[ab]{1,3}(ab*|b)/no_auto_possess
     aabbbbb
  0: aabbbbb
  1: aabbbb
@@ -1770,7 +1643,7 @@
  4: aab
  5: aa
 
-/^[ab]{1,3}?(ab*|b)/O
+/^[ab]{1,3}?(ab*|b)/no_auto_possess
     aabbbbb
  0: aabbbbb
  1: aabbbb
@@ -1779,7 +1652,7 @@
  4: aab
  5: aa
 
-/^[ab]{1,3}?(ab*?|b)/O
+/^[ab]{1,3}?(ab*?|b)/no_auto_possess
     aabbbbb
  0: aabbbbb
  1: aabbbb
@@ -1788,7 +1661,7 @@
  4: aab
  5: aa
 
-/^[ab]{1,3}(ab*?|b)/O
+/^[ab]{1,3}(ab*?|b)/no_auto_possess
     aabbbbb
  0: aabbbbb
  1: aabbbb
@@ -2013,8 +1886,7 @@
     A missing angle <user\@some.where
  0: user@some.where
  1: user@some
-    *** Failers
-No match
+\= Expect no match
     The quick brown fox
 No match
 
@@ -2618,8 +2490,7 @@
     A missing angle <user\@some.where
  0: user@some.where
  1: user@some
-    *** Failers
-No match
+\= Expect no match
     The quick brown fox
 No match
 
@@ -2652,8 +2523,7 @@
  0: A\x00\x00Z
     An A\0\x0\0Z
  0: A\x00\x00\x00Z
-    *** Failers
-No match
+\= Expect no match
     A\0Z
 No match
     A\0\x0\0\x0Z
@@ -2670,8 +2540,7 @@
  0: \x0d
     \tabc
  0: \x09
-    *** Failers
-No match
+\= Expect no match
     abc
 No match
 
@@ -2687,8 +2556,7 @@
  0: abbbc
     abbc
  0: abbc
-    *** Failers
-No match
+\= Expect no match
     abc
 No match
     abbbbbc
@@ -2709,8 +2577,7 @@
 /^[W-c]+$/
     WXY_^abc
  0: WXY_^abc
-    *** Failers
-No match
+\= Expect no match
     wxy
 No match
 
@@ -2739,8 +2606,7 @@
 /^abc$/
     abc
  0: abc
-    *** Failers
-No match
+\= Expect no match
     qqq\nabc
 No match
     abc\nzzz
@@ -2753,8 +2619,7 @@
  0: abc
     abc\n 
  0: abc
-    *** Failers
-No match
+\= Expect no match
     qqq\nabc
 No match
     abc\nzzz
@@ -2767,8 +2632,7 @@
  0: abc\x0adef
 
 /\A(.)*\Z/m
-    *** Failers
- 0: *** Failers
+\= Expect no match
     abc\ndef
 No match
 
@@ -2781,24 +2645,21 @@
 /[-az]+/
     az-
  0: az-
-    *** Failers
- 0: a
+\= Expect no match
     b
 No match
 
 /[az-]+/
     za-
  0: za-
-    *** Failers
- 0: a
+\= Expect no match
     b
 No match
 
 /[a\-z]+/
     a-z
  0: a-z
-    *** Failers
- 0: a
+\= Expect no match
     b
 No match
 
@@ -2809,16 +2670,14 @@
 /[\d-]+/
     12-34
  0: 12-34
-    *** Failers
-No match
+\= Expect no match
     aaa
 No match
 
 /[\d-z]+/
     12-34z
  0: 12-34z
-    *** Failers
-No match
+\= Expect no match
     aaa
 No match
 
@@ -2829,8 +2688,7 @@
 /\x20Z/
     the Zoo
  0:  Z
-    *** Failers
-No match
+\= Expect no match
     Zulu
 No match
 
@@ -2850,11 +2708,10 @@
     {4,5a}bc
  0: {4,5a}bc
 
-/^a.b/<lf>
+/^a.b/newline=lf
     a\rb
  0: a\x0db
-    *** Failers
-No match
+\= Expect no match
     a\nb
 No match
 
@@ -2863,8 +2720,7 @@
  0: abc
     abc\n
  0: abc
-    *** Failers
-No match
+\= Expect no match
     abc\ndef
 No match
 
@@ -2900,30 +2756,10 @@
     abc\100\60
  0: abc@0
 
-/^A\8B\9C$/
-    A8B9C
- 0: A8B9C
-    *** Failers
-No match
-    A\08B\09C  
-No match
-    
-/^[A\8B\9C]+$/
-    A8B9C
- 0: A8B9C
-    *** Failers 
-No match
-    A8B9C\x00
-No match
-    
 /(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\12\123/
     abcdefghijk\12S
  0: abcdefghijk\x0aS
 
-/ab\idef/
-    abidef
- 0: abidef
-
 /a{0}bc/
     bc
  0: bc
@@ -2963,13 +2799,7 @@
  1: baNOTc
     bacccd
  0: baccc
-    *** Failers
- 0: *** Failers
- 1: *** Failer
- 2: *** Faile
- 3: *** Fail
- 4: *** Fai
- 5: *** Fa
+\= Expect no match
     anything
 No match
     b\bc   
@@ -3000,8 +2830,7 @@
 /[^k]$/
     abc
  0: c
-    *** Failers
- 0: s
+\= Expect no match
     abk   
 No match
    
@@ -3012,8 +2841,7 @@
  0: bc
     kabc 
  0: abc
-    *** Failers
- 0: ers
+\= Expect no match
     abk
 No match
     akb
@@ -3026,8 +2854,7 @@
  0: 12345678@a.b.c.d
     123456789\@x.y.z
  0: 123456789@x.y.z
-    *** Failers
-No match
+\= Expect no match
     12345678\@x.y.uk
 No match
     1234567\@a.b.c.d       
@@ -3083,8 +2910,7 @@
  1: .23
     1.875000282
  0: .875
-    *** Failers 
-No match
+\= Expect no match 
     1.235 
 No match
     
@@ -3101,12 +2927,12 @@
  0: food is under the bar in the bar
  1: food is under the bar
     
-/foo(.*?)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*)/O
+/(.*)(\d*)/no_auto_possess
     I have 2 numbers: 53147
 Matched, but offsets vector is too small to show all matches
  0: I have 2 numbers: 53147
@@ -3124,20 +2950,13 @@
 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
  
-/(.*?)(\d*)/O
+/(.*?)(\d*)/no_auto_possess
     I have 2 numbers: 53147
 Matched, but offsets vector is too small to show all matches
  0: I have 2 numbers: 53147
@@ -3155,13 +2974,6 @@
 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
@@ -3193,8 +3005,7 @@
 /^(\D*)(?=\d)(?!123)/
     ABC445
  0: ABC
-    *** Failers
-No match
+\= Expect no match
     ABC123
 No match
     
@@ -3203,8 +3014,7 @@
  0: W46]
     -46]789
  0: -46]
-    *** Failers
-No match
+\= Expect no match
     Wall
 No match
     Zebra
@@ -3233,8 +3043,7 @@
  0: ]
     \\backslash 
  0: \
-    *** Failers
-No match
+\= Expect no match
     -46]789
 No match
     well
@@ -3247,10 +3056,12 @@
 /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
+\= Expect no match
   word cat dog elephant mussel cow horse canary baboon snake shark
 No match
 
 /word (?:[a-zA-Z0-9]+ ){0,300}otherword/
+\= Expect no match
   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
 
@@ -3326,25 +3137,25 @@
  8: 
 
 /^(a){1,1}/
-    bcd
-No match
     abc
  0: a
     aab  
  0: a
-
-/^(a){1,2}/
+\= Expect no match
     bcd
 No match
+
+/^(a){1,2}/
     abc
  0: a
     aab  
  0: aa
  1: a
-
-/^(a){1,3}/
+\= Expect no match
     bcd
 No match
+
+/^(a){1,3}/
     abc
  0: a
     aab
@@ -3354,10 +3165,11 @@
  0: aaa
  1: aa
  2: a
-
-/^(a){1,}/
+\= Expect no match
     bcd
 No match
+
+/^(a){1,}/
     abc
  0: a
     aab
@@ -3376,6 +3188,9 @@
  5: aaa
  6: aa
  7: a
+\= Expect no match
+    bcd
+No match
 
 /.*\.gif/
     borfle\nbib.gif\nno
@@ -3440,8 +3255,7 @@
  0: 1234X
     BarFoo 
  0: B
-    *** Failers
-No match
+\= Expect no match
     abcde\nBar  
 No match
 
@@ -3458,8 +3272,7 @@
  0: abcde\x0a1234X
     BarFoo 
  0: B
-    *** Failers
-No match
+\= Expect no match
     abcde\nBar  
 No match
 
@@ -3476,8 +3289,7 @@
  0: abcde\x0a1234X
     BarFoo 
  0: B
-    *** Failers 
-No match
+\= Expect no match 
     abcde\nBar  
 No match
 
@@ -3486,14 +3298,12 @@
  0: abcde\x0a1234X
     BarFoo 
  0: B
-    *** Failers 
-No match
+\= Expect no match 
     abcde\nBar  
 No match
 
 /^.*B/
-    **** Failers
-No match
+\= Expect no match
     abc\nB
 No match
      
@@ -3544,32 +3354,28 @@
 /^[abcdefghijklmnopqrstuvwxy0123456789]/
     n
  0: n
-    *** Failers 
-No match
+\= Expect no match 
     z 
 No match
 
 /abcde{0,0}/
     abcd
  0: abcd
-    *** Failers
-No match
+\= Expect no match
     abce  
 No match
 
 /ab[cd]{0,0}e/
     abe
  0: abe
-    *** Failers
-No match
+\= Expect no match
     abcde 
 No match
     
 /ab(c){0,0}d/
     abd
  0: abd
-    *** Failers
-No match
+\= Expect no match
     abcd   
 No match
 
@@ -3580,16 +3386,14 @@
  0: ab
     abbbb
  0: abbbb
-    *** Failers
- 0: a
+\= Expect no match
     bbbbb    
 No match
     
 /ab\d{0}e/
     abe
  0: abe
-    *** Failers
-No match
+\= Expect no match
     ab1e   
 No match
     
@@ -3599,7 +3403,7 @@
     \"the \\\"quick\\\" brown fox\" 
  0: "the \"quick\" brown fox"
 
-/.*?/g+
+/.*?/g,aftertext
     abc
  0: abc
  0+ 
@@ -3609,14 +3413,14 @@
  0: 
  0+ 
   
-/\b/g+
+/\b/g,aftertext
     abc 
  0: 
  0+ abc
  0: 
  0+ 
 
-/\b/+g
+/\b/g,aftertext
     abc 
  0: 
  0+ abc
@@ -3643,8 +3447,7 @@
 /a.b/
     acb
  0: acb
-    *** Failers 
-No match
+\= Expect no match 
     a\nb   
 No match
     
@@ -3685,10 +3488,11 @@
  0: bbbbbac
     
 /(?!\A)x/m
-    x\nb\n
-No match
     a\bx\n  
  0: x
+\= Expect no match
+    x\nb\n
+No match
     
 /\x0{ab}/
     \0{ab} 
@@ -3711,8 +3515,7 @@
  0: foo
     rfoosh
  0: foo
-    *** Failers
-No match
+\= Expect no match
     barfoo
 No match
     towbarfoo
@@ -3721,8 +3524,7 @@
 /\w{3}(?<!bar)foo/
     catfood
  0: catfoo
-    *** Failers
-No match
+\= Expect no match
     foo
 No match
     barfoo
@@ -3733,8 +3535,7 @@
 /(?<=(foo)a)bar/
     fooabar
  0: bar
-    *** Failers
-No match
+\= Expect no match
     bar
 No match
     foobbar
@@ -3743,8 +3544,7 @@
 /\Aabc\z/m
     abc
  0: abc
-    *** Failers
-No match
+\= Expect no match
     abc\n   
 No match
     qqq\nabc
@@ -3755,6 +3555,7 @@
 No match
 
 "(?>.*/)foo"
+\= Expect no match
     /this/is/a/very/long/line/in/deed/with/very/many/slashes/in/it/you/see/
 No match
 
@@ -3767,16 +3568,14 @@
  0: .230003938
     1.875000282
  0: .875000282
-    *** Failers 
-No match
+\= Expect 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
+\= Expect no match
     this is not a line with only words and spaces!
 No match
     
@@ -3796,8 +3595,7 @@
 /((?>\d+))(\w)/
     12345a
  0: 12345a
-    *** Failers
-No match
+\= Expect no match
     12345+ 
 No match
 
@@ -3840,13 +3638,12 @@
  4: abc(ade)
  5: abc
     
-/\(((?>[^()]+)|\([^()]+\))+\)/ 
+/\(((?>[^()]+)|\([^()]+\))+\)/
     (abc)
  0: (abc)
     (abc(def)xyz)
  0: (abc(def)xyz)
-    *** Failers
-No match
+\= Expect no match
     ((()aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa   
 No match
 
@@ -3855,8 +3652,7 @@
  0: ab
     Ab
  0: Ab
-    *** Failers 
-No match
+\= Expect no match 
     aB
 No match
     AB
@@ -3865,8 +3661,7 @@
 /(a (?x)b c)d e/
     a bcd e
  0: a bcd e
-    *** Failers
-No match
+\= Expect no match
     a b cd e
 No match
     abcd e   
@@ -3877,8 +3672,7 @@
 /(a b(?x)c d (?-x)e f)/
     a bcde f
  0: a bcde f
-    *** Failers
-No match
+\= Expect no match
     abcdef  
 No match
 
@@ -3887,8 +3681,7 @@
  0: abc
     aBc
  0: aBc
-    *** Failers
-No match
+\= Expect no match
     abC
 No match
     aBC  
@@ -3907,8 +3700,7 @@
  0: abc
     aBc
  0: aBc
-    *** Failers 
-No match
+\= Expect no match 
     ABC
 No match
     abC
@@ -3921,8 +3713,7 @@
  0: aBc
     aBBc
  0: aBBc
-    *** Failers 
-No match
+\= Expect no match 
     aBC
 No match
     aBBC
@@ -3933,8 +3724,7 @@
  0: abcd
     abCd
  0: abCd
-    *** Failers
-No match
+\= Expect no match
     aBCd
 No match
     abcD     
@@ -3947,8 +3737,7 @@
  0: more than MILLION
     more \n than Million 
  0: more \x0a than Million
-    *** Failers
-No match
+\= Expect no match
     MORE THAN MILLION    
 No match
     more \n than \n million 
@@ -3961,22 +3750,20 @@
  0: more than MILLION
     more \n than Million 
  0: more \x0a than Million
-    *** Failers
-No match
+\= Expect no match
     MORE THAN MILLION    
 No match
     more \n than \n million 
 No match
     
-/(?>a(?i)b+)+c/ 
+/(?>a(?i)b+)+c/
     abc
  0: abc
     aBbc
  0: aBbc
     aBBc 
  0: aBBc
-    *** Failers
-No match
+\= Expect no match
     Abc
 No match
     abAb    
@@ -3989,8 +3776,7 @@
  0: abc
     aBc
  0: aBc
-    *** Failers
-No match
+\= Expect no match
     Ab 
 No match
     abC
@@ -4003,8 +3789,7 @@
  0: xxc
     aBxxc
  0: xxc
-    *** Failers
-No match
+\= Expect no match
     Abxxc
 No match
     ABxxc
@@ -4017,8 +3802,7 @@
  0: abc:
     12
  0: 12
-    *** Failers
-No match
+\= Expect no match
     123
 No match
     xyz    
@@ -4029,8 +3813,7 @@
  0: abc:
     12
  0: 12
-    *** Failers
-No match
+\= Expect no match
     123
 No match
     xyz    
@@ -4045,8 +3828,7 @@
  0: cat
     focat   
  0: cat
-    *** Failers
-No match
+\= Expect no match
     foocat  
 No match
 
@@ -4059,8 +3841,7 @@
  0: cat
     focat   
  0: cat
-    *** Failers
-No match
+\= Expect no match
     foocat  
 No match
 
@@ -4241,8 +4022,7 @@
  0: 12-sep-98
     12-09-98
  0: 12-09-98
-    *** Failers
-No match
+\= Expect no match
     sep-12-98
 No match
         
@@ -4271,8 +4051,7 @@
  0: bbx
     BBx
  0: BBx
-    *** Failers
-No match
+\= Expect no match
     abcX
 No match
     aBCX
@@ -4297,8 +4076,7 @@
  0: f
     France
  0: F
-    *** Failers
-No match
+\= Expect no match
     Africa     
 No match
 
@@ -4315,8 +4093,7 @@
  0: z
     Zambesi
  0: Z
-    *** Failers
-No match
+\= Expect no match
     aCD  
 No match
     XY  
@@ -4325,8 +4102,7 @@
 /(?<=foo\n)^bar/m
     foo\nbar
  0: bar
-    *** Failers
-No match
+\= Expect no match
     bar
 No match
     baz\nbar   
@@ -4339,16 +4115,14 @@
  0: baz
     koobarbaz 
  0: baz
-    *** Failers
-No match
+\= Expect 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
+# 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
@@ -4357,8 +4131,7 @@
  0: abc
     ababc
  0: abc
-    *** Failers
-No match
+\= Expect no match
     xbc
 No match
     axc
@@ -4393,8 +4166,7 @@
 /ab+bc/
     abbc
  0: abbc
-    *** Failers
-No match
+\= Expect no match
     abc
 No match
     abq
@@ -4417,8 +4189,7 @@
  0: abbbbc
 
 /ab{4,5}bc/
-    *** Failers
-No match
+\= Expect no match
     abq
 No match
     abbbbc
@@ -4447,8 +4218,7 @@
 /^abc$/
     abc
  0: abc
-    *** Failers
-No match
+\= Expect no match
     abbbbc
 No match
     abcc
@@ -4463,10 +4233,9 @@
 /abc$/
     aabc
  0: abc
-    *** Failers
-No match
     aabc
  0: abc
+\= Expect no match
     aabcd
 No match
 
@@ -4491,8 +4260,7 @@
 /a[bc]d/
     abd
  0: abd
-    *** Failers
-No match
+\= Expect no match
     axyzd
 No match
     abc
@@ -4525,8 +4293,7 @@
 /a[^bc]d/
     aed
  0: aed
-    *** Failers
-No match
+\= Expect no match
     abd
 No match
     abd
@@ -4539,10 +4306,9 @@
 /a[^]b]c/
     adc
  0: adc
-    *** Failers
-No match
     a-c
  0: a-c
+\= Expect no match
     a]c
 No match
 
@@ -4555,8 +4321,7 @@
  0: a
 
 /\by\b/
-    *** Failers
-No match
+\= Expect no match
     xy
 No match
     yz
@@ -4565,8 +4330,7 @@
 No match
 
 /\Ba\B/
-    *** Failers
- 0: a
+\= Expect no match
     a-
 No match
     -a
@@ -4593,10 +4357,7 @@
 /\W/
     -
  0: -
-    *** Failers
- 0: *
-    -
- 0: -
+\= Expect no match
     a
 No match
 
@@ -4607,10 +4368,7 @@
 /a\Sb/
     a-b
  0: a-b
-    *** Failers
-No match
-    a-b
- 0: a-b
+\= Expect no match
     a b
 No match
 
@@ -4621,10 +4379,7 @@
 /\D/
     -
  0: -
-    *** Failers
- 0: *
-    -
- 0: -
+\= Expect no match
     1
 No match
 
@@ -4635,10 +4390,7 @@
 /[\W]/
     -
  0: -
-    *** Failers
- 0: *
-    -
- 0: -
+\= Expect no match
     a
 No match
 
@@ -4649,10 +4401,7 @@
 /a[\S]b/
     a-b
  0: a-b
-    *** Failers
-No match
-    a-b
- 0: a-b
+\= Expect no match
     a b
 No match
 
@@ -4663,10 +4412,7 @@
 /[\D]/
     -
  0: -
-    *** Failers
- 0: *
-    -
- 0: -
+\= Expect no match
     1
 No match
 
@@ -4693,6 +4439,9 @@
  0: a((b
 
 /a\\b/
+    a\\b
+ 0: a\b
+\= Expect no match
     a\b
 No match
 
@@ -4754,14 +4503,11 @@
  0: cde
 
 /abc/
-    *** Failers
-No match
+\= Expect no match
     b
 No match
-    
 
 /a*/
-    
 
 /([abc])*d/
     abbbcd
@@ -4833,8 +4579,7 @@
  0: adcdcde
 
 /a[bcd]+dcdcde/
-    *** Failers
-No match
+\= Expect no match
     abcde
 No match
     adcdcde
@@ -4863,8 +4608,7 @@
  0: ij
     reffgz
  0: effgz
-    *** Failers
-No match
+\= Expect no match
     effg
 No match
     bcdd
@@ -4879,8 +4623,7 @@
  0: a
 
 /multiple words of text/
-    *** Failers
-No match
+\= Expect no match
     aa
 No match
     uh-uh
@@ -4919,8 +4662,7 @@
  0: ABC
     ABABC
  0: ABC
-    *** Failers
-No match
+\= Expect no match
     aaxabxbaxbbx
 No match
     XBC
@@ -4953,8 +4695,7 @@
  0: ABBC
 
 /ab+bc/i
-    *** Failers
-No match
+\= Expect no match
     ABC
 No match
     ABQ
@@ -4979,8 +4720,7 @@
  0: ABBBBC
 
 /ab{4,5}?bc/i
-    *** Failers
-No match
+\= Expect no match
     ABQ
 No match
     ABBBBC
@@ -5009,8 +4749,7 @@
 /^abc$/i
     ABC
  0: ABC
-    *** Failers
-No match
+\= Expect no match
     ABBBBC
 No match
     ABCC
@@ -5045,10 +4784,9 @@
  0: AXYZC
 
 /a.*c/i
-    *** Failers
-No match
     AABC
  0: AABC
+\= Expect no match
     AXYZD
 No match
 
@@ -5059,8 +4797,7 @@
 /a[b-d]e/i
     ACE
  0: ACE
-    *** Failers
-No match
+\= Expect no match
     ABC
 No match
     ABD
@@ -5093,8 +4830,7 @@
 /a[^-b]c/i
     ADC
  0: ADC
-    *** Failers
-No match
+\= Expect no match
     ABD
 No match
     A-C
@@ -5115,8 +4851,7 @@
  0: EF
 
 /$b/i
-    *** Failers
-No match
+\= Expect no match
     A]C
 No match
     B
@@ -5133,7 +4868,8 @@
  0: A((B
 
 /a\\b/i
-    A\B
+\= Expect no match
+    A\=notbol
 No match
 
 /((a))/i
@@ -5211,7 +4947,6 @@
 /abc/i
 
 /a*/i
-    
 
 /([abc])*d/i
     ABBBCD
@@ -5248,6 +4983,7 @@
  0: HIJ
 
 /^(ab|cd)e/i
+\= Expect no match
     ABCDE
 No match
 
@@ -5309,8 +5045,7 @@
  0: IJ
     REFFGZ
  0: EFFGZ
-    *** Failers
-No match
+\= Expect no match
     ADCDCDE
 No match
     EFFG
@@ -5335,8 +5070,7 @@
  0: C
 
 /multiple words of text/i
-    *** Failers
-No match
+\= Expect no match
     AA
 No match
     UH-UH
@@ -5482,8 +5216,7 @@
 /(?<=a)b/
     ab
  0: b
-    *** Failers
-No match
+\= Expect no match
     cb
 No match
     b
@@ -5548,8 +5281,7 @@
  0: Ab
 
 /(?:(?i)a)b/
-    *** Failers
-No match
+\= Expect no match
     cb
 No match
     aB
@@ -5574,8 +5306,7 @@
  0: Ab
 
 /(?i:a)b/
-    *** Failers
-No match
+\= Expect no match
     aB
 No match
     aB
@@ -5600,10 +5331,9 @@
  0: aB
 
 /(?:(?-i)a)b/i
-    *** Failers
-No match
     aB
  0: aB
+\= Expect no match
     Ab
 No match
 
@@ -5618,8 +5348,7 @@
  0: aB
 
 /(?:(?-i)a)b/i
-    *** Failers
-No match
+\= Expect no match
     Ab
 No match
     AB
@@ -5644,8 +5373,7 @@
  0: aB
 
 /(?-i:a)b/i
-    *** Failers
-No match
+\= Expect no match
     AB
 No match
     Ab
@@ -5662,8 +5390,7 @@
  0: aB
 
 /(?-i:a)b/i
-    *** Failers
-No match
+\= Expect no match
     Ab
 No match
     AB
@@ -5672,8 +5399,7 @@
 /((?-i:a))b/i
 
 /((?-i:a.))b/i
-    *** Failers
-No match
+\= Expect no match
     AB
 No match
     a\nB
@@ -5709,8 +5435,7 @@
  0: aaac
 
 /(?<![cd])b/
-    *** Failers
-No match
+\= Expect no match
     B\nB
 No match
     dbcb
@@ -5731,8 +5456,7 @@
  0: b
 
 /^(?:a?b?)*$/
-    *** Failers
-No match
+\= Expect no match
     dbcb
 No match
     a--
@@ -5777,8 +5501,7 @@
 /^b/
 
 /()^b/
-    *** Failers
-No match
+\= Expect no match
     a\nb\nc\n
 No match
     a\nb\nc\n
@@ -5795,8 +5518,7 @@
  0: a
 
 /(?(?=a)b|a)/
-    *** Failers
-No match
+\= Expect no match
     a
 No match
     a
@@ -5833,8 +5555,7 @@
  0: abcd
     xy:z:::abcd
  0: xy:z:::abcd
-    *** Failers
- 0: Failers
+\= Expect no match
     abcd:
 No match
     abcd:
@@ -5880,8 +5601,7 @@
  5: abc
 
 /a\Z/
-    *** Failers
-No match
+\= Expect no match
     aaab
 No match
     a\nb\n
@@ -5900,26 +5620,25 @@
 /b\z/
     a\nb
  0: b
-    *** Failers
-No match
     
 /(?>.*)(?<=(abcd|wxyz))/
     alphabetabcd
  0: alphabetabcd
     endingwxyz
  0: endingwxyz
-    *** Failers
-No match
+\= Expect 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
+\= Expect no match
     word cat dog elephant mussel cow horse canary baboon snake shark
 No match
   
 /word (?>[a-zA-Z0-9]+ ){0,30}otherword/
+\= Expect no match
     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
 
@@ -5928,8 +5647,7 @@
  0: foo
     123999foo 
  0: foo
-    *** Failers
-No match
+\= Expect no match
     123abcfoo
 No match
     
@@ -5938,8 +5656,7 @@
  0: foo
     123999foo 
  0: foo
-    *** Failers
-No match
+\= Expect no match
     123abcfoo
 No match
 
@@ -5948,8 +5665,7 @@
  0: foo
     123456foo 
  0: foo
-    *** Failers
-No match
+\= Expect no match
     123999foo  
 No match
     
@@ -5958,8 +5674,7 @@
  0: foo
     123456foo 
  0: foo
-    *** Failers
-No match
+\= Expect no match
     123999foo  
 No match
 
@@ -6007,8 +5722,7 @@
  0: -
     0digit
  0: 0
-    *** Failers
-No match
+\= Expect no match
     bcdef    
 No match
     
@@ -6037,7 +5751,8 @@
  0: x
 
 /(?!^)x/m
-  a\nxb\n
+\= Expect no match
+    a\nxb\n
 No match
 
 /abc\Qabc\Eabc/
@@ -6051,8 +5766,7 @@
 /   abc\Q abc\Eabc/x
     abc abcabc
  0: abc abcabc
-    *** Failers
-No match
+\= Expect no match
     abcabcabc  
 No match
     
@@ -6092,8 +5806,7 @@
 /\Gabc/
     abc
  0: abc
-    *** Failers
-No match
+\= Expect no match
     xyzabc  
 No match
 
@@ -6111,8 +5824,7 @@
 /a(?x: b c )d/
     XabcdY
  0: abcd
-    *** Failers 
-No match
+\= Expect no match 
     Xa b c d Y 
 No match
 
@@ -6125,8 +5837,7 @@
 /(?i)AB(?-i)C/
     XabCY
  0: abC
-    *** Failers
-No match
+\= Expect no match
     XabcY  
 No match
 
@@ -6135,8 +5846,7 @@
  0: abCE
     DE
  0: DE
-    *** Failers
-No match
+\= Expect no match
     abcE
 No match
     abCe  
@@ -6157,22 +5867,12 @@
  0: d
     ] 
  0: ]
-    *** Failers
- 0: a
+\= Expect no match
     b     
 No match
 
-/[\z\C]/
-    z
- 0: z
-    C 
- 0: C
-    
-/\M/
-    M 
- 0: M
-    
 /(a+)*b/
+\= Expect no match
     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 
 No match
     
@@ -6202,7 +5902,7 @@
 
 /^(?(2)a|(1)(2))+$/
     123a
-Error -17 (backreference condition or recursion test not supported for DFA matching)
+Failed: error -40: backreference condition or recursion test is not supported for DFA matching
 
 /(?<=a|bbbb)c/
     ac
@@ -6210,91 +5910,40 @@
     bbbbc
  0: c
 
-/abc/SS>testsavedregex
-Compiled pattern written to testsavedregex
-<testsavedregex
-Compiled pattern loaded from testsavedregex
-No study data
-    abc
- 0: abc
-    *** Failers
-No match
-    bca
-No match
-    
-/abc/FSS>testsavedregex
-Compiled pattern written to testsavedregex
-<testsavedregex
-Compiled pattern (byte-inverted) loaded from testsavedregex
-No study data
-    abc
- 0: abc
-    *** Failers
-No match
-    bca
-No match
-
-/(a|b)/S>testsavedregex
-Compiled pattern written to testsavedregex
-Study data written to testsavedregex
-<testsavedregex
-Compiled pattern loaded from testsavedregex
-Study data loaded from testsavedregex
-    abc
- 0: a
-    *** Failers
- 0: a
-    def  
-No match
-    
-/(a|b)/SF>testsavedregex
-Compiled pattern written to testsavedregex
-Study data written to testsavedregex
-<testsavedregex
-Compiled pattern (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
+/line\nbreak/firstline
     this is a line\nbreak
  0: line\x0abreak
-    ** Failers 
-No match
+\= Expect no match 
     line one\nthis is a line\nbreak in the second line 
 No match
 
-/line\nbreak/mf
+/line\nbreak/m,firstline
     this is a line\nbreak
  0: line\x0abreak
-    ** Failers 
-No match
+\= Expect no match 
     line one\nthis is a line\nbreak in the second line 
 No match
 
 /1234/
-    123\P
+    123\=ps
 Partial match: 123
-    a4\P\R
+\= Expect no match 
+    a4\=ps,dfa_restart
 No match
 
 /1234/
-    123\P
+    123\=ps
 Partial match: 123
-    4\P\R
+    4\=ps,dfa_restart
  0: 4
 
-/^/mg
+/^/gm
     a\nb\nc\n
  0: 
  0: 
@@ -6302,7 +5951,7 @@
     \ 
  0: 
     
-/(?<=C\n)^/mg
+/(?<=C\n)^/gm
     A\nC\nC\n 
  0: 
 
@@ -6346,106 +5995,112 @@
     Content-Type:xxxyyyz
  0: Content-Type:xxxyyyz
 
-/^abc/m
+/^abc/Im,newline=lf
+Capturing subpattern count = 0
+Options: multiline
+Forced newline is LF
+First code unit at start or follows newline
+Last code unit = 'c'
+Subject length lower bound = 3
     xyz\nabc
  0: abc
-    xyz\nabc\<lf>
+    xyz\r\nabc
  0: abc
-    xyz\r\nabc\<lf>
+\= Expect no match
+    xyz\rabc
+No match
+    xyzabc\r
+No match
+    xyzabc\rpqr
+No match
+    xyzabc\r\n
+No match
+    xyzabc\r\npqr
+No match
+
+/^abc/Im,newline=crlf
+Capturing subpattern count = 0
+Options: multiline
+Forced newline is CRLF
+First code unit at start or follows newline
+Last code unit = 'c'
+Subject length lower bound = 3
+    xyz\r\nabclf>
  0: abc
-    xyz\rabc\<cr>
- 0: abc
-    xyz\r\nabc\<crlf>
- 0: abc
-    ** Failers 
+\= Expect no match
+    xyz\nabclf
 No match
-    xyz\nabc\<cr>
-No match
-    xyz\r\nabc\<cr>
-No match
-    xyz\nabc\<crlf>
-No match
-    xyz\rabc\<crlf>
-No match
-    xyz\rabc\<lf>
+    xyz\rabclf
 No match
     
-/abc$/m<lf>
-    xyzabc
+/^abc/Im,newline=cr
+Capturing subpattern count = 0
+Options: multiline
+Forced newline is CR
+First code unit at start or follows newline
+Last code unit = 'c'
+Subject length lower bound = 3
+    xyz\rabc
  0: abc
-    xyzabc\n 
- 0: abc
-    xyzabc\npqr 
- 0: abc
-    xyzabc\r\<cr> 
- 0: abc
-    xyzabc\rpqr\<cr> 
- 0: abc
-    xyzabc\r\n\<crlf> 
- 0: abc
-    xyzabc\r\npqr\<crlf> 
- 0: abc
-    ** Failers
+\= Expect no match
+    xyz\nabc
 No match
-    xyzabc\r 
+    xyz\r\nabc
 No match
-    xyzabc\rpqr 
-No match
-    xyzabc\r\n 
-No match
-    xyzabc\r\npqr 
-No match
-    
-/^abc/m<cr>
-    xyz\rabcdef
- 0: abc
-    xyz\nabcdef\<lf>
- 0: abc
-    ** Failers  
-No match
-    xyz\nabcdef
-No match
-       
-/^abc/m<lf>
-    xyz\nabcdef
- 0: abc
-    xyz\rabcdef\<cr>
- 0: abc
-    ** Failers  
-No match
-    xyz\rabcdef
-No match
-       
-/^abc/m<crlf>
-    xyz\r\nabcdef
- 0: abc
-    xyz\rabcdef\<cr>
- 0: abc
-    ** Failers  
-No match
-    xyz\rabcdef
-No match
-    
-/.*/<lf>
+
+/.*/I,newline=lf
+Capturing subpattern count = 0
+May match empty string
+Forced newline is LF
+First code unit at start or follows newline
+Subject length lower bound = 0
     abc\ndef
  0: abc
     abc\rdef
  0: abc\x0ddef
     abc\r\ndef
  0: abc\x0d
-    \<cr>abc\ndef
+
+/.*/I,newline=cr
+Capturing subpattern count = 0
+May match empty string
+Forced newline is CR
+First code unit at start or follows newline
+Subject length lower bound = 0
+    abc\ndef
  0: abc\x0adef
-    \<cr>abc\rdef
+    abc\rdef
  0: abc
-    \<cr>abc\r\ndef
+    abc\r\ndef
  0: abc
-    \<crlf>abc\ndef
+
+/.*/I,newline=crlf
+Capturing subpattern count = 0
+May match empty string
+Forced newline is CRLF
+First code unit at start or follows newline
+Subject length lower bound = 0
+    abc\ndef
  0: abc\x0adef
-    \<crlf>abc\rdef
+    abc\rdef
  0: abc\x0ddef
-    \<crlf>abc\r\ndef
+    abc\r\ndef
  0: abc
 
+/\w+(.)(.)?def/Is
+Capturing subpattern count = 2
+Options: dotall
+Starting code units: 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 
+Last code unit = 'f'
+Subject length lower bound = 5
+    abc\ndef
+ 0: abc\x0adef
+    abc\rdef
+ 0: abc\x0ddef
+    abc\r\ndef
+ 0: abc\x0d\x0adef
+
 /\w+(.)(.)?def/s
     abc\ndef
  0: abc\x0adef
@@ -6497,40 +6152,57 @@
  3: a
 
 /(a|)*\d/
-  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-No match
   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4
  0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4
+\= Expect no match
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+No match
 
 /(?>a|)*\d/
-  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-No match
   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4
  0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4
+\= Expect no match
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+No match
 
 /(?:a|)*\d/
-  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-No match
   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4
  0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4
+\= Expect no match
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+No match
 
-/^a.b/<lf>
+/^a.b/newline=lf
     a\rb
  0: a\x0db
-    a\nb\<cr> 
- 0: a\x0ab
-    ** Failers
-No match
+\= Expect no match
     a\nb
 No match
-    a\nb\<any>
-No match
-    a\rb\<cr>   
-No match
-    a\rb\<any>   
+
+/^a.b/newline=cr
+    a\nb
+ 0: a\x0ab
+\= Expect no match
+    a\rb
 No match
 
-/^abc./mgx<any>
+/^a.b/newline=anycrlf
+    a\x85b
+ 0: a\x85b
+\= Expect no match
+    a\rb
+No match
+
+/^a.b/newline=any
+\= Expect no match
+    a\nb
+No match
+    a\rb
+No match
+    a\x85b
+No match
+
+/^abc./gmx,newline=any
     abc1 \x0aabc2 \x0babc3xx \x0cabc4 \x0dabc5xx \x0d\x0aabc6 \x85abc7 JUNK
  0: abc1
  0: abc2
@@ -6540,7 +6212,7 @@
  0: abc6
  0: abc7
 
-/abc.$/mgx<any>
+/abc.$/gmx,newline=any
     abc1\x0a abc2\x0b abc3\x0c abc4\x0d abc5\x0d\x0a abc6\x85 abc9
  0: abc1
  0: abc2
@@ -6550,7 +6222,7 @@
  0: abc6
  0: abc9
 
-/^a\Rb/<bsr_unicode>
+/^a\Rb/bsr=unicode
     a\nb
  0: a\x0ab
     a\rb
@@ -6563,12 +6235,11 @@
  0: a\x0cb
     a\x85b   
  0: a\x85b
-    ** Failers
-No match
+\= Expect no match
     a\n\rb    
 No match
 
-/^a\R*b/<bsr_unicode>
+/^a\R*b/bsr=unicode
     ab
  0: ab
     a\nb
@@ -6588,7 +6259,7 @@
     a\n\r\x85\x0cb 
  0: a\x0a\x0d\x85\x0cb
 
-/^a\R+b/<bsr_unicode>
+/^a\R+b/bsr=unicode
     a\nb
  0: a\x0ab
     a\rb
@@ -6605,12 +6276,11 @@
  0: a\x0a\x0db
     a\n\r\x85\x0cb 
  0: a\x0a\x0d\x85\x0cb
-    ** Failers
-No match
+\= Expect no match
     ab  
 No match
     
-/^a\R{1,3}b/<bsr_unicode>
+/^a\R{1,3}b/bsr=unicode
     a\nb
  0: a\x0ab
     a\n\rb
@@ -6625,46 +6295,34 @@
  0: a\x0a\x0d\x0a\x0db
     a\n\n\r\nb 
  0: a\x0a\x0a\x0d\x0ab
-    ** Failers
-No match
+\= Expect no match
     a\n\n\n\rb
 No match
     a\r
 No match
 
-/^a[\R]b/<bsr_unicode>
-    aRb
- 0: aRb
-    ** Failers
-No match
-    a\nb  
-No match
-
 /.+foo/
     afoo
  0: afoo
-    ** Failers 
-No match
+\= Expect no match 
     \r\nfoo 
 No match
     \nfoo 
 No match
 
-/.+foo/<crlf>
+/.+foo/newline=crlf
     afoo
  0: afoo
     \nfoo 
  0: \x0afoo
-    ** Failers 
-No match
+\= Expect no match 
     \r\nfoo 
 No match
 
-/.+foo/<any>
+/.+foo/newline=any
     afoo
  0: afoo
-    ** Failers 
-No match
+\= Expect no match 
     \nfoo 
 No match
     \r\nfoo 
@@ -6678,36 +6336,34 @@
     \nfoo 
  0: \x0afoo
 
-/^$/mg<any>
+/^$/gm,newline=any
     abc\r\rxyz
  0: 
     abc\n\rxyz  
  0: 
-    ** Failers 
-No match
+\= Expect no match 
     abc\r\nxyz
 No match
 
 /^X/m
     XABC
  0: X
-    ** Failers 
-No match
-    XABC\B
+\= Expect no match 
+    XABC\=notbol
 No match
 
-/(?m)^$/<any>g+
+/(?m)^$/g,newline=any,aftertext
     abc\r\n\r\n
  0: 
  0+ \x0d\x0a
 
-/(?m)^$|^\r\n/<any>g+ 
+/(?m)^$|^\r\n/g,newline=any,aftertext
     abc\r\n\r\n
  0: \x0d\x0a
  0+ 
  1: 
     
-/(?m)$/<any>g+ 
+/(?m)$/g,newline=any,aftertext
     abc\r\n\r\n
  0: 
  0+ \x0d\x0a\x0d\x0a
@@ -6739,8 +6395,7 @@
  0: abcabc
     xyzabc 
  0: xyzabc
-    ** Failers 
-No match
+\= Expect no match 
     xyzxyz 
 No match
  
@@ -6749,20 +6404,18 @@
  0: X X\x0a
     X\x09X\x0b
  0: X\x09X\x0b
-    ** Failers
-No match
+\= Expect no match
     \xa0 X\x0a   
 No match
     
-/\H*\h+\V?\v{3,4}/ 
+/\H*\h+\V?\v{3,4}/
     \x09\x20\xa0X\x0a\x0b\x0c\x0d\x0a
  0: \x09 \xa0X\x0a\x0b\x0c\x0d
     \x09\x20\xa0\x0a\x0b\x0c\x0d\x0a
  0: \x09 \xa0\x0a\x0b\x0c\x0d
     \x09\x20\xa0\x0a\x0b\x0c
  0: \x09 \xa0\x0a\x0b\x0c
-    ** Failers 
-No match
+\= Expect no match 
     \x09\x20\xa0\x0a\x0b
 No match
      
@@ -6782,8 +6435,7 @@
  0: XNNNYZ
     >  X NYQZ
  0:   X NYQZ
-    ** Failers
-No match
+\= Expect no match
     >XYZ   
 No match
     >  X NY Z
@@ -6795,45 +6447,47 @@
     >\x0a\x0dX\x0aY\x0a\x0bZZZ\x0aAAA\x0bNNN\x0c
  0: \x0a\x0dX\x0aY\x0a\x0bZZZ\x0aAAA\x0bNNN\x0c
 
-/.+A/<crlf>
+/.+A/newline=crlf
+\= Expect no match
     \r\nA
 No match
     
-/\nA/<crlf>
+/\nA/newline=crlf
     \r\nA 
  0: \x0aA
 
-/[\r\n]A/<crlf>
+/[\r\n]A/newline=crlf
     \r\nA 
  0: \x0aA
 
-/(\r|\n)A/<crlf>
+/(\r|\n)A/newline=crlf
     \r\nA 
  0: \x0aA
 
-/a\Rb/I<bsr_anycrlf>
+/a\Rb/I,bsr=anycrlf
 Capturing subpattern count = 0
-Options: bsr_anycrlf
-First char = 'a'
-Need char = 'b'
+\R matches CR, LF, or CRLF
+First code unit = 'a'
+Last code unit = 'b'
+Subject length lower bound = 3
     a\rb
  0: a\x0db
     a\nb
  0: a\x0ab
     a\r\nb
  0: a\x0d\x0ab
-    ** Failers
-No match
+\= Expect no match
     a\x85b
 No match
     a\x0bb     
 No match
 
-/a\Rb/I<bsr_unicode>
+/a\Rb/I,bsr=unicode
 Capturing subpattern count = 0
-Options: bsr_unicode
-First char = 'a'
-Need char = 'b'
+\R matches any Unicode newline
+First code unit = 'a'
+Last code unit = 'b'
+Subject length lower bound = 3
     a\rb
  0: a\x0db
     a\nb
@@ -6844,36 +6498,31 @@
  0: a\x85b
     a\x0bb     
  0: a\x0bb
-    ** Failers 
-No match
-    a\x85b\<bsr_anycrlf>
-No match
-    a\x0bb\<bsr_anycrlf>
-No match
     
-/a\R?b/I<bsr_anycrlf>
+/a\R?b/I,bsr=anycrlf
 Capturing subpattern count = 0
-Options: bsr_anycrlf
-First char = 'a'
-Need char = 'b'
+\R matches CR, LF, or CRLF
+First code unit = 'a'
+Last code unit = 'b'
+Subject length lower bound = 2
     a\rb
  0: a\x0db
     a\nb
  0: a\x0ab
     a\r\nb
  0: a\x0d\x0ab
-    ** Failers
-No match
+\= Expect no match
     a\x85b
 No match
     a\x0bb     
 No match
 
-/a\R?b/I<bsr_unicode>
+/a\R?b/I,bsr=unicode
 Capturing subpattern count = 0
-Options: bsr_unicode
-First char = 'a'
-Need char = 'b'
+\R matches any Unicode newline
+First code unit = 'a'
+Last code unit = 'b'
+Subject length lower bound = 2
     a\rb
  0: a\x0db
     a\nb
@@ -6884,102 +6533,86 @@
  0: a\x85b
     a\x0bb     
  0: a\x0bb
-    ** Failers 
-No match
-    a\x85b\<bsr_anycrlf>
-No match
-    a\x0bb\<bsr_anycrlf>
-No match
     
-/a\R{2,4}b/I<bsr_anycrlf>
+/a\R{2,4}b/I,bsr=anycrlf
 Capturing subpattern count = 0
-Options: bsr_anycrlf
-First char = 'a'
-Need char = 'b'
+\R matches CR, LF, or CRLF
+First code unit = 'a'
+Last code unit = 'b'
+Subject length lower bound = 4
     a\r\n\nb
  0: a\x0d\x0a\x0ab
     a\n\r\rb
  0: a\x0a\x0d\x0db
     a\r\n\r\n\r\n\r\nb
  0: a\x0d\x0a\x0d\x0a\x0d\x0a\x0d\x0ab
-    ** Failers
+\= Expect no match
+    a\x0b\x0bb     
 No match
-    a\x85\85b
-No match
-    a\x0b\0bb     
+    a\x85\x85b
 No match
 
-/a\R{2,4}b/I<bsr_unicode>
+/a\R{2,4}b/I,bsr=unicode
 Capturing subpattern count = 0
-Options: bsr_unicode
-First char = 'a'
-Need char = 'b'
+\R matches any Unicode newline
+First code unit = 'a'
+Last code unit = 'b'
+Subject length lower bound = 4
     a\r\rb
  0: a\x0d\x0db
     a\n\n\nb
  0: a\x0a\x0a\x0ab
     a\r\n\n\r\rb
  0: a\x0d\x0a\x0a\x0d\x0db
-    a\x85\85b
-No match
-    a\x0b\0bb     
-No match
-    ** Failers 
-No match
+    a\x85\x85b
+ 0: a\x85\x85b
+    a\x0b\x0bb     
+ 0: a\x0b\x0bb
+\= Expect no match 
     a\r\r\r\r\rb 
 No match
-    a\x85\85b\<bsr_anycrlf>
-No match
-    a\x0b\0bb\<bsr_anycrlf>
-No match
     
 /a(?!)|\wbc/
     abc 
  0: abc
 
-/a[]b/<JS>
-    ** Failers
-No match
+/a[]b/alt_bsux,allow_empty_class,match_unset_backref,dupnames
+\= Expect no match
     ab
 No match
 
-/a[]+b/<JS>
-    ** Failers
-No match
+/a[]+b/alt_bsux,allow_empty_class,match_unset_backref,dupnames
+\= Expect no match
     ab 
 No match
 
-/a[]*+b/<JS>
-    ** Failers
-No match
+/a[]*+b/alt_bsux,allow_empty_class,match_unset_backref,dupnames
+\= Expect no match
     ab 
 No match
 
-/a[^]b/<JS>
+/a[^]b/alt_bsux,allow_empty_class,match_unset_backref,dupnames
     aXb
  0: aXb
     a\nb 
  0: a\x0ab
-    ** Failers
-No match
+\= Expect no match
     ab  
 No match
     
-/a[^]+b/<JS> 
+/a[^]+b/alt_bsux,allow_empty_class,match_unset_backref,dupnames
     aXb
  0: aXb
     a\nX\nXb 
  0: a\x0aX\x0aXb
-    ** Failers
-No match
+\= Expect no match
     ab  
 No match
 
-/X$/E
+/X$/dollar_endonly
     X
  0: X
-    ** Failers 
-No match
+\= Expect no match 
     X\n 
 No match
 
@@ -6989,7 +6622,7 @@
     X\n 
  0: X
 
-/xyz/C
+/xyz/auto_callout
   xyz 
 --->xyz
  +0 ^       x
@@ -7004,7 +6637,14 @@
  +2    ^ ^     z
  +3    ^  ^    
  0: xyz
-  abcxyz\Y
+\= Expect no match 
+  abc
+No match
+  abcxypqr  
+No match
+
+/xyz/auto_callout,no_start_optimize
+  abcxyz 
 --->abcxyz
  +0 ^          x
  +0  ^         x
@@ -7014,11 +6654,8 @@
  +2    ^ ^     z
  +3    ^  ^    
  0: xyz
-  ** Failers 
-No match
+\= Expect no match 
   abc
-No match
-  abc\Y
 --->abc
  +0 ^       x
  +0  ^      x
@@ -7026,8 +6663,6 @@
  +0    ^    x
 No match
   abcxypqr  
-No match
-  abcxypqr\Y  
 --->abcxypqr
  +0 ^            x
  +0  ^           x
@@ -7042,7 +6677,7 @@
  +0         ^    x
 No match
 
-/(*NO_START_OPT)xyz/C
+/(*NO_START_OPT)xyz/auto_callout
   abcxyz 
 --->abcxyz
 +15 ^          x
@@ -7059,20 +6694,20 @@
 --->ab
   0 ^      a
  0: ab
-  \C-ab
+  ab\=callout_none
  0: ab
   
-/ab/C
+/ab/auto_callout
   ab
 --->ab
  +0 ^      a
  +1 ^^     b
  +2 ^ ^    
  0: ab
-  \C-ab    
+  ab\=callout_none
  0: ab
 
-/^"((?(?=[a])[^"])|b)*"$/C
+/^"((?(?=[a])[^"])|b)*"$/auto_callout
     "ab"
 --->"ab"
  +0 ^        ^
@@ -7102,104 +6737,111 @@
 +22 ^   ^    $
 +23 ^   ^    
  0: "ab"
-    \C-"ab"
+    "ab"\=callout_none
  0: "ab"
 
 /\d+X|9+Y/
-    ++++123999\P
+    ++++123999\=ps
 Partial match: 123999
-    ++++123999Y\P
+    ++++123999Y\=ps
  0: 999Y
 
 /Z(*F)/
-    Z\P
+\= Expect no match 
+    Z\=ps
 No match
-    ZA\P 
+    ZA\=ps
 No match
     
 /Z(?!)/
-    Z\P 
+\= Expect no match 
+    Z\=ps
 No match
-    ZA\P 
+    ZA\=ps
 No match
 
 /dog(sbody)?/
-    dogs\P
+    dogs\=ps
  0: dog
-    dogs\P\P 
+    dogs\=ph
 Partial match: dogs
     
 /dog(sbody)??/
-    dogs\P
+    dogs\=ps
  0: dog
-    dogs\P\P 
+    dogs\=ph
 Partial match: dogs
 
 /dog|dogsbody/
-    dogs\P
+    dogs\=ps
  0: dog
-    dogs\P\P 
+    dogs\=ph
 Partial match: dogs
  
 /dogsbody|dog/
-    dogs\P
+    dogs\=ps
  0: dog
-    dogs\P\P 
+    dogs\=ph
 Partial match: dogs
 
 /Z(*F)Q|ZXY/
-    Z\P
+    Z\=ps
 Partial match: Z
-    ZA\P 
+\= Expect no match 
+    ZA\=ps
 No match
-    X\P 
+    X\=ps
 No match
 
 /\bthe cat\b/
-    the cat\P
+    the cat\=ps
  0: the cat
-    the cat\P\P
+    the cat\=ph
 Partial match: the cat
 
 /dog(sbody)?/
-    dogs\D\P
+    dogs\=ps
  0: dog
-    body\D\R
+    body\=dfa_restart
  0: body
 
 /dog(sbody)?/
-    dogs\D\P\P
+    dogs\=ph
 Partial match: dogs
-    body\D\R
+    body\=dfa_restart
  0: body
 
 /abc/
-   abc\P
+   abc\=ps
  0: abc
-   abc\P\P
+   abc\=ph
  0: abc
 
 /abc\K123/
     xyzabc123pqr
-Error -16 (item unsupported for DFA matching)
+Failed: error -42: pattern contains an item that is not supported for DFA matching
     
 /(?<=abc)123/
     xyzabc123pqr 
  0: 123
-    xyzabc12\P
-Partial match at offset 6: abc12
-    xyzabc12\P\P
-Partial match at offset 6: abc12
+    xyzabc12\=ps
+Partial match: abc12
+               <<<
+    xyzabc12\=ph
+Partial match: abc12
+               <<<
 
 /\babc\b/
     +++abc+++
  0: abc
-    +++ab\P
-Partial match at offset 3: +ab
-    +++ab\P\P  
-Partial match at offset 3: +ab
+    +++ab\=ps
+Partial match: +ab
+               <
+    +++ab\=ph
+Partial match: +ab
+               <
 
-/(?=C)/g+
+/(?=C)/g,aftertext
     ABCDECBA
  0: 
  0+ CDECBA
@@ -7208,81 +6850,63 @@
 
 /(abc|def|xyz)/I
 Capturing subpattern count = 1
-No options
-No first char
-No need char
-    terhjk;abcdaadsfe
- 0: abc
-    the quick xyz brown fox 
- 0: xyz
-    \Yterhjk;abcdaadsfe
- 0: abc
-    \Ythe quick xyz brown fox 
- 0: xyz
-    ** Failers
-No match
-    thejk;adlfj aenjl;fda asdfasd ehj;kjxyasiupd
-No match
-    \Ythejk;adlfj aenjl;fda asdfasd ehj;kjxyasiupd
-No match
-
-/(abc|def|xyz)/SI
-Capturing subpattern count = 1
-No options
-No first char
-No need char
+Starting code units: a d x 
 Subject length lower bound = 3
-Starting chars: a d x 
     terhjk;abcdaadsfe
  0: abc
     the quick xyz brown fox 
  0: xyz
-    \Yterhjk;abcdaadsfe
- 0: abc
-    \Ythe quick xyz brown fox 
- 0: xyz
-    ** Failers
-No match
+\= Expect no match
     thejk;adlfj aenjl;fda asdfasd ehj;kjxyasiupd
 No match
-    \Ythejk;adlfj aenjl;fda asdfasd ehj;kjxyasiupd
+
+/(abc|def|xyz)/I,no_start_optimize
+Capturing subpattern count = 1
+Options: no_start_optimize
+Subject length lower bound = 0
+    terhjk;abcdaadsfe
+ 0: abc
+    the quick xyz brown fox
+ 0: xyz
+\= Expect no match
+    thejk;adlfj aenjl;fda asdfasd ehj;kjxyasiupd
 No match
 
-/abcd*/+
-    xxxxabcd\P
+/abcd*/aftertext
+    xxxxabcd\=ps
  0: abcd
  0+ 
-    xxxxabcd\P\P
+    xxxxabcd\=ph
 Partial match: abcd
-    dddxxx\R 
+    dddxxx\=dfa_restart
  0: ddd
  0+ xxx
-    xxxxabcd\P\P
+    xxxxabcd\=ph
 Partial match: abcd
-    xxx\R 
+    xxx\=dfa_restart
  0: 
  0+ xxx
 
 /abcd*/i
-    xxxxabcd\P
+    xxxxabcd\=ps
  0: abcd
-    xxxxabcd\P\P
+    xxxxabcd\=ph
 Partial match: abcd
-    XXXXABCD\P
+    XXXXABCD\=ps
  0: ABCD
-    XXXXABCD\P\P
+    XXXXABCD\=ph
 Partial match: ABCD
 
 /abc\d*/
-    xxxxabc1\P
+    xxxxabc1\=ps
  0: abc1
-    xxxxabc1\P\P
+    xxxxabc1\=ph
 Partial match: abc1
 
 /abc[de]*/
-    xxxxabcde\P
+    xxxxabcde\=ps
  0: abcde
-    xxxxabcde\P\P
+    xxxxabcde\=ph
 Partial match: abcde
 
 /(?:(?1)|B)(A(*F)|C)/
@@ -7290,8 +6914,7 @@
  0: BC
     CCD
  0: CC
-    ** Failers
-No match
+\= Expect no match
     CAD   
 No match
 
@@ -7300,8 +6923,7 @@
  0: CC
     BCD 
  0: BC
-    ** Failers
-No match
+\= Expect no match
     ABCD
 No match
     CAD
@@ -7311,40 +6933,35 @@
 
 /^(?!a(*SKIP)b)/
     ac
-Error -16 (item unsupported for DFA matching)
+Failed: error -42: pattern contains an item that is not supported for DFA matching
     
 /^(?=a(*SKIP)b|ac)/
-    ** Failers
-No match
     ac
-Error -16 (item unsupported for DFA matching)
+Failed: error -42: pattern contains an item that is not supported for DFA matching
     
 /^(?=a(*THEN)b|ac)/
     ac
-Error -16 (item unsupported for DFA matching)
+Failed: error -42: pattern contains an item that is not supported for DFA matching
     
 /^(?=a(*PRUNE)b)/
     ab  
-Error -16 (item unsupported for DFA matching)
-    ** Failers 
-No match
-    ac
-Error -16 (item unsupported for DFA matching)
+Failed: error -42: pattern contains an item that is not supported for DFA matching
 
 /^(?(?!a(*SKIP)b))/
     ac
-Error -16 (item unsupported for DFA matching)
+Failed: error -42: pattern contains an item that is not supported for DFA matching
 
 /(?<=abc)def/
-    abc\P\P
-Partial match at offset 3: abc
+    abc\=ph
+Partial match: abc
+               <<<
 
 /abc$/
     abc
  0: abc
-    abc\P
+    abc\=ps
  0: abc
-    abc\P\P
+    abc\=ph
 Partial match: abc
 
 /abc$/m
@@ -7352,66 +6969,68 @@
  0: abc
     abc\n
  0: abc
-    abc\P\P
+    abc\=ph
 Partial match: abc
-    abc\n\P\P 
+    abc\n\=ph
  0: abc
-    abc\P
+    abc\=ps
  0: abc
-    abc\n\P
+    abc\n\=ps
  0: abc
 
 /abc\z/
     abc
  0: abc
-    abc\P
+    abc\=ps
  0: abc
-    abc\P\P
+    abc\=ph
 Partial match: abc
 
 /abc\Z/
     abc
  0: abc
-    abc\P
+    abc\=ps
  0: abc
-    abc\P\P
+    abc\=ph
 Partial match: abc
 
 /abc\b/
     abc
  0: abc
-    abc\P
+    abc\=ps
  0: abc
-    abc\P\P
+    abc\=ph
 Partial match: abc
 
 /abc\B/
+    abc\=ps
+Partial match: abc
+    abc\=ph
+Partial match: abc
+\= Expect no match 
     abc
 No match
-    abc\P
-Partial match: abc
-    abc\P\P
-Partial match: abc
 
 /.+/
-    abc\>0
+    abc\=offset=0
  0: abc
-    abc\>1
+    abc\=offset=1
  0: bc
-    abc\>2
+    abc\=offset=2
  0: c
-    abc\>3
+\= Bad offsets
+    abc\=offset=4
+Failed: error -33: bad offset value
+    abc\=offset=-4 
+** Invalid value in 'offset=-4'
+\= Expect no match 
+    abc\=offset=3
 No match
-    abc\>4
-Error -24 (bad offset value)
-    abc\>-4 
-Error -24 (bad offset value)
 
 /^(?:a)++\w/
      aaaab
  0: aaaab
-     ** Failers 
-No match
+\= Expect no match 
      aaaa 
 No match
      bbb 
@@ -7423,8 +7042,7 @@
  1: aa
      aaaa 
  0: aa
-     ** Failers 
-No match
+\= Expect no match 
      bbb 
 No match
 
@@ -7433,16 +7051,14 @@
  0: aaaab
      bbb 
  0: b
-     ** Failers 
-No match
+\= Expect no match 
      aaaa 
 No match
 
 /^(a)++\w/
      aaaab
  0: aaaab
-     ** Failers 
-No match
+\= Expect no match 
      aaaa 
 No match
      bbb 
@@ -7451,37 +7067,33 @@
 /^(a|)++\w/
      aaaab
  0: aaaab
-     ** Failers 
-No match
+\= Expect no match 
      aaaa 
 No match
      bbb 
 No match
 
-/(?=abc){3}abc/+
+/(?=abc){3}abc/aftertext
     abcabcabc
  0: abc
  0+ abcabc
-    ** Failers
-No match
+\= Expect no match
     xyz  
 No match
     
-/(?=abc)+abc/+
+/(?=abc)+abc/aftertext
     abcabcabc
  0: abc
  0+ abcabc
-    ** Failers
-No match
+\= Expect no match
     xyz  
 No match
     
-/(?=abc)++abc/+
+/(?=abc)++abc/aftertext
     abcabcabc
  0: abc
  0+ abcabc
-    ** Failers
-No match
+\= Expect no match
     xyz  
 No match
     
@@ -7490,8 +7102,7 @@
  0: xyz
 
 /(?=abc){1}xyz/
-    ** Failers
-No match
+\= Expect no match
     xyz 
 No match
     
@@ -7529,7 +7140,7 @@
 
 /((?2))((?1))/
     abc
-Error -26 (nested recursion at the same subject position)
+Failed: error -52: nested recursion at the same subject position
 
 /(?(R)a+|(?R)b)/
     aaaabcde
@@ -7545,50 +7156,42 @@
 
 /((?(R2)a+|(?1)b))/
     aaaabcde
-Error -17 (backreference condition or recursion test not supported for DFA matching)
+Failed: error -40: backreference condition or recursion test is not supported for DFA matching
 
 /(?(R)a*(?1)|((?R))b)/
     aaaabcde
-Error -26 (nested recursion at the same subject position)
+Failed: error -52: nested recursion at the same subject position
 
-/(a+)/O
-    \O6aaaa
+/(a+)/no_auto_possess
+    aaaa\=ovector=3
 Matched, but offsets vector is too small to show all matches
  0: aaaa
  1: aaa
  2: aa
-    \O8aaaa
+    aaaa\=ovector=4
  0: aaaa
  1: aaa
  2: aa
  3: a
 
-/ab\Cde/
-    abXde
- 0: abXde
-    
-/(?<=ab\Cde)X/
-    abZdeX
- 0: X
-
 /^\R/
-    \r\P
+    \r\=ps
  0: \x0d
-    \r\P\P
+    \r\=ph
 Partial match: \x0d
     
 /^\R{2,3}x/
-    \r\P
+    \r\=ps
 Partial match: \x0d
-    \r\P\P
+    \r\=ph
 Partial match: \x0d
-    \r\r\P 
+    \r\r\=ps
 Partial match: \x0d\x0d
-    \r\r\P\P
+    \r\r\=ph
 Partial match: \x0d\x0d
-    \r\r\r\P  
+    \r\r\r\=ps
 Partial match: \x0d\x0d\x0d
-    \r\r\r\P\P
+    \r\r\r\=ph
 Partial match: \x0d\x0d\x0d
     \r\rx
  0: \x0d\x0dx
@@ -7596,17 +7199,17 @@
  0: \x0d\x0d\x0dx
 
 /^\R{2,3}?x/
-    \r\P
+    \r\=ps
 Partial match: \x0d
-    \r\P\P
+    \r\=ph
 Partial match: \x0d
-    \r\r\P 
+    \r\r\=ps
 Partial match: \x0d\x0d
-    \r\r\P\P
+    \r\r\=ph
 Partial match: \x0d\x0d
-    \r\r\r\P  
+    \r\r\r\=ps
 Partial match: \x0d\x0d\x0d
-    \r\r\r\P\P
+    \r\r\r\=ph
 Partial match: \x0d\x0d\x0d
     \r\rx
  0: \x0d\x0dx
@@ -7614,9 +7217,9 @@
  0: \x0d\x0d\x0dx
     
 /^\R?x/
-    \r\P
+    \r\=ps
 Partial match: \x0d
-    \r\P\P 
+    \r\=ph
 Partial match: \x0d
     x
  0: x
@@ -7624,81 +7227,81 @@
  0: \x0dx
 
 /^\R+x/
-    \r\P
+    \r\=ps
 Partial match: \x0d
-    \r\P\P 
+    \r\=ph
 Partial match: \x0d
-    \r\n\P
+    \r\n\=ps
 Partial match: \x0d\x0a
-    \r\n\P\P  
+    \r\n\=ph
 Partial match: \x0d\x0a
     \rx  
  0: \x0dx
 
-/^a$/<CRLF>
-    a\r\P
+/^a$/newline=crlf
+    a\r\=ps
 Partial match: a\x0d
-    a\r\P\P 
+    a\r\=ph
 Partial match: a\x0d
 
-/^a$/m<CRLF>
-    a\r\P
+/^a$/m,newline=crlf
+    a\r\=ps
 Partial match: a\x0d
-    a\r\P\P 
+    a\r\=ph
 Partial match: a\x0d
 
-/^(a$|a\r)/<CRLF>
-    a\r\P
+/^(a$|a\r)/newline=crlf
+    a\r\=ps
  0: a\x0d
-    a\r\P\P 
+    a\r\=ph
 Partial match: a\x0d
 
-/^(a$|a\r)/m<CRLF>
-    a\r\P
+/^(a$|a\r)/m,newline=crlf
+    a\r\=ps
  0: a\x0d
-    a\r\P\P 
+    a\r\=ph
 Partial match: a\x0d
 
-/./<CRLF>
-    \r\P
+/./newline=crlf
+    \r\=ps
  0: \x0d
-    \r\P\P 
+    \r\=ph
 Partial match: \x0d
   
-/.{2,3}/<CRLF>
-    \r\P 
+/.{2,3}/newline=crlf
+    \r\=ps
 Partial match: \x0d
-    \r\P\P
+    \r\=ph
 Partial match: \x0d
-    \r\r\P
+    \r\r\=ps
  0: \x0d\x0d
-    \r\r\P\P
+    \r\r\=ph
 Partial match: \x0d\x0d
-    \r\r\r\P
+    \r\r\r\=ps
  0: \x0d\x0d\x0d
-    \r\r\r\P\P     
+    \r\r\r\=ph
 Partial match: \x0d\x0d\x0d
 
-/.{2,3}?/<CRLF>
-    \r\P 
+/.{2,3}?/newline=crlf
+    \r\=ps
 Partial match: \x0d
-    \r\P\P
+    \r\=ph
 Partial match: \x0d
-    \r\r\P
+    \r\r\=ps
  0: \x0d\x0d
-    \r\r\P\P
+    \r\r\=ph
 Partial match: \x0d\x0d
-    \r\r\r\P
+    \r\r\r\=ps
  0: \x0d\x0d\x0d
  1: \x0d\x0d
-    \r\r\r\P\P     
+    \r\r\r\=ph
 Partial match: \x0d\x0d\x0d
 
-/-- Test simple validity check for restarts --/
+# Test simple validity check for restarts 
 
 /abcdef/
-   abc\R
-Error -30 (invalid data in workspace for DFA restart)
+   abc\=dfa_restart
+Failed: error -38: invalid data in workspace for DFA restart
 
 /<H((?(?!<H|F>)(.)|(?R))++)*F>/
     text <H more text <H texting more  hexA0-"\xA0"    hex above 7F-"\xBC" F> text xxxxx <H text F> text F> text2 <H text sample F> more text.
@@ -7721,10 +7324,10 @@
  1: xx\xa0xxxxxabc
 
 /abcd/
-    abcd\O0
-Matched, but offsets vector is too small to show all matches
+    abcd\=ovector=0
+ 0: abcd
 
-/-- These tests show up auto-possessification --/
+# These tests show up auto-possessification 
 
 /[ab]*/
     aaaa
@@ -7785,10 +7388,289 @@
     NON QUOTED \"QUOT\"\"ED\" AFTER \"NOT MATCHED
  0: NON QUOTED "QUOT""ED" AFTER 
 
+/abc(?=xyz)/allusedtext
+    abcxyzpqr
+ 0: abcxyz
+       >>>
+    abcxyzpqr\=aftertext
+ 0: abcxyz
+       >>>
+ 0+ xyzpqr
+    
+/(?<=pqr)abc(?=xyz)/allusedtext
+    xyzpqrabcxyzpqr
+ 0: pqrabcxyz
+    <<<   >>>
+    xyzpqrabcxyzpqr\=aftertext
+ 0: pqrabcxyz
+    <<<   >>>
+ 0+ xyzpqr
+    
+/a\b/
+    a.\=allusedtext
+ 0: a.
+     >
+    a\=allusedtext  
+ 0: a
+
+/abc(?=abcde)(?=ab)/allusedtext
+    abcabcdefg
+ 0: abcabcde
+       >>>>>
+
+/a*?b*?/
+    ab
+ 0: ab
+ 1: a
+ 2: 
+
+/(*NOTEMPTY)a*?b*?/
+    ab
+ 0: ab
+ 1: a
+    ba
+ 0: b
+    cb  
+ 0: b
+
+/(*NOTEMPTY_ATSTART)a*?b*?/aftertext
+    ab
+ 0: ab
+ 0+ 
+ 1: a
+    cdab 
+ 0: 
+ 0+ dab
+
+/(a)(b)|(c)/
+    XcX\=ovector=2,get=1,get=2,get=3,get=4,getall
+ 0: c
+Get substring 1 failed (-55): requested value is not set
+Get substring 2 failed (-54): requested value is not available
+Get substring 3 failed (-54): requested value is not available
+Get substring 4 failed (-54): requested value is not available
+ 0L c
+
+/(?<A>aa)/
+    aa\=get=A
+ 0: aa
+Get substring 'A' failed (-41): function is not supported for DFA matching
+    aa\=copy=A 
+ 0: aa
+Copy substring 'A' failed (-41): function is not supported for DFA matching
+
+/a+/no_auto_possess
+    a\=ovector=2,get=1,get=2,getall
+ 0: a
+Get substring 1 failed (-55): requested value is not set
+Get substring 2 failed (-54): requested value is not available
+ 0L a
+    aaa\=ovector=2,get=1,get=2,getall
+Matched, but offsets vector is too small to show all matches
+ 0: aaa
+ 1: aa
+ 1G aa (2)
+Get substring 2 failed (-54): requested value is not available
+ 0L aaa
+ 1L aa
+
+/a(b)c(d)/
+    abc\=ph,copy=0,copy=1,getall
+Partial match: abc
+ 0C abc (3)
+Copy substring 1 failed (-2): partial match
+get substring list failed (-2): partial match
+
+/ab(?C" any text with spaces ")cde/B
+------------------------------------------------------------------
+        Bra
+        ab
+        CalloutStr " any text with spaces " 6 30 1
+        cde
+        Ket
+        End
+------------------------------------------------------------------
+    abcde
+Callout (6): " any text with spaces "
+--->abcde
+    ^ ^       c
+ 0: abcde
+    12abcde
+Callout (6): " any text with spaces "
+--->12abcde
+      ^ ^       c
+ 0: abcde
+
+/^a(b)c(?C1)def/
+      abcdef
+--->abcdef
+  1 ^  ^       d
+ 0: abcdef
+
+/^a(b)c(?C"AB")def/
+      abcdef
+Callout (10): "AB"
+--->abcdef
+    ^  ^       d
+ 0: abcdef
+
+/^a(b)c(?C1)def/
+      abcdef\=callout_capture
+Callout 1: last capture = 0
+ 0: 
+--->abcdef
+    ^  ^       d
+ 0: abcdef
+
+/^a(b)c(?C{AB})def/B
+------------------------------------------------------------------
+        Bra
+        ^
+        a
+        CBra 1
+        b
+        Ket
+        c
+        CalloutStr {AB} 10 14 1
+        def
+        Ket
+        End
+------------------------------------------------------------------
+      abcdef\=callout_capture
+Callout (10): {AB} last capture = 0
+ 0: 
+--->abcdef
+    ^  ^       d
+ 0: abcdef
+
+/^(?(?C25)(?=abc)abcd|xyz)/B
+------------------------------------------------------------------
+        Bra
+        ^
+        Cond
+        Callout 25 9 7
+        Assert
+        abc
+        Ket
+        abcd
+        Alt
+        xyz
+        Ket
+        Ket
+        End
+------------------------------------------------------------------
+    abcdefg
+--->abcdefg
+ 25 ^           (?=abc)
+ 0: abcd
+    xyz123 
+--->xyz123
+ 25 ^          (?=abc)
+ 0: xyz
+
+/^(?(?C$abc$)(?=abc)abcd|xyz)/B
+------------------------------------------------------------------
+        Bra
+        ^
+        Cond
+        CalloutStr $abc$ 7 12 7
+        Assert
+        abc
+        Ket
+        abcd
+        Alt
+        xyz
+        Ket
+        Ket
+        End
+------------------------------------------------------------------
+    abcdefg
+Callout (7): $abc$
+--->abcdefg
+    ^           (?=abc)
+ 0: abcd
+    xyz123 
+Callout (7): $abc$
+--->xyz123
+    ^          (?=abc)
+ 0: xyz
+
+/^ab(?C'first')cd(?C"second")ef/
+    abcdefg
+Callout (7): 'first'
+--->abcdefg
+    ^ ^         c
+Callout (20): "second"
+--->abcdefg
+    ^   ^       e
+ 0: abcdef
+
+/(?:a(?C`code`)){3}X/
+    aaaXY
+Callout (8): `code`
+--->aaaXY
+    ^^        )
+Callout (8): `code`
+--->aaaXY
+    ^ ^       )
+Callout (8): `code`
+--->aaaXY
+    ^  ^      )
+ 0: aaaX
+
+# Binary zero in callout string
+#  a  (  ?  C  '  x     z  '  )  b
+/ 61 28 3f 43 27 78 00 7a 27 29 62/hex
+    abcdefgh
+Callout (5): 'x\x00z'
+--->abcdefgh
+    ^^           b
+ 0: ab
+
 /(?(?!)a|b)/
     bbb
  0: b
+\= Expect no match
     aaa 
 No match
 
-/-- End of testinput8 --/
+/^/gm
+    \n\n\n
+ 0: 
+ 0: 
+ 0: 
+
+/^/gm,alt_circumflex
+    \n\n\n
+ 0: 
+ 0: 
+ 0: 
+ 0: 
+
+/abc/use_offset_limit
+    1234abcde\=offset_limit=100
+ 0: abc
+    1234abcde\=offset_limit=9
+ 0: abc
+    1234abcde\=offset_limit=4
+ 0: abc
+    1234abcde\=offset_limit=4,offset=4
+ 0: abc
+\= Expect no match
+    1234abcde\=offset_limit=4,offset=5
+No match
+    1234abcde\=offset_limit=3
+No match
+
+/(?<=abc)/use_offset_limit
+    1234abc\=offset_limit=7
+ 0: 
+\= Expect no match
+    1234abc\=offset_limit=6
+No match
+
+/abcd/null_context
+    abcd\=null_context
+ 0: abcd
+
+# End of testinput6
diff --git a/dist2/testdata/testoutput7 b/dist2/testdata/testoutput7
new file mode 100644
index 0000000..f804185
--- /dev/null
+++ b/dist2/testdata/testoutput7
@@ -0,0 +1,3542 @@
+# This set of tests checks UTF and Unicode property support with the DFA
+# matching functionality of pcre_dfa_match(). A default subject modifier is
+# used to force DFA matching for all tests.
+
+#subject dfa
+#newline_default LF any anyCRLF
+
+/\x{100}ab/utf
+  \x{100}ab
+ 0: \x{100}ab
+  
+/a\x{100}*b/utf
+    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/utf
+    a\x{100}b  
+ 0: a\x{100}b
+    a\x{100}\x{100}b  
+ 0: a\x{100}\x{100}b
+\= Expect no match 
+    ab
+No match
+     
+/\bX/utf
+    Xoanon
+ 0: X
+    +Xoanon
+ 0: X
+    \x{300}Xoanon 
+ 0: X
+\= Expect no match 
+    YXoanon  
+No match
+    
+/\BX/utf
+    YXoanon
+ 0: X
+\= Expect no match
+    Xoanon
+No match
+    +Xoanon    
+No match
+    \x{300}Xoanon 
+No match
+
+/X\b/utf
+    X+oanon
+ 0: X
+    ZX\x{300}oanon 
+ 0: X
+    FAX 
+ 0: X
+\= Expect no match 
+    Xoanon  
+No match
+    
+/X\B/utf
+    Xoanon  
+ 0: X
+\= Expect no match
+    X+oanon
+No match
+    ZX\x{300}oanon 
+No match
+    FAX 
+No match
+    
+/[^a]/utf
+    abcd
+ 0: b
+    a\x{100}   
+ 0: \x{100}
+
+/^[abc\x{123}\x{400}-\x{402}]{2,3}\d/utf
+    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
+\= Expect 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
+
+/a.b/utf
+    acb
+ 0: acb
+    a\x7fb
+ 0: a\x{7f}b
+    a\x{100}b 
+ 0: a\x{100}b
+\= Expect no match
+    a\nb  
+No match
+
+/a(.{3})b/utf
+    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
+\= Expect 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(.*?)(.)/utf
+    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(.*)(.)/utf
+    a\x{100}b
+ 0: a\x{100}b
+ 1: a\x{100}
+
+/a(.)(.)/
+    a\xc0\x92bcd
+ 0: a\xc0\x92
+
+/a(.)(.)/utf
+    a\x{240}bcd
+ 0: a\x{240}b
+
+/a(.?)(.)/
+    a\xc0\x92bcd
+ 0: a\xc0\x92
+ 1: a\xc0
+
+/a(.?)(.)/utf
+    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(.??)(.)/utf
+    a\x{240}bcd
+ 0: a\x{240}b
+ 1: a\x{240}
+
+/a(.{3})b/utf
+    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
+\= Expect no match
+    a\x{1234}b 
+No match
+    ac\ncb 
+No match
+
+/a(.{3,})b/utf
+    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
+\= Expect no match
+    a\x{1234}b 
+No match
+
+/a(.{3,}?)b/utf
+    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
+\= Expect no match
+    a\x{1234}b 
+No match
+
+/a(.{3,5})b/utf
+    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
+\= Expect no match
+    a\x{1234}b 
+No match
+    axxxxxxbcdefghijb 
+No match
+
+/a(.{3,5}?)b/utf
+    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
+\= Expect no match
+    a\x{1234}b 
+No match
+    axxxxxxbcdefghijb 
+No match
+
+/^[a\x{c0}]/utf
+\= Expect no match
+    \x{100}
+No match
+
+/(?<=aXb)cd/utf
+    aXbcd
+ 0: cd
+
+/(?<=a\x{100}b)cd/utf
+    a\x{100}bcd
+ 0: cd
+
+/(?<=a\x{100000}b)cd/utf
+    a\x{100000}bcd
+ 0: cd
+    
+/(?:\x{100}){3}b/utf
+    \x{100}\x{100}\x{100}b
+ 0: \x{100}\x{100}\x{100}b
+\= Expect no match 
+    \x{100}\x{100}b
+No match
+
+/\x{ab}/utf
+    \x{ab} 
+ 0: \x{ab}
+    \xc2\xab
+ 0: \x{ab}
+\= Expect no match 
+    \x00{ab}
+No match
+
+/(?<=(.))X/utf
+    WXYZ
+ 0: X
+    \x{256}XYZ 
+ 0: X
+\= Expect no match
+    XYZ 
+No match
+
+/[^a]+/g,utf
+    bcd
+ 0: bcd
+    \x{100}aY\x{256}Z 
+ 0: \x{100}
+ 0: Y\x{256}Z
+    
+/^[^a]{2}/utf
+    \x{100}bc
+ 0: \x{100}b
+ 
+/^[^a]{2,}/utf
+    \x{100}bcAa
+ 0: \x{100}bcA
+
+/^[^a]{2,}?/utf
+    \x{100}bca
+ 0: \x{100}bc
+ 1: \x{100}b
+
+/[^a]+/gi,utf
+    bcd
+ 0: bcd
+    \x{100}aY\x{256}Z 
+ 0: \x{100}
+ 0: Y\x{256}Z
+    
+/^[^a]{2}/i,utf
+    \x{100}bc
+ 0: \x{100}b
+ 
+/^[^a]{2,}/i,utf
+    \x{100}bcAa
+ 0: \x{100}bc
+
+/^[^a]{2,}?/i,utf
+    \x{100}bca
+ 0: \x{100}bc
+ 1: \x{100}b
+
+/\x{100}{0,0}/utf
+    abcd
+ 0: 
+ 
+/\x{100}?/utf
+    abcd
+ 0: 
+    \x{100}\x{100} 
+ 0: \x{100}
+
+/\x{100}{0,3}/utf
+    \x{100}\x{100} 
+ 0: \x{100}\x{100}
+    \x{100}\x{100}\x{100}\x{100} 
+ 0: \x{100}\x{100}\x{100}
+    
+/\x{100}*/utf
+    abce
+ 0: 
+    \x{100}\x{100}\x{100}\x{100} 
+ 0: \x{100}\x{100}\x{100}\x{100}
+
+/\x{100}{1,1}/utf
+    abcd\x{100}\x{100}\x{100}\x{100} 
+ 0: \x{100}
+
+/\x{100}{1,3}/utf
+    abcd\x{100}\x{100}\x{100}\x{100} 
+ 0: \x{100}\x{100}\x{100}
+
+/\x{100}+/utf
+    abcd\x{100}\x{100}\x{100}\x{100} 
+ 0: \x{100}\x{100}\x{100}\x{100}
+
+/\x{100}{3}/utf
+    abcd\x{100}\x{100}\x{100}XX
+ 0: \x{100}\x{100}\x{100}
+
+/\x{100}{3,5}/utf
+    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}{3,}/utf,no_auto_possess
+    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/utf
+    Xyyya\x{100}\x{100}bXzzz
+ 0: X
+
+/\D*/utf,no_auto_possess
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+Matched, but offsets vector is too small to show all 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
+
+/\D*/utf,no_auto_possess
+  \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\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 offsets vector is too small to show all 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}
+
+/\D/utf
+    1X2
+ 0: X
+    1\x{100}2 
+ 0: \x{100}
+  
+/>\S/utf
+    > >X Y
+ 0: >X
+    > >\x{100} Y
+ 0: >\x{100}
+  
+/\d/utf
+    \x{100}3
+ 0: 3
+    
+/\s/utf
+    \x{100} X
+ 0:  
+    
+/\D+/utf
+    12abcd34
+ 0: abcd
+\= Expect no match
+    1234  
+No match
+
+/\D{2,3}/utf
+    12abcd34
+ 0: abc
+    12ab34
+ 0: ab
+\= Expect no match  
+    1234
+No match
+    12a34  
+No match
+
+/\D{2,3}?/utf
+    12abcd34
+ 0: abc
+ 1: ab
+    12ab34
+ 0: ab
+\= Expect no match  
+    1234
+No match
+    12a34  
+No match
+
+/\d+/utf
+    12abcd34
+ 0: 12
+
+/\d{2,3}/utf
+    12abcd34
+ 0: 12
+    1234abcd
+ 0: 123
+\= Expect no match  
+    1.4 
+No match
+
+/\d{2,3}?/utf
+    12abcd34
+ 0: 12
+    1234abcd
+ 0: 123
+ 1: 12
+\= Expect no match  
+    1.4 
+No match
+
+/\S+/utf
+    12abcd34
+ 0: 12abcd34
+\= Expect no match
+    \    \ 
+No match
+
+/\S{2,3}/utf
+    12abcd34
+ 0: 12a
+    1234abcd
+ 0: 123
+\= Expect no match
+    \     \  
+No match
+
+/\S{2,3}?/utf
+    12abcd34
+ 0: 12a
+ 1: 12
+    1234abcd
+ 0: 123
+ 1: 12
+\= Expect no match
+    \     \  
+No match
+
+/>\s+</utf
+    12>      <34
+ 0: >      <
+
+/>\s{2,3}</utf
+    ab>  <cd
+ 0: >  <
+    ab>   <ce
+ 0: >   <
+\= Expect no match
+    ab>    <cd 
+No match
+
+/>\s{2,3}?</utf
+    ab>  <cd
+ 0: >  <
+    ab>   <ce
+ 0: >   <
+\= Expect no match
+    ab>    <cd 
+No match
+
+/\w+/utf
+    12      34
+ 0: 12
+\= Expect no match
+    +++=*! 
+No match
+
+/\w{2,3}/utf
+    ab  cd
+ 0: ab
+    abcd ce
+ 0: abc
+\= Expect no match
+    a.b.c
+No match
+
+/\w{2,3}?/utf
+    ab  cd
+ 0: ab
+    abcd ce
+ 0: abc
+ 1: ab
+\= Expect no match
+    a.b.c
+No match
+
+/\W+/utf
+    12====34
+ 0: ====
+\= Expect no match
+    abcd 
+No match
+
+/\W{2,3}/utf
+    ab====cd
+ 0: ===
+    ab==cd
+ 0: ==
+\= Expect no match
+    a.b.c
+No match
+
+/\W{2,3}?/utf
+    ab====cd
+ 0: ===
+ 1: ==
+    ab==cd
+ 0: ==
+\= Expect no match
+    a.b.c
+No match
+
+/[\x{100}]/utf
+    \x{100}
+ 0: \x{100}
+    Z\x{100}
+ 0: \x{100}
+    \x{100}Z
+ 0: \x{100}
+
+/[Z\x{100}]/utf
+    Z\x{100}
+ 0: Z
+    \x{100}
+ 0: \x{100}
+    \x{100}Z
+ 0: \x{100}
+
+/[\x{100}\x{200}]/utf
+   ab\x{100}cd
+ 0: \x{100}
+   ab\x{200}cd
+ 0: \x{200}
+
+/[\x{100}-\x{200}]/utf
+   ab\x{100}cd
+ 0: \x{100}
+   ab\x{200}cd
+ 0: \x{200}
+   ab\x{111}cd 
+ 0: \x{111}
+
+/[z-\x{200}]/utf
+   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\x{100}\x{200}]/utf
+   ab\x{100}cd
+ 0: \x{100}
+   ab\x{200}cd
+ 0: \x{200}
+   Q? 
+ 0: Q
+
+/[Q\x{100}-\x{200}]/utf
+   ab\x{100}cd
+ 0: \x{100}
+   ab\x{200}cd
+ 0: \x{200}
+   ab\x{111}cd 
+ 0: \x{111}
+   Q? 
+ 0: Q
+
+/[Qz-\x{200}]/utf
+   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
+
+/[\x{100}\x{200}]{1,3}/utf
+   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}
+
+/[\x{100}\x{200}]{1,3}?/utf
+   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}
+
+/[Q\x{100}\x{200}]{1,3}/utf
+   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}
+
+/[Q\x{100}\x{200}]{1,3}?/utf
+   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}
+
+/(?<=[\x{100}\x{200}])X/utf
+    abc\x{200}X
+ 0: X
+    abc\x{100}X 
+ 0: X
+\= Expect no match
+    X  
+No match
+
+/(?<=[Q\x{100}\x{200}])X/utf
+    abc\x{200}X
+ 0: X
+    abc\x{100}X 
+ 0: X
+    abQX 
+ 0: X
+\= Expect no match
+    X  
+No match
+
+/(?<=[\x{100}\x{200}]{3})X/utf
+    abc\x{100}\x{200}\x{100}X
+ 0: X
+\= Expect no match
+    abc\x{200}X
+No match
+    X  
+No match
+
+/[^\x{100}\x{200}]X/utf
+    AX
+ 0: AX
+    \x{150}X
+ 0: \x{150}X
+    \x{500}X 
+ 0: \x{500}X
+\= Expect no match
+    \x{100}X
+No match
+    \x{200}X   
+No match
+
+/[^Q\x{100}\x{200}]X/utf
+    AX
+ 0: AX
+    \x{150}X
+ 0: \x{150}X
+    \x{500}X 
+ 0: \x{500}X
+\= Expect no match
+    \x{100}X
+No match
+    \x{200}X   
+No match
+    QX 
+No match
+
+/[^\x{100}-\x{200}]X/utf
+    AX
+ 0: AX
+    \x{500}X 
+ 0: \x{500}X
+\= Expect no match
+    \x{100}X
+No match
+    \x{150}X
+No match
+    \x{200}X   
+No match
+
+/[z-\x{100}]/i,utf
+    z
+ 0: z
+    Z 
+ 0: Z
+    \x{100}
+ 0: \x{100}
+\= Expect no match
+    \x{102}
+No match
+    y    
+No match
+
+/[\xFF]/
+    >\xff<
+ 0: \xff
+
+/[\xff]/utf
+    >\x{ff}<
+ 0: \x{ff}
+
+/[^\xFF]/
+    XYZ
+ 0: X
+
+/[^\xff]/utf
+    XYZ
+ 0: X
+    \x{123} 
+ 0: \x{123}
+
+/^[ac]*b/utf
+\= Expect no match
+    xb
+No match
+
+/^[ac\x{100}]*b/utf
+\= Expect no match
+    xb
+No match
+
+/^[^x]*b/i,utf
+\= Expect no match
+    xb
+No match
+
+/^[^x]*b/utf
+\= Expect no match
+    xb
+No match
+  
+/^\d*b/utf
+\= Expect no match
+    xb 
+No match
+
+/(|a)/g,utf
+    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}$/i,utf
+    \x{85}
+ 0: \x{85}
+
+/^abc./gmx,newline=any,utf
+    abc1 \x0aabc2 \x0babc3xx \x0cabc4 \x0dabc5xx \x0d\x0aabc6 \x{0085}abc7 \x{2028}abc8 \x{2029}abc9 JUNK
+ 0: abc1
+ 0: abc2
+ 0: abc3
+ 0: abc4
+ 0: abc5
+ 0: abc6
+ 0: abc7
+ 0: abc8
+ 0: abc9
+
+/abc.$/gmx,newline=any,utf
+    abc1\x0a abc2\x0b abc3\x0c abc4\x0d abc5\x0d\x0a abc6\x{0085} abc7\x{2028} abc8\x{2029} abc9
+ 0: abc1
+ 0: abc2
+ 0: abc3
+ 0: abc4
+ 0: abc5
+ 0: abc6
+ 0: abc7
+ 0: abc8
+ 0: abc9
+
+/^a\Rb/bsr=unicode,utf
+    a\nb
+ 0: a\x{0a}b
+    a\rb
+ 0: a\x{0d}b
+    a\r\nb
+ 0: a\x{0d}\x{0a}b
+    a\x0bb
+ 0: a\x{0b}b
+    a\x0cb
+ 0: a\x{0c}b
+    a\x{85}b   
+ 0: a\x{85}b
+    a\x{2028}b 
+ 0: a\x{2028}b
+    a\x{2029}b 
+ 0: a\x{2029}b
+\= Expect no match
+    a\n\rb    
+No match
+
+/^a\R*b/bsr=unicode,utf
+    ab
+ 0: ab
+    a\nb
+ 0: a\x{0a}b
+    a\rb
+ 0: a\x{0d}b
+    a\r\nb
+ 0: a\x{0d}\x{0a}b
+    a\x0bb
+ 0: a\x{0b}b
+    a\x0c\x{2028}\x{2029}b
+ 0: a\x{0c}\x{2028}\x{2029}b
+    a\x{85}b   
+ 0: a\x{85}b
+    a\n\rb    
+ 0: a\x{0a}\x{0d}b
+    a\n\r\x{85}\x0cb 
+ 0: a\x{0a}\x{0d}\x{85}\x{0c}b
+
+/^a\R+b/bsr=unicode,utf
+    a\nb
+ 0: a\x{0a}b
+    a\rb
+ 0: a\x{0d}b
+    a\r\nb
+ 0: a\x{0d}\x{0a}b
+    a\x0bb
+ 0: a\x{0b}b
+    a\x0c\x{2028}\x{2029}b
+ 0: a\x{0c}\x{2028}\x{2029}b
+    a\x{85}b   
+ 0: a\x{85}b
+    a\n\rb    
+ 0: a\x{0a}\x{0d}b
+    a\n\r\x{85}\x0cb 
+ 0: a\x{0a}\x{0d}\x{85}\x{0c}b
+\= Expect no match
+    ab  
+No match
+
+/^a\R{1,3}b/bsr=unicode,utf
+    a\nb
+ 0: a\x{0a}b
+    a\n\rb
+ 0: a\x{0a}\x{0d}b
+    a\n\r\x{85}b
+ 0: a\x{0a}\x{0d}\x{85}b
+    a\r\n\r\nb 
+ 0: a\x{0d}\x{0a}\x{0d}\x{0a}b
+    a\r\n\r\n\r\nb 
+ 0: a\x{0d}\x{0a}\x{0d}\x{0a}\x{0d}\x{0a}b
+    a\n\r\n\rb
+ 0: a\x{0a}\x{0d}\x{0a}\x{0d}b
+    a\n\n\r\nb 
+ 0: a\x{0a}\x{0a}\x{0d}\x{0a}b
+\= Expect no match
+    a\n\n\n\rb
+No match
+    a\r
+No match
+
+/\h+\V?\v{3,4}/utf,no_auto_possess
+    \x09\x20\x{a0}X\x0a\x0b\x0c\x0d\x0a
+ 0: \x{09} \x{a0}X\x{0a}\x{0b}\x{0c}\x{0d}
+ 1: \x{09} \x{a0}X\x{0a}\x{0b}\x{0c}
+
+/\V?\v{3,4}/utf,no_auto_possess
+    \x20\x{a0}X\x0a\x0b\x0c\x0d\x0a
+ 0: X\x{0a}\x{0b}\x{0c}\x{0d}
+ 1: X\x{0a}\x{0b}\x{0c}
+
+/\h+\V?\v{3,4}/utf,no_auto_possess
+    >\x09\x20\x{a0}X\x0a\x0a\x0a<
+ 0: \x{09} \x{a0}X\x{0a}\x{0a}\x{0a}
+
+/\V?\v{3,4}/utf,no_auto_possess
+    >\x09\x20\x{a0}X\x0a\x0a\x0a<
+ 0: X\x{0a}\x{0a}\x{0a}
+
+/\H\h\V\v/utf
+    X X\x0a
+ 0: X X\x{0a}
+    X\x09X\x0b
+ 0: X\x{09}X\x{0b}
+\= Expect no match
+    \x{a0} X\x0a   
+No match
+    
+/\H*\h+\V?\v{3,4}/utf,no_auto_possess
+    \x09\x20\x{a0}X\x0a\x0b\x0c\x0d\x0a
+ 0: \x{09} \x{a0}X\x{0a}\x{0b}\x{0c}\x{0d}
+ 1: \x{09} \x{a0}X\x{0a}\x{0b}\x{0c}
+    \x09\x20\x{a0}\x0a\x0b\x0c\x0d\x0a
+ 0: \x{09} \x{a0}\x{0a}\x{0b}\x{0c}\x{0d}
+ 1: \x{09} \x{a0}\x{0a}\x{0b}\x{0c}
+    \x09\x20\x{a0}\x0a\x0b\x0c
+ 0: \x{09} \x{a0}\x{0a}\x{0b}\x{0c}
+\= Expect no match 
+    \x09\x20\x{a0}\x0a\x0b
+No match
+     
+/\H\h\V\v/utf
+    \x{3001}\x{3000}\x{2030}\x{2028}
+ 0: \x{3001}\x{3000}\x{2030}\x{2028}
+    X\x{180e}X\x{85}
+ 0: X\x{180e}X\x{85}
+\= Expect no match
+    \x{2009} X\x0a   
+No match
+    
+/\H*\h+\V?\v{3,4}/utf,no_auto_possess
+    \x{1680}\x{180e}\x{2007}X\x{2028}\x{2029}\x0c\x0d\x0a
+ 0: \x{1680}\x{180e}\x{2007}X\x{2028}\x{2029}\x{0c}\x{0d}
+ 1: \x{1680}\x{180e}\x{2007}X\x{2028}\x{2029}\x{0c}
+    \x09\x{205f}\x{a0}\x0a\x{2029}\x0c\x{2028}\x0a
+ 0: \x{09}\x{205f}\x{a0}\x{0a}\x{2029}\x{0c}\x{2028}
+ 1: \x{09}\x{205f}\x{a0}\x{0a}\x{2029}\x{0c}
+    \x09\x20\x{202f}\x0a\x0b\x0c
+ 0: \x{09} \x{202f}\x{0a}\x{0b}\x{0c}
+\= Expect no match 
+    \x09\x{200a}\x{a0}\x{2028}\x0b
+No match
+     
+/a\Rb/I,bsr=anycrlf,utf
+Capturing subpattern count = 0
+Options: utf
+\R matches CR, LF, or CRLF
+First code unit = 'a'
+Last code unit = 'b'
+Subject length lower bound = 3
+    a\rb
+ 0: a\x{0d}b
+    a\nb
+ 0: a\x{0a}b
+    a\r\nb
+ 0: a\x{0d}\x{0a}b
+\= Expect no match
+    a\x{85}b
+No match
+    a\x0bb     
+No match
+
+/a\Rb/I,bsr=unicode,utf
+Capturing subpattern count = 0
+Options: utf
+\R matches any Unicode newline
+First code unit = 'a'
+Last code unit = 'b'
+Subject length lower bound = 3
+    a\rb
+ 0: a\x{0d}b
+    a\nb
+ 0: a\x{0a}b
+    a\r\nb
+ 0: a\x{0d}\x{0a}b
+    a\x{85}b
+ 0: a\x{85}b
+    a\x0bb     
+ 0: a\x{0b}b
+    
+/a\R?b/I,bsr=anycrlf,utf
+Capturing subpattern count = 0
+Options: utf
+\R matches CR, LF, or CRLF
+First code unit = 'a'
+Last code unit = 'b'
+Subject length lower bound = 2
+    a\rb
+ 0: a\x{0d}b
+    a\nb
+ 0: a\x{0a}b
+    a\r\nb
+ 0: a\x{0d}\x{0a}b
+\= Expect no match
+    a\x{85}b
+No match
+    a\x0bb     
+No match
+
+/a\R?b/I,bsr=unicode,utf
+Capturing subpattern count = 0
+Options: utf
+\R matches any Unicode newline
+First code unit = 'a'
+Last code unit = 'b'
+Subject length lower bound = 2
+    a\rb
+ 0: a\x{0d}b
+    a\nb
+ 0: a\x{0a}b
+    a\r\nb
+ 0: a\x{0d}\x{0a}b
+    a\x{85}b
+ 0: a\x{85}b
+    a\x0bb     
+ 0: a\x{0b}b
+ 
+/X/newline=any,utf,firstline
+    A\x{1ec5}ABCXYZ
+ 0: X
+
+/abcd*/utf
+    xxxxabcd\=ps
+ 0: abcd
+    xxxxabcd\=ph
+Partial match: abcd
+
+/abcd*/i,utf
+    xxxxabcd\=ps
+ 0: abcd
+    xxxxabcd\=ph
+Partial match: abcd
+    XXXXABCD\=ps
+ 0: ABCD
+    XXXXABCD\=ph
+Partial match: ABCD
+
+/abc\d*/utf
+    xxxxabc1\=ps
+ 0: abc1
+    xxxxabc1\=ph
+Partial match: abc1
+
+/abc[de]*/utf
+    xxxxabcde\=ps
+ 0: abcde
+    xxxxabcde\=ph
+Partial match: abcde
+
+/\bthe cat\b/utf
+    the cat\=ps
+ 0: the cat
+    the cat\=ph
+Partial match: the cat
+
+/./newline=crlf,utf
+    \r\=ps
+ 0: \x{0d}
+    \r\=ph
+Partial match: \x{0d}
+  
+/.{2,3}/newline=crlf,utf
+    \r\=ps
+Partial match: \x{0d}
+    \r\=ph
+Partial match: \x{0d}
+    \r\r\=ps
+ 0: \x{0d}\x{0d}
+    \r\r\=ph
+Partial match: \x{0d}\x{0d}
+    \r\r\r\=ps
+ 0: \x{0d}\x{0d}\x{0d}
+    \r\r\r\=ph
+Partial match: \x{0d}\x{0d}\x{0d}
+
+/.{2,3}?/newline=crlf,utf
+    \r\=ps
+Partial match: \x{0d}
+    \r\=ph
+Partial match: \x{0d}
+    \r\r\=ps
+ 0: \x{0d}\x{0d}
+    \r\r\=ph
+Partial match: \x{0d}\x{0d}
+    \r\r\r\=ps
+ 0: \x{0d}\x{0d}\x{0d}
+ 1: \x{0d}\x{0d}
+    \r\r\r\=ph
+Partial match: \x{0d}\x{0d}\x{0d}
+
+/[^\x{100}]/utf
+    \x{100}\x{101}X
+ 0: \x{101}
+
+/[^\x{100}]+/utf
+    \x{100}\x{101}X
+ 0: \x{101}X
+
+/\pL\P{Nd}/utf
+    AB
+ 0: AB
+\= Expect no match
+    A0
+No match
+    00
+No match
+
+/\X./utf
+    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
+\= Expect no match
+    \x{300}
+No match
+
+/\X\X/utf
+    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
+\= Expect no match
+    \x{300}
+No match
+
+/^\pL+/utf
+    abcd
+ 0: abcd
+    a
+ 0: a
+
+/^\PL+/utf
+    1234
+ 0: 1234
+    =
+ 0: =
+\= Expect no match
+    abcd
+No match
+
+/^\X+/utf
+    abcdA\x{300}\x{301}\x{302}
+ 0: abcdA\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}A\x{300}\x{301}\x{302}
+ 0: A\x{300}\x{301}\x{302}A\x{300}\x{301}\x{302}
+    a
+ 0: a
+    \x{300}\x{301}\x{302}
+ 0: \x{300}\x{301}\x{302}
+
+/\X?abc/utf
+    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: \x{300}abc
+
+/^\X?abc/utf
+    abc
+ 0: abc
+    A\x{300}abc
+ 0: A\x{300}abc
+    \x{300}abc
+ 0: \x{300}abc
+\= Expect no match
+    A\x{300}\x{301}\x{302}A\x{300}A\x{300}A\x{300}abcxyz
+No match
+
+/\X*abc/utf
+    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: \x{300}abc
+
+/^\X*abc/utf
+    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: \x{300}abc
+
+/^\pL?=./utf
+    A=b
+ 0: A=b
+    =c
+ 0: =c
+\= Expect no match
+    1=2
+No match
+    AAAA=b
+No match
+
+/^\pL*=./utf
+    AAAA=b
+ 0: AAAA=b
+    =c
+ 0: =c
+\= Expect no match
+    1=2
+No match
+
+/^\X{2,3}X/utf
+    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
+\= Expect 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</utf
+    \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!$ <
+\= Expect no match
+    ap\x{300}9!\$ <
+No match
+  
+/^\PC/utf
+    X
+ 0: X
+\= Expect no match
+    \x7f
+No match
+  
+/^\PL/utf
+    9
+ 0: 9
+\= Expect no match
+    \x{c0}
+No match
+  
+/^\PM/utf
+    X
+ 0: X
+\= Expect no match
+    \x{30f}
+No match
+  
+/^\PN/utf
+    X
+ 0: X
+\= Expect no match
+    \x{660}
+No match
+  
+/^\PP/utf
+    X
+ 0: X
+\= Expect no match
+    \x{66c}
+No match
+  
+/^\PS/utf
+    X
+ 0: X
+\= Expect no match
+    \x{f01}
+No match
+  
+/^\PZ/utf
+    X
+ 0: X
+\= Expect no match
+    \x{1680}
+No match
+    
+/^\p{Cc}/utf
+    \x{017}
+ 0: \x{17}
+    \x{09f}
+ 0: \x{9f}
+\= Expect no match
+    \x{0600}
+No match
+  
+/^\p{Cf}/utf
+    \x{601}
+ 0: \x{601}
+    \x{180e}
+ 0: \x{180e}
+    \x{061c}
+ 0: \x{61c}
+    \x{2066}
+ 0: \x{2066}
+    \x{2067}
+ 0: \x{2067}
+    \x{2068}
+ 0: \x{2068}
+    \x{2069}
+ 0: \x{2069}
+\= Expect no match
+    \x{09f}
+No match
+  
+/^\p{Cn}/utf
+\= Expect no match
+    \x{09f}
+No match
+  
+/^\p{Co}/utf
+    \x{f8ff}
+ 0: \x{f8ff}
+\= Expect no match
+    \x{09f}
+No match
+  
+/^\p{Cs}/utf
+    \x{dfff}\=no_utf_check
+ 0: \x{dfff}
+\= Expect no match
+    \x{09f}
+No match
+  
+/^\p{Ll}/utf
+    a
+ 0: a
+\= Expect no match
+    Z
+No match
+    \x{e000}
+No match
+  
+/^\p{Lm}/utf
+    \x{2b0}
+ 0: \x{2b0}
+\= Expect no match
+    a
+No match
+  
+/^\p{Lo}/utf
+    \x{1bb}
+ 0: \x{1bb}
+\= Expect no match
+    a
+No match
+    \x{2b0}
+No match
+  
+/^\p{Lt}/utf
+    \x{1c5}
+ 0: \x{1c5}
+\= Expect no match
+    a
+No match
+    \x{2b0}
+No match
+  
+/^\p{Lu}/utf
+    A
+ 0: A
+\= Expect no match
+    \x{2b0}
+No match
+  
+/^\p{Mc}/utf
+    \x{903}
+ 0: \x{903}
+\= Expect no match
+    X
+No match
+    \x{300}
+No match
+       
+/^\p{Me}/utf
+    \x{488}
+ 0: \x{488}
+\= Expect no match
+    X
+No match
+    \x{903}
+No match
+    \x{300}
+No match
+  
+/^\p{Mn}/utf
+    \x{300}
+ 0: \x{300}
+    \x{1a1b}
+ 0: \x{1a1b}
+\= Expect no match
+    X
+No match
+    \x{903}
+No match
+  
+/^\p{Nd}+/utf,no_auto_possess
+    0123456789\x{660}\x{661}\x{662}\x{663}\x{664}\x{665}\x{666}\x{667}\x{668}\x{669}\x{66a}
+Matched, but offsets vector is too small to show all matches
+ 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
+    \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}
+\= Expect no match
+    X
+No match
+  
+/^\p{Nl}/utf
+    \x{16ee}
+ 0: \x{16ee}
+\= Expect no match
+    X
+No match
+    \x{966}
+No match
+  
+/^\p{No}/utf
+    \x{b2}
+ 0: \x{b2}
+    \x{b3}
+ 0: \x{b3}
+\= Expect no match
+    X
+No match
+    \x{16ee}
+No match
+  
+/^\p{Pc}/utf
+    \x5f
+ 0: _
+    \x{203f}
+ 0: \x{203f}
+\= Expect no match
+    X
+No match
+    -
+No match
+    \x{58a}
+No match
+  
+/^\p{Pd}/utf
+    -
+ 0: -
+    \x{58a}
+ 0: \x{58a}
+\= Expect no match
+    X
+No match
+    \x{203f}
+No match
+  
+/^\p{Pe}/utf
+    )
+ 0: )
+    ]
+ 0: ]
+    }
+ 0: }
+    \x{f3b}
+ 0: \x{f3b}
+    \x{2309}
+ 0: \x{2309}
+    \x{230b}
+ 0: \x{230b}
+\= Expect no match
+    X
+No match
+    \x{203f}
+No match
+    (
+No match
+    [
+No match
+    {
+No match
+    \x{f3c}
+No match
+
+/^\p{Pf}/utf
+    \x{bb}
+ 0: \x{bb}
+    \x{2019}
+ 0: \x{2019}
+\= Expect no match
+    X
+No match
+    \x{203f}
+No match
+  
+/^\p{Pi}/utf
+    \x{ab}
+ 0: \x{ab}
+    \x{2018}
+ 0: \x{2018}
+\= Expect no match
+    X
+No match
+    \x{203f}
+No match
+  
+/^\p{Po}/utf
+    !
+ 0: !
+    \x{37e}
+ 0: \x{37e}
+\= Expect no match
+    X
+No match
+    \x{203f}
+No match
+  
+/^\p{Ps}/utf
+    (
+ 0: (
+    [
+ 0: [
+    {
+ 0: {
+    \x{f3c}
+ 0: \x{f3c}
+    \x{2308}
+ 0: \x{2308}
+    \x{230a}
+ 0: \x{230a}
+\= Expect no match
+    X
+No match
+    )
+No match
+    ]
+No match
+    }
+No match
+    \x{f3b}
+No match
+  
+/^\p{Sc}+/utf
+    $\x{a2}\x{a3}\x{a4}\x{a5}\x{a6}
+ 0: $\x{a2}\x{a3}\x{a4}\x{a5}
+    \x{9f2}
+ 0: \x{9f2}
+\= Expect no match
+    X
+No match
+    \x{2c2}
+No match
+  
+/^\p{Sk}/utf
+    \x{2c2}
+ 0: \x{2c2}
+\= Expect no match
+    X
+No match
+    \x{9f2}
+No match
+  
+/^\p{Sm}+/utf
+    +<|~\x{ac}\x{2044}
+ 0: +<|~\x{ac}\x{2044}
+\= Expect no match
+    X
+No match
+    \x{9f2}
+No match
+  
+/^\p{So}/utf
+    \x{a6}
+ 0: \x{a6}
+    \x{482}
+ 0: \x{482}
+\= Expect no match
+    X
+No match
+    \x{9f2}
+No match
+  
+/^\p{Zl}/utf
+    \x{2028}
+ 0: \x{2028}
+\= Expect no match
+    X
+No match
+    \x{2029}
+No match
+  
+/^\p{Zp}/utf
+    \x{2029}
+ 0: \x{2029}
+\= Expect no match
+    X
+No match
+    \x{2028}
+No match
+  
+/^\p{Zs}/utf
+    \ \
+ 0:  
+    \x{a0}
+ 0: \x{a0}
+    \x{1680}
+ 0: \x{1680}
+    \x{2000}
+ 0: \x{2000}
+    \x{2001}
+ 0: \x{2001}
+\= Expect no match
+    \x{2028}
+No match
+    \x{200d}
+No match
+  
+/\p{Nd}+(..)/utf
+      \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}+?(..)/utf
+      \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,}(..)/utf
+      \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,}?(..)/utf
+      \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}*(..)/utf
+      \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}*?(..)/utf
+      \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}(..)/utf
+      \x{660}\x{661}\x{662}ABC
+ 0: \x{660}\x{661}\x{662}A
+  
+/\p{Nd}{2,3}(..)/utf
+      \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}?(..)/utf
+      \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}?(..)/utf
+      \x{660}\x{661}\x{662}ABC
+ 0: \x{660}\x{661}\x{662}
+ 1: \x{660}\x{661}
+  
+/\p{Nd}??(..)/utf
+      \x{660}\x{661}\x{662}ABC
+ 0: \x{660}\x{661}\x{662}
+ 1: \x{660}\x{661}
+  
+/\p{Nd}*+(..)/utf
+      \x{660}\x{661}\x{662}ABC
+ 0: \x{660}\x{661}\x{662}AB
+  
+/\p{Nd}*+(...)/utf
+      \x{660}\x{661}\x{662}ABC
+ 0: \x{660}\x{661}\x{662}ABC
+  
+/\p{Nd}*+(....)/utf
+\= Expect no match
+      \x{660}\x{661}\x{662}ABC
+No match
+  
+/\p{Lu}/i,utf
+    A
+ 0: A
+    a\x{10a0}B
+ 0: \x{10a0}
+\= Expect no match
+    a
+No match
+    \x{1d00}
+No match
+
+/\p{^Lu}/i,utf
+    1234
+ 0: 1
+\= Expect no match
+    ABC
+No match
+
+/\P{Lu}/i,utf
+    1234
+ 0: 1
+\= Expect no match
+    ABC
+No match
+
+/(?<=A\p{Nd})XYZ/utf
+    A2XYZ
+ 0: XYZ
+    123A5XYZPQR
+ 0: XYZ
+    ABA\x{660}XYZpqr
+ 0: XYZ
+\= Expect no match
+    AXYZ
+No match
+    XYZ
+No match
+    
+/(?<!\pL)XYZ/utf
+    1XYZ
+ 0: XYZ
+    AB=XYZ..
+ 0: XYZ
+    XYZ
+ 0: XYZ
+\= Expect no match
+    WXYZ
+No match
+
+/[\p{Nd}]/utf
+    1234
+ 0: 1
+
+/[\p{Nd}+-]+/utf
+    1234
+ 0: 1234
+    12-34
+ 0: 12-34
+    12+\x{661}-34
+ 0: 12+\x{661}-34
+\= Expect no match
+    abcd
+No match
+
+/[\P{Nd}]+/utf
+    abcd
+ 0: abcd
+\= Expect no match
+    1234
+No match
+
+/\D+/utf,no_auto_possess
+    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+Matched, but offsets vector is too small to show all 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
+\= Expect no match
+    11111111111111111111111111111111111111111111111111111111111111111111111
+No match
+     
+/\P{Nd}+/utf,no_auto_possess
+    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+Matched, but offsets vector is too small to show all 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
+\= Expect no match
+    11111111111111111111111111111111111111111111111111111111111111111111111
+No match
+
+/[\D]+/utf,no_auto_possess
+    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+Matched, but offsets vector is too small to show all 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
+\= Expect no match
+    11111111111111111111111111111111111111111111111111111111111111111111111
+No match
+
+/[\P{Nd}]+/utf,no_auto_possess
+    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+Matched, but offsets vector is too small to show all 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
+\= Expect no match
+    11111111111111111111111111111111111111111111111111111111111111111111111
+No match
+
+/[\D\P{Nd}]+/utf,no_auto_possess
+    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+Matched, but offsets vector is too small to show all 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
+\= Expect no match
+    11111111111111111111111111111111111111111111111111111111111111111111111
+No match
+
+/\pL/utf
+    a
+ 0: a
+    A
+ 0: A
+
+/\pL/i,utf
+    a
+ 0: a
+    A
+ 0: A
+    
+/\p{Lu}/utf
+    A
+ 0: A
+    aZ
+ 0: Z
+\= Expect no match
+    abc
+No match
+
+/\p{Lu}/i,utf
+    A
+ 0: A
+    aZ
+ 0: Z
+\= Expect no match
+    abc
+No match
+
+/\p{Ll}/utf
+    a
+ 0: a
+    Az
+ 0: z
+\= Expect no match
+    ABC
+No match
+
+/\p{Ll}/i,utf
+    a
+ 0: a
+    Az
+ 0: z
+\= Expect no match
+    ABC
+No match
+
+/^\x{c0}$/i,utf
+    \x{c0}
+ 0: \x{c0}
+    \x{e0}
+ 0: \x{e0}
+
+/^\x{e0}$/i,utf
+    \x{c0}
+ 0: \x{c0}
+    \x{e0}
+ 0: \x{e0}
+
+/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/utf
+    A\x{391}\x{10427}\x{ff3a}\x{1fb0}
+ 0: A\x{391}\x{10427}\x{ff3a}\x{1fb0}
+\= Expect 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}/i,utf
+    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}+/i,utf
+    \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}(.)/i,utf
+    \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}?(.)/i,utf
+    \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}]/i,utf
+    \x{391}
+ 0: \x{391}
+    \x{ff3a}
+ 0: \x{ff3a}
+    \x{3b1}
+ 0: \x{3b1}
+    \x{ff5a}
+ 0: \x{ff5a}
+    
+/[\x{c0}\x{391}]/i,utf
+    \x{c0}
+ 0: \x{c0}
+    \x{e0}
+ 0: \x{e0}
+
+/[\x{105}-\x{109}]/i,utf
+    \x{104}
+ 0: \x{104}
+    \x{105}
+ 0: \x{105}
+    \x{109}
+ 0: \x{109}
+\= Expect no match
+    \x{100}
+No match
+    \x{10a}
+No match
+    
+/[z-\x{100}]/i,utf
+    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}
+\= Expect no match
+    \x{102}
+No match
+    Y
+No match
+    y
+No match
+
+/[z-\x{100}]/i,utf
+
+/^\X/utf
+    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}
+    \x{300}
+ 0: \x{300}
+
+/^(\X*)C/utf
+    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/utf
+    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*)(.)/utf
+    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*?)(.)/utf
+    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(.)/utf
+\= Expect no match
+    A\x{300}\x{301}\x{302}
+No match
+
+/^\X{2,3}(.)/utf
+    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}?(.)/utf
+    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
+\= Expect no match
+    X
+No match
+    1X
+No match
+    1234X
+No match
+
+/\x{100}/i,utf
+    \x{100}
+ 0: \x{100}
+    \x{101}
+ 0: \x{101}
+    
+/^\p{Han}+/utf
+    \x{2e81}\x{3007}\x{2f804}\x{31a0}
+ 0: \x{2e81}\x{3007}\x{2f804}
+\= Expect no match
+    \x{2e7f}
+No match
+
+/^\P{Katakana}+/utf
+    \x{3105}
+ 0: \x{3105}
+\= Expect no match
+    \x{30ff}
+No match
+
+/^[\p{Arabic}]/utf
+    \x{06e9}
+ 0: \x{6e9}
+    \x{060b}
+ 0: \x{60b}
+\= Expect no match
+    X\x{06e9}
+No match
+
+/^[\P{Yi}]/utf
+    \x{2f800}
+ 0: \x{2f800}
+\= Expect no match
+    \x{a014}
+No match
+    \x{a4c6}
+No match
+
+/^\p{Any}X/utf
+    AXYZ
+ 0: AX
+    \x{1234}XYZ
+ 0: \x{1234}X
+\= Expect no match
+    X
+No match
+    
+/^\P{Any}X/utf
+\= Expect no match
+    AX
+No match
+    
+/^\p{Any}?X/utf
+    XYZ
+ 0: X
+    AXYZ
+ 0: AX
+    \x{1234}XYZ
+ 0: \x{1234}X
+\= Expect no match
+    ABXYZ
+No match
+
+/^\P{Any}?X/utf
+    XYZ
+ 0: X
+\= Expect no match
+    AXYZ
+No match
+    \x{1234}XYZ
+No match
+    ABXYZ
+No match
+
+/^\p{Any}+X/utf
+    AXYZ
+ 0: AX
+    \x{1234}XYZ
+ 0: \x{1234}X
+    A\x{1234}XYZ
+ 0: A\x{1234}X
+\= Expect no match
+    XYZ
+No match
+
+/^\P{Any}+X/utf
+\= Expect no match
+    AXYZ
+No match
+    \x{1234}XYZ
+No match
+    A\x{1234}XYZ
+No match
+    XYZ
+No match
+
+/^\p{Any}*X/utf
+    XYZ
+ 0: X
+    AXYZ
+ 0: AX
+    \x{1234}XYZ
+ 0: \x{1234}X
+    A\x{1234}XYZ
+ 0: A\x{1234}X
+
+/^\P{Any}*X/utf
+    XYZ
+ 0: X
+\= Expect no match
+    AXYZ
+No match
+    \x{1234}XYZ
+No match
+    A\x{1234}XYZ
+No match
+
+/^[\p{Any}]X/utf
+    AXYZ
+ 0: AX
+    \x{1234}XYZ
+ 0: \x{1234}X
+\= Expect no match
+    X
+No match
+    
+/^[\P{Any}]X/utf
+\= Expect no match
+    AX
+No match
+    
+/^[\p{Any}]?X/utf
+    XYZ
+ 0: X
+    AXYZ
+ 0: AX
+    \x{1234}XYZ
+ 0: \x{1234}X
+\= Expect no match
+    ABXYZ
+No match
+
+/^[\P{Any}]?X/utf
+    XYZ
+ 0: X
+\= Expect no match
+    AXYZ
+No match
+    \x{1234}XYZ
+No match
+    ABXYZ
+No match
+
+/^[\p{Any}]+X/utf
+    AXYZ
+ 0: AX
+    \x{1234}XYZ
+ 0: \x{1234}X
+    A\x{1234}XYZ
+ 0: A\x{1234}X
+\= Expect no match
+    XYZ
+No match
+
+/^[\P{Any}]+X/utf
+\= Expect no match
+    AXYZ
+No match
+    \x{1234}XYZ
+No match
+    A\x{1234}XYZ
+No match
+    XYZ
+No match
+
+/^[\p{Any}]*X/utf
+    XYZ
+ 0: X
+    AXYZ
+ 0: AX
+    \x{1234}XYZ
+ 0: \x{1234}X
+    A\x{1234}XYZ
+ 0: A\x{1234}X
+
+/^[\P{Any}]*X/utf
+    XYZ
+ 0: X
+\= Expect no match
+    AXYZ
+No match
+    \x{1234}XYZ
+No match
+    A\x{1234}XYZ
+No match
+
+/^\p{Any}{3,5}?/utf
+    abcdefgh
+ 0: abcde
+ 1: abcd
+ 2: abc
+    \x{1234}\n\r\x{3456}xyz
+ 0: \x{1234}\x{0a}\x{0d}\x{3456}x
+ 1: \x{1234}\x{0a}\x{0d}\x{3456}
+ 2: \x{1234}\x{0a}\x{0d}
+
+/^\p{Any}{3,5}/utf
+    abcdefgh
+ 0: abcde
+    \x{1234}\n\r\x{3456}xyz
+ 0: \x{1234}\x{0a}\x{0d}\x{3456}x
+
+/^\P{Any}{3,5}?/utf
+\= Expect no match
+    abcdefgh
+No match
+    \x{1234}\n\r\x{3456}xyz
+No match
+
+/^\p{L&}X/utf
+     AXY
+ 0: AX
+     aXY
+ 0: aX
+     \x{1c5}XY
+ 0: \x{1c5}X
+\= Expect no match
+     \x{1bb}XY
+No match
+     \x{2b0}XY
+No match
+     !XY
+No match
+
+/^[\p{L&}]X/utf
+     AXY
+ 0: AX
+     aXY
+ 0: aX
+     \x{1c5}XY
+ 0: \x{1c5}X
+\= Expect no match
+     \x{1bb}XY
+No match
+     \x{2b0}XY
+No match
+     !XY
+No match
+
+/^\p{L&}+X/utf
+     AXY
+ 0: AX
+     aXY
+ 0: aX
+     AbcdeXyz
+ 0: AbcdeX
+     \x{1c5}AbXY
+ 0: \x{1c5}AbX
+     abcDEXypqreXlmn
+ 0: abcDEXypqreX
+ 1: abcDEX
+\= Expect no match
+     \x{1bb}XY
+No match
+     \x{2b0}XY
+No match
+     !XY
+No match
+
+/^[\p{L&}]+X/utf
+     AXY
+ 0: AX
+     aXY
+ 0: aX
+     AbcdeXyz
+ 0: AbcdeX
+     \x{1c5}AbXY
+ 0: \x{1c5}AbX
+     abcDEXypqreXlmn
+ 0: abcDEXypqreX
+ 1: abcDEX
+\= Expect no match
+     \x{1bb}XY
+No match
+     \x{2b0}XY
+No match
+     !XY
+No match
+
+/^\p{L&}+?X/utf
+     AXY
+ 0: AX
+     aXY
+ 0: aX
+     AbcdeXyz
+ 0: AbcdeX
+     \x{1c5}AbXY
+ 0: \x{1c5}AbX
+     abcDEXypqreXlmn
+ 0: abcDEXypqreX
+ 1: abcDEX
+\= Expect no match
+     \x{1bb}XY
+No match
+     \x{2b0}XY
+No match
+     !XY
+No match
+
+/^[\p{L&}]+?X/utf
+     AXY
+ 0: AX
+     aXY
+ 0: aX
+     AbcdeXyz
+ 0: AbcdeX
+     \x{1c5}AbXY
+ 0: \x{1c5}AbX
+     abcDEXypqreXlmn
+ 0: abcDEXypqreX
+ 1: abcDEX
+\= Expect no match
+     \x{1bb}XY
+No match
+     \x{2b0}XY
+No match
+     !XY
+No match
+
+/^\P{L&}X/utf
+     !XY
+ 0: !X
+     \x{1bb}XY
+ 0: \x{1bb}X
+     \x{2b0}XY
+ 0: \x{2b0}X
+\= Expect no match
+     \x{1c5}XY
+No match
+     AXY
+No match
+
+/^[\P{L&}]X/utf
+     !XY
+ 0: !X
+     \x{1bb}XY
+ 0: \x{1bb}X
+     \x{2b0}XY
+ 0: \x{2b0}X
+\= Expect no match
+     \x{1c5}XY
+No match
+     AXY
+No match
+
+/^\x{023a}+?(\x{0130}+)/i,utf
+  \x{023a}\x{2c65}\x{0130}
+ 0: \x{23a}\x{2c65}\x{130}
+  
+/^\x{023a}+([^X])/i,utf
+  \x{023a}\x{2c65}X
+ 0: \x{23a}\x{2c65}
+ 
+/\x{c0}+\x{116}+/i,utf
+    \x{c0}\x{e0}\x{116}\x{117}
+ 0: \x{c0}\x{e0}\x{116}\x{117}
+
+/[\x{c0}\x{116}]+/i,utf
+    \x{c0}\x{e0}\x{116}\x{117}
+ 0: \x{c0}\x{e0}\x{116}\x{117}
+
+# Check property support in non-UTF-8 mode
+ 
+/\p{L}{4}/
+    123abcdefg
+ 0: abcd
+    123abc\xc4\xc5zz
+ 0: abc\xc4
+
+/\p{Carian}\p{Cham}\p{Kayah_Li}\p{Lepcha}\p{Lycian}\p{Lydian}\p{Ol_Chiki}\p{Rejang}\p{Saurashtra}\p{Sundanese}\p{Vai}/utf
+    \x{102A4}\x{AA52}\x{A91D}\x{1C46}\x{10283}\x{1092E}\x{1C6B}\x{A93B}\x{A8BF}\x{1BA0}\x{A50A}====
+ 0: \x{102a4}\x{aa52}\x{a91d}\x{1c46}\x{10283}\x{1092e}\x{1c6b}\x{a93b}\x{a8bf}\x{1ba0}\x{a50a}
+
+/\x{a77d}\x{1d79}/i,utf
+    \x{a77d}\x{1d79}
+ 0: \x{a77d}\x{1d79}
+    \x{1d79}\x{a77d}
+ 0: \x{1d79}\x{a77d}
+
+/\x{a77d}\x{1d79}/utf
+    \x{a77d}\x{1d79}
+ 0: \x{a77d}\x{1d79}
+\= Expect no match
+    \x{1d79}\x{a77d}
+No match
+
+/^\p{Xan}/utf
+    ABCD
+ 0: A
+    1234
+ 0: 1
+    \x{6ca}
+ 0: \x{6ca}
+    \x{a6c}
+ 0: \x{a6c}
+    \x{10a7}
+ 0: \x{10a7}
+\= Expect no match
+    _ABC
+No match
+
+/^\p{Xan}+/utf
+    ABCD1234\x{6ca}\x{a6c}\x{10a7}_
+ 0: ABCD1234\x{6ca}\x{a6c}\x{10a7}
+\= Expect no match
+    _ABC
+No match
+
+/^\p{Xan}*/utf
+    ABCD1234\x{6ca}\x{a6c}\x{10a7}_
+ 0: ABCD1234\x{6ca}\x{a6c}\x{10a7}
+    
+/^\p{Xan}{2,9}/utf
+    ABCD1234\x{6ca}\x{a6c}\x{10a7}_
+ 0: ABCD1234\x{6ca}
+    
+/^[\p{Xan}]/utf
+    ABCD1234_
+ 0: A
+    1234abcd_
+ 0: 1
+    \x{6ca}
+ 0: \x{6ca}
+    \x{a6c}
+ 0: \x{a6c}
+    \x{10a7}
+ 0: \x{10a7}
+\= Expect no match
+    _ABC
+No match
+ 
+/^[\p{Xan}]+/utf
+    ABCD1234\x{6ca}\x{a6c}\x{10a7}_
+ 0: ABCD1234\x{6ca}\x{a6c}\x{10a7}
+\= Expect no match
+    _ABC
+No match
+
+/^>\p{Xsp}/utf
+    >\x{1680}\x{2028}\x{0b}
+ 0: >\x{1680}
+\= Expect no match
+    \x{0b}
+No match
+
+/^>\p{Xsp}+/utf,no_auto_possess
+    > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b}
+ 0: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b}
+ 1: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}
+ 2: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}
+ 3: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}
+ 4: > \x{09}\x{0a}\x{0c}\x{0d}
+ 5: > \x{09}\x{0a}\x{0c}
+ 6: > \x{09}\x{0a}
+ 7: > \x{09}
+ 8: > 
+
+/^>\p{Xsp}*/utf,no_auto_possess
+    > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b}
+ 0: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b}
+ 1: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}
+ 2: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}
+ 3: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}
+ 4: > \x{09}\x{0a}\x{0c}\x{0d}
+ 5: > \x{09}\x{0a}\x{0c}
+ 6: > \x{09}\x{0a}
+ 7: > \x{09}
+ 8: > 
+ 9: >
+    
+/^>\p{Xsp}{2,9}/utf,no_auto_possess
+    > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b}
+ 0: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b}
+ 1: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}
+ 2: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}
+ 3: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}
+ 4: > \x{09}\x{0a}\x{0c}\x{0d}
+ 5: > \x{09}\x{0a}\x{0c}
+ 6: > \x{09}\x{0a}
+ 7: > \x{09}
+    
+/^>[\p{Xsp}]/utf,no_auto_possess
+    >\x{2028}\x{0b}
+ 0: >\x{2028}
+ 
+/^>[\p{Xsp}]+/utf,no_auto_possess
+    > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b}
+ 0: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b}
+ 1: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}
+ 2: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}
+ 3: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}
+ 4: > \x{09}\x{0a}\x{0c}\x{0d}
+ 5: > \x{09}\x{0a}\x{0c}
+ 6: > \x{09}\x{0a}
+ 7: > \x{09}
+ 8: > 
+
+/^>\p{Xps}/utf
+    >\x{1680}\x{2028}\x{0b}
+ 0: >\x{1680}
+    >\x{a0}
+ 0: >\x{a0}
+\= Expect no match
+    \x{0b}
+No match
+
+/^>\p{Xps}+/utf
+    > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b}
+ 0: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b}
+
+/^>\p{Xps}+?/utf
+    >\x{1680}\x{2028}\x{0b}
+ 0: >\x{1680}\x{2028}\x{0b}
+ 1: >\x{1680}\x{2028}
+ 2: >\x{1680}
+
+/^>\p{Xps}*/utf
+    > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b}
+ 0: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b}
+    
+/^>\p{Xps}{2,9}/utf
+    > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b}
+ 0: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b}
+    
+/^>\p{Xps}{2,9}?/utf
+    > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b}
+ 0: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b}
+ 1: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}
+ 2: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}
+ 3: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}
+ 4: > \x{09}\x{0a}\x{0c}\x{0d}
+ 5: > \x{09}\x{0a}\x{0c}
+ 6: > \x{09}\x{0a}
+ 7: > \x{09}
+    
+/^>[\p{Xps}]/utf
+    >\x{2028}\x{0b}
+ 0: >\x{2028}
+ 
+/^>[\p{Xps}]+/utf
+    > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b}
+ 0: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b}
+
+/^\p{Xwd}/utf
+    ABCD
+ 0: A
+    1234
+ 0: 1
+    \x{6ca}
+ 0: \x{6ca}
+    \x{a6c}
+ 0: \x{a6c}
+    \x{10a7}
+ 0: \x{10a7}
+    _ABC
+ 0: _
+\= Expect no match
+    []
+No match
+
+/^\p{Xwd}+/utf
+    ABCD1234\x{6ca}\x{a6c}\x{10a7}_
+ 0: ABCD1234\x{6ca}\x{a6c}\x{10a7}_
+
+/^\p{Xwd}*/utf
+    ABCD1234\x{6ca}\x{a6c}\x{10a7}_
+ 0: ABCD1234\x{6ca}\x{a6c}\x{10a7}_
+    
+/^\p{Xwd}{2,9}/utf
+    A_12\x{6ca}\x{a6c}\x{10a7}
+ 0: A_12\x{6ca}\x{a6c}\x{10a7}
+    
+/^[\p{Xwd}]/utf
+    ABCD1234_
+ 0: A
+    1234abcd_
+ 0: 1
+    \x{6ca}
+ 0: \x{6ca}
+    \x{a6c}
+ 0: \x{a6c}
+    \x{10a7}
+ 0: \x{10a7}
+    _ABC
+ 0: _
+\= Expect no match
+    []
+No match
+ 
+/^[\p{Xwd}]+/utf
+    ABCD1234\x{6ca}\x{a6c}\x{10a7}_
+ 0: ABCD1234\x{6ca}\x{a6c}\x{10a7}_
+
+# Unicode properties for \b abd \B 
+
+/\b...\B/utf,ucp
+    abc_
+ 0: abc
+    \x{37e}abc\x{376}
+ 0: abc
+    \x{37e}\x{376}\x{371}\x{393}\x{394}
+ 0: \x{376}\x{371}\x{393}
+    !\x{c0}++\x{c1}\x{c2}
+ 0: ++\x{c1}
+    !\x{c0}+++++
+ 0: \x{c0}++
+
+# Without PCRE_UCP, non-ASCII always fail, even if < 256  
+
+/\b...\B/utf
+    abc_
+ 0: abc
+\= Expect no match
+    \x{37e}abc\x{376}
+No match
+    \x{37e}\x{376}\x{371}\x{393}\x{394}
+No match
+    !\x{c0}++\x{c1}\x{c2}
+No match
+    !\x{c0}+++++
+No match
+
+# With PCRE_UCP, non-UTF8 chars that are < 256 still check properties  
+
+/\b...\B/ucp
+    abc_
+ 0: abc
+    !\x{c0}++\x{c1}\x{c2}
+ 0: ++\xc1
+    !\x{c0}+++++
+ 0: \xc0++
+    
+# Caseless single negated characters > 127 need UCP support 
+
+/[^\x{100}]/i,utf
+    \x{100}\x{101}X
+ 0: X
+
+/[^\x{100}]+/i,utf
+    \x{100}\x{101}XX
+ 0: XX
+
+/^\X/utf
+    A\=ps
+ 0: A
+    A\=ph
+Partial match: A
+    A\x{300}\x{301}\=ps
+ 0: A\x{300}\x{301}
+    A\x{300}\x{301}\=ph
+Partial match: A\x{300}\x{301}
+    A\x{301}\=ps
+ 0: A\x{301}
+    A\x{301}\=ph
+Partial match: A\x{301}
+    
+/^\X{2,3}/utf
+    A\=ps
+Partial match: A
+    A\=ph
+Partial match: A
+    AA\=ps
+ 0: AA
+    AA\=ph
+Partial match: AA
+    A\x{300}\x{301}\=ps
+Partial match: A\x{300}\x{301}
+    A\x{300}\x{301}\=ph
+Partial match: A\x{300}\x{301}
+    A\x{300}\x{301}A\x{300}\x{301}\=ps
+ 0: A\x{300}\x{301}A\x{300}\x{301}
+    A\x{300}\x{301}A\x{300}\x{301}\=ph
+Partial match: A\x{300}\x{301}A\x{300}\x{301}
+
+/^\X{2}/utf
+    AA\=ps
+ 0: AA
+    AA\=ph
+Partial match: AA
+    A\x{300}\x{301}A\x{300}\x{301}\=ps
+ 0: A\x{300}\x{301}A\x{300}\x{301}
+    A\x{300}\x{301}A\x{300}\x{301}\=ph
+Partial match: A\x{300}\x{301}A\x{300}\x{301}
+    
+/^\X+/utf
+    AA\=ps
+ 0: AA
+    AA\=ph
+Partial match: AA
+
+/^\X+?Z/utf
+    AA\=ps
+Partial match: AA
+    AA\=ph
+Partial match: AA
+
+# These are tests for extended grapheme clusters  
+
+/^\X/utf,aftertext
+    G\x{34e}\x{34e}X
+ 0: G\x{34e}\x{34e}
+ 0+ X
+    \x{34e}\x{34e}X
+ 0: \x{34e}\x{34e}
+ 0+ X
+    \x04X
+ 0: \x{04}
+ 0+ X
+    \x{1100}X
+ 0: \x{1100}
+ 0+ X
+    \x{1100}\x{34e}X
+ 0: \x{1100}\x{34e}
+ 0+ X
+    \x{1b04}\x{1b04}X
+ 0: \x{1b04}\x{1b04}
+ 0+ X
+\= These match up to the roman letters
+    \x{1111}\x{1111}L,L
+ 0: \x{1111}\x{1111}
+ 0+ L,L
+    \x{1111}\x{1111}\x{1169}L,L,V
+ 0: \x{1111}\x{1111}\x{1169}
+ 0+ L,L,V
+    \x{1111}\x{ae4c}L, LV
+ 0: \x{1111}\x{ae4c}
+ 0+ L, LV
+    \x{1111}\x{ad89}L, LVT
+ 0: \x{1111}\x{ad89}
+ 0+ L, LVT
+    \x{1111}\x{ae4c}\x{1169}L, LV, V
+ 0: \x{1111}\x{ae4c}\x{1169}
+ 0+ L, LV, V
+    \x{1111}\x{ae4c}\x{1169}\x{1169}L, LV, V, V
+ 0: \x{1111}\x{ae4c}\x{1169}\x{1169}
+ 0+ L, LV, V, V
+    \x{1111}\x{ae4c}\x{1169}\x{11fe}L, LV, V, T
+ 0: \x{1111}\x{ae4c}\x{1169}\x{11fe}
+ 0+ L, LV, V, T
+    \x{1111}\x{ad89}\x{11fe}L, LVT, T
+ 0: \x{1111}\x{ad89}\x{11fe}
+ 0+ L, LVT, T
+    \x{1111}\x{ad89}\x{11fe}\x{11fe}L, LVT, T, T
+ 0: \x{1111}\x{ad89}\x{11fe}\x{11fe}
+ 0+ L, LVT, T, T
+    \x{ad89}\x{11fe}\x{11fe}LVT, T, T
+ 0: \x{ad89}\x{11fe}\x{11fe}
+ 0+ LVT, T, T
+\= These match just the first codepoint (invalid sequence)
+    \x{1111}\x{11fe}L, T
+ 0: \x{1111}
+ 0+ \x{11fe}L, T
+    \x{ae4c}\x{1111}LV, L
+ 0: \x{ae4c}
+ 0+ \x{1111}LV, L
+    \x{ae4c}\x{ae4c}LV, LV
+ 0: \x{ae4c}
+ 0+ \x{ae4c}LV, LV
+    \x{ae4c}\x{ad89}LV, LVT
+ 0: \x{ae4c}
+ 0+ \x{ad89}LV, LVT
+    \x{1169}\x{1111}V, L
+ 0: \x{1169}
+ 0+ \x{1111}V, L
+    \x{1169}\x{ae4c}V, LV
+ 0: \x{1169}
+ 0+ \x{ae4c}V, LV
+    \x{1169}\x{ad89}V, LVT
+ 0: \x{1169}
+ 0+ \x{ad89}V, LVT
+    \x{ad89}\x{1111}LVT, L
+ 0: \x{ad89}
+ 0+ \x{1111}LVT, L
+    \x{ad89}\x{1169}LVT, V
+ 0: \x{ad89}
+ 0+ \x{1169}LVT, V
+    \x{ad89}\x{ae4c}LVT, LV
+ 0: \x{ad89}
+ 0+ \x{ae4c}LVT, LV
+    \x{ad89}\x{ad89}LVT, LVT
+ 0: \x{ad89}
+ 0+ \x{ad89}LVT, LVT
+    \x{11fe}\x{1111}T, L
+ 0: \x{11fe}
+ 0+ \x{1111}T, L
+    \x{11fe}\x{1169}T, V
+ 0: \x{11fe}
+ 0+ \x{1169}T, V
+    \x{11fe}\x{ae4c}T, LV
+ 0: \x{11fe}
+ 0+ \x{ae4c}T, LV
+    \x{11fe}\x{ad89}T, LVT
+ 0: \x{11fe}
+ 0+ \x{ad89}T, LVT
+\= Test extend and spacing mark
+    \x{1111}\x{ae4c}\x{0711}L, LV, extend
+ 0: \x{1111}\x{ae4c}\x{711}
+ 0+ L, LV, extend
+    \x{1111}\x{ae4c}\x{1b04}L, LV, spacing mark
+ 0: \x{1111}\x{ae4c}\x{1b04}
+ 0+ L, LV, spacing mark
+    \x{1111}\x{ae4c}\x{1b04}\x{0711}\x{1b04}L, LV, spacing mark, extend, spacing mark
+ 0: \x{1111}\x{ae4c}\x{1b04}\x{711}\x{1b04}
+ 0+ L, LV, spacing mark, extend, spacing mark
+\= Test CR, LF, and control
+    \x0d\x{0711}CR, extend
+ 0: \x{0d}
+ 0+ \x{711}CR, extend
+    \x0d\x{1b04}CR, spacingmark
+ 0: \x{0d}
+ 0+ \x{1b04}CR, spacingmark
+    \x0a\x{0711}LF, extend
+ 0: \x{0a}
+ 0+ \x{711}LF, extend
+    \x0a\x{1b04}LF, spacingmark
+ 0: \x{0a}
+ 0+ \x{1b04}LF, spacingmark
+    \x0b\x{0711}Control, extend
+ 0: \x{0b}
+ 0+ \x{711}Control, extend
+    \x09\x{1b04}Control, spacingmark
+ 0: \x{09}
+ 0+ \x{1b04}Control, spacingmark
+\= There are no Prepend characters, so we can't test Prepend, CR
+    
+/^(?>\X{2})X/utf,aftertext
+    \x{1111}\x{ae4c}\x{1111}\x{ae4c}X
+ 0: \x{1111}\x{ae4c}\x{1111}\x{ae4c}X
+ 0+ 
+    
+/^\X{2,4}X/utf,aftertext
+    \x{1111}\x{ae4c}\x{1111}\x{ae4c}X
+ 0: \x{1111}\x{ae4c}\x{1111}\x{ae4c}X
+ 0+ 
+    \x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}X
+ 0: \x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}X
+ 0+ 
+    \x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}X
+ 0: \x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}X
+ 0+ 
+
+/^\X{2,4}?X/utf,aftertext
+    \x{1111}\x{ae4c}\x{1111}\x{ae4c}X
+ 0: \x{1111}\x{ae4c}\x{1111}\x{ae4c}X
+ 0+ 
+    \x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}X
+ 0: \x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}X
+ 0+ 
+    \x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}X
+ 0: \x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}X
+ 0+ 
+
+/\x{1e9e}+/i,utf
+    \x{1e9e}\x{00df}
+ 0: \x{1e9e}\x{df}
+
+/[z\x{1e9e}]+/i,utf
+    \x{1e9e}\x{00df}
+ 0: \x{1e9e}\x{df}
+
+/\x{00df}+/i,utf
+    \x{1e9e}\x{00df}
+ 0: \x{1e9e}\x{df}
+
+/[z\x{00df}]+/i,utf
+    \x{1e9e}\x{00df}
+ 0: \x{1e9e}\x{df}
+
+/\x{1f88}+/i,utf
+    \x{1f88}\x{1f80}
+ 0: \x{1f88}\x{1f80}
+
+/[z\x{1f88}]+/i,utf
+    \x{1f88}\x{1f80}
+ 0: \x{1f88}\x{1f80}
+
+# Perl matches these 
+
+/\x{00b5}+/i,utf
+    \x{00b5}\x{039c}\x{03bc}
+ 0: \x{b5}\x{39c}\x{3bc}
+
+/\x{039c}+/i,utf
+    \x{00b5}\x{039c}\x{03bc}
+ 0: \x{b5}\x{39c}\x{3bc}
+
+/\x{03bc}+/i,utf
+    \x{00b5}\x{039c}\x{03bc}
+ 0: \x{b5}\x{39c}\x{3bc}
+
+
+/\x{00c5}+/i,utf
+    \x{00c5}\x{00e5}\x{212b}
+ 0: \x{c5}\x{e5}\x{212b}
+
+/\x{00e5}+/i,utf
+    \x{00c5}\x{00e5}\x{212b}
+ 0: \x{c5}\x{e5}\x{212b}
+
+/\x{212b}+/i,utf
+    \x{00c5}\x{00e5}\x{212b}
+ 0: \x{c5}\x{e5}\x{212b}
+
+/\x{01c4}+/i,utf
+    \x{01c4}\x{01c5}\x{01c6}
+ 0: \x{1c4}\x{1c5}\x{1c6}
+
+/\x{01c5}+/i,utf
+    \x{01c4}\x{01c5}\x{01c6}
+ 0: \x{1c4}\x{1c5}\x{1c6}
+
+/\x{01c6}+/i,utf
+    \x{01c4}\x{01c5}\x{01c6}
+ 0: \x{1c4}\x{1c5}\x{1c6}
+
+/\x{01c7}+/i,utf
+    \x{01c7}\x{01c8}\x{01c9}
+ 0: \x{1c7}\x{1c8}\x{1c9}
+
+/\x{01c8}+/i,utf
+    \x{01c7}\x{01c8}\x{01c9}
+ 0: \x{1c7}\x{1c8}\x{1c9}
+
+/\x{01c9}+/i,utf
+    \x{01c7}\x{01c8}\x{01c9}
+ 0: \x{1c7}\x{1c8}\x{1c9}
+
+
+/\x{01ca}+/i,utf
+    \x{01ca}\x{01cb}\x{01cc}
+ 0: \x{1ca}\x{1cb}\x{1cc}
+
+/\x{01cb}+/i,utf
+    \x{01ca}\x{01cb}\x{01cc}
+ 0: \x{1ca}\x{1cb}\x{1cc}
+
+/\x{01cc}+/i,utf
+    \x{01ca}\x{01cb}\x{01cc}
+ 0: \x{1ca}\x{1cb}\x{1cc}
+
+/\x{01f1}+/i,utf
+    \x{01f1}\x{01f2}\x{01f3}
+ 0: \x{1f1}\x{1f2}\x{1f3}
+
+/\x{01f2}+/i,utf
+    \x{01f1}\x{01f2}\x{01f3}
+ 0: \x{1f1}\x{1f2}\x{1f3}
+
+/\x{01f3}+/i,utf
+    \x{01f1}\x{01f2}\x{01f3}
+ 0: \x{1f1}\x{1f2}\x{1f3}
+
+/\x{0345}+/i,utf
+    \x{0345}\x{0399}\x{03b9}\x{1fbe}
+ 0: \x{345}\x{399}\x{3b9}\x{1fbe}
+
+/\x{0399}+/i,utf
+    \x{0345}\x{0399}\x{03b9}\x{1fbe}
+ 0: \x{345}\x{399}\x{3b9}\x{1fbe}
+
+/\x{03b9}+/i,utf
+    \x{0345}\x{0399}\x{03b9}\x{1fbe}
+ 0: \x{345}\x{399}\x{3b9}\x{1fbe}
+
+/\x{1fbe}+/i,utf
+    \x{0345}\x{0399}\x{03b9}\x{1fbe}
+ 0: \x{345}\x{399}\x{3b9}\x{1fbe}
+
+/\x{0392}+/i,utf
+    \x{0392}\x{03b2}\x{03d0}
+ 0: \x{392}\x{3b2}\x{3d0}
+
+/\x{03b2}+/i,utf
+    \x{0392}\x{03b2}\x{03d0}
+ 0: \x{392}\x{3b2}\x{3d0}
+
+/\x{03d0}+/i,utf
+    \x{0392}\x{03b2}\x{03d0}
+ 0: \x{392}\x{3b2}\x{3d0}
+    
+
+/\x{0395}+/i,utf
+    \x{0395}\x{03b5}\x{03f5}
+ 0: \x{395}\x{3b5}\x{3f5}
+
+/\x{03b5}+/i,utf
+    \x{0395}\x{03b5}\x{03f5}
+ 0: \x{395}\x{3b5}\x{3f5}
+
+/\x{03f5}+/i,utf
+    \x{0395}\x{03b5}\x{03f5}
+ 0: \x{395}\x{3b5}\x{3f5}
+
+/\x{0398}+/i,utf
+    \x{0398}\x{03b8}\x{03d1}\x{03f4}
+ 0: \x{398}\x{3b8}\x{3d1}\x{3f4}
+
+/\x{03b8}+/i,utf
+    \x{0398}\x{03b8}\x{03d1}\x{03f4}
+ 0: \x{398}\x{3b8}\x{3d1}\x{3f4}
+
+/\x{03d1}+/i,utf
+    \x{0398}\x{03b8}\x{03d1}\x{03f4}
+ 0: \x{398}\x{3b8}\x{3d1}\x{3f4}
+
+/\x{03f4}+/i,utf
+    \x{0398}\x{03b8}\x{03d1}\x{03f4}
+ 0: \x{398}\x{3b8}\x{3d1}\x{3f4}
+
+/\x{039a}+/i,utf
+    \x{039a}\x{03ba}\x{03f0}
+ 0: \x{39a}\x{3ba}\x{3f0}
+
+/\x{03ba}+/i,utf
+    \x{039a}\x{03ba}\x{03f0}
+ 0: \x{39a}\x{3ba}\x{3f0}
+
+/\x{03f0}+/i,utf
+    \x{039a}\x{03ba}\x{03f0}
+ 0: \x{39a}\x{3ba}\x{3f0}
+    
+/\x{03a0}+/i,utf
+    \x{03a0}\x{03c0}\x{03d6}
+ 0: \x{3a0}\x{3c0}\x{3d6}
+
+/\x{03c0}+/i,utf
+    \x{03a0}\x{03c0}\x{03d6}
+ 0: \x{3a0}\x{3c0}\x{3d6}
+
+/\x{03d6}+/i,utf
+    \x{03a0}\x{03c0}\x{03d6}
+ 0: \x{3a0}\x{3c0}\x{3d6}
+
+/\x{03a1}+/i,utf
+    \x{03a1}\x{03c1}\x{03f1}
+ 0: \x{3a1}\x{3c1}\x{3f1}
+
+/\x{03c1}+/i,utf
+    \x{03a1}\x{03c1}\x{03f1}
+ 0: \x{3a1}\x{3c1}\x{3f1}
+
+/\x{03f1}+/i,utf
+    \x{03a1}\x{03c1}\x{03f1}
+ 0: \x{3a1}\x{3c1}\x{3f1}
+
+/\x{03a3}+/i,utf
+    \x{03A3}\x{03C2}\x{03C3}
+ 0: \x{3a3}\x{3c2}\x{3c3}
+
+/\x{03c2}+/i,utf
+    \x{03A3}\x{03C2}\x{03C3}
+ 0: \x{3a3}\x{3c2}\x{3c3}
+
+/\x{03c3}+/i,utf
+    \x{03A3}\x{03C2}\x{03C3}
+ 0: \x{3a3}\x{3c2}\x{3c3}
+
+/\x{03a6}+/i,utf
+    \x{03a6}\x{03c6}\x{03d5}
+ 0: \x{3a6}\x{3c6}\x{3d5}
+
+/\x{03c6}+/i,utf
+    \x{03a6}\x{03c6}\x{03d5}
+ 0: \x{3a6}\x{3c6}\x{3d5}
+
+/\x{03d5}+/i,utf
+    \x{03a6}\x{03c6}\x{03d5}
+ 0: \x{3a6}\x{3c6}\x{3d5}
+
+/\x{03c9}+/i,utf
+    \x{03c9}\x{03a9}\x{2126}
+ 0: \x{3c9}\x{3a9}\x{2126}
+
+/\x{03a9}+/i,utf
+    \x{03c9}\x{03a9}\x{2126}
+ 0: \x{3c9}\x{3a9}\x{2126}
+
+/\x{2126}+/i,utf
+    \x{03c9}\x{03a9}\x{2126}
+ 0: \x{3c9}\x{3a9}\x{2126}
+    
+/\x{1e60}+/i,utf
+    \x{1e60}\x{1e61}\x{1e9b}
+ 0: \x{1e60}\x{1e61}\x{1e9b}
+
+/\x{1e61}+/i,utf
+    \x{1e60}\x{1e61}\x{1e9b}
+ 0: \x{1e60}\x{1e61}\x{1e9b}
+
+/\x{1e9b}+/i,utf
+    \x{1e60}\x{1e61}\x{1e9b}
+ 0: \x{1e60}\x{1e61}\x{1e9b}
+    
+/\x{1e9e}+/i,utf
+    \x{1e9e}\x{00df}
+ 0: \x{1e9e}\x{df}
+
+/\x{00df}+/i,utf
+    \x{1e9e}\x{00df}
+ 0: \x{1e9e}\x{df}
+    
+/\x{1f88}+/i,utf
+    \x{1f88}\x{1f80}
+ 0: \x{1f88}\x{1f80}
+
+/\x{1f80}+/i,utf
+    \x{1f88}\x{1f80}
+ 0: \x{1f88}\x{1f80}
+
+/\x{004b}+/i,utf
+    \x{004b}\x{006b}\x{212a}
+ 0: Kk\x{212a}
+
+/\x{006b}+/i,utf
+    \x{004b}\x{006b}\x{212a}
+ 0: Kk\x{212a}
+
+/\x{212a}+/i,utf
+    \x{004b}\x{006b}\x{212a}
+ 0: Kk\x{212a}
+
+/\x{0053}+/i,utf
+    \x{0053}\x{0073}\x{017f}
+ 0: Ss\x{17f}
+
+/\x{0073}+/i,utf
+    \x{0053}\x{0073}\x{017f}
+ 0: Ss\x{17f}
+
+/\x{017f}+/i,utf
+    \x{0053}\x{0073}\x{017f}
+ 0: Ss\x{17f}
+
+/ist/i,utf
+\= Expect no match
+    ikt
+No match
+
+/is+t/i,utf
+    iSs\x{17f}t
+ 0: iSs\x{17f}t
+\= Expect no match
+    ikt
+No match
+
+/is+?t/i,utf
+\= Expect no match
+    ikt
+No match
+
+/is?t/i,utf
+\= Expect no match
+    ikt
+No match
+
+/is{2}t/i,utf
+\= Expect no match
+    iskt
+No match
+
+/^\p{Xuc}/utf
+    $abc
+ 0: $
+    @abc
+ 0: @
+    `abc
+ 0: `
+    \x{1234}abc
+ 0: \x{1234}
+\= Expect no match
+    abc
+No match
+
+/^\p{Xuc}+/utf
+    $@`\x{a0}\x{1234}\x{e000}**
+ 0: $@`\x{a0}\x{1234}\x{e000}
+\= Expect no match
+    \x{9f}
+No match
+
+/^\p{Xuc}+?/utf
+    $@`\x{a0}\x{1234}\x{e000}**
+ 0: $@`\x{a0}\x{1234}\x{e000}
+ 1: $@`\x{a0}\x{1234}
+ 2: $@`\x{a0}
+ 3: $@`
+ 4: $@
+ 5: $
+\= Expect no match
+    \x{9f}
+No match
+
+/^\p{Xuc}+?\*/utf
+    $@`\x{a0}\x{1234}\x{e000}**
+ 0: $@`\x{a0}\x{1234}\x{e000}*
+\= Expect no match
+    \x{9f}
+No match
+
+/^\p{Xuc}++/utf
+    $@`\x{a0}\x{1234}\x{e000}**
+ 0: $@`\x{a0}\x{1234}\x{e000}
+\= Expect no match
+    \x{9f}
+No match
+
+/^\p{Xuc}{3,5}/utf
+    $@`\x{a0}\x{1234}\x{e000}**
+ 0: $@`\x{a0}\x{1234}
+\= Expect no match
+    \x{9f}
+No match
+
+/^\p{Xuc}{3,5}?/utf
+    $@`\x{a0}\x{1234}\x{e000}**
+ 0: $@`\x{a0}\x{1234}
+ 1: $@`\x{a0}
+ 2: $@`
+\= Expect no match
+    \x{9f}
+No match
+
+/^[\p{Xuc}]/utf
+    $@`\x{a0}\x{1234}\x{e000}**
+ 0: $
+\= Expect no match
+    \x{9f}
+No match
+
+/^[\p{Xuc}]+/utf
+    $@`\x{a0}\x{1234}\x{e000}**
+ 0: $@`\x{a0}\x{1234}\x{e000}
+\= Expect no match
+    \x{9f}
+No match
+
+/^\P{Xuc}/utf
+    abc
+ 0: a
+\= Expect no match
+    $abc
+No match
+    @abc
+No match
+    `abc
+No match
+    \x{1234}abc
+No match
+
+/^[\P{Xuc}]/utf
+    abc
+ 0: a
+\= Expect no match
+    $abc
+No match
+    @abc
+No match
+    `abc
+No match
+    \x{1234}abc
+No match
+
+/^A\s+Z/utf,ucp
+    A\x{2005}Z
+ 0: A\x{2005}Z
+    A\x{85}\x{180e}\x{2005}Z
+ 0: A\x{85}\x{180e}\x{2005}Z
+
+/^A[\s]+Z/utf,ucp
+    A\x{2005}Z
+ 0: A\x{2005}Z
+    A\x{85}\x{180e}\x{2005}Z
+ 0: A\x{85}\x{180e}\x{2005}Z
+
+/(?<=\x{100})\x{200}(?=\x{300})/utf,allusedtext
+    \x{100}\x{200}\x{300}
+ 0: \x{100}\x{200}\x{300}
+    <<<<<<<       >>>>>>>
+
+# End of testinput7
diff --git a/dist/testdata/testoutput11-16 b/dist2/testdata/testoutput8-16-2
similarity index 63%
rename from dist/testdata/testoutput11-16
rename to dist2/testdata/testoutput8-16-2
index 9a0a12d..05669bb 100644
--- a/dist/testdata/testoutput11-16
+++ b/dist2/testdata/testoutput8-16-2
@@ -1,10 +1,15 @@
-/-- These are a few representative patterns whose lengths and offsets are to be 
-shown when the link size is 2. This is just a doublecheck test to ensure the 
-sizes don't go horribly wrong when something is changed. The pattern contents 
-are all themselves checked in other tests. Unicode, including property support, 
-is required for these tests. --/
+# There are two sorts of patterns in this test. A number of them are
+# representative patterns whose lengths and offsets are checked. This is just a
+# doublecheck test to ensure the sizes don't go horribly wrong when something
+# is changed. The operation of these patterns is checked in other tests.
+#
+# This file also contains tests whose output varies with code unit size and/or
+# link size. Unicode support is required for these tests. There are separate
+# output files for each code unit size and link size.
 
-/((?i)b)/BM
+#pattern fullbincode,memory
+
+/((?i)b)/
 Memory allocation (code space): 24
 ------------------------------------------------------------------
   0   9 Bra
@@ -15,7 +20,7 @@
  11     End
 ------------------------------------------------------------------
 
-/(?s)(.*X|^B)/BM
+/(?s)(.*X|^B)/
 Memory allocation (code space): 38
 ------------------------------------------------------------------
   0  16 Bra
@@ -30,7 +35,7 @@
  18     End
 ------------------------------------------------------------------
 
-/(?s:.*X|^B)/BM
+/(?s:.*X|^B)/
 Memory allocation (code space): 36
 ------------------------------------------------------------------
   0  15 Bra
@@ -45,7 +50,7 @@
  17     End
 ------------------------------------------------------------------
 
-/^[[:alnum:]]/BM
+/^[[:alnum:]]/
 Memory allocation (code space): 46
 ------------------------------------------------------------------
   0  20 Bra
@@ -55,7 +60,7 @@
  22     End
 ------------------------------------------------------------------
 
-/#/IxMD
+/#/Ix
 Memory allocation (code space): 10
 ------------------------------------------------------------------
   0   2 Bra
@@ -65,10 +70,9 @@
 Capturing subpattern count = 0
 May match empty string
 Options: extended
-No first char
-No need char
+Subject length lower bound = 0
 
-/a#/IxMD
+/a#/Ix
 Memory allocation (code space): 14
 ------------------------------------------------------------------
   0   4 Bra
@@ -78,10 +82,10 @@
 ------------------------------------------------------------------
 Capturing subpattern count = 0
 Options: extended
-First char = 'a'
-No need char
+First code unit = 'a'
+Subject length lower bound = 1
 
-/x?+/BM
+/x?+/
 Memory allocation (code space): 14
 ------------------------------------------------------------------
   0   4 Bra
@@ -90,7 +94,7 @@
   6     End
 ------------------------------------------------------------------
 
-/x++/BM
+/x++/
 Memory allocation (code space): 14
 ------------------------------------------------------------------
   0   4 Bra
@@ -99,7 +103,7 @@
   6     End
 ------------------------------------------------------------------
 
-/x{1,3}+/BM 
+/x{1,3}+/
 Memory allocation (code space): 20
 ------------------------------------------------------------------
   0   7 Bra
@@ -109,7 +113,7 @@
   9     End
 ------------------------------------------------------------------
 
-/(x)*+/BM
+/(x)*+/
 Memory allocation (code space): 26
 ------------------------------------------------------------------
   0  10 Bra
@@ -121,7 +125,7 @@
  12     End
 ------------------------------------------------------------------
 
-/^((a+)(?U)([ab]+)(?-U)([bc]+)(\w*))/BM
+/^((a+)(?U)([ab]+)(?-U)([bc]+)(\w*))/
 Memory allocation (code space): 142
 ------------------------------------------------------------------
   0  68 Bra
@@ -144,7 +148,7 @@
  70     End
 ------------------------------------------------------------------
 
-|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|BM
+"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"
 Memory allocation (code space): 1648
 ------------------------------------------------------------------
   0 821 Bra
@@ -154,7 +158,7 @@
 823     End
 ------------------------------------------------------------------
 
-|\$\<\.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|BM
+"\$\<\.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"
 Memory allocation (code space): 1628
 ------------------------------------------------------------------
   0 811 Bra
@@ -164,7 +168,7 @@
 813     End
 ------------------------------------------------------------------
 
-/(a(?1)b)/BM
+/(a(?1)b)/
 Memory allocation (code space): 32
 ------------------------------------------------------------------
   0  13 Bra
@@ -177,7 +181,7 @@
  15     End
 ------------------------------------------------------------------
 
-/(a(?1)+b)/BM
+/(a(?1)+b)/
 Memory allocation (code space): 40
 ------------------------------------------------------------------
   0  17 Bra
@@ -192,8 +196,8 @@
  19     End
 ------------------------------------------------------------------
 
-/a(?P<name1>b|c)d(?P<longername2>e)/BM
-Memory allocation (code space): 80
+/a(?P<name1>b|c)d(?P<longername2>e)/
+Memory allocation (code space): 54
 ------------------------------------------------------------------
   0  24 Bra
   2     a
@@ -210,8 +214,8 @@
  26     End
 ------------------------------------------------------------------
 
-/(?:a(?P<c>c(?P<d>d)))(?P<a>a)/BM
-Memory allocation (code space): 73
+/(?:a(?P<c>c(?P<d>d)))(?P<a>a)/
+Memory allocation (code space): 64
 ------------------------------------------------------------------
   0  29 Bra
   2  18 Bra
@@ -230,8 +234,8 @@
  31     End
 ------------------------------------------------------------------
 
-/(?P<a>a)...(?P=a)bbb(?P>a)d/BM
-Memory allocation (code space): 77
+/(?P<a>a)...(?P=a)bbb(?P>a)d/
+Memory allocation (code space): 54
 ------------------------------------------------------------------
   0  24 Bra
   2   5 CBra 1
@@ -248,7 +252,7 @@
  26     End
 ------------------------------------------------------------------
 
-/abc(?C255)de(?C)f/BM
+/abc(?C255)de(?C)f/
 Memory allocation (code space): 50
 ------------------------------------------------------------------
   0  22 Bra
@@ -261,7 +265,7 @@
  24     End
 ------------------------------------------------------------------
 
-/abcde/CBM
+/abcde/auto_callout
 Memory allocation (code space): 78
 ------------------------------------------------------------------
   0  36 Bra
@@ -280,7 +284,7 @@
  38     End
 ------------------------------------------------------------------
 
-/\x{100}/8BM
+/\x{100}/utf
 Memory allocation (code space): 14
 ------------------------------------------------------------------
   0   4 Bra
@@ -289,7 +293,7 @@
   6     End
 ------------------------------------------------------------------
 
-/\x{1000}/8BM
+/\x{1000}/utf
 Memory allocation (code space): 14
 ------------------------------------------------------------------
   0   4 Bra
@@ -298,7 +302,7 @@
   6     End
 ------------------------------------------------------------------
 
-/\x{10000}/8BM
+/\x{10000}/utf
 Memory allocation (code space): 16
 ------------------------------------------------------------------
   0   5 Bra
@@ -307,7 +311,7 @@
   7     End
 ------------------------------------------------------------------
 
-/\x{100000}/8BM
+/\x{100000}/utf
 Memory allocation (code space): 16
 ------------------------------------------------------------------
   0   5 Bra
@@ -316,7 +320,7 @@
   7     End
 ------------------------------------------------------------------
 
-/\x{10ffff}/8BM
+/\x{10ffff}/utf
 Memory allocation (code space): 16
 ------------------------------------------------------------------
   0   5 Bra
@@ -325,10 +329,10 @@
   7     End
 ------------------------------------------------------------------
 
-/\x{110000}/8BM
-Failed: character value in \x{} or \o{} is too large at offset 9
+/\x{110000}/utf
+Failed: error 134 at offset 9: character code point value in \x{} or \o{} is too large
 
-/[\x{ff}]/8BM
+/[\x{ff}]/utf
 Memory allocation (code space): 14
 ------------------------------------------------------------------
   0   4 Bra
@@ -337,7 +341,7 @@
   6     End
 ------------------------------------------------------------------
 
-/[\x{100}]/8BM
+/[\x{100}]/utf
 Memory allocation (code space): 14
 ------------------------------------------------------------------
   0   4 Bra
@@ -346,16 +350,16 @@
   6     End
 ------------------------------------------------------------------
 
-/\x80/8BM
+/\x80/utf
 Memory allocation (code space): 14
 ------------------------------------------------------------------
   0   4 Bra
-  2     \x80
+  2     \x{80}
   4   4 Ket
   6     End
 ------------------------------------------------------------------
 
-/\xff/8BM
+/\xff/utf
 Memory allocation (code space): 14
 ------------------------------------------------------------------
   0   4 Bra
@@ -364,7 +368,7 @@
   6     End
 ------------------------------------------------------------------
 
-/\x{0041}\x{2262}\x{0391}\x{002e}/D8M
+/\x{0041}\x{2262}\x{0391}\x{002e}/I,utf
 Memory allocation (code space): 26
 ------------------------------------------------------------------
   0  10 Bra
@@ -374,10 +378,11 @@
 ------------------------------------------------------------------
 Capturing subpattern count = 0
 Options: utf
-First char = 'A'
-Need char = '.'
-    
-/\x{D55c}\x{ad6d}\x{C5B4}/D8M 
+First code unit = 'A'
+Last code unit = '.'
+Subject length lower bound = 4
+
+/\x{D55c}\x{ad6d}\x{C5B4}/I,utf
 Memory allocation (code space): 22
 ------------------------------------------------------------------
   0   8 Bra
@@ -387,10 +392,11 @@
 ------------------------------------------------------------------
 Capturing subpattern count = 0
 Options: utf
-First char = \x{d55c}
-Need char = \x{c5b4}
+First code unit = \x{d55c}
+Last code unit = \x{c5b4}
+Subject length lower bound = 3
 
-/\x{65e5}\x{672c}\x{8a9e}/D8M
+/\x{65e5}\x{672c}\x{8a9e}/I,utf
 Memory allocation (code space): 22
 ------------------------------------------------------------------
   0   8 Bra
@@ -400,10 +406,11 @@
 ------------------------------------------------------------------
 Capturing subpattern count = 0
 Options: utf
-First char = \x{65e5}
-Need char = \x{8a9e}
+First code unit = \x{65e5}
+Last code unit = \x{8a9e}
+Subject length lower bound = 3
 
-/[\x{100}]/8BM
+/[\x{100}]/utf
 Memory allocation (code space): 14
 ------------------------------------------------------------------
   0   4 Bra
@@ -412,7 +419,7 @@
   6     End
 ------------------------------------------------------------------
 
-/[Z\x{100}]/8BM
+/[Z\x{100}]/utf
 Memory allocation (code space): 54
 ------------------------------------------------------------------
   0  24 Bra
@@ -421,7 +428,7 @@
  26     End
 ------------------------------------------------------------------
 
-/^[\x{100}\E-\Q\E\x{150}]/B8M
+/^[\x{100}\E-\Q\E\x{150}]/utf
 Memory allocation (code space): 26
 ------------------------------------------------------------------
   0  10 Bra
@@ -431,7 +438,7 @@
  12     End
 ------------------------------------------------------------------
 
-/^[\QĀ\E-\QŐ\E]/B8M
+/^[\QĀ\E-\QŐ\E]/utf
 Memory allocation (code space): 26
 ------------------------------------------------------------------
   0  10 Bra
@@ -441,10 +448,10 @@
  12     End
 ------------------------------------------------------------------
 
-/^[\QĀ\E-\QŐ\E/B8M
-Failed: missing terminating ] for character class at offset 13
+/^[\QĀ\E-\QŐ\E/utf
+Failed: error 106 at offset 13: missing terminating ] for character class
 
-/[\p{L}]/BM
+/[\p{L}]/
 Memory allocation (code space): 24
 ------------------------------------------------------------------
   0   9 Bra
@@ -453,7 +460,7 @@
  11     End
 ------------------------------------------------------------------
 
-/[\p{^L}]/BM
+/[\p{^L}]/
 Memory allocation (code space): 24
 ------------------------------------------------------------------
   0   9 Bra
@@ -462,7 +469,7 @@
  11     End
 ------------------------------------------------------------------
 
-/[\P{L}]/BM
+/[\P{L}]/
 Memory allocation (code space): 24
 ------------------------------------------------------------------
   0   9 Bra
@@ -471,7 +478,7 @@
  11     End
 ------------------------------------------------------------------
 
-/[\P{^L}]/BM
+/[\P{^L}]/
 Memory allocation (code space): 24
 ------------------------------------------------------------------
   0   9 Bra
@@ -480,7 +487,7 @@
  11     End
 ------------------------------------------------------------------
 
-/[abc\p{L}\x{0660}]/8BM
+/[abc\p{L}\x{0660}]/utf
 Memory allocation (code space): 60
 ------------------------------------------------------------------
   0  27 Bra
@@ -489,7 +496,7 @@
  29     End
 ------------------------------------------------------------------
 
-/[\p{Nd}]/8BM
+/[\p{Nd}]/utf
 Memory allocation (code space): 24
 ------------------------------------------------------------------
   0   9 Bra
@@ -498,7 +505,7 @@
  11     End
 ------------------------------------------------------------------
 
-/[\p{Nd}+-]+/8BM
+/[\p{Nd}+-]+/utf
 Memory allocation (code space): 58
 ------------------------------------------------------------------
   0  26 Bra
@@ -507,7 +514,7 @@
  28     End
 ------------------------------------------------------------------
 
-/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/8iBM
+/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/i,utf
 Memory allocation (code space): 32
 ------------------------------------------------------------------
   0  13 Bra
@@ -516,7 +523,7 @@
  15     End
 ------------------------------------------------------------------
 
-/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/8BM
+/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/utf
 Memory allocation (code space): 32
 ------------------------------------------------------------------
   0  13 Bra
@@ -525,7 +532,7 @@
  15     End
 ------------------------------------------------------------------
 
-/[\x{105}-\x{109}]/8iBM
+/[\x{105}-\x{109}]/i,utf
 Memory allocation (code space): 24
 ------------------------------------------------------------------
   0   9 Bra
@@ -534,7 +541,7 @@
  11     End
 ------------------------------------------------------------------
 
-/( ( (?(1)0|) )*   )/xBM
+/( ( (?(1)0|) )*   )/x
 Memory allocation (code space): 52
 ------------------------------------------------------------------
   0  23 Bra
@@ -552,7 +559,7 @@
  25     End
 ------------------------------------------------------------------
 
-/(  (?(1)0|)*   )/xBM
+/(  (?(1)0|)*   )/x
 Memory allocation (code space): 42
 ------------------------------------------------------------------
   0  18 Bra
@@ -568,7 +575,7 @@
  20     End
 ------------------------------------------------------------------
 
-/[a]/BM
+/[a]/
 Memory allocation (code space): 14
 ------------------------------------------------------------------
   0   4 Bra
@@ -577,7 +584,7 @@
   6     End
 ------------------------------------------------------------------
 
-/[a]/8BM
+/[a]/utf
 Memory allocation (code space): 14
 ------------------------------------------------------------------
   0   4 Bra
@@ -586,7 +593,7 @@
   6     End
 ------------------------------------------------------------------
 
-/[\xaa]/BM
+/[\xaa]/
 Memory allocation (code space): 14
 ------------------------------------------------------------------
   0   4 Bra
@@ -595,7 +602,7 @@
   6     End
 ------------------------------------------------------------------
 
-/[\xaa]/8BM
+/[\xaa]/utf
 Memory allocation (code space): 14
 ------------------------------------------------------------------
   0   4 Bra
@@ -604,7 +611,7 @@
   6     End
 ------------------------------------------------------------------
 
-/[^a]/BM
+/[^a]/
 Memory allocation (code space): 14
 ------------------------------------------------------------------
   0   4 Bra
@@ -613,7 +620,7 @@
   6     End
 ------------------------------------------------------------------
 
-/[^a]/8BM
+/[^a]/utf
 Memory allocation (code space): 14
 ------------------------------------------------------------------
   0   4 Bra
@@ -622,7 +629,7 @@
   6     End
 ------------------------------------------------------------------
 
-/[^\xaa]/BM
+/[^\xaa]/
 Memory allocation (code space): 14
 ------------------------------------------------------------------
   0   4 Bra
@@ -631,7 +638,7 @@
   6     End
 ------------------------------------------------------------------
 
-/[^\xaa]/8BM
+/[^\xaa]/utf
 Memory allocation (code space): 14
 ------------------------------------------------------------------
   0   4 Bra
@@ -640,7 +647,9 @@
   6     End
 ------------------------------------------------------------------
 
-/[^\d]/8WB
+#pattern -memory
+
+/[^\d]/utf,ucp
 ------------------------------------------------------------------
   0   9 Bra
   2     [^\p{Nd}]
@@ -648,23 +657,23 @@
  11     End
 ------------------------------------------------------------------
 
-/[[:^alpha:][:^cntrl:]]+/8WB
+/[[:^alpha:][:^cntrl:]]+/utf,ucp
 ------------------------------------------------------------------
-  0  30 Bra
-  2     [ -~\x80-\xff\P{L}\x{100}-\x{10ffff}]++
- 30  30 Ket
- 32     End
+  0  13 Bra
+  2     [\P{L}\P{Cc}]++
+ 13  13 Ket
+ 15     End
 ------------------------------------------------------------------
 
-/[[:^cntrl:][:^alpha:]]+/8WB
+/[[:^cntrl:][:^alpha:]]+/utf,ucp
 ------------------------------------------------------------------
-  0  30 Bra
-  2     [ -~\x80-\xff\x{100}-\x{10ffff}\P{L}]++
- 30  30 Ket
- 32     End
+  0  13 Bra
+  2     [\P{Cc}\P{L}]++
+ 13  13 Ket
+ 15     End
 ------------------------------------------------------------------
 
-/[[:alpha:]]+/8WB
+/[[:alpha:]]+/utf,ucp
 ------------------------------------------------------------------
   0  10 Bra
   2     [\p{L}]++
@@ -672,7 +681,7 @@
  12     End
 ------------------------------------------------------------------
 
-/[[:^alpha:]\S]+/8WB
+/[[:^alpha:]\S]+/utf,ucp
 ------------------------------------------------------------------
   0  13 Bra
   2     [\P{L}\P{Xsp}]++
@@ -680,7 +689,7 @@
  15     End
 ------------------------------------------------------------------
 
-/abc(d|e)(*THEN)x(123(*THEN)4|567(b|q)(*THEN)xx)/B
+/abc(d|e)(*THEN)x(123(*THEN)4|567(b|q)(*THEN)xx)/
 ------------------------------------------------------------------
   0  60 Bra
   2     abc
@@ -709,7 +718,7 @@
  62     End
 ------------------------------------------------------------------
 
-/(((a\2)|(a*)\g<-1>))*a?/B
+/(((a\2)|(a*)\g<-1>))*a?/
 ------------------------------------------------------------------
   0  39 Bra
   2     Brazero
@@ -733,7 +742,7 @@
  41     End
 ------------------------------------------------------------------
 
-/((?+1)(\1))/B
+/((?+1)(\1))/
 ------------------------------------------------------------------
   0  20 Bra
   2  16 Once
@@ -748,21 +757,274 @@
  22     End
 ------------------------------------------------------------------
 
-/.((?2)(?R)\1)()/B
+"(?1)(?#?'){2}(a)"
 ------------------------------------------------------------------
-  0  23 Bra
-  2     Any
-  3  13 Once
-  5   9 CBra 1
-  8  18 Recurse
- 10   0 Recurse
- 12     \1
- 14   9 Ket
- 16  13 Ket
- 18   3 CBra 2
- 21   3 Ket
- 23  23 Ket
- 25     End
+  0  21 Bra
+  2   4 Once
+  4  14 Recurse
+  6   4 Ket
+  8   4 Once
+ 10  14 Recurse
+ 12   4 Ket
+ 14   5 CBra 1
+ 17     a
+ 19   5 Ket
+ 21  21 Ket
+ 23     End
 ------------------------------------------------------------------
 
-/-- End of testinput11 --/
+/.((?2)(?R)|\1|$)()/
+------------------------------------------------------------------
+  0  28 Bra
+  2     Any
+  3  18 Once
+  5   7 CBra 1
+  8  23 Recurse
+ 10   0 Recurse
+ 12   4 Alt
+ 14     \1
+ 16   3 Alt
+ 18     $
+ 19  14 Ket
+ 21  18 Ket
+ 23   3 CBra 2
+ 26   3 Ket
+ 28  28 Ket
+ 30     End
+------------------------------------------------------------------
+
+/.((?3)(?R)()(?2)|\1|$)()/
+------------------------------------------------------------------
+  0  35 Bra
+  2     Any
+  3  25 Once
+  5  14 CBra 1
+  8  30 Recurse
+ 10   0 Recurse
+ 12   3 CBra 2
+ 15   3 Ket
+ 17  12 Recurse
+ 19   4 Alt
+ 21     \1
+ 23   3 Alt
+ 25     $
+ 26  21 Ket
+ 28  25 Ket
+ 30   3 CBra 3
+ 33   3 Ket
+ 35  35 Ket
+ 37     End
+------------------------------------------------------------------
+
+/(?1)()((((((\1++))\x85)+)|))/
+------------------------------------------------------------------
+  0  50 Bra
+  2   4 Recurse
+  4   3 CBra 1
+  7   3 Ket
+  9  39 CBra 2
+ 12  32 CBra 3
+ 15  27 CBra 4
+ 18  22 CBra 5
+ 21  15 CBra 6
+ 24  10 CBra 7
+ 27   5 Once
+ 29     \1+
+ 32   5 Ket
+ 34  10 Ket
+ 36  15 Ket
+ 38     \x{85}
+ 40  22 KetRmax
+ 42  27 Ket
+ 44   2 Alt
+ 46  34 Ket
+ 48  39 Ket
+ 50  50 Ket
+ 52     End
+------------------------------------------------------------------
+
+# Check the absolute limit on nesting (?| etc. This varies with code unit
+# width because the workspace is a different number of bytes. It will fail
+# with link size 2 in 8-bit and 16-bit but not in 32-bit.
+
+/(?|(?|(?J:(?|(?x:(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|
+)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
+/parens_nest_limit=1000,-fullbincode
+Failed: error 184 at offset 1540: (?| and/or (?J: or (?x: parentheses are too deeply nested
+
+# Use "expand" to create some very long patterns with nested parentheses, in
+# order to test workspace overflow. Again, this varies with code unit width,
+# and even with it fails in two modes, the error offset differs. It also varies
+# with link size - hence multiple tests with different values.
+
+/(?'ABC'\[[bar](]{105}*THEN:\[A]{255}\[)]{106}/expand,-fullbincode
+Failed: error 186 at offset 594: regular expression is too complicated
+
+/(?'ABC'\[[bar](]{106}*THEN:\[A]{255}\[)]{107}/expand,-fullbincode
+Failed: error 186 at offset 594: regular expression is too complicated
+
+/(?'ABC'\[[bar](]{159}*THEN:\[A]{255}\[)]{160}/expand,-fullbincode
+Failed: error 186 at offset 594: regular expression is too complicated
+
+/(?'ABC'\[[bar](]{199}*THEN:\[A]{255}\[)]{200}/expand,-fullbincode
+Failed: error 186 at offset 594: regular expression is too complicated
+
+/(?'ABC'\[[bar](]{299}*THEN:\[A]{255}\[)]{300}/expand,-fullbincode
+Failed: error 186 at offset 594: regular expression is too complicated
+
+/(?(1)(?1)){8,}+()/debug
+------------------------------------------------------------------
+  0  79 Bra
+  2  70 Once
+  4   6 Cond
+  6   1 Cond ref
+  8  74 Recurse
+ 10   6 Ket
+ 12   6 Cond
+ 14   1 Cond ref
+ 16  74 Recurse
+ 18   6 Ket
+ 20   6 Cond
+ 22   1 Cond ref
+ 24  74 Recurse
+ 26   6 Ket
+ 28   6 Cond
+ 30   1 Cond ref
+ 32  74 Recurse
+ 34   6 Ket
+ 36   6 Cond
+ 38   1 Cond ref
+ 40  74 Recurse
+ 42   6 Ket
+ 44   6 Cond
+ 46   1 Cond ref
+ 48  74 Recurse
+ 50   6 Ket
+ 52   6 Cond
+ 54   1 Cond ref
+ 56  74 Recurse
+ 58   6 Ket
+ 60  10 SBraPos
+ 62   6 SCond
+ 64   1 Cond ref
+ 66  74 Recurse
+ 68   6 Ket
+ 70  10 KetRpos
+ 72  70 Ket
+ 74   3 CBra 1
+ 77   3 Ket
+ 79  79 Ket
+ 81     End
+------------------------------------------------------------------
+Capturing subpattern count = 1
+Max back reference = 1
+May match empty string
+Subject length lower bound = 0
+    abcd
+ 0: 
+ 1: 
+
+/(?(1)|a(?1)b){2,}+()/debug
+------------------------------------------------------------------
+  0  43 Bra
+  2  34 Once
+  4   4 Cond
+  6   1 Cond ref
+  8   8 Alt
+ 10     a
+ 12  38 Recurse
+ 14     b
+ 16  12 Ket
+ 18  16 SBraPos
+ 20   4 SCond
+ 22   1 Cond ref
+ 24   8 Alt
+ 26     a
+ 28  38 Recurse
+ 30     b
+ 32  12 Ket
+ 34  16 KetRpos
+ 36  34 Ket
+ 38   3 CBra 1
+ 41   3 Ket
+ 43  43 Ket
+ 45     End
+------------------------------------------------------------------
+Capturing subpattern count = 1
+Max back reference = 1
+May match empty string
+Subject length lower bound = 0
+    abcde
+No match
+
+/((?1)(?2)(?3)(?4)(?5)(?6)(?7)(?8)(?9)(?9)(?8)(?7)(?6)(?5)(?4)(?3)(?2)(?1)(?0)){2,}()()()()()()()()()/debug
+------------------------------------------------------------------
+  0 133 Bra
+  2  41 CBra 1
+  5   2 Recurse
+  7  88 Recurse
+  9  93 Recurse
+ 11  98 Recurse
+ 13 103 Recurse
+ 15 108 Recurse
+ 17 113 Recurse
+ 19 118 Recurse
+ 21 123 Recurse
+ 23 123 Recurse
+ 25 118 Recurse
+ 27 113 Recurse
+ 29 108 Recurse
+ 31 103 Recurse
+ 33  98 Recurse
+ 35  93 Recurse
+ 37  88 Recurse
+ 39   2 Recurse
+ 41   0 Recurse
+ 43  41 Ket
+ 45  41 SCBra 1
+ 48   2 Recurse
+ 50  88 Recurse
+ 52  93 Recurse
+ 54  98 Recurse
+ 56 103 Recurse
+ 58 108 Recurse
+ 60 113 Recurse
+ 62 118 Recurse
+ 64 123 Recurse
+ 66 123 Recurse
+ 68 118 Recurse
+ 70 113 Recurse
+ 72 108 Recurse
+ 74 103 Recurse
+ 76  98 Recurse
+ 78  93 Recurse
+ 80  88 Recurse
+ 82   2 Recurse
+ 84   0 Recurse
+ 86  41 KetRmax
+ 88   3 CBra 2
+ 91   3 Ket
+ 93   3 CBra 3
+ 96   3 Ket
+ 98   3 CBra 4
+101   3 Ket
+103   3 CBra 5
+106   3 Ket
+108   3 CBra 6
+111   3 Ket
+113   3 CBra 7
+116   3 Ket
+118   3 CBra 8
+121   3 Ket
+123   3 CBra 9
+126   3 Ket
+128   3 CBra 10
+131   3 Ket
+133 133 Ket
+135     End
+------------------------------------------------------------------
+Capturing subpattern count = 10
+May match empty string
+Subject length lower bound = 0
+
+# End of testinput8
diff --git a/dist2/testdata/testoutput8-16-3 b/dist2/testdata/testoutput8-16-3
new file mode 100644
index 0000000..31884e1
--- /dev/null
+++ b/dist2/testdata/testoutput8-16-3
@@ -0,0 +1,1026 @@
+# There are two sorts of patterns in this test. A number of them are
+# representative patterns whose lengths and offsets are checked. This is just a
+# doublecheck test to ensure the sizes don't go horribly wrong when something
+# is changed. The operation of these patterns is checked in other tests.
+#
+# This file also contains tests whose output varies with code unit size and/or
+# link size. Unicode support is required for these tests. There are separate
+# output files for each code unit size and link size.
+
+#pattern fullbincode,memory
+
+/((?i)b)/
+Memory allocation (code space): 32
+------------------------------------------------------------------
+  0  12 Bra
+  3   6 CBra 1
+  7  /i b
+  9   6 Ket
+ 12  12 Ket
+ 15     End
+------------------------------------------------------------------
+
+/(?s)(.*X|^B)/
+Memory allocation (code space): 48
+------------------------------------------------------------------
+  0  20 Bra
+  3   8 CBra 1
+  7     AllAny*
+  9     X
+ 11   6 Alt
+ 14     ^
+ 15     B
+ 17  14 Ket
+ 20  20 Ket
+ 23     End
+------------------------------------------------------------------
+
+/(?s:.*X|^B)/
+Memory allocation (code space): 46
+------------------------------------------------------------------
+  0  19 Bra
+  3   7 Bra
+  6     AllAny*
+  8     X
+ 10   6 Alt
+ 13     ^
+ 14     B
+ 16  13 Ket
+ 19  19 Ket
+ 22     End
+------------------------------------------------------------------
+
+/^[[:alnum:]]/
+Memory allocation (code space): 50
+------------------------------------------------------------------
+  0  21 Bra
+  3     ^
+  4     [0-9A-Za-z]
+ 21  21 Ket
+ 24     End
+------------------------------------------------------------------
+
+/#/Ix
+Memory allocation (code space): 14
+------------------------------------------------------------------
+  0   3 Bra
+  3   3 Ket
+  6     End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+May match empty string
+Options: extended
+Subject length lower bound = 0
+
+/a#/Ix
+Memory allocation (code space): 18
+------------------------------------------------------------------
+  0   5 Bra
+  3     a
+  5   5 Ket
+  8     End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: extended
+First code unit = 'a'
+Subject length lower bound = 1
+
+/x?+/
+Memory allocation (code space): 18
+------------------------------------------------------------------
+  0   5 Bra
+  3     x?+
+  5   5 Ket
+  8     End
+------------------------------------------------------------------
+
+/x++/
+Memory allocation (code space): 18
+------------------------------------------------------------------
+  0   5 Bra
+  3     x++
+  5   5 Ket
+  8     End
+------------------------------------------------------------------
+
+/x{1,3}+/
+Memory allocation (code space): 24
+------------------------------------------------------------------
+  0   8 Bra
+  3     x
+  5     x{0,2}+
+  8   8 Ket
+ 11     End
+------------------------------------------------------------------
+
+/(x)*+/
+Memory allocation (code space): 34
+------------------------------------------------------------------
+  0  13 Bra
+  3     Braposzero
+  4   6 CBraPos 1
+  8     x
+ 10   6 KetRpos
+ 13  13 Ket
+ 16     End
+------------------------------------------------------------------
+
+/^((a+)(?U)([ab]+)(?-U)([bc]+)(\w*))/
+Memory allocation (code space): 166
+------------------------------------------------------------------
+  0  79 Bra
+  3     ^
+  4  72 CBra 1
+  8   6 CBra 2
+ 12     a+
+ 14   6 Ket
+ 17  22 CBra 3
+ 21     [ab]+?
+ 39  22 Ket
+ 42  22 CBra 4
+ 46     [bc]+
+ 64  22 Ket
+ 67   6 CBra 5
+ 71     \w*+
+ 73   6 Ket
+ 76  72 Ket
+ 79  79 Ket
+ 82     End
+------------------------------------------------------------------
+
+"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"
+Memory allocation (code space): 1652
+------------------------------------------------------------------
+  0 822 Bra
+  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
+------------------------------------------------------------------
+
+"\$\<\.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"
+Memory allocation (code space): 1632
+------------------------------------------------------------------
+  0 812 Bra
+  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
+------------------------------------------------------------------
+
+/(a(?1)b)/
+Memory allocation (code space): 42
+------------------------------------------------------------------
+  0  17 Bra
+  3  11 CBra 1
+  7     a
+  9   3 Recurse
+ 12     b
+ 14  11 Ket
+ 17  17 Ket
+ 20     End
+------------------------------------------------------------------
+
+/(a(?1)+b)/
+Memory allocation (code space): 54
+------------------------------------------------------------------
+  0  23 Bra
+  3  17 CBra 1
+  7     a
+  9   6 Once
+ 12   3 Recurse
+ 15   6 KetRmax
+ 18     b
+ 20  17 Ket
+ 23  23 Ket
+ 26     End
+------------------------------------------------------------------
+
+/a(?P<name1>b|c)d(?P<longername2>e)/
+Memory allocation (code space): 68
+------------------------------------------------------------------
+  0  30 Bra
+  3     a
+  5   6 CBra 1
+  9     b
+ 11   5 Alt
+ 14     c
+ 16  11 Ket
+ 19     d
+ 21   6 CBra 2
+ 25     e
+ 27   6 Ket
+ 30  30 Ket
+ 33     End
+------------------------------------------------------------------
+
+/(?:a(?P<c>c(?P<d>d)))(?P<a>a)/
+Memory allocation (code space): 84
+------------------------------------------------------------------
+  0  38 Bra
+  3  23 Bra
+  6     a
+  8  15 CBra 1
+ 12     c
+ 14   6 CBra 2
+ 18     d
+ 20   6 Ket
+ 23  15 Ket
+ 26  23 Ket
+ 29   6 CBra 3
+ 33     a
+ 35   6 Ket
+ 38  38 Ket
+ 41     End
+------------------------------------------------------------------
+
+/(?P<a>a)...(?P=a)bbb(?P>a)d/
+Memory allocation (code space): 64
+------------------------------------------------------------------
+  0  28 Bra
+  3   6 CBra 1
+  7     a
+  9   6 Ket
+ 12     Any
+ 13     Any
+ 14     Any
+ 15     \1
+ 17     bbb
+ 23   3 Recurse
+ 26     d
+ 28  28 Ket
+ 31     End
+------------------------------------------------------------------
+
+/abc(?C255)de(?C)f/
+Memory allocation (code space): 62
+------------------------------------------------------------------
+  0  27 Bra
+  3     abc
+  9     Callout 255 10 1
+ 15     de
+ 19     Callout 0 16 1
+ 25     f
+ 27  27 Ket
+ 30     End
+------------------------------------------------------------------
+
+/abcde/auto_callout
+Memory allocation (code space): 106
+------------------------------------------------------------------
+  0  49 Bra
+  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
+------------------------------------------------------------------
+
+/\x{100}/utf
+Memory allocation (code space): 18
+------------------------------------------------------------------
+  0   5 Bra
+  3     \x{100}
+  5   5 Ket
+  8     End
+------------------------------------------------------------------
+
+/\x{1000}/utf
+Memory allocation (code space): 18
+------------------------------------------------------------------
+  0   5 Bra
+  3     \x{1000}
+  5   5 Ket
+  8     End
+------------------------------------------------------------------
+
+/\x{10000}/utf
+Memory allocation (code space): 20
+------------------------------------------------------------------
+  0   6 Bra
+  3     \x{10000}
+  6   6 Ket
+  9     End
+------------------------------------------------------------------
+
+/\x{100000}/utf
+Memory allocation (code space): 20
+------------------------------------------------------------------
+  0   6 Bra
+  3     \x{100000}
+  6   6 Ket
+  9     End
+------------------------------------------------------------------
+
+/\x{10ffff}/utf
+Memory allocation (code space): 20
+------------------------------------------------------------------
+  0   6 Bra
+  3     \x{10ffff}
+  6   6 Ket
+  9     End
+------------------------------------------------------------------
+
+/\x{110000}/utf
+Failed: error 134 at offset 9: character code point value in \x{} or \o{} is too large
+
+/[\x{ff}]/utf
+Memory allocation (code space): 18
+------------------------------------------------------------------
+  0   5 Bra
+  3     \x{ff}
+  5   5 Ket
+  8     End
+------------------------------------------------------------------
+
+/[\x{100}]/utf
+Memory allocation (code space): 18
+------------------------------------------------------------------
+  0   5 Bra
+  3     \x{100}
+  5   5 Ket
+  8     End
+------------------------------------------------------------------
+
+/\x80/utf
+Memory allocation (code space): 18
+------------------------------------------------------------------
+  0   5 Bra
+  3     \x{80}
+  5   5 Ket
+  8     End
+------------------------------------------------------------------
+
+/\xff/utf
+Memory allocation (code space): 18
+------------------------------------------------------------------
+  0   5 Bra
+  3     \x{ff}
+  5   5 Ket
+  8     End
+------------------------------------------------------------------
+
+/\x{0041}\x{2262}\x{0391}\x{002e}/I,utf
+Memory allocation (code space): 30
+------------------------------------------------------------------
+  0  11 Bra
+  3     A\x{2262}\x{391}.
+ 11  11 Ket
+ 14     End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = 'A'
+Last code unit = '.'
+Subject length lower bound = 4
+
+/\x{D55c}\x{ad6d}\x{C5B4}/I,utf
+Memory allocation (code space): 26
+------------------------------------------------------------------
+  0   9 Bra
+  3     \x{d55c}\x{ad6d}\x{c5b4}
+  9   9 Ket
+ 12     End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = \x{d55c}
+Last code unit = \x{c5b4}
+Subject length lower bound = 3
+
+/\x{65e5}\x{672c}\x{8a9e}/I,utf
+Memory allocation (code space): 26
+------------------------------------------------------------------
+  0   9 Bra
+  3     \x{65e5}\x{672c}\x{8a9e}
+  9   9 Ket
+ 12     End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = \x{65e5}
+Last code unit = \x{8a9e}
+Subject length lower bound = 3
+
+/[\x{100}]/utf
+Memory allocation (code space): 18
+------------------------------------------------------------------
+  0   5 Bra
+  3     \x{100}
+  5   5 Ket
+  8     End
+------------------------------------------------------------------
+
+/[Z\x{100}]/utf
+Memory allocation (code space): 60
+------------------------------------------------------------------
+  0  26 Bra
+  3     [Z\x{100}]
+ 26  26 Ket
+ 29     End
+------------------------------------------------------------------
+
+/^[\x{100}\E-\Q\E\x{150}]/utf
+Memory allocation (code space): 32
+------------------------------------------------------------------
+  0  12 Bra
+  3     ^
+  4     [\x{100}-\x{150}]
+ 12  12 Ket
+ 15     End
+------------------------------------------------------------------
+
+/^[\QĀ\E-\QŐ\E]/utf
+Memory allocation (code space): 32
+------------------------------------------------------------------
+  0  12 Bra
+  3     ^
+  4     [\x{100}-\x{150}]
+ 12  12 Ket
+ 15     End
+------------------------------------------------------------------
+
+/^[\QĀ\E-\QŐ\E/utf
+Failed: error 106 at offset 13: missing terminating ] for character class
+
+/[\p{L}]/
+Memory allocation (code space): 30
+------------------------------------------------------------------
+  0  11 Bra
+  3     [\p{L}]
+ 11  11 Ket
+ 14     End
+------------------------------------------------------------------
+
+/[\p{^L}]/
+Memory allocation (code space): 30
+------------------------------------------------------------------
+  0  11 Bra
+  3     [\P{L}]
+ 11  11 Ket
+ 14     End
+------------------------------------------------------------------
+
+/[\P{L}]/
+Memory allocation (code space): 30
+------------------------------------------------------------------
+  0  11 Bra
+  3     [\P{L}]
+ 11  11 Ket
+ 14     End
+------------------------------------------------------------------
+
+/[\P{^L}]/
+Memory allocation (code space): 30
+------------------------------------------------------------------
+  0  11 Bra
+  3     [\p{L}]
+ 11  11 Ket
+ 14     End
+------------------------------------------------------------------
+
+/[abc\p{L}\x{0660}]/utf
+Memory allocation (code space): 66
+------------------------------------------------------------------
+  0  29 Bra
+  3     [a-c\p{L}\x{660}]
+ 29  29 Ket
+ 32     End
+------------------------------------------------------------------
+
+/[\p{Nd}]/utf
+Memory allocation (code space): 30
+------------------------------------------------------------------
+  0  11 Bra
+  3     [\p{Nd}]
+ 11  11 Ket
+ 14     End
+------------------------------------------------------------------
+
+/[\p{Nd}+-]+/utf
+Memory allocation (code space): 64
+------------------------------------------------------------------
+  0  28 Bra
+  3     [+\-\p{Nd}]++
+ 28  28 Ket
+ 31     End
+------------------------------------------------------------------
+
+/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/i,utf
+Memory allocation (code space): 36
+------------------------------------------------------------------
+  0  14 Bra
+  3  /i A\x{391}\x{10427}\x{ff3a}\x{1fb0}
+ 14  14 Ket
+ 17     End
+------------------------------------------------------------------
+
+/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/utf
+Memory allocation (code space): 36
+------------------------------------------------------------------
+  0  14 Bra
+  3     A\x{391}\x{10427}\x{ff3a}\x{1fb0}
+ 14  14 Ket
+ 17     End
+------------------------------------------------------------------
+
+/[\x{105}-\x{109}]/i,utf
+Memory allocation (code space): 30
+------------------------------------------------------------------
+  0  11 Bra
+  3     [\x{104}-\x{109}]
+ 11  11 Ket
+ 14     End
+------------------------------------------------------------------
+
+/( ( (?(1)0|) )*   )/x
+Memory allocation (code space): 70
+------------------------------------------------------------------
+  0  31 Bra
+  3  25 CBra 1
+  7     Brazero
+  8  17 SCBra 2
+ 12   7 Cond
+ 15   1 Cond ref
+ 17     0
+ 19   3 Alt
+ 22  10 Ket
+ 25  17 KetRmax
+ 28  25 Ket
+ 31  31 Ket
+ 34     End
+------------------------------------------------------------------
+
+/(  (?(1)0|)*   )/x
+Memory allocation (code space): 56
+------------------------------------------------------------------
+  0  24 Bra
+  3  18 CBra 1
+  7     Brazero
+  8   7 SCond
+ 11   1 Cond ref
+ 13     0
+ 15   3 Alt
+ 18  10 KetRmax
+ 21  18 Ket
+ 24  24 Ket
+ 27     End
+------------------------------------------------------------------
+
+/[a]/
+Memory allocation (code space): 18
+------------------------------------------------------------------
+  0   5 Bra
+  3     a
+  5   5 Ket
+  8     End
+------------------------------------------------------------------
+
+/[a]/utf
+Memory allocation (code space): 18
+------------------------------------------------------------------
+  0   5 Bra
+  3     a
+  5   5 Ket
+  8     End
+------------------------------------------------------------------
+
+/[\xaa]/
+Memory allocation (code space): 18
+------------------------------------------------------------------
+  0   5 Bra
+  3     \x{aa}
+  5   5 Ket
+  8     End
+------------------------------------------------------------------
+
+/[\xaa]/utf
+Memory allocation (code space): 18
+------------------------------------------------------------------
+  0   5 Bra
+  3     \x{aa}
+  5   5 Ket
+  8     End
+------------------------------------------------------------------
+
+/[^a]/
+Memory allocation (code space): 18
+------------------------------------------------------------------
+  0   5 Bra
+  3     [^a]
+  5   5 Ket
+  8     End
+------------------------------------------------------------------
+
+/[^a]/utf
+Memory allocation (code space): 18
+------------------------------------------------------------------
+  0   5 Bra
+  3     [^a]
+  5   5 Ket
+  8     End
+------------------------------------------------------------------
+
+/[^\xaa]/
+Memory allocation (code space): 18
+------------------------------------------------------------------
+  0   5 Bra
+  3     [^\x{aa}]
+  5   5 Ket
+  8     End
+------------------------------------------------------------------
+
+/[^\xaa]/utf
+Memory allocation (code space): 18
+------------------------------------------------------------------
+  0   5 Bra
+  3     [^\x{aa}]
+  5   5 Ket
+  8     End
+------------------------------------------------------------------
+
+#pattern -memory
+
+/[^\d]/utf,ucp
+------------------------------------------------------------------
+  0  11 Bra
+  3     [^\p{Nd}]
+ 11  11 Ket
+ 14     End
+------------------------------------------------------------------
+
+/[[:^alpha:][:^cntrl:]]+/utf,ucp
+------------------------------------------------------------------
+  0  15 Bra
+  3     [\P{L}\P{Cc}]++
+ 15  15 Ket
+ 18     End
+------------------------------------------------------------------
+
+/[[:^cntrl:][:^alpha:]]+/utf,ucp
+------------------------------------------------------------------
+  0  15 Bra
+  3     [\P{Cc}\P{L}]++
+ 15  15 Ket
+ 18     End
+------------------------------------------------------------------
+
+/[[:alpha:]]+/utf,ucp
+------------------------------------------------------------------
+  0  12 Bra
+  3     [\p{L}]++
+ 12  12 Ket
+ 15     End
+------------------------------------------------------------------
+
+/[[:^alpha:]\S]+/utf,ucp
+------------------------------------------------------------------
+  0  15 Bra
+  3     [\P{L}\P{Xsp}]++
+ 15  15 Ket
+ 18     End
+------------------------------------------------------------------
+
+/abc(d|e)(*THEN)x(123(*THEN)4|567(b|q)(*THEN)xx)/
+------------------------------------------------------------------
+  0  70 Bra
+  3     abc
+  9   6 CBra 1
+ 13     d
+ 15   5 Alt
+ 18     e
+ 20  11 Ket
+ 23     *THEN
+ 24     x
+ 26  13 CBra 2
+ 30     123
+ 36     *THEN
+ 37     4
+ 39  28 Alt
+ 42     567
+ 48   6 CBra 3
+ 52     b
+ 54   5 Alt
+ 57     q
+ 59  11 Ket
+ 62     *THEN
+ 63     xx
+ 67  41 Ket
+ 70  70 Ket
+ 73     End
+------------------------------------------------------------------
+
+/(((a\2)|(a*)\g<-1>))*a?/
+------------------------------------------------------------------
+  0  52 Bra
+  3     Brazero
+  4  43 SCBra 1
+  8  36 Once
+ 11  15 CBra 2
+ 15   8 CBra 3
+ 19     a
+ 21     \2
+ 23   8 Ket
+ 26  15 Alt
+ 29   6 CBra 4
+ 33     a*
+ 35   6 Ket
+ 38  29 Recurse
+ 41  30 Ket
+ 44  36 Ket
+ 47  43 KetRmax
+ 50     a?+
+ 52  52 Ket
+ 55     End
+------------------------------------------------------------------
+
+/((?+1)(\1))/
+------------------------------------------------------------------
+  0  28 Bra
+  3  22 Once
+  6  16 CBra 1
+ 10  13 Recurse
+ 13   6 CBra 2
+ 17     \1
+ 19   6 Ket
+ 22  16 Ket
+ 25  22 Ket
+ 28  28 Ket
+ 31     End
+------------------------------------------------------------------
+
+"(?1)(?#?'){2}(a)"
+------------------------------------------------------------------
+  0  30 Bra
+  3   6 Once
+  6  21 Recurse
+  9   6 Ket
+ 12   6 Once
+ 15  21 Recurse
+ 18   6 Ket
+ 21   6 CBra 1
+ 25     a
+ 27   6 Ket
+ 30  30 Ket
+ 33     End
+------------------------------------------------------------------
+
+/.((?2)(?R)|\1|$)()/
+------------------------------------------------------------------
+  0  39 Bra
+  3     Any
+  4  25 Once
+  7  10 CBra 1
+ 11  32 Recurse
+ 14   0 Recurse
+ 17   5 Alt
+ 20     \1
+ 22   4 Alt
+ 25     $
+ 26  19 Ket
+ 29  25 Ket
+ 32   4 CBra 2
+ 36   4 Ket
+ 39  39 Ket
+ 42     End
+------------------------------------------------------------------
+
+/.((?3)(?R)()(?2)|\1|$)()/
+------------------------------------------------------------------
+  0  49 Bra
+  3     Any
+  4  35 Once
+  7  20 CBra 1
+ 11  42 Recurse
+ 14   0 Recurse
+ 17   4 CBra 2
+ 21   4 Ket
+ 24  17 Recurse
+ 27   5 Alt
+ 30     \1
+ 32   4 Alt
+ 35     $
+ 36  29 Ket
+ 39  35 Ket
+ 42   4 CBra 3
+ 46   4 Ket
+ 49  49 Ket
+ 52     End
+------------------------------------------------------------------
+
+/(?1)()((((((\1++))\x85)+)|))/
+------------------------------------------------------------------
+  0  69 Bra
+  3   6 Recurse
+  6   4 CBra 1
+ 10   4 Ket
+ 13  53 CBra 2
+ 17  43 CBra 3
+ 21  36 CBra 4
+ 25  29 CBra 5
+ 29  20 CBra 6
+ 33  13 CBra 7
+ 37   6 Once
+ 40     \1+
+ 43   6 Ket
+ 46  13 Ket
+ 49  20 Ket
+ 52     \x{85}
+ 54  29 KetRmax
+ 57  36 Ket
+ 60   3 Alt
+ 63  46 Ket
+ 66  53 Ket
+ 69  69 Ket
+ 72     End
+------------------------------------------------------------------
+
+# Check the absolute limit on nesting (?| etc. This varies with code unit
+# width because the workspace is a different number of bytes. It will fail
+# with link size 2 in 8-bit and 16-bit but not in 32-bit.
+
+/(?|(?|(?J:(?|(?x:(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|
+)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
+/parens_nest_limit=1000,-fullbincode
+
+# Use "expand" to create some very long patterns with nested parentheses, in
+# order to test workspace overflow. Again, this varies with code unit width,
+# and even with it fails in two modes, the error offset differs. It also varies
+# with link size - hence multiple tests with different values.
+
+/(?'ABC'\[[bar](]{105}*THEN:\[A]{255}\[)]{106}/expand,-fullbincode
+
+/(?'ABC'\[[bar](]{106}*THEN:\[A]{255}\[)]{107}/expand,-fullbincode
+
+/(?'ABC'\[[bar](]{159}*THEN:\[A]{255}\[)]{160}/expand,-fullbincode
+
+/(?'ABC'\[[bar](]{199}*THEN:\[A]{255}\[)]{200}/expand,-fullbincode
+Failed: error 186 at offset 1147: regular expression is too complicated
+
+/(?'ABC'\[[bar](]{299}*THEN:\[A]{255}\[)]{300}/expand,-fullbincode
+Failed: error 186 at offset 1147: regular expression is too complicated
+
+/(?(1)(?1)){8,}+()/debug
+------------------------------------------------------------------
+  0 110 Bra
+  3  97 Once
+  6   8 Cond
+  9   1 Cond ref
+ 11 103 Recurse
+ 14   8 Ket
+ 17   8 Cond
+ 20   1 Cond ref
+ 22 103 Recurse
+ 25   8 Ket
+ 28   8 Cond
+ 31   1 Cond ref
+ 33 103 Recurse
+ 36   8 Ket
+ 39   8 Cond
+ 42   1 Cond ref
+ 44 103 Recurse
+ 47   8 Ket
+ 50   8 Cond
+ 53   1 Cond ref
+ 55 103 Recurse
+ 58   8 Ket
+ 61   8 Cond
+ 64   1 Cond ref
+ 66 103 Recurse
+ 69   8 Ket
+ 72   8 Cond
+ 75   1 Cond ref
+ 77 103 Recurse
+ 80   8 Ket
+ 83  14 SBraPos
+ 86   8 SCond
+ 89   1 Cond ref
+ 91 103 Recurse
+ 94   8 Ket
+ 97  14 KetRpos
+100  97 Ket
+103   4 CBra 1
+107   4 Ket
+110 110 Ket
+113     End
+------------------------------------------------------------------
+Capturing subpattern count = 1
+Max back reference = 1
+May match empty string
+Subject length lower bound = 0
+    abcd
+ 0: 
+ 1: 
+
+/(?(1)|a(?1)b){2,}+()/debug
+------------------------------------------------------------------
+  0  58 Bra
+  3  45 Once
+  6   5 Cond
+  9   1 Cond ref
+ 11  10 Alt
+ 14     a
+ 16  51 Recurse
+ 19     b
+ 21  15 Ket
+ 24  21 SBraPos
+ 27   5 SCond
+ 30   1 Cond ref
+ 32  10 Alt
+ 35     a
+ 37  51 Recurse
+ 40     b
+ 42  15 Ket
+ 45  21 KetRpos
+ 48  45 Ket
+ 51   4 CBra 1
+ 55   4 Ket
+ 58  58 Ket
+ 61     End
+------------------------------------------------------------------
+Capturing subpattern count = 1
+Max back reference = 1
+May match empty string
+Subject length lower bound = 0
+    abcde
+No match
+
+/((?1)(?2)(?3)(?4)(?5)(?6)(?7)(?8)(?9)(?9)(?8)(?7)(?6)(?5)(?4)(?3)(?2)(?1)(?0)){2,}()()()()()()()()()/debug
+------------------------------------------------------------------
+  0 194 Bra
+  3  61 CBra 1
+  7   3 Recurse
+ 10 131 Recurse
+ 13 138 Recurse
+ 16 145 Recurse
+ 19 152 Recurse
+ 22 159 Recurse
+ 25 166 Recurse
+ 28 173 Recurse
+ 31 180 Recurse
+ 34 180 Recurse
+ 37 173 Recurse
+ 40 166 Recurse
+ 43 159 Recurse
+ 46 152 Recurse
+ 49 145 Recurse
+ 52 138 Recurse
+ 55 131 Recurse
+ 58   3 Recurse
+ 61   0 Recurse
+ 64  61 Ket
+ 67  61 SCBra 1
+ 71   3 Recurse
+ 74 131 Recurse
+ 77 138 Recurse
+ 80 145 Recurse
+ 83 152 Recurse
+ 86 159 Recurse
+ 89 166 Recurse
+ 92 173 Recurse
+ 95 180 Recurse
+ 98 180 Recurse
+101 173 Recurse
+104 166 Recurse
+107 159 Recurse
+110 152 Recurse
+113 145 Recurse
+116 138 Recurse
+119 131 Recurse
+122   3 Recurse
+125   0 Recurse
+128  61 KetRmax
+131   4 CBra 2
+135   4 Ket
+138   4 CBra 3
+142   4 Ket
+145   4 CBra 4
+149   4 Ket
+152   4 CBra 5
+156   4 Ket
+159   4 CBra 6
+163   4 Ket
+166   4 CBra 7
+170   4 Ket
+173   4 CBra 8
+177   4 Ket
+180   4 CBra 9
+184   4 Ket
+187   4 CBra 10
+191   4 Ket
+194 194 Ket
+197     End
+------------------------------------------------------------------
+Capturing subpattern count = 10
+May match empty string
+Subject length lower bound = 0
+
+# End of testinput8
diff --git a/dist/testdata/testoutput11-32 b/dist2/testdata/testoutput8-32-2
similarity index 64%
rename from dist/testdata/testoutput11-32
rename to dist2/testdata/testoutput8-32-2
index 57e5da0..babd0c7 100644
--- a/dist/testdata/testoutput11-32
+++ b/dist2/testdata/testoutput8-32-2
@@ -1,10 +1,15 @@
-/-- These are a few representative patterns whose lengths and offsets are to be 
-shown when the link size is 2. This is just a doublecheck test to ensure the 
-sizes don't go horribly wrong when something is changed. The pattern contents 
-are all themselves checked in other tests. Unicode, including property support, 
-is required for these tests. --/
+# There are two sorts of patterns in this test. A number of them are
+# representative patterns whose lengths and offsets are checked. This is just a
+# doublecheck test to ensure the sizes don't go horribly wrong when something
+# is changed. The operation of these patterns is checked in other tests.
+#
+# This file also contains tests whose output varies with code unit size and/or
+# link size. Unicode support is required for these tests. There are separate
+# output files for each code unit size and link size.
 
-/((?i)b)/BM
+#pattern fullbincode,memory
+
+/((?i)b)/
 Memory allocation (code space): 48
 ------------------------------------------------------------------
   0   9 Bra
@@ -15,7 +20,7 @@
  11     End
 ------------------------------------------------------------------
 
-/(?s)(.*X|^B)/BM
+/(?s)(.*X|^B)/
 Memory allocation (code space): 76
 ------------------------------------------------------------------
   0  16 Bra
@@ -30,7 +35,7 @@
  18     End
 ------------------------------------------------------------------
 
-/(?s:.*X|^B)/BM
+/(?s:.*X|^B)/
 Memory allocation (code space): 72
 ------------------------------------------------------------------
   0  15 Bra
@@ -45,7 +50,7 @@
  17     End
 ------------------------------------------------------------------
 
-/^[[:alnum:]]/BM
+/^[[:alnum:]]/
 Memory allocation (code space): 60
 ------------------------------------------------------------------
   0  12 Bra
@@ -55,7 +60,7 @@
  14     End
 ------------------------------------------------------------------
 
-/#/IxMD
+/#/Ix
 Memory allocation (code space): 20
 ------------------------------------------------------------------
   0   2 Bra
@@ -65,10 +70,9 @@
 Capturing subpattern count = 0
 May match empty string
 Options: extended
-No first char
-No need char
+Subject length lower bound = 0
 
-/a#/IxMD
+/a#/Ix
 Memory allocation (code space): 28
 ------------------------------------------------------------------
   0   4 Bra
@@ -78,10 +82,10 @@
 ------------------------------------------------------------------
 Capturing subpattern count = 0
 Options: extended
-First char = 'a'
-No need char
+First code unit = 'a'
+Subject length lower bound = 1
 
-/x?+/BM
+/x?+/
 Memory allocation (code space): 28
 ------------------------------------------------------------------
   0   4 Bra
@@ -90,7 +94,7 @@
   6     End
 ------------------------------------------------------------------
 
-/x++/BM
+/x++/
 Memory allocation (code space): 28
 ------------------------------------------------------------------
   0   4 Bra
@@ -99,7 +103,7 @@
   6     End
 ------------------------------------------------------------------
 
-/x{1,3}+/BM 
+/x{1,3}+/
 Memory allocation (code space): 40
 ------------------------------------------------------------------
   0   7 Bra
@@ -109,7 +113,7 @@
   9     End
 ------------------------------------------------------------------
 
-/(x)*+/BM
+/(x)*+/
 Memory allocation (code space): 52
 ------------------------------------------------------------------
   0  10 Bra
@@ -121,7 +125,7 @@
  12     End
 ------------------------------------------------------------------
 
-/^((a+)(?U)([ab]+)(?-U)([bc]+)(\w*))/BM
+/^((a+)(?U)([ab]+)(?-U)([bc]+)(\w*))/
 Memory allocation (code space): 220
 ------------------------------------------------------------------
   0  52 Bra
@@ -144,7 +148,7 @@
  54     End
 ------------------------------------------------------------------
 
-|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|BM
+"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"
 Memory allocation (code space): 3296
 ------------------------------------------------------------------
   0 821 Bra
@@ -154,7 +158,7 @@
 823     End
 ------------------------------------------------------------------
 
-|\$\<\.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|BM
+"\$\<\.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"
 Memory allocation (code space): 3256
 ------------------------------------------------------------------
   0 811 Bra
@@ -164,7 +168,7 @@
 813     End
 ------------------------------------------------------------------
 
-/(a(?1)b)/BM
+/(a(?1)b)/
 Memory allocation (code space): 64
 ------------------------------------------------------------------
   0  13 Bra
@@ -177,7 +181,7 @@
  15     End
 ------------------------------------------------------------------
 
-/(a(?1)+b)/BM
+/(a(?1)+b)/
 Memory allocation (code space): 80
 ------------------------------------------------------------------
   0  17 Bra
@@ -192,8 +196,8 @@
  19     End
 ------------------------------------------------------------------
 
-/a(?P<name1>b|c)d(?P<longername2>e)/BM
-Memory allocation (code space): 186
+/a(?P<name1>b|c)d(?P<longername2>e)/
+Memory allocation (code space): 108
 ------------------------------------------------------------------
   0  24 Bra
   2     a
@@ -210,8 +214,8 @@
  26     End
 ------------------------------------------------------------------
 
-/(?:a(?P<c>c(?P<d>d)))(?P<a>a)/BM
-Memory allocation (code space): 155
+/(?:a(?P<c>c(?P<d>d)))(?P<a>a)/
+Memory allocation (code space): 128
 ------------------------------------------------------------------
   0  29 Bra
   2  18 Bra
@@ -230,8 +234,8 @@
  31     End
 ------------------------------------------------------------------
 
-/(?P<a>a)...(?P=a)bbb(?P>a)d/BM
-Memory allocation (code space): 157
+/(?P<a>a)...(?P=a)bbb(?P>a)d/
+Memory allocation (code space): 108
 ------------------------------------------------------------------
   0  24 Bra
   2   5 CBra 1
@@ -248,7 +252,7 @@
  26     End
 ------------------------------------------------------------------
 
-/abc(?C255)de(?C)f/BM
+/abc(?C255)de(?C)f/
 Memory allocation (code space): 100
 ------------------------------------------------------------------
   0  22 Bra
@@ -261,7 +265,7 @@
  24     End
 ------------------------------------------------------------------
 
-/abcde/CBM
+/abcde/auto_callout
 Memory allocation (code space): 156
 ------------------------------------------------------------------
   0  36 Bra
@@ -280,7 +284,7 @@
  38     End
 ------------------------------------------------------------------
 
-/\x{100}/8BM
+/\x{100}/utf
 Memory allocation (code space): 28
 ------------------------------------------------------------------
   0   4 Bra
@@ -289,7 +293,7 @@
   6     End
 ------------------------------------------------------------------
 
-/\x{1000}/8BM
+/\x{1000}/utf
 Memory allocation (code space): 28
 ------------------------------------------------------------------
   0   4 Bra
@@ -298,7 +302,7 @@
   6     End
 ------------------------------------------------------------------
 
-/\x{10000}/8BM
+/\x{10000}/utf
 Memory allocation (code space): 28
 ------------------------------------------------------------------
   0   4 Bra
@@ -307,7 +311,7 @@
   6     End
 ------------------------------------------------------------------
 
-/\x{100000}/8BM
+/\x{100000}/utf
 Memory allocation (code space): 28
 ------------------------------------------------------------------
   0   4 Bra
@@ -316,7 +320,7 @@
   6     End
 ------------------------------------------------------------------
 
-/\x{10ffff}/8BM
+/\x{10ffff}/utf
 Memory allocation (code space): 28
 ------------------------------------------------------------------
   0   4 Bra
@@ -325,10 +329,10 @@
   6     End
 ------------------------------------------------------------------
 
-/\x{110000}/8BM
-Failed: character value in \x{} or \o{} is too large at offset 9
+/\x{110000}/utf
+Failed: error 134 at offset 9: character code point value in \x{} or \o{} is too large
 
-/[\x{ff}]/8BM
+/[\x{ff}]/utf
 Memory allocation (code space): 28
 ------------------------------------------------------------------
   0   4 Bra
@@ -337,7 +341,7 @@
   6     End
 ------------------------------------------------------------------
 
-/[\x{100}]/8BM
+/[\x{100}]/utf
 Memory allocation (code space): 28
 ------------------------------------------------------------------
   0   4 Bra
@@ -346,16 +350,16 @@
   6     End
 ------------------------------------------------------------------
 
-/\x80/8BM
+/\x80/utf
 Memory allocation (code space): 28
 ------------------------------------------------------------------
   0   4 Bra
-  2     \x80
+  2     \x{80}
   4   4 Ket
   6     End
 ------------------------------------------------------------------
 
-/\xff/8BM
+/\xff/utf
 Memory allocation (code space): 28
 ------------------------------------------------------------------
   0   4 Bra
@@ -364,7 +368,7 @@
   6     End
 ------------------------------------------------------------------
 
-/\x{0041}\x{2262}\x{0391}\x{002e}/D8M
+/\x{0041}\x{2262}\x{0391}\x{002e}/I,utf
 Memory allocation (code space): 52
 ------------------------------------------------------------------
   0  10 Bra
@@ -374,10 +378,11 @@
 ------------------------------------------------------------------
 Capturing subpattern count = 0
 Options: utf
-First char = 'A'
-Need char = '.'
-    
-/\x{D55c}\x{ad6d}\x{C5B4}/D8M 
+First code unit = 'A'
+Last code unit = '.'
+Subject length lower bound = 4
+
+/\x{D55c}\x{ad6d}\x{C5B4}/I,utf
 Memory allocation (code space): 44
 ------------------------------------------------------------------
   0   8 Bra
@@ -387,10 +392,11 @@
 ------------------------------------------------------------------
 Capturing subpattern count = 0
 Options: utf
-First char = \x{d55c}
-Need char = \x{c5b4}
+First code unit = \x{d55c}
+Last code unit = \x{c5b4}
+Subject length lower bound = 3
 
-/\x{65e5}\x{672c}\x{8a9e}/D8M
+/\x{65e5}\x{672c}\x{8a9e}/I,utf
 Memory allocation (code space): 44
 ------------------------------------------------------------------
   0   8 Bra
@@ -400,10 +406,11 @@
 ------------------------------------------------------------------
 Capturing subpattern count = 0
 Options: utf
-First char = \x{65e5}
-Need char = \x{8a9e}
+First code unit = \x{65e5}
+Last code unit = \x{8a9e}
+Subject length lower bound = 3
 
-/[\x{100}]/8BM
+/[\x{100}]/utf
 Memory allocation (code space): 28
 ------------------------------------------------------------------
   0   4 Bra
@@ -412,7 +419,7 @@
   6     End
 ------------------------------------------------------------------
 
-/[Z\x{100}]/8BM
+/[Z\x{100}]/utf
 Memory allocation (code space): 76
 ------------------------------------------------------------------
   0  16 Bra
@@ -421,7 +428,7 @@
  18     End
 ------------------------------------------------------------------
 
-/^[\x{100}\E-\Q\E\x{150}]/B8M
+/^[\x{100}\E-\Q\E\x{150}]/utf
 Memory allocation (code space): 52
 ------------------------------------------------------------------
   0  10 Bra
@@ -431,7 +438,7 @@
  12     End
 ------------------------------------------------------------------
 
-/^[\QĀ\E-\QŐ\E]/B8M
+/^[\QĀ\E-\QŐ\E]/utf
 Memory allocation (code space): 52
 ------------------------------------------------------------------
   0  10 Bra
@@ -441,10 +448,10 @@
  12     End
 ------------------------------------------------------------------
 
-/^[\QĀ\E-\QŐ\E/B8M
-Failed: missing terminating ] for character class at offset 13
+/^[\QĀ\E-\QŐ\E/utf
+Failed: error 106 at offset 13: missing terminating ] for character class
 
-/[\p{L}]/BM
+/[\p{L}]/
 Memory allocation (code space): 48
 ------------------------------------------------------------------
   0   9 Bra
@@ -453,7 +460,7 @@
  11     End
 ------------------------------------------------------------------
 
-/[\p{^L}]/BM
+/[\p{^L}]/
 Memory allocation (code space): 48
 ------------------------------------------------------------------
   0   9 Bra
@@ -462,7 +469,7 @@
  11     End
 ------------------------------------------------------------------
 
-/[\P{L}]/BM
+/[\P{L}]/
 Memory allocation (code space): 48
 ------------------------------------------------------------------
   0   9 Bra
@@ -471,7 +478,7 @@
  11     End
 ------------------------------------------------------------------
 
-/[\P{^L}]/BM
+/[\P{^L}]/
 Memory allocation (code space): 48
 ------------------------------------------------------------------
   0   9 Bra
@@ -480,7 +487,7 @@
  11     End
 ------------------------------------------------------------------
 
-/[abc\p{L}\x{0660}]/8BM
+/[abc\p{L}\x{0660}]/utf
 Memory allocation (code space): 88
 ------------------------------------------------------------------
   0  19 Bra
@@ -489,7 +496,7 @@
  21     End
 ------------------------------------------------------------------
 
-/[\p{Nd}]/8BM
+/[\p{Nd}]/utf
 Memory allocation (code space): 48
 ------------------------------------------------------------------
   0   9 Bra
@@ -498,7 +505,7 @@
  11     End
 ------------------------------------------------------------------
 
-/[\p{Nd}+-]+/8BM
+/[\p{Nd}+-]+/utf
 Memory allocation (code space): 84
 ------------------------------------------------------------------
   0  18 Bra
@@ -507,7 +514,7 @@
  20     End
 ------------------------------------------------------------------
 
-/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/8iBM
+/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/i,utf
 Memory allocation (code space): 60
 ------------------------------------------------------------------
   0  12 Bra
@@ -516,7 +523,7 @@
  14     End
 ------------------------------------------------------------------
 
-/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/8BM
+/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/utf
 Memory allocation (code space): 60
 ------------------------------------------------------------------
   0  12 Bra
@@ -525,7 +532,7 @@
  14     End
 ------------------------------------------------------------------
 
-/[\x{105}-\x{109}]/8iBM
+/[\x{105}-\x{109}]/i,utf
 Memory allocation (code space): 48
 ------------------------------------------------------------------
   0   9 Bra
@@ -534,7 +541,7 @@
  11     End
 ------------------------------------------------------------------
 
-/( ( (?(1)0|) )*   )/xBM
+/( ( (?(1)0|) )*   )/x
 Memory allocation (code space): 104
 ------------------------------------------------------------------
   0  23 Bra
@@ -552,7 +559,7 @@
  25     End
 ------------------------------------------------------------------
 
-/(  (?(1)0|)*   )/xBM
+/(  (?(1)0|)*   )/x
 Memory allocation (code space): 84
 ------------------------------------------------------------------
   0  18 Bra
@@ -568,7 +575,7 @@
  20     End
 ------------------------------------------------------------------
 
-/[a]/BM
+/[a]/
 Memory allocation (code space): 28
 ------------------------------------------------------------------
   0   4 Bra
@@ -577,7 +584,7 @@
   6     End
 ------------------------------------------------------------------
 
-/[a]/8BM
+/[a]/utf
 Memory allocation (code space): 28
 ------------------------------------------------------------------
   0   4 Bra
@@ -586,7 +593,7 @@
   6     End
 ------------------------------------------------------------------
 
-/[\xaa]/BM
+/[\xaa]/
 Memory allocation (code space): 28
 ------------------------------------------------------------------
   0   4 Bra
@@ -595,7 +602,7 @@
   6     End
 ------------------------------------------------------------------
 
-/[\xaa]/8BM
+/[\xaa]/utf
 Memory allocation (code space): 28
 ------------------------------------------------------------------
   0   4 Bra
@@ -604,7 +611,7 @@
   6     End
 ------------------------------------------------------------------
 
-/[^a]/BM
+/[^a]/
 Memory allocation (code space): 28
 ------------------------------------------------------------------
   0   4 Bra
@@ -613,7 +620,7 @@
   6     End
 ------------------------------------------------------------------
 
-/[^a]/8BM
+/[^a]/utf
 Memory allocation (code space): 28
 ------------------------------------------------------------------
   0   4 Bra
@@ -622,7 +629,7 @@
   6     End
 ------------------------------------------------------------------
 
-/[^\xaa]/BM
+/[^\xaa]/
 Memory allocation (code space): 28
 ------------------------------------------------------------------
   0   4 Bra
@@ -631,7 +638,7 @@
   6     End
 ------------------------------------------------------------------
 
-/[^\xaa]/8BM
+/[^\xaa]/utf
 Memory allocation (code space): 28
 ------------------------------------------------------------------
   0   4 Bra
@@ -640,7 +647,9 @@
   6     End
 ------------------------------------------------------------------
 
-/[^\d]/8WB
+#pattern -memory
+
+/[^\d]/utf,ucp
 ------------------------------------------------------------------
   0   9 Bra
   2     [^\p{Nd}]
@@ -648,23 +657,23 @@
  11     End
 ------------------------------------------------------------------
 
-/[[:^alpha:][:^cntrl:]]+/8WB
+/[[:^alpha:][:^cntrl:]]+/utf,ucp
 ------------------------------------------------------------------
-  0  21 Bra
-  2     [ -~\x80-\xff\P{L}\x{100}-\x{10ffff}]++
- 21  21 Ket
- 23     End
+  0  13 Bra
+  2     [\P{L}\P{Cc}]++
+ 13  13 Ket
+ 15     End
 ------------------------------------------------------------------
 
-/[[:^cntrl:][:^alpha:]]+/8WB
+/[[:^cntrl:][:^alpha:]]+/utf,ucp
 ------------------------------------------------------------------
-  0  21 Bra
-  2     [ -~\x80-\xff\x{100}-\x{10ffff}\P{L}]++
- 21  21 Ket
- 23     End
+  0  13 Bra
+  2     [\P{Cc}\P{L}]++
+ 13  13 Ket
+ 15     End
 ------------------------------------------------------------------
 
-/[[:alpha:]]+/8WB
+/[[:alpha:]]+/utf,ucp
 ------------------------------------------------------------------
   0  10 Bra
   2     [\p{L}]++
@@ -672,7 +681,7 @@
  12     End
 ------------------------------------------------------------------
 
-/[[:^alpha:]\S]+/8WB
+/[[:^alpha:]\S]+/utf,ucp
 ------------------------------------------------------------------
   0  13 Bra
   2     [\P{L}\P{Xsp}]++
@@ -680,7 +689,7 @@
  15     End
 ------------------------------------------------------------------
 
-/abc(d|e)(*THEN)x(123(*THEN)4|567(b|q)(*THEN)xx)/B
+/abc(d|e)(*THEN)x(123(*THEN)4|567(b|q)(*THEN)xx)/
 ------------------------------------------------------------------
   0  60 Bra
   2     abc
@@ -709,7 +718,7 @@
  62     End
 ------------------------------------------------------------------
 
-/(((a\2)|(a*)\g<-1>))*a?/B
+/(((a\2)|(a*)\g<-1>))*a?/
 ------------------------------------------------------------------
   0  39 Bra
   2     Brazero
@@ -733,7 +742,7 @@
  41     End
 ------------------------------------------------------------------
 
-/((?+1)(\1))/B
+/((?+1)(\1))/
 ------------------------------------------------------------------
   0  20 Bra
   2  16 Once
@@ -748,21 +757,270 @@
  22     End
 ------------------------------------------------------------------
 
-/.((?2)(?R)\1)()/B
+"(?1)(?#?'){2}(a)"
 ------------------------------------------------------------------
-  0  23 Bra
-  2     Any
-  3  13 Once
-  5   9 CBra 1
-  8  18 Recurse
- 10   0 Recurse
- 12     \1
- 14   9 Ket
- 16  13 Ket
- 18   3 CBra 2
- 21   3 Ket
- 23  23 Ket
- 25     End
+  0  21 Bra
+  2   4 Once
+  4  14 Recurse
+  6   4 Ket
+  8   4 Once
+ 10  14 Recurse
+ 12   4 Ket
+ 14   5 CBra 1
+ 17     a
+ 19   5 Ket
+ 21  21 Ket
+ 23     End
 ------------------------------------------------------------------
 
-/-- End of testinput11 --/
+/.((?2)(?R)|\1|$)()/
+------------------------------------------------------------------
+  0  28 Bra
+  2     Any
+  3  18 Once
+  5   7 CBra 1
+  8  23 Recurse
+ 10   0 Recurse
+ 12   4 Alt
+ 14     \1
+ 16   3 Alt
+ 18     $
+ 19  14 Ket
+ 21  18 Ket
+ 23   3 CBra 2
+ 26   3 Ket
+ 28  28 Ket
+ 30     End
+------------------------------------------------------------------
+
+/.((?3)(?R)()(?2)|\1|$)()/
+------------------------------------------------------------------
+  0  35 Bra
+  2     Any
+  3  25 Once
+  5  14 CBra 1
+  8  30 Recurse
+ 10   0 Recurse
+ 12   3 CBra 2
+ 15   3 Ket
+ 17  12 Recurse
+ 19   4 Alt
+ 21     \1
+ 23   3 Alt
+ 25     $
+ 26  21 Ket
+ 28  25 Ket
+ 30   3 CBra 3
+ 33   3 Ket
+ 35  35 Ket
+ 37     End
+------------------------------------------------------------------
+
+/(?1)()((((((\1++))\x85)+)|))/
+------------------------------------------------------------------
+  0  50 Bra
+  2   4 Recurse
+  4   3 CBra 1
+  7   3 Ket
+  9  39 CBra 2
+ 12  32 CBra 3
+ 15  27 CBra 4
+ 18  22 CBra 5
+ 21  15 CBra 6
+ 24  10 CBra 7
+ 27   5 Once
+ 29     \1+
+ 32   5 Ket
+ 34  10 Ket
+ 36  15 Ket
+ 38     \x{85}
+ 40  22 KetRmax
+ 42  27 Ket
+ 44   2 Alt
+ 46  34 Ket
+ 48  39 Ket
+ 50  50 Ket
+ 52     End
+------------------------------------------------------------------
+
+# Check the absolute limit on nesting (?| etc. This varies with code unit
+# width because the workspace is a different number of bytes. It will fail
+# with link size 2 in 8-bit and 16-bit but not in 32-bit.
+
+/(?|(?|(?J:(?|(?x:(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|
+)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
+/parens_nest_limit=1000,-fullbincode
+
+# Use "expand" to create some very long patterns with nested parentheses, in
+# order to test workspace overflow. Again, this varies with code unit width,
+# and even with it fails in two modes, the error offset differs. It also varies
+# with link size - hence multiple tests with different values.
+
+/(?'ABC'\[[bar](]{105}*THEN:\[A]{255}\[)]{106}/expand,-fullbincode
+
+/(?'ABC'\[[bar](]{106}*THEN:\[A]{255}\[)]{107}/expand,-fullbincode
+
+/(?'ABC'\[[bar](]{159}*THEN:\[A]{255}\[)]{160}/expand,-fullbincode
+
+/(?'ABC'\[[bar](]{199}*THEN:\[A]{255}\[)]{200}/expand,-fullbincode
+Failed: error 186 at offset 979: regular expression is too complicated
+
+/(?'ABC'\[[bar](]{299}*THEN:\[A]{255}\[)]{300}/expand,-fullbincode
+Failed: error 186 at offset 979: regular expression is too complicated
+
+/(?(1)(?1)){8,}+()/debug
+------------------------------------------------------------------
+  0  79 Bra
+  2  70 Once
+  4   6 Cond
+  6   1 Cond ref
+  8  74 Recurse
+ 10   6 Ket
+ 12   6 Cond
+ 14   1 Cond ref
+ 16  74 Recurse
+ 18   6 Ket
+ 20   6 Cond
+ 22   1 Cond ref
+ 24  74 Recurse
+ 26   6 Ket
+ 28   6 Cond
+ 30   1 Cond ref
+ 32  74 Recurse
+ 34   6 Ket
+ 36   6 Cond
+ 38   1 Cond ref
+ 40  74 Recurse
+ 42   6 Ket
+ 44   6 Cond
+ 46   1 Cond ref
+ 48  74 Recurse
+ 50   6 Ket
+ 52   6 Cond
+ 54   1 Cond ref
+ 56  74 Recurse
+ 58   6 Ket
+ 60  10 SBraPos
+ 62   6 SCond
+ 64   1 Cond ref
+ 66  74 Recurse
+ 68   6 Ket
+ 70  10 KetRpos
+ 72  70 Ket
+ 74   3 CBra 1
+ 77   3 Ket
+ 79  79 Ket
+ 81     End
+------------------------------------------------------------------
+Capturing subpattern count = 1
+Max back reference = 1
+May match empty string
+Subject length lower bound = 0
+    abcd
+ 0: 
+ 1: 
+
+/(?(1)|a(?1)b){2,}+()/debug
+------------------------------------------------------------------
+  0  43 Bra
+  2  34 Once
+  4   4 Cond
+  6   1 Cond ref
+  8   8 Alt
+ 10     a
+ 12  38 Recurse
+ 14     b
+ 16  12 Ket
+ 18  16 SBraPos
+ 20   4 SCond
+ 22   1 Cond ref
+ 24   8 Alt
+ 26     a
+ 28  38 Recurse
+ 30     b
+ 32  12 Ket
+ 34  16 KetRpos
+ 36  34 Ket
+ 38   3 CBra 1
+ 41   3 Ket
+ 43  43 Ket
+ 45     End
+------------------------------------------------------------------
+Capturing subpattern count = 1
+Max back reference = 1
+May match empty string
+Subject length lower bound = 0
+    abcde
+No match
+
+/((?1)(?2)(?3)(?4)(?5)(?6)(?7)(?8)(?9)(?9)(?8)(?7)(?6)(?5)(?4)(?3)(?2)(?1)(?0)){2,}()()()()()()()()()/debug
+------------------------------------------------------------------
+  0 133 Bra
+  2  41 CBra 1
+  5   2 Recurse
+  7  88 Recurse
+  9  93 Recurse
+ 11  98 Recurse
+ 13 103 Recurse
+ 15 108 Recurse
+ 17 113 Recurse
+ 19 118 Recurse
+ 21 123 Recurse
+ 23 123 Recurse
+ 25 118 Recurse
+ 27 113 Recurse
+ 29 108 Recurse
+ 31 103 Recurse
+ 33  98 Recurse
+ 35  93 Recurse
+ 37  88 Recurse
+ 39   2 Recurse
+ 41   0 Recurse
+ 43  41 Ket
+ 45  41 SCBra 1
+ 48   2 Recurse
+ 50  88 Recurse
+ 52  93 Recurse
+ 54  98 Recurse
+ 56 103 Recurse
+ 58 108 Recurse
+ 60 113 Recurse
+ 62 118 Recurse
+ 64 123 Recurse
+ 66 123 Recurse
+ 68 118 Recurse
+ 70 113 Recurse
+ 72 108 Recurse
+ 74 103 Recurse
+ 76  98 Recurse
+ 78  93 Recurse
+ 80  88 Recurse
+ 82   2 Recurse
+ 84   0 Recurse
+ 86  41 KetRmax
+ 88   3 CBra 2
+ 91   3 Ket
+ 93   3 CBra 3
+ 96   3 Ket
+ 98   3 CBra 4
+101   3 Ket
+103   3 CBra 5
+106   3 Ket
+108   3 CBra 6
+111   3 Ket
+113   3 CBra 7
+116   3 Ket
+118   3 CBra 8
+121   3 Ket
+123   3 CBra 9
+126   3 Ket
+128   3 CBra 10
+131   3 Ket
+133 133 Ket
+135     End
+------------------------------------------------------------------
+Capturing subpattern count = 10
+May match empty string
+Subject length lower bound = 0
+
+# End of testinput8
diff --git a/dist/testdata/testoutput11-32 b/dist2/testdata/testoutput8-32-3
similarity index 64%
copy from dist/testdata/testoutput11-32
copy to dist2/testdata/testoutput8-32-3
index 57e5da0..babd0c7 100644
--- a/dist/testdata/testoutput11-32
+++ b/dist2/testdata/testoutput8-32-3
@@ -1,10 +1,15 @@
-/-- These are a few representative patterns whose lengths and offsets are to be 
-shown when the link size is 2. This is just a doublecheck test to ensure the 
-sizes don't go horribly wrong when something is changed. The pattern contents 
-are all themselves checked in other tests. Unicode, including property support, 
-is required for these tests. --/
+# There are two sorts of patterns in this test. A number of them are
+# representative patterns whose lengths and offsets are checked. This is just a
+# doublecheck test to ensure the sizes don't go horribly wrong when something
+# is changed. The operation of these patterns is checked in other tests.
+#
+# This file also contains tests whose output varies with code unit size and/or
+# link size. Unicode support is required for these tests. There are separate
+# output files for each code unit size and link size.
 
-/((?i)b)/BM
+#pattern fullbincode,memory
+
+/((?i)b)/
 Memory allocation (code space): 48
 ------------------------------------------------------------------
   0   9 Bra
@@ -15,7 +20,7 @@
  11     End
 ------------------------------------------------------------------
 
-/(?s)(.*X|^B)/BM
+/(?s)(.*X|^B)/
 Memory allocation (code space): 76
 ------------------------------------------------------------------
   0  16 Bra
@@ -30,7 +35,7 @@
  18     End
 ------------------------------------------------------------------
 
-/(?s:.*X|^B)/BM
+/(?s:.*X|^B)/
 Memory allocation (code space): 72
 ------------------------------------------------------------------
   0  15 Bra
@@ -45,7 +50,7 @@
  17     End
 ------------------------------------------------------------------
 
-/^[[:alnum:]]/BM
+/^[[:alnum:]]/
 Memory allocation (code space): 60
 ------------------------------------------------------------------
   0  12 Bra
@@ -55,7 +60,7 @@
  14     End
 ------------------------------------------------------------------
 
-/#/IxMD
+/#/Ix
 Memory allocation (code space): 20
 ------------------------------------------------------------------
   0   2 Bra
@@ -65,10 +70,9 @@
 Capturing subpattern count = 0
 May match empty string
 Options: extended
-No first char
-No need char
+Subject length lower bound = 0
 
-/a#/IxMD
+/a#/Ix
 Memory allocation (code space): 28
 ------------------------------------------------------------------
   0   4 Bra
@@ -78,10 +82,10 @@
 ------------------------------------------------------------------
 Capturing subpattern count = 0
 Options: extended
-First char = 'a'
-No need char
+First code unit = 'a'
+Subject length lower bound = 1
 
-/x?+/BM
+/x?+/
 Memory allocation (code space): 28
 ------------------------------------------------------------------
   0   4 Bra
@@ -90,7 +94,7 @@
   6     End
 ------------------------------------------------------------------
 
-/x++/BM
+/x++/
 Memory allocation (code space): 28
 ------------------------------------------------------------------
   0   4 Bra
@@ -99,7 +103,7 @@
   6     End
 ------------------------------------------------------------------
 
-/x{1,3}+/BM 
+/x{1,3}+/
 Memory allocation (code space): 40
 ------------------------------------------------------------------
   0   7 Bra
@@ -109,7 +113,7 @@
   9     End
 ------------------------------------------------------------------
 
-/(x)*+/BM
+/(x)*+/
 Memory allocation (code space): 52
 ------------------------------------------------------------------
   0  10 Bra
@@ -121,7 +125,7 @@
  12     End
 ------------------------------------------------------------------
 
-/^((a+)(?U)([ab]+)(?-U)([bc]+)(\w*))/BM
+/^((a+)(?U)([ab]+)(?-U)([bc]+)(\w*))/
 Memory allocation (code space): 220
 ------------------------------------------------------------------
   0  52 Bra
@@ -144,7 +148,7 @@
  54     End
 ------------------------------------------------------------------
 
-|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|BM
+"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"
 Memory allocation (code space): 3296
 ------------------------------------------------------------------
   0 821 Bra
@@ -154,7 +158,7 @@
 823     End
 ------------------------------------------------------------------
 
-|\$\<\.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|BM
+"\$\<\.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"
 Memory allocation (code space): 3256
 ------------------------------------------------------------------
   0 811 Bra
@@ -164,7 +168,7 @@
 813     End
 ------------------------------------------------------------------
 
-/(a(?1)b)/BM
+/(a(?1)b)/
 Memory allocation (code space): 64
 ------------------------------------------------------------------
   0  13 Bra
@@ -177,7 +181,7 @@
  15     End
 ------------------------------------------------------------------
 
-/(a(?1)+b)/BM
+/(a(?1)+b)/
 Memory allocation (code space): 80
 ------------------------------------------------------------------
   0  17 Bra
@@ -192,8 +196,8 @@
  19     End
 ------------------------------------------------------------------
 
-/a(?P<name1>b|c)d(?P<longername2>e)/BM
-Memory allocation (code space): 186
+/a(?P<name1>b|c)d(?P<longername2>e)/
+Memory allocation (code space): 108
 ------------------------------------------------------------------
   0  24 Bra
   2     a
@@ -210,8 +214,8 @@
  26     End
 ------------------------------------------------------------------
 
-/(?:a(?P<c>c(?P<d>d)))(?P<a>a)/BM
-Memory allocation (code space): 155
+/(?:a(?P<c>c(?P<d>d)))(?P<a>a)/
+Memory allocation (code space): 128
 ------------------------------------------------------------------
   0  29 Bra
   2  18 Bra
@@ -230,8 +234,8 @@
  31     End
 ------------------------------------------------------------------
 
-/(?P<a>a)...(?P=a)bbb(?P>a)d/BM
-Memory allocation (code space): 157
+/(?P<a>a)...(?P=a)bbb(?P>a)d/
+Memory allocation (code space): 108
 ------------------------------------------------------------------
   0  24 Bra
   2   5 CBra 1
@@ -248,7 +252,7 @@
  26     End
 ------------------------------------------------------------------
 
-/abc(?C255)de(?C)f/BM
+/abc(?C255)de(?C)f/
 Memory allocation (code space): 100
 ------------------------------------------------------------------
   0  22 Bra
@@ -261,7 +265,7 @@
  24     End
 ------------------------------------------------------------------
 
-/abcde/CBM
+/abcde/auto_callout
 Memory allocation (code space): 156
 ------------------------------------------------------------------
   0  36 Bra
@@ -280,7 +284,7 @@
  38     End
 ------------------------------------------------------------------
 
-/\x{100}/8BM
+/\x{100}/utf
 Memory allocation (code space): 28
 ------------------------------------------------------------------
   0   4 Bra
@@ -289,7 +293,7 @@
   6     End
 ------------------------------------------------------------------
 
-/\x{1000}/8BM
+/\x{1000}/utf
 Memory allocation (code space): 28
 ------------------------------------------------------------------
   0   4 Bra
@@ -298,7 +302,7 @@
   6     End
 ------------------------------------------------------------------
 
-/\x{10000}/8BM
+/\x{10000}/utf
 Memory allocation (code space): 28
 ------------------------------------------------------------------
   0   4 Bra
@@ -307,7 +311,7 @@
   6     End
 ------------------------------------------------------------------
 
-/\x{100000}/8BM
+/\x{100000}/utf
 Memory allocation (code space): 28
 ------------------------------------------------------------------
   0   4 Bra
@@ -316,7 +320,7 @@
   6     End
 ------------------------------------------------------------------
 
-/\x{10ffff}/8BM
+/\x{10ffff}/utf
 Memory allocation (code space): 28
 ------------------------------------------------------------------
   0   4 Bra
@@ -325,10 +329,10 @@
   6     End
 ------------------------------------------------------------------
 
-/\x{110000}/8BM
-Failed: character value in \x{} or \o{} is too large at offset 9
+/\x{110000}/utf
+Failed: error 134 at offset 9: character code point value in \x{} or \o{} is too large
 
-/[\x{ff}]/8BM
+/[\x{ff}]/utf
 Memory allocation (code space): 28
 ------------------------------------------------------------------
   0   4 Bra
@@ -337,7 +341,7 @@
   6     End
 ------------------------------------------------------------------
 
-/[\x{100}]/8BM
+/[\x{100}]/utf
 Memory allocation (code space): 28
 ------------------------------------------------------------------
   0   4 Bra
@@ -346,16 +350,16 @@
   6     End
 ------------------------------------------------------------------
 
-/\x80/8BM
+/\x80/utf
 Memory allocation (code space): 28
 ------------------------------------------------------------------
   0   4 Bra
-  2     \x80
+  2     \x{80}
   4   4 Ket
   6     End
 ------------------------------------------------------------------
 
-/\xff/8BM
+/\xff/utf
 Memory allocation (code space): 28
 ------------------------------------------------------------------
   0   4 Bra
@@ -364,7 +368,7 @@
   6     End
 ------------------------------------------------------------------
 
-/\x{0041}\x{2262}\x{0391}\x{002e}/D8M
+/\x{0041}\x{2262}\x{0391}\x{002e}/I,utf
 Memory allocation (code space): 52
 ------------------------------------------------------------------
   0  10 Bra
@@ -374,10 +378,11 @@
 ------------------------------------------------------------------
 Capturing subpattern count = 0
 Options: utf
-First char = 'A'
-Need char = '.'
-    
-/\x{D55c}\x{ad6d}\x{C5B4}/D8M 
+First code unit = 'A'
+Last code unit = '.'
+Subject length lower bound = 4
+
+/\x{D55c}\x{ad6d}\x{C5B4}/I,utf
 Memory allocation (code space): 44
 ------------------------------------------------------------------
   0   8 Bra
@@ -387,10 +392,11 @@
 ------------------------------------------------------------------
 Capturing subpattern count = 0
 Options: utf
-First char = \x{d55c}
-Need char = \x{c5b4}
+First code unit = \x{d55c}
+Last code unit = \x{c5b4}
+Subject length lower bound = 3
 
-/\x{65e5}\x{672c}\x{8a9e}/D8M
+/\x{65e5}\x{672c}\x{8a9e}/I,utf
 Memory allocation (code space): 44
 ------------------------------------------------------------------
   0   8 Bra
@@ -400,10 +406,11 @@
 ------------------------------------------------------------------
 Capturing subpattern count = 0
 Options: utf
-First char = \x{65e5}
-Need char = \x{8a9e}
+First code unit = \x{65e5}
+Last code unit = \x{8a9e}
+Subject length lower bound = 3
 
-/[\x{100}]/8BM
+/[\x{100}]/utf
 Memory allocation (code space): 28
 ------------------------------------------------------------------
   0   4 Bra
@@ -412,7 +419,7 @@
   6     End
 ------------------------------------------------------------------
 
-/[Z\x{100}]/8BM
+/[Z\x{100}]/utf
 Memory allocation (code space): 76
 ------------------------------------------------------------------
   0  16 Bra
@@ -421,7 +428,7 @@
  18     End
 ------------------------------------------------------------------
 
-/^[\x{100}\E-\Q\E\x{150}]/B8M
+/^[\x{100}\E-\Q\E\x{150}]/utf
 Memory allocation (code space): 52
 ------------------------------------------------------------------
   0  10 Bra
@@ -431,7 +438,7 @@
  12     End
 ------------------------------------------------------------------
 
-/^[\QĀ\E-\QŐ\E]/B8M
+/^[\QĀ\E-\QŐ\E]/utf
 Memory allocation (code space): 52
 ------------------------------------------------------------------
   0  10 Bra
@@ -441,10 +448,10 @@
  12     End
 ------------------------------------------------------------------
 
-/^[\QĀ\E-\QŐ\E/B8M
-Failed: missing terminating ] for character class at offset 13
+/^[\QĀ\E-\QŐ\E/utf
+Failed: error 106 at offset 13: missing terminating ] for character class
 
-/[\p{L}]/BM
+/[\p{L}]/
 Memory allocation (code space): 48
 ------------------------------------------------------------------
   0   9 Bra
@@ -453,7 +460,7 @@
  11     End
 ------------------------------------------------------------------
 
-/[\p{^L}]/BM
+/[\p{^L}]/
 Memory allocation (code space): 48
 ------------------------------------------------------------------
   0   9 Bra
@@ -462,7 +469,7 @@
  11     End
 ------------------------------------------------------------------
 
-/[\P{L}]/BM
+/[\P{L}]/
 Memory allocation (code space): 48
 ------------------------------------------------------------------
   0   9 Bra
@@ -471,7 +478,7 @@
  11     End
 ------------------------------------------------------------------
 
-/[\P{^L}]/BM
+/[\P{^L}]/
 Memory allocation (code space): 48
 ------------------------------------------------------------------
   0   9 Bra
@@ -480,7 +487,7 @@
  11     End
 ------------------------------------------------------------------
 
-/[abc\p{L}\x{0660}]/8BM
+/[abc\p{L}\x{0660}]/utf
 Memory allocation (code space): 88
 ------------------------------------------------------------------
   0  19 Bra
@@ -489,7 +496,7 @@
  21     End
 ------------------------------------------------------------------
 
-/[\p{Nd}]/8BM
+/[\p{Nd}]/utf
 Memory allocation (code space): 48
 ------------------------------------------------------------------
   0   9 Bra
@@ -498,7 +505,7 @@
  11     End
 ------------------------------------------------------------------
 
-/[\p{Nd}+-]+/8BM
+/[\p{Nd}+-]+/utf
 Memory allocation (code space): 84
 ------------------------------------------------------------------
   0  18 Bra
@@ -507,7 +514,7 @@
  20     End
 ------------------------------------------------------------------
 
-/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/8iBM
+/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/i,utf
 Memory allocation (code space): 60
 ------------------------------------------------------------------
   0  12 Bra
@@ -516,7 +523,7 @@
  14     End
 ------------------------------------------------------------------
 
-/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/8BM
+/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/utf
 Memory allocation (code space): 60
 ------------------------------------------------------------------
   0  12 Bra
@@ -525,7 +532,7 @@
  14     End
 ------------------------------------------------------------------
 
-/[\x{105}-\x{109}]/8iBM
+/[\x{105}-\x{109}]/i,utf
 Memory allocation (code space): 48
 ------------------------------------------------------------------
   0   9 Bra
@@ -534,7 +541,7 @@
  11     End
 ------------------------------------------------------------------
 
-/( ( (?(1)0|) )*   )/xBM
+/( ( (?(1)0|) )*   )/x
 Memory allocation (code space): 104
 ------------------------------------------------------------------
   0  23 Bra
@@ -552,7 +559,7 @@
  25     End
 ------------------------------------------------------------------
 
-/(  (?(1)0|)*   )/xBM
+/(  (?(1)0|)*   )/x
 Memory allocation (code space): 84
 ------------------------------------------------------------------
   0  18 Bra
@@ -568,7 +575,7 @@
  20     End
 ------------------------------------------------------------------
 
-/[a]/BM
+/[a]/
 Memory allocation (code space): 28
 ------------------------------------------------------------------
   0   4 Bra
@@ -577,7 +584,7 @@
   6     End
 ------------------------------------------------------------------
 
-/[a]/8BM
+/[a]/utf
 Memory allocation (code space): 28
 ------------------------------------------------------------------
   0   4 Bra
@@ -586,7 +593,7 @@
   6     End
 ------------------------------------------------------------------
 
-/[\xaa]/BM
+/[\xaa]/
 Memory allocation (code space): 28
 ------------------------------------------------------------------
   0   4 Bra
@@ -595,7 +602,7 @@
   6     End
 ------------------------------------------------------------------
 
-/[\xaa]/8BM
+/[\xaa]/utf
 Memory allocation (code space): 28
 ------------------------------------------------------------------
   0   4 Bra
@@ -604,7 +611,7 @@
   6     End
 ------------------------------------------------------------------
 
-/[^a]/BM
+/[^a]/
 Memory allocation (code space): 28
 ------------------------------------------------------------------
   0   4 Bra
@@ -613,7 +620,7 @@
   6     End
 ------------------------------------------------------------------
 
-/[^a]/8BM
+/[^a]/utf
 Memory allocation (code space): 28
 ------------------------------------------------------------------
   0   4 Bra
@@ -622,7 +629,7 @@
   6     End
 ------------------------------------------------------------------
 
-/[^\xaa]/BM
+/[^\xaa]/
 Memory allocation (code space): 28
 ------------------------------------------------------------------
   0   4 Bra
@@ -631,7 +638,7 @@
   6     End
 ------------------------------------------------------------------
 
-/[^\xaa]/8BM
+/[^\xaa]/utf
 Memory allocation (code space): 28
 ------------------------------------------------------------------
   0   4 Bra
@@ -640,7 +647,9 @@
   6     End
 ------------------------------------------------------------------
 
-/[^\d]/8WB
+#pattern -memory
+
+/[^\d]/utf,ucp
 ------------------------------------------------------------------
   0   9 Bra
   2     [^\p{Nd}]
@@ -648,23 +657,23 @@
  11     End
 ------------------------------------------------------------------
 
-/[[:^alpha:][:^cntrl:]]+/8WB
+/[[:^alpha:][:^cntrl:]]+/utf,ucp
 ------------------------------------------------------------------
-  0  21 Bra
-  2     [ -~\x80-\xff\P{L}\x{100}-\x{10ffff}]++
- 21  21 Ket
- 23     End
+  0  13 Bra
+  2     [\P{L}\P{Cc}]++
+ 13  13 Ket
+ 15     End
 ------------------------------------------------------------------
 
-/[[:^cntrl:][:^alpha:]]+/8WB
+/[[:^cntrl:][:^alpha:]]+/utf,ucp
 ------------------------------------------------------------------
-  0  21 Bra
-  2     [ -~\x80-\xff\x{100}-\x{10ffff}\P{L}]++
- 21  21 Ket
- 23     End
+  0  13 Bra
+  2     [\P{Cc}\P{L}]++
+ 13  13 Ket
+ 15     End
 ------------------------------------------------------------------
 
-/[[:alpha:]]+/8WB
+/[[:alpha:]]+/utf,ucp
 ------------------------------------------------------------------
   0  10 Bra
   2     [\p{L}]++
@@ -672,7 +681,7 @@
  12     End
 ------------------------------------------------------------------
 
-/[[:^alpha:]\S]+/8WB
+/[[:^alpha:]\S]+/utf,ucp
 ------------------------------------------------------------------
   0  13 Bra
   2     [\P{L}\P{Xsp}]++
@@ -680,7 +689,7 @@
  15     End
 ------------------------------------------------------------------
 
-/abc(d|e)(*THEN)x(123(*THEN)4|567(b|q)(*THEN)xx)/B
+/abc(d|e)(*THEN)x(123(*THEN)4|567(b|q)(*THEN)xx)/
 ------------------------------------------------------------------
   0  60 Bra
   2     abc
@@ -709,7 +718,7 @@
  62     End
 ------------------------------------------------------------------
 
-/(((a\2)|(a*)\g<-1>))*a?/B
+/(((a\2)|(a*)\g<-1>))*a?/
 ------------------------------------------------------------------
   0  39 Bra
   2     Brazero
@@ -733,7 +742,7 @@
  41     End
 ------------------------------------------------------------------
 
-/((?+1)(\1))/B
+/((?+1)(\1))/
 ------------------------------------------------------------------
   0  20 Bra
   2  16 Once
@@ -748,21 +757,270 @@
  22     End
 ------------------------------------------------------------------
 
-/.((?2)(?R)\1)()/B
+"(?1)(?#?'){2}(a)"
 ------------------------------------------------------------------
-  0  23 Bra
-  2     Any
-  3  13 Once
-  5   9 CBra 1
-  8  18 Recurse
- 10   0 Recurse
- 12     \1
- 14   9 Ket
- 16  13 Ket
- 18   3 CBra 2
- 21   3 Ket
- 23  23 Ket
- 25     End
+  0  21 Bra
+  2   4 Once
+  4  14 Recurse
+  6   4 Ket
+  8   4 Once
+ 10  14 Recurse
+ 12   4 Ket
+ 14   5 CBra 1
+ 17     a
+ 19   5 Ket
+ 21  21 Ket
+ 23     End
 ------------------------------------------------------------------
 
-/-- End of testinput11 --/
+/.((?2)(?R)|\1|$)()/
+------------------------------------------------------------------
+  0  28 Bra
+  2     Any
+  3  18 Once
+  5   7 CBra 1
+  8  23 Recurse
+ 10   0 Recurse
+ 12   4 Alt
+ 14     \1
+ 16   3 Alt
+ 18     $
+ 19  14 Ket
+ 21  18 Ket
+ 23   3 CBra 2
+ 26   3 Ket
+ 28  28 Ket
+ 30     End
+------------------------------------------------------------------
+
+/.((?3)(?R)()(?2)|\1|$)()/
+------------------------------------------------------------------
+  0  35 Bra
+  2     Any
+  3  25 Once
+  5  14 CBra 1
+  8  30 Recurse
+ 10   0 Recurse
+ 12   3 CBra 2
+ 15   3 Ket
+ 17  12 Recurse
+ 19   4 Alt
+ 21     \1
+ 23   3 Alt
+ 25     $
+ 26  21 Ket
+ 28  25 Ket
+ 30   3 CBra 3
+ 33   3 Ket
+ 35  35 Ket
+ 37     End
+------------------------------------------------------------------
+
+/(?1)()((((((\1++))\x85)+)|))/
+------------------------------------------------------------------
+  0  50 Bra
+  2   4 Recurse
+  4   3 CBra 1
+  7   3 Ket
+  9  39 CBra 2
+ 12  32 CBra 3
+ 15  27 CBra 4
+ 18  22 CBra 5
+ 21  15 CBra 6
+ 24  10 CBra 7
+ 27   5 Once
+ 29     \1+
+ 32   5 Ket
+ 34  10 Ket
+ 36  15 Ket
+ 38     \x{85}
+ 40  22 KetRmax
+ 42  27 Ket
+ 44   2 Alt
+ 46  34 Ket
+ 48  39 Ket
+ 50  50 Ket
+ 52     End
+------------------------------------------------------------------
+
+# Check the absolute limit on nesting (?| etc. This varies with code unit
+# width because the workspace is a different number of bytes. It will fail
+# with link size 2 in 8-bit and 16-bit but not in 32-bit.
+
+/(?|(?|(?J:(?|(?x:(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|
+)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
+/parens_nest_limit=1000,-fullbincode
+
+# Use "expand" to create some very long patterns with nested parentheses, in
+# order to test workspace overflow. Again, this varies with code unit width,
+# and even with it fails in two modes, the error offset differs. It also varies
+# with link size - hence multiple tests with different values.
+
+/(?'ABC'\[[bar](]{105}*THEN:\[A]{255}\[)]{106}/expand,-fullbincode
+
+/(?'ABC'\[[bar](]{106}*THEN:\[A]{255}\[)]{107}/expand,-fullbincode
+
+/(?'ABC'\[[bar](]{159}*THEN:\[A]{255}\[)]{160}/expand,-fullbincode
+
+/(?'ABC'\[[bar](]{199}*THEN:\[A]{255}\[)]{200}/expand,-fullbincode
+Failed: error 186 at offset 979: regular expression is too complicated
+
+/(?'ABC'\[[bar](]{299}*THEN:\[A]{255}\[)]{300}/expand,-fullbincode
+Failed: error 186 at offset 979: regular expression is too complicated
+
+/(?(1)(?1)){8,}+()/debug
+------------------------------------------------------------------
+  0  79 Bra
+  2  70 Once
+  4   6 Cond
+  6   1 Cond ref
+  8  74 Recurse
+ 10   6 Ket
+ 12   6 Cond
+ 14   1 Cond ref
+ 16  74 Recurse
+ 18   6 Ket
+ 20   6 Cond
+ 22   1 Cond ref
+ 24  74 Recurse
+ 26   6 Ket
+ 28   6 Cond
+ 30   1 Cond ref
+ 32  74 Recurse
+ 34   6 Ket
+ 36   6 Cond
+ 38   1 Cond ref
+ 40  74 Recurse
+ 42   6 Ket
+ 44   6 Cond
+ 46   1 Cond ref
+ 48  74 Recurse
+ 50   6 Ket
+ 52   6 Cond
+ 54   1 Cond ref
+ 56  74 Recurse
+ 58   6 Ket
+ 60  10 SBraPos
+ 62   6 SCond
+ 64   1 Cond ref
+ 66  74 Recurse
+ 68   6 Ket
+ 70  10 KetRpos
+ 72  70 Ket
+ 74   3 CBra 1
+ 77   3 Ket
+ 79  79 Ket
+ 81     End
+------------------------------------------------------------------
+Capturing subpattern count = 1
+Max back reference = 1
+May match empty string
+Subject length lower bound = 0
+    abcd
+ 0: 
+ 1: 
+
+/(?(1)|a(?1)b){2,}+()/debug
+------------------------------------------------------------------
+  0  43 Bra
+  2  34 Once
+  4   4 Cond
+  6   1 Cond ref
+  8   8 Alt
+ 10     a
+ 12  38 Recurse
+ 14     b
+ 16  12 Ket
+ 18  16 SBraPos
+ 20   4 SCond
+ 22   1 Cond ref
+ 24   8 Alt
+ 26     a
+ 28  38 Recurse
+ 30     b
+ 32  12 Ket
+ 34  16 KetRpos
+ 36  34 Ket
+ 38   3 CBra 1
+ 41   3 Ket
+ 43  43 Ket
+ 45     End
+------------------------------------------------------------------
+Capturing subpattern count = 1
+Max back reference = 1
+May match empty string
+Subject length lower bound = 0
+    abcde
+No match
+
+/((?1)(?2)(?3)(?4)(?5)(?6)(?7)(?8)(?9)(?9)(?8)(?7)(?6)(?5)(?4)(?3)(?2)(?1)(?0)){2,}()()()()()()()()()/debug
+------------------------------------------------------------------
+  0 133 Bra
+  2  41 CBra 1
+  5   2 Recurse
+  7  88 Recurse
+  9  93 Recurse
+ 11  98 Recurse
+ 13 103 Recurse
+ 15 108 Recurse
+ 17 113 Recurse
+ 19 118 Recurse
+ 21 123 Recurse
+ 23 123 Recurse
+ 25 118 Recurse
+ 27 113 Recurse
+ 29 108 Recurse
+ 31 103 Recurse
+ 33  98 Recurse
+ 35  93 Recurse
+ 37  88 Recurse
+ 39   2 Recurse
+ 41   0 Recurse
+ 43  41 Ket
+ 45  41 SCBra 1
+ 48   2 Recurse
+ 50  88 Recurse
+ 52  93 Recurse
+ 54  98 Recurse
+ 56 103 Recurse
+ 58 108 Recurse
+ 60 113 Recurse
+ 62 118 Recurse
+ 64 123 Recurse
+ 66 123 Recurse
+ 68 118 Recurse
+ 70 113 Recurse
+ 72 108 Recurse
+ 74 103 Recurse
+ 76  98 Recurse
+ 78  93 Recurse
+ 80  88 Recurse
+ 82   2 Recurse
+ 84   0 Recurse
+ 86  41 KetRmax
+ 88   3 CBra 2
+ 91   3 Ket
+ 93   3 CBra 3
+ 96   3 Ket
+ 98   3 CBra 4
+101   3 Ket
+103   3 CBra 5
+106   3 Ket
+108   3 CBra 6
+111   3 Ket
+113   3 CBra 7
+116   3 Ket
+118   3 CBra 8
+121   3 Ket
+123   3 CBra 9
+126   3 Ket
+128   3 CBra 10
+131   3 Ket
+133 133 Ket
+135     End
+------------------------------------------------------------------
+Capturing subpattern count = 10
+May match empty string
+Subject length lower bound = 0
+
+# End of testinput8
diff --git a/dist/testdata/testoutput11-32 b/dist2/testdata/testoutput8-32-4
similarity index 64%
copy from dist/testdata/testoutput11-32
copy to dist2/testdata/testoutput8-32-4
index 57e5da0..babd0c7 100644
--- a/dist/testdata/testoutput11-32
+++ b/dist2/testdata/testoutput8-32-4
@@ -1,10 +1,15 @@
-/-- These are a few representative patterns whose lengths and offsets are to be 
-shown when the link size is 2. This is just a doublecheck test to ensure the 
-sizes don't go horribly wrong when something is changed. The pattern contents 
-are all themselves checked in other tests. Unicode, including property support, 
-is required for these tests. --/
+# There are two sorts of patterns in this test. A number of them are
+# representative patterns whose lengths and offsets are checked. This is just a
+# doublecheck test to ensure the sizes don't go horribly wrong when something
+# is changed. The operation of these patterns is checked in other tests.
+#
+# This file also contains tests whose output varies with code unit size and/or
+# link size. Unicode support is required for these tests. There are separate
+# output files for each code unit size and link size.
 
-/((?i)b)/BM
+#pattern fullbincode,memory
+
+/((?i)b)/
 Memory allocation (code space): 48
 ------------------------------------------------------------------
   0   9 Bra
@@ -15,7 +20,7 @@
  11     End
 ------------------------------------------------------------------
 
-/(?s)(.*X|^B)/BM
+/(?s)(.*X|^B)/
 Memory allocation (code space): 76
 ------------------------------------------------------------------
   0  16 Bra
@@ -30,7 +35,7 @@
  18     End
 ------------------------------------------------------------------
 
-/(?s:.*X|^B)/BM
+/(?s:.*X|^B)/
 Memory allocation (code space): 72
 ------------------------------------------------------------------
   0  15 Bra
@@ -45,7 +50,7 @@
  17     End
 ------------------------------------------------------------------
 
-/^[[:alnum:]]/BM
+/^[[:alnum:]]/
 Memory allocation (code space): 60
 ------------------------------------------------------------------
   0  12 Bra
@@ -55,7 +60,7 @@
  14     End
 ------------------------------------------------------------------
 
-/#/IxMD
+/#/Ix
 Memory allocation (code space): 20
 ------------------------------------------------------------------
   0   2 Bra
@@ -65,10 +70,9 @@
 Capturing subpattern count = 0
 May match empty string
 Options: extended
-No first char
-No need char
+Subject length lower bound = 0
 
-/a#/IxMD
+/a#/Ix
 Memory allocation (code space): 28
 ------------------------------------------------------------------
   0   4 Bra
@@ -78,10 +82,10 @@
 ------------------------------------------------------------------
 Capturing subpattern count = 0
 Options: extended
-First char = 'a'
-No need char
+First code unit = 'a'
+Subject length lower bound = 1
 
-/x?+/BM
+/x?+/
 Memory allocation (code space): 28
 ------------------------------------------------------------------
   0   4 Bra
@@ -90,7 +94,7 @@
   6     End
 ------------------------------------------------------------------
 
-/x++/BM
+/x++/
 Memory allocation (code space): 28
 ------------------------------------------------------------------
   0   4 Bra
@@ -99,7 +103,7 @@
   6     End
 ------------------------------------------------------------------
 
-/x{1,3}+/BM 
+/x{1,3}+/
 Memory allocation (code space): 40
 ------------------------------------------------------------------
   0   7 Bra
@@ -109,7 +113,7 @@
   9     End
 ------------------------------------------------------------------
 
-/(x)*+/BM
+/(x)*+/
 Memory allocation (code space): 52
 ------------------------------------------------------------------
   0  10 Bra
@@ -121,7 +125,7 @@
  12     End
 ------------------------------------------------------------------
 
-/^((a+)(?U)([ab]+)(?-U)([bc]+)(\w*))/BM
+/^((a+)(?U)([ab]+)(?-U)([bc]+)(\w*))/
 Memory allocation (code space): 220
 ------------------------------------------------------------------
   0  52 Bra
@@ -144,7 +148,7 @@
  54     End
 ------------------------------------------------------------------
 
-|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|BM
+"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"
 Memory allocation (code space): 3296
 ------------------------------------------------------------------
   0 821 Bra
@@ -154,7 +158,7 @@
 823     End
 ------------------------------------------------------------------
 
-|\$\<\.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|BM
+"\$\<\.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"
 Memory allocation (code space): 3256
 ------------------------------------------------------------------
   0 811 Bra
@@ -164,7 +168,7 @@
 813     End
 ------------------------------------------------------------------
 
-/(a(?1)b)/BM
+/(a(?1)b)/
 Memory allocation (code space): 64
 ------------------------------------------------------------------
   0  13 Bra
@@ -177,7 +181,7 @@
  15     End
 ------------------------------------------------------------------
 
-/(a(?1)+b)/BM
+/(a(?1)+b)/
 Memory allocation (code space): 80
 ------------------------------------------------------------------
   0  17 Bra
@@ -192,8 +196,8 @@
  19     End
 ------------------------------------------------------------------
 
-/a(?P<name1>b|c)d(?P<longername2>e)/BM
-Memory allocation (code space): 186
+/a(?P<name1>b|c)d(?P<longername2>e)/
+Memory allocation (code space): 108
 ------------------------------------------------------------------
   0  24 Bra
   2     a
@@ -210,8 +214,8 @@
  26     End
 ------------------------------------------------------------------
 
-/(?:a(?P<c>c(?P<d>d)))(?P<a>a)/BM
-Memory allocation (code space): 155
+/(?:a(?P<c>c(?P<d>d)))(?P<a>a)/
+Memory allocation (code space): 128
 ------------------------------------------------------------------
   0  29 Bra
   2  18 Bra
@@ -230,8 +234,8 @@
  31     End
 ------------------------------------------------------------------
 
-/(?P<a>a)...(?P=a)bbb(?P>a)d/BM
-Memory allocation (code space): 157
+/(?P<a>a)...(?P=a)bbb(?P>a)d/
+Memory allocation (code space): 108
 ------------------------------------------------------------------
   0  24 Bra
   2   5 CBra 1
@@ -248,7 +252,7 @@
  26     End
 ------------------------------------------------------------------
 
-/abc(?C255)de(?C)f/BM
+/abc(?C255)de(?C)f/
 Memory allocation (code space): 100
 ------------------------------------------------------------------
   0  22 Bra
@@ -261,7 +265,7 @@
  24     End
 ------------------------------------------------------------------
 
-/abcde/CBM
+/abcde/auto_callout
 Memory allocation (code space): 156
 ------------------------------------------------------------------
   0  36 Bra
@@ -280,7 +284,7 @@
  38     End
 ------------------------------------------------------------------
 
-/\x{100}/8BM
+/\x{100}/utf
 Memory allocation (code space): 28
 ------------------------------------------------------------------
   0   4 Bra
@@ -289,7 +293,7 @@
   6     End
 ------------------------------------------------------------------
 
-/\x{1000}/8BM
+/\x{1000}/utf
 Memory allocation (code space): 28
 ------------------------------------------------------------------
   0   4 Bra
@@ -298,7 +302,7 @@
   6     End
 ------------------------------------------------------------------
 
-/\x{10000}/8BM
+/\x{10000}/utf
 Memory allocation (code space): 28
 ------------------------------------------------------------------
   0   4 Bra
@@ -307,7 +311,7 @@
   6     End
 ------------------------------------------------------------------
 
-/\x{100000}/8BM
+/\x{100000}/utf
 Memory allocation (code space): 28
 ------------------------------------------------------------------
   0   4 Bra
@@ -316,7 +320,7 @@
   6     End
 ------------------------------------------------------------------
 
-/\x{10ffff}/8BM
+/\x{10ffff}/utf
 Memory allocation (code space): 28
 ------------------------------------------------------------------
   0   4 Bra
@@ -325,10 +329,10 @@
   6     End
 ------------------------------------------------------------------
 
-/\x{110000}/8BM
-Failed: character value in \x{} or \o{} is too large at offset 9
+/\x{110000}/utf
+Failed: error 134 at offset 9: character code point value in \x{} or \o{} is too large
 
-/[\x{ff}]/8BM
+/[\x{ff}]/utf
 Memory allocation (code space): 28
 ------------------------------------------------------------------
   0   4 Bra
@@ -337,7 +341,7 @@
   6     End
 ------------------------------------------------------------------
 
-/[\x{100}]/8BM
+/[\x{100}]/utf
 Memory allocation (code space): 28
 ------------------------------------------------------------------
   0   4 Bra
@@ -346,16 +350,16 @@
   6     End
 ------------------------------------------------------------------
 
-/\x80/8BM
+/\x80/utf
 Memory allocation (code space): 28
 ------------------------------------------------------------------
   0   4 Bra
-  2     \x80
+  2     \x{80}
   4   4 Ket
   6     End
 ------------------------------------------------------------------
 
-/\xff/8BM
+/\xff/utf
 Memory allocation (code space): 28
 ------------------------------------------------------------------
   0   4 Bra
@@ -364,7 +368,7 @@
   6     End
 ------------------------------------------------------------------
 
-/\x{0041}\x{2262}\x{0391}\x{002e}/D8M
+/\x{0041}\x{2262}\x{0391}\x{002e}/I,utf
 Memory allocation (code space): 52
 ------------------------------------------------------------------
   0  10 Bra
@@ -374,10 +378,11 @@
 ------------------------------------------------------------------
 Capturing subpattern count = 0
 Options: utf
-First char = 'A'
-Need char = '.'
-    
-/\x{D55c}\x{ad6d}\x{C5B4}/D8M 
+First code unit = 'A'
+Last code unit = '.'
+Subject length lower bound = 4
+
+/\x{D55c}\x{ad6d}\x{C5B4}/I,utf
 Memory allocation (code space): 44
 ------------------------------------------------------------------
   0   8 Bra
@@ -387,10 +392,11 @@
 ------------------------------------------------------------------
 Capturing subpattern count = 0
 Options: utf
-First char = \x{d55c}
-Need char = \x{c5b4}
+First code unit = \x{d55c}
+Last code unit = \x{c5b4}
+Subject length lower bound = 3
 
-/\x{65e5}\x{672c}\x{8a9e}/D8M
+/\x{65e5}\x{672c}\x{8a9e}/I,utf
 Memory allocation (code space): 44
 ------------------------------------------------------------------
   0   8 Bra
@@ -400,10 +406,11 @@
 ------------------------------------------------------------------
 Capturing subpattern count = 0
 Options: utf
-First char = \x{65e5}
-Need char = \x{8a9e}
+First code unit = \x{65e5}
+Last code unit = \x{8a9e}
+Subject length lower bound = 3
 
-/[\x{100}]/8BM
+/[\x{100}]/utf
 Memory allocation (code space): 28
 ------------------------------------------------------------------
   0   4 Bra
@@ -412,7 +419,7 @@
   6     End
 ------------------------------------------------------------------
 
-/[Z\x{100}]/8BM
+/[Z\x{100}]/utf
 Memory allocation (code space): 76
 ------------------------------------------------------------------
   0  16 Bra
@@ -421,7 +428,7 @@
  18     End
 ------------------------------------------------------------------
 
-/^[\x{100}\E-\Q\E\x{150}]/B8M
+/^[\x{100}\E-\Q\E\x{150}]/utf
 Memory allocation (code space): 52
 ------------------------------------------------------------------
   0  10 Bra
@@ -431,7 +438,7 @@
  12     End
 ------------------------------------------------------------------
 
-/^[\QĀ\E-\QŐ\E]/B8M
+/^[\QĀ\E-\QŐ\E]/utf
 Memory allocation (code space): 52
 ------------------------------------------------------------------
   0  10 Bra
@@ -441,10 +448,10 @@
  12     End
 ------------------------------------------------------------------
 
-/^[\QĀ\E-\QŐ\E/B8M
-Failed: missing terminating ] for character class at offset 13
+/^[\QĀ\E-\QŐ\E/utf
+Failed: error 106 at offset 13: missing terminating ] for character class
 
-/[\p{L}]/BM
+/[\p{L}]/
 Memory allocation (code space): 48
 ------------------------------------------------------------------
   0   9 Bra
@@ -453,7 +460,7 @@
  11     End
 ------------------------------------------------------------------
 
-/[\p{^L}]/BM
+/[\p{^L}]/
 Memory allocation (code space): 48
 ------------------------------------------------------------------
   0   9 Bra
@@ -462,7 +469,7 @@
  11     End
 ------------------------------------------------------------------
 
-/[\P{L}]/BM
+/[\P{L}]/
 Memory allocation (code space): 48
 ------------------------------------------------------------------
   0   9 Bra
@@ -471,7 +478,7 @@
  11     End
 ------------------------------------------------------------------
 
-/[\P{^L}]/BM
+/[\P{^L}]/
 Memory allocation (code space): 48
 ------------------------------------------------------------------
   0   9 Bra
@@ -480,7 +487,7 @@
  11     End
 ------------------------------------------------------------------
 
-/[abc\p{L}\x{0660}]/8BM
+/[abc\p{L}\x{0660}]/utf
 Memory allocation (code space): 88
 ------------------------------------------------------------------
   0  19 Bra
@@ -489,7 +496,7 @@
  21     End
 ------------------------------------------------------------------
 
-/[\p{Nd}]/8BM
+/[\p{Nd}]/utf
 Memory allocation (code space): 48
 ------------------------------------------------------------------
   0   9 Bra
@@ -498,7 +505,7 @@
  11     End
 ------------------------------------------------------------------
 
-/[\p{Nd}+-]+/8BM
+/[\p{Nd}+-]+/utf
 Memory allocation (code space): 84
 ------------------------------------------------------------------
   0  18 Bra
@@ -507,7 +514,7 @@
  20     End
 ------------------------------------------------------------------
 
-/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/8iBM
+/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/i,utf
 Memory allocation (code space): 60
 ------------------------------------------------------------------
   0  12 Bra
@@ -516,7 +523,7 @@
  14     End
 ------------------------------------------------------------------
 
-/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/8BM
+/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/utf
 Memory allocation (code space): 60
 ------------------------------------------------------------------
   0  12 Bra
@@ -525,7 +532,7 @@
  14     End
 ------------------------------------------------------------------
 
-/[\x{105}-\x{109}]/8iBM
+/[\x{105}-\x{109}]/i,utf
 Memory allocation (code space): 48
 ------------------------------------------------------------------
   0   9 Bra
@@ -534,7 +541,7 @@
  11     End
 ------------------------------------------------------------------
 
-/( ( (?(1)0|) )*   )/xBM
+/( ( (?(1)0|) )*   )/x
 Memory allocation (code space): 104
 ------------------------------------------------------------------
   0  23 Bra
@@ -552,7 +559,7 @@
  25     End
 ------------------------------------------------------------------
 
-/(  (?(1)0|)*   )/xBM
+/(  (?(1)0|)*   )/x
 Memory allocation (code space): 84
 ------------------------------------------------------------------
   0  18 Bra
@@ -568,7 +575,7 @@
  20     End
 ------------------------------------------------------------------
 
-/[a]/BM
+/[a]/
 Memory allocation (code space): 28
 ------------------------------------------------------------------
   0   4 Bra
@@ -577,7 +584,7 @@
   6     End
 ------------------------------------------------------------------
 
-/[a]/8BM
+/[a]/utf
 Memory allocation (code space): 28
 ------------------------------------------------------------------
   0   4 Bra
@@ -586,7 +593,7 @@
   6     End
 ------------------------------------------------------------------
 
-/[\xaa]/BM
+/[\xaa]/
 Memory allocation (code space): 28
 ------------------------------------------------------------------
   0   4 Bra
@@ -595,7 +602,7 @@
   6     End
 ------------------------------------------------------------------
 
-/[\xaa]/8BM
+/[\xaa]/utf
 Memory allocation (code space): 28
 ------------------------------------------------------------------
   0   4 Bra
@@ -604,7 +611,7 @@
   6     End
 ------------------------------------------------------------------
 
-/[^a]/BM
+/[^a]/
 Memory allocation (code space): 28
 ------------------------------------------------------------------
   0   4 Bra
@@ -613,7 +620,7 @@
   6     End
 ------------------------------------------------------------------
 
-/[^a]/8BM
+/[^a]/utf
 Memory allocation (code space): 28
 ------------------------------------------------------------------
   0   4 Bra
@@ -622,7 +629,7 @@
   6     End
 ------------------------------------------------------------------
 
-/[^\xaa]/BM
+/[^\xaa]/
 Memory allocation (code space): 28
 ------------------------------------------------------------------
   0   4 Bra
@@ -631,7 +638,7 @@
   6     End
 ------------------------------------------------------------------
 
-/[^\xaa]/8BM
+/[^\xaa]/utf
 Memory allocation (code space): 28
 ------------------------------------------------------------------
   0   4 Bra
@@ -640,7 +647,9 @@
   6     End
 ------------------------------------------------------------------
 
-/[^\d]/8WB
+#pattern -memory
+
+/[^\d]/utf,ucp
 ------------------------------------------------------------------
   0   9 Bra
   2     [^\p{Nd}]
@@ -648,23 +657,23 @@
  11     End
 ------------------------------------------------------------------
 
-/[[:^alpha:][:^cntrl:]]+/8WB
+/[[:^alpha:][:^cntrl:]]+/utf,ucp
 ------------------------------------------------------------------
-  0  21 Bra
-  2     [ -~\x80-\xff\P{L}\x{100}-\x{10ffff}]++
- 21  21 Ket
- 23     End
+  0  13 Bra
+  2     [\P{L}\P{Cc}]++
+ 13  13 Ket
+ 15     End
 ------------------------------------------------------------------
 
-/[[:^cntrl:][:^alpha:]]+/8WB
+/[[:^cntrl:][:^alpha:]]+/utf,ucp
 ------------------------------------------------------------------
-  0  21 Bra
-  2     [ -~\x80-\xff\x{100}-\x{10ffff}\P{L}]++
- 21  21 Ket
- 23     End
+  0  13 Bra
+  2     [\P{Cc}\P{L}]++
+ 13  13 Ket
+ 15     End
 ------------------------------------------------------------------
 
-/[[:alpha:]]+/8WB
+/[[:alpha:]]+/utf,ucp
 ------------------------------------------------------------------
   0  10 Bra
   2     [\p{L}]++
@@ -672,7 +681,7 @@
  12     End
 ------------------------------------------------------------------
 
-/[[:^alpha:]\S]+/8WB
+/[[:^alpha:]\S]+/utf,ucp
 ------------------------------------------------------------------
   0  13 Bra
   2     [\P{L}\P{Xsp}]++
@@ -680,7 +689,7 @@
  15     End
 ------------------------------------------------------------------
 
-/abc(d|e)(*THEN)x(123(*THEN)4|567(b|q)(*THEN)xx)/B
+/abc(d|e)(*THEN)x(123(*THEN)4|567(b|q)(*THEN)xx)/
 ------------------------------------------------------------------
   0  60 Bra
   2     abc
@@ -709,7 +718,7 @@
  62     End
 ------------------------------------------------------------------
 
-/(((a\2)|(a*)\g<-1>))*a?/B
+/(((a\2)|(a*)\g<-1>))*a?/
 ------------------------------------------------------------------
   0  39 Bra
   2     Brazero
@@ -733,7 +742,7 @@
  41     End
 ------------------------------------------------------------------
 
-/((?+1)(\1))/B
+/((?+1)(\1))/
 ------------------------------------------------------------------
   0  20 Bra
   2  16 Once
@@ -748,21 +757,270 @@
  22     End
 ------------------------------------------------------------------
 
-/.((?2)(?R)\1)()/B
+"(?1)(?#?'){2}(a)"
 ------------------------------------------------------------------
-  0  23 Bra
-  2     Any
-  3  13 Once
-  5   9 CBra 1
-  8  18 Recurse
- 10   0 Recurse
- 12     \1
- 14   9 Ket
- 16  13 Ket
- 18   3 CBra 2
- 21   3 Ket
- 23  23 Ket
- 25     End
+  0  21 Bra
+  2   4 Once
+  4  14 Recurse
+  6   4 Ket
+  8   4 Once
+ 10  14 Recurse
+ 12   4 Ket
+ 14   5 CBra 1
+ 17     a
+ 19   5 Ket
+ 21  21 Ket
+ 23     End
 ------------------------------------------------------------------
 
-/-- End of testinput11 --/
+/.((?2)(?R)|\1|$)()/
+------------------------------------------------------------------
+  0  28 Bra
+  2     Any
+  3  18 Once
+  5   7 CBra 1
+  8  23 Recurse
+ 10   0 Recurse
+ 12   4 Alt
+ 14     \1
+ 16   3 Alt
+ 18     $
+ 19  14 Ket
+ 21  18 Ket
+ 23   3 CBra 2
+ 26   3 Ket
+ 28  28 Ket
+ 30     End
+------------------------------------------------------------------
+
+/.((?3)(?R)()(?2)|\1|$)()/
+------------------------------------------------------------------
+  0  35 Bra
+  2     Any
+  3  25 Once
+  5  14 CBra 1
+  8  30 Recurse
+ 10   0 Recurse
+ 12   3 CBra 2
+ 15   3 Ket
+ 17  12 Recurse
+ 19   4 Alt
+ 21     \1
+ 23   3 Alt
+ 25     $
+ 26  21 Ket
+ 28  25 Ket
+ 30   3 CBra 3
+ 33   3 Ket
+ 35  35 Ket
+ 37     End
+------------------------------------------------------------------
+
+/(?1)()((((((\1++))\x85)+)|))/
+------------------------------------------------------------------
+  0  50 Bra
+  2   4 Recurse
+  4   3 CBra 1
+  7   3 Ket
+  9  39 CBra 2
+ 12  32 CBra 3
+ 15  27 CBra 4
+ 18  22 CBra 5
+ 21  15 CBra 6
+ 24  10 CBra 7
+ 27   5 Once
+ 29     \1+
+ 32   5 Ket
+ 34  10 Ket
+ 36  15 Ket
+ 38     \x{85}
+ 40  22 KetRmax
+ 42  27 Ket
+ 44   2 Alt
+ 46  34 Ket
+ 48  39 Ket
+ 50  50 Ket
+ 52     End
+------------------------------------------------------------------
+
+# Check the absolute limit on nesting (?| etc. This varies with code unit
+# width because the workspace is a different number of bytes. It will fail
+# with link size 2 in 8-bit and 16-bit but not in 32-bit.
+
+/(?|(?|(?J:(?|(?x:(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|
+)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
+/parens_nest_limit=1000,-fullbincode
+
+# Use "expand" to create some very long patterns with nested parentheses, in
+# order to test workspace overflow. Again, this varies with code unit width,
+# and even with it fails in two modes, the error offset differs. It also varies
+# with link size - hence multiple tests with different values.
+
+/(?'ABC'\[[bar](]{105}*THEN:\[A]{255}\[)]{106}/expand,-fullbincode
+
+/(?'ABC'\[[bar](]{106}*THEN:\[A]{255}\[)]{107}/expand,-fullbincode
+
+/(?'ABC'\[[bar](]{159}*THEN:\[A]{255}\[)]{160}/expand,-fullbincode
+
+/(?'ABC'\[[bar](]{199}*THEN:\[A]{255}\[)]{200}/expand,-fullbincode
+Failed: error 186 at offset 979: regular expression is too complicated
+
+/(?'ABC'\[[bar](]{299}*THEN:\[A]{255}\[)]{300}/expand,-fullbincode
+Failed: error 186 at offset 979: regular expression is too complicated
+
+/(?(1)(?1)){8,}+()/debug
+------------------------------------------------------------------
+  0  79 Bra
+  2  70 Once
+  4   6 Cond
+  6   1 Cond ref
+  8  74 Recurse
+ 10   6 Ket
+ 12   6 Cond
+ 14   1 Cond ref
+ 16  74 Recurse
+ 18   6 Ket
+ 20   6 Cond
+ 22   1 Cond ref
+ 24  74 Recurse
+ 26   6 Ket
+ 28   6 Cond
+ 30   1 Cond ref
+ 32  74 Recurse
+ 34   6 Ket
+ 36   6 Cond
+ 38   1 Cond ref
+ 40  74 Recurse
+ 42   6 Ket
+ 44   6 Cond
+ 46   1 Cond ref
+ 48  74 Recurse
+ 50   6 Ket
+ 52   6 Cond
+ 54   1 Cond ref
+ 56  74 Recurse
+ 58   6 Ket
+ 60  10 SBraPos
+ 62   6 SCond
+ 64   1 Cond ref
+ 66  74 Recurse
+ 68   6 Ket
+ 70  10 KetRpos
+ 72  70 Ket
+ 74   3 CBra 1
+ 77   3 Ket
+ 79  79 Ket
+ 81     End
+------------------------------------------------------------------
+Capturing subpattern count = 1
+Max back reference = 1
+May match empty string
+Subject length lower bound = 0
+    abcd
+ 0: 
+ 1: 
+
+/(?(1)|a(?1)b){2,}+()/debug
+------------------------------------------------------------------
+  0  43 Bra
+  2  34 Once
+  4   4 Cond
+  6   1 Cond ref
+  8   8 Alt
+ 10     a
+ 12  38 Recurse
+ 14     b
+ 16  12 Ket
+ 18  16 SBraPos
+ 20   4 SCond
+ 22   1 Cond ref
+ 24   8 Alt
+ 26     a
+ 28  38 Recurse
+ 30     b
+ 32  12 Ket
+ 34  16 KetRpos
+ 36  34 Ket
+ 38   3 CBra 1
+ 41   3 Ket
+ 43  43 Ket
+ 45     End
+------------------------------------------------------------------
+Capturing subpattern count = 1
+Max back reference = 1
+May match empty string
+Subject length lower bound = 0
+    abcde
+No match
+
+/((?1)(?2)(?3)(?4)(?5)(?6)(?7)(?8)(?9)(?9)(?8)(?7)(?6)(?5)(?4)(?3)(?2)(?1)(?0)){2,}()()()()()()()()()/debug
+------------------------------------------------------------------
+  0 133 Bra
+  2  41 CBra 1
+  5   2 Recurse
+  7  88 Recurse
+  9  93 Recurse
+ 11  98 Recurse
+ 13 103 Recurse
+ 15 108 Recurse
+ 17 113 Recurse
+ 19 118 Recurse
+ 21 123 Recurse
+ 23 123 Recurse
+ 25 118 Recurse
+ 27 113 Recurse
+ 29 108 Recurse
+ 31 103 Recurse
+ 33  98 Recurse
+ 35  93 Recurse
+ 37  88 Recurse
+ 39   2 Recurse
+ 41   0 Recurse
+ 43  41 Ket
+ 45  41 SCBra 1
+ 48   2 Recurse
+ 50  88 Recurse
+ 52  93 Recurse
+ 54  98 Recurse
+ 56 103 Recurse
+ 58 108 Recurse
+ 60 113 Recurse
+ 62 118 Recurse
+ 64 123 Recurse
+ 66 123 Recurse
+ 68 118 Recurse
+ 70 113 Recurse
+ 72 108 Recurse
+ 74 103 Recurse
+ 76  98 Recurse
+ 78  93 Recurse
+ 80  88 Recurse
+ 82   2 Recurse
+ 84   0 Recurse
+ 86  41 KetRmax
+ 88   3 CBra 2
+ 91   3 Ket
+ 93   3 CBra 3
+ 96   3 Ket
+ 98   3 CBra 4
+101   3 Ket
+103   3 CBra 5
+106   3 Ket
+108   3 CBra 6
+111   3 Ket
+113   3 CBra 7
+116   3 Ket
+118   3 CBra 8
+121   3 Ket
+123   3 CBra 9
+126   3 Ket
+128   3 CBra 10
+131   3 Ket
+133 133 Ket
+135     End
+------------------------------------------------------------------
+Capturing subpattern count = 10
+May match empty string
+Subject length lower bound = 0
+
+# End of testinput8
diff --git a/dist/testdata/testoutput11-8 b/dist2/testdata/testoutput8-8-2
similarity index 63%
rename from dist/testdata/testoutput11-8
rename to dist2/testdata/testoutput8-8-2
index 748548a..6a9aa0a 100644
--- a/dist/testdata/testoutput11-8
+++ b/dist2/testdata/testoutput8-8-2
@@ -1,10 +1,15 @@
-/-- These are a few representative patterns whose lengths and offsets are to be 
-shown when the link size is 2. This is just a doublecheck test to ensure the 
-sizes don't go horribly wrong when something is changed. The pattern contents 
-are all themselves checked in other tests. Unicode, including property support, 
-is required for these tests. --/
+# There are two sorts of patterns in this test. A number of them are
+# representative patterns whose lengths and offsets are checked. This is just a
+# doublecheck test to ensure the sizes don't go horribly wrong when something
+# is changed. The operation of these patterns is checked in other tests.
+#
+# This file also contains tests whose output varies with code unit size and/or
+# link size. Unicode support is required for these tests. There are separate
+# output files for each code unit size and link size.
 
-/((?i)b)/BM
+#pattern fullbincode,memory
+
+/((?i)b)/
 Memory allocation (code space): 17
 ------------------------------------------------------------------
   0  13 Bra
@@ -15,7 +20,7 @@
  16     End
 ------------------------------------------------------------------
 
-/(?s)(.*X|^B)/BM
+/(?s)(.*X|^B)/
 Memory allocation (code space): 25
 ------------------------------------------------------------------
   0  21 Bra
@@ -30,7 +35,7 @@
  24     End
 ------------------------------------------------------------------
 
-/(?s:.*X|^B)/BM
+/(?s:.*X|^B)/
 Memory allocation (code space): 23
 ------------------------------------------------------------------
   0  19 Bra
@@ -45,7 +50,7 @@
  22     End
 ------------------------------------------------------------------
 
-/^[[:alnum:]]/BM
+/^[[:alnum:]]/
 Memory allocation (code space): 41
 ------------------------------------------------------------------
   0  37 Bra
@@ -55,7 +60,7 @@
  40     End
 ------------------------------------------------------------------
 
-/#/IxMD
+/#/Ix
 Memory allocation (code space): 7
 ------------------------------------------------------------------
   0   3 Bra
@@ -65,10 +70,9 @@
 Capturing subpattern count = 0
 May match empty string
 Options: extended
-No first char
-No need char
+Subject length lower bound = 0
 
-/a#/IxMD
+/a#/Ix
 Memory allocation (code space): 9
 ------------------------------------------------------------------
   0   5 Bra
@@ -78,10 +82,10 @@
 ------------------------------------------------------------------
 Capturing subpattern count = 0
 Options: extended
-First char = 'a'
-No need char
+First code unit = 'a'
+Subject length lower bound = 1
 
-/x?+/BM
+/x?+/
 Memory allocation (code space): 9
 ------------------------------------------------------------------
   0   5 Bra
@@ -90,7 +94,7 @@
   8     End
 ------------------------------------------------------------------
 
-/x++/BM
+/x++/
 Memory allocation (code space): 9
 ------------------------------------------------------------------
   0   5 Bra
@@ -99,7 +103,7 @@
   8     End
 ------------------------------------------------------------------
 
-/x{1,3}+/BM 
+/x{1,3}+/
 Memory allocation (code space): 13
 ------------------------------------------------------------------
   0   9 Bra
@@ -109,7 +113,7 @@
  12     End
 ------------------------------------------------------------------
 
-/(x)*+/BM
+/(x)*+/
 Memory allocation (code space): 18
 ------------------------------------------------------------------
   0  14 Bra
@@ -121,7 +125,7 @@
  17     End
 ------------------------------------------------------------------
 
-/^((a+)(?U)([ab]+)(?-U)([bc]+)(\w*))/BM
+/^((a+)(?U)([ab]+)(?-U)([bc]+)(\w*))/
 Memory allocation (code space): 120
 ------------------------------------------------------------------
   0 116 Bra
@@ -144,7 +148,7 @@
 119     End
 ------------------------------------------------------------------
 
-|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|BM
+"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"
 Memory allocation (code space): 826
 ------------------------------------------------------------------
   0 822 Bra
@@ -154,7 +158,7 @@
 825     End
 ------------------------------------------------------------------
 
-|\$\<\.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|BM
+"\$\<\.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"
 Memory allocation (code space): 816
 ------------------------------------------------------------------
   0 812 Bra
@@ -164,7 +168,7 @@
 815     End
 ------------------------------------------------------------------
 
-/(a(?1)b)/BM
+/(a(?1)b)/
 Memory allocation (code space): 22
 ------------------------------------------------------------------
   0  18 Bra
@@ -177,7 +181,7 @@
  21     End
 ------------------------------------------------------------------
 
-/(a(?1)+b)/BM
+/(a(?1)+b)/
 Memory allocation (code space): 28
 ------------------------------------------------------------------
   0  24 Bra
@@ -192,7 +196,7 @@
  27     End
 ------------------------------------------------------------------
 
-/a(?P<name1>b|c)d(?P<longername2>e)/BM
+/a(?P<name1>b|c)d(?P<longername2>e)/
 Memory allocation (code space): 36
 ------------------------------------------------------------------
   0  32 Bra
@@ -210,7 +214,7 @@
  35     End
 ------------------------------------------------------------------
 
-/(?:a(?P<c>c(?P<d>d)))(?P<a>a)/BM
+/(?:a(?P<c>c(?P<d>d)))(?P<a>a)/
 Memory allocation (code space): 45
 ------------------------------------------------------------------
   0  41 Bra
@@ -230,8 +234,8 @@
  44     End
 ------------------------------------------------------------------
 
-/(?P<a>a)...(?P=a)bbb(?P>a)d/BM
-Memory allocation (code space): 50
+/(?P<a>a)...(?P=a)bbb(?P>a)d/
+Memory allocation (code space): 34
 ------------------------------------------------------------------
   0  30 Bra
   3   7 CBra 1
@@ -248,7 +252,7 @@
  33     End
 ------------------------------------------------------------------
 
-/abc(?C255)de(?C)f/BM
+/abc(?C255)de(?C)f/
 Memory allocation (code space): 31
 ------------------------------------------------------------------
   0  27 Bra
@@ -261,7 +265,7 @@
  30     End
 ------------------------------------------------------------------
 
-/abcde/CBM
+/abcde/auto_callout
 Memory allocation (code space): 53
 ------------------------------------------------------------------
   0  49 Bra
@@ -280,7 +284,7 @@
  52     End
 ------------------------------------------------------------------
 
-/\x{100}/8BM
+/\x{100}/utf
 Memory allocation (code space): 10
 ------------------------------------------------------------------
   0   6 Bra
@@ -289,7 +293,7 @@
   9     End
 ------------------------------------------------------------------
 
-/\x{1000}/8BM
+/\x{1000}/utf
 Memory allocation (code space): 11
 ------------------------------------------------------------------
   0   7 Bra
@@ -298,7 +302,7 @@
  10     End
 ------------------------------------------------------------------
 
-/\x{10000}/8BM
+/\x{10000}/utf
 Memory allocation (code space): 12
 ------------------------------------------------------------------
   0   8 Bra
@@ -307,7 +311,7 @@
  11     End
 ------------------------------------------------------------------
 
-/\x{100000}/8BM
+/\x{100000}/utf
 Memory allocation (code space): 12
 ------------------------------------------------------------------
   0   8 Bra
@@ -316,7 +320,7 @@
  11     End
 ------------------------------------------------------------------
 
-/\x{10ffff}/8BM
+/\x{10ffff}/utf
 Memory allocation (code space): 12
 ------------------------------------------------------------------
   0   8 Bra
@@ -325,10 +329,10 @@
  11     End
 ------------------------------------------------------------------
 
-/\x{110000}/8BM
-Failed: character value in \x{} or \o{} is too large at offset 9
+/\x{110000}/utf
+Failed: error 134 at offset 9: character code point value in \x{} or \o{} is too large
 
-/[\x{ff}]/8BM
+/[\x{ff}]/utf
 Memory allocation (code space): 10
 ------------------------------------------------------------------
   0   6 Bra
@@ -337,7 +341,7 @@
   9     End
 ------------------------------------------------------------------
 
-/[\x{100}]/8BM
+/[\x{100}]/utf
 Memory allocation (code space): 10
 ------------------------------------------------------------------
   0   6 Bra
@@ -346,7 +350,7 @@
   9     End
 ------------------------------------------------------------------
 
-/\x80/8BM
+/\x80/utf
 Memory allocation (code space): 10
 ------------------------------------------------------------------
   0   6 Bra
@@ -355,7 +359,7 @@
   9     End
 ------------------------------------------------------------------
 
-/\xff/8BM
+/\xff/utf
 Memory allocation (code space): 10
 ------------------------------------------------------------------
   0   6 Bra
@@ -364,7 +368,7 @@
   9     End
 ------------------------------------------------------------------
 
-/\x{0041}\x{2262}\x{0391}\x{002e}/D8M
+/\x{0041}\x{2262}\x{0391}\x{002e}/I,utf
 Memory allocation (code space): 18
 ------------------------------------------------------------------
   0  14 Bra
@@ -374,10 +378,11 @@
 ------------------------------------------------------------------
 Capturing subpattern count = 0
 Options: utf
-First char = 'A'
-Need char = '.'
-    
-/\x{D55c}\x{ad6d}\x{C5B4}/D8M 
+First code unit = 'A'
+Last code unit = '.'
+Subject length lower bound = 4
+
+/\x{D55c}\x{ad6d}\x{C5B4}/I,utf
 Memory allocation (code space): 19
 ------------------------------------------------------------------
   0  15 Bra
@@ -387,10 +392,11 @@
 ------------------------------------------------------------------
 Capturing subpattern count = 0
 Options: utf
-First char = \x{ed}
-Need char = \x{b4}
+First code unit = \xed
+Last code unit = \xb4
+Subject length lower bound = 3
 
-/\x{65e5}\x{672c}\x{8a9e}/D8M
+/\x{65e5}\x{672c}\x{8a9e}/I,utf
 Memory allocation (code space): 19
 ------------------------------------------------------------------
   0  15 Bra
@@ -400,10 +406,11 @@
 ------------------------------------------------------------------
 Capturing subpattern count = 0
 Options: utf
-First char = \x{e6}
-Need char = \x{9e}
+First code unit = \xe6
+Last code unit = \x9e
+Subject length lower bound = 3
 
-/[\x{100}]/8BM
+/[\x{100}]/utf
 Memory allocation (code space): 10
 ------------------------------------------------------------------
   0   6 Bra
@@ -412,7 +419,7 @@
   9     End
 ------------------------------------------------------------------
 
-/[Z\x{100}]/8BM
+/[Z\x{100}]/utf
 Memory allocation (code space): 47
 ------------------------------------------------------------------
   0  43 Bra
@@ -421,7 +428,7 @@
  46     End
 ------------------------------------------------------------------
 
-/^[\x{100}\E-\Q\E\x{150}]/B8M
+/^[\x{100}\E-\Q\E\x{150}]/utf
 Memory allocation (code space): 18
 ------------------------------------------------------------------
   0  14 Bra
@@ -431,7 +438,7 @@
  17     End
 ------------------------------------------------------------------
 
-/^[\QĀ\E-\QŐ\E]/B8M
+/^[\QĀ\E-\QŐ\E]/utf
 Memory allocation (code space): 18
 ------------------------------------------------------------------
   0  14 Bra
@@ -441,10 +448,10 @@
  17     End
 ------------------------------------------------------------------
 
-/^[\QĀ\E-\QŐ\E/B8M
-Failed: missing terminating ] for character class at offset 15
+/^[\QĀ\E-\QŐ\E/utf
+Failed: error 106 at offset 15: missing terminating ] for character class
 
-/[\p{L}]/BM
+/[\p{L}]/
 Memory allocation (code space): 15
 ------------------------------------------------------------------
   0  11 Bra
@@ -453,7 +460,7 @@
  14     End
 ------------------------------------------------------------------
 
-/[\p{^L}]/BM
+/[\p{^L}]/
 Memory allocation (code space): 15
 ------------------------------------------------------------------
   0  11 Bra
@@ -462,7 +469,7 @@
  14     End
 ------------------------------------------------------------------
 
-/[\P{L}]/BM
+/[\P{L}]/
 Memory allocation (code space): 15
 ------------------------------------------------------------------
   0  11 Bra
@@ -471,7 +478,7 @@
  14     End
 ------------------------------------------------------------------
 
-/[\P{^L}]/BM
+/[\P{^L}]/
 Memory allocation (code space): 15
 ------------------------------------------------------------------
   0  11 Bra
@@ -480,7 +487,7 @@
  14     End
 ------------------------------------------------------------------
 
-/[abc\p{L}\x{0660}]/8BM
+/[abc\p{L}\x{0660}]/utf
 Memory allocation (code space): 50
 ------------------------------------------------------------------
   0  46 Bra
@@ -489,7 +496,7 @@
  49     End
 ------------------------------------------------------------------
 
-/[\p{Nd}]/8BM
+/[\p{Nd}]/utf
 Memory allocation (code space): 15
 ------------------------------------------------------------------
   0  11 Bra
@@ -498,7 +505,7 @@
  14     End
 ------------------------------------------------------------------
 
-/[\p{Nd}+-]+/8BM
+/[\p{Nd}+-]+/utf
 Memory allocation (code space): 48
 ------------------------------------------------------------------
   0  44 Bra
@@ -507,7 +514,7 @@
  47     End
 ------------------------------------------------------------------
 
-/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/8iBM
+/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/i,utf
 Memory allocation (code space): 25
 ------------------------------------------------------------------
   0  21 Bra
@@ -516,7 +523,7 @@
  24     End
 ------------------------------------------------------------------
 
-/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/8BM
+/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/utf
 Memory allocation (code space): 25
 ------------------------------------------------------------------
   0  21 Bra
@@ -525,7 +532,7 @@
  24     End
 ------------------------------------------------------------------
 
-/[\x{105}-\x{109}]/8iBM
+/[\x{105}-\x{109}]/i,utf
 Memory allocation (code space): 17
 ------------------------------------------------------------------
   0  13 Bra
@@ -534,7 +541,7 @@
  16     End
 ------------------------------------------------------------------
 
-/( ( (?(1)0|) )*   )/xBM
+/( ( (?(1)0|) )*   )/x
 Memory allocation (code space): 38
 ------------------------------------------------------------------
   0  34 Bra
@@ -552,7 +559,7 @@
  37     End
 ------------------------------------------------------------------
 
-/(  (?(1)0|)*   )/xBM
+/(  (?(1)0|)*   )/x
 Memory allocation (code space): 30
 ------------------------------------------------------------------
   0  26 Bra
@@ -568,7 +575,7 @@
  29     End
 ------------------------------------------------------------------
 
-/[a]/BM
+/[a]/
 Memory allocation (code space): 9
 ------------------------------------------------------------------
   0   5 Bra
@@ -577,7 +584,7 @@
   8     End
 ------------------------------------------------------------------
 
-/[a]/8BM
+/[a]/utf
 Memory allocation (code space): 9
 ------------------------------------------------------------------
   0   5 Bra
@@ -586,7 +593,7 @@
   8     End
 ------------------------------------------------------------------
 
-/[\xaa]/BM
+/[\xaa]/
 Memory allocation (code space): 9
 ------------------------------------------------------------------
   0   5 Bra
@@ -595,7 +602,7 @@
   8     End
 ------------------------------------------------------------------
 
-/[\xaa]/8BM
+/[\xaa]/utf
 Memory allocation (code space): 10
 ------------------------------------------------------------------
   0   6 Bra
@@ -604,7 +611,7 @@
   9     End
 ------------------------------------------------------------------
 
-/[^a]/BM
+/[^a]/
 Memory allocation (code space): 9
 ------------------------------------------------------------------
   0   5 Bra
@@ -613,7 +620,7 @@
   8     End
 ------------------------------------------------------------------
 
-/[^a]/8BM
+/[^a]/utf
 Memory allocation (code space): 9
 ------------------------------------------------------------------
   0   5 Bra
@@ -622,7 +629,7 @@
   8     End
 ------------------------------------------------------------------
 
-/[^\xaa]/BM
+/[^\xaa]/
 Memory allocation (code space): 9
 ------------------------------------------------------------------
   0   5 Bra
@@ -631,7 +638,7 @@
   8     End
 ------------------------------------------------------------------
 
-/[^\xaa]/8BM
+/[^\xaa]/utf
 Memory allocation (code space): 10
 ------------------------------------------------------------------
   0   6 Bra
@@ -640,7 +647,9 @@
   9     End
 ------------------------------------------------------------------
 
-/[^\d]/8WB
+#pattern -memory
+
+/[^\d]/utf,ucp
 ------------------------------------------------------------------
   0  11 Bra
   3     [^\p{Nd}]
@@ -648,23 +657,23 @@
  14     End
 ------------------------------------------------------------------
 
-/[[:^alpha:][:^cntrl:]]+/8WB
+/[[:^alpha:][:^cntrl:]]+/utf,ucp
 ------------------------------------------------------------------
-  0  51 Bra
-  3     [ -~\x80-\xff\P{L}\x{100}-\x{10ffff}]++
- 51  51 Ket
- 54     End
+  0  15 Bra
+  3     [\P{L}\P{Cc}]++
+ 15  15 Ket
+ 18     End
 ------------------------------------------------------------------
 
-/[[:^cntrl:][:^alpha:]]+/8WB
+/[[:^cntrl:][:^alpha:]]+/utf,ucp
 ------------------------------------------------------------------
-  0  51 Bra
-  3     [ -~\x80-\xff\x{100}-\x{10ffff}\P{L}]++
- 51  51 Ket
- 54     End
+  0  15 Bra
+  3     [\P{Cc}\P{L}]++
+ 15  15 Ket
+ 18     End
 ------------------------------------------------------------------
 
-/[[:alpha:]]+/8WB
+/[[:alpha:]]+/utf,ucp
 ------------------------------------------------------------------
   0  12 Bra
   3     [\p{L}]++
@@ -672,7 +681,7 @@
  15     End
 ------------------------------------------------------------------
 
-/[[:^alpha:]\S]+/8WB
+/[[:^alpha:]\S]+/utf,ucp
 ------------------------------------------------------------------
   0  15 Bra
   3     [\P{L}\P{Xsp}]++
@@ -680,7 +689,7 @@
  18     End
 ------------------------------------------------------------------
 
-/abc(d|e)(*THEN)x(123(*THEN)4|567(b|q)(*THEN)xx)/B
+/abc(d|e)(*THEN)x(123(*THEN)4|567(b|q)(*THEN)xx)/
 ------------------------------------------------------------------
   0  73 Bra
   3     abc
@@ -709,7 +718,7 @@
  76     End
 ------------------------------------------------------------------
 
-/(((a\2)|(a*)\g<-1>))*a?/B
+/(((a\2)|(a*)\g<-1>))*a?/
 ------------------------------------------------------------------
   0  57 Bra
   3     Brazero
@@ -733,7 +742,7 @@
  60     End
 ------------------------------------------------------------------
 
-/((?+1)(\1))/B
+/((?+1)(\1))/
 ------------------------------------------------------------------
   0  31 Bra
   3  25 Once
@@ -748,21 +757,273 @@
  34     End
 ------------------------------------------------------------------
 
-/.((?2)(?R)\1)()/B
+"(?1)(?#?'){2}(a)"
 ------------------------------------------------------------------
-  0  35 Bra
-  3     Any
-  4  20 Once
-  7  14 CBra 1
- 12  27 Recurse
- 15   0 Recurse
- 18     \1
- 21  14 Ket
- 24  20 Ket
- 27   5 CBra 2
- 32   5 Ket
- 35  35 Ket
- 38     End
+  0  31 Bra
+  3   6 Once
+  6  21 Recurse
+  9   6 Ket
+ 12   6 Once
+ 15  21 Recurse
+ 18   6 Ket
+ 21   7 CBra 1
+ 26     a
+ 28   7 Ket
+ 31  31 Ket
+ 34     End
 ------------------------------------------------------------------
 
-/-- End of testinput11 --/
+/.((?2)(?R)|\1|$)()/
+------------------------------------------------------------------
+  0  42 Bra
+  3     Any
+  4  27 Once
+  7  11 CBra 1
+ 12  34 Recurse
+ 15   0 Recurse
+ 18   6 Alt
+ 21     \1
+ 24   4 Alt
+ 27     $
+ 28  21 Ket
+ 31  27 Ket
+ 34   5 CBra 2
+ 39   5 Ket
+ 42  42 Ket
+ 45     End
+------------------------------------------------------------------
+
+/.((?3)(?R)()(?2)|\1|$)()/
+------------------------------------------------------------------
+  0  53 Bra
+  3     Any
+  4  38 Once
+  7  22 CBra 1
+ 12  45 Recurse
+ 15   0 Recurse
+ 18   5 CBra 2
+ 23   5 Ket
+ 26  18 Recurse
+ 29   6 Alt
+ 32     \1
+ 35   4 Alt
+ 38     $
+ 39  32 Ket
+ 42  38 Ket
+ 45   5 CBra 3
+ 50   5 Ket
+ 53  53 Ket
+ 56     End
+------------------------------------------------------------------
+
+/(?1)()((((((\1++))\x85)+)|))/
+------------------------------------------------------------------
+  0  77 Bra
+  3   6 Recurse
+  6   5 CBra 1
+ 11   5 Ket
+ 14  60 CBra 2
+ 19  49 CBra 3
+ 24  41 CBra 4
+ 29  33 CBra 5
+ 34  23 CBra 6
+ 39  15 CBra 7
+ 44   7 Once
+ 47     \1+
+ 51   7 Ket
+ 54  15 Ket
+ 57  23 Ket
+ 60     \x{85}
+ 62  33 KetRmax
+ 65  41 Ket
+ 68   3 Alt
+ 71  52 Ket
+ 74  60 Ket
+ 77  77 Ket
+ 80     End
+------------------------------------------------------------------
+
+# Check the absolute limit on nesting (?| etc. This varies with code unit
+# width because the workspace is a different number of bytes. It will fail
+# with link size 2 in 8-bit and 16-bit but not in 32-bit.
+
+/(?|(?|(?J:(?|(?x:(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|
+)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
+/parens_nest_limit=1000,-fullbincode
+Failed: error 184 at offset 1540: (?| and/or (?J: or (?x: parentheses are too deeply nested
+
+# Use "expand" to create some very long patterns with nested parentheses, in
+# order to test workspace overflow. Again, this varies with code unit width,
+# and even with it fails in two modes, the error offset differs. It also varies
+# with link size - hence multiple tests with different values.
+
+/(?'ABC'\[[bar](]{105}*THEN:\[A]{255}\[)]{106}/expand,-fullbincode
+
+/(?'ABC'\[[bar](]{106}*THEN:\[A]{255}\[)]{107}/expand,-fullbincode
+Failed: error 186 at offset 637: regular expression is too complicated
+
+/(?'ABC'\[[bar](]{159}*THEN:\[A]{255}\[)]{160}/expand,-fullbincode
+Failed: error 186 at offset 637: regular expression is too complicated
+
+/(?'ABC'\[[bar](]{199}*THEN:\[A]{255}\[)]{200}/expand,-fullbincode
+Failed: error 186 at offset 637: regular expression is too complicated
+
+/(?'ABC'\[[bar](]{299}*THEN:\[A]{255}\[)]{300}/expand,-fullbincode
+Failed: error 186 at offset 637: regular expression is too complicated
+
+/(?(1)(?1)){8,}+()/debug
+------------------------------------------------------------------
+  0 119 Bra
+  3 105 Once
+  6   9 Cond
+  9   1 Cond ref
+ 12 111 Recurse
+ 15   9 Ket
+ 18   9 Cond
+ 21   1 Cond ref
+ 24 111 Recurse
+ 27   9 Ket
+ 30   9 Cond
+ 33   1 Cond ref
+ 36 111 Recurse
+ 39   9 Ket
+ 42   9 Cond
+ 45   1 Cond ref
+ 48 111 Recurse
+ 51   9 Ket
+ 54   9 Cond
+ 57   1 Cond ref
+ 60 111 Recurse
+ 63   9 Ket
+ 66   9 Cond
+ 69   1 Cond ref
+ 72 111 Recurse
+ 75   9 Ket
+ 78   9 Cond
+ 81   1 Cond ref
+ 84 111 Recurse
+ 87   9 Ket
+ 90  15 SBraPos
+ 93   9 SCond
+ 96   1 Cond ref
+ 99 111 Recurse
+102   9 Ket
+105  15 KetRpos
+108 105 Ket
+111   5 CBra 1
+116   5 Ket
+119 119 Ket
+122     End
+------------------------------------------------------------------
+Capturing subpattern count = 1
+Max back reference = 1
+May match empty string
+Subject length lower bound = 0
+    abcd
+ 0: 
+ 1: 
+
+/(?(1)|a(?1)b){2,}+()/debug
+------------------------------------------------------------------
+  0  61 Bra
+  3  47 Once
+  6   6 Cond
+  9   1 Cond ref
+ 12  10 Alt
+ 15     a
+ 17  53 Recurse
+ 20     b
+ 22  16 Ket
+ 25  22 SBraPos
+ 28   6 SCond
+ 31   1 Cond ref
+ 34  10 Alt
+ 37     a
+ 39  53 Recurse
+ 42     b
+ 44  16 Ket
+ 47  22 KetRpos
+ 50  47 Ket
+ 53   5 CBra 1
+ 58   5 Ket
+ 61  61 Ket
+ 64     End
+------------------------------------------------------------------
+Capturing subpattern count = 1
+Max back reference = 1
+May match empty string
+Subject length lower bound = 0
+    abcde
+No match
+
+/((?1)(?2)(?3)(?4)(?5)(?6)(?7)(?8)(?9)(?9)(?8)(?7)(?6)(?5)(?4)(?3)(?2)(?1)(?0)){2,}()()()()()()()()()/debug
+------------------------------------------------------------------
+  0 205 Bra
+  3  62 CBra 1
+  8   3 Recurse
+ 11 133 Recurse
+ 14 141 Recurse
+ 17 149 Recurse
+ 20 157 Recurse
+ 23 165 Recurse
+ 26 173 Recurse
+ 29 181 Recurse
+ 32 189 Recurse
+ 35 189 Recurse
+ 38 181 Recurse
+ 41 173 Recurse
+ 44 165 Recurse
+ 47 157 Recurse
+ 50 149 Recurse
+ 53 141 Recurse
+ 56 133 Recurse
+ 59   3 Recurse
+ 62   0 Recurse
+ 65  62 Ket
+ 68  62 SCBra 1
+ 73   3 Recurse
+ 76 133 Recurse
+ 79 141 Recurse
+ 82 149 Recurse
+ 85 157 Recurse
+ 88 165 Recurse
+ 91 173 Recurse
+ 94 181 Recurse
+ 97 189 Recurse
+100 189 Recurse
+103 181 Recurse
+106 173 Recurse
+109 165 Recurse
+112 157 Recurse
+115 149 Recurse
+118 141 Recurse
+121 133 Recurse
+124   3 Recurse
+127   0 Recurse
+130  62 KetRmax
+133   5 CBra 2
+138   5 Ket
+141   5 CBra 3
+146   5 Ket
+149   5 CBra 4
+154   5 Ket
+157   5 CBra 5
+162   5 Ket
+165   5 CBra 6
+170   5 Ket
+173   5 CBra 7
+178   5 Ket
+181   5 CBra 8
+186   5 Ket
+189   5 CBra 9
+194   5 Ket
+197   5 CBra 10
+202   5 Ket
+205 205 Ket
+208     End
+------------------------------------------------------------------
+Capturing subpattern count = 10
+May match empty string
+Subject length lower bound = 0
+
+# End of testinput8
diff --git a/dist2/testdata/testoutput8-8-3 b/dist2/testdata/testoutput8-8-3
new file mode 100644
index 0000000..2fe1168
--- /dev/null
+++ b/dist2/testdata/testoutput8-8-3
@@ -0,0 +1,1027 @@
+# There are two sorts of patterns in this test. A number of them are
+# representative patterns whose lengths and offsets are checked. This is just a
+# doublecheck test to ensure the sizes don't go horribly wrong when something
+# is changed. The operation of these patterns is checked in other tests.
+#
+# This file also contains tests whose output varies with code unit size and/or
+# link size. Unicode support is required for these tests. There are separate
+# output files for each code unit size and link size.
+
+#pattern fullbincode,memory
+
+/((?i)b)/
+Memory allocation (code space): 21
+------------------------------------------------------------------
+  0  16 Bra
+  4   8 CBra 1
+ 10  /i b
+ 12   8 Ket
+ 16  16 Ket
+ 20     End
+------------------------------------------------------------------
+
+/(?s)(.*X|^B)/
+Memory allocation (code space): 30
+------------------------------------------------------------------
+  0  25 Bra
+  4  10 CBra 1
+ 10     AllAny*
+ 12     X
+ 14   7 Alt
+ 18     ^
+ 19     B
+ 21  17 Ket
+ 25  25 Ket
+ 29     End
+------------------------------------------------------------------
+
+/(?s:.*X|^B)/
+Memory allocation (code space): 28
+------------------------------------------------------------------
+  0  23 Bra
+  4   8 Bra
+  8     AllAny*
+ 10     X
+ 12   7 Alt
+ 16     ^
+ 17     B
+ 19  15 Ket
+ 23  23 Ket
+ 27     End
+------------------------------------------------------------------
+
+/^[[:alnum:]]/
+Memory allocation (code space): 43
+------------------------------------------------------------------
+  0  38 Bra
+  4     ^
+  5     [0-9A-Za-z]
+ 38  38 Ket
+ 42     End
+------------------------------------------------------------------
+
+/#/Ix
+Memory allocation (code space): 9
+------------------------------------------------------------------
+  0   4 Bra
+  4   4 Ket
+  8     End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+May match empty string
+Options: extended
+Subject length lower bound = 0
+
+/a#/Ix
+Memory allocation (code space): 11
+------------------------------------------------------------------
+  0   6 Bra
+  4     a
+  6   6 Ket
+ 10     End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: extended
+First code unit = 'a'
+Subject length lower bound = 1
+
+/x?+/
+Memory allocation (code space): 11
+------------------------------------------------------------------
+  0   6 Bra
+  4     x?+
+  6   6 Ket
+ 10     End
+------------------------------------------------------------------
+
+/x++/
+Memory allocation (code space): 11
+------------------------------------------------------------------
+  0   6 Bra
+  4     x++
+  6   6 Ket
+ 10     End
+------------------------------------------------------------------
+
+/x{1,3}+/
+Memory allocation (code space): 15
+------------------------------------------------------------------
+  0  10 Bra
+  4     x
+  6     x{0,2}+
+ 10  10 Ket
+ 14     End
+------------------------------------------------------------------
+
+/(x)*+/
+Memory allocation (code space): 22
+------------------------------------------------------------------
+  0  17 Bra
+  4     Braposzero
+  5   8 CBraPos 1
+ 11     x
+ 13   8 KetRpos
+ 17  17 Ket
+ 21     End
+------------------------------------------------------------------
+
+/^((a+)(?U)([ab]+)(?-U)([bc]+)(\w*))/
+Memory allocation (code space): 132
+------------------------------------------------------------------
+  0 127 Bra
+  4     ^
+  5 118 CBra 1
+ 11   8 CBra 2
+ 17     a+
+ 19   8 Ket
+ 23  40 CBra 3
+ 29     [ab]+?
+ 63  40 Ket
+ 67  40 CBra 4
+ 73     [bc]+
+107  40 Ket
+111   8 CBra 5
+117     \w*+
+119   8 Ket
+123 118 Ket
+127 127 Ket
+131     End
+------------------------------------------------------------------
+
+"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"
+Memory allocation (code space): 828
+------------------------------------------------------------------
+  0 823 Bra
+  4     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
+822     \b
+823 823 Ket
+827     End
+------------------------------------------------------------------
+
+"\$\<\.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"
+Memory allocation (code space): 818
+------------------------------------------------------------------
+  0 813 Bra
+  4     $<.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
+812     \b
+813 813 Ket
+817     End
+------------------------------------------------------------------
+
+/(a(?1)b)/
+Memory allocation (code space): 27
+------------------------------------------------------------------
+  0  22 Bra
+  4  14 CBra 1
+ 10     a
+ 12   4 Recurse
+ 16     b
+ 18  14 Ket
+ 22  22 Ket
+ 26     End
+------------------------------------------------------------------
+
+/(a(?1)+b)/
+Memory allocation (code space): 35
+------------------------------------------------------------------
+  0  30 Bra
+  4  22 CBra 1
+ 10     a
+ 12   8 Once
+ 16   4 Recurse
+ 20   8 KetRmax
+ 24     b
+ 26  22 Ket
+ 30  30 Ket
+ 34     End
+------------------------------------------------------------------
+
+/a(?P<name1>b|c)d(?P<longername2>e)/
+Memory allocation (code space): 43
+------------------------------------------------------------------
+  0  38 Bra
+  4     a
+  6   8 CBra 1
+ 12     b
+ 14   6 Alt
+ 18     c
+ 20  14 Ket
+ 24     d
+ 26   8 CBra 2
+ 32     e
+ 34   8 Ket
+ 38  38 Ket
+ 42     End
+------------------------------------------------------------------
+
+/(?:a(?P<c>c(?P<d>d)))(?P<a>a)/
+Memory allocation (code space): 55
+------------------------------------------------------------------
+  0  50 Bra
+  4  30 Bra
+  8     a
+ 10  20 CBra 1
+ 16     c
+ 18   8 CBra 2
+ 24     d
+ 26   8 Ket
+ 30  20 Ket
+ 34  30 Ket
+ 38   8 CBra 3
+ 44     a
+ 46   8 Ket
+ 50  50 Ket
+ 54     End
+------------------------------------------------------------------
+
+/(?P<a>a)...(?P=a)bbb(?P>a)d/
+Memory allocation (code space): 39
+------------------------------------------------------------------
+  0  34 Bra
+  4   8 CBra 1
+ 10     a
+ 12   8 Ket
+ 16     Any
+ 17     Any
+ 18     Any
+ 19     \1
+ 22     bbb
+ 28   4 Recurse
+ 32     d
+ 34  34 Ket
+ 38     End
+------------------------------------------------------------------
+
+/abc(?C255)de(?C)f/
+Memory allocation (code space): 37
+------------------------------------------------------------------
+  0  32 Bra
+  4     abc
+ 10     Callout 255 10 1
+ 18     de
+ 22     Callout 0 16 1
+ 30     f
+ 32  32 Ket
+ 36     End
+------------------------------------------------------------------
+
+/abcde/auto_callout
+Memory allocation (code space): 67
+------------------------------------------------------------------
+  0  62 Bra
+  4     Callout 255 0 1
+ 12     a
+ 14     Callout 255 1 1
+ 22     b
+ 24     Callout 255 2 1
+ 32     c
+ 34     Callout 255 3 1
+ 42     d
+ 44     Callout 255 4 1
+ 52     e
+ 54     Callout 255 5 0
+ 62  62 Ket
+ 66     End
+------------------------------------------------------------------
+
+/\x{100}/utf
+Memory allocation (code space): 12
+------------------------------------------------------------------
+  0   7 Bra
+  4     \x{100}
+  7   7 Ket
+ 11     End
+------------------------------------------------------------------
+
+/\x{1000}/utf
+Memory allocation (code space): 13
+------------------------------------------------------------------
+  0   8 Bra
+  4     \x{1000}
+  8   8 Ket
+ 12     End
+------------------------------------------------------------------
+
+/\x{10000}/utf
+Memory allocation (code space): 14
+------------------------------------------------------------------
+  0   9 Bra
+  4     \x{10000}
+  9   9 Ket
+ 13     End
+------------------------------------------------------------------
+
+/\x{100000}/utf
+Memory allocation (code space): 14
+------------------------------------------------------------------
+  0   9 Bra
+  4     \x{100000}
+  9   9 Ket
+ 13     End
+------------------------------------------------------------------
+
+/\x{10ffff}/utf
+Memory allocation (code space): 14
+------------------------------------------------------------------
+  0   9 Bra
+  4     \x{10ffff}
+  9   9 Ket
+ 13     End
+------------------------------------------------------------------
+
+/\x{110000}/utf
+Failed: error 134 at offset 9: character code point value in \x{} or \o{} is too large
+
+/[\x{ff}]/utf
+Memory allocation (code space): 12
+------------------------------------------------------------------
+  0   7 Bra
+  4     \x{ff}
+  7   7 Ket
+ 11     End
+------------------------------------------------------------------
+
+/[\x{100}]/utf
+Memory allocation (code space): 12
+------------------------------------------------------------------
+  0   7 Bra
+  4     \x{100}
+  7   7 Ket
+ 11     End
+------------------------------------------------------------------
+
+/\x80/utf
+Memory allocation (code space): 12
+------------------------------------------------------------------
+  0   7 Bra
+  4     \x{80}
+  7   7 Ket
+ 11     End
+------------------------------------------------------------------
+
+/\xff/utf
+Memory allocation (code space): 12
+------------------------------------------------------------------
+  0   7 Bra
+  4     \x{ff}
+  7   7 Ket
+ 11     End
+------------------------------------------------------------------
+
+/\x{0041}\x{2262}\x{0391}\x{002e}/I,utf
+Memory allocation (code space): 20
+------------------------------------------------------------------
+  0  15 Bra
+  4     A\x{2262}\x{391}.
+ 15  15 Ket
+ 19     End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = 'A'
+Last code unit = '.'
+Subject length lower bound = 4
+
+/\x{D55c}\x{ad6d}\x{C5B4}/I,utf
+Memory allocation (code space): 21
+------------------------------------------------------------------
+  0  16 Bra
+  4     \x{d55c}\x{ad6d}\x{c5b4}
+ 16  16 Ket
+ 20     End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = \xed
+Last code unit = \xb4
+Subject length lower bound = 3
+
+/\x{65e5}\x{672c}\x{8a9e}/I,utf
+Memory allocation (code space): 21
+------------------------------------------------------------------
+  0  16 Bra
+  4     \x{65e5}\x{672c}\x{8a9e}
+ 16  16 Ket
+ 20     End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = \xe6
+Last code unit = \x9e
+Subject length lower bound = 3
+
+/[\x{100}]/utf
+Memory allocation (code space): 12
+------------------------------------------------------------------
+  0   7 Bra
+  4     \x{100}
+  7   7 Ket
+ 11     End
+------------------------------------------------------------------
+
+/[Z\x{100}]/utf
+Memory allocation (code space): 50
+------------------------------------------------------------------
+  0  45 Bra
+  4     [Z\x{100}]
+ 45  45 Ket
+ 49     End
+------------------------------------------------------------------
+
+/^[\x{100}\E-\Q\E\x{150}]/utf
+Memory allocation (code space): 21
+------------------------------------------------------------------
+  0  16 Bra
+  4     ^
+  5     [\x{100}-\x{150}]
+ 16  16 Ket
+ 20     End
+------------------------------------------------------------------
+
+/^[\QĀ\E-\QŐ\E]/utf
+Memory allocation (code space): 21
+------------------------------------------------------------------
+  0  16 Bra
+  4     ^
+  5     [\x{100}-\x{150}]
+ 16  16 Ket
+ 20     End
+------------------------------------------------------------------
+
+/^[\QĀ\E-\QŐ\E/utf
+Failed: error 106 at offset 15: missing terminating ] for character class
+
+/[\p{L}]/
+Memory allocation (code space): 18
+------------------------------------------------------------------
+  0  13 Bra
+  4     [\p{L}]
+ 13  13 Ket
+ 17     End
+------------------------------------------------------------------
+
+/[\p{^L}]/
+Memory allocation (code space): 18
+------------------------------------------------------------------
+  0  13 Bra
+  4     [\P{L}]
+ 13  13 Ket
+ 17     End
+------------------------------------------------------------------
+
+/[\P{L}]/
+Memory allocation (code space): 18
+------------------------------------------------------------------
+  0  13 Bra
+  4     [\P{L}]
+ 13  13 Ket
+ 17     End
+------------------------------------------------------------------
+
+/[\P{^L}]/
+Memory allocation (code space): 18
+------------------------------------------------------------------
+  0  13 Bra
+  4     [\p{L}]
+ 13  13 Ket
+ 17     End
+------------------------------------------------------------------
+
+/[abc\p{L}\x{0660}]/utf
+Memory allocation (code space): 53
+------------------------------------------------------------------
+  0  48 Bra
+  4     [a-c\p{L}\x{660}]
+ 48  48 Ket
+ 52     End
+------------------------------------------------------------------
+
+/[\p{Nd}]/utf
+Memory allocation (code space): 18
+------------------------------------------------------------------
+  0  13 Bra
+  4     [\p{Nd}]
+ 13  13 Ket
+ 17     End
+------------------------------------------------------------------
+
+/[\p{Nd}+-]+/utf
+Memory allocation (code space): 51
+------------------------------------------------------------------
+  0  46 Bra
+  4     [+\-\p{Nd}]++
+ 46  46 Ket
+ 50     End
+------------------------------------------------------------------
+
+/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/i,utf
+Memory allocation (code space): 27
+------------------------------------------------------------------
+  0  22 Bra
+  4  /i A\x{391}\x{10427}\x{ff3a}\x{1fb0}
+ 22  22 Ket
+ 26     End
+------------------------------------------------------------------
+
+/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/utf
+Memory allocation (code space): 27
+------------------------------------------------------------------
+  0  22 Bra
+  4     A\x{391}\x{10427}\x{ff3a}\x{1fb0}
+ 22  22 Ket
+ 26     End
+------------------------------------------------------------------
+
+/[\x{105}-\x{109}]/i,utf
+Memory allocation (code space): 20
+------------------------------------------------------------------
+  0  15 Bra
+  4     [\x{104}-\x{109}]
+ 15  15 Ket
+ 19     End
+------------------------------------------------------------------
+
+/( ( (?(1)0|) )*   )/x
+Memory allocation (code space): 47
+------------------------------------------------------------------
+  0  42 Bra
+  4  34 CBra 1
+ 10     Brazero
+ 11  23 SCBra 2
+ 17   9 Cond
+ 21   1 Cond ref
+ 24     0
+ 26   4 Alt
+ 30  13 Ket
+ 34  23 KetRmax
+ 38  34 Ket
+ 42  42 Ket
+ 46     End
+------------------------------------------------------------------
+
+/(  (?(1)0|)*   )/x
+Memory allocation (code space): 37
+------------------------------------------------------------------
+  0  32 Bra
+  4  24 CBra 1
+ 10     Brazero
+ 11   9 SCond
+ 15   1 Cond ref
+ 18     0
+ 20   4 Alt
+ 24  13 KetRmax
+ 28  24 Ket
+ 32  32 Ket
+ 36     End
+------------------------------------------------------------------
+
+/[a]/
+Memory allocation (code space): 11
+------------------------------------------------------------------
+  0   6 Bra
+  4     a
+  6   6 Ket
+ 10     End
+------------------------------------------------------------------
+
+/[a]/utf
+Memory allocation (code space): 11
+------------------------------------------------------------------
+  0   6 Bra
+  4     a
+  6   6 Ket
+ 10     End
+------------------------------------------------------------------
+
+/[\xaa]/
+Memory allocation (code space): 11
+------------------------------------------------------------------
+  0   6 Bra
+  4     \x{aa}
+  6   6 Ket
+ 10     End
+------------------------------------------------------------------
+
+/[\xaa]/utf
+Memory allocation (code space): 12
+------------------------------------------------------------------
+  0   7 Bra
+  4     \x{aa}
+  7   7 Ket
+ 11     End
+------------------------------------------------------------------
+
+/[^a]/
+Memory allocation (code space): 11
+------------------------------------------------------------------
+  0   6 Bra
+  4     [^a]
+  6   6 Ket
+ 10     End
+------------------------------------------------------------------
+
+/[^a]/utf
+Memory allocation (code space): 11
+------------------------------------------------------------------
+  0   6 Bra
+  4     [^a]
+  6   6 Ket
+ 10     End
+------------------------------------------------------------------
+
+/[^\xaa]/
+Memory allocation (code space): 11
+------------------------------------------------------------------
+  0   6 Bra
+  4     [^\x{aa}]
+  6   6 Ket
+ 10     End
+------------------------------------------------------------------
+
+/[^\xaa]/utf
+Memory allocation (code space): 12
+------------------------------------------------------------------
+  0   7 Bra
+  4     [^\x{aa}]
+  7   7 Ket
+ 11     End
+------------------------------------------------------------------
+
+#pattern -memory
+
+/[^\d]/utf,ucp
+------------------------------------------------------------------
+  0  13 Bra
+  4     [^\p{Nd}]
+ 13  13 Ket
+ 17     End
+------------------------------------------------------------------
+
+/[[:^alpha:][:^cntrl:]]+/utf,ucp
+------------------------------------------------------------------
+  0  17 Bra
+  4     [\P{L}\P{Cc}]++
+ 17  17 Ket
+ 21     End
+------------------------------------------------------------------
+
+/[[:^cntrl:][:^alpha:]]+/utf,ucp
+------------------------------------------------------------------
+  0  17 Bra
+  4     [\P{Cc}\P{L}]++
+ 17  17 Ket
+ 21     End
+------------------------------------------------------------------
+
+/[[:alpha:]]+/utf,ucp
+------------------------------------------------------------------
+  0  14 Bra
+  4     [\p{L}]++
+ 14  14 Ket
+ 18     End
+------------------------------------------------------------------
+
+/[[:^alpha:]\S]+/utf,ucp
+------------------------------------------------------------------
+  0  17 Bra
+  4     [\P{L}\P{Xsp}]++
+ 17  17 Ket
+ 21     End
+------------------------------------------------------------------
+
+/abc(d|e)(*THEN)x(123(*THEN)4|567(b|q)(*THEN)xx)/
+------------------------------------------------------------------
+  0  83 Bra
+  4     abc
+ 10   8 CBra 1
+ 16     d
+ 18   6 Alt
+ 22     e
+ 24  14 Ket
+ 28     *THEN
+ 29     x
+ 31  15 CBra 2
+ 37     123
+ 43     *THEN
+ 44     4
+ 46  33 Alt
+ 50     567
+ 56   8 CBra 3
+ 62     b
+ 64   6 Alt
+ 68     q
+ 70  14 Ket
+ 74     *THEN
+ 75     xx
+ 79  48 Ket
+ 83  83 Ket
+ 87     End
+------------------------------------------------------------------
+
+/(((a\2)|(a*)\g<-1>))*a?/
+------------------------------------------------------------------
+  0  70 Bra
+  4     Brazero
+  5  59 SCBra 1
+ 11  49 Once
+ 15  21 CBra 2
+ 21  11 CBra 3
+ 27     a
+ 29     \2
+ 32  11 Ket
+ 36  20 Alt
+ 40   8 CBra 4
+ 46     a*
+ 48   8 Ket
+ 52  40 Recurse
+ 56  41 Ket
+ 60  49 Ket
+ 64  59 KetRmax
+ 68     a?+
+ 70  70 Ket
+ 74     End
+------------------------------------------------------------------
+
+/((?+1)(\1))/
+------------------------------------------------------------------
+  0  39 Bra
+  4  31 Once
+  8  23 CBra 1
+ 14  18 Recurse
+ 18   9 CBra 2
+ 24     \1
+ 27   9 Ket
+ 31  23 Ket
+ 35  31 Ket
+ 39  39 Ket
+ 43     End
+------------------------------------------------------------------
+
+"(?1)(?#?'){2}(a)"
+------------------------------------------------------------------
+  0  40 Bra
+  4   8 Once
+  8  28 Recurse
+ 12   8 Ket
+ 16   8 Once
+ 20  28 Recurse
+ 24   8 Ket
+ 28   8 CBra 1
+ 34     a
+ 36   8 Ket
+ 40  40 Ket
+ 44     End
+------------------------------------------------------------------
+
+/.((?2)(?R)|\1|$)()/
+------------------------------------------------------------------
+  0  53 Bra
+  4     Any
+  5  34 Once
+  9  14 CBra 1
+ 15  43 Recurse
+ 19   0 Recurse
+ 23   7 Alt
+ 27     \1
+ 30   5 Alt
+ 34     $
+ 35  26 Ket
+ 39  34 Ket
+ 43   6 CBra 2
+ 49   6 Ket
+ 53  53 Ket
+ 57     End
+------------------------------------------------------------------
+
+/.((?3)(?R)()(?2)|\1|$)()/
+------------------------------------------------------------------
+  0  67 Bra
+  4     Any
+  5  48 Once
+  9  28 CBra 1
+ 15  57 Recurse
+ 19   0 Recurse
+ 23   6 CBra 2
+ 29   6 Ket
+ 33  23 Recurse
+ 37   7 Alt
+ 41     \1
+ 44   5 Alt
+ 48     $
+ 49  40 Ket
+ 53  48 Ket
+ 57   6 CBra 3
+ 63   6 Ket
+ 67  67 Ket
+ 71     End
+------------------------------------------------------------------
+
+/(?1)()((((((\1++))\x85)+)|))/
+------------------------------------------------------------------
+  0  96 Bra
+  4   8 Recurse
+  8   6 CBra 1
+ 14   6 Ket
+ 18  74 CBra 2
+ 24  60 CBra 3
+ 30  50 CBra 4
+ 36  40 CBra 5
+ 42  28 CBra 6
+ 48  18 CBra 7
+ 54   8 Once
+ 58     \1+
+ 62   8 Ket
+ 66  18 Ket
+ 70  28 Ket
+ 74     \x{85}
+ 76  40 KetRmax
+ 80  50 Ket
+ 84   4 Alt
+ 88  64 Ket
+ 92  74 Ket
+ 96  96 Ket
+100     End
+------------------------------------------------------------------
+
+# Check the absolute limit on nesting (?| etc. This varies with code unit
+# width because the workspace is a different number of bytes. It will fail
+# with link size 2 in 8-bit and 16-bit but not in 32-bit.
+
+/(?|(?|(?J:(?|(?x:(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|
+)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
+/parens_nest_limit=1000,-fullbincode
+
+# Use "expand" to create some very long patterns with nested parentheses, in
+# order to test workspace overflow. Again, this varies with code unit width,
+# and even with it fails in two modes, the error offset differs. It also varies
+# with link size - hence multiple tests with different values.
+
+/(?'ABC'\[[bar](]{105}*THEN:\[A]{255}\[)]{106}/expand,-fullbincode
+
+/(?'ABC'\[[bar](]{106}*THEN:\[A]{255}\[)]{107}/expand,-fullbincode
+
+/(?'ABC'\[[bar](]{159}*THEN:\[A]{255}\[)]{160}/expand,-fullbincode
+Failed: error 186 at offset 936: regular expression is too complicated
+
+/(?'ABC'\[[bar](]{199}*THEN:\[A]{255}\[)]{200}/expand,-fullbincode
+Failed: error 186 at offset 936: regular expression is too complicated
+
+/(?'ABC'\[[bar](]{299}*THEN:\[A]{255}\[)]{300}/expand,-fullbincode
+Failed: error 186 at offset 936: regular expression is too complicated
+
+/(?(1)(?1)){8,}+()/debug
+------------------------------------------------------------------
+  0 150 Bra
+  4 132 Once
+  8  11 Cond
+ 12   1 Cond ref
+ 15 140 Recurse
+ 19  11 Ket
+ 23  11 Cond
+ 27   1 Cond ref
+ 30 140 Recurse
+ 34  11 Ket
+ 38  11 Cond
+ 42   1 Cond ref
+ 45 140 Recurse
+ 49  11 Ket
+ 53  11 Cond
+ 57   1 Cond ref
+ 60 140 Recurse
+ 64  11 Ket
+ 68  11 Cond
+ 72   1 Cond ref
+ 75 140 Recurse
+ 79  11 Ket
+ 83  11 Cond
+ 87   1 Cond ref
+ 90 140 Recurse
+ 94  11 Ket
+ 98  11 Cond
+102   1 Cond ref
+105 140 Recurse
+109  11 Ket
+113  19 SBraPos
+117  11 SCond
+121   1 Cond ref
+124 140 Recurse
+128  11 Ket
+132  19 KetRpos
+136 132 Ket
+140   6 CBra 1
+146   6 Ket
+150 150 Ket
+154     End
+------------------------------------------------------------------
+Capturing subpattern count = 1
+Max back reference = 1
+May match empty string
+Subject length lower bound = 0
+    abcd
+ 0: 
+ 1: 
+
+/(?(1)|a(?1)b){2,}+()/debug
+------------------------------------------------------------------
+  0  76 Bra
+  4  58 Once
+  8   7 Cond
+ 12   1 Cond ref
+ 15  12 Alt
+ 19     a
+ 21  66 Recurse
+ 25     b
+ 27  19 Ket
+ 31  27 SBraPos
+ 35   7 SCond
+ 39   1 Cond ref
+ 42  12 Alt
+ 46     a
+ 48  66 Recurse
+ 52     b
+ 54  19 Ket
+ 58  27 KetRpos
+ 62  58 Ket
+ 66   6 CBra 1
+ 72   6 Ket
+ 76  76 Ket
+ 80     End
+------------------------------------------------------------------
+Capturing subpattern count = 1
+Max back reference = 1
+May match empty string
+Subject length lower bound = 0
+    abcde
+No match
+
+/((?1)(?2)(?3)(?4)(?5)(?6)(?7)(?8)(?9)(?9)(?8)(?7)(?6)(?5)(?4)(?3)(?2)(?1)(?0)){2,}()()()()()()()()()/debug
+------------------------------------------------------------------
+  0 266 Bra
+  4  82 CBra 1
+ 10   4 Recurse
+ 14 176 Recurse
+ 18 186 Recurse
+ 22 196 Recurse
+ 26 206 Recurse
+ 30 216 Recurse
+ 34 226 Recurse
+ 38 236 Recurse
+ 42 246 Recurse
+ 46 246 Recurse
+ 50 236 Recurse
+ 54 226 Recurse
+ 58 216 Recurse
+ 62 206 Recurse
+ 66 196 Recurse
+ 70 186 Recurse
+ 74 176 Recurse
+ 78   4 Recurse
+ 82   0 Recurse
+ 86  82 Ket
+ 90  82 SCBra 1
+ 96   4 Recurse
+100 176 Recurse
+104 186 Recurse
+108 196 Recurse
+112 206 Recurse
+116 216 Recurse
+120 226 Recurse
+124 236 Recurse
+128 246 Recurse
+132 246 Recurse
+136 236 Recurse
+140 226 Recurse
+144 216 Recurse
+148 206 Recurse
+152 196 Recurse
+156 186 Recurse
+160 176 Recurse
+164   4 Recurse
+168   0 Recurse
+172  82 KetRmax
+176   6 CBra 2
+182   6 Ket
+186   6 CBra 3
+192   6 Ket
+196   6 CBra 4
+202   6 Ket
+206   6 CBra 5
+212   6 Ket
+216   6 CBra 6
+222   6 Ket
+226   6 CBra 7
+232   6 Ket
+236   6 CBra 8
+242   6 Ket
+246   6 CBra 9
+252   6 Ket
+256   6 CBra 10
+262   6 Ket
+266 266 Ket
+270     End
+------------------------------------------------------------------
+Capturing subpattern count = 10
+May match empty string
+Subject length lower bound = 0
+
+# End of testinput8
diff --git a/dist2/testdata/testoutput8-8-4 b/dist2/testdata/testoutput8-8-4
new file mode 100644
index 0000000..91993b2
--- /dev/null
+++ b/dist2/testdata/testoutput8-8-4
@@ -0,0 +1,1025 @@
+# There are two sorts of patterns in this test. A number of them are
+# representative patterns whose lengths and offsets are checked. This is just a
+# doublecheck test to ensure the sizes don't go horribly wrong when something
+# is changed. The operation of these patterns is checked in other tests.
+#
+# This file also contains tests whose output varies with code unit size and/or
+# link size. Unicode support is required for these tests. There are separate
+# output files for each code unit size and link size.
+
+#pattern fullbincode,memory
+
+/((?i)b)/
+Memory allocation (code space): 25
+------------------------------------------------------------------
+  0  19 Bra
+  5   9 CBra 1
+ 12  /i b
+ 14   9 Ket
+ 19  19 Ket
+ 24     End
+------------------------------------------------------------------
+
+/(?s)(.*X|^B)/
+Memory allocation (code space): 35
+------------------------------------------------------------------
+  0  29 Bra
+  5  11 CBra 1
+ 12     AllAny*
+ 14     X
+ 16   8 Alt
+ 21     ^
+ 22     B
+ 24  19 Ket
+ 29  29 Ket
+ 34     End
+------------------------------------------------------------------
+
+/(?s:.*X|^B)/
+Memory allocation (code space): 33
+------------------------------------------------------------------
+  0  27 Bra
+  5   9 Bra
+ 10     AllAny*
+ 12     X
+ 14   8 Alt
+ 19     ^
+ 20     B
+ 22  17 Ket
+ 27  27 Ket
+ 32     End
+------------------------------------------------------------------
+
+/^[[:alnum:]]/
+Memory allocation (code space): 45
+------------------------------------------------------------------
+  0  39 Bra
+  5     ^
+  6     [0-9A-Za-z]
+ 39  39 Ket
+ 44     End
+------------------------------------------------------------------
+
+/#/Ix
+Memory allocation (code space): 11
+------------------------------------------------------------------
+  0   5 Bra
+  5   5 Ket
+ 10     End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+May match empty string
+Options: extended
+Subject length lower bound = 0
+
+/a#/Ix
+Memory allocation (code space): 13
+------------------------------------------------------------------
+  0   7 Bra
+  5     a
+  7   7 Ket
+ 12     End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: extended
+First code unit = 'a'
+Subject length lower bound = 1
+
+/x?+/
+Memory allocation (code space): 13
+------------------------------------------------------------------
+  0   7 Bra
+  5     x?+
+  7   7 Ket
+ 12     End
+------------------------------------------------------------------
+
+/x++/
+Memory allocation (code space): 13
+------------------------------------------------------------------
+  0   7 Bra
+  5     x++
+  7   7 Ket
+ 12     End
+------------------------------------------------------------------
+
+/x{1,3}+/
+Memory allocation (code space): 17
+------------------------------------------------------------------
+  0  11 Bra
+  5     x
+  7     x{0,2}+
+ 11  11 Ket
+ 16     End
+------------------------------------------------------------------
+
+/(x)*+/
+Memory allocation (code space): 26
+------------------------------------------------------------------
+  0  20 Bra
+  5     Braposzero
+  6   9 CBraPos 1
+ 13     x
+ 15   9 KetRpos
+ 20  20 Ket
+ 25     End
+------------------------------------------------------------------
+
+/^((a+)(?U)([ab]+)(?-U)([bc]+)(\w*))/
+Memory allocation (code space): 144
+------------------------------------------------------------------
+  0 138 Bra
+  5     ^
+  6 127 CBra 1
+ 13   9 CBra 2
+ 20     a+
+ 22   9 Ket
+ 27  41 CBra 3
+ 34     [ab]+?
+ 68  41 Ket
+ 73  41 CBra 4
+ 80     [bc]+
+114  41 Ket
+119   9 CBra 5
+126     \w*+
+128   9 Ket
+133 127 Ket
+138 138 Ket
+143     End
+------------------------------------------------------------------
+
+"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"
+Memory allocation (code space): 830
+------------------------------------------------------------------
+  0 824 Bra
+  5     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
+823     \b
+824 824 Ket
+829     End
+------------------------------------------------------------------
+
+"\$\<\.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"
+Memory allocation (code space): 820
+------------------------------------------------------------------
+  0 814 Bra
+  5     $<.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
+813     \b
+814 814 Ket
+819     End
+------------------------------------------------------------------
+
+/(a(?1)b)/
+Memory allocation (code space): 32
+------------------------------------------------------------------
+  0  26 Bra
+  5  16 CBra 1
+ 12     a
+ 14   5 Recurse
+ 19     b
+ 21  16 Ket
+ 26  26 Ket
+ 31     End
+------------------------------------------------------------------
+
+/(a(?1)+b)/
+Memory allocation (code space): 42
+------------------------------------------------------------------
+  0  36 Bra
+  5  26 CBra 1
+ 12     a
+ 14  10 Once
+ 19   5 Recurse
+ 24  10 KetRmax
+ 29     b
+ 31  26 Ket
+ 36  36 Ket
+ 41     End
+------------------------------------------------------------------
+
+/a(?P<name1>b|c)d(?P<longername2>e)/
+Memory allocation (code space): 50
+------------------------------------------------------------------
+  0  44 Bra
+  5     a
+  7   9 CBra 1
+ 14     b
+ 16   7 Alt
+ 21     c
+ 23  16 Ket
+ 28     d
+ 30   9 CBra 2
+ 37     e
+ 39   9 Ket
+ 44  44 Ket
+ 49     End
+------------------------------------------------------------------
+
+/(?:a(?P<c>c(?P<d>d)))(?P<a>a)/
+Memory allocation (code space): 65
+------------------------------------------------------------------
+  0  59 Bra
+  5  35 Bra
+ 10     a
+ 12  23 CBra 1
+ 19     c
+ 21   9 CBra 2
+ 28     d
+ 30   9 Ket
+ 35  23 Ket
+ 40  35 Ket
+ 45   9 CBra 3
+ 52     a
+ 54   9 Ket
+ 59  59 Ket
+ 64     End
+------------------------------------------------------------------
+
+/(?P<a>a)...(?P=a)bbb(?P>a)d/
+Memory allocation (code space): 44
+------------------------------------------------------------------
+  0  38 Bra
+  5   9 CBra 1
+ 12     a
+ 14   9 Ket
+ 19     Any
+ 20     Any
+ 21     Any
+ 22     \1
+ 25     bbb
+ 31   5 Recurse
+ 36     d
+ 38  38 Ket
+ 43     End
+------------------------------------------------------------------
+
+/abc(?C255)de(?C)f/
+Memory allocation (code space): 43
+------------------------------------------------------------------
+  0  37 Bra
+  5     abc
+ 11     Callout 255 10 1
+ 21     de
+ 25     Callout 0 16 1
+ 35     f
+ 37  37 Ket
+ 42     End
+------------------------------------------------------------------
+
+/abcde/auto_callout
+Memory allocation (code space): 81
+------------------------------------------------------------------
+  0  75 Bra
+  5     Callout 255 0 1
+ 15     a
+ 17     Callout 255 1 1
+ 27     b
+ 29     Callout 255 2 1
+ 39     c
+ 41     Callout 255 3 1
+ 51     d
+ 53     Callout 255 4 1
+ 63     e
+ 65     Callout 255 5 0
+ 75  75 Ket
+ 80     End
+------------------------------------------------------------------
+
+/\x{100}/utf
+Memory allocation (code space): 14
+------------------------------------------------------------------
+  0   8 Bra
+  5     \x{100}
+  8   8 Ket
+ 13     End
+------------------------------------------------------------------
+
+/\x{1000}/utf
+Memory allocation (code space): 15
+------------------------------------------------------------------
+  0   9 Bra
+  5     \x{1000}
+  9   9 Ket
+ 14     End
+------------------------------------------------------------------
+
+/\x{10000}/utf
+Memory allocation (code space): 16
+------------------------------------------------------------------
+  0  10 Bra
+  5     \x{10000}
+ 10  10 Ket
+ 15     End
+------------------------------------------------------------------
+
+/\x{100000}/utf
+Memory allocation (code space): 16
+------------------------------------------------------------------
+  0  10 Bra
+  5     \x{100000}
+ 10  10 Ket
+ 15     End
+------------------------------------------------------------------
+
+/\x{10ffff}/utf
+Memory allocation (code space): 16
+------------------------------------------------------------------
+  0  10 Bra
+  5     \x{10ffff}
+ 10  10 Ket
+ 15     End
+------------------------------------------------------------------
+
+/\x{110000}/utf
+Failed: error 134 at offset 9: character code point value in \x{} or \o{} is too large
+
+/[\x{ff}]/utf
+Memory allocation (code space): 14
+------------------------------------------------------------------
+  0   8 Bra
+  5     \x{ff}
+  8   8 Ket
+ 13     End
+------------------------------------------------------------------
+
+/[\x{100}]/utf
+Memory allocation (code space): 14
+------------------------------------------------------------------
+  0   8 Bra
+  5     \x{100}
+  8   8 Ket
+ 13     End
+------------------------------------------------------------------
+
+/\x80/utf
+Memory allocation (code space): 14
+------------------------------------------------------------------
+  0   8 Bra
+  5     \x{80}
+  8   8 Ket
+ 13     End
+------------------------------------------------------------------
+
+/\xff/utf
+Memory allocation (code space): 14
+------------------------------------------------------------------
+  0   8 Bra
+  5     \x{ff}
+  8   8 Ket
+ 13     End
+------------------------------------------------------------------
+
+/\x{0041}\x{2262}\x{0391}\x{002e}/I,utf
+Memory allocation (code space): 22
+------------------------------------------------------------------
+  0  16 Bra
+  5     A\x{2262}\x{391}.
+ 16  16 Ket
+ 21     End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = 'A'
+Last code unit = '.'
+Subject length lower bound = 4
+
+/\x{D55c}\x{ad6d}\x{C5B4}/I,utf
+Memory allocation (code space): 23
+------------------------------------------------------------------
+  0  17 Bra
+  5     \x{d55c}\x{ad6d}\x{c5b4}
+ 17  17 Ket
+ 22     End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = \xed
+Last code unit = \xb4
+Subject length lower bound = 3
+
+/\x{65e5}\x{672c}\x{8a9e}/I,utf
+Memory allocation (code space): 23
+------------------------------------------------------------------
+  0  17 Bra
+  5     \x{65e5}\x{672c}\x{8a9e}
+ 17  17 Ket
+ 22     End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf
+First code unit = \xe6
+Last code unit = \x9e
+Subject length lower bound = 3
+
+/[\x{100}]/utf
+Memory allocation (code space): 14
+------------------------------------------------------------------
+  0   8 Bra
+  5     \x{100}
+  8   8 Ket
+ 13     End
+------------------------------------------------------------------
+
+/[Z\x{100}]/utf
+Memory allocation (code space): 53
+------------------------------------------------------------------
+  0  47 Bra
+  5     [Z\x{100}]
+ 47  47 Ket
+ 52     End
+------------------------------------------------------------------
+
+/^[\x{100}\E-\Q\E\x{150}]/utf
+Memory allocation (code space): 24
+------------------------------------------------------------------
+  0  18 Bra
+  5     ^
+  6     [\x{100}-\x{150}]
+ 18  18 Ket
+ 23     End
+------------------------------------------------------------------
+
+/^[\QĀ\E-\QŐ\E]/utf
+Memory allocation (code space): 24
+------------------------------------------------------------------
+  0  18 Bra
+  5     ^
+  6     [\x{100}-\x{150}]
+ 18  18 Ket
+ 23     End
+------------------------------------------------------------------
+
+/^[\QĀ\E-\QŐ\E/utf
+Failed: error 106 at offset 15: missing terminating ] for character class
+
+/[\p{L}]/
+Memory allocation (code space): 21
+------------------------------------------------------------------
+  0  15 Bra
+  5     [\p{L}]
+ 15  15 Ket
+ 20     End
+------------------------------------------------------------------
+
+/[\p{^L}]/
+Memory allocation (code space): 21
+------------------------------------------------------------------
+  0  15 Bra
+  5     [\P{L}]
+ 15  15 Ket
+ 20     End
+------------------------------------------------------------------
+
+/[\P{L}]/
+Memory allocation (code space): 21
+------------------------------------------------------------------
+  0  15 Bra
+  5     [\P{L}]
+ 15  15 Ket
+ 20     End
+------------------------------------------------------------------
+
+/[\P{^L}]/
+Memory allocation (code space): 21
+------------------------------------------------------------------
+  0  15 Bra
+  5     [\p{L}]
+ 15  15 Ket
+ 20     End
+------------------------------------------------------------------
+
+/[abc\p{L}\x{0660}]/utf
+Memory allocation (code space): 56
+------------------------------------------------------------------
+  0  50 Bra
+  5     [a-c\p{L}\x{660}]
+ 50  50 Ket
+ 55     End
+------------------------------------------------------------------
+
+/[\p{Nd}]/utf
+Memory allocation (code space): 21
+------------------------------------------------------------------
+  0  15 Bra
+  5     [\p{Nd}]
+ 15  15 Ket
+ 20     End
+------------------------------------------------------------------
+
+/[\p{Nd}+-]+/utf
+Memory allocation (code space): 54
+------------------------------------------------------------------
+  0  48 Bra
+  5     [+\-\p{Nd}]++
+ 48  48 Ket
+ 53     End
+------------------------------------------------------------------
+
+/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/i,utf
+Memory allocation (code space): 29
+------------------------------------------------------------------
+  0  23 Bra
+  5  /i A\x{391}\x{10427}\x{ff3a}\x{1fb0}
+ 23  23 Ket
+ 28     End
+------------------------------------------------------------------
+
+/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/utf
+Memory allocation (code space): 29
+------------------------------------------------------------------
+  0  23 Bra
+  5     A\x{391}\x{10427}\x{ff3a}\x{1fb0}
+ 23  23 Ket
+ 28     End
+------------------------------------------------------------------
+
+/[\x{105}-\x{109}]/i,utf
+Memory allocation (code space): 23
+------------------------------------------------------------------
+  0  17 Bra
+  5     [\x{104}-\x{109}]
+ 17  17 Ket
+ 22     End
+------------------------------------------------------------------
+
+/( ( (?(1)0|) )*   )/x
+Memory allocation (code space): 56
+------------------------------------------------------------------
+  0  50 Bra
+  5  40 CBra 1
+ 12     Brazero
+ 13  27 SCBra 2
+ 20  10 Cond
+ 25   1 Cond ref
+ 28     0
+ 30   5 Alt
+ 35  15 Ket
+ 40  27 KetRmax
+ 45  40 Ket
+ 50  50 Ket
+ 55     End
+------------------------------------------------------------------
+
+/(  (?(1)0|)*   )/x
+Memory allocation (code space): 44
+------------------------------------------------------------------
+  0  38 Bra
+  5  28 CBra 1
+ 12     Brazero
+ 13  10 SCond
+ 18   1 Cond ref
+ 21     0
+ 23   5 Alt
+ 28  15 KetRmax
+ 33  28 Ket
+ 38  38 Ket
+ 43     End
+------------------------------------------------------------------
+
+/[a]/
+Memory allocation (code space): 13
+------------------------------------------------------------------
+  0   7 Bra
+  5     a
+  7   7 Ket
+ 12     End
+------------------------------------------------------------------
+
+/[a]/utf
+Memory allocation (code space): 13
+------------------------------------------------------------------
+  0   7 Bra
+  5     a
+  7   7 Ket
+ 12     End
+------------------------------------------------------------------
+
+/[\xaa]/
+Memory allocation (code space): 13
+------------------------------------------------------------------
+  0   7 Bra
+  5     \x{aa}
+  7   7 Ket
+ 12     End
+------------------------------------------------------------------
+
+/[\xaa]/utf
+Memory allocation (code space): 14
+------------------------------------------------------------------
+  0   8 Bra
+  5     \x{aa}
+  8   8 Ket
+ 13     End
+------------------------------------------------------------------
+
+/[^a]/
+Memory allocation (code space): 13
+------------------------------------------------------------------
+  0   7 Bra
+  5     [^a]
+  7   7 Ket
+ 12     End
+------------------------------------------------------------------
+
+/[^a]/utf
+Memory allocation (code space): 13
+------------------------------------------------------------------
+  0   7 Bra
+  5     [^a]
+  7   7 Ket
+ 12     End
+------------------------------------------------------------------
+
+/[^\xaa]/
+Memory allocation (code space): 13
+------------------------------------------------------------------
+  0   7 Bra
+  5     [^\x{aa}]
+  7   7 Ket
+ 12     End
+------------------------------------------------------------------
+
+/[^\xaa]/utf
+Memory allocation (code space): 14
+------------------------------------------------------------------
+  0   8 Bra
+  5     [^\x{aa}]
+  8   8 Ket
+ 13     End
+------------------------------------------------------------------
+
+#pattern -memory
+
+/[^\d]/utf,ucp
+------------------------------------------------------------------
+  0  15 Bra
+  5     [^\p{Nd}]
+ 15  15 Ket
+ 20     End
+------------------------------------------------------------------
+
+/[[:^alpha:][:^cntrl:]]+/utf,ucp
+------------------------------------------------------------------
+  0  19 Bra
+  5     [\P{L}\P{Cc}]++
+ 19  19 Ket
+ 24     End
+------------------------------------------------------------------
+
+/[[:^cntrl:][:^alpha:]]+/utf,ucp
+------------------------------------------------------------------
+  0  19 Bra
+  5     [\P{Cc}\P{L}]++
+ 19  19 Ket
+ 24     End
+------------------------------------------------------------------
+
+/[[:alpha:]]+/utf,ucp
+------------------------------------------------------------------
+  0  16 Bra
+  5     [\p{L}]++
+ 16  16 Ket
+ 21     End
+------------------------------------------------------------------
+
+/[[:^alpha:]\S]+/utf,ucp
+------------------------------------------------------------------
+  0  19 Bra
+  5     [\P{L}\P{Xsp}]++
+ 19  19 Ket
+ 24     End
+------------------------------------------------------------------
+
+/abc(d|e)(*THEN)x(123(*THEN)4|567(b|q)(*THEN)xx)/
+------------------------------------------------------------------
+  0  93 Bra
+  5     abc
+ 11   9 CBra 1
+ 18     d
+ 20   7 Alt
+ 25     e
+ 27  16 Ket
+ 32     *THEN
+ 33     x
+ 35  16 CBra 2
+ 42     123
+ 48     *THEN
+ 49     4
+ 51  37 Alt
+ 56     567
+ 62   9 CBra 3
+ 69     b
+ 71   7 Alt
+ 76     q
+ 78  16 Ket
+ 83     *THEN
+ 84     xx
+ 88  53 Ket
+ 93  93 Ket
+ 98     End
+------------------------------------------------------------------
+
+/(((a\2)|(a*)\g<-1>))*a?/
+------------------------------------------------------------------
+  0  83 Bra
+  5     Brazero
+  6  70 SCBra 1
+ 13  58 Once
+ 18  24 CBra 2
+ 25  12 CBra 3
+ 32     a
+ 34     \2
+ 37  12 Ket
+ 42  24 Alt
+ 47   9 CBra 4
+ 54     a*
+ 56   9 Ket
+ 61  47 Recurse
+ 66  48 Ket
+ 71  58 Ket
+ 76  70 KetRmax
+ 81     a?+
+ 83  83 Ket
+ 88     End
+------------------------------------------------------------------
+
+/((?+1)(\1))/
+------------------------------------------------------------------
+  0  47 Bra
+  5  37 Once
+ 10  27 CBra 1
+ 17  22 Recurse
+ 22  10 CBra 2
+ 29     \1
+ 32  10 Ket
+ 37  27 Ket
+ 42  37 Ket
+ 47  47 Ket
+ 52     End
+------------------------------------------------------------------
+
+"(?1)(?#?'){2}(a)"
+------------------------------------------------------------------
+  0  49 Bra
+  5  10 Once
+ 10  35 Recurse
+ 15  10 Ket
+ 20  10 Once
+ 25  35 Recurse
+ 30  10 Ket
+ 35   9 CBra 1
+ 42     a
+ 44   9 Ket
+ 49  49 Ket
+ 54     End
+------------------------------------------------------------------
+
+/.((?2)(?R)|\1|$)()/
+------------------------------------------------------------------
+  0  64 Bra
+  5     Any
+  6  41 Once
+ 11  17 CBra 1
+ 18  52 Recurse
+ 23   0 Recurse
+ 28   8 Alt
+ 33     \1
+ 36   6 Alt
+ 41     $
+ 42  31 Ket
+ 47  41 Ket
+ 52   7 CBra 2
+ 59   7 Ket
+ 64  64 Ket
+ 69     End
+------------------------------------------------------------------
+
+/.((?3)(?R)()(?2)|\1|$)()/
+------------------------------------------------------------------
+  0  81 Bra
+  5     Any
+  6  58 Once
+ 11  34 CBra 1
+ 18  69 Recurse
+ 23   0 Recurse
+ 28   7 CBra 2
+ 35   7 Ket
+ 40  28 Recurse
+ 45   8 Alt
+ 50     \1
+ 53   6 Alt
+ 58     $
+ 59  48 Ket
+ 64  58 Ket
+ 69   7 CBra 3
+ 76   7 Ket
+ 81  81 Ket
+ 86     End
+------------------------------------------------------------------
+
+/(?1)()((((((\1++))\x85)+)|))/
+------------------------------------------------------------------
+  0 115 Bra
+  5  10 Recurse
+ 10   7 CBra 1
+ 17   7 Ket
+ 22  88 CBra 2
+ 29  71 CBra 3
+ 36  59 CBra 4
+ 43  47 CBra 5
+ 50  33 CBra 6
+ 57  21 CBra 7
+ 64   9 Once
+ 69     \1+
+ 73   9 Ket
+ 78  21 Ket
+ 83  33 Ket
+ 88     \x{85}
+ 90  47 KetRmax
+ 95  59 Ket
+100   5 Alt
+105  76 Ket
+110  88 Ket
+115 115 Ket
+120     End
+------------------------------------------------------------------
+
+# Check the absolute limit on nesting (?| etc. This varies with code unit
+# width because the workspace is a different number of bytes. It will fail
+# with link size 2 in 8-bit and 16-bit but not in 32-bit.
+
+/(?|(?|(?J:(?|(?x:(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|(?|
+)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
+/parens_nest_limit=1000,-fullbincode
+
+# Use "expand" to create some very long patterns with nested parentheses, in
+# order to test workspace overflow. Again, this varies with code unit width,
+# and even with it fails in two modes, the error offset differs. It also varies
+# with link size - hence multiple tests with different values.
+
+/(?'ABC'\[[bar](]{105}*THEN:\[A]{255}\[)]{106}/expand,-fullbincode
+
+/(?'ABC'\[[bar](]{106}*THEN:\[A]{255}\[)]{107}/expand,-fullbincode
+
+/(?'ABC'\[[bar](]{159}*THEN:\[A]{255}\[)]{160}/expand,-fullbincode
+
+/(?'ABC'\[[bar](]{199}*THEN:\[A]{255}\[)]{200}/expand,-fullbincode
+
+/(?'ABC'\[[bar](]{299}*THEN:\[A]{255}\[)]{300}/expand,-fullbincode
+Failed: error 186 at offset 1224: regular expression is too complicated
+
+/(?(1)(?1)){8,}+()/debug
+------------------------------------------------------------------
+  0 181 Bra
+  5 159 Once
+ 10  13 Cond
+ 15   1 Cond ref
+ 18 169 Recurse
+ 23  13 Ket
+ 28  13 Cond
+ 33   1 Cond ref
+ 36 169 Recurse
+ 41  13 Ket
+ 46  13 Cond
+ 51   1 Cond ref
+ 54 169 Recurse
+ 59  13 Ket
+ 64  13 Cond
+ 69   1 Cond ref
+ 72 169 Recurse
+ 77  13 Ket
+ 82  13 Cond
+ 87   1 Cond ref
+ 90 169 Recurse
+ 95  13 Ket
+100  13 Cond
+105   1 Cond ref
+108 169 Recurse
+113  13 Ket
+118  13 Cond
+123   1 Cond ref
+126 169 Recurse
+131  13 Ket
+136  23 SBraPos
+141  13 SCond
+146   1 Cond ref
+149 169 Recurse
+154  13 Ket
+159  23 KetRpos
+164 159 Ket
+169   7 CBra 1
+176   7 Ket
+181 181 Ket
+186     End
+------------------------------------------------------------------
+Capturing subpattern count = 1
+Max back reference = 1
+May match empty string
+Subject length lower bound = 0
+    abcd
+ 0: 
+ 1: 
+
+/(?(1)|a(?1)b){2,}+()/debug
+------------------------------------------------------------------
+  0  91 Bra
+  5  69 Once
+ 10   8 Cond
+ 15   1 Cond ref
+ 18  14 Alt
+ 23     a
+ 25  79 Recurse
+ 30     b
+ 32  22 Ket
+ 37  32 SBraPos
+ 42   8 SCond
+ 47   1 Cond ref
+ 50  14 Alt
+ 55     a
+ 57  79 Recurse
+ 62     b
+ 64  22 Ket
+ 69  32 KetRpos
+ 74  69 Ket
+ 79   7 CBra 1
+ 86   7 Ket
+ 91  91 Ket
+ 96     End
+------------------------------------------------------------------
+Capturing subpattern count = 1
+Max back reference = 1
+May match empty string
+Subject length lower bound = 0
+    abcde
+No match
+
+/((?1)(?2)(?3)(?4)(?5)(?6)(?7)(?8)(?9)(?9)(?8)(?7)(?6)(?5)(?4)(?3)(?2)(?1)(?0)){2,}()()()()()()()()()/debug
+------------------------------------------------------------------
+  0 327 Bra
+  5 102 CBra 1
+ 12   5 Recurse
+ 17 219 Recurse
+ 22 231 Recurse
+ 27 243 Recurse
+ 32 255 Recurse
+ 37 267 Recurse
+ 42 279 Recurse
+ 47 291 Recurse
+ 52 303 Recurse
+ 57 303 Recurse
+ 62 291 Recurse
+ 67 279 Recurse
+ 72 267 Recurse
+ 77 255 Recurse
+ 82 243 Recurse
+ 87 231 Recurse
+ 92 219 Recurse
+ 97   5 Recurse
+102   0 Recurse
+107 102 Ket
+112 102 SCBra 1
+119   5 Recurse
+124 219 Recurse
+129 231 Recurse
+134 243 Recurse
+139 255 Recurse
+144 267 Recurse
+149 279 Recurse
+154 291 Recurse
+159 303 Recurse
+164 303 Recurse
+169 291 Recurse
+174 279 Recurse
+179 267 Recurse
+184 255 Recurse
+189 243 Recurse
+194 231 Recurse
+199 219 Recurse
+204   5 Recurse
+209   0 Recurse
+214 102 KetRmax
+219   7 CBra 2
+226   7 Ket
+231   7 CBra 3
+238   7 Ket
+243   7 CBra 4
+250   7 Ket
+255   7 CBra 5
+262   7 Ket
+267   7 CBra 6
+274   7 Ket
+279   7 CBra 7
+286   7 Ket
+291   7 CBra 8
+298   7 Ket
+303   7 CBra 9
+310   7 Ket
+315   7 CBra 10
+322   7 Ket
+327 327 Ket
+332     End
+------------------------------------------------------------------
+Capturing subpattern count = 10
+May match empty string
+Subject length lower bound = 0
+
+# End of testinput8
diff --git a/dist/testdata/testoutput14 b/dist2/testdata/testoutput9
similarity index 73%
rename from dist/testdata/testoutput14
rename to dist2/testdata/testoutput9
index 020f51e..750a7e0 100644
--- a/dist/testdata/testoutput14
+++ b/dist2/testdata/testoutput9
@@ -1,165 +1,25 @@
-/-- This set of tests is run only with the 8-bit library. They do not require 
-    UTF-8 or Unicode property support. The file starts with all the tests of
-    the POSIX interface, because that is supported only with the 8-bit library.
-    --/
+# This set of tests is run only with the 8-bit library. They must not require 
+# UTF-8 or Unicode property support. */
     
-< forbid 8W 
+#forbid_utf
+#newline_default lf any anycrlf
 
-/abc/P
-    abc
- 0: abc
-    *** Failers
-No match: POSIX code 17: match failed
-
-/^abc|def/P
-    abcdef
- 0: abc
-    abcdef\B
- 0: def
-
-/.*((abc)$|(def))/P
-    defabc
- 0: defabc
- 1: abc
- 2: abc
-    \Zdefabc
- 0: def
- 1: def
- 3: def
-
-/the quick brown fox/P
-    the quick brown fox
- 0: the quick brown fox
-    *** Failers
-No match: POSIX code 17: match failed
-    The Quick Brown Fox
-No match: POSIX code 17: match failed
-
-/the quick brown fox/Pi
-    the quick brown fox
- 0: the quick brown fox
-    The Quick Brown Fox
- 0: The Quick Brown Fox
-
-/abc.def/P
-    *** Failers
-No match: POSIX code 17: match failed
-    abc\ndef
-No match: POSIX code 17: match failed
-
-/abc$/P
-    abc
- 0: abc
-    abc\n
- 0: abc
-
-/(abc)\2/P
-Failed: POSIX code 15: bad back reference at offset 7     
-
-/(abc\1)/P
-    abc
-No match: POSIX code 17: match failed
-
-/a*(b+)(z)(z)/P
-    aaaabbbbzzzz
- 0: aaaabbbbzz
- 1: bbbb
- 2: z
- 3: z
-    aaaabbbbzzzz\O0
-    aaaabbbbzzzz\O1
- 0: aaaabbbbzz
-    aaaabbbbzzzz\O2
- 0: aaaabbbbzz
- 1: bbbb
-    aaaabbbbzzzz\O3
- 0: aaaabbbbzz
- 1: bbbb
- 2: z
-    aaaabbbbzzzz\O4
- 0: aaaabbbbzz
- 1: bbbb
- 2: z
- 3: z
-    aaaabbbbzzzz\O5
- 0: aaaabbbbzz
- 1: bbbb
- 2: z
- 3: z
-
-/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
-
-/a(b)c/PN
-    abc
-Matched with REG_NOSUB
-
-/a(?P<name>b)c/PN
-    abc
-Matched with REG_NOSUB
-
-/a?|b?/P
-    abc
- 0: a
-    ** Failers
- 0: 
-    ddd\N   
-No match: POSIX code 17: match failed
-
-/\w+A/P
-   CDAAAAB 
- 0: CDAAAA
-
-/\w+A/PU
-   CDAAAAB 
- 0: CDA
-   
-/\Biss\B/I+P
-    Mississippi
- 0: iss
- 0+ issippi
-
-/abc/\P
-Failed: POSIX code 9: bad escape sequence at offset 4     
-
-/-- End of POSIX tests --/ 
-
-/a\Cb/
-    aXb
- 0: aXb
-    a\nb
- 0: a\x0ab
-    ** Failers (too big char) 
-No match
-    A\x{123}B 
+/ab/
+\= Expect error message (too big char) and no match
+    A\x{123}B
 ** Character \x{123} is greater than 255 and UTF-8 mode is not enabled.
 ** Truncation will probably give the wrong result.
 No match
-    A\o{443}B 
+    A\o{443}B
 ** Character \x{123} is greater than 255 and UTF-8 mode is not enabled.
 ** Truncation will probably give the wrong result.
 No match
   
 /\x{100}/I
-Failed: character value in \x{} or \o{} is too large at offset 6
+Failed: error 134 at offset 6: character code point value in \x{} or \o{} is too large
 
 /\o{400}/I
-Failed: character value in \x{} or \o{} is too large at offset 6
+Failed: error 134 at offset 6: character code point value in \x{} or \o{} is too large
 
 /  (?: [\040\t] |  \(
 (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
@@ -354,75 +214,39 @@
 )  (?: [\040\t] |  \(
 (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
 \)  )*                       # optional trailing comment
-/xSI
+/Ix
 Capturing subpattern count = 0
 Contains explicit CR or LF match
 Options: extended
-No first char
-No need char
-Subject length lower bound = 3
-Starting chars: \x09 \x20 ! " # $ % & ' ( * + - / 0 1 2 3 4 5 6 7 8 
+Starting code units: \x09 \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 ^ _ ` 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 { | } ~ \x7f 
+Subject length lower bound = 3
 
-/-- Although this saved pattern was compiled with link-size=2, it does no harm
-to run this test with other link sizes because it is going to generated a
-"compiled in wrong mode" error as soon as it is loaded, so the link size does 
-not matter. --/
-
-<!testsaved16
-Compiled pattern loaded from testsaved16
-No study data
-Error -28 from pcre_fullinfo(0)
-Running in 8-bit mode but pattern was compiled in 16-bit mode
-
-<!testsaved32
-Compiled pattern loaded from testsaved32
-No study data
-Error -28 from pcre_fullinfo(0)
-Running in 8-bit mode but pattern was compiled in 32-bit mode
-
-/\h/SI
+/\h/I
 Capturing subpattern count = 0
-No options
-No first char
-No need char
+Starting code units: \x09 \x20 \xa0 
 Subject length lower bound = 1
-Starting chars: \x09 \x20 \xa0 
 
-/\H/SI
+/\H/I
 Capturing subpattern count = 0
-No options
-No first char
-No need char
 Subject length lower bound = 1
-No starting char list
 
-/\v/SI
+/\v/I
 Capturing subpattern count = 0
-No options
-No first char
-No need char
+Starting code units: \x0a \x0b \x0c \x0d \x85 
 Subject length lower bound = 1
-Starting chars: \x0a \x0b \x0c \x0d \x85 
 
-/\V/SI
+/\V/I
 Capturing subpattern count = 0
-No options
-No first char
-No need char
 Subject length lower bound = 1
-No starting char list
 
-/\R/SI
+/\R/I
 Capturing subpattern count = 0
-No options
-No first char
-No need char
+Starting code units: \x0a \x0b \x0c \x0d \x85 
 Subject length lower bound = 1
-Starting chars: \x0a \x0b \x0c \x0d \x85 
 
-/[\h]/BZ
+/[\h]/B
 ------------------------------------------------------------------
         Bra
         [\x09 \xa0]
@@ -432,7 +256,7 @@
     >\x09<
  0: \x09
 
-/[\h]+/BZ
+/[\h]+/B
 ------------------------------------------------------------------
         Bra
         [\x09 \xa0]++
@@ -442,7 +266,7 @@
     >\x09\x20\xa0<
  0: \x09 \xa0
 
-/[\v]/BZ
+/[\v]/B
 ------------------------------------------------------------------
         Bra
         [\x0a-\x0d\x85]
@@ -450,7 +274,7 @@
         End
 ------------------------------------------------------------------
 
-/[\H]/BZ
+/[\H]/B
 ------------------------------------------------------------------
         Bra
         [\x00-\x08\x0a-\x1f!-\x9f\xa1-\xff]
@@ -458,7 +282,7 @@
         End
 ------------------------------------------------------------------
 
-/[^\h]/BZ
+/[^\h]/B
 ------------------------------------------------------------------
         Bra
         [\x00-\x08\x0a-\x1f!-\x9f\xa1-\xff] (neg)
@@ -466,7 +290,7 @@
         End
 ------------------------------------------------------------------
 
-/[\V]/BZ
+/[\V]/B
 ------------------------------------------------------------------
         Bra
         [\x00-\x09\x0e-\x84\x86-\xff]
@@ -474,7 +298,7 @@
         End
 ------------------------------------------------------------------
 
-/[\x0a\V]/BZ
+/[\x0a\V]/B
 ------------------------------------------------------------------
         Bra
         [\x00-\x0a\x0e-\x84\x86-\xff]
@@ -483,23 +307,33 @@
 ------------------------------------------------------------------
 
 /\777/I
-Failed: octal value is greater than \377 in 8-bit non-UTF-8 mode at offset 3
+Failed: error 151 at offset 3: octal value is greater than \377 in 8-bit non-UTF-8 mode
 
-/(*:0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF)XX/K
-Failed: name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN) at offset 259
-
-/(*:0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDE)XX/K
+/(*:0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF)XX/mark
+Failed: error 176 at offset 259: name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)
+    XX
+     
+/(*:0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF)XX/mark,alt_verbnames
+Failed: error 176 at offset 258: name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)
+    XX
+     
+/(*:0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDE)XX/mark
     XX
  0: XX
 MK: 0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDE
 
-/\u0100/<JS>
-Failed: character value in \u.... sequence is too large at offset 5
+/(*:0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDE)XX/mark,alt_verbnames
+    XX
+ 0: XX
+MK: 0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDE
 
-/[\u0100-\u0200]/<JS>
-Failed: character value in \u.... sequence is too large at offset 6
+/\u0100/alt_bsux,allow_empty_class,match_unset_backref,dupnames
+Failed: error 177 at offset 5: character code point value in \u.... sequence is too large
 
-/[^\x00-a]{12,}[^b-\xff]*/BZ
+/[\u0100-\u0200]/alt_bsux,allow_empty_class,match_unset_backref,dupnames
+Failed: error 177 at offset 6: character code point value in \u.... sequence is too large
+
+/[^\x00-a]{12,}[^b-\xff]*/B
 ------------------------------------------------------------------
         Bra
         [b-\xff] (neg){12,}+
@@ -508,7 +342,7 @@
         End
 ------------------------------------------------------------------
 
-/[^\s]*\s* [^\W]+\W+ [^\d]*?\d0 [^\d\w]{4,6}?\w*A/BZ
+/[^\s]*\s* [^\W]+\W+ [^\d]*?\d0 [^\d\w]{4,6}?\w*A/B
 ------------------------------------------------------------------
         Bra
         [\x00-\x08\x0e-\x1f!-\xff] (neg)*+
@@ -527,6 +361,7 @@
         End
 ------------------------------------------------------------------
 
-/(?'ABC'[bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar](*THEN:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))/
+/(*MARK:a\x{100}b)z/alt_verbnames 
+Failed: error 134 at offset 14: character code point value in \x{} or \o{} is too large
 
-/-- End of testinput14 --/
+# End of testinput9
diff --git a/dist2/testdata/testoutputEBC b/dist2/testdata/testoutputEBC
new file mode 100644
index 0000000..03e179a
--- /dev/null
+++ b/dist2/testdata/testoutputEBC
@@ -0,0 +1,205 @@
+# This is a specialized test for checking, when PCRE2 is compiled with the
+# EBCDIC option but in an ASCII environment, that newline, white space, and \c
+# functionality is working. It catches cases where explicit values such as 0x0a
+# have been used instead of names like CHAR_LF. Needless to say, it is not a
+# genuine EBCDIC test! In patterns, alphabetic characters that follow a
+# backslash must be in EBCDIC code. In data, NL, NEL, LF, ESC, and DEL must be
+# in EBCDIC, but can of course be specified as escapes.
+
+# Test default newline and variations
+
+/^A/m
+    ABC
+ 0: A
+    12\x15ABC
+ 0: A
+
+/^A/m,newline=any
+    12\x15ABC
+ 0: A
+    12\x0dABC
+ 0: A
+    12\x0d\x15ABC
+ 0: A
+    12\x25ABC
+ 0: A
+
+/^A/m,newline=anycrlf
+    12\x15ABC
+ 0: A
+    12\x0dABC
+ 0: A
+    12\x0d\x15ABC
+ 0: A
+    ** Fail
+No match
+    12\x25ABC
+No match
+
+# Test \h
+
+/^A\ˆ/
+    A B
+ 0: A\x20
+    A\x41B 
+ 0: AA
+
+# Test \H
+
+/^A\È/
+    AB
+ 0: AB
+    A\x42B 
+ 0: AB
+    ** Fail
+No match
+    A B
+No match
+    A\x41B 
+No match
+
+# Test \R
+
+/^A\Ù/
+    A\x15B
+ 0: A\x15
+    A\x0dB
+ 0: A\x0d
+    A\x25B
+ 0: A\x25
+    A\x0bB
+ 0: A\x0b
+    A\x0cB
+ 0: A\x0c
+    ** Fail
+No match
+    A B
+No match
+
+# Test \v
+
+/^A\¥/
+    A\x15B
+ 0: A\x15
+    A\x0dB
+ 0: A\x0d
+    A\x25B
+ 0: A\x25
+    A\x0bB
+ 0: A\x0b
+    A\x0cB
+ 0: A\x0c
+    ** Fail
+No match
+    A B
+No match
+
+# Test \V
+
+/^A\å/
+    A B
+ 0: A\x20
+    ** Fail
+No match
+    A\x15B
+No match
+    A\x0dB
+No match
+    A\x25B
+No match
+    A\x0bB
+No match
+    A\x0cB
+No match
+    
+# For repeated items, use an atomic group so that the output is the same
+# for DFA matching (otherwise it may show multiple matches).
+
+# Test \h+
+
+/^A(?>\ˆ+)/
+    A B
+ 0: A\x20
+
+# Test \H+
+
+/^A(?>\È+)/
+    AB
+ 0: AB
+    ** Fail
+No match
+    A B
+No match
+
+# Test \R+
+
+/^A(?>\Ù+)/
+    A\x15B
+ 0: A\x15
+    A\x0dB
+ 0: A\x0d
+    A\x25B
+ 0: A\x25
+    A\x0bB
+ 0: A\x0b
+    A\x0cB
+ 0: A\x0c
+    ** Fail
+No match
+    A B
+No match
+
+# Test \v+
+
+/^A(?>\¥+)/
+    A\x15B
+ 0: A\x15
+    A\x0dB
+ 0: A\x0d
+    A\x25B
+ 0: A\x25
+    A\x0bB
+ 0: A\x0b
+    A\x0cB
+ 0: A\x0c
+    ** Fail
+No match
+    A B
+No match
+
+# Test \V+
+
+/^A(?>\å+)/
+    A B
+ 0: A\x20B
+    ** Fail
+No match
+    A\x15B
+No match
+    A\x0dB
+No match
+    A\x25B
+No match
+    A\x0bB
+No match
+    A\x0cB
+No match
+    
+# Test \c functionality 
+    
+/\ƒ@\ƒ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/
+    \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
+ 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
+
+/\ƒ[\ƒ\\ƒ]\ƒ^\ƒ_/
+    \x18\x19\x1a\x1b\x1c\x1d\x1e\x1f
+ 0: \x1b\x1c\x1d\x1e\x1f
+    
+/\ƒ?/
+    A\xffB
+ 0: \xff
+
+/\ƒ&/
+Failed: error 168 at offset 2: \c\x20must\x20be\x20followed\x20by\x20a\x20letter\x20or\x20one\x20of\x20[\]^_\x3f
+
+# End
diff --git a/dist2/testdata/valgrind-jit.supp b/dist2/testdata/valgrind-jit.supp
new file mode 100644
index 0000000..73e87d2
--- /dev/null
+++ b/dist2/testdata/valgrind-jit.supp
@@ -0,0 +1,7 @@
+{
+   name
+   Memcheck:Addr16
+   obj:*
+   obj:*
+   obj:*
+}
diff --git a/dist2/testdata/wintestinput3 b/dist2/testdata/wintestinput3
new file mode 100644
index 0000000..8d8017a
--- /dev/null
+++ b/dist2/testdata/wintestinput3
@@ -0,0 +1,104 @@
+# This set of tests checks local-specific features, using the "fr_FR" locale. 
+# It is not Perl-compatible. When run via RunTest, the locale is edited to
+# be whichever of "fr_FR", "french", or "fr" is found to exist. There is
+# different version of this file called wintestinput3 for use on Windows,
+# where the locale is called "french" and the tests are run using
+# RunTest.bat. 
+
+#forbid_utf
+
+/^[\w]+/
+    *** Failers
+    École
+
+/^[\w]+/locale=french
+    École
+
+/^[\w]+/
+    *** Failers
+    École
+
+/^[\W]+/
+    École
+
+/^[\W]+/locale=french
+    *** Failers
+    École
+
+/[\b]/
+    \b
+    *** Failers
+    a
+
+/[\b]/locale=french
+    \b
+    *** Failers
+    a
+
+/^\w+/
+    *** Failers
+    École
+
+/^\w+/locale=french
+    École
+
+/(.+)\b(.+)/
+    École
+
+/(.+)\b(.+)/locale=french
+    *** Failers
+    École
+
+/École/i
+    École
+    *** Failers
+    école
+
+/École/i,locale=french
+    École
+    école
+
+/\w/I
+
+/\w/I,locale=french
+
+# All remaining tests are in the french locale, so set the default.
+
+#pattern locale=french
+
+/^[\xc8-\xc9]/i
+    École
+    école
+
+/^[\xc8-\xc9]/
+    École
+    *** Failers 
+    école
+
+/\W+/
+    >>>\xaa<<<
+    >>>\xba<<< 
+
+/[\W]+/
+    >>>\xaa<<<
+    >>>\xba<<< 
+
+/[^[:alpha:]]+/
+    >>>\xaa<<<
+    >>>\xba<<< 
+
+/\w+/
+    >>>\xaa<<<
+    >>>\xba<<< 
+
+/[\w]+/
+    >>>\xaa<<<
+    >>>\xba<<< 
+
+/[[:alpha:]]+/
+    >>>\xaa<<<
+    >>>\xba<<< 
+    
+/[[:alpha:]][[:lower:]][[:upper:]]/IB
+
+# End of testinput3 
diff --git a/dist2/testdata/wintestoutput3 b/dist2/testdata/wintestoutput3
new file mode 100644
index 0000000..0d8a690
--- /dev/null
+++ b/dist2/testdata/wintestoutput3
@@ -0,0 +1,175 @@
+# This set of tests checks local-specific features, using the "fr_FR" locale. 
+# It is not Perl-compatible. When run via RunTest, the locale is edited to
+# be whichever of "fr_FR", "french", or "fr" is found to exist. There is
+# different version of this file called wintestinput3 for use on Windows,
+# where the locale is called "french" and the tests are run using
+# RunTest.bat. 
+
+#forbid_utf
+
+/^[\w]+/
+    *** Failers
+No match
+    École
+No match
+
+/^[\w]+/locale=french
+    École
+ 0: École
+
+/^[\w]+/
+    *** Failers
+No match
+    École
+No match
+
+/^[\W]+/
+    École
+ 0: \xc9
+
+/^[\W]+/locale=french
+    *** Failers
+ 0: *** 
+    École
+No match
+
+/[\b]/
+    \b
+ 0: \x08
+    *** Failers
+No match
+    a
+No match
+
+/[\b]/locale=french
+    \b
+ 0: \x08
+    *** Failers
+No match
+    a
+No match
+
+/^\w+/
+    *** Failers
+No match
+    École
+No match
+
+/^\w+/locale=french
+    École
+ 0: École
+
+/(.+)\b(.+)/
+    École
+ 0: \xc9cole
+ 1: \xc9
+ 2: cole
+
+/(.+)\b(.+)/locale=french
+    *** Failers
+ 0: *** Failers
+ 1: *** 
+ 2: Failers
+    École
+No match
+
+/École/i
+    École
+ 0: \xc9cole
+    *** Failers
+No match
+    école
+No match
+
+/École/i,locale=french
+    École
+ 0: École
+    école
+ 0: école
+
+/\w/I
+Capturing subpattern count = 0
+Starting code units: 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 
+Subject length lower bound = 1
+
+/\w/I,locale=french
+Capturing subpattern count = 0
+Starting code units: 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 
+  ƒ Š Œ Ž š œ ž Ÿ ª ² ³ µ ¹ º À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö 
+  Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ø ù ú û ü ý 
+  þ ÿ 
+Subject length lower bound = 1
+
+# All remaining tests are in the french locale, so set the default.
+
+#pattern locale=french
+
+/^[\xc8-\xc9]/i
+    École
+ 0: É
+    école
+ 0: é
+
+/^[\xc8-\xc9]/
+    École
+ 0: É
+    *** Failers 
+No match
+    école
+No match
+
+/\W+/
+    >>>\xaa<<<
+ 0: >>>
+    >>>\xba<<< 
+ 0: >>>
+
+/[\W]+/
+    >>>\xaa<<<
+ 0: >>>
+    >>>\xba<<< 
+ 0: >>>
+
+/[^[:alpha:]]+/
+    >>>\xaa<<<
+ 0: >>>
+    >>>\xba<<< 
+ 0: >>>
+
+/\w+/
+    >>>\xaa<<<
+ 0: ª
+    >>>\xba<<< 
+ 0: º
+
+/[\w]+/
+    >>>\xaa<<<
+ 0: ª
+    >>>\xba<<< 
+ 0: º
+
+/[[:alpha:]]+/
+    >>>\xaa<<<
+ 0: ª
+    >>>\xba<<< 
+ 0: º
+    
+/[[:alpha:]][[:lower:]][[:upper:]]/IB
+------------------------------------------------------------------
+        Bra
+        [A-Za-z\x83\x8a\x8c\x8e\x9a\x9c\x9e\x9f\xaa\xb2\xb3\xb5\xb9\xba\xc0-\xd6\xd8-\xf6\xf8-\xff]
+        [a-z\x83\x9a\x9c\x9e\xaa\xb5\xba\xdf-\xf6\xf8-\xff]
+        [A-Z\x8a\x8c\x8e\x9f\xc0-\xd6\xd8-\xde]
+        Ket
+        End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Starting code units: 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 ƒ Š Œ Ž š œ ž Ÿ ª ² ³ 
+  µ ¹ º À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö Ø Ù Ú Û Ü Ý Þ ß à á â 
+  ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ø ù ú û ü ý þ ÿ 
+Subject length lower bound = 3
+
+# End of testinput3 
diff --git a/include/pcre2.h b/include/pcre2.h
new file mode 100644
index 0000000..cecf6ba
--- /dev/null
+++ b/include/pcre2.h
@@ -0,0 +1,10 @@
+
+#ifndef _INCLUDE_PCRE2_H_
+#define _INCLUDE_PCRE2_H_
+
+#define PCRE2_CODE_UNIT_WIDTH 8
+
+#include "../dist2/src/pcre2.h.generic"
+
+
+#endif // _INCLUDE_PCRE2_H_
diff --git a/include_internal/config.h b/include_internal/config.h
new file mode 100644
index 0000000..5c52b8a
--- /dev/null
+++ b/include_internal/config.h
@@ -0,0 +1,306 @@
+/* src/config.h.  Generated from config.h.in by configure.  */
+/* src/config.h.in.  Generated from configure.ac by autoheader.  */
+
+/* PCRE2 is written in Standard C, but there are a few non-standard things it
+can cope with, allowing it to run on SunOS4 and other "close to standard"
+systems.
+
+In environments that support the GNU autotools, config.h.in is converted into
+config.h by the "configure" script. In environments that use CMake,
+config-cmake.in is converted into config.h. If you are going to build PCRE2 "by
+hand" without using "configure" or CMake, you should copy the distributed
+config.h.generic to config.h, and edit the macro definitions to be the way you
+need them. You must then add -DHAVE_CONFIG_H to all of your compile commands,
+so that config.h is included at the start of every source.
+
+Alternatively, you can avoid editing by using -D on the compiler command line
+to set the macro values. In this case, you do not have to set -DHAVE_CONFIG_H,
+but if you do, default values will be taken from config.h for non-boolean
+macros that are not defined on the command line.
+
+Boolean macros such as HAVE_STDLIB_H and SUPPORT_PCRE2_8 should either be defined
+(conventionally to 1) for TRUE, and not defined at all for FALSE. All such
+macros are listed as a commented #undef in config.h.generic. Macros such as
+MATCH_LIMIT, whose actual value is relevant, have defaults defined, but are
+surrounded by #ifndef/#endif lines so that the value can be overridden by -D.
+
+PCRE2 uses memmove() if HAVE_MEMMOVE is defined; otherwise it uses bcopy() if
+HAVE_BCOPY is defined. If your system has neither bcopy() nor memmove(), make
+sure both macros are undefined; an emulation function will then be used. */
+
+/* By default, the \R escape sequence matches any Unicode line ending
+   character or sequence of characters. If BSR_ANYCRLF is defined (to any
+   value), this is changed so that backslash-R matches only CR, LF, or CRLF.
+   The build-time default can be overridden by the user of PCRE2 at runtime.
+   */
+/* #undef BSR_ANYCRLF */
+
+/* If you are compiling for a system that uses EBCDIC instead of ASCII
+   character codes, define this macro to any value. When EBCDIC is set, PCRE2
+   assumes that all input strings are in EBCDIC. If you do not define this
+   macro, PCRE2 will assume input strings are ASCII or UTF-8/16/32 Unicode. It
+   is not possible to build a version of PCRE2 that supports both EBCDIC and
+   UTF-8/16/32. */
+/* #undef EBCDIC */
+
+/* In an EBCDIC environment, define this macro to any value to arrange for the
+   NL character to be 0x25 instead of the default 0x15. NL plays the role that
+   LF does in an ASCII/Unicode environment. */
+/* #undef EBCDIC_NL25 */
+
+/* Define to 1 if you have the `bcopy' function. */
+#define HAVE_BCOPY 1
+
+/* Define to 1 if you have the <bzlib.h> header file. */
+/* #undef HAVE_BZLIB_H */
+
+/* Define to 1 if you have the <dirent.h> header file. */
+#define HAVE_DIRENT_H 1
+
+/* Define to 1 if you have the <dlfcn.h> header file. */
+#define HAVE_DLFCN_H 1
+
+/* Define to 1 if you have the <editline/readline.h> header file. */
+/* #undef HAVE_EDITLINE_READLINE_H */
+
+/* Define to 1 if you have the <edit/readline/readline.h> header file. */
+/* #undef HAVE_EDIT_READLINE_READLINE_H */
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#define HAVE_INTTYPES_H 1
+
+/* Define to 1 if you have the <limits.h> header file. */
+#define HAVE_LIMITS_H 1
+
+/* Define to 1 if you have the `memmove' function. */
+#define HAVE_MEMMOVE 1
+
+/* Define to 1 if you have the <memory.h> header file. */
+#define HAVE_MEMORY_H 1
+
+/* Define if you have POSIX threads libraries and header files. */
+/* #undef HAVE_PTHREAD */
+
+/* Have PTHREAD_PRIO_INHERIT. */
+/* #undef HAVE_PTHREAD_PRIO_INHERIT */
+
+/* Define to 1 if you have the <readline/history.h> header file. */
+/* #undef HAVE_READLINE_HISTORY_H */
+
+/* Define to 1 if you have the <readline/readline.h> header file. */
+/* #undef HAVE_READLINE_READLINE_H */
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#define HAVE_STDINT_H 1
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#define HAVE_STDLIB_H 1
+
+/* Define to 1 if you have the `strerror' function. */
+#define HAVE_STRERROR 1
+
+/* Define to 1 if you have the <strings.h> header file. */
+#define HAVE_STRINGS_H 1
+
+/* Define to 1 if you have the <string.h> header file. */
+#define HAVE_STRING_H 1
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#define HAVE_SYS_STAT_H 1
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#define HAVE_SYS_TYPES_H 1
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#define HAVE_UNISTD_H 1
+
+/* Define to 1 if the compiler supports simple visibility declarations. */
+#define HAVE_VISIBILITY 1
+
+/* Define to 1 if you have the <windows.h> header file. */
+/* #undef HAVE_WINDOWS_H */
+
+/* Define to 1 if you have the <zlib.h> header file. */
+#define HAVE_ZLIB_H 1
+
+/* PCRE2 uses recursive function calls to handle backtracking while matching.
+   This can sometimes be a problem on systems that have stacks of limited
+   size. Define HEAP_MATCH_RECURSE to any value to get a version that doesn't
+   use recursion in the match() function; instead it creates its own stack by
+   steam using memory from the heap. For more detail, see the comments and
+   other stuff just above the match() function. */
+/* #undef HEAP_MATCH_RECURSE */
+
+/* The value of LINK_SIZE determines the number of bytes used to store links
+   as offsets within the compiled regex. The default is 2, which allows for
+   compiled patterns up to 64K long. This covers the vast majority of cases.
+   However, PCRE2 can also be compiled to use 3 or 4 bytes instead. This
+   allows for longer patterns in extreme cases. */
+#ifndef LINK_SIZE
+#define LINK_SIZE 2
+#endif
+
+/* Define to the sub-directory where libtool stores uninstalled libraries. */
+/* This is ignored unless you are using libtool. */
+#ifndef LT_OBJDIR
+#define LT_OBJDIR ".libs/"
+#endif
+
+/* The value of MATCH_LIMIT determines the default number of times the
+   internal match() function can be called during a single execution of
+   pcre2_match(). There is a runtime interface for setting a different limit.
+   The limit exists in order to catch runaway regular expressions that take
+   for ever to determine that they do not match. The default is set very large
+   so that it does not accidentally catch legitimate cases. */
+#ifndef MATCH_LIMIT
+#define MATCH_LIMIT 10000000
+#endif
+
+/* The above limit applies to all calls of match(), whether or not they
+   increase the recursion depth. In some environments it is desirable to limit
+   the depth of recursive calls of match() more strictly, in order to restrict
+   the maximum amount of stack (or heap, if HEAP_MATCH_RECURSE is defined)
+   that is used. The value of MATCH_LIMIT_RECURSION applies only to recursive
+   calls of match(). To have any useful effect, it must be less than the value
+   of MATCH_LIMIT. The default is to use the same value as MATCH_LIMIT. There
+   is a runtime method for setting a different limit. */
+#ifndef MATCH_LIMIT_RECURSION
+#define MATCH_LIMIT_RECURSION MATCH_LIMIT
+#endif
+
+/* This limit is parameterized just in case anybody ever wants to change it.
+   Care must be taken if it is increased, because it guards against integer
+   overflow caused by enormously large patterns. */
+#ifndef MAX_NAME_COUNT
+#define MAX_NAME_COUNT 10000
+#endif
+
+/* This limit is parameterized just in case anybody ever wants to change it.
+   Care must be taken if it is increased, because it guards against integer
+   overflow caused by enormously large patterns. */
+#ifndef MAX_NAME_SIZE
+#define MAX_NAME_SIZE 32
+#endif
+
+/* Defining NEVER_BACKSLASH_C locks out the use of \C in all patterns. */
+/* #undef NEVER_BACKSLASH_C */
+
+/* The value of NEWLINE_DEFAULT determines the default newline character
+   sequence. PCRE2 client programs can override this by selecting other values
+   at run time. The valid values are 1 (CR), 2 (LF), 3 (CRLF), 4 (ANY), and 5
+   (ANYCRLF). */
+#ifndef NEWLINE_DEFAULT
+#define NEWLINE_DEFAULT 2
+#endif
+
+/* Name of package */
+#define PACKAGE "pcre2"
+
+/* Define to the address where bug reports for this package should be sent. */
+#define PACKAGE_BUGREPORT ""
+
+/* Define to the full name of this package. */
+#define PACKAGE_NAME "PCRE2"
+
+/* Define to the full name and version of this package. */
+#define PACKAGE_STRING "PCRE2 10.21"
+
+/* Define to the one symbol short name of this package. */
+#define PACKAGE_TARNAME "pcre2"
+
+/* Define to the home page for this package. */
+#define PACKAGE_URL ""
+
+/* Define to the version of this package. */
+#define PACKAGE_VERSION "10.21"
+
+/* The value of PARENS_NEST_LIMIT specifies the maximum depth of nested
+   parentheses (of any kind) in a pattern. This limits the amount of system
+   stack that is used while compiling a pattern. */
+#ifndef PARENS_NEST_LIMIT
+#define PARENS_NEST_LIMIT 250
+#endif
+
+/* The value of PCRE2GREP_BUFSIZE determines the size of buffer used by
+   pcre2grep to hold parts of the file it is searching. This is also the
+   minimum value. The actual amount of memory used by pcre2grep is three times
+   this number, because it allows for the buffering of "before" and "after"
+   lines. */
+#ifndef PCRE2GREP_BUFSIZE
+#define PCRE2GREP_BUFSIZE 20480
+#endif
+
+/* Define to any value to include debugging code. */
+/* #undef PCRE2_DEBUG */
+
+/* If you are compiling for a system other than a Unix-like system or
+   Win32, and it needs some magic to be inserted before the definition
+   of a function that is exported by the library, define this macro to
+   contain the relevant magic. If you do not define this macro, a suitable
+    __declspec value is used for Windows systems; in other environments
+   "extern" is used for a C compiler and "extern C" for a C++ compiler.
+   This macro apears at the start of every exported function that is part
+   of the external API. It does not appear on functions that are "external"
+   in the C sense, but which are internal to the library. */
+/* #undef PCRE2_EXP_DEFN */
+
+/* Define to any value if linking statically (TODO: make nice with Libtool) */
+/* #undef PCRE2_STATIC */
+
+/* Define to necessary symbol if this constant uses a non-standard name on
+   your system. */
+/* #undef PTHREAD_CREATE_JOINABLE */
+
+/* Define to 1 if you have the ANSI C header files. */
+#define STDC_HEADERS 1
+
+/* Define to any value to enable support for Just-In-Time compiling. */
+/* #undef SUPPORT_JIT  */
+
+/* Define to any value to allow pcre2grep to be linked with libbz2, so that it
+   is able to handle .bz2 files. */
+/* #undef SUPPORT_LIBBZ2 */
+
+/* Define to any value to allow pcre2test to be linked with libedit. */
+/* #undef SUPPORT_LIBEDIT */
+
+/* Define to any value to allow pcre2test to be linked with libreadline. */
+/* #undef SUPPORT_LIBREADLINE */
+
+/* Define to any value to allow pcre2grep to be linked with libz, so that it
+   is able to handle .gz files. */
+/* #undef SUPPORT_LIBZ */
+
+/* Define to any value to enable JIT support in pcre2grep. */
+/* #undef SUPPORT_PCRE2GREP_JIT */
+
+/* Define to any value to enable the 16 bit PCRE2 library. */
+/* #undef SUPPORT_PCRE2_16 */
+
+/* Define to any value to enable the 32 bit PCRE2 library. */
+/* #undef SUPPORT_PCRE2_32 */
+
+/* Define to any value to enable the 8 bit PCRE2 library. */
+#define SUPPORT_PCRE2_8 1
+
+/* Define to any value to enable support for Unicode and UTF encoding. This
+   will work even in an EBCDIC environment, but it is incompatible with the
+   EBCDIC macro. That is, PCRE2 can support *either* EBCDIC code *or*
+   ASCII/Unicode, but not both at once. */
+/* #undef SUPPORT_UNICODE */
+
+/* Define to any value for valgrind support to find invalid memory reads. */
+/* #undef SUPPORT_VALGRIND */
+
+/* Version number of package */
+#define VERSION "10.21"
+
+/* Define to empty if `const' does not conform to ANSI C. */
+/* #undef const */
+
+/* Define to the type of a signed integer type of width exactly 64 bits if
+   such a type exists and the standard includes do not define it. */
+/* #undef int64_t */
+
+/* Define to `unsigned int' if <sys/types.h> does not define. */
+/* #undef size_t */
diff --git a/pcre.h b/pcre.h
deleted file mode 100644
index bf6351f..0000000
--- a/pcre.h
+++ /dev/null
@@ -1,677 +0,0 @@
-/*************************************************
-*       Perl-Compatible Regular Expressions      *
-*************************************************/
-
-/* This is the public header file for the PCRE library, to be #included by
-applications that call the PCRE functions.
-
-           Copyright (c) 1997-2014 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 current PCRE version information. */
-
-#define PCRE_MAJOR          8
-#define PCRE_MINOR          38
-#define PCRE_PRERELEASE     
-#define PCRE_DATE           2015-11-23
-
-/* When an application links to a PCRE DLL in Windows, the symbols that are
-imported have to be identified as such. When building PCRE, the appropriate
-export setting is defined in pcre_internal.h, which includes this file. So we
-don't change existing definitions of PCRE_EXP_DECL and PCRECPP_EXP_DECL. */
-
-#if defined(_WIN32) && !defined(PCRE_STATIC)
-#  ifndef PCRE_EXP_DECL
-#    define PCRE_EXP_DECL  extern __declspec(dllimport)
-#  endif
-#  ifdef __cplusplus
-#    ifndef PCRECPP_EXP_DECL
-#      define PCRECPP_EXP_DECL  extern __declspec(dllimport)
-#    endif
-#    ifndef PCRECPP_EXP_DEFN
-#      define PCRECPP_EXP_DEFN  __declspec(dllimport)
-#    endif
-#  endif
-#endif
-
-/* By default, we use the standard "extern" declarations. */
-
-#ifndef PCRE_EXP_DECL
-#  ifdef __cplusplus
-#    define PCRE_EXP_DECL  extern "C"
-#  else
-#    define PCRE_EXP_DECL  extern
-#  endif
-#endif
-
-#ifdef __cplusplus
-#  ifndef PCRECPP_EXP_DECL
-#    define PCRECPP_EXP_DECL  extern
-#  endif
-#  ifndef PCRECPP_EXP_DEFN
-#    define PCRECPP_EXP_DEFN
-#  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
-
-/* Public options. Some are compile-time only, some are run-time only, and some
-are both. Most of the compile-time options are saved with the compiled regex so
-that they can be inspected during studying (and therefore JIT compiling). Note
-that pcre_study() has its own set of options. Originally, all the options
-defined here used distinct bits. However, almost all the bits in a 32-bit word
-are now used, so in order to conserve them, option bits that were previously
-only recognized at matching time (i.e. by pcre_exec() or pcre_dfa_exec()) may
-also be used for compile-time options that affect only compiling and are not
-relevant for studying or JIT compiling.
-
-Some options for pcre_compile() change its behaviour but do not affect the
-behaviour of the execution functions. Other options are passed through to the
-execution functions and affect their behaviour, with or without affecting the
-behaviour of pcre_compile().
-
-Options that can be passed to pcre_compile() are tagged Cx below, with these
-variants:
-
-C1   Affects compile only
-C2   Does not affect compile; affects exec, dfa_exec
-C3   Affects compile, exec, dfa_exec
-C4   Affects compile, exec, dfa_exec, study
-C5   Affects compile, exec, study
-
-Options that can be set for pcre_exec() and/or pcre_dfa_exec() are flagged with
-E and D, respectively. They take precedence over C3, C4, and C5 settings passed
-from pcre_compile(). Those that are compatible with JIT execution are flagged
-with J. */
-
-#define PCRE_CASELESS           0x00000001  /* C1       */
-#define PCRE_MULTILINE          0x00000002  /* C1       */
-#define PCRE_DOTALL             0x00000004  /* C1       */
-#define PCRE_EXTENDED           0x00000008  /* C1       */
-#define PCRE_ANCHORED           0x00000010  /* C4 E D   */
-#define PCRE_DOLLAR_ENDONLY     0x00000020  /* C2       */
-#define PCRE_EXTRA              0x00000040  /* C1       */
-#define PCRE_NOTBOL             0x00000080  /*    E D J */
-#define PCRE_NOTEOL             0x00000100  /*    E D J */
-#define PCRE_UNGREEDY           0x00000200  /* C1       */
-#define PCRE_NOTEMPTY           0x00000400  /*    E D J */
-#define PCRE_UTF8               0x00000800  /* C4        )          */
-#define PCRE_UTF16              0x00000800  /* C4        ) Synonyms */
-#define PCRE_UTF32              0x00000800  /* C4        )          */
-#define PCRE_NO_AUTO_CAPTURE    0x00001000  /* C1       */
-#define PCRE_NO_UTF8_CHECK      0x00002000  /* C1 E D J  )          */
-#define PCRE_NO_UTF16_CHECK     0x00002000  /* C1 E D J  ) Synonyms */
-#define PCRE_NO_UTF32_CHECK     0x00002000  /* C1 E D J  )          */
-#define PCRE_AUTO_CALLOUT       0x00004000  /* C1       */
-#define PCRE_PARTIAL_SOFT       0x00008000  /*    E D J  ) Synonyms */
-#define PCRE_PARTIAL            0x00008000  /*    E D J  )          */
-
-/* This pair use the same bit. */
-#define PCRE_NEVER_UTF          0x00010000  /* C1        ) Overlaid */
-#define PCRE_DFA_SHORTEST       0x00010000  /*      D    ) Overlaid */
-
-/* This pair use the same bit. */
-#define PCRE_NO_AUTO_POSSESS    0x00020000  /* C1        ) Overlaid */
-#define PCRE_DFA_RESTART        0x00020000  /*      D    ) Overlaid */
-
-#define PCRE_FIRSTLINE          0x00040000  /* C3       */
-#define PCRE_DUPNAMES           0x00080000  /* C1       */
-#define PCRE_NEWLINE_CR         0x00100000  /* C3 E D   */
-#define PCRE_NEWLINE_LF         0x00200000  /* C3 E D   */
-#define PCRE_NEWLINE_CRLF       0x00300000  /* C3 E D   */
-#define PCRE_NEWLINE_ANY        0x00400000  /* C3 E D   */
-#define PCRE_NEWLINE_ANYCRLF    0x00500000  /* C3 E D   */
-#define PCRE_BSR_ANYCRLF        0x00800000  /* C3 E D   */
-#define PCRE_BSR_UNICODE        0x01000000  /* C3 E D   */
-#define PCRE_JAVASCRIPT_COMPAT  0x02000000  /* C5       */
-#define PCRE_NO_START_OPTIMIZE  0x04000000  /* C2 E D    ) Synonyms */
-#define PCRE_NO_START_OPTIMISE  0x04000000  /* C2 E D    )          */
-#define PCRE_PARTIAL_HARD       0x08000000  /*    E D J */
-#define PCRE_NOTEMPTY_ATSTART   0x10000000  /*    E D J */
-#define PCRE_UCP                0x20000000  /* C3       */
-
-/* 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_OPCODE   (-5)
-#define PCRE_ERROR_UNKNOWN_NODE     (-5)  /* For backward compatibility */
-#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)  /* Same for 8/16/32 */
-#define PCRE_ERROR_BADUTF16        (-10)  /* Same for 8/16/32 */
-#define PCRE_ERROR_BADUTF32        (-10)  /* Same for 8/16/32 */
-#define PCRE_ERROR_BADUTF8_OFFSET  (-11)  /* Same for 8/16 */
-#define PCRE_ERROR_BADUTF16_OFFSET (-11)  /* Same for 8/16 */
-#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)
-#define PCRE_ERROR_RECURSIONLIMIT  (-21)
-#define PCRE_ERROR_NULLWSLIMIT     (-22)  /* No longer actually used */
-#define PCRE_ERROR_BADNEWLINE      (-23)
-#define PCRE_ERROR_BADOFFSET       (-24)
-#define PCRE_ERROR_SHORTUTF8       (-25)
-#define PCRE_ERROR_SHORTUTF16      (-25)  /* Same for 8/16 */
-#define PCRE_ERROR_RECURSELOOP     (-26)
-#define PCRE_ERROR_JIT_STACKLIMIT  (-27)
-#define PCRE_ERROR_BADMODE         (-28)
-#define PCRE_ERROR_BADENDIANNESS   (-29)
-#define PCRE_ERROR_DFA_BADRESTART  (-30)
-#define PCRE_ERROR_JIT_BADOPTION   (-31)
-#define PCRE_ERROR_BADLENGTH       (-32)
-#define PCRE_ERROR_UNSET           (-33)
-
-/* Specific error codes for UTF-8 validity checks */
-
-#define PCRE_UTF8_ERR0               0
-#define PCRE_UTF8_ERR1               1
-#define PCRE_UTF8_ERR2               2
-#define PCRE_UTF8_ERR3               3
-#define PCRE_UTF8_ERR4               4
-#define PCRE_UTF8_ERR5               5
-#define PCRE_UTF8_ERR6               6
-#define PCRE_UTF8_ERR7               7
-#define PCRE_UTF8_ERR8               8
-#define PCRE_UTF8_ERR9               9
-#define PCRE_UTF8_ERR10             10
-#define PCRE_UTF8_ERR11             11
-#define PCRE_UTF8_ERR12             12
-#define PCRE_UTF8_ERR13             13
-#define PCRE_UTF8_ERR14             14
-#define PCRE_UTF8_ERR15             15
-#define PCRE_UTF8_ERR16             16
-#define PCRE_UTF8_ERR17             17
-#define PCRE_UTF8_ERR18             18
-#define PCRE_UTF8_ERR19             19
-#define PCRE_UTF8_ERR20             20
-#define PCRE_UTF8_ERR21             21
-#define PCRE_UTF8_ERR22             22  /* Unused (was non-character) */
-
-/* Specific error codes for UTF-16 validity checks */
-
-#define PCRE_UTF16_ERR0              0
-#define PCRE_UTF16_ERR1              1
-#define PCRE_UTF16_ERR2              2
-#define PCRE_UTF16_ERR3              3
-#define PCRE_UTF16_ERR4              4  /* Unused (was non-character) */
-
-/* Specific error codes for UTF-32 validity checks */
-
-#define PCRE_UTF32_ERR0              0
-#define PCRE_UTF32_ERR1              1
-#define PCRE_UTF32_ERR2              2  /* Unused (was non-character) */
-#define PCRE_UTF32_ERR3              3
-
-/* 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
-#define PCRE_INFO_OKPARTIAL         12
-#define PCRE_INFO_JCHANGED          13
-#define PCRE_INFO_HASCRORLF         14
-#define PCRE_INFO_MINLENGTH         15
-#define PCRE_INFO_JIT               16
-#define PCRE_INFO_JITSIZE           17
-#define PCRE_INFO_MAXLOOKBEHIND     18
-#define PCRE_INFO_FIRSTCHARACTER    19
-#define PCRE_INFO_FIRSTCHARACTERFLAGS 20
-#define PCRE_INFO_REQUIREDCHAR      21
-#define PCRE_INFO_REQUIREDCHARFLAGS 22
-#define PCRE_INFO_MATCHLIMIT        23
-#define PCRE_INFO_RECURSIONLIMIT    24
-#define PCRE_INFO_MATCH_EMPTY       25
-
-/* Request types for pcre_config(). Do not re-arrange, in order to remain
-compatible. */
-
-#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
-#define PCRE_CONFIG_MATCH_LIMIT_RECURSION   7
-#define PCRE_CONFIG_BSR                     8
-#define PCRE_CONFIG_JIT                     9
-#define PCRE_CONFIG_UTF16                  10
-#define PCRE_CONFIG_JITTARGET              11
-#define PCRE_CONFIG_UTF32                  12
-#define PCRE_CONFIG_PARENS_LIMIT           13
-
-/* Request types for pcre_study(). Do not re-arrange, in order to remain
-compatible. */
-
-#define PCRE_STUDY_JIT_COMPILE                0x0001
-#define PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE   0x0002
-#define PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE   0x0004
-#define PCRE_STUDY_EXTRA_NEEDED               0x0008
-
-/* Bit flags for the pcre[16|32]_extra structure. Do not re-arrange or redefine
-these bits, just add new ones on the end, in order to remain compatible. */
-
-#define PCRE_EXTRA_STUDY_DATA             0x0001
-#define PCRE_EXTRA_MATCH_LIMIT            0x0002
-#define PCRE_EXTRA_CALLOUT_DATA           0x0004
-#define PCRE_EXTRA_TABLES                 0x0008
-#define PCRE_EXTRA_MATCH_LIMIT_RECURSION  0x0010
-#define PCRE_EXTRA_MARK                   0x0020
-#define PCRE_EXTRA_EXECUTABLE_JIT         0x0040
-
-/* Types */
-
-struct real_pcre;                 /* declaration; the definition is private  */
-typedef struct real_pcre pcre;
-
-struct real_pcre16;               /* declaration; the definition is private  */
-typedef struct real_pcre16 pcre16;
-
-struct real_pcre32;               /* declaration; the definition is private  */
-typedef struct real_pcre32 pcre32;
-
-struct real_pcre_jit_stack;       /* declaration; the definition is private  */
-typedef struct real_pcre_jit_stack pcre_jit_stack;
-
-struct real_pcre16_jit_stack;     /* declaration; the definition is private  */
-typedef struct real_pcre16_jit_stack pcre16_jit_stack;
-
-struct real_pcre32_jit_stack;     /* declaration; the definition is private  */
-typedef struct real_pcre32_jit_stack pcre32_jit_stack;
-
-/* If PCRE is compiled with 16 bit character support, PCRE_UCHAR16 must contain
-a 16 bit wide signed data type. Otherwise it can be a dummy data type since
-pcre16 functions are not implemented. There is a check for this in pcre_internal.h. */
-#ifndef PCRE_UCHAR16
-#define PCRE_UCHAR16 unsigned short
-#endif
-
-#ifndef PCRE_SPTR16
-#define PCRE_SPTR16 const PCRE_UCHAR16 *
-#endif
-
-/* If PCRE is compiled with 32 bit character support, PCRE_UCHAR32 must contain
-a 32 bit wide signed data type. Otherwise it can be a dummy data type since
-pcre32 functions are not implemented. There is a check for this in pcre_internal.h. */
-#ifndef PCRE_UCHAR32
-#define PCRE_UCHAR32 unsigned int
-#endif
-
-#ifndef PCRE_SPTR32
-#define PCRE_SPTR32 const PCRE_UCHAR32 *
-#endif
-
-/* When PCRE is compiled as a C++ library, the subject pointer type can be
-replaced with a custom type. For conventional use, the public interface is a
-const char *. */
-
-#ifndef PCRE_SPTR
-#define PCRE_SPTR const char *
-#endif
-
-/* 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 */
-  unsigned long int match_limit_recursion; /* Max recursive calls to match() */
-  unsigned char **mark;           /* For passing back a mark pointer */
-  void *executable_jit;           /* Contains a pointer to a compiled jit code */
-} pcre_extra;
-
-/* Same structure as above, but with 16 bit char pointers. */
-
-typedef struct pcre16_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 */
-  unsigned long int match_limit_recursion; /* Max recursive calls to match() */
-  PCRE_UCHAR16 **mark;            /* For passing back a mark pointer */
-  void *executable_jit;           /* Contains a pointer to a compiled jit code */
-} pcre16_extra;
-
-/* Same structure as above, but with 32 bit char pointers. */
-
-typedef struct pcre32_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 */
-  unsigned long int match_limit_recursion; /* Max recursive calls to match() */
-  PCRE_UCHAR32 **mark;            /* For passing back a mark pointer */
-  void *executable_jit;           /* Contains a pointer to a compiled jit code */
-} pcre32_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 */
-  PCRE_SPTR    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 */
-  /* ------------------- Added for Version 2 -------------------------- */
-  const unsigned char *mark;      /* Pointer to current mark or NULL    */
-  /* ------------------------------------------------------------------ */
-} pcre_callout_block;
-
-/* Same structure as above, but with 16 bit char pointers. */
-
-typedef struct pcre16_callout_block {
-  int          version;           /* Identifies version of block */
-  /* ------------------------ Version 0 ------------------------------- */
-  int          callout_number;    /* Number compiled into pattern */
-  int         *offset_vector;     /* The offset vector */
-  PCRE_SPTR16  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 */
-  /* ------------------- Added for Version 2 -------------------------- */
-  const PCRE_UCHAR16 *mark;       /* Pointer to current mark or NULL    */
-  /* ------------------------------------------------------------------ */
-} pcre16_callout_block;
-
-/* Same structure as above, but with 32 bit char pointers. */
-
-typedef struct pcre32_callout_block {
-  int          version;           /* Identifies version of block */
-  /* ------------------------ Version 0 ------------------------------- */
-  int          callout_number;    /* Number compiled into pattern */
-  int         *offset_vector;     /* The offset vector */
-  PCRE_SPTR32  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 */
-  /* ------------------- Added for Version 2 -------------------------- */
-  const PCRE_UCHAR32 *mark;       /* Pointer to current mark or NULL    */
-  /* ------------------------------------------------------------------ */
-} pcre32_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_EXP_DECL void *(*pcre_malloc)(size_t);
-PCRE_EXP_DECL void  (*pcre_free)(void *);
-PCRE_EXP_DECL void *(*pcre_stack_malloc)(size_t);
-PCRE_EXP_DECL void  (*pcre_stack_free)(void *);
-PCRE_EXP_DECL int   (*pcre_callout)(pcre_callout_block *);
-PCRE_EXP_DECL int   (*pcre_stack_guard)(void);
-
-PCRE_EXP_DECL void *(*pcre16_malloc)(size_t);
-PCRE_EXP_DECL void  (*pcre16_free)(void *);
-PCRE_EXP_DECL void *(*pcre16_stack_malloc)(size_t);
-PCRE_EXP_DECL void  (*pcre16_stack_free)(void *);
-PCRE_EXP_DECL int   (*pcre16_callout)(pcre16_callout_block *);
-PCRE_EXP_DECL int   (*pcre16_stack_guard)(void);
-
-PCRE_EXP_DECL void *(*pcre32_malloc)(size_t);
-PCRE_EXP_DECL void  (*pcre32_free)(void *);
-PCRE_EXP_DECL void *(*pcre32_stack_malloc)(size_t);
-PCRE_EXP_DECL void  (*pcre32_stack_free)(void *);
-PCRE_EXP_DECL int   (*pcre32_callout)(pcre32_callout_block *);
-PCRE_EXP_DECL int   (*pcre32_stack_guard)(void);
-#else   /* VPCOMPAT */
-PCRE_EXP_DECL void *pcre_malloc(size_t);
-PCRE_EXP_DECL void  pcre_free(void *);
-PCRE_EXP_DECL void *pcre_stack_malloc(size_t);
-PCRE_EXP_DECL void  pcre_stack_free(void *);
-PCRE_EXP_DECL int   pcre_callout(pcre_callout_block *);
-PCRE_EXP_DECL int   pcre_stack_guard(void);
-
-PCRE_EXP_DECL void *pcre16_malloc(size_t);
-PCRE_EXP_DECL void  pcre16_free(void *);
-PCRE_EXP_DECL void *pcre16_stack_malloc(size_t);
-PCRE_EXP_DECL void  pcre16_stack_free(void *);
-PCRE_EXP_DECL int   pcre16_callout(pcre16_callout_block *);
-PCRE_EXP_DECL int   pcre16_stack_guard(void);
-
-PCRE_EXP_DECL void *pcre32_malloc(size_t);
-PCRE_EXP_DECL void  pcre32_free(void *);
-PCRE_EXP_DECL void *pcre32_stack_malloc(size_t);
-PCRE_EXP_DECL void  pcre32_stack_free(void *);
-PCRE_EXP_DECL int   pcre32_callout(pcre32_callout_block *);
-PCRE_EXP_DECL int   pcre32_stack_guard(void);
-#endif  /* VPCOMPAT */
-
-/* User defined callback which provides a stack just before the match starts. */
-
-typedef pcre_jit_stack *(*pcre_jit_callback)(void *);
-typedef pcre16_jit_stack *(*pcre16_jit_callback)(void *);
-typedef pcre32_jit_stack *(*pcre32_jit_callback)(void *);
-
-/* Exported PCRE functions */
-
-PCRE_EXP_DECL pcre *pcre_compile(const char *, int, const char **, int *,
-                  const unsigned char *);
-PCRE_EXP_DECL pcre16 *pcre16_compile(PCRE_SPTR16, int, const char **, int *,
-                  const unsigned char *);
-PCRE_EXP_DECL pcre32 *pcre32_compile(PCRE_SPTR32, int, const char **, int *,
-                  const unsigned char *);
-PCRE_EXP_DECL pcre *pcre_compile2(const char *, int, int *, const char **,
-                  int *, const unsigned char *);
-PCRE_EXP_DECL pcre16 *pcre16_compile2(PCRE_SPTR16, int, int *, const char **,
-                  int *, const unsigned char *);
-PCRE_EXP_DECL pcre32 *pcre32_compile2(PCRE_SPTR32, int, int *, const char **,
-                  int *, const unsigned char *);
-PCRE_EXP_DECL int  pcre_config(int, void *);
-PCRE_EXP_DECL int  pcre16_config(int, void *);
-PCRE_EXP_DECL int  pcre32_config(int, void *);
-PCRE_EXP_DECL int  pcre_copy_named_substring(const pcre *, const char *,
-                  int *, int, const char *, char *, int);
-PCRE_EXP_DECL int  pcre16_copy_named_substring(const pcre16 *, PCRE_SPTR16,
-                  int *, int, PCRE_SPTR16, PCRE_UCHAR16 *, int);
-PCRE_EXP_DECL int  pcre32_copy_named_substring(const pcre32 *, PCRE_SPTR32,
-                  int *, int, PCRE_SPTR32, PCRE_UCHAR32 *, int);
-PCRE_EXP_DECL int  pcre_copy_substring(const char *, int *, int, int,
-                  char *, int);
-PCRE_EXP_DECL int  pcre16_copy_substring(PCRE_SPTR16, int *, int, int,
-                  PCRE_UCHAR16 *, int);
-PCRE_EXP_DECL int  pcre32_copy_substring(PCRE_SPTR32, int *, int, int,
-                  PCRE_UCHAR32 *, int);
-PCRE_EXP_DECL int  pcre_dfa_exec(const pcre *, const pcre_extra *,
-                  const char *, int, int, int, int *, int , int *, int);
-PCRE_EXP_DECL int  pcre16_dfa_exec(const pcre16 *, const pcre16_extra *,
-                  PCRE_SPTR16, int, int, int, int *, int , int *, int);
-PCRE_EXP_DECL int  pcre32_dfa_exec(const pcre32 *, const pcre32_extra *,
-                  PCRE_SPTR32, int, int, int, int *, int , int *, int);
-PCRE_EXP_DECL int  pcre_exec(const pcre *, const pcre_extra *, PCRE_SPTR,
-                   int, int, int, int *, int);
-PCRE_EXP_DECL int  pcre16_exec(const pcre16 *, const pcre16_extra *,
-                   PCRE_SPTR16, int, int, int, int *, int);
-PCRE_EXP_DECL int  pcre32_exec(const pcre32 *, const pcre32_extra *,
-                   PCRE_SPTR32, int, int, int, int *, int);
-PCRE_EXP_DECL int  pcre_jit_exec(const pcre *, const pcre_extra *,
-                   PCRE_SPTR, int, int, int, int *, int,
-                   pcre_jit_stack *);
-PCRE_EXP_DECL int  pcre16_jit_exec(const pcre16 *, const pcre16_extra *,
-                   PCRE_SPTR16, int, int, int, int *, int,
-                   pcre16_jit_stack *);
-PCRE_EXP_DECL int  pcre32_jit_exec(const pcre32 *, const pcre32_extra *,
-                   PCRE_SPTR32, int, int, int, int *, int,
-                   pcre32_jit_stack *);
-PCRE_EXP_DECL void pcre_free_substring(const char *);
-PCRE_EXP_DECL void pcre16_free_substring(PCRE_SPTR16);
-PCRE_EXP_DECL void pcre32_free_substring(PCRE_SPTR32);
-PCRE_EXP_DECL void pcre_free_substring_list(const char **);
-PCRE_EXP_DECL void pcre16_free_substring_list(PCRE_SPTR16 *);
-PCRE_EXP_DECL void pcre32_free_substring_list(PCRE_SPTR32 *);
-PCRE_EXP_DECL int  pcre_fullinfo(const pcre *, const pcre_extra *, int,
-                  void *);
-PCRE_EXP_DECL int  pcre16_fullinfo(const pcre16 *, const pcre16_extra *, int,
-                  void *);
-PCRE_EXP_DECL int  pcre32_fullinfo(const pcre32 *, const pcre32_extra *, int,
-                  void *);
-PCRE_EXP_DECL int  pcre_get_named_substring(const pcre *, const char *,
-                  int *, int, const char *, const char **);
-PCRE_EXP_DECL int  pcre16_get_named_substring(const pcre16 *, PCRE_SPTR16,
-                  int *, int, PCRE_SPTR16, PCRE_SPTR16 *);
-PCRE_EXP_DECL int  pcre32_get_named_substring(const pcre32 *, PCRE_SPTR32,
-                  int *, int, PCRE_SPTR32, PCRE_SPTR32 *);
-PCRE_EXP_DECL int  pcre_get_stringnumber(const pcre *, const char *);
-PCRE_EXP_DECL int  pcre16_get_stringnumber(const pcre16 *, PCRE_SPTR16);
-PCRE_EXP_DECL int  pcre32_get_stringnumber(const pcre32 *, PCRE_SPTR32);
-PCRE_EXP_DECL int  pcre_get_stringtable_entries(const pcre *, const char *,
-                  char **, char **);
-PCRE_EXP_DECL int  pcre16_get_stringtable_entries(const pcre16 *, PCRE_SPTR16,
-                  PCRE_UCHAR16 **, PCRE_UCHAR16 **);
-PCRE_EXP_DECL int  pcre32_get_stringtable_entries(const pcre32 *, PCRE_SPTR32,
-                  PCRE_UCHAR32 **, PCRE_UCHAR32 **);
-PCRE_EXP_DECL int  pcre_get_substring(const char *, int *, int, int,
-                  const char **);
-PCRE_EXP_DECL int  pcre16_get_substring(PCRE_SPTR16, int *, int, int,
-                  PCRE_SPTR16 *);
-PCRE_EXP_DECL int  pcre32_get_substring(PCRE_SPTR32, int *, int, int,
-                  PCRE_SPTR32 *);
-PCRE_EXP_DECL int  pcre_get_substring_list(const char *, int *, int,
-                  const char ***);
-PCRE_EXP_DECL int  pcre16_get_substring_list(PCRE_SPTR16, int *, int,
-                  PCRE_SPTR16 **);
-PCRE_EXP_DECL int  pcre32_get_substring_list(PCRE_SPTR32, int *, int,
-                  PCRE_SPTR32 **);
-PCRE_EXP_DECL const unsigned char *pcre_maketables(void);
-PCRE_EXP_DECL const unsigned char *pcre16_maketables(void);
-PCRE_EXP_DECL const unsigned char *pcre32_maketables(void);
-PCRE_EXP_DECL int  pcre_refcount(pcre *, int);
-PCRE_EXP_DECL int  pcre16_refcount(pcre16 *, int);
-PCRE_EXP_DECL int  pcre32_refcount(pcre32 *, int);
-PCRE_EXP_DECL pcre_extra *pcre_study(const pcre *, int, const char **);
-PCRE_EXP_DECL pcre16_extra *pcre16_study(const pcre16 *, int, const char **);
-PCRE_EXP_DECL pcre32_extra *pcre32_study(const pcre32 *, int, const char **);
-PCRE_EXP_DECL void pcre_free_study(pcre_extra *);
-PCRE_EXP_DECL void pcre16_free_study(pcre16_extra *);
-PCRE_EXP_DECL void pcre32_free_study(pcre32_extra *);
-PCRE_EXP_DECL const char *pcre_version(void);
-PCRE_EXP_DECL const char *pcre16_version(void);
-PCRE_EXP_DECL const char *pcre32_version(void);
-
-/* Utility functions for byte order swaps. */
-PCRE_EXP_DECL int  pcre_pattern_to_host_byte_order(pcre *, pcre_extra *,
-                  const unsigned char *);
-PCRE_EXP_DECL int  pcre16_pattern_to_host_byte_order(pcre16 *, pcre16_extra *,
-                  const unsigned char *);
-PCRE_EXP_DECL int  pcre32_pattern_to_host_byte_order(pcre32 *, pcre32_extra *,
-                  const unsigned char *);
-PCRE_EXP_DECL int  pcre16_utf16_to_host_byte_order(PCRE_UCHAR16 *,
-                  PCRE_SPTR16, int, int *, int);
-PCRE_EXP_DECL int  pcre32_utf32_to_host_byte_order(PCRE_UCHAR32 *,
-                  PCRE_SPTR32, int, int *, int);
-
-/* JIT compiler related functions. */
-
-PCRE_EXP_DECL pcre_jit_stack *pcre_jit_stack_alloc(int, int);
-PCRE_EXP_DECL pcre16_jit_stack *pcre16_jit_stack_alloc(int, int);
-PCRE_EXP_DECL pcre32_jit_stack *pcre32_jit_stack_alloc(int, int);
-PCRE_EXP_DECL void pcre_jit_stack_free(pcre_jit_stack *);
-PCRE_EXP_DECL void pcre16_jit_stack_free(pcre16_jit_stack *);
-PCRE_EXP_DECL void pcre32_jit_stack_free(pcre32_jit_stack *);
-PCRE_EXP_DECL void pcre_assign_jit_stack(pcre_extra *,
-                  pcre_jit_callback, void *);
-PCRE_EXP_DECL void pcre16_assign_jit_stack(pcre16_extra *,
-                  pcre16_jit_callback, void *);
-PCRE_EXP_DECL void pcre32_assign_jit_stack(pcre32_extra *,
-                  pcre32_jit_callback, void *);
-PCRE_EXP_DECL void pcre_jit_free_unused_memory(void);
-PCRE_EXP_DECL void pcre16_jit_free_unused_memory(void);
-PCRE_EXP_DECL void pcre32_jit_free_unused_memory(void);
-
-#ifdef __cplusplus
-}  /* extern "C" */
-#endif
-
-#endif /* End of pcre.h */
diff --git a/pcre_chartables.c b/pcre_chartables.c
deleted file mode 120000
index 1fff79c..0000000
--- a/pcre_chartables.c
+++ /dev/null
@@ -1 +0,0 @@
-dist/pcre_chartables.c.dist
\ No newline at end of file
diff --git a/pcre_scanner.h b/pcre_scanner.h
deleted file mode 120000
index 0b45789..0000000
--- a/pcre_scanner.h
+++ /dev/null
@@ -1 +0,0 @@
-dist/pcre_scanner.h
\ No newline at end of file
diff --git a/pcre_stringpiece.h b/pcre_stringpiece.h
deleted file mode 120000
index a815f48..0000000
--- a/pcre_stringpiece.h
+++ /dev/null
@@ -1 +0,0 @@
-dist/pcre_stringpiece.h
\ No newline at end of file
diff --git a/pcrecpp.h b/pcrecpp.h
deleted file mode 120000
index ab6a181..0000000
--- a/pcrecpp.h
+++ /dev/null
@@ -1 +0,0 @@
-dist/pcrecpp.h
\ No newline at end of file
diff --git a/dist/pcre_scanner.h b/pcrecpp/include/pcre_scanner.h
similarity index 95%
rename from dist/pcre_scanner.h
rename to pcrecpp/include/pcre_scanner.h
index 5617e45..b2bfabe 100644
--- a/dist/pcre_scanner.h
+++ b/pcrecpp/include/pcre_scanner.h
@@ -53,7 +53,7 @@
 
 namespace pcrecpp {
 
-class PCRECPP_EXP_DEFN Scanner {
+class Scanner {
  public:
   Scanner();
   explicit Scanner(const std::string& input);
@@ -79,12 +79,13 @@
   //       parsed and stored into the arguments.
   // If it returns true, it skips over the matched input and any
   // following input that matches the "skip" regular expression.
-  bool Consume(const RE& re,
-               const Arg& arg0 = RE::no_arg,
-               const Arg& arg1 = RE::no_arg,
-               const Arg& arg2 = RE::no_arg
-               // TODO: Allow more arguments?
-               );
+  template<typename ... ARGS>
+  bool Consume(const RE& re, ARGS && ... args) {
+    const bool result = re.Consume(&input_, args...);
+    if (result && should_skip_)
+      ConsumeSkip();
+    return result;
+  }
 
   // Set the "skip" regular expression.  If after consuming some data,
   // a prefix of the input matches this RE, it is automatically
diff --git a/dist/pcre_stringpiece.h b/pcrecpp/include/pcre_stringpiece.h
similarity index 97%
rename from dist/pcre_stringpiece.h
rename to pcrecpp/include/pcre_stringpiece.h
index cc3dc42..51b9812 100644
--- a/dist/pcre_stringpiece.h
+++ b/pcrecpp/include/pcre_stringpiece.h
@@ -50,7 +50,7 @@
 #include <bits/type_traits.h>
 #endif
 
-#include <pcre.h>
+#include <pcre2.h>
 
 using std::memcmp;
 using std::strlen;
@@ -58,7 +58,7 @@
 
 namespace pcrecpp {
 
-class PCRECPP_EXP_DEFN StringPiece {
+class StringPiece {
  private:
   const char*   ptr_;
   int           length_;
@@ -174,7 +174,7 @@
 #endif
 
 // allow StringPiece to be logged
-PCRECPP_EXP_DECL std::ostream& operator<<(std::ostream& o,
+extern std::ostream& operator<<(std::ostream& o,
                                           const pcrecpp::StringPiece& piece);
 
 #endif /* _PCRE_STRINGPIECE_H */
diff --git a/dist/pcrecpp.h b/pcrecpp/include/pcrecpp.h
similarity index 80%
rename from dist/pcrecpp.h
rename to pcrecpp/include/pcrecpp.h
index 3e594b0..0c216b2 100644
--- a/dist/pcrecpp.h
+++ b/pcrecpp/include/pcrecpp.h
@@ -331,11 +331,12 @@
 
 
 #include <string>
-#include <pcre.h>
+#include <pcre2.h>
 #include <pcrecpparg.h>   // defines the Arg class
 // This isn't technically needed here, but we include it
 // anyway so folks who include pcrecpp.h don't have to.
 #include <pcre_stringpiece.h>
+#include <memory>
 
 namespace pcrecpp {
 
@@ -346,16 +347,23 @@
 #define PCRE_IS_SET(o)  \
         (all_options_ & o) == o
 
+typedef std::shared_ptr<pcre2_match_data> pcre2_match_data_ptr;
+
 /***** Compiling regular expressions: the RE class *****/
 
 // RE_Options allow you to set options to be passed along to pcre,
 // along with other options we put on top of pcre.
 // Only 9 modifiers, plus match_limit and match_limit_recursion,
 // are supported now.
-class PCRECPP_EXP_DEFN RE_Options {
+class RE_Options {
  public:
   // constructor
-  RE_Options() : match_limit_(0), match_limit_recursion_(0), all_options_(0) {}
+  RE_Options()
+      : newline_mode_(0),
+        match_limit_(0),
+        match_limit_recursion_(0),
+        all_options_(0) {
+  }
 
   // alternative constructor.
   // To facilitate transfer of legacy code from C programs
@@ -365,8 +373,12 @@
   // But new code is better off doing
   //    RE(pattern,
   //      RE_Options().set_caseless(true).set_multiline(true)).PartialMatch(str);
-  RE_Options(int option_flags) : match_limit_(0), match_limit_recursion_(0),
-                                 all_options_(option_flags) {}
+  RE_Options(int option_flags)
+      : newline_mode_(0),
+        match_limit_(0),
+        match_limit_recursion_(0),
+        all_options_(option_flags) {
+  }
   // we're fine with the default destructor, copy constructor, etc.
 
   // accessors and mutators
@@ -383,66 +395,74 @@
   }
 
   bool caseless() const {
-    return PCRE_IS_SET(PCRE_CASELESS);
+    return PCRE_IS_SET(PCRE2_CASELESS);
   }
   RE_Options &set_caseless(bool x) {
-    PCRE_SET_OR_CLEAR(x, PCRE_CASELESS);
+    PCRE_SET_OR_CLEAR(x, PCRE2_CASELESS);
   }
 
   bool multiline() const {
-    return PCRE_IS_SET(PCRE_MULTILINE);
+    return PCRE_IS_SET(PCRE2_MULTILINE);
   }
   RE_Options &set_multiline(bool x) {
-    PCRE_SET_OR_CLEAR(x, PCRE_MULTILINE);
+    PCRE_SET_OR_CLEAR(x, PCRE2_MULTILINE);
+  }
+
+  int newline_mode() const {
+    if(newline_mode_)
+      return newline_mode_;
+    else {
+      // if newline_mode_ is 0 return the global configuration default
+      int value;
+      pcre2_config_8(PCRE2_CONFIG_NEWLINE, &value);
+      return value;
+    }
+  }
+  RE_Options & set_newline_mode(int newline_mode) {
+    newline_mode_ = newline_mode;
+    return *this;
   }
 
   bool dotall() const {
-    return PCRE_IS_SET(PCRE_DOTALL);
+    return PCRE_IS_SET(PCRE2_DOTALL);
   }
   RE_Options &set_dotall(bool x) {
-    PCRE_SET_OR_CLEAR(x, PCRE_DOTALL);
+    PCRE_SET_OR_CLEAR(x, PCRE2_DOTALL);
   }
 
   bool extended() const {
-    return PCRE_IS_SET(PCRE_EXTENDED);
+    return PCRE_IS_SET(PCRE2_EXTENDED);
   }
   RE_Options &set_extended(bool x) {
-    PCRE_SET_OR_CLEAR(x, PCRE_EXTENDED);
+    PCRE_SET_OR_CLEAR(x, PCRE2_EXTENDED);
   }
 
   bool dollar_endonly() const {
-    return PCRE_IS_SET(PCRE_DOLLAR_ENDONLY);
+    return PCRE_IS_SET(PCRE2_DOLLAR_ENDONLY);
   }
   RE_Options &set_dollar_endonly(bool x) {
-    PCRE_SET_OR_CLEAR(x, PCRE_DOLLAR_ENDONLY);
-  }
-
-  bool extra() const {
-    return PCRE_IS_SET(PCRE_EXTRA);
-  }
-  RE_Options &set_extra(bool x) {
-    PCRE_SET_OR_CLEAR(x, PCRE_EXTRA);
+    PCRE_SET_OR_CLEAR(x, PCRE2_DOLLAR_ENDONLY);
   }
 
   bool ungreedy() const {
-    return PCRE_IS_SET(PCRE_UNGREEDY);
+    return PCRE_IS_SET(PCRE2_UNGREEDY);
   }
   RE_Options &set_ungreedy(bool x) {
-    PCRE_SET_OR_CLEAR(x, PCRE_UNGREEDY);
+    PCRE_SET_OR_CLEAR(x, PCRE2_UNGREEDY);
   }
 
-  bool utf8() const {
-    return PCRE_IS_SET(PCRE_UTF8);
+  bool utf() const {
+    return PCRE_IS_SET(PCRE2_UTF);
   }
-  RE_Options &set_utf8(bool x) {
-    PCRE_SET_OR_CLEAR(x, PCRE_UTF8);
+  RE_Options &set_utf(bool x) {
+    PCRE_SET_OR_CLEAR(x, PCRE2_UTF);
   }
 
   bool no_auto_capture() const {
-    return PCRE_IS_SET(PCRE_NO_AUTO_CAPTURE);
+    return PCRE_IS_SET(PCRE2_NO_AUTO_CAPTURE);
   }
   RE_Options &set_no_auto_capture(bool x) {
-    PCRE_SET_OR_CLEAR(x, PCRE_NO_AUTO_CAPTURE);
+    PCRE_SET_OR_CLEAR(x, PCRE2_NO_AUTO_CAPTURE);
   }
 
   RE_Options &set_all_options(int opt) {
@@ -456,14 +476,15 @@
   // TODO: add other pcre flags
 
  private:
+  int newline_mode_;
   int match_limit_;
   int match_limit_recursion_;
   int all_options_;
 };
 
 // These functions return some common RE_Options
-static inline RE_Options UTF8() {
-  return RE_Options().set_utf8(true);
+static inline RE_Options UTF() {
+  return RE_Options().set_utf(true);
 }
 
 static inline RE_Options CASELESS() {
@@ -484,7 +505,7 @@
 // Interface for regular expression matching.  Also corresponds to a
 // pre-compiled regular expression.  An "RE" object is safe for
 // concurrent use by multiple threads.
-class PCRECPP_EXP_DEFN RE {
+class RE {
  public:
   // We provide implicit conversions from strings so that users can
   // pass in a string or a "const char*" wherever an "RE" is expected.
@@ -525,84 +546,63 @@
 
   // If RE could not be created properly, returns an error string.
   // Else returns the empty string.
-  const string& error() const { return *error_; }
+  const string& error() const { return error_; }
 
   /***** The useful part: the matching interface *****/
 
   // This is provided so one can do pattern.ReplaceAll() just as
   // easily as ReplaceAll(pattern-text, ....)
 
-  bool FullMatch(const StringPiece& text,
-                 const Arg& ptr1 = no_arg,
-                 const Arg& ptr2 = no_arg,
-                 const Arg& ptr3 = no_arg,
-                 const Arg& ptr4 = no_arg,
-                 const Arg& ptr5 = no_arg,
-                 const Arg& ptr6 = no_arg,
-                 const Arg& ptr7 = no_arg,
-                 const Arg& ptr8 = no_arg,
-                 const Arg& ptr9 = no_arg,
-                 const Arg& ptr10 = no_arg,
-                 const Arg& ptr11 = no_arg,
-                 const Arg& ptr12 = no_arg,
-                 const Arg& ptr13 = no_arg,
-                 const Arg& ptr14 = no_arg,
-                 const Arg& ptr15 = no_arg,
-                 const Arg& ptr16 = no_arg) const;
+  template<typename ... ARGS>
+  bool FullMatch(const StringPiece & text, ARGS && ...a) const {
+    // create an array with the size of the number of arguments given
+    Arg args[Args<ARGS...>::count()];
+    // initialize the array with the arguments given
+    Args<ARGS...>::arrayify(args, a...);
 
-  bool PartialMatch(const StringPiece& text,
-                    const Arg& ptr1 = no_arg,
-                    const Arg& ptr2 = no_arg,
-                    const Arg& ptr3 = no_arg,
-                    const Arg& ptr4 = no_arg,
-                    const Arg& ptr5 = no_arg,
-                    const Arg& ptr6 = no_arg,
-                    const Arg& ptr7 = no_arg,
-                    const Arg& ptr8 = no_arg,
-                    const Arg& ptr9 = no_arg,
-                    const Arg& ptr10 = no_arg,
-                    const Arg& ptr11 = no_arg,
-                    const Arg& ptr12 = no_arg,
-                    const Arg& ptr13 = no_arg,
-                    const Arg& ptr14 = no_arg,
-                    const Arg& ptr15 = no_arg,
-                    const Arg& ptr16 = no_arg) const;
+    return DoMatchImpl(text, ANCHOR_BOTH, NULL, args, Args<ARGS...>::count());
+  }
 
-  bool Consume(StringPiece* input,
-               const Arg& ptr1 = no_arg,
-               const Arg& ptr2 = no_arg,
-               const Arg& ptr3 = no_arg,
-               const Arg& ptr4 = no_arg,
-               const Arg& ptr5 = no_arg,
-               const Arg& ptr6 = no_arg,
-               const Arg& ptr7 = no_arg,
-               const Arg& ptr8 = no_arg,
-               const Arg& ptr9 = no_arg,
-               const Arg& ptr10 = no_arg,
-               const Arg& ptr11 = no_arg,
-               const Arg& ptr12 = no_arg,
-               const Arg& ptr13 = no_arg,
-               const Arg& ptr14 = no_arg,
-               const Arg& ptr15 = no_arg,
-               const Arg& ptr16 = no_arg) const;
+  template<typename ... ARGS>
+  bool PartialMatch(const StringPiece& text, ARGS && ...a) const {
+    // create an array with the size of the number of arguments given
+    Arg args[Args<ARGS...>::count()];
+    // initialize the array with the arguments given
+    Args<ARGS...>::arrayify(args, a...);
 
-  bool FindAndConsume(StringPiece* input,
-                      const Arg& ptr1 = no_arg,
-                      const Arg& ptr2 = no_arg,
-                      const Arg& ptr3 = no_arg,
-                      const Arg& ptr4 = no_arg,
-                      const Arg& ptr5 = no_arg,
-                      const Arg& ptr6 = no_arg,
-                      const Arg& ptr7 = no_arg,
-                      const Arg& ptr8 = no_arg,
-                      const Arg& ptr9 = no_arg,
-                      const Arg& ptr10 = no_arg,
-                      const Arg& ptr11 = no_arg,
-                      const Arg& ptr12 = no_arg,
-                      const Arg& ptr13 = no_arg,
-                      const Arg& ptr14 = no_arg,
-                      const Arg& ptr15 = no_arg,
-                      const Arg& ptr16 = no_arg) const;
+    return DoMatchImpl(text, UNANCHORED, NULL, args, Args<ARGS...>::count());
+  }
+
+  template<typename ... ARGS>
+  bool Consume(StringPiece* input, ARGS && ...a) const {
+    // create an array with the size of the number of arguments given
+    Arg args[Args<ARGS...>::count()];
+    // initialize the array with the arguments given
+    Args<ARGS...>::arrayify(args, a...);
+
+    int consumed;
+    if (DoMatchImpl(*input, ANCHOR_START, &consumed, args,
+                    Args<ARGS...>::count())) {
+      input->remove_prefix(consumed);
+      return true;
+    } else {
+      return false;
+    }
+  }
+
+  template<typename ... ARGS>
+  bool FindAndConsume(StringPiece* input, ARGS && ...a) const {
+    Arg args[Args<ARGS...>::count()];
+    Args<ARGS...>::arrayify(args, a...);
+    int consumed;
+    if (DoMatchImpl(*input, UNANCHORED, &consumed, args,
+                    Args<ARGS...>::count())) {
+      input->remove_prefix(consumed);
+      return true;
+    } else {
+      return false;
+    }
+  }
 
   bool Replace(const StringPiece& rewrite,
                string *str) const;
@@ -640,21 +640,12 @@
   bool DoMatch(const StringPiece& text,
                Anchor anchor,
                int* consumed,
-               const Arg* const* args, int n) const;
+               Arg const argsp[], int n) const;
 
   // Return the number of capturing subpatterns, or -1 if the
   // regexp wasn't valid on construction.
   int NumberOfCapturingGroups() const;
 
-  // The default value for an argument, to indicate the end of the argument
-  // list. This must be used only in optional argument defaults. It should NOT
-  // be passed explicitly. Some people have tried to use it like this:
-  //
-  //   FullMatch(x, y, &z, no_arg, &w);
-  //
-  // This is a mistake, and will not work.
-  static Arg no_arg;
-
  private:
 
   void Init(const string& pattern, const RE_Options* options);
@@ -675,34 +666,30 @@
                int startpos,
                Anchor anchor,
                bool empty_ok,
-               int *vec,
-               int vecsize) const;
+               pcre2_match_data_ptr & match_data) const;
 
   // Append the "rewrite" string, with backslash subsitutions from "text"
   // and "vec", to string "out".
   bool Rewrite(string *out,
                const StringPiece& rewrite,
                const StringPiece& text,
-               int *vec,
-               int veclen) const;
+               pcre2_match_data_ptr const & match_data) const;
 
   // internal implementation for DoMatch
   bool DoMatchImpl(const StringPiece& text,
                    Anchor anchor,
                    int* consumed,
-                   const Arg* const args[],
-                   int n,
-                   int* vec,
-                   int vecsize) const;
+                   const Arg args[],
+                   int n) const;
 
   // Compile the regexp for the specified anchoring mode
-  pcre* Compile(Anchor anchor);
+  pcre2_code * Compile(Anchor anchor);
 
   string        pattern_;
   RE_Options    options_;
-  pcre*         re_full_;       // For full matches
-  pcre*         re_partial_;    // For partial matches
-  const string* error_;         // Error indicator (or points to empty string)
+  pcre2_code*   re_full_;       // For full matches
+  pcre2_code*   re_partial_;    // For partial matches
+  string        error_;         // Error indicator
 };
 
 }   // namespace pcrecpp
diff --git a/dist/pcrecpparg.h b/pcrecpp/include/pcrecpparg.h
similarity index 90%
rename from dist/pcrecpparg.h
rename to pcrecpp/include/pcrecpparg.h
index b4f9c3f..0a1713f 100644
--- a/dist/pcrecpparg.h
+++ b/pcrecpp/include/pcrecpparg.h
@@ -35,7 +35,7 @@
 #include <stdlib.h>    // for NULL
 #include <string>
 
-#include <pcre.h>
+#include <pcre2.h>
 
 namespace pcrecpp {
 
@@ -54,7 +54,7 @@
   }
 };
 
-class PCRECPP_EXP_DEFN Arg {
+class Arg {
  public:
   // Empty constructor so we can declare arrays of Arg
   Arg();
@@ -168,6 +168,40 @@
 #undef PCRE_SET_OR_CLEAR
 #undef MAKE_INTEGER_PARSER
 
+template<typename ARG>
+inline Arg wrap_arg(ARG && any) {
+  return Arg(any);
+}
+
+inline Arg const & wrap_arg(Arg const & arg) {
+  return arg;
+}
+
+template<typename ... ARGS>
+struct Args;
+
+template<typename HEAD, typename ... TAIL>
+struct Args<HEAD, TAIL...> {
+  typedef Args<TAIL...> next;
+  constexpr static unsigned count() {
+    return 1 + next::count();
+  }
+  template<typename _HEAD, typename ... _TAIL>
+  inline static void arrayify(Arg * ptr, _HEAD && head, _TAIL && ... tail) {
+    *ptr++ = wrap_arg(head);
+    next::arrayify(ptr, tail...);
+  }
+};
+
+template<>
+struct Args<> {
+  constexpr static unsigned count() {
+    return 0;
+  }
+  inline static void arrayify(Arg *) {
+  }
+};
+
 }   // namespace pcrecpp
 
 
diff --git a/dist/pcre_scanner.cc b/pcrecpp/pcre_scanner.cc
similarity index 93%
rename from dist/pcre_scanner.cc
rename to pcrecpp/pcre_scanner.cc
index 6be2be6..2887d6b 100644
--- a/dist/pcre_scanner.cc
+++ b/pcrecpp/pcre_scanner.cc
@@ -29,10 +29,6 @@
 //
 // Author: Sanjay Ghemawat
 
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
 #include <vector>
 #include <assert.h>
 
@@ -130,15 +126,6 @@
 }
 
 
-bool Scanner::Consume(const RE& re,
-                      const Arg& arg0,
-                      const Arg& arg1,
-                      const Arg& arg2) {
-  const bool result = re.Consume(&input_, arg0, arg1, arg2);
-  if (result && should_skip_) ConsumeSkip();
-  return result;
-}
-
 // helper function to consume *skip_ and honour save_comments_
 void Scanner::ConsumeSkip() {
   const char* start_data = input_.data();
diff --git a/dist/pcre_scanner_unittest.cc b/pcrecpp/pcre_scanner_unittest.cc
similarity index 100%
rename from dist/pcre_scanner_unittest.cc
rename to pcrecpp/pcre_scanner_unittest.cc
diff --git a/dist/pcre_stringpiece.cc b/pcrecpp/pcre_stringpiece.cc
similarity index 96%
rename from dist/pcre_stringpiece.cc
rename to pcrecpp/pcre_stringpiece.cc
index 67c0f1f..599e466 100644
--- a/dist/pcre_stringpiece.cc
+++ b/pcrecpp/pcre_stringpiece.cc
@@ -30,10 +30,6 @@
 // Author: wilsonh@google.com (Wilson Hsieh)
 //
 
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
 #include <iostream>
 #include "pcrecpp_internal.h"
 #include "pcre_stringpiece.h"
diff --git a/dist/pcre_stringpiece_unittest.cc b/pcrecpp/pcre_stringpiece_unittest.cc
similarity index 100%
rename from dist/pcre_stringpiece_unittest.cc
rename to pcrecpp/pcre_stringpiece_unittest.cc
diff --git a/pcrecpp/pcrecpp.cc b/pcrecpp/pcrecpp.cc
new file mode 100644
index 0000000..2c37c44
--- /dev/null
+++ b/pcrecpp/pcrecpp.cc
@@ -0,0 +1,727 @@
+// Copyright (c) 2010, Google Inc.
+// All rights reserved.
+//
+// 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 Google Inc. 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.
+//
+// Author: Sanjay Ghemawat
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <limits.h>      /* for SHRT_MIN, USHRT_MAX, etc */
+#include <string.h>      /* for memcpy */
+#include <assert.h>
+#include <errno.h>
+#include <string>
+#include <algorithm>
+
+#include "pcrecpp_internal.h"
+#include "pcre2.h"
+#include "pcrecpp.h"
+#include "pcre_stringpiece.h"
+
+
+namespace pcrecpp {
+
+// If the user doesn't ask for any options, we just use this one
+static RE_Options default_options;
+
+void RE::Init(const string& pat, const RE_Options* options) {
+  pattern_ = pat;
+  if (options == NULL) {
+    options_ = default_options;
+  } else {
+    options_ = *options;
+  }
+  error_ = "";
+  re_full_ = NULL;
+  re_partial_ = NULL;
+
+  re_partial_ = Compile(UNANCHORED);
+  if (re_partial_ != NULL) {
+    re_full_ = Compile(ANCHOR_BOTH);
+  }
+}
+
+void RE::Cleanup() {
+  if (re_full_ != NULL)         pcre2_code_free(re_full_);
+  if (re_partial_ != NULL)      pcre2_code_free(re_partial_);
+  error_ = "";
+}
+
+
+RE::~RE() {
+  Cleanup();
+}
+
+static void format_pcre_error(int error, string & str) {
+  PCRE2_UCHAR8 buffer[256];
+  auto rc = pcre2_get_error_message(error, buffer, 256);
+  str.assign(reinterpret_cast<string::value_type*>(buffer));
+  if (rc == PCRE2_ERROR_NOMEMORY) {
+    str.append("...");
+  }
+}
+
+pcre2_code* RE::Compile(Anchor anchor) {
+  // First, convert RE_Options into pcre options
+  int pcre_options = 0;
+  pcre_options = options_.all_options();
+  typedef std::unique_ptr<pcre2_compile_context,
+      decltype(pcre2_compile_context_free)*> compile_context_ptr;
+  compile_context_ptr compile_context(NULL, pcre2_compile_context_free);
+
+  // As of pcre2 the newline mode must be passed through the compile context.
+  // So we only need one if the newline mode is actually set.
+  if (options_.newline_mode()) {
+    compile_context = compile_context_ptr(pcre2_compile_context_create(NULL),
+    pcre2_compile_context_free);
+    if (!compile_context) {
+      error_ = "Unable to allocate memory for pcre2_compile_congext";
+      return NULL;
+    }
+    if (pcre2_set_newline(compile_context.get(),
+                          options_.newline_mode()) == PCRE2_ERROR_BADDATA) {
+      error_ = "REOptions: bad newline mode given";
+      return NULL;
+    }
+  }
+
+  // Special treatment for anchoring.  This is needed because at
+  // runtime pcre only provides an option for anchoring at the
+  // beginning of a string (unless you use offset).
+  //
+  // There are three types of anchoring we want:
+  //    UNANCHORED      Compile the original pattern, and use
+  //                    a pcre unanchored match.
+  //    ANCHOR_START    Compile the original pattern, and use
+  //                    a pcre anchored match.
+  //    ANCHOR_BOTH     Tack a "\z" to the end of the original pattern
+  //                    and use a pcre anchored match.
+
+  int compile_error;
+  PCRE2_SIZE eoffset;
+  pcre2_code* re;
+  if (anchor != ANCHOR_BOTH) {
+    re = pcre2_compile(reinterpret_cast<PCRE2_SPTR>(pattern_.c_str()),
+                       pattern_.length(), pcre_options, &compile_error,
+                       &eoffset, compile_context.get());
+  } else {
+    // Tack a '\z' at the end of RE.  Parenthesize it first so that
+    // the '\z' applies to all top-level alternatives in the regexp.
+    string wrapped = "(?:";  // A non-counting grouping operator
+    wrapped += pattern_;
+    wrapped += ")\\z";
+    re = pcre2_compile(reinterpret_cast<PCRE2_SPTR>(wrapped.c_str()),
+                       wrapped.length(), pcre_options, &compile_error, &eoffset,
+                       compile_context.get());
+  }
+  if (re == NULL) {
+    format_pcre_error(compile_error, error_);
+  }
+  return re;
+}
+
+/***** Matching interfaces *****/
+
+bool RE::Replace(const StringPiece& rewrite,
+                 string *str) const {
+  pcre2_match_data_ptr match_data;
+  int matches = TryMatch(*str, 0, UNANCHORED, true, match_data);
+  if (matches == 0)
+    return false;
+
+  string s;
+  if (!Rewrite(&s, rewrite, *str, match_data))
+    return false;
+
+  auto vec = pcre2_get_ovector_pointer(match_data.get());
+
+  assert(vec[0] >= 0);
+  assert(vec[1] >= 0);
+  str->replace(vec[0], vec[1] - vec[0], s);
+  return true;
+}
+
+static bool is_multi_char_newline_mode(int value) {
+  switch (value) {
+    case PCRE2_NEWLINE_CR:
+    case PCRE2_NEWLINE_LF:
+      return false;
+    case PCRE2_NEWLINE_CRLF:
+    case PCRE2_NEWLINE_ANY:
+    case PCRE2_NEWLINE_ANYCRLF:
+      return true;
+    default:
+      return false;
+  }
+}
+
+int RE::GlobalReplace(const StringPiece& rewrite,
+                      string *str) const {
+  int count = 0;
+  string out;
+  int start = 0;
+  bool last_match_was_empty_string = false;
+  pcre2_match_data_ptr match_data;
+
+  while (start <= static_cast<int>(str->length())) {
+    // If the previous match was for the empty string, we shouldn't
+    // just match again: we'll match in the same way and get an
+    // infinite loop.  Instead, we do the match in a special way:
+    // anchored -- to force another try at the same position --
+    // and with a flag saying that this time, ignore empty matches.
+    // If this special match returns, that means there's a non-empty
+    // match at this position as well, and we can continue.  If not,
+    // we do what perl does, and just advance by one.
+    // Notice that perl prints '@@@' for this;
+    //    perl -le '$_ = "aa"; s/b*|aa/@/g; print'
+    int matches;
+    if (last_match_was_empty_string) {
+      matches = TryMatch(*str, start, ANCHOR_START, false, match_data);
+      if (matches <= 0) {
+        int matchend = start + 1;     // advance one character.
+        // If the current char is CR and we're in CRLF mode, skip LF too.
+        // Note it's better to call pcre2_pattern_info() than to examine
+        // all_options(), since options_ could have changed between
+        // compile-time and now, but this is simpler and safe enough.
+        // Modified by PH to add ANY and ANYCRLF.
+        if (matchend < static_cast<int>(str->length()) &&
+            (*str)[start] == '\r' && (*str)[matchend] == '\n' &&
+            is_multi_char_newline_mode(options_.newline_mode())) {
+          matchend++;
+        }
+        // We also need to advance more than one char if we're in utf8 mode.
+#ifdef SUPPORT_UTF8
+        if (options_.utf8()) {
+          while (matchend < static_cast<int>(str->length()) &&
+                 ((*str)[matchend] & 0xc0) == 0x80)
+            matchend++;
+        }
+#endif
+        if (start < static_cast<int>(str->length()))
+          out.append(*str, start, matchend - start);
+        start = matchend;
+        last_match_was_empty_string = false;
+        continue;
+      }
+    } else {
+      matches = TryMatch(*str, start, UNANCHORED, true, match_data);
+      if (matches <= 0)
+        break;
+    }
+    auto vec = pcre2_get_ovector_pointer(match_data.get());
+    int matchstart = vec[0], matchend = vec[1];
+    assert(matchstart >= start);
+    assert(matchend >= matchstart);
+    out.append(*str, start, matchstart - start);
+    Rewrite(&out, rewrite, *str, match_data);
+    start = matchend;
+    count++;
+    last_match_was_empty_string = (matchstart == matchend);
+  }
+
+  if (count == 0)
+    return 0;
+
+  if (start < static_cast<int>(str->length()))
+    out.append(*str, start, str->length() - start);
+  swap(out, *str);
+  return count;
+}
+
+bool RE::Extract(const StringPiece& rewrite,
+                 const StringPiece& text,
+                 string *out) const {
+  pcre2_match_data_ptr match_data;
+  int matches = TryMatch(text, 0, UNANCHORED, true, match_data);
+  if (matches == 0)
+    return false;
+  out->erase();
+  return Rewrite(out, rewrite, text, match_data);
+}
+
+/*static*/ string RE::QuoteMeta(const StringPiece& unquoted) {
+  string result;
+
+  // Escape any ascii character not in [A-Za-z_0-9].
+  //
+  // Note that it's legal to escape a character even if it has no
+  // special meaning in a regular expression -- so this function does
+  // that.  (This also makes it identical to the perl function of the
+  // same name; see `perldoc -f quotemeta`.)  The one exception is
+  // escaping NUL: rather than doing backslash + NUL, like perl does,
+  // we do '\0', because pcre itself doesn't take embedded NUL chars.
+  for (int ii = 0; ii < unquoted.size(); ++ii) {
+    // Note that using 'isalnum' here raises the benchmark time from
+    // 32ns to 58ns:
+    if (unquoted[ii] == '\0') {
+      result += "\\0";
+    } else if ((unquoted[ii] < 'a' || unquoted[ii] > 'z') &&
+               (unquoted[ii] < 'A' || unquoted[ii] > 'Z') &&
+               (unquoted[ii] < '0' || unquoted[ii] > '9') &&
+               unquoted[ii] != '_' &&
+               // If this is the part of a UTF8 or Latin1 character, we need
+               // to copy this byte without escaping.  Experimentally this is
+               // what works correctly with the regexp library.
+               !(unquoted[ii] & 128)) {
+      result += '\\';
+      result += unquoted[ii];
+    } else {
+      result += unquoted[ii];
+    }
+  }
+
+  return result;
+}
+
+/***** Actual matching and rewriting code *****/
+int RE::TryMatch(const StringPiece& text,
+                 int startpos,
+                 Anchor anchor,
+                 bool empty_ok,
+                 pcre2_match_data_ptr & match_data) const {
+  typedef std::unique_ptr<pcre2_match_context,
+      decltype(pcre2_match_context_free)*> match_context_ptr;
+
+  pcre2_code* re = (anchor == ANCHOR_BOTH) ? re_full_ : re_partial_;
+  if (re == NULL) {
+    //fprintf(stderr, "Matching against invalid re: %s\n", error_->c_str());
+    return 0;
+  }
+  match_context_ptr match_context = match_context_ptr(
+      pcre2_match_context_create(NULL),
+      pcre2_match_context_free);
+  if (!match_context)
+    return 0;
+
+  if (options_.match_limit() > 0) {
+    pcre2_set_match_limit(match_context.get(), options_.match_limit());
+  }
+  if (options_.match_limit_recursion() > 0) {
+    pcre2_set_recursion_limit(match_context.get(),
+                              options_.match_limit_recursion());
+  }
+
+  match_data = pcre2_match_data_ptr(
+      pcre2_match_data_create_from_pattern(re, NULL),
+      pcre2_match_data_free);
+  if (!match_data) {
+    return 0;
+  }
+
+  // int options = 0;
+  // Changed by PH as a result of bugzilla #1288
+  int options = (options_.all_options() & PCRE2_NO_UTF_CHECK);
+
+  if (anchor != UNANCHORED)
+    options |= PCRE2_ANCHORED;
+  if (!empty_ok)
+    options |= PCRE2_NOTEMPTY;
+
+  int rc = pcre2_match(
+      re, reinterpret_cast<PCRE2_SPTR>((text.empty()) ? "" : text.data()),
+      text.size(), startpos, options, match_data.get(), match_context.get());
+
+  // Handle errors
+  if (rc == PCRE2_ERROR_NOMATCH) {
+    return 0;
+  }
+  if (rc == PCRE2_ERROR_PARTIAL) {
+    // not sure what to do with partial yet
+    return 0;
+  } else if (rc < 0) {
+    // For any other error condition also return 0.
+    return 0;
+  }
+
+  return rc; // return number of matches found
+}
+
+bool RE::DoMatchImpl(const StringPiece& text,
+                     Anchor anchor,
+                     int* consumed,
+                     const Arg* args,
+                     int n) const {
+  pcre2_match_data_ptr match_data;
+  int matches = TryMatch(text, 0, anchor, true, match_data);
+  assert(matches >= 0);  // TryMatch never returns negatives
+  if (matches == 0)
+    return false;
+
+  auto vec = pcre2_get_ovector_pointer(match_data.get());
+
+  // allow for NULL
+  if (consumed != NULL)
+    *consumed = vec[1];
+
+  if (n == 0 || args == NULL) {
+    // We are not interested in results
+    return true;
+  }
+
+  if (NumberOfCapturingGroups() < n) {
+    // RE has fewer capturing groups than number of arg pointers passed in
+    return false;
+  }
+
+  // If we got here, we must have matched the whole pattern.
+  // We do not need (can not do) any more checks on the value of 'matches' here
+  // -- see the comment for TryMatch.
+  for (int i = 0; i < n; i++) {
+    const int start = vec[2*(i+1)];
+    const int limit = vec[2*(i+1)+1];
+    if (!args[i].Parse(text.data() + start, limit - start)) {
+      // TODO: Should we indicate what the error was?
+      return false;
+    }
+  }
+
+  return true;
+}
+
+bool RE::DoMatch(const StringPiece& text,
+                 Anchor anchor,
+                 int* consumed,
+                 Arg const args[],
+                 int n) const {
+  assert(n >= 0);
+  bool retval = DoMatchImpl(text, anchor, consumed, args, n);
+  return retval;
+}
+
+bool RE::Rewrite(string *out, const StringPiece &rewrite,
+                 const StringPiece &text,
+                 pcre2_match_data_ptr const & match_data) const {
+  auto veclen = pcre2_get_ovector_count(match_data.get());
+  auto vec = pcre2_get_ovector_pointer(match_data.get());
+  for (const char *s = rewrite.data(), *end = s + rewrite.size();
+       s < end; s++) {
+    int c = *s;
+    if (c == '\\') {
+      c = *++s;
+      if (isdigit(c)) {
+        decltype(veclen) n = (c - '0');
+        if (n >= veclen) {
+          //fprintf(stderr, requested group %d in regexp %.*s\n",
+          //        n, rewrite.size(), rewrite.data());
+          return false;
+        }
+        int start = vec[2 * n];
+        if (start >= 0)
+          out->append(text.data() + start, vec[2 * n + 1] - start);
+      } else if (c == '\\') {
+        *out += '\\';
+      } else {
+        //fprintf(stderr, "invalid rewrite pattern: %.*s\n",
+        //        rewrite.size(), rewrite.data());
+        return false;
+      }
+    } else {
+      *out += c;
+    }
+  }
+  return true;
+}
+
+// Return the number of capturing subpatterns, or -1 if the
+// regexp wasn't valid on construction.
+int RE::NumberOfCapturingGroups() const {
+  if (re_partial_ == NULL) return -1;
+
+  int result;
+  int pcre_retval = pcre2_pattern_info(re_partial_, PCRE2_INFO_CAPTURECOUNT,
+                                       &result);
+  assert(pcre_retval == 0);
+  return result;
+}
+
+/***** Parsers for various types *****/
+
+bool Arg::parse_null(const char* str, int n, void* dest) {
+  (void)str;
+  (void)n;
+  // We fail if somebody asked us to store into a non-NULL void* pointer
+  return (dest == NULL);
+}
+
+bool Arg::parse_string(const char* str, int n, void* dest) {
+  if (dest == NULL) return true;
+  reinterpret_cast<string*>(dest)->assign(str, n);
+  return true;
+}
+
+bool Arg::parse_stringpiece(const char* str, int n, void* dest) {
+  if (dest == NULL) return true;
+  reinterpret_cast<StringPiece*>(dest)->set(str, n);
+  return true;
+}
+
+bool Arg::parse_char(const char* str, int n, void* dest) {
+  if (n != 1) return false;
+  if (dest == NULL) return true;
+  *(reinterpret_cast<char*>(dest)) = str[0];
+  return true;
+}
+
+bool Arg::parse_uchar(const char* str, int n, void* dest) {
+  if (n != 1) return false;
+  if (dest == NULL) return true;
+  *(reinterpret_cast<unsigned char*>(dest)) = str[0];
+  return true;
+}
+
+// Largest number spec that we are willing to parse
+static const int kMaxNumberLength = 32;
+
+// REQUIRES "buf" must have length at least kMaxNumberLength+1
+// REQUIRES "n > 0"
+// Copies "str" into "buf" and null-terminates if necessary.
+// Returns one of:
+//      a. "str" if no termination is needed
+//      b. "buf" if the string was copied and null-terminated
+//      c. "" if the input was invalid and has no hope of being parsed
+static const char* TerminateNumber(char* buf, const char* str, int n) {
+  if ((n > 0) && isspace(*str)) {
+    // We are less forgiving than the strtoxxx() routines and do not
+    // allow leading spaces.
+    return "";
+  }
+
+  // See if the character right after the input text may potentially
+  // look like a digit.
+  if (isdigit(str[n]) ||
+      ((str[n] >= 'a') && (str[n] <= 'f')) ||
+      ((str[n] >= 'A') && (str[n] <= 'F'))) {
+    if (n > kMaxNumberLength) return ""; // Input too big to be a valid number
+    memcpy(buf, str, n);
+    buf[n] = '\0';
+    return buf;
+  } else {
+    // We can parse right out of the supplied string, so return it.
+    return str;
+  }
+}
+
+bool Arg::parse_long_radix(const char* str,
+                           int n,
+                           void* dest,
+                           int radix) {
+  if (n == 0) return false;
+  char buf[kMaxNumberLength+1];
+  str = TerminateNumber(buf, str, n);
+  char* end;
+  errno = 0;
+  long r = strtol(str, &end, radix);
+  if (end != str + n) return false;   // Leftover junk
+  if (errno) return false;
+  if (dest == NULL) return true;
+  *(reinterpret_cast<long*>(dest)) = r;
+  return true;
+}
+
+bool Arg::parse_ulong_radix(const char* str,
+                            int n,
+                            void* dest,
+                            int radix) {
+  if (n == 0) return false;
+  char buf[kMaxNumberLength+1];
+  str = TerminateNumber(buf, str, n);
+  if (str[0] == '-') return false;    // strtoul() on a negative number?!
+  char* end;
+  errno = 0;
+  unsigned long r = strtoul(str, &end, radix);
+  if (end != str + n) return false;   // Leftover junk
+  if (errno) return false;
+  if (dest == NULL) return true;
+  *(reinterpret_cast<unsigned long*>(dest)) = r;
+  return true;
+}
+
+bool Arg::parse_short_radix(const char* str,
+                            int n,
+                            void* dest,
+                            int radix) {
+  long r;
+  if (!parse_long_radix(str, n, &r, radix)) return false; // Could not parse
+  if (r < SHRT_MIN || r > SHRT_MAX) return false;       // Out of range
+  if (dest == NULL) return true;
+  *(reinterpret_cast<short*>(dest)) = static_cast<short>(r);
+  return true;
+}
+
+bool Arg::parse_ushort_radix(const char* str,
+                             int n,
+                             void* dest,
+                             int radix) {
+  unsigned long r;
+  if (!parse_ulong_radix(str, n, &r, radix)) return false; // Could not parse
+  if (r > USHRT_MAX) return false;                      // Out of range
+  if (dest == NULL) return true;
+  *(reinterpret_cast<unsigned short*>(dest)) = static_cast<unsigned short>(r);
+  return true;
+}
+
+bool Arg::parse_int_radix(const char* str,
+                          int n,
+                          void* dest,
+                          int radix) {
+  long r;
+  if (!parse_long_radix(str, n, &r, radix)) return false; // Could not parse
+  if (r < INT_MIN || r > INT_MAX) return false;         // Out of range
+  if (dest == NULL) return true;
+  *(reinterpret_cast<int*>(dest)) = r;
+  return true;
+}
+
+bool Arg::parse_uint_radix(const char* str,
+                           int n,
+                           void* dest,
+                           int radix) {
+  unsigned long r;
+  if (!parse_ulong_radix(str, n, &r, radix)) return false; // Could not parse
+  if (r > UINT_MAX) return false;                       // Out of range
+  if (dest == NULL) return true;
+  *(reinterpret_cast<unsigned int*>(dest)) = r;
+  return true;
+}
+
+bool Arg::parse_longlong_radix(const char* str,
+                               int n,
+                               void* dest,
+                               int radix) {
+#ifndef HAVE_LONG_LONG
+  return false;
+#else
+  if (n == 0) return false;
+  char buf[kMaxNumberLength+1];
+  str = TerminateNumber(buf, str, n);
+  char* end;
+  errno = 0;
+#if defined HAVE_STRTOQ
+  long long r = strtoq(str, &end, radix);
+#elif defined HAVE_STRTOLL
+  long long r = strtoll(str, &end, radix);
+#elif defined HAVE__STRTOI64
+  long long r = _strtoi64(str, &end, radix);
+#elif defined HAVE_STRTOIMAX
+  long long r = strtoimax(str, &end, radix);
+#else
+#error parse_longlong_radix: cannot convert input to a long-long
+#endif
+  if (end != str + n) return false;   // Leftover junk
+  if (errno) return false;
+  if (dest == NULL) return true;
+  *(reinterpret_cast<long long*>(dest)) = r;
+  return true;
+#endif   /* HAVE_LONG_LONG */
+}
+
+bool Arg::parse_ulonglong_radix(const char* str,
+                                int n,
+                                void* dest,
+                                int radix) {
+#ifndef HAVE_UNSIGNED_LONG_LONG
+  return false;
+#else
+  if (n == 0) return false;
+  char buf[kMaxNumberLength+1];
+  str = TerminateNumber(buf, str, n);
+  if (str[0] == '-') return false;    // strtoull() on a negative number?!
+  char* end;
+  errno = 0;
+#if defined HAVE_STRTOQ
+  unsigned long long r = strtouq(str, &end, radix);
+#elif defined HAVE_STRTOLL
+  unsigned long long r = strtoull(str, &end, radix);
+#elif defined HAVE__STRTOI64
+  unsigned long long r = _strtoui64(str, &end, radix);
+#elif defined HAVE_STRTOIMAX
+  unsigned long long r = strtoumax(str, &end, radix);
+#else
+#error parse_ulonglong_radix: cannot convert input to a long-long
+#endif
+  if (end != str + n) return false;   // Leftover junk
+  if (errno) return false;
+  if (dest == NULL) return true;
+  *(reinterpret_cast<unsigned long long*>(dest)) = r;
+  return true;
+#endif   /* HAVE_UNSIGNED_LONG_LONG */
+}
+
+bool Arg::parse_double(const char* str, int n, void* dest) {
+  if (n == 0) return false;
+  static const int kMaxLength = 200;
+  char buf[kMaxLength];
+  if (n >= kMaxLength) return false;
+  memcpy(buf, str, n);
+  buf[n] = '\0';
+  errno = 0;
+  char* end;
+  double r = strtod(buf, &end);
+  if (end != buf + n) return false;   // Leftover junk
+  if (errno) return false;
+  if (dest == NULL) return true;
+  *(reinterpret_cast<double*>(dest)) = r;
+  return true;
+}
+
+bool Arg::parse_float(const char* str, int n, void* dest) {
+  double r;
+  if (!parse_double(str, n, &r)) return false;
+  if (dest == NULL) return true;
+  *(reinterpret_cast<float*>(dest)) = static_cast<float>(r);
+  return true;
+}
+
+
+#define DEFINE_INTEGER_PARSERS(name)                                    \
+  bool Arg::parse_##name(const char* str, int n, void* dest) {          \
+    return parse_##name##_radix(str, n, dest, 10);                      \
+  }                                                                     \
+  bool Arg::parse_##name##_hex(const char* str, int n, void* dest) {    \
+    return parse_##name##_radix(str, n, dest, 16);                      \
+  }                                                                     \
+  bool Arg::parse_##name##_octal(const char* str, int n, void* dest) {  \
+    return parse_##name##_radix(str, n, dest, 8);                       \
+  }                                                                     \
+  bool Arg::parse_##name##_cradix(const char* str, int n, void* dest) { \
+    return parse_##name##_radix(str, n, dest, 0);                       \
+  }
+
+DEFINE_INTEGER_PARSERS(short)      /*                                   */
+DEFINE_INTEGER_PARSERS(ushort)     /*                                   */
+DEFINE_INTEGER_PARSERS(int)        /* Don't use semicolons after these  */
+DEFINE_INTEGER_PARSERS(uint)       /* statements because they can cause */
+DEFINE_INTEGER_PARSERS(long)       /* compiler warnings if the checking */
+DEFINE_INTEGER_PARSERS(ulong)      /* level is turned up high enough.   */
+DEFINE_INTEGER_PARSERS(longlong)   /*                                   */
+DEFINE_INTEGER_PARSERS(ulonglong)  /*                                   */
+
+#undef DEFINE_INTEGER_PARSERS
+
+}   // namespace pcrecpp
diff --git a/dist/pcrecpp_internal.h b/pcrecpp/pcrecpp_internal.h
similarity index 100%
rename from dist/pcrecpp_internal.h
rename to pcrecpp/pcrecpp_internal.h
diff --git a/dist/pcrecpp_unittest.cc b/pcrecpp/pcrecpp_unittest.cc
similarity index 97%
rename from dist/pcrecpp_unittest.cc
rename to pcrecpp/pcrecpp_unittest.cc
index 92cae8f..67f2398 100644
--- a/dist/pcrecpp_unittest.cc
+++ b/pcrecpp/pcrecpp_unittest.cc
@@ -333,7 +333,8 @@
 #endif
 
   for (const ReplaceTest *t = tests; t->original != NULL; ++t) {
-    RE re(t->regexp, RE_Options(PCRE_NEWLINE_CRLF).set_utf8(support_utf8));
+    RE re(t->regexp, RE_Options().set_newline_mode(PCRE2_NEWLINE_CRLF)
+                                 .set_utf(support_utf8));
     assert(re.error().empty());
     string one(t->original);
     CHECK(re.Replace(t->rewrite, &one));
@@ -346,14 +347,16 @@
 
   // One final test: test \r\n replacement when we're not in CRLF mode
   {
-    RE re("b*", RE_Options(PCRE_NEWLINE_CR).set_utf8(support_utf8));
+    RE re("b*", RE_Options().set_newline_mode(PCRE2_NEWLINE_CR)
+                            .set_utf(support_utf8));
     assert(re.error().empty());
     string all("aa\r\naa\r\n");
     CHECK_EQ(re.GlobalReplace("bb", &all), 9);
     CHECK_EQ(all, string("bbabbabb\rbb\nbbabbabb\rbb\nbb"));
   }
   {
-    RE re("b*", RE_Options(PCRE_NEWLINE_LF).set_utf8(support_utf8));
+    RE re("b*", RE_Options().set_newline_mode(PCRE2_NEWLINE_LF)
+                            .set_utf(support_utf8));
     assert(re.error().empty());
     string all("aa\r\naa\r\n");
     CHECK_EQ(re.GlobalReplace("bb", &all), 9);
@@ -662,17 +665,6 @@
   TestOneOption("DOLLAR_ENDONLY 2",    "world$", str, options2.set_dollar_endonly(true), false, false);
 }
 
-static void Test_EXTRA() {
-  RE_Options options;
-  const char *str = "HELLO";
-
-  options.set_extra(true);
-  TestOneOption("EXTRA 1", "\\HELL\\O", str, options, true, false );
-  TestOneOption("EXTRA 2", "\\HELL\\O", str, RE_Options().set_extra(true), true, false );
-  options.set_extra(false);
-  TestOneOption("no EXTRA", "\\HELL\\O", str, options, true );
-}
-
 static void Test_EXTENDED() {
   RE_Options options;
   RE_Options options2;
@@ -738,18 +730,18 @@
 static void Test_all_options() {
   const char *str = "HELLO\n" "cruel\n" "world";
   RE_Options options;
-  options.set_all_options(PCRE_CASELESS | PCRE_DOTALL);
+  options.set_all_options(PCRE2_CASELESS | PCRE2_DOTALL);
 
   TestOneOption("all_options (CASELESS|DOTALL)", "^hello.*WORLD", str , options, false);
   options.set_all_options(0);
   TestOneOption("all_options (0)", "^hello.*WORLD", str , options, false, false);
-  options.set_all_options(PCRE_MULTILINE | PCRE_EXTENDED);
+  options.set_all_options(PCRE2_MULTILINE | PCRE2_EXTENDED);
 
   TestOneOption("all_options (MULTILINE|EXTENDED)", " ^ c r u e l $ ", str, options, false);
   TestOneOption("all_options (MULTILINE|EXTENDED) with constructor",
                   " ^ c r u e l $ ",
                   str,
-                  RE_Options(PCRE_MULTILINE | PCRE_EXTENDED),
+                  RE_Options(PCRE2_MULTILINE | PCRE2_EXTENDED),
                   false);
 
   TestOneOption("all_options (MULTILINE|EXTENDED) with concatenation",
@@ -774,7 +766,6 @@
   Test_EXTENDED();
   Test_NO_AUTO_CAPTURE();
   Test_UNGREEDY();
-  Test_EXTRA();
   Test_all_options();
 }
 
diff --git a/pcrecpparg.h b/pcrecpparg.h
deleted file mode 120000
index b2543cd..0000000
--- a/pcrecpparg.h
+++ /dev/null
@@ -1 +0,0 @@
-dist/pcrecpparg.h
\ No newline at end of file